From f351794aa0684208afc1cdc1ea47d604c6e5ac26 Mon Sep 17 00:00:00 2001 From: ynerant Date: Thu, 11 Feb 2021 22:32:40 +0100 Subject: [PATCH 01/14] Documentation on documentation Signed-off-by: ynerant --- docs/documentation.rst | 37 +++++++++++++++++++++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 38 insertions(+) create mode 100644 docs/documentation.rst diff --git a/docs/documentation.rst b/docs/documentation.rst new file mode 100644 index 00000000..d1e182fd --- /dev/null +++ b/docs/documentation.rst @@ -0,0 +1,37 @@ +Documentation +============= + +La documentation est gérée grâce à Sphinx. Le thème est le thème officiel de +ReadTheDocs ``sphinx-rtd-theme``. + +Générer localement la documentation +----------------------------------- + +On commence par se rendre au bon endroit et installer les bonnes dépendances : + +.. code:: bash + + cd docs + pip install -r requirements.txt + +La documentation se génère à partir d'appels à ``make``, selon le type de +documentation voulue. + +Par exemple, ``make dirhtml`` construit la documentation web, +``make latexpdf`` construit un livre PDF avec cette documentation. + + +Documentation automatique +------------------------- + +Ansible compile et déploie automatiquement la documentation du projet, dans +le rôle ``8-docs``. Le rôle installe dans le bon environnement les dépendances +nécessaires, puis appelle sphinx pour placer la documentation compilée dans +``/var/www/documentation`` : + +.. code:: bash + + /var/www/note_kfet/env/bin/sphinx-build -b dirhtml /var/www/note_kfet/docs/ /var/www/documentation/ + +Ce dossier est exposé par ``nginx`` sur le chemin +`/doc `_. diff --git a/docs/index.rst b/docs/index.rst index ac17e171..d80ad515 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,4 +12,5 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans :caption: Développement de la NK20 apps/index + documentation external_services/index From c27159383964fcf2fd4fa4738b0eda698058efd8 Mon Sep 17 00:00:00 2001 From: ynerant Date: Fri, 12 Feb 2021 19:45:57 +0100 Subject: [PATCH 02/14] Fix markdown typos Signed-off-by: ynerant --- docs/api/index.rst | 2 +- docs/apps/index.rst | 2 +- docs/apps/permission.rst | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/api/index.rst b/docs/api/index.rst index 32068d88..fc55fc5c 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -114,7 +114,7 @@ Les filtres disponibles sont indiqués sur chacune des pages de documentation. Le résultat est déjà par défaut filtré par droits : seuls les éléments que l'utilisateur à le droit de voir sont affichés. Cela est possible grâce à la structure des permissions, générant justement des filtres de requêtes de base de données. -Une requête à l'adresse ``/api//pk/`` affiche directement les informations du modèle demandé au format JSON. +Une requête à l'adresse ``/api///`` affiche directement les informations du modèle demandé au format JSON. POST ~~~~ diff --git a/docs/apps/index.rst b/docs/apps/index.rst index d8f07ae1..d1fa1ee0 100644 --- a/docs/apps/index.rst +++ b/docs/apps/index.rst @@ -46,7 +46,7 @@ Applications indispensables Applications packagées ---------------------- * ``polymorphic`` - Utiliser pour la création de models polymorphiques (``Note`` et ``Transaction`` notamment) cf [Note](Note). + Utiliser pour la création de models polymorphiques (``Note`` et ``Transaction`` notamment) cf `Note `_. L'utilisation des models polymorphiques est détaillé sur la documentation du package: ``_ diff --git a/docs/apps/permission.rst b/docs/apps/permission.rst index aa6e1811..bffc69a7 100644 --- a/docs/apps/permission.rst +++ b/docs/apps/permission.rst @@ -19,8 +19,8 @@ Une permission est un Model Django dont les principaux attributs sont : * ``model`` : Le model sur lequel cette permission va s'appliquer * ``type`` : Les différents types d'interaction sont : voir (``view``), modifier (``change``), ajouter (``add``) et supprimer (``delete``). -* ``query`` : Requete sur la cible, encodé en JSON, traduit en un Q object (cf [Query](#compilation-de-la-query) -* ``field`` : le champ cible qui pourra etre modifié. (tous les champs si vide) +* ``query`` : Requête sur la cible, encodé en JSON, traduit en un Q object (cf `Query <#compilation-de-la-query>`_) +* ``field`` : le champ cible qui pourra être modifié. (tous les champs si vide) Pour savoir si un utilisateur a le droit sur un modèle ou non, la requête est compilée (voir ci-dessous) en un filtre de requête dans la base de données, un objet de la classe ``Q`` (En SQL l'objet Q s'interprete comme tout ce qui suit From 601534d610f7cf870ae44ec7bde4bba5c25c4c28 Mon Sep 17 00:00:00 2001 From: ynerant Date: Fri, 12 Feb 2021 19:50:13 +0100 Subject: [PATCH 03/14] Add link to the documentatioh on the README Signed-off-by: ynerant --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 77cff049..26ced30c 100644 --- a/README.md +++ b/README.md @@ -279,7 +279,8 @@ Le cahier des charges initial est disponible [sur le Wiki Crans](https://wiki.cr La documentation des classes et fonctions est directement dans le code et est explorable à partir de la partie documentation de l'interface d'administration de Django. **Commentez votre code !** -La documentation plus haut niveau sur le développement est disponible sur [le Wiki associé au dépôt Git](https://gitlab.crans.org/bde/nk20/-/wikis/home). +La documentation plus haut niveau sur le développement et sur l'utilisation +est disponible sur et également dans le dossier `docs`. ## FAQ From 6cc1857eb647a3a94e301811e44a14cfda0a85bd Mon Sep 17 00:00:00 2001 From: ynerant Date: Sat, 13 Feb 2021 00:01:48 +0100 Subject: [PATCH 04/14] Add FAQ page Signed-off-by: ynerant --- docs/faq.rst | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 116 insertions(+) create mode 100644 docs/faq.rst diff --git a/docs/faq.rst b/docs/faq.rst new file mode 100644 index 00000000..3baf6616 --- /dev/null +++ b/docs/faq.rst @@ -0,0 +1,115 @@ +Foire aux questions +=================== + +Je suis trésorier d'un club, qu'ai-je le droit de faire ? +--------------------------------------------------------- + +.. note:: + Être trésorier d'un club donne la responsabilité de gérer la trésorerie du + club, et donc de gérer sa note. Vous obtenez donc le droit d'effectuer + n'importe quelle transaction via la note en provenance ou à destination de + la note de votre club. Vous pouvez également gérer les adhésions de votre club, + en permettant à n'importe quel adhérent BDE de rejoindre votre club, en prélevant + d'éventuels frais d'adhésion. Les paramètres du club peuvent être également modifiés. + +.. danger:: + Avoir des droits sur la Note Kfet ne signifie pas que vous devez les utiliser. + Chaque opération nécessitant des droits doit être fait pour une bonne raison, + et doit avoir un lien avec votre club. Vous n'avez par exemple pas le droit + d'aller récupérer des informations personnelles d'adhérents pour une raison + personnelle. En revanche, faire le lien entre nom/prénom et nom de note est + bien sûr permis pour faciliter des transferts. Tout abus de droits constaté + pourra mener à des sanctions prises par le bureau du BDE. + +.. warning:: + Une fonctionnalité pour permettre de gérer plus proprement les remboursements + entre amis est en cours de développement. Temporairement et pour des raisons + de confort, les trésoriers de clubs ont le droit de prélever n'importe quelle + adhérente vers n'importe quelle autre note adhérente, tant que la source ne + descend pas sous ``- 50 €``. Ces droits seront retirés d'ici quelques semaines. + + +Après passation, je suis trésorier d'un club. Comment récupérer mes droits note ? +--------------------------------------------------------------------------------- + +.. note:: + Tu dois pour cela contacter les trésoriers BDE (voir ci-dessous). Ils vous + expliqueront en détails vos droits et vos interdits et vous donneront les + droits requis. + + +Je souhaite contacter un trésorier +---------------------------------- + +.. note:: + Pour contacter un trésorier, il te suffit d'envoyer un mail à l'adresse + `tresorerie.bde@lists.crans.org `_. Pense bien + à donner ton nom de note, voire à envoyer un scan de ta carte d'identité si ta + demande concerne un virement entre le compte du BDE et ton propre compte. + + +J'ai trouvé un bug, comment le signaler ? +----------------------------------------- + +.. note:: + La Note Kfet est développée bénévolement par des membres du BDE. Malgré tous nos + efforts pour fournir une plateforme sans erreur et la plus ergonomique possible. + Toutefois, il n'est évidemment pas exclu que des bugs soient présents :) + + Pour nous soumettre un bug, tu peux envoyer un mail à + `notekfet2020@lists.crans.org `_ + + Tu peux sinon ouvrir une issue sur `Gitlab `_. + + N'hésite pas à venir en discuter avec nous à la Kfet, ou bien sur + `l'IRC du Crans `_ sur le canal ``#note`` ! + + Le même processus s'applique en cas de demande de fonctionnalités. + + +Je souhaite contribuer +---------------------- + +.. note:: + La Note Kfet est essentiellement développée par des responsables informatiques du + BDE de l'ENS Paris-Saclay. Toutefois, si vous souhaitez contribuer, vous pouvez + bien sûr le faire en accord avec la licence GPLv3 avec laquelle la Note Kfet est + distribuée. Pour cela, si vous êtes adhérent Crans, vous pouvez proposer une + demande de fusion de votre code. Si ce n'est pas le cas, vous pouvez envoyer un + mail à `notekfet2020@lists.crans.org `_. + Dans les deux cas, merci de rejoindre le canal ``#note`` sur IRC :) + + +Contributeurs +------------- + +.. note:: + La version 2020 de la Note Kfet a été développée sous le mandat de la + Saper[list]popette. Son développement a commencé à l'été 2019. Après un mois de beta + à l'été 2020, son déploiement en production s'est fait le samedi 5 septembre 2020. + + Elle succède à presque 6 années de la + `Note Kfet 2015 `_, alors en production + depuis le 6 octobre 2014. + + Liste des contributeurs majeurs, par ordre alphabétique : + + * Pierre-André « PAC » COMBY + * Yohann « ÿnérant » D'ANELLO + * Benjamin « esum » GRAILLOT + * Alexandre « erdnaxe » IOOSS + + +Hébergement +----------- + +.. note:: + En accord entre de l'ENS Paris-Saclay et le Crans, l'instance de production présente + sur ``_ est hébergée sur l'un des serveurs du Crans. + Les données sont hébergées à l'adresse : + + .. code:: + + Association Crans + 4 Avenue des Sciences + 91190 Gif-sur-Yvette diff --git a/docs/index.rst b/docs/index.rst index d80ad515..c43207ca 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,4 +13,5 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans apps/index documentation + faq external_services/index From 5a07c8a94f6e20044d34c63e92766a7106c8a433 Mon Sep 17 00:00:00 2001 From: ynerant Date: Sat, 13 Feb 2021 00:53:03 +0100 Subject: [PATCH 05/14] More FAQ Signed-off-by: ynerant --- docs/faq.rst | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/docs/faq.rst b/docs/faq.rst index 3baf6616..91d0ded3 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -1,6 +1,68 @@ Foire aux questions =================== +Des transactions anormales sont apparues sur mon compte. +-------------------------------------------------------- + +.. note:: + Tu dois immédiatement contacter les trésoriers du BDE (voir ci-dessous) pour + signaler l'incident. Précise bien ton nom de note, l'heure de la transaction + ainsi que l'alias utilisé pour faire la transaction (en plaçant ta souris sur + ton pseudo sur la ligne de transaction, l'alias utilisé apparaît). La raison + la plus courante est que tu as un alias qui est trop proche d'un autre d'une + autre personne. Même si la Note Kfet 2020 essaie d'éviter ça, tu es invité⋅e + à supprimer l'alias problématique, ou tout du moins t'assurer que la confusion + ne puisse plus arriver. + + +Je souhaite consommer mais le solde de ma note est insuffisant +-------------------------------------------------------------- + +.. note:: + Le BDE ne fait pas crédit à ses adhérents. Il est de ton devoir de t'assurer + d'avoir en permanence un solde positif sur ta note. Les permanenciers à la + Kfet ont la possibilité de refuser une consommation qui fait passer en négatif, + et ont obligation de refuser si la consommation est alcoolisée, en accord avec + la règlementation en vigueur. + + Les trésoriers connaissent la liste des personnes en situation irrégulière et + n'hésiteront pas à faire des rappels pour recharger la note. + + +Comment recharger ma note ? +--------------------------- + +.. note:: + Le solde de la note peut être rechargé soit par espèces, par chèque à l'ordre + de l'amicale des élèves de l'ENS Cachan, par carte bancaire via un terminal + de paiement électronique ou encore par virement bancaire, dont les coordonnées + sont à demander auprès des trésoriers BDE. + + Les trois premières options sont à faire directement dans la Kfet. + + +Je pars en stage / en vacances. Puis-je bloquer ma note ? +--------------------------------------------------------- + +.. note:: + Bien sûr : il te suffit de te rendre sur ton compte et de cliquer sur le bouton + dédié. Ta note ne sera plus affichée par les autres personnes et les transferts + seront impossibles, sauf pour les trésoriers BDE et respo info. + + Il est toutefois de ton devoir de rembourser tout ce que tu dois. + + +Quelle est la limite maximale au nombre d'alias d'une note ? +------------------------------------------------------------ + +.. note:: + Certains parlent d'une dizaine d'alias par note. + + Sois conscient⋅e qu'ajouter des alias ne peut qu'augmenter la probabilité de + collisions avec une autre note, et peut aussi retarder la livraison de ta + commande lors d'un perm bouffe. + + Je suis trésorier d'un club, qu'ai-je le droit de faire ? --------------------------------------------------------- @@ -29,6 +91,19 @@ Je suis trésorier d'un club, qu'ai-je le droit de faire ? descend pas sous ``- 50 €``. Ces droits seront retirés d'ici quelques semaines. +Je suis trésorier d'un club, je n'arrive pas à voir le solde du club / faire des transactions +--------------------------------------------------------------------------------------------------- + +.. note:: + As-tu bien vérifié que tu t'es connecté⋅e initialement avec tous tes droits ? + Sinon, si tes droits sont tout récents, tu dois te déconnecter et te reconnecter + pour que tes droits soient bien pris en compte. + + La Note permet de se connecter avec différents filtres de permission afin de + pouvoir prêter son ordinateur avec une session ouverte pour faire quelques + opérations en empêchant l'accès à des opérations trop sensibles. + + Après passation, je suis trésorier d'un club. Comment récupérer mes droits note ? --------------------------------------------------------------------------------- @@ -111,5 +186,6 @@ Hébergement .. code:: Association Crans + ENS Paris-Saclay 4 Avenue des Sciences 91190 Gif-sur-Yvette From 2b189af25b84d050bbcb6cbc1f3a023beca79f37 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Thu, 18 Feb 2021 17:26:13 +0100 Subject: [PATCH 06/14] [FAQ] How to create a button? Signed-off-by: Yohann D'ANELLO --- docs/faq.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/faq.rst b/docs/faq.rst index 91d0ded3..d7971971 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -104,6 +104,23 @@ Je suis trésorier d'un club, je n'arrive pas à voir le solde du club / faire d opérations en empêchant l'accès à des opérations trop sensibles. +Je suis trésorier d'un club. Puis-je créer un bouton ? +------------------------------------------------------ + +.. note:: + Oui bien sûr ! Tant qu'il redirige bien vers la note de ton club. + + Pour cela, rends-toi à la page ``_ pour afficher la liste des + boutons, puis tu auras accès à l'interface pour créer un bouton. Une fois le + bouton créé, il apparaîtra dans l'onglet ``Consommations``. + + Il faut noter que tant qu'il n'y a pas de boutons visibles pour ton club, tu + n'auras pas accès à l'interface de consommations, et tu devras nécessairement + cliquer sur le lien ci-dessus pour accéder à l'interface d'édition des boutons. + Une fois qu'un bouton pour ton club est visible, l'interface consommations + devient accessible. + + Après passation, je suis trésorier d'un club. Comment récupérer mes droits note ? --------------------------------------------------------------------------------- From 8d8c417c50f1fd140e28bde541ea38b6febcc1f0 Mon Sep 17 00:00:00 2001 From: Otthorn Date: Tue, 9 Mar 2021 16:07:03 +0000 Subject: [PATCH 07/14] Fix old markdown remaining in docs --- docs/apps/activity.rst | 2 +- docs/apps/logs.rst | 7 +++++++ docs/apps/member.rst | 25 +++++++++++++------------ docs/apps/note/consumptions.rst | 3 ++- docs/apps/note/index.rst | 3 ++- docs/apps/permission.rst | 2 +- docs/apps/treasury.rst | 5 +++-- docs/apps/wei.rst | 3 ++- 8 files changed, 31 insertions(+), 19 deletions(-) diff --git a/docs/apps/activity.rst b/docs/apps/activity.rst index 52f51cbb..f4df6062 100644 --- a/docs/apps/activity.rst +++ b/docs/apps/activity.rst @@ -74,7 +74,7 @@ ne dépende pas de cette application, on procède de cette manière. Graphe ~~~~~~ -.. image:: /_static/img/graphs/activity.svg +.. image:: ../_static/img/graphs/activity.svg :alt: Graphe de l'application activités UI diff --git a/docs/apps/logs.rst b/docs/apps/logs.rst index dc25423c..afb3cf70 100644 --- a/docs/apps/logs.rst +++ b/docs/apps/logs.rst @@ -48,3 +48,10 @@ Exemple de Changelog, pour la création d'une transaction de 42424242 centimes d S'il est préférable de passer en console Postgresql pour parcourir les logs, ils sont trouvables via l'API dans ``/api/logs``, sous réserve d'avoir les droits suffisants (ie. être respo info). + + +Graphe +~~~~~~ + +.. image:: ../_static/img/graphs/logs.svg + :alt: Logs graphe diff --git a/docs/apps/member.rst b/docs/apps/member.rst index e8e57bcd..7ec7cd8d 100644 --- a/docs/apps/member.rst +++ b/docs/apps/member.rst @@ -93,7 +93,7 @@ génère en effet automatiquement une transaction de l'utilisateur vers le club Graphe ------ -.. image:: /_static/img/graphs/member.svg +.. image:: ../_static/img/graphs/member.svg :alt: Graphe de l'application member Adhésions @@ -109,15 +109,15 @@ de fin d'adhésion. On peut ajouter une adhésion à un utilisateur dans un club à tout non adhérent de ce club. La personne en charge d'adhérer quelqu'un choisit l'utilisateur, les rôles au sein du club et la date de début d'adhésion. Cette date de -début d'adhésion doit se situer entre les champs ``club``.``membership_start`` et ``club``.``membership_end``, -si ces champs sont non nuls. Si ``club``.``parent_club`` n'est pas nul, l'utilisateur doit être membre de ce club. -Le montant de la cotisation est fixé en fonction du statut normalien de l'utilisateur (``club``.``membership_fee_paid`` -centimes pour les élèves et ``club``.``membership_fee_unpaid`` centimes pour les étudiants). La date de fin est calculée +début d'adhésion doit se situer entre les champs ``club.membership_start`` et ``club.membership_end``, +si ces champs sont non nuls. Si ``club.parent_club`` n'est pas nul, l'utilisateur doit être membre de ce club. +Le montant de la cotisation est fixé en fonction du statut normalien de l'utilisateur (``club.membership_fee_paid`` +centimes pour les élèves et ``club.membership_fee_unpaid`` centimes pour les étudiants). La date de fin est calculée comme ce qui suit : -* Si ``club``.``membership_duration`` est non nul, alors ``date_end`` = ``date_start`` + ``club.membership_duration`` +* Si ``club.membership_duration`` est non nul, alors ``date_end`` = ``date_start`` + ``club.membership_duration`` * Sinon ``club``, ``date_end`` = ``date_start`` + 424242 jours (suffisant pour tenir au moins une vie) -* Si ``club``.``membership_end`` est non nul, alors ``date_end`` = min(``date_end``, ``club``.``membership_end``) +* Si ``club.membership_end`` est non nul, alors ``date_end`` = min(``date_end``, ``club.membership_end``) Si l'utilisateur n'est pas membre du club ``Kfet``, l'adhésion n'est pas possible si le solde disponible sur sa note est insuffisant. Une fois toute ces contraintes vérifiées, l'adhésion est créée. Une transaction de type @@ -127,13 +127,14 @@ Réadhésions ~~~~~~~~~~~ Pour les clubs nécessitant des adhésions (de durée limitée), il est possible de réadhérer au bout d'un an. Dès lors -que le jour actuel est après ``club``.``membership_start`` + 1 an, ``club``.``membership_start`` et -``club``.membership_end`` sont incrémentés d'un an. +que le jour actuel est après ``club.membership_start`` + 1 an, ``club.membership_start`` et +``club.membership_end`` sont incrémentés d'un an. Il est possible de réadhérer si : -* ``membership``.``date_start`` <= ``today`` <= ``membership``.``date_end`` (l'adhésion en cours est valide) -* ``membership``.``date_start`` < ``club``.``membership_start`` (si la date de début d'adhésion du club est postérieure à la date de début d'adhésion, qui a donc été mise à jour, on a changé d'année) -* Il n'y a pas encore de réadhésion (pas d'adhésion au même club vérifiant ``new_membership``.``date_start`` >= ``club``.``membership_start``) + +* ``membership.date_start`` <= ``today`` <= ``membership.date_end`` (l'adhésion en cours est valide) +* ``membership.date_start`` < ``club.membership_start`` (si la date de début d'adhésion du club est postérieure à la date de début d'adhésion, qui a donc été mise à jour, on a changé d'année) +* Il n'y a pas encore de réadhésion (pas d'adhésion au même club vérifiant ``new_membership.date_start`` >= ``club.membership_start``) Un bouton ``Réadhérer`` apparaît dans la liste des adhésions si le droit est permis et si ces contraintes sont vérifiées. En réadhérant, une nouvelle adhésion est créée pour l'utilisateur avec les mêmes rôles, commençant le lendemain de la diff --git a/docs/apps/note/consumptions.rst b/docs/apps/note/consumptions.rst index 5b91934c..8b2209fe 100644 --- a/docs/apps/note/consumptions.rst +++ b/docs/apps/note/consumptions.rst @@ -9,7 +9,8 @@ Elle est disponible à l'adresse ``/note/consos/``, et l'onglet n'est visible qu moins un bouton. L'affichage, comme tout le reste de la page, est géré avec Boostrap 4. Les boutons que l'utilisateur a le droit de voir sont triés par catégorie. -## Sélection des consommations +Sélection des consommations +--------------------------- Lorsque l'utilisateur commence à taper un nom de note, un appel à l'API sur la page ``/api/note/alias`` est fait, récupérant les 20 premiers aliases en accord avec la requête. Quand l'utilisateur survole un alias, un appel à la page diff --git a/docs/apps/note/index.rst b/docs/apps/note/index.rst index 039efb3a..1291dad9 100644 --- a/docs/apps/note/index.rst +++ b/docs/apps/note/index.rst @@ -19,5 +19,6 @@ transferts/dons entre notes est détaillé sur la page `Transferts Date: Sun, 21 Mar 2021 12:18:45 +0100 Subject: [PATCH 08/14] How to NK20 Signed-off-by: Yohann D'ANELLO --- docs/_static/img/create_transaction.png | Bin 0 -> 146074 bytes docs/conf.py | 2 +- docs/getting_started.rst | 45 ++++++++++++++++++++++++ docs/index.rst | 6 ++-- 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 docs/_static/img/create_transaction.png create mode 100644 docs/getting_started.rst diff --git a/docs/_static/img/create_transaction.png b/docs/_static/img/create_transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..4805b1319fec15e888d388c0c87e12cf567ae2f8 GIT binary patch literal 146074 zcma&OXH-*N+bt|0(m{HWA|g_h4uX^fsVdT>DF^}Sp!8l6I?_c@lok-BYpBu*ML?0> zMIZ#Ex6l&^$=P_{&v~Es`~Dop9tk@mti9J-SDABO*Cx(DPn(XKi~7Qa3v~DIX*{}c z;iAih3nVj?q`)U6(BHWiE`(jUuW{Enz-qIF>K*I&dm^m*A(POL#P_$Dd-|?R5oF@h z-a{OI*u4)f+uqVLRK5F3)9;(0R>4(q%HGoY3YrMR+g)@lcUd%3c`n)&Jqbc>L)~{| z`$h36MaX*pTIsgVsG9ujS?)?`seaCW?(tdnXwmvau)c|9igP9u3BF9p5reK{W<3c3 ziRO!KjZADDj@-_BWNywiHWbx+AI{P@O(j@-SaQ+c#a^`NyKTm!pdiJk1+Tabd9CfJ zw}&oYn3<5kcK`=Oi3%z5_qV_2?BOV~n=_Z1tlm5vXAY3t%6;X&yezuSus1ega8~rk zEHqM@?(*~XgH?v?4;QV5xan+|KZl{sBEPqt5B9$g_AC^cK8V%WFh;iG=l1YB8t2KP z1xX~&pL}jM15&3;YB3e{m$j_n+U@HtId>V}Gu{3rGIRF{HX8DugO3x<4y|W{qLBf3 zUTbn=yBHUr&aw|GH54SYIFqR!zXpDm`uviiv(n%pn@|poV^YzBu_Wx)xGYvJ!k$Cc zgaJ)yIWF}W7!%HXiw0ayg~W8GVrY<<4UY0#_>MuUx6ynPQE;3JmaM1I-KnBFEWR#8 z)F4t!!MbNCoWYc`xJv@@KvbGb(5_Uv$Ty z#rX+vP?Tb5i0muJ?|S9U3rl=u^YVs@ww0m`Ywqjo$NC<`Ht`rxl|z+E)nP+Y4jo@0 zzO+jf&r3mVd2a0nWnSfBp6%il|FZzVO7Lk#p@4OTN#RsxI7+Qp(KZ>sWo~YMkSeKl zolFkiHZi<9M*C)-Dkqk)Ms0=8SDxQvnA&3O1OHCPjZLz+CLw$=EA%-qWH<#R=6ve^ z9z^n`<2;r13SA>K7j5O8DN?$Jl5fqrJe-o59%D-Wm~1$eU&!)^`U+ybRb@|0@%)2m zUW8h@H*YJcXsZVA(b@lJvw>6gSXAc$ZTmPhI=R^_`e|SMz}3O`vcXdH7bVF-L#M`1 zDY<0t@{d__50$5g$qs)jvqF%BP7Kpg1NQ``KA-gYME^MuBhd@Tz;>96MDj{ER{I=g znLf|a-EgT$U>c<-j2K_1P+)l$=A%1jZ~sLtH|GPxYK)hg;J>7AX_b|^!zM|8`>4UoZlbt(Feq$drDC~LQTuSQE`Sb!EgI2Gk{hG&At{nJ<$&Km~SJeVQa?k{oG#}giG08%EVgGgQ+dHvH$J}_|=es zzbO9s17Opa4A`JGOQjS2JK?PJUc3)66!b0b!m(z>YfB!lzPRZ}(I5BL@D#90Ura4@ zlht6Jk08+tyjmXzY4DJQMBo>DQcx|y{w5~lB}PRqE-up2(nH@MU|1|YPX`*q`9?2S z`HoFTl*6Cc(Lz4ri{D>uE=tSDoaqiAorbRkfT8$+MQlGCh){TLEoFcHF>T=0e>WH( zKZ0ls7kgNJ+sQg-7Q^=9Zc2EVxoXR`$l%<5V6XlNz?f<^x-nzSj5xIG@Yz>DBSfmRm!jyR8oyNU- zAXvj|=jPCS^IxOr+i3>{OV`pHtdD%65f?<>Gq3mHFUM^e43@p!A{8xFKUR$y*toFD z`?^Fi%ruDAwGr0PE>2zxqnOOx!({-r$Qw0uq z^r({aXvvQS;5NTSi(rAcQrRgUV#7Wm+t{Slem?7CC4smk2Oe1HVF|EuA^W<(%H3bt87*QU>hlHuVf?zhOu?|H zJDB3tav47rEwR~Q?!C*vA!*$nLGJVMW64f{IX9Sny|`oN|L(5)7M{1WkU~*8RWo3H zra=ZGeOr+qdaqjG&cRU8GY~D^F*T>hM)?fIkQ&|D{eA|T8XDbR>(yTZnUa^D?z?4D zs~ZMb;aw-n@1k5?Tu4PfE$XmWo7Uc_sbE2uww`Klm1{uB*CNu z_{MOl9(3+S{^DR0`y2Q(AzFu?WFCuaFdaS^I#yS*tsIjDn8DE(OeX@PZiMB*^VX0= zLC7tf+>48o{eq7+f3*Z3^Qr_H6q+Hd((^5Qhqhzru3#g)hVt&#&3Ms_KQi%uBdjl2 zHy7kuq?a>P7xp0WCvPCPZZ!D?BsHCGlUey7b@7A#!P`&T4T!9(*1~6^?~jNAd2AHJ z-&_#~ITFOTViuCO0s{l-(0s}P7(8wt9+`b>K_B7q7 zapOyqft3)r7jSKPI^q}0Cdqd`P^UP2vD#-~Du~yZ0@L#h_p1=o8E|v)*h7SiLo`vx zsBW}P{OXW8i}Y@(Nf|bx%C;x@;g7-#MMi2Qijq#k&y3sIFB?WLH$D-rNRa4AQGULD zgj7Jdv5oE%^TrRC*)KYv_0`6m0U_`tbGS=kBXt^_~I@FO^b_e3bJ#Trs2dD*JshS8hM2 zj8+>TAGd=mHu>+&HF&Qat&JA7?oPt*pYFqn52=0bB3;HyM@B{l!Ng|Z-c$%NK}zIZ zmwO#n5(O+8Fe1Mm+n#_WS6ADzv?UR zek;_?dR93V$1Ef&D(dC!%`Rpx8-THP+RHiyg1j#j53zpFWEs)ar0(rCQ}0P~>Y-+F zKu`8;f){p-ABOOt=Y`mdJDOCiNj`_T5QY+S?cU$QTr`E$hLIsv{R8 zmvH+lX#=&BR;MQ$h}ce>W?j3sFcNw~u1at#kmh6uoe%EC5*FdmleJ>Qf+>ZDn06}W z8o~CA);xL!$Nq zztRC;K5XI7kF+&PuS9Ue{Bm-X8BgX)Cb(~h7v?k(NU(uEzU`UA9W5Y+<*k)UZVwNIGDHCp>3`*+ zbwSzv#-Wwh`XJo53X1PVRvWF)e@R=m=d3EGJc|L$M2%0;N8}-1Ks#C4>(9Nd2}fpf z_hS?c+_*enw3-ZS|2m)%@H0cA2-{P}#F_u9t>mL%eTR=Mffv<&)SGRk#N>XuE%1QCgIZLyJ4C>-yf{1=0E>|e>VSSFz*W^9?2O2 z4m7bg62buI#t%EOm^dH#^R5a^aVgj~P~i*9*pUX8DS6^Ei{s%mYU`5-_<+8xUgi5Q zZO*^HzVNy3w>g!n)1AyymV(S@;^YKi!JU;k-$~0AUf6^3qwfMKm%+MJC#bX9%D2L| zzCGaChs%VJT7~Y%vT`r(`0^kx`0aZ$hvM^7mfuk+Pv4`1gWH&)>i>XyLG+3kOB5f} zLKYcI^{&sj+@RwN$_nD`v|gs4qv)%aKS;m!aEVGVUHE~GedA1u#kaYAHn|olHAAW${t>e1~0*#Ttjpkh@cX5kQcsS zzRpg!JYDPR{OXWqm03vdRY_R3kSAi5-L;p z&#nT_B|`2XOJ%rSiv;D1A>Q#D=0$VrL>8uSq>iR`Tsm9-Nt+2CBNsLp+8Z;{uLL~; ztOlK$4i8-BY>8hW0(d9QKi5mv>A?M2G^2pl>h`PUft;Vzj$@wRy!DGdQR#;_+T!EF zSA@D8@X3VCOs+@jErjX2L}=pJ@5r}MK)m;M{>oaa)Y>J)8cV?m_mMb52`}{ zg~QnjUk*h6BRU(avq`>raS}-)=d! z%7LF0gUz%;eNw=Xj)6?M1jTzzJ|v0`eebmSLVfVqU1h?bWR58o%jQRt%O;g_CpyGV?ySWz!u#03ELK_>^!@fpH@TqnQqq|tIpYcSXYNsF3YnV>OH%cJNs)B`pk;z_{L zC)f>qMM~7J|9(>s$`c<{i%Yp-U<-BP^6lqC$A5nGow%cL&ny{a3# zYT5FL$K+(4*)qKoo-ZDq&(O0vIO~twH%@;rb?PP-y}G5ZUw+ag>lK{Z)$aTgrD@B+!5uPs4`YIg)1#V>*vN!~o%nrpeD z_`A-15=T}GpYz;jmV~ME#c90!)}FFUoR4J4Q_mmHyBo=k4-j2WG-tUMO~D%whCAFX znx}S22e!W*k0*Yj_ScT_U`L#Pq|fEZxlYvgplTR^WOFz!l!NlJiYi=lm1xG0PCmPn{G02rj}J3> zhu{WX-B{u4_8x@YrX)ZApbtnmZGU|=8eaDgLkC0#tjhOFUwHhHbw?4YLb^J|s4fP@s zu!p-zAJ`kSHN{>-Kk4WJz>OM`XwC;t%*&Qu>`t;(0%Eou$8!7j-qOz}Nm?l@3|~VA zR|sdPzR(`55tc-5eIQAG&Z%)(pBmb;1CjzKddJ{?*Sc!o<#N~rfV(wnC6fpwl;~eF zF5S;O-a#OJV<>q_?ZSRO+DrLq_pakb8*n0}c1Dh4i}w|QY4i1~-0oOpxE{LQ0s!Gn zQpJ;*0@$Zue7k-stIyH)>;}g<#{+VmB6x2bN4A)4!?CJ_on2&*TUF(Y<{&EKQfVi5 zX&{Nc-O+qa|Lo2^K7R<;sT1~~Snokul&;;C^( zd#{f!0|cshNqfdZ+|j>~htvxVC*mEy-gX%iraB4h-@f<= zuC3UGgr}Oy!WZ*P)I4Bk_-y&wt{Rzjw0xg4VKPrlWTWyXIg?~E?<|mrpC0~6(_hCY z?;;N;ES{t_+WuYeGk>@b)a~a!MZe(y5b-wl;m@9H1#MRL7%up}D~TWEZv(;0E#B@w%v!n!HN^My1{h z|743l#84rmlvnWRuSr*66c-N80G~*=&FF!+4;XLn0#x~&;QtjUeIudhy0l-faf31X z(C7`LAI7_I6#XITx+YY3MOkq^;D}1=eOwb=dee4e!W*;l$0SA8-Y zpJBIJ!>x$3?}~DRdfNw6c!zy?yJ`=2H&CO;YooC^C7;!{b}CH;vP-mWP8=?G1|1pP zsG*^UKic&

