From d20c595e0f2daf869ba8ecd439d9a32793bdc148 Mon Sep 17 00:00:00 2001 From: mudabbir-ahmad Date: Tue, 28 Apr 2026 13:36:46 +0100 Subject: [PATCH] Q2 prep --- Acknowledgement of GAI Contribution.docx | Bin 0 -> 23130 bytes .../antlr4_parse_tree.png | Bin .../antlr4_parse_tree.svg | 0 Q1/Q1.docx | Bin 4102311 -> 4104274 bytes Q2/Artefacts/TreesUser.py | 27 ++++++++ Q2/Artefacts/fspow.g4 | 62 +++++++++++++++++ Q2/Artefacts/fspow.py | 64 ++++++++++++++++++ Q2/Artefacts/fspowVisitorUser.py | 36 ++++++++++ Q2/Artefacts/mincommands.txt | 15 ++++ Q2/Q2.docx | Bin 13481 -> 16845 bytes 10 files changed, 204 insertions(+) create mode 100644 Acknowledgement of GAI Contribution.docx rename Q1/Artefacts/{ => images_of_tree}/antlr4_parse_tree.png (100%) rename Q1/Artefacts/{ => images_of_tree}/antlr4_parse_tree.svg (100%) create mode 100644 Q2/Artefacts/TreesUser.py create mode 100644 Q2/Artefacts/fspow.g4 create mode 100644 Q2/Artefacts/fspow.py create mode 100644 Q2/Artefacts/fspowVisitorUser.py create mode 100644 Q2/Artefacts/mincommands.txt diff --git a/Acknowledgement of GAI Contribution.docx b/Acknowledgement of GAI Contribution.docx new file mode 100644 index 0000000000000000000000000000000000000000..6e7711502218c85d9d0840496ede9af001a9cb40 GIT binary patch literal 23130 zcmeFZbC7N^vo|`nZSS#d+qOM>Y|remZEKHh+qP}nzVp5Z_vqGF_wVzis(a;GE6GZ_ z(&_ZCvmSXVU=S1lFaQVu002S&zo31tR6qcLDsTV*WB>>tEg@SQClebdJ!N-06Gt6d zH)|_`d=Mb=TmYb-^8YveFP1<vn&Pk5P?Wu3hCuU$94Vu!RGE|G0Q5F;oKIgRqV3{n5;+PW`%xr!tfT$I1*HG z;4K_flmCE?*s)pvC?)@x`C6g>Bw|18vBXqwc;Y)iG-Y9oDnaKECcI!*1m?}S&v&@g zH3H64&76M0E>EJN0lnwT-)R;JkOXxXH8xdUP-H?38c@Y7x~#X|xpnpf=GH3-N8CA3 z7W%IFys{6Qnl#U%Md3;U?1)ggK1KBJ8wLBr!@fD=E~`HL$r; z$lseTp8S9PXaQKqDk1Rcy-y?eGTf-dPkA_FbUva)+facr&q58#y?XFQ6r^FDYD1!& zs6Z4+gg&`>ahDk1sY@Mkg;8#A@rSoe-B>oE!GFo`i_eMWz?Yp1_`Q|8W~GxsZQ~w! zd9O!z{mjMhZ(soV|D@1qDn6iJKTmdl^cDI?q4gY0tQ_fR|H1#SBL6Se-v2Q4ig+0* zV1^$>_WvfF=;T_bB%0gQ6+V$M{sa_aeD}+Mk1uWd-XagDU1$u!V{$(pWfEG-=)_&5 z8fJD=>#ZXfsGZ+}sVd)Tbywf;mlT|uIl)!4+X2aVyEFV8AeOL^{6vT!LrI}L5$VG< zoa51w41&M7lQ}Q=H9EXvK=3JuyI)3aOaEoc&tp(lSxR6tiCS`m@Pg80yDo6wxy&^# z8_n(4f$kDKNi?v5Z!$7p5^OlE=y&_ZkbzJ5< ztbzMDyeJGmgAE@xz4|V5@{z;(fi|r9yW*JXzA`W&Mxz_}e^M7`KZ@r$SO5S#Z2$no z9~rsYIvCR#+Zs7r{}{o4SicMHNrwV)q%PZmF5tX*E8*r}U%!S|kdefBaA%qJPp&qj zd6IKUYQe&3_DB1SQRiVvJV zQr_BdMo>#twQnwH&4m6{Q`oUjuG4TitSuQgt?wz=MBVpMJ1^z2Pq90iWe$46L86mb zqZo15TUWT}(C8f&pE>b>?qhmu%+KRZ4_(D|dT$SGK!y;2XK_wR{4!TmMQ>drG|m); zXj#iM&K9+hJFb`~w`fnim?uANPkbv@So2eAfVNAX!O)$;h!F>i@!E=l=$=k!=4U6= zpoi@v&;p*!R*5GR@bU!`yIBkt{QDkLr0+_6G%x=wMR`$_aR1Ww@^yLSY5b|_qo>WP zH&dfiKeLf5)op5!p0s_(T9=U19%O{5cu@E#3PELJZ ziPTtFitAuqr7R>;1N$Cyl`rq$lbOF}nI}V1`Lm%Z z1_wA^Km#5TFWQ|u`$%~%$|)dKPkAa{NsyI`RIxS(Zo{NRymK5wly~|I->rArvO$sW z9zBLw?W`nXJ3f+Hyo~`%!hUHEF%cySO9Zke)*ah7nE7-+(9{N^svsRM;dLJ75!cLJ zQ2{zz^wRsVP7Q;b$6wXp#+fXUH!4jII{pt?Ovm~2eX2bptRFGG9w@auB392gfN@8t z)|*Nqu}^r0Mkt$4Rj$;@7}ITekqC9Zc*f2qc$O1-V>^XkH^X&byh_k*j;KkXlC50N9<<=h0-(o z@n<$>u>H7}!Ms*3OE{@#!i{fHQ~vVIu!V|d7Tir@nkv<#e%Tf)ow`CmHrqI>YX*=X zkwd6Hc}j_WXPh#j;B6tzN>DD~Sm*}_{q)o73VGyY^^rhwWvV>ZDoD!iglmuxl!M`= z=pZ?O3H*Fe0NQ+T`^@}E&>gGqLsIowhNE}YCVKqjB4GiQ3uE%QBmDv_=#1V96F{*u z$w9Jzl>00sU*lbD$Rep$iNsOki}cHZ!Yz}j0+kB=x;5E;C94=2UWv_1oxfgAcYCP@ z>^_`ICCYR~}u1?qi&o;h_`?Dhz5QKA|u zR@Z<`;(|&bF_0)9DU2&v#W&pmX2_%}mIM-5&gn|d#?Ke6VoTILokA(x9#w6HQk8(C zt()`gEoR`XTG*4X4pm3-%M@9LG*L_-S-}^%c_!5X;4Ypr_GLntKynu=7^XNSk>nUM zAorn-u=Hw+TO8NC^J{>aGm3kJ_KVe@n|j^UfCm0|7e_4kpgW1Jza3_BJS7sE+w&IP z_}GZay+9HP>TAr1PalAi%j62T*93zRX)L@%zCa|25GOF6HEO$eC&8^YiDa9_xa2x{ z9?4{|1wXx7lzG{QwAz>$THFgc4$$kigjN7B264WWN&vIZyNxn9T$#P^6UpJ{+^d+d z&saj>t+WI(mVf+_EkIpu%3&Wzw}KsWx+9WEAY0TYK%mOxk`8Xd?Qw{m%$QlAUD|QE z!=AoeQMI9a+UdAvdsy-R6`&9mMuU+mf$FlnR-q zy*RuR>@el#;RUKqE7*l6v2ztEgzHi1fwFs=BP9hf=w8c6*DEe~gIB9v^4tUZeW@N| zse66+SUHJdAp7eR{TGkhvs^Xf!!K|Y=WIQmHQ zZV%4G7!K6q%#R-H9g_@yh8f(<`@e>myHWMmE-)KpteIzZHb}IXUb4?4Wvmr7*cgr1 z-fHMvRu{z<{5TZsH_eB4GHee}f~k?TGy8YWJ*+N(I#0a-L-+aw!eK%`a~|uKG=ppd zUIiy0ljsKexn!4Q?2FIE1vZCQRrlS3abp)VBJqpA(`#fGzCBF@k{M}Z#f+oVf=kzy z%-6GW0>DG{#4+$JHP6eZXCG9cU(T`geOq9Cbu!E~r+XA`00CiHHftC(Er7rC@4m@C zDn|ugmJjYaHr?G2+#7-}?tIWhq2^8OTSV6%Megh(TYCqV!~z_dT(xWpD4O$9)`z^( z666n`x4(qwiE_WLyFb++15hfw$C4YOZcCHb)Li|&E%)H8<}2UouzAon*YB`d_AMoa zF!ZcXwy`gK0hX@+)N+uG3WgUwDi`X8R=(vnF>THaKqgL3IeDRxWSf4#Dx{WiE=3L{ zK5`he2oM-2L1U4It65P5+VC#b@?|Zqqr&Ijn(Od^EsU*d?dM&lYFXwaGvSmxwWMj| z>84pcoxW5I&40cXgsi8r|Bj!F^>CPEC((~*RP`+&VRY{`2iS)64oEutEy#4OK;k584k8T zC-mw1n~!G%bm9dLD|5?FrwS~jyv&?J-m7$8R0xTgb65) zo+}g^mL=M~2TX((q+qyAQMaJkKvV-Lp>9l2q*|=NF0=YAln(kOo1ZGMsD>>E%j+uF@0G#Vu6|hNsD=;?zXvX z*V0!#b0pkh&WV{J63Z~_sa_yjbgt6M2=GY-@vX&<2e&HeQ%~&x!_J#x)TJyzkpO zcSVpD`Pl?wQ-(G94OyvAE{GdZgwAa#1bm2h6BKu=i{`f{J7pO!Zc8*GhghMBOsdkG zK~6}#iJ?V~i?4vvm3xw(2FntCUy^&a$g$JKr^pUrtLGzI^9vD<69umT4ud!L z$dLTb6!KdLS-p;ymQIy! z#?eWp=@Kl19o+=e0x?8PveI0@A>#}%k*l;Z4oAlVi_`A57dtnCT1%1XnP4!^tgaM; zA!F>&wixhhzw*2d`R4B+xxj83gr;SXmhRJzbgKmb=B?t{1_TehJuY(J-a@<914uh3 ziZ417o^m1c6yTF2gaIP5KvW&bzUoEKP9cIY9VF^;T;H->6Faxp>0h>b32;`tHBq8^JF#j^wJE_lj)=7##-lyLn{Lf7J z?~~5!o?0It1OT7`82|w3r^G)eovE#@lZ~yDiQ_+Ehm=j5Gj@dGYqd4k8i(zpA1@M0 z49BCSrF`uQxFw8YN#bI}CHG>ntG{cPcXa9?LjGixzwn;Wnkr7;(n8r6g`w@RnL(iYAcwu|EfIt||Uu(=U6eer- zy`70eo~g@&m9n55UUb!)&EUPxrNLuS%m}%=Z-ME|w+v1PNY3x=CNWpdrC@cGHqm56 zv>&ZNVC`oJRUwndS}x5-jE}=ut^C?69D`rShoK&2M~SxQUxv-cy~nrq*5@%R+IHGy z#C<2yhFK=_63lMhUWxwZPgA&o97^Q^Nw@>OK!!!8+$DD=@2B!TPErnL{3TdHs4{Yak!V}An)ETH#7>Lkikl>=&8J)pqgGoB$X(#5=&tj=%E?%w*-wL1q`~#>x+k1xzy#MA9WYsL;s9GwGW_%Z1A!c z(ZY`M@0VR_^@-2HJg{EwaM1!0yIcWWRVJqx1NM6Y47g9FJ{(%Qpi*?#z)}23T9I#7 z6pxMkr)S6weo$EmboRx-vJ0a$$;H$V=#ODsSY_&r{f&XX)D4%LFz6fFGK#n9p{0oQ zxK>^qA#eNoDf`UC-2Eg@%tc@=2GH(j^~QNuC+{4{9ia?H9-!AMUaX7G!!RMlgK&!? z)`|4^_SN{0`{nI}Xh<-LX|~9T#N8Pm4w+F!jO3yZ(4b$UW6H#HnGi@qFu=$6)Nl5L zveob%=Sq!RVP&{m9zF+N?n;dTA}GOE`abfF*XSp$i!Z)_nWy`{#ZR84Z;lK5P8JZ$ z!sst${kvkg3+TH*nQX>n&>|p{7h(L~E+vAyh)_m8DC{~-7(X-M-n z!*GKWRjyh_guc~x&M;Fp16wm$G6#5>6Xna=V>S13US=ry;d|rzu?d?-Ycy-B7&~%i z)h5&8)#cG~OooxT`#@0M8X(B>u0nic1_rTEAhQH{|66#WFeHtkqX>u)QM8iatU?I{ zX!bQKO({s8X1|APDt?U%6%NN^fd~}7fR!JUFj55!Pa}*ky>WEaY#B6^=pX$Mzikm2 z@B*|E%|*aTQNNxtI1AqBhtVUneQ|-51{|?;7m0HFzf<;xo4~Xrhx8cGgEf9?jbbq6 z&Dyd6)U^_N^VBS6`W_Kj0ZL!2eMIssAgobf$jPB$p{DaCMWKxuRCuay5(UjgA%$HY z%uwl%T4>4bq7TN5*1s#y_S+SG=)|YU*@Bj1^D$o(?6UsWmBLw3!-6GXIlPPkf+sKD zN6%fS{r;x3em23-)W^RsU#YEV_^`~sehe)VVGidd?a-@l3hafnLB~5xhdzGeiI9VZ z;QRxc$3qv9UR#C{+OTTPVKLoM#$lpNO=gXI{#@aQAJqyV{7N89UwK&rPt~n|IwCwu zuZ>G=+_a!zU?X}D33urRO+TFb4UMj*peFU>h&aS!HZiq4Sue*Npr_Lsxz+}!mn z-denO1HK%vx=NoO8sR68Q8qGlUOW>L??tQp3kz@rfj905e{txa&yWBse369ga34>f zGSSRc(L}B$lD3Q|;u((MBWl2s(g7&!JnfUZQ|8+Uccj4jnP?vV;^wT)*Y(Xtt%p8T zORMX;Hw_A}SW!9pS?J`5!z;CUXE~!xvm&lL^Y)HchvvsIQ2Zos^Dsy&Jks42`IbO# zsu4x(X#J%Q?!zT)cD6o|4D5vwDbdbi2k|82@bBO6Iqv=tHj3HkuFLmg)yk}0j^TVd z7fn*W&%W%3^OxScxlNU9zCW9>|88HK9?VkbzyJV72><|4|INNSnVVRf(EXD${L{p0 zNJU_aA#{P?;Rm;ldrY1fRItp6-&roRZZ!tPbShdFRc2evZmu=b2kYlJK!Rk(3c<7< zA_&4T3>?Jc8`Vf;;>VrgNifko4#emLK(_m<@O71awUxECF+1+=eWr4Xr9$_`M{Dt@ z+2dwLuB4I}40n3dQ#Wdhi6=%Pnm}H)KvQo-aOL>A0A{5iM%M!0g|WwQ+K?Pxc(qcC z(nk((u=Ybv$Y8|81=7Ng8%0M8*h-H#N){?aBT8tK2{4p&GNi>Ky1*q$x|$Vw@$c#p z1z}+*bX6-G2?-hv&zHR+K_kjv;SjFb8)PwX@%B6yp39SvNIPwWe>skGp^sS-QbHR$ zItYC>Cu%`O7PHU{_xCsE9>3}qv@cZyD%4 zxxt2$OB89Hgm0ICmv2@PB8$>#?OJbRvsy~I1ydg9Qzgk6D^v`g;Oz?mm>&~KAc@hM zy7`O#fkyZhlF8mq5=n4lN^SrYOw~A6qZsmiwtt%ZM9vwbAj^r16;??&IE+XvYg)Ij z3tDLdcXu`zkrI>L?e*|JJ{+UR`{vyG)U;ue80g;0#^-%MJx`a_?fZT^nP7YA7B}4e zby&Xa`|+xGRw!`ZZdRSc=lS@#?ECpK0Cer(lp2B`ivfMi$?IZMi@|EH0f2w^oWLH6 zFe>GgAfF3DfeGzFKn(2d?MGg>CP4WUR%ta&xE88_+_=nj{bio6bhjf)m8vJE!1i6<#ZHK}#5{ z^E?vD)JrCuJ@2|d&FzP~I&6UFu2ig>M#Y{l$sMu@2SwW0JZ1D4UnMwelKeVW02=MlKiUEx*?CU(8~B=P;^1FUCxA``22ly7 z+4K+H{gM{OC8J?&9+R06%4p5&Pnr9(7Ci0JmhYf)S|#4OhzX%D;nFn!jI}@$aBR)=gXWmC4qsQ_U?LW28!zwFQzPRWpgTT*-9nxpX0%wvgErvaL0l1~v zc@^{~a320A-WwmObx<0~89MCf_YDon!<1~0$a-IX;R1TyjGk0=&*1^Vqxi&{d~OI%g5*sR-jJg$PU8KUME`KxhupR=b7 zSu^~klcSocZ);k=Jjdxk^VNFLf-tQGnl{1NQp0gfjO*yJx{3R?ep1oZr1rAzVOze| z-T}H`v}RMPfDA*E{J5yh?_za?gJi7`(^*{mwdP*ag)(SE6}7Xir3h;mH+Z6M_{FnK z$-L6OYP4woMXFI|+lfx&AJfk}ADq+~vFcjs!w->;h!_8Zp!{v(a8=-?HMdv$pXiL{u<&Ar;&p!c4Zu5oU zOON(t^2YN`gVFP6%|e%%lccw(+*SN1;O<2{UZ*T#*r&F~9!nU_LQxh7N!^0{ljgO; zBDHeoPSa+Vn>P5Arr@mVF14e@4wtVV?Bc&0!6Gzc7?2+$82sa8{(ETK(ZtEg!p7{M zK4ydZy3IN}g14Ujckj(TXEJ$sd}L8jRVTqJ?HTn`TC#aYC58!*#pWksMiNzO#UoLjC!v z-_Q2i*7y5z(r1>jP+yY^FuYAi`SsDMT)94VdfjWBa!ofZcoCo~sG`JQt~E_fdFwh| zgSIS~vTN^`S_nrSH6yP1z@rn{`5-?-xf`tr)skd6^?=8uBkM;b)*XwBXOi$id-!5m zJ$p(82)^*9jr)AG)nZH?U<NTVG6!jWq^j#U!@ z#~cXwMSJ-56dTOCwh)^aNyXJ1Od(0N*S-BBwD>AXJ8(r$pjD33j(J~$ghx3xf7FDU*tjyp|>I;(L4w-79d_m#6sfqG~ zokN-sD$s*p@x^+%x%a-NIdWJ7S+%c@I;!Y&yxF&zQex>$gI@^C1v=w(55af?vX7SM zu_nF(03tF}D{1vY->N9mVm4&2=St#KPP4U}grTBBK(x%G&@RPHhNW=7#tB-azLJ8R zZ!MN7;UYI@zmf60rU6wg$8!inuHj(EF;uu#hV+ap#uFM`D}-Ti?ecZy(bo z=zH?eYzRABQQm2%@G)p|V_rmD2>ZYMM(qOGUFBJy*>bI1lvI$0_h^Ir@*&P*$_Y7^h4YP@L(bD4p@(7rT2xVhen{7R; zxyYqL3_XJN<6mka1)>9R3*h?n$4*%8Dh60QqPX`=;t+4Gkzh6KquDV)n-qp2D<+tT z*z4yPTJV;ix(tRNE6ACyO3yj+Vxq(^jL{g0FrgS22nU|~Mlf(=)D=!L5Rrnz5Fu$o zFjhZ$2E!OQeRlF@FmU;v4A)N@b6RYS7a-{ou$XuWXrrTa!7<^&W@TgDWl>UN5ja+u zs+eIeF|Zw(Vd6w0J+X?|nbaf>*4dfrM0iO@M$km?AR{r6koVf65pN~1FpLn2W%sb| z32rw>n2xlN*3wKG5)7$oBhMv(*_hN+vDzUppP6MkAuzqibN}EdnY1=#5n1UAp}|>g zJCWv7-*1q!46N09@sSo`up6AT4=6{;q6{Wmk5Og@LN);lZG;}Srl!g|kc;FH%x423 z=^KW#C|AcQS%qSURSfio5!&Fj;It3q?hgVILY}H}UK6(TmIe7Fo!M04pR$@OK4LLc zs>aWcR{AtgJw_&V#JKV7QGrdeafu|iFG5V2^313yn|tzLw!7Ikmeq7kda%7!MJsiNiO z8=;jQzPUh$S_`U@>B!SrpPe*$y!e!dai>UWE7Wgpuy~s?Zmg{?{zNRIEK+Ru~iHc(?oc@X(mF_tz|V}3z`VJ^K;pZ~?*XY(-|eI!Aq3PjPz{-?C0%wc7#-DnA%=Vb z*P{QT&XY8Aaxpb~Ba`Wb?P3OPYC5qU#rG(}$Mz6s&fdL5b=Yh{<=Smj%bWt+&7Oi# z>>>uP{x%=sRjh;r< zDUxI6rZ=2N4FE-(;=Pu#MyVuG1uQjWj`x44n?)4Hww|WuP#zfh2E?B5lYqd34dg%U zPA@E7uM&0Kd0~>3>gToW1kDidSlUqB{KPJiGu7jCy6DJ7w8r&zpCJDy6Z!@2nX~gV zP?aBfVEi|E$UE5DIsX3=N@i@Yiiv+j3VpY(L@qd z5ieII?n*JaezyLJXQs!~{;30@3f& z&iK)tk&MC*Z%B>5N(~e{8*sWfmky8pv+4!8Ybx9**DmZv$}0?G1eGhSMAUqMC4Q$& zfxsz6j>paAl3JUr?B?rW!JSk_LVk+dV?@r;lr8>7Kh3UP{|iodOf1OF2b0SDNQ5i?Y?7{rHj5f8T(-Efyi9|7=YNIQ|35ZR2chXyWj* z1^K57p1x_b$Bq#^t+wXLpV|Bh51H-)GEsB(+qGfNsd1Q);n#0Nv1niu_+wMkYkfLP z8-q{e5Pm2b!MxLOJm#I1nC_0J1O-2^00ZFW<%uR51Fu=tyn7b#Z_py}sq5j9EwC}w!~sLc?hWl_>WsDeSJ9dU)K zBkTrj5eP(`D8y#0eGRmwu3;e{B-*5%LnO-567g1_RK#Dz0r$xuexykx1?d`y*Fle= z)Z8?4RY2|GLI!EPXsHD~`muOe8t!P9W{oxLr6W{pHn#guWdI-ZSlijH&=i} z7n4L-h%(!FlRbF&fKNHH#xA?~y~uQC_hjGnF)JYi=e56TeWi4A*`y$!yzYKQcxr85 znNupTN$d*2lmrb_$YTu6W&&^z^>`YqV1O1?tnbbh%#YPj%Pc=g=oz@~Q4{Uj>OUo8;B8gmX-dG0 zIjg9!xIucG%spQr)nJL82c(x3q?vNLlalun_H@$et00*dFUXanW|S7GDc9@jHR5k~ zu`S9hb23&AkWfOCkgicdKiC@i;S^`_>n-2Hi2QPv1fBfLz?EjN93pF$IZ}OPl4)_W zIl|svfN54rlXAB_-XcK8G=C#3j)XQ06(+#c zY-6^yv@n`g8P(0y+EYGsX5Gb&T`Be3))us8-9OiP&F%5k>n7%(?9Ww8U5|A54D*N00d|c`|b*t2xJ=r=EN+SXg)jNy$8xobMdyKOIn$+H3an~cLt!}TChaqX# z7E=RpB7*ky<9rZW&>^EkZ*;!xq(B6f^o=Gt0p0kJ)}y<^jCob&7f-L}WfF-=*ZZHp z*4D45zffH|1L7TqyY%Lkg1;W(yRu^31QczKo~1lQtGAUEcfYvEDVo3Ee_3~Ov3LG8 zT%Hk;SRLB^sr-yuoT6++!AVZBt#py{5UCZN@=Jv>17U;>zvdwT`HA?-Aoe!LtzK}r zR(jY@CIz~yQ6?@6(_QZdla#N2+XM?(&DnXFvu6RG{`JT_rL+}TM$LKH?n$VSd|F_2 zybWm4IbkirkK&1Mn(?(FLE0YGvvK|Ve_YA^`hPnz{sby@IsgFv5z+i-ywcIh-RfV1 zl{#9E>rF^Ld`!oDb{`A8f17@-IxsqOH5sv`CH%FxXqZNT)UYB~4Eej)(*3m~3blZQ zg1*rbEw`Sg-f;o0-@OT112Bs3`&B3HKg~_IN6oXz^|7l@w_}kiV(;PE_I!JEwmPaS zpGY009$)z3be)av$@l$m?fdEWoKJp@tP27}K%-0DKi?^$QKfrvjlSzor*SLPv{%}~ zK7IF#YS6%^z1#S;`0-35l}4>1(##$y<@voJAYh*dIN@1f^yr@bfUe%I^T49?;Mp-7 zVt|?k?Y69B=ISkX)5N`DtUeY!$ozqE)=dhnm}O!Y1b}9remdMr_lp3_==a~;z?WUW zw?=7J05SGIhyd(xujn{KVZAHp@vO2qyLQo*ne26TACyLb!j>ol=Gu!wUvYbAs)$Lm zK;UZj4Rj_Nqi7ZC%!tR3aQ23Tzk#LdZW5wK?IpR&0IyTx`%PZ<9<9?4t&$-~43hll zEBFD&eL?x|V%|o(OYRkEj)uA8_yU)FkgBjvcBOdD&i_&$7<}=vg&c{0wvNr!L0sw9 z5Jm1|E9fblFrpoHb4o?H$!YIakWYuFuAW((U6pGdox6so(-85&;h^(C4L z9aAM`zw0EI^h?&q>ytO8UK?a=zVmo`a@4XbQg2XUK zp99hKT=@ep;;dW}W%e*7w%YgvMNNs6!<`Hi$^Dsg3#Dq{Tgwj@i*)S(J#+Mnn0+Hy zeo;&y@~^N#V-v1p=c0=w9u()#Z;llhDh&=nkSo$ zP47Vbt1H@Gcvn~Wosf2}o%h|V=xd*r_WstN`zMz_x77FTALXgsXf~*6z&%&F$H$nd z+~x1+`e)TCYZm^dgUPvgaFbb(07gbz6%pe_qA@ymtP3V4ygeTmX1;^2a;FYApJ$>6 zP)*HGbC0TW>no7lKma=GRyl@l$k_Q^LB(q?6$=d^uBURup=&UVIeE2_aB2nnZ7LW z_rm00lBez>14l4XqGB==$^1~z4|Q6+|DDSaApTdvu4>L`kyZ|E7Q+qsbaX|RAWabf zTi)mFl1ak=fVsAjo?>>Jc5un4UnGhRJ9SZSpImX6sz2dv$vc_Z&=c932JZbo-@!mMh!zHZS1Rgtc^({xl5-aNz;n<_+W zWeBipuY{@Q}ljg++alt;mGI&@A5 z>Vk;$#F$wT4UsU+z%+A+#Ji;L9lkrqggVB2X6snnmV$xLE9vr&(CL1Nk;Y zpZV{NkC{95y`ZwJvk;JJA#B9sg&ZCnyz_P49}=dA^ETyIF_s0DIVZdR5J=dTT_KRc zq7%HopGeG2fNUMLuG`k>-Py-=~z zK^k?sMW7}TsCWhesCdqvkTRmXh<^`Iw&>h(;^OjpN>b(Zm6^%uDdA8sC;FG3$&}L+$|CR3YZ=#BdsMr z7l}nQk%%`DZf%qaDIm%4Ty_a7CF1~7+x6}f>>7y=J&tB=H5v4J)#OXA)$vw|(zTdo zyS>bZsX}*d+79O6U7^sBS;01Jhqju3wSVN6%2?6D8$35rQFx&rylv^OsXGb2F>byw zC7F%oKBIsf=iZ`e#r(xaQq1$qAdQUYS5giuN&Cm{uW`OctiFbEpEHi^{+A*hRb}XA zv~?5lM&k@f+4hQ(UCLe!jIl+a5m~+*`|)Q-yk_p9hz)WKSBHX!Cn`4KlmPFY9HZ5G zBmW}G>Mb6?y)G=_=kUz#N~Wx4TWa=4-;(o24E91$cuo7EPxLA*g`vvft=%EmS+1)V zLJx2PHsNaV0~E0!5;n=}m4o0D+`k(LC+47@AleQ7cP-|ihu-<9!na{R2Ot4$Lbv(> z*+AA52!9AX5@iE{TnuziHyTP|CK`(HUkO~FT`cJCAH@6fzzYX8KNlBO@ITX{qt!La zvx9P|zl$=2-@g!xF3wJgJl=7M{MN7nVR%e|AWB1lAjE&A!~!6DI!tY6xKXPx9{+VNc#}BL} z=tnc0G}>q&MY9sBPAsMTZS3Yyos#raGZckgK?2+RB7b?EAY6wpC9^Brt3@_})GQ36K)r7T2lTSl0OzerDSSQ-qWUiKMK zkKG&b8(?3KCGf5YOYl_zww;lB5dlz&MYuHkGq`zU>nN&rc&1bnaP&f*BAaf`^EP2Rz>Xp#QsYsPAd_@AawzqJB{5jXFBPw zP^r*yS&kJEHTMm_RsQJi6H;}ou;b>>a!Qtkfn@s);dk`(TFqp1#AS8ctRIgUn zfr)(isd5IXOqEnEZN)(+Q^=`@>R7Aa+SSIecZRoLGbR6-_#=!Y-drDW7@8fJ&NZQabN&9sY->d(LeM{8U=q+ACHz ztG=7AUUI{&uD4#lYj<5`+VuHlT_dFrw~bbYbWs5`ORiOYqxCpr zKya{0sUt9r=U1GEMdos(6DXDA*gO;DUmFXR`mFVlNQA3*g_q(h5 zOx(Ob3_dfO(*rZLxclOMO>S@!j&4-(Fy;HAQ3JC|L7|^ZLAUt2DO-{6-`b4*Vgt6t zjYGs08Lz~b$`KM(^9u7f=86(56J8stbexgz=1OrNUn?Uaw%U)X#_T3o<~-zL z$TSLqD99{sSY$<;M+h$Z4U`GyY6j5qIV>To)7JT9n11G_hYyPt#UxpG&E3$k8Npr# z=t-?7TnUBy#)>y*xic+|b<&fUzsdbxlxC|2yjLD6j4ay7sh6!AQ$=Zt)!^Z&y}_T`aqfr-gfGyM7+6XG@Q1U$UV}ylT*r zvVT5JO&$!IvrgzjhTbH|%tOQfsgWJBJv8(ZZE|X(_i0ug!mcN>sDk{-E*lKdpGSUB zRb6lEkDeOXZ>OFH_K;`YgzX;vJ~d2VHJ4-qjUIKVbzusUa0$e|dynf59=tc8iEw|R0? z$jmrS`s|=IVw3_g!F1xwIPLFrIFZEyq%?XInJ{y@-!n2)5qxr*@Lg#_C@pUe@~wsW z`!G#deZZx~33QQ*C6KC+V^`D^FNeAK_R5T4rs>u}yh)XMiO{(!o|n3mlIb}k6V~sd zD6=-}0J4w}8YN%vsT7pYs=wBf4;p%cR&q+>*tXUZr&wG<47Hpw4Z7ulMQw}5ZN~Rs z@sM7xLh?h0Q(&k3nvLF~Z>V3v_VwEIOA+8)FDWL4bCXNd4ESLd_2J!oA2DM4I*$}4-N+|WXwyBzw+CVa%ZP~SzYQVb`(uCuG>(zxrC`({e@RY!_YM|8 z>xp^xDbw!wqup#+UeeUI>@@e(ok3P-^XyoJ8pO!eZ?8_{=9A4Dk5sJ9*s6LM8_Wwm zqs)`6@Y|uEwB@{B&6}*}8E&-4w-B}Z2uo%Vs)O2A`w!rGP1r@#O$@=8p(u)Kbj*y7 za<-by9lBMJ=K@rjzeiWY>$fmMNUh>YYLxGU4F3sz7(?h3~g}}sc(`4Xx-%lk=+(d7K;@ACBy2dK4qpL($IV*gWRPUMBbmf^N z$-k05HC1B&hda$Xpmo4{x_0bmP@*HpIL>re*jHnwRz0bhvgV}Em%bmaTxpSetd>xJR-nO5YsS~^n0**G6UM1HePk}e z;Yb9vaUjfkK6o^WOSjs!n(A_TmWEHatNsv&=*uGg;mUXWS@ia3FppKPHz@b>cNPCb zpg?91^!4B;#4`00EI|1;c*)hoQ0YG$R>(}8v{|Qz8NLR7f(yQix}=6=ERgWaJ)zgf z2(I)5(17FJyW7WLF#SMWVOj{ zyv}RXcQ^8bJg&j3iiMnW-JYPQBYr=uc;4nxW==GWw222+u;rOB-`IwALg35=DP2>p69u*@ACP6?z_;@{AG;=w?3Hmswo%8oFW)k{qpXM@c@8Z)_6*}*xdC0xTJ$8xM|MCw(S<8lovwX9J{rQc zMGn9rO6#~yM#D8#?!e|J{?XdBIY#f)ujl4Rj59fIg*t`Q64uW$@(ZGf;%JE4n8l#L zS__^yvr(H^E}(5J6z_M2-Z$!~sIjnz&d&S6$tw$Y26&_S_^C}dHPW`H-c1=8yyJ_l zw`ZI@h9A8>Gt~qMzKOTiN+6k4KRWFo>eM!C{sp45eZBDsd}^Yn9U*Lm(eILXTm%1q!Kg099h*Z!jrlIfB(^FXzmdy2r;O_iR(%E#?F zS12HlZ|=&`x{0t@52uu8KM{BOaSE&SBvRMAfxj-HVbPc0EmlU3B5FuMHIkj+p(6a^ zno_{CPrOAhIh>-FeCBgpVpO@x%?6N7PE^mH543*H4N~G%syX%1xpJ;5Pf5jrMR}3i z|DG!gSi$cy?HH$!o@nL?D1yk~)*5LE!69Xq12~dAiRX=a7Sd+A+-bQoMuP9nEOe^z z-G)8Z7^_QI_B!%DX~XOH*$DqTG!X&*SVZfCHNXF~eif2qVGrsXN({DPimjChzI4M> zb8f~WG`CV5X?3}Mxy^3%itX{}exH?Vmp?3Hkh5*s#32`3F&*^>#rpYu3I6`g1K84N z+5S-}*lbK>IJc&Eb(pOWBYT0yE8M&`PIt5vW4$e{3C_DZiGnR?brQO^+iWAC!@}OM zQ!=;s`Y@C^%<{0n{On$riD(8R%5SyfwjL=f_PVzTGvWvnU-Yq^oT#!?le>osG^?T9 z?mjSVtpXxt2CQR%Uu^eCSi%N#V^^O*;Lb0<7;x(XV=Q%E!y&tLqDLD8}MiczoWh@l_xitR*U3Dr^e$eUDwtVJI2t$ODcYjb4|oV){4l zoJ)D-LIgaY*;;B;ML&=1At2X}Wxs{?t!^&y$4A)WAW@rPP5{B9iTi=Tb)s{*OA3`+%W5PlP#g6gDC5gN)T4R;XjHGn>U zKAD$o>#4#5zkCmgVj@-U6<62q1M4s00;&aGNk)2(LvSWM`zBBLqN!JGVH`XUB@?Ie zh!Kss!PeEshJ&5bQ`uUSHWOHgU%T+wZbTC^@{-x2CNkfQbCOOFRPZTgw> z3}CKX&kDz`AS*}R%ncIe95*&t&!sa-MmJhW2E85h=Ea(**q$HFUct5{i&$zt<C=Phz?nz^$LJ-J}>ha<4%0Y~F80 zl`FlokQ>w4Rf@v-^c11pBDKczhKd3@u}(@!nM>W?mkO=!C!Fq$zmRf)v-qVTb(jgqk~!h&M#ZXUYQ?7P4%(&M;R~lT;5!eS5NSaG zPvK|%Vqv`V)qsBcfCVFvT1YbT?lvs_lJKs2ci&#b8H5eOnHm>^{AdAVM~qW{j8?JJ zH&Ib{9o|0~@kdNKoEgflIl-I-w-@qW3LPqblB=E| z9&NEHs+TR}64MrSUZKV1hzZX>P#UXDq4}kn)tKrhot6c8E-9jV9xF;iN^|LYQxFDo z!?YJw@Z+5JEwK<*AyIuC8(J!URChA&gblTHp?PWUv%0_y4eOra_jT*i1fI(*)+4cB zB0ee##TLb#T+*2!Vq=(_Br_5w%$w+2!+zhs!8+?M`dRu5zS`>Jj0x(>QQU|%4h$(En)b?I-s#*Wv#Sy?yGtc(L8 zHfs+fia#VVX%z{sLb8OS(aJ7x<61SE44fLFAsFgtLp0-|lq%TT2(x&AxYN+6O}9MHnwO>~0}o5bJnwIZikig15Ok1#%{G`}{ta2m4`WdU8CuUv?kgcybR<>YgQs zle-J|;l12@aB{C9IR&{lW1nIWwnstg)F6i+?9<%`gFs+W&|zJ>@V zk2Lof4wM_n@dx*R`)Cm8oDK-|({7L)esB>^3SZMBf$uHJ$PA2xmwr$(CZU3=t+nR}Od*WoGKejV5PWG-{=i<5PyRK@i)$i98 z4X>aJ{jZ?ESE1l;<+NG9ctJpLUsHCWZ~*5n`=iUiue!gULZ>xbYZFo;oVc9aB^dRl zMrUCFIiGTh>o=>Q%RtzCRbLIL@ zntTo!(P5^SY>1@&rf8P?PCTnfDG`rQoMY;goH-~?tWnh-ZK?~(ODk0zUBpAhLkz%- z<{UA|gB)Kn6KER~tb5ANz(0PLkP{GGUblPDMdjgo3(7BQ1b@nqFa%Gm=&A*p8xvFk zBwK5WYs$6N0dUnug1cZ1rGOG7J8;!=Bc_dNcp7ylAhdwNIW68n$gRhgIvdZ3WzQy_ z@4B8sXHUG4jv{Ij4{lopCHb~_2J-s-q=AC%{$}8=ZPS|yx&~MhY#e_}v ziXU6Y^vVSNqAjxHG!lsIp|-k<0(dY-rz~~FgOH*af|4l#G5Y)Z#{tg+eNY9@?gs^T zQ%r-5Az6Vmw6cjsf%02cz7^9SSa`U9XEPJi8^QPjm-&c_T2_b`YXK)`?y7G zF76$%e>vNmzq7tcE(6q5qAk`1YiqqPoBbZ$K7-H6ULrj{MUjxe*d%&LNR=8mL2Exh z&QE@p;TEx!_`KYufp5ZVwOPKr7*>jjOJju@0$u=voJ~QV{siU0%=up6b{SZ8F(h;; zvT6ijXXW!`8GF^mB}kFj6qL4Z|}r0FOaWU*a0YP06B^gwth-Pb=taG4iG;Z#Dg5eJ4i^L*ZpqFu&|M_)aX{1If5+>dJNb zpkazO4F>7uFsE_0)4-2_B?zVFMj;6H>5-e&LNg5$Db2MJO*OGy>L-gff`KB1r_w|WrRy(kYiuK z7$X!)h;v2S|7k*X=#hgFfc&IGh62+wdlm4ftz(SF-!R- zZx@}^CsW3pHIpb>heY+(``AxOA$@=;t!igN+mmF5xLkWNn{$C#fe8S$@$dLd10qVh zf~LTY*@n6}i!@6){v?SzF`g3#tEJ<|0JKjkmhxuqcF<#hHYg-2Z04)(x=@kp z6lu+I#2oESc$@4Ry+l{s^EufZ3jGbz;rgi_m+k~zBGCqG@lK!$(3#X2K}cqp`bSjB zTP%Al%TZ;#kHSDF%G$c&McgvPK^A#YCKXRtvS7A#_AQ+@OGA*xJ`4+Q?69vui%KR& zz;$gyhC=8$@9vziLpfn(2|DN-`?h|MKjS8oG470nF`Zx1O!*?&Aw^RzCCVCXlEO(w zcZJjKCtnpAo}CPoBT`Rg(M?29L~&kEaK*b-cnX50ynI{sL!&iqHN~a=;FJ8}@*h^+ z6*FlO&Uz^Rq)HlGjs#o)YpgATL-*P-V1;$IM{$q~Kkn!ATnD^Aql(M4O}`cn`V!SOCxrP8^uR4ODoa_JweU^d8u*Zux47!Z#^dS-Xs zd15r%(eiK;?D)0VECUdSjGr;;?ewfyH|{=AemqdQi2VbdK5-KS?-sLtJ&*{f0E(!? zxu=){ZLTbd0rTYB){%=5`5X5@yZBi+WwSh*z=3lk1j4es=aU}TOk_lqp_}C{S&J8O zJ4jUI$^IlT=x5zOy-A#hSWF)pBI5+GW51(JPY&aZP%u#|jiWihTPC2{B4nS3cU&R> zsCkP`)?f}eRFA)oft|pRUI8$0060aV*Csf3++2xKWK`T4lbY`>7 z#Y^G=d8t)^MOv;yNfK z+VY5#iv@Fk%n(PjWP82Bm}fu{q@;`kj?6B3ba7;Vk!@-R0%c_nfYndc-_Lxu1=1|O zSS<~!01EO2_vIaf%en$6AqI0{y|Leco`?DoJ~}f8fPsE_))Tv}GNb}%_OS8VpEs5% zz+W0%w{$ODJidw8z>mxz&TZ~tlza6F1feIuJKCb?%}M-xXz+79yG;&d8i%;qCP~HO ziYclwX#W(-H3Pc>ycTAeZ7l!&j1`v`Ifx?` zkcIgKadckZm+E+G%H$0{K{X(k9#A%j)z~M}Q#sSN7-G%Z< zdE&+N9%jxeRq4f9)N)_EC3@jsnqgnvP~;aytbYwv7*jWz?NmhNkB4YPidhYXNVIul zA^*jwDz?s)sP_HiB<-0w3m!4_uaG=VC2Avomaw^2MvS6tCfrK9*aaFod(w^!PjM{lw;Jp8k@1yp*-RETGhw zmoxi%dHWJaQPbC%ufpzukl$BdM4BmF`~(^3MCkAa$Qz@On_)!KW^Ash5EqHzsYJj6+Y3Y zfHdZ10P~rd?qQQSp_d`b^*}###x@nxV*lItgznSPAU0TpQ3_|9(}9yp$*G}mF8OJ+ z4!1!XV1({SMV*l~mHkU>fi2ETrwANYHBv+y8oKO8!7NQ}TW;pZJVstrvBdH=mbY~8 zING|0r-WDDA9QRN=|$@HBUg&_(qh~PX?kxGKwAyni%ncPPb?}$tBr7hZN0myj9J{o zh?nkyP8lYRYi4=WTz2&dTP1;CrNO_PmuzNYzhrQ6Rla$8PU{QJAQD6F~ut?n9g zKnBkbP9|Mc_aiBJKGrd1`y|7U3qP^*y4&5MGUtE)u8@i$du7ypl7;lNU%iDO+k;CF z;z>JiDF?-8`A1<0rB>BoUpHAeWsitJG`pUtU-cBCKMua1V$rvdhP+B=VfKa~A?FCD zQI8gf1!)LiwIDP**A&k2?#-a>!4jB00H9|{Ri2k1WtFM{ZIoce-h`&Bq)%PUHYBnF zpBFJ^;%FJ${qGVg8Zd9M!M7$haq1p4>o+1EX>Rqpy?Fjsn_9Y* z8q+v~8>z-l)c_;ms#vRgJC}{1#QX+uxjfujNs>-BJ~N?RewCvRC9g4#OeX1auemME z)yJkhU6sfUJDjRcowY&u1jI%)L7h3Y$!iL*Y#tYGDsUBb1$HpxJg*7mZ{l;Ht;1rP z<1<06mU?}SUGt8&oUCP!YGttG9It4VxM6y(XsRXum?_p`pFgiLF#KqJP}iRH{3FF@ zhp#X=E!Y7^Y=t0MP<3Pp#p*WrbBCVYjJeq*B2`i?$CjS@#0U3Ffq8z&s!v?GMsonK+0mYWtk8V#0sb727+ZpDUo`_~u zNVbUC`=}8k?d? z*2<$HnRHBujuQ=w-X{bFcv+ z2x=^b;SSB<0H6_TCy6RlrH$Wx%bf)ots%>n;1-pf|1P#TY*j3S6Bv3p3rq zShU{Kn5~iymH~J0qh|7>Az*cLr&?{fve)LwoYTFz0wB}Vas~r_lrkRU84W^+Grlaw zt36{-H$5>x;>WoAWeVP5`~0;tTKB4UJSm~GTnswK{Gwk%Voo9^j3 z2VocI*#EINgu~-6dLXvRmaxjG0S`JKH2r=M4$Zn5Lbr)G_avM#+zxZAkSRgvFcO4( z)F!<(0HCoq*UjUnAEYfX$1Br$4QZcc3EWK|xj$r?K!)^~l(;`T*S?ShHNs&M7&y!z zWL)VbC`pMD-;5-`upq^FqbGxO8RRjxutSA>~5}}tV`}1k?2z2ylm56MOxFiwf)qwI_PcB z(4jeq40S<{(<=fRR4wrr<8)(DQ80QjM7m@5{QEs}Ug+~SONAkkANhri6u4q^7;psQxw zsS$gT@3T>M*^2qEHJgeWZIjZ!;}V{xO}`k|#CFU^w|DrY%CoHc_C{E9L#A=s4lv~K zBOFzlgI(Rx!Q_*LEzd!9#!Ez=@-+Got*NIm&^lha?u{)^jJ*6r-{UCXmPeX4y@xF| zuhvRVHEO|e=p#9G3vKza@M6uCstXs7sJYQJ+xG9C=;r*8l83EY``$@$6yDPgZ}pfi zQ^S)ovt+VZT@UTeq_T2G6&g~X0|0u(kz&M8rH63OW3 z$RpupvwzU{S3*7i*FM$Aw6A+8@Cc+G;tSQFgG2gmzl#hx{Rrtg%$8DWRxq@INUcfu zzJ;d!_LY9+6IhO|PSLU!l}$N;x<><_A9RLM-h`2fz z7Ih7M*Azvr!L|38eRlkvZwd&jWO}#~(QN>Y+h0eQ1)&v^WBfxw!@f1j(<%LY)$lX# zwzSI$)R1y5ID?P88}|fn?(1>LZ_z$Cs{{Cp)?(SkkpuVmnIe~-D*iKvEJQo>{uV?b zmHhrQS{fNSC~`2tuNJ4B5&)D0`W}%RacwZs%z4O(3J@H^-Xg?G(#UluaOoz&2W5oa z;2CmLmw#N9gKpmxOM`gGi7Whre2C&#@;6fVfJl4^b0b-J=d2zy1{;j*9 z7ETi!7bCbA(gP0JP4CWmQuQMnM>9ztX(|o@t>M;lP}Vc=1Du|PB>u)lzvd0}p$m;z zYbTD*8vhJFBhm{Cgnvrzn~hFs%g*pCIE3UBDjmf@dkc$spAE{R-J0r5Wy5=6)S~bW z(B~7GRT%9k&6(O`0t#LtBxMsPo3Q(3$hBw^FXm#_d&RNd0UDQe8MB6gmRa%Lc)$U3*yGB>qAREXVzEXxd7C^_D!f=OBzuh{j)q66 zXS*}v(aIt=3td9aV=;ntB{rO}`UXerl46Pt7O;hBZsp=roen@01eCsVOiDlJaW0H{ zOm0f`pC5QS0ITTIDY+32|AkX>d#o)|ykgt2T6E9teA06<>SdI>u3Ie;Wt0!-enTO-TI$qY*5$Z_>fYewEua8Aqm^W`Ya9jUW*fjNtKnwX>5998^37v_L!}`TM(kTNQ z&l9H$8E{4Eyqz)J__mi_qH$g_qJ}u5;0@;XUQQv~? z>&-#B3Z_1yQU}D|pDLE)ANDH(rX4TC0?}5_>SOfG)uG)NAcL0X z?vvU~UL#GbU=LF%l=FE?{3?wkfXs^Ln8n)XyN#Cxv;fb;Y=qqypqbm@Cj4!u+4Y$F|rdMYvMl=`Ld*vTeU z0Q>tY?(p&BdP9yF|1AT%0mY7NqU8QnM>`;qo2ElD3gxe>D|!V(9SxmCE5;ZxPJ{-n z(E|6P78~rw(xjCDndDmP;;FfEA8OncD$L>9HN8M|*M$P|6? z46}+K!l+RwXJ?9G?Qrll!Wh&^>UoL>fF)rzwY|M67fe7aWDu|J z6cEQ%yk}^bSOb~%l=aKjZ7_6SvUM1d1(PqCk=N45Ae&5md5tn~>+ND}y3Eo~%4@+~ zNklvZjM_X%>&vOL$-bP2lG>5^Y%^q{DI71nPHXiyM}@@fOmrfmqIxUe=0G%4_ zz4Dwytu;!;QEH2CEFBrC4SN55S%sD@6tqrx*T^oo=eY@3FSy6-dvxI>RJis}l{#Nzu$>G^S-4K@e3nekG3{ya=4@+D``j z%KAe!ywteBNZ_q(Q7qrWp9u?S;Y81y8Rj|lV__ZmXN>vz(~C$9uNhB5EZ|d=YkcgO zG+OmTeJ`fVVXtTj-&CypTfG>(a9KgTF;rG0vjk>(UY)&T7qJo zqkDn4{o2t~N5`&Iq-9F6Irf&AdeWScG&tcp_-rmj1m|f z*3muM5&_ZE(!f8Plav~W-%awKM#<;hQIC~It+*>G4-)X1>0UF-V&=q!v|l(tuD9Yd zG53q9&H%Ax&A*JU>9G+&hd*_+|MH20u_46&iRaJEcUF}F#E z_VXOR^>tob{O!PLD7%HSMTbj9Uap{PZO_MJoYMox0KR|zHf*Cp0*|p03;Bczg7d$e z<1X2;b~Lixf;_G{H+xmA28LbE_%_aK#3uBbiF)cz+@0lCNo~$l)Yt`w0jd;X4(&O+;~l@Zo}ZOl7}>@f z*$Y+gk8Oc$gPo9&(`3o!^aO#sOyX|YX~yS^yAd&k_W*am{AD#oPWWGP#?BupTE&%B zBPbesMmc9(+C{@Q*N9}N*{0GAJ70cCd#`zDcG?{JaxtspYBds8dwq7@K{E`|AqCGk zxFZ_d+YkZWiuEb)byx`s617@DeGL&)MB7%b`>GbM^7oX2FQ!rb`Kc|SGjftgll`t3 zv4k)_kc1d8(n|eah(~m;6C(Fqti$|p)CCWE6Bk%6d_!(XrG#m~`4>~Y)ff#h@#Hta z{t$qMT=Hj5vC}C>!hLaRBR*p~Q{3r?9i>YB+QXjkCdb$-r>Br;Zdhgft95PXXR*Q( zW7jl0$}*<9?p34N$*p7ulvo_g`kt(=4RLh&teq&pfx(M<=kEa@jE8x^()hg^Q?e&mK&xBH-#!o^rO48e_Vyo9d zX(;-DZfGsA>|H{usM5x_e)H(*0dXAq4oG#<$%jiEMk+uYIa-@#y8`xj94{xP;PzZ` zp_#yEbnDhX7D0r0w=r!nI8>qhW4g> zrvGHpN9p!xvJ>+$h4RK0Ss1bnd`jK{$bLG?-Z}O#U5^APo?MLdV!dUMJSwxCl?5oS zU6l1^yk_hjDT4pveCh!bWdffTt^5ynOMsP}KakVL=S)5;77@;A7ITueWBG<-ffBj?GA)W#kJQWCQKxyC+fgrc@X)?Q zM@_8+j(z@%T}-@1H$%&BF`kY-92feT70fg}@ZU!jv*y3(stbJ?k60B?_LW(Bel8xH z~H1wc-RH8an|gwVyS}JgvRXF zRX4k5yc^!08>ie?-dBokpv)g1ta0v0+vZ#^tq zhy)%)I#PU}_IrGh30vp6@avvbKUH5<-`fNqCa>q$)VV$jO5SU*W*eYcGx~7H*2kRw z`tl?IPla-*9f!JdeX2Z}z5K~yl8u#@x%V{hfvWME%XdV3AwLP{8LHu2*WQx}5PGyz z8FxB{Wz(r_Y=lehsNMjl5$_CeG;H0n0w9M&UTQ(%aT+1xblRlFH3UqN(enD5B|hk4 z)l6Hd^bMe-?pZYS4E$h`vUe&TdMO!P9byXBPK)2u9z~STJpAzcRI%X3C>Ae2?%2Qn z)A#ZKLnNTXs@N@9Z~J72rN-$$v(nYKVW3DPBZe!<(L#_deE?8gaC>?;f}qINXi2aS z`#U5HWYx(cQiaP-*v}o`IgONpxIP{N8#@ihucQ9J!G}ZYeM${xS3R4oN{$rmM(#ph z2#G*`4UOn$8BIye*}67x$C@|VxP1H_Z{svTRd*Oannd^VGjf5YbVioiOdRmI@ zVu*L@j&1ydIe( zN>E&+1E7Afq++}dERr-7FA`Z0x>{te%%zbRid_jb^)tJ>^hX@$~u@3YnIbx zgz)L{AX~~?$;LF)wOM&>G&V?E`5e0?Thu+?&1__u>9S6cbW%J27Ec36k}Lnr*vPJC zmQQS0(QA{dzlH4;7Z=+$A~>G^Se;VV`_4lldkY1k&h+iih5yoPdF$yK)3;6J<|}QJ zC?8>DS9t}$Ok9^5FT(Uoqzd$PwWn(Oa3iu%6uOm(`>_}&(FVG12gkdhlm@lN$AUoS z$q_~(3Ms*TLZvqYyypSS8F5oJ4b(Dnrmf<<&#R48tT;WJ0tK<%~QamJ5Tp;f)#kVugp$QzQn- zDJqKx#i0bt5D@cDmkaho7&Z*@OdLEXBXUJcnsG5~)R(_<3})jb9xR|lYFuZNV*QR^ z_>AuQiS%_IYis~F0REs<1hwW$V0iRE=@Z@iR`G@hF2|2QodSc*^ZhIOgPN$ zwgwrZLE$w9s#GF*89mjYTBgX zQQOUtb5Br6Yjek-0$rwnFM^I{sGl!SR@>&CxQV(QC`TNyD6)_ELY8w?$6X7eAShthK7V zzf1d2u>GACtwn*4$WG^&S=yD;v7A#WFPCl7ch0jn)4-WC2Z&?dzO~xu!D!8f=<5*X*kLn&znWIp}&W`)bfqi+Dc`rMKg=s znE?ptQudNp<4`Rmmx;=?KaaXQ57&T{6WFZy7`1m(QV27VaUgf_4uEBrB zFY%7WQ9-&W4!l)EPsJq?-5hK^IF-|&F;?Zqv$PE=243G@!ku(`qRyNzLed zjTe*Qn{-lu_vk@xa)!{S?n)Mv=s|gd^7Pp~>?p8|CZU^@iQyRNtVBw$2u=q0^+`*m zPAB)#i3bODa#1{V(lmrX0PdLH5JW?jjn$~hny%?y?;blXj+!|3547s|jB4K4 z3TebBDL9e?qe^Ca?D~U7`x^dbNMQ^3Mkgpu=jdORxk^*%;>ID6w&SKev1iNc(fcQg-t))An~K4BUUT+9 zftShe_D|cqcg@U8vH;5uwJZ=9%*XYzF5A_8wJXYl761sYJRhWvK8lQO*1W4k661^> zqKxxZc){l~pT!^mcm?Z(n<%xUDJtX7vsVUfUy^85EwkYkWnT$4*;RHo20fdFhWFhI-xt z5-x5&>Z%=yc;qC8`bcK$>MWxqZ(CI>^x-t~C&Z+7GK~5_1C@6sQ}K@)YGfZ;Ox-4} zwygb%MZcPoh%aKx!I9rD#ygkPv->+7BcAOq_!%^t(Fm!O_7= z`1}~Wf>3MAV=gyHhYZma$%OB3Y+{=Y{ZC!I-b-+H!TWlh0Z-)$63g_=yHk5?kWb7B)N9@LwpI29}ml-^) zuj>PNd{I<0sKQpSlJ03XEyGBPwZbSyBdsm|fCnkXlmEP=fn z3TH@O-dc7KP_O%YxRiBNQ3Kaj`M6r$BIH;FJ&QoCp4X(bMkyjUXH%Pd`0sC!UWutY zKiduy-%cHs(M;%^uR?JP@&#lWOzzM$P|yW%3t@k-We-y&aU-~8z&(@S1)Fww{kOhX~+3D#_k3QPD) zJHI95=_^6d{keRM z_m6Lp2xhNxOgK=1& zCIuZYDn3JmJ)q#Xci0XM(M5S{v_j0@@}M0Vi3Fo(U{*Lm{u34-haO*q8DZAv!5*ST zqRdB*l&J^Fi~eCK;6|w%?b=Kd<@(S+>Hu z`I^Ok@M-eIqqh4fRRjRjp0@KF9km0u=(uWVxnaHcI?ax+f~(Gq;^YByOTiwV5!7#; zvRijxb5F2@na?!w@HK*i!vtcxBhY%e;K)X}~nOn_@ha)^G3 zk=Gj;&u?uxhe&Q8Q6L$4Kq~M7aOdDq-?Kp!bv^r9)NJ6I8Utyi45yXG^~}vdSbE;l ze!M=D8Pa?)$K)dbTml4ene8ARXsHMj)in4~k{{x<#3M;o^@CuvaDK8Y{A3CA=7?Hk z0^QXksLCyQo;cQ>16g3pkuX*sDV>tEYlka0N>{D1OTT;Ti2|PL=SE>HBX_|!VR!vL z;$q%UEbkH{3LcM$VY(TkNSH!5m`zly#`NJXH<-*MKo>&&wwK5h8Bpg zs28Z)--(9U*aDc=a+so(2HD%Go$i0>==vu5-y(5qU2gXMRN_P3gP%}OZfc7Cd%Y8L z0gv=EIw?!+@wqj=$MVd>h*!O9q9M4|L5Z<6jO8Eu5X+x^?_xR4KI$0Y%}*aAM04DI zZp33)qQMUxw7IZ{`sI|%ekXp%EZSA^I!@?$Jie-#TO9zwP|avloTtDBbY#YVer1&Y?}CAV%}?SAJUCdBxlxzeM+dvgZv4@BHoZ5QNVgh1I&} z!NrB0ViW+v3-DrQN3FD+dhC3aneRAx-WtZJCq=spe*#&O_{D|geuytYlG=~a6|~}^ zt7E`0mNfu*lm#*?(&x|^_1}SU!*4E2%AEqBw{$72d$X{xdN4PlrZgk?M`0wgsUM1l zkZcNWsDJ1$VAKvE0rWQ=et*dT4t^+WwDJW+fj3|jN#7l{WK&Ew2f=5Ii7_<^ytgaJuG7Zc7`je;sD;TkxWdIci)RJ ztG^}sHjpedKq`a8*p#riEd(pCVfJUhR1n@#z>7ICqtY`%_wad0a|B*v&R8=H(Hebz z(m%jxSBHPhEYFW@s#Pi<2uKX%NT0P8H`L!6QD-U#)O|8X<(SG+6Q1hn8B^{upwbAo z6nv!$P+SSdn27!MYlFOfmF8m}etk9Ww6IvLFn(J_O$nTT8yI0XR@oh9(vO1Jd&v@z z;3t@T6}mROU2G}{p6fh}-lWDY&{v!hR5t);OA1qsE2($w;U(4@H6N5(?>U3!eA=xa z_F5qikG31X;ROU7&{vx6e(B585CQtPTf4&TvzG(?YYv~>Ea%BjknMO?mPRwAMVT;$ zO#Gtxt7SEMCC%?% z!?&JO@*?9}`3K~#Gh$MCjgw>zl~MxS)y>Vf>{IDgdvkdo*e1kik>ET#v0Mph)l{uzFAfTZeMHphHWE1ii56jEBJTs{WvxrqXALB}&h&lg^wS zPl{TcgV|I1oF@jA^o~~XyrM|E6EUZ@Z8>%Bv~Q9mx1eQ4*@D-RI6P<_I^O|&@HW;a zp-KL%&qkL`QVNJJJV ziim1{5j2A5u+lm;I(2tyP?t79M*E@+&sdLs_8w=9j}T^FNv5V_?Y$e)Omp#H{<-Gi zf=-{&*P5iOY*PS}1rW+$>{nyzZfkS=7o9ADfK6{7bVFb4_JN6BlvVo8Q}IcZHg1yV z{BNc0n*(`|PM$OE(zq9n3H`?)}pA472M1-vNpTi0A^b zi&E*otN-e)VxRxfx(!}2dn%imO;Xcg*JjXICl2hTK@91QO1KozfIGSeNhhW&5Twg5 z9g&TcG+>A;J|YmV#l#N{_|(>K-n|e4YPkNo?53{ED^dOl1xlb)*2D+1BGw$flufgb1?NxdBeqH>1_ z{X5eu@~hen0F1w(Aj;fRAj;kY7bHSM3{>oyBuRoQ4;xK*h%ol3(=CkLYTURe%+)-` zaPWfWn9eynwuAk5{U({P-XUX*G$h+|`6S3lO`w$~EN=D^nGDkn!%&{!?t=XXrs24$0g6!Ix4N%=U+-9=DpMIh zABhJ#a}ndZY^ZbcEl$f@!0nD(Xr)&ce?i($1p*AyKFPy=&wF_d6y1_J?PZ|d&u-r| z&975;oo=%jS!f*)W!AF;HI{&|TX0}Q=fv^A^SM(Wv^WpIMr+s7wP%#r%;|HGGPmgN zIm27Hd3%<8g~+lzLNc~6L{&TVOCTy;A_R9pLEVzjCLE@5H^r>EQpb|A3PIU8Dancv zRVIe8H%w0{m$j{Tm$w`iHzP1(!)D8#@-#OO+_96yxJ2VY?XR>zi;bX>ewJm z`K;Fn5}KO#?KC_;snzt*%+H93H-?U1tXlLvp*q|>oU~?{#HP5nCD~$1PsI8yzvqWg ztWfs1ICC;%=mOO?sljp>G&_u+7A|FXT~BUj@9PrKsLDfD6Z1y_qtRH zu|BZz*8`?Nz*v<@?iZ=pgPcfc6s5L2sM?Vm2>-Vp^MaZ@w^vp8j^$7^_Q;!zR=RQ?&P`FS^4&mW5%gh{UB}4 z8U@CHt$B$Q?LQIi{kht5+6{8VkHllG5kCwz-)pgQqjMGe3uB>yb9bQWQ_H=#619_u zzom&~B1eW`+VW?kyJ!8M)&eyJzZUG1J?*x{%mMZ z?0+pUBZaM^bsjSm-F8?GmkCtH ze)S^xs#dGC-!br*8wkL-%-`1x4VKP)u|eFo6rys()vZv^O5FtylCZ1fwhCwFqB`*_ zfPe1}d9GXuvW71~Tc@3pYphlAXsR@3sx-Iz=5TTvzfZL=f)m@81YlxHKXJ?ZK|>{b zkbH<6BnlVr8ie|viYwvevXTp^G^)YsL%FgXNo<}}D+JSapQastX;Q*yStn6I*SFx; zbe*WSvaQNL$q!k`uHIV%qKG?RPM~tM9kxunUODox{RF~S<87;FH5TW8NCeHoGmrcs zAP8~FA1QHe@Y=wFv|AkU&FZJ!nFyxMWQvoC2p7SSb(Cxh-mV^A6C#UjP+5Qih!RPf z+_ce^9~kA{ows9yq?M~$z#O)pnj4BGJQQEBy59mq`gtSzc|pH{eFOgn@eT4D)HmpF zFyCOm!F_}OhVTvX8`3xAZz$hTzoC6Y|Az7H$2ZJxSl_U};e5mWhW8Es8^JfiZ$#gS zzma?+{r2-4**EfU6yGSnQGKKSM)QsK8{IehZw%iUzcGDd{>Ji+^&8ta_HP{DIKOdy z`;pI2a+4i3pnAC?mm1jGX+qrgf48=z(HSi*(!8L;pXK~=zr2!%lX z*F#)n4a?q9F(?1337nz<4tu@a`qAy{V-za6*0K~qGt_TjF)5tEh=mTS^D0M5tR|we-Hc56qw1=2u(RUOuhF{7 zl6(`D205n*_%eA?0}Q&757XZ$zp~m`rM*@(nl&s&s|v}V`)xbSp4Su?1VI$*dJt;{))`{yCd`;mjLf!Dn_E78ilJ9%Rl} z9Y6DdJ>du^&PUvHS@4fx&?$Or1rRDa0gcD{i-E_v+$7^0O;mc0H==^gFR&TY>b?94 z4r?Vn>mQG8}*V_K=l%&(NO`oU>@UA%{-$B>9bFi*?Q$cL_NblO|OhHE+~^UJXU zWq=yG*XF7Y;&Zgkpd~_KkN8;6S3$eRfJ_p9CKrN@0HstPkfOfuar2bViM6Dx+94(WwQD@!C=d{55erVHzs?km0q1W@7s)hY6oDFL0SBh!vbp ze)CrHV6*6Gbx{^0-5VWP10)~ruap|dRDd*SMSB~Q_&t}7J0v!pjmp3z(T`=keAP>B z+O_jGDZI>eRDry^Q!#u7gaH?ynxDNYZ^`Ar_h|nL=RANznMuEu%sHdi%};2nI?GQu zZkH}cE14)85;;efvQl!oF$FbbnYTh2rQxtqMGdr29Wc0k3B z)wae0KnN$k(i7g=oAX%a_H4g*U8ELZPbuH4sJMvL8K;L7;+R_#QXQhgCTo#bfy+;- z00Id50SgW|)lC|{PmlT`{lO${591Qju~G4bejvW1bVknAN>YDLmtOzlmcVj-HJDN= z`bgSJ^8HWKUoZHvC`S9p>*wvkGeFLDm-FvtlC=SW*2Z0wmu*=od@cVWlKc_>M}7&g zIa$8**|7hs<0^pSXtp&h7A#m`13`kj1c!yi-QC?i5Zo4*;1U*>;K70~?h-7x26qjX z1n2F4@4NT?_g1~B`s$lG-|5q*yK1^-x~Hd;g00Fp((d4Um9YtG50$QNQh&~XcGIF) z@*>Ic;-9qmRck!c@0nVzA?Dvlc!&7k?`hLuu>~Ca?$y6lJmqEV#jLS6ImbPf1J zOQWaH1r}pa5&~_p0_P#C${e|+^DtV>RMTVMWEw?bhX@vSHG2`g@)+TT>`FT{F{yH@ z)$nK9h@{RmX)T-Dw{!X&oUKy zixKWB@}jej!P+U!KkS_HglS<2_wFM>&jiYD-g>XNA1K3T2Am40Sp9qMZjsm6 zJszsqOSmo?Sq^*sRRk;Ifnk4%o?niG(~Vs+m+wPcYq-GIL&Z;r0MqrZDRX6-aX&|n zftq`=4g<~1kqFH{U- zB{5kod;|n=6Li%bObq$KiyyfDsc8##4(U%2fvkp205glkNOQchzJ~l71cCHzmVW=ba6PIz zj3^T6Hz27Et>9lujCG>J8G4iKzvg7(b78GeXG$C<_S;>EJZ?`0gYGaCzeYP)rpDZ* zxj>C>CxL*3v!7pnp@(;Tiu^ubcrdz4$vmM1{y3||aKTFxh4I=8BZxN`+HcoB5@^a- zs85rh4g=wL@j}edIrQz|n@O?US$-Wv`S@fVL{beCf9zu)c%yvH3t z*Nec4)+_GA8pZ2=fDGb1QwL7hn2YGd+|^>-;*>Pzr9+PIYQ3a%EP>XH>x#|iZWwavg7BHm6p=RpgU9mx)4desdWHx%w;aw{d9j-A~(i?Bh&r>;Msd!9AS^ z#gr(rC-L;HAvc{no!Y|158vKstpJk`DA#2Qb-D~S-_Uyov~IVhov7Q$(D- z9&>oVU4pQgxyHJnBNLzDKPRt>JZ8dwH=+X8{+I+|K3YC=iPmBfa}0-d(=G$1zC@e4J1>>gh2suP5=S8n|NDwaN8x!p~>2T8>Tl`mV`#P+pIxrBe- zrXI2)gTe?m$-COauxeXz>V#!(N56a_0{73W)^z5-A`Fq3exiCnsnVJk+xvB zQex5kk9^|!5ERHppPq7Q+^|lQn|Ggl<)(8Z#ivSM6)}BVTF8byJyw^`@^o0SRUR7k zYQNcQ5%qQQEu*yl>G>~gB1EazZnwwdo=VfAJMuhHPeuXY`(7UvNK>fG0WXc1Wn}ZQ z&Kvx&_zt}OtouJdv+un}XB4YngMxsrX#;N@(!b!})QB8hu6vSrPb6;~e4Ad)HDJO) z|2o<&PEVa=zK)Oo#u`=4v>1ob`?)}6G@YiCtYIZ=xKaf8@TSq z!i<~dJdj?l`&hgw8*;RUpjewGGNckwQ}#|3FKNpziYszF{!7*RUmINxv-pz`@g zyvHiX|T0P5)<(y^hYj=G>7mcP7)m{Uccp1&JVxbXHLP@}q(8hz4T4l?`AlEeD;$z>}`qacOC1q@aTE z4f4vdIa6YjV>Q68rZAebb!iY?E|*2jIPyAJmmyKUVTH!{g3oMAR(Y!l;hV#3!9Y(_ zSiRIGg}Ysq9fWk$x{XCsQttI&ZSk`H(&meAcRw20-d)fQZ_xdS=r26xzqb3_Lf^qM z3jMj`Kzu(A96!+d?GF^HBC1-^#vNbmjAOsgSbhcZAlaw5EE) zIp9BSqO0q!(cNP}~LUa%CB=bGu^}C1J7>9n7}=b7lqqe(q2nk*Me0ZLD!;-qpeGJL4jm9#{%_ zakI%G1aHq`#N2C!Z&%pTJnol~N}t$0I;@aN8H$yuCyJg! zEA&&Rj%y)auqlb_c#v<@8lo)D6f?fvfEuM-!Ze8YkkS{8Q5acJzlR(VSd}ltrZ47` zVvC}t_<1f!Er|T{pZB6T!Je8gf<0#usZoTHN7RC0NrmFC8Vbc<{1d&1uP4+Bgy3k8 zh6@BT;S9Di;kf?+hzt+uio-x0DdFdQGD7ixLMs-C#?O>GB*2u)=c*ZHzEy^ca$1H9 z_;2i%iT)T?qr_NNqeT8Eb}J(G;xTqz;ZTByOy_5k6az7ZiT*bPm~i>rG^0X1A%8XC zAGrAXKB!RKCmW8xGNp^hP@9a$p!{#B#$)vVJ==z*QeVmPEbE_J6}ijA_m31t<MFo!IxUeD;tc{Q_f^)1UQV#^~`tu_04$kObif{IC~OyPy4HIZI_fCqaAnZq54wNIoi{6|De0Nlq^ zk|*e0DTz2SyzFurkya|n976>27EDZ63U`502idi!g~~RORjUZQz8E9KtO>bgL}18D zL2LT|Z3>%#{paN$YQNw)yDlZC*&8;^%JaaD#UxM&>tXqzm4cGyc3m;uzgqM+{Xb;a zC3S*1B#9ijHHkp7}RR84B!30}DDW{%EfkoL%13Ha!py5h>u+U2&Cg zJ)vBW9Lsk;04f2m=sSPKSbc$UxI`Cf<7l)=h0bm3`$$nPx|RbBg_%7O{aaw4V7o@?$l-Wwj%L(j@8&GVJVzkG&u6XrV%*V}>A^6Yg{pfA5AO-Wt|)!7m!kf9 zav)BU0a`pt!K(u;PPu2o9L#wAUDrW~33=&Vt}D(qjO8u+64cGu+k_pY?6L-M=LS;5Y zLbM*vvx5Pd2zqb&q|)%f?6kc3yc2%8J^*_k()SXB=)r{IY4`CZWan9Pw99z-{bRG0Ml$Z@7k_~=uJN2_3CuK=ZsXsF(sh-@>V)y-#%q4UART|+w@EA(wA+v>) z?KcEry>`$g&@Ws$0cQ*Mo{WNv36ECmI2H)m3(Ce?U_89Gs1E6E5(XDUJqf9 zzvn)d-dAa&ku5MHO&B9PaQhqm7*Wy()?cd~JbS2f7uOY)7rHw}t81knuV4o}W8pAr zQ4yzUNs;vtC}35Hmjy(0X$_iKImkBReoJFHIb6)tH&>XWf|$HCh^$_u)Jq!RA!FuJ zs4Vl{__HlB?~{naMuzi2L8vVA$9ga51j?3}I?R+3pBzpruW5D?-a5!fFP7%(PLr)m zC02g^bIL);C1hPGy0Y_tL7-7Gdip`(l=G#gPKrtY;zHw(l_GOTF{QVk!gw^zGI5g?uM@DOBqO4Irg#{J7mcRL0W{MOF-2emgzxppq%&%h`KpzD zX!Xqql;~g<+pHj&EqwfB zKY2)nHfLD>?Xr|^SCI6+72oAuYGj+^>o4Y?k8Bu1vHA(vp8P*TG*mLoS9GgOTVC;1 zfw^`3A0f`qO+EV;?<1y7@yg=sRs>)2vnw2a7HF8$Q90yH08>``wlvA|z57Pp1nj(F z&WrhYrEV=}Pj=RIlP&lZx&%z1@4XLO#va`oAego3#D^~k*%+~_pR?L&6Hve%mjhar~+*@7r(Hdt}Vw}oKMRKt-9CZ}SS zvM{KngN&CcZiWhs`(qKsmVZunfR=U|?rd2}{WDB=Or><8(RP6&Vfc_GGu^X%*CG6# zPlue?p5m4zJ_4Q7!^*JbZ2Xh&#Fw!mYmCAre>Xk1YDF_6mjgBt1C%qwPR-8E^sWt9 z4WuZ->#dVrg`X#$vd`7jiLYn**M;zWpgL7(og0g@s^bU3u#G9-oFp#ygMdybmz%1i~%u_RsLLUTR8irD_|p?wzaDMn-93x!6D-FrZkpU zXSb%6;75v(^3lX=_7W!PqlxsfD`jJ^L3c=6S7Q-KLULxFYfq!OusB98H|%(VpLjp- z-bqbYMqzczcB*)G>d;Qc!03X4}H`DH{E1BD-Gv+ zJWN5F-7TL_5l~w`ZV&LJ%)UiC<(8GB8cS8)&tiW+C^Glv{)oXBl#dlDFofFQ)uZ!M2XpNBvpIEsfp3@M!<8dl(0dr-70o?lvh7I4FOei< z;;q`JBeS~L{iN|Oi5V9ZdAlIbXS|!Y_?VBxzcz6rayDisY^e-E-~4epS*v(X8){Tm zvzA&?8{a(~Te;tR&aH5q+*%hpgAQHZJjnX2o4$8ED!*@%XWwfB9udwg+(uFaEAN&n z^%u|yYnKi>q^7W+87~YvZszVkwvb6wPvmq(5#-UiJCIW1MjIMFSitUMrfNJ*w?(y z7usg|)eB6txxtSZJ{9Q-y7g>R5FcYvt#NX0;MLk`sxy9bWLPe|E~aHaYIN|^3UPZQ z-GXp166!eT_a>OF>}vG9!2$81^Dbc0B>$}TJ?^jdVS?$mM!7lJ&ZS7?D3R0i-#_d+ zU7y4B^ZjKbQqp6$H!VN?C@yrBAC?g|t$C(mP$77bacz~C70kRQ{0^v+c{Is{ApO<* z=&F^dEqm~O-)qK;2Qwo=I{E5mc*ZfL1`^E=%nXqFoxW!(()U`*B`)SKEhN;vQCafL zR7psa|Ix)N1^|70I?R@%jMK5D&^ihCDkpq3EZL%2I zyR_NWbtu2^xyhvlAbRAN?90iKyD}5flD|WKpd9{D8>>kkV%#yH#jY&J{+vPwu<1e% z#NmwdruK02?#@DDa4(3uqsR6!CR(=&n{C(fNfc9v+12GmMdAgUIMGiQEEu)90oL*$YmAIST4m9?jvO)1xtwyIIvnt}qEHNoeX&ru1T zu3mOhYrfvf)+vyA*t&1|blq4DTZKPb9qBqgCM&i_=7{9EU#kSiA@beAS-$YxLyoM$ zFK)1b8oM=NKp#mCzkc|kaI^{ZWfC~)Z$B@FmM4K#0Dr`xcS&Gbz^xQiG8rreU?qe` z{>5L1pd){AYZ??g1^poV|( z);%;Y6)X-2`~}^HGZKL+b($PC5GwKs?krpfb@&7q;|`%UfAJkY^a{>MS7AcXjQ}Aa zR3#1W703tmOM|P;w$QFLFg@x2E&U-N;353|Xm)|ZH}41o$ULB8P%sVY|4nEkAmIGn z5dq&H8Vm)40IBiNPAFIuz>}Dk4lnTUaR>0XQHhF`IZQHhOJB_U-X=9szzQw;dH_sf$%xV^M-LugD z3R>3i3R=Gk1verVZ9T^U0`k`(X&(v~*mOCNY}|X3JQpHyGi~d#>ZHYh)0)vnZ{NtY zY4g@|@TNYGfDI3pZWr-~_gA&Eq#pdLS3-B5oqLhvYJwvHy)OKtP-yQiE{6ew(a6?x ztErO#yf6N9CfgSGLbW=ib@c6p^%+b{w z`!;{#kczB`nK6F8NHO=SqSF7i#nJ;Cm1NugY1J?f<>d*FeBgg-17Q5MxcB-2weE>> zvBbxT4XxUW17lepKT>c!Dt1x^z$_06pK5}Gs>74pY{oR3yS#dk(?*fwZpMgXOR=@# z+XUo{Mj_-X6k_yt&)zy~59YmGyAk}&D^22Nxu#$^sN#v3;>S^2IWrmL`Dlg|zh1Hr zW+k*22z2I~g;EiPexO;$rd|{ftjY!0y@^DG4(7D_ES1C~*6jA(S8VQq4*AGNKQ8P6 zLSU;30)A-2hKSOCjDb<|#+-_9bTbypDE3suafNixGJEN1TQPi3RgZE*Kr!^ipKMR7 z8K0Wq_JJHt$3K&2_#74$W#g)v6c-$N&ZryH7H^y~aIlO>SO-V=N-A)&kZ7oSl;>hj zi#rw_o~i0T0!2&$>RfUl6=t%Zi6sUUYB45M*%}f0b8rmb3^T}uWy8KbQ?l&YUOTj? zKAjQo$Dfvbl5#0^d~z2kxyDcV-2L=R@SPZZj%)I03)ygJwSX! zUFOO8&&aSrsCFw5_+a`}*_Czo)4M@#vo_+d$ra4$*`u5KQIOlmFd*!orQ$daqmCB~ zS_OR3y%f_>sc>jCRHiZK>>2iV3ewMg6)H=VrZRlo-hCzY<{}MNRq>>q&+`!M`BL^} zDVZebH}0QB9<4dJoCJ_&h1NBXyPqfXvgG#k`Q3doiZx~d#}HVvZvyy#_dOBdX9`2cE>!<#bQ9rnJ&`-VsW!amY z2p7vz9DAPycsgWG-{`~#eqo36d&H<)=L!BqzQAxz@OWsk@db5PLc8#4aeT2fFPJK4 zaBlJAPx#DKaE)NL5$cJ!i)Pe6fmRbOrTe6+53bnPZM3y^*s#N!kFexn+|cX1JS|7V z9^d*5O<32onB&q+dNJ_eg?&2)y*^=-vgTyT;@Ln2tRMv-;A|76B$9WabL2vM~gU5>kb|1a}#9uhw3@+qrV5l@_3B~bwfF^lTMO_8FIyJA*?aQ4QKZP;q}RxZ`?78TgwF0iS9Cz z4eu!x=yezYX-zgSNj7NG+1J0N6{DXfog^1lAlmI8U-ja;oHcdhj<}^z6q4aZcYPTF z(YdsTs1lsI`gy{nr&Mc7Tl0|ImVR9I-_j)>t%*L!X=V6Sc^8aj{uaLx0xlA0X1Ic9 z<|xCg_73TZp5o1B7LWb!Pev3!xMLbL;JFq>J1|nxSId1~(FQMTxewYfa7qM1 zX?{MCa-h7x@+7elHHQBY!M7AdM`(rSE-g6|_*{D*8N zkm`)~1@0&o@bWoJ81kas*_rf7kfKNw$a5;gQ~Pmwu!+17L#L2zS@-Se1l(hl9E`-4PGZPi~!-oFllP#tFk82^M8 z;%!oL0u>W4ae4R`_L3(dkV`TDR&D%ryB(EvTm`dE5QAB0ms$u8Rac0roou)wb*3=r zX&sCc8nuyXQNYamEIddbVwv2g%hDdHbF=biS<^IjDZ z(w+v!Wlyv5-h#@Oh!`yo~Y0gTqY)0qZSR`Xi*`dhmaW+V}Ldqo#HwT$#yxrTF*7KRjSj@ zLbg=AvM;P<6Q{e-T_wQRN%V4kOC|Vo=IjoR#nIJXIstM+ z^oi4MvCCL9Wv3@02%Dwg`u6pZ7^?UpCd;4Dm7ya9#vKq;V4;@ zCb?l9h5aJ}swk$eiqkIF$`vp2qX5CN)ITTU!j$Fy)%+BqAU&l6+!EWJ7GiP6GhkPMJ9{pQEJynh3-_F zTe?FzQLU(uvluOIMXj~AnDwIVu!XqATsnA< zp%r?S3|Wyk_CEzEgUkZ#yYvVcaF0QoIXM{t$nz^)bhSyfAH?bgckW&C2F%!cp>>tw zDg3Z`aV-U%OqUI!b%kmQGm1Y#3SKL1CgbqpP%@X0URyfqz6{dG(nk$gmY;|o()1*_ z#KHMHr3}V?@}1a?8Rv)Z*(xaN>E|;HOPk~!_1`sVyMt+xC*F0!A!)RVvNK-* zmZ4^;MVv^Bv}?(~Vo(y5p@L3N8cSZAW2}~+5S1*o0Qb=Rx0T**A1C15_80wcNWGF- z=81l<>S*44FntkKHairDhg>%mwkDPU=v&MRf8WxKO|Kih{$)bnzyTJaG3UuH*sVxK z2!0afi4X-NkRVT#ThwWjS^zuW_rcR%19% zrQsNE&ML* z?k+LRQlVc=dF%)@UBys{PWKl$KK+Jj{}C&PdL0Jg9H5^5e8{dP$06UBHD|>W;Mifw z{Sf@xD-TXaPU4U^S05g!cW2F{ro*X0cYeF9@~@+>3`HY>bEJQ0dG2#3>E;P*qP44U zEW0-B`YDzDTBXZdys3hy96k(CCx{xCRRwM3TU#@oK8 zJ1{)P*a{|#uqigwLE2jGgl3@iH}sJ_qDJzkZyc#xjBcleS)qa&*F+~!!k;=Ke?5ZI zSv^x2*C>K%vR|y`FkcMzgB5X6nU(2_Av-trr!L7RQ82pLi`bfaDgxDhc9gre!5DK6 zjI+byhBtz59&cRaA8P^7CeT9DH8^M3PJ3hq;hV8Y7UbQrD}#`dwFnkjhp|NdnZ&n* z{ag6aF&00<7I~3A7AJ`QPy5%wFR(M+N5MsPjfCKgu~h9LpG>$Z`ViaB6S{P~8-}{v zqh%*KLk$@(shHt|(S07K*Pb|3o|v0!ExH#Cy%xqnfn7vOiacFF43#LVb<#gj%LiP_LI%W!?3oA7S;!sSQ=h`z1bwz5jFf(<%R>3ff zbAeo4jKM{h=LoAn`Vv80ZgWi9?HiH^*%Jdz*}ZM6Aq@DCW?1bHZJo_yJanel^ojri zf4#mY1eDa=;8HYTuFQ|oK-z-nPSEr>q7StYe%wCS^hWBARhx<*Z)Bo)XJ)D=39D&H zg6K){9H;`jM+ew_@GAH5Kzk4mK`AcL5}nj_@0HgC6|6CM0VY*C^E46BR>?lkWs`dD ziMjvDo?MgP&uNu$k{UIlJ=k1$Ss5Dd{x)D;GMa{>TdJ)RiYVAM$EStMZ2fiBR#HA%S30@@L4$Q zLX~Dg;XHs{q%-KT)~c)o#5p7DLjPM=Ah@6O~%(D2^hMZt8>q&R+rfb zMSx8C->?!DBj`vzUcki2PcKO_?6a6fXeo~KxcuR;bO+UI(a#!DPJp9?^HMBS20Qo< zOdOpiB9asIvMR!M%Z#J8I-=8+SAA5g#dTO3P$vhi$9j@d6#`9q%jA`uCO1vJ+gcDE z)*s8Os^i^cCcix`@;l;XdFSb>2(WHoTDYlo9dEHjSSmZPM={#fh>J}a?k^7V(@gp0 zyO<|!^25AF)6kW_(GM}V!T&^Fgg0!$!Bfk)BJ>r)(X~W&It(OmU{bFooKLPCzmwkp zu-#G_A|0kcb_D+D)~+~@*kw`eANZv5J;~X=IVSA&S+b{IIn>h#E~acF3`K;5%b-|8E%Ut?kD=JsXq~vUV;Zn?)ai9R>%1n%2rhMG z^F|)I9J?xcgWZW|Ms)7PY~U*%{Ff#T{OmFq9mN?<(o<=)LF4?*AEA(`z^S*QWAZ*! zT|V0@f@_GmeD#VXP#7YnSpQ#&sZF<=obTD>gIm10D&ip$tN_ExrYzNRxD!Ndgp-~D zhU~n?)ZyN4l6B5rLSm5F}%8%{YAR$B+`U{+f6YPGO;@yK)cMb z+|;AEf?kkmhNs!J^0Jy)$jxoY=_}=Yg>I!@Q0W+<9+4ZtZhO0k z%NS95QfiAQ4lu!fBvWjFEkBaXFO9`pBXa$)jVR3wIGEVPNgX4d*BrOmZZn6D8sFuw z8Y+3e^3|+Vs<8KMozdxK28TMFE-cJtK{g*I`^8s%gm{z=m*1u@@l;| z_#<-ISh)G&pI=7V`XL`mLj-1H?)+U3wf2yopoSf6TQ@^p)zMfUeU~A2)Y7xe2hGIG zZ@5j1SlSTpSWQ~>9%6)#2O0@F>DZ*T2knsIiZ*OB0TVy-f3nG(8gsq@k=U98_+Y(5MJ5RU$Jk@f^8ST+G(6cPr{sC@&znMQt} zzXk?J7a)BI4hR`+sLfs&jKV&gn5-c4ot^drdt$HPQ}*3>=x!8nuKqe4kFFbM?!~hC zCtAHk?R_`y6A(;aH3TTNdlsub33 zu^GAIO$DtR1ed1!8|ue#jnd z>CLN(Gu$iUk$@$D-Oyv_*$h^33J;=7H#BpZeHCe%X`XRV%N-5*q|iR}E8`5wiYJ)4L*#HWI@ke6ZL+ zZ0X5eXF^vV4*wTB9-CISkbl6!M)06uKxh5EKno5IhF9qK^DVt>d8=WzV5LfH*w#+f zH$_r!#kX{Jmo{1QdO+T6k%sX121YPvm8bN#Ip2k0+!c~M{yVj4mGv>Q`6tra;6dWk zY7t*a*SfR8&1+wSGqP&Gz4UXwWm2yq(%v>V)W6wG5ssCyiLOaRq~HwdO19_6UvZ3} zv1|kb9o0l&V5y>{0&3@u!0kU-jTnA&F}DjGchk{LG4UJ>30BnG$OMh3zSs65MGxbS zS|-yVVnYu`XcZ5i-Bq2cQL6Avx=ko}h8l>54d-o$%hLtfc4RYUW=PMFSfO&tE;xU& z^csEcr-mV0a_)P&x9H`J`Nt@hNtHoclZh14zYigR3|ID_hq=0e3oBBDX-x%kd9{(9 zS$7W8L@OZ^I+9RwJW1i`u>4SyAJTh%75&p%k8~`EbZUiOr4iJ71`>Deh@tGZRc&1I zr&<~lb!O)s5Ki3@!>aHf3L^ohd3dL>YswT!KVAZjl0s>nQ7;#d39=K!zB##@W z+D`+(2g&H$U?YYQ(JgE4b^jLkctyzX4%InL!kiLt?sy48GWyoVOH7~|ztZPYBku3P9vPy##)3(o6!rN8 z1mZlgkU8n-CUBUq*+)|#q$&KX;83aWznP_9?l8e^*v9lJGe2M0MeP#S)PKd)s&e`Q zdY1efN?A9(r$l7NzUh{jpX(jLocbY>(+XGzsVmz(6aV1HD0xvIU7nq1FkWu%MT1vD z9qg7Ua`;5l+1+`KV^VS>w_09A;wZ!Z;wR6a(nuaq<2~QQReY_Q$qnb0wg^9u&aGWs4Q; zSm6CxOnMC&ukbMRUh&=~t8Lau-?~*R&5Z4xd<`-Ae+#T1mky&%%_HoQWIxRM8sf+3 zD5!B)JdSbZ=(O3tR4Q*Ttsr&(zQvr|n+jKmJ}z%`oWU=LO^$4te*L@Y<2$DX7?74$ zr?0q%ZmGd(GAScAw3t<^0*agZrQ8C~kxl=vB)ZxT57m%{WA?aQhg=8<{Et46e4jfsTGc zYTO90CvMYM(Megwy>V5b@0Vbkiw$-Ue(UD}B|MDZBSqcyJ52i@)9PAx2mGfN*0!N; zTp8H$0p{YqMt>@~F~lUgV%iU5+5WjaxQ26jJ@B9dp4V;0y+&49uTRvWzYpqOzVUQ1 zd<>DE>86l1enL|^ko>uT@>3f3mFMi;R3D9cLO`0)J~-K#$P=MblaA-z4QdmC_{b`P zahu|es;Sy;V+~ihq;a|8uL%z(u02O!XwQ+tsCIkONM_1*dbD%R=p}Sf?d0~LE%)oP z$ZbDI2D2vQm8ZQ^{=v~`tHk^><>1=;?N5>TCrKcOn2OtCnuG_i4jf6p?e#re$Qi-d zRaTWd=0_~yeWsXQTyPu7QaiCnx2C=16zfbzpg>iKRa8}mSM3Vy_B>t0p{0D%4tpu? z@uo(5LH9X#`@Rf#1Zyk66Y#R=Y%g0SM-<2xRGQM>>(FO^$^BG8TfP>b6%>GPDlMwC z&OO7)xx<>HcSQsy-6|_E;4cOAh^)OJobj;9e_}HlEL|&ymrZ1jN6cHzhw|gJo|m_O zJTh#gTdR$TJL*?Dn=3KoG3#{h)U?ZXl~Cs zwc2V(q^;T~2Qk7JjAKhB11^^}C%<(d3%%CZ2LV{Y-3ya@Xi!_CG#8poQ9>clEel{(HJujr}q~wpR18{g1Ay-*wnpY^AeL;WwNY+pJ@u z94N43ADMJCzQAD%iM6>TXlgEVef8xS#bBIX^+6)%j48KroWMMu6Q3dli}UDh%5=(? zda9aGKcqIY>VT8>eK7XugDa=@Wt)&9C%c-!grE#IvgF?Nxash1++!;ymELDq& zYCu-XH19jLkkRKGT*}nIx&9M8p?p8U8Ss@hGkv_yxCa9_U@o5Y@g_CzV+6Y~MGhr) z7Tl&9K$ZS2mPw_sbRfAMB{k9^awuH1fm;3yuE(R$tTmw%7wv`TSxGKLI_+de&p99K z%`HW0%@I_YX%S@(M*w@;R^OeO4!q5zF&9t85i{-hzLbZj`Q}(t@q%?-)m!T80c(4T zSJ_uzFM%N?e#|}ASCs-Zr0PRI1q}snaU592mKfqvYI)(jpM0?J!T)PjnOZ@CZ*vSqf+9UrC_7#bcV$b)R<3Hh5zf`tCLd^kB z)Sd_MCwZb|jyE+D$@)(y-kag$0OsMFsa{_eXcOUMYtG;c@}YeAQP*6;qX>hE@K;OP z46K5C`Ig2=Y;9-e>W;91!Hz{-cOTjIKeWS%RD3j{RH45@rEkf!PM`nk&kuuO#MFEu zso$;>6eO1QHEFMZBxpF?GLh=NW%*vg*s--3NYEfZ?F@=QgQ0q62OiM>0lWpV!aK_# z0xH}VZ0eozi#l8-nhm)x;D_}F$nd*TIJnhU%aGK@auWa6%G*QTb=Kyqvsyabv|hl; zRurfP@)ONzkmf3C{bu?eH~2L}jLT|>d+Cp(!{RzKJ4B3mI}N$xW}gtm*#B8XtVSu# zQ4;arwL7h=BX%3D7jM=|0u03NVpSAzr|5KNlmD%oXH@c5sZvp7HhaM~cetsVGkBB^ zZ043ME+!~`ckv*%Mj|o3nU3f3kR;2O0IDj&{o=~b3W(ZrvnHt_SRnZyGk@xrt#_qt zXRqn(P-5nRwzv>c*pPG}ay6u}C;BLCm4KecGvqFK=>ju+1;~F4fM#?}sO{5%UaUe! zCDo%2dVMmdj#`V?@-7tD=I;6S?lpr_T7$YCy10QRqJ+i7FEWT->~Kz(H1Bxr3Ud@A zEk=rl88fda#Nl}Bbf)i;G;f7bnT|B8=XG<|^l01;vC!!x2GO=RQb{>TLR8%M{_a#Q z5p5=|vPSHHFG)KD{8{Axxg0`-eV5x7OmXUv;@$-Y!@v}OwD3gQ+QIPFQ+a{=m>`@y z+K~+ES7!4Ll%hs0nz8ZQo?^t$C#{`|B{!AkRf8Xs?U-OTLU>W2YWC?hUDCJORljA? zFkes*m2zfbs#QA-Rc@$9b0tAaaO<~toPMYvuv_Htfd&l$xIyz`f$7Wy0&5_{L{8QI z?*=U$W*1UTXO#t~J`L9zAXBHDt-^%jUOwm=;J&_NRm2aIif&FF94ZEzrM4t!ngByU z8Bb&Zj-u2a>NNpJn!z^OFjPre;B#`66Qj#b?rwDS(H%RZ`%6vbDHhjIm16(9u=x#~ z{_tqEw*dtZyF%(}H~CiZL3M7!6G`?b*>v6E>iU|#9E;~4_5w7Ocwwg~PGZSC zNP}}}WKLV=Z5I8Y#$0{u_+HFC)i2SKI}BU!rJP`@KeV9^jgorMy5&zq@b(DGxmq8U zSK9;Hzvt{m@6mpulo=PpA@XT$+l9Ut+Io=obVNh}?GUmYacU9L9um&o`B@Jlu*k#uJTcN76O_VlvS-Y9o6m5^qz-j!>b#F@kELO3~f?@ukz$cP{v`u zkbJ5$NqD{!{c=_0m8#CJNnqC9x}w}O^-uaYZ@u0skEK_1n}eQ9PT{9d<)_3yLc8UH zqTZ80R_7)(S2>#3_M;kKg5Rpx5^RbQ>rKD#sw=0@NUK|)f$l?wS}sf3bh@ZNHOA_S z!^rXZ)LAdVTBIPq$LF}N?J}tzN|LA#iFA=e+_vMi{xtDU6(~pcXc*LgVvE8F6*AUs z&jXjG1HREM0XD+&_-+)M=1y5qbnby-e644IAT+{;#i9$_(IYTKFYNcvBJ}Fax>wl9 zAf+aM`R$?pVo)Q=vsF^LqIm-zHfyABhA88Czr-jI?ranedYGxM3fE~~Mg0mpVA zGK!XYjJ^s}jxzT&viMdgz1mO<`_EaISN9%2k?=DX$B8I~l&}Xe)j+>1;oRuOSE|3J zg_?(hyNa+H9e$@OthGieqMQl@1cyKq-Ae?D*fJtG;i}dCyIZhpnyq*I48j32Nfs?- zB&dhP$dEWC6+2rje_ubl!E&oOo|yoUozS@@@r>+3WuSi-)9}Bj0V)UY4XaR;LE2R@ zMV@}{qoW8-;&X}Lb0Ksm_2st@3rg9#%|8%n7PPt+OrY(NSr&5tomyWUUTJ3>7r$>% zw^Eh5sMmJW-`V*Tf9j|>0nk`2EEBF^cXd{JuoNe^aL_)tQg5EnxV|G%0Y>5$0evrA z758b}?}h;jk;-_2#pH5~% z(;1r9bL~=T%y}s*JogjPNEhWDeNEFpph>x|qM?{xD)sesuR4)BsMn0GABqjUJoI)n z!*Np;aAIyrqrou4a!iV-zycj1LWpmoMN%%vkvf09fMSu^gMhh~iv8+2jd8}{gYX!7 z&DcLLhHds*zh=Rh5qi#Rc;|tS7otYX%FY>&YTaJwhYBc7+}@h);>BQSjHbp-^_gPP z-Z9xRu|@T$$y8GTZz83MJMHfYLmzom3VHtfa}%DpH2yQ|>jC3QI;AGbeP5Qb5bFOML za>@=q!ANPGwBm@}&aDN=a7dE+A{uT?0}+D)5e=Dl z(K0Nhkb?yB($`B1x10h4Y|pG-;D;w5Bdp%dLV-%C>24!-73qJI1SGK_1`yiD`mKKA zhPWpG(}}%;44o>qiLmrxtZ85qL_bsE&FRjaaL{Za&aZ$fuUeN&QVHk0tkS=y2x?=M zVtFNaoH_(*PlpjMtx}C6`Jx4|P`_OE)|VE%cWn0U9IHOg;5Z4GNUWVEsHux(Ga;aMV| z2Ow|#{~SZ?*%u4+qXAwKiDLi71r{tmm;g2D`l#B?bpc6qH)^noPc^?v^|=pUg$LiAOV{6 z+ecbeyzNT_@#LLhuhhcV1jj*v(YrKAGD{3Lw^grTlG}aK=u4B`8>m4$dFPJ=ES#%j z;T97=Gr6(YD{&~j6hA6|f8Hz^7HW@2j^x@Vh&LwjJZhP(IF;Rkz<-qlWpM(!W>IY| zCjZ4(xQg#UL0Cu`{h}mCiy9L_kp}#K_9mOgZ}9ScOc08W;yU_g(YzHcxa3bF{?(Ys z^&w4LBnb8DrInu^yYw(a5TG3@*bBVw)-YC1L z-;!*OxmTpkou5LL*qnFubkSyL(b_gh1JQHp0WSllrTYVXrLsmFSLL+Wj1FagSsEVlqx5gq#XUo_vHeKw^?;~bBd!Ho{)8%>fA*>DW?NJ1)#F8wXOPt=T zsNoNyH4`0r^|T_T1cP{Y$1Gs7XM7&u_i&p&T3rmPG{ zWpe08H(qy@ACHCNm!=GL)x3MIcpiTTZxz(mK({C{B{F<3KI?2cIr!)W%x9Y%fgGHM zx$Q)FJ&rRT)mB9Xxwdn_8%0VBmh2_B5fBsC7?~D6ygJ>{9iNCIxGFHXz=69!H>!)9 z&NAR|UF^6Siu^$F4+-dt@yEA}y$l&6E^oxUMty@T7DS*i*eS92UQWV~R1G)Mh>Z%K zrWCEzdq?+>FqF5feh)QTB7@p3cPL|erW6fwd;c{Noc$%YopiU_gp?|Su|rZFKE^_P zKY+B`zb%N(rb)Q^VA0nUBqBIR$wzP9v7p_fwDzMKQVww)DhcQ!jYIMV35DuB;)jRa z;+W%PP;y0$U#6D_;YZzc*^o)#lzr-vpnN0!^M9=Y{l4n0ELEIY zO;&YD{60t=|4p(Fy;g&ff+d;zYR{bWQnmN1^-Kh@bUGmv=)VrRpE+;pI>91tPfO zb66GR_Fv8L>Fz42x&4tW;r~uSPl|VsJDny$={Xrp*BPDbxtq^d_}6@NtHo(oiD?|k z+-^L_p};Bk?q$FQmQ*2CSYQUli9X#i1IGr?jc$Nx7;++X6^#g{GhQ zhi!>naMJ{{B8#CU{VT7_?nHqAb`TiZfOj<}ze5s_7+G?L< z?*X)Y`JPqT-r>pHo8nk9!=NwR7j+UD82N6q93e%!(yecihsT{A7o!{)uFK86R2K&5 zGTFy6xoA$p_GKTI*{vwGj5D_4vgu}L$K9a$v~RdwiMpxA@RjVk56X;ChUcZQ{xjOU zL*Jx1Tz~RyM(S|)`+~!a);eS=^f%x|tOW`m7C6CNw7XM`wNJG59xFVqTd~tIZ3vbM zkVso7Y;fHrFn!ys`nRGig%~ofR4LS^Dj&O@uE8Z&O>JTmQ=$M<-Iy zYjAj>d0R=9J`@w`Ts|~;Rf*;@z99Ji!J^8xXAsJGCA|#a`neOl%ioQ3r^Q5oO^-JPp2UbxLEi2!}j=D9zJwhFrs{;HE!Kr zcE=ns-5|n&g3=8st&ykUGJU)w^WFCat73B3^M97NxIJPpO0&(^k|cf9IgjK6KuP z(F(Md+Oc=~P8L3{1iQja&-j(Hty1k70#I8hYoItU{k{Vm(6Mp4KqB;!msvAOB(Ww^ z3xFXS;a{I$#43?=gV&C_Zu&Wf!b!h|IF0LnXa)j5xtoSBMB?PqHoUg}{tGZh7QpDF z_^DgM#s%J_Td5xBf05nAVFrB77&hsarV(#^AqK@C3v{FZZieK!p@d4n&&#el(U|u< z7s92OZXR!woR}u9mL^3nv8~f`{I#GT?e)sLy*uL4q*L{f0r#sY%CcwiBBkTUscNdA z2`*7uZ=D-y;8BN5+cfJ-Yv@8Lqx{?$Hx9;(Wv6hik$EY~a=8C^%@E3jux%okA1wWHr=@n3@r1O{T;h=GU z!^ZI@TnT${snM$YwZQVIU;Kl>(V)37$Hb#=WdqR))iAW5H7*1=EjSx185}c|A`7|C)wRY8Bcg zfUT16F9;)o)lMEY(f6RJjLPTgLSqp1M`uh_LH{%qy@75>CKnJ+My+%PZF@{pNiW?- zw(o!2?YqA_=a;hJ9zlP?(-VLw-yY;+YmUKl7E~G!Mc_s=_TAAT+4Ufe zG~I7ILT)fZl1iGyHW%cbW+TZn+1WtVHIWH_p*-uuqpeRZ@&SFV%CTLh$t5Br@TaDLfiCM5Ltzh6nrAcXwi>*sA8a@)O>L;18mRRU`e7@o+bUH67^txh;Q2jMXBvY)PaF!L<^ET$U7kWZK&#?*T#g%(Fe%_Bj!c$C& zD+TnUlN#KfIwLI(jbx#oFMGfGJ7LRsy`*rEnQB2 zi&t15ICru{KdVrWG8}=Lm9!xC4iRrozB2yg5+^ZnL3r_gO)H z%k7Cc=vp-FS`_pf*f;QR5Z@rbL4AY%2J;Q}8{9YeZwTKIzaf1?{)X}m^&8qZ^lup7 zFu!4a!~TZz4fh+~H~en|-w3}EeIx!x@{RNx**EfU6yGSnQGKKSM)QsK8{IehZw%iU zzcGDd{>Ji+^&8ta_HP{DIKOdy&#+t>Hm}fZQXe z%{l$R0kj;PHn~tfe;9uaT>s<6dN_qqfM0KX4YVXYMR=2!OI8p^gG`J(Kzh64S1ml^ zut#m9G1guZ{DmBMcyoDwI%8&_Km>!G%*n0hb|g<-JfS0!wLNox)n(tBt{6P55J0~Y zpLLQDev-A?_w{&+0#8O+9s#S&K~{U0bz(Tl1?0|2^ip$TX;o7q`cocore06}y2HDB ztIav8c5Eot(^c`x?utcMgvRq=zwksy#%Rj?n+>ZeYk}6(Sj>w{G#c1vzOzGN;iZ)% zd5ZflTYV4QZaBAfuzp!+5^8TJUcko*71`b59%s43y$nHj)`bj$K-mBn z8n9tkJQpJ8oAHHoMV4DqH;yF`ykgfEL2=m^Pomo=LCAa6=TOCjJ<0;f`AbjIKdzkKDewD!Qzf zLQ)T!3Fa1fUZzr3dLNT-yG*}jvj)560Ap9b5Dz@{0{Brj(8FgV9u+@^NUOq#5~Ucm zy!jC(Wf6_fjKpN$2DJrwhZ*;Ix9rBl#xrIyLE0ix@FOT$Mhhu5O3=*>Q4x>`{t%9F z7ITr$b3xKNYfbQXZ%eNPE`W!+OI`|RT(ORIQ1~qVAz0I_PRQ1ftTP7KIs!Q+fPE}v zEIymqB85Evfx-dK>USB{9t%j7T=(qW_weL^TtdiyYJP&KL4gA{B9}|CPKOO-xIBFY zM$!uy#C)W*ET`X9kjQ5abfG*$NF;iTP%jacfq$*kh$G`iM0Mc><5Bj_lLBbN%@kFU zg$$3pFzJdTsSk}6bkE!s3{$=$@Kxx=FY*a$(O$Si7<}}RC^K>TYs>@L`@@yG;=tFB zsQ0%6#vsBEb}FSxq{-i82KTviZsOS}eg&8jqQHe-!qVMJ1?I#%&5Zqco1kz;8dLBMM@{$@&)NPc5MpkfA?Yz3Cr}mB=8}E55&9f^Ra4#j(wh}*hmXbs1Q2Vl2g1DU zaK{@bASB#lzzQ-yRF|Q=_%*k_Vp$~gHNScghF1NwkWl@VpuLW^D}#O(OV!)van4o6 za$Sv@SWI(MZ9hcGY@mgufla5V zjqwACLeX?n?#U~j#bfv!u+{JCK0N0QbLmQ0MfA+iKZ=~C5s*s-v7 z`$p-2&`YU&I>Fm`(h8M5^PliidnKE+64dXs;#hdPjpXG2^tVlW@x7oC9aBU@K7amE z#mu{I%XW8&BjRyW=(y-o{X zP|ql;-DTLl`3aN_Z(?NY53$-D^2*xy-Pmi69hnnkYtVM!p3@hYH*@%nYe%<;7MXdp z=)o^cSSIz!`4{h^r|~U%6JClKSQ?F!LnN{2)`{rY!?;d}WJ7W3ye29m38ilwhw~y{ z6;Qml5}U6INxHR}0h|pwR4aoUh4RRQ!-X-t>atTldeRu+UVVXJU{_HniE>js30KqO&}o1ARr*WoLtPAUERFwEnJyA z9qi8ybX+$j(foERKagnzFMjZldCJz(=<%7YZp4~SWc?#$!9WcF!3JTZ@ALaNI5G-y zJP@v;uUFd`UL=I@dRAvu>iqFs=alvPMK*~eyr_x%DQrGLjGXx~=y?D9cIGVu?LopJ!Ky`+Qj3{dzoD+~n{^vN>h(r}6E&nT=i1Y4!E?$^Or-lk^1nCRNh@ zfKHK%!YpcH=q8jRuImDydBP4qI*}(vYaRLATs;Z`gZ-D( zpH(UbP)idwiq=aT5aeDLTcygP(sP75B7$PUES8UjL#AzoBq~{u-L0*RIHW zu_Mr*oo8*M#MMc1Gmz2`;Tg7pRDsgQ@s87wk96Ir2JzYXiNw9L`Gl+jWXD^K$7`$e zG1L=)PJdawUkm-A{-9cMZ7V0PivKb;e2b7-jq9QBB= zk~xJO5VT|FKc+Gs1AY;e44`g`%4Fu0f!b`f{}sY(^R&^_@kM_Iz#EC?qDDd6o&Z_#_YWNs5oS6KODu@={Abx5GEYXYGsA z3MYvXTK`uLK7-^A-Bh$;A0wzXHl4fPVA!`VnZCPk7c|Szh2pbi z`}WH=LK}Zh*1m_8)Au#=n6VTw#(#oII?0Hd>vXYAG_yeY5Ohz_y!3GWaP$@u(bc`R z=@A8E|M+w%-=6_%BGjpER5Eefojfa_KgYxLR+s|Uv~zo*i^uec2aN9FSL^~&{;(EF zY%x;urhEnTnZL)2xWG4wX!2nB<{g`wQL^-IjS-_Hdo7-h!Zi~`QGeTicK;=VWq^1H z^^_6lwqXStQi*>+ocuI$M)_xo9lC_JLd{P~RUbNs2r+$K5#W#egB^ush#CrW*1ki! zK<74DwCRu~#B#!k?T5pQ!uLVe_W^eZ*Ot?h2v#J95utnghuyC^*kAMNtc-=lp)noD3%7IX_j##RAp zrXGvz8J&36h0npfw=rc1U(*yZZP`z=aYF#orXb}#uqub+{nASgor}?%AleN*%;a6% z7w``MrGqx5T_x+sKyyO*ayH|kupm60VvF+8_4ShGUBRcv;!tV8iNF7?lhtg-r+Uh5PU64!}k-!QE6pIMPzXHEa=$f ztR-4?>8pIR22jw#&Xt=?wbySaK+H;C({r$NYw!`hvLeCWqkE*@=KaY9yQP8p82HAk zQ<)#|{3fkR8?@-r;Qd=aR7A$;CVno!DQ`Ktc7>7rp)mpeep2gNCEl>eV;WrTQH9`8 z9hLJX9cLV#*jV+h8}>R`)>`bb$|&(ffr(cGCuCCyO#qk`%dUjB<6$%rvgZ~(E^5-c zpG20N>tWC_jOJvbpUSc>1!wj+lcKUTAY}{)(26>9x@FD(uFkrQz@a=hLbPeRmsAxAl7Aj{ z1OyrJzEi9Ddhhu@kJZwX`EDqF{A7V*R4|nEWz_Pw^)Du)Qpq1ZjSIr#g`;iMYip~z zsFQ#APBsm7C)^26cfCy$TZa9dAF-NoROj60$HP82<iezgO9b;y@wKz$qM=6gA!n~xaCR_DthR??$Ey2hkE;{oX&>*3TTj?kwoZ14k*%5 z$L$k1)&dl`eKZ<9-%EExZwjS)~f z#$>ebS{v7wo4amaJ)88EaE;X26kB?FX3gksL6f>bYl1!AP{u;X_G$L}iasAgOsq98G&f z#fu_cODqAOJpA=9L zf%Hg%==nqB$n~Qch)Mo08A%Wgzpx|?zmhyTokDgf8OLXZq*&%O@_*=n|B>&15z;Y` z|34DWEa{r(jLq5YEfphYWPYAoH0iuOGxJYuCKKPFOsZFl9ltUT0ivV=UNf`HW`v(A zKYC}$biI;S+v$F>p<54#x_~^Z-K_4>qV8k%lP_F91Vb9^$U5@cRu* zb&q|~oxd-~N$(jT_o17{D z|NH@Z+F&gO^LC%FM*=^NMq3)%Y46m8+7MZxRP4#s`}L7ADB-jC_bTgyNH&zvTc2yR zStg9Kl|H;;T|T@Iicmupdg{0H?o zUT=mYiS1MI5Yb#_Pg|oR4uWLI@IbVWWmrk5NItUylP(2-8Y+MX%LtBB;j4=)b>P&| z1=odFaiiH3aU?R0TP8=pXTFPDqC$d`|9wcuToXNQN4;FevJ~ufD>_B9Ff);EuC++i z2j@a-sFZ2Z9mY?|cMKn{HB9RyiGdX?ejbtdJB)E=pNw@bM2stIt`=83 z?riCA@F{YuMsxo+-~x@~3KIAe;sGQsZ6R*$&)?u5RUE~oUZa1G?@`a8x;o`+F)I^a z_CWO4N{B^H$a}Ywq_dbg-HSl!L2UlaTDer+2`$IhM>Y_wi(I*E+47)d2fth;*0=rS zDV^jh$Zc%0Ys_)P(xcIUO`Fk^r3eo&oQyQbvj~_~W3f`5GQQ|+#lOk6&%h~BvW6d5 zK1>N~8`haE}*Q&0U@x0MPdl3k!@-^B%E@(OhO>@WIRPFq(vVSd$ zK0^!IZ>fh3m_yIEE_S23C|G56Ki*3frFDytXrqs~8(NM*k_Pol&^(~B@yuAdvFzZ3 zRKfz2Q?Ls9j?9M#yVSC1!Ic1U?KW5M!o5`wxFM3Mt@?W!Z&mRk*CfS_@(78Ru^l$g zPN##+5W`(}4Q~&k5e^00l3C!{x!ijrNnySBGtab-kEckJHUub>5*+iE9oUs4-^E@$ zAzi*gRCy?3?JSjsYN%1WU#o6WSMPD&4N-e;vCGIvcyOyiLnPa-($m`V5@Ta&@)jRT zLSoD!#y6yS+I|tZU}4VRwFp_TI0Q5JQAEQ-C7AUdcWR0Wwnf?Zvt9!6q>CNDvg}U{ z=WDvI1_V~xque{q@|E6TyLHdat9(HF62{QJPSqieWrIoVk3~(3 zdx-rALN8IsFCD6#S7x7*CBRkmSqQr~Zl~=ZK-D=Pzp1ZX;t}YW>EC2EnHEi)tzzHf zWHZ*16^u+i`xYKz{Z$BXU<|nDzUN*1O*~JajIwT=HG;u)7ixiVQMKQ>rQS{7)M`iEGDR1+Z7X^^ zCRa*j^E@7^XN6u`@I2P#S5K2x>r3X<4{dCl`+Pk7{hbb1yp=JaKPDnu*npp>=RK-Q^D_!?Kc}l0Yf3j-=CE)qQ;Dwt;A7+R~pos0{!oFXcvZ@1(wR#mn zteE&ot#jL=;r(0I zP`q7par}qd-Sx^5F~3j*rNnW_LqmwGpA{x8iSN2Mo4KK>;EJTKCMzD;*K5`6}rzL({oH|bO zjzrDQ(sco!>2B#iQY3nDr_6PKOZQi%4?peKUUzU8TFT)^PUF&!*Lgn0^Vl%*M0mKI zN8;RwTgQ1-qEMQy>BSbG`Qivqk3QvO@&-5eVfap{&?ROo$GSc7as1iMWAC50A zhG8BB|IQt_?fw$kCOLb=pj@W$WH7CtDqR1u4G#<$VRn-@ydPl>=e~MWdxLDLK>T%> zC$V_kYo+btQGcfx!EZfXB{+ zz~lNYDM^dO(QI@YFcVzOAKfykb83j~-w;eo@hn`i2|edAe8t4fernD_A=y8c>9*1& zX}AeU7n3EJ@J8Dm4%iMfl7)J-qMH3&k{XEZ3;jApfDX5BsuaU=GY1C8bC0FgKH}y+ zPNO@YGr*reiFk@pGm_1oTH+^}o^U$eT;0UTfkAwiqCc$+Xav&D@^8Dk28*6=5lJ+q zJuT~DN+j6w{kdD~3pQ99>erDq#ayoTwlDyzGA`J}k=3Hp;#b7S_l6Uiz`aq0n7Ae| z_hC!I(@iWX?&C)IR~N9^g?j{SypyjG`&Z$|XtQaDrYiecD zxss36pLtaD3G#6m@yAVT;+eGu;; zV+3>AJrU~M{jxgZf)aKIa+|C9SHX*k}L;5ZgUt$PfQAdt(fPa#9rjG5xG%rQ3TSbszyad`OQsUDFt&O_mop4rf zg|j6!Cix7lkIYUA^)D!-B636k`UMism<1EzvCO;DYN9i$o0)vf_{t)*cjTm_u=3Hv zC4`*YJ@EGj!L+mb%=dHhtyS0s_d2QsiB~G*FMf#xSje`D8B#QswB`gJM30QQ8Ok9S zVe6dD=f4OxXLj!Ii-^l*h&CFi83xUT`#=kH(Lepj^$TxQx3weQLQ(p&i65z}dQ$pCON&`rL(g1hc3 z_035T0eqlIGICTxgG{;So%OnvDPcEsIPED<=L^+$W7*S_v30k#rajZNVq=d+Z>fHm zGj)n2gcoF*SGtSZ5}B+xLcIij>iM@BRovxvaB|4#p_8$G;kAS%p1QUsa_?>B9n#x| z&ROy8E3!r4I#EqtDBozqXN;27l-s13$zrQ+IcNsxemT04fi+byweeq6k(c0|XZvy$ zIicxsxdih#%HzrIoVcC(%x~*bEMW#sf6}k85-*nYO503mHIY$qs-IO^JGq1Sn$Z0* zrCGB%Ja*xdW6>u`1yRL7GV#8*TwCWh)hn0J z&rKl!h80h8K*mNxft2C1M2+NM_Ht9qJ?ZeQIcbQzR5HIx?GNxkK!HM}`J*1o@c zMOhF}{&?(>L+=9vKLmC2eCd?@br95AahmFA>Llflg4d#X;9l_1pnFNV(li5=l+bqY zJmDhD>wYo<{7_LSQ`Vm*LI7jrP!KF2A?=1xFQa$w|!1YRuvK%ipUz`4rZ86dQ#G`w5 zCNAw(LxzRXv?Cf*AaQ^DCn7>G6{1DZCxbwzLY@!|KoEPW5P5RzZpOyAn7=!^+W{y=CCb9_iwh`L=a~{eXb@NDGzMKj0)hDw!sIt&$Pq{!6L$H_BB(-T84zcg zxF}6w1UC}r4YNWxA|X61e|?q1!^5?i|F(tMBTA7FFu`XiVjBs$$MVlk^k1PpuMvV- z5E;TvI0R7{1EE6zS-4D5;fUfaobEsGAcB8p(1=28WkEPu{`0gD;^9&KH7suL>@9*n N8*=wLT^s~=^e=Q@!dw6V diff --git a/Q2/Artefacts/TreesUser.py b/Q2/Artefacts/TreesUser.py new file mode 100644 index 0000000..20b0c79 --- /dev/null +++ b/Q2/Artefacts/TreesUser.py @@ -0,0 +1,27 @@ +from antlr4.Utils import escapeWhitespace +from antlr4.tree.Tree import Tree +from antlr4.tree.Trees import Trees + +# need forward declaration +Parser = None + +class TreesUser(Trees): + + # Print out a whole tree in prettier form + # Based on Trees.toStringTree() + # indent is the number of indents to use in the display + @classmethod + def PrettyPrint(cls, t:Tree, ruleNames:list=None, recog:Parser=None, indent:int=0): + # indentation is the indent to actually display + indentation = '' + for n in range(indent): + indentation += ' ' + if recog is not None: + ruleNames = recog.ruleNames + s = escapeWhitespace(cls.getNodeText(t, ruleNames), False) + retval = indentation + s + "\n" + if t.getChildCount()>0: + # we have children to deal with + for i in range(0, t.getChildCount()): + retval += cls.PrettyPrint(t.getChild(i), ruleNames, indent=indent+1) + return retval diff --git a/Q2/Artefacts/fspow.g4 b/Q2/Artefacts/fspow.g4 new file mode 100644 index 0000000..04d8936 --- /dev/null +++ b/Q2/Artefacts/fspow.g4 @@ -0,0 +1,62 @@ +grammar fspow; +// workshop 4 version + +prog: stat+ ; + +// labelling alternatives creates extra visitor methods +// the labels migh clash with rule names, so I make them unique +stat: + assignment # statAssignment + | fcList # statFcList + | fcApplySelector # statFcApplySelector + | message # statMessage + ; + +assignment : + ID '=' expression ; + +// when alternatives are introduced, try using labels to distinguish +expression : + ID # exprID + | + selCreation # exprSelCreation + | + fcCreation # exprFcCreation + ; +// ------- +// filecollection statements +// ------- +fcCreation: fcCreationName '(' rootSpecifier ')' ; + +fcCreationName: 'FileCollection' ; +rootSpecifier: STRING ; +// ------- +// selector statements +// ------- +selCreation : selCreationName '(' filterSpecifier ')' ; + +selCreationName: 'Selector' ; +filterSpecifier: selfilter '(' STRING ')' ; +selfilter: 'name' ; +// ------- +// apply statement +// ------- +fcApplySelector: ID '.' applyName '(' expression ')' ; + +applyName: 'apply' ; +// ------- +// print statement +// ------- +fcList: ID '.' printName ; + +printName: 'print()' ; +// ------- +// message statement +// ------- +message: 'message' STRING ; + +ID: [a-zA-Z][a-zA-Z0-9]* ; +STRING: '"'.*?'"' + {self.text = self.text[1:-1]} ; +WS : [ \t\r\n]+ -> skip ; +COMMENT : '//' ~[\r\n]* -> channel(HIDDEN) ; diff --git a/Q2/Artefacts/fspow.py b/Q2/Artefacts/fspow.py new file mode 100644 index 0000000..6e77c62 --- /dev/null +++ b/Q2/Artefacts/fspow.py @@ -0,0 +1,64 @@ +# main.py +""" +Parse and execute statements either in stdin or in file +""" + +import sys + +from antlr4 import * +from fspowLexer import fspowLexer +from fspowParser import fspowParser +# from fspowListener import fspowListener +# from antlr4.tree.Trees import Trees +from TreesUser import TreesUser +from Q2.Artefacts.fspowVisitorUser import fspowVisitorUser + + +def main(argv): + # argv[1] s/be name of source file + # if missing, use stdin + if len(argv) == 1: + # StdinStream is a standard ANTLR class read by the lexer + # (It is not a file descriptor) + inpstream = StdinStream() + else: + inpname = argv[1] + # FileStream is a standard ANTLR class read by the lexer + # (It is not a file descriptor) + inpstream = FileStream(inpname) + + + + # The lexer analyses the characters on inpstream and produces tokens + lexer = fspowLexer(inpstream) + # .. on the token stream (belonging to a standard ANTLR class) + tokstream = CommonTokenStream(lexer) + + # The parser produces an abstract syntax tree + parser = fspowParser(tokstream) + # When we execute the parse, we need to give it the starting rule of our grammar, + # which in our case is 'start' (as defined in fspow.g4), + # so here we invoke the method named after this rule: start() + tree = parser.prog() + + # print the parse tree + #print(TreesUser.toStringTree(tree, None, parser)) + print(TreesUser.PrettyPrint(tree, None, parser)) + + visitor = fspowVisitorUser() + visitor.visit(tree) + + # The listener defines the actions to take upon entering an exiting nodes for + # specific tokens on the AST + # listener = fspowListener() + + # A ParseTreeWalker is annother standard ANTLR class, that performs a walk on the AST + # walker = ParseTreeWalker() + + # Get the tree walker to perform a walk on the AST, getting the listener to perform + # the appropriate actions + # walker.walk~(listener, tree) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/Q2/Artefacts/fspowVisitorUser.py b/Q2/Artefacts/fspowVisitorUser.py new file mode 100644 index 0000000..d53345d --- /dev/null +++ b/Q2/Artefacts/fspowVisitorUser.py @@ -0,0 +1,36 @@ +# Generated from fspow.g4 by ANTLR +from antlr4 import * +#from idlelib.idle_test.test_configdialog import root +if __name__ is not None and "." in __name__: + from .fspowParser import fspowParser +else: + from fspowParser import fspowParser + +# superclass +from fspowVisitor import fspowVisitor + +# our own imports: +from repertoire.FileCollection import * +from repertoire.Selector import * +from repertoire.FSObject import * + +# for symbol table +from collections import defaultdict + +# This class defines a complete specific visitor for a parse tree produced by fspowParser. + +class fspowVisitorUser(fspowVisitor): + + # where all the variables reside + variablesTable = defaultdict() + + + # just write methods to be overridden + # in future, may want to implement multiple subclasses + # but for now, I'd copy the ones I need to override here to implement them + + + +del fspowParser + + diff --git a/Q2/Artefacts/mincommands.txt b/Q2/Artefacts/mincommands.txt new file mode 100644 index 0000000..b003d11 --- /dev/null +++ b/Q2/Artefacts/mincommands.txt @@ -0,0 +1,15 @@ +message "Hello world!" +// wombats = FileCollection("wombats") +// wombats.print() +// hairies = Selector(name("hairy")) +// wombats.apply(hairies) +// the following not yet implemented +// wombats.apply(Selector(name(""))) +// wombats.print() +// marsupials = FileCollection("marsupials") +// marsupials.print() + + + + + diff --git a/Q2/Q2.docx b/Q2/Q2.docx index cdbbd6e00a07df355677d3f5506a35af1907fd96..d0b040a3e7aff85159f6396cf80e5ca22b03fbf6 100644 GIT binary patch delta 11296 zcmZ{K1yG&MvhBv*-Q5YgaSQJ5?ykWhz{Z06#)1ZScXtc!mO!xJ?*91CxwlT;``(+X z^?hB_(>>EwT{AUny3BSm1fsSN7Gw-nGE{;J07O{<02lxOz{}ayg4M#=+{4k*$(_a9 z(cy$--D#)ww(IkIkPDd=?C9XqBA!Eit%E&AqX2kn0+${)8sgJzvnRExyy_Q0$)MM8 zVH_KfQ%~W(O47NK#YmeY7;e0HbYQ?uM7r>5vSnFSraD~)iZpkzab7AGRJ*bhfF3_> zC*tS2*=$Fh0=%;wHTTrYtZTeGeI$Fom~7l}V~y5fMhJ|Up8{S^*cUASr13|7AF@`i>(=sZ*pkX7W}i@MF`IGxur{y?=TGOc-He}T2^&5{hKIA* zH;ZK?{I!kGmA)MtYtW!VG61|*seR^;m@d&(k3l=A1Rr$rUOT8H5B$PU(G6%Jh0bDj zq_ATvp$q)Tb78!anUGUhxC4_Ico-=c>M_R{IL7t6p8!gw$YG-RqXfMUD>V3ogT|=6 z@KTc$5@9_&p;kiM!bm7Rq5ac#-y;Nu9$Kz1BYf$|j1B%$>F9tQ_0p>it(Q3zEcvuF z@(hJLjq!0Mo7zn%W)epZsb&5yQSf6E{>n=JT!yq*zf{}tBx@~Gig(gs#2H+1Bcv=@Vl^;6GXtL1t z&66tYN4{Q)i)%HAJj+B>rz#)CK-vl+F!vNjj7LuJB6uLpq^SFb?m39bM`NT;V-7)a zUk)rztO15PeV$()4_1$6>L2QsprCDgNFnb8v0|4 zrt__zl_>AVY1A)k2AbJt*Mnu49nT#fQtC%HG%$f4^$#5gp2KKC+p}s-H6V($0KMmd zKoqPa5Kitg`buDg)oSXA$#?*Bkg)3VJlyMPSB_&)I=EzY30Fk|&-;pI-6SP`OlUZn z!DEQ%;GW^RPCP;M>>$yg;^f(5V5g>IfY|wR()Y@Q$Z-_3Wu31zqLsKwTuwG%R9=0! zTwh_j|9cKp)8*b&WfW62O^2>OEA*3kK2Gqx!RY{{;5T{C>l5ph|KIs7HuOS)$kO;% ziwyy38>CA(tpU5^*w@JScd7li%}wJsNsKnUHNw)qqCe)M1@H^s3=9ksSZtF#Z$tfTJNx`t6-Fb}LI2QamB9Uy%w~cfi zljcLxjXV>0W6vWU*5X@Qm;8e86E}&O^^WSA&5uSe{Du}t+K?=x6c!W6&H2Je7eilG z5F8VnkX?;l@_-)&d7@Os^IW~xT#-=m8}_9o$^JHuQhU~2+VzuY;=cYUfV~fvWHi}2 zFW&G6sK7*4MyQxS(uDYd4mw+JbVE!#!81uN(T4+zjX42J%rrC&0#-YwutB5#AQage zTJ47kQ2bWvGXqi(A6pY$`cL+VQ86x(TftPBz+l@f6D(XNnWUnmT6-JWIukKy3oK;z z680OCIp77l$2aBvP7`dlx}Q@d6ZTxO)rT3+AWr9Ro%f@&hTiM#RUPmk1m~(%SJ-M> z5r(|uVS~$`>iyx&VCw8-%;Hcs6-t6ZH5U;mUGcLKjtI`2A|?Yk3O<@#+L=wLVW^dK zfCkwG)PZQsHcsDmFton+2^=E`=8t)?3%prw?2lZFtrKVq#clYE{!og2**KyJxcW#( z5V=-maybT?xUi-0&nsY&&WZHBkjUiR}VX z7STt|EUX#0yVF~+B}S-XWSWl>G-=-f>Nh6J1AObllWOLp@_AdYdDrdv0zT_HK8L*C zJThrkSB!jQPw;!+g6GZ2O*n-1*EW3%%HKlnLWu9ZRVg|+@KK5U79OQI008#jnvA9f z4=*PS1OPVV`$w_E3JbmyhE&ssW-;GN0J>!Zjl_A7mDDdRk}ed2ZAz=%Nn4UYdGITx zQENPkC3ys>j1LWJ&sH_Zt<}GchSnQV*1uE|ExzSl1mNojZXgo(QJ$#QDG=xcjU!Y; zia?=^ki+h&@P%T4%JyWjDu6GFlbYh=(u&>}Qfl4*}-6~h> z%U+~c72&c&M{~s?Op3{kLSHsyE_H(csMM(Y5H9Ka-Ej{MVP-GfuG=^#h%ktP;xQkO z6EYQh03p4j7T@LvK(75atX3V_T`!Q?a9R6yW+_vuVcn>(sg?HkVk+nM^Vsr*IfMNg zdhshK?`ttK%l9#ao3U88v(QzpgY93t=Sr8&^9`mzu7)ieoRiDf{T=}Y=Z^EE5C|<= zC-E;PdcJte^+DT5B;U+tLGIE_9nhBHO|29dBt;0hZ=YnK;Bx{3&q~G|I2nq%;~|m< z>)1({j17JcXbPu#Q}CLnd=+!HjOV@)!pMq;g`AaU`l=Q3hXPqdj?qGOaJ8$}4f&a| zk7)3%YQ_^^bJX;csaBWXE294BAE|dmAH)~^TFcUNgG5dk9Q0%6LjF4q<9FFs3D$}e zj#0D~`(|p~pR0k_5pF)6vakZ0mEnsgt5!8~e5G6I8PSW|pDb4LYbt)DEiaRJA7`8% z`QPAu%}8Fq5bmAw{sppTveejejcG0+ky2k(ghEtRf$qnc&27WSc1)35l~*T2B(elt z312;4Uuqn(v=Yx_{)UO4&NVJ!ChjWBr!BVZfbv(_(;bU$J*^MFXsLmAa_>Dj*r354 z+IBx{5Z>Akfb76Iea6`*0g6z)KUl*&Hp8MzH8(Y7tWZhXtbf4BggJ zi%89czms1jR0^6U;65Bbets+bG0}FFtO^rT?vBhy2n|LDmIuyfj&NO%VAILNfoj6ea; zyW+G}j>ra%wOW9$m!{7v>M;d5;b`hsW+UC9(ul1_n_+|IKC(CWbkYjIb1`aVBM}%Q z&8Vm*(M`5Kn=YN?4#^=r|A_g(%M!d-Ieyo3v4_7mwjla}^f6^}&1Z%|s`QlWWoO3H z=#A!2EnA(`iLA1_SSdTF!1v4icP#wUeF;zGfSjO3Z>>=|*qb2jZA7IQ9-}Ld%|6 zY3>JcOFC@dBh&pbSIhm^m2Sf}TsdY1z!dHm}yN*@t5)$ULHqoQkkT@zhNOGBSAsW{ppeXH-bl(a9Xq=p$1LiaH( zTLC0ZnaS2%@0+rhigh#0<_-ZFo23{Gv^8(>7OIbZ%?p2qbLbY~!19x-8 z;?@(q861Tg=2GVu;ZEhADUB+BqRejPjvgM``WT2_I0y!{LL0Q1RQPseBc-zAH+FP2 zS%U&t4OY^S`rO#h<+zn{>gUPQK5q!8d>)ww_rm)xtkv4sfQ-8p1 z@ef~=w3hH23AMan`vkn{Rj3)-;K$7_`?5aIleR8>RYt^uEqJBArWm_1TO*rk%*{^J zJ{RfqW#8+8Q?J(cb+B%p@Ep(;sJ$}#c@N^+^I=RFA66q#w!Ep>kMz9Av($I&(A=|R zm!^3X?wI>(*y7CFrHMVM)$-fnuJ)EfwKKABgqeg@XYAqtHdS}O<3UQd(k}CO^| zc}_UP#|Cc1vh0EfV-ty^+-XRh+!qotH#=JSyFQe`^t}LVe|4H(FL->iD9-p=@rwgtw^J0{XZ7P1 zh|xUJA&5+*c+peo>uWS;v-^wf7NYcDLb#8dq`@H)<=*FUKhrcJ<$+g(^{YH|5_C0f zfyeqbLCLR*IoQ>I)HgFSb$)}IE%iN9PQBu9>(MK$S3kEl-OCeLZ60zhZ_M8?Z|vK; zkN!d2Y*Z)CW!|9SusC`s@;yi84c6>v$mW;~G6lNdMzxpx6l_>Lzg2j)?Tqn&!}%I# z+Z4vU|9^y5AIbz>;i)<>CTF$=AN~HdVw#@4DOop19phX|l`F@AK=hZ$!dgOw=3toiu{xD)Or6MJ6GvnejWTVg2J)nev)hqqw}`J`y}CTso{dyxx<{R*E7O(eY^X? zeB`~8ve;WIL#Cv|FM;x=u{g90580NQ1fnPP!#wB@uhs}QW&VcX^+HI)ocLa~>tl^3OXqmdfJx6UfIh2ajq0!vwH-XALV z^7LekLrZ@j!^n~MZv-A4u^-`*^CUqd_bRDqZh1|AcshKc+TNP78*k4@Qdxg-*Sbd6 zh#hp5i=c(@%B;(vtWmuQBGy-X8IkJ(4J}3z$Vp17la0w&y)npcv8?+1*oDFr>Sb|5 zM-r}01j$(ADDd#Qb92bV=Oppt<0;>BLyqZD=bgxMsR$CjadSK88t0@7j2VOGsuaMe z-u7R`SvZ3tU#KP3TMo4H+Z}~VFeOy2Wtse?+rSmH#(WissL@cRWfy7E zw$}?K)|oc+Rsw@(366*r^5vk}5}#$DLbXC4n5O)=+4;(YjfkUt{s1g3su(WZ00jdEV@kmRan}hQ1fF5y_HX~ zo!BvvpZa)&-sBc&MIBWXaZk%&_h|G)y(Y@~%*As4Oi-uWJxr^pPhfz4okNOb;a@9d z=4IR5a2kdX>^<>?wDq}*kAJmtkbjY6{@eJ8K6%G( zMm1RSi@g)PsaF`kC-7?VB-65)#3eN6PfiPkmM8XyaV>P zL%-yw9S30cb98S{1j`)K*lmv?xV=X??H%HuJqq-Nrq9sogMgE-1_03hn}>6A_i?av z`xgsmxbC{ni|M~v{tB0x<4MNReCBB(jN3oP<54Tj zAYUb~{Gz5`7A1-4@51*R#r-;%4D{9>*U1W$701m*2@@ek6C`|QhTnN^=-UT%9Bb1- zu};bmCqxY0I9y1~_f3nuUXzIkcPllNL==<4Ma(bTzdO|ate-qCC|EF_<&p)N5D{KS z%coY#4x@pe3%F!Sn=`eA^_^vKS^DWGa^j>$MjC>`WZQq#?s42468&{v22K^esESd= zjc&W+IL#5C)*-D?$pp*0?pN2b>ic`niE8l`7H!&7Zb6)qZlSRCKqk9J*FRs`%}LgH1NuIjVx2& z4qU{wq-nRK`n)<%?*NG}n34-ueF&4*qM0rW?xJ$7istc5(NW_hV$pz+k9(}4XfHC^ za_@{v*w!qP1&sTYn4r!5eVdn~v}o6z-LmPH?S)`%4{q|Yigh;z-mK2J{;x@nSZ5=H zi4rPjEC?(-W*DS}AB#LM&`T-odjCXOnpOxBP^@U5uKYti-OODG6$xR8l)lfkfKV%nCq+@`O0b&so+Mh%CT z+qjlS6@UCZL8VcD!^;nLRd8g}_bcgRpoHT`uWAVc*TT$erGRmLD>J;X`eHly3NW$e zwa~yg(b-vESRtt$`~~bFF#BfVHyTSaqQ)+Q7XP@~0mod-6PI;sfWR-$aOd##v&~bN z_1|qIP968n1CCxx-UdwzR~uhAqZ>A~nk|^4b)|&rKnJI>Qf6^9RIWVUW^)CRU?u)Q z)f`3T!LC_9%J_9I3Bs~hznsY4S#x=3f{o~e60ZTNX_!val zN(V`_z`HW}Ax}6)N>SF0YCKeTH}SJ<(^*~@K|j8HtP&M^V0^B2zl<21To-LX{}WFv zhV|PP$Ups#j0s}f(4ioLzrX!Uff;56$bsDSDI6BF7-aDwz`@c?8K5LexdGJ(Cuaj~ zfzmt0H}i|F{}N`2V>6|WMV!1$ab@w0jXaP$_Rml*AYi=vhhj>XX&&Kd z%RgyFl9Jsy9xHCGBTWH6&T6POCx z-5|B(h>F*Tau?3ekDSu?sX1@fxxtUpZ3`)LXMdhpu^3%m)8La7g@xc>J!V!B4c@1; z{up@NaZuV45<2JU?X(>^#qGEEyoQLxj!>pDw&Z~wmD9OzjD*m=}baklj<9Xm*IkO8e`~=Of$KJYWHgBL#O;m&i0Mk zP-^8k@)}BCWnyX>5YF02=%=AfHfAlfF9Lzsd`F{OX8L_?l#gibE=$0my?R4bj(qAU ze79u%bwysa`ll1U%yd7jLN6>~slgH^To@qx%^36e&Yu3Q-f+ORB`1H8&}R63#YBf8 z&gvV-#7V0r2igjg*(uIa>?1Siu}J9z3Z?&)-cOhUF3w|VNhm7tYR49<5|w!aoqhYs3S5wuXx5|b3T8<}iiSDHz!)F_{5zPKyF*Aj!2^GIc#0L)KG6?dR zzFLJ=12ZsG{0L1i1~c+zkTdg6O2e$eiq0aE5<to) z_;69gU;brQjpV=mSQP%Z@}EgS@>c&tt0Db=Eujd_fZF{6p>&-~mSg(&{q{zZdrIOP z8Qlvp9nf+XkI>tx7< zrt&#yvGO?V@p{vhSJG9wUK$@rm^3GTI{XTEFEPx)RzkI^J6aGL=e)Tq>Gl)+`MI-M z*5?MZ%dx?XYcb8MYagyOrlise0h+0C8&0nKD>Gmg>a-?9SJf(1Q6`a5k02c?uNyE$ zx`SjIciZ0F4|>>coU;pJEwb6VxO@NRO*Q({M+P-i3@=B@E zlPEgR5!aj20uz~Qh;I{!VU|L}vT)fwrHXT}EvKA=y*w)5Y9zK?!Kk%7E18SN>sdv; z@Ue9{S>+W}rnju^>}xl;P>S&s$-+a({wfR<(;FMVCK2-Z?1-vg0>$6$Q2^C|R}BTO zN5$79kEcZ4$1X0}-s~2Ocun^_a>0x8516Jg7HTqeT7b>2a47(xT%U^(T|t19!d*<> zlw)3wH6w}Ml#S@$9b@FFcu(?8Sl&Fg-eaS=w#yPhlTjbK9@V#Nihw1WK(}Fk;g!MV zTn8SDm768`p_Y){Vfp8Fla<`D-U6jKi0uiKNeQ!-yhM)6^>ieSHq!zt53MQ(3qibe3PDoOW- zz(C`tyI0f+e_nt|!c4K`Q04HFh*XN{Qkj2PmsKev#X_KqlbLDw)52~q=p4AI6#26| zou1D_0u)L5n8t5OOkY#nol+;VbmZ_G-5kpf(^gtX5myS%q11w4G@?x3f|6)BT*-1| zsIR0-g`<8_M|iLfzyDL@P0RD*Xjfo3pQlh#S3nBdIFw>k-DXwMHK)4JW~%n`QI@8vm-gLOZKH@9(OoTYMEQTW0HL{=rd5EFfk+ID4Q~cAyx6Tc=?KnJIK`!yH~N zUrDUtH^ABAb*5zo8peYbJ$vHj^5+UUi@z`5Sc!AL*ZYoZtRtOp7EHC*%0@0&Bv5sw z*JT-w$JdNuf}Yw6BMi$b@m8z`)?8hg-#knwJ@7k;%Jul4^kgH|IgzSpU1t(2v~|BM zTYy@`N8WVC?uk6p*4^<@hjjL*RS*e&3K(p^B|og?XblxN8Ay9D@K=e5YWv|i_pJXJ z@Zps#n}uJHSgj_3^J9^Zm+Z2yIIEZ|CN(rLXltic=4pHVlsW^-N>B_K7-6ei+ zy#1a3GUPbzf^P0}G+zl&n%K^=YL@dmOd z#6D0hIJ(P5Wt5uBuVbA$Bl6!pW6Cau_?2>SOmnU8PtV$>(sVQ{*QOrHGB!N95+rHy z)?1W9*Jb*M8vHD-yJj%M2CTXsdCZ)3uf%ICu9QtHlzmRtJ2VJ^d14Nfqf%Zvj0D*V zqeBYp0Po-JI7qUORewJBFjhZf(EK#FS(0>q+~SBC{9}YtBc(0JO@;KRM*g0Ogha=H z=&a+*%}a80(XV0Rom5d*HfWR6Lub#(p0g*sqG84{Y0Su;lJIjw$BdhxxzSyC%A8s~ z60G``y%YvvZ+m$0;Jv|JI#N>d$q__?svNIRC_sGqw;7vY`dV5pMv}IH5(KuFXH^fu zXqd2zjF%l@h?Zd-ye8MPm{|heIvo_;M^;7pMQi=7FW-CBAa({P(B@YjsSS}C8D&jZ z-~P^bMXd17rxi)8>1F!j`WDQU*tO9VH(V3YmarU#wXy%trFz5Q3pI>6E~Px&AE#ng z!O*~!doF*vyX+p0j!fq?AttoLgsT_rr}=llKQs-vkQ2ROfIbld5rP^GtOW@G2qS=v z81X^7Df-TtY}kRDbf+TZ8$`$y+FWG|m5H>9U(?&k{@`O(J_Y+_t@muQqsyg8Fr~Do z?LkcN36tH8)VaR9XmG5!A@v_f;-ksnyG$z3-gsiX1sH99Jn9oK5~N67OL}jk3p4iw zw24f(6_7yd)RvR?W;mp{)y`EO*R0TbMR=XhR1snG1wV^1@TdgR4IW2!0b&ZrL$U~>evJJnVK^?X#;);R#lao^E6NUKOZ2JbX z5V`?Y;S9F*yOksk;<&k5Y_cCr%o9WsQg8aDxyW#%sf5nzUPL9C^)FY6r7b@Pc9PGa z=HqWNVf!8rnXKovvMfa=HD{ZrrNM8I-)Rl+AqRyS}2coQC~kzlBWd(E~QS6p`f}c;sk4HM8)E0<`=F3 z;@MkDTKyLqX{ok7XsBt#K`2xri8u=&$om9e%CZ4IO|hIQRbKc&epSSgC^tXls*B80 zb@Jx)mA)|M{*vT`UE40yW0{zWft~b1@Ca?vgO_HHE*3#E#x_;uwnqGyNmHDX?2z*q zJ19KboNwFcFT3G?(o{7z*^(02Gw}1!oUK;IBdS`vViJ(3@V_fazYogH6ZN5K)P4Fj ziF)aO334Ard^e3LbP*q-Y92lbVN4!t?OGyga z;tQJmd5aSig6^=)f(uP#Bz~+{lh9|&R~dc$=X*~g$@Ar>qph(K8Tn- zxhWOQA$ou;&WQuVj#i1cw?U0;fiZD+BYw|~34EhjK z?8)Sx`J=(~eRxYj7BP!7NQ#Z zAC%TWw_hnLyAPO8qh}&Lf$dHm%67_o+mOPFfIPsbU@z5Wi2x@Og zp~Y9gFwXI2hhFk3&{bGu{2tOJ1_7^8o>+sofxRH?k_zgvVQ}8I?vDnW2ia)n4;uFU z9SWc#4+V`4fCX~hEkku%fR3`SL?WZ_` zL020#G>Pp@-F7$z?w@euyY?s%TvAJ1+Cjs(3-&YK*cy~*k9dyY6rw3uiH+c2Fo*Z5 z26Q3jgDrA|I_hu|Op4G`0az~(78z$!M-~@><52YOc@a-^lU`c5o0g#qEt)^+`?w)A9a0e=D!96KaD)8DLg|%?nnC1d?oigtFA#O({Cqw8#n>-tbfI?v@-B? zwJsq9l~x<>7Zt%aV5o+G2I-7Do*PNdg#_su+Inn$Id^FQ!H=h!DbAlg2U`Zk#HmQa zIWS*>s?ik~KfkY$086rZ(B_nc(9pCL@W4^s0g+0?j{OfwgRJ0j_C&=0)W?FYIFz9y zaR2~t45Znn6Jh&4exVr~;hoJj$ zPTlkFe{cO&uU=Pm%}js&eQUaUR@a)fh60{_v#RJo2F4Y3AZ^b4*ORwK@nXZhV-DuxE#7YC-=KLP=mmAZTz!X-a?uFNRaqK8 z-t=w(=H{d-Ys^32j_h=L<&Ar}U2hfE6~5lcGvZQ3e$7FW=2*pMntukOk~ZnDXojHT z=$!>L(xp-PfN2AB@QA1!nHLy68&(5lQ16!34?^>`*ME7Cv*7?hr!!Zpp_X)v87 z5~H__HW!O^LPE(HtqftfHc5!7QGXumMu1WZkjB!_#ASGZ;r#KOwDRRN4PxU5{Nu0F zX4%?36ga;KI&@U{XNO{U{dS650fBoN=iXT5Q21HhU?RVn+h$@$_@30hcw*9t&rUHu ziAjcL_$BCBP z0M2UpD?VAVk?_W@$B;XiSydk;EYPSPuE;Dj@&{vqd+u)!v~;u|O>=Cc!17U++&y1T zoJV?ak#QDny%Ilt9{wRkn2EfK0TRllF(kw^)!@Y5tSO8*P2SVTgq4I}kw-U1qDV=MxBI zrz#?D#Soh$h^!TMit8{I_j&Wpt_)Nq8h*_$Gh~4o9&M_U6uT%l`MFOoYR+xo7d2(R znyFlDfOy^Am7Hdyocd&`~3(`H9n$pUcr*7l`g+mX-Pbg#@? zp1cl)laEF{uk|AjT|Y5XIpxT$P)PpqZv3jiJFvMW(59HSYyIPq74f0u=ArJ*vX^`n z=kK)p7bEH5XijS3w5TQF#^tz4&P3^iB7L&rmO01com?N}db_zRJpeHc!QGf_;c+ls zect2Z*(XT%nueuk#_)m&t#WDOS_V_MHm|~NHZPefxe7}5H|~k9=i9}+k!b2z->n5Y zRS$(zOh1%x=MxKUt)T1Q1#tE4yi=x~eq>2hIuC`^75^!^du+RVQ5`@ag9=cL?GbAr zf= z6@?W+`exh&?j4d~$(PLXo6sZd8y}}d@Wxo=*<)8m^>Pw}eEyfK+=z-5nw;1#;g>b= zYi}O+nPaN}08vs7jpL9q^a!ZGeW<%`Qo}QCm%sM?u#-SE@!0c)5fee*21V-jgN8Ur zOQt){PwEF2SmmV)Hv?^XY&IWclH4DR(fg1jsc`oL*GiUswMI#0V0<=KEs2ihhXQ~m2#@N^0mZ?aP(tv+WtNi6r!&8@BlUde{uL4rAxVwsZPBmbO0#YDXa!<2 zKXz@wG{7E;BQ-Y>W+b2Rzpw)rPr$;&J+Pmtk}olDr5KzzIQ?mL0^L(nWJ`Mr#Ss*pUbu^>ZuU(5TIL_W57(Nm_| zs6oU>y-#9(W8CA0MXORs*v6c|Gl@k?#&{evYj6Rt%$6OsX^oCbeqJL1al(mtpQSb~ z5-PyJ@Co%STjpqyZv{Khn6XWHSqBERlNkJ3d;jaq_+3=o{g#sLYAJ9?pS~QRded2l zH0^V$F5~2kxeZMauP#uDaQ*ltiaz3ij`l02g+Ya4tWEt#1G9)~%hoT=f%gECb{fWd z{gQmsi;VfV@Z>Y5JL(H}JZO}A8N(jSp&KA#^xpB3t*~>Q&(B;^Ax=Hr(}B$rG=yVH zq8IjJ5qgHNs?YLqciJXwvT@z^{bYp3j!b5ZUTq=HrF37T^=SGBbsC3b+$c#~T7s=; zNBbF<)-z><`D0Wy^m|CjBA-idwJat|4|ll0M&Pzr7_ryax=u4|h=fE^Q8B6Q);?f4 zZ{gg+9+wF7dxMb~aYSX<%R(r?Y{z!(i`K+>Vn>wDa#f4hmR*M_u<&a^GM(kLHm^FW z#n#4_Y)29ex#M{=y^qylzM0$+O6%^4MZp&K1+u!?m>gDYvJJ)|!&r;0%oSS@N&#|f zCsR1z{6aQ*z5o z#yEb6zPiIiun#%coriL;)0pSWV3!2GLG(L|^%!_9>o<7F#-8v~L;;6C2N5gDK1aj{ zA%jq!2B<(Cn?IoBPXPyYAuN`L2(WcZ{fPVMqkc`v05smk{IH~G2F=1ptfyS~pf z+gIl(l7ycS`9+}3ZI4@+Tq>NQ6!SXvdyMLph!>n)f)5vRyeK~RHw)CLt!K@l)fc~w zPP)cK+b7r}eqTKPUL9B(Dya_0V$de7q?Ntt?!aTk@_F1n2JTKzU6h6BngJ9<5uIj( zK%y7tReG&Lg3O(Kh84d&oc-Qa)N}C6GR1<56%9HbA->L{l{U>5 zzz)*+X`DeYS9&j+7P%Yej|*%C&|F%@l|GAxg2X@$xM%j@NX`H#1G8-!xN|LS5)3t4 z`{UAs5URltx>mFoa!)hFQcBI3%ZF9=dq-)$Dt<_teMLNt4*at+sOS}QU*`)l*gEoI zJ+hb1M=YYX{p)M1q-rbb*g#F>&PoI%W;oIPFX25JctP!eF*~Js7;yhu^6(AS5(E0m z35hNpgsN?;uHnYI^_wuSwhm#(`X`M*sMniYCQ|*MIS+2hRydTQ@6!l2Avo1N=}tG< zP(`hT>8%oQ_)9EE#7jZN?xS)!jC&<}#>XPwN!>C?Ax|wGb4z*c>BUrA*}?EPc|&@~ z2{kSkX#1HaOcnwr2HF&Uduo(9;`DCt24!{WQ|L#WZ?E(d$Zm9mm>XRfeyUGeSW#n5 zW{y-ZoGsm;F2+=dHhUSbg*>))>T$VwF5}pz0Wl|42Ho0YdZG~HbtnY3hDEoVux5H= zxAx>pzjf6kFRK07!+LCg4jzz5XaR#YZNsDRT0>X5m4B-41MSWfQulRyif#CUI`;5O zNxrH%Z1WN|FN*XG23DEyox{3VR>&fOrz$<)11%=5#|5JSZ`mMR*AElJR{qLqcw++( zqn1kTS{Yl+N?FTdA+lkf-^~TTID4#>l=QeHd)=GcxvD%^;d*Lxu9Z}UZDdXjSoZe4 zOYf!rtQ}?G-aELBfPCtkp0`pS9sM~9X%a}gTRVzgei{nkrqE>l;eY+X+-go2Qq9aX zQM%!$cX1_Y`mJ4sgby<#?ZREbF&>ePzbYlHo)^&hHF>>6kt4n*oSDo4#i-I|i#Ue# zPc*FyKJ>$E`koU?AjDv^ZBxH>iVTfW-1h2m$_P#yuiO=Z&=cpCbSJd)CLd&AL=@tj zo~Vb?ie|f7#tDz)e>6cTG^k)3xpiYPH9K7s)4QN#LdDhl9v_Hj?41K;51JC@RbqQk zeGVW^2y;H&;XRMwET-bH6sLiVh9VDU;Y6igDHcOHEydT(M?-stvMwp>n(F1$LhCeN z1swfo+NXuhD1E**#a$^ZW?Ufao0JRCO{%_2W7+mAwdU=b-;T81W{k-27YOJ3E}5e< z!$cJK;{dFGNjZwi#R#2p7e6aL4Mo&g2QHImr7Go;&}-bdZU)V`S;!`lk(%n52u;zb^dwOU65=0CQb-Ef`^bw=9)~guNCs#~YZlV>@04W}0>Q=+`3BC| zma;#)rEmZg4KcK1VdfZ!eyEHZ;6`htF;}4_4{RI5m9F2Se`FMEE0s|P)MWJ`@-Jq9 zl!|9FKv>o+{zSlqp+9WNcOR%Cb5MKZnO>0-nx3rGa$2NN*O@D{^4OQzF%Zw3`5m|M zSt+PbvI2pYtdm)rW!(QPl7M0jl}T{#oX(jfNJ=SQ)g9iy9vX>(B-srFBIM?X`YA)R z+CM)1IfO(bO~ZL!p_js2_(>xzQH}hRZ%B486rB@$5pvHskt8=Q&?5Us@QD*Mqm~i9 zc<>^O8sGN#=biDP$J^yd%eHEn^9^K%zFwif&%nX|$USeHF|@&IT&1@1Qy%p8(K+oMcp4yI}mF9X&+Te+itn3c0ld{H_wg84v+B6BS~D)Ee*Dy zu`z)6P#t-ARAT4M=;;%BybWPXnVIq-+uE=!gd|qje>t?Puo_e>rflO%@!n8w)=_&E zBwPR{apBdVXfYOCwrw_$w$Y++s|mEtIH=VtkLP7p6wvA98Q}+X7}M>vYIoN#2PjEj ztYGk}T3tJz5Kw#(@wH{-^YW@Rk37Y7y1(vwhYmezE>fTFA*x^T} zEi$CLYzAB6&00KiCvghUTNYpKHN6p8)Qs3sh&!KAFWA2#BT8$87wxxbf%B1Gl0qey zSoLhhNv^@JSiFE;=rFVwbBqtvK*cXXUC75s+n~(fOV2C5{dzN4M2ZPavzkLt(<{Mb zd5rh{b+}^9UL~4?n6m*^J=N%kAZ*L*E3LQnR7xL^whTT5F<54QK&erpLewd8covMu zSksG2Fn@FHUf(piXUOI4(k>6|BHu>K&NJO zM5h+&PskW3f==)uE2tQ--eFaJO3EE+`uz9HVQjdC_c-A|wN5`c{bV`7%Wm_zH(4K0NTNNa9WQ}UgxXzPY$08cf zYj^IvfLqGnYdbbmi#V}b&$7d)ufdxix{E?w7eq4PzRG4FF`dLm{=1ggmZTHME@Ci= zihQ-!-G+qX1qaw(m(q>A5O({h;ybz(P1yO3EPIHBN>d#i+_@w3l`Nad(=M=#s}aCa z^5Qo>`PrB~iqVvPUlh#IrEUFDE6Z3)Fd z?Kv?}OqIYph20-x4Nf%v7L1}*OofoNmw{J>*OO_DvMJ9Uc$Q20?x;dd43T*X``Huu zB!{&9&y!g5w_qh7wE$)kd2ZlI5fkUHIjqIcB88viQms*@B!3j=*eFGr%yRUybTW%A z2HKGP_OFKQ#Ia~kXUxS1t){SumN5=P=i=r6y_El2Ne@I;UhNKjD#|yXG?|6(+tc%R zwe_lejp8R-se?ZTjf7rVO+`>7f%oYu&y%lAQ^qndi08Ei*6t8(8+2w z9Kn3kpX+<2CY&{Vb^=|$)Wp?o30ERF3}=Taiq!d(;qSg_Clzs7y({vOPvlB^k2<)} zHE2F%?9`y)J&Ycwnra#yjhvi2;MXYbVfot4Imd2VPlCcXc&5BXhTMA+Grq$xGj($o*GHPkAs z(=Lxchh}6?c*r^AKr@VAY-^)yP}Wh+Sh%vDOSYsRsdq;n54K1K+bpzP)MgxUJ2oaa z-~{%xNUnr=s*4>tlDb_t(pbn|{FD3l@>c;C4=Cb5pwyAmSBkl5TjJ2vs+V!$}nt9_%6OUU7@)7!}A z&UXT-nArpnUHhZ=xZsL%BUJE1V6pq`eOq#PdB(EC-UYI1N!Drb#BnEC@iSo9x5DCa zB<(&`9TgL9!I}Wqk7U9*a8q_*guAQ(aLjJf)5X3v#DmjEI>+?e4#tHX(hk(y!JwS%1>7|pi%9>xn?*+Ljh0z z$Db3S#ON!Amb@dYizq9GO8D0|eNqK6!%0VCctS8o9M2b0d(!E;cZIk4cnWubo_@Lm z0=b>5Bw%}u_dwdO1-I$Z4ojr_6TGI;wzelQ{>mGyM_^(}f98AmXgjG==V|4N9ANYc zs727p#nLk#bg$K4-{C+xCBi|?8b(ws21+?GkL=?uD|I~lT1rU5_Qo~2g~ax zWUL97fQ+iA3f)7^WM^*lY@&d$S&sa^Oy61fBuIcSq zH!%_2ws^vqIN+OVPe#AZ?HI{|>GwJwO!nH=g4pRmZhVMbXK-=4A3_SyYC<1jYO>>8 zspoUk9Iw!$0nxyOGKM&G z;b)Y75a{UgFpX#E?xPpL%K(jA(acI!*x0%cVkOT^sWOM`)nVFj=GLiLs!;tvb+jbp z%&0E$=1t}QeO*zN(7>d5h+tb=%F-)!W=J$$G_iWA#63QyNk>>{N9ZbJR!%c>P<2+^ zcN_F-!8G6JsA9QgAY@G`Qtkm`Gq$p^ldfE`FXWg+(?)l|#W@+c%^Sko-Rs@3&E#>9 zrWjTx6-3}xKDvs2zgz(6$>FQ9Z8e7^dpe^+U7c*>>^5Lh%;nUVnubK`y#$@GLG&hg zY~5_%%g#14LFGNwt|M*2^71SpCs`HbtwGm^vJXBJb`YzB1My2q{n4qFNhs}YX& z641b%GgbJz5avKbSWUv6{R|ND= zaXg(m3n1+2y`4l2691GH$D(JsSRiY z(NemtN(pXSR3^1fvA_)2QZ&ggz#*bBSuyHAOJ-M<dX2tl*XY zxRIs;ku!y4d~i^+F_yUR1-cchrkt!xYtg8*uh5vxNNR+SnL@DG#oJhJdaQ~ zufm6}d72!HuO6dsem|aPZLH~@-f%ITmwX85q?(TLg8u0WRl@CwjgbOZBLVxWbU zf90e8GaaReY-43tEx||o3`mO~Q0QXAmbm_SFSg;mM;nADA0}3m4$)Gm1ITMLv^utWaSK5)TUf6i-}5Rf5>lt9SOJjHrjc9^peBG zE|kko9CtCQ%hA>?E(f?WjBlP!CEX;};_SB^$9EUi^c83BR2{)LM*=noMIT)JwuMpW1wW2>xvE?2nF*Bi+P z3sETP>PmQvh{f0+7~%iE5yYrw7Glt6AkZ&_>T3bYXMoDzyU|Q@`cnDm`ve7Aac!9r z(@#IC{NO8_xzwMXl`IQcSI2W)*#7l#6T=5bmgc5fnL03UqtN*|b)i&3k6;b{eA||O z!-2a#+l+47QrsSGy-kbAo3Dn39q+&~R92BB(zEsbsR{S-l?-Gy5@{+6Dus^O1Yt%+ zDJ6^m3v_?OGlHkmLz$U416L==`uB^DW=%bxJa{pr)^%8!`zo`kTk8Jo$<`eno%}dUC5H&^O&+wwnys1hCAPxUeEZHX3X}_#?s$ z28>SR4f%i9ke+<$Uu^~tW+_5L{_nId2=wwF?C+}{F|1HT05hNAUj=42h>0r9L4=I_ zzmM;Kvm_Z|^rEy#fBPm(QIr57m>Fg+N<&Wke?Jir=qZK#KN=G&EMJrwd7S;PvHt_K CvEj@B