From e874e0eb7108c3209cb4e97001385ae23274cb20 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Sun, 23 Jun 2013 15:47:43 +0200 Subject: [PATCH] Added RSS feed feature UI. --- core/libs/universal-image-loader-1.8.4.jar | Bin 0 -> 122698 bytes core/res/layout/activity_rssfeeds.xml | 16 ++ core/res/layout/activity_rssitems.xml | 16 ++ core/res/layout/fragment_rssfeeds.xml | 28 +++ core/res/layout/fragment_rssitems.xml | 28 +++ core/res/layout/list_item_rssfeed.xml | 46 ++++ core/res/layout/list_item_rssitem.xml | 29 +++ core/res/menu/fragment_rssfeeds.xml | 7 + core/res/values/strings.xml | 3 + core/src/org/ifies/android/sax/Channel.java | 149 +++++++++++ .../src/org/ifies/android/sax/HttpHelper.java | 150 +++++++++++ core/src/org/ifies/android/sax/Item.java | 146 +++++++++++ core/src/org/ifies/android/sax/RssParser.java | 237 ++++++++++++++++++ .../core/gui/navigation/NavigationHelper.java | 28 +++ .../transdroid/core/gui/rss/RssfeedView.java | 63 +++++ .../core/gui/rss/RssfeedsActivity.java | 23 ++ .../core/gui/rss/RssfeedsAdapter.java | 71 ++++++ .../core/gui/rss/RssfeedsFragment.java | 43 ++++ .../core/gui/rss/RssitemStatusLayout.java | 63 +++++ .../transdroid/core/gui/rss/RssitemView.java | 37 +++ .../core/gui/rss/RssitemsAdapter.java | 83 ++++++ .../core/gui/rss/RssitemsFragment.java | 49 ++++ full/AndroidManifest.xml | 6 + .../daemon/Synology/SynologyAdapter.java | 3 +- 24 files changed, 1323 insertions(+), 1 deletion(-) create mode 100644 core/libs/universal-image-loader-1.8.4.jar create mode 100644 core/res/layout/activity_rssfeeds.xml create mode 100644 core/res/layout/activity_rssitems.xml create mode 100644 core/res/layout/fragment_rssfeeds.xml create mode 100644 core/res/layout/fragment_rssitems.xml create mode 100644 core/res/layout/list_item_rssfeed.xml create mode 100644 core/res/layout/list_item_rssitem.xml create mode 100644 core/res/menu/fragment_rssfeeds.xml create mode 100644 core/src/org/ifies/android/sax/Channel.java create mode 100644 core/src/org/ifies/android/sax/HttpHelper.java create mode 100644 core/src/org/ifies/android/sax/Item.java create mode 100644 core/src/org/ifies/android/sax/RssParser.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssfeedView.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssfeedsAdapter.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssfeedsFragment.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssitemStatusLayout.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssitemView.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssitemsAdapter.java create mode 100644 core/src/org/transdroid/core/gui/rss/RssitemsFragment.java diff --git a/core/libs/universal-image-loader-1.8.4.jar b/core/libs/universal-image-loader-1.8.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..78369c20855b6f4ce1e8312747db89294d24f7b9 GIT binary patch literal 122698 zcmb@u1C(T2wl17iY1>AnZQHhO+nJSFY1_7K+qP}1(tg=}&%Lkjx#RZVr{5oA?1&h# z*Pdf8eBZ>HD`X`Afgk|>_BtSr;Q#xVKiEYHKub`OPmWL3$K5G zf$rxk$D>em6S=mehsh&K$SXKzkXImKK_bL4$Rm3qj>+GC-4SPS5bxgYDG@p;NpQyx z5egY7F-jRhhZ{lCs*1OamNIq+xfwic*KF4W_)i@H0OtPG6`(I24Q#Cbs~7*X1@s>+ ztZf_|?e*vw{-NpopM(+oxv7)2nX{3-gPx_Cm7a-_rH!7Uk^MhB|7T@L|E1>*^bAam z{z1y0wV?V7QVh);4E~8I`oAj5%*xjCpU7kUtMaV%tjw%U{)t4IzaY`d$jZjv?Vkwy zE9(6r?Ej;~B>$RvHunE)LaG0CA$krDW)6=3?_Kli8JmAWHCuZd10x5Ae-QR(i2iFpcXBkd z{J&Db{)4+B0aa)L0RW~z004OZwGRHBF8&U5emw^x!7s!M{Ou=d1Iw=&u27VaLE?k^ zaCb@cF^Uf&*p5qTroj>t0upo^GVB2yJSss?b#inb9G^6Af0bx=T@V})*`4w89^ly) zdvkXdQq#{3G;C^ZZ96S1tulWZdxXsb2-hczfKQjsLw3eMnXH%PC>t=PnA~X(fiz1- zo7>Gr*(0V-Nv5SEn?4sk>P&SJ@Od8q{asVP(XH*sHP99bT}e?}o)}-nj}FYJPR`D^ z^57?qG+K9bUV6o?tS97dt(F*%I_!kJN|)bpsf@LjWVA#x@QdSD@FwHIi#6i}ZAyku z9Sd-Hi>?-UJ+hWgh2oe6c{~0RXQm?xpolw*(edfe_vzrvHe{a??=dT7WmVUKlsOT} zV`l*z55*E{5;gglZeFfmBxcPR0rgqq%(0oC#hIt{E^4(ZJg@lC_MAUfA`ON6!l3Q( z`fP*4H!Oe{IS+36H4#Od73DDkEH5-7@^5X`xI@LlMf7FyIxrLkM9g%IYy5KOFqZq{ z1ICgYr$e-rf79ZS=l{eMkJDScp$j183 z{w(9Vrph2=DB8W!bq&LBG*t$zcAwkQy=5z*^sos1CUjCgaIVsXNRD2jwSn54IC8l{ zQddpFi%{-pieKbe}Wt{d5#7acdj zPlN38aSo~98-B`MGRZ$bnu_Z_6OMDNV+2Ssc3G0{hI=)8ht1Vt7lDe{g%?-spRzJx z9|2XE+i}}&^*adyb_q$)eWLq4AM_TT>?h9{VR=MW@+Z-;$DB%a2)!&a2(&N1l!i$S z_P`EJ8W>&^tkFp?OYA$O|Bx9Nk-Y7U`t(9c(eD|e`^6V{uA3vkDi-f2X`7r%Y?Yts z$naQXN)o+Oi5WtbS|DjCwf}@jbb%QKys|)v>k#DAcXuW{CP=nI9Y-v9vk{wf;( z3yFL#diH<7(JHbd^gAD%f7!dnJray3pcJFsHTAk^d>9NA(5%?r4;;hnGS`2U8r}0ty%o3*)smy|?FuT(+RWXvZ z=m{djAe!2^BifvjifY(lR^N?=vi8Jdcn}GNW8kxnaqs0Z##n#Fw!Bd-Irq$;rQ|Fo zH^3SW`;z5*8LkC{dCoq{Q#4>#pApJye#f;!c=K>Yn_x`S0KUvKtrot{wqP067RMjo z{?p$A1Na;BsnGL0?S74r`j@jM_g6>h?*>-b%+g4}#>v`I(#*=t(a7+>hVBm%iyN~> zq(chyCYc+j^-uKY=$O8YMREcX0xRkE6)YhLv{qL-oy}k^nF-foV?e%^v{Xf|+5YBA z+FyehAxKU{ZiM1M{W0ZoZt%Qxh0F7eb4WQ@#1*Tz&ph}?`HSjp&7`acRl@idJ)_2r zh*u9`NnWSqz-IQ(@olGjS=#b``4B$>4&=k&tipJ+LH3;!I+oeNy8NW95%9hs))}?@ zJ0h016>CLOH~ew`BKkdp7;|nUVsTe{;@q5cqL}eXg{9gu$b=#KxE8br(*g@74=5kR z$9z52505CQ`*3e^3-sk*JBF8dOKTCkDT)RvZruzuH1V{YOUCR`gQnb5)m_;jP#>!M zLBAoTYUx}8nKQ=fI?#Isw2}qyw5o5WS}vB|aWS1ZdyKJ}7|}LquC>uNHN%`6J~q7P zEeLZn(QXJP+SDWVo3qu#Dqc8qVtyLCMx*sO*cqil`6+wwq54s|Gf7nIAm8b4&+%lF z7J4RFF0XvRG&+ZjvV@X1>p2+upgdds_L(R_V3Bjlhij^q#5$|kW-g&>p(DhFUm?VF zY|N_E$z`9~DBxjyigx_Rj;+EyiC~J%&JUW zhcKc{628n0^8N?d{cS-l@&y7(f4))tf`vDn4b~s+ zXEaU)&$ROY2zx70b|5~i(cOiiCuXl+_WiN06!?hbtV4y1rm7rlMz#iHU$aN*sa^bJta=VGaw+R&ziKd&#_J&G~0ms{6H#jTRZN-NeODGyL1() zlsMazFg7zfdZ4{I`K0Z|D77eMFdL_rnnS4V?TTMB3YT$L#~&juLzxhUNuaueNsW(< zzO{2n4x6v8(qpO`O=QQs_awA-E1}mNWW8)8a~Yi7ucfx{mXizbb75PAcV14()<|jH z<}8e2L|Th@mn#JDk{X;j{GD#rN$91BEGU!_dPDPX`S%_tb3HilPr2J}vXdp@v7EmvwieZd$ zOgr9|iu82`Yob^Mv&6wea{GKdroh@vte&YBOiP{6KmpB0w*k4SR(qD*4fX3mH#~#7 z%pCQ*ZB@Xz`AO_?_OyTo=88+ zZ&KChWyWeFeBhjsSPPR02!Qe83jMrdpaS>W2GOpWF= z0SMlAt7ya@ejYq<5Ank{wV2W`+R}$(iWakv#?1mhM1UP|*q z)#V@gG$T-9#*AiNw04T|7S2@N57`2`ANN@ZB!v2>QF(sr5=U}nH?(*uLkPu;))Xe8 z6r7csL?ojk`GGOCBT>JorNot5+Gl~;`s9AA>YcFfHDEQaF2&ZZNVs<#V1U)Dq_HckIsnjJ$a<(XLTnR<6H5RmK@qUXk{KcGl=P8P_S^- zF82EkqaE~BEG|( zMY?d}->V@qqF2GjQs$h_-54CY5i^_Fi)eFi@cas{Rijri8M{{-B4dK3-l&V}ze&(a zK7Q7B_O5^}M%ovdwF}j(7mi0P**@afKFTv&PHcodiU|Q;xabv+N=2y#qz#m=2kdX- zOi~p(&pcpfn!c!*+H~6-qlG*OdW(1vNu?c$&5GW!VdR-1tRZd)6=nAwHt}SKHPVzT zQMF-IKVW4fb%~@2yXPkG%G1otpkt3n)z7j@sio(vU~Rl{lBs8#UPk{GnstXoY>ran z>=vLjz@`}1lM+cIF8ikX1cw{bgpWZ{Ct>J~hwN9W!5&+UF<{0kA~mftz$~~q>%A?$MfH{3uJLMC9aP)Y^5~m99zKz<{QXfJ%e85I?g6C*Xu1^)IBae*-H& zqjJCQhRG|RfIi8YU-|O`Q8t7oS-KqEv2DyTykEQ?RRK`z_V$~_OD0!Kod;(406Xd} zcL#?suv+Y5VIdyTnQ#00gh9PGoR0U7pZBf$x5=gyucxUOtKiB|$yPfD`6!`3DCW}2 zaVk2j+k`-!IMQM*Ge_XFPz#h;(<4b-Ds=W@qqEJ;q8^lT4MkT7LibExjLMGJ`wGGH z?1pg*g<9|1c}EV>-!J*9HBcf3rk)A;APR?sJ|7DeA&(-%ldLCwvw`5*g@)(Ac}xtL ziw-#&-fp?#3`Kf8``ut`gqL6{Im?rPq+onJyDf&!aQ@yQ9O&7tW3HJxM%z^q@>xc- z?*o;_?hpvNTL~sKu7uPym0MlUHfie;1Y~OJG|*wf^r4wmfb;MJFbO@pQ1;>wA}zJf zY;mQY6r>KPL0?AF!sI$C$c=h}#r8*3S#zSuw|A(dqrAifFryOE+Sp&Ooe7KPC$$y+ zs^zgXvHkL6ob}R?nWm}@LTNc7OS=xICeAk{*YQ4QZs9qWx|~s%&0^5|c92czIOp3x zb(?Q=EH!R#F=1o$%teTYZI5tWb5&X6^h26Fg=`$fm^I=l^K4T+`foyavQZ%``U@w^OvXra_eKy?(9URd+VroOwpC&qg1HrEGf)5eQqnx2vu+K&T z`8}C;p#KiNzQzrVr7wq8?8^rc|F`@PCF`%0;Q!*u&ha7zej*mx8SwKr1Cu5x|C+~C zjmPH0OC?n*C{9ZZy_iqQ2YirZYNWVPEe}<_2H-^6bu~|jwJb)WF+LoBo;up|=IrwN zd;-^nr1*BZ$M=go@jIpN$dCYT6j(!(c-c92P6zuNrL<77B&%%Ac_lVNDHlVm|Dvo} zOA?95EKYD+yrDds;OE33m_22t)5&?YnBVB~M-X<>czs&lnxZDwF(krx_yrWtNtR{chk4 zHB=px0&X0ZYoIac`Duc?BRfui7L{JhFhy@1aA0TPRPQ)b@8idk|Ci_Yqgw42qq0vV0js-9IvG z&e^Jb+K%`&1^RqWnJ3mENg!R{qM_1E zZ{b5DiAmRSoa4PJBTekQ9I5;*up$?8CT1hkf{pEAt?=lW%Z^#U6ycI0OTj)3PG_S8 z+FyDBhP2ohiNLxr@3SiD(MIl$=kn8Cnngh7g@b<9*z1@Q4gEWu?I~Y&u9MDSO|FR* zExE!iQexEXFN1~Y+PaAhj#WXf6;Fc4f--@n@s>KgJk!v8Tx^YNrEXw3)L}D>099|9 zUpa(~_Sn`Wv#*suvW#k2Oe6hcVepSYISAtraIPuXwi&R_CIL-Z{{W{ttO zJPvj_*iu3uePx%1v7l40z^2GuP!i)PTQj|%Xuvo#mzYwZ^Dv9tsOPeUyaUV+dC;0Q zb_`NsHw(aiS1prv#>Q;-5mB=YpC)Cam0FqIqK$lFCh1JcRKZv%VqZqzmF`-uJsrF5D5BaUM+D#y)As2 zsv!r9sZCuTZcc_>r-U}@4IOv4nmKwOId?zXZhO$#_&AYURu2Mqt`g%LY{S7d)0CwA z1}$BYD?yOVF|No5GHg7hCS3nP((Dat<*I+VF{nlIVO@7u7J7SDL0A*|$`R9lM>5=T zwWA&w0024y0D!>%E0X^M#|43I-i`~P{R{HLq2OzoF`v2uSmM%*C37kRljPkq2cj7Z}Tqmv@(0d)h6Z~ z_vSUg&okcAe$>%5mF{vl=iT-B?bpJS2b22th%DG1ZKQt-JBBcYup}p(Fc@s09n=<5 zpiPP^X?V4)`gL`Ph$JV5Fcl7@0Sr#kPIEdZKIc~ALR_sod3e!{BpN&?MW2ISdAEzX z?e{HYim9>F{Ob<9wYb`!a)C+a*IezIek!)&fhtm-T_6*#6aBD;UK{I@L zZRQo4&PwnTEQ$;>`N2u{TtULE0UH!gE=Jb`O2-}qowQO~abBZ?@7M$?FOcmSQK~q# zRMy#7o{UKRurFJJ}`)m(~y0u~6IVJ+P-qnQRP(z}SbV1hXsD~N})SDsQCK9sFX zdw8eD2MRKq6}haji9Gz!@5XdK-qi{*WJYwUbE7e-Qb(j|p43YiTQei+qn%abD6qH7 z$aWnaA=zVBPdMFeRVa2W6~}d9VFBmNZr2R z$5tRORQ?QG3STk-MYkx-Pxz?Ep+$;6M}Wdn^h;gA_fVRoZ)5#LmyWh*sxA)n#JFVr z17CNV(S62uq`o#~+*aDCHb|+8{q#hY1g=w~eO3*R=I1b7_;%s$x@yRYu~eaS z)|{oT*NR>fOUh}gC3}H54UEA^wL3z8WqYh=oM9-u$qVE{5hq_(era+XZ~`qZ8{@Zo z4r7N?a_y#xgvG^o8FS|Pv$7-TO>yE)=9|b67dM3zG$UO~@tMaLGn!B$4oi|a@+=$e z7W)Dp55lFVTw#-Sq0T&tqVRGA!jm(z{jRO7olZ;qB*g&&7HJjdw&Gg2A#q5HYav9Q z#%sj4`Q9YkCMX_*#lmu{hTA?U37A&N^u}w4x87dza%Q*=^DIio+%ULw^4-au^jd{> z;wmzliL(AGol)DtUNuKG*5LX8kD59DEU2ztHpDA6)+jp2y=L8=-15z#ABbIz)!<$5 zm#>uPa67QqIRRU{E-2i+LxKqbTYIqm2?0D1H;8W|-R)}K<~vjNh6w@_y+!F8Ei^##{X+Wqrsq%G*|?6%%I4CYOyW36 zX?ld0;-uL8BE>@ntY$ipb>~l7>eep^u+~iEa~Z_$$a&zw{TMUe3diwn1UV!)lv>No z+m}Rg89Xu>z;A((hm52auo`a%Cb4br8F}c-aPb?nJ@y6iL&N0Xa^l4)WKafZ001eB z!5vYYe2m`mZ4PAoaG~w(92W3gsx#e!ZueecDu1euRk`^!?POqeNs52}HVUw#ItKiN z8bxTUeA@sX!9c1aRpMNkh{9F_bM~!c^;cW5h_e1z5!05|tY`ZAx5*h*i8EH;8VRub zsJ`}JrMK4uiRmItVtTRWlYPMveW~=GfZkTTLimAO2iqcjB&J7b%zfjgGR~6K zK(+dm@aWP^*Byo)3XN6wAthW;%9 z3TCwD>rl17P>WgVCbW8&NIa_SRM)vM7FpS=Z>(09Csq9E2dubaoO5OIvoT;1++7wk zg0M_X?L2Q)`ODgOT)JhW^L{?EL;Ia|sxl2IFCoUJ0Ck?8-NI?1b@EqauG%+WO2QDi z{z7Lf5c-@MiYsPdZX6*g4dkQ3QdlOeB@k9&nH=S!Hv)a`b2F%P zW4sC1#Lt81EH^GtM+|2;oNhm;S2T$ixWiq&!b5n ztbw_B*TDFrW)7dE8&2&Zv35UHTM(KP#!FsgH=F&jc?me@YR)#hF0Z;r_+byHovDOa zPE;HC`3^}3z)hn1g66OiC)}NjqC;VI6jqqy-Y4-@OLGeQ3z8%NN9a=XDqV1X;#gvN z;`k6gL;>PJpQ-9qe+P65>b|CtexET~;9;L%p6IhdSeHnP`qw6XsWPsS*c3&xihE?|rFySkbiP+kOPL%lL)9xw@7 z5;(QbhT$_?dI0FPtZ;Auu)=tI`~EBa)zmGpZjhNjDZgYeL(OgrO0T`sNQ;qD^@O6l zhe2JRyDGeKh(&v192vX$Ocq6w{YOap)*aYRu~tcWnfcUOhk3c#fQn{vECU%<(QbnA zJ6uAlIK`L|i3%XP-pA**^OVpMz7H)w4-(uU*o(hdlL%PXe;zdQT#GEKNi&&68SdJU2aZlraD(W z8C@zN@=^qKBi=9;&Fb*#i@z2hX&P~nDa+DsB1g34C}r)`66?bQP5hQ~hqfv;*8n|q z?>P`99bQ97!tb^o%Zv*)cJMO?DlSbx@2VR;=xb#u zT|Q`x0ES1xVX#cIp53mar_j9my+<%>&U!^GUk$_MeI$pnG3ikCecp>6?*y-ax&WIW zw54%%fK}j`w^c0uqnbe*3qs+P?FVYeR#xO{(Fs&hfs|HwN@b$!jpaNND+(Vi_?;JJrf+ov-h29)rp||wEIloedO#j=|Dq1OEDj|7U zBh=z+WeQchs!=&}kszsz^Yt9&%g1xcqqk5-( z;0`CBkO^qcCrq5=Z%@mi$?jm?3764JM!Y zJ#wL-m+@h5Jg2P^_YU`LC7BfVmCV@*sTbq0sInh>Sr_hH$QC|jdC96ReZzB8>4l*N zhg*`|42p0XH%wW|%Q&s?p<9q851<-bEvLL5dc2R4D&`}3G<)1Evx~Fug=Da?=){m2 z2kyYXFKp3TM#lxWcg5z^n15KcM?j)nt}F{r3_6WNrt_4D?5Q@{;lf%n^7`hlR0bqQ zV0-HAN!;Fmm}A{`o%Q!tMj)(yZ}_y>_-^vKekgquV$b$o@frI*Q6eHJ)?83FRZn2T zFkpCOVEnxQQ{CCLU6wLKI4K?Gb6B2qQO0oRfTdb^8_HrS&U@y-OGUcqp`?Bc2DWv? zTkhou9J=9XNV>27E{Wgco%C&S+Pb4Y%EHsLu$v7(K!P>MY;$WjFPcB{#SKaOghBLH zdR0z4e_)5qHIfR8?=87mGk2VL(8V@o7Kd#cqVhLVeWwT3IfGi@Q9{6gKz`)#XjY6{ zy`z7PfT6}gokLJ{X4fbi_^q_o5bGiMv2d)19+G$Z+WMwMcNF3!(>Q%C0OXZHWDVJ^ zAC}68k2(Tb>RbydnoU9oo(^|^%HiX1!zc}H&0TsYnK4DRpQEpC;vN8s8P#oLICvw^ zgh~6aG^}xmpUQ}eO)FL~Zu*q;_JIlFf~j86Cj_@4`Ar2tW+{v4`CcZi^#MkZkw$|S zJH~-t6eC#H9e+x@<|cYw1^)tg|0vb_TlJIF-%9}hq5i2r$w~oHGh(SKKskLjxbliu6o zULPbuNHi3EQY0S3)>A_f(B|hGr=Uk#M=qNp@}$;N;*a4gRnw5>TQfo%-dcL7SKOc* zM?#;4ipj0fT1ao5KtI%QVJJALH=%1dbsjy`C{gMhu+m;|D^!#=If=?4F;Iji8G}5gV&f2w*b&xlA}=Xba~lg!Jta+sTCZpoNs`WaM2-mbs$T9T$7fx2!aoeVx`YVq{Gu|$?Ajiyn(jUs_; z?GUsRyDB)k5%H?&G8-a|*ut~@ntMsD!Npv)AO(R^qr)&t>x{KRfRY1ekTQ7O#S)Oy zb!_?qc$zKYQ|9|4P&+}NXdSF)gZ&`Vg)Cpf>=CWkBUO#WAAW&QV7b^ov_WJr#@aI) z!F}D6AE6(R={Y^sbXH}OUg|evx%sM+dB{#L9ZW7@Zh5t}{RFYq3G)(Gr+feUIHvmS zINl8i|K+@#ul@G`c(ahgR-HrEy@uZ zNYt{%tT_h}0Jsh*sex1v?WE|Fd=C&Y`Xr7*%d)mgw6Jgwvmfh`nhnH=JMgU{^GMOZk`!09QlPr*aHK{KQ+f@n_u=HT0U`F28A zNL16vMpb=Ah8#wALIlnnHo;prWl?TE*HbvIZ*MSWMu*7mCYiZSwC~A{0@k^5{$}BG z@CoFiaF;~DDb8`k9kdbo`uEH|de*5frpVcdKV4Ciz#Qubcn)8OetIuF%0zp|KD>5+ z^e6k1g&?>aPDH;_%14Of$aUjQ2v}o}oD>CP@x$m--5FpiI3T%i0(0$TT=T&)@rEsU zP#>Fysf<5{zG{Cj4Kj(eylr0ZzQvv(NSobmp!wDCkg1hZTiGfq%%y`HGRuo#wG#I1 zVW&fXHFpZ=xjg&=IDl$uKyc>%G2lRYrtcQ)6$qIAwJqOFdvE{3VxM&U>leK=+0Z*q zmVK0o=_AJbBr`bqB7U(dp!{rs@4FP}cZ5pWxNaiyalj||XX>ZWPJudB3XftCv{kVY zd|wSIw}Z&`+9VbvgsB{vex@#XHBFZz%+Ej7qLg$R0=QU3lkmdyT5-tv6+M?q%W@q1{gSNj-5XB02z`y@^5{}u~>>R z#{H~2o@-fSdD02VBAK7ZHm8p6%CpUb%Z{e6*$b!VnOB}iYYxg?pU<~60GBxkJx-K? z*LFbMoDq0oCVHA*S-eRn1Mo5ZMugtdrzb(r@(?xcaZ|9p05opo#(Owsg68lk0{?2V zzzR5S)GM0)>jJb+h@CUIPCYO$jU%T?xUmazk5J7fCap;`CXYb;^rg^1{Us`O=?2QF zL!><26m>pob@7J$5+*mkItpYu z>}oIeg{8-5p#>o}Q)tx^>Jj)!3KOB0$xLhV#KZ@!ITvTXuwa zDL#8I-sDfCSU4&zuk4lP56N0M%S2Zn?ceTB(y#d3H_Z%e>Kr6=WoXx}Kpi3p7Q&Qo zR(3NwctapY2;AzdOFZQeftlAk@dttO{hRFKh^(!x^2Q-^dj?hw!Rk#gOa1lMqv3|~ z;2;oKor#d-^qW_Gf`HV{V{T+~$E@Ui1GT`7=!U057R-8>o8_&8i3#G?K%ZoLkv5CU zN|=6rqo+P5B9h!A3^e)N`r^LNEZFeS3mY+p!b*i0(?UKM_3}oW;vZv-#Xi_6=+;9T zHk{?PCr zX}sy9dWq63>Oy5oFNSsR64K!g=gnnHK#6D?u7%)H^ZD4nrc?b5?U^=o{psHw1%|_p z(`0s@qs0rs$G$`%x`+LO;rM<{y$P7ULV5{Dj%ad~lQbgZ3iCtZ#K7@qlM$~x$BPam~w&9L^$Iq1$IfS;cRG@(cy}2+S@Ai zcvvE_B?g)=$U6mhHpe%)5j2u0wUb7b)7h@#-FkeLNkqsT51Niz4{U2neUPI1<={YJ^a}#U?WoLKhWPCd-3iIRreq|Z_8LkNYV4M%>N-ucV@vVm{jN1S84veD!aMWg;3s?$#T zN;@flxC;g(_AIt}l?rI2p%W~gzyisp%*Xft8!G>;2rqLwJ5B0~_?o_mPwL+#J|}l~ zHwh!R|H*pFT3?YAnwK=UGrpQQa4Nzozmj+y@3L1Ic%e{qBC)K7etq_w+H6L(QQa6N zrn&oG0uTQu0E_mqB!_hSG&;v#fOq$2uh2c0Nguzi6MHYzZRTV9(L4K;+a|Pk=ktLI zz|yr6RFQ2PCRcOcfFxGO6KkZ}_`nVLVM{aS5EtdO->W843#nZVse#xaAbJ+PV41p; zmPs<1(nYKJibiFgR!1c>rGbV^Bja4L1=B`-Ls4rUgi1r@l2uU&b*NEdnsKH@WTwfn zHnVx+Av4x!lkK|a+<|_l<_IdO%~arKdc#>-YFLN}S zg*x+7zXlWcg$dk-d=<1-K_&BaLhpV*e8X^hC@j*}?NblVP{f_l2f|awG+RiUYoZye z3CnA2r+%XVM2D4yQp~W`LSEJIc>(k&Qv~_V3Rl9NROyH)V8%?C)3UIjLLv7NGZ$N8 z(q!5gf13cAni2~}^qu%@JSNF}49NlxS|+Jb2Foydou{O{4!LLN)?^O#S_EARp!T5= zDKELP}#dgRh8S6g-Gdx91tM3!aYI5BdW@>gC=(b5adsqJ*cjf20}gL zor<=AEXeI)k4TyWOu)Fhp*xr05ukl1eaW=z+{C2)yLpO6$6Hm3+AiluoB6On9aM5- z*Lw)qK&-q!-L%%!XS_oLdg%A6;6^3e`JYJW1Ly>6Vc}zwL?d%B zlS(8Zj)v`LAp6`j0sIdW4lroYdToQ2g0B{?JbnnawO52067suA)gXtS60{|_g-q`i zY^hQAHlPqdQ3;~k&luJNhwN}@?xso-hiLZhiIoIY(sqhak{u9mL_2?cP@q2p7P5SqZ}=6y$mG@Iqz zw~p>gA{1b29}dT5+Z8c>8@3Bg$9w0@XF-dNLH3R-(eihm;UE#%D3HY2R3QyDZj$m< zQWvNn1jeB17kHW>`9%bQ)IWfbnYQKLzVTu^v=Z!{c;n`h!T4fX56R7@7>#3;Wk+Yn zC~>w<7q&?d!7WYXHuGBlyR4s+n(SP3!lVBhSWe-FbB!s8gR&iAPiN%8=#b+UK?K&X z=}DQbBlGq{^2?Cbp!~TSoen4ddgv?tqXqldQhZkbaeD0U4x6N&y@`>-e^#UaPxex= za6mjl_EJu4NUSGj)&>1$m*GzoYblFYFJ`$1!a>wLoUB`2BS9VZrmh~Xd}(e)Yo+ck z7N>0w`y)STJ&48=jG+RXg+Yoq!_4F*E?F|}=-k@haIC)mdD~@c&2936?I_{%{;KN( zx*Nw6t#3n?-PiyOA6MX;GLp+qy=7L2opLz7k31IhXe~?89%!wtpix>2a9feKWWqTguc^MD(aOy+2LZdOg+fX`% zYKyq>u)PG*?G>^VM;3aGR)UK3CteK!V4_uvA4cy;%sdcJ-vRm$aVib$OqvY&NxECb z7!J(3gLJiYT5O5M9^+*yRYp6?G>Rm8=ayae!%I;5+s20M^iZ{Wabs=dvBPkCdNu|X z*_2rFgp7f3rBn*z+QK*$WEP7AN|lLlcalDP3C;3pw<|$E=G+`J>&!Z>5e%9^t)bf6 z_cQkN)WT)-2GYW+nAz#`0aXEgEdc0>y~-4hzG{$5VJwW6ZZQ!+0eQrIa61PfBX-4% zc-vFA192QCOPNX=GVJi@>7WI+mlmp&))1wgP|)TQKH(DWl}drEG}tE{gZ{<@22Dl^ zWPAk?E-h!*CQ_7IXVYa(2i9HkA;+=rB}wBBov^|)GAsVL>{^a$Wo+z~nh;Klb4GTT z7NbxswcCki9_89Q-7Em?%U20oz}Q_gHyYS9wZ2a6f=Bj|^jc1e6XYT*Y%kT1#4Y7L z&hwUqmN8{Q@>@g{OLXSYofK1aNcc)A!c4@ZL1Te$mL44hb-%U zO>roqtnWZSW>K&Y4Va)UeZKo^yIhACl&koRLB&y5Uuo@gTJE=@s2Zo~t z^4b`ET}DwV87Er>?t!Rnj;muVSaUG(E^B5z?NZD4gHBx;&Z^h&$$U;})9g2+RX)%) zUM^+og)5p?x#i5_#hzk=(_CoBJVBk!9!LEFAFROHF7X)^?KUT@U^T@?UHGy|aMZ&G zASNfFvaUZZ*=xm8=_$tvL3P$?&~&JtWzV;DpCNO}b=CSEx?4O)^ z3J~Y6{g6FgdwKL51apE95b`X_Ki&CtdX?2%?*Z#c?kpq56KJZ4dcC`R zU3DP4LK0;xV&`7rBhLEknt1_fw%M*QAJ(z>F^Bdzv$iLR`W$^(ijt$v3O`>ZH^ex7 zimr(=0|QKC{X^=8W8ffYbWy4ZuL6$o95+`+<6-R@lkEE>UHnJ5LWbPP9h=dBXa!5) zH{$?0M-9bBS+?B@DaY<2K)yZF!65eWVD6>B8K4sAATa0d1xJ#I!eNUzg`cs4c=~X$ zN9qi5Ey1&A8|<=M!B@1E$y(l}mqut=_1275G-xkD-FLL!zjc)7X4s(rRBs^s-u zI>!5VhMq!t5I2IXfM3PEff|gSUY#B@Cel^M??p_T_N#DIcEZGZ z2JEW#>!c?_tf5D)6>G#`2KMN%I+Ly2%UjN?AvO~4xA(UnzaFa*`EXJARl~c30>BcZ zq4zlLzmCS>d4KRcTNPm2Z2N(6_lv+g5^O~(aqj29^ zl;$>GVZ1Fc4g&|?X_u>KEHX#j>=nBqR!JgOhD22G$D}mVnLq+pR8!3UJrtyrW(jlu+6vIpF=|o39)KChUp88 zo~T-xxERn;T9IZLVm#JrjKa9K?Xt9dXo*hbee!9KS)j#`!6Y6?$V^HCEl*mg$}snF zNzwRrGQ&9k!)15eO_$#9W1}>0+del(lj3ZR--S3*BQ|QpTjboqJ&HVCzwOaG{W&tRRK$ec^D%(`R%qLUax7pdr!EF{;6a{2{yMoIRW>DQrwN^cwK)wYV})Xw!Yc&jAKq%aZ}tV>Tge#H z2*hbOS>hyIA{9{7mkZV7ckdpYh;%AfTay`BZ&1~p*GO;6g7)<+N zbM&+Z06>&9yVJgO1>#^92^pL~HXp51=2Bn}5VCeq;}MI@=* z?0u;f#Ng*zr*%VJFEJlVGK`<& z`#oPy*?1JGO8TMA%)qe#Plv*d8P0+8^*Jhhz8hAO=?Ar1rx1YE9hM}QU#$DLtvr)! z+}sNQpZV)=z9l|5{^5ZB-iNO!0*r&*OIOG*mciX3V*IJ3mAmw6pu<7k(Y*4T(|(nt znKf9r@(4Xg?$93E@0tDZsd8hj-?I>4A;XKj_-tMC1A}oD-na6CHUayBOnLm(`_yhrF^_wt2+)##%R7diO7G}WxX_xuosaZrTugz*FL;4!! z_Q5jzNjyQ8=dE|0@TO5O{W_ZPnU01|NO-U~z0+rNJRb2D31o)*jI8CW+`IMuiyK`R z`iNA-X{#94qOxW!D69SW6u3DIW;F|yP71tDq`VFqc-R%*cpZ#G^buQ<5gBi9Ai-{L z*L2dBv57y~aj!+fnH_4~mD2rpQ%$0|4vSdOJY5tR%5<1eNyQ|_ZT*0zRY_rko{iPG zMTiGup26?}t%!}LADBgPjz~;P$t}piXzjkjnKrdf=}0f7)45vh%!x3eK~>B0hSRyW zP@sx{WY5g@Z?L(oAyORXXeV64Gv^Uc>J6;Tq^ajWZzPlUfk*3qMG=HwQN+K^hVn}P zYt~og>~GsrpH|uuu|nVY1g#ccAihN?TT#I>0hN$_i!aJXNivjDW^Qw=<2!zRufHm? z>Us>rbu0{!H&HM0I;;1VF=3yRp6X~DBmz=5=dpFTYB_qFyh``DY#F2Re!nLC6?EeS zz!8HK^Bb${<;><=b2gAIxET))f8a$4pXMMVCS&8gpy3L?38deI@p5<|UZ%d^h+zvJ z<-T9?05bDEoo|7fGnc>g5>v~I2n7;LPEQ{E%Znrhq=aS* zIpgHwT11n~jlhr5_@3DnwHhM9ul;u?^6n5BxlfKMn16_fIwII_y zc%gC_JfApij?^A%oe~dzCHATkde*8x$jFwYa6FG8PGN$&M8J?FK722fW+y>sG)8My z#Viq&PJ4GJDlHbV+On>yj(*GFQkGX1>(_vCyaFM}eu?{}%FzG>ZxieqSIT8ZURwY~ zo`j?@6DRn7O&%n>Kcq-41feYGyv>vBRF2{Gvv}E7_p~;)eswH#G^X~{b^@EU;%$Md z`1(OPT4g$2cNui7vS(vLiN5v-_YU&ScyU!A@iDR?QCW9*I8CfT#Au+kMW17J3hu|b zh#>D?M{eFFYel~FNDEW~?wXfG{~E$(j}o|Ey{IeDkx=`X*H+wgh*+(*Pl*3svSA+^ zxSXSyD=x0+Q#3U0jsbj@=o3;_$dhI-YBTYUL^$}eY|h6I&j31*d7+;t0)y_LiXWIHXUc^~9cMMFQ#9^AP zf9E@Imf<>DkSGi{NACz&xgj|SmL5k@RBU%2TEt+;t$0Zy2F;s&dEJp>eKC< z8@i{NK#=;pnA41w6>C7G7B+G9?^z8onUL660;WXxTJS>-zRYM{?w7XUUZ{h;RAFH2 z!q>w1l>kd2GessYa+3GJCijv5hqZT%t~FfNw6kK{wryv{wr$%^R&3k0ZQFLTV%ttS zyLXT8+vn`=F;1V+W4u4+-}%ma)>C&qRaY_jZ3%<5&G1({$C7}xwR3CR`+EbjoY44J z)BIjR%`MwzpCx-qzrc7vT!sLrGw|lP0ysQjF1HWfmuLMMsK<8&an=6228Hy|NY%fvIx~0Y|U&A zZ-<4o!7ZIl!d&l8&p$7%6yn;=pF6eTQ8M$jSt9?)!v0!@e6pNjj`{~Hc zC5z(f7yczqxi4N`8R0apn7BzyhDVyAB5|~zXaQ$_RqRCOmhO@DN2_pS1nA7wzv&SS z@~uR?Cm<#FUDhd_oyee8b8r?9xjy7kr(R$DgqSCp@|%V^Y9Y+FTRwS4N}l&K$m=c3 zYrVy;u{h(7^XPzOFSC`c^AF9TU0y!W)4H7z_JI0G>jHV=N878FmuY z(y;pDYQ#k#D7Tv<%)FB_=Uk60F5Rg-4UPuuq_j2Hj&=Z5>w()f5ETIAD|#HSL%SB$ z>6LNpQz*S4JJ(8xaJ3CncLc_7QSm`u)L2w^A2@2ZsU8_`@(X#7bN&_ltn~&VWu# z!?@{=sA#I-y3zbiLL3(bUx&BPeodRm*~ zb(Uw(d+Hn?@8=EcpAtJVe_%$+dV&MOn?A^dRMp#f-{*$k!2GNJ3Ua%Fa*?qH5PPBF zbMV81%Wi==DIm8K1}^-Q-T8YJlsaL#zcB23D-b$^SBCB^3B0r;w?p;XD$X*RUQoNW zBd&K~P_`?EG&;-n-VMAYt-gN`!416>fV1w5AW-+q4jx~^|CPU80QU)wK;RC`iD=kH z$ z%PJyOp$7j;Yt_FuG@Al37hKsSMveBO+|W5D)f^Y=WSWCjdeOsyW8iB1B*>pXYJy5Y z8hu%k*1|G1;?vCs^t)>b7?*}Fb$b#p!w)^L|8OZ5)tq0*e8+H#28GN;JuNcMMT$xk z3kk|fxlV-G5I>8-DMQ~3^(=r811`&Z(TzSzF#52bLXFjszvzZL1vZOAw4qS4yKc(S zad1PiHZNU>WjIP1y&@DBEyP;>#scL^lsYrqe~qbpW4Pey&*&fJ#)V-YMWdPdHk4NJ z()n7X66DGZ<&6O`*wZwgCpiYogUqYC#yB)T<0lUolI9AcW_9plX6^tSNEPbYI^Y>w zW~+e(NR^rFS=~t^SWS~@h6~8cCaE?xQBmpdDP%oDZkCcH}sm%G8sPTvwWr z5bqQcjf2cq1#npExeKBmIv+fIbjB7GDoXR3(<1U5&9%2oRBLshKM#w3G+WD*Fkqux zPX&#^ES*F`a}^5Ot>l5Xm+Rfvkeszd(Nh4~N%rO0%R}3JlfAbg*Qc_GPsxdLyzxr; zxa+9Z&@txTfz5JtIY{fn)#{N2CxAB+b&Hsobe(4d*{#%A4E*inbqE8zrwCqbkzd{u zI13XIuMsWK#RYUK4Ql2ap#< z8#3iFpP9$=Z?Om8Nb$04AWfW7V>7TdXZG1UyARIpviRawU;f}$#b;QD^#V6hI7_HJ zz6h3q@i`{^4x6}g#_Qk~C4U$~vid~&cruGVAMdsLaF;NgnH-F?qWy1SIAj!E{Gg}- zrrVrF8ZW*j4>${h;mM)uv`@Sd#g#hZzv<+8Uk@xg-SD`44%1$!vKMI#)!) zTkOAWqi1gt693Y?er{^Yz_CMb;XKjmaf737>+(-?R zr<`<4G%Ii~U7_)--_a&R(2><$5Nd$z5-!W?yIVlQlp(4NlHINnW0KvvIg#)ss44d& zE%@6Wk}M{X3`F_t#k#Ci*y>05Ylc#^1~gsz4fm4a4*VVNrKvPn?OLo*O+ zJ57bM$)6ff8DDG$<6s3Xq2oKrzz6*WeFF*<-5-403p>e(}$>TzmaR4*yf7RvvC3ke4@XjggW&7*}t`oX1atp;) zhZI+19UP4fA*NJ~1CWM+51&BXbC2phMp|KRiOuQgx3$fh;|SgS?eQXP@+(OQJqIlr zO&Zeuvq^K@lH4(2?MO1i=-)M7BH(n>Oee66kAr^x=tPI>5pGQ_!rWEdRaxBX7c>#g zZ+rrT%0%n^(v2{igT=4i-OBpAjH=)9JkY-D3rqYqyVC4`$Me&K91ODkgTtHAX|d2v zG_d4K!)sPSl&rIDC%zS&V;_IIaKyNQ37r*`{UO-HXzueYOaD|?S5{9elbH@=h5@wp zvDnK*AFJ;Gss*7fy54%xf8hPcr02zE296I50H7Hj06_V_ne-?-{_rV99E|P%&rbf` z5li(S8BkMlr%P5y){8t_P+`+YXnJwpkc*Td2?1&S!eHH2V6qd@wiuQqm1|S|{%->A zw>@nM@@OKQWdGUa;;0hMnu~V2XXR~rq!QIhl93trf|&UUD#NT>@deD-RXR8_X-}1k zwI)ayBbhTArv?U#4)@6S&xcZ63Fr;lN%GUP;LgIqG#d`0%z>W6dkY`LPz@518qMkC zhjdiOo$eeXX<20g>yy$M(IoqNj29*}0^AuAXm=1Da!xq+v%5lL&8Ufr%#JF5Crh>Z zGL>Zrt&1Bd<5XY$8xm{p?%M_v-Q4HpXG$tN56jo=ZD}ap2gmZAwcV*O8yR4n?@69u zpOju0PB|Cp8_OncBakx`B>{Z`5`*7Bm{jwTE;A@+XPHmaPdPwY?OJIILJe|3!(UJ} z42lSWc1e^5sxi~>_fsK5eyQcgEo+>mWxP4bq`~q(jEa#ZiVuqks?Hn{=p7hz|Alal zTITX>23*f%inwYFG?sv0D6H2G`Bllc>l?+ep&}E%5gs09TV=BCV~h3}Sow+RqDmdz zHqNl+Ped@K`J^Pwoqnn`mql5=X3mG#zS_9Rc_vGl(r>*)t(D$0F=#|Xyuk}|Tmb{? z3oIcT+-cZVy6?%UvvTXb42r{csSRff#%_*yO@c~jwrF$vixu!390YoI9^+X1(dT2ptQf5O{%)w!j;Nk|Cy8S-iD zb-zKQg(bOk!wMNc$jYit&SCC6kGOobkq?TC+y&|}SE4_{gPYA5q3$4$D&qXn+l%#* z=NEEQ>o<_fazpA|twJ zA3GtxNx7Ft6@KW%A4n02l5t%4s5IAZdyy9;LusOKu0<6xsmsF8)r$Q zq@u5WE4TQ5+#t{FAj!G9mc9Kz!a2slNkTo18fboJi%F-|+j3Ve}g#2t!C-iav-q=y%kY_s)ql z&b#2e{800rnVy21RGf{lGIz7U!`u0s@@|DKwkUJY@L1Qrc=m9;n3#fYaKnSW@2mS$ z(3QCqA6giy-(1E@IH9#XB1+=SyX?AcWH$gZ^Aikk+H_G)h}ZPd9_%rR_P7vsA`r*8 z)1YQ}JGIdW)i=FhdNq#9g&kCVtYCT>f~j$@?=~s&O$=zgz|J`Y_3mj%Kqy4z8(m)9rvj*eD^6!V=Pt0YF#!2)8ZrZrOwR-Mz@e29rYp2EUN&8zIdfA z2-oXIQkU{F@@-*u)s8}CB>T}WaZi!XTYDp0E7^EchK2;z^W5b!JwX>#z-|vrWnR)+ zjqR~l#xRwEgoh_{vHP`N;WyriMNDO$_Hdp3sf*Z(7!8q+EputhIWb@yYgZJ`rAN7d z$?L%3)6I6u9Q$got>=I)RlHz(;K?9VEB_z1oBU@OPn+ocpiATG5)P&bdWx&gexmri z2zAhje)UNPc#fw#D{E?l>_EF4$ZwY}*cGTbij&O+KiLEm&Z2}&jwyVX`)V=$&4Pg` z{67Q|(snt(H!O%k3V$P0#1k5%w%hP`x}(LLfgW}AdJoDS23R;Q>^6t`XYjqbfqO-eee&@MMVKZ`rBLT}tgGL`pBCRhTvXph~#cp8~*ZZ&#G zHwh}~w?O8re5mbaDWsp0!L5FGn(bfDZPu@+&jmDqnA+Xm;q)j?SnADY`w@N&SL@1+ zQij9~N(J+XJh|;NM&ym3F80Yb%6PgTM(d;H9MovT&Tuw(y8x9VE?30qZxZMkEjn0t zWU?|;IJ|pm1)?$}gi^T|#!z8hiz^6Qe0TBzwVq>2Y|sz6@D{o|$Bj)E^74`*u|q0% z;-*M$$eY5e@X{K?rQ>eY0lz!M?wWZyXe`aEI&=u!(9vTJ+*?Ofh$Ioh(a>(rgekdG zay~@!VhGn8H2riY3L1qT-JBhqhv=ddoz%KVo0W$bG+4oxlBq4Uu*?%nM}fu!3zXL= zC?;1<`(mC~t+ZcsGBBrpbLD%8l+c!Zs)n)0C>WzW!ATf?<*5VQg719XSi#FZk0JV} zt_^4TB0XU+_b9zmV~w0ndqx;*^G_73VC!nFQkER9%W_3c9-zG_S|pmxONisK&tj8= zny=93Q_~cXWQu?pZM}CGX4HBvE49C$R~#SqJ{04%FpnEVv$4Cn?oozf$fYHhO~hyo zgRZLTPGBmJo{r%DqkPm@kvf||007LP002b)@8$DzGg422?z^@IE~|E%}%t z0*Pr^r%*c_UA+I@UVESXxP6}K`Gwxw;)5+L(wB%wYxMB~yg=gy$K=pfp|=bNf+0TH z1_JY>r_;y7$2;WBhkDa18%CNUT$Y;Dv8i*S7H_0;m23uo7!Xz4$0+TWWO^xp$vnA$br;2=($o%9L zC=!|yP5F{hGkLn?%Ewa0wrokRL`49_(@hNht`E-fmyQm+Y|NM?s=q09O&1m#R9t`E zy8*8pl8)_Il?F<4(_T*w_QJE93_Cb>IesnWAG7crXEp|!q@a3NpPd8#ZTguYCNe5t ztJEo@R)zwR0RC)bpI;xV;65KzA!<#l(i$mbZY?7 zZa5(&reLYrNULflO3LQ}-=aYN~&O5oDdp+mg1^0aZolL%-kVg*__IP7ut?t=wZ$qnzHU3{N;g z0RKMrQ?iFF0im5vF7FGs0lQS7P@Apn#H}>Obs7gBAA<`Xoeg-ZHvyG>&KU<;h|rI| z$=D$;Ev=PTt}Wgpz%6SHvPWTyQ>vp)VJ1c9R*CC9rtI!bq3n+DfMXy>=}z`Pr?kH1=?2mK zBwk&fHj<{jRoU%IUN7QrxanCTC{W6$fIS!Vn|*p6T}{?MGQ6Jxo1Mx-T-lrc(HVDjd=pm`+jPvK z(a!ZDYgcPnbF5n0aMj$5)@iM)_syi?X%~IY@CHg7kEypP$sQP!x&co#(%KPupXjoj zPZ0k6%hYv#tUJdOC7%{+=N{1a9bac|v1kW~0_vQya!1z_1*fyvJ7*8Bb zBa8xaf!~fSC_`MYtQklZ4fqsQyd>7RyM`Hb_pZF+@Mvu6eT0 zxbKFp=m_w@c&BZ$2$Tb499W;eO$E~f1k#*1L$>)h?DQW+I@^1XO7GiWCqkg%#lk zt6;1~)(M0osZN7DE}^>t;6mDC%LS9V-M;$deDm?@ZsX+u*g=TGLgTO#&*~gu_%S{E z^g)V{ND92Ybi#9EEumb8{kBC7f|ziisdYJCnByjYbRnldZX_7_xuk3#KFdq_EgGSQ zg3e~e2(~KsWT4*_rYy0u`WZ3VAT}QskH|%oq_;fAC(BD3dAoI_Kp)lPES-HVTXRkn z0BXJ2DCk@4Fg2u2Javp`2i28M|3zuDorZcm%)b*{kxEKA#oW=F?~aHfP$DJ502QQk zA#64t6*63uQ#}HYUKw)*k3S3OXa(i^3u;Zof*)+n&t{0{fY(Z?GprM21LYbYPOqiX zH;HGJ?mFN--4K05vGeZAZUhz*HMV8Wr4I)4K zR|p}LTRF;EUUQS#`Cgu-EZTZ;n1~cTag_OEe}{eAUgDN|W){hC%Z+pA4`rQvpN|V_ zub!%yfc`zFdw{QZMt9p6pqKSR{btdh2CA86l|Zg|>&lW=P&n7db^0Wh6BmW&_+%f$ zamnYN$8VhB8ls$V3_S57K_#=%u3GR>jfI`Z_)ZrcPsH&>F05n9$Q{1SsCxZvuikIZ z51eLI*o``^xC?rajTD9Aio*tfQ%r(1(XrqANycuVH4o#vq%PkqhlJ6>#W6jq7o;Oh zk6f(qmx((uLhfF zlj3inIf>k2t(%!_tKAU;-k5WC9dCU;zHl2j1JYd$=9En{!wgD-5(s!J`?`u%Zq|YP zt%Auez!vtEr9b(H(9Q<``RjuQY>DEUq{k_UO-{t$jZopq->#dzu0rsX;w>(jVmAZ{ z1dpw+tSaCVNenvvZ9o{=vL&3RG&YQhdn5DBtNW(kAZ6U8zA6D zykqEnxZS^BSY>7Pn0T|c|6_L9sxl0`{u4tae#{Bqe=WQGH{Je=UcKYhe=G_7h^gnG zIAmjDA@(k>b+kq=lH6e!p>VlU9wDxq=0(}s-bL`1GwzES_sy>txzJk#Bx!iK4C+$zQ)Pn0cC!HQTZq`^^q+?mb%ga3m>6i3_{O@ZaV~w}| z{68`;yS0#@gTR#;O$IJvbfd@_lHno5z@?QU9T9Ne;=iuB7*&9gYgdqvhV z+x4Rr7rUY5LgtaLpvp{4M6{6#x|G)CH_NV#o9NT!wA>r#u_#+x)VgmdW5}d4mvKMu zcmK#R7O!j}Yx{F5b7nL)4TFW$sM2xhz|f%h=<4}Jlz$>At_I2^ER=q>yj1mmGAj30 z3`!YVXSUqEPPEQiL@$qNNgD^Z#Zj!YGoTutW;*c7NSbS*z}F7EL#>(sIRS&K71(Bd zEzE&tL9vE$3R%L#yJ9@&Zr`Eaatt5u3QTMaaz)ZH{x$XryZv(;dyBh2!3-DMHNRS6 z)omFmD&?DX3p31yv2F0&HuYC@3fmRa6YWa*iI>~#9v6{M!{p6^F0iyd=06V*JA9@4 zJ^#qY;72z9MUL~o$wumb4iMW|8XNs@0$-J)^go2;oiPY&t)($f`Wq|vaKRh|)s9G> z*bGI9UMZhIY?Jkg)#}_$-&%BU<_3yAQIP}|o8yM>1uL`;3EsRcP!2Xb&AZ|L@1)xM z<;d~R=x|?lkYCfHmh@B;VKth4fIb1D#$7Iz6S4A(gJ*;vkACWgl0Nc1{nZ^l!tly< z4R57YY6!H6Vlbl(!@;FTN?vW5S0DZLxE!}EC{G?&CmOthOOj|~=IALmDAX+$1_QSv z4~v}u%24`t*EMk-c04!S!JlX0+*Z2AeF_?ETw%s=9NkXIza zNqaECXNAk}EjHDs0drz&x|WhSL(oNY?F~rFa=Bo?=&1*U;yy4q z59tHAhnR8KI0SIxO%I|TiE3q$5A2gG)BJvTHccXEwSOEBCXhxANb3S2X%f8zpT6$N(Lb1LdR_K1i)z zuO|(>nahV?NQjz=Z&XPDj~F-kQ$1$~2q{04Z_!>(&UvgP^NqQ#;ras-j8PBGL9iV{ zim9VM5_ntkXiBTAO>cT$;o8m0&2^eV8p+#fPcY^@@yL+)1FFM9q8$%W66Mh?AKt(k zDa`6R3D=$_5j7StDpIU3Q!##*{p?GfhQNnr`|IfChu4>`RURMTj?hA;D z)W@^i!Z{DWA}s5IHj@vOrp36}p8v04tbdHRdY7}^+WpiDc7OK2ssA^lxzzvWh4CBw zV~w1llep9W!elk6Za5%`!t)qLHMLh>55w>25karU*Ln?+cIz2JGmP#T>;pS!PegRp zbrM!233e0u#*V~>aI-6;Q;I9Q1(bgPa8!+WyZ+WxQ2_>$uY5t6UNYRm;^m54op}lZO2VWE!Q@VhJyqcdaTzn(3aG5 z9Qa7!wd+`|2WYq=n-o-!7b+qY8zSN5W0SQUMRR%Ho9Zl$AcMQo+M2(b(p<~n=45^o z2|O2{LI!TpR4lR)*DBRGAy0NBD>{6}>s;fNx}w-FtsVNUzp8)F>TVaF>jdPSW#sDm zyDBcS!w}IQVg#B#kUtfkT!+ja%O{rO3qU0@EeCEa(jd zVLe%X+}^446UR?x`dG6X*IqZb&bPPYPk(fq;$~6EVn#BH@V@X7y3Jf!qk>hDn#sI%2hYBb#9fKs?3dzB$(35bX8 z&hrPZ}TLdqxC36tOQ zisi^(-v&4APLJrO-b2ndq?7NSdxF_p$n&#g#Shk0i;4Ggs1$48y+waNV4KBvK;49{ z4~jVmKf%}!?|$69H}7i9*(oxvvi9rUk`|Ti^>U5)b8uZ_C>0j6Hq&F}=T9$K{4wwF ziXOLogDlzNCxZBxxmb_TS%)_SBgR+osCRI(1ULjAP-*VpQZ#r18=`@z^0)_y-1i4) z?dBu!q$d`D3E7EafSFx^C~U|Qn>xVhm{xo7;tt05+DH&z|4-B z>}uRthcc%9-8PX9nK=ZbDNcCvb}9pb!=(ZPZ7JX@xGXnf10j-_#r+S1r~8V(zLOY* z)>5Q+1gtndp`#4wq^)G&@x~p$67drAVqF1v#K# zeg$BBaAZ+8hUT~=IRLYUM8xE=QxGpefVt&3tb;-exO&M}AP|31j`)WCd@^L_xh-#v zF$ot-{+x?nuL$ND?~QeoGR3921B9IbahixYNs3@;5(h4GTJV^|I++7%uPd)6+u;SC zL$vb=6HTee{KlEQ!fr61F79O3Of%U?D7qdWrn2%=mQu)0X(_L&Xx;_njU4W zrG0%oeuDiG<{l-8YNL)&fGxfoZ%q*XPa(KzrQIEndjj?V6FR>9uNEd!t?6s2YvULA!bT3b3_ss3W07Oh>O+KNXheuy6EuQKws^jEBGg!(5w?m_AKhh{Nd50>+(toF-rL1E24{hq*A|(Py4ZoxAn1D1 zWa`a<#-R7qBQST$5zOZT+N%MaA-nxRPDZ(f_87M&b4^q~7-{P4iB3O*^Z+>*`T?r- zgCv?e_on2BpEb4f4(FPc*0m8|bHZo$40{#6p=sZtX}q_9xg(rPG0flGhieMCJhBKibA&m&?Md?D7(M@Kl&=Sw-q-#|^fEu9 z|8HB4|4nZ5FH+Z*{gHa`_FA%yrb^i#lpc5#6phQfyuZK2kOP^QhryZUYm!|ClU!6? zTY!DTTy;Fl#G}H{z5sj^Z?m@kA@y{pqe+g1W3S1JwSOudWOIfnU=2G&0k=4QyfsS@ z!Bt90Y85c;qzOxA213bFy2sGd2OVVkBY*30(;FjDX5*5*qyCbM24hv4FSZ#e*am%# z=CzvYGX4B=Y)(@Z#*wIGUf1757=jfR3=prg{2i;Hp9!DW3h za`~fp!G_(hV%ghRqlh%NT*U8>@*_7!W%H@1!mE&~)RrRsZ)}I&asTX#Fw^5Hfd_ek_x2kMut$r%WS4b60{2j}pR69oGTp9=9jOhXb|6Ki*&Hei@=P_N$J9i(&7)lpz!@?VVQ_ZSD|&poNh-Re z2WDli0}kFhnyjvT!z_NeVtJ)S4f5v{kT6F-6LR0Dsb+0uWQR-nr@mv~`i&t=*iBj? zPLJ88*Ay6iS^edw4S~|_OJ~%j;EQrC8_6}B7X#)5-|i9iB78&FzC+h|Z@GIwY3({g zCB5%hT}$mk#(AJ|hPor`hKvO9Dhel33xE2TS$)hp1T^<7$^lf4JbD;mEEK}4!U?14 z#+B;#XH`KLD(gave)iY&Z#Ob}*MQm#?L$x7br0W<-ssBvr4t@IQtv5GlN-6)7*7^O z{ijNdbmnev{*Tdd{ULoS{67rpGCx$;|FvyHVM1o(H!@E`t2+xbvRFE=8Ppje3}Ud$ ziimpRe7OQLYFK>^I~r3MQ?VfzWX=#Ef%6>PiKudyA-)3S1U2_@_t7TD%Ja;&ZqF~T zUKT<6sl$ zExWNstPP?-+`tT_3j}uajsZk+DImJ^&_;Cb`6)2cCt(yE*oVl66 z&FFa~Om7GQ+x*7wrQyHo9#_kn6#5Y;ja8u1_iFen3K~P!eir-PPtQQrToS@6sWI(i zPGZG$A-~qtgR-GP=gH5vL9i;h@?9IqkMCK8>Ax=h!?-ZL3XVx*re*p^leWC~SS zE_F1=t7sg8gpW-pT@06Qxrfl)GF5KvYNyn`|E0eF4>xB#{iVNz4gl~a@Lz@%{a5Vo zKgBSm3FW0U)b>4--7rI46Npa$*UvRZ3as>7Ku8=P9iLws7(qV8h@gT1DUP<k5a)jo9Fzf!mFMaP0aB6$+EY?Hir6({QVf;i zk3=RfqnjTdm2$JFXuLAoW+Ib`Gw6f^Qjm_u_Qz5x3<;DA`N$+jEA*rz3jkk_#*8UQ z#Ti(DLoG3zOQ#qFBO5CuO3D)m3x!KilozIAC@fhdhq7q;WK$1O_&Artrz0siE_KFo zN>4rSoBmSXSA`N#qmH0eY5L{dz6e#sE{M*xP=gv&tF`p1>`mvvY-?Q*$1!7S=!bn{SxW?{-bGNpXglHm#lH6KfxwlV`YR=) zTn(EM@=z$tv$Y1^xp`Fe^+AGG^)ODjL(a>Fj~OY~-sZ*du0VKZ6jtYS^3|foK=aD9 zOd?D8AdyD=T=PVF{+0($&xtmF8q~;}kf~{<^gii8(y)N5t4If{N{yB;g{Sy5QcgMj zGD{r;#(5Yi63>OAHKCeHI&k&}IkNF(b(ERO=b6 zBP*mBb@et8HlwKq2xrC1DllIVD&1x;=8a292vD_V%{Eqc^BJFSrSJay7xR0b3nmAa@KeKxo_9Ypxn@Aixy z>K0zV*O&JdC;mFN<&nQASM)bNXO}H8*D@scug{o-kEvZShKM&;jl9yJ2P_w@s8mIp(zux6v`MmwqJYA?4>8ySO^P zgvUl?1~;+wvXt_&&!-Z%_Yh`7itzBr*F5MtHE{pJpchWQWFBmGh|dA$RR@H5i-S-t9&v4f`nnB@Qr;5upGDXulyn zCs+h-(q7YFi9^AczHtTlsL<$8eLHlywjMOYg^&Y>->wp?zQ!iywQ$V-|_PXT$ zb|bQ(C?v@k#_9r7tnL=+)3f(S(;~%aV1vYxQjMpCE*bJ?4qJT&@eliC)5$7Zw{kz6 zy)sQ$cQ$LbC4|SY=`9$Ou>m^IODytW)rDKY5It)iRi#SB{eW05SL6i$R8FQyZrq5G zVWXq`%rGy9NOT)q0g?yn<=2}22bs^58gb=vDOA4&jm@!6p*b^CB{vtsbv`BgJxcHr zM)>A)kUf=6t_93)_N^A3Qbdet9oPHR66clQW0gEmRs0x>8Q@vHxVHy4c<}QM%u;lJ$ z*bVBon@tj8yc7dGs3!gsAJFIETlct&355qkPxP4a*e!*N!IgeDDUF$Zke+pP6&y<3 zVK(EVW1|lr?ola9#jJrd1?Mzf=invMvbIl%Fkf!V6^cwJWFiEW6sqi924lp(DaBEy zZBFoMx;rWQNytl@yjmOMR&uN*vb&wTgdF5Rj}=t?XA*16+k3n{>)0xq2P4ND3yp znZu1wPtRqB*R?}BUs89K!>Q{mwNBHO(@86AY17kCnCM)QU|ol*ofu8+&kom!+Ne2P zL>pT;nmNk$iL)3^@dEs9H!RO{voOMBzNW6SS5Y7pV@xq*&Xcg9KyCh>B+17m>Pt4D z5M&rnjHgXS$8o?~+&*SSnhAK+@=TB5M7Y#5Fixo{GE?Nu6}zPn%SUnQ#Gfb)2(g0= z;l2@&;3nOM9*GqbvpSQtk9HE@2Sm!qS_O~`HsP2Y!k>wF?-KQ$J=7CWF`Gy~d(B?v4;)7NEZLn7;g)2>LFCU^gBjig?Xrht^;}@_Hyc1twm`L z-j%R2=`x;8sQN?tMv!rWCMIYyQ?UwEu*Z;U`PAD1)g2z5b#oc)iw1aVQhTFwz#R-f za&S>Yz8O?YuWvyrA%+_XEu|GDpJ)fztdD6kVzuel28|V1XTPk#YB-PhniMhQ&KjY5 zYYV&xP~!RVQd{5lMTUsKQXW0=@?zBm5=6hM)P_Yw=*ggv*JeQ{La`adVHK%T$^bP9 z)c=CcnB9@1a8yM>|Eza`d$1ja5Tn1DzM1f(_wn`RXDVKli?@qe!wlK^j<*|LU%}|i=SOxK#1&y&I_+|*o74` zgD|N>P6=TxNZ^Z_G;^NzN;Eg#S$qgnhMsP%$Q0zsfDq==1*|*`8TbWsVx+C&y>$EC z9x?kjLiQjss3n3IRKpFk#SQeC{qF%K3x>Vl^}uXrOoBpXZp{b^kCXk6xQLqENf>EtfZ#unkopWrB-V#uE) zk>8EOKOu*{Acnq9J;S{>?8Ce_JVU2;ws?h!#DyQs(n6aF9RPHii0YAqrKu${h%C?~ zh%_V&R3v~vS zy}*p4drbFV(}UUWLt_uBNAiM%Kt?cOfzgq4itp2>CtlC8A2`A`AdJ@<&%RVmzrdP$ zg)sSGjp!ChSK6a<1RjAG*B`8j={uo)UrmS0+hZ2QLq|#g7wjR61hI+;j|9wd9X!np zp1?D_LA~-w$;7}HxQ5LE6wf~-Q3R=v_hSFF`yURekGmpA+Bnj;AGgxCPxYN-BMpMb zr>>10*GA37Bhw2{VTSRfHn!t6R8&40HJ2!>{E)3V6fxVWUkZ7`S!*`|YA}OhF{LMX zLHCttNlUqeY9RC=)qB@I4j}zID{0twNQMs>QqJO#c(1&FDXq}hwE%r@)B2^Ky*D%tb>+;M{=<6~;3QbL0Ifzgwl!yN!m;m}yd1!4{l z+1}mIUO3Uip!8mUM#V`#73H(ux>mxJzn7zDRLl6?0I@>9TYfw+rMVgv&R;Tcc@{W* zXUw}LFAGr^2_>51vLIUP)csM0kz}GAkq40~7$mvUtjb-+Do51EpqLs@M3r5Y z=P`!c*Tdu!@KR(RKwuRYdQwCRdS`l-fiC*IV^haznb-L8eN2!|;bN7fh{s4_EJ6k} zr&^&2OTwuYw8LJ@&S!{djE}JYc$jdE#zXKGumABdEd)u?cJ30P8xq8u2C3^Va#Ml^ zp9NkZ{~8-jlxMVqhTL!L^uH5dwl}c zq@Gr%$J(F-J~{3>EbbZ5wx{N`ETS>l^{@|+Sra5`o<{Hrq1WU`e9@0DEd}0T_P-!3 zmY<(Q@P?~6)2KAi#AX*Y6tn`FZw4!A=rMF1g}k8YE>hF;RzOzVBY+J zx@iS++XUTAU+YU#HLtjU>4_kO_zryul%F^VG$H&7ZC1pCzy0Xp++#zy%?Nv;5&BRe z^ua>t$qL=(AG{{sdq%wN2z}uZ`uOYXHHarYltO$}_jzxlR9UMR1OGJs8RwL1_IeD4 z0l^c@M#icxYYFc${dceqZq_&}9LH~H+ zgQQu^L1sHVR80UhN!kio>B=m*T%yx3mUzTrRV_WU4mP8WQTdWMqXS;a6P@qMxlZGx zmQ&`s;T<)9))^{}ss-Ngkwz#u14+ddCu3=hZ19Y?zCEXsS6n3r(?!KKL3!e|bChh) zsT?e?z4-Kx3;nN+zD{j(`>ulFNHtuM2Ho(}Sjk{U?T-Ce)3Gl{qi^@&*zH4(Ph5#5 zC>aH=@UoiHKyal?aHU;Dv&?P_4sj|`3nht0L~&vN#54L~1$9ujR)Fpk~{#uFw>SFYwFtcOsVWfDMEHRL$E03?dykcbE()gc1 z1fN6%pGX8eLSo+nVsM7-q6qUufldI!3vwP=QY?OZtKPen8KW2zs1tIYI4-F*$wW3W2-|F+LnR43%8_RIxz=ww&mayhpS4HJ+u(p|!+TQh-YXG|Fd-FiH_-oO!cycWE0}bI zB+Op0W6W7{JIYVKRB~WVZr;Q7_7x7!O6bCtHEWvaORG)+1x#k?9>B=)H=*wACPL5K zM%dKy0{8A*Gpe%Xa79FGUEw6zXDK*l9AAFzUYSU~;Y*U>Yva+u zDFLA(ECM;Q$xNp(n|J0za6*OUEYqG9zw~#pNHHNjp-19|WQtGYxkRrQ{vcuQasvAw zq`hTuoLiDDY6~nXF*7qWOBORTS|w&?w3wNhnHeo+CW~3Jn3?r-x@V@lZ^Vt5^X`wT zsEYbi@$JmqnJZVWbZ|CgxK>yUSG|Zqulz*N8*<&qsF%Z}>lQN!mO*7hPRO{~<4^B~ zMA)>%pQNeYf!5aMOK+&iZj%Q_bawtHXNg+tN0CU?bkxo3-Pl=ljTCOXtsCd#_b%-yH3nMON4O=%cq2wToq^8&?l_$Ay~w z`7RXp+??Csv`Tkxpo1SfX2+##^lS%nE_pgF!hJg5R0-q}M^xGw`EN4LTq-ebotgEz z5;vGiY|7^zc!zR4e^lT5HKu8fYk~~3Jya?d><}(CgO!F)67?Kgl%!fPVhUZn)n$(Y%=FlK^?8`Nh3#?DF+7L zP0^(r+;28h`Q3dyzi)V@?>l}$%y`?Z-- z6=a;TD*pB0u(F1Ydg6wxBcT;oQD_>Ga$>60TjXq5ZujYRK?2zK9B6EqFyM$!Ne7q_ z)ij+8^5A5?X0df8L9KUMiKXG`xU3r?H^(%?`TQt>N1kxIf<&EB9v+N?7|8@vA$k4k zQ`)>?N)c@1tooDa-1>#!Uy%(=zj%jb$J*o7K5<63VWZMd4R2xNSr`Ya3bCX8Vdxk2 zp#623AC+duYzqkvx<@OdquW#7#AsFXbtUHg&@B7ABmbb%KC|<#^jH9$JBZV3vp#}l ztYwYJJu3efp91wpVed+Q8-b z-GXdVW6g5jE4gdkfbpQ0Xjctt+z4vS=~GOwwnee<4YsDkH`>_qUHJ^e!QY_H@U@Hh z?kWC(!5E>9Sei4G;tBwr^C^);*O&1QVe$sj)sT4M?S&0;3oF^0P6bbpp=I*}jxT7y zQ9~-NT(tU=`tdulzizOCis5Jyq*dx=JF)wY#!Z(5`R4Q2-IjGz>7%`g3WhUGn>^v{V1M>A0@->86G#=6E+c5iZ;gv|%7JY8- zQk2G^n!Jf8s#Iif?b?#Sp^JXz739uf{vnGq*D3?d%~|!d=nm1#TnMFUzlE!gjd*tc z+&W!m(q{|P+QHb_G<@k`_Wbvj0DS}8Gce+IR}FM;L*YLC={p@?3#tuZSk}Z@{$o>5 zhp8KtX|gxHl%D7}fQjHq&|=V=*PrO=wWvYSCyWT6`l#BjEbSR$qoPC}{Zz2lbI6!u zGm}Osq(HY=bhcW_zhufDT`hQKEoi6}_N4_@&K4%CUt*A5!H_3VVzAj%I9oLJ3P3dY z6>HW+!GI^&eV2PJ>Yz5lDf~)js0Qr{MdL?agmCSfj@EP2WOyQGx7IFq#$Wk2%B7n< zGy81sH9{EO?1e_+>jlbcF#DltI%BVadS{W~Sx*>1%(~;)elM3Wiic%5wrjwoYeckN zV$OQ9!0R%=)ZrCo(rD1zDGLe!#)x=|@-fGB|p||D!bbc|TNu!>fRdAQ| z+o`fn`#Fv@S&lKf-~J!R#$OmFWD33RZEoO1`^L)YS}CVCgCGv&^}emQW|ULvCm1!F zuW&XNpltMg%$k4wVgDvt_C_nWF^FGy{KKJLi(eoSJT%5`?MHp03j41oQr|hEqbE`8 zck|~_QQ890_RnsE`Bom%@%_zor6`+$1#Y<4<0p(8uV7*0a{75sl+w&L-&5W4g3Rs3L51o%TZ{U334jbk6d{D;rcTdw+eMJ~v0sknmB;cS8Ufx>q)6ZX3rq)jVQBB@_bo|_+hq^D-Sz2BU$e{reN&kvwR z{S^PlUR0O}!bbaSh8j|=C&o%&Fr%2?d3|$Wh6C%9mJ;2O=vqWPro0GfU|tOK!aH{$ zt#|4)D}rDGwk%%nW}y#Als!HNEk^HsF9`^)8)_$ta3e@K7?O15kuZ#Nk2c(~vH$pf zTF7L{q^vtk;fixa8+6dPK!|Tkzo)QhQ7kFCzEARVd=*CAz2M`LRV_~g|9E6+H7=Jx zSL5Z3GPTgjZ-4>y6)lCKS!o6!;uQmYc15t}{_{R&^)9(M+l!>46ROLDphb25=XU)= zH{1l^%zaM%!_ZFt>w8N?W5j;9;Bs%BzgCNkFK0>ad5$la&<(zI8qhgmT=qczk6E&A`1p%Cgr-%Dkzsh` zlpemBes|Ff8H~FuSy{>SI3^y^NnBg5-Db?|BI zNZLf_b!ZiEnGE5~TxH>Z7MPY40~h-W?jY7p{BWPh zy$;3r{t#z4l|m&RLtw4}bkLZ&(P zk^7aH35gLaGW$(o@F5`=ArwDhZqI9S?&1AD!~5gvi25g~;p-M5#3csQS7wkTP)LKo zP!+`8uZny?G&vDzMr~xqiObXw$UY}Tg&>KqlyLe2Ruq5gG>fcsna7V;*|{J}^)%Yz zSsP`=E^LR<(w()MPGuKokjCt%nBbg>^HW8&ERKpQ&rYJ&8gO;UJo4ufHFD~zoGdNQ zX^i9g#AQdyS_O{=G6xUV8v?4PUsVF$%1R7PXN}dLr>MD~?Z~`>V$_vhuOxc^` zDHjr;gV)BWDFw3nuGry0~_`1f}dHaZo(5L4b|GtuO?_W-Zs(x9(!ug^Q# zO!?l!X6hQOr*g%!FqA?{i#TnoGH+BWbh(|tCoJWie8biq(%d)ntOC5XXzLu2s_G5+ ziMKh~z%1>DUtLt8>cyp6q9H&Tqa>h|q@|e=fka^vTn*^l`&(9NO(I6J{W}Lmx#zft z6LgJr_tlMd>bxIjYhx)Lr?1*H6sfY)f8ge_dy}JT*uM0ZewBr1VCtsmo1sXjaJ#(R z{budgN2~7wxeR^V?CE#f3m{(q5^2O2_EX1@(FmrcHL)i?AfN1 zIGP7Iv>Y6pZINh%fbraZ>3!`Thw>Eju|r2NXe2&g85imY8JUyZP$0K#~3)J?`WaOl+GTQvZXo zHd9?ITq>^zE>JP&9sfLvFczns*C{LI6(UAQw}XXE=XPC?DK6&yZ##JYa+TPJl-TM| zqQk-`(Sh%8hvk2{%72p@RwaoA5O{gx4fSy%)9<`xzB7!_!5xQ}gh^-9z7sepz$II@$OF}ZvMO0g6(lo4+0mXdclt0ySwa5$$G;=^S7 zk1Ed*%KCow6CH;z3W!Z+m$J4Mbcos0SRZmt)-yU$c}K>8jBsEJAU*r{0K+}sM~f5T zYs&VbkIjf)GPO*?VRg|Fs1^lAEedLc?ll|68G|I7T=nKWFn&tyqNj}iTu;Skqo-3M z#{h~(#5wj92@w@ay_bCy#e<>D2O@4b0w`hlO#>y`Adi2L*v9JmRvCnH7g?E?3dAAMLi^Pn=${ddnszfzc5 z^d8_6LfXOLMY0va>VE=71H)b_VV0ED>})O=@v|y{yzYNObK`&r=`FH$>^LG>OL0)@ z&st~Zc@sgQP}uA->2S!4Tt#rC#?XlQWEsa$y)NQtP5;qo_rsIMKMclsa1CI;^Wq&w$E^5poO} zLh7EJX8T$AH?m=RYmyQtkKd{*MCDEhvLRdDfaUom>pnL5bh_~;d}J44W*5i_ukJ;P^>|27m*mI6#SU;um{o;0$p5jQ=+!l)obXWt;AH`lq`aekMtR zf7{*v@uZaufR;x8%8v?_ENo`=P`o!3Oo25p41=~@^m9E$<){1L8N^E>NC8Fzlvkif z>H~Cztl&w1rAJYulcp>$r_oGV%@&UR1N03eZqFSD_Zf5d2i4X5Un;gF5J1iYYXBO; zlKpQ8dBgVgM1*KW2UOAO@eBiYI)Z+?K>=n_@FXOhd?;5T0wv1S(0#_OX3a)p=Z?6v z?NkpmyW%cfX=V+LN!BYXzURX-t20KGbBtU%t^HHKi;Ryy=~8z%LLJIxC4uPNMuoLX zUWKP@Wvh{>LBpH7iiLv&RMjv8nyr%zN4%`_D^-frd}>*-F5cDh-lZh~xlI5yg>6A9 z@2@_2ag!iAGL$pWOkjtlx_jZ`#$sk#lg(`Cp>t`c(UMFud?T?88*4df`DZbz**ae1 zm2Z^3l(mo1k-4Z;)6g{O^>LeDdJ|;i$c~AWJWOeHPtpD|nNta-l5b?To+Xs%X?7lS zEi)&z(Hc{({>$0Bg_BJ}UA)mlR%w&%5v;c7r_ly&1m-(qajz>NYzlskF@kfiFJ;JT zsviN~AS@k>eQu2e(F6kkkuHq3X9KfvBTGx&HMaz#(v1VVxk>J;!k6@7N7C)8tqufbtV&+HIJ?cGM5 zA8|Vew(H?PhC)2Ju>5Nt!QYu7d4Prl+uxQi-7r{N{ydvm7`lbhcshda?9850f((5~ zpxXso4EbTl2L%9@9Z2!bkh~i^1xmz3HYp2`!E}(2w3&|MYBos`lOw>jna<;&W=P{_ zUGzKoyn38+qZJy@FNpINKtDH`IMqf=+<~1wPH8HVB&)x_%!{4Pt)i9|7rSW?*CO46e_L%Maq9KqJ69Xu0^d34XK!0*$rLt zGY5(wfJ_BIia{6bJV$5klDIRIQ(whlD1$TyET>BVc(Pg zVEp_a)8Q!t_85pffSzE9T4`_w+@cb&O9}wLv0n3*m6|zdQy` z6obAAHlzM_J7L?JFf0v3AZ1I}39zgy>ST$AY|j`mvC$*9ywTK2CdUffL(RZu-!{bF z+hkl%28tWjWo}SwvtX-AtWO8%%fax|N)oq3K0)S%h#-hX0N?r7A@jh5eA?g5h3240 zs?dioUm(%0q-mrOr3v~FehFKi;g^t#b^1T*F>4}+{QI%910I@bD0oZTx#C(KzFFv|x$ zWkYob&d`sM7+B(*^6cP6g#zA0?E*5Dynyh^R4U#RqBV_T$Pyx}XT$AUMeLeTbmYfQ zN!>w4x3!9VOsO+naO>dcWwomrqwQtwRel3DK|)4bV5UoFkvo$1I`(XLx)r~LS_^t} zLp?r%<`9Q5M9S>7BeU<6R{XtyZYz2G0J7iT1QP0=Ibh1RJk#@T6jHGg(a=cc{QuBH z0?ZjGS@t=f>BSSKP2e({qE-`P3|cf%->+1* z#RPYp#~A1BYpikZ&#E4DD#FNGW`6~U{&oti;8=SAH)}FaT4d6hf+wM`O0inxL!Lc| zTHle`cI_Z6FmqE(aooHIbx>>ISuV9b5yk;;Vph{OnGW5dPDU~2)8hVPvgX*b$^s8! z);@73AX6m?<%O7;C+Xb1QlE%{1cVctrPJ*z)DpNqDei?{fMBH(-}8Jj4(XK9KsoYV zcXXRpO|^NAu9s0sORV{h=W1`jur0GAh39Hz7HXx%>T#_apOgR-d7N*-nI%WpPQ-DA z#gzn$qQJxe?eFWwRO46YyXb15hiVjbd#3)4jB(&{JBqozXRSP`4o{V??}d9nKc%){ z%Xi88hqj}$@B!DIG#h)v(EOBwd$z!DtB{+wDS(ntR$`h>ug&7y9z1X#od0?{s=n~~a>>;R z2gDyll@6Hp8zCs#d$EU9yR5>Ifrw4&jX*I*H57!Dx@kpNVZV|ec0Re z0*4_y9fVLE>Qfh1<*SlXP$EECGyLM8#smP8LU(AR83mm$AI%GTni~>kwz0Lv;Qd0% zj+)ZWGCs^`8Ax_(=#JE8vC?XbOVu-ApfaUIkLG7urp<`u=cU&MBQ%a6wzQY6Q zYs+0l$MB4O2l(>?%^L~~1ljwQ3tK*iW;@jpnBr3Z1Ol2JDHqA!oOO$D^^rB|F<8gz ztgdq7XToynVams0++z=fd-l?5@-*g<6#Vj&&khSH(iSBBOm6fS7GM(WImjXDn+ICd zf$AYFeeRaDs>dEOZ@SmbVBW%!WWz4p#7Q>o%u5&`otk=>OUaJ zQ^R?V7_?lZW!1{BY|YwinPB80UnTpRNh}uf9vB^en<+Idbz{(3w*f;gIG~PKjFwmC z-P_Y{j;v4T6K6%6vAAJR6@sCxO_NG3W-zDAZK! zu$@o8E7kg`pnk4ad7ihN&>A3rR30#S%wQ`IqrWT+Ykv&eevO*72yt|~N*Z1P(6cy` zWDZUI&)lBpUy?;N`_ z%tv{vomB&FRbN&l8s?g{`BC(>$-<_sZJ2l7lL;MKxY-&DC4bC9R~J{itsNU}5!Y2R zE4jEIceTem(hoCg8nQ@Jvkq>?XrgY+p^ap$K47m`?3Dp0l!g29_GmY)X<#{slM_b0 zQ7*Vx;G584p$Gk;Vmmzj_7@%TAI>EFBM>Kh1R%EsIx@_`ru!tnj^4u-4B&h4ILN$i z6PgXSAZhu-`dAdpMOhpYHmpK&y7u+(_=cJ;5H+jfkbe~Wz*d4k3t9xi?95rh2U1*zh$@02AQOMmpjs>v$+ z0a8}(UAU%s#QO|+)^Hp+;_KwdP+@@HH-F{SF>DL}#&T%*h}b^$?D00VFzp1N=@0su z;hdTguAZZfulrn&*npE~Y#qnB1k!$Tgg5V-a8HRAZNRI52Ah?c|>+-175V>NZHL$n#2{9@J^zpVJ~k zTZKC#gl{;`0n-|I(n6lp7$p@-*@ryfF>?3?XHxvR%3=W1!ER7Hqd496^Ig$p2J~QC zCIhOMQ*fSxWBDCR*2;uqv9@`#vw3o()JqQLod4;~S8DJp#Vtz0r3^?GG1GOzHIjnj zceEfO$vDdn@l+R0k;%wuwlxAthtOH=JZpJwR;0pKVTtu`3cRLP1jq1Trnf1tDwtBU z^nW5Ydb~~e=OPQ*{NKO*XC-hF`eCm4iFe^a{IBIe{|#=C2RbkfCw*#=}%pz?S)*o!j1Pn^$FEXn)eH1Z6#b-$e6{Q3T zRU3Q9GS2Jp2|8z4X{Z>kWLmjxe`x1HH=V%y>waP$RJBAkQ^ly!6QR1!R&oLhc)pGK z@K4L6sziGZBmzqWeMi!6v3xIBP7h=aR7CDyC5O||aqm1oqKiYto-=kiXEM4|L;1}N z-JUMNrpMVLLHc>k376>AftvCQr!I^!pEuFz0$zPBL$-$4cQHlieX%j8VJ~z&Nyg?f3lRDSOz zkS8ARc0NKn)uNVD<{j13&FKi$LKBy*kyJ|0CU=hoL2XJakdy2hD445`txe`*COhN< z67(p}n3$#fp7rLqFTiy3zqcBKtK&X8!c$E6TBq8|Ld7T8ksk~eX6UfzYj!)6Y=JJK z>Om}t0q)rUT~G{=IF0B}%G!U9v4dJ!FpORqEw28@iKKFt3t-`hOKDMD8|8>zAHuSH z6YvR0O(6G*jw+f_T^$YY?;D0j>FE`_FMAJL08izZX81=PrqMD zh;n@Yh+ps^;U~EHwu^#UU0a@c=;2QordS;tj=VSfVGyI!dJDBo(vn;XiW@O$}pMrT0LE@xS2F!jx#s^t)E%|^(R2F(9&Bk1kH45 zw@5dRhDJJf!lY!v#IgS|K)Wn>HYdpSy9k~>Se@9cAVkx&FYQ)M(4XNviqd>0k)R^M zMIOO1u?F{esE(wCq|}bjAN8FG z(fX-(g~1nSMugBG1v2MnXTKgYJgh&Z^q-$WyOosV-)b zlMDw`K`@W-OI^ovSm3Z|gWTsFUxIewJfqdJFntYR1KGElejo4x+h2uUgO1#LxBPus zFC!OyA^WMPSiuKmFD`c>6i91~A&ab?@6*Iytbz_~(EYIS?YR*^gG6&%FoX-wvmk?{ z=j{8(ayC&n2rpJ{MPW-dFEBPx(uzHYVbi&J^UplywQ1=Bcvc-{tX*16BqpJ1cP=|) zTD!z0d?xH^e1ZwtO^W>WgWKL7(9X!0o7~|ZK%-;wz*EKNr9EanS$?-)fW57N^q)>U zYOccaD6!B`67v_A(YQI$j0v^o-mmflU338vVR^({enX>>rT3gm%lJ-MghV*>a&iVi+zs$Y7jOS|jr>(K(6Xb(Z+s%wm!H-s z`?re*rN1`98~xw0>%Zi;kQouYtY-@f0=*S-@XE=AWYf($OyqOUhHZqk+1rGLK1B zov3;aD^z;b(I?Nx5^AU(m5_uFp`o@ypO+qIM9Wkw&fQB@jXqe%t-{$COu>e^Namt? zdUoThDrDvmTPA&LXf8}d8y%Ubz1KR5Yg1m4J!)_fIb7~YPgFlY+k~MSK^I{~UJ(x^ zl#iGhn!8mx&AZ{8Uua1k%!SWu8dv~~=fa0C%u6iq{l5qq2hiL{L zl`g1X;t->6KhouBrkWaoE6L1tKywvfNfVuroqCqu{?Uux7T~6gvGGwIn-|))|555e zW-w&Sfc;FOeX1ArjueUFRpGW$Y8j_8%W*cYmCoPYIR}J;A))SR3FIb87DbouBRY$? zZ5O%J(j>Kc;jO^~IUzPdJd}H=!Fd%%DMt~I>309>EM3k6Wy$`NRcx~B=hK{*C0HK( zeeFz+s=T1xa_n3X7zy0hGV*2Zqz+lZ3AlSomY`ZRPS}4$Q_ifxa2%y`%A$hcXUc zg1&z8763~GzNY%Ke93bUUQ?@C4$mhK(L!I8hRN-)U62lief;Ki%pgzzlJSYQa=kGD zKqz7)QPK#?mTEmeAWu2|Qf{lxzK6!SW~YhPGU#eqD1+A8AJ$sqaQ_Nxdoc`~2QZ;k z(O5!06RswUU>HDb>u7-v~<46+<9hfl`V9U7(oj__W8>EhSGZP>yt5G9{jY9w^Yuyoa$b zW25Hui{SQYuR+u0%xfEBt@e+Y1CKS-4_4kEB|MO)1j6wOKgvt)vdg(b(h(LlI z%kvW}ae+aA`VYoXKan8cT~?Lo1!Z0r8RTL|%WQ6^<%!GTL(!v)gboVGN8VgC$%mIUj-uy~r3gbtj>ta_GkjtsRt_*u?@SmKldsE9uDpLQb@xsw|Bt zs!OA?EQ6OJJ&7cI6BK|SJ^22IMqce#!c0*5A#v0W+BV1fI?Dp34wtM?DMX6q=@aOG z=H)?%zJv^)c{$x@UM}#r1L}Xc!GE=(RkUp8#8KYKoKO0l=p`wqXN__(#77lve%ec| zz+!7M1SILWP^<7%6h%RSMn&Qjqat;MkW(nOub`ImT|^6J*wqmtR=S2%rtUHyTzi>V zzhB&Jet@(D4PlnlIKD>s1u0=w9bpVPEw2yjfrN8e?<7U7wh-f9j8>%#7Rc5m3?>AT z!j1v-7)}W;^TMXmWvWMVs#mamRxF~td;)=`$3d{vkm+{)FpHI{1kN2LBVIFGPE+u1 z6X7)M5j^33BFs%}fz2l^YY%K29rs}X^FI%F#elR{x9aDiu)dmC%kGFi?ll{UtUub` z)7s{w6>flC6+~By%E2adt4phF(FQQXH_kqr)?=y8KH6*ur?F6C#QE^2ufY1>F%2?! zP@xOH%AgyU1!veCWvwJ2h;!zdJbsaxn+1oDfjOKb9C>(`EvO1)q~x&qQ~5PODg8L` zKGmvGe@&FIv_@)kC;FzgLEn?nkZKO*p*{pk^8NF2@>i$gd&iMGZq%v=loq50tU_N7 zTI7`TfXd-J)j;9V`(<>JB;WY!*9@jhm{GvM*Gs_oPL}UY3iBm371lYndJiZpJnWLI zp&k-BKzby~6Jzk%qHve(ON)jchW#5u4wKy8HSbMJ=i97>b} zV1-Z3K{;7}9lGg1?6S?pidjigUt==j?Da*hLFxd6{&OisT6RGVoN?DP58d~%Tmjd3 z*MmGlZ?^i}LhtpDxw~B<%1m5LP)_gk09?Vuuce(o>*ukp*k3~&LNlE~@6J%5fBj_h zF}nZKhu^l%C4tEo5zI@;q8;-JB=bfOogmdduW?%iDsALjzKCBC*I!263Mzue6gl68 zs6KX`3HWpcBWn1?* zb{~ozhB6hAjSf$f&!PxAHYxWy^7(lkPC8*f;D}Q00wO6g-F+k+=h!=#i zFm{CgzP?5OmplHI-yp`6qJ(|sH*KFclg$6#9Sw~PKIca01%VF#%x;AL@!g(8#MR7L z!rIv8pRQRMHzohSTMj!N^!(6m5`UWekw-eH*1f4i8yJK)`;J)yURj6P)mO2%LX;;8yb>%?p53c(xBs#gysL1plz}nYFdjct z{3eaTyCm|`f~a8d9XeV>Z*f7}x~OwF9I$+}HLW>*ahwD-5cJ8D_MtMyeogQg&Yu&) zw#QqUiS7H$Sok@C6f0=n{l8qqIPs2_8eC&2VGFDiVGAwg-PYf3EzFu^ zIrCj|J;7CFe-If7J@9r{1=TT!#mME74OuQVbFDuCdXIlySAzk~EZ>KBYLAix_M=TGg603Wth%Y4)i z7msIh6f1u9wt z^yV8H22$Ms_Kx-jbkKU;StHHj4d_6#b43$1x8T#-3~AJmg`h@LalnArk7r+%W2FZS z{T@f5Krv6O7&%Q-p2Gt8xsZ7 z+Mf@eyY4}ab`nrHCW1CkGp!V9Aa@ck^otQU!C;fHxW_pK!q@~(W(+6Nk$#lFVqz-h?JI&h`%lr zeC?1xbPqj6Kx~9PhcF0R>9KyvfpEdBGGqou5;fFm8bK3lk_*0ak{r>B+JWqo|L55w zj$DX@!hQMDOZ?@F@c*;J|I^QZYr?oHEqZ<6o=B=C(Jx`F5_IRF2pMAMeF^=_jqn=t zeM`-1NKep~Znlw@NGgg1LVS)yXTeeGS$Yw6h14p^q`t8*0E4_iBE3l}`PXLk`7fub zs?|1YDbYUf1MOe7mLMsoFV9bNZtt7b4wG-M&sy}q0DAc$u3J6mQZwQ7Zc7=rTVoug zVpGZbq_Sf(Fm+o?_$O-TCZO4 zUcbIi`}6nWC)Yh8QL8GWF0z0XE=#r3{5l0332#&ji4Y$oosKYA>` z`e(f7Lwp4IIPd--3BGW&{%2ID*!j3!BK-Wzp0OMDS}JgsVNAX z1d!-v&6SxDAsf&@9X`eS&{+hGi<6~tsU`;|*qPphue^Y4gk#tX_zXs@%^1m+gvcLl zFNl{QZR>NNwPSf_t&aySqjXDBr7?@G4xWyl{l*c9aq+@Qo zbXHviK8QFiZhTp+MGTC)H%8S<5t;Qz9vh8EDSBTu&jql+EGBjGDCtzEybuNZ zDJ(82Y7<mi5b2^#`SqIUezFRh(^gd ztzH!V2gHJ&mI6>KIP0c7f2?0fs0x)$w_y;%WshLNV7evXDXw>*LIng-yJJ9D^8A#t z2x(O8vnV8lhwidGJ~9tP=imWG*1clq39uaNXA)K+e-+ZEXPb6IFYO9iqF|GdWM}wP z+^8Y6Mv>_lnpFG=uG(DAp@%2t)#J4tLvIjO6lN^c z5R$G=2&jb}g00nIV-Lq|Gi4P{H$`7s$d*FDSJGD&ZId(Gzo}l9Pp*0}itA*>KAGj~ zqGIc`>SRqn&b!-l63X0LAoOd4#MCcdGP-w&i?!QqhM}P3I zp3uWL3~`ake@p_%nQL9Srbo)(XwX}=xJ^`d(4IOqzmwsP5JRO0d~g4ly>QWJs93!g zrf_F1{T3bfog$U0$UC=4gOQF{dVgyeCZfaE&_Dmr&f-$WwF3{5s_tvXb~}605^w6{ z65~cvhP3cpVEGOAhT${GMY&xMl(sofKz#FXR#jAgyjd2S9ojVqYANOL8l8)wE(4jP zow%M^lwBMRxxtm`x?W8+|JvNdm=th+v(|)TjkjA~M%K6u8r^2{elRbU@j0+hN7d4i zrmwhz9|vwMShz08k-h!mT@&L@YZn-1nW*qXLJODu_CD|2u{v=quihnqOzL|j)o*lDu0F1Oy4uPiqHdIUi4c+A$*(A@%tZOD+Bg>)kaoT~6V9d)Tx1~~Q$i3yp%&$$5+o(!3vQYF9uw*lo#2qqojMdbQsxyj9QLqB*4-}m6?YBbe_mhmS3g7W5%VeG+elD-6UKN-Y~ z@Iy7H2!smg0UB%FPZ$NjhC~!zmI6^t`W_O4v_K5SLgVw56r2iXTdzG;xk>(KWtd_l zY-S;em?8~jKcr|Yxml-#EZsc>7FO}rp}G2yY`R~4JMhh{g<~eYaV;qs``oyA@d?YE zN~*E?6Uf?9)%akEFsZ5NIk6;}^_x>Sb@`)I60=1vv6)+-Ewx;LM|Ua=?hNGYb?moh znGX5tmLFZAaI6VgXlseQaRhN z;Tv~Day%P5!&tgYhb!iY^V?2Z^T1lrw4f#H?8R1YfrxN6-nqQMJiLJQvD_0e9G4@t zxk>8DG-r4;(T$V3-X2ZKhyT2>G#u+N0k-9hrYvYOr_JNnJ%~Bhz_S_6@+wDU;Z(Qj z!d`dzFMDX+hh6pgny7niw!l9VST0lg;D{FKjrHoBj%ejUEl0Z-SkMV+^vd(%PWg(+m%rvX9*!FDBb&KXz2xms*&SaXvzp^e?p{;5} z<;-0cDwHo#B*&5o-1p?^WUD%{i}$thvN^EJx>CZy(&t;_DfPXB{6G&;#{Mv|m_DIc z;>6_WNnPwz4ZOI?yz1Q6Vm3*9A&}`?cQgs8qu)1aMsQ|8 zg2Xw__Az7C+Qc$%!}u@Di``8K({Tv#n_}@h0UqgkoFSo6N-yOhx#IO9UUEt}gdIYz zV_@4Y&{I8d3E54IH+PMA{*ZW7fz(yoTeqM zRx-X_V&6XJbT<${6>7jJjtAmNfv<-p>aXmQV>Ml@70 zPZ;QRtnaK7qmoSu{--+5T`}J2aZSV0fO2``G$AU!i8nAkTQK$1g(s5R$PQ@Sc)h4P z);n9_;dG>P)J+p{wqVv^V@Gd?J$K0AYh3LBMXm(7vSC#MSl+lhcC1!Q*5W?eBt17f zrMk9hbOtF;?E)G=w?C}3gi}8(jU<7V@%p+~*WdS0IvNWksW@|@idRCT(?TpC+U^-X za5b7aN*!Tm`%Na|RqH}#uU9N}D>V!=H@w!X2Tn0tX6-V5NJ%HsPcQ$_pXHhQ$@MwY z30-_iw3>X$)aiGzh3bj_qYwU*apG%30UtSSg6*owJE=D#VFcm-2VMD&Gx=eKlT2UI z?M$0(dT&@(oYP&A)R5Bqdux{QTEeae6+maN>8E{>xW=;^#&dLy0KY|?lCa<&;sRV zRRkiBy1Ihe%Nhf}K`Hby)WN=;;Ar8@h`WOllmEr)tuO zgg2!&$pyz2p+HyViv23POHg@HFtbpwFg%%eJq4kr(KWFYTm(JUlu=DGKjS$elkh&! z?rZb9B+*4Oey*E&pWn=oz#;kC(=>DR%SP$`C_8y@K-5{V<=qB5G9do6r!pXDQ4ZUQ zc>7fAdhqviv!nolbWCtj0IxLirX0;CkyYv?7{rhNd{*R$9#3SSOVz%7?z{gRbl?Ai zg#Puc{t~tS9~7ui)kEoX`RRw1Yd`=jNavTzyh1cktWqziFdh&j0eQbibBp9X5ViPq z$9jR<#(QA)z1ikes<(gBZc?gq5q?f~&St)kbJ3gw+XzzM4uLe;L59b}>*UFXgY(Dp z#RLCW9$$R_rSR~tr#+-(Q;cqWA?UWLh3KiK(#EdzJ&Lo@%LL{(Ih-3=@Np!d4K9Hr zDrA&oW@KE*{t`hWQqt078f2?HOA)K;Kc0Pv=NL|r8ti% zg`_^^SQw-cXX-Rk8;KYo7E9b~HnK4B*Xd+fZch z{UmnNvKE!5yHpKCi`miTkG1!lvBhLiJ5H%zgS0CDO{qoBqBqm*zfZ~~1=J}M`(J1R-3 zmrymTqsvAvMVI#KqSu|YNTG5wcRAo3Ui8kK!!2-HLha*g&tQj+954n+i z!dx1qo6b^2!@kiyunGddf&xs3V=slz!d8sr2CZV} zZ9A#hR>ih$+qP}n$&PK?si0z~^77sDo%YT>?Y7tMdB1j>Yt3JC?lI;XefHi5M!K=# z4XbWa^RF-8+@H*Q9c3~RRYx^~_EJ(>yv4>)$xz8b3(n&GF=JUaV@+Xa&`i`4#kwo7 zQq*~_?FwdBE=J?&ydRhnYbvy6%bPXa!5k zV}9p^v#(-WLUS%-^1n1ohZ5SAZbdVBZFI{Ff z;)AO1RCYQDjH<*@xlcgk(^aCkv%W8H4-u*&eUKGlc&c*4wJm=`W>e`FIkq9a-Ty{) zRd)}}{}ERltNxlcM*h4QJEQE?9|_!IA260$^?=%=dIM{-P;YB@I;%~^4-Srcxw*P^ zj?cT;1z(dG;I~*PI3pQpL^_O*;i0T?=f#>7iITi%=s{*Wbi%5H5>mS;ciix@LHI2y zD~E(1R*~O2;-`KF5vSQ{qr-IU?^E8?RMeyI>Ftj$j&A~D$9rvgddnqp?kcw1kn ziL-c;Za8(8VD*?xm)pXDEy%eTant=IVih6(-}8R>JJe=WqWW>4S<<8%C81;o_2Kp& z)$~#~r>94&&nV^Sja-R^0h*D>%CBysb|@(Fe8AvSl}F15Nl(ht`$_N5`VR+Y)XU{P zJObbwYW=fnhj_0g;1;u^w8DzSuJM5KcpO>YLpuxNP$hECtk==KMZ7^3ip6j_MDGk$ z-$D?deR6=5`~WVS*Pbjk>K-T?6<}(qH-B8zxvhOZgnv`oA-WN>4iVph55uyC(E&ja8hnDFG@8U+8>9$^> zzk6Y{=y9gCl}XRgFxs)EwUu$t)G*uehP9RHwozfYdth&rr7r9YKtw7B zWScBVO`<^m7(wr;Il1I#KE}}10prhWr<&a{%1ayU&h*xGGwnz96N)V2*pqS?bjdEZ zHXUrOTG(wJv9O^s*%#0l1k)p`j-Z}gZMmiCW8;y)3^fWj`7#on-3W*4Dss0dS!2?+ z2AnF-fV1Ee;2OH`^lkxi2T|Wwb>Vu>AajbCbs%dfzwbPPEpV@a;?R8GxdB`Fq6Oek zecyQidOOWv=oT;pGt2)n0saw4?B{wzyM1n1vf+!KOMLxrhxRpDf&umyMZypQ2uS;X ze`pIEo9H`RISJX?n3$V7JLo%^+uDeJwbHV6a3}fuowC`NcG>9fhyOUyn^m@yu)p~G z+DNN)H2A}_lJ&`|NhCqTEz9&~jDCyCigg66&+cnl1M^c`ZEMw!_;$nJo4E>?di&IR zA#k}53gLTRe{(E5x}t+6FimstU2s0-c>0{2=Qut+_4>S^_PIZEg(%E26c&OuZgKc? zis;NS#!_?Xh$xH@)KDoZf3G!HpPdU71R))&rQ9n3p)bEYhtyK@`Wddq(v|O58L=sU zC?hhCwLO2`65@(+-*K?I^1j|-hdGSi@=Tla#5*ya8N=eef;vCpI8*-9qz9p{;9gjz zEfFSLW##4^W<)4y%9ypc;S5Try#P)ea2;@2&Y zfp(<1YXhcgbe7dvVxn^rK@Od{a?m6@Lhn?!t_VV=_S#vKA~9y{Qsqj+0w3~VyJSgE zd@3CFYC{KOmxrBqg!D~RL2_?;y=xAkNJWPsTSJEncIN1W?$FzO3&|#MLp540`0_f! zuAHG}RBYJH_|^oQAwNb4~^OHhLNdEQXP0fc)GJK zzn+m<+M&>Vkq{@3-1PIFBuQ_k1qax1%4FUp+02-(z*GeNGGh!Rr4n3J-V{~Vl~mjv z)}gLqNiGNBN7LjVpmKqE>AqVsPz)x!EV7swLrPfN?0xmJFW3wUj0AQ1yO2@xt++Os zm^%&B72RAa)N&YQ1`B->#^VDi>)S;^WCPO$hS;p2rq?8ZzP&>gjCsGn4u5z71y+U< z|6fiAz7~<7j5Ia2kcnB@=9(=+ZTX>WNC3SJcb;9#7Z(6BtA$_1wZ=91LOStVQ>?&u z82Dn%Oxq{e(`cks>uqIhZN>BbhmJTWzIYpN3?|xw(|O2MxqcL*VhS0x#ZkH0`g;o= z+1Me(x}cMw0s!J=w@C24kb?!gZ1uOAih2q4Xihqd7?=W$LPi@1TQwxPTFPuZq>sDZ zsrM&Y00i#`AP*@oQI!SqzEGm#4D$KROpX}AE`xoa@zv}bWOB(8e%SYf;tM$SM?S9c z8{EMb#2Gl-!Y`wH$+b<}Sw|VOo%}aEBpD}LA@Zr5Tev7ATV!wkg5Gd{GCT<~^OeEE z4e<{Iw{Zks@aWUh!xLnfUFKJ6?-;_({-0j{B3|J%*)c(kdRavfs#K~L>^!kNIr+NV zoCz`c2f*QmSkug~=mLjp-;-W)@&duI=#Z{CK|&z6NuS1_@4aDC8u^9rV+Bi{BL+y( z;0sIpI$iCmgxm2x(ZaQ=!bcpOHrEE_uim=75|SXVQLB5&)LiW$cP=LMJ?KNtyZq28 z!(d|eNTo$NN&5Z_iohy0bp%Z)#1#UgF}Tq0lHXTCHS`&x+wU4SFvxU)(i;Y}$<8CI z3&FkqOV^OUN{NreWb)51#tJjqet5151`6cmVa>}Y|)yCt3?nW== zW$DQ_=3{sV#1UZI^W>s^=Z^Pe)AK6(U30Tp6JIgETpqKs=bmRLP=2SjX7eixY=MO5g)NWypHj}OvH0m5Ly@6-raLR*vk2} z2;}86l4Z|i2D{fO$m(FN_%qeE(bS5?-k&A#YqTD^eQczd-Atk$(ml*&Urj;y9^(B@ zB##?j#GTaH5sE(o13+(IeU@z?&B869C710=(5+=8VyG$%*Vw_q3`@$_5QWB!nxg!) zOP!TmL%^N|yBk5?5vj`|&7#gr*y3eoEFYVgY~zYJZOS7UD_6NZAA@{M709E^w3_D| z%#Cq0-Twq-u|A+qO;d#As48aYQ%X#ws7x#y#VQOkq2DVntKw`i@fzp@!%`tSH^r;S zOeKi-2~wa{qGfE(F~__Ms!mv>T1hRPu1U-6Xe|$P-&l@E5Sij`5ojw-t+$wP-G<HUQ7B)@-?wKYZkpG@(?2q9bSkg`rFc>CubdsssUcheN;%q&pY znk7qWVk?*=Z!;jXmXc#) z$2k@XdZ?6j3#}S9&^*jFb-fBPXe41dH&N7`OZ+*sds`-}Z*CV@skupFzEuA5TX@O& zN8g`N5Ar612zL=nf{tZ}5Z^9}R z){1fb}aU#?y9O0V^6oCm~B4^k%maGMr3Btm#mG zW9o^>j*R$FXYy*A1yQscVk#;~USlfRWwN&wR{~|tLV~;{nV(U6V%69smO_1z8(JJy zb!5Ce?J(JwV+M^G7WSE@f@+l`$BBmqKrT8Ms#GF;vDXIalbt7A(o$|~@-|FLfF%_X zo3U)tRQ}&tEVJe1Sw62!xG5G4#4>`kf{|OVmo^yxmqYeVqkvR$JnM_VXgtsls;&K ztTc@9w$K>93G?ncV>AuaiXxDxH+KX+{<^B@^&mAlI&6pL6AI5$#5JYPVp7ME1ck4a z^jXDpWRFp6oc>yG_ z9B)yQ=d1G2!abAI9;3!m7p=0RNgaECVr(op=-BLy?HWm@K0F9q5evDhJ>qhg*CXGr zHu_G=nP5p$Zs$4E=}W?tqs^Lk-wQ^^OL+T?t4tALv-VJ`0=uFtm7(rP%+=!R`GCpm zRyU8}Dj9lGOdZEHqm`$G72eQgxMYihc;Bzf7KJJyWe{`Yr7h;oX>deeLFP74vJ{_=}@Wx@2ZXtP1pz8ffv=hIp^ppTAf z(I+fNR-Rs7*V74i;EkoMKeSyDwi!PdzxIHb1*$`m65vq#5B>PX@(iazt@i%pgx-1pfh9A65R2c|O4L z${2poHfU&%N3;rWdXPr2Rr7wz;gX1kjYvB0?cd21MoGf)@x^&W41pR;M^f%UiM$e)`(o~LfuNY3AF@>}?)vo0;kbh)8rn{L7; z6+JO!+5&{qh$HY%20OLXV>M`Vj-1T%_kql15tM}le>SA3Y^{ z{2|7k!rg!=qyzYDV@!fC^|}tGPyk0CV&=iliCjYt3iqWyELv z|Bk^)J^?#)f0aDIUwGwzLd`LEw6oH8rx!GLveviz@>Be4^iOvj=a_y;fINc8@5R-! zO1gK5PWw7KP#fW_e1kNa-I?CS({oq06hsbKtFv2fUAI;ie1Ln}a*r>{?M5AdX2 zHt~$T$Y{5-b)4M5{*???Zh<>pVw0sKF2AO(lqL>5_g(ShyM|P`)Pgo6@0(EDOIYTi zlg$sv*6(jeaV2Lx3DpQWT2<}g+PQ~&@$Avotjs&Di~ zQ2QSjsao0kt0f_VPYX&6-gj{2LzzRB8hSgBTa!63tBggI_dK?}gBI!c<9~vrS5q(uwbu2s!bwi8_7TznV70#p;vBB5tZ{4?!yN(H&De8k|f=*`Q}DZoC^Uko15&XCN3c6Mt^hnPk+;UpKGeH0)Ju zdy7mpyU}A;B9YXW?tox%dW1wAF9z{_r ztzag!FEBq^*GU!;Eq7{iuRo}hK~CwnO4QIe%Uj%UTi=>J#%J365v#Dn4AlW4{$i^v z41sSjQog7X?Y5Y!!*Bq}FfrAnU|KUL3UFOF=au80bIjEtLr}~MMx#%$H_Q-~A1PDW z6%PeYRO5Vr1z)2-!HpxzycqD7h}jV#*Psu1%=im?iKS&8Q(CgspogiKI26tvIn;() z@ms4T-xgpjUu3lUcowhQPh2&HXki|@bCQG+9i3od0^ZMXRT2eKMc~JXix@YFXhR`* z{c^g1q-4DX4?)clH%opa=>Nb`m?RDX-z2oIiY|GeLlBQhrh|zxEC9S@FpM+j$TrU= z%K8W&G8dFT@gveN$Ry?6D+1qGZ4^u4jF6Os$xAG>iRCb|c4s5dk)o2ghHoDLAAop= zo|U`Onw?4A zQGu=Pv$-5Us7o{7Pb0C5=g322vt^*yDkC z2#AgnQr=$^1j<$JKT3Pj>`@ui+$Q&GjM&r`6C#u}!H`pV=kYvuaS=VN=4FVqnjxZ+ z$WHMyCtH(I*ql)^qk>RpNqQe-CckioxNTwHZviu!(ZyKZM+|(37as}AD7wuMkEu_D z6kB8E4Q_J6uJWJy>5Yt;^-Q-E2u^=|*};~|2%OV@&u;9cX%hZ;i*-h~Ckh(zvkxSA)jC@>!NrylBJM{y~4`v;Ty8{dYc7v~{*IGB*0RZTzP+ zsQPbd&@{$>NrUW_5UJQfQ4zZQMmHmV8UB7_7W ziIPM~Vkp^(^@9Q0EH1e7o3(dQlRaH_xm!AZuNos(ylCs7S;nlY!A5ot@RUJ>jEd$E z^4Ye>oCHC`&=MC~!pv3KF2v$a#E?fcZ_y&Ac})~2PaEfYthnup`*vX<+G4z>xIW{p zXk8^Y7uYUVU6P8mwcvsIFpSLF1Z{fAl>g#&l7o=|)Pkp|I~+!BC+OZ;>GL}eXzPq| zE=5eh3o{UgDk5w(YW4ndI|_hk_15$+(PIiW-;~M+Jwq{J$QwrNvR{)gEYa+`T3{j_+^P$cySu8MwZEs zF!_lG(MVgTI)X~5BmIj3ET&Ev_(zwnR4-nC*A38I2)i=9c|AypyK!J6bBu+DxuyQc zvvqT%N{8iP-lWIu(2*G-g>lL^VIaO;sGgGXPB7r3&oibgSqFHB>u?bg~ zQd8q+ahZen2Wfa>jXI%W%I!If_6e!@(?X(?e-2H`RYIvS)u26M_F(ELL{l6HpBE_i zd;ELAsOgLOOT?EOZ6oaQvM7tAhp9> znT??PFPV@I6!T!?D1lg&A?mmKaJ9NHYh`&-xEr+JVVY(5VN13Ze$+vv8S5fm$;Sc5 z*=1`X^Vs876rK44As##O4%-;>^e9e+cHdAw!6cW2a1rkdVmZFO*@*;&dnDD)cL`GbkKmchY zSc29w5+e;Cn*C?@F@B4h$bz#Z_lBbPmz0Yn( z^~Q0Ss-kjO-X8df)0YoIP{WI9iILcuK_x!)ij*?+2UjxJe7yAn16is}fLU7w^9ozE z<%X)8Fk|n3z6uOP852#v9%BdTGjE$35nC%xxh!DV=x8N{<~**(3Ajaw_%PE;o6DMxz4>v;k`vtLMo9Gfz?_#=qrF}R;xNChd zZ%pbG!)xTpTD4HFhpKd0dj)D!UUrks8P3bMdqUoXMJ4a}>cF+?Zq2AaP0n_O#>Gch z9A}BHKhH2zK!>P>kg$k~6ctJl3p3JPUx^@-_7j)6BPBZ;Jgh#^y!)ofQTbJGpeln| zi5LR=$Bx30m%DTd-K;huC};z0GMVqRg ztP+#n(Ikhe!Bf{z=%Ag7zgMTtS&TzvYPTt49r2l)^+Cc)$=Bv%R$_3&*6x!4%Jx{Z z=C6@CyJFZ`-cf8T+@t^-9L4*%u%>pZ1j@5ulnH zN;@h-r>qLN)UcNrOL4F&x#!m`h?DUyq?DgFh_JxN$;YnN#D=JRYV?_>%iYuf^w&Kh z@OC-j$|T40(}~iF1ABDBb)YnBe2dqJbY{=$T(6K=tXhMl{@|_=lA1pO>kO+KosBDX zuWMK;TFZ8*xe|=Imd_xCSi=l-bvNAR{veir#5i3cR`0Vh6dRl55AR4hD%IhU?Uu$3 zi&zYetc`LEWp4_S&%Kip&Q(zQ9LMB@dkk3@ofxYPARogsvf{AB?5ALdShabwqpku$ zt1yk(!OckI242YfBQ4O;tq0hT>X1%$yiqlE)*~`0c_m71P43aQT#9#$3?CL7W@d?! zf3v;CX?s1KpBnu?UV zP4GK4@vdvnH=BHBB>#X_L|&@KMEB2S4b0eHTX?v#my~x{tN4SRO>*ZmW-k{v9Cs8^ zzSVU;B66GWr|{84r znrQ3j)q>V{0vHLjgo1ZB)E<0m>htyrxCJ_xT9#=8j>aL*Y8KqX|J~_qh~V7V>*o;6 z48C)q4uwAA;lR=-7gL-yWv6;q(SuV*NSWM<<%Lh}z~p?}{!*i^sQbj3WZ%a13tM#0 zrp+t!)YwQjhN(ev&KYh2b`CXc|2qn0esWuG7I2vv(X@!88v^$)9$yj{E^zz`>|pX= z$EVRADN%ya9-OZQ7NefuEJkr3LX;uh3Vx|POF%^#XdHlRuB7@^kByKgWS-#J)921S zzyIJP{4FkyD^a~DcoiQPDljH(Z8COl%E&G}b}(CD3`eTWmLQ26o021@GK%dWC0Q<< zsBWP&9!3}KnK0+zkRp+{&n4;7u0`lN${aFZ;+GXNE`;hO`E;w&qE=8E+@+u^9{oBK zX{2Cjaug+RtupNpWF(3JsC%Vv3Cq_^xOFX3l& z+DX%Ek*e>HYG=m*|7#XbT(O@c?qHcsb!b&~-r>6(ROei2>w;_5X_81s(sCtj@^vYY ziy-uD0szrvU21+j_IfgQ=A~AGnCjCJHlJ*lJ%$c@82AI0+Q5@Kxjo`cgaQw_PcZSmtDDX{q}Widz4SXOeVFgA z2%~>$k|K^8)pdkoF!DG^SH_v&t64m+;Xf#x+5q*I_jRcA2gzX;sz<#%U?Kk zp-c<~a?z#0`EUgRP;ui9YCVECpqBsJ2c6kfi*sDT58pTXvgS-pN;2dANwAC1WVW3478i}ixmqI@h zniwv+-OX4Xa{XM>Nq_5;ZJUnr>5=-1uZvA4LT_%xwtu4ktWAyUGk%jlcb=R&K_NWp zN{X8V9ttsnYqL59<}M{^TArqiR_TrG(y_QOQCpn?)MTVTQ8Yi7dE;^e@Q#xPrU@<= z!$FUgL}_PylHTHsdO5n;qCigpo?iIIuI&wM@4ElJH042}%M1D{O>w@&h5sKg%|9$N z{;jI{`@>C9MhYN+;B9DGSZ`6i^KfTY-KHFi3aJN1{h1-9* zJxgGD&OrsFx-&Qa?w*o<{5W`k?E_}BKCCx0gq%QArK!>=Lx2+Fn!RBpY*n&Gz9rAE zglMG2EsN~gQ8?Cc;kioE%qQ+{Vc{xoG~w%+L)@!63hIFvpkQn8p?LN0Q6fvoc{EmY z&v!~jlr>ATb6&hV3~ZbCnNgC#eQR*#I;C77P{;JQt6xa)w-mgLsEO~!z7#g-vxR}b zYTi((=a928w{+eqi&?zR%4Q+1`XiXJsH+n+e(DMFsItl)!?iGmM#Ue~=u7?E2oYQz zZ8<`HGDA04>c_pn`C6ze*!bsPkSAxw_kVQDfxQz^-5mDsz;8b zji^4d$QH%OOJLeY@rIvCiki@l6s0>XxnG*ee`)>l*H`*bW&s`1UzUn6|51;DzcI>x zY_hVxqvb#Lw^&umbwTt?$7IZ5~KvEBjkrcF#AgP!^^|(th zsu*`zbaqZ(S2AI<>a^g#T`;%Lh9bhG985dG)%>5D7~ zvlj~H5pOx7aJXR)${y?_B@RxA8swxY-Wu#g4vd>|GAZR5w?{U^ctP{4E7BEH)EQ}M#ahfs=WzR-#uS@c`#EL`iw&n}dZ)&i zeLLE(p!`EDG-2tKvzJY@WrvMs6E{3caQ$CRa_;j&)JBZMml5Vl1tG1LwdP@+?&Z{W znzF%zlG|)(v^pkwjz+H)=9zye0F8^>3tfh#hedk)E-p2zQ7(EZgc;7`LG4nd(d8P> z@tw>>c5`&HV|6C5D=6o7%)jW+r zj*KJgYr3L&7v38wa-;%vNXxODf&w~6EOW}>%@uv*s4F zu9GOZSX&2e(+13T$kH%xcq?Y@M212+zPK}AeZo=k!}kocl&uBjn-~ z8U30feq^cIqpm1t{Rq)-deJA9p+6h%ON_;3H(!nE9o#CKR3f9~i9{v^(Ah^0Op%<( zdBjp2(R!rmXdRR4`WF{KY5Er$fXiXVgkpebN-W5>WI+)_X`$kIp|Vy{sVm*EE~|Xm zn^3Ay^#Gn=Qe8Jt7pZ?Psv5R6O^D`mt$_JbPDj`x(KBgn>BCD!F8H%G zZ(UzCV=5a=Xhp)2D}s8G5Bh($%HPRMEI93xj0;mWzs#qtu(L%RhJ|lsV1n=a#GQNcNHN7N0^)e^s$fSF6iz#dl6Fg`EsCBSGh$Kv)tG3_ulb9b z9u{z>XS!wRF!%)i#2g_$39$?KYS?gdTra~Nq0@-L37gcbO4Gu54t%IJ;haa(hm@xK za^+GN5{^k$=7;fnIMqG{9~4u7Gu{6AK4{^*=5SX3Tynt{cFB<%KZ3Ra7t&AVKHa@N!0N>i38fH{AAa|R)!2?k9k8!U=O*9P!)nnkE~U!~8d<)!J$NPLHNhABaeq@p6rgCCmT+stDHIl5 z10)%%ResbXZXu;SF^``JW9-)ACB$ta6gGuolyXXBmtz0YesTLZrx`@wo^K#uEJ9oS z{|F=hpO#0^+1$$LpI2%_>6%X1OQ<2Ah7)*Fn7aExyGckO&H}1HW8*`z1_^rHWFX{h zF8d^O)tFL-o{H|GxDpbZitCDbwAStSKE3v(O|UFv<{~ZB_-+O8-WIyM;5y^j zm)nIm>J6e}MH$I-%dbyaa~Hoa9H;r-a6;MnxV+H>aBRWtVXyRFKqj(jbd6q+CQ^T1 z8N5JEY|%W`ZBE>(q}0}X@dhzmLGNQfmjt~DsmHttx&gs|J3Avxv2FAs4|0B{n|M<1 znYjf`!EbmEI~t+k*MFg$m{IqczJ*TFZFrX)s9ocu*+Ybkg#v4Ae>XBvO;-gM7R(bl zH~|K1vSyA=U9z+K8!uN9dJD|WgH%ehRvr(tJebvT8K?cq%P(T_&gdEe$4ZoR5S2Og zT>J^hB37&9EqbzCD-uWq$C9Bkcizzo;o9U&V=*c0h@VQAJP9$=S&1n#QI*i#DTb`d zm?L>WRB8B0n;A(a`Q8f2Qo2~wzXfmXkdbc+PI4k4d)i^~SUjdyY~m(Ar&N+(T(D4* zkUp2NW>%Y$slo&*$t2d_vJoR}EmLl8Y%_MPv1EusDkI%%uS`EEO8*_6S}e&-W3IGN zC^2-&C}#60svIs;RB_4#_Vr6u_rnB=&qW>1KP(#amQL`Sk_MX)VFh|XtGAWcCy4*` zJdBJ?hCX$+1XIJ@R&eY65AWC#%l1o<=Diq3e}UZif+b75MJH!l9~VW|C(1Iff&B?is#RUB7md60SL>E|McmQ%mNroj!K5?>0sjWgoBrh)EaMB`n$UrOP z1H~H6nEL>GjV2!ZyNW*#Wh_O2n z^Zci){j;@!=s>>UeTQz1mNdkAXiCAJDxo9p4CIvLa#`v>z7P$!GBc19>nsO+CsJeC zj4T$1Q$<{PH@J0E;C8&V)ls;sln39eQs)A#nOYj03?rlHgpI8FOfa*>=eKwJvExN#8|>7oMx5b{OxUXh!OFhnd|}hw;^A>n0C4 zG0A_**1sc`8fW$2G3o5;&g_d|`VL4j{h7RF(uu!8@1m-E@Xgi1n?DEXUZO|%kZE;7 zmv9r(n`*aJa_Ul6$~;}qTIFW+ILO)S*G2{ieRqkLhJlqHq;|Eeodk#ZnXPzxrbW2k zReqg^J4z~{q~h=^0aw88x9JwAOMD6Z$&`8X^^;6w3HiM=A3IlJ+GFL>y??oEc}aN* zn#sbN$8vu|VMnHLL0D^f(Y6(xx%12HiW_2WXHZXZ8*1wpSrh#vMEQ)vDWE>$S~gO10qWWwRUpR*Bu1;^*>oiH(Fy;{K506}ju&De_h&eIYs)~G9HxTPyo8$) z5XjTBLz*h!baVKV!_hpr>Op5ld#w#=g#acGlGW>QUI{k0H>G>I#feFi&0-_X`V6R* zCi^($vZ1%sal66kRI_EI#R<2LW(#(-rg*LRF1smK!?rLb2Z+@HX)1o*ou!_oVU%V< zU67`Kw9zbGOz03M1)nQ?*y+2&l4KXip13tPztYTp|&fyX#^gc;ed#6D=W5^1DHiUN|pwV_kG@(3G^?svH zB^^#GFXAFn33bVZ!D}Hhx(e69+}H|wokpAv+O1Vpofv6GJj4GQUGP?Q)4i_Rlsr@L zdsweSFeSKAr9BGgVhMXC(izBauOMN~;0SWUQ!imDfC7RqQvJ-nso&!nEFhl{GG<%zL;09Q#H=!`_81H5bq zu<0Y;(qlEQs|MRp1s+z3)8{U;YwHuntcun9_?j+>`AF%t9`XSQNsoUhwWCbMYOvNK z9j!Trm3=hqVjt5P#*VreaZiow&Qi+0z?!CNP_q+^)1I)Dc$C!n)}VF+lkfospJU}| zzPT|cZBI^7Y%3bs25xPDU^#>rG^8^)h|n>_;1Z!(uNkGM9<`sh8oDv$Ga1HcH0WPY zpE0d2BfaZlSp`LQS#ML+G4;mo^z9r@WKcq@8$*cqlgNg8{pc~p!dxKXm$N@Yb6DP7 zw!p$d@$`M@et{z{>O;U?Ql(=d`-!=l>00I;3=8^+@pcw`Cs$|}r|<9*=jjw@^v|!j zILOIz#-N){U_XgEw_5Rperrr}IGT3e_LwF**~hs)&T@6Gc{uh06VuMJ?Bc`+WJNY! z?@IUjPS4LQ>_K<1gV*8g6yT13QhVXr5OD{LFmyPw>J+j$KmH5g@fSC^wDJ<3{)-zt zit``I4F8AkjDM8DLuxOsUrh!6kZB7poC*3zv=sy^MWmI`6c89_QZ1#RL4i|6ER4;< zl`z|rf&c39f2$!V$Sc?nfRY3fv0rg~=YMDC*?wb^XzW_mbGQ!O&U`xd-s!e|+4lap z`)xY|Y6kcX%(7Qb#U$709x~Nvm1B6vlZn3CHF`|SM&IZjJXL9>V|d4v$qteh`T;yS z1k7gJz&ZLQZV6rOnmWd13thv}zoW~1TJ4%SrpSbUe`fHjtlNo=ZKG9>eYvT}&wair z2ceMfq@A$iBFZ?&ssZtRYr}-ZjtQV*XXD%CEs4f}O0ofeAp5*($YwR1TOA}DQI@Ce zc&(zFilQ)cf>{ZJ%^1FNF$}%L;B7%;t40)rr!1Re^gfsOu1Wuw}l6-(Sq&RG`qjsW_-njqZS!vk4VIpl_$#>kkoQE9I%D?j0*K@ zAjHP;xyNj>iFPISfQ7R*Kd)V^aUjMzB#<};4VTrKebr`oxXCQFWQ3xh%$9_aH7Gia zEuOXbn<2chXylyv?-ryNdD9tL>r}KTvt{u*Tes5u5r`U5+`^rDXMnRcR%6F(xCk-^ zeKiUwS@U_{GKH3~Q5%L~Ay7)&;5GlxtXMnOh|L zt*3%T@1BR~+^IJXahp(~zo90%uIjHpbl@#8El0<~Vo!@&a~NDFtT&YhW*9nboYTZc zXEcRUM}|$`;mGFPPb*3b^~1O>;>8Ai7rop9O`NB+)ae`XB`7(2dbCimg>obtaXA^a zP+cA=>idQK@lg(1tkQ00*DSPiM8B@(=Fv#RctUr@Cy-8w`*gbaIDB~)G=f9F} zBUaL7*_Bh&S4zG%&(hQ3{-d7CmSBBaI-lB%a64d$SBl}V2IZ+X-pq?EUP@U<4DiMr zw5{`eaVyoGW6r!Zt+~oc`3wz_sCx^%ua&9nZMc40e3l~#3BH0W6p0CXtezxyQ!x-Y z!Kz+;##37|o3N}3-iqRwTeVwwv9XXL+R?@LiA*hw!HB`VvyRFHvz?sP)i~_v%zMbxdu?YOL)1MYzIDEHq-N zO=XB`vtZw(O1VB@D!NT#$bm+=9*n*0UKe11N(iRX)X<(YMfAr5HxrHR@>y#L{aJAc zl8t=LE4WrA%K+Kb5zACLYlxky=cxANIy>UGz0MH4mCv9YmCrD}GL@riScTZlM&Z8N zg|gj(uW12ODy^}{CTinPpZ5|yAN|xMH}E-3NH+(BROfJ=maW95{dHJr)u6HAeWY(V z8AaL&c!uU4LR$QCDP(%}#+2!aZGlxtN6L22lA^jfJv;?2wv-A~pNfTo`$dxsk+PgAo-}BI5y-XKszxDJ5>mIsy ztOwgZc#YmE0|%8l5WG9s@}NTPm0LjgHlCE{K*$XRzwS2rldXw5OGvMcrF~6XX2F&=#;v`?tM-~Qr z9N8x|_7cS~J*o}waZC7ns|&T@J{Wl_#5l{(g{Gg59I4AiHuB;R^7^#~}>5Z}*4-_s9W*Zy!yB`V< z1^9|lAbxxRdua+GZk0)3Zd^dCc>mJcZfVhOwW1vX_Inlzk8s8WxLWooNG}PvEkGOT zy2*C0 z2L3y*lL+{#c<#MAzORR0-VsjCnm4dAb}m>3m%IVx=_i(^VaERZwao8pLlhN;`h~(C z)y+S%w$Z%`H)r;{hUO}f!359Vnq&iC{L(F zikz$Q0gl2{-#ZoUV#JSjF_L>hzDB(7&cW1M{edeN752 z+Qs>L3BLfV>-RMjyGaAPpaz=+zqg0qlqj5VbD9`nmY0>BQzI8G$`MZaW_Z&~z8E+5Ab$tHbY@oD$2e?*ya%fD~ z#=(%_F7mw|1Y!^r;6jjLuqf!XI0ni+LO_ZEPNz&~k3KGy%dGr6fknvjebxN!7BQY^ z$_ZPQ_Z4^wK&S$ueIIP3XI4_gNL3Ei7`Ag7JBzShQ-73ZE$6&*$~fe3@Q_WY0)-># zqPl}`MKhWgFJn1JjM{stucgbH+9{Y%Tl)G5MraB2d{mKlVn^+v&us0XVS-l-8bF|B zbjp^I@)48Onwzg?GK%?wy2*VFl^2Ryb?}pklawm~daAXXz~SQqcDw3(Opq9oGUh^B z{9K?8W@B0+V=Q<`f27Q)8_{?UlpEP@yPpWKRGQ)JsrXVOvC0g$q6$vAhfC2f&X{EL zZw#ZTJ16>MjRj$1FfTFX>)XJsnJ~pttI`9|A-BD39cBpgjGPT!DRtd^jP07;S&uA0 z<*W;vM(UkiF^ULWHMZ`T`Nfo1NZc4rO6`hE6xtPMB_)~nq9TA<>2V`fU3Aw7>dOmk zZ|&O4QyBWs1$mz|z7w0*uAe;w!wL*WaU&`b-XtmUB;T5P0W?i}G05=Ne%ilIYc^kWR!zamd5X$c@! zqOe*GqU2xW$fZ+SP7K_}15>N-Hh>cYPNi>dfu7cl%u+-stL(hYe8_0LK|bAvie50D`oB8+$s7$mqss2|NlJ(4C{0yrZ= zmWaj%h`ZX)Y7RvZ^URVa8IKZli47Ls`PoSMItd)43^v|*w&EvmlJ4JcHVHjz$t%>F z4)e9oZ}%pqk5itXohI9_V<&h%D1Ap->Cl;Wlfjxd4NOgYM^Rk?@f+iHn6*xOE?p7v z2Xq>qti-kYhs{x&{iE4YT`}=1o${gV95esnYi_B~DsGX;w$6LjZrri1ZFLaj z810!Oyio^VlOy9@Q{xLf(_5ad+h&4Mqi$5YQmwsnp?{Bj#{hg-T?W$e_$6As5~A}( z#nv^)c3d-N?cd}=#}y>Z}G1#?d-5)oWh0%`v2+wBQICSzC7a( zZJ&lMe;7qJzV5=9oNOhqWDnQu{zmk}cjS=F0HTv~(mdALZ?|tC8RHP$)U1g=jTRUvp$LCt|bliLhP~_9-;B@6A2X&Mv zVGrWKdOMcol@;tWa{W00wL0=q|5)mVFAp9F%~lF>WzzKPGpUASXpCBMCr;WiMXhtW z7)i;Lw3D)gGzQa{$^-|+&W!hcN~*!m>_FZ;5)!z(j>HC(>6okJMIU=xNrOiUd&XvM zY$UfLNcF(MtHqDf}_$TgDTMUo4C3CXNf^bK}QQBa}H;57HsbaN>xN??i! z2PnhBQ8HAw2rgvlsMCa4ufoKok){GW9wS;J2#N&tYftm`+M6}CNfzf?yH{7h!W9MKUt?8 z0B#IgU1b6htqgl0Eqjo7xoFpzUaA7{10WuI=(8iEC)XsgGtkdOIY`%}S||htrGDN~ zMHmX0V+;;K@q{qY&rEa)j_UpmEC|=AUdck)<`OPu;sw%;D1Lsmd*?8t>=eS9YBk%N zv#UI-^NSq@kt65a9VV!;wouP#Ju;;g={89gRwJ%pUg$dqb!~2VP|tim1iPV8?+|hj zZdfxA&y1kWc1S3WigJ+v+W?e~p31cPmn5)bswI$qk zJmI;J7ZEaM&Tn?A8rzuJ!&CfpH4z>wLAp9L;}Y3yI5runqdZ_R))$q8ZRZVEtW$sW z(9qE6(y8b_3niH01dBPz!U0L$O**MN@=azE61+y*Ez=cCx7C5|PHCfQE-_P|<2tjF zRo~v=xggU}KP+H^WB29Cmc;r$q`gygrQx5XLc;c*bj*n znG749F*Aj6^CC%u4$ee{i0ja$A-c&A-l(faRQlir#Y*|oM^vx;7UKKjE%!r`gX5!G z^QUVgRy&s9${*H85*i65GU}WGJSjGM9%OR-s@8fMl4j4RwG&K}i7Cf%Gc0(6b6Dra zDGe9%!E^YkXzlJ)q0a2f+x`RN20!Ch^pc8&IcL}_DKWRstRc7d=zb*Z4|Atu_{N%s z-K{9rLXBzqx;69`ai4JUWqnx=k<|6vS`*J~V zjVO~QoX?YVI{$*LtFG3wkhg{wu|C59wtSCJGpvuBFKS?%J%J3*I=@_&JD!@aQ}?}th|7|Xic&4-{A74qE+pTv2t1HMrN9vj3$2wvDD>^X?XXehq z%y$k%(B#K`hUATmLuPRr4Fr|iO|?ro&`h<9O6z?IWNf`Xx#>bOxIjn6>2q9iB=5#X zZ8)!CjR2NK9h#4aP07qWGML%6emZ0wSa!-Q3-gV@Xck?sftIDaFWyuK%?(>Y221CI z)|7{i_vL~p#+{X5kXe#R;Gm{}q4ofKYsfG|QdV$Pe!=;R`YH}(|8)bow;aZ*tP`+A zID{TqDF}ZhQCK9jhLmqfWS`3=&;wa<&O)+wu3|A_Z1!-l`*;eyvLq}y4AOm5;VGw5 zoHeZ255+~jFnTnaNeTnm$$8|@@HLCyOTd?fXvH7)84bR`mmF}S2OPJCcFo^5<7|01 z$7d%~pUd;M#Glp0x^Z{R%&gJ*mr1;>QTj0qP{Z^qnB%fYEz&Le>9qDZ%L|p!v(1S( z0zt(H9ni0NHjx{AM(g#E9S@lGC0nijaX0yHh>+8>ep~Epp|8@aH(&f=^ZrVXSF;MFpo?)gSe;7}dOlC2} z?MUhPQXGvV{rO9y7X3SkZiL!>!HCGVKP)DT>^t?D3R$f|o;z-;G{?N(!92C!-!uHe(g za4n;hy4H?`ZS~KR$_xdq>XSuiWLGwx9m8;q=(5gXB^^V`+(`L|j_9Y`LQ3g!GW|^< zB^Le7G^+jc1+^;AKEH;L{=IaYFHn-_!l4ff6#l00ymg@;sPwtrJ&vIx!WkUqmz;1l z)h(~M*sQB?SJ5noLB+6UHZ)a5n`Y+DQoU^SF-=uoRR_$=YZhhObUO_GR1m8RZ}y!= zFctD;PWWs;2J{;MkkalsM zJ=m#xi13OrZ>NPl=?+OH&!SQ_BIeWkDop-xpvgE_Cw1n%%a}Z&R3me5Y0yjg6<*^G zZjAHA)z=J&bZx3Bk>%NclFhcGo!gmoJ=Mh#7bf^Zm| zkUTPe%SOJomFtBQ>`S26iqKE7eS}+4tQjlI;Kt;Pm)UfVmK!g}`1h>|WuFh`t^xjpF+-{hujwRav!DSthF~#CQu1zZ?|sfQDQ#lNz%R09{xM`0}Gk2ZFM_i0S zQ9Bw_0u2S;L}$S_?y8Hnyp2+kXhy-pD{D-M`^_~MuoX$mep+jXlUa0IEQPwsZl63$ z;jM8?Bep89^C%Oljv2Uib7|xC^$_LiWqYW`3F8luv_IX_>;T?znuq&gP7*<}lt(mQ z)g!chd`s0^WLFrM>iv{mj#Pi`0M+qk<@^AV%z|a@*$i!77XGwp&yc#5oEa^uS7*}- zPhV8Pg7h`Z59_A(mJ#ro>_~WCE=IRC28yzX4iei9W&K+gMP84_tAnYr@}RjuPyL{| zDf%UKIHOT-G=zRJq9Oy1sL(u{7*{EEkjkJtOj%6UFHJhe!oO&i$~Cv7N&X@Y)-2}| z2&+CSM?c`3%#6x%TkT@Z1748W%Hg|~R79=C;B;>^GooOz?JjLyLV%)=ZgL`rHGZ?K zTXm*yVRdv`$L-EHozq7RYRu4({^+R(3KV_9%jR~v=BKMl74s0UPkoXzc*CS-xChUX ztyUzc;;E*9AlUyy744Hyy|l^T$KT5Xr=Qk)C{B9I*9S$rK)d%Vu0^851?GmRP0SA|60UrxRAGe-1%9-M`|CUij6`ff0W{F%fWHP=fBbR z{;{!e>M@`n{RT*yVS#|8{)PDZA5lf3XlQ0^ZTw%srTVS;_Z0$27ssWK1_?G07J}o4 zQl;BGBw92Bn*cKt+JGNJgcy+GOb6=Px%~90@jeyQ^*ReQ08gc@lJ!0%IMY2%yy6X| zkdx|YR~ggbc)xUfdVSj7S$m(XL9p2YosFR44RafgHO&`4jgNcy4Nbv%YGo=Su#SM$ zU`1~<$>1J-W%R*3+0bWHek6)MBVKEKNWv~P@s2bIl1WpqFD@c9e1ACzdpQ`%xNg)r zSWGuzmU;)1*-iOdaM;r7tv!mEaa(VJ%@{Y?K3#ez!Cq>319=S z-2AO99Cdou5*oAkD3fC1azh-G3_fr74R+HDreWmlvdq)iXapoVCyV#~Ct9;~?%(@T zr9L?NL;O_2;#W~v#k>i*xyx6rtl9Z!;qN%vNOpt|cEgVw82t1mKbt0lOmHUaF0`3h zhMQV8=;2CK`AYc!b0GTCv+}0PKQg?^<5^kAY*D1t^8urcs~K1=aKIpIkr~!2@uR1t z(1etEqj}+EGXM!CQAr)n3S)P-MeU$p((V~&TAOc>ANOF*W|r!}kg&*Vc@cw^$CC+S z>*#oi9f??M-m+oAo<0ldgiOD7y0lYgCA&Y%lUowsYWq%ix`t}QIaFq+a+2}EZ}xeh zZ(uRE@&Cd=-1-OTdzJ38bAl^b9hv;FH5$!XlcIQmB0%|>9Um4Tds`Mj>qL1v1PyK< zMa3TSt=dlUf_ngB!IoE$9+k7q`02v=t0r@LRzYEgGsGCi44WWwSqjgrY(l$IT-{@u z`*3m60@fqCJ83B~CZ}B8(x=}1Cl0Vb+~V9B2c!Hgc(>7Bw#x0deBUixcTr@Pa~8Fx zw*Ws_m6DwmVM$&z#Xi8kDldDgsL+@bH7NkT*ki5XByJC>c#J|*(E`>xp zB$fpTO@zR_iDYf22cQow{Jhr&p~C#h?D4v-Ur*4RXSu`gX5~CW8@8uO-i>gF?OOlZ zD~_Ga!USmJm(yPu{gH4h=g|9QC-_L&xi_2{*YEm+Ol8kf%l}tvUOTS8JxjIvIJ^K1T!A#Cjn4FZT?CUk&*0${G};YnWf)`I_X>ESnd157%X1 zz{+r*8eBsX44o0#s=HOFHQG;5s()Xsv4B&uLqp|+r}-Ddg>=AymuJs?GFB90sFPek zYVtY_Q6t2dZwAzfwDRl-MxaE-+@Z_uV@&YT!Ez2Kqvm>0b0Ep%^I!zlZh{mB@yXau z@#obdxCFdoUI`?37}Ws3;VhqSdqfjw+D)w3 zPuwL%W~z-$3GS;*?Lq9{a9wr<>Jhb8ywJLkal=^%kccLDz#3PO|6P;*=8eYM$Z3vK z$cHzwpOf#y%}ib7WNt+bzfk1IM9mnE!|k#5sO`RUA)@q2$ktk*#cuJjs6L1FjkL9= zR;nVsbhAZUu5|;5g+L$KW8|iEWx;q59KsF2#3{v(<`)RXuQ&enH znCR2?m@AwjF+u!8)@u;UaD+WxITuALO)kmE^X-&>2c&e5t=2y*q}6L+T25JqI0!vG z*gDOsTp5PKcjsOEZU>j=A1lqAhGM^_mUL#=wQ885o`>1SUsoZ#9ZNV(Q*jHbuPEKK zOQR4fO)>?Vhy^jPrbW{}6d(4Vl}a{*OE$LNzyuH~M8mVt%638d!(aSAjF6x0!o2U& z?K};}23`^Vc~|jweQOH&yUjKHmOE7X7e1N};aA5tGbCGrxJN1)^gEL)>O+XSsKY zuSK}8+pN#vK7DvltTEwRqss5&Acq1Js>;yXgsv7^22(T~?OXa%T_uk?Dq@wN)vjSjkk?%P#@LY-B z-X44{4!h+`;k1m^tH-vlRvH~f7A}S<;VX3Mf)JF;$V}Hz9?TN*CX6+M6TDf*v_B_z zu~WAEL`VH%<$(?C*sItd2hzp%sis5-Dl|bnu{j!d`ftHreCk1j*#*M zrRy*45-|&DGzwb2(;MT1+SB_|*)yq{c6=?G#)XnboR-}yOCM&6-V#>?*%bw|2B=0B zwCPvuW4>ZLQ%SdiUNO_V{j{J*`y|9F8)>b47fh+oU%2ZIca6sBz+=?T9V z8;_u1_T?mt#PZQ#lmu?;ol~4NM`CbG&SZCcZb6{PL&0u7$Ol*L7v@#O$divACoiX; zrzT@gR&H#60ex#iK)@wZ6zUb`9h8SqXu+mbMr4J6kuHc4*A(O#Xbd@{F#+^uCt`>@ z!82Pl3Wnm&+&b4#n}k~qR%vUXWB25T9B_&cn!RFYrZcTYZJ=wu6UMId9FLJkHQA)b zp;1a;HcuF`;C_x%p>M7}!v>p%O)_Ek?lRbbo-pS(@~nok&D3p@XxzH5v8i*E19%w4 zd|vtav*lxFaiagGb^G{RzN!>&no=3VXXzQtmOiOI8LoRsI+M#eF>1an^+{c2nKkGr z)j>PaX{vs~N_09X31H}UJ@z9|kR1SOkQwmh$rND3F8|op^cuwW+o@?}BgO1(-dTfE zYQDl|qhT-sz&i3bc|pprnm7=L6M~`85Z#gT*m<+x8qZbE2y+WI&uXJ!+S=e*I96fA zJ&GRJvJ5K(zIf_3Z-%$PhkY6|T0KOuYeM^MDUdJ)j`OKZ{z_~|qr{RiY-RO`C1#%m zM8`07g}M5=SH$a8T*B-^>#N=2|473-qEq`w-yxv=oreFF5Ky$Tb^VVp_+OK7pUrm&cwewPBWqzx z_&1`$EH;Y!YXlQR#Yy}QA*C3V=XhwWQw`S~iCmWH58v4Xh(Qr9BJBP~Y*5i8S;VEJ zTw}U-G2P*fHTC)YvIpB`*hHpGqwDV%h%d;*rqyUI>a&KGM89U}bndiId;3K9y?Jri z9b^lT zrM7^ybQ$jR|u8;JW^eM3eD)7>cp6D-0 zU45@P*=rmr$7htuY=8{Xr0FdaU_X5T?$A6bwN8LHbYhS``EHS3@QKq{c{J5N`10JG zS+WN1K0CO=%v{j)#B8dUg%dPw5O#Bl5l%s-RO<&RBo*Ds-~S=zW6UQ(F!cQZgTCP| zxqqP#_}?Gke~#oAGXI8m(OA({XrY4JhE=Y^I<>hCDEIkE)1w)blZgBUY}9G5UbAk{ z9GQCo|IL%XOLzg|O=QSfYYvk`mKI+~=P;dqon|wg&icH&xNrqxN{c0qv1Ayu$EiWd=qM}Z+dkc(5!qe@etuhI(v2AtO)K-tb6H)WJE0GPSI#ZmSXHteiYF@i^K z>22H5w(KptM@mc|+YPOuYlf{W`Xvj@3p1<99tZ zV-iK$$kRU@(TG+qQeE_W4zF0x1CF&5H!L?B3O5x*KI(--C;qyg23)bK1nt;$O%0ev zBnRo<^7K&wL>PPeT3T%!O9~U`9VCW%r_SF(=)H-Tl+>%cFO@E6Oa&q!06Cs1hrUpu z`Jz@RM?Gwsae(mNHff{NFhnvKUN*MeTZ=ek@CLx0=tgnrTgt^E>gJEO-DMudL+bSU zx!At-$~Zw9Oe7REbW?PVS55=tU!t5 zySpuH!M}X~#z|N8I3=}_5xGng_N6_TXG_&*+8DyDq?x@k6*IMN_2T!Xu*l`(0_Xh# zaaxVcNS8RiKI%vqWxmrRM#1Wd&CC49W(=O|i@aG~XE%m28&5$h+@+3v58;VDmpDSs zQM>ws0kJCmC=Zh?PW^zd!1}zh+z>M!K4jzULfkRJjDs`nTBl=Tfg6y_1?C)~v|*|+ zy(~LsK)h42x%9pI4>fTmkzXDZjbscvak@b!#GkO=>7IkFIT0b0GnAWHcM z$Rf}ujOK<=pGmr*b!LcM0>uYLh2V8H^XkUrXQ-fWzrk{QH~U9z|DU$yAM?mg!TEg7 zw^fA;9S{)v|M!sjxBM*i&GY%sTb?O(Xf>@B=Pv|6r@q^_uFG=X(C;DEOy*{4Oa4gk zfr5B75{vU_U1O(4pkH03qHF+IxI=`l2=|I$E5l#qU=_FbY z_irR=Q4fAX({;oJrVfr$A?rBznX~F7-l~()cErU}6?~Sszc6)P59Ug~WWnZ+;2?MJ z_6vB)1ANB9=_03l5PNlzhE%g(BL%=&dB_d5)B zJq`ZsgzejEzi@f&eCz#%8m#R^b`u;O5ZuNhe~krGel(!iLL2-g()&{G?+G{md);64 zf&l%Og7fc0@W$Ov!TU(TYogZ&>MxY07U4Tb`A*_J3|cGVTWX@?w0e?p7kx4gl5zWd znbVS(tb$RLV95e6lVBs0bQltiAIIpC1%ts`hlpFS_hv{m=uHaYHg@yK7*BgJ_cAth zjnug*37Uvnq!C92YJ?Fu!h1+V5@c1#la)?$78(QPMVU}**-g?x3CDut`a?J>1)tk7 zt@sg7wm+%OY%I_3THd%ky{xOEeR5QG7YgcHk)sK|hmGVoI+H~<$l&XErvbKwz46jC0vj3GPB+=%y)Pn*C^t zy4LDVmku^0I6RfdG-P<;Bp;Sa3V!8h2xjfaH(}9+xxEI#T5N|UGhg!Y`DHCowZOU* zd6>mfIj=$v)W`~XWwON?bgA$mw>c8hn<+4u0oqGNh^2Np?gGG4sDYrqv5?KV{P*BN>sF~wo+^NZSm36)ud3PXON9VpDy%kMf5CXY}m{h$A=RRmYrthHCcK9E6obbFu zz|coj2?X4{E0U39+c0H7i&uLr3)Ng+b#TD;o?Kj$F)}-%LMYteWe`5mVK6Btv~fBH zBE*T1UNhs$Mvxf}^87I1m}JTdv3UwI0?|`-HD}B+Y72&p=dSH9OP4m?ail;ql5e9d zu~m8loTg;(Z;g=kvOx&w?lq#Tr6xb@$R&|L7j^K_We%YqeG(o}s#K)F>531<$TNg~dKuw!cV}MT4*w0l-j?=HQLAgBLM1Reyx(%Er=!pA zZ>Dl50;OL^PQLda5y8iNkd_XFaTlK`M5#@jxn@RB>?(eCv%atlMbl?GAGWjq_)}ol#q&U$3mtT2ATJjk(^!6|FHKOn67oC1H-02(=ch=x zW6VA<1XKl{zV&K`=qQ!~GQ%;qs;Xgln3%7Dee^*ts**Yt_K4s~GvDfXh8CWN077Xr zVLTby8gh=a00b6;-EgDN^=m>Dq+M36r49Z(QUoA)$;pRE5OhM0ZG^kU-lLiNz^B%* zDr1w_m%Z|dYEPppcL^<;4Hvppu$W+JmE@09n}wSj7mqy6^_en{Kr*4pekt|?paIsi zAlxnujSr0x0x6|bp_np@Oz9<&iO0prP<~vx*es!^d0Wup2d#XQl%+YI{(X~<I&+bTXK6@U9s4qm9fJjXGZ)16h_{klc##A)xz&Q5lw;&GqvRvIfTvF z$AQ7MrrQ8i`2$dmS;d?OQj^+P)ml&wqHr}YgM&d{mqAL>k>T1Epaa6@}g|yrLn``9^u$V7KNngF7dj>TaBUx zCg~cb$##MvwWNwT_&+OA%WpB?PtF#a!bSjT_{4JV@Y|>zqQza6Nb6)Kw(Y}{vc)dv zh$dq#=j-k#UW`{IpdeL}#m{mrlXIteLaq}|2wPN&v9s&m0+tba?js)wg8ap*anPe~ zFa()hFbcAsz^GZ?sN#;tHD!`P{rvWfl4BW{u?|6hf`d7RjTFjci+!-;D1<^^>}F8+ zjj>6HrG!WfLbZ4pZs=p(hk{78B>`3DDk6Ad~sb}PPiKoC=Gkfk>ruH(! zrR2kI01P2}dG?!rkA;CN9XcdB-#Gk){Jhi>srq$}Jj;ROrY`bF%p*UqD=tyBEK*xk z$g}KwFZkU`!pcWSzbo4?nCZ2C%4+!Zu+V-6Tc+Ft?jCM9OUO*cSfD^nI z1M{ItxQe;27r#5|y%Q1xjr~6H$xCm&kj-RQu}BSXD~!#v z5kFR|UM5|*{W+^1Hwbn1_(z#Dnh5o-D~m}nEg{xJ4833!ViTjE)KoKRQW391;>+F{ zVx0Q`WiGC5(?M-)`4~(ur{I9BDNDtB<$XAHRtCdV>~n&!5}7r2%>{9hrq6=0Pyh}% z!Jq6gO(#b6s|>=Khj-IYnbhO*E^ix2>j0SIXf{Dsk{F3$o~{!Qoy&QXy~t1}=P;&E zCEMHSy!;1#;$H?kjp|)ox<@W7ne@ykU|ifxGOcag(z|KfLv6m~%heDfAR>eN1299y zg4f3Qm4Uf(dYir=0@5Ln*J2n#Q?&Xiomg{x0w-Ej*KqgsX)W3JBIpzrc~(C)?yGzL zra!;^b(O_vP)(?%!?@5-wQn=Lr#|w$3W{h z7CRo}R5$4ju6>sRG*&QsdyZVnLKu| z>;#rnyUxM*?F420=%p)YX)5R$ThnDtr!OrMo2@m2JTX}ScaSm(9c-PhKQbKo+ng08 zHfH1GHKNTKe?omDQMAOqj3p81-nv>Di7p~?e8EUnEu0z^l-y5K>!P(84EPH44L4A|)7lF`fsVL%+ZMYi?bN930$&Jlj z&e#s)A))_3r$d_Nh?@_(FV&1+wcewEk@JoFP$@=~qc>p9ls~y9C!nG2&r-Q0_n%IF zYj8=xm#(2#gWVwC^ih4z1Vqlk009Afmk_45xV46SmG;2zqhf-^j>YxU(kgwJi>zl2KyEa2Qc8nbu$QlkyZ3dhcSox7{@M-w+6V?{N z)#RS7roKGG3{{ep<&05{YdC;gZ`XY?TwLY;mUm!W=qmNjCx^yQR;~9PYgHe(MjG;i z5W=S)sG6B<8i?A0p!XmIk2?gRn2_IcA6u0d7jOigrka1?oi3pvbj`7Ei>Hji~aYaOEh(z1x8} zs>=NeQ$+G5$5LgwvOyNDK@(_6g>)Lr@kudkYa40Fc(x;O%iZ zJ03_5R*yB{!ZPciwM)~f^=C^WnJwl39*et(=r%cPPQY|_<|eXZ9S4qf06~k9m>rBZ zcjHh({cxNE@Je$|V^DVZF>7M6u>Cv95ME-;W9Fquuln|kV`s<7+Rlg_D6Jlcj$RGE zD7elbgjPSRiYTa#2$K#!hR(oN>!kc6jOhHzTJf(D_(%8c8#?-Jj5|Pgkh~X`?Jm^| z<=?JgwlV)2dEjmt;TH&+5wR;fjhoVpsy>dDs85&izM^{mVMbQUjv0)W>UUH| z7U(J?;WbIf!zLxXTZNvu+B#TW<5^-Ek=rnM_S{3H8*oQF9N@JG5|9>~rNu4Ta{G0~usAoJ*&c51lPf%f zwEq*$k*F*U<)yXg9R&q_lw|?rS-+u4g`b1BFD1irRht)=>JLU|v;uVQVNtF`&L++B zn6?3aF)q)ub82I3{=s}9UvNmgD_?;O>H_e_oU#E|J7!55m+T%wnx9{F9lU_LRXiGG zt}H{4r@AB$E8iN3*Kpc%=;pJixQaKrP95A05hrxwvathaZyq7)93hTf9k`SmdTuk& z0)6YRWd7_r19ME0k2|TTtDZ2>1uRd$z8EG$gks}M4sKguo0dQA+*EHa(hkOj2oGU2 zOm*)uP|^XZ3+#scOT~ONvd%*zYa+kg&{`XC#};~N@P<4U_FfS4$(VYxj|TX9qfLS? zWP;zp2D}+TH%r0UQZ~b)mqpmYH_5LhggsNFUlv%mxDwlY;-C-oD2L65*%Q$Z3`nCo z6d7n4hhfbbbi@pTqHE!l(#(y_8Rg?7uhYexMD1;VhEu0T_KW+{pydbZ@MCq2_noj* z7S9x9(QZJgNIh;a9_w+7yC*XQyC1y|l6y?=cP~KLCazs@9$(1<(s>1mpi&vc@VbTD zI;lF!;$#oGHG)VZZk+!9H=Oz(n1?7<6xBcEUTD5|u%iDG=J8MNX#aWER22PhuBO7i z=KH6ZcC?6gd+VegK=Fu#c}DRlN!bpUvtA19!xIaRXJ)N$`Da#{dy|;gPJb*(ysaEzx$+B@K6Lehkq4F>x|aLkY$tn$1=yb-YzY4K+tL2%3e7 zA_B@7k2EinS;ogsoxKrZ7eR$?yGYcOoj!>;N}6Qs{aNY6*gSR(!h zd{50F!EF+(ENoVHho_mR-Fr%1Uwp5e?{iGu_O9KGnyl;0a_?%)b^f)#zJJJ<;CWH` zuYzIHj{y%x+)Q@eymm5t$ukQn0(oL{={!e#{*4Yu5JOFn4N$=?F33=@l*3p&C;$LH z+C&7l@z53W3CzPqd^%;DPxra{E8CE(1s=TJbHoJz{}c-c`HY+jl@d=i0hVz;0sw~$ z4d4=O+Yle0y1w4CUgTIs!NfPQ<`Q*{OUwC^<35iaQuI*J_HF)!2di8DQ_+G1SDCC) zObc%%;rrLJ*Ci#&tocujqNc`XVk`vn#TeFUl0BKH+^VJt- z*>fm^D5FSxtNbxj$z7tUWxUtLiRVgLoWI1laWmp}OHKHQg&c?rP}dr0MH*Mqx-ua_b!kQv+V3&Jn<@ zXZ~{2TXrm^RNOAX3b@pU2&Ka{_Tb#>6@4NaMJv%4gPwY^RXfz<@@ZH^{Hp__9~<7l~cz9%A@H=6}iW9r*X<1+%_y zel%NT^fsHF(X;eUxKB7n=A6}sF4XOPq0t~4>Sr`e<(-|>hh{Bg?u4sBv^KTHX* zuSA#vN~#D66xnYtCCfxjNz?O4?`Z^(V%(q`F8z+U5+TK}$j8 ze|rB8>OJQDld*ePP@79Ad9t`4N{zA-qEHgng}!(4^^3c{7i$%)Sv$EteVY(_vA!Xbc5u;y; zh{M`14FNs7HAa`4mbA7f88Mrlw6>;@#?LVZCphN?=R65S*cV}m#>5r{10E=*d)Ws$ z)+&P<{_R#>yl%U3==0hynE^cq1RxU)+I?a|nR3KiW8qFo2_Cyvcb*{-l9@E{I&jH6tl+q^l``G^knQ@9MK+}`)?#GnKN}MuZ~o|ldW_h zYn>gdUja?Qs@|}tQ!$yMw!H-{a?&zQzh;Ecw4z&}t$2rij5g_j;97o+l zJ&Gtrr1hsEOJ5q86B^t}?Y^upvtCd7In)uPiIm(gxGt0|;8BhyPi&!GAcOQ+(DxIa z!hpf!lAr$2&!4u?8CJX5i-2^-SM-_jaRVoNq@sG5&6*#Sp@;o ztp_Z^(EHo{N_Jupf5HX9^D#uo`rCI%cjHQ@Ah=LJwtx+S^MjLFD&m z8c(4CfnJ8H5ja`FF!RSz$3&_t{GKPonyD*ISTrfR8a8R~Z_Pp));d+wic-s_awi|- zOP2SHcK!;t0g3lj!u_;=iufY;Scy^YJXGO&n%t^%W}f1fyGneZRka$mTCv33g;RRJ z+-c9h4TV|MmZo*ate&oUhF~t;XSxf}V*7c41aOHA87d#!wHo8Md^!_E#+>vSJgs^s~lfWhY z=O!=)OKJ~HCmb^FhqN>n?5?mF@SkWN8DsEhDbq_KUMIi5nF4oB4bdsJ(btSfE2G__ z@-ZX3eFq8_q9&ab%J>Fi*gf`O9H*ZOxD1D~@*P<@Q`9{MiXqDYY*zm(hjR^ z;XaW{-Z)J!@Yr|SWq-1wpcIW80P=)80SZ5R@QUbZ5^WV9ro=zF?9zb++4}oVGDVb! z9#N4OZdo{=%KI_MZk4#~-9Ov;Ah?Y?=WyEiE% z!S@;y$qo9iBMh#!jR%3pGE|ZmSbsFDd^nnbzpB!V|85aDl*lb3XkVef9+r8fPZE(Q z_BgRh)fMjjs|JodamFmQMqLoPvdRUc;ss;du5=YkrE^Q!<5kFVw4<4|>$aE%1txck zfxTz;38~Vud%H~$%hGfO9jqzGCYULBpSrl+^bdBON>tvLL5oThQ-eS?Q~#E^pceV# zd;mAbxaFn<+Q=||=O$k(e+acRV+5(Bn1@=zsX$vRpM(nI0ATE!0h?^H&{)CYd6>z{ z=XmzJ4a}UDE^VMOi^);CV};o|qVVoT`D&%$4UAI+N9I?|5kjH^29>VVlwIu3;YLx8af|Xb;&Z2sJ27-E+2 zh;50D_c95>3n4H9j%fMrRQYWgvz>vnohUwcw6Fz_qy>*|)`SI!I;KC`2lt8CM2E1@ zF`6)f4&e?9aK?n$5+iNW2ZU8;U99ZGdN1xE1UF0sGb4+*U{mI`8v`G&0 zHZ!URaU!9qs1RKOf_UgdYpKkI>*>*K8H2j!5t~!8?X2VT(nLJF-8aE)+ygfMfNRw0 z76{)PXAyRXu&XJj_GMKistSu1%ZJ%++Pro^ihm{d#uFChJD?9mC zXT(?OB1mgncB?|dXxnt>Lu8KZ92{I7iiFkcPoah|2^nEWCZ_iunF3jG8yB@Eb61luN3gQSrVARM z$))`q=K#wNAQ>VHERAzHe!fYbrnT4X%ch)J!?Qz7?2&@b*v7-Df3UKq?pUKEqNW{3 z1zj`!=>?Rb2NfG-a)uS|$fz-V`Ac4?SR;FWtA3zt4EE5Id_~LO0g&PSiQyq>UD@wE zL^-xE?Dj-Laa=jM(_EDH^hH_l?H70NV>ly~bLlI`^A)4Zi>AMa9O*}z$HygSn{}BT z{nkmk-+l#=rtyzT!5?l#!a5w=V}HV4wcT8ij)h%U4Z4fT9RqoepHYpgTSh*%3nrbP z(so3HT?iekcmlOml^mmarfy2=yW`r{bB=K$7^$ApY^h;7#_=x^P>r8f4ZFi*XoDw{ zpY(RVZS3hgt{8SiAd3V{QhAOy&YYA-we(|O;W<;#7*jWxRzuIIRYxxyOI~R?!O$5~ z*9^N$$gM(oR-e(0(OJ{VB64%KsO>T?^J&iTty(drvW$a+KetFO(@@uN&^B_dnEp-snMC`);#L1|^Xk9zeTGz_T~UP*ze2#! zQ%Hrb?Vv0M<9ayw-P`#5DYXFo#=xX zZh>oiK--7Fws!|tK-wp6Mtq}xG?RQg_$h7`8KSlci% zQME4fhV7Vj*`5;evBtw8EX%9h8mhS9&-N`KBY}A3;#TBq^2obVN~>7eurg4}88=(k zwN~d6QdmV~YAN%F0WDProBhh!SCJadG7nQ=kP2^cF~w6Vv?(@rWD4#=Hs}0 z-G#YfS~x#>WF^_F(QI8yt>ozQ4<;lb+oYSTMN~9YDz{h5T6${XCW^z*04L(v$<0M` z^#G>!;;Qt?@_`IAg!GhybqjNKa(!$rr;U8!`kk~Qg>MJvX8Zy?eRdl&WdYe!yzJQk zh!LhpwKcq4D{KjPSYs>yar7mV*ueAX(z15w%#ZZ0N7eXBF)5bc`5r69trJ{SUawv` z-19n{?prxokiqjCL``vegBA>lE?biTQ!W;Ak_*j57k+q9B<+U6mIxcqL}D-9vAIJt zE1{ioQUluHOF#?26=n%{9i#GS2A+Z+x$ucLH?vGJQ)Y^; zn$(`2(Kgr~g`~vN#Mx;}3MZCK+X$ufQUlpFKeQINZjH3`UjwSkszjLeD{zhSeH)Tx z)hm9qWGEEqnXS@4whML2x2)K$!h{6VNJm#GTL&8dHLl(;V&^F}HYK#9!BKp+v|dIp z)C&_K+bNQm_(Qp>ws@Az^Ak3bJ+8~(VO_qg(zIv!?1TKO?{PU;lyl%wrGNQh2qM*2 zz_fVbB>~ASXgC%DoVR}j1TBrs4onpM*wDY1Y!aREJxTp%gW+U(nmaqKT=WnK*~=EP zk1KL6G_`P5FNMiOTDFNbp5-so=72Q}cH&y(3b5`$RS?TMnO(~)G_`0Cf7{!tUXe}O zTfAs@yVNP(#`bHX#!yWLi-dq^;hk3HCpsSq%wCD||Xm~T@ z8a8tvUy8KNE)x-c8Km5Vyz)EMPP;cJPMUb??NV*#urdxw_i3x`{idsK)7qOPxfF`Y zNmP@%-4Be3ZUee>7=0HLZb!A%lqt9B#gJl?oJ_1?X=;EConkRbMf0yrLX)CbsbDhL zo@Zb9n#g53ytK`r_cx;2X`D+ZyFYT5XMqJe-HuWtEL0n+gCT&EhW7#@RkO>5zNxc{ z2(2$)0nX|+JX%n9`9&wLaT$#1+=B9Jn{*?|4gK^;<>+drw?Hn+wWsRt!`R_Bou?jc z+`BvN)?(+!)K8wKeBm{-Mp4&4{`?dshVXuKqbELzYP_zQ$QW;GXNJkKi^dXK`xA@$ z5?aT^kABFh?`kI-Rk!h+(&3BR0)5!~pLSGZi>~9(i>eZZ)e1z9Imm3UU##ygnqFMW z2Jr6r5E>EQFqQLQo8DsA0bL;~`E3n8s(gxk4LoKmt?&U_^xsVAwK7s7m61!EfRnfBD`b0y~p zeSeHYO;DU;cg70C!hV7ObM4dnYavPWZ4y%Vt)0pDFX7q3Hm2q_#{UImD@!W=Na+tq9=J?~DC&kqUPOd1L^>TF&0qxX7tjys6yq6E zD0F4?%MhgS}K%&Qa**2GQV!j-nD++eobVZfktX_3WTwgIhqW8 z=fonsqAmUB1R&bIh6HO~7$hrpS+%f-L`7@95rapxb)sL@L|d6PV;8Hp7gj^^*G+qnSeY5SDFs9ZrR!VDy=v|}#hqZT# z5~b_1M3X0N+qP}nwr%^QZQHhO+qUgI>CDsl)nB)7RgHeAx_uwwVLwKUwPMe`_JrF} z6k}u!@Yt$eq>MnmjMeBLpyEjU)X40(Mk$4195Ei$>h1&g$g}LI_59=VUa!zLA!XN)IxT3bx>96Ci@QoZ zkxey2T-ukUNp=EF4K?8GerMhvdMizwIljdc@pOX6^V2db_Fr#b@JYZg7eV^sDdZ{# zO$O+E&_supnXy;p+jL~R;Je6Y!ak+KV#+D`42nBEFDOE0CB1EK<&pVvzc$R8U^A2% znjnPiPVgOFn2y&=xXp=r{A3^qT9x5{Im|0q6bBuS{eIVs;oNk`;Tbm`rCrMd^wNM+ zCkZ20rfoMTd+;e2^7548R5*J>US9vpNw3a`O0kFZ0cX)#@}19>G`Y{+%_>&jT^w(2 z#ncU$myQYAEe`SScEGODDUO-%0z7?w)n`_BwLB|s+*`1(bmbl}Lh1$yKP0Wsq5xoO?h_vEE=+eAD1?5G*wj zKE7yq?Men{6jcc+D<)BZG9o`w*?f^i$UYF!By{>VsD#zK8kuruHy|0iR5hJakfG#~;0yVr3^MP1qSe(_ezBG0- ziErD*Y8d-4Vl9QxHiK9Mwj`WT#=B#n6%AzyoN{aNe++OHsP?&tsy$~KrJ*qlk_+XKuXl1n3!m@;MR|0l5|4s3XgHHuJ}NZ80QucK!(F zv>Q|4UWHm4b5shvvovP4m`~K+MThl1luzAJ zJm^mZH5TRL(=LC${n=l<11i9N2w2~gGap#EYcmc0WGZ|{(a}GCQZ3 zE80wjwkNThCaig{8lA-nc$B5pI6kG=|9k zF<(^=DdI(n^0ELoBwnYNsP%lk#;nx+d}-{F2t)fw`gkW?;g4Szz-!4V6UVo{X7RE% zJg3(zp}@w{?{wLs6JnuGi+M;&^>`1=qbtlX7w0XYKQ+6&QlV>OjI&a@usDs;^q=Hr zMI%$fn%8*xa?vi#$nGtVvgu0XAcxJve#rZMrWMXJi^OY$Z{`_Cn^19dh`(Fk!njCP ziAC(w4@<86!&8I>vocSHc@vy&F50mkzcG^4uapXZ>?78E(_WPH+DUSke6iIzz$%LyQLnnos!K2_ifJ~s2o zesLmaAyAQ3EAHX>FuBH|7k0oqFa))L*Cc(?Fo#Jj;rI#33$p@vcuO&bNSMGL5; z1bM;U&(Q;zf!=#>fN*n*vj8R$li@PM6}2*@HVZu9K^jeXrkt%Oi-oHH^~ zLScWYEzLF(zys2k;yTF({WJ0YjO1#EozSo;Ck@SJrzM&~(^PBBFthH>B zOZvsF-3_z#k)a3lHrUxJN6n}Y{)#`jH1H@oJgOuQ9kY{FXE-9#+?dVg;z2GTXvdj! zmdb2haL3Hn=eJ7Qkf?NM16K-+81!iRVwbTvOBBd7nvG=s7Z#RF)NAtoFU(<%$Q=^I z{LhLmc*ZJXD82|Xpp$Aqr*h&aX4dSP!(QYAy6Fcm(6>s+JH4D)J(UPz#m6MGN1n{l zEqbvx=RWR{jBGm(;@yXVDKbb#t4RHmw;(>=aqswmgT`UEU*BN=85OOLCqxPUi18qP z1kpVIA5f8nt(k z(35p`5M(H3&`XGFHbf^~-AOlb;)6SPXUH2f9E7|=AFB1;F^4;_D6>sNYHfmeNaTVg zJPyVXr#ARAboEGQQN<7G$)<#LS`E0YW!3#d04c_d!jjn;3?kQ7J=Ec1g5)^J7T zgg=&&&HDtSSg<;boL`dT<70N|LB2?z8PnnYBfLhylY=2}O7{Knt=lH7sf$zDiWAnI zMoh7KpTB3jaXM0aDIVZpzVK+e+*?sIpo?j?OAIPR6vNTFZKcvuyOP1VIyg@x60s~+ z1E&>Ti5Gj(yYWD8DpogU?(%Qa)vv@S+1{M`B2aFPAR~Ec`(GGBGGZOH?-~3nd20+7 zMqRe<958qX6A4`Cqx}BbeN-DEm^~R|LCI7t5Y;RszLb$e;4|AwamZLEZ#)oY%> zt1?088J7rlJu?ZX!R?;hYs8}c1LZ##r-fC~XyMz$IyOt1&E+kYOT^2zO5I8kHWl#dRBH)Px1^myjMv7hrfy2! z)cJ&-`@pZi0(v6cO&ie#KnS3`POjeGX53Duu2yq%djZx)Trpr(smS+5F{s)shBHtu zq1u8sVQ<*WxY{P^bD>SNcMaW7z~;vm6|&HGe2DG&1Lb>T7g-->Q8 z?DahkwiPHXIZC0f(Cta`Wq6}5A1iBa8XsG-hCSJxogsq z35m7J20x!z{i1ku)2RN&q=6xMkoGZj1=%pgV8pD8IU$B;DI<0m_RKrEy`3wmFu_85 z^`HxW5+Z?6;XPaZuJnlV_9Qv8mwKs|W&x7cuS(VH@VrSbvD(N-<8J;9qxY5+NvlI( z^-H3Y9W#bV;!}!WuOXHx27e%FfAX|pwfh}o=0pe{mo?4w&B&!w4vaZoARa-b38*yc zZ=VWZ@4>8TLTUCaQ9WQ*Eoc;#VNx5ZMWc;p>Hc#Ka*3VZQ2&f=sDF-*|3B0qk z_WH-CPQ8wCfSstj0kPE^Tpw=*Vq$D7Ij!HtTXg zDIJM@${LO54jfzdwsfG;>g%>>F4$iF=+fA{0TdAp_%q_g1?G&Ghqc`NH>B?_!hpnFD^5PoVPkWaRvCZgj1 zqK|6vD4PN>NCLme7^#9ODn$;Tn53v*a!jU7_mq!EnqUn5HasriK^5Vvq3VH1u8|!t zGvx*w#3n*NX8#?C-Muzh5BI_G9=|_kG}X`kGv9II=J!7&AjLuED7gzW!i?p}(GS@_ zQFUmI5yeSjpKzC4UZPcoKL7J6GfOijDGZ^hmr-uDEo@VCt!RL5Nv9q1?SV3u)=HU# zVx{GI2vbgRgO=F?r&Vq?N-Z*BPPx!O-LdZe`~1YVVtP|+R|bZ(D!t=2+0wL~VvhBp zZ7G+@c~sOiS=*Fd9eD#P>S4>|SjFTBRn-J}5LWZm#n0d1?{15Hc2G4A6JyjZ-1fS4 zKhWYaQc8j+)!-T*slE|qBn{Q`^9r!Z$B-wbqyj%BF{aHf;I?IqYTTHQ@Pkg3Ptb_$T8~D*LP2}+yjYKHAM0Y`Sd(>k2+|~}({2Bb(I%L4Pk#^T zVO6z@55HTY1WV~PO*Gx!Y}i#E-#r3PZXFQ>mLMT){%Xkh$^2ji`wTK}Lom#~bjtt- z%4Oprb5=|tUm*3ggy(|O8dBzYpY6sHoA>X!h~ED)#!>3(IcP=)08r%w01*Da-V^@S zjm=tM-dM-$emRL(iN}+QDcOJ%Ln+tnTtl(}safRpCPrKku!AZ`jYNb}q6tjoRLJDT z#Wc=yMKncB#WGO&^^F?~K*fnSpw0^d=Oz3U%zZC@H?j}w@k(Sjsk^f;H>W;3f0=f< zjx%d>KM@gVRDf(X2c#a)Y;{Rvj~~?IN2xrLmsF4Mhr2W_D~nYLnjywr|RybP3@iu<1>6Z37TqoZ!Z^v(t+Isql`DL=vPrKS-j!bh@Xd zaO?DdyG22*ae2&qWu0h9Cm{oc9T5R@$d%h)v|Oe_ikn0DSYq>_J5H${Azf@P3FUo{-VT-dk6%Y4t;nV z^sa^8C5sJQctK$EOX4ee7!BSb+d@8+J9#AdPKvxu-Itp@WMXtx$IV57%vE{=WV_x6 zQ{g=*vGOSA=FJ@yYuB>`eqc`lYZz7G&3}+!+ny@jYKrZ}AL=2GrE4!w!*hL1eWOzJ z5}tWB=j9vGOYRv}`Oe6^IjV)y-;En(J9gexeA}et>lc>R#7A93YMz&8EGJ7ZVPUSm zUDL$*8Q-kBEwME_H@#}HvAw5r!>EP222T{`tGjtvQ6hx9s4+%YMvo?x%TqU#AYU(5 zFP}ujT)eaTNr^fAIZ>^mjq~U96LRqqi^enl!hw-lc3BIwNP%u{QE6>*SpwC}G?C1! z_w4R1tnP40WU)3I!%jN><}6{v(7m;5?6}m*z~sXGik6|d#%W$|##*pe2T3!X@Yb-_ zgMVtZv9atoMKi_%Rcj_?D4}4?Zy(;>T2Q{UvtcP^kYVY_)Z7gDgC^NK9x6c(-_&N5 z!RuW`VQx(#ZzL=myRTo}n=b&%NwSCmejrSfnYmfyHL`M%lE)8R!dbNqsA%sb1Pq&r z0b*qqb+T$*Qwzpg?Qf%>3=B(1hfJsz>mp_dZz>|hzN3U2Nv0G&mtb=2Q$I$_6Avvy z#FKB!g9+zy5&mG$ou3L;RM>xZhh>$IfkbpJYc7euf?}rWGxJncj9+>KKFnF@DQM46 zgAnVSGMaddHKjX0WY4{Va(*Kfq!{lWRsPPMR@ORHB7%u>^7Y2c_n0k>q+Kaw}dpj`u%dMzUOD^5nL>fRc81c+1 zTDvkg(0$*6P$Dvp8s&b(3-s}b1G|wn;VL@h8B;l9Y8n41BA^KusqbPY6i@0BlbSLw zt&tJ8rS&AGXzGeAb z`Z^3?vtqu109$#K^BTT2IDyMQglHb@&=DB|4#`-;hj6En1EIf$E8W{P>P$+c03R9Z zg#^))S_OAlzoAP+jK^P{z$tj?IY;+C?i|ULOt71aaNpQNhIkq2VmL}7n-thI)ZQLe zw%qnr(*d!%T;AQRu*pAiVpqV?C};pUEU;53UOBIlV<{E+u@AujANsDVr4KEv_(`~+ zmaW+B{Uzv+?xe!e(*$Kn!qq8U@c~b~y+^ac($Jv-4|1jQTc>zd+(RFN+Xax5ntW<@ zX&>|;SMVV}Bf6YQsFF`U`CLmGOh!4GQHhq&II7O8>YEq%04oq{NWI+94rZ$46^cM6 zIDtAcO0EcMV)Qir`MdkT9p#*S35Tn7fkHPIGUyP+HtdYDlPs|=u6e`DY(urpg%pbm z3#RQ@uJ{mA;AGT(3r_f}ErN#02FJ3PaP6p>xRh3uOJ{%W#I6``s4{FjRu`?dGJZEX ze4t?v3_L=S{gDCk11DJMYK-Wrv1L0oESB-QHX^K(p!OlIMxp&smlW+{mrlXNWa91I+D;QmH70`u0)Q4)%_ zw4M$4ZwuRb`LoEz<5UiC&T^c%OIV(TZld5AWAjwGihDci{PscF%-)?B~Sjm*;$=vZt<+e6TtrSYmunf89{RH!r7y< za-pvW^w=Rf&gvORw(^@rwCp?&rjG!wUJ;$e6TOc{VeK3dCXZyS#S^i?8`HxptWT;1 zE4K&XakF9FD!^tY5Z=xt8gcE?+9*j_9_HVy979Uhwx^H+`BhnISBznM}kKG6(*K%j@#nO=E z^n#pGP%d^%b&JDGqOYf+Re1>2yIY3tksd~Njm$F;VMheJ7)xiTOr6IXy3--)|LrMh zJIX?v$VoYZNsgx;R3?yFAV5eP4x}N}v)-7D60W;Jy*WsGZP6{{l?N-7W0h{{^Em}nAU6atPckp=_x4AvEC z0U1_;WG;^TuBKq>t6@aio}iXVuh#B!9!Ez)jy`<^ir);bI9N{NfK;cf+jQhMHMBWk ziM?4(dULnuwZcTRC#cfW=xe&*rt50>BUqC0*n2)xdmbq~jRvABqeQD1p$zJ|rzFW- ztW2?(BqG^fLTwr%T6C9NaSYJ`K zk_1_-sI<}-N@bPo0$!Wp7_L}Mu`D^gc5PXHrCCYgLg>@WeKE{bg@vVY6cJdlx_}m$ z{&H9_ud9V{Ch9YYg~&Ix1<>AtV^K1}piOU&#_I$TSje}+I~=Qr1=EdYW-h45up2!V$N|u;erVQ}4pHvu=Pqx~3zS^@y|mv8ucx?;A_qv{wZH$hz&+Nt*kn#~uPNzX;P>XFqqtIVTDlhEGc;&M=& zmD0f&PCt75-9yL-QC}-Wb4j|%>!m_ZNnKZF8{13sidk=DWi~K2(9D)!V7sv<`wn+D z$LxcI!uQkOgso;~X2b-rg!yEDhG@5+8=RQiN5t(Q>Jznz89B$6d{sel7NI0^;*ZaM zte{_<7Sr0W9xKc0y>}65Fl`o6kD2oF-3$%~=TQoue-ZT@^JpbeUqM_msG{2`9VhnZ z;m(N1rq`;4!p>kRJUz1&bBOr=PV(3{=PsEfBQMDm^C_qri!pF`XAE(w<-p5s!qC89 zo7dc4+rsBVHW%t}(&e=EYUbl*v<}sp`O|$zpYWF`%dtfY1q|CqG40E%wv%`6SCuBP z3pfr_L__ZyoAa??prK7yDOwE!MD-;E%sh|EIzU%Q%%LfJLc%N_CsGwMI+k_>Ikv<# zPQ`Lf9gD`o-n=5TF<;cs!^1pjzW=K!#qlY^ygT9zU4%TsHWh|ch-Y<_aX?bW+@RMW zq7*T~!)-sRBkCrK^%>RU6bZhZFSx!AA=T_nU+4}=h|k4u>B0M*ZVSc8h=v(VKrHON zK%*I_Z@%8FJx=(hzrTjW88pHCKK!MGjGtP!nArI(nK-WthMn1H2ufb!QcdSR&T*Ic z_=O==^1F9eo(p~YR&-;Z!E9_a{t{?;;cnoyG^-W()K+iDJo~h`Vr_ugTr)QD8CvN@ zJ&V~~ADjD4t;ptmIcRlaT+6L(G@JV^tmsBP=Nnwh&3~momyQ$Vs>#2Mp`jLf|HfsW zAbN^Z@Xd+AH0f1=RX=9nv`r#ABc2F<=pQ!s>nA6hFheW+qW4)h_Y1~lm=HT>NJ{J* zR6BRz?iC$++ZztwX?=}B_>g>;xKDmg98_D8lhqqnm^d%h&b=i+#wBUa)mCMx&D~OE z>CI)X3aaasH)@Z(_hV9p`AuH_d4X@aV#Q z*-t#LqF)vGa3;f?BgmXSz?{fwL2xc#POB-jEuVn1B#5vfs$ng7kmHe+WaZ<59FW;ke50TBW8^4TsH@lk zxMLNJuYpUa6*1z|IP|e zI4VF!c0)s%v+el(JO{KPMdFN8whf-h2X6UM2GL*}3{6+4bq4tqe8xKVjjy^R%Qm+; z=LNPkx4G}T1DJYeEB-~Bwz9o;>hpw?b~w8qmeU{e_xGSjJnxV!=NRofcpJwU?mPNy zzTBPSJF(gvK}|4%SyRL%bv5Ol;#&s9v_(Pcnb(t#V%>lcUmo58H{U>%W5%AM+#+l@);!{$2#1rJ+q`*2p035zvAUf^3 zTr$aZbnGj)O38r=UO_-!scYEQMOJYv?z6`y;fokSFJu!`cE~5}AwV!QmT&W~l4k7h zG;`2umLEMflcW-|l*Hhp6Z|kRGoUFW#&=1ZWEAhIU=tG&u2XU z(eOJ5b8ybDKG^*oph?h+-aNenYoIA>#~uPD7--+(g<8;%UFmgjYF!lTBc*!KL5V_{ zCF={TFJH~u$EsNgJaiqb7^S@CZHugLbekqlJ096g*!iXqralg9fPHv7dEv=CIhK`p zw1G?btP(8RM(`O&4A>?_S|^lO^;ir*Y!Yxig3+vBIjRCHj?(v((<=;q#@NgCP^I_m z45zK>PTtsaQ216NS+75W6&S(|ia5hVK*j9Pv2%4UD?S-iU`~;K*SmFMSLVq(=4trT zszHpmDFEt*Y*9YY3_jo!IYHcBf9jm^F~Cd>YYX&`Y=l(d=U%X~i2e%@$DERM%CGzg zxkcm|p_fLC7&;-TxLo%vS{NVUwZh`U%Jl}{z3 zPmD%4L(ZLA8^v$|Qpqj&!)+7fF2dv#F9e(t9%u!L;S;pKrJvN$Z+96UxZ~c)pbtcd z>HZc(o|zC6)b^q47Dqqfoh@2y3>@(C5;WCV5n;XfYaF`I90bClvN$O5>x8WeKH9C}?w}v_+;lCQ{&F7;N$PlkQP zOdXl;AK`7?N^QaYPONYJ=z*B-jNiUOt#pY^mEFiIeR1U#-<~{`;S=?)%2~<@SgAfo zD0Wr4!{Ni6F`0Ya@w zg=?bqE8S-9Fe1%0nvh{+1cDEOWP-mco<^Q@#M2atJ&8Z13~mtP_q;>^}_@$kzf>#7QH+W5!K12OW6h& zaQy>R`qLvYPZWu+Bo=T{Am>4_xFO<1$VHCafvY-Y4CpJlMUKlU;pd?xpJji|>|h$(epHQ)Vd&^e9<2I~6IWJ>DT) zDT6d>!cI))w<*es1XT%Xgiea-{IbHUBeX3n?+T81Wu!c`X$qnXCA2GS_9jtzR8bCX zi05J~(F$4*sAgZ(|FxMHe66fG&E#HkEZv>(MNL*39y`&vkk%zxd;o9v#$G~+sFm__2E-QGIR_Vjcz2oO~$Lw{0^lk3D3tMGAyIb|*A72@BMX*0_<@jUpCWA+IbEEz8I~1Ez(5$iT*AB%1zZ zQN|bTj>IWHfyO2Q`$+DGK!sT@`o#(Ny^#w-ixBB)+nr z>yXo*=YMc5V((~YWa8vRCurepV_+};ua%wSzph1GVt612_>qH7EtoA$_6eHq_vOgc z)zu*&bN1Rb4kQy`?2KT|_5rz*%;zNSBMj2~V?DU-+yI=OjD{FIgW8nstigkh-N{4> zc1W@+lFZD2?6i}m+A}_Nzyk|=E9$jUH3rU<@OY(b7bBMh)v(AYEydkUPA@ZS+Qq|#6A2v)RkNyf>1FPgw2U85jpMb@<0Adc8C7P(L2Zw zVF2zYC-{Hh8}sk){(s;N{Oe;BtJD4x2~sncDJbcgs1Q z>2^D5<@5Cg-Q#pc3_H}sHgnKnMQTV-nvQ0-Jy882oZk#Wk6L3py%PI-Y^5w@gE*?Q z2Xfz#)`fXtOF=;I`vOhACLIEb`R{Azw>9ZdrmRX<4u2Z9cXf9qXlWXYqvk}M3bqC- zEl&EIaWrd$e0N>G`r8M%7_iBN=q{FPz(O#A4pv{rT!Q7avF5YkT(+OT4YXVom~PaR zW#rhl<&@J+h6iM*D|Z+-w;F=F%7*rkX{IK?cvJolQGDp|l9j&bwL{V-O>T+0z#iB4h2~UB1td18)zr`5G~2 z1uxDd?Q&KXr#Ok1kXWR&PtU9@aOG6mqZpCCs;!zCvlx;7wzy3?_{KUu$MJ#$A$qUh zHWQ;_H1+0cc^^~c0lQB_h8@Z`Zhb|ZeJcTnyi3~UPv8-7+1dgr-Hdas%(^mD zpiw*7pcz3nhmXMiKH{KphmFI`=Ooh*&*B=BF|YUH4*$z?_hqW6uFk{JCVz2{zzO+V zj98z7;;boaxqDXeE+|jnS-zz^>>zP&sht>zkN5b7=gx*HVvM zVXeiM&{yykRNd7XAmMsFuyErcSeS{JA=ufQz_~a6OJ3>*wBgvoc_Dfq`aXK;V$A_# zwR8*hJ|r(l5^+2|i3BwQi3GC(i3B%;=3nr0_~}~b0Bx^?Z82lK?vK4)L-utvukcsV zBvPY~C+p8JCK?4UVLyYUqcb`5Fnts0h+QIrP9bQ;)kmlh)+1+WO>ciT*m!SZ3=x#V z$i0iklmU?Y^rF~xnD@}_BEMB+luwIc%4I?12F&7YjDuNowG7dOW%OyQup-}4lNblt z9sRlFRo-u;|Cbr^PZ+ryh_<)7vMW+f@v zSp6_Ud|4&D#yy(rt1+#7uGdK^aaG{+DFtQr=;;oIU-R*doiq}vGdmmHQs05Tari3n z2^aA8ViC;_u_6f7+p^QmY){kM)7#~8`L2N5A|_cW*%bnUj}bM21Bbm$phK!=d6IWY#XcleEEc>&7ZIj<9QY8cUepiu^}`82UK(obw9@p#*yMZ)~o?wt=> zWQS6<4I3Q4h*1NU?@RqI>}RJ-h!z-eqajZmg4$yB!?Y^T*%n=H@igs1Nu%R%)SP+{ zTt5Mi*cr)#G2rrx{s-Q5>sU8~+&2zn@C+65jm$oEe>#PCH1>}PE4%3#oW?NbIX5iQ z;8oHo=!pbwp%%)52{u9d_n>CpVcy-?0HLO+{1xJxBfBI6zrVY`le4v9BQzyi?|;ck zxag1e@&92S-68-0aR0a14*#bb`_~S(toGriyo~Z~d*WbrvlR!XJ*WgJJQhd~Y8)n9 zhaMIsBS?&ZY<)dFCFAJ8$h6b$k%uz3@e0taSnnUe&;+VQuF@CB>pU;A*}Q@GuH|=` zTTrsg;l`Lg*Js$TsZ*(8f5ZEc_4WD8@iE2M^EQ|Yz`FN>shY1Q1p3ar#$L7$S~S$e z7bRK*nhZfuX+WY2Jt!bsr_+xMZXj)w{!;y8@V4AQHTlMb-~5R z!cu&|0>d|OX=o=34Q!x%IEpEH7ZSpDpMt&v>*Og7J*v`Gc%XxFOYs|sCr4IG)@fqu zxGF1Puh4bFwUy#-dFe)F&u)g82Gpe5b;AQuh;0&K943aI!o)LKc;=o230sR3R^7%NM{MvbX z2+GD(6{zqaXz3dOm~v>*P^h{WSecADI=xuMNgZ}-@r7F-#fYRG--U&_`5ve`*fMpY zkGMT#QtWj#hANFX4oS)mN+Bst1+K0?_=H=7+a)yH&#lb^a%O@hi&HY;*`Qi2veN;{ z44T&n7v37}CR`5K&(s4kaq#wvBH&y;p$jQx&)K7MFWCbdIWy`MM#azz$G=&f)H9au zajZ{+^A3&b-^;6Lodfd7rWo`RXQt8b0DZzcLa+gB(UhCjPF2-I*mcVS%(Vq8B!0cAm`r@>!tiKvm%pc4AcYh zx+(FiS^H`fsq0aOe?fPU!8rV-x#~91doa=Pw zD)>+tKSk+Lppax(P!?~bwcHdku;N9a!Uq$$yUo@qmN35gC%|(8Z9&A#4&6oV z)5v5s%=7v6sGSWic173bNbm72taA{s$l}qo9Kh<2pJ6oIAs|?!qh^gM`Q|C36vZX*IXuyw}jDhO7sLIZ<5=>Tl;x65|X{S zxrwA431|;A6e)c^K|Umc&(7Il;~*Dz7u{o$Nb9x3?~u1+%U*LnUwlaZj^0tB3VT-y z5lnE$;vEt62=WcpV|C*Uh4>AD#}r`+iRur@O9ZXz_P5RuDWX(B=5hy0%Bp3JA~Jm4 zL7!mtr;SvrV#H!|^0LkKx@j-%?EU-x0Mmz^l1LvfSMa->xP&2bfSMW!P8wNe3Zh80 zm5p^Jx3?lmw+1RKf!~zoE_32}Ip#We0bqn6PTkcac^xWX50SHUlGQdoi-VN!*vMD6g*~?LE0Iu{9D`!(Z%PjjBdK_zMVuE zD&?BhCdvMm7%3nLvNAjsWuXlg|8?!RKHer8wmL~)9_7=wVpT^fWi<_&#z6={J%}Oa z5C4|oE$B9mwVWX2Wg-%Yuj4c+F`d_E};7{83)+%sCg|y|(!&-g{FU<@&tpNsdeN)#p zDL+mqUEi)^eMs)B_Q}?O7CO&(VowT}ED_>&J%Mb`q@44^X-9g{6zHD|sHQaxOta+Z zT#&i=vV`Jny%M5(tOsfQaBAmH@C|1sSAux&;d3B(Vc|?W<1vR;r=|uQdk4t%$?7jat8q(&gk(#OFT0+kNTbP`Ip$|CW zt3&LCdPSn_I}9M(f6RNLn24pLvIwYr8_bi&*$s@eW1UhS{q>kG))j+i!=SKYmt{sVpapQ;D0 zEljcfIWVgKxIp}bIRO~i+0fbAIXOETFfh@%*jl)nI64_vTi6(wnOOf@a1-6X0KN3T zPoa|R>^7B=M{+aS9j-i?n>N*3fi}&>zFl-TU{;>sWIA0U#mk$7MUd#?GSj98>&Z6P z_lTn4`Zv2n(Bui~TN7XDy@7(~|xQsa!&ICFayyxd%zwd04Wy6{MHk{*Y3T$yX+dw>Vqkidw z#D3#uq?{)rLndeA^4)#(anD&vG?ka)&+IfJ}4n?(#}p|6wbPl0A_lvuW_Mf_t2R`iO!MdE!JGRfsAJO zS4G?|2>%{oiM~D0U@5Zlk^5@>L8d>2`Fc8Mv=IT#GO_G6$-gaB|EVsN#!nyE=r z|0#U(<5KcRP(Z>t3N3xz^cw(Pm{rhEg-nTynKHeJNHdm2@{e zQoPGjDk&l)zi4R|R8VZGS^LoYSfFxf z?~jiZj9P_-`(%f>vX;$7EN{*Cih<(jRK?7R+ z85}uf)ir8kfEjJc{UyVM-&Pd&-T7bs@{bDYjxRkTjNqt3S`U6>-f453;;-iE1 z4bc%BeWo83`v&cTtT_XpmhznG`&oM4=e4Mt7C(DD^>cO#@jVGHEJ+~Su&Hi0a zo~HMNdYkW$ee*x>m|q|5WaV5!u-vcco1rIPv);%RU-mt;b<<`lWlou4?rXA1OW?a% zf;24Y7P;8ZnAdda!IU*`?M3Dkbh$UT_^G74^1Qk-=iZ~2yz^Ii$!^0n0O`PI4`90?*6mic|Y;*DeRiw;}*2nnP-xMt|*KYKFeQ>?J+T1JhsT=ZTuKj^azq3F_Gg;_Hl*cruj6>5Kf-mT+ z&_2pWYkd>Cs92NiUPBjnA-$#NY}ONLV>R;+PphCKAcpd|i z^v;Jd%^zeUz6krh3zb@U&!kHYtBTE-v_N9mCGZNoF(opl>S^C8J@K>!lcU0 zJ?eW{$+n}9rQ4SnerR>GqdQmG@Omc7zI1=@bk=hjJtvD-cZvR6wxLH>?|<$i-DR%aD-aY>F9zNf0a7R<`4cGFQXip$9^s{TNlBNgjgMHanq zK+;$tHLq!5zU%R;Nvo8zJA6)dY>+9cKNPcw6eObXdD@kKmKBO`El&y;xxDYc&cW&h zgLwtj3uL{)mk9i3VPLDPYGP@)goF#mlLvQBj{Gn@pMd$pQ2D40R6c4fE1!Yo_L0pQ zbJN@)L$$BGQf1Uv0~CJDdXTVkwPKz))Mwgo_0VbpDSjaBRub`wodu;?U1+Uxxt?Hf zLOh+%ULre^r&PlD4DNB5t7K$Q{KG`$hhHz{{rtVD+gmE+v3lBy$nEpwZ+M$NnsYGu z{iW5U`oj-*-}0VZU$@|h;fk{gp>&6{&6`y;eG5ceC*R2`O(Au!DQ#U7t8JWe)3b=j zi&&*oR^FCGbTiC~X`Gtr^67u&-rpjp6{g;n{{HUATb|kCCP8llQo?q*S#Bz=F48=H zbCFG`x#3mOshMT5_AA5MoYaq4>bpx+ZQ5~9H%R%*rLg4dhZIV&x?5%>$|kuK7i~7k zuJO9zsI0mBfia(b=adMy`quw8gsnR2y!h0mbGkiqU+*H8-{5baO;mCVHYzj2PpW8} zFI2p!GR96aEay{`=^qkhlPpdeOV!W%(Hr}1SD8q#Ua*4CiOGV&SJe1gg4&;3Z2xW_ zqnmAQB)jp|=LnnbJ2@6nviYm$#TT?%$@#52c=?s5uzv2X>DQZWo&J{e4|^#$msF&v zQIO-RJww*lO!t25YU6FQmS5VrB*r;b*k`uHH-5FudgZmM#hX5+x_Vu=xb4!odr(JEnr){rbR8vxS=BHWeLL&bMYL>M}H0|ul z0;~rthjjY6_mEbFV7Ghv)0!)`<@Z|e6fxKU&mX)Qi+y+VzOD1WmuslgNZ0;0S>vtScI)8t z%x9uT?+KfQ<~bjK`Q?&Yd5=zf%ZA=+I1-m6`A-Bej0vJ82k?eCIb)n8Gjl)R#z6F+H+*9 zJrA767W|mKR7JIVl!I1134tDCHm!+j`VFT|6G(oyaU?j` zWlRFHcG3SrOc==lfrKYf0=A9WIJ)}}IB$Gh1tB3a)O{5g@W=N+4@$t;4x={EW?w{5 z*l!dU7)S`Da-fn@j@$Oc`v-B-dtpcjY^uZ)??Le#yKS_$IC0Q6A<&PA8{1pdQEJcN zpm9nF87Tr$if2xY=&pZazjYXG`fjZop17D3Av$sC!Wm5C>%4zGaHv)O{#<^5*Fhb; z;x?SFzHU$<7z~~E7hA0ki+(*^ARf-n@mP;!$o^$VW}0q6z27yUNJHk*MbRW-1RGz5 zVYES#ZU`=b1rAY}gQm`x=YVns?QcNgkTRVkTwi7|BoOiIDM4haIe|o=;*pbrMw1r7 z-(R=)XDXocK{hiKK1zriJcFw1J(ijgFn_-ILLo5f0Wd0B?pQHyz_t`Bj)>fO#Gc%h z1&?JLLG30WyD3U;AvnLEbG6%%VPTsMeLMV!YV-!NYd~xR6xU3eLoTzR19w{ucW6Y@ zqObF)IDQOf<_rvGJqjr)_lro@5!8H-a6AJ*FW?95Q;muo0vV$<;?$Nn65a?;#s}bF z&5!R0hkwE+iiOL#9l!1|j z-56pJ`;(W6p%ufe$E6>wOFL`<^g^Ippy*;yV{t_f+P;088GhTiXpK4Xo!7v`t|H8S zc4H-XXmebEH$HG6XOG)~MZF@0$3gbDAiEVxcAj-ycA!6dLEau0zMxVd#vPcZZQ+;zbLkMkW@a>wQ3W#^&FA_(^HI2a() zX;p3yZIM_tcxIzqX)?+o*YAmi8w|Xma$mY6$>~VIJVJ%knm2Y`FOE~ zL?%#-xlaFlM2|@E@C765BeRo{<5k~qVSjaU6Ub=_Hq}8v6$sox$AAU&9-{RC%pG9p zg3HO5JD7Q2wkG@HJ=u^o>vmpK709>}x`56afggc0b`N}!$DE4uu^i=PQ&Fit2% zcakR#uIrB6>)=5(p|Yq?`UcEK!{Qy_WI-@QyP&$!NS(ND=;H%D@MKTq^xDxnQZAt$ z>JJ^UgpQzn;bzFhb!1e$Me4Il>EH(;P%7D=^pLZC;_#MGx3P{pd~Gl89-On+tH)eA zT--5X{E=uRwYB*<{Ur>V-vm*pixRyzfm8J0)DF4)&Kk$lUE_BZaL>T`nbKM^r#M3# zfoOxr1yacKkY8=L`LR$hB4cb%a_ng^?|m>YvUz0SMW-bk<{mmyKqRD^Y75nV0|5!Z zG8_QGJDrwxgku&lC~ynj(}e67M8#4A@Ho;)CL*8y%2fZ!ARn@}iLODE(l})fKK>2D z)f^VekO>ZJYG;Ytv%?^%Czw(XC290=uBccK91%ad6>BV3?)w0|HsB$rXAivSvv6mFwm9^_2_EcRV8TSN&qZ6R$X>fA^r%)_1F~qYUChwoe9?JlMJAjQg ztWq(jYAQe^AEbqL8N%Vl-d;~pm`J9NPWB)E{I57Pa%5|yn|qU zjzA$BLLCg3!saplpY0YHPCXfaWG(%VxCG^&5JOt<3@h}g`uxd6bcHq5w1+3)0tn6n z7S=~8z^ILFswd-0PX9>*P?jOrby$t#NC0oz^Sp@;!5avpk12}i^_pX%ArqxBo`jtj0Yo-JxBHr6m7h=L$3I$bSq=a^~(*EKw0w%K=}!=Rd3C1ym? z?J_vQ4KTq86lY$B#&%8+dZbSw;59SU()NI+XF;AsTUhu%j=}xoACt(exmOOSt0^Eg z4P3cF*WF*gvCUu|_=34_&_8Lj+~ zv@y74oH$7TInokO4WR`1>f^}-m@OmQdGrUBJ(`Pkl; zrm?Zd-T)>AKQ)*Oj0odjhmJWq6kqGWrhq+f!W{$XKwjrr2-@?u;4D$}*A;g+A_7RNz!pw~`?_nHjyytKB8y~r&afmbWo_1J0 zX1qi(KY#xB56{re=>yw_M!z8*Myz39R?ZsnWeAvYw-Jrr{LmyH>02;2&5ydRXn@Lk zW6^+EblRf{q%yV{4Vi<#Z;Ju*u8JY}##3BqbQF;hI3y;<9t&$TK4hH^;|Kq=sYBtB I3ndTc|9d~FF#rGn literal 0 HcmV?d00001 diff --git a/core/res/layout/activity_rssfeeds.xml b/core/res/layout/activity_rssfeeds.xml new file mode 100644 index 00000000..2bb1895c --- /dev/null +++ b/core/res/layout/activity_rssfeeds.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/core/res/layout/activity_rssitems.xml b/core/res/layout/activity_rssitems.xml new file mode 100644 index 00000000..e47b5d8d --- /dev/null +++ b/core/res/layout/activity_rssitems.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/core/res/layout/fragment_rssfeeds.xml b/core/res/layout/fragment_rssfeeds.xml new file mode 100644 index 00000000..2d2d56f6 --- /dev/null +++ b/core/res/layout/fragment_rssfeeds.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/layout/fragment_rssitems.xml b/core/res/layout/fragment_rssitems.xml new file mode 100644 index 00000000..748bd5d3 --- /dev/null +++ b/core/res/layout/fragment_rssitems.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/layout/list_item_rssfeed.xml b/core/res/layout/list_item_rssfeed.xml new file mode 100644 index 00000000..00ca102a --- /dev/null +++ b/core/res/layout/list_item_rssfeed.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/layout/list_item_rssitem.xml b/core/res/layout/list_item_rssitem.xml new file mode 100644 index 00000000..eca6a3e4 --- /dev/null +++ b/core/res/layout/list_item_rssitem.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/menu/fragment_rssfeeds.xml b/core/res/menu/fragment_rssfeeds.xml new file mode 100644 index 00000000..94b4cfbf --- /dev/null +++ b/core/res/menu/fragment_rssfeeds.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index a5608379..15043d59 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -118,6 +118,9 @@ The Barcode Scanner could not be found. Would you like to install it from the Play Store? No compatible file manager could not be found. Would you like to install IO File Manager from the Play Store? + You have not defined any RSS feeds yet to monitor. Torrent-specific RSS feeds keep you up to date with new releases and you are notified of new items. + The RSS feed is not available or it contains no items + Servers Add new server Search sites diff --git a/core/src/org/ifies/android/sax/Channel.java b/core/src/org/ifies/android/sax/Channel.java new file mode 100644 index 00000000..019edc7a --- /dev/null +++ b/core/src/org/ifies/android/sax/Channel.java @@ -0,0 +1,149 @@ +/* + * Taken from the 'Learning Android' project,; + * released as Public Domain software at + * http://github.com/digitalspaghetti/learning-android + */ +package org.ifies.android.sax; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import android.os.Parcel; +import android.os.Parcelable; + +public class Channel implements Parcelable { + + public Channel() { + setCategories(new ArrayList()); + setItems(new ArrayList()); + } + + public void setId(int id) { + m_Id = id; + } + public int getId() { + return m_Id; + } + + public void setTitle(String title) { + m_Title = title; + } + + public String getTitle() { + return m_Title; + } + + public void setLink(String link) { + m_Link = link; + } + + public String getLink() { + return m_Link; + } + + public void setDescription(String description) { + m_Description = description; + } + + public String getDescription() { + return m_Description; + } + + public void setPubDate(Date date) { + m_PubDate = date; + } + + public Date getPubDate() { + return m_PubDate; + } + + public void setLastBuildDate(long lastBuildDate) { + m_LastBuildDate = lastBuildDate; + } + + public long getLastBuildDate() { + return m_LastBuildDate; + } + + public void setCategories(List categories) { + m_Categories = categories; + } + + public void addCategory(String category) { + m_Categories.add(category); + } + + public List getCategories() { + return m_Categories; + } + + public void setItems(List items) { + m_Items = items; + } + + public void addItem(Item item) { + m_Items.add(item); + } + + public List getItems() { + return m_Items; + } + + public void setImage(String image) { + m_Image = image; + } + + public String getImage() { + return m_Image; + } + + private int m_Id; + private String m_Title; + private String m_Link; + private String m_Description; + private Date m_PubDate; + private long m_LastBuildDate; + private List m_Categories; + private List m_Items; + private String m_Image; + + @Override + public int describeContents() { + return 0; + } + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeInt(m_Id); + out.writeString(m_Title); + out.writeString(m_Link); + out.writeString(m_Description); + out.writeLong(m_PubDate == null? -1: m_PubDate.getTime()); + out.writeLong(m_LastBuildDate); + out.writeStringList(m_Categories); + out.writeTypedList(m_Items); + out.writeString(m_Image); + } + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public Channel createFromParcel(Parcel in) { + return new Channel(in); + } + public Channel[] newArray(int size) { + return new Channel[size]; + } + }; + private Channel(Parcel in) { + m_Id = in.readInt(); + m_Title = in.readString(); + m_Link = in.readString(); + m_Description = in.readString(); + long pubDate = in.readLong(); + m_PubDate = pubDate == -1? null: new Date(pubDate); + m_LastBuildDate = in.readLong(); + m_Categories = new ArrayList(); + in.readTypedList(m_Items, Item.CREATOR); + in.readStringList(m_Categories); + m_Image = in.readString(); + } + +} \ No newline at end of file diff --git a/core/src/org/ifies/android/sax/HttpHelper.java b/core/src/org/ifies/android/sax/HttpHelper.java new file mode 100644 index 00000000..529f76af --- /dev/null +++ b/core/src/org/ifies/android/sax/HttpHelper.java @@ -0,0 +1,150 @@ +/* + * This file is part of Transdroid Torrent Search + * + * + * Transdroid Torrent Search is free software: you can redistribute + * it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later + * version. + * + * Transdroid Torrent Search is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Transdroid. If not, see . + */ +package org.ifies.android.sax; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.util.zip.GZIPInputStream; + +import org.apache.http.Header; +import org.apache.http.HeaderElement; +import org.apache.http.HttpEntity; +import org.apache.http.HttpException; +import org.apache.http.HttpRequest; +import org.apache.http.HttpRequestInterceptor; +import org.apache.http.HttpResponse; +import org.apache.http.HttpResponseInterceptor; +import org.apache.http.entity.HttpEntityWrapper; +import org.apache.http.protocol.HttpContext; + +/** + * Provides a set of general helper methods that can be used in web-based communication. + * + * @author erickok + * + */ +public class HttpHelper { + + /** + * HTTP request interceptor to allow for GZip-encoded data transfer + */ + public static HttpRequestInterceptor gzipRequestInterceptor = new HttpRequestInterceptor() { + public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { + if (!request.containsHeader("Accept-Encoding")) { + request.addHeader("Accept-Encoding", "gzip"); + } + } + }; + + /** + * HTTP response interceptor that decodes GZipped data + */ + public static HttpResponseInterceptor gzipResponseInterceptor = new HttpResponseInterceptor() { + public void process(final HttpResponse response, final HttpContext context) throws HttpException, IOException { + HttpEntity entity = response.getEntity(); + Header ceheader = entity.getContentEncoding(); + if (ceheader != null) { + HeaderElement[] codecs = ceheader.getElements(); + for (int i = 0; i < codecs.length; i++) { + + if (codecs[i].getName().equalsIgnoreCase("gzip")) { + response.setEntity(new HttpHelper.GzipDecompressingEntity(response.getEntity())); + return; + } + } + } + } + + }; + + /** + * HTTP entity wrapper to decompress GZipped HTTP responses + */ + private static class GzipDecompressingEntity extends HttpEntityWrapper { + + public GzipDecompressingEntity(final HttpEntity entity) { + super(entity); + } + + @Override + public InputStream getContent() throws IOException, IllegalStateException { + + // the wrapped entity's getContent() decides about repeatability + InputStream wrappedin = wrappedEntity.getContent(); + + return new GZIPInputStream(wrappedin); + } + + @Override + public long getContentLength() { + // length of ungzipped content is not known + return -1; + } + + } + + /* + * To convert the InputStream to String we use the BufferedReader.readLine() + * method. We iterate until the BufferedReader return null which means + * there's no more data to read. Each line will appended to a StringBuilder + * and returned as String. + * + * Taken from http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/ + */ + public static String ConvertStreamToString(InputStream is, String encoding) throws UnsupportedEncodingException { + InputStreamReader isr; + if (encoding != null) { + isr = new InputStreamReader(is, encoding); + } else { + isr = new InputStreamReader(is); + } + BufferedReader reader = new BufferedReader(isr); + StringBuilder sb = new StringBuilder(); + + String line = null; + try { + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return sb.toString(); + } + + public static String ConvertStreamToString(InputStream is) { + try { + return ConvertStreamToString(is, null); + } catch (UnsupportedEncodingException e) { + // Since this is going to use the default encoding, it is never going to crash on an UnsupportedEncodingException + e.printStackTrace(); + return null; + } + } + +} \ No newline at end of file diff --git a/core/src/org/ifies/android/sax/Item.java b/core/src/org/ifies/android/sax/Item.java new file mode 100644 index 00000000..07cd4ee0 --- /dev/null +++ b/core/src/org/ifies/android/sax/Item.java @@ -0,0 +1,146 @@ +/* + * Taken from the 'Learning Android' project,; + * released as Public Domain software at + * http://github.com/digitalspaghetti/learning-android + */ +package org.ifies.android.sax; + +import java.util.Date; + +import android.os.Parcel; +import android.os.Parcelable; + +public class Item implements Comparable, Parcelable { + + public void setId(int id) { + this._id = id; + } + + public int getId() { + return _id; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getTitle() { + return this.title; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDescription() { + return this.description; + } + + public void setLink(String link) { + this.link = link; + } + + public String getLink() { + return this.link; + } + + public void setPubdate(Date pubdate) { + this.pubDate = pubdate; + } + + public Date getPubdate() { + return this.pubDate; + } + + public void setEnclosureUrl(String enclosureUrl) { + this.enclosureUrl = enclosureUrl; + } + + public void setEnclosureLength(long enclosureLength) { + this.enclosureLength = enclosureLength; + } + + public void setEnclosureType(String enclosureType) { + this.enclosureType = enclosureType; + } + + public String getEnclosureUrl() { + return this.enclosureUrl; + } + + public String getEnclosureType() { + return this.enclosureType; + } + + public long getEnclosureLength() { + return this.enclosureLength; + } + + private int _id; + private String title; + private String link; + private String description; + private Date pubDate; + private String enclosureUrl; + private String enclosureType; + private long enclosureLength; + + /** + * Returns 'the' item link, which preferably is the enclosure url, but otherwise the link (or null if that is empty too) + * @return A single link url to be used + */ + public String getTheLink() { + if (this.getEnclosureUrl() != null) { + return this.getEnclosureUrl(); + } else { + return this.getLink(); + } + } + + /** + * CompareTo is used to compare (and sort) item based on their publication dates + */ + @Override + public int compareTo(Item another) { + if (another == null || this.pubDate == null || another.getPubdate() == null) { + return 0; + } + return this.pubDate.compareTo(another.getPubdate()); + } + + @Override + public int describeContents() { + return 0; + } + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeInt(_id); + out.writeString(title); + out.writeString(link); + out.writeString(description); + out.writeLong(pubDate == null? -1: pubDate.getTime()); + out.writeString(enclosureUrl); + out.writeString(enclosureType); + out.writeLong(enclosureLength); + } + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public Item createFromParcel(Parcel in) { + return new Item(in); + } + public Item[] newArray(int size) { + return new Item[size]; + } + }; + private Item(Parcel in) { + _id = in.readInt(); + title = in.readString(); + link = in.readString(); + description = in.readString(); + long pubDateIn = in.readLong(); + pubDate = pubDateIn == -1? null: new Date(pubDateIn); + enclosureUrl = in.readString(); + enclosureType = in.readString(); + enclosureLength = in.readLong(); + } + +} \ No newline at end of file diff --git a/core/src/org/ifies/android/sax/RssParser.java b/core/src/org/ifies/android/sax/RssParser.java new file mode 100644 index 00000000..91288051 --- /dev/null +++ b/core/src/org/ifies/android/sax/RssParser.java @@ -0,0 +1,237 @@ +/* + * Taken from the 'Learning Android' project,; + * released as Public Domain software at + * http://github.com/digitalspaghetti/learning-android + * and modified heavily for Transdroid + */ +package org.ifies.android.sax; + +import java.io.IOException; +import java.util.Date; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class RssParser extends DefaultHandler +{ + /** + * The constructor for the RSS Parser + * @param url + */ + public RssParser(String url) { + this.urlString = url; + this.text = new StringBuilder(); + } + + /** + * Returns the feed as a RssFeed, which is a ListArray + * @return RssFeed rssFeed + */ + public Channel getChannel() { + return (this.channel); + } + + public void parse() throws ParserConfigurationException, SAXException, IOException { + + DefaultHttpClient httpclient = initialise(); + HttpResponse result = httpclient.execute(new HttpGet(urlString)); + //FileInputStream urlInputStream = new FileInputStream("/sdcard/rsstest2.txt"); + SAXParserFactory spf = SAXParserFactory.newInstance(); + if (spf != null) { + SAXParser sp = spf.newSAXParser(); + sp.parse(result.getEntity().getContent(), this); + } + + } + + /** + * Instantiates an HTTP client that can be used for all requests. + * @param connectionTimeout The connection timeout in milliseconds + * @throws DaemonException On conflicting or missing settings + */ + protected DefaultHttpClient initialise() { + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", new PlainSocketFactory(), 80)); + + HttpParams httpparams = new BasicHttpParams(); + HttpConnectionParams.setConnectionTimeout(httpparams, 5000); + HttpConnectionParams.setSoTimeout(httpparams, 5000); + DefaultHttpClient httpclient = new DefaultHttpClient(new ThreadSafeClientConnManager(httpparams, registry), httpparams); + + httpclient.addRequestInterceptor(HttpHelper.gzipRequestInterceptor); + httpclient.addResponseInterceptor(HttpHelper.gzipResponseInterceptor); + + return httpclient; + + } + + /** + * By default creates a standard Item (with title, description and links), which + * may to overriden to add more data. + * @return A possibly decorated Item instance + */ + protected Item createNewItem() { + return new Item(); + } + + public void startElement(String uri, String localName, String qName, Attributes attributes) { + + /** First lets check for the channel */ + if (localName.equalsIgnoreCase("channel")) { + this.channel = new Channel(); + } + + /** Now lets check for an item */ + if (localName.equalsIgnoreCase("item") && (this.channel != null)) { + this.item = createNewItem(); + this.channel.addItem(this.item); + } + + /** Now lets check for an image */ + if (localName.equalsIgnoreCase("image") && (this.channel != null)) { + this.imgStatus = true; + } + + /** Checking for a enclosure */ + if (localName.equalsIgnoreCase("enclosure")) { + /** Lets check we are in an item */ + if (this.item != null && attributes != null && attributes.getLength() > 0) { + if (attributes.getValue("url") != null) { + this.item.setEnclosureUrl(parseLink(attributes.getValue("url"))); + } + if (attributes.getValue("type") != null) { + this.item.setEnclosureType(attributes.getValue("type")); + } + if (attributes.getValue("length") != null) { + this.item.setEnclosureLength(Long.parseLong(attributes.getValue("length"))); + } + } + } + + } + + /** + * This is where we actually parse for the elements contents + */ + @SuppressWarnings("deprecation") + public void endElement(String uri, String localName, String qName) { + /** Check we have an RSS Feed */ + if (this.channel == null) { + return; + } + + /** Check are at the end of an item */ + if (localName.equalsIgnoreCase("item")) { + this.item = null; + } + + /** Check we are at the end of an image */ + if (localName.equalsIgnoreCase("image")) + this.imgStatus = false; + + /** Now we need to parse which title we are in */ + if (localName.equalsIgnoreCase("title")) + { + /** We are an item, so we set the item title */ + if (this.item != null){ + this.item.setTitle(this.text.toString().trim()); + /** We are in an image */ + } else { + this.channel.setTitle(this.text.toString().trim()); + } + } + + /** Now we are checking for a link */ + if (localName.equalsIgnoreCase("link")) { + /** Check we are in an item **/ + if (this.item != null) { + this.item.setLink(parseLink(this.text.toString())); + /** Check we are in an image */ + } else if (this.imgStatus) { + this.channel.setImage(parseLink(this.text.toString())); + /** Check we are in a channel */ + } else { + this.channel.setLink(parseLink(this.text.toString())); + } + } + + /** Checking for a description */ + if (localName.equalsIgnoreCase("description")) { + /** Lets check we are in an item */ + if (this.item != null) { + this.item.setDescription(this.text.toString().trim()); + /** Lets check we are in the channel */ + } else { + this.channel.setDescription(this.text.toString().trim()); + } + } + + /** Checking for a pubdate */ + if (localName.equalsIgnoreCase("pubDate")) { + /** Lets check we are in an item */ + if (this.item != null) { + try { + this.item.setPubdate(new Date(Date.parse(this.text.toString().trim()))); + } catch (Exception e) { + // Date is malformed (not parsable by Date.parse) + } + /** Lets check we are in the channel */ + } else { + try { + this.channel.setPubDate(new Date(Date.parse(this.text.toString().trim()))); + } catch (Exception e) { + // Date is malformed (not parsable by Date.parse) + } + } + } + + /** Check for the category */ + if (localName.equalsIgnoreCase("category") && (this.item != null)) { + this.channel.addCategory(this.text.toString().trim()); + } + + addAdditionalData(localName, this.item, this.text.toString()); + + this.text.setLength(0); + } + + /** + * May be overridden to add additional data from tags that are not standard in RSS. + * Not used by this default RSS style parser. + * @param localName The tag name + * @param item The Item we are currently parsing + * @param text The new text content + */ + protected void addAdditionalData(String localName, Item item, String text) { } + + public void characters(char[] ch, int start, int length) { + this.text.append(ch, start, length); + } + + private String parseLink(String string) { + return string.trim(); + } + + private String urlString; + private Channel channel; + private StringBuilder text; + private Item item; + private boolean imgStatus; + +} \ No newline at end of file diff --git a/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java b/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java index 9c813e61..3505d9e9 100644 --- a/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java +++ b/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java @@ -11,6 +11,15 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.text.Spannable; import android.text.SpannableString; import android.text.style.TypefaceSpan; + +import com.nostra13.universalimageloader.cache.disc.impl.FileCountLimitedDiscCache; +import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; +import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; +import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.ImageLoader; +import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder; +import com.nostra13.universalimageloader.core.assist.ImageScaleType; + import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Style; @@ -25,6 +34,7 @@ public class NavigationHelper { @RootContext protected Context context; + private static ImageLoader imageCache; /** * Use with {@link Crouton#showText(android.app.Activity, int, Style)} (and variants) to display error messages. @@ -38,6 +48,24 @@ public class NavigationHelper { public static Style CROUTON_INFO_STYLE = new Style.Builder().setBackgroundColor(R.color.crouton_info) .setTextSize(13).setDuration(1500).build(); + /** + * Returns (and initialises, if needed) an image cache that uses memory and (1MB) local storage. + * @return An image cache that loads web images synchronously and transparently + */ + public ImageLoader getImageCache() { + if (imageCache == null) { + imageCache = ImageLoader.getInstance(); + Builder imageCacheBuilder = new Builder(context).defaultDisplayImageOptions( + new DisplayImageOptions.Builder().cacheInMemory().cacheOnDisc() + .imageScaleType(ImageScaleType.IN_SAMPLE_INT).build()).memoryCache( + new UsingFreqLimitedMemoryCache(1024 * 1024)); + imageCacheBuilder.discCache(new FileCountLimitedDiscCache(context.getCacheDir(), + new Md5FileNameGenerator(), 25)); + imageCache.init(imageCacheBuilder.build()); + } + return imageCache; + } + /** * Whether any search-related UI components should be shown in the interface. At the moment returns false only if we * run as Transdroid Lite version. diff --git a/core/src/org/transdroid/core/gui/rss/RssfeedView.java b/core/src/org/transdroid/core/gui/rss/RssfeedView.java new file mode 100644 index 00000000..694f618f --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssfeedView.java @@ -0,0 +1,63 @@ +package org.transdroid.core.gui.rss; + +import org.androidannotations.annotations.Background; +import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.EViewGroup; +import org.androidannotations.annotations.ViewById; +import org.transdroid.core.app.settings.RssfeedSetting; +import org.transdroid.core.gui.navigation.NavigationHelper; + +import android.content.Context; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +/** + * View that represents some {@link RssfeedSetting} object and displays name as well as loads a favicon for the feed's + * site and can load how many new items are available. + * @author Eric Kok + */ +@EViewGroup(resName = "list_item_rssfeed") +public class RssfeedView extends LinearLayout { + + private static final String GETFVO_URL = "http://g.etfv.co/%1$s"; + + @Bean + protected NavigationHelper navigationHelper; + + // Views + @ViewById + protected ImageView faviconImage; + @ViewById + protected TextView nameText, newcountText; + @ViewById + protected ProgressBar loadingProgress; + + public RssfeedView(Context context) { + super(context); + } + + public void bind(RssfeedSetting rssfeed) { + + nameText.setText(rssfeed.getName()); + faviconImage.setImageDrawable(null); + loadingProgress.setVisibility(View.VISIBLE); + newcountText.setVisibility(View.VISIBLE); + + // Load the RSS feed site' favicon + // Uses the g.etfv.co service to resolve the favicon of any feed URL + navigationHelper.getImageCache().displayImage(String.format(GETFVO_URL, rssfeed), faviconImage); + + // Refresh the number of new items in this feed + refreshNewCount(); + + } + + @Background + protected void refreshNewCount() { + // TODO: Implement + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java b/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java new file mode 100644 index 00000000..2a99bce4 --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java @@ -0,0 +1,23 @@ +package org.transdroid.core.gui.rss; + +import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.FragmentById; +import org.transdroid.core.app.settings.ApplicationSettings; + +import com.actionbarsherlock.app.SherlockFragmentActivity; + +@EActivity(resName = "activity_rssfeeds") +public class RssfeedsActivity extends SherlockFragmentActivity { + + // Settings + @Bean + protected ApplicationSettings applicationSettings; + + // Contained feeds and items fragments + @FragmentById(resName = "rssfeeds_list") + protected RssfeedsFragment fragmentFeeds; + @FragmentById(resName = "rssitems_list") + protected RssitemsFragment fragmentItems; + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssfeedsAdapter.java b/core/src/org/transdroid/core/gui/rss/RssfeedsAdapter.java new file mode 100644 index 00000000..6fc3fcaa --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssfeedsAdapter.java @@ -0,0 +1,71 @@ +package org.transdroid.core.gui.rss; + +import java.util.List; + +import org.androidannotations.annotations.EBean; +import org.androidannotations.annotations.RootContext; +import org.transdroid.core.app.settings.RssfeedSetting; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +/** + * Adapter that contains a list of RSS feed settings. + * @author Eric Kok + */ +@EBean +public class RssfeedsAdapter extends BaseAdapter { + + private List rssfeeds = null; + + @RootContext + protected Context context; + + /** + * Allows updating the full internal list of feeds at once, replacing the old list + * @param newRssfeeds The new list of RSS feed settings objects + */ + public void update(List newRssfeeds) { + this.rssfeeds = newRssfeeds; + notifyDataSetChanged(); + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public int getCount() { + if (rssfeeds == null) + return 0; + return rssfeeds.size(); + } + + @Override + public RssfeedSetting getItem(int position) { + if (rssfeeds == null) + return null; + return rssfeeds.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + RssfeedView rssfeedView; + if (convertView == null) { + rssfeedView = RssfeedView_.build(context); + } else { + rssfeedView = (RssfeedView) convertView; + } + rssfeedView.bind(getItem(position)); + return rssfeedView; + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssfeedsFragment.java b/core/src/org/transdroid/core/gui/rss/RssfeedsFragment.java new file mode 100644 index 00000000..5b0824d2 --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssfeedsFragment.java @@ -0,0 +1,43 @@ +package org.transdroid.core.gui.rss; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.EFragment; +import org.androidannotations.annotations.OptionsMenu; +import org.androidannotations.annotations.ViewById; +import org.transdroid.core.app.settings.ApplicationSettings; + +import android.widget.TextView; + +import com.actionbarsherlock.app.SherlockFragment; +import com.actionbarsherlock.view.SherlockListView; + +/** + * Fragment lists the RSS feeds the user wants to monitor and, if room, the list of items in a feed in a right pane. + * @author Eric Kok + */ +@EFragment(resName = "fragment_rssfeeds") +@OptionsMenu(resName = "fragment_rssfeeds") +public class RssfeedsFragment extends SherlockFragment { + + // Settings + @Bean + protected ApplicationSettings applicationSettings; + @Bean + protected RssfeedsAdapter rssfeedsAdapter; + + // Views + @ViewById(resName = "rssfeeds_list") + protected SherlockListView feedsList; + @ViewById + protected TextView nosettingsText; + + @AfterViews + protected void init() { + + feedsList.setAdapter(rssfeedsAdapter); + rssfeedsAdapter.update(applicationSettings.getRssfeedSettings()); + + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssitemStatusLayout.java b/core/src/org/transdroid/core/gui/rss/RssitemStatusLayout.java new file mode 100644 index 00000000..7c6ff9a5 --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssitemStatusLayout.java @@ -0,0 +1,63 @@ +package org.transdroid.core.gui.rss; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; +import android.util.AttributeSet; +import fr.marvinlabs.widget.CheckableRelativeLayout; + +/** + * A relative layout that that is checkable (to be used in a contextual action bar) and shows a coloured bar in the far + * left indicating the view status, that is, if the item is new to the user or was viewed earlier. + * @author Eric Kok + */ +public class RssitemStatusLayout extends CheckableRelativeLayout { + + private final float scale = getContext().getResources().getDisplayMetrics().density; + private final int WIDTH = (int) (6 * scale + 0.5f); + + private Boolean isNew = null; + private final Paint oldPaint = new Paint(); + private final Paint newPaint = new Paint(); + private final RectF fullRect = new RectF(); + + public RssitemStatusLayout(Context context) { + super(context); + initPaints(); + setWillNotDraw(false); + } + + public RssitemStatusLayout(Context context, AttributeSet attrs) { + super(context, attrs); + initPaints(); + setWillNotDraw(false); + } + + private void initPaints() { + oldPaint.setColor(0xFF9E9E9E); // Grey + newPaint.setColor(0xFF8ACC12); // Normal green + } + + public void setIsNew(Boolean isNew) { + this.isNew = isNew; + this.invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int height = getHeight(); + int width = WIDTH; + fullRect.set(0, 0, width, height); + + if (isNew == null) { + return; + } + + canvas.drawRect(fullRect, isNew? newPaint: oldPaint); + + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssitemView.java b/core/src/org/transdroid/core/gui/rss/RssitemView.java new file mode 100644 index 00000000..19299981 --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssitemView.java @@ -0,0 +1,37 @@ +package org.transdroid.core.gui.rss; + +import java.util.Date; + +import org.androidannotations.annotations.EViewGroup; +import org.androidannotations.annotations.ViewById; +import org.ifies.android.sax.Item; + +import android.content.Context; +import android.text.format.DateUtils; +import android.widget.TextView; + +/** + * View that represents some {@link Item} object, which is a single item in some RSS feed. + * @author Eric Kok + */ +@EViewGroup(resName = "list_item_rssitem") +public class RssitemView extends RssitemStatusLayout { + + // Views + @ViewById + protected TextView nameText, dateText; + + public RssitemView(Context context) { + super(context); + } + + public void bind(Item rssitem, Date lastViewedItem) { + + nameText.setText(rssitem.getTitle()); + dateText.setText(DateUtils.getRelativeDateTimeString(getContext(), rssitem.getPubdate().getTime(), + DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_ABBREV_MONTH)); + setIsNew(rssitem.getPubdate().after(lastViewedItem)); + + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssitemsAdapter.java b/core/src/org/transdroid/core/gui/rss/RssitemsAdapter.java new file mode 100644 index 00000000..c6aa7c0e --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssitemsAdapter.java @@ -0,0 +1,83 @@ +package org.transdroid.core.gui.rss; + +import java.util.Date; + +import org.androidannotations.annotations.EBean; +import org.androidannotations.annotations.RootContext; +import org.ifies.android.sax.Channel; +import org.ifies.android.sax.Item; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +/** + * Adapter that contains a list of {@link Item}s in an RSS feed. + * @author Eric Kok + */ +@EBean +public class RssitemsAdapter extends BaseAdapter { + + private Channel rssfeed = null; + private Date lastViewedItem; + + @RootContext + protected Context context; + + /** + * Allows updating the full RSS feed (channel and contained items), replacing the old data + * @param newRssfeeds The new RSS feed contents + */ + public void update(Channel rssfeed) { + this.rssfeed = rssfeed; + notifyDataSetChanged(); + } + + /** + * Registers the date that the user last viewed this feed. Any RSS items after this date will be visually marked as + * new. + * @param lastViewedItem The date after which RSS items should be marked as new + */ + public void setLastItemViewed(Date lastViewedItem) { + this.lastViewedItem = lastViewedItem; + notifyDataSetChanged(); + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public int getCount() { + if (rssfeed == null) + return 0; + return rssfeed.getItems().size(); + } + + @Override + public Item getItem(int position) { + if (rssfeed == null) + return null; + return rssfeed.getItems().get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + RssitemView rssitemView; + if (convertView == null) { + rssitemView = RssitemView_.build(context); + } else { + rssitemView = (RssitemView) convertView; + } + rssitemView.bind(getItem(position), lastViewedItem); + return rssitemView; + } + +} diff --git a/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java b/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java new file mode 100644 index 00000000..04894f10 --- /dev/null +++ b/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java @@ -0,0 +1,49 @@ +package org.transdroid.core.gui.rss; + +import java.util.Date; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.EFragment; +import org.androidannotations.annotations.FragmentArg; +import org.androidannotations.annotations.InstanceState; +import org.androidannotations.annotations.ViewById; +import org.ifies.android.sax.Channel; + +import android.widget.TextView; + +import com.actionbarsherlock.app.SherlockFragment; +import com.actionbarsherlock.view.SherlockListView; + +/** + * Fragment that lists the items in a specific RSS feed + * @author Eric Kok + */ +@EFragment(resName = "fragment_rssitems") +public class RssitemsFragment extends SherlockFragment { + + @FragmentArg + @InstanceState + protected Channel rssfeed; + @FragmentArg + @InstanceState + protected Date lastViewedItem; + + // Views + @ViewById(resName = "rssfeeds_list") + protected SherlockListView rssitemsList; + @Bean + protected RssitemsAdapter rssitemsAdapter; + @ViewById + protected TextView emptyText; + + @AfterViews + protected void init() { + + rssitemsList.setAdapter(rssitemsAdapter); + rssitemsAdapter.setLastItemViewed(lastViewedItem); + rssitemsAdapter.update(rssfeed); + + } + +} diff --git a/full/AndroidManifest.xml b/full/AndroidManifest.xml index 95092b1e..536c907c 100644 --- a/full/AndroidManifest.xml +++ b/full/AndroidManifest.xml @@ -91,6 +91,12 @@ android:resource="@xml/searchable" /> + + +