From 93f504e7ccf545d57a8f7075035f0b4a652f8759 Mon Sep 17 00:00:00 2001 From: pporcheret Date: Mon, 26 Oct 2026 00:32:51 +0100 Subject: [PATCH] V1 --- ALFRED.txt | 346 +++++++++++++++++- ALFRED.txt.old | 22 ++ alfred/app/cache/weather_outfit_cache.json | 29 ++ ...d71808b567e9fc66dbd8459de0c4a9853d111a.jpg | Bin 0 -> 26390 bytes 4 files changed, 388 insertions(+), 9 deletions(-) create mode 100644 ALFRED.txt.old create mode 100644 alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg diff --git a/ALFRED.txt b/ALFRED.txt index ce3c9de..252949c 100644 --- a/ALFRED.txt +++ b/ALFRED.txt @@ -1,18 +1,346 @@ -curl -s http://127.0.0.1:54321/api/audio/settings -> status du micro, hp, volumes... +ALFRED.txt +========== +Aide-mémoire technique du projet ALFRED +Version : 26/10/2026 +À adapter selon les chemins et les versions réellement installés. -output: +====================================================================== +1. PRÉSENTATION RAPIDE +====================================================================== -{"mic_gain":74,"mic_muted":true,"speaker_muted":false,"volume":80} +Alfred = assistant domestique local sur mini-PC MINISFORUM Mars MC560. +- Interface Web : Python / Flask + Socket.IO, port 54321 +- Réveil vocal ("Alfred") : Vosk, moteur vosk_keyword +- Reconnaissance des phrases : STT (Vosk dans la chaîne vocale) +- Agent de conversation : Hermes, connecté au serveur IA Ollama +- Synthèse vocale : Piper / Wyoming selon la configuration +- Domotique : Home Assistant (REST pour vues ; MCP via Hermes) +- Images : ComfyUI, utilisé par Hermes et par le module météo +- Vision : webcam locale / OpenCV / YOLO et MCP reconnaissance faciale +Une commande vocale de météo ou d'agenda peut être traitée directement +par Alfred, sans passer par Hermes. Les autres questions passent par Hermes. -curl -s http://127.0.0.1:54321/api/wake/status -> status de Vosk (stt pour le key world "alfred") +====================================================================== +2. SERVICE ET INTERFACE ALFRED +====================================================================== -output : +# État du service +sudo systemctl status alfred --no-pager -{"engine":"vosk_keyword","error":null,"last_score":1.0,"paused":true,"running":true,"word":"alfred"} +# Redémarrer après changement de configuration ou de code +sudo systemctl restart alfred +# Arrêter / démarrer +sudo systemctl stop alfred +sudo systemctl start alfred +# Logs en direct +journalctl -u alfred -f + +# Derniers logs +journalctl -u alfred -n 100 --no-pager + +# Afficher la configuration du service systemd +sudo systemctl cat alfred + +# Vérifier le port Flask +sudo ss -lntp | grep ':54321' + +Interface locale : http://127.0.0.1:54321 +Interface réseau : http://:54321 +Recharger Chromium sans cache : Ctrl+F5 + +# État d'Alfred (mode, dernière réponse, wake, backend TTS, etc.) +curl -sS http://127.0.0.1:54321/api/state | python3 -m json.tool + +====================================================================== +3. MICROPHONE, HAUT-PARLEUR ET ÉCOUTE +====================================================================== + +# État des réglages audio +curl -sS http://127.0.0.1:54321/api/audio/settings | python3 -m json.tool + +Exemple de réponse observée : +{ + "mic_gain": 74, + "mic_muted": true, + "speaker_muted": false, + "volume": 80 +} + +mic_gain = niveau de capture micro (%) +mic_muted = coupure du micro dans Alfred (true = coupé) +speaker_muted = coupure du haut-parleur (true = coupé) +volume = volume de sortie (%) + +# État de la détection du mot-clé « Alfred » +curl -sS http://127.0.0.1:54321/api/wake/status | python3 -m json.tool + +Exemple de réponse observée : +{ + "engine": "vosk_keyword", + "error": null, + "last_score": 1.0, + "paused": true, + "running": true, + "word": "alfred" +} + +running = moteur lancé ; paused = écoute du mot-clé suspendue. +Quand mic_muted=true, paused=true est généralement attendu. +Le détecteur du mot-clé est distinct de la transcription complète STT. + +# Endpoints d'action (POST) : à utiliser seulement pour le dépannage +curl -sS -X POST http://127.0.0.1:54321/api/wake/start +curl -sS -X POST http://127.0.0.1:54321/api/wake/stop + +# Faire prononcer une phrase pour tester la synthèse vocale +curl -sS -X POST http://127.0.0.1:54321/api/tts/say \ + -H 'Content-Type: application/json' \ + -d '{"text":"Bonjour, je suis Alfred."}' + +Note : si le micro est coupé dans Alfred, le redémarrage du wake +ne suffit pas toujours à réactiver une écoute normale : vérifier +également le bouton Mute. + +====================================================================== +4. CAMÉRA LOCALE ET RÉGLAGES +====================================================================== + +# État des paramètres V4L2 exposés par Alfred +curl -sS http://127.0.0.1:54321/api/camera/settings | python3 -m json.tool + +# Identifier les caméras +v4l2-ctl --list-devices + +# Lire les paramètres matériels de la webcam +v4l2-ctl -d /dev/video0 --list-ctrls-menus + +# Remettre la luminosité à la valeur d'usine de cette webcam +v4l2-ctl -d /dev/video0 --set-ctrl brightness=0 + +# Aperçu MJPEG (ouvre et réserve la webcam le temps de la connexion) +http://127.0.0.1:54321/api/camera/stream + +Attention : l'aperçu local peut monopoliser la webcam et empêcher +temporairement le MCP de reconnaissance faciale d'y accéder. +Le bouton Caméra de l'interface permet de désactiver le flux. + +Fichiers principaux : +/opt/alfred/app/services/camera.py +/opt/alfred/app/services/camera_settings.py + +====================================================================== +5. HERMES : AGENT, WEBUI ET MCP +====================================================================== + +# Lancer le tableau de bord Hermes (port indiqué : 9119) hermes dashboard --host 0.0.0.0 -> lancer le webui por 9119 + +Interface : http://:9119 +Attention : --host 0.0.0.0 expose le tableau de bord sur le réseau. +Éviter l'exposition publique sans contrôle d'accès. + +# Vérifier le MCP de reconnaissance faciale (commande utilisée auparavant) +hermes mcp test face_recognition + +Répertoire des MCP de Hermes : +/opt/hermes/MCP_home_assistant/ +/opt/hermes/MCP_comfyui/ +/opt/hermes/MCP_face_recognition/ + +Exemple de structure d'un MCP : +/opt/hermes/MCP_nom/mcp.py (nom du fichier variable) +/opt/hermes/MCP_nom/venv/ +/opt/hermes/MCP_nom/.env + +# Configuration/session liée à l'intégration Hermes dans Alfred +/opt/alfred/app/services/hermes_client.py +/opt/alfred/app/config/hermes_session.json + +Important : le fichier /opt/alfred/app/config/identity.md a déjà +provoqué des restrictions artificielles empêchant Hermes de proposer +certains outils. Ne pas le réintroduire sans vérifier son contenu. + +====================================================================== +6. HOME ASSISTANT : MÉTÉO, AGENDA, CAPTEURS +====================================================================== + +# État météo actuel et prévisions (depuis l'API Alfred) +curl -sS http://127.0.0.1:54321/api/ha/weather | python3 -m json.tool + +# Recommandations vestimentaires et illustration générée +# Attention : peut déclencher une génération ComfyUI coûteuse ! +curl -sS http://127.0.0.1:54321/api/ha/weather/outfits \ + | python3 -c 'import json,sys; d=json.load(sys.stdin); d.pop("image",None); print(json.dumps(d,indent=2,ensure_ascii=False))' + +# Vérifier les calendriers présents +curl -sS http://127.0.0.1:54321/api/calendar/calendars \ + | python3 -m json.tool + +# Températures exposées par Home Assistant +curl -sS http://127.0.0.1:54321/api/ha/temperatures \ + | python3 -m json.tool + +# Liste des caméras Home Assistant (pas la caméra USB locale) +curl -sS http://127.0.0.1:54321/api/ha/cameras \ + | python3 -m json.tool + +Configuration Home Assistant utilisée par Alfred : +HA_URL = URL de Home Assistant +HA_TOKEN = jeton longue durée (SECRET) +HA_WEATHER_ENTITY = entité weather.* à interroger +ALFRED_TIMEZONE = Europe/Paris +ALFRED_ALLOW_CALENDAR_WRITES = true/false + +Le fichier qui contient ces variables dépend du service systemd. +Vérifier avec « sudo systemctl cat alfred » et le répertoire de travail. +Ne jamais copier HA_TOKEN dans ALFRED.txt. + +Fichiers Python utiles : +/opt/alfred/app/services/ha_weather.py +/opt/alfred/app/services/ha_views.py +/opt/alfred/app/services/alfred_intents.py +/opt/alfred/app/services/alfred_views_controller.py + +====================================================================== +7. COMFYUI : GÉNÉRATION D'IMAGES ET TENUES MÉTÉO +====================================================================== + +Adresse du serveur ComfyUI utilisée jusqu'ici : +http://192.168.1.13:8188 + +# Vérifier la connexion ComfyUI +curl -sS --max-time 5 http://192.168.1.13:8188/system_stats \ + | python3 -m json.tool + +Workflow de génération déjà utilisé par Hermes : +/opt/hermes/MCP_comfyui/workflows/text_to_image.json + +Configuration MCP : +/opt/hermes/MCP_comfyui/.env + +Paramètres propres aux tenues météo (depuis la V5) : +/opt/alfred/app/config/weather_outfits.env + +# Éditer ces paramètres +sudo nano /opt/alfred/app/config/weather_outfits.env + +Réglages du module météo : +ALFRED_WEATHER_ILLUSTRATION_ATTEMPTS=2 +ALFRED_WEATHER_ILLUSTRATION_TARGET_SCORE=8.6 +ALFRED_WEATHER_DISPLAY_SIZE=350 +ALFRED_WEATHER_REVIEW=true +ALFRED_WEATHER_REFERENCE_MODE=auto +ALFRED_WEATHER_REFERENCE_DENOISE=0.56 +ALFRED_WEATHER_PRESERVE_FACE=true +ALFRED_WEATHER_ACCESSORY_LIMIT=1 + +Tentatives : maximum par personnage, pas nombre fixe. +Review : dépend d'un workflow vision compatible ; n'est pas garantie. +Reference mode auto : se replie sur text-to-image si incompatibilité. +Reference denoise : valeur plus élevée = vêtements plus modifiables, +mais risque accru de variation des visages. + +Images de référence V5 : +/opt/alfred/app/static/assets/weather/child-reference.png +/opt/alfred/app/static/assets/weather/adult-reference.png + +Code de génération et assemblage : +/opt/alfred/app/services/weather_outfits.py + +Cache (emplacement par défaut, sauf ALFRED_CACHE_DIR personnalisé) : +/opt/alfred/app/cache/weather_outfit_cache.json +/opt/alfred/app/cache/weather_outfit_images/ + +# Consulter le cache sans le supprimer +ls -lh /opt/alfred/app/cache/weather_outfit_images/ + +# Tester la syntaxe du module +/opt/alfred/venv/bin/python -m py_compile \ + /opt/alfred/app/services/weather_outfits.py + +Après modification du fichier de réglages : +sudo systemctl restart alfred + +====================================================================== +8. ARBORESCENCE IMPORTANTE +====================================================================== + +/opt/alfred/ + venv/ Python virtuel de l'application + app/ + app.py Serveur Flask / API + templates/index.html Page principale + static/js/ Scripts de l'interface + static/css/ Styles de l'interface + services/audio.py STT / TTS + services/wakeword.py Réveil vocal Vosk + services/hermes_client.py Appels Hermes + services/camera.py Caméra locale + services/camera_settings.py Réglages webcam + services/ha_weather.py Météo Home Assistant + services/weather_outfits.py Tenues et ComfyUI + config/weather_outfits.env Réglages V5 + config/hermes_session.json Session Hermes + cache/ Illustrations météo en cache + +/opt/hermes/ + MCP_home_assistant/ + MCP_comfyui/ + MCP_face_recognition/ + +Cette arborescence synthétise plusieurs versions successives : +vérifier l'existence d'un fichier avant de l'éditer. + +====================================================================== +9. DÉPANNAGE RAPIDE +====================================================================== + +# Alfred ne démarre pas +sudo systemctl status alfred -n 50 --no-pager +journalctl -u alfred -n 100 --no-pager + +# Erreur Python dans un module +/opt/alfred/venv/bin/python -m py_compile /opt/alfred/app/app.py + +# API Flask ne répond pas +curl -v --max-time 5 http://127.0.0.1:54321/api/state +sudo ss -lntp | grep ':54321' + +# Micro coupé / mot-clé en pause +curl -sS http://127.0.0.1:54321/api/audio/settings +curl -sS http://127.0.0.1:54321/api/wake/status + +# ComfyUI inaccessible +curl -v --max-time 5 http://192.168.1.13:8188/system_stats +# Vérifier BASE/COMFYUI_URL et le .env du MCP + +# ComfyUI génère la même image +# Vérifier seeds du workflow, bouton Régénérer et cache. +# La V5 utilise de nouveaux seeds lors de la régénération. + +# Les tenues ne correspondent pas à la date demandée +# Vérifier les prévisions de la date, les paramètres focus_date/date +# et la disponibilité des prévisions Home Assistant. + +# Sauvegarder avant de modifier le code +sudo cp -a /opt/alfred/app /opt/alfred/app.backup.$(date +%Y%m%d_%H%M%S) + +====================================================================== +10. RÈGLES PRATIQUES À NE PAS OUBLIER +====================================================================== + +- Ne pas mettre de jetons/API keys/mots de passe dans ce fichier. +- Tester la syntaxe Python avant de redémarrer Alfred. +- Sauvegarder l'app avant d'appliquer un patch. +- Conserver les calendriers et les réglages caméra lors d'une mise à jour météo. +- Ne pas bloquer la webcam avec un aperçu permanent. +- Pour les images météo : une fille de 8 ans et un homme de 42 ans. +- Les deux personnes doivent garder une apparence cohérente entre les jours. +- ComfyUI génère les images ; Home Assistant fournit la météo. +- La génération des tenues peut être longue : ne pas la relancer inutilement. +- La plupart des réglages V5 sont modifiables dans weather_outfits.env. + +FIN DU FICHIER diff --git a/ALFRED.txt.old b/ALFRED.txt.old new file mode 100644 index 0000000..10751a0 --- /dev/null +++ b/ALFRED.txt.old @@ -0,0 +1,22 @@ +curl -s http://127.0.0.1:54321/api/audio/settings +> status du micro, hp, volumes... + +output: + +{"mic_gain":74,"mic_muted":true,"speaker_muted":false,"volume":80} + + +curl -s http://127.0.0.1:54321/api/wake/status +> status de Vosk (stt pour le key world "alfred") + +output : + +{"engine":"vosk_keyword","error":null,"last_score":1.0,"paused":true,"running":true,"word":"alfred"} + + +hermes dashboard --host 0.0.0.0 +> lancer le webui por 9119 + + +/opt/alfred/app/config/weather_outfits.env +> conf pour la géréation des vetements pour les avatars (nombre de check...) diff --git a/alfred/app/cache/weather_outfit_cache.json b/alfred/app/cache/weather_outfit_cache.json index 197e8c1..929e89a 100644 --- a/alfred/app/cache/weather_outfit_cache.json +++ b/alfred/app/cache/weather_outfit_cache.json @@ -191,5 +191,34 @@ }, "cached_at": 1792969491.7701209, "focus_label": "samedi 31 octobre" + }, + "b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a": { + "file": "b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg", + "prompt_ids": [ + "cdd79fd9-0eef-4a3b-b6c6-d4b5bac8db81", + "0efecd05-8734-4335-91ff-10e282a00095" + ], + "reviews": { + "child": { + "score": 0.0, + "ok": false, + "issues": [ + "review_unavailable" + ], + "reviewed": false, + "reference_applied": true + }, + "adult": { + "score": 0.0, + "ok": false, + "issues": [ + "review_unavailable" + ], + "reviewed": false, + "reference_applied": true + } + }, + "cached_at": 1792970119.676846, + "focus_label": "aujourd’hui" } } \ No newline at end of file diff --git a/alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg b/alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44aab425b167f4e13650e411f5eceba66e207050 GIT binary patch literal 26390 zcmb5V1yCGc5I4BE1(!hZ0D*--g1fuJ;tPb}7Th&JkU)Tig$07!;tRoDg1cLAcXvX7 zg+O4$g3vTws3Rro_u*A<;$v|{omBRC_qI+N5*)$ zDL@E7Mn*zLMM1+reOasjX7r+t5S1Q{h*OeS(-i%!OK=VeSA6B~i8BUnsddmfDX%NE z>Ujb13I*xqolpn?;(!e$mfV84kSG>7AUBGo1C4RASV1aXLyAZnP6a?$gewbUns49f z72Eca5G;_uX(AN{c9`gn6j|hpE z1lZoO3;vU}Yc^}BZ=zJryT{+xWG<+6f^;NMmik$Yqx#G>(zq9rdn81pg7Ghrf#jsr z1$E}dh2u9-oKZkDY?j<0?Ecuy+Sn?FLc}X=OL=v$4imMgtu{TmrYuP|iKZ;zrO~00 zXiA`Y%lX?c@CzeBeUX$f70D3|HC;?>uXfZJ+~g}%=E^nuNV>zJWZ$1Iq(lN)-0${Yiw%gDqog4@ixW zW67B=pA;2PuxO-et%d_Pfgls%j38=?(K`LiaxId#^d11H|4EYe3bhuUR- z+eTE}-(`D#G`xc;tHiLvBagJ?t9SFihduq+kgmq08vhkPtt_>d17?-RXfBD7v(3wF!b(kU@ z-?;D=RSywWe&}W(vrtDgpK!4e~tb{CVZ-snkgxqNFlU!1O?b^+=}d|ke!%}wzemQGOyR~r z&my(d34+tT56P*jKOdb5of+y%jXD^U8K2vb9JrE;R=)~xt{k%VSynWYq`=D=ne@jj z;>bNhaj28@Rc+U6OD2ANL-mCu-F=k*qP%s2>hqL{gmPVjhV>$|9H4}!SBWI>6Qyo| z{^tU5=f^>AWw1|(kq?l0jmxXRxL)@7tv0>((?6nn+V}Z}RyNC8!qTg&5{+F{#aI9g zg22Hzl8-sjf!ckHf#)(o_=2eT;>lqK83;`x404Cp=;MOJ7-|0ZL9VG~@CIY&riwcC z)-399{4rXXjex~Au=kU_8(S|uCQy3d$SgOC^=kA#Tk|GSQa= z`j#+~UhAXa+p+VnFu_CWPmcp#_TjfDZ=PT_i!FNJ$@j8G^RTG;($;nUrro#pL-z`k zSIov&FKH20QgT9*TD4zfA~^heKX*iLMG_e)tMV-PBy9|ID9|uY19?f4lr&wvrHB?1 zr9fDWL4YNwKbk?4eQ;{H5vSLTE2()nh%8Cj)OCr5W?kS5Ew9sAF<-)z?k8G>*ho7^ zwH&>x(>&OirQQ$C%abs?DEBL2=Fu{QrGItb6vB|)&SJ5w0Ox4IVGDT8&@-2zH!q($ zEy0|vS@xCSCbmx;U#{*MkbJy<@D#op{=f;2_)+fn4Cou$TowCqpyAal7GD!4A8eD% zY5P>C62>MLxvlWej#TK2RR*2mHwIB6HE|-_A&~s6x}sqfWAzs`HHI#AL4~`fN@$=2 zcJz>`gX>RzAglWw(1&@lY0^cQcm(RS(`C?U=hCC0ycKsy(cMqS3$yO(t%GKqM_Gj= zr#Z8u$pcCSelM=EDs9zq5Q3qujD?u`SX8A7lx$*w9%WN26;X)>km>zxnRJU^T&soT z&dRE#c%mnek0PovL4`P1?RE_fM6TiOo>^*zhhP-Ai~D^ho;`$h;Fv^H1rN>Q#iR8Z z5Khg8vvSpsPZqQ6A1YajuP$2KT9ovlmxL~@=ZdbHQIig%U>eEiyxLR}8dxNdop zNR`;~J{KkqMt^5lvA4PB*k#SimL37SWXWr4>&beBvoj7u%h9>3zqyM9%scN0g=G(n zO|S`LNDnEw%=7CAphvL8hC}n;te9ir2Vx%9_T}g+wJIr>WvLIK1u`c3-L&unX*+WO zFh8czt#L>2@QjpjVo7_VDb0Ae&6aWj4jw6IYE<%oae)KaKo3YounFP%q|SPe)sN~;n66bTID4NTeo{_$Ox6au{hN-zz^x`|Ipc`~dOHxs zDB-H~w%@PCm6FYcu|_8$6GRs0>e(YXox2hBy$768a9VkdK~~rwD>a21o{MH(z?F+p zQc{Xyx9q&o$P&FhlQ(?V+OkmGDN6hgVv`&7i}eK$X5+pfLl_{Ru`HC4NU?*)s<6(` z)!}T>CU{hx>xs2!2Uh=Jv}&XOxJU^(*4|FK|1Pjl?j0Zi`ThV~7;?RTZR+q*ZT@gJ z#X}9QrNB3jecQj~)8YBlfA`N`^y&U6QX5m|cA3hB`N$umH)oWDg+NX609UZMon{NY zxb$B>Q#z4?Aol9JdX01>uuEU-xA809mY9U|eVy*#is*<~s>MGOLOv&SMtvSac2rjL z+We-Ov27UVY)1?`s(QXwWi%JRyqul<_YP&o1s$Ay!wKiQ8q>`9l8wPts_MI^tL-kI5RPiB-}p znuB1J?q>iih6%63rWVbcL+@FsEBO_z6IDHt0erTf`)cOL>?Zg~6AYix+&U{hAhwsN zc1|r!S=2$H_*Gfc_X(gFdZPQHUHKXVbMbdyW?bnDo+cw=ACdjF^Xjw9j+<;s9yhgg z3qbXpvil|U`ll{a9Fqqm#n>zk*>Xl2l$)YN=vx^8v6_s24(8nk?Karl)qI;V2{1S#oqxj? z^6P4tlXb7cu0cG4#>JaSxfh9fjSuhzy|d(Lf|cg2vFLkt#d(+SM~|iM(+qs;g7641 zSOdi$;g}`XZhV0H&&46=vhXLX18U;?&u|I%zjNb{wieM2<#Imx2zWF}W=Mm5bP_+p z%OF1E%PpHy1_y(g2LHXa7-`NLm6FjY@rhMy-nxrNDVs62HdK+>RZS6&2ivGj7)tlH zM)(TpRtSD{`1~J``9F~krzY$_aGvOX4cB1!-@*HTJGBOTG(I@ap4hC~AzJH98uZzg zF)Peh4Si-8?EZ!OQ}Dl8;KjFu{X zta-;Al~s41Gf({+>6#f)nHgt;F9NcB0ZjvL{?hL->Z-o6q%*g=U~kL!9ewe&Fh_V4 z;=)Wf@KOzlkB1xG!srK7#lp~+9MnD+(+4VTFSE|yO*4d&v2z!nw8&5Xa43#5B*>`*1O7Nbe$(W10qZ07?VVO)@2{30v1aqavOSDv4)Omsva%lsq$gD0&XE)a0w41oTplo6y68JBu>-rP-oI}FYrtwrkBDj3tlpFD> z)z~mIlftI_gO}c^o^7%sHk0eBVc+!eo$hzxsh$V*(W(J0VlzYph$|l`aJV6cv0e}3 zAvraSy7zg_EIs0|&f?@Te1T|vA<)XLY*;s6V!BV;P=?xg+L4IoeFH< zlH~*qdE(Siqn{j8zeJN(LXl42Z)I^C@|XUqt77P-h+8|rpI6Ts8?0uUJsua{72=Ca zEWCro!d?eB_Io%r`6N{*=q1gUM1^7($#*A<#PE~lDkUyd1@e}i4A^26 zmQ?Ps27Jx@{^s4Bjf;P*QBrfu^=_d z-((3l1G-)tA|!rtNS1 zbq$i{^aJYQJ4-`sKs`o$P!CgLFEza)~4kj>}Tg&?7r_$ zc$`|kYVrja~%WVx-sG*Gyo<6AW*+^Jlr)=@c0X19NzTa%g4dZ?=CFq!HIjCX13 zSMlEO?Z_uXDK_@+ z!`fxr1l)l`xrysf?Bjv&!+?51tb0DbOTPOci2wXuf$#6xWYY{1NWiRiy1xQ%+{Tiu zeQKB!p^2`&fI7afcwo<|c&;Ey6=`F);Wb%v+WQ8Cyqhze2A7k%hcEt;m6dt2!q^n< zFvsilG#UY_u{dtyoNbt^I<+z8%}#JxuOKwm#>8wKCOGkjD@50dlzV2PFw(`x{lW(_ z3p*KyIZn?u$EMot+O!#-ysxPmG>&Ai2j$!<(A`CioU6XeQ!PqF#E#`1$1eWEZO5G1 zuLax475fd9oMt`)K%p~KqV)xLNeE3rFsMpV4!^gQhH)TpsDvH2#>brRPGQj!8Cg3k z$=aDmy97>-OOS0&?QPme@L9NSSgo4tvO_rRZ6 zHsMUwL5HlDs7LatYJKaojmkg%5zPA2Heuf09N+4- zYMrd*vEB-Gdj?GPhYpRtGRFoHsm~#_jcdHO3lTTKbh>J8vQ5v_#CIDTL16adEf)M| zfcF~7T{ewlzV45R#V_wlV-JU}IYp#O3SV2)S>sK}l4f(~$dYKF7ZqEk(z+mJ=RcgX zvx?;h!pOgmePt?8U(pyF>Mf*4t6OxTTW_f_ouU?}(kTeRS*eVxh5AX7pMFSQQE{hT zuHwAZi+lvu$}(7N%df8+(g&@9mp%=wVsvMPnQvc|7xMEbeD9I{JmZ)4w-OS$^bCOU zi6pENxvHV>`uez_VAwf$R9W}~P^XA#A~%7zA@Y&Mav77=yi$vGzvYJfy-vJ&CbeKd z`HokQF5pyab%nN3D-mrfQVWD307L5;pilbQq*fIYk!ofPk?VD|I6_lNam{~?)q!R* zOLe8tDc@UkmqqC7edk^_w%2NM>3SLFJX4$;>DTjBZ?8S=ZObOfJedz(O8=<^3sX@H zEkO`6mk0r1;PPElmmGL;&PZ@dPeBd1_@$1JX=hPgP)m(3Ux0Hb89OAxxHPo9H=y@o zBJ*H1@#05CLv_N%9qwQ4XFy0R{2GEHeUoRedaGJ4wer!(yJpK;@iwU|MWkiXjWGo3 zH9sq@m6vhV`_TvbH|-IFBs})MS(l!@jr-4btI3+Jiis|0 z+Y(T^Wi=@32@5j2C9+jSqL=O?n~XgOQ=<}nPa=jyq3Fpq9l^+N7-Z^uW%wxN)ElrE7*F6ta3Xb(s*Rm;sw2_n z;))G#+dYjKX*I_wrOpDuPU;N%FF|PCcGt-k<7SD1Ai0<*uH2RZulu9a@I&GrTTmZR zi6HEDse}5y>GQog3hD4t{^F?IUP;qNg8uK(bk!qht86zAoH^(0!PhuNk$xpNO+w{W z8fI#T#JV&89_8epEazbWyHl;b_w4*>opH5(0-Euxj}d5EFGyXxP=FSEh|@aB^|p11 zor5e1ooALxi;b5h zGs5(p^bc=l{8&rIX8^&#ZJ-~mhW`Qax^5xiXTIUg`!J+YeUCd)jB8$;_14Y(Blf}r%x|SbxW!%d=;;BV#0?_2NUl1}#b7~eQMHu!!bF@KV zTq`LP1KeM$!cp`r>gO!!jJ{AdWTBayKSK(IhAtHf^Q-nP-_t^@mB|+yVsT2w#uD+t zC%UX_I}Z#n!zw$R=HFL1K`rF#yJ%$-$xc%)7IrmUb9F10eAG~5En5)ukM3|bDFHG- z*iqG>p7N*=v@v~pN|rDPr)`ai6txp`H1%R^IQtEQRva@KK4H@;$=64YQ-JGD0_z}s ziShcB9%P2hz?QTU_vBRPl%=zs4UYxiav6zt%n-)L5feyXC6( z&dpH^r#~vKxl4Kc>I4brmMDIW=OODeqjKq;V#wXA?W6eL>Ad93^yamPBAinOkys5Q z`*j0PFj^|!J8ZWKb;da8hnn@g&jAh+)iqZoUI7?R@WavEU`*p)C#{f-fAU8aJ*|e_ z?8*+~Mx0ZX2r|Q=cvxj37N)DPe%qUp8K$WYovYryLCpIG-5vL9^ zn&Z0}t6)7?IJW&ABUmbM&UarV(3g8fWuPm-kx-<2u3ejts0Ai1D(-e*VP6Q8xcFlo z^-xO~`W!AEi_p_}C1^@POi|S!iwG%mQZv!keU^bK0PB-Vvy_N4FzK zQPdw#kq+0wx#$a_ibJAyG^#iSF|#Ja@Gmk>Qu^IwODbAOvFjY^WxV}@$dD8@F8@O< ztv`7kaU4fQOqiX<3LU*Vm3NN5{+<_QGGAa?JKwr^)d=gTpoX+8#tsew1?iGfI~;7g7^oOi$w!#D*K&AuQ@>?deaj_WPKc+JDaO{s#o4| z$FzZb*%H4&Kxmx)sj(W@oN9_(4(?&hs=xWj-xn|-=z(d#t}yluE<=gK{^*M>4-MuH zErZ%l$KIdZRA`Ap7D5|MW%;I9G>u}37smyG`5zTdYfPdxA5k#V;lVb-15Tg=anaYHWj)Bbvrr|6&(eb_nCQgu4p}LK?S2C59bSO(711pQ)!uOTzA4BO4_hEfTV3!$}R; zx@0rW;+~P;)S><%cQCi{@jDrX8b$^-o>1m7n;4cl-vQ(O%Q9J%eamv}jxpAXi7F~< ztDwAQY9ZQWe+YTAtoNNWdeLG!=SN0+R&u)y6j+m^Bg+;v%x`-m~b z>*)zz?-^1x@lc_(e00q(A+c3$848$8b-@D)JG#Xw{GOlrN>cLU^NIS33265l!WdVF z@t>g2&5Jjz+C7_6<5)ZX`^P$l#v*2mRs7^z--sg3zBrZjrV8kaxmHE##A|U$Ks7z( z*9iw#vKaQZU|)Y!tmH;)Rqds0^I|-c!x!Dj=2|MB{3HDS=?_s<_OmMcrHQ4a@RTa> z=UW_T?(QiTlGuSu-IIr^c3FakT&!y%n{8|4S5kqzJa@FnA)QPf-A@jT;f5VZ@}~k7 z)9I-jMZO_&1=EusumUVIAJtxC_W2?P#6Pe`ue|?fFf(P?X0%IriC>l}H|80xHyy@5 zPPpTy#-)Pb|FUi5%G3}mgFc=+sd%X;{R}WhGnQ6fd-yqIW%np^d<%a~-Z$(#eIb)J zQ^HWf{4?2aDXXFCt7IyorR^=;tFc2xW>*{TCL_(dij8K|D?gq3qiNN>+-Qq1PX0SW z4=*ADEJqw=u(7aOar6$R*sID~Ht1aTeg9DZ@P(Qh@A-dmLJ~CJz8M?L)2c-ZwQC<@ z7!Eq{6|7fPFf$6m%pYR15Uz2DwE=)5N(&hd;-y`IKDK(l+|?b1pxSzH4LESnWj2Um^v6bQ;PS`rI@}1l)$OFNGa}S; zYiY?Ho0@PNc!xgPySWcJjao!&|Ap^pWx@{|M8_9nUfKM73N*X>iV zln@ii4$h*|@#-1+rz}GmZKxIeeo=!-g~?J09F@3+3RUcDDQ^Jezrrms$*UFj>J(Nh zY>;;pnz6G}j^jk5qH5pao%c zR{o0MO}XYJN`5bx9N$%CA;=|NO)cmuHGKfNWP#Ck&k9{#^KRPO2m``h&UXL(5%@zUT@hM+3re`3I#kpO!$e^gijl6X3gBp$ z>#$4Kgchc3cVDe;p7DN{``oL1kQ7%d*l)<-Eb{j$aaGgzjf{Cf=~tx%)t!H7E*1^R zhJs3-tbMJJPe#78i9J2BwTwy*iWpRXI>fcAq$(e)G!ST4=+X6iT;t*Q5!PFQGI#k_^haQ+()&FB>(^5WV3 z9YbG=Xc4IemnZeT6Y9cJh79O=66GgUsV{0OKFm`KO%HgH*BCf_A*oR>N}Fml8H)3knqm0#i*qvEu3Wp3>;bZ%nKc$xP!Ju-PYe zP(5BOpx4_pxtPn&=grX_K49PvxEu|D{}V&b*2=Akm>~lpfs_`v#F&^dE=CMzj7ku4 zBY#FA2Dlb*k~(8N`i)ggo-0fzyNE^3&mXCX3Vz*SQ(+AOaWj(0BqjE;UFLju?L)&E zMG^?%_0%<}d|`3g7+S+}-B88RRo0W(cT)A|G{1!vWrBzBG_|5&ac)dC&c#->J3lgS1;ZkX~7WL8P&N z72%p^+;A66g1X=K`Yd)HDu24XLJ{ zGyHV-Rfw5r&FJlcXTgZ$+RyXWjO}F7l^i=c00kaR5N?d=tixLidssVaxoV~~IZC-k zWqZ;SZ?b)7bKvlV{NI}6<-mwBx7n5oB1|c_xkT&zPqX<$FV!3hC~Z)YwgtCGu>5qq zI>@RgG}dcb37v0DYhTmQqL^TPG@dpYh|37`wv;C?xHa*(#i>9j8yqN(sOVluvE9!^ z3%Ds(K7A?`E+8hS!EyT+#@*j!#6)BaZJ|ZY)Vv}sg+x|J^l-DmIX0sjvNajEpz1%% zCX^bhNP`DK6+sLLQ#jwo9~Taumr!YoP?bMX@YOr;lJGRHV1b2g+R1CGhQp7#hzD3h zMu&K(f|`7a;&~~5$cq6X63EJ(;d+yRqtX*-QIIazUEBZWKBOw)yhlUh+MzMA?xD$t zHKl`kjxpr>Z}Z$CdQrDF5@0x#g&A;1j z8)u4fW{tUdbX3IVid&63S6`@l2q7g;U@Yj1&#z^ zPxFv2c#E2IqdVu>e$2QPh&ucEZ()}v2L0_MBn6;jh3l)|#o0GSNNFL^70@+W13E}s zY*7=L6y+lw6!CK#6c7#cdifp1XV|AAv)a zzx2O})g)?ey+4|LoY3_xq8Fq|(<*UZfQ1o{mOG3oRa(7uaZUfZu|SnVr^DGpQCTxt zKBxB#C{b$8M+w=CWkk*QA2FOWj0`4TK#?@h05YUe(!SY^ogjK_*VsR`Hn@?HNgnst zCGAIUlgL7FyBo$TtKpB}Jh32-kJEG$Eo-xL_C`Z3^M+$IL?C3k1_gW23 zr$T(B9MzcPPNV6m1BIs?;bitg%JqisKNt=)Z9<_(mTq{V)c5LY1$hA}9;9`L4jULp zUR}S;?a&H@e)nrx)_jJ9_hAg?_6W*>F5W5j;>vmnk#H@*&?K4Jyd4rCaKVPqa-*C< zL8TBENEpB2fUiSqTMm|1#2IO|o1Nd;iNiuZedH+Lfw@r4B~!f;rquUyBz;DIw!}KY zWUX{R&C>5+p`kC0XL*ZL0jf8`zf>@nANE1emJ0@$!F+|V_sr*&mS=$C$Ux2#4eLdG zrQ>MQGvKC2`3_MitTD8n88?L(iD&*^VaGf>G^;q^aBA)VJ24)_SXnI?L@6rzyf*h& zF`u`8d+Jl-J+=1uGhh`#i({0y=?H&Km@K;dmqPICWSGlSb+mvU6gvK|$9`b__OHq= z-A}x8S)i!$Z8z^TpotA7BVBwFmuJT)=5yKg2YW{5XTXt`|H*)8Ej;^2!ll;%lfCEp zGhl_+Z2O=c8RJ9VKV|7Ehr-xYZeu&c*Hq-qezFtcmNLHE&MJjUi#t+N!(_P_tdstA z#a~Gn+pQvs;59U8KeQ)t{4U~1L$szhQ{0z)^!U#b`} zsu6PCm9Ps69w(Vr?51h7#WcR8!J+&-c?m- zxO`9rLsx~28b5A+yC=x54aDNTX4;KopvUQb4Ws@yqIv#vH;ICo|LnDmMM>-o3-QPP_~hjCdjSl*{Qa7FfR9XASNd*b# zN?Cqy3u8a<6Zps1O7Ko$Ln@9Yp`wfV?y@E~DRETlYa4BeTQn4J`u$2|kI6-e>>c6t z!r4K1T&^VI!`Nfa{Jg4BSM*5|j|U`WuP$+K&VP#qu&HV|X+iS^_M}GFD>t+CXtmfb6enC5xcXEf=*}1!)#|s@I#H^sjeiJ=3(2xHF@7)Nm^LBgzPm4 zTexpgd0t*3pXCepnGQGq$y)9Dc=Y>G1*;`HNSpAn>2Z?TFnm|l?v(_IzwVCuZc?5ug@?R;lf8$YN zt3hdjNL9jg{-N@L4XK!`J;s`rzJA~E z4CvL3Wu@&Zw7Ph-V`m6k&Z1}$c8XsB zy-!hj^;5IPe+GkeYo3+jJ{=o2`XHV|(c=@KaQzGj6{6{Szf|7xbrL!Z_+;CRWmMQ0 zCy6cR%sq_GcX2=GbPxdUEnV+To6~5_v^uwS*e3cYsb!tUu%_)QhTgCUGHhnpp9PIH z>zp%dDd>)}ry1G2`sYlgsY&YNoNO>(%WN&2J*nG>=$uS|SL2Zk0Da}FgQ&2;Q*{ak z0%w#?Q6(F^+j3)|AxU1c^*z_|2Zk-S1+5>u;N&2|NMZMt1l=C#|7_oX6@Wo6otIW2 zuPMP$&`fKSlB0)5zmzyhwwR07-l9SMu`rSQQt9hT`PAt#i2bd9v4U+r1JXPK4tXwF9nv@ z{_)R>KNNYbN-Y-EfJig=`nsX7?3yg~G48_3cwR$}B#ho*0M%P3*z#+8$kfjPR^h)h z;-xjwY@4QuYMkBhaB1&tU7huBo4T{9n0z}#->T&J4={_AhwCccsX=8+feOgEsY?+a z;feMXEO7^a-BGa-nB%;rnH|&UnQKjuIZ>8jFBJ1Lep?u`_}Ft8$%V8pqOx`6XyFs<^cW zJ1HZcwNC_RUqtheu`Gg`)A0inD*irUy9(M2+JdcGJG{)Pot!6s3{2#f`57z>A>b=? zC+az8_LIa5z|Bngs_oV&NV-j;8+~!}zcy_^3AP?{n1R5p+7s+pz;@oQ!4Ag=mB*ON zTHZeH)uo$IJft_i<^2!Rrs z1}wfV+V>PLvLQp#Fi=t)<5O@j3=aOq?3)e;%6M0TK63HV0I(<8dVh6r9AeEj*rnNo zKYUNEBl={UpO3Ir4s}D#H16Ovpd$WrSske>hHjtv@z6oBG6Lv@pJC|AN z32YfPg1|@n^uV1LGz0V$GyPTZcfARGxOEAf zHYTQArTb9=lx|=!ihrpS=~(lJLQ+N9j*`*i#94j#8d3X3H#@;f>2OZin|I@o1I;$g zjMlzdx1>oqP{1crPgS>TxQMnYcap)J;_R@J6k)!pRur(^{mYpLJh*L}l;42p zSXQGVLV9|0W5L*0+w!1>il_oh0BKINzYfoaDwDM77Gf<$QDbXxp)ZStWITxY_huYt z8r?y9ZBKC0n%pFL%u9dP=}*?}Ou9^ADNCR8+Io6#SQXD*@Q$?WgV_ma%tn8*S3A_z zW7Q)|M}iZ>Z$Pmi?kzw`$a�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