From 3a68ded6454d9b958ae5970f87a83b0d71502436 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Thu, 19 Dec 2024 17:15:31 +0100 Subject: [PATCH] added storage --- Sora.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 52028 -> 58831 bytes Sora/Views/AnimeViews/AnimeInfoView.swift | 2 +- Sora/Views/SettingsViews/SettingView.swift | 6 + .../SubPages/SettingsAboutView.swift | 17 +- .../SubPages/StorageSettingsView.swift | 269 ++++++++++++++++++ 6 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 Sora/Views/SettingsViews/SubPages/StorageSettingsView.swift diff --git a/Sora.xcodeproj/project.pbxproj b/Sora.xcodeproj/project.pbxproj index 76b81f2..658f976 100644 --- a/Sora.xcodeproj/project.pbxproj +++ b/Sora.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 132417D52D13240200B4F2D2 /* EpisodeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132417D42D13240200B4F2D2 /* EpisodeCell.swift */; }; 132417D72D13242400B4F2D2 /* CircularProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132417D62D13242400B4F2D2 /* CircularProgressBar.swift */; }; 132417D92D1328B900B4F2D2 /* VideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132417D82D1328B900B4F2D2 /* VideoPlayerView.swift */; }; + 13B3A4B22D1477F100BCC0D5 /* StorageSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B3A4B12D1477F100BCC0D5 /* StorageSettingsView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -66,6 +67,7 @@ 132417D42D13240200B4F2D2 /* EpisodeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeCell.swift; sourceTree = ""; }; 132417D62D13242400B4F2D2 /* CircularProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularProgressBar.swift; sourceTree = ""; }; 132417D82D1328B900B4F2D2 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerView.swift; sourceTree = ""; }; + 13B3A4B12D1477F100BCC0D5 /* StorageSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageSettingsView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -211,6 +213,7 @@ 132417AD2D131A0600B4F2D2 /* SettingsLogsView.swift */, 132417AE2D131A0600B4F2D2 /* SettingsModuleView.swift */, 132417AF2D131A0600B4F2D2 /* SettingsPlayerView.swift */, + 13B3A4B12D1477F100BCC0D5 /* StorageSettingsView.swift */, ); path = SubPages; sourceTree = ""; @@ -321,6 +324,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 13B3A4B22D1477F100BCC0D5 /* StorageSettingsView.swift in Sources */, 132417BB2D131A0600B4F2D2 /* SettingsIUView.swift in Sources */, 132417C42D131A0600B4F2D2 /* AnimeInfoExtraction.swift in Sources */, 132417B82D131A0600B4F2D2 /* SearchView.swift in Sources */, diff --git a/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate b/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate index 37fdcf0818564243d5e92d436e9dd69482e2f98f..96cbbe0cd062d74d316f91245c155d55a834de0c 100644 GIT binary patch literal 58831 zcmeFacYGAZ|Mp^Mk& znnp&}=-`rI{@`e!{hY-4CuWrfN`p4K*Amh>g;Tj$E{_NoUAaUqiA&~ExNcl` zE}a|2jpoL1W4R1&9GA(B=O%DjTppLt1-aSW9BwXGz?E?exkcP!ZV9)XyMVipyPUg% zyP8|gUC*uM)^icAoV$m+m%ESK#%<^B=N{l5UR`dvZ6g`F>M^B)gXcyXzo<}dB7tyQeJ@f_o68(sNM}J@r z6D(jKma&2j+z>ayF}OKyfm`DQ+zxlbi8vMa!o6`H+!qhPBX9{#X7_f`~wTq%mnq+L8981L;UQk)EU%=}r2OzGM&?Oh%BAWGtCPCX*>-Dw#&6 zli6ernM(>tF)1NsWCgJaC0CGD-E5bhEpm0QZLwHm8K=@ENCVb-S>Few3=Nsr7JvGsKzVY;le_S1b_ci6Jp8ULmd$uN1EmuNGH} z*NE4O*NJPy>&2VI^wd;h_8u<#n;6n;v3?d;#=ZT@on)P z@m=vl@iXyr@eA=g@q6)i@elD&@h{0IiBe0cmDE~lBgIQ?r39&+)L!Z!b(FeFsZtNA zr_@X8FAb1}OCzL_Qo1x=njp=S=1Yar0;xzUmP({^rH~YsN~Oip3dxo(mM)R5mR3vG zNY_f&Nw-Mrqz9x2rH7;)(!=(@^s013dP90s`at?n`d#`% z`cwK#I^pO1$dCQJpZEp8-*5UYe*=GALSqI zALAeE&+w1)XZff4&+!NR1^#*d`TnrK)W6DqrT;4b)&AA~Yy8*xuk)|*U+=%cf3rX0 z-{QZ+f1iJw{}KPA{saDl{zLxP{D=Lo`;YkF@W1JQ%YW4Wp8sS2m;SH(Kly+5{~~iT zlAFj)s0>nuDx;P0$^>PqGEJGTtd3 zE>E&O;&rWebn*l1T{;|Rwt@C z>LhitIz^qTPE&K$*=nJ>KrK@js*BVWs;#b7Z&GhoZ&BB&x2m_Px2x;bh+3|0R_|8t zQSVhBR3B1zs=L(P>XYgV>Wk_J>WAtv^|<+LhY%+6~%`+U?qU?P2W^?NRM9?Q!i1ZKt+N+pRsRJ*7RT zy{sM74rxcVx3zb)kF<}q6FR3O9qYVKbV2v&qAuxvUDF%sP4#Aayxvw%(7Wo1`fz=O zK2lHDN9m*WG5T0NLm#JS>e>1(}Vl>euOO^y~E- z^qcjFzD2)7zfa$$KcYXXAJ7l#hxFI5vmC@R0W5gTnjYK2KNH%&Jy^MjzAY-tRZj3T!8F@y&5j18S zbBwu0ficgRZxk9O#v)^}vBX$m*v6&CWya;k6~-!Kjd8tkw{eeguW_HT&Dd_-Z#-Z; zXgp->Fdj3WGM+bHF!mb=! zHZfb9ZOp!AKl5y}zd67hXbv(5n?uYrbErAe9A{26bIh4$u6d3bFbm9i=1TJd^Fs3? z^J4Q7^HTFN^K$bFbCtQ;ywO~1-elfxt~c*6x0)5^cJqF7ulbVsviXX+&wSO~ZyqoY znupBS%s0&U%#X~E&9BXG%wNo3Ez4?PHMAO8jjb3f){3*5SWT^FR!d@9?W`_VSF4BB z)9Pgnv<6wjtr6Bp>l`a!&9d^Wd@E?pw&qxKtpaPFHQy?<7Fb1Au~lN7XDzqRw^mrT zMXipkn3 zb=>-NV%ws!!oq``#_62FnOs9IW>Q90;{4!}@KpF4)o*j!<`o9Q;d0L68raz8%eh8e zW6%-MG&>>JY@615$nYUOhYj!Ab9kTRuBpSj_vqRuwMU<>z0y*Xd-Uqwt2u z^r6Eh6^G`BO9FYpp~ZP+3xY+ZUd~OqHe9DITr;jY*Md8XYst0ZTHAu{vqf97{kCi? zTex_xEtkNxgCHHa1Y5N=dm=?sAWW=1(e5&nC0|gKU%Y5|D6k-yYYwQMUv^+tT5(Zn zsJO5&7|QLDn$`=-+q-M8A$@vvO-)Yi)pc;Up($N^rwr~nyl0=Dy}J$Tk!!ZAOc7!a z34|sE!Z`)uf?0*ZNd={IvkHpl6b9i+uGyh_PHq`;GqNTG!==Tc00eht07C<%fn2jC z1Rb1L3R8&6s;F5svq@F1#l?lQ0-Y7ucYL}WWTb7#AvrDU#KFQ0wv|83J zrDrmHNlEUte7RT0soVgr(^jqr*OTkT_2&9;eYt+z*<62Hw+-90ExUo;&~9Wmwqv$J z4G-c5b3?c^ZYVblzKwuNj^61z*TX+nXr<`yr?2rMj^6M)-wf2#aC zI244Nwjk8R(t^T*(t==kQbB&{TsK&HQMd%APsO3CV3jeQVAFF7f{TU*XO+#F1FdE@ z92;Cv99l9W6eyWn^{ZEg${c1ucEj=uqUrj*+t22vah*1E6S*925;vKf!cDcC*iG$b zc5}Oheb#1fIyZxx$>nnAZ~?oe-PIm!=h&0%8SFM&P0lOM4<WHX_!oo2o;x=xEEmR8O}9ZoFpxdmL2-O6rlx3S|lawXikT!<^N+uH5y_V5n3)o6G@VQDbr;5lT;Shz)) zzCvln1j412C1F43nlTfLW}h-}oSQ~4e`0#gbiDE`<(6?V>(|=}2e|XO6`ak{sjf6B zf?hh={TK{S&&V2D0R5u4C=gmw4xv^~&d3_)%&uMRYm_Ie7+8XUULF^5mvAu=?qa(` zguB%4$b=H>DyNKd0OZ^%?n>^eT(c>(D(jz_Y~DX1SP}|`K_mrODeTU6r*W3hX_jXb zK$s^&aCYI8g3{mu=T3oP5Q?RP^YVh>a4;YGcW`Dnk4c!!;xM3ITr?vbZPs*%6Ta7M z>N6U}HE$W;u2Yxf)ZTpu3>rFo)Y$P^lcwbc4v3Op&n^j+&Yc3l1Q(AiC@S3~%ZjRH zXMqrz$T~uJ>foY+1wrTIv|%L$VQ87OU}2%j9Wbp14Np~`;Np@%5wl!4CGI}>xyuKf z=r^^Si6Fnmu^SF5Y(o&FRAY~v6lRwa;X*0dPX|;W@A*9rzAxr73>0=6Jg`icO zgbuW7-KO3}>ihj6NT#j6L6#FHvVI&s(7r>*dY7Wbi@!tk&J9`g16>o7>YwkiG>Dke z9g3gOEhn=uup}5V$$=g{d(}IM7JC~(5`9?S%7K1o_pg7U_qKqD1NCxQJ}`JlTD{}7 zz2R|)H%yPn2S$ucuYa^uT=z@-psU>vkp+-XQA1Yp;*y#rcjUFxXBg>;;Y9_r zOTp4-f%cNf^#>c?T#&pW?mTWKh@~sRGPjZ2%-zZD9UtKz;GgDS0=v=?{w@9(SeCv4i_-6e1A9^a zqTe{u!4>bwgk zdmA@!H-fs6ku|oglohyYXxhNtzy>F8;JJxg$8{>_Zsu;W6YZpO?pE$LJJ}w@2G=I% zmIXsgG6PH*g+Vr4rGCzEN7BqdDg0jKCAEROgN@r8xlKUJ7CXi6W_Pz!H*#CK3V`P> zyNBJ=?q&C8NykJ-DkynYUU5k;}oH5Vja?QptYz_&O=FMe#OLlN^sS`hYHheqGJ;d$c9_Ak5 z9)%(FG465h31E5`w|h#UC~t0Y2ud@>Ni;hcS}>BSx9d?w+BiQ1b_>=4r#phq}8Bn(%E4jECYOEHe&nyVHvEsN>@s(*Se!RM%w}WJ$euvMvjcrndh`yYCihHs6VZ^q z-p+F4n#h`28Fz3f6j-tWnWzD`5@zboSJ32_EraQvJM-(+txKyueY!1QF4be=60LR= zi<(2Vqc|9mnxba*WP6G|)t+Gj!)y^_m)?4yXs$=`Pd}bwZtC(Cvy6Q4&fDNyd&efjeEK_!D6 zRm0FWLfB0vZ6QZN>H?dvQ7NkpL7p zvbJ$$^fAG}{9wK-8NmiLc|zrtsQeoqDqc`&Oz@Ikgf8GZ-3i*@60{U8L+623cs^Qz zY(&vYd#Sz5KF?lmpKq_QZJXLF?F;M+??e}JThYbn68Lu+x*T1BR-r4=RrWv&a$u z6QRPRHRDEg2L&TKRyfnnC56GMRTpQD4JN$;|= z>YiV7jt&|ca5pqKJ5W|w>c|w=j?^leAN*QS0@gQnFPUy~V**Qx%V0FJTnP`h4|b6? zD^x=?rA)TgA7*1*&FsPl(K>W12>40dc61x0k&#tdLt}zPa~!Kywcng!)xOxJeLady zt9Gp%m2)er|1fo2Nw6rr2yB62n9e)n$Y!KR&=&i0JIe#20&RnFAKi)Wf{DRB=w5W6 zeTBWszS6$RzS>^B8Er@RqX*#qAz<(t`&x=b`x=VcGa9S40hHXWAjk}?n$e-Hq5IoN zxO3<=jsOVHh*l)XpOo&Mr?D|^G$?|Ok*EbATvnLRK+XgU@`NDhcHvS0gjsdr9=tL? ziJoEo<0d1AEgEv>zQn2N9@`=rwd0y$+M4H@KbXEp!yUjov};f(o7=wKBUvMu+JP$2!~^ zl<*+4$ug-H)f{WKH|UOG=DJa({DVX&atxi(luizB)ws&?ndX&X;)F2}+xu1}lqx44 z_AU0kpwQlEZ@0JEciZ(?*_-W~?5*})_F5Z^;YpQ)b&bk& z6Ra|XRu0>4vwem3Z9-q8Z_u|eb^YGH*}m0YZ`e#JPv~d3yCWd5ew$jA>qMtK zP#Zn$bs!#c3i5-+u3@HXvh8-MKha+>;{gd!HL-M6dMAadSOlHr;Y5VYU*DD+_;=+YzJ{H zXW%&81UKb&R)=E>8%P1S1ts$Od?UBHPuS~fTHZ|F3sS%xgCM(L zAX(?y#-kU|DY|6H$?B=fF6ni`MXVFr&$!(UtRVlmyD^CrPO5&F@GWZ9Oge2HRL52@Fmb7!3RreP8><`)AxwPjRGbwR&__yx ziN&*Lhl8NK)lSJ>cX2~8dm{+_+9|;;4K6DMOBG~P`!bVD!;1^^VL}BfL$zWrfA97xs%=^qXUfbS_x4{|}zRx}!!Q1WE z*&0>Tp~1q^fZH6dW?ESnUaW`kBV0^5-hm&skJxXN<45sh_M7%wcEU7vo6blV4A0Du z>N&0&>Xv9X+PB``WOZ&CKPYOuH81y4eGb3CQr&}}x8JqjtCs4-*-!%~rw1BGUSTj0 z@&s78L&w?zXFmv>gZL0rzVPcHa6STo^R@kNl{z zvA?yyv%j~0uz$3FvVXRJv45@L8@cj#0O}PXfJSXhmqVnM{ig*fkD)6BY&WH%d zT_7?1FNz4h6Nm`Dv;BKiMDU3qBKRaenZ4{k>_45?CbPHM*lXTid>;@Id~f?igzrlc zS3eoS58wwoGJ+puAE5|AcjnXVHz~q)!by_B>U2DQP^!CTV>a@#9mS7zqyaz1ewQL& z9q}E>!e_z6l+UI}0s|#Ki8J`g{1h-g<+&!;TFMDUeu~-?35u+` z;dRkIyq*IC&RK3Jrl?g_FK&CL7yk#n_#W1a@1>}v*NwNIvKxEt{0RRT>%xyx z)H=dHPEnhB_Tk<9)6fU`C-Dx7;_V~ld>V!{FpTvl_hB!m7xn{QLX|{D-ipe4L_A6m_8}k)kAuk||1|s9R+ZMQ`(;f@Z&sqR#d@(--Ze z{FiQD>&p7t^y(V7*Ndy^1l~{oYsV(o&8&N6$9@yX5|K#6Ph`#@3XUTx(eMdk5EB+G zw-bvr;C7M*q!G-|U=km4SGEev78GTaEtthtW*Y>Hm}Uvq`D#B}d2?ZT82r9M69PqZ zf}p)IzniF0XIK$vq>eIbx^bEIS(%)dOZ6X5POdo5{t`T3K@#>b8`@mM6Vd;inI?%L zv20~8Cz~x=da9jg2iQR3NE61y=>nYEMi6C_G$XBGHHkDQEy!7P=A}iu!IO ztw|g17->sUKZ*v~BPkkUcbPmUINPzpPMJ_JXRh;Us;dyY7G-DU#Iw{^T6(?QI+J9U zTNl!mBoaXCY>N6*G=QRk8)0^|6+a4E&qQd;H(deQEC)>3Y{kU!cycW969S7IYb{I+ zn%2A;b>MQAufarI<04bp!1e;BXPABzl)#)9;>Xko;-thv^{j`VUeij1ZR zLXNJq8j}n%fs5Hd#*s`io}%Ftji6}c29m`k5YYY7nF2VS`aALku}Whln>VEaTXa`)9279w)IQQVY}7a=HV(Y|nm0SE zC3xq>w@sLlkyXuQ8p@DeP+AC+XA9hy-3zW0b1($X;B2{oE%!jM^f0Uejx0S4P(Gf)I1143`wc;!y~UXlcy##5K8_m8rT79fr$UrLaIWHV~c<0>#U- z(s-Rd)XjE8sKm*KEeYf=hP80FY_2f0k-Fk%-GB<*XJF2GdN5$f9Y1tS=#ZHZj}uGy7ge+Qd4@gng|8%+q>9| zgMFCAT!;&Bty(qWTEVvnFD`=uq!i>3&VQ>?9~Jl1zQoVybrgyneGVd ziCVVu=enaGOiE7amfDjcaB9E%NOxO`^Z<`{^I-2jDSi8ai7*bTE-w@e7P(b9abo&V z*CY#B*SwSkt8K0aJ$UM;qzxI~dpLONckexTSl2#7hY#zT)(716lY4hhO&Qv&cXC>4 zuj$KJ4S@4_YHITG1B1Xf@l+1G&7<@F>y05&ln0nkDpM}(RlpOnaPWL z&Cc)EE2U45?#ZdijvrrBt}WM*>jqx(>D)ZnZEJ&@+U?vH*ju{;T#XKMpK?DU1$M`_ z1P6j-a2`lSJ-{EJH+b>&L;cY}Gz50a4u@T`qrszZHo6R54a;9_dFmVVGdck~SS{GU z+8D>eDnK(ZsrLuVYBtWnlVL~dDlp`&gB_?3fW>Dw*k?ZE1@PPR!)(8Uso^&~>d$p(t1Q#6C3nH1$xbPh!Uie^!iM^Qd_7?I6n3%P@AB^BgOau>Oq ziO?Vw8c?Az71~i@5ETYfA&m;oz}097$in$0#o*c;cJ@GkO%J>lzzXK9;JV7CW5Wv% zFAjl;Jv`mrDv^~pH^|%!8o6J=?Er>c(6Jn^wOliK40yexC|pY}|K0F@G9R#n>XIBf-;)W*0+nZ&9)`c%17@;g;D;j1}3d z&_~Elrj$HN9wU#FCn%at(Hx5AQdF>!>>|6#ljJFi=23JrMH?x4fsJP!>RL1y3_j+i z;M5Q(EC%~z`?`W=GIw^jWVvQ9H>C64JrmYlz#A*8tb|p=$?Fm|!u-=U4DY^QATPms zFL{ydr3i-W1?A*r@(M-86kTL@sb=~n2bpP$qQYEr$p2tTbE+c@t4T1r1WUu!6F%Z5 z4C7J1zfZVo?d;?fIcG~0d5aw5I^98zlDEk_*eB_smDNjJNsp3g!7o&WYL_i0cYcl>88|`0TKPl zfbqC=IM|C>uYf=^m<4|!=yuL^SCjl1JlM!D6fLn~%xaXFG`OTBJ+HVZF;G%c0Dqyv z-Ee=faDP&??6l#S-`|k*v?#aZqFGhlOZ=e1-HycAU@}+E!>n-WHk(&4m`i zSwc$zEGic}ZF>ntmr?|Z-Q^TrLD8x^gf>FF(3X56v=iD39fXb)T}jb36kX@E?HY=% zr)VujH`Ud)pd|f&+MYsp&Ja?C9y5zWppOOfquxstT}9Dqrxk@>VBrv8dUmzFDc4Md z)`kr&MIcYXgF7*gy+eB^O)D#6kG%*73TI5K_Rkq(gtLYIzzNI|qQlHMH?OQ<=|*9I z>*#oz>uw1K0Y@-UplcaNF{duU-;v}s@^E29%|;$2j9~zcrs#%u)^EU%3iE|RX6}tpRL<^=c@gJkj!DnT&K)*1J$u}Q+^k_^hNWev zkITp%Jq#?ht!f3xNzY0jGG^EW2;~N;oyM@qnS(*o_tI!wrFk(u5j;+ldxPS|9G8SJ zYfg}f8*FgIWyBLW?7vUzmR#Q|#(VZ0CMbX_G zg=>ZDgf#-l0vO%yrRYA29%0Smx&(Mbusb}1x8lNr;<9jbTy}qSW=y$emm0%y&G6ZQ z(41g&h_55Kr?q(ciD%sbb;s2;YL+H9nj=^Q*}fc4gJ^W>pJUyhhm?Vbbmm-8vZ4{( zCcljd6##Ubz3Grp4jwPy_abZ%HVT`B%~L8@o+)~OqWdY@PSL~vYb(bOe(tg>_aB^e zj>lJpa5v-YP63+ZL5dzKhXo>Ew#sAnXtx zW@a+i|M+yl>NJ)Kj|z{~lq)-hrx{$kgx$iE0%(bkQS>-PphNE5C_E!PD?BIcp=cLH zyD55-qUZnr2bZgzdbJU)Y8RKR0k_7XTQd{ncQKlK@0r+du=;WOcL;S1qQ;Va>5;Tt?m_zu4={2=@&{3QG={384+ z{3iS^{2}}){3V?5aX#e3KHf)sg3sp@eUi`blhHdq)u*v>=tYWNq6pOOS1CF`(IJWs z+fXM*?5`+-5#lIC?@;s}MITUfjG~Vy`h=p-C;}}N0(?W!cNG0V(N7eC^7k7>e^B%n z#T>=pkwPf;*>_VcQ7prN2L<<;KFim@*U;C<*Vq^1i}l6%n)sUfn)#ahTKLZLwe+>} zwf42~#rxX&5`67^?R_159etgAoqb(=U44nZBww;G#n;W(-Iq$SN^x6?&!#ww;(6fy zLh(%$LvGJde1zi9DLz5@MwIVB`LijXN%?%rFQWV^%CD#V1C-xO`S&RQ10@nA%_&Ky zU@|2+l+2^VrerN8cT%#8l0%eyM#-NwMj2lpcVyU`YtH%SBLg_u)#U;d-B~+$7Pz^v zkggL{wQY|Tz(>$1Kvh8z!;}}_$X1&@c-EkqS-8d86JYUN-=l*@3Co2v0 zL!+*0oaAQzdagO{@3XJEWw)6sJ&D3e8O3aGqw6YM`zEKmxxDdzA+Y+!@1$y9YUdVk zb9*b-ocj0obebxymOw`k1Tc{7f?IdGB?=|bIshpFaOEO!o-fPaJo+n zsOIq){dr8Wd#QG=OWj^pn?-)?aWrVnSGpVj{YZ^{e!lNPEbD0 zHUD?-(Q0>9?U4>iX$7IYvcdrDXDXh31t~utP6xt=bW`n?@5p1)pjn)=7i=Y4DeR$0gfG41y{JC}} zce$DT`akv1u?3;BB=*LZF-~_I+uR&}&o$Hkc}+$4QPed=KjfzWXRaCeC+T}tQ>PfM zE8oZ5d{6vehSAeV@!_Cd)o!ZYPKFrvXVzn1%E_W83!H~*@&GHuushEgKx*gpteY2~ zYmWavS85&3wZ0eKe1u#x>!0WIkCc#oZcbvoFgcCZQ%zo1A1JDQu3eLd+2ywQO7qobRabV{oYSz3qF)_pa|f-}}A~d>{Ib`HuTO zqFAF?r`Vv_q}Zak0mTg|ZbWfoieoB#pSTW{zAx}KzOT3h-#6e;iDRPgKZQfvr*mG~_1s}y6zSc+Rx+^UvirPbVh_JY{l**RgFUf!+5 zc*oOHYy+N_IKEtr6=NU)NTyaAUX+evD$pr*5<81s#I9nZm?S2PDPlLVJH-hUx1+c{ z#eiK$iaSx#nFJL zIELb64^PM4Jjfm4I?om%XbH!N<&vO`_ zJsF;P49{Mt#4{l#eo%8~v6M5Ldl}Cci(EDrFgE)!HuD@dd!3feQgH=ivrJqlE)o}u zOT?w(GVwfdxp+Rs{V5(m@j!|PQ9PL9Arz-kJe1;L6c4Wu?I@cUiWi9&1DlsJHrbOQ zVZRy0qbMFnaVGo79?=3z9<_H-Ra*W}wF8UozBsezjBTrP&EttR_ne70Fg9^*#czBeH8yS}yC>|XVH&HyMo?LDf?_yZ(5buO7C3q}2my7qn z8Y9lAMU_RY_(5?|EL(W_J}5ryV!4B1IiZgDUW}dM3yjKL;%@Ot@hS0X@fq=1@i}pi z_&mkg6a!Q_6i=dfGR4r#rcw;OY&yj=D#RC~RK6nagQp%PhzA&zGd(J2Q9K9SY$5*K zGf@5q0`olv<@*%pdQcu?P#zaQVlRr%p*Y~a1D5e-Td%pl6u)L*enoL!MEr*0{Ca}< zgZQ%x=1&aFAOq`H2IlPAVDcBl@A}3C)64aQgdHp;#IP)=BX%@~BuQ+?o#dBfNs&}Z zlXS_DOv#c!shm%7A;k+QE~2=Y;u4C_r8q=!nBvk3DZ2Mgij$f!EG5``M{${lAM2l-TAw3G}LkQ7k34`%X%dlHmm-_#%oIJMT*XOT+AD4)+?ox6~KFl=@J- zEF$%z_`LdoDGii{IABVH8JNofEomqN^ZeRiqEF*pEIH20b(G|8!IRh)JWT6|?ZwEF zW->6drHN9GG)bB)O_8Qb)1>Lr42mzH_(F;=qWEHpFQNESiZ7%1a*D5@cvXdz>&i~@YCL%%GURzHpFO{wUDy7Sqet8|}m(nVxU#>Z&eksn2A7n-ca@osxjdY_c zF>hdCt_A&4TIJ}MYie=rMY&ai2U%7~w@J54>!pZPE^UxDN}Ht3(iVzuruY_$*HL^c z#kWy>JH_iMj!;}q@rDYCJ+lxVXCU1j6`9)@nHxPaH&=?xJI{dmAAq@wfw`OFO&*v} z1DJRUcZ|K@!5$->*Cwx-UzA|~VMN+X@s^16GR1e)6UqJ3Ay-fyWP)-l6Lp7~psc6` zl!bUNv$v#oTnyi47~WM!BrnD>>1#&eap@!JW9bv=Q|UA5bLk7|O9@ntdnmq_;`=Dx zM)7uv@2B_yiXWu-A&PfYNMH|gDEvYCQThpJ{Do2Yut(wJ6hj?7$>ifxXE6NtG4%TY zL%&GzBT)?fGGORe{3?4<*cFQ(bKgNe&Nt7Bwzt2b9}GPaKUn#mi1@)gv$K9U`kVS& zI5_&7GaPq;fMe;mVvpE3Y4d#ipp>X|oaSYk;P2pI>2J@le7cUvUW`P4AHdR|{JklDmg46q-b3;86u&_6ixflWdWmA_T(4C4`?^^A2e`t~KZIeq z&%<(mrEolahRXkd%1lP(c#2>3sLTc`L9ciIfg+ntukP5hkbyBL0~aAFL;h zv;0Aq#(YNOA&_(aIZQadR*Oc<|GdXkp}*Lru!vFkdL5Cx7-g_k4k%pcU*uoxU*cct zU*a(_%?$O z&M|nhfOnIL2gz^IAeUuj| zFHzoKA?q%Mas%l{X5o=zfI?o5QpjtdC^{A%csSD;YdAZN>0f=klH3+3loKegL@AUz z0EKc#ZYz6HUIlA7djl=eI{`{gmb(Foath_)^px(DH|j^C+)D= z%%XXVsfi~miI%X}18cB6)Im{B0~Gm&AQ9z$Oo;MUtyo@^QSwB_;%Iq{JXX$-$H|%U zczJ@HC1+E0sj*OSBZWy&~Q!8mNoI9v(SAwJ<0 z4+*lw+dQT&m6-_$?~yNO7`6wAD6a%D3eiqx*NbtD42POj$k)o($!p~6}Cs96`^3bQcRmitSDU3uZ+{7sC?orsIlEO1<*U=Te zfAfKJ^8JiL*bR~DQMdyrJgoso-YM^96z-yY&xrgaQf6S^ED5teewYp!u<@wes#q0VjPj-jFSra4f##^E%~VYw)~F#uKb?- zzWf2@`%``ZrE_(>GPFBpX0Dm9;831P+=QTQK- z!rvH#zf;~@q?WCUTLc&DD9N?N(Tkx;CRYUpnMjE zMWi<+~| zVO|}Pycn~Ua~Xwml(|ZQGEbSW6e2x;pHKNh%7Zpi zRH1~T6fTTXxRg;?>`{1bC53EV`i#TQzdS`zE@c#6M)?wt!c}!rc%5=Rqi_x7LlNZ$ z%7^Po;myjeE`{qDg{1)0-)MNs24%C0;3kIP!g|EGOWDB?yj!_PxmUSQ*`{n)?pGdA z9#kHp{9?*4q5M+HFQf3_A$~dK&!_wf%G;Eu70Sa=1Rr0fX>TCe@BJQFvKxQOH+{!q1d1T@Jrs99~gJB(HeiD}ON#e^7o@eo}r`eo=l^ zep7x|{!sp;{FRiyit<-eel_KmqV3zMWHG(4w;Jsb6(_c zsuYE{o#F7`=TL179I9ZySR3U~ZBmygR9mTSfI_u3yy+FNCy-2-Sy+plKy-dAay@K)&QXWQT z$p2x=KSFuP{xQlwPWdM&zq3NUGD_h!;zjCpT!MN%qi~l;;nU2Kn}42(#TU+C_#a@n zfnf;ZVYi3j7Qj%wL*2?=lm}bPQ|>z$uUDJi^i{o2-Og~_M)_wV>iv{|ww^fdP#=736lQ#WyJbHXO_aJf1ns=07kTs$Vi5zoPu>9*^GwkA7ACp1qjA4G#-&>>YS)?KSqV z>hFxk-zfiPME!&E;4o7k^P$FRJi}^-hS?B(6tI%}F|2B@io_4xksV zn5qRCh10a@+6--`maCnk1+-aOo|aGfA1VJ6<$tF9FO>h4^3a`rr#y5gn9uxGq0Np` zI4??J5u@-#ltO|$3W@Iwh5rGC=P?SGQ^I)^+I3QRiFO&I@KQ=}M7x|4zMd3brCsAv zxEd%VgaLIOP)LN@6pE=HQ){(bTncXn3W-=pBrirpyNgj+u5HjZYMZpp+7|5&ZL3zH z!Nalql*p7Ql&F+wl<1Tgl$exQlr*T&?v7HpElS~oKp|=9QP{YW!lq{^{0}GuH|&V^ z3?+>`3is4W;Vas!jKY1C!25nmV(UraYuXW)!q*vvaSW(88HG)1QyA0DW9nV)1DC@0 z8HLU2h~&liMEjmm_^I}p_PO?j_NDff_O6#f#W@DD~|dym47l@unPq43|QPzNvUhzM@jb zis*5abgmzTdUL%c0HwEpxeDn5a}~W6%vDI&Q_WS-H&Leac6vvLLcIf{FbOEsTQPLI z)H17Y;S5R!MD$!r2G*0p zJbkt!3-utAg@XX7(`|qDfGX5oA8eiZV3Q&Bh*739A8dW0zDQrJFVUCk%k=Z~<@)*h z3QC4jGK`Ypl#HNcBqiyTjG}O`4;e$r*a|)BgRNf_MUeSm6XwmpCd(wV62a^<2>u5M zG8b%pEhXbT1epu=X}xUpa-F$g>l-K;AJI2aGNGObZq;2EY@NAalPmyAS_Lu|vy@DtWHKdFD49yhG)ksZ z0=;M^CD4n`snDYi*!o^~QBP+M*d*W~nCC6(ku!Vl{{wrC&K$7ycPN?VAy}saw*HCE z9I*9IDanuMpHmX7CxTz=%mG{fhK&yY06oA*O z4kjc}=;oYmFgCEkJg^PkAckQ04AGDbzabln0h5vWloV1p@rx8uQcOt+CFfESqHwqu zDXlP~9@s_$R}vb`1Dkkz?8%Z!NqGJlN%-$eLW6l=8=#wed+ZJ7fo*hj{&k^bk@x>% zFdJHCvnU}(iqRc#G(g8%8Zkh}T2?-Z%i<8BbB$!GMkSlw9En#j7bWL#YE(EfSl}tKb3)0cJ zh|N^Ma8nz{j&H>elA?P@$9VZ(X{>h1yqb}DBO~)7hVyl`;(IY}Fd~f18;!NbO~%c} zEygN9AM%BXfgC=B7$H zx%CW~{{ff}GcX^aWTOY>;{Yai3{ECx8|z1c_YK=z?|I-DPaClA7BRr$vpHfsN6D6Y z0{NoxvMV27V)F400P1x6r97Yx8i!p3Ut5opnU=V#J$?K%&{!OfcJ-?adBm zN3)aJ+3aF=rDQiHPf|Evk33BYbR(F}KsVY$$@7%FP+=yy!qDt)rovXS1hW?-@kNis zmnea?X_XDr2hO1Q@1tmfCw9afPRU*m#dJVX3i6+_7d&|g4*quEt5D1|ComMpQ}S}e z%%bF#dZIYVgr_o=o0HiPy$^UF&Fk2U zlJ_b3zlm4!cO8qEpm!awCz%lwtU~1`xIs|z5hHUGQyxD)mGaog zJHODp)4azSuFbm{kDoFjxrs^Ek57x^1LiJ<m5u9;4*fdQ$j_`MEn(f5wLD-f0%!of0-vN&O#Qpc#BZ-7bPdCz)=BF0aJme0-=IH1s@f} z3d`prXvwa|Xo0bZ3Q`n7LGd(3!90WDzmK2=55bODEvVp+B51V&1o@^`8}_0I8VZg9 zWABy2wAJ2%Ww?k1t)xb*PE^q9hoO~dr8pQ`$$+7t15{RbkZS^L&p&xDA8r>V(dunE z)}TFBUm#Ji>WJjU7;L4n;tiof!-zGM3XSZ98E_INJDc7;Iz5{`0pAOqZh@Cig*D0= zZH=+US{c?jE7KZpO|Y`45JQDnD#THt2^E@Bp&1pLQvvGgEGo3DuqIm0W_&Bhnrcn6 zrdu-@x2>qqnxPASsL+NA@l7Xl9Mg0tvLgVPI2<`x$Pi^C~B z61z?IzQEBc`3p<)om=Ya{@Ax?AecWpKQBL!-?LY0^6WsMS8A_rJ$ohxQ}U8id(GRce({p*$&Evqc3rbnd#?`uz0|(y1(L$%XG_HglIt108Tq{=e zByzZ%RkmP3Ahg7#D=RpMohlxl=$x3DlhQpcB{|vr%sJN3x)A9btc$FRtxKqoM1>wy z=xt|tH+i{r6&(C(U16=VuB1XT6;i0sZG&~Swc1)lh3-^Hg?nVT)~;4rYGj=mDku)Y zA?Ueg=eh$9ffGQpf+c}a0G`^BYj&(Vw3|mxps*|$KghLmapS!wqgyvwx1OT#W~z0& z1?H*!ROm^CUUru}u2ll&S{)$Qa)z~$tQlwVhh{m)-zFy?LYOClPn0LOWk(Q0#ZGC< z4isSr5@)w9EiRedws;mh*F4;SLl>`y2q<4;wyWWcs+Q?8(z6wk;|vEIg>`hG{jJoRJm1ueNz`Vs?0XM%Lic z(on&yveIDK#&(>|Psu8Slahn^!Tf`bWAxZ2%_e1JCC(2n2~UN;(E>%{Y!Yc|3wFbt zjI7~szTInQwQSW|Zxi1(p&k5^Rj@P&In5qk7?{JdfMf0RLIovI>u`|?ruaea+#0nm zHEq!bH$QejGMq?O7|dD{E)6c2n9foiQe2pSK=0V8GkD;-`BbG;t=KWP#ERNArP+qW zq-5J~%eJziTlZ93wKco3-4IT&bYrt}RmOt@gEO+yvROXEg8?Qjypv<91&Q;5OiZ5` zhLhMTFCB={`<@-?XX|z&miK_c&B_N3vJKlTAChKUb_14cGf3S_xe(g1I8=2SIvkT; zc{O`UNwDgQ$(gD-7@6Z|W@JT= zsvaB)1(s~coR9&H=X?fw+f8#%n3x0d_2h~zpOkTmUm^6AsnNzRpOOJzr_TWC zS`D9k7p(G`5d9Rta}sB9O}VyQN3I*!i%aLmaO1fwu9z$1&f_lPR&h6Rw{W*|x5Fcc z?&BWjp5~tA_HZw7d%2gnL)^REN8H!kABaaPGLVHDqQ)o@bw`$bnMK7Y4&@1Rw^g4PI9Yyb;_tA&wIQke1xFv3l<8cSv9iNTU@fbW2 zPsIgz0WQOr;8pl`T#g^akK!lsGx!Dk4u0RI6{Dye$c_Gu{=smxsJBvRZL#j*I&B8A zw$-YzuC(s5?skM*A1d?(`9_6)R5*LHF&z!CwprWJ05kyR!1e+v^ryl=djb3diPxrX z(ZqoH+dy!B6a;EtcS;k4wK*$5uV<5{Ox1L~fp%i|FLuD@?sLx+{ z6BPzHM+{rLtlfYLOS|0K#jTu~U7R0S(kf8eDy3K7lpgNTz}){h3q+1*Ahz~c@Th#} zw}|y36^7Vd+>kFL-3^)Le&6pLyX}5Hg!Wb7*Wq;8AK|pwui?a4pYWOWw)KwvmHn)9 zFf5!KdkD^Vg#%yV6j@;y6-GdYIEgcGGPe_Vvp#f=^bv;VnnV8nu%uc?7!3}GgQa0O zM;k;be5juACvL(c|1U>bo$AP-8mFg0r)t8r;ks}sTwiV=bf_F|IyY1PLHwX z&v$4CPj%>|Bq=FMs?t-Lp_D3AS*={FtWj=I)+#qE>y+DI`}4i9_4$6~A?0D^QRQ)E zr}DC@tG(1&umNkm`j~n|J+A(u{-*w+{ssFSutqeWCc(Ca7FtWKwHB`>XzjI*T4$}R zmZYUSgTJ3i2LG5|%u=cuk3_Kyf*M8J~)_&D~*Z$OHUDb8n)EnrH^cX!( z@25`zccE4KZQ!x7S3jg5){p3K>PPkC`p5dG`sezW`q!|8-qh$0i*dPg(a}_ zjLVFxVCiVPvCDYMc*fXcykP7#J~F;GRZ}<3#seCUXk5~GQRDS7LW~~MHl}k-@0k8E z17ilq438NZGb(0G%-ooTF&D(Fin%IgbU{W12hxR|(Raoyua$7RM%iCY@CB5r+LB<`NL$Ksxd+ZFd@+|zN-#_fqa z6n8l8NZgxoN8{d!doS*TxIdf3{=cfu^DPMl(8KLLPwTi4Ck7-4idHUggL@A`3B`dT ziYTIll8PdND50bhN+5zLqJ*Q8Z0|a@$7%1~>2&I}?s=YjzuZs1|KWY#=lNNASVdZ8 zSXEiEt@u{$R(q^EtYlVQR{O2gRvIg<)u7do)d{QD)tKAI@vnYy3m?# zU1{B5EwXO4ZnN&P)>@BPPgq~FzHI%;X0FXLn-w;zY}VNPW@BSxXJc>UVB=)tVuQ7z z+DL6CY;M{-wfSW`*LJ?`Lfgf*OKq3iuC!fkyViD{?FQRTws2d7t*0%@*2i|6t*@=W zZJ;g2HrO`QHry6#ORz1s<=gJJowmJY``K=TowJ>fU6dW(F2{~+muFXES8m6#tFhzS z)!B8~?YA4T8?!rLH(@trcgXI6-AlVyc5m!H1Lgx30hR!k16Bf71GWIR0RjMMKoB4t zfCWSXq5)(;BVZ3;5HJKV0E~b!zyZKGU=nZ;a2Q|#%m8izZUgQD?g1VE9s!;Jo&#P1 z-U2=VJ^?=4TiJ)&r`nV3OYQmg2Ky8CFYJE+fxs<5G%yjE49o;lfHYt=kOyo6wgLA5 zJAg8v8aN6x0nNY(;1uu>a2j|Hcma3`I19WAyaBugyaRj&{N}LM!QKJlfOCj)NO#C| zAUcp7@*D~r3LU5pyB(ws`yA8`8V9Yzpu>>EMTb|8s~sI20~`|^GacEE9LHM6-H!E+ zJjW)-X2%vswc~{2DaZSce>tsoTI;mVX@k=yCo3l#rzodnC!!O{DaR?-Dc_0WROG~R zs&{I3YH<=diJbxf9f^wm{RJiPRX>^ge z^thaIIq&ktb)oA@S1VT=S36gGS2tI8SEOr%Yo+ThSDvffRp~nEdfWA`>pj;8u8&-w zxIS}z;ra@+0JI3S1hfpa0<;RW24n?t1-XI1ASlQk1P38No**|?bPjX@bP049bPx0Z^a%7E^f%}q&{xnm zw_LX}w{kb88_SL7*6k*DQ@HiH?RQhVY237KgKk4^2DjsGC*4lFopn3!cG2y!+pODF zx9e^<-EO;m*}Q4<_RTvs*KY3Le0K9o@KUfV7zRdwJ;5k&05}|s1xJFT!Li_Ya3VMv zOaha^d0+~-2wV&nfMsAgSOM+>_k#z(IfS3c`kPAhi%aWDleRB7<~6 zdLa8Cy^tY@0b+!VK~6!gLasw@LT*EzLta8&L*7EZL4H7fLFYnOLDxWkgRX~KL0zG4 zP%sn<pdX=s zL;r#P3;hoLxy5G7wk?D$HCy&?IkV-h`$~7HdxU$udy;#Kdz$-BcZz$Fd$D_oJKde( zUg2Kp-r(Nk-s~=P7rVE+8{7}M&$u6RKk0tX{et^t_gVLc?oZs`y1#e-0hcEM_3Tv$D<5ypoJU_w|cYydV08-|U*MqwtH z8D@chgZU@;T$*@UJq}CH^YT+F%wSR*x}{S&xs1)rj8_HV6O$h}eukAUqK$gb!jH!WR*Nh(yF7 z;t@%R6hs-K7SVucLNp^<5$%XQhz^7rF^U*ROd<{;W)Q~^ClRL+HxLgHUlBi%8(DfJxi zJnZ?0=M~Ruo;N&id*1cD=lR_8gV%De-@Kq+7_S(wRIdy#f)~*%+pEZn=0*2ncrm?L zUc0?oygI!MUWdF+c%Ak-=XKHR53k!^cfIa;J@9(u^#nB^1w;j*@Th!LA*vWviYh~u zqxh%})Lv8%N`X?MRHzBm4C*B64C*}UBI*w65$Y-G1?n~GFVtt$7t}Y@5AWsPzk5Ue zgCc(3SnoLRMDG;ubZ??}wl~>3-<#si@ZRO!?yc}vdaJz$ya&C9yl1@6dSCLM^}gnP z!~2Q%Ywvg7AHDzf{_g$DXRglzpG7`ve5`z2eYW_(eULsVA3vW!AB<0kPnb`d&rY9W zADT~z58bEQr_T4B??vAmzE6GM_$l!-lb^MpogdK8$(LOjC)yjm4eg6gK-1CH=q5BD-HdKQ??v~Z6=)?|jn<$i(MQoI(5KO7 z(dW@O&`;1$(a+E?(4R4jG0QM3F>5gEFdH#e7+Z`z297~uP?)V4UrYc7g9*WeW3ZTP zOa-P5qri+}j$>vqcQCIoZ!sS*|6+aw%?X+pgbeZxN(jOS(SxdkI6>T?x}ct*LqTVP z&IX+ex)5|b=+B@BL63u;1-%IR7Q7&MaqzO>6~UW=or7J1U4z|%y@Gv$w+H(Nql1Hj zV}s*^6N6KNJA(HI>w<@ZM}o(Kr-Ba!TY`@U9}j*SvNQx7f(gNeM2EzMB!u8Yc7$Yx z6o!<9l!a7;REKavxFK~R;*j=`Jt3VTmqPA_+zWXS@;KBf6dt-Y)HgIB6cZW}8XX!J zni!fAnjVS|6@*TOz6{$C1`P`hiwTPlOA1Q~%L^+FV}voos={`K9SEBaI~R62>`K`6 zusdOYhCK*-6!t3YWBAhW-@*~$Tf@`Bi^HqK+2OmwYr+0W-Juzf%U|q zus+xTY!Y@SmW0j5lCgBG1$z{G0(%;J4to*%2lguVI`$U!4)z}QA@&LOIrbIyE%pQU z6ZRkMzt|tRIk@?_MYyH76}Z*7-*6jnzvFCh0GtEP3FnI2jDzATan(2uj*F|uHR76a zLYx>U!FAyF;(BljoD!$T4d4cG!#E?(gd4|A;SS@D;Ev%=;?CgC<1XQ5ao2D+ad&X{ za1U`$aL;isasS}H;=bX2M&?B_A}b;*Bda5?MLvpr68S9hWt3kOHYzeIIw~$o93_uZ zMD<0fq8CR07QH@tW3*LtU9>p5J$g@cXY|YHf1yaFTjN#n#`v-L1Mw3HD-x^{Y!d7efC(iDyAo;=xC!+M&lCPm_$T3O z!uLd<#E`_W#E8Vm#GXWL;$Y%X;z-h*q?Jjllh!7!Ps&LuO)5(&PpV8hnRF%TTGEZA z+sUA0&tz1xPxAKUeaVB#L&=8Z(UdhQb}9BL4k^wl)hSIW%_%J@ttpRFKBWAW@^{LY z)acZV)E%jrsXJ3oq|T;ZO}(CaE6qO*mll;4lNO(*N;9UNOgocyKJ8N4Y}&Q7n`w8_ z?xj6Udy@8V+K;qf>2uTPr!PuhlD<5BW%`=*-_qBod!)yvm!(V7C)4j|EXZ)mz+_}* z)>Hr{YWSW%vp_3(v;a z;CJIY@m=^H{62gyem}k+uf-4Ihw&r$QT!$RyB+Ixc?hY1$KQNk(0S;7UvCBi+z>&&^C3o;jHF3Vh*xh8X6=Eh8`OxsNROwUa3%&nQ* zGyO6HGlMciGs81+nNgWBnT46nnZucvGyl%A$qL9KWU;gMW+}7OSp!+Rtg);^S(dDs ztm9cHvrcE7&AO3wJL}J^2U(A^o)YI1*AO=lHxaFg_CyDwGtrgkMf4$}i9y6zViGZh zm`=#5<7@{i9JLGQAt!22Z)2jVWN>}BAy|hCtf68Ce9MC5pNQ26Ymo5 z6CV;E@0`06xHEVsc_)9TVds^df02G8!AL%&?IeFvASr?rPf8-Ck}^mHQWj|^DVtP6 zDkD{pSR^)yL+U0CkcLPG(kN-1G)X!{nkHQ!T_)WkJtMs)y(N7heI|V&eIxzIUXg8; z?VjzC?V0VJy)D}>J1{#aJ2X2YJMupvk^P^T$jdIsF3P55mu8n`S7cXaS7mo*o3n3c z|HyI33Cp46@N))oPUKw7`6K6Q&h?!8IWKZv=e*1LnDckeKRI7>zUBNNFC(ucuOY7^ zZzTUt_9A1*VdMyMBsq?pKu#v7l5@!gWIDNqTuba=jJcVUy*N>56B1RJLS9OL-O78;rRjik@>{@?EmajL4Hv_EuWrW zo?n??ozKaay?@1@MBz0#<>%;84Mxg0GZ$ zl!cTflx3846k7^_0;D)noGGppBn3s;O7W!xP|y?tg+ifGN+}Eqi&9PDP--cyly-`O zqN4Ouw3K1W2xW|NfO4Gj2jv;%CFKp}J>@UTXUbQ~cgnBAd4&rLtqbi6?F$_WoeEtG zHy1(+-3vVmk%eA`@r5OYdkW2kw~OW$xfBH#k^TdRO+|ttQIWW4Z;`S{T{KWMSTtNT zQZ!m*Dw-)eUUaJHY|(|HOGR&r{w?}Nol9LnT}oX+T}53(wWqpK!BlUmFV&xlriM}@ zs5ojA6;I8l?xNOG>!>^`pV~rgrM6S0R2j9KIzkC#i?17U~T381*FeH1#a? zdGX?6NO4qgNpVN!r6!@0Q*#eN_5{K99bdzMj63Zbb*s9q7(< zSGpG+Ll2`z&?D(_^hA0JJ&m46XVCfd7J4haoi3%z=-u>v^ggRZ&>cT%oBLsTiv;S4>pQRGh82P;seZw&H5V^@^JnPb*$jysmgx@v-6) zb1f6VbYi+P-I!aLa3+%J#SCVKF%y|-%nT-hNn(#c zBg`?TnK{Y4$ozwOg?Wv6gL#|zC-Xk@A@d3I8S_QuqDq&_h)PPOsM1tl68=EmUV%3 zn{}V{koAQ1lJ%PPj`g8xPSwgP$10a9w<<`LdzD9(XO(x=wkp4>z^bIG)T;CUY%LJtGcIpvifNCiR#nUXREJN->tq^{h<0$ z^^@vn)t{>Wss6Y62YU{C9^0M`WqYuZY!rJt+m9W{#<1hq3G6I(4m+1!z%FK&u*=xx z?0R+^yPvIP>)8hODEk0=f_;!Z&7NT&XWwGqW#3~zU_W9%Wxrs*V!vU(XMbdW+O>8U zd{^SG@?Cp(S#~|<%;z|A0yyCu94DF+%Sq$x}cHNG_g zHJF-^|B7u~O;!!5CZ{I1Ccmbzrnsi0hF()%!>nP|bkrR9FXj4P3#<*TEvRj()zluZ zy-<6(_Db!w+IzLnYhTvBu677FYY|f7srj_ z;<=gJLT(9{&MoIwaoOA&E|)9j%DJQ51KbJjLGCnnhI^cQihGuOfqR+zl>37Fiu;E9 zj{A}OH}@azSMGQ2&)su&+wJz)h*bb%}K;b?J5Zx|}*{9j&gk zuB@)Sj#*b<*I3tFC#)0KwbvQy4%N-n9jiN8cdqV2-Q~L3x`%b|>OR$duKQZ|vwlwf z{Q8CU>+2orQT1Eved`12G4&z!;q|!s==!+&#QOaD!g^{wt-iFLQO~Sr)mPVZ>TBzF z*DLC$>mM~NY}nio(?D-%YZz&`&~UxsR>R$fdkxPUJ~Vu4_}uWd;akHG-ZI`w-WuLI z-bUWQD27V)-&u`(2_+tJL|2+Rg^SWm5<{izo&5Gvf<~z+#nx8knYJSuF zx%ro1u3)}kp1!zIEAVH8UNEPf5WC?Z(vITTOxnQ@TQNS0p z2-*Y^L5Dyl&oK{RCq~vSNKr)MEFejTKG=*LHL(wo@k+Hv1q->N@ODfh@3<&A~z9Ov{e); z$`BDmL{YXVS5zP>6469-QMss6Bov87?V>%R4$)pwk7%E$SF~TG7HLGsMUPvTw1Qis zTgzHITg|Q4TK{VO-ug>CPrN|9QoK=YCAJmYiyg(zVplOzj1q4Z`-%g^XfZ)d5!1w_ zVuqL{t`>8|wc=K>Osp2`#CowoY!aKrlj4Kov*H`#H{$o=zr>%#U&Y_WzuM-tEo@uT zw!974=G5lW25Q^f25p12d9)$hP;EYK+uBmv%G>s~9c;VbzNj7C9?_oHUf(Wk7q?5= zrS1FLHSOB=!SAgLv+d{GU$+0#{=NODWUge9WQkN>|d4|I-qPIeybJluJ<^Frt4&MTeQJ8yP=md%$fku8(0 zl>H`KFWV%ulDWwsG9Q_rEI@{lg~=jhk+Nvn4q1VWBjd{IWsS0CnNTK{Nn{**V#Zy-W5&_eSq6-P^hM;NIJN|Lxk;1?+O_a_w^K z^61*u<=f@o71)L83hs*QO6*GMO7GgymDyF@)zl^I5_h$Cb#`@i^>pp)8tNM9I^1=% z>v-3xuJc_NyZ-39()Fn8efPrdCEd%rS9P!LUf;c`+q&DX8`$mC?bE%z+pjyI8{Hk; z9o8Mujq8r?j_r=`F76g~8@sP`f9V1AV0wr>H9b8&>Yjm~!JeTWbC0EGrsr7CiJntE zXL_#p-0Hd8bHC?N&lCAP`D*!k`9`^w93ThEo#ZZZPdQp1Di4?AP%f5B+Mt)9yL4H|2E59oLxNq$~uYD=| zs`mBnJHGF+V!i^X*sOpmUA3bjI`Fe{EJPAkqTE+}RdR~0uDw-hfFpL>`0uIgReyS{f*uXV3oFR<6C*R^+Z zuYWJPH>fwHH>?-i8`T@r8`qoIo7|h)%jlK#j`!Z`{n_W-7v7iK*U+cz8|)kIGxm-3 z9qK#LcdGA9-?_dEeV6*~_TBG$)c3USMc*ss66FS^wbD*$uXI*|lwc)Pxn1d}#42Ny zamqwxni8+fR1%dmC0p61+@tJNb}8k`Ugdsezf!BzD-Fuy%2UcS%5%yK%FD_t%4^CS z%G=7j%6rQ1`)&3I>?iK8->=($asOM@N)=dzRH0N`Rohj;swh>gDnXU3N>gR1cBnE{ zg{opzsfwXus#vNH)qd50N~ao9jjBwlan+>iwCbGdrs_}Cebpn?bJa`L8`V42PxW#& zQ0=64Rc}^9)i50|Zr`Xqh29aXc<>hI|9=^yH!=>OIK(El2mJ2Zc2(a_SN6+^3r)()*3+AxF|iW_1K zbqq}nJs4g%>^vMaoHd+3TsT}jTr$iW-aXtf+%zm077dGs<-@(h`-l67wZntMr-!c% z-yZ&R`2O&d;pfAzhTjZ-AO2-nV%T7?HrN{M4bBFT0c?O8wj06?I}BL{l7VcMtCdkh^0nW5XT&(LSsZ|FA+7<7hHhG!$oN4AW_jZ}V=ZH?W9?&m#^huDV*_Kl zG5y%^*vQ!7u_I&0#!il%89O)jV(jzSx3M3lIi`iC#inJZ6($>#n`w&)W}OKd|#an_GG8}8Ha|1JG`}&wH-8+TGrn;A zw{g%ocznw^d>lEB8s9qZJ038O84npxAKx*aHNJB^dpvi%V7zFYHclUBj8}};j(3hL z#}AHQ9Dh3gZDP%Y+XQ+ddLm__eL^;&n9xm(PaK&zHgR&|%*6SLYZEso?o8a9csTKR z;>YCglgLT(WZ@)zk}wQ&kF zg`0|+N}nQ5Wl!Z!6-<>(l}%Mlv8Jl0c25bWv!`>X%cg6m>!x|r{OOkI*6H?X#k6u- zHLaP}P3xzJr$?r*O@FhvSYj-xmMlxYrO?8#R9k8-trnT3+ak9pEP9K~ z1~Dvy8IIu@6Jut?Dbb7UjZQ~>-PGuc#>yH8e47~ERNpWqx_-_)du5Ze7lSU_SZ=e9 zDIIBVu~!v%0=>>y7-3RrQ$>?qL%Y1Vos7iDj349A1TaZVGLyojGJTjdrZ1DuWH2Sn z2xcTRiW$v}Va77!nDNX6rj)5*<}j5^6=P?rnMTIRG%?N0BIW`{V+eCOvyxfOT*X|= zT+eJ^Zewm|b}&1cJDIzfUCiCgZss25G3FWO1?FYub>;wbka?4Ni+P(l!hFJf%6!Ir zjxgd7k4(snEJ#2il8}rPq#`S_q29<31u_q#P!xv3Q7no>i6{y6Md_#?>W>DXGBg=Y zK~vE*G#$-AGtn$mj%K3@v;ftidendxqGjkJv>a)Opi9tYXf?VDU5nPE4d^y>JKBg` zXb0Mf?nHN?`_LYAKY9Q?h#o=v(aY!+^eTD{y^ao`gXmrK9(o^rjJ`pq(I2dtRalkn z#rm>-tUnvfhOiNABpb`du__~PjJB2N0YuH+L0lScG zWEZiE*(L0S>@t?Hm$H|!tJo{qwd~dGb?i;7i`~ZVX7{iUv5&G(u+OkBurIQ&u%EG? zvtO`ZvR|=Zvq#xu>~Z!4dy@T*{gwTV{T*Y>VHqn}#a3*?{x|>!;vgJ`!*Lu=$Jw|a z?vDrKB0LO_#A9(Oo`@@P4X(rWxCvi`mtzgD!dK$e_-cF|z6r0#8}a@40sJ6-2tSPX z;z#hK_%XZ>zl8VWm+>q3RnCVC-~zc&E{u!fqPci3flJ|1xpXdr%i(gl0o*{YfGgyN za>KZh+$e4wH=dism2uO!>0CKCo2%mNoP(Rk)p7NllWXFZa4p<2?jr7DZUuKaw~|}U zUBz9)UCZ6T-N@a_t>-p!E^Z6Am22a6aJ#s>x%;?1+{@f6+^gJc-0R!{?jU!FdxJa7 zy~(}HeawBqeaW5TzTv*-e& z<9F~o`8)Z$_+9+n{BHgp{$Bn*eh>c;|2Y2y|0MrB{{sIye}F&8AL8HR-{-&Qf8c-Q zf8u}Uf8l@Sf8&4WPxF76ut_vYCfTHzdYimW!KM&Xs43PIXBuqEHx-x)O+}_5ref1j z(=gL;Q;BJ`X`*S8X}W2Ksmf$GRh#Ne^`^^BD@|9JR++9etu|d{T4P#ky4rM&>3Y+8 zQ>$r{X@_a2=}yxg)BUDbOs|?=Grev)U^-|zWO~DN*z~69Ez^6ZBc?A+Uzxr!eQWy8 z^qc8-vya)=>}U2j2bcrRLFQm{h&j|8W{xr^n$ygE&3Wd2=Kkg)^APh4^Gx$BbGdo8 zxxzfhTxqT{+s)PHdFF-Y#pWeu%}mS}n^&2yG;cC*Hg7R+HQ!<0X5MaYGw(3(G~a37 zZGO=Fn0cT1IrH=87tF7l5179)e{DW$K4v~{K4Cs-K4t#K{H^&r^H1hKEWE{JQ7u-B z&Ejtfu=KU0TQV$}mMlxQCC8F$$+Psc^tTMQ47H51jJ8a&lvyTQ$}O`kODrvx3oJ`5 z7h0BCF0w4QXcl6**m9ZWD$6>{b(Zy(4VEpIt(M0u`z()Jp0GS=dCKy%)9wj8m1VmWF#Ch&quFbftz5JW)|WI+*B!7B6?0)=oPLP!u2g(M+E z$P`8iqlGcTSYeznUYH=13KNA%LYXj4s1W7~H9~{1P-qk`5S9w-gzJRsg&Tw$g`0$% zgmh`)-ziNA}d#XlrQLJ})siIaFqkZh8# zK3Tc&e zrL3-<}=~d}9>2>LVbWl1Zy&)Zz-jv>w z-j?2%K9N3^K9i10$E5G2AEY0pKV(MsmjmQLIY>UEvg7F)6a5C_aj>;-~m40ZN1tsq|C&D+82)${=O1lCKmfg-Ve!L>aD(RmLgf zmC4E!WwuhG%uywc}00uc};m;IiMU=4k>RbAL3ccN6Kf)=gJA?q;g96S@}g}R8f^wSyfao z)m!yb{ncE~%~5mJJhh+NUmc+4t3%ac>Tq?OI$oWima0?K8ETE{Q0J-h z)mn9dTBkOui`6A+i%Qgs)fMXH>RNT3dYyWcdb4_`dY8IOy<6R_-lN{D-ly(SA5tGy zA5-_KkE>6p&!{h{`_{jCG61FeIsgRS}20&AhQ$U4MYY#nMHW*u%Vv5v5o zStnbkSf^U2S*KfPSZ7)*tqZJm)_QA$b)mJrK{Mt?R8D zty`^a);p~aTOYITvp!{g&icG{|D@=;=GxkWjKZjlm9a6s8Q;lcN>k_CTb$G2Uyqhn z7F}6e;dHh#UQ92I)o?50&G={>K{hSA+!kGwTR5~ZyLf0y_Rzevl+2+SSt)s$S$Qcr zMVVza(51DQxB@eU@431&i=P$rBC zXCgFSGihecq6wO)Np~<&Of(b2#6pmGCPtGrMVms93Ss=TDO%Djn!KZ~s($g%#)<{@ za@(NJ`Aw{tQ&eBq)L36zYi}&i$}Gx(^5&-G6z1imWTs{2q!gqN>6?<OInrccNb#rU&aHrfB-#I6}4CP}=C)k}$^^Fw} z+^xqBsc5Pww}nB_g32aPgxi~!tP9yfq)qcRRFjK2yLHGDXY~rWn2rgGTn(rfJi)Sz5VP0pF^$q;i`L3RGHCzj#c= zBFEecsIGpg{cAy^9V+bwp(ZssY8_1uyK}Oms;Nc~R#N9|fJH!kV@I&|nC@UR${hB^ zL+o>!=gx&*v-KWrUr^uJGOV$pp{C=iQHJ&$WHg6%rqu(3p0r+VtL&+e-bhDNYJ1sI+xxEE z7W5}Uh60LE^HO^))X-kl9v9X+!y4 zB=mB*&395=^;rY^>uK1lCY5we$0*NYW(niFaibP}fLY31$Sh+nnx>11Iv9Ra^gr#+ z8DmO^H~{$ix{Ah@RtU9x%9zrz?!}+ZbC>dz)&nFE(8%Lr<`Tx&#jMccT+F3fJe4+d z44gI20T5tUFsqm=%WZ+sZFJy`qs!6>_J&5g6J$*VErph-C5-jrzMEq#SrLml-d+5DZJ>6OYah$tsfhMJwPe5>Z zWNcz;T4wHm!9~MHj+roV%JlMz17?dLPi&}Ys+kHz*q01<)HQ7qMQLIw$c9OjZ>J3% zP^~tvvt?^v(oj)H*U#>PWfVNSDy#YUyg(ZR$@cc9>DbrI8n!1U6KjbSs{fovf=jGe$vX6Laj?8WTm>}vKFc0HI+ z?qi=~_p`6FhuI@wGWivYxHp(Yf^h`S1QW<8JRVPWn?II<(PN$4+~LCa;itg3@dkbi zzl%S?pW~DGXT7E@(*K2;b@>nfq6_LZ%v#WGikCFh>e|WJ=B8Rlott6Z{6;0GN9b>2 zu4b-bmiIV(xouAQ#HL|IWqq@Uluhi&1E$aP?2fOUvYgn`V0Y$tvMVnuEzjuN5za03 zN?CI_TQT?#KuH4qk{jC&KB&c_#d-k$14Y=VMm{ULfDotK|wo@1V$3JVISJDApQoZg8qGB3G}zn)Ii6WIjg zZogYk(7)?JUtwN7qwadWA;VVYHOgq0hH1Zf#`TT{tE;cG>q#GC-YB<)c5YU8>@F?e z${eP7{6(m7Jfv-vH1b?Y>567g711x4@0rA%%$Lkp%-76O<`{FFIl-I+G5HPi zE%Ti=OdGD1Xd|?d+9++bHbxt(jnl?!6LvB`Fh4Rs!B33)H=a4|{_7{LRGX-k!Os-; zub(#6{a2a3r1Pw}CV&>L_heU%8b&@S&~$-O1o~M;1L$jRiBfL!gKHp3DnRL~qN;AK zu5?0ZszDYvHr6-l8ZKa4Tt`I+=$xzY8H5^LtoG`hvAf^StQO=-tLnXUXpI8Y}6*}QG!tL zq%ozSAhn_(X1T?NqVgN^-7|=XSeX2xm_!$f)MmI)v^J9x8qo|=ZCsv(Znd>!h*Qrf-d(o#+1N-i8Ku$`Q?%JGCLR`*kYbR#X~x#of)e9iY*Ssv z(|1O+43rHr9c7{{ZH`vi3LM1%GhhS&MB1Z|vRBNvR~6RQSI&oa3!5^b{SKA$v>zMm z7qqYBjHCym5+-p6%?s3$#4Nm*&Dihh`qX^xwgr@ zkkuE!iG}v+`bImYsGj-`$zvir7su7!q*YS6h=nE0wr{51hZ|;tkD%q919#5xJOWv-RPA$XfDjWs1j8n zJF39zs!7;bS z9oWdG5iO?KI8hU7MvJsX+G1^q*0LG++KMg!K&L>LUf{vB47!L)4fj&Qjn;&U#bp(> zuwsV=XxF=*)uMZbg+}OdlNJ`%g1`Z+F&zzHwSf4(U4pn%r?NvIOBbUR8?~kSp!G$U zw$fp3)ZlV-1szZ;wPh}}O1p@%<^`Hqdpo!nta>tQP_I_B7G13^*Dlp2840XIH!{AP z&~@l~bc3d8M7wwsx`~NFw`eP%`j=?YGa z{&HO#H8N^NTf1d+2NRFBYnMR_U#>-WbPwq6OWcudtPy(`+D+?ux3VyYuyycnI}!p@+4#9j)*vdYVbxiXKDz zK$m|4J&B&uuGX&6uGQ9Q*J;;pMbDsT(R1+m0tlWPv>UaT;PYE5fVzxAFP(D8AFPM& z@dYDazcw5O2nb5|G~t}7U!z6tn~^k~_R&bt=G-=$5a|5o+A4~`IIz@Cu!Dl;YyuHM zt*1^KHX7s*dXtL8H_&12Chg`{^cHhky9K6FXqaBK0ScU+EZqdadfym{aML~d^rrX# zt!PCbqK~v&wFkAOZ=oaT6Z9$i3}%$f#6n z1kGTK+X5R=4RaQ?ds22is$W-;0Lq_}Zt{0%?=S(>xs8dQl+FzA)#WbDXSz{>NfSmv zY~x$U9MryY&^BuKfkwJsdqBHiyGPq|7=4SrL*GN?en3B>pU}_f7xXLojoAv#V;HDM z)$5w~tPbX>oC5jTK6Ol}uctbJUB3=77gRXvI)XzRxf^(FwUK7WJ#B|}n|7DBTic*z zmfQNY>u6mXQ%|tN=-96Kxx0*I(26ZAVp$f$T9emq*IKnL+8x?jDjbci ztQXab&l$#34z@Sz&C1#)ZL{WTw*eXV0+`cqZz~Y%((O{ljZj*6Z5u7C+h%55k8)pc z>vTPyv9bwlBAdkQ?aahfs$l_T3mUYY+MOB*f=QIietr7%p;N1~52$H%VCt)^?_+e3 zv(GR`)9~gweW;O6|8U#N`sl6H=Nv88hlQ<<-XI2zvE}A9%=wPP~X7lf?P*; zcO8GN>>yeRy5Z5I@CVs^s9OQEmn~uw>BiC=SZ+>-e;e(!u%KOJhv9gywo@<4P<9w7 zpfHMC*`e;HYG|GVOH7@|6lZ;NVn0D`aa10%rRX?2i7i8?v`5?$ z<{^+UFKREGAz|35>@-8dXwPX68v|b-#yKPiU?)&5uTq7Bmln zJOzrCOE**-H#!YTwJy%E-dmCdl8scY&+fcCQX%~>g6Z)Mj5 z1-G?R@Rs%pP;ja{1+DC+b_(9qUhPW3c1l4TyMx`y-pSs@?$TbP(N?!M@7A!z8w`uYvLM0DF)<#J&MW%s1J$ z*tfN}wRg04wfD65wGXrpwU4y_X&<+-@4{Xptk&2M*^j_%7Q-F^t@;S)dvx{oxpoY) zoT44qHSEBSQLJ}Es=n*uwv7dMzX=-BXa`v1D;i)~de+-iAQaWZ8AP!8!;0{%VM^*2 z>B~;g!n>yehAtRs?WzTYiRzw;d#eaEyC!>TeRVa+oU^5*Zz$=ZsQDG9(C#Tgl?s}h zz;Fi{b-zu;{m}Z_DllNcilbZX#js5}3R2cr;Or^1!o_~0eL`0bU@c(3M=Lh7Kd?X2 zU+q)vGxzUOTYxRp=-bnnfz3De5A6#VM%tHj^DS_Qy|$@B?+#s?Zf^@uEX-pIsb#|VS+Qd2aRV{AO4rcQZP-@N;-_X*P^ILH!mF;K02~&lkd6(-o z?4lonF+Nfsw`d+gjP|`};I4ExCyqxew&4Vvh?8(KPQj_T4^Gp5(0=Yego^gnC+?Rf$m!`JMGh>i;68pxbe{sNLJ^4Rq-fkW19X1|M!ey}Q zFom(=scZtChNrWai)K+nmDbog2!zG1kbCa0+UN_Qe~!r6TQ2w#QQFp03IpL7skgRh09Ln!q2 zI+#4ilzKG&rW$?tLeF)&=C*qfr07k3J-z{Sy!HsK_(sq?J6$+{Zw9Px!M9S4unN|P zupwX3bwl1{j{T=+$3L`LErKY?3f)xi)!W+#_QwMPgMx!X!@?sXVb^-*n9@!Mg`f-* z9Zj_WhZh{$(QoKSckGRD1d1-+sre0pl{jHVUIrR!Ny!j6#8BcK4eLC2I}CL+(sKsR zhI+7LH9}R3=x&a_2)4DSstZgf+%9bbgWc!~=X}7*$g_PpSu#Y=c35MBJ0H40uUZ1u zT)k}ikkF8ZHIqfqSOF9qPBVMK86IBqvN5(BcG-Hx#U~`f=6Y(*z(IqHM~)gju2eth z1;!^hB}5Mih0_y4?gK*MY4DStm7NyeH?wb6_#`NAzubCT92}vqXBy!ceR#Mx9LFk! zgY-@Ce(uw~(Zdy8R5)d`;tIBwtMiBk;6?;Y^X&VX&5nz-95 zsn-RzOQOmM~H)m z5Ypf=giLr4Ar~G)n8wz_LkCW_8Ft6FgBtu0`y?oshuHVoPcVZcaWsy_@wgbzf?e@O z5S$m_%ke5*lC|%CPt?B~pZI2ith#vGfNuj4VC)-%_}PRv;MY~ys51!~XQ2KU-7bRJn%W!Pb4N*Cbv*<(?1$~a{q@~3z05{p zw8%z-K8~LO>pFe{KM6+{o+c=WpkRVR2nyYdpT*DN=kW^!g%Pe7;erU4Puu73F81Tj zX&j)Z!Sv#l+j8`f?$3;IU^IaZ#?s~n+7@RT6}p50Mo$|fk6pne1mAZQRl z`2-abG=!j`1Pv!>1VN(+8bi=Hf+i3&k)SeyKtGs9&|gP0%KS z9wz8@f<7bY7s9H9jU;R~VMh>l7GWFVSt7#TLfE?q`y^rCChQ42>z1b-#|lQ+ZXwqKV9S#6j5%Q{Etlx9S6Dkxc{V>ci0L#=N6*p z7FBK=_YZRGVn{sG>e@M*NIjdFa@)Ya&Zfgq>Dk;od(q?cG~>!`^n}Y_*g!kd^q5^b zpPlPtoSkbo!j!m;M7p)Eb3KyvJQK=oWB*Q`dONi*FP(kH)YJ1nx;4IgE`9Y}KxX`N z1Ues{>(l8=_uR7e+)~PIQ~tV6-E7HcZBD&$&)#kH91ZZ@r`$H}A7|I8K2D=@qbusb z6w=tee))QaeameV{y~Oa5Fb9p4mh_v%GTK$iI`>-{_mE zdJg@|Z7}ZsN?7~}11f1B1dCob8Q8j9I2m656r;+X!jb<(({M?i5|$=Guh~r z@n4AZN75}5Q@@zo&@%;OzZM9g>WLUXv)ZZ!e**XLkfN(~xdp$1H zvnctS^)R}l0v=O8^Y8AN5IvKT|7e7cb~HBkp&xWf@@Lh!OwR$fvP%AbOL_J(&!vJ~ zsi!}-+*a{-(l?r>(^32G>cYA5y;{$Ae2=zjJBFl@@0r~LmKit*y_c@n^C~U3 zjsHK_@mzEGEqXqa%59~8KcBxfdEc(*G`UB;_V?s=CmG(oB{%E&PVG^zb<4NQ#B|mT z_RdP>c0I4@J*s1OLe5F1F3TxQ-RpRlp6|?mG$);{7tfx}y?Qp~J<|QVH6>lTq`IGP z@+?8Q`?)7zn~r;cdyspGdzjnHJ;FW8J;v?h9w(@Rpg9Cp5>!QyouF!h<`Psxkb|Ik zZQPUkh8_2;zG26`$iSj=zP@8e&;otSj-bZ#dv@+84pW`~;+`G%7VOz^ZxdAO*|g){ zJL{&M(aT4;PhrE3`-Gr67Y7UO`krmsabI!A=vJGVJF0z6P(v$s918?3q?>JLY_qxd zy0~xM2M~>1f8c(0Z`5%=X(tGBo+Gvq;}2d08hM6CJj-LA<9Xi1n|TWlxi%BDh@iy; zEg`6dpbH3EN)T*;EFqGDsSsfCFd2D@9&{9#K`wbevMA$Rg}usbHq1d zT*u!|sl1-QfxnTziNBe@g};?w&u`#wBWN>0TL^+G-a*hdg0>R`8x%VT+DXuzZTv@1}Am}hbZxZwtL7-T_L(sczrc512Q?8DqX#mCXJp;!N4IDo?kK=!U;|Pl5NP^xs za2!K%9E;}BUxGf+R=Pg`M&9V@GSd_a;$(t8a+#(Q^uHd0IMXy+2eF)j_%UT_4h8YZ zSwO@_W^+yRbPydB#81x=$%xTlT1r7&XlgV$O--g|(<0Mi(-KpQ39|Z}pf3pelAx~$ zf-)Q>=omrA34)|gwwW&UfT(#uyo7>y$^h|O1H_-sgZLkScr67HRQhiW5N`kwL2GjV zfSRQLEH!$0gXwk(A*f*Axl9`g`o4z{ZZ_SaL%5Yf_ya7LO`x9)8|c-LU+d(%%khCc#^tU@sa92Y{wZn2Cgr_BPz@DDR%MrPIwRwgrV zHkr+43t_EiwfP$JwdQr^>&(}iZy;dmseE4q*!n2#X8|ho6V=KY;Kq3gIro78(%V0}!5V ziDLBgL*~5{!-okw#ASYju*E&Z@Nx4~x-@)}O2eU)sAniq!@3b=d&9`vEBkXv> zP9SV4VJEhkKlD&|#6#idl)^~{g_8{mXPl?-KcEmE*mIeGAZ(dI;m_x$(85?)pwI%E z{S=o4H2bMNqtIfuh;9nu=@OuD8W3fXDTUL!QRrn+JWyG@Ec)Ym7I<8burtpQ$%qkX zi2)2PL6%@kh$Yk#W(l`MSRyS^7MP362|Jsx6@;Bb*h<1y5!O!FYQoMXY)zXbR>#ni zsAFhJr5HL44CfmdHk`-s-^b8005G(`)HKh7p(Xz>FdSwnp%@M)Y^}=z=e`&85W_K+ z@j8a%D28>Es8Wg{>}sF6`xiLTfNF|mx_eHxOrsbsJVzuWMunx8VmQZAX{oZH*AuJSODPb>cvn=pnxX^=PGsSS3f#Grk!xiT- z{0}f(K{339uooE^Uj7#tuCZKAFO!o&o_pLu)YdK^&Od))Ou-CaPZxZ(U9zyu8Q5sX#XD~KnR0l-a?*0j@{Q$N%XgOVEk9U(wERTaTM4_Kup0<_ z8)0uJ>_)=62-`~7O@!UtX8Fa#;b~nK3M}Pti^1U?hAiB99>aehL%{|Z3SdRs>cLR( zKDR6sf`kyjPzWaMHkS}e*zG;TP>2*_+!zYc6vH+kN{FKv?&ywT4DvuFBny4q7z(Kr z!#mFr$%v693@OY9HEM02nzlqE&&w$ zM|+5&L#PF!gn86j^B7obgay=Ev+r!y8lOD|R8C=$j$t#!@Cl0H0?O{bZtNN{E)*`O z7%meo5|#^^K!l5h6~ZOLr23y9j%*hdACN?4dZ`OL06zalD`6_{Q0A447lP$iVAS;c*?v zeH6&ID3JG4Am8{?AfFXpr$9a@JTJT;yePaR>=#}ZUJ+gupgQjm_FclhM_4f8d_dR_ z3HuRY|3}!5345eXIN$;Du<$194M4s_fu!dd;Jr(P{hY8zwaxUeW9NDN4|x27^7tiT zKQ(wf3Ouqu3diZM_8DP6(?6ElA`Cdb6Mmp9eoxphT*8lp?cv*(gkOcz6e_duJDs7w z0;oiWLiKewsJ!@>qVnUroB1SCb9=q2_NdyC$pkLWA< ziT+{$VNVkF6k)$1?6-vdj<8S{uwFr3ej@D8ZDNp)q!^}8)nXJy@)rZi-#k+_M(2tA z_lXqy0+C`mVSn`yDQ2B}sul-`gMdd7>^{G{L{P&{_e?g5MdDC5k76<9@efMWaNrR$ z-Ff7E4X8$o<8%zi0*079MEaA=rZ`J17iSa95zG^8A|Rfz zg}{>ySR_~?SSDC$6X$p^toC3y4=}{42SaQ#F!VW(;eUYP5{h99!Bzvq3;zPc6(YRl z$|YVxF!%wwjNo29#Bh~(m5$+Rz!3MQM6IP5dUwaroM}LHod~bOhBwfOH&6_H&k@Op zu|eEMF}zK@UECWxLMpHZWZq!*q`74f&&Q-A~=}f5Q0Mq4kI|6;D|O6-W)^U zizwdd!EiUlFw(#<+Q2a3Jcj=PhWjXnj}shaVEEKuVECfApJMnD!7(oJWrAaSh~ewv zAsxem6vH@5)M1JtI5s=er0tt-K=rQZw*B-H-=`SDJHG!kk`dz*@dU;2Q}HwLbMXuD zOYtl5Yw@UfOgv6-GQlYXrxM(U;535!5}ZzO2EmyGXSInZJs5uH!SE-FVYY!`u7Tme z^BDg77)mCr zQl^wea6Z8W1Q!xqMDP%TiwPb|@Gydh6I{|J<>(kn{dEkb!4$(028N>y49A_v@ISzC zG{tZX!6OX}$NvR}Q>1AW!>I(1c1hC-9@9e%%cVJPX(&}tX*d>$`m+bA45DhJ`R*B6 znnxKN--8$nr3)#8jgnJplA5JO(qd_e)FNFVEhV^=;E4oJBDjp;$plX!7^*OhV5q{3 zHffoML0CxBN2jDqDT6Z&2FncwtIjj{A27I%GI$-qvkV4r{0jzelQvQYZzp)ROL7rh z(L)BeNZWJ<@1P9Mp;E1lO0~*vQq9Xe&%kh(bdQeVZi=D(9FdF|4@yr_3?Gsnmi9`I zNRLX7N&BS7r6;5(37$)E4Z#iquaCv^3A{cQFCe&%;Cg}^+N7sF7(Va8a6iRxp@Ctu zfuYAM&H1y~|K{`e(mNExcL{DZFa-A~o23ukKOYn9H2!Y_L!y^0$ms3Qr7tOrUl6>= zC4EKk;vT|yTso!0c#^`ngmU#Qg|VeOjG;dmnf)aFs>ApTg>mUQB6(uSNR|OcnU%53 z$-Hcm&9X%nWKos~UPkam1TQC8BbX3;F~KVchUM0!1Yg!BD>{s_m)uM4&BVw)6voR9 z7_TIFEx}iV9T8u1UMl|kQc;cq9OY<&S9)-i;{ZoFUQVFD1Ybe$D*Y31oM4MJ`a4Zd z2OMQk^;f%OQ1!3s8IE#}+z-f-bE%rR2Gm5;32N7t&Y~tp!lJe2n;TgX6BM|ZunLc(ew-D@d$)JU`_K?Qqvi{h;Odq?)n*boM_#T772Y^A#E7FJb z7mnc2dD{Kif#G8^?7q3=eFWdztawPP>Aj}ZJQ!H*FP zeiNAEhK3&(^~mmhmeDze?xm*UpQ>|3Do6LQ(vc zVB_g}`81uQ|4Rp8i(M3hcbO6br#Gx)hP%mwJYyqAFfMmSUxI zG`#kqRp|wf@!^-@5vuMyibYX_JuiK*2}Z_&3LFIjBexPv(R>{qrBZs)2e9zV-4ZaO zL@D63wM~guVw6}VPKj3%ltd*-NmjtHc#z;j1iwM>VS?Wz_$`9pCioqK-zE6HHl>fw zrjjA|QnHvB1?)Tozi&v%|GD+Y&nTOppJ(&mXHzK#HWje5ec%z3N(r#3j8I0>UxGg* z_#^!j*qm(}X!Q34Wg=x0%q1VY6i~+CarvG+VyaA4W>7Y#Q8quJY|f-+#!t_pKYDpr z*rplTRVj0IBC9EpUx2VwW>N|J>7N3*Kv_b8tW)Zh24$hrs5q4-rCC{|EG8J1Um&NC z5`2tc7#Wb_NrF!i{0+h1wka(hAeZTyqe3W<-x)yuU}%nXTN>UheSUTQZ_e7vT8iV< z1b=Vf2v(nSJyxaMqO7MNf-?4_OW8p1Pdxxt|4#5}g8v{KLpVe@mT;JG z9N~Dvnc9?n9tNM%RY&DHV30F=806rIZ2br~XFCt!e;^azpb#D=oW+0;p1>K5KoyG5fMb7ISk&GC>D!)^ARHwk7gG)J0xZdC`K|g@5B9&(nH>s?ORRGYNa6W_s zch487X4OJV;zzhZD(XVPEl>HlQ6;4l%ZrDUOdLC*ytH^!anZz*v17_d7Q-uEy9X$q zGOhr;A{ha~yQNT8Qd&|ts(1n zd)YUsKGZoqxDD!Xb3>i-B!}mvpbCCOf(aMes)necgbOEJ-!6_L z)F}6RRylAOm-RPZ%G=>-wbLtU)p$LvuyWggzfSASceZv)($iB(Y8rS;QIpjaHC63H zxCp{U5-y5x(VNx2YPy=CW)d!jaIu7oBV1aCw-m#hiN4Sp*JxklsBd<9T%70^-R`N% zZOL6cn{*97v7&LV-Qz9g9Kj7QFowSu!=W0ukJ0_4bS+J}Cr9wb2aX4vdY0hD=IodK z^vi|Kj@qhmHQ=AdFmf5aHsrrH9l4@caw@f7L>@NFAaUPi=n%3E`3mmq@q- z!h!pQf7Z)U14h^Ja+6x7PNu}4JJ>n>)2UO{X&$$39=K+zb0}Q1)N*yUT0yvU!etN+ zfXdpeR;pF1U9BcuHsNvzmrJ<8|L?)2JNh{*T%`{1JzqEXoXro-rMG&Qz&cm;l&c29 z<#p!DsWz$2YBAvk5UxMr`nhTPKaFz=)%8F6J}}0B>H>8cg=(aFArM8lfvxIAEC{VZ z;QKnMOdpPCFSe1uCF-SJdwHdLB~9@Pbrs1kaAo9zfQR0HQi^X=%Mx&brX}gO}$lJuWnFpQ*T!{sxGyaa6<_< zjBvvVS3Q?m*b(^|fZBus;ZVchZ5pDwEN(ncSaFYl(m2lH2 z-F~{juvbwRpdFsloztCeSJLzW&Kn&7{6*7r}eS-S>4G@2B(Q z1B4q3^CJk#)IQ*sp`;QVf>bm#IN)D!FRKUKO9MVaxbc4;5QIocVM&q4J=IuGW*xPO z%CCLgZO1o=dQydLOSd~nPY*n+J`b9O`W)fPTiiYxsY)chzrU zy82H2epY=W_>8ny>5c-OgtHTFuHL0TQc3g^;i|Qz<+fDl`pQah!UjH7>l@*vQt%0# z-)DMr9r#gibXL^PoZjh2pJ0Ade+Ov5>8VGB8ms38n$%|Xw4qC#^}f3VRtBK5BEmV` zQ2Cy{2!Dl@r^l@(tGP>$TSY5uM7pdJ;TE{83gPPhlqRcJ2Tk2svie&6x~3dx4F(0> z3hG~@%NjyBrxraE^ik@OQ}+q!c5`bKEYh07__kT2tkKpOYpgZS8gEUoCR&rMFt;}o zZV}-Y6K)CNS_lU!@>0TqgkDCti`uNIR<}vZnr_XoW?HkX*>vr;oNyXlz7dWP?qb5N zAlxN{yA&=(PX%YWpjMR*842B@|2+isvr0R7!)U4oPf61p&f;3fT*n;hkkq$xh!W>y zN248l%}_bio=jOqqobk@-1l`!&CtTY^Q9iL034P$n!v?fb0ehdxv1wnv|@pywgoim z&Y6J=1Urbis_umVX#q|)o8U%oM?+0LxR-V;08c(m^^JYAQqw^goN@JRR|ZurYN~Qq zJLQbf{c^LjGl!&QWu)}&o0pxES&-W|rC}ZgzQgW|?Cg z&403ETzyqua$ln}M_S=UPn)fytfQ@CtROWnC)`THT|u~2o2}!m6Rf3Hko;E?ZZ+Xx zE?h&A^93}zxzh&3H!aOJPak@-P_Iqaa_ej>2)wm~yPj}2wfhRTR#|Ic8E3UytF3bh zcQxUzA>6f_tPbluE6D$Kgu4#vNUIjxtt?%#9@proZv-ch<+h}A2P_1Qz0}?S?wg^f z%WVng4z1_mb_yJoukQ>q;K zXhBm`qhn5UlijJYnxNsSrOhCb?J)Bl^zl{w0)o!suh!+Sajrmc&1(VoqC@NJnht>* zVwL(KhVRr7E#y-@w6+3#ij66y@+m4mR&Oyci%m0WX23HQ=KNZFX^RuIkVz#pkwS2R zetQNpLX@JiLK(-1dr9=~Zq`2XxMIy_+l8QOtO7 z3_J_m{LTkAze|~w%qnIzvxd3J?Hu+V=04_r=0WCR<`L#8W0r*b)2(DpAqX}p(Y#qD*Yj@m}B? z*2}Cg+F>-@Ot@QMKoIU$!mZyb_hL?4ue7daPBUPJTdRT2w}EiCYg6F|>KS=%mM69} zfUx_EK;Wba0>zy>B^t=>`S~wHPISTh#T z@z$HIw?K!}v|Ft=(}iNMso)9L-dI)95?;|1-Z!UTTCOfpHh?<8cmcY`>jZ3ce>g2|*lkcTIo&MH+6v4<0U?Q1hrZ3Zv84RPcjG4jA5*`*F zhet%;5Izz<7mfkMQj#wo+#b$A_*dksi zUL|Bl)2tCZEs8f6QZ)ek7glwXuzmEV-p zV72U}2C4C2BgixTq$;aX&`p7=2kIg5+XSmNq zABWF;pA|kUeOx{}eD?V4^Lf$d4WBoC-u8LN=RKbfd_M9yM87h>i~L-E&-#7l_pQI|uln2kd-;3&`}+I)2l@y5hx&*6NBT$m5A+}GU*KQl zU+h23zr=r}|7icQ{^R{i{U`ZP_OJH8$p2dZo&L}Hf9!ucAS56;AU|MIfFnQ)xFTRx z!0LeO12zZj2)H-kk$^`7_60m2@JhhJfI|U?13nBm8gL@uRKRxuKLq>~7#tWA7#kQL z*f(%cU_oF};LyO~fg=KI0-FOb2)r=xqQDh_mj+%QctxNq@TtJp0zVJ@GVtrbV}U0E zPX&G(_#FZhGt&x5}V{yO+r@QL74A=Z%Okg*{(AqztqLz+UCgq2e}xjE$4 zkX<1UhCCXwFXV}kr$Sx}c{Akgkat7g5BVhIvyd-Bz6v=S@=K^WG%z$OG&wXcG(WU3 zbV%sX(9xk|L&t}fhE57C53LEE7rHp~g3t>?mxq$j6`?nVwuWvFeJJ$F&}TxQ3w zhFueOL)cAWw}h<^+a30F*vnxD!VZNU4tp!?=Ww6!yzr6Xj__sSSA^dYzCC97jb>W zjS-t8c17%ocp&1Th`kX9Bi@VnHIj)8i%gD8jZBM7kIakgA2~d7MC7Q*F_9A^DT8BAkrts*`Gx<|Wl8wInS~T9&jtX?4r-w|aiwfd*_!fT$`dKCq`aE)TFQZx4^zHP zHKhuvy;4I{qf+~%=BDPSZ%N;lzB_$i`m^aTr@xbaEd6Bqx9LBm|D66?`X3o=2A^Tc z2+9b_2+xShh|NgINY3b!k)Dy2k&`hdV}8bxjI|k0W*o{mm5DP$Gm|niGjlTgWe&{D z&n(Ftl{q$ZLgu8*$(fgD?#}!=%Qq`3t0rq+)`F~tEN9lDtd^_`vzBLFoONl|%B(B1 z)?{6ibzRntS+`_u$l92-DQj!i_N<**yRz=d+LQHQ*50hgvYyC#I_tTt7qhL|y|R6> z{j-CzL$f2YqqF0(6SGsY)3P(Nv$ONE2V@VvM(#e=uOgfXM@<4wyb*)_~mu9vkrZfF}n$GthTn)WDd5aRU*ME=tS{sl1waRmtl$pse|tSz{v zU|qot1-}%U3xz_dP%W%3bQU%jE-t*F@Popy3y=MOHJ$fY+6TkMv-fEBYL?l%8BN;k z1VIEDg5Q7$B8VV@2r^^{B8VVEhU`6!VAAZwW;JPc(%3X+@0dMmrZKDO+jE}t{&MgC za6k9lyYbb=w;(VG1Ihty0_B1{phnOE&|%O~&~eZy&{@!V&;?K%=nCjMr~~u{^bXVs z>H>WReFc3>@0Q*(y?1)w^y%rKbVhnz`quQe^e*sd@Q?p7&^&NHm;x>Yv%x}e1y}-> zf#u*Tun}wq+rSR68|($|10M&U0iOf6g4@7Xz}LVxz|X*M!SBGGkRFh}kp7TCkYSLK zkkOE_kXevrkW5Gx1O>rB00s?g&}wK6)C4s{{m=+B25p2kL$^Y=Lw7=tLR+B^ppT)? zpf91Xpl_j_(2vkB&~KUDGe>8R%bbuoF>`WeTIP(**_m@Q7i2EVT%3u_EX}lL?#jHH z`44O=Y(0z&tAuG_I+y`wf;nL!SQHkAZH6Ub&9JSo{jfu@Bd}wzld#jUN3gfBF4!m7 zS9o`LPk0}AKlm8e}n%HKMp?$e~{H9Yi1TSi=Ac5+M9Jb>pfx^Vmx9Z zVhSP+F%Pi}u>!FYu?Ddou@RAufFQ7lO^93s5kW>!5DJ6=VL{js4ulusM}!a&#CF6k z#6iRvL@VL~q788kaRYH1aTn2n_=5ZnIRZHvIS%Kf_>>K5t_>IJF;^#=7G)rI*(F`;b z%|>(3aDLPyaFbQ8K6{R?^rdN+C>dO!LQ`Xc%=`YQT5`X>4g`X0I+{Sf^G{S5sg zyI=OKYV?KISpzDdq*{HRdg*6Vrw5gB^jLjh%;Gh+T|b zhFyVOiCu$Tj|E{N*gR}Lwg5}T(y$CH6U)MuV!7CItN?4pZpU82e#jZ0vp$EGqt1!u z{FZY%=Uh%}&V`)oIqf+Qa~|hB&3T^lGUrpy*PMTW9zbuPFEAZg3@itJ0#*U*0T2KI zpa2da01SW)Z~z`40wh2spa4vO7uW{u1oi+ezyaVea1=NWoC3}Q=Ye+M5%2_f2D|_| zfY-oV;62a^!j+yg(xuWw%eyqS66JZ7FDZ(H8wyidfj#1+IGB8gZ) zEF=~YIm8O0geW7*iB-gEVm;AHv=d!KFVRo@m3WePj@U}PK)g)6M!Z41MSMZ*Abufr zBlRHlCJi7BA`K-CBTXSKAZ;XpNl+4;gd}B?a!5E5fkYw|kc1>LNlL0DDM-~MHAzF# zlJq1ash-qKI!o%v|1N)7J|SO`AILwLe?7lF|55(a{O9@a^1tT)OYTnYMealHM;=8U zOP)ZUM4n2XMqW=wkTK*OGLB3n=aVVqLUK7-K&~d&l67PQ*+RCF9b^}|k-Uq1ntYDj zO8$#{iF}oOgM6EOkNklAnEZwOt)N>$kAhwWeGB>*3@jL2@Lj?1f{_J_3(y6E0%yVg zf_s!+lxdWW6f&il!lG~}T#AIEqG%{uik@Pm)Kh$vASFVHQ#MnQl#`S;$~DRj%56$J zLls{>Pjk#ilG8jJT;G+Po+?4R0g$#T1r(> zHB>FNj%uLRQ!P{*)lPL$JyajHg?g3xrEp^5hC)W6p)gf=rtop$tHQU1orPVrZnXZi zL9`*XVYCsnQM5GL4BBkkJlaCq4>SagKqJ#AG#ZUbW6?M?F0G2DqM2!Snv>?C1!-Yg zjFzD7rX8hSpJRi?8zL&9K{^V9M7D{oXnicT*zF^T*h3%T*+L`%w^Jyzm{MjX)4;4} z`j}y6l$l_rm|K|Jm^+w9nCF@8%ty?p%oofK<{RdFW*74_^PiG#C8J8lmW(g?zGPC# z)RJi>GfHNa%q^K;vakeRQc_Z1vc2R|$!FFi)*2R(C1I&p8kUZwXEm_=tPm^0inAJ7 zO{_hv7S;jQVb)RBG1fiS->kQ+_pC0~SJpRncXm(qaP}y68haLd4tqX(F?%U{Ir}Ge z20Mq%WV6|2>~gk{EoRHu3U)QShOK4$*&%j>9b+fhP3#nV3;P%L4)!kg9`;4{o6=FG zD@yZ9t4kB5$4eh@x^en*262XRhH=Jorg3I+W^?9o7H}4ER&&;IHgdomC||A*~+rjWoygw%A{q%vLj^=xdXThxd<+sTgSC= z9b7lp%Z+ijaJO-Ha`$jsxcj*Wxre#uxUJm3xR0u zc(Zx)cnf$ddFyx^c~6yysE z1ag62a7559>?52nL<`G=^}=T1Zs9)Re&Ipk31O@7FJYVTitw87hVY5-x$tk{YvDU# zr)aonvS_+!rf806q38$EQqhm1bWw&VN0ckd6XlBvMMa`wQHe+*sulS}K~Y2$7i|`$ zL|aAMMY}|MMZbz#MSqFfM3+TZMK?sZM0Z5@L=QxdL{BPuRZOeMs9;u@Dt1*|t@t1w zC0-(4C0;AuAO?xE#DEwtCWuL5vX~;~he=UC}|0w?~|406>Vu)gb;s?c2#d5{Ziq(pBij4}e z0;+&3kcvVDT~VwkQLq(d3Z8jY zr9fGstW+wL)k?L}rVJ@}EB7h)D-S7;D32*mD$gkYQ2wdBsC=S){@+u1hw`=Zow8He zrTnD)s{B^nt$Jeh>gs}ORdr+aAJwl_Lsbh^a8-^9ry{6`sv;Ff#Z&QBB9&MrRcTdv zl}Tk$HK-h_ovPnd$5kg)XH>1K3#vBNWz|E~6V-dwC)F3#H+4^SZ*@QQ0QETaO!X@D zTJ;8Xx;jG*QzO)9HCDYzovY@kd1}5|sIE{;)sw{Fn$wzdnpVwUnoF9inj4zintPfD zn#Y!i`J&KYn|Gdwo#kZZqaVj?$EYsZ))#pA7~$GpKJftzS6$Yb<_3N z4b+X*P1H@+rRiqr=IG|@7V6gMU^=pnsw>hJ>sUIDj;9moDs)nvTxZicbS|Ao=hFps zVO>-g*KO7%blV~y*HzT{>h{-NulrEN$F@p05|{rFyx(N?)({>BIV{KA}(Px9GR&cj%Ak&+FUu zkMvLVFZ3PyH~RPbF8ycyKZb6GQHHUG@rLgWlMGW0(+x8XvkmhM3k-`4Sq7HDY}jGA zZ1`fFY+P$38Kp+GvDR2;G#Ks1fH7>085@mBW3#cvc))nrc+_~@c+&X5_}bWM>@t2f z{%h)P>SgL<8f6-5nqiu2nr~WUT4q{q`q{L~1T*1GY*U%3+$1!KO)`_hRBfs;X-#@l z$P_ijO^v1|Q?uz8(+<-v(_T}HX}{^J=|lba`qlLX^|ke>`ZM)U&ArV-%)`th&7;ke z&9lw(%nQwn&CATo%|Dq}nlsEWGs28EW6glM++1a@F>B3r=6bW$Y&Sd233HQqhk2Lz zi1~#1l=-arPxD3dW%E_@WAi&pKg&SN5X&&jNXr<@c*{h~6w5TrOv@_ETFZLNMoYRS z!veD)EGP@cl4IFq;ahB$y_Rd1uhujx#9Cynu|}*Z>sIS_>rU$d>v8KT>sjl0>jmpY z>m}jUd!>oe<1>nrOU+Ys9X+Z5Y0+YH-W+XCAn+hW^#8^{K>VQe^Cu8nA;*a~fQ zTd}ReR%7$n{I-xSYD?IfY|XY`Y&&ebZToD0*#5NrWoxrtwq3K`u-&rVvE8>lusv$% z(J-|E+`wosH0)@&-0koHw0!ocEm%osXSQot@5)&M(eyuI{d$t|_hst|hKzt`)A;uC=ZWE|3f3 z0$fxV!^L#5T|5`xC31;fT9@7Ba(P_=SJ)MGZFB8){pvdC`ptFHb=q~#)#|$7dgC7M z{?WbGy}_OC&TymM*>0?x=w`aPZk^lV_PPV^ush*yayPrTy7#*ex(~aLx<7gPc=~w; zcm{j2Jh>jKr^r+6VR<;73Xjwy_b5GTkH)jd^UyoOyVeVM%e-Q*%&YJ!y;iT!8}vrJ zaqnjDUGGzGr}wk>A73|LZ(m>E0N)_rNZ$nC65lFco{#EN`P{yQuhF;Jm-OxR{pS1K zcfxntcg}aochz^pciVT**X|$g-{9x^z5X5kQ~nG7Hvbj>HUBgJOaCkXTYqO@Szt{7 z7C;3s0U$sKkOJfYB~Tnt1PlRVz!WeC{DDXy9@re%64(~l8Q2{-8aNg>5jY(j92_6~ zJ~$~jHAoJ!gYuvw?ChIcN(yf{npsa7%DoaA$B&uqAjPcsO_@cq8~Y_$f3p zlot9ilo0|#`5{V(7Gi`HA#F$>GKDOm&7o7F3!&SgJE6Ow`=O4|o6!4ESLk!-Yj{X_ zOn7{FVt8_RYIuJ5=kUt#s_>dHESwk44^zUlFe6+NE)8?T{BTWJ8`g(SVN19n>+#3(X!|_ z6u%OGlNgj(mjEZS637HDk)NO>XbDDwnGhx931vc^s7;s>mPA9snQ$kLCSEm8Xq?_S zvvFzT%EmQ~>l;Chutr29x)Iw5G!h$&nmA3oCPkB>slLhDWN&gcd7A=Fsiv(>+nRPZ z?P=QA^lQ_BrhCcW$wkTBBsE!*0#C(kC^ zl2?+~k~fkMk`I%Qldn?$oua1trv|2mq=uzNrpBbkrzWPRq|#E0Qj1edQ_EALlsctJ pX;b=?E9FV~Qo-f{&10I!HBV@s^uO9lj~@T?q38eS|F6xe{{uAWCUF1& diff --git a/Sora/Views/AnimeViews/AnimeInfoView.swift b/Sora/Views/AnimeViews/AnimeInfoView.swift index ba0f9cf..d0b8ebf 100644 --- a/Sora/Views/AnimeViews/AnimeInfoView.swift +++ b/Sora/Views/AnimeViews/AnimeInfoView.swift @@ -52,7 +52,7 @@ struct AnimeInfoView: View { Spacer() - HStack(alignment: .top, spacing: 12) { + HStack(alignment: .center, spacing: 12) { Text(module.name) .font(.system(size: 13)) .padding(4) diff --git a/Sora/Views/SettingsViews/SettingView.swift b/Sora/Views/SettingsViews/SettingView.swift index 7950eec..f09b18e 100644 --- a/Sora/Views/SettingsViews/SettingView.swift +++ b/Sora/Views/SettingsViews/SettingView.swift @@ -49,6 +49,12 @@ struct SettingsView: View { Text("Modules") } } + NavigationLink(destination: StorageSettingsView()) { + HStack { + Image(systemName: "externaldrive.fill") + Text("Storage") + } + } Button(action: { isDocumentPickerPresented = true }) { diff --git a/Sora/Views/SettingsViews/SubPages/SettingsAboutView.swift b/Sora/Views/SettingsViews/SubPages/SettingsAboutView.swift index 654bcce..151be451 100644 --- a/Sora/Views/SettingsViews/SubPages/SettingsAboutView.swift +++ b/Sora/Views/SettingsViews/SubPages/SettingsAboutView.swift @@ -13,7 +13,7 @@ struct AboutView: View { Form { Section(footer: Text("Sora is a free open source app, under the GPLv3.0 License. You can find the entire Sora code in the github repo.")) { HStack(alignment: .center, spacing: 10) { - KFImage(URL(string: "https://raw.githubusercontent.com/cranci1/Sora/main/Sora/Assets.xcassets/AppIcon.appiconset/1024.jpg")) + KFImage(URL(string: "https://raw.githubusercontent.com/cranci1/Sora/main/Sora/Assets.xcassets/AppIcon.appiconset/180.png")) .resizable() .frame(width: 80, height: 80) .clipShape(Circle()) @@ -93,6 +93,21 @@ struct AboutView: View { .foregroundColor(.orange) } } + HStack { + KFImage(URL(string: "https://cdn.discordapp.com/avatars/1072985316916469870/6bc6c23a6f22f932d23f2c2452f755f7.png?size=4096")) + .resizable() + .frame(width: 40, height: 40) + .clipShape(Circle()) + + VStack(alignment: .leading) { + Text("50/50") + .font(.headline) + .foregroundColor(.orange) + Text("Discord Helper & Designer") + .font(.subheadline) + .foregroundColor(.secondary) + } + } } Section(header: Text("Acknowledgements"), footer: Text("Thanks to the creators of this frameworks, that made Sora creation much simplier.")) { diff --git a/Sora/Views/SettingsViews/SubPages/StorageSettingsView.swift b/Sora/Views/SettingsViews/SubPages/StorageSettingsView.swift new file mode 100644 index 0000000..b901cee --- /dev/null +++ b/Sora/Views/SettingsViews/SubPages/StorageSettingsView.swift @@ -0,0 +1,269 @@ +// +// StorageSettingsView.swift +// Sora +// +// Created by Francesco on 19/12/24. +// + +import SwiftUI + +struct StorageSettingsView: View { + @State private var appSize: String = "Calculating..." + @State private var storageDetails: [(String, Double, Color)] = [] + @State private var deviceStorage: (total: Int64, used: Int64) = (0, 0) + @State private var showingClearCacheAlert = false + @State private var showingClearDocumentsAlert = false + + var body: some View { + List { + Section { + VStack(alignment: .leading, spacing: 8) { + HStack(alignment: .center) { + Text(appSize) + .font(.system(size: 28, weight: .bold)) + Text("of \(ByteCountFormatter.string(fromByteCount: deviceStorage.total, countStyle: .file))") + .foregroundColor(.secondary) + } + + VStack(alignment: .leading, spacing: 4) { + GeometryReader { geometry in + ZStack(alignment: .leading) { + RoundedRectangle(cornerRadius: 8) + .fill(Color.gray.opacity(0.2)) + .frame(height: 24) + + RoundedRectangle(cornerRadius: 8) + .fill(Color.gray.opacity(0.3)) + .frame(width: geometry.size.width * CGFloat(deviceStorage.used) / CGFloat(deviceStorage.total)) + .frame(height: 24) + + HStack(spacing: 0) { + ForEach(storageDetails, id: \.0) { detail in + RoundedRectangle(cornerRadius: 0) + .fill(detail.2) + .frame(width: geometry.size.width * CGFloat(detail.1 * 1024 * 1024) / CGFloat(deviceStorage.total)) + } + } + .frame(height: 24) + .clipShape(RoundedRectangle(cornerRadius: 8)) + } + } + .frame(height: 24) + + HStack(spacing: 16) { + ForEach(storageDetails, id: \.0) { detail in + HStack(spacing: 4) { + Circle() + .fill(detail.2) + .frame(width: 8, height: 8) + Text(detail.0) + .font(.caption) + .foregroundColor(.secondary) + } + } + HStack(spacing: 4) { + Circle() + .fill(Color.gray.opacity(0.3)) + .frame(width: 8, height: 8) + Text("System") + .font(.caption) + .foregroundColor(.secondary) + } + } + } + } + .padding(.vertical, 8) + } + + Section { + ForEach(storageDetails, id: \.0) { detail in + HStack { + Image(systemName: categoryIcon(for: detail.0)) + .foregroundColor(.white) + .frame(width: 28, height: 28) + .background(detail.2) + .clipShape(RoundedRectangle(cornerRadius: 6)) + + VStack(alignment: .leading, spacing: 2) { + Text(detail.0) + Text("\(detail.1, specifier: "%.2f") MB") + .font(.caption) + .foregroundColor(.secondary) + } + } + } + } + + Section(header: Text("Actions")) { + Button(action: { showingClearCacheAlert = true }) { + actionRow( + icon: "clock.fill", + title: "Clear Cache", + subtitle: "Free up space used by cached items", + iconColor: .accentColor + ) + } + + Button(action: { showingClearDocumentsAlert = true }) { + actionRow( + icon: "doc.fill", + title: "Clear Documents", + subtitle: "Check and remove unnecessary files", + iconColor: .accentColor + ) + } + } + } + .navigationTitle("Storage") + .onAppear { + calculateAppSize() + getDeviceStorage() + } + .alert("Clear Cache", isPresented: $showingClearCacheAlert) { + Button("Cancel", role: .cancel) { } + Button("Clear", role: .destructive) { + clearCache() + } + } message: { + Text("Are you sure you want to clear the cache? This action cannot be undone.") + } + .alert("Clear Documents", isPresented: $showingClearDocumentsAlert) { + Button("Cancel", role: .cancel) { } + Button("Clear", role: .destructive) { + clearDocuments() + } + } message: { + Text("Are you sure you want to clear all documents? This action cannot be undone.") + } + } + + private func clearCache() { + if let cacheURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first { + do { + let fileURLs = try FileManager.default.contentsOfDirectory( + at: cacheURL, + includingPropertiesForKeys: nil, + options: .skipsHiddenFiles + ) + + for fileURL in fileURLs { + try FileManager.default.removeItem(at: fileURL) + } + + calculateAppSize() + getDeviceStorage() + Logger.shared.log("Cleared Cache") + } catch { + print("Error clearing cache: \(error)") + Logger.shared.log("Error clearing cache: \(error)") + } + } + } + + private func clearDocuments() { + if let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { + do { + let fileURLs = try FileManager.default.contentsOfDirectory( + at: documentsURL, + includingPropertiesForKeys: nil, + options: .skipsHiddenFiles + ) + + for fileURL in fileURLs { + try FileManager.default.removeItem(at: fileURL) + } + + calculateAppSize() + getDeviceStorage() + Logger.shared.log("Cleared Documents") + } catch { + print("Error clearing documents: \(error)") + Logger.shared.log("Error clearing documents: \(error)") + } + } + } + + private func getDeviceStorage() { + do { + let fileURL = URL(fileURLWithPath: NSHomeDirectory() as String) + let values = try fileURL.resourceValues(forKeys: [.volumeTotalCapacityKey, .volumeAvailableCapacityKey]) + + if let total = values.volumeTotalCapacity, + let available = values.volumeAvailableCapacity { + deviceStorage.total = Int64(total) + deviceStorage.used = Int64(total - available) + } + } catch { + print("Error getting device storage: \(error)") + Logger.shared.log("Error getting device storage: \(error)") + } + } + + private func getTotalAppBytes() -> Int64 { + return Int64(totalSize() * 1024 * 1024) + } + + private func actionRow(icon: String, title: String, subtitle: String, iconColor: Color) -> some View { + HStack { + Image(systemName: icon) + .foregroundColor(.white) + .frame(width: 28, height: 28) + .background(iconColor) + .clipShape(RoundedRectangle(cornerRadius: 6)) + + VStack(alignment: .leading, spacing: 2) { + Text(title) + Text(subtitle) + .font(.caption) + .foregroundColor(.secondary) + } + } + } + + private func categoryIcon(for category: String) -> String { + switch category { + case "Documents": + return "doc.fill" + case "Cache": + return "clock.fill" + case "Temporary": + return "trash.fill" + default: + return "questionmark" + } + } + + private func calculateAppSize() { + let cacheSize = getDirectorySize(url: FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!) + let documentsSize = getDirectorySize(url: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!) + let tmpSize = getDirectorySize(url: FileManager.default.temporaryDirectory) + + let totalSize = cacheSize + documentsSize + tmpSize + self.appSize = ByteCountFormatter.string(fromByteCount: Int64(totalSize), countStyle: .file) + self.storageDetails = [ + ("Documents", documentsSize / 1024 / 1024, .green), + ("Cache", cacheSize / 1024 / 1024, .orange), + ("Temporary", tmpSize / 1024 / 1024, .red) + ] + } + + private func getDirectorySize(url: URL) -> Double { + var size: Double = 0 + if let enumerator = FileManager.default.enumerator(at: url, includingPropertiesForKeys: [.fileSizeKey], options: [], errorHandler: nil) { + for case let fileURL as URL in enumerator { + do { + let resourceValues = try fileURL.resourceValues(forKeys: [.fileSizeKey]) + size += Double(resourceValues.fileSize ?? 0) + } catch { + print("Error calculating size for file \(fileURL): \(error)") + Logger.shared.log("Error calculating size for file \(fileURL): \(error)") + } + } + } + return size + } + + private func totalSize() -> Double { + return storageDetails.reduce(0) { $0 + $1.1 } + } +}