oY?|B`}~WWE-sd$L)_ZHLX7kF!B0q2>gHo(6sAC#8v!~1o6fQBY9MO z9RIgUc3WDF>8?m?w(l7z4e0s;eS!2lSr8)tt%S!CC-!8&F^&<><4-P{{+U9%U_AK0*_&r@ zcLtcQq?r#3px*~D12wy&iD&+EBwZ_RG&v8g-xrJJ|5E>%5nbY>c3Gi+zc2Q3U_g26 zhdvY$l+Ya5{)g|J4EB*T_P9tg37U%}3ZT;0hCfDXxsQ7HsA|0ZiC@En5*nZ}x*vUZ z#T%6);e{yeAs$>SG|)F6$xQ(Ym|yelq9NDs7x} }3UBx*=Mt)S2e<^=IV0{QhMY3BB#qA6sAd)+7T;Mz#aq#QwsDcL=Se{(a$cA$$ zw#S$8cumk+Uv^##rQ$NatCxLyK*Gs>hpfpPt7_-H?awXYnYa__xzf0dlXJ9*^xRV7 zg4AHSk&?p$yERP2_a5y@elS_N#QpNE+36rhBnU~F&-4uW;NSEft@>eK7?v~ssew2D zz-!^e?^vY7FH)#lbp>h7j>gzsmKd3UI*a;Ow9_99x_t73Zvry#cPBYlX7YtCbL89a zfc;)@R*%%?t ~hLdti<^Z!xwr$GQPx(?X2y)Xc zH^=6CBY&^4eDylKlm8h?B>LP*1SSx-C{!!$ZIM!g)PB`b2)@B!h3=>G-J%mOwx*&% zR%EM-SWkHfzft+9u(|%%y_P6tN6~md5rP?sgx}@L@UdM65x3I^zE#EC6+*=|PnY6( z`uZ 2;mr^K+@cy) zONDaJs4rFxc#6azA(rSvkif;oh4c21;p4%izVr3DFptwwo}|m`(BkW~uDB#M_`eAj zhEDE*RIy>rN{435jOge`QvwkkK50sx-0CWo>&kWnOvmOj0z_dmc%s5$av4Jvf}) z>b*WHt(@lE@TM0dDy5cgIGHUGMIX_w!pJwC-11o!xR|1yf0fI+FI@l+1+-tU1lK!X zJZt8QSA^sI_i)`b@Z=q03yJ@>H}tiYBys<2wOYiyCg@5xSEhv;36Bf&C=5N(<4AQo zeER{{z_+(DI7qm)xBJ8Ro#3+&WBWCQ&2p2Xx&JPuMFKq)JbT-YT&UO{41x}r;fKY> zxtCaZk@H4$dEM2Wtn+?noO{R(yXsuhua%=%3aBiK8cwRq!nC!v67OUdlLA-BX+ek2 z({y>gr4q`n&$sJMI-7ZH8B;x|Hs>z$ltU nxzb;vf~no_~Gg7 zQ!Qs;mhaWPN{!Cv?9baTK^)3j>_E9hPe1Yj_*~!1{Ejpgd}49SaOkU2*OUxiUr)~g zvM3Cg@HSSI@P{mW5-aq*Y;fv33)AhVkG>uaHLGS?{56WvK8j_nH7_kT+_qC>_YKte zNaz;TVEvH(2=ae>eX{#w`(r36ET#Tf>@!(({?r|bDUXxtY8xA!)s~>1qEUA2a-Hp8 z4eZ@qf=q=1crCX@5Se@iA5 n(WFCY8*~8 Y7#C5uWtfev{3vo1#P|n@%NV zak0RGH4K^WIilZmo|LGmk7$bQxQc6FPH2AoNOpfK00cjssL$XMAT&+uw*Krae+Cs# za-=jRQ~l>${<;?yh)4*pMas$S(3kVG-S`8eL(@_`t-1sL#Q$F*e__WxC=Y1s;b3Vs zSc}I9zH+ISD`}41Kc_Ehq>%8Al|l!m^OONykOTA;m?+{WU_4V$f9R@4-y$2eWG;(Y zwNf``dfWdWEPz?q_f#@+q~!Yn_{G1{FqwdAb!d5lt$ zUfkN!Vf#$9?lE-&ysUc5k%J?ty0iI7SCvB?^uAu`vla`QwC|a`cx3v%Sd7dT$8(xR zDqvYErl;}$lwzNU0uA)SeMw;G*UPU(Kz4b)cX)g{-{?Et-r3nMb`SfYQXpeNqgIDt zGWyeAh}%&q_! rf>DVKYwR-L(=SrsRf05i9f;-If+D7)D504Equ zZ@O>jxdyGEs~Bt0VsBdhS9f}xgF;l?%=Je^K(#O(V^wE Vl_W~G*@adk-=YwOZt$s@|V#M%Joimu0$PPxiKpk^+=f^ zN!uMH1YO{YqpQ}HVZJzN=zKedA5*cR^yXTk+R5y$f2A>T#+spi4-KgI?Q%KV3zlnN zVCyzJPaXd*8eo|Pe?@v ^edr@7^jtoX+b88~_==)G&KC0>F#;wEQ+? zQzuj3p?_u$BQ4&0NGSpkL>|{`^R8Md+;|9hH6NM(atNkGrJ654a5xCV)Lji%8b=Mv z9$dXcT`W04a{ZJrPI6Y}Xr)`SvWvFhMq&p2SRh97C(JEHyUfqwd?LMWD`c;NKcIAj z9L>0tz)dd39ViO@{bTH7;B=7#R?5ZWu}aGi2Z*zZxpx|9lWi ah1%o_Ex_8ob;WmHpY+}H0 zK7P5ULMCYHixbrkSOMqUSyBZO5Xkm%pF5A+SDc*h(#xH8mHB9Ei)y?tH6y(Rc(v=^ z5iPE#p?`%ef9phH *Jr)2R%iRl?B zEXh8X8!DwrI~w9d@67%i*;po4N~}8bm0Q~Z!?`z)Yyk)V 3HUSqNBn_ejCTSnIV zj%}*stW$kgtrSbO*0Nh9=i!#tUPs75k0Z<#U!?!JhD0sZxBgk1 zMl~mii`gDT7EsY`Z`<=r66|-@aooLmlhT+SKIdR4NfiA6=kNM2t6S(4zpnB_v3&>L zQ83~U0OhK|=B1Z gejBp!Gv*?D9NH=mQh|I5bV$9@YST@o)##gP^&QU*utZTu^zcXG*q z%#UGI=*wpf7Vyd0b>0;0jAx}MZ_vmWvzVB7|AbY+f;W3UpCVj&ss;B>q;e`Bn~txp zmbuYjjeR<5G?&h&?OGo;!d8F=3YXKh*z+6cQzo&QUcZI@C1p%H6K0v?g6HKwf%;9W z&M##(>_QTEbKO=pLm&;?SqnTFDG2YcP#T)KLFeW;H-QDJ3Fd&m`zCM_#G+GdK z-OF$$(n$=Md$385$tQYC^}?ZFb3d)vG^Ts6U#gTU2C7x+N+-`;1i*3J@=#ticVWp3 z$}$Svl|}Fk@Hlo`x3~ (7Tf5;v;Qi3dJi`?o838gkvS z{S(OWdHhN&q<7u#Szpot_lKnVedE=;Fgt4Ugo-D_*m2EgGRqkG)Y5N43Lr=z-{`-1 zqMC2$HR{GR)4Q(NQfJakkouiw*Yt;ng7`TB+sVgFKWugGO8pscQ1bCtjWU?}Qy7Wh zq%VNM<;SsyazLS8h8fD=TC*0RPv=)$ LYnSPOa!aL(ar24Iak{f1f+cNjC#L Gyf
Bts{_t(;8zs zz?C)IF81fuURVA2yFQ~RF}C{wIJw+C35sAdpCr?|fH+p#jH?$Rs0G;eKvkL|96k(D zLfOKC00~@`26ICKS37x)$^CitP%$2tM-)^NzF!G`?Q{k$MFSh!p5b~>D(MZZcG`2* zuM7G`NEPfK(ndWu9z849aDjbqro@40d=t$@TfdXt+SHIW7TX6OR&08uu{re 1#dM0LR5Fcw%lE{y2RA`gVq z(CTnZFL{MY$#|!sM`gqVcM`J|YhEJ!+}fSvCUGy=Ax1U)CxLP8J>|N!%SH_<6Z5Wk z-5Y$G%wCl`H T3<#j1V6OMTy6=f#oNm8cmj-tubhz^< z07>cqFQf*f<0oX~OI- {_*A!;_8}p8cYqc^^GDKl!dU1jGrBS>mN =880x zt>OLxRm{g;W5GReUt&G)I&d>m6PE~dT4fA4GqL$sz5Fd1u =fMdX4zZyKHtQELQ_g*IE;siYf^N3&A{V6vzNg zj=T1RcD;q@yYihcgKuz|dWZw7Q(M}cB?$b6Gb-A-GTBggTjy^J$2Of@95!#9P 3aFEW7AgZ2f>KCFJ?)`7SF&QY)M~ST`+iACN=mR)`63(W>6Tw+Px|%9 zfxa-sD$#gQPT`J(-<*=op+s`dE)^UL1*n>-_Id9I;U0F7i~eGz-GZ6FhM~A^Dq;G# z4$HdhS#MRElAHFT)5Vrb;#Isv=yOlBDQ~Xl*u|#Rqqify4x;NKF({IZ>Ns3|T^Ek$ z^b zsSFMId`* 5{bg<-vlthnD##h@}_Z#&Ag180cQ7$AbFlocZyjk+oNA&Z_aP<8rPydv)Zj z18W;y8`K=|S12NZ4l_~x ^S%6llwZ zQ+G{mzlazz&bI5)TCNvm6Mm`~76t*I^RgorDwK=2`^D&>O9#==i!Sr<0D~~J6oT0m zq3AY0I)2s{si=!3CYE?W=-0p;;k;r<>zN!&Ly0gePF0-xUus6Rw(?e2CEGN=s#S&w zzB;T`7|-*qkp6U7-mwV}E(((vL*r0-3;yMji8Gmn*cUIwn{aHtlaRW(sdh!9)|QNR z&zS>h0b~TA#5Z-i*9#Vb3TVSL}_}F$!#Alfm~?dkT2g zNiX8@GdmFNN#3j14)PfLHV|sv4^tx?IoJusiG2i2FP|`Ik#N6?&~C jx4|4U>fZ4+h8l4v@k $Cq^D66TR)$jEQeeMCYaWS)@dj@ir#SF#KM0Kj7-kr9N|l}*OioemR6-z zmoXwQv6KeDv8~WWq21SZk)?j5ZGw{bck%L7a(-(wtzO+2()@7ud}Z{!u18|295!{m zcN8({uZ!cH=8N_^?jF%BqB>J&M@=~OzxucyJ$9&$X0ut-1^wif1eO>$^36Tu&1lpL zygvXKN7hqWBrdia(bM3J^7g6J{z~M;3Wd}L8*rm+=d#{s$mAe}{12!uG|WiK<#I`R z&%OM_FVuXW?>&EJ!?OJQ*EUA_bjS76LPdooNw?sZdLy9o4Rasi y z*z%TRTX@ERvw&2^LL0VfM}9*gRjA$Qr@kprZ?Hnp^yi?az2l#lsWN?f?GigA0TBs} z>?Q#v#IBd_#gu!XE;NU-rbu|hZR41krl+$(sHA=3?iJ%|Mpv`H(!tzuiDx&2b?067 z>H7@#zes#`F SJz6=lPd=Y!pg}C=&|i6vOB|1F zR2sp=482^{-LQ*JrV}Fad@Ru{)%TPML}#gA^q>}P#zt99r#_}3+I!65l}`HrpG=^; z&27k(&S-31shf19~9pMiT@&+Sd0z2}f+W2xX(W8A{_XIC6mFUx~^ zd78mjK7n?^=k<;?g2KSU!n$?>nu&0J!X4gd+9@34RGBm)n41xz!YK}l9#z+;&L`ZJ z0^Lte0$GXr?s_my4Xi~12`(`OPVtY5xr38|=#l-OZ?A2u2#FRizhc`>x}C1cL$>Pa z74A;FKj>8A1DiE( U?4-HVvtkpJLwPIc78G&w38 5kP(M)tO5?xu>KW_42lORg$K_N{*qjGcBNj?BrVLKZ9qU^pA3?dTGTuHY z$#fR(5$7|0H(Eq5h>WO}<0(>^zHJI&g1ltI3G{?&&52plCvuu(mr@%U6_e$TRFZ-Y zn13=nAGtlDma_?i4e%SxbeJ3 u*;s)VQ@UMM_K@WCXND!RZu(a5?}?~6Cwvq zlkkIde+~W4g=V{Nw8+&)w+%t$me;)}CIDjW+=SzYLs}b^_UBFgdUJDAH-@JttG1Sh zD;p)nC!CY|wOx+n#HABlRbw$fCA0X_?F}c3>NGLWcXxI^b-qnOQ0)q7R2NB>^7bwN zFAFei!!|@Q85Z}}9Z2%;yRYnbPyl1lT0D)e-H&% !=J1^ VD~o_d;V>rPh~9qRnLX=h9Vn|qKM z$FtPvQ ?h>I;L$ zTWfI%Iykh^Vtm$!YWu)tA+ihVBHXI!-_4S+InAS(Oe~a-kY0WqK19_eWxS?>TPqsa zB?%WpceJccy+znRkPg-`xextHvhd77CU@GAzHE>}`fs61(b)62ys^(k=x=|XrN0Sp z9gaoGsxs5pd(#Ib0)ET93DqIA++=(f-W>B=|A;=eBuK4^l>E$qpqQqI3AUSG{rpI6 zoOHFi{jHK>8mCIJR^Yo)hU#n-*-DMASFFKy6a^5305H5ZHF1MKZDSDu-oBxvudM9m zbHO7jMPvY(sVh?xA;1?~=+b{WC&vtd7ILcyV&U90ep{&Dn8{r6z3X`fXQ2_1jbYPt z+kDengir1+G;()pvHr}e#K*=jxRdjMJi*WS{O2+Jn?;DNS}pSvtPx?B^Q4KZ%|e20 zXL$lsa}{(~S~F?)N}s{hZuH`=Z<~EK*C$rnxQEEykU2r6PTv<8g_F9`cf5h~?}XWm z8->HG3lEL&p%K;8LxzT!x<0h)pzdxsidx_da_fc*a&B*1tc{pBZ%(A^CHql8s|YgP z`Z{onhoTTXdF^?iBM`h{7=1W)uk*)7yl=Leuyxn+%J9{x4}X0+6U^kQkrpiVmUV#E z>9BO6QLQ6GJ(&x<+?zdBZ<1TAH#Xz}Ep>WL=+&9t(8LPt4TIS%dfa{bXWfk2rnfhy zO^7%R0Nry(?)63dR-2eF0M}t%1eyy0dyto1)8!<36j#8@j@4zuN}UjneS4gltB;MF z)PB#9Gze|N{P`;8-PwwXI+aax0Pc~tvdDYQALHbeWN_5532rfPDEGEqy2)DbgI?tZ zq)+BFTKoxhsJHCiCiuM$o6R!vb(^Nm52~f5OTFJ?Px-t&ZoS1$zLpy;`0PQYe^HVY zBB@(ZB W&U^?=w&)gCNn361L_*>z zp}9|rOx{LSE58319YDbd(P3>3y~E-H`U>tPC?HE6K^*1U;uj7Jac!yc7K7U`*IO6p z$}(zW&n? @G!^^?z8%R8$$lj44_c(T z2-K#|L~S UxSO7|F|woa6_T>F(_`lg21DU9p}Sut}Cax zf8Lp&2rMAQrM6Ok#)`2e_;9c16)DC(@?=`AlX5$9E|ijwdiwb46FTpA$F6&ub83xp zvpJSrTjaeoUExN+Scq@|r`q4kIqVUNBxtn5gWJGE+o`=3hhMf_Nn?;0(6(pHTrn}J zI9s7A-BL(z_mlmmvYEc{Jz%0%u03;G?$>lUN ePO>Y~ zN3YeO5rRaJM*?VIM)rq!d7|fd!y Fq;;$b~Vv0yG>_8gnA_Ll5vVF5`5Q0t4d#OZZKG+B9ts{ z7H#}W;QWax)~2%%*Oq}-hwDN9 DNNDwmvOG904{ZP2Hh+Z(uw@V(ZoNK zX~$*ZT`Lir=f%!p+awi3sEjyfa1NWVZq-m}Y!*3}vy1l>yguxAim){LE;WSltvok* zh&uxc>DqP 6Y~ zXmVz0OdEC=se}R2N1@rPR JnJ5J(X(DUbD*BjgGuERd|_?2?z_JBw^Ao+pr?Gd>(xhW)9NY! zmocksJQ)VwfOQkHbcoUPWwrY4Vo;51blVGB$^BzdK#(QHn(K;9oy`;JrEiR6qAElw zU^$)yAFvnsm@({$7Gm{L7wZ#x8($yEg`^U|gixUyk&m58pQTKd%d%APA^&^#+y;d? zFGgr|W9tWQ2EaVgXc2$5_k6I~;FT}aSOYFr<6j0hYV~2w;AhXdt|w7SRXw!dYmFO1 z*1MT`I-#gt6jAtqwbS*^vde6}vSgFbg${Nh*@v;+Fsz_^V?Ki)bC *KC u@PqXSm@6OOje+F=RG?K z&W#bs8O3>mXW+$iy+RkfX2NFBP-uL?UB3qN5n1wIPm0!I_zJW$R}cp`Kv!}e)d=Pn zW_kq#qY;G897m?0FkUBWA!hJY=yu9YY{5LfuM*krGq6v-AovJ{I&je6A{An*JtOAq zYsf-ohei$8@bL>cgftCv9q4Lb`<(&$mb3r9L(p {Wn+u#kq<0Ie<#!qx+NWIBN5Q;gk_Y-RGS_!O$X_ z^CN$h<*;HlC+R#t`SiRaCeh8>03lN+zog77G$J0NQ|*j=YwxKbh>r#q6%?=?K!9O< zi)m*szit2T{+$0r9)~eojXuRZq2gJ71H_bdclz>fB!gvI9fUXTe}z6gU>9QnraxHF9$yaX6KZWub!teTHUqEmpbeQot$Y%p*g{txy;o~D z#}{nJQA=z$7lZBLOnij@+#&2Ef5LP*zw?rFTG{(7F!d&U(Ibks<_CSh?`3nnns2E` z^I@|i`Ae^?G`30fI*X76lct;2FVTT&RAKYNUwolIs#e~YEFr8jzaTT>0vt+&MkM-@ z=S=G$cL^tv)^;#k9YOh9{-&KPlSS2PxRH{C>wR5YIZRaD5EcjDZtv?6Pfuobi&`AT z4}L{Yn+P8#pIENI2G-r&&j1Xc^KKpgT}9~yKRRV}kw`rpa;~g2;7`!lpij8ui?~B! zHv*ul4@%apHMq@Sf0A{dKBf`lS>mjaZgFpRe?XE=I!9=Kx?M?d_P$DYvtVj#$9H*4 zQ@jRc3RhvJ2;TMXro2%4!Jda;-v5-jBRBpf+qws$67W4F^Lg7V{CKeEU*I*d&IalT zHrhniPr5&ftbExWCqISrk4+@wc}j|<3{p&*o5APoHf?)k*$Y(XL?p8VG(rMvZbP}S z2nlH~A7{*3J-GE3GWfy7Vv)lM?8uM(6?%NKoQvh72hyFts#nPH_CBN9so*tsEXsxL zz$EcsTo^9-DSS>08i=gd9#H+ y+Nw7OnGtXiZOabS%uD9l+^m&xb) zON~J@G_WLZz=n^op)D8t-SqG}pU)B(av*H5pop1t5Y<^aAGKrizPEShTd`Y;d_*Oj zCgfr*QYc_EUCvWH&i4&Z-ank$aeiB5u6s_kdp7d+^Y3A^nXJO}d6-kTr;M@x4jn6D z%n9LG?G6knVl^VMS3te$Euf0%)IieCl33=4BEPd@Gh7j65QHkto|3AXsjdt2k4N=4 z!1{{Z6Xbd%_)}wM>%IDUGt@CNM|KI59)}y{8Ox1xL8<+X#UI+LJi__gmga~iF2z%2 z2{~telLs2^Tqd$#^{Q--H*VxO=1cbq#E&EKsZ&C_=mMfic)xGFHNi!f?N7-cm)%ix z;B_&qaq0Je|7(ucSHE0uzid^_b7{fo)qEN@vwnu@Fnwe=KEd0vKWM`CrKrbrTFmSA zMO-$84F{^`1*%Y%>h3SS2~^i<7dN@gnyF3E_wtsMDA2&+ RYMId9%0 zET(FWNuVa{ge?i_#hL2jWEqQZMBu?}r*D zx|If5r_@76*^~Xm2LYHNPnWY2NxxYw<1$JTQ?eb*9fSSjO3gp*8W$hfNErwSx9P-M zCmD4y% pZh^P&B|o%!7zXi r2F-Kt;}xMD^Ij*ok~w7#M=q3vbT3OhT4L{FBTD z)D`}9G4TLWeuhIcHK$Ks;D@F;dc^ItmlNYKvXZ68Kk~(RC*^ixjI3}X18Y6muiJF) z$fw!ypkSi&G37|8PbkS~N3$AFyV!84!3#dh&z$e{rUG%P%r0&1=^7$gyO9LDQG7`x z+Jk8`-ER6^?ZfK=S;S-*i_y3=j8H4Lm>MKiX0Y~V7v-c+1=xW;TYPFk4%h~HMvD%m z7p`j8q5B&5BhWj$s+A~0X{&%N-q(Ik=UyIJeYgsG`asWAH;9d~U`Sx)0f$2LZG)jP z #pAk1sUAkkYd7MU6I RH1j>pW}G(BF>ptgr4~6fOND3`91M3SoRo86K_Vsy5@*eK-I(^f?W=0 zop*2Dzu~(Cj)~$c1_9llY;DtU (!h>hIExhS*JXo eV>kH;KSo4yH4Ei13)|bZD%aQ8sO&U_7FK}o=k0>M2*#BJYL}ss>oI zLXh{TUJz!-Qy)|B#n6Cfe0x8{e=fBSD|k9TG9S5YnT0d3Gf3I~P2!6^1;JmBH?9|a z9WwL&@wC`^U?3Lm_nLg5P`EENYHmr-nN)V+aSU-YglGF#x&J5)pDakI(#5KmD%I}g zf;C^TpGEE+>PB4Xjx6{PAB=Wl$8B}>S`0~d6ZX~;O2*{Y!$L=8`;dcP>hKmsRf-LH zaB9@|K^ESRM+E%fxfObb?|%Gh>XCW6R+jIDR%*Fmg-e^HXgl9OkCVqWuI2fMy*j=+ zU$N#nc{L#@Ely6!>RAV3Z4B*7{KoZttdvzRm%5N2kzOecvi~HFYy4`q$rZ8o8{ti? z!YaHh#ARYx-{*=x>X&q{pZq76{C_V^SYv|7ga=0F=%3^wZeAi!fX*|d)kb?A|Ie8| zmaY2aV|cH?xtl`zhtVS+di#+lsGo~_y LJXRO|{T~9Ud&OgDZ zBqD<`nwh1GM^%~0e_A-Niv9yVhASpe?bow552xyfaRxbWcECKC&hK;yU68}aA;}o> zoM0T={`N}r9y#SK$|H^%PKr#wdaVI-7Rf##hE%zdv_cx83H&&{`@UJ5Q&TQVC=Kjg z6DC!=ZG~?iPUV`vEY~N HX+lc*Kz|kE2(}kx7RBLyTxiK+DW4T6RmOs^oxIQ>9dEUP;Jf{ zI+I}A7Qf>&jLQHl0q-da2pm$4(rQS`ZAvE_A|b7DQ|o4$D@cl?&gD*`#Orb>Mw{Sg zGyL1-m@~_Ssc#haoh}dsLK(DB`Xg?`sP$7JBy2@V4EIBD&fe`5m>#+gxF2LPm<6)Q zKMm|XzyKYYWKWp~G2ZIYSN#rX3i6H+-tNXtXvB#a4en2GwdrXUczh2VQUr)+lcOCv zCA&dFkH!qFj Tm&4RwsQtTQ40J7W1OJ9H){$~K;&pgaO)I(Eu?jLNX1_AodqKPG z?gJzYl-wTX1z{m&|M(Fbqjs`C++qhPErBOZLiyfriOdx|>T(5!ARJbb;tT36-qF2U zS8E`Sp||S$9jCi(VrOHS^zADxlz0LDoWY6qBP*@yq>rb($1_HD+Y#v;+EYfeNl#!! zonAWsR=Cqv^i$QaJJvymzp?x(bgyj11yod2)M)n^StR^k3cfPXMjf1GmP)4wqp#Lr zZlgYg6nJ^ufh!DN8~FmhucScs4|ltbxWK@p}NlhXbv}Q(1yvDe}O- z<}H=b`C>$sAVBueDCj%WZ-JE2A7e>UMF04a+)luT&YxsfcF7YbCwe#0WV|pB@Y*r6 zU!Jft3dUCtO6E#LVZ1Xf)hely^vr9TNCF8GH)zp7m3q07K;2TU*=H<9`0JE-Sbrfr za COvP%j3_#v5aGO6i?dl^`{|n3WFQv;9f)x C4|uO#Qu0_BSidc z$wPIDLc9pQO^Gj38G;AC+SnYL=d(CpH+%~KiHvF8-mvKWno&;%z{xWGN{j%s37Z{A zxz1fGrPCg2uDqW-kxjyhzhxj~@AY#NmjEVbQFO{!D99#8wK>gReW(I?soOR~huitg zW|c%&{A(V`;*RlE2TH(IfoN(iYQ^Y7v44_9I**G406A63^;G2_EAEJvI>TXDQK*n? zoo|A27$WhqW+~V2T(>Ko`(fl-y6`TS!HgJ`bjRLYmTBhM8+!Wv3vu@9eaxs3?6RlO zAkN8fv)ssFNNE#>S>~|Y6BwW`=Uu5Qpu^CFIj&*EaUh H=|^$?fJ<2{NMz!JaKU8U`Z7E0z;- <94>_M7W{4*zENlAO8DQGu-iDoc@%&_2r*O z%dgmc_Tn%T?us1(AJoyw#H|6JnSm%N5w@j#GrV2tW}s>`vYX5?>x?EeNwW;u4 &|uy$^=2A03p8qlWv5p2mL8rUwRlDvL2a=UUA@3G{zkE zD`4NlCKrk`cE?jZs*_;m;@a;B&yW^F#Qu{;-Cq)EY(%7WcnXK!Ix1~4KsEK5JKBHl zB>d&Gjtigjxj!WnuSLvEO^?uou9Q0nAgunu4{zU7qz2ll6L5McnX^=ohe@$rX<%3V z*;|6bRBbS0x$_$i8i1IiDYcWhY24e)Fy5zi2dB&8YgBfE<}18Amn=HdSR61$-_K@; zcROnp(q)pEAtxL3*lVwOzNZ-74P8>WvBZdPGby4oW!7<^cTpNvFv-5pc762Q;n8jT zh>Q((T*Xe>H|z)3*+FqItMn^T10w99a>sj@M1rMsr|9vF`mvTfuR=3a<3-ls>7;b> z0Awt _W*=`mph7r^Q{gH7y4!w43sFXOU4S z#Hx2(`_+H%fZ`F&a>`gTW}3V2hFzfhFc(CHYBDthBjkvp!L+_r9{oo_zJ{Ql@cQaA zhT31qS*_4SCgy7(OSrxCB?~`m^>AeGUWtfc_Xkt-lN@Hbp|k30b@2BS_T{LdcfiOQ zoo4LlE5638l);Jg4gM2IJfD6E^*aspam;P0JOTvy8?s=56NR+t7LDKa>UFt4EX{3X z^o3G{3A<-YyI?H&muny-BAVny5@wwj)o#@L$oq0viYH22)0;ka=H7JPuc;`<^Q1vh zRUWUfkPcXlghIUKO`k3ND;p@yt@-QSi0rwO(;7*kr$wuE2aS@aeGvPNI6vi7M2@E6 zhTYBj>`^J`(VNr^VWV$r3%{`j0GO-){uclWKpy>}8W{Zj)MZ2=AOSs3hs@-}UMp!o z3|a_H<_nwvo(r6oB-tMHSFD0an?}uILLi&q++dc_oH!sJIWJNd4f)Eu7#+waIx%=Z z${Z~;0;fbZmb{#~FD?Lx@OO2WY)J73B%s!%2@>J#dr%?+!`xZjo{4du(Da1n%}i$d zLMe%kQ1+~F%t>d?TIyMQAbMN`w|sw=EmT14lX|Ied-@A}*kiXTUf~U_mcXQ=Foki` z{{&40vinvO0RRXAX+yy*PV011-bvXIkT;yFi~=B1&jGk!QN~wdE%gE*l*|#Vx&y5z z&~i$4iM$M{2LQ>z6v29jlX{$#jXeHV_9(0Xz+Rj9rUyHu$;=;Yg6&0$u;^!UF+wok z
8+B@8O;FLgzxgHYD@0H59a%v z*5$OkinbA)&i3H-@QKBTnLlg*z#tGS0G#7~3A5fB;jp0#HlqcjzF^c5!3^%RYp^ul z5*HWO1)11`FMrrk>rGh!xS=fm@Cv}!omd3Q!~j4rit+HCJo;u0QYaWK7 $ZT8z{O+w20B~7e0pvbFtN{GMO{WR?In?jg*enoArV3Ww z!K%k5Nm4_$*U`zDhS{Ixe+dBTIlyl^I0b-Q0X$X#ILC^C@A;46@TrR5E%H(z)C?7@ z`h!(Zu;>;c^=v^u`sy=3%l^g OG4_1Ku`1~g~!z>PELc{Zd zF{a?t#+&=Uo5482d}lE0if~2_q JG!9jQ3&P$)S8V5dFNJW&cHD+QteNLF%3 zUlwi@hyozoMkLyvWTik90Le=3=*z;50#N{j+lWNlldKeo0w7t*9er82Q6LI{a2t_m zdy xuY)&Hwr`n5N;z9ZBMdNAPRtFC3o~?;YNWd0K#oVqU}jm3j80T5E3^Y Smoy3h0000().getSharedPreferences("source_$id", 0x0000) + } + + // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/api/home-list", headers) + + private fun Int.parseStatus() = when (this) { + 1 -> SAnime.UNKNOWN // Not Yet Released + 2 -> SAnime.ONGOING + 3 -> SAnime.COMPLETED + else -> SAnime.UNKNOWN + } + + private fun ShortAnimeDto.toSAnime(titleLang: String) = SAnime.create().apply { + url = "/anime/$slug" + title = when (titleLang) { + "romaji" -> titleRomanji + "japanese" -> titleJapanese + else -> titleEnglish + } ?: arrayOf(titleEnglish, titleRomanji, titleJapanese, "").firstNotNullOf { it } + description = synopsis + status = statusId.parseStatus() + thumbnail_url = "$baseUrl$imgUrl" + genre = animeGenres?.joinToString { it.genre.name } + } + + override fun popularAnimeParse(response: Response): AnimesPage { + sudatchiFilters.fetchFilters() + val titleLang = preferences.title + return AnimesPage(response.parseAs ().animeSpotlight.map { it.toSAnime(titleLang) }, false) + } + + // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/api/directory?page=$page&genres=&status=2,3", headers) + + override fun latestUpdatesParse(response: Response): AnimesPage { + sudatchiFilters.fetchFilters() + val titleLang = preferences.title + return response.parseAs ().let { + AnimesPage(it.animes.map { it.toSAnime(titleLang) }, it.page != it.pages) + } + } + + // =============================== Search =============================== + override fun getFilterList() = sudatchiFilters.getFilterList() + + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { + return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler + val id = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/api/anime/$id", headers)) + .awaitSuccess() + .use(::searchAnimeByIdParse) + } else { + super.getSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response) = AnimesPage(listOf(animeDetailsParse(response)), false) + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val url = "$baseUrl/api/directory".toHttpUrl().newBuilder() + url.addQueryParameter("page", page.toString()) + url.addQueryParameter("title", query) + filters.filterIsInstance ().forEach { + val (name, value) = it.toQueryParameter() + if (value != null) url.addQueryParameter(name, value) + } + return GET(url.build(), headers) + } + + override fun searchAnimeParse(response: Response) = latestUpdatesParse(response) + + // =========================== Anime Details ============================ + override fun getAnimeUrl(anime: SAnime) = "$baseUrl${anime.url}" + + override fun animeDetailsRequest(anime: SAnime) = GET("$baseUrl/api${anime.url}", headers) + + override fun animeDetailsParse(response: Response) = response.parseAs ().toSAnime(preferences.title) + + // ============================== Episodes ============================== + override fun episodeListRequest(anime: SAnime) = animeDetailsRequest(anime) + + override fun episodeListParse(response: Response): List { + val anime = response.parseAs () + return anime.episodes.map { + SEpisode.create().apply { + name = it.title + episode_number = it.number.toFloat() + url = "/watch/${anime.slug}/${it.number}" + } + }.reversed() + } + + // ============================ Video Links ============================= + override fun videoListRequest(episode: SEpisode) = GET("$baseUrl${episode.url}", headers) + + private val playlistUtils: PlaylistUtils by lazy { PlaylistUtils(client, headers) } + + override fun videoListParse(response: Response): List