From 56958c583218897338e358ad1a719460047bba34 Mon Sep 17 00:00:00 2001 From: utilisateurqu <112496102+utilisateurqu@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:37:15 +0200 Subject: [PATCH] Initial commit: bot Discord Vicy V1.8 --- .gitignore | 19 + __main__.py | 133 ++ abonnements.json | 218 ++ absences.json | 47 + banque_data.json | 1 + bot.py | 25 + commandes/Backup/absence_staff.py | 66 + commandes/__init__.py | 5 + commandes/abonnement.py | 148 ++ commandes/absence_staff.py | 224 +++ commandes/ajouter_argent.py | 146 ++ commandes/annonces_sessions.py | 220 ++ commandes/change_nickname.py | 45 + commandes/compte.py | 93 + commandes/compte_banque_nationale.py | 102 + commandes/compte_fbm.py | 92 + commandes/compte_gouvernement.py | 84 + commandes/compte_urssaf.py | 96 + commandes/comptes_entreprises.py | 73 + commandes/counting.py | 68 + commandes/identite.py | 72 + commandes/liste_taches.py | 60 + commandes/message.py | 22 + commandes/message_tous.py | 38 + commandes/ouvrir_compte.py | 76 + commandes/ouvrir_comptes_entreprises.py | 92 + commandes/permis.py | 32 + commandes/presence_session.py | 38 + commandes/pret.py | 75 + commandes/rename_all_on_join.py | 24 + commandes/restranscription_staff.py | 49 + commandes/retirer_argent.py | 147 ++ commandes/retrait_gouv.py | 184 ++ commandes/roll.py | 30 + commandes/stats_commandes.py | 144 ++ commandes/taches.py | 259 +++ commandes/ticket.py | 329 +++ commandes/transactions.py | 67 + commandes/valider_visite_médicale.py | 77 + commandes/virement.py | 138 ++ commandes/virement_banquier.py | 86 + commandes/virement_banquier_entreprise.py | 122 ++ commandes/virement_entreprise.py | 149 ++ commandes/virement_fbm.py | 97 + commandes/virement_gouvernement.py | 86 + commandes/virement_ursaff.py | 93 + commandes/voir_carte_identite.py | 65 + commandes/welcome_message.py | 30 + comptes_bancaires.json | 2111 ++++++++++++++++++++ comptes_entreprises.json | 492 +++++ counting_data.json | 6 + id_compteur.json | 3 + ressources/assets/CIITAL.png | Bin 0 -> 96457 bytes ressources/assets/Code_HTML_Vice_TMV2.html | 174 ++ ressources/assets/Victorias_ViceTMV2.png | Bin 0 -> 175462 bytes ressources/assets/template.png | Bin 0 -> 178225 bytes ressources/banque_data.json | 1 + ressources/data.json | 500 +++++ stats_commandes.json | 1 + taches.json | 64 + utils/__init__.py | 0 utils/banque_manager.py | 58 + utils/card_generator.py | 126 ++ utils/data_manager.py | 61 + utils/gestion_taches.py | 89 + utils/image_generator.py | 50 + utils/logger.py | 34 + utils/stats_manager.py | 82 + utils/welcome_message.py | 30 + visite_médicale.json | 1 + 70 files changed, 8469 insertions(+) create mode 100644 .gitignore create mode 100644 __main__.py create mode 100644 abonnements.json create mode 100644 absences.json create mode 100644 banque_data.json create mode 100644 bot.py create mode 100644 commandes/Backup/absence_staff.py create mode 100644 commandes/__init__.py create mode 100644 commandes/abonnement.py create mode 100644 commandes/absence_staff.py create mode 100644 commandes/ajouter_argent.py create mode 100644 commandes/annonces_sessions.py create mode 100644 commandes/change_nickname.py create mode 100644 commandes/compte.py create mode 100644 commandes/compte_banque_nationale.py create mode 100644 commandes/compte_fbm.py create mode 100644 commandes/compte_gouvernement.py create mode 100644 commandes/compte_urssaf.py create mode 100644 commandes/comptes_entreprises.py create mode 100644 commandes/counting.py create mode 100644 commandes/identite.py create mode 100644 commandes/liste_taches.py create mode 100644 commandes/message.py create mode 100644 commandes/message_tous.py create mode 100644 commandes/ouvrir_compte.py create mode 100644 commandes/ouvrir_comptes_entreprises.py create mode 100644 commandes/permis.py create mode 100644 commandes/presence_session.py create mode 100644 commandes/pret.py create mode 100644 commandes/rename_all_on_join.py create mode 100644 commandes/restranscription_staff.py create mode 100644 commandes/retirer_argent.py create mode 100644 commandes/retrait_gouv.py create mode 100644 commandes/roll.py create mode 100644 commandes/stats_commandes.py create mode 100644 commandes/taches.py create mode 100644 commandes/ticket.py create mode 100644 commandes/transactions.py create mode 100644 commandes/valider_visite_médicale.py create mode 100644 commandes/virement.py create mode 100644 commandes/virement_banquier.py create mode 100644 commandes/virement_banquier_entreprise.py create mode 100644 commandes/virement_entreprise.py create mode 100644 commandes/virement_fbm.py create mode 100644 commandes/virement_gouvernement.py create mode 100644 commandes/virement_ursaff.py create mode 100644 commandes/voir_carte_identite.py create mode 100644 commandes/welcome_message.py create mode 100644 comptes_bancaires.json create mode 100644 comptes_entreprises.json create mode 100644 counting_data.json create mode 100644 id_compteur.json create mode 100644 ressources/assets/CIITAL.png create mode 100644 ressources/assets/Code_HTML_Vice_TMV2.html create mode 100644 ressources/assets/Victorias_ViceTMV2.png create mode 100644 ressources/assets/template.png create mode 100644 ressources/banque_data.json create mode 100644 ressources/data.json create mode 100644 stats_commandes.json create mode 100644 taches.json create mode 100644 utils/__init__.py create mode 100644 utils/banque_manager.py create mode 100644 utils/card_generator.py create mode 100644 utils/data_manager.py create mode 100644 utils/gestion_taches.py create mode 100644 utils/image_generator.py create mode 100644 utils/logger.py create mode 100644 utils/stats_manager.py create mode 100644 utils/welcome_message.py create mode 100644 visite_médicale.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26b369d --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Secrets +.env +config.json + +# Python +__pycache__/ +*.pyc +*.pyo + +# Virtual environment +.venv/ + +# Data & logs +data/ +log.txt + +# OS +Thumbs.db +Desktop.ini diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..f841bfc --- /dev/null +++ b/__main__.py @@ -0,0 +1,133 @@ +import discord +import asyncio +import logging +from bot import bot +from utils.logger import log_info, log_error +from discord.ext import commands +from discord import app_commands, Intents +from dotenv import load_dotenv +import os +from discord import Intents, Permissions +from utils.stats_manager import enregistrer_utilisation, get_stats + +# Configuration du logger Discord (niveau DEBUG pour afficher tous les événements importants) +logging.basicConfig(level=logging.DEBUG) +discord.utils.setup_logging(level=logging.DEBUG, root=False) + +# Configuration des intents +intents = Intents.default() +intents.message_content = True +intents.guilds = True +intents.members = True +intents.reactions = True + +# Permissions du bot +permissions = Permissions() +permissions.update( + manage_nicknames=True, + send_messages=True, + read_messages=True, + manage_channels=True, + manage_messages=True, + add_reactions=True, + use_application_commands=True, + view_channel=True +) + +# Initialisation du bot +bot = commands.Bot(command_prefix="!", application_id="1310235313461002241", intents=intents) + +async def load_cogs(): + """Charge toutes les commandes.""" + extensions = [ + "commandes.message", + "commandes.identite", + "commandes.voir_carte_identite", + "commandes.virement", + "commandes.transactions", + "commandes.ajouter_argent", + "commandes.ticket", + "commandes.restranscription_staff", + "utils.welcome_message", + "commandes.permis", + "commandes.ouvrir_compte", + "commandes.compte", + "commandes.change_nickname", + "commandes.rename_all_on_join", + "commandes.message_tous", + "commandes.retirer_argent", + "commandes.ouvrir_comptes_entreprises", + "commandes.compte_gouvernement", + "commandes.comptes_entreprises", + "commandes.compte_urssaf", + "commandes.compte_banque_nationale", + "commandes.virement_entreprise", + "commandes.virement_gouvernement", + "commandes.valider_visite_médicale", + "commandes.abonnement", + "commandes.virement_banquier", + "commandes.virement_banquier_entreprise", + "commandes.compte_fbm", + "commandes.virement_fbm", + "commandes.virement_ursaff", + "commandes.stats_commandes", + "commandes.taches", + "commandes.roll", + "commandes.annonces_sessions", # Fait : V1.7 correction des annonces de sessions + "commandes.retrait_gouv", + "commandes.absence_staff", # Fait : V1.7 pouvoir voir plus de 3 absences staff (pagination) + "commandes.liste_taches", # Fait : V1.7 Rebuild du système de taches pour le rendre plus moderne + "commandes.counting" + + + # Pas fait : V1.8 Amélioration des stats de commandes ajouts de courbes et de graphiques + Voir le top 10 des personnes qui utilisent le plus les commandes + ] + + for ext in extensions: + try: + await bot.load_extension(ext) + log_info(f"Extension chargée : {ext}") + except Exception as e: + log_error(f"Erreur lors du chargement de {ext} : {e}") + +@bot.event +async def on_ready(): + # Affiche que le bot est prêt et synchronise les commandes slash + log_info(f"Connecté en tant que {bot.user}") + await load_cogs() + await bot.tree.sync() + await bot.change_presence(activity=discord.Game(name="la V1.6")) # Ajout du status + log_info("Commandes synchronisées.") + +# Gère les erreurs de commandes classiques +@bot.event +async def on_command_error(ctx, error): + log_error(f"Erreur dans la commande {ctx.command}: {error}") + +# Gère toutes les autres erreurs inattendues +@bot.event +async def on_error(event_method, *args, **kwargs): + log_error(f"Erreur non gérée dans l'événement {event_method}", exc_info=True) + +# 👉 Enregistre chaque commande slash utilisée +@bot.event +async def on_app_command_completion(interaction: discord.Interaction, command: app_commands.Command): + try: + user_id = interaction.user.id + guild_id = interaction.guild.id if interaction.guild else 0 + enregistrer_utilisation(command.name, user_id, guild_id) + except Exception as e: + log_error(f"Erreur en enregistrant les stats : {e}") + +async def main(): + # Charge les variables d'environnement et démarre le bot + load_dotenv() + token = os.getenv("TOKEN") + try: + log_info("Démarrage du bot...") + await bot.start(token) + except Exception as e: + log_error(f"Erreur critique: {e}", exc_info=True) + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/abonnements.json b/abonnements.json new file mode 100644 index 0000000..49819bb --- /dev/null +++ b/abonnements.json @@ -0,0 +1,218 @@ +[ + { + "nom": "Test", + "rib_emetteur": "22144 59424 87742058459 72", + "rib_receveur": "66427 49104 57218570654 78", + "montant": 1.0, + "banque": "NGC Bank", + "jour": "samedi" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "36495 80083 39542816185 27", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "26384 93370 75890178377 91", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "22144 59424 87742058459 72", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "85047 60626 80894743346 94", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "28777 24580 29765721710 42", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "24483 98056 61791340797 80", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "10009 40554 56452790470 78", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "76644 32901 90493249064 16", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "15563 69899 51361446295 84", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "22128 86524 35982837421 58", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "55868 11389 89049343014 38", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "93266 82343 74845298309 22", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "10234 24218 10477731114 78", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "50970 51336 33017058086 50", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "87292 81104 84784268868 12", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "51229 80290 86979675797 93", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "28794 77878 41312953164 71", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "78740 15751 70195185799 30", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "92871 52823 19649316403 70", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frais_bancaire_et_de_gestion_1", + "rib_emetteur": "73834 54818 11833486819 17", + "rib_receveur": "15156 38436 35920 54357", + "montant": 5.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Frog", + "rib_emetteur": "48003 84424 36961155485 64", + "rib_receveur": "15156 38436 35920 54357", + "montant": 700.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Di regia", + "rib_emetteur": "10009 40554 56452790470 78", + "rib_receveur": "15156 38436 35920 54357", + "montant": 4000.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Leonardo", + "rib_emetteur": "24756 54403 68357307735 95", + "rib_receveur": "15156 38436 35920 54357", + "montant": 4000.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Correa", + "rib_emetteur": "28794 77878 41312953164 71", + "rib_receveur": "15156 38436 35920 54357", + "montant": 4300.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "jose", + "rib_emetteur": "87292 81104 84784268868 12", + "rib_receveur": "15156 38436 35920 54357", + "montant": 800.0, + "banque": "NGC Bank", + "jour": "dimanche" + }, + { + "nom": "Paye_de_Salvatore_Di_Regia", + "rib_emetteur": "15156 38436 35920 54357", + "rib_receveur": "10009 40554 56452790470 78", + "montant": 5000.0, + "banque": "NGC Bank", + "jour": "dimanche" + } +] \ No newline at end of file diff --git a/absences.json b/absences.json new file mode 100644 index 0000000..f66a0eb --- /dev/null +++ b/absences.json @@ -0,0 +1,47 @@ +{ + "534003230435442690": { + "pseudo": "nixfix06", + "debut": "25/06/2025", + "fin": "01/09/2025", + "motif": "je travaille", + "superieur": "Aucun", + "message_id": 1386993295766323202, + "etat": "en cours" + }, + "828923448453103637": { + "pseudo": "blancandwhite", + "debut": "04/07/2025", + "fin": "28/07/2025", + "motif": "vacances", + "superieur": "<@1108087282692522105>", + "message_id": 1389892250317750322, + "etat": "en cours" + }, + "914118793918312480": { + "pseudo": "neyzizz", + "debut": "20/07/2025", + "fin": "27/07/2025", + "motif": "vacances en montagne", + "superieur": "Aucun", + "message_id": 1390747833958662154, + "etat": "en cours" + }, + "727188532669448509": { + "pseudo": "nuggets.png", + "debut": "21/07/2025", + "fin": "22/07/2025", + "motif": "je fouette mg", + "superieur": "<@1069386396764221450>", + "message_id": 1396650241679294515, + "etat": "en cours" + }, + "1069386396764221450": { + "pseudo": "matlo13", + "debut": "21/07/2025", + "fin": "22/07/2025", + "motif": "text", + "superieur": "Aucun", + "message_id": 1396650262252355584, + "etat": "en cours" + } +} \ No newline at end of file diff --git a/banque_data.json b/banque_data.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/banque_data.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..db66cd7 --- /dev/null +++ b/bot.py @@ -0,0 +1,25 @@ +from utils.logger import log_info, log_error +from discord.ext import commands +import discord + +intents = discord.Intents.default() +intents.message_content = True +intents.members = True + +bot = commands.Bot(command_prefix='/', intents=intents) + +@bot.event +async def on_ready(): + try: + log_info(f"Le bot {bot.user} a démarré avec succès.") + await bot.change_presence(activity=discord.Game(name="la version 1.2")) + except Exception as e: + log_error(f"Erreur lors du démarrage du bot: {e}") + +@bot.event +async def on_ready(): + try: + synced = await bot.tree.sync() + print(f"Synchronisé {len(synced)} commande(s)") + except Exception as e: + print(f"Erreur lors de la synchronisation des commandes : {e}") \ No newline at end of file diff --git a/commandes/Backup/absence_staff.py b/commandes/Backup/absence_staff.py new file mode 100644 index 0000000..47fa3ab --- /dev/null +++ b/commandes/Backup/absence_staff.py @@ -0,0 +1,66 @@ +import discord +from discord.ext import commands +from discord import app_commands +from datetime import datetime, timedelta + +class AbsenceStaff(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.absences = {} + + @app_commands.command(name="absence_staff", description="Indiquez votre absence en tant que staff.") + async def absence_staff(self, interaction: discord.Interaction, duree: str, debut: str, fin: str, raison: str, superieur: discord.Member): + """Indiquez votre absence en tant que staff.""" + try: + # Convertir les dates + debut_date = datetime.strptime(debut, "%d/%m/%Y") + fin_date = datetime.strptime(fin, "%d/%m/%Y") + + # Calculer la durée en jours + if duree.endswith('s'): # Si la durée est en semaines + duree_jours = int(duree[:-1]) * 7 + else: + duree_jours = int(duree) + + # Vérifier la cohérence des dates + if (fin_date - debut_date).days != duree_jours: + await interaction.response.send_message("❌ Erreur : La durée spécifiée ne correspond pas aux dates fournies.") + return + + # Enregistrer l'absence + self.absences[interaction.user.id] = { + "debut": debut_date, + "fin": fin_date, + "raison": raison, + "superieur": superieur.id + } + + await interaction.response.send_message(f"✅ Votre absence a été enregistrée, {interaction.user.mention}.") + + except Exception as e: + await interaction.response.send_message(f"❌ Erreur : {str(e)}") + + @commands.Cog.listener() + async def on_message(self, message): + # Ignorer les messages envoyés par le bot + if message.author.bot: + return + + # Vérifier si un utilisateur absent est mentionné + for user_id, absence in self.absences.items(): + user = self.bot.get_user(user_id) + if user and user in message.mentions: + # Répondre avec un message indiquant l'absence + await message.channel.send( + f"{user.display_name} est actuellement absent(e).\n" + f"Raison : {absence['raison']}\n" + f"Retour prévu le : {absence['fin'].strftime('%d/%m/%Y')}" + ) + + # Supprimer le message avec la mention + await message.delete() + break + +async def setup(bot): + await bot.add_cog(AbsenceStaff(bot)) + print("Commande /absence_staff chargée !") diff --git a/commandes/__init__.py b/commandes/__init__.py new file mode 100644 index 0000000..e496dbb --- /dev/null +++ b/commandes/__init__.py @@ -0,0 +1,5 @@ + # Pour la V1.2 Ajouter des statistiques d'utlisation du bot + # Pour la V1.3 Corriger le système de claim des tickets WL (Les anciens propriétaires de ticket garde les permission même après une reprise par quelqu'un d'autre) + # Pour la V1.3 Ajouter la commande /compte_utilisateur @[de_l'utilisateur] : affiche le compte d'un autre utilisateur (Banquier Only) + # Pour la V1.3 Pouvoir voir les cartes d'identités des autres quand on la le rôle gouvernement + # Pour la V1.3 Pouvoir fermer des comptes bancaires ou/et pouvoir régénérer un rib si on est banquier \ No newline at end of file diff --git a/commandes/abonnement.py b/commandes/abonnement.py new file mode 100644 index 0000000..17750d5 --- /dev/null +++ b/commandes/abonnement.py @@ -0,0 +1,148 @@ +import discord +from discord import app_commands +from discord.ext import commands, tasks +import json +import datetime + +ABONNEMENTS_FILE = "abonnements.json" + +BANQUES_DISPONIBLES = [ + "Victoria's Credit Bank", + "NGC Bank" +] + +JOURS_SEMAINE = [ + "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche" +] + +class Abonnement(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.abonnements = self.load_abonnements() + self.executer_abonnements.start() + + def load_abonnements(self): + try: + with open(ABONNEMENTS_FILE, 'r', encoding='utf-8') as f: + return json.load(f) + except (FileNotFoundError, json.JSONDecodeError): + return [] + + def save_abonnements(self): + with open(ABONNEMENTS_FILE, 'w', encoding='utf-8') as f: + json.dump(self.abonnements, f, ensure_ascii=False, indent=4) + + # 🎯 Auto-complétion pour les banques + async def autocomplete_banque(self, interaction: discord.Interaction, current: str): + return [ + app_commands.Choice(name=b, value=b) + for b in BANQUES_DISPONIBLES if current.lower() in b.lower() + ] + + # 🎯 Auto-complétion pour les jours + async def autocomplete_jour(self, interaction: discord.Interaction, current: str): + return [ + app_commands.Choice(name=day.capitalize(), value=day) + for day in JOURS_SEMAINE if current.lower() in day + ] + + @app_commands.command(name="abonnement", description="Crée un abonnement bancaire hebdomadaire.") + @app_commands.describe( + nom="Nom de l'abonnement", + rib_emetteur="RIB de l'expéditeur", + montant="Montant à envoyer", + rib_receveur="RIB du bénéficiaire", + banque="Nom de la banque", + jour="Jour de la semaine du virement" + ) + @app_commands.autocomplete(banque=autocomplete_banque, jour=autocomplete_jour) + async def abonnement( + self, + interaction: discord.Interaction, + nom: str, + rib_emetteur: str, + montant: float, + rib_receveur: str, + banque: str, + jour: str + ): + if jour.lower() not in JOURS_SEMAINE: + await interaction.response.send_message("❌ Jour invalide. Choisissez un jour valide de la semaine.", ephemeral=True) + return + + abonnement = { + "nom": nom, + "rib_emetteur": rib_emetteur, + "rib_receveur": rib_receveur, + "montant": montant, + "banque": banque, + "jour": jour.lower() + } + + self.abonnements.append(abonnement) + self.save_abonnements() + + await interaction.response.send_message(f"✅ Abonnement **{nom}** enregistré. Virement automatique tous les **{jour}**.", ephemeral=True) + + @tasks.loop(minutes=60) + async def executer_abonnements(self): + today = datetime.datetime.now().strftime("%A").lower() + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + except: + comptes = {} + + updated = False + for abonnement in self.abonnements: + if abonnement["jour"] != today: + continue + + banque = abonnement["banque"] + rib_emetteur = abonnement["rib_emetteur"] + rib_receveur = abonnement["rib_receveur"] + montant = abonnement["montant"] + + destinataire_id = None + emetteur_id = None + + for user_id, data in comptes.get(banque, {}).items(): + if data.get("rib") == rib_emetteur: + emetteur_id = user_id + if data.get("rib") == rib_receveur: + destinataire_id = user_id + + if not emetteur_id or not destinataire_id: + continue + + if comptes[banque][emetteur_id]["solde"] < montant: + continue + + comptes[banque][emetteur_id]["solde"] -= montant + comptes[banque][emetteur_id]["transactions"].append({ + "date": datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement automatique (abonnement)", + "source": f"Vers RIB {rib_receveur}", + "montant": -montant + }) + + comptes[banque][destinataire_id]["solde"] += montant + comptes[banque][destinataire_id]["transactions"].append({ + "date": datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement reçu (abonnement)", + "source": f"{rib_emetteur}", + "montant": montant + }) + + updated = True + + if updated: + with open("comptes_bancaires.json", 'w', encoding='utf-8') as f: + json.dump(comptes, f, ensure_ascii=False, indent=4) + + @executer_abonnements.before_loop + async def before_abonnement_loop(self): + await self.bot.wait_until_ready() + +async def setup(bot): + await bot.add_cog(Abonnement(bot)) \ No newline at end of file diff --git a/commandes/absence_staff.py b/commandes/absence_staff.py new file mode 100644 index 0000000..ed9a334 --- /dev/null +++ b/commandes/absence_staff.py @@ -0,0 +1,224 @@ +from discord.ext import commands, tasks +from discord import app_commands, ui +import discord +import json +import asyncio +import os +from datetime import datetime + +ABSENCE_CHANNEL_ID = 1369669999677145099 +ABSENCE_FILE = "absences.json" +ABSENCE_FILE_TMP = "absences.json.tmp" +file_lock = asyncio.Lock() + +async def load_absences(): + async with file_lock: + try: + with open(ABSENCE_FILE, "r") as f: + return json.load(f) + except FileNotFoundError: + return {} + +async def save_absences(data): + async with file_lock: + with open(ABSENCE_FILE_TMP, "w") as f: + json.dump(data, f, indent=4) + os.replace(ABSENCE_FILE_TMP, ABSENCE_FILE) + +class Absence(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.check_absences.start() + + @commands.hybrid_command(name="absence", with_app_command=True) + async def absence(self, ctx, motif: str, date_debut: str, date_fin: str, superieur: discord.Member = None): + try: + debut = datetime.strptime(date_debut, "%d/%m/%Y") + fin = datetime.strptime(date_fin, "%d/%m/%Y") + except ValueError: + return await ctx.send("❌ Format de date invalide. Utilise JJ/MM/AAAA.", ephemeral=True) + + if debut > fin: + return await ctx.send("❌ La date de début doit précéder la date de fin.", ephemeral=True) + + abs_data = await load_absences() + if str(ctx.author.id) in abs_data: + return await ctx.send("❌ Tu as déjà déclaré une absence. Utilise `/fin_absence` pour la terminer.", ephemeral=True) + + duree = (fin - debut).days + 1 + etat = "à venir" if debut > datetime.today() else "en cours" + + abs_data[str(ctx.author.id)] = { + "pseudo": ctx.author.name, + "debut": date_debut, + "fin": date_fin, + "motif": motif, + "superieur": superieur.mention if superieur else "Aucun", + "message_id": None, + "etat": etat + } + await save_absences(abs_data) + + channel = self.bot.get_channel(ABSENCE_CHANNEL_ID) + if not channel: + return await ctx.send("❌ Salon d'absence introuvable. Vérifie l'ID.", ephemeral=True) + + absence_message = await channel.send( + f"# ABSENCE STAFF :\n" + f"- **Pseudo Discord** : {ctx.author.mention}\n" + f"- **Durée** : {duree} jours\n" + f"- **Débute le** : {date_debut}\n" + f"- **Termine le** : {date_fin}\n" + f"- **Motif** : {motif}\n" + f"- **Mention du supérieur hiérarchique** : {superieur.mention if superieur else 'Aucun'}" + ) + + abs_data[str(ctx.author.id)]["message_id"] = absence_message.id + await save_absences(abs_data) + + await ctx.send("✅ Absence enregistrée avec succès !", ephemeral=True) + + @commands.hybrid_command(name="fin_absence", with_app_command=True) + async def fin_absence(self, ctx): + abs_data = await load_absences() + user_id = str(ctx.author.id) + + if user_id not in abs_data: + return await ctx.send("❌ Tu n'as pas d'absence en cours.", ephemeral=True) + + message_id = abs_data[user_id].get("message_id") + channel = self.bot.get_channel(ABSENCE_CHANNEL_ID) + if message_id and channel: + try: + msg = await channel.fetch_message(message_id) + await msg.delete() + except Exception: + pass + + del abs_data[user_id] + await save_absences(abs_data) + await ctx.send("✅ Ton absence a été retirée.", ephemeral=True) + + @commands.hybrid_command(name="liste_absences", with_app_command=True) + async def liste_absences(self, ctx): + abs_data = await load_absences() + absences = [ + (user_id, info) for user_id, info in abs_data.items() + if info.get("etat") == "en cours" + ] + + if not absences: + return await ctx.send("Aucune absence staff en cours.", ephemeral=True) + + per_page = 3 + pages = [absences[i:i + per_page] for i in range(0, len(absences), per_page)] + + def create_embed(page_index: int) -> discord.Embed: + embed = discord.Embed( + title=f"📋 Absences staff en cours (Page {page_index + 1}/{len(pages)})", + color=discord.Color.orange() + ) + for _, info in pages[page_index]: + embed.add_field( + name=info["pseudo"], + value=( + f"**Début** : {info['debut']}\n" + f"**Fin** : {info['fin']}\n" + f"**Motif** : {info['motif']}\n" + f"**Supérieur** : {info['superieur']}" + ), + inline=False + ) + embed.set_footer(text="Gestion des absences du staff") + return embed + + class PaginatorView(ui.View): + def __init__(self): + super().__init__(timeout=60) + self.page = 0 + + @ui.button(label="⬅️ Précédent", style=discord.ButtonStyle.secondary, disabled=True) + async def previous(self, interaction: discord.Interaction, button: discord.ui.Button): + self.page -= 1 + await interaction.response.edit_message(embed=create_embed(self.page), view=self) + self.update_buttons() + + @ui.button(label="➡️ Suivant", style=discord.ButtonStyle.secondary, disabled=len(pages) == 1) + async def next(self, interaction: discord.Interaction, button: discord.ui.Button): + self.page += 1 + await interaction.response.edit_message(embed=create_embed(self.page), view=self) + self.update_buttons() + + def update_buttons(self): + self.children[0].disabled = self.page == 0 + self.children[1].disabled = self.page >= len(pages) - 1 + + view = PaginatorView() + await ctx.send(embed=create_embed(0), view=view, ephemeral=True) + + @tasks.loop(minutes=1) + async def check_absences(self): + abs_data = await load_absences() + today = datetime.today() + to_remove = [] + + for user_id, info in abs_data.items(): + debut = datetime.strptime(info["debut"], "%d/%m/%Y") + fin = datetime.strptime(info["fin"], "%d/%m/%Y") + etat = info.get("etat", "en cours") + + if etat == "à venir" and debut <= today: + for guild in self.bot.guilds: + member = guild.get_member(int(user_id)) + if member: + await self.deactivate_mentions(member) + abs_data[user_id]["etat"] = "en cours" + + if etat == "en cours" and fin < today: + for guild in self.bot.guilds: + member = guild.get_member(int(user_id)) + if member: + await self.activate_mentions(member) + to_remove.append(user_id) + + for user_id in to_remove: + abs_data.pop(user_id, None) + + await save_absences(abs_data) + + async def deactivate_mentions(self, member): + role = discord.utils.get(member.guild.roles, name="Absence") + if not role: + role = await member.guild.create_role(name="Absence", reason="Gestion des absences staff") + await member.add_roles(role, reason="Début d'absence staff") + + async def activate_mentions(self, member): + role = discord.utils.get(member.guild.roles, name="Absence") + if role: + await member.remove_roles(role, reason="Fin d'absence staff") + + @commands.Cog.listener() + async def on_message(self, message): + if message.author.bot: + return + + abs_data = await load_absences() + absent_ids = {k for k, v in abs_data.items() if v.get("etat") == "en cours"} + + if str(message.author.id) in absent_ids: + await message.channel.send( + f"{message.author.mention}, tu es actuellement déclaré absent. Merci de prévenir si tu es de retour !", + delete_after=30 + ) + + for user_id in absent_ids: + if f"<@{user_id}>" in message.content or f"<@!{user_id}>" in message.content: + msg_id = abs_data[user_id].get("message_id") + absence_url = f"https://discord.com/channels/{message.guild.id}/{ABSENCE_CHANNEL_ID}/{msg_id}" if msg_id else "" + await message.reply( + f"{message.author.mention}, cet utilisateur est absent. Plus d'infos : {absence_url}", + delete_after=60 + ) + +async def setup(bot): + await bot.add_cog(Absence(bot)) \ No newline at end of file diff --git a/commandes/ajouter_argent.py b/commandes/ajouter_argent.py new file mode 100644 index 0000000..80b386f --- /dev/null +++ b/commandes/ajouter_argent.py @@ -0,0 +1,146 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier # ID du rôle banquier + +class AjouterArgent(commands.Cog): + def __init__(self, bot): + self.bot = bot + + # Choix de banques automatiques + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command( + name="ajouter_argent", + description="Ajoute de l'argent à un compte (réservé aux banquiers)." + ) + @app_commands.choices(banque=banque_choices) + @app_commands.describe( + rib="Le RIB du compte", + montant="Montant à ajouter", + banque="Banque cible (facultatif)" + ) + async def ajouter_argent( + self, + interaction: discord.Interaction, + rib: str, + montant: float, + banque: app_commands.Choice[str] = None + ): + # Vérification du rôle + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message( + "❌ Vous n'avez pas la permission d'utiliser cette commande.", + ephemeral=True + ) + return + + if montant <= 0: + await interaction.response.send_message( + "❌ Le montant doit être supérieur à zéro.", + ephemeral=True + ) + return + + banque_nom = banque.value if banque else None + + # Chargement des fichiers + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + entreprises = json.load(f) + + cible_data = None + user_id = None + is_entreprise = False + + # Recherche dans la banque spécifiée (si précisée) + if banque_nom and banque_nom in comptes: + for uid, info in comptes[banque_nom].items(): + if info.get("rib") == rib: + cible_data = comptes + user_id = uid + break + + if not user_id and banque_nom and banque_nom in entreprises: + for nom_entreprise, info in entreprises[banque_nom].items(): + if info.get("rib") == rib: + cible_data = entreprises + user_id = nom_entreprise + is_entreprise = True + break + + # Si banque non précisée ou compte non trouvé, recherche dans toutes les banques + if not user_id and not banque_nom: + # Recherche dans toutes les banques utilisateurs + for banque_courante, comptes_banque in comptes.items(): + for uid, info in comptes_banque.items(): + if info.get("rib") == rib: + cible_data = comptes + user_id = uid + banque_nom = banque_courante + break + if user_id: + break + + if not user_id and not is_entreprise: + # Recherche dans toutes les banques entreprises + for banque_courante, entreprises_banque in entreprises.items(): + for nom_entreprise, info in entreprises_banque.items(): + if info.get("rib") == rib: + cible_data = entreprises + user_id = nom_entreprise + banque_nom = banque_courante + is_entreprise = True + break + if user_id: + break + + if not user_id: + await interaction.response.send_message( + "❌ Aucun compte trouvé avec ce RIB.", + ephemeral=True + ) + return + + # Ajout du montant + cible_data[banque_nom][user_id]["solde"] += montant + transaction = { + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Dépôt", + "source": "Banque", + "montant": montant, + "emetteur": interaction.user.id, + "destinataire": user_id + } + cible_data[banque_nom][user_id]["transactions"].append(transaction) + + # Sauvegarde + if is_entreprise: + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(entreprises, f, ensure_ascii=False, indent=4) + else: + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes, f, ensure_ascii=False, indent=4) + # Envoyer un MP à l'utilisateur (sauf entreprise) + try: + user = await self.bot.fetch_user(int(user_id)) + await user.send( + f"💰 Un dépôt de **{montant:.2f}€** a été effectué sur votre compte dans **{banque_nom}**." + ) + except Exception: + pass # Si l'utilisateur a désactivé les MP + + await interaction.response.send_message( + f"✅ **{montant:.2f}€** ajoutés avec succès au compte `{rib}` dans la banque **{banque_nom}**.", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(AjouterArgent(bot)) \ No newline at end of file diff --git a/commandes/annonces_sessions.py b/commandes/annonces_sessions.py new file mode 100644 index 0000000..dfdd2ae --- /dev/null +++ b/commandes/annonces_sessions.py @@ -0,0 +1,220 @@ +import discord +from discord import app_commands +from discord.ext import commands, tasks +import dateparser +from datetime import datetime, timezone + +ROLE_PING_ID = 1278319901651632138 # ID du rôle citoyen # Rôle pour l'annonce principale +REMINDER_ROLE_ID = 1303750986900439151 # ID du rôle rappels sessions # Rôle pour les rappels (à adapter !) + +presence_data = {} + +class PresenceView(discord.ui.View): + def __init__(self, message_id): + super().__init__(timeout=None) + self.message_id = message_id + + async def update_message(self, interaction, state): + user_id = interaction.user.id + if self.message_id not in presence_data: + presence_data[self.message_id] = { + "present": set(), "absent": set(), "retard": set(), + "date": None, "sent_dm": False, + "reminder1": None, "reminder2": None, + "reminder1_sent": False, "reminder2_sent": False, + "channel_id": None, "guild_id": None + } + for key in ["present", "absent", "retard"]: + presence_data[self.message_id][key].discard(user_id) + presence_data[self.message_id][state].add(user_id) + n_present = len(presence_data[self.message_id]["present"]) + n_absent = len(presence_data[self.message_id]["absent"]) + n_retard = len(presence_data[self.message_id]["retard"]) + msg = await interaction.channel.fetch_message(self.message_id) + lines = msg.content.split('\n') + # On modifie uniquement les lignes de présence + for i, line in enumerate(lines): + if line.startswith("> - Je serai présent"): + lines[i] = f"> - Je serai présent : <:check:1297296859206778911> **({n_present})**" + elif line.startswith("> - Je serai absent"): + lines[i] = f"> - Je serai absent : <:uncheck:1297296882778902598> **({n_absent})**" + elif line.startswith("> - Je serai en retard"): + lines[i] = f"> - Je serai en retard : ⏰ **({n_retard})**" + new_content = '\n'.join(lines) + await msg.edit(content=new_content, view=self) + + @discord.ui.button(label="Présent", style=discord.ButtonStyle.success, emoji="✅", custom_id="presence_present") + async def present(self, interaction: discord.Interaction, button: discord.ui.Button): + await self.update_message(interaction, "present") + await interaction.response.send_message("Merci, tu as été noté comme **présent** à la session RP !", ephemeral=True) + + @discord.ui.button(label="Absent", style=discord.ButtonStyle.danger, emoji="❌", custom_id="presence_absent") + async def absent(self, interaction: discord.Interaction, button: discord.ui.Button): + await self.update_message(interaction, "absent") + await interaction.response.send_message("Merci, tu as été noté comme **absent** à la session RP.", ephemeral=True) + + @discord.ui.button(label="En retard", style=discord.ButtonStyle.primary, emoji="⏰", custom_id="presence_retard") + async def retard(self, interaction: discord.Interaction, button: discord.ui.Button): + await self.update_message(interaction, "retard") + await interaction.response.send_message("Merci, tu as été noté comme **en retard** pour la session RP.", ephemeral=True) + +class AnnonceSession(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.check_sessions.start() + + def cog_unload(self): + self.check_sessions.cancel() + + @app_commands.command( + name="annonce_session", + description="Annonce une session RP avec image, rappels et boutons de présence." + ) + @app_commands.describe( + date="Date de la session (ex: Vendredi 20 Juin à 20h45)", + reminder1="Date/heure du 1er rappel (ex: Jeudi 19 Juin à 19h)", + reminder2="Date/heure du 2e rappel (ex: Vendredi 20 Juin à 15h)", + image="Image à joindre (obligatoire)" + ) + async def annonce_session( + self, + interaction: discord.Interaction, + date: str, + reminder1: str, + reminder2: str, + image: discord.Attachment + ): + if not image.content_type or not image.content_type.startswith("image/"): + await interaction.response.send_message( + "❌ Le fichier joint doit être une image valide.", ephemeral=True + ) + return + + # On parse toutes les dates en Europe/Paris + session_date = dateparser.parse( + date, languages=['fr'], + settings={"TIMEZONE": "Europe/Paris", "RETURN_AS_TIMEZONE_AWARE": True} + ) + reminder1_date = dateparser.parse( + reminder1, languages=['fr'], + settings={"TIMEZONE": "Europe/Paris", "RETURN_AS_TIMEZONE_AWARE": True} + ) + reminder2_date = dateparser.parse( + reminder2, languages=['fr'], + settings={"TIMEZONE": "Europe/Paris", "RETURN_AS_TIMEZONE_AWARE": True} + ) + + if not session_date or not reminder1_date or not reminder2_date: + await interaction.response.send_message( + "❌ Une des dates n'a pas été comprise. Vérifie le format.", ephemeral=True + ) + return + + session_date = session_date.astimezone(timezone.utc) + reminder1_date = reminder1_date.astimezone(timezone.utc) + reminder2_date = reminder2_date.astimezone(timezone.utc) + + message = ( + "# <:VV:1339237574593609780> - **SESSION VICTORIA’S VICE**\n" + "\n" + "```📅 - HORAIRE DE LA SESSION```\n" + f"> - Nous vous donnons rendez-vous le **{date}** pour une **session officielle** sur Victoria’s Vice. 🗓️\n" + "---\n" + "```🤔 - COMMENT REJOINDRE LA SESSION ?```\n" + "> - Pour lancer la Map, veuillez entrer le code ci-dessous sur la barre de recherche de Fortnite, par la suite lancer la Map en **public** afin de pouvoir nous rejoindre.\n" + "> - **`CODE DE LA MAP`** <:arrow:1297491509201080362> [0986-1836-1625]\n" + "> - **`LIEN DIRECT DE LA MAP`** <:arrow:1297491509201080362> \n" + "---\n" + "```🖐 - SEREZ-VOUS PRÉSENT(E) EN SESSION ?```\n" + "> - Je serai présent : <:check:1297296859206778911> **(0)**\n" + "> - Je serai absent : <:uncheck:1297296882778902598> **(0)**\n" + "> - Je serai en retard : ⏰ **(0)**\n" + "---" + f"> - **`PING`** : <@&{ROLE_PING_ID}>" + ) + + await interaction.response.send_message( + content=message, + files=[await image.to_file()] + ) + msg = await interaction.original_response() + presence_data[msg.id] = { + "present": set(), + "absent": set(), + "retard": set(), + "date": session_date, + "sent_dm": False, + "reminder1": reminder1_date, + "reminder2": reminder2_date, + "reminder1_sent": False, + "reminder2_sent": False, + "channel_id": msg.channel.id, + "guild_id": msg.guild.id + } + await msg.edit(view=PresenceView(msg.id)) + + @app_commands.command( + name="liste_presence", + description="Liste les présences pour une session RP." + ) + @app_commands.describe( + message_id="ID du message d'annonce" + ) + async def liste_presence(self, interaction: discord.Interaction, message_id: str): + try: + mid = int(message_id) + except ValueError: + await interaction.response.send_message("ID de message invalide.", ephemeral=True) + return + if mid not in presence_data: + await interaction.response.send_message("Aucune donnée de présence pour ce message.", ephemeral=True) + return + data = presence_data[mid] + def mentions(ids): + return ', '.join(f"<@{uid}>" for uid in ids) if ids else "Aucun" + await interaction.response.send_message( + f"**Présents ({len(data['present'])})** : {mentions(data['present'])}\n" + f"**Absents ({len(data['absent'])})** : {mentions(data['absent'])}\n" + f"**En retard ({len(data['retard'])})** : {mentions(data['retard'])}", + ephemeral=True + ) + + @tasks.loop(seconds=30) + async def check_sessions(self): + now = datetime.now(timezone.utc) + for msg_id, data in list(presence_data.items()): + # Premier rappel + if data.get("reminder1") and not data.get("reminder1_sent", False) and now >= data["reminder1"]: + await self.send_reminder(data, msg_id, "Premier rappel !") + data["reminder1_sent"] = True + # Deuxième rappel + if data.get("reminder2") and not data.get("reminder2_sent", False) and now >= data["reminder2"]: + await self.send_reminder(data, msg_id, "Deuxième rappel !") + data["reminder2_sent"] = True + # Envoi du MP à l'heure de la session + if data["date"] and not data.get("sent_dm", False) and now >= data["date"]: + for user_id in data["present"]: + try: + user = await self.bot.fetch_user(user_id) + channel = self.bot.get_channel(data["channel_id"]) + if channel: + msg = await channel.fetch_message(msg_id) + await user.send(f"La session RP commence ! Voici le lien de l'annonce : {msg.jump_url}") + except Exception as e: + print(f"Erreur lors de l'envoi du DM à {user_id} : {e}") + data["sent_dm"] = True + + async def send_reminder(self, data, msg_id, label): + channel = self.bot.get_channel(data["channel_id"]) + if channel: + msg = await channel.fetch_message(msg_id) + await channel.send( + f"<@&{REMINDER_ROLE_ID}> ⏰ **{label}**\nLa session RP approche !\nAnnonce : {msg.jump_url}" + ) + + @check_sessions.before_loop + async def before_check_sessions(self): + await self.bot.wait_until_ready() + +async def setup(bot): + await bot.add_cog(AnnonceSession(bot)) diff --git a/commandes/change_nickname.py b/commandes/change_nickname.py new file mode 100644 index 0000000..3ddcdaa --- /dev/null +++ b/commandes/change_nickname.py @@ -0,0 +1,45 @@ +import discord +from discord import app_commands +from discord.ext import commands +import re + +class FormatAllNicknames(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="formatall", description="Force tous les pseudos au format 'Prénom Nom | Epic'") + @app_commands.checks.has_permissions(manage_nicknames=True) + async def format_all(self, interaction: discord.Interaction): + await interaction.response.defer(thinking=True) + guild = interaction.guild + modified_count = 0 + + # Regex : deux mots avant le "|" + pattern_correct = re.compile(r"^[^\|]+\s[^\|]+\s\| .+") + + for member in guild.members: + if member.bot: + continue + + current_nick = member.nick or member.name + + # S'il respecte déjà le bon format ("Prénom Nom | Quelquechose"), on skip + if pattern_correct.match(current_nick): + continue + + try: + # Sinon, forcer à "Prénom Nom | Epic" + new_nick = "Prénom Nom | Epic" + + await member.edit(nick=new_nick) + modified_count += 1 + + except discord.Forbidden: + continue + except discord.HTTPException: + continue + + await interaction.followup.send(f"✅ Renommage terminé : {modified_count} membres modifiés.") + +async def setup(bot): + await bot.add_cog(FormatAllNicknames(bot)) \ No newline at end of file diff --git a/commandes/compte.py b/commandes/compte.py new file mode 100644 index 0000000..27e35ae --- /dev/null +++ b/commandes/compte.py @@ -0,0 +1,93 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.banque_manager import BanqueManager + +banque_manager = BanqueManager() + +class Compte(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command( + name="compte", + description="Afficher vos comptes bancaires et vos 3 dernières transactions" + ) + @app_commands.describe( + membre="Afficher le compte d'un autre membre (réservé au gouvernement)" + ) + async def compte(self, interaction: discord.Interaction, membre: discord.Member = None): + """Affiche les soldes et dernières transactions de l'utilisateur ou d'un autre membre (si gouvernement)""" + + banque_manager.load_data() + + # Par défaut, on cible l'utilisateur qui exécute la commande + cible = interaction.user + user_id = str(cible.id) + + # Si un autre membre est précisé, on vérifie le rôle + if membre and membre != interaction.user: + role_gouv = discord.utils.get(interaction.guild.roles, name="🌍│Gouvernement") + if role_gouv not in interaction.user.roles: + await interaction.response.send_message( + "❌ Vous devez avoir le rôle **gouvernement** pour consulter le compte d'un autre membre.", + ephemeral=True + ) + return + cible = membre + user_id = str(membre.id) + + comptes = banque_manager.comptes + + embed = discord.Embed( + title=f"💳 Comptes bancaires de {cible.display_name}", + color=discord.Color.blue() + ) + + banques_trouvees = False + + for banque, data in comptes.items(): + if not isinstance(data, dict) or user_id not in data: + continue # Ce n'est pas une banque valide pour cet utilisateur + + compte = data[user_id] + rib = compte.get("rib", "Non défini") + solde = compte.get("solde", 0) + transactions = compte.get("transactions", []) + + # Récupérer les 3 dernières transactions avec date + last_transactions = transactions[-3:] if transactions else [] + + tx_str = "" + for tx in last_transactions: + date = tx.get("date", "Date inconnue") + tx_type = tx.get("type", "Inconnu") + montant = tx.get("montant", 0) + source = tx.get("emetteur", tx.get("source", "Inconnu")) + dest = tx.get("destinataire", "Inconnu") + + if tx_type.lower() == "virement" or tx_type.lower().startswith("virement"): + tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€** à <@{dest}>\n" + elif tx_type.lower() == "virement reçu": + tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€** de <@{source}>\n" + else: + tx_str += f"- 🕒 {date} : **{tx_type}** de **{montant}€**\n" + + if not tx_str: + tx_str = "*Aucune transaction.*" + + embed.add_field( + name=f"🏦 {banque}", + value=f"💳 **RIB** : `{rib}`\n💰 **Solde** : `{solde}€`\n📜 **Transactions récentes :**\n{tx_str}", + inline=False + ) + + banques_trouvees = True + + if not banques_trouvees: + embed.description = "❌ Aucun compte bancaire trouvé dans les banques enregistrées pour cet utilisateur." + + await interaction.response.send_message(embed=embed, ephemeral=True) + +async def setup(bot): + await bot.add_cog(Compte(bot)) diff --git a/commandes/compte_banque_nationale.py b/commandes/compte_banque_nationale.py new file mode 100644 index 0000000..0bb2109 --- /dev/null +++ b/commandes/compte_banque_nationale.py @@ -0,0 +1,102 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +import math + +BANQUE_NATIONALE_ROLE_ID = 1362031086959329470 # Remplace par l’ID réel du rôle banque_nationale + +class CompteBanqueNationale(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def get_banque_nationale_data(self): + try: + with open("comptes_entreprises.json", "r+", encoding="utf-8") as f: + data = json.load(f) + + # Crée la section si elle n'existe pas + if "banque_nationale" not in data: + data["banque_nationale"] = { + "BANQUE": { + "rib": "11111 22222 33333333333 44", + "solde": 0.0, + "transactions": [{ + "date": "Création automatique", + "type": "Création de compte", + "source": "Système", + "montant": 0.0 + }] + } + } + f.seek(0) + json.dump(data, f, indent=4, ensure_ascii=False) + f.truncate() + + banque_data = data["banque_nationale"].get("BANQUE", {}) + return banque_data.get("solde", 0.0), banque_data.get("transactions", []) + except Exception as e: + print(f"Erreur lecture ou création banque_nationale : {e}") + return 0.0, [] + + @app_commands.command(name="voir_banque_nationale", description="Voir solde et transactions du compte banque nationale") + async def voir_banque_nationale(self, interaction: discord.Interaction): + if not any(role.id == BANQUE_NATIONALE_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'accéder à ce compte.", ephemeral=True) + return + + solde, transactions = self.get_banque_nationale_data() + + if not transactions: + await interaction.response.send_message("📄 Aucune transaction trouvée sur le compte banque nationale.", ephemeral=True) + return + + # Pagination + pages = [] + per_page = 5 + total_pages = math.ceil(len(transactions) / per_page) + + for i in range(total_pages): + start = i * per_page + end = start + per_page + chunk = transactions[start:end] + + embed = discord.Embed( + title="🏦 Banque Nationale - Historique", + description=f"Page {i+1}/{total_pages}", + color=discord.Color.blue() + ) + embed.add_field(name="💰 Solde", value=f"{solde:.2f}€", inline=False) + + for tx in chunk: + description = ( + f"**Date**: {tx.get('date', 'N/A')}\n" + f"**Type**: {tx.get('type', 'N/A')}\n" + f"**Montant**: {tx.get('montant', 0)}€\n" + f"**Source**: {tx.get('source', 'N/A')}" + ) + embed.add_field(name="📄 Transaction", value=description, inline=False) + + pages.append(embed) + + class Pagination(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + self.current = 0 + + @discord.ui.button(label="⬅️", style=discord.ButtonStyle.grey) + async def previous(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current > 0: + self.current -= 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + @discord.ui.button(label="➡️", style=discord.ButtonStyle.grey) + async def next(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current < len(pages) - 1: + self.current += 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + await interaction.response.send_message(embed=pages[0], view=Pagination(), ephemeral=True) + +async def setup(bot): + await bot.add_cog(CompteBanqueNationale(bot)) diff --git a/commandes/compte_fbm.py b/commandes/compte_fbm.py new file mode 100644 index 0000000..2254747 --- /dev/null +++ b/commandes/compte_fbm.py @@ -0,0 +1,92 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +import math + +FBM_ROLE_ID = 1353610672818360330 # ID du rôle autorisé à accéder au compte FBM + +class CompteFBM(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def get_all_transactions(self): + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + data = json.load(f) + fbm_data = data.setdefault("fbm", {}).setdefault("FBM", { + "solde": 0.0, + "transactions": [] + }) + return fbm_data["solde"], fbm_data["transactions"] + except Exception as e: + print(f"Erreur lecture comptes_entreprises.json : {e}") + return 0.0, [] + + @app_commands.command(name="compte_fbm", description="Affiche le solde et l'historique du compte FBM (réservé au personnel FBM).") + async def compte_fbm(self, interaction: discord.Interaction): + if not any(role.id == FBM_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'accéder à ce compte.", ephemeral=True) + return + + solde, transactions = self.get_all_transactions() + + if not transactions: + embed = discord.Embed( + title="📄 Compte FBM", + description="Aucune transaction enregistrée.", + color=discord.Color.orange() + ) + embed.add_field(name="💰 Solde actuel", value=f"{solde:.2f}€", inline=False) + await interaction.response.send_message(embed=embed, ephemeral=True) + return + + # Pagination + pages = [] + per_page = 5 + total_pages = math.ceil(len(transactions) / per_page) + + for i in range(total_pages): + start = i * per_page + end = start + per_page + chunk = transactions[start:end] + + embed = discord.Embed( + title="📄 Historique FBM", + description=f"Page {i+1}/{total_pages}", + color=discord.Color.orange() + ) + embed.add_field(name="💰 Solde actuel", value=f"{solde:.2f}€", inline=False) + + for tx in chunk: + desc = ( + f"**Date**: {tx.get('date', 'N/A')}\n" + f"**Type**: {tx.get('type', 'N/A')}\n" + f"**Montant**: {tx.get('montant', 0)}€\n" + f"**Source**: {tx.get('source', 'N/A')}" + ) + embed.add_field(name="🔸 Transaction", value=desc, inline=False) + + pages.append(embed) + + class Pagination(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + self.current = 0 + + @discord.ui.button(label="⬅️", style=discord.ButtonStyle.grey) + async def previous(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current > 0: + self.current -= 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + @discord.ui.button(label="➡️", style=discord.ButtonStyle.grey) + async def next(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current < len(pages) - 1: + self.current += 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + await interaction.response.send_message(embed=pages[0], view=Pagination(), ephemeral=True) + +async def setup(bot): + await bot.add_cog(CompteFBM(bot)) \ No newline at end of file diff --git a/commandes/compte_gouvernement.py b/commandes/compte_gouvernement.py new file mode 100644 index 0000000..26d7a3f --- /dev/null +++ b/commandes/compte_gouvernement.py @@ -0,0 +1,84 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +import math + +GOUVERNEMENT_ROLE_ID = 1278305482926194701 # Remplace avec l’ID de ton rôle Gouvernement # Remplace avec l’ID de ton rôle Gouvernement + +class CompteGouvernement(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def get_gouv_data(self): + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + data = json.load(f) + gouv_data = data.get("Gouvernement", {}).get("GOUV", {}) + return gouv_data.get("solde", 0.0), gouv_data.get("transactions", []) + except Exception as e: + print(f"Erreur lecture comptes_entreprises.json : {e}") + return 0.0, [] + + @app_commands.command(name="compte_gouvernement", description="Affiche le solde et les transactions du compte Gouvernement.") + async def compte_gouvernement(self, interaction: discord.Interaction): + if not any(role.id == GOUVERNEMENT_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'accéder à ce compte.", ephemeral=True) + return + + solde, transactions = self.get_gouv_data() + + if not transactions: + await interaction.response.send_message("📄 Aucune transaction trouvée pour le gouvernement.", ephemeral=True) + return + + # Pagination setup + pages = [] + per_page = 5 + total_pages = math.ceil(len(transactions) / per_page) + + for i in range(total_pages): + start = i * per_page + end = start + per_page + chunk = transactions[start:end] + + embed = discord.Embed( + title="🏛️ Compte Gouvernement", + description=f"Page {i+1}/{total_pages}", + color=discord.Color.dark_gold() + ) + embed.add_field(name="💰 Solde", value=f"{solde:.2f}€", inline=False) + + for tx in chunk: + desc = ( + f"**Date**: {tx.get('date', 'N/A')}\n" + f"**Type**: {tx.get('type', 'N/A')}\n" + f"**Montant**: {tx.get('montant', 0)}€\n" + f"**Source**: {tx.get('source', 'N/A')}" + ) + embed.add_field(name="📄 Transaction", value=desc, inline=False) + + pages.append(embed) + + # Vue de pagination + class Pagination(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + self.current = 0 + + @discord.ui.button(label="⬅️", style=discord.ButtonStyle.grey) + async def previous(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current > 0: + self.current -= 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + @discord.ui.button(label="➡️", style=discord.ButtonStyle.grey) + async def next(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current < len(pages) - 1: + self.current += 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + await interaction.response.send_message(embed=pages[0], view=Pagination(), ephemeral=True) + +async def setup(bot): + await bot.add_cog(CompteGouvernement(bot)) diff --git a/commandes/compte_urssaf.py b/commandes/compte_urssaf.py new file mode 100644 index 0000000..e4a30b4 --- /dev/null +++ b/commandes/compte_urssaf.py @@ -0,0 +1,96 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +import math + +URSAFF_ROLE_ID = 1362056014584615213 # Remplace par l’ID réel du rôle URSAFF # Remplace par l’ID réel du rôle URSAFF + +class CompteUrssaf(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def get_all_transactions(self): + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + data = json.load(f) + except Exception as e: + print(f"Erreur lecture comptes_entreprises.json : {e}") + return 0.0, [] + + # Si URSAFF n'existe pas, on le crée + if "ursaff" not in data: + data["ursaff"] = { + "URSSAFF": { + "rib": "00000 00000 00000000000 01", + "solde": 0.0, + "transactions": [] + } + } + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + ursaff_data = data.get("ursaff", {}).get("URSAFF", {}) + return ursaff_data.get("solde", 0.0), ursaff_data.get("transactions", []) + + @app_commands.command(name="compte_ursaff", description="Affiche le solde et l'historique complet du compte URSAFF (réservé aux membres URSAFF).") + async def compte_ursaff(self, interaction: discord.Interaction): + # Vérifie que l'utilisateur a le rôle URSAFF + if not any(role.id == URSAFF_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'accéder à ce compte.", ephemeral=True) + return + + solde, transactions = self.get_all_transactions() + + # Pagination setup + pages = [] + per_page = 5 + total_pages = max(1, math.ceil(len(transactions) / per_page)) + + for i in range(total_pages): + start = i * per_page + end = start + per_page + chunk = transactions[start:end] + + embed = discord.Embed( + title="📄 Historique URSSAF", + description=f"Page {i+1}/{total_pages}", + color=discord.Color.dark_purple() + ) + embed.add_field(name="💼 Solde actuel", value=f"{solde:.2f}€", inline=False) + + if chunk: + for tx in chunk: + description = ( + f"**Date**: {tx.get('date', 'N/A')}\n" + f"**Type**: {tx.get('type', 'N/A')}\n" + f"**Montant**: {tx.get('montant', 0)}€\n" + f"**Source**: {tx.get('source', 'N/A')}" + ) + embed.add_field(name="🔹 Transaction", value=description, inline=False) + else: + embed.add_field(name="📄 Transactions", value="Aucune transaction récente.", inline=False) + + pages.append(embed) + + class Pagination(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + self.current = 0 + + @discord.ui.button(label="⬅️", style=discord.ButtonStyle.grey) + async def previous(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current > 0: + self.current -= 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + @discord.ui.button(label="➡️", style=discord.ButtonStyle.grey) + async def next(self, interaction_btn: discord.Interaction, button: discord.ui.Button): + if self.current < len(pages) - 1: + self.current += 1 + await interaction_btn.response.edit_message(embed=pages[self.current], view=self) + + await interaction.response.send_message(embed=pages[0], view=Pagination(), ephemeral=True) + +async def setup(bot): + await bot.add_cog(CompteUrssaf(bot)) diff --git a/commandes/comptes_entreprises.py b/commandes/comptes_entreprises.py new file mode 100644 index 0000000..f6bb519 --- /dev/null +++ b/commandes/comptes_entreprises.py @@ -0,0 +1,73 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json + +class CompteEntreprise(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="compte_entreprise", description="Consulte le solde et les transactions d'une entreprise.") + @app_commands.choices(banque=banque_choices) + async def compte_entreprise( + self, + interaction: discord.Interaction, + banque: app_commands.Choice[str], + nom_entreprise: str, + mot_de_passe: str + ): + banque_nom = banque.value + + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur de lecture des données bancaires.", ephemeral=True) + return + + if banque_nom not in comptes or nom_entreprise not in comptes[banque_nom]: + await interaction.response.send_message("❌ Ce compte entreprise n'existe pas.", ephemeral=True) + return + + compte = comptes[banque_nom][nom_entreprise] + + # 🔐 Vérification du mot de passe avec la bonne clé + mdp_stocke = compte.get("mdp", "").strip() + mdp_fournit = mot_de_passe.strip() + + if mdp_stocke != mdp_fournit: + await interaction.response.send_message("❌ Mot de passe incorrect.", ephemeral=True) + return + + solde = compte.get("solde", 0) + transactions = compte.get("transactions", []) + + embed = discord.Embed( + title=f"🏢 Compte Entreprise : {nom_entreprise}", + color=discord.Color.teal() + ) + embed.add_field(name="🏦 Banque", value=banque_nom, inline=True) + embed.add_field(name="💰 Solde", value=f"{solde:.2f}€", inline=False) + + if transactions: + last_transactions = transactions[-3:] + for tx in reversed(last_transactions): + desc = ( + f"**Date**: {tx.get('date', 'N/A')}\n" + f"**Type**: {tx.get('type', 'N/A')}\n" + f"**Montant**: {tx.get('montant', 0)}€\n" + f"**Source**: {tx.get('source', 'N/A')}" + ) + embed.add_field(name="📄 Transaction", value=desc, inline=False) + else: + embed.add_field(name="📄 Transactions", value="Aucune transaction récente.", inline=False) + + await interaction.response.send_message(embed=embed, ephemeral=True) + +async def setup(bot): + await bot.add_cog(CompteEntreprise(bot)) diff --git a/commandes/counting.py b/commandes/counting.py new file mode 100644 index 0000000..d053be0 --- /dev/null +++ b/commandes/counting.py @@ -0,0 +1,68 @@ +import discord +from discord.ext import commands +from discord import app_commands +import json +import os + +COUNTING_FILE = "counting_data.json" +counting_channels = {} + +def load_counting_channels(): + global counting_channels + if os.path.isfile(COUNTING_FILE): + with open(COUNTING_FILE, "r", encoding="utf-8") as f: + data = json.load(f) + counting_channels = {int(k): v for k, v in data.items()} + else: + counting_channels = {} + +def save_counting_channels(): + with open(COUNTING_FILE, "w", encoding="utf-8") as f: + json.dump({str(k): v for k, v in counting_channels.items()}, f, ensure_ascii=False, indent=2) + +class Counting(commands.Cog): + def __init__(self, bot): + self.bot = bot + load_counting_channels() + + async def cog_load(self): + # Synchronise les slash commands à l'ajout du cog + await self.bot.tree.sync() + print("Slash commands synchronisées pour Counting.") + + @app_commands.command(name="start_counting", description="Démarre un channel de counting.") + async def start_counting(self, interaction: discord.Interaction): + counting_channels[interaction.channel.id] = {"current": 0, "last_user": None} + save_counting_channels() + await interaction.response.send_message("Le counting commence ! Envoyez 1 pour débuter.") + + @commands.Cog.listener() + async def on_message(self, message): + if message.author.bot: + return + + channel_id = message.channel.id + if channel_id not in counting_channels: + return + + state = counting_channels[channel_id] + try: + number = int(message.content.strip()) + except ValueError: + return + + if number == state["current"] + 1 and message.author.id != state["last_user"]: + state["current"] = number + state["last_user"] = message.author.id + save_counting_channels() + await message.add_reaction("✅") + else: + await message.add_reaction("❌") + await message.channel.send( + f"Erreur ! <@{message.author.id}> a cassé la chaîne à {number}. On repart à 1 !" + ) + counting_channels[channel_id] = {"current": 0, "last_user": None} + save_counting_channels() + +async def setup(bot): + await bot.add_cog(Counting(bot)) diff --git a/commandes/identite.py b/commandes/identite.py new file mode 100644 index 0000000..2939422 --- /dev/null +++ b/commandes/identite.py @@ -0,0 +1,72 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.data_manager import DataManager +from datetime import datetime, timedelta + +ADMIN_ROLE_ID = 1278305482926194701 # ID du rôle gouvernement # ID du rôle gouvernement + +data_manager = DataManager() + +class CreerIdentite(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="creer_carte_identite", description="Créer une carte d'identité (Réservé aux admins)") + @app_commands.choices(sexe=[ + app_commands.Choice(name="Homme", value="Homme"), + app_commands.Choice(name="Femme", value="Femme"), + app_commands.Choice(name="Autre", value="Autre") + ]) + async def creer_carte_identite( + self, + interaction: discord.Interaction, + utilisateur: discord.Member, + nom: str, + prenom: str, + date_naissance: str, + lieu_naissance: str, + sexe: app_commands.Choice[str] + ): + """Commande réservée aux admins pour créer une carte d'identité""" + + if not any(role.id == ADMIN_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message( + "❌ Vous n'avez pas la permission de créer des cartes d'identité.", + ephemeral=True + ) + return + + user_id = str(utilisateur.id) + + # ➡️ Plus de refus : on écrase directement l'ancienne carte + ancienne_carte = user_id in data_manager.identities + + # 📅 Dates de création et d'expiration + date_creation = datetime.now() + date_expiration = (date_creation + timedelta(days=730)).strftime("%d/%m/%Y") + + # 📦 Données à enregistrer + identity_data = { + "nom": nom.upper(), + "prenom": prenom.capitalize(), + "date_naissance": date_naissance, + "lieu_naissance": lieu_naissance, + "sexe": sexe.value, + "date_expiration": date_expiration + } + + # 💾 Enregistrement + data_manager.identities[user_id] = identity_data + data_manager.save_data() + + # 📢 Message différent selon si c'était une ancienne carte ou non + if ancienne_carte: + message = f"✅ Carte d'identité de {utilisateur.mention} **mise à jour** avec succès !" + else: + message = f"✅ Carte d'identité créée pour {utilisateur.mention} avec succès !" + + await interaction.response.send_message(message, ephemeral=False) + +async def setup(bot): + await bot.add_cog(CreerIdentite(bot)) diff --git a/commandes/liste_taches.py b/commandes/liste_taches.py new file mode 100644 index 0000000..10b5e71 --- /dev/null +++ b/commandes/liste_taches.py @@ -0,0 +1,60 @@ +import discord +from discord.ext import commands +from discord import app_commands +import json +from collections import defaultdict + +class Taches(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="lister_taches", description="Liste toutes les tâches assignées à tous les utilisateurs.") + async def lister_taches(self, interaction: discord.Interaction): + try: + with open("taches.json", "r", encoding="utf-8") as f: + data = json.load(f) + except Exception: + await interaction.response.send_message("❌ Impossible de lire le fichier des tâches.", ephemeral=True) + return + + taches = data.get("taches", {}) + if not taches: + await interaction.response.send_message("Aucune tâche trouvée.", ephemeral=True) + return + + # Regrouper les tâches par utilisateur assigné + taches_par_utilisateur = defaultdict(list) + for tache_id, tache_info in taches.items(): + assigne_id = tache_info.get("assigné") + if assigne_id: + taches_par_utilisateur[assigne_id].append(tache_info) + else: + taches_par_utilisateur[None].append(tache_info) # Pour tâches non assignées + + embed = discord.Embed( + title="📋 Liste des tâches assignées", + color=discord.Color.blue() + ) + + for user_id, user_taches in taches_par_utilisateur.items(): + if user_id is None: + nom_utilisateur = "Non assigné" + else: + try: + user = await self.bot.fetch_user(int(user_id)) + nom_utilisateur = user.display_name + except Exception: + nom_utilisateur = f"Utilisateur inconnu ({user_id})" + + taches_text = "" + for tache in user_taches: + titre = tache.get("titre", "Sans titre") + statut = tache.get("statut", "inconnu") + taches_text += f"- **{titre}** *(état: {statut})*\n" + + embed.add_field(name=f"{nom_utilisateur}", value=taches_text, inline=False) + + await interaction.response.send_message(embed=embed, ephemeral=False) + +async def setup(bot): + await bot.add_cog(Taches(bot)) diff --git a/commandes/message.py b/commandes/message.py new file mode 100644 index 0000000..4c06992 --- /dev/null +++ b/commandes/message.py @@ -0,0 +1,22 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.logger import log_info, log_error + +class Message(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="message", description="Envoyer un message privé") + @app_commands.checks.has_permissions(administrator=True) + async def message_utilisateur(self, interaction: discord.Interaction, membre: discord.Member, message: str): + try: + await membre.send(message) + await interaction.response.send_message(f"Message envoyé à {membre.mention}.", ephemeral=True) + log_info(f"Message envoyé à {membre.name}") + except discord.Forbidden: + await interaction.response.send_message("Impossible d'envoyer un MP.", ephemeral=True) + log_error(f"Échec d'envoi à {membre.name}") + +async def setup(bot): + await bot.add_cog(Message(bot)) diff --git a/commandes/message_tous.py b/commandes/message_tous.py new file mode 100644 index 0000000..5e5c4ae --- /dev/null +++ b/commandes/message_tous.py @@ -0,0 +1,38 @@ +import discord +from discord import app_commands +from discord.ext import commands + +class MessageTous(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + + @app_commands.command( + name="messagetous", + description="Envoyer un message privé à tous les membres du serveur." + ) + @app_commands.checks.has_permissions(administrator=True) + async def message_tous(self, interaction: discord.Interaction, message: str): + await interaction.response.defer(ephemeral=True) + + succes = 0 + erreurs = 0 + + await interaction.followup.send("Envoi du message en cours...", ephemeral=False) + + for member in interaction.guild.members: + if not member.bot and member != interaction.user: + try: + await member.send(message) + succes += 1 + except discord.Forbidden: + erreurs += 1 + except Exception as e: + erreurs += 1 + + await interaction.followup.send( + f"✅ Message envoyé à {succes} membres.\n❌ {erreurs} erreurs.", + ephemeral=False + ) + +async def setup(bot: commands.Bot): + await bot.add_cog(MessageTous(bot)) \ No newline at end of file diff --git a/commandes/ouvrir_compte.py b/commandes/ouvrir_compte.py new file mode 100644 index 0000000..3c5c28d --- /dev/null +++ b/commandes/ouvrir_compte.py @@ -0,0 +1,76 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.banque_manager import BanqueManager +import random + +# Rôle nécessaire pour créer un compte +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier + +# Liste des banques disponibles (id interne : nom affiché) +BANQUES = { + "Victoria's Credit Bank": "Victoria's Credit Bank", + "NGC Bank": "Nexus Global Corporation Bank" +} + +banque_manager = BanqueManager() + +class OuvrirCompte(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="ouvrir_compte", description="Ouvre un compte bancaire pour un utilisateur (banquier uniquement).") + @app_commands.choices( + banque=[app_commands.Choice(name=nom, value=id_banque) for id_banque, nom in BANQUES.items()] + ) + async def ouvrir_compte(self, interaction: discord.Interaction, utilisateur: discord.Member, banque: app_commands.Choice[str]): + banque_id = banque.value + banque_nom = BANQUES[banque_id] + + # Vérification du rôle de banquier + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'ouvrir un compte.", ephemeral=True) + return + + user_id = str(utilisateur.id) + banque_manager.load_data() + + # Conversion automatique si l'ancien format est utilisé + if all(isinstance(v, dict) and 'rib' in v for v in banque_manager.comptes.values()): + banque_manager.comptes = {"vicynationale": banque_manager.comptes} + + # Vérification si la banque existe dans les données + if banque_id not in banque_manager.comptes: + banque_manager.comptes[banque_id] = {} + + # Vérification si l'utilisateur a déjà un compte dans cette banque + if user_id in banque_manager.comptes[banque_id]: + await interaction.response.send_message( + f"❌ {utilisateur.mention} possède déjà un compte à la {banque_nom} !", + ephemeral=True + ) + return + + # Génération du RIB aléatoire + rib = f"{random.randint(10000, 99999)} {random.randint(10000, 99999)} {random.randint(10000000000, 99999999999)} {random.randint(10, 99)}" + + # Création du compte + banque_manager.comptes[banque_id][user_id] = { + "rib": rib, + "solde": 0.0, + "transactions": [] + } + + banque_manager.save_data() + + # Envoi du RIB en MP à l'utilisateur cible + try: + await utilisateur.send(f"🏦 Un compte a été créé pour vous à la **{banque_nom}**.\nVoici votre RIB : `{rib}`") + except discord.Forbidden: + await interaction.response.send_message("❌ Impossible d'envoyer le RIB en message privé (l'utilisateur a les MP fermés).", ephemeral=True) + return + + await interaction.response.send_message(f"✅ Compte créé avec succès pour {utilisateur.mention} à la **{banque_nom}**.", ephemeral=True) + +async def setup(bot): + await bot.add_cog(OuvrirCompte(bot)) \ No newline at end of file diff --git a/commandes/ouvrir_comptes_entreprises.py b/commandes/ouvrir_comptes_entreprises.py new file mode 100644 index 0000000..f33290a --- /dev/null +++ b/commandes/ouvrir_comptes_entreprises.py @@ -0,0 +1,92 @@ +import json +import os +import random +import string +import discord +from discord import app_commands +from discord.ext import commands + +COMPTES_ENTREPRISES_PATH = "comptes_entreprises.json" +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier + +def generer_rib(): + return " ".join(["".join(random.choices(string.digits, k=5)) for _ in range(4)]) + +def generer_mdp(): + return "".join(random.choices(string.ascii_letters + string.digits, k=8)) + +class OuvrirCompteEntreprise(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choix = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + tva_choix = [ + app_commands.Choice(name="2%", value=2), + app_commands.Choice(name="5%", value=5), + app_commands.Choice(name="10%", value=10), + app_commands.Choice(name="20%", value=20), + ] + + @app_commands.command(name="ouvrir_compte_entreprise", description="Ouvre un compte bancaire pour une entreprise") + @app_commands.choices(banque=banque_choix, tva=tva_choix) + async def ouvrir_compte_entreprise(self, interaction: discord.Interaction, entreprise: str, banque: app_commands.Choice[str], tva: app_commands.Choice[int]): + # ✅ Vérifie que l'utilisateur est banquier + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'exécuter cette commande.", ephemeral=True) + return + + banque_name = banque.value + entreprise = entreprise.strip() + + # ✅ Chargement sécurisé du fichier + if os.path.exists(COMPTES_ENTREPRISES_PATH): + try: + with open(COMPTES_ENTREPRISES_PATH, "r", encoding="utf-8") as f: + comptes = json.load(f) + except json.JSONDecodeError: + comptes = {} + else: + comptes = {} + + if banque_name not in comptes: + comptes[banque_name] = {} + + if entreprise in comptes[banque_name]: + await interaction.response.send_message(f"❌ Un compte existe déjà pour l'entreprise **{entreprise}** dans la banque **{banque_name}**.", ephemeral=True) + return + + rib = generer_rib() + mdp = generer_mdp() + + comptes[banque_name][entreprise] = { + "rib": rib, + "solde": 0, + "mdp": mdp, + "tva": tva.value, + "transactions": [] + } + + with open(COMPTES_ENTREPRISES_PATH, "w", encoding="utf-8") as f: + json.dump(comptes, f, ensure_ascii=False, indent=4) + + # ✅ MP à l'utilisateur avec le RIB et le mot de passe + try: + await interaction.user.send( + f"🏦 Compte de l'entreprise **{entreprise}** ouvert avec succès dans la banque **{banque_name}** !\n" + f"💳 RIB : `{rib}`\n" + f"🔐 Mot de passe : `{mdp}`\n" + f"💼 Taux de TVA : `{tva.value}%`\n\n" + f"Conservez bien ces informations." + ) + except discord.Forbidden: + await interaction.response.send_message("⚠️ Impossible de vous envoyer un message privé avec les informations du compte.", ephemeral=True) + return + + await interaction.response.send_message(f"✅ Le compte de l'entreprise **{entreprise}** a été créé avec succès.", ephemeral=True) + +async def setup(bot): + await bot.add_cog(OuvrirCompteEntreprise(bot)) diff --git a/commandes/permis.py b/commandes/permis.py new file mode 100644 index 0000000..1396ff6 --- /dev/null +++ b/commandes/permis.py @@ -0,0 +1,32 @@ +import discord +from discord.ext import commands +from discord import app_commands + +# IDs des rôles +PERMIS_ROLE_ID = 1357027980056199258 +AUTO_ECOLE_ROLE_ID = 1338844772118298634 + +class PermisCommand(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="ajouter_permis", description="Ajoute le rôle 'permis' à un membre.") + async def ajouter_permis(self, interaction: discord.Interaction, membre: discord.Member): + """Ajoute le rôle 'permis' à un membre sélectionné.""" + # Vérifier si l'utilisateur a le rôle "auto-école" + if AUTO_ECOLE_ROLE_ID not in [role.id for role in interaction.user.roles]: + await interaction.response.send_message("❌ Erreur : Vous n'avez pas la permission d'utiliser cette commande.") + return + + # Vérifier si le rôle "permis" existe + permis_role = interaction.guild.get_role(PERMIS_ROLE_ID) + if not permis_role: + await interaction.response.send_message("❌ Erreur : Le rôle 'permis' n'existe pas.") + return + + # Ajouter le rôle "permis" au membre + await membre.add_roles(permis_role) + await interaction.response.send_message(f"✅ Le rôle 'permis' a été ajouté à {membre.mention}.") + +async def setup(bot): + await bot.add_cog(PermisCommand(bot)) \ No newline at end of file diff --git a/commandes/presence_session.py b/commandes/presence_session.py new file mode 100644 index 0000000..dedaebb --- /dev/null +++ b/commandes/presence_session.py @@ -0,0 +1,38 @@ +import discord +from discord import app_commands +from discord.ext import commands +# Import ou partage de presence_data selon l'architecture +from commandes.annonces_sessions import presence_data # adapte le chemin si besoin + +class ListePresence(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command( + name="liste_presence", + description="Liste les présences pour une session RP." + ) + @app_commands.describe( + message_id="ID du message d'annonce" + ) + async def liste_presence(self, interaction: discord.Interaction, message_id: str): + try: + mid = int(message_id) + except ValueError: + await interaction.response.send_message("ID de message invalide.", ephemeral=True) + return + if mid not in presence_data: + await interaction.response.send_message("Aucune donnée de présence pour ce message.", ephemeral=True) + return + data = presence_data[mid] + def mentions(ids): + return ', '.join(f"<@{uid}>" for uid in ids) if ids else "Aucun" + await interaction.response.send_message( + f"**Présents ({len(data['present'])})** : {mentions(data['present'])}\n" + f"**Absents ({len(data['absent'])})** : {mentions(data['absent'])}\n" + f"**En retard ({len(data['retard'])})** : {mentions(data['retard'])}", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(ListePresence(bot)) \ No newline at end of file diff --git a/commandes/pret.py b/commandes/pret.py new file mode 100644 index 0000000..7fa1a21 --- /dev/null +++ b/commandes/pret.py @@ -0,0 +1,75 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.banque_manager import BanqueManager + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier + +banque_manager = BanqueManager() + +class Pret(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="calculer_pret", description="Accorde un prêt bancaire à un utilisateur (Réservé aux banquiers).") + async def calculer_pret( + self, + interaction: discord.Interaction, + utilisateur: discord.Member, + banque: str, + montant: float, + duree_annees: int + ): + """Les banquiers peuvent accorder un prêt à un utilisateur si son solde le permet.""" + + # Vérification de si le joueur executant la commande est un banquier + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message( + "❌ Vous n'avez pas la permission d'accorder un prêt.", + ephemeral=True + ) + return + + user_id = str(utilisateur.id) + success, result = banque_manager.ajouter_pret(user_id, banque, montant, duree_annees) + + if not success: + await interaction.response.send_message(result, ephemeral=True) + return + + total_a_rembourser = result + taux_interet = banque_manager.comptes[user_id]['prets'][-1]['taux_interet'] * 100 + + # Vérifier si l'utilisateur a assez d'argent pour rembourser + solde_utilisateur = banque_manager.comptes[user_id].get("solde", 0) + if solde_utilisateur < total_a_rembourser: + await interaction.response.send_message( + f"❌ {utilisateur.mention} n'a pas assez d'argent pour rembourser ce prêt.\n" + f"💰 **Solde actuel** : {solde_utilisateur}€\n" + f"💳 **Montant à rembourser** : {total_a_rembourser}€", + ephemeral=True + ) + return + + # Débiter le solde de l'utilisateur + banque_manager.comptes[user_id]["solde"] -= total_a_rembourser + banque_manager.save_data() + + # Création de l'embed + embed = discord.Embed( + title="🏦 Prêt bancaire accordé", + description=f"Le prêt a été accordé par {interaction.user.mention} pour {utilisateur.mention}.", + color=discord.Color.green() + ) + embed.set_thumbnail(url="https://cdn-icons-png.flaticon.com/512/2910/2910827.png") # Icône banque + embed.add_field(name="💰 Montant emprunté", value=f"{montant}€", inline=True) + embed.add_field(name="📅 Durée", value=f"{duree_annees} ans", inline=True) + embed.add_field(name="📈 Taux d'intérêt", value=f"{taux_interet}%", inline=True) + embed.add_field(name="💳 Montant total à rembourser", value=f"{total_a_rembourser}€", inline=False) + embed.add_field(name="💰 Solde après prêt", value=f"{banque_manager.comptes[user_id]['solde']}€", inline=True) + embed.set_footer(text="Prêt enregistré dans le compte bancaire ✅") + + await interaction.response.send_message(embed=embed) + +async def setup(bot): + await bot.add_cog(Pret(bot)) \ No newline at end of file diff --git a/commandes/rename_all_on_join.py b/commandes/rename_all_on_join.py new file mode 100644 index 0000000..69e5670 --- /dev/null +++ b/commandes/rename_all_on_join.py @@ -0,0 +1,24 @@ +import discord +from discord.ext import commands +from utils.logger import log_info, log_error + +class RenameMember(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_member_join(self, member): + try: + # Vérifie si le bot a la permission de changer les pseudos + if member.guild.me.guild_permissions.manage_nicknames: + # Renommer le membre avec le format "Prénom Nom | Epic" + await member.edit(nick="Prénom Nom | Epic") + log_info(f"[✅] Pseudo modifié pour {member.display_name}") + else: + log_error(f"[❌] Pas la permission de modifier {member.display_name}") + except Exception as e: + log_error(f"[⚠️] Erreur pour {member.display_name} : {e}") + +# Fonction pour ajouter le cog à ton bot +async def setup(bot): + await bot.add_cog(RenameMember(bot)) diff --git a/commandes/restranscription_staff.py b/commandes/restranscription_staff.py new file mode 100644 index 0000000..f893a1d --- /dev/null +++ b/commandes/restranscription_staff.py @@ -0,0 +1,49 @@ +import discord +from discord.ext import commands +from discord import app_commands + +class RestranscriptionStaff(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message): + # Ignorer les messages du bot lui-même + if message.author == self.bot.user: + return + + # Ignorer les messages d'autres bots + if message.author.bot: + return + + # Réceptionner les MPs + if isinstance(message.channel, discord.DMChannel): + channel_reception = self.bot.get_channel(1277951933105049601) # Remplacez par votre ID de salon + + embed = discord.Embed(description=message.content, + color=discord.Color.blue()) + embed.set_author(name=message.author.name, + icon_url=message.author.avatar.url + if message.author.avatar else None) + + await channel_reception.send(embed=embed) + + # Traiter les autres commandes si nécessaire + await self.bot.process_commands(message) + + # Exemple de commande slash avec gestion des erreurs + @app_commands.command() + async def message_tous(self, interaction: discord.Interaction): + await interaction.response.send_message("Commande test!") + + @message_tous.error + async def message_tous_error(self, interaction: discord.Interaction, + error: app_commands.AppCommandError): + if isinstance(error, app_commands.MissingPermissions): + await interaction.response.send_message( + "Vous n'avez pas la permission d'utiliser cette commande.", + ephemeral=True) + +# Fonction de configuration pour ajouter le cog au bot +async def setup(bot): + await bot.add_cog(RestranscriptionStaff(bot)) \ No newline at end of file diff --git a/commandes/retirer_argent.py b/commandes/retirer_argent.py new file mode 100644 index 0000000..4988414 --- /dev/null +++ b/commandes/retirer_argent.py @@ -0,0 +1,147 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier # ID du rôle banquier + +class RetirerArgent(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command( + name="retirer_argent", + description="Retire de l'argent d'un compte via son RIB (utilisateur ou entreprise)." + ) + @app_commands.choices(banque=banque_choices) + @app_commands.describe( + rib="Le RIB du compte", + montant="Montant à retirer", + banque="Banque cible (facultatif)" + ) + async def retirer_argent( + self, + interaction: discord.Interaction, + rib: str, + montant: float, + banque: app_commands.Choice[str] = None + ): + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission de faire cela.", ephemeral=True) + return + + if montant <= 0: + await interaction.response.send_message("❌ Le montant doit être supérieur à zéro.", ephemeral=True) + return + + banque_nom = banque.value if banque else None + + # Charger les fichiers + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes_bancaires = json.load(f) + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + comptes_entreprises = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur lors de la lecture des fichiers JSON.", ephemeral=True) + return + + compte = None + source = None # "utilisateur" ou "entreprise" + user_id = None + + # Recherche dans la banque spécifiée (si précisée) + if banque_nom and banque_nom in comptes_bancaires: + for uid, data in comptes_bancaires[banque_nom].items(): + if data.get("rib") == rib: + compte = data + source = "utilisateur" + user_id = uid + break + + if not compte and banque_nom and banque_nom in comptes_entreprises: + for entreprise, data in comptes_entreprises[banque_nom].items(): + if data.get("rib") == rib: + compte = data + source = "entreprise" + user_id = entreprise + break + + # Si banque non précisée ou compte non trouvé, recherche dans toutes les banques + if not compte and not banque_nom: + # Recherche dans toutes les banques utilisateurs + for banque_courante, comptes_banque in comptes_bancaires.items(): + for uid, data in comptes_banque.items(): + if data.get("rib") == rib: + compte = data + source = "utilisateur" + user_id = uid + banque_nom = banque_courante + break + if compte: + break + + if not compte: + # Recherche dans toutes les banques entreprises + for banque_courante, entreprises_banque in comptes_entreprises.items(): + for entreprise, data in entreprises_banque.items(): + if data.get("rib") == rib: + compte = data + source = "entreprise" + user_id = entreprise + banque_nom = banque_courante + break + if compte: + break + + if not compte: + await interaction.response.send_message("❌ Aucun compte trouvé avec ce RIB.", ephemeral=True) + return + + if compte["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant pour retirer cette somme.", ephemeral=True) + return + + # Appliquer le retrait + compte["solde"] -= montant + transaction = { + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Retrait", + "source": "Banque", + "montant": -montant, + "emetteur": interaction.user.id, + "destinataire": user_id + } + compte.setdefault("transactions", []).append(transaction) + + # Sauvegarde dans le bon fichier + if source == "utilisateur": + comptes_bancaires[banque_nom][user_id] = compte + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes_bancaires, f, indent=4, ensure_ascii=False) + else: + comptes_entreprises[banque_nom][user_id] = compte + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(comptes_entreprises, f, indent=4, ensure_ascii=False) + + # Message de confirmation + embed = discord.Embed( + title="💸 Retrait effectué", + description=f"💼 Banque : **{banque_nom}**\n📌 Type : **{source.capitalize()}**", + color=discord.Color.red() + ) + embed.add_field(name="RIB", value=rib, inline=False) + embed.add_field(name="Montant retiré", value=f"{montant:.2f}€", inline=True) + embed.add_field(name="Effectué par", value=interaction.user.mention, inline=True) + embed.set_footer(text="Transaction enregistrée ✅") + + await interaction.response.send_message(embed=embed, ephemeral=False) + +async def setup(bot): + await bot.add_cog(RetirerArgent(bot)) \ No newline at end of file diff --git a/commandes/retrait_gouv.py b/commandes/retrait_gouv.py new file mode 100644 index 0000000..84fa721 --- /dev/null +++ b/commandes/retrait_gouv.py @@ -0,0 +1,184 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +GOUVERNEMENT_ROLE_ID = 1278305482926194701 # Remplace avec l’ID de ton rôle Gouvernement # Remplace par l'ID du rôle Gouvernement +GOUV_BANQUE = "Gouvernement" +GOUV_COMPTE = "GOUV" +GOUV_RIB = "00000 00000 00000000000 00" + +class GouvVirement(commands.Cog): + def __init__(self, bot): + self.bot = bot + + # Liste des banques à jour (ajoute ici toutes les banques possibles de ton système) + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command( + name="gouv_virer", + description="Le Gouvernement vire de l'argent de son compte vers un autre RIB (entreprise ou particulier)." + ) + @app_commands.choices(banque=banque_choices) + @app_commands.describe( + rib="Le RIB destinataire", + montant="Montant à virer", + banque="Banque cible (facultatif)" + ) + async def gouv_virer( + self, + interaction: discord.Interaction, + rib: str, + montant: float, + banque: app_commands.Choice[str] = None + ): + # Vérification du rôle Gouvernement + if not any(role.id == GOUVERNEMENT_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Seul le Gouvernement peut utiliser cette commande.", ephemeral=True) + return + + if montant <= 0: + await interaction.response.send_message("❌ Le montant doit être supérieur à zéro.", ephemeral=True) + return + + banque_nom = banque.value if banque else None + + # Charger les fichiers + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes_bancaires = json.load(f) + except Exception: + comptes_bancaires = {} + + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + comptes_entreprises = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur lors de la lecture des fichiers JSON.", ephemeral=True) + return + + # Récupérer le compte du Gouvernement + try: + gouv_compte = comptes_entreprises[GOUV_BANQUE][GOUV_COMPTE] + except KeyError: + await interaction.response.send_message("❌ Compte Gouvernement introuvable.", ephemeral=True) + return + + if gouv_compte["solde"] < montant: + await interaction.response.send_message("❌ Le Gouvernement n'a pas assez de fonds.", ephemeral=True) + return + + # Chercher le destinataire + destinataire_compte = None + destinataire_banque = None + destinataire_nom = None + destinataire_type = None + + # Si banque précisée, chercher d'abord dans cette banque (entreprises puis particuliers) + if banque_nom: + # Entreprises + if banque_nom in comptes_entreprises: + for nom, data in comptes_entreprises[banque_nom].items(): + if data.get("rib") == rib: + destinataire_compte = data + destinataire_banque = banque_nom + destinataire_nom = nom + destinataire_type = "entreprise" + break + # Particuliers + if not destinataire_compte and banque_nom in comptes_bancaires: + for uid, data in comptes_bancaires[banque_nom].items(): + if data.get("rib") == rib: + destinataire_compte = data + destinataire_banque = banque_nom + destinataire_nom = uid + destinataire_type = "particulier" + break + # Si banque non précisée, chercher dans toutes les banques + else: + # Entreprises + for banque_courante, entreprises in comptes_entreprises.items(): + for nom, data in entreprises.items(): + if data.get("rib") == rib: + destinataire_compte = data + destinataire_banque = banque_courante + destinataire_nom = nom + destinataire_type = "entreprise" + break + if destinataire_compte: + break + # Particuliers + if not destinataire_compte: + for banque_courante, comptes in comptes_bancaires.items(): + for uid, data in comptes.items(): + if data.get("rib") == rib: + destinataire_compte = data + destinataire_banque = banque_courante + destinataire_nom = uid + destinataire_type = "particulier" + break + if destinataire_compte: + break + + if not destinataire_compte: + await interaction.response.send_message("❌ Aucun compte trouvé avec ce RIB dans la banque spécifiée." if banque_nom else "❌ Aucun compte trouvé avec ce RIB.", ephemeral=True) + return + + # Effectuer le virement + gouv_compte["solde"] -= montant + destinataire_compte["solde"] += montant + + now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") + + # Transaction côté Gouvernement (sortant) + gouv_compte.setdefault("transactions", []).append({ + "date": now, + "type": "Virement", + "source": "Gouvernement", + "montant": -montant, + "emetteur": "Gouvernement", + "destinataire": destinataire_nom + }) + + # Transaction côté destinataire (entrant) + destinataire_compte.setdefault("transactions", []).append({ + "date": now, + "type": "Virement", + "source": "Gouvernement", + "montant": montant, + "emetteur": "Gouvernement", + "destinataire": destinataire_nom + }) + + # Sauvegarde + comptes_entreprises[GOUV_BANQUE][GOUV_COMPTE] = gouv_compte + if destinataire_type == "entreprise": + comptes_entreprises[destinataire_banque][destinataire_nom] = destinataire_compte + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(comptes_entreprises, f, indent=4, ensure_ascii=False) + else: + comptes_bancaires[destinataire_banque][destinataire_nom] = destinataire_compte + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(comptes_entreprises, f, indent=4, ensure_ascii=False) + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes_bancaires, f, indent=4, ensure_ascii=False) + + # Message de confirmation + embed = discord.Embed( + title="🏛️ Virement Gouvernemental effectué", + description=f"💼 Banque destinataire : **{destinataire_banque}**\n📌 Type : **{destinataire_type.capitalize()}**", + color=discord.Color.gold() + ) + embed.add_field(name="RIB destinataire", value=rib, inline=False) + embed.add_field(name="Montant viré", value=f"{montant:.2f}€", inline=True) + embed.add_field(name="Effectué par", value=interaction.user.mention, inline=True) + embed.set_footer(text="Transaction enregistrée ✅") + + await interaction.response.send_message(embed=embed, ephemeral=False) + +async def setup(bot): + await bot.add_cog(GouvVirement(bot)) diff --git a/commandes/roll.py b/commandes/roll.py new file mode 100644 index 0000000..bcf0e1e --- /dev/null +++ b/commandes/roll.py @@ -0,0 +1,30 @@ +import random +from discord import app_commands + +# Supposons que tu as accès à l'objet bot ou client principal +# Utilise bot.tree ou client.tree directement + +@app_commands.command( + name="roll", + description="Lancer un dé entre deux valeurs avec une raison." +) +@app_commands.describe( + minimum="Valeur minimale", + maximum="Valeur maximale", + action="Raison du lancer de dé" +) +async def roll(interaction, minimum: int, maximum: int, action: str): + if minimum > maximum: + await interaction.response.send_message( + "❌ La valeur minimale doit être inférieure ou égale à la valeur maximale.", ephemeral=True + ) + return + result = random.randint(minimum, maximum) + await interaction.response.send_message( + f"🎲 **{interaction.user.display_name}** a lancé un dé pour l'action *{action}*\n" + f"Résultat : **{result}** (entre {minimum} et {maximum})" + ) + +# Pour enregistrer la commande dans le bot : +async def setup(bot): + bot.tree.add_command(roll) diff --git a/commandes/stats_commandes.py b/commandes/stats_commandes.py new file mode 100644 index 0000000..d889af1 --- /dev/null +++ b/commandes/stats_commandes.py @@ -0,0 +1,144 @@ +import discord +from discord import app_commands +from discord.ext import commands +import matplotlib.pyplot as plt +import io +import datetime +from utils.stats_manager import get_stats_detailed # fonction fictive améliorée + +class StatsCommandes(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def plot_barh(self, labels, values, title, xlabel, color='cornflowerblue'): + plt.figure(figsize=(8,4)) + plt.barh(labels[::-1], values[::-1], color=color) + plt.title(title) + plt.xlabel(xlabel) + plt.tight_layout() + buf = io.BytesIO() + plt.savefig(buf, format='png') + plt.close() + buf.seek(0) + return buf + + def plot_line(self, dates, values, title, xlabel, ylabel, color='tab:blue'): + plt.figure(figsize=(10,5)) + plt.plot(dates, values, marker='o', color=color) + plt.title(title) + plt.xlabel(xlabel) + plt.ylabel(ylabel) + plt.grid(True, linestyle='--', alpha=0.7) + plt.tight_layout() + buf = io.BytesIO() + plt.savefig(buf, format='png') + plt.close() + buf.seek(0) + return buf + + def plot_pie(self, labels, values, title): + plt.figure(figsize=(6,6)) + plt.pie(values, labels=labels, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors) + plt.title(title) + plt.tight_layout() + buf = io.BytesIO() + plt.savefig(buf, format='png') + plt.close() + buf.seek(0) + return buf + + @app_commands.command(name="stats_bot", description="Affiche toutes les statistiques d'utilisation du bot.") + async def stats_bot(self, interaction: discord.Interaction): + # get_stats_detailed() doit retourner un dict avec les clés suivantes (exemple) : + # { + # "total_commandes": int, + # "top_commandes": [(nom, nb), ...], + # "top_utilisateurs": [(user_id, nb), ...], + # "evolution_commandes": [(date, nb), ...], # list de tuples date (datetime), nb commandes + # "repartition_statuts": {statut: nb, ...}, + # "commandes_par_jour": {jour_semaine: nb, ...} # ex: "Lundi": 123 + # } + + stats = get_stats_detailed() + + embed = discord.Embed( + title="📊 Statistiques Complètes du Bot", + description=f"Total commandes utilisées : **{stats['total_commandes']}**", + color=discord.Color.blue() + ) + + # Top commandes en texte + if stats["top_commandes"]: + top_cmds_text = "\n".join([f"• `{nom}` : **{nb}** fois" for nom, nb in stats["top_commandes"][:5]]) + else: + top_cmds_text = "Aucune commande utilisée." + embed.add_field(name="🏆 Top 5 des commandes", value=top_cmds_text, inline=False) + + # Top utilisateurs en texte + if stats["top_utilisateurs"]: + top_users_text = "\n".join( + [f"• <@{uid}> : **{nb}** commandes" for uid, nb in stats["top_utilisateurs"][:5]] + ) + else: + top_users_text = "Aucun utilisateur enregistré." + embed.add_field(name="👤 Top 5 utilisateurs", value=top_users_text, inline=False) + + # Génération des graphiques + + files = [] + + # Graphique 1 : Top commandes (barh) + if stats["top_commandes"]: + noms_cmds = [x[0] for x in stats["top_commandes"][:5]] + vals_cmds = [x[1] for x in stats["top_commandes"][:5]] + buf1 = self.plot_barh(noms_cmds, vals_cmds, "Top 5 Commandes les plus utilisées", "Nombre d'utilisations") + files.append(discord.File(fp=buf1, filename="top_commandes.png")) + embed.set_image(url="attachment://top_commandes.png") + + # Graphique 2 : Top utilisateurs (barh) + if stats["top_utilisateurs"]: + noms_users = [f"User {uid}" for uid, _ in stats["top_utilisateurs"][:5]] # On peut remplacer par mention si on fetch + vals_users = [nb for _, nb in stats["top_utilisateurs"][:5]] + buf2 = self.plot_barh(noms_users, vals_users, "Top 5 Utilisateurs actifs", "Nombre de commandes", color='mediumseagreen') + files.append(discord.File(fp=buf2, filename="top_utilisateurs.png")) + + # Graphique 3 : Évolution commandes dans le temps (line) + if stats.get("evolution_commandes"): + dates = [d for d, _ in stats["evolution_commandes"]] + vals = [v for _, v in stats["evolution_commandes"]] + # Convertir dates datetime en string format court + dates_str = [d.strftime("%d/%m") for d in dates] + buf3 = self.plot_line(dates_str, vals, "Évolution des commandes dans le temps", "Date", "Nombre de commandes") + files.append(discord.File(fp=buf3, filename="evolution_commandes.png")) + + # Graphique 4 : Répartition statuts (pie) + if stats.get("repartition_statuts"): + labels = list(stats["repartition_statuts"].keys()) + values = list(stats["repartition_statuts"].values()) + buf4 = self.plot_pie(labels, values, "Répartition des statuts des tâches") + files.append(discord.File(fp=buf4, filename="repartition_statuts.png")) + + # Graphique 5 : Commandes par jour de la semaine (bar) + if stats.get("commandes_par_jour"): + jours = list(stats["commandes_par_jour"].keys()) + valeurs = list(stats["commandes_par_jour"].values()) + plt.figure(figsize=(8,4)) + plt.bar(jours, valeurs, color='salmon') + plt.title("Commandes par jour de la semaine") + plt.xlabel("Jour") + plt.ylabel("Nombre de commandes") + plt.tight_layout() + buf5 = io.BytesIO() + plt.savefig(buf5, format='png') + plt.close() + buf5.seek(0) + files.append(discord.File(fp=buf5, filename="commandes_par_jour.png")) + + # Envoi embed + fichiers graphiques + if files: + await interaction.response.send_message(embed=embed, files=files) + else: + await interaction.response.send_message(embed=embed) + +async def setup(bot: commands.Bot): + await bot.add_cog(StatsCommandes(bot)) diff --git a/commandes/taches.py b/commandes/taches.py new file mode 100644 index 0000000..36336ad --- /dev/null +++ b/commandes/taches.py @@ -0,0 +1,259 @@ +import discord +from discord import app_commands +from discord.ext import commands, tasks +from datetime import datetime +from zoneinfo import ZoneInfo +from utils.gestion_taches import ( + ajouter_tache, lister_taches_utilisateur, taches_proches, + update_tache_status, charger_taches, supprimer_tache, sauvegarder_taches +) + +PRIORITES = ["Haute", "Moyenne", "Basse", "Critique", "Faible"] + +class RappelTacheView(discord.ui.View): + def __init__(self, tid: str): + super().__init__(timeout=None) + self.tid = tid + + @discord.ui.button(label="✅ Marquer comme faite", style=discord.ButtonStyle.success, custom_id="btn_mark_done") + async def mark_done(self, interaction: discord.Interaction, button: discord.ui.Button): + success = await update_tache_status(self.tid, "Terminée") + if success: + await interaction.response.send_message( + f"✅ La tâche #{self.tid} a été marquée comme terminée !", ephemeral=True) + else: + await interaction.response.send_message( + "❌ Impossible de mettre à jour la tâche. Peut-être déjà terminée ?", ephemeral=True) + self.disable_all_items() + await interaction.message.edit(view=self) + +class MesTachesPaginator(discord.ui.View): + def __init__(self, interaction: discord.Interaction, taches_list: list[tuple], per_page=5): + super().__init__(timeout=120) + self.interaction = interaction + self.taches = taches_list + self.per_page = per_page + self.page = 0 + self.max_page = (len(taches_list) - 1) // per_page + + def get_embed(self): + embed = discord.Embed(title="📝 Vos Tâches Assignées", color=discord.Color.green()) + start = self.page * self.per_page + end = start + self.per_page + for tid, t in self.taches[start:end]: + embed.add_field( + name=f"#{tid} - {t['titre']}", + value=f"📅 Échéance : {t['échéance']}\n⚠️ Priorité : {t['priorité']}\n📌 Statut : {t['statut']}", + inline=False + ) + embed.set_footer(text=f"Page {self.page + 1} / {self.max_page + 1}") + return embed + + @discord.ui.button(label="⬅️", style=discord.ButtonStyle.secondary) + async def previous_page(self, interaction: discord.Interaction, button: discord.ui.Button): + if interaction.user.id != self.interaction.user.id: + await interaction.response.send_message("❌ Ce n'est pas votre pagination.", ephemeral=True) + return + if self.page > 0: + self.page -= 1 + await interaction.response.edit_message(embed=self.get_embed(), view=self) + else: + await interaction.response.defer() + + @discord.ui.button(label="➡️", style=discord.ButtonStyle.secondary) + async def next_page(self, interaction: discord.Interaction, button: discord.ui.Button): + if interaction.user.id != self.interaction.user.id: + await interaction.response.send_message("❌ Ce n'est pas votre pagination.", ephemeral=True) + return + if self.page < self.max_page: + self.page += 1 + await interaction.response.edit_message(embed=self.get_embed(), view=self) + else: + await interaction.response.defer() + +class JiraDiscord(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.rappels.start() + + def cog_unload(self): + self.rappels.cancel() + + async def autocomplete_priorite(self, interaction: discord.Interaction, current: str): + return [ + app_commands.Choice(name=prio, value=prio) + for prio in PRIORITES if current.lower() in prio.lower() + ][:5] + + @app_commands.command(name="nouvelle_tache", description="Créer une nouvelle tâche") + @app_commands.describe( + titre="Titre de la tâche", + description="Description de la tâche", + assigne="Utilisateur assigné", + priorite="Niveau de priorité (ex: Haute, Moyenne, Basse)", + echeance="Date d'échéance au format JJ/MM/AAAA" + ) + async def nouvelle_tache( + self, interaction: discord.Interaction, titre: str, description: str, + assigne: discord.User, priorite: str, echeance: str + ): + data = await charger_taches() + for tid, tache in data.get("taches", {}).items(): + if tache["assigné"] == assigne.id and tache["titre"].lower() == titre.lower(): + return await interaction.response.send_message( + f"❌ {assigne.mention} a déjà une tâche avec ce titre.", ephemeral=True) + + try: + date_obj = datetime.strptime(echeance, "%d/%m/%Y") + date_str = date_obj.strftime("%Y-%m-%d") + except ValueError: + return await interaction.response.send_message( + "❌ Format de date invalide (JJ/MM/AAAA).", ephemeral=True) + + id_tache = await ajouter_tache(titre, description, assigne.id, priorite, date_str, interaction.user.id) + + embed = discord.Embed( + title=f"📌 Nouvelle Tâche #{id_tache}", + description=description, + color=discord.Color.blurple() + ) + embed.set_author(name=f"Assignée à {assigne.display_name}", icon_url=assigne.display_avatar.url) + embed.add_field(name="🗂 Titre", value=titre, inline=False) + embed.add_field(name="⚠️ Priorité", value=priorite, inline=True) + embed.add_field(name="📅 Échéance", value=echeance, inline=True) + embed.set_footer(text=f"Créée par {interaction.user.display_name}", icon_url=interaction.user.display_avatar.url) + + await interaction.response.send_message(embed=embed) + + try: + await assigne.send( + f"👋 Bonjour {assigne.display_name},\n\nUne nouvelle tâche t'a été assignée par {interaction.user.mention} :", + embed=embed + ) + except Exception: + pass + + @nouvelle_tache.autocomplete("priorite") + async def autocomplete_priorite_handler(self, interaction: discord.Interaction, current: str): + return await self.autocomplete_priorite(interaction, current) + + @app_commands.command(name="mes_taches", description="Lister mes tâches assignées") + async def mes_taches(self, interaction: discord.Interaction): + taches = await lister_taches_utilisateur(interaction.user.id) + if not taches: + await interaction.response.send_message("🚫 Aucune tâche ne vous est assignée.", ephemeral=True) + return + + taches_list = list(taches.items()) + if len(taches_list) <= 5: + embed = discord.Embed(title="📝 Vos Tâches Assignées", color=discord.Color.green()) + for tid, t in taches_list: + embed.add_field( + name=f"#{tid} - {t['titre']}", + value=f"📅 Échéance : {t['échéance']}\n⚠️ Priorité : {t['priorité']}\n📌 Statut : {t['statut']}", + inline=False + ) + await interaction.response.send_message(embed=embed, ephemeral=True) + else: + view = MesTachesPaginator(interaction, taches_list) + await interaction.response.send_message(embed=view.get_embed(), view=view, ephemeral=True) + + @app_commands.command(name="update_tache", description="Mettre à jour le statut et la priorité d'une tâche") + @app_commands.describe( + id_tache="ID de la tâche à mettre à jour", + statut="Nouveau statut de la tâche", + priorite="Nouvelle priorité (optionnel)" + ) + async def update_tache( + self, interaction: discord.Interaction, id_tache: str, statut: str, priorite: str = None + ): + data = await charger_taches() + if id_tache not in data.get("taches", {}): + return await interaction.response.send_message("❌ Tâche non trouvée.", ephemeral=True) + + tache = data["taches"][id_tache] + if tache["assigné"] != interaction.user.id: + return await interaction.response.send_message("❌ Vous ne pouvez pas mettre à jour le statut de cette tâche.", ephemeral=True) + + statut_update = await update_tache_status(id_tache, statut) + priorite_update = True + if priorite: + tache["priorité"] = priorite + await sauvegarder_taches(data) + + if statut_update and priorite_update: + await interaction.response.send_message( + f"✅ Le statut de la tâche #{id_tache} a été mis à jour à **{statut}**." + + (f"\nLa priorité est maintenant **{priorite}**." if priorite else ""), + ephemeral=True + ) + if tache["créé_par"] != interaction.user.id: + try: + creator = await self.bot.fetch_user(tache["créé_par"]) + await creator.send( + f"🔔 La tâche #{id_tache} que vous avez créée a été mise à jour par {interaction.user.mention} :\n" + f"**Nouveau statut** : {statut}" + + (f"\n**Nouvelle priorité** : {priorite}" if priorite else "") + ) + except Exception: + pass + else: + await interaction.response.send_message("❌ Erreur lors de la mise à jour de la tâche.", ephemeral=True) + + @update_tache.autocomplete("priorite") + async def autocomplete_priorite_update(self, interaction: discord.Interaction, current: str): + return await self.autocomplete_priorite(interaction, current) + + @app_commands.command(name="supprimer_tache", description="Supprimer une tâche") + @app_commands.describe( + id_tache="ID de la tâche à supprimer" + ) + async def supprimer_tache_cmd(self, interaction: discord.Interaction, id_tache: str): + data = await charger_taches() + if id_tache not in data.get("taches", {}): + return await interaction.response.send_message("❌ Tâche non trouvée.", ephemeral=True) + + tache = data["taches"][id_tache] + perms = interaction.user.guild_permissions + can_delete = ( + tache["créé_par"] == interaction.user.id or + tache["assigné"] == interaction.user.id or + perms.administrator + ) + if not can_delete: + return await interaction.response.send_message("❌ Vous ne pouvez pas supprimer cette tâche.", ephemeral=True) + + success = await supprimer_tache(id_tache) + if success: + await interaction.response.send_message(f"🗑️ La tâche #{id_tache} a été supprimée.", ephemeral=True) + else: + await interaction.response.send_message("❌ Erreur lors de la suppression de la tâche.", ephemeral=True) + + @tasks.loop(seconds=30) + async def rappels(self): + now = datetime.now(ZoneInfo("Europe/Paris")) + if now.hour == 9 and now.minute == 0: + taches = await taches_proches() + for tid, t in taches.items(): + try: + user = await self.bot.fetch_user(t["assigné"]) + embed = discord.Embed( + title=f"🔔 Rappel Tâche #{tid}", + description=t["description"], + color=discord.Color.orange() + ) + embed.add_field(name="🗂 Titre", value=t["titre"], inline=False) + embed.add_field(name="⚠️ Priorité", value=t["priorité"], inline=True) + embed.add_field(name="📅 Échéance", value=t["échéance"], inline=True) + embed.set_footer(text="Clique sur le bouton si tu as fini !") + view = RappelTacheView(tid) + await user.send(embed=embed, view=view) + except Exception: + continue + + @rappels.before_loop + async def avant_rappel(self): + await self.bot.wait_until_ready() + +async def setup(bot): + await bot.add_cog(JiraDiscord(bot)) \ No newline at end of file diff --git a/commandes/ticket.py b/commandes/ticket.py new file mode 100644 index 0000000..673a765 --- /dev/null +++ b/commandes/ticket.py @@ -0,0 +1,329 @@ +import discord +from discord.ext import commands +from discord import app_commands + +TICKET_CATEGORY_ID = 1301142883876737085 # ID de la catégorie des tickets # ID de la catégorie des tickets +STAFF_ROLE_ID = 1277638784095092816 # ID du rôle staff # ID du rôle staff +TEAM_STAFF_ROLE_ID = 1277638784095092816 # ID du rôle équipe staff # ID du rôle équipe staff +ATTENTE_ORAL_ROLE_ID = 1278343007996870699 # ID du rôle "attente oral" # ID du rôle "attente oral" +CANDIDATURE_A_FAIRE_ROLE_ID = 1278343541936099412 # ID du rôle "candidature à faire" # ID du rôle "candidature à faire" +CITOYEN_ROLE_ID = 1278319901651632138 # ID du rôle "citoyen" # ID du rôle "citoyen" + +class ContinueFormView(discord.ui.View): + """Vue avec un bouton pour continuer à l'étape suivante""" + + def __init__(self, current_step, step1_data=None, step2_part1_data=None, step2_part2_data=None): + super().__init__(timeout=180.0) # Définir un timeout pour la vue + self.current_step = current_step + self.step1_data = step1_data + self.step2_part1_data = step2_part1_data + self.step2_part2_data = step2_part2_data + + @discord.ui.button(label="📋 Continuer le formulaire", style=discord.ButtonStyle.green, custom_id="continue_form") + async def continue_form(self, interaction: discord.Interaction, button: discord.ui.Button): + """Passe à l'étape suivante du formulaire""" + if self.current_step == 1: + await interaction.response.send_modal(TicketStep2Part1(self.step1_data)) + elif self.current_step == 2: + await interaction.response.send_modal(TicketStep2Part2(self.step1_data, self.step2_part1_data)) + elif self.current_step == 3: + await interaction.response.send_modal(TicketStep3(self.step1_data, self.step2_part1_data, self.step2_part2_data)) + + # Vérifier si le message existe toujours avant de le modifier + try: + await interaction.message.edit(view=self) + except discord.errors.NotFound: + # Si le message n'existe plus, nous ne faisons rien + pass + +class TicketStep1(discord.ui.Modal, title="📋 Informations Personnelles"): + """Étape 1 du formulaire - Infos personnelles""" + + pseudo = discord.ui.TextInput(label="Pseudo Epic (Fortnite)", required=True, max_length=16) + age = discord.ui.TextInput(label="Âge", required=True, max_length=2) + experience = discord.ui.TextInput(label="Expérience RP ?", style=discord.TextStyle.paragraph, required=True, max_length=50) + decouverte = discord.ui.TextInput(label="Comment as-tu découvert le serveur ?", required=True, max_length=20) + micro = discord.ui.TextInput(label="As-tu un micro de qualité ?", required=True, max_length=3) + + async def on_submit(self, interaction: discord.Interaction): + """Envoie un bouton pour passer à l'étape 2""" + view = ContinueFormView(current_step=1, step1_data=self) + await interaction.response.send_message("✅ Première étape terminée ! Cliquez ci-dessous pour continuer.", view=view, ephemeral=True) + +class TicketStep2Part1(discord.ui.Modal, title="👤 Infos sur ton personnage (Partie 1)"): + """Étape 2 du formulaire - Infos RP (Partie 1)""" + + def __init__(self, step1_data): + super().__init__() + self.step1_data = step1_data + + prenom = discord.ui.TextInput(label="Prénom", required=True) + nom = discord.ui.TextInput(label="Nom", required=True) + age_perso = discord.ui.TextInput(label="Âge du personnage", required=True) + genre = discord.ui.TextInput(label="Genre", required=True, max_length=5) + naissance = discord.ui.TextInput(label="Date et lieu de naissance", required=True) + + async def on_submit(self, interaction: discord.Interaction): + """Envoie un bouton pour passer à l'étape suivante""" + view = ContinueFormView(current_step=2, step1_data=self.step1_data, step2_part1_data=self) + await interaction.response.send_message("✅ Deuxième partie terminée ! Cliquez ci-dessous pour continuer.", view=view, ephemeral=True) + +class TicketStep2Part2(discord.ui.Modal, title="👤 Infos sur ton personnage (Partie 2)"): + """Étape 2 du formulaire - Infos RP (Partie 2)""" + + def __init__(self, step1_data, step2_part1_data): + super().__init__() + self.step1_data = step1_data + self.step2_part1_data = step2_part1_data + + traits = discord.ui.TextInput(label="Traits de caractère", required=True) + nationalite = discord.ui.TextInput(label="Nationalité", required=True) + skin_rp = discord.ui.TextInput(label="Skin RP", required=True) + metier_souhaite = discord.ui.TextInput(label="Métier souhaité", required=True) + + async def on_submit(self, interaction: discord.Interaction): + """Envoie un bouton pour passer à l'étape 3""" + view = ContinueFormView(current_step=3, step1_data=self.step1_data, step2_part1_data=self.step2_part1_data, step2_part2_data=self) + await interaction.response.send_message("✅ Deuxième étape terminée ! Cliquez ci-dessous pour continuer.", view=view, ephemeral=True) + +class TicketStep3(discord.ui.Modal, title="📋 Développement du Personnage"): + """Étape 3 du formulaire - Histoire du personnage""" + + def __init__(self, step1_data, step2_part1_data, step2_part2_data): + super().__init__() + self.step1_data = step1_data + self.step2_part1_data = step2_part1_data + self.step2_part2_data = step2_part2_data + + histoire = discord.ui.TextInput( + label="Histoire du personnage", + style=discord.TextStyle.paragraph, + required=True, + min_length=425, + max_length=500 # Limite de caractères maximum + ) + objectifs = discord.ui.TextInput(label="Objectifs RP (court et long terme)", style=discord.TextStyle.paragraph, required=True, max_length=100) + + async def on_submit(self, interaction: discord.Interaction): + """Création du ticket après validation""" + guild = interaction.guild + user = interaction.user + category = discord.utils.get(guild.categories, id=TICKET_CATEGORY_ID) + + # Vérifier si la catégorie existe + if category is None: + await interaction.response.send_message("❌ Erreur : La catégorie des tickets n'existe pas !", ephemeral=True) + return + + # Vérifier si le rôle staff existe + staff_role = discord.utils.get(guild.roles, id=STAFF_ROLE_ID) + if staff_role is None: + await interaction.response.send_message("❌ Erreur : Le rôle staff n'existe pas !", ephemeral=True) + return + + # Vérifier si l'utilisateur a déjà un ticket ouvert + for channel in category.text_channels: + if channel.topic == f"Ticket de {user.id}": + await interaction.response.send_message(f"❌ Vous avez déjà un ticket ouvert : {channel.mention}", ephemeral=True) + return + + # Définir les permissions du salon du ticket + overwrites = { + guild.default_role: discord.PermissionOverwrite(read_messages=False), + user: discord.PermissionOverwrite(read_messages=True, send_messages=True), + staff_role: discord.PermissionOverwrite(read_messages=True, send_messages=True), + discord.utils.get(guild.roles, id=TEAM_STAFF_ROLE_ID): discord.PermissionOverwrite(read_messages=True, send_messages=False) + } + + # Créer un salon de ticket avec le nom [pseudo_du_membre]-écrit + ticket_channel = await category.create_text_channel( + name=f"{user.name}-écrit", + topic=f"Ticket de {user.id}", + overwrites=overwrites + ) + + # Récupérer le rôle "équipe staff" + team_staff_role = discord.utils.get(guild.roles, id=TEAM_STAFF_ROLE_ID) + + # Création de l'embed avec les infos du formulaire + embed = discord.Embed(title="📩 Ticket Whitelist", color=0x00ff00) + embed.add_field(name="📋 - Informations Personnelles", value=( + f"> - Pseudo Epic : {self.step1_data.pseudo.value}\n" + f"> - Âge : {self.step1_data.age.value}\n" + f"> - Expérience RP : {self.step1_data.experience.value}\n" + f"> - Découverte du serveur : {self.step1_data.decouverte.value}\n" + f"> - Micro de qualité : {self.step1_data.micro.value}" + ), inline=False) + embed.add_field(name="👤 - Informations RP", value=( + f"> - Prénom : {self.step2_part1_data.prenom.value}\n" + f"> - Nom : {self.step2_part1_data.nom.value}\n" + f"> - Âge du personnage : {self.step2_part1_data.age_perso.value}\n" + f"> - Genre : {self.step2_part1_data.genre.value}\n" + f"> - Naissance : {self.step2_part1_data.naissance.value}\n" + f"> - Traits de caractère : {self.step2_part2_data.traits.value}\n" + f"> - Nationalité : {self.step2_part2_data.nationalite.value}\n" + f"> - Skin RP : {self.step2_part2_data.skin_rp.value}\n" + f"> - Métier souhaité : {self.step2_part2_data.metier_souhaite.value}" + ), inline=False) + embed.add_field(name="📋 - Développement du Personnage", value=( + f"> - Histoire : {self.histoire.value}\n" + f"> - Objectifs : {self.objectifs.value}" + ), inline=False) + + # Envoyer l'embed avec les boutons d'actions pour les staff + await ticket_channel.send(embed=embed, view=TicketManagementView(user)) + + # Envoyer un message pour mentionner l'équipe staff + await ticket_channel.send(f"{team_staff_role.mention} - Nouveau ticket créé !") + + # Mettre à jour le pseudo du joueur si le bot a les permissions nécessaires + if guild.me.guild_permissions.manage_nicknames: + new_nickname = f"{self.step2_part1_data.prenom.value} {self.step2_part1_data.nom.value} | {self.step1_data.pseudo.value}" + if len(new_nickname) > 32: + new_nickname = new_nickname[:32] + await user.edit(nick=new_nickname) + else: + await interaction.followup.send("❌ Le bot n'a pas les permissions nécessaires pour modifier le pseudo.", ephemeral=True) + + # Envoyer un message de confirmation + try: + await interaction.response.send_message(f"✅ Ticket ouvert : {ticket_channel.mention}", ephemeral=True) + except discord.errors.NotFound: + await interaction.followup.send(f"✅ Ticket ouvert : {ticket_channel.mention}", ephemeral=True) + +class TicketManagementView(discord.ui.View): + """Vue pour gérer le ticket avec les boutons Fermer, Réouvrir, Claim et Supprimer""" + + def __init__(self, ticket_owner): + super().__init__(timeout=None) + self.ticket_owner = ticket_owner + self.claimed_by = None # Stocke le staff qui claim le ticket + + @discord.ui.button(label="🔒 Fermer le Ticket", style=discord.ButtonStyle.red, custom_id="close_ticket") + async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): + """Ferme le ticket en désactivant l'envoi de messages pour le membre""" + if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID): + await interaction.response.send_message("❌ Seuls les staffs peuvent fermer un ticket.", ephemeral=True) + return + + await interaction.channel.set_permissions(self.ticket_owner, read_messages=False, send_messages=False) + await interaction.channel.edit(name="ticket-fermé") + await interaction.response.send_message("🔒 Le ticket a été fermé. Vous ne pouvez plus le voir.", ephemeral=True) + + # Mettre à jour la vue pour afficher uniquement les boutons Réouvrir et Supprimer + new_view = ClosedTicketView(self.ticket_owner) + await interaction.channel.send("Le ticket a été fermé.", view=new_view) + + @discord.ui.button(label="👤 Prendre en charge le Ticket", style=discord.ButtonStyle.blurple, custom_id="claim_ticket") + async def claim_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): + """Un staff prend en charge le ticket""" + if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID): + await interaction.response.send_message("❌ Seuls les staffs peuvent claim un ticket.", ephemeral=True) + return + self.claimed_by = interaction.user + await interaction.channel.set_permissions(discord.utils.get(interaction.guild.roles, id=STAFF_ROLE_ID), send_messages=False, read_messages=True) + await interaction.channel.set_permissions(self.claimed_by, read_messages=True, send_messages=True) + await interaction.response.send_message(f"👤 {self.claimed_by.mention} a claim ce ticket.", ephemeral=False) + +class ClosedTicketView(discord.ui.View): + """Vue pour les tickets fermés avec les boutons Réouvrir et Supprimer""" + + def __init__(self, ticket_owner): + super().__init__(timeout=None) + self.ticket_owner = ticket_owner + + @discord.ui.button(label="♻ Réouvrir le Ticket", style=discord.ButtonStyle.green, custom_id="reopen_ticket") + async def reopen_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): + """Réouvre le ticket pour le membre""" + if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID): + await interaction.response.send_message("❌ Seuls les staffs peuvent réouvrir un ticket.", ephemeral=True) + return + await interaction.channel.set_permissions(self.ticket_owner, read_messages=True, send_messages=True) + await interaction.response.send_message("✅ Le ticket a été réouvert.", ephemeral=True) + + # Mettre à jour la vue pour afficher tous les boutons + new_view = TicketManagementView(self.ticket_owner) + await interaction.channel.send("Le ticket a été réouvert.", view=new_view) + + @discord.ui.button(label="❌ Supprimer le Ticket", style=discord.ButtonStyle.danger, custom_id="delete_ticket") + async def delete_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): + """Supprime le salon du ticket""" + if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID): + await interaction.response.send_message("❌ Seuls les staffs peuvent supprimer un ticket.", ephemeral=True) + return + await interaction.response.send_message("❌ Suppression du ticket...", ephemeral=True) + await interaction.channel.delete() + +class TicketView(discord.ui.View): + """Vue avec le bouton pour ouvrir le ticket""" + + def __init__(self): + super().__init__(timeout=None) + + @discord.ui.button(label="📑 Ouvrir un Ticket Whitelist", style=discord.ButtonStyle.red, custom_id="open_ticket") + async def open_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): + """Affiche le premier formulaire""" + await interaction.response.send_modal(TicketStep1()) + +class Ticket(commands.Cog): + """Commande pour envoyer l'embed de ticket""" + + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="ticket", description="Envoie l'embed pour ouvrir un ticket.") + async def ticket(self, interaction: discord.Interaction): + """Envoie l'embed avec le bouton d'ouverture de ticket""" + embed = discord.Embed( + title="📩 Ticket Whitelist", + description="Pour réaliser votre whitelist, ouvrez un ticket et remplissez le formulaire.", + color=0x00ff00 + ) + view = TicketView() + await interaction.channel.send(embed=embed, view=view) + await interaction.response.send_message("✅ Embed des tickets envoyé.", ephemeral=True) + + @commands.Cog.listener() + async def on_message(self, message): + """Surveille les messages des staffs dans les tickets""" + if message.guild is None or message.author.bot: + return + if not message.channel.topic or not message.channel.topic.startswith("Ticket de"): + return + + staff_role = discord.utils.get(message.guild.roles, id=STAFF_ROLE_ID) + if staff_role in message.author.roles and "validé" in message.content.lower(): + try: + user_id = message.channel.topic.split("Ticket de ")[1] + user = await message.guild.fetch_member(user_id) + + # Vérifier si le rôle "attente oral" est déjà attribué + attente_oral_role = discord.utils.get(message.guild.roles, id=ATTENTE_ORAL_ROLE_ID) + candidature_a_faire_role = discord.utils.get(message.guild.roles, id=CANDIDATURE_A_FAIRE_ROLE_ID) + citoyen_role = discord.utils.get(message.guild.roles, id=CITOYEN_ROLE_ID) + + if attente_oral_role in user.roles: + # Deuxième "validé" détecté + await user.remove_roles(attente_oral_role) + await user.add_roles(citoyen_role) + await message.channel.edit(name=f"{user.name}-citoyen") + else: + # Premier "validé" détecté + await user.remove_roles(candidature_a_faire_role) + await user.add_roles(attente_oral_role) + await message.channel.edit(name=f"{user.name}-oral") + + # Mettre à jour le pseudo du joueur si le bot a les permissions nécessaires + if message.guild.me.guild_permissions.manage_nicknames: + new_nickname = f"{self.step2_part1_data.prenom.value} {self.step2_part1_data.nom.value} | {self.step1_data.pseudo.value}" + if len(new_nickname) > 32: + new_nickname = new_nickname[:32] + await user.edit(nick=new_nickname) + else: + await message.channel.send("❌ Le bot n'a pas les permissions nécessaires pour modifier le pseudo.", delete_after=10) + + except Exception as e: + print(f"Erreur lors du renommage du ticket: {e}") + +async def setup(bot): + await bot.add_cog(Ticket(bot)) diff --git a/commandes/transactions.py b/commandes/transactions.py new file mode 100644 index 0000000..4fe7b9f --- /dev/null +++ b/commandes/transactions.py @@ -0,0 +1,67 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.banque_manager import BanqueManager + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier # ID du rôle des banquiers + +banque_manager = BanqueManager() + +class Transactions(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="transactions", description="Affiche les transactions d'un utilisateur (réservé aux banquiers).") + async def transactions(self, interaction: discord.Interaction, utilisateur: discord.Member): + """Affiche l'historique des transactions d'un utilisateur (banquiers uniquement).""" + + # ✅ Récupération du vrai membre pour avoir les rôles + member = interaction.guild.get_member(interaction.user.id) + if not member: + await interaction.response.send_message("❌ Impossible de vérifier vos permissions.", ephemeral=True) + return + + # ✅ Vérification du rôle banquier + if not any(role.id == BANQUIER_ROLE_ID for role in member.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission de voir les transactions.", ephemeral=True) + return + + banque_manager.load_data() + + user_id = str(utilisateur.id) + + # ✅ Vérification si l'utilisateur a des transactions + if user_id not in banque_manager.comptes or "transactions" not in banque_manager.comptes[user_id]: + await interaction.response.send_message(f"❌ {utilisateur.mention} n'a pas d'historique de transactions.", ephemeral=True) + return + + transactions = banque_manager.comptes[user_id].get("transactions", []) + + if not transactions: + await interaction.response.send_message(f"📜 {utilisateur.mention} n'a encore effectué aucune transaction.", ephemeral=True) + return + + # ✅ Création de l'embed + embed = discord.Embed( + title=f"📜 Historique des transactions de {utilisateur.name}", + color=discord.Color.gold() + ) + + for t in transactions[-10:]: + embed.add_field( + name=f"📅 {t['date']}", + value=( + f"**Type**: {t['type']}\n" + f"💰 **Montant**: {t['montant']}€\n" + f"📤 **Émetteur**: <@{t['emetteur']}>\n" + f"📥 **Destinataire**: <@{t['destinataire']}>" + ), + inline=False + ) + + embed.set_footer(text="Seules les 10 dernières transactions sont affichées.") + + await interaction.response.send_message(embed=embed) + +async def setup(bot): + await bot.add_cog(Transactions(bot)) diff --git a/commandes/valider_visite_médicale.py b/commandes/valider_visite_médicale.py new file mode 100644 index 0000000..882fdf7 --- /dev/null +++ b/commandes/valider_visite_médicale.py @@ -0,0 +1,77 @@ +import discord +from discord import app_commands +from discord.ext import commands, tasks +import json +from datetime import datetime, timedelta +import os + +EMS_ROLE_ID = 1278317212675084328 # Remplace par l’ID du rôle EMS # Remplace par l’ID du rôle EMS +ROLE_A_ATTRIBUER_ID = 1367198876548993045 # Remplace par l’ID du rôle visite médicale # Remplace par l’ID du rôle à attribuer +FICHIER_ROLES = "visite_médicale.json" + +class AttribuerRole(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.roles_temporaire = self.charger_roles() + self.verification_roles.start() + + def charger_roles(self): + if os.path.exists(FICHIER_ROLES): + with open(FICHIER_ROLES, "r", encoding="utf-8") as f: + return json.load(f) + return {} + + def sauvegarder_roles(self): + with open(FICHIER_ROLES, "w", encoding="utf-8") as f: + json.dump(self.roles_temporaire, f, indent=4, ensure_ascii=False) + + @app_commands.command(name="valider_visite_médicale", description="Attribue un rôle temporaire suite à une visite médicale (EMS uniquement).") + async def valider_visite(self, interaction: discord.Interaction, membre: discord.Member): + if not any(role.id == EMS_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Seuls les EMS peuvent utiliser cette commande.", ephemeral=True) + return + + role = interaction.guild.get_role(ROLE_A_ATTRIBUER_ID) + if not role: + await interaction.response.send_message("❌ Rôle à attribuer introuvable.", ephemeral=True) + return + + await membre.add_roles(role) + expiration = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d %H:%M:%S") + self.roles_temporaire[str(membre.id)] = { + "role_id": role.id, + "expiration": expiration + } + self.sauvegarder_roles() + + await interaction.response.send_message(f"✅ Rôle temporaire attribué à {membre.mention} jusqu'au {expiration}.", ephemeral=True) + + @tasks.loop(hours=1) + async def verification_roles(self): + now = datetime.now() + to_remove = [] + + for user_id, data in self.roles_temporaire.items(): + expiration = datetime.strptime(data["expiration"], "%Y-%m-%d %H:%M:%S") + if now >= expiration: + to_remove.append(user_id) + + for user_id in to_remove: + member = self.bot.get_user(int(user_id)) or await self.bot.fetch_user(int(user_id)) + guild = discord.utils.get(self.bot.guilds) + member = guild.get_member(int(user_id)) + role = guild.get_role(ROLE_A_ATTRIBUER_ID) + + if member and role: + await member.remove_roles(role) + del self.roles_temporaire[user_id] + + if to_remove: + self.sauvegarder_roles() + + @verification_roles.before_loop + async def before_verification(self): + await self.bot.wait_until_ready() + +async def setup(bot): + await bot.add_cog(AttribuerRole(bot)) diff --git a/commandes/virement.py b/commandes/virement.py new file mode 100644 index 0000000..0aef577 --- /dev/null +++ b/commandes/virement.py @@ -0,0 +1,138 @@ +import json +import discord +from discord import app_commands +from discord.ext import commands +from datetime import datetime + +class Virement(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement", description="Fait un virement bancaire à un autre membre via son RIB") + @app_commands.choices(banque=banque_choices) + @app_commands.describe(rib="Le RIB du destinataire", montant="Le montant à envoyer", banque="Banque d'où retirer l'argent") + async def virement(self, interaction: discord.Interaction, rib: str, montant: float, banque: app_commands.Choice[str]): + auteur_id = str(interaction.user.id) + banque_source = banque.value + + # Charger les comptes utilisateurs + with open('comptes_bancaires.json', 'r', encoding='utf-8') as f: + comptes = json.load(f) + + # Charger les comptes entreprises + with open('comptes_entreprises.json', 'r', encoding='utf-8') as f: + entreprises = json.load(f) + + # Vérifier que l'utilisateur a un compte dans cette banque + if banque_source not in comptes or auteur_id not in comptes[banque_source]: + await interaction.response.send_message(f"❌ Tu n'as pas de compte dans la banque **{banque_source}**.", ephemeral=True) + return + + compte_emetteur = comptes[banque_source][auteur_id] + if compte_emetteur["solde"] < montant: + await interaction.response.send_message("❌ Ton solde est insuffisant pour effectuer ce virement.", ephemeral=True) + return + + # Rechercher le destinataire (utilisateur ou entreprise) + destinataire_id = None + banque_destinataire = None + is_entreprise = False + + # Recherche dans comptes utilisateurs + for bq_name, bq_data in comptes.items(): + if isinstance(bq_data, dict): + for user_id, info in bq_data.items(): + if isinstance(info, dict) and info.get("rib") == rib: + destinataire_id = user_id + banque_destinataire = bq_name + break + if destinataire_id: + break + + # Sinon, recherche dans les entreprises + if not destinataire_id: + for bq_name, bq_data in entreprises.items(): + if isinstance(bq_data, dict): + for ent_id, info in bq_data.items(): + if isinstance(info, dict) and info.get("rib") == rib: + destinataire_id = ent_id + banque_destinataire = bq_name + is_entreprise = True + break + if destinataire_id: + break + + if not destinataire_id: + await interaction.response.send_message("❌ Aucun compte trouvé avec ce RIB.", ephemeral=True) + return + + # Appliquer la TVA si entreprise + montant_net = montant + tva_envoyee = 0 + if is_entreprise: + taux = entreprises[banque_destinataire][destinataire_id].get("tva", 0) + tva_envoyee = round(montant * taux / 100, 2) + montant_net = montant - tva_envoyee + + # Ajouter la TVA au Gouvernement + if "Gouvernement" not in entreprises: + entreprises["Gouvernement"] = {} + if "GOUV" not in entreprises["Gouvernement"]: + entreprises["Gouvernement"]["GOUV"] = { + "rib": "00000 00000 00000000000 00", + "solde": 0.0, + "transactions": [] + } + entreprises["Gouvernement"]["GOUV"]["solde"] += tva_envoyee + entreprises["Gouvernement"]["GOUV"]["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "TVA reçue", + "source": auteur_id, + "montant": tva_envoyee + }) + + # Déduire du compte émetteur + comptes[banque_source][auteur_id]["solde"] -= montant + comptes[banque_source][auteur_id]["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement", + "source": f"Vers RIB {rib}", + "montant": -montant + }) + + # Ajouter au compte destinataire + cible_data = entreprises if is_entreprise else comptes + cible_data[banque_destinataire][destinataire_id]["solde"] += montant_net + cible_data[banque_destinataire][destinataire_id]["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement reçu", + "source": interaction.user.name, + "montant": montant_net + }) + + # Sauvegarde + with open('comptes_bancaires.json', 'w', encoding='utf-8') as f: + json.dump(comptes, f, ensure_ascii=False, indent=4) + with open('comptes_entreprises.json', 'w', encoding='utf-8') as f: + json.dump(entreprises, f, ensure_ascii=False, indent=4) + + # Envoi MP au destinataire si c'est un utilisateur + if not is_entreprise: + try: + user_dest = await self.bot.fetch_user(int(destinataire_id)) + await user_dest.send(f"📥 Vous avez reçu un virement de **{montant:.2f}€** de la part de **{interaction.user.display_name}**.") + except: + pass # Si l'utilisateur a les MP désactivés + + await interaction.response.send_message( + f"✅ Virement de **{montant:.2f}€** effectué.{' TVA de ' + str(tva_envoyee) + '€ envoyée au Gouvernement.' if is_entreprise else ''}", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(Virement(bot)) \ No newline at end of file diff --git a/commandes/virement_banquier.py b/commandes/virement_banquier.py new file mode 100644 index 0000000..814bfca --- /dev/null +++ b/commandes/virement_banquier.py @@ -0,0 +1,86 @@ +import json +import discord +from discord import app_commands +from discord.ext import commands +from datetime import datetime + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier # À remplacer par l’ID réel du rôle banquier + +class VirementBanquier(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement_banquier", description="Effectue un virement au nom d'un client (réservé aux banquiers).") + @app_commands.choices(banque=banque_choices) + async def virement_banquier( + self, + interaction: discord.Interaction, + rib_emetteur: str, + montant: float, + rib_destinataire: str, + banque: app_commands.Choice[str] + ): + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission d'utiliser cette commande.", ephemeral=True) + return + + banque_nom = banque.value + + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + except: + await interaction.response.send_message("❌ Erreur de lecture des comptes bancaires.", ephemeral=True) + return + + # Trouver les ID à partir des RIB + emetteur_id = None + destinataire_id = None + + for user_id, data in comptes.get(banque_nom, {}).items(): + if data.get("rib") == rib_emetteur: + emetteur_id = user_id + if data.get("rib") == rib_destinataire: + destinataire_id = user_id + + if not emetteur_id: + await interaction.response.send_message("❌ Le RIB émetteur est introuvable dans cette banque.", ephemeral=True) + return + if not destinataire_id: + await interaction.response.send_message("❌ Le RIB destinataire est introuvable dans cette banque.", ephemeral=True) + return + + # Vérifier le solde + if comptes[banque_nom][emetteur_id]["solde"] < montant: + await interaction.response.send_message("❌ Le solde du compte émetteur est insuffisant.", ephemeral=True) + return + + # Exécuter le virement + comptes[banque_nom][emetteur_id]["solde"] -= montant + comptes[banque_nom][emetteur_id]["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement manuel (par banquier)", + "source": f"Vers RIB {rib_destinataire}", + "montant": -montant + }) + + comptes[banque_nom][destinataire_id]["solde"] += montant + comptes[banque_nom][destinataire_id]["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement reçu (par banquier)", + "source": f"RIB {rib_emetteur}", + "montant": montant + }) + + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes, f, ensure_ascii=False, indent=4) + + await interaction.response.send_message(f"✅ Virement de **{montant:.2f}€** effectué de **{rib_emetteur}** vers **{rib_destinataire}** dans **{banque_nom}**.", ephemeral=True) + +async def setup(bot): + await bot.add_cog(VirementBanquier(bot)) diff --git a/commandes/virement_banquier_entreprise.py b/commandes/virement_banquier_entreprise.py new file mode 100644 index 0000000..e0de763 --- /dev/null +++ b/commandes/virement_banquier_entreprise.py @@ -0,0 +1,122 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +BANQUIER_ROLE_ID = 1360314740567576616 # ID du rôle des banquiers # ID du rôle banquier # ID du rôle des banquiers + +class VirementBanquierEntreprise(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banques = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank") + ] + + @app_commands.command(name="virement_banquier_entreprise", description="Fait un virement depuis une entreprise avec mot de passe (réservé aux banquiers).") + @app_commands.choices(banque=banques) + async def virement_banquier_entreprise( + self, + interaction: discord.Interaction, + banque: app_commands.Choice[str], + nom_entreprise: str, + mot_de_passe: str, + rib_destinataire: str, + montant: float + ): + if not any(role.id == BANQUIER_ROLE_ID for role in interaction.user.roles): + await interaction.response.send_message("❌ Vous n'avez pas la permission de faire cette commande.", ephemeral=True) + return + + banque_nom = banque.value + + # Chargement des fichiers + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + entreprises = json.load(f) + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + particuliers = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur de lecture des fichiers JSON.", ephemeral=True) + return + + # Vérification de l'entreprise + if banque_nom not in entreprises or nom_entreprise not in entreprises[banque_nom]: + await interaction.response.send_message("❌ Compte entreprise introuvable.", ephemeral=True) + return + + compte_entreprise = entreprises[banque_nom][nom_entreprise] + + if compte_entreprise.get("mdp") != mot_de_passe: + await interaction.response.send_message("❌ Mot de passe incorrect.", ephemeral=True) + return + + if compte_entreprise["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant pour ce virement.", ephemeral=True) + return + + # Recherche du compte destinataire (entreprise ou particulier) + destinataire_id = None + banque_destinataire = None + is_entreprise = False + + # Recherche dans entreprises + for bq, entreprises_data in entreprises.items(): + for nom, infos in entreprises_data.items(): + if infos.get("rib") == rib_destinataire: + destinataire_id = nom + banque_destinataire = bq + is_entreprise = True + break + if destinataire_id: + break + + # Sinon, recherche dans particuliers + if not destinataire_id: + for bq, clients in particuliers.items(): + for user_id, infos in clients.items(): + if infos.get("rib") == rib_destinataire: + destinataire_id = user_id + banque_destinataire = bq + is_entreprise = False + break + if destinataire_id: + break + + if not destinataire_id: + await interaction.response.send_message("❌ RIB destinataire introuvable.", ephemeral=True) + return + + # Retrait du montant + compte_entreprise["solde"] -= montant + compte_entreprise["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement", + "source": f"Entreprise {nom_entreprise}", + "montant": -montant, + "destinataire": rib_destinataire + }) + + # Créditer le destinataire + compte_cible = entreprises if is_entreprise else particuliers + compte_data = compte_cible[banque_destinataire][destinataire_id] + compte_data["solde"] += montant + compte_data["transactions"].append({ + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": "Virement reçu", + "source": nom_entreprise, + "montant": montant + }) + + # Sauvegarde + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(entreprises, f, ensure_ascii=False, indent=4) + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(particuliers, f, ensure_ascii=False, indent=4) + + await interaction.response.send_message(f"✅ Virement de **{montant:.2f}€** effectué depuis **{nom_entreprise}** vers **{rib_destinataire}**.") + +async def setup(bot): + await bot.add_cog(VirementBanquierEntreprise(bot)) diff --git a/commandes/virement_entreprise.py b/commandes/virement_entreprise.py new file mode 100644 index 0000000..f156633 --- /dev/null +++ b/commandes/virement_entreprise.py @@ -0,0 +1,149 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +class VirementEntreprise(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement_entreprise", description="Effectuer un virement depuis une entreprise vers un RIB.") + @app_commands.choices(banque=banque_choices) + async def virement_entreprise( + self, + interaction: discord.Interaction, + rib_entreprise: str, + montant: float, + mot_de_passe: str, + rib_destinataire: str, + banque: app_commands.Choice[str] + ): + banque_nom = banque.value + + # Chargement des données + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + comptes_entreprises = json.load(f) + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes_bancaires = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur de lecture des données bancaires.", ephemeral=True) + return + + # 🔐 Vérification de l'émetteur + entreprise_id = None + for nom_entreprise, infos in comptes_entreprises.get(banque_nom, {}).items(): + if infos.get("rib") == rib_entreprise: + if infos.get("mdp") != mot_de_passe: + await interaction.response.send_message("❌ Mot de passe incorrect.", ephemeral=True) + return + entreprise_id = nom_entreprise + break + + if not entreprise_id: + await interaction.response.send_message("❌ Aucun compte entreprise trouvé avec ce RIB.", ephemeral=True) + return + + compte_emetteur = comptes_entreprises[banque_nom][entreprise_id] + + if compte_emetteur["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant.", ephemeral=True) + return + + # 🔎 Recherche du destinataire + destinataire_data = None + destinataire_type = None + destinataire_nom = None + banque_dest = None + + for banque_cible, comptes in comptes_entreprises.items(): + for nom, infos in comptes.items(): + if infos.get("rib") == rib_destinataire: + destinataire_data = infos + destinataire_type = "entreprise" + destinataire_nom = nom + banque_dest = banque_cible + break + if destinataire_data: + break + + if not destinataire_data: + for banque_cible, comptes in comptes_bancaires.items(): + for uid, infos in comptes.items(): + if infos.get("rib") == rib_destinataire: + destinataire_data = infos + destinataire_type = "particulier" + destinataire_nom = uid + banque_dest = banque_cible + break + if destinataire_data: + break + + if not destinataire_data: + await interaction.response.send_message("❌ RIB destinataire introuvable.", ephemeral=True) + return + + # 📉 Débit du compte entreprise + compte_emetteur["solde"] -= montant + now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") + compte_emetteur.setdefault("transactions", []).append({ + "date": now, + "type": "Virement", + "source": f"Vers RIB {rib_destinataire}", + "montant": -montant + }) + + # 📈 Crédit du destinataire (avec TVA si entreprise) + montant_net = montant + tva_envoyee = 0 + + if destinataire_type == "entreprise": + tva = destinataire_data.get("tva", 0) + tva_envoyee = round(montant * tva / 100, 2) + montant_net = montant - tva_envoyee + + # Crédit TVA à l'État + if "Gouvernement" not in comptes_entreprises: + comptes_entreprises["Gouvernement"] = {} + if "GOUV" not in comptes_entreprises["Gouvernement"]: + comptes_entreprises["Gouvernement"]["GOUV"] = { + "rib": "00000 00000 00000000000 00", + "solde": 0.0, + "transactions": [] + } + + comptes_entreprises["Gouvernement"]["GOUV"]["solde"] += tva_envoyee + comptes_entreprises["Gouvernement"]["GOUV"]["transactions"].append({ + "date": now, + "type": "TVA reçue", + "source": entreprise_id, + "montant": tva_envoyee + }) + + destinataire_data["solde"] += montant_net + destinataire_data.setdefault("transactions", []).append({ + "date": now, + "type": "Virement reçu", + "source": entreprise_id, + "montant": montant_net + }) + + # Sauvegardes + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(comptes_entreprises, f, ensure_ascii=False, indent=4) + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes_bancaires, f, ensure_ascii=False, indent=4) + + await interaction.response.send_message( + f"✅ Virement effectué avec succès.{' TVA de ' + str(tva_envoyee) + '€ envoyée au Gouvernement.' if tva_envoyee else ''}", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(VirementEntreprise(bot)) diff --git a/commandes/virement_fbm.py b/commandes/virement_fbm.py new file mode 100644 index 0000000..dbef678 --- /dev/null +++ b/commandes/virement_fbm.py @@ -0,0 +1,97 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +class VirementFBM(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement_fbm", description="Fait un virement au compte indépendant FBM.") + @app_commands.choices(banque=banque_choices) + @app_commands.describe(montant="Montant à transférer", banque="Banque à utiliser") + async def virement_fbm(self, interaction: discord.Interaction, montant: float, banque: app_commands.Choice[str]): + auteur_id = str(interaction.user.id) + banque_nom = banque.value + + if montant <= 0: + await interaction.response.send_message("❌ Le montant doit être supérieur à 0.", ephemeral=True) + return + + # Charger les fichiers + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur lors de la lecture des comptes bancaires.", ephemeral=True) + return + + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + entreprises = json.load(f) + except: + entreprises = {} + + # Vérification du compte de l'utilisateur + if banque_nom not in comptes or auteur_id not in comptes[banque_nom]: + await interaction.response.send_message("❌ Tu n'as pas de compte dans cette banque.", ephemeral=True) + return + + compte = comptes[banque_nom][auteur_id] + if compte["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant pour effectuer le virement.", ephemeral=True) + return + + # Initialiser FBM si nécessaire + if "fbm" not in entreprises: + entreprises["fbm"] = {} + if "FBM" not in entreprises["fbm"]: + entreprises["fbm"]["FBM"] = { + "rib": "00000 00000 00000000000 03", + "solde": 0.0, + "transactions": [] + } + + now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") + + # Mise à jour des soldes + compte["solde"] -= montant + entreprises["fbm"]["FBM"]["solde"] += montant + + # Historique utilisateur + compte["transactions"].append({ + "date": now, + "type": "Virement", + "source": f"Vers FBM", + "montant": -montant + }) + + # Historique FBM + entreprises["fbm"]["FBM"]["transactions"].append({ + "date": now, + "type": "Virement reçu", + "source": interaction.user.name, + "montant": montant + }) + + # Sauvegarde + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes, f, indent=4, ensure_ascii=False) + + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(entreprises, f, indent=4, ensure_ascii=False) + + # Confirmation + await interaction.response.send_message( + f"✅ Virement de **{montant:.2f}€** envoyé au compte **FBM** depuis **{banque_nom}**.", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(VirementFBM(bot)) diff --git a/commandes/virement_gouvernement.py b/commandes/virement_gouvernement.py new file mode 100644 index 0000000..9ee1015 --- /dev/null +++ b/commandes/virement_gouvernement.py @@ -0,0 +1,86 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +class VirementGouvernement(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement_gouvernement", description="Effectue un virement au Gouvernement.") + @app_commands.choices(banque=banque_choices) + @app_commands.describe(montant="Le montant à envoyer", banque="Banque à utiliser pour le virement") + async def virement_gouvernement(self, interaction: discord.Interaction, montant: float, banque: app_commands.Choice[str]): + auteur_id = str(interaction.user.id) + banque_source = banque.value + + if montant <= 0: + await interaction.response.send_message("❌ Le montant doit être supérieur à zéro.", ephemeral=True) + return + + # Charger les fichiers + try: + with open('comptes_bancaires.json', 'r', encoding='utf-8') as f: + comptes = json.load(f) + with open('comptes_entreprises.json', 'r', encoding='utf-8') as f: + entreprises = json.load(f) + except Exception as e: + await interaction.response.send_message(f"❌ Erreur de lecture des fichiers : {e}", ephemeral=True) + return + + if banque_source not in comptes or auteur_id not in comptes[banque_source]: + await interaction.response.send_message(f"❌ Tu n'as pas de compte dans la banque **{banque_source}**.", ephemeral=True) + return + + compte_user = comptes[banque_source][auteur_id] + if compte_user["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant pour effectuer ce virement.", ephemeral=True) + return + + # Vérifier ou créer le compte Gouvernement + if "Gouvernement" not in entreprises: + entreprises["Gouvernement"] = {} + if "GOUV" not in entreprises["Gouvernement"]: + entreprises["Gouvernement"]["GOUV"] = { + "rib": "00000 00000 00000000000 00", + "solde": 0.0, + "transactions": [] + } + + # Effectuer le virement + now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") + compte_user["solde"] -= montant + entreprises["Gouvernement"]["GOUV"]["solde"] += montant + + compte_user["transactions"].append({ + "date": now, + "type": "Virement", + "source": f"Vers Gouvernement", + "montant": -montant + }) + entreprises["Gouvernement"]["GOUV"]["transactions"].append({ + "date": now, + "type": "Virement reçu", + "source": interaction.user.name, + "montant": montant + }) + + # Sauvegarde + with open('comptes_bancaires.json', 'w', encoding='utf-8') as f: + json.dump(comptes, f, indent=4, ensure_ascii=False) + with open('comptes_entreprises.json', 'w', encoding='utf-8') as f: + json.dump(entreprises, f, indent=4, ensure_ascii=False) + + await interaction.response.send_message( + f"✅ Virement de **{montant:.2f}€** envoyé au Gouvernement avec succès.", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(VirementGouvernement(bot)) \ No newline at end of file diff --git a/commandes/virement_ursaff.py b/commandes/virement_ursaff.py new file mode 100644 index 0000000..84dbe51 --- /dev/null +++ b/commandes/virement_ursaff.py @@ -0,0 +1,93 @@ +import discord +from discord import app_commands +from discord.ext import commands +import json +from datetime import datetime + +class VirementUrssaf(commands.Cog): + def __init__(self, bot): + self.bot = bot + + banque_choices = [ + app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"), + app_commands.Choice(name="NGC Bank", value="NGC Bank"), + ] + + @app_commands.command(name="virement_ursaff", description="Fait un virement vers le compte indépendant URSAFF.") + @app_commands.choices(banque=banque_choices) + @app_commands.describe(montant="Montant à transférer", banque="Banque à utiliser") + async def virement_ursaff(self, interaction: discord.Interaction, montant: float, banque: app_commands.Choice[str]): + auteur_id = str(interaction.user.id) + banque_nom = banque.value + + if montant <= 0: + await interaction.response.send_message("❌ Le montant doit être supérieur à 0.", ephemeral=True) + return + + try: + with open("comptes_bancaires.json", "r", encoding="utf-8") as f: + comptes = json.load(f) + except Exception: + await interaction.response.send_message("❌ Erreur lors de la lecture des comptes bancaires.", ephemeral=True) + return + + try: + with open("comptes_entreprises.json", "r", encoding="utf-8") as f: + entreprises = json.load(f) + except: + entreprises = {} + + if banque_nom not in comptes or auteur_id not in comptes[banque_nom]: + await interaction.response.send_message("❌ Tu n'as pas de compte dans cette banque.", ephemeral=True) + return + + compte = comptes[banque_nom][auteur_id] + if compte["solde"] < montant: + await interaction.response.send_message("❌ Solde insuffisant pour effectuer le virement.", ephemeral=True) + return + + # Initialiser URSAFF si nécessaire + if "ursaff" not in entreprises: + entreprises["ursaff"] = {} + if "URSAFF" not in entreprises["ursaff"]: + entreprises["ursaff"]["URSAFF"] = { + "rib": "00000 00000 00000000000 02", + "solde": 0.0, + "transactions": [] + } + + now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") + + # Mise à jour des soldes + compte["solde"] -= montant + entreprises["ursaff"]["URSAFF"]["solde"] += montant + + # Historique utilisateur + compte["transactions"].append({ + "date": now, + "type": "Virement", + "source": "Vers URSAFF", + "montant": -montant + }) + + # Historique URSAFF + entreprises["ursaff"]["URSAFF"]["transactions"].append({ + "date": now, + "type": "Virement reçu", + "source": interaction.user.name, + "montant": montant + }) + + # Sauvegarde + with open("comptes_bancaires.json", "w", encoding="utf-8") as f: + json.dump(comptes, f, indent=4, ensure_ascii=False) + with open("comptes_entreprises.json", "w", encoding="utf-8") as f: + json.dump(entreprises, f, indent=4, ensure_ascii=False) + + await interaction.response.send_message( + f"✅ Virement de **{montant:.2f}€** envoyé au compte **URSAFF** depuis **{banque_nom}**.", + ephemeral=True + ) + +async def setup(bot): + await bot.add_cog(VirementUrssaf(bot)) diff --git a/commandes/voir_carte_identite.py b/commandes/voir_carte_identite.py new file mode 100644 index 0000000..986885f --- /dev/null +++ b/commandes/voir_carte_identite.py @@ -0,0 +1,65 @@ +import discord +from discord import app_commands +from discord.ext import commands +from utils.data_manager import DataManager +from utils.card_generator import CardGenerator + +card_generator = CardGenerator() + +class VoirIdentite(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="voir_carte_identite", description="Afficher votre carte d'identité ou celle d'un autre utilisateur") + async def voir_carte_identite(self, interaction: discord.Interaction, utilisateur: discord.Member = None): + """Affiche la carte d'identité d'un utilisateur""" + + # Remplacer par l'ID de ton rôle gouvernement + GOUVERNEMENT_ROLE_ID = 1360236421872484403 + + target_user = utilisateur or interaction.user + + # 🔒 Vérification si l'utilisateur peut voir la carte d'un autre + if utilisateur and utilisateur != interaction.user: + gouvernement_role = interaction.guild.get_role(GOUVERNEMENT_ROLE_ID) + if gouvernement_role not in interaction.user.roles: + await interaction.response.send_message( + "🚫 Vous n'avez pas l'autorisation de voir la carte d'identité d'un autre utilisateur.", + ephemeral=True + ) + return + + user_id = str(target_user.id) + + # 🧠 Recréer un DataManager à chaque commande + data_manager = DataManager() + + # 🔎 Récupération des données + identity_data = data_manager.identities.get(user_id) + + if identity_data is None: + await interaction.response.send_message( + "❌ Cet utilisateur ne possède pas de carte d'identité.", + ephemeral=True + ) + return + + # 🛡️ Vérification que l'identité est complète + if "date_expiration" not in identity_data: + identity_data["date_expiration"] = "Non spécifiée" + + # 🖼️ Génération de l'image de la carte + card_buffer = await card_generator.create_identity_card(target_user, identity_data) + + # 📩 Envoi du fichier + embed + file = discord.File(card_buffer, filename="carte_identite.png") + embed = discord.Embed( + title=f"🪪 Carte d'identité de {target_user.display_name}", + color=0x2ecc71 + ) + embed.set_image(url="attachment://carte_identite.png") + + await interaction.response.send_message(file=file, embed=embed, ephemeral=False) + +async def setup(bot): + await bot.add_cog(VoirIdentite(bot)) diff --git a/commandes/welcome_message.py b/commandes/welcome_message.py new file mode 100644 index 0000000..c3d6d62 --- /dev/null +++ b/commandes/welcome_message.py @@ -0,0 +1,30 @@ +import discord +from discord.ext import commands +from utils.logger import log_info, log_error + +class WelcomeMessage(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_member_join(self, member): + try: + # ID du salon discussion + welcome_channel_id = 1278483527783944242 + welcome_channel = member.guild.get_channel(welcome_channel_id) + + if welcome_channel: + welcome_message = ( + f"## BIENVENUE <:panda_welcome:1297298999849517056> !\n\n" + f"> **L'équipe staff te souhaite la bienvenue sur Victoria's Vice {member.mention} !**\n\n" + f"> Pour ta candidature <:arrow_1:1297491509201080362> <#1278477608392196176> / <#1278477152215371806> \n\n" + f"> Si tu as des questions <:arrow_1:1297491509201080362> <#1279037583820718120>\n\n" + f"*> Bien cordialement, L'équipe staff de Victoria's Vice*" + ) + + await welcome_channel.send(welcome_message) + except Exception as e: + print(f"Erreur lors de l'envoi du message de bienvenue: {e}") + +async def setup(bot): + await bot.add_cog(WelcomeMessage(bot)) diff --git a/comptes_bancaires.json b/comptes_bancaires.json new file mode 100644 index 0000000..217bebc --- /dev/null +++ b/comptes_bancaires.json @@ -0,0 +1,2111 @@ +{ + "NGC Bank": { + "353942721997832195": { + "rib": "36495 80083 39542816185 27", + "solde": 4970.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 3500.0, + "emetteur": 353942721997832195, + "destinataire": 353942721997832195 + }, + { + "date": "26/04/2025 14:03:26", + "type": "Virement", + "source": "Vers RIB 97593 41945 69675546643 66", + "montant": -3400.0 + }, + { + "date": "26/04/2025 14:03:32", + "type": "Virement", + "source": "Vers RIB 97593 41945 69675546643 66", + "montant": -100.0 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 36000.0, + "emetteur": 353942721997832195, + "destinataire": 353942721997832195 + }, + { + "date": "04/05/2025 13:33:43", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -650.0 + }, + { + "date": "05/05/2025 16:09:39", + "type": "Virement", + "source": "Vers RIB 96241 34733 44548 77079", + "montant": -2000.0 + }, + { + "date": "23/05/2025 18:39:25", + "type": "Dépôt", + "source": "Banque", + "montant": 36000.0, + "emetteur": 353942721997832195, + "destinataire": "353942721997832195" + }, + { + "date": "23/05/2025 20:04:57", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 3501.0 + }, + { + "date": "05/06/2025 15:33:55", + "type": "Virement", + "source": "Vers RIB 97593 41945 69675546643 66", + "montant": -72851.0 + }, + { + "date": "05/06/2025 20:47:43", + "type": "Dépôt", + "source": "Banque", + "montant": 13500.0, + "emetteur": 353942721997832195, + "destinataire": "353942721997832195" + }, + { + "date": "05/06/2025 20:49:10", + "type": "Virement", + "source": "Vers RIB 97593 41945 69675546643 66", + "montant": -13500.0 + } + ] + }, + "942073262333112351": { + "rib": "26384 93370 75890178377 91", + "solde": 5000.0, + "transactions": [] + }, + "971446412690722826": { + "rib": "22144 59424 87742058459 72", + "solde": 15948.8, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 3450.0, + "emetteur": 353942721997832195, + "destinataire": 971446412690722826 + }, + { + "date": "04/05/2025 14:43:10", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "971446412690722826" + }, + { + "date": "04/05/2025 16:49:40", + "type": "Virement", + "source": "Vers RIB 10009 40554 56452790470 78", + "montant": -0.1 + }, + { + "date": "04/05/2025 16:51:20", + "type": "Virement", + "source": "Vers RIB 68229 13765 90163 35585", + "montant": -0.1 + }, + { + "date": "07/05/2025 19:45:13", + "type": "Virement", + "source": "Vers Gouvernement", + "montant": -1.0 + }, + { + "date": "23/05/2025 18:36:09", + "type": "Dépôt", + "source": "Banque", + "montant": 4500.0, + "emetteur": 353942721997832195, + "destinataire": "971446412690722826" + } + ] + }, + "1200313720195264613": { + "rib": "85047 60626 80894743346 94", + "solde": 0.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 3990.0, + "emetteur": 353942721997832195, + "destinataire": 1200313720195264613 + }, + { + "date": "21/04/2025 15:05:29", + "type": "Virement", + "source": "Vers RIB 15563 69899 51361446295 84", + "montant": -390.0 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 32000.0, + "emetteur": 353942721997832195, + "destinataire": 1200313720195264613 + }, + { + "date": "03/05/2025 17:09:30", + "type": "Virement", + "source": "Vers RIB 76644 32901 90493249064 16", + "montant": -32000.0 + }, + { + "date": "04/05/2025 08:32:17", + "type": "Dépôt", + "source": "Banque", + "montant": 45000.0, + "emetteur": 534003230435442690, + "destinataire": "1200313720195264613" + }, + { + "date": "04/05/2025 09:49:49", + "type": "Virement", + "source": "Vers RIB 76644 32901 90493249064 16", + "montant": -45000.0 + }, + { + "date": "09/05/2025 17:20:17", + "type": "Dépôt", + "source": "Banque", + "montant": 8000.0, + "emetteur": 353942721997832195, + "destinataire": "1200313720195264613" + }, + { + "date": "09/05/2025 17:23:13", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -390.0 + }, + { + "date": "09/05/2025 19:09:30", + "type": "Retrait", + "source": "Banque", + "montant": -5000.0, + "emetteur": 534003230435442690, + "destinataire": "1200313720195264613" + }, + { + "date": "19/05/2025 11:55:01", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -390.0 + }, + { + "date": "03/06/2025 17:38:01", + "type": "Virement", + "source": "Vers RIB 85047 60626 80894743346 94", + "montant": -2220.0 + }, + { + "date": "03/06/2025 17:38:01", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 2220.0 + }, + { + "date": "03/06/2025 17:39:36", + "type": "Virement", + "source": "Vers RIB 24756 54403 68357307735 95", + "montant": -2220.0 + } + ] + }, + "1361493382911758528": { + "rib": "28777 24580 29765721710 42", + "solde": 5000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1361493382911758528 + } + ] + }, + "1096453463849828362": { + "rib": "24483 98056 61791340797 80", + "solde": 5400.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5150.0, + "emetteur": 353942721997832195, + "destinataire": 1096453463849828362 + }, + { + "date": "03/05/2025 15:54:14", + "type": "Dépôt", + "source": "Banque", + "montant": 250.0, + "emetteur": 534003230435442690, + "destinataire": "1096453463849828362" + } + ] + }, + "534003230435442690": { + "rib": "10009 40554 56452790470 78", + "solde": 11556.989999999998, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 353942721997832195, + "destinataire": 534003230435442690 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1000.0, + "emetteur": 534003230435442690, + "destinataire": 534003230435442690 + }, + { + "date": "26/04/2025 15:55:13", + "type": "Virement", + "source": "Vers RIB 11940 73588 95258 04768", + "montant": -1.0 + }, + { + "date": "26/04/2025 17:24:15", + "type": "Virement", + "source": "Vers RIB 87681 15340 34475481972 89", + "montant": -0.1 + }, + { + "date": "26/04/2025 17:26:37", + "type": "Virement reçu", + "source": "sz94d", + "montant": 10.0 + }, + { + "date": "27/04/2025 10:21:57", + "type": "Virement", + "source": "Vers RIB 00000 00000 00000000000 00", + "montant": -0.01 + }, + { + "date": "27/04/2025 13:34:55", + "type": "Virement", + "source": "Vers RIB 11940 73588 95258 04768", + "montant": -1.0 + }, + { + "date": "27/04/2025 14:01:32", + "type": "Virement", + "source": "Vers RIB 11940 73588 95258 04768", + "montant": -1.0 + }, + { + "date": "03/05/2025 15:37:30", + "type": "Dépôt", + "source": "Banque", + "montant": 62500.0, + "emetteur": 534003230435442690, + "destinataire": "534003230435442690" + }, + { + "date": "03/05/2025 17:39:12", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -62500.0 + }, + { + "date": "04/05/2025 14:12:44", + "type": "Retrait", + "source": "Banque", + "montant": -20.0, + "emetteur": 534003230435442690, + "destinataire": "534003230435442690" + }, + { + "date": "04/05/2025 14:28:36", + "type": "Retrait", + "source": "Banque", + "montant": -70.0, + "emetteur": 534003230435442690, + "destinataire": "534003230435442690" + }, + { + "date": "04/05/2025 16:49:40", + "type": "Virement reçu", + "source": "gameurpro12", + "montant": 0.1 + }, + { + "date": "05/05/2025 16:02:28", + "type": "Virement", + "source": "Vers RIB 22128 86524 35982837421 58", + "montant": -0.1 + }, + { + "date": "05/05/2025 16:08:51", + "type": "Virement reçu", + "source": "docteur_w.d_axolotl", + "montant": 0.1 + }, + { + "date": "04/06/2025 16:27:22", + "type": "Dépôt", + "source": "Banque", + "montant": 45000.0, + "emetteur": 534003230435442690, + "destinataire": "534003230435442690" + }, + { + "date": "04/06/2025 16:28:42", + "type": "Retrait", + "source": "Banque", + "montant": -36000.0, + "emetteur": 534003230435442690, + "destinataire": "534003230435442690" + } + ] + }, + "376796341071773706": { + "rib": "76644 32901 90493249064 16", + "solde": 219751.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 376796341071773706 + }, + { + "date": "03/05/2025 17:09:30", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 32000.0 + }, + { + "date": "03/05/2025 17:11:51", + "type": "Virement reçu", + "source": ".1all_might1.", + "montant": 28751.0 + }, + { + "date": "03/05/2025 17:12:58", + "type": "Virement reçu", + "source": "vaasbey", + "montant": 30000.0 + }, + { + "date": "04/05/2025 09:49:49", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 45000.0 + }, + { + "date": "04/05/2025 15:18:00", + "type": "Retrait", + "source": "Banque", + "montant": -4000.0, + "emetteur": 534003230435442690, + "destinataire": "376796341071773706" + }, + { + "date": "11/05/2025 09:52:08", + "type": "Virement reçu", + "source": "neyzizz", + "montant": 140000.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -12000.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -12000.0 + }, + { + "date": "29/05/2025 13:51:53", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -30000.0 + }, + { + "date": "29/05/2025 13:58:09", + "type": "Virement", + "source": "Vers RIB 41884 29541 59229304698 34", + "montant": -3000.0 + } + ] + }, + "449424004663607307": { + "rib": "15563 69899 51361446295 84", + "solde": 4800.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 449424004663607307 + }, + { + "date": "21/04/2025 15:05:29", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 390.0 + } + ] + }, + "828239898975666216": { + "rib": "22128 86524 35982837421 58", + "solde": 0.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 828239898975666216 + }, + { + "date": "05/05/2025 16:02:28", + "type": "Virement reçu", + "source": "nixfix06", + "montant": 0.1 + }, + { + "date": "05/05/2025 16:08:51", + "type": "Virement", + "source": "Vers RIB 10009 40554 56452790470 78", + "montant": -0.1 + }, + { + "date": "05/05/2025 16:15:05", + "type": "Virement reçu", + "source": "lagrenouillebeka", + "montant": 500.0 + }, + { + "date": "05/05/2025 16:23:40", + "type": "Virement", + "source": "Vers RIB 93884 11674 79519 40904", + "montant": -500.0 + } + ] + }, + "946068504023556186": { + "rib": "55868 11389 89049343014 38", + "solde": 1300.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4700.0, + "emetteur": 353942721997832195, + "destinataire": 946068504023556186 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 24000.0, + "emetteur": 353942721997832195, + "destinataire": 946068504023556186 + }, + { + "date": "03/05/2025 15:22:24", + "type": "Dépôt", + "source": "Banque", + "montant": 1648.0, + "emetteur": 534003230435442690, + "destinataire": "946068504023556186" + }, + { + "date": "03/05/2025 17:11:51", + "type": "Virement", + "source": "Vers RIB 76644 32901 90493249064 16", + "montant": -28751.0 + }, + { + "date": "17/05/2025 16:46:12", + "type": "Virement reçu", + "source": "leandro_6548.", + "montant": 1300.0 + } + ] + }, + "1069386396764221450": { + "rib": "93266 82343 74845298309 22", + "solde": 31250.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4500.0, + "emetteur": 353942721997832195, + "destinataire": 1069386396764221450 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 10000.0, + "emetteur": 353942721997832195, + "destinataire": 1069386396764221450 + }, + { + "date": "08/05/2025 15:49:41", + "type": "Dépôt", + "source": "Banque", + "montant": 6000.0, + "emetteur": 353942721997832195, + "destinataire": "1069386396764221450" + }, + { + "date": "05/06/2025 20:44:23", + "type": "Dépôt", + "source": "Banque", + "montant": 11250.0, + "emetteur": 353942721997832195, + "destinataire": "1069386396764221450" + }, + { + "date": "25/06/2025 16:01:31", + "type": "Retrait", + "source": "Banque", + "montant": -500.0, + "emetteur": 906574786308734986, + "destinataire": "1069386396764221450" + } + ] + }, + "828923448453103637": { + "rib": "10234 24218 10477731114 78", + "solde": 34000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 828923448453103637 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 20000.0, + "emetteur": 353942721997832195, + "destinataire": 828923448453103637 + }, + { + "date": "05/06/2025 20:45:18", + "type": "Dépôt", + "source": "Banque", + "montant": 9000.0, + "emetteur": 353942721997832195, + "destinataire": "828923448453103637" + } + ] + }, + "1311384140905709578": { + "rib": "50970 51336 33017058086 50", + "solde": 5000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1311384140905709578 + } + ] + }, + "1126995714552111215": { + "rib": "87292 81104 84784268868 12", + "solde": 0.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1126995714552111215 + }, + { + "date": "21/04/2025 20:59:04", + "type": "Virement reçu", + "source": "neyzizz", + "montant": 120.0 + }, + { + "date": "03/05/2025 15:12:32", + "type": "Dépôt", + "source": "Banque", + "montant": 2075.0, + "emetteur": 534003230435442690, + "destinataire": "1126995714552111215" + }, + { + "date": "03/05/2025 17:19:15", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -102.0 + }, + { + "date": "18/05/2025 15:17:43", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -12000.0 + }, + { + "date": "18/05/2025 15:24:40", + "type": "Retrait", + "source": "Banque", + "montant": -3000.0, + "emetteur": 534003230435442690, + "destinataire": "1126995714552111215" + }, + { + "date": "18/05/2025 16:06:44", + "type": "Virement reçu", + "source": "tricks212_zz", + "montant": 17575.0 + }, + { + "date": "23/05/2025 19:27:39", + "type": "Virement", + "source": "Vers RIB 73834 54818 11833486819 17", + "montant": -17575.0 + } + ] + }, + "642831860409565225": { + "rib": "51229 80290 86979675797 93", + "solde": 4000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4000.0, + "emetteur": 353942721997832195, + "destinataire": 642831860409565225 + } + ] + }, + "914118793918312480": { + "rib": "28794 77878 41312953164 71", + "solde": 17690.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4000.0, + "emetteur": 353942721997832195, + "destinataire": 914118793918312480 + }, + { + "date": "21/04/2025 20:59:04", + "type": "Virement", + "source": "Vers RIB 87292 81104 84784268868 12", + "montant": -120.0 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 26000.0, + "emetteur": 353942721997832195, + "destinataire": 914118793918312480 + }, + { + "date": "01/05/2025 08:56:08", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -260.0 + }, + { + "date": "10/05/2025 20:01:32", + "type": "Dépôt", + "source": "Banque", + "montant": 120000.0, + "emetteur": 534003230435442690, + "destinataire": "914118793918312480" + }, + { + "date": "11/05/2025 09:52:08", + "type": "Virement", + "source": "Vers RIB 76644 32901 90493249064 16", + "montant": -140000.0 + }, + { + "date": "23/05/2025 18:33:43", + "type": "Dépôt", + "source": "Banque", + "montant": 9750.0, + "emetteur": 353942721997832195, + "destinataire": "914118793918312480" + } + ] + }, + "1351957361333370932": { + "rib": "78740 15751 70195185799 30", + "solde": 7250.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1351957361333370932 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 2250.0, + "emetteur": 353942721997832195, + "destinataire": 1351957361333370932 + } + ] + }, + "1018567127269122058": { + "rib": "92871 52823 19649316403 70", + "solde": 5000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1018567127269122058 + } + ] + }, + "1108087282692522105": { + "rib": "73834 54818 11833486819 17", + "solde": 17575.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4500.0, + "emetteur": 353942721997832195, + "destinataire": 1108087282692522105 + }, + { + "date": "28/04/2025 08:53:44", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -425.0 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 12000.0, + "emetteur": 353942721997832195, + "destinataire": 1108087282692522105 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1500.0, + "emetteur": 353942721997832195, + "destinataire": 1108087282692522105 + }, + { + "date": "18/05/2025 16:06:44", + "type": "Virement", + "source": "Vers RIB 87292 81104 84784268868 12", + "montant": -17575.0 + }, + { + "date": "23/05/2025 18:34:44", + "type": "Dépôt", + "source": "Banque", + "montant": 6000.0, + "emetteur": 353942721997832195, + "destinataire": "1108087282692522105" + }, + { + "date": "23/05/2025 18:35:15", + "type": "Retrait", + "source": "Banque", + "montant": -2000.0, + "emetteur": 353942721997832195, + "destinataire": "1108087282692522105" + }, + { + "date": "23/05/2025 19:27:39", + "type": "Virement reçu", + "source": "jl_wesley.f1", + "montant": 17575.0 + }, + { + "date": "22/06/2025 13:32:09", + "type": "Retrait", + "source": "Banque", + "montant": -4000.0, + "emetteur": 534003230435442690, + "destinataire": "1108087282692522105" + } + ] + }, + "501080933282218005": { + "rib": "24193 46448 36423591130 82", + "solde": 16828.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5121.0, + "emetteur": 353942721997832195, + "destinataire": 501080933282218005 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5250.0, + "emetteur": 353942721997832195, + "destinataire": 501080933282218005 + }, + { + "date": "01/05/2025 15:42:09", + "type": "Virement reçu", + "source": "hvk_pompotfraicz", + "montant": 100.0 + }, + { + "date": "01/05/2025 18:31:48", + "type": "Virement reçu", + "source": "e.93130", + "montant": 130.0 + }, + { + "date": "03/05/2025 17:19:15", + "type": "Virement reçu", + "source": "jl_wesley.f1", + "montant": 102.0 + }, + { + "date": "04/05/2025 13:16:52", + "type": "Virement reçu", + "source": "leandro_6548.", + "montant": 5.0 + }, + { + "date": "04/05/2025 13:33:43", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 650.0 + }, + { + "date": "04/05/2025 13:33:58", + "type": "Dépôt", + "source": "Banque", + "montant": 650.0, + "emetteur": 353942721997832195, + "destinataire": "501080933282218005" + }, + { + "date": "09/05/2025 20:37:43", + "type": "Virement reçu", + "source": "sz94d", + "montant": 1400.0 + }, + { + "date": "09/05/2025 21:05:26", + "type": "Virement reçu", + "source": "sz94d", + "montant": 1.0 + }, + { + "date": "09/05/2025 21:06:02", + "type": "Virement reçu", + "source": "sz94d", + "montant": 699.0 + }, + { + "date": "11/05/2025 13:26:45", + "type": "Virement reçu", + "source": "vaasbey", + "montant": 14.0 + }, + { + "date": "11/05/2025 13:31:05", + "type": "Virement reçu", + "source": "vaasbey", + "montant": 14000.0 + }, + { + "date": "11/05/2025 13:59:15", + "type": "Virement reçu", + "source": "e.93130", + "montant": 300.0 + }, + { + "date": "11/05/2025 14:50:02", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -12000.0 + }, + { + "date": "11/05/2025 21:50:04", + "type": "Virement reçu", + "source": "leandro_6548.", + "montant": 2000.0 + } + ] + }, + "1072112886509473792": { + "rib": "48003 84424 36961155485 64", + "solde": 12555.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 1072112886509473792 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 70000.0, + "emetteur": 534003230435442690, + "destinataire": 1072112886509473792 + }, + { + "date": "05/05/2025 16:15:05", + "type": "Virement", + "source": "Vers RIB 22128 86524 35982837421 58", + "montant": -500.0 + }, + { + "date": "05/05/2025 20:34:40", + "type": "Dépôt", + "source": "Banque", + "montant": 2500.0, + "emetteur": 353942721997832195, + "destinataire": "1072112886509473792" + }, + { + "date": "05/05/2025 20:37:02", + "type": "Dépôt", + "source": "Banque", + "montant": 1000.0, + "emetteur": 353942721997832195, + "destinataire": "1072112886509473792" + }, + { + "date": "09/05/2025 19:19:02", + "type": "Retrait", + "source": "Banque", + "montant": -500.0, + "emetteur": 534003230435442690, + "destinataire": "1072112886509473792" + }, + { + "date": "11/05/2025 14:49:46", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -70000.0 + }, + { + "date": "29/05/2025 14:48:33", + "type": "Retrait", + "source": "Banque", + "montant": -5000.0, + "emetteur": 534003230435442690, + "destinataire": "1072112886509473792" + }, + { + "date": "07/06/2025 10:24:05", + "type": "Dépôt", + "source": "Banque", + "montant": 9375.0, + "emetteur": 353942721997832195, + "destinataire": "1072112886509473792" + }, + { + "date": "25/06/2025 16:03:43", + "type": "Dépôt", + "source": "Banque", + "montant": 800.0, + "emetteur": 906574786308734986, + "destinataire": "1072112886509473792" + } + ] + }, + "844278742204547072": { + "rib": "70314 58525 37531515072 79", + "solde": 4900.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 353942721997832195, + "destinataire": 844278742204547072 + } + ] + }, + "1108451968202068018": { + "rib": "Non défini", + "solde": 4500.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4500.0, + "emetteur": 353942721997832195, + "destinataire": 1108451968202068018 + } + ] + }, + "730574544821157988": { + "rib": "41884 29541 59229304698 34", + "solde": 3302.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 152.0, + "emetteur": 534003230435442690, + "destinataire": 730574544821157988 + }, + { + "date": "04/05/2025 14:44:53", + "type": "Retrait", + "source": "Banque", + "montant": -5000.0, + "emetteur": 534003230435442690, + "destinataire": "730574544821157988" + }, + { + "date": "29/05/2025 13:58:09", + "type": "Virement reçu", + "source": "bitehoven", + "montant": 3000.0 + } + ] + }, + "1322531063012134943": { + "rib": "84826 38542 51049432190 83", + "solde": 2500.0, + "transactions": [] + }, + "906574786308734986": { + "rib": "25056 97158 55482257586 96", + "solde": 8000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 10000.0, + "emetteur": 353942721997832195, + "destinataire": 906574786308734986 + } + ] + }, + "1203485889251115089": { + "rib": "68632 83140 20843525313 96", + "solde": 4675.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1125.0, + "emetteur": 353942721997832195, + "destinataire": 1203485889251115089 + }, + { + "date": "08/06/2025 16:56:28", + "type": "Retrait", + "source": "Banque", + "montant": -100.0, + "emetteur": 906574786308734986, + "destinataire": "1203485889251115089" + }, + { + "date": "18/06/2025 17:47:09", + "type": "Virement reçu", + "source": "sz94d", + "montant": 350.0 + }, + { + "date": "18/06/2025 17:50:11", + "type": "Virement reçu", + "source": "sz94d", + "montant": 10.0 + }, + { + "date": "18/06/2025 17:51:22", + "type": "Virement reçu", + "source": "sz94d", + "montant": 290.0 + } + ] + }, + "1321933664535183395": { + "rib": "45478 99228 35351766504 94", + "solde": 5000.0, + "transactions": [] + }, + "1363308330721738842": { + "rib": "44601 40897 89067421979 42", + "solde": 3700.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1750.0, + "emetteur": 353942721997832195, + "destinataire": 1363308330721738842 + }, + { + "date": "04/05/2025 13:16:52", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -5.0 + }, + { + "date": "10/05/2025 15:30:47", + "type": "Virement", + "source": "Vers RIB 80550 19549 91213737952 91", + "montant": -2509.0 + }, + { + "date": "11/05/2025 21:50:04", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -2000.0 + }, + { + "date": "17/05/2025 16:46:12", + "type": "Virement", + "source": "Vers RIB 55868 11389 89049343014 38", + "montant": -1300.0 + } + ] + }, + "1263573205268828231": { + "rib": "39039 90455 15160936704 26", + "solde": 1650.0, + "transactions": [ + { + "date": "28/04/2025 10:42:38", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -380.0 + }, + { + "date": "01/05/2025 18:31:48", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -130.0 + }, + { + "date": "04/05/2025 14:47:21", + "type": "Dépôt", + "source": "Banque", + "montant": 20.0, + "emetteur": 534003230435442690, + "destinataire": "1263573205268828231" + }, + { + "date": "06/05/2025 10:49:55", + "type": "Virement", + "source": "Vers RIB 93884 11674 79519 40904", + "montant": -400.0 + }, + { + "date": "06/05/2025 18:19:03", + "type": "Virement", + "source": "Vers RIB 93884 11674 79519 40904", + "montant": -50.0 + }, + { + "date": "09/05/2025 18:31:46", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -380.0 + }, + { + "date": "10/05/2025 15:11:48", + "type": "Retrait", + "source": "Banque", + "montant": -100.0, + "emetteur": 534003230435442690, + "destinataire": "1263573205268828231" + }, + { + "date": "11/05/2025 13:29:57", + "type": "Virement", + "source": "Vers RIB 87681 15340 34475481972 89", + "montant": -1000.0 + }, + { + "date": "11/05/2025 13:59:15", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -300.0 + }, + { + "date": "12/05/2025 14:43:08", + "type": "Virement reçu", + "source": "sz94d", + "montant": 1000.0 + }, + { + "date": "12/05/2025 18:35:06", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -380.0 + }, + { + "date": "29/05/2025 15:03:17", + "type": "Retrait", + "source": "Banque", + "montant": -100.0, + "emetteur": 534003230435442690, + "destinataire": "1263573205268828231" + }, + { + "date": "25/06/2025 15:55:38", + "type": "Retrait", + "source": "Banque", + "montant": -1000.0, + "emetteur": 906574786308734986, + "destinataire": "1263573205268828231" + } + ] + }, + "1267066015238586452": { + "rib": "69911 89589 18696488896 93", + "solde": 2500.0, + "transactions": [] + }, + "1244182195300601920": { + "rib": "76375 45991 71507488931 20", + "solde": 18475.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 4000.0, + "emetteur": 534003230435442690, + "destinataire": 1244182195300601920 + }, + { + "date": "28/04/2025 15:37:27", + "type": "Virement", + "source": "Vers RIB 54201 75079 71658 35659", + "montant": -425.0 + }, + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 10000.0, + "emetteur": 353942721997832195, + "destinataire": 1244182195300601920 + }, + { + "date": "01/05/2025 15:42:09", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -100.0 + }, + { + "date": "23/05/2025 18:34:21", + "type": "Dépôt", + "source": "Banque", + "montant": 7500.0, + "emetteur": 353942721997832195, + "destinataire": "1244182195300601920" + }, + { + "date": "23/05/2025 18:35:47", + "type": "Retrait", + "source": "Banque", + "montant": -2500.0, + "emetteur": 353942721997832195, + "destinataire": "1244182195300601920" + } + ] + }, + "1321863072242995332": { + "rib": "87681 15340 34475481972 89", + "solde": 0.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": 1321863072242995332 + }, + { + "date": "26/04/2025 17:24:15", + "type": "Virement reçu", + "source": "nixfix06", + "montant": 0.1 + }, + { + "date": "26/04/2025 17:26:37", + "type": "Virement", + "source": "Vers RIB 10009 40554 56452790470 78", + "montant": -10.0 + }, + { + "date": "01/05/2025 13:08:59", + "type": "Virement", + "source": "Vers RIB 11940 73588 95258 04768", + "montant": -1500.0 + }, + { + "date": "09/05/2025 20:37:43", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -1400.0 + }, + { + "date": "09/05/2025 21:05:26", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -1.0 + }, + { + "date": "09/05/2025 21:06:02", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -699.0 + }, + { + "date": "11/05/2025 13:06:24", + "type": "Virement", + "source": "Vers RIB 11940 73588 95258 04768", + "montant": -1650.0 + }, + { + "date": "11/05/2025 13:29:57", + "type": "Virement reçu", + "source": "e.93130", + "montant": 1000.0 + }, + { + "date": "12/05/2025 14:43:08", + "type": "Virement", + "source": "Vers RIB 39039 90455 15160936704 26", + "montant": -1000.0 + }, + { + "date": "29/05/2025 15:01:57", + "type": "Retrait", + "source": "Banque", + "montant": -500.0, + "emetteur": 534003230435442690, + "destinataire": "1321863072242995332" + }, + { + "date": "18/06/2025 17:09:58", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "1321863072242995332" + }, + { + "date": "18/06/2025 17:47:09", + "type": "Virement", + "source": "Vers RIB 68632 83140 20843525313 96", + "montant": -350.0 + }, + { + "date": "18/06/2025 17:50:11", + "type": "Virement", + "source": "Vers RIB 68632 83140 20843525313 96", + "montant": -10.0 + }, + { + "date": "18/06/2025 17:51:22", + "type": "Virement", + "source": "Vers RIB 68632 83140 20843525313 96", + "montant": -290.0 + }, + { + "date": "20/06/2025 19:12:18", + "type": "Virement", + "source": "Vers RIB 80550 19549 91213737952 91", + "montant": -9350.0 + } + ] + }, + "1244372888702816458": { + "rib": "16619 49256 77035167664 43", + "solde": 0.0, + "transactions": [ + { + "date": "10/05/2025 16:58:38", + "type": "Virement reçu", + "source": "klan0x.", + "montant": 5000.0 + }, + { + "date": "18/06/2025 17:08:56", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "1244372888702816458" + }, + { + "date": "20/06/2025 19:06:14", + "type": "Virement", + "source": "Vers RIB 79307 68952 45977 60249", + "montant": -10000.0 + } + ] + }, + "768915179995004988": { + "rib": "96557 20123 28425623538 63", + "solde": 5000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": 768915179995004988 + } + ] + }, + "1203763950341333036": { + "rib": "75329 10724 41787874253 71", + "solde": 0.0, + "transactions": [] + }, + "1143294357613592636": { + "rib": "Non défini", + "solde": 1800.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1800.0, + "emetteur": 353942721997832195, + "destinataire": 1143294357613592636 + } + ] + }, + "936337534760386580": { + "rib": "Non défini", + "solde": 1125.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1125.0, + "emetteur": 353942721997832195, + "destinataire": 936337534760386580 + } + ] + }, + "599130976806764545": { + "rib": "97593 41945 69874546643 67", + "solde": 39986.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 30000.0, + "emetteur": 353942721997832195, + "destinataire": 599130976806764545 + }, + { + "date": "03/05/2025 17:12:58", + "type": "Virement", + "source": "Vers RIB 76644 32901 90493249064 16", + "montant": -30000.0 + }, + { + "date": "11/05/2025 13:26:45", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -14.0 + }, + { + "date": "11/05/2025 13:31:05", + "type": "Virement", + "source": "Vers RIB 24193 46448 36423591130 82", + "montant": -14000.0 + }, + { + "date": "23/05/2025 18:38:36", + "type": "Dépôt", + "source": "Banque", + "montant": 30000.0, + "emetteur": 353942721997832195, + "destinataire": "599130976806764545" + }, + { + "date": "31/05/2025 15:06:44", + "type": "Dépôt", + "source": "Banque", + "montant": 6000.0, + "emetteur": 599130976806764545, + "destinataire": "599130976806764545" + } + ] + }, + "727188532669448509": { + "rib": "87859 84337 20502661021 14", + "solde": 14900.0, + "transactions": [ + { + "date": "03/05/2025 18:05:28", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "727188532669448509" + }, + { + "date": "23/05/2025 18:40:52", + "type": "Dépôt", + "source": "Banque", + "montant": 6250.0, + "emetteur": 353942721997832195, + "destinataire": "727188532669448509" + }, + { + "date": "05/06/2025 20:45:52", + "type": "Dépôt", + "source": "Banque", + "montant": 3750.0, + "emetteur": 353942721997832195, + "destinataire": "727188532669448509" + }, + { + "date": "08/06/2025 16:19:25", + "type": "Retrait", + "source": "Banque", + "montant": -100.0, + "emetteur": 906574786308734986, + "destinataire": "727188532669448509" + }, + { + "date": "08/06/2025 16:46:43", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 906574786308734986, + "destinataire": "727188532669448509" + }, + { + "date": "08/06/2025 16:47:10", + "type": "Retrait", + "source": "Banque", + "montant": -4900.0, + "emetteur": 906574786308734986, + "destinataire": "727188532669448509" + } + ] + }, + "1364012189052178533": { + "rib": "86715 65080 26418448685 60", + "solde": 0.0, + "transactions": [ + { + "date": "10/05/2025 15:10:23", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "1364012189052178533" + }, + { + "date": "10/05/2025 16:58:38", + "type": "Virement", + "source": "Vers RIB 16619 49256 77035167664 43", + "montant": -5000.0 + } + ] + }, + "561485865562406914": { + "rib": "79142 88647 23408115057 25", + "solde": 10000.0, + "transactions": [ + { + "date": "10/05/2025 16:13:36", + "type": "Retrait", + "source": "Banque", + "montant": -1000.0, + "emetteur": 534003230435442690, + "destinataire": "561485865562406914" + }, + { + "date": "23/05/2025 18:40:11", + "type": "Dépôt", + "source": "Banque", + "montant": 6000.0, + "emetteur": 353942721997832195, + "destinataire": "561485865562406914" + } + ] + }, + "826145675506745395": { + "rib": "30204 64719 14505846550 36", + "solde": 5000.0, + "transactions": [] + }, + "1347013326453870656": { + "rib": "99907 94138 56638773514 98", + "solde": 5000.0, + "transactions": [] + }, + "1350161151539024007": { + "rib": "81269 87978 38399849321 94", + "solde": 0.0, + "transactions": [] + }, + "977949307623850135": { + "rib": "14755 88795 24131636074 92", + "solde": 4250.0, + "transactions": [ + { + "date": "08/06/2025 16:48:40", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 906574786308734986, + "destinataire": "977949307623850135" + }, + { + "date": "08/06/2025 16:53:51", + "type": "Retrait", + "source": "Banque", + "montant": -350.0, + "emetteur": 906574786308734986, + "destinataire": "977949307623850135" + } + ] + }, + "1312077385780301865": { + "rib": "94450 86334 91357304463 40", + "solde": 4600.0, + "transactions": [ + { + "date": "08/06/2025 16:58:39", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 906574786308734986, + "destinataire": "1312077385780301865" + }, + { + "date": "08/06/2025 17:01:12", + "type": "Retrait", + "source": "Banque", + "montant": -300.0, + "emetteur": 906574786308734986, + "destinataire": "1312077385780301865" + } + ] + }, + "1351650470392893512": { + "rib": "32259 29619 24154724316 64", + "solde": 5000.0, + "transactions": [ + { + "date": "18/06/2025 16:39:30", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 534003230435442690, + "destinataire": "1351650470392893512" + } + ] + }, + "897082541033545739": { + "rib": "82618 14302 76335397919 55", + "solde": 5500.0, + "transactions": [] + }, + "1217095995804876950": { + "rib": "22882 95249 65296295159 62", + "solde": 4900.0, + "transactions": [] + }, + "690202239536857174": { + "rib": "30454 15704 84863297282 13", + "solde": 2500.0, + "transactions": [ + { + "date": "25/06/2025 15:48:03", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 906574786308734986, + "destinataire": "690202239536857174" + }, + { + "date": "25/06/2025 15:50:32", + "type": "Retrait", + "source": "Banque", + "montant": -2500.0, + "emetteur": 906574786308734986, + "destinataire": "690202239536857174" + } + ] + }, + "1290382773013577802": { + "rib": "32052 42311 92980767491 29", + "solde": 2500.0, + "transactions": [ + { + "date": "25/06/2025 15:48:23", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 906574786308734986, + "destinataire": "1290382773013577802" + }, + { + "date": "25/06/2025 15:53:41", + "type": "Retrait", + "source": "Banque", + "montant": -2500.0, + "emetteur": 906574786308734986, + "destinataire": "1290382773013577802" + } + ] + } + }, + "Victoria's Credit Bank": { + "353942721997832195": { + "rib": "97593 41945 69675546643 66", + "solde": 199006.0, + "transactions": [ + { + "date": "21/04/2025 14:05:03", + "type": "Virement reçu", + "source": "gameurpro12", + "montant": 1.0 + }, + { + "date": "26/04/2025 14:03:26", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 3400.0 + }, + { + "date": "26/04/2025 14:03:32", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 100.0 + }, + { + "date": "23/05/2025 20:04:57", + "type": "Virement", + "source": "Vers RIB 36495 80083 39542816185 27", + "montant": -3501.0 + }, + { + "date": "23/05/2025 20:05:57", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "353942721997832195" + }, + { + "date": "29/05/2025 15:16:42", + "type": "Virement", + "source": "Vers RIB 19440 99822 26785 73807", + "montant": -135.0 + }, + { + "date": "05/06/2025 15:33:55", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 72851.0 + }, + { + "date": "05/06/2025 20:49:10", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 13500.0 + }, + { + "date": "06/06/2025 20:09:01", + "type": "Virement", + "source": "Vers RIB 96241 34733 44548 77079", + "montant": -210.0 + }, + { + "date": "22/06/2025 14:07:23", + "type": "Dépôt", + "source": "Banque", + "montant": 108000.0, + "emetteur": 353942721997832195, + "destinataire": "353942721997832195" + } + ] + }, + "942073262333112351": { + "rib": "Non défini", + "solde": 5000.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 353942721997832195, + "destinataire": 942073262333112351 + } + ] + }, + "971446412690722826": { + "rib": "66427 49104 57218570654 78", + "solde": 0.0, + "transactions": [ + { + "date": "", + "type": "Dépôt", + "source": "Banque", + "montant": 1.0, + "emetteur": 353942721997832195, + "destinataire": 971446412690722826 + }, + { + "date": "21/04/2025 14:05:03", + "type": "Virement", + "source": "Vers RIB 97593 41945 69675546643 66", + "montant": -1.0 + } + ] + }, + "1244372888702816458": { + "rib": "80550 19549 91213737952 91", + "solde": 16859.0, + "transactions": [ + { + "date": "10/05/2025 15:29:00", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 1244372888702816458, + "destinataire": "1244372888702816458" + }, + { + "date": "10/05/2025 15:30:47", + "type": "Virement reçu", + "source": "leandro_6548.", + "montant": 2509.0 + }, + { + "date": "20/06/2025 19:12:18", + "type": "Virement reçu", + "source": "sz94d", + "montant": 9350.0 + } + ] + }, + "1200313720195264613": { + "rib": "24756 54403 68357307735 95", + "solde": 11220.0, + "transactions": [ + { + "date": "23/05/2025 20:12:38", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "1200313720195264613" + }, + { + "date": "03/06/2025 17:38:48", + "type": "Virement", + "source": "Vers RIB 24756 54403 68357307735 95", + "montant": -2220.0 + }, + { + "date": "03/06/2025 17:38:48", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 2220.0 + }, + { + "date": "03/06/2025 17:39:36", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 2220.0 + }, + { + "date": "25/06/2025 16:36:41", + "type": "Dépôt", + "source": "Banque", + "montant": 4000.0, + "emetteur": 599130976806764545, + "destinataire": "1200313720195264613" + } + ] + }, + "930211793043873812": { + "rib": "12926 69165 46900233170 18", + "solde": 5000.0, + "transactions": [ + { + "date": "29/05/2025 15:11:37", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "930211793043873812" + } + ] + }, + "814537316928192612": { + "rib": "21023 25426 38540910521 82", + "solde": 5000.0, + "transactions": [ + { + "date": "29/05/2025 15:15:42", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "814537316928192612" + } + ] + }, + "599130976806764545": { + "rib": "33029 91143 11912574367 76", + "solde": 35000.0, + "transactions": [ + { + "date": "25/06/2025 16:23:04", + "type": "Dépôt", + "source": "Banque", + "montant": 35000.0, + "emetteur": 599130976806764545, + "destinataire": "599130976806764545" + } + ] + }, + "1243889299615776858": { + "rib": "26592 50802 82203454342 14", + "solde": 5000.0, + "transactions": [ + { + "date": "31/05/2025 15:27:01", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "1243889299615776858" + } + ] + }, + "1000680453025562654": { + "rib": "70129 70587 44243598314 97", + "solde": 5000.0, + "transactions": [ + { + "date": "08/06/2025 15:45:03", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "1000680453025562654" + } + ] + }, + "977949307623850135": { + "rib": "25970 14570 53378914845 57", + "solde": 0.0, + "transactions": [] + }, + "991781071085633586": { + "rib": "73275 97402 32123800084 66", + "solde": 0.0, + "transactions": [] + }, + "478564181356838922": { + "rib": "75866 83992 30954667601 95", + "solde": 5000.0, + "transactions": [ + { + "date": "09/06/2025 13:36:39", + "type": "Dépôt", + "source": "Banque", + "montant": 5000.0, + "emetteur": 599130976806764545, + "destinataire": "478564181356838922" + } + ] + }, + "1341203038609739889": { + "rib": "99281 88462 50557875393 60", + "solde": 0.0, + "transactions": [] + } + } +} \ No newline at end of file diff --git a/comptes_entreprises.json b/comptes_entreprises.json new file mode 100644 index 0000000..4f16f50 --- /dev/null +++ b/comptes_entreprises.json @@ -0,0 +1,492 @@ +{ + "ngc_bank": {}, + "Gouvernement": { + "GOUV": { + "rib": "00000 00000 00000000000 00", + "solde": 10085849.01, + "transactions": [ + { + "date": "26/04/2025 15:55:13", + "type": "TVA reçue", + "source": "534003230435442690", + "montant": 0.2 + }, + { + "date": "27/04/2025 14:01:32", + "type": "TVA reçue", + "source": "534003230435442690", + "montant": 0.2 + }, + { + "date": "28/04/2025 08:53:44", + "type": "TVA reçue", + "source": "1108087282692522105", + "montant": 8.5 + }, + { + "date": "28/04/2025 10:42:38", + "type": "TVA reçue", + "source": "1263573205268828231", + "montant": 7.6 + }, + { + "date": "28/04/2025 15:37:27", + "type": "TVA reçue", + "source": "1244182195300601920", + "montant": 8.5 + }, + { + "date": "01/05/2025 08:56:08", + "type": "TVA reçue", + "source": "914118793918312480", + "montant": 5.2 + }, + { + "date": "01/05/2025 13:08:59", + "type": "TVA reçue", + "source": "1321863072242995332", + "montant": 300.0 + }, + { + "date": "04/05/2025 16:51:20", + "type": "TVA reçue", + "source": "971446412690722826", + "montant": 0.01 + }, + { + "date": "05/05/2025 16:09:39", + "type": "TVA reçue", + "source": "353942721997832195", + "montant": 400.0 + }, + { + "date": "05/05/2025 16:23:40", + "type": "TVA reçue", + "source": "828239898975666216", + "montant": 10.0 + }, + { + "date": "05/05/2025 16:24:07", + "type": "TVA reçue", + "source": "534003230435442690", + "montant": 100.0 + }, + { + "date": "06/05/2025 10:49:55", + "type": "TVA reçue", + "source": "1263573205268828231", + "montant": 8.0 + }, + { + "date": "06/05/2025 18:19:03", + "type": "TVA reçue", + "source": "1263573205268828231", + "montant": 1.0 + }, + { + "date": "07/05/2025 19:45:13", + "type": "Virement reçu", + "source": "gameurpro12", + "montant": 1.0 + }, + { + "date": "09/05/2025 17:23:13", + "type": "TVA reçue", + "source": "1200313720195264613", + "montant": 7.8 + }, + { + "date": "09/05/2025 18:31:46", + "type": "TVA reçue", + "source": "1263573205268828231", + "montant": 7.6 + }, + { + "date": "09/05/2025 19:10:15", + "type": "TVA reçue", + "source": "534003230435442690", + "montant": 100.0 + }, + { + "date": "09/05/2025 19:15:25", + "type": "TVA reçue", + "source": "534003230435442690", + "montant": 100.0 + }, + { + "date": "11/05/2025 13:06:24", + "type": "TVA reçue", + "source": "1321863072242995332", + "montant": 330.0 + }, + { + "date": "11/05/2025 14:49:46", + "type": "TVA reçue", + "source": "1072112886509473792", + "montant": 14000.0 + }, + { + "date": "11/05/2025 14:50:02", + "type": "TVA reçue", + "source": "501080933282218005", + "montant": 2400.0 + }, + { + "date": "12/05/2025 18:35:06", + "type": "TVA reçue", + "source": "1263573205268828231", + "montant": 7.6 + }, + { + "date": "18/05/2025 15:17:43", + "type": "TVA reçue", + "source": "1126995714552111215", + "montant": 2400.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "TVA reçue", + "source": "376796341071773706", + "montant": 2400.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "TVA reçue", + "source": "376796341071773706", + "montant": 2400.0 + }, + { + "date": "19/05/2025 11:55:01", + "type": "TVA reçue", + "source": "1200313720195264613", + "montant": 7.8 + }, + { + "date": "29/05/2025 13:51:53", + "type": "TVA reçue", + "source": "376796341071773706", + "montant": 6000.0 + }, + { + "date": "29/05/2025 15:16:42", + "type": "TVA reçue", + "source": "353942721997832195", + "montant": 27.0 + }, + { + "date": "06/06/2025 20:09:01", + "type": "TVA reçue", + "source": "353942721997832195", + "montant": 42.0 + }, + { + "date": "20/06/2025 19:06:14", + "type": "TVA reçue", + "source": "1244372888702816458", + "montant": 2000.0 + }, + { + "date": "29/06/2025 12:31:17", + "type": "Dépôt", + "source": "Banque", + "montant": 15869.0, + "emetteur": 353942721997832195, + "destinataire": "GOUV" + } + ] + } + }, + "NGC Bank": { + "Journal en onde": { + "rib": "93884 11674 79519 40904", + "solde": 6031.0, + "mdp": "E96zM0Jj", + "tva": 2, + "transactions": [ + { + "date": "05/05/2025 16:23:40", + "type": "Virement reçu", + "source": "docteur_w.d_axolotl", + "montant": 490.0 + }, + { + "date": "05/05/2025 16:24:07", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 534003230435442690, + "destinataire": "Journal en onde" + }, + { + "date": "06/05/2025 10:49:55", + "type": "Virement reçu", + "source": "e.93130", + "montant": 392.0 + }, + { + "date": "06/05/2025 18:19:03", + "type": "Virement reçu", + "source": "e.93130", + "montant": 49.0 + } + ] + }, + "Milano Motors": { + "rib": "79307 68952 45977 60249", + "solde": 126400.0, + "mdp": "9YcjNvud", + "tva": 20, + "transactions": [ + { + "date": "11/05/2025 14:49:46", + "type": "Virement reçu", + "source": "lagrenouillebeka", + "montant": 56000.0 + }, + { + "date": "11/05/2025 14:50:02", + "type": "Virement reçu", + "source": "justeme", + "montant": 9600.0 + }, + { + "date": "18/05/2025 15:17:43", + "type": "Virement reçu", + "source": "jl_wesley.f1", + "montant": 9600.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "Virement reçu", + "source": "bitehoven", + "montant": 9600.0 + }, + { + "date": "18/05/2025 15:34:58", + "type": "Virement reçu", + "source": "bitehoven", + "montant": 9600.0 + }, + { + "date": "29/05/2025 13:51:53", + "type": "Virement reçu", + "source": "bitehoven", + "montant": 24000.0 + }, + { + "date": "20/06/2025 19:06:14", + "type": "Virement reçu", + "source": "oghacker1337", + "montant": 8000.0 + } + ] + }, + "Sicilia mia": { + "rib": "19440 99822 26785 73807", + "solde": 108.0, + "mdp": "8sqmuoz4", + "tva": 20, + "transactions": [ + { + "date": "29/05/2025 15:16:42", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 108.0 + } + ] + }, + "Domaine de vins": { + "rib": "96241 34733 44548 77079", + "solde": 1768.0, + "mdp": "hIJj81ci", + "tva": 20, + "transactions": [ + { + "date": "05/05/2025 16:09:39", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 1600.0 + }, + { + "date": "06/06/2025 20:09:01", + "type": "Virement reçu", + "source": "mg_studios_", + "montant": 168.0 + } + ] + }, + "Umbrella Assurances": { + "rib": "54201 75079 71658 35659", + "solde": 2969.4, + "mdp": "KDRQGd3R", + "tva": 2, + "transactions": [ + { + "date": "28/04/2025 08:53:44", + "type": "Virement reçu", + "source": "tricks212_zz", + "montant": 416.5 + }, + { + "date": "28/04/2025 10:42:38", + "type": "Virement reçu", + "source": "e.93130", + "montant": 372.4 + }, + { + "date": "28/04/2025 15:37:27", + "type": "Virement reçu", + "source": "hvk_pompotfraicz", + "montant": 416.5 + }, + { + "date": "01/05/2025 08:56:08", + "type": "Virement reçu", + "source": "neyzizz", + "montant": 254.8 + }, + { + "date": "09/05/2025 17:23:13", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 382.2 + }, + { + "date": "09/05/2025 18:31:46", + "type": "Virement reçu", + "source": "e.93130", + "montant": 372.4 + }, + { + "date": "12/05/2025 18:35:06", + "type": "Virement reçu", + "source": "e.93130", + "montant": 372.4 + }, + { + "date": "19/05/2025 11:55:01", + "type": "Virement reçu", + "source": "agent_chaos_officiel", + "montant": 382.2 + } + ] + }, + "Auto école": { + "rib": "11940 73588 95258 04768", + "solde": 15971.0, + "mdp": "zcEKe45Y", + "tva": 20, + "transactions": [ + { + "date": "26/04/2025 15:55:13", + "type": "Virement reçu", + "source": "nixfix06", + "montant": 0.8 + }, + { + "date": "27/04/2025 14:01:32", + "type": "Virement reçu", + "source": "nixfix06", + "montant": 0.8 + }, + { + "date": "01/05/2025 13:08:59", + "type": "Virement reçu", + "source": "sz94d", + "montant": 1200.0 + }, + { + "date": "11/05/2025 13:06:24", + "type": "Virement reçu", + "source": "sz94d", + "montant": 1320.0 + } + ] + }, + "Sicilia Mia": { + "rib": "68229 13765 90163 35585", + "solde": 1907.09, + "mdp": "6uTORm3r", + "tva": 10, + "transactions": [ + { + "date": "04/05/2025 16:51:20", + "type": "Virement reçu", + "source": "gameurpro12", + "montant": 0.09000000000000001 + } + ] + }, + "NGC Bank": { + "rib": "15156 38436 35920 54357", + "solde": 1040900.0, + "mdp": "nxDcskg0", + "tva": 2, + "transactions": [ + { + "date": "09/05/2025 19:10:15", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 534003230435442690, + "destinataire": "NGC Bank" + }, + { + "date": "09/05/2025 19:15:25", + "type": "Dépôt", + "source": "Banque", + "montant": 4900.0, + "emetteur": 534003230435442690, + "destinataire": "NGC Bank" + }, + { + "date": "09/05/2025 19:15:51", + "type": "Retrait", + "source": "Banque", + "montant": -4900.0, + "emetteur": 534003230435442690, + "destinataire": "NGC Bank" + }, + { + "date": "24/05/2025 13:44:09", + "type": "Dépôt", + "source": "Banque", + "montant": 1000000.0, + "emetteur": 534003230435442690, + "destinataire": "NGC Bank" + }, + { + "date": "04/06/2025 16:30:19", + "type": "Dépôt", + "source": "Banque", + "montant": 36000.0, + "emetteur": 534003230435442690, + "destinataire": "NGC Bank" + } + ] + }, + "Agence immobilière.": { + "rib": "54044 32109 51269 69180", + "solde": 108000.0, + "mdp": "tCH7QK7G", + "tva": 20, + "transactions": [ + { + "date": "03/07/2025 22:35:20", + "type": "Dépôt", + "source": "Banque", + "montant": 108000.0, + "emetteur": 353942721997832195, + "destinataire": "Agence immobilière." + } + ] + }, + "La Concordia": { + "rib": "09860 71327 12935 47361", + "solde": 0, + "mdp": "3vo66Wqu", + "tva": 10, + "transactions": [] + } + } +} \ No newline at end of file diff --git a/counting_data.json b/counting_data.json new file mode 100644 index 0000000..4055ae1 --- /dev/null +++ b/counting_data.json @@ -0,0 +1,6 @@ +{ + "1390076581892063354": { + "current": 4, + "last_user": 1200313720195264613 + } +} \ No newline at end of file diff --git a/id_compteur.json b/id_compteur.json new file mode 100644 index 0000000..0774e47 --- /dev/null +++ b/id_compteur.json @@ -0,0 +1,3 @@ +{ + "dernier_id": 152 +} \ No newline at end of file diff --git a/ressources/assets/CIITAL.png b/ressources/assets/CIITAL.png new file mode 100644 index 0000000000000000000000000000000000000000..c19bcf97dfc092e48b7e70c87bf5bdbb5fd83e2d GIT binary patch literal 96457 zcmeFY^;=Y3^fnHPAV>&^N{57igdp7_(jYN(Dk0rD5`u+vcPK;6z|h^Hbax}o5QD%l zzyR|ep6Bzt@8|md4d49(*EKWeoW0K8Yp-?R_gaL#(NH8Iq9MY;!68vrdZmqngWrLJ zgC}|yANZz{qL%>&hY3gdm7K0`#@^z+vJVOY+n6k&%4INi*~N^g@F|V%-ETzS<+y0_ zK7@F!`&PY-Ev#q9i&b&v{U$Q{^f{e6%WwIpLSK~^6nqpfzTf&D{GI$K#S2NiPgqR- za+FOuGdb^Y0*HU-|NX zKjnP8`w92IUvgsp{}2D4HQ-v%`)_q{1l!j?LFs0Ym-dq(6=};&3Pr&}>dN=;-u~|j zel1whQCFR|<@Tlf?_**KZ*-?+#>1NfB= z?Vj4vE(e0eOz@H50WS1EgC*hN!;|m)j2*FB&WbAkYlmLlW#>3yu!Q%jl)1Won~$Zq zW%=JdIGLY*aB2Fggp1awAj!XY{x2i9nNrdw+WEIaWI!>*27F5%Ty+x%ooT-8Qfm9;bv)1$nW+S)@Jy}H5{s!R!Z0Hq#B~icUvIv=6yIrJrE539T2{h zEN!mhhSmzXoQ^-12RTphIs~?TvV58@4#7do7j0HDW&JY8eyB_W2E<1g-v8VdEU}@i z32XoI1yo|PsUiN7>Djv|1F3vz&rykqk(J=dk5Xqn?+}?mS3Y|L|M`;aOTf!OX_;O@ z)T(SCdgEXF?%!k$eqVMnniobbHOwM%4(ia-UhSaileWqKRALLFNDBrqTUvn?i{U$^~Jb~)PBQw>RuU#p^+2jvcK=d zQ$j0TN-?3&?$`(J3WK0uhxGkW)j!TXAO%49zH?UiY%w~xpZ?<*0f@O=GH(}mrn8d zhR56^19n;891Y7fEcd$1EHz3XF{wA6DIxZd_E8o}+v{4a^u_fj$z1(q-|+D(Y~Yq( zH|%)Gzuy14G76;Vvgmkqe&d>LozYO_6=ryXWEuNo-2de0-qM2GaMuQVLBZr8@KwWU zO{4aC!2FhSAoju~a2i1!!?b><6~iSI_k%=hEkjYeW?BxBL1v1b%&XwAzA$Y?+atZq z>EKyzoTXbWCkX~f$NDXJ_7;A=_-}2{<@f}GX5Rl*-;{NB{StH_J?VBmR_1C$zG#2T!B}{;g)E>3qb@X! z1~w&_Y~!!ISzv)Me-5@i8jd9QzRE-Dm5OeBHa*|(u0`s~U`rJzl3f~gZeo`9UfHOHI4+&`wpO%|Y9H{{A!x3agAQe6 z9&i`V^W-Bfb=*m?sCQV+Ra;EEB7;upbtRcZGZ*@5t-CmSyxUFTuNGrh!1TH6exwMk zI&ZA(mY2SXz1J%{Niw^MC+v>%hGWB`$nP+U*7(&^ZpXQpMQ60nTX6QxGP9~o-kGco zXwt##k~zFH4cg5Q|}~ck>ZmzH5Q~Oz(}<^h1OsuEe_Yz0GPMm+47<=Z(+s+jX0-)z@Z) zn9K@BJEN8&3 z2RxJYK-CqaTQ0#4h9oQ(?A(@P8E;NDQ*b{p@%kmnoM!n@onG`pc+DyArA3lF%GFU1 zAOq%fu@|CJ)9^j7c6ChD&Z9t2J-KD6&br-U;Vdk45DB4v71+ZRgZJFJ?O|XKl+;hp zq!=fh<)g@f$V&IQZAKCT*#j2dLD01&sX?B)&mZswV)vUUflwMucQ?O4*Di4B>LWfb zCwXJAtO2b+3OD#A6WFSh=Rm!sX9ba5+LZ8-iEMp#`&3%cz14b{MQ{3+^DlM!`7m{H zAts)&8g7JyJbNA_mWBMrMU0p9LPCcYhp%Nh{GIX|^C5~*txDW2Sd$ChV#h zVzId3<0eLZ*0@=LCcng^i?!XgBEVcU{RP>&_K#38Hf+;>Za!R8i@gC#Oh$Hr8g~Q* z&EUGC;(hcxw{BUIL)QHN81fCCJU`_!tnO~^eMC6Me}DZ8M1DZ!ezDvs%7Tq)<@KB$ zIW6nAL3<6)P_-1!BUTP=)|-Sq3%WrP<&*gMx--Mlb&Il018oFL=fdJ}YLuc2_%@o| z){5!wPMqAXbAi00BEGOP;T;Ha&^CK#51QpO)nET^n<#bt)%RDxvv8ynq4)fQ_!*(O z?^F_17M6LL?%T-f37K5xPupCJf@6ufTwRV74ya)rV~HqFZOErvV<;ekBbX|=3$CV) z>)vhC{A<-AXG)qjfIF_kEBFjVUvxF^1IX>mP+)Iwz39+W3H1K(Demt#3E*+nr9&cZ zqkIKzmIk`}n*G19k%otUM~A1T&4Gj&%4<>|4pcSW{39TWUGDMY<7TArt{Ws&)>QqrSkyeV=y%WZj;BEy0oNYjD+UMr#Y55bqx8dbCWyTd?!N1U-5w`C~3Wx?18u<&u6Y<9dE5I{xI_ z`?~A&WmF)KQtY=cLFWhP`iH<$xw5CE>E@mLp&!-hYX9kZDpC>7>dhG}6G&*APFY_76&{ zv>tOL`)t&jj&o7~$!ww4)Vg}A1bx{xiw;`*Dx{gjY))G6ze?s33jKw zE67Zbe!XRie`{NAWuocnVr8FxEVDB6`E3^_&BtxWiy1&6dPCRfu?KVW z2V+>)nZu7hEj*_lT-Kj)-n%y+WtA~+2u1;6xz6BYnR832X@P=c%r49DhXsdwGT#@x z9U)535a-I@yBdSemDVLh`@NA8Z4!jQE7Y@bw}+%s^L-t*FFV*Rn)oJg=D$Rxze9E3 z&C#Sbf4<<20mXeVT2Y1?vqV?vq*`j;0Y7Uikfz1hS_?6)#$PGK6}u-gr4&QTse|Kj z-TXA-4~4#wJ(#35_xe&R2;Sg?(7*QipAf^{q8B=OL7*#o-$h$&Y}^CjOHDbbg!?Zk9< zjFjD7tUeQ8##f0R@(l$lkz`{pYAN#G-r%op(qQ&QTjFi&txVLBfh{&S8(ZN20i&@y z+{;RdzccC-`5;Vzjq|Hr=glO6%JR%bw^F)7*h`Mk&IxN`_s-y~?gAc(-u!O_^N^$BtQn z1(+xJ1>OzI%7wftMxoq>1%8e>a6F?Q5NSa~7-UB_azqtXn!8tAoK{AwUV&TxhB6k> zwqQG7fp483ebMjACQ1K#+|N?K$tU&~Z|%u^g=MDyCb=;xSl8s}S#Qp>)%f-u(J_-S z^vaXyUn-HD8$8N16K3fB=u1C@zQtC{6~e)1;a5O!S)Cnu>xcPFRjldQ6SK4YX~UrI zRKUBqI6<+}`cB>d!0^-bT3fi&O%V9onf<_B;Pn%QRa$9JFZ`(A5o&#Ie>EDg`eZP^ zr34j=pz}3$s+ose1ETB-;9R4I%cLBDU0Z?%AnI5_IeZz?bN4{Q2w-MY;g-pFUpag?e3 zNb>TUOyDp@E>3{Q*{Ev+_qKBMV~+dmcJmODU!UUl+-AK$jCw>3TfKR$%^J9+$vfN@ z3n`6d(HcwL{D_A%X^v;@!F0%+$@0Q)l#QeRSaMVKbs!Zfv9^E!f44M@L8e@upFU ziQb=)vcILI3GGyU zW7uXgu*mvW+7whulwXj^Xdo&Ic_{4cel20Bz%($TUW;XV)IA$MM{>$+9C#E?V5t6v zU*dFc7cf{fSr1sb*Zy6iML*f3SWu!BKVw<`0z}lH2h4Kgj!2pQf8qfX_sywYLb^Q5 z*Mk?jdRE;>o8MB;I~POC=yDmFR*rRq5ZTydFlftb9ax)uUVie7q=F_wDzakt*c_`@ zY93+|GdozJ&xq4zl6Hf%q~6lG*pP{dGJQ0(bLeK~q|p4ZIhxwS1K&U)DX#<7kjA{)Uv1XNF_eFD&5Lpz1KV8h7} zKmNt{4TahtV-bD<*yIKvus``vyeb||X}--Dji7vX%A*VxBHOyry=waiPJMWoKv_Ll zXqkok*f12sf%|4+JBRI?RWHkXX9(9(eFUKy^v#+5fZSkM)c_;dR^Ze6y@w~)K)|QEC67p z+2Q~RR0>PcqQHB?_BOD0Z!>)PWX`OW*i_C)kcn|fX06Jgn>z7f`NxxQJv4S69LljN zUP$a7NxA;pQ|J|C;8+(ht5qUi&IjZ@@5j+Q7?ZpC`MO02<~)d*mvz>|QQNs*sCvWi zTTkv!y|Vdf23{LPguvjOy7$#?ffbn0TYZ{AQA`H78G&PA0J?2htt(0QKP=`H)5q8{^O|sqzUYA0Lgse5vZ*iM+5z{MrOG(gK0p|n?yOGXUKbuw>YnD7E`vQv_WJuNPR4Ho z4%*FS{_G7kuXj-rndh5b*)k5bX|?46Y4I1JBp@!Aip?vHrm@9S+bt|L^t7B5rDvVk z*pIo&*$aGzRD6^nM;aj(P4R$pj1{2oNOdNW^jYjM;~6vyE$bN@cj8b0mcWZZVyEpiO6u>?j8g>9emwLV%v}DLP+@_UN zsC2_MgUvujDf$~%rb~~C?_`6G^5jYz(oU-oeeAN^Zo}1p)L5$5`Evn&xAAN(+n$#0 z{8aH;(tG7kTy3))lI)A`Dnu!E(ukrkE@ybH(c9KuNO8fv$|O$CtDeD-BNP;LQX{fW zb*tw0m#>0BfeP_cOODEV#dQmp*AQFAWty`M59iyw&X*Jc6iN;dXi z)Z1Lx%IsAX@$^YQmN@Qaz0G^^S;fgF7 zYtL4@*ZE5}g}`4Z5;LYRu4c4p2#@Q@&7GHH*rs{$)VW{4Q~|6 zh$};7MxO(2^M{yYV*a0*=F+F>Gt-;jeVTbjy#o4+IDVP&oS&U$z79f9WSzC|)^aFu zbI4W2Yf3Ut*~T~d1b+cS-u{Bgy|E`9|7MvSeI=UKBW4+}(XY+tCFT_VlZnwFFS#6O zT;RwXJLe%||6co{Q;*{xWdL!2mepAW>*M=t(J7B5D*K&{PiNBaRwkPtZq9H990?Ti zwzs^{R_YjXLStD@sp4fd7X*0Fm>UJ9JP5OeMSUAxUOcbFMqJUx*>gFojJ39|FO~=C z>y_gwue0&Iy}d*JClsQTFfp$%@vo09vCE}DJGeKc!h~r7D~YANnjK#{sX(ZNSmyVw z5j4~3J6XJ$#Q&cBR=TJIzatJ#gb5Y7HiLGD9;j+F@LmI%iNCptpe@2As zPTuEpwE~v}Dt$9O(?k_-SUXULg32&DM!}LFxJQ?LX}#`9o&#e4%8FPwU6FLac&pb!kdn=bDx$t_XOgA`z|~>WNF$o9 z^X(zip{TKq;}d`>q|PWF8v9@kOaZk0>$)jn=aCHB5V2-{VYGg(G_psw?C-os74`C# zu`p);>PCV^J4MJx>4aE{EMDLCLPgek7Goe8CYQ@g8NO^oBG*^8VbU&r8{n6xY^-b! z=o{f_{UF8MuTMGbbo9laiUEw{R{aRKlVZJQ>GjfL82e-ERESc_jwose@yKDjN2H8bZ@5mX?-5 zdpKySya-Y~2h>n%+usx7%)o;e>YUYog5;oP45nGRyIabAZ4%fEWP`Y@@4kqOzDv+P zjPgza&9t&juIgOJ-=f4yohTXmbpIu{VYL%l5^d~E-PIC?a#3E)Mmhc|)+##nYnDNM zpEiC>cF?6DWwJFhlE&Qn4?=Zm?F5r|?Kf?1Hn@^&TM_a+vSNF_XgCOdZ0>2eDI+Ne zlfFt!pIBb{0IOVf?L{?e{F6;@ia3kXAk>fDR_M6f=3lX}F{Rk2NSI`-aOtj3TvO}v z;SZRHmnpD{YIg)H_)@Yx{p{k}GWUF}DeoRxx=l_dBrg*w@|>>3HBYj0m@o{*xmvvf z!tWno6)7vmm=AE|MD#w_Pdt8b4JbFey|@};TdW^PHz1C63y*FfYEmWAd8*{`~MvoRp{o8Sx)*yiMZ6b~QUTX*oO zGbLY(H$mRiT5jrM4>mK7R+=i!vijGOYCc00J)5}(sKl;)nyxbz@H;-l5X$m>Hy}ZV zHXYwEi*3onF&+V}{gZf&fl29)(mjn5!(PNd`j+rFFAF%Ic~neAxTlMmwl3?L2>GuU zU^nGMNdr{3Sg%XjRU^c6=*~wX#b>uXrSgF|CG;YM(XH1$^{1HgZhl8*JSSm{HRFcCyq&PVidJV^;n&6mCN6uv{5$ks0CXIa7OHv?)4IjWKt@ zWq#6vL|cP(B*B{TY{FJB;6qPKQ@(=ZAs`{Vk9iPwWXAdP^*>7LgLI8$ebYD9Ez%s= zCdhBt=Wy;a0hW}k(;5U+T-@ez3m_(-qbdTENp{nBWQef)mSYLNNG5BIA69vkw0c9ebvepTxz%2i;1{Nsbyn7o)_oE$Kwv716SvW z>B5ZNvxt-Okrl%xrKL_&CRd+Jx2X@5d$weN<0IhXOi|YYNJq9SN-;ie<1B%@2aE;& zn@52O?)3kN3q#0TN1y&RN{En7?DA1xA5*x6x(OhtQu!L~PblB8nd2Y!F%K_fnL1Up(MA2${4>hhr2kvwp z1g%dOeTc@>WGhUfYNn|B0tTvxV>8?dE)Ba&6VZGJ*O46Az9D8>_-8Nw*|eN$qxzrd z@FV8KDhe2-IoNgb0t0etlQh=i7s}IpEH1^Khx9T0EFXB_lZ8@aQtM$5a?{5x=PLHK zvbX}kJ$#qD(@OU0vh_?!6QUpATpR}{eF=`VFi1L`xHw}pPncWr)eEt757-cYB;`sX z!&+iTcXZ(Tcd70VMkeBF_IOy7XYw7cxE&x%aslk)SK<;7PkIQ_1B&DB+SusYIl~>M zU!C4LuGTm78hA_LP?8^_EQ8zN>ieolTl2Hu+npkAR{Bjq{*~Js#{MxLwyyDL?^#ko zUTx7Fx+RZ_Du$3agBiKRT7!6)xKP2ks82xu?EzJ-_3kv5#q>Z%f+cnoeeV zJm!u#&ZgZ>AJYh*k@bJIuFMBf8ZhE=xyhlS#U^o7YSMT*fw!bf0Cr!pdFf-H_bw#A=A8CaUjbI>dViqn7)ZmAC`YmNi2tgX6)H7kF;w3ix`y zx-0b%Ee=V%7Ci9#9ng}Vc{Y&yEfmuah``K#Hd#p>z| z*un~x5RnS=6bC?bO60hNaG3C>WK9*3FJj;1ybRBI3lymeB2Jj;EQL~vj-Zs9*A^mV z7EHy^M|4;_;@QEl;=1g{tZ zR+YVmiufunoXyor7uO_wV9D8Mbk&yoG;2@dKmJsOpJ&iy@0*#;K)mVF-iR!Dl{WmX zk(fOD7z%CG)|(f0QaUNoc0Oo8ZXrBGuF@N}k=L~sQvt26?vW4KIVSCZ#EpQ}1+`bR zps_!?gL0kgj~P(yK^HQJcOrrEG7idDfEYX}R*(VFi?)WnO_nR_FU7degE>)M+*#;n zu%joTj>!QCaZ}Q9R`j2spkrYaBbj93MQB^Yfof<%|08;E)rEFQLnBrF(9yusb!T>A zZx~^<s(8p$%zHSLur;~J*&HUT3Wh_NT;d|9zx{z^J`%Auc7QW>B z+fJ{Q&+Z=I#aTgSi^E1Eb~jdWGCbR(Y4Vu0`!qJFC2!w{q0&21{Gi9l6s%dzg4_n!PA7wQfIBs&4NeBb()sb_2mj@iNNg!KDI!la)404 zVUGCex02V>ZxFG=*Fnp=*y~-6h@j4zOg3v(?TR2&R*=Ybq<0G#8GtY}7AYFsouavF zagw4cSVV?b)h>AqZVC9903KEUhHHlj#J?4&{kEu~>~TW5fl#8ZHP$R35dOKdQxCV` z=!}_fx@k%#2kKBU{bd+B7Q1D-E*+MSJ6>fd023J0b^oW)YHpM~x3$`o#Nv2Sx~twh zf2%C$t#+w2Cl_b7fQPvr9s_t?I3S63x?~i?DAZ#yG;#8_%3SYx@7^Sa@w^(n8)rk* z@KhQJPRim)KMow#GM>B<{x34^V%EfWA(WEUo_un0diCN{iqFZiX zw2JhdctnY57l=ow>go4NoAdVeRgPzS6#MsvaTEgj*v?0Jw}BcS?y(V}tl8cjJJblJ zW)VTq)u)SI`Dp*e%2Kyt!_kt4g-vlty+CPuRbVXWId9)ryXO7Xh1`@S+VP6`Y5^Ay z^?)i+<&<}X&SvA)k|5_h<*Ynsl%ZOXjItEy(-EMn1t(f%LtE$r1>QV!T!3`Q9S2m! zJslh@YRL?o`+l5Wvn@5PrX*YD((Rr15?#ddXv)PvZT4;@I6hJKF%A=BAkaNg#bRM2 zZ`0GC{%oc3o$>uzv{E=;JL}`kjf~TMR0WxSNvrvw%aZ*ix`L+oL)(=% zWwpEEpvxklZS6{!Z{X__;aF@O4S$e6y%SGmsNb~fWa0{JH!#RL%1=%mk*q1HQ`{pa z@gV*7glwr^09Ne5KYm@wfFiN4?+=jb-@~y`&^A>5-dUIBV{&@>>!wTu0JER205iO} zXv#>9mVLu7R-`)^5Z7pw_Y>$tSZgJ-v1!7)Wz8s@F4bT5RH8BQHjaC4`S5i5u=KdN z`YIq92h)=L^PClBFHbelDbnNmU4=HR!9S98N>mHxXG~I4hv>VM3<;Chh%R8Jqd9sw z^Niy3|8_Fw6x#nl%wHz}9a}@1u9o}aR8bAe-H+8YVSQPq8ZF?@+RB42QZJFetWUO% zkD)HzItS6JaO7`we;MH!W}%z<%|Al{MD$Q!)bCB!W1pmkGReS^ez8xToxkPyH{4wK z4GGzccrBxWP5Ga3=V8mdUVS@`dr|-E zdcEDvl-Nq=kH^_%F8AKYjl?1P;y{*FSB+OSXOWMm&=Nm3{G)OM0fC zLpNcYD&i|5TPG6c1{-z}U27$Cm zT4^(A%G|NyrpSm-i2U}y-dajFM5^MbSIDqE@ih*2in7??TY^8|&Y|35`4;|j!*1m? z&z}Fk#?F%vCIgf6bvZv4Kc<0sC^zAKBS_>)wTgNaC*9+dBV&cv|IZo*@_*Lz+Awc+ z)+#$Y9P3A`2Wy9dKv@|lJ|=l_$;(`T^!`7#ce=}kDL4$sjy zB}pr7Aj;2AAc74=tKP8&Ro@-?(V4eC_up+J5*_8w`L<}()L}ps;fkR14N#`hGX?3F z)Lekg?Z{!Bo#KgXacf-vIyMf@h`iM@XS!7RTiECFTZ%wiUS`P1`JcpoJ=hxSWG=+< zq@CULi8#zP0GJ{81Lxo{ti@E~P*yk_p13Gf%?dN)~Oz(3XocjYqG|iOO z!kCUPks2J|aBx;*8|t~*%fj5Y^xp(_iryDKu$=^nN;)Poj7=|Dgi|WxH(%M5 zRZGjcb0~>_-#M9uvQ?v=c9IJ4=MaY{CE*8R&I@2!Q>gw&r>LEe4TZhb72@?3w&+zn za=kCOvYSe-eTqzKO9U0IdOSZF3k6*V27K$){(Sp|(JgQQippvP#OmWp9ZEH~EiDT} z>J33@saoxq3vca{Hy`lJ<=8&jd0OOn$WbqtYHgM0g4PI#oR4*AEVC1wuI^3*^y~~l zQK0UDqS+-)4Xjt-;Utv@G041PdZw6!A1(peAKL)hRGN&7_LgBGVWhVg@!Ku^YPbka z6{e8K>9z33F?Tn&a`n@I_U6H%ryHW*EVZLLMzyNTyqm|@oC!&$YbT~F_I$Ub#P=!2^81BWzQZPF=onwm*zC0=`RC??yj-7xn zsi)B!?e5#$J?mdTs~fY}ma9T74SPv&dSbMD{XgrPG??o+Jde~uwr|)8%^ZFs{gV29 zKs<(`d0$5++~1_<6_XlKD_*h59T+4>Wyn6n5~zl}NfSxWTZhHoTTg@#ho?c?y&y$bB`4T`QC6Ci5WXi!OO5)o% zC$~a%@%`B)F!s3gUJDSz)7!?aa-ivAlsh?Fj8(#suDDn3mrM>r!cA8JqhsWKVtL+_ zVvB@{4v5$7xj5nc;)E%1Mip~tjAGb`uL91NwFzTY7Uws&hUgh)b+=&dqmq_AKQtc z-jxydRFxArP9il5!-72WeoBM0Gf0TxlbAh0p0u6c0}aPkb?EH9fK8`3gMd@);#^unGt zjcn?REr&_a`^xBYh(pFv0$l5&=O#xZ6il6@yxt*s4ZW!&)F@5w2v`O7PeoO7r;y{$ zgsHhrS+X}0?+v@mPL<>K;csns6%s2qJC{Fqo5uSHg&Qqit;LY!8AC|z&I`U2y|BX1 z-yy23+P(sl9ZciCW`dmr2Yj;s3QE40E<6rbU}+#$*Q}-I?lq>4v(QfreuT6BC97~m zCMQ%Ep2)#I(b4cr)_`AV)PK1wp%)B5ju+S3JJV@u2`XwAS-Fnpf3&A>S;m1EtK^r9 zh3gCqP_pI`vT2SB^v+T&Q!clavWe4d-sX@${a#3wL~m08%fr2wrQD@Rt)g#e!<1I# zmv?MMVL>bplJ;eqdXA7Xhg`=b=sg$zB+yt@WnVo#=^32(&6dZW>fXK)YhHiMpqdvB zjy5}PYM(UvBR{gpC^U3+0O3%aj~zGbQ7t@^BU zR7>jkpiJZIKul)pRHonfP~B3D3;Qgz%sc&Qe`xix0=Mm`c^v$glOKliN=FqrnQs2r%l|npHE40};?+DZtr4$&Eiq_? z{sBrwA~1rv8-*L-&)#2r_7U&1(JcIX9~AD?C%3rdU#W!ZSy7}xbetx=r}hv3%Im@U z`@WL08&ORiWEEyq(+e^yB1e;uqy+nkg`i2xYk~f<=71^(%z*B4ni^ew}u@dfjRB#&(|5BzS%NGN;k`7qm^ z>9!oA?%z$G5G%%djc(TNv6PLX;diTVwhZqzM3BNCOSKK3ML%q1 z^db?D-6~sjd(rn+PBdhiixYCit6*;8@DmK^$PXnfnR&%TMrc_gZ zf~Q|bL;{Ava6g_B%e=tsv%jnYmC|};I`KD}PtR&gfB9m-LyTjn#kGTmH0hh(WB=W} z9}c3WnQG_P+4$=w)6KT_LT%dv&Rr7G#?oEL@c4yYPT%WdT48{q&qszxi0{- z@9QM|J{Jk>@!QfMt9WIiBWAuM+MADhz44RbEHOwRhQBrN-QGumMa~L? zt3m`CUbTmQG*!Gi^H;bYpFXH`Fy}|YFIoJ&v@F}Ji2dd1bBSFnXF5;%cdwG9M4^C^ zsghbQ2lg%I;apEM?xR|Kuf(NkS9_I72(Mu+vp0V=xm7LnHUd1hJ=~Ksh!8SWA0OLZ zm@gKO!SJC452Vyzmd4Gr4i^%u%)<7Tszv$ZT_3)gKq>^ZwhWQOG*!e=rmcp4G41Bm zOd_0Ml&8}X22d$pVFQQ-dJM(Nh8yT+0VkVn(zm+b_jLc|IG7D;k{my=YdLdjw6o?+ zZZ$>e!ZLQiQ*E1uf0&CHjar_~ce1@CjXe^1-r`I4Oi#5Q&Y@oURLPK^FWClpYbPcZ z-*6pyv2OU>uLfcQdK7_pXGc4~6u(*XuCaa7hJDz<+F4_e-YsF&O{mXIw9L)z&CELt zG_ejjns=eeF30*ld}hR}`h=SJ!tug1=rEYUGx^%$=W=9<8p{SJ^jY2=!paZhZ`qk2(1)2Ef5%}Zgc}Tx zZ^?p>(Bp%9jr>QeMS9Smcpt;PWY6by!+*#*IIATP zC>hZIEXYSP`3*mFGHUIs|!+r)bT z$Qqd<0^bt7f*Y3ADDgM{^ys{WUen9OdgtiQ1fp?1&r5O-`K%9YKaD8jctjwi^MN@P z&Ly?y`|zQz^>ow_x7GZ}?WfPtA%@zFCQk>4*;H()lJWk=ZCaZ>!_K2t-WYN3&4q!R z{4LlmXZP!RTX(MI*wxrG2Zp<0d>dj*Kp>ACPxxJFp&boB19yr~dbZV~{yHKr&D_qe zlN;*mjjfE#F?)xv=;IkYmn*qvpHJ>8FK(*x?^yqG>xJIytckZP7-9`TjQPOL-d)yS zAoWYM5>x442XP~@8XwDa50sntXJmw|Cr$+}c#5*Uokg;Br{8}CJDZnS2r@IT`mEL{ zIBrYNEJ>Yqb8s72Yg^rlwIlyJu59>DS5w8Xvd6dL(!>4gBruRO&H~=TN4UhpW?Tm=||zUWxlO`s`@9PqPw7_2IZoM2zE8-;G-_9BUhL*RE;w zzoHurJrEF0T&<3i^C%)4i+fR9w%;88PLmGL_;uFWi_))z0iiw&I+XJT>Cvt8S%VQ zhIrsMrO@$O#ePh$3iD#1h*$)vSM0>7fM})>{fO^t;<2UF!)i@gE<}663lT=2bB0J- zJma{-dYG5*SCzxx^U@}6p%(oRLk(2GY^G#S`AGmJWf3Z}`crpaf7M>*Hv`XerLj$i zpSKe@0~v9cT3GgtsiF+54hkomBGVCp83hwD&2S0s4r1CDnfS+Zv8j0i;KB*J*B_)N zRVCcCnbSs8uK@;LzY*nMdWYaP{+OlVh}f3LW1-~svjFfTeZtpQrbL3fMzN{!#{w3h z1j#*=9PguP6@nmyU3Nv=$x>c9QRO0vU%fLS0p>A+Qp|0SWyvIcUXo*~b`%x+0z8PE zdt)={uO|3}JEKA%_{VsNxc|esJfWkZljaaA3IfOZ_iDicz4#+xJA10V-z+>F+0||v z4YGo4t#J76&JCSRbGOIgy__2z2Fi!6ehwGQnIKL)ow-=>i{(enTM!b$O??W8qIxJ^ z!)7hL+l>C~vQNa1V-o&^@LCKvD><*ziDADf&RmBknpn;e(z@V)W}IvN<7~5z`76 zP)U$%;YdAEB;U_QO{z$>-rlEPL0((VvJmVXMH4m zp#7zBRzKcFJV5IC5Cgq1BK4uk57XN?vrMoKE-|uCJI!M}Krc^s zcP4{osM=dNNa@brz46SnZPJu??ViyP(?VqQ=7k8WL4tm!a9i!{BUaw4t2;_!KM3yW zsC}J@;vJ^0H`BV!I;79G6FI!dOXYP!GaUiB_*^do?uAdA3ozPZN`dBXR|DhpH@}?f7^aWsj|v_es0ApD|bN ziar0K0@K@azpq3fI9H5#zDQ?OT^C4UAxN(V2u%6|6{_HO`&8XK+rM@sSLR~!Qh!o> zL-5OwiK0MxKX(NteFJIi!icjLExdov7W=2?#PMRs3JtwU^HJptUFq4H)b zMa)%r*HtdRAN3x`{P^Ycb$IBp3}fD`A&6EZ&{;}Qi~oDp`-IF%i{I_Nn=NiU6LM_1 z9Qn&<#X{1oiA(baBAn1J3L=!5?j$FtvXrA zGS=?2;E(woyxvmYN=bYj&|Ex+cle_I+6n)UwJZp(KH<~5V&cL7Qrg(A`0RTQdfZs= zZ(o+fSS(4}>8v16?f&V5*otkI_irV@O=9ogf`_egcoJm|j@zKbKoP@m@QZVcPd`tw z>7)8I*=aI&UUje8ms0!h*O3w#)h^=U&DK{x@IA$*FyYk1ZAzw8B3`rKk>!u;?BNog zBi8O6{e7>e9f#$}Z2CP$9tUS;sW?%E+PPLZiP11TUn3LJ$5_0|;GRq3hSC&<-cEI$M zt1Q2qL_>;I?0=sp?$34YbI(>*{tB$uw#kcJx&(g>2z-BbC|qTd&i?`$jyg_#i5apN zP$qIJEGBwp%g8tdPy9dZy=PRDU$-xcilBlZpor2`dhZ}5Ac7R7i1d#1j&ukRno0-h zoglq;2!s-p4$^y#0-=XU4G=<3_`mPo=Zrn>hdb^#ANCk`uTMNYbG5nVTA6Fk-<*&4 zmZiiK#uw-d2RgaHz#;5|LL(x%LYTnG_9vI7f{_GRKjrQN7qU|_EuRSCUM+K`(kMNOU}H(O}u}7 zVH@hCx4XegdZ6W`6RKUl!YaPFcNFb0mSLM0N-p5OyxW_dpZ<&Ib}$3K{q(t$xBu|1 z0Kw2@%Lj@n-xf%(hMr|sNp-OXS zQV4awk%7OC1Zt^2mAmV9WY|Q1#XaEXW2tpA(8@7@nfj!Iomfv1UB~SvCWlg>8q~P_ zW5~rT(UGJyJg};h&F|^T?HyVsfcT5z7P5&%bJCs6oea<3ANMCmVpKS7b>TxU1HVfK z2A|w*donvf8N{EhqE$1JNb13GN;>Bc`t&|oYUaBe&J#1q-_L={*f_c3UDT}vjV3X) ziQW0EoXv<9OA&I`RHC&Xn&~3yaaw$@Z&jaB?9}QtZNE0~Ih$rSaaXhWsUtyv)m5`@rCHB(o|Y;zRBdryy-;AFNlM7>qGLb8;S+a zChS-ph3@`^l$RIm^YetITlwta+c7Xb>fPIA#&q8iZe;uFPt)g}q=)&`7Y@=nQj!z0Do6^Q^2?6&Cq{k}_Jw*wgi9azN zFnm@aVLfhAJ>8ZKZuriOV7?smcvhjgz*k)m%1(>e2E4Ks9JdwP_V7r4lhM+zKl&A( z?3IzJ_Bx$~R^*d}lw;Oo_*V~R5Amefjz77!-_yyUipcLT(2llq+$@Ga9T>!GBn0h+ z&CGCJ-x9l!byy@syZJL#U`10`ojGps>dFjW8u$W4QMy|J3{_&`ND~KQPl)& z-myH#twU_-bfWUj_lL33KDZra9`|u7M@Lq%@59J%$6bP6FJ$>n&u#|&{D!SCLMm>D zI7=E-K+m)jxr%>zhj3LEo}X4{8=i98uj7nuj?bxO^Do zGK9-7c!ASQ%zyxu5IW@P59P#hmx8Pdxmhc!Fv0qBAoFCdT;z%3>LcN=eU1%itGEJ? zfU>Jah9Fyn7F_Nw(I|7a)5D3Ih26)}%A89{gJ9Pn)0@&?18K#7Fl~BtTKh{iVq+(! zoJYajBt@*A-$Z81`4{$d+l-3X?iKZ~OPvt%^`Q+RU79zjtYhfy1CTW^fXaFl}8$tA9%0Cfp;Xl<%$C^-{_0V)uFPi zX6fHvsl-dF7x^uCyvqrhn21dhu2(7Gq@K0*_?s;eE#w>69D4bh_EB+>MlUpWpfj?6r`G0+azWoPcyvI<}QuMkQrD4rapaIdv&9 zR~?MfQ-A-sy9^vs5)H6fmG*(&h zyz}byeYIIqozHfMvEQ+Yq_gC#CG|IQ(Mgu%$d4}N#jAMtFn6!c3kXsS0MRWm zsNe!?HcjG}2w;~{Er_eqRGd6O|XHxsWzZB3pBq?%R{B?ZHazC2%b?=Aj zp*&GD?@HQwi?-=y(h<8i^uK;xTxIJ`(fJ?zD2TmFYV(}6GT(tZm`AzXhG~Fka^h>8 zWG<%@_><4eR6p;QT=Y&vy1|D*`>Mrwz+sL^x^N=9mBwS8;>oy?RC&*)DS;0*?xQ!J z;o}AT(k$aV`;MDS-hkCvnN!NN(S6#yHW$#7ko}4~^)%~A+5#lIVo$M^6AvWo zgocNx(<{IYg(@3UT%=b)1Dn4UEC2nGol}!;&Nqv{olLex9pvF`X^}GZ^T#<`K??V% z(mVo&B!y)PIv|zxg)jq->XLelmow^sLKeq^(bZnXwJC}c7$V}x5hlhg#Ww5BAn!y0O$5$X$6r|Q~uetNw1wUa-M z?bc&FQ~}aKo%8etGEFVz8&FCaSfiCpN_>Ei^>EDhLJ4QyrPsH5nq>lHUBu#uPuV2p zx`0YVft61O0lk*L#kr2lOuCc>iVzLUlA=yUC`Ul3^cU|6|2So1CQlv2Z%|_m&}kDN z<$i%u37v&zH}7GNcc{CRbxCMN8?!E%k#WqoaQZfr9fH|QY*aT4_NO;o!GzOyMxG`- zGhMvPlJaAYTX6aHtB?m5%hMYzQ$NNC%hyy;5e;1d(~0R85;+2rnNfE$MY-;TiXRED z;I*!%iq>`LHysLsL#_(-w}}GL+~bK3+`SQ&q?HZ7H|Y}8Y~|gI4WoGLLsV=iuHC*_ zZ)BR@e!<@2dU^>Q`vkNuK5mf&znIA13@-^;Nd|IVXR6thMJ6e@unx?%vu_CT>t=TP74t zqY)4)AD`J`j&V!U4)F8lD_T3!sum-`T*T<457igy3N+Asa$xu@e6Ciip0C5Z6YQOS z=aI%p!Q>=w_(!TvyJ@m0Ihf@A(EUU203o4^WnN?}V)MJM^IM6{P~wUO`mjQZ%JjxR zk9ENfKE&_ZYi%G0sLgm)%;2%f7J&_k1R(k&KMzk4Qe}BF@%KB;2TCZab{p>%Q?7CNPnf_Q!9Qn{i~R@LmSgpUs@wKwhU9st6`x1Fqul@*JZUk(54Rplaz z^vICjrjr*=KwvoSAvyE&OG-1_^JMhG{K3-PT0Td~M5Cie}nNDT%1O>;J z5}osR3L45}QbIVs#$=oq{V;YAO#ApUyjT*4LGzF;i0M4$Fn($Zu~AEC`&DT<{R}xKA;*uGUw`FVujR05{c-BNZU|PgY>MYlK}bk7WkrdoV*>I zBfz}$itIj{!sN*rl#AO5LQ{)weavn!m}f!HT86RQL?8{}c3Nd;(@X_;mhJXTg;-TVvC`U= znFD2qr)=tdyI5G4xZ0`w)biT`b8f3v;1u{42l>os2x0Ank_hW)_^{+~UCt26JV~je zILEJP&pTnmJ6{o@5nO}u2>0ii@QnzDPpTJJv!#j4L_b%PO1ogpT0br?CnR-HJXRA| zc7(I1`140;dbavzx{}%a)voXZyNnRE!@tGKL{)f+xXShRV&aw;Dg_9#1by zmodB=!kCq9cR;hZgnjYAz<^e-3ijD$f3^Y7nv8hEG4GOL2GISgoE!Sztth)Eg55aY z9bP2`1^faEx=;;Q3^|fW4}QuL^rZ0(d;2w~;{vnt*F>4N-DQ8E=dSumkf#PK=mx>l z#56_0`o6YfT8Bqbj)0sG!9%TSPQi8G%PUpWW%vB5>9b90wR3-XG`TXFO9_0Zt$JhI zudPX=XV)m9%qcgiMOwB(@ol$E(^1ds-UI{Pj>KfFS-^u_4F==Lg)La-u{|Mq_GS}D zx*&5y+DS{^o~7fPa+6B41JKw>9bu2T6p7tba9Pj2Fq1-ELULC4OPTwJZ3}cm9})el zEn^6Fmrx(3^R(oRGL>y%_o5w?;r6;d1oxB!W`H#%vU`-@!Nlt;?LVrL1ZZnpwyc?worhALk*DLCydTMWf*yyJ^td2 zX!$RX?B%UBD!k_Qb3EW}l-6fnZ70^Mcan3n_BC0@t$woJhR(9N=-q?qprjE{>wJPf z!@BpdsF{_VHEpZR)t@FmD}?q!cCxUrj;nP%UFHgGl*QPzuq|V_Cty&C;Kh9shMhRC z(7M`=a-)wee#WhUEvT#vBzEzMT?!NU_*VmIhl_!$Mv>)%$-Z;G3K#f{NH$=blc#!* z0^#%_qhQ89@uo`knEMpF50z!_CH?h){CZ`!LBJ)(Q997yHR zcbJ-+1i+kqO=~m8fb8WS^HrceE9^pPng-rH$LUXMj zKX$RQ!8l_qQ?m_9wvx?SxRx5-S`lGp zCRb8riIShtl+0qEJfU-AU`I=pvN>JQXM|dKYZt9w8h6YVkU2mGzYEK_wB-%hd*#Of zKMkI=8qY!~kXSr)u7LjARQWGAJ+|%KcjV~4lzzXSkC?s-y#nx7nN-iRA171Yl9<8B z8$)(J*;fQXet*jLVN?~=N>lcnX@`l_wGx5}tvnASxv2om^rVY*)A~#wBxYEDBxqU3 zY3mtj{1>XI6N>ZJqz@GPSbQIWo`8(tKMx2UcJ%85Wjdsibv6EMmgQ>#H5_u(mMmI zo5OE-zX<)_Q@?j-wsZPu!M6HMcIe1^ysIi<77Af_uU<|E)aO9;UtYwt+~IC!y>VPY z*kz<@lpJB`OBNzx+2Yb*wBYodzIj9cHi0m!rT0NVl@PaH1vDX`%IZTNIqyU+Q^&7k z>cX)Rmlf#CGw=r{Lvjyi$)7%+G16ZNWBl#(Hd+MOlfUjqzkEsjq|IP1ZN%~Qw(x*A zPX%0W>xVT5#Fe=4_^r5ZwoTtHYh~qPN7+Hwd*ylSbVo1yv)OBwX&#O~Sawz4&e;(b zb(j^upC?8Xy*g9)=4~~5;`>##&tuy}npyJS;jV^Fg@&=BErW-ZP%<*gM??{YQZ^ckM3P8 zKS!1)O?d7k9}2K(Z(l$RgBuhig*H6DxxG))wt5#Fm4<8)M*W%So=&Q&lqx?Y8}@sk z^6s2|HGx;tZu;mhTSEVd`E7QBhl*n89}_=VqXGskQEwTUja!C0GCoze?Q|!~q!sQO z(b5Kxb6WTK0KdRg%cLxVsX!Zbk#H5Z~8y}Pz zGyQdBxatmEE2+-~d=)ZGW8LUOO9%S#vH8kav%G_7W$_uSVL=pX6%?{dJybqCG_@|Z zo}=JMl+!B`@5c#y#QlrbMWu3Aa9Mocuwv+iG+U?^k_cG1{|&Wu=9j(mQzwwis`!Hj zi+C~3N!VoyNR)I)NtsqN@lr}u@qboy~SyEE3f(XRdgyQ%v}?w~=9LUS*`{S_{|j(jqv6KE1gDfsPR zm5IwjTnROy0*W!QNp1+f$LIqEXpju=oRu_bmNsbVoSf4(-AJAEOL?0+V#b$pxGwME zrw(YZ`}MdKm)Itwy(TfGYikIZEub@)$&LX?c`lbuW~nHE3ZT$oz}q9=7`YMC>gaku zvc>ke!kjvMc4T@sCuH!Co(tAhw5PAKpJ{lnXN|bm-Ag6vND+s}LqC3b^vR&6zAAH8 zp61#&Y_1-w&bmx-SQS=9K*Od_zUpgu$oNfNWOp1MG1-6Y>g{oG8S72i{8d8tv?1cS zb>KI!n{)ESyMNWPXu@1_BzNiU0}jXd!GQwOMj$RD+;9|9f!-M{limpT!cDloYgN@z z5!<TiyCnkMtFgl!`_?UmzHGCWoT8<9OIhJ2)&$}!52hhXY>N}aWq}WZla|~Jb z{dODqu&*vto0HU@Qc<(;s~PI$b!)llW7ot3fWJuTatpDM{G) zcHXDDL>Tr?;@B%!fY4IX<< z94_>V){z<8+q{Au1*G2W1#M(Z8KnF?P{5m zS4D`{d>2fjLTEoF_ufXw_Y3KfnQFQAD+4ImAz3NdeQ9?reknA4yT?YWN_!Hu)7j7l z%h(y|_j2eKT0MFq6kih1s50fJgwFr^RVOEN?KHi#-|N@d-#<>jORlsc1A4n)Qaz_; zM`#5ARaZV2Omc^Tm3_2wC#>+wZ7uC7)}xe>^kyJWp*|TP#V+3lvfMhL{luQBY}i># z?dSVsmY~`1F~t}IRm3v~3r2#VGfoV;w9}nmWuaPhF*J#MPb{M$J&CZ>QUpLHUdM72 z%#ROu$YrM*0lyHcl>npizHWU3P_3-yWc?^7MPn zWRP!j9sc7(sggGQDrw4z@W*wP_27!Klt%^{Trrb*y0nHB-+0ANZN1ti^qR`HH*)N3 z<5ooQRKJz^t!l*5R=7qT$=_U8>%W;P{H0?+dUBfD&pprkUzx}e z{(nL{a>M@p>LcsF;(tIbs*%^}0{>M!?*22Ee?2^;{Qu3vheBLLUvvF`uz`S`PUpWS z+;2@|_x}$pz`yDKOBVY7BkB8phc}%0U2;qM|2d_HWL!W0^WnWxAqI8s8e>TEAO8x< z`}pQRW4s9N{T~5Y|IHpcaic5Cua-rpqt;A`(O;=p{&=bJO(+}ra=C>o-D_Ey27G__ z`a`tV&Y`+V7_?NldEkxt=cNxTUyoOzoYV35!a&Res_#$VOFruyQXnScJ= z#(5dkVw)B@OxsPw;XNuu3`r{W*yw|2@ zRW`(-w&QuL@o(a&>urX4bqrj4QZO1P-U_BGZ^EFS%XwgZCVa5#SNR&NwU$gVP}S9` zi1DL$gm&I5?vP$TUTp8|BgD7*5kT=dM%r(0e$wwq5P%9fY6YtM%c`Tq52iE~YWq5U zBCmwA6MY}FJ{DWPtT*2Tc=MgEc$?HNkGMEwZHB(6l675jz0@Fk*z-{lRHMOqFo|po z-bO)j9UZ=;igc$}ISEh4ZRkF2{QxYhlV)sz`^u}+E8K;5M5^u{h##a|*?|4j+-1tH z)KI5@t)N)XUFaKFB0jn~=s6mD6_^1FTrHq_sxIP1$@FNVzt|MF;rvGYSa_?F#M$90 zuwrvOs!e573iHnR_V^md^l^@hu_r>F{^?lZminalc|IfjWtq9()}OF2Y#{Jyz*y4I z$M=ZYWMXPwy5m)vJMn*;f3H@HlAj56fc_wBL#}>U~r|mFdVh6C4-3>Y3@da29|) znaLz#nZj$M-wpo6wxoOidoEXTh%8N1YFBn!CIoYQh{)jqfEb!fY0Tnm{8&vbO?DZ(X;% z^{hxq3h$Xg*#)2Kyr^-!mb=l@bOPSE^vB|XA84l{w}{-7}X)YspE^N=KR`l ze*=<_rxp4=UuoOC^lI1@YW5B)wmUyiGNB^*us&k&Am6LFhG^ zouT8s7CH6;^7Gi85uBK#F{JF!;bcV*XNydQpT;SPpNQWD;Q86n@8x=JgUc4lkt?1g( zr+HAy$WZAajoa_QWMF8SXrSUFb!if(DYqey&{z8_3NjC|KeKe(?X?yM3y~v6z6fiW zo_6oD5zLK*(Ma!dHN`N}4}@7%Fr^MaNmLsZTgarK)LSKZTx60Jcj_gTk$+MlD-%9e z)rk2r=hpK}H$U}0|HY8o!xm3e!7>YiqpDhx4v2}Nj`7Q(KVfYyOAvUJ$q2^8By&fy zI<;}esC-jU6`a1{xPzJS&D>{f-Cl#vn{X}XTuxZbb#1Twb2hcVhq#Yiz|GWR|nwTQ)8F1~5CSnnEVlqfrVXWE7vW0D>_1LQ=< z=8mzcNqk3msR0hwdr^H1fkv)aa%Y-@3_X8o6ZAkJz-x(;{ou9?z3HBX*pEmxb4C;t zGaCb>iQ}Nmr&GuL+)lPikY8p*SNAoLnjr)K`enet?i-IYPZFXIW03xM6VlTY-<8{& zx_ncC2lZAbi24y{jFn8t2Sxw&l8;fzn~Qe@zGRIHO(_%3O`KD2PJY?U()IPozL}g{`5VZ#Dx84}QP7z}2Txm4rQX~kpShaF!1@MjbYRLoOSWI zNxYW$&YGea$Yr*;;c%sk++pTVW2&jXey<%4YKO@l=~6=&MAy1-LHFS1v|(+Vxr0|6 zs6dO1ZjZPuoF8v&qko%53c?8jW!S(7=LC?1I@$ywi%W<-!(ngbaDx^FE*# z^yXXMTf)2Mfd;qlCfvD@uc^~@&5}g57}g#v4b#dT_>Pe?=pS#@9F-2%BfZg0Scfdh zc(ZT~3M*guLX_I31y?P3Egy1)5sT5^yi)9QdIO)}ZBtZ--xZ09=)G_HW0r*(#7q7PIEVdW{jBpnl82!$vF`B)vn`hhv zRqwZv3~!|OOCIU+auSUdV`(vXGHjC?C$wD@Ejg`Od{m>^;x#!7*;$NaxPZ(ll!Mx| z7q_R179u)2G-bq6I#_misz|nN+Ai3N_?YloQSKL?9pM~#6;l&M$v5WAa)*4r2Ojn+ zkh%+dK6^r7;8m2VFzk2l?&`p#PeN1T9Wo?zh&Kj#`6rk-@(2d}cr*mO`qFv{RnjYj z_3bk8OU~F)u0?rYrTd{eHt}at6r1H5&BWugakY3F^|g(YPu(9;d`*6nO+9=1^-;vs z(qm~v>>;DuA_rP%NXO|(>`8V`GiZBnKIWqBBEumA^Yq5}!-p}a9%HTKCH}_#)>1!= zKtPF(hE3TD8czyMwT`_)KBr3@Q=F7U#R^mS^lp-q>ymFvcLShZ#hpl#WhCyUdZMs_ z=t%Hi3A@1|DwD@6aR^Xqc+tWw!?Qg=c$cHL%1>OubYS^*2T-93KzUIoV zllUBwmww0Ok4=Hfu787xV?M&c%iygjZ=a*nWH42A#IEslf4iQHAUSKFmw6;C6}D&9 zgCEF58WA5BP!;B~0Nl+f>W-`%u9nqc5b)IJTs-tVZJiAWoU<+S+ixjGTxrwWs3hv- ze0^D^s@&piaj|rX6^P7R?$7dfs_iLJOtBIXb-!eU_Dy$Q#8&#Nr|rLairk7|VcH)zNVZ$zN`ch(Si9Ix zxnya=&#%x=7oVt3NLO#>O@X4mcl(H;726}jnh%d^jA5esAI^L3{L&L@wq5cA=ytpb zlRlNuV2kUa#?W%pk<9dJF(-IyB@?Wdj{Rui+ zvC6K$!FH{9J9P^)9feUlG7dkCh_@UBlZ_TraeSpdj>X0C^>Dm;YI?R>I_5PHet0Ze zo1I1`kh3!)Q@!I^yNtsefiq1bErv^LS%1DLN$XC9ACL+69lwINUO_d~<7x604*9we zc8wD+e%CU{M)PtkFc-TaN~czv^V`<$&R-sx)B3szwO7&Hv!s>_MjqPqJjOkIrmShQ zaUcw$R|BnZblvi{nWeIDBHd>1g4q=mxXa1o|wNd1JBCRd8-s=GNQ>{+G>j( zkjCCJkQECl{`Vcy-8S-W$ffEm_!&-Q*2sMh&a{;w4>Q@9TYJeg@J&Iwx@}^x>xzL~ zbA6!v&;xRC?kg^$@X<5vls7j2@~^5kt@!SeyF!w8v4hEYUd*1D3;ZKEl?@HGvvD;d z-j`{jFmhcU9?De<-c`zNYGvd8I_Qxp=DbXI^3dvH6tgE(0q7A=K~rd>g%5DGMB2si z@>Yl=At$~BPrJx|=lwXKwsXC3ij6IjcXaXaTY% zN9G?3ELDeVWl)gflWvKx+fv~UCe;!A>_XQ$j~XaUZTkfAhgEvQ+2K5AE|qEY8cLZV zshl#nsP63Mll(7k6jG&vE?{qA+{w)1Buq^cp42l5p=ee$ zf9{b+1{IfCg`4wquV?C-2(TzpV=Y0>IiL2}I1_Ipu$7eflt&&BR~6cyYW$5`3cHTm zkn*{8+OQ`$22A`VUgcD1V`bos$PK*IVtKLFd;~h2g|+x~J1h(ozh1O1-#IDB3ydSw zzf8Kdcb?>Y&i>Vi(0URxL|)e22%tBO-YU8GOi}#JGfc~(Q$HoCGn0y zYO!1t1%t9h!TU^T6tQ)}?Ro4gsc(sF8Ldt>Vpqp(PI2XlGzTekHSjBo1szy~hP-mC z-%nu)*7F`72r0(ze5Fnst035tYN_2YszZLSyJO>IY5S@~7lCQe!5BNcQ1R^FHDvkx z!Ziynvm7w$f}cr(?Kod|VEGP5)h*&ZjFDuV#(7Jd%c5mh3@7IE9876N5w0bzJ`~ZQ zb3(fqu2G@fG8_Xbflt|_B$_F&5Ge@N2~Z}tq&*4!!Fs*>=?ge06VqPQF8Xd9F>7XA z6easCNDYL#X&V5XvWvu(4FY`CHFqC5&8%$eFeJtB&0EkL&%DieArQefT|V==B!O64 zl4WOgV4+}gfzy5C*Y*zFLZW+c*3)MKFs({xu+T2L(DgS+7IUh(5~g=4Lwynljwq9% zQ6DERKFXggiGL~c;pU5rvQj-ZW_4iq`O>}=7kJd_{6bH_tswgn>V`t?)1O><-z(b0 zXe4*P%?IPBesSQ_SulC)8M3>g+n&<_O~&U_j{M&E`|2bky|sGJYNSn zVEa8=5Qza4hdH5|r0;7cMvW)tpZzDcSL#yb=SJxF<0KjjYqt>6PA|~;+^S)EEF&in zCz#w3pSHu}-hi|E&E0;?!B+l@KTEs^V419kZaOp{;u<-`qzG z!~^>zf4Xcm+QH-aHiEbtXk0Fy0NP#=1zlKG$`-}qKj}!2OOl`cLO@-x$3P3&{q&A9 z;X7dZMYV2wMf-$u1v0_oA_1Udk^Q2!M2R}(u%v@xhLN*=Xh} zUG0Gc8R_G`4V1t|T~_n}0?A!uLtB})AU5xZ2J{BpF9S_%o8&KxCqqir0`v{umC^dX zZg~p=ORVe=!A{^5y^qn>Xe=GZPQfk@9X57oo=&CYYv6|Ggrf z=uMB*l49O?c3?J z%Tr!l@RZLkvKvbdQn!erAdHT`vrP0c_#z@#zj!=T6B)0_ux&>^xZBnsXcAGN*30yl zPPvuFNrXanq*=5ZYSc%E8~Au*cqncj{ZlcE9Up(4g~2H5BxE$aJwr82T_&Y1}6MG9}50BmG(S zk@~oL&-u9B=Pt|sVqB(UG1#{^{DdT**IY|;Pd8dV0(@LEfQO*&{B$32P?4o^VAqa; zhVOb`c0+{`L9Um96{tr{Gpks;W7l)6fcf(TXJ0|?A~DRIYhSESz>-+oWg(wK^g=kt zh&kbjB@17l{j|0Y{WP`0;>clR&#H-olwwtvRygxqZ6Bl9YE~SkLCLER_<0=F)6j^d zv~uO`_V_Xm>9Jj4#ICb3T{NBH+R@p%Mjk7=3u@&He5-n7fYn<}r>rO;3uZUq-}}9x z*DHUVEA?je+_b$0nR!&2u{zM_44%r0EL8?RGW~nRx1T*zN~4azvto;%$G~}j3P}~) zUPU6Lao9wOWS=>>nUk!p`v_}Ac(<=?GO3}xVrW85I>v|#S@eB~>i%Zdc~6JwEZ@x> zUrKHU%d^dZ(WuYi}aA*+(jf+ zwrpe!2S$wF!15+2DIb@{zbbo*oGf)=h_Pj(co|D*6P={ADx2bbF?EUctrH=aQq1Fk z5%n~3tZ0&L^=_)p*w!dD)C_6iwl%++i{&-^^k7n0;gyq_*Gm zE_@TA%K|G7Cv=cJKmP{rdRT~Dn)qnYvOT8wu#h7B9Q!F54iChwqkglmlSk1X#plxw ztd|uaY%jjdsYPGn?Y;`ltm6=bldy|q_QLB1_!e=V3{5pLRaw%aqY74U+Qv%)oU8kf zB{cu+#iCOP^Gx;IRl7}{V943TQ<4)l!{O{j^t9Wbo>8QW)PVRrevdBCnb&WI*i)q0 zKI)G&1FAHpIo8f^B!Y}uvg?ai`I@)Nc}ySoQEA3y`|NPUc=`Yzq2hu87t0=?q)`>AiuSC`;#X~2E^%vXSzl301I4xMeNyUFrp`?6;}&0EVtFVT!J z(L+nSs~QbhKkEFDXnJBM zPv@{l9?f=bRHgZnFXN%5>w?c7)H3|c!M{and$KrINwgaWL;vmi3b;={8G2lQW}b7i zQL_am@Wz~>+nMDi-kL8lD0$Pnr6f#m=y_lrO#8Qa-8z_&=|NdYG{vikwFp>W!|QhG z7DhzPQBJGaOiDO-yAE`JQc>l08f9fR2&g=>K3NOeaWB>;x|d(QfX=;@v8gy+k}viB zG$K)r#+9sFbhP#NrGWZkvJC$N4Amkx%7sp@*t70MDYb(jwcKnndBEis#ccAN^YP=_ z$~n|o+nXo_nLH=%!+3`HzwE^3`Q(w(j@;%Mt0k>x5ummu^B;BtZD`j)%1!UWss5fLO;+C)~+ zK%JZHZ3Kq(?QPzroHni4C8>j)d!}5e3Ku~oOQ1t}J!Yyw@~i^sJWcw|6H2GTvdZ2~ zM)ym$OdR9M2ZrafNUvU?iE2@E+%HsWKIxMmoSFZD1(0Z*2c^QnAT$(3UY>6&w0w*{ zAW+~7Fg%xvZAwHbPWxtElw2-|WneD+AKI+}{oGI3;d&UZ2=}7Pptoh4wJUMG;!pAy zC*sl{)hOVP@#xq71JNy4Yf*NR0t?S(?kT(f*;EHL8IV6O(%wOfA6lq}tOo_4!F5&&s}>{Ua9kh zc@D3H_$}0jF@SvLaNeytw>`=ysZcGpi4;0|?T1e35lYzf>?u)wih4 zfeSwTP9s_3T~`3)q7OQqoSW`ytcNLzA^Q*mEJ~rkdxrSmF5^vAKSte0E?2_?t1l?& zsvSfsKfuD-IFE|)6P?n6Xfi8|Nex1zLb!Ln(T`@~A*XG^kK39_b;$74FV&oB1$fxV2SWF$2@Y91o2zb4qCdd%*vy?4I%3N~W z{SZ_#X`_vFr*rWIM}1%a`B9TUz=?9U(~Z6`U^uSjGQ&hBe@R_|QQtE=CX8edK^qZ! z=gJEhnB+a}DKXPr3T;|4FmQJhtmbl!o7hPk+|)1ki@Wm`JuxDE`X}zRAx?mkmC|WA zV8tr6sT!<8&h4M;Bp%%qSF%$NtW3=dyFjM;r8{@mrl3+a{W4?w9!9JmcBEjEZ8gs` zKvv_BH{fJQdqYf_->h2#Z0miMwsMVaettZ|l>?#!j#FRbJAmq-*Crd0f&gyZRVcX= z?hY3L0cp5)4(`%?Ac3XlqFTRt&H)05#5*|Z*Mf^ZpU(IqxMLyw}KHmND;1D6?a4Tc8`_eHm$2^PY7(q&G?5ais6U#mcV+PIH4okKm(C2sX>H+Ms@EmgIVH-N=RumIC&J6!5 zd(m+|gAe4znaPf_#Vop@Hxwj8YV|>SL?eCHqTLOD+I!KPA zdK*_gX7sAccv#)Fo2;6}PlWI9*%(p;FBOTAO=hbEAg{_$cQ;7V_;Q5)-(q&)>^ zWCYsI2`D~0?!>~4{V%&1c~+Vcv{8zT0S&b=#}`Hh#B5hru>dqft<1qi^T^k*tK+}n zhv9XA{WOcHS(gha1%?qph4nbD=c;c0;JS+>!CMkm0{6xl9sEJs#`2iE2t4*reo_1r zE|5dV#21lb1)X@y^*9i-3xA3%-#Ht?yZsM(8=0CKj~2bkD%QOEk_J1L+ZE#*>(fT| z#__*N4fC}P^`?(Z>E7w{#{E|`Z+;lMzT>x}dPb2yZwMO-7+k zf!_kvvWU-pQ&ZL3oH0%i9)?Rej^1@y%?aI3+*a%xXXL5om4I?@1tt6tSZg{LH{s!FlJK1R#SxDife7Ws;@qq9*+kYrg)~!baFB8)3kQ5<5G6f zp%=&j2JWAUGI?ESaAwvXZ(_~cVy&b`et=p{jvc_t?bkOw0^_J4Cj$$n90tHnIMX8r zg0aLq{;0Oidd;72ZgLmhN1{(OFg^b`0w=)DV17z}r{+H{*Fl7#ol{zxR=Q6)k#NcP{DFn-l_ zO$IMYO?J?EMSUfVkhB3o)PCI(0YOnzDE<=-0zbJDjF5Yci~9*?ot<3K|4Qthma~72 z3d#0f7IB2zjAZFoK=z@OW(0EAD3t3`!lKD^^Pj)|@4##R0mRVA52ZZnv53PJ>OqeO z%m*flBW-eg6(kAlEqWf|I`j^FN4ZRDc7Bx#!Pzo0O+FK`dNL#gDvF5#quuNAcs`otb{mKg+?quL#C-$6*OjYS zkMNc2L+buLCM|VES`zkK9!xxKD{(2ObLf~acrx2Q{4i8skP-w1AN~>=J@#nUHk}}J z`pAFcK30@Cu;h&&EU73O|G}p{|WS%U-wW;J)RZmMwO=?JiL_`a@7kioSl{kr6){O^UnZsEGv zEB`-`>AbJRzv9R87&cY-k_uV>dY?}~@MuZsKEprNw%mO?i3o!1_tQ)M!6OkQ%6}pv z$Q44X{OblmU@Q0RU(d%}*A+^{O_gr2UJo-j@EY>iDg3Pe9)ImI9u#}>k3?&}>U?Cj zy6td-;M=v+|L(K1f4}zlXA-@yo>7~bZ`<4;pdq<#Z!5u!yR&;@^dM=MR4&E~1a`uG2##9WTHCaFA$_ za}=y!aV8~eVD^a{c6r!SRxTAd5v%)OMD2ImSx@=hiJP~c-;{7@JNwdeIHbNm8~DG) z+M?I#$i<|n0?!%wIGmMht;e=zPeP$O_4O87VsIetY=Ah<*YzHM7HCwLnwCnwk=+Ky zF2Zwoa|}6E0`b#|Y1WMd>vc7l?x&~eaj~1?8KSKMeId4Gmve(KDYR_sd)^vj6RL)M&Z#P6>}RghL0CrTC<@91idlWcC1$e*T{x5L?z^5 z^`hmZIUZ1y=R?3c7A6hyaNP}Ae9HI$%S+Jd^AGmKZZ*d*aB*o|e7Egwqw2RK-j}eK zM|*rCq8&S&}rQ&g0|BJo%3~Q?E-UovqVi%DnRf>RglwJal^eQ5~N|73n-iu-ZLJ{dTNR{3} zN(d;SO78@S(p%_+5+HNJ^S)o^n(P0cYi2&ohu`@ENls4A*?aA^*S_z2txdI2+T<*_ z!Cw7%EetR zO8y_m00NR@2C{g2IsCo^u)W}@4CF0*L>Y= z_7Fcdv-6k^B9-sfvbGGPw9WAEuW0P;^XpcN_;uIUyz&>;g^QpNym&%p@qwVNItD;W zs+&v!6_CI3UwMN1#rL5|sx*Y0T%91}T_$F73XF4q`F@1QQUu^lv}8U{c>~zVLiyxan;EBK_?;S6`M<Tpb-xti`MMGNVfWrI<%QjyHh=-Q+CNGb`H@bdmVE{W1Wd?_ zYlwnf{-G7c;bAgI5Y4TBfjZ?c@;f|=b{P0}b4MEMcagca{$u*Kk#6#l%q1P#mcY&o zzl#~=FCCnrY=D6=xLWs4D7A{*H|L_I3a=!)m8N+6R4Z~`UBm#-gxWGUVcK)|@1{^Q zY7sfjq=9&02+*%|8;wHah%tIxNSoqZf$g21sm<6t>}aY0V>fK@d;?Gdl=y7!c1957 zguT|oU6z5kO0~zzP0f>y7Sky27-_cgU)g3i;Ks|2WK)m zbul@wzT$6qrF2ru-s2v3ThyWC7)S#Qw`-u8#=xe@6pB>P;AcO(}FqqoCPW3sGogrE=hVYTWX@Wp%B+)%#&1P%a#qKdhw)wh83$nojb(V%|c|2_{Qzb?XqXbuG=x9m#w)=Yg zMN$jnqLfVnHyq8&r6%SB`X>e>+6_+{DKN*I?gLzWfZt-BV}g-`1vR#P%CyA+FA|UR z%pURhT#3(EXFrYG^Lwje#t*2zzV|pPh%V6vLt{TSZ8xIA{2Yam&KDN|jHBRs{Ak;v;HEPO#lK! z=7YR)ZnG3(LXsFQei8Reku+W*>)eXz!p>&!DH=u-`{kNiujP{>is*BBRO=g(MVbAR zfjc)1^uia?j-tK2bQJ|1ik^t+TW@S#E*B1miXz#4^lbpiv*Xr?T`2rS#{1#z#NGns z$VTalNv%kqKEg7?2G?EdNd50*)vm$;NVQ13>nEM|mu+cAeOda8@crGd z`~38=ulfgInjPG5J~8| zUS5&8m9k&71&fZ+)*+XVv{(daKf88xlgfKa!=^C5;$g1qdbh47G@X>N zO&c_wszZ1bIbN;hMIl?13_b4Sz>JWR*`S!C1|zDa``uH@`JGxM<0(dhsRGoP-3nIl zq+Q$)qhBeS#x-94%A@hn$ZM?gwima-4hPp%(vt*{rhJMl8DH3A=7pDJjsZnKtw<4P z{yr~9TQ#VP%4065x$X;Q#>yS50xS&j2Th15|${!VWTGsY|Lt$9GdwXkpNXUpsz zb#D9qT$4oO=fbSQ4j=D38nN{b;}$rkjas7YdIkR}r@kwFwo{>B5W58$EWeyZ<5?^c zuF+1IyTI${A}lOPa#_eI!Q_KI3ZOFjW>unYABecX!|*6gOG)w{&_BjEej>g0TL0P( z9RIVVXW7_vcFf|FbZwCZ*w%Z5rE>6z>zCfp7Osk9HMuDt(;NRJ5`X!7R&FN7r*U*C z50=hPO?47XWsVlk?Bds|rd&$l$lnuE!LZydQVdjpCny;A#aWR5;jJ$Zkc4yAkBxS? zaRi_0BpCBtTkn-yaHE4((P+?dZ)?qUOxGfz{O3kXSjmiH!6)o%Sd%_!AX(vcce4R1 zypZyG?)McFHlA#a4zg?-Bt`glWgbt}2S|_96Xh}*OoA3Kb>Ke-*G^UvC>|pRp9T9G zLuHQhzt#TEo?YsmvqR|u`+R$DiT^UAfThK}jga9|bj;fqz)E6+dG)CuQ0Xx>d$J9|gr=zcOYLaKuk=FylQg4sh=h9frA%9GA2>LQE{na2bAa$_vOS zeqba2;8?Gy$VMB@l*+38C5O z`rszy4kVjA9Km*=#wMhaWL1dvr3B~>$q&DB__2UY_>x?Lk0krhIwAElEtZnLFW|;Q z9ea>G5h|6ETwOYDEn#m!VCd;&<(u*hAmD)z@*8h}aMA^{D*V0DIw{$K&y8cl?fscnfx+1HBY4bXn80OP6pIF!M}4fz$0G z`;EOJCD*x{v}rzUwF6#>HTc*9CXJ;Zsf+m5uBm=P(<#13!$hymU#b{^^n2I+_cQ%; zmD&9Mp3p#?d4m_LVvci;`IBuPz`#*k}GPgNm9qThCE3b=|~o zV>j0x&_v1FZa!yQG`iZz!f8R>9vEx)m-Yx> z$v&BO1j0H2rw6i`Zyl)rL}mFk9oF_t*H+qTkuz)Ll=nb*u!7;t0mZ@&mgcNvuxW#M zm8Qc9mI^b^0Ktz&WvDs>XDbTVvP2-RXgZlAz`vOFK=tNl|EzZ%1!w)RX@ejkH>n;F zw1(s>>gn#gI<=p4WGMdvdeTv^_=TJ1JMWjbW2E-%mQJVwx8O&!6Y9;20D`Vmdb*9n z?|fd~-Y5Yy>*rzT>dSYdBs*N=ooOJafwWNmXq}~kpl`#@H z@8t%D6=%MD`^c6zp@;a&hR1^5FfMu&OB0>F*fF z31IE?8a4*y+#V|1AO-2j5s--|@-Mz8A=i7gY?3@xD`ryJukQVMmB1^4YNk~_J3l|F zzZDJnA%_d>nW&7&HD`PfnX6C*h`4KR&q+%*mNqTEBH1_Uj(c2g;*UuzPis1%Yc$d+ zirWjzHT5pkY*$Z^B174?zZQI@wdS*TXxx*-B%$#<(WM}cSHuxfs{9A2G_X?tE41fC z22d2@EPPJR9Fkr+2n#)m%2r;{tcO%OvGk7>1@gvNj2NyU7C}15-U{Lv87A)* zDIYNuTUti$zb#q5vG9Z=ZXdf>NTKBr`LZ7@c^aj4u~Es3+diX@#Lhtw(~#_D)r%cD zw&70P-%vNWJpSkxoeN<7g1Vc(Q=WciZ`ofMhzo~@RYkKIr$&fqj3l?OKq@XykzOv- zbyeUndE0ok_0VEKN!~-Cf32qAXEyvB26`X?&VOeIOA>81tqvg;uI@Nz6y~h13_aoe z?vxPyHjJFiex2foN^%MZw(>qg|F^`u_iSE(Cm**PIs`K26LaEQv* zDt;)(zzY2ReN=mPp&X5TRp;silC>qQJzhM@>~f~g-B`(0srOT{9MvX~izCLO5PC`m zjDc6xqiY_|GBKT6Jza~_x@rIv#gQm!>;VWDav%|_CnwqJ;ZW&vKSu0E4UHd-MTQ8g zt2?UMb)(EoUnJo!Q?4J^C&f^Juf!O1^0MEwg1w|wd|#5*?mMa`lkxhiVjfbtEm=ZP z(KLzTWDQ@OPZJq93kcPo<#R>HhUji>^ zPA`|@{s*-ZVUcldV?y%WYgmGoE}hO(Gyju>1YEinYh(8(x>{3z7pcX&OzlP=tvqoI z-VX?C!VW#`G$bZk=fP)XzNMT)ASuDF`izx4d7XXSnm)!qIS*@Wiv=?HW>}`n|)7vh$0hMoqifonK7PLdOvoeX|MWDZ%>#63zv>dyu7s zOu7?loWAfW^MpoVOuh5{&$IDu)~hS-3E||Jrx~cBJBWbsDTa;n3-H;uB{a)g{C!#i z=u)QWRD0jiLZON~oXh_%u)LWk1axPS29le`=D5?aAm_s|GeGX*KVd%MgZ4T2s0&z} zQ_WvRtGQ(gwanE9Gt1k(CT67NzK4x{XsZVk@=~|r?i;)IsV}(#i#PAt7+ z{pQFM8d31as;9zwd-jMv3A4-^lr1&ijd#Yf^P>ZLDy7Kihz2-UyjV^WOBy;J_Mv-; z#x-$=Ik2-_47yXTC1(FfDg3`$fRh&eaI1ldo|K+K6&%LIW**6z%{Kkl-dqe`Ij74# zWTqu{7{6@Z%X*EF1ONyZJWJ~+QB%GHvk_4%&Svz7yE#f{(sR@*Wo%z*xl#@ZZip>C z;#;5$_IN?D8LaqEULbVB1klLw#;gsy1i&kqc1JYOdLrb&IDN?p?%;%a<)pLN13Y{j zO-fQshyTdA#_F(r|HZYLm`4B8xt31~!BXh9xybo_~bx185 zj5tM2JVT?`_gQxnjz0Se@dHizPsx}}d))#}oEgRIA?&*QqtrWvd@Xvp(`T_#Ewk zMGP@ze2Kb<42+G`KTA!aq71fq zrxnzn(t;;U@#b)SMvyuSfen&nQhql?rl%Ofn_nBjY8uoSRH zS~!&GC%lJ|uSS5-gn5V71KK)`ObRL$*D%p0-@z!I=aE z0-Ho3C>k#6rH4yYj`i(+;=aRc@miSzEL`;)d`-`YyR`eskNYRe!n2mW%W)SK%$@;e z;i)BKouU5{OKumchp() z@$c?}Xqt0c*8II7ss7sAqCS|4LK-Xd-h@0jmZP*Mn-?p=;-1YYLssdf#}@MvJPd)$ zqjhTY4N9h{MtJi5x+f@#@1MK!-B%rme(aB(*{p_d z>LE*oSc1;D=R!V@7|n=flno^FiR&5AV8Grw@4p~lOex6L^VB7AK(qPw{&*X**|Aud z*Jemf&e}`H<)xdfj&{t`oPLYaIA}QS%2w+9@j0?y`9b=HOM$TB;$nETUUqOdMXpV3 zO@weM0rr3>y;hv({QA^)k5iFsDNvPd$T(25L^t_pVMugV1iwsPo+9r4rZZP9KvNey z)-5j+aPN-HPL^ecewj`>fK|jam}RHum{|gIMYcxln9Ce9!R17JM%X)hud->_u? zDLSxVfL5il4OoNreSTsDM~tP~Ro3dGVN)*9SmO`2Al%b(>lZ$9g@AYrkRmu>pv zM&b(t@1HOzQOR3~tQU{PozIdqSq0D4o!@~F|A2Re<`tJ!t%rGQPKb=VtUQV1=pUmw zq{z7-Xu6TaH$Q6ypQh@U8#`58fV~n-!n{2GimwRYKLDqI5d;J>H8@S$aXf6u_yoto zMV;d|Prp&qqLXfAzuu^KJyNU;AOwm8e;yF>Dkjlp_1*bVh^RMgfMo@Ik*96f3Yha5 zRf~5StD7EEyMI2dtwcXX13%q2Kg(X(iwuq-&+^CADG?IDL^k(xm}Y%)q9S^SD=!iU(RuYpddB2mleX7$?udvB3q$l@WbN~5#P#%?EmnCwPOT@)O^m7gfd95iYz%u;o_m3iHFyqO2` zBWYK9>Oh=tRFaa|A2k%sNerU7WFak>+fya%B`TAhD|GG`XtF$_9Kn>fOhY9e&#@52 zDZ;Ls5L;COxRnz}Bdh0)*rqfqTQFF9dry6=`mNB{*dA$mk)} z${>v|Vit&Vx{dF^o&D!)A%-<}+Pi=cfC94J;LFk!Kng#%o|%2#J7Y;8y!j3$ z#IJ zTJXNmAql9J`J{KA9SOUr`R)Uxw2n&3!i=3801bfI+0Xftr}~*S3{klgzhchJ7hYeN z1rxO%ym62RC{EQ#k~k9LWSLCg<&^oq1O-7oLR#7$$8()@r1#YU1xTHVu)4SvpL|FA z{w)i?aONWz6TUZh(_Q^DCveVyH5NFB|MHv%Z5knK_G`lhk8Kc1KQvowgbmM0KqI|3 z)&UAwZrCxzy(5x#`kH`1BJT#;rk!I$?o*x?mP*+>!(tG4nq;8F2S8y*6v}JX8^bO{XYtTcf6o!*9^cm)d{wlPb8=M z@9XcEsZ~0%t@lF!fCk`cH3^?T4*A0l!u%jS&K-jN(Gb5=|M&c4Bf=vOvbX)`^(y%C z_4|;=t)TU98{WWAtOgU_`a(WRLi6_NG*in4U?&HcynZXiC<$|6Pv~VknfDe-0yiFF ztKv%p$SMdEFR@KWZI>Hl3N}Z!$1~(|EfotEyhv+ z9>3`}DNt}7FxL620QLV8dkk3X6Fnmpp5_HNO!=H{q_VnxKZ|8DMmQzVZJScl-ahGT{HDeX)4YYuH%x|*bZeYM9>2Ucj-kz>J>m`9Zs3UhLML%LO^*HED9+;Q$6KJ*tfrMY z^d%dQdTHPuC48CboLt>s{J6Hp@tP4`pCD6DMx$KfWI>1z1j0n`&?KO7c zdNYu!OCRt@Zo~o2@sAnoFM!U;{$nkh4q(%L#L{P9jt)HrhnxuoQY2cO32qqpf@w+3 zd_8+@P_m!sxZGXZqp1u7qG7SUL;bprgTHUZyOxh?_* z(D(WGP{i~Zel3v<2XIi&g3$nFc_%=&+64Ar?SxPsuDu;nlLFJS8{{Awp#!%TnQqhuUm{aP(PP@VN2^%IDWB34!!(pBf*-v9_j%3jhnea;h5Y zh#Ha;Y!t|^%9*n?`lX!7A^6gf2S7-UI+TA_`2!VH=7AvR7M(9uP8SuwnG{CR{t#Mg zei6~(`|vz4UebyhA{vD)a_9tsC@z6Yq0;h;RxQZWu>51e)>;w869H!Jx=*D2fLu;q z{^}8gh9Ns317B$_BBI5-2meUqsGxleM+Kk_y|F(6zI2zF4NOyC?=F>Q}ocBwr_PY;j-+J+x zysyt5dfoWIp!%rY?Pf2TDec>s&6H#%?n7BgY51SD8q1}g&7*K*_03lT?tr}7e&{Q5 zYC9G)w))i@2}7q~SJ!bmOf&UScKex9{bh~VR4h%j+cHz(4L!SW5IzwXGeF?j7XiP8i_5}|ZtJdJS7 zUUC77yDROs0eDHIZzfv~piWbW@doOlC=hQo-qj^gsBH}EQ#t1#T?nrDI)^bo$d z*SqdeV3cuwzHNiKhuh?a;Vng6hVKR+nA6p`Na5#LV~V&y_x69Cof|}Vya)xi*c2>@L1K;Hi>LjbB9C1>Y|3j>}S(oa|9iK_==&xoi^ex6dG5Dp`v1D zmgY)aoiEYhR$5{$i@OcK%3Msh(fHG)^29TlSCXRRRp8=q8xz+tAcf+Z6>TSDp!%5m ztMmn#-IS4P3{O2n!ULhOh30#0-37}7{Qh%*I9#i%jJMWFM}N9>*jsX(^?mJ_^X7Mt zt@1kF-3+k>HP}E<%>HxhSxP)Sabqqf*vG7UU#sRwA<1MW4|^4~XTPJ;3ER=d0n)s8 zo6E)*UoH-k5Z1gqnZNF6S&7i<)CyZ>?IOzYo>>3pqud3p$v?t^oJT4Afsf92fh;2* zXJ2FE(}h{@0=gi4(?K2lNVBxG6f{HWf;VocgP-*n zPT5joM+rvsZAss;sxog3NXO?O6ajvxZ| z>DcQ9OHp{l1q_`_NNkx7sO}T-ks-~E0iU#20X7ocO_`JgDfqc-Y!F1k&>MIyyY%98 z(#pOA+$=0CDw7rEyt#CLsgq!5aCZBGH1-eat`T8)vvvb;BtqviDQ zspIt5p&Z4$KZ0nTt6i&JKgQ{O7_pRMPpM^rcaD%BG_vQO@M@lKW|BWqp%C z-R^;y!($lwT*NVn>|ugLFw$23Ud_zOw+h~+{&&I6xH9bib0^2Y27G7mR3G%WYfM#h zmGti#Twv!J2TUtL2sMncW_sxSr=-t}nQ6;_Uh*M0D4@HJ2y|K&wMhqfK(wB*v*E6^ zU@LtJ2pN`jrzwmAe!Q!#MZc{+P>|V>bk<^m_It@lis%qvf3(qj6Eveyi4M?i(qODx>ofDY8wo z8Pvj0G9})~wd0`mO%<4x^VPG)iD!w%UGr;`b$M9xUDvqrt28~O=AB1MZ&Z~G2MeF; zDHbkKPZv&KgsDgWw51%+d1b8drz{;{bkP%%i4jMpo!c+1vlEO8GG+RQ8{1Ci)f2l! zHdM$<_?=kW=kXVxwNOqx-#)WJuhET6vafX=PpOxC{Gn2Hg(d#~pJTezI zB;M$H7R;B_{Pgp1S~=cQY^{s`DV(<;^SxlU|1_prRE$6AR8z4@e%wIGRlV~lXSxAg zit7)&;5IL6P>?k1?FqMuT)p=!X0s+5S2Zf3fa?&iGIO1asf$?<2~rfd29&|BH-U<= z9{<#y7-aLjmMeUziL}YGWIk;Zzgw3Ci4d}$FyDu69?_ghZLYFbqq!4?)fD6+-}{_* zYDxIQU%Cj&nn=++WUqS?_=amY^QWv`;a+5dstYAlZj2MH|Dwp++%=`kr#)n4mr1Ow z>=5&P+U*~ba6SqA``dGLQyN#bMarxi8fe=2NK7pMG#Oq06}{Dri@^kkzr(o%V16IU zfTwxhD}FrJ517fl)7JTNL%%u0bq0xm9+}?S(VMP!J$rEX!$cL>L0r)i&Kg=^wN`a( zybJQSjgB?Y+jZ3|HGSxruJA@fE`XX&I@pBQ4ACcoc~_RetygvwJs-$mx%F!v8{@9D zTRHBUSvkM0dO59#1vdvG&H+CzQHNTCi9z6ws3YH(fGn<=!^E=n=F*V;n_~?*wdv z2TZrmUYJZ*1WE^=7h`2@1I#+z)x~$kKUx(WKP@snvTTYtvPx%_2*N{;Jkx(|@VZV7 zLHS!I^Nxr?(pm&1v_~kz++Ly+h@W)U)?CCfwAJv|DUx3JYW?icq2zB?&X?(d6rrCP zuIX4wTQb+ZO$s2PUGEMGmsNJP$R4G)A-4#7*ENY%-SXdghdqp{i#YN~M?IF2d>@AC zmD~o4cD*lB%3Er$doTklMSYrb6TGGsp!oY8mE5~%7=`;C%Da5vz18N%aeh+R&1ipg zC0#(!<^WA=%js}$wNfWYZdca(_kym2ZiTo z+mPL(tnr2NCZu@%D7FK!u#HSnJ4#6PFMZzR*_{8%v0g!qsvgg{^8Mw02omkwc=2g- z=EYf{GP@9cj;SPR+dm{J5fcmf;F+0HUdiSLamP5jwB*iGs~tY9C&|D~4Bg86=&7i~ zhvIJ5_0ANaK_4LktUwn}XUBuRE4e*$QBIwR7+gx=yu(KCdrWR)PEA}+KFBrmh^Z~r z=qcaDSr;n?(TUY<906YuOduVw>Q8w89POz*HGvFqx#dPh`g#Q{jmW__NK`#T|q?i(J@ut!g`+$)9Rq$+9)Wa#~1fkmb(-%+tE5*K>WBdbmzzFVH-y_p0H#2R74aJdMlacO|{ZkDxmvBz%%u9a@YdFcr80l7hu z^>iI-oU%QlZP5T`mxTE3&o-<50JIjF;gvo&$4CAp{Lc##-g+2z*~zTY0rJqM?FLal zC$HC7?L@A$H(J^sKiaLc&No19$gI@|gJIH?@JGQTaa!l4WeXzH)n9ozG@XL$teO;< zi}D@>o;Wi%k7?20KQ*_LrCBMImzI{3^^Lj`Fb*J-!0w0(MXdVv}$^VfZu3X z%5Gi8ofq|@9`+XXdgLbDt7Q!?mM-Cfw}=R|D;>P^4BXk^$o=4=52Q?sfqH4kHA@r^zv6-XB5TT zpnMHKdOIPt*b-p@YIjplyDyG$jX9n%lEQ}cLX>E+|Qb@v$|35>-|L`7s4T%j{!=TixGZ(>LIQ|&`6Uf#iNXcboQ4P6R*;^*5657K%V#`E z=HkVc0_>z;t-u~4A+Ne}kGIY7PkNWvkHtT>8c1b7u;{$?-3RZB#>q7#H7;|Uxl5s!AJf1Nj$JyOdpAbyRUiavb8cWnX)acf?? zlA2p@9VW6?hJka7H% zVp@$%(H=Q}PT#3O&qSROEQdq;?UQ~`W!Y#HBh%~hi*mP$H{&JAMqs0Y8SW7UfU+(Z z(yJfPXV_0zQH3wX1~U-zd!akP&QQMW+a)n_(_2CdOkQh=CoU18j)E~S*aaueRBkm> zlR~^RW#9w0OlLbv_^}KB5}arYS$F#Af3*N!Z@OPX1;5X54n5utTT-y#7P`%UcA|j6 zh~TIv^kxPGWf^09f^P+R|9%p_nRh&MZ|NR1)FMx)zG{v8ZvJ_im$<*h<^sdyCkQ1`cxt z?6>=cqJ}-Mx;i%>{Di8$`K|CazZzITIp8E&Lrm;tiWObVz1Jq4m&&*fYm5VuZmfJJ z3(4H=)+#`sUvyxFYFz``z2T#RCQ^5e#dkBJ+#+UuonwH=%KaY`=z^5KYTl+Yh#4;>qje6c_sUQzWl?&zYXo3Wm^xrXSuR zp&n?UNa0VIV+t)w_cZRUxy%W-sT>X~S~vR4u-qP`w*n-nXc*x(uk&QQ^E|4An|CSr{eLP2{`UdG}yz z3*FP`cHzC6f%MEkCaBA;LS0v^VIF8an;nV@j&VnZ+qAg563c1*9=Q%Wxb&?ra%k)# ztGtoKnApQ1K?{L=ySJiSVcVQCEAL@u1|zK|u6pVumX@;R>1!@i-_BFWUd|dmR=yt$ zKK)?@RI6r6!HVyMGY8r-oJgJ)tjk#PVl7zT;fi%Qd5Wj z4ID=cHFBRj;nd7yS&X|s9(ttzWMPuB628>qlGvjdc|VEaX_zI9N*;wgYN#mBv34Yp z+DOT99GLZXL0@ydIO%Ox8rGC-p^^{Z%={-&`}gcCAJg3i*O^I;kr}XbI$z_#{NWX! z406oH(B0r%=`Ko~aFquEZ=4eUv17WrepJgLoIQJErKo00F}#bE_cvZ&D#k)C9V)>n z$}n*58XaE8Cv!yIQeJqI=x=gPnSs|r2VkH{%e?W%kyTMhcTmv$Q(zzGyHqQ`6)`Ja z27EH$_CwLC6;Q~yt_nd;5b{J7jU`&QwD0OwP9@@3~*)?i<0!h^SYQA~DmBHHv%nBH{yOlV3ZkYHj zIsiMk`OsA(e1W-)`s4Xa%=EpL>}ZKhoRwih)%tuBDkbD?bHPGG$+4ud6tw{f?&eB^ zDz1TJz!)Tp&Upqf?xT-LyRAaDnzzrhHfPKQeeerRnfhLH88yzW7dZ5ZKP^1USdMNbq`%nuKMd-2zvO^T8~>Rxd3$QrZvC04 z(inQ|YLfVJvd#ew?Ps(_x@#!Vc`l1V;_aZvGDz1~Kr_C;_)}vTaE(Bj_P^=+_Dlfa zmNjNZy>WnfiWs`sR$b{(y|MCrZ$s#{X`RUlhMP|VMVn!I6un)X7wBjYBv)KOZOYlN zy28V4DA5+$C70049TOm!V~;`1??2CTS4i*e;Vt+P>6qSWnbyO#xiT+Qb-4Z`GcAg4 zVhzZU_Up_7kcJIi$X$Txqne^e#%(20yi4~Z{b6+xe{Dr7`EojQ5eyOW+>6H!gf}Qz zwiI$+)$PsLXIL33I%t_J!!ZU}z{PDWWw(KKv6lpBT)P1hsh($0{tv1n#I4pQ(HNbK zE8%|k(Qo`wo$bZQel?oaF@O9p@_s_BHYLgg^VGoPK){p@#+VhBtoA0g>bW5z?EDhKm!YR(p(7;qXKwbA` zui%_^p$Kn$rkZC^@XMhK9?ruSqyDHv`sWEAhxEDwyHnb{D{+=%bq(4Wy><7O8R$GW zn0COXhnHk8yd`TC*OQTS6Q#4=0+g=9>2KqRLgqN`0qFvu438DlU?=`r8d^yp{(F~C z0;Juy(*w&H(4Y!ys*?56gje7O-`WC4MhPttxx~a0@&tiHmJecGf93MuFG_^v58+t+ zN{F8cM+4jC)d}Za2k2wM@kQ-_dD`ttV<6-E`}DM4ZbGqMfo}0cuD*GoaH%P7n3Px0 zZjib28c0?Xi6?^IW|HB#%`_LUSX-C-=s7700}^Kjeyug6`c2<-&D){j8i%p{J zx4^@kMc|n_7Cus&sV|5yWEd$%SJV@oisz97zxCGP_IrTY7J%>daNGagR~u2|hi{UB zR#!*}yz`4}`fO(4X~yIQoTm0fFeHNmgeMWmDtSOc49Ze0)+-%)1v*a`zdTv5w9G}o zYA{Rg&OK0w^JvnFwXO;%3r_(MHx{ym-dTC08&?5Z&0!*m*c7w~BQz6nPuA!mvmS4# z_qE-7nj$$oMg#`(q99Kv;Nyfi!WWj+zfg5pD(VCkko)y zdH%g#)?box(CSUX&oHmt`UmJoffs~EkOea*Uj?psNO-;wGnOBO7qe=FpKc77CG6#P zz;}r)TxsJ2UaU3|u8^hp-VAs#i1_y*N6CBdA725U=RyPcUdTI}7fYp-XM{J-?p?MT z7v(jI%hv(ZT|qz@1ZMI*!l&;Dvrh<-&0yA(TA&v}Au}%?k`vxIuE?+PJ4`(kF?fQo3}Vg0r|-Hv7Nsf(>JnU|MrSK?NoYd+SOmc2TnOrBC0t?#x?h4 z!GvMa8uHY6^YMG&oAH!#6|QN~n$JJo8dv^rZ@>L?hv91-4VbSM{zItLs8*uX2>uv; zx?XILnNF(84?|ncRcuz4xte(<17o5i%M*|AKOEB^E>^$~L4~HZ?+6OD0o&K@$z47P zcMn?!p_98f2v$ir{x{wEf3w&B=QN-x{~wH&|7o}XX}ABiKmGs0LLORP&Yr%z#}rz* z3Q+2TI%?GL-cs+#UR_;HGsM>c3hPA;XCtBG(i4f}C8lu@&ym6W(dp@zRaa9}Kjn=l zCO-4}ojf`{oC-+s;?8BfeoxlyAFM^w0TZ|;!4rd4_o<|+nE~xW%Hb6g$MKTxE5AZXQ(gcD6rY(Pdc;?v?|IEHvWi3i4KQ}RP_#Lokrr-E~;wL~T1Ug6@ za~#jTdXp+wi7_LIKo;=$bH6txUyS&puSHt_&<0@Q^E13=1ToDEnnJ)l=NEe!2n@2a zWKr7OWcA-zv!%-A$P5s|oqzkhvg~)Q*|*7lEsGeP;)SwNoPIN$D^sBeOo^BH8))z? z`Jaf^3Dy{yQ=|L|5Sh=|ys>SNG_b!6@##gx70}{`f3I!>+<;U0CEDzdKVQR2ZV!I9 zk)LW$`OKI&S9c^6=yncFobs2A@miNSZFuxeMH(L@5@5}{&Y>!)4 zKpw=G^DA?;Utj9M;7r3>I6^vhS?ZZ+-vzSvJo|NB$}_H;&b5(FDgd)zXm6+E0D-9d z0(xE0aIlzNSXj99DD&7jp0i}4uYT_9RZ^IF4d=}Vif?8{Zc=$jusV-#7FWTP7zCff zFFeaP{H#Er3dYOH#R3$OH9?`(qBkw@UTpX2dnsZSR}f?~xzcc_Brh*d+L-6P4Y>iz zKSsK^PPOJWNjr-G6$1TsVSC-V8+N|>v*s5Tg_F1fdiLeA2Nqw&&q9SheFSM(3rL^; ze!uB*G~*2ec0?+Px75xz)ETKbtonTeP#_rfT(K*i+SgXx%~stWYKh)VsQ55xV@842z0tz7wQ!f{HUwPy1qtMFz-r^kI{F>xD%RNfD?|>r!yaHgCv}s0) zb-Ay9&2MYiPd0+a2J^p7ZBL=+8@_F1GKrL&@27sc(dLPmP!L%~9i{&!?E= zEqLC)-kl7Zezp%K0uh^CMx-JA;eV7#8nbg>Tl*faWa*P=)+Gx(f>a;oK70N17;B+V zqUXcAT4%SLJ#pm?f1M3NNu_rQ(p$a4@^+k>7zTj=K(fh# z#GeW0rr%vx7^>i>EogLrPO30&-AsD_ry$mXKwe5_&y_9>TESbhk+K0D@Vy@xP&LoV3^{y^f; z_u6KY`7|Da%b&H~Of@nxdf3u(P{JB5-nc2~`!_ffX5*OWnF5WGI<;$DY4NXy&8DbO zbxvwZY9?`!f)0$IZ%P2Iw^sr{o3rltK*Pa5fWzI4{i9FPU}S7O@}aL2XuysFQO%Up ze9g>ex%_c)uvEQ{Tt!ZFa>^S(?BT?I^B3mF&F}62- zdlc&%lPi9AKx3aV@ENaBGiUExrw??_XQo(X1;fwe^u(Z5{>zECD}yi@rMa9ur#enO zhdMTS?q^$@k~FX!*CIb$x9?fxvNzDt89P$AxA_xxUQ=dsJ!Huka7ABH_50D1x-(mq zRvp%zucdCV{Gnq9Go^^~OT#VXp7(Hdcylo#nlC2oSJou+h_SQ!w3?u-0Ucm<0rXxN zPx4RMKyR-2XEPUlBLFm~KG4H3UOdNaU_Jj^YO|sSLx*0p=&PjAlFqYE`Nhrue-QQF z@l^l+`?w+$5+ysu%U)$>9TX~i@693eWM>>gM%jChaBRmuHX(Z)n`2huIF6A$j`4l! zef#`=|DC_i?fF>u`*mIS)m}FQzDsiOQ{Kj!1x~sYXxnh-d)^~sg70}e#(MaaFWB`fWUGSj``JDw;O2{X<1b9c*xZTexq|#y zG0P~ruw#AEKAD(WCOF{-bBMEx`!S4izE&u|GAKSLuF7k4`9N5hLVwl4h zU7CPNwF2%fD1tN&lDb#P{=i7l8tHtaXZBRJr{}(MVNB#wErGwbYsf$>WrBP zF#X`)Gn-1}_|wP!>O#ojSjQlA^?0)IXv1Y}W+r)k7|MZjHt}35=L=XaVGrP8^f(=! zT3lR=JpxYnf4uX&?gnPqn0Yz9CPYgB7-JanXl)Vb)Q|jyjy@{N(MHjLo#z)KnMV;5qif+Ylw_t66W%Mb1Uz)&V-};L_AY zy0{>g^?0n?t+we*{NK?XFI!bQBijk^I7H+efa4llu>5pc2-E^ULz%_xQ5|q^16B?& z2M|?WUS6o>HK^mgMh`k8J@jaC;#OVJW4sxI5Z74v^nq-XJnW54! zbON3jc#Rwvk!pqcdBR}o;$#aLi1RMm92c1heqIv<&qz8{r|7n2O*h`B9p-<>*zgr^ z?x>^fS(e)ld2?MVM~~-5XIKI7PWf+6&}^qJKpMSucre6Q@&8|sqd9TeeECB3^sMP* zNhFd#dk^LQ<69Vt9Z#m46off_*j_3I;J){DN!)scIcENL;%iz(Fp1rBt0HNs+hzcE zm^lHT;>T*z^*s#!qh`tP-~3V-{l<*^AZ$glD87M^=rB#?T6N5{2J^7X8v{Vc1t z`LJ4p%c+4@utr8dTk^TBs?T*;OqpGTs`%As_rJ14FaW;1e2ZzY^lzniZhf)jk7o36 z>O!rEbGJF|LbpERkld1%7l!W58cBd}RQy*^M zVDF@`&sSWxE%nTNoq)kGO~R1Q4nGVx=I6CrEc8B}d-^|&XHxU`EW~bRTCeCJV1HFL zK-oHgv1+&74scEPQ?vFmR+eKy2QdDrqwKbmIYE+e`7dt`EDzsMJnz_ukC+UR#@UTH zNFR)KPqM3>eYD@{18V@RX)U za;3>ivy#thVhJV$pi^20Ii=?qx9h_XhHW+;=>p!abYhkTz!6Nz-z0nCd9=75Pv1Dm zNtT#VtoCZwMcl*5TaX3**)?(p5A1dWEJ018esVX4ry6=Z&%IsO?Y{l4gA!E$G{Dwz z^VGKv&HAwDVz*ehy7e9}*XEy%oZ=Zg>yb1+S)6SmtxCmm5!NHa{v^H8wtZQm`<2Tnjt=Q$}}@&BgPgMm*>F%d3XcZ`bucgy}z2;TX=`FD`JvVa@j&b8!+ z<-Orl@B3{Z2gOMMeH!My&kvu>Qx>ZwDoS2=kvI%SMt(o19zBhGOo&(dKciCsA2y+) zrPm-FHwKvq0-^iDvdT6Qsl&gEq0n__K~I$%bPY^3B$a(}Uhsc6Qro1SI6WZ?fEQ2k z-pR>o*X4Y?2-}v!%Vqv&ZD-tOrM!v^YAbiNz1we`VsZ)4r*Xkyim-V{uS3}kbl^aC zy;zb^WR0?KaZTVAd{g#8XGmy}$LD22oenh@R_lP89;tQ}vc*O!=ql%Eah81b0OlMb61UjB zD7w>$(zdzK)w?LgIFsPXv?cQyCG(wPLNMqQ6T?}F7~gB6iLm7WM|-=y>#X+mxHo9< zt?Gr{R+gK~wbbnSuvhKvf?7uMogbbVFJAZRQ*YEJ>21`S97H(Wm=2fe*?|2-HJFs= zO8#$$LlmC5IR$YrgHfB0ieck>yW`pp8X*o?97}rbeO-s4{MJ`sN1LDy@Us4s@_1h7Y;ezB6JWjY?QB=<5_aNKH*0R;F3iSyFnze5D zE@Coza&mOiYfzC}GYw?q4Lf(7y|DB=KLblwo-gzJuPXu1)~obf{ARak2)dpY{f=%z zQ}b@0(9a6gh_z_(54s8s?jxvfLJAXQm7doa{=snN%;)fLSaQ5ED)Qm9gc1DXA#8xj zY*D7qe&2-4u7vKwiB(8b&raL*l@R(@lfjI>*VnV28;Y}qh6Bu^=If~h6tT~Bgn~Do ze|7KCNzuEE&X5}Ff(?3Q4CHrX~@I7I_ox6&%{rU9hXBH)SoWyP1QzZ0U z^nR_ZOE0jZ0q`pBK#_D}Y89-5BVb>_WTCOwL4&NXKd){QNAJvA|tr-`#54WZ}nP zDxw<6V-y|LgEAP>b8k&rt+q15WY6us)ajV}aNKU0T^dVzSkc{8(F$LaTZFfv<@<-# z=K!$k|F)riR5U?%6i&C35zV-SIg!2`?sDc0(;wZ?sIc2g)sSj8{uG#7;UsU^Wba{E z58Q%DCB{0-kWoWYg8TF$LS#%cz6tx4fFj@4XsL7TrbB%Vd9d(M)Juq*DcR6aLCBF2 zLwl29c&C&3VY%*$m49C54TDc=n-JckL5^iW>1c*JSJ%OZ*GDIdif$7AWk!X8mtx8b zMF3=V5?srt(s8y8;cDNRipfqtUUth#PnNJrh^m!&f_JW;v|)9mcH1IW(3`VTgSFwS>afDsZC6+6mGE=Q=p|*e%?&tf4VAUldyR(-P7#+!r#~gOA;%3 zuD^z{I)dDMuNvq`xhFzrQR;=gwgcTf$q{l@H9irh-I1WGhT=)CZO5<_pgReFK|OyG1UCz*1&dS*;h8j8V@T}w;;GM_loZfx zJE;&S+BCp~Ra1v$)0s00y;rAez_67}XGK8gL!>)6ZeZP}VUM6HPTObKH=5ytle}HX z{uhAurzELI26z<_e+E#osomzE0o0g6Sw;<|} zkf_wb*7kU8A1x?v9U^WYdi`&u0l-RG_&Y9KeJ%#>fJKY>lYKs7U@5hau+)0x!#m<7 zkKS^z?wrn9zB+0-&TGFgW6Ci*K2u2IE7$I2nGu|!{sjNx&?|`K8&u)$73P2=qc+Nq z4l@PEH5TlDukRRc1>Y2<7|{Lze7w%VU>ZrJp&UY=pc{DB?LxLYi##u9Om4tC03r_S zE;EW?H~t{PyXO!!h;_`_ZYA;8_SosxQoGU@-+}hobVv(dqiWoi9GiMqQo(k{`a!yj|Lq?Jg-9WG&h?k9{*@I?OFGk#$^i-Zs{HMZHGh)(vfNfh znHJE7to9eZU!Z@&*SAL7DMq?$9{N`#d{8Lju?Ga_=LXX|11G`aTNp!! znO1EC=!1K4C|3KH`v6d~8~<3crT90&`K5}nC}8Ka!DL=Xp^ht6`7OB8 zc{JAlXviH%*wNMd#H{$te?Kv%NJRwoBfB7PJpWCRXzSGxp!!|E07})K*#YfRGVZ9o z5fUu|n!}=w3$Z1?AzsYyA%3MBV+lyHnRgNpsbkW?mgkOZ9tfn!8Ck+4 z34d!WBlp^(_bk)oF;MJ;Shg?Y5iB>(sd%nO@?D0~V2}j(G(DrmVvw%8#46ixN=q!` z679Ku6niayC_(6c63=j7HzTfNM(O71b}F$h2@dQAph90C%lt z6arpRv;ds#?W}>4kX*gr+ZaI!$afBl7hJ5Imazb9S;p|R?(cJxk;qL;6e+sLUx{3! zN-MF-pLoHn)Z9plhaOv^aMvQ~CGMKe~Ysu~h z6%BPn)pQjP9xd1cg@W)zsAxWrErCoLQJ^D+A{1vE;KwL0|=nlen*Uyj;9sS3Xm6f6sq80vn$H{ou(2$LNU%e>2^Dx@Y z|D$vBUt8%4Z`7{D=7#&0Z_K+@kqVG4xsaxHIKX1s?3VLmYz(Yktmu2a{1wckh}&&} zq>Fni=FA7U)Lxn~A-!^VYZA&(mKTlj!J$zbwbQO3$&)Rn}ZM@|YhV0rB@XIO@Zd znt!I0XGXQdyi*D-N&xrj?1xSncTO3u#SrJH5#)g7?W;U#NHO&(am?XeS1qeY9)CMw zG7^5^xdK#-k$&zGAn5!QSm6P%>D#m=%mKnOW{ewAc-{}#uYeT2q{aAD zV;4C$E5+-h!W(xP2jDpbwO(?C2?HbiBmASU9^5dgttgSBa$LZ*o3v&${MI~zT1jnZ zQPS_@fU+>2{fVD$OZ(xF)o7gN!;KRvgFYvHEs^V?@O2Bo_M7oZ{M6%tJ7`RTZbOq0 zkn!IzOp>0W=;)8T8Nz?=1Kg(3s_xLI-B2%$qIst>Mk<-F{i3Eh$lNvnTkihzis(J` zJo3h}l>nhLDbMRZfU93;-i%x?@&4#`K52Hf7^~xFf2D;vmR?S~k+ghvnnD1#*kf1r z#i+2*lq;*zvZu5Lir7dX-2yFa0>6kUXXb4qpe>lxY7F`H?o3T((+Lnk0IL0xE3iI8 zT1=p2GkE4Z_i`ZMFdYj_kmvAfu;j5#7{9b-I`q1+ z*T4o%xQ_&w=}jgNOCJ7pA2qmMW*4x`jRy(}6GslH`nGP+_0=v@nq}03&iV{U6RXK- zZA8tPf{ zj5?K&FxkjXc(HbXKZ;~%K`W6PMk&fgoLrg&oA`EnBmOJvr?8{ZtVAY)rmI@V{uQ)Dn00@AH-LTWN$ ztdd$}*}$t!aHS|9SxZbk^?6NVqtZ7{+rX+i_?2H`aOA)Xr7sfqNU}<&9R|(j=uskT zGpw{v2{vjJMTHMfS{fX(v{=R6T*9Dzfz8upzUwxrinCf-bvv_ZXW#!>af!rN1vw6O zcJFRN567o-Ky*!X$yLe6db#zhY_#Exh=p2hS&?QZ36(c@1Z>|;C9^>l7ITNB1}wGL zz)mL;V897kI;*fdH(HKoQ>MuQJFCw7X!4Dg9UY?Rpjk1O-Wx6VIejx1J^P$62-*hN zlGoDZ?hx(zy1co0iF>U@0FzQAcBr3Xu$!}Y)--;AXZ?}<75J`Phghh zk&^d--)IL%2+gf3!&-}Fuc>iNf46NR5auoaH9Z!fOe6h_(c{OkBUBm~d5&2(x{ke5 zOc%%bnAUc0gUoBmP4Ae)6QEARL6!guo~ay4*TvS#zbj7RCRO)bqch{>-ufktbRz%U zHe-uD%)>ipg_h55Sdo#g11$JsMYa#-q3x6y68lAP^BS&SUE{d4(wMQDq-Uzi59g42 z=CMdi8Ka2g&FIZvv%j&r$8$|+AUd7KZ81fT5> z@fQ_-dp*-4@%OA}Xs{hLs42W@6N#oi8g|uRf%yBr7C)=ga>!=KMA-U?Ku?4FU{RtX z)gosic}-$Bj2Z?#IV%FpA_S>O4>ztC;QhFsX6)$Y_piQO2-oaT8#(s!8q$ukF#zT+ z6d2|>0a;r-G>AO7=8Lzi)mB|QXl6oteT{4zC)x1f9SWV7Qx-G*QlRT85us~IUh0&qM_T82 zW0~cLkjP4fLK<|FHMI<+>?PzaKDPGc&NwFXrG@eN!iDV+d}M-pzUGsGp_eGMNt5Yy z7^&U+b+@K9A>rrU=|?6fWoCu^IcN3hhG2jM+olOr1}tIgnDJE!I)78F1ajD=CP`iZ z!9as80nMDL%(PT7LMFEVxD}yGj8%8&Z^uSt-(*P${4YqbW zZU#JR@`zvbY`@=52Om&ggUPt|*Hyvt6B7ndr&($hDGvzr0HHeld7v#yAs{U#jojOW zFt2XIeRot-%!IiwkE;8C%m<};`ypQ3p{^sq;*z(G2g^_%6@EER!))|kB}fDig)>kv zY5KHb_TEj}R`IN@MnzfOdbQI@JI!UUdWXj;^Tflf< z*zWJL|AJgx;=(1~(Ro*MJmy>gwzK17;zYluA)hhcQkf=uMGKs_jaU4A{+s%O9wk$b zCbkd>TD?m6RG^db!Vi;HB6FZiKFUw#Gf7V7F-cG6HA>I+ z^|$Z=##qxM7W+MYc~`fwnBufIFj~kGYn#g;y@P+iGS0EujH?OI8jPz}C3k7V#BvT*< zmvR#}+V#Ko)d@Dgv!I-w2n4jR#<3M{fH@I!Qk`>Fyg@{hv(C(T;bxM@0qh_mnT)>BQ{=fyt(HGFaw zDC|`w>bx;vLkPbE&&lSgVU4eQjA5Jsb&ap=i6wz-iZoYC^BR1lHjlF(n zc0D*-6X4a8G;5p|eZ3Jju?x9^j^t265ol`u?Fm=c7v}{588~I_wMuOq=%rH z{nL&$dQ?C$uy|yTKq#q8`kjrh zU%mba{|$}dFwlWZzJ-CwG3!8M1aTuNotk{tyXIcpp7OkIK~$|bL60Iesfri~#Ub1X z(!rbMH(%mW`I;cZbKb>g-WG_UkivuRAbH-3E`GE+-#I~I4n3)sTTZfZ1((-$9d%2H z0P-rG&02Z&t($b#UY^@tXFz#nRm@-c;0c9t%+}M)$AWZ&P_t3+qjKC!y z=LpF>FRWWN@>D*N{unSYd$E6RR-~5gy6MBpduv~jsmu*pu7HRF=^_PRkzDG-BwnUx zgo!$Kb7f^plx34x2(PV2a~8#w3@7o$Mzv}YnCEVm45L#!V6~Q2aKMy{RJ-O&IMO=_ z6>qtf%^oTfAvD(y{${4AVw~#<0daHd&qLL%-3*eYO+ZyjygCRvz#7U~`^)E+7|-Ys z^e_{90Oe=}Hw|RmCz-Bd@8pZGt{XWIKB0KPO^|QDT`TWtC>bqoX_E|0y2Y6XrJ$V4&geBnoZ7^7&ky){9T+6HfIuhAuO80|LZnBY63tF zccj~%UtZKGIXH(9dorBEgB`LTmcn4HjOXyzHE)JjJ-VYhh6HNGA3g%scZ@5#oE#Ul zEv&ZkEXQ5~Av3@nsw3{lRo@7SGe@+*lkLMS<96R&S4|pCf_!%p0BW-6QI_cg`Mebk zS}3S!C^>ERjsbB!ApDaJN(Rly2%iF-dQLZGAOstgkAYS_Z5OVX`#q^DBC5eeqU!{0 zANNSW5`0F=G%1EgZ{R01V>lU|_SOAJA0B|3BN!FGAnc~(!2=W2gU;yG zar&ZfuT5I<#2tFR>Y(xyZz3IUSa={tES*Pf#oqrfu4y0W!QHs|81R*DIUp0jSB9T`_Xqk%O@j4IHQXL% zxy%<$6oIb3)J-QFd6pX7sB+syDoR98{vOvYWgt{Wx-%wouJ+N*(&);VYheHpU8@F9 zDb+XHg(k0~RxRGTyhzc-vx3 zttTW`^Xp!til|+GsJx8Bcsv-K6GLLu*9WL!x}-rpjBNP|^&-}nU0vc@74)>9ef`I4 z9L?NMT=59=iaE{T1Wv|p=sfxWy1G4oUK26&#o<*Z?u}5DoJ(6)U6j!qk#ZqR_pw0_ z^L&=M{s|p?dF!AX+bHnfYFH1SRsJt#EPpv+{R;CdosOej%j~j?dQy73-m9C=J)?ph z99YZ<%qF(Cr<*DHG`DoJoWR#%uj{k6rZ)j>&ji2@fh{7YaYCRT8+hs|DLFLn2I4k- zuJPTT^xu|~*m*8RG6?g4BBDf{OMFcRF(aS_Hc)R|+F>gYstj>DcVzmBwh$qY#n*DDS6a-9fs znEEY9akydbJ;S@V@233s=XTf0g_>vbfX({w@XprO*3R{bB=8=0hO^VM2E=x~S01W4 zLCt3GPV@ZE?32%wN;@AG@;)5sW6TMX#R0izZ~N{uzOKKPv)J3g?GC6kEd92J^j>VZ zQfWJ{z)ha|n$4GJJCTpl`XpcY4rrcXw+ymPSCeK@p@bft@2fNcxOJz3T;i9x zKKlX(e2Fb9m^5Km_(bAPURDa$tgkc1r=1WO#|C75);@Qzx0jMyM$)Go)11zEvoH@T z^!p)JZA*xk>KT9;b_>dUvY!Tbo}?vo^+Z)Wb=afxowjUTe*16Ede(Fvc8n$tXkGn0 zRb`L7E;07sgE<;8)1UGzUH=V+rxQ5@n)r2wa5@YI;;Y8(Ecv{>_Q(IjbYPaEcfD6y zgr>jsftc=`Ww0lF2ElI(&tJx}uUeGawFpwYW59T^v&inh%@qF}BoSzbeFwxoN9 zlH4U*wLPjFb}OnKj~C9#*4mvi!Z{p+Hmxv-;CjSXFE6Ukl8HNQu13yIF{OlRisugh zhiAK*^W(G7*L2l<+(Tb;P_Fg$GZ7K59DscZr=-+gubuo%?%q3W_EA#NU?UriZX3mZ zek3hXHSBjBwh-t`(AjJ3Lo3lCC!#Jg=Ja4|Vw@T#L~Qe2=4T)g1Bafef08k@r?Ju0 zYIKOdB==E}rDx{3<0bAWh5h<8F;X(1pvZ~k;Qn@Yxb_KZ6KhqocJB~eKR6_Mig04i ztGfHzqeQCZq$&m+3@!g-sX(JaH(&3N;>2q(toeR=Fvq8TP9g8e??q~`JnqEF><{j{ z>d1YFAW6^e(`SOf0^-?7(~x^M^3-($YUVNN`{Ez_htVIr-F_Lt33niEdp5LUtvoGs zVg2}tk3AA}IG>$MenZ;qC|#QWB`<*FwC^KBAcKN}*?Sj04a&_XAj9fcNv4vyO4O5{ zi$|!hC%nny`F!zKzKq-uUPF$9>$A|Z?PZVawi^49bejbaZbv90Q}=up4zD)FPY>sK zSQRrJ4lUpMfeDqfd+XIXdQ_e4C@JjrLg}{I_5#&A%oSq+HZZH8pwUFrMijEJUXkz{ zlHPC`wE&NNOhM6<;+%#gRKEJ_@amq>$3wge zmsGQ|&l6vh4xvj%f1gLy`02M`OWx!p?&H ztNOod5&F#Y1>sCXDv;}SSC;bN5Xb^M^F8|GYC2d=OwXofNq6M)JRxm8NWkj;!SBfC zwlGFl84mj5QlBt%i0EbJQkS+3bKak`ot7m;8ZuR%qHx$&aEqQT;PlQz&DLe?MP{Ui zQCZqyT;Dq;@t2j)KWte~{iP^nV5Ts5Eps;OrRq8@uJt6F2VZrEDLr{gB@^p8XW?qO zYXx(hJFEGy*I_+S0~UaE`ps5Geg7HIar(;Sb@cYM(${+nAD25`q?j@@rxeFWaCDqr z?XN{6Wk0Ma^_rC89Cc;8__A7xDiao6$ZS>;g71g)SWP|1Pw4x*xLd@hhxXSPXa+N z1H3Iu55<1{7^{cPf)-+BgTYtam4kCkX20wtw66E-7NOVB{hk!F-ufI$+V`!eK_ogd z6u4gmw01F4XP=KX_Ks10CSg76yI-IS4GmCL9gn1c*C-*kROw6@^#IDl(-1EV<+x#WR`K&!A*!p>nSy3BcU8-(PSS)9%*wC+Ls&+gngD`n6T zm>GISB+wf1vNoY`Rp3^1KhcAEkYwxgW6h9lfyLO&Q1H08-2pa8FC^rkK?^c!G z7NR0{pCqI-=*CVWrGe$LSkIx*KbGi-Ii4)mmu+>d_($Kme3Rp6Tluq;I=iX5;_#HG!TaQeskCS3I|4V4mY>at3C zQoprXSjijLhh8$&O6l$_zG3Xmo?8AL#a4!_tKkX1O9`5%&`x zjyM}A;->G=g(sR_{SIv$dRt=cmX^Yo<`)$5(MB`LjdS?FS3LA;hr zj5Q80sGE-8d+UjIU%9W|I`cx<7~H)cdw zq;K~8uSFZg@-fachE*bH*su38xm*kkVSs9@C2h;f&6oyQWiJA5ExICjA8K)*1IxzW zoHZ7R-QI}HF90sVpNsK)W5@!r>93}+C$8aGblS6Sl38GogB_<}cFvl;??X5(e@IBk z-6PaR`G-7gEwlkAap@-97ZV;&Zjh#5Sy@~ai%J9Ct-0Cn8DPJU=DOtU*o>4|@?NjG zciYz^L4gEa?j^(i&SBvk^uil#^wtCO+8NvpKK{`;X~_AS@NyGKSzgUVH4pP(ay?|0 z4~BbJ5Zw93?E&8G(&C~dCnulob+7mGn0n=t$*S5tmqzEZ0MV^W`X&psYDuN&rG%>! za%3c_wY7C)_j&)9J~%&riicT+8)-AmJ(7Dm$KX}$ngU|w=@Hpce9FS<$xFpW+OH82 z(+Ikg3Rw|7?YCes%*S-q*Ri$ZX{?nbQ)RtYlDhq(-i0K)=$lLFS)sELzZHSwqS9tv zL&V&h`8vBv$CZT!-dJ6+3T^saURO8Qg5u)0cLpo`TK0^ZaL4alhYEmjcnh)WFKq9Z zS*4tZs_IxupAd)X0Vu9XoUQj5-r||Z;QH5M0_H}&&=>j*iOBa1J8t4Qdn?!3wW1Ed zC^m=L3N2JcD1bpUX7fk}6;8#U@hw>UdT`#AWr~=FX~x{xm>OH;lkK0{0-Na2z>KH* z78dlV>ip5;6MuwC8(UHuw(tQ3tAbb5$P_MaVY64o1bxn2fPVRjmx!hR)s&JqEbN8wj6Yh zzK)SB_ZR$|IQd_ZPPAbJNg#-Tz|GYa=Cr`?@dU8nhI8%y zrUgQk6q0q81e_h5EC2ag4hqgpO}$mwzHe}G+))n*OM^)h+kc(Qk7XZy5~Xfutz92Z zW*tg4bawppTYeK8OrBCEtXrM@%sXXd8us6R|16u-%?k_nv`}KgmW17z2o-f+{{6A` z)%kP#2YPx&$gOV64F3@Zdv(^9a_kcN+_)wJxVd1rnTqCJr+La*w_uXb)d@DXJ?z}| z9ZX(5Iwgxz_rfW71Z>~X28Mq9+AEVlQQoyWOsh;e@TzNfYLx}0ciM1Ey3g?}*PARn z)@y)N0B%?-KE_h>VcaOt841x(Av058%c9^AdTP#5NGfBk!u-;9)Ke$`!iub0E~IGf z#?qzHHl@ps&uw|vGsQ*9f3fDL3shag{%E&3ycF^dh}ueoqv&8+HvSiX-;DVIW=75P@PHq5U8`I8XR%rX#X|A|q_g8jN zM&vJQ6J1j*4`&u-3^~Zq8OKvzZ@?3Q_5PM7Jre3#+mek zj$DqCT-vh@JWFwb8XEUm5X(ai=1vg7<0t_qg`Z?;;p?CBd`411?e_-d5w-;QBQY=h zA+4rc|KV42xY#Eu3!73`22PZb{$yneDsm1sx8e8}&R@Oz7!6&5C}Cds3nL>|B$w4orV_#hcc%9cn{ zu1RYcm1ao%UYHP3s)JX?72g&jyO?Dk#YtEb9=_=6Hu6JQl(ANkewI}3-8dyDC#PLJ zneF}NckWU>i)@{uEI(}$>E%B;L4NY`pG$rj!24nK;Lm{jZosMRtKA1D=X$2xda~8; zP8NB)ky2`^5=Yu%zZ#cGzxMPa0HkDrv8ry?e);@?LZX6ufVE8*X>{o(V@;D~+4cy~ zOD~A3Za`0Zn(qQ*wJOCAgtBzwH0BqofEf>6$M3H&Ihv+5yfu8OvZ2-RSgTP z$5~Cru(ZMV++1I6#to7>g=X-DOp%h_)B#>ruHh8r4#S^^94P+^vc*4*Ajieh-z8;B ze{q5e0HtsS`0(tYjXLM!de7tfDY0IfX2KM9KRJtRF3*)vhVlI4pvPrO;3qfl_6OXg zWs1j%I~DfHU>-v(Tj{j$BD}i0nl$g32yv*Up+|bBmNd~$ohbi5l9ZQKks6pKw1_{x z=en8u%is1y^wa60Nb|6*>S%wdCw<;magja;GKWzO; zIJc2Un3Ovf^MMOz2o_r9?d|RBW85}x4rtxtX(Wfr#_i|+qXcRpgS-nSkb0dmT`ppq zCx;}ZiMovc0EteaEhyugV4aH=?D&eW5NCSUK!u3eb9-zd!iX=;xTs@x{y;GCWCbGK zwDnu*KWS;{rR8i^(lIA^vATib+KO}dD9;M2O6$_>4&uQ^Y4J~Si9aOef{6}X5;lBx zY59ur!X{d|p^dc<+Hh$8|@`hREhnQxUdYw~^EQiyqy)`;ns z;g7p@0q<((n`B3vEw}_JH1_>YmYf%8y&HFm9M)@-c#Rr{W}K#@VW0Nel~_*Na@njl zcKRv~UShgcPr6$M0CzbM4_0zwI@m~v84BpQcr~Kf`&4<325bLJizJXY|4(jQXGpnd z{-b9>#vdg^V$L9DZXbv{84~-yW~K4R?Hi`nL&{wy8~H|;1&oLtzj9Vt>wt#lLigxC zO64a$R`jxvjtqR6*u-#BS;sr> z*b^M5p%Gjb9sI20h+<=cw!WhC+(}GNr$aTBRbR(Wa=lUfx-eu{M5=ym+W1i;0hwrT z7BOM{k@1Ul79B2T73c!b%kEgN6F%!nLQDDHjKQefwob6HLu*By$>iX@+uCD~%Frwc zdh5wTmHi!}T_4bW6LBxQ{axJ(SL>6V-9OlC==NECczA10z_&LV#&B!h_DH2dg433Zum==uyhiBv%8C5xlwf|zu?lYB?eTvQR^YKVLr6t z!MROy2}T+uS|3&+**~9TjZxS+)d^ zPx`&~F}B>`-h_HoT^q>@6I533S^+gIe$-N6dILNd zfs^Vwha$idC|KTD0s@a;7p_Y_eYBfn-wN959E>(jUy1?=bKBZ!jP5e*0|V6^#+dou zSr4sE4{YJ{8_G*@lkx~8=uhncpg+A10^xUAQ_w7OT<%0@AGaH{l2hcN30ju#QdJ3C^RNyOvxC>g^eW|YjANj$ffb&ct_?$5$t`4{_U;sPUlOxLk|w@c_X9Hj&%fZ z2p(O=4?xQqB{r?G$EA%p{c^q}C=D@-BEGDNkjujl4+#?9dM26$J}-jiAN73)`DDG~(-Vd+DKiq=kSHX|YQY>&VKfPzHp5R|s!raldu>$^uDy+{eW zRklw+C~f;*f|t!sS4*o*oUR({(L*9Qzl|`f&7Tq3C^V56>7)PZUq}ow2B5^?lze8~ zt)Ga5&}iDh*FE=%356R6k2)zu*C&PwigVR%M$#$>XE~Z8dBh2-BbCLicuU|!o;p}2 zjgPIkE8qR$NOT=e@M7^m+u(*sD|N9p_$nMuy})Gd54c80ff zF*R#;<)cZo)cQ+|ujR@H%f(hLCi&s}rFo95;vDzboj}HYw(#$0+)zr{_tY1dJF-Ga zOS;pNGB$}nv|%r!ND-+H5#E0N`ut;=7`8aa$8O%rt0$y`!YP;>@8jw%oWAUxyC`5M zZt%t@z9g|?gL}GTOJZNgv=t-5$6@FvvcCZQ(+7< z)ji{7_5}oQVl?Y^#wA07>edeOJ$1*`{SWE#mE0Q2Dp3rkY)dU3dTXAh-rG8eXeDA( zVH>+`lh;H2U9Sw@UNChCDw6*`889@8ipRfY$(}zrIDt3{=8D(=%2hU=g$*M6u9dGK zgS$>lf;d=;F;N#F+gkM*eS?=V2K zVCrbhUjNiS_k+;D)=b?B9>@dV<8W=g-Po=!kr99DInw)1eaZhADs%C$ZGLp?!^IeJ z&$-zYr@Y|cp5$$t+rKaCAx7`LV;&YYUk&@+udwnx(lo<)EUFb=tzpU?@vV4yNx4|u zhV*fLr`~ZT4ByU964MGnf-390sg+Pj!}7=48}+FUdff@$^}*JX(F)1Y6L)_<1u(_h zpY}@zU>F%P6t~s?tGhn1id_0iJv(5}Tc=s$_ExQh1dZ`57;7oRFw2ssoTQ3UBmVqL z(80Q=B-dbixnotMcjDA*m98X-t1(nFEGnkLnNq(y{eu|S)08r}7dlgHYTAQ83+%(B z)bQipG7}r^e4CnX%AhL1L_!$EA2pK{<`m-?lTyAW{K32T} z*^Y>^d0JB+6Cm?|0-T>Kkn=)j-R8xbVToQX(PjGG@T2xE#6k_2WZ`Klff#LQ8uHzX zU+H_U10ng~<3(!luRM7b8_S~F-ictMcjyVt8)+(WXN9x5Jy|0=w*OO&xvB&D8OvQ% zBE}w>E%j}?R(R_|wNO&hpjR!^9G5D_kMxjwx;16{`Z?wo?n&$y(Is;nT>#XgkYRkA zxZYG>9V$ZV=ntqJ+Xrc2#Yaz4Uv}$=Jxstr%k%PXmsHN#pGh26yLW>AZ^gzYZ8ms3 zD;*Jqe6@qo8t{QidJboiW>uYXz<;Co9z~_G`NO>8Uu^m#KkByXb7mb#*>u4 zhCsO{2#Q-}o;ud50E(%?qV1OWXXio5v%oauKydCDpnZO8kNr|*jS?`}9~IEaF7tcs zor?={D{O51&v28Nm2f0dMi;FLv&S3kpX)+SyScjMcd)n)seBo8=ljB;if{jHqc+R^ z6;u6jx{2-+e}7a@O5@<;@gr2E?*Im0O{;T6jK9MgCr(1mp9t#9*)TFIl}*B{-Kkwu zQ2eALmS`w(`V_Df9Bx1)WaUP&-ueOX=zcqDlVcY=WzpKIs;6e)0E3d!Kha;g^fW!-8x<_b6Qni2!g+kao6ZQjV5w${1E zDSpw(fX|%g_-N|qw^?DG|7!l$nz;)yZHvcxG~Zg zgbT>hlq#X_md1eVe|)WqNty=0$-Nhe$yFo*7VDqPNR%x@Z{IdNUa*5@y|DCh`w|An z4?BKNsH{^WHxjjk%=pST(&F(1VhZ@+F_WR-!JYb5^d;Hu9YNBHpV_)5ZTTojP^k$L z_}G1VMJRLkTl5S)B>6SD*nis#{wX$=PvJO!U`NSXK=g=Tg~%D~d#LUlJNMF^uK&m0 zTgFxOwC|&ofP{c3At{I;(w&KYij8X6q(W`-KC^OBtJmOP89E{jNrU<^+-mu<3{ zraW}AXhNq?~S@l8IB&vSEBI4YQ1@?t={^S=TLF z`0+91x{`z`nTsC&8E|b@nYW~S>cdSeckfLje|b=&P}A0{Uym)cPX%Zjv-LF11mr0c ztk#@R^H17wA6I6*YT+}s7-yyukEjY}V#Pec4$9ETt};qjKV+i(x!yRq zo{cl%dc~p-ClWc36t>*d1$%UjFQax@C4Nl^XJACEjBFNz&P(fTx`wj9yj-UQvm^0I zhlW9aXW*=*1FB9iUm<&LR2DpDcMR<3)*QJXg&<5K)H<{9Dgx%P_o>7x6dZL`Vt zHVqEon2q#MX3EOWJ{R?*m|?r1)(-Z9zWw>7W;eIDaJ6g;N{xyhzukyhinkBXk+G5>AtSH9PF>nT?BJYSC@K4s)K zq37h0zGCIIbOaG+RSIk(ZpklMQu|A?L@X1D2|OOSZc-hWzQ`KgW@p}V1=&@yDU(#! zk%c*VB8k)HXzLNRK{mmXs^X>s6C)pCGf2tns_w~a(85s(zPT?jlLfQYb4EM5sG6o` zv%IeHkL%VM$$1#Q`?2uZIP3+}pzq^cS3Y>x>|9Ih-rQ}(Fr0MP@gtY!<-M!+3|{R;1?0YEwz9`KzE z+IsdONu?4!5Hd=X3HXM+Fo;KIN#wcJ{Hwci1TvLO=ql-crb9dSt+geCUeSsKm{8Z# zY~UNHr(#siwQy8Ya~>C8>98!A%==*I{m_L`uG&6haNZvZb?94t;y((3_GU{_PUddS zSPnQW$f;~Dzz`?%Npknd;m^}(JO-V%2V#FdFm#{)GrMSX9f;ufJ~5M{ATf_Ef0c|^ z8JC}imGBM~h70{`=JT6!umlxzyf%j542g#wguDeGPoslGUA@m4rsxS<2WP@VF?kW4vkXCgS4_XDFxAw z7O(QKCoPX(L)EFW3yYFFf}~+f+M1e8i<~u&Q^Fx>98Yb*+?qQIMK#xT)*??nw!i*3 zA)-=yrchCMA@1^S?feGoxDnCYQgF>PbXXySO*mXnMp!uV#bADEW%b#g z*(1KHu_Bv!oQ@x+StXWt`x!+}X301VKNFVI_^121QnXg8;w@~D`Ds}-6ZYD)HN%1$#Wu1lOZ^Y#NR zN4j>OYN{Cm)|ZMBlwno(BYS7R45gVN6gjQv!j;N-M<^1UN>YaX1PnBZ4Q6GZ%H3wG zYp=OFg)JdGdKaZrhB~A@kjoR6NcWYx!qr@w#AmKe>}3a#>nd*);M6-;HuVBPbQiFK zuV2*^-YKqb=6PFBTQf4elcy+BG-<+>)x8bIC!8Eaz1)pKTqVRc16Kl*>(DTrTkS0s zZqc`o0PH?7zj;(C7pYg`j5xGwN^b{9yx6B_Mg_M+&b=~DD%H5jbZhZLG^ZyNdhQ@E zYK@*fyQN`NF?r-6#qK!tEIpD%y~<)FNthFkX#!#&=4PV%<4RLemL;a5jk8ApR=2j< zRh;u+d2-ksCtQMvzrgkgEN6@p(=hb9x({0_(>ae!-{DaN8xF(;U=YlFM=z+Ki=`@> zDoz6SxNn=^=GC$yc>u42|EpPCN=Ik^B}6b7%{oPj4@YZS3cHUgq!1O`+pbrrT?962 zAgMi7?y*W9V#6!r^09{tATRdMQ_;Cx3k6_z7I$COcwBuN3ru;~m}XODXJap5NKf2g zKHv_sJQI!z18`R88!|sb`>INH3O<-+R?^Xe#}Ll3qr*%^o(cdscL!Rx_VVlH_1eF) zT8Lb$P@~MR_Da-!{JQlLMp$ZybIR3p${Y_#E1h5nva`puckdTW9B96UZ`LO|0LUZx znOSiJLcR-5uw9;=9hbXvT%GDsT?6) zdT9bn-H-e|^J%kSQSZMf~d+V-a7_S~u&ai7Tv?=uOfWxcujjX$u&Sk!+98a`N5 z0;}ztvV#GP6ES|=n>qeP`PlvX!r$l{{fCT)!Ps7N4w#j-b?WOUPwY2f*Z1$ul)bR%8malI)07!;HxR8edc)Gn2wj&0 z$8{@VY&X3hLS=C(dNNBKQ55~nwPLTR=4j}`!8YqdS{f%@(DuljZuedtXZ+1OH~O8Z z8hEPh%|MM&p>t%^qT!>g;>#aL!i*zyPYUi(uo#F4W;$$EUHNRm=KO@tKeuKg8geT& zEJpm)zg%u{tB$zfGs&T7HnQb$_h*xOAW2!8S+4ERRSH#6NUk(qu$p@Y>-QaOPG0Kf zxBCovc<_LS$bQzESz?DC7IoYoTT|jMLbBjlBqZif4TK4eL>cBTcBV4gf&Hy?a>*~O zpu;~kaJ9eOe!e~RsOq;R>@9he1#?UUb@NG?zZG3TO)(#(^n$C365@~S- zqylU0vZ`AXb9gbd=$dWLo1WbmKC%fjqK69>C-d8A4IFbq_RqXM30n8+PwogeT5^8- zI`frKCxiD7+Y`5xa|9rXm;)OrTpF7E6=j(}-ra?I)_n#v2_EfFNFBSmRTu>4^u;U7 zqav*4Y4D>z5C*@7r~K{&o6F}7xA~Z4V6~yv#G^5Hx^~xK${zy-jgjupG(dE&a!{Tp z$KdXhrsuM0k9_B6!?P44I8w>!KI-Gk#i{T95_KlQy8#EtN&GQtff;DdTE5+S(fF1+K?IGu>g~*RR9?k%;(xZygNh zPw{=W(>Sx0ZlXw?L|6Ts7?vL*iDxdPj`&sdB1zRASDvn|bJ)}r(yZJXUqrFz1?p3L ztf&|mDhrC@N}tyJO8SX$p_1_)V<@_7SCfBkHpvh{QnnUKXU7=N)8X!zWtUS{{Y+MO z?`mzJhL8&t&ky*3v{Yuyf0<uBz#qwyf$R#o|>u|9P)R z(r)WIqq@zgdDZUxJf;no4;TB{vuAwuqbD- zD$dc{MP)@qp9ylk=(s<8_FSqRvR-7Cu~&(8-5fQ1UAsDu&cGnCIhEbvMw1bbu#2Le zhE!;1w#ZCo$usu?$4h7P^OgwD+LG3DST2U`KiHnRj=Cb>-eQ8N*)uNII#n5P z{8o|`(P7@ok$-GM$6Hv;Ry41byc&^8}Do*R}u4#h}U=nr&p!{aI+PI+s zm!P)oi`RXGi6zg?O!_e!cgnB{KFpq1&B-S+v`2qXzOR>{^_WD^WbkNpkdT4lMrepk z_C=&wiE0qM;bn?m;>q{#UlxLfH&?SeSMw3g(|*;j^OO?i1v+ZDB758C+isMR0f*Xg z$0gNt^j7P{ZMh91DaMIF zK?HZaNR$03NfiN+NcIO1h*Yc6+uo-7{4j8b@7O(_BKaQ^Km*G zQ`cVq3zNGc2F&cUt~QBGq!zn9y!gP&?3{ChQ}delhh=2dSjx;GZP%#!*YewjYOegU zR*=u@I-75G3?gS#ct1dDN2XYr-DK2p=q5C;=xi2B06PiDgZ92t)$Rvz$d|RM9`o*^ zRqYWhCOf8E6>-nN+MZ7`So)ScMK&Om!=rnwLfWgX`Oz&8Vm=<6ST&9@8->ar4RK%n z9M~vg?7CkTa;MnI$jU0`DE+*dav-SIbj)&0{q}YStm@WUKF`)_>D}4!kUI0NCB9cf zb(KB#{crA8_c;uuyp#RBR=qdwHm&kL;rH)ihacsL*`($wB_xs;JA)%bal!JKY24E0 zLm6k5x#i}2x?Y>(Ym#Y~Um=Svnp4w*a+Y?@L`uKnrOM5H9@)+V(Km62{XPUp8zm0Ss0BqNyzx8-YH9Fg^9soW7K zngVuo(_3Vr9aHwIYe;-tbS%qwk`o0)GtaBMkPOig72#Prg4PDM4FmwB|G3%9FcYainXaRkm!Fzs=l7e z?^BCt$*G358#Eme;66#bl6jm+gJs^xTo3s~4i`*pg7OWsyL8_}xcuo==UF+|wHm)r zerT-kzIgtEhqSi-(=2bS?o+_yaCR;=C=_Qh&OamgJ2vpFfimMwikC{itHEk zo7%z*&6@(8#LBhsr+oOp<7n`!sE?1G&3)WrCMGA5jd41H`F19OYmnS|$K*#fG4@Te zvKCRv&AU2ehl9LfSFDJ2N?`7NWn{FYvQ~cQ4=E4$!1Gzxk7!-sj-t~}MtmiO> zI8z=L^F}^~M5%q#8CX~Z53G2W^X(EHkNc7Hir#S~U57Cm{-NwTa zY^np>0s(4|xj;L$;!MSIq-bYnHy&h+8!(iK%mqt|sgpPzJp7l_#HSHNBs#vkWR?evI>{YQEb5I*#cOrNhaT6XxZD5sPA{&1?is{Obq z@g8{-$FH|2GMDBEo#;BA)of)x=l-p%J}-yiI8ih*e0bQ4&%UN#SO6UsJ|OrU5XJfU z_@3L_m;TwFYKvP%gcW2Q^Kfu4s(KQMgkry|6? zcN!4zr*N_eg{S|95{lx6(JWLI^rtGy%fXhSukD=s@M1NK1S;1_y&d|a4|^VVk6 zDj4x!my=UOdWiPPhEhd026I?h)&{T1BpAlXl9@79xexEa4Y9Lw~1#(cj{-1lWaescWA)fR@Y{%uf)Wi)1i#=eNFpq%qz?)jxF-IKbrsaFRcPwxfZh60~GmG z#*8aTsAbU}1lF42w7xM(+ge6NW`3mENBF2NdAgv3@Sv=2^gnYA3c0W@3l-(D#wioO8M zP%xGi)z#Ij65^#gxQ*&P;|rV<-JM;IH4qRmKTiJB2MjgW!zc>{BW6A|r)P_ zH+28zJ_2=K)A`t!s9@7pIRdSGU4Yk4fr%l`Vi(R|ch?Q1-YA-w{i9tk%HCy?LfTU%c*%vw1-qdhu8VCQVZ;gdI14<6)7$XMvF>_3_bci z@*mP#AMW(yU65eO=%ssg6B{j21w8{4>@tiP+{GUsKCY1k85U%C7xqt7UWhRmdk(}1 zenTi#r)SGn9tG*c*mX5@?ECK*`s8^1u%lVIo1BB{B(QX1}0_&rjHIE6B=z>yZR;!y4wS%tDda z(b}(ewSqW+LPui$?TBzK*1Q)*&@7Pe6_c>6H6`AOh1n;^(ujQV?OD1=_UnGglkR!| zxx!sX8IxUDjpCVGI{jO>OYmUA;JBoJ!UZ5yVAQE|I?#LR-2bU6XeD;1oK~Lpmya<= zMs_tLxR4-rhsN6>@|%w%kQ;pjd`A5OA^fBS(NbH=aS={!!MIjuzp!&kS9YcYs85e> z-MUq1;r_)3WFBd}d`a54VwG-*a@V|R{Hlw3Fcd^~n)X}Kcg?Mr#WKV_94y=XB|LcH z<6V^=OX^weu3|}zej~NV6GR|6CB92>QDp#02!8D?(=G+1ElniB4&8js(>S>ZrR$Y@ zJ@hl5=nObe4%3=wOl1VX6f3VgBkePlijaG?a$u%AFdUAzmo7I3w{}*_GiPruYKEa@B z^H$gS*!cSC@vCM14twN zt#q(;uC zeKTYvi>qHUgTw=M^vc{^=_hO~iOtPoZc4y5{qFBzWXN^w-;|`NyglE6_OLZpbX})m zcijk^=lNTL@0JWMNrZEW!KL3m^lj+oTC^Vc{<&Y;ux&k3w*DCRalC23cdl0A#0MUe zGv6`x%3G{`jA1D6D)-Mzb=@ar&4|KXs3}?&X2-8UCI4etB~cbk3J@IsT@KOlS0=_~ zB5~VzobIc!^!P>&K?>aKk6Fy7guIcyi0M*2W_YV1^HYfKx9hf6-(c2{savny4V5em zi#s}`Kjw!^Qdai9cZB$Ql{vHR>`CGM5h;7Xj5$@y2TPr;mw!=e&| zOHyy5RG6KpS$kquK$PJylB$O&_PUI3;4hNwl z^}?PJreXBDnr=0(G__xtuligT=j0fI9kG&Wt(UxTcnk&7T)BEL`e zLd8B7PnJ@OWe301KqYWocDcobN@eo%Lz_f!v=?!{Wf2zI4KSm#b6K~*XO%Di-tZ1n}hfzNXuETTj532Xb|z z8!G%})4vATT}Igi1qJ75<ZmD z1IF9B+`#Pt>7S6tYsh4KYmW)JQwsE6+uM)7*c=QH^srLJYTFqYeBj@Kdb&GLOT*p% zjBOWzB;B!H29_}6I|E_f;YuR4RKUi?`-33;M?{VHEEX$^P?~^4LQjE;n?5JLTpU49 zqp{l3C_Rd^30pGtD{JmuZk?U5{9;wryNn{*qGKwQyt3p!5&HeS;Yz#i`4Yr$^$X1Y zMNt*HuHF0R2AN<}H;z~Jz>^{!GlO?KbixC}hhuNlmol*lto%YS*>e5%K=s=gYTKFUY zoyOlqI1y)AvZOW~90Vbn#y9L1kSQ>leS3VWK749Xh%2r~h zz<|x&aZiIe9c%?x@6Yz0Rat9SuUTgK)B0sJ&dqHi4KMaYw>P?x?$&x{=MxhXy-*ra zfu}{0r@}Wwx3+z-^bcDHVYPFD$B^HiWtTg=HH3mau$g2Xl?`26pUp+i*mjs=av_hu z{prA^K6P7A5QZD%7e&iO+;m#TPs>bh+1M?&=zS)v7}JO7WhUVxow;>OS{n_rmE*23 zxu#SJs<%a%;@&e*fx(U0I;ysqYwD3WaYXM#HJdibPfVvqlh$gVBWEzT?&VUdvsOa^oYCJh)Lo)$R6U0NK9rbw85X z%N|7Ua+PYVhaSK@!m{zOUq5jJ9uWJ_FA{K8TzBBA4djGV-%ZUs36tTn>CJ8*f`+v{ z0fPL&2(Mo6rfgf;4y1ev<_gXdoo6bWpJfVOZf<%`@=md9=*j#JhLx(AxaO^>CfXUz zTRr8pbiBTiEP6F(Z?~F!curbOm#1;9w-gvtP0&i0tO{iP-)QgIt^@i=9TCJBDS}Ha ze$vyEYJQsrRu)&}S2t(01N)OQ!ry0BF}LRcb+eI%r=`G#@UTgcnKR56*Cb+>zjPOQ zt<^a8x?#|KgAaI2@NNVC+S!0VqsJpL5F(^$-QwLj+p|sev7X;2j}4JkoBPZ_O08Od zp=Jfj04ASVlZ1+$4Wt$w0&jfk`yN*`3f!b0(*_D*XF~f5wvS)J6rE!`oXfR>f zQqQBs?<{^v{uDFoDK+zgPnBqL`ks`QTB<;8hEux#&1Ry-^lRR9BbJ)JlMAqprjt>>{s zM@@S#Nxwkp>z3CgmSHz5OSsgODLS*bfm~QWz@GdC5H0Y!OQJqyET=<25N47+LeVVa zuCx=7BdlYL6P!o!D8|5&Ah@|P@Fh(_yGo=jxm2iS)}@O+??MKK?_EmUX+rzP!0)3> z+SfCO@t$q4qFO;JT>sVf@Vr2#9sId&>SdnGZ3HZLH>S4jGC|R>;O~OZLHDhmy;ix!lRZwVbhprQ8lJ z0%fya8wi(xX$tRaE*L!_bmK=o$Lz5B>r6Sh;kvwnG` zV5c~rN%xI|;9yxL6!^t`r0*hlXfaL5-j|r-U^c8TV^#8$x2h!%8%(sRKZb)*`kXLU zw}dyW{qh}q46kamWUQ>kX4=OcSoJVJ_O~G^uE7HdIF4muyC%VzU-NI%^A*xKd7PyE@u`Qwy_su1y-KD5ItkHr<%_dx`tdGo1bwZKs*-3+i4 zv$MI?L!95Brl9dAwqe05?9?vN^k;@8h3AqwtX?ZE`FOC8)IW31%y{-&$w5mR8rg85 z(dEvD@-Y9gaKN804+Y%mRsO^96THyUE0_1&gS?t8c{4F^}MAsv0wGAh~ER5 ziyk{0i@ldT3d9UtA+fE~O7vw@#kxOts0I2zzRu{>vU$c}(@$;Owq972mxb9(G|0o( zhF#g}NIi7WXwkS5Jrd~DA{aGP-{JN|= z{d#tEG`n(un2op9BUOpm;#A@?+uOmkC)&gvY%ayHJH!eX)T#V1Feoc9KU=eZ#3YKw zrsE2*f)Ze3mIPs_Fij2yPgLa3a|J}8ixIqzMb4^%M~h&(QaJwMDL<`i+c%KG4UC+j zyrGbkrO*BPbyPDfkOs@i)ts<`rg|1EMh|FqejwxgI6XP8(FCx0xu4q#$kUhQ2QZM9>O?MP3m@3J% zY#oP7ONh^Sc(@Nj`KMhm*M+8OkymtVBY}VkAt7=WyAmDUDqGpXmF;k6HHlDEVsH9g z^2_CtLhJqLsu=+RNbp@NBG3J+(==-BBGc&Q*1Z`<$qJ{Rawjd5mUpvgE(ck7-*KiB z84fcaZ_vI`?D<{K@IGdwJk55@lig=OW0UuAmIr5KXoCwwQ;1BbV1Qtn%;j;`Br>AK zg5EL2WyE(c_f?K;(6e4g{3~!CeCEMv4d5WR~`|FZ9PWZ|#?-0|A_SgrI!Y4PU#+@rSm!k6G zB)d}<+z%j!(8I+;^T}8p#;u|oKN_0VXSHNJl!Hu*uLM3u@rS6*^_RAAIlddjW@HIg ziuS}bX*7NN9V(Pzx$YNps^b|L5G6IOB_y|A`x>#>G$%R3PiFI-(s7<^#-X|G#_w2J zI*SQwZE*i#gmZ$SNx)i|i(O_jH12TT?zYVP@qTSkSBdV!U@4ll zteELl+NQYU>v#^c!dDOd$m@he!wvqAn5%ry-X0u{dT6|rC*$}E&$jP zlO5jI7?ng}jc@0-wm!T#Gb^zRvl#}{F1P;?hzPS{clZX;6DrWYQLbY^3@GHD7(P*W3PyslwHtc7K%CXQ%d zF{gfeb0;Y0Wq@%C6@}{*_l?ts-Un8ms)yqlmbjnh2#t~L)Q(QpPZOnGU|L!yjYD8B z@Wgv~Ij&uH$}$ZxUp2PhDP*I8lcjEkXFp&4EyF? zU%p(~s!3{X5+sHHAXOQK)cUtUU*Lz(_zZG0{G@7=r^iMoPRAD_TF@`hh9Y$TAZKhV zba3@4rwQw_l54+>HS@F*hHXIjYX39a#VHSCF!yZNE#dhaGXOEzh`b$UKHb|*amwwVX z0cMWQ2up4H>y-zxqy}Z^p$SPMAl-fT&^Z(27~N|BR?>_G&7k#>t=nsDW=yQ+#X#@v z$M>P+GtH=e=FqnA`JPc_PR4uXcN&kO77tR52A+H<{`~oo)&5KL{CbZTKTlMCesks1vrk>uD` z77-Hy|2*LmeC)iixaSCa($Gxx!l@^pEQ;-Ftxv3Vk(1ii`hA42B&D)afQAq^F&R!` z7jLpnp7CZS(SghHvVgw(7}Jy6hUcLhx_MwfXJlx(jz1#bM(1RBU=vKq#Z?x(ya7T8 z99!rJ9o*h|uYCth!p3}zAU&Oz{e>|xJjK0oGW0Z*@{Pudx$w!W>#-++be2!oZN=Np zCiZzPp9XfjI-DXi zcH>q;?%EnoapOgSVDQ`{q!b2ZgoiLlb^TbzgM&%$S*V|~1Hob(Sew(Z@`&F{2@pX> z>S-y_vDZLGdEtzjS-#gyxElxPIImU z0|7YmsSBizZQOO7mC>dnKENfm{XB3nZXTr$v=&kN5l5qp9}L>Cd2-94sxz3%j% zlIg*?7;dx_Kf&k63HO)7geg1}Zmylz)=U!`#R(!rN__4%K|YeN*H~Zb7~RUBAMEM6 zyqGqWP|r*g8JgtoNEL0&ri}F`<~p#s6LiZh(<_kQy<=3%KIcdFuQ?})7gl;4J`N7q z;v83>zR*ICsf0j z)ts$hf699@D|7p{%j3s$7N~ur72QH(Xhk%Eq>KCZP6MYv!^jMcrCDfW#d_O~o9_g< z&2*!82_SFa53QnORnwleh3DC=)z0r;3X=2P4q7;YFZC|}#Nqd$#rO_FV2{S7KJ>-# zzwMQnoSd{4F9wM2=ueyL)&2?|_rd$)Kv8>?E(S<;Souphet)ukGcuCGj?$hv^G?M(SFvS5Mks*iSk^3JXg5Cws1x_{`sTE57 z&hO(|13`lj_(AnG} z!@fO@q|0=x6+2q)94qNgdMBHdj&9?#MgN}v&!x%sz@-;|R-6vJe@_Tr`eNOd&8%vx z)TyFJDCxW^<~F)X;CR@209kAl7{Kf9og2746Re&|g~tHIW3hb~wL2~TOql%$=i z)urEvR5{MxbxCy7QDHT1P!1>j)%qb&Cr~&KbMCoo$K^7|%laWSB4NKWiZilQ3MITp zfgAOmo}qs%1;^WowA{t)l#vZ*>ium~j+M`*w3icvkT=UjQo@l0{o7=h4%D9F+J0Vy z-p1cYxlU57YB7sgWIpwZNM9j$*=@36cd#AQIWK3ReyhLap-Vfbo{O9gH*S1-Xm%ml zBy;d<(fvrson3yvb(dIVsHp?Fen%_4;t%3ijyUa@MaOIcXkSg!MH80k1^bmAjB2?{ z4R*7|hUea>xX}|tb)=5OzcO!H{$$`ZRKM9qvMQVOZg!*Sn)E99+~rM}%Y=<2UY2$f zTMJE%a#h(KiA%?Uo`)>)5ieT>=`U=}9Op_thQYOLb=4$(UGRhb$OM1a-kj<1bKanB z>|>{P=v+(Oj7^xAbg(d0v1MEyTUH!AX-{ZHOaSL{x70~a>*Me@OayIOx2+KTG{gnh zF5KqG+_Y?>)gsq1eGu;R(1s&(q;$_Eanmczz2p2{S-E*T@O-^Ukf*Vf3TMAS#&4TL zt2z^Lk81kz7XSNOi1nhI_kaxAOj{8c85IfdCZjlkcZ< zwZ*E8(2D0uu@gYvfS~3bF}15EWhnGR%Ko%IzgCGhChnbwQOh{NBM}yOCX#!R5~|89 zrYqr=Su`}BKcFTtAAxoonE@RR>Fk37cBg z%!Xov5?fEZM0a;fOa?n@OhsiQ2`bHt?*t6^Kzy;R|~5o*x8ADkQ}I?A&ep>K7m<^ExhY z`ww$%eHWq|ttF48ptQr`oYwWd9-OW(EVOPg{t>ZRJ5MVrws>Z1nq?XnBMX5UmWoDx zho%iIR`IV%2f`5deyfw^b3em50Z(XGz_k=k9%y=iyWUGzKJQqZk` z8!vXfQ6MHUUFz!o>EXb@R!c1F)0euYv2j!o=@Lr-dQ|G2I`wyc@XBD$jZWqd~{%mn>Nugnz8bkM0EilAb0Nv+6OZyMj664%|(T7@-leF`B#9K|^9k2S|> z$$@TIddO6TTMxWX#6&K{5ine659Y?#^VGnRsB_+6V}hx!gy#(!E7a{bq=fEz?bq}# zj}xBy7ek|tnd48%IgdYM2u^3tXryZGGa`8JUZP72n*-D+(H<+Dw%J1Zy zSM9pmCQ!c0ycrQpyM!rIrHoj*Agpt<80+r#B|HZHbWJJF7LEkT=!=5l&#z>#7ZN;@ z`dXa+{Ni#VY|nKa3;~41K*TA~32g8-0@{-chc&K~UJ)$N9=d5gfOajdo&!>!Pd_sk zDaozCd=h0YwODlP!PZKASL3TE1u43?k5dK|>EYdY7(8(jJY5Jk)>^)j9w_h#Ccf8_ z+R`y$tT_GZRo^~W*)`+HqabQN1)<8ST7q!dpoFp(p}H3bc)S-wfe&}eG}X{ivFEcu21@J@eymdwVnTTGoeV+Tpc}3VZ*_HDecy~ zLE1LVPbwP@Z0S+B-3$RHw|4VIwYmkIN*kRHL&?8o*WY(ZVuCQMWLfPr{j6!f9n=hB zlJ=!8htgC{vpDH171OlAu+zZla=cbkI>)jxC!cg~tIjy%q4sKhY5Lf#8cd`_Dz_-o8nv& zrYmbsWFW$0$zK(fCBM4@h$j)ifsI0N%ihZZf@r-%(@XTIG)jzpop1*r8d%OB$?~-N zUqSzv+=;25Bal3rSDm)Fk%@V{{iecFTSX22KDtRQr}nN%BG?Q=Ogn0F+b4qS-?ARo zuU2QF+)1F;lN)sj&kScHPc+f{gMf|cZq7iHhch%0L3B3sCRr$2x)#{MeK?IkNIz+2 z*JIT@=io~IebmnqT#t$*%(7BMi2qp*o=lb23a<0KGu3$x=;AdJ?ozjc)$sOW^UrTK%Q%e+G3GDM$!se+N7rZQXqLwx&hfB72Ex)?lmb%yUJ^s8t zXNP52hJejfnOD#*^fY**Q5-5X{q7weN`14GcklqJN+t5>!htiz!Jcy0p}~eX;1LH%aT2hm*@CF`J zFzF*RJrlfbn|m0@hO^EcIMg;wc50)iyHaCjw2Q9z5SScotK;>EPTxCJDQXqFJNJZY zya`t>+}0^&QWMFlgI0oem{){W8d%KVMRPOyjO{wridvS_;l4J})2XMIGPR z{D&FIPjphUcsK+aROVD9lFa~eJnAI|W06ExQs8HoDMy`MD#+vg#)dIx16+SrG%`Jl zL3XS*VtQ!{xyCdA-d4k*4}aRNbSobLH6j=U+b*yNbvl#GR56L1>}*%>gk%!olmLpz z$-rPEPdEAUmc>s0)Q~4MiD2`lrPxRw8@&@e-=v?)VOU#N?XVFLW(r$)(J_KRsC{Bu z@NKYhK+PD6ppy`a;_p1yVJ2EzRoffiuK^+xpzsUfRHi?op_=0tc^shB zux{3@W|+sq^}q;ki|-r&6174h`+N`;yP$+r6`L;$9vcf*O#%-jE=b;hJ@&dw6JE{}Z%e|7vz ztLMevig-;fRVTfRQ0Mo7TzB)D+GloEEw}$RG9ppEQ~oWcN!5BYJrIuMLG+lSB&zZr z*zGpDvBL40rdAA2pOOVdu>?lgHYtVNjgOQJI5>*p9O|uo2)fJB>Tqn_3662vOI9c`W&@g<&r(t@JZs8?Cbv zhw*m;X~rOL-$t|Whj2I`92I@n&V~DRNlO;^FF~CVDKcxzr3QX}yIf!ikdpQZJsGFK z0`=x*qtto+DY<_|H(g=ur4O(^@~dGuo|PXz;uI9*i-~Y+B|dwNoD|VL1!030&dWgu z7QcwotZ!>XCG=@~f2yFwr^o6+$4OKU3hNxeXC&bVl6LHFr@_k$G3Ys##aTQy|e6jOTf-yFH3GRri4B?Rz{d3m_-8z_W#@Uphfi z1A!-&;I@k*ZF~cnB>z-R!q0nE#=CYMPWNY?3-=C<@2C_jJ)ps{ED-H~Y2|#vfw+8q zLP)3q0(VoNr5}$2^=j4w%~q4(VnAl!PPP7cejm%sKPP>ukNITi-BGwZF;-Mv^=gUW zA{*Em->OJM-D7n?Z2zak=L2+0i&%{HFR!MB=^h+Tl`2-5lXJM#(9jTw-LOM{Tr@o< zu8Br~-eMabu$r=wL8bjvU*v+}yelMfb}{X^gh2Wy zG-QrtQi{Fq{a9FW8A=Tioof!HV&8JA!Nz#E(i3Z{2yU&q!vFLb^+O8xpLTU-`ZARH z)FgkT51wxF50BsKf0gOFefoP2mhv+*o>rbZC1wb9-yVLC{!54kqsiG7*t}QnGa$s0 z0K#s{Fl?FfB6y&|Wwl%vIb(iD^CjCnu-33Ff*!3o3VkuUYr+-&c6y6bZ&N71ItrsYBaQ`>D}B;DqW^MDt%7v zXR9n7)_Ta;C;VSFM1jL(Te)vCepZ?*S}llZAL(tp0LeBd4yZnnur2-Sc*P1-Bzgpx z!A()?i;$ctHCXEVGNflFZyJWhtpC1 z`0o_v*VfY>(E{d^!3Y>Ki*p`1;$qYASlhSY8@zln6r-<%eCWdBO72^c2OWXUSne~8 z({R*y8pss?b@j5)d?3mB`SkF^8B%aYKbDd2dHx_sdt~#nOaUD;0J2pJ(R86uNE|2X z%39#c*LBdm2_M`LT@y#t=-vqt9$gFh&j{~#FB!kOLXvbi^M3C#rUW;_;`zpRkk|ZA z@%n%WEYEfv{kO>k6-2PKRIeU_tN*9uDuK1--)Ep+%^&@TCyqJ+tYiPf%t!UDEam@9 zvA?zSKmU)-`CE@VN_Oq2OUC{x6k@=KIqZKf@oO<3;;-h6Ac8i3_j4Ts76< zdUE6b_t&ykbhtJqAAqm(UuBkkSCO&SK7+Z&?L-;cz5KVsu2uTYpZ@i&K*wt-BBQzP z9H2hx4mf1=B%y{WD7nQ+U=RqLm*i(FLvaxys9z@rl7^VJRT}Ct879vr7JLrsR95H&aJ_TP`1&6*kVgNVq<>pRa65!j?JqOmkp55ke>T>x+gf}E>=+gI(V(93?0p{R<3G13u_);AdrbqxuzT-V;G~4E z2|w+9S^J&|ONvK)VHcrX>Gm+HU7KOH>kUmIOPYY&5fXjR>4TfFTVcrhLD{}2n%W~N z3beoF+1(KIzi?e58wwX6*5WP9ntse0n#+ z(}{xL}x58Kjs?$Bx?SAmTKB)e0?qS%Z?fNhVnn%(I4;oq%ZxQRi zT4&)a)|v%T<`{R(79v3FccHoKX8x?I`uaCL;p>~$vz~qjG>2@rCP^~no}vY_Xb(biUeHg{E_upYE&9h^x#xbvTte>A;Q*%ZX|%R74+ zok_UJBob@W^7MK?3p_O$Yk?^IWabNme5s?`6n9Imr)-af>5Qy0DG@WKfh$6^W2$!3KN*9w>6f2aI9$l?8L&dkkFN58oM1zrSxtKf_xm(6tqd_k z*?=R*4Y1$(j||Vz4}TY|5ts>JV%JOUm6cwLx<*(mRz4A)XNQHXH|Z3`IVDW~oHo2t zk7?^!UVgHpCGh~GOFMm-aj7`!Mlbxpnfvour;8GL?O(iJUgk^OadQrNXdS@w-Kgd__fZ_Nykfx=1=U$=WpKEQ_Hj}_!s3>HvhoqH z1t)FWaIsaob{1z#F1rKv1f6eZ=or$vR+&$HKs&uj1((LX-- zlP^s=vj;wC+$}kmb=CP^bbpMEb>4c(#e|OMv3MP~3s?lb%Jj@D%h1k|&r{Y*$x0+o zzmp9#{5zMk-!yv!7UyZ#hfxD_J&!&T>T&d+K2S5%vWWZBGABY0hTcZN?r8?+Sb^3* zcst1^q|W?_@i%BpqF?pQL!++31~TL?1YD!G>}Sb!e2&n5SCrpsJ)lx7@_oNC;02f@ zy`5@Lt`1iXz>|Ua215L7 zdIF4!D%U^0_ix7oQy7)KT!-nZsY{nStUrN3;y6=27LzQs^0MwWkA&LZZp8nF^W%=X zt{S$GUV{dcMgINS^MZc<_J&O@-r(RJE&n7~X=%aS@72Lwx42y2-0T?jnd@~*pf@w9QE zZ9dqrsHe;MRu031b0btD@ZsHWs?|&nh1NK#QOh+eyp1jD>Mt@~NSBMiSse6m2y3s; z7_HYdB^#}t>ejCMQo$2ID@a+tfRJu)2h9q`J-oPqGLQ6h$y2d`Yc3~D-Lo+ABup1K zZmtVjB4K^n6+Lp3*x}`s)@Zya74uNG`XCaMYDf-LSL317q2lbvxiJ)|?>Qx|wP>tS z)@&<8Xwj2fdlZhWZfW$i-T4q6{HGg&K@+}7yxgsjG3O=7o!~4)G9%&kf;2^VX4b)q zDwnxj6g8(};8}M&oT5rCzIpYVEqFC7CKx@kT!+@7A>m)ZbT z!weP#&lMHYF!-iee5s)+Z&T9k)nZ4>%U2be`a44p7_}7jnb6w$BaW+A-byWr$(Kre z>PKvBx^(SN69NBfw_mSWfa|ni*O_wkllZ!3YWk@R0->jWqduk}(+^qDZ!ZtYs5-M& zP`HV#E*Nd;-gw}SAoB&@;hhTlGUpl5zemDoMq}yKz~9Lj_GW$&+zo3 zIFhk!S<-Qho(MKga0GmiR)i9^B1iD@NFCCb~+TIhuUU`2gQ8-`_P(@DNC}nY)*y=@uJ0cf)i|^lpq!gTI=&LgwGN!AyG=9+|ckfc3JmpHt;BI5gBwn{1~~pq&E3E zfp2&GdJT;=ZG(i|ILm4-tC2fmdy6kx-788#_FbEoh6)r$z5K9ex&KG3WRYBW@W)6x z_Jjq2P=7_r6H5LlS>BkJeV17i0?s9pQ!i55UBvcXvHRwz(M{M@R~=gP4R=Yx;qR7t zs;OW0c(y0VcyF9z5x-QxnukFdoLBKdQWwCVbSKpW^n39Ix)dp+f zs9@YqYe3^%Y|}m#HxP4NCQ9U<( zgGXK+<#IhZQ{mYfms5PD9C;oJN)zDS-AGMw;jZovTlIL|aFqd{&_;>9sbcGHF88JF*g;yGyOC0d&WlSr`IdLvJ!mx|05n;tIudm2OGqJxEW_Ak(8y;`KZ;d)R>Z%Ef?u)U-_Ob^Izf^V`_mQN5@ zJP!G3c@3oXFDGa7XTcftw94bqKwjQ}9L6qqF`#Vr@k5OXP7ym->?|J?Gl zN#Fg0!BPQK zMcZ_kdPv=peCe3%jKXV+tgR(RTuko6aMrtvv47&f&218DMp%PI_WJ(CHI^6Os9nx#DUhUp*J1=3nY9Pp_DWH~@YpHQdBW&Xv z+GQZfMlwvT6?*u%Dxch+#`!FmM5nOq?zn)t$g1&U+aq6UAn9tyy^un_83eqrTrp!Q z1iF`J($J`n&GI`%2T`IUw5(#{S)0n%$?y45`Mr!!IYh6ZP>gtr==vT~@gocoEf#5mW&Mgu;O4t6_ z&~Vf5Opa_%8s5vdEf!DUT|D>=xF5UAd*OVwd>KM32S`#_UJlT#l^Ov z_^rn2c%i~=+ahlh&7{}|_j>}Mu1#P8vgt~6k!iZ7WheF5a)A|BsoF@gf4TSmtn&K= z2MU280^Mze9pOfSy5`bG8sU_K-fIucm7Au8olWTyJ0)^ZzizPs>uAv z-jkL?ZmsXFLi+j$pTC%=nc!BZsw#A>?&ijv+@&|D4@h~acRGdq(EzT6jmFJwcqIFN zLX|GkG0>rAK|8E27~7Ul-Py90g9t9$6S@D+JN;{e^V&m%Rv-4U=DH*+yF%MuaEiE@ z{1n*5tgO+4!BPV`UN@z%A;s*v7vvKvzdEz0EpnPTtrhmQCGyH@Hy7An`&cN4oIZQu z^C{GFDcjk){e7rQ-S0MTgrdJDvd66Rrk5f}%2(OINBukM7PJ={c}~=Fi{vWNrcMCH ze^6`l6DCuuuyCr`_E-n7Rv-2^iiFr6|0as$nSaj866n{=#hAlY|9yv)jKdI>&n zdzXPaT?0VMsq+%hu<^q5F5q}Kx8Mb7Q0*R9!$Td8GRtxPBI&K&{Cd>PyGcGoDqu&i z<+Z02;s-j>tNA0N=r`X><*BpEMgYo=FHL$JnvA}JLhhu-af4}-`O4^8(Kt)I+BcS?^Ys$Mg-|%3IGX@r=7aC zU!{6(AQ*&HXzP}Au-u^}nZ_OG)Vbc%%h` zOnIF8$2ale6{C|1Za{Z0N1jiOWo88TM(&;)XbhgaTwCy>xY(4(H|@5vw(*W3H9vN> z +
+
+
+
+
+
+
Utilisateur
+
+
+
+
+
+
+
+
+
+
Employer :
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
Suggestion :
+
+
+
+
+
+
+
+
+
Nom de l’entreprise
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Information :
+
+
+
+
+
+
+
+
+
+
+
Victoria’s Vice™
+
+
+
+
+
+
+
+
+
+
Utilisateur
+
+
+
+
+
+
+
+
+
+
Employer :
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
+
Nom du joueur
+
+
+
+
+
Suggestion :
+
+
+
+
+
+
+
+
+
Nom de l’entreprise
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Information :
+
+
+
+
+
+
+
+
+
+
+
Victoria’s Vice™
+
+
diff --git a/ressources/assets/Victorias_ViceTMV2.png b/ressources/assets/Victorias_ViceTMV2.png new file mode 100644 index 0000000000000000000000000000000000000000..d491adb9f4576f9164a29bc7557fc79d7706a8b3 GIT binary patch literal 175462 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 literal 0 HcmV?d00001 diff --git a/ressources/assets/template.png b/ressources/assets/template.png new file mode 100644 index 0000000000000000000000000000000000000000..5b24bc03b0335ab605ae65b4a0fc2d5f38a420a7 GIT binary patch literal 178225 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

^)V|aH#!&1=7Sa0a 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 RIPp>PGAh#f_ny4^{{Y)C(Oduk literal 0 HcmV?d00001 diff --git a/ressources/banque_data.json b/ressources/banque_data.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/ressources/banque_data.json @@ -0,0 +1 @@ +{} diff --git a/ressources/data.json b/ressources/data.json new file mode 100644 index 0000000..6f60fb7 --- /dev/null +++ b/ressources/data.json @@ -0,0 +1,500 @@ +{ + "identities": { + "353942721997832195": { + "nom": "RICCI", + "prenom": "Aldo", + "date_naissance": "22/05/1967", + "lieu_naissance": "Victoria's Vice", + "sexe": "Homme", + "date_expiration": "01/12/2026" + }, + "1096453463849828362": { + "nom": "DE MONTROSE", + "prenom": "Warren", + "date_naissance": "04/04/1991", + "lieu_naissance": "Londres", + "sexe": "Homme", + "date_expiration": "20/06/2027" + }, + "914118793918312480": { + "nom": "CORREA", + "prenom": "Mattia", + "date_naissance": "28/04/1986", + "lieu_naissance": "Milan", + "sexe": "Homme", + "date_expiration": "01/12/2026" + }, + "768915179995004988": { + "nom": "KASHMIRI", + "prenom": "Khalid", + "date_naissance": "19/07/1988", + "lieu_naissance": "Algérie", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "828923448453103637": { + "nom": "NORLOCK", + "prenom": "Bucky", + "date_naissance": "04/06/1999", + "lieu_naissance": "Venise", + "sexe": "Homme", + "date_expiration": "24/06/2027" + }, + "971446412690722826": { + "nom": "PAS GENTIL", + "prenom": "Pas gentil", + "date_naissance": "04/04/2025", + "lieu_naissance": "Pas Gentil", + "sexe": "Autre", + "date_expiration": "11/04/2027" + }, + "1324439906046574693": { + "nom": "DZQDQDZ", + "prenom": "Dzqdqzdz", + "date_naissance": "01/01/2000", + "lieu_naissance": "dzqd", + "sexe": "Femme", + "date_expiration": "12/03/2027" + }, + "1200313720195264613": { + "nom": "HAMILTON", + "prenom": "Leonardo", + "date_naissance": "09/01/1985", + "lieu_naissance": "Canada Québec", + "sexe": "Homme", + "date_expiration": "01/05/2027" + }, + "942073262333112351": { + "nom": "MURDOCK", + "prenom": "Matthew", + "date_naissance": "12/03/1990", + "lieu_naissance": "Hells Kitchen", + "sexe": "Homme", + "date_expiration": "11/04/2027" + }, + "828239898975666216": { + "nom": "VINDERTECH", + "prenom": "Félix", + "date_naissance": "11/05/1990", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "11/04/2027" + }, + "836606840254496788": { + "nom": "MARECHAL", + "prenom": "Charles", + "date_naissance": "08/01/1995", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "11/04/2027" + }, + "1126995714552111215": { + "nom": "FIGLINI", + "prenom": "José", + "date_naissance": "28/12/2001", + "lieu_naissance": "Victoria's Vice", + "sexe": "Homme", + "date_expiration": "11/04/2027" + }, + "1108087282692522105": { + "nom": "JULES", + "prenom": "Delcourt", + "date_naissance": "18/04/2004", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "25/06/2027" + }, + "1351957361333370932": { + "nom": "DURAND", + "prenom": "Mehdi", + "date_naissance": "20/11/2002", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "936337534760386580": { + "nom": "HAKERMAN", + "prenom": "Malo", + "date_naissance": "25/11/2000", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "449424004663607307": { + "nom": "DOLOS", + "prenom": "Arturo", + "date_naissance": "01/04/2001", + "lieu_naissance": "Salina", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "881841899634323456": { + "nom": "LAVIBE", + "prenom": "Rachid", + "date_naissance": "28/03/2001", + "lieu_naissance": "Portugal", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "946068504023556186": { + "nom": "MARSTON", + "prenom": "John", + "date_naissance": "09/10/1974", + "lieu_naissance": "Montreal", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "1203485889251115089": { + "nom": "CARTER", + "prenom": "Ethan", + "date_naissance": "16/11/2000", + "lieu_naissance": "Midnight city", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "1324527110425018438": { + "nom": "DEMARCHI", + "prenom": "Stella", + "date_naissance": "18/08/2001", + "lieu_naissance": "Milan", + "sexe": "Femme", + "date_expiration": "13/04/2027" + }, + "901856948184559676": { + "nom": "PILISO", + "prenom": "Dario", + "date_naissance": "25/02/1980", + "lieu_naissance": "Milan", + "sexe": "Homme", + "date_expiration": "13/04/2027" + }, + "906574786308734986": { + "nom": "FERRARI", + "prenom": "Pedro", + "date_naissance": "28/02/2000", + "lieu_naissance": "Rome", + "sexe": "Homme", + "date_expiration": "10/05/2027" + }, + "1311384140905709578": { + "nom": "LOPEZ", + "prenom": "Kayz", + "date_naissance": "04/07/2000", + "lieu_naissance": "Venise", + "sexe": "Homme", + "date_expiration": "22/06/2027" + }, + "501080933282218005": { + "nom": "GIORGINO", + "prenom": "Antoine", + "date_naissance": "17/06/2004", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "21/04/2027" + }, + "826145675506745395": { + "nom": "GALLERY", + "prenom": "Valentino", + "date_naissance": "19/06/1994", + "lieu_naissance": "Nice", + "sexe": "Homme", + "date_expiration": "21/04/2027" + }, + "534003230435442690": { + "nom": "DI REGIA", + "prenom": "Salvatore", + "date_naissance": "09/11/1990", + "lieu_naissance": "Rome", + "sexe": "Homme", + "date_expiration": "21/04/2027" + }, + "1304410873015832596": { + "nom": "EL MASRI", + "prenom": "Rayan", + "date_naissance": "21/10/1999", + "lieu_naissance": "Algerie", + "sexe": "Homme", + "date_expiration": "25/04/2027" + }, + "1321933664535183395": { + "nom": "MICKALSON", + "prenom": "Jackson", + "date_naissance": "08/02/1995", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "25/04/2027" + }, + "1267066015238586452": { + "nom": "BLOSSOM", + "prenom": "Kira", + "date_naissance": "23/02/2003", + "lieu_naissance": "Miami", + "sexe": "Homme", + "date_expiration": "25/04/2027" + }, + "1263573205268828231": { + "nom": "FERNANDEZ", + "prenom": "Mattéo", + "date_naissance": "07/05/1999", + "lieu_naissance": "Mexique", + "sexe": "Homme", + "date_expiration": "25/04/2027" + }, + "730574544821157988": { + "nom": "ZENTORNO", + "prenom": "Neiz", + "date_naissance": "10/06/2000", + "lieu_naissance": "Algérie", + "sexe": "Homme", + "date_expiration": "25/04/2027" + }, + "1244372888702816458": { + "nom": "LOPEZ", + "prenom": "Oussama", + "date_naissance": "11/07/2002", + "lieu_naissance": "chatelet les halles", + "sexe": "Homme", + "date_expiration": "27/04/2027" + }, + "1321863072242995332": { + "nom": "RAMINEZ", + "prenom": "Rios", + "date_naissance": "10/02/2004", + "lieu_naissance": "Rome", + "sexe": "Homme", + "date_expiration": "09/06/2027" + }, + "1363308330721738842": { + "nom": "BELFORD", + "prenom": "Jordan", + "date_naissance": "13/11/2004", + "lieu_naissance": "Manhattan New York", + "sexe": "Homme", + "date_expiration": "16/05/2027" + }, + "599130976806764545": { + "nom": "HAMILTON", + "prenom": "William", + "date_naissance": "23/08/1977", + "lieu_naissance": "Québec", + "sexe": "Homme", + "date_expiration": "01/05/2027" + }, + "1268584648611729418": { + "nom": "VINCE", + "prenom": "Kyle", + "date_naissance": "08/07/2000", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "03/05/2027" + }, + "727188532669448509": { + "nom": "LEROY", + "prenom": "Mady", + "date_naissance": "19/03/1997", + "lieu_naissance": "montreal", + "sexe": "Femme", + "date_expiration": "08/05/2027" + }, + "1322531063012134943": { + "nom": "REVERSE", + "prenom": "Stanle", + "date_naissance": "07/10/2002", + "lieu_naissance": "Los Angeles", + "sexe": "Homme", + "date_expiration": "03/05/2027" + }, + "1361493382911758528": { + "nom": "AMARA", + "prenom": "Madja", + "date_naissance": "12/06/2000", + "lieu_naissance": "Annaba", + "sexe": "Femme", + "date_expiration": "10/05/2027" + }, + "561485865562406914": { + "nom": "ASVALT", + "prenom": "Harmonium", + "date_naissance": "01/01/2000", + "lieu_naissance": "Luxembourg", + "sexe": "Homme", + "date_expiration": "10/05/2027" + }, + "1282306873563021357": { + "nom": "GRIMM", + "prenom": "Djelys", + "date_naissance": "25/09/1999", + "lieu_naissance": "Paris", + "sexe": "Homme", + "date_expiration": "10/05/2027" + }, + "1238099342288752661": { + "nom": "MAJO GARO", + "prenom": "Wireless", + "date_naissance": "1984/10/28", + "lieu_naissance": "Mexique", + "sexe": "Homme", + "date_expiration": "17/05/2027" + }, + "1058418257142501417": { + "nom": "LOUÏE", + "prenom": "Jean", + "date_naissance": "02/07/2005", + "lieu_naissance": "Toulouse", + "sexe": "Homme", + "date_expiration": "29/05/2027" + }, + "1351821260140707862": { + "nom": "RICCI", + "prenom": "Antonio", + "date_naissance": "30/03/2000", + "lieu_naissance": "Rome", + "sexe": "Homme", + "date_expiration": "07/06/2027" + }, + "558327236378361857": { + "nom": "MUSULIN", + "prenom": "Tony", + "date_naissance": "15/11/1987", + "lieu_naissance": "New York", + "sexe": "Homme", + "date_expiration": "07/06/2027" + }, + "1364012189052178533": { + "nom": "LORAS", + "prenom": "Philippe", + "date_naissance": "06/03/2000", + "lieu_naissance": "Kinshasa", + "sexe": "Homme", + "date_expiration": "20/06/2027" + }, + "1350161151539024007": { + "nom": "PILISO", + "prenom": "Antonio", + "date_naissance": "30/11/2006", + "lieu_naissance": "Bogotta", + "sexe": "Homme", + "date_expiration": "07/06/2027" + }, + "1312077385780301865": { + "nom": "LONDUHAUT", + "prenom": "Yanis", + "date_naissance": "07/03/2001", + "lieu_naissance": "New York", + "sexe": "Homme", + "date_expiration": "09/06/2027" + }, + "1217095995804876950": { + "nom": "SMITH", + "prenom": "Franklin", + "date_naissance": "11/08/2004", + "lieu_naissance": "Los Angeles", + "sexe": "Homme", + "date_expiration": "22/06/2027" + }, + "376796341071773706": { + "nom": "FRICADELLO", + "prenom": "Niccolo", + "date_naissance": "24/11/1987", + "lieu_naissance": "Chihuahua", + "sexe": "Homme", + "date_expiration": "15/06/2027" + }, + "478564181356838922": { + "nom": "ECCLESTON", + "prenom": "John", + "date_naissance": "21 aout 1990", + "lieu_naissance": "Londres", + "sexe": "Homme", + "date_expiration": "15/06/2027" + }, + "897082541033545739": { + "nom": "SALVADOR", + "prenom": "Diego", + "date_naissance": "18/06/2003", + "lieu_naissance": "Mexico", + "sexe": "Homme", + "date_expiration": "22/06/2027" + }, + "1048991928496177152": { + "nom": "BRABUS", + "prenom": "Selim", + "date_naissance": "08/01/2002", + "lieu_naissance": "Rome", + "sexe": "Homme", + "date_expiration": "15/06/2027" + }, + "1351650470392893512": { + "nom": "LOPEZ", + "prenom": "Jason", + "date_naissance": "19/09/1990", + "lieu_naissance": "Milano", + "sexe": "Homme", + "date_expiration": "19/06/2027" + }, + "1218642392043884685": { + "nom": "MANCINI", + "prenom": "Salvatore", + "date_naissance": "22/11/1965", + "lieu_naissance": "Venice", + "sexe": "Homme", + "date_expiration": "19/06/2027" + }, + "1246814346139668553": { + "nom": "MENDEZ", + "prenom": "Arthur", + "date_naissance": "20/03/2000", + "lieu_naissance": "Guillerval", + "sexe": "Homme", + "date_expiration": "19/06/2027" + }, + "1072112886509473792": { + "nom": "FROG", + "prenom": "Beka", + "date_naissance": "19/10/1994", + "lieu_naissance": "Toronto", + "sexe": "Homme", + "date_expiration": "20/06/2027" + }, + "690202239536857174": { + "nom": "DO SANTOS", + "prenom": "Raphaël", + "date_naissance": "19/06/1998", + "lieu_naissance": "Sao Paulo", + "sexe": "Homme", + "date_expiration": "22/06/2027" + }, + "1290382773013577802": { + "nom": "DO SANTOS", + "prenom": "Fernando", + "date_naissance": "04/02/2003", + "lieu_naissance": "Sao Paulo", + "sexe": "Homme", + "date_expiration": "25/06/2027" + }, + "930869581931745410": { + "nom": "REAPER", + "prenom": "Tommy", + "date_naissance": "25/01/2003", + "lieu_naissance": "New York", + "sexe": "Homme", + "date_expiration": "25/06/2027" + }, + "667478308870422568": { + "nom": "SUPER", + "prenom": "Giovanni", + "date_naissance": "08/10/1993", + "lieu_naissance": "Stockholm", + "sexe": "Homme", + "date_expiration": "02/07/2027" + }, + "1341203038609739889": { + "nom": "MARAZEL", + "prenom": "Tyson", + "date_naissance": "26/08/2002", + "lieu_naissance": "Marseille", + "sexe": "Homme", + "date_expiration": "04/07/2027" + } + } +} \ No newline at end of file diff --git a/stats_commandes.json b/stats_commandes.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/stats_commandes.json @@ -0,0 +1 @@ +{} diff --git a/taches.json b/taches.json new file mode 100644 index 0000000..c393e93 --- /dev/null +++ b/taches.json @@ -0,0 +1,64 @@ +{ + "taches": { + "7": { + "titre": "Contactez White", + "description": "Faire des vidéos de la map", + "assigné": 534003230435442690, + "statut": "À faire", + "priorité": "Critique", + "échéance": "2025-06-30", + "créé_par": 971446412690722826, + "commentaires": [] + }, + "10": { + "titre": "Vocal en rapport avec les sanctions récente", + "description": "J'aimerais que tu me programme une voc **URGENTE** avec Nooxi au plus vite et toi pour que je discute avec vous a propos des sanctions à votre encontre", + "assigné": 1108087282692522105, + "statut": "Terminée", + "priorité": "Critique", + "échéance": "2025-07-04", + "créé_par": 971446412690722826, + "commentaires": [] + }, + "8": { + "titre": "PRÉSENTATION DU SERVEUR", + "description": "refaire la présentation du serveur", + "assigné": 914118793918312480, + "statut": "À faire", + "priorité": "Haute", + "échéance": "2025-02-07", + "créé_par": 914118793918312480, + "commentaires": [] + }, + "9": { + "titre": "Liste Métier counter", + "description": "Bot qui ajoute automatiquement +1 ou -1 sur le poste quand un joueur reçoit le rôle", + "assigné": 971446412690722826, + "statut": "🛠️ V1.7 de Vicy en préparation. 📅 Sortie à définir.", + "priorité": "Moyenne", + "échéance": "2025-07-04", + "créé_par": 667478308870422568, + "commentaires": [] + }, + "3": { + "titre": "Mise en production de Vicy publique", + "description": "Création de Vicy publique", + "assigné": 971446412690722826, + "statut": "À faire", + "priorité": "Basse", + "échéance": "2025-09-01", + "créé_par": 971446412690722826, + "commentaires": [] + }, + "151": { + "titre": "dzqdz", + "description": "dzqqdz", + "assigné": 971446412690722826, + "statut": "Terminée", + "priorité": "Critique", + "échéance": "2025-07-22", + "créé_par": 971446412690722826, + "commentaires": [] + } + } +} \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/banque_manager.py b/utils/banque_manager.py new file mode 100644 index 0000000..4b594be --- /dev/null +++ b/utils/banque_manager.py @@ -0,0 +1,58 @@ +import json +import os +from datetime import datetime +from .logger import log_error + +class BanqueManager: + def __init__(self): + + self.file_path = "comptes_bancaires.json" + self.comptes = {} + self.load_data() + + def load_data(self): + """Charge les données bancaires depuis un fichier JSON.""" + if os.path.exists(self.file_path): + try: + with open(self.file_path, "r", encoding="utf-8") as f: + data = f.read().strip() + self.comptes = json.loads(data) if data else {} + except json.JSONDecodeError: + log_error("Erreur de lecture dans comptes_bancaires.json, réinitialisation...") + self.comptes = {} + self.save_data() + + def save_data(self): + """Sauvegarde les comptes et transactions dans comptes_bancaires.json.""" + with open(self.file_path, "w", encoding="utf-8") as f: + json.dump(self.comptes, f, indent=4, ensure_ascii=False) + + def enregistrer_transaction(self, emetteur_id, destinataire_id, montant, type_transaction): + """ + Enregistre une transaction dans l'historique et recharge les données en temps réel. + """ + self.load_data() + + transaction = { + "date": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), + "type": type_transaction, + "montant": montant, + "emetteur": emetteur_id, + "destinataire": destinataire_id + } + + if emetteur_id not in self.comptes: + self.comptes[emetteur_id] = {"solde": 0, "prets": [], "transactions": []} + elif "transactions" not in self.comptes[emetteur_id]: + self.comptes[emetteur_id]["transactions"] = [] + + self.comptes[emetteur_id]["transactions"].append(transaction) + + if destinataire_id not in self.comptes: + self.comptes[destinataire_id] = {"solde": 0, "prets": [], "transactions": []} + elif "transactions" not in self.comptes[destinataire_id]: + self.comptes[destinataire_id]["transactions"] = [] + + self.comptes[destinataire_id]["transactions"].append(transaction) + + self.save_data() diff --git a/utils/card_generator.py b/utils/card_generator.py new file mode 100644 index 0000000..b580b93 --- /dev/null +++ b/utils/card_generator.py @@ -0,0 +1,126 @@ +import os +import aiohttp +import discord +from io import BytesIO +from PIL import Image, ImageDraw, ImageFont + +class CardGenerator: + def __init__(self): + self.session = None + self.template = None + self.watermark = None + self.font_regular = None + self.font_bold = None + self.font_large = None + self.create_template() + + def create_template(self): + try: + CI_path = "/home/discord/Bot/Vicy/ressources/assets/CIITAL.png" + + if not os.path.exists(CI_path): + raise FileNotFoundError(f"Image de fond introuvable : {CI_path}") + + # Chargement de l'image de base + self.template = Image.open(CI_path).convert("RGBA") + self.template = self.template.resize((800, 500)) + + # Vérifier que l'image a bien été chargée + if self.template is None: + raise ValueError("L'image de fond n'a pas été chargée correctement.") + + # Chargement des polices + try: + self.font_regular = ImageFont.load_default() + self.font_bold = ImageFont.load_default() + self.font_large = ImageFont.load_default() + except Exception as e: + print(f"Erreur lors du chargement des polices: {e}") + self.font_regular = None + self.font_bold = None + self.font_large = None + + # Créer un filigrane transparent + self.watermark = Image.new('RGBA', (800, 500), (255, 255, 255, 0)) + watermark_draw = ImageDraw.Draw(self.watermark) + + for i in range(0, 800, 100): + for j in range(0, 500, 100): + watermark_draw.text((i, j), "", fill=(200, 200, 200, 100)) + + except Exception as e: + print(f"Erreur lors de la création du template: {e}") + self.template = None + self.watermark = None + + async def get_session(self): + if self.session is None: + self.session = aiohttp.ClientSession() + return self.session + + async def download_avatar(self, user): + if not user.avatar: + return Image.new('RGBA', (200, 200), (128, 128, 128, 255)) + + try: + session = await self.get_session() + async with session.get(str(user.avatar.url)) as response: + if response.status == 200: + avatar_data = await response.read() + return Image.open(BytesIO(avatar_data)).convert('RGBA') + except Exception as e: + print(f"Erreur lors du téléchargement de l'avatar: {e}") + return Image.new('RGBA', (200, 200), (128, 128, 128, 255)) + + async def create_identity_card(self, user, identity_data): + if not self.template: + self.create_template() + if not self.template: + raise Exception("Impossible de créer le template") + + card = self.template.copy() + draw = ImageDraw.Draw(card) + + try: + # Photo de profil + avatar = await self.download_avatar(user) + avatar = avatar.resize((200, 200), Image.LANCZOS) + mask = Image.new('L', avatar.size, 0) + mask_draw = ImageDraw.Draw(mask) + mask_draw.ellipse((0, 0, 200, 200), fill=255) + card.paste(avatar, (50, 120), mask) + + # Informations personnelles + text_positions = { + 'nom': (328, 169), + 'prenom': (329, 212), + 'date_naissance': (329, 254), + 'lieu_naissance': (489, 169), + 'sexe': (511, 212), + 'date_expiration': (26, 408) + } + + for field, pos in text_positions.items(): + value = str(identity_data[field]) + + draw.text(pos, + value, + fill='black', + font=self.font_bold if field in ['nom', 'prenom'] else self.font_regular) + + if self.watermark: + card.paste(self.watermark, (0, 0), self.watermark) + + buffer = BytesIO() + card.save(buffer, format='PNG') + buffer.seek(0) + return buffer + + except Exception as e: + print(f"Erreur lors de la création de la carte: {e}") + raise + + async def cleanup(self): + if self.session: + await self.session.close() + self.session = None diff --git a/utils/data_manager.py b/utils/data_manager.py new file mode 100644 index 0000000..b095ce9 --- /dev/null +++ b/utils/data_manager.py @@ -0,0 +1,61 @@ +import json +import os +from datetime import datetime, timedelta + + +class DataManager: + """ Gère la sauvegarde et le chargement des données. """ + + def __init__(self): + self.identities = {} + self.load_data() + + def save_data(self): + """ Sauvegarde les identités dans un fichier JSON. """ + try: + with open('ressources/data.json', 'w', encoding='utf-8') as f: + json.dump({'identities': self.identities}, f, ensure_ascii=False, indent=4) + except Exception as e: + print(f"Erreur lors de la sauvegarde des données: {e}") + + def load_data(self): + """ Charge les identités depuis un fichier JSON. """ + try: + if os.path.exists('ressources/data.json'): + with open('ressources/data.json', 'r', encoding='utf-8') as f: + data = json.load(f) + self.identities = data.get('identities', {}) + except Exception as e: + print(f"Erreur lors du chargement des données: {e}") + self.identities = {} + +class DataManager: + def __init__(self): + """Initialise le gestionnaire de données et charge les identités existantes.""" + self.file_path = os.path.join(os.path.dirname(__file__), "../ressources/data.json") + self.identities = self.load_data() # Charge les données existantes + + def load_data(self): + """Charge les identités depuis le fichier JSON.""" + if not os.path.exists(self.file_path): + print(f"⚠️ Fichier {self.file_path} introuvable. Création d'un nouveau fichier...") + self.save_data() # Crée un fichier vide + return {} + + try: + with open(self.file_path, "r", encoding="utf-8") as f: + data = json.load(f) + return data.get("identities", {}) + except (json.JSONDecodeError, IOError) as e: + print(f"❌ Erreur lors du chargement des données : {e}") + return {} + + def save_data(self): + """Sauvegarde les identités dans un fichier JSON.""" + try: + os.makedirs(os.path.dirname(self.file_path), exist_ok=True) + with open(self.file_path, "w", encoding="utf-8") as f: + json.dump({"identities": self.identities}, f, ensure_ascii=False, indent=4) + print(f"✅ Données sauvegardées dans {self.file_path}") + except IOError as e: + print(f"❌ Erreur lors de la sauvegarde des données : {e}") diff --git a/utils/gestion_taches.py b/utils/gestion_taches.py new file mode 100644 index 0000000..f35a1b6 --- /dev/null +++ b/utils/gestion_taches.py @@ -0,0 +1,89 @@ +import json +import os +import asyncio +from datetime import datetime + +FICHIER_TACHES = "taches.json" +FICHIER_TACHES_TMP = "taches.json.tmp" +FICHIER_ID = "id_compteur.json" +file_lock = asyncio.Lock() + +async def charger_taches(): + async with file_lock: + if not os.path.exists(FICHIER_TACHES): + with open(FICHIER_TACHES, "w", encoding='utf-8') as f: + json.dump({"taches": {}}, f, indent=4) + with open(FICHIER_TACHES, "r", encoding='utf-8') as f: + return json.load(f) + +async def sauvegarder_taches(donnees): + async with file_lock: + with open(FICHIER_TACHES_TMP, "w", encoding='utf-8') as f: + json.dump(donnees, f, indent=4, ensure_ascii=False) + os.replace(FICHIER_TACHES_TMP, FICHIER_TACHES) + +async def generer_id_unique(): + async with file_lock: + if not os.path.exists(FICHIER_ID): + with open(FICHIER_ID, "w", encoding='utf-8') as f: + json.dump({"dernier_id": 0}, f, indent=4) + + with open(FICHIER_ID, "r+", encoding='utf-8') as f: + data = json.load(f) + data["dernier_id"] += 1 + f.seek(0) + json.dump(data, f, indent=4) + f.truncate() + return str(data["dernier_id"]) + +async def ajouter_tache(titre, description, user_id, priorite, date_echeance, auteur_id): + data = await charger_taches() + taches = data["taches"] + id_tache = await generer_id_unique() + + taches[id_tache] = { + "titre": titre, + "description": description, + "assigné": user_id, + "statut": "À faire", + "priorité": priorite, + "échéance": date_echeance, + "créé_par": auteur_id, + "commentaires": [] + } + + await sauvegarder_taches(data) + return id_tache + +async def update_tache_status(id_tache, statut): + data = await charger_taches() + if id_tache in data["taches"]: + data["taches"][id_tache]["statut"] = statut + await sauvegarder_taches(data) + return True + return False + +async def supprimer_tache(id_tache): + data = await charger_taches() + if id_tache in data["taches"]: + del data["taches"][id_tache] + await sauvegarder_taches(data) + return True + return False + +async def lister_taches_utilisateur(user_id): + data = await charger_taches() + return {tid: t for tid, t in data["taches"].items() if t["assigné"] == user_id} + +async def taches_proches(): + data = await charger_taches() + proches = {} + now = datetime.now() + for tid, t in data["taches"].items(): + try: + date_obj = datetime.strptime(t["échéance"], "%Y-%m-%d") + if 0 <= (date_obj - now).days <= 2: + proches[tid] = t + except ValueError: + continue + return proches diff --git a/utils/image_generator.py b/utils/image_generator.py new file mode 100644 index 0000000..f2c3505 --- /dev/null +++ b/utils/image_generator.py @@ -0,0 +1,50 @@ +import json +from PIL import Image, ImageDraw, ImageFont +import os + +def generate_bank_image(user_id, balance, transactions): + """Génère une image avec les informations bancaires de l'utilisateur.""" + + image_path = "ressources/assets/template.png" + if not os.path.exists(image_path): + print(f"❌ Erreur : Fichier {image_path} introuvable.") + return None + + image = Image.open(image_path) + draw = ImageDraw.Draw(image) + + # Vérifier que la police existe + font_path = "ressources/font.ttf" + if not os.path.exists(font_path): + print("❌ Erreur : Police introuvable, chargement de la police par défaut.") + font_large = ImageFont.load_default() + font_small = ImageFont.load_default() + else: + font_large = ImageFont.truetype(font_path, 120) + font_small = ImageFont.truetype(font_path, 30) + + # Centrer le solde en dessous de la fenêtre bleue + balance_text = f"Solde : {balance} €" + balance_x = (image.width - draw.textlength(balance_text, font=font_large)) // 2 + balance_y = 850 # Ajustez cette valeur pour positionner le texte en dessous de la fenêtre bleue + draw.text((balance_x, balance_y), balance_text, fill="white", font=font_large) + + # Affichage des transactions + start_x = 50 # Ajustez cette valeur pour l'alignement horizontal + start_y = 400 # Ajustez cette valeur pour l'alignement vertical + spacing_y = 60 # Espace entre les lignes de transaction + + for transaction in transactions[:3]: # Max 3 transactions + transaction_text = f"{transaction['date']} - {transaction['type']} : {transaction['montant']}€" + draw.text((start_x, start_y), transaction_text, fill="black", font=font_small) + start_y += spacing_y + + # Supprimer le texte "Victoria’s Vice™" + erase_box = (30, image.height - 50, 250, image.height - 20) + draw.rectangle(erase_box, fill=(255, 255, 255)) + + # Sauvegarde de l'image générée + output_path = f"ressources/bank_{user_id}.png" + image.save(output_path) + print(f"✅ Image bancaire générée : {output_path}") + return output_path diff --git a/utils/logger.py b/utils/logger.py new file mode 100644 index 0000000..69bad5d --- /dev/null +++ b/utils/logger.py @@ -0,0 +1,34 @@ +import logging +from datetime import datetime +import pytz # Nécessite le package pytz + +# Définir le fuseau horaire France +paris_tz = pytz.timezone("Europe/Paris") + +class FranceFormatter(logging.Formatter): + def formatTime(self, record, datefmt=None): + dt = datetime.fromtimestamp(record.created, tz=paris_tz) + if datefmt: + return dt.strftime(datefmt) + return dt.isoformat() + +# Création du logger +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +# Handler vers fichier +file_handler = logging.FileHandler("log.txt", encoding="utf-8") +formatter = FranceFormatter("%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") +file_handler.setFormatter(formatter) + +logger.addHandler(file_handler) + +# Fonctions de log +def log_info(message): + logger.info(message) + +def log_warning(message): + logger.warning(message) + +def log_error(message): + logger.error(message) diff --git a/utils/stats_manager.py b/utils/stats_manager.py new file mode 100644 index 0000000..1c9b41a --- /dev/null +++ b/utils/stats_manager.py @@ -0,0 +1,82 @@ +import sqlite3 +import datetime +import os + +# Chemin de la base de données (dans un sous-dossier "data" pour garder le projet propre) +DB_PATH = "data/stats.db" + +# Crée le dossier "data" si besoin +os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) + +# Connexion à la base de données +conn = sqlite3.connect(DB_PATH) +cursor = conn.cursor() + +# Création de la table si elle n'existe pas +cursor.execute(''' +CREATE TABLE IF NOT EXISTS commandes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nom TEXT, + user_id INTEGER, + guild_id INTEGER, + date TIMESTAMP +) +''') +conn.commit() + +def enregistrer_utilisation(nom_commande, user_id, guild_id): + """Enregistre l'utilisation d'une commande.""" + cursor.execute( + "INSERT INTO commandes (nom, user_id, guild_id, date) VALUES (?, ?, ?, ?)", + (nom_commande, user_id, guild_id, datetime.datetime.now()) + ) + conn.commit() + +def get_stats(): + """Retourne les statistiques d'utilisation du bot.""" + cursor.execute("SELECT COUNT(*) FROM commandes") + total = cursor.fetchone()[0] + + cursor.execute("SELECT nom, COUNT(*) as nb FROM commandes GROUP BY nom ORDER BY nb DESC LIMIT 5") + top_commandes = cursor.fetchall() + + cursor.execute("SELECT user_id, COUNT(*) as nb FROM commandes GROUP BY user_id ORDER BY nb DESC LIMIT 1") + top_user = cursor.fetchone() + + return total, top_commandes, top_user + + +def get_stats_detailed(): + # Exemple de données simulées, à remplacer par tes vraies données + from datetime import datetime, timedelta + + total_commandes = 1234 + top_commandes = [("help", 250), ("stats_bot", 180), ("play", 160), ("ban", 100), ("kick", 90)] + top_utilisateurs = [(123456789012345678, 300), (987654321098765432, 220), (111222333444555666, 180), (444555666777888999, 160), (555666777888999000, 130)] + + today = datetime.today() + evolution_commandes = [] + for i in range(7): # dernière semaine + day = today - timedelta(days=6 - i) + evolution_commandes.append((day, 150 + i*10)) + + repartition_statuts = {"À faire": 50, "En cours": 30, "Terminée": 70, "Bloqué": 10} + + commandes_par_jour = { + "Lundi": 180, + "Mardi": 210, + "Mercredi": 150, + "Jeudi": 200, + "Vendredi": 220, + "Samedi": 90, + "Dimanche": 40, + } + + return { + "total_commandes": total_commandes, + "top_commandes": top_commandes, + "top_utilisateurs": top_utilisateurs, + "evolution_commandes": evolution_commandes, + "repartition_statuts": repartition_statuts, + "commandes_par_jour": commandes_par_jour + } diff --git a/utils/welcome_message.py b/utils/welcome_message.py new file mode 100644 index 0000000..c3d6d62 --- /dev/null +++ b/utils/welcome_message.py @@ -0,0 +1,30 @@ +import discord +from discord.ext import commands +from utils.logger import log_info, log_error + +class WelcomeMessage(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_member_join(self, member): + try: + # ID du salon discussion + welcome_channel_id = 1278483527783944242 + welcome_channel = member.guild.get_channel(welcome_channel_id) + + if welcome_channel: + welcome_message = ( + f"## BIENVENUE <:panda_welcome:1297298999849517056> !\n\n" + f"> **L'équipe staff te souhaite la bienvenue sur Victoria's Vice {member.mention} !**\n\n" + f"> Pour ta candidature <:arrow_1:1297491509201080362> <#1278477608392196176> / <#1278477152215371806> \n\n" + f"> Si tu as des questions <:arrow_1:1297491509201080362> <#1279037583820718120>\n\n" + f"*> Bien cordialement, L'équipe staff de Victoria's Vice*" + ) + + await welcome_channel.send(welcome_message) + except Exception as e: + print(f"Erreur lors de l'envoi du message de bienvenue: {e}") + +async def setup(bot): + await bot.add_cog(WelcomeMessage(bot)) diff --git a/visite_médicale.json b/visite_médicale.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/visite_médicale.json @@ -0,0 +1 @@ +{}