*@7JIEcKJA@N+67m2=AREP~@xN;7fgs1}>K+u%r}QiiT^9`nrV|&z zmI&s~x1omCUyuPm*J_vP=9^1(gg#n6J(dj06VyG^(rEUnY~3vq^Irkj6B)m9ZW;s` zsK3(lYJI;*4;qTEBqzS8o9)KDtCXaNs>~Nj#@QU;h(qcOl>_yji|dO;eSqh7WU>%t z!1f0X8JWaij&OSc*}y!iln|fIsY9L^D=z`#|%Tbe~mH?BUd zYvzA>9nBogU9oB=KW}sOA?x_LAi6mdxRO(@?7jT3ThlC@963c=3B*@`4xXn*OT|%N zeD)o0tDrT(>DK)LrRPas)_CwCQe3o`j4=Ay3aLp4CSadV{Li;yi=}`Q16kIs@0}DN zxO{B&Kt953pqaaeYKS+-1imW!Z_kV^A`p=(*!jrw4RD*Tp%V9js_v1J`jSM6U;{}m z*5PdM{nPS0biB&%n%2yWWaN+_7*;#YZ)YxPm!X)-r8IRIhhvj#4j|j_DLWhB@a^f} zc?SmaP^@$#nMAX0J3yL?_6sJ)mi2S+K*l;ZbxB+2FC)kRKp9GJw~&8z8MKDy#+aFz zMP9c~0Vf(cOxHL+4^J*U!HOVI()#TILqHGU;6m>{{Eo7jU8{28-Qu4c%Ldw(~(K5=)YU#7*tyID+ z5yx>GtSwQ0N@L;%RS8)~@WLFSTz7lQiU*4+mVV4{Adn!RRRfMYIy(z1UoTkejtrZj z2W}3_)eQ`0RIseIHwEKyAMnkOt}}(V%hvjpAV9ub)8hurECum4&*$-IGx9GGBrl!R zGtj9H>GBF+j2gzd6sJy1)$)(s1>^#GIWPib7*@L9w30Fa>!g!6P#tOG)FD3T!LLvm z85@5iBh{;ysqqiUHoR$^=es}ZhsB`FbnUFxg?jTbD-L z^?#p0^KSc=78kcka=BFQeaf&}5T$04Od4Wuft0Ka0<^A23v{w7pq>OSm4x_0trR-e znYmMIyM1F}pEb&eHdA)ioHlU2TDH&Z|cH9JV(R!xxoo+Vx&l00$C(H>0{)}J5q#g_KXcY z)?Z-s)vo-;dt!F@-Ogq0d=SBRud{v;tFi(R`LBJPXh%JCZ05O0)k$t`Ac#*SSy z(iTnzNI@J1`9e%@D(JR{?Z@se z`a&UFWj4)0S#+->2-M*Q!ZpBG6B83dzkG}4^b1;u6Y_x`Q-@{226I)0@;5AJ^KxxY zg+Brul|GU6#sq}0$9~BT)vEF|k6LA+GGaqiIzKo9Gp#UQpc?)83>RQ-3 z`w}G)Y{O+70N?k*+CZnD(*PSYC=+@&f)kM*D+ukIx*K_kU(_1fGa8hPL+EoD5*UdQwDZ8V1D1Ah8=Iw=Gb337_!%N9iUT9DvKCb zw4;9q!@b*-rGh@$`w-XK3%g0fU;=UgVCY|&R$v|RF0p=v}8;P z=sZG<7U{b{r;m0}u$@vD zQ<@2E?NwQ@{pJ24fc`&I6Sm&qg<)*pV#gD>4~Ue})EqFU4=>1YyH}p3PkgqBWm4}t z@%X&IuYa9Ct@HgYe|=6zbp|=RjNi)ZxOKE{#)B!fxR8Gd z1c=p#m~$jp7@;n9Q^2r+u>KO=8CxKk$D~M>02c&s~xF};ntGh@diWe%-r~Mom}Y?&4N}60QqoRu+NdO zu6Wj=JHG4bC54n@){t4$s3->NJ-;ce$mxaDnhZKOC<8>P)*R5DTata271d|kOTHSd|DN1s%jF7 z*D6>}(R=yzZ_%0^`WpzXVCjmO<&KnTwr@Lk8T&{yCspr+aFoid9nlEmr|W(?Zn9@| zGQTz>Pp;5kOM&49ZZ0mX7||K1YQjBqyPvE8lw5AyLox+4q^YS{9(Vk14IgyyIs&!3 zY2*S`|9sF+-+TDG5|CmpT{7xwPsaRcA9R0J1~?~g4w8Qnfl~csw1z*Ck*s#;_reqy zk-WguWx-jSYdeLWu2nG(-F^ijN_`NwY^+Fjdo`WRqx5#%V?%&RWR+2&YfxBO2)vKM z7A;SnM|F z95BzcWnQgLDZ=6Im1+DW#DWxBf7>PH+y2MRmxS7f7+n!CXU=+8Vg?c$F^Yi*?;hx?xO2iKEPv_z91T#Ozw zK&BVzC>n*UjT);j8gV2Ly?F9Kez(Zr6LV+~CB41b4nXt>B;f>*!Ne@SCSJ2pc8~F@J{onJwDjjO&ySD& z1cHVVRtr=@Pkaz3pfHE(d>$&}dhZoI(?v7w3V{}-Z$I$LFi8z#&Dkf7J|e!c@9xqp zdGBqY(*{!XIH&O>NRaL9qPr*os6DGu#5t5d3C06lao*Eg?;{M0u_?B9bj&)$=x55V zA#%qaAO;YFDjgmvVA>J!Gvrry6v%tIZ>}Y{TEJ=Dn}LpJk-;Ajf3h?YhmLT!=G|^U zL1f|jvWrOJ6BPErL>lk`40t#jxb|yBpk^G+w>^}dcD^&fQO5;kkhSJY%J1!;k}n7t*G7d=!saDiBzORUi<^y9REn%*SIo-Z-oE}ZLvid6Nw$x-pHE3P2K^iybaVx7 z#S^2H8(NwIK@M#qte(;n78ahdY){uFjMY;S)AAYs#jbdmTox9&Z5B6~;UV#MfMF6J zz(DTo6KKAIJ>L4A;a>Y8-w&f?^>hHxD8RPew8e(z%>k7Ih!imKAqJ=eISV%*&3-U0 z1D|RbnyP*d|DY{tfBQLMCS<=KKdK+65#h)A+Cul8WO!(fA(~lo$X>eG-|@$5!9E5+ zWy6>Ct|r^!jrN=1p%J84Ib*aKOimJ8011eDQU63ehSqcN@nZliNW58F-pT3^RySuE*xgY`u^MlAsbRW!%hXL70`}5*2AqUA#fFC3D zM!$#gi5EX0f*0!E1>*A^8kZSLXBHts$Wwg5zIye*Ico4u0&|@_8sIyx-^u^OlP%F*OcyaKEiKLSI9MG9 zg`Oy24>3O=r&M>;ufTdSO>_grI%unwpu5brUO>eF;B|4VbD_tU3To0WV2AEOP(EAD zYAuLhtvWZ<4M&}+#(kjAWGYu39s>%)YmIR6ejND{V6wEC)4{lb;_ZXYUq(qSZ|5_Mw`A!X#hY;R)BaAmT>RjL}SAiKE?){XgR?4IbXu34!*0^>fvvN#CT9bt8j4xj+ z?LnRMnAI1bMC1U1Pa~Fruh6+*-{@o1@1r^B=?l|NppFhM@f3@G1OS7sl5b@W(ZSop zQFk55j(|}1l>XlJSCUBRey%NE+jY?M^V0^Vr5eE<)o3MQB`lB0)Py{-e|nz+KV+A6 zyETo^#A#vvJkiHnQX={B|1uU-DNZF!(j+A2VJ6R)cKf#EqcHl7`U(H$`fT0yI*1sY z-*y7(d570g`+<>vdia~KECO$U`hbJI{gNX*^sC#fVmt{}T!cFKyEL(0^b;PBA1^Zl zAC4JezCaQS=O;U_&oom&OUDJ`W!4|PxmF1jScl()3bQP<#Q{7oUkA1g^& z2eEd-TPP%)^mMD zye>qx+H#0kdHKh7C(ZL9`!xk0)0cYVHx_|(Ft*Q^^XaiUyb>rCU99%oG7s$@d06oE zBs7kkoE&I>cn_#v%Rmt1S=^b25zmf)ednxAt}_uN%+4KdOl}|!VL$rMfz!d z-K9_EgI8Y*fZUY2QRQdLDm}Xi=xBknuBGJNor%v`tr}W)xp=hg-WCPr>;pKg=U2ZO z5%0gh{{`g>uuNYXdIHP7HW2tO`O*Lz)^_YV+Di&z9tOujU4Cqq8QsO9~5@0ZDZfD{j^N7}-%KW0tA-RJ$lXgZ%<0HJ#iK07%ag?z{> z0+2ouC>ww5Oc3&sV}NeUNz2drjNWOge*UYS#H@=ew0p2bX2Mox~UrKN602cX1ra&iLsCI2d2xPYuk`iGmFfb?v=<^TvZm?fZ( z13;iZX;-V}`cY+Oh+ox??!T&{#RXHi@9Y898a^ezL~%u+ns~Neh8WRw3B_**R}MWv z1RYZBkBVC^fX@y_fszbewAvWW`Yqo(U@&Z{_f5e#I}uPAGb%jL%ac9u5ugrze+p=I z$P*vROO3XZ1{xCvfTF&UzAsc=(C%Qo2tZL2?F^ImHfeIYCi?ZQ0sXy@|JqK}-EeI; zH*xYZKv%y=oN4ezi}R*z;AeOOkc-JmY~oK>R|kN;m*xH}?O7Yb*y7Hze>tcDM;A=E z%4Yy^2a4Cxj<@=mGb;gkUx+FGz=r@Rh$B+AQm_N6#dAp;ATtkSq6(J)ulT{Go67*g z&TlvE#7LYKy$6c3gcB^Fk)<@S(_T7k(6$)_x(l2f_QGVqez@*o`MCfxJO@Rh=>A_2 ze2g{v5Ls4Vj|I91SnRZ}r6ygGr{|KT^lO{J?Dilf4)H6N%LgUKd|+wcWU%Z;Hu(SQ zG##i$oJyn4bMzbW-1#f%^Xf8)uhY?lPI+pR9yU*mO7?c7M0C z>dO-$a3&;Tk>Mv$xh;5#^%XsDu@L;i1VzW%Pq9Gt%AIRup$wE9$(66PgVWonS%yG) zbKmLJ8*ea6(sfpP){NtZE*@1z3z$ZVSTYwz!9U+M!d6BXOngHSqjmu*WYgOYcAHU{ z;14ZqWWnD3o+&vV(amREPG!_FIFToUpXx}(6leg!?!P}8{?xZalHGZ;CRDUtd`6XI zm-{NIXuC=xhhH1TH`&_duBL1QN)S(25@rHuUHntaKK+Wewy;nhSgx!NK*?0{T{pJ0 zOd49<9|Xgd{M`WD(SQTg8F28?bEriSP-X;jxrxX z83>ZXq9bEELLq)NMe-N2OM;S_SV-9ejoLl=9@A-s_^G}xw1P1j*kqS*9+V|}%Bx1` zJ!5HJFVvz41Bh2y?K1+9t8zi1nUfiM*$Rfn#x;Oyot@1M<>&2Ox( z;bJtf-+zu($+m{+t|LwYEz`4lIj`njDwxu2FzbqrS(ov#e&YV!1=@wKV?1+tDkChjesw?mY4;@=yo?@V{jhUMv(3nCb9SESfyK!yRZ2 zE4z-bm;oGNCYM>1R8%4Ij-55V#gr!NJs3A0!UPAG%lLsod8$$WITszwCWY98n2!h12(NQQ5zKp(Mu6o@$2ai@^;B2$Z{hF#>%=Ku!dL&(RP1yO&mM(}T$erct+jeFZ3D?{xfTQB5Y1JW z-jb8METfV_Y4GrKT8w!p(2FPeEUZE^CQiz(BGPksHh-o}P4(Qv{?|b$L?7o#ZC;CX z%gda;s$ok}Y=6~gc*E94-Q2`uP~bxfi-I+0x75Yw%v4PVs_JlR!Qt$mXhu%7HtA~& zSxjmas{5bu>X_1_QJ0}gB=@l-o%cH27inN^k&mX-t{|v8LPU?Gjmx_&ggq#%$?4nJ z4N|W?tTx;1Aoshg%Cir&iwb9zu1sl0c#7NDZ^xbczf3OB(D!%JqEuk_{Hx~yql2i4 zRe>Jj-|CaQY;yFsQIO{_ta@B%!hF7Ybx_68;Hui)!J-mPSwstOMxkksFyph#2a+AS z*1rr?7@-Q|tgnC@jg251{LfncGk(&-v2{-oskD)&E&B`7^&es^Rd0N1xi8uKyi;N` zI40*RH6vj~htpnGRAK7wG6>ZY%e)XKb|HtA)GzUS4$z?WU(3nC2nC`hQFHOQLZ&8` zU)Djo#%6T0t?Yx;5go<%JgUuMk$Z{x+bDc~ zPYgdh22FrpfSz|WJAvl=j*awYwHd;kG4d-!>_fh2-evS}1kK){?8$|G;Yuz>wtPRDNC;f(Q)W`>oo>T15sc=_Q@ARw;UL*x~g(g4O%Awcten~yu zmW@tqSZn^o*O9Ro(dhy2UOE2EMh~=cQMYdyrSeHj{^WRWfF%()hwTQ;|1RzyK%cF& zAD{$#Q-jC226jkQ+i!)PrH>zPb1dH$1HL{Y%ap94siC34CFaG&$jIni|GdAi!C^s1UYU@t zKReK~Vf-?uLMM>nnkb@C=@olJp2q!&9N_zzhBHOCfj>x%Nyyd$&IfdaBTkAuWjvI4 z+0qnlsnu%?r^oJ$E|QDPe2+~$bvgge#~6);pC#3%+@FV-aUf+fN{#E7_9b- zI1y-qxqxJsNn~O~yIV05Zm=o3TfYDn4Ec*8;o-y{(>1}1Ch7cin-8$pfyLTf0F_ww zjx2!qx&ICUllq7*O4Uh2qW>My%LcdB+^+M$+1dGV*g|YxIhL}L1x$!iI(~RaW|Hpz zU$=6;S9I)ml7JazBZdMy%b)@A?o*3JxdY-7Xa-Ut6~Bm>|5>(2|7+R03f$&8>4KWK z|J1?56i?SF;b)>$_)>AOfW1l67YATzH8LM^JJ!%NDWVSkGud1C?a_M$pPpbP@_-eL z2Np7$9of?w$WX~V@wQ^a%w6Vqo)>h{a=hL^j8L0i$j7PBVT%@SeIiD|L)28WSsA<*NM;uaPx@+BpVOz_b8 zN$2E`Fx zr^X?gLkF*j44}Hp+HvbisEd*G`l2rG6Dy?DG61)_lANpj>ulT~0X_Nz%aR_PE&cH) z^T+;|tm-LC@sUR0PMMv%sxYHDMEOP5_?O~W?kr_6L%7Zenbrymrjabs9Ut+%%RJkn zl(G7Jn{!A3r4(sb8EFWrarCpuNW7+=z>5daqcI5P*Y3Es&@gA-&zU;VT<}o7_sWN3 zzJL{hxz7?0d%xd&{54c!j~Vn7a+$WlSHrw4VAByEKtf%&#&7T;5#Vh+8P^sw%(QC+ zal>iV`k_!oOosenM^gqgyBM@r%a}HM;^XGUZlxUf?C|aV4X}4cLXDdzd@R#)0QY%Z zP(0%n(dedph&}dW6I%;$?n|OcFvEzr<>-tw@kOk;WXSEbCkD;Cs&9YO)5PlEI&L}R z|K;y``_t2^MU<+uCq8-fUc#dPOH2_PHGCVghdwHQs(9xX-pBD2*?gZ}Qeu+udMR@D z^l-FVXKjq;UfzH7ror5od1CQs~KUFj}=tZtG}w?!EL*f92|NWTR$ zwKx9wqbP06De~*)-tgd=$4s9i$b1kziY&=Gj%lra-67LRdos*iJ#!(WO12#fF?P0s zf`AB=nL$j@$yzAFtnD6~ZU~05i=VYmaRzpoVyeYtVAqDZT;g+C_sv96JW2(7tGj2F*Vhcf zYHrjyt#|W`VJH@J5sH5JiAj{end^*XESsb9I}9^cM+Jh4?bAavY%NYYy= zdbrEG;c8zFimPF)1bJ>+>|fTfIs6e+b6=35v~o3Sh&sWL<@u8Yqc1?fGrh&~L!-3R z9TqI;$H>J$2sEb1liRZj<3|LT8Ti2Hx}D?GUd;V*7k0E!4^GFRwN_zoW;y4((aXcR z_NTqdfT=brZ(OneF2GmbBmQgf<&B2s`sUIV*Pkj(pjs2awKdE?DPsn-eP$QMWB;&P z2z>x-p?ll*rx}sZkkR1xZBM`AG?o)FQ$5wV&HoE-rYa;%1=si^J5u*4z1vNkWld zqY64jWth%uY(v+JV9T2^lezZU;zs$e#sKg2|OO4FnCUl`2@ z)yCWtVB5Gd{Ac05fHl`YZ@kdsML6g%qKP{K6UVo>-Q-bXn>!CxuELD<(#@;`?j|Q5 z;&Krtkoi>E`QpQW-{Nm1o%`3LwlSe3C$HU)jFP}x>Njfm96}%@^W;b2$|Q81@G`$R zuHz#jCpjy^5fhJX>ucjs@U94Y3Z3nqf}*_XM8Cl>1<^|6qc zg?lv9+a)(f8kb5Pt&~Hj8*LDac)=yP9`P&AvwIsQJfIf$Sb3rXA&@%Q!#hWu5?-I( zQH19EqMh4W^vmMNK;w_oYRLdmUgssz2);I*Q!!sbnwFR>4TI-2PV5v^r+?%(qQE2A}s&o zFPzGH*HYnGLVeBBxX=RtyBrxtkr$gEA2k4oz`VsEK*nKwdD5RRyE2fSeS#B|YRscF zaMSoYIB+`1(Mi3d$YuxeY3SvZN7uDJ&m0McxGVx_C$8o}e%qS6ww~{|+k87J*cK_7 zuZ~NK9Yuyap9w#rewBX}s=F{4O`IIV0m1)Ec1X%hv(N~4nf|qY;cZMw&rcnwvW=fG z_nF5aG?VtXjJIK~5z9=5*=18S^P3%GnC0!FC;z@n)R{o@;sh#I$M?A~b-@(iS2*ua#D1 z7NDRZ=D=k55`$Y$uvDT#_SB6)E-_yE3Iy{j!SrH3z7t}lWVn$J1^)sC?|Y*mjJ~@X z*e8Y1sHm09JZso@_FEv+(4(fWd!)(8e2_A(aS=eXu1}?->$FH)Wa~dSe|Jro~`)+8E@QSv6 z-v@7+UPcfQB;)q=O>Jg(zB<>`<1F6RJcFhL9mVYobjCAFs66?p^Eg|2ECE-+q{+Ir zwno|T*VV0BZ$I;@YFw_)lM8+ftQ>%de2?C$2x_||XDjSF+hFTtAcwNg596+%b!oE5 z@hAmSO9=Nc+#hEL`Mx{$>l(KG_+%x;Ag;!ASl>frz$YVJK_ME6u5#KC-^ZDWxP17& z0=_Yr)9fP9%Y$Z?1wKf~}X91mq@IcR#b$zNU zXl8q>U(Jhvc^BNs*pslny@-WeZU9<+xt!~ty5LuCzQ~5dZfE>yvd!H%82Ml_J-F<4 zCq0rqV>B?YGr@iPN3AK`YNlcf4$qcz9@hd&83X*dt_fUtXOXqSv%ZkSs#GIhi|vro zUNOikFViz#XivCySpzq2`zRzBe&|3oIi3gr@_T7hJ}H)wb6q~|Q@=^t6(+^coLP(oaOEcg(6 zc)9t4eYF1LG__5;X?I!e9DesXfJHc)0v8r9uleTQ<@1+1xm!6?!kDwQxWwqt$aKx~ z>k=2@v|9pGCevQYZyxVFVUT~np2T>Mvh?90luEb(@h`yuqJ3ei4z6bI^1tH@7g0>-e#3{41Y?-{g9nx z8{W9QbFy@QW~DZPpAKARmH97SdYy^9)SbP4h}e`*bNqt&N#QQzi8oceVQ zgP5SIAB{>3yRRoVx?BYVNP3H)CK-DycSG0s{|srgW=!gzWlNRltxg>gVmigVp~kWxs*p{#CcwBT!@}o1Juh zcNq>0=5IfY6vZwM6qU@UFs6pzmGq<_6~!4_$I@oXTuQX9c*i`eY9+xAHKqdFw$)?Q zNfd|vJ{|ZUQ9c@Ji07TVD|b3{WtGZgleU%Q8;>_Y`K!ASpsFRb|NmO6T%FQA-WRH=b7-j7Yaph$Zsx_GCYqc6(^K{QF1C{V&3Wle zK*Qp1Uj_~Gg)X4sb3Ru0Mr(h@$nZ~}L?d~j4Dr_V!i|@D(VYf4_s#U(JjJ+WsFnEv z>6h}fkSjr!^=j1(;2uw+T-ALQ`mGFP#y#HMP5})`lA0S~Uqt@>X9a*&|8xBQ0hl3j z2+wOA;7akLg2oiG^^VrmS|!gakKTJ;%iV@VP&f)aAv-3y+xFh&dx%TeJSosR!kj)# zE%^NJ^V$Du(Erm=LL@&|+zW>}N@o&73#gOO93~afrmI&j8S=6XV-0u26y*BaQBel?iSqL zJ-B<&#$AHDLvRT$!5VjWcX#R2dH4R_v+uoCw@%fmdWwJD^t0BqHOCxd#s8g)|Mvk) zkNC$w{(sT=BkM6FU=6CmcZhF?^#(9*hfohhZGQdHPMREZaXo*?wM|m@$0kCL}I0 z4ysc&P74|E?@uD3vSj}I`F|dbaOq%hPkU=Ync|VZRMhyyGN>wVTcism;9I)aG}6-# z#EZ#HUaNBam=~;?#C86~hq4bCZY@N5;;;jGr)t&XLdjNW0nz`@hV$Rw>W}eXpj;z( zOyCkl<}xo$117{F{Qne|1H&yV|F)eiI398QPW5U1(DsI~zAi#ws)6pCyWZX|{6PT0 z*Dd$1mrr|iqHRefXZC9OqoDT-Q2y)Rzi~!mf~B{-$)&i!B+Jx_MHtR4?VrybG7Tdr z5Z$!tf`!rY z2(9ICemMqPEXNbDt_Psk7T!DHHdbo++Dewq(GV5GHx?U#hqB~SGldRg)3 zZ@;?+Iiq(X{NG-)J$@G)H1eS4PyxS;Aq=7=iK4wJfJ`qD;b-X9BG>YGVlPHT zPtvddUu5n71-31@flbZXBcw@zYB7Y6mNXkmOo*xlfYFEg_~U2se7i>~7Gh5cR1L=Z zvl?ey`*D+aLr5LiA5ps{JWl?z=uCNve+}6614r-QXyDKPO8jc1s9IQ-D*t$DsbK$s zOXZG;iWZvrx;Su0pyp%L(erDeX4&G(4)1Df$g1dD z4lt%95s7M$ckm&b!h`i_bMq8J5-i8}F2kb0lVtxQSpURf9R%QC3^D5m8ZbrzINk*G>N`x>El@R(aGOY_QW(Wc3~pPHZKSy|o@ycpNpf?}r{q0c zsWog5V93|tkwD?`zrmE`;GAYfaB#6;-vW`p5_fs|jg&yLyG5CA1_h48xp4i^dz{CK zJIMY*i=LNzFf&V@zMvl~t5RW-1pir%3V(~b=6h*2ykO=rBAC>2DcTco@SnB(XGPy7 zzydBiDiCR9Ewzyx5O=${h)Xi9+NeQnJfokGN?*VPq>3LAmqM`cS;PoC#-#!UxN;x5 zaes^>LhwrLj)Otd|Gk!iQUBNwDF4cPkzlzG{o@yccfmry9vNociITg_0I zaYAd$+x?_zwd=CrrlIb}vhCR)AH_WW#mE3=TL*su)!D!0)ZawJN^rkap-~kkyi$!j zrHG>#c6p`|?)wFO*;v=-zV72oC`J>qyCo`8%_!fh^#1K~-zPIjAgy`_V)PTbh)I#MxEqD-+YK`j@ zN$|9ry@DG!CL6l}g}RuJ9)07*eeu zzHA7M;HMcf2kq;Rf7Sx5?DXF*-#c->$Yv3o!yQ6mjdJkt0sCwU)(y&9FN$rg)m7*I zyba8`9tMtMSW$?8&do+rz&xSk1DEbj=h+Go&!mzvjk}U;LB0cz;%jC)u<}qeTbtN& z*k(=Z(|(5MyZ4+PL?}=F4p%S4o`!{Imv8X^0TErUfV@Mc5#F;8{&a~HnEO051(v#4 zLnbG$`evCu^SuNKCmY0NdMO?JZBxX@PYaOjqa7aBVBIt50v;)tczQbNf#ZQ9Xye7Xgl;%^yWnc)=S_>=SlW>pUehh_6Ly=F~wo7wtGElXo(r4@bLcJTyMWP z8|RowsFT3^)(E!j3t76manZ2IG+yOGV(Nluz>;?nxaNQXopR@YZj(xM`tZVlP@q{J-Z z_TP!-d{+DM2Y}%J5&{KHkhC+jU4USO6T=mgiyoSniCR&$A`mHNQnWkKPf9)w4BqGd zr2h5bsD|y-p4>sPMX+j>3gz_`thki;&whI4L1m&k^DG|4DZGKVRFYjF)c2koFNwC} zdHLi@jO}9-h~0s{0jeahMzoYw7d>WIGM^GADK_|~Pu)QcKN?%CASAxjj0{(eOudqe z7>$~?E&|SE%7GS}i7{p$R|0iU5=~K25uI04s7KkyU)aY$|GT}ukAdBH7HR$O{(iTL z`j3Wovxr3z#@Lp7l62ION{?c~Lk3WkVv?=7alORfxeFK^82^ZvSG6z{6U?RyNmWs* zM`#Wq0&1eQ2&jOhjH2Tba(iYL`W{s&W8}qR325aBVn+H73(Oa033?fBlTbPJBz+N-# z-~Bto3;O<0IkbIa`(z5M5cIAlM+X5&ECgFEo3D6JulXkG zs0JvB6LmpXLPGlq#d_ieR1B;}XA)(4~%NmSA1(jx;R5Fj8t z8<${Ds#T9rE&Q_`mP@1-79umpGqx5nvy^W`t%>f||Hr-!L0aUs6crVlktph_F04b}Tkc1g-vPq`9f2 zyP0^CMQF2GXcIBAe>%bQt)hdhxuuS}$4TC0is+UCS_lUba1yMOh5t?T4vb`kQMJI)Al|R7#~;^L z%})f&pSEg5Lsr~Rlm70Zw3Qav6^R6{99{ARx^`z|#0t;geZS3+; z?glE{R-O{MM(QCToVSQl6U#UVg}g4IM>h4(a|9ATMSz1>)BKoUZ5WPBNUa|Z(;pFB zaos#cBVi?0UY2&jFAX<}kM*OMF{hWmbQzR~h9XXj7U>vT`M=aL@wR?pNr@+!7?m~0 z{qtq6RmCyWIFeEvf2vN*N<5*L@C28a!NEyf((9)Shi1M5gOYw|NLl?=0uBsWf|8Al zI%7Z)S+Inex~^$*(h6dc_1e*?axxA;b1GHMj)_EziVB-u%SNUMJTG0|qdLM{WJYGQ zG}syxLtdmPEzKoOCTHcCUq~CDYwO6TWh$LdOUx1jK-%elnrdHlFt^(^lz%jIvouh* zG%z=HSND)q4-1XzEm1%VUC@3w3P~}CPBp`>UM0~Mr2>#+bJ>oCpN~YFfx~eGX1pRB zfs8grIu09#X&KH-8Txoku1r;~ytv|52v%>_XjYxazHr&&3_&8ctuKtZnCU9yJLg(p z4?GSr7lA+z6eg|% zR9QqvqcV|6L##E#sSPZ3D5S+l#={n`L(0egWNI4XW+CZj0eH}c5OJ8u+Z-RgyceCS zO2c449E$t|j65&dERQ2E6_e+R$CJiZL{API#GLYw{u)4dfUQ7hSlLg$UjAYK`!{^1 zyqbVOK>g=D9Ncn1U9UQ;D0S6gC6~VO+OfnULPeA2+C8pJdAVjnd7w0+{dPZs4Pg{b zp1l@rtq28!ii{kioVBblMu@~blk;%GwwP5M@&Hyyt%or7il(2~UR5`pzU7(3bzi?{ zeBi5tz8x(u@6R->@$qQI%Ct1XabUQq*2*PB1RI)o6A7|C7rwqDX*(Ciqr8OWT)8*ZP5 zOB$37(s<+dO)M!8Lq8_X`C13p}Rrvo}5rxihv~7=X!L zDYjgE*^Fs*@FWlavcoWUkV>RZPHrpXARv7O&Tnau!Z>D9P;FekiZ8%~^783Ez({$8 zOgU<*x=OZ;6cBTM1g(4|Hj~TgdU0!~(6CMzLoe_TgG?25IEC33EDIOw1$9-}don`lceJ zD#>xHr2fzsOaZqY#N}()3UYl!)n5xv6Ye~5c##R!hV>z&vm6~-$09kRZ#`~T2%Q`&n1S8XDx(*WoQEl3 z#ytCy1E)Mx4N2hdqQuBAtOry zBRO5n0S?togv@n>tTPfO_wU-#%AwBFKTVZ?_ACDspH8E2@0}pVey0`a?7 zh)JGTT*ah^SIKp)yp{57NfLoaq@fMW{}7&^o8VB#X5KH4{h3-cyeKj?2LEcYGOga- zZcPoR`kOWyW0}r%0?u3!V1h`%v;EYv?9Mn8GeQC=N=3sEn`qcv-0-Zr=SUy5ry{vC z&!)QA8WQ_~R-}TC_uBLB0DB?{S0}irwobF<>qk1IL3*V8WUZdMAQ&nDqLpPro`X20 zBUc*Nw=I>x{H|T2h$K|pl*g6+E@G!FE zVwiMQQK=e(40PWq9!)U@Xk_AbC^>^|xoCz+q#hZCiB$lCuF9h%qI#e$tRYpbDSJVH z1@OU>+*a+eeH0EA6N&FPvy#*(Lf4u`e9jF#2PC%Q=Ad3gX<+RoLM@7M_F-;}hSpU-X$ zoUgUUe&Tm~xaVhAo7cuVQXEoMQs(wub`FADf8Tmxh*c*pN-!d-@VYx%@>kr@dAUDay(=DXUY+fDV8XKC z>u?1v)0D)tKh2|dz=4H0Zdy?}OYVLb+$3qdH{>~N&kx;r4z6cC_KFI29!r8=cNp;6 z1-!@7lOJBM&i#C!@6P8A;^BzL1>;0ND^t>FVleC70yCgq&|0fNxx{O&6Ml9a{m9sY z?E;`i0sfZ;doXERuT24;m(1P&JSKW2bp1==0TcM_H+^#-5Cn&UKf9Ac%HA*1c?c-?t*$HdKUU6@Q!I^NZ0 zHGaDMj-<-h@=#RIuKlSvhV$*}UXa;y$F`!qFddTHNiJ?T-@dwY&F*}@+P$j`tHhjS zNWl5^wux!w{B0)Z<&Kcma&q(6nwQ)8a>or5Kgb2tcTv6EV7)dk-27In^Ptb~egE6{ z@~;rm`P9vPcJsZj%dHBD{jkULlPBlh@y6EvIltYRpu^;+=Jn-=6gz&ehfiDnY*VqnH6imc)B10~OVcSnEr<>OWK{ z_~G1a-oWPYzZxZaz31jBEy&7#dlJI5stCN4M$2@F`q_9vjaZuT&`zI6MAdRCN(`Vu zlykkv0cRdt70dmbK@^gYc*i%g|5WT$k37`<2i0%~s6I|R0_d4Cic)7-Tc+d*QlW`d z@t7y`jZ$>UMEpKJb8tDjH<31-?~T=elz?LrLWX4O+(JT?B*w5bp=}GdP}=W$;syS#KWpalA5M6 zHkt*VN@2t8nEU&U;CmtvboByy+>XMtNsz=H*LhsK082)_zdM0IX@c(u{!jbOopz5Ujz@IVVoGuM5_}Uk18nOJ(5b9&8mxo&5eG z)1rQ3qhPtY*z=ok!EN!*MxlFWsCVlqb&e*!iN5{0kVN=@SYirRPLr!2Si-n(rFsoF zN>8-IlO>Z7@gRi!cYN60{uTTgbtD$f6)@lpPVYW?q*y*pT}!FaYRCK;n#2nPrG}#x zZplV0J+C^)$6-91tnq$$TmkB;sBZPTBDBxqcBTHMKlAWZJF^6EdOzs$zp2mB1MB{j z_vW8IRlo1?f*hXIG(a9_^JXOzN$*$d!Uka5JNLiLhI(457ik-i$DguLY-Zw?Wn)Mw za(x~HJAwO-!Eqh^_}N=>7V_fMchR@MfG(z*M9yN7r``i6xeSw}U}F`Dq;x z>3{il0eS|#@u;HHqowv=lgF9o$a@i&-(8hTrt`Qcf#b6ZFlCw9#nX#0%w6r$W?s>s$Z|=61)x6H_ zzyF#@Bk%Wqb>Jy^eSfjE@muBKq`Kq%u!rKs?eyru6V$Qt!148KrFQM{F++74hZ#@s zLZ$Xhr|-)_w%>qpdD&-eftOvC%`aftarH%#^$zEU5dT*6uz4^$Y-9u&l{|N%Ue$JR z-bU6p8?LewzbwW2dRA%=){EhCdXxf;>8oqs?_w!H<`4*a5heK?ZpO>L`wWA*jsCks zjuG2Uwi|cPgcppuO?Ed;P&t0f)ipI9M-l8gM#zeK(914ku2hNL5k9YZ1xsR&g2$AVa_E*p(j$7$9W~>(>{A0bxxgSpV2+e0{(gb`rAl_Ncr!PZ8E%kyXWKz%g zYk#FLnP4vP->>rH>0JZ%B)z0j5-ak9&ix**n`~F2^d5r0aNkBcqUk$%mR!{flG!|5 z8SRWi*|h1;J~ipsV_42l3_+gT9T@H8J+`OajGuU{r$TjBR#dq!XYvytIxd-|+OO3y z5g{_v`QJP13bzLnJMkoXG+^}TW<<;UX}j%V<8f%&r?>nAW&Ib43*6M8IuxABrb31|tB z0h&hPdAYNywnY`TE~M#;zaK8e@eHnSzp!{nNhp&S!466n92l0}#YGE>No){t<-ciJ z`13hk8*#Lj_15oenssJvcoy!KS5$YDy^Oh4KmjW?$OpFTA_B>KL~EHNT-n+q_gAA@ z1fzq}2M7ADiI;Q{FSU{gPE#6^}$W;%%FE$aC zIEkZBcps8d(&VyiY9(=+QaG|UgM+F_Djjxo%CrGNEs!)w9fl~zN&-}VE3GhN@;R=8 zyRss3B#LTpt_Y_%f!?{SN7c9{DWlzdVW_9CewNP7-|H>ef9(AoaGW4B)wf8`bWdLq zi;X+3<`UF-WV%*(~Q)XDQNf3 zK$98NrE_z7!E)*`HkOr|(!Otrf7jn437W2&DfI04z3axI-EMXZXnY>@ z0L~M>M>#Aw8p$qQMZCJ5wij*!-5Tli(YT4HH{7S=aNYtQN(+&wBwU!W{gSaCeaE>E zzCGDRFg`-dAFfq!Cf$!Mh$f&6i@u=gJ1*^kD}cLFi~^eI9KOAmv?3gKVrI=FQ+mC? z@LLw`jw0EGND}YsvIKfUm^m8@WR9lEZ$u4s3^IBX_XLygr}Z0;PP-CVZ57kbvxlF5 z_jkM~yxvtWxE`+_RX`ZXWwSc={;Un%o^HW3)eGJ<6BkLEjXf@Zsgg|!LzG@%UMf2a zpHv@_D=VF8B$?&^z5F_LI?G6bY>KT6TZPNx3zQ$D1I|m-E5!cMB08CJ5ZTK6z zTpUG}L_EcYfnjQ}Ram7}isUY9v&zp56zT+~ljT3GTM6DWirjJeRobKtEdt(C$VAh~qR_~0&8jPz(9)A!dV)@V{cbV=pc#oLd<96~1ZNR-e5e zc$2iY-sJd$7S8dab>3nrt}U8&7lpC1TN`u^=x#R52-TgZ0&U^cUCx&g4zXmXgr!}5 z5bV^8XFC|oCw|W4i2|x&{XU@wq1>Uc&!s2`KK(tDaKD^7FPkyX`<=AVYQMbt_@@Mw5RW!tn{77Q|>$C`Kw4O(X@+=(o-7A^FJZrCvaKF8q>g8s^mmM;b8-5w# z#)?tP63so2_2CS=b_C*oPb;;)t9#F@A*m-{~O_0)IMOU1G1_a8(0 zUu@ZxmCO>V1QGOEYU=jUZI?sgPlBUfr(2RMO*Sw0g!W4njKqmHpqLK--@6ImgeLIx znAov#=6a#$4%OwgU*@mLFe+b=<;(^HP+0YT=r~($Zo5s81#iOfid~26ZVd)UqFSzI z*CFU}M}Z8)d(rO8crmm;c7hZU6Bnok&nvh7T9V^`+I};B_Oz(yzFKlVdAW250GjmO z1XnY;s=zAvZA~+@e#?Gf&e84rgUE5A=VoLv_fj}j@+0S}e@{~kQKF!hV8+~ytGO>1 z!XVUVONtaz5wg~B)VyvihZki3@P4-HJf6kjsjb%_kMSBWRC#Ku1-^R0zP-~sx|W*w z*Pc}NOuK?C9&^Vl*v90tvcFNMGHJsimxvC=q`J4g0xR0g1e17euD*YXZEY`EMNKDitT77p3|1c2bC^@p(DPrrtL}WY ze$T^#ke8Ogf^#PhrVnh^Y&L&e=Z9;y-LS7yQdegF>Mfs+!0<`4)lC)*>XLZBlI+34 z4L_r>>jxz>m*3+q2UD=Gw)uAPoK)6#eH0k)fo5VJI5))RcB;$WZ3RmtoKBCVu;}=m zPS(D)-Cyaq3gAC{ar$xd;@L$G?Q;xBm|HtwvND+NrZ~<%olTnDUr~@>mKgQmHt%y{ zLj)Tb0ul9uTn1Y11l@E$v^cD-0KfjH7n%B3mnm6=v44UYu5CFt5K;zUcX-Hl-8KK8 z^x5E-G1aB@Gqd36D7&nz`*+zJ&z6^L+OW1=Q&NTv@Eg5M1;4q*)>hyZ#o+mRI|Z{O zVQ;t|VRN(1%Ka38#4$scjG6T`BhUY}kEC^DmcK;u9&8I&4iniLx^CQY(Pt-3pK<5?cAU~q{pJVTw1D!n3-f41k5q~U(i?K$C*Qx{r|Wq)ds-q@ zFJ}8~4a+iLv{qPZm$@6IMuJ?X%>1?eHosWBF*4VhUIwRv6X!|NQ^!*%lX9gssCG<` z<=p4xta(rb!;rV}{pXrtfu1UPyk?!@Fj&)-(|9OM%s0Qi!DnDL4L1?yqVf9?TMIiY zL$W~lyGQA`($3*>Q)1N`Hx9syMY`@+Q z{aa`&{x#!QSKbPa1}+iZhx?*Q%nKtenlVqVoZX8eruU<}b-2OUPb}P8*H@Ch#D2GV z(?Flpg}9r`H~;occV~5tmfyyxB81!#ej_L|B%ZoG!f;{=f5Y{`~g+vnwpY zQMpv3x;AzJtUx{GRa922Gke=V$nkXBIDhl&A_>!axj%ckJ;%C)^^7<&A;WmdSUP2004y%9}gn~z7<9mmkC0I z%lG)UwY7Dr{-6g+@aZ}{m3E7p zQiOu)*8Su0EZ(t9?l0)@aoF63LjE4vN(B9{+5E>_BTTDqSRU3tV|;>+SS@{tb}Fq_m4xRu6BbOG;W?;gR= z5({AYh_vgf2M%m5)?kRThxA0$!{3a#wkrH7Sf-@tRzsqaZ75d_qC;WqaHDc{79Sba z=lC0vbKhMIW_`izca~~Lb*)SZLRQ*g2JBBv$7wTIQSZO>T6MuCJ?UiqLC^qZ!J4J_ z`O!gutnO^%$-Jx1cIVG;5g2rQ#+NnVlM~;|X?+(V@06yo$4PWE_}-F*Cbqo5%eYZXFjj^MZ$<0Ma2R*k5IMN%i@7}a+yrH%b zCEdSlfZiA5+s6o-^!?vZF8`M1=hNaNs299GU>$qmrV-|j)4!UDVx4ybI($sfyM~(K zi(~h2&Q4pkWbZ}bW7{G>hJV!Dyg-$1Yd+XP7}J|;DqFziT6KVT&)$XaqhDG<{vT!K z?>q>D$q_P(ShN`%LvaTZ~sl{wWBUtPKKOwB9fe zeF%9tzp<)avfUG*V%I0!bN=#9H)H+=c8KqZMa)3$7DFXI%vgZ64Kllez&-RVSv!WR zeJXPn_y!~Q;{lw+V(M)awi7HZgcwW)id!QmOTv~3wkCA=ldG|YoYS0Nhm&*o#9#hN zf3nt*tVy35*5lywe%{VD!Ot)W-b#|m^;XoW>|o#*xE_^6^@5ublRRMK)A;s`51pNz z_iv%4ynZ@!w86-?;2l9E2VsKjMsU89{L3fk#yyVP-`=<5#!E(!3y8G!i}{wi@D;JJ#SV-CEPVAu@{Rhch$?(Qu>v zTP*|BSL;Jg(Lq1naYeh^NQjtS7;R-PP%%4U*VAa+c8!@lAGB5iTWCkeDUayM?sF635ofM*QXoTE8ySeW{O?HbCo0nHdTr30O$OesC+C8M2B4;?80vBVr6iw}vN?koIc20tktJs3MZuJRe$ z^geqJFoHW7pl%2Qw71raZkEoBd%f_g_EjY%YdU@_CZ+~#JZ%}|?Bk$*$pO&iT1LmZ z*ICwrWDKF_<0D488CQylwA)ItEfg&3N1pE((@cB`9t@CkXF=+`0TK;)glZ}=Rh zk1h6teP7U?%<-r-2}-42$%GdLccZa-$hl!w&Ga@&r-Pct=x$nGCKoy_d6QN#KlTctP>S2?gTgf? zQ)C13*P#2lDA;UFGxaPqYF13sIPM(s$2Squ?x!A!13F zhHxs}qu`Kh2gKd<{Ya|7yM@k zlLl_rPznLgSGcQEs?x0rf3e-@#49khe71WXAm7}7j%K}TbT`sKoSxDIEc^U~=-=c4_1nb5xDCR@Y6|7CNlK(1aco2O%ieWB~> z-rJ+~dp|vw@9BjC=h#!%fQ7*=fDI1q)700pqV6lmRY*mBrMa(n-$-SyGcMZUsQd+O zC1z%kwQ;#BL#DxE;b{E1Z$`+=&R#7R^*SIEO*GPQVAxz&q=7;udY8mgmxLN8RAL#d zK>+Dcaak9}VUX`qy1EE~72Vq$xp9ccRq{d&Tl4posjqjbn_b%nL!?0wFVJ3|ND%L;_3U_;pLqFvHskFzLZD)P28LXOHIm%GTD*&tprB#RG`d5BP= z!4G|ara&eV4G(@bO7;$;ztH~eGFQRU#bMc<+fLz`ClqW3%_6!)E7@4mI;yU3&QejM zmb5e?dx}$Zf33_=Q#OrgkvyehOFc?mUAAmn_xnsgaF;|tG!-%e8{3m0Vp~gT zd+s=JC`=F&mNs4`K!wS5v>N#t$4WqiO7%?ZKb8 zp9Rz_wUI)wvls_v(&`T&ptKr1v}Q7yLJay)p@bTJmYWS8RxZ|CeJy5YzlarRv*}bi zAiBtKCV=R%zAbkK_wRxu2Ta(g!#L`}RUtAS^>|)1L_;B5;7RZs}Ds zr;HQzr1oD7egX4egQkif!TOMSdH$EUwsX=)9N1jrLFgf64 z7-A-@HnKgk=|j-*n=9V#Nd7qRXCPLwu zA4>1^Ia$6OC|~ZN42z~B=U~pFbCw?^Uk4of*ikv$r@f}nE8U`rx%jECg<#Vp2~fO- zd}gE>7>6H2WtKeUsTI08YkO;n(H&pDgY;on&H~i~T7rz#n)t(?4y~;$wahNPm z9wf3?%&7~^3%xNwdVm)qW%;7Ava*V{IURdTln@6$cF!cELWCk& zcY%X~AjV>(n@wT*A&KaIfmffUbTMT}a^qS58ymwHY=wk&0Q#yvSm_6v=}Q!2DfSQ? z8nS)ic?0Tc5~i4XMy#YP`mm*1v^|O>dvbuglCO$~&8iz(?@(8*v>{T@eQ*i5(P_Sn zW-dwupxvnmd#6|K#<~nT4q6NKB*x(UC*Rb`+Paoo-@$!BMWf; zac%qs^dqIN?_aO z_zG9m-|p<7F-d$CN*`Y-lh*j$en5>s;U7NUD14rgHlH?kdonFkayfaR1f*{rFW;P- zM%tLVVHvk62XW;u9!(Q2^D5>VZ6Fgz(41Wp&l&0*)gGksZeE8ztPnb*xRc=nl40Wv z`QkZGoVdf+5mw6n7U^+_Tn{)ZE&@Ysq8=xQA~#b6iM9L~!#NeS{#MQGI7)#-jn{-@ zl>|-c*~d`$T}c!MftZ-58__!PeQZNKHk#o|nYcJQGM(-Mg~xcQLtV(&pJbI{`8}3W z2vEM;mf87MsSA2LwW`07&0->)yv>TB6!VDB)Q+dL)V9jY9Yi$w*;|ouW9Q_&tRf)F zcXm|q(pvRe)cp!F$Vt^)3miK?(7q&@05`28dviv^+1SCR?cwD&t7-8oP6#3ZQ@hbE zi`b-*`xG_R@Aw}54c5=|fd2t>7n;#izS8N8Ho#eTL%GCx^kT*DL=y1*!9tMh43Or9 zU`X_%D(B_WWWidxPa+1^PJW7USu~6Wbd@=6niAh{4#00==iBw=_wxJV!X-TQ^R@>- zB08Styg#PXa%hjX8;I#!{UF(GbemCZvQu2ejV6HT4jQay+07aPQ`3a$SKq+7`S;zp z_cO{fVm8W7fRYdA)5|J=xZ}K7=c46Bpv5G4YO%qgdw6@AbKMUud+YhU`RydyoxVce zOq3lo4o70QR*Pf}tK8!fglACqy}#q(;0H6vYlyX!bM&?TZnYuh!_ntBFk8^$DhH%& zLnq$gcD@c(;(){#GV0K359&EE@Pe@`f90)yB>_;edsdflFvs{hQV5U8qkOeAJ;ol9 znTUc+&eC4X&SHCHGrrS74;Kh7|M20*2Wc^3)ru4*l4F_^!nKy#%ti^i|9lXsGDr>z^|-0@ge5Z1b_$d zF_ik@(!@W9-M#Z1%dXSbG)@>+5Gj&_patxVcZSw!b=jc^k0sM3Coi9yeS|ysdU>tV zEN;jyY7yAv@?^{SHeHuFgx!7j}xpydu!D^cgkbN%78jLYAtJuUPGE%nzr=K z%gAmeJzL6KE`++jJ~l5L<-xO5d3k@WM*YRE{KoecogN;ZZ^VfRYWNsPAAkdcO6t(w zS_{D-6b!!!&4p-fF8?-ICsbyMRzu*rg^pV)LWOyZ;UO+mS&n3f@?=fPQK$r;sZjcv z>a#HZ4Q|AC|D@beBD5zn+Gr2=}{qy8|DW7&iMhLW%dA^8IlcjiXbspbGKLd* zkS90N2BVpF2LV&CMLkv%lEk0}`!4VEiBMKPre|q^w{{W%9DG`bITX$f)Dm+bMcm`x8G=6a#N@}U5;OZg$)8ld|%ekNRcJmFIQ@@HnG=XqVn`f{2+}y zLW?P~=H|>j*rnbM6DRU8H}&IC&XjVc(LtL93O}NenglJG@jN@>sjb&FztDvcLm5^yK(^NcF4E4`%geWO8igq)*6({#CMA@;?2S zL1oe8iszT520t+>KrNb$9#4j*ecnAsP`}Yc)sj*)zLr~8rj+D(BNXm;tdne=k;dk8 zqkYENenETw2&s70U$mzPzYaOXloam9r~mR$l0)*@i&60tJd19Fs+CBNzjQH3sW!uB~NwGBZ&x^|sLdcsCekd2@sP{+4*FwjU%}n`SzZBL(JI(lKxci#%WxhwhQ7sE!pUTcBIaQ1~PS``D!qJf&eAzQL0BbA$X_>BHx z4Gve8nLHdTEt&(Iauy>^VO8^##@Zuv4x^NS(rtJkJ%KcsL4;>e9SU3iI~ z#E9E){W$KaQJdS4`-oduMI^w1$9{{Puit4pV4m`)3YR9A_qmUcN<*Im>=5{j@cB#j z_RSADD5DzR&j@y(eFwgK%t-9{^NX=N7z&q5nV9N`haDM2`eMFg? zbBI7j{H9s7i%pE9w!(vvFVv%dQXE~pj4FN@~OHlh98#!04B)}{+(_fC^E8^&Jch@|5FnLm- zuyq@RCK$?^^!g6){n5XL&5KClp1)f4#@!J|vY4ITKeUJ}2llZ?Gk;DP94wT1fK2KU)Mn#y1EY{_HDrzW?h^j1o34_0N# zeGVoE|7N{<+h%v7@hQzjXrJLhAR^NXelk~?r1rH^e&spx z)lTOM4}%JeY8lLAO({9NYk+uTkDMRf;Z9IQ?vvXrj$8?Rf=sJNPWK4p1(pK0bHk28 zot&WtcRH>6oBI*i4XokHYzp?~b_OZzscY1_1Mu^zd={D7fFhL=qk8Dbn zqVgC0Y`^oOj}<5%zJ8FmZ@oj^D;a>3kN#k6$fm<;aV{Dwf{gFX>vlE(>8WJxbz*+n z?$7r?9t>_f7FhTl%`K4aXXN$WWj?o1tioTAfBlV=fYL#fu@=tVgGylq+jqkGy?1cH z*m0CtlA%ZYt$m|=k6}U6Hb#Pq!hvHgZi}Ke7$!2+MK(Ib1ZQobfMy?B7GB<C1a zy8_41Z_5lY?Bwn+IITsB~V3J+KQ896Le%KZr zP_H2R#YsC*fR3P+M=s+v#P)Q77L+Z+qP}nwkF%QZM&wLYT~5Hw(ZWouKRwTb3W(o zezD*Dzg*w7)^9IBBWvaC`S;a>I-QRw3*Y!UBy~LG5CXD*&E4iQGVHzHu66II-T7op|_tzJnq*0kohtCurnu{V7>^v08yOo_VrH&t8c&^ zNQkuH4x~FJf3aW78@cF-mdk3>u0#KnN%Qo*WQt@zx=IBa6USwIB<204Qv=irSgts=~CS=YlYTD z8<%9ls4}mIAT?-=+jdv(lAQ%t{#JiagNSsI9EM-xLPD?=i2_}z^Mxv9u4N^~s7^!N z5~pNL{Hs%IQ=9Y5HvWmQm}qU^dQS{}hIa0N08QRu*&#OD#9tCPDuS^)_`K(E?phcO zs2qQ$ZJ7n8*zE_jlhLuLMVsuyld=;+*{;4fJGrY;R+}TUCtrvmmGZBS6>vn-mWz28 zuz`vpp5XEMV=T@C*zhP&LwjTS4hY*6apV|5mHA7@e>Rc%z5aLa3jS~U67jkZT;D+L zt5_Rn4jHu9<+AHS%72v&$f{=5T9iuBmHsI|G}r;g9kA_eSKdY&ytIR0RJ%SU(i`(B z(^JU~;k=9d9gNe#uCTRJMIfV>K<|ywG@1`ktnrV%4S@Aq?J@h7S0+=%$P#^h!46GFacok#_?3CZ81ljH@QV4mY^V_9AnoNsfu zFs=Uw>Ct4p#kU;29tL&vE|Gt3MEa8sb7~pJuVw3wK(tIgOXB#1T_QWx5{tn6Yuj}; z+(f=SpxL`b4rY|{+@|3w@a#h&=JD%8=W7x@WyZh2ybkzUhlVewgNM^ja8qN~TUqI2hO~QqQ@mYx}U!z-{;+ zV2z#~^n_92ABlmdF!L))6A{b0lvFUM({NR9p~>K` zQI7to3?u6ZY)qFOfjslioN|0cPKSg$SV8c`DSAqZohDB@C_}|*Am~##ucUTaL+zmk zMjglrEY9>Hb9Rg!G34=;VGXNN>FFevVVH}Uisi>7>R`%QD(I&Gw`{j{BVI}lq?KxA+tOj1p)dU3{O@XN++y@K$RDan^=@mw7Q^d{=Z+4~HVy>j~~ zwx7iNHI>NrukX0pt+!y>V&@?CdvCmoAMBYHDhOPq>kkEmgr|}}YO&l`X8tpOD0BN+ ze_~#5xP8O0yA;2dYKL`wj|WchAdi!jw3I@ftB?F$nma^Ysfx#h3+x6$gM)=mzv~U6 zvCV&;wiBxZ5%Dh@ppBF5<%}Q9rSrMxXLWu5;sxuy)yyXNMvIshu=#Lic^Cut=8ddU z1#dN)sYd{eqKo3^b7b;WuK=|3Bhh_p-h%Qh^qZ^o4{_wEQQXsd77Q9PJ0uIzI!-f{y5fhk%#Gw}T5-DMk)-2A;iWtMcQJ3f`YbfUy z&LAxTR}L8f>Qhlo-6+CTK53>JiwT|Dbo3V5`EYxPQGNL-xyiV{EA@!V;FBt)96w5{ z$JdWu)H^}r=Mf7*aYAJzy)qeS>4mvk2d`7vm&v_^SR88Qm02+W#l{|pMoeD6$=k<| z*{y8ytEe~BpxT8#E|ZrLD$VPsgjeiJHiWnqua4$f$8M7j1BEB34`|_}jJD;4 zUL+Wjr_-~#GF%x{xXq*+$rneC{v6U&sV1a}A}eT)XGtGL4v&ge-$^iVTF7z+B}uyk6pCY2!LU6Dw$Eb= z^nf**6)sve8qpQmbgj#e0>?$Z9opl&2m>@F_4>8la$c`vl*Ue-%7lU(oGxzu+iYr4mh92EgY0i}bO_a2_<(nr8ksKg~F z5E)H_wdr4vop*?hQLESAcx)Ou|C8S)jGs+qMmkyB`+#lH+ot8Z_=H9f#{#$aZZJIK z$D3Au9RJ6y#wXoCkzCbfqIPqfacb@(q(TaI3R}xjQ)~aaK|`{pc+K_DSApgS-T|qf zaHL9Bgar#ZGm<9p@DH7J;GC0#^nCk`lh2p6K6^C%n(GEjFs2b@eH`WJ>@yyifq4-A z9v$6%!U!6NJ&%XoudQ^D_~#-dB{HHiC;w!@06arK97Epc8<>zVG{*GSw-}kj&rjA* zd`_X)lOuiQtas&Df24JF2#q2zL1!iwd!E1lvzq#G9=g7Az>BO%@MgS9o4B9eky874 zdw6e8ip|H+EoAk^5rjt}6RfGHa8&O;Z=a$QW#4Yr@V{p446q$^^Q753m?(Cts1L5z z_`zRoF$X+{9o#L|X*GFIO)T0h)vh(TO~zfUJ)W;NIxNTauC<-7G+9li#p<}*uX)`M z%*_`mXOGj*lB~Q6mIn8sXx?>QNv=@}-&Ye-IApkv^pnDk8lf+DbklRgy)6WD7CwkFUYZK#$kGnmrwtZVInDIB7IFHe<7jn zPYTW`MD>Gvkw>Kf$o%>ld}{7}iiDd5e~Dq1q;{1F_|qgCiAE>+V}MIbA-271!Q0W} zpyRKE0Z!+)3tn5171w*H5{^_L+RxtYx?2a`G?T#}gy#jsQ7gnQd!9fUrR_UK*oL}F z$?0HQz&_XovJ?#o~Td52?O(WpNZ2+&I&Hmty@<_+j zx<6vAVJ~@1J@*D37*U*b7(4dw{K1_L5g4Iq@6y-23_wb7Qvk)qvddOJ%0Q!F6oosT4c= z((m;jJP0HT(|wGRp{q9Rc9FD|8SX$Ho9TDR3sX}#J0fiVc_bH$aj3@^a@0SI>=Ip$ z|LtGwH)QEHB(rq}8>LjO_U^(g-A z76@Y`&lw8;CGol-tH3OLXUz9}jIKy~UGe6;Ad$=B5ae$s13E>p@$e(yFI`Fhv|`PD zrVnRU0l5E^edUW!86JGg5BsbPL4+2R4%0QHR-|tqz~qVx36J0PgeVdA8TLxrlKUid znERg$lUdbJ2vGm3N`7)~{hkS}vc^}qdRa)9_2UfOVERdJ>sPJ7`QLN{mv>WtrMc7F zA*QhR&Bd`iM#6LbzPI3_S}n4*rinIl0gagj6G(=C6fc>{a^5DV`9)@3NKG!4*y+r7$?Q{$0Xi!;>r$%~Tj-7l78Ye}GG|$Lv!jUDNHZ?#q2LFmh%06Y9q) zh2HlQ#EO^4;_yH9BUq8O)mF(L?I3CEIWO?}{+DEoV?t9~?#sRPy)SkA;X-rgbPY^9wGjy7 zGfLO>-e8%c#>&DqkHAr**dt;Kj~9={EKhY9*dKwW(HnSOeQ-IZ0}m3VEj?gIciV(! zQRY#6z{_%h<>08_(Z{A`KGiDLjN#9~LS6=1 z7XhT`!v(P$p-#cSa~JG-;))%NPCr_VptP~Z27rTPp6 z*4kUgJ@T`d5({NJASF2#?tpU|RTd;u_^OD-NJC=r_Y>d|2ZzU>PJkol@uj4G zS!Uo0%mZTR4*2yC?)hL@!5I&H_-~&dHXMdyr=5_Ku%P3lkDY^dXO&;i5JuoEF8LDP z9E+dn*4z!-!;lt%J9qo0AJHih9s*2(e)xn!KxNsMAGa?nvL=UV;MQ4Vd0xZfGrs9eafQ{dCx;={YAN%3-CPv4Mr zHM^SS=0=0ml-pz<&tu`*G$Z20LmgF-B*23#DN*3V zcjp}K>^k^S71%*i=RcF&q=Hc8v9RnmTdW?U)S#aTUH`5NLV-C;7KmnIVTQq?UvHPAdSj_G^18$WJFOspx%Nlj_O`%wcB9G8x=OV0DzyKQph z#Yrdz)!%3qDpxp-JECSuB$G$s%u@jx2~s|wCjf>!tmfst&RhP7|0PJ7lu3rTrjfM3 zO;e*}7iQ#V7*3*<0S!U(3`#eheMstx4r3R&8ar|4b|owwE1^v8JIZVO_MMKP1BDNNufUGn!>Z72Z|PP;;>zZ0S35W0sLYn9 z_rZ|Is_$dpdKE_E!I_mH%t+PHq9OsfbM|9c9(_L&(h_``KY$5^jHe9DP`R2=I&Of7 z`7JNU{U5E*vEMv2xgx8!bb#4U>JS8N%-L5v@h|g-g(WTH_>d@FWRvtk+6}2I`g<(( zwQ5>5wk1-mKeT_wDG;EiX}0p*oMqJKx@z>AKd(Oq&ZR=a3D(;(S{dMH;eGdM2iekH z&JTOUgWN(kkYWaiZlOtph?NR8F(g$f3Be&i8&@T1wRF-e>g%JI(d=jHa=X=O^_+G! z`{GkYd=*JFGXXg3q(ei77;>|=5@4nj+xW;y7gOK% zLIMe(h5w3l1mFOl+oih%NmOQk@W?@y3@fAT0c0jEDTKjiMC0CYM1Wmzz z1QERk>L>E6)bQ`aa>Lii@c%DlXc;-cp31zG4TIU{kL@-{~~Xz zCUd*_HkK3aBv&E@&s+3M6WC>b!Fd;6DLiW{i;VIGD&OEPprH^~u>W@yRpCU%8cVaA zE>IODegTJv&^rqA*!;!E?pQ6EM+-aZo&(~}F;v*pk&HRF^msPAu zF#f0FtTOid_nm-xc|zQOFXz2 z`B0@-fdav`G`VR`pTfo|DHLhUU1kyZ>C&~3%?Y$u?IvdZZLsQ5Htrzb@aI{x+kP9J zyLis<&hZ%BPoqYN^;jTZ)uLF2|3Yt)orJ4?79-n-7fp}|{b*Dq#=4Op{d5GNL_vrQ z6emSOOfpuh*J<~^L4@6%Y(x z^Jn3+xxJ)G%h1=|%h95QKJ`^rMXgXQDDWThiM-<`Z(0Scwp7ndRCTw>`0i_<7ON?d zoceMRa}{-c<^77Hwo)EPf3FmU8$Jy?6wJ4j)`1gK#xIA+ak~+TTq)_`Wu&xK_G}-B z1Wb8Sp-}<_8*w{c`WyZU0ljNJLE*l0fVHO9g(-IY-^Sp2Gn|@rCH7y$W`U`FT5Z(X~iVL31-qaNCUygPz30KN}8oBKMLnDeWt@{mqQC&yyfGxy2hbw z>(xkWtMC&0N%d&oM*|1*0UltKUtibur4bn?nBRnEw+3il1qqREanQ(r6J%vzz^Oxy z_$&~2@a-X~xFnBdVLBxm6AXlUg}4UeF%IJDvL^LOzS)WVRZ!3(w@n!oKdCEvh?$3t zlUA&mX1quPS)fqa3q3da15|7cKyaMg)*7bl+2c4eZx)S3yV~kf-dGh?S`oNKgd{Pv z>Zj|43)%p6@KzyDb?mQWHTtWtp4Ay?rq&ViF zj_*zG!yLo?q?ags{0|%AXW>*h6Oi63EB7@FV8!~6Z~%iwFHW({6tO`aKbiV0TRO9vd&Y6P~QC}9!zV5`|xa;FHW&Y35~gTY~BQhLK` zc%7pVf1GPN#_VxlRXkY_SmCub+L;2EpDWL+e z5hD!Lxe1pmyv}k;BGSVwh`~;A@-D{58oS~ys5Jhu_Z~xFeilFmE<1jVtzVw@r!MnA zg2(?G6Iz{Ae6jitC0gF~pv%qdSuRez-yKT?y*S&`SrQk1tI=TB=v~0Pz=I8W&vnyM z%Qvdu>venn`m~FFKlhEynd&@pobJpqp*!Oq@}}Wht$l_e+eQ;@r{osf{N89E`4ojl z2JUf9B~6I}!j2XjT72W!LXQ_OQ8ZT|prmo8k)j7o5}j7sX>RlswjDO|$Xf`djQf2K z&*&)SdgPFi;MZOPzDIz%?KulHglZPm zIqS`}*huu}FP6`g#@qSs$4;exF_PFUc-TqMj%RgsACb)OMlFh;@qcm7?dWdHKWN!4 zn5?l!w%MUyH0>Jr5k~zC;ty@Tzy~s$dVV_7jwE56nQ1ATYDJ=Y#<9Sajt&@6^?k?n zs*&%UppYfQnV5`Vm2ttRfo*!#GgL|x6Whf^r9?bR_FQ~Ona%|naChVw8h%4&$l&-g zHTpj3EEt>QcAECh?WSwhvWLAyUC*zlj$Zj2y!GTb$=s_Yf~Ts89y10UckVRM4TCnP ze^yh8;9;y_MFk-$)ockGklCO#Dt)xWdl$nt(o0U%YlwC80S?G1X(TDHkL|3GihWq%1ckYEoj)`H_g= zfSH|Q7c4p^ZarDM-vuz?xHAQq(VMv}Zb_A%$Abj*a?kF%BaveM&Ozr|v|ep2b!b_x zlDn5CUeIxeFGEbQIiJ<0SbGG;`G*s>T`Dq=_sRsA^5tfIK^#XWzxFE;LQfkkbb*C0+t?X+1;=Fn) zy=ti=Ad`nm!crFY@i^CNvTPhNmLf+Ve|=rGq{TuQD|}s;La<40m72I`b#RpAWOpt_n|4iE5{mWv3iO&%6T&&n382!vdnTTS^V^`-)z)+*r-)#JN zYpnO($mf@omeqcEdT0+faI{Dq+E8XtKSd*l{yY4t#a@F1ELo-=f3c(2!4R1iY%Jl|M- zMr>tHKu2YM?xiA)#dzJ_#bN(EMLVU4fEX7~a1W!ZVpndW3>T@Pq>>H<99sh5$Ul?B zq94!K6C*;=Py_5{p%DhG8)*%CB3iUgF&pEYmQ@ZR94TfJy=P$EwqWK}6?D!xHRz6N z&BnFUBAP`Bjw&s3VMq06R%~!BVjjXE$!X!fE5S+^2I2sXaoqA9<2pT5`)k_G+rP0e z+RP?Y=l^}%g%^9Gt?DpRSTvzH4n2HL*O$w4N$c9Ll*@jtVShL>UDS6GG9CSC$cS|x z8WJqvX>G12h=yUPxO(Wr+d!aS5Vhai+=*JuON8v<&l(Q&eFL`1~aoi0tmhlNFP>%GKRO8{Y{ zD0<|Nu}faB_a7UkP1$mzO}8RC97h)$sL|p{H=?X4agd}Bt!|E7C=FiC=0^n6(NKFG zNE2g{N$C`JuCar9+QxjoE#7O>)Flclg!71OEiVnNtbhC&_4^@G68eH*+kkox_7H^6 z8So3H4^GS|rP6H# z2`VCy%aSj<`Tp4!f_HJiR_L2YZM$kOv*&<7Kf&WW$H&p-x~^q2t!|_7aRjPPo5NPG z$5upQaTp>&pZ}jU0-wjYd|t1|cQ1%x`D}iZp&wVH@%atzQ`+@wcbnZ;ey=wYDU+Lu zM3oPdk(vO)SOOkr*Re9Whe5$w!R4ehfL4wwM-*osVB(C*hrprkPVJ|tM2eXSJ|qa5 zTD^CXZ6Nm&>QN7BWaKYl(c9`bzsbS~w74)6%(rTFes&Y}Y}mbkEsuj@hSVeZmF(64 ziKVh$g0_@R_g?`o6o_^_6*>~8W@KwEkc4Uhdk2YpYww7NLh1+;13xkB6a-SQC4&`E zObbM6WDmyIj+nOO$-)#Kk#bK6dVk;rWNd7g&jZ`C`)dapJH=2g?OvosSo6 z`4)2@_K<5)HlQw$rsL$%|DP`(tlM5}^J~0f6o{CrL}_ zp`PY|%jfzwp*G23fATa~4GHZ|mMldqzY29zsL2V2P_=5P%Nii$^f~TXkyb96nFv|G z-8zSrysWrG&1J>ozp!2bT8K6w|1Hg?@1p=pnn-14N&CBYIBsZ)(Af{MY@nUe8wj5J zm}PrmYdG2uCY(z6Ec^KbOHp{2LrZef33GdMRT7|#8b4L=WOhX2i$~-m71)cIE!70i z+HpVLil3-BT2&CuMKUi3Iva zbyc*?GCqfqd%d67RhMJFarp24jO=#5z-M>0R1-U>NGvXs&pp*BF=bW6zFiIrMnsgV zAM5rWfr}qO(G~$sw+`wsPooX2$)C_M{f3X&|{l6CCBd$+-u$TT&Nj z%-f2OiTct2aW4h?CR}wTi4gXY=m?P3=<*O~HoAcfX*UosU3;mtJvT})VgSydTQBo(-`rvy`xAHii?KGXgKwR1B$)gkyXdW-Y~VORN{UYNW`@T zbgb|hW}Zcdw(+~v_&s{1qt&FFat0Slr4@RnsS7ku$`o~F>c2iYqT)Q>Nb6PPk#(|F zs~;U5Rr{AqB0MV~d=9N1de2$v>FN3T718UTsrcIKo9EbHtyjK$9Xr|n8i;i5U}weH&)018jNCAdf8HA?;H*Dx`(vJ5-Zh~IaebvMN?88t%rg z;hc^|(HZis&Hs3WNaib|7j72>w){UPG~+%%**)z!TSNJP>qc#W*RFnn#*N6VEQ+1 zFwqH-rJd~%T!sl3FGW<*??~sk637kBXtAsJIb?<9JnX0u45`hx$v2zBG35BiulvsO zey1xwfwhlcp>0bvF3om&1mQ?TS($l*PCb2nji16FPnR7gPEMV-wrUOz^~5m1mp=4$ zwD{cbH9aiSWiSDos%9eUQDu-3LxNuilYDyIV;P>K?k`rAaI?>nU;F^NP#%fn^x$hL?4`SZPZi^bsXEs$S}!&fvr7cDkP(l{$c*-N#A zEfEzo#My;ck!0E|s{uPd^4&&l{|`Z>j&+g&FIw-*$u-@^3p%A5F^oqfh7@Qam0&Jq zm0oQf69fg-mL|7~Tysymx_IM;0}`4J7J^}DGekuG z6whJ%tD(unFAqdDGj;+p6?OCEEM>X08;p%fu^L1NeO6njG!QIxSFO#gH+Y-ooJawllzgdcyK@DYwXY7 z#QB!V)AGqYYikt&SYqD>arvms4p(98tzpLBUk}gI2l!a(BdFK$w6@mME{b zxb&dc$($^oWAD(3p>>&)$EoO40VaW=;UmlhyHVJjz%Ozgmk#Lxw)B-uQxeBaFONSewoi6UfEtkW3(vx(mFR!CtcgRkwtO}Gp%^GE}&g28GoTs zN&MTm6g0=+K_}q*)wloDKT7)>3&-8xpFTf=tE{)F1wZ~Lf|dvCS_0cOA$o#x`N~#6 zP-k^#;<61i}LKz!HQijipUNWDs7<-eSXl>j+5i zmfX1mZV%MRll=}0Pw#PZpcC5njNnF2maWx!xc7%56;-lfMLLx>w-IFwJrprDCF#;4 z`(ymcsGS%$untjEGD%by6iuQ;>vX0`zs^L<5M+y&ZU;P;+2}T zSy(krx@`rSS>{$<^wn)fR87p>oUWC{au#s%-%t0K&V@x80CLP{mKSj^9VX{)Kk2{8 zWrTLbkq?j|PEFvD>~;jI;17Zb@1jvKD70rgAz6Tg1p5%(R3+FVwZ97-5&2B9Y<(7A z@%HYy&}?}dpFUtqd>LClUL69{veCf9g$C3>`Eh zNr&D-@l_V#p#5X+NR6p*9b-t-My69{45D8ZsobcF5H9?{hP`yS^ozH<2PHo@Zdz6X ztE`xY&@Y${f<4ks|CIN*J=F)w{O%E4;-`^Uak589`#c|`BxoCXf%c31H`St8dHqff zxXU+}?j^HgALs|0w^wV=3Xg-Jd~9G<0G1bRAyUZN_aKQJHdn>XL6UUB1xSqSJsG+ zmz6a#uO%onnE(5&4T{(#tAsOcc;42>WKHpkG0()jTm(J2u=3>k)|Pj_*6((M+0u5q z(jkc5LExGiAN4+)03YK=?OCZDyI|m!*K;u%;Ya60Zh^Ak%oUV^??JExPImC>QU0r6 zSN%U}zLFJq4{HsvK<@ckwemmB;4S&zW&p+q*)z;BpxEYhCx{cXBdLGX($`iuPO}$g z&KXubS#}oS^Fu;IRV)cI=s-*x1Vs}yfl6!#Gj{g?f6CO7Tc{I2E%k?L^gtCdk3uvt z6+>tq%{cMvLP{clxP8E{AfRqd!+8SgnNW6D+6zOn{p6%sTgG^bnC zY81A)mZ@oO?@*KXd3A-=`z$F_Ic_6mSa6w&(3T&EkTKgzSd92MHqKP&l!geL^PDo+ zI9Y~VaRxlNt4|gRe6OS3-E9QbzQdu(%NluJI%ZQk(`}y@oitau!~D-hkN2>k5?116 zs9Hto_&X)C3JDp~MudJOKdDN-J{PYx8?Q&8)B5h$Cn)muRv(||AHi)5vVT8S$6OvB z7k}9a=;qT31u7uMgO~<2v0AuU)s{AL<;r45Z#UDVnXhzdv4Uo*n#!YS@#98U7WFkS z`gqUG*j)BsJ%=DKE$}mU_`Z6M?4?Rj8z)NA;zQn3!N>jWIe@GO@dI=G^E6&nn%QRm z;PK?P;6WngYfsP1LZqiDE2^%1Q;J|K*kEL9%h$j+cuRf(jmPM@=I(${@4I0P{Fi|= z$Pxubo^4Cvm#`0OU%4Rq4J3u_q!_!rfy*_G>f47MCQX=si$4DOT`PDM8moBy`hOEX zcq_jr=Yy^r=$y>K-Fgj%?-6t#Nk5A)I9@ZqvBbv4Z*(%SMsMAe&8(y1s^=bp6GeGL zG6{<@3>p|r89@Rr9V`r&G+98&Eu~Bq1+h*w)=)8tDk`1=sgx>4(1VBqt^(!Y;+67k z0SrO$T56n(mkS<;^-7B!x( zu!z|#p=qe{k{L$??%_{#oaOfD8RN!_Isqscd1v78hn-l7{n1iO&8O*q=Vi-1{`{kH zD+x0rHv8L{eiJiZRSb?mizA1Jf)zCJwZvBiCN zaz(f4s$jXy*En-Iz3EkQJqz=9Dwt@eHYpe#=A#(7KZ!&W<2&o$E@t+*`2{F{kuhi1 zMKXanB%Bl@8>|B5G97j*C>xvrYmbp-LhkF@u_}8m-sch0-mUsNANp3bVk&CP_>h2N zv(>Polcel$aHuB`P?w`CDd};iFleZ6Hd#%L!jvic@Mgw4zTDc9;d2!nZ+{$c`htSo zVKDwl^kW0MuSHCPAR)L0wjGIl-~K6&H+FAZMVoCh$@T*C7iox*ewXm_)PEEFx)xIv zy#lELiW+-?)<9+Ai}aBOxHy2eVZ0yziA!(nH*0{t;lb|Lx#>oz0?BbvH(ID$s*9vS zFEi)XR!Vl2V{-k=YO0d%s+HiC9ykjaV{GccNAhrWHRxkyB#L&lvs$E;H=PRGAXT__2QH+IRC`4=s1Vj`TU|n;$F&_9)Z9(aEuwV#M-mWF_Tnx zJVK)GGSbe=z&+c1|%9%`&Bo zF=irU*p?ts*u(|C;;`R-rSM^?@Os2R>_gqq%eT*!GA`9Jkq9Q!$qHN7AAFr|0@@_K zOB=@I1!2Ki`D7g6BT-(L8D@XdWsP%L?r6bP)m25=M7w70#KhL|^o~u)>wV{f?NF)P zXX4x{fE8ykuLUGbcH##UTNVbANYW=ym9emjA4lynQ{wgrt3Uw99=Vt}jwSZPB+8^w z7Ae|%k_13zY;pnUb8V}DK^oYkUif~*<*XUG?DNN*=aJdfb8hErwr z1gCx5pU|LxruBu>4~;*EdG7(y!JI?%GA`7%drCSKy6_Brgzxe7GGh}A1kr)`Ccza@ z`#~3yJIU4?Hq$(`5cFj^2BHTo2SNxQV19m~y_R+oHzsloTBu z6SF)WTjOln00$5ENR>^Zkg7#chFO|f3xd=#?EoU|kTKiIqQHBkK zufg<>vY^(};Vo{Nx#wR}1Ti&=u{vGbDwdO!5Q$jdpR^?iv=%5_I&qj6UTb~(E9p_w zJr}eX7dJ(0mN3=4;vkNjNfdFYYHDs$%5$Y+^yp1`!u!gl%Hve2AhEX@7?dC@V(}DO zVP@Ixu;>Jm#wkk%{VEboGtT1X@%Hht?XIW{E3588Ldq({ z$*Kao1xOYVk9#q%v1&HK`P~h0(+A*ysV3DwQ-*cl zvdZKXiU1G%4`!9OpP4#*;~e94TeM z+eV|pjJj&Z5BLaC!Hl&o2N`LlnlR>|EXqtWn<^)>%*#31h9|qSho+$z`PxiR(+<#p zD>-#=IllHW=A5DIWLV+EER z*&}L-l(F9-h%>1$6bwE6bZou`$gZQSqUu1AU_bx#R3wtXH~o|}4k~sV(}ytwzIbpR zYq0Lp(!`f2ZR(5*HkQbnBumyT2uuVaLq@ns(k_JKWDX!pitJBhBhQ!d0xo#gq#RB)_>~*`TxOvQ1s&Y zg}f?(>5YZA>X2`h>hm4!csofeW*nV)yk3@}g}rT?Q{6QxtDt*d*qP!g)BX}#BvDRk zK~#%{&c@XAe)|sS>+Eaf?%ey2FCtZj@b`cwkn_B z6O4M!kfp~XZJe>42|l}tvt#+OzB_QrGYR_}a)PA9l zTIBBAdp?_aI0mhU?m0dRZ1L2T>Dotwn7`+qg6IDv7Qqf2hQ)LXM zyy@pUO<|R^SAH`tax%j0LSt^YuJ&p&^+651q{qdaapM`cxHM4i@sEwzNm099I3c3MqjEPtw0k-sEh6&g_iuc$W*l*Od3iUFr{6QQvU0L?wDb|dEAuPwyNRSg zo?#k5FdvJ&3|}ylQ|bUhE&)+!j!du!LuJlQsZ}m|?^(vr?@!1Fdn}%&HWk1O;ZLTS zj`#1xE024ZxWC&OGuTsiVm_6}qESn(bA(N?T4Kg-!`VJZN@Win$yVBJmAK-K709u8 z3jBrPO<{e;DgsR_EM>ELyZPg2g~LXTI3ajT*I#sS3 z)>1~K*$Wzy92A9nP%Q%rRDa2oMQkFI6-WgxN@w;faa0Vgez>DM7i>o};!j*dI+pwe z6DefXD!AqiGMzJpiZr`}g{ZZ$Iy>n$T@$2*Q3}jZ&w^ zl7I?-UGno>*Sq8v?ThG?*tpHk%C3uMwPuS$9*+68A1Z zK*3z|Ag?fpEC%-BEo9}MO@bMb@rLqs)GH>C4rYIF42|L4gR(LbcvNW{Hc@t>n$>cTb&A1zi5)0v!Yr#rvV z;u+OVl}wErr@xQ8bG?IoXkl)ZWNTwXgpbqX*%)BxXlX~s>Tgz5U+>^*YHIKOIY06_ z8uogVIJYwio=j@eo2xhc@$o^BD@twR5*&q&CwGQW-5fj`T?O#s+Fk$c1CVOt;E*r} zsyS3{YGTaET8NDyVb2ySKg3=jC471;@oE3w#q}z-;1M)eT25ow4Ly>G5V|>MA_A1s z#`0bNES(oEt=sb6^?Yw`^Bmog{{~k&iL1k_xR5T=;zj&ZpjDbs&bbgn>ok+;)x0(+ zW07Z%n8L1fA^}IRh_+?#_#FI)th&MA5`312-7f^VBl{`bQyT`pP@NfAF2OdzF zPhhr2K)}~#$&W3_k2Qw$n5li%RY1VS;r!yt8?X6}=D zbWMYa;w`%^8YJZiK^!78;rKU!X28#G(6i_2Ib+S>7-V?eo#4*>Py| z^-O3#Y(A8)o_}>j8Rz(j22Gh{ol2;{Hp=vRkZOf@P*UqarjK(_YcM2FI1mm|5&wTC z26#300&W>C5N>jkzDXb42LbK3Y(M8bvzednE0h=Vik46#GJUJp4LDtrDGNLgu?DT7 zrF&6zId|Ma4U?ZTL)-hPks?#XEmyK08xd!Hu<=TV4TPkwGLl=b#^z5(U8VlU7rB=1 za&BC}T7&6abSx%^@LIbLElz!E>P0cMnagUdSd6NKBzg>mOXw5cA8od%%5i!ZHFgG( zNUlljA1LDB?nuW!GDJ<%)0#q#Bi9^;PwK1VZDdTE*fk^Cbd_z0e=z-R@K{%ma-|(C%ZB&-Htg$5;q|2&yT>lc>Kt6J5sO$uE-aHVSzOMI|M01 z`fx8|!jhaDH!4si>&IDpW$)HIKlev%d=BEe9L!b=yn;tCp>b!y5prF(b z@U~XliJcG@rDpVjf%_hVFCx5JD#m#;L8-y(t>HxkR#*`D#kSemOw8Fu~ zkyVgBbYb2zZc};QV8Z~OOu^p8h8F*-Z`QPtx8X>F7I<9@Mo7_Z%JQaTotc-VP^Of2 zjZopa3>Fzomp(RZ-Q2vocj5WqpIV7;>@qiF;fXy*DxJ$JwhSbDbbYvQeHsb=hhq-& zjSI`Hzg`HQW-6Z{YKLy|sEj=}y(K$wJX`0lvB=PYcynfx zJjE!3a-a?gbB4q|iiz%({2QwAOX0U8!whW7#r2#q7Lx%m@yR;&(Uc{k;-x<&%?2Bv zvvn@lc}o~-Sh_B!N#I+B=Q}R86#@arb#f%~I6yWTW1ZJO09@q=Ij$TXnIY=EUD^8N z&y_JnayC3Itv*CX4T(6_+-zN46FEld0wn_7l6d@zA2PUW?)T>F&Ug807$=#{(ykT z6qIxoF^MB-VPlGbo7nrs8@_Gvpv!-)Jav>dbH1+DE8a7`25%kUQ82s~P%DZ4z9bhR z2C&F3mdl`gx082alYmmi!5!KK-klYjJE*0;%<&*(O9*SV=OCY+=0KhY5bgWF>w|vB zt>a^>^|2=jU>jp#%lPees6>@R(zHR0DyVdh;JYhZ>(kRCeSvj(3e^b@nQTLeYz9?e zVU0ACTOzlRGuyCh3QkHzWrfi$jd*;5A`MPNMdU=hs+o!vz^5<*D?WWSd5Xyt=;&ZS zb9&X3Nf7zaJowsSxDQ?0*v`d$M4>|BV+ig;XQ57&&f|9L?CuyaonTxcWa2>O=K_r$ z74I*ZfS)1$w}Z$DKatSc@#*gaIiRF7J;@79LvH-XMtr=5>gHk*kq4LOp-<*T?tIjp}eEWW)_h{H@%~AFP=%)ORm7 zv#}tsyLI=)xa&Fy)!q>m_WfyXW~&AHdas^#Z9}oJ3Tbgxe8cv;`DJIrWSmD zqy~_d(FDi-JjK1+T?4)|M3rdK;Y9qvqO8*)Cn$vf%dt@e3@zYJnPic3GMYa~mL9fu zA2X3BG1d(COuzp4P1z*TBOl0Uk@N^@vhKNoxkhc?;p)*CEfWCM@Bj)`eCL(LrC${_@&3i+h8Q zkAooFK;8AqmHgKCM!00~9$#?4cLds+DTd``9k?*jyw*fKX-x10`_aTPtH?asE(l9i zVaSWWEtfB=FE{l2qvlPejc<$E!c?jfKZ7B%sY4;bzcfn9HK>NMP@@4V!@ac z!gr}GYe&ZfBkT-gcm<=T#0u@m8n{p@AOf>_l_4;T{HCG+FT?Ppq1r-Rs2E9P2~Jwn zeSf8jB{2njP`T@OoS|g}{8))?5VHg}4TgO$k@TT7Uzi!I6h-pQ$-K6md9jyGF?G{g zW6N55!%7mI;JWJ5zZ)YfE*|+KNuV5adQGYFabtdqbsHnL?XN7WfBR3U_n&d7zDKp& zx3giMy!3+?N^G8No$5;AElKG;HwjyhkIo!Paui{(Fo>&JorrZMnHeab;YmqJ4=%Vg z(Hz)_K*|W0h$O#YWH=7u6~jD@<6PS5xbW)U3h&@RtuZ{wSv%C}|iwvK2IyJ8Ax()Gx!gBkr5fGM2QiZ2edb7(6 z%^9=EnkdqV?$Bb%A4A7FaVHTV8sQ0w-0u(rUGMG34ZI z9yb$o-tGLl_HCzdpj(Z~g$uJLhon5WQ#oC;x_f1lmn(kEhu{T73qc8*e-Wio$!YLw=7ne z-_9VLAzf$cz|>&$ZZ`$Wv=oEhS)7qM1xU)&$bP95oC|Lf@~>XOFJx=j{%QDCKsDWJWX#Ir4ui%J(`Z4}bsiozxjCs6r`W8zaZlz$?Ux9r{FK^SGnmkbc5y?- zP|10*3Zasp6e-`)^ms zbRvSOBeVI@U1Mi5bYhtyiKH9)h-VO*Ob(wiYjE+wB^7*rccda#dzMwLh>&v?OO^ai zpH%*=O6SXs&fmcE5(63cb$%t8qnj;2ixX=&x~5aaN@~-W$iHeH{+G57-DRfu65f?-_I^4Lh{SdOf0<+$?%iVjqkp^H=E76=d^$IYCigwTIMswz?m;^ z<*@FFK?GEMHLYT`tEY00fd|Y2dl_#$u8n@KI@ALq28Fxe0z;WC(BU~0WF1<~fLKJZ zOtFj0yXtcMU#g*CYpoPy99f-upj87x@G(A(EGaMx2$501cfIooAO9HBtr4XuVsmt; zYk4J-MicKWLtxUKq0~yk)>UO!Qh{Dnw-HyJQd66j14u55$Tr?(kj0`RPsAWgnwc`G ztDbCTgU;Ww1A$kgK5>AnO*6F|&=LDJHM1z>W>*a}2j>;7Uk+$u!}hZAa+7$ZB-Q+m z(U}=aZ(dCm`)jNF-gcbq+(FD?b>;{Ftawcl=_BqGNT^X&c3Do4fh*mg;Y3JPUW095 zG8-&Bi3&(3K8o~BTv>C{xxtjl$@k}WhUp2^72kX@aeINDrSsJ*efO>2x9qwruhNeJ zH?60ZGgQV?)M(2m<_bYUJKZk>o8w7iA1jVO(cg9WFyyH79n8_o>AZ5?Mjrz+zV9EEd}#ubqY8cOMwJZ>oyS$)dGX%j!`9HPT>^X4Q+@1?2y zg#UILH;9T!8uRRj{GrftC^U{V$mICJ;pF6`rlyvktT;*s-vl)v@6YlgiRa^4z8kdoRx$S_|in|w+GI>SPT`nGPsGhOq z`Tv%MWRwqky9D!?e)1iNQ3{BGwctW!?mT z+-zSqYJhR_J9TWzD^If1B0X#lGQX3MpihbWS(A##P5nd( z3`D0p_R^`~u-cW~HuuwpHJw_HMc@bS=?%W20WvCeydn>#^gM-$c}9Mjo-g-+JbFH% zKeNS^T`@tVDP1I;6cXcik8er+SXmj7245SPFK70zutx3E3SLhZl*$EC=dLpqh7QAqa$To!alE zs5sJMQA!In=IT#Xy*ZLK|9cjoyU_cWC*E88mprjC}c<~MN$};3(2TB>kj}Qb^vp`<#1D$SL4Jc z&VnE@sgM|@}l@+T5~4 zMZq#N%a-~#a^Q^Bh-G49a=4LRL5~~8m{^>$^qekk;H*Q0XDC?{pVYW=LDzu=m6Y|A9DXgNAcoyS&7W|wDS6Hb8+`F&t*$k)2$PaTJS8ainGst+?`mYUE* z@ex9MFnA;9pr3i`&OCi`RxES=_+{%?JmLO0&KEjvro7fIs_Yb~zgzqY?z7COY!bA> zS@JQiJJ#+MwQ@djlDRli`aI$!SCBcJ+*eEOG;CqHdPrNRJEi`fTv`wjF|AI5y+NWoL1QM0-j1v zXIIJ9szte12Xi{MD{yR&A9RMx@#fg(%`IA&1de7G-5s}i^QWF0#Z$t#6*?xGYva`Y zie*VP?DiBxo+7blx zUAcIl|DPH`P^FiOALIO&J+{o>3nH?&^LzS8h{kFj4lfijKi+)UL8e5|3{tYI37!tj zqYMnutzG#)97RYO?&Q|L&lKSxWGf%5%P0074;Yhnhyjm{h<;5JBT#0#Q}B1~-9g30 z^hV76{VN5T(9_TyvBgbz8FsnJL!}OibK4`RRISs*f}ha}Xef!y3OWu`8ob997Zr`B zhxl*z7NDmB7MAv&uUR+nW)7>GQFPL78f7DY_aa0kOG2p_^{A7$sd5ZN;7uK3vbD*E z%@QJ3Cl*93J#AbZ!I{ZyPvGBC`~_$$5b@EdwGxfR|A6c6Vs-l?rkDTV{t{*NN|N8u zEx5*$dh|02CLF=|sr>$GZSbX7@N6H|P@9d-_><3U`vrH2^GgK(9EU*?f3k9Vn%)Kd z1%s+p;avZ<#QC5I%vW{#&z6tgG0ORh1)|^Bs2>Lrv4?L%T_I~nHz%8y>B6TLzthi& zG;w$|Y7|8-H7wQ9eQI)gNLK`W)fRv11QE7eR5PbtIgZ3BiNtnIjELfRDY{+^KwKC( z?tTKMY?8jW!)h&R-1P;ax}u;qDJafZ)$zb6mvN> zit#zdq=K@LkdU>E48&#^_W+u7N}+ft8RxqT55!zDw_99+{u4|#lDb(TRwwyMs>|VC z1kwN)c#?eKjwLV{jFGQ66Ia{aSs%dG>ac5$*fTB%Lgt;%LDIYE3Tdstlqm z$k6dLn~J&wMimw1V1|V!U3n@+3DUokG%kiZ4CP(wk95${N*j|w9YNiy(x-mAo#m9F zhC3oUXOugzjgQ~w=p^DW!Xs&3E4W~uD@kZX5hGKdR&Ih?^7yY&W0a`M9i|GBc*i^( zv@|y5q;5F0W)j71!w9W^aa~|227_lu$k)sM(R+2vJ7$bF150P7$gv=|kp4t`rN04J`By zGV_Z+;<>Kj*UXem0_>vi&KQ2%Vl^ILgL9oE8ojN#8N^1k=aB&GUGb*OkC*`LtY~5#| z{zw~(;W=P*1(Lc2Dnd^lZ_hOKaU8^D3}k?e?p@A7oRSbE`36DLFurQQJ2k zUNsKadIXKdIiNHr^WNwrCvN<2yg}MnWWf^i{F(Ru9T@pqo6%_r_Tb*l$z4V*ASf) zB%_>AW=b>mKzqw;m9D;7YctOWWN`$(7kAOWLx?h&VpX168UVF=I zylGjpD@5T80}Jv-y2#;~#L>+Y7!);8BpWrq1sy3%vE;-`U|P*SD>JYV!^cQ0!4z7h z8iD>5%~#JdUdFqQR4np^uv0lTHC7b(OSH))xVX%0t$IWxIf!A$DiIOR)<5tGBCDfo zm~?Z}%&#uWs%k1~1UOl^WYC+6JKu;A&s83FP}+Bv!6Zkr!K@&l7c=$X2;;X6U8`$z z*UeKnEChk*=Dsbp%-(@^DQ6Yh*{wGUi=9FO&=&=l*4=B`}%fs~P|!Kl_5#W}RMpj-wCl(j22CiX#`2oK9rq^YaO#D;CLoS877^g`;;NZ;fTmgcCw>KWa(bs82+z*`O*?P_#t2d!@qoj* z8)pgveYo1#T1J$r$%kN5&%bxw3B^4tGJb|OWav3lMSt-;9WKVAh5?FfM(dBaXKPWC zamx!!%N%UIib^-ugEwXhB=?0L-#ELV2Y-Mm zhKm_3Z{6Iou<$&VoNp^>Y`b5E2tmA{j`@v@zPWXH`t~9<7j8J+F7bC%?s+)^Pbw2@ zo$HVQ)qf|R|Kpl*dqV?$)!d6ZvCmxl$T8eEcdgdYM0kwOl~AMM2b9Ryx%HX zSreVot)md)WE8UYeP0R^%EZ;#W(wJs7PeY?psaUoHMMy*S=V}FZVg;Xhk_7vloKdP zSlJj{8C=WDA(-xBX$zbF^YbB8zF&UF*^K(n8wZoQmT&L9Y!{o^>FM(x`6pPIvn!*8 z*xihq=6tDIvI?lNPc5z_{0{e9x!ZS#wcB%^^}-t1DoYdr8sejyqZ+DM!bxDFGYkO* zhpZ1WDulUYe|%u0Pp=7&(wNFC#3~Yh(}a>&U{KR%9Vjsi(TPQ1W2I<-b18oB+%ZmY zVjhkDWj~&EAwUU6et6{#@}Du`b)0BM?$hvyM81hETX^&JzFkZ?N#N8T?I8SwE&Ls-&J&5aovIB=pSN>pYcA{+Rq1E&k5 zw?Y+mrvIss10Y{1fLN%p%T;b21fI9I68@em{yTLYj{H`G$rbG~`dYv!XIC@FSV z#|ab<8~wOq(hy+KktMa=`z92b;~(>aex9bTS8Is1np5h_?+3?Ey1xiVuA4S|m*e!# zMt$su<<;0-1`QqV$NtII_AF=GI$uU{z}??@FRpNDqPWC9TpF9kpLd7$LZI)i4cD0*jS~hsZH@;H<69YocmZ3LfxUX3c<67H+53?l zb0eSq7bkX`>gxHVq;#>wVj8VPEVV^rt$i-a%p~gJ!xYbo5|-P&{DiP8yY9=S5@OQ! z_nOvX*Dk>GE#vExE$;RE(q8s<8*uz>eOg@-Hx)}y=vK-~^sb%NEX?!OOS>b-`zQi* zMJ{61lIa`EyO^*h`9ChkLOwFXs}g{NUS>?*Ui;u&g4yJdWK4_XV9<2^ z6Y9_7RB0uw9b;~V{GTup$G0~+90{^Rjl1rKwD{?=!PI+J8W>h8s zpyIe3D1IyY-!zbaw?0t#%;Hb$C)z+Q1k`!-NvQM)5JM1TPOhWgLwrcKRF@`%)UItz zzX4=^{gnIT`Bij6@)x>$gyZ*NY9gjO@wY@7ro4Jx^Fx3tOvmOUqNU+dU`eQ;xvq!^&2T zm*0xV@}-ad*YXWu1F!S*;bi*@^=i|O$@i#aj(EG}y0f>*tkvPS;O*XSy=WLA3Q4)3 zu1k4kX=U?AJ-^r0*XVSv&*SN|&x^`++ZFP1@749zYYS(VUF9scI3`6zFM-b-SQx~8 zga+1NysCdvj)u;q+fxxrBBVp)i2gt-(pbXc0a()0}Jx=BkNxj z!nHD0`d6!kmqt4#Es*P+kiuN{H$DgP_8F+Zxw?OnHVGZ-iEgy_pwxQLpUmUheT-@J z-c-l1yKT6D?iGHSD7s(63MhNDypERUfQPj9-0^R}UJ+x7_j~zo@&h;e<1X5EW0t#p zj$=q6QAn#$!@m1{g|;H0Ap70#=e{2FZa`RCufw=qwe1$#bzEKkXMWCn_Yx8f;OyOa z>vdk&=$9p168YxtMAo~0JF-Qsch(1r~X9kIiep@%1g}th(5|0hV!U#Z0>VUBu+Pi-Ljl3fTMl>44!UYjWl=W9O zkdsmVkUb)qHhQWwVMW`}!qmdi{6a=!+t_AcBVxb4lyv&i7jLySZlh7M{rGC`SU{;` z7jnw%bM&*Hc>6YqumCXfM1>Mi#0UN)&iI858f>%EQ*H;%nmdE~QW9_EyjUWmC zXR8;W%k}!EcU9vi^-ba9p(n|&d3kV~-{C9kfci||~ zDnjygaq51>*5qud((&_fpx`ZEb;k{)c5S?gE4|-O=61g2kg_r$uHbfY$8X!TKUi)1 zmO~yJISF33)cPH-EmtEJ0SF^77ZPsuv*nw{GrL+RF*Q-G^44L;75NQJ+Bu)>Fqa>`#%t13C2&D9~tn`I~PiV`>R%Q~sCDx92kbkDv4n#k_r&4{as6PX@@BC$S9H zK(!M!uwVOnSd)3R4S9kIyha{mGf_EqNyhr4s+XzX5*8|xty{eGsQe31Uf%6~_UB^+ za*5NnvFCx^>{{T>xmj)g_d=^>^`@g)?$Wj$YV1kj{KARz`|ZkDpSyA5eLfiyF`Kr@)aW zVN~?>z=>qV{9R?m8niX9cY7Qk=BU7}Z^UqJ!R2mlOwY4jUS4}{M?|UsvDzH`FTo&G zZcip{^glxVj+w9gfUK?F`3JLveW@sXZZo~k+sve0yM?689`i5$D$mcKr6008rbUWC z0I8SZmpthg1p}y&2Y^A~$Zf4F-zs0*eCK$&1FP}b>;S3Lu46N~>xc07i>|hs`QR?F zkDD{CL8ZK$RsLZa(2GvTc98<$9-lM2ppD8l58ck|*sJ#?n-^?RNex>sQp_mNw-CeU zoht-vpjRn7=Chrf2uDzn+g;|2|(*r9!|%jmff`eAkQ677ke}6aIgy z_z$M`y1td)xc7dy(?HX2_l|+_u2zBlb2{N$z=zC9wwLeAqK}3_f2lIlI7DkgLGX+t zL-izc#&@IFLt&TSa)eomZ(-3XuE#4skBD!ifWI^*Xj9_M%QP(kzeQ2f&QhyOQ{#&YqZD7 zudVaw>1nC^=q9v*nqVx)@;RuK@M|YMbeT_0|FOwSyM+`dWBidbC19+S>CYu>8U4Ec z`Ck2R9gpd zY%e*#Y(+K3#Zc2Nh3^KYnW<^TQwARLy&n7o*m+=#B0@2P?FF-V2Vg6z_j%-?xz{F& zYk^^yHE`h%&R`>H4c($6O`@|&-((T$gOW7Pk;XnCUm_m5syxrz$-CN;CMsDf-Ny^u zK`#>+B1`YgSrAV#*~ER%1CU_|NN>fUBiVY;G!sP%)BlF1LayZQBAKHYcw<0O{FyeM9}R4tBTdu|F(iVCf0t?u(hE@>!hH;;J~%KvV?K-Q@qI6h;GM_S_C@ z`5GXs4Z6G8dg`|U&W(5XV$GCRQ!~44a_l8Pd*pp=JI~7t+yxZw^qBU8Ff%Z*)^_G) zeRpyw)EQ9#I&Qs-7IOKsD-~{s759yqzrk!fhV%`}{GD{Ig%!swH}L*+?hyP-VdiuD zCI|J8o=7go*+_AKFc2&H+}4pcUMR0iRR#1(W!MWSWn2O(p8uB?0NJJf$CV5C+864HR|EQY--{{6z*sbGcIW5K73mZ*c8kAc>}fSI6v+jC{y^t7467Xj{D z953ow4t9oK3Z8y40peB~iC}rJQ|sp|<7G4HAI_`B+HJ-*=R3zCZtB#1r(^kama?yl zh{Eg5-p{K|-omM}`I9aDv#q7>LyQN`XEC9A_qWSL6RjuH!K3w%lDHcH!3pm6FmFqk zh6v|&kwOn`^+&@m=mQs|(MuxN&!{>?UGm#bv4e-mu@9c3jh&OKZwaR#BJ*#d#ZM^m z*SJ}aE>df$-_pDPHuOY~Twy1yGqUu`-oH%EzFd+sH^sEAP@RcHg(F7CBbu5fj{^mV zf#ZhH#w=Y@HmBLEOZ5A!wSSm$q_^EEqfulUqj-DwHnKn5BHyFLG@!*8E$1wwUATTr zY9kw>oR_=!vsfIqNd#K{v#iFNm4&O8D^x?{DIOByKo2KMqEqZaF!+9^-7FKGXQ@;A z4GAV@7D_51bRx%W&Q~Z)D#R>nBH6`QSvV&BoLsvvTd`b*F_8w^5L*A=&+Ve01K!ps zDDax0MnhX&0?YrN^O2IPLz>q!QlECht=Fb2E2uD2A&1W|*INf9V!R&Tp{ro;skqp( z&R{lp*YTZv8@VhYK?y&`v*4l<{sbhssHgLd$IRueD5Ts178%Gp+P_!)<8}}U=Sv0O zKex?a7v2x9FIXV1eV<)$0>-t`aDTu+??PIYso95PSq_4eqx8V#Lv?o#jWm2#szt;d zn)K5P#kX9ofG&LruEGhf6})8aPav)KMub=)JDoB6B!{-tBzLF(|n#DUF!cO_q_qWQ!-s`cEgrv42J%7 zRBjy%+Ivo36ue4$2qiv3vnUeao|fvX3f-Ide{W$c1DeodUd&CKKW z+xRGaC)i@^8!O+tbrxR;0$w5xJEk@{Nc>9^nyYV3s@zb5kiY}{c8 zwL=)-j5$pmBxldu%^d)aHrz^G@8qm)vfljaZM*qaey37v+x_|Xoc#-ew020|GkZ4p z6ij$-1YAp`$s4~v!F<(_@mInAhznncLf#zWB2R+$clGi?x^ygbdUW(anI9q{R^V=P zzi2RD7VyvSP3cUgDwc()2))08k;bIboQ-FsYn80vxI+^is3SzkAU5EC(3r>5oEsWR z1E74^d7~m;8*dopsO^WP73w%>1 zGyYtDJineVCGLEJWB}{D6Yf@yxhLf#VoN_e6ZDNz*S7fhDwvVuH1NY;FgCCor2?l$ zM8 z^s&F3&%^ZhF#X_BzPP{LY)<}inbyZg7>^!Q8*0!V$ZY74jN9Jq`g~kN-mivT2|At| zX09Z~>FWAA@btB9dn;${)JVmBf4&3sF74SRRbpk@VXytu$2-U5ouRz2Dh(%Ls?X+A zS${Qdd6>Mw`6EC@W#{Q!(yV_XM}6!O3!7@YUFZ1lu69?#+?v_se%2PUAI40;Z+-*( zlnwQ3bvN&Y4(ie2Xj)#|)vqC)wfYEWUXFRT+#C_0m%P{Fxu?&gmweRaf9+f}g00Eq z@E*9hImeaLZ*)IuaFNBe-umJ6M3QMlUFsQz1Sj|Um$SZF!;tX$0LRx~(xmRaG0k7> z<&f3e34be{xLf)4g(BurwmxqBm)A=I;OAG0*f8}OQd+<9tdI&Am_L}bn6N5^`ffA1 zJT^c@yO6PB4tx1*yY7KfN3^|9lXfA9ss(OW2FoyAr$)Kr2i80~g&X-@KH=z}lcVzr z=MvBE1isUvO4us+iV)s(08c&-#5XwZNLjUT%^DnOgAI5-H4%$_6GwBUJfA=YA{oqm zSQHj3r!ntmo(Hv-F9@HpF>W(KtF3Rtg)uJ^xwC{pvs~sUBNG=+s+bCBKhBpybxiv8 zJlqNyW@>!c7Y7q$aPg0JpISbM^y}iyk9EGZkXk`WzUh5=Jl90?GjF|^ei>BI&Y>m< z0$6f8T}W2ej8WV6j2lCVc^g}afyEAhv+o!4P*p#WAY-+K6h}Z2KAhHp__W`AEWKsy zH-{$k9$Mp0FkQ%ioOcFvVBMjip(UB-`Oss%*y=O?gv|SHsq6J~g9VWBf13919g;4T zniwOK2)x?Om5!aQowl$F)_jqkwneBwL(C38G|jCcB^wD8AeDv-HuX~Y6qLZ5_Zkpp z`3QsyD5;)7!YrmqelUTFOXN<-hi{Q7rB`s-kqW%Oytn7p=$6wnu{#7y)XXRjl>5D$ z9a}B?%FDcP(_N(o|I3}$w{{1PJfFqXHw`I{&T1?ybu)Oo9Y1!SYn)%dmw9Q2chRBa zCTsLE(YHOF+`Pz6*XsLBCQ&bu^V;#XM#z!w5WH`$`qyTCU+*l@^e}C`ow~wE<0hvt zvDCb+8VSayRsiTWTTeyL(w98xv+tfa8+q0cZW?WlkW@6aVU^9S?u}SB)!??zHY|SZeQiRU*<^b zUuUm)9Y5!+OSo+dbi7Ud+-!}$Y&SULB*X=5HksY2qdtZBeuLx_S@#rcew4P{&)it! zY>x4hIPaTS5^h%)riimVO-f8TuIs?y0Z4VcX4! z{ayKuZNRQ@{f$!njYIv7czH`52EAD!(KmAS9Xg$;^M@24PoOl3{aj-DH@R0HMO(3~ z35^p&m~8DzC8IWx5NRxbuJT}i7HI}LwJ5AC2~LYX>Lz}U6vlk{IMQ{Ah_v1FI>PrH zs&_sb{}nJV*54y=eST$QR3|Z+rJQ6UoOYWjqX*Endeiz{*2g&?y*^^O{$Qwfqqk~? z5k&-F?;<%jWaVl-|{DW;M z`f!x+@S#|gkc6-1k5`I&i~W>KFh%y}i=hXrCBI(R{i9y#+}kPr*UWoqGV*E)`CRj2 zY`S~j%(`Br6>F=O`Nx#%KGziQY$B&4e!N0+x%AH;6yi1qg#`fP6L@>-iQkInNXo_K z86S`RLAldrAI|%hKGGoxjBNJ7ua>TxcY(RJI-it3Pg6(Q^b7a=Mkl=8-cn8n>4kEm z7j;D0r&YCAfzP9zovj2U{2W**dxyx97=?j&`@NYZ&iY!(F%PrPzxuPwQzH%s1<- z&rO`SfKD^ibwRU#{rCe!W-(kn_V1&V`v67~FV`2bW%i_O4FzXCj(&^PB34AL|KcpT(#YPwzA6$C{qsK zA(NJkbsW63UDf2^{%C*9b0RCfAot)u%;KKS+btb#vL0?%j`yhLdJMSVMLe3&Dhq*i?X`i*Cjk5MvY4QF!e<(fMWEEBYuSUk>U7q!JbEyM)?RG{HV4)k} z?+{>HbCpAdnSOh2^r||31O~%yzEZY&hqLJiER?B+(T6C*-O-iz7PN;AaD%%)Z9Gg*wL6@ngNg9km`Sv*dLI!8>3oq_D^cyfs@)(g1jg|QeaT>TFmo3K9bVfT zya+nLzGStm!u!*1cCK&dM};y&GWb7nv0;u9!0Pd> z*_1Aq{fU%+iD+2d7`BXN@Ab~E4=mA?eup8i5z`Mn#8d`m22aQ{P)cJ@{f2Z}d=`SG zQ0_}qDl#!Qj`zT0wpTl!z{UX%8(U?2#Q1I6Hq~nllbs{c;7ognb~Nxe32k zgsuhM;m&e2+c){(dITQgh`i7DZ<0R88IlJXwq}YK?z0d2P#MHA^HL zP;7g#P!P|9WI+7RI%1&~tWfkrb%}$|=XM@-d5gcxtfFkrN!+sr53LB4*yGpZeUrM< zraw^N3m^5#EpSDe%DlwyDMR92v75Q#ZG^n6s-yh0rzL8TUtf?>hHcKJEE1|l-=tK$ z_oC${;T{^}cysN>QMG@%@|c6K4^tF}B$GyhWkrg`J|MU-MgO~B>o|l^!}WS?HL^c# zrF8REx|>t(ywzc?HM0uVww1KWZwiPhJJeBycirsiJ<~Dzjj&YQIvuBToyqm7s;%3} z&}}Mm)sV1pkjeF}>V)yp;n&5S>+}RS7wwVzP31w=U=ZE0_P8TSVz0hq1wkr3m z!TKUy{CnI4Nt==5^h2S5KKn&uP$O&@cNMB5e?7=*Nn5HD)){jD6#Y8H+tR7wZFc?4 z?1T9VRpL#YHOoyCb(*=j#O)g{`7f~T!pKeU0B)8pe=W`T$!vJV?Ft|HXDUHr%@U=q z4`IUB6mucde#fpsLQh~VZe>jPR8cwPzj8fUhfw(4n9lxZR zGDV%5AqoVcEHt4kD2!yO3XBBkX2rm8lQPYK$Yi2%d4h$L{EJCgqa)PexMuDf`g!jQcGUXCKvR2wm-m2OWg}c>D-5j1E1Q2P_zqRA@*HN0uMXiRiox`IYQ!!Ei6rGt$*7=P`q?!_| zOoD7tU7ZjCK@O0cq1Vfzx_kz02&r#bw!73#^ZYXRqF+G%pZ$Q6;Wl+7Jh!2d@M?>- zo9UI^2#KuLAc*V za9$fccmn1Jd5L?NmRDFb_c`z7NjdwkWt7wPp#I<9FIwZ2MxNG`eKxKGu2Xm( zzpqC2qlVh6vMzcJWDZZS~2bq(Czp-zskSY$U2e+KTqdxvo! zKTUTzx?eRXMb+l&IDY)w8>ddm66~O{nVwj=WZiR}h+H!yZS(Dzu80tzA9|}M+V5~b z0Y7JMjXkd$Zvg}kyi#1N`~q+(aCw+Ud+oI5pl9zdDWsO~d#*>V31`DS@5G^DIYSCQ6-lYGi+82h6}MAZ{c^^h&WJ4 z(~OZpvrH$7Mou%sk3~}~Im^TodYZr_2%qhz*ev`K z+~`Ej(CeY|wkiP(NXE^ZyVTKskxMs$xj~qa_6k|vk^ENV>&ffcwb{3er&qI^yodk) zht4m$3F59+k+qP}nwr$(Ct)B1S^PHK>b)PHV%!tUyq}*;wKWXA{ zRIe`2f1|A_h$!9eu__w*4z%-Ee;a#Y-_kRvtfs*+SNfj!@<(9$Zvm zsy$>A2{Q%6$+*f`+7kGZ*(>-E!3q+nm%Mm2l*2L5%%NeLjgK|xbtzKLgB`T#X5Su` z|I%mwVD8D~P~IE1EjO*UFLl)|gKX=tyBvmVKk9<7GuR$_H@{Pr3yE8#WVZhBxL+P6MISP| zNcEnvpN@pPx607A`8d5ilQi#&_H1>|dzzv%FG zeKy2*t3-c$OsCcM=H5*Med^mxl7m&{95tAQEq(#Tylf*(zmvaT%{1|yS_4AY|N3~; zRsLJ8A==&|+3*-?dXz9b&R&{fh~ApSNSY_7%-m1jS)sCsvVEF){41my36sRR9XSya z87r-tlTQDa@pz|Jvcqbk!^G`wLT-FfQdy+AM@Ddgg4vQ-mMtCS=6t&KFV+)wH97?( z=fJgI1~-AcchYnO0yu+D&o<2S+?Quk)jSt6#0x{G2albFlsmx#W)6QYDI@23 zMJgAa{@wHhYAkX{VSRIVu{5OhRxb)hXB!9&zb)V?Jc0oU8}H5SXCb+j#k(MRWtRpP zp9Mh5+<|0qUHRsEjf~*dji9m|Wkc09#$%A52`WR*qEpgqvSqceY(!*-JY7g^Tnf zDK)@w5B0Z{?8oW&tCM2(qJl#tUy4EA+?YCAOoc&lOkP_h`RnrvhZ!Vb^i%ZZPSWx` zb&-SgF>~(8$N$_Lco7`51ol-H^N@gfi`nVSeid&N;aZ*XG7{bz6INt3WonqD^R@w} z%VVL>9K=KRYSr7~AAMr)yVsLyZuIryj?LaF&WN*X)BA+?yN__j$Yr5>cqyI z>>S_QqpVI*D_?dC*XugxogAq5PKpv+yhEni-3$3#*^6ZhInhenjrtyo!L#*<`BFMV zGmOgcZcXX;itDH!-K(sR?9+t#eoOL@8azi2mD)v`(GxcUaTq7SRCF~IJPutW z!@tj%F03S-*;IxNrpo^ZSGmQO>G?0MBA8f#ncDmUcd*7)Bcmo+SUiA^<|Xo$5TDFq zU+w@PrJB)GL$W15oN%sRGI%gxGwOnluZ&OHNNP)y*;}LCgl8G_JW-6;`_uCyDLMOd zJ5QgZ{T(wOh=73C1F+3g0I$yfk>q>-pqartFL8OBY#3uQ=zfTB%^;qe_gqY@I9D*J z9vHmR5`LJ4Yi-lf=;!Hp}frVX>a>k^6&BKPg3Tqqt4GP z#>38b`^w!xdwGC0;y4@==oetRA@7eCHy&_4PqqFQ5cv@HJ;`0BW^XkVlUa?cstsWN z055%olfXO6{k=tD(dO#*FA*OG7ybiJi_2V&fIM(MrXO>@dirDB8w2+C@%r?-vsM4u zV)9}o;~gtuM$pG$R409oz;{c}eo=0Qqt!4USJ{x}R$*$?veXe9RMVv6l@DwbR;HavF*kl4@K&}afOkmW?ga$~|$aw}t#K;B2 zNaQJb$YAh4qD7cQqpZ+Ul|w)TAwKx5A$w;2h9EJeC8G$q)_WvZP|$Nu@`aazAYw3d z(|mgsphKwVTj|3)4rc)$kb`n{2@yj42(ufwjRhVXe>8YY^@SxLQ6XuX7BDsK)rl{BXQr}=+>z$U%&uXqR8@pJ7 z{}_*F-y&SefUW-?d9%iSQUg<+tDwZNXm{n1BH0r=Q1Prjl(to-1d?*&Fo_BUi6n_| z2|7iRI*}5UF*K%hDN-bd;Vo)@X|UdcELDvW8oJX|mAeUQ4rA6V2l!SE%Dr(?wR!xSKbE7c%YT+m6@#BPH`_mFP z2>2&)Gc3Ctw3J=WC#}%9teyUJ!NA3k&=OcE3EVvtwlSKnTdZ7uPrO)mE3S@(62VGz zzw(2k*=OPK-nz`6JeN?LfdpYs(!mN_(GR141zUyoh zb3UH6**p9aZrz39JiE?%kTG~<36J9V3LB~R-8|S71FyK*KK=exWc`_as8Nl-^6)87 zhahEs%~5Ok@T#l*m*s1oDpORZk)V^d%g4)RX@rsD^ofV{b2IGukoi^WRdeC?sh}SV z|I?NN)QZ!&X%s2-k7=L=d#HN5P>XA<RXrTTMb7&+g`JA>fn8$E!S|XL;$g8oC(Y z+wCtQ=9HdFp00K0OU?f<>wQ-=M0cGR#r%>WX!X0mMLcj*}sC z=`~$&WtdY)oJXc9*vEKdu18)(sQ^AgEzXvsBUvMe^^tpsWvFjYAk)JG$x@C`3Wh*JkR<>e8F zJl2o}YDN3>^0Fm0jq=*^<$Eyf`hl_`){TxxtM`NubEc3-Z@6%R%bJt z&^gC%frSuIGB}tpf)kwWS(2(&&9PI6Z1USJ6g#u&uln64liwZ9Mlx617CUh=g`O=s zELDN02|MSS5GU7IE%*aDz9P2-wl6W zdV5Td8Wmq`xiK(2=zY)YpC0rt%brOJ|3po!S!TCbHq0*k@NSxJN4`csxnjG#8C4$Y z&}9j3whOsBMqXcwpB#KnQIuEPT4?q@t?**ec`;$~s#k9(Ky-%E#>PB)>L`&9Mh$Ou zY%*Ld*07T5vhKLmFjTPG8G&Qz3yssXIDuk0Ef}!-=e1!2Nt7W*3rLSC2T2K!>HACJ z`HLS1Nr{LRw<(E?C1HaVfc2Uthw!l|r3jnF9*)l7J~df8eNq?~Se;FK zHnFJgtNpoM&s-he*ZKmQv!aE8GhuqpF=oAi1u{0|*tRjWfBWAv4pt+#sEjXNJuQ|=vS{ko*mjm2fMcNx^pAr6FcM~4NmyGA#K^y70(z3NT ze?d`RPx)Uv4-asd93}$&m&EwGb{pf*QH?m`@$_0N7f;f26lt{#WUPe+7lW{#WX5QF zp`oBrDjJ#L4pW)_00ubRWH@70N28Nk?Gz{4I9En5km( zxY15~b=KLX`V_+d9(r}#QS~-&`0hAMCaYz_%l_wnV8-9av6r2_=J+)*J@TX8$>IV&L&&Inz=~$>A~tvZGb?N#+5gd2ak;(_&Ep{s5dXWOa}g6 zIla@7oB}*N?}B117%&k^_Blk#&+9(4l={F1Pcsva)$DuQ~dj*NJV_fp+21#DwsH4jXHsP2)bCQ zI-vp;IbDtP0GeI-D?`BtYfonQYIXQ(02#h~xLNo_OvxUrwn#v&Ke?{hfst5sug^P` z+8Mc61{&H(9b^I-Og*mR;x`=zvj?{q4-ct{m6`|FEv|^3Ph{95-QeR!$cYQo%*|Qu z)-pv+tEv*l>m7W}ezmqBmS|Vc#`&IuljqqCM>ki~R|TBo2pb&`7bjP%=0(aa{WYGO z`zzadrpG(&S(B|p=zAb%)b)yqSZa%)XA8k%W41OyWpbc;rbs=!wDoa)o#Rr54@W2Y zHcw;8?;|r9;Moa8njqTHcGKB+M2&Rn`}7pBsbGRI&v~t z2@UpF#U*>%8a?^KAEOj*kArz>azCp+<{g)LPLJOqtYT+BSL~yo13`7!2uf#PvyIr> zm}fzmwF@-cN1E&+Z4Xn{c6iDYRV65Hn_PCVti2klx@OheOMSinxbf@NEna)tt|f$o z4wpQ>Mq}LI*!*4Q@hqe}HfvV^_=hSX@kGq*qxihOCIouU>}enaq3!Y{E; z_a+uuAQIn>cQdZzWpz!PG=ICmt??FlukjHFZV=+hl`A|2JUyU*$p5!U0sSbXmx5ma zDgMG)Q6AfDHv5Dnd!&=GsULoo*n~2*sxm z?XQq1-fkd`5r%3c)kq_+WPuPWWlpjZRb-7kXo1q9W(g@8isih%=8q7^h0dVp-!0TVR5;Tqy^}B~|hL{_A zHfwPnG}0+@X6LMu_#CpecZQza-sINTXKqHRNP;s}_gZqDchY zAY8Nd+GetXXjl=fzLagB?pJ>3aB*J-&(=JwEpDNz`h4v__&FoU%#3fb3`}<{z7Spi ziMePuQ=9dPb2SGw!k>y>3P3y(HF|leRJ9OErb)WuYEuP@+oGDDa&520 zo;%rpTYsxdHJ4B^TBXOuRjJuSm~6JYfd{vNw_|IYW+PaKl{2V&L&r2fKmM8u=r8iM5N8+qig2j#^QMUr#+L#^R+nHW%Sz5 z?+vZ(q4z}r7VQM$}BbE<^`;)se#iz4kFcO*fWUy$~%{0F@MO}z_R zU>Y=L;ns| zu^+E;BsG{qj22bDk_DYWT&Oi-woElyYg~DAUYchufA>3*S7Zj6E3FfRxLD#MaozFFQpOqD){>L7;G@d@& zoxDY6aQsHR3r=6F2lUS%xWw;NIN6Qg4>OHAOp&m zPw2dib|3?`+CvlW1*y^n1LBDCL`sR9_Ap{BoKN69e;ld{{C<%5i(Xz|*5 zeD%e;qv;Cq++rp&{dl&7yYX>A zgM~eq>_js4aG69oKO-IZms>ZyPH&_ig`T2D_rA6Pf4H{U(3oGC4G@4(u4>Weuoi6C z3^j6vp1HzKTUq>@pXvI9p%YKHZHP%PuVOlgH7cNC^|$_Utw-`^({&c7!CXPLmbK7( zB_?c*lh*h)tSCEhK-K%2v2k>tYTHHn%6+Y+_VYl$21Yb1{qKP1`B_{s3CQX5YsP!> zZh`H=pXjh{rawNLZ4mU9m5Dq;7>38I2WY3?Zcs7B{hPWTHf=6;A|Dy~<&hsbnjCjC zJ>{~qv~*7!YDb;bEM}taXEg_T*I+t0Fx)FCAvb!Xct)cH6){|D$PJJAi`28nf+tZI zM~#;DF}L^4p|K4uIr{7$buz(BGa}5|2kAB9u&*p3s^o*rf&1w*cQbVlGgte$@6ECY zY!uz69v)oU-9(5L(#gaHY0_P^6gnvf!Dwrl)Lj9k`{Jw$#p(R|8ffV*2&(x(z{_Ju z0ucwus3?iD0wv^A;lxjSsZkftX*+zF`2%^0=#&CFzEg|@IgQPdim$~g6pJf zLU6olvN)s~nWY2nSOH+fV>4Mhp#f;9m?{Bznffw4!2TeqBl^A<+Hb^gG#Z)J3X$HZ ztN}6zK_k0Ox-3;@#m(weqg|st07=g8F<6^K0n8MIJ<#tpnY&#gPYybXx(66lDUVR8 zELegyPnii+Q4iFeKMow^Nj%0MJ6(t#6?(mE!@>=mmp3)t zVXCqub-P215|w}wG+e-$Twlf$HWPBeYC)gt>I#YoZ-r}@mtlbJUfAB!il02FabrM( zCMW=YWNuNjRu~DNVRqkUyA3zog&MUAv1H;^CG4pQ|EB_jdRy%!KUE!+eC& zV`FxBDJ^}3hi{hZ*k!#_>#^NxgJ))(|}*B3KD0Tv-<@v7{a3iQi8LZ$num*`A;YJWpRAV7`XgeX`-D z(vJOtVEAbYPvK21|(Q}7(6f)Q%B1lXO_#CiHP z?eof%LxWbC3-bz2K&hV4F}T?}PM;T3NQ*!fi|w5Bk}R`FRhDt5(w67diP zzq}QY+K?$@Cgp;t^F_~A%I!Z(N^#S&ZhrF| z#%Z7QW39t8&vML6xdQh2+5noP%d70>E|0$Bb6-)_G>XECl(ZTbk4>QU!V1=Vs0puw zwl==Aloum@+Df2^^Rn}k~OPT<-)uF3$ zX-<{Q{UI4w6Vo>62JWDBn*l3R`xA4U2PBf0u8L3&?5K$4B+$oiv@?5+}9QPGtR}&E`Q6&Ze z7F;O#k@>C)a%k$h1Bb4nh_WMOEhr)dWG1CTLT14@BnrnKAt{6L_EJK~Hhl!&+3YB6 z6xu#(Pd_dorYLHArEvbg2r)$LPGvwsaLME&2)HiM;atjf`GBWpTA8S7&k6Qk;N1dI zcO@lJ9?=zbNRMER05J5o67^^D=*t2s%$+XJ2{v>c z9&@tY#Z5xUwozC%S55>I_W*meWXrXZ9K&b>3l{Ri&2?4Khy?Ornj`3ypb|1=Q zv=J^sy#u7))!oJW_dfHei?-c*lkv&kx*#XGbxwlU81HgF`RQ5}O)2^|cjwo~dNEs; z%C?L4YoFsb$!s$MkIG*=ZST*gipo(HU7nVok??3X*;)vK+>Tlr_$}?kqms6i3U4QI zM>d>J+(2!3k=akGg)CvH(sf2tY7!Y`k?fiX9z`_Y7V_ctKa0_xGpWA3d`YJa6VJ&< zpX0NiV-H!REVgSx@~k=v z(W$F@%2rh=u@3-NDtI!fOejVo$!IP-ii@ZXcyxT}$S*HpoQRiD=7a}OFy_BdM2;z` z1?@SoyaSGKc&P$~;PL=;zOv01J#M_6lQ*}~f4&bLj*~q4AcP^XA^77~c})Mk0M=-J z(9g|uQx`~t6~PFqdw@k04|GGL>C?MtF1i$+k0S}H^zaKb*`o#Y6)Sc!H&((U+bf-Nh7 zcy1O@G)bBQ$Q1k>;ssOO6Ug2NVn+ha3i>g;=FXJu)(GscLFqzR&d%ZtJ5rG0_^6nh z%M6kG+1tcdUCMLq=>F-}-^>~xq|DvO)!aa?5vH7?^)f-s2oSAnm$PdZ@9!Og5b!qL zXIkiKgvcX6iXoXXx86TTbF%OGWVSrz_ zAJ-qJTxTQwx)}mrdY^W`Cpp-=8d|Rn|6*f$!t4o zx*NTuW|F(|G#G63JWqbkXwIm0r#9~kypI3h|YrK^-b^)$BVA1YM zrPzWGvX);W#h%~Tlrm_euRuF5b9Y75Qk_~(wz*+pRPGh9ayNwpHgG`7Mui#qaSNGFfkb}``W3`eUXB|8?*mfRRBy#u@V~Ob z^e#XrCu9Mbp8((gZO-JsZU%iDuVv1v4`4xHJ5<1yMp3ld^!PlLeHrsVSE?#AXheI1?g&7 z$aI>@;K>gsJCH&n6(}HENCld)q;w&H0+%JN@TD2#bmgGpGBOc%WU6uwG7nO-)C%jl zRQdr3NORg-)DltPN!FBebm3;7({{F9K(J zlQZ9bJVjr2pKXquIV2XAfKai8R)ED(n+m^3F6At22B03$A!Dim?~@nCi+^>CNi1TH zU%~&%rrbTfh$~t~ozGujIK26dDjZIB(ge~Vyh>wJ34Eu{YIF335v0GExFK>fJBsrU6Fo?{f_d$0Yb zd^hFb?mHQ3v?4)fWdzrBH2Z|S^DZH~UEGviTn0eU*d%CLcR5;5oo|F4W{nj#Gmf_1 z&s1DNeotS0c)B~YF*~Im-ofZ+Na}aMIvEn zTi%jb+L2h=l9=0xps*RHVF;ph=ngKYSbW+1tUYsGpTD{50Q;txHIh=Fv$)o&44kPl z^vTvL^ms4z#>?4e_}Ws{KlK1Lb-t4|_DE2FOT)*iLYdFy>X?oWng?qc=*amxm`N$0)^!yaci@? zdZd7&p#sZbmLr(UPajMWa4*oxTwOu4J9UvPYF^p58>+%j%>O}+{#_o_r{n?!yQP|D zOMKrt#0$u6DmQ%@6*Y#6gOD<=K8L231_>YlK3VymhP}YTKZzze@(6Il+N#HmpAz*> zh`Xh(MMX}NuBseWMH#Yk0xTJAAi@EN`$5TuK5o`Ro>g}$b)1wsI6>}^)Kvj#Puzw` z5h-tr5AzXPf*eA`>l$fmoF~VgJp4Fy`fl97t%z|e5sUubkG*~d5P&qxjz4V&Yj}fT zbY*91&EBtev*viN5^9Ze0AIz~t|zy*5&v$Q`WJrdgVRaY{fp711Lf~@GJ&r~nw?0( z5s~;Kis^eK)3*>7-!~W)e%IS#z}sS1+99icD4BUr295cM=IMnm`>Gw+s1viIBO~`>a!Nt%ZQ#e?zRW8!X zW?ulnCLbryILNj*KwkI^cx#%-h?AAp1VyH<=p{G1k;RswS-wdKl#K*QND+#HIS7^U z4MS^H5FU{-1gEkC{v9a5okUlFFCxRO8rzN{K#GY-ng2#;BzufRLBs79h2_r@yZ<0$ z3eM`k{Wt#=7?->e+$$4VQGj$%0{{p_>^aZEF$Arzkg)=2M7ck`yN3{~Gu3olNqV7J zPw@g8nUw;T!s$eiHUDjNs?AGSHY!lN-I>0m@_YMD*8%p4cTQ1NBP)ZUbEL)<{YtYa zlI?{KEPBd9C`=xQx%0&+(Zk-nh*B9&ph>;_)hH2R-iYy4hm0dRnvq?igS6>ts?nE~ z!YinSlamW7pyk2bRw69HkaLviRcOQ+2vp7YzU7Ok?d5z*8GFi*Xu~9~4z4z5s3PoH zGL8XU#h6}ODWi5G)(jMEsoP09`$)RlNxfZ&AfjO|gJUO+<)Hn@gkY2~mnf}{r^UCx zZ1Uki4}tTzu`$q|45R2;xhbf+%>gZeeMc(GpkmGm%`BwCQ81N*pb>}v!qqSPj#lQv9-&8yO!?m67FUGq~JspwHv6*2&LfU9G7xnz_umc zXqD|dRPD=T{K&WL`=tEngzS$>9Tw6K9!hNw!ams$`_NR7zRWEf{+Y)KnZe!Zl&{IXhlS%v}b^tN}MJX903F)VAq}@SJ?~+51BBNg*yP+mRN(& zRQ4+V^1EB6c$wPnj+i>$Pyviy5Rget#d^m}iTCoeu{Dwc4*m45Ck@z*Yx#q|2AVCr zLHOV7JP)=&m*{U7!lhg1@~Bv z(1Ngsa;qO3S{>2D*W~|d$E*aPrjmLGlwiyt&HWmr0v~}8QvP~{$QputM=e+O3eKX4 zzxyS80Q1g`pF4?E*G~LLb^uK**q~gAI3;|@AYTYFi2?1Q$SWpjGR48NI7@>nlkTvt zxY>#-ljbS`6fHTSU1$l|Fae06&T zU6gByGzZnFBW%V!V)lL9ArSR6Km2nO?W^eFuvj4vQ@|yB!u< zEjE62gszu(o;xEnM#;`%<>oH(%naR9?6(^33|)1)Zt%LE4yg}*GJ3%4OKT3PwFfpI zu3^OJ?B>8>pCG+Q%Ub>O8_Mq&2MJ901TS)W64!rEJG6=+!jpBYk(s5Xt*x#_HQTKV zcfi*f7OZertNw*CHui<6kQ7$|ghAYxSZN1L)|4g_+bt^%ucnyIaRacUKrx&B=E+|{ zb^zpco+}(Eu=3})5`kl8tRB273>nQ)RZU>{}#u%3|BTG-raI~nLG&4Ps_yZ8IRsFYets7;|x5q6kiVvz8}9jOxvAhA1`u_ z({)a;baEECXZmbLF+{K3FIYZL_&3{8LVttHnofV_wEOff*Bs)-x;?o-<6a@n?^1a9 z0q)rT3u5?2?)V^eevq-a#5Z-Ot-A(lz5nSipUts+cQ7pGQ|w<|ihyjvtVGMVLIU)J zgfb3NBmgg*Kp}aeT_2n$Ap4+4|(l`cgbLMRjQi9 zS!4qdH9n><_c4Ytl=}loOCItsJiXO3kl@zgG|9T06!ZTNc9IQyX0}!uGK@{r zGl&!@rTE!qM!MACGig!YKF5-~)vaiOXw>rlH$a`;tYwrVu`n)9M-C+ zn121o^7+tZiCW=+LF@^E?3||7Cv#)b3)+Lpm^7>CS)@x4#fJ|O=fnXNqw2g86(t%( zC^Ch1tr8V6BrvxLW$1K;e7V3&5x@-{oEN6?jZmFK5pOFqW8wKEb&1k575Fo?C@-}Nda_PAGX9(C#)&)2 zo;1jvGOm3$wth3Q{hZeEnek-ddx}G|%4&sag#Mg+>*P#gv(!hE`Y^^maYk(BeT*TL zx<;goKB#cjpbp3W?3j{;0dyRJ-vLB9{br#EC7|s40ao?PA&m1giq<8S#UPW?sFBu- zE5%13@w!6Bu8&!!w==V>7qKkDUdSNU3`G{3XKFPoDl0Nila%UPS%LdqYS82wrBvCqe>R2RzNy( z1{_OrzfBYgJm5rK%(tKmFhjb+=)QO0pXZbH9m!|5hHv|g;K7((kXA~JIVzYoDu@}w z4;#ui;-fo4&oJWRI$}a`l5sdi_KD@#T4%MYF0D3zsmHTEa+7l_qqAV|lhO%mms6>K zQ5ior&3+Xs^yPx

  • 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 51010fc0..50e96fdd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- project = 'Note Kfet 2020' -copyright = '2020, BDE ENS Paris-Saclay' +copyright = '2020-2021, BDE ENS Paris-Saclay' author = 'BDE ENS Paris-Saclay' # The full version, including alpha/beta/rc tags diff --git a/docs/getting_started.rst b/docs/getting_started.rst new file mode 100644 index 00000000..1758ec10 --- /dev/null +++ b/docs/getting_started.rst @@ -0,0 +1,45 @@ +La note, c'est quoi ? +===================== + +La Note Kfet est un porte-monnaie virtuel proposé gratuitement à tous les adhérents BDE. +C'est le moyen de paiement privilégié au sein du campus, que ce soit pour payer des +activités du BDE, ou bien pour faire des remboursements entre amis. La note contient +également la base d'adhérents du BDE et contient de nombreux outils facilitant la vie +des différents bureaux de clubs, en particulier les trésoriers et surtout les trésoriers +BDE. + +La Note Kfet est accessible à l'adresse ``_. La version actuelle +a été développée par le BDE 2020-2021, et est maintenue par les respos infos du BDE de +l'ENS Paris-Saclay. + + +Fonctionnement général de la note +--------------------------------- + +C'est quoi une note ? +~~~~~~~~~~~~~~~~~~~~~ + +Chaque adhérent⋅e BDE dispose d'un compte appelé « note », créé lors de son adhésion. +Une note est associée à un solde en euros, et à un pseudo appelé « nom de note ». +Le solde associé à la note correspond au solde de l'adhérent⋅e, avec lequel il est +possible de payer tout ce qui est en lien avec le BDE. Le nom de note suffit à +identifier une personne, et il suffit par exemple de donner ce nom à un permanencier +à la Kfet pour acheter un produit. + +Faire une transaction +~~~~~~~~~~~~~~~~~~~~~ + +Tout⋅e adhérent⋅e peut faire une transaction de sa note vers n'importe quelle note +d'un⋅e autre adhérent⋅e, pourvu que le montant de la transaction n'excède pas son +propre solde. Pour cela, il suffit d'aller sur la page de transferts, qui est la +page par défaut après connexion : ``_ +Le formulaire pour effectuer un transfert apparaît alors. En cliquant sur le bouton +« Je suis l'émetteur », le champ « Émetteurs » est directement complété avec votre +propre note. Il vous suffit alors de remplir le champ « Destinataires » avec le ou +les noms de note que vous voulez créditer, de spécifier le montant et la raison de +votre transfert, puis de cliquer sur le bouton « Virement ». Après quelques secondes, +si votre solde est suffisant et que la transaction est acceptée, un message de +confirmation apparaîtra et la transaction apparaîtra dans l'historique ci-dessous. + +.. image:: _static/img/create_transaction.png + :alt: Créer une transaction diff --git a/docs/index.rst b/docs/index.rst index c43207ca..f19dc61b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,8 +2,9 @@ Documentation de la Note Kfet 2020 ================================== -Bienvenue sur le Wiki de la NoteKfet2020. Ce wiki est plutot orienté vers un public de développeur, qui souhaitent -contribuer au développement, mais expliquent également aux plus curieux comment fonctionne la NoteKfet2020 sous le capot. +Bienvenue sur la documentation de la Note Kfet 2020. Cette documentation est à la fois +destinée aux adhérents BDE pour découvrir le fonctionnement de la note, mais aussi aux +respos info qui souhaitent découvrir comment fonctionne la note sous le capot. Des informations complémentaires sont également disponibles sur le `Wiki Crans `_. @@ -11,6 +12,7 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans :maxdepth: 2 :caption: Développement de la NK20 + getting_started apps/index documentation faq From a435460e29e2b321f1ef5ea608bbf0630fee853c Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 27 Mar 2021 23:47:12 +0100 Subject: [PATCH 09/14] Personal interface Signed-off-by: Yohann D'ANELLO --- docs/getting_started.rst | 70 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 1758ec10..77b83ab4 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -43,3 +43,73 @@ confirmation apparaîtra et la transaction apparaîtra dans l'historique ci-dess .. image:: _static/img/create_transaction.png :alt: Créer une transaction + + +Consulter ses données personnelles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +La Note Kfet sert non seulement à faire des transactions d'argent virtuel au sein +du BDE, mais aussi à permettre au BDE et à ses clubs de gérer leurs adhérents. +À cet effet, diverses informations personnelles sont collectées par la Note. + +Pour accéder à votre compte, une fois connecté⋅e, rendez-vous dans le menu en haut +à droite où se trouve votre pseudo. Votre solde est par ailleurs affiché à côté +de votre pseudo. + +L'interface est divisée en trois parties : + + * Vos données personnelles dans la partie de gauche + * Vos adhésions actives (si existantes) dans la partie haute + * Vos transactions récentes dans la partie basse + +Vous pouvez modifier vos données personnelles que la Note possède sur vous en +cliquant à tout moment sur le bouton « Modifier le profil ». Les informations +présentes sont : + + * Nom + * Prénom + * Pseudo + * Adresse e-mail + * Numéro de téléphone + * Section + * Département + * Promotion + * Adresse + * Élève/étudiant + * Inscription aux listes de diffusion du BDE, du BDA et du BDS + +Les trois premières informations sont obligatoires pour pouvoir vous contacter +et pouvoir tenir un registre d'adhérent. + +Le numéro de téléphone et l'adresse ne sont utilisés uniquement en cas d'urgence, +notamment en cas de WEI, et ne sont pas des champs obligatoires. De plus, +promotion, département et section ne sont utilisés sérieusement que en cas +de WEI, et ne sont pas utilisés sinon. + +La distinction élève/étudiant permet de distinguer les achats qui peuvent avoir +des prix différents pour les élèves et pour les étudiants, notamment en cas de +transferts d'argent, de WEI ou d'adhésion à certains clubs. + +Hormis le pseudo, toutes ces informations ont un caractère confidentiel qui les +rend privées et inaccessible aux utilisateurs. Les trésoriers BDE et les respos +info ont accès à toutes les informations (en cas de besoin uniquement, le cas +contraire est considéré comme de l'abus de droit qui est punissable), et les +trésoriers de club ont accès au nom et au prénom afin de faciliter l'association +à un nom de note. + +Dans la partie informations personnelles, il est également possible de modifier +la liste de ses alias (voir la section sur les alias), et de voir son propre +solde. Il est enfin possible de modifier l'image associée à la note, qui n'a +quant à elle pas de caractère privée puisqu'elle est affichée à chaque recherche +de nom de note. + +Le tableau des adhésions actives sur la partie du haut contient l'ensemble des +clubs auxquels vous êtes adhérent⋅es, avec les dates de début, de fin, votre +rôle au sein du club (généralement simple membre, mais cela peut également +être trésorier⋅ère par exemple) ainsi que la cotisation que vous avez éventuellement +payée au club. + +L'historique des transactions contient l'ensemble des transactions qui ont fait +intervenir votre note, triées par date décroissante. Il est possible en cliquant +sur le lien « Historique des transactions » d'avoir un meilleur aperçu, notamment +pour pouvoir filtrer des transactions. From 47968844ceb88bf83b8a21e8feb8c3f4563d5c59 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Thu, 15 Apr 2021 15:23:37 +0200 Subject: [PATCH 10/14] Install local development server Signed-off-by: Yohann D'ANELLO --- docs/index.rst | 1 + docs/install-dev.rst | 169 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 docs/install-dev.rst diff --git a/docs/index.rst b/docs/index.rst index f19dc61b..e74bf931 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,5 +15,6 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans getting_started apps/index documentation + install-dev faq external_services/index diff --git a/docs/install-dev.rst b/docs/install-dev.rst new file mode 100644 index 00000000..d3e616b2 --- /dev/null +++ b/docs/install-dev.rst @@ -0,0 +1,169 @@ +Installer la Note Kfet sur sa propre machine +============================================ + +Jamais en production tu ne coderas. + +Pour pouvoir développer sur la Note, il est donc essentiel de pouvoir installer +localement une instance de la note, avec une base de données vierge et indépendante +de celle utilisée en production. + +Toutes les dépendances Python seront installées dans un environnement virtuel, +afin de ne pas polluer sa machine de dépendances de la note. + + +Dépendances de base +------------------- + +On a néanmoins besoin de dépendances de base. + +Sur un Ubuntu/Debian : + +.. code:: bash + + $ sudo apt update + $ sudo apt install --no-install-recommends -y \ + python3-setuptools python3-venv python3-dev \ + texlive-xetex gettext libjs-bootstrap4 fonts-font-awesome git + +Pour Arch Linux : + +.. code:: bash + + $ sudo pacman -Sy python-setuptools python-virtualenv \ + texlive-most gettext git + +Bootstrap 4 n'est pas dans les paquets officiels de Arch Linux, mais peut-être +trouvé dans l'AUR grâce au paquet ``bootstrap``. Néanmoins, il faut pour l'instant +penser à créer un lien symbolique : +``sudo ln -s /usr/share/javascript/bootstrap /usr/share/javascript/bootstrap4``. + +Néanmoins, font-awesome n'est pas disponible dans les paquets Arch Linux, mais non +essentiel en développement (n'ajoute que les symbole à côté des boutons). + +À noter que bootstrap et texlive sont optionnels également selon vos besoins. + + +Téléchargement de la note +------------------------- + +On récupère le dépôt Git de la note : + +.. code:: bash + + $ git clone git@gitlab.crans.org:bde/nk20.git + Clonage dans 'nk20'... + remote: Enumerating objects: 203, done. + remote: Counting objects: 100% (203/203), done. + remote: Compressing objects: 100% (125/125), done. + remote: Total 13438 (delta 98), reused 170 (delta 74), pack-reused 13235 + Réception d\'objets: 100% (13438/13438), 9.39 Mio | 5.50 Mio/s, fait. + Résolution des deltas: 100% (9028/9028), fait. + $ cd nk20 + +.. note:: + + Pour apprendre à utiliser Git, on peut regarder la page wiki dédiée : + ``_, + ou bien regarder les séminaires Crans dédiés : + ``_ + + +Création d'un environnement virtuel Python +------------------------------------------ + +Une fois le projet cloné, on peut créer un environnement virtuel qui contiendra +toutes les dépendances Python. + +Pour cela, on peut simplement faire : + +.. code:: bash + + $ python3 -m venv env + $ source env/bin/activate + (env) $ + +À noter que ``source`` peut s'abbréger par ``.`` uniquement. + +Vous êtes donc dans un environnement virtuel Python. Pour installer les dépendances +de la note : + +.. code:: bash + + (env) $ pip install -r requirements.txt + +Les dépendances s'installeront ensuite dans le dossier ``env``. + +Au besoin, l'environnement peut être quitté en tapant ``deactivate`` et rejoint en +resourçant ``env/bin/activate``. + +Plus d'informations sur les environnements virtuels dans la documentation officielle +de Python : ``_. + + +Lancement de la note +-------------------- + +La partie Python (qui peut s'appliquer au développement de n'importe quel projet +Python) est terminée, on peut commencer à s'occuper de Django. + +Pour rappel, Django est un cadre de développement web open source en Python extrêment +puissant. Il a pour but de rendre le développement web simple et rapide. + +La documentation officielle de Django, complète, excellente et même en français, +peut être trouvée ici : ``_. + +Pour lancer un serveur de développement, on peut donc commencer par compiler les +traductions : + +.. code:: bash + + (env) $ ./manage.py compilemessages + +On applique les migrations de la base de données (de test, qui sera créée) : + +.. code:: bash + + (env) $ ./manage.py migrate + +On importe quelques données de base et utiles : + +.. code:: bash + + (env) $ ./manage.py loaddata initial + +.. note:: + + Ces données sont stockées au format JSON dans les différents fichiers + ``apps/{app}/fixtures/initial.json``. + +Enfin, on peut lancer le serveur web de développement : + +.. code:: bash + + (env) $ ./manage.py runserver + Watching for file changes with StatReloader + Performing system checks... + + System check identified no issues (0 silenced). + April 15, 2021 - 15:14:37 + Django version 2.2.20, using settings 'note_kfet.settings' + Starting development server at http://127.0.0.1:8000/ + Quit the server with CONTROL-C. + +Ouvrez votre navigateur, tapez ``_, enjoy :) + +.. note:: + + En lançant le serveur web de la sorte, Django va recevoir un signal dès lors qu'un + fichier a été modifié. Vous n'avez donc pas besoin de redémarrer le serveur après + chaque modification, sauf erreurs. + + Attention : ce serveur n'est destiné qu'à des fins de développement et n'est pas + optimisé pour recevoir des requêtes en parallèle ou être utilisé en production. + + +Créer un super-utilisateur +-------------------------- + +La commande ``./manage.py createsuperuser`` vous permettra de créer un super-utilisateur +initial. From e6f10ebdacf44e4e07ea07372bde801290553fab Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Thu, 15 Apr 2021 22:14:00 +0200 Subject: [PATCH 11/14] Install production server Signed-off-by: Yohann D'ANELLO --- .env_example | 1 - docs/index.rst | 3 +- docs/install.rst | 604 +++++++++++++++++++++++++++++++++++++++++++++++ entrypoint.sh | 2 +- 4 files changed, 607 insertions(+), 3 deletions(-) create mode 100644 docs/install.rst diff --git a/.env_example b/.env_example index eef94aac..7e1dbd3b 100644 --- a/.env_example +++ b/.env_example @@ -10,7 +10,6 @@ DJANGO_SECRET_KEY=CHANGE_ME DJANGO_SETTINGS_MODULE=note_kfet.settings CONTACT_EMAIL=tresorerie.bde@localhost NOTE_URL=localhost -DOMAIN=localhost # Config for mails. Only used in production NOTE_MAIL=notekfet@localhost diff --git a/docs/index.rst b/docs/index.rst index e74bf931..60ab5019 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,7 +14,8 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans getting_started apps/index - documentation install-dev + install + documentation faq external_services/index diff --git a/docs/install.rst b/docs/install.rst new file mode 100644 index 00000000..fa96596c --- /dev/null +++ b/docs/install.rst @@ -0,0 +1,604 @@ +Installer la Note Kfet en production +==================================== + +Cette page détaille comment installer la Note Kfet sur un serveur de production, +dédié uniquement à l'utilisation de la note. On supposera que le serveur tourne +avec un Debian Buster à jour. + + +Ajout des dépôts buster-backports +--------------------------------- + +Debian c'est bien, c'est stable, mais les paquets sont vite obsolètes. +En particulier, la version stable de Django dans la version stable de Debian est la +version 1.11, qui n'est plus maintenue par Django depuis déjà quelques mois. +Les versions stables de Django sont les versions 2.2 et 3.2, Debian Bullseye +utilisant la version 2.2. + +Afin de permettre à ses utilisateurs d'utiliser les dernières fonctionnalités de +certains paquets, Debian a créé une distribution particulière, appelée +``buster-backports``. Cette distribution contient des paquets de la distribution +à venir « ``testing`` » (``bullseye`` à l'heure où cette documentation est écrite) +recompilés et réadapter pour fonctionner avec les paquets de la distribution stable +(``buster``). Ce qui nous intéresse est de pouvoir récupérer Django 2.2 depuis +cette distribution, et avoir donc une version maintenue de Django. + +Plus de détails sur le wiki de Debian : ``_. + +Pour activer les backports, il suffit d'ajouter dans le fichier ``/etc/apt/sources.list`` : + +.. code:: + + deb $MIRROR/debian buster-backports main contrib + +où ``$MIRROR`` est votre miroir Debian favori, comme ``http://ftp.debian.org`` ou +``http://mirror.crans.org`` pour ce qui est de la version utilisée en production au BDE +sur les serveurs du Crans. Il suffit ensuite de faire un ``sudo apt update``. +Vérifiez que les paquets sont bien récupérés, en cherchant cette ligne : + +.. code:: + + Get:4 http://mirror.crans.org/debian buster-backports InRelease [46.7 kB] + +.. warning:: + + Avis aux futurs respos info : pensez à bien actualiser cette documentation lorsque + Debian Bullseye sera sorti. En particulier, il ne sera pas déconnant de continuer + à utiliser non pas buster-backports mais bullseye-backports pour installer la + note avec Django 3.2 et non Django 2.2. + + Bien sûr, vous testerez sur un serveur qui n'est pas celui utilisé avant :) + + +Installation des dépendances nécessaires +---------------------------------------- + +On s'efforce pour récupérer le plus possible de dépendances via les paquets Debian +plutôt que via ``pip`` afin de faciliter les mises à jour et avoir une installation +plus propre. On peut donc installer tout ce dont on a besoin, depuis buster-backports : + +.. code:: bash + + $ sudo apt update + $ sudo apt install -t buster-backports --no-install-recommends \ + gettext git ipython3 \ # Dépendances basiques + fonts-font-awesome libjs-bootstrap4 \ # Pour l'affichage web + python3-bs4 python3-django python3-django-crispy-forms python3-django-extensions \ + python3-django-filters python3-django-oauth-toolkit python3-django-polymorphic \ + python3-djangorestframework python3-memcache python3-phonenumbers \ + python3-pil python3-pip python3-psycopg2 python3-setuptools python3-venv \ + texlive-xetex memcached + +Ces paquets fournissent une bonne base sur laquelle travailler. + +Pour les mettre à jour, il suffit de faire ``sudo apt update`` puis ``sudo apt upgrade``. + + +Téléchargement de la note +------------------------- + +Tout comme en développement, on utilise directement le Gitlab du Crans pour récupérer +les sources. + +On suppose que l'on veut cloner le projet dans le dossier ``/var/www/note_kfet``. + +On clone donc le dépôt en tant que ``www-data`` : + +.. code:: bash + + $ sudo -u www-data git clone https://gitlab.crans.org/bde/nk20.git /var/www/note_kfet + +Par défaut, le dépôt est configuré pour suivre la branche ``master``, qui est la branche +stable, notamment installée sur ``_. Pour changer de branche, +notamment passer sur la branche ``beta`` sur un serveur de pré-production (un peu comme +``_), on peut faire : + +.. code:: bash + + $ sudo -u www-data git checkout beta + +.. warning:: + Avis aux successeurs : notamment pour le serveur de production derrière + ``_, il peut être intéressant de créer un paquet Python + de sorte à pouvoir installer la note en faisant directement + ``pip install git+https://gitlab.crans.org/bde/nk20.git``, et avoir ainsi une + installation plus propre en décourageant le développement en production. + + Voir par exemple comment le futur site d'inscription du Crans, Constellation, + gère cela : ``_. + + +Installation des dépendances Python non présentes dans les dépôts APT +--------------------------------------------------------------------- + +Même s'il est préférable d'installer les dépendances Python via les paquets APT, +tous ne sont malheureusement pas disponibles. + +On doit donc récupérer les dépendances manquantes via pip. + +Tout comme en développement, on préfère avoir un environnement virtuel dédié, +les ``sudo pip`` étant rarement compatibles avec les dépendances APT. + +On construit donc un environnement virtuel et on installe les dépendances manquantes +dans cet environnement : + +.. code:: bash + + $ cd /var/www/note_kfet + $ python3 -m venv env + $ . env/bin/activate + (env) $ pip install -r requirements.txt + +Normalement, seules les dépendances manquantes sont installées, les autres sont trouvées +globalement. + +Plus d'informations sur les environnements virtuels dans la documentation officielle +de Python : ``_. + + +Configuration de la note +------------------------ + +La configuration de la note se gère essentiellement via des paramètres d'environnement. +Ceux-ci sont lus via le fichier ``.env`` s'il existe, qui doit être placé à la racine +du projet cloné (donc dans ``/var/www/note_kfet/.env``). Un fichier d'exemple est situé +dans le fichier ``.env_example``, on peut donc faire un ``sudo cp .env_example .env``. + +Attention aux permissions : le fichier doit être lu par ``www-data`` et écrit (rien +n'empêche de l'écrire en tant que root). + +Le contenu de ce fichier : + +.. code:: env + + DJANGO_APP_STAGE=prod + DJANGO_DEV_STORE_METHOD=sqlite + DJANGO_DB_HOST=localhost + DJANGO_DB_NAME=note_db + DJANGO_DB_USER=note + DJANGO_DB_PASSWORD=CHANGE_ME + DJANGO_DB_PORT= + DJANGO_SECRET_KEY=CHANGE_ME + DJANGO_SETTINGS_MODULE=note_kfet.settings + CONTACT_EMAIL=tresorerie.bde@localhost + NOTE_URL=localhost + NOTE_MAIL=notekfet@localhost + EMAIL_HOST=smtp.localhost + EMAIL_PORT=25 + EMAIL_USER=notekfet@localhost + EMAIL_PASSWORD=CHANGE_ME + WIKI_USER=NoteKfet2020 + WIKI_PASSWORD= + +Le paramètre ``DJANGO_APP_STAGE`` accepte comme valeur ``dev`` ou ``prod``. +En développement, les mails ne sont pas envoyés mais affichés dans les logs du +serveur. Les messages d'erreur sont directement affichés au lieu d'être envoyés +par mail. Les paramètres d'envoi de mail n'ont donc aucun effet. En développement, +il est également possible de choisir si l'on souhaite une base de données sqlite +(par défaut) ou si on veut se connecter à une base de données PostgreSQL (rentrer +``postgres`` dans ``DJANGO_DEV_STORE_METHOD``), auquel cas les paramètres de +base de données seront interprétés. + +Les champs ``DJANGO_DB_`` sont relatifs à la connexion à la base de données PostgreSQL. + +Le champ ``DJANGO_SECRET_KEY`` est utilisé pour la protection CSRF (voir la documentation +``_ pour plus de détails). Il s'agit d'une +clé sous forme de chaîne de caractère suffisamment longue (64 caractères paraît bien) +qui n'est pas à transmettre et qui évite d'autres sites malveillants de faire des requêtes +directement sur la note. + +Le champ ``CONTACT_EMAIL`` correspond l'adresse mail que les adhérent⋅e⋅s peuvent contacter +en cas de problème. C'est là où le champ ``Nous contacter`` redirigera. + +Le champ ``NOTE_URL`` correspond au nom de domaine autorisé à accéder au site. C'est également +le nom de domaine qui sera utilisé dans l'envoi de mails pour générer des liens. En +production, cela vaut ``note.crans.org``. + +Le champ ``NOTE_MAIL`` correspond au champ expéditeur des mails envoyés, que ce soit +pour les rapports quotidiens / hebdomadaires / mensuels ou les mails d'erreur. +En production, ce champ vaut ``notekfet2020@crans.org``. + +Les champs ``EMAIL_`` sont relatifs à la connexion au serveur SMTP pour l'envoi de mails. +En production, ``EMAIL_HOST`` vaut ``smtp.crans.org``, ``EMAIL_PORT`` vaut 25 (on reste sur +le réseau interne du Crans) et ``EMAIL_USER`` et ``EMAIL_PASSWORD`` sont vides (ce qui est +valide car la note est sur le réseau du Crans, qui est déjà pré-autorisé à envoyer des mails). + +Les champs ``WIKI_USER`` et ``WIKI_PASSWORD`` servent à s'authentifier sur le compte Wiki +Crans ``NoteKfet2020``, pour notamment exporter automatiquement la liste des activités sur +le wiki. + +Pour configurer la note, il est également possible de créer un fichier +``note_kfet/settings/secrets.py`` qui redéfinit certains paramètres, notamment la +liste des administrateurs ou certaines applications optionnelles, ou encore certains +éventuels mots de passe. + +En production, ce fichier contient : + +.. code:: python + + OPTIONAL_APPS = [ + 'cas_server', + # 'debug_toolbar' + ] + + # When a server error occured, send an email to these addresses + ADMINS = ( + ('Note Kfet', 'notekfet2020@lists.crans.org'), + ) + + +Configuration des tâches récurrentes +------------------------------------ + +Certaines opérations se font périodiquement, comme le rappel hebdomadaire pour les +personnes en négatif. On utilise pour cela un cron. Il suffit pour cela de copier +le fichier ``note.cron`` vers ``/etc/cron.d/note``, en veillant à ce qu'il appartienne +bien à ``root``. + +Ce fichier contient l'ensemble des tâches récurrentes associées à la note. +Une page de documentation dédiée fera bientôt son apparition. + +Sur un serveur de pré-production, on peut ne pas souhaiter activer ces tâches récurrentes. + + +Installation de la base de données PostgreSQL +--------------------------------------------- + +En production, on utilise une vraie base de données PostgreSQL et non un fichier +sqlite. Beaucoup plus facile pour faire éventuellement des requêtes (bien que pas +adapté pour Django) mais surtout bien mieux optimisé pour un serveur de production. + +Pour installer la base de données, on commence par installer PostgreSQL : + +.. code:: bash + + $ sudo apt install --no-install-recommends postgresql postgresql-contrib + +PostgreSQL est désormais installé et lancé. On crée un compte ``note``, avec un +bon mot de passe (le même que donné à Django) : + +.. code:: bash + + $ sudo -u postgres createuser -P note + +Et on crée enfin une base de données nommée ``note_db`` appartenant à ``note``. + +.. code:: bash + + $ sudo -u postgres createdb note_db -O note + +La base de données est désormais prête à être utilisée. + + +Finir l'installation de Django +------------------------------ + +On commence par construire la base de données à partir des migrations enregistrées : + +.. code:: bash + + $ ./manage.py migrate + +On doit compiler les traductions (pour pouvoir les lire plus vite par la suite) : + +.. code:: bash + + $ ./manage.py compilemessages + +Les fichiers statiques (fiches de style, fichiers Javascript, images, ...) doivent +être exportées dans le dossier ``static`` : + +.. code:: bash + + $ ./manage.py collectstatic + +Et on peut enfin importer certaines données de base : + +.. code:: bash + + $ ./manage.py loaddata initial + +La note est désormais prête à être utilisée. Ne reste qu'à configurer un serveur Web. + + +Configuration de UWSGI +---------------------- + +On dispose d'une instance de la note fonctionnelle et bien configurée. Cependant, nous +n'avons pas encore de socket permettant d'intéragir avec le serveur. C'est le travail +de UWSGI. + +On rappelle que la commande ``./manage.py runserver`` n'est pas conçue pour des serveurs +de production, contrairement à UWSGI. + +On commence par installer UWSGI : + +.. code:: bash + + $ sudo apt install --no-install-recommends uwsgi uwsgi-plugin-python3 + +On place ensuite le fichier de configuration UWSGI dans les applications installées. +Un fichier de configuration est présent à la racine du projet, contenant : + +.. code:: ini + + [uwsgi] + uid = www-data + gid = www-data + # Django-related settings + # the base directory (full path) + chdir = /var/www/note_kfet + # the virtualenv (full path) + home = /var/www/note_kfet/env + wsgi-file = /var/www/note_kfet/note_kfet/wsgi.py + plugin = python3 + # process-related settings + # master + master = true + # maximum number of worker processes + processes = 10 + # the socket (use the full path to be safe + socket = /var/www/note_kfet/note_kfet.sock + # ... with appropriate permissions - may be needed + chmod-socket = 664 + # clear environment on exit + vacuum = true + # Touch reload + touch-reload = /var/www/note_kfet/note_kfet/settings/__init__.py + # Enable threads + enable-threads = true + +Il suffit donc de créer le lien symbolique : + +.. code:: bash + + $ sudo ln -s /var/www/note_kfet/uwsgi_note.ini /etc/uwsgi/apps-enabled/uwsgi_note.ini + +On peut désormais relancer UWSGI : + +.. code:: bash + + $ sudo systemctl restart uwsgi + + +Configuration de NGINX +---------------------- + +Nous avons désormais un socket qui nous permet de faire des connexions au serveur web, +placé dans ``/var/www/note_kfet/note_kfet.sock``. Cependant, ce socket n'est pas accessible +au reste du monde, et ne doit pas l'être : on veut un serveur Web Nginx qui s'occupe des +connexions entrantes et qui peut servir de reverse-proxy, notamment utile pour desservir +les fichiers statiques ou d'autres sites sur le même serveur. + +On commence donc par installer Nginx : + +.. code:: bash + + $ sudo apt install nginx + +On place ensuite dans ``/etc/nginx/sites-available/nginx_note.conf`` le fichier de +configuration Nginx qui va bien, en remplaçant ``note.crans.org`` par ce qu'il faut : + +.. code:: + + # the upstream component nginx needs to connect to + upstream note { + server unix:///var/www/note_kfet/note_kfet.sock; # file socket + } + + # Redirect HTTP to nk20 HTTPS + server { + listen 80 default_server; + listen [::]:80 default_server; + + location / { + return 301 https://note.crans.org$request_uri; + } + } + + # Redirect all HTTPS to nk20 HTTPS + server { + listen 443 ssl default_server; + listen [::]:443 ssl default_server; + + location / { + return 301 https://note.crans.org$request_uri; + } + + ssl_certificate /etc/letsencrypt/live/note.crans.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/note.crans.org/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + } + + # configuration of the server + server { + listen 443 ssl; + listen [::]:443 ssl; + + # the port your site will be served on + # the domain name it will serve for + server_name note.crans.org; + charset utf-8; + + # max upload size + client_max_body_size 75M; + + # Django media + location /media { + alias /var/www/note_kfet/media; + } + + location /static { + alias /var/www/note_kfet/static; + } + + location /doc { + alias /var/www/documentation; + } + + # Finally, send all non-media requests to the Django server. + location / { + uwsgi_pass note; + include /etc/nginx/uwsgi_params; + } + + ssl_certificate /etc/letsencrypt/live/note.crans.org/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/note.crans.org/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + } + +On peut enfin activer le site : + +.. code:: + + $ sudo ln -s /etc/nginx/sites-available/nginx_note.conf /etc/nginx/sites-enabled/nginx_note.conf + +Si on peut se dire que recharger Nginx suffira, il n'en est rien : voir paragraphe suivant. + + +Génération d'un certificat SSL +------------------------------ + +Nginx va essayer de lire les certificats présents dans +``/etc/letsencrypt/live/note.crans.org/``, mais ce dossier n'existe pas encore. + +On doit donc générer un certificat pour permettre les connexions HTTPS. Cela est permis +grâce à ``certbot``, qu'on s'empresse d'installer : + +.. code:: bash + + $ sudo apt install certbot python3-certbot-nginx + +Le plugin pour nginx permet de certifier que le serveur a bien les droits pour +``note.crans.org`` grâce à Nginx, le BDE n'ayant a priori aucune raison de pouvoir +gérer le nom de domaine ``crans.org``. + +On place dans le dossier ``/etc/letsencrypt/conf.d`` (qu'on crée au besoin) un fichier +nommé ``nk20.ini`` : + +.. code:: ini + + # To generate the certificate, please use the following command + # certbot --config /etc/letsencrypt/conf.d/nk20.ini certonly + + # Use a 4096 bit RSA key instead of 2048 + rsa-key-size = 4096 + + # Always use the staging/testing server + # server = https://acme-staging.api.letsencrypt.org/directory + + # Uncomment and update to register with the specified e-mail address + email = notekfet2020@lists.crans.org + + # Uncomment to use a text interface instead of ncurses + text = True + + # Use Nginx challenge + authenticator = nginx + +En exécutant ``certbot``, il va lire les fichiers de configuration Nginx et générer les +certificats qu'il faut en créant un point d'entrée pour le serveur. + +Il faut néanmoins que la configuration soit valide. Les certificats n'existant pas encore, +la configuration nginx est donc pour l'instant invalide. Il faut alors temporairement +commenter les parties de la configuration qui traitent des certificats et relancer ``nginx`` +(``sudo systemctl reload nginx``). + +On peut ensuite exécuter ``certbot`` : + +.. code:: bash + + $ certbot --config /etc/letsencrypt/conf.d/nk20.ini certonly + +L'instruction ``certonly`` indique à ``certbot`` qu'il se contente de générer le certificat, +sans chercher à l'installer. Si tout s'est bien passé, l'installation se fait simplement +en décommentant les lignes préalablement commentées. + +Un certificat généré de la sorte expire au bout de 3 mois. Néanmoins, certbot tourne +régulièrement pour renouveler les certificats actifs automatiquement. Il n'y a donc +plus rien à faire. + +Après avoir rechargé la configuration de ``Nginx``, rendez-vous sur +``_ (ou votre site) pour vérifier que tout fonctionne correctement :) + + +Mettre à jour la note +--------------------- + +Pour mettre à jour la note, il suffit a priori, après avoir mis à jour les paquets APT, +de faire un ``git pull`` dans le dossier ``/var/www/note_kfet``. + +Les éventuelles nouvelles migrations de la base de données doivent être appliquées : + +.. code:: bash + + $ ./manage.py migrate + +Les nouvelles traductions compilées : + +.. code:: bash + + $ ./manage.py compilemessages + +Les nouveaux fichiers statiques collectés : + +.. code:: bash + + $ ./manage.py collectstatic + +Et enfin les nouvelles fixtures installées : + +.. code:: bash + + $ ./manage.py loaddata initial + +Une fois tout cela fait, il suffit de relancer le serveur UWSGI : + +.. code:: bash + + $ sudo systemctl restart uwsgi + + +Avec Ansible +------------ + +Tout ce travail peut sembler très laborieux et peut mériter d'être automatisé. +Toutefois, il est essentiel de bien comprendre comment chaque étape de l'installation +fonctionne. + +Un playbook Ansible a été écrit permettant de réaliser toutes les tâches décrites ci-dessus. +Il se trouve dans le dossier ``ansible``. + +Ansible s'installe sur votre propre machine (et non sur le serveur) en installant simplement +le paquet ``ansible``. + +Pour déployer la note sur un serveur vierge, commencez par copier le fichier ``hosts_example`` +en le nommant ``hosts``. Ajoutez votre propre serveur, dans la section correspondante. + +Dans le dossier ``host_vars``, créez un fichier dont le nom est l'adresse du serveur, avec +l'extension ``.yml``. + +Dans ce fichier, remplissez : + +.. code:: yaml + + --- + note: + server_name: note.crans.org + git_branch: master + cron_enabled: true + email: notekfet2020@lists.crans.org + + +en adaptant à votre configuration. + +Il suffit ensuite de lancer ``./base.yml -l urldevotreserveur``. + +Pour une première installation, vous devrez renseigner le mot de passe de la base de données +pour créer le compte ``note``. Vous devrez ensuite également refaire quelques ajustements +pour générer le certificat, voir la partie ``certbot``. La configuration du fichier +``.env`` sera également à faire à la main. + +Cependant, pour mettre à jour, lancer cette commande suffit. diff --git a/entrypoint.sh b/entrypoint.sh index f04bf16d..1a5341c1 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -5,7 +5,7 @@ if [ -z ${NOTE_URL+x} ]; then echo "Warning: your env files are not configurated." else - sed -i -e "s/example.com/$DOMAIN/g" /var/www/note_kfet/apps/member/fixtures/initial.json + sed -i -e "s/example.com/$NOTE_URL/g" /var/www/note_kfet/apps/member/fixtures/initial.json sed -i -e "s/localhost/$NOTE_URL/g" /var/www/note_kfet/note_kfet/fixtures/initial.json sed -i -e "s/\"\.\*\"/\"https?:\/\/$NOTE_URL\/.*\"/g" /var/www/note_kfet/note_kfet/fixtures/cas.json sed -i -e "s/REPLACEME/La Note Kfet \\\\ud83c\\\\udf7b/g" /var/www/note_kfet/note_kfet/fixtures/cas.json From 21dbc536158f9836ed21f7cbd97e5b90b81cc914 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Thu, 22 Apr 2021 23:17:58 +0200 Subject: [PATCH 12/14] Spam negative users if they have less than 0 euro Signed-off-by: Yohann D'ANELLO --- note.cron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/note.cron b/note.cron index d1814250..90deac08 100644 --- a/note.cron +++ b/note.cron @@ -16,7 +16,7 @@ MAILTO=notekfet2020@lists.crans.org # Mettre à jour le wiki (modification sans (dé)validation, activités passées) 30 5 * * * root cd /var/www/note_kfet && env/bin/python manage.py refresh_activities --raw --human --comment refresh --wiki -v 0 # Spammer les gens en négatif - 00 5 * * 2 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --spam -v 0 + 00 5 * * 2 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --spam --negative-amount 0 -v 0 # Envoyer le rapport mensuel aux trésoriers et respos info 00 8 6 * * root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --report --add-years 1 -v 0 # Envoyer les rapports aux gens From 36cfcd533f1b1b1c52ebbefd9e772384b592da1f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Thu, 22 Apr 2021 23:34:44 +0200 Subject: [PATCH 13/14] Documentation on scripts Signed-off-by: Yohann D'ANELLO --- apps/scripts | 2 +- docs/index.rst | 1 + docs/scripts.rst | 308 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 310 insertions(+), 1 deletion(-) create mode 100644 docs/scripts.rst diff --git a/apps/scripts b/apps/scripts index cf8b05d2..0c7070ae 160000 --- a/apps/scripts +++ b/apps/scripts @@ -1 +1 @@ -Subproject commit cf8b05d20a431fca634aff22f82777317c22c082 +Subproject commit 0c7070aea177e12fae099488e2ea6f8146b97e4d diff --git a/docs/index.rst b/docs/index.rst index 60ab5019..2e7a2e2c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -17,5 +17,6 @@ Des informations complémentaires sont également disponibles sur le `Wiki Crans install-dev install documentation + scripts faq external_services/index diff --git a/docs/scripts.rst b/docs/scripts.rst new file mode 100644 index 00000000..4e273b6d --- /dev/null +++ b/docs/scripts.rst @@ -0,0 +1,308 @@ +Les scripts de la Note Kfet 2020 +================================ + +Django permet la création de scripts permettant l'interaction en ligne de commande +avec le site. Les scripts sont gérés dans un projet à part : +`nk20-scripts `_. + +Il s'agit d'un module Python à part contenant tous les scripts interagissant avec la note. +Pour l'installer, il suffit d'importer le sous module (``git submodule init apps/scripts``) +ou bien d'avoir ajouté l'option ``--recursive`` lorsque le dépôt a été cloné. Il faut +ensuite ajouter le module au tableau ``INSTALLED_APPS`` dans les paramètres. + + +Scripts Python +############## + +Structure d'un script +--------------------- + +Un script est un fichier Python placé dans ``apps/scripts/management/commands``. Le nom +de fichier sans l'extension ``.py`` caractérise le nom du script. On supposera dans la suite +qu'on aura créé le script ``toto.py``. Pour lancer le script, il suffira de lancer +``./manage.py toto``. Django se charge de trouver l'emplacement du script. Un simple +``./manage.py`` affichera par ailleurs la liste des scripts par application. + +Ce fichier Python doit contenir une classe nommée ``Command`` héritant de +``django.core.management.base.BaseCommand``. + +Il suffit enfin de créer une fonction ``handle(self, *args, **options) -> None``. +C'est cette fonction qui servira à l'exécution du script. ``options`` contient +l'ensemble des options transmises. + +Pour gérer les options, créez une fonction ``add_arguments(self, parser)``. +``parser`` vous permet de gérer vos arguments. Plus d'informations dans la documentation +du module ``argparse`` de Python : https://docs.python.org/fr/3/library/argparse.html + +.. warning:: + + Bonne pratique : si votre script doit écrire sur la base de données, pensez à + ajouter un décorateur ``@transaction.atomic`` (du module ``django.db``) sur + votre fonction ``handle``. Cela aura pour effet de ne pas effectuer les modifications + indiquées en cas d'erreur dans le script. Cela évite de vous retrouver avec une base + de données dans un état instable en cas d'erreur dans le script, ou en développement + (sur un serveur de développement bien sûr). + +.. warning:: + + Par défaut, chaque commande dispose d'un certain nombre d'options, dont ``--help`` qui + affiche l'aide et les options disponibles, et ``--verbosity {0, 1, 2, 3}`` qui permet + de contrôler la verbosité du script. Il est important d'en tenir compte, en particulier + un niveau de verbosité nul ne devrait afficher rien d'autre que des erreurs. + +Plus d'informations dans la documentation officielle : +https://docs.djangoproject.com/fr/2.2/howto/custom-management-commands/ + + +Anonymisation de données +------------------------ + +Le script s'appelle ``anonymize_data``. + +Ce script était utilisé lors de la beta de la Note Kfet 2020, afin d'anonymiser certaines +données personnelles et limiter le risque de fuites de données. Ainsi, les noms, prénoms, +adresses électroniques, numéros de téléphone et adresses étaient normalisées. + +Ce script étant dangereux, l'option ``--force`` est requise. + + +Vérification de l'intégrité des données +--------------------------------------- + +Le script s'appelle ``check_consistency``. + +Son but est de s'assurer que la somme des montants de toutes les notes vaut bien zéro, +et que pour chaque note, la somme des transactions donne bien le solde de la note. + +En cas de problème, les erreurs détectées sont affichées. + +Le script prend plusieurs options : + +* ``--sum-all, -s`` : vérifie si la somme des notes vaut bien 0 +* ``--check-all, -a`` : vérifie si le solde de toutes les notes est cohérent +* ``--check, -c`` : si l'option précédente n'est pas présente, indique les identifiants + des notes à vérifier +* ``--fix, -f`` : Rétablit le solde des notes à la somme des transactions. À n'utiliser + qu'après avoir identifié le problème. + +Ce script est appelé tous les jours à 4h du matin avec les options ``--sum-all --check-all``, +et en cas d'erreur un mail est envoyé. + + +Compilation des messages JavaScript +----------------------------------- + +Le script s'appelle ``compilejsmessages``. + +Django gère nativement la traduction des chaînes de caractères, avec notamment les scripts +``makemessages`` et ``compilemessages``. Django permet également de gérer la traduction +dans les fichiers statiques JavaScript, comme l'indique la documentation officielle : +https://docs.djangoproject.com/fr/2.2/topics/i18n/translation/#internationalization-in-javascript-code + +Comme l'indique cette documentation, cela revient à ajouter un fichier Javascript contenant +l'ensemble des traductions et le navigateur s'occupe de récupérer les bonnes traductions. + +Cependant, la façon standard de gérer cela est d'avoir une vue dédiée qui générera le bon +fichier Javascript. Les traductions ne changeant pas souvent (à chaque mise à jour +uniquement), il n'est pas essentiel de les recompiler à chaque chargement de page. + +Le protocole choisi est donc de générer des fichiers statiques, qui seront donc directement +servis par Nginx (et éventuellement mis en cache par le client) et non recalculés à chaque +fois. On optimise donc les requêtes. + +Pour rappel, pour générer les fichiers de traduction Javascript : + +.. code:: bash + + ./manage.py makemessages -i env -e js -d djangojs + +Et on peut donc appeler ce script ``compilejsmessages`` pour créer les fichiers Javascript +correspondant et le placer dans le dossier des fichiers statiques. + + +Extraction des listes de diffusion +---------------------------------- + +Le script s'appelle ``extract_ml_registrations``. + +Il a pour but d'extraire une liste d'adresses mail pour les inclure directement dans les listes +de diffusion utiles. + +Il prend 2 options : + +* ``--type``, qui prend en argument ``members`` (défaut), ``clubs``, ``events``, ``art``, + ``sport``, qui permet respectivement de sortir la liste des adresses mails des adhérents + actuels (pour la liste ``adherents.bde@lists.crans.org), des clubs (pour + ``clubs@lists.crans.org``), des personnes à abonner à ``evenements@lists.crans.org``, + à ``all.bda@lists.crans.org`` et enfin à ``bds@lists.crans.org``. +* ``--lang``, qui prend en argument ``fr`` ou ``en``. N'est utile que pour la ML événements, + qui a pour projet d'être disponible à la fois en anglais et en français. + +Le script sort sur la sortie standard la liste des adresses mails à inscrire. + +Attention : il y a parfois certains cas particuliers à prendre en compte, il n'est +malheureusement pas aussi simple que de simplement supposer que ces listes sont exhaustives. + +À terme, il pourrait être envisageable de synchroniser automatiquement les listes avec la note. + + +Suppression d'un utilisateur +---------------------------- + +Le script s'appelle ``force_delete_user``. + +.. caution:: + + Ce script est dangereux. À n'utiliser qu'avec de très grosses pincettes si vous savez + ce que vous faites. Seul cas d'usage pour l'instant recensé : supprimer des comptes en + double qui se sont malencontreusement retrouvés validés pour raison de Sogé et de mauvaise + communication au sein des trésorier⋅ère⋅s. + + Il n'est certainement pas prévu de supprimer des vrais comptes existants via ce script. + On ne supprime pas l'historique. Si jamais quelqu'un demanderait à supprimer son compte, + on se contente de l'anonymiser, et non de le supprimer. + +Ce script est utile lorsqu'il faut supprimer un compte créer par erreur. Tant que la validation +n'est pas faite, il suffit en général de cliquer sur le bouton « Supprimer le compte » sur +l'interface de validation. Cela supprimera l'utilisateur et le profil associé, sans toucher +à une quelconque note puisqu'elle ne sera pas créée. + +Ce script supprime donc un compte ainsi que toutes les données associées (note, alias, +transactions). Il n'est donc pas à prendre à la légère, et vous devez savoir ce que vous +faites. + +Il prend en arguments les identifiants numériques ou un alias de la ou des personnes à +supprimer. + +Sans rien ajouter, il affichera uniquement les éléments qui seront supprimés. + +Avec l'option ``--force``, il commencera à créer une transaction dans la base de données +pour supprimer tout ce qu'il faut, et une validation manuelle sera requise pour confirmer +la suppression. L'option ``--doit`` évite cette confirmation manuelle. +**Vous n'avez jamais à utiliser cette option en théorie.** + +À la fin du processus, un mail est envoyé aux administrateurs pour les prévenir des +élements supprimés. + +Des données réelles jamais tu ne supprimeras. + + +Importation de la Note Kfet 2015 +-------------------------------- + +Les scripts commençant par ``import_`` sont destinés à l'import des données depuis +la Note Kfet 2015. + +.. warning:: + + TODO: Pour la postérité et la conservation d'archives, documenter comment l'import + s'est déroulé. + + +Ajouter un super-utilisateur +---------------------------- + +Le script s'appelle ``make_su``. + +Il prend en argument un pseudo. + +Avec l'option ``--SUPER, -S``, la personne avec ce pseudo devient super-utilisateur, +et obtiens donc les pleins pouvoirs sur la note. À ne donner qu'aux respos info. + +Avec l'option ``--STAFF, -s``, la personne avec ce pseudo acquiert le statut équipe, +et obtiens l'accès à django-admin. À ne donner qu'aux respos info. + + +Rafraîchissement des activités +------------------------------ + +Le script s'appelle ``refresh_activities``. + +Il a pour but de mettre à jour le Wiki du Crans automatiquement en ajoutant les +activités de la Note Kfet sur le calendrier, à savoir les pages +``_ et +``_. + +Il prend diverses options : + +* ``--human, -H`` : met à jour la version lisible de la page des activités +* ``--raw, -r`` : met à jour la version brute de la page des activités, interprétable + par le calendrier +* ``--comment, -c`` : définit le commentaire à ajouter à la modification du wiki +* ``--stdout, -o`` : affiche la page sur la sortie standard +* ``--wiki, -w`` : applique effectivement les modifications sur le wiki + +Ce script est appelé tous les jours à 5h30 avec les options +``--raw --human --comment refresh --wiki``. + + +Rafraîchissement des boutons mis en avant +----------------------------------------- + +Le script s'appelle ``refresh_highlighted_buttons``. + +Il permet d'actualiser la liste des boutons mis en avant sur la page de consommations +qui servent de raccourcis. + +Ce script récupère la liste des 10 boutons les plus cliqués les 30 derniers jours et +les met en avant. + + +Envoi des rappels de négatif +---------------------------- + +Le script s'appelle ``send_mail_to_negative_balances``. + +Il sert à rappeler aux adhérent⋅e⋅s et clubs en négatif qu'ils le sont, mais également +à envoyer aux trésorier⋅ère⋅s et respos info la liste des adhérent⋅e⋅s en négatif. + +Il prend les options suivantes : + +* ``--spam, -s`` : envoie à chaque adhérent⋅e en négatif un rappel par mail pour recharger +* ``--report, -r`` : envoie le rapport aux trésorier⋅ère⋅s et respos info +* ``--negative-amount,-n`` : définit le solde maximal en-dessous duquel les notes + apparaitront sur le rapport / seront spammées +* ``--add-years, -y`` : ajoute également les adhérent⋅e⋅s des ``n`` dernières années + +Ce script est appelé tous les mardis à 5h00 pour spammer les utilisateur⋅rice⋅s en +négatif et tous les 6 du mois pour envoyer le rapport des notes d'adhérent⋅e⋅s ou de +vieux/vieilles adhérent⋅e⋅s de moins d'un an sous -10 €. + + +Envoi des rapports +------------------ + +Le script s'appelle ``send_reports``. + +Les utilisateurs ont la possibilité de recevoir sur demande un rapport à la fréquence de +leur choix (en jours) des transactions effectuées sur leur note. + +Le script prend 2 options : + +* ``--notes, -n`` : sélectionne les notes auxquelles envoyer un rapport. Si non spécifié, + envoie un mail à toutes les notes demandant un rapport. +* ``--debug, -d`` : affiche les rapports dans la sortie standard sans les envoyer par mail. + Les dates de dernier rapport ne sont pas actualisées. + +Ce script est appelé tous les jours à 6h55. + + +Scripts bash +############ + +À quelques fins utiles, certains scripts bash sont également présents, dans le dossier +``scripts/shell``. + + +Sauvegardes de la base de données +--------------------------------- + +Le script ``backup_db`` permet de faire une sauvegarde de la base de données PostgreSQL +et l'envoie sur ``club-bde@zamok.crans.org``. Le script doit être lancé en tant que root. + + +Tabularasa +---------- + +Ce script n'a un intérêt qu'en développement, afin de détruire la base de données et la +recréer en appliquant les migrations et en chargeant les données initiales. From 97375ef6c07525645d1fa7b745f0b84e92dbd6fd Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Apr 2021 16:56:31 +0200 Subject: [PATCH 14/14] Copy production database to development website Signed-off-by: Yohann D'ANELLO --- docs/install.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/install.rst b/docs/install.rst index fa96596c..09d1e539 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -602,3 +602,39 @@ pour générer le certificat, voir la partie ``certbot``. La configuration du fi ``.env`` sera également à faire à la main. Cependant, pour mettre à jour, lancer cette commande suffit. + + +Copier une base de données +-------------------------- + +On peut vouloir périodiquement copier la base de données de production vers le serveur +de développement, afin de travailler avec des données à jour. + +On aura besoin de pouvoir accéder aux deux bases de données. On commence donc si ce n'est +pas déjà fait par créer un utilisateur sur les deux serveurs : + +.. code:: bash + + ynerant@bde-note:~$ sudo -u postgres createuser -l ynerant + +On réinitialise **sur le serveur de développement** la base de données présente, en +éteignant tout d'abord le serveur Web : + +.. code:: bash + + ynerant@bde-note-dev:~$ sudo systemctl stop uwsgi + ynerant@bde-note-dev:~$ sudo -u postgres dropdb note_db + ynerant@bde-note-dev:~$ sudo -u postgres createdb -O note note_db + +Et on copie enfin la base de données, en une seule ligne via SSH : + +.. code:: bash + + ynerant@bde-note:~$ pg_dump note_db | ssh note-dev.crans.org "psql note_db -f -" + +On peut enfin redémarrer le serveur Web. Les données ont bien été copiées. + +.. caution:: + + On ne copiera **jamais** des données d'adhérent⋅e⋅s sur une machine personnelle. + Ce type d'opération doit s'effectuer impérativement entre des serveurs du BDE.