From 071f34e0c31ad1bb369472a90ff4ba7e572f71e7 Mon Sep 17 00:00:00 2001 From: VALLONGOL Date: Thu, 8 May 2025 10:47:04 +0200 Subject: [PATCH] add version, change icon file name --- projectinitializer.ico | Bin 0 -> 70587 bytes projectinitializer.spec | 36 +++++++++ projectinitializer/_version.py | 90 +++++++++++++++++++++ projectinitializer/config/settings.py | 52 +++++------- projectinitializer/core/project_creator.py | 53 ++++++------ projectinitializer/gui/app_window.py | 21 ++++- 6 files changed, 191 insertions(+), 61 deletions(-) create mode 100644 projectinitializer.ico create mode 100644 projectinitializer.spec create mode 100644 projectinitializer/_version.py diff --git a/projectinitializer.ico b/projectinitializer.ico new file mode 100644 index 0000000000000000000000000000000000000000..b543f4c7f1a2fdfffce74f39d344205bb7ae799d GIT binary patch literal 70587 zcmafaV{m4{*7XxVu{B91*2K1LPi)(^CVFCfVkZ-u6Wg|J^P79`->>TJAE$fQu2!Ae z-FvNd4gdfKfCiwT0R9ysz&->3VD_ID(f{mKH~>Hz5&&Ri{GaWB4gioL0|0`8|FgaD z0DvSC03aaXe>SfO0D#2*pZ0$W5x_CwU;jV=AVN`I0uk=pztI4QQj(&||LXtDhysNE z_awagG6Vo1Dx^e(R6VlfRBUCn)o}c#K7J?9F3j2>aT_q=H$drJb^5GGyNaacjTtqt zSh2IoXH(EZ`lrdtvH49tnHqq0Y(f+Ut4pOCON98u$hOUphoq61J zo?>baY&n|Zn#y#ZblyDTg(1Q*5ey@HX^Pr)-@e0T!3R{u0D1z5fD>=;5;sU!Dnl+^ z(AAC2Pe*V1{M~(wuFDwBI-6~(vN=+XtY(3)Fcn!eCzRQ z`%~UB9>1upbRSGMgB1dxg6iQ!6ffA35_>tQa9BR8dTf*??=6T()~2ETYf>^l5K24g z(p+4m@>8YkW-4>z@3^Kgy}QL~V{8N#0h&+7clasq|BXdntU({eM%P2U^ zGK3qS#p|~QYYQMADwSI;d6z!F@UE&(V(fyt|Pi8={2S2f>&@$Sv8c&G^3HFad_$ zYeoTP({+&v06`dTvF`!QBZXck-Y)}nTSx7BbFEWHd-osX162MbIol{hN*VUV0NSE@ zXMAoBD_*F8>oc^E!nvl$4Y1WQ&x?$8wWA0LAStV zw)ds`iLREjo?sc3U4WyZHiD!%ei)@-KQE-+7(}85B|<{C|6?S~Y6bHZ`RzEiI7( zh|(*{d4R-R_^4p<(jnJ+0e#J!4C&%!??l9@F~rq~ts7sWJ9H(99|8)h3@v5eC-Zck zW?Ynu1h2|m$1fL)=o2|ZXs^3C5c@9uJo=RVCghL-ah&jb_%?vFL7X?9B3uRKwxg}` zHl}Ttt`wI7B2~48agTeIU#JR1qzKCd^$wA8Y=lZ7A+V*k;nh25DOwH?4ssgs*yzKoKd zm#wF}E1e8JfzH4^yY{bidHka66NJ}D%34QT)6!serHQIFC>O38Cn~zbPWI?TsRz8uEZuHHnA>{VD|9BMzmPYLVV*Qxind~uNP?`0g zbivB6GclED=b*907Fhm<^wc?Na*fx+TH(E&xpb&d-K-$3JL&R0C7)KX^OGR}<%Gtl zc}+h`G64~F?|Ukk2eRPETKJ=nG-51~*BVe0-OA=2$=b?9(nJ_v&ePLiWIX+pc1+j( zu5w+XU^B4u*VQEdgOZH%k!~tFf}s=j{y_uO?<#6)sF5kj$+(ct zFXy`i-CfQCoBn4=S$a7)<;ygmBl##1@0hX~#nhn?5S3Ba+m2YiC9SnLU^m8Qn&~?~ z*Z^Rhj;*ED<<7={EE4AJ(jj~#BK};qoFmeMAOqF+Fws(xUDRlCiKRRxOw{Tr@KSo{ zvjpaV&~)`3+!an|x8AkpPaD#;hQ|cAt?~;EEhft~Q!LQk%4iRFP5J8Ede2XS>@Zk{%*U@Y6HhXX$=)4OQI)(3Hu-j%~FLQ5j$3ks~L~j-uHX z9l0%?3^$*7DU?7?e6)|{5gReJOnYkcDS<{K6teB@ivro~O7uk7lN}^>Ja>Z{r_#Oj#TJ;llF7B_Yvzw+b9KGQ&ga%-Z+dA~j_AK43x?dJ3ME9O z@DfzM>*+%71c{dq*|yI_V3pK0tMDBB@wQ4kKGRU05YcG@dA~4Bt7nYY8P0rwAZ2!o z@z|;^Te9*nA^~4qlXRLLjVGFpz1f^1$U3a#O*>=`UnhS-y>?Q}6uG&P;IS~O@N!y4 z5}Ua_`|mhO1`qmk@A}zN)S)@{^eK}x6Ag@Ge!rJ-@oz7|ajXQ5yh>TkFTA`z>+zYO zQ9F^5vV2>*?T_chvn@+h5LTKCac=FRPU0ct2)wVYk|3vFM`yCVMrKqAp2{FH;SlO&*?AuReeiJC! z4iqYod`hNK#~E5cPpYp0j-7nfUnbIZ6yfp;7FFN&ynlzS|-fwK;%VXm862qg>H*KgiPkd z2)+u*5;jpGoFE+dhbVL*>hElq8^n~%g5e5&^r;^l>n0&s0Vtr@Skz{-f%5GkNepj)m|-u<(F}v_Gs$ zd1w}3+uw?K@Gw4v1MC#Ed_u1c9U}DNvN%o@elX6vKI`W;Q|0=-1*a>sn1d+EC}0XX zBiL@P>i4kPy5&4M4tdtIc;7SN!qbUypR8~CrLbb_eVsOVV4^Fq6p&Ria6|@~rNU=~ zq?-wu5nP^R7~sInLvm8`vyi1u80t57P-<1_^4*SMuNf;s2Ju)Bcy@OP8u_=bCF@4PQXbtky**6DwVVM}eGx1q{kZ-vD? zS)hJP0#rOiIzlB91PPS%M-)r zczHcJT7F#`r^CxpBpQ0CKJQ}~k)h#=_FRop4s=}J0saDPEG;9jNrEhrsT+$U!I>YM zTn8qiVzo&NHg^^G`knJz0|hz0j~?#QQYS6f=q4Y{`tm)M&-b6919W&!Jn1{hHd++6l) z)|=7QrP1ljHXNjL5oJBO>H_9d+BYb>yCWY`r3&-rM*7JghZK*a@l0Ogf9h^MRjv7c zsJ+yn6+G`iK|vixw4(Eg7cgl<3Pp+gS=iXncK>=CN|e+$#KfvNy_y3%#KOefIKT0* zP*R!!;$+L4uea~+`KQDS{U#9AL-;>3+yCHU#{Xuv>fkS700272|1#SmO?XwEh1Sof z&7&+XmcNV$kZ89g5s)N^V2220mS{?Eiq=(4sO{xti~U;a+V-n>gbQmaVyU{#O^sIC zSJ4Yi>{j`>w#L3QVQi%wu#7Arym2Vt{UIoN5Pv(SjIY`s4Syj)3fH~Xux0&SsrmYP z`g(rs1~bdc$oLj0uwnPKXT4O7xZdLR@IHR^MZd7Pi1w+9F(qSX8vRpG^BYYKRdg#K zW=6h8&cwMhv2e%S_BK&QUNlR&1WEi+IN1j7&xJjxBs)7B+XqMDZ+LhQ{=xoT-z&;m zRlXD0pJ>H<&-L+YCkFy*dyj=~RIe|p@sFxfIoKD^PP*#l$UHjrj8oVXd(oPCKDp$K zNfL}d0lRBb+-vt15!@=W%UwKD{wEQ%{_Hqo<1>&0K zm?24&AvEc2yM>k$(#>%cn9Kh{P@Y%?DMZg=7sRWzeNJ^%udaz%412`@#x}f@U~S zX8mX*Q_>92TlMCec>SIoT(AU8=g&lamPOUg&~pykYPX;(txmx*9C?N@Eo z%t_)?E?|9+*K*Uo2%RiH34*Lb#v93ZO)emK?qi{IqcjKJOKwGYMxKK_;fIO^% zk}~p4?9gVQim|sN=L`oe>JV>&X_*};Xn=Xt)zpOLd{|K-pjL)UtiR9~cEY@b4V67mW=969eU>m` z^#fs;>6aa9jrE7{n}wid)0XF;w!Ul58ckTz386VA#2*{lGCB!5t&Be4TT_!S3qzU= zPzHO0n(AZEuxb@YKqoBeu~M`JGm=dH;6#qyWL&~+e)GR>)KxBq&mNdJdCFq>b>q}R zBXx4knJ(~!1AxNdBlR_bo{v9%p~k-ozs;lfX3uI=qN|ef5A#Iyr(D%l2PJgWRJ>?L zCehUxARzSqmYTjtv9Q2TIau$PkL{#`DIn-RdJ~5={stf$32`d<#F?8LoY0K}Og{n8 z+#~aSvSvB3D^8PPe7Xv#UzGJm1qBz8Nv)7CzrUb20$VYrMFnR;K*s5rliKbwI$vZN zk@!V*)P$uYZUM~3`6WNW?G)NF`w@5fYbtFmNeX4{{*G1M|!-N7-B?Q8Q;Kt>x z1YjmNY4Yut7Vj0iP>CTZ9#W}Ff5ZQjUutPj03I@i*TwHgucDILV}qKLpSACdy{hJL zBGsHwkDHgzG4fzUd^U;EtUE-Yhyt;glAV;14t`z|WuO#`5g-I`ya#A(hEV;SWt_i4 zC+YrGn`4f%Wd{eDlT9v_o`h7jApOw!1M#caW7Dj_WYbKDjNPr}3)aWUV=BJDmJhRe zUKv~welwyFc%q}E{`cD2m}X4|o*mmie|t@~!0;I7J=l-=8Lkdk?X9Jik<(43p;Atz z;Qx1T=1L8tX?^dcdvvc%ip7Jtd#8{payZw{{eWGevG4P4QScU~`JqhRwk0B2J&8As zY09(j?kHn4L84|wW6aOvEuhVI?yJmB0ZJw5w4LP$>#$FFMv|;#!iYHD14UK_tF z$VBe_s;(w;aRjji-^r^1w#Z#CR%vSFOFz1`k{&GONLECNn4KkQ3_=LDAOQ*zB&bQZ zMGb^S?{G|T=Z7{jOhmLs6=}$KHg;74@4YN%yz0n=*PYF|SN->NSy{(Tc%!-!ua&tG z6o#Zlm1!gt#)8B_d2@zE(Q7}EzwW99a->btdR_V@E6REGi%~Wk$&S3r@~{1*)5U=) zL^yoK-+4QAg^B$CUfFxv{n$f4Yv;?kGGffpXug+Ppw_2Q`hJ4Sj+E^S%7XnMHABtH z)Y8)WMgb*hedpa6Rdto4aV@ASww0BO2+zR4YT#Lo#2(-40WP8tCpg3fPO3D25*JOm z3jRruB!`+KpxLP0nM`uAQpCk^T5;qLgYXSqwq=+KNEVfY<2Uncv5iY&pzWJ;P)Fb| zaQ#Y@YqB?(2}fF6{YE9n-{JM?dwSa;mv1MEN`!!e+B2L_c;XN4k8i~YOt@l$Dy@Lf z(MP^tRY*>K{B^Jqx>9Q8>s1nceH#=3Rq_QR{nEw|RPwdL#kyob$+Dm&rl3vD_3FSF06#MV)_39XFVL zKNFjOp-t+Dcr4ims)IA*pJ5X%4Iaz5|AGt~XWV^R>pPBM5x(seXs;xIa2W1n^_-|~ zjtSvhe0uxH7}{(7j^h3A{wuH&`pL!tmZJq~;TIf2*X3N&nzWe(cjR3uKoav&mOW#s znxUsNd(pIJ3u{n~EH`hQSytL_NKw=r9s)r3N{W8$5n6S1aew+%QTIGfSXbINNp(Gp zfz-O!&}4J)$on|-$IS>Jz}t#dO-IoXBb^Xiyo$tu0#At2THMPzJ1bxVF%4IgB-a)pG-8w`>$nw4F31q_@+r%gr+v( z7bzij&;1AQFtj|*gsy8mY#Qq6omvKo<+>McCb=*Y0Hz~4wA~#f#PMJVimtElZd0~r z-6V)d%eM=Abab@v@zG6AX)&3k&`oHveNQ?%Kc$ATIhAs- zNp!3?`=!yy;^g(%JvpQrH-RqP?)>vO%)WOIyx7l#tHK{Jaa?!lEhz z5TW*Q$PQ#?zlst(^~H;w^%JhW8&{Z!3Bk~YIZ}l)IG07p1R!Oi)lMzS&gS>|3*zE= z+R122oa*U)F?SN(jI57@6uxlQzvE%2dIn^Hcz`)jL+_^BIZ}VDq+75D{zYNbzUXo& zbfa^;eHVu8x|xhiBB1N*tQVgBQfVmI(75pQYhQtXZwQ~ z2XE-O#J|2`>q|CipA&~E0kAx}Et+d^{-}LSni~ZR4%QE4EG27K6>eSApe1v4gR2hc zfhp4o($eG3`ztIW5)2pq&QknfJ8O}4D|dLAHZ7qk%QvP#@wHEAWo_L$ zIdzawcoXbe;!&BMkNUx zLLYANc4wz`#RcBAA^gjZ}S*L{j)oSpD`(twbF`e1< zo2M2n=0*H+V0_?puMUDJM97L@Lpq_}*ESF=H3sBP~1xBT9mp6$W>i z=lyg75bIE7C%p!Awsp&W9YJiw>Pwp-u*D~CnhwhvDBGPj-V5xZzhQwI-OX)DDQ3wT z0dmBCy!jKlwQo#p6tweialL~dnnDQ?N%lMjBOPNzGLF__88s{#I;Jx$iTag$HPCgq8P3Se|_g9&G*1j`M%|uHAOaww^S(v zhF1Kmq$!hA67raj@^=gv$jSE46^X3HD4MIQtB=5h{;6;E##<_&LU(^)(-7!|Jc2Wp zR1~l>FJE?2Y`sZ#IZVQ)cfAr~kmS1lhxgI1oZC@oZ6YhLt1G8s;=O2-;ipH>=3t65 zJ3Q~FPkk^5s`eL`PuuX0js`8u@i``_Q=)R%)L5YMsi}e&rl$zCO?5&6uE$?rpPF}u zr?1W3#{xS}G&%~?z{s+gZ{;{{(CEH%G2m+TIqYoa#S>H`t`4F zURV9v`}r;B7y&0+o0G+gg7I*pae@>UTu$n5?%i3@-!2J6ptvxY_@Iu@Rljzux%y=2 zcHcS)y1voR$&#m}Q|aP72j$c9MNHF&4boNhnCaqN#^wKFQ$@KOKJZ+wM$&P=cA6FFRqj@`HC7$vruh!F&VhQpDPr-aHWT} zanEb$*VH_CH2Hw0zx>jbZ?J#GZzo?83A)zi^O_KeKI@8lp$LSV8G>w*+*sc}yjf^S ziUDPz>1shS1|hXwD8%HN+_I`-<|qMQy*=_!5h!xPf1H#$mU3rU(HFo`7y<&%&Q`vO zy=Y?W!F-=)z4)$&At6c6f?!K9s3s4pki{F3%^E<(RnRkg;LvSV=*-+gH4a7%LWunJ_}=Ji;}w)y?K$aFmCqRqI8TCo*_~pe zyTJuSkeC#w@_>c#Ad0|@PI=9-4IbM`kB|bRohip$f~Z~d$URwC{g9$r05nZZHhBR; zheWo*$eLK+pTKCtpA1x40#1{nQF%Ri2F&0S@qW;Zaigy4f^NP|zW)Gl`D!N25)B<5 zEtJhR3%_52%XR+c(GNH_P;Hi}+iNYhF}#`~TVNX%VgZS_cDcT9pE1`1K}g?W#cS9?- z`e~a>{f1epn2-q$)BdR0ubM4hHYPQhI7wQ5o5nxQm1x#kH1Bsx*0}8qm1jKNl#x;2 z=NkHbLW<9OY&LV-64Mr1i)Bo$;_*z?)DC(Q`tpPD&5`C1|E}}dQHv6}ka2?EpcOb^ zz{3Q%V6IdSH(JalZk@5lXvBbOU&3=}n1B@OC9OlcB~aZoA5LNzij}~{llu56#0l;4 z)>bZFglI@e`HTiH7&L=47`Pp8khq5MT&Ym}_}!4~h$%F4Y>Hk@^U)1Wb?HlI^_N`* zmEQwQMoLFIQ@nbI9?bM6iKvSKuadqLvMiU90C8MZdB?b0j@jg#s-~u93hh{D5YfJp zG@`VpoM{kapDGHZ(1NNy5lU%S+7DOg^z;nmQm1x*4D^s!y0&V8o-{{+!QDFmr88i2 zj*`ZQni!`52~?XrE7B#n?a#a zgCgcQG+QLou2NDg6Xf4BQ@&(f>E3S7Co@dgC0xc9h|)2!?40fQ#h1#s^g_{}zS3+@ zXlZ9>S5aQh9l<1?^ey~W#-aYVm|_COT1G~O{BWI(aJ-D>^!e4pH)`63Bk98_yC(f{(Jy2KzCw6LjEKDdgKrc3=NJ4h-&StvxCsE@3H^_6YxIWoAQ(u# zq_6MfjkgA5_ICz#g(pCS-e zM3~6FFBlgG?H44*_YhMeGFtGf*<{lmyiND9I$D`FZFlvB^ct-vxRn&s5u~HHY8QKk z1y}j(hnhJcDJe8y)pY|K$JjaiIPxErWQ&N1nBUr}*=MeB+*S<;cmk+ZCFOv#I+F;Z zP%`(1DM8sbV8DQl>zigxM7R z`b^?e#mE{5UK)$?KbK>Z7*!rzJIRhAEm283v&5XfJ9k`VX%(37JYQ_eysb3vWbwQNZ&9tczgF2F_K3w(lyoHUvMkb|Ko%YV`Yf z?P1KuK8I}tpK{)CJrFhDQb@uIH)=_L74`WMkcL1s9{y4^rvTXZqY$MPos@cs4kh<=~0!bo1LFkLGgS4m~kl@;Z`# zPT3pFQG^I*)#v~s-B*n_U9>ZdYVOu9RHXX8Ex(}l>h~< z+RiA!#{E>N3)CqwdK5)pVk0E{A%{06()L&eceS=U|1IU(B&V~f$&CWl7J!g8%O7VJ z1{K>erLnIzn6*VygrR)tC)JAQvodt3@L|qJT-$@B3WtJ=g5uCXMA?4uwq{46|De%C zM^yh-)n$Oi)TYD@~Ttx&-7BcOlPB}2z0{7Q1 zc-X`BTF2twh?#&6ZQNjAVNO`;uMb6qsV&=;I&vJcia5B*SyyX4C@dW&>+^|D(b>(d zx2{Aax4c4D3)oJCDnRQGhB~uh+=Hd#n+UHcN#fs30gAu!a2XqZb2RfU&pz*GQ3z)=Ehm zN#bwacN*#{nCC`onz-OH1;fUz=-2?%1<(jkEW*^$6LnU`GWVaGrYq4fxh|Z}gX$Oy zrb7ePd1TBY!0(N8diy595b4pn3aTcIPkeyq%K+#OZec`DRLlkgo&bMJ65D#(Fqs!o z8RnM>Aw4eqRTEdy`9Us$X209NdQvW4WQr$oT$45i#{siBa4wNHdbGnHzT5MeYlj5K z+R_qEnFM7j7S%LP6yBI(53KC`OX7ldKEd<2rmX#_rD{A1i7J@73C42e6LvCXrn$=p?I2gHii2o zpyue}MFnJ0(f=M8)EZ)#=o7Aq-ha=eKT^qeZ2)q)W&nXGApmpgIZIo&lPQpMFH_6>S%bSl8zwnVqQ%TW zn=45tbg$P?sS&Z58&1^X_OjY|@pm6QwC~hN@S|=~Xry(|enOU^`^Ra8-uY5jpMJIa zMcbM{mUXNK=V9+cmCP0Y%=_UIoz1=4spe$9NAJ=1f;7I~pR2*WFT(1t#xou$90 z%vM_q$X9OvY=`^ipu7`Cpou`A3xN+?Al8S!t0yZXkqAg)tWT!NYW=K~E!%<-^>6gL zSQVj^3US#)?K*0ENOhpl`*_}-qJS#raDHsT%U3R`W!$;YW$+AhwpD^3%V8QPOe706 zNyxTcYpTVpNM&DG)Wbn`S(?M+`J_{4dEr+Uv=A<$lim^Bf@5esf&o`_60gnFN}%~- zLkK=vSdfbXsB%k#DOn&6#dFc4l)-G9n-j@<%Td1&lWYv)xWE~vQavo!EiSG>Gr7oh=nz@_E0eojDz;`fLy<0EzbN2(|_{*PB#f@mLDDR(x8BdUgh#b)O&x z9d?4sV!gy3O@^}8wwmX)>z{;raZ-WtXWH7S-5M==KL7NuN53Oqr}D~bJsVPa|Ipfd zWE>hqfQu!{dR;@+g+AP+LE%80r-z<~Hi*js)ZJe2c95;<%86bzXRX^{zsdWn$rrQ&QfDWW~Q7US_YG~ zjSW8gEoNkR)mqbz9>A61s3@qkUSqU|&es0RSTDn>;lRP4c|T*`#ozT|T`nd$Z6K{E zdT(?@-jk&PFtbSWDo|BT4&-k65t8P za#CDejEYHDeKy!)>pb+7C_7q1Z)?Bh(^fite=_IFoX*;0MSMMdhsW&c$M24yZnYn> z^S}-I5sZuu!HEW@VN}--W<*NRDBv>_#SHYTiuklq^L{(TWijJ~uH-}%4abC|m^?R9 z*@F3jIXQAjPBF$(InJph#FlpZEhzG2ipd0}b`%U%D3LbUN(S^ael%bHdDsbLgZ@`!;RA!ZX@RATpzhtE}lB>jTK z=4(QQ5i!2rr^%?VpjJ(Q#6V>|kb}0+d`mz5{dk!vCeNYhA0$0I8reH(PgJ)VGUMWn*QPAH;Y#(QZ+!ydof(ovtHr zF!b5t;i{pZR<}|aI)L6#b@p|%==#n(nm#82sV`5Fctt=N(ASSW|8s$ATj2a|85>d} zP5Dsd;F&0m{b$8(+Rww0FlAYv*^!r5h^FNwQV{s)E|9OHr`!GEH1-jJI0OtI0Q4*A z6)<CUeTNv#oq_3>2TRXAZTNwxiabEk>6{7SEITWX}j+(B~y^N2BH=5axN5cL4 z(Dt#lf;ibbIYZ3)9|qP-_H%@; z@2r!=k23)PxC*xJ>erd12K#K3ryy?zg)w-VPT+Dtx_t5CIi{6LSP!2>iyr5OIpPr{ zmL$M#JwgtErm9l0$9L~Wf`tMBbHJhA*u=*q3Ea8+_c9AffNlJd8kojdvL6vmVzouC z{w~br_JRn|hC-qlCK^*x*@@oXn>SAn>^z!{xz>qC1%S-hz(@}{H>Z^YUNgBr(XfuJ zi6>j~iu3w#!H&w|JxuwD-j}HaWv1-ro6J@U8PKbWSPXIuLgW#>)SgQH^F4M==~BPm z$kkhA2RHPKjqT1}$zlIUC9*p!o9Dz|Om6n?biSaes=l4Xbi7^!-^zr|Yg&biSpMJ) zh5_(boNCUwT82|(pg{`NP7v2Ra5PKd?d@F-CYK@xHBG}Q??*(It?UrVG*uczdu+$Q z>*wi%D(rczY9yt*UqOBI!$~|cwK)2wuDc^of^2kHt8w%8>Qfh0+rMX*O~u!B0AE2p zo4S^__ymMTm(Px4a7mQ_C)f|$ba}9;|5Xn1MDvjuE?28qZN|X=&D8j`=^b07T*fZS z*=%@?>!zF=GY(7Fhc&t$KyM`kTP-%%4Gy$5i!;8nrVpTtorU( z8NBUaljfX4sw_It_v~OQVsS0y#22ox@-jR8is77a2D*=GSfQ(*ujPr3i!#a$ma`uVP3Z zFd}&tk+ELGhLgN5N&D@Mdvs1mLOKK}98K%&>I5&iBGKp;3lJ2!RzPER=IjshRQcXh zw`@b43?|D6DHdHub-NIm?LPY5zSFpNS0sGWS9TA2Vn12hltBd}i>3we%h5n57-9bJ zh{WTF(SSP&#gWC?jYLDzV(Xu#1 zR^x;bvjmBl6Z8EuU<85uU( zz;KI_&CZpj=!A7P=Y<}=IvugA6&7p|Xn7I z(s*vz7kEPMa}YuM?S*w%=(|YH!s0i>Y1`~$0b_3$9*$>Se;c$CSi~&3<;zuFXmo$v z*cnv%we!o90`OW#WdE*K_IW3*;Jde5S>zl(i2F^B7}@ZU%rcjww;)A#H$e>kD8|~# z>J-0$6vHb{*eYYIiFrWNFleU?WxHoW6V}5%00d&+R5a*0YG!YGyNe zub~@<&1UI($5{mab_yaR-50!*cD4v#{VZJgF5w+Ik1Gw;?$ZBF0!v0v6+~L3A|(Hv z?AKz3$t`R>p~mtiCn|xfJmfcuq*X{$rQKH6*)Gy7H3cNr`iR6>vo|oC%;&%A4<{90 zjjCIpPVoelK0`gvBy#MOKp;gQ)jztTRbMSa z3x#%l<>ANJGeM3r?mjIzwSO~-YB<%;%rklDEPRIg(U&xuJOS@NrH6hLKA_;q*4y zC?asNdUHFGS~vT`@H@&cA&i*7UNF`AR!)8PSRFuk93rbQJ>bU=@SC+7!kGc3U6gws z77_6(HE6@l${xKAs)MgRZ85iX3a|H7J+3^RwZnDCa(yD!bW&!i;!GIk5~2XcK8nPV z@t33AEtJN5m2^pq92kejMOh_%1?HEXZ+G4eh~I=AmQ!!j*0N38sHzQaIc+f$vU}Sw zyj%%)+N>1bjVxs+zSsP=Gs7X5ANDy$K{fct2kL{1k^Z^DfK)^QuheaKg8`&X<$^*c zs6EMsx*F`dr_JRRiRPdMpIH}?DV(W>$Ce5KFOsah#ENTnQPgr4j_=p1^DZceu-iz3 zP~tLusQ27)ZC4MjO^wGs3eM0F0Yi!|^R0%}@Ndwdqp9Cs_EEOlvIMlDs@8seC9AS* zXaINB{*2TbsX^OLmy?*%V5XSC{rrI87t==w61DK^u6}QSlcC{+*Y^=Gkl{rbNy(lA>WG zJzszAc~AS!i&`q7w2N$#bcAUGGzGe-VFC$!rTtQv%s1jXC09oz4tte-5OgU2j-cEJ z5@bP^oq4HKY!@NA5SH5UgF?Kg8H9@q^OgEY3wmQv)wk^2G}zo<7lbe+nRTxU#Ih+{ z(F2KHprwUhwy!HN+=(1<)xP+uvplyZ#3%F_a3^%uf%f2IQF5^US z(=IDhuiSaA31lP9qO>wYP53O?k`ZrW3+o^O^cgAd`uNDvUcR7`%)-vv{B^c=bZXmG z_9ewn3P9_@0cWE95a>=jat{L38T@2#u^E7dlU0CY;@bg-JTnDu8FR zOnJB@QvKF~d@ zEK{J}=Nkn#c*hS3b!+@3)WiN9t;FH_f7L#JtZ%2>@ zO8$v6aY=_d%vD<)5B;?s0XQzY9uANF!;jf~b;d)6Of%c>D({H^sjdz4^cI`+0?zFc zc=l-vcjE|-A^;4MB^4a+U^ArW#tz^U$GEqs3RM=7XMij~vE+&O$*B#QUQHW!B!m89 z+?ig+Fn1xkU^yPk`ym&H`6E>*kQ&(;)1g?X8$LqC{o9B-P)Xj~&_#6`LuA;ZEOk4|}E*Cu%6GGzML;y)J z_Z-ZziC&F^!l?=+dm#h52!ROzw@8Y9%kBkpL&pLaj#Sjgr<)LTIl?6AXJk$O_MmJD zK1QrnKV%~qVyj0ACD0cUx^|$|z30sT_HAowU2b0#^+jE)K!ACxqWtjFHe}`Iwhm5QbjT9K1Sm>6mwE~!X{@4KX)`Hhk|2S+ z+sr*{!%m@j7}sv{J-8$q<`XWYgjgPe+c7EEZDIFIfDK3A*qWXWNS7@Z9TiObj6`KL zl%+I6OPidOH``pnHN8=h9Fl`rOl2r7dnuVnaXoTXmPUs?y_;ktggqwh|D7tS86GO= za&Pd0ZvbJ`6G6)-4Q3HM^zUc3#3Z!jg!1+yM%*m})lVws`kBIp#qjXZixQRc_ghQb zJe7m$7d17!dSPBa7NdQ;B4+&yd#fQt!0ER{4>&{QsI3Fagg>;yxaRC|U>L&VQ zkA&;iUis7aHuw(!h#b;C7G#mq)ab6;tiITEnstTK@^|-8)$J=H?-OWa+{X1uCvOcg z8GIVOTnvk^1W?ylXpY=MSsXe?;oyVI&LS^lyy@=M<>lqIwAMK@{o&|4#?nJpB(@I5 zcjbZH^BX6SLVt$pDtU^M=tfMO&J=6@X2bces;IJPqI?v~ghQpm2tCq>o)X%$1B177 z7C)cRAl&s{^S);A#q5%kDpO3oQS(T}_`t@dVm_E>|r9ipd zo|f5J%Gs8b9MJmI!Pim4+mq<}O<;ua48qgc&k=FQt}s z`ed;xMP~e=aTj`gY&fCcV9iX}Td+9ZPl`kV@qn{{Qgl>~jKq@K8SpQti=-)={#F6` z|3i5T_~#G!uk!Yn-*5~75P|rg@^;}1bK(79$)-kW&0CaD%7fMD^ z7#||I+(b*n$8Al~B`ZH_5uWx~5M~PA-w|nuC~D;=6*wlR(<`_(L^1^=1>*`&EvFlwHSZ zv;U;g4X$XWtDn-@$bh+`B!TgxyQS-~5s~N@R|T}b>S}uLlcH2;(R)}?UMSSeP{j$S zGzg^z6s5_#jw0!@3J*{Uz3ym~>AK}OrO{{-wQKc3Se+;aI_i%i{`9FM`wTYgpOHm? z8VrwD)Z6`w&CWLjK$;=Q&=RH=H$?F&O!0~Ea2a_}{9Vns>R?LXF3u5OU3t&dNOXUJ zJ`ENH)dk=Bz_TWk*Yh^(pKQ3~;_7Ov)#g%mdU?5c&6-yvlNxz>X=nC|L|rtkb%(Q@ zj!sWgqMG@qkRWV6B0vzB>xOlO2C*QaESj*zZ@<~$DWtBhu3=tULIy#`api~e8CuF1 z)2Mh_1K5sve0*GTb9etDHw=1RymrYWAHRo$hFJKP%X48nn%eq%5CEeQFf90+Vj7}7 zW9%vAi=a^QrZ0VEagiMxu$Tjc##!o2yV4_#j1b*132;&ZLN%)OdiDAr-Mw_nkOBM~ z936Sd%i0HrWwTAdXa~~Z&2R%}D>C?SGQmKyUx9y-3>MBY}^dM@-Y_c(o~g4zlM+Qa;vnV6&yPOFSztA z+d*Zb_Xs3TG(N%(&{8|_WLQDBzeRpK6MlYhpHb8XJwx#&%;{cm8*+`}NM(nRV8gz4zJs`RO?Y zhpq8FZwD;xJD(Q=)bTZ?q zOfJ!~Hh#HacIm3;;C!Tv24LXT6*QWTTwty4k13H!?I^g!`8_hR_*rkjADXJcHqanZs7xtlmni-H92ug$UaR9yWqU`*WdJ>W zgn&&_{4q2+>;QFhu5~?RaQd`ULn5|zK#Vdwqp5!hc4}0iM%(E;rG)eH)M>HZ<6B7b zSJ&1oW$AikB`k-XY~wvx;tCM4hKH!kP+T}D8r*KMaa9aZ6LJ*PKL70A5LfB#x5IyzpLl(-JAcB5IEH#Rojj^N%}aZM*G2&m5$Qd0{;z&$iTXvL9ixZem~ zHWK6#(M=EffF}-l+|-yox2;a}o@up{XBFZQQ9=J|piTUk583CTLeBG6SBeY_3|a0s z@awOp0}n(KZsbIJwxJ|owfNZQ*wO9f>BYr|e!o_>kdR@c?F#!SL%Kq%StqWc$A+8x zXwuhX+9+Ip_3hE|zCbGYzr+(* zRV$=FKWme}!pI$(yI3m<;tK^=!2>ZmX3J~v(QnU!CkOXQBB*oR_yMhm7}KmnZ}qjc zm)HGlP=~kAm$c-Y%FU@3FyMe6Ow+OGW@20^?#l+nHLhfV$IxZI-$A0#p2CS1pLILK^K4eL_Meb9-&oD*fNK5F;Nu)vbx`YC&w(1O<6>V~QZpIiGP>(z*V6xGakJ*RR zKvTrMY|UKpynsNsXyQrb$v)FK1eV=ZRUz(J#Oi1^T;xQ|ooL!naHqJ)?AqFE;t&$=)WWB1@n0^dDz1EuRj^pTG$u^6xZE(x z2*oNpM-@V#UKp@N+s1(b8~Od&*Pj63t4qhVHt2^q5(EzfRlexQ&K+ybw^O5A;?`;lrH ztsvu0gE?qS>zbq$$>=~!9A7R+H*HX7I#^<(vCj_6$(rHne8rxFUZ_@3QPvQ*=$T94TK9#YT6fCRJu#yEO z=>XxB;G&VunlWelN5}RSN+KzW?NaJLVjM39et27)M$buD{LNKBLy^7vg)gkB({m(k zF}!VHEA%9{zwTZLcENCe#dl-TY7j8+W~>qW?Ev@3n)Kw(Ckax>e#!`iF3Vs7FxHNk2V142doh zBLT4*BHtH`5~4l*Rs1Zmlv_*n!|%Rf8M8Nn(`u7Cc5>29{+?N^*mZim8*J~C&G^Eq zexB3ug~Jb@Y+v5899?a)k>2a+d%itV6V9_tz6)QK$Hf2(`;2Yf5SP8|Us2ucUyY4FmsT7` zmiAXQk1Kp##kj0q*IHro#5=28zeM`J=2G$zlDp`uqPdm?a_!;p_Po(4YLM!Up^_YW zuX!Fm$yWAA(#1pHmUWwI2qo}@hN^J3wpXcfd(i4b@bGJCwaXWf@xi*^KcnE_Yr)r3 zbxFZ&1I*M@0Ty|l>V46=NkoPRCi?!yAWgG4tbDFz2U8b8dwSxl{IXEAC{NJ*ZNwOzEIewUUW7V(zLDMig##y&WU)JoNxKQcF+ z7iqN4Sz_K1wfhFBxEdG(^Qh$Fb^C#=(q_Hsl+bbM6?c`(k?~7{wY)aG4`oyO(5G@9xG!U5 zYn$YXgp@3FdW^%EdA_)Aafy>f4d^5rv3Q_t5)ecQno%)?lIs07{-e|ZDM6HU z;ma68;K|;~fY+0t3?xACJDePyNZejt15wsw-vBddT((Hgx%nbYtXpRN_wvXc0xY9a zMvbtBceHO)q4M}4TII7EBzEQInm5Stc0WfZ$CD|-&>0D$W)DxyUIQFj@GilFR+a1} zgj6bj28MTGp~&Ts_hC0O{iS%j4%!wVJI+h4mE8I;SBa?>n+l^~1`Z>e_T1l=xSe&z zbeW_o5lXJobDZKPfu4(JXK1?O5~yATsO`LkQNia90R1I)us6UtS$pA!TWKomb-DPj zUUWdA3UnHi-q3|1Zr$gu*QR-OEE_gt?R2V?zK>>TqsR5BR~l4&v}L*=pk?}Qx=;!M zg&U9bu2cPbZgsp|QJ}h0>PIs$?%{N^{Ke%Lt@W;(@h*{@Q8!KW<}5X*Gv9{(fe)kS zhBVEYqCq{wm2HR0gd1Jd9x=ojj6276TCi*I4(JH|v2s((=Fj!`|`q;(OF){36mZ1~1 z+`#yc)?{PlvL3`kawNgFnsjTP>bo*AMf@>LjgOCY2?bD$06_)1z*EbY&naFvlB`{E z;tMC~v_1EGYo11rA1V4|)k@IMlw?-jnQ4rp7Ij6MioZwSJJbrvPA5)i#WO>o1{?J$y|7 z@|=QT_~zc*&W2dF+iET?>n{OoNh=Ir<-+KUm9|U#J{Me%N**(1(ABl`%JdMVeH=O! z!B%sR_OGg5x7}Oj%WV5e8rE{^msk_MMuhzr%8TIPm=l#=j4hg|9*F0hYrqu?A%1!P zR`5q`8w|j39#X>{;O{{(|7-BP-d!0=H3se+6t)hKcWJ74j`5eU&e4Ttg*aF=l6#8w*%pv0xi)$9lbR-+DmgxK z!1{YnC24S8lA1%=k9WS~9*ejtR$Az}Du&-cO)6|y zcq%#X_D8gjG$Q#PufK?ruuT9!dsuR~o+}tFvCwIXJ#SLJH#`$=G#nW1K{yf}qh@XBezP&X!z^!a z?{0(X*4^k2QMqS&w6OY>NhE_|_EsfNi0KwCh-u$aNAD%KNtoO_cBS-8w}&C}1C;_^ zM-x=Muf76h!xSMNkobL7dl8HOl-&t&gDSszjZ$F{yk6R<~l0Uy4_e{%pc=6nh$tlj_aYST;p z#&Bl2M~t&pDEQ-=&Kv2}J@@~vt>-?Ew17DqhIcQVu|W>&V<93)HV6@7#09GcmGUx) zMb+`nfwr-r{v&ZOc2u=erBY4ylQ^UfoXf&c(+DIRC$GwkPBUAYJ{&zFQV7O1%fS2R zo+JJ%|G%)l%Bnh}WI1oq{FUY&hhZ&t8xP-xBJ-(*2Epq&E}CiMR=)MlOCH7-S;Sqc z1UHCT*kR9j{(7JNW}gGAO1H_H38PExHz%x#ncf}G#e1aK)tRH7>eo%3?!DQ^nUArM zpIzsATgl0BE&dsL<#b=HqD1ji7+c-v?XX^kuS~{|vsF?+PR7>U~bh zG71>?yN{)D`N=}#@qm^Rx1M2~#N7vkuzA?JQS{b-ocx|3_~{|Q z&%a4g+^#IXYERnP&myT;*vP{-s8~Mq6hxDi-&6m~dHN9DY~f5%K5;=jkRo`vx+x8U zAaK!mO78Kx;my83`+ls6gE&Uhf2H)=ufH#9ZpO-ZkR9sgv=D<*gsSh;AXC+G8dhjv zV6c~itN2FQwivx|lKxw9jOjS~y zkbNnO{Hsb3&S$fs2jM&AsG#b>D8Zf!oG_lHzBvwRL{vsIXyh+ zL`p4+L=DqdaXG>2TKX-0)N6<;r0o~&KKjtV;jk-3Nd_w|FPz-X2X-`EUXzn-?XrJ6 zIXsaSD_Bnj3k9rwy8qaQ^y?tgYH~}rF%bWCiCM2X27;ug3ThA`expjXvPWU1Ye1!udM74)9yh9cgD7e2G3MB18qiPJni#d@n zrhg?o_Vo|rx|VMJ$)f;&Q?w!RF-{DP#zhCkoAuN3 z02+uK6m->V+rCzwX$Sd)K&T zHPWduVUPFgXMHqgju<(u7{mlq7iVW?TXfFR9xYO@CM6NvNi2HkeEa60SGG~gf%G)= za@qZQ(N&nS#by~OaolU&mcq1D>f6P0A`D<~&Q!Pjf<;!znL$W|Z0cBrKq^LWzhc+gP#^Y~<8aiGBr;9FbNhD?+f*ROBqZqdOG%SJh^YdFke#jT~R8B>ioYCXs zF-JjT+6at|Q@sZkny*=~39`RLxqq%fXiEot=3I6|{=iDr^V3tc`BJ4}(>kleiH!Me zB;ns0RFbj7N#C5;8yhYBPayO>Up5UHtZ+ZRvlp~nQU4UdXT|(SBZ}qHVh9UyvXW1- zhK;v>tKXHo5n-Iu4i03a14Gd27c-5i+`k_`$p^M%i+u}YP0BfnkD)h_!+o)QjaE}3 zf^1sp_;uVIrBA@ntO&OfpGQ)Tp5588ZNdWrUPRyWte8f{uye4A`feP-LQA1!G;WRq z(|a0_H-y2LQ3K4PSBW?A#v?%PXF=`!9K4&5FVA6n`swoXAT>b2hh4gf7~p62OZlnP zo6~_&^D`LkzY+v7M^XSck=|g5vHL;6e9u7J=jNaOJ=J9~Q%#ZIw^=C>?tUzLqtwlY zjW=NSA>Xdj(j!vB8{k_ocLgI4=)Ize z*Rdh3UlfK|nNOsNrUh~l$?r!m&(8Fb0V2`^&EAPJi+L*D#)mZIMA`h`>&xW-#9c1m zDQ*~TB&4RZbDi} z>ham?`x!^XA!kmtRjT}tU~+Kjs(ruvWZ`*u3J`I@0HKVi0i6H`Qg3Asky+l{BQ zT3B-9u$vGq#9l|m^0-H^~pQH^r9ffPaFNhAZ z;bYd~*8a~0I(d(b1N}v(*C0$s=n+U^e+at(#_kqRs7n|@YZXBzH>`6$7z_F}$I9#7 zH>6q>7Z)cFyuO6mmQ2don-Vb1nY3oou}egO3L)VwBclmfu8uTL0f2+;^rk$v3*f6b z2EKuwAUtl17Now#H?m|@7AMsF*n;kD$;LtGlWI2lKFZAOKJ}!fG)gv8!ftABTwNq! zxn%n)?zOjRv=7bqr+^IYKanx9^zQC%E>tXjOqiw9_nf5c=_3*9;-z2HJqm#wYIDT3xuj$^ZXtk1w}|hp7Df^ zM4o%9Uuy0-r%;AbNl0)J11(wd)vlZmu7r;4Ty`o1q0G7{2pRreLu?S3QWuyDKoqRc zHFo7<24L!=b)#eS{A&7Ghj<^|ztC`tenH*u5(g3S-lB-H8dH9E@G`9Pd*OnDe$qGP zY9E-Xh|AvEsPUVJ**g9IHHlsnFUgFYm$cw5UAEUYuC!R$lzjR&xasGg0Cf+{u{Z2|B6VRa>?+ieoxvaOJpPpfkwXNCSdj zQamsB=4zJrBb(L)n`&bW^8xcDd${B@av@ydI|{;MZMLzG&j0uNA12ecHI}iNJl7*A zGiS{`%q-atHNB$$7NS|D;XoB-^2eam2rWg{IeLr9@a z!Re!hIhToL8q22VIZlEKgA(N9=IW|X7y1+h+*McHGVA_=5;pRL%_Kw_SEH{TCdpxz zGL>*Cl>|q6>!eDo_bo;i+5FVAiRcTO`CU8O19pFmEPAR z;BFz;6Hg^Wov~KB|7dX8OUZxZyqDPhBp7gPlpziMuwsbN8WC`nd68aOOWY*J$kcS0 zwXjN(IJ;XS+tORDl$1;MTID6!PMhgF6Ov{VQUFi8U&`8Sa@3B~ybha!J#B5z_H+y4 zW?uEx{)=a|LkfQ;z6-|m@l=SxpU(ZpQ13LkRO*ZH_?(IU9?*NR4xIw?u_x$pG$o`= zEXWCuAW9-WstsqCaZ7)cbAy(iz|TR1ionJrw|lY&&Xn+r4=8E;xmD{d$Eov2l40m= z-VsGPAf6+lhbhH7WR~p+H~JlC;8rnqoYdDO^2TKk8=suuCRat(v(JX^c*1O%DqY zour2Z6^qmL+7pA~BUM4zPTtx2B6w~$;}aKOPgB|q_@(SoL^)fBf#q8bdXZ^sTf6_X z(!@j18opAm8E24gefWNBFjjCAzY{b3JQu!~y1V#G%+=i@!&yw~5gcgFrcnY-0t$Ty z3;)_M@)oY)cd4(@@s#uy7OOqmw-q8YWWbdcZ*a*p;cUhj78;0i~aB@MOKIKuk zXI~Z_T5l&GDUgBFasn3hB{7G--KDTzNKbIRRXR#Y@=iRKnjMr}uNiRa2IKi+o>f9g zR<;OJ6NjNHfo`XAfd0lFfqtf(kqYL*wJtYzBJMH0KUq*3as2{C9Lx}6*!PcQ6>L2F zlawWI^`=U{D5C$SJVT3X0sxh#8&FwaN$OA@TSJu;GdI1 z3eH!-Z*1eDcnf>e#a%zIL+?1O!aTEX>QPj zke;>)-c-$~2$3w<>N&*U)x|-sYIWDE7!fDSE69{r)zTq|1*-WB&++`fsFX^U@*)Ds z!N?EFP47O$pTTlCeK!7!#Ge;pB1@S&q2h|HKqqWT7X2>o`#fn?l+%w;hzQ?M4E6*3 zBhbU)bFetbaOv*z;fkn5&vkwL)FsqL9XCp1(+~m*5neJsII{rKH+>_;Rg9{ecJp-e z(;>aeh8gvtY`?EaxCh1{QMUX*BrTRf(AOPm=C{0c><&O>>+C+UVaPSvgYSz?8GhWN z&r~fvZN7sZqBkDhoe{O(#w2c1WQ9fx%3G`dL?7&1Jmtu>qNouuU+)$F<#=E++52LB z^6%fa>dC2fGI}-->BiGokmKkZucaLG)xS`-r^WS;K%@8FJdRe2%CsA75HZXInJAYO zqMMzKaYx>C-ZkCF$JSkziy{ZXCinU#FZA`}*A5Zb!OxpY+q=C@*JiHCcMaIJ4dMs= z3F=81|0n)rS65fx&D%~78#@JC_yIn(&pOwk{iVZJKlv}_V);kZ3B_)<^4G?0U7I>* zbprB_BSBXf2o!@$nc(xXT#qq<-+Wvw)e0CkyPZK8Ns&AMOi`)34atXy09jK_d)wzl zXjsWRud{kDpUPbUuUcIdo9F-C*~&Ey+8w)0fJ^?fQho5vcqs9LPTB3sB`9zgRZ^73#{HfY$P96wTMj=8i<_0 zZs<3(({gosyd0M)J`32=Xrdj6e4!*$I{!!+MMrFs zoF0`c^jZlvs(W*<6?-r8BusQ0i$U*-Ff1rvfXWqv_^QpjD zd4AK2MX>%V|94`WaT14TuT|DFGe0QPM=Bj5>M z9#Pb@T4Qh^z7M2Rm6c)xDTdJf$oJl_>A?j(?}`nEb%WFUzLjBj>cqo&7w6|)7GOOn z`Jfih+?V!6b5j9YC5Nsm&#Auw2?Fq1H}s`K#S4afn>(!K);`^qd_q+vQ%hh552e&| z!v5zcPI5OXH^nuENxI2tb7N58&JQWQ866tBx#phwns%ql>GQpi0HhJATx^}_?U@tn zGIBJdbTK3YP`dSm@ksJYD<7AZ(v{oxKIT5@NIeIX8f}RGHQht#GaM zidAlor&!ei8te332Dad?grM*L?)^C;tfG##(`M?FVr*&^NfR6i(vBtj!M zv10FgBMo(%N~B&^PRU^HmER;-JXdU3c}hrO(;mR|fVgDxy?y|Z?{2O~UQbwWuPAvjh?oOlWA@E4^x`}*9g`3JKW5{bSu)>>&YXBmd$PvR@ zr=PK*@N;MvMgmrK?N0Vsm~pml_NWio+M67AW62Nm`mK!nfT%1oSpV6oLtbT{zqi0dFG365D(YD!jx9nyXJFwRG6XF=i8YE;WvEdr#tKck&q5 zZGn!>G(w}T>#6L<)lznH!Ug}qIvp&GK@OA4x`dzl#Boq3FcvY->8epKd#Ht0es^$R zPm9T_$3^>KP`*WNek2p0(~fc~edJ>9Ch4d=kJmCsl~hgM4BXD6m9E6YT|X^arlGpz^*?Wbvjv<+44-<{g5&9`TC@Ma@t#5b9U$P zQ`AM>N$ID?*ds)+>+Vpd)lX;Ll!;`EVDASyl`bk|acjhfmQWJ{8*8X+@`;hWcFt(| zUpc?9N);rb4RC+FRTIS7{slxu-l4J(aVqegQs-%Pf5TD54lx()2*K$|99b~u+k&z* z<^G!-FTso)yW8{}WzNI4CKGdw3JBF>xhGfhrm!$jm10k)WLN&B z>=;W3bc$_i9+0WeZfWW1WR7%2txfv<6c6b|fx^Qfh}EA~FTOT^HHg8J82(y)gm?82 zC-^+d@#TToJ`l2YYryp>=W=F$y3aa6ffy{y5g5Srx~X{YX3z3N&OaaQeWwDI3ve!O znSfA>^XX$u#3^!u zjCFNsfQurV;Su8(wp(fq4wf8|fNmot71Ezq`BL_C@pV$OZD$b1+#Mj*UT*SyUMn1$ zYPtv$-sTw#6*X&i=HrNX5Gj3gQP>#~azSGP-!h46iA%Gs?@IUjU>d^NG76_}U}gKro8;ETp{osP><5Yytn9X+ z@6TY7jng!dmn?nnQ~!m#YksjhL}REe(0Cg)Cqp?+a4 z19iq7pIU41kwUzi3kMw*j0~yq5edOo!^)#G)E`mM)$X&&`l>aI`ytBt0-~dJLsM0# z!W5ymXN#QC?Ktrf+%cs_86Rmtl<}UXM)zSVbb*d zTs#a5s~N7$OWX}w)0hps#l@zpn>=W~>MO@Sj;J;+IF~(bBkzTf2AaXWr??@_G*+Ii z5Qm#|?Rx4r6iU`|htzxG9oIAbR7viVu; z{O~=eS!HsCpB|nSz_C`9y<)*7O`I$`wTrb9-X)+@enwltmm0eL^dagdbM z`k`GZ2wzAXCy%^Ya9*pEJE zHIK4K`+OMIU#<~-f@?kwp+v^#f{TaVemWhzFu)73m&G+Z{nFEicGM)=JEWQQDNs9_ z&dU=BT95*hg|ZQ^S(9Kb!aznbta#a*;vC!+f_9}}KV*D|$mZGwSklUxZn}|>Ww8iU zGw8tl4}2}dU0Qvl>w_HlJF3-1nO4a;8Z!`59d8E-XLGu2wz2np{jYFBAlHEIl8(Gs zsKA-=&EumHsX_x$7Wy~m)4X-hTk#tE&s5A5d^RHGyFo1!Rbb#eQyfMqN-1{(^goNd z&#k0UbKTR+KS=o^q^ts3e}O`R75~obd+NK1Pat05O}*-&S2W_x&z_e0j>b$g43zzm z1P&Oa30nj2SOzDM74+vHOtSM3B&xl?i`s<+f52vCI*R~zXEnPlfw|FiBwM&aJr=rB z()C|*0oq4Lo?#-t)qV&+jhF1=)et7c+ul%UzSMWi6Nbpa9!A%a#8@bD@LA;VT~jyz zu%((g_vMJB zKfWXwlkcF24m9_`-2L@;7~{6Zd^9c~g5J}6jP$qMdXsAtrV6EQ+nFo@S*@2!=rwlO z9zU`X|7)I=xd{IpoMOcHUY9yp??)H<1IrwuA8{Tx&+tNC%F*JQ`9s)u-c%K}%d9Au zTtlo?_~?2QqH3$)Q0{{eG&6<^H?)&_=@7M1sQmbV81+RVO;=@j)UP;#7Y;Bpa}pl} zYPO9(@_s8oNgibv_$l6!C`t$vv%-&9&_2zLN9z+qnsSeXa_%f$jx<(n{8DB587%ZQ zGA)lNb<^1?6C5XU0Kg#g|+ zvd2v27g+2-#{VgyKhvMOhBt`zQN2}WRp_N>Qo&>&uU&6+VG|}s<-N<00 zB{)M+lyjCX67J0vVt-R{7@LMW8+QFMO;o>f#v%=q@)6()=t?f`Wzs$MX?>%^)Akwf z@;~__t&zeI0D0Y1e)G%ulD*RDhUEUjW&0$??7i)WQ|j4hxU?^OlHPla`Jfk_5L;l@;CP-;3QypVon`JEr@CYBu`~o5 zecDyO^C5q2=;rdUy;AEj!pc@x?PW7XJyi`j3}DYk!r`#Rg!X4KyZwst9>9r=8KF5w zw)EPmfrnugFu5xj21urfC>mxgHI)SHT?R1a!&N7KGhOVkP20l9yAQCbQOTb zWj(6TGvs&2O=xDnE%y&h(O?q){e3&vHO3#a$scpnP6?BY{@dN)MGT6dbEJoU40-6& z5ml5s=I`Ug@=b;(iN;d`)X07+P7o`KNTpd<*iJRC!m9wo+-9#Z28rF^w082iBnrrX zF)eEGT)Di_dBmjZIUtdMN99d1Y4QXqR9er;mEs=~5En(K9U{C^P#6yXw9X~#@Kc5r zIYZ_2R?5Y8tjtSRlgAHm_@Vp5cW4Z_-ssfP^w1Ew>!FHrVq%53(+B|yOgT9@JggFa z{XR;BLOZ*W=Zr6}uMTs%A`-Nci!>)E^5r)GDYT;VQQddpKMt4ZyQn_q397aabxXnB z12~P4i_JxT{%BhFAJUm{BxnQQoXV9yV$QO(k=@fq7Yt{k4f`n~JJwNQ_~pJ@z$Klf zzOz5|hjhb#j@BXSkMKah&v%PH>Hm&G1Da}4C+{@3xQQMnN2OA~1E(Q-#R|x?61dBy zd&(QvHiCAz@7#7sll2pw!T&@uMI1zGW9NQj?1Oog`UjZaB`B5hi(t_h$AvAM@js*Q0tSt_A=J~vP z()GtJ?WLubI6We|K+tu`4+QIH?UmPTRY;Dah*zk5V!0L-l}rhjp91FZ^#gmxgq+y~ z^&u=B;Bx(+(@6ruA3=h_evW*WbtO9cWG2EE1Ug9xo&#WHnc8xr0 zS91x_yF+agfubBJD$sHn(E?RmQ7b)aYakhkHNYUF5n+dWM3M=H0uV5aJZ#|SmL!E) zwOL`yhM8n?oK%q|k~8x5yi?Y_#iHMO1&P`CQ-r2F>}k7X)glKz2R0o9kjZ^2BMvpl z*E10q>F|{**J%$FdEGnBTanpGZE)B8;%_2CG@Nc#6Mzr(b}*iKMVeSVo0U|%n2M>;SnRq zaDdNdK6z&YvnB-j5B9+yijRsY2lO#-vmFy)5GF{9?xL#X}M*OYHFO5N$}tSx`vb)}`HGya1e z-sJ;2C4jnhX|cKEn*(-aVku8~nu0*?g}tM`Irkmwg)y&pOC0{=KZ>f~qfCGXU6_eF zYST}C?3xhk^Y#F*M8@|+Df@Nc~qjONKt@4Fo3vod20~qV#S{zeDago+4@#dQ`YwE2?hdl=NYDPU8(< zicSS-1X^pRFIhr9*}m{UJmzeO#QZDaW~Flrt6&wu_#>{&7gePf73L(_2wkBWYTzqC zBm|{XN_5D?WL6vO$sl3V+D5xe0C7|i0JcdaDW_&Y)n>^;ano;z0Oq7Vb_+m=?r<>M z!>|fUYa#}$0DN&j%NSf0pk0eckN|mm4o3M!J`^Z|DW0w9RAojE{u(7>V&_HxfO+Fb zSMobpI(WSWz41VU7afmKHKF5NZgK*t>V1GA{>*XiaBTYHT;7C_-`mrf_<@Mb7qzhCgz}?R3#UocZ}rw zxBXF(nJ=%b>iw3M0^z54@p<8lQMv&cX8gmmPgL$~^Yuijub=9sF^V!ZWQpgspc%Js zwTAGIMW}O#S(*ARVnjmDi3iI_ljPeQql!_ zS983FKk*ZxPF|~krnMcocyHEV7>#36Kr|7JGe09wG3;b zPQXj@wOKjVyj2&qo|jx96aA%UT86bw3Fs*s{(P zTAMbc1KGn>Azi{IG_p|RCk_Pv!SrB)Jn@XeMw@ePVg|Xun4|XSwoy~+u_sY>OIdaS zR1R;&6f{N-0zD$dHL?Qh_tYU-I2>YqNMi0Y5M<=k@@K{XWS!cS!h*5VU^BKU7AT>l z2VZ8hs(T9hg8DX~AN1Ov3plb>|zfT>{N3Cf)KTXq?R=O1+7+s{KeB`=z7NPlh&WP#IdJo=>1}3nxV|48@5EwsYEAj z-JI~3J}cA*vtN0hwmC;qu#Ty?`Z@rGcz>e%8Nkn|et^}qZR~-o3 z>{)qUeE)7pkvRo2$nK&9`oYWU$e6E!RQ1_j)s60l2LP&a4~%Wpt(`cW#Yw_p2x2Z@ zR+|0@vy^t}27)Oz;n6-<;9aO!9utYW^mey1AStPJ++M!G*lMMr;Pzx+8MBFLh&Qnk3#O8foIp>?3d3ETR*2`-mwqNFfM> z4hK1GylL@sN`IK88G2?KnDrrr*p*eb{%_ZheqKeM11+#<{@7yrcA4s-x(V)r4gVB> zRhJs=dj=<$oq_&7twZSh-r}-?9;rzyr}rv!h<6&xQ>aRzGcnJnh6_ddqlZ^pmFZvUB=_XaI*N%%Bak{TO`ojN+Ynb>?;fCFb z2dZTs7+Y!|30qfkWx%zNOmYPz@IbdQO=Y81pgPu~=>yml`7iMU+BCzbEiRQ|l9zb6 z0goga-E4%2&uLd8x5()>gla-kw*7B%($g%&P^oiMt>1Qoak2O_=K0r^pgUp)F2IS> z^x|AR^hd$TuiaC}f%XvC-)2rvqnCf3)X%;w;5yQVkv~>_^%_}-m&PQyGuTwwrpm9$ z+~4DTW(RcEK|G-r<0c)OPf+?Ak^#8F(6Pgv!1G0qQsuulEJ zHOT5~L7L(VnDktnj~RYOw?V=d1t}3I&Y?!-AEJV#2ZkQ}wILLD`Z1Jl>-TzkeB4&k z)%7k$chFJ=UcoiHgC}RN#ie-5ZVJJJ-alcAPm1G?BiDomZ!t=2Lpk;hErU42A1lSW z^)67SYya+Q6c+B07~9KEB4>+=4bBXFe2)}~6dH)6I&kS9l^l3XrH$b6 zaCNOZYDZGGwwJOokVM&xp%oET?~J1DPmqsAzXBAf0yc|u*Zpa`{RGvQgz&k=WRcEV z5>%akqYURjfrwUM2C~EY(6LUnrJSfv(rVrbKZMc5J&&-{bSW)UDc%O1TwY1g-Dt*4 zJUl#1AbQ<2=g@kQ;AIlt^QJCTS(wbQ_L zgl2L{%93+`d7T`x5M~?MG9>&y203@K{I>FjATL@;<>BHQxo<_V-{*OAX`|j4T|CId zLjEHf5YsS??kbX9^f!k#0&=9T{f{gBS*QJ0png(KEMf)IOG?gdC(h`%iN6-Uj%F^i zzhtqtTA&)GHop94&_9096d*h-^tg`2{qI*{QtmKg$cdj9q=jJTjP5J94HJ*?AuiK& zxyB7faj^QJnk`+sut`KmCzF;uolUGcX+u-0fJ2S(B@2&nHs{Z|BZ&LgFb!JC8)^i@ ziguVXZ`uXnnuRy5t;s?Zk*|Ms>?raKI`Hff*dI^njnyXAy9%}SXbJJ)Z1|Yi9+wpq znVob%^5~_G7i1LPt5zI-CqF~%CheG3{}%OQF~?DOyPm?U)qvGwDsBTt+@ z`sy)l*kW&xeDuX?{u?pzZ}`}QzUBUF!mK(3r^+;JZRaEVivXWa|2Qnkf#ke@a6KZI zowvEiUL>UnIhQU9yak_%5`6!$*;*&e%6fUeKj(svi2tLBtM-@{Zj_D(LONP`exo_| zC-tR0;IfU4J3+-d;pJBf8x06{hBVaAj0h(46SQkkOqn0 z;XS^p5NlS?L!n7qH7;gT7zOOmaqUQ(21|(S4lHOva@K|{MQ^N@n6Cp*S%vmdFMrJd zX85-1ym`V(*5!ifUl>tQUUP~xGO_Nf-uveRYbtkectwGmZ^x;;`Hb`hUD z<6xHGb|`viEdEl{ey(WrUbr$yUPf6J)#vYoD1t-~s!C5Oj7qRk{>#ftw?lPTI*40_ zj({SZE~WtF^PjK~e&8U92dUUVJUN9;^Lum2F`5rhMT8=?aq$sr)-pLer1VV_z(p8E z3$bN5>pjbZ{%KALQx>4ROb8$Uyebm9{6tXf>30n)2*>;X_s)QVd<_Nozr8c`oy#l$ zfF$1k*E<6#n^>diL+DXc<5K9AiX4d?*le7dkqe7WwHx&x1$}4Ft4n~=px+V=ERKg$ zK!FnJg*=c)Lc$NYBF-+vK~7~$PDM^WdM4DRwb1qWDbP|uy&xo%oMHZO=T-ZaV`JXH z?=;tC`X=WRkl`baL{5!muOm(al(pFrcQ%L&o*Z0Fdg@`hu+0|9=*pi=1yIsQw#b88o z_qFEt5{N(d_5W~ml~HXq-8yJ-g1dWhiaS9{aeIpvZ*hm>R;0KFD8(gEytuo&6?b=c zzvsLESSxEKhfHQ>?`JXEn{(V$vW~%!A$2T*%JOj@ma*0i6=2DNq5-JMKQK zD?B*Qp^OX%ArV-su=oR?i3S-c3;`#&j9no9wM#?jKBZ@x~xF$TDg2 zi&?r097sxe+HV;MdX&ApCh~9|xvtgT>G`_V7fpN{f=V+kvxN<6D*2^(GjZ-i6I^O# zWu?1)S}2sqxs}xT7$Vnj3zGaYJW65)G|YA{-A!&sq!VO+NCSm9hwjm7KI1|NGX(SNCLQEHNE~QqfDtK$e_M^v1+zRo8RAowmvId#`M1#lo7jyza~M8h0rPfKH}Fj z?NtQBMT=Z)^#e00h47!KyYRU8k*BAp#c;pSf6xTlE%Ad&;Xu6boHrzap6+;i&9a6U~)_IHl6!#Xey+>$SLLN2j9_JDc9q~w^7`w&_cY*7h?AD!!|oC?cs=Flz8^!(QQGwJ!GThT zU93T*=y+*+VdHHclpUr^b>lR_u3kEbJgVlaA)p0nF2B;)_%O&{EGFR}kVt8haHkrBuDB3q7*M)akT3nmu$j;NrgeOgB+l4SUizEd8Q zzxLG85|r}p{1WF%c6TNvJ~%A>2{tqaI=_UEs#MH}x-;O0UtR2eP7HF9W`>oa+;{aD z6g@d4EKcak6yg*~`UJx>6OVgP;nT-wOA}i|SRs(#JCp$y7%ie5EkZAQ(QqJ$Ib49K z;*hih^s)#VIp4LG(t;%^ts0==B@B9|12*664dVOxsNxZLIDv}-o{Mr0%2rhnHAAIo z=LZZBZkz^rma_t461bJok&r3)_v^Uh@US66$MDAyvQ$oF$(1Bxn#(-MKLa`$)xbD- zrXGvol{w*T8Xr%n#$zN9KQZoglUFRj#VTt*|Ci=H%+?LhxqFBOl}Q*q@^Qjbm!%Bv z?*M)py1JZ7$!(}!F!ew%iTLXaw7&+?MC&zc~|H)tC?28o0Un2Ph zk+5ibf>n?m0_{7eL>f!Wlf_z2Njfzo%+VHLhw08d2ZPZ-+nntiR-E|^TbE8fZVKGFore$^72r!j#39^dx}|WSh3rA z4dv-EQaDgT`o11i7Gbzc2TgSB++XMXEQITmjs)y;p}O@jIb7C>yI252k=CIt1ejXD zqfGf=h-kxi=m&!prw({i?GjW9Cy%5VN-5N_NTvUH^U6b_QgEt_Q^7B12wbtCe=;9Q z12M-mVU?c)Iga`cP|&v}ok zIcS7#Ur#9#N%iPtT+9PaQqlxn)S<^trc1Qr`-rLs&5(frD7UQa1h`np)GN6bxYK&g z;C_c;tVu!k-v{)ih3tECO0MxMkXa8$1yJ$kTP?ymjnBva=cHt}SW{GOjaXo0fFQ{w zBTfG96${UmA3orRg+_*K2tz1iFI|ex=V0bC)J&Yy(K7i-0ag&4q@cUrPRMi0L zrf;L9qUselI%+*^DMJ~?ThCQ0&T6v=yw5TUFaJSYv2nW&_Ooe@nMG5;m;OK)v#(oi zp5r5&Bymy<7D)ID9d#@fNQP0tw>H0!iV6#^{52jmM)n>3@x4 z6K_E!b^!;}cuCcF)PAkdi&#ZZdPR90kigA$DYZ7T>@!#McY9@^wvy9QyhX^1g=h<7j5E-{>7##EoOMuLUY zs)%HmxmiFcvDr8;##TAdIY;iHT3R+>w3zmynRgM~x3=)4I8-YSyI+5u(;vom7d^2f z0_6{gsDOdR{B?wYh=@c$9i|PB_=%-eX5DoME_;Mo@$NM&iB+5Q9{%oC8DJFH*c>5& z&N(3{ndw7h9Xg9W+W}CqH9T5Qlt~L%8i<;YCQ1&niP#|+Zv)(|@Srg80;k&V2UJOE zC>T>pI``P_f?l!(M3YYq^HJqVeU2YL9jTp)`&j?#5LM}pMgz!)PBe!6qz z#qGS!m&(>y3;XeMEW%D6rLrDSfiB-1&FKRhmo!Psk;lNhepv^ioh(lu2fIfKj@vWS z#RWauF0~bvlngKZ+ziH)!~yB$i(ca`+0#ai+6!pYa*l*c-};=XFU!ck?J<|-fuzjL zi`0@rm|?^a8m${vzO2}`69mrR5J?|f)IP)R)@V2hrI z868X#^9l$Ie;$=FWE&rIC-Uth@I{OYeviu5_z zc+)C-{AZqp--b&!5D-1*0u9#>%k=9{FTV(6nZhKb6&`3o9ylCgu$sOVZ>$nHn7r4O z5%5GVc--)2qyc;o^4C;wZI_hHh&Xl!!LMzK048yU;Ch5>|A4p-5bQ!8iEdqe$oh9^ zPG=Tqy=>6D$~{IYUj1Urb1$Qwo)|+M1>__!`#B@w5DChY#oZzPkPn70ynN08SMjAP z>3tPKbQbN)91RB& zEU-J=X-bb#m_X+mL&D&8j7@oC=q6i;neV*^maWoiwO&TJYa7f?UoW zEtI}o8h@cpBp^li^LPkaC*Pbw&|7?<phZO$xJRCJ{IG|YqigP=Q zb;Su>sa?QlJuqc@n393$Nz9D$q4pj8?q`M#$crWGMNd0k_DxXSpPNzoeOqw<;&o5q zl#>2zfdhU)^2Nt~xv|pR)DEcVZ-hyIF^RH*go)Gi=nIR8yz%N=;CnG8DMo&eb(oHE zi=3JJu1bL^hCr0_v%N>OlR{&tT`$>fE`~w`*~kAKM`=C1!@30fT&eCA`S#ars5rL& zcQ~W3qY@3=B-|%7Hlr+5Lz#we5sSHE%#)v$Zy)6cVL3A$nnnKC-zo2X49rZr;ou*Q z@@50?yE>ZfmfFfoN{*;@)+$D7@1pV(2v|S&Y+c;<2FDTMLO6Q=r4?8mLfuupWL4J7 zdw;FXu>Y6$(a{q?wX^!R!arkn2u6eAdEUN2klPilq{F~L(HZ12T08xK^t+7*-D)6d zIK2Ay^?6TXZIHNmK4c-;lg;e5={_3H3w{0aW~1N)8H9oJ8lKYyl!n+^^0b?4S2HEr z0!K}Ln4p$nK1Kop|N98g&knti$npD5W8S|WId*$Yd~kwn8VY^zaRT06XUkW0%rWUM z$)?+04PcW&V$H(8(93?1qaE;&nhkFJw)3E!i)X-tCk;4n;Q~?=Sd1iD#Cj~;nsoQEk>RlV7u3A#$Z!|Z0z$xoTxnVK>+e7-m4QWD=(-c#F>r1(uyOY z1k=zyTWxI?)K3U%n|`a65C5$D;6yhcyqOHrvK{G)<&PQm6e4YRHtP`jsMGreSip_E z>S`CjUJPhaQ`8mOJBdYBGA@dvKEVXEKMBU=8)FVkA95V&x(xk13SqO>Y^Gx{;T@=# z@ReRme5vPsckSgykyjS-^un@9D7dEz_`obb2jKQZ?>D{D-sSsaVF}(Oc$|uAh-1Or zF*B*LtOf@TKeS=*=G!j4$^)2>c5LlgF|u*`=8V_*w*RlVwmXetF-$eGM67t%hhZn_ zW&zU=uxrfKaIWq_DFPSqBi-=`LbMQ$zIkV@wo7quP%GHjtvB6`c|ew?!&35VpSnc9 z6^52$%xNWOcv#^iLU5dfJWGnELWLaCdis`?cI8lTN{GYPNb*TbW^cU})+q~tR-BDa z6C#+v0s1!TXEJ6>83mC$$Gh0+cN*?8$|4lAI$%fkbgq`%kJ%8ZXMw%vC+O5ir=AAr zCA{)9gdoAAzavgiA@(Q$#LN-l!5LxVt3Fxtp@}*qF7osBs`O}QoW|`@Q`+?KEgD|NNlfIAHEU9Lun@w2*REdx!?W=(v5A!lm)>6mA}zq-Df)U(xu=mTPoGV8ez^1E{PNoQD1}HJx(3p_Cqb{U zpLcwW4sl6a^P=w{eW#qc;enYn)phUN(#F>}@2{rdkPS72uwX_f^pIW1I(`wekeA1E zT!Ga@;@DZekzl^fy1y0~kv5q3Dm#9jKGNhLzp4sD6(QutxBSb7j#oFOeE%6*{LT?R zn}+7=H#*7FIna$$VZ1^J+Us1?xq1|Kb^6uY@$vCL|{g6?%fo%&~JcDrbSE4yl&gPa^XF~LJ!W5bPeN@4T<%8vLjW2&g4Z)a> z)1*pgR4rodh5nj?4sQK?q`mOu-z46LBDI}~$l+qQ6HxOtT1$3?(sQuoREH5@ml9h? z)KrC3TBMqoIhA#8D#6cHqAH+dwpyG$MOa-8ddb0CD@>isQn~4IDlsPNe`G};vkw?& zBdExW!^K@;hJ9zGSuujQoIpio{t<%aY6hJOE3lHVv#}9r22l0s)#>T4hyXtWwk*lA zv&X9(x$$XR8?v0m&w2TQsIAi2(rq+ZYFDL82)J6~(m~8;J#N|XzAbp3OQZ%qT%k4(>@ z3{GD{j$De~m4jNhwn*3|_IGm!W`&B@wAsl>pYtEDU zn~^R%H${dvaIo-=HTLOZd#6g$TAKAKv+>x5hNbL$0HazhjbO!4j+-jLiHno4w9UuC zzIi6mGvIEwu0P^4mHjLzPpY3dDqhee{4g*HeU*h2GX964XUdKj#q!fP znTwBjHTFNK8GlMmoQ|K6&wJiCPo%7=J4`TtV|`(AN@dPcczKsZ2@t#bS4nSMovjMPN z|1T`>{^J8BQm@8!7NQ*Z3V?jmr@WM~J})8@j~q0W>n7jC0y661+mj^=6{m2uhmmj@ zc!93gs7g0FGk@wjuE=rW8=Iog{o-#&#P?o%0q&RDzrfw}InXMdnx~P#uI|Rn5&qf4 zQdo2uC6l_Hsn9M~E%)rfJ;9 zH5R@NOdteiDv6knyqHApVaj19J#}GodH(J}VD-W)^wH>(w&2+2Q4ER3^q8OV&E1Q> zOr#K_xIjvG`IX-B@ed!hBwHo})OxZyZS8*>A4}BrUL@qTtDF=Q{vS(@vm`!WUZ<&y z1j8J$T`gfxCWAEst7+(GZEWhG{Y5js?hCS_p_Ycp?)f`7=1Py49%+kznVP~qyVX0@Jw`9fJVL&r$(y2Ief?$m|1F3!}87e<6Wx4 zzT82IiOW)C7aokbO=K<1-{%vNZkx8K8N-!=L&K=+;m! zP?e_%&Bh^Co3Wp!DHB+UTEy{Yi3IdT-F{5yi8iOV_fKQ!yJgVl7R&^X8|aXUr&O%J zjq`gBs zj3`-{1A@s#%XLHY)U}?e#}FM29JCbP9ZUGZv{1!N7lz2f*elv;tMYGU>qe`WjVnpX z#ZDP6Y{j=j1;(DTn4!8m4j$^rHIMhH(G@4Fe)~r_(vcsGAh^So%gWEDh3hu%CyQ?X z5K6s3OdQoDCxe;(sNoyUb1=drg0)(GWevbls#)AB|k#iu1C`L)f`-09LG-1zvle{PBQQSxn z7O7`An&rCVYQomRf4Vheo6?$7Iv<{$>UMdtt6e}Ij{3YrhiVk zORLs(59oh9w2Pl+nGp1XSD;y*@-A|xA&4TZKKe#eOZ}e*;?V&lk4Ef|!0+gI887u? zS`8|3&SIO&IIyf5Mc`H+mEbBUvxCxj5LLS1_PK}Ks);Z%efoO#7~x669{2srSE<-N zI2U*$6?$AEhQv>9PXF7URd4TBj^Fa2v;C}h?=URhfW~F5s&r25emzJvrrzQSambGo z23-}VJyQKs^A+ni-I3QU=L;lixaIIeR@vsriL`(On^GpFu;6{{=Ig%`z4z@R@55mV zG5h}s2GIBS2rjvm4h&U(R1pRn{3$ETt^<`4qqB`?>bVp(HtaqGW*ZXK%VutDXK$hY zSD^aWpT_h%c>{-=<9<0Kg?_=;PrBfZg8{n-zy~CTs<_hTKLkfeKF#e*@U?&3l;gMS z$2UipIPhj+fmPd4=R2wq6%(U?$7cZAMg(YspA`;@oe{FNq{E(N3w>Gj@r3hmJ`DC} z-KQxyJu^qku52&bEr`9eqnk%OZAFoy3^_>~AaSJ!pP+WHlaIV}RNpo+Gx73#A$S0~ zh*(QD{QmcYJ>AI%IE8G)w5gk&ZOvIe?rQL{f^<%?jEF1ZfznOo6^m70hdXRrj;i&R zw@7DT_vitq?izZUh+(1WiT;Qf#02B){mqZEaCbBZ-!d zx+hkcDHgVw+UZC;zVN>bGE9FnYRnG;6|T>q_zc4NaHTg$t4dWt$a3j+sky1iJ`?!| zIOIJL#0GHtXcP_(IC8#ys;A29JZ30-o9D05iSBjLBz>Za&1RXg)Pb|56uOj16+>vR zK!W^$fzsmr`H#^+f2`Re-r6aFo2>ovS1=it@h56p)%jjc8zW)I)h_oCUcx`>Gm*Np zsy|7vqLDjxcPBDbTL^69Ba)I{lZdE;_X!~B+RE@MTnhs93|K@-cW}IOlwt~U%||59+G?H7eI9`#?|TZ6A_*cmI&$sm{)xO%0!7u|7ro_H|z=aVp& zq3WXxHphgn7R{kSz;GCNm|{NgkM`HBc$hp&{JQ{qS9hmR2FMnr1adGaI>?x&j$q4I z!(lVdNie*!>ekYgJkC$eOwM?1J&Wje&;7QJ<5kOD`TTk}?>;1z=-No~WGbN1e?7T{ zed;ErT6ZyVaj`P17wh(#&-3>4iJW(%D*&Y zsS1#US^b_zUsXlvR2HA|L@1V+x@wP>6`!xSo_w+ifP}IB2v1!Z(5d6mQM%o&yL0fi z&a;oyGMK}!vXhB2QW@+O>bF1gMsSw{Rr4DVZy_%}kyz#Z&-3Z}}6rXCZISm;l9Jl+{WGXlUH zU%Lpj|3<5y{}%~Bu-chnbB&$>IMRtwoOS7Z7H7Y+CKwr?T&P)QmcIsPVVa>s9F4yiy+h8dDwCDNN zLy)vPA1Rxm__M`my)XppC<+Ait zclu@?1|~m`XyVs+h&PRP5eI>c26mj+mTPTNbotBnWun*{j(ZKw-`UyOy?sJyBn17I zV^BfDAYrSvJLn4xnY7^7r!Cub9$ljg3!f-{QXZ^mR;hs>G&JfoUKg{o6J7Qq~9T8%Atf znHJIa?X=CrvJW^iZce}kQ-}7=CN2d{;LeHceOBy9BFZTo%5}6D&VWmyeI47;$x^)oRXS3B7F~}G zpPUvo&31|)+@A!+$bCr;bnrjYr#a46!+*gl4!kEhEHZ5ycHRHpkFM6Ab%%6zl_O(z zC7Jr|m^h8SF_A_awgL*}A5R$t%LDd;iv^>&;fT&8ZA4e_ubB~fHrm0K##V13g}!Or z6V~bZhyTdaEPrBPvNEi+Vjn*tD(ib6@u`Wp$>jd~`gI2qRu5PrEpMMrZd{e-!kr&3 z(y*YHpd7Gg#R*5s(2|?8({#=$TI~n_(;D$oHD+8t13i`_{Gl>q%#OHQX}a7K^Qu^Y zJo#eKIpTnpF+k|=8*3Wkk+`LT9Eu#KCHW*lTI){PSa}!TX2gDe zSE;S`%1NI%s5&+w{6W>kM<@v={J-PU8V}Os*_J=vC!4Wz&hdN&T@K%&5-J)YOkM!e zj?X^dI)DG+N8&``Gs#k&(b~++O}|15ULFZ(Pg#xbTiGd9Qabb!!s6}ECL@`L|ABgo zA70#1^;Qvd@CK^^=J0+|MIE{q$Xp34yk*0Gebvf#3|irvFYc&@t6zE}T->&)npU+@86FYsgO54iyD z?_Y!pHz$V_7WMoO_a2FQIrRd{W)o8tJGTam`Kkn-jNj@C#q(TJqeYSuaE8uyU|zt8 zrmCdG=E^evgBd9ZUkj0E80qO88;`aEFZb;x_@6UGP0^%fu&o99a#pCdEGsWvHoU1> z6isyWq%kCBsSX@%XITo2SuD4RW0HP;ee)mWxZ#UOLRxQZR3G*`5*CSgb$teWN5fAo zerlx4|890z`*~HgNrxE)%`_I@d2<3_PkoC|8U!u$Ccr4Ho=@33R^L=?s6tY5(ognU z6PZK!WQi0e7o}*Up;t-~%fiw0;qHzJ+mC}SpP)ddBLA5Z-Yx5^ZpD0?ulJnJ6aLmN zHz$^A=fbNbVWu7Ib0gSRZDLwt{zT>Sm;hxaQ(a06lz z)te6oi$ny`IFNG4#0=wHPhZ<3txY)FfUXf|8g|A6&CQ)1H1C9sZ5Bv-c$x}_MHWfP zkjuY_tz<2!4}-iP6-8zZ>izZE2)*k?L|qG#))aBy8+>FVdX0V--4MqpE-%j>fliv-#x6E<}Y zUB~%q)=8{-NbESK_E{%Nr2yX4ivu+DR@klurnerp=wV;*_7OPmIf3}6CkwMG2l!mu zwK}^ctgU^ku?Hg@VxG$*k)8}vbYx25=jeidFMHwKYMpr6@fD{t>-5ILpuy=>0M5d+ zX4Ap?tZr5w0+xn^37B+^rKhfUXNiTp znNFUzU{tvOucJ6JUVE{Hx1V$rs{U=6KM3iQxN#L8g!TYt0HVfE8YQ1+u z+IvnZXX45o2`MhG{Bv<0PsP6Iw6E`r0YO3|{oKys~g2w=3-TmRDCQ$43i^)k(gQ0L8i7 z^sMmsre+n6oRX#klV8vaPUpSZ0hj8~o&m zgCm-;UfkEl=mhu=^m=-4VzvBuSL^KF>VO~>=X#(mmoDD!0&>}tO%cMEFt|&m-Z#$p}p}U4x;DUNCuOp6KS4* zErwsQ=eS6@o=@BRKL^-{QpJjF=xbY7x@B*aIT~dzp@s zHvjDfv`C}yF=PMe`(@7MTZqf+F7U{iLX>B*+M#FuwDI>~*mX(XEjC#0FH#*%OP%{m zLUdH6Bn8o|U^eahNV^lk=ZsFE!Lws4c`5<$1|JI-7njZ3B?oQrnlAoRtS-rbIgdUw z47D8x)RoW9^B3qySIQK{b#1Q9w%|p1)Jp-ONJE>WrKL+yd35yA-B5miNq2XgB$dBl zMl|;Jm^+EGg34W`Wz&Dn%rv`p!LIE%)Kk({b~QgPn~6O!?zx|Qq`7X?)hI-_wb#RY5rXY^N2fB2`?g>v~xO5O~GqxnJ2TI2)* z5p18FbJxf6K6R)OdwNQmbJANwCG$>OngzD;otFRsYqdNlfgOzD27?6j@ajd?TOxtoUZy#(oM3wV?8Ib>=6!_n920_8&yGuA4* zB`YF&#uqhiK_(d9#oAVU9pB}zM2n`DPzuPS^z`kjK z)2I#_GEYF-^3@#bywm*szyTZOhG6jhsDcz2-6Z2WtD#(M0?<<4910InS56UFbaDa( zAS$nR3AIOor;fhu4sYN@%t_dY6F549%uXa+?cAoamMH5ylfBG(eFi0-_Xz7<`IsQ; z+R(Wcx1(8L@YZ}m&LU>!xNkj4Jm3H@s>x%{Cy`3tng2c4$%qp)`xfkh@Fjj>|Ba@k zVhO_yB8GD{1Y$;dXZ#LE?tuw zqv?TZ4881dls`&sLiN+xouclIF#Dmsu1*!70xctChf`Uzn>e5xeg}WLOgA6nfua>dZ-o7ainN!5PMr8OHI`HoKnDM0gtmMUt z{}%tm^MXepI%De|%SKGH$qKJvr5215d-A%azra&yF)EE|Z;`Y1RkGU@m4@=Bf5t_Y zzi~v`<7Hk%{joIV9dVSSI-8&vVIF((2W93zGetbc3trwwGYzJ_5gq2C@>jhe<|Sbe zSoRcthF1NRRABX8Kn-}a79fV`QC(IRKj)zn${)7+d$eo4YCblhd)_rc2Z4hVQ-|He52{`*=`D=Y5u*w9@RJrZGf!e>SCtO0blioWVgg z#SKaShtiuqWXXwPQn+Src-O)MBIsEgbZ1hLQ)Wygw)wpE;-p|^Mt6#{{e{K5kEAZz z(rs@ouQlj*O$c4-gC(ySD6U9yQ)o`6>FS+=%*Bub)&Matp>*6~3q+2U{D*viSF|MT z492Krg3y~k=)(`PmiAN|1Pp;$_{B41)-ylh3|Bc4c|Bjk3~&NO_kZ($M&Wwa=Bje& z_({<*zwmTta5a#BHoV1^P*s?b74o-Vh}3{m(TLUgg{op?xRY9Zml9FQrv^~ZurjeU z>;=otxmoEZ@3BVgYIF0Zj)>~2hwPf8IZjk4~| z_#gGDV+*`RXb@AqUyqO8rzsW=mB#l*5^XK+u!`;V6s^i!b5|`Tm|3wZ1s;6VS6RMu zlyhXCueKPs{gx?SP-@VKyN9*OTz467ipY%cMFM%INg)rkk#8wfvq=~I9<+@f0x!XW z*-@aJ_Rk*%l{elD)M)v_5$ezmST3q}&i zc%KB{5%0|W_pmmB5x6pGYZk z|F@45=CfQ?`adp||A>uMdFC?{BZmrPG7O>Pfn#K*-YCG)>cI0zEt(8Is;bgy3$4o% zoZE*>K^EqNNNc@Yzl7l`{)#>`*xMSEJ~x~bPXQ>^+;r~lD|}c zX^~3=NHj(=EUgG26_+nJmuMjAsHe(H)_JTb>7%^PY4~5fY-FihA#g++ZzG>c|4#M@ z#ST_W}HAR=oFsYa3quH6V42ClA%Ir$1}>&r|@m%-62RyWLCMt#zP6mTYeZszOJ^mHBcjBo1A<5CpowJ zFD|PHntUWh_NXt!HJ;y<+C-KoAiwE>c{#QXx=YtZg4ov%4gsZgQ_Pp7`^f)s%)@;> zVQCeA?Vg;Kr~i$}w(}Ho8+uVxpq7O#cDW+wMper3a~d~HOpv!44{Wo@wtr@{WaDOu zOgeqDv$A>!NZS*(?>iQ%oG=UPC)N_XQB~^r==@-qznh?On8z$pDNA}7G`|1E|Ike` zP_CC)Ngy-($>y)1T|}L(0shyAr6!J3GS1fPseq%;q3uPYG8zcdvhlpZ zbLJSI$>MM?M9c&b1i$`gUz2%x(b2Up+nP-LiT-c}yG5X>+#e7woK&~PrDWP7XTJyL zTNLpCo;3%+WZ`MUd0C{LXl$YKn&!S|NW*Qp2W)x{k(&+Q`b}{ae@qbdaUh~0JEKUF z^ifE0jPD;DcoMYvV1a^&4fiG{CKQRyj)rstTQSzV=0orUtj#6^A6^mhN(9T8+Uy72 zav1nHkNHn%3_F`On8ag%@Gw7NfG#}uaZez}E$!y>EwM&|QWpzP^Y@bxgqvQE#8&A$J2V}`FteF^pmjC=q z#JMxOoVfE_%^mGi7FfvTN2Q(r(YgL+`TG{xeba7m-Uk0U$*S;V$1UZqOnB$TiDnec zc+>X*JG+I{*wU%7{tUbI%g?q|;P2g!{SO@mRMK6;3&K7(3PfLkhUk$)dAdzsoP~JB zU(O_^f7*;AIK}4AlsWZMokP9d6W^(0 zoYRK!w`Mpsvs87dk4q>6aT=PMczI9`Fy!AS7Mm|hbsVrB+$1CrBdi7l3W9{eDNi>A zbsD2tjQ{7Q8cXb&i~&nWQ%^H{dAxDTmoe~A$K%tGBNoGL5;hvi{DrQ6wMl;F3XO;j&A~S z+<%wwMVuqp0}=Ec2O^v}NRKtj*4biO=T1q2P|GqV@#e#J_7bDvwP86_fzlyc=>ZIG z+_NUn50P}P?)Y~uA}--|qK*&RVNadXYqq>Kf;X5b7qKWyi_6PC7i{QA9U^g42iFqB zW@K_Ih^AAUEY9Dj^_#}6{6454c9D0W?x$YWx)IiAkv{7?%uO4W!#aKpP>c2jOk_a9 zw5f+LD_j07n1e)R$v!_;kBf^C#`e#l(`2&3T2MgXq|cExil_JsCO%ErX5x$ANMdZn z5H{Lj?)G@d-s^Hh~Jh$P}Z5DB-Xqfwf%=+@OFMXK1fCC&!58MRhCm57EV>2=$j0M z1po4*U3CsRqiin`Uaou3^eb`DeKYiO7Rbh$1L96@Qoh_NISe^P)}zh>7h5Rzt+xUT zX`sRoCz719%rHZ;&-+%c?vN_9cT&D2QkzY#iQI zOHWI8MkOu@(VFx&q*jP68+EO9cI{374_e9@_hCprocHqq^7|RL7e0-l5@uN8gQ^F% z(TPiK!C})3vdhO1mY{VkZ%MNNABXmL0a-xD?7f#jb8hbk=nQ+KDwRPKQ4IMwWI8PV zI9qf7nqYIO(eZrIj8x9ZrOHjl{*wPzJ?}+Yy&oM6|5X3dyH)2|&T?>Yc;kJwM-C0u zICHeNv3a5g`K%&6L+KSM<|Hs9x5n5cIh^~`kvv3mJ7o3J^DkrX?0gTW)&4#mQj`bc z*c9%v(<-L|sO4Il?-SK~61ZQ3RyFt1zyracQ}r7i2y<>uG2bvSV(llmE2d9cI^HS< zV4}IZOtD=PF*KRnj&^Xe(g6*(&H2zZMaIN>k2JG7mFgRox35u^Mh*LIXhY-lDV`|S zm@h}keulH5pLwI)b5Ab91W+__6B_-`-bEI5$r}Z5^^FPe_QK@Hr_V%G_vy|&>6<4ynTY* zPZ@v@3M92{v4OEy?&LuCR3i-05vPf|xO^%{t;Pp8^!PdxmJ0_gntuKO7{+BD@$Tu= z^HMC7zL%KL0UX2|!Q{xf_k5y5@k`~QVK!+nv0PvqO;vC_&no}q8bTzo)rV!-{T1y zexVwVwAvS~n%`w!7VyZ~LeOIC<_IN~VtP<<-@Ot@heF|^_iJh59U>xJ?ZVFGCBc{| zGpUbcR;aX9vT;F3#xJ_02g6gAlZ>BN;WcDhkP%ER6ZW-m(|_z0kjh=*hPJ}jl%Kjc zs494V0f6(hq4qP32Q`uc0*#Lb<7aV0D*1bx1RpT3;8tX`?MQev<#8ebge_m!K4 z(+lE%Ko(2Ia5N`r6-5XIinHuk0KBQTt)zzK#77z3tPaIX&vtow+%rIMFifnk z!?No>l%Fu4YgxzMSm3XIynycL`gj3-j&VQXB}E>KL^ydT5OF#(8>$`^pz*!59EC=F z4nQ=G#QQxJzTV3y(c{kVx<*4UDL6K51ZOD~57al%lQleWFy*UR-rxV$EDhX=&V5Zs z`o4S2xDAy!y8!<_hM=d_PgZ`@3sHcMw;K4BOp@3tQyN|YnuBPd@yTZ!Grddhhfrjm>aV95XDAwQfB7Mer=wp*= ziNB{yJocexA}5LW330E}5&g8=`Qvk7jtJS`y&af8 z!`=2({x9Z&56ip#qOFX`{10o#RVIF!sEM!ctoNP0*nNk1>tDO}&r2CO!k30WU6pi9 zivC{WZ23_glJcj6gUtHdzO-RYM`?Jsmmdijr&eeTTe8&L<>5dEog}@PRMR_uIXxL4 zmcNb#8HK?OfWdj2R-v0JY<*OeV92x9bd5x#rWflcPeYU7QvG^+8Wm||&~dO2KPjO9 zPAU|rA|M^kPj@sSm}T?wU#n^w{>>ggYw^A?#-?AANwVfS=x2M<>e5@k*E?a+%j1h2 znSou+`8E5+w!$)#O!f~Bp zGQ*W->kV(~SfWLdh0UnGh{#pjD*q+TIpl_sK4Q$0{5hS~l#)_ud*@q9<>@-EK1yYn zMi9`#y)DVm=D3X6z!@Xq4yh@`M{Ns5am(DqPj)fj^X zZxIywOVVNd*zI1CIP`A0v%nG3s)Xi_sEykoTuP<*kr`|@3>-&kXJKIgP`hO zD=Yc6`!?YI#=J0@k<4rN15mVR0 zpj3Jx!RaXKaqcFwbv^pVU>jjTU*JEIqj0oLJ>kf>ng=b1y-viH{y0Rl^rN>wPghI>mUC8hbo&v#)EswV!a zEETA{$E)J^!7`;U_@gB3bfNZ}H1e0~^>f|Z|#%~lCN@-O^ivhQ1j48NT0<4`i>w)O}uu+NKn;^kf~jf#kVkRyClx-`|^ttPFSb>X>qd8 zYZH0{fbM=9h0?Wa8M6oL}*7`Zd}N}aViu7doOC@ zli^AoHtLqR+-H}6p)w8~RizRk-5dVxfWswnfirny3IcE={2x_k6&6R+ZQ;QQI=BY+ z;O_1Ohu{uDg1cLAcXzj7!QDN$26qkadiwkC&fHHwGu74AReP`XE)BM!E{=Ltd9%0u z>%U*xG_tR|U?WQ#>(Z>g%My|)XDh*LcCJkJ>a7bILbd8O@*=8Ipbeq#;HuMWh1}D} z*S8SSbqAL|V)qVMtZ8z(E8MIiMDE}$A*vwR3v%{PMR_V|uWh*Oz4)|y`7J~hi~2Ew zZq!H0Y*z2@+-c-PAe1safWS?c5Tne~osmVJbQDWh?D8v$%J7`2bRi7K$ z#+^#JI#{df?2%`4c?55(95cMPRl`gp6z|sG_Pheo#e+r?tRi^dSlC(Ro$mfKk{Pio z_?`jMmKW5hIz&3R6rO755@{KqG*q9<*47EEaL8F1DRBqy2&S=JC#)3`Yj8w|a6`u@ ze)B%zHsOB({KXQC<(5$Naxmw%7yYI0_-Ws5TQE?wKg3_XVf&~i&N#@9VV^S$})87|ng0UGVCv}X<8 zI)JYg?OcdkdEd^`k|$Wj^NUGUv9Wo2WFG;YzxVy|_sv87oB$Z)f*ed{6y;!kTsJ}m z7F6*FF|me6d#-U;qUjy4m&O38cC7|#D2@{3l)>KPLx z^Yl1weRvS^r-bpIoYV0}z zYievpNvF3s4Jb*|by2^0?{AkxBLTLit2SlpNW%y-@lnvb~oKpucPN-(N zL~T;{-}yvg+BFWz>OL zH(-{b8d}b!EyhYFZpILGj>M+zaucim&`aIhaX+~sq$wtne+pI9L|(TEzF{CbHxc`A zXP3TMugpXxnm-A>2GiK%&*O#j!V6}xNI`P{dOw;VSvyL2HPc{r|ArxSyMc2MnDCR+ zG90z>3q|h*21;DpRJUhY95=`E&B|(FBWHj;$h;$Ij~pZb>Od>C%D7)@{IMix2XycB z)9qy)A+wyU4Lu;f_sGSeS!kwL3(VeN6tZNDC{;)WH&ExhG}gPb@TFADZ|T4oIV=YZ zKcu6yA+G*twSg?wb{DbsY2k70vi$p#{|C|8#i;90{otF}@s1$5-Q7H*<%;NEQJd*~9wCck;ntiHdPh-kf82<{pG$ zErv}AL8{r)fzT6R*yO}D!mJJVoc&jS4eJj=maTJQI`!K8+nNC{L8rA# zU5iryY;enIjk~TqA-XCo|Ax|!)7=2&;(w&Aj=g+sQ`X)-zXw$-J~=uHY7bgZW`HH9 z<%dJab+F~<6j-8zgCq+xlBisCe|YL%T-;h3xf_-};D}viG=5gV&jPhp@MRA&sM&Lav;vLbnyx%Q`>}43n zs*G1}t!>WKXrB^YpG`uy5`Fvx>))m|G9?SOft5_-KltPwG524G`KM&2+W`zklIM#0 zYgMuvY+=!3 z7a+tFrX8}c3{>)kzvTc9b|F82`(sJ$?oluP&r|jo2XJEgCC#d?sia31?B@Mu=AUV% z^^|?(DX*Q;H76h0Z;{gxEQX7=pa%)#HcLz@;5?ubjatumvi@5Hv^~G87fgY*ji$Tf ze4kV=a#5R~&3i0XG3mzz^z|%NiVZC)R2&1G(o7*m-U9ul=XeZb)spcfmirJk&$==; z?zgdBmcU1%r zmXq>8TA&D5KP$J3seXLKdRFMXu@C#nIe67!rZyn^a$5j)80y**KovEWSYF`CKmDc( zRz0oS$nEeAW9Jx=Rx$%QT3jI#^;BHi|p`2~=232lQ z-D&5|UNkrGtrXK4JDKN3$qy*>B`+rx*2O(zvMcDOEjO4*LdwnkiRWx(ey8WNqOW9W zz()>aZ=pf*B06G{r$Fj=0V<1|9(ykW!1kk6*xbQv`AgROlB=_`H9eC^|0in-wRiL= zp0+ow$UZ#eZx@Q2+~QU{^=O?;oU&E1D~`kKIDn-ts+Z}Vyx@YrXd%d1w2se?edJe7 zSB(NUzn;2WZ4WM*?EB=73gfSRC?Su2Fi)e*d}T#HyIMyQ8Z$gRqw2>~WlQH%xUiT_ zSv{Jtb(5J^?#0p3<1OYMRMPN&WChZL4Oznbib7@0U~|S7t2Wa5iqU#DlcCCLnQzUT z%AU@Zd72HdXT5#r&TgKO8;PfeJU7B4*f7*`v6?Q1UC*5w=1gQt750*El`m8Jmj^UZ zrq?vA4&#Rq2SQu^+6l)T$<;ZR0pWuBPKc<8Eme5)u5oo8GX!b7i#;l;v!Xd z0+GjrT;p)!KR*p6aQEIR5Qgf1v(XsStcAc{y52D8rj@X=8v5qDe;rCeyC-up?iY*c zyNXs(oCGcUd=zn!4|(Mg$)^{{ZOv*W{lywwNJ_>Uxx@My)e(L1(-D5a0S#(rMKR5( zNj;H>|XClJzxYnTlz!&wPK7bpM_fxCLEIx`rUS zHj{>98G?m7I#jOfMEJ^%py}h2IeOXPzA?1?wGFHKg;7*yawaI5`WO|a){Zeg1JOrf zSc=dN=jQSedq(tErL@lfTX@w?8TU|L!`?`QNav^(e9b7QgpQ?Zi#p;FvJnFPRsrg| zKKzB9T#aO5{LW%&H6Cw5SGx>>*8Pp6d=1c*@2+U58Twr>J2NHtawg4=zb;Cvr{x=% zcb!R?M@0kccXJ@pRjbSyRq`6MPLbw{7JFvmL;PftC9qMrVDd(oTfKMUMJ;d*+LIR* z4FOIe+rc-ft4~gu|Ljjy_!e-nkeAV`@VK=HaTJUt=OKC5#|&(tts`%{4@z3xAH!yF z7bTt^ZbA5+pt!V%qCB@70MF)Ic>1hPJ|4LIIjsppPH?5Y;XW8K4teAznI&ARJfO4_ zbC&bwn_WKBs*#&{bGpyUXATK35UEm#)2xZOJAE-RZJ5$tk$+pf0pJ5XsTx|s7x`75 zG9D;K6#xiXIo(XrIw{NZ2&gUBUm1fffdVpIG5y7Sh360xflB$r81Da`utKe&e(p2 zPMD@j+rj@GeLC`mJbpw2*W}CiuJ67g4SVZ|-$ezfmrtFtd%<-f=NyRZW1i@w z^PtIsA(i6HDLOx4=a3#W8SWxUKGku#M&`HOTH^Dayv9r<{~UH3Ol*sIkY_ZUH_H@E z9>=z*nAZhW;{BDZk)-^i7ieu%ziws(Y|vM-F{?Yx!;>gO4Oz(p3O#@DHM(2hOc5o_ z`T%OzW-0gK$PngLDvZO8#l$qxzb8uzk-fl%lHi>ddw>&TIy0657aCL4JhNfl&JpKV zRBeIE8ga)C4~`BFLGy?~FB5~6+|_ZOX{jOvreROeD7fGa1=)s(w{v?zDrKRI-SnuD zg*0M9MoFQ8$ghBG;lt>wqDXW7;7>6xxOY<_4tJ@Rk(U#8d{QaB_xf(<7+dqDSc@+y zTPJm_zWCylF_5BS_S{a2N5}c?)}7S0OTm*w)=?CkIXeLI#M0PE#@j^aj;bhkn zYag5`4X2RvW_6aGg{kej8_VCoX~;ly#|Hn> zP<~oqSd!UZ^+Ub$dpNf@VHb{)^~b9*ATc+#maV!`WK*@%)!4$RsqLeu7n2>WGZ*fu z4UBE3bT1JP<~NdY{b$x$^Pwdl1c_XZ&9(WXBPiNT>tkkR#bXyU1TuF4pqXLyh)7$@ zOj>#G#ye$f;uB8@B?u;X2%nBpJt-M+adwkf!WSBHhqsyZ+solQ^YgmZ>@O}6s*@?$ z_DCXig&oO-q%3r{{3rYK)HKlSHxqGsaien3lEheRNU{K<`}3;jxSk*MP0=;U=6luaHfksL+{jJZ z&M(8~^;M*d3A8XC(uBK7RW>zwA4<1YfrNOT z;AUkfAdJBgqNrUc&g}%Hfj~Ed`=gvi`#zA0D zF;sgfAFLg4NkM21q${u|^9i@@D}7sIyKH}77wC@CBHN|w>c`X@z0AM%*vxeDO-ypc z0qF*?Lr1X`R^7Q14uQNdvM9)^VGf|djkqk>hYW&6t7HTYGW2=$S%mbM2tQoU*F5t0 zuMTlMtNs|T-b>+`l)VxemEKT*)7fY(^{npvj-FQ1*zq7Q_sYhmOt)2=#g(53PWuzo z`^F1JWHOV2kXde9Q_WC5b{J^i(hoHe!{z(Kn#5j?6Feq)_K8v89D5jld|~gfk~cD> zsp+8nU^S%ix8}MFiaRX@)%jPG0EU|{3Fh8IE^^~X^-9MRN=+@@L^}4!zhDdLo5xia zCciLr%9?s+qAC)nqLNPW3>WQ&qA_HArDFO|F?@D(Q zFmwQmi`P!vZROh?fY`lw&xQO+iH_f|dc;Dz=IBMlT|(3#60GI&D@j4zo5Hizf`dV`^M3ARO_Rlh2zmzVXP3^(y%j!+MgKf39kj zKuO-TwB+{uJQD4H{*eld=2H@%*^hasq8(mOFi&dkHM-4Sxu7M}s_oF+sPnigr;s`(eU5QI5XTXF#(u!&y3R=6gcc0#e9t^Ah1dUrHKo6C_OJ8DlujWu$r05ColnZ)KlhF}A&FU? zv&R90_NnA7oQ<7M{hO|%wWz>dq;Mq;6oEx( zr@)cm^5ZuanCIBJ+i{Vjy+~E*Dg#t^^7`#uT|;kObiekip$wDZ+OL2yC}5jH6V)B$ z=~k9)Rm{iDc2PgwuXcm6*OV|R!j^%*DhC)A1d8Z*Lq}wCpq`X^Mz7*pkIV%1$cZk4 zE)N68BZbsR|&-gQIPmqv{eHk@DdoFn`T)9{mO zi@v-AGZX_N@HeVl!?1Q9%*%wRDfdY3Vyq4$fJF3l*EBKA{edT5dTjvLYmUZdjXc4< zE76LJbk9yS4ET{B$zQ2dv1pp!oPQ+`tZJNa03b}SU*H|`sJce|ovOV-tLI5@*0+a> zE{@U;rtjAcELcEgzb$4#6V=6!tGWF_g9ElwxufQN$^Dc3qz5%1CSPr`c}Zp}_o(tT z9J~`@l#-ugOi!%h2MQ726IlqU~`|78&6-aXwCjotxCCS2>yK@)0 zO&?xh+qeYR&k_;~N9@fU`I{2x6$`~p9WIfX=UQegZ5Nq#aOv9)%3pgtzzd)uZFdBn z3{&6gN%3HPgAi7cU10RaJdsm35b}6pLl7`%W7Q*%n5RKiNoqArYsWmU^ws?#=q)bh zuOL%C#rH%G!QwpkLv=BtxTANHES;36Ts$C%Oy%`xQfVsn1JAM=Sq66y(cKb|)Z5gL z2MW4Bw6n{(t<7R<9h2OQ-?DqN5X9+MBeeNPkAJv4q(|?Su zfBCuuESc3{$k6>RX;}|a6Z$B{Jo7E&1__h@b|Zhp-KmX|kgt67mNt0`d@#9!DV~J7 zY?#}f19}EF;dMJBUc~y|7yr#{T&!W}YZ4E|oE7F4E|+Cl*`Jr%;f_`7e&=ZI$xl>Z zCWXg`sH9P4dJ|!|{odFTGE?+}UavW(&33(5b)NN19_;xU)Bzyp(!lj{@K>m6-bEY_ z-MG7&n_I{{>Lxqw?d`pkoP)R?%b+~gza2{4ek(Z7IO3}cEU`1q_TGt+KuTcD5b~IUrM9SB&-_RnTigXXj@T(+%yY(~U^5` zch*qd%FpH1r*^gUKe&bRNyfdE{=*rp@yOeuWb#W;Czi-n^k#Bg13qLkSE6_Q<>OyC z`|FwA!{>iS#jS{HSTyU5B@7?V*CjSjshkD+51S7?!J_(qa4YY)XFCsPVBt8FUmtF6 zgrOJ4g{>K9QBT<^KAyTm1LW}OL&J>ZE)9wH_;S-vyWNw^S>LFCUw`S9U=8SUbYW>I z3Nf!O?d!HBD#-+2d%ms&!z(tqUwv^%CZ;nzFSUW@wRL`FDsCvun%9trfy_q1x-SXZ zJ1}*+g$VQxqA!W`V&x95^3H8%zxaIaqL8{-fdY|xjjDmkzfX*O!e~({ZfpNm<<-Ft!nc6{->iX-k(~gb=%!VH~ECs&DNm&U=F{k%7ENgh~Fk?xX-45&kzlbPpkj3Mv(NHyz4fjk4)6zPndL z!6aHQlO8+SWT%({=I8=}>C?E#uaoQX6|YtCWWyJW(r=HaBXG0%s z4Ajn3W8?m*CbOfc<7z||$a@o#IbE0Ra@$v5DBpYHuJ82%)+YP4`H${zQ?uS-$f~=z z`R3;-PCV*Z?WNzs*%B)4buA2oNU`-Cv0?$6mM)uh0DWn^T)mPZ@t$A zN$96%MDvSW3*2%qzxn#OF`cfhQ)G;m9Z>|Q%!(|#S9&OYN4J^A zW8X3Va0uIH{a<=MTC{QIsGL>{C#hHmIMaXcn?w-eQ)caZnC;EN2p}9RW1B z^>bS#R=jR3mnv#^9@nRKqh3}HJ%XduhNnLvaR#7xeJ0x3* z4rvq?oJ)@}?Q&3fK3;D$K%hX>j?FK<+=4}NFEHjhxchv+oqYPP)YvIjx)i7Q9~-dm zaD75x;8|MtE__`#C?E#M4QB3!6?pbw*4kF3-<*H6G||$zP)x#GigFGY-6#I)9WvO! zIWZ&M^B@`zBs5Re*X(POihhswi{xAgl4iDo56|r;p;}=;g+2LL#u^b*;)N-v1vgT0 z_5_bJn23B$8*$&$p;9M=_E%+>=j*1oIHZbbSSlzBXY@yeuEQhhYEwL;?1TA7^2<~})$~YxW$mQNQ<*hdE9my3O5@mR~YT`^zT=y6}FZ*daLLw6IEKjDL|I zQS41ZR=0)q1+xl(xUWnCa=mlTNH3@GoYrXxj( z1ECU@{Ml0VRtC6RP3gwpUt1s97Dq?)R)Y;IZBsi>mRn={j{XV-8&|0{+1IbZ7*dt_p5 z-VtF^2uJMQVz8A*15q5!L@*)fWb)zb3IiDMi{AS$s!Nh$qOHA@NV2%4XdA^?I1i_ z=s01mU85PLSWCFS>DvR3F5@i`_QK^_@u8-O@l#eALP5@N5Tk*5()h`fQtvnUk1mWj zf01IsksntNwh^=l4#}k4lLJ{NQtFtOeXkR_g~9(6PouY4`xIPcL>)dKR9n$n1d)ec z&9A#P!V+$!k28EBqJUglYRBzhvUOh!{Hb|34ofIj)GRcENTUc%2k6p}koMdpuIzK* zKelLy;kY%6gt`l{rJ|m0c5@zr&p%Qabgpk`KMJ}QOkxF^FhR8s#D0YO($1YG5TZ+r zb^hE4T4eA~)Z*9|UXWfP!VgfI_MO*MadO|%1`UIxF8K*6N2TiCw1dQr>(9qi%^67J zKh@8F&vTSSB3(s2iq3tKV@Ji8B5>0E1hM}dS_Blc#RM|j0`E9TS&RcweM7C|(|{9_ zOtvRNEFv{@2CGO4`5v1tc;6+`%DvaMh3nM_R4pxFV%_*aZ3-k0frET#9~J#_g9aQl z#exOIbTzS)vX?Qigz;H>BgF=(L*q_r*NW}kj2$x|gjE@>0$lWja12{|{|@S6SUQo& zS$VWEQv6`vEaxoyauTd2-xmOPe;Pvf_H@Q3Si@q}b)<_(3aS` z$Jz4?MKH|Ye&~ixZs4TYx8oIc$!s!IQTobFdqny6mzd?b=EJLqg@_EFSLl6d3mbPL zzhbL?iBrPCttwNV;v_%vTt! z1Oxw9&peWJP}lo4v|f!gm|@ns_R<2=a_S3&KQk%M=2-1{7>x&Gf&AN@pEqRe(hat@ z2YQmGE$zi~VjA`FWbJ#u7<&;9?-3;`mYtuf_$5bV75wrf^R$B=SbEE2`u$&eYf0te z9vrOH?Dzb9h&`Ogv(NEEF~d;-;S?|nqr@cBb5bvYkHgYRh1|P&^K0a5hGo**eRF@h zV!NjE`TBe3<{Z{4j0&P~OBZf6_pJ(Tup&4tAY1t|THz$G;Dm8{~YVO40OLAydcA z+n#c*@rT4EeifU?#r5xU0P3$r#M_QXCz-oNLY0H@Ijgz1{S#jCP+2M_sNOf~c&0u| zS#YWo!aVeJQRu=`Iu@v~?3T}^i0yALN9dI=`>uO`+yVe8wHc@f3R=c*Wpa<_Z>}GW zqp?59b`sW2tOa*o5jsd(mZt_Jybo(A;}I2XY|*DXGr$({ug2RY`*G8^L5Hg)PjXb1 z?nQBLESO)Cy^lGSne<<8%ZAF}#$$8M*YUPm0aH3>M@tpvo}#lq791DtJRw^@k+ux? zltrTpWrXx!Z*vQRtD!u_D41D~51Z(4x}L_^V+YLy9G?}bMZy!|DNMC~l2lZvWWe9j zLCEQWQ)?7`Hy{J~ZLFDURJKKxNS>9pKdH*nvl5#}W5;$cE8u<2ykJKPI>m zgDf_}meh-o{Dl-_WeKK>xEmFs$?@v`%)hFkEY68J_b6G>$L9Jj<60u6em@aMgX!c4ZCL^S5^z~rlk}SjB|u3-_8*qVv}#jF~gr$aLiw( zbZnQd_@j9LT33kgYjKk*i_OEamrJI<2Aah0;~A_p$5fKvnP(?s*HW_hRaJ(Mn?u2xftbd z)wHy25F>ZbQrz}{5Sg_-&k9x}N|*4Wb>&%kH}>%8h^GRq`Btkw9&hS9#XO8P6c7-u zZ)|!)beg_NBA`&e5pg_sUrtH)1AH6)5w6C4SpCHmJJDy`h`F-wqCiqlcI{Bu*WFrG z^PbihAS=AT$;O1%ej^eNo>d-$59-Ej(3B&dyOO5DkAVj4pgv;KV6K? zBJSgHXIKy@8z$4cq@QND=8|@|*m>+5N9M@mHY?BW;6p0zRn^s$;VJ63}9XKR{K zJ%uhqrQ^1%gsG3YULVp7q;Y8Ze|XeAU@%Qe6bG}R(AkqJ6f(>Iy+e!l>Ae4N5UDGW{OBSs@v%?ygQ^$*ImRlpg21p^++WNWfOW{{D>FcFPnP1 zG=Ve)_+D_<#Nf1-ZA@Z76}A*1L`~eS4sJ7C*IflWtQVU4O&Y23>^4&oh895ulD!y} z6{$GGJHhd9PMg2t2X#nX8-|4E`2O3U)D>{^@KA}~hstlm4j=-l>Q6y#4RNl7{+7P` z4<(!?AKj=R_L`uK5SuJb)$q=8zD^bpFldag4gdR5T+bE`_nk?CVzk?&h{q zu59i<-=tg!3w;leg#@zD>k`ImN(d+G!F^4n#<#p9YyJbh)|T-xo6jYe&kYf=$03TNm2U~8AU`Eny${4If; zb4SX|X(?rL>Jz;glE~wQGUkj>pD`J#_OZzuDDVC$qP@omwJ?PPmr8vYv)GTkv>ly9 zgz!Njnw`Y%6 zIlwj1yFmu+efn%eLmI)r+(7i?wV&tcd?Ue6BwmX^6Wlisf$oQGEvjHw`%}Ds`#RCP zHw}|M@V*VvNnWFh5vl0f8CnJW5HczJ^5=d_CGuy8%$Q>lG1VKR=Jz|FXUdfki=Xo5 zUv*Ovjt__6E##Js4qK)7DhC`ixC0RnH)X;nlKP!BRj+CCwgpVqWo#=amr5QL-8~(({s&s921sG@*@I>r~ApwLQ<<{(*cN$y-U5&N@^f@y%e8UIL+Diz@=3@q6v|>iS$4g zJ3z0gX_}Br{9|hMXT1>IS%<{hdu-%&{*bn^TnSzNfisFMc2I^LAOpKt5UQ3S>P*9* zIbze?KNFb5NV_E;wCiBCSy&v~b|g)gD6meqAF4?;S`9g6IiJr-lw8w-pI%u3!Xqj4 zdw4!*6b^goHcb7nLCd0Hp*)8M7XT5vwEe&-=e;t)0^~msNv?pAmtZQ7&&mT2^`IAA z(So4FFb(_##$|hjx)BD@VA*(i0Lovrl-Z7=t-kLwmkZ-_>vk{l@+9KDxRE5FMBj3L z&82SoxpvRsMt}2iQ#P1;Jc)T$zExzE;ClMfFWizka}D#}(Q>hk{6Li!LUg3kK1`-g zGb`bxd64!c{we17w6oq6cI4m=4JqhAmkoL(t&Gj|$qWRs09I2vTxv*~%_<^E#;IaI z6?BzpdU5&)qc7{75DQ)nUJv`}K~nSM&t12pPj&dAx$SrAfu zqAI_eZi*svhAD*G!Da{llR*CZ`g+>e;~OsRGAvlph^B_n2#TNM0*lrt$#f38w%(b? zRfUyBh5;vb?oEl96TC^g#WfB}k&bVyl^1MGe?n^Kz`YW`PmUfCV+^@O?#(Q9S!hy~ zlFI#zZ{%`cDp!6CmMC-tP%;Oj@@ys(2e%alqimzT>*kq&KqyG8$d%Q*#|=53f>qoQ z69WVBft@xoeb`OZc-bl3CnJ-@yW~`J=oyk~USxBlSyTxQbr#WUPCOdT0megRdt_ln zx@6g@Y062e^f9^~8Pbh=&$c9Mqh%0oEa9S6Hc`V$IkPVvgBbPpUvQn;@l2<74Hs#d z95(U@4Yq(e!T}$V!%!tgeRu9(p7DI8hkug8Vu{zs0MelF@LO`l*9eGZ)f^kq;Y5}^ zI2G$Sd&_#-g8m%#-q|7&N~KN5L3GH{vxF5!c<&TGR7)3_NPKAv9xQ32jTjD&>c4CtNV(=B zW%;Y83o7)4f=&M2L$}ycL1fF+`w2&)?vX~@9uw9=IBBbWL*%hU2y*>AEo$LE9+!ll zU`!&g;5}HPVFrr?(4k_bY1_y9L8Z=;ro*aVNj`Ejpp=r! zA7!>}wBYTwkItR)G{<2RJj-rw=u6T3k(gBrhQFqm&dRD8%?E$M}DsO4#EMY1KRDouI-fgriQ^%E6p`{LqeZ!_6z z9Ui}tL4I_^ePN~qXku~gt_1Npf($=zaK_rtDjav}gcjiA_($J-rKaKWgPxX_KYt35 z+=>CpSa(Kt-V1LvW2RvUbQ;yV<(!E&tKItmkOhnDx^~NwJ?`f;QzAs91vw97rK52{ z(t6yrT`aU?tjlkAP&us}g#7YRl+XvPU(0EAd&S)cFw>O$YVLp*BcQ2$A56BDA$e|_&2rpYYG!BG+jpb}BrA^y#XO}o~>QFdw#jhJW{W%Syuvvk+J%~Wyjr%ojo zqKF=Qg$c5CRwVfN6f`RALGy>K`ycCd-l!FweFC%wI+Dz}&ziK`=lMcS7h0!}1#4c= zqrsVS&G(N=R!Z0&K6SGA5#o5{!F@e~Nf<*&USsfcB3xhm*9epVk-Q8kr+B)LDJVeYW0;XbDYpp$Ftq!~wj5g)pP$Qcz;D}cy<~=r zd2LvV(wN1b!egsM2t|CTM;u0C$?viXe(VFF%iaGlSbDr?bk8+(iBy!M6wMUyfHZ%t z$>tW)!b5@tJMQw-l*Y9v6M5Eu7f)^fF)8;1`i#)D%gc=$JpJj*uCDM_Ebp7m>idv) zX-UP{gtP}IUMDD`t|SS4MM-M@l{VS2OuFBoos9w>t7IHoEjb*aO)X?g$b%$peSLgK zM1JggE>~rN;PDS|6Nm?1R0Q5CSyxyKvi3Y7oChPYGK0XVNnQ}#>Rj01y(YbYjF{nQ z5&Ss1c#dNY&RCdEDtwaZ^*<^?9YTbWu<#6-+C>U}lTRY!^vS;P(`9&vjgD?|o zmjEz`NuKAkhFOIvyKuM_C(vzobDZ=WBsA=?|A(iyP|Ij`2=VLSAVwHJQ00+8qk^?9 zuQ^CxbqPcAWU3vqu`W-kHMu^#0r$mja5k5?S`S#;nxZ0ToMr;jz^|Bx{QC*Pgvc;O zbcppAuU{}nkwhEmx#R0|gjikI(9PL_z@Nja z4}r|2TAX2)))tU~SA{Azf7YV$=9@+f{MTsZiZR?keRN!vcSgL47PIc_0b)8q4AEC0 zgwf{1k>x{u-ax(N>(D@w*C!FsBh}$+e1utV9!d8((&Cwyc4Z38Fj&ob`qSR5^HKXl zkmz=O2r=sI&yAF%>+Z|F%@&8*Q z9VGBTy?zapNkVDHEMkp1NdxZ)w_@;5K$h2Gm(>pNA4qqP>2{AI0E06?|GdJH@6T#v zBBg=f!rbuVx0-k5H!89arfjTWtv{2BasE9&wHobCFPukzRf_M+eTaJ6_WtXCm!ZV4 z`mB3i47g5e4sW%u@F0zQ=gE^$R;@G7&cw#y4O<*k7kR;3W2QlBf0S?$;%ocACh z*JQlF_SoQj|1X!gIEgD71jl10Qty&Ww0Yf<10e?1U+8n0#)aD|HbB(?^WUy!}fob9b{)lTu+8GL@(O-2LLv6%bG&8tG)q zYJou*al%GS;gdR&&qo7`dZRD>M-^EJ&LqV9_6iWC82EvbH3pC*XH#*Y9hj}QNB}cT0!b@@_)5W#c0U(DH=Xy- zeVC?6^DXQ+QW@f90zq3oGC+INW>p8*1eF>+Ji5ysG$O-@;S!nzq}p!Q*|eixotR-` zg=(D$ZJ>)r8m7b^3m!u^<6yj&t_ChD#Rub}JYNeTgGAxg9+|dd7v??&V3LWVkDd;5 zyA7vu1pK~7`6Pi=eyS#e@9C&zxGkU7`Q4GkR;;A=$?_Y%NY zq-?oc{MKj$A?yQutV3!%Ch{-@$zdL6$jpAArYVqnB$;OcYKc zJLr~<^mAt}gL9^#eQm81vY)&F&Z6t;8116io8oF(&fIjl()chLAKjk9e>EEGg>edDeE6-_kwl z*Sk1K+01bE3JXOOe8s4ylU`VL+;8E`i9{p;{G02H zK`rAz)Ttu#C{69ED}EYBEzM*HU--Z$uOOe*epp(^3RRjbfByMReNYRQpR&Z;=hVEw z!tw5j`YJwL6FXo`B9AL!U9ue45chMm%N~Wk2<@~|fafVK{bXZ-lk2l-2Km<2>ne|S z%Z)=n{4x3~vdZ~!(8nwCy{4LFS1i-UuuT&XD2<3`l6KZU68&)XK)qnZW&+zI&{$-% z+KfQjMq5ltpamrgd!4u0s56}IMlFw<7gBl>WbLOt{u#H3^y|Bk=AJ;TLpee2yX*HF zXN3q}=QZ~ac_2RyXmt}RzF)g{Tfq!bQ}58x;yV;okp;aj$it=tLnN)g1@$VHFblVS zkW{r3aiv*`g}+=(KK6eA{d-dljwdb$dsIR6@PR|xVlD__cn8e=t1dVN9+}B3j0B8` z*Q%v7dU-mPSh(G&zxB9*XB9Oi@`o;-2r6PfybH;+gxXTTNZ7W2WSsQK z?G_SF?!_a0@Wr}OJ4Flox657 zSXn0poqiT21ft5f!NNAmvR*lM%`)*A`h`G8sZuqH#kD5#w_sacJa-bpwL7Yf^kIIU zcY}vEirNT`B>WWADQ{jdvOMxv+R*m`(w3!Eq4F`BQNf8=3iR*`CE4y^u>{>^XO9lW zub|rE3BQ>pFClShCt0nHS}# z5e4MxtNoqpoth8j2fJz!Bu1X^qtH7lh~IS(OXDoFcRZ_cC%{WvM+YOS&QC?wz&^^9 zSnG?~1=Zv~jv#i2g;37-KgB=-gS@6wO$Rq3@vK=`1}ok#E#p295E2YcaduGLQj!1z z2dwiZh(JxBHF)|J$p;OBRBe$O7+xB4(#G_pSZ6!Sar{Z^oQgX^7E-_V$Bj&4P zMNnJ#%v;tC`Q9Ej%z3X*f;2^r7`({kGE5=I&6Wd~aF};fk^q<7r&1{PZxaaLzyoj= znv~AIgf=Kp6FZ?5-g$}S#k#dd{jmLWzqO7b+*@2p2QVx^aTl{*C^gG_?6sw-gGzb_ zMhL?H#?}SslbUI7$U#0K_RW0%QnSvoz5kQt@qyM*Kyt&74@ID=W@(Q-Nzy(ee^2NS z;&HfpV?|h!Ny;LBABeV>oZn9nCSHT8B}|D4(6@*tNTr{4huq-cc{m&;KiwXZN>G#= zfdV|RVMrjt*0`j1IpI2!KKidfLEx7$bOY*W_c(ps|MJq+MMpv}A4~!O+)wan@DV`P zLk5zjfps*MtYz4AOQ;xWlX{?ME@=_Q+~Xu1T{H^MKAQRu$UT}tWvtWIJnvu~v4-VH zIs-c#wB3*J2QhyVrykakeUQeIt_G9`PkO)OhY=19*gB{aA(X~)r6~a1o{(`=C!wMb z*9-^bS|SVyvMACziCJAT82W+vA&Kyz`s#Y36kX*-hZfG4PW-{wKk%RTKotfFG~1zb zX;S3na#kX&Az-x3dGeH%wS3uJbr_}KVVC|nK!GIR=N$nx&#>Fm&eos=3sRv}W)Dl6 zExkOPQxwvpNR)A8&3*+U>ajqtfhuhkDr~XDYd1)wp6@#F7LdaBv88nw8+7_KwV=Fn za#6#hU@u2bTb}St3aIH1Z_qf|K-#3}ifIVwB!lNLl(rZ~*3y~#H5qyubZcs9vjK^X zFyZKD-Iu6BLCV<^&%U5#`TM8m-*Ve{F|!cIF6x*0q(Wf8RY1bmF+(%FPnRshVJ%<7 zx|raNaFZ6lLa(u%NR&bUf;2q3wb(brJ|`wANfJ4vNY_tyPTTJ30e!OpcdC&wQlx2f z?x~dy@&7=m|61^1W?`M=6-GU64pz1akLYj%u9(B|6l0gdyIC6~z zBO@L(erY#SU?Px8?eSgCKh!<|>q}(N(MK@26$iau33Rl;xpAC2%GtE>r+e2 z-LMRv`C_XF;TXPzGK>b!x;}FCa#{oFdh90?1zP6K!a0bLs2e_a%=#`}jIQ>K!{vJtfk8-ZG^0;c5z*uF z_nkx8qizQ@BZ7_CKZBNQQm;oo5YQqZ*zHYYbLz%x#)=>V?$1^VZ*^tE#l#$TiPhng zp+KBzp^aJQC{F-VqPaw2-eiGS=XmA434D8K(<`}o1Ex&XEqkjmg0_EEf>jgg>sKxHg zT;NozPBhvG$# zygzb>SEqUTVf(vLt8@ zo9jss^^J7c_t>`>d~&PGiirV=@`4Zvd3pIf_^^6#&v*blsU+?I4-MVQ(%-+pbvJuA zl4p7Z(iW!Bjl1Lkf;XDV&##?{0cVwC^jx4W87^`;{n_J_5zO+zo4Bbx65->$Mj@UJ zm}Sxb3#|=O@<=tDyON{|U`i^Pm_$@KM!pdWvOkCYj-&2zlgxvYf9=|}FGkKjm$qvJ zxCfUskM4k!xvxt(@Df6r&`=<_r<&|Lxsre*y4`SOc*GFo&kq@mcRW%*CA~mMKUlO8 z_^q0ahM|ZELMqz8uKaOLd@A79=u8wjfq1a;_%n|iA(P3>NhMgha-}lVj4?d@vAS8& z?Z=Ydaw&&C&$+bw&l%(LL^SPrL zm$IqJb4|cyGDc}~u?-`>DaJlULio#tNUb7dk-%18C)rz7{#h(jl9Y1Wfh!8`1`Vd> zaV&mUe11wk8;`gOpY0VpD5Y~51T;)WDW%+r15W(&A3eb#s9{31Z&JGG>j1q}h#WTj z&t=PZG6tBDF`9N;~p6ZnS3pP-b! zPzdp$rfIB_5x^JL5kmh7(DZMV+D{YGbJB63ox~o1+9=z$ZF`Im@-3W(!x+t zINl!C2pmF~;zuXbl zi z6<3L^MKa2=GdZ>iKbUhnQpr%daqtl-CDJt;K7Kp=vmrvrBbH^|+S}Xv-vx5WLQNbEl-)juKS;nzsnNC1M^12Cr% zQS(TqB}03`1s8;}*=#Txjq2HKmW0D$duV9L)OB5BjBR0zo$XGA@$ZY`X-k&(8G4{u z2-RLQt=VLBPH-~qzJpJ4n_FT3lrKEtrIeXKAaM5J;NTD*_UP$^LLvOUZCO?!nN0e@ zKl4HP{o>sxkw_%o>H>p;xLy^o0qWij0a&jSqW?2eMhHOErT9MSD+B_2BCvf{%H9`K z8ZYAnR7O<@@nkF(Te*4j=1D(DrpyCCaZd}eWy=<&_bl{B3lzL(=7rb|R`yZ-tWZAN1I&KypanJ~Hn~GHVdAc9R zNCW_SH2&{X{%|<}=9}_+qImz%h(Gw?gZEgL^&HOmeY&oD$w65XN;%0vvX!yMD*@=k zQubn}pc)1^v)|*Smgx$`DrVZSnlzWY!Z7Te#}$t8iZTM*w{OR}2QT29-{d9-QA(1Y zwwoO6rnK%2l!pIC$Pwzy0a32-%v}D-Ei;;nS-g0$#}YLc1x(YNtJgl+q6U3n-lM&} z{mq>7kGsVX1PzshP?#JHpg#u?em|x4-zB7v2$8RXhE75QP%IWb_j%3HDlp5Oz>1I-T zO_g#|+!AjP;VgVG0E+(&&X6u@Gi?BHV@&fr#7PmfT%k~C&Ka+16y*tQ+O(hqss}KE2~AX7ICT^aRUfG9ns{RwTUdM(T}ZPzy5iaWqn`MwBeZoeqF##5tmXP zptRxt0c5`(p5k`B7Fimsb&ik7xapBQy>(;HnP*^ zk@rxleL#rrw_*3_I64Y3oIvkV5j9sf7J|%jLET`Cp#$^Ku3fv#Yp%Hl^C@E97yuUv zJStrl1uC&tGLsq{r=T7w0I_I+N6BBQkCM4E}P%Z$u&p_B$V=P4=W=kVuUyLL_bSvb>4EIdI|gpgB4aqG~E zli4T$U`Z+Q6hoPv7dg8{^-H)R!7tDgAcXuv)3g=tWMQr3G{=rYLf9Vwn)gxK^KB`6 z8lB0)6E*_Kpnx!24h7i^oLh6Mx zazY&--YH^9X0Fn~WP*h4X08slTfc!=&4`1%EN+D=y+%)8rQfm&3Y#%0GnW_(%X%B#` zUcEZ3Y1;o#N?!#4$PY050yi-<>Kky*F@bp8)*F=>2}efbCUnP}m0u5T$bWIpU)R~$ zdB}U}c(0)ty{P5JR!tNGnznAR3N7b?V~Nnx&M1u~p>{=QW20<1Xr3;=?F80Y*=$z<}U zV_f%1yK$y#9$`yM%ej6KSr3Ekb@(9_dHo0^(LE|;qvEd)TAF1NW5QW1t8_W%*Ao~ZguFVD zNL)`T{lr)_oWOk*F!mw*J zX6%aRh|Ki`!gk^@M|2%yD%o8B{wI?R(~xi9zWrX#`6Zn5yM1(Ha!vvLXNkU3)YMS;Ix1(^l8@MX-*8r%~ zJ735z+_Qf-lEtXX&P3nD{kt%d&A8q`)e6iVQF(!V`}P&~?c4X(*4EZX7-L_q)KOTK zv1Kk>OH2Y`jt5;peWDNV@8HJ3C8#7zz&-Pm^9wy~4&FO_B# zx}vH;LWruDFpCX=92n=*{7qIn@v0b^S>xyYM;?0XWkOQk7$h0u6O_b@e2Z z$(P%<{SB9L9(;Sprj+8(yH7jqw83iLXLc`uLIYw~n5JnrjMWu5*}@pZnFTj?baed3 zRQ6(5WlDs4#=Nbq?Hz=WuLD3tQOh|a--}YpS05&!C~RqIxtKBbQ6a>6=uvXczt+*w@wchq d*CTUK{y&^#C~WiVbE5zN002ovPDHLkV1gePVY&bS literal 0 HcmV?d00001 diff --git a/projectinitializer.spec b/projectinitializer.spec new file mode 100644 index 0000000..43efb11 --- /dev/null +++ b/projectinitializer.spec @@ -0,0 +1,36 @@ +# -*- mode: python ; coding: utf-8 -*- + +block_cipher = None + +a = Analysis(scripts=['projectinitializer\\__main__.py'], + pathex=['projectinitializer'], + binaries=[], + datas=[('projectinitializer.ico', '.')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=None, + noarchive=False) + +pyz = PYZ(a.pure, a.zipped_data, cipher=None) + +exe = EXE(pyz, + a.scripts, + [], # Binaries/Datas usually handled by Analysis/COLLECT + exclude_binaries=True, # Let COLLECT handle binaries in one-dir + name='projectinitializer', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, # Use UPX based on config + runtime_tmpdir=None, + console=True, # Set console based on GUI checkbox + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon='projectinitializer.ico') diff --git a/projectinitializer/_version.py b/projectinitializer/_version.py new file mode 100644 index 0000000..c1b6749 --- /dev/null +++ b/projectinitializer/_version.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +# File generated by PyInstaller GUI Wrapper. DO NOT EDIT MANUALLY. +# Contains build-time information scraped from Git (if available) +# and a helper function to format version strings. + + +import re + +# --- Version Data (Generated) --- +# This section is automatically generated by the build process. +__version__ = "v.0.0.0.1-1-g1fdf738-dirty" +GIT_COMMIT_HASH = "1fdf738d0257a954189792f557dc2bcd427f1264" +GIT_BRANCH = "master" +BUILD_TIMESTAMP = "2025-05-08T08:42:23Z" +IS_GIT_REPO = True + +# --- Default Values (for comparison or fallback) --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" + +# --- Helper Function --- +def get_version_string(format_string=None): + """ + Returns a formatted string based on the build version information. + + Args: + format_string (str, optional): A format string using placeholders. + Defaults to "{{version}} ({{branch}}/{{commit_short}})" if None. + Placeholders: + {{version}}: Full version string (e.g., 'v1.0.0-5-gabcdef-dirty') + {{tag}}: Clean tag part if exists (e.g., 'v1.0.0'), else DEFAULT_VERSION. + {{commit}}: Full Git commit hash. + {{commit_short}}: Short Git commit hash (7 chars). + {{branch}}: Git branch name. + {{dirty}}: '-dirty' if the repo was dirty, empty otherwise. + {{timestamp}}: Full build timestamp (ISO 8601 UTC). + {{timestamp_short}}: Build date only (YYYY-MM-DD). + {{is_git}}: 'Git' if IS_GIT_REPO is True, 'Unknown' otherwise. + + Returns: + str: The formatted version string, or an error message if formatting fails. + """ + if format_string is None: + format_string = "{version} ({branch}/{commit_short})" # Sensible default + + replacements = {} + try: + # Prepare data dictionary for substitution + replacements['version'] = __version__ if __version__ else DEFAULT_VERSION + replacements['commit'] = GIT_COMMIT_HASH if GIT_COMMIT_HASH else DEFAULT_COMMIT + replacements['commit_short'] = GIT_COMMIT_HASH[:7] if GIT_COMMIT_HASH and len(GIT_COMMIT_HASH) >= 7 else DEFAULT_COMMIT + replacements['branch'] = GIT_BRANCH if GIT_BRANCH else DEFAULT_BRANCH + replacements['timestamp'] = BUILD_TIMESTAMP if BUILD_TIMESTAMP else "Unknown" + replacements['timestamp_short'] = BUILD_TIMESTAMP.split('T')[0] if BUILD_TIMESTAMP and 'T' in BUILD_TIMESTAMP else "Unknown" + replacements['is_git'] = "Git" if IS_GIT_REPO else "Unknown" + replacements['dirty'] = "-dirty" if __version__ and __version__.endswith('-dirty') else "" + + # Extract clean tag using regex (handles versions like v1.0.0, 1.0.0) + tag = DEFAULT_VERSION + if __version__ and IS_GIT_REPO: + # Match optional 'v' prefix, then major.minor.patch + match = re.match(r'^(v?([0-9]+)\.([0-9]+)\.([0-9]+))', __version__) + if match: + tag = match.group(1) # Get the full tag (e.g., 'v1.0.0') + replacements['tag'] = tag + + # Perform substitution using regex to find placeholders {placeholder} + output_string = format_string + # Iterate through placeholders and replace them in the format string + for placeholder, value in replacements.items(): + # Compile regex pattern for {placeholder}, allowing for whitespace inside braces + pattern = re.compile(r'{\s*' + re.escape(placeholder) + r'\s*}') + # Substitute found patterns with the corresponding string value + output_string = pattern.sub(str(value), output_string) + + # Optional: Check if any placeholders remain unsubstituted (could indicate typo) + if re.search(r'{\s*[\w_]+\s*}', output_string): + # You might want to log this or handle it, for now, we return the string as is + # print(f"Warning: Unsubstituted placeholders remain in version string: {output_string}") + pass + + return output_string + + except Exception as e: + # Return a simple error message in case of unexpected formatting issues + # Avoid printing directly from this generated function + return f"[Formatting Error: {e}]" + + diff --git a/projectinitializer/config/settings.py b/projectinitializer/config/settings.py index d3b2ae7..5c7227a 100644 --- a/projectinitializer/config/settings.py +++ b/projectinitializer/config/settings.py @@ -6,31 +6,16 @@ from typing import Dict, Any # --- Constants --- CONFIG_FILE_NAME: str = ".project_initializer_config.json" -DEFAULT_ICON_FILE_NAME: str = "default_icon.ico" # Nome del file icona in assets/ +DEFAULT_ICON_FILE_NAME: str = "default_icon.ico" -# Path to the assets directory within the package -# Path(__file__) is the path to this settings.py file -# .parent is the config/ directory -# .parent is the project_initializer/ directory -# / "assets" gives project_initializer/assets/ PACKAGE_ASSETS_PATH: Path = Path(__file__).resolve().parent.parent / "assets" DEFAULT_ICON_PATH: Path = PACKAGE_ASSETS_PATH / DEFAULT_ICON_FILE_NAME - -# --- Configuration Management --- - +# --- Configuration Management (invariato) --- def get_config_file_path() -> Path: - """ - Gets the path to the configuration file. - Stores it in the user's home directory. - """ return Path.home() / CONFIG_FILE_NAME def load_app_configuration() -> Dict[str, Any]: - """ - Loads the application configuration (e.g., last used root directory). - Returns a dictionary with the configuration or an empty dictionary if not found/error. - """ config_path = get_config_file_path() if config_path.exists(): try: @@ -45,9 +30,6 @@ def load_app_configuration() -> Dict[str, Any]: return {} def save_app_configuration(config_data: Dict[str, Any]) -> None: - """ - Saves the application configuration to a JSON file. - """ config_path = get_config_file_path() try: with open(config_path, "w", encoding="utf-8") as f: @@ -58,7 +40,7 @@ def save_app_configuration(config_data: Dict[str, Any]) -> None: # --- File Templates --- def get_gitignore_template() -> str: - """Returns the .gitignore template string.""" + # ... (contenuto invariato, omesso per brevità) ... return """# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -209,13 +191,10 @@ dmypy.json # Temporary files *.swp *~ - -_dist/ -_build/ """ def get_readme_template(project_name_original: str) -> str: - """Returns the README.md template string, formatted with the project name.""" + # ... (contenuto invariato, omesso per brevità) ... return f"""# {project_name_original} A brief description of {project_name_original}. @@ -235,7 +214,7 @@ A brief description of {project_name_original}. """ def get_main_py_template(project_name_original: str, project_name_lower: str) -> str: - """Returns the __main__.py template string for the new project.""" + # ... (contenuto invariato, omesso per brevità) ... return f"""# {project_name_lower}/__main__.py # Example import assuming your main logic is in a 'main' function @@ -255,17 +234,20 @@ if __name__ == "__main__": main() """ -def get_spec_file_template(project_name_original: str, project_name_lower: str) -> str: + +# --- MODIFICA QUI per accettare project_icon_filename --- +def get_spec_file_template(project_name_original: str, project_name_lower: str, project_icon_filename: str) -> str: """Returns the .spec file template string for PyInstaller.""" return f"""# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( - ['{project_name_lower}/__main__.py'], # Main script of the project being built - pathex=['.'], # Current directory, where the .spec file is, and project_name_lower is a subfolder + ['{project_name_lower}/__main__.py'], + pathex=['.'], binaries=[], - datas=[('{DEFAULT_ICON_FILE_NAME}', '.')], # Icon file relative to project root + # Usa project_icon_filename nella sezione datas + datas=[('{project_icon_filename}', '.')], hiddenimports=[], hookspath=[], runtime_hooks=[], @@ -291,13 +273,15 @@ exe = EXE( upx=True, upx_exclude=[], runtime_tmpdir=None, - console=True, # Set to False for GUI-only applications - icon='{DEFAULT_ICON_FILE_NAME}' # Icon relative to project root + console=True, + # Usa project_icon_filename per l'opzione icon + icon='{project_icon_filename}' ) """ +# --- FINE MODIFICA --- def get_english_manual_template(project_name_original: str) -> str: - """Returns the English manual template string.""" + # ... (contenuto invariato, omesso per brevità) ... return f"""# {project_name_original} - English Manual ## Introduction @@ -325,7 +309,7 @@ Common issues and their solutions. """ def get_italian_manual_template(project_name_original: str) -> str: - """Returns the Italian manual template string.""" + # ... (contenuto invariato, omesso per brevità) ... return f"""# {project_name_original} - Manuale Italiano ## Introduzione diff --git a/projectinitializer/core/project_creator.py b/projectinitializer/core/project_creator.py index b08a598..e80a643 100644 --- a/projectinitializer/core/project_creator.py +++ b/projectinitializer/core/project_creator.py @@ -44,9 +44,21 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: raise ProjectCreationError(f"Root directory '{root_directory}' does not exist or is not a directory.") project_root_path = root_directory / project_name_original - # Sanitize project_name_original for use as Python module/package name project_name_lower = project_name_original.lower().replace("-", "_").replace(" ", "_") - # Basic validation for a Python module name (simplistic) + + # Sanitize project_name_original for use as a filename (e.g., for the icon) + # Rimuovi spazi e caratteri problematici, ma mantieni il case originale se possibile per il nome file .ico + # Per il file .spec e l'icona, è meglio usare un nome file "pulito". + # Usiamo project_name_original ma rimuovendo solo gli spazi, o potremmo usare project_name_lower + # per coerenza con il file .spec. Scegliamo project_name_original ma sanitizzato. + # Un nome file come "Mio Progetto.ico" è valido su Windows, ma meno portabile. + # "MioProgetto.ico" è meglio. + project_icon_filename_base = "".join(c if c.isalnum() or c in ['_', '-'] else '' for c in project_name_original) + if not project_icon_filename_base: # Se il nome originale era tipo "!@#$%" + project_icon_filename_base = project_name_lower # Fallback a nome lowercase + project_icon_filename = f"{project_icon_filename_base}.ico" + + if not project_name_lower.isidentifier(): raise ProjectCreationError( f"The sanitized project name '{project_name_lower}' (derived from '{project_name_original}') " @@ -54,7 +66,6 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: "not starting with a number." ) - if project_root_path.exists(): raise ProjectCreationError(f"Project directory '{project_root_path}' already exists.") @@ -73,17 +84,16 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: core_subpath.mkdir() print(f"Info: Created directory: {core_subpath}") (core_subpath / "__init__.py").touch() - (core_subpath / "core.py").touch() # Empty core logic file + (core_subpath / "core.py").touch() gui_subpath = src_package_path / "gui" gui_subpath.mkdir() print(f"Info: Created directory: {gui_subpath}") (gui_subpath / "__init__.py").touch() - (gui_subpath / "gui.py").touch() # Empty gui logic file + (gui_subpath / "gui.py").touch() - (src_package_path / "__init__.py").touch() # Make project_name_lower a package + (src_package_path / "__init__.py").touch() - # Create __main__.py for the new project main_py_content = settings.get_main_py_template(project_name_original, project_name_lower) with open(src_package_path / "__main__.py", "w", encoding="utf-8") as f: f.write(main_py_content) @@ -110,26 +120,25 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: f.write(readme_content) print(f"Info: Created file: {project_root_path / 'README.md'}") + # --- MODIFICA QUI per usare project_icon_filename --- # 6) Create .spec file for PyInstaller for the new project - spec_content = settings.get_spec_file_template(project_name_original, project_name_lower) - # The .spec file should be in the project_root_path + # Passa project_icon_filename al template del file .spec + spec_content = settings.get_spec_file_template(project_name_original, project_name_lower, project_icon_filename) with open(project_root_path / f"{project_name_lower}.spec", "w", encoding="utf-8") as f: f.write(spec_content) print(f"Info: Created file: {project_root_path / f'{project_name_lower}.spec'}") - # 7) Copy default .ico file to the new project's root - # The icon in the .spec file is referenced relative to the project root. - destination_icon_path = project_root_path / settings.DEFAULT_ICON_FILE_NAME + # 7) Copy default .ico file to the new project's root with the new name + # Usa project_icon_filename come nome del file di destinazione + destination_icon_path = project_root_path / project_icon_filename if settings.DEFAULT_ICON_PATH.exists(): shutil.copy2(settings.DEFAULT_ICON_PATH, destination_icon_path) print(f"Info: Copied icon: {destination_icon_path} from {settings.DEFAULT_ICON_PATH}") else: - # This case should ideally be handled by ensuring the tool's assets are present. - # For robustness, we can create an empty placeholder if it's truly missing. destination_icon_path.touch() print(f"Warning: Default icon '{settings.DEFAULT_ICON_PATH}' not found. " f"Created empty placeholder: {destination_icon_path}") - + # --- FINE MODIFICA ICONA --- # 8) Create .gitignore for the new project gitignore_content = settings.get_gitignore_template() @@ -142,7 +151,6 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: print(f"Info: Initializing Git repository in {project_root_path}...") subprocess.run(["git", "init"], cwd=project_root_path, check=True, capture_output=True, text=True) print(f"Info: Git repository initialized.") - # Optional: Add all files and make an initial commit subprocess.run(["git", "add", "."], cwd=project_root_path, check=True, capture_output=True, text=True) print(f"Info: All files added to Git staging area.") subprocess.run( @@ -151,19 +159,14 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: ) print("Info: Initial commit made.") except FileNotFoundError: - # Git command not found, not a fatal error for project creation itself. - # The user can initialize git manually later. print("Warning: Git command not found. Please install Git to initialize a repository automatically.") print(" The project structure has been created, but a Git repository was not initialized.") except subprocess.CalledProcessError as e: - # Error during Git operation. error_message = f"Error during Git operation: {e.stderr}" - if e.stdout: - error_message += f"\nGit stdout: {e.stdout}" + if e.stdout: error_message += f"\nGit stdout: {e.stdout}" print(f"Warning: {error_message}") print(" The project structure has been created, but there was an issue with Git initialization.") - success_message = ( f"Project '{project_name_original}' created successfully in '{project_root_path}'.\n" f"To run your new project (example): python -m {project_name_lower}" @@ -172,8 +175,6 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: return success_message except OSError as e: - # Catch other OS-level errors (permissions, disk full, etc.) - # Attempt to clean up if partial creation occurred error_msg = f"OS error during project creation: {e}" print(f"Error: {error_msg}") if project_root_path.exists() and project_root_path.is_dir(): @@ -183,10 +184,10 @@ def create_project(root_directory_str: str, project_name_original: str) -> str: except OSError as cleanup_e: print(f"Error: Error during cleanup of '{project_root_path}': {cleanup_e}") raise ProjectCreationError(error_msg) from e - except Exception as e: # Catch any other unexpected error + except Exception as e: error_msg = f"An unexpected error occurred: {e}" print(f"Error: {error_msg}") - if project_root_path.exists() and project_root_path.is_dir(): # Defensive cleanup + if project_root_path.exists() and project_root_path.is_dir(): try: shutil.rmtree(project_root_path) print(f"Info: Cleaned up partially created project at {project_root_path} due to unexpected error.") diff --git a/projectinitializer/gui/app_window.py b/projectinitializer/gui/app_window.py index e4eb186..dd97b7f 100644 --- a/projectinitializer/gui/app_window.py +++ b/projectinitializer/gui/app_window.py @@ -6,10 +6,29 @@ from pathlib import Path from projectinitializer.config import settings # type: ignore from projectinitializer.core import project_creator # type: ignore +# --- Import Version Info FOR THE WRAPPER ITSELF --- +try: + # Use absolute import based on package name + from projectinitializer import _version as wrapper_version + WRAPPER_APP_VERSION_STRING = f"{wrapper_version.__version__} ({wrapper_version.GIT_BRANCH}/{wrapper_version.GIT_COMMIT_HASH[:7]})" + WRAPPER_BUILD_INFO = f"Wrapper Built: {wrapper_version.BUILD_TIMESTAMP}" +except ImportError: + # This might happen if you run the wrapper directly from source + # without generating its _version.py first (if you use that approach for the wrapper itself) + WRAPPER_APP_VERSION_STRING = "(Dev Wrapper)" + WRAPPER_BUILD_INFO = "Wrapper build time unknown" +# --- End Import Version Info --- + +# --- Constants for Version Generation --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" +# --- End Constants --- + class AppWindow: def __init__(self, master: tk.Tk): self.master = master - master.title("Project Initializer Tool") + master.title(f"Project Initializer Tool - {WRAPPER_APP_VERSION_STRING}") # master.geometry("500x200") # Optional: set a default size self.app_config = settings.load_app_configuration()