From 2aaae09fb9f52c47b30e1226136b3aecd4efdf6c Mon Sep 17 00:00:00 2001 From: DylanVsn <43576618+DylanVsn@users.noreply.github.com> Date: Tue, 3 Dec 2019 17:06:45 +0100 Subject: [PATCH] chapitre 1-1 fini --- Parties/biblio.bib | 1 + Parties/chap1_1.tex | 85 ++++++++++++++++++++++++++++++++++++++++ Parties/chap1_intro.tex | 16 +++++++- Parties/intro.tex | 21 ++++++---- rapport.pdf | Bin 20987 -> 42279 bytes rapport.tex | 24 +++++++++++- 6 files changed, 137 insertions(+), 10 deletions(-) create mode 100644 Parties/biblio.bib diff --git a/Parties/biblio.bib b/Parties/biblio.bib new file mode 100644 index 0000000..a7b4ca3 --- /dev/null +++ b/Parties/biblio.bib @@ -0,0 +1 @@ +http://www.cochoy.fr/pdfs/perlin-noise/perlin_noise.pdf diff --git a/Parties/chap1_1.tex b/Parties/chap1_1.tex index e69de29..7596d98 100644 --- a/Parties/chap1_1.tex +++ b/Parties/chap1_1.tex @@ -0,0 +1,85 @@ +L'algorithme du bruit de Perlin se décompose en 3 parties que sont: +\begin{enumerate} + \item la définition de la grille. + \item le calcul du produit scalaire entre le vecteur gradiant et le vecteur + distance. + \item l'interpolation entre ces valeurs. +\end{enumerate} + + +Pour la définitionde la grille, il faut définir une grille à $n$ dimensions. +Attribuer pour chaque nœud un vecteur de gradient aléatoire de norme 1 et de +dimension $n$. +\newline + +Pour ce qui concerne le produit scalaire, nous faisons comme suit: + +Soit un point de l'espace à $n$-dimensions envoyé à la fonction de bruit, +l'étape consiste à déterminer dans quelle cellule de grille le point donné se +situe. Pour chaque nœud-sommet de cette cellule, calculer le vecteur distance +entre le point et le nœud-sommet. Puis calculer le produit scalaire entre le +vecteur de gradient au nœud et le vecteur de distance. Cela conduit à l'échelle +de complexité $O(2^{n})$. +\newline + +La dernière étape est l'interpolation entre les $2^{n}$ produits scalaires +calculés aux nœuds de la cellule contenant le point d'argument. Cela a pour +conséquence que la fonction de bruit renvoie 0 lorsqu'elle est évaluée sur les +nœuds de la grille eux-mêmes. + +L'interpolation est effectuée en utilisant une fonction dont la dérivée première +(et éventuellement la dérivée seconde) est nulle aux $2^{n}$ nœuds de la grille. +Cela a pour effet que le gradient de la fonction de bruit résultante à chaque +nœud de grille coïncide avec le vecteur de gradient aléatoire précalculé. +\newline + +Voici le pseudo-code de l'implantation du bruit de Perlin à 2 dimensions: + +\begin{lstlisting}[caption=Implantation du bruit de Perlin en pseudo-code, label=code:perlin] + // Function to linearly interpolate between a0 and a1 + // Weight w should be in the range [0.0, 1.0] + function lerp(float a0, float a1, float w) { + return (1.0 - w)*a0 + w*a1; + } + + // Computes the dot product of the distance and gradient vectors. + function dotGridGradient(int ix, int iy, float x, float y) { + + // Precomputed (or otherwise) gradient vectors at each grid node + extern float Gradient[IYMAX][IXMAX][2]; + + // Compute the distance vector + float dx = x - (float)ix; + float dy = y - (float)iy; + + // Compute the dot-product + return (dx*Gradient[iy][ix][0] + dy*Gradient[iy][ix][1]); + } + + // Compute Perlin noise at coordinates x, y + function perlin(float x, float y) { + + // Determine grid cell coordinates + int x0 = floor(x); + int x1 = x0 + 1; + int y0 = floor(y); + int y1 = y0 + 1; + + // Determine interpolation weights + // Could also use higher order polynomial/s-curve here + float sx = x - (float)x0; + float sy = y - (float)y0; + + // Interpolate between grid point gradients + float n0, n1, ix0, ix1, value; + n0 = dotGridGradient(x0, y0, x, y); + n1 = dotGridGradient(x1, y0, x, y); + ix0 = lerp(n0, n1, sx); + n0 = dotGridGradient(x0, y1, x, y); + n1 = dotGridGradient(x1, y1, x, y); + ix1 = lerp(n0, n1, sx); + value = lerp(ix0, ix1, sy); + + return value; + } +\end{lstlisting} \ No newline at end of file diff --git a/Parties/chap1_intro.tex b/Parties/chap1_intro.tex index c7e03d7..a86db19 100644 --- a/Parties/chap1_intro.tex +++ b/Parties/chap1_intro.tex @@ -1 +1,15 @@ -Dans cette partie, nous parlerons de … +Dans cette partie, nous nous intéresseront au bruit de Perlin. Pour le contexte +de la découverte de ce générateur de bruit, voici un extrait de l'article +Wikipédia dédié: + +\guillemets{Le bruit de Perlin a été développé par Ken Perlin +en 1985. À cette époque, après avoir travaillé sur les effets spéciaux de Tron +pour MAGI en 1981, il cherchait à éviter le look « machinique ». Il commença +donc par mettre au point une fonction pseudo-aléatoire de bruit qui remplit les +trois dimensions de l'espace, avant d'inventer l'année suivante le premier +langage de shading. Ses travaux sur les textures procédurales ont valu à Ken +Perlin l'Academy Award for Technical Achievement en 1997.} + +Une des particularité de sa méthode est que les détails du bruit généré sont de +même taille, ce qui permet de combiner une texture générée d'une taille donnée +avec d'autres échelles pour ajouter de la profondeur. \ No newline at end of file diff --git a/Parties/intro.tex b/Parties/intro.tex index cb13de4..1e6b759 100644 --- a/Parties/intro.tex +++ b/Parties/intro.tex @@ -2,15 +2,15 @@ % textures de manière procédurale et presque instantanément est devenue presque % incontournable dans des domaines tels que les jeux vidéos, les animations ou % encore les effets spéciaux. De tels procédés sont appelés des (pixel) shaders -% (ou nuanceurs de pixels en français). L'article ici étudié se nomme «Procedural -% Phasor Noise» et porte sur une nouvelle conception de shader, grandement inspiré -% d'une autre étude intitulée «Gabor Noise». +% (ou nuanceurs de pixels en français). L'article ici étudié se nomme +% «Procedural Phasor Noise» et porte sur une nouvelle conception de shader, +% grandement inspiré d'une autre étude intitulée «Gabor Noise». -% Nous allons donc étudier au travers de ce rapport, ce que sont les shaders plus -% en détails, avant d'introduire la méthode Gabor Noise pour enfin déboucher sur -% le sujet d'étude en lui-même, Procedural Phasor Noise et ainsi voir les -% améliorations apportées par ce dernier par rapport aux autres méthodes de -% shading. +% Nous allons donc étudier au travers de ce rapport, ce que sont les shaders +% plus en détails, avant d'introduire la méthode Gabor Noise pour enfin +% déboucher sur le sujet d'étude en lui-même, Procedural Phasor Noise et ainsi +% voir les améliorations apportées par ce dernier par rapport aux autres +% méthodes de shading. Dans le monde de l'Infographie et plus particulièrement dans le domaine de la modélisation, les textures sont devenues indispensables pour associer un modèle @@ -19,6 +19,7 @@ apportés par les textures. Les domaines d'application sont nombreux, l'animation, les images de synthèses utilisées dans les films, ou encore les jeux vidéos. Plus les textures sont précises (et donc par conséquent lourde en terme d'espace disque), plus la qualité du rendu final sera réaliste. +\newline Il se pose par conséquent une question de limitations, en effet, ces textures de très hautes qualités prennent certes de la place, mais également du temps à @@ -28,6 +29,7 @@ avoir plusieurs textures pour un type d'objet donné. Prenons l'exemple des jeux vidéos, il serait assez facheux de n'avoir que 3 ou 4 textures pour les arbres, donnant ainsi une diversité assez pauvre et une répétition qui peut vite lasser l'utilisateur, qu'importe la qualité de rendu de ces dites textures. +\newline Avoir suffisamment de textures debonne qualité prendrait beaucoup trop de temps et de place pour pouvoir être créé. Il faudrait donc palier à cela en utilisant @@ -39,18 +41,21 @@ fait, nous sommes en mesure de créer des fonctions mathématiques basée sur l'aléa capables de s'adapter, moyennant certains paramètres, à plusieurs textures présentes dans la nature. Pour rendre le tout encore plus attractif, ceci se fait de manière procédurale. +\newline Avec cette méthode, nous sommes donc capables de palier non seulement à la qualité mais aussi à la diversité des textures concevables, le tout de manière presque instantannée et sans prendre d'espace disque. Ce type de texture est plus communément appelé \guillemets{textures procédurales} et permet la synthèse de textures comme le bois, le marbre, le granite, le métal… +\newline Ces textures procédurales sont cependant générées avec des procédés différents selon le type de texture que l'on souhaite obtenir, ces procédés sont appelés les générateur de bruits, puisque basés sur l'aléa. On notera cependant que certaines méthodes telle que le texturage cellulaire ne se base pas sur un générateur de bruit. +\newline Dans ce rapport, nous allons donc voir différents types de générateurs de bruits, on se limitera cependant aux générateurs de bruits gradients, par diff --git a/rapport.pdf b/rapport.pdf index 794bbbfd54e227b37480fef8eebbfa76dbc1a5ee..c4d787c6cffc062886db8c34ec32ff35083e0c6d 100644 GIT binary patch delta 34273 zcmaI6Ra9lo)+Aa$74Git4jXrOcXxMp*tiz%4u!kBL*ecYg}b|VozwUJeZJ9W^ut;s zA9KuzoDms0-wHrV#z1Q`aDc2F06sowXBQ_^LtAK%wF~u*>IFu`ix=oGfeD`XBw}b% z%Hy~>qR4ZzmV!TDIA-q>PEYk1=-(%!)f91Sc!xOwM=MO*aM*DK84~27Hp*;A_JQgE}*Sk0^bFCMm}EcdcPGkCIIHdmQR#JL^8W5LcRkO8i|e~#hl|bzDfE!mL5PC(~Dlv$-#A|qmc?K(@h6O#X=cUh6ozflr5|qXU>00Y6*f{ zg`q8x)11`Hdt0ysW)0;1ruOUM)N`qP14E}U1CwsF@&=)udvik0lb1h#eS0oD@?GN? zzHae_y5~(LEDOFIDES)w0Jqzjt_jPivD08K1kKlR?f=EugXKaCzStQ{Yu4kr{Sx!U zDIH*UfZ@IcfgANC>CE$fwGDl%2`a^DvcvCmps!p>R@Z1NUj?ka99NAJ(Lz;!O4DTC z$?wmG9)tiq(dE`ebLgNgA@Gzvwm#N`|G8>PeOv=u{hil2s9{JCDp{Ld(GH(`)T0hr z-Nj!QNhIi{J0`_#ny>68N+4}@`IzZN<)b#m@KM(BE9MI87h4amgp*IU3``5vp;Ph7 z=`)A=yS}(`*|5f~uIs9V+TM)QGMwpLg{Pwf3C|^<_r{PA0P#g{1lG-k)mZ_F+tTABN1i+wb3QnD|Z-{fRk% z%q*0xid0i5N}1YTyV_OIY&!DNZq;mA#;@GU7gVzG18i7u zU)w}f(HlpJ#oOgwjFzvXR61Ji>f9pwo==_6m!|i-~gE$Z*nn7iv~`#dCYQ6=@X_R$yjY)s=ao?pafakumomR!H|&OqxaE z3106L3|#^S>IO{R${n-lH|OSlrOq+oyl~$@CeS4%iHqN%>Gt&-w^|y|Y^OjOm}SM2 zE+KKq_cKUZvQk#Nfog3dxn>0~Cki&N4(Qioi)`piZCAI;CeC%I@1<2H0#hLt zC-4MROyl+FOC*EC>#xF>jo><~{<`Q6aX$#N{@6}UmK?(zfO|lHFoLb zrOpsL!vOKV!{z{v)bFhxsrQ|qW-w9#FR80&FYv2qp4M!Z{p^WuolItlxFg_$s9O9F z3OGjGdabNMjzUAC6_Q8g8PlD!DM_+^12rNH@3`dX_N*cW7} zo8L^M7xf+r>m^x!Z<@=>@QaZ+k^ib0%0C{TNCPIFik?s5+W3)<5Zg1LJVi=Vj!<)V zHmtzyzhSHL@sKH#A=p2pMVxIKlly5uYZ$5T#FoXVpLm$$Iy~FlYR=8IlG8g9r?m3( zl4eka?DgUYbVBH96+d+q^cH?#e-#9ttF)RBS@N%w+t9i+C52GQF!SfW zeoN+HRGyOpA?8y~F&FNt8Ai34T2k!z3T>c+sYuI+uU?}|6BBXV^c|Bw5vqI#y!@WB zG;z%XZyK&8L2{2Z0mK(YkaK3&Se3P@d9<+9#qYwdLW9j8sQi|X$5o{^4nh^*$S{vL zUz~5kj21J{m{_WA(fueB@guga0Qm{u##EU)&t>6&7OZ38g+ihb)2)@ZAC(6MGs5eJ0@O2;P1;CKm(GRn$1jqA3{k?6EnxCAx%FVB^q z^1aN)dOs-dO}H^Xa^}9-_GjvTQfayQA$xEXcigpJX=V!c$qXy%bHY;87)=3h6=+vC zR`)xZo8YMt*mz0lw4%qV#RC6OFVN}#(Ffr}i=lCEDA$?t*SWOvqKBv^xop&LcX9FX zrc9SWn)|kS%OSbfFQVV5Nz666Wsws>w2m*cx8ZUYBUymf)9xuxsYefTm}vXccg?N_ zOy{k(5w4*Wf52%w@iyGp^j-;ActE(9$3p=XjT~5MG@gMcEE##a7v#;jmU_`Q=T;VV z8AW1w9B6Jkls0UcLV9so4f7-LaFIT4pb~LTo0BlXJU|nuOn9HblMxJG7VP6YoVPuc zQ+qp$X*_DswhZ8j zp^A76mpHJl4^f?I$QaWoI1w9)%sX`>KWCI*4CHjg7>DDt6xK4qJAXI~uZMBzd?A%gjuj>z z&mSlegmS~<4scAFl8&CaPTcp$mHn2#fr3{imEu}?(bwH{AqfUr**D{VlvZE)mvhIQ zhQ>&g$^zX~V2tJ-4R^jSEid-5B1bxSk zsZFKGVsoDhMlrF@;|)2y$EKY0!xCr@FZO|q)SYxCpO(9jS(47oWD62ME|W(n*RFe& zh8?Y}`FQ-p4A27V3?4Q)kF>OtbfLp3;#(JNVi!hDlAx&yOWwjR zdPb^9C>$r_?SZ~U49eme$}sb){!vt%-KU$Ji9G8`3^mPMBc$K&PoaR-@i zHC)%-wCD;nIvrvVJb-EGT#GpQI1w;co@CtNEo$L!9{=#M8%un{CK5*y=B*LjB8ENM z`fU2W?FyFS`y3roEK+56AbVJEm`y9YKatw{mF zl&SL8ehaq7bNglD$xu}OC3`xN-WKE#&(_J{Nw%J3Bi)Roa4&6=hC-@nL_MU@KarZ0)o zHdcR$L{7)v>wb3h4laKENq8q4tlxKf`J6szX&JBC{sUT@WP6v|5-aT>J#}_Kc1TwB zF!@na5ro4bu_ZY1a0QHA#^`CUa3-h-LViQw!?kgT*kU~u16lqouDWM;MF`%oB>vEp z;y-#kPP)42?0+L_X}MiEi8m|aRjvO+lDkD3zew#o`mvfd`_iYk^l0YbuKQZM#l^c> z^}+ib{n&bM!M=mCmYtFEO#fk51MK-wMEe3gtFMkn)jBvPEd;hVH|e2kMkF|QURK8? zZfVD%U20n9QsPh<7fP!I^owJ_!>iERbr`W@)@W?qwCf*bKW%(%EiRKmdy)h0ERr7N zg||MO~W`GCSL`EwyD zxURshVuq}|MubLbH3s8lidakd)WuOfG5}Yh7-X zav{GbYa7;P$G<0|qm|rCUV~!aRGx<$#RGp6=uPH#Qzmkd?O1BK5xt0a;-|!Z%aY)f zUrJ~Wx$~wIVOoM-0v)z5HmSi}x~FoBe{ho5*=z)DSm4}3v~vAN2E!@oS_D)jah|Mt zcKhSn2^g;>&6Ye^*yC2LJ<1c^T|!m7cUs2`vAamBIhdzQqXX8NS+1$BMuleQp#sFA z`t}}R_56Bm)@1d4l3EfGVTN-aJZ*>MW=3r#w_T{7$xU%+g>5VyK{RY=Z!VgQgNCn< zq8Lxi`fB-U86!MGr!d8*EXE`w!bumJ|OHPph%h#9fhAbjpl522xS#9 zU%zfvX@<&P)?;h~hIZZG&-W*)Wimn1}; zQ*50qc0;e!(ecdK{`=%`9SH!t@11n8*qo+$yF3GZM6W(?%7#euw=ws(EpZO5dVp^J zVc)=n2x7e5V;MB0IWQqZ!Y^bl90=qTvhENUm)aiC!uB`k(-DTiSNH{8JZCDupgGSVpg8A+lX0G>DtTvEA_eJO0% z#kjS@Z6pUQ8#hko(?w3VhMC!hTTIe27`@KS>~kcikOU*D$GT2W?{5!g^~#_MZvCzfu2h+1*6eUcB7>FbuqUF%k%<=^ zf?zip_fm~=n^x-#3P~`~Gd#$&|9;|eUYaM5-27ozcU81!hh9NxyEgI0K+wSy#?~Rn zPaIUH++MYTu5a{k2J8%;#Odhlwz)h8@d+7zD@F0Xer_X}Re4L3VjI(ms+c=3l;SRX zJ&8ydq?}23FinQb9P6Gr$_{A2w9WE(4^0+RZ^uC{c8aqVdD(YXcDuvs5&hY3&l7#+ za>Ri@A)(y99nuXR)H^I6)QVFE^;ZrOqMk3@ zfn1=BXx$g-AD)W0=?1RYw~hOT4){ga&14mh5xl1vd?ELvFl3!4S|*lz7pyd!!hNqQU#4x%2C7Zd6a}PcJ{ik^U9--t7EIu(OfJjV9uf}mzfcROqP576i5l>Rn38?j4jIRCnP#!)PtS!pTf((sqAz{c4EgX|5hA@4W}y?UIPj;9CH;;h zfb1l~2wT1W=4ih9WLsoS;=tBq-nR%jz@k6tcVKp$v`6YBOfDJfAtW!^EbFM<$%)4z z;*Nx5b@Eir1a{e-L;+I&`$AQgNKho}9!igbEE{ae9D|e(*OOmi$V#VkzFMkD`axJq z!*AiU%P#Sj+-FITl6CQg9(Z=wcE@pGVy3r1It0Xm)pTYSL#qu%k5NnH{tL5uqmsif zSKyRvM->To-hI?5@yJcU-D`ws43IY>%W3X>%rZ$!TpwyLj?De}K6K2`^`X+RC*Dt@ z;(0JQA(E7Hsz)0R5p`NlHX|DaKZgYD4=PMw_KfP-EB<`%B=nQMa`7US_STp`N?)!s z_xQ>6qBQqgW@7_K;sRJb^7|tUq-6Vk0kAn`KxP98Pj44VNONtsp8^l_`j)xW@6C0Y zcTW)JB4={33n$sf12PrEVnA>)|67BL!1W=@384|^1Qg5yNJ}IoJMR|c9ZSQ{AJCLd|(lgCr?n#aPDNpc>4ubDKyl~*1fa2kI)p-*7 zc@n!4@q=PZX8Ah2wF7#c`9g@?c_1GCP)9La9>dD;Mk<#nz6mhVST~Wy2)2n^{c9m# znF+ek4&VURbtvY+#T6Js$UFV!FTe>p-;hUD=6|GJ)bgsY1=Y9dKA`Aez8szXRR1`< z>f47F#MC8xG?q)7q}QgR*t5KCK6YY_EW4lFCihVN>NVq!^I0r{Qsq6K2Gk9wcs35Y z?iPPmI-X>M8|*B=YX0-`5w)lD=%tNz)ssU>kE+fO$~+Cv;uCD+Q*7{vM+G^-X-}zTkqKpy+qg=J}X~hoJBxt{*AHx?>|+>@lVs}Dk@ZA%uk zKT^^Bl*dVGD5LeAhr@$(1Mv1>D~EyTGD6rdxOJjK&9~K~!$Bz5F;AVbZ*z+yH z#g5&*;|E+WfA%I%@z6RW_Yev~3Lm*!SBH}q*DU|inPaO=y$nTY{#v_@M}zpU*7sTC z(^;CB>MVgAb1eqKFE*$Pcq@Mhj-KadjIzHJSzNq)xRUjQ_1GJF1zM-u4tE$%rTLOD z>D`ki>SuOtjO;&Ev(eh(29+rLIZQT=)vPm^vzgg}_`PXHx7+Vg%!G~SZRW5~KG9W+ z2bV@STOwD`G7m^t(BLmz%c94lo1ksnm!2YxDBhwtnu~~xj%q%NppE<3@8G!%1C@y6 zV$Rjb$%NN*UbI{CsP7YV(8NyVOGa6z;4zS6>&&j?dv||x(0`k?+WF{x~*&i!N0M@39>>I01rE@sS7D{WJHn<@vc@9 z&!1QDo&)7d6-atvN|mrZ>7z+n=a2No2gKF*P2jMu6wpjq8LipOsse2^5%;pJto6`G z$3qPorGBYt@@aCoe^dJq>E&|ON7Hm@L}%Y!>V*_%ViUm;^o7{%h<*=UVtt0#4T^+7 zBj{G-2^kgk1k&UCHG4>X3K2;KJ9mO^L;wRsly^=Xw+mVpa0`SM5+nh#KI^pULxGBe9Sw}D zeJPg3$075&n*_1JB@$-(51dMJ)AY`qa0;LMwjM+Q1RNMF-bIRcA&ux7mWveAJ~T7;@)Ym?PWB&h)=k3RU~rKf!6TJvuGYIN{&xrYdccdS4Xoy z3JG(f;Bml8b5`eF!B^)94JuX!ThK4P_E&q&OOAPUsso@BWp42J z@VQIlAW&8QhZ?KJnPZ)!R67 zMHw#in#BRG^qNC~rt~MqgIBy@-)oBM_u)3CsFLr=!tHW%JDw)p2h6ka$=F;Sa{zu} z79{44Pegkm-Yb9x{>Y#jzf&GHhC(nyU=oO+dX=;KzTFs?=53{OkNurz>C2NlrX6nR zR~Y;Nci2w$fYQV?_uiF;-8)s#26p0g47ed|`MxxkYR?niwQJrN3Vv8!GZ}5{fY!9@ z(!lJt@4;{{KHPbfzyn zknSWAzUhEo<6n7ra4G7~mW(u7;^R;1+AFwYi|Q@$UZ!jOz|Qv%2!yX6$TYFR|MG(%EdLI!n3&j^{xi7R)abG!W&ayo zq27UVBT+>p`1gwX7fN9C{>`nH_b!z7KQhBn%aVs0Vy@1me+C))7gL_@@ehx0!_ZcL z_9i$;sx0ZGl=P(J5~LCUWnp@?jD8>7w8v=+>&Yc8qf#5c?NJ>0cySbIK&?>=CPM-< zovwf3QjbBEW(GSWiO} zWY9cC32{A?QyG0-BzdM4w7 z*J*Yibi2O19qnr-BmWMWpO08*h76ZhR6;=oGAQL1SJ1ks^AUyJhR0Tm6TVMB((e_V zoE9^d2hRGb<%BpDL74o(`X*H%W9d!^njsIev@k*1XzwcQMcT-a^}ysD{=~~_^}*~* z#L%~CW(*QqD6g}Fvp>JMszJ(xH0Sy?10)Nc4h4fqvrK9;DLT`+Cu8_5-yQYCTCD+B z8N(q`49obXs6$RgTXovD^<@ilZw}IuwPs=NOFwW2D6g;Sc?i^nP9s}^&QPUg%IqcE zmS%{Xr_yT&U+fN;cpN|ZVh4`92aZDqj3jE<)ym*k>?xITlKSIi=-=2@q%G;I+oHVa zeeU0im$}zB5cU=@+boH@Og)7M*be+5SGnxAs^hZC&YQ^qc?|aR_s1y3?pS@fmsd83 z{LHHML1`f08^6ctMFvIyhlKIlXHrz5%6&6MYJY(#BklG`L{!r!_pasAQZm04lZo*) z2>626pIC(Eti<{Lcw#kaA(oU*UeRhc#iojl z;0aC9+^fg&dGd32utyQLcr|pI&*0IwSf8^?bbfnq=HBY&YfE$kYCiYLY3cI4(pv3t z9uLKvkQH=$46M{0KBhEE~5e}ILsRY7U9=x(?T68g1g{KNJzQ|B3DfNm({=f z4x`=JQFN6N6Z@S;a?}#7vaj&i81UPyS-e75NO_p@g!17J(Cpoit4>Ur5S(4SWhc3s z_voHEw^syQSX~YRpOl%58m@#Aq1I=`=^8u=A}K;(Z%Pz%PsL=7op}#V{hg~Ru^hiP70^?8(AHvRpo*f^GR_p zUNCu5I;CH#baWw{k$*gsf-1UP#Xc)Wms(H_Q@dh-O!&>z!EKePtg5hE{Hoa4_={8U zyR5h#SifgJAE@~H?nLE)o`2^Ob_j@(4<-NIwAlaMv;dr(|Jk#e5092Hm!AA#uj~l2}MD z(n;%QQq;TCg=Kx}fPAsu_q(bEHy02mKWgak%^QMDJ)RczuKR6PQll_7~yK3)6_Vtmut+OEY^7f`tAYQgf!=qDr z#4a2b!ndGFDTY^bbmBV_YOMWTQAkAId)qb3sc+?$9(p`FQ?7pBLq5Pcfei5ZE8c!q zsZ@VPWbFf(K;wL?B9*UUaC4F_uIZ=vI)!Q`zlBLJ7E5w-KShybd`n6)O&DjFpQFyo ziaQR$ier?LHgMHNW;xx~uVZT0`-GHVG43L!(uFY`KDyVF-oFShMQqsmHMaV;D6AzR zg%NEL)RN74Mog2)9v%i|S0fis2U7->zdt77M1NXbAm=~o zWo%+#XlP(!vVV8;^B(?g&h7ExfrSM$VrBpR@{RSv9OVqbGL(S%C%;L$-w4weqItac z@!)N4m}E*oz)l5W_1#wKCXw8)+hKI z{5&H3THYtGcUtEQ|wfL*hjoAQKR+tWhXQCruYOnjsKev@IzS3Q>_zpF>Jx~!w3 zpsM^gGb?9NWbR2IS?C4Dx=^Js_IplxgBisMsqnKr46*cDHK{fXOY_|V8w11mz*Bgz? zIVOo5v~dU`rX^TF6OL@dfL%;gVdx-RjPuC$w3`qDw}w|jF20x4*sBK33E@k92K#Yd zs+307y$z>OSda?oq=3X_Gqo5Wvv9)g#6(Cmq~zPjont#s>XCIuS7Qsc?~j0wF<>hl zIMMp)>k4h+K%H7wC=bQA(M1@!Df(J(jP`+&nYTvJDiyHvwfcx`GqytvaTRz*NKEjUk#0 z-gYvkmtK8$ZGX+zCaFAgT&)X_`_tW#xMX|7G{S{DBs6@_%Dh=6A z3oR)Uo+qe);p@Mn`e*R9)l0sc-FD06F6gN3nHNDU(4TRrD3w>&)_gsdJF6PpyW0YI zf45+FePxmF_x(h?PS0|N?#C-pJ~C0#X6jMwEl&&0El)~Nz@<3o5Gk&##2i#6=_;O; z1IPZ=o#n!svNVoKTUpE+nPhPl2-*JC&7*RO`W+QWO$rQqsrJPU%^G7<^D_&bM|n3N za>Pn!07xeGDYve+IEmk+xbB!gGPVlP>x8pOzu;oaU+9T%{qa}xK#N+P=J-eT?4GID5BVZ@ZgfYt0)O8FCV-3pGnf9|`lN}$W-m{T zCV*su1pp_RMyR|uns&f85>vf4Wfcv|0P#kmS1-5i>OJw+3* zAoJ`xk+I;Otc3iiDmt6Nkhn{a`RV**CeUhCyS?Yya8DI{Mk=&(-1iU~?K%82RB?V4bA>_qUta4#{B`fr*K z_{Rk4Kjm}+KLwvuK?V%Ho^J9G?5CVkz9Q3MT#voW0KS)l$yO&jz#f|3%1}0Vmxg1} zFnCr2&%x1J0TN7ZDB%`%t<=MWvs}|l>00fzA`2<`jyaPA2(2_Bv7$R`$B@BcqCtQ}RX^K6SAt`xOEX^xQ>p{lTr%N zsh$r@3egWh@CG4CG2gM$FtIe{K92vqQO&l#hrK%u5dix!$aTy<@$WW;8ts=BqJ108 z@Xs$b8_gzjbl0a{oh$Vf&`GxO5}q@wh|B3KI+{9SNG#Mpn_INIX(rOvHkOIiw>MYk zW;JZm(-PJu6*qZY<9(ifjlz`Br#Csixj$YG;4b$sbB}AfhKU~(HRDF=8dDY zE91^%t^zklXIaX8>o_~z4+iyN%H9M z@@!PJ**P&>9qqh)Dt!NjHhvY*rCDkv`StYF$Asiz?e=tbOuv4)(y&NvWW!X{v^=}Ls=Rd%@nov!eG`3W z>uw}pa}cBE)?&!f5p^bpE`G+Eycehb6x{)@df~H}t#^ZOwO40&N*) z{LylYI#qJbA@}S>P9HIb2{fsrh!BC65&%y^mW>jDMkQud#O5*)p%y_Wgrkmd31=a+ zkff!wSVcStqzswD{ZIl4tVb=60{y;dIuc|RltHDE2?truK2tV=flos${lO7iM9gEpVJy%8gNK1W*_m7gR7y6+xz_`T@;4D;Sy)4tph-4>Sv0rSlw8ZY`W4 zniTi}nM37;pkt_IDv(dm1yQ||Cp7uf%E@CAuy5I#L?l1Z2m8UoGrp59rWa$$szWV= z)@m{%Z|oLiFJ$b7!e#L94~Lkk3Jy>j7RB~fd+RWP{-qA!64)ucesaF^oBGbjh159C zA!3|+Cx0XpI&VobB1*+rKq=_a!wfMwCPFJwl0@VLB~&;fKsMq}d*FDhLe2>pzau>Y zgLqq9aAVm2QlDnuHcY0z-I-gB+YWugoOzYq>>Ru9bR5PR<@fc?|5+I6Kj`-VHzl^e zY$F2#{&7{+P1Lqt7eEZzexP||BKvOXx*FXFX`)*SQ?<_Jd9tpB%?;{Jw#2;f)jgLb zONk_LZD~F=5pUM-q-|@)P6u@;gAT3(kbLy*r!drlBj133B|( z?A?%_w4cAnP2YVRU)q>r4|we3SNJ{CU8a5YB5~@$tbmYib=E zq)`J#)W6;E?&{?JcQ|(-pquu}t(s(cJ<-F1?&;kOh%*e(9g!o3zRfxy#kL8HsV=Y_ z#q$1TfH$d5zclG{0J3^H@0mb!;b61w*P`X?w6Zw|J3_3`-pbT}4l@y4L_(WyAzet0~ zat8XnBSN*(}C z948k-9F3(3G(SfySF5R}IwfbK~|9u&fTY^@MXFtK#x-6+{FR)Hv#+kf&DF0SEVKZOFD0ByzKG~&?ZB#7(*C2^lBe6FOVh4P8w~LVt5P6B zRk|;*%7_emE&uUsE>R+_!pWHv&ZY9a8YN1UP~@3YDi_=xi5)?OoMY{IdSn$PtWj5CEVB@}sBdK=^{ff zM8CVrZJ|PW&q}`K@sdVKoQs`4ys1319AkI;RLf0J!)DA*TTe1%J@#q3=3;!yL`D&zDlb=jXRd1eMN9;sn;Uzh2P`* zn&GoIb$X(3{ycuU<%-dsaHfj7&pAGrR&8b7?rJL9?P3mXHhaBq)r_6PL#X~0Rf04Y zQ*v5zZ|v2HIafd#?OYr<>hJQq@Q8501cML=qZO!^&Kw~th%5||=$|q}D?syGsaPb4 zSz#;93vA(KE zs9AaJkp;f@N}CBrf73vV1~oF0d_OhAT-SMEF6Z4E-)wbAW=4~X8e1tz*11eJGw&vm z4{?UV$jYNoU&Lf%A_9P-tGltW(ODuV{WBL64>0c*Xp5n~EDy}i?r3d)sD+D&X!H$h zz5rO8O)NZP0TEAEyGRhDQIi7I!=c4P8v4a&<(Wi~^260+)F%{tik>CwbnDa|bsV)6 z%UY{F1nX3k$1<$Mn(|1;QmlmA6nH5S%GnQu;R-_)Ny?a1P|<`3l`G0jtl*kbUgM<- z=E}yC0;r3|N`cxctgf-`H5=73ikAwPDwj%^YL|+|)KAp&7UJ!6n=x*`I_7zgr;qg- z`FZ2u^CGPFQA#0I5`c0db-vJrUP^`wKIK_ng*HVl>S8qP)VXt0_qgq8ek*ytK}2wB zY>Z4$GDPDIU&DM#59)X}7V8Sz*D@s2VgT$5oBO%`0U+_vE<}`ibO-B_7IexyElkz- ziU_s!N;{|Mw!RIcOGfprLi;vU)HNjyJB{^T!+-1SP+ zhCgP~8MZcVd8?-R@z;S<%JTz+>R!PQvPVl=N61zZmU~vtj7_-XE93`XqgP@yZ%PM-+g;6{p;ckfT zh*0y)s%wuRn?nvsAefIoU$^v4Rnt|7kCGMIR2w(wB`GQOTJ92(;>M4~;4|2Df_N37 z&}R@jb9lg}v!d=?D2l2u(vlRe9=fr!e!{Py?*SQ+wF>Bdrg9wTvyWhbpL!PAsEhJ1 z!ypa_p>haVr-3M1fXOn63E^qKXi<$|<*5ZMcRd~lZP8y`D@UvsvG+QG9Z$ecSa|w_ z==VEOvKw$7|0(KY@jvh*RPV9!4{iyg-l4{Xm7u)-ZE$PGd99@Y>I_#~9XwW%@TNLf ze+C5I`JBWni6R^6Rk6p67*M?_2=zt#B`B}r5B(~fD<0c-W;B`#a4xFyoT%>YKJ&JA zpyo<|88UE8wF=1s6?kM?FO9{YAuz7Nr^Z%pqMaDuroDGHc#9(=mR#0kW5R`` zG9eV?lOH@*lhE{g?_CH)EC?Hy2%h*FCC-5(=J(-B=rbF($L?bOoK=v&Ew_O1H8?QV zN+FPrgI5flUwk@dMdL`o74tETN7yKJBP+OEudQ(n1#bqNDejgBFX81>|<_q^1b^s z!8uGXXFRiH61n97upR_n`7m#A)Z8^A)&IjOYJEk1)BalH?OP2Tx6hylki58&b|*4) zT`H@9MWMDlAyn0@hepyPeXh$8zOF=9NmAAr&$R`4OJ(NzXZSgIWXT`mQ6eC(tg))Z z3j(QH{WTr<91OT;npo-IJ#agqw2i-(@J{NrNXFOP%@e9JsMOX5l3F69Y{%{tuXCt% z+dih_Rzip_uN8FY{fI9Z4@ai;p;s5kD+^?*N0e5;r+s8jHUh5pwx(fuq>s%gSDSFv zZ^RYuLeg2t2bt84GWOe$JtDg?0zwi@#GbZkJ?9dwhKOHEuC@VzaU%?r!ee-E~P~q6=c(qQ#h0W4(~a8b8iU- zm6!F^dK*yBQhX%m+b7?uLGmZYmx=66r{8eu<=-RDuO{jbas~zF@_}=Z+&|wpq`Kk; zZqv`60CnE6Q=CO0H5b4+CNBC!7`0x6}rw`Q4qut_|uI>zfhE0_h%|2PCYhL6>k#NNv9FbV~w68Ik}a3`0{q{uT~F4 zs&ttR0d10pDZXzJPwcT~PF5~CX;YVJn9cMmK~)>Lv#S$bAHe8G!tm07tB_RA!Nrm} zbJ0sw#hS=;^lF@<6OLo*8Dw^PDgvIVAY-CrU8v0JIR|1%4qv}X`IEyaQnBb9e!V>o z#-~*tD7%L7B|7Q#LU5XCDVv{G>fSc7^gXVi=1g*z3_9F=oeja6E8aA*=IR!of3$JL z?bEMF4Zr95a{&q0L3Gpair>C;HSGr-Ze59NsVNCS5AN@f_5;j^>e6ePz6LVMdQu5z zGEGK+!l+YQzmhj${zM6##>e{=V*IS)XchPv%pUaB0qXA?s_Y9NCsYD3~CeHW+u_KTxvzi zZ2vlXz{;qw1*Y%DiCZCq+_BLSL1UqCbrL@@zc0-<`Tgy1hcvd z>qRaE{!8&k*fPfG`@>m&V$X)s_&ATOwW@GIP}pE(mU}i=$3$vP7iT3g;9IqkUOfi{ zn*izmV(XovGmW;j+t{{k+h!#d+qUiGi>-=n+qP|2Y}-8buYE55b6cpc0`W5+n z`kZP{@`T<}hk0cyZBos{juCHvtI+iotqp12PI?}nM%jubw>3Q;T5&P$k(6Hu|E9eO zyuJ8|w}66{#9@;YWTJFz$)mE+87^oj(W1mLiLQISEK6ya9sb^7`6>Gl5kaAdMSd%c zI0KlS?vpv!DXvS55wEUGZIpfaI+wehI}vIZ`cg`|2$yQ(=QStk(6xcZTfBYA%wL^% zZI?CSF4V$e^H(O`e?|3w@o}MjU~Hser=v!#rl)UpxYX_XA9|lk9~w`OM;~69lYgJA zbIS~@-NBNu*$Sj+=Dv%+N=Bv{K@gmllmk#1?>czk#r!I4o`h@ClPJWqjShEtx5hLZ zy+~ToM4OrN1@gl^-4cQ;$T94W5Uh*8xaM z`Ue*S~i@@B3EdT%9O9(^Wzh* z6`6AJ`U3M&=OIj3y%TB5EP;E(hoEVWn`E>B#}^EsB_`|%z3K4=umeg9g__5|7~Kgq z6)D4j-K_FutEtkowO4At?8)xqOdue9iiY$*3UzJ106fdoD&MQ<`vAgENa7;^)VM6m z7&yea61q-h!5)fKBEyT2sN2q2&0Lm=&8l442w0XMW~QjQWwCG_ED-o>ko@&S=`3R& z$k#mOSU&yu#>o35dsA$n;_8`BL)f6H%IaJ`9YQ}vXIP*swed!HwWF0kY*3xF6F^Z8J|$OIIRC_4St16l72XiRRBzKuLfO?SSdy2~`xD~i_vU>O ziiV-Ty|m5Ph+s!#ZK$i5P9sGX)MKC*PawNgNhqjCye4qbI96GQ`CN$90bQu^WLBJDq3n-; z-yQox6y$3;d|ma)@?;zb(lmmh`%$p)wR9RNMFQxYe9Z6JS}yC_fy5K)YVcsDb}Tkx@B#nY# zBfs7Y@RBw;e6&x01$WE$)=yRui)2cWxO(XL%rB#`oV{N z{SqbcTIdio`RvlO+e)?Lkd^xi_aQ6X(lc3zxUR4}( z%uxh6Q!NXE@PD85)BzZmN^9oH@ygvyP@4P92_2;3>+m6ZyFXZH<*S_8jgPfoDC#in$QFs z0+fzHAI#cM{vCc=I~E;~Km>I8|8nF10vILg3(^2s|EmestZu1-rjAi_UQz-47lk@1 z0!@t_CY%n&3Qb1{3EUA)0WA=BEiaD_X3PlbERPG>7(;wBoGP=e0g7ZpV$LGEjW)6$ zD?56WENcjwxi#(ge%Hv*8}l3MiOhS}bw$t9wR>-8*N5GFQaZNyViOiR1^@*O<&uY; zf}5X$oq>7YS4+*yDjFbdRCQLLYg7tHy(AqeM$J-v+LUBes}x${h<;sXoP9a9kw%Or z?#u80xu6XB%w`>yz*{4BVSpmD#G`b~#&1#Aow%4~N)0d=WaKcl+>BmpJA4d&w2AwZ zlar&YtY%tDK^G^#dgfZl58&(C+LHA4h+PdC9X->#xcFQt8Z9j<`I4N2EMq0^NkP^^ zlZDSGoA~2YTB2yUqYbhLBGhe5kMg2J>TO3)E%xTF}hg(h~S0U zohu;0xzKw0@yM!LTp{hMpjypS#8bsn;HHAAaqn2Tsd6|I(zi{<1o(Yc?UE{8ouJaF zdQ(YI;ipsX6;R#!ICXGiPmN}P@fT6?wwnO$;69+j3ySwbU7IyWz2p_S3SZLX^F(aY=8$eA($trEimd!tNAK}`C z8>}3Cn`qO!>t>gm8v%ml;_=VhZ?Pp=A1IRB)(wCAugzPxY9E}-v>@UB&XS0|l8&)952$2Ahi<7!U?Q?=*?e#W#v?DnmgO|6)d@}`Jr z!{(pIPGpLGEeJA6ALK2@=I>7r78AT@E6?FZ0JKr_8VZ=H&jAax#usR>78veD6KTFrh%U-c zq2Gm#trY+;hHa^Nap($mrMr|+&#&fSHZqiUDvE}SHslty3{{dW6XJO-BhKD^jsJ-t zThTp*pw*a}2Le&T4r4J`Kd2T8#)FB* z2m{(&TH5yMsC{A0e4UhpBe@I}5592OUESlB?3q+1NBdIND-jtZk>(+(CGo-vdtUq_ ze#9HlK%mBg9(BFf?uAlUdC2QBxJ zUUzYIl}SM$(UfwUKdAJ~@xZD#QG(MOq(|irq-dv%ouhykw6H-WGd%B?)NDYGJ3u?a zJ$rQyNJ1gmz zs~t6BoZsqUlNOPZjS#PSZfsFHk8Yn%&>8cRgM02pu!m*>0pKgLNFj~TL(UEgTES6I zPne8n7owt1@9}e9U*hQij+WMtM;!9irH@-VKYiy@&0I@g7@t>Fq)f)8C4jGrkJzy_ ziofZ%+1TGMMV)TDSz^uhSb=VR>sQqo%#&{_M}_amR|!;W<&={6+8v@!_02Dt%^PdC z)D&M820d!6hN&T6m_0oejV8}dvBSSK!@qfrjrBg*9NvA|GBHxR6d1FmqO0Ig%x7ie zG^L-l&cz`h8+4X#j%oC;*#IGyH})kPyRl~WX8~8qMh_QE%NBhcZJ^7I1Im~eNw9JU67o61P7!66db#4E}w#@ z#lrb-VOrxsQ#%F;GyiYblMy$B9{Oh9e_y>EFOQyJP#QS zJ&)c#?;-JXXMQy!1H7U*)39vS|y!(abvs@S2cKvzUh{+PXd(C}f8?m?OTFO}^NQzHfICKr( z|5sGp)S2n81NrEPJH3yw}JT$ zM7O1JT7P30r`7IE+L5AbL54)*Fyc~N(B~rbzw)AY6cAQ(p8z+aTNF+JY1=N4GQ4&! z**LDu=5!z#xw?>GSKqy?h38i7hmy6Ya`%wA>I_+!sy=Wcq&qve=2__Se%5En0n5oo zE8?loQ4>z!`vACek`Ba|rnwIj1OXFQ*wH0GU!|6T$U1P{jj1=}7*4Dn3n+vMl7ks* zMsDEydoH&h96$$l;0*`qMn)_&LIaB>4G_1Y0PkATPcH!{X(p~&$661qa5C0h9)agA zE@bjwPi-snApR4F9~5-dHcsVcfkvL0Bi!YDy#>_9H^h3on@mCkY$VI zl=JR%%u;Q0wcBiGmJx)q&WRtJVfCe3toieEX%Au|iH!^qePbW~ae@v2&Su)Z$yb+5 z9{YU2C677bwdwa+lEpi_%5Gm$uMiC=@7iqmi1ug~knJVn^GwPL&Me8%y(q~I~3@7FL*qJm;pNt-g5Iei_Q;J%_5TE56Q zbTx8)MFgNhl$ik|*VH6660m4e8w)vw;9y7}tsxKWlPBV2WMaW1*gvnMOOaWu zfbx0NT@icr$Yon!ahT-^)RN9tEZtom>c|s_Uqj(=7sg1ll0p3GS~zmL32zIu%%x^C z(VA?^`-P%77`lJB7BfqeNvyJEZc-RZFekLEMgJsdgFQsWqSvQ2YLjX<#4e0MHB zF38{HpEJ`RMy)q%#B^xij!zR{j#|QY5~sD< zQ^r#VE@TEkBMNw-S^c+zY2bUuzYt!Hv^CxZNzLwo*?VEPu=xzqpL#vO8c`HP z?!QKeVDn~7>NC(C zmclwMz%;xL(D^kO2Ihn*%bjY{rHHQzs!9e_CHFO>aDpZZ6+_Dssx@n@al^ZGy zoRr2Z=3Hr8ds5Q6oV*80=p#B?ha!%Q{8AK#X3@eIonWQ+{kH526kOP>~5^?3#;j|Z?K%#>x`8EcrXG45gb0B=uk zjZGiqWVQR1P#TF2tv062E=;|rqJ?IMN8Wf)`d6I(1wYFoz+T5Ft72#>oh5F1A1S`(Ya zEV7!#$as^pjpI_m^g^^q=-vWn-Sdm3ItGpKI!c2-H97`~y_50>c}8YnUy;G{$dn4&N?&9_MI@EP^4z4!7#NIy8C zJAB*JYtRKN5Tls&7bYyVAl4-{|(MuD|@QS>>=L`FT@J0!z1?Dgq6AlT=|e)S;OdVuA&| z7lvtp3fj}Ql3VBGO~0Uy%|aX5k!e%X69=DnI|(4yNALEo^p+fI7XyoZBey3zA-%#? z%#icywu4@meOG;qkTA$|CzLtc-6Q7yxZ$2Admad_fsZ&tcw%KiP;}nJhPr6i z2LUh@1Uo>)H;9YggvYOvq(@{sM%bWj(TEQ9f}etJMe0J)E+=haJ#0(r@J%TgK*cjw z7Kk_ELmTax8*${D4r-p?4s_(0JZ$s1ajFL+zNNkwvbdi<5F$T##01+TXUlL@Z!)C7 z=Y=-pWQbNc(0eezM46E)D|?{DHu>WGLkZZ~lc8|sdC*JKvQMKGqP_c}yhjzrn&tr; zF<4%^$-Co&uSaNXPls`^*Q>O}EBfA4cixiJSr=?To;J@97yg}~weU5(J2wW!|H>%D zhj`(ciD{JsEZI)@)C(|6y0oUHFImGH?3xRExILNTB0YH%7@X$#9b@ZM`BF$}d<8In z*%;3bcN=N47?m}hFuc}gLJT8YRVh|iLq2+5$YF>&D8SXwjYWu}9XNJu`Wqo3n_VAFP`-t{&SMka0>ny%$|z#_S4Aq zvtL>v+59D$QoM`hXg#;Bb54>ggBn1qa0-(FD4&R*`%PQlg2~mb22j? z*P+|zJ;A<@*Ny=2Je;K7S#`eBWv8^c4wnn-zT>idP{*YT60W5fk}bB)zUt|L&fV=G z>Ozk0VU~y+{_Nvx%z+$C+ggOl7b#c5>QnIZl7)^iBf+~v)^Kw@x$5)p>;}Z4kl?Li z-Rq0tHB@D_Bq^CyuAiGQ+90Dxkb~FyNg)mvtM~NoLOk7KZU>qp^*|5N3DV(nBXaBa zVYkkBx|_?)bKv-~tMOwP|HQP5Lp19kKGQ_qlNXH~x~$Hpyc5tI>)DQG#=EDtWiRv^ z%Xj=zolu*{1cXhJ>Y(}NjsW0kHcW_2^jwWo3#$i#cklZfnUI~v{lbdK$kF+W#tV%u zJ6O7<UhV0LU|Mz#`y|ts4X30$LRND{Q$bxaE60nSo!-xQV78A}Ugp1+ zYPrAIAMS!GynSFs2`R8c&EyK#h+6w+2ULaznp{{S_NE|<-ASW(+@!}Gs%xSVWe6Lc-qa#koV&gwdGE_Z{T z_eL-p%6kf$78EpXi&hF;bZR-&#>2Y@xiJBFA&uU`a6e2BXtm1QMAQl4Lr!r;lPC7) z(8UaerVr0lnN8$~Isl|Ib{f$5a}({@_zut&0bbh{PpUCf1Q|pDFAwR#p1u1U`#yNn zCN)W$c2$?XQQ%)5ntx^CMnbJ;%bb&vkAP;CHTA84y&7ZfC^oXIw~^<3%Ael3jp({* z>B%d(T9Me!k4h89qYGJ7sh16tv|WqD7->0`uunC!N@SD8g#ZZ(;ccp@*sG>)I`{rJ z8;qjkm?oLB#N(*FCJKuC)t7KrH&Y6w$JIsB$}&dacMIqnE0*@oUln9ii^hhFROL#i z{lLj=+9K!C2&sRMYAy4#YzLX%N$y$NoZl=XdBO^$Fhtpa{_5-6|QQ?M9N&W zFEj(J>b!ztOaR^ODwX9NX-!KQOT5{+&n1mdd2ey&2CuF05BWv z4NOF!17KMU>wILFkxq?+tM7y6D0`YZUE~i^7G|l|l1audjjDpfw~FqgLYwR{e&U9~Z%wOSOVCq5w=vKqu>U+PFVmT+c z>H?q4z6f$k3q~w}hkIOCcUeFf-tn&erQ$(xtN^-hjEaRX=!6obiYy&Ge7bB;#|b`4YB@ZwV3cE+7@*l|s=i zO90VVsn-Lwo}3(z95in8Qr>;I=X?MfY+8}u@QGkPBBm-u{=9dVgt^ht8H^O4~R$Nypxp|AFxwht?$9uzoZGzaLL z%3@h+xw^l}s*AEqD=v^Y0j=ioZhvz0v;gbUs;bzNwBeg}-Ic>T4*Md~KZzDn&*yB8 zw)OfjpA8ZR^sYm=9kl2m1uDt8l|c8GF2=;=awWdvNz3QY94LCSABv`OM?D&^8m@U4 z8Qc!gS@-U}o{`}j#Q63Jj&iKIp)r!Nj0fx$8AXv5PT2&T?w_Q{wJNwVN5KX8O@LwT zi;8OCXj>m%y@Lkc^YA$aJ1|3%D7WKjrjmQ%Y$|3IswN_FFRm-5@+6)Pyr$t5p>Ft# zTkpiAjHFW_GKWk`vX*J-xPrQhvIVe)IT)V}-#*Drbp^tnpP{{0&Hi9T-QMA=^7=FW z9O)`hmhO9Y?s68d3(8b)#1{Eq?SPomc<$u^8pC90JYigidIns2&-AI~cWeOu0g4l~ZZz{=f$Qu<&Ng2FZ{2O@4bI zP2Dh$c)aslcMqx^p)Ybs<}*DuA6FSph+Mp=_EE51-)*5~g&Gk>ibBimY5<5vvsrSi zf=OOL$oNEGy}<0)?!T=Na$&32b`&#a@RtB5!bm=x`+{Z7MH5KE7I-!fDS25{OVj3Z zX}Mt+b9(j5-^4jRZifs$cd{PlU}EjXQ^iE)KAOLRM8z+M%QF^+#2@Ciwx}>_k2kcd zg(q=2+D`unP*+cJs8AdREda8>hSWMn-_PbugrLeczgLdoVM87WP+c8Wv#eJw3VaB+v= z8VLH`sA_x2`;{vBmjKX2o+W?X-)~>4p>Cs4`A8)7k2TGlN^N~=w~pi9pyqhW=3nuO zdr_=iRi7LQK^Foem@3&7oJEk@YlZbWv%R@ z$5|JcWsYoORaHIBWeK?ndZ$vLKq+3jdC@pei!Vj(uUMug2_1mnq0Ig#W=6S2h;a<& z@q$Nc%o8&dQ7QlV*B9jh6ggvL7k+<>P3-0S<) zA#d3Tbh1c0cMBk$Vu=UOGqEbvx+o@77i3#UvltyAHJGlxS2b%mrCz<;f5m**gIHU? z@0;wI0(nB=`_85nt40dV({MX=f3rvOymCV|1$+lVpcO=-@Lqr~-YOVy=YX;KzB+F# zWi6y~YPrf68m;rr6>7*BoTEh_&QNQNa_QjPy*vfpILMF~@~821jJto`*jWN+DnE5v z=cGweLXYF`CB}2<@}>qVcdDiDtNAtnG>x6aF|i-}Kki8~7PkL8G_W=>*hPA+p?fuu z)*U2CRYw4#ZGw>aKZk)?|D_DP01meQGF7^2cI5H%|W>xJUWT8SKD z`GpDPA}`fQ9n$6E@#0MPtLW68Dz&qszi1yvG}Sr)9Bk@jt0O1N47t>1vptb)0o9U~ zA_l&`nR$k(Te$^>$EqkFPj4BY!xs8Xy~y>q1R3)sDa11N1+;bssXzJ2vJiNMD<%}C zNSBf#e6qhH-iAO(qM;~B!habN*9U7zRFSP9T|~eSN$jJOM21tiAvuci)km$#c1c_k zKO>I=hWtc?i%`?WF!G6;f@9}Uxy2Y#L(;y2QTGVyK%r16<5`(ZXOf<&SKAxg-!|Pr zNI=g)Yi?KWEVgx>u-AX-?Va2LP{zO@!9A>&R6dqi7r_=E7vC0NWC#&-2-Z-=Aete= zAb8D#XFLGMY=3m^;vHT!ue{&{D5Bn6HJh=o#l|OnCd+CU= zw@Ex@O7KFwPoS2B{s>_hW(r?a{$XnIUtIpF`M!tDA?kUYVy~7Bd#BtgIzKgiA}i;Y z^9oa1?2EMv7T903`1d)u*joc&BNJLPq2TMGIM%>IG~dZ>7a9qVlCMr`l76krs?HMt zkaPN!8XSXqcG1kD6Rf4SGR|d%YLrp6tFmwosOPkn5<3joDE&{D5Bih0cg`Kifv1U? zMpb($FK_%r(U-VLTAQ1 ztLfq=(*zLZKg_-5LuMuML^!Z5cac-%w8vUkY1FY)bx^}OR$F9>BZ@* zpN}~dBFZ|MySlb<)`;p`*LnDIste}B2n!J{5f(ag+xp3_QJPaYPC)odF$mlNk@HU9 zLT|i|pu1hD2#ulwy^sX8)*zy`tyXvmqR%4?k_c=RyQPx@(o|h(xlmD0;6k=CwCXCb zEHTSgs_xC%9SXk8wPv|MwR@#~ztDE(!SQ$9Wk|IS=d@w^Ab$IpFGB-s4GIF=ALzDw zl}%XF*+5#@k*iP*dvFV4_P7ZEP{m3Ihg_JCA6%KL3&8N0#w%F?#nf)=X|afPrMD%MRS)?@ISK8ro;=$NHK_h1u<>$BAXO>W~u^Sa&`#-1$M zl>BT-u=Sp`3NjA3$?-FN=Uj&qGg}Jft0h^`LZArfGBD64rRa-JO7RsSIOy26<3W06 zW#OcBa4Gg973Om!F}c~S?%o~(Fh@a>T&fKy?uc9nbV8~HY*i&!t+~9dcq0r+$|Ja_ zs&XpAtEQYgIXYb#G^>(yEpN@UI9Lj7M(Kx-E+liku7IHZf(DI$ece)vgXg1%R16;# zj*V+S1#E~DQpsQO8z=xwsXv;6Rv>=IpeLDQ9oA-ok*mHPNjMrtmAmd<1BgIm%x2Zu zQ09n5?Nm-Mj#<&SAA!eZP`L@tG4xF+?{FH}8Q(ObO=bq5@I;^|Z=-Jp0gkx>^IQGL zzy7i4xH^v{VJC%0B>C3n`{z%YZa$t5Ve|8o*R1umUNPHTkh1_{XnYoyNFD~5UVO-5 zt>tV(w$!7{egs*ScEtv($l)^0vZ4 zWI9p2W4P1Tjk(f(=UVlpc6^X8Z9jjfv5i_B({0RB#)^aAfa3nVNtekG26Mn{QD(-8 zP==6#WMS7q?S24E3@K#PI}Bh$M#eBOT@<$yIHU_H*AC*Gb~D@MN9V~p$f~2sEni>%N!oCt5y!nf;u*y6+<2uK~&@FtEN!t%m4Syj= zx*>~a--Q8-UrhBQ{oQ`7V8vU}POv`%V)8cVp>`e-VdftzTcd?(j{yM?-G8Al4I|Ic zpRjq@ae{;k&)6QHT-}}nB(r^Njm+`*#x1-0W{YuN0)x&5-Sjk$_Z@tu@CY*+(Fe2ioC z3E!=B8AG%~yTRx=_^qoV_MOJn<@KP~J`Wb08k*<(Q)tPTafx{YveQpqNMAI^%;EJe zy78~d1La~&|9R~SGmR1LRK$$31DQa|*NnP00zr)$Sfhh~(;oWz0DJ(4_?JN_iaox| zW){?Lw!7}_pXBPVkz{h=Ajbr1#?YCr_8#6Q_);&5xAgfXkLxH|K#cfKY<1Fty)ARA zt{W}p7hL~YEVZ)g4}$;wCV-JfC=$TVrnL{CHr3-=ljg`Af9B#aK8nl7MSUTl10G=J z=p-E8>#qky1tm+|TSH`DVvj;hZna{^brT~G%$}_@os9r6 zzu2yqYt*^EPNtD2Y`?cqOtfYvCTB8pz}Mmcw%H&;(QySPlTN2f5(+}^pGi_0Cd2Bn z9)_Y+J%AD5K|{!kk3#lQD$7f6XgB!bPH*1rf0h>sgyWdVNC+@}IY^vLpDGsEGajeD zFAHn70~`&%*&&BJ6s!6(sn-!%0spkkeaAX?(EjcK|TC8s~PQ#G78eG7n;t1!6; zNQms#o24)AP6#Zk4O-i698c3OF{^1UD6bbvksz?zrCKGjmx?%SYV(@H&rXqmImd!a zFT<`^e-hai_VSx3JOjpBzN$Y|`SU{42PeW`$l9oU>mY}NH|hw|3T$ElVV^}<_v1ztk=bLQpIVakA6m4Jj`I$gK?yrzP+EY6xa{GX3+-&!@VLr(~AK4iP5 zB>sF`i_kJuH`>K~0Z5zLSl+TkKE&B)C8z>)AAMlGJN$J7@3qCnqrhcaACV{i8cI`4 zG<_cr_uXwVnw9$Mht`j+TkRGpqh4lD8A{+JR>-Tl8gxPfZmVQSUBR4Jt=|v6}|Dv7T)d5aO;Pa!O3pm{NThu2`fM;cG zb)v0=lDFYs6V?G7>uG>tprssQ;)rQv+8gRU&u}S~FPV04&j{Fi#_CD+RL=ReU}3J9 z58sF~-gPK`Lad#~CDU+=jd9m^nE04=VFKC)p=lJLF=QRYQTG{b8Q+?o4$P zHTfC3xVAI(;4zD;X-!^+5Bhu;s~-ZGOob%l6Lin;@5UCj=U)K1B{seDqKw$qoJxEH z{ZP7)r}G-uKy@B#>FtCj*MWS9b5xhi)xRgTM$wiadZ6PJ?vxiDe^#$q(WK-Yih{J_ zOs(UiS64XK2VRA)$rO<|_DdZoXHPr5M>896Eb^}Ng1xx{%roHLW(u8d9!O$_NSY#_ zNCMqAYaMsJ+^+zpgSvwDTZ~;f+oL%im-v+PE_nU-4(RfGtEe(}*M&ivOD|N16bO5k zO^K=@A893V>YXgd8DsgOA$^RmTzEwhoY(Y=0;;!qbTHB%B6IUURAL0$S7b1QC!Smq zH_M{}@;hV1+7!f#g;*%`LMNKRnQ<~yNyxIl^V89I4wnGUk=6rs07=oObFR9>M1(Pgr^}oj^FyGBqF3PBYoe-PqqJ@^efTLzc4+%0*x>q<4Xq2q`nn#MDr5G$yu8StvO!T2^hxDP2BX zs32Z;c(x$j>pAReLXGzLE*ZSxcu~JGKX(gFk!lv&v{gQ zB@<(g^*Jr?>JYF+kp1NVWy4(;uMF>w!t!Y)<9|LS`s}BGfEt45gn$2p+&YVBSdTvx zKt&e+DL4Nkh57$ir|}j&73H@EQriLW#23M;J4J$6IhG`lHM^peaR0tU^Y(4{q39#+QW$lRh641s18I z5J4UWaFt+?qn?(Iu$SNs{KePkmL|KHsy=lCQf% zIdQ$$xgLQJ(TSzqQb73_#fWGpUMakK5CN_l~FKaO^ZN$5TATCGc5f!tWd)#(L z$Xd21I8if4&6ki3;>EL?4yGveFT2OE&rTZR#kNsXc-2gptL~ta-W$UshzC zv^U4(BwvMe8?mNU59fP@&1apnH60%_vf$U_ELDsXfpwD4QNf*ro325Bfol#NYK&E+b%I_c_BGQVc85D_fpT!P_Oh%<_UY^bRi0P||nm8irM$COyBP+LhcmeH@xRi1-u{aq+IAU|RY_o4Zo z=)(GFaM7c(di`?->OVyb33iqSd7a)sC@+!8WOckHif+ig1(#u5isg8&Hs7<#xKSwj zns;lhmymhcU;;S1k*7oYM&itpm!(*!im|a?P9(se^=F@f@WXn&07w?kt^N#*OiS+D zsNjqq1KP<==!5XYHOJB+f#3!p=L%W!UqsPd^B}j6&%3w38k?YvQnd-gZq)Y{g)1}C zXs%Wj-<{x=E2)Y4!_%TqG{Ri5Ez|m?X3a?87x=tGvABB2x$M6pH#eW$b3YxP&Zo82 zS4=A33OlH3N8%QY02bHwQ)tD~*v6NyHXbuAuF094gN%=Gn3O@FQ~Ul37bfX?-txCt zU16k?!a_t1C{g0F_9oc@Kn4jpI`7DePw|@9XK-13>+9Qy%NmSG4dz2gzhTT+Gi>;f z&l@%ZbDY|kU*~(|Wj*uvQ0eaT;r?v^ogj{4y$*^saKD?$1B}9^`sT$suZkA=2Ga^{ z=zi}Fj$-i2J`;?Im=J z*wvLn7O461jkh*IAAk~FZC{6pn#Z|h1<3p!0k&L$F+dfBp`2S+T)@|#qE-YJTqkU0eU%|YI)KPBi!AURnIVA-9AQ=t zT(Xs~k`yC^y9VBA5mLu5vrk?YU6gEx{a#d>%Zb)i9M>GrNd<+Ov6aR}W$9H2uc%R9 zIA|X-=Rc1_&45O&V8sX1;)$96>GHT1)`=?h59&h)u^|Sxcr@)uR_;jekq3FDB^UHZ z0Kgvx&F%k*8~@4iNLl_XKKws%qk(~fiGqcrfrY~!5D=09h*sj_Z(2AuZbk`9CubKT zR*rw)X*yg0%l`*&8rHB@#%)LW>gg5P!Jq*zT+!C1t^f(fML}8PYv<)9#N#9GF}0Z> za2xFHEiGn_)~D`*ZdMST{k5f3`H__(hNKja+z)dfXoD0Pyg=53f^)S2Q`kKxtU(`w zA!jA5#ATjG*L6SeYmamUiUdmoK#Lp^OpMH5rI{}26pt)QEzB1d8;HgoAWtu~ySh7R zAY;r#!VAJlC((>SIM*@*1M7-u7@`+pEc7T@JzLvjj|1W zvB!%Sjr_Y`Cb<3|b$kiKH>bfna6)I3BS0TJQWy%J5`Nmd^_O-=Uht>3XLsa)_O!X$ zJn?S0vx7RSajt6btW&8-{05$72uw?(#2bFT=X4HYz~Sp znf3W;hK+nS?TE3EdBRr&XzfdX4Jc2QJfC^6AN{oD$KR1*I4>WQ>*?*TiDISNoh>3@ zm*KY)>OWBr5|CLy((zG~jjpKo zGRnx+7*9Ud;-Au4JoYQ~aq!jQuGeL)*GgNf;y^@Xd%^vvRt{|k1Oi4ET05lJDcfT- zFGN(kYCeLtzhAY-yE!&=hjAgULe~(yn99AUJsQYoE?%D6v3A&2Id7$uHp!c5pX?8d zx6C*m?HSJhS+2kJgD$>PEA97Z=~oie&IMarAGm_%R-t(9YsxpL+8uTPabr5YWss@*xR-Gq9vs~U zd2JRjD|;{a1Eb6XoNXQ)9e67iOq~m8HyQ8eq%A%B7HgeZMy;}>H>_xGeTDeLf4juK z9@W&!Z!DOq*q?W!b?HEt?JK$HCH|Iw$lg@s=uZZ&UVxq)gPdT3m>>G?+ECgN3Vb`> zf5IPob&}Ws-p#{g86>7$LCv@fxO775&}x|oYpsv(>%JEbTcLRs*#L38!j}w}{mju@ zSX%8!q7a)_kG>wx9uD!W7%2r71n52jRUo-6^sl?eMoje6kd3h2*CK5S3TIulR22E9 zXH_*#jNL2A^~H$|PWes1kmC52LdB6Pe}Z!Ylb4DC%kf2%NNh#)-JIyu>hF0pP8BX_ zM9c~G=$@yL>U*Es8&KUA(()?Q;QT5&35PVMG7%5G`64^hcs6vEe~|I zrbYAs(z~?amp*}Awrkp~zP;3PIFK^@ceZ!B4g62|G5J2;6+;hvsAy=Oi!cSAN6DC% zU({4%qGt+Pa19oUTaG-VfAA7+kdUp1Il}Rw=Tyx><7XPbN$qn>^Q`cR|N)xU9PRh!?aJ{zJl!0V)j6 z54WfqG*R+C^zRJgT3W!xFHK5^=6DJC7!5Oxy$s68LRjU4G$JfQw4>@gJy*njut&B4 zwdHO0)b5mS%D;kr?Jrav7oAM(qt34;EP8s@D zCD;TFK@+XFG)wSsR$mXl68R*WMM?$0Z$bqjp3_0gz9oxH%fUy(4Y6Fy16Er)#@H{V zbP9qwR|19Dwy}bJEggUSnL-RqV+CM`5*f%jYtmmocOPd_i>cW~d_OBP4lB6NguqK? zz)RPXLbBUcqRoTX^Xs%KBCdVipu@pvO5do8U)exz4z?!_SLSUJjtwy2YZQh6GT3=f ztlcg7Og0+piO!TXtt>qj+0%eAWA9urs)juGQo;ttdDB0=zbe!=)Q;c6m$Hn-YHaPV zR5C1B>3TlD1kJ;8bF#Yp_z7a9t`EuhK@bMv!t!_>PLBp1!VAav5t1{qpNud==h_)- z8oW*V5hxuj+(>qb(w^UsL=oKpvt@%@j+tsCN)%!v&EYzzBM3Ogm@zrmb5PN{cCnD` z)iNYgT4sn9D(8j<4gc0br_wbfPy2FUtIxQM{;D%EY#4inn`{xBstn^rL}8&OZM2mt zlUZnGF_WrDHk<#kDP8c%%zv03pImI@Y^AbK`((ih%98*29W6|Yl%-7l_`Hgiy+ds9Mo|0|; zA?feC{VU~Ny!&?W%0$KjFV=OssjB{m&2P=ZpU2{UsOleLi(BJ%_n6-iRrRzFf9$sz z9-f7{irT_p^40)7pJa3MG$Uh6Q?s;WLxVJPlVppulw=DNL-S2Li7kHbFW0O!wS=eda=$V;|24Z&_EjMI+RGYpB=X7rB$vlvG-}TfCCD zCE6QG?~>fTrF&uLS^Fdx+2lsa0h~A?;SP^TG8JR2h zUgZ-YpT)rS*|-2^PIeXn0T@>|7jt8K7_W_Moz8e#PPpqw^heOVGj<$kCKWKLXgA=0 zuqs}jUHZ{q0MsNjYMJzF@kB}IxIGhkcySd!yku7GAH6G+34q7?cH?MQS(o2e!`ItC zzuzX^s~(=tu;XjjdkcALy7KKBj`ic~w`;qp&rat2el37)>~{Ra>tjSp+=*TQxfZr> zLl-LPyg}_q_`_;iFE{M+tz&PZROgAkE71ZSWosR?W%3C_!yO9+djCto;B8W-er@+& z2MeYoNFW9p*hZ#OrlNLYm=7R{;N)`SwZQ1h&4(4K^Uc>JABhB)M>(&==c8C1Uetj2S5r`>l8C zdv0sf>LzsjG^YK~;7~95wx`lmfl*bE{R7CaJh*fH69nK)|6-9l#6<3t=&PyaUi!Yx3N9e?f1pXdi=51;RaU7(j>g^EyOB$i&tH0 z!3JOhfr{W$RK+YKc!lay?huOU0a1Yh9ZSq3(gm@k?gxoMcr#fKr1iP@kIfkA>lISy2sx=`6mNY7L$gRP z!q8DD$b3lalJgu7mR4T8mRlGLpto8LX96UH`nFticlICrv~~R_6y{L|p&l&c%-pBb5_QQOmJ*1VY`TP)lA!rW-#jX>fOrtOe1M$V`?PtY6IqA zQwE@D(9G?F)p6v#?0bsKRe+bJzq^X~WnRp{SXlUmw=a2R7m*FxH+970R+!y+2B?=1 zV;imGn4-_wWK?D>EfG50wo&pZQ)XkS&ml-mjsjzCJui_9sF_FFk)sT9mqkMR`nrINy&@smPI7V zM!ix5jZWzxc+r>wK@t_}aZO{WeMHuPXgzO6A>x_j_)4zdLHNrtvi_XM^8g;1dQ8+- zD+XM-IL{AU5`IC|AtqpU@2KY=qvZ>LOBa-*ofo1t*dC)SI_%iuWXAs*2X>9vF#4#hli~1e7gG!* zEJOxJojv2pC|Zn=RapMx;{Y_2SD5c_m-lrSMrzju!Xw|cuEPSfz}3keJ%*>n)G>=@?WiQ;*A`vUi!zQY-SpibjuttZFI3G)F z`ELD9MXM^5w1h)C+|=azQOG#>F@EAg1_6g+dnLRH*bzNRRao$f(-Edv6Q?`sD(E#H z!Ogmm?Hxhrs?McW9e({i)K&^UVM`61xu_g#k9?Gs=naTvPH%{ zF5oF6HyDb$j5;LtQvfJF%WB*{qy@!4wfQ6Jph=@2JDGUa33~aHc%!?th~)!BEST&Q zGY}C-*`r=vM~n>&>*Mv3oi&XYs5;H<;S|({7laFD5>=fna!{03 z$8VywTk>!KR-2NBKap;VwJOEjjJ1-i-#e4I#jzur3rNI^O@M|$PtOf(UG@X7R`nP^ z2DNf8>lTaJk@9V_DDu&!oCSNRXc5dUTNC%w*y@Ur2xh2A5%c~pc2X~*3j|D!x0RTe z{85RV5eYnA^|d6k1<^>i4eA{Uk;$m)6JoB>z)(xxL}Uli1sMh@RSG@H^095O)r6Jn zStj*hpQd7-Ho%}c*{Du&ojm&Xp4!FG?_~H@tX9jpaIhYD=gk&PV-H$~#bTd}Wl{2q zG%y6Wv@OLP8s(u!XNw!`$5of$j$X{Y_IEzp(0k?EmpQ^OO&KIsh{_H}ik@z+9cqTGIdPfj>dd zGB|M(pjf(KV;JWkTMSbB`kx-u55Mw5oaDB4lv-G;tVL4M38E@Hi-P4|FxQ5B_UFxM z-+Hf$v%QMF0XaPZ3FTO`pB-h3qo>rXu5p{^vX!Uwt(>ibjKrZ>2lQcWEsB5{;+xM_ z#>qx~k*VU3cP18}71&y3c7tYn7CUXPUYiw( z-uoKd{9dAcm0x^F;e!leWcIlZccN$8LMqgCglP1D{WoA!qdU?Z0sdbBA1JMlJ#^QO z0;hUoVpK?CK+dFJ$rC3CIne+?C+ZRuykw2LF;D*s4`6d%j4H5;C)%nl0bgF8I4Ttm z|2W*ca8BwyOKIA=Q1)O5kyg7IK2*^S>>+(-o^2k^{&x8~Aqa#J>+?C2P)GX)y`hXd zuy6?TJ*oB4z#-C6B4v)@biWqTOyV)(A$<~vc%X-VDkrkH&9@@wL_+|O^x4z4thPW@ zae{R!20a*^AWm=5X|zGcbt!`n!wi`~J2-A`fQ?psheviy1%zT43b1?$j4VkxOBA0E zEdogZUTY4|kbJDz69~bGa5Da)Az6Da9($K!BghKfx%umb+^EAN1>q6fI0oJQz1W>v zq=j~X!Zf!L)(2bKRw=;qL@R7e-rT)xib2I2(==hvx_6dv7==4!!H278c+8qYOLJaa zBj_ic&StL5c*K+~aY6(X86MZFUd%F#ic$~T9vot0yh~XVvv|i8WLGdcl}JS$$nSlr zZFwy)H6m2}BXOnHtBq=Sh@tU7UMM+!YOGYW5!xD8hK5e6F##YhpJ&8xUbwih(YEWc zFlPm>I$9LHWvP5VFWM6_%}lO0P~y%T%Z&+p>4D~3jRg#6IdUk{=(G5TZj;(P3^l6} z@?3_!o*BP3q^!)?eL095EvAQoLGv`Wc!BhdxWy*QS*$8EXSDJFTc>g~wGmAgl?ttI zyLZq=zkR@ig%3cJqEMt5Q7W~mR}hA}mn?VS8&)NZ=Knl?l&5X2f*+$X&G3x_yv zbv4aj&)7%Cxtfr+p=nc;Dl;}$H(v-9s#Ysx^_q2Ks{e`;dhqgbq)C^I#Y|o2qki~W zwRN}d!LnZ~3`o z!kzIbW$q zEy^ZF4ri>{2rrb#>kaM`y%4?bEhbhjE)4&~>iXs3$TfIQe1MRlg?ERK#yWg-tI^6e z%WjbPTv#-6rSOBGyB1bXH`9I#)u?TZcYw$&;sBIFyb`64v#>oOILL}I*NmB|?Qw~R=Q0pt07rvE3?@2{^9 zZ+iIs1;@9}w^Fct%)xbdvvfy~8?6;h>u3Z+@3;Ll?lw3j!KS0*UduaxbZ}6pSxWTv z+*o(xqHeeN@UqVJjKZGFlwVhO7)MtH2qQ9utqv&O&KRC)HKcq4lt@4O<=p@`zi zC3}exuNKy!JT*?P$QYl6?mOqll79v!ko0z|{kG@r4Z3m5@9qHt@7PASYw5J^gwMz- zPObHmy_mp%z+I0{<;mDm+W~O7cmgzUZZ0WLAGh2Q>V6hlnuhvQr?wHuvh{>NA|DUu zz4pU+I}TA2NZq~FQU4UzUW!hk#WqkK5*s?zojCfx;n%~Z*ysL=jb^EpXQ{o)a?%j6 z_o_&$x9`D3m=t5yK;eMN?2Y`%Cx~6;lw1(f--fG3)_WIP7^{S^D%+FInF92q99Olh z+EvLy0{U2wmMQdtsS8sslA729ilPX)UrpExrui4K2h}y`(fbXPZ$JGYD5}mAwKfDS3rh*57K+zz3+{Bu}EF#bn{xSB_PBjEgUNbwH+y{jyLJCg} zbo_P@sT0|sHr`5_v)ybT>!G^dW4i4#!IhMRTTA1=LTmAx{g~Psh3NC#7IHLYxEZ)$ z{Fyffd~$u?PxkhfN3#ES(|0g)G_iqU<|bky`mak$1rt7ijp=`k04=HfibG6r;hq8F zKSCk7ijq9rfncDxDx5=e#j9~azr9ABhMt;xLQv}J8x#T8uTiScwMxK-6-CO-Wb)G8 zJ(Zox+X7f&3c8rFIGEz3TzzW1EO!4)&=XEFR1GLg8Yx1nAogbbSQ zD=SxQl@~iQmc?}4yev^_Kj+?^1c2?+*;K54G!_R-Sb@|8rlv(qx9ybGV635L5-BXs z*w>KxajUyt7LmbvAH3~GJ%^lq86j%TbyE(9>bAYMA$}&x?=p1(fCu~%|C| zhNHBFf)BmcT&IrtpF^e(=bN2E5t+^e+nx8){uNk9BQtv4QB$*t4g8dUI{WG}gGg9K z%BwA=v5D;$DIQjqN3CvZ%WJVu$2*WyGx`4i7eE%4ltLyl06Q!De;?lTQxzSHnUIEW z{a^??b<~Y;uZYB@0);1xI{^y>FH(KuB;+s)G z1BMQEuO1eo0cSbg@tmtV9`)q`P;Ex~yEA!bz1?i8Na=#v=cVmh7$=M;b?@KZcH!*+ z=NG?#A5+Cv*TcMB1KV0H%Y?{)ZpC!yS>C2zLrdRv_|YW$R$$Zp#+u%lo0+@^2fj7O z%QeMS?Nvm|mnV%IYcs%~vZn4eV+-ZP{|v)P2D~0GJnVnnr=1%6Idpnr?JtifL3rH^ zPfX*?BTPT*oY7`7?x>=@|Dn_gB}B$QCm?|v=n7KgCkA^c2O+H+Ny~tPkTiJq~Ker zN!V$U%80yX_w@&T5fE{9VCz6`A$YC0SPW4ABRioHFy)o|g%93UlI&Gai(`Y{>VB~c zk$3B3sXA+~G=ST!R|QNf=p<2f2?3l(zK@0T1<$5}4r$GXx!UaWX1fYX2jM zP^qL~8Km6USXZ4W!tNr5ulp1ZL^8Qt-SuN|CjAwzJxuqQH| zf4)A7>b)M071rv>yw7M)gvx)NwtalHw7xRK1LV#oJbxZdS#WtKIDSgd%+Dj=e|}1l zymbBbc)b+M_{)!A(v1)b^*i;jI=($DIu8%|(NOd4f#1H9H#Df*ewemxk2mW^%o{~D z=9->DRgcfp5no1bc@-7x&L-Hd#rc>5Y1ZlZDIIS5ANtI4A!N9Ep_Q^2N@)~esfD1F z0k}X*i3qcpO9K>H%?(_KOV}#R7N9FEXiUoJK!nLfU#1~K{p2S~+7zfsmEc4K(gO2@ zs4IY-b6G~(eZYe)^aJ<)1(?WmMMHR_UzPS?RG76v5C4>?6u=y*ul-$es>UfpCvgYU z3EHa&B!!m*r&)ArzCYco2rkngI$Eq~(tcTAesJM^`(+U9+-tHu2o^sC@ywGVjPrm0 zYmKrC^BDI{+2OXyLS^W>u#@x0H@!Tn+}L_+XJNH3Zm=!q;1!ga=u-H9L6<${&W#7a z%Ern4-{Ec1f>u+t#0X%VeJ!FxB=6Bc9XC~17DmFPF|PqBio`%eM-xt5CZSmdtI@@4 z@lZ)9S8&%u7Don8>QEBz3)4YP8!kXEj#P(@w_WxzJQ;ERA<~&$;=aydP5IApHSGD^ z{{D5esuG2aE<3*&1dM`9fQP@rN6O}7W+Y{%pD+tBdk5&~g&*%rsvwRFI~J!erIIZq z7sHctkCRzKNbaxluO0ukjq@m>xlhOYEja7TaoXpMbAIY`)M5yy#^Ej}m0j;*>gx|4 zSp0+=c@12>4b4MGoj8byb+yarKH{b zLOk#U00t9Rv5Eln=4xM3A`E4=(y}coM4CjHqJc^?8-{1mmhZ`6bruV%|ml zGlym=-i6v`O8(H7(unz>CovzKT(R;w>?a=|(C(xi1TN-Sf^T{&fcJ zJiAsp!+(+*fT1>K{w#x7Ue-+P0l%?OCeuu%@Whl=CY#JyKi6`U3X==u?KA?hxk|9p)o7~MO5V_(gty>C@k)f!!eJu&W&WdOpk^EJz(8gY_uI8muKA_=2Feb z+#KDaW$_}sCFEJ^QhWt`<(Y$UZE5XejiGtl+V>A4U|;a?cCEpq)`QvO^IC_un)lN! z{;cNKj|R#z?axid;_OTQbTLRVV?<)7nkLNCK*APzq~$)7X2iW6ZA7&kF`dem)1#2^JdDR35YGWL2AhF_6}Ag za9;NvXwq&mXCDrz6+H}{m31mGAc);*IZ#s=0NaZ-Rm}C{IJ7(oG3NJOOwk4h0g3|6 z$B_xjMevou-X{WTXHziCE-Ne_d(JSfMsb~O@EwU;zvo-g0tigFRjmj>A z?pLHFjHGb#Ib`zUqOCyekI<}>l^M9R2B`d)>Gq_M(oi)qIJ8Z1;&c@&YCa3C*Np!mc>rEm!E&-#YyXU z&;g~3+~)x4h} z$vJN!*DiRM2C-3{y18{BUmeq!W^}n4x>E7vGO`0Wdw&hsD^$pkfLTqD zzhE@s@btWHh_4VUAA9}D>84F$Pcvfy*XF` z1kRgF>s$CP==1OAFHV?oiPSHqS{soh>HAXOlFmnAl6M7WY%=0gWxv2|ThlvuxyQ9` zyIHxNl&R2O@jIDCgaE?e!0R0 zum8ix71ndGvz>(Z@PP|@q~JCvr?RuWOcs&mmLb+GMw#3;kFdDiRTROQ12x6HXSB7t zf^XqMNrVP&7Ddc(Zri|tBWFexj;zVIIG=GS&--H^PYDG;UMCT!IvhrjJHZ{SVqU~^ z?}`!R)Ip6eyjCTqUXarAH$Yy&rBNa!C#QIwkw)imnqI7YB;l|D!rW5TEaUkiN8eW423KfY|$Mh>bmAR5OS5-PXD|Dd-M;ptjra?<7VO&3c+_daX{8 z%=CsbUA7gV7jxwyiJTd8iEpXpz1$WTxti{_mLF|(Bd7WJ;WfifpsK^=EiPrVXRX5} zrlbDtY^AYvcsAq$Z!~l!mqXm&P2;F`zA7>*i`7)B(*oau(&-x6Z@7M=qU}NFotG2~ zIVp=r{x4Uux=B#&lJ{ZvlPgu{8(JMST zl>fK(#^bWxn93Cf5r^o((4+*yq8Sr@f0j~wQH()dLTh%KjxXC?1bl*5u^)EJ@7DD6 z9yzG&Dy|b6|8JcM+J1GzuOI3qxCpSu^zg!T(dHHLXgDzo+zr^EnbX)@7J| zaWoy!p_|x;Q6jgAGA}S{0N=1%&6^`Nu<{#`HguJ-G*-GanIV~>A|ake?&Flt+tq4! zDy{yqqE5>Zv&qn4%bv~ts2<&M7u8gpA})U4=%bM&n0=V*){6rn&| zJaY)#zIz_ky7YDMuf1-5!;odbrT75KO9rPO@sevahBQBiD@)%??C;nX&Zve?hp;nX zXll~3d?^P|p@A zM!UcW~#HZzx#Ue2V|FTJnm@RYLMMHubI zBu$T9H-yBJ%)O3IqrDlKZtffuX@M-gN76xrv)5`@Vq6GDyTJqc9d-bK_|y}%$pUN7 z3G~~a6|Z+tsDWCf&mnJT4Zl;55R3zU8GM%z{g-6a8gLOKauf>Bo4k}CUhf*+W9Vc6 zzHip)6euX_Ls&2DlI1xhwlA@MZ|m6$JLK?Z2{oB=7N;5qOJi9CM87bkwi&pCWlogR zuZgy<&C9{SAD#d2vB!s1|5PgMc5l?`n-J}xZM$S~Vc866#H8NIhmjX-OLe>qzX0r2 zq~0bt;Nq^^&hd#f1{*=`pe=-oPlVB(7YPD8YZUAastX|)=r9$)#00!^3ICr;wtvu{ z=tbxqw9G{4*Wm@c!bxG3;SRwlWzZ*3N-ClbV|)Y-s^*(hOH$_|_?l{lU@w|!A?y8abP? ze-wOhZHv{rTjoc~c1AR+kbl6bzoqE^mte>FU$Nball8yHI^Mp%zM+AEzP`b|zP>S} zz9Aqm8lf5>G)tpBAQVU(-b^f9ZY(XWOq{?XI5|kXOrZ%h1SmbDKA1Jc!h8HoZY(+= zL^G&`|D{{Xts5_ZmFfTWKB#G}hNg*8dr?*e+#oh#LK3DP2SW0vK%yTUOc|*-xCluN z3>Pg`99SEU1RsskWU7dYK`d2YTpJA8n$(JI#9x#d%ar1f8Jg1BWQyKJI%hSLOOOI^ zk|UkJsK4C0^L^u);kiqn&B9!0m5s3rfck^XLb_nCBj@5HXQO9QwE0x?w1oAWI;3@I zDmbixtzkt>jZ!++T+~v4#+$~X7gz0EPJd}->ym{np}e#jGRAn#+19#j!qtA*NPiUv z;s^^lky;i3*W&7y)5>?OX!kZ;Mi=u38#f~-FEQ_W|K|Lho8H{r!)74*&F!xOfOlkY zaC6!|HsTb_Udu1%C9P-0(cZ^T#%2Qm_8q80dO(X^C_cZ$BvXV(#c9KXF7vlwp&~>L z+&%gu>R$=uV%D}V|3L16wDjW5< zi^Pli4Pkkq@zF3Bl~jLNifcezi&hkR~Pj~UAl+29ccYg(nL z{W{7EZCsp1&*EWP|JYpepZ~?YBo@bKuEMeUE{K4z{(EzSNGpA zkSU8lMqr@ecCg8lei+Z){cyF$w4Y`{02f#oo`%4E1hioKd4G7jzLg7_w?NFdLm{Yx zv}&;8>|;Q%wb2Kb9U*-;SEn&O43iHhrLS#8RE zH2u&ah?iC51<=bugSw*xfTA>fVvB;mjmBY5B11G$Xa9L%Tk^AdcFdV6Q@bu^%#fzY zV*wN?sMj0&Eq?aNae1=5FTD~0W`|#Y$n8nUS8fD-FVX{v(RCKaIJGEDxjD%VHi+$k z-fZ9gj%;2koC^;jy-j(%)}M^Z#T&34XbN;La7_5$}wK=Jh>2+v6wU#uXbEs zx1CvIs9&{1S}APi(#Z42XGfRv)4viXtIM-7Qg;qDmkIhXl2J!0ox4jvdmcAOS_5&2 zhfE&aFO|M2XG50V#&cR)jr8H$_eJ!92TN@9PD%{|*(u4TKcY|96;eA8x6(HE-T>Wn z+`trZ9FGLV9~;`Rw}6QB0wV-S07rg?8)`g*M3>W4wLRqoa2OrBU{Xr0^$ifXAv3H} zhBGQi$0sHQHPDqaPAlO+p-Vv$vX`LZ5k3ee4Rt{38Di00Rb4vVC7ZndGV_1vV;942 zkxH)JDVx>;!uc}Z68;6}J5~I9yR=s+prG`%56H&K*H9sLg?%zgkb|HyLVVBCxMoUf z!|6M1#)O&G?)lr88^yiV@lpi!FCo9*$_e`yRHp~~TVp{6`@*>hV&(aMpuC0W_guOG zHd*7ACzF2AYg*EGQh*AT`)NJ|Oxs8?BN0qA*PzV_;G;Qgt@2?p6@F9_jOKiheB!%$ ziF1Qzy;V_{ln@Nxq=>13#!!T)g1|)}3AhDL`H3;32180ledickfX&#b-i#mjQ?Ms` z?BYbFG{M%*#_MI37&0!to)9Ag@)omh{)~l~N zPoIhd%nc@f3T}btDLs>FP*m*W6@ISIEW~`ftun@JSD=1pq`TLo6sGyt`RRIx!N=YO zMC#z#-v-`rK~Q045}%_PSXD}ClNIyZt{E82Q~h9jq^Z#NfgPkS_s-#gVk3pqvx5jw^R{hbZgPL(6A(8{0e+AcJM)48}P)I9{ z>SoFQkOGbLne}XHL58D}N7x>7P3Kg25pEY1`A?RlafM1>pRG9whf??Xf$C_F_Y33n zSn8v>(lK8YDzwP}0^tJubUU31n?gt6<1D}vyGWZETi>x;x7IJI>Hb;_1~fVyTVwt-`vz)S&E^qeN1L?6 zu)__^b$&Q}hXmPji1G$CDH|xHG$BLWkBg@1N!{r_dHwx#nC}to(HRhN#v8AI&dNzA z-KM&yy?B|1XZ6erHY3!nu#0u$N@boX!Nw02!71F2jCPI}L@2hGL>iX|ub>O=@z07R z{v*35i8TCp@p8hPe$^f57ZEFw#kk9e1W!K|+-t&S8VC$fQPV={AwWJ)$~q%Q0Jgy zaZoXTk_q#5iq}>YF5iZ$#aZ-^TWBnbF9!H66!QEsuNti>)m0nIDuu1PgWJ=UJ~{G& z3*Jyk{PQxKHR%GuZ2Q!p2;maelBEq z+j>w++Bdx5u}rKX!5}^r23KPxPPh-rv9x(|mft5I>Bn^jTqb;f(CzMS){J)h_d+MXm(Zj1nVkTG7 zA*_ur!EpiX+RQb;0rA)vcSoqns^z-G`&sAPXbRwkLV> zrcb@h>uG!dAs%MFz7{vY+3g~=UAS{{Cl#}pKE>(TfrGe1M)71H2n*t*ptQO_V=5?R z*(r}G!B^oQmzFQT*ksn@VsVi<;n`lxA{WW#A zFi-PE!O%AA6%{GW|^W>&WUo;-%r?G z1+en7>pKR_wdwL0cd=dyudgwa37UWs>pZ@mlc}dB%1axc^lYV^*pXrH4(ocJtny+7 zJdXpeo7>;|W3{7Pqu%QuNA8PhLcSkI&UR+B#!4tMZ14lyY~`a+6$j+uX#Y7zNj&%z518d%*C8U=4A_d2dce` z$-QcJTFT%B#gY2;GXu;#^@e+or%$s&N|_GgnmLbRM$HCWHT=Qek*D;P%X>Im#-N{g z(=^*(NY19ZW1E-vk8pn+Gy3>r#X;lKazIUbv2+SVF{gJFSjM`}=4y_C^N-D%{W`(^ zO~rL#JjJw`@^k|p6_#!BQNI;-DZIu+g&R|j+z`ah&BuCKVpyhKm$#b3L3Q8o=O) zdEk;xO?A#dyo3eIjja?ImnZ#SH1@+7 z*~=3HPc1U8kMir@Ht9DF&yl2y8$d(>tFxdvN+F6!?WNs|8$;`nt0yyA-?cGE>XE&mPzG5)t;3(fO9v5o*Bjo?MHAr<;x4E!4^@e zulTVzePxG_FG|Bf?2^J$eg>sy8(bk#FWb? zx0l9|Ha#*w&yJUz#jL=(YXBmA4xML(?p|m@x)Q!hm3VYuDkLJwA=&*)AS#ncR?8dI z;=XAhrV>-z2L|pwk6sNhL)Yl=QyW%lN-*g8&V}v7S&s#h7W2 zpO5$BZ?Au0y?qyJ<}EOrehUh=Tfyny1*xqXFDj!s^z7A}k?h3}1@pJqr1m;~hogUD zz#NvFcWbSs6LLO(^77UlJ#HF%9&5cib2M1D#2VOF&FvtXuF4RqKBMzAd+B7YC@F?u zi@ZKk8RJ6EI)%&#$H4QMnV?qwOR<1iQcQ{&%Q+`YE;8>VA O*tucI$;A~VVEzx*PQ(WQ diff --git a/rapport.tex b/rapport.tex index 533db36..091bdc5 100644 --- a/rapport.tex +++ b/rapport.tex @@ -4,6 +4,7 @@ \usepackage{xltxtra} \usepackage{fontspec} \usepackage[french]{babel} +\usepackage{listings} %\setromanfont[Mapping=tex-text]{Linux Libertine O} \setmainfont[Mapping=tex-text]{Cantarell} @@ -11,6 +12,27 @@ \newenvironment{citationFR}{\begin{quotation}\og}{\fg\end{quotation}} \newcommand{\guillemets}[1]{\og #1\fg{}} % [1]: nbr arg +\lstset{ + language=C, % Code langugage + basicstyle=\ttfamily, % Code font, Examples: \footnotesize, \ttfamily +% keywordstyle=\color{OliveGreen}, % Keywords font ('*' = uppercase) +% commentstyle=\color{gray}, % Comments font +% numbers=left, % Line nums position +% numberstyle=\tiny, % Line-numbers fonts +% stepnumber=1, % Step between two line-numbers +% numbersep=5pt, % How far are line-numbers from code +% backgroundcolor=\color{lightlightgray}, % Choose background color +% frame=none, % A frame around the code +% tabsize=2, % Default tab size + captionpos=b, % Caption-position = bottom +% breaklines=true, % Automatic line breaking? +% breakatwhitespace=false, % Automatic breaks only at whitespace? +% showspaces=false, % Dont make spaces visible +% showtabs=false, % Dont make tabls visible +% columns=flexible, % Column format +% morekeywords={__global__, __device__}, % CUDA specific keywords +} + \title{Rapport ERDI} \author{Cyril Colin \\ Voisin Dylan \\ \\ Master 1 Informatique\\ @@ -23,7 +45,7 @@ Université d'Aix-Marseille} \newpage \tableofcontents - +\newpage \section*{Introduction} \input{Parties/intro.tex}