From 7f254e8923b0c38030d8f55b625c9bcc8fd54173 Mon Sep 17 00:00:00 2001
From: Quarto GHA Workflow Runner On this page
Louppe (2014)). Plusieurs travaux théoriques ont toutefois fourni des preuves de convergence pour des versions simplifiées de l’algorithme (par exemple, Biau (2012)).
Par ailleurs, une propriété importante des forêts aléatoires démontrée par Breiman (2001) est que leur erreur de généralisation, c’est-à-dire l’écart entre les prédictions du modèle et les résultats attendus sur des données jamais vues (donc hors de l’échantillon d’entraînement), diminue à mesure que le nombre d’arbres augmente et converge vers une valeur constante. Autrement dit, la forêt aléatoire ne souffre pas d’un surapprentissage croissant avec le nombre d’arbres. La conséquence pratique de ce résultat est qu’inclure un (trop) grand nombre d’arbres dans le modèle n’en dégrade pas la qualité, ce qui contribue à la rendre particulièrement robuste. En revanche, une forêt aléatoire peut souffrir de surapprentissage si ses autres hyperparamètres sont mal choisis (des arbres trop profonds par exemple).
-L’erreur de généralisation des forêts aléatoires est influencée par deux facteurs principaux :
La puissance prédictrice des arbres individuels : Les arbres doivent être suffisamment prédictifs pour contribuer positivement à l’ensemble, et idéalement sans biais.
Ce guide d’entraînement des forêts aléatoires rassemble et synthétise des recommandations sur l’entraînement des forêts aléatoires disponibles dans la littérature, en particulier dans Probst, Wright, and Boulesteix (2019). Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure d’entraînement proposée, et d’autres choix sont évidemment possibles. Les recommandations de ce guide doivent donc être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.
+Ce guide d’entraînement des forêts aléatoires rassemble et synthétise des recommandations sur l’entraînement des forêts aléatoires disponibles dans la littérature, en particulier dans Probst, Wright, and Boulesteix (2019). Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure d’entraînement proposée, et d’autres choix pertinents sont évidemment possibles. C’est pourquoi les recommandations de ce guide doivent être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.
Il existe de multiples implémentations des forêts aléatoires. Le présent document présente et recommande l’usage de deux implémentations de référence: le package R
ranger
et le package Python
scikit-learn
pour leur rigueur, leur efficacité et leur simplicité d’utilisation. Il est à noter qu’il est possible d’entraîner des forêts aléatoires avec les algorithmes XGBoost
et LightGBM
, mais il s’agit d’un usage avancé qui n’est pas recommandé en première approche. Cette approche est présentée dans la partie REFERENCE A LA PARTIE USAGE AVANCE.
Cette section décrit en détail les principaux hyperparamètres des forêts aléatoires listés dans le tableau . Les noms des hyperparamètres utilisés sont ceux figurant dans le package R
ranger
, et dans le package Python
scikit-learn
. Il arrive qu’ils portent un nom différent dans d’autres implémentations des random forests, mais il est généralement facile de s’y retrouver en lisant attentivement la documentation.
Cette section décrit en détail les principaux hyperparamètres des forêts aléatoires listés dans le tableau . Les noms des hyperparamètres utilisés sont ceux figurant dans le package R
ranger
, et dans le package Python
scikit-learn
. Il arrive qu’ils portent un nom différent dans d’autres implémentations des forêts aléatoires, mais il est généralement facile de s’y retrouver en lisant attentivement la documentation.
Le nombre d’arbres par défaut varie selon les implémentations (500 dans ranger
, 100 dans scikit-learn
). Il s’agit d’un hyperparamètre particulier car il n’est associé à aucun arbitrage en matière de performance: la performance de la forêt aléatoire croît avec le nombre d’arbres, puis se stabilise. Le nombre optimal d’arbres est celui à partir duquel la performance de la forêt ne croît plus (ce point est détaillé plus bas) où à partir duquel l’ajout d’arbres supplémentaires génère des gains marginaux. Il est important de noter que ce nombre optimal dépend des autres hyperparamètres. Par exemple, un taux d’échantillonnage faible et un nombre faible de variables candidates à chaque noeud aboutissent à des arbres peu corrélés, mais peu performants, ce qui requiert probablement un plus grand nombre d’arbres. L’utilisation de mesures comme le score de Brier est recommandée pour évaluer la convergence plutôt que le taux d’erreur.
Le nombre (ou la part) de variables candidates à chaque noeud (souvent appelé mtry
) est un hyperparamètre fondamental qui détermine le nombre de variables prédictives sélectionnées aléatoirement à chaque nœud lors de la construction des arbres. Ce paramètre exerce la plus forte influence sur les performances du modèle.
Un nombre plus faible de variables candidates conduit à des arbres moins performants mais plus diversifiés et donc moins corrélés entre eux. À l’inverse, un nombre plus élevé de variables candidates améliore la précision des arbres individuels mais accroît leur corrélation (les mêmes variables ayant tendance à être sélectionnées dans tous les arbres), limitant ainsi les bénéfices de l’agrégation en termes de réduction de variance. Un compromis doit être trouvé et le choix optimal dépend du nombre de variables réellement pertinentes dans les données. Une faible valeur de mtry
est préférable lorsque la plupart des variables sont pertinentes, tandis qu’une valeur élevé est meilleure lorsqu’il y a peu de variables pertinentes parmi l’ensemble des variables considérées. Par ailleurs, une valeur élevée de mtry
est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles (LIEN AVEC LA PARTIE PREPROCESSING).
Par défaut, cette valeur est fréquemment fixée à \(\sqrt{p}\) pour les problèmes de classification et à \(p/3\) pour les problèmes de régression, où \(p\) représente le nombre total de variables prédictives disponibles. Ces choix par défaut reposent sur des heuristiques empiriques qui offrent généralement un bon compromis entre la précision des prédictions et la diversité des arbres.
-Le nombre (ou la part) de variables candidates à chaque noeud (souvent appelé mtry
) est un hyperparamètre essentiel qui détermine le nombre de variables prédictives sélectionnées aléatoirement à chaque nœud lors de la construction des arbres. Ce paramètre exerce la plus forte influence sur les performances du modèle, et un compromis doit être trouvé entre puissance prédictive des arbres et corrélation entre arbres. Une faible valeur de mtry
conduit à des arbres moins performants mais plus diversifiés et donc moins corrélés entre eux. Inversement, une valeur plus élevée améliore la précision des arbres individuels mais accroît leur corrélation (les mêmes variables ayant tendance à être sélectionnées dans tous les arbres). La valeur optimale de mtry
dépend du nombre de variables réellement pertinentes dans les données: elle est plus faible lorsque la plupart des variables sont pertinentes, et plus élevée lorsqu’il y a peu de variables pertinentes. Par ailleurs, une valeur élevée de mtry
est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles (LIEN AVEC LA PARTIE PREPROCESSING). Par défaut, cette valeur est fréquemment fixée à \(\sqrt{p}\) pour les problèmes de classification et à \(p/3\) pour les problèmes de régression, où \(p\) représente le nombre total de variables prédictives disponibles.
Le taux d’échantillonnage et le mode de tirage contrôlent le plan d’échantillonnage des données d’entraînement. Les valeurs par défaut varient d’une implémentation à l’autre; dans le cas de ranger
, le taux d’échantillonnage est de 63,2% sans remise, et de 100% avec remise. L’implémentation scikit-learn
ne propose pas le tirage sans remise. Ces hyperparamètres ont des effets sur la performance similaires à ceux du nombre de variables candidates, mais d’une moindre ampleur. Un taux d’échantillonnage plus faible aboutit à des arbres plus diversifiés et donc moins corrélés (car ils sont entraînés sur des échantillons très différents), mais ces arbres peuvent être peu performants car ils sont entraînés sur des échantillons de petite taille. Inversement, un taux d’échantillonnage élevé aboutit à des arbres plus performants mais plus corrélés. Les effets de l’échantillonnage avec ou sans remise sur la performance de la forêt aléatoire sont moins clairs et ne font pas consensus. Les travaux les plus récents semblent toutefois suggérer qu’il est préférable d’échantillonner sans remise (Probst, Wright, and Boulesteix (2019)).
Le nombre minimal d’observations dans les noeuds terminaux contrôle la taille des noeuds terminaux. La valeur par défaut est faible dans la plupart des implémentations (entre 1 et 5). Il n’y a pas vraiment de consensus sur l’effet de cet hyperparamètre sur les performances, bien qu’une valeur plus faible augmente le risque de sur-apprentissage. En revanche, il est certain que le temps d’entraînement décroît fortement avec cet hyperparamètre: une valeur faible implique des arbres très profonds, avec un grand nombre de noeuds. Il peut donc être utile de fixer ce nombre à une valeur plus élevée pour accélérer l’entraînement, en particulier si les données sont volumineuses et si on utilise une méthode de validation croisée pour le choix des autres hyperparamètres. Cela se fait généralement sans perte significative de performance.
Le critère de choix de la règle de division des noeuds intermédiaires: la plupart des implémentations des forêts aléatoires retiennent par défaut l’impureté de Gini pour la classification et la variance pour la régression, même si d’autres critères de choix ont été proposés dans la littérature (p-value dans les forêts d’inférence conditionnelle, arbres extrêmement randomisés, etc.). Chaque règle présente des avantages et des inconvénients, notamment en termes de biais de sélection des variables et de vitesse de calcul. A ce stade, aucun critère de choix ne paraît systématiquement supérieur aux autres en matière de performance. Modifier cet hyperparamètre relève d’un usage avancé des forêts aléatoires. Le lecteur intéressé pourra se référer à la discussion détaillée dans Probst, Wright, and Boulesteix (2019).
Les forêts aléatoires nécessitent généralement moins d’optimisation que d’autres modèles de machine learning, car leurs performances varient relativement peu en fonction des hyperparamètres. Les valeurs par défaut fournissent souvent des résultats satisfaisants, ce qui réduit le besoin d’optimisation intensive. Cependant, un ajustement précis des hyperparamètres peut apporter des gains de performance, notamment sur des jeux de données complexes.
-Comme indiqué dans la partie REFERENCE A AJOUTER, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’entraînement d’une forêt aléatoire implique de trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées. Cet arbitrage s’opère en ajustant certains hyperparamètres clés comme le nombre de variables candidates à chaque division, la taille de l’échantillon ou encore la taille minimale des feuilles. L’ajustement du nombre d’arbre relève plutôt d’un arbitrage entre performance et temps de calcul. Il est recommandé de fixer le nombre d’arbre à une valeur au-delà de laquelle les gains de performance peuvent être considérés comme marginaux.
-Il existe plusieurs méthodes permettant d’optimiser simultanément plusieurs hyperparamètres: la recherche par grille, la recherche aléatoire et l’optimisation basée sur modèle séquentiel (SMBO).
-Comme indiqué dans la partie ?@sec-facteur-perf-rf, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’optimisation des hyperparamètres d’une forêt aléatoire vise donc à trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées.
+La littérature propose de multiples approches pour optimiser simultanément plusieurs hyperparamètres: la recherche par grille (grid search), la recherche aléatoire (random search) et l’optimisation basée sur modèle séquentiel (SMBO), et il peut être difficile de savoir quelle approche adopter. Ce guide propose donc une première approche délibérément simple, avant de présenter les approches plus avancées.
+Voici une procédure simple pour entraîner une forêt aléatoire. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.
En pratique, il est recommandé d’utiliser des méthodes d’importance des variables moins sensibles aux biais, comme les CIF ou la Sobol-MDA. Les valeurs de Shapley, issues de la théorie des jeux, sont également une alternative intéressante. Elles attribuent à chaque variable une contribution proportionnelle à son impact sur la prédiction. Cependant, leur calcul est souvent complexe et coûteux en ressources computationnelles, surtout en présence de nombreuses variables. Des méthodes comme SHAFF (SHApley eFfects via random Forests) ont été développées pour estimer efficacement ces valeurs, même en présence de dépendances entre variables.
On conseille l’utilisation de trois implémentations pour comparer l’importances des variables d’une forêt aléatoire:
Pour la MDI: l’algorithme CIF proposé par Strobl et al. (2007) et implémenté en R
Pour la MDA: l’algorithme Sobol-MDA proposé par Bénard, Da Veiga, and Scornet (2022) et implémenté en R
Pour les valeurs de shapley : l’alogrithme SHAFF proposé par Bénard et al. (2022) et implémenté en R
Pour la MDI: l’algorithme CIF proposé par Strobl et al. (2007) et implémenté en R
Pour la MDA: l’algorithme Sobol-MDA proposé par Bénard, Da Veiga, and Scornet (2022) et implémenté en R
Pour les valeurs de Shapley : l’alogrithme SHAFF proposé par Bénard et al. (2022) et implémenté en R
Enfin, nous recommandons de combiner plusieurs méthodes pour une analyse plus robuste et de tenir compte des prétraitements des données afin de minimiser les biais potentiels.
diff --git a/pdf/dt_methodes_ensemblistes.pdf b/pdf/dt_methodes_ensemblistes.pdf index 012fe51ce2d803ff9297818fea508209eb5a4cdf..6f7b0f9de791d4390bde40cdae80754d01c935d3 100644 GIT binary patch delta 95281 zcmc$GXH*o;x~_oaERr(_C>e$f10qO}q=LXmP6LwT05d=%S+b522M|$#kDPPPGUPO5 z5F|&*`SR`k?S1w>_nx!P`E}QN=B;|3db@jit?mkMb=BU9M8}~-{4?B_>Q5mW?{y0P zo+-n^QpYOO!+wbUcaD5}w+mZJJe!OR3maQfDv^=`i#5@S1&6on6TT@{qQpI{?6Mrf zNNj9z$wap_TzRBBi5T!wjew9)U5%|Fzvsg;;~Ph->Rpsa`a$~Ym4DN&ECmc|Yg=@K z-ty`j(`S^$OYJKzE2BaatBVhKxif82GEzG_8O~+2P}H{-v$#w{;=Gf_mrQ8nrfkYC zZmv$|Mf^4it?tdkkGsTuPWfmgToYPwWEq0Hj=G-iRli^_IR@%*$*XW*UNdpG#VQIb zlOQ_P!Z@w&wV{(b44Vyq?AhD}jSK&zOOAe`LY?()=m(|;(bVAyG-lw`DIjAX22oMgPjQQ{=gOAHdD#3XT+xJX 5>_enUYzO*^)VuxsrL3`H}^ag_1>*#gZiwZ^=^0GKr65xnzZ8rDT=F zSF&2-C-IjANCG86l3+=QBvcY63714j)<_~HmtKhi9)D{k>m=(XS(0o?jwDx-C&`x- zND3uIl441Tq*MYVWs-79g``qaC8?IwNNOc@l6pylq*1a#vQg3`*(7O}Y?ic0wn$nf zZIZ2$ZIbPh9g>}rU6S3BJ(70GUdcYme#rqzhvcB-kmRuBh~%i`nB=(Rgyf{;l%!K~ zT5?8mR)2C%a$a&la#3 9I!ZcPIz~EH zI!-!X>L_)R>ZJy$QEHMpOI@U{Qa9-Y=|t%y>162?=~U@7sk_ueYL MLC>^^^Kb1Ehh{ zAZf5PL>ej$lZHzpq-&&+(kN-PG)5XLjg!Vp6QqgKBx$lVMVcy2lcq~Eq?yvS(sk1H z(kyAVG)I~%&6DO!3#5h8B5AR-L|Q5Z(lTkev_e`bt&&ztYoxW(I%&PMLE0$YAl)c! zl5UbVOE*hff23Qat R_QkBcIgi3PU$Y`Zs{IryL7K~pLD DSUH(r={SN}o!fNxzeRFa1IKqx2`~&(dF{ze<0T{w}4YUDD^$Kcuwuh4fG9U(&y2 z44IvbDPzglGEByi;W9$TmGNYxj4u<&gffv#ER)EjGMP*+Q^=Gul}s(u$ok3bWe&3b zGObJ}e;XhhC>tajEE^&lDjOynE*l{mDH|mlEgK^nD;p;pFLRVR$@DUV%qTO-oMkRD zSDBk^f^4E}l5DbUifpQEn#^71Av4Q7WnMCiY`ScQY^H3MY_@EUY_4pcY`$!PY@uwC zY_V*K%v-ipwoK+DTP|B6TPa&5^OdcZ`N{lce*v;US&%GP79tCkg~`HY5wbP1NLiFD zS{5UVmBq>8WeKuGS&}SSmLf})rODD|8L~{-TG=|;dRdk%Tb3ismF3CuWd*WAS&^(* zRw65v0a=->Tvj2glvT;9Wi_%|S)Ht2)*x$?ZIEr0HOV%~nq`}1EwU}LR#}^Dt8ANW zf4gjlY^Q9OY`1KWtX;NOwokTSc0kr4J19FOJ1jdQJ1RRSJ1#pRJ1ILQ>y(|AospfD zos*rHU65UrU6NgvU6EatU6Wmx-H_dsy&=0LdsFt7>}}aQvfHvdvb(Z(W%p$7$=;WJ zAp1~uU-psgW7z}QC$fjKPi3FU9?3qJe|;f)Ec;USmF#QT6WKSiZ)Hzq&t%`pzL)(V z`%(6j>}T08vR`Gt$$pnnvM$+k*&i}m_Cofj>@V5ha)#Va&Xlv{Y&j<9$ZBX$q&!L `H$~VY2%A4ey z kSb&fxk8~(DpU%!LZj%Xuva)J`YW^wOr2tYVxVG>Vz6R} zVyI%6Vz^?2Vx(e}Vzgq6Vyt4EV!Xmp;iS+j3<{&dq;OWaC|nh8iV2E|ib;yeiYbbz zifIaWg@?kd@KksyESH(v0~~(}Z^cr@GKG&~xnhN4rDB!BSFu{*r|?$ E zB2*Ek2v lEu1S&D2$ zjv`l)r^r_nC<+xtieg2HqErDCWr}h|g`!eXrKncaC~6gTih4zZqEUabL9tQMq}Zfr zR%}+ZD7GkC6>W;GifxMRiXDobid~A`iam;U#a_ie#eT&BMTg>`;*jF7;)vp?;+W#N z;)LR);*_FOaawUkaaM6oab9sjaZzzeaanOiaaD0mab0mkaZ~Yz;+En~#aoKE74Il+ zEAA-nD&AGxQ@p2mU-5r|;zPxK#Yc*d6%Q1jC>|<4ReYv+r1)I%h2pW|OT|};uN6-e z-zdISJXJhXe5d$c@q^+=#ZQW#6~8EcRs5#-T|p_j6weiZC}_nC#h;456n`rjN;@S} z$x^bFn3AK!m4uS3 mm0G1v zmtNfiAb;tobW-Y-2BlGHQaUSLl&(rQ Iat%C*XM z%Js@DWwtU$nXAlG<|_-7g~}pjv9d&2ssze1Wx29KS*fg2Rx4|iwaPkWy|O{ssNA63 zsBBVhQZ_3$D_fLXl( SV z8lW1e8l)Pm8loDi8m1bq8lf7g8l@Vo8lxJk8mAhsa#T5~^eThOs4}UXRW2%5m78jU zYNCH?l4`PQifXEAn#x_}p)#vHRbDEKYPxEMYNl$IYPM>QYOZRYYQAcLYN2Y8YO!jG z%3HNmwM^xsTCQ55TB%y4@>Q)?`KkO>0jfY%kSbUeq6$@oslrtesx_)eRg@}P6{Ct( z#i`;|393X@k}6r1qDobzsnS&$s!Y{d)j9&zdY7*!1Q%TaRhg<>RiUa>RjH~~HL6-w zovL2dplVcYP;FE-sWz#aRhv~Usx7KkRhw$7YMW}iYKLm4YL{xaYLBX2wO6%IwO@5W z)uB45I;1+RI-)wNI;J|VI-xqLI;HAVm+9XF9)G=|x}|zk^_J>w)jO)&synK?s&`fQ zRPU+YSAC%RP<3DRk?LdB1Jx(0hpJCipQ#?HK39FAdaU|V^_A*t)f3e>s&7?KRnJu4 zslHeJp!!kulj>*HFREWvzo~v#QK~N0bJZUzTJ=Kpr|K`&-)e^1PR&%a)ND1T=BRNs zp?~J8d1_M4R}0iawMZ>iOVm=eOf6R{)JnBVtyXK){nYkq2X%k7R;^PHP!CiOQV&)S zQ4duQQx8{ )oPQjb=TQIA!RQ;%0Ws-4t&wLxuEo7B!~7qzR}O+7(9Q9VgLSv^HP zRXt7ZuJ%xy)t+iEwM9K$JwrWHJxe`XJ%2|%S3OTXU%f!RP`yaKSiMB;tzN2LruI=U zSFcd7RIgI|s#mN1)c)!Kb)Y&(9jp#fhpNNW;pzzW8g-;PN*%3^QOBy|)bZ*Bb)q^+ zovcn#r>fJ`>FNx1rh2V
dopF^%ixjx=p=Ry-mGcy+gfIy-U4Yy+_@y z-mBiH-mgBO?oc08A5tGyA5kAwA5$M!pHQDvpHg?KPpi+UKR<Nz}FRCx8FRQPp zud1)9ud8pUZ>rx=-%`J+eoOtf`hOkuZS@`XUG=-_d+PVp@2fvhf2h8%{z(0?`hofr z^+WZi>d(}V)Ss)rP(N0Gss2j+wfc$r8}+y9r|M_w@6_L`e^CFZ{z?6_`WN-D>fhAA zt0{Gt`nmcKHLZT3{!{&z`fm+GW2a$iSQ@ql({MDnhR|>|JPoPgYXlmhMt`IcYa|+} zMy8Q#6dI*QrBQ1%ntmF4jf1AYMyt_j251Iq25AOshG>RrhG~XtMrcNAMrlTC#%RWB z#%acD95qfFy~dz1YD^kujf=)r nuUVj3sDD|cS*%&2@zyNWEYtXCmTOjMR%%vhd^M{zej0yGfF@8A zqzTr9XhJn%ns7~oW{oCN6QzmP#AsqQahiBdf+kUuq)FDKXi_z4nsiNuCR4Lkvre;K zlcmYl MXq$$>vXi7CeQ>H1`RA?$SRhnu|jiy#pr+=x}G-w(%8#Eg= zO`1)bX3b_zi)M?aRnw-~s@bO5uGyj4soAC3t=Xe#*X-5o)9lwA&~#`HY7S`*YmR7+ zYL01+YfflRYEEf7`_1UL)m~zM(*Bfvr~PUBGxlfg&)J{1zhHmS{*wJ=`z!WW?XTHi zx4&V3)BX+nTlR0-zdU9Cw*5Qyx9#uP-?e|&{+|7N_V3$&VE>{0efy8>Kem5h|B3xW z`%mpZvwvj&x&0URkL|y-|H}Sr`zNzofL#H93F$0h_aAyH#dyZ*lG0g K!HSi2pSJ7Gnc7xrCEvcXYD>8{TT270eU|Ds! 9p`kQ6A6iHc(et)LqI$F^tzs%aKLp+*b_X32)t`-oMG}s(Buy*pk_>PMZP>*A=WI zUWoo0hZSald;mb|rtFQN6;y4gZX&uwe~iPb8bJ*JgfP3K>#GjCla!oFqvWiv9n`yu z;XGR2s2IT$g3hjj&ReN=R2D^lvbu7WBViK^t)+HKuTVoM3#DDvDSOhjkxEdE;>ms- z%@bxHr_LRqDi2FfQ)6iXrK7Y|e^`!{ecrW|nxPoOlRX>Dll?r-N}96k>{^~GrS4G@ znnQ79KXx5fj_1jqI6_iRu%yE%KZV{#^P7$@De>M^h}zHf0=0%3B>NqcVT4D214!eM z_xn`y``(XaS0IV`iU~Z~hZA|S$CF?=fV!uc4C}2gNW~Nz?y?T*H!H5g07^nF=*Im- zF%?d98jtS(y<$%MP#3N2SNHCxMyY$BTo)5QI{GLZK0oW9Y4B=SRfqHzCCQ>3hjrei z +;Z#$|5o&Fn2%67CIZ9E0O24%ru74XZ;Oii6T zD|QN)MTFqVpm6IpP`ypN69+#(xpAnC*wT1 m%*~LRs7)1^8z9>8M{1KI|SiqBYF67BF7V%_fC|_Ji z9e^V}+(|WdkLNvV5bODm%Ej>c&azJNgsqv?HC(yGy22g3(}vxDo+y{{gzvrVMO}w8 zQNd|0;|aTBx_gee(Df%JVg1pe^x@gi(ES&>iY`E)=Q71|*j$=@>^bL%oprG8)L7Q@ ze$?-Z6+CL}TE$9ubrM{%+N0DNwA|DoYmbnwEX67wJyz*!y`5f4joowP%Z{$nBXGvU zDNzS?fEpg%A^Y=3`KdfbE!do{T? ymD z6mmuaolfiM5p*c+PdU)TsI}TQu&?Y$?JgSIGU*AEe}^g&eQ*SPd+;uC{^_Hpli(t_ zpOd 2Zev-K?1vyEvg%*QrMI4q>g-}Zn{WnhV0Yn069~mR2#R _P>>$N^Dv(9<(~xw9nqcC{B~+ghjb^!odS0W zBi!p!y3TG>L_^k!lYfXF16|-jlc0ziF68-}H6U2`;#nuYsik@Irk2{gGv1E@L5=+R zOG>As<;r-Ta6rM4F3}OYLvWXq=!iE$T`m_=NP(Nd7^ XCEASIZyT`>~pk&CxlN*)?sH|=^Cp(K1{_ZDxp4ZP=8dx`{|{f z)WD7|yUxfXkUco?arLlAHLnjlgy>$BSythcw1ScrgH8(o)I98X_=%jOkS|94)Xf+4 zK(A%9wCkYiSbZ^j11JM61Qm{hma?*q8wuHiBS+6yw*lhq%kyZdPMF;dEk;}f`GnQ= z9lcc1Y3ceV5MMe83qP}X&wqSC(8Gr4;f^ryM X80SaaMIwyiVD@E-58eY=mT*Ael|wJZ@tL+kdK4{&2}x!6k3z z$@XpL$s7Rn4JO;y0=0Q_O4ra%yRHu*J9gp;B{8K5fN-pUE84QVI8O&{sFK1Qf+pw+ zT1M@-2tX$-E~YuK!!1CWU+}TUgbiQ=G*{~@>RSnF0@a08Z>+4j1#K)U0?~ec3ew&J zp&%dp452 RNn?Id0VpXdB3#Cfr0^qF zP(d-xgqQC^dx4%qtLWiaMp_u$O9`;*>x!S@ 6ublU4>>^(4On zgU=E2{MAmoHVS9irrO$fyZW#E`Da~C4|#rHarmF;{U2_H)PI}os2)-S=vAlhQg~Pg z+{A3#)Idr;2AXf3wvBA#I*_AH2c;#2>*MFFO!I+Er~}mSQ !2tt+>>7xFbCO2@d!ho^`ly@aXT772p29GnD`R^S^)o z_s{?S`QJbP|M!PJ-*vziQ<=u1s=MA&JfHHvI_H1?{9*5(|NZm-lYcJQTt{o1 r2FcJ364HZ1Xr6BPv{moZKU;lpQ3WOH4hZ~A zg#rLut&Smd%@2WFpaVusjqn1ulNSAmQ~0Noo{cgA4U^H06@PL^Ob-dBx!Qji(+q&Y zNb{3ElnYQGY%ZmNVQAbIpSf=Z_=YF@CbBLbq``SA>HdK<{-4iNRDpSS%~d?N#+07J zn9{T7*^tWfobC|L%bA3|oXsD9jIqt;#lM@4b_VdsSrD=M#3GOa$AQzM!fC-jjU%kj zI9{9bA8^X_i+|@TMd ^@84jRLBfOG8EcJeJ-lH(D69vb?J7shV=sy2+pb}JTN{IKy@xU0b~4a< zVD%pCdJjzNf!%wG+YWrbwMansTMr!TVU+bC=shKSseci@G?;wbbvwRw5{z3i)_v {(aHG9j vzB?1`Gmz`*|S1f zv8)nSE9)%lKAX!P&Yr^dVMnshvv08Puz$fYY!J2p3&A#Gr?3Z{p&WnC4$fg*hEK!S z5+Y(EaetLNmz&Mq%Dv0|il^hv a5ANEj!~ z6Ydeh%|kR^v`|zl+AsQ5Y$sNVwc=UgTye3uLEIs}DyGDLN~Dsxk^;#s$sNg8QbH=1 z`bcA>_0kUM`_d;eOs13#lFgQd$XaEe%6^gkA%B<1`^!!8Me_TKsfs*BqoPA`QSpTm zQ|grd%1~v#a-;HNl|(gCHANMxDpws)T~I63gVio-FZFVDq >e zX@5^>ztm0B73vP@-qbxDz#cGofO$aPfNcW~40vnc$bkz7`V34OxOw31flmi92gwHw z8ss==-k{7u2L@do^!H%>;OfCmgFA<)hYTJvVMy?h>LDFN9uCzGbsTCQT0QjO(Az_w z4|5;3cv#S|>|r~HJsvI}K76>-@Sx#|!++@! N|j9WS` zcwEf5rg81#-W>P$_ NNK=os&K!|@}h2~KOBTAdC%y{Vs|KYysd zq5s1$#xUF9XNWVj8Lk=rH1; X5o`f%#k)40 Yr1^;tm(Pao2Q?dVVqGv C&aqOOGxyFZ*`c-#(r`MLx|wdws6@e6oDN^0CXk zm#<&mwL-RH*b0{w!7KKzcw@yUD}G!_uH3Zpz{*oAAFO=5id;2#m4DN!*{jy9%3sy8 z>h7wqeC58Ad>8sAuhy*&SY5gL^6K|jf3uqQ6Zq-;^nRXxEB*5QcKe<3yXW`RpYN~n zck^HEpXI;b|BC-Ze>y-G;1n<`z&9W+peUdza9ZG^!05o*z`cQ|f|x;yplv}XgYjU8 z;4#6|f@cS>4vq`X4Sy~P-W0q)_ 4qbVt@C=eiA2)^NHITcQWpc zxcl*T@x$UR@d5G4@dfeq@t?&%Nf?|kI>9Z$Jz+t@;e<;GA0&L9@Jr&HM4!aW#L~q2 z#AAuKlSU@xB+HYxC;y$IOBtJzk Fy(pbm{fi0%+!+9rqpApAEZ7{b4i<*=93nk zwmI!=+6U=m`hU1|*L3gnHR+}4r_-Nh49u98k(5!C(UI{u )MlRpRL2!jaoN-o&UPFb&u9PU5~AISU-II OnP8t*)L_J*WCa z^;^~7)v#*fYAR|r)m*Ao)aKPy)_q^kufJ6PxFNlvzTrfpvGJD;6E~!8*u3H5hHp1A zH;&wB*_gHwY}~c+k0y^M@2142drg0A(r)tE6o0;{rg>`f2hG23uGqYJ^TEyUZvLSK zYmv2RTgJ3lT9&kgv}Ct5wVY{re+z3%|1Ar)tlDz4b!=;O+u$~Rn@3w<+nToXTUA@9 zYz^DmwDqm6&$kJ-E!wtbTh6u{+rHe++%DNZWV_4usO?$X+qYlbf$!+IW9$z19X>m< zcYo~Oac9TVo${S=JHOo7wTrV$xJ$Kb=&rH5RvZsM;O`$E?(csf{P^($2aapW%J$eD zYd{2ujjxI#_R$Ha0Y*~8r(E)KG0dX}&_lmk^x(aF*Qh~Sl2*+R5Ag&)-+Tl7eE0aJ zKw8|VO-uG^eMVm$g_F-psXV%XE-0mQM}Lkeqcf=jD!-h{_(4m;Jh@~3vUTI;tcwO= zU~${}d%5SqFW?e*7ra?}zVY#$`fY$X2#%(;_%(-ufxwL*JLv&k_wY7QAFs^@B_KC{ z%Az4wgEV#37S1Mcsq9({@nR#bTZNyf_zj$ae}A*S9YL<*6sP9SUYDO;Fb!lv^M7?X zr}Oan<0tnKB*ppkRwwwDpzy)((F1A0*tt#%POsgz_ek4WEjS;rX>H~1ZHF2 s?bdr&z$4 QJ=m;0!67L- zFw$og7&=%N50+J~+_SH4`*v`YI2qaQ7Z4uj VFM*9iQ}s z9-)l^ON&=U5|kR>RoGCnALdVoeNAE8Yf2ijbj6?)WEU+;URvM}rh=s{@pZWsrDer{ zSO>B*b@WL*9jtHDZUE(#HMNINU95-M*T=vx(E|*p`MN|frz+qIL3Why-UjDz!M`bS z?Xui?&i9=uv6eD^_a!CNk$=>HVfSc(HW~6nz*M3I2Nb9Ecumu`&Wjy4z-F+&cxw_t zh83pAfoLLPYwY2}+jbnf8SutH+JSa6(N$V7sczy?OXt)N67Rr~>z;l>_0y5Vfcr4* zG7xt-Z&T)8a1U%ID9OdnOWJS2wBb6E_U9x4dU(~k%9P5|x{`Wg6@TRUaJr@wVD%qt z*ic#CQ2hWVISFbqCp|eWB|UjG%{J5afF413T?W;gI;-B&p2ETDiqkcnb#J#`J8+bs z##1w}`UX%A4iF@u7%rVFb`j*Aj`kDaD)E!!Nt#3Jye5s-0>903?)wp>OQ_!>;7-s2 zis55@pvDJZP)r>OR)54t_{9+Ps86xXy4Ys0pSbg7%@OUVX9K6}NSCphi$*RwcV7$c zUpRhX3qkdtik(O}m;zQ3 -E;NZmgkm=_ZQ7kRYB|3dd)qm;8G2s0lz5^fsuDb@d zF0IUITmu$@2!d>n0&BH@nmB8tKveW@(5QPpmD9Kz?9q{Zw-v2*U$HVLPS-uhu wVWCSudjiOLEB|5ja C(^$mos$J8*+Ti{{Z8LtCA zwbQ{k>wi|4OlxEH^jvs-40YfV=V^WKJ7Ky0qqIw?dTNaIov 3?bcUGNp4*juh1 zJaYhLK$^eg?1u-R!u9z5Uzg)wSHt6~xqcZOWGOwK9!`G;(JQH;^mwX4w-5YWe)cA0 zv$*T=HGtR%HZ(ytq8V_mj7~hHcqH(Le@B84>zEjHBmExL`0uXRRu4Z^@g3xx If4>7qt)1c0IK!n` z3VW@z_8NcqVm+P)293~WfHf6S8wqf#<-$e(t!qMq5|&N*XeH# z0_vXiF?C}9#mR=^KRl!Y>1|k50Vt^`NY6_J;edazPUlN-63WwUtIR=`$+Kk8dK&WP z5V#2TogBYn+77G$eqdN%`dxSM-UmU) YOr2FJj8>k@V*K$VeEmR=qM^$2Jqx;o2nYWs`tu)5U7!Uj0) z+NOWXI)d8UMVCRYe2iXs?5KDGj>5m+SmSr3^@%Tn4 ty18U`aak!y zCcul4F9vmmW7& hQp1(1Iz>~?m&HT zBKc+!RQSJd_;QnuTnt=kH!V%T-aNR=luw=qcP)xF;elfd0WBmfsBZCoa049Qb@K qs#^)@F~B?;3<9(E`L-sX zS+PH#vP=9Tt+}`@g&>>OZjXl|yE5J~7@8;am@RqK$kNTA3UXs2C`i)Lv!Hb5Zr0X; z^77gm;?ybZtrbrStgnc<-K4M|bz} E`Ykfj>766P(uLm;fwq9*j0a=ixm_L zT!VjManZUGW4rEufK!7({lt2j^PlqJ3jq!vvE2%2gPBVx)n#p$@!#%NV{lpnw=+8` zh+6a+#f6%?OY%CWb<$Wd76fsEt-C|rM<7cFii!(MiwS!5i Ela~KUN2Ll%n z4*PwLQ@j7P!)ntj^LBwvU;}?>*hWw-UEg8V8!GGW0qX?fO2bQ5!)<3S+IF^s(_nWt zK~H cS(&pPYzLL~)td;)qiZSU@nY#~ zt(jflVAaiKl5?P#Dl2V!q zh?rHJV-;thP#p#z+PEBwe=rDdC@Zh3F0X*xLB&!Ybb+gN^EnDl5bKtSjA!^LIK@~n zG!{aw1KA38f*m;}MF4*eg`nrtyJ$b^>}O~oqih3l>KRD+3p+rk_H1ZY5jzf^BAK?M zQgJGaf}7yRTF_R}T)w#snxEF~nP#nnDUJZRjST=@gS#GLwT++*G!SsdP0_w+09iK9 zt)(-=GFSwpM}{LtcD} ?z1WRR@{)YgwZ-=s$_qJ>3 1HRg|U{$dn zq?z6r(CU8<=pkUqWVrf)TLSk&? ^m}qJ8x3`QPB^GH`!r(5;6C-DH?fQ~ro;Y^bYw8^GNp zt~dd%6wH=cUvk|FDvE3K2znts5_I`u|2lqt1tsVnzYN>GwYGZ8MyQyjSY6hpR8UOh zLLXbZ3g1)yd07=8I>7$Y{Uva>v^=-R|CN81$U0r?vi w;IY;-R`VpYExa`XEU|w& zzm&%D8|ctY152Zl(g|<|`iJSDcx_710-x+?K+K(gmC{gy-s`;n!RblMb>s!_-OIFI zAZU4#bu} )riQ`b5Iu}qyoy7X4qq{1L@^Qe3B3~^@OgjoUF`=a zuiVqU+!?KpYxc{XaWU@Zv(#fs@%D?_SK8O%10E!QuiXJ7b*JtVlc8IHCzV8(CIVu# zmDTIclxFKdad82(Oa{?)G>6)E86cGz00PQ0%ZOFi@Ydx}IRR+DSbI&PmkgpBY@I~V z_kcv8y*2g)539-Ou@-8YiQj*y#^311SKFu|)NfeThRWJ&Hd7`M4x{I7cK9r^bcI<^ z5tPz0YU^t+vd@1pFli;0yfSjSCtTW+vb>7A%B>q=;AUUqwuso6v|yjk!0Xx%!PT2P zuRw(eMYd*Rh4m$OsE~7qWzM73fG`1S5A`Qj+fZH(>WJ2LAYJ={1+{;%8EWI|pW8cr z2E=E8-ur@q<=VoPMDhmEqU{oM$e$t0Rqng>QQ-Ymj{))V@yB24$aO1cra{#a8dSIM z=pAqsdcy4mdvXZ!a8!G6a8y)qNPFbr!|i(yLHA%0Jr)KJ7QxMA9BnJ9ar8K9A+?Aa z3-#SX__Q3Y5(AI0q-1}TBmCQ2THCc`UH0ZAE&V+wDLXwkw;>%`-rsY!Hf)A*pS2&v zzZZV{!0jFHHGN3b7gXnI^Ed^du(+gPjq5V^84HSwp``==mKRl&yuIN3w0*ASg;hn> zfT-ovR#!LZ$n!7s%W$$iwmnjt1hUp=ttV(Ut= `c*nzF oVSse(FU$i8`9jpb!+Sn#e1GL_bH4^l#;j#GM z@(;iP>n{2M*b9GmQ43YYX)dWqg$lB?G%uH+tLP>W3-_epnG<3;JImh!?a=-NH^Fw; zxq1DD3~dg`EiB9 D!c64%r#R6~)D6 zXU9cn!=Tun{Re>6H*YRJ4mYV&Yg IH9=68f>smlxN+gyC)hC6A5t*#4l7C Pt$r>ydH)7Cl6oS z aKK!mi1!ZFMk85)1E#SFqYVNT3ZGa6boAA{x6x-1t0l>ue`%;jZZ$EP$>A z&_#cOx^y`hyO$PH ;yzv zKppsD`NI?M9KZF!?)SlUa3%djD1?~>Mz5GLf5MmoxaMG5#e#DL^;1^?c4kI}GjJiu z-#VJ#f!pa@3*V)kXrX=;jK8uit8OC$mR)~=?E>|sJ4=YJOZYBu|EKT3w0M{jT9UqS zbiw-4TmTt6qYl)SQX{j=Xg3&YivTn}2Fh|)bx9eqsjjXCY$Em~Zi&xWlN}Ur(C?0x z!k*o-rV?l`YA)?X&)u9%>A$D+Bd}N4QfuW)9XUN^Wgs*g^uMQm3U L4d5B5qS+PR1i5^!pNDtEfkRqw?^(z1 I3=#r0%n8RVA`>gheQ~sf+jxmd<-6g z&)%(|aN-|35WPMAXEvps~;c!0QCzrhgC)}}n`@!nEq78Y~+4X-pRRwv( z`t-EIbzmh3xc}aT6X1O5F1RcA?a*^Q?)~>J5XcF&dbhg&A@3G$Jh2BegVMvid&Wqh zK@#M;ZM1PAZM>S9NWmQ&Bh%Yx{RmqBeQGiVIT9n!#UJ+%Pl}I>-V$?IyA3pLC@(K? zTM?YOuBfP_1QZc@wfWTzAKicYMf*Pz$L~r5Sa?iQ PZsVb z#vy=~z>VeEXv(p8O=N!3YfJL)9!ns6Y{Zwl_S^#-pi)WQ9jr|RYuA^QRDW{j@TQHG zmC%@~Bx>_&3bH579_+Kj|G4(R)*X9w|FsxB(Ho@yFZFKaL?p%f!p(o>KVG0UAn{<+ zk=nMVmR30C*Imf#<=C2}xYhqDl?ae@aO08Mt(#g}8;SoCFKDgIp!?^p1o^L>{oBJk zwcEkQ+RdBR(<2?@K_ZdUkXPIM>lc*6osdh5eIvvDwd8@Y?J?RAkQ=uykcb>|I1y`W zy>hO#t+BDD5i}G3beVtXxo%_6cw5c@YP!RZIbZLNcSP*z7!yBUtA|OMK^)2%v`%fJ zd5Aq !22uXVWz|S6H^UsguB~nN(Xac#kx8eNqYm@Oc$&6K<9wyn#&<` zJl95yfnEC#p>Qga3i$0unA@drP_v?p9^N J%m6b|eU`1+yZFdpNYXHF6x4~zuZF`w%rD@^@jZL@hrS*1v{wl% zhQ#Rp+U3B1N7}*k{e=g>+b~vmaogct$4_s7_9N9Fvi@Qn*_C_YMK0&xrWAWJiu9N} z^mOPgq(k*O6b65J*FXz?5S^l(52mi4wVEj9%s-P^n+v^*wDPoU9qol@ROGg5%Q?G1 zaa~pG_8%zL<=-H|&g{c+ANXvAYFtXZXy>Hm7A8aZNt{wz61^-TIy!VIG R1gUY)#VO+?$8liDiI`qZ?{q ?IZ@{;3JT8SMUrX4Mxo~Tl z3Fhq$yX1d+yWkP{6nt3o@yVM9FWlU9%bG2@5qoIq$+^`N!4!f#9(Op%FDYWpnynEh zAZ%7@+FC2@%8q$W^WgKGp0<4TD!=48P&LinI{#GQIls3v-Ujc0x0}zMAWj|KdL5eW zmohJgA0y6e+IIow;Yr{F<|l1f53hr~Cm%jR0T7wb2v1 z_hT8rQnNs!4&;E6`fP$aME^o}(3Mz0VL>7E2Gg5CllHj`y5;&nnlTU>5Xa+>1obX) z1t)(aDJC M+A=z2nSkhDiqiQft1s10+3tbZ!wkUHJv}u-a ziaHRzH}4d jmzMDnAEWi1TK18#7S)#CnGg>eH4=&vRoFh>DC!=50Vm6nnLIzRvn=Ryrl&X zypxZzBmw)Aw6c`}Lz7CgHvxl_g0q_e^OGL5&H+P{?X(~Ps*?`2H31ouM72u-k1Lar zwIY8Bs2^T23(mttGs;S8pc*bIqns%_B5MamJNj3HeE7E-(2mCm^1t^|%>TXDba3)u zS!a0%I0#Ocbl3z;hW{top6+DNf0}8E1GCDL%53@Q-dq#*FR>^spqEi%T1)w@jZa7o z1u_4LpN+hh>P_`c8yYCTW+;6y2fO6eU Yovnm=pl>%KtgVrX$rYjhmVp zs9_u4e+mOI1UdQPGN=FteDX1qUbblgwUfxUJOcP&lLogl0SA*hw;};&lU=vV0Tq)e zxHkcalVP|<4p0Yfc{C < z>-VpdnYuOs36s#emH|nVXS+@VyZ^wGxVw3OPw0`H^(8U8c9!mJ(o!S8#`ly}ZG=IR zn&K9?_UkwqDaDC8a^BhHH*TCgd*jCPv-9RHUp`Mu?r3Y 9s7bGR}!W8*wy)YU@bvLY%XYQFKyqTeeQ&Jq*Uf=(?M=#Nmgkg zO!vcRU0zlCHZAoFr=huab8}|hIvxEZCv#m6Tyv1zfY_v|51ZuK*d*4*CVOM|L~5fz zUM4M|2N8S1u%?=(T8ekGeNzJrGZ18d!nV>zEj59jz{xL--nj$pfM?V3_MF;SEj^u+ zmTnFE=2WI0&_1{0?62P3*jUgKq5IR06IPsLUGTPbn^Wr(8sf{LXXCvh!#ANNv$d^d z({>%$SkRDL(@@@6z7aHohT`gia=7I}XF0bdzpyAiB_kFxT_&DaT~J$7U0thxZN|&C zwr)7xvZZFzCeR9*E^Rx_sb2uIYW3H)Q5=|2+!x;(85Nrvp(Tqc!uhTqruCf7#WW5r z%<_ltAG-yuviAeZUEyNxNZ6}w0*7m=&eW{0$O73QDn2DVCoDU*9;6b5Rk@oEKiP8s z>WV|Y!6`8@TGI1j+}X_)byZrEExuk5BWeWR)>^iGdtw=Uieo?HlbgOl0i%=Mz8!zP zkGFuP_@v^sYqg~B!N{Y>4jedsGR&&(gQ3D(-LdBAp(E{`Rs$d)+!_xF-?8kQ_fH%= zdm#S&__1-zAjFwN6}yggfMv@=OQM3pz @2JmB?NP9=W!K(a;T@TW0r6(X<;xrM zFDK>{ 4)Kdx48})Q$&4k zZEjk2aFmv852NHi!RVrFXnO~(hn_$5zP7hDH|~dq%4N_QaT#0yt$R T4QWLq2iQEd$|e(qo{EMqFA|lL!dcV7C+ g4eLLdwkK{FPK2m#K z`zgM?v>`z|lap4I2kBGSp3#5TIAll8I| sz$#AggurvF1Z(-}xTA0q(^eT-cP<90bh@dM+&rc7+eH?@DT|O9{2`7-|fS zQE=a `wx6hP)ETndiZ}h7~sOLmtQNp4u~2~ zD~v8bDke^kz;oMjT65b7x}fVkR gq`v@IEQl*{0gJ#wu&CVTMtov*Bd(QSfrGsP zZj|1DQ-W6dA?kbj5Y1SL-zdLPb_4q8mrJi%uQ0kkrx>U41tp71=Yx4*UfH~I!uo1b z1N}YKK-pQZEPCb2i_fj}q1!why3N^C4mFY*NQF`nFsXkqgkDGQrkV5{+5=i6w`)E* zar4NPclNvsJ_NVcbgVoxtI8S70VyE4BsP-{q4~?l10o!ZtXuLl z5}0<58Vnk&e@hPLQ+ED<_9N)Mw8KjLt@5|Z-iA)(ozi!$!?&mQ;o$9tkI!G-v%jP1 z44{UBNj`tq0MWRis^!X(&j#t}A;5#~pFC cshw1N*|$*PNs*9w%&hB=}b3hF)^D%I)SRHjIW7Twi~T= zzkv!QZv)+2v#Khh$>kHsM{CP6bCT0C)8aC=Lp8ho92Ek`x1pdaUF*)t%q>dSk=7LW zo&W4J{#_3#0;in1-+m)u9H}zDfp~#E?}x41z78ttG-#!)OMoqZ_QUeCq5K0Ps~&99 zKHq=K*;Ef2b>xde=n{5WpbNhm2KmO*#dM|h#V?p-52Oae@JSw3Y< sTF_9 zK`y-lW_rptmmPy{QQe#Hxe{GG&IWK5)a7r;DPIiMTN9uqK_wA6>+*6vta (x zit`$CH J|8D!KKU`L{gumic z f_`*zCR{C^naZ}^jwvBfk2B9rFDH3xd_34)COD3c<_YyoSNkH#tie3QDyB7eRA z+ff>WPE>9|Rz`gA{IKZdfS59K$IoauGD-p?EzsBqgT{s*$XQjA7fDMB*A{0Ir1NKs zC=JZ&-vBo^oZh^*v81AUXXBNMS^yImMb&wbZ3;^B3iV69%N7 (pQ>bin65nlk}Qqz%bEjcIW>3@vCH!>@)xVE?k)PmN!O$`lA8(SM6fV<$=@LiCl zDr+h?5tW-ZTm`j6b7liQUz^9FmxfGVtpfqgVcTQlBQqmGAVEgArS62GhK*aQHXP5W zTLfcXN#W4KSOem=ChY~6K-G=18tAZ4v)X_E2F`3x_U6R;b+yUB8%h(cn|}$P4c(tu zb||~0`AFRrE!i~^r&bRd|hEclhYrlq8g->{3fUesllTgCuh8~j)trF4w zG 4k;b*oc$}-D~LoIrubAMxJ%Qrw7~`dv^D(9ecH)EvqpNdUXM3Lf;3^piDHDHM9ks zp85;;37ma@b2~vchHkgqgY3EE-9tU>8My>n4QaPvWNyn2m{JlGSAPO)GNa { 0YqGxP30jAV6{g%?5fX2#W7UQj@4D&%UP= zlw#y}^dx%9s1dXRT65Tkl$ydnZJn`*7Ehq1G|MIB?o~)(T-lg?hHbOA#kWH@YR^`% z51bhHSvcjmJ?ioTN`DB~a_qNHsD70Fs3-I&IMtCOP4rl3-6^T9I}d%{ PzOaY^a*KB}WC;l_m z=rINUh1Yvo9c?1wjdd@@Be(A+0`}6HqPe4ER
p2_-IzA4(?SFr7Axy{32I;v)$;D}TrE3APZavs~>&iz@b-#f}6A#kEV3_0><@)sI zSAckWWzy{M^|L3hT6X}(boOs+JpeQAbtRyVARmCoJ~wE7?b@d5s*380O|^NOeSe+s zB|XvhK?_aa4_fqm&%*i<4c&kG5sh1Kzf*7hh{k#FPJhm=8E?$2fU0&eaLSstYSFTJ zE{T)DFhC1# ?S=Td;u>hbiLSTk)YCg^e0!LyvlZSjseWXq?O!Cd;fg-c6< z0I?hz*nbMnJK${bq1ZEFjf?9%yYuNx=x*3dIB04^g9jBwyI4B=p1lyYFtUn^i9xOJ#D?^#obqLIRcJs?AUa=b!#JN1@#5BIo3A} z|J`rlDK~JF!oZJxf2>dT{k8u8OTX3cPJZ-6iGOXD_RLe>kEnr{C`nhVma5{AFSah6 zX3*xs2xV^BhMN7&;55-0zB^DG91`oJd(F8TfK&IniolB^tG&Gvd(HFe^{@JRQNQE# zy%$BLw?Nl)XqJQ1*uQtOz6R7UFPcCpR+wLyUyvW-yC~Do`a7PAb(L^GuRdTM)~WFJ zfPaASs8x&3&-h*ot&6v)L7fyEZk}CitiG+P>LGw0ZAeK-X$Vxi0cHM>Jbn&rFKU9x z`*APWbbXijQ|k!km&}DDfWf0wn2ecF@sD4;foa8))Ka|rYc^!}%ctG%rIOYU-&j9{ zV_l;YWhbD4f35T?T!wsnd3I%u4pdfFRe#qJ)GBJz573_v`L`=(2XkIOJjAFabY)8t zfEm23qGj5mm7J^PSIe&2(gs$?H3?q|3d%BC3A&Z~1>3s0bqh6v8nLr2zYg*y0Zw}r z(=#d{@$Dr$K}%luOB3(*to8ypSGe9~^O3XrF8+c;-Go`8%ERU0G(El8%X;fqpns-d z(|Uq}-V5DI|AJ+t !P^uGJ_1i1uhBSk7%8`-bq}Gv z_})y4Nk_t{1qchWMuP(n!?b^9$+}D(Jr&O^&)%xt2l5)~5AXQ#`#m2+ZH4b~^Ij6= zN-K49IP20&GSfGLCf!}Q-cH-cEPq}YJ&qo#qi2EmM|pd54>xXv#>?8AqO^ZyM)Lm_ zH~tTQUgf|0ofi)IAAP6 Q&XExP%Q8+G#3^_S3X%w27}2( zQ=z+EW4(K9@p1sCQN)4b-7VaRdG}VmSqHPol%m}*XKtLHX6r~JNWMUG0Fgwqv;A_b zbL(^spsCjS!|HqBwB>6UxqrO1>+H6CueIJ`D}83TMmd8Kz;rzJo%G{dTA}o%7G>q? zUY~>=wS}6ClXdh`Y7niaU|5Mtq=wi6WFfSU8bPP)=;?r-=$Jwm5%gTR+Pka^^V+1l z$9(YO&E0Q-1K{hNv*Y*At@HpE7$nGCni=jp)R?*)ECW8Rp$Ca2mw!_~1C)>;ua}=H zI|-l6b=#B4!xw?_vcd*}@}bsaTeg*#!*s@7+Yb*pzf_!ushR7r=k=E>|H2Mm0LB96 zV9&^)r7)ftwuNR y>frswj(D#FFS4BvFJTC!J!>y@1{69 z^3G
Wq#oXK-eaLovJNK*3lp1>BU9MwHX|8Z~5M`W7Zv{^eCi( zr ZMtVL z-&9j{=@>LhsebgBh8&Os@^gz)N{KN12)yA4=l~t19aex9F!d6%kDzB$K`<~)2|(TL za@ZVEl2IB5E&cGah;n#SZAooOSuRmhSX`Ky1y#jBK#jx7TI fNt-{LcYRhU7?TFF{n1YQfi?`CgTT+n)b96j7 z2093fkIpZGp$T$l-4|`(4dP_zJJ97W;EV$6lQUs+CP;3Dsm2VDk)xY|uPMvjs%?fE zw|Wz_iB29m@CEc?nth?IURVnMX3m`ew=ZHXCndW8W`Ayq%Ztj3t6-{bC$zjcy(#+R z))ak59G;n6R%g}THPyA&{~cQ f<)+R_?7v=nQg%j)LZ{gaD{~hh4} >tSoy*IlNCSx^vRj`PKE9Y3yFvh(1PGyX^r`r zMTtd$ARMGsBvv-o?Aihj6UQR KYDf=hx+gW#_1XVn~GoA6VwP3zUgUk}-^psciwpe9rP^klp=IlpuzAlCou ziu>i3!4-diH3>dwx{GfrtJ$lil$;JwSz@L8A)ZiHJpVuB1vIi3x5Jt^uj9~`Jg~9>U}x(JVstMm za1!S8%0W3nh2k)LRa03FP2MeM4#Q3Sy)&LPhaNvM#Cy)-vwL;qX-@V1^6TFNVozBi z++RP!Q%XvvX;Z>DC(2HiUjrAxrP7OV7=J1FwBm{_-NV?e{T@`zt)2=uoGiHEScCU| zM^?VA{RN!)q2&lc`E{AGx|Z6_*UI4IjW3BSjfa90T^411yzQl%@~k29iL_&|9%c<; z)~YbO8M?3yTgta B>|;@AOwVzg~I-I_<2xL(iBNhQ|K31MSfW!45=3s6@M1x zrU!=)af8{lyt2IVhMFxf$Vlvu-x?Vmn-U7MqUG&nFzAS0% ISZ6QPg#a--m; s#U_m88kV!*9m~9Rl@e`o3v^9Z%@%<^Z zgdTupr01qjEQQwYqz~|)HqMQVS~q8yZUJX~Vfkhq`A)?_7#tufIL9Fiz?@n~W;b(w z0=I+8v)WBP+hPC+Dhq`4oAFaMRw1~Jm&R5XE&@b4RE@_t*5A=Im3?1(`+ppGk2n|l z0n95wbC1v2Sy}d9;$3Re`)F|M;o# } zP49@T^{rTzTasO}-ue{|ux|GpsOUX&qjGCYt94aSp;p88Ltu;VC1_|JYHe=