^G3)i`O%_U=6_d%nU||& z$VcvP91>#@c)7$kEgaP>oZ1h^iu!M?fF`oT;WaLe--ZWz{?=Vv$h-DCsoW2IXGHa0 z>Y%!qPq~K`#iiCN>}x1R1%OVxRlshlS24>Meo)bK_efM!taIu5x@4=JAq!8}pMZ?{i9+Ua!Zm&cPt31$lr)MT(y} iMlkBPL8mlTUNotmbb_A0!UcWd}b+U3D7#GF#`4p~44WEFiCJHcbV78dH_Q za1MRm$Ne04TFz)M2!k;3eEI|%xJ2I9%xJAo1VutP qnpSz(LrAb|j0MNS8g3@mvgOZEyuLGB*2pNfx3mf$H1(_sv$M5wm z$RRhQ`>_7Nnf8A=h9Y;+ eb{*r7dQ%1O&Xj)n?R~{~OHG9oV<@Bxw*peltu{ zYRLtI1_|<+P0UcmWiuX1wAlAzXeC@NLD!*t=(2u}8ofLCwbcye=3Y&$BlSiMZ;7jR z_mR;yFNNg{%LdWn_j&vlNA({bPdS^j`!p9bW=t2U*{>JJ2V%4~mczw)TFVIezIWj< zqk{xu?9oE9LuybUG+~f1TmdP%xdNS*^n*o_ao>$O4c>~&?ia|Tr2wG7h%5G&5KZy7 zEOr6Uk)wP__YQ2J({Pt1@?oE1sQa!h_J=(H*!9Uu3?i9pO<#AC{YqFdm|tncUFUC@ zV)`qeU!t3=KP{tlJ$zC(&Frl_)XpVCpq8SOoW~Nick (NjM^v`mEIc52NDe975#A>QrSN3T{d%0aaxP l$;w{~;{hr-IL RA0n)a_!~onv%$YdXf^yz$ yu=?jeRMP3q}&Y9JAK(Vv!EtUi2m2BjGA-pgy(4i9BXmtLW<+^ z{@y>F6&vtn%VSp0cc=&^xAiiRn%XT~Mm>8a*M}%Ok_W8Lk&De1vA$YIca`JC?**+F zy{CoRSf4UTXEripd~RLwaazuh_J{Q@9 Y%vD8ee<+uUkVOuHPM>}~OA-9|mdmCs9_;ZdWIIjB9XxxdP{N7c)On*($ zfIJEE17aWR850>|J%WTKjc`y< -E gv5s6nyDZ4>cwIqqD zmO_WSrS;Rn*;fW{lvsN0$sIf_Rs`4mGEk >f6(hrPr&Z;<}FDE>7i^y$mhyxhG|3J9IZVoE_^ zjX@P3wj`z~G!@(uAD 4Jt&q`jdyxB@C|(4M=sK#!7<+2=y}$l0i71Pm$;0MO4t9XWg4jd~ zG=ZgsrijTeqvUzlCRRfIfG)27#s#6(dx}e|k>6f=VVQb0@oGLt7C*h%mzXBbJ~g~D zIG8Rlx35lgF&LIn@|RSS?T+6G1oKBdgqjsc$}$r5q);2=J`CSK?^^Rj-|GWG%EmZ8 zwl%3lRLsl<9b(d9cN{<~Gy{W|UfwF;TlY(e(qZK&>J~W_almjrW9Dmj-JVi-q>sZ< z?mi<_#i{;^aDbqAf>0wUV{vBXm}ysvxI>;=;-@`_ZcHrodS+W|iBcbYnC%Sf;R(VjdBQ^ts5I{wvDx7)qMP#Q|S|6rnkNdgn8;5(-E zh$6F_%S)N^zZ&T4ceReZ93gin38w6`!+$)ftgiEprl``w&9XYt5Z&VzbpqKt4$<@T zThly|xQKiG APRa_QDOY; =sQFf zKD&9$`{@#BII^ 6A|84!my$G2(Vs4Z!^Dyy4*0jmv=N5N9{pcid zj(5qZfcAp#YqWD@#QkpR@n2AMF@Fw+qaagA+-S%E_u1bvq({fect zyhP52eM+6Dfot|8o*YKR4$TAmcKHgvjRdq7K~;Zdl3ToRC8v}~haZb6=lg!lvhlU; z9KOzbQ&C8%(dJ5&wXV?;3(_%RTepb&^(jPVT2?2nT!G(Tzlb0P#&-%6C1tg9)HeO} zJxMxDWTk}O`9tXL4;;ckccz e>Z-Z&v(U2TSH&>lR}#B>??kMt zxx3xZD|_yLjQqm9K8#tu7Ws-O>w%7*HP2=^@wDfPJ5DKSH|BLedbi!i1%I&dqrSdH z>Jtuk{`>xR?imkWgP?L|rKr+AZnvc^(~)w{yT~1PQLw|Hk?0!v*k6@COQZ&Qs(}_l zCzO8ZtzVKJu8FLt^Z%0EU -UEulGf}gw{H|pU%H&k2M z9lKw~ &S|dm`rED<0-V{Xl|-w<+%}$bDNq+7U7zd-x-sdCL*Q$%TWH zpXh!(mhmTrsAW{dAY 4-{5jrU%nNBoV-na5Xh)YJFp4X zOX9`8Fm$+6IPUaG+x9zaXw>#p*lJszW55QD6}Rvk%{*=M_{5JN>kmD3FzTJuvV3zY zTtV6N*VK|HL>RG{gaBr 8*DyLhR@+`bf^h| zJOPM%#8dN}o9pnzYUVXCUjDCpIlSTp*5n|2npw*#Hw3;tRY>QOOLix=(q1A(O1Q>3 zB^bgVqQHhav7}M-CCj(%T*g9@+8IH5zs5%6+JdpW-ax@xLhEZ+7Ii=fhn#a208FX{ zQPa1PNxgO_yaWO0cmWAox6K*)nj_JNOTvAEFRvHAF0kn9PY`BE4OFxZ*J`WX)!Ucp zb=IyZEqAq#h%xUrJ!-L;;(9MDsOv+kZdc8rWMiBzdlf3CY^qf-YN>2VoSlixXLy~u zzPh ?v(# z>K-yVIJD0ZkjLWYS-y!7o0>Y9+ZYG@Z9k9VPb2|pEh`_>#wS>BNu{~e`<*{GzZ8Py zg)jvz!rx3>c~{NcD{ibbFgty**JRB8xxwbsW dzx64yw-p3lG<`|Hhn; zqr|;OqSHuP(#4=D>wKCRxI1WB*}gV&P!DMoRj|X My0oT#d)r-D@9jA@Jv$&L2L9hDdaL_ zwP9mtQJb}oFtaBZfZSG|hjs?Hs$3_{ibQ#4-Bm8FXfzKZ(mVw)HG@esbq!bX&Hy)? z19hS?NpcYHCh^kJg2z{B`>Qj`%z%U+(m1ajfd^zJYt3_Bd>q2)zZR;4Q_xLWbzlDK zo4;;v-+ayG)3RU<8_aCE#-TB+i+0Avn0f1QvL1e{X9WDZb)JUUsb+A7$a(O$aqb&} zCQ|ASPhctgJb&OW=rN1h_l^?9N8C)hfQIqP>i2(Ie7Q%X000GxX>hAjdw)RjWi>td z7b!Jji$lrSqKT2Mr$nc6t5pS;$zus?$ZIod#&j0RIg5NLVk)TxT2@b06^2>qMrY-g zL9Hz#F&Ay%{lR?1FK7hqkA|LFuT(~}RPrQ^-4OosJA6N4i(?>K9s{T_C2$5`beLae zHDLOC!2YMOY`taPyi_~+_NsgL50K8 XlQaT z8W*LWF3@kuX#Pm?JI|{LvB~V*{I)vJ?_W|O_c@A12w}HBW{``W6VY|QBH?dKMsURY zOIFr2NJwuE-MTrn8>v%J!-H_T+41?C6m`d5mqRcBOe?PYjR+y95Kc2Z| zG=-A1ztXD_P9O<<%unx$c{*HYmiGmRK|bGlefS%w+B&2y#VpqhH5F6HF@OO|F$SAX zSf_Wqqs8!EeD<5_z)Vl%{iqHmPsg^?{J!I!UR9#tH|iw?+(cqUGNjG4hxfe0%;z78 zlLA>4rq_ph|N4H(nt`$BsN^4Qwl7*gk1`+HdT@Ce9V+ci-)W`n)FTzAY@Zyg{Cvuy z=Qqred+|U~{!TnBEl1Mo#eWu#5ae%Oq{B3mNjMr$lenlgOYtq zHE=1TVfa(=8$~z&dK6qKKpU1K#oJhkr?ewqp06ry;re9G6seN#2|e8i(`W2jO;OP< zAkcQIKaU_Ldr+2yy};C5N?-jrbK2)m!@y1u|4@RW8c -dN4ov|{JhL4C#q zVHk GUJ=CCan|RxejzDuTM>yb?9P5Fq3~a0=mvIlrY;fpZ`E>V$DqA9r9+uv ze^;zw%zCx)P&127zv_D{sQzBOWCnL;v$m!D)@Pxcj3iYdql5qfp-JFZS^@U2Ipf?q zdAFZt-7q_z5~<8*9LHjKI}RR+(SD5_I&XbJjmuyEg-<>0sh;g^RpYl@=SctXxiK3b zp+e{r;tM4Gdc49zEBxm bXKmmD8 MgwFUUF#b8vK^VWeqF-Xp1f%~!BNz;%>BLDu-3 #+hef5y <~d5Y`*`+`8a%59J}(r`~?i_ww~OiSqBnDm15yx>{o}F_CO8 zu%-?@R8;XQm)i+DghF@R?ZH_12MBkHf#4*phG}yL6MQjg@Tfhbe }dN4!+S-DMDhGK8pop-e#N455_B}{&1B9UDyB@Y=JyuLTW zK>S%7GZA|7uMaqU^ S{pY6?7Sak3#@ni{I?eAi*IFUz@ zW?9U&lz!;qw&+@Jgm~ypz)}Ne1jrgJ3l=dnZaJt2QKYT(KYSF6+}?Zc>VM*~YF$^0 zth`F#Pb4?_G{z_IF%oU#d@{DKui7ekQMM`Tf(FTguk|X;KQ}9zgpBzGkI6fY2Nmt7 z!t85ebQdGKoHAB2PL7UppFR(bazmK+>BGqa6olIrDk>3`8CLtffzUA+ck^Q>t7{6I zHnsAr#ek3!6h$nDk4vyA)&lVv2Vm542Q`= Fk_%%DjMOjc)-=TzgW}Ykk1wR_{~P zQZ!fEPefvl)Gco`c}kj|Fm2o+`ONDqcbS~_1QGm>9-wAf5l9ZdwdVS5WRjVB`C(_< zR*hhOpF{Ut8r)zat5KWZc(J}b^OUl# #Xl4$&zBxC *KUn^tGQ5UI zk78)KHUxE+0CMNEw^yRcc}LS~A%hY8<2tiWd}=!NzV}|Ad(Jd21K(cUz9+W1>B)Qb z#g7^z)z26nVWSfW+>oeS-8ZK|>T&3|>}WFxuzmdmC@(Q(wYyxf*BvDOK84cuS?!*t zwH=@|gT9a5#6PmCE_$uGe?nGo?s@BZIwN4&p{swAIE+H7FL_xGy;-P+QPUaq(o)_- zKchc|Na!p2bkmM|W4;xWqN*(*9x6KabxM -B(I62B$xSlV(-?by{;Gg8bWzMb zk4_$o<07DeErV13m32{GWUKsj&g)-UpaVy<9IO_g&_8W#jl^JBDb*9L!$23POu=qN z`t~cH6gIQqJj?eV*PqDx`xZB;5lCVWdE*~`0D4%Mv<9}4j!&hrHvX6B68+MRnjE3P z_cB0|E$2p_vVc?v3Jf{Re1pa% 3&|G$b9JLUg4YFj0@<$Xz^6AX38qrxAX VN4o#f#iwo-pX4+V@8l!7$)%9oMVHESPi(b$AKg(VD BTDPz7PD4KCbP@ zf7;-3*jqmcn91N4C&K|6-mo#8)o;p_&A 3&@hr#wVMx3Ut$-s 4E>t0{BVbl-r(}-=G$MOJb*@t~8HR1 zV( LeIz;tEcV2U_4fLf?i{(1&1trek4%7On{bOrhAvE12=nw zyxjO?JZJsKAY$LrzN!jlj~xKOUP$BV=4pWh_PY{g81k`-RGr`uyUweYHGi~J&1&W{ z1N;%IJ!MMFez&H%S9%#88{$SZ8cfj(d-A#MNX_SLl{{QJ|4RCQ;(vGVJ!dAHo<&WQ zs(L;%pEOmD#5TK32MXp?GtR0#|1%MFmJ1na1oh9aElER8isSVZ4$gpOm ocAfW+q2}kNAFF|Ug;HT3t9du^>rI3H3 >y>Zs55~)QRSn-~d6> z_#}#?4F@Cj5o!OdIYyLS{%XgxhP4fu`vznCU?ihi?WY1pwH*fNZi7!HbIv>Q{QUa? zRc9ARPWsHcepJ+Fp2ZF)Ru1%$C(Hx8>a!a!-_)&Kf_}2kl8|gJUU1OIYALE^U)}Br z!;Wm-t#gs6E#{BMsjzFaQPg5Tz)Jia$vjt?iVM0;6Qxx@xr@D?M}y`V&gb!f03KOW zqVs<7+h*sje{ZaD7kae%nD)~!c*w8F!9XJl5@yAflId@D?n*-xAO4C?haNIml`}A~ zV|28Wn6W)Ld$>C6@Oi{L7cY)23ia(c{SN#kQrP%te$vu+Zd#+Te|5!AVRnmwP!i1D zJLzwO0y`#sqlk^zNnfT2KD_&?@2lJWHj$+8g-GbX-=&F3=kGtqw9Y|8xQdB@jh++h zx=Pwub5rC2cy274hETJ%b<9b(Kb9tn#d?40yYUo#f6)~`yGeW>8yYY0`(}V2`Ehwe zn}`kF34;@;bN$amR*Na>pMGm4IaLgx!JFdvh{uP;vaBnolvI4Z81>2Tl0?CzdQy{d z`0Pt~Pse&~zv1o(&c{i6HW==W{L-`5RrTbc>{?`m4 K0>~VYUjqA%10;lRWD=bj`{x54l~J^GzLo& zGiV%|7y9ka_W5qYr;;_4kUjaT+)XDb<)NYsuNA)$!Zhl8T7_PN{J5S|6YAeVW${bz z#xx2rdbOF_SW*cw(Y~Wz0tQvZyxe+9xcpl47+J>)Tz~quQHTiQtLgui-YUMNiTZ*M z!J3Pp7Yfh~Sa=Z|K?%7DX3sCi*S?xm=_x*JUTsw9Ew23yqj^jf0n4`5Z2(~UUh80^ z9!SgKAb-{uB6G!s6f;ADxDfr9RmCntPeQi+_x+-;8k2eBEcU0YFXqW1x0yc;LJGk& zLap)Csf4w?EOMNT#vD{pXJ-m7z<{|g-~ycPqC(z64jPZE|A!%}lYo{JPHy 8APyA`7R|X zo(} vI=G%-M8f5%pZn~?e)!VzOtJj z2m))xh URHt6U7;dCy>;w?(acLg@P))@38{C6hU6SYy5V2m1+>we-e zU7h)`$F$0winm?O;#MuGv!O15NAw9_xLB q$x2HfP0A!yj3o4L(bpk*IW)upBHxh8%59$kYSnf|0(}5BdFc z_FpU7J4guQ{cu01w-jAx^k<`EwGvth9l@&XNfiu)a;wO)UFVUO%YKZ7bkARFssGsB zG|dPnTF&d6f_D@W?8= $oPTQD$n!k-aXEVHJYqI8c25CXw)R= zhcxl!tn@teZ-z0xiEF10b2;n 18*VVoys`gHJrT z3?rd{yjww+fGWAdjECc`M0vVIpPQW~8Ze@&F5VMYL69&z@>=a5ErzZlHObkY-&&wk zLvpG`tk$c{p?#)st@ ( zDY6gsGxM+CHX9hNuP&_QV# 6CuCYDIQPf zB}@&D;bC`4>SEVokb(%JtGr|hkH;zh;WPG4usk5_0fUK^r~6G$6-3 nS4OmjIieMhu#uRW$CKg1o^j{wL# z($8ItOBL>?UnXL8$S$5xP5$9gylMGWR;;dL`mJ RwRKZQd81 zDMZ7d%W3bUO@I^Oa_w83`ghwX!(zhAH-=SLIq~WC{WsKy+I4rp-f_g;h^ijV(Sybf z=`M9|&a;FbS9li)3eERrpyq)11n+gnh7>JZUJqrF3P%BHFuElZG5||yIi$9z+=omN zZ-6g5103vOdAhDHA;v0$AA3DRw(gt2L=?~s-M6Xn@;EPRW?-TSGqWen$6abLu%d@f zTMqDNhU}Dq*gPBfv|m+E!Q`EVAIbaez`p;IrH({0irldTU)Y4L7P(=q%ZyCvMi!## zcXKsV!#>;}wNzKNvalLt@#%Vco2%CaPvq_7B?tYl5(7mSu$3FoX|P)w^wK|Y=QZ!m zPr^`(_~eOTyRjJEqF%fo-RO7YU*EAiq~DqC(Mx_LKYGZy=99gu&D3NCr+
^9fC-dX;%M`c-D MP3W9CA cn*Dkw`*jhwb$+X2GmUReSVQ5GZ`^POfQ;^b#^2w(2IhXxsSkbjgx)$tCahao`ED z!>d27yanfb%_VdZ+$lMYo=nJd`V!&^1$%0lcWNZvY0|uTA;1rit$+Dzi`$heFvt5` zNCk=tU)@^&O5f#n)U&D>MPk;N_;|^pRGH4`_Cl2_6t<21xcNvz(87QI7D@HhpXofS zjA$IW2Lnmg!z+8lOO{Im3AgoTM!C~?JeboZ6iQ6)!9i<1keRErSEgd4$-3pb0E9W! z!#NZh8-Cyrj1sj!(HTpOBJh0jJ=bj2Uyz0Abm)qE`{=G^zmT`a8*bD~R;*m@)0X v=p`L(TWwZzqGWn< yo&l7my;k#3Xs#>F`3ai3qxAZ$ii_w?C2KHy2t=tOjFb-8 a&)c#rc>$Lu5HYc_niz zvSchhtf0J>8zb?gEmN)ghnaMg7a7}9dnX?AXV2V^Yq)4F`@C>S^ly)UbYQL}bRHx% zDc2V1_O7;!8nu0jNEa3j5S@O|e0ELhUtKdV|Mr?0LE+qdtF7R_-M_KrQgyn+-Y@3m z>$0)Y<#==62i^I!7G1-0;)^|y*gjRWy^(8N@wivsCR_d%K1x0?m<|C*5V?$rsN=b> z+<+AlE*|eFMjJS>`qYP^<_y_*@HpqkgcE2M^W#iwCOjptQ02u;+E!;d_!EZzz;Alw zitywxum0Sz?@f1HEIKy-jb31nb%_HEp1~<2{!SmVmV45u@8Gfcp%^+Y0z*zViWv@3 zBe6hFtiavp$sS(x@i5OR`T0nNGD2MY?MRnioa*NA1RMV?9~!x-LR81|(miyD5(Ca5 z#0szNGW4oQlXqEv_4R|!0CDUs)Tidj`~-Ly!bFbZ@{%y^?O}BPt55Rz@j2=d&$&7W znNHbM8o~NYQNgyO_3Tc}L8W4C{)bYPJXYs%*2i1pjfjp>Lt}74+^ 3M1rWZ5mBxUMaLld?0uma)V zQFU^2mdW`eig#bqIx|8aa+@e6@v816`7$8xo2b5Ct_pE%^vW6O_*)a>!82TRByFr~ z;k^a@Y3EOS3A2>iH5-SO;#gOD7fl*R{R9nxEPEP+$*F}AbqJE$Q+27__*(FxoYn3} zkdOoY;bl~eQSoEDel O+b^8q8NP2o z)+|1?gdz9#1}FcoiFszccxecp Y@{W*xbWvK4-UrMX|H|{@t)c z`JALV17bUe{noseDNRhWe~-L3;TXt}Xi29FDyVm>asNkxNA=5}nh(4mFH`0-+afZQ zvmMnxIL^FP1O8Hhtrqnn>0;aLxv|Lw ea=Hv~x-gE!@ARrfIYhS;ml|0a$fi8B-%)~{`t;bCjXAnld|B3f#($*_OTr*vCChReI{`EUDt z(q^S18vr DzVFAOCsc?KF|Z*(EfP}s z=(QDZdgkg}#vWSnUS~#6q}`H@+x4es=!;txQ91oJ4Z%VZ{XKB6{o;0Q$Md&^Zd$A8 zjx>b`j*de4xATwHfC%#CLC*?g*_1;*8&oLI5LZZW{vi5ObMgBlrGU)hSTgI``l=D3 zUBn~8eI+y$pudH>qtKjAoo8vyeNJ?17TO)-iwMojZFWE%` zkcE1zhQ?OpOBn54Jda1)E@Yh}mHjUuTw@;nYls4edU5_zvs$Lllda?&JNow;L%J|b zOLSk6`x@UFxG=)y7Me{NU!`7csv>rrY3#t|e5-69g7l9c2@GFHKYZ=sM5W~`z~R{m z&%4RKyxo-H{0dvQ`M=3Ax=j5;VQ?W>Q5BEW^=HG0hEWI6ZDRa|m;~r+ODiS@YD7mG zr6uRFqss(7B(&<~FaRi>)cV4*VcJ68iN3gF5?j-~l-yg d0IuhQF7?3!mmf+UL6Tm@SbguVg^d*LjcX{|Ww~MUc;of@g z7_*EBSg{L+r40|gh6nJU^1QqW3B*NZs`3}YpdgBUt=ED+cIu$bAy!s*uQmF&wp$JJ z=ke%V_v>My!~x9@D8t~j+t47Pi$7ZquA6tLnF~K{qhHyq3RNBsdCrUSi#Ix2%oWos zHB|XmJufJkm8>RH@ZU1aZ$%{zhE8UWqL(4EgXqERz+TYGlW$=Hoc*F!MuJwX)^pr= zamoE3CX&Kv#Q>hV|M9mL9$7RTFJ92*E~wp#^)r1>79C5r1oA4b%?2 HYacAsCW=*W6VtPj^&gzCqld# z-!g6pP^Wd*sdyd^mgW8_zz|34{k^62HKabCILS9dn*PM0e7`6s1-4wtRVra0UjH6q zYc}S^GZ`)YCkU5{^E=-pHpyVKWFzy2n=gmK3JZRXoMZ2UTRzYE(yqX4!i${(8a(K@ z+~Ql{x5|*3jx&1i=*{uH l-YgD8J>Q;Zh<%SO@bc}#19f?g?G zN(cK@gD&tGGdr9NyU4TA{6G&599UM%pV9I8%g5xB^E&`cG^v}!ObIueZBKJrWYOoQ z1{39TlVM?}?J9@^8$YBbDl;-3FAa_yBk;7F@45yE!31Vsq0X_-pTO~%+qsTywk7F; zC_35q+P8#5Y=4-ks6rVvJ%^W|6iS{{uj{jm )GBfT~1I&DM@Dl z!^K|s`K!-DXnZ{f1qQif8eWZ;ER3uN{=ww^b@Xy|`{MZV`(Z|6wmBJP5uf?L;@Y~u zOr_6mrb2U7F-hRfj?zJ^r{wgB5Wd@QPlTr?oNt4+!<-;&g0%qR{%k@9PtOdvU ezgc;kq#+FhQ+^iDoZU^?p+MW#qVkkK0qk5F^=N9O+&u!z<*-<30 zQ) b%>ipU`AacFN8`j;Pu#;ifOCDv?Ha_X6chz&uNlVU3=^{fK)UVy@NvyPSntr zi27%V$0w}BH?iz`SqTZ&a2hoeVm&?C4(A$Pf7<^eAj2CYUiB%xe)aF+jK=O&WD<5h z=keR$gx-wpwhS0q#x|MH!!0d$@L`r0_lgDo{ujE?ca3E3{AMf`*qM`)@Mb**Jg6X3 zp;3Psryx!wl!* >c+b}S5K;1r`7qr>kV0!P?m`7`4bfwjwYV!{rBKd5_$>^n zV!<2^`l^&uNCy14z6l}^3nE3_j7oxNlN-cf6`$LBBGG2)iLa9P?zM67{-Y|qoKeyM z3c5-cs8~&U8II>O&_wQ$=gmaY4?4H#(cv4wdx7p5SP*XFgTB}AHZL07=_u1c04g63 zq$D7K&y1gDao3A=cve|rKk5ztjfhvNy|Nww(HyUiM6ungXK40sc=_j-UU7}V!#Lp7 zTh^Q7nL78cqSAJ?%=+`|co|!!wMj2NajyCLC>T5e5 O!n1ranWg+NzKU4=_JyP35+nV&NMJmi2i@6qc+N2X;`e2~NWw zWZ{yx##m*&i^%EfWl}mlbx?Y By^l@xr!9#`EFfcEJe#&aSlI<;ZXEVrLAlI#v z8eEMP-rl96>Up?MJr|Z#6<<}F&vxR)BNY*Bj;HiW@m7mv#8M?b_6?V0tG@k9(S?&C z8oJQCzA1R |#v;5c6#>egRlpCEM!mT{IZGhGJiRK<6RT5*A z5Vs2e1{cx3_u)*w@X)=4AQgd4EE{P(-=|7zKOPv*w>SqsrmUQ_0t&NP*Es${DEpga z2JBqdTbzrTg8g<3XSx4A_CfsF=EN_tOFw?rt{#)qrGbK7?;@w_Ru5C)vpfWW?cr3~ z6L??ia{K~JrJ4z_BnV#jjCQ(?7nB7UR_7Av<7();{VLk~!M#Cl$9%#}NM9K8vJU~u zAWi&VDL+wYGh)bQq;Ey8`Si;9e0fwRvE83NafSUh%ExcQA&%b+!I4D1!uu?K*Qr=c z7mv&@`~(&XM@IOJc;_ax5A_)^NGM#A{Alh~sLcbdYGvSAq3uz`;#+#~NrBg|4{)ug zz v@Xm!H-~+3I$q_4R|};LqS12>o%m1sUJf`{H>7 z3B|y?^=DdmsNEr7)N;*pT!O+%%Dz?PD&{w7Z $L)TlR|Og$t(0L+g2jj^v=|D-8; GUgmF0T10aCBC`@O%9Z`mT zBA!e-6ZudJ?b`xu19kHt4eI;Ge){S?qlg|bFkjLli>Pi8j0XeY8n^Xep_P&6SEja= zN`52n!T7_b>-wttM6fK+hGXusMBQFLoi?1x;*3PJwyM3DcJ_-ox+@>KcZ}GbG$)=p zujY!eUAg1@h|}~ndWf>f3yK0Z8Uu6j=sH``Teu1@d$dh}-oxeZ&-`DPYV=6XP}`2a z<=))(nw$TED2MwcHdwgrM5Fit;IxY^5xf_?Vi fo=mm)6x+TTd{ZS8NGxREae`guVMTGVUx>Dczi_^oestbmK m`Bkjve@=-MPmOiv)ZKVf$fdA*ck!Ak1nmlG&xorB%mOUE*?wy)>W+;XbCX`2{> zfkm%~S1i1zfi@mj{Bm9jC0rCQ!I$~kLzftTsSzfl*T&3I`E90GzJV#!ovdU??YEJU z{ImRUYQHs^xL)rP5>XQAWD-XFk*MiV(%9XH0fz56_S~0AOr_B}SgAn3C44_y(SMM) zO=p0OvJJeiTF2y?w)UF$v%}!-2>_^<*RobC>egK~uE1pt=9}CHdxI?h1g@xG0~*^z zg6tHBGd44KY{ybZ7x8}BKV?6|@O`H9B|CG|27NZc^z){RI+E{!@lL28#j`(n`0u}| zxdB?)`NbOro~RSV;~L=pFrPCw;mq~7WuWQozd>$^jo<6Pdf$4Ht6Tr$|7QVuwTa|b zLIZuVI%0qGx;99IAaH0GGp;~?_z}v9^FR8_3&DHsJNANUn`nM<3e1Hx;PqvEK!0ii zBbMRS{52e`+t9bvOowGwSPi*zdAOQ7`%cF%(54_e>swGGxYiYbo7BQi`x&tv5B2q+ z<(`7QDALY$Zg1}A7WEr5FtR}u`rR@G5+$MaiMLqI&K8Nk(|)Wg59z`a>Df#gbMM~V z!T{WsU4Q#vG*z`w9&Iv7*MB~S?WKTE6DQ||glRbdGeHIHvng<_R&+ex{J@*j#nd&D zYkRO_M6D@1Cv?8WL4*27kC+HJt~(HI4j$Q;mdPcO+*?1cBMZoPu9}HpB4t`Uv$FfY zFjU=OmtmTX|G&nr`901j+P|@F+qTi5L8CTSlQa!Cb{ceJTaD46v27=fZ8x@^-2LAB z58NO2*=P5eot<-L4n7C(7{YQFvI+KALP}HE>%DxI#B$tw3|mfS)RFA<-4%hnT`9 zfhtI8K(x%5Ef(`4zH3W $ON<+<>o3FkobM8u^1}@eau*~ZmBT$_)BvdJp2}M* z1K&oj(#kPxf38>;d@B&kp{DSu-T2?r;q2*y-$sB1Eib_xtbUXV5j7@W0)c}#qo>PL zTqJxq(KJ7Oin*(Z7_7czw*Ro|(1*fulwo) ;)#Ht)!;E&o8DhIAuU_I7{HR$i+?`VcoAO@bku z35y6|zimhl3U2veC71NMqLk?3{JhT5%%lzJlH>rS?CWEjjOj0#6(kWUA!Dk7P6Y!{ zB7%=8_$RD61WIUXUfWANg;Oap8xo2^bIpigp{aofLPLl!6~9+}HMZdiLEOz4ht%|v zMu$#Oq3xo<_93-evG%CBmYF(M4k%%yGl9$;EHTDp+Fn$o-F_DFVeYI1{jNs9NgU~& z)gm^n-yL|kyXv6zDQAjj$-Ad5M=ZH)5FfCd*|6Gi(Yham>kIp9x{o00CNVcPpgMNS zygbvw3js94_>)Ci3+{m#ys+vL;wL+$2Jcl|?X63=)mIBl@3;s~qebs(3GTb?14V{z z6L0_NtNa4LC?)>Wgu>&s>R-?|RnTn^x1hBC55tJ`mRCZ3>|oR(K#1wb7#F{mR?GHu zAR|ZH=hw($Q&5SKiaS1zfK@7(3?}@nIki4N3MUaNA~1D_if{r&oO+iijB!>>erEc^ z!AH*dgM3RJD 6}duEIc=&JBCQip%--^Ed?i#Mo(7L_8%I;MNx24bgc;Ln{jd|KNyyi zx4@Vlh`>L66D4U(=$M(0YmIZGK6FPdGGiddwMt!0M-7ro*ZcJd1^XSBM3NaX+>Yl0 zf5Zz)=+8%}3R^rsho3+_-*)qhsbx*$XCp0o=x+rYStBJj>zavzMAFphA^+ef4=pj- zy*79wnM7G(+rGrJv)&{j3srNo{JKL>8ZEoa$h#it4B@arWasD >t_2j|()-=bQH&~!rn&E?juc&fS!hp~r? zz)dYPwSD}*{S%-sEBa+67Z1jrwrq=fGZj`H*7J&53W=;WmOKi``&6GO1NeAB0-utv z)T4A$M+P2THSK>=VV)p^6#@7)E@lgdKZ0|FKds##(@4%#yd*%fQo~-I!q>0yIJXh3 z^h^)QMoNz-$qa?0y!?7sM6wRT4Q1l1ZpT6Hg?cZ+G)DJVbCI4gfVZG)vD%eGXd>E@7wQpIUX>W?Wc$s?_ za?R$L_B_5+zwcK;WHWr)QSby}+ke=YJiRo9&!@R5ug`DO9jOI5KJFwq`^3!~O9HLX zU9rajPHh2-l!Hc09b%^ge-d d)sQU~Q(c;&7ZNcQ<8YDZ$!r`o}ED{lFm8^7O>zg|bvs7<%w zM^D>g+bl`mi?E3EWegAcC-cKU$Mq0)Dj0R>x>@`k9g65sWN?$Rw9@PlCy^uvLa7gm z8%HVy_;q_h;d-@uYZ6 *b;r}>t;+N`W8?bNyuqoyWO8BV#V zxd!ObKi)U}5!a*etp_a$tvJd}HK#q@r6@gvmVc=e>TLnctQ@PSr_AuAzm!vTH&del zZ@%{(lCZyUVP*X71;+MJu}!&qh&vvOaNF#!mt0x0|NanR6<>7mQL%;s{@JpnQSkBS zi<&6P&;SQ4QCtd3SVau%VG{e~s;;u1{`ncg-7C1IYU2LL$t_{4Ego?2*doJu<=?W} zq9Kxde~eJadAm*LaVH{Xb1Z$oZn14Y-Sj;w4?ihE8Cyd~n&|x5lk0cl^^Jcq3E}<6 z7DU#R`?o1nM5hb|4f6*6pklKzxZ_ubrDN8J{kN!xN0f-8a5Nlqd&2#x_m2i2o5X49 z|Fk^lto^%mHZ1`pQ}VeGp{qeOnztS6?duCeIq^X175gwJ)qlT!e$TuMro?^@=@e`I z@N>y!tUd30oQ8P-->h9y(5IsGZT9RbBMDd6tA!o&eivPet6c`OkqRahg7ArXwvtlo z>+~4ydaXJORx; g>qj>dAQ0%?Y`**J!6qBzq%YBMX<#Y zh?lB3lh+5a8S-BUUl_qPVo4paseZq2d2$<8rQd}QDow+9I}chx7B40@@~rS&t{LRn zI2=|<^v _` zz8Gem#DR&3*NU5nr%M8Kt%>Mt+|Q)g1^giDfExmgxlyrulijlEoqB=DY%(8FFU|PD zdR!x4J>LXptW*+OS|vk1`Z )h_b)t{LhD#5gjwu0B zxD6t{BDUutog(goeiHlk26r>VtvIzb#2xo1H*EcbN7F9DY4oaWC=Ay1J(i7% +J8dlzDdV^p}A}MF6JFM zKp2 3MY(cvW)!REC7It#ZUcWP1E*85^5EgyM?dwo}?HLGbmN=@9nf@0jRd zXU5`ZVO1k5#fTBa_wiM06c(Y+0?(@*EZ2&vvoW?Myzr`e@eURB<7I3Q`PPmy{)N=+ zG)mc=LU|pHp7_D|DCL#bpWHjiOHfMEI)8l2+C=Ep?`D|W;UKTj^}e3q*+7m!vx~{Z zbQ5~-Eh(6H8~&A8UV3`g+-GBGwp@1LjI%e8sSL@o4V*skGi$CKEmL0yvsk2mi?-)z zK5kh_xL0i!>OMBx*MMHSZ>@E=rU@Y4VF<>@JE{Dd=4R^RC!B9#L{Lai!t`EZqNNsk zbW|`CHIwq{F)fERygXpP(dq3xAKs_#leA%k`MHVqYbQM$USKp@9cM;G{&;xtpY}y; zE&W;U#{pL>1pHTr>F!XjZal48!#`{`%AF67b3yn4Vj4AyX`hNnit@)p$1%{)eTH3} zS}F=P?c;7-3%?6Cj6{acC2|;wJO;#a?&eHv+LT)@c)z{$d(pFnNpM>&{c-{(4>XeR z@Y8p rf!DgMP#F{4q+qg(S47P4h3K>zN7Ow6ki?=@L^BJf ztnDUGgDgv7AJax&L(NvBq@h{FjL4F4NcL*7LRLVHdIQVSL{QB6W;ag=B7ykh2I)_4 zbt_^dJVL!B3ecYSDMpq0ucNc=>*GVW95;rSE$2~Dn23e&dblbR`34l4R(AEN6Fxf4 ziZy@P!gR4*{gT6W^kJczJev4ttP}qQGD% >HhfxWZF8B`TyKa?VF`B0Zpr7Brj7>48FX@vlRNx3c1o>vniity^ht;(Wl* z_Nu-` 8KKJ^Fk%GNn%j@z?X$UrP@^Jm=0AMuio-z*MCM~X-+R-eAl zgRm}%XF4`~y;}P%7nuFM)(t{=oD|aV9}Pj}o uHc#S1nZ-p3C_C2G<1{n0 zMSd=+^0*JGAlfdy@4x6Pv+=K$SQK{ro)0%LiTtu>L+DO#=Y0_S$bL#)4n>MA{abwj zj5-F#L6d4P@n@9rA^*qYHihyJ7A}#zt*&=STi&C!*Y=T-s?R5$MAm;9;EOr^-BR{U zyKs~`(wsozz9zk{T+S?`<_#$(=$8I9OBs>^{_&N>Hx-B*w> *y=3p#K!kQ0oTz z4bvGw$Z#Q35S0A&sl~(~XP44{wNAjI5>Ik)-aT-dYUYKAEq@}WSSg!A-SfZQNV2${ zvGb%pRyO*vzlUlcUwHJ_Izk_&g7dp>Qz3~kF8mg9??T Nb?Sn6S+t6lt0|BlJi?niz=3Jmx2XSC(L-@mYU59^cYaus5ZY zKrf!1v?Gm7o=9Hbq2T%*guL^JX4K&C(7P|mbyR*7lQq_ ymo#_If} z{H@{4X@<^JF=x7n@`)|RdwyH={GWUz*rWcpz#xx#fZ^lR`NS@xhQH@-Wl;w~67jSp z*CNdU=W=d3Pn~=^nWn8>{UJ2paSCEx&uv?64<)xY;cK5=Twjdu&pWRgnf|$G1#K=I zshb)Zyr?9y=MV=$pAWg1|3-IB(U)w$Nb)NcaSNw13%4@Y in4Zi#}vPlpgQr@vD$N%diFy{z03G ZD%28WK?oaOg3B7^Jr^|#j}y(xI>?La#DfO z?8Jq83vB*tK@`K0VI`6s6{GCFIEsa_Wlz$WEt(Bh+>)`j?~Toyo>}Z<$IHGtI; eXvYZoeIgm^AEhI=_3Rb1ugP-S4zT%{Ia2`~^FtOrFHJ1k 1gQ%&RMXg+3?@`m7foeu-m3g?rSE7ty=r0fY5{FRrBJ@AX(UQN(t| zSjy90b_#=$_>5q2dq2K{%s15`RE{>swWi7dDLk<=$_<>vp6Np39Y^e >&uqzQ=$ 3VHuKv*E&qj1XzGJy)Y{K*x{Y^v?gG&Qgv# znR(oLCEZ(>y9Nkq1&Q-0vCZ>%`QF{elw76%hPZ!Ed>&NlLY=K% iedhFdB z?a-EkcZ{%%RWS#j5&+(_Hf{P?RN<_N59mkdL}| qd*`LG3#ZEjPm=QjoRbOdPe&f z_eQT(lM(cPEa22v#b3Q!4~aRLLCQp|#3YJ()Z5%Wx1X7or|+|cuI(XKYl102_S2_& zrafyD$TMIZb7djl9YdD!`Oo;ROXpzop}SK1>?&~*H%iy!ib7g1QBYqb3R?sz$#RJr z($zyVSHG<*e(sahr{Iq1L>a`mnf*bZ`hRjnuW6+pm{1jD<-|wFWE=IPZ;lpsy9Mwo zU=P~f5W66p7zxWP;DIte^Vv~-7Pf;XU274q9F&b~w|ip2++rcRGEn>5{?Sno>SHdx zO?|&D6QBYEUSmfY(=@jQMRD~_8Y6M>>q)Jo+fscnQ8dj?M5aoVJmB-Lgot;`YOr!E zz5zDkmv)tm-Yrz*mVdDjFN(w*=-THnFi^Xbef3tGS6BNZoA8I0zf~4pF&*z(Hk-PT zaid1OalvHqD;_)$DkCaORdA;Opoi=@=grjpa4uzo1`1bs3n@MIG(2Ub)Y92Mn?mLo zwo3_e|M@uf6wBzk@lgR$Y*)F;E=1E%K}ixSJE40EmK=gBo3@KjG6BpKtO`|#ks#t> zuanKirvpC%nN5surRV6H95=#Wq?8m)Whx8RJPJ7ZIfm<{3oY94!I1S6Gq@$L&d$(} zwZJOZmK#o|t(+)UQs)cSdMZ?Cqi42#fgCdI10-Z-FOn?CaCDi#RhK2qrM1_@V;Yb^ zJO6tpL}D7|e|)+~svYBUD?RZv6Ao2M;;%d<`?|yl?CI=xFYFtE!L0V#TMmL9awNs` zjdNTQ)&D_B9)2C^W&JX$LVW$u<~e+8u4Sn*dauxOL*zKR5&)c}YSEd&Ntag*vblM= z%SiZYKXX{$0|1z^ ~QM<0A2$iHmQ;7mu9w%%F(~5@P)U28{ zVz$qDQ~Q= wg0>K?&(45~P}9 zPN*IxMgzJ{n0@+-2awK8(kckCajmCJ1p+^S8rOZwCiKH^#)7xx74jbp=$l$8CY%H_ zpz=P=5}LJ^HR#iFJvZd<47%fP+*WRQlMuz_6xR}-cBAbEJD!$nt!-17w@n$622M z-bakK{5BF{%JjYe@_Hkp&W(h*oV_nZI^G5GY^?Qqa1BlVMh-0>B*w-=aDcaSy;WrM z7(RAVNqgM^0ucqh`LU?#ZDIb8l_yh*dxkY%4o0tw`k++I!{9gZi7khxnCfn9+ 9_T4Zh1SkzV{p@?}rztY1CyU;u zV5R;E#JDqx|C LkEoTvU;aMN2lxSPLP-mbrX72VIl6%v>Q(l&3~b z4Urod%0ZY^HG@J`GqKtDrGEu+fJXpfJIYH3!HkYv BXmH$v`a#Ro z*br2j?tL83O9x0Yv8`2a=`2Z3lf^;~VbJ#t3!I=qMEUFxOCeH~cSPjRX-Z@BYLHmh z3_+h~hPUf~7{SD``zetmuL6*nrwjVYJL%%HEeo1CMzJS=6&@jQbQH{3uO_5}0|fPP z&5ULl48(t{^6}~Su$JGcMGRNi+E;&6;MYY1T4=|7eG060C1*|-s!Bv6&J~($3bt>7 zHhq sU{rheW{p+GI1KT2f|JBj!U6J|FtX~itZ zo8#Vbx8hT6NrWxTofXd}I}-51xBvaQP=LUP9lX95@gPX5GJ%LZq?M2l1uk(OBih;P z`^V _quZ8#cv-xL2C5qeGJ$EyAJRa3ea4QdYWsG%>W>EI9yH= z?Q<~V;v wRU((5 zxK^PB_TmF_@FKhj8@dJW2gJCg@zXwL-NUSQA+LgNl^Kpt(?-L?r3{IvX;i_zL~BD7 z9W_jq>l93nbA*qRXR@F_tVZV(yh0gq;l=$WUzqS1+{Im941X3JCd`$r#}lgFX=>4s zOU6sg>^gj;e)e^~ {hQOyj1*Q<5=^V-*^@^9v>lxSck|Wp-K~O;D#&hwM9erg0Mx&G9 z8KEro$%~vy1=XZK0LA~K#d#yE|1wY6Hx>+!pofocfoPlz=lLA%746>W!Gl^Bf4g#V z6bp$RETtysOT$?q0M0pPTMp1j1y$hi%9|Wk0Fp4*kO+f3e~St7G-Jn!OY08`MsSv0 z&mdA2V@m!4NW}%jUYT(~;dBRUz7E8y69QFq`-^5D65T%^bzYjGTZB?#wZ80qy8ox; zfu)7gRoM_lW!CGk-z|nR^C#1e7WYVU1OoNN`>YYxSDW7~s|Ea^7J)xoawG$>T7-~j zKt;bo;?TXLG^0hJDSqP39GlP}`~4OX8SrY1^e>ERiO$h%CHT{FZ3_Tk$^Umpz^Y;h zRU!r?1i}3A!$5;LbA%;egq|$9#`O;mz6&)s9!{U>!>9kK^hTz#r7Sts=if6t-ATy3 zsFffw{>6w2c$lewZ4aL=$F)SPV T8`9Izk&gm9fLl5Koo gY7AZKKV zZ}xfd3^-_l98jWh#1!24)7O+UvCjnHz8T;ICU*BcP%g8_L6Us2-GTUf*><$2piiID zcPGo^;NJ`gj Y z5~Ho&fjGAbE-@Hhk8~UpjENKHAXt5KKw#&Uh7QMjam}g 0pm z+JGZwxKKlGm2{w%Cy0N3`TLqIIkMxo58wie+vkDJJqN)dMqkNQ>i6KdhtL8Y`neQi zDK|5|6o$ZWB8^bIpx9VHAiSykVu}3Pbe`0YrC8u24(kMC?-;2=izp~3`@Fy6tb&dp zfbtuROEc(_8GbYiW*RZMhvwLVu|#< zT6AWaHP3XU$2$~NlY!MEk0!vJ{%H22MAJ;7T3|olNPz2(N&x!72yljp6VxVz`F?GV zn1n;{eVE%E30eVa7d 6u@ECTfpmfG=alh4raO7;lu zh (rOFfAMs>~zp4zd36W*`hYd$<~J`FW2_LwPl zd=2gi0ht*Gu^+p@h(zNu2ukO}5yl(*rU<|R_rK#)vrkiTR+*U?J|x#7$_qbC|Jaa1 zf}=_aQ$nFFP3+w9+wnEJI<@eJf*pP9!3(BXdRQLQgHzIlrdq<3N4EF8!9b?Q$?^B! z(=XV(hM0jv%c~7NXk$1qxD2#~Od~1!a-|f7OD>FF!wc0VBh@_in; @jwY`otj_J;vXdzv+!?pAEuI{JozqS zDo1lib%4QcdRsWy3eI54bOGr jfJ00H`U|GNH8Z7;guQ_X4P#-r0f}LWLyn2@9*DH)V7tY!XUah6Nt|$E$%-Ud zSv1t-BNKi;uUYOkWRfDB7_mkv+fc3nW?F1jTn&bmT$&tV=Gaj1^9?0rH|kRT58&W# zW>s$7;^qnanwBAMMLASb)Qo*o4`J?qTqwXSn@^RMZK50@4$TY3)P-TT3{~R8{Ep^F zhzf8g%>`omeZlmz?RG~a;>3YgWJ-dg)&am$)*-CF{!pe<;^5%H;?NG$qWFg~TGf8B zw_d**veKtqPw$0bM^f~V|JU0?aNIv5Cps`HARB$H!Kr;x0E|M#Th(E~Z+Zb*P`_X| zm5lqLy4uv&P;#Jb206zWsZd9=O^Qb@>qcHjfVVTJH{4&f8n=`~HPBtX0hk=XD#GTw zN7I`KpbQM4erbU*V+LCT+5jocg(HT^PjK`G=lW?Dywc&uK27r(?DcHYnIHy?I{DA* z532&dojqM7p!bMCRfH<(DC$-IcchCoFM|NC@L3exv!hB=U^dDo2sQe=cMK>2Y%U$! z6gdm-8C=# 966w3p*I%}j>OfV)eZxA1z{wSx r z*7NKVIAgerYu`R1Xk%)fh2fcwvf8e7Qw56cNLWrX$w&f|9VjK3N$q`MXq~U$q18N_ zByg0@g1+|20<+K$6jg>p@4IgARscQ5;Q{Gk%<)HfhArcB!Fk6wIIw$rY^ek(oO(RW z2N+{$oi}SQBo^o)r$Bc)=q^;?vzX}dXbNuChO>qPjZU}0zS}EYRbf>EQ?x^=VMQjw zMahcu2je@m1;hM#f4;Edomha>DbVo1Y3)`ARV!54xID%SDg*YI$KFX)fBQ~JWKnL% z<=c%q#^qmQiodXfkN1ZElpvSXfY<0=5F{DScZfN6@1Vi%q?eyV4A!55+6Y+fGp%^R zeAk&TAqdTD*Gow*a=-Y1EVvP#sFBwgfYecF0sxIQ4{V@res1)r2eJ@Gv@M#TtM1?3 zQyeM-n3x#^gnHItH!%Qqz!Ij`?>2BbZr)iekjnV+R=di{b(HFPqDy?)+vSBGw~X(F zTKMN=jDJ#h2$X>n(lfpeTop{2?7sK<>q;n06$vZFXtaZoUs5*K#KcrH-PS);9e80+ z!jljO>s9%|=GHZn4w{a~=<7M-)OVOFJwfO$GT=_+Ob*I}s4Qm{(5fAWRmUHn{{RD? zfD(n;)HbGg)&V8}9pH|p2x@T`G5au7gh-Md?96`ob-(G}KDtWfS(aCa;t^J-JQr@o zc_w=UO&;|ERlRF&$|WzY1d;^T+;1H}ckwaX2GhmxXb~84j7rfbhSEdD*k96V`j7 z@8NKqE0>)!<}~0Xt1MR}36v9 wUVe9QvV~(Qtkt1Fr7)8B%3I~ihgI&G>MO}JGQ-Cju)>0(Y$Y6@- z&~xF=GFH`<5K&p4!@#rLVCy)H8q6k1iiK$xbLUV0Bq3nPO| 6*@v K)Il)7fFwPgG6`V{I5-k&Mw(Y!^mo1lYj#eS_nerD{t8oPBk z<@T`F6^a>-=1eEuuVAama?mo4FsRVX0Y#j$yHp%xoXG9Z&xja@|MlU$L37b!{mPRO znFY+`HQOzi2bc|UrGT!XNZq_tFtj*VcSNG1O%}|nr0$WyVn7FM>176@F<(TH58J+9 zJvzEa69JNzd CjEZvknzCaO81pp)=nD8z_hzX_L|H| l%A1A35X1#lR($yO zVGIUDo$Z`47+^MkzSffg%Mz)AxQOu-K2i_ieDN79NcfX+(4KgelmO9*^ySUxiJ*P| zYM_jB0mg%(3uIg#@b1)iNc!1 z+3K!1O3vJAORdO(l122+Ins>^t`5&D2m8Vs+~$WW40rNHxpR%_<8D1#i*7wti|(t- zZ1yWvr=hwfHa6A2KJ1GjU-kqipr0MYm|D4km?lH#2G&foeV&viQ7(+EYcqPVk1_nq zeU}X?pYd9{P8Iv_YtNixdp-n1Ie@17L~PutW|69>XsXcXpv2}Q>A3HUOXG2NZY{hU zg}b)joJ{&!)`&x3Yp=8(tdfw8dtmd3<0}?t0nQ=5I9gUzHG~RR%*^y4XdUI#lG(3P zgK`Jqwa4+hg6?|(Ue_Y{nHw`pZAPc~?1PRz86kBBOmY^ju?d}EyaUX^$B~0&<&)^S zgVpZ{I*mPu{CS$;=x_vRcj9L>-%LpzZ5%Q-js%S$x$nof#%2Q%xOpY_D;O6D+!>LP zTRjWb*3Kh!e4p%X_vWPA6<=0|GS6|lBK_69fVYphnY~s~=`@shD)?To(^h#tPt$AV zVMea=L2Tbi8Oj`2 @G9qLJ=kdWw%B^Dfcvt>{?3VdFbzxyBMo#XCzIV6ze= zGMr9eK4l!Pw3{FRZxaO&{~&j~sTzIb3#a9fIZ*a92c!&CZS}ZSnQy%sf2_Li7Pmn< zsC(TiGDf~M2|*nfLX+!G+o^C&_G3!9HRd}hjdpj*q s#A4_!6 z>xrSxTTIA?RCBFfl1toDivvT_+HimiAp(<*JGL>rHPOlILckJwv|oD>=xa!T&xLju z{q-wh8LH0I61aU9>phBnL2;^c%HP(Q!b0^EOBP%$S91tfH#69&s$wywOHXW^N_GDw z4zud4#A{s~Hko6}ZXqV;`eYfg%G(+~U8e!L47DR*Jn1ZSC&ZX9_IRsKtI{b$gn>HD zICXEGuZf~;X%$^-GX>1&lkJ353xCqficrht4aJ{v&{D11Ml-5erFZpp@OHnu(9Y{y zIgJX=;@}gb&ep~uz8$ +#{_*<&pp;+)o+%SNl#y-F1_#1 z-PRlHm|ek|5#3kih-ERS!gIdNI&T*4o-Hin?#&Cm?K*Oz=go%i?o}IkcqaivQ0X(9 zSqmfGdj@rWyIYD?^IJIVCQe<6oz4lzm~v@Zg yRotation -> zRotation, (intrinsic) with respect to "**Nadir-frame**" (A GMAT defined term). - :vartype NADIR_POINTING: str + At zero rotation, the instrument is aligned to the satellite body-frame which in turn is aligned to the Nadir-frame nominally. + Thus the instrument orientation with respect to the satellite body-frame is the same as it’s orientation with respect to the + Nadir-frame in the scenario that the satellite body-frame is aligned to the Nadir-frame. It is also assumed that the instrument + imaging axis is along the instrument z-axis. - :cvar SC_BODY_FIXED: Spacecraft Body Fixed reference frame. The axis of this coordinate system are aligned with the axis of the Spacecraft Bus. - :vartype SC_BODY_FIXED: str + **Nadir-frame:** + * :math:`\\bf X_{nadir}` axis: :math:`-({\\bf Z_{nadir}} \\times {\\bf V})`, where :math:`\\bf V` is the Velocity vector of satellite in EarthFixed frame) + * :math:`\\bf Y_{nadir}` axis: :math:`({\\bf Z_{nadir}} \\times {\\bf X_{nadir}})` + * :math:`\\bf Z_{nadir}` axis: Aligned to Nadir vector (position vector of satellite in EarthFixed frame) - """ - EARTH_CENTERED_INERTIAL = "EARTH_CENTERED_INERTIAL" - EARTH_FIXED = "EARTH_FIXED" - NADIR_POINTING = "NADIR_POINTING" - SC_BODY_FIXED = "SC_BODY_FIXED" - -class Orientation(Entity): - """ Class to store and handle orientation. Orientation is parameterized as intrinsic rotations specified by Euler angles and sequence - with respect to the user-specified reference frame. The definition of the Euler angle rotation is identical to the - one used in the orbitpy->propcov->extern->gmatutil->util->AttitudeUtil, AttitudeConversionUtility C++ classes. - - A Euler sequence = 123 implies the following rotation: R = R3.R2.R1, where Ri is the rotation matrix about the ith axis. - A positive angle corresponds to an anti-clockwise rotation about the respective axis. - Each rotation matrix rotates the coordinate system (not the vector). - See: - - * https://mathworld.wolfram.com/RotationMatrix.html + It is also assumed that the instrument imaging axis is along the instrument z-axis. - :ivar ref_frame: Reference frame. Default in "NADIR_POINTING". - :vartype ref_frame: str - - :ivar euler_angle1: (deg) Rotation angle corresponding to the first rotation. Default is 0. + :ivar euler_angle1: (deg) Rotation about X-axis :vartype euler_angle1: float - :ivar euler_angle2: (deg) Rotation angle corresponding to the second rotation. Default is 0. + :ivar euler_angle2: (deg) Rotation about Y-axis :vartype euler_angle2: float - :ivar euler_angle3: (deg) Rotation angle corresponding to the third rotation. Default is 0. + :ivar euler_angle3: (deg) Rotation about Z-axis :vartype euler_angle3: float - :ivar euler_seq1: Axis-number corresponding to the first rotation. Default is 1. + :ivar euler_seq1: Axis number to be rotated the first time. :vartype euler_angle1: int - :ivar euler_seq2: Axis-number corresponding to the second rotation. Default is 2. + :ivar euler_seq2: Axis number to be rotated the second time. :vartype euler_angle2: int - :ivar euler_seq3: Axis-number corresponding to the third rotation. Default is 3. + :ivar euler_seq3: Axis number to be rotated the third time. :vartype euler_angle3: int - :ivar _id: Unique identifier. - :vartype _id: str + .. todo:: Add support to rotations specified by other Euler sequences (currently only 1,2,3 is supported.). - """ - def __init__(self, ref_frame="NADIR_POINTING", euler_angle1=0, euler_angle2=0, euler_angle3=0, euler_seq1=int(1), euler_seq2=int(2), euler_seq3=int(3), _id=None): - - self.ref_frame = ReferenceFrame.get(ref_frame) + """ + def __init__(self, euler_angle1, euler_angle2, euler_angle3, euler_seq1 = int(1), euler_seq2 = int(2), euler_seq3 = int(3), _id = None): self.euler_angle1 = float(euler_angle1)%360 self.euler_angle2 = float(euler_angle2)%360 self.euler_angle3 = float(euler_angle3)%360 @@ -290,127 +245,69 @@ def __init__(self, ref_frame="NADIR_POINTING", euler_angle1=0, euler_angle2=0, e self.euler_seq3 = euler_seq3 super(Orientation, self).__init__(_id, "Orientation") - class Convention(EnumEntity): - """ Enumeration of recognized orientation conventions. The rotations below can be specified with respect to - any of the reference frames given in :class:`instrupy.util.ReferenceFrame`. - - :cvar XYZ: Rotations about the X, Y and Z axis in the order 123. - :vartype XYZ: str - - :cvar REF_FRAME_ALIGNED: Aligned with respective to the underlying reference frame. Identity rotation matrix. - :vartype REF_FRAME_ALIGNED: str - - :cvar SIDE_LOOK: Rotation about the Y axis only. - :vartype SIDE_LOOK: str - - :cvar EULER: Rotation according to the specified Euler angles and sequence. - :vartype EULER: str - - """ - XYZ = "XYZ" - REF_FRAME_ALIGNED = "REF_FRAME_ALIGNED" - SIDE_LOOK = "SIDE_LOOK" - EULER = "EULER" - @classmethod - def from_sideLookAngle(cls, ref_frame="NADIR_POINTING", side_look_angle=0, _id=None): - """ Return :class:`Orientation` object constructed from the side-look angle. + def from_sideLookAngle(cls, side_look_angle_deg, _id = None): + ''' Translate side-look-angle user input parameter to internal instrument orientation specs. - :param ref_frame: Reference frame. Default in "NADIR_POINTING". - :paramtype ref_frame: str - - :param side_look_angle: (deg) Side look angle. A positive angle corresponds to anti-clockwise rotation applied around the y-axis. Default is 0. - :paramtype side_look_angle: float + :param side_look_angle_deg: Side look angle, also commonly called as nadir/ off-nadir angle in degrees. A positive angle corresponds to anti-clockwise rotation applied around the instrument y-axis. + :paramtype side_look_angle_deg: float - :param _id: Unique identifier. + :param _id: Unique identifier :paramtype _id: str - :return: Corresponding `Orientation` object. + :return: Corresponding `Orientation` object :rtype: :class:`instrupy.util.Orientation` - """ - return Orientation(0.0, side_look_angle, 0.0, 1,2,3,_id) + ''' + return Orientation(0.0, side_look_angle_deg, 0.0, 1,2,3,_id) @classmethod - def from_XYZ_rotations(cls, ref_frame="NADIR_POINTING", x_rot=0, y_rot=0, z_rot=0, _id = None): - """ Return :class:`Orientation` object by the user-specified XYZ rotation angles with - the sequence=123. - - :param ref_frame: Reference frame. Default in "NADIR_POINTING". - :paramtype ref_frame: str + def from_XYZ_rotations(cls, xRotation, yRotation, zRotation, _id = None): + ''' Translate XYZ user input parameter to internal instrument orientation specs. + Orientation is specified via three rotation angles, xRotation -> yRotation -> zRotation.. - :ivar x_rot: (deg) Rotation about X-axis. Default is 0. - :vartype x_rot: float - - :ivar y_rot: (deg) Rotation about Y-axis. Default is 0. - :vartype y_rot: float + .. note:: This orientation specification convention input to this function is same as the GMAT-OC orientation convention specification. + + :ivar x_rot_deg: (deg) Rotation about X-axis + :vartype x_rot_deg: float - :ivar z_rot: (deg) Rotation about Z-axis. Default is 0. - :vartype z_rot: float` + :ivar y_rot_deg: (deg) Rotation about Y-axis + :vartype y_rot_deg: float - :param _id: Unique identifier. - :paramtype _id: str + :ivar z_rot_deg: (deg) Rotation about Z-axis + :vartype z_rot_deg: float` - """ - return Orientation(x_rot, y_rot, z_rot, 1,2,3,_id) + ''' + return Orientation(xRotation, yRotation, zRotation, 1,2,3,_id) @staticmethod def from_dict(d): - """Parses orientation specifications from a dictionary. + """Parses orientation specifications from a normalized JSON dictionary. - :return: Parsed python object. + :return: Parsed python object :rtype: :class:`instrupy.util.Orientation` """ - orien_conv = Orientation.Convention.get(d.get("convention", None)) - ref_frame = ReferenceFrame.get(d.get("referenceFrame", None)) - if(orien_conv == "XYZ"): - return Orientation.from_XYZ_rotations(ref_frame=ref_frame, x_rot=d.get("xRotation", None), y_rot=d.get("yRotation", None), z_rot=d.get("zRotation", None), _id = d.get("@id", None)) - elif(orien_conv == "SIDE_LOOK"): - return Orientation.from_sideLookAngle(ref_frame=ref_frame, side_look_angle=d.get("sideLookAngle", None), _id=d.get("@id", None)) - elif(orien_conv == "REF_FRAME_ALIGNED"): - return Orientation.from_sideLookAngle(ref_frame=ref_frame, side_look_angle=0, _id=d.get("@id", None)) - elif(orien_conv == "EULER"): - return Orientation(ref_frame=ref_frame, euler_angle1=d.get("eulerAngle1", None), euler_angle2=d.get("eulerAngle2", None), - euler_angle3=d.get("eulerAngle3", None), euler_seq1=d.get("eulerSeq1", None), euler_seq2=d.get("eulerSeq2", None), - euler_seq3=d.get("eulerSeq3", None), _id=d.get("@id", None)) + _orien = OrientationConvention.get(d.get("convention", None)) + if(_orien == "XYZ"): + return Orientation.from_XYZ_rotations(xRotation = d.get("xRotation", None), yRotation = d.get("yRotation", None), zRotation = d.get("zRotation", None), _id = d.get("@id", None)) + elif(_orien == "SIDE_LOOK"): + return Orientation.from_sideLookAngle(d.get("sideLookAngle", None), d.get("@id", None)) + elif(_orien == "NADIR"): + return Orientation.from_sideLookAngle(0, d.get("@id", None)) else: raise Exception("Invalid or no Orientation convention specification") - def to_list(self): - """ Return data members of the instance as list, - - :return: Orientation object data attributes as list. - :rtype: list - """ - return [self.ref_frame, self.euler_seq1, self.euler_seq2, self.euler_seq3, self.euler_angle1, self.euler_angle2, self.euler_angle3] + def get_orien_as_list(self): + return [self.euler_seq1, self.euler_seq2, self.euler_seq3, self.euler_angle1, self.euler_angle2, self.euler_angle3] def to_dict(self): - """ Return data members of the instance as python dictionary. + """ Return data members of the object as python dictionary. - :return: Orientation object data attributes as python dictionary. + :return: Orientation object as python dictionary :rtype: dict """ - orien_dict = { - "referenceFrame": self.ref_frame, - "convention": "Euler", - "eulerAngle1": self.euler_angle1, - "eulerAngle2": self.euler_angle2, - "eulerAngle3": self.euler_angle3, - "eulerSeq1": self.euler_seq1, - "eulerSeq2": self.euler_seq2, - "eulerSeq3": self.euler_seq3 - } + orien_dict = {"convention": "XYZ", "xRotation": self.euler_angle1, "yRotation": self.euler_angle2, "zRotation": self.euler_angle3} return orien_dict - - def __repr__(self): - if isinstance(self._id, str): - return "Orientation(ref_frame='{}',euler_angle1={},euler_angle2={},euler_angle3={}, \ - euler_seq1={},euler_seq2={},euler_seq3={},_id='{}')".format(self.ref_frame, self.euler_angle1, self.euler_angle2, self.euler_angle3, - self.euler_seq1, self.euler_seq2, self.euler_seq3, self._id) - else: - return "Orientation(ref_frame='{}',euler_angle1={},euler_angle2={},euler_angle3={}, \ - euler_seq1={},euler_seq2={},euler_seq3={},_id={})".format(self.ref_frame, self.euler_angle1, self.euler_angle2, self.euler_angle3, - self.euler_seq1, self.euler_seq2, self.euler_seq3, self._id) class SensorGeometry(EnumEntity): """Enumeration of recognized instrument sensor geometries."""