From a762734c5a3bf988685cb9cdbad0d5596f5f9446 Mon Sep 17 00:00:00 2001 From: YamiDoesDev Date: Fri, 18 Nov 2022 11:42:28 +0100 Subject: [PATCH] refactors, ui implementation, new settings --- android/app/src/main/AndroidManifest.xml | 2 +- assets/logo/m&m_logo.png | Bin 0 -> 89994 bytes assets/logo/m&m_logo.svg | 1 + lib/bluetooth_test.dart | 49 ---- lib/main.dart | 2 +- lib/{ => objects}/cloud_service_api.dart | 8 +- lib/objects/create_material_color.dart | 28 ++ lib/screens/bluetooth_device_settings.dart | 107 +++++++ lib/screens/bluetooth_screen.dart | 134 +++++++++ lib/{ => screens}/cloud_service_ui.dart | 10 +- lib/{ => screens}/main_page.dart | 6 +- lib/{ => screens}/settings.dart | 2 +- lib/widgets/bluetooth_discovery.dart | 158 ++++++++++ lib/{ => widgets}/sidebar.dart | 21 +- lib/widgets/switch_widget.dart | 44 +++ pubspec.lock | 322 +++++++++++++++++++-- pubspec.yaml | 3 + test/widget_test.dart | 2 +- 18 files changed, 795 insertions(+), 104 deletions(-) create mode 100644 assets/logo/m&m_logo.png create mode 100644 assets/logo/m&m_logo.svg delete mode 100644 lib/bluetooth_test.dart rename lib/{ => objects}/cloud_service_api.dart (95%) create mode 100644 lib/objects/create_material_color.dart create mode 100644 lib/screens/bluetooth_device_settings.dart create mode 100644 lib/screens/bluetooth_screen.dart rename lib/{ => screens}/cloud_service_ui.dart (90%) rename lib/{ => screens}/main_page.dart (91%) rename lib/{ => screens}/settings.dart (98%) create mode 100644 lib/widgets/bluetooth_discovery.dart rename lib/{ => widgets}/sidebar.dart (69%) create mode 100644 lib/widgets/switch_widget.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1144f4b..479bf76 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ KgOXB14GbLyokO>h(gIRLD&5S`F(5tE zAkzK27D?oMQJN~wNQN_s?2 zk;{h}3bTb6P70(tIkLL1aKU;{5nMj{Cac~ZyUvYV&drA=w^K-Ibq7ya0>4~BW!Vx$ zv8ld|9;AyA>^!V%@KF_nDp@8w^{qMexlP##SM4oqdoN_gO&T69?3Sjb-M<8g4E(-u zHGfp<-Bvf!Q9LUxsM5Sj^qZ&Yn|l(WSOWg3l-Ie7=S_AT5ye$JXEH+1?&E6o-ga z2-Tj%GjK*=S<6r1khnt&m%aMs5iGdL%GE)Cg)Lm^O=f8yK7 z$J@il{2Djk-WR7uzdvt^y!+qNEYZjpqc=Kd9#+l7eS3sproSJ3NTS~5Q=&j~9S;hH&dh04AP6?JTdo1P63!r_=Wt67v?i6!-kK2)}1 zvb1sSuvKGIpsK3c^9@u*hN9=BM1OBec-XB}6; zLb5PZX~_4UtNTeahq}7v+Zp8f7J$Kuf@oU&T`y9aGAcJC5+G@Men#Lo33 z=o~#EEJ^{=j5y!|>>v15FjVwmJ}83Kr^z&=?CfNDg-f@310u$}9FIR`T|p{oW`QAe zDTYYsCdPDB6A&lx;p6{a%w`vUpfJ@EdDpC}e!%VUFgdA#d0R!nT^XuEA!3AT3|DqJ z-QN3=S+JP$H{AKqduB!JL`+FHz+;T*~f zllwH1Ah@&VGIV<0ziCdBL8B_tw&!9P$+QB3bA>?i)SrTVs`HOk8at+UQ3c07um4D; z`d-)Y0L5sFycH$0XZJ(}<&-I+N>ix>t?whBT>V|1skfS%T;GsqiHxfy)AyEvDsaA$ zyNP@C8A(~j=&ty*DO28BKV3GTAkw)gv4O?%C6qYLoEwsmIPSia{G8>|g_#dMC>Ne- zw_Z1En*xMnF!|VbzLpaaLaj@gntUg^VZ%c(jSi$nd_YM0XK~y7?T41BWSx(h>q$lz zUfEh5(ZD>cp~T^9h5XAiwCM7cDNLkQ`+r{HI|0Rx&9C)`h6mc8rzz+$6oq4-Ij?Ti zcfJza8!)QfiNjE)M3%>}dpl))Ju3uWY`b_-cQ|tL-_(C+JM|kBdPMDmUpb$z$Ws5S zmFjf6A1$muHbe_jD>@)1$I0Y-FE(elCSIsCi%Y_;2VL3Ow~rY2$PlrYAK`c33aNE5 z82%Te7IqO~R5N=}#Tfs8`^1e?>X4nq1&Vv0F{C}6-K2t`lR-?N6=1Y~R!uSk&3|N1 z&R}P=T@X zlw@yi1Yzv*@AL2ImU5E|R{(V^{uc0xw}lJs-I~`)Js*=CmD2^G{rD=5~~W z@#js9T1TYn6(1)KvtMyVLc3PWo!_}>Lm%49O3yd?SJytM_7+) z3hchlpPmkvLS-XC9mOIrXO5Wl-kHSa2cwdJ*k0qQgr*1sP}(b5p_qYN z`~E7@vZ90ACr!QZ`$527h7)!IW(mU^j9HzWz;yo)vTM`_mY$qX9h*lz0Eba)Rw z8WjJN*<18OsfukJw=(CRh{sDXBR*@~UO7gRw8Ix1XF?ze@2RASO!1L&H3GoXB*bViK+Aa|9(PlWQ6fEUNeBb}w#Y2SxkMxq#h`Y?@($Hsl zV<@-d44Uw4z|`Wu2_fb+5}@u-$yaz&y{{9yxxLG_DVyCBLCO;AMyBKnZFUg71+ov0 z!%jGBNc;MF6io*6l3efEHuA z$I4^T$V=ICam7K9Cvk)!WGT694JNe-$y$6fatXxv$Jw|0G9}R`Bx0RzLiKT021#?X_T7uR<^@V~{ zKtvs{@SKE$0d=Z89(o&EeaCG6@?Zh-`V9!(s5ABZNwg=ej} z@|oaSZ?);-uZK0I@vg-^1$Z=JsH%McADN+T4@^1d~XO2U8zy1?%Iv(hV7!n%x1W3`T##?rQ7<26+3 zuM1!1(s}ABr)IvX%crgdZQf$AblKGBAOGdX-XKPe_A~ht#^APLSe9sPK>bQTo5MiI zGzpcC)p^#vL}tWVIL4nNFNm8BchUsI54+i!%S1lJ#;gRa)o2SuIh(Jd3RY~(Ph(AUbWhv9v*HuyM+R_QKv3o9sw(%yyP!+>6CKz`)E z^Dw@=dR(KNB6|>btUmY9q(^j^GQ_j0$AgiR<+)x?HKS1wq~qR22+@ESa0|Z?TpFKJ zu!%D*Q-DtuaU(7OBnyZpyP@T+|<>_R)&r=9ywdlB0gt@8g!~qIMRm7UV#EI$z3*F|M8}&gguTS zps7DF0E?Mny8dyRDRb!@InER*^S=Ph6fvW9&&^=mTf{Oq*7}3PU2|~7KTtJ_m`5?y z-yy;D9|r2aVw=IoO#+c3)GOiZ51163E;pxw~_$E$`o&v^sy=Q+22y} zoo=$72+Qa`uu$~&$q~lif_GaPOo@IR;xR6(Z!pp~>Di)mE`rE>)MGS>IR4z|Ss5Ru z=u#{(0DV2yE6%Z!wJBcA8?m%6j-&xaN#kSdH-=gd8};rns{sB?b{>WrGgu?P`RKvH z_r~a*XHZ$jgcaM#8wQQA!kOCTpJocO%(Z8tQ6%zKCHA`4_|7K*sF;Td=fJ0qY&Vzv zv7`ca#B8E|*Lvg_?}>BEx~^V8ZqJ4R5)^A(EODO`+AzOzUJDp0b?Vr`(h1Z%AZzC3 zX%A6)LLw?%R@PLr{^a2wZ+O6W&*r;tRw7__`cD8F3Mk^?(4FskRI;$1A7*Xhb8N$v zHb2>!P8FcCt<_$hlMP`dbm&R1PJmPJH$AfiTS!@GjxpnGRU7bFd@%a)=OE2oxE-cx zw&SH_<EZ{*aRY(R>)6<~AWJ>L9l~fY7DVQ|dok#MXK|D16=_I`TmP$5uDyng zqb-tS14e?blBkw zkOzt={|^88U(hz9OnM%e^|GzFF^U_U6b^ar<~ldpa1eUtuEXxwbx~3L`)T9bB$?ci zH?*B2$vcM2kc#@(k9hAw15_EX%H7#Z+7+4gX1_$RdjUugOGtl_j_^(eQ0U^p?}ND6 z*ehVTf3dq9YHT}#y}RIry?om-nWr48Dnmq7{>=4#_GWnT7s?B3x&~(gy99(mzDrJo zu1kwwRVWjgYR_9)p;nGn@RmlUVJKrh^6mnr99G&c zOO|J`$frI{2l7K%8==lk6i$Q~+@QouT@sa*W*DOk_Ix}o^iF>O+Aa=mMuN&+r^8PT z`XinkUXAFk8|ma8Bvea~PSE zXdv)#{|gVpbTyyS({Q-KU)&lBT-q)?fLynzPgN!qOJz|JnR@mw)EHL;HoA{DLrL>q;SU!2d=PZ3=mG;2IWmna z5@SVw`AMdRFgR=c?uq7c!R2D)tuLXKgAkuFa-aH6Qt7In)%w4yDmX!ir@~oD7uNqE zfqesjy3#0~!RiJ$(fy}|3XB4{B?hQKzFoTIP|Rdroh&K}LrELmy#brh^FI?7&YJl9 zwi_HRR%NL>K1>#8>OA~`qxm@VrMR{3RXe8@PB;ofdGZfzWn#~a(1!wGhVWKsgK%&U z;YGxcDN%qXa?)nKT1ZH42CWSNHC%t^Mk*3?0L$x{smU?>#hoE(g-77;4E|_$UkcVU zSB5Keg3g8I?X-waS^m^fjzih$oWTX%@n|~% z9R;Y0fs>c5q3|jDa?!z_DOA3wYf8fPPZazjTV%1L!jkC`gf1+2A*;EX5?xUbxHVmP z_%pN6_4>JQ$RBNF{jON=#A)uJOAfU0y0BZx8opqD@zY7Il9jpSuomxGCs4 zofmD0Az3RTF8KS7YuoFj^iGy;`?ozFZ*VQ|EURCU_K*j=S$bCR&^w4c1D z3ntD;{>0t=t+=S>d;}Be{v9uoRI>&|;nn`_?m~4`Za2)$nJu#l!o(---y-nVvo6!Y z+-=aVW`(S$?kR!@o^=YJo}A`A$OBf0uJ`$`JE58zj%CDEl9jv?8hx?D0V5lxbPl#F z0EgJdB-HT6U3$<($V>k=;hfFEs-lBAh;Z)ig*$cp8@($n)RSTRZJ;89mg+tL5*Xnl zvGWs*I5$91|CdCH&%?VLAFNzKibXP<^2DC&dvyP_=F)a(mjw9i;EQ}u4L65zmu6$v zx*cXue&p@K9T%(j^xa$@KCXh4f51fy=niwpatmFP_J?r;OE zgyWAxZXSw?AFgi+VoZh0i}$eROk0+z8C5cHq?^d;FXHy|-RUfz2_W4rgW(EC@Zg&L z5*>g8!rT@8h?fNAE_2=jP}_oL4yW(pEx1cNd21rZvbO{jj(lj*e(L4*UsqCwLVTDH z6*BdH@zbbUZCV;l`&dA)d#f!quwVaUZoIWb`;5&W!w<9TUIVOmJQU1YqQgc#O%`VH z7{~GFQEf)G_&%Yj6t94}eoDUNAn0&G0#VNg*_ICZFeB#gF7=jwq*A!YHhhI{FNX?j z#WuVv-#I3$?~E03hEi{yB`bG&a$Ft#AF~>|mFVv+R#C<0fy&A% zc-Yfb{v+c~&LGZZQmRW|jP?ul^n@nizOM!|==ZG_#z%4!T)U)NVKPG`oH15jct}Ys z`8bdf4f`G}az8k{shs_e@bAozVRSB|R1BOU*zb)BJv%i>FB%^v;eYzW@h51S*6UTx zWQzezNZz%+kTmExgYefn4#>HWC0BNwdco!QmTxl-ei>>MMcB=ML_T~Xet}0#BN-FX z0kv}{-6ckv!Ng(fGxlj&%W-qM+2-atUgr)&dtL@5a-#cQV44g)dwqqNqfzX*)A%^@ zVFEtc^M28`naU`{GR7g~9imK`;)iPk1;qH!bZFo4FeRu#a?Vjw76p>?$;1Bc#ose` z$30pt0SN^05)4c%Cey|9-$Oen8fH-38uxmOJ_Sme99(H-5=|p9n-ihXCA|+Mr=cVU zbtA8zs>>Nb#J0e9`*;dC;UiMAC;Z&#`?HFqL8p29AnNU=&wbL%bkn;Lkh2MZlP^;s zr7QJeQ*_ox1H_Da5Fy~~o&|~LGx8~#G9Cc0*6ltj3j42R7y0rJJXc%81-m83u;YFG ziAQ-wQeZ~2KJmFiYTO2Zo>5hcZ#8Az(How0)AzNz=+rL}`iQ|YS6O`)Yj9e?o zJQg(6UL{Ump~!A9_l2Ilo2zuB!&8noJ*>D(U8G>NArz-E*fVzBB%~(!-oM9zCc8i* zh?r*3CsKnP<~#R+Q*+g*9%ek>rDpI8qry>Fs4*HchdN#6qIJ)hTE;u){8YIcY%Nc` zu1~acA#!XnIg@79z}$d1Ws~dy@6`+taixHxy-W5kujtyO>tC{f;hpPZCrSaMHW;9=fZ zr`E10d0KpjX*II5R(~)W4b-;ChowI3h);%#x!Xc=?$4n_yvste#Hl{^!F0zW**Aks zW>ym$O0|RVeR9<+Q{^@BWBSYjJ4)Hni0x{%o@m8}#tMku=QUe3+x2j1>S`~0;K;(G z4jqx40Ch2X3iI0}(WARfmv(I{g+Vrdw4+^m&5 zi}xt>?gxf{5yG}gzz%<4!b2z7S0WflWCQ-`aMSDI)j8TmphLILQub$q2moJ<^UpB!#*zNfSK zy2A$EmzKSv`_uAwY*f9$M!QE;_FjAJ4K|TcrC3pX*w_34U{h^ogv9~FK9!cd|IBF8 z4le2~?F9kS9etkicHa8lT4b&3e|9qUQBp-t&3b!8RM&e)4LKBjVWAl4tv8$E>xh#i?q#aTyh7aW-fF z*`%SyN0cppNO5nV&kyF63%B6CXo1Mnq7_nF>7MqxNjk1<8S?lva77Jie@=_u%B)bR z1WK!y+*q%|Z783I1yt6*r~1Ty?pswQC(V(Z?DntO`TA1oDN-(8e`BD+d$)dPd7Q{#(_}Gi2!=X?iG7;G{=E4T2E) zG3Q#*BQjbs@Y++`mYR!j_2rRuvfX)976*2~_UNUs+l0{wFNFOC}3mpmE54}S`8{&JL;1JQ#t@P{R=TN;XS9LCpEt~jEcu= zA<9oE72qbtF)U2uQ?lzhy?_-NcahaUM**DZgJV;7G*DRW_wHh6O~z{$(R7jPB??{! z9}X0)w{403&q@yc3-=B9Ku&jU0NB$KhuklvWGprcgIxPfxIc9SjFC(`f(8H|K)d8v*5H|k)Xv1*Y%mN#a;d>30Vm|48^`kvE)AIax5mC zU?#C|c~ooep{dxQ5M@Zn(kZ+Jy*1pGRZ=NL28j?(zc3z6b99-X0gg+4;?Gw_C78P1 zV|3TU^E46O_jIYiM6ArcwW$vih=^oA%V!Ab`||bsj{ST$m;O{$tr}5rYSm$2?;Q_@ z#sW2qj1TY~`p@mM_y5c!5GaR%6YGda2Io|Y<2o1<>q4~EjG)gzhp`ynU`Ma*pWok? zXdh4Y9%kIW_N1Be*}yq7$l9Ihe9GRFqUfXQ3hf7!$gQ8cWhR(x-K^>-INmtP(JT| z0*JaOs2f!FW1X|o_Q)(IFny$0?vdO5- zhlm&}tLd*9DfG4+48g%}79pqeiwh`>}}EtssDHegkb+;afq?zG(LZ$IDdFHk*hX7XzFNV?t4|GK*03nbtAKukXru($b1+aF$+%-s*rx($Qqu!Qjom-?r`c_x^Mf%h>m&z3upXat{;e zu4<#>8J^_{m90teIA2}jB$I)q`0+_cFWPlq38KiP^ zQ$2eD=tI7ES_AcfO0pIjdM+C-!s8X(c@WucAm!)anJa(zUWjMRCfDDnc zUb@Cjz0Lf@?}kfmYJ;%bx!b=zfZkaiz!8Y_IF`Vn4-nZS)jP4Nr<-S{(DrgX^Fv~v zeF`+-m&!N+diH@9Cs`0#2@quDpi+4i0{b)BEyZyfPU(7|jzdWJ?27#xJ@A%7+@qas zPirnZRg%GxN|mZA6NVdw%AoK1?6uM))VtFS4+ez(*~zaoprgo|(Veb$mI7&%fTjQ}l}(WuIv>MU=1NzxyG1Ou_T! z()8#cUy2NDD3&2_pGy&2jm}?Ti?R{IAf;78mLn3QX|;wn@2|;?*1b zN^w^kD(N=fhIuECS*e+zqSOCvv~Z*gRT!z^Ps<4_5r@qVkRv&B@f}qGxg?RNB^wV*509dL9F=GAvAtRB(#s(eclZ_NND~a{{3drToL)BV6O|KF|(* zygmC@k13oe*3mtlP_8}o&FaL2|NcG01&|9!ide_#U^{@u-HL^K|BHq{{K&6VqFd`} z&o69Rj5iQTcm_Z`nS$Z@+=$QNVL&r@yoM|{q$DW(OV%IiHj7&tX6nB}H_A10RF4T& z!{-eWoqFTfxmf|3BD}`N?M>wL$XmNzMN0uK@I#_aU{2_PaOQ0pphab8Q?|CL?`{WG zFt7IZfR?RoAgQzQbpAwhFu>;9zM*rVb=nApeDQUn;?ME<7xWSWqpLm%T^JZLkDtDc zhClZywaqAB-DI)203Bft%d^gKQ=n*Fd#KZccrlP3P{_TN>w8!oSwlvPLOXYN?DDJ7&KH?3A{3H90E&XAPPtJ-Ix zNyZ=qqjtf%)aYmjlBKhcKp#07@Q%M4Q}o#W=>l}1jq5fC#DKl8|7i89W!wnHeu-Sp zPw-yBapAyPvu9%QmERzUhEXND_@TRKbw)}C%Oe2$({KfoKK+|NrE~l+A5j#Wo!^4pWU$D(J{&sfBV?&f6#|)W0XS<|5=1swIJ8&5$?cP`3^zIp#O_S7I z*?<%lyeoa$Iy-Gl2LV>oiBeZ*KeXMq+ zCNnxUT?w_L2k#5R<~?3szPG-%Pg`eW3GE2_Yi6r}8!`?rc3p|D+)J`9}U>v`k` zN=iyb_vkj?hLS$ThxVZ_{F*@Q_`uJ(CoS|-Vjbf#3S&HdfS@0{-FdeEqYc^)40yuA z0fs(*VfNz-S#P~J^CcDHdjkozKCe*u@@ZrS0$#d<7VaJ*ydojJHvf%hCnO(VEv8XF z-C&%C%{cYdhzMUkpT(?30~p1$MLycgcp}~N?WF0bETEJU*5x;u$F=D~x)}HK=IL*P zQ|HrJBaUeS^Y-)L$?=4N@$x72~2c0XJ60p?M| zO*&D z)%>^e2B7_CLbK_yKdOHZn4*2bw4&HK!C=6#k_|U}WEqyl81?3f8PkeC^2IW@RDfvM zMIj-88|vFX8dnf)5}#Yg8M9K?P{bIa-|ZSNbExrrL53ur(`i43^Z~nmgKBX} z*gD$&r700UwM^}u!NR`m?cb(*GDun$QGH__(}@R>cc{OIAXWtJ6*;Sz<_#nd7gXDQ}mlSBWD_MG*+sK#=`Ssy+n^cU+$Nq(+2~ zVx*!K@ncsrM7lnBwP;#-c02p99u^@%&qk`pbELzjMF60x9kh+le9S%806kgcZMgdh zP>~kbJ`J2HL(jL+;jr7{701~zFsoVCZ;vl5nMEytx_mKm$;xBKvFJ}5xTanVIKoHq zMoworIgKp)cy90uxk#h)PeZUrrilFdPxz?<&}Uejh$r!!R!R@V67a5W0E6oitjm}1 zfS6oNtT`|1-lW3%dv>j9UXX!bjYk@3L$3e6Iib@Wgl-II?@c=z;A>Oomcq8Z{iNZM zW%YKPhVB&}$bcn6A(zTJOzEhT#}16T9BlE*i2_Dohg1a?frfB)h1*&twx)nVNv4W` z+7xn@R~pnO6nFFkF9-epE?u==MS1+ePt2>|zkdUJO0mQkvM{w2n;X@CmT%H!(5&n}zfhlw?C zy;2$~tIU=ZNoIzm4DaYLfTQ zckHlJzp-Q;>vn{QG8-k~LDz0zhLtM4>wo^l_!QSPl!h0C)ptF4S`cRoQWaaCU zP&BAZ!UZFO1O=AjU@Fbt{puGeBdMxSSvQu>Xg0d98r9>7<+P2~-ri+~d*uML0>E2mTa*cEoHD~r;V3s_GJkK$Z@)@##^tL9l_3DeHF8Gf-ODsa3$H`yXaUfgw}Pr=l(26gm`T|2IkT}g#E=5U>)g8a|ctHT0AGATHc zVRD4m-gd4tL~+j!DdzlkjQsd;i*wXqV1)NqtNi_`Y2KYtxVUyFU%|7!#dPXqOx>Jz zV<$c~xR^uE_Zc>TZrJmH-01f(8QD*WLcf8vaH8^Gx(NP+7)J?Pb?&kea)4rQ*G9agaC{OphzTY1DCbf2{ywddff8KGY0 z`?NfZqc&sjP4ZE>Bj6HL8;1&NXQmC9y#2MqjX%)7Y@AQ01oGq3%@WP24)20p>L}YU~|mu$5+#bO14nc$EmS7#1<7=i(Z=Y?i7h zJ0V3zi^{5-4Gp&AO*yyTOy{~ z-v}p73c=N#t~N7ATJA~5^uR!2G~-~{ne~OM`I=Tr7x$0`_2!$}@ml=|>Bsn}p_UoF zysHNuH-4u)Rh)AVtF2cS$N&w3W`DNw6Sp9R5RNW~f=|xgV2)?Sio#kN!Is z-yXJ{PSxq1HcWVpT=d*NFsuJTiAo~VQ@mV6$3m@^9vD?#a9mXhc{S`~PR=+3jC{f~ zVPAbVFpbW3pN~I+S0zlAwB#lptQ2-MJWYt(@rp*z#!VM92o2zvA>_-zH)3L9NRmHi zL-0)V9(v|f6xOJiXY^?Fqq#2gN)M(uy-WpF&()}vHnkBq?c~ZPy%S@SsKSVW%t5Qa|7}dJ)Xz8zFe8DTWL~6?lVuT zsy0;nEL&Qr?BNQo15s6xG4P-3dcfVH0o)idt7X}pQLA*WR!!AS_}`nk&uA|UjetP4 z{Q_kX5Ih6n`)>pU&iI>&1O!8m|NnTn)Dzm2HvtTA`{!LDSNd<(i5RDy@kq-gi;BLTDa%Dc>`RR z15+(~*Wn^|`KkAke~U>(i3FdmqG8OPjgM(>v$M)$CUkgx!n4fWSFy|4R>BYRo&(oC zReUfDd}mJb#dPe*2#(?6^YnTVvWO!D_Uf6~z7YK-_-h82NmuC?w|~T$gkB0`Xlm0d z4`fi*rxk(BG=QhG##6Gu6W=W1IlaafD{+EeGr6`CPm;;olx&z?ZocIcbg`jsxfWSk z>YzBrPk8&Xr8(B^Jkp-$?dTyVpK$u}Rx|->KP^hzyl={*_)7ha_cOwl>u5CU^o68k z^6rVB(!(usXR3EKDSX;CfhDg8jD5K;^UyT$6AWIuL+0&z@0pPA{j194_BTJoUq5;G z(arBkIrkLZgr;y~UUzOlW{jFVYj(`K8=5r|`r>{`q?@yqxgF z8m?AzGGE8WwQEV`}KL|bi z@X_=V6M^V~UkiO}%F7e~bHP^1KFpDs1>AC9BozqsIklmg2r-PtLSmQM$)PppF3F z9N_m2kv*?2{B_*^xO&C-HCnB_=XeK)993c z{g!5Sj9T$$RqApr=Ucyma8$t{R;Cb0ADSg9JEb8qt{izd-* zRb1jz=A?|oo6{j+A6pD4wR895qbqqf4wsr}uI&hz^w`Y>VHCEcc4)R*RwuM=q8koy z&h@TIEo_GIpBpQq%_PNwK_;b2LrBfz5x{hAmU|^7PLsXPNw&U`pz?w2>*r+=gjFS0 z*zh>qv`pB(Jh^_y*iPxWtkzCuPSyDpo->jrE7zKR4^z@>qwiOU%mR$uK4-EYAuULU zmG)~{vSWC1dVd5}j32e#?&Nn}E33HmmSgn;eXYfAPfrjqLMV8{^iI~nP(u6fFDXz~ z-w48-yu!1FdXRxYIz(Y)E$<$1^j$_sq=e~>(xYAb_tr{tu38&KX1n_ki#ei8`tu{g z5aSH@vXiFgToYC7FSnxzi6GaH4Wi>Gjz<>T$pzBI(6SaTBt{D`rOfJ>>oZAF7Dnrs zU~g!?(0*(etBhyva$#!#sVO=r%Fn>-o8bet#&q|!D~_V=uUD8H<};)tvOe&Mji!Ck zx$-(lbt?76Q?_GH^Nf-O2lMk{shxu3aKqgBd$^cI$7A2SM>x!PQcQm>?Wu+k=tBVz zmZ*Y+f<(d#5f9P=A(yu#2{_~X_6gr}GYwR!+;Q1ll^dE~f{7W9r55U#xF4rq!PwnO zDScp4;d_0?J&bsAzB7sDgiD51!0pt&@^Xiqx$y5^nNiN-)1zSmN_o?$>_VESrI{9s z90c7TOtN8l$L~yOYDYKM^9>jha?55oE}s?lU*Dt|)6o~}-Fyc~na9dh^3`7E6{IOf z(DvRdf{yLlaD9dmhVa(>-eRd<*(VF@mmoR`E z(ao+btWW$5s(5XDJzaKcTqjlb6YRQ7(!Yf*m>aPk!HF35H(XPtwFNE}xK(1*)QMLD zuMot%ITfy!$^zHbdbF;WA%4hS-?1goc{*<|dQICTFdYl1kTqUL70O^WYOc7XLr`^W z5c1%%eJ;7oF?JqVI4O`DBTOubNYsk|7|$DYDkk&H@;GQ%OK#Ea`_}{PX0u0Jp03c+<2l&VOQb=a#~yHmXEK3Y?iE0JSb&8R?!N@D1Eu`w0i*bUCbV zIq0VH-o9SyxlYTQAIk{hT0IzD5$ASoLg(G;*I$IEG=Bt#wJD1G#6Cdi2 zd)w?L>vw3@H1izL=RLhr1d@Ga@DuhJaA1u-`a(cs2DN$|G&jZ1)&P^!Qd$)nEuI(f zY4T4auuoJK8^`Fb{VLy*>OJ49jSLz?*BiU&oO(s@A+;WOeh~7#)|1X9a?)i|TdQR{ znPQfmQ+H>VpYRE1B3OAZH09ID84W>Tn&HE_!l!SLiTXy@-q{Soon8;Md`8^g)klwNUXokzd@ZiGGiZPo(;TgL4*v^*)01}{F*&eFl;84YpOJhtouFV+5mUg$ z)1n6it&u~6KtO%5-8o01hBcV_H+yI0NGgJ>6&T`s#7TC5lVztcg~IVg#N}%) z^i4wiRG~)eBJKvIGqEh$GSBCnf(YxQ4-zGv2ZN^SUvn??)tNjFH$%4fHx;8g$Qz@3 zb|&CQc7=WxBCMg|DXQcz_wP}8f8TtB3%dFyoJze>#KI9{&L&p3VYEgS|1_o7>UY<; z6PzUZmE1z6J{Y>^$kpASCBG-={X>JYO4ZDPc*Azx;WuC2ZSvLh=5-BSlM$Y6&}+}z zQs-n%g9OU%8cq__4Yrox?tW2SJ4NGCrG=~)GlXAT+If{Px!!M5A@Gd%EAhh=w0Ls+ zZeIR&{Tc1E#s~pJUkW{);x}-w{ z1Zky_?(Xg(L=cefk`|@AbLb8!=~lWM-aDV~@BNPl9^l+_&fa_Nwbs5P(8OKAvtY3~ z&kGbbH=^L9db4v$*2(U7A%}?_J8N*tR2#Y1Kg%E6Km3^)*PIEjcJ(;(OpSr@obS>% zC`c~Qv{>uHlctyM%BhsMaTvuLC|9+v`v(dqC+nz5Lp5L9dOkeyzpl{+!aFG`5XYSk z`}&N3o1ZMCzU*Bfg|y**_wH|BJv7Pn&=|G8`RsU@pZI&_N*i#v@SOJtqPefROe)=! z&jv0#kA8>64g4FoNlkU2F`4Cb#E0^xbRb9I%hV_Re)&KT)m^zcrIZ5O2HY$Yp`)WO zu_05_X5^2W^@GG5=GFkG!K*`c8vpmNY$k`9ib#3-E-QWN7pwC?%pnfG&x`Py0zCt(43y|!y;(6;0?rxjbSB3ai5GmTG~i;vj)YOob#L)*cJJwuYL`LSjZN}sNiDrS;~bS9#SQ|Dk|nAA74OdMf% zs{$6jtCgyLw!eexNmqAzQs8xB{@2zfplB`#;YVnA*&!00)ZVl|9*F%N>1lJqJBt%` zl_>M6{#Ne`9Mmu+)U~nzn;m}}D*x`N{<6drRp1q*<&y!St!da}SIa;)Cw>wlkpGQcr7SS78Y(4l{eUc5q6Rd z;`M70F^=J|gTkEzL!#Dh&rGh7W5_zv z=gCH!y{mNZof7OHRD521#{>RJYz{ViFVc8F{6GpfuK_&wjH||$Q20}sDKy@+i1bjD zD@)trrDKY1jaHpItmQ57>k94+Xf6&=whyK%wwH$0_(K)UiJ^=#cb*6rUE?}Q1oa}@ zZ@o6^K(uIU?0#3(Ir7adNrRyNzFN~|`{ybD6jLdIQ_*6&C1fA<%Y7MdZ6J46VH}7qNgW=#Rj^iisepq{n4$F+&qpK*- zUCPtLXGMtP@W%&=Pb6NsrMV3^41fp3(IHuMZNpnm9;`WWovVqJ$I^XALM@!v0_7me zE;gKFILX4FkWYDkf6d0@XXCITdPI4sBGj%vyijN1V50n-OAN)ZKcW?F8l%pkIO8|j z9AO$C`J)Ta!`{Oa)?VSU+{2GGYJ0I57sn`c5ZR(0+}yr|XSDaP;bp-z9ZtnN?r1?R zT1G6e*kT%%evv2Pe&F|PSpGrqWdEd&(^>!&DHmpRjObBd8yk3>5lsD^PWRI_X#7#t zu+^>*T83Ehr+}VaVTAo&GPw#wF2%*>=6_=!hVI$BFt%h2ic!9s{1V}`jTgu)yaK4^ zx31fT(+?XNcayVTzpk188kgkIJ?;kRi|r))u%5BKq%RF5$65CJQHDfS&n`Ov+&>P! z-!r)LlXp{p+;02&eh(Fe^tS9ii#z1%;836IPn0eA5Ki`E^kUksxhNC{O45*Y`F(*d z2MwN2$zu*_yW~i1@SOI%V^$}VX=6ylbSw5$aKz_sKpVNEbjau83Xaz4LpXW2@hnP4 zX)gyW6pd;8qmMt0U0n(vVR#2$+a^}0Wn;(dp&Q<tP{#>dH1I|RS}C|i`VioX@3&CUkmG`D^_HThc>_NK}j@0`v&0N<%h*IPqY4bk;``+|h4GUf$uG{XUtiBQ#>PA>%R z@%)p8pdPoCAD2c;XPB>lnRz^~cx$K(i841NAVpsL;h&=Lbl^{zv#3sNB`BA)0$I&> zteG0y=37$$S8Dz9*!;>h&aW5}Ym!OeEWjfJ50LPPq~Av=ea zf7j6`=`#|-GE}NI$zb%A@>f<5KV8f6!F=-gq651b$8RF;HrJcbIZ-9PN7~ck$8#8d zX=kRp=1pZC7g<;=e#ESQHC~5EXa5G_=|G7eyNdgDA}NIRycr9iA}8jgR~xopf`IQ3 z+aZY=tRi>#cuY%3qH<+XGSW^eE+OHbdyO8+wHjD*lx*R-a4yDz~L^hRHJD5?7srHETMAQ`{A6XzW_VFPRDV8yjgK< zfd!!yg^tj#o1(7NvIXIz^#J7K49ETb$vh4Y!cjFjMHRPvF7#FH&VHON!M4#B zl9a$v{%b7>fds753#SJjQx7~+Mw@il>(V1~%q(iW-k4jV#p1KuqEJyqMoQo~&Xj=% z)wl*8kBNxR&EazW2bq%)m*x1oE=~f;!!VnGtMK?}bhF|KoJPli*oQdZ!e;pCpq+b6 zHuk2G7J&PT5GKVzTdh$iD5zgxgHeWTS(eRPapAEE8#P@r1_;rlDZGt_`Zj{RDDs-~ z)6q~Y!VWZ1yzKNWKr%O2ivor2ZQv zfvYypsnc=o#PD`cLPMXkrv6P7Wz0>ESv(pb6t4Gm77p~M!|!{W7GI*9P$_+_Mm*HI z`~keLg?#u*JEf=1X#AVn%_QAX1L|c0PZ1-ojaot{XU5vrQU`u}rx0DHbh(w08N%NY z1fp>W6IUT7<-hZ4<&c%XdZ$4$2qJYWAH-{iCmzwM)~R&KJgh{B*{*Dy_~?9I=-I=9 zb|witBz6b5xDFjG=Q@ZPX{%Tg0{;lb?_tnasa3R&Pd|u2^VKK<%VGw>lPM?^v2k(P zMEWaYT%LKA8w?FIe8dRSwnlPoDkl+dGo&k$7`;M16WQsI8|%(e|HN+-?pUZ|9ru&g zu87!Eg_GOC{A1^{&K9me9_LNQD8AZvx=5D}{9KamjFnuuw6ZNyk;3^^+~01f0ksid zW6D4}b1%ZegJN;LA4Q83+`6qP#`N%MDMlLEteXlA$OsMqPsIN~Yexl_t#n?JtO z65I(B0FyA}I4|%#re7qh<`GB!_Ja8fl*j3t5xg4asFz$rg^b^g41o`I~G zu=LeS@!0n|B$$=_^+Y1HJk9-68;bJQM|vn!AB4F}FHAO(hjPn%0c9ro&!&CPv}hMf$hy6apKFIMmi^NSaqiu` zIpjTqB%n(l4lm!_N;}USVTazzc8^9wOp#8L59P|r2>L%lq*r51DTM#}4~W2v9&6cnUZA*SCZU}-C~xr(h%q$P7^OWFQPV^? zE|qZltMHYQ=pP|m{^*aH59APhqm7Iozdvfgc+lUv4No1@_m}v;T-G;Tyv|7rfbAQ- zJ~h`zCF7(P+i#lvX2nLIy9wX-;#Mega{y8f8~!8185}7^33yc=L!!cf7!8p&K8RtF z&O$Fh;vNFTdJKhM8=0JhNf7{AL}S}@@?*5--P-eXN?Y@PAe$IHqII_Vduv7kiKfy@ zfa{mG@U%V8I@3==2{R0paDdgHuc)-oFe;$ofqSi0 zGonSNR6-zE(P1d;{We&uU%$3Bgw~-+kFvhG{mLk_d#9AXNB#Q+oj+XyceJ>9BoHQ& zA+L~2D>k{9o?V(;(IjTQj)_14P&rZd+|M>Rwu*my_6kLIIiR!XuB#6Tp3|8UXud_ER`#+%1E zD7=8AGW_%6o!Z~~LUx3@A*s{ns91|Mf|Hi-5orlN&=WPbTCbTG&ktwKPt`WP=x~#8 zDmwVvf+}+h9eh9ZF=#HElw2^j8}kEoa<2>sOyinS-+?z)r9V}$ZCJ39R){pSJ$~*h zUwCIow6~kC$4_I&O2^HQYa#~3;;u!{ba+&`!TZ`r5=X(Y`dinynBke_AHq{8~tYn23w8AoqS}Dy`{K+=~z0 zgEXhg`31atDgc0&C#J67R^BP}8a~7kYX5Q)IO@?FBnv=?ZrXJxCsGIILo|vUz#IpWHerN%1TXs+?gkgN?Kt$pSqog3UOC=yQDVVP zh1y)N-hn1iT&)XFar~l16(wT59w}zxkMdpFu*d3VrcIAZ26=cm^>Zz7x``)y+J*-1 zi`;Xnq5a!!EPh<4=cXK08XJzw7%TtY|FHtb$an`XF>V^^N0{y@Fh{ z=?JSF#)8w9D$fJ{JwTV?g-0%>Xgk>uss`9>BZ)9q{-B?U#TV@Vw8&1KKB^&k^o^!iFtnV-spHLm`Fl+l8TvL?Mwm@l&@C2CSlWFt0P`CT?h>^eNH)JMJ*NI!_VnWW+UjAP+X+` z;1EC#m58l~bXmqUK79TLCC3M4F++ZMxQYN@QNE!cWs;b7u;3V8~q5#9O%>>KGs&H5Q|| z&ay3%Xc#Kr>}c62dGFiu>yq8$w1{q?(2N<+N*-hT=35ERif4ZAG{4gqZPYKDx`SJf4xy8|4B5+ zfcSPlM!uidbUWeqs4jcLMH5_YMXfYsw@ZB=Jgp2@?h&c@MuSs&dEo(ievit%@!zxB>YIGMl^{$Ka}&kbqX^v`a&mMwl@#UR-8H5sMDlE*AX z(Q}WyRZ-Y1dX-NbceOyF(#a=xn=Lc*x6qYaBoXTzU15d|UUE|11tO92mnA8j$p6;- z@4X40;Xo{+4N^4#pnRKVUysE97vS1pP?ENUhgzX*Ol^MC2vg8-->yDpcXp^){DFS_ z0P=JUzD~3}5s?|d2V?I$`b2kYEd-VFdaJ_K~k}m8bc7 z;wOBB<0d=~1#w$pzl5q{=Hfj^JDu=@kpd{?`L+^O%BUwAVG;RH+@jk0H4k%P zl#%UbWpYAzy6A{REIY{On4b;$y1fPN>YBhTSF z)cp@GP9zIF)kD5;WXj}k=^vO$Ifo8kjhJpqE5W)*$q{B`O`~30uU|w{Q(Tzz_RH>^ zTu5l|!u#lPxndD23>igJZV!y!TJ;g@1>RKXy9f$dE}VF#FHcmUnio5uV*gJ-!^LcV zO*0Fa+Tj}93l2B#(j;K>rrVOPgC7g;V17Cz|Dnu8D?`sEJY1mvqVV9aNbFEYu>G{T zrn2%_a>TQUoD|&QMRW#sIuYwZ#JRcSahL4mNGP^^!(tL6KKcTXcy%QKln=y+oL> z`T;lg#w75E2o6xA7k^S4n_bC^1#Xr;ha(efSd(fP3J?=xQcbMrQMl!HcoFKVx4cIYYVD zPJ$g^3HS!_)L|oZqsXcE!-)rd8WD?zlrM}zu-Q|WK>v)8nq!I9^h`4g?vk|gSxApN zUVM)t>)G=1k-p{Qw2S(4QtA8eTW9G?J@^ySK)r(ZyX|z4#($mKSYIxqjn|4Zj&AhJ zH0#gcEJ0a40U>%1SL~Td`1c5fqwU#-V@{|Sf|G|tIxMhiN9sJTriTsIFx62;;Ef_k z!+k&T^M0hU4%aAW1v#vGam@oA#F2_VxP(Y?0zk&_%PX=GBBB&~qkkxkJ zSn~o@gY)LrWnyLMl?pnM13!n9WXzZz%z*5(W~`U2C^e~_HX-YSLZCAQek8LDq%au2 zdwl#b!cWdg}lL=(li%t1w@1nfwer9G}p%?Mj ze(iK{uBO6%8R#gAI7>>j>GBc0CDkv#e^JR9S1t$1$NnRPhYp3t1%*T(T~@w7l1y9N z#v-F39CBNg_&sVW!d%-MXdL$LDQN!JM5*mr)ZSnfLNHe)xs^oGh z0BwHjTo5|NTu=YWKh2j`%;@aB!PRD&phMAKgsgJVS5mo;?2W#-^e-P1jxeG+BH|@UH?u>db*t`M0?kHKs8tFf6 z+&NDjb5@BjNSt5N{L-Qcd$hdowi8~ZAUN|QvI_i)d?o|2n&l{*^54k-DA)XNy2HM| z9tf{qe3dU!y)2T@2B3s>8I~x=I^nDgi^LJ?&4Nc7$oTkEPjLc%V4TV!fBfAw!U*_} z9tnlYXmd#=3ydevi29hV#rJ`nC(DL+m%d>2-}-)mJ?isZ>JABD=~*GAE1`RP1L%P& zCKqMt(eFngMZJ1RAD969Hq{RxQHYYK%^Xd95kFQDZ(o4`aMi<+@x~pU2wf!~S}mwO z##=jbS8s|Kr`uI`h21DMzV>&WZ<*mZYY#PAf_O)Mqt3W8Z%2L4Z5w$e3B zWkKJ>uRQqtPtU-2T!Gu#I6{KI=~cUy`VN@|UebzG&FOo&p3U0KIL5TMuQRxwmmAO2 ziGt%}NaHlR$}uAht4E+$z{8cyfV`&k*qLy4%Q9Zzzl(rr+J}P!MW_73Y~Zt!4h$zV z!Mr?MvQ=GkE6}0+PE1uP$KQ70Fhy(snv~1p_YZW_eIIK6=0n$QwYkKlG!EO=9VX!J zT~~?&#;pyH!6x?R5C}HNfes{#NY-h^`?ElC|~YJ@t&4q=*eN?i6%;c zDZqZtr$^5bd+|dZDGN0a%Q8x>B0b(cl~q>@jU5^5#^kNYk52S~fOBM-?P?#m4%1qt zbMG+ccCG&Kvi#8g*7MHujTKzrgN~0{ufIvzElQg8tA5sD8!H5K2!Qt$h3_jpE(KZ2 z7shh1ui-g1$!SRa{0`Xx#5!-^U4Q(jJaK>+FbnrcPK}vf(z)BLL37#ANd_ri0GLS|CYo z3%8Obk73l%rbk){nnTOzOvJU)>~YxRVHvCiHZ9ZmyRk^Tpb}S%Z<}kp7KIfI*W%WY ze3xrjr0mn!qigIB{{GdL``(V=s6xXdFO|tD`rE%nX}>4yNWg;hyK((b{O^5?iG$q3 z&Mx7gBX^T~>N0rG9HB)eA0e$nWc{sDuNRs`K(t`Lg002t_*HuIb2Y2YN{U92Sy?{0 z_*AQ#_7}s#%D?v+vydAk8KUg>70UFf;tLQqUvMp}ew@554xN4o6t({aznz~2#$CcK z*l(7G0{6Aq#9UY9fDM1WtwiWpy8CCX4cngFy5+Cy+Z-Q-R8dy5AsKOlSPk+~wdq%M zHa|hH3zAj57E_{63H5*zlG3Y}pG23HbBT*D06O+J2SsY;UC|Z;`@O+H7U2&>!?fK| z%Sta870V3@^cM<1TFM`TD~pUN{B$T3IA5O?%*B${<^&m{YU^u*YM5U;#zzni z-p38f^U`#q$eERs+bE5=a%9tZ`#1dpr3V=s~4z9nv2$uSx zm0lj2OWfHr$z%mFzec8Y{dDDuxwHtZydiNWu?(Eap4^13nR&%hIc2BovNIGxqB@xI ze#~o3+Rp<8_JP*p3&@r|kNT<8-v;!8DjW!S@Ky+l#_xH{p}8D|xRmgli4~ z^MT2@ZH~QrBQSLSx#>Kx8w$XJimpwO8)V6L1*giKTB)@X+Z)SiCQrr9WQWqbAI!x9 zLA2KnG&tkej}bWb-&ld>gsi?jIX<>p*^-1oMLMD6>jgp|n`gbZodl-uV+c)xiZ108LHN0^>TvYSwc>fF*Nf zTK(hVeLT3W&HIrpUZ%D$LdLKTxergP2nb6RMwnV=k7yXE8PkiA1_$6-NjRP>TJlh_ z_V{lC@fp2q?>LOzQ+P!_xLJtNtfKMyhq$Prp>A{(RegNQfa%DO@Tr{RW=N#X>%RA4 z1M#30(DBuoB-+D`(dxJF%T=YLE`XGQqQztc3oV<6Ca9+O{m<)4^>5?D_Z>Xpj)o&O zCsiTxaaUW>nb-oGmk-E>f!GD#Lc@;7K%&#RmauvO z4aPcMZ#p`X3G1IApOhxbW!~2SNlJP4ANb?@yH}BdbaLg>TSLk0AsPUN;mP+X!fQ>QQg6{hF z-)BNuxo2U4P~Pw_Jae5-BdY-pILgvHTI0sux`V4K2y6`Fcqp0(DcfF^?e#Uy6+7KP z+uEfBrcDnYpz3~~l>#)Hl&X+>fvPy>8?4@JIVs$VDmHD=QlUwA@BHX=-0fPR5QEk0 zb~8L)hf|&k9g+4sSW>2dUJ*VM0R>n5-f_Cnx0%x`-!W~iEG?_Ktqz^%meD)og>1Vuzg62tF8F{V>cM6^72jF!#u$rjL`W%lhP_x zca)*;FbL?Jw!UR0R+q8*o;Iv}t^q~eDTO_Qf8e8|U;A2Vn)yjqa8EkF==caIXFZ&O zwaa2)BAK8&w5+CLsG}wb?c%t`X*k;-l$bn{#vFvU4uuj3Fwd$h4;jKyMu@co;`xK0 z<~q)=^}gg|rZ%kb{#f1nQq7A^9J^Ev6mI1>3PO`&#lq0|(J$WB!&@;Hd|s$HHjn3| zqA{=+KkyI4ihS$sGQ+xzGfV~hM7+2WcDYrzcXS-qK4sP#Q|zGTr=v0H3wN{!cPI#> zjIBEEk^_$>lb?}wP^8NEbiy0IK`Jx<1*c|Py=gdXR>$DqS${VL=Mq@D{0f;8E!cv* z;^v)Ha$W)yXRR@R|Nb5hBE2!y<}SuHSlOy7alpea0u6I0)fK266u=t@6rS5|RT=`> zmY%Kh0X^)=Tn^rCejLyMCl6w|fu){=YDMG9zIRYl)n!7jhtXhAm2uvxdSB360$S1| z8LhJrEgRoc#;}Zal zsnwpKWB>K!{em-Dev4~v3S%!+>q!O)ukku0Hb)?ajtELUYqUmN4#v7{9kd ze>RK6uvRgGQo%=6Qz8{9uE+0C_n+l{L6RcB?-NfnGlO)^S3%sGkODHXquNJ7n+ za9p5l$et8jQyT3y$5RQ`c-aT1#HEZZG^H!tIgi{Z6pl9J2y#O+1f^~)lt9Y6KFUqq z`0F5>e9CxBki_5OGAFRX!_Q$zEupwn!>Vq5XIb0|R~yjGTFXFWiGR!z&f3+lXv`U| zyUgD(SKd>lI}K;1kL`kDN48>nAA-C#G)TPGJ%D_B9v&?1fsbUW1l4EnfJvSvjDhn2 z6#+Q+J7@)iWLd~-2~OG&a*zo)%FjVHuC=@07oLh38$RO?AA7~I;BRZ?G-L<(A)G3g zL4b@kkEU23lvuuS8I=rv)pM@cLplxSUzz)Vt&qnVUua&F5bBFAa&Vh$_WmW}n(D?A zl%#oY#<2p9J1nEMvxAkX+JwR>i_M!98m2~p?@P|>gu;WapCRKhWTvQRf55=7+6|wB zllzaiY-C7pVK zlt61Uis$arJx9`1QMThM8{ z-+W%AFEaz_xlcJIOd|zLuqmShi_iZVTQYb(uaukNR0xk)v^OW&+(&%CU1`e;2IUK1 z`A#!=zoKxhN|?KoNWRSBJTMd!c85HbF*<5pdDHr~BY|;|ZYC2ZXC~U&2s5N`j+9U~ zQhw2)5cpE5P_caaey-B3K64xq!Ld(} z-;_xnu@PlW=63?|R33D3jsS=oIcKu5k~Kj^JLUOBd=x=hO4#iC5xfOy2nfPeP;_1~ z&DFEpZj5sgt7yykYchFSwkL$+fFZ_a0jdlqIqou#xA|J!V-5@%xPBr?8A+hN;T4V4 z_Y&uW@HBFPh(fn3!cF=wT08cq)@~JAMtkB@n@)2W#$)g2DwAocSJ>`u2b@J&?3HynEABj4`7aM4(%&d@tr0xPV3<2?q1Tu{~^-@w0r^X>@MBDxB{2LPO5WA@J`q)@sNHU8nhlT(g}A z*0T}rlg))6;XHE!5{kxY%?<9-7maUh(3};GJ0no_dZcYVSOdK!QwZV*<2#DF-UKhE z7gkSIM}$1KDA=i2>#W=FGnlWI>FHe<)0%+GE7sjkX)8rL)Llo0JE(3dkN}xKTFr4)kg@BmNiMVZp-AU7rHB5%5txD7XUaZuKN_ zEWt%-4tp^}x;W@~o@dC@pN$%>Wx{5tirn#nWzSEvlE{y85>CToLDlQRBAbAkCe;hZ zI@3VjZ7glge)13Ga4cFMX=w$lB~H8ECc}(>heD%*V#9}P?hT%8hYQY6ol$Kre;6Ce zKV4x;;N1duDh2a|@c%+rilO7o4qfbE_ql!i+&>XxKpdpzf+AV{M?*X!kh$3r$7zzT zyxGYK=gTjBT%@LarN7T(CSkm0}J;Gc~o)fd2PexF>qRqdKz#^Dj_liDt}u1HllBCO_W3lp6W@bA86H3obmU zDGivOl0^Nr=+9t(@vdWXRML%JKWm&+fJ=Hyzm#9ec8Yc7*O0^l9Yr8|4n6JVBr4T- zfwNV+MTacGz0a49H^7}k%z5<_fY-O( zEZL`2=jm2wa&up(dLpGrD<0n_9*M>enX7pazliLT(53xA0i2JeNS8`z9~w2u3sfRO zr_-_C)_Y$~EL6cgs1NLPgmai}mYDXz#{+K>Z=XTE2jC7$=2^9oWnXaGvlqg8(VRs6 zfq9q(@;;M}>}AoZjW}6D=*{;_v$Idwpy3^7w;>#tHFf@!8>sC3J)FXrcoC}GM;1R! zTc`pmyFGf8!=q7By8Q5KPL0kErKSO)-AZuE!at{k%P6KF|DAc$OW;|= zGY!Q4_Z^pi$-K#tbHHh?)F;~TCDMkgJl~xTTJl?>BFuExpvgw zR*SJKjrfg8TjP$?mA_ZAVDcs*M!r53>iE+LgTeD=x_CggNP*(|$5>s&q(*VpJytkw z!u_Gic^U^6nb=GN|7H=P0~%loiPpfza*j%1Rf}n>=>P28Uz;tjPIh^LvX}kFL>pf5 z4Y~Oj^nedtRTwuve)U|et8rrlik@rH3i2jYerRTqaE=gnzPD!yHp^btel^0r3AgGB z(wcPZKn5`4r1bXGSBk*lGqJD&>2X<;KNjf^>@=@xWJQ<{ape)r-6<7 zjQJ5CW1_i&v#=|G7c;3@H8tL5daP9lVQz9_ zDN{`2^?x`^??1+3@*&P>wzBhp1NW_rV#d34SRPf(+@S$NcFdqqa$@)tm z^k4p#AZ5hiIZX_7gi4vafv#GU|LCrxOVBS%$NqiU&Yw;H)4~ik(k~|YBt-SGM)>eH z`VX+4=ypj7IZMRoG>4HUl!3Q1x2gDIk zwwF+>B?srX6J**y{@X@~usQk#aQ2PxGEn=gPs~XA6XMc=Nw9O(jLbN|FsxCYc~6&I zN4Xag#+OqX+)RHaVsWt46^>e-akk0Ql`2nWY&kc2D(}K zZhDhqz=huk1^G{k|L+Bm!Fsk;FbPiBO0hfH@N)%o6fQqr$^NhO1tE$gr$jY_ z({cVQiQm!$zJPeT0>mb~Kx2ezimuO<tu&}C|p!5Tf# zg!7W<;l%<175F9sV9sdgV|&Dpl;#6oK={545$HfuLJUAFckW~ZT>E}uqN3 z%60_IgCnW0GU1%*7J@PUoOwQda(Y8xmJHdV*M$EB!wFhsPP)`tOl+I(q3&c~0b$0g z-O<4alSv~VMmo}aK;XUb^F)>0pR`f3P`Drm4dCIV6~v)9Z3cjfZ_h_x#ZVLN?&}ij zRWoYmRc9fC|CH!^qt%}~>Kk2nTEF|OScv;pu)qTgVbN~As#!RZG4QV2$PO$^@8j zh?m1%ve|GNU1n@h8(4YxDi0qObC zZr-y+G>R63^=JH5jL{x@BI{>S&9W_^*TWh#LfmzFwF=sJXdYMtni$f(OKoA6S4qku z7^@y#m5EEAmjakG{xV~wwxc)(I_^Jy)&3K7o7|)#2k_i2)743}@tcp$316+-0pD)4 zgOQ&W#x7*=^Bc;iU67I+=tg?(hlH?xFG>3tKDW7@33p=e-$;VB_E|6drgR}at*ZPz`cS94|AV) z$2`ci>6cvHdJfB)%m6)J?cY1jd)&1- zZ8SmbnyXSBoy7L}F_ghD_&~Q+;l&dU^x6~C}$IcjM0yn9gLs<%ZVifRiiVJ=nJY3Zx8j@3Fk6l39|fmAn=S@0H^u+K7zyE zD=3`Phr@2KOWSK7JeLmONPHl9rxor^s~WgZcibOPc33lY0bFODd(;M!PDOsaLW@u9cx3nWTh=M&N zZpZjHBo7AESAKrA^-+JV32)?$<<0piA{ldiAPF~mLybgQZEzI!GGf8IfIAy}t%9F) zR;wJd^4#Iq#y|RJ&0$m|C$ejX!Pk^ruE9irxOigaOv@K= z_`e7^0K0$=&Msu+&qMTx7^j}}P>}%zrs2Q`v1|Le|2&jQC5>00LsuX)<1g%5N#x^Q zwI{cbOqs|LJStwkc=3pNX#3@<3?sF>3N&?KKy{kS+i;G4K79GEt2+n2M?q7=;Mx!2 zfigKsAVcB`TW?T94tW^v1c&a>CZKs*!?j!ea$$y$FMisy?V%4pgua!R1@5!Q&?#f1 z9x4V6P{p`T2{XEDqek)eCeFiRBN!@M*xMcY`lvMXH=P;+%6O@({*?E8 zrg=xhSjOhwPuJ_7h(tc%l)cyz=mj*$6^Fl2M$k+5{1vXfGqt~gg-LV~hbyWFTfkB+ z^5YvH4+=^%zXR-hmn;hgh^ed=5@Ah!keoOrYpoq=(dGLU@H*&rwIF5_O%QgROCZ%N>+FuU(|B80n_(d3HK^gnWnTZr;B8$GdC3f3s8lU*SqpX{55o8!3hF^t9?dQc4uH@I(){vY!5Ox|$UCsOsOV*bGQT z?2w%c{pp$isJK6idAfMWLmh(CrKm6FfM{!HU~G)d7`{>HVPMg~$|T!jt1T|f=y{br z-u%osQJ3MCqqNj-qi|-O<&H4xLEoOO5g{@FLD#tNUg7-9XABef42mVTr$fmr1kaH= zE5;lfFxn@TCkFuq|wCJc$a?CKa6JJLro`qxa zY2feWul4Z_vw#nUsfF~@ML6_@Gs6h6V9(d^(JY>I5g@N5Wyo4ecgG!5|MG2|XKFyD z*v$j~6XEy05?v_N3fAyuRL0%bp6zC-*N>iOY2V`R^l|Ta#?(4^C7N^p) z7P@B1IJp)&v%Y89K>N{Z+|bgT(fUWQ?KX0_1yX1+x_`aaEx7AlIxn%Et36nt{K?MENrYi96KJ75LVbFZ`_ zVCpefp8tr=UyE^hbk%{=GesTZVZuQlDR#L*AYuCT+n}~{NmYD`=pXBKfsG&SDB_Db zTi@!)3u>`Se>0L^B}AK0nQmna_s{Xujgjg-5kU4zGvePTBktQ8n(%VH@0wmGgUDv@prpL^Wv1&s+GtQ=X7?(S;fpNt79WD|f_@!ovcm>r z18(iymd>LK9(+e^w>09>h*YRaBIv`}{BN`02n+b`Y`6COO8t@a+FRS3Ic{b1n6AwdBF})ZGOG+W;Kp6xeu$Rk|44Ok;Uz;gRn)yDQ8OQM|VIr#buq2C> zqrTGF#pZ-V{95@-ve?UxT9_}JmALP|qX~GwW+62QbJ(k|pwxgfB$7PIEDM6aIhkCF zxHhZmOiJm-gG3#2rx2yFXS>CIqh@)qc`~7aO7QPZ?iP^o9?z%lHxficvr?>zvu(P< zQ%U*6YI|j)Wa;^yyJM!W;bx#0kX36bHet2!W4Ca`CxY_J^Ky*WQ}@Jx4pzAP#JoM~ zDhf*bhC8MNS}f$>>ImJ53_s;7Q8outSD7Y!Td@z`B!*c=W*-Q^WC4^!9A zwQ-c&5e+lbs=hSj=Sa(_z9a`evh2_?SP2^8H+$nFzFM9W^2vIB_6!UJM66hkyY;xv z>O0;*E6+^`f~$%e5ZA0_z(%K*7hy58jE z2jL&tC(l9(3c8S8VTAo7!a}Q23ba}5oz2(wNXMZgLu4XR*bWt5Q8hT25!jan{Pm@c zr2~V4tzT116hnCkV3)`)teL7nMJ+$q>&e4UbtRJrK>)n|xuM{>+4seKonL8#6>iV_ z!#1brWfu{j1Eb`>Km0$gzA~(?XxDZlMOs{nOMz~rxVuYncXxMpEmowsJH@5AyR|sQ z-QC^cEzW)Cy|4E-o3%1CGe?quthj-Fu&|0!ICb?CQzJN_`ey7geoWZ2b90XC#LPA85WtJ-F7190K?wxlO9fqKv801iAVrrl6 zwRh)0Y$<3>or2zCdsEM(`%b_1 zHYr59sXc!p@t9A0+qMv!`J`xtH)aqCD3i~8StzPnbarc-6(PAj7AvC2b5>SJ5>)2I z^-+}}bJF|R_`)U@MQ}TvAx0b2VX*ohs*vd1UTpDN`BxQBLiAdSkS<@){6WxGVljs$ z>~vb4RBE5NJ?%;>*PXoOF2+Dr!7_wrNm!u_Ezf@3e|6WJc`SMKeR2ZFoQLUgPfE>I zt?Fm%66}Ix?8=|9A@jMm>n$ch;(E(cb@2R9M0j!Df%X2fN#P%kFUUZ|N(+02++b)A z1tHteSI4m%WfuGKi(u%KT1{y+OXeBgid3izsjt@+TuoibkBqgpq(hrUqsb+6&+_s; zGWv>ICxs0$>I_@Z8tDtU-m$S3ZNGJDD!N$WoCJ9XQv*&XVJ7oZBMJi zKc-qjot1iri59Z@1}~?Id*ccBn|Tguc__J_MhgkQ%lUlo9-di8tmz&#WXf&~9wYMx z_9Q^0W$Ba5d%zLJgDc2T@C5PK^-b!0fz6p8=(pGqhYcZWTnTo66Aogtb>i9<;x1{? zz6gb4*{G8I5fy6A=Vk8Nwwa)pf81L37bVAp#mKA=p`XC5K>=)ZZJf_~EdyfOGE#oW z$NnT-03B_B(fU8`VX;p1Bk8gjo6j|MxUt3I)_IP%G@&|wdFX&~?aIMXq&>G0G?&$E zzzcpgPxtaMt-pMt=~cPa&vdfcuQXNXF5EM+v^5wfpgB!Msx!6uk547e9zDiZ!sfP2 z@wLxd5ItJNI)k97rObbcQ9*B;+3Z3E_H7|9Y4Hr+pdGvOBdoziH5AC^_mFiX_y_v@ zt_!_NYO3O^RQFdc=+4WK)1T($T~6y$@{wcB1feJfYkPOvV{~dfba*aAAk(bYs+d{5 zu}=+|mL2C8k2NyyoRhHd9|`iN&}MyZ1E_2|OIskzyn@ zGGy&Geyn%o@TTufi4ciUdnU$R%hqUYHd~(ih`*!9_=0c~Y)0<78x1fXpDCHtGq!xJ z2lqrzts5@)vx56VY_anZ7naq(p&MEgt7(ME1j$-)t7KYlr*Ettm4Qt*PTQVds3kR< z;NE~a4B|p7rq@2zsz*_oHf{+muI~ z+09gXu&nHm`fdGU*BlKwd15kS^E%=3)Y!W-6d0RI1DG?prCl!9!M$Klz!WsvwYA_F z*pmzDV22sz5?v6Zs$1z8+^eUdp;U+>X1sJ{oLc%Ek*KZQhr+ZtaXW@LIQrm^O2Gy8 zN0S{k&#i)RpL#pT)qmeKFWOVsuRfrqd3&`6>csip zRvXx9XHgw{p>?ZR91f2FWK3BI`1I4UU)W`Pn^mh2HK|7IaVx)n8r(=h*RbCFL3FC^ z(1jT|k>$sBnoxd*DkB4(e#c^7S~Dj?s32IHv>)qDWas@nHFS`6nLpz$)~s3V(>bU; zIY5%g)?_^w?ZD38+<^NV>f1Cq7YhF8bOQzoQlQu$3WQI#RwaIBIJ;0kk@zC+wbVqK zdb1T-@md8ufh4q2K#Z@;U&H;q6Bz{I4D*&O&axUSO~bi4U1se`zM~`VVZjdTFoU!s zr=M?Ui>@wuCllyBu-cwU2fW!Pf*&X(Oc*i|b*MGUwjT+H3iK_hQ-@gM$Ojg>60M^* z8+9vd%xH&D_EpFU)o<4sfE3WKz<8Dr>P}pe{Bvf9z3e@^ zuNcS+y;Eb(k;$9|Dq_0#>6^=6asc(Id0mxyU>X81Qq2u#c(alg?doK_d`wGYGHeE> z_E|{UCy9^KTbF`|fF-3aBYlO7@uxnJ9FAyy17mfDq{A{xj`P@A7w@+dj(Sc`lUaYB z9)oDB27KM$n>vj-?IX>11OI&&gZ$04Pma(LQsdbUECFi>n%y5iSc>|TAROR1D=5gs zvly**`zOcQTVFi(PIxz3`_)9prpNXIxUz~L8+pSL?(Rb;9n_hG?py}wH6fX|GVP(a zbpkO-3TOGQFiP=A#C7zK`BHMyqTAt2+!#9)uJ+&ax;{^te*SDW_$$pgvzeLS<#7dD z%s#&3w{94MbK%q$A=$?KrD2;=jEOy|%bznXS*ikMN>14c(ol%vPX)P%SuQ7*F0M<7n#hY$zOP# zq#3Vg8k!U0$6|FKq()jpQ)tQ7NFXyt*7R9}t6)3%AgrL*vp~2P4!Am1_H6?C`d-EU z@@kQzShr~!fr_9S4BRA?JZ%2T`p;JZ5PEoiFd%ttv8(i$YoezgvYKkP6O1bb3~l-W zmegtVTrJDhO+kjq<~*H=R~KZtyXDEIzu5QB&UONOkd>gODm&7G$MEk$W}H(KYfg?w z9>ZUeBPJi1keL$IG2@hfPmMyjB_udLbOpWz8R+CHeL(KjjF;{3Wp}x;&}*rdq3)TN zJaEn{A&mOr!Ld8leTmIl$!T)P^ZTjEnjl_5*3y-Vp4xh^S{kAw6i7|ziep}!AeOTT;-u%@bisb#R*nLMr^)$5_E{6%-##n@OBXUv{0kMuEfN zgDH`2Ho1~JhPF4RGGh9vCgX}>`MBBF`8Hz7u-TW*YENn0HsbJ7l16th zLW9SR&hK0Ti+^p5iCS}u)(djVQbM~;An*9`KfnFYKNvN?dBL@b_FnoC8%^;a`y)QR z&>o5psJ9tpVL-(2-$&cYP91}kl0Ej=mKJ-C@%z^_8Vs>R$;7Gu`)1&WlA#oY=?D5Rbx(0#Gr>aM}4WlDrttT!hP%;0?irRB!1TbIM z>rTC?Y;nEN`(o)}akLNrPfKv?;OLtP$wYL-Uh#XgJ zBd`u(yB!(Xx&w%q@UMtC=-l&3*uo;qFAc6!O$43%U~z;0FW)CE(ahsQOP?aTDtNMM z${Wa2A7C8Zze`}uXaZuTslBC0&%ptR&VHWlO}ON#Nv0*eyVeJQ82VSbp;4SR7d$@# zfJ@^aj~amnNpqJM7?8?dndM$b|G`${3Hng5vcIKmt6C-v!{ zM{*l!UhSxYS`S_D2^$WVs;)Jckw_H(T@SK)qa7;L50&@JrH)*FQY8O8pj8aG1Xyo> z(Teil)i3}(t<}pDSHf>A{a?Gnuy|{d z-4#<4{`ZeDSIf!caR@~ zjiRl%mi<^YU?W)t@*tSHQu~FMB!aY$o6k+Gwg-i520XNgQO=B`aebTNt(ijy=;?70 z5QX6lIF0B#tOZw5zw=HWxRl9gw7ONj97HXf23(5=2g~CQQYNXc4I-v<(F-4)lAo{8nM6vgSf`<@Ob|mLtC3{NP%AyKOpQ^*T!uE$g z%C_JI@mLwKp>_xbeZ+o9EqK^Y%wpyAmNBa~aWI@cl)93V)V|&=)2Zx$>|3w$$!N1X zICvb1IdDAE%KlZh0b?TZqCM=^&Y|HQMqv37S|}PSd2-u9$T9!necFsBOg6K*-~Q;1 z+4S-K}v7$9JGHI zm<&Ph1nEQuh;j@Xhty+9>#t6HNU&8WQ1vnIGZ%KtIdq1cW)&&1?qEyj@jMB-pyTdSIm`p{WoO(iaJF!Pz03ol9B&DBg}Gm zWB5)8Mlq#F$jhFNR#G0(kF#O=rDo(Sy;Q%Q_?I_?hJ8 za2JMy`0k@7vSunP7i|AX6s$vC*=y6G8^(XW)TI70Bx_aM^74$-d1FCg^32gG^`Zvf z)w$HvQ(jSa=r)Of36eQrRFYS6+7<_xL;QM&Hh$tYC_4tfb?t%B;cFhAEN7YzV2srk z=3KVJLufvJ@iAAtuA}Kw1;`9>*0h`rdMJnN^K^)s|Ej6NHxAoLT>sBg&9PfvRRiSu8U3ri7f$c0Ul>!A z*o-8!9%C{XO6{mnxRoB;qnml;GtKoEk0AEP{S*M<@tt=tpf$)39KXi!OmO+b~oe8~Vw-@H~ zAcTVnv$s|ua9>a;+R9e`u;IaB_i6hOp%S;O0^#wy z)M7Cyhf|jkON6-3;#N@Po@nU&0x+r%Vj0yx>9KW^N6AKFN=yahmbG^8?5|3nBN%=L ztUZDJ?!}>k^1x@3Ei>1CIiL!#Xnr-`_93({a>fGe2Pm;)2>C_g}40 z`SlTN!5z$3S63Hj>MH&F?*$1VT=C|gECkH=3IHA4-h4~J_G|aN#L^WWs0ga?@@Vlb zm_9sa3yvq|5I_K_AGhcInQnjH!n1ea#eg>eSsy5}Y z`F92|mxSCQT{|}$&y)>$Do0Mc?jVCi)G0Ro6U|1DJZG-3yZf3=>bH`lgp#R_fu|K^*=Q=Mzkd4K8a?AsOEoc`7|Zp&G^O<;JiP**Ir&y|3XDQ`v@7B8;0;fenYw7iQm3;oqjQ2h;r)9Fm)m6;L z+zg_V&i~B3=wx$Jq*0CBQAj|2Z_%H>vuaimx}CM7)*wdl5dKrpS=8uD3!=@yIx6bE zm=$tTY%f9R`FxrDKqd`Uvx4%wLK{imtobjou z;q%TO^9M=8S;i-^%*BvpCOJeXM*kc#Qt(Bf22*7Zc zYD0Jt!{z&^7lU2}B7omG=F%X7yrkjbO}4`bQtfR0*eL;7DLC+?PF_?pgT{uB8W9*ko0R*3Mr^Qz^)cc5*2FoY8ziOO_$Ntz}LV< zP~g{wr*IK8eL<2e$6xnomtRTIV=$W?UU@S2zUy|4g=1~Tp?fR*`^I@08nQr?>PnyA z2MNljl0bV-D$y{4MZfk6EbBgkGQ>d58kE99)Bo7q#9^4-y1aTLXKcK!?0w)|uue{2 zMP<&rv1l^V{IueHn0a!Hs1xn9$EPPEn1StUcB6uM{tSd(T?dmW7U<|DTt>?gY>E-+wH8bJQzc%S|6KS-ji9jC2*Mqp z7lXn8(SKN0)yo*=tQ@3E;Tnn(vWNMBjlR4+X92zi!;jnMU*fW2Kt-f%Z*R}n)zuA@ zsTF1){XN$sHJ-+YQoNMhk*PiKq(*@=6PB}SFo`1&M;nN_*7z9Z&3z1?ESXH<&IWg` zU{E6EtD&u7J$IN4e_Y+pD^400>K-7jLCYWm(}>cE03uc73Bk@`Met-sfusJ_B3tD< zMTx1GIlgT8d&_cNZhH8JpuEET#&bWw$Y=}=!$RFe z%XiD*kNA+YKlV<7E^X&Z->WTw2;upCr}Z*l_zK7^1>R@SS8CC2qY2*M&Mo&b)Fd}bo96loMzN5y!SJ^d zWo)lg_Rop~A{A;Bq>yLNg*%6nui#NR-q5POiqFVC?>gJsG8){auMfKQilY3hX@v~Y z=ELwH)D+ga+PJ+w;-xBLW2^qO7Y;Y6!UtGlakRCFDyrJ}*SGl_z zE{3{CRJ<#lq{Qn+oRtsDQpack?2HDTfCZ#%L5*L4h=WM6ZSVW^3?WDkIlH~O`hxGY zb+;=Tb+bY#%NC~MJUac1m0ETD#fsb z)QudHD&~V1d4(@#n)|Eia@BW?8eUt^;tmN)mGs_K1yAZhhZBBd-%&75f1^DfnfS@y zE9{i*Efpwi;+%=LhWrKJ8OXF7G)6Do{>{G<^!wn#&ZJ+KJB^qYarx^qd8jMsD(>z@ z+gHZ<6}7a)0&4v4{b|&G*L@O7N(Wj0w~_&L{g=m(dmoVQ-Yx9-2j~YWefriiN`<=N zu3wb7-qxXc8$}w|0c*^daWb~0(_6K$00l(G=C#Jqe@lu%xN zT=)msZo>*KTaR2vB(e<6vd$`N3-L2>);E9+hp(c!KP!6BewTUkbpa2{+M zO}q5h8w_pQQEE6`OeBHVkw^?@|B*kBCEDw@0M7)<3CgdhWB_%&g-KG-<+?!xz$r2) z)vJx1yePfBZI?a>kbma}^^5{0)!E}Pg+)c_i%4_W!S(et9T1}PiCe)yq&L>&AcD1L zv~&|@WS~cSPsi;$?Nsf-&CN{}4?}I@C|?Y96t7Jb^B+Dk)?I>l?F&Inn_p-q4yJCY zXj2KxC`cu=odi2qH+%MuMm=kFURPF7)Z3}5PBXmxPC!bwbr8aLUOwh~U%aC^c@Wxd z`&-@HtX;uDC?rr$SL;7L8aD0F1M`WhBJsZ{MfVw)IMzN8!c+)}$<|hgrXIKR5`@lR z6q_F%LCj98>9)N5tcB$18s=DM3Oz5*hv=5iS~;nrGVts*kR`N^QhFu#SE#GP-kdzA z5esyfC{s_0)|)x`*6c9>+6yi)o1UFqw!!{RV{Hp4f|05H{q-0;v)&*61Cd#bVjV2m zGb_*{V6-n?!zt_XqoSX!28undsy};&ae3z6CWB1$DwIRsqZWn&6v1~0vx!`hCH!I! z6tFfD|1@h?67k#&68X@TFXSLJ`KeShu2H(!T3~ldYF7nCmeIE+?-KEO0f_aHGr=x^}pKtT}cA(xxTI#!1|r& zHh4Jy{hllZ=)E}$!q_0alTAap>Dbxc_sIoRSlXX_9{FbEDrJ*s;Vd()gp#dNiN83B~ z$cTqELuHoKsD)b(-gzitiO=;$L+!>&7|pU6XdZUT*tjSij-S#^g3Af0mK<0_6%(VT z9K|Aj$}g@s;P^6YQR02@EM6E1pF)4ZCT#KdWjW?T3OcugO~iswf{Xv#!oq?faB%Um z&+nyUN*>G87bRfP=XIg%qAVi9PA#I8o@-@yv+~CkR4>_`G1`h;zDJVfW?j2Ru8{Pb zeh9eiktrt!@(FM5-;d`9{BP6|qpF6^K+Llc=n+H6)alCWsIB1ZH78ifwM`}h{-tO6 zI^tMIfZpr9609IXF4aawHG0npF!mbg#h9(2v17*{NJvUDwak|>K|5R2>?qscX+)$CMU^{M(|+bL^RUQXaUhEQ;S|Lp^+ zMnmfClvS`d zq50J=h#ULy(9II89J!#R3@4D;Q(tWH(r3y?GT`)iXULLYKFVFgl6tk&)+$YxmSf#5 z>LG}y#@esym6GsQRGo+Q6qkgtjQ^Aw*sO&znGuAMQ9&Ru_-k8ds(fq$3c-NlIBxIx z154$h<&}Jc2YQSXyL)EAa>(}2p)4+5WWNLa zXlDZ3-$=YK>F16DcgTG|1mGXSF)@3!`<}yy7}qoMA^K4|Ocu_cA6^x-_;_Oa{<;8X z4<-!g7X|wX%qJx$A9C{f=%cFw`9YC{voaIQHfz-hcY{eEj0txsHs?=iyodYt(b@YG z-;4d;puA=}-Xhy>wL76A3!L3`h9m-0UVfKvZZIK4PjKEOg5~gZBH4^1@Ku#XG-yn65y*htAe3oP! zXvBv(+bUXRxIbmwJM9n&%1cX0t`DEBaWzP+c-6G9UZEUhmskFW4SN`eX zQ2^{+ZuSLdw$z5kHFhluOX5`y+r-$NmALf~z#nHY;jN7l3R1ah%iX40UK=CC!ajYAFOvw?? zI#y9e7=wA?`)F}h2*69a!=@#)XLVp!y!#*XYjy96_MLYqiIl-I zd`3pT6%Cir5_EWoYhS{1SUYb^oeYN9p_Q}b2N|!J@T2=a5y0DJ=3`q}uJRSkkJb$! zb~%EO{sSu=57XZD1Y3q!FgmKyKQ2Tnu^TlGRNLQOr%4$4)^D{tPG+iUPut2RR(Vhm zl>{D4xziXYs7G^ZCE1etsx<7Jk~s=qbFvOMWnEm+ocWz+wJSKJN-1B24mNc zya#p4V4cvuL>C^t0R@6-?a<MUfLad`yS`tx_MHqSVvCkGV}%B%9mexjV@+$N~9SiZEo)`vG~Fw|NcFC-8h99uAA z(2(0LBoaLCsG$zQBTS3@Wgfd}AvG`_{`$kzuzs?X>qZJXyLrraD97{m!!iC=R*}bbn(&mnsnoVM@6ob@8(lH_(=xPzf-%ZFXd>ES~?` zxfz}l_9E|DdAfi9mSYItH5=^F$5e3tvZgl>)#A~6z(?w1C^Z3kER8?Rz&>63yyYc1`<8lomaEPu*SOvtr!vuay-r5N>DVP0?Rx`pi z*giEism}M9<-6F!1jW|(ptDo1vz(BX1m_Bh22R5U6r*pli{_PS4@hW)8}V}E*Lb5* zo_vFwJNXJKYZo&FPYZa=oRQlo5T?SSsCnuE#12!voeaN4r%oi1mH zZQ~u^8%qrWSAKbEgtJ?Z67Z;mkuM^@&4uF6@H=5>UUg?}Cdy)8y#l>)wP|OPr=gf@ z_2pcDoWaIcDbwp)WdAq~i%gf6YNE;z zJc%=(LEu;Q&osUKA_&0hg3U)xO>+-1R2Q#q%JNVFHT#nJA!jv=X_Ace~wHDKah&zasGdxT&1WEPiKvkSRvEBep6iYh-=BY?7I~q%|o6Z9f?p1gXLem$s-@0 zZ+YaD>>0Do9tE$anw@2dlz0Z9OEqNDi`P8yQjH z5Zbjl@+nWhg{C)&8L}!~1=ZdXmKWRfDMCMKbNp`97d2-;W|ah-R;#V2wtBSS6aT2y z2TU6|l_iVdiNZv5fVUG~lf)1zo{}{C_XBG59)t$%>%8Rcw`79)}`xRl=~SpK>2-n zKh(`srZFIq7vg~6XK_2D4qR2rck0A#WBBWVFfyY_j7i*9S=)6Z^2sHz9fsfeRT{i5 zV9o`AS&HR)cd~dV@xG)K!1Em;48--m@iyRfouc{=OwTLfES#k+iB!S72Sh9{liGAJ zKyl7**p`aWmpz95w4S6uO26M5u;^>BkzU(}b@t${dCH0}rCDW#l(YJOPnN3^mN*DMiz^)K|`JQYVsDF6DN=%p!b$Y{P}L0pj#4JcgnfC<|Du$ zY<1D|ZCiD2hLKnsU|8%?_{4avnH5Js;3=1G+~@a$5uSErnjtHT>! zm5aVe2|K#;ohJwcJl-w6pzqLUn=NQZ)fd?T8Z zAUf_hbAtE=w0Tr3NPh-#`daCaCEa`Ij|lo}wA0w=gqlFKeqo3Kr8`-o>)j(Y^f7Xt)ObgVkz_WyB)`kp&CZU@?^CTSi|#>Z&7*^g z#vfoA6|cCDp$K+Nm1a|Fq--eRl@UEeDT*yb3n<6-2xOzDxA%qT2a}uNP|Is`NEj5w&FUzstBb4WMLnZ-8uiiR6(p9BNEjhFZ(Ea`d^s7Z`JX_UCvnR9 zb5t}ql7XI!-u2{crOX_EIy~orOPox(m&DMiR&mXje?sDYXK5Tb>SV{X%+#NsA8I{y z3)N%ObMYtt`^M_I#?FqL~Sqn98nH1_)I`)^3W9e z3$H=n!gF`Os-F$AY0H#RO))XH1qB7-GBXdm>)`q0Dneen7*mEgT054(ZqfdRXHl8`wbUj!U&lw2QyOOt!aVK{S4#y ziLc#>L2zO?jqN`xnpc&nsAv#NS190ufiXLX+QDGkc*ji82>if2NeJYsDQ4VzFU9XMcXhj|rsX z|BIQ-<$CuLZY(~$ z9t}kBeDaLrscxHs4hD}%Y7F`m^okS(dU31d>?>G zKHr8E$d~(|&8vp_F=Xu9#0!O=_#iC(^RJE;?kA4T-2mmbsPow(!Ck4zT2#d> zycdlU7tG)B>VlG-U({E|CQrx;zHxUTt@qv}D>;2Bc`@?8VGk8yQ zWsaiEi*@f+fYKI~0X6LS@|Y|toCvOy)#8Ll5i#}x!Wt&1lKxzU#0p2?-1?2ZKZ=@1 ziqAEebt+j7O8m;NK0F+?lE)%enh5j;s6sR{Qlf2C${>&WIsojlXhR6PU}#rp7)h^J z%A)<;x33SVT$CcQ*rYgjZXSv^2R=j~HoStD`Q5x5aLAn0l6a~Qj~_Atp+Gi~m9MAm zM~bHEm@r>*_51ic7#084pp|n zUAwdr=6~%6rx%lf8PNvm{CAc!d%t7R%`}{vX?GsqeTFmr={Bd6m3fz#=kE>&r3m5E zS%06B1a&4HJ2xxiEXsCa-qCUb$CevWCl=&S*gcnpl{Xtj;72n%LI-XXFg;U*6v&FQy zQYAV)5_lG+Iy7*>8lWv#91Xy!*fx}Ct1D_>XI%v5umX3@jHeyn=Rv$j`{eet(nm(H z=u%tn3N|p*>;0N{ef;RcGGH*H+EqKHEcPJ~6BEG$dN2?+4nb^Sv|SKHd{VT{9!i}D z>>kpZh=E5Ju?5agqH-d*FhiLA{6<%@U?%G_W*!J3=hK5Ho>V>?FP4+pAyC8#qcCn7 zGR)2>4`02*_NT&4G(k9hB1EMD)*ZPeljKygFoG@7fPG?g?dRn*+jM=`0PMY@YS7uh z7HVd9Z-*-Pwj4>$vbC$$e}D*}nHfz)#rwViIH&qSq9+=4qN8y$yIE%EISGkavBG@m#F@H>zDTuLLEytE{Cizgs=+WP-&8Oo8^OPu8au9 zM#H!K3xr`yab645)wFeo!Jqp49if?>ZVlKze*X-jKx^h9(oubD9RMk5&NtKxTe@6b zd3|a%+8I78>b{WE0ZKX#Pu1gDkybuw0v-G%&bLBWEhK?~(iyLZkxEh|~vaxd@QNfs)}!eFWF@J0lz24e!MP*?6B`Bnf44t3uRX zuQ6>&!ek{Kofk_}DvUiDKfaKy^1+h!_>S)^O3t&ZBRzZFQRUIzuCuYQ4j>}uB@;(m zmra{6^1Htap|@Y8%5uz0X0?U4zS`o)%@a$!wVZPt7!wsa3Ciip}wR_r$T z##zr)7JD#FUoJdb*L0ncBcfP%YAC|tA&B3ea{0x;sGSxSlgW)y_Nx5A(P(km<}$Ci zh3Hs+#l{FTgYn@0Rq+Lq2jPrvV*6CbbSNy-73QkzjTVH!z)TFf#TTnmJb~@Tyf0z;Tlp5L9ZP6#tF*7?9NeIs-*zTcFuS#%0?t8t`2Vdz& zlIrO!DXAK2roCI2&!=2u&Odryq|E#|7P#RWZvrNgnoW?=DsQ%796P=V8$L+RpANEv z{q)>%>V3y0vM7z+2i$~7T|7rTUKc(DPJZjni78;WH zaqjKi)k`Ecc;xEM_C9x0(2GJjeeA@_*9j>^k=F+5C8>#K*Ky{Rvmag>&vorPUPSU& zG~mH6){e)Dr;9iPAXkL!tbyCp<{C%521GYN1G8jWi+O=QKij7wU98_ zg%%6x{LLEaIu_u2rC!nn&{c~D9VSV&^@&q&&BpbM3lEZ0@%V8uT~%0w4Drg9MH>WNxft_cj1BVVw5)#*#m*$u4s%W1Y+PhFD@>QpzK$_ zjb95IWWHb1@+$-}S42-9fL5!Hk7vXIH`cxq)^qPcI*qq8eDs?K*Yw^ye@|S>?v&8_ z4JbcI3N)Yu}e@`S78)^XdEPio@pW z|&%?Du7JoHT#Ru_b8Z_dYI|mkYpLotJiH!6LY|;nslSAPk&|h0DEad z1_jJYey;tjaow7LZpph^SH^Ci@YjsxyvwoXj)7OSLnx^ybYjAxyPoVkY^L1vftb@H z!`Do;tL!@+ZynD%muiR$61ptZCO2p|Z(xhzx$IY&K|@B1C8uUf`RUWG|65asce8s% z{|*L>EX3q}21E2IuaTF>;%M6`)Lnr#!)?ri&R0^?mEUZLSvbZWjN1_^YW9eP2G zOV;J48Lu{!B@im$1BwpF5Rr+_GHiw!qBFP1`V{zLEYJet zB$e!D|M(>Zq~h#-r7iig3+Yr#@qhwTxpy3%;T_houzityl&)9^Rkc$Q%@==$84ypS z1c1lLi(DB&!O7udtJ_N-Eshj z;33~le*oc?KV(E5A1Qn=`kPhST8tn*cIlb025{^~q=-2?_~|i|sWM ze8up~x-qpW1ttrsA?tZ(vp?zjWV|9=d)p++c+pL9o#5YkIRO`kr$PF^>-dA~euX7< z zDyvVwvB%|bE-dakzKT}7n%PQfPxCEBk)T%<;OO;@y14ATgL9gMm0215ZFPQ2lX6YN zTJMcY($3a0k>z+~Hrs<#H{~6s3_IL5o)pN0hnK~!g^f^dm@UQ7kc&l8j8x84M=eyp z{l4Lh|KU*vFw$llhX)}4mqhqk_-yS3$3Gj`Pyw)PPbsRJxP7=KE~+Xjw2hX30)3(H z9K%E6F%n0SSw)gOcizcU-)zZ)*tTJNUP*o(=rJHABK6t#p$ynP8PmSG3mUDY7HsPo zQx7z#SQku!rKIEg<}`5ddWtO-zHBP9`Hvx)-}b59wnmNH?EO*5g)-iXs}=MJaj{Wj zF{iRLw@Wn@Yxe$B=)pA>pC9$2qz^;Di_JRbjL7>tJLL`|r;UALD^8ck=$@W03aK29 z1*dFkSmG9c>XvB+mARvqFZxE7}tidCcwy9B^ZTf`qhvtq1bNFgou2O(Ja!rm9pzuSv)oMYi9>MYLs`ZrTmDngQVV3ZpU#Z3GQUqQL@Ugzo zwz-ZWAM+n+EjqT_=w#lOxYnOV?vB1ws?FY#3J@+mz&DcB{@uBGMWO4EWx= zBVS=?5u38`$JR@~^GxU&{ak&l7`0A1bnmYjTTVA{$IsBTeR6#0;Yg>~kX{b1M-aF1Z5(IlxSRj} zH}<7|_pp8dTYd|eT;&$k&FY6VOkb-L=1$)}}Sn_q5WNwZ^(bryHmQ}rutVrpm88t%knZ9JY|#S3@Xz2s$0 zNJrB-CKclfR=-S&-OgR@Fbq3laxor<5g=o5g5|8c(M^xY?<4TjNE~0)EH191F)XQ* ztm8PDa|x;#N;ri6R)(|46gNKc#(8^<&BlFY=4xfxCAR|dBMCIo{=E|ksbaja|QL&#j8~RB1a64IgF%WRV3=F<)*3GX!Bz@UH}2lQ`x73CZuTaQ?FWiv&Tn`=IPg&s2@{;yKvjhs zSvuOlF<0YnwlGu89-6#parDDV5UV~0=Zw7^C&pKF8NBxR96HQ3q@{R5ZHwXV zd1A@zo>DPEz03Yld51;gF&L}ki@Ry`xy}T=yGF%3KxpsIv-SOmmIoKz|HIx}$2HkT z|KmeMR7wF!36bs)kVXYzbcd9*bT?jtn8pgN`4#Nc{XlhPwT5h;Efn4AW z2Ji#TQAl@W1f*Nq%ahyKs-)3P{u`J%kEo9(*DtHatD586Z@WJ^lfzMU60fW#hXRw< z-Z736mPl+bzIkhE6m_i zoQjbDVj5bbsq8OMhRO;OgG^0q&DD^j4hUi>%W0O|ONx1nL(-{_qYit~a$ZZT`cD?gY1X4tX)H$oIqD?HoBbe*rY za*r%?exQ))2&sLVSG`M(fhdlA53y1hJn`9y>SZeuY?51x#Q|*;blEFz<1JcW5<7`@ z3$3>vL?1?!%eNl!71Gequ_Uj?XR&+H=7`bS1gCOuegAp<6HT&oy|zZQsCk@DO;R}e zQb9k^1SKuYnu6ux+MN1M$PNnS>tj{Mw++$lp*R-%#aCPxpDF{ z$h|(GU|3^&DYmX`rzoy*!|6mO6N%%f9*#3>=&O63zj-nQwu^*c>A^aW>Mp>k>rPvJk7hSf^67Z|M=PEZm25V{11!z#Sf($a>jZzR?n z1rHQ1d*@8Z-NbWtIM49?69QiJ4G~FPIUj{B5~iw**}3hV-`8O=AI#{>3_{(Fa;^7r zzG&5m+g*fH+*I-6A2p9U04yE`o^&k9esMi)X0@%vZ{Qbf*yP(TnPFU8Y)+k}lFvNW zm~VPm%R|cdZr!}i4m|+%@=sIn<*K>)lq-`X#;2r)D2@YgUfZ~9;6hk zyN3ASsVh2?iLI68E}F^LVBqE;Fi9!ADBe&kknGrcQE#U_=yNtUvR*jZF;FFsH||yI zbPiO-XnvYbOk;AmJTmyuHLDaj7H~JjeyB^9ntUVNldB?aI}#?3!f0+Cz2~R<>qdG?%2_Uv ztC+vll?8=LmqOQ012&ppK4!zhEdb#A4$a{MszRj} zwL=xF$Cs)T(Sam(*~r(m9j6UW;M_Aw(DCzEbeS8(H~}?{3)zWn@(Ay(lII^~4!PIb zk1FUVh=!g%=r@?}oeNATOZX&zH8-_tgF(zw_9!bW&+uBJVNBa)8(01#v2&HDR`@x@ z`IDRS6WA9!20$FNWz6y-bI35zu-amv-Yf?1Sk6JvV5w4KzCoUU^JYzv?56H1CE{eM z$(V@Ly(wq`b*Jj;L`MVcwV*C#gGOXJ{E8|y-SRsl`q*tWcyJB9TI-ITYqc`o<9=l4 z74p7eto&xE6t9b{^I zuhdp|hQVbeaZ=+~Y|eCnxhUKcUd=S(1rs1qi*QE^&p$brg}RonnnDBC3e%l1aF@Qe zB01&dt`g1gMen0sDX-bO!8*~;tElGHui=n}5|(vb_L%gwnvE3>K)T3wKbrOg;OQv7 zo8OJitnC8r6Ctx&9@(+`ltwNP58ha#xFDV{&3peC8n}{1m{=F$*@e|fEWWfsADdY! zDNAx4E6rbXuNi(HRi0ftYG`{C>@7SwAPDyRW;$4lcjQp>D-)fdBI55>k354eCJ5AQ z%axyT`R7uYKY1gXIof#n6ug_cbGSKYiYp|n6tH(AAreTDCBiFciS}C974n!Uon3_$ z(b+=^Sk~h-Zyk_+4-dPCtAdq?6shp?H}t@r>)M37K47A=m>%g+;q zb8T0sCOsz_rv}<=oHc^E*Dn+hS=!ELD=Mc#EZYU*JDqhLY!5%f1>tkr&{34XDrVx4 z2@j&{{2>P@ZNI>c57fQz91-P4_6Kfwl6ysUOOtQ0D2q*5?hRIzlyfNvC2{msGX?5B zheth451X<7rQa0WbUJ4;)$gIUZhaCTUm_ytgNCBPlVcft=5OQ3_S1MhdesRM3Ktk; z%lTurEy{XQXKxn4V&M{}wHv%^?U9_|%jS7R+Fx7=IKbZ*f7yywQ>qYc`=K_tFOTn{93{O!io_><%*pf>LN3h!-8yKP+T`Rt`H0>;8IT)m;iC>rgoho^ABw|ew_Uby3 zlCGGtd4;V>622LWT(Z?~{hmNgmQ)$g6}|MORS*Rf{9Jb4Gq?^Iu@O{%AnLO^7+%CY zma?!?(|meLKR1SW+q@~`Mw57?u&dnnJ81~^f;?c&^q7k~Gc`>ds9%w;5kcJS)su^~ z#*=WofZ{Yvt7btG!I=TlbGj9kGlcU8a5UTGp2lj2BCD@|kmr@h0F-IIlTzRwOa0~7 zNO>o(O^J!-Nv3TptLTNrX78T_pRCIHofHAMc?Exqchxj=Nrsp|>hkcegv^o+=FPr? zabEerdxyHFvzs;s0DJa&4@$UWPX{Bven4{e;cM#1rWvf34GwA%|{oQ}Rb2DxR)Ee(|mfqQA>Y3Ud~MeE+rl!Duy zQ~0{f0^HRfJ`OM|N_MRoJ?Rm~iO)`j*y5r!bzu6@A+w!$pj%tc%3%Y4@Y z(8j8BRa25yZ#iCtOb75mo{^m|BN~)AG==W766*$yqFre?FLos)OTkF7%6!f^;R3L5 z1EdwE9mR|RO;&~+F8<#!fChq>k>DrK>Ic4r#?7yhv>7|;1Iavq)= z5}vgNvje&;#}xkSd$5W)F+5O?m#y(4VxoQN3m5b>N=%Vfh-m(W#iy`78f;6GMn|Gu zSEHF~@1JXY>mc8JOYo8IbDScDt^L0>cp{h2JK1 z#WbH31FOquIHwXd^sJqsYJ0J4K6Hi&&oPnvnmy(F7<4qHJ z?e+sNc%Xvk@gWe2P>mmbpv6d(tAbY@U;ABaCCx)icC_$+asePH=~oSH&|q6KpG3Ex zqQcjZ`<69lMwTQXH1H39J0{SJ{1|$nQ9k0mxO?WRvbWMcTCEASs?EJk< z!LKzNf@ugkI`3u%+3p} z1)TPVBqGETREh+ucUTw?UJ!teU91A~c&aF`BRFK6qPx?XE?+Td{BE}R*+Qp3apj%b zhpWKQ=Kfc)Jeu6N_{Y-bA)VsfuP)8H^kV@wiVlC5BatTBI2?5Ple48ZjR_OL3&knm zAohZw2;^w^ui`ZT)5k-M+~tU9eGW;R*f!nmxEpzDqA;kPBPk@fHs$5+b#*Hx<pYdA6`^K+bcnMEW5kA8^oU2jp}nDo5GMeJZ9Z%al})ssJyd-B!HsWh)_19sg)x&_ zMe?Zn-4dT>A!Ym~b1v^#90}KRUzWd+ik|}{p*JQhGhR82Khlx znTf$hx0Kx0n~^%pT>F?F3xd}5kGWvUE?Q|zB4Jt9yx>853!x&C;%#v`r zXg&$mxGq0bs_prhv*IVb|IrtEn#eY{@leO>sTBM5US_7TdTd||@@Fr93})7FMXoxE z4U&4?>b3Kg>Zooqy{&a5P5{mfPG4;8nTZo|KM!z`D9SRf{a|i;SevaN{ z9as!B22) z_nXZ8rB4ZCPqU_CDVb?lG!-h$ljQ6kBpADHs#^K-4!-rm99i=i>qP13!sT}dFN6`< zJg0h2wae`|rA#9tsKzsYNr9Yer2*@HhwA({EiZSp2WZ{TK9Mm(rhNlVuk-x69ok$C z1yT&uEA?9@+fA3K?ZP@l!4(bd2Ocok_8tx>2WD#wZ|1C7S~M^+mKQ6i=7-Nf?myU;3sD7@L;n_(iX%v$)KAa=Hc{_#9)WfT_#IwZ;B z-3Q`)ThlP04KZbRu6N zf6*&`u={eL`{cuQtjuL;i*KE7X0N6y&DZ+X{?B$Psd2or)FX9puBJjxS<}@unDAJ( zWnp%2CU&t9N_2N;Xq0_xYg5(f<;~r=kCMNZ+VOZkQy;w76{h6q)!bHX)zt{6-bm`S z@S>Ag4z_Vw@9zV?^;e$=c3Iyj2y=N(Yrku6UY!9BvaPf8z)ql7C2VRloJlK8<~81`LJ!adQHOWhR|#kiC`A40D0v#)h`lhrDt7cYB%WLms-zYn={RSA96mbG2Z+4I*9#k zJjH)sf1{8!`|q;Yj5HGK-|L(x_5UOOzuEZzD{nAqCRq7%qaOVy7(p*()HRSxpT+)@ z9}qoZa>2sg|L$s4;Dq-Mg6aIvJzweOCbFu zPagk2V(rfieE(f){U7oFhuKi<{RiTt*C@r-QyXL-atlu)k{V(l{3vl?9$9Jrop57e zWbX8y`|LUc4u+9!vm$}85qZ%IYj^ebL%;z#HL8Eb{ljp^G)uFbZu9&mbcY~)>uqcG z$ssJivM-4MpenHZXJsjG7pR*ae;s$8Dpq7+q%wYLyr)8}+Hoa2Q*5im)e=}&=?mV3 zTaYd0f6imvqWj2Fs(QLFz!;f#_|ihU^J+9r|47w7+e@c@6$=1eHJyK&4`O#Y-eEZ% zd$-FJb<767Y%eL1Ib){fTisBtggSC7i{7^T$&&-b{b(KcnHa9fWJGV{%%f5_ zO+s67vzRh18wD_G(8EXF|4xj}=ghWmj>j3(Qjx^)B&cNG;*$s_o9~tj2*d zK|=rgO989VEs}*ij^{N3j68?%-ShGoIg|X_cHLDHU`X`Lwdp|1AapQxg-^THZ$$&l zfQ4?qyM1K%{4#B;+X*6mEZO@hK#_&HsWuAO-iRO6fP)7>) zFy@ZdU@9uF!jGvji$yon+LaZ*&mtT10J6nHMB`I8xaer14QUY{|?LYQP@$4 z>7H^%mD6=Iog%t=_-$z*z$;+pm<6xSQq>BBsy$5?YhYZ`kPpJZ8z^!7Z%sA@ubLno z6t2yzJ%k^ln@jIAoMsT`&xWE02sUVUnSr+;VhXnb^RC>TAh!{_4*Jb6jYo-aNb<;4 zOMYB8%`K8Hm;=RU0XdK{Ul%{Bm;bp29fj5EB7Bxf2bLO;r+msT>%eX4*%a_CP?E;8 zkf?uu-Y7f4g+oVeQP>1OQ+QPRVR)A;`lHi&jgxDR6PpK65e{@r``1~!8}+d1SmjS zEx*XiA+UVBmC;{JHBObS0aGC^eZURrgMW=BvloZUb$$camr%~z7S`_(jl-5zZn69lQ{|>p#86T}8q6;H=iSjTLOnVvV37}228p)zPc+0Gu&*@B?r4^UYd6F- z)%><5;4zZ07!qomB;Dn~BV;|jxTHS&@a7NNKuG`SKVA|C1quJ7Bh}2f1B?zsRz?ph zXSZT&wdxrTibXh71>j>tFD?EeQ1Mzb3$enxgk^C1zdufu|VYhFuLU%!~g-b@Kx zTFr+nDTo%!RI$I-NnM&9+=NKtQ4GQ{4-dKbA zVB$i<77aa_c@wwrJ37o0Cnl$>g#IFMOYyxQ-q9Aen9H+f zGFqF{rhh9-?e=SMa;g5Tk%bWxKctfMf*z$5p!KKXZBsj?g}_*B`-f@SqjaPJ;wva; zj_)5mBfFmZY6*I^-{__Vb)MOpE1ythobJvnzzeLgU#|H?`vRGpRMavrr}((IgVO8Q zV2FV6r5%j9HxuU~b?L=Y`?&uwIb!#%d9JogDq-UG3=b#8S;fY3UG{sOgY*$#)3?fX zZLonciH51>F+Vl3BG^ju!Vdn%}264X}Ez4w6bGGlbbOv$a~|$|A@pB>zOkB zNbOP`n#73Qkm^@jBzJ@L-#Rc`az+_1GPglhisqL`BN4r$#u9?iKnB18vYKB+L-Wl6 z5lfPX415!deP`0oXU^?opJIKF-%gw;PwL_rD0;vAEOn9Ci)?idZ)63Pc;N&1S?iJ% zGP~iQV1=qGOT>(t;9^61)7>{ zu{GZWEMzPDBG%&4w%gmnc8|t$WurY4F&uZsVT{z<+mdP?c>jPpJd z9~yp`_V=;AE7;C%dr2|rLGfLZzPP|5T*>B^YlcbW%#0i!MCpn2$-^#ZdF2>op)-;- z&xtf`)uKBkGuUij!0|&NMl^KTn&tUn=w=wB#O7g<@~Jb!%9&)MO2?x;-H-9)l?xnE zSC>$4_j3Y($fKO?K z1ALBpPv)t%wv!v-WApQQCcrw*`qI!!cOxo9rYETWyG+mo4|4L^YjKDogY zar>4pMJn}JO(d6IRIb{Q?iGPyDHE{nU4Vo$nS+ zSA;2n`)%kVrYXD#SDmJ0Ir>`W30&5TnYjc0L?QD6JAAF}vLM^tyogFJO8>(`>IyNI zFErX=&v3zMR;Wo^;7O|92Y)d#!R^21(jd9`=GYt0edkndmPV+J160)$wC*R2#)$y{ zdTm4zcKKo^TVLjS!QAA-Ij* zw&Qu8xc1-bLH1dq?y>{Nn9QT$c}62*FG5mg=gYK>SB9R!IKs5RI_03wcKkF-rh;Qg zw%QkyYu6b&bTmXBcKcENv06`=H!ndqo2aJnK8wW%v8# z)qswzNw&Mdbzr{<%k^)KbnR_z3%aBS{;bm8H%B4QWouJ^cWvO!Jas_o-l`DhYqM#D zdI#rmW3bMphwnC$h2yd{AIoK3`sS@kZS&6pFMx`w>1urLSr>Zxb&7!1aIsA>U0{rl zRe5^FmlupEr8)Shw^e5@iw4P71zy*8A(S*|c{-ZNN^-Z6cSpCauijz)3Jct|GK!_e zF0c|J6=V!9=pBo)2>jx%_CN(=FPaIdySpw+ThG)Gpgqxl3r_nJv(T&vNZBAaVTIz< z-E8jToPQK6xaJm`Zm~$o(+VM?MiF;>(uo1)pNk_hznQdD_1TvIp3247lbT@W4U(K+N zb)zlVd%t}OtKek=RAfct&ZKI9wZ*Gwp73=kDZSC<&5Al&SHcOXDtc? z)xnhkQI5q;kR?5nvtXbntR0KS!*T7Kh1+pF3eXfE9r7qRU+t#>r0?e2 zju4;rvo9wDl;kUNl*Wb3xO4xOl---dCpGa;UHPb;o-1>EBdCGc>j<2e+30YXxSWH z-K|$Yl~P%HrZz_SCX|!(8F9}>0`n8)cbvKoq#@6~j(xzROoV7Q-_LXfdfB=5CN+AZ zVaj4I%o=+Uc`y_kA@=I)*7i0LQKAv!W{&~#&=x~eW}X{1*booeRgY{=5##h`aYwiOXmIioG@aNBG>ww|)Vk)x4kSw2QYdz-wRQ9I` z5`vnhW@qW%h2A-Mn+kc_i1GJ(O9bGuQblGmmjN?)&SSSmc4CQ1f_t-}T z9-U)B2Xpr(s>YA9=y)lKzkQRU((yZF1?!lvhn1M9M0xJAu4e3gwgoZX3>HZ3j-cSr zORXPyGt3J~{pUEJ{3*ailkxd1ex#2igvM<#+7o;L&N7<5l=_|a^z4mKq(SNNM=rP#G`KdBn6re6F}e;m_;f6%{Lc&_8klH2WNZ+ z1&1-W)>Ho2ts!Oa@brwWi5a-$h`(5$Srk3IcpWR^e@cS=QTnzsPXX~OW44jvKiL3B z??RXKG{wB_hoa=1xOzzDHr<=cEqn63?hRncDWV~Nt@lgn9;9pT7=qYUU81@RfwP27 zvkkAO#V=jJg8#Fg&N+yp^`^^v`iCU9zt8_VZuhsKlIi(m<}!Lyxp&kD=>T;E6oIbc zyWOpsC z-F$G)yQ3Uu4hoR2YCcG}J~?2>EG;vHI3g&6+B+BYJ#eHKq2L(U3*PL2g_GUnsJEG5pQB7QvwI3U666a7BAf5P*?y3_U$>BX=8>N~bg8UPcBF=#t0l zxaKi8vI8u)+JA~M!K+_T9Pr_OQ>AdT){fl09i>}|);Xa-K>HVSLtp3YYoe@7m7+Y2 zHFhoK-9KYsUvA9vofT6GLN0xJP!+pvyq=Y{ppZ~3>z0V3g|srSV$y;zAt*?4W9r+>Q+6^JXKC&UgF$PQATmD?-d{mm<=?I@a`dgd^hTX%Fpsj&$`8 zcaTWrYcvRkm?%(e=x_UCcD5+^;8Jhk4pxM=OLX_d57tSc(*AYM2e3efF(Uycf;%AT zz_p7fDTcn~Q|jYxf;C7Mpw_jX5BF<5uD8J1TW=UI-vSn=716cN%H$H;adG+l4TK38 zDt$v(*g+rIc%0z1@Q96r!?j-t|4Fa*?3H3de&5l;lG1u2FJTbHnhB#&9kMQc6Ok3h z1_KO2or+#@&+CNzjwDf{aov>Eo=hz1Z0M{ko`#HRdzok$M@OH+cujW3UdSQI*w)4D_Sd}YBfUNF?9poKCn-BK* zcw0UAIZpi@@=rHM#m~yJ0ZvX@k(eA!DbbMEv-VZ(kHASS`hT6-doL0zvPfq z(a-ONs>Y%~rUZ3sWvC0Nn{ki9#bG9}K-}-1Z>QAaiVPE3m}$8M-GKQlml*%ARw(Wr zAQ~tQVCffPFL_B;6lapfZMX+Y{$holkjqY3>SPZ<|8i4=HIrC7X>e3%`ZUOF?bVBx zAJ5z8=jPrWsIma?zl%bv-^iVpFyUd-3k~>tAvhf>lQ1xg>`g}#uS@|TL#33A>s@W0 z*Flt%^u(yU4F+}Ub}=@wdE5(l8?N2#-wF$vTQ&>r`tHWZL|VuVTsgQBBret-o_fNZ z9t__w%+8fv!Ij>|0UB=CWsSRtq;o&$G<3`Ir#G9ZTJ__(rk6uHsX~JRZ39{T-d{$o zYQ~c7aOQ5QlwN-|c$9YWD*lo;VV4VxYzH#16@FrxE(Yg3O{!jGLQ0-Cc?t+{oER?i z;-8h26D(Gg#cAf`Ed&JZUR~^D4BGpS#*lM ztB(Ao&Q0^E@m>oY1cv&xqzer>1U&jpCHsp?bxIO$(m^*(kKgqdJ3&+kO2c#^4+Go| z`ZiOY?4jB8TBCiu|@ZY%I@fAIwK-cgyq zgMVxxF8lV02!*l>tz7*YE2fz;A6qR_c(Jr+B5B)n!B3~g(XmGVgnXsVEPeMSCSg=L()7sn~0}D~yC%{L_bT?BgqI^RwR7a~h2=cP|XI z0O>ccND+^579HaCCfW^zDx{P(G{?-6VmUf=NVo$!ru3sW8+pY!)A2`zE~e5Q8&P)$ zPT~4o`zntT8Mzr%U!1DXqqZ@NJtx@PUBbWZN7l!_WwY~G zEyD$;`6XZ5QDCp@8RDC~3(T4$dHG5X0grL3eXVdNTrKqZP_Y>}Jo_l4lz)!cQA)9k_$ zQ3AqRw7g~OSRR9 zQJ=tmm}_#jwuD=Z|C|Scz8_6I`%iEuwdSykyL3a&e!+bq&7e^QM0E8>pd zpoA|&!Y|FFb4qi-ci20Y?rUl_u71u)_sk{*tPfPk${*n`kGCIbzoa`a2XOyX!_wx% z{l2vMRM*T}tLaG=1tI%&*_%| zdV8HMNa0G+?#)UptcR#noJlj4gWhGH*c<|`0p2@r#M=a8g?CmOl`WV&y zk6lM_;=u)_I{bYtuB{h;e#>SYZDMgobOyi?t{R8ZZKPqQ4$6R5L#Qhp) zPJ*GC78Q0HCmyQlI~}BqPEIy9`nnlY3wC96f$`}k;|mbv&3X0OrlS<=Q(@E2U;5GQ ztNH=*hgX-*m@Y{ux7I584D;?UK>5HLYQ?J?ao2qoZXbOq)s;GexM6aKwmr!U{Qgh~ z(B$>E|5lS~hjTT5s}sD|bE-~K1TrBVUKb5~99omCBNu=vO^7WVtH?rnl!Xn?l-^vQ z@8J&2iP7DfXR@CS`AL|SC=%}Hst%oCH4$#?!*ZNgR;gHOqJ^CdJKCRVpSi)txYlE` zdGSN$sD`%BK76S=qJyl)OL;Vy1O&X~`(pInX9ayWWPd)|@Y(Ci@dAb69k_lEexl1* zQAxCoU4yrZ4$2RR;&pLqTrC2ND#tHOshPk$CtFWFF%ZCGE}sR?%I^x@=hSxwpZTF1 z#Z`T5-+XiQQ9WvOw*>Uw+3B%&t3JgjQT^M#D>e4j5NC|n)P?Hqx&jasi{(z8pgyJ6 z+ApgsCy)z#I{{{r*W#>{d9^$tBa}YYISEoDMxyneU9yPtHE8K8m;w(dWu>W|aR~&b z>+f64p^b1+>3Owk`}ayEkMvUB8DP%C*lfK>9xYHBAj25t@{eJrw3FUU#}N z!KBa$=^u^&FB7hp{=!t$)NETKy!BZ$*Ur;CcW~4{*hrjU*($DTM?H6JZoU1^0r)Qe^;ot-3?^rwWBfYn z)L(J?xj@T&smtqg$5bPv{>b;tBO$+DkBIb4bJY42vqQj}fb+>Rmi8L6o~R@V5u;bK z%SKqJFCHe0o;GjUlSCV#=sk;spDc{3z_41_(J&v1usXp9Ex(nr6E6Q2Q1#{KF?GCB zza*#L>cV{Q4szl)sJ9O&>75^WLc_Ut6BpJ}=TUbZN}}?+G@viJ(&|Zo#wX5+-*uw0 zkieDDeHO9mw8?~)7bRK?17j7w=oaP}HVtMQYr<Zt06JzoHDpsv*jvnW)1{5&#UJ zI#oBhDzpAHFE?kx=m^!Ud<#P#%df*X<#30<7>frHtVe!^CNU9QUd#i49M4c(N4 zT7Vfki@)edF4x=HI$f$_lm&a}M<^6@9w2|7v_$3LJTSDwlPFB2VhPnm?AU^f63-)1 z;~!2(2uCK#au zdkUiTfSKFhcy)EVPx>nG=&kY9@#84sSs1$(U&}T<^f0O(5y@c9a|*%G!igllL8J!T3xTh1Wa>c}+q4rKGB~rb0yL{9~!? z_2(}N1%yIQm@?~mr2Je<=uOad&Sq9^y3z8Hjk(tb ziDZU}ABNClj1Gh5v-v*tIbse4w@*JnvlIF%=093E^lLUkx*Nk>X@umedmDo zG-^13%O}%D zRr7%JH*VKIqYdaGc|VkO@#W{1NxGanh+}@4YZj@{jH}T>h7j+3H6IOzgD=65p=Owg zzdL~TPCRRRp8(UMzhbZJVN-TFajTpgFKp4=u{@@vIS{YQ*_pC;Ckaqk0E4Cvmlv?$ zn1Nk4;b!Ywkt?11-@~TPO`6~V?Dn!di&VCS98c<`CV9W2Ix_?Df=6jQ{th+_UiaR* zZNJ=fI&?Lj1+cE{CrvlRux&8^xhlL!jv#g`sBoI;87NpPZ*@2x1LAr)%|4f>C38(- z%Eou#V+s^STY@vQ0XY&js!iJ(Pkwxf7%jORP54s`V_po4x4fGjiAWKR-pfi?-=&WRcrK zAO-&P*IT+368aPBK0D~8wG=Lc;@cr>cr3Zp$ckB?_b&gDPs{#Bvv=x-X@6I9k z73C`2A~z9V@U*XBRO2M8G?^Fr+&<-OcBaY?4DfLLv2qujLLF@(52-j9UfRPGWD`|cZ)~_f4L29xV3bfRSOa4&Nc@UqNkr0JWp{k zwM;4VHl#%+C8+1UO*$4)WnTL(pTZ9^iXxWe;k+7SRGE?)tLmzy7>1nk(LC(TNEIlQ zqKodSM+sQ-f;JvfgyA4_{CQrseT>IAZB~HBP7UP7_BldkCX^Pm$))%X4R!2#kVK(l zhZp|z?HvU7-e7v~(N$XW-26>SzELtVTKHiRbA|2IlkdrOD(a|3-MexKbfCJs@$n5! z{X@{YOlK`4ZCuty!o4?G#F5>o`0w6SIYVDvey`qnL+Q=?IBt>85z+WC2}jnlQshrl zRH3$jwXu=GXQBpm8a>=s!PI)>(LJZpTH|+kN98E*eEvi~u5UM6=KGc@$%*h$iykI4P88%V>W8D*yWr; zr~3T_J#vhjm8m>B`onHaB4HAgh5NS@V)GjxyDM_DfZmbWjL#?3e3HRm@_n^;==&x9 z$nCAId(7sCj%q<49YZVeevbgh8ze4i;Qw4%W+9Xaf3Wo!HO>Ka@OM$K%k*a*e_LK~+h6kh8)?+ff69sUg;%Z{-+O2Au$`kU;E? zkC∓&}^Aspke|9h7J{gJ|D?K3d2$S|IBt!$B`A5$z;=7aX96F{q)z*luq|_2(Ft z1$&8&1`1F_U*1Z@!J{Zv>iK&Yv4pKFogTIE8iWhAF1sY4p6h*+Ac@qCO$$zRo>u*I z;%lHX8?K7s)f2UIUD~rjl*i|k>Kz#?bo-L1??;MRo))(h9jVT6YP!PcYzjeYtaC?H zaNit?;sCcp_L%E~>-^5&;H);Yb7G#_k%|f0?^^8InsZL~j>ZOeg^RlZ0Rvr1pFFuz z-J3dAHLLoq`)4%^+f>hVyE9S4Athp)K*RkU)XcB(Dz7(&TKHM9n-7}gpi%sD zN*2zA)a1utmnLQEtg_NlG0&eLai|-tbvqwmFXVmjPFrf@d2V`u&3gCgeRny^Rn`Rg zes$-K3p4EQyS3Qo0s>aV8~zMw!!jh1ANZxEm^!&Y5;*UbKEzJdWOW;-MmIV&?3o{hCU_H_sf-c;BouxeXUW>A;t#gYi7Zwuug zRqp;)lssf)ZvLEU<<}BO%Rb0kf?^EYpIVxn?^o*G422&hO72wBg_35A*XeXl#+p#6GFeIHmwff7UfZ$aWh>z~d7(mRdbT%h{``{CZL z?+SD~zS60wKW-=aoOwO-nDK1}W>97L=Nz>o0k$G8AtFb@9ks3+n{i*7g`=YE(RXH^ zZqg193jBN6p!=h89y_TrImBbWVj6>A@0=zCiD8-LoZEI;C?BIy$ykodD9P-LL{&-S z1L-dYp{KZSXQw_h7Fw&%jjzOj>|u;pp?uWBW!G<1;mDq|F4DhJKL$o*{=zPv#q(z3 z|L9W!NoxN5U~av5k+-e^NXm*|=YSN}^#*q~`nI@}CY0`HAOHy}{pJ)25m+y&{#3D| zDSHKo1zl~L;l9OW@_LK@lPKkv4Xw#^9?YQ_;sih$vq^-og!j z%#2p#XDiiYvui5U(Jd}1p~ULDpauyOJsDbz^S;FiHyY}!d-Tz*-MFAEv)qf}(Pe*H zhh)ouzw|r+20dIYeSb6yqQ%QKS2I+tf5f*$6D_N2SyLX!p;7sjNKLR{SBbaxqWt*> zXU88SIq$Vy9X??f)|4BpGH1$auXDk1JvV$SWty-;FlRCPT}mbOKi}WK%g8!Nl_d1_ z%j9Zi+Rdj#ehtdP4nF7NXxIo5P4n4&P(dB5F-hiVXg2w#8%Yp(%6_eLBfQZ0vestu z#>m73bHQS_^SdgETJq99<<01QVs}P?SRAz}e9Aj2?;5P8+hSs3ikvpP)M#z(?7XUv zXo%hb3-z8p`DyP|e=lxtn45IM)Q!=xTuJ z*r0b2%`{Gpkfp}TsCW-y_J2s+XU2c;6U@U5@}s&;b%?%%USsh7OAP%B-`~XFho2dy z4Ae?iY*&8$`tz+W*|MU>piR;f_h$m!pKOKbj@Tm8Hbgd&Gu3BqDpUQM&HQY5hgc+z z75xWv#?@s{Bq)2$sw(fV^5A?RevuX>;B3av7A`{QNskm!dw?Y7cXqb!M+O$(J!z>K zD$3n%pDek14&hI|@@Wd==QpLd_q{9qwS8JBC_LgKHbm~TZ~J9UBbN}C9?l;w&={zZ z8(2w|jPxm*py}N>Wu+Hlv~fJc7W{O!723>zHtzpSNu_B22=zX+Qic5MP<0srh!(Uj z?PW6*qc%o5A5UXTA?%2t5LQSa<1to>|32q)53T}KA%lQgJ~YGczsJF%9#@?o~*t(_ZaCsHMJy6$$XjZPJGAO6~n0JE)N( zFurJIgt6{xP~cM|P0g0#CZEVH24=^5la&wQkDZ&%h)@N?-ZImenNU4W4o`#0Ob zzx7neZbNL2x?s~T1xV`FN*S-5U&l8oZi(6*-_6Iga#7d`-;1!tk`})0o5Qck0mc?)y7$r zJ>LPd03^NUVzGQh8Q8%z;mwc=gy06vHe-D5gKSGniM&Du9^};IWGlJN4ck@JgYNp@ zNH2ZF`sum8ho$v|*Mq|QZs-!y^~zs$FDTj4p)*jD`b;^6_iyXk5Lx!!+#yi6yCCu3 zY8j6csR=Hwl5&j60g#HH;!Iwp@#VZ2*qaJTPfs6`l#U?9oq7C>7kitXV?)&HX^E|B zsDY@ff0d>FJ8Z>zS+CwX9+C$apr>d&E!Ca-!hqe_R}Hrx=#ou|lwUJQ`OYJKH15Xh zDIwta8K1(v3n+FzTYA2CBX-3Y|E1>7xH;%lS07jUr4aY?adpr=GS{w9MS;{A>nD{2 zAo-&59uVYFoUW9@a0hPAyVv|dN0~);SjXH?E6CVzsw+3x(lF(pgT7uy-J0p+4e zI_$>6`ubBLv5rmAJIZ0k$WzDR3w=;~>6%`=9%nsWRREn<$i-)`r^}PoltW3wAxgcz zbyZa^2#;AqiPWDBcUZ+o5+9pf9E8I_?}B%srmto{ChuwGyBSd5p;ad{r6w>mW6N2mf9y<*3eJNizJm~q6 zG^8PVE505vH$8WB?;CSNHr5|TqT|LM^cNaYYyWHSgcA#1iaXeRxl~S+gW;&KtY@87 zR7VnX5eE^^_s0xlO}=y5E!2PRm2Z->#yS16Q0ko7WdZ!3XYL)CfUgYY`6c0+MaCj@K?*kfpZdA|mb#jon}hG7 z>2M|sU`j0tVkBL7W_S?G)zeGxuw#N|nA31?V9k@`#NAd4la~dta2O05}4qKkS zArb}()O{7FgW5P=f3gkoR-CZ0b738m1AWjmdSk@mFM(q%3Tk%No9=(N06Ivv;O7c_ zc0xvNGvb$4#E5FPYr@wRE z%@70ak?zV(iZ+erY5(w5G*#zW@8^i0+xUR&&!y zv3vbmv;B;M6VDN%nzN{>>Ec9dkR3P`!rM^6stqf?`|47DEyues6m&3?pI+V(?QAI+ z;g0)QN49euWoNswprvekDH*bjXK>1MPh<67559MYbBgn6Issq#UhCiW+C7|oW#dR! z+;;CxM99!0d;fc0iu&+G{yQ3#`#4o4j;?WcAL3X&U^A0MRom#<w$}UMAQC`1@g* zf%HD;(^>K-yLv(s`FHNO<8E=0V*T-O-G~4>J*RP}+W-n!{K~=xMSw{LN`#6wKUQ)t zN_52)cBfEa9t({wQfaBK_zg@bu&eLZ+~grdLWlK7d1NhIrgItNa2?Ks6WQXMKE9yP zD`O47$}_DfDI*~VJ->%)-uLkYkaxeTMkn$!NV|Q_^6@ripX8tAkN}iBGdp_+!5@<- zMP|m*(uJo}S}*XkguVN@<+!TL0%5M1vdJfsBF9qBMf&HstK+ki@MNImt51K z8Zm)65`F+rX#Tt?CXl7r33ZOqeHZn<3Y#|5wjPqAVxV|UR>PH_XlmAs#}1#%?wT!3 zD;J0o`N1xusX4hdRA}sCJL{}Lvr!bewe=dy?+u;lYQC-)?ynKZ_I)bAo{zid9DC~z zq(J5&a!FgyZUSc>tb2{8im7{^7rZKA3Z^Cfz)OLq`>M9VG2TyaiOVc+NUIa#GGnP( z`4s3w)**Wq$%E)6t#KyH3@qTrDlFwu!jG+7&3Vb;wGs?~4#Ih|P0I zLa&xZU;Hd{oc*aEoZz0!U3*VOMf+bh=T2skAJ{lMzHf!)1CRhUROB3 zhcEkRAxsq4yPbZILKwk{HX=l%ic1Vly|Ad81BqN~s|aVX0bM}zW^_xn1&nVzspDAy zrtwJun6EZ0aW58@I~ow};@@So%`ygD-}zzJR@~yrInw z`lbEn4vE+~o1U?lY0Y8-o}2P)hUNz@qFIvFdaD2+XzeBy`{>V0BVM4Ylu!y7Wn_u%h(^ZKMgm2K{z6tyKk?~uW+813LK)BC= zYmjHg142J{3m!E&YD*p7E&$CeYohn}ZY$3k1_$X4h0s|SupiuvpQ2g8TR&rii9P>5 zAPfAHueQN!Uu9piwmPYw{lAhCrbAv}@epKjtD;iv$86&zbmw8X1#~kStN;(h}tGnq+K6 zI)pvjRh=bESmdS6LH(j_>V=a=$UG&uX&ni_weMg z&wbKc8McW#TDZpodD8!`aG({OtY$YEj;~>40HCii^h*7JEmkN8J8Upbo0{o)xbvTm z`qav+23S6gIkeAdEzj^Sb{Rlu2{L8s_#^9iF3(HYp6(~qs`L+2!M4o%M7=YKDNHP; zcyQPUb%M3S`2*U{vMHL#x-E9l8oVV;Xo>`hM_%r_#9ya>_X`;ws4bt!$x1dhkau7r zL*nSze6)uy9#Vbp{DT(2NF77eE0Qyz~Q66q6S!5D9IGx#c(vMhsq( z^;^{&kx;^5Z6o(T=>!-g94q<$KMiblx`vj**gI&LENE!Bf_)_paX~?_0vO@#pjkLO z9^`fg0It~#%pdngH&cbHGrPU3U^&GPpZCcRLD~)iM==+PSI?lLUJXt z(a{N8S0kz5g-{yeHh_yXVqMhbzkJ@4PBzUszw)>nLXU)0nv-cn7K|P4xvS@*ce=SZ z-HEV-R8TNuCvht>*EX(Mblv8fWC+Phl##|g>CX-&ONOtvg`p#{x<6odr5Rr#s;R@CGO!DGQ(FJL6&P?7F}zW!fInr6E7D#ULppDmB!7 z(Lgowo1sZB^VxVydwa&Vy*mV3op_sP?-q$@!vAvt?k0&ST}(JuCMFCxB#H<#yD}Qm z;DgNxai2ca=L!U{Rx)eq62XwFS*6^6j@r52XfYz5fo&wx`udfl+fqo|K)^r|R@52+ zLvLEAnmlRXQ%1<5zZY?McC#ayvQ~5>ZgN4>EQwZdcFT!757<@hq$PMQ;irUCV$Ol1 z-mU2=!f^HFNTXC=;-|$YjrOGBE6qfco3M=d81z?y&b6@J3ba-4@s`$^X)L}}GYB{B z*$j!&sp<6z0z=_ZTZFEFNDvJFuY{Do-1-)&@>xyJ%QvP~>=DOS%pF8|jW%Jk#=#%# zxX6BiDHMTauRUrSx;qB~<|2V9cKtx?%^@7ijSuL&Z!Z?|W4Swe*`XTN>Wa{w)tI;& zh$PZJNGI?4n0=&QTdFv8!UY6T!wn2IPuR#9l~WM#{=$ObwwMc1CS-fJFD-2zR&k*7 z{G8LV-3#J{Ys$O2AN<0IAWncKtma&4I}<=MBng;(To2kHR4XMhof6QX92qn%OA5Ow zKols&rljsJOEf9FkR3N|_I}pxOH79IWHhtXYd^j$i6{ADb9uiVwFjEI@0Oh1|NT3r z?=emV73PW;TN~08`)B|gTBOwIb3~P%+#)9RV~4}dg#!%cke@1fbNdm;0a~Jovw!wV zMLJ%A99=+~nmOw=#eVrMUr#Mu`U0Q5TxU(cw#f2#@RX<;u+uz8g4l-+Jt3vczTpaa zXqV5wS#)?PDMT*-Eok;7f|FE6=e(k*ZluR{Q?rCit>$km)zdffh}Rqxm6)>84f&4 zaMl9pxBK{zg0hniDC;5oX#sA;9I?lTCQV2p|b*ndxzO zqkzeT7TJ`Xf5v-aJ6gPT!I3CYmO8IZ17#I#UsUlY670`W#BG1lmz_#;9-1T5zRtZ) zFXv3}K9L(XLx6`2CyBAKqd{7Ni6*SL9=qO#NGIyj6#0w-F)8siSzcLjgnJQDrpJ5B zn<-reth8k4ll$Dtw`N)ZU}hBjs$$cTYPdTmKc`}quKB?|wL8hv?S(}Qe2Ihr)vj^; zE%C;@`m^v~NfDJQ*UojwiTx@@sO+w4#@UUwBOUgW;y{jylvh}Afa)=x4%|jXxhVph zSW$c;f(RjxO`0sA=r?*oriHeEhwtrdHdY}9ZJ=XoQ`a4fC>qw%Fa5gsh5!PCX@D*H zI%9AJBI-fByD3MC{9+Iex^x*2mSy_Sq%hqW*He~19V}IUtJmQ6VRm4SBbe6+NGgm! zU-$aMAaUcI6*vJzW4wqYZ23XdubQVOtUh~BWXZ5Dd;Q-b3KK2362EtTCSx4df->D1 z@qti5@h3orjUw%Km)j#QP(FHcr>fbcsMCKRh%AG?Vhh_PV4#N++Akt?e$BFw&higU51O)1 z_Ex|=^k^`>8K;^2(b)&+k)ntB&>)n|XWFIiz%=uQ=TX=rYx|WKX&+zfssgnP5WeZE zamg}?9+7bIk~wp|C9*+$wCXxWatk*g0J&jG$cH&`vBroR>q4*NyL=rRbEXLB+@H_!Vt>0 z7)G8&sRrg1bi3;!k=o-^+B0|^v@q{2WYblFtXIGezX&_bpmpV3gN(dOwFigWQ2Cx)#X3Q$Z0K#_%G(6Gsm|X^`vTM<1 zt~>o;6At;-_F1TR{Nwf?+{=en2WmEsI`<+I%fI%JA1O^mTYPgq!t;)sCzA+zT>t1( z=<-cw``!4@W0AD?%z;l2{wAP2EYkVtbCYm< zkc@R0I|L0e*^XZMqdLL2Bu8}A-cEjyK~CZCyqXzpDhsEifQ~;#49Q`{konS5W;AQ( z3j>L?ndDeqSANdg-IDDh;P#)Q{k908O1db{86Ma8Ve1*@6vQs|)~HQnLSEyP)0;MM z;8vwXU_gTkS*2E>xTrKGW(y>*(xjIOb=*UzoDjb;dkPw^(&+j6PV1FGd%7U2>Q-0cwa-#jA-h(0U5aW2~iqpLi)Rnb*1$&N*{&VSZh32k=S6G6E52JRaGd%%2;@i*rs!4a_= zt^hXSu<1Dlk9JCW3-84~aW+to{IF2sAJlCQDuJ8|x6*%5!_`A;cQPztlKDvh5^6}yh#-5ubtWh3kyt-^aoZE23M+SW{qW3ZLqhN%rN@64 zvqqc%Mi{H}m(6{|&wVFa!RQo!wn|hG|6G{>w0N0q38rgq8(!G6r>uOM_1d4v zJ_33q+bjAP`nz+*4fO=yGVVT(NYW>{dLvFx0!ieSZE7Vit7Ca{ zQ7K_7<$P5agi_^q&__)s3#IPCy(_Z9`A|1PYa@QgVE|nHYtImLX;5D*DAjkn z{-xqtOGCt1&2@NKRCEJP^I& z4FcngU_Uo1c2l+k8`sO2{&&JHvdLW?o%>Lsvw|I=(+l3EUS6 zqq<=6FnRdx!9Dt?Wou23)nG|HDMZ8uO_k!wKR0XLe_z=tH~j8kHw@!KBMCepwL}ko(hTy!xNNN9pgX@+6ET7Z}gaI^@vO_c&pG_|gbuSdK~?q(>+81g;!(ZSh`j z{*5^jgUXYJpfaU1{m}`;5Pt7xVOWq9EjP=WzoN)XEzA1AP$mYMe}kV>TJ)EV=D%d0 zV0*Ypn`fbs8z8RMlUCVU#auP}A|*`0tSd+|%olT65S*j781IM{VmLsQM-pw*5d2dr zW)$Fw9(PHc84B4j00&~FJG%<~dwkVK#>!*^K}r(3-)l;q0UPSb{RRP+B?zq=%oQxe zB|(-~W%az0$7%#tqaNOC7J!xK%2phJBjx;!^& z{HRQzK><#)MOk!C}8rne;T zypH5*1dVF>41|~gt#PZyV4>_>BKavXG zR7bCbHT=!n?$bIK-b)s@l!Iy)qtUG6_mI|bDzw4TVFHYDfG2N7Au1;nh&2}UdYD2O zph0_fk-}%^=>^j5vg}KT*%=jHN5bvGrzITQp|`r}awf`v3xxm!zO>u?Fw-2_xRmWS z{VY)slU;%76d_PY&7@W;t$yorW?H(L-z-?&g3wLe>kGHwt2nBbM*G2Yp~dJ%ahJ)$ zyN=VNb3Od?XJyEE>_54!;dKP`Tn(Ix+iB24J5BKZ1=jpgdPZWMkn#-;V()_f-Fkc) zv+G#PCI8lN?Ao(FsYy;#E5(hzid2}?^C(J#rK`);^kTunJhqYE+Gz9USD>z7lld=T z+W_{f2izn8{w!8|nyghE3q#2>2WyZUmcnLTBO7(I5zDc=1$adB7LIcTUADjl6V-@Z zL4MAh#cNI-@FjJAW$$R zgrrv%5z12FVL#CtRH09t4kdQNnaBi;0hN9Bb61#YzXa^98S&2mvxXF3|8FGG3U;rb zb1IOHErJ&MzSF@5l%TuubZ}YqWgO<`VpG;Lmc;obgw1o`Igo&BAq#37TxG)o2x-y2 zlAX8cS+HH3uYG(tr}7DhCq3#iinU1%HH=I0MUl+64hHt=_dk2w)O*s>5bgcVjF8tz zrQM^(DQ_=SWZ9(YC_uMLocbo3iFmZfC@lwL+E+L#k%7EBh(IeVwsAFfW8s=;nNK0@ zXa=GX9Km!>4Y7)u=+LuqeO-gb)$7nn3r>`$H>~J|owyi5MN8~4x1k~svVJB(SJT9Bi!BXx;dAQPrXszVrafSx8h~#MvPN!WZ&vO`@A^WiaR--qsN#Xmb`3=06 zE&3?~xMbW`ir(BA97m30yRHYBAOo@7IC#ufp;r)Dkc4-|#78VK|EWuML0owGsWcEn zQaQ$bTQy9mfVCjR=dLwNH&gCcr)x<=_nJRWH5`JNP>gkRj6}Hik63qY*V9n zCu6Ea%gK8sQaP>OdxL#u!e1F;NdO5e)>>pp*oZ<|(@dROwIIh7)Q-5`avWJK^&Z~u z^ZWpT+LUgc&vbCoZwJSBL@7zGym3n{`m?+6<`Dpd55Zl*z9BgCA9{KjR7jFnm6#cY zb)pv0_=B5RPA{OaeE%X~B;Wa%MkqDp<(VL1YA5c1?}@Rss}Ba2pL_=o5Ai|O8=n>s zPCJ{&5g6e9B;Q-=(X-*|}ZObFV&njV}J}H zlABG$XeDKn{tguyeYrksu)iBX82WajEeTreBzs<{?ib(>FCNnqjuoA5#RL!@WLU0u zv}5G%sMKEEt6aka`E+_!;_>?p_JhI6l`}oAj2l-Y!@o&qB+SBM-L0PI#7dZ4!(C!m+?i!026Z52btWaON-^A>uBgtLO^E}W=tJ>RTsoEpPqU3YC5Q(uir8iWL z_aGb0x+&ZSlgz6nyQ7I7B$|~*Di--=EATFw)I>=BSS{L3>HGITEEj~32MW-)v0zGf zmyTe1xKch<%{5Z{yWw39#C%Vm=ZmoIhS&e<@&?a}*?l9)PwzNo*yJ}KX}ZQ<0FY#0 z!(I8=3E4umGJDdu85$W8Y#}lG72zfTa(S8t@B4BPUC-{pnKcU0nP$4tT#K}Fy#5~{#b|y z*79@Ns4gT<|AOO)Tcr>jT|Z5A@3XqV5MwUgLUr*_0^3&m=-oQGe1SnuWt)!WV91NH z^~EMKh#S4p;jcwA#np-{6dTN+T3Apjmun4A=s<`lc8-$Cd)R+QNeJ_j>>xkS%?(v} zl=U0fAtCor>@Oap=;ahM&(bip08l>#NHW7AR&e@7;tzxfuPGHJZymH z<<;tW%mgXjlG;mUkU*RRX&kcM8vr`JH_`B5v=z|Ljp(!g z=X!T%$U9f(Wrj45Fc<5?_o-B^R=nYAZiwrg-(22`vYNMM69XpqxLTdcM}xKoYGw(absIB^UT*>8vhO*LCIi18dTYh?;v7l@fJ zzQ684EY${G{=Y)M-6(+GWWQ?~xi3$JgLKY-K^FLySVx9Y;)7w3aK~S{od#o&Jy7jo z-2D?Fd*?)M3~Ur1B7U7)kF{GjRL_kHk>xC^hj`)UrD!K?hmhd!4he?scplhR@lOaY z6v!5QiUV4XaR={028wh`@>*VX2)OeT1nT!|Ag_8?bR^MMlnTDyZ}Y*b+D=JSw7E1_ z6ks$V@+XC6Fkhn)>Kqh&kx<&GX|DPBaxr!v8uUPscg_A0^%a0ZDVgc#q6i|0g*>Eq zXGZ*MwBIO1i&$31(*!0I%fzVS2EE{ejBa^5#i6s1J2p0teHrn5udhU>CQ80(Dw9z^ zF_D9v`2BsaCnH{f4t+uCE&oIz74Kx@-}9j?jjA#qQm1U2nqV6@wOZ^Nvam#_{;c)E zHBf74Nb*3OTx-AP{M9vM>+HhMvj1pTXvYH{C$kSZy^-@vTTxI_L}nmBCQOna3V6O$ zl>hkS8;jduwK_-`CKN!-ld6`?hYhQeBV_1$D6^u4$F4laJDcCoApsa#E<*oavv@4x ztXPwuX^o!k8WXj&5FI91!9$E(`NbJMJ{W;@Q!($}(!$&w1-!MF5hX`i>`mYlJ?@$Y zZvc)pC$4ZSEBNSGQB8H#5H~xkj8=CoEl4bc|I?QCwfy_y}6W>!vSpMy?FQzc20Q^I|>De69G}!CG z>YZT@QTV2le762v(GEj^kX-V^HQy+d@hiM*3u)Q$arKj46x(@dj(bjy`19YdV#{PW zado1b>R2FAD_CN@X42gf0Dv4?(x|Gcis^i|{6)p!vTV)raY-cl&=1Y;0jC4iE5toE zj0j2rsQm3@U{Fn(UqON97=Fi5+^dUtU_}AK2!Gs$AB^thO-=48X8y?DaJwB1;rsqb$+}g1E7>^v zi~i?W>y;t&)t`xB3KjUMCPZ4*rdz5QEm7D`mFj3V{sQtB2AKWT zf76QUI*1!~J23vLnKwZ`C}ptpV>jBLK!Y3?n$6bK|4BAR1g9C4fsrw=`#4-ph$9FC zJ{9QgBHL`;m)ej{SUNoHNnx9_CGzQpc021u6&oePi!S1_c!uP&nZKC2 zzfAtRov+YeXF>HO#At^Ad(?An@&FUoy$ws@F2Dbay zH#w6@WZiWqt`QR!O*ilJ36qncGm>}^C>p~Cz!|g8m4IHvJ;}b47Qz+W&t6czF zf+%Q zai)x&;dN!fW(y&t{BS z6ql3`>@TFFSt7GR!@F_;Rp_Q268ANlTpEBZlpx8t1lgC>=VG|R<@@@K>Z43Cz) zxj=;V;gQ95w-!j63_#eTX8cxZ@aN-iKZFdQbfynE!KPEXM8)$vwt#+ z4!7A)25g=@6|TIOAFShd+V8tvt9*bBk{2%$_LC0jrfnlJ4GUqq0g&Y}1pmV2d)ENC zXm8&}tDqK_qGKgLK(dxJP#@7a^_Bcn0FRxswe#s=t@4>&U2nnm-pC6QuVbb8qHh3h z-E})wH}xNugEQ3>l|JFhcO8Q1i2{t{grx za?$OKrE-^gM}zr)nPh%;@Oqf@-M0jAEbuJs!i^J5L6p3qEl^WbKyHhp*}VV`)l~)P z$A!xtTNn2kb`Im9km6$djUVw`wtM6wFFEpU`rQiy7|$v>)E@b%P_40Cm$WVZDoSsq zkRbTRiSRC~boV_TkQ3ylXXVCTY}Fy19x}IFe+i8rE8Nif;k6|HYK}n2pLHY6Ias3% z$eVT(P$e8Ri*#@C+xTb~s>%=%=EZ&)@-sF*K#v6kLTi)Pe`-p9fXn z7;mw8>Uy^)?R(wBLFu3>6fraH#JVEYH-L09i?}iBACzi1BiVgj7+;<1{Y8+ugZt`t zNhZXm%QYdXo^n_wJ36ePo*=cE3|(-e^Q5t}vmj>vCs5?1rc{=>E)hz5$eEatvhpG* z-6vAt)W^}$u|?bCnL5GR8#Hof$^673Wyh_D)mC0#U;nRvRYf)?LPL>!j0J*JZJzCZ z%xcbpezqffoCE%+JBOM4n;Ebax=~?P{rc6>fE*`%K=P_?h`zZ|Ai>(2vG47+l953X zH61~erpFgOz-+YD^l^Id(4x%X?zXTjLI2l44jRXmRiVfkkILVNP=ePdtRmARJX4*D zCPv6}lo(b`K)_U#cb!5a(Nm=3Vu zu1>{=VNn*c(zCw;5FIjT{av7C1s}sZVEhYUD@Yjr*3x?Ygi3_8G40>KyoXM{0!?#w z=EnGF$F43!6%(zNw;!v5Dy^zP1F*f2ur3ZeK6lsp*sBMXvvkM&I^@klbW+X?Y~g_erVH3tVv9wfgjoQ}a%s%CqhJ z%>_#AHPqphm_fZiEIyX=S0Z;*d9yl@aWsZ_+|01}%F zz!&Y)qrnM3Ndk%zW?kV~8VV@jSD%AghWbV7xp@~XQH@(GavX0^CthDE&Bm7`s)sLq z;4ZU0er`foQM0WB5V_9QKY_7d1IAELcj{`thW6u20Ht^Yy4@F=?zlgvJ_*@u(wXf%j$JR-B@`S2$tD#y@kx1Cuy^ zyy+=AxuaSyZJ_KPeXKJGH`f-nN%8rM_F6q>G21^!j$q8IOrT;_M^7B*i=Aagh$u2Y zd*=2u18mg!-TCo5?Okl9WhS0=U3&~(m4OmDvr$>LZxt~kbqaVh$qt?usM%Twoqtx) ztar^g$nQ=R7Izw)5(r9q_69Z-$S;9Fq_-4gj-tvp10Ab$=aECF^=`y%paU_WqstBD z=gx5!k-sp`2w!mJ7v8k*24>{srpRP|-pTH0qJ*GxX%HMFBRpuKuHrmF{$7uI`BAZf z8P}K{uY?LOJflaqY{dz8BmxloCIRmOP09rtfe|pvuBtO|eh~@OJFGU3TP*H=7v&9X z@rin5UH4tw(O6T`*Vmu9wB983Y5~7Eg0P3e;q_tm{iJbiskSC*HqSZy`!F|o8F)aM z5%^qT>zb`@NonX$H5h1y%AuKGo z3JL+)aMv4TkK6eM!yD!u+#wkZ^_r2|(}CPZ0NaM*;scx0k*x&F@CSAS-{^N!tM%X# zpsB@&vgL5YPFBaVhY=NkSokQ4&AUFE+kVdijv{OH+3XHH3U33`A6Ol=4gTKWly8)F zECSgPLJfTCo{0%jW1-wthqr*bqGzozBJCDGCIzPxoqy@Yh3KAF_i5cyf`s)8+t(7i zo|rM$cx;^MH5CV4d zcj5_gEKQQ>2u^y%O?BhmQTVN37Mo0tW9JSvXw?4E;a%i;=DIq~XVeW9_C~=Vef*i) zdl!Sob@4}dqc%M$@&LF(RBTv~l|$MMcK2P*vQHGcM@Iu`^x!w9i^ful{Li4~P>tpM z5+etF)<_D-PGne7WV^eJOb9S{2RTNo=k5f@2Zu44g3<;-2Xtwb#kr^0i+!=xfEOnO z4m)yqnxG9}#Z?Ydi7a^*yYcC z+1kL}GJ-8wKQJNU_0}2w0f?hodNcLCfc33?C!}d|Te^%3H=D zjIT>Htd7x&+uU~WBK4&ghazVndk1`A4{h zo{M>fVwCf4dfYS;j+@HdAYi1;>x&PXe>}t)#D^1PPPOqKG$Yc_IjSu5AZJ^LYvb;C z3aEVBeajlPeLS@y<7V5;waVXH&;>_I$#{0_he%wtDq(&A)KP5EQGs6^&o7Mv?7sl= z81T9{au;Qs`3slmM>5<44w9~HTR`9Od-$LhNLMVW9y^Ki)VGk0y{Dv*_K$q0v#%GR}`r2+Cbz|LL=>B3}9 z+X_)_fFFGF&kN=AP4s+G&~2&Ht(zi4sG;DEtH}e-_D2M6Y>HTGJXl5^%~=6`n1X>kZ1k0AEWI3E@1JQVCOVO{c|iEY zZ>ifYSpWt9jWjU>F%XW>T2q})f*V30 zFxV=}XF1_+vR+K5z}aU;4D6|yn5_}Xn#kdqXL=}Gr+>sRaV1!QHb_|Kf8=@2y+zzW zV2Q_7&7PTRg1b9>>aS*`Nw-cRHX_5DcpW>(Gu^t&(QI2vE_%H&zZbZJ z1oM|Xs8@clhF4-uD7?lgt8o&*bgO$P?VIrY;bA!%yZnrUA-aao3C=%Y#%Ierp#&AU zWeqU#8%+0>Bg+P)dU1a5Amkthwx=RNj_%q|ZJ$_2S|X#+&kNV_SB#V$uVRa)%LNf5 zYCx?!4H=LNq#g?pH0+CW7by`tcf{P$fZ(K=V_YA~5XVaqKHJO+N1wqJa@}OQ{1Fen zW_W+f@cbm5uUy+$vn_v$0uUVF8!1C&)vdJS30827E2l#*cR~ZD=`KfX1&v*YF^P;Y z1Y8sp6c_$whp)8b6cEn{U=o6RwUPVvF~Rx#={ci{v=4D*7VyHW`ni**ESTeR%(&mg zM+OQw%DyrVBX(~hf=JWr6ZKpk5~N&{GFnff5ItmhRpW+g^`<8#HU?{qfkG2NCZGn? zp@$=mC_sONZ_1{3++dMKMpQWLw6&mB7q_4BzCL7leq8wUi7MJfMc$6& z)E})0R#P&4DVIAGuP*%i$qy|q3-lSM&&!2h>(t{cW+E_B6IVZ3C?Dmf=l-6wkLBl9 zF8RA!KtW#Vn*F1c(m$${d1cjeyup`|lL&U9!1JuBrB&aTx#LP8b5q!N{LIUjDu#g< zrU%LnrkztqS)_P8!F}F3<3L%{SNd1RLE^E5bKEO)TVpbuh>}U|I{$O>%X0nf)jIKs z;cUt;kt90CPn5_d73lKibFp%Xj2H4|cRf(<6-iD-x%1m&wV4f+EkY_=H7U2{RDCOs zKdJ%4`W|`DJ1(3>^Vk=&rtz~WYMvI}>B$?Z^z?KSTdX?cLCo=5R~C-N2Gz$~0s`!X zvj*3n^NH07pNmRQj#oIN@1`j`5ntNj;!IPnCV=V?|D-XxOMX zg6j@hX*1cm5ZFRhMwD1bXdxl``!s0tSUvnEV_)}&&DzyHwJG!KJgcou{-2|<$jC@# zeI>q?vZF(baVMvj>`!yK*>?{rbHzI4b=11N$#+=G%Pl^t-HyNhHb<6|;0W@{R2Qf{ zuit6Q-AWU|Ia7cfk@ zbmD(W`ilAZdxSauno6c7jIBea&E^p;{CS|R=z%5CqHfbqQr1TV<5Lte4>Rpa>Y3kl z)b&m5a8awig@3VaD#{AqaplVW>o}&&>IoG0aoAhyB3XsH3Hzq03?PrIG_c9qXXkiH z$&G3INVFie`}$P|ZQbkWWc;j6MI`cIhyuB%HFtng2rx+XcZazWiFtT%@YchB^)`bR zjPDZuuI^udgi3uL5*?YQ zsPaNoDfwhd@mYc;H$50A$L$`>wjv!CSbvpNc$^J27Z8-6YEmqk^hE?pc;uOC`I^|C zYeEBK9Gj7F4fM3v6Q;^$87^JS1?4qa=7~l)lgv5eo`OlO)yz@#JHaGV7$f> znQyUFxlO%r*W;|KdlJj6)#`Q;Gr5uBxOxof`UVvz%r#czI-FpCP!LN0Hpo!%6T2aM zdo5vPk4Yz4c+zD^&C$WhAK}@S7c~B&JZ~It~y$ARqEc&yMs^dmPp=fAy>Y zk_QW{urZe_YR6QXuK~F!aJY}5xq3}zCS4_A*E&Fd8Yw;&<9IFpbm5%hA)MdK;u@Uu z#*S3p>Ql%lZ9!3s0-Q8O`sKnL)=9Nr%S$1bbYW}RABWNiea_iDJa&=kAaISu`1{E(v)RPN zLZV19UMo?kOBZ-Msu~yh+L&(sEd8Z-K6%8;$gCHeI!mCPYfO1i5MnCw+#X}YL>czz zpuMYJpK1|t6b+&R<`p*oT z>;tOxlY#I$XW}hs+#ue;^|9B~nB9YUb=H^D0XcrXDP@W@qhNVk+1q?U4~gm<1T=n^ zkBCB^;nTE#fKmVBY3G6d;DuJIep-i5pEbANkO}kDzI_&doj=?##AJ!!X<|TnnD)cf z5oq;Gnlkfo#5yJg=dW|Cyd&qez%9ItTC8xQd6LeVoQH1p&93smHQs=*ekju=PWofu zk&bZes5eqd0cu_-myIk!md74yHuNFYQcySJ~`cn+r1e5CTE!QwksuAX+|8`AfW> zsPNE(gtf$(1=l8AC^STp!ss6idwf#EBMrB;`5A;K_OskO!ZHI1q$)Ar%tmW9v214> z_Zs9bM9fA6zm_&}H_W}LOtE~OFVDolE*?)5G$~h<>#;p_;&mJx^$wQlNPP0WDYft_ z)7e|Q?`d|W)P4JhrMPCd%|XMgr1T@!sy=m;`%bdSL0;NaV5gnJZu$K6*qp_|5EDd? zB=nyz8u{Wf&mEuIDg72ic+S^hO;x~sCHXIEQbzCpoXx_rY#w|Slb-0+Z2Z14zoEjs zo0J|${b!S<1dW5TMp49lN*H{8C{<%|8Y%z{d`pk^pGTHKn#yoPnoaeN{T?qgHx2Mj zr`Z4ex%$bxceJ_mLS8i!UREE^hT8bvy|btzWnamWfDfvztAnp+L#iaMkpWjXT;47k zD|Eo0m74x%)A)U+vUZPC>@T^Rg1;w0 zjgExk!gei;Ix&Dp+`EgLYP<0Y@IxSQV_xE|&-CaS-od?eaiXePxAe9#&YWoQ3)*&CG_>F(anZ#fT1viuyUjD4F3G6NA?;G~h0jEwrn0@;Lj z|FMMsT>z@5;Q}ESs8n^bndeqMJ@+D`e%(YhB!;DK(-@JV^^q1=g6jzB{-%qDX{6CMn zH^tlRW(D>ZhEu|AGr$&UvA+FR5%8)bBK87D@#3og=c)Nrl)`^>`YI&w_U#hJ-V85K z`gFX}|LmrIwuAE;=-C+x97|m-dCkGF@TmvI(UnCiO{EHGd-FdVK5Ux0(z~nEHRdAv zQ$`9_(!~xOo%Q7<^$xaER^T6#zhMFbE_*ZJBZz*?lZazIrDo1s^H zHLowT8HG#daP230A73oA|GD4=6h83Y+q}hCBtGXh)*SEg#A?Ca%DZp;;>vtt{olD4 z78>6T-*`jLFCP6mU)W^=?9E~*o4BQ2oJVV4n-=GSI`TvT3p}vV|2*XgyLan@Y*N-q z93y~d`s_Kr=;lyg*Ut3*?l`_X;K`H!Z$<@G3E;Q3E#;>%9Qh>?;-RCE-oKY)(Z^~`2(6@Of{~bOlFIouPw8D_!0?BR4BJ1W|o*%XEX;J?o zanpa-a@X(r{rB=}`@a>S#A5gflpB&A{XwNdf=E@^wY@sm?fa6uz(KHo*T*UMwp~#M z7K;oF0_Knuu{b1n#lDsHJAcb~ZdJBX0eYXS>3vG{E8|I5?u4D`69pP{;KoL9%9U7J z@O4hz%-Y~d{Kh6A&uh$@p6fk#`+88gGlU3rfl}H5383cshe5X+|6eWh+NB&QTB`=k z0WX(@_TJpo1}x1O+!}#fFF^|5er%LpZTeJZW}o!0?%d+;Fdz9faiT!~$>)Ra^GrxV zBqy~cv2!;UAJ?m?-@IhXlGpcN+^#r#uKj$>@7eDpfe8U@?5ldlQ=i?wSZKa}57f=z M>FVdQ&MBb@0O>(R1^@s6 literal 0 HcmV?d00001 diff --git a/assets/logo/m&m_logo.svg b/assets/logo/m&m_logo.svg new file mode 100644 index 0000000..fb8fcfd --- /dev/null +++ b/assets/logo/m&m_logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/lib/bluetooth_test.dart b/lib/bluetooth_test.dart deleted file mode 100644 index 81173c3..0000000 --- a/lib/bluetooth_test.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter_blue/flutter_blue.dart'; -import 'package:flutter/material.dart'; - -import 'sidebar.dart'; - -class BluetoothTest extends StatefulWidget { - const BluetoothTest({super.key}); - - @override - State createState() => _BluetoothTest(); -} - -class _BluetoothTest extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text("Bluetooth Test"), - ), - body: Center( - child: TextButton( - onPressed: () async { - - FlutterBlue flutterBlue = FlutterBlue.instance; - flutterBlue.startScan(timeout: const Duration(seconds: 4)); - - flutterBlue.scanResults.listen((results) async { - // do something with scan results - for (ScanResult r in results) { - String scan = '"scan: ${r.device.name} found! rssi: ${r - .rssi}"'; - debugPrint(scan); - if(r.device.name == "Crusher ANC") { - await r.device.connect(); - } - } - }); - // Stop scanning - flutterBlue.stopScan(); - - }, child: const Text("Scan Devices"), - ), - ), - drawer: const Sidebar(),// This trailing comma makes auto-formatting nicer for build methods. - ); - } -} - - diff --git a/lib/main.dart b/lib/main.dart index 9b894e8..1538145 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_provisioning_for_iot/main_page.dart'; +import 'package:flutter_provisioning_for_iot/screens/main_page.dart'; void main() { runApp(const MainPage()); diff --git a/lib/cloud_service_api.dart b/lib/objects/cloud_service_api.dart similarity index 95% rename from lib/cloud_service_api.dart rename to lib/objects/cloud_service_api.dart index 624f228..97273cb 100644 --- a/lib/cloud_service_api.dart +++ b/lib/objects/cloud_service_api.dart @@ -11,18 +11,16 @@ Future> readJson() async { return data_; } -class CloudServiceAPI{ +class CloudServiceAPI { late final Map credentials; late Future loadJson; late String basicAuth; late String address; late Map headers; - CloudServiceAPI() { - loadJson = loadConfig(); - } + CloudServiceAPI(); - Future loadConfig() async{ + Future loadConfig() async{ credentials = await readJson(); String username = credentials['username']; String password = credentials['password']; diff --git a/lib/objects/create_material_color.dart b/lib/objects/create_material_color.dart new file mode 100644 index 0000000..36f0e29 --- /dev/null +++ b/lib/objects/create_material_color.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +/// https://medium.com/@nickysong/creating-a-custom-color-swatch-in-flutter-554bcdcb27f3 +/// +/// usage: CustomColor.createMaterialColor(const Color(0xff263f8c)) + +class CustomColor { + static MaterialColor createMaterialColor(Color color) { + List strengths = [.05]; + Map swatch = {}; + final int r = color.red, g = color.green, b = color.blue; + + for (int i = 1; i < 10; i++) { + strengths.add(0.1 * i); + } + for (var strength in strengths) { + final double ds = 0.5 - strength; + swatch[(strength * 1000).round()] = Color.fromRGBO( + r + ((ds < 0 ? r : (255 - r)) * ds).round(), + g + ((ds < 0 ? g : (255 - g)) * ds).round(), + b + ((ds < 0 ? b : (255 - b)) * ds).round(), + 1, + ); + } + return MaterialColor(color.value, swatch); + } +} + diff --git a/lib/screens/bluetooth_device_settings.dart b/lib/screens/bluetooth_device_settings.dart new file mode 100644 index 0000000..fb738c2 --- /dev/null +++ b/lib/screens/bluetooth_device_settings.dart @@ -0,0 +1,107 @@ +import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart'; +import 'package:flutter/material.dart'; + +class BluetoothDeviceSettings extends StatefulWidget { + final BluetoothDevice device; + + const BluetoothDeviceSettings({super.key, required this.device}); + + @override + State createState() => _BluetoothDeviceSettings(); +} + +class _BluetoothDeviceSettings extends State { + @override + Widget build(BuildContext context) { + debugPrint(widget.device.address); + return Scaffold( + appBar: AppBar( + title: const Text("Bluetooth Devices"), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [ + TableRow( + decoration: const BoxDecoration( + border: Border( + bottom: + BorderSide(width: 1.5, color: Colors.grey), + ), + ), + children: [ + const TableCell(child: Text("Address")), + TableCell( + child: Container( + alignment: Alignment.centerLeft, + height: 50, + child: Text( + widget.device.address + ) + ) + ), + ]), + TableRow( + decoration: const BoxDecoration( + border: Border( + bottom: + BorderSide(width: 1.5, color: Colors.grey), + ), + ), + children: [ + TableCell( + child: Container( + alignment: Alignment.centerLeft, + height: 50, + child: const Text( + "Name" + ) + ) + ), + TableCell( + child: Container( + alignment: Alignment.centerLeft, + height: 50, + child: Text( + widget.device.name.toString() + ) + ) + ), + ]), + TableRow( + decoration: const BoxDecoration( + border: Border( + bottom: + BorderSide(width: 1.5, color: Colors.grey), + ), + ), + children: [ + TableCell( + child: Container( + alignment: Alignment.centerLeft, + height: 50, + child: const Text( + "Connected" + ) + ) + ), + TableCell( + child: Container( + alignment: Alignment.centerLeft, + height: 50, + child: Text( + widget.device.isConnected.toString() + ) + ) + ), + ]), + ], + ), + ]))); + } +} diff --git a/lib/screens/bluetooth_screen.dart b/lib/screens/bluetooth_screen.dart new file mode 100644 index 0000000..5971dcf --- /dev/null +++ b/lib/screens/bluetooth_screen.dart @@ -0,0 +1,134 @@ +import 'dart:async'; + +import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_provisioning_for_iot/widgets/bluetooth_discovery.dart'; +import 'package:flutter_provisioning_for_iot/objects/cloud_service_api.dart'; +import 'package:flutter_provisioning_for_iot/widgets/switch_widget.dart'; + +class BluetoothScreen extends StatefulWidget { + const BluetoothScreen({super.key}); + + @override + State createState() => _BluetoothScreen(); +} + +class _BluetoothScreen extends State { + + final textFieldValueHolder = TextEditingController(); + late CloudServiceAPI cloudServiceAPI = CloudServiceAPI(); + late List results = + List.empty(growable: true); + late ButtonStyle buttonStyle = ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: const Color(0xFFFDE100), // Text Color (Foreground color) + ); + late String inputName = ""; + late bool initScan = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("Bluetooth Devices"), + ), + body: RefreshIndicator( + onRefresh: () { + debugPrint("refreshed"); + return Future(() => null); + }, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + //child: Padding( + //padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide(width: 1.5, color: Colors.grey), + ), + ), + child: Column( + children: [ + TextField( + controller: textFieldValueHolder, + decoration: const InputDecoration( + border: OutlineInputBorder(), + hintText: 'Enter the name of your new device', + ), + ), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () { + var textFieldValue = + textFieldValueHolder.value.toString(); + checkNameAvailability(textFieldValue); + setState(() { + inputName = textFieldValue; + }); + }, + style: buttonStyle, + child: const Text("check name"), + ), + ), + ], + ), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide(width: 1.5, color: Colors.grey), + ), + ), + child: Row(children: const [ + Text( + "Toggle Scan", + style: TextStyle(fontWeight: FontWeight.bold), + ), + Expanded(child: Text("")), + SwitchWidget(), + ]), + ), + BluetoothDiscovery(start: initScan, deviceID: inputName), + ], + ), + //), + ), + ), + ); + } + + Future checkNameAvailability(String input) async { + await cloudServiceAPI.loadConfig(); + List devices = await cloudServiceAPI.getDevices(); + for (Map selected in devices) { + if (selected["id"] == input) { + await showNameAvailabilityStatus(false); + return; + } + } + await showNameAvailabilityStatus(true); + } + + Future showNameAvailabilityStatus(bool status) async { + String statusText = status + ? "die eingegebene ID ist verfügbar" + : "die eingegebene ID ist nicht verfügbar"; + Fluttertoast.showToast( + msg: statusText, + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + timeInSecForIosWeb: 2, + backgroundColor: Colors.grey[200], + textColor: Colors.black, + fontSize: 16.0); + } +} diff --git a/lib/cloud_service_ui.dart b/lib/screens/cloud_service_ui.dart similarity index 90% rename from lib/cloud_service_ui.dart rename to lib/screens/cloud_service_ui.dart index 94d2d42..fde8dbe 100644 --- a/lib/cloud_service_ui.dart +++ b/lib/screens/cloud_service_ui.dart @@ -1,10 +1,10 @@ import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:http/http.dart' as http; -import 'package:http/http.dart'; -import 'cloud_service_api.dart'; -import 'sidebar.dart'; + +import 'package:flutter_provisioning_for_iot/objects/cloud_service_api.dart'; +import 'package:flutter_provisioning_for_iot/widgets/sidebar.dart'; class CloudService extends StatefulWidget { @@ -22,10 +22,10 @@ Future> readJson() async { } class _CloudService extends State{ + late final Map credentials; final CloudServiceAPI cloudServiceAPI = CloudServiceAPI(); - @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/main_page.dart b/lib/screens/main_page.dart similarity index 91% rename from lib/main_page.dart rename to lib/screens/main_page.dart index ff534ec..ed5c06c 100644 --- a/lib/main_page.dart +++ b/lib/screens/main_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_provisioning_for_iot/sidebar.dart'; +import 'package:flutter_provisioning_for_iot/widgets/sidebar.dart'; + +import '../objects/create_material_color.dart'; class MainPage extends StatelessWidget { const MainPage({super.key}); @@ -19,7 +21,7 @@ class MainPage extends StatelessWidget { // or simply save your changes to "hot reload" in a Flutter IDE). // Notice that the counter didn't reset back to zero; the application // is not restarted. - primarySwatch: Colors.blue, + primarySwatch: CustomColor.createMaterialColor(const Color(0xff263f8c)), ), home: const MyHomePage(title: 'Provisioning for IOT'), ); diff --git a/lib/settings.dart b/lib/screens/settings.dart similarity index 98% rename from lib/settings.dart rename to lib/screens/settings.dart index 0362db3..d203119 100644 --- a/lib/settings.dart +++ b/lib/screens/settings.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'sidebar.dart'; +import '../widgets/sidebar.dart'; class Settings extends StatefulWidget { const Settings({Key? key}) : super(key: key); diff --git a/lib/widgets/bluetooth_discovery.dart b/lib/widgets/bluetooth_discovery.dart new file mode 100644 index 0000000..870eb3e --- /dev/null +++ b/lib/widgets/bluetooth_discovery.dart @@ -0,0 +1,158 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart'; +import 'package:flutter_provisioning_for_iot/screens/bluetooth_device_settings.dart'; + +class BluetoothDiscovery extends StatefulWidget { + final bool start; + final String deviceID; + + const BluetoothDiscovery({ + super.key, + required this.start, + required this.deviceID + }); + + @override + State createState() => _BluetoothDiscovery(); +} + +class _BluetoothDiscovery extends State { + + StreamSubscription? _streamSubscription; + List results = List.empty(growable: true); + bool isDiscovering = false; + + @override + Widget build(BuildContext context) { + debugPrint("test: ${widget.deviceID}"); + debugPrint("bool: ${widget.start}"); + if(widget.start) { + _startDiscovery(); + } + return RefreshIndicator( + onRefresh: () { + debugPrint("refreshed"); + return Future(() => null); + }, + child: ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: results.length, + itemExtent: 50.0, + itemBuilder: + (BuildContext context, int index) { + var device = results.elementAt(index).device; + var deviceAddress = device.address; + var deviceName = device.name; + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const Icon(Icons.bluetooth_disabled_rounded), + TextButton( + onPressed: () { + debugPrint(deviceAddress); + }, + onLongPress: () { + debugPrint("no need to press for this long..."); + }, + child: Text("$deviceAddress" + "${(deviceName != "" ? "" : " | $deviceName")}")), + const Expanded(child: Text("")), + IconButton( + icon: const Icon(Icons.settings), + onPressed: () { + debugPrint("this is a warning!"); + debugPrint(device.address); + Navigator.push(context, MaterialPageRoute(builder: (context) => BluetoothDeviceSettings(device: device))); + }, + ), + ], + ); + }, + ) + ); + } + + @override + void initState() { + super.initState(); + + isDiscovering = widget.start; + if (isDiscovering) { + _startDiscovery(); + } + } + + void _restartDiscovery() { + setState(() { + results.clear(); + isDiscovering = true; + }); + + _startDiscovery(); + } + + void _startDiscovery() { + _streamSubscription = + FlutterBluetoothSerial.instance.startDiscovery().listen((r) { + setState(() { + final existingIndex = results.indexWhere( + (element) => element.device.address == r.device.address); + if (existingIndex >= 0) { + results[existingIndex] = r; + } else { + results.add(r); + } + }); + }); + + debugPrint("results: $results"); + + _streamSubscription!.onDone(() { + setState(() { + isDiscovering = false; + }); + }); + } + + @override + void dispose() { + // Avoid memory leak (`setState` after dispose) and cancel discovery + _streamSubscription?.cancel(); + + super.dispose(); + } + + void initScan() { + _streamSubscription = + FlutterBluetoothSerial.instance.startDiscovery().listen((r) { + debugPrint("r: ${r.device.name} ${r.device.address}"); + setState(() { + final existingIndex = results.indexWhere( + (element) => element.device.address == r.device.address); + if (existingIndex >= 0) { + results[existingIndex] = r; + } else { + results.add(r); + } + }); + if (r.device.address == "38:F3:2E:41:82:74") { + BluetoothConnection.toAddress(r.device.address).then((connection) { + debugPrint('Connected to the device'); + //connection = _connection; + //setState(() { + //isConnecting = false; + //isDisconnecting = false; + }); + } + }); + + _streamSubscription!.onDone(() { + setState(() { + isDiscovering = false; + }); + }); + } +} diff --git a/lib/sidebar.dart b/lib/widgets/sidebar.dart similarity index 69% rename from lib/sidebar.dart rename to lib/widgets/sidebar.dart index 07caec5..c7d97ad 100644 --- a/lib/sidebar.dart +++ b/lib/widgets/sidebar.dart @@ -1,20 +1,27 @@ import 'package:flutter/material.dart'; -import 'package:flutter_provisioning_for_iot/bluetooth_test.dart'; -import 'package:flutter_provisioning_for_iot/cloud_service_ui.dart'; -import 'main_page.dart'; -import 'settings.dart'; +import 'package:flutter_provisioning_for_iot/screens/bluetooth_screen.dart'; +import 'package:flutter_provisioning_for_iot/screens/cloud_service_ui.dart'; +import '../screens/main_page.dart'; +import '../screens/settings.dart'; class Sidebar extends StatelessWidget { const Sidebar({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return Drawer( child: ListView( children: [ const DrawerHeader( - decoration: BoxDecoration(color: Color(0xFF00844D)), - child: Text("Navigation"), + decoration: BoxDecoration( + color: Colors.white + ), + child: Center( + child: Image( + image: AssetImage('assets/logo/m&m_logo.png') + ), + ), ), ListTile( title: const Text("Main Page"), @@ -32,7 +39,7 @@ class Sidebar extends StatelessWidget { ListTile( title: const Text("Bluetooth Test"), onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => const BluetoothTest())); + Navigator.push(context, MaterialPageRoute(builder: (context) => const BluetoothScreen())); }, ), ListTile( diff --git a/lib/widgets/switch_widget.dart b/lib/widgets/switch_widget.dart new file mode 100644 index 0000000..544a846 --- /dev/null +++ b/lib/widgets/switch_widget.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class SwitchWidget extends StatefulWidget { + + const SwitchWidget({super.key}); + + @override + State createState() => _SwitchWidget(); +} + +class _SwitchWidget extends State { + + bool switchControl = false; + var textHolder = 'Switch is OFF'; + + void toggleSwitch(bool value) { + if (switchControl == false) { + setState(() { + switchControl = true; + textHolder = 'Switch is ON'; + }); + debugPrint('Switch is ON'); + } else { + setState(() { + switchControl = false; + textHolder = 'Switch is OFF'; + }); + debugPrint('Switch is OFF'); + // Put your code here which you want to execute on Switch OFF event. + } + } + + @override + Widget build(BuildContext context) { + return Switch( + onChanged: toggleSwitch, + value: switchControl, + activeColor: Colors.white, + activeTrackColor: Colors.green, + inactiveThumbColor: Colors.white, + inactiveTrackColor: Colors.grey, + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 9295504..2b8018f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,61 +5,117 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "04be3e934c52e082558cc9ee21f42f5c1cd7a1262f4c63cd0357c08d5bba81ec" + url: "https://pub.dev" + source: hosted + version: "1.0.1" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_blue: + dependency: "direct main" + description: + name: flutter_blue + sha256: f7f76b9b80455b0375693ec96c276fadb01e94d8441fa1740a64980cd1aeda5c + url: "https://pub.dev" + source: hosted + version: "0.8.0" + flutter_bluetooth_serial: + dependency: "direct main" + description: + name: flutter_bluetooth_serial + sha256: "85ae82c4099b2b1facdc54e75e1bcfa88dc7f719e55dc886bb0b648cb16636b1" + url: "https://pub.dev" + source: hosted + version: "0.4.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_test: @@ -67,41 +123,211 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: "7a738eddad04c7b27a1ecfecd12e8ecd4b188cdd2d91c252a02a4aba65838c9d" + url: "https://pub.dev" + source: hosted + version: "8.1.1" + http: + dependency: "direct main" + description: + name: http + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" + source: hosted + version: "0.13.5" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" + source: hosted + version: "2.1.7" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + url: "https://pub.dev" + source: hosted + version: "2.1.3" + platform: + dependency: transitive + description: + name: platform + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" + source: hosted + version: "2.1.3" + process: + dependency: transitive + description: + name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "2ef8b4e91cb3b55d155e0e34eeae0ac7107974e451495c955ac04ddee8cc21fd" + url: "https://pub.dev" + source: hosted + version: "0.26.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "76917b7d4b9526b2ba416808a7eb9fb2863c1a09cf63ec85f1453da240fa818a" + url: "https://pub.dev" + source: hosted + version: "2.0.15" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8e251f3c986002b65fed6396bce81f379fb63c27317d49743cf289fd0fd1ab97" + url: "https://pub.dev" + source: hosted + version: "2.0.14" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + sha256: "585a14cefec7da8c9c2fb8cd283a3bb726b4155c0952afe6a0caaa7b2272de34" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "28aefc1261746e7bad3d09799496054beb84e8c4ffcdfed7734e17b4ada459a5" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + sha256: fbb94bf296576f49be37a1496d5951796211a8db0aa22cc0d68c46440dad808c + url: "https://pub.dev" + source: hosted + version: "2.0.4" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + url: "https://pub.dev" + source: hosted + version: "2.1.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + url: "https://pub.dev" + source: hosted + version: "2.0.4" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "97f7ab9a7da96d9cf19581f5de520ceb529548498bd6b5e0ccd02d68a0d15eba" + url: "https://pub.dev" + source: hosted + version: "2.1.1" sky_engine: dependency: transitive description: flutter @@ -111,50 +337,82 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "862015c5db1f3f3c4ea3b94dc2490363a84262994b88902315ed74be1155612f" + url: "https://pub.dev" source: hosted version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: c9aba3b3dbfe8878845dfab5fa096eb8de7b62231baeeb1cea8e3ee81ca8c6d8 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.15" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" + source: hosted + version: "1.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" + win32: + dependency: transitive + description: + name: win32 + sha256: d13ac5deea7327f027b3b97ee19ee210f68256ecf3f1a304bcfb992ee947637c + url: "https://pub.dev" + source: hosted + version: "3.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f" + url: "https://pub.dev" + source: hosted + version: "0.2.0+2" sdks: - dart: ">=2.18.2 <3.0.0" + dart: ">=2.18.2 <4.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 13579f9..8bae8e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,8 +37,10 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 flutter_blue: ^0.8.0 + flutter_bluetooth_serial: ^0.4.0 shared_preferences: ^2.0.13 http: ^0.13.5 + fluttertoast: ^8.1.1 dev_dependencies: @@ -69,6 +71,7 @@ flutter: # - images/a_dot_ham.jpeg assets: - config/credentials.json + - assets/logo/m&m_logo.png # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware diff --git a/test/widget_test.dart b/test/widget_test.dart index 6f6a857..f386e92 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -6,7 +6,7 @@ // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; -import 'package:flutter_provisioning_for_iot/main_page.dart'; +import 'package:flutter_provisioning_for_iot/screens/main_page.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_provisioning_for_iot/main.dart';