From d5b1bfe199be7a299769bf7c9465121d08d9b785 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Mon, 13 May 2024 16:45:27 +0200 Subject: [PATCH 1/3] Adding straight skeleton with holes --- CHANGELOG.md | 1 + .../cgal_straight_skeleton_2_holes.png | Bin 0 -> 73090 bytes docs/api/compas_cgal.straight_skeleton_2.rst | 1 + docs/examples/straight_skeleton_2.rst | 9 +++ docs/examples/straight_skeleton_2_holes.py | 42 ++++++++++++++ src/compas_cgal/straight_skeleton_2.py | 36 ++++++++++++ src/straight_skeleton_2.cpp | 52 ++++++++++++++++++ src/straight_skeleton_2.h | 5 ++ tests/test_straight_skeleton_2.py | 20 ++++++- 9 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 docs/_images/cgal_straight_skeleton_2_holes.png create mode 100644 docs/examples/straight_skeleton_2_holes.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e15869f2..01e70c47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added * Added `compas_cgal.straight_skeleton_2.create_interior_straight_skeleton`. +* Added `compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holes`. ### Changed diff --git a/docs/_images/cgal_straight_skeleton_2_holes.png b/docs/_images/cgal_straight_skeleton_2_holes.png new file mode 100644 index 0000000000000000000000000000000000000000..b535e924e449bb5c84c5e4b127e8284277036b20 GIT binary patch literal 73090 zcmeFYg@-JMF8ARyh{jdYBnq@Z*P3J6Gd!x(@{NeHOK(B0i< zkB|7g=X>A3;9SRR(2t1U|sNa{z!?}TjhK7cxs34<(hK7EIh6WYFx&nS9 zsjH#vhTgU;Z(S_chxK2kXWj#cfNm&*VTle6WST} zcWKG=8a`SNKKS9E)zqu!fQg3loc_Aahp%Xs5$+5xAriZXp)w*tSf*$YLbw3Jy(>FKRP=@wx5>~f1>aG! zf4vsF!;oM{TrHJw(xJ!og?=W3=RJ9MsG8?(Tq`^@EK7WOIjX4f~KpoqsaKsUVbm7*VF@u?y#R$b$&0d_| zy!chglcy=H(tr1UJWTEluRfWlpoLj^hAgw$lqTD(>YewWyf%X)!a$ zQPKrV84R_P^4Uh28_Z={oH(1Qy(^rP{@T6XC)XR)Hdbd}`gnLxbKF}F zwPSB06aRXA=jwfj3}>_$L8#Q3PzlA4H=SP~A(~T$g|}TaDBJF%;VMXBe+yy!hAxM= zshd+HjP8wmu6+~s;Vz#7+75&)7tTfti9+y{-ynq(mqQ${d^g1$#n^{GL2}t*Fd_6@ zi3~Buv&qEJc(|}$Jt5k}kG@M78g_^9+Cb>;Et1bTm0{#Bm}W7bO1)HvCS1j)CA$4I z>8?XIaly@Z&mP^|`&Raidy&nPVi~@E_v{_l@PuVz|}_6(RDNXAAG4 zLX^E>xKn$s*9XOGhyx!TcTf2^V|HPD*-8P&d{*YtrNI z@Ab{b%N-rXv_p(S**|ETADE_Bkd?QL-dz>FiJu?C`>_EDb;GXr9MdplcBU-F_P#Rm zgc9+5ddo+(`Pu|JP0Rw)V@vk10T@ zrkKs53sm@SH4=S{5Su18r*IRj$n?n+Qn*Q9_@Y~ZI@eZ1#E!o(a!8?3YMH*}fx0@E zmg~cm99k{iJoP+Rg{ioEZ6D+-S$@QI(=olwo86mjndP1JpA{sDvM}M@s!l^OPi~|R|HD1axx(x3)-}ZQMWkd4jU3mG-#hg84+SWaEGS`Pc}QWTu_ zTJ(wV6G@Bl=ne`&>*kSf!<)lM2T}(UovM~oBQlpnH2JEW=cybj z`3FV%8s9fg%8fIAdW(4beSVH@MlYgDpm#ZA@B8o8VG%E(K(|M3NkW1m1Wn{kx0{9<$IQNw z6GdxuFz6H)#jYrgkd)GlXNk&?tn(sDke3atQ_kgElfs+J?YtJEeI)&OHC5TQ}QkHIO$54vei zL5FQe@KpNAJ;A5@Pg6r9KInhED3TvZholSm)MT1fvu7^@8e*V)=#R zo^dg6t}o1mcb4|Ws(hmsj9!)TOM0At!BD~#!i~9Y5kC`mz!W?m>ai@8!@QdCGl7UB zs_E%T#zIdK5^qQRaPBm}kh*ZLP#Q|`p7FhFnvTBJPuyF|y6gdo)G4j>XMu7)9TU+m zscxyNdZER$#TIlAA3R$;z1Q+Iifli;0ff>Dbxhv72vsl<+Rh~4m^(55tk08chjHtvn6!}!Sh zA<<6GW@o7v{z`4>iGDY0tA@FOhTe8Vf`Q*0Q&ZNvpyOHzuRxttk01MZ^>}aa>ID6q z#&k+GUYSUgGka<(W3;@fpI)2CNaxfM(Ow_D_mgg%t_Y{l{+E5T*T><$?{?o?_$ByN zYeZ^R>?d7joSG`e{rzX~$Eg@ZCC=DRkJfubGTFV}dL=fwHf=u=|3TH%v_saxx#wTK zpRjsVsZ*^}%jrIObTZ3o4Lur%PtylodW?FF*hh>?>%5vC)g5%N3wwQB>G+Y}D#$ruKH2z_ za`=~r==}b;sG_%}x372Dy48fgm*mFz=#z(mqpj0nUkO-gmc-tjj87jhrdF+5wz*u? zbUuisx$27f>f+^2=fe9BObJYhYI|A31V0Ee$@gj2g9HwKfMBvyK_(mg?o{t&;B>CP zt@)x+fLM~}P-%Pl*UErkn#+ExSHLgs8{Ef>M#D`N2kkU`lB*}54@Zxf*9QkHWV5!i ziduC8>@IGc)@&FI*SVO-g!1;|&@P5(YC?Qk$k3FaKSi^}VRq}5YT{9^5NMz2~yihW7RRN^^JTtR%p%+E%)X)~c##EZ{vB8YIjP4F=vpz|Rfv z1E6l)Gc-)_FERL$$%bBjihh=je)%3Mg!LrHi>0hmVshY6zN`j|h0{WaVi_>*M6;>>=VKPWSs8BH%sh*PL{; zzrW(?AWo;Ns!l8I;%-GNz`@1AMJItnOG_)}ZfPx|AtU!^IQXA9ovo**s|Y8jx3@Qk zH!p{ayA3C|u&^*E7Y`>74?Fkz^$nIt z_n59F9LjQi6+<0z4LAF-IcK;o;aT(O1IN+!$2he`qoqN*r7iHF5Io#BbS$*c$02l7 zGKhc$#T2VJ)kpD;Ji@#?&25u$U%FFy7f#hid;BM^N8EtRz+|NU>qYAdW5IBiOM8J8 z9`au=spyb|pg_X^H7pyJyNl^*#?MYf2>HLS7XxK||2pJj`sh) zG>-Qu{(CAycnI-}0h(`5zgPc{T}UalNudAtRCI*uP>o~s#`3hJ|9YelEQO^JoBx)B z6bz~)r4%ehraegfUk^kGVLm&)`o9Dug{`neu=v4V|9|X)HqRvMe@sP$bq7obG1664 z{;$)J0#aS!{V&;o$sr81d6L<#wzd7j&t?eTYlM?^vg zV;)Gf>qq?=^mpe-@x2@;Tk=bld-7lPo;lN$r2t zCeuqh)yeb0-vNfO*$JA`yWvpgpSJ5{p)|6p~sJqZ(m#dkyHU1Tr2W4@*1lK z%l`Lw52e|2%9$>z?Z3YpYWSMSI`hk=t^H)9jfT>wTA2(P$x2KbWGsXXL1*Fe8)vzk zlu!mZpeOb3(&B$RAgKwgV!bNHyn$C=m9p-?boo(fRowi_;CF2+Qn@%%7}lxRz3Eex09;Uo&Sj9HSLQiI+MZr!KTE0tHZHG*)|C4kjqiP7dS`*2j6*6xaUxmwPf&N#}&@wQqkvZ4kYb ztVAMsuo{U>x{W&r&dTCdV<-311Ti~eG1COtDUJ&st+!$)S%oAZJwxN91Kh2#p8v)wQ(AnjK1KDh#Qk+tB{0*)Z(E;*2pNd|!Lk zu5i+^s)sGB;Tah{mnoX-gfGImDG~Qm#eUUT_J4STI1tp-7~dSAM66B=4W{&7(^B$( z=W+9KPP1s4)=x@)`_NjaUyO$FbSBvttlD+4lK902n7bQU{aCrXHld2o|0oM>HOfgm zTH<#jB7_GJewKOZ&9>+H@e!%dK@sUuK(UO}af-+_a*3OV`@f=@Wb#a`PIx-VPlcaIpz749XlDMN87f`e%dhd&MYf)iKMl3F<*D>*aw#eObFj3 z1eoDf&9I6r?GS93!h6Xx(trENGxGG&FQ+gn?=kN8`X()Yd+HwFXLl5k-=yIq#^|-9 zbVc{64$h06HU6FG8)~AoykQwxS|1qCgIOx&vuAje$b<}!reWom1QQD%l6f1qzxw#L zJ|XD!J9OXZyOHYr2gShEiNN4@bHkP&m5@7qlAZLiVviN$8E@TqZr&$;Ak!9fRz4YY zq8D~s@1=LbzNLfMWSL2u#QWv-J3AV)B?j7f1#Hl=X6Wf5{pNtORgIE=iGGbeu%;_X z97d5MUdy>o`M7_rVCps@H;xovhUQ4IEbUF0Tr@cxj*j^@V>Q!zB0`z7g>SAV;8m{s zDh@^EHm?ueyeGyWFuVUeRrfuw3$ z^Per}qRi4~=}k9H zWft!@KLA!wsd;>HyuzvQ(z{^sAq+<$B;Ad%_=@#Mc9S=ifk$+OL6>&n13XC6Vr(h!lA@m=?+5E;ms_kH%q?m zUvupls`>MzhbYgJ#hLw#6KX{yG!xCMWE5lQ&(38AeM1vK*z{;V)h5Y4hXgzV23>id z1R_7{dhX8g-U@4J8?EK{!pm9G!7RaLS#n?&VshXc?u#tt4meE&(<~0Ohmz2QDRVUB z?s{bsL5My}!q3mlmTjPGzZTkD26GHgaUVa-y!1gEz;zs)5!(aDApl9*ZakV#?=Ls| z821eC20wHnfW$&YSR57JFk#ezq~UV#pfj9(u7*Rht0f}W{{(Xr5_LLB6V9wFoX}LF z0)sjZJcS^{Z_w6sMRHe>tNY`#=u2 zyVQ9HW@WRpVL0TS8`O1UC*ypcY?mGyNeIH#t=BpLzr!zh=iUPgObB{Zy)Wo+h0Q3f z^?509-LrB?+D*y9+4v*PotUGgWmz?OBWUYjA+ZcUhDzD_w?j#0K!FCxICJK}2_+ zAZEYB_rH6{I`r;gQMC5_Kt(4M?*UjYzMCh?W&u0Qt>v)mjHcLB01dCG5tns zx;{2Af)mi;w&gNb?*`AxUH=Eifv=q2lS&F|D^BQOhUyXPR@)L?=QNH60m3?nY38JG zR~dZ8ovD1I6=9P#7Zi-KuJxl82QgT3xsiX9wFJtpESv{9a)@#>#8Q5K<2w`{og*?W zxZ1VD@2G3s_1G}kKlpC>JIy~RVv`@B+*V@=JY(1Z3AtoYzz@BX!EwKzc3Z4D^7#(0 zcfj~Uta2Emw1wZElGpcmj~M?pCW1lfKZYm;3%D!Aeb%bWh^GOoq~H9)l$9+VhF<_2 z?IS^vlB@t?Qxz_wGrO~7aJUJo$R`9L-V>0H=d4Xe@UpKhZHSQXEte+rB82Ts!jKP7 z5B8P*MZ80>dw%4`?@A zaG9&LRsW+m>U;nmL_ISmxDG!hK3vMrQm?XB<+J@p+eRhYV)Te&b8iIEv>{>xP~Ft+ zZ-peA6aG>)_S(HB>u1^=QCBVvL6+Y1F%bip^DeDA*GQ1y&EZ=%S9gBaNX>m+XBD{) zcO@hjBNv({M`k}M&U66@fkoa)5}V%RlG>kNf4bS5{@D#JbOPlcD0}@Pu}BjTz#_Sv ze)6p<3ZCAJnm)l*)jj*AgbcnQOA)86-_pJR zCRVX6nl0iTV<7C(+%KF1JdOlh*aJ=f$i(M8nMYz&8)uT@lgr#k4aDXHSQRxL^eF?f zaGpr5?K0*5o%1b_=AL;ABR!-?TA|Mk#F_x1xO2pC(9`R zdVt5$ASXZ;=UEeLKwlXgQT6iMe=^F9mH7F4_tbE+k0F_lBAGUJ`d3K@H*(qs)c*|4 zMgV_CMqb`X2ERwF+w8-Aox{-9lQ<`VR60fk$9DV%xkNL$+6b>~b~&sg21DWyt^R2K zgG4@B%V5jJ!DKL}RNwO7oD|^#Qp}CIYlA+r2-y(r^B5}8#$M8?&Gja@kv9guIH~Pq zD;D}Udf99=n07Im-ySrHlT&J8!gJ}<-rzDPu#8}gMdjFCYYK(i>GTIyJsl^M4*))Cy_ zt3KX?pRA)F@2h$}T#!MSzQQ;dJ`fL+U<00SYyqJXsThB?0H zA2%gD+#4~ec(kSufX>%aZ1GdB?(7h0e29K+wS(i0=U55y$fB|kd1^@OX=QU#YyExY z3o?^{si+G37k^dyDLrjoo2%pZDlF3I5HIbZ0~Lx%m$>5|e#I;DvDDAY+Rkr)H0ymU zqugOY#!gtV)ay{W*>5Ta>vM}FEpDM*XqXh= zjrLG%lE|zYNviGZ>>)*^_u?s?5&R>DPq-~QkdhZi1RSl0=9=SW{1g5gEuP-X%~+(d z2sma(*G?+lyKIF_5wCIp;!e*FChw-k&EL9=Y%kEkX$VUVveT)nKxaB*>vX0BO*@`b zhJ{xwTFfcQWchPIzMmfLxQ)4WngON9Uf7d^MJgc&l+7ek5D-jKFY>28^*o1UkKY|% zT3Img&l_cX1Gchg+D-fEdkts%zbuMKxrYO<-Uwa%@D#hK_QQ~5+sS$pN$=8gEYjzQ zoj&xPc}TLMM)fVy?e`kTxQaS~f20s1i3RJ7?WbwxS0XAPgj4WZr+k{`{|2Bv&YosL z`be2ctoMYkjpjl0#>N0fKZ7#i5Bs9HosHHL=PwobGTFAUpd*a>Z6)MFR+K>KJxN`+ zv!{&3=YLcP5d{3=nhE`Lb(j(s>Bp}Z;8;4`vA6{4Rnr9)2lEM*LGH-Ic<{c`s!M62 z!|+5^C0OM(PwHuo=sMPFiy%OWTO)Bv0Cv(5A#JvPxkT-{x=?pj1`fVe-I+H7{tb1K zs8=E|w|_jcdKwB3M+a?}^rt_cUWId=w>pfJ3T=O;cUvi`n?66;=)@p140)@XK3&mC ztt|YwMDiG`zcr9(?z@f&My~`VQI#GcchdQ&{~%4!A>=K6w!4+-#hDq;DJ1$VOPJRx zON1GUam%%vn~TO0ai{(6^@amXUoU>aO9PAs!8g@SgO%ux2&Am!w38-SOyX!ZUSnr| zUK%7?>UGXWyUX8k$wdW9t9hSICM-XBaJ;oz6)r=!wL|G2{%xS`!Ftn%#MRSPUc`~_ znV0Ej!jM=cbp|)5fijJ?OZd(@X`#C%*Qj#-OxUee3I)jG`de?t>|RWpnLkZSeYp3@N_4`wTl<{9lSlvXEO zTL!C#901M2?TSPk`VPx3#L`ERx%|YcUwC!sc6OZp0a{N4aMU6L{EcMZM^TT~oq5-j($I~IU6PuCwRFA*T8 z?Unur=LH0=Fr;v0Z3vJI+2OE)J2al(?%J9>!w}E<_-jOWQZi@dOfI7Jl*e`4%WWhu zXH{OmI^5_8q+ibkTOTwIeqQ}i^&T$@@OUV6W=Dedwn2Q)?)+;SpWUDwT5KvW0vi*_ z8ccfqMVd)UU#$~v^EM6=haVd~h6zBp5`#JcWHiI13}C6(hL2Q#s=*3&Q5o(l z{3Dr}50cj1zTo;83EgG z4JaxR&(Y@D>d*a7~sYJX|TNM$qS!2mt04-zWRN`TauOebL9s#JcL>Av8t)f>oL1%u30bA|l+~%PV zX9i6FBKhW9w90LQ8GEEepCiypPR0FpKQDor`KN)v0{v^`;x`C*W{#%9&^t;lUStLL z${)0EJi!Ta*F{8AqzgbZ%F&XrJ-4x3=|iYt#3$HXZd6@6Pj#mj=(t~6tCCD?=Kq-8 zeg_RdqrnG$^`A9ANP|f2Gpx_MM*%<3WK0+ams|D>2J$wpr7N z7H}@~ff#-j6G>q7_UJ1y{0k+dn2&br6~dzrf=dSd80LTBsGOycmql^Mtks!JNYWlAwGYCFk&OF#>ee?#HyRe5`!ezej~G8{?w_a{TKA4s6Cr)BaIqm; zh_cH=RGV?UK7EUK9!Gm-r=WxtO(l9g>Uo$_mPDXZ@6x~g{!J7k-6`UbBtg&h{?jcQ zR|KT};i2k$(C(_9{uGn4{)ydG>jHJwOLnBIK@IfKf|xo9t1Gu37n$j8`jrZ;?Si@w z4_KbMt`v4@^G&WX^Pkntp4W2k+b&&zNb`h`p-1*IU#67?GUJ8iS<@jIAdH)$fYNCR zuw1gqb6@k;$GeG@vK^>#Ohs#FY`3&PAgFlfDz0lYS~OXho@Mr94sQ6)*Zs+y z80f12;sPDcU!v%f6A?=Ur!xF^|HK|bxCX$m$@kun(5V|jB`FVP-!WPQ#WSi#iW0J% z^+}}rUA-zSbYO^lj|t!DQyZ7FQ6@1R0||F~a7GbWPXKzplXd78h95x*5nV-A4?BoJ z1;@}{7#yrG>4zQ%oE`6Nfp|uH<2l_M)jaj!>wLbySB7t*a>iEvk!W@%Dc0cp`F!*HcXwj6|{J3sz{NYdqb!LeFt?K0iI z8KEW-v5-3IsV%PvyXg@80-%cke7Oas&H;E+dH??mk;0W0bDCjuh>rabW97| zNRW+XH*})>mML-Q)HmtOD!(2~2ooFfG46B=yU~q4RDcMhetZ;yAT{P}AyV(ojXg>M z2`HE4V@k%iS6Xr%!Qphx=M?=>a6&EU*9n@T#P7`kib!#bA4aVK4cyt3xPIJEzs@|v z;|fAp#ZD*cOmh!$wiyDBqel{AU1$?0#l#m<*0k{o1j(70qu^2}arcToSG#rrOwNSG`BVg1#6+chb>SzGrUH1vsxGhJy?aO9nMX^3c$_=D$ z1J8`XPa)*%k0~p*@Mf87I8?4?YZmIl4o;hOPAY>p&&+Z#WZcixU3f&kR3oreQi(-lyM81 z^L5Xa>wN`%J&$FhD(B06w#+m9*BdG>2mpeS26>U|x4W2-J~8yuBO9?K$rWR-C(
G9KC0Le>G;42EwqtGnr=h2|~{`R6F(Ll;kj%@TZLqU=y^|{WgiF^qWPNIH zd2S+XeU}qH*EQ1sNwJMp+&`>3ns@6ul{j%!x~|LMC6a2Qy41;G)QAM0O2w2gQ-W$< z5}UelHg0;MMS(o^Vj{qL*m8NOP-vyN>QvC@x$a*F%>;aa$A`D+GPIH~ko<>(h=V3L z<|-W|(p^KwC|jgmGVS(r#Du2rRMOM7l)gXkEFSEgHczx z72|Bj8$mb^PZ?RVMmGiOuV(+cE|vJOy|~k(PdtpZteI!fVCeqk(uf5VU9f{Ow0WkA zh|~?D%XJ9en79_kOm-2;dsUyHC%y9{biENbMTp2$7eOEUDIPuO&}^*A(gGjO{Z`9# zx9vjK^ZjFDoPGe-8um4(^2PRsG#N%bUx-6GcDq_6{hb@7|15T@0(w=lbkr;k#32p| z=Z01LOl62+gHDUa=L`?%pmx}+6`0XkLCxJW2a^Dz&?K8stKlDxS|CcB=->}ix zRqn|b9J(a9v>tT`4>{n&>{CM16IpdSK&9Hf-k|O>DZ@H^379y^(zK47SWuc&m4lNM zp#>JZ>2&e*+sb7v$1JX^6-U0a2sk2~=x9l~B@_iE$tfdf&EH|jblY&7e=tV+K)TZs z5mI||B(Af&aulb(&*z^2j;KQs(2th*T-!*nG7=~CUYzZt50_%J9)Csg6L*pk#{O%G z-x$r=&WN;exfo8~0AKCyBpK9t`x?sLaHa+?OFu|aaP)z7mN#4pvA9yTKj{kS#T75c zagGEX$dLZpc>8+hDi)x&ag&Yx>AsmSnVHy0x*2GAQ!y zpVt(sK67)WSWjQh^z?9R5wKZX^6k0yWo^`D6|egGGu*BqdO{OfcYYKd;|Re4J|pQy znkX6jVgQCKM?O|=Z~42j(Qw2nilq=Wwg+|8-%|%M(dJEVuoi5c#31}gr2F)LfDVA* ztxjVs);3;Ny%Q>8zn;g4i?qI33&vEFI_L3kWA%p{wZEL}qxCLS_s@ITE|?0rfP2;< ze=Ty^>jD~!MYu4OL)$J=pz<<2Mz@hd8@`@B*sZXyMTWD-)aXg>ToJlZdj^g zodUYAL!sf?qOpM|bFM=huW-X5sFtS@K&eEb{;QCyG_PVO?u~~{A4|8K{;9!9ea6zl z{t>`$M0AG*#bf14LZ+?kxO;{fqac23h0104_v+_07WJAk1et`Wi8`OlV znx3B?jjoq}G_^mu<+oOY?QsT3XxH6-`6p#@mDrzK+8iYsFFQi+(gDp>C@O5wRsExx z@l+PObgw4GHQV=_>=x^xFz1#%Z8qIq6Q1@AN80CQSgN(Mx*QBw(=%i1$)8CNN=rqf?nH;rtnxKnw2AYW&?b4gviEP&2@3@r5JXQw^`kLV zTkmM37y`rXTK~N#o4O1DN@SxQ+S+JPSJkh+uffa_~^Lb$D~ug4mTSsH!t{nFiC$; zSu)Q970%7Wx-;FJG_)^9G0rq2LoAj!z3wvoO=_XCAjiy3(u}WojsRT7V|*%+Y*caT zY6+IoMLwYQ-4C5qrjr??E&!3{gh})KgELf343ctqCTtS;bUi<_)~*=v;$Xo5Ym8}5!H;c#U9MsR^0ig+2~e`CcMB0cX~3lSu+fOs zDv4YSfrPKuQqs+Tf2mhx{hlQj%f{5NCJd3N0|gl+O&~13mGkYGS{fg=Nu?#t%<=Q| zi~8K{!2PQey)V_5lKtB<9daK0IW8#)Aih2()jb9%2h?Msx4qG8#XRrWFh9y$7se{d zBx=)}@kw~_XYh1H#6owIN$^?CkZ>j;oE$>Z85_6{ac*FMdt+adM`2%8^}EQZCu^KpGC20RR7IDlBT0br@*&e1<|V zPIqFr?ww;{QhC0>$l;dOtzo&o6HOnx8z2@&6Xes-R}2c+jh;&y&Z7KSM1blIVdL$;&>Dy+SXz)1YH4aj)aV2^Y)rR{F{||%vw{Np#n)pRxFv&%!QPUfj$=3Ayxk8QS z$14_ArxSiFC8RoDES@mqV5-Fls>2hPY^Pt{Z`JaGEv{U2JFBx2oBn8h+MP)IFD=9d zwhcGZS1nEfA)IL-81(8{l!^MRYEGZlqrMOSX8eR&bQl$ZRI zdnl0=zE+E_U3}-*M*>*%pC}i@Ahc>XR-4Z6ki=Db%{qg#dGj7ykq|2lsw-ovaRQbi zb#We|$Pp&G(d`u1Nrjmaz=QY{92bq%{Ysp2ETJjxJJG+*j_}*rt7mXSZPj-vFv~eL zwF{I#jHMR;)*5(H{oH=IIHIagg0k&&TUq63(!Qv~+={?~mDOM08eR|Tg3+Q1#kikCsiSNZ~u5Oq$X7F@cyyqvm3QoJ_@Elt5O7XwOG0zob@riypzh@!pcBBsOFzmP@+u=plK2YTzDhK&`EL! zE5L;y$UPlC-TqY7UXx`;klMJPKcmw=z?{Y1sP!)TY4hj@x?9EefB+Dkx4KiU zf`3zp(5UHA`{$SRTcGjCbiC2acgY}=GzE=!)un-9^ApKaUqbdXYiWfzVSvkQdX?BO z%O|lY*}Hw`vt9v>1LH1?Nj^3mq`&A?kRwfX*K!IA9D*Aas~tx0f!Jk1NyP07Lo#x$ zZu0(!)`Al);(~^)Q0Mcu>pU+})RIZ{=Vufr=2t!~{!g zt4oUiK2dohB3CiKyo;kL+i!1q|7t(je%tvmYm#G`@6PpCNq5TB+LOZF^xLs<-Pl5IXTYYqP8n69-3?tB-{`&K^BJyfgsA-pf1f1KIiAIH>pyF zOmMtgeUYXXS>?H9k}HPA{CP3qPv8dBMMBU;*=uWc8E7#@pU^fqy4LU<1;5>aJg&QI zT!m}#9Ha|Q6$wE$wIHQta&9|&G*s{aoy^$h7J1|?W-ds_&_)F&aE=&3>J;OHKg-z8 ztdjHw zv@W8ODe}D`cO-zwH1+c{JToO0w6l|iqLH!V*8>+*VGZMyADTc9rE5RG)jzD?-K2{6n6{#gv=Z&AH;Y?D&MR7=kWU@FeI znxaI9%d9EINqJ@dfgro9qALaFJN38iaT8UlXw~Py8)k%Rvz#g?p_v3>doGz{uox7d ze&Isluqcj3tT1Z7JJf!Qx5Q3Xt909f0^NCA`VvsJA#_aWRd#O2k{81z@P|ccB#-Ht zv(QM4Ik?*-1sq4!gDh$;Qy`-M_flu>YkkY~mGR8CywCPVa@=M*P;hO+cOkQQUB^Ni zndT63FcFm;UX2%Scv_`T1T5jH^7Bi(6-3#sbs?X6I#zdvFmDohDd;2;z{7njN2L-d z;?QAPlqX4{-Wfx+g+M1D|G3Fw_~?ffD2H&yr7s4uKwJDjp30-i#oqU-Ib4{X&ia1i zbGsy~q5Wk>)Ori#fP%_-@Sidv+CeOl+F!DQq47)~4~q@B*^(~IuLc4iQ$nuB_(W)b z)WU7=yAEY^yc=N7P$lNnvFp78YroK$GSJYwCyoXO%C4SMlo538vm4fP&FtIXx#YKy z1ki`4+$zsCV5_%K{m^E>Tv43KDg~)LFtg@jc|c^k^$IV5+HY_Nu;Ex>f)oo85(S_w z-uU<+kZBCdZtzM66?D{!tSNu+-L-OODwQu+vK2|1I_=*t+Aigj#b1*BALNkjWF~x% z9ut(0Y0=p`Z9}PoPq%D;)jFASfg}=z+MDT2t=J@)IKk3EF#TG`2-ebiXw!Nlt8?>~ zT=Vu8BuvgGN`pu$%4*Dqn00 z7Bm@!w`xX=qaLmOoJulq#_o2^+r_kI<|it{(k0$gtlYQ#d>v4qLXv$bWYW> ztY!ZL=-Y*(@c-=sns96q#sqI=uChsgP6W*i1aANRlvkeRj3#I?YwNmOuIGl0Zp`1O zyoZF5yi>ppW@%V{R|Jy30p+5m=Z3*5a$?Et26e?tTxGDBvw?2Ko2X4#PYB#l&b9N{M8cK~tAh_%^d=(`PIkNH5Z;v9d~c_ZpbAWDlxo@;_m*6MNkVK^RYx?ATc(QhVIgSO zM6KQG?l1lf9`_o)>HzKsn9iR_>9usd{#B^Sv>7&M%mLt|ZbTc%zY;u>^OCcCuhcJ4 zr=;;G;d6zV^$$o|D&Pw~+qkZOtQV(sdAFp2I6SSq(ekO--~q_Py(2W%?`*~l^y(yO zzwNYQ$$O=kT=f!jy@`O}^js9NA<^-XJ8t?M9bbrczCTs9O`tY$z-8v0t;#Ub;Rjs_ zy`uOw(_-TDH)$f*vNbFsU-D<2A91betyf1YxaTHyoCn^@sIrM(EMzV4 z1p05-{Uj|gKOb|GpLA4E93XKWI~lC|_D@m-=OWCWHcoN~&{H}E309&8vv~qhIpO6WOppxHO3QRz>sc!j(M7tc3G~uA+Fl7Yd-uDkoM#WGfeM zgUxGg<9ksuo@XS_Gte8G9ei<~BJA<@NOb$=BFA{=DfbkOP*MBrZLSKOE%Klu%(NL~ z2HQC(0Kx7YobzlgzCp##!6NoI*E+mwh7-T&p%F=K-P z@GK@Lb@DhbIODUuALE*c;gufFJ`)wYIurs3QQMLq0sZwK5_OCzx(@wX^yts~7yEO< zGM`L32_lBx@Hde>is7Wmc_Y{@x`AesnHW0({e{WS<{4{P>!{cLl&75J`zKV|j*y2H zgxC~Si>_%huf{y?9RW}%S!0n(c0xX!hjKY57Mg5GT(v$^kfXG2#t{PUa`0-mx-?+B z%zD=c?*GW2^&`XwS1Zk~@rOMo&Q8qQ`Z@gNjVz+tj_XO4wXNBsHMKe{&<-VdxC8on zrr$(yMCzRp020u%r$t=S|B;w9panX*wtY`LU9#lzCLKR0d}WgA>iO^#H*YsNR*4<8 zM_LQ0))-ZhKTB6*POhla*oK|3H|ds^QUJIVF<{*16LQ!2v#T!SvO_=Jbx>Ga25nmA zim9or$U7r)Ax)};F~DE{+2BB5rQ#TJ1-NbK#ARk6v z^s3~;dUZZiVotqi(xZbDKoGobp^lId%e2X+espohm0CYDd`3E#YvMb1ZHCVwcEs`Z zsPYmgsoowX7L(pFQ}p zt))_{KjVkioi?{*5w*vqJzhV2n>qTG2ma=JOdn80u#h~Uzz1v*Un6LyD}JqaWY{_2 zGKb{5gYtd_v~WP4&abkV0Od(B2iGg|p?%M1wUT^llc$Z}KkeGz7xtJ2m`wAHwoU8))^mref9o=oR*$Q=-Mu{H$vK0(v?fRE0iXY9yLrO1$J-+2HveV@qXUZVT@TD#~y_l@!ovJZ#&N`%-P! zBeC^~L=_TUSi$yzfy@vSHp1}4$>3#1M-|8zLL@<^e2W95`{m1b z@0Ro$HKKJ=F?QY5-kpWoE$&j4XC z6}#^?peR-6%$1tgl`#uipq@(O3&VCNu$};v{*lEYMwqBv08V2gJrbm;|B3N|SnzsL z{}0{lBVN!mW9Zg?t->or-bNu9@rGTRf0Kaz$Xom0j6C8*A{`0yk$8yE)B^ z1^cPIWp>kD%)bQCQFh%4GBrGpx7wcll1CckoemK5XIdu`<=#aJnox_xHC$AFK!?PG zSc`)Q#{1x>FG0!tmn6>ve`l%2$)-df=JkoPTrHWtnnYE zH_dFXu=2oE4`l;DFJH$7<1cPyVMX9Z9;=2#Hd(m!X_>7zzJjt$pIY5(;I3%{M6rzOcBG~?EGa+IjcEMgZThbKZ z$=9=5Jn&sFP7kgTcPIvL(^G?MfrVQ7;umhDW$tRl`iQFx&U?na~=2HwN(f4yJ$%*;H`K6|gd)_n?QN`K#?fsY#1r*=xw z5zO}gEP!Gz!w15jg~MJ552s=eU(>$Kp=J8tjH`08vm6*mxG1sU{*)KK*~v-SQU+pQ zNPDjg%LNdb0^Z-Pt>DIMq;_-Q4u5Nf-co(yH8GZWLd^=VQM-~B3I=|n9#O?NshL}} zNcgxbTkh5IUkc#h{DJ-Vp_^P2Kk(^&-1cNTz=smP%B?{2x^q~lAKBAO| zzU&X@Rz!V|v9d42?rSHT1IJhEQD0~GrY{dL3G-gZS51Ay9-E%GZNSX%I+16U^m*o2 zSgxelLi6P5vtYWn&PzhT+|evVEg#32ZIwSe*IMgAqgCiA1|3X1g42G`&9>xk9 z@y!O|0gw8>3sOpXu|nD|9{#U+P4tI7n+5-M#DudpOuqdqj%%z-hDnS^-`R0mkx0we zC(29m)OFe072g#(rx4WR;vCCpSx}E%fB$&#zI`IGb%c8w8X2YFW5=8vilx|C$&vJ{4%+>n2}N&uhbK!62$UvVf%v&rSdfmyTYowIQ-|YA zWC)%{Uy@9lPvk0&t;va!#v$J)R?FzFumPpB?dGAV9?csdp;(JOe`kj8hmM!IcF}cDJ{~DWmlqN`7mNUF`e# zrL6HpfwAN+fG$t0AS&Dzof%PI(TZ46u*63j{oQTE<`{jFm=Bb7sZqN`pBIzmyIG;_ z!q{$%Ov1T&$Z$GY%>jwEPp5979Tyel?u)q%&#(9C?}flm-woox7?n=Am1jKi@ATT= zhEQ#Vbw%(k>5j3+!V%@>SgwUMT)Vq_2nG6}x+Um%-vNeW_i7c#JHBsE)c8`ZpA zRGT3~ZURG}y+XUdb}H|k2pbTmdwKkvhC_npmDAAILsK-i6%*LIVwp6Qq{TGGI0C5u z7ws)zFm^!_%Q5U(3yZL>QO;KPUMlU@*)^Tk9a@bN!{(ZzMt4G#!$te^n%8o7u)>M8f-w-pOd8R?vC z>8L+Rc2xlFMbfJwh4PuI46ZF)J5f(8t6k)cyClIwAO^wH3c)vTr+PU~<+jm{(l@<NMVOR*;=)PnNpNF-)A8iq`#FXGVdI|It$tQuXIgj*2)Jx1TDVBZjp zYK~w!v?tY?=}JN9Zte=;H3Uy=y3@Up0Nv_>LW5Hj1MI)h)rpEP+UcXM-wWj4(Y!AY zmnlF|R^U%K`nK$Pdl48i@O9QjwKn!|$}h`(*VCA>M;pLfyv(?VV4BEZFuy|N=iQ%E z$kbEJ?+ZJvAGs=52!l0vc`6r2%bnvI9ZZqtqGlp?9y#i|h8K%_#4G4Mh|q(rz=-hK z)-pR#qFn#IIuXWQA(*FAjGr;EUNW7&=e3#JaG;yeqK6#t=vnWY9D{vv{^xtJe#`>G zDN|YCy?Oir{Go1tbbFWnsHELf&y&}*8-Vg zrS zdhTBOt@Zt*O=5J&_17BLR{m5_y}DBs5SV4@uvd?4Nrh?NTnoT9G7wHBk1!mn6@=z1 z$%W#MG!=wKcuXwn|Ee#Xw#4rNgal=DYlhE#2-sn>eQ^Zsl(8-~iM1LdJH34tQ^)HCFNcCP z^R&Ag77)PZOipu=6q?rM9S9$&uh~9Q8oXhX3 zK6y=XeAo9*XbM^oi){v1UZYOr_91-5SXX7Y#52y-AqQk5(5pv!o9tQRvH(fVp*cyC z{z=~2L2a{@wR@Riouj^v8}s&Vf7>zfVcg?TAg+e?s~;=wyyC@$vx11?a>cV!G_+7S zf6uV>PwnHsXYYe!p1x%PlmGr|{U326TTY*jaEqrX z{06b(8)A3hp9!i^Bd&O4jWHx(EcD|Uajv=OI!2-J^2GyQL*U`?>~niG!GaVM4t&sy z!hx4xp%nk}arHwN>RBD{THlahp=A{;`S@IgH5_=g|-)AI!%kLvd__~3%7X?ni zSsqRUnV1nb=w<4UGoGvrA+16t{uD`W2pQkwpgJ401`N2hj+_X>v_MvgBN4NP1qG~Df` zSkKSrs!qlJSq!Z8iyAQ~i3f~)3CIhG@Ta)`$JZL?87!c3!uFUE`P@BVb#?Xka;KMCeP z%egG}8?ss;P5@Mm-wLj7Wxm(uV#zO|p6(%$lApqHZd-e^F4GhJLQa!2luG>G>k*s> z#^uU~>et4EHy4`;d5t<4$KHWNw@K@A6(Jx+sm$v9f*a}1|7O-IBP-W1IO4QmtaZkC zAVB*bgp&1nnK6SPJ8KV}c&dbDjt_Nl1YXD(t4oK^=0g7YoNH|>-JPeou7&UyUK#9^ z!}xWL*E&P`3KW`*ELr*Q76saL9TpVspTZcq;?#$oG}rWc(yr-KFI5bhxoQ6QBNS7K zTP&#cj(0T{)DNS*l~=8<7TP9$&Fq~vy*E*Axu=H};KQesElTQ6+d32$;TRJ#-_q~a z#sy&kOMR~N=x-sTw?Hcoo*m#!A##rea})a6kvcR->Icw{-FMyvqv{&v+YOWYvcIJl zNU`A_qP0{LZn61U@lhBEL#|3pIg>_f)NdKVPqVg@<7Z%tD0)p>y3s&RB2+W3g1~po ziq)Vi$r7iS%_^^(^OQPYIM+azr8$VHYD0S^ueJeg7q~MscOX|nVkCi!i}4Dz1`gmk za@ag{mW_7p>Evm9ryCGwpE&((^Xfg6Xe-R5eUOA$<&0eDb^~VSjz}#}cb&)+ID3A| z7QPAQi__D^lEYir*x@bR1jLa}d>Z=Ghe>yDPIc+`nE@Go^xq(A%1gCb3ZXBbSyOz( z^J6nUzEI!YMkTX;sCCHevBq5`dT>s3zTylaP%x_57-XjxUIm%Is0jK`xRrKkKP?XSnh2Jf_{Z0!K(iy#yhY}LL z7Q&xWAoSV~>X}+c_qQbmIQ17}d9Drrsw-_j6TeMuRp~}Lwu1>k^ZEuGfTI^ZOww2T zn}oi}b5VZsdDXl+MS|_Zl=r($l7DfGb`R{bQa`hDcPLkV2lMNbAo5VupSZMrA@o6h zFYaj>JwQSma1_?p(lTp>LIsQlge)aAWd&T{lWnG@ME&Mu$k=wl6Qu3q@#}-Fm)_-1 zyjJQPckChzF%JLSy%8l%FZqC5Y0_c-YZBwECQT4f{I*l$I`sSYV9&}00*<8ryn)?nI-JZbKD zzPq@4Eu^9Dg>*OHjm=BHx4s;#6wr6eTYtneoGuoKyOoqRno}zLTAez6ECV-8}7`eH^RG*lcEf!34)=R|ut2+x6KiEXX};n03oK8^39jQl@v}^tf;q^B(7V zr=`dI@%lu0n^mwrCLP_Z+jv?fO+ltB`D`%2>!*CTW-o^g9o7WMU5l@x+K+R^nZ8e- z7cNU7rT7@<3M~`>Hn}m$HnN^dxk%3&%fo?WyR$>;{ z&2qE%0Rf2Z#*;-0v95U83B2-TCAq~m!#X|ahoY9sZu0!7girKXS;Pi-#ye={nOT0H zwA|M-6esos%ZI-lOC+zk-_EznVL_w=F3eAsxz$=AKzg-~<%=&lU>=Po05$|G11|j) zf$}`0JzXt2W$!=g2kbjjDPGj6aSKe4dm;cYIj6M)a~2;ELb@ui!5XXxe<_1U{ubb4 z?0d-QMr=DB9>;KW*_8~Reh$p-NOxC*^}>KW^+7VawEkqL{o1M1$+1-Gz^}#WmGt(r z76^)e#^N3_zg9GpVTlrAIpu5zp-8Yikd?N)BNrZXjRGc*2D))y7K#7djToo0-{tR$ zU)Eh1G`xb65XRj<3I^&oe5I)b2k_ybfGH?cO`+hdGOf=yiXj~VqzUK|zdBhtyifYv zXRiK@jRd^gw$fg%9P+a+5O&^Wm)id#8-FgJ&3s z+SUTwq$@=~b&HrT^~U>ERbOCj0R5GB_+yZ9Gf%Ou zG!2DqPRL|gi{W|8-@P$rInDd7H|2A)%dp={D{n%;5eJRm7Ft6!o?u*Aa2khMRj4q} zFV-U-Hm5Yd%PRZBV{*JEAtntE^Mykev|TP8m;)ER)B3jh)t9b?+RCdN;yh9!urJEu zWfD1%p1sbgXz9W~rY$Xg1^daV6pm){Q+uc?sQAFMYvYf5@7Upxo^oz$MBabt`kJ6t zif#+&YJ1=Z*=YlVz|Hb2IshRmA*BNU(^!(ExoV#zSoH+!t(V0uyx+G9BB6rXw0Nl ze@;-~a*aLfj_|wq$5-W06Boy2|KKXYla(du*FzrGZ~|J~uKb~)uMc-9i9$7|aC1O| zqKEjkj8o%lcl6n#r@sbg1<@ywA2SfI=++T1IMrBK*RiS^c zmc#3epPY}4jmW=M<6nQ4NbCx-Gw~v98ZG?!R~hc~M~6NMi@X^+D9<4(!Z@`Gw=9wR_L#4t>{x+RXJH>0#q(zS(x_ z=_fi=Oa%zKxbN)w$Hi^c=GZeub|$7#9bX&<=RWhULt?Bt92yzg)ajH7U_vO^%C1DD z70+9~p`~#CS0MB&5a<=4ZatMWUF!lS4NN2Gb)E!IqxMamX!yT^TU&Ppv3bX@zW5Js zzWRC|ZYH&(^AQjRd94NpdPjP2p!@m2{~B4g^nK>1>&uWa5$*BnD>Gjh9TEInocj~m zZQy2qlWDgxy$JK+u(o9PVErlPS_tRjcB+|s$qQquNeg4tKRJP+qCO8k7kZ6@pGE2U z9H_$;Z5FKADByA9D2q3qXFF;tEbqRcN@dHW@_{&SChpY)ZC|pbf_a)eOL7Uf6TSV6 z2}o9GM}i~ou%``$B0TLQRrFP8E8nu$SFntK^qn0|)}D&$($kwx?Xi^hdQMw>;df>X z|AuVnX_GXh!0wpid(a2;B1h&!6#Bx#>p)bc^wi7JNt0tV&X4~Nl0xKQ8=F8r}$xPtnpe>uga(gt7unvI->4GspO z^dZRW>Q|7t6v7FRTpu0#>US+rVg+Pj<-82837z*zdZsk-FPiR7+;)ZO zrI-UasR|q-Vj-|r>$0YJM^iQC62zPz7RS{ys4LHS1%1z z2?dtdL2iMpou+ZX0-RV(mYU-F3mr)hl%Knq&}dZ=a?d_;@@E~LhB-x>gS3cG_m7D` zWe~!!=3%eVkFyndiyE0@BOX8S`=70Q|5=E|%>G&1nE|F_e4pJ3LL> zTRfdNGk8$k;4Z!oJs4E1qubF1d+M;iUze1Cd7rIQ32DBdxeevZ$Jbmz2m@y>dlP-` z*4r#TYGW=j7L}|ox=syh8TForpuy99?%kQ-UH!k5!$jg3z7d-1qleH1>#_k)> zW^%#jr4}(jrBd<_icN6gCWP$NAIilFkR-Bf#T%Hq)X*q-bk!Qrgod~cXeB6WB|rmGdY^bE}z=H*(H(&uPaC^;M(lXSKJs z#yfAfkCDCMp!1E8YNQ{=kEXO*<*W?lLO z{d9wK(r8Pqqy!HuL#!P{FUOlQBy$@?7mM|J_(@hpl$tve2Mq&>l4YZwl6!GZlRIZb zp^|c1p#Lc$Ioe8bu<%)*p}AvCTHsPU^;vytmX@>jh)Ds#v8`QsIyDc+;~q^b0k^#g zP305MNL%>j0&H1yU`KgL-lCOh8;rz`2)h+6Xm59Gma2SioQ*dX5;X_3+vBZU;s#>I zGk4ZT6!5d+Oj+O%vCq1~)nfC~oGk;b96E#b8705WiTT9Du4(6mCYPchy6vGx7ZI=b zNw>bq#e?j$R%qQT7^?o{!mEtA1$6;#3erKuGF_?r`X6IOBu zVaQuPh*IUv`KeQuj>b^-HL3ew4X|0wE)a)TYu*4^|G;p^Qod_hvm7E>gTHK{V@n7@WC|-1yIG{T?!l9 z?->|i4`CejBbHwVb2C_@F5s8Gvz<&jDngjG`xS0Xd5$DM{p`@*q8Up+r4O)hmrK|O zPOTMHfBW^2sfv#0mArnR+uZ;!g_Y(z*5;zxTG}*N6Ptj-9maI=tjS^c^mUyFu9KE> zA}5t!sKM%Xp#Qg;<`V^BffCt}3L?w;g*&JjnyI`kI48Hem0k5zd>isLB0SB+=JB-Q zXL!cl3a+dqfek~>4Ax`0ArT$piH?-wc|L=QT=^c;@&XJ0P7OZWA2PI?MMW6swcK&n zu->o^NnxnO`1f!~-Hqu|hgWWNi&Me)|*C z@qt$3KYt_;hl{jJJ~_8`95b(1eGJJOsG&`SfJ}M!2tnpa^WW0hk!TVLKwRa(=wrsg z#W~{g)9e?*B-pGQZdlw}jCUcoGIPHqUUcXo3rexAN1HZuQtp?HA{D?zA+;Cpw|*%q z;Kgs89+j`mvY%s#vQp3hRdAnY~X+2$H~A1AT~vN4!M9BKyC8*CQ^8x@dC9n6HS z70v?xWOOJC)b^ZBWRbMUf6}5d5nFIGwLtmiFDI4R3u(`9)Pe9VUW&aUX&Bsi$U7!o zf7%VDH$pje+Xu4Q%UwZulgxGZN}F%t{ze?9nHZk{?aN2lkm;RsO(3Kheqr$H(*&x4 zO;ucAjuYl?55@YqhEw^U+Ipr9(6UZCu+y%toi#P|?G13C`J@ydO#a{xkp5h81`~*b z+NuCN>o|IOMLb@5WhSXyxYX-R96xnw{22}Jx_+VJf z6!NFW4ocqpgJauX>QklaRtYD$tIo;kPe)U7Jl=X?pv z9vHQUq9d7{@yn;~9=t+!6tsEE21_3LerRviEXYRQeVNT`RqdC&bp8jXX<=v0M0Q}d zCM>N!Qy}oE9}HC3t?6r8zNQ4j>Lgc%=FRTt2I^lfS>;6Wv-PO;K6vD_$#luW z{qoC4t3+n@mXu$mJj47Q^C;u}Knso9VA1##pZ6_JNl>g6e4{}*9_0bPcExvhxVDBr zmH*)=_QsJvjk^b1@xn9YG&G3cKjkJ@+ZZ;GBm=e%7s@To1KQ7(XHKn})pNi7xMrXH z9|fZhDM~S zc|xX#xfE8x(m$r!9i(6$x!?@%3y_90=#_CttWF|RkPa}BY6uYjc8!1S1MOzM4s70& z5*Fc)5JdBb?Gmi=TFqf!{m4lk70u6SAG9L+E|+^2ugjY7ccwXDaeYQ4FgQtB)6-K$ zL|_2CJ11F5&uv6;b6`s$mgEA|8}G}-rO5qJS;Vc(<3G2s)u6At-n4xrj~t>U4-Hvr zVE+fm0tSzZeYAQu1Ge$}uD>ZKVQG0MV7M{Py2b^;GX{M@2}~9v$PUr?v^k=ktwIa3 z{)bgde9vy#c}C6Th;#ZB+|NqC-8*q)3GF_we@UX%q%`u_rGtHMG8l`aZp<6YXf*k5 zd)hk7X#c(vQ`X*&@r6mzrpSrA8Pi{@7uRv}8It;yx@zmF_uea8STKvt3NDQ$1nwqi zA021Qi=*wrf@EQs9U;p1x*tX@(EU@XzXsTO*!@Be6#1d93G-gqVs8R7@OaKEX*0Gr zztk)M_9p69hvAicGJ_JpRaaV#bOTTETHk5=2{wi@xyhR{_bpf}AfJ^3pgQnstIRQ! z!tXk$(L@n@y2OqYT1rac!?NKdxWGTHy%EOlI2?bi-{r>E2>O*r7xYmE7}>`QRQa-Q zT!6M54+xm8K?3$@Y?!b2bKNb>6$@74ixc??@`~`ARSzR(+Zb zts~OVQ@vk(kPJb6k&FPVsZh$;Mh9WXCwIqks|>Q;Cq}M|E`c({_4gLLSc@?zPVIoL zoXW)0NG9ld@c99vr`PKB=5kD#*?KVf4?amn$H9^+Ii4tycoM%ydgXJY8TOE$E zevjETc($B=G^6*ieXp?V8tnFSLtGR?{lFLLEGVd4-kSYS)($yCmq#LxO> zQmcd{-aS#PR3m#$M@J(c&)0q9)c8_u>0?!H!uz6H*SaBsTUh4yyf_HE-M4~}gl%YJ zVhiT`(7tpm+j!3(M=dsuY0pKkjG69`^{v1{66vRH6HP0(w^c=CIYoei*k1<&)^R0j zrV&>d+ZN8Ztbbq?TTW|AqV&yEe;SDis&<2xVRZ1}`0_^aJte`?y8Ni(S23oTqt{&9 zP_P9KK$KRlDEi@$6+t*4mOtI0#kcxy1JoU9G7 z3_Z^}(S^GmcKQ0EKgUxj&6X%8*6HCgBe5>`)YsltvZ`VSDzq3mY626%+e-S@X(YNh zj5XYOQ3mZk#+N97?uquEY!?^qE>NTCQcfeY%J3^{ zs`ns}^WWDsNx>ab5GSk4r7b)149~A1-2=TKxgseYqvY;#VSUz24|)NBGi|^ax;x9$ zaYe}lH!(c-9Zc%;%U4Q5(r5Ih(!7D0QrnR5mE47H*Vt$^5@E5SVJLlD%2Q16I2A9; zSYx<^R+!9+YK)U%5O^pnjIdxMGLPMvdbXo6(29ao3IdGZ1>9J`DNq?1GMNtrT`TUq z+f`)g4d0@(Mv|&|1>1;XP@DkuyBB`OIL2B2qov3m4x@LP78FXpTXx!t*yeu*8tN@@23T!oR$4EfCI zw%9~)2M0wMw`=?cN%x2mdfkjJ;vq0@z0h$61ZheN$W~%N2H40|URwN^F7}%}4tx05 z*CWNf^EE`AK_xX9r^Ow%73rPTVvEOH~Xn5v6m%Gr&`#erQ_20X~V)J&LWOQ65 z;oeStous!g&+vxB%l!R)`zV+vU6kUXH02JYeQj#QWn;?<#CH9gbF~Lm6et#JM2rH$Ljdad9*$4hZv2I|Nib8zyw6i}DllWCH|IgWf zC0j(KB61LPsTIk}(fJAs#aAHFE3PUxUNZZqLzV(@I~A7y=3bS92TkHy=+WPDeP}2W z55NvBFL2Y2o*)|OUAMsTf0&|M{QhY6S|6+`nuOCa*?+O$L$z**9&8+KR#NPQZ=dbF zS;BtIogIOzL~J|=OW+Or6}#~6$Glsd;C2_95j^c2DL9=937P&E7`noVc%BxYt=74v zHb$MAg^221HyM0nf-jX%!A_)nL%J&LlrGQWT&0P`_@M4TKaa7$B!n` z_t;4~SLtQgpgkh+fF-iR^ZW45PRzjENN>7(nF=R-dNgO$ zzwc+_i^G!v94?0vW3PwT)3M1$hu}_-G?tAJ@GPysR7KnTP{?(Adw$pfMUDVevd1mM zG*Q%Z+3-g+|CP^0Ddc_r30%yKiPpNe^!J=ZZ_I0pD08N)-)hX#F|={ip}#XVe^Z{T z{{BO~nXo_inXX?wm^JTh;nsuK2>0B8sFT&!pupj6<1)|XpnLTp z-s)#(rwdRUbUR0ZR_fqHOeBPa$aO=55MARza|E)$2HqR0g1fX$FRQ9x6HpQ~cV1LP zqx`EB+p~_*J}JAi)u8w{-}HN5vS<^YmEdX#7^Uxw%1Xk^2-s;4hGdN#$b7Pf)0nQd zQsSNX-&TF1&pZG(9*oGBh7aTq1SB@%Kn5iNA#RC=uvMYA@TK&1Ui|XyVId)W$&8&R z-`CfHDd=hL#k#Xxu2>*Po+?%eki}ZU74Qr$q@gvDT-SV`XTGyH>~s4&Z53AzXFr;? z997-R@Q}nFlsdf+nOtqDOU>xMH#DEcNYCj2SocAHE#m}<=ghBXC4f$^6!lB;k&Qw$ z-{|4@Sy2ApCAv)#!y=BjJ6*4!kjvhN$cwK}aU#e_>UrH?-ANOBkRrY)q61 zhjP4)7a)DJV%6+`bUZqnT+naDdhxd`F5jPm9X4+waF01!0U*><5yBzTB-PtW$GHGkr(?T$%3zzOQx z*!8%_sj60A@SkhW^%8wPO?-q>@nS{wu%fDZvzDHaQ}DTc#pARs9xmwsuMI?FkN5Hol_0N?km~^MAnE zqQ2f8!Gw+4IX6G~uNyvGANuVXJ8Eqhg2x2Sj(Uy^rYl1zuVBLS(EzkjQ3o56)X0Wkn~@5Z7&GXse70%A$5+AV|TF@3n9U&1>P#m9u*Rr!BDc4q|=# zWIJ846X$^v55!yU;kRhFA&j67)$&`#@iS!Xlr{wa`Br8%vj1}J_xqo5=3k%A9&Wc4 z1YuEB*MC8+i$^gYc;SygbHr`b6ZienffwiBysRO^)~-8tH&k_Xm^+COu16V-DM)<; z>^o{tnwk0|lI8FqN`sUnntwhqsk!B*i>Y;vS@{^{U6GLPK8R-933VBtj8quicxg?R zyh=?y%!vxlS7lh^^?G5~@)vk2`e({a-*gL1Y5CGRp(8z~I--ZUR<9{h(sfRt_dY&J zJ@-Ri3$&RPlBoThA=H#IKH0&2_X^mY2bP`RC+>lm8WM`nR^ zEj^#@f*gg{5u%mdK@Kp*ssTqNPr70(qsiGv%~IjsYjV$UR5fqTldq{9dT(OI!pp^G zO;Y)7*<4>RjttZC`~CL}zk|f)otxf@Npp^2WOD0{OSt-u{&iQ2kD!DAUdNv*;&iL24Gl6*f`Wvu}S zGata!l%k?HDr`JB&cD_1dV4#Ke7k!Sc&;lAlfw(!npLe5h5EX)> zDB-Q=ML@Xs#9;w-h7URMPvsO%8Hasc@I{gt)IFm`bqi|+#%|Q%X&%i5nk64G9Mrp7 zx*rMt%jrNe?HgdSC}l(q9;HBjF`J8p1OVoFpkW&Y+?!qc&AIAFe13-u+0 zE378;IZ3qk?mSVy6{ym7oo#flbjitJh%$WYET&U*Ua4`{5g|J%NGIH~DkC;^3t-Mp z^Ox_nIWEDTP#s)9RtV@7Xp@2dub8=M5ZDm^h5G{AxxNY_HoLSXB-L##1g*n%ACdFy zSp2UD;k`=rgnmoAq@YB@LK36vSW4t<#$3PkdMkF7xB=wxxp10^J{wf{ql|V z#7RzGaj*wu!`28cfQ?!427!;JX34{v*Ym^0D1lMHSpG9(hL=;&p=KfCpBjK1kPKp? z$x{+4tEToIEtqXR3rm>r`Lsyfms^@6r-?IYSOymdiz(4KoB&2Lz~oyT)fsJ{jm;`a(Ji`nuGV5yr1?db_A*H(9Io41u+aS1#GE`B70KV%8nv~&-uw1TJ;;9> zrqFD)*78|gcp-&k1XTcX;y|BaqniVkRa~Jd6?pYo&CMGeA>!OY7|7~j5jY*{w}JAL ziFWbo(k3&L=K0GbbQ7VFU{u zH+GGDrTlONnvmqFVl<-LAM-)wQM_KZXmcE;@0AU8R;Qk!MTDK|R(;Z9ew!&S(bG5V z@B8?r%KdEt86jMu-ohre9x)Stjhrr#=h=5)&=2D+N8Fd`B`hJ-5#NPT+n zM`kLXOOXU^n$Zoon8fdeJs8e z#3ttWS3HFV0mtk&VgxG&}rGk{2vd;QJ2;Gu49b{xr9{GRM_b)yc7-N=xeCjFOyK%BTQkDi4U^cHEjbeOw zsbd(u&fTH?lL;t9l)fPSKBd-7Eq`{Ugh~Fm-qScKHp~k)n^YLtb|3E8uriuFLI)VM% z%d+@-RF>l0>wOX@FZj=Ux@APwf)S`?04iVW#~WM?nyMCq8rtV)_t;!FO+5=(Jk)bh z!A?Lh9W;n+dkyFOK=q?w`W=YNOBbYlNk0GO;!^2CS&t7|({$kWH&+gdM3&0}?>MW) zt~l61_09xENBwAqZFpUnR(ehams5NqPEt-FYd%S$%%lQ8{NZ9l4e^lu(BGxBABF;| z+aNc7S@Px2N9p@LruIH%dKn+b+CDXQ8sC)Y)sCPB;joSlnyQSXGG%N+xG^FD4g~iN zg3JRjC0OQ<+S%t)sNLhU>C-wE{hpgHnevnT_N+Yo_Nc49jnnScPi9Ui^E%7yeORcTpX+)4zZy9+y^kNYK} z?dOuNj=ej20X}Y=u8AEn=N)Vqdsz?W5jwp4FfJ8xwFZ%&@)I(@JAwKV}ZP`U~^l5PRyKLyB;nXnRu(p zv8<1q83YGQj{FpQg1u?C)aWkflkuRO3w}~mDHtW;70#qAJs!!eEWqENYz>jv=p0r% zEDE=wwHdyyM^)INomWh#r1H4J@dKS;0x|DrIdJHnLfsi%+pEC!eIjYM6!#@?0DYtF zKV;fFR<&FrdwXXM6Ty^1!07~@iBX_6S;t?<{o77)!jsy&R_0f{*+b2F07E@PPB>ID z=k5yM7twvAH~I!jWjMvE{kIh?A}x{x+?L!s2i4-sDSX!x|9+UBDzb19>8+?tAbDlB zk0J}{eNHz&Fu>tA7^i}Ick{PQyCwx(vGGH%I-5~!>?V&SI9Y>yq_}QvR{jD9(kRg? zXG(S8^tnos%hw!Z8%L(aLFHvxvoE)5Bx)-vi+XPGcCpyE|Etnr_kS zsF^m#6VGuunxqg_Zfl<1n>B0?BphD(F~27hQ5bwB*LnA(J~+Civfh`$0~N`EGBdUj z3kPamQ)NRElt28>f2;+B7{b}>HgLC}#zm7#i-$vHS7Y1MrCWPba6prcManNOdrkk_ zyf3COomoIM0_T^;U4&oj+ni-*Br(1giin)E)aMh$NgoyL-#(_Bld9eCWq7)wh7USC zD9S+m6%LZ1e*qao1n~MR|CP@H9oivsu|{b7^h(S!EofFu%FZClPXq#dI^J-LY&Y=g zTTe?xsaLe*UaC-0#+ z*UgZSRrBNw_^2u^dFpw=%-XNk8iPmeIzNuRmp@x7QO`qn6Lq>eHZ+<@Mblwn*N zr4QW*j10}b0|G{#N}8a1xkM5TGB{FH5rqXN1R&LR%PIh)&Y{Jf%PwlR`84lB(&{W+ zWINS~dm@3rU%Ud9FmBB*aWrbK7qCvSIq^dx5Nu1q?AN+^BKZTPX*I#9u{WB7GL#{f z0hCIDTk$f{QPwI7mF2YseeM2+#v7zw;oX2%AT|~MRRf6WNmkFDx7j!}!PXeUX%B$v zl%>4DhLDCXbtWS|b9*i-_Aw`|d=w@3!l}g!4FS^kjOHU8zRi>iGj z;P46|qjk7n`zz_-hE_G7ZAi4Yx)A9}om9wJZr8yK&v0X@h=C!>33{ z4jd>Bp#%*H^@qOZQcB~`vCF?EpjmEapWGrS=#949Qo`D2;54`f3SwxKfMtUD|*0 zR6#Mq{l$*SBGaPS+W+gA#&~}y_)RgKp9GwT4{5O?>yiln{#+a`tAaurc8H+m*|u|8 zJIpnkN8P`iEgfc#r5d(g{drd62aR+M0h=^<<&4k32U7Ud5^sdB*6$37%|Cx4EOo7> zvQeJd@l5x21c0fctm1cLq{Tnoz@$|oogjW77^DAs3n;xsH0waun2U>JQ`Bs3w9=sG z8GY2rs?^%bL9(ZOQiwOnVT14uB|g%ZP+;e8Sd;qT&&j&jcoo%C1C!Bz7Qp_Q3+vO!-F(~xX?|~-(9eDEwPkdXbYIRRyp5u z7Zv+&>=M{#Qf8F#Q8?;rE2Q?_kp!4G4YKarb(~F|?+PyuC8DXp;IjPe>#}Gmc!ORA z-q!jDC`)16BO&Hq0sdvkZ{8bB`9lJvmeiK$+G;;Pa+%_If5wOQK>fmRp9T5(+rLQG`CQ|>pBC|rEcDb$Y+dS-TZxXFFlbem2ffrK+~?r zwlNG8+z%9gn=sGs-ZgwGT#quG57gEMhph!ZT)XVOGMS+BFX3@L(O67>aa`0`X085y z$~Q$B)uz6qJ{!F_5>og{c+}-!&}d01eXb+5Nc@WOLay_@Z%@YlVnf2k{;VXp)alsG zGD!vdhz|(^pEVO)ejHt)G^v&&K_;OPdqn!7aPyMXQI`Hi&N2?6#dmXT&gyuITqe1{ z96Ibt77ftBjs+58KKF9S=bt%8W>nOu`~kjcYlnaAhq27W2SkA?<2ASJc_;!{OgJx@ zH5s?lwDz-z%)}@;FI=^|u3-Yme*8H6URRutH3ZNzakp`vA9latAr?tSohFU45V6AF zFpDI$zX?tZ1k;dZ8i&zGYw*-=6~d2Nw`h;|VdI3L<{8u2AFaGe2DrvFuamxo_(p`+ zwhM^{Pn|}L-*x)Rwfx>4xF0wHaV!JA*}19j!|BSTDh$J}Lr^MmpHJYW>EZ8l_7|r{ zr7U^0#D|cs?Kg+&pPAr1R!(rYm|z1r(GVUaH-8x~(IQ3;(hLIJMY`qGFPYS7PiWxF zG*w39OB@PU{4Q_hp2L8IC3-~} zL5SJpm+}8B04{2nsK$wmQx1g%A1KF>o3GUTqYz=Al$TKM_&Y+y z*9xMGSC*NMYEnNSgyhNm3SssauSNv`(#Vy7VgN&|zOB2U8nIjaDteh}tzH=_{>Ln)y{y&TfO4_*h1&D4Dw#vzaL?A-sqbH)I%NVSH5H@2p$y ztJvK#62u1>W`4=hb<}v?>z|%MrLG_Iv?C^577~Udtuc$0R;nUe>3kfWQ%05f+Bd7N z+RZxpX}D_LD5#YEK47)`!yu%cQLI8L4ws-va*=>1Z1gZ}{KFKrIO}iEOWPv-sv^Bm zNrNGc+bmOXtIsaenX=7v2__ z@OiXm)M_Y!O=8U~h3JBBHfUiCs@isEG-KedW|bo5YcEj$0uIeL`{UvU?b>toVV8*F z6O+t4u(ZXxTTt+JIPRAQE}4a5H+bGqazXw)tphfSy*Z=i)90h|3^-LEq7&Di??(($ zNnOR^5D5PI=1d_Ge((J7lu@^(+~&sjrTT51MeOj&L|Kb|p^=|*O7=yl4Av2FKDIRei>?OX{hl7z#(wT=&mdl*641-_T_$l~cb3eG#=Q{Mn1(!7a%MxvvsTEGqE1kgRoYm-lx;IaZ{_h$cpVqeF`%3@9;^NM- zo@-Y0D6(HJ_Dqc(1)EW`AsY^N_8qwTAojkHJb>{LaiLBo6R8snUOV(Q)#<`$NB%GS zx~K6i=JG#YYQ*-|;fKvu(8Ugq4BlA_j4kh^*nL2Aevaq%Bg1`*h*`T>cShTN7lOq3 z?U=Jm4QJOdc-wnJw9S~4#aYDT?a`<#6SzmA+e+gkBt*9p+!rfJ+7c|`}KP0sY!%%M>ahlZU=L`t;%5N{HY zvw9>_Z(Pd6ej!Jkmyho61rkk;>vvm1dc?>xlsXG@>{PPD7S-2Rp02oKI9j3kui?0x zBln7kUPVq*a%jljKPsp9X9~O`HeZouTMn(wE&fb1KH@{p2n(j9MCJEyWgb3a?IjYS zG}NLGK5>%C0(XS?e7O^0c8(FilNArY@8p8f0Dbs_DHUjYA{xJp6{yPPQ9ygMiFS%TEcvSO=)O8zL zR*7%9QHMIy-SB&0n3!v)4@E=Dr#b?5hH-GA^F*PDJ>}@t@!k5Kw+;=z5t!#$7A+>y zyn8H%H)rIyzf*pHf+T~7L6z;)O(d14xcy53OYHtwmb!GLhVZ6Nwmz701k#O}!kw%7lkSy4PF_|=ljtwr(l`!KGXznjF8sCr<-;qlTKoR=N zJ@o2}ZS^~2RYxGI;dy>BZ63RkS{lXrXLwzSTd6L#yip#6u4pOr@!5ET0iUon(9gc)cU8F&K*txsx!Ro590u8{3{P0 zbG0l~`3V|I8W;yQ_Hz zn<|qRbfOzOpSBBVQ;?N~v!ZKCDoj?80SxDU>+iHj~8lwxFHOK|x1U7Kji4Y#Gh^l|W;(%8zoeYarX7t7)=Q*&&N z+L|_v^4!z<8mz_%5s3yV5s73`t6XjZRYQAxN)aRc>54*kktYo{V~jD;)o8RzX>YXa zfE&UVtp})-sHtA2x7efSw}iw|2`FadU=z~h0p^h`a?Uq0x0icH|6n^3o(mRnbdKNcQz9x$)x>5ZeLbs#1yV& znJH&4xEuY%Vd4(xuT9kfNm22msPs1(o7WY9iI<8!j07Uwu1_||$7Upk(L<74f0Mmt z7A~b>0ahS#^h}XVY|Dc4-Raj6y?&RlMQ=8jT!|468E-O?#>bU>WHS|K@o^>hI#$0O zb2)y~;#u+gp93@HH=Wz14iTVFXVg{!(J0&|rP z5CT9fsdga@0!{}4kr%ArZQPUTkxX^c;(D&a8p9P0#K&>e`+sTQd;IIB;r|NHBSCj| z<|~w}c(XG6kjc6Y9OVi3#kYV+0Mbt801y&wA$W#FbP_gGyE(s^D*%-m%lY2yM0AeV z+fRKC3sjg%mCiT?i_A;-*f$qLGylCCdNK#xL)|_+CO}b^z``~E?VmJ&o3r@k^bSQ1 z15o}@=oJ70l>%>%Znb4!XuO-db=bOJqa%C($KeKniU2Oxd+`#3ie8(-Tqn7TvyWBW z_eO=bu=*@N&)(U*sSHx!Xe5GuIB0^(KGAt1eLL8MBNTa7s7`P2P2bXaxMGlksZ4n{ zB4lNX-RdPEQ?5*L39R*2PAv5A_^KWyOq}g$K>i;fwfJI{nMsZGfhLp(VgL&a6uhbk z8tx&IMm-X_)r|=*zDmPbg+NWyg`Aj_y99;`SAYb2MoR+pI>YCncACca&T1gF*!*|2 zZIzuaW~o1;DX7T ztev0udjiD2R4Zc?+I3wn*hB&HT+A^u^#4eRBxKO;xv?^UAlhl0|H6~GjpshTagw;f z=t<)00C=>ZLQrfdL^cglbWOpo6$sSTGw;H7g`|icIH3?kEUObH+5=Nytv^@qEvuRq z`UTG*(>ZO!)T{WQPg5m5MdoKEJ>GiNDuwfBXnaK%O9Ab-Gm9?RE>chV++uIt`tXAT zaUi6e%2}rBp-*<2J)-{lB&4TGcn^_L-#uat6(+3)j$aG1WXZJeA3EzK<$~KEGzJHi zx?=Ap+uNn5j1!RHi_ho&6dzZtBLHbF7#^XU1b`)0ahE?w#t7^?VS+iViT`W^tvF_XJ?I- z#I{hazpFKEAyY}w6CZ7Ie6_{+r@2C%P(XZz@@ddPt1#)gHAXn}u5ssE7ui4m&Qx|m z<{@X0dyprFg*2SG2rQ&4dhY4P%T4x;;) zvk2@U&X$B!%vk953(jvorE6qt-CZUq8C&e-Skc{picEJ z#6BDyphNiAgRjHWhNW|Xk`38VY*nBErpfS6A9z*b$C=a24~E)XV=vg{?%F!Zu+*{6 zD0kw^>k4JK(hdeMs!+LDC1oZe>kA2$T@RDCtfDHXHClbh*{CO7=pnXAsLk->r@r#J z^(YYQzYmsSMh9xd@>97C4IU1Ya=kC;s1VNlsZZBtlUGP^ECNKH-22fkU+~C2aBJ#) z#SIb{v7*I-`KQN`BCgu6S?iKl-{2`lZ*|8Z77A1l0bu7&>9@$h(r9uH-AJjMEv8|a zD(Z8$*)3l5i4u~08mw+7+RRN ze<~IjHh@*99!gj(kdWx{d&~!MgF!29F#ov5eZ<(V?*adZ!K*RgVl17)p|B8>Dzeyf zKeK3UNt$=|c22N>oU6R)Z7CpW3a2&+h1|Ms4m)_jk%!!k?rNVNUo1mw*~Sp~iAVJ? z`Z5b6BySM2{g^3xIsOH?hG!~lNtJiPu9~UHou=OxIs@%-SK)o)@`LhDF^jb(xr^Wc z2+VeH`~odmt?mi7S&_32+Dv}&EE`~Ow79<36b{&M!vh7Evvd-ug&ozFtDwgav|44m ziSWiGUKgMw>jmt0*h^ML)6*<$We1{KP5EXagU+Z>Xy7q^&ku(WK5+w{@n5D_@xS}E zc)}ts*^$DFvX-XmIch=Pr<@)~;(FNntYhmxd*rxYb?)32?x&vAE5tAnxM=My`tsK>xpJ3_Gr9;J!WVD>Pj6;A5qdc8Ol#s) zYC3yP01@4TL*Kr!XPB~{6QaF1yd>PM&A=(UqfJmyjWrTf&T01a(DOjBin?0EixaXKmEhfBqe}7zf|>U0ZJd zx-om})nWTXWPci)x$A!#$I!D`wR`z+krv#d<3dt!8EW|_)CDuh_xc1z7gbNH2qdF~ zz)?a6elllIhV%o;qgONnkEUlu@s2WTwcIzJ$-ocg-?!@k_7~`j3Pu*>OjSXb%9!hf zzX9LP#Qn2nPEh2DFeX!LS#a|G7on(V3Qa%E(uwzfVzo`_u+oyPOByHFTA(1(HSI)tU}$=uHR1iGG!xEVzcJr%InmwX}=e z@6|+Q@!!nC%!^M7UxqEZFt%K82(Uo%IP;uWe*IyBVJ_?9dO;Cw^@i+<@5tY_9|50w zIQVFKj0Su36|)$+fc0>ZBdWbBc^-`_4`=|8AEA3N9+6|47Ezn|t#9$v}|V*1txrvqM8aaPKjSX6ERt9fDWTz#FyF`5QF z0sjhtjsu1oI|YJPx*-YA^;T-G`ZvagWpp|u(0TuQGfKoE({?KAn_h8Cy44+DW$V4u zEdOdE-MqE+X_>tpU#5>43Lpn|XXP&O7A&7>vM3mGqIg0~S&U=`r+?(9puKfb3=JT^ zeiCnXqypzp&@+ofy3uIL7t;UX>cBmW*| zt}%>mDRcGW-C%l$^fvuCP(A}$pva!pCOT;bBod{@tje~c^U5i}9-cM+ZS=K373JM~ z=gW=qQU}M$(xllk8{V6ae_7G^^creqYN3$A$iI-hoZ;su$FZDblsC#0N>z@jc-)PF zdUIvHyrgf}Yrye!MYS|&TMP+vCaB0Yv~VYw6Rh$6Mym_V958JppD@R4XSRKJD!K;j zbwWmDM^w4pqu%bSFDUN-ezL)^lUkJ9;4Dbgv;gG+TbCPlOq?t(P^ zTt1edOka&3h*PNmum_~zJ@RN9p^V7KPb>=l!Brhr(3)#%z|QDX0O06)1C!1RGVqTA zy{Edk4d}%{-s-Fz?iq+k+r`r;cnQJm2Za_&`wiFaK2v!AF!h$|`73C4m2qZcFHaL$ z9&4?>0HA7gz290w#K4&{5-N-^Uk-Mf!1&8RvMt1LAzg%ErdK z&rG6#=i=%(e@+5{JFESc>fr;|DlPh+y?09C*Vp_Ha*4B%6{XVE!XjZ~4(j1wa+VGr??dNkM}_Dfj0UQ8uSeEl9fzAG!@0Fk=2XCmjx@- z85M*5M+4-q8sgR3E5uBFfEcH7;!K@~=}n>AVA8ox!tC1q4WKP>XPTfr1NLxn zY(`pan|#V4{Uc24(XP%xqRqe(uCGm<0LvA5OR5m8)&Llh^|$Y$brWsL7!rljUL`T| zS2RKL$Oy*uZ_lt1HCS^D<~@oJ zq?Rc(pCd#Km%Z=*)*+p`kUDoARu5De*33~JO zPVM|*S>?tQ6w^(RNoe7P}%zUA6<{gmVUJn{|1W}<+|;p*rCtH)3x*tN=K zty<`&<1~n!;eB3+(Q~LJe;cSe=uN$|QUWucxW{|m|rA?s#zIW}CROmX)h z>lsYZTaMma>|fPCfc0pvRBDzmTnE0O1c&DcOH=-4!V*<%aZ zud^)nb|5G;a=ACDOV1)cqMuM3DpTbKWd(XeD|Y6Db_nR>KLXxOBfcxX=Z@dX-5vjf zG1P9!Z{lqPpWVLUx~YCiIOcx@>Vg(s%oEGZ4)4v9B0NEruZ<4Km)##ugx=4z^wt0v z(}z&xY?g}vhrz8Cs+%sx-MZG}T#jv6Y>l493QIaQlD)kIg=w;a5VUOIv^|kPibwHN!?7!vpziH+X2Hcv1LFrrsCm>G9}6{xaYc~U6Fs7N;Z)Y1)iJ+JOi+N3*!Z=*5H902>KD#_N%o%dG7K9%Nu z#>2m2@5X4f_Xj!+)R?fY0%le}EqfGV+8p(<$qS*JNdYw5*3_E`c-{w$yzX0CyB|?d zuN6=S2QzYb|vmY$+?EXyh@@W-~ zumt?s6Clj5-{L7P2q*|WSkC@!Uduli+ zQ-th@g&X3m4<|3sj%jorRzRR*A`uXxnlaFSC(9vp?vBRio3-TJ7?;h&bi6nw{1;A z#BgwsCF}?@i2nWQ*gM|Tj-`68v8r}rE@O_0KcDUjLg^ziO@Dj{`HygKdtq*nu@)e= z3x+b~$3zl;Y`;6QAaGQ;={){vY8oIp*6h*sdlaE5N%o7qr;;zgHay&ZXWE_Up^cIyPig1xTX5Ej0guGW3FaUW(>w(FLZ`b=u zN5t~P$Z!6ph)Oixtj{wdDvrb@@Ha|WNgQTjDRazq*zZYGZoeo|HpP@3J_B8r^4Pf6 zqIbUv!9q+Mr%~BV#xZ5nx3;qMf1%1m{N4YXE&3(l%Lnl=Z`x^Z^pnKYJ~#9$gn> zugUbNdMf<9zpgXpMU_Ae!{pP4Iw*d5{ehaT$d?Z-MWM30&Xf^{F_8RYqpTu1W~~2w zZ%<8MI7b`a7GqvDE1^duK<$761#r8i@k899h>N%X}gu;8G{dA@{bbe4;a3^o(9Ey6A_AYsJ>yTMss zT8WH9C!UVGH03!aKsq!RfcXgnIe9ZBN>k<+Qg|uNYr9Yl1CsL9LnmDgxmyL3T{F~M zczj-aONE09M(dLjtPw~1o*&_5ry)r1pgI()M(VrlBz?CujUMm)%NJ&UtY7I1p-6ZBGTJmC}V20W(RLSsEc$+M30%;m2wIxMYvKn^X8 zZb7z_{~i$V72msY{@hiZ1Sm_As}fBSW?}+qfJDHgr^Yio{Wb7BTJ&iX)j>t| zS}WDwvdyC4k)g*F1jU26jSQf>0>EXhX@4QLKL!i8G(EbR6kMa)ixS%U? za^FkeQ)Z5iybKk}!so(EswA=q*q>W_dfOQ;I^SZ_S!~GRu=wpzY^D4chA{Wh78Bs! zk%_#|d~z*+(fjIkm}9zoe`VyAKVvl>)+GSgEBJo$cWQr&Q41w0$O*dfn))?;yH{}X zqAX&Zm=eMldtcP8wgE>ut&Qb(9&0C(Sy-dbpy(qAX}!QR`e?8Pa1VCk>tLBL47{$E zk#9)it=KTz+jD(a*CTP_!jLqTecfKuDmGKqZW@sFep~EoBWNT7q!<9y&@c+y-QH8Y zbE2ad`@$j;;2&v(d9G(airI$x^v*0(8G0b{~FVQ!}`}ec@1y$sDqE6V*44%+1Cfy5)^l5Or z;55iI2gXH7M6y0%R2_5V(SdGYf9G$A#iLQpK%Gr!Zbv_>j9d_q{QGce`Y+kfQW~C3 z7HZ3TZ&4?xM&vFhJmOe)Jh-hJbjf#+3#BsT6?A1{~^qimNqWw(X_f)En zKmp(Yhns7yr?`cCjfrnBmCW03Ji&q=QiA7viY}~Q`s9B4=y@ykS;SN(2bZ|YnUQDN z(hUqJph7)g@EqsBmeCKqE7f6PXDwgIb;p-5N}w?t~}t2!yfE{xQpy>|_DMrV5iOy`uB z4kwbRqkPHiUKcQQdsC{R8zX| zMSQ*pojN)w`yn`_`;}$#LO)uBtONG{0#i{1vBmkb{LceGB`i?ZPNx-cf&3FNp?+Y! zo@dy7clnHETL<@ItguHF!+u=Ga(gBNw3315zqejM>YK6f3he9@6VK=To`s24oY*+P z@15(AW%rAf^uEt*F9FH+qafjFEMvqC86a-BJs%YNuM+5sj|d6<9xHf-h8c;{h~}Mn zB)q$r1K{UA!8oJ7W=8=Jk}%UVF5(PyOt~C8gvU>ZC8>f8fvCzRMf`h_2WcQgLB8wU zB{H_k^V1gF@U`*ceyU;Qk)JGqWbE^W@`#37cRSa?Ae)uqwD1DPa4J+FX4xGe?DfK9 zu;`v*?Qge%jjePZP@_Zywvs!135^8p2EAQ%$Nuw{XU=#25qOBX0O}?6xtN8rft1Iz zD&1D25Xvcv|1dw0Ynh*2F2#Ri48cKK<$z%??D#H=?k`!FV|ag>uK<6n;UHks^`UwO2|mIZ^J|FA<$ve8 z{TuMaC9D@_(w#b7t&KK^SEv&`Iq_mH0w!wcN_~wP|XNrE7Z=N}! zxEI3tVN*IK!!Csrc*cngrxTiUUTH_@(e|4%Sb^%4k=B-2c?;b9&yWez6ZSz#M0E-v z35v_bv=9Fbfzs-{Xt`ge;41Ea2Q;rj17FTprM>@sQmQBOPZ$FYdX?e-*)XP%@Kp30 z(VzYO`3AS?f`a^y=1_8m_dzy|IKk9xlvi*=Ic)U#-iZ9K@(K1Nyn~8LzSBGkq;upg z#`M&8k@j?NvB$8Hf1QF$X;e%SVd!i0`|VntnHVFT0a@RO2BBs$^=gysou4&{gBYmF zP|nI!oPgMa-8yXa*8NgxiAgH92D zH-*DsB!tvLB2nFPpxL8`7Hz8l!&)W`S6>{v$ft*rn#cQs91W#GKqYrJYkfR2V4PP@ z-h@kVudb%%m#pg4wVd!!TfCM7@X%}en$AN@{IbOO>pHyXzVPCvRN4gm?P;F%DTNAF z9bpfW$xri&QaQ3k5PABivtm2nsr_+w+yGyYwN&uSf1HB}4hlZ}h}$ZH_M{=-(AmSc zjmzEG37a`g&8U;nn-yJLr`zA(5wnBxS;ROYOXSc;)e39!{je~jo_nqxzP5@*GZGmx zvAH0~))M*|yQ{95XPmDC3UvEQt1v1P_l)C@>}d0#V+nS+pZJ#q>oa3= z7fdwXC4dTjJ~7i_=v2oTg(gA&IbLlhgnqUb=1Y+@j#^8|pA2AqCRc_ZoArhm0pO-) zu*FN9&qr$ix{#NJwqL~Op(_EOYJ^?Cv%ars{|sL`QKs`fl6AC`4i1LD*tl5&<#d7x zt6D~33d};_=T3wv7)Z3Y(#Quhar7gfxM>!ZqUQ-TTo43fpuGw>L~AbXb07xDDjDTd zs#42Qr-KP`L5a$$3eKYiT2oqIpIB``AS3H;CU{hQw9u^u(d4*K#_c|q zRr!mYbITm0B1=`PI{zKneU|gEd>;qvE&l0P@C6G3j}vexFu=ej7I6Q)xu|}=koSse ziIe!fd{SjXE$6~$APv6o&jsSxQ$$qPvL@MfXnaCyCC#$?gfqY;7K96PVcPD${2Ho5 z)qx!0k_cJAWP<$SCV%z}y(~WK3DvUA7DXf9WmH~jJEn5Z_#3V6AZ~60N|f?Mq=Ld=-> zCP9id>G}yRgTwG*?<3VHd{HFncMAW>0)BEviBYCS^5osw4A8_^SiT_M@LBJ8pi0Uf z)4Dzsu)#83O?@XB`l8_en=C`RQ@rRtq~@zqLV2!t;|7=K`}6(z=}syuj?XY?;nI4| zX7z!o%ULBLWE-^A>D|Z>e3CP5r$8_>c1$d=(s?C5c$fSAga`>#pxXZY+*84|lk31l zKXL_=RpC@&k+EkjAVZHFZS4&Q?|6(|u%_lo-^Ml0YFhjhGo>*M044dKE&ba|>D7Js zRoZbLl&4N#Ew1sxLMm=(4R`F*KS3LUVGJ*VKf+?$ptQRSjcFU0N5)An;O4M54V1xEc@-?|+P?_w`D< zvkRb^iiv6#Fct0p0n&iRpH=<$3vJh~@pKr|$on{aDu8C6wzHUI`chqfJ+fFiiE)L# zcxo3=7Gwj~njG69*`j;5)&}FH*ycmOg?k>rB$#m_utCr)i0X|Or@R5mm5Lk|n)$Nl z8S))#+1!M5wX##X2q|NDR(Go;A2{;4{^;8frH3s02z)W@2)@P0;MSgh^N%;&cMlEy z_R@L-BI8%DPHbb1NCS@@()Up1xYbtEAxf45C-=@V`GtdAAPut629lV(L+5GT7VFITvs(y&s%*iR(VkMQ zco_M%&DGUBo8!zV`m+v#AMZQrJVx_4_nBIC@RqiLyyEVxgSOj)nzm;T&T*oVvK@A4 zO4a+I$2Rjpiwz6{=(0WeGioF^5mKP~!XEn(4w3nn6Zrs>d7*iCLkf8|i^KRCyo47< zCD|*daBai`{TKa+S3`ldtpJV;cSvM1)|NWHWPPq1jB2-#48B|-!Iwfgcl+2A9n4eU z4`)$Xo>aq4uR=PW2nBbDAL3&HnQX$mQbvo9C6AVC+<-c|yGU=k%CsFWj`d0G4-vM@ z$PGMA%n}u_9Dw;Ca3yWFHq*<}hB_Ib+WlFDu`*(GW47L`^Xf|zelV~vt9YbOCOj;M zygmA)szcBA8-_(hM|1A;E2*KBsRjey2<+l;FMr5tGao=vz{SA@2hXU55TK>I-!UN_ zI3&Rxe_KO3-cJR0kZ9s#Q42z_ZZC*n z$=A0d<^_d-rgPj4KK}7S-=NQz5)jG@xW+xI0s*_oyYJ$Re>aP?n|Z{0X6C6Z`Q6{i zzvkL{_sdE|w=i5s-2_MvdUm=g`7Y6VGwt`~XuMtTNMs=$%>qN@{k%S?7xbeBgdP+) z?$Ni70|(KO0B&_{Q;9?>8*B7XYph;xbm#o73_0KY?b|o$nPw z_O9SXUP1X8aVQXVG<5H!{Bc|feUcu1$sxO9T) z1fT&_?9UWdcl$m_W=C2Cv<&V|dG@+%@I=oC+{nyXC}OmF+gq{G91eW!po!UhOR4y_gd7IzqU{o7}Vfo(O9 zMAr6>ETRE@ev7Dp?X)Y3^oI}kX+j_u+zrNu9W?d*wc(hbZ}5lxz#IF^ z2}+ZREDDl2>c+qCYF)_K7-b&fGM=yQWQ?r;LjBzGBe>pisFoahQylZiq6HGssnt4W zyKZd`W^_)HrHOuxpxy2X>;)k)G{R0rzIS+n)`zp_e_mU{DPTx%xwp%2oZ%L%2gQz} z7|YZNRgEaR8o5j>7!Cd`ax_ zFbF_p0mH>i&(L;xA%hw~N|REzfI}i+Ddm5+DT+9n6rvte9|o+YY_DRrc2<*h zcu$T25ymbKms=8A;4a0#8dcCjW4LH>dn^eC8sg>{D1coP&m%<+gJpO=h@d+!g>eQR zm4iGvV?HDV($1Jwei`*(Q>-U3_~-r9sr8&ZKPEX6o`{eB>2EIndnqZb!Ksuh*6DXo zFOPLBxGR7h6T#1gqLFW~7$puHSFr7NfZQC~(+}4&MBqoEpWF~vEV;X-vmvr5rgsbI zDc--(y@?M1zzfNt$X57{2LjCc#Uw+jQ(O~g!akNL)^{z-ui^5^ackOx5ZIY zo+V}$g>`{sii&K%p!j~|?9nT{H@7Qi3X17z!FvKNU=WwP1GY@F%fW}JrcX`It-;4m z(#xc8bCT2m1QZjOLa)HYK)t^>F!Er6Kv)aTIV4RJ0*oR04#u4gP1iR-m>IO(u zwq6)$6zN-tf{>c%n>EJhf%dGhPS}sC*OESTroCQEVObz&5PSze0wfZ?XAcq=0L>$G zlmZWfxGd<0ch7g9YE@ef@^u`prob^MWMctyn72^z;F>&`dHk^R^OwC(NJul_VQXG} zle=%(!*?SRe`46(k@A}Oee-DU6HC3uCgN48yAjTYFN5&>PzsYUAn$6)Plp6Wi(xJms}O;HLmvX{AWw5e14=?g{16Zng0 zAYF!uu%O+&QOfn1>S}$AE+Ax4ru@&3hjj*D~KPwS|hI)X8~?sCh3GTI#vT(@7}bl(9<4m4+mP6~6cc9Iqs zMn?|7&SDK;>Qq6vr0j`{W+xe@P*6wdJ_sq0g${&k0CQYZpz=HLa{9k!M&o4JsDuG`vR&rolT*f;lR(gG>E7Fo7eR{;Ne~n_=V30 zg2saXyjk#;uS1pz0U@>L8ALAVKZ72s>sZI8I4M=0F2Q~&g5^^ zfVvCFo1!r8V=-mz7ar8M5C1m>7?CVlsZ2;ubmY^(RQGxeq$k9=KGG?S zb}IGf$cBNQyR?_1Ls~Rv2;hw3ujnhB+hLE+c$6jm%X&5~DA`4U0u=j(%pR5M1-nT2 z?W()+YUIyID#)JM>T`tQfa{lnG$D_^0)c>gUsk$@9&!wWIr01r6@QYa7fkYPAi1CpwpAw6T^$j@MQ|Cmr~Yzch5i51{R-Xh4nr zbA+G~W#N=ub!|8Y`j$KK0XUEeH2>=w2%nN6PwNXt4(~UR)C`8l`eD#e1G4OD1-dyP zBjs}v#iEcbVBt~M2vre6LZZ*Mj!2DDZa#_~eY`*w{eNW-cp%NTvR;X%8koy1mv&a_HE1;aibH2k4Y z=gC{SdJ?zfH%Wfw7|ed*MSUUipv6Es#c4qQk3@U?0)Y?{5i+febU@A;pWoA{?Gee+ zv5+bAUClk^*?9}_bH@c6h08JS3c#&HH*zrO?q4ym+fmG?jF*rMWbOfp5};{V;VI_F zxLbALX689y7f#Os%Ek-R!k;)puNb~n7@2(Nc%Pv%B3-4M@|M@eV|g@q32DU)95cz< z=%7`Vd9*~&OECAEJ?ba`s6~gpwZ^iab^ZUpx>c1UIW~b3#&~}{pRMDS8!guC|9*_6*2&l;}_q5jc zJn6tH`pu+r4{r{j4@{M_}nll1sM~D&#OHC`Lh+1~M4) zD>_Y}TrU>!N&08U;OxP6Pz?1`gR0&GeAJ`7Pd?Y`by*k-fUi1<%_k_eFGFSEVQ zn1ngM-H3(G>(=!CgyH&!yTgFTXJb%piF0aBSH~DC60kVhOk|tVxPAJw+^Ff(AHa}3 zZS0k;{rx|n60*D*pbAdEO;N+-5!YsC&r-Jm3x>gBewH$GD3W}*?T0AH*`Zz)q#?TD zQHUl00?B}0AY^q(gOne?NZe^Zt3mc`f%~K~PXibEfYn%JC6sfm^|+gQ*0TerI;1~( z4+yvDosmBLkJBQ(+6>6Z5VYvVZ+>hP*49501V7s1M714Dqs|o0_7!%^YN3fuM{zVQ zQ4{7(tlTF+*sHbD9h)9U`_f##LQX;t9T3elf@p3(+*nJ9YK=kA`>pR5`vbA(XW~ol zCjQqOisdiAF9jMpu>^-iWASK$sbv=AX9z(@Xn<+~hXGVcA%bqt1~OR_ zhQ)*CagbHtoyBcyb7Pa2+aG|_%Kb*hlHN!?e1HV-)&Nl-d~Pdxe7-CNZH|vC+dS2= z7JcG#0J{!9*%;VdDaS40c*%O!snc95$6~o-16gJzF7w&^>2+T{z#UT`!_yFyLQxh4 zq)Qxa-0*YlJlrQl77Crs*=0Px-5=VmY9DrI_`O{a!#)1dwzst7l4yS`8Sml2Fm|pK zsDvsltoVK2<1y0jD z6fYV!$IX2g0*R;w)?ML{_f(p~xEX5f&EgUrs`Coz5IDE|m>Ez;_f?}UyGh(08;O%u z;NS)-`dv3P`T1So-(HZtahcA)6Hqcn9K9x5rBB0SP& zb59uqZ{~-y#Q_kFA%e-6RQR*`k)6k{w)H1Yh)dXPJFzgzmgB7-{jWvla6;Ohhx&{` z=*Wsy!AfV8V*J@YRXgyd+y?U1tO(0~0pXC=HVqokT3QijB!7SMGwhrcTJdCR6w+)s zOVl>ScKxhLshjvQ(YF9d-0X|K*US=00=m8}{HB*JIk+-BH98M&kB_o(vV0uBdSK0p zDmgPoya2KcJO5@}x=LD$AoWwpSpxoL)0x_ECi$CYb$5~f3~~CAh#m$hJPb3mge6SSR%MBpRvcPKL)y~&U zM}7~Sf(Eq5AO++LSA*YxzhN9mU)VkS@i8vKeGJ$bhWRE{s|2S2$GNc{bsJz7dI{v3 zPLPIWrQH!-3b$n!E@?8!v(Og#`7nCAYt7fU8Sm2vpk#qu!yj{nJ3o2>4fGfW;QRz4 zt#qphRp_Oz0wb&NI5zCwK~0<8%NCq{e2I@*-im{q_koE5`1zYZS^2YZAbD}L{3XCS zM4`F}uNDz^&$AO%wb_|0W94M{8V|&~NU!`g>Nho)W2P5*G@lR#+KfX>HWKSs z8L6rQrpTeceywUGZ93RfC9bqkiPD z+sXKy*4j>__XjrNllB9J8aUlk#bUK}a+2J09_l&e(4^5x=YIIF)ObWee~0u}m0J*r}f18cYJ3kF{B$|L}JDZ~d)pF8~>Z14)((zC>)(iq1#cUWLD1|k};ve2~0 zEP;zv_L$*KGB2j&PcYEoNtNSCaZ>R-$~Lm^}(vtQscH_ z2`20gD#OtLY~7sfz+0wMta9`8*^@Haybmsn2Tqz-1bk{onSd!(nzt^ly~zPzoU85C z>sbG#oVjv5`JtCUm52!FU;-jSnb$->CV8U#=l1})CKO3DbGALfWwF$-B%qmyuU_r3 ztM^67j(icQkD(j>X2ao0uKo8v#KZk}Wi+R+*}_hAJjbS*FZVp2^8A3_-+8U-3KWE3 zx1vd8>L+@m73zFYtVVlLnD7`^x&jjEU82v#km;om5_`d+EBjHJKm4Fc>G$5#p(r>_ ze;c#NC*oLF=PclbqG!|kdKf;bK}krWCBCaq#iNQ2X-XkG{1xziItv zUVSn{JB0Ax^nFJY-$)%iXX`xS`bd399=P8T<3nKfohJ^c*IZ#7AMHpue`E7vUy+Mu zF&1g%0^|cw7B{flaRa1grq2QKI11yPvf_Iq%Yo0KSYsa62UYl3uek>&U&)*9Vup~y z{EJRR?M~5oF=xx9{o zm44>cTCoC{b1E3TL=E3M#^{v3ynDg=tCM7f2^%@t6^ekUrJ?yJTSNG0g2`4mwO7Pu zaMza`6`Y>TVfs2bS5#Bd&-HBLnr6&2N3|0MNhx-tN?KdIl$j^Hwu2-({A4oAVWXJG z1*a!*H?On>3ohlPLbF|*x}R`15|t2Qd3^isG9Qj$l3wZJGCIgYjmH1WKGXeBqF zuX8OeXlmwP>kJ^HYa?{jspH=S|Dm8Px=p$nGxOfUYd{V~SjK&jfK=V&uDZ{#eGPlK z!D&^gCp~ahJ#+CDs2-L@@2mR0=`kW&CGw_wOWJ2WQt2Z8rJwg@rtkIZTR$#7ZeJR3 z|8CH+Ky-TPpiktcbx>SMKs-^M^Oq*w?3A1a2qkSw>l9o$?33+qkJ>OlIN{a8gbmMq zG!%{OWFP&7dgR#0w|*xFfo4+;lp=G5`+7!VAKe<#_dH?oQU# zjfh)AED0|RZ`x1gyq^C;Ieb(3DF!>x#XzP`aGzB&obDE++QP0|HytG_OGc+*61UFt zY5jpyy7i+>{mDyN9~kBBan!A!eA0RBm0-5Bq@o#VsMk?RXk-(FJYxJ1i95F2;)Hh8 zaKrXCPAyPz#znr^GwB>2@v+61z|F}{F2U6xYAMj#?3+*9I!I8oAuC%vI+paa^byqrCh?3f?2Lfs8W}*L^ zOLou6)1RhVV!Wv&S-zs$d{jrG+;Pv(eV&$#?akg5Rt=R;t<)1T=P2QzUt_RinKP}MUr^hc3Th*4+Pq3lBknN_vz z_IKU6QMtr3n(x?|B8AyiXyhi~1$$o81bHE00ljVsZxr(WS$vh z$n(J6q_m|nyZhEBh_BD2HJ(P~J5gvU<^=ov?GLoJ=9MBZEIRI!aG2|sn0-I8_3DI# zXda68A4k4A>*g*t6cKjxO}Dy$$Up6HuvWEDQJ+duqJAxcBrV2970czD$#|QfV@qg6pxR3u%zRp3C*fOwCK4^)*&z(|!(X`NMyu;s3@T2-EsC*@pR4 zs*he&t5+8K)!+Q8QyfU$5XCRpCBEHE34-Pu75g;<|BZTK?V^z=TvREKXQ9Id1Dzu6 zu)q+XzAA~wIAEG^ZTg3!9;u&|1Z|~Lp4w&AXMswxhHGr1mwEQN&x#xcKOjJ}Bod-~ zX^}f-lBoNOXg7}B4*!h&v(uww^Vv{Y-gAs**+DvQ&(#;C5?*fN7kA4u13Bqe3a5u2 zq`co#Qi}2-US8FTv?sktWQj}fzbI7n7^FmUB*E` z+$?DTN_$Of$M?(EF5eo=yL^SGZah?!I^RexZ`nqQm54+wo>YMldOGo6yGDD~z? z0fcCFSK_^aomM5yN2WUk)6e3WQ1DPH-nS&|X~CM412zG!3V*Say-9@&kKEUPy^3pw z6vlKgf9i5qj8ONhysM1eZ0(+EBkwR=t+mGTQ$QzrO9cD` zD)SUkkFyBPNj@PQV|Ya%9B;?Jjv+4pW?lQMu{~)l2U*JRpi=c#$=4kwxTArPzzNea z*^>0L3Y$uyVX8v_5Z-IZx|k_82>dLP3c0`dmc?{>*3)aByd_nY%umIOJ_%LIEqO5d z?h4&ergCsbO6HK*gn}=S8*4EtBr36o;US=uYI%JK&pX!UD+$^lR)F9uw9Sv7OoD=MPA)?TWAq*V0HTb6A>8^($E|5D7k6mS}K=KCO8L{;(l<$zTlf-(m zM8Wy!Pr%AzO4Qsq2Lg0!37o%PGw6+R6)Ao>VA6IYRy+w9g1YB>VN%#~e4x=FKV9ay zhKEJ{&7S}|kn}cY{X>#U(ul&143PtV4aIG^-bVzI-Y+z=)qXXhA<2=zouZ+ z?RdOhSL^zTt#Zy=1aCkZhIBc>lNU6{*dl|$V?*1~v9w;LgPj2%*1bC?g4~mMK#O;Q zX}3QdT4KaJHX4~D3%wwE*|V@KihV^SSa)gn=UakVuROlJ(U;xNH%$x!xt_#3h@p*8 zB5@-Uk_jAg6}*?;Kc6bLoAiq=2>>uHbX@Jq6qGzaB59G(;i_y*DWplL^0F2Z5B5nK zXnPnd1n}?9x+LQPr8rBumeF0(2@RI^$PG$;91*7_S<^(94AbXLk}r`;s4$b{F1Cj! zsC?-VeIsVPPnovO{a`@0)Vj+fHg>TW4?Pnj<&gFwWW!+(yPNJ{(|T{M$$YUnFbm1u z*Na|HJd7Y7aZcjW3~(}7m&{eAc-Ml@_(S?Ow|UGnA&8{t*bpOfFq6|wq}9B%>BNSl z3@O7vTNaX=(Y%Z?00RB3SmaG#a>=3c~x+<8MwLVnqPNU9n%6? z4t>b}0I|`8*hKhPEpPjuxU5HC?1fA)jFy(BE|$zaJr<1WZBz}Tx+q!pE0Ci6nRyr$ z5}z0d>J1?LfJzDNa)}TcN>?EJH&r$kGoI;>4>$wFfa|8@;|dST%R<^ zeM|bp`{ZvGFx{lNY|eDn`e3xGi>U_bmR2qs80p%micWygdmQ7kD-?qBsLDkMwF6x68TBDOb{Tk#FM&W2)Ms43n#o&T0*mLD(w20NGSQAzf4# zwcQtRb02?;4SD}UREKI`kM+TYk+uEgHe$y`gB?#yj-xxD)Sx< zB#Bi+=WQPfh>#kT;g8BnS{5aoh^*~Tk9aqo)JH!qHbNf&zxl-Rg=md;99Aix9(+p@ zG5ozgS+D-pX*oA>hKQz7R{}}sheS!1N3I7a6AA16xrQe7gz!)=davW)vh5#<7f^;F z8Z^nYB7Z$vBOs=&Po0#@z!Bv`^&8w<^wYJ|T^c)dVLOKTk~{kToK)YwJXxXvR?{~G zG@Rm0{)n50^+Cu$a*jEezbIZnf;Fbxwfnv7=cE|lTl*_tJ9;%p_afU zqq3~^I4*gvUG;7uy+ei~gb3k9+$1QG$0SO4vo3DZLK*1z*9nc3O_P1rM`0L){UmGN zxnmAR-kRHm$GxX`bT=)kjd)&Q&;4qDFr|R8f>`}l6L#uK(1I)(NI1NSXws(;=!XmA z;I>S=*1He4R{-Qd-I8G&P-@|Sm4zfvJ5>b_Cxe>jhNMb^Dw8r6f6gN=%TNYaVY|LY zYR|nVIeb$06N?NPbTNG-36U{Tt?1q*UVvo}pjCe;v+_T@MsnIARFn%8>?6;7fxna%6a$>F1LbHx!;4+QM=LqGhmA&EO`AQ*d6UoanO_eVp5+gM{ScuC5Lgi` z41amPXX3(vYlhl@I*F0-5jvF)ETfB7w|)6A`88-2B{c5eU_t=B2PfbyEzf>BgNoDd zVP!Ew%wg%V=_vgS6l@JnVmR^s@?J(*KwHc`J`Z7{zVX-BMDIIv$<-ZGe~ad*7gD(= z0%J9-swtB151a5&U-lZ}JR?W)4RNA-KmVfz@yQF-I;+cSIzP^km%>dlMpVGDf(kee zuLOJ?HG5z5$YnZ01J5eUAu{SQ{e&wszW!ovy4uKCRSeLU_ZH|U2|LUsYfyl;$!8+q zdz=OK5*?KGid&d?(w7?1*%D&W&37(~x?eub_38R+=B`OQD?Ke0#-iodEOZCeZOp!t zk~!gzlom0M;R=7MJ=~=6YW-V64WrO#MLKVyqqA-@0qA}s?>2(}yMfBe&dM=XqFyl%7r)(m8{~&q7#4aO9Zkhp1|ZD+ z8CxM~h??Lt-#1XUQe#lFA)vm&sxPK-7&B<^;j;DVK~64AO~b2c5;toyJj&cUt3Ys?CM2>6Si=SSz&mrcJ&8 z3;2L8X{zdUt@ZjdN)T6#p2DTRu9^Sn<}@isx+D)_ZO}sCqXqBE3NZ!Cn~nxoIvOqp z5mE9#BMlqTmjb!39xZts4U7S^ViU=S`pdNj)R%pp|Hxj64C~Ef8IY4ZJ|v-YlgIcn zpAnZkiln4KtzR+)LPQ7y57KRP+T#&$9XUhCV=u8JgGHsczT@Db?|~dLk5n(=jPiB} zlArFfv8e>DFa&Ed^-@D91;#Xxpt1WbDAjeCM+*K>!|%E)Y$Z?m|PPb$PWIHg?^N9YGT0De}So7$f&2zNydj_&NPk!jUT=zPdx3dVl zecgIOTGELR3*9a(&OYP)JSzLw;V&EfbXkq1WSYcRe3H~>54$weZ$td|V`J_;-sDgU zY`Qfx5^BZhTR!;L1Pwy^J4kfg=IoqBovQqK$b?0?T;#W*pZxeFwN6F&)pymcpLQtjS z-JGS0N*`!LFcB3ecUoRKL!Kx*Vdjf3bZALWSylP`innj_T`c-ri(l!e#&22lu_NSP zfFB#t%6`WJ29TQW^IQL|C1P)opfj>X)2J^l=I8j)om>LljD>blfligKa=c z9CGb~Q6c~A&eM}!agWp^8n0^$WE|Kvjwe71_*BR=fPzcu=bOuuqom`v{q}!F61=-R z1`2 zlqUHxbIBU4t(wiWsL*pv_t_p0Zx&j{?l4UV49Y+rTE_dQUtEI}bK(KASm_(rtGj6EHkbj? zqopWn)RXy^N)xn>S{G;-7Cl8r4iLUv!RlpIjLR*2R(+(V(2?#PHMdF|B;Em2G2Xza z+gYQYEY(iSH>bOQtM#Uoy@)#*Ps_-7DV-w6R{t*RH7g~Ovgl|`)#0r! zTuRNzW_qmf&2>8sbSj_p{7A>8CCot_lr!;TdwWtQo1<-ymQs0)2Bzq$Z|@$a$)Q`g zjlZUde;^Gw_vJld93np~bnIj94*A9Y0s)`2ha#cMdC#n8+gOMaT6uOPIjB4|#r^yE z+^adoPTgJuFf|jJQP>FBKg9Q zT=|mAs_K(8tUui}=Iey3nG%XyVG23eN3p-}VIu!5TNCEm!y6V$DtwRK7Bvx zRgVqslv3<1|cc5^VB=6W=FQun@R=H*H_z38UI2i!bIR6^|&WGji#aG~fy5G;fwe z&OSfVKS%5pmdBW+-Kd@aNT@MRpx}2F!)g?#tR+MKjh?WYL$ z_f12W{EKBJO}8DL^l|oM-vqxzLtMFt3eA+nwyi5QcoLh{mHnrhnN5`MZ6$4tzx_2; zOfuigR#n!M$Hv5!>xXR?WUmc;>z02$OH?{7Q%y(Ox?vLf8T*hh(V9O4GZT=3j^;>K z`-{yCrK$4;p!Xa5=}~o0q+s)^9G$Un0C3X`@^{rs(DGxX(YG8)a5fiJrnwu#XO!PahPUK0KwplVg*`0+yo0JL92<$3aP${{G`) zaUScyMjZoBxxgzi0eH^{zt#6lAIClwj^C&wp_h+(qwZ_kpRZN;W8hx1_b9I#E0{90TgC^9Wt{#))U-`iEr+gX%H%W@`!anr&wcHI$?Nq0`N&yV2t-^GQ5XErXieE;6aRmncSJz8z6KS!0B4NFO5NY~4wa#cyC1 zo8o&yp|9{4=! zbc}I#4YAH)Yu=K3gCtv=r4~(mR;u}UQukG6;6t#rAM^B%)GBTAjrMu=(}l zo~r@@d=^Yh_3Beey!^&VaUzRl9K~LbH>T{Km(KRjv3o7{<%t$VT_8fD`5+OFFE2gP z0o#j=dVa|#nus9tSV2o!;*GP#Kv6oo)@RzE{VwQd9&+@@<03=z znhdXiN!j$#nD{5Y#H0hkG}KZ< zzH4)P3hIk-hkjHu>DXQJAO4xPvPj_ctE(@MK1b6ZgjB!WHnC@ZxoiCLr#viKPHpeZ zJ@t_Zp~1S_+7-4R2hvNGxBdWX&Ej#ewZ8pV<2^DBQ|m7c%RKFBY7&!XwwlzlzT7KQ zWYkF+yy6e_7`w^~>d9nkgs;z8P*pQ2#tNRMjMD3PBMmR0(l9v>4XBXrVcqhPNY@qM z7WzoP`A*c;Posdd>zkYHF0V_rR6!vvRxcEd$EpUX`JZXnTFtV9+eJgiB*c~To<63t z+jlF%4)69c@4-H*beG$G@q54<71cXNnwZlT(lH$;;~${xgQ!pSjPtwviUH7M*rFQW zO|Yqyn;J0vb@XHXP>E&xEpdy@zJ2IqeIDhS#bnI1^8DQs3b+Z}sRomB>yU9VwuXhy*z(zSBz;)_PsV)qB#Yx4{K5Nx4H;4u>GCBP=<)qI<-b5)@5{!3Q!^ttXm)&t;-(vjd#2s?ipB&`FSsE={`PEtMC$4t=)0~I%l z?9*-9$>#$IVhnUD1uOtuY@?pY%1iXy@_jCjX((#|z%kF0ADAR}{=T1EukJ7>k96Ix zb6=Q~-=1Z=?3CfP@+j1Px=u1r*vp)+#voEW_F(ub>ZNE^;hl85x&e~=0G$JJFz3QB znsPs4f>o^s`$?zY5wwwgfW|k;zhNTu-pCF_Ww0B_2&D|gO_XgdFshYg`R#}NEGJ${ z);Ha+f481@<)cOwprD;u$97kHxJfUyNujZRaCl%_ z-v8K55wgLtG))%bplbtScSs)4hsYvGn3WtRtQ8W3`8{cdER92UmZdIG?06=D?y%nt z=D?$^u;?*HpUeCr&GX$p`hjbmAWql>*pRgo)!Mk_tNAb25h$~OxNxi6Mj}(jI8uMq zeWo$&Ls26Fqg=70>Jx$JR!BI9t|qmBjoFp8uMtzim?>-_z+X|k;I42qE14*&Yt+Xc z`YZ4oPP=89*BFvpK3Vcz@#WXro>yIcAc{jn;NA#;%!Pcb1pj~`Hc4yLvU)eM;c!)V zZEGdg7GjzhK>wy%`OqAwK3u5dmMJXy)p z<~9C3+U)I`?RyeH*4=dd&drS`Hu}>;{lQ7q18d-hR=N}iMG@Bf9AjnhW~jSI!rfI@ zR+Yt%d+-dyWlTpHRI5*P(%g2Vsn@*LzT+s36#ym(m9qIC-r~gK0>cMEWBTRid|CGTmcCA^6w5)0dCP|WpoDuc+y%nb8pNf8 z9Y3z+e%WK)GNS>`tIB(W?greJe{K~UZ!Q{v3dvepM7MfV&9i)gZ8l^SMwrV1Z-`oyRUS8>g#GB-DUq8%`eK}nDI`ZJh z1281K2*`|X`^>C{qUP2W;`I2pI_S8+%RbVJT}eU0$AZ(n!_%CU-!F(-LU_4VcsUQ| zwmod3gz0|wZI1&maEW%l?C!?k7?lhPQkd#XGbW!BWW7$13?p2VO9rLnt~5E4m^&^- z%FdsY2d@c9It)E%{4g#s(h_ozsm>whQ%@bVTUW5<19zn8zpjV+aO}v08&Lu?Cakk8a(KBD@(I-e=^ z*K=rd=TLPV*cB7_^dJiU23?4%01eL6TV;`;V;ZU?15}_CD-g6wRGuz@!JU0kQl~sp z)NMzQ#x;^f{kNRrCpKz8{}Wd_!3Zy2+KY;gK**U~4ZkMN*(iSM?ipDl6-Yjx@4w{( zYJp8~UpckT9r^TS(NWy=QaJPr z$%vgEJ)egX?a_*JO`s2Xw{?T{~rUdA_fAq(y(2j24< z46xRW;@QUzQZ#~kVVbe%3zZMj!A|&#n%O`&pO#3xe%h8OI<$0)?RreF6_J;)wcq)^ zJVvx^$$Si^=V_*4$lfor9%046z7&Egug>pLuE~t!e9)yQyoUh85SEs9qchodU8hO( zFt?$!|Ncg;&pfpq{GSoF!7&#$SE--$LOJy+1@&Tb=XV0g!fqU|GBWPh zq7xODjP9G3A>vOf-Ca7pJ>@(O6Kn2@D;zK66tsEKG;;BwrCRrPRa`=)@MnhLJ#uGm z__p2ZC-ft#O57gOl0RX}0X@0q+umLM#1!Rf$A5CB)pMX2pBMPj4ZWy6AbE8 zuU)^C&U!&2H#?M3yxo`}BEQi9IOKLVhWq7?Ol@to)8ms}!`rPQqs)55Rm$Sm{G~fD zA#hsWl3dzL{n##gZiy;rYm-l3N=a6Cr5}56#rmvoWfXj4+8A**lERLhC;2sJ4ehP+-;QpP(PE~b|s{Z`s-dRdJ_Y+fF=-ZtMK zEVo(BbXl97P|FQj%>T-HbRioZOy?~GY~%4T+`hKpP!^@=UbXMmhnZ4X`8!a0k_$>PgPFG^j_Zs(WsR#Z5y^aP>AjEAQ?{gJ(2%K!t4nA^R&e zyxDUL>g{a`?n5-SrHVe`HIc zw#iS?`^)2!f|6vO|5KP+Vl{MouyymI!}o(>{S0D9c!Dg0AQz07Kwc1Z|UBTU#ov$O#U-j<+8&H+yGX zN&6RUczd88b14j9SpS*(eFGVvVP2m8puLA8sK|c$zDtkMMJQLs%8_^ILSG|AkclnI z_Rt#nAh0e779R`m1rHdmS9?Zo*DooPT|P4cvV^F-!KuWw_~_|xKT=Nit}n&Gd6yq; zLv6x%Yp%1%dG&D&G#diA%&_Kv4V7%Lliz$?Rk1%@5(q+{T@#unU3~JU2f;MroY28; zGX0QAuO1Rw)XtF91>j3r^fQnwn7%oUwaCX?#jlJXwIm9eO}tn@P4STHQH2VVLiAXg zK1v58kg5U`?A>P>q!&%OdH3&uSsUe?mzMtNzMdxgzDwdt=PsT$0JRD~c5f&`{m8Jd zCouZE^NnU`bDshQ!*KAQ5WouQY2KHBXPrPMLw8LV^cg{jXKyJQbVA)%gGWxLhgart z==24KL)o8^DWZN8ypxYS)`t&@U$$sR-!j|oENRaVl^1|MB1=_({WLMRJTs%r`?UqU z@dfDF_OA|Igzy10P|8SEQ2$hrRIA)N;Rsx21Ozz0+Pck+j!2m44+Q9V;~_v1(yg|x zoX?dNC^X@9+KXtN@Ayrn)rP@MV5A~IxWu|F8ShCrM`18md| zE({>)f!F~%Os$nVEcSSxuyr<~-a{I{RC5$`tctfYL7+-Z+v zHWcF{OnNT2Sk&@l=I3h?6Pv7z$sCRB5A_!`P=~bcJrZb#;t514ICPAhQ~9Gu+Y(f5 z7>bWnR}oa_@jp@)cE-JlrXwRg)|zI?hxw5A&oE=VI!;Q5s;1WE@?PHhWLiHHLqHCc zq?4Eh&qgXsO}EvEzyc69BOor!^pA6W6v?UgZ1t(ut?pBp?U09rJzXJ&XGge`=X{9? zWf=erye#u#v?6g@{JC_RiDKyX;!g`C)58J*NAaCMPg92Q`L2&Xc&HcAI8gNp9{oll zQnxq{wzx+T48@4h{Cz1QUVP+qV%EWWeoY<{gN~#aCBK3^t-`xhw=F3r9?UrCJuYZI z@VE);njb(~R07)nt;mVr5s%cI?QB9^cKG->ouZ2t{B8kOQc=5cy+)m^r-0AJU*duW zyMDS+j{rL%-t3TM>U!$x#VE__rbi9VATMAz>_2)cQs;%NEaRVD$!t>)E zjan56f!Eh++m`~vqx8vL<{1fA64ic@laL^zHWrCJ73*b;jN8q!abXR#4904GP~mB3 zgt}(<&80<9DgS7u^K)sS7`mVs&QCRxmJfw3xnSK9Nt38)TUiu42^PoKdYFY178W*5 zR{YEWPK%O;r^i$2vo~8)GH3{)Dt@fx@S6!`>^WZmOUC<`EgCh*NHH&;pcJ*LS63da1uloPs}$?|EH5>gi^}F~R@u zpnQJhE#XCZeQUd4zZoj~FNefWJMPi%{$=aRQl)ez)h;m$MO9fbk8C)vi#T1%;pCJ? z8Dd;TgNZtS=uHZKga*BU#t*Fo2k-M2DrIv9jXqgV!e1f*w7S@MJ;gajGW$=Ymu3eHDq* zl^#GHo&`4sou>!L+NeP0DFl3jpynnP&7WV%6&I(6Qoh*(A`-$V1?;aTCh?Cbs7Copv)GreBH z^6yZ-fTF@^x~WR>(Woa|S9)M{M}7WEk@bkM3yk`wLn}2Zab*Gd=N#7x*nkiu=%O6C zESM4FwXyGiHLodHi4h#^E)6h_tMfscXAr(9 zkj`{UoB~Xq4(*Sex{bzX3+ahRDj)&%uH^;E?cGIc^hJ(`ZT%%4OVb2dZ4&2S(ohrp zcwj!XTg92VRzcIVk-KA_4n1(rVLocw%XKJV*Dk6X_&WOe$-Q|1XxFmQx_j$TPYjSQ z778LahdBe#p!~h6tCuxeA9K>ml%D&WgVwqQ%eopWLhzfkeQ?6R&V6S$-CwQIZ^3pC z1$w~zW8Gr1u^7`t*yisA=l85D#@{3tOhd8`9(N8eoJ;>P^l&plcT#`?gZs5D-e#H@ z&MD6G{UNDF>vqG2oM5*reOI`_G_| zNBH&Avwul`@exE`_6J+$&=RKe+l!{^nO7*iq1qR}Yoe?s12GRvg>{<($T?UmU48zG zPS+VAq4D#GnP)#0S@p}+V>9tJRVlR|ERj2aOaO2jhsZ77F@k`gGYpyy>(j#mPT{>I zq30Q=%bQQilC(WfzXpk%pK-#=umR~lEhdW_7>M$!bNOQXwl&f=K`9?}cQqS*7-sLhv=FG&OBo=jRsIxEiqNw;f54 z1KIv=1g{7_ijJodpKrQc@QE}=QPA5V z3y?A`aP=v<{Tgx3TpBOX;$B`4tUjC-KV^Z`DEw>d7ijCRnIo%~MC~QNhdz)12Vi>v zSem^XJU6aT)3$*knmW9##_-?ipaUP?V2vx-eCl<|Y={t$%h5!)7^wF6Ixr*N5VL#* za(#&H8qT%~OZX?2> zcqEdK-8e>iU9H;_MbjbbRT8cScr#t(EymfW@@Irb6AIIg8oNp9Rq8t}9><%CWigsp zay2&dLwitR3hIM)lB2FpkfuFovtt^|;>ErCx9gG1)|~35P%S1&`>H%D8891ULZ#&J z>)8kt^bXAlrpKZzPuSN_p{;3pvt2w2LciXy3>Cb8>-`5+Kn<+k2X4&Pg~o0*h$h29 zK4wO@>O~s@}n~-1y|3VcA>j^3{12KZ*98foIy>#iS&vf4+(g zPKfrFMy&RUNvmXrG6l-^;DN-)2Lq=GDw0NEI%DF= z>f|}2b}bAf6lrw9?9p2PK!H4{_a|Hg=gK?(eQL@``-^=#pIHYIA9+-iRtz`WsHvxwl}i&Z6HEOaBv46zN#$j^Bs+( z74!iU7;qxudGx}T;*o1)pu{OaRE*-sTVdcRrn?6BsL$;!=7a`qV~YuM{e1E3EiIsz z3;{e{S;;K9I`IC+#x%W&^i0p;YBLNeEmUpPVi3r#41eJg4&*v_ezweOFw&2zq(ZK9 z?c;-Fuj*oB5+P^Kxy9e_ud_i1uLDmDrUw!8KllQva1lx}mCCy_<=}UZy-#b=L)}&* z(!5TG2E4SPYnJ&s4aQ0INlfNCEV1_kR3#`JsB3R*-DYI;_vc|VG+Fg!iPd8=ZHvDI zl&}-m{;ilSIGlL}#ll_KOPQ;hms`qRil4iKaFH6!lWon~qVh!W0k<$gHl3%lhCA4N zDOyDySN>?AnTC}Uy28#rCk=c~Me%2^PUPi_2Ku>78okuUf3(TRKGfbl`ezi^bZ7ys z;sJ|#<(2``?7IR;Y~PUiFd;f-|1yEP|pe8ntMe10;RaXwPF zYikD(<1Y7hf%84|g3)$5;vqCJ9vgv={{HaFl)@?CO^tjcRjj7}VDpEl$8v_&RH0_2 zUhQarGK^fP|J`CtGg+(95JjX1BM_3d55n1)i!2^y%%XZI_C+4!53XzYLX$$XQ#&`H>sH5YGCbsV?N(Lts)3b9^Atf(m{uq}$F=SR`#Cmh8Z; z?&{8bx6H{-c@5UmBDhlF!xP7{q;sc+yn)F#2+WKgH()}bZO@77RhcXi_q-`0vG~Qh zAv3Qc^bBBB{}&<<`gsA&?6vr`H8j^etSOx3d38U3sVbaFW6(wW;eC4NqW;+;N+OZv ziM_lM#+iz7k?SK{Kj#owk~_;6U*H!Xp=%4C1LnxPc(=M~lD|5~$~I&wCq)7ps#Ij! zPCa%B|J>3NUP1AwHt#GCr9Z8I?}Ngf8hG3NdJ2+ewo&*#=v;FEW-k9c-saq7AZZIR zqvr`aMyC}FZX`T;QcHvO_TJel5|L%8XTAr)dmT96SNE#XceX9cuIQ!z_7=Z&Mdtim zfQiOF_U{?G!-iU1q{0P05P^p-t(&o~Tzar2Otrm)8S&3INeHSUL{hfsVtcklwTMwJ zuNbimv_gtQmWo5BW$EdW5YIIH4!WBDk@GO~zrFPX1rYDiprf5Vv7uBlAVl^XQ*zox zMvbqTPH%S?9G;ZkYWDJZQ}FMdkgp`f#j(!!LR|w7o;&tjP!l-cE@F7Y&}Oy)gefAW%oMCQik`l`5hGC( zDY9Cn&gUwQ_0PIMhhkFFzrPzQjDb}49q}>e*!;r-=VjqjQk1;``ktiIM6Umq-45b9 zX6w<-sk6uAX1xWlYzYSe;dd|Cm*(x`BLAL8Ru+~RZ(#Wj-`NtgUo>+#;bW{#20Xac z9w<`yGS@GkKPsft0ArFAw7VFdtuQ6UO_&IUIN@e@WyHV3)gRHx?u@>qz#w1M`zt#CoH-pP~l8u2i>O{P)`-f{3Mg<@o9uxwB0) zpC>)2+GkDql0|f7|8X`9ecj zqf(5BNf1{0@7m{oV~2>!#s#PIpS%9wKOKhRsxw=? PolylinesNumpy: raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") V = np.asarray(points, dtype=np.float64) return straight_skeleton_2.create_interior_straight_skeleton(V) + + +def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNumpy: + """Compute the skeleton of a polygon with holes. + + Parameters + ---------- + points : list of point coordinates or :class:`compas.geometry.Polygon` + The points of the polygon. + holes : list of list of point coordinates or list of :class:`compas.geometry.Polygon` + The holes of the polygon. + + Returns + ------- + :attr:`compas_cgal.types.PolylinesNumpy` + The skeleton of the polygon. + + Raises + ------ + ValueError + If the normal of the polygon is not [0, 0, 1]. + If the normal of a hole is not [0, 0, -1]. + """ + points = list(points) + if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): + raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + H = [] + for hole in holes: + points = list(hole) + if not TOL.is_allclose(normal_polygon(points, True), [0, 0, -1]): + raise ValueError("Please pass a hole with a normal vector of [0, 0, -1].") + hole = np.asarray(points, dtype=np.float64) + H.append(hole) + + V = np.asarray(points, dtype=np.float64) + return straight_skeleton_2.create_interior_straight_skeleton_with_holes(V, H) diff --git a/src/straight_skeleton_2.cpp b/src/straight_skeleton_2.cpp index 51945462..02f16972 100644 --- a/src/straight_skeleton_2.cpp +++ b/src/straight_skeleton_2.cpp @@ -2,10 +2,12 @@ #include "straight_skeleton_2.h" #include #include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; +typedef CGAL::Polygon_with_holes_2 Polygon_with_holes; typedef CGAL::Straight_skeleton_2 Ss; typedef boost::shared_ptr SsPtr; typedef CGAL::Straight_skeleton_2::Halfedge_const_handle Halfedge_const_handle; @@ -39,6 +41,50 @@ compas::Edges pmp_create_interior_straight_skeleton( return edgelist; }; +compas::Edges pmp_create_interior_straight_skeleton_with_holes( + Eigen::Ref &V, + std::vector> &holes) +{ + Polygon_2 outer; + for (int i = 0; i < V.rows(); i++) + { + outer.push_back(Point(V(i, 0), V(i, 1))); + } + Polygon_with_holes poly(outer); + + + for (auto hit : holes) + { + compas::RowMatrixXd H = hit; + Polygon_2 hole; + for (int i = 0; i < H.rows(); i++) + { + hole.push_back(Point(H(i, 0), H(i, 1))); + } + poly.add_hole(hole); + + } + + SsPtr iss = CGAL::create_interior_straight_skeleton_2(poly); + compas::Edges edgelist; + for(auto hit = iss->halfedges_begin(); hit != iss->halfedges_end(); ++hit){ + const Halfedge_const_handle h = hit; + if(!h->is_bisector()){ + continue; + } + const Vertex_const_handle& v1 = h->vertex(); + const Vertex_const_handle& v2 = h->opposite()->vertex(); + if(&*v1 < &*v2){ + std::vector s_vec = {v1->point().x(), v1->point().y(), 0}; + std::vector t_vec = {v2->point().x(), v2->point().y(), 0}; + compas::Edge edge = std::make_tuple(s_vec, t_vec); + edgelist.push_back(edge); + } + + } + return edgelist; + +} // =========================================================================== // PyBind11 @@ -52,4 +98,10 @@ void init_straight_skeleton_2(pybind11::module &m) "create_interior_straight_skeleton", &pmp_create_interior_straight_skeleton, pybind11::arg("V").noconvert()); + + submodule.def( + "create_interior_straight_skeleton_with_holes", + &pmp_create_interior_straight_skeleton_with_holes, + pybind11::arg("V").noconvert(), + pybind11::arg("holes").noconvert()); }; diff --git a/src/straight_skeleton_2.h b/src/straight_skeleton_2.h index d84b3c3a..baad3171 100644 --- a/src/straight_skeleton_2.h +++ b/src/straight_skeleton_2.h @@ -7,4 +7,9 @@ compas::Edges pmp_create_interior_straight_skeleton( Eigen::Ref &V); + +compas::Edges pmp_create_interior_straight_skeleton_with_holes( + Eigen::Ref &V, + std::vector> &holes); + #endif /* COMPAS_STRAIGHT_SKELETON_2_H */ diff --git a/tests/test_straight_skeleton_2.py b/tests/test_straight_skeleton_2.py index 47e4fad3..80d419d4 100644 --- a/tests/test_straight_skeleton_2.py +++ b/tests/test_straight_skeleton_2.py @@ -1,6 +1,8 @@ -from compas_cgal.straight_skeleton_2 import create_interior_straight_skeleton from compas.tolerance import TOL +from compas_cgal.straight_skeleton_2 import create_interior_straight_skeleton +from compas_cgal.straight_skeleton_2 import create_interior_straight_skeleton_with_holes + def test_straight_polygon(): points = [ @@ -17,6 +19,22 @@ def test_straight_polygon(): assert len(lines) == 8 +def test_straight_skeleton_with_holes(): + points = [ + (-1, -1, 0), + (0, -12, 0), + (1, -1, 0), + (12, 0, 0), + (1, 1, 0), + (0, 12, 0), + (-1, 1, 0), + (-12, 0, 0), + ] + hole = [(-1, 0, 0), (0, 1, 0), (1, 0, 0), (0, -1, 0)] + lines = create_interior_straight_skeleton_with_holes(points, [hole]) + assert len(lines) == 20 + + def test_straight_polygon_2_compare(): points = [ (-1.91, 3.59, 0.0), From 691a3d0e20c8603510141b15b38b376e4e5603f9 Mon Sep 17 00:00:00 2001 From: Romana Rust <117177043+romanavyzn@users.noreply.github.com> Date: Tue, 14 May 2024 09:56:08 +0200 Subject: [PATCH 2/3] Update straight_skeleton_2.py --- src/compas_cgal/straight_skeleton_2.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index e97b09a6..3703d09d 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -56,6 +56,7 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump points = list(points) if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + V = np.asarray(points, dtype=np.float64) H = [] for hole in holes: points = list(hole) @@ -63,6 +64,4 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump raise ValueError("Please pass a hole with a normal vector of [0, 0, -1].") hole = np.asarray(points, dtype=np.float64) H.append(hole) - - V = np.asarray(points, dtype=np.float64) return straight_skeleton_2.create_interior_straight_skeleton_with_holes(V, H) From 1eb09a4ad214daa1507f831fcd70b96c756865c6 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Tue, 14 May 2024 11:07:01 +0200 Subject: [PATCH 3/3] Update straight_skeleton_2.py --- src/compas_cgal/straight_skeleton_2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index 3703d09d..38b9eff5 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -57,6 +57,7 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") V = np.asarray(points, dtype=np.float64) + H = [] for hole in holes: points = list(hole)