From 554d968d27dda0dea6008bf185bf1832eea6f41a Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 28 Aug 2025 15:44:17 +0200 Subject: [PATCH] v26 WIP --- Dockerfile | 70 ++++++++++++++++++++++++++++++ README.md | 72 ++++++++++++++++++++++--------- compose.yml | 104 +++++++++++++++++++++++++++++++++------------ docs/user_fede.png | Bin 44176 -> 0 bytes 4 files changed, 199 insertions(+), 47 deletions(-) create mode 100644 Dockerfile delete mode 100644 docs/user_fede.png diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c3dd6b1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,70 @@ +# Multi-stage Keycloak build with custom configuration +# This Dockerfile creates an optimized Keycloak image with token exchange support + +# ============================================================================= +# Build Stage +# ============================================================================= +FROM quay.io/keycloak/keycloak:latest AS builder + +# Set build-time environment variables +ENV KC_HEALTH_ENABLED=true \ + KC_METRICS_ENABLED=true \ + KC_DB=postgres \ + KC_TRANSACTION_XA_ENABLED=false \ + KC_CACHE=ispn \ + KC_CACHE_STACK=tcp + +# Build optimized Keycloak +RUN /opt/keycloak/bin/kc.sh build + +# ============================================================================= +# Runtime Stage +# ============================================================================= +FROM quay.io/keycloak/keycloak:latest + +# Copy optimized build from builder stage +COPY --from=builder /opt/keycloak/ /opt/keycloak/ + +# Create necessary directories +USER root +RUN mkdir -p /opt/keycloak/data/import \ + && mkdir -p /opt/keycloak/conf \ + && mkdir -p /opt/keycloak/themes \ + && chown -R 1000:1000 /opt/keycloak/data \ + && chown -R 1000:1000 /opt/keycloak/conf \ + && chown -R 1000:1000 /opt/keycloak/themes + +# Copy configuration files +# COPY deploy/config/realm/ /opt/keycloak/data/import/ +# COPY deploy/config/user-profile.json /opt/keycloak/conf/user-profile.json +COPY deploy/config/keycloak.conf /opt/keycloak/conf/keycloak.conf + +# Copy custom themes (if any) +# COPY deploy/config/themes/ /opt/keycloak/themes/ + +# Set proper ownership +RUN chown -R 1000:1000 /opt/keycloak/data/import \ + && chown -R 1000:1000 /opt/keycloak/conf + +# Switch back to keycloak user for security +USER 1000 + +# Set runtime environment variables TO CHANGE FOR PROD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +ENV KC_DB=postgres \ + KC_HEALTH_ENABLED=true \ + KC_METRICS_ENABLED=true \ + KC_HTTP_ENABLED=true \ + KC_HOSTNAME_STRICT=false \ + KC_HOSTNAME_STRICT_HTTPS=false \ + KC_LOG_LEVEL=INFO + +# Expose ports +EXPOSE 8080 9000 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD curl -f http://localhost:9000/health/ready || exit 1 + +# Default entrypoint with import +ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] +CMD ["start", "--import-realm", "--optimized"] \ No newline at end of file diff --git a/README.md b/README.md index d3bad9b..161cc20 100644 --- a/README.md +++ b/README.md @@ -21,44 +21,74 @@ nano .env docker compose up -d ``` -## UPGRADE PROCESS +## UPGRADE PROCESS (from v16 to v26) Pour upgrader keycloak, il faut: - exporter la base de données utilisateurs (LDAP) +- exporter le realm +- démarrer la nouvelle version de keycloak (créer l'admin définitif et supprimer le temporaire) +- importer le realm de l'export json +- importer la base de données ldap +- Configurer le realm garagenum pour utiliser le ldap +- recréer les secrets des clients + +### EXPORT LDAP DATABASE (USERS) + +Pour upgrader keycloak, il faut: +- exporter la base de données utilisateurs (LDAP) +```bash +docker exec -it ancien-ldap bash +slapcat -n 1 -l /tmp/backup.ldif +docker cp ancien-ldap:/tmp/backup.ldif . +``` - exporter les `clients` du `realm` -### EXPORTER LES CLIENTS DU REALM +:skull: Les secrets ne seront pas récupérés (*******) donc à persister avant ou idéalement recréer -- Modifier la configuration du script `keycloak-adm-clients.sh` +### EXPORTER LE REALM + +![]() + +### DEMARRER LA NOUVELLE VERSION -- Utiliser le script pour exporter les clients: ```bash -./keycloak-adm-clients.sh export +docker compose up -d ``` -### IMPORTER DATABASE +### IMPORTER LE REALM -- Copier la database de `keycloak-openldap`: +Utiliser le fichier json de l'export pour importer les configs du realm + +![]() + +### IMPORTER DATABASE LDAP (USERS) + +- importer la base de données de `keycloak-openldap`: ```bash -cp /chemin/vers/l'ancienne/ldap_db/*.mdb ./keycloak/ldap_db +# Copier la backup ldif +docker cp backup.ldif keycloak-openldap:/tmp/backup.ldif +# Se connecter au terminal du conteneur ldap +docker exec -it keycloak-openldap bash +# Arrêter le service slapd +service slapd stop +# Supprimer la DB actuelle +rm -rf /var/lib/ldap/* +# Ajouter le LDIF +slapadd -n 1 -F /etc/ldap/slapd.d -l /tmp/backup.ldif +# Ajuster les permissions +chown -R openldap:openldap /var/lib/ldap +# Redémarrer slapd +service slapd start ``` -> c'est là que sont les users +> c'est là que sont les users ! -### IMPORTER USERS DANS LA BASE DE DONNEES LDAP +### CONFIGURER LE REALM POUR UTILISER LDAP -Mettre à jour le User federation pour reconnecter Keycloak avec la BDD LDAP (mdp dans .env) +![]() -![user federation](docs/user_fede.png) - -### IMPORTER LES CLIENTS DU REALM - -- Utiliser le script pour exporter les clients: -```bash -./keycloak-adm-clients.sh import -``` +:danger: Activer featue script pour keycloak ## BUGS -- [ ] Clients secrets don't get exported (***********) -> maj (script export à tester) -- [ ] Users need get verified -> A faire manuellement sur chq user (possibly automated) +- [ ] Users need get verified -> A faire manuellement sur chq user (possibly automated ?) diff --git a/compose.yml b/compose.yml index c696bde..95efd2c 100644 --- a/compose.yml +++ b/compose.yml @@ -1,32 +1,71 @@ services: keycloak: - image: quay.io/keycloak/keycloak:23.0.3 - container_name: keycloak - restart: always - command: start --proxy=edge -# command: start-dev # pour debug - ports: - - 8080:8080 - depends_on: - - keycloak_db - env_file: - - .env - volumes: - - ./keycloak/datas:/opt/keycloak/data/h2 - # volumes: - # - ./keycloak/certs:/opt/jboss/keycloak/standalone/configuration/certs:ro - # - ./keycloak/conf/standalone.xml:/opt/jboss/keycloak/standalone/configuration/standalone-ha.xml:ro + build: + context: . + dockerfile: Dockerfile + container_name: ${KEYCLOAK_CONTAINER_NAME:-local-keycloak} + environment: + # Admin configuration + KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN:-admin} + KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD:-admin} - keycloak_db: - image: postgres:13 - container_name: keycloak-db - restart: always - volumes: - - ./postgres:/var/lib/postgresql/data + # Database configuration + KC_DB: ${KC_DB:-postgres} + KC_DB_URL: ${KC_DB_URL:-jdbc:postgresql://postgres:5432/gnsso} + KC_DB_USERNAME: ${KC_DB_USERNAME:-keycloak} + KC_DB_PASSWORD: ${KC_DB_PASSWORD:-password} + + # Network configuration + KC_HOSTNAME_STRICT: ${KC_HOSTNAME_STRICT:-false} + KC_HOSTNAME_STRICT_HTTPS: ${KC_HOSTNAME_STRICT_HTTPS:-false} + KC_HTTP_ENABLED: ${KC_HTTP_ENABLED:-true} + + # Features + environment: + # KC_FEATURES: scripts + KC_HEALTH_ENABLED: ${KC_HEALTH_ENABLED:-true} + KC_METRICS_ENABLED: ${KC_METRICS_ENABLED:-true} + + # Logging + KC_LOG_LEVEL: ${LOG_LEVEL:-INFO} ports: - - 5435:5432 - env_file: - - .env + - "${KEYCLOAK_PORT:-8080}:8080" + - "9000:9000" # Health check port + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "timeout 5s sh -c 'izK*P<5CyGuyg*uhqSFgtDSEG6Eg~1Ox=K%qIyI2#EJB5D@P^!@&So@=Vt6fPX@* z#Ko0m#KlP*ob1i5Y|J1aXcBxA1V8nQ5DXgVSVyU0{3Y3r&qoN-QyZw$$cMuetNK|H zJX%aFmJ~)YIQZFtk>{>X%hkbgVZK)#6-roS6`EQSoA%saCSNidcKF%D{nYUm<&2w7 zp0gb-ph8=UDh0#o9+UJclBDh95Y7Xo`JeiN^ss}ww(z(bcgNg4-;?Q?N(_0JJE(1_ zIpiph91pL#S>980X>DzlZ_^RO$ZaI&LBP|HPV*|6COA zKXM+mn>gC|PAb+@Enm#(Y199#U8kOhcZ*6gQRHl}Nmwf2C)3X#D>t`ww%keqJ?sv} zjnDHiESEA~omGRe0bRD6+ig{&-aUILEO$k6VY{E+Wxg1H^bjtzAA^K!7MZSC(Xl2j z{UDOsCc6Ov8{T6X0RjuG6Q2A%-e9kK@q^Gua>{KRwbKXI1;$uTS_0zo?Z<5Ebq%-z z@9;_683F z*!${#_o3#&KjbCHs;7*N$B>FHvKkp%s ztEx|pgM=10Tzv4K?^^B_DG@SDSdIEZ<`A0oYtkYk5!BS_$p5uIaCf&z-s0DtH#@5W z!Pb_uKXxb~c&~=yt~%RFEcY2so)6ZXp>Js|$YO51%(T3$%+SyI(ET>wt!Q1`H9P5@H*|K@Cm7rWNN=Yjhh<=uIEzMzN zk^nPpoUqY_DxI>jvYtJsI@cqO?Q@=r3O2JbjIr@?c&PU-Zf>(be+I1C4Ra{S&q4LD zAbt7rg@%cVikmyFq=f3>@$sDl4*>@U$EFLP)z`0NI7o?kdDB7Ah-ddcA!4LW_8W=@ z2E>sCERNd}K0?H>ABZRjP>65a2vJ~TVq%h0Q;agG7#SHG8X637h87j)UH?!kkY$bj zoS6}&OTqJH5*E%YC?IwK_^Kl-KCeq{8fC~~^IKNJk=!yL3SuVt|2_+Bz+ zb<%o3RNa2U2MqXrOtVYO!h-rB$DPRklG{Ic(tIba`-!rm;=i_zjoRZ==r@;L-aVMR(`UNvIQCN)Iz}pH+OT+VCpAIJSg!3@zHR99K!Ye9F z*>E*}X!W+a9(nA4Ex zdmU1Sg@s9_8u+FV^1B&oV?`Dy>*$QP9^{V467ny$IFh4;2S+ir zeH$C2TV6()TUnvEDE?=f8AvUhoSZ)AQ3eA$qmKV!J)4R1NbC+&!WUCk#m2b;T}Z7(hn@19Tn zhch{?EiEm3%;#iE=WJG65xZ^?*u|d{gCZ_If1YIWV zBXCV=b#<(ceJ7?~v*X>F5el(T^v0>h#qKDBZcBU)zkBS-@C<~vnw1r8^O_sIr>AE_ zV`II^up0pitn+?$|JC8#XN=I&JkKyoilDhe)1m0Y#bYiTuAIZU(z##1TqZ(Y5h4qM z3JjZ9cyCvo%YXbJLxrpLyfklxPtVH<=x%i1IFd( z!c|`vIYQ;ByodCst)O+))myj1@XISJA-_{*Z`P&0!)Oic?sw-Ge*KrW@*RNm7I;#C$zK@n)ziv2>`z z*XKeeag+k^PwNGSfSClF$7_p!bnc? z*RHNM8(ld-WErEUlUiYBWGrlGNKQ>nB@ZN$pX;%!uQTiw`*U;@Aw_PpdWRJp9DIRK z1w^H9>~`y*_PZ5(-*@c@_xW~Rw~KA)OqznOymOIW9#+ppu_csiToL~FFYjL-x`loE zT%9UQ>W#zVsB`@xcWjVa0RPtYf4dMdYpnYRh-aImRl|w*8TxxSgj1#yRaU{>YzxP~q z8fPqwgMI%l*Z;*6h*tJp_f&{j42H8sqkuPlj2qT&cVld;R@K)BoYnOCfm;g9sgP8q z(_BDIYh4m@82*0Zg-@x!DAV+_thp*3}ict=cG)N~g&tzr9_@ul+5CpIdy4L5lxmQMV)y z)0cqGT-2)Vcg=={g#xm=6f(ZSJ89WdNsbPijNHs=Oz!5XdDmZ?5Ghr==k?9y#Aq#7 zG>ps<4|{!Nby@eXCoh550kpn%jjjA;D5f)yg>fc$eR(|OFsl4lyQj0x(Xf|bDW?Ir z!D{a8(HF2DvIva!Ajc>R&bTFe5M+mBv%$Lva^|N7^oK|NRO~#fXzn9iUI_q z-A|Gk0wCD7W zg@vWZd0J4K15b3$#qIB6FA!{$Ig$0iGQ}!IbHg9**GMvZdH)@7_7_ft0Twca$tM=|W66k*_DK;qyQt6_xN2I46A z2A2(D(p2;nPhp^pljPvRH)P10UolxqagDEcdOPyv03&res%m!H@V)&QH5fb5Vu*?a z^X8JhhNuBr3|xFWfo9r&SDNE`dm;Ar%>FLc1$zi6k`Ym(MQmQ))6&xBH#fUq6)>lb zbAI_CFdN28wMm5r-6YicDtHfL7d?Bsr&hGr}t$veY;RHbQI@JfjL6Hl@ngU-8DQB7~=QML50 zUWnj)oWmc1Y+hEXsj;ajpe-l)$McUI=)}f*!5^H~kTq*>us=AIF`w5N%vr^3!n}V+ zXQd9{f9DGLfoE6)wJK6!=(PtihqiA!SPgyNXlG*GZ#j8T*;M@R+5 zFgEsz2)Xrxz!}8tnmciSfB)Nd!l2WHqz7h23O1#aWWXvcEDQ!P*z)o+4gmoH`}?mr zFy(4!<9Hc+Js<`zZ||jgiw}m5$Bke%-v<`}w*dhWp?Telo?hbzfOldR67Qb#&TqtshWlQJ{M_4SEiG3iQ}nNbGjlfuBlW^h=c0j4WL5@2LHYB~!QEQ%qS zUsB@6@st_XyVbnlsLcjK&k!rOM}Jd z#abiCEG}E)!`b3pE3D={^F@4Rcr&D%3b&g~l>G{L`EgTq_w=;{jwX0?M=Lt;Z_+Cp zyrcA+Sp9flR5S?r%HO7@6g8@KNA=u&BeLw;B2rT|)YK)_F@WHDzt7z*LzTn}68fS4 zj8>^xGXyv=;sR*t@9(FELzm1(Yp{y0uDq=+qru}c_!~jSd5>N5+%Ff0qKRI-jCrH` zi#-Ny5Y#vxE~(#PG4|5c6#qmvZxVe?M^JCCsEZyoFq@VfLt)7F+b(>x3=F0Ka-FZ# zjGOX3a^TVG^5OOCjsqfsn))D!0qq=W)HKm{rD^MYSLMr>pke4oE~32sQ4&bn$EXeK(N>?`q79KWzQ}AxFm(I< z{!B7pPxK_1pq0H~izlq=4c6j5nRurI!u4UXm(&*Mr9Ok zG#c6zJ`{atnHZp73y0N3M|_tD)1_TqMC$5?Q;g>Q+gXn7&grYp0n3xj39QHqDU%ce zzN}nxn|;?GlG36LGpVYos;;iCqGOv-kdQXr+GkvIL`Yb?99HePTU%QJAZ=WSqhI6R zQ0>~#A81Lz=2e$gKm*J;X-^iV8~`8v#4D>waKlH-DGd`Ml`= z>khx!Uvcf*GfVLA1AAyg)yF|VpeyR`Ht4H*dqW5gH?cR=Elu9Ew7&lOZw>=$#FiOL zH7~ul-E}{2#*oe?IxYGW2M~XBW-%&NHd8q!mxc;ry9l0q9~~*K-?v{l-kgCl0*J zREJAf&3JoFh?H9{p{aK7LMOE;nkbtEkvZ37bb+i%^BLFY=)VzGKxmKIA!=SaE{k+p zJ}%~4-#0K&JnyX0_mFy=8_6td3nQaW1IBf3;kZoRGB>R~g?-xLD9=`{wA16F$np zC;V1k%YYM?0_)S$>Xl=u&m`1f{@Id#u8SZJex{X2?*k`ZW%b&2U7l>|rqkNEro1D^ zIHt-&6o5{5>2m+Um8a$k$8Udmu~t<>ZXWkEf3M;dZ}7Y;6qYzFY*s|J>U{b^CMVy| z!+u`;>Gt#m@pi-gHNB?fWp@}QYlrcdV?h1{t1s5!R;h4ToQUj8%ReB-R4T|}VV2m? zm1gdl6FeWTQkLt(WXDk0?g|GXJ+Ic~d%1VzLR?btmFd*hCnSx#@uKndQuRqMi)T@2 zV3#)OzTe(&Fp!n;_WYsARzB}b| zU*nq3gExNcSJO{hd>57w*TekqdM0g3tvikV^~*gNybir-|1yky_v|k;uv)V^x$3~| z4ZCca?u)WynOw5pFQ3C3MeTQe`u7NQH>=qdk!dxUqcfOa)x90c{Wv8e5p-$)>Rp}j zb3piMWB8LfCsW4_lU;`G0dbeRaQ^iCVS4`_w{J!zwuUcR6>VfBSM{UyOoI`AC|H4X z!)=$akUoySMmG@5iMZYQt-#y!--l(*0iF2Blnx9!l`~Sl9gR zf%uZOMx5M+wMo+rn9^!U`A1#UbzAr6S1BUJF@<#G$N*Is(9DVcoC9Q5h^4_92{w^0m{pTwok#8`3 zOLzM^4Id;%D$7g`6P;;q_@t-D*Hb$?&ZoG-$Y{r?xj-IYnJ7DiAFRz)IgVE+QgdKO zEbU6B1=F1IDrVH6znv{t98Y9^9-*(Xrzr7gx!Kn_vzEzpvojhF)F_BxFhehO-txR0 zsjK{}`-&9z!!vYDIY=Nai84)Za@Qv*HI|4DpV|lvFIu_G3$R7`eh$qFa-k44m29og>FojoV94TMVNoGrB%er0(Cp|@Tv>o}N) zYd@~mBT;EM>^*%M8Spr`*8Gk0V`n=`bJLY)WJZy>qgb3#;4I3b^(+jZ*WQ!p_;KBA z&pvNA%Ah+~AY69irP=eY7|2&l&dZNDvo5ygQ4{$`Hr#F(9;U`H3rW>~?#0yH2oc2J z-?MlTp>ahV-&ZS$H(jY@p5f%lqfFBc-YDOyqsOVENr;ZQWNr-;ptjMz z?SIWk<>7*sub=B-iRoPPrS~3aL~a~(d0p!Hgc;LbozCdm@s_8}Kxn~{SzqnS;Xi4K zY*-p_KK{(afAOo=FKNh!S`YGbk3ufH?20r8=Ao6z8huTjpLG1`OY@P(y}zJ@cSp=v zhS2&F?)xn4v^6EV#NBy?b}i7RkE}|#rz20_#?$HP<#zDv5PMap?v24qWCANI`n)d% z*5VpZPU(%dV-xpCJHP&30(aI618mZgD z!KcEz7pzrXnaD~)W7%0RnXO4q?<}+ZKR(-j09pAnr%lssUxU}T6Y;yJqUnSoJny4E zKir;;Y$cc*2ZwvK6TbZEW*RPkch_>5TG?^{KGJ5pWOn%aa~W?J@%7-#nC@`M=_(l( z10CM8)>2!Cxm0<4;{mq`{S+8Ao!=Pl+yck?rur815UO%bMYf8 zlxuN5P+IrhjPTEgUrOK1jFi|08sO2-lk>(Cag!EjVe-$g2%POVK>5bwM}~r32BxRb2lcduq1E|4&+<3e53+eDG8aUu zttsY_o9(E6v@f+;%{|f=^+Un7!%_DlCo83kC4fCa>C-<&nDug&Ziz2Ut$tMQckU~i z%dd@>TZ2;QaJU2u6HNSj(;VtAtMr{!h=lEomIQuwR?zeh+zq zYAN1_N1oZ8uqzNL)UP`hA#n{eOBV+(Ptl~Lea9ZnWa4-4%-CTx%6X?Y%R z-r`j``U)1(N-~}SJ-h1r9iW<}sP8^HoweAO3iO9%OvVqo>7r_I!qV zVE97Iilq}shrT@O#ps5F#| z&CYHkSrcSRX!S)IR`035jw_QsodL77^<}PkBzGC#>9o-fk$5(0Fu#Sr@A)JXymCN2 zjc>A$ty*Kvx${n6w>|u*>pV?+vLTW->hkr!vKE6*_s2cfyX1OA_vgpYocDbuzFErG&9*K!MH93tY)qP9D1)h%V`A*WYr z?xbl9<=egfucW-Zb}kBLvmK$?I^8?J+aa-Z-Dq#0A2vK{YC{g?m=B)3z;&lYT29aY zTYIG%7jt=C(Z;km=BbBrb{2;N0=(z{maTweDw`S%@{xMlJUMmhzXtnFG%|uRCVp2r zxn@DGqR?v~5aIQ5mPm;f&LH37)XQQl0rJY`h;} zLnTRN4OCz1mxfo@raFiD*+qLBYyo5S!)btZo zl4T}U&f6E?>NWUsQUmA}PYDzLQ<%=4#E|5z+PlWDX_xXkW-llz(&7_+>q4IQgX**Z z^&2s_xRF1EdVAdGWRwBnAJ_k1N%a2^{{OSg{r?$}g=&vFMhZMSHEUgmh?nlaVMo&g zOnZcuW~YM}xd=_>hs(ESuG2xDQNHR~FDkG4zep7mHf5#@`iv)shk{Koe+sKgE>)9{BVe9R#shJ(AgO^7O9fm>eshcC4s?=+(?OZ>pDA& z*^{{QR=jNs zm*@G4^%A6FbKi5EOBHrSPFdQFe}b`1zk2faFTn{3ij!sVda{>@as2E*X?izX&f#Yt zt?U2M6S@`SV0oA!Q$7TTKyh|sNosaB!nEG$*S`rG2%n9V9Xl1u!F*`vW6||PcqSU5 zIz0J9Ro+H(({3pQbec?oErSG4$=Gymz{Jt`oFYOi+JjAjEP<+~3@*HS`#g=Uu_*xZ z@z#XzV#HZo)tNd$D_Vj~h68VyZT1Q!jFyRMs8|OnoD8Q#Z7X+V5Ia}N#H62=*&YW5 zD5I;VEN%a@lbbQ~`WD?%{SvR`dKyDqm*&Qw&w)Qz{3oV6A!Q&Ew@9VB5EJ3H(bUt=oD9>0DM3?ProS55 zj4QVZsh}_anMwGWR|0&6L9vEGvDwG}+>cH@nD+0}{{_$Sp9(m-!kT4qd|&Y%dXG~r zZ9l(^Z{9VDcEt5l%^MH{@(0>I*LO7Zv?8jQ0xx0+9d;P%rDa7JHIKXRzWKH$xW2kOjZSi_xJ5pewL4{Sc%mUE9noCyDcv_N3HTv6>pAWJ^GzSW_tiNd zGUl!5m;&9$$9%Bnx6H_GW~N@ZM68Mf{T}R8=I>vPAq}2pbL8o6v-{|0%6{a1d&Ia= z{_Lu;de6y}t3AD2&YrIE#i5{B%dg*c(H5^_a=40{5sJipTMg@1%1FjPv5I5rtnfV* zCX4D7G?LBozXBg!3Zz3>l^vD+%;>Gby%_fuaS2lD+L|iAZ^K+>4PmaY7H%uKJ zFkUkNx8WbwSTnw*%}mYH}U{-hn<=4E6qm;~mYoE(tP|pbBO6KPLU? zN1paHLTEkC$d6VP;j3ijlFhDDym+>6^=eTvH&C0Ien-K5W(aMjG4c6f!r)aSo3A$Q}E_|6|$PcnAqkgi3hXh0UF@LB4%&h^pj#MUd$ z8LMV9_6XZ)Bvm?tD;%?ntr27@u~ect>2etIk1$kG2<4fo920hZl)l|4@QoCSyy$=b?b*UCIfP9viFD2B{- znBS*76ZrNWgZwKfpE<4Ir#6Ka?3QEn=7nl+q*c{YGV0A$;*Uf=t1-wKDXCJQe`3bx z>KJ@*=Sq?<{-UOxLQR zz>vN6Z3#SpuXB^gR^=#|j&0x}6cdA7+Ru^qa#1?^)%1l zTgrV4*4;l1zqk+bC`1 z{=2_7J}Zj3i@RG-d*iHgj(!*Q!+SOuZ%c5;9-rT?6g|4mh`;!s3ImXWr~JPcu}dvi zPfSb7@VcJRBBKx-mt4{6P=lWZk)+YmQ(YrtXntpg^^F|+`-Uc^Yb6_w=PF_h_Hi)s z2K_S+;||DbS*uBkNM}MQ$Y%n(WrbyyI$mcQ+VbxO3;oJq(l(fW;v8E}{wSu-2+T|B zpTanzN>{aZ-l?ssVerc(Y;zmE#NcCIPboKSw(hQPw*0pVDLagBv5EBE?bQ-36JuX$ z^miJpiju-FFqsv`+Av|oDq8XGvjJH;yjhh8i}zsv`|c2S@;HS|PfUo2pCo!2Mi^_O zvu0^3TlF(-JGSdbaL$K=a>3_FX zCaZaCHUw%_HQ&pcD;7sEQB$B;XPFrWl;o(X!?UvqfO4mK zy;1YZXADU`6}WR+#Fk-YSAHhrzdXPAK%%7w$qRDkphbbEI9;GJkHC8m+hTesfCe8d zAPfcDwz$qJlHv{5xB!V1!_I=||7J)aEI?(tAAL_%&60EEjR7d{0Zf)YTvXUOu2 zhk%MG&ID(OwmIJlkC&Ghs4W7j6+R(yp5j-47=3H1+)$ zFB4^8mT&8>&q(xqKNs}7d4WEZy(jsI_;Us_Kb9+V zhrPvki2&s&MgDSW26wZ#bIs{06m^^YtuMZhZe$4~Ee-aWRDmJ^K$#j)VWbOsb5T-K z&Yp{X6V90Bab9nkXf$)*Q_Xg2&9AsnjEw}5P3a+@9AHjd~&D@I%Kx<&i z7EygP>nZk)RV*L1rt5*OT9s3WkqSnEfh76(Wz4ZA2K9;V?_fNS>tU!##zD#$p@05-rK6`mJU%Y2tc+S;*H(L*hvLEy?lE}fI{^yJ0F z#KgeF%%?#}HH)zW`u48|dMDxP?hX|6%PT7Swj7iJof~jxs@cZ~3Aj)(3P3Nk#WG`= z49ukwj)_=J0S(|nbB7dw)dI!o@x8v&TVifZEwY5ov#ov%Y;3uVAk=@L_nVSFpqB$6 z4S|41JkUEp4hv|D7HzmX^qKW*Zk5)h_;RT5VrBtluD3V;xkq-fT$=0w;(z*tBMgX4 z0O2OcVw&j5PZ*Fl0}}xhD1niL_Xkdzi_bNnSKDi2g&D;IjJH??D07E}hvVYlkPx7t zBZNv>d#kHgdt-_DM82=KbKjbrB+ZIMj~Gnw>;SCo?@ezHAnXB*OoT+l+L}JH;QJAu zVkvt2S}dTFrG%G0vWiP(zzKU(3?sJ?OMS+GZw0ut@Frbba3uVE%P}glWbGq8?K}fa z+X}o?67?&j^(~8;tRPXiEW@IbSf!DhYsh?7+u2g$6;uJSeK!ZSYKda+(NDM!H?^-0 zaoO+ym5okJL<0ttulze?S|?SKD(QZt$Eytp3FnW`v-g0xFST^3FRViUO2v+c`@o9& z+k%B9V-z0W=fTU==?-4Cv*ij_Tf?y7p)u`7F}EhK3j1z)H%uySXG77?vmuOkt8 z-2R-kVy{ljM^(%a5PhwX-DLo{!Uu;|T|i+I0{FdS-n_^h$Jei4wHhoxDweALGe7)| zkGhhg&K_m<*@Gbx(Y@<=qvO1XZJsev>870L!NNbtoK61>%COhGCjlGC)^P{@ zVcY{SID3X^qz%|D*P}AS-gk#7D3F9GF3Vk0IEK#*UT$AAaWcf?<@&g&e)AH0cI5%f zzI&c6@q&<7*K^1A*CS`pv4TLe5i$3=ANd!m81|KE@eeiIeKmerv`eUtX;B_WSVW$V zi1kcukfwg-Y&K~{^EiRR1&J7T6c&LC<15T2+b>mjV`-$ zg^ZNQs;C>UqmerOGjM;#!JDC-Jx#Yc*cnS#!Q*xO$w-`g$*^v zi`SejwrMc6KJ#buTa&lGykGY|r4N#|hn`QeN7b9D2?6$;KqMcziSSar+YmpbT$Wv*U#TESz!kt9&*qzNXW+1#xdn-ZB-w z{MZQ2yPykzCf%puaD6e zDXIA5NcmyQA$@<}9N1#CS{(9$CCPezvDyh2n3o*&{S8S;jnG^(eoy8NF z8W=KxgEU!5fh9(=B8jU5etTAUc@|fkKwQ#lhw%?J_LUos&sv;-?kbJObX)N0O8U0m zWrkpXimCMA%n#-2?@o?OV(ur1e%4PG<0!dCw9flE;sQSh^Cgm9k2coBBU$HV$)yyH8wdG9K2 z$Me9nXAQHsIF$^CnT1+{OXNLa9w z6FjL9K2rbpnwmJk`VCD@xqyAXqeCED@!)rryDb;K+v8)}6;TcrLxwz{SC*kb1EvH3 z9KTna0oG2GJd|-Mw54sO9$EP(LrXn&&d%if4vFI`kL$=e=C&j6H)y^?c#Bb2Edo0$ z$^_P_6MYp1TFHGFJ{>QY;d5Wcg1oC&=>Zv#!>%!(HNloX? zGVMIrPbFKC8e7jLK^~JTga?q5{}=EGH#M2vSRYU}z%Is2@!$yUoiZnj;HWS!t!)Sb z3epm_S=A1I=N#u?$4%$Pr%{Pg-@@Fzva)i|-=+GcMr-Ut7q8Xk1EPHQZoJf;7{ z@#g$?8#*bA@t3+8@Ta+rd0BsO>5nvqsMNKUJ)4hWK6W&beY>McZyL(im*=bN>jZf! z;q&7bU8b?Iv2-@G$Y>x-J@xV??b@CLNF1Q82AEd1_erY+*+)S02iOu7S_A;2lpdMP zfinvAOAhU8yZifWMtx9#5ER(#A<|1C%(U5vfl4fZnSeBvK2UD-1xz|u05@+s9DFo* zbgiPPDGdMttSBI_@QDHqcy;3Ft|NKJKN&Z$RRJ&Dc4`IA1OaEDSQ}qc%~&}&B%Gbu zfzv0+$s>eRq5nZaK7D|)9?&fo)Ym5gP@$r-QrdnNIIl50k$UC`92uZMGqSY&21t8> z0_XMEWf8ZE?)+E=y#W+Z692Gcc6Oe!gr3aR_zdP&Y zPbNfel|FSb#~DiJ&+&~fpi%Ls|BsN(*av`gpH)=Yyqv?)>lmWsshpRwvwYJ5De+w9 zfeHXGqkV`dfOX*E%8H?sOZ~aH$aBIST(<-`6KgOuA{GI+69a(u!=vAho$-*iuT24# zk-=t$@OBoexfvZL{B?KbFI{9%0S%x~24<(cs_Ly|5ROPXbrMi%#Yasuh__?fs0FaK zDHNu(D66>=R@-F`fL#OY1xPyqRVRSR)ab4g@`30An6Y0sarcIjogGtgaWUH$`j9&g zXkA#<1LmTizEADv@&W@QEJ16>R1O}(YrTu%-Tj)!cfPzd0SPi6BL-QO;=`x4>w>z} zD}N`N(1xJyOdYzY=;`^c?nqn6-;pTHnYuv%z?pROi>ZoC;-B-=efDyU3>%nPE2PUp zX?wx-d!N(xsKt(|tjtUVeS>?Q^{<3HcC8Q4h$FIq((s!wy}CN(2m-0l_&e@#LwjZ` z@Cd~wHJ$h;$$p8X!=xsR->YNfaUD|wl+8|itHxZn^txV4(7Wxf4 z9R@+XmP-`&oo$&#_6XQa=|Qo*?baIg{w#FTI{$K{?@xw}N;^tYgUH`;b1X`dB;(YF zkaK_V=MiDJp2?p}(dqkT#h%Vx7|?kHIniMX9lCWa&{>_d(tVC;&e06<-I7aV)eVx6 z`6)=~)VSK9F2tNFQJ^CN*}FX=JkhD>pVCo?dT8si2RUVqi-e85s9 zAFC+MGu&_>I#9eFPxyCY@-7=E91R*ejT-wjT^oa8LO$End>27y?PQ?D-=$~L9A?Q` zq<=y}yZw*)lzo}eQKovbzTZc1b-LKf(R95xO(;NC!(xz_t9>G0hu3|j!H(;&>#tMC zodx<=VyGmG-sqGS+&YP7a-f|=9?vA3g;*t!km3e-G-78h+nrkxq_5M2j;)=jUL_Vu zNFjn2N&yk{JErV*yI^ho=n+IOn8D)y}G>89kf}MT(X`g#q;PPjuyGr6D z%e+59oENY4__67nD#7tZBqJkS5D8q+nT}Y6PUksT0H-QMwovpX7jny7X29f>KQYL` z(@av9MqQ<3q-g4!_yfu#ptxl1t*@r8tiusSWfV1O4Q|b`<5abCPKcib^j0l+vUL zb7g+TS<SBCQ&Z!jQY3-vIaU&k-D%(Adn(FB5!wd(8E?0w*$3C95Nx=BbR8eTE)7 zmf13_yt8q0=)EU2rEMIqD*n9FPe@L|IRo1m2c-uij0U1+fw;3WB~((5lb)aPZGQby zD^wkgfX3#T^N3!jjW8Y!Uf1Xu%S8A)Z>?N$rI|9$&p-OR2w%pwpsfwBUf=cbXmpe| zQWhZt7r&SHK+>e4zM}*$M&)W3Jwzvg#|c^#)sD2fKK!ni9$CT|cXpKLxm1ab36da(_QnjT!`^|K953pu^bM+cX`puF-A@I!_tHus}u6NeF6++ zrKotur~R(PhXm>nMNKp7k!vpg=9-h8BPE2=>igfT4+&~^tg+#44idix%#qiZsUtjO z-kwJ_e~~e`YpZ#Nf{pvTrK|&-z6p~cgBCd$eaST2^M9esH^s`(jrc+; zUOsEYsl)om^;1Co5k$-ZB=-A16c#AmedFPZ=rX2olQEYQad{=yKIbZRC>UlLZ^X*SOa|F-^*T@F@>1s4M`Qm$Ods<) zi$`&2A=Xur%eOqA^4ktZHmdDsktP|p+!7=q_TuXZ7e_oeL3Z|6%MoL)-Lvo?JbLDP ztNnEhB6*U{RLb7#ntsN;ZgS_^5Tw2#O*z?AZLSib>J4kG^w`>X!G_F5{o(8sCM0siUXn{O_`zD`5*-AT;y9loS&M`z#EXt(L30 z10qS1o?~0$F2*hEf0tcAI1ae`5PV<1pw_^=CFOm9bZz1Ffi#RMw(pWiyt z1ZiE+YvJ$&OsMq`zrGxd3>f3|7e0+M$DVV)KG&SLH?Ya|>9BkyS%OQ|t8JXK;vrjp%I&VblsvCoI@on>*~U*m`C zX-K34Nbi_kjmETxPJItaL9}qld7Bya@Gtx2-rqhJ?wuLYxd}(p)qWG$+bf;!h_%#! z7WHUPyuQ7J4L#rmo#N_W6fHUpKmXO$31!HksNFQ5j+!=ZDUh?F$|-RJhnDCwi5Ggm zQUo?S2^u`l3Ag-Vm!UH0Xbhc+W%Ap`?Vt;oV5}fT9@rK_(pZ~kPr@j3#YTsw?F-b_ z_ujXlF`LCSn^5V#G;USuGazutY*U*y!!i#$eLT+qJO<1;2Bvmy4|~Y zg9)O=Y^XQG)%R;ZH2XTfc(eZL+b`Q^H~2w@i|D*tOnjMmtC+j09<-!Ca-8=_CRt+L z*v*YvE`#QD&wr4wR#Cp;#;qjSvb78k-x?;ddu;2SY5LdLz<~FwH>;B0p-_uk+7*6M${*ExNvYE{*Fo?UzIhuk@9l5I#@l<68`W|_vmJICoeiwg5T>%G@b zF6321jvk))VDDIAol(8{miJ4t@oYnbi{0u3ZUs%_45ypO=8}|uHgo0MQTyihrmuab z)A#ruh=T-76bDR`AYqzpQq1s#p^@vh7sBd5ZWn8Vg5s>FAk_NfIq-MJx@B1A?LsZ9 zYysJUbZf62Ke#(*Cj`lYAG8y3;>Cc$!>5UEe#wD@kmpnWXIPc#e9%-X-=kgqYxS!C zEvy_H7`Qq7i$KV^O271Z#Dty{HW3SK^>RhT%LZ#tbY#@Y2~K9Cp}a$B-=R$m8M6wSuc)9jn6@HIYZX<@NEuzb zBk3A?eawL#d&nPh4}~iioV%zH+c!6GD#=oFrZw!tJ+eac@^k&5%N8d%j!I12(`h?L zffB3b2)ElyPs6q$f8WzJz~vuNyE>r}o7yFh^D$M#j1WG~3A0~4x3r@giF=blL+fCH z7kysWR(?Be)*-Xhg7`c17d*$^g11~--bPnlXlx!}dWfK0&H@V`qsJm{G?Vg5G>Yo7 zu!uUnu_ARH;Hsw*z)t8QC-7vQ+mw9!bitJUaq+m^U`_4*9gc7l_WbtFcak0+O#?0H3_GD9b&#nne}Gs>s;7i&9@Q24zroLwp^g_3XVn=AuwR&FG3 zTh6D8pQax_6Lcr6^xfruE=y&aAHrJNw#Rt&HP*L{y4Y+t=DcOD&1IP}%fGyMh@ZgF z7cz}OC>Q9yK~$PL)*izusif%KdwM=|u{rUN`o8T*H&vApA*&a(?z1%W-a$lCF{Z{6 zc;O5?-r{b)-A^b44`;`$8xUkk5hhT}QEYsW6Yo7DNq4+PJz0_YEgtGS7=$wx=Mag} zRrSo?MYp74;p&ZKnfjNPdvxrG z1FzLjOFRBYaY|lYqf{o}(2>^Bj015lLH&h#?{I{%AsqpC@#7GEIvxEp7 zjx{NYw88EzqXkaE%{`hlqi;E;e%EmVgJ{eshnh#1XGU%w>C17sa zvIj)89Qg<$8vj6rNQ*6&iUynZv1{GBZq!D!wXK|H^JU2-NEBB2xCtQyZX*2fw1+!Y zP25h)>h0VTv8LRsg1jhZ+H|TN9^9tr=f5;E@rjFE8=823gkM^5REhQMlNwmLsW7^u1O@NZ>|QZ2k;2 zv2>(p6a%wUA_N>cKl4~nYkl1Lb`K|!rG}RqPIcJkRP|WXrYup!sfejn6B(R+P<$l- z>hgS8m0vS>;mcLNGI1J@F3MT>U58QbFcG`*KLN^M=({V&%^2e}V_lUO#7d_PYSkH! z`)OGPo}?uU70en}PHp8+RcznxH^)I?Nn#RGW;#LUgx4MwARbe_(;e>7x_m!m^L-jf zruY)G`KHNtzeK#q>kUGQ&>}#1$)oqb8R9f*#6Zom)gtfvc$ih4`P!}_{x(k-tUA*e zz0ZUH(f5Coyer0A&9t^rqc^7}*YHaEe{W?Z;nD@AasPbzzkClIaqGW7^@jY4TfQbK zt;td1_~o$&`?Qv)Vk2Lwq@eV_TN=;3&Tc-VKQMw{x4}P+sc>xX0%L$ zdd$*hg%(4?NSu-oSCH{QCG(%;^Pk7Clh)7z$euG-hpSrEX>vy|k#ra|ITKSR>z{+% z_8jEZ|9y_F<19XtVwqCOyreG(*0gxz@?TvI_}bxH*PeuLSF`jX9O_?@HF$>26XmJ>s?hy@=+sNogWFstYuhWzWdn-LG#K zgd1FLiFP;Nu@0m%uRka^9-U&PnWou4PGREx^BY>MdFm|R+hvf{Gym@YSf8@;M(*S2 zjDz>Nkrg{W#d}For9a5g_n2^0Y;v7z{@XD67(Iy$BXrlEzu3Wnd6}_wz{8e4u)aA+ zue&-KwhMGWpVytaywh>yQoZElxl{}V18TJH#>pyLX|)j^Wn37~q!6LrGF~`oPkuMb zvyII7P#Bi-5BvC`(ERIlYSA^?=*5BL#Pyz8fYsGn&4+iIL3*+)=+l4!!|uB8P`9A6 zF)6^dYiwFkNUI~8?`HJUzQp>ZS7Zrl@_oxVJtO+MH^O!+Y~8IUHQEisPTLz+#I*hC z(APWrh}8t$E}EJ15^|@3HJijaD*}htx@HP*rD&oH{=hJ=>dC<_99z7UvY;v zTZHXhNu8Ug9G}~n&%sH5;4}4PgG1l>+bO?K033CS;ts{18iJf&|8G>~Wy>|j+(}I= zuQ9Hju04CA&^L2|y^`bEyzD7fT+e=0Q%V}Vg`@*Z)+$yi$oAEr>#{fy`(8GS-$g@! zd{@IFh79^j0Cq1_s}ZB8kX*i-&E&=btKbeEDDbKmwG?r=#0k6pY@zQh)~{^Ii!|*Y zgA`e0NfLw!VbeQ&R(y{XRW*@uJ%~-`T_HG?k<(QwKk+SlQsi?rj!c;{B&&2}ObwAG z+OsAMUpc1vLMsVk(ze~H7L)C}I>Y*+Xvaj16HyM3oZ#wRKLvt|-xE_%nS5+;fZ;rC z8k2e>^n#VK0&DhGtRoB>$VF-y4NsLRYgSEc|mBn1s2Ppc?X1`(A zqih}iID(6bz+I>5{A6RPMMzTAGBYhJ4gyVt)GWu`k@DQR#Qpxb02bGK!wE{_V~Zk3 zqv&izc2ai@8Jra{$wda2_8_py_sD}TMu!oLQ0W}Q&uzo8;G{&fLjth6G!ih}ah6Oo z;_$B#Yhtfc--6g6fa$AY+}uysj#1*tIM7av(KsC9lS@3$K_XI*>{I*?C-ev!*gFD!`qtqb>cbv8K1 z=+&SL+J*N)!ZRL0?@%~Q&2IWxwxslcwm%WJA(J#bGt{|}1 z@*lDf^^boM2iJT+>@Un?i`;Et>gftUo`n8u;#YI?O969gBA}ay0wJc!=`;-IW36nz|m#lD%*Rq_tFq(_Am(qa#@ zUPX}F0+j2f8WgnD)#i?&2B@tjDSgAK;_8d3zBgrG4P1gis>65Wa=>X2vG*vW1 z#X++(oIm|l2X?2J!IRlLYwqv^g(8uz&CDz_lh+3>N@$R5+Q|>Qkmgp$M7b=AvH8WH zO4Qz9>vu8S?x#tI_Q7)%CA4D6fGLkFWtpGjAd*mY`zMN6y2f??J_oeJ(ebICMM+Fg z8p{5F3kg%^B}RX3?oZm-Fi4DO3-_H5ZuQ!_=vg>h{pu=UY<8ii1Ym(5a38*3Ac*Hb z?1krH#7_9APW0jcEp0&{q-zOUMa_r_nv@Nc=H^xfhgOj5yUZv_Nyw=ehMT$h9P5s5 zsGL?ML){JS&McXKY>fG4YjGsbEDnI4OU>PWrOyoOz|Fi;LkvrM)PD3hp4k>uh^0pL z73_@Z0}YNq+2P(lN{!!cm{S; zfN14`VPZ&g{M3FOwMaJX0{u_ThAdp+?1vlt$*x~S7JpjQWN){<8(iT2FzoB6ymBrv z4#}-z78PY;NRCdM?6PEYh}f%#Vd&nolO##x&Rh7_W3HJEO?J>b%~!@sT3gZtdfI$= zAL=t)Zqawu?aqAizj}6yNt<6lQpM!^5c@vP)7M+RqPbXY{=V-dW7AOAR17)^&Oh?% zdfLM+*^_JZfN`y)>fUy+frlu)>Y@!$Qij-k#q&DVTznfZ3sOJHm#;nCw1{U+-}H!z zrODw5NFQ1w2;n9#DX%WPy%In&fhm^FB+Y`I+ST~WZHH2AjVsIZ!2oekD9X2Uk#8+J zu`BEKz4H~Nvz{^0gSvdt=GQLg_?B0^QtxCgucth>1w(1dixnjKs`;b3+fKc#f~JvZ zVPlQMIhRu{Vp}F*(O_GRitYY%)+omYr`@(naisF;Vy(j=*xcdZvTsem3hKR-^F{IN z8%D?^r~6SYu(ZYkK$_dU&0ynBcfW6<UYeS-fp5Mui1B8#Qvk~1|a)*^Fr;(kW{6o z{!XP*(Us-NrtJ7O-ZzBHs+KT|!@UlC?x9N*DPPvm^{;QoUcbThdfBFJV8aoLAGS|i ztaVYR19G=-)`n%~?@FfKTZNaF0`g#xrTWj;JSVdf)wYJR$;S4bDGn!QRxbOO9h2QA zBwQ-1wc375fpbi`M2GO-nEY*r~c8C6?Oji zGdVxVc9FrP2A$TtFTIrx(l(M?!jYLYYt54%Ad^_(8-0_-r}~b@6v!62`2bQ0z>{=T zo~I?lJ?!Kn=X+;{1j>UjAb!vMyr8(M)cDFhkMrb0VSnI=@cW6z1;~?!%Hckc8SCO> zZ+A(MZqNh_hx6(?ml#~(3`sRhv<@Azy#@Owu=5lbhjV`5nYr=_u94^ZsSlO~zpr|% zXX|o*oY!+|Pc<+8OIo;@Qz+n(hFD0(;}w{8#2=!SZ*ZAW9jB=r!^_pb(KI|7qRlou zQVDP88I>OGXHSymf0OR9pn`2?f${ATe76T>_fQ5=b=Ym!jJa_1^cp^Ud+iy<+HnNf z+C|X3>4;xW1#{IZrXFdOTz4^BZ=@jq{iSHxW7DvLiQdlP?||SW=U!ok+fH0Nhr=EL zGjU}kV4vsuI3)Gd)@UV1ujZ1aDcyR_6$lC-=5Oc7UGw8fNLth9vDxd6A3TR8rDu1? zZk|l}q6~_1dd&Hm-w&ZQlj|)FSuaer0Fr~?ZlOMSNf73)TBj33+ z?%q+@E#0N~n9!G*%)Tf$G~*CtggM&ig>vKhMD7oMIqy?s!Q&fEe#JM`F3gg837?Z2 zkzH(nFI4E01OAv{#DA4_aXci>*{;gMR_pAD)_&w089_pxRoqp>L0ge=ijSn3;XgIJ zSR)iAMzg@Rc<6GzNmuttYQ;c8F39uIV*c7&pOE=j(sCOuoyq--#^}wc?7?4+dr@Tg z>C-^%a=TZIS5#&~%35yeeuu1yX>R*Vrz;DHza}sl)(74vFyRzkzw7s^t{GoYIt!R% z9?aB5f~Q*-v>9od8DVn5f`)dCGp;wP$L!Uozm51&_hTQD?jjj7+rSdUyC52f zko`p2J%Dtx(?(3Q@<;c*p$WTpz1pi&KpElab~{GRyp>#*yOg7!e1Ajl{|YeKilg_+ zrb@^h>P6u9+^3jt_Kts5pVS;7hNt7FFf)B2wIglBh^}-SM2;^C2p*VL(OL5i56OA?7Nmj; z9rW{Z3Xr|*8t!CrEMYj?%X8U6g@GHSs^cey*Xq*5k!Fy;Il7G9QijL}{U|fH_OOI5 z7tLm8QxRWRkrGG}CtkGV1I*e(qY=XQ_8Z=YN;cMna)*yqO$iYs3^|)Ir$JKd*Bce1 zRFzAt*5|-5`pji7)o4$1Vw2>`BFu)3k4u{}r#HP4%vP^>K9!@|GhznltUjV8IhO;B z3F2h(r;mpkF{e#vjp{F4BbVZ$Uw?=h7sLZptU4h>$a>84e{@R7$oSy#k&cad$|a%2 z#gDCdKRWEyi#3*Tq zG9~GsR(aN%%_VZ(;qdSbTxb!Kn9vIYC{54;5+%*02B=GD=uA8MWYqm|Tcy6$XAx!m z3{nuRhTA=}-kYoNlMo7ad&zRuBsn%{i6u+=A|%i2T6I!XsE;2s?>zRhi(;g>w`h}F zLlZKq$f=aF5;vMMk_7a3GpCvfr*Le!>3!qrk71oOlw?sM z!5a7ExmoCd!Zk%jVO2Vi^+hK%<8AfR0f^jHB zgK@|!rI|N&?|9qc{8;r~kbF*y&x4+5YWkzy`XkCSR8bMBxsqWDIZ`f7<`4b)->Udb zP+V|&Q;V5oB;^rGa?E9q62pbw&Lhc{Y|wYX^)vH~06W%xQUjv07Gqf{zRX#Zf|`YH zTsW;SAV*E?a+!>awNOjS7$gH>N-KO{j!lTsp$+k(E;b>?U{uswBwQ3P*#mfWsl&Qk z#!@$8NISeulZck5m~uV00Ske zLO`j&ycv?^5e-q+AoPd^--B+*&3w^d}K3rgtN;<{>lTAy3Zk{lvc zxM!ykatnTz3k1z%$9P=d>>RYMGAPd>hK){%p{3mg{V1JNYlJ3o6Z=)wFrN#@H~PFG z60Tx1!2iI+q)ce;{PS@md9o3&T;{20m;zUIOjyWWnUbn7aPm;de8j&s-7`69y0bdP zIf%>%8sbLM-Yr>=;J0@xYN1TD04iDbn4Fw?6rfnJtTXD$(Ut+}w=p(8>S2}U(D?8c z8L5ix=C~ythoVe+_?=Dw3=)4gZM7b3>xUMcjVTk&$~q+%J`cQpOA}C{MIZ0}U9& zEq8Q3NFlb;R1{Vp*9exuD=2Kt8rYigF`zDmH01|oWN>m)$*UF+WBo)77rqKk*0AmD zO7*y z0-nrxmL*It8LnZimYRaMdWo*pGS8HYYiYvN66HvQ2@nY5;ta>@?Yd4`>QQQoD5M#X z$Pr};6^H05OyStHGxbPB*|JD3u#3;VlB;>#xgoJN1Pp`zGI%HGG}%;{=r2g}B>(cr z3DHmtLjdtF^@b)Jv+K*s80;U6V2U+YQ)7g$4A>RKUNTmPfM^Fl@<^Yp+WNv6NAxnZnh82b&L)#d$T@W!#TgifR zSyYvmC_E-cfirNb+hzvuh9+)=as-t>tQoAGLx2$-CtWNK>~r(imm&kZ?PACW>J~Z^ zc@c)0>K$@Hifyb-UhhhGxF4}lH&qMTQvN!?$!k1EdAA`KXL4|u&*Yw$A?Qj3(wCR( z``p3OlE>^O@1dk__~_H>H?AJ>d!`3%tx_uwx4mc_bp9ibP#@S2<)RyRENV^4mp)fY zOq6df3ckKj(U4)=X2oJCMqgfR{mcGw^c4#}o4|d$jJmod_G4QhJc5d{$vpLeq~;jT zs!VqM=#oR}=KsY8^U|BtPabVBq#3=OING+ugZ74K5C(GB4|=CW zHno`!SrhJ#lZW^Qj!`n9jLCY@`Z`MSVMzz+3rhJVf>A8 z29y)~jMol_qYjL*%eeBrkpj6nH}|g>Yt@v69V&&cuQF^o1)g-j%;WY~*h7&b8gMN0 zj@_soKRCV~QjC+!UM*Nw8ls_09TbFQ-rxQ|P`Xkc?JJ0*s? zaGIQ>0_&y3I+X`EDB;SX=k8d#WnL3?Gy815&NP{d(cuer7oqdgXx0ajyHuMp77}gd zktaYA&mM)ng1H3%jMCh@9urhI9q~+7-{1OjsGn9gFTQS3Z$5pO?tbI+Q76oCyZVXK z2DRx~6>{nIiny^f>$hemn$9ZJ(?zMaVHlM%h)_ILmDjXYInEY8+ z7})2H3=)fQO*r2?WvxB~KR+g)EEaChL)dO+N`G{{JkkAhy)&rUo3=k;D98U~!rlCI zTp8S}*mx#@xB9aQTlqgO0F6Ffxp6t!h;El#y6;QA^4s&~J9!4)2M=kfy%ROQso7-C z^b(xz+lp`B=9Q!c-Ybsn+n)J%a_6@k-&diJ8~TrIITk;rjQv-z&be{zU1^6H{;tHH z_Z{?VbycyE@~8GX=#P_A-$8ObpR2ZJ#s6Xd8Fctf!Ytx~MSXvgk#9U>&BrMe^tI|? zhMY~pZ_dQG5xZX3D0H9uUI{XKnzshA0g7_5vP?KYJ?41WSG#d{#$}kAjD|pO$FY~4 zy(K9M*6#|r3?3O_p_>6(rlRFqTq43?Fk>{}wdg3hQZM$N#7kBxC|JA-V=*IoLV$0w z6hY%o+Ym&h6xpe;83NK&XuX`wAzFri2>4^9X#S36LUvAvF6aqXt88WD=rdvflT|}? z&`1j#{wPXFb~{hzv#ZNlIv*u%IkYkCC;dqnuxmSro%prw{cFC7&}By6Da(paU)!iZ2R$bIzx(LXa@$I0n=$r ziaYLDs-#h4tc+$l5huXrcrROez@AH6Tmy!zGEk<_XyjN_;n*JKfOwKD)p-&@lA6K^ zB|bEG3R8-r3aTQZ7J=^Z8&^I=r%Z%|#E#RXA%kXIDTwZYG;wU+zy=w32t|Ur6zSn4 z$~!HWYBnUMHM2d`oDltNKjBfkY;Bb2fif*}(4h~zpmk$CSbjnQtk56aC!?K}Q&JKq zYY-PS?3|MhvI_ofnhoI#p1_OWt{wsojF>vI9hxJq5th#Y9|Y^4t&a9)e}f}pR*2CRh?JodG5dj+D?ScA_|z@7d5QSAE#o}Xaq+)h{bed zDA_MSmNzk3E7;e7hPjm+PI;+mFUl02MG6ubFhj*$qa!zO{h6;51Hjwjhrf5Y47S+A zf`Q;f)A0F_v~sl(&H@*+XT*XC?0^}2rCZ4NkKK$|FcP8@V5u33H zf|h@aRKe6iDl(Pw^Iof+z+TEbjUOqNXh9pI*~+68qd^lozZ1g^m^2Ad2hPLfQ%!@c z(7H{NMSM{dWxjHvkD$SOfGB=LBPdI^FpQ^4M)8b-@>3-WBvX1*6a*P2`Yyr0Sb{qL zK-H`C-acF&!l|O_wpn6s z|0Pmyd{$WhfuF5L1Jaqkj=RW11?DN)tc~-wYJdbe(`vA35&<&#B9x@=w`rfRA76ht zq$YmAFV*J7s2hJRbipO`{U&4+ud3^n4eWk{Tfl~AI0))trX3^MqX5~SJ)+euwpgO2 z;~fs=e&6|BJ0Wfr;Fkczjx)b^>m$7A_!KxfksMN~94t~{;9?Xb*gkX`wajmpHBbj7y9_xhfm$z(*lEGy6KuN=(SReum40{UQkqjKoo=ITyl}?Lc$-e9yw{}7 zU{k@Y7L)Ex(eO`2uiZ0uR#@Fl`KyP91FjmKbH<{UhHlW{FZI^#GV_R0D!PTi`PQ%eRcn)pXUvI(GM_8pOuNgXK&O-zDjSsl)YIb+begDH}mT zEbY$s$dp5QIi;6q>@d*;#Qb5m`C?Jc9@JCQzb^W#YE}!>>`1Nd=uJ&);#CILHMiyHtA>n3D!M$sso*CR&060u(a8p`eyaLYPW zxq{BjudHg0tp<+T&XE?zO08*o#GJ}Ku`Ea@9@BJ78p42RnCDKF)xfQ95xQnRr zw{hye0bhI`zN7)*l)s;TS7P-Yl8fpl~mGH>YyZ1k>E z%uFIny9aZ}Dh?KGwJz?6+Q7{nr*4=i8DRhOt+0VP>~~J@_ke;~^}65kbfzhst{C&=EGc!m((7=pUyKD>3Mrgv=pFy4Xm#c4)Kq*+ zPzjPkGVIy3V9@|$Enm=Eq!clJ3tm5>fMzd@@b7HM{=Am;oxJ&mJG?hDr4vsgRH{TI zDdxV<|B>YD*$S|#Y-TiJdMkOQA?-TFkEqYD3FWUWB?ilj`1hP1UlKoz4mu*C^X)n% zJ1@@$m6~dl0jr^47m??dIg@iWfSw|_u`T(J)L^&L;+5;$-aYDt>AaRcRFE)QvRse1DMyBXH2?R> zGQX+47}U2?r~CWcq`el-4Q|h158QCVXfOf2<{=;8!7%^DkV|B zvJ=`F8dgBA+jzynZ!}Wl-ZRu9d?bx#hkK-{-*t(t7um3GVyUpe)OzhM$<8(yV}^zCNc5k{oxu z%Eo?a1c}7Mo`)cHJZ6|BX8*2LYo%Nd+&cY?>IPbn9dkJZhjI)-Y`6V~4uvv*b!~Tu z+g?&$-uZDR#3fCYBuF+mi^_*aLi21~p{3HFNpzal3vYei zo~1`rp`>iUKDM&SGxb6gvnPy81EBdwu(-xBdhL+@%+V~Ek`H8J>#HqN*`Z?QMC08K z`hkU&5hfBaRz9kxU7}01I7T6sk$&9|A`+{o;hrBnl{y|d;$YO{ajh{eC@*1h%nHBO zMELg-Dc!K-uNRxy;0x2qUf)dm3>nD*jNKWjS|g=+#2shlzmxHzprPk>*bULQym0b6 zWJhl>I>6wX&G>v@=X+V1(4(aWI(9`29@JBeKMxT{(1`A1I7<|fivbb{%bD~SM~|)e zBqjqxp5;QNsV%NsMLAvaqAK_x+wsWA4>3;prL|Olixl^JcLjKd$i%CvN6?^|^sxRl z`W38>mUnE1e9H(C# z$vr4dw2CBw0T6{on^(^eiuG!BACk z{WHb7AtV??8h+wpc?AUHWZf=+v(S#OTi1JU|!3y!bQY7R5%013lohDKQuwWHm#PNUmNUgU-+B>#QGxXREzD`<9`)ps-g{XK&W;$ zc|0Cl zLh&_CLAkzatUm)1%kH6h>NvU9aP&JgE(8h(&e>WWUZsLhu7(kfW_yzH0RwP_&J?;` z=E6`Wd9qCc&i2fl6g7PtIEi0iaj#Jj#P{GlQSbQb;St^GH_8nRdvG*T{3^rhjPNMU z#D}i8H3Sj_lr6Q4MUOWAB04I{bq*cZWMj7Tf}hpFf7SJXbN9i8C@O?ZbCgJySJoa# zKOy3J=pGa%N-4u3^?bz7x9DR_yj^ejDYctrw%c!(nU!JrG~Ml$Qr5USoXszFxu$Tj zrZ?OpuQr?3nVEy3ZC#I%v7QIxT9|g~9cO_B(nC(=p(aqnh=h&i<5) z$cO!h-rk;$OglTBEun$8dnlr^PkcrJBW>Iyjs!E7)OXk0ie2V*WtdUP0uH(rwiT9Xd2A-s6kWzG zmNa3Q2xN1i9$QfOY(&BuC*{7i;5IsM*vM=g!AgHuDFU~~D z<{lmZM;>>W@+W$Hn%OQ`d`OHf-=tMENTRU!&nzA8YJ6tYqwV%oEiY{PXsfR&E65)s zOJ;N^E&ooMCLWIS2aP5~zk0Vh3>$OH92E-}Z`c;d!6+-RPp1x(H$61tcUz`lds-$) z^x3_XAed|X_+Wtre>R}d7G5{!{++AnM_b5HDh$20IK0yXW61+UF}U|LRgtzSg~kWC zN;{%>o&YHBM5JB` zQJ6@|UmTq-0SQVhN|ka|%BRYd&GtwuG&REv>;oa9;%<1b-5ZTNI6A~j>4dD;LHQ1s zL<*{Wq9N(Q)UIT~R|uw7q$GtXonlfd08O=K@Um5(*<1pY^sKi@tQ(tvN^Y@&hJ|lH zgbhu!fOVFTkk2;KvwH1p~ zQBgFc4V6|GTe1v1*(J{F(h$qy4mvoY2wh`oSt}M4FlgRd!#*}9RH=o~xF@1gThwR> zmM8}le0>h$D%H^mm^UbFLeQFE^xzH&HA*ldrOhZPgvkiqj2cS~AO;3E6~!Jre|aXO z&R-u-#ec#j>Ku16o?mO_g|DZPW%=R{WoL_)Fg)Vl9%IHM;4mSQSMswFN8$KXl8%0} zD=u3ogmR+>(R!6(pd4?f3YD+xGXmMF`>=fPt>jtB)%ijc%xq6s*q!V|!Q-<9JrAn#2XwcG(By>Wd|aVhxxHnaQQXZg84}H}jmG%CSibC2eHCcYFEB!% z_B{B;`~IBS#qn#p^CCC2=*P}9$%UI8{css3wSYvO=Y$?XB(J-; zLspm918?f^aC3ICeGP0eQXf8){j&tBrHgO6U&5rl1iR?B;V(Ump3P^vfwii&2tNMAE}z2g?G4ohRCUS;=Sh|>YL(xw z3$Kc$Ve8DA^oXX{Bp5M5Mz<;Z<58ATt|oeL<;$tcD^!xn^@``A+f_nN!1j=%acPF6 z>dJKi(9Gr>*y;*18eX^jx<#xOML`$BxNyv}#B==Ai$66rFFQHl5zfpmcr>CGt5-)i zMun!B_=_NriS9SZIjO~gf)226_=?w47+C8We7BO24mb+9z559(x9XO37k<9`aaK}6 z=V*VRfK6?E9>}cC;YXcfxulgnTKK@{vKAM!?&V+g@nu~(g;CR0PR-#N5a zp2EznxTSmaVCL)do5_=}&l^_G+veqOMMGdP(>B<=l5UZ$@{be^Sd}Wuyb_9_tVdp{ zI;_DRJ2`lc&NQ=tL-SM2KNk+v<^#rwWX&MvE8Xq=rw2Sa9bVD;&H(PC z`U+GtElhGiITy&0VW@B4DK_z}FC{s6@thFvq?jKe+r94$56|<+MyBKTyL!?p6iW{A z1w{b|@7T2?97>{9A1b$$a&?N^sJRZm2JnS8!|gE0cYi(s&T6wMs%hct#d_vw{bYxD zbzx@s8bfUZtJ38s;$*jX_`c`E^v8-1&%gkV+b$+u$l94&HZaL2fHw&G^DUv6)9waZ zv?AyBkY0Xq>MySA`CcPCyh4{3rmx$zx_^_?NS$^+u4PSQ=Lo&7SBBk<1(o+#CtFH5 zpbwC_I$LjG(AtR=C*Sj{FKaxGmH@^J=f;Io!nUMnW3k+xB8Srx_%rrn4G}QnTYq1t zR+n8|@QcR;9zS4BbEGP2l;gDr5$n}p?{Gi<($V2b3v58dJr&ig!_6NII2o_fl`zsv zGt((Qp=+amJLsIrZJ!x=LyNL!6qmNsla=W=`VG)!#YLAbc%4+&NEDGE7Bhv#Ff>X1 z$4Q+@ECz?T(h96K4YQz?=8vV;+Z6(EazUZ(o-P?ZCH5TJ{^ zyYdoAOjdRG&RAYSBbs$;2sG>khx>|&X=B&7tb1s%`&-GVMUF@BeNR+PHB6%+7qOzF8-R=8#uZRU2)a4%nsK=ay<2jP`REPtCxYJpolu5GM~_1 z0cBeUAJZ2;Zb3>*8!>Xj6OGR$e)=o3$<`ho7h)~8q z9Mr_&y6H$R69Ewd6w+76JjPt+$ih=e-ZN}mw)bSV(?GFe<2ElHPW>`qL`**3x13Ns zr0oj1-+Ek8L9?@$3&!FUG^E=E+dL{`Aw##{I*h~Z0Pec|oh|8bN8)B%{HCshAjB#M zRrY|2sRPa9`!^$FBk`Ba8lzO}pBMfjcC50u0u5xQPtrpnK2}z;=#-JDKGqcyA(n%# zy63$oE33Xd^?<4r-B?d6kt6PFI`3aNgVDsS5K9&g!C zs>b&2Fn%TbQsE8?PJ&QL4S|sZ=lN6T`894<88lT+7w%hewcfQ3M?xBkj;)t|Yqjik z9?MPUW~&{o)R@a7_vKXkMg(gMG!s)<1}3Kmjc2~c=Gi_E5I*;(DR#*={Z-Df>6#PC z(wfU{j4%VgyFLhvNefX93VaGOs*+VKxB}FqK$5RL^oWo1|^+@7Jr22M?l)64TC&!f&IF66>sER7A*D@#(Ip6IzHGP0W3xV*Sp zHdehBu8d0?z4O5)TwEEPj;)9xvjDR{A-f^bc}tzJPFmYjVN@RNtEHA!gBNx)D|5o$ zhSb*g^K(s**KHMO-Wo6^TAOFCMHD(|`%K}jS@HL;FvB6M~-sL=jQV_NI|L2cug!dOPd@8WN zxAk0EXC94IwK)&CJZ*rdqCki+GEnx#L@`dI4x@r2YJto@NJ*R9^#5QYEW+)4H*51_ zqiGkC*Iw3buGsoHS`LtxLj|h`2(bE<{Z_}cAaJ0DBKoJnk}^)LU% zim=VNj$jLEp_(*_J;!5kMt@a ztk&Lvhhig4!&cpiwN9ZL7#0ZyngXKRdn_9RP{`EfQNiZHO@w+1B5~1~F8&=1J4={J zyX?v$_(D=}L#}dWULK`v8gA1thYDg*@!8r_==3VR)ZhV?GnM}~5?Tm76>fh`)VU@d zMT#tq!{Im&VLo_9!3h>t2(v9*4zV3IFe50_9@L?Ou(%mLhCO!TI4%8SRUP5bqHm;e`=U}?Hy4L7seZA1N z|8_J!8IO2cqgmePX7e+;?Qh^G|uTNfK;c};c8wO=V5x_GC%-QftC>an@a{Myo zwoP%FW79u>TI^&b!aET%KQD}3ZWjL9Vmp~7?3oVY3Ffsq|BhL24TIl!A(kdYhv#WX z*-BC@8Ne2A29|KC2eI-(6weB_R42W^ZVn`zi89{=?>&xrcDPn0Xg{74_c4ikE3!M^ zt1jC=29T)Rb~Ac`>d%8Jfc{fp9_0B2DxS{aaYv#1GLusEEXe%N^j-5J`Dba^A-li+ zLgv0$lPY+JMHJdSqV68lu!mnAnT3LbMX=!?w~cYVxt8UVTH5R}^Y_oSe@apnUv7z^ z<;3dtJjBpemARTI)p6OZ4IuXQLbQC&;%O?*G|hRXRXP1)i(5gowmKHK;_-Ig$ntP^ z{fe%W=X98#ScqjdP2o2vbXMJT^Yp&z{=7IjJ*(blX`5;IdeP}t(R_%Jl#+7W3qyZ3 zLS1e5a%cYWarv1Isv|qnLk$&?sxD?%=>q9NBc+91<_pqq$~Rz4x6pYiB7p0oVZ^bW zWUL&4Dl!wjTjNw87nYBX9K4|@H1Ko`e|>3R8KR`>FIu6{Rf%+8duduTfL5^51Jxva zKw9DfF?f)Q*L&wbbnr$bdbTCVdwmp=&q+P*luyb!Q4(!?QTU<|u}Lrh#N6|M_(Bv( z&D4jLTNXCTj;?M${|+XUbqV7EjSiVpYi=2k-LKc@>*itm<~vZVCwFr32| zm|g{>wX9b>a;z038}e~8USJ2046=IKPA z?rk-)UHj$WOsm;sO=O~0Bbq)12d2G|1S&V84N^@gixiQHL20-y86C3ohBUP9#kb z+H^6;si_T22J*>h%q*F&CMU%h*Zk-%4t!m#Bw3jCn>>Kf+tr45-0nl3b5?tv173bb z8F4-DQ^Ol5|29w#XfBG)d_};|=8@(xWQ9jB)R&Y!xP4sVaK0v@45A($r820rJmRgK zFshqHJ(GbO(q{!9sKkHOj+mZa5G0_DsoQa)`{{AL9MIu?!@~WzAu_X%_U(QB|JC)D zQEfe6)NloN2*s_qyA^jQ6nA$EE-e&VtVn_4R-m|Rkl@8NxLfh!l;Zx}{`-61FVA}N zHET`oOy-{1v-de?Pb0r9H_%s7&X$vm?7Hh`cb^+YyRD-=t{B;zE@6(;ars`|mc}CL zM*JEGN(m3&dn}}}wOZqIZhn02j?a>#;LN-xLqd)>?ey2Q(Wg!AJq%u+I*aQup&!#oC+oLOUt)>pg z?w4CJZKlb7cI1W{NOX$Q!)VWcZ`kah?0?ictl#%O7L+0C&DwVwF78>|p)~Ilm5e;Vz zckP^L9o)=$cvT3Jnxl&L&=kN`R47q0HZPu!oU}*XY^SL2@BiTBoSd4V^#6Lj;$vxL z9W5@4g`WLM|2b5#iGD-Cg}bAHEXRy%&-2m~7o%St$w#9Qw6tCQNR7+5q-8G5~VpFBjKf(1zrj#jEj%&clfly_Uu);wHR+N>VYvWLsK|^-FMkM8BY*l5)ly+p&A(j35xsgX(}DwRr}^h zHoho57i7^-I8D7QHGMH|hika;3CrL6Q53xaWFcS(8O!Xx?Ex{uHBDv8zKO?Pl$rKk zuVY69Y$Py71}PHb8I>t^+N%pLQb>@-9I7(wL-DIhGKST*KytQ=DK>1`G*ZINwL!TO z@|rzVVlqPNKjDtXaE7es~u0;&Gksbr?nO?mn97ly{GM@M8|a%QjKV zK*44DLv}*@5;TbNm%@*7BDWJ_e?eI!2_}}s&2Yyz9Y{a;OF;S4QAbXNX{@?I827g< zGd^jzc(gDu6$w3_K=^^sqU%ssYVjylA@q+<+%oaDHyHjoe>MbYd6=q7UtStCQ~vuD zkHK3Tn97g*FQjOpsD$~bLDh_iKJB}XRoep}$!GH4YI=maYDqN&QL*MGY@Ur-3i(|w zhQ^8_#fqVU8Gw4V@oC;d@ytxUz;l|7r;`qh0>)xSa8dbZ#VhE3UCZp zpCb}VGvH$kp#X^XniFGWOdLC%zhPuMsFwSBxFf`QY0XwV_`_YLKK%anfbnVWDSE@x zLgUNpK|W$4o0l{sbn|n;6tU4J;k=HvJUj3kh<-;~)|jw3In!<=YOh6aQgWEAc1=14 zE4`(HD`=pVJiCJhz;~d(fV7wS?Wbo-UKjP~FP~o*1(LjPwFi-jKTcdME^&Ez;f;+U zcmD{9iIn8T?=cVBc4V&6+p259M+xnoo}IDuZmKEP86jc}8-07YN|dx-Vx>d-ANqu_ z))1-a4E9Es;W;8F>bo2a!=(VT{7;&)S3?iKIPZ?!fP zASVbVZ@$SU5^^Kgf-3fjKmUe>yj?)2Wn9^3eiq&5gel$68MX;EnRj*kb9h!h%5F%MQ_z2xUe*E#6WiQPT1&+DfoHXPUOK3VOc;`6fo)NAn?o}$Ew^Gw>7*IoFVr6{-Gis$wq zq+bK_AIb%Bmg}6i`BfRGrlXlYFke6XZVW^ZytJj%S2JzI66N!9vOw;pB12OpZJN2i zFoJnTOwCANbYqH+N|<7Q2>ztL@FnCP@FmBKahwZxW5nDvX~n5Jl(p=bc|%a^et`nSoHTCRe7EX$$il)unQ9 z9v&WgdIK14*te)f@apF-Vy9h|Wz1yV5zQat@BvH_q8J`{JC&OK4vD&3eYBEYuf==O zE7$b;MRTde?yVhy+EktWT+{u!EWg+v)JihpPwf`i7q(dLg)3B31o=MWpD1>>umeRT zG?FW*XQv`ttU$zZEMyfF`M&Rn?Ue)w4RZ7K@(_#>6VvwX zPn|40+PfYfvVs{J%m>gLOEan9mD?ht3PQKBJuE^efOcT}>^1WCw7-CV< zZ?nNH4Uw(vw1MV0F7Bp~0R2>1*i`W6)97=)dLl}uif?HFnH-!EPCbn-43AA?bVm86 zOKlmyH)CTXN5c<^!nnLbMp4`fo8wq0$#ToKnJ+{o9S(%%ThG`VoQ%{WhoxK$$!E)x zoPO4(4NZP?tQ>39(_E-_=2>cV{@zqcz#D8`CQ$qC!kt}Pp!Q*u{1A2kX?7g@+G4>+ zKJ#nOxh;~X2*2n>4|4Iz>_Yn{R)e!q=!!*d{XPcUOY_^i2Lz!d)ZMT8MuQE}j;{J! z^Qrs3#NxA>(GPX~FYpFmh1|&e?{=4<7`C8tPWgmON6>vgtvNM(RB4P5crA?)`zw9- zNJVN&*C+W4CU&)lHbG|$GnQ%j>%mey6uEE`$y_eXj1@^%GKnd^`^RUqrzfPRJVcS^ z7gv@ILLYJX58f_!S?cbceLhX+vm)b;vWmk zVDa$^W2);}D=gu1xgo-()r(<|T0LFC=ZLT3o!su-Sip2L^IP=2&Mg(OX%X(ic+r{4 zh=?Ug|J_j0Sy~_hae+64(??6{ftNfgzs9h&^@!fJ<%i7Mib-!Nn@XMCgt>FB)2O$W z?C#DMmygJ4!(lv1zh|?pdv`FPu{SjcH<#I)8)Z|6Nj8du*FX3&5dy_VH}(g!Q| zuhNi(MH~8j_coRFz!=;qBwu>-{t#uRxog(AMM7O)U%xNg!P7lnt2tidv^jq8=i9!| z$UnQ*8xl5IXbY?m5y_E#&!XkX>_eScf3GRmzQj3n%q!J5mo*4y2`<4mFtFn%gw~v2 z5-i8nPz=^*F*ebts2F}tM3mGMOpN5q*b<1N>%wloBG2-@p9oo!&r=875lWeVdLWp~ zFc2e|zMFj<++rufFXE!@Omh~td zfzIMSqJOBch?_IycuBUGn>_Lh3UW%Bffgdrg)f6vQtF8lcetIIj1^Og<-le93oh1Y zMO9T**h5fSbgluwyPRL$S=)F5N2PI-HS9WJE~?=j&myd0vyAS`)4TWgj_Ap{C8>k( zv4re(g25V|1!sQ*9~m76IU8FgT^wNVHPx8?>dTG1NVI8ga=&D(KYG;9f~h8!FDmFa z5YkZO>>qxf_PVvM1EAa9hVW@_&ce{2R&xz~Xg~$VICX*%z5jD1T4Y@y+7qndH@zkQ zEdAP(O$jKOVQcx=b4< z8UFU}&VKgjj=I+*^HcFlA+fc7j?7;fKkw0Rg%{m=3~nY8T!wIgMmw}nh(KD83Oygs zC1vxF2Z!gMJq}3P>4P7~V~pkL#d4#NE|N1Yh4fSblZunDc5|2KgEBz35PVwONiMh2 zc0-EHu|#MtZr6&IkDeqQ$J2X*{@wwV1nCXSY>l5PlXLy&rhNh2gX1;%r(2PBKA*4C zACjL=79MC_7W(H-=11z> zEWU-)d$NIPNu=xNtBcW2VKF(qZ?#x#da3Xta#PvTl|r> zr_GPj=BH@e{ZvPrgkH>ZNt}pG^BXNZ;j{sj3ttD%(wNr1URN$J`+L> z*IljtYrK_TERIK}-gx{b@6tW=3?cX5gWg?FIX)@6$h;(ck+IU)&Cw54&QB8b(#;m%Dh>={^zRgKy#ysr8a!W3w*v+c?gEon+8W~M; ze5i4sDUJ*Tl(;l#6k{`;V&s^?(D}y+iR#i z|L;*lLRXkmaSXmr6?;Fudka;N@CsM_+o2({7+pymdfVsJFcMMnZt(fckygw0t zAVK zP8HZ|Aa)hn&qYcSd0Yhc%1eJf6BEig0h6@)j_s&Hka7GjF-bJ~ey7P6_KV{YeL+LS zXBE+BgNsx9@#td2lOCl@6}0RobNj}BcRb_?c00m=F4|YX!_edjpM1`a{YCV^zHAjt%jjwwR(mvXQJ$Q+nZJ{2@8tTUxOE_)IX1)6pxS=>~ev;*! zpYQiMAQ@^~>*&YKA$~`hN;W8R{{uWq`A9>lRlfl@RjtJ@Y%-6}up>8$GmuO*O+Ht# zd2@4f?$rQXNFh<3fG~+*emN<$Qkzyvqw+1@#|jA=XUIyBS5Xl?G^8{+IcZhIA(=bD z$N>KKb^cd>FA*|ZUJcG5+__U{6Tc(A+gsX$Kqd?R4E>IPhq{C} zDoH*Wc3^-~{vX^q^NSbp#c6{PvGIT`Ng^`YgXWf&lpP(*4o3=n{fn6o=Bm_o(Z43X z1ci`(#*YHne6#&X)LGlCPOpA)nD~w2q4?9A!Uq1-!k+o^LNmBQ=Pz#vMdOdr#M@l8UP8{9Hxw+ua?fkLD7* zk=t;An${coQlBfmH3~A04>0=)m23 zhsomiam)PUP4+~`(+8x3eNK#*fUSsaIB)-jAc1zT6Sp}(6Kzq7``j!wm_ighCSj$Q z&Z?&c(usPdI%RFkfd?3G*s+}s%6R7$rZ4$oon-REk;T&%+vE<_8Bu7SyfqGdWt7|7WGV4ePC#) zYtJ)4214h+f}*VF`YHiXzJX%e++hJA*zIV#8nYV#WsAqj1i7N3sPg?b!og`16VE{i zx{U^?xBi~x2C^&rGoDFFIq%v8Gr`h*flu`(GbX*z zBWdjHfIowdt9ga%C2nKf;h!CRFR-gX7{l`%NGkN8w6wIuloYk}!oTXuE2D&@?XubU zg#GW0^)Wo!n6!WL(s`H=GjI!iI1y};&OIp~oR4Iz%Mm0~Ww-$X@$|-jjt&MY@V@7k z*O(l)EK8DjFLacY#9MBns-{nDpo9kaH(;co19nz$n{J2t81R%3ceIO*4Lwj!kylt4 zc6)^(z~vzH&ty*P zy^1uxCIvZY42+n{X*j?9P?I)iSaZQ1xuJc(lZn2jvT-VYhY@&9DV{Icr-T#26w>}v$w$f!LgcDb_~SE0=Ozg9gl6Zj!<;YS1S(+i__R@31&fFG8k zq9R}cvT=G{$78B`>HnRQAJXJ8n@tzD9ns!C-{Vp09g&Yd(f|*K#mH)>0RHhk*B2A54D@qHhF(WD@^e|gt`h-Ge4=w zdK6*J}Xlc+gzKT_z`1V`i6>n`a`s*M9(p zAWBCHb>6x2F$1IF_kU?-i%uv0SUGRo(oaI9&$G(rIb=Ik^H;2bgpG<`j;u ze{H$|bdq|fZ0uW8L+Os;n2rwgBcW#Z!u+@DyPH5uUu8d295pvOLmtn^ixR?xtL>*? z_;&vQyD|7IN_?k{MY8>OQq}nH$1}3BJqymiYGBtgSCbJwKK|GE_#ktlc_3)zd$)$i zB!-Z1)YDvnWZnI5s?%(`(v^H|@ur&4PT@E!3kv4BaZ727VC_Z6jkAb7xjgf2VtmS&ptX5ABn}ndsS6^2&y7$m8P$MesyCTfLw?(9^-hLIu4ve%r`2216 z_r~bZ<|FcP_qxlED&cYJm($tywB;}m9cW~itvW^s2erwGaVheEO3?&;<`$D_~Rb&aF-%J!~h$E zFmo^$&^=itJH75|2jL2mI4YuVc`qc)4`|Q zykZPKGVhDhC%uH2+E!7HETXqYZMVEDslN@J4N{+J%DNN{@4Z4;NBXAAJnNKx#gjS+ z6dQ>PDW(&|=Im);`{Z1AUbT0FV#U*4@9cP$1j#5eL*;QG$Tpg?=3A$HfGPlsZWVJs zoxi>tOjgxSW{q>s0*lxtmS{a)o zd?5)-`v0|e$q~7^4H-US3_x^t^)!pG`&g21O&clv7*JYkm7w@biwPw`anI^cLiqV8 ztt$HKA7|QZ<_%R0>5H8DkzKxnnZDvl`ScoMD*4(tJA|k!fVMv(IZ}w%ULs?gyBsq; zkg1qn1X^v{nT{E_R#9pFcq|uapX%IlU@WHD60wI0>h;>Fm1ziUu*ab8`p3|5vb-@4 zze-cGp-(1Oma!^&FGgCUDiaU6?6rwf^(<{XwGg}B}=L%=EE-qa1X)9Kju=8d(*CR{*Q>_W2KdOG2r%$I5HZ;#Xekd}`Dn{YB zeE7C|Fqe@byrKth;7v`$2K|%#WmycM5nJ@kymO>)jGf};)7|)r}X}TZnI}J>ZD#`WAkoLBexN z=n+GQT7)^Ov)TVaG6B^v24&q;CGTG}+UD#*0xO};9u<$(dPRq-ycR;hV=B59;Vs;h z@4B|#$^Tn{5T;)K3I2qLEsd}7p)rS})|4v)t;@h0lC&J-!ZKkfsn->B0EXwfE^upz zu-DmzU(UWKAu$Yx8zJHKI+-6eWU`JaSyV$mU14R?;;7xXIcHfV|0-}lwqOhU0tLtb zruqa~H~D;*1`zj`>{*|No0d76v^kbi0nGu3%wm@jqECZGOX?LAnDOXGhP+fSmOpkb zrN5k=X`9}7JpTC-pV4s?uvdZ`@a!4dTSXa3EsCn@-)BE5U$gNMZ+uT3 z(PLxYC7IA8>n*p?h7%F>wd~L@~~(Lz_94w`at?Z6S;-@~V?hn2C+)``#bL$_7j`H8>5^>hJ>3L%DHdn3E|fX6DN&@0?x> zqR6Ci363H|gK<@Fit8;xM&+1IMb({c(}%>!&mD5^#h6jUeU55RF`u7?b&2g9ddLpe zk2bx^O-)Bn7sc8y3)Db+NAx^XaGs~jlj{cYA=}1nw@U{O#58cgCA4V%ah`A>pR{}2 z_qaD@kK)VV#A_7l`ULjuO3!&CS^?ZRu#CSA-sug_OfQwe898d(>S8^Q>XEP}DKG`x z&idvySmHB6;fGXh7JdK`<=|jrPfk$M@-6V>tuLlUfdQX}vxL9B3ZXGB z0XLi1PTfc@jd^?K7*u$e7LD_roV$@B^85rA4*3!n>xX?q9cbdl+_q$q_R&#u59Dr!* zPEf`?H#xZ~1^bS0P~AMILuoz6aBMvn!&AP}97HqL5nNllwkQClbL$^2e10U!ym`Nu``qp>_#LM20A*X;r1j0;TN7{(;A#0Y6LHr&TT%wI=`frVEY$ zJr90nT$w}*c7{uuD-yGpp<*Jcxg!-=7udaIGjev2&tCT@j&(HS2VGvd{{HdYpyd{3 zq^-Q1kB5FaH9aZm^0pts<#BUvK014q%fxI0Bsb@ME^$1_D`|=z-4Uwf^|FMf!mc}? zkMdotpB&`WS42q&O8MBbI6ISHOOx=wDg~3}HCOyfE^n>=RcWlHRjvSQE41&~bW@>E zxc~dNCzduXkJ*sSMI4Oq@5A)+`p#aRW*!8jRXwzSb!XXNK>_^i+yu!Yo;oV@p!T1P zz@16oMr(sa$aK(~2@0ypq6?F~Ez;R(>Yv@O`Tbl6dJ?L_J^&8WWLSBn8d&-`g^?Oy zBeBODt61CS?2@r2r##mWreK>Tc3ihiMF&||M04+uZgUMyO%SBxqm3ob?!lUrDTB?- zmmK?DcX!~_CrJEWV#AhkoLjp`>m|l6lA#u1x*sHDdcg4hdD=h)AS^>9c1Ivy@KzQInN_X?adVPdfe6g~zuca?0XJ&(m4%@S zg>k@q+~_tfx@VLYIw$-*^uOp2#hXbp$zUoKRtMX%lq!qvzh{X$_Lp(6HUbQvboC?v zs-PxS#pyLl!k~3-72W%Zd8ZVPp3A7;qiTWBiUg4iXVA^7kOT3mh_%%|y$YSb41+vM z7pq#nN8Iv)5;XjHBW`J7VBcQ`0<6ROE$-j6x>Om?!i4U$!eep{ri20#m4;)f@Urm9 zuEW?Sa1+b_m-yD0zXiqz%HQDHX0ky9pHaqan1OKmFEI~hP3J>@(}w%PujSVodmZDb zoRcgB(Hs@6GMCYeC~s<&Ug#H4Fx*u^+mxWVtu+jaOFIx%i)3BVlWbp&AhBu%)*R2M zcO$1x5Scol^dMdR$RrZYBmB;<*wI0rR~ILwfVyd_K23GYJ14}p1epMmOf}k%VMW~- znGcx3L4A3fR zIlx63_pSb9I%jns1dUj3?l(!R7o7E+b#}Zd-oiF>c1Rv z^Ro!L&;cd)0Ddh7QAvH=-lbd?+BA{jucz%M+t7M<|1-vw zQ%=7(V=h=TwMTIr7A@y!kJf%L%QWPul^z~7vEiYWY-=w_h}m+)gzm88iNM*~@zHeQ zqTtQ?n}(z2;5D;v5^!}BL0?HZQ=E`D5mQdol~dart18b4A**63Zg?S~{dJrxBpBzO zlLCSgF1Es=4-e;_byLFrC)o0!eY(6|aQkCD$7zAuiS$Wjj@=P~$f)OW`EOTys*G5d zv(vJo?Cq6B&R9TT6L^zU$ir|mlhDzf)%GGoM^@T{C-AzP(q7>1cM0xg$0c>g-FE{y z6X2bXPj4~`r=6HB;JNf5mnZg=l%$=0}abSKPibqH$hhV~TXq(#@^3@VgtrCzW!OyooBe?d8v&GOW9uV*F~8 z@zcgFXg6~j#N5eh z@m5!_k&1DUghg=ENYM<`0Qos>pRi9hy00|1cLHUg5b$s9R3(c^uFxZH8J9gU3 z3bH-|K@p`f=UK#I66rc(vfN~-6H#-vnR{&t~GC~!- zKm9*5g8%O%;Vx%Zm