From 6f73ef40dbcba43a7c44026b92b8c40e878c4469 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:58:09 -0400 Subject: [PATCH 01/15] Add controllers page and widget --- assets/gamesir_controller.png | Bin 0 -> 219322 bytes lib/pages.dart | 3 + lib/src/models/rover/controller.dart | 1 + lib/src/pages/controller.dart | 333 +++++++++++++++++++++++++++ lib/src/pages/view.dart | 6 + lib/src/services/gamepad/state.dart | 6 + 6 files changed, 349 insertions(+) create mode 100644 assets/gamesir_controller.png create mode 100644 lib/src/pages/controller.dart diff --git a/assets/gamesir_controller.png b/assets/gamesir_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..6681e571074544940dad35c291b6cf9fc57c2baa GIT binary patch literal 219322 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

jx!ueATaFp?K`~?{P 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 D$- zUfI1G{?d)^c^QRtvz$`bp?a|hhPD*Jt zT^&=BDC>d6NRN6(AN!qI>|j`1&6y`d+0lcLGDQ=LsP4$V>kXp^#Bef4JN9zpultQ? z!D$kczE&hz(hH#I?^k6>q_4ie07Wck@Lps9(MOG=#SgBQol@+L5Dz^Uo<8!nP@h;A zT5t01x#ymH!h7)m{qD9q%tci^Rs0lJQ}!?XQ{NFQ$lL><>-z6y4*l=J^o?h4D6Fem ztKzxr4O!ImTir|V^*v!a#3Sk&Qd|ohBe$R|UIxS-HApN|!WX}7n8y~1BgtBn3sLhm zLM!gDkhc~J>Z)HqjUdrm6Bk($%VH8W|7Xse4)>bvze)DxU;gFUo4)N^j~$~Odk55> zxbW2Zcfb4HpOdu-YYf`Ds>C%0D2A2prbi7D8+G5;F7kP|Jf1-dON2rhPeqJ~=kr7- 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 z zvOuneOn~ARH;`5rKb%5BTjH-$+JiJ!R{$b2Jw?w$GztYi?|q4gvJfn_F7$5Oe7=eL z<-tm0mS-*b`~eNBj3j*54tAtpAtDpl`rL6g%mFWuPBq%qe=$i^#WZ9SPDwKB`7aF$ zJ0R$ZvvXksu#M*>fEN)}5qS>a@QK-mzLHy(AH;Y4;3|@xXbNDlh;Cy0cyAQJvqDa0 zC%+|Rosfqm1jF&JrVZdp&;@8Ea81yCeE}hfaMg+jNcRf-NGttrXfJgwdmtG133=MZ^TivF7-QY%zcQ6EdaIT{o+WL##ux zkD2CeXWNziv5APR?n0a0T-{bzhvO6xi=EY073}!?X;dlw zOniU7@K6Q4AYF6ba{BAPh2j8K+{}Q6mbc%gv3q`gs2_}S?0HKVC)y#)v%X}`{3y!U zR8zKQ>1?el6Z{Q|wgc{ZR((3TQP;4aqbQjFZEEtQyosauZO#nzq1<2*Rj&E3t8D1{ z#_TMyEAc|#Wj9qUXo2;HgCjzw??mPPbd@{J=mP7G@Np13I_MqcTTI!s4GA^7Lqc+5 zlYc83KW9%XTWS=l$lnECRa;>!;<=gL9WH3B&Q*D@a;%rS{oIc4Ph{!yydHH9diNT~ zcAy?HWeG?1QLr6bwMCjsb{#V%i81z|i)HmhVJ3eneoo{~py3*jj?v02ZEyGaZQUdC ziTmjjjl5AcJ^{yP#?3fPi;$XVIzLzlRn0(PvA}Je*jwKPV9wxjkpBY$Iqf6(6n)w- zyc>u0;mOl@@G-gL{Gho38#G5{Dd-+m1n?)&-ue7GDVWWx%d3lQ%WGXXSGO0fdrVQN z^Qx%u8Qd&?S8%u%Ex@?I6M)0)sYxJ^H-(5KD(c?Yzq?mZtq{FtOjEo}jtb2)`8py< zdrqV4=cOe6tT`T)v08jPDma}`PL`^hZH0Vg2tZibAVRUR+kIA=Wkm}7F9YRF-Yi$g znEYMk!0RKov(ZHSqtEdS8jPXM&bQjG2cFZ#|FCqHVNrMA*QY~z=nzJvrIGF)C6z9b z?(Xgwx?8%tTe^|%2I-b=c)s`l_q?9Du6c82pMCaT>$9S3I%kBk6~}Wp4+=dC z5meZ%T~Xrr+Vjc?;WCuVys)WpU@VEZe0&ccNA@&h>urx-Gnvr%y`ZU}Pq#WpPz3Sl zIE8~gcPxnJzFmlZ6qH7QVoNx`5J!FSA6C3k(iF23u($rnmTU_{+YTfikkh%QSSt*Z z`QPA4ezeskd+O@R{gXEsT`XPmL(P_Z&SfDjGYyb(7ApNn6GSYtxy5A>j%rdhAU)cR z=6Iz5u>;fM!$VozC{<#(oQc#BXa^oFYw5eq;5dee1r^d`^m>I#j3inS{m+x3AyE$9 zt1bBt{G*&rLVri%{sr<=czQTqA57UH^So~Q^?mJk+Z+VP`bN5yf|c#=J1)p`na^7?`zvwnus+A`CQ^>x~mUf+Q!oLIK44h9j*&kfXy|^Vsu&Yp`=K#P$ z|Fj&51hLoXsba;Ix8-m>edfS-5L%Lf(!!K-&e2Jd!sZYI;v_}_P8 zoJu1DTgV@|Fm?iL8SjEb#qf@V1>k!!&RdTw4aw}?u(V3-ivBZ#SjF5obk3FLrr=)p z*pg}eNR>A8vuOGaQ(?cS*o$|~oY+vF;b>g#pfg4zs|by}E@7yLdD=;SL9(C;T6 zPP1O?Gqzwr-N=QLvJJU{1*LL*+={Opp%r4(H*m`zJ6{2o^@b}+*Xc7#i$Z(E>^=VH zLH+Lc*2J&_c)4GtH@+23I}Oy~w@f^TF>Hi*m_s^MD?%|B`Q6nGH-{h6>je|%Ac=tJ zX~&y?qI{?|oG=o$LI7f@M_x!WIrPmj(&Ft$8wQ|2kCL2e8Tqb}opO_k{$2+Sj`%|& zBIV(iKaYWw#DIdwc$cbCQwbn$oWA){-1{B8Y}}qONp;qF8!W1azX0bXX!!iA_NIiw!0=XG%V`D#YUY^(S-e*X(&+0TFxcM#wqtbZ%; z5}AjS9q6)qS60Ae{xcDVLCmesh3d--^EqsivM*~Y^2IV}^eo(3yMgDxo=8S9Fs2&o z-@8dOAV0Qt*1jc#lj(Gwf}W^&K^Z5_J{%&=bcY@wl}o0GQ=7yF#GtQbpVsad@6vn=CXd* zU8Vg)(Yc36CATAEBcJ`TwdA<{ahE~Ee3mOxyG*;m4kaZm+fE7Q4MpaQ&bfQCYt4ng zyoE@=4efvZFmOIjloUqo5w0N`3Mx~L-&{mY@h)ex%j=Hp6+32~yd8u26j+3>EFA%8 z(SfqVvY*_Isg9Ff)4yiNk1*}VFCc{WztTOBLi9;f}ff|KcuVKJF4m@A!VjsrT@LTQ1I7* zh4U}Kme6^{-^ua#dj7Qj3mz)`3RM`arqXBiiw(nHcf&5AdcGHKlc!|*#t5pN0oVMn zk=Gu4Tl^X=q(}wuFtSvM2Hgq8(T8Z{pC*olkEMz&<@HVDigZlc0FV2I2^?6fB5tDZ z0yV}I5orP#fqpUMDz<)Cg&A1ox+HCp8uOI9e^akGTrCWt5wxEJQ*C__SXNU|^N{TI zW&T62bSPJLsdU_IZpAcKl3L0Sqh7|pTl|~m4~j%ELKSV+MkTjtVz&TLSPmvkbcr@! zHw8Dv87){wa_ZX0#wez=^TIktf8=Mb^mkO|@f?}GVQ$A>QI+mqC`zBtoioV@ZSU?P z9=4_84(6s?x6<=DUK*>RPBOI%<~DVwKh1Ubx%!KR`Gfxv^xMAE-R6hJ?ImY9> zhQ-eT;BNm(K7@1xTz-h%q|fn{bA<`__z%_ znA+{A-5(E&3K%}$8yJ~MMji96{IOShxDQ(y=QP$~zB6aWa-$IR+k~IAWA#z*3xll@L?qVaWdBPnaom`N5bxc0xok@1|okw`4WM=Bb z|0i1R_!xIU;qxr*f<)EvcvR+daol;K^@dZH>JR<9RfFhv$m;1QY2g_|WPkUc{3HFD zi&>Cme-f@wASPu1;p%oDgXT?xTMQr>h@aipTUgRUB;Iz|h~It9BF5&iPeq7nU=0XE zfq6><%1SZ{_=CSobEA9GQ?Aun*(5nnbto4Mn34>~;h@>TUg{$ou{Az<4DA~+HI9;@9%jye*0HyuwMUxbu}TVR+S<< z%hhm74aFt^6gbkV*auY2Ei3QqDQU^jYE7y^)~f;MIKVZtjszX$CZN8?8u*MBS8l>2 zQBD{35YY2Oy)>v_+@BY^mh)$qbWJkxw}E#UB)mXv+^lj-Wa7M)Odl{X5|T?=nwV?G z1kJlLbBasKxR#76-0`~OsSky9MJ32(X_xs?%JGT94ga2FhaBD1 z(q|}M9f6A7GbN|6d0z{aDrxFH_vp|!B*^Yoz%NX048I{j2=-a?q74!1wpDnK6$RD3 zf5=)Qj=4|vc}TvXcr6qD@^_~DGYaT}RnfJ%F$D|6I}C8MxkxIY$M>>;5NgM3`c?^I z=qK{F{z}WTI{Vgv!$4}?N(e|`gd>L+chy`4-jJ)ih;GXa2@u2Dv4Y6Pg}ojf9gk+| zRYc&xHSA%yF`-^5&oC?~EwC{u6{hJnTFQGaH5KPqml^J$6))}(^U8?(1pmGz$Q4W4 zsqy6>Wdanue(}T0Z|bXlUlZQWYEAij<(Lfi`TZ}=6F-n4Bcc%4tH&4={o#7ltg)e< zro<0_uQOhBSUD4oT-n#QzTFphdnG0wPOq)e^1=7<_UR12z)87+_g~R-0ZAM0`MbqF zmAlnE@3`Z@jvoG?BBFjM9eCuLLaZ&@bw=jP?ynqANx>~GNnl@W6Cm-kYCqFMzI`Jp ziy*Q-J7T{EWp2Q=-*dC!q{iajOZP!j+wM`Uj={?9BGn`?d2Kc&?(N$tv14Ar`Slp_ zuMnk+1k2$Ko(+^|Q%FrPjb~B$rd!HYxxdv)^W0oOI9?^J##+EcuSu?u)I*Oxrz<%L zddc<$&&a!WpKHkt;x^0{))}`Zn16`|R*1Bme7#ibrj=i!73 z7-+(r5F~#}2mxe<{Wdo7wmk0JC;YlC9QAgp`&__^W&!o@$B68;Cz7>q1l!?*&xB$Q z0(dB>_Si5f==@L896lh$4^Yj(MEh7113u*ICLk4|Flgl-0PIWyA!P>N2rCJL@5~aD zV?bTUtjc(uIn4%ZeA-nU>KHC52UtxNYNekac728DL7C+hh`boCgHwb=3lp(hA{Ziz7>5gXK&*vXFmxyDXjZ#{>w*8 z6rxOASzK}$IA5vP5uaG)a3m=cl8OdD#WwB zL$uPzq|8LtOZUXAED76(u|cRBywaTbU_>QK8Ib}<`4MsaN@tfoL?^%hID|8y+3BDf zkGl2nVC+cozr{-~EUx^{OcHtwA#;Wx&U@*t-!XZLQ zCnKz7BcF@tDpWi=@@2>CSy5@N6JQH@Puqh|o!bEK8(@U{^GACRL=++4)A9C@^)?Tj zmaM0itZ){cjwEH)h9BYt<$!cW6EJ@>o(?*voibX_(D?btPFVpyB++##2T;Z2KjNqt zmI^PkjTeJ3|6UZtL`@F3E%8%4~i4s`LIKH zA7$&gL!*zmEgYN~M;Jq>SMD<4AXSEPY!}da8Mwf#3kr~N1ROan*19wG$$MKGOK;|q zXr&SEH>i>k0-3xb*O+mg_YY%>6Z_yU{XR)^A2)X-Q8GHYvjR!0#q*9>b~&Nx;*fpm zl?!WEU4|)yQ0GYPi~tBa!>D&@%)ci{83z`DiqyK0;zOn55K` zmpT}1H|dC0D`oW{C^+*KhH;Rg48$SUMVO|VS}oJO=rXRLDgVoBy&iON`(k$(TYndJ zjExt2J}EYCtKnG$XV_aDmr>HeAOHge#U1s0PYvfG_*7~dp}drGeDsv@o^IQ_pp$Ar z(DMrQVzFT#vl#CCHv^H+_U!;0FiN$)3+Z6GKn4y(OsPe+ny?*XfVOW7YffkMPyO8Z zKePrZmAjx}sgJcJp%Q=$BY}!F)-0qriPb(ts=NMBoPz`?GimSH_Y~j#FXY1{L zL(nmM^t$J(k=aaa=H;WjPL-3<^6pb#yc9d|T?&U40;W2dL&c_=EvS&XZ2Wl=qk;@P z8G%IMuTi%NEVp_&wCsfmg3PT8Sw9i22R-5KfKVg~D*1d93G@4^HaH#Hq}h*9ZHbJ# zp3UGLaAx}r<^^a1Yj)e?cgdw;BY9LG?3a$0hpSown%7>BZjL$ghpUj|1E9v3bl)CK zZQHK`#W z^6^vV2;~-x8*VEd3S({O0hRoU@#)GjfY{L>$w)HNOuV3va}eA81-$^fK7a+HGX-k) zhz-%3H(;QeoYr%rkj+469igXM^@hPZh4J*x%JqC}@#InU%!Qbe+ewXH($YSRH3!)R zRoL9IlAMLC7Q03-*-+!xFqN+;*(DN_xtUy;Oz}*VmecE;p<$%SOEqph_ZUbcwygC_ z!Qcf|WwTaol~-k_PSQ$|v9BtL=z(Qht;nj^E}a!g?P`R{2xRN-kC-jUWqE(e+3y5n z4sv~PW7JPE^L2=H)d^!Qe%1m(ze1jv@8I`HKTJpoq;In|rvLBljq)1Ei@5tf$Cs!s z#b(C=K*I6L{Rm@nea9fuiz{z{WyC~xp})17!yGIm1vTF(`80VPQO|HV8hzXfrDY)T zZ>V?F=_SOf-+9w}5}{14;EsKcu-Lz7V!G_7j$_o#9T)jX(&(M`E^A>#`ZlPl?*7TE z_8rUcdbmv7l*iC9E*+|kLv~Vo2EIbSYh!KPkSJQE>&CKTuT6Bc_C+SXoJBKFm0scR zi+kUiqa-bbk~;&*Jo6+?O^t`2c|;J20uzaG5puR&Q4E}i{h9b77t0wLk*h1|IH46} zXgVNfI*TbkR%||$5`exwxZT}l8Ptj9>gaS=CLRPxY{UBT?>44A$FqtzLal(p&j6wU|nOo_J5QWkVi?9^NOQ3Nq% zJSuC1Y$Mo?CJ+!Kfrw_yqMAtAOJCaOpsm=<9=&UIx0bFQa7PWn6H%YzJjJ$V*z7}f z*W5%#TaXm>*dD;gxuxZQe2Y_hT{k_x(F{0306M4Y*|5I|*Gt%lw}|3aW}7wJq=VS% z%Z6rAZZTO(J3e<$6NIhveAf7k-q`+qE_%J$5KUOw1`Htjg{;w^lYQZmXZLRUgV;CfPg zSYX$#W19cOjIGc$JGkOUMXB4i)9<~0li6Ok>^v1kkKaZWg?ua6o1aa`_wNr|_C9b_CI%lfSCOpuJhpT#6G9N#=#J66n-iAYyaGQ73JSwR8?#Ii3yB&SyPL)C zKCfC4;~%7#nN}R4xw~>Z3V>zipTHlA17YF&0AV7*%YX341U#fkia?l=50THIjBZ$I zgDN(aJq0bTZc@i)1B)n0;}`H$7S$_f*bdd>(+S%(9>K-uLN>y(=RLMK?D*l_80uu@ z`DueUk57IQ*x@Y@CmC+kVaG7ls%`$JP0)hdzu1uYXQ6k_Ks{Ct!W*+YCYe@}3d;Tw z-v4xciO7WJZK1LtXvyRf_)QziX;Q7Eq{vfVQp;gpYL`!dwZKZu4rbuUnD_&&fBC~U zv9CA%xm!O}YVd&|F~ocm}*CxG>a{1f(Bix~S@tcOXI ziQG;7gcc{FkD3%ol*fz?77Cc(*6_z@9~LsS3DlWBH|&-cnA+ND@`=PdXi_im1W<`N z_U(D>;SAy~q>Hz0LH%y3i*q}a{6LAA##LrM?lmrk>~F4_7(gNl__>2)t))=b(b2!9{0( z=3w1rZSe8?54zW7nQ_AQKWeK3$LtUu<`ho}5(uKs@7^1sjT;;YMoP*Of>~&VvvX0G z43eMzCAa?UcSnn;$Q7*1kEN*-OoV+YNy_l)DBy)+tzX5sE0Z35lN4n+Bvl(KQ<!{z`cjWYb-W#wXt@#%JSM%sQ;jT<)7Knr)JBI{TKLwj zB!@A&FQ1uc*)XassUh|1`V}}9Tnq7`p_E5f8!u}c?_XXz@3O2ZAkQZz!lZd*7j%{Q za8O3kiR8w|+(u+7<6pX5tDh?#={o~XUS>oNeqeFm00~GdfQsEPiu_8!a>y+7izX#x z$H|Ua07_R5gBYBoNS`O@w~BF=bEQ6yyF_?IXfWdkVpSZ@Qiz~#L?#l>8SKJ~b7!`4 z{yHDKu#4M&T18{eii&v1IG}im(!RTypEXw_%7%DL1w@aj)K7tS5`|KEB z^I#(d<}10;sK0&Oq+x1g3xxLvwn?C0Z21>~tvK&$qZvrxa4Qh(R^0&h(??qiQ_9KTRccWZ!r*Ft< zL~XdfI(zUDD*(oow^uV|JPG5&qz^9+O(E&Q*DFBi$9(z_?=M8q;g_9h=9Kto!CUp~ z3yP=3Ti-smnU{fm;kO6rd_@VD6wT&f=rlSSM*x4bQQLqho<=N|t=r($sj^Wte0!Uoaq^n^6mG*WO1>9ztnjR??L zdR&IX%}OVAJ3Mvlx%ki)3}pcudkY7?%f?lmW_FI+Obo5WLoqff_16d;$g-;aE>VF| z8cd{Dyzw)b?V8c%HJ{D#ReFLxoMth`>BNS&Ao`SQ)95ePnN7u}YAVR6S4E`aM%h)n z>=T5n&s?wFOH!~MgD}aXAXoJ^H2^vPelllez3{wYugA^eOeeZt&O#76?tl2230=vg*)$wFWIH{;UOCZ#R{_)bHNJuCNp?KzW8=oDo4|sa zZ23R=$5A#3)q^VsX)7U&1#A2u)76md0g-d$7`nk`C!BNgv0~b$+&jSyt(Yt8mTl*Y z`HEQ+WevL)#elHAYl+HiX~8tIa3P2#7AXi5d6(qQU<%7^p9YU9{Dh}K3|iCY+1Gv) z+UEDav2QVEgqxpTIB(FiDUo2ar6}Dhu|slVUJC(JrDQbO09yhnkpLB_M_H_2{XFuz zSt`p@a@VUV*TJA=1BbQx`q84+Q_S-)%=H{og>&JwLHsIyEfyBfa)=(5V81AF|GEQq zb%?J_Ny!3FeqH*}rd~5)Pz}b5MOITDziKytZxKn z@>DP{M}U^H)^;tKp_OrHnExDa+eCPJKb73PKx=1YyWRO@8V3%HGlfs2&`P7v39au! zeyFNY{dni;|MSQn0eT;0*A1x!NbsEC*lpx`oR{&atH=Wzt<-qa^G+4;6pN>sAoTte zXnxNReEun@1_C~@htxrv&eK9^w6)c#V5-@ww*i}emfzR41~hLJ9_O&uOW%H>o#9%a zWKiWupy2^P_?ysozERyP8Hjn=Spv?lt*=b z(p7}igT?selhJ<!;tuZi0OFL5K&Fx@5vExRH=c6>zCRXpk2F{SY%&4CQOhQ z_a??3qY78TKjA8$kK?+e+pXoT#0s9^{fxMbwI!rfEcJ($s%Myy=kz69R;$h@Z}^=(F1aO%&oioeNVWkUHlDbxS0*+S{LXo17y&Rh7}`LY<`9Q>NoeH-&xY z#k>lb<*u17pUpi5MPhhJGXXm#e*C4!UvHROyRZMaO{Qq*3KNru-4_J`sSG}|#Jk^l zSX7U`DweMizvAPtytY(xuDmvAjrxYroW=5YKW9DDj@DZaI2iWu@t#|>h__~h{@XRn5Hrt8&`uyY1wWV$|HvTRRG~vp%%VzzUv&v2GHlj$EeK!AhDeW&C1H^!$7 z!J_!=_d5E7mA1{FE}uPe(j@e~L38^dwG_5x48Q2hnD$167Lr5^&o28V4pr@W9kXmK zxqi|J4I;s6lkR-yo)@w!T^0~pn#QCgc-+0A&QGM`Fg*dU&WsEfTpDm9(vb)Zkc`fv4 z!;FYOj-SqPDP6^?DYk!STl&T%4ZbtWRPygrN`L3y=U%WsANm^3c6n;!v(oJB--(9^ zJ(w9HkC2d+-Iwp6gN1}D%8O#}8!&xW=l`ZKd*1$Wo`2`Q9KV>nM1%0od9Bq*V6BwWMLmTF^^?eYdu){iIe$ z4QUq-TR`Q{IaE{4EqI@$DZ}EZX9}Qp--02QvKrN^>NVDNTJMF|+bt8%LtLznFUjlC z@JwMsBP125G4q|GuNe19BX>g3)KgZh)&HW%zCs9wff- z2)xrF33rg;=EVV`U8MY8vU+6tD?eN4&0<>hx5D4Nxmd^6pEzE`Z+36LrvB@X^HD)Psg zL?1*VV(!v{2T2g>?_etHUqjUoSXSilx&6K&q}qrhlIuM<$y@RmB0@=v|6Iu4r@q%( zLx1r_U`)bF*RM;gNokcLTa*QB%cB!oitnFPHZO={9S0eGJy^RV^*g9XCGA>GYx-$z zUN?6}q0`9BE#s6fXgkGZEwJ@?zt^bM=hV|*E2|lU5}r@2R*5DrXLA;1Lwr1FH-0o8QF4ulANq1RuT_zcdz87o#Jsp& zu{qWv)28{`U6as;rSEs38t(qXaY}M&{kKQkCJ(hlGWY_o$RCU&bFH}5{Tj~r+hx^G z+J!iUGLQ{5TyXvwz_#dqXof^$wN~4E+OBp7;S6R9XmGQSd^aKQcN-l)b((5PV&-{` z3jEZZIZ{kd7@$2|4yqWKy~bsZFLv0k;$fY)AGuD7Pu4sWk0c9f5FT5l}pKT7PEV)-b+SCM8mx95W27As^v?{Oa!F<2R*ad41f2!|K3_7@ z(xCnlw+;hBAGaUUeJ&#N0Dau5o6S>`&r?%f05Vn!kAHPr30~>pzR>-J6dK5De>m#A zjtUbEbi;c|i~t2wK*r2_S^U`0AykS;K`?)ZVL;+AY&Vsj-l1QHB-kR1;)!pKjSG>E za*y#@&gnVi`A_RB2gtUiv;sVDirNmp7tA?%urKYNEt%9mG~_vO_0GlpqB{Qd=0~3a#A;6n0qV3+#NCj=)w)-%hs$gSAM~+kb+O$@Ix9)O@C$9V@o%qFQge!1JM*rC za2C;A-XgQL_@txCs?TKAy7fKd-+Skc)+;PfVob})N0}Q7_0~LSbp(yy|4i3Dr1oXa z#8JW}=+kw~i3~AoE)VwLQ4yw)G2F#9ARYKWc##ECPvUDaw?4-3L? z#{8UuIVwCRyi(O@p|873F>Bs+))uSeUzuM*)i z+`7A(Qmi>r$sLvY5V22P!u@0i`eoKi7+rDasmQQh37^VepS^G*j*k1*&g=r-EaO9W zjsWxTMo;$aA8_JrZPU2+2|&>Jc|H@AK4z#Pr{x-x{ZRLgv{Ohk=Dy$OdH+`TxnI}t z>dIM=*|#r+`rE+h{i@uRxqp~%pSs&O7o}fbrlwiW3bMI2Fi0Dni9T^yPScU-Af+3b zUmvr!;o0!KT{{|sZI)_>7iL>ftD=PhQPJUn^p~IC76fO7ATj!@p$yLURkE6qcNZT+ zB4cic*6vbXYk3`H7|7D=zM#{bB6ts$A!yY+LDQUmWfrS{C|0tB z9s9EfYZUgJF3W>JNssV&2AjL`{owV}=-{bgjsAI%(>pmv$2lQ~g5BC|<`$dP>J6(U z>Oad|HdP^QNiXB_+XtD5tf6e}$K?*Szdi1ZZz{A-Z!rIiy>mH_!Is#RmWpb4|3RX6 z8trw^MW5g7HR(v$73r@6kX~x3Bt1*Wrf1qVOQj6lj~Vk_Ys#%VSKQi&HP-rDN4(^4 znefyY_a6;5>A;1d+hOfw{Oa5pb8#;^(h*6}}zj&-yd_q$+ z)z8*SnrJjWc^2BbA9QTkm{u>lHlYs8D%tXoZ)s{~AEIaw`Sd_;g!L-O&$(trdzTk& zqWF3=^3xm|UjE(X>*wTZnz|)flhtWZdNd<(N9Wj@%kae*b&;}Xvl-!uaWeue#e)tb z&D2Qrr#+I_$YYpw*uP_Zbv>Y?qWU;(X1#vPXl=}oiEBXH4u6^M8f9}15AF4>wnK(W zcI!jrXTCmTL$-O#BES4Owmw=B8QU8XS=;TPgPd@iVrYV5^`8!fgBq(7 zq&b}?Rd$?LXclS!w*2VZH+xfZr{E`1V)ple{b{Aq>Veo_kmRyj!;nUT8YB)$3soL04|9AepPHg;F`UzG0jQig%+eKthI&%^Z zc*^j;OdW|+JSRtJ&Pc?5o9DxQ>`ijIqclb&q1&tP)0fc}m3J|r&M9R^USK=-C5?kL zOo7&v{`cWms*4t^m4((smU&j&Ov(J)xT+C#o$9x zVOpSqgTvB7=c|*!6tmdQd*jGnoivb4tiaXFqQ2@_rf$mi?o~SvsGop^eD-9k6FV=L8EW(x z_TG?V?$dA4$1l3#ELvT5h|<8qAzhB1h;`yRCyvpzWnMwL@zuw@!tWr)_3o#)GK68- z`A+p)U4maYUnIA@PN9%0XkFoUsvWFwHu#>3;0AB#V{*R;iK*b4oHPcA(|ZcQ6m#Rp z57`BFZdp0*CaM|l3%}O1(4OU(+>;7j^Pg(j{BF3iZBr~qfFgvha*TQYiQ@tC-t7tL z%)e0e4j)%y*HJwpnSF~X4s!f0tN~EZUpqE(p6*iuXN86x4!U_d7FqG~!0Rrxvq`NynCvX2_-#D+m&94!kD{du`aw_4Ga*cb z*#vB5yE9phie$5x_}`8pn;^EF+kXwwugsp@4*;oTuq9D-^*iAo<7LO)KSC?^r&}Ym zq_@QUY9|}vXQ|;cx9_9)wrsAf+oEuD7h;pOy#QxwH>ar znmzNEkcT+p8VOiN5XHM*^b?ZG32}%xKZ)vt0LDMPJfbM&9>ph11;<1aMX8+g9!i9! zZc2#))C%aqwj;kBy@>2fMjOvrZvjPdbN3=2tIMQ%#opPv$+!>t8n=$~ZKByI%f7bi zJ z>-%*AAXnoQ9<%_`sX!L>x3)xr2C7S5l6>~I7dlbOyG5kkG9I9l*@^pk{}ckOYU;8c zqghDaL)ve37MivS**H0^K!)|2W5sRsqPbCDPS`qe(LkK=bR_WyTC`Kh>|W_P62KJ} zM?^s7FZNyut8%hs8@R-rBGz=*2a!Sa?K0uXQ_Xx$zjA?tiDeMX3`@ivdY%nVC>6&2 zrI>OAhuJhvF+h0s^iS}PsG6r`k`>*sRByxWsTMH>L`AYIojzYq4*5J-XHEerM{}Xo zeM9OEYY3S=8fi4?+@vb%R8Skzs71wx0nw8Y=kz+2HO^cc$rDY3FY3pih>eoNRd_Qv zBR(xp-)b1l1tCuL^_Qzpa%t7UZjJ@x>Zdt)ofiz!8e~Thbo64uVt+uvfzgkPJ%?0B zw*K{WX9z^uK)&(5t;@2~{<7IK(y$j{o16`z%KTf81djcRiv1Att=-XeNsfC>`Q&x( z$E`9|ifHFR9MO>L2pj05`e!!gAuV2(8Gp_VP1fy~#b0+uz~km8m)EN1CU=XWqJun= z&>3ivQKiDDdUq!nf1epM#5EW#icA~A8RbO)w&1IFe|Co8o{B5j7hrGYJ=Swn<*7(>5 z;*hIP%Lw!0>Npo;rZ;k9S#AKV_pZM!K*3&6fr0CLrs2s-j@+%+#*YzVArXKxA;b1C zxp3DK%dHq?lwKt%O9{~e8F^VgJO=bF0!paEAjDYITx|a5`6g{ak{H*wj*z##-{)TE z;V0ls_Oz^)mhCmhLVHwn=JBsgnGw>LoR{W&cA27o>!@y@9?WUhZRltJ7%ZL?(#I@T z?vdty_}Wi3;?Xbiy?A>>^zX_jw5!N0_U@fum-?FFX0=Tg!zjF%QK~VVkkrQse&>_W zR8N?LW}0N}f4q_@`HrN2`Bt&uNk^F=Xt)(AVBD*%4x2Tz)dh?CMRgFw5eN0Li>EB*(Q zSWGNLNNwAwghbiv_F@RY4_j1*H_)W%P{YBJ2N}wX-A66<_TvE<#W*zk869egfg2aS zoHCr9p6x|NUB<$2Y8G(yg`2hnVLP`Gl*}cDM^;w@YlMF|`uIf&%y#pf5C=+?&%ui& zkh*O4OuGEBTI;wXbl!dyQ60c05+fRfm%PD#c7aMgS}P;L;qn{`ONV^BW^mSI((_Jh z3_hg7L~<^whgmbpx>DcP zo6^>lAF-bH%Jlq}v}NO}p8c|wDX_&pI_*yO(KQaDfDR~``aQNfJTdoaiQj#zxMg8u zrK2b`xYRewCmI^@u-VuPKcp~@2mcr?E8#nIxt?Nu{zR44FOr*t@p))QRn&?J-HqWP z^SJKw$Vs8l!?(r@^BpC6adR^L9j@5sU{XKIL0HBYBGS!tA_ZFvpKa2O`?#6gll%08 z!7YcY42j1kpEviXj}#A~SMg106s_s(9tlX$S>{MI2)YJH9ITjmj_Xeixz@pjhZe%C zyhKQ_$I|T%S%1}3h)LOZ-{>gjH(TF-;!=D^#muN)QB*VDa&w-q`l(;y!rfCEmAM$v zeL6mK_Rc%5h4klNg7hrg8fs2V4pA&%LPKYA;ry&S-QwI6z%@jPU^Z_L^~2Qs zFXPE>gTiji`^K6uav9YJcbcgZU;QQ}Y2loj8)J1bg=}qZyWp`5aUIZ%pKUC(SXZ3C zHd7~eArVLkIOr|6vV4sRwWqpfI~Dic(N8|iOlxu5KnCq*;-z&GEYJULKUzHouxB+o zL;*~qxg~dh{qd>NRlR{0>MC|SYix|8QAg9+YhlcT+(3Y_(Q?h&)kB4@#OwL}Mwmdx zhQCwKhUvC6h1aa%-(Z0+uTsA0a1RL3+os*_OZUF?0TIf1`lw+OO^5<)4^e2?uuF%> z=ys0Ps_0+V&p?)FivSDazt1Sz7?2a>oQsrxT!4%w#UM(_1U2U6NM0kpq~gf<51uwQ zzT)9r8O=RQ_*(Y%q;xvrb><+Cw)i=q?MD@W<@9X}Fg3;IJj_FY+R;opaNqcKB~X8Z z7XvQec^ND*|33AXJPO;Plfq+IPza)*ebv~F+YyC(*6bBEN6ao;3<@=}0jgeX4~&t| zM6XEt7iBlLEmB0|+{2_a6*25vwU+WcdWDCpwn+@uAIvH@=7`HC z=g)i&^x(A_!llax1nY2*liakb z?aSFpQhWn{I=XM6q3fLp(4b-j=*3E&t{5*|I35()0fTa?jgaP92!UTRf@(=1h{BC3Z9up<_9_?o-T#mbinbyB*m#As#Ypin; z&Cqtvc-{Lvn{?U~xC#1}ezjrvXgQa>XjOU{fMe4v=$~a<%Y$uQ#Ne<{M6oq3$z)l^ z=@kAVns1kYMJT$ce5qN+h2MIFnOP&aiJ4UGfWyfuSLKi!_| zr0#x-muZYF`ek&gK6hCs&3}cgztfcIRrxK~Ds$Pgb0t>^(A;`C&3WKX90-s;3W#X0 z!3@>F#>@z&Y^;>)rf%wDPdEHA+G}cQsZ8%km_SOr7yRgFGb6@#=O(ILZgn|SRnuC7 zF-S~RIC3>)R)gR648 zUY-+IR@l?QdOYwHwtqzRM?lRaE=n67LAND-X$v3#M>|9whKhO)6&+fX&^gEcKvN?e z(=qRb*&#T9_q`Jy`zMw@k_@Xab+Rj<0X^yH6fBEZed;(N_;t=8w(72iC3Knn?Uu~# z+E<4p&w5+5kg%N9dD;J0AW9thy7|+#c)HbF#*Z|TgDQ8*j}HTv)nfm;Tr9_z?i`zz z>J5EP)T{Tw)uiW6*=L}B%bJ^Cx{U%BGxJPHfk0m?hlfyZHLo;U-Zkw^SE}KJp?Js? zWp%7}?9Bn^!K@wb{5HVdq325(N1Gjyq@rZ9{ez6qUu4<|Z^5rg%1-kuC?Uk&;QsQgzb_0J)e8z(mN zip2sJ63%0shVKp5F=O~;_d>QCFGyXC6auE1ZM~?58ohg3i|dVPTj(fo<4Q6ZDus__p1TjXK(PAe<^d+xxIly|45 z@6hos#{dS^$Tl08pq6rE!va5k(Pu+cfi|l^sbdDH64$y>^!}2S@jw9>H?b#OeM+71 zG`@AHdJvu`r+WRHUS$S!x(G6q3{KYvu|hF)e!1F&Y&+H?Qa{GP=otD-Y`gk*-ZZxM zZRv%4IgB&=zVmQY1h9U`r`8OkV&GV>_g?TKIJin3sN??Vn#iai>VPi85Cfn=>Gli9 zKa)8&STQ2(kHd1_$T}$6&F3-XPb6Wl^iWT)N2?NUJr}KmxqYtLE_^$!93$GRy@_dv zn}1K_Iz+AQH5ANXtP~#KUBh`_*&EPjNZMHL!x%I-#=Nu@h4{l}Rm#@<~BmdL!|Vn(68u*@9D$Y`qRwUj{f<)8U^uj5s5qgk)+xUb@ZC1gndah&_!t zb6wp&j+jXlivcD^MyH7nRg(s+%bq};0%}#n#yU(1=0uPB{h3Rrg)91?Ke5fHi#|Do z1fc@bM}9m<#q86ywuL_0>17DDR_SXzr^$Oq)$-l28+6gX1bHVKnp_tNPv;#gzG-Ir z<9w&J{1fW3<|34#U_0v`?_{Gpug{PS+yBSYSwA%S#@(N81O`gOfRR$8yJK{!q)0bN zOE)+PM}r`pAL;IL(k+Nc3<(h_=@{|cKHvCZf53L{zOHwi^E#VxV2Z8H_oXwp7Ovlk z+Vyv<2mELr!}9zlyT4dVMIp<^Qr$P->G=9pT2tO@AFSB-|CFS*bovuzqS*}W$I%~x z=I1g6^VC(j(j5EGnY`X2I7g{>pKI%nUj3nY_UZ1MNQl-%&P410yMWS379N~_a@9C9 zi4CSbTK9RR0!sb_&ueebgHAYVEAW8|h7&e>SWXAAnV@J>_%_fpAOM)~);e3k$I_^t zk~?X@;cMCVaD9z?+Rvu`h!ddIL`?siOTi{XvkCK7;I7~3A&-1QUy^h0?VvwWgKz%q zQ`XyRzlGW-;(soTQ5~~mnxvqNW+x$F{Y_NJr z_J6SyEZ25lOk96%t#LZ`IV>9I&qOR~WSKvj2vA^bOv(>CG#%>kb@)L9L3|`Buwjk% ze`t4oZkboP`Qp6QJVrcsAKT0KSVbzdJ!kM8j9QxK5m*0@_NsP-_M!oi!n$MqhgaAS zmS$$V7xYVVjqlZttfG)gz+C+5ph`kf7L%l&gzSpMlGw=O+DwrZ6I0CLZ|qYD4)b4F z-e>Ks(Tim_#h=Jxzod`urqj`?;%ZHk{-ZH$KJnUjJIrC<%@f@t@1XX3SN=lNJ>hDkT4**tBbr}JF;75r0ZtvOPDmDF&zcG(^5uDFqPfBp2}eb`xv<EJUzxU2YZA&mvu@Qgxw=J$T8 z3$+ja(58j-Esc?2{-R(r&K_mr{o6n6OU<-d!yfohYEygjWvBCw7`=Iqn@;k~75&BkMu(S80j$A z5Bdw-8*sE?HZXqy3hIBK<7N7FOu^aRw#q#~pypsf(xIX{W@z^x*PB>igZWn_f;15m zaxDc+3?@Qp+p_PVMvH4_R@Wo z$Cd5?pyx`RGc>Iv^xt#-I*k%MdRFIOFwi2x62I~CsutunB6b)#mmZQG4ktp%JrkRd ziuHL2cIF zwDn6RA=yzje}sq_y}dfV zmLq5VnzUnz7m50C?r1~M*^jk9ql|%!HLD6)3LEYTy<^^spiOEp$4}f76=N`Qm-_p| z+x`1%)3d9L_TKL?<}M|x_1s4lF5fobo4@4vpP}z3`1qxrZMlCwiS1;zY}Vj?F13k$ z;CGYr9(wR>+3xOC_yy{Rw-SN>rU{l`?QooD(hGXsY1RiEVZ{MiC!T- z5Zb{Gsu(X%TaDUb(F0EDvXzv0uK=^j^G)3nj{>t|bn1%_Em!3=&xmAjJ4i{w_2C*@ zGGlwTkgVu|4t)&kI~4+D?J@+BYYcx}s7_fDvwW?29T$xH z&ph9GH1a~V&BM)h=TTZV-a(w0ZSWSp^SKAFSlSe?h^<6iYj?bUR(B;ans!yR+GGy%yVc zF5hGNlts3+dtXwQbvXD56VAdecv%&eo*KFpD0lto2h-VE>JFkWMuBM?U@Rr_MLO(d z=vq()%ael6Uyfz<9tq3JE+YD57Ullr2- zT9<{bNv6OkQH_!WhJ_pz^k`~Kcw>HZzAZv2cmkB>afoTo|;(c>5xWO%p9 zj9s0Yv@7PF)xS&=v;Ay(nirTiX^Ftv{onu6pBG*H8BOTf_b%@dA~w$Y;1L<eT@hxH$?^AsW~Pbm1}REWhTis3&t6mTfF z2mK}Ow${23u^jjH_vT@HSTO~&t?#9s^w>lb6(U$i=MX_6xzyGzl5co@0XX^#c zrbAVn&lFT9bsX#@t~T_Zat6mrZ-m#7Ry{xXY(^3L$$JI~rA1&OD)vnl^3dcg`uC8KvX{vec!H-b(ID^mGaBJnwQ&Yblhw zuxN^JOu$HS*N|go%Lz1{VoT2;SnsE_j*MlWf_mL{sOhBh*!kJQw#(4(}*Yn8a;*WJUaev?lA+=tfr0%O11nmBZM7pBZR;aUS_~ls#9CM*Z~y1{n-@M(#4GrWE%kY=65=-qngEmuV8H} z>Gth_7c)B%hG2uvabRc$$4H=r;FTQR%PoGG4}d6_6m(4P2PiVH+lAZ7o|I-^-f_&@ z*y9wjsV63|@j52z$n`YLF;e0cb{;EhvX@u>ciw&0Zf0thoID-PhfZYYh|l>T@?^!m zD}e5G`)T4=Ub0H*pS9MCGArFW9|072t?Qd7eB|q1x48=B2UvRqyl{(zw~O2E4>PB; z7vygWZnrpdw-~5GbXN9;h6H1s=Q9WA|IfMOFKp%ilAKSP+(}Tk(6<~{KRJ+(;S0g` z*6fu|emulVzcPY4+fRS>4fLCs^|huz!;BTRY{6$`tnRrRI-{3$XSdRSFTc1w$ff3D{@8egWuKD5$)hU~;Bh&e=cx60)yF&N8y9uJ!IHbp zvbZ~HL0nx^i-_y|ZUD_yI3~7n*N;zIK*}_V+(3eDHo$xI>&oiStRW zo)Qb*xq|;KHvsbxe7s)7wv0N>zhqRZ2E8QG_Oh{= zbBcfdJQMIB*1TO+b=1RvC6X4Ow?fKWjW8iYe<~ES*G8NMFOwbhG7@>j2$a!OZx=%8 z`nDm&FPK~kx3BjFs-#{k*;(2d(&yIy6xo!DAjK|tM`!VQOA<==o9w@E%^IPHa(jvo z%WkN<(9Gc}4NFDA7ZV00OP3b1Lz&cQ>V$GFzU$G!^vS`_D(s;F5^?t>H|i`@<0zKs z&Q$YU>tc<_L21P3Y{ZY4uBw;0sdwThUFv9hZlOKbI&~Xyk-h3B%kwAgd8ONP z&YLx@aVWPQ!Cwgzp6r;n`P9|Y)nBfL5RAud@FS`d10oP-b=R2RoW}>1k*J&U z0UR|m(6*$RT>4SdH$dwb61$?)K}Eeq#Wl{Q^;g1fNM_X4I}&N$d!KZ{{BW$Es0LV| zoZ>J*IqgIEAW=grS41`)1GK=$T<%9UFqkG$mL3J%>EutkGTq6soO`oXQ0O{5uBhhc zFnJ&ZxmG-qQuw1`G#l-E=LbzXWMkc5vr&@|jOh_}VkRKWL<|*b&!`NlUC%E;UYo*% ziThg~u_?;&%q@rc!^!5vo5zw*NjkF?+n?olZLKKpW!yJ>r9j=#)@#+wcoTjstQ6(9 z(b<_ZZdz}Xv!`U)UumhJe}K!{P}a=Yp&XY?PYbPgyvT>W*jY9=WOLZ{IO2)~iK&es zHvL`E&`ncc>+z=%Lj=?Pm#Vz1YZTLpjM+3*qANUVoQz3yIKO@lY-$6wiOUm#opTP2 z^i#no5dJ1U)CFdT-GSAJ9m_b0wpF1v)bQTrGoc!wZx|M4sc-^QvJpLJc$jOM<8ofH zu&VpfX)7nD;AcG>NW&mFE#rSyPupd&nb{xcT?7To!`_phc)Aa)A9qZg+^BW6g~W_{ zNZ78bi~A|C{0Ls2Vr*S?rL+XQ+iZO5Vb3y&mt(iYf}~P=%k|4%>HMvI-6x*;j5>Up zCZzRgqjZHrrsqr6pR_(xE}xpBjcCDj^lD;hRGG6bYd&$9rhypwM;541(YG@ZZ&nnF z(~m-e4Pp1d?C*mYiw)oa@T3VaD)58qZG8BSevAu0zp)eHpdez9i7wI;Vak@+P3}G` z7k`-{d+7B(LFk8t@H*;#wPLy8dcv`5+{`2?a6wSEJy#O}ix~M{Z4ix2=Wyy-)!A;+ zQw5|VI}9yd&Ti|GhSA2TWqgoi3WbXP6@s$lj3R4iOk<{Pk-xZ+WBmg^XBf z{a2sgXn#o`k^6;S^F9v9H0p=eW|QuXEts@Uo99^xYL;dsBVsP)n;#;2rkqPZ9;bBIOM+hG7s0X$2zm(aw2E{5(y z!`W2Nch%nYQJ6>5(6<{H^o#CQOJ;GNd@NRyiuegAW0MfBHVIN#qDB_eu(r#T?@lgLvw41*X{Er;b6%?aBVCB(hXjjM(us zyOb#)CI)%7X{OF8-}>NjS+*|8Lz#0M#fEz+#puT^6+V}WbL@^OS->*3(ujF-Yfiju zg2o7<^fhgASGO{)z4wqx8gaq3A~&+8h}ZGm`qO-c>BR{R;UJ04o>z)7=j3rXQ$DGj zC)e41w%+e?=+Zx3G5)pqH2|J2J9)IzFnuh?f~Xwd=2#vi%Rh1CJU>te#%0?mFC6%s z=n`kZs8COiV`4{FRk~*=8Xzt2LB@1CbCsSC$~u{rlDs?B|0lPWN2f4fr)+?a1HzBU zeu$$&w8Tx8g@X4S#*m^6)pL_)Dv`+VU^CAEBO#;_BP34YMf!htKP<&s*sc&2W*ICy+%N~{)B2e{?N=(VC5A@`&9J$x~snc1= zuXmOiCTPp%6WVKCCm-||(c|#N`7-OpjmX_vYOnK!}lEfd2Z_~dLSq& z;Cy+1r3|8w=H{$Ue8O9eGjP{2(?e8 zBM&6SVKt$`q+(HUwuY(*{d@#FvBvg(-dKwtBm0dqBruOi^fPng^8(cqr+6UW+R!6a zEB@HD8y{Ekn=`uA-I6#e&z$b*B!5JCefLIYL!syZul3Ir`>w@~ph&xHmFiH1Jmx}h zOe_tNh(qYN91Z(mES2FcCK)T@F%e^Zri|^CaTV2*ALImSN8lZ}3>ZpQNOWL(Qg!q) z5E#j$-Kh{Gty9=kW!mD0aMu%F7EYAGkI1-!JA;d2-w?bHz3WxzpkYh)Sxf$}UBjWR7*7b(82?fQh%>g73D&8)TKs#Z-)SIe zqGyyOF`@{!2^jF-M`>*Y^r2UK*||&oc+@~hink*HHvT$8+^l=Mfjb`^tKHL$Y_@X4 z->f8F|4DyF)l!xCCotQDUH4mnoOT_K6`rx*nrUxIKHA=piJ8FZ?f!D;`BYGM-XPna zYM95BlWiHX;C6`idX5Y8iFr355^YDZ8Ib;Z9MlY3*OMb`^wG08oaHaM;`4b0BWCS; zZ*2Ap=*ujKe|mfDqLY(fjl#1oqq&%2iL&yzSbnD3_l)WYt_+OcP|f>IsT!6&tJ!Q7 zV2>QF@=X-N9JiKq&QSxzg4lq(WE*9Tm|`0fZHcz^+J7G}ExfR@WPtQu^Le^5OS~R2 zCc&l@kdyCwg(s=Nx~j9A%p;y-^MlwBw6`^)%Ou4q20L4yQxXdavhTnPq~Sx6z|V{Fuq#2GM__vsKm#lt4oyD|*(EQNQxe zArTq1R`cLZCc`&Hf+<+iPZz?T2-Uay4;n6h_)A<=^yzHl=sY5EJji#sV->~BQ#;AQ zS%apvjJDUNTE+^F5NgjnTyC2t;M&3+J6e?~MaL9O}p zuNsE(U$ypGP_qWE3oNXptLl06a^ppWw!^oG{WI#J2HlQxX65OTw697>@tA>fz*a3= zd$cqpGZWwNTx&F|!7=y5Oo~IupR8&`V_`wP3R;^)fW0WPdEz)`SjiXjIZB15<78yG zC;&!lPi7dYNGB@pXeD znEKP@0kD>h7P$zk+R-A49Q^JVsKDBXxf=4DzIN66Of>LMg}q59)xZ~w=e5GqGGEK3 z0(y6S`wGjSwU*_TN+ugYleiHkI`!FV7}2$lVf)Ed&-*eu4~L*v)SHA=?w=)Zb=&ct zE4OD3CJ|v!3|EHg@g1kI5*clAuV=Lby?=1iu>Ae;=$GCEGf;x=hH4$ND2y>c>(!iL zmQ$Z`;LCsk^0Hpfu~iYWqCPebiX~lZc=50*&r3nF(HkQI5yCqELy_?@3@&foiV!y8 zcVi72ij*pmZY9ykPIEe#*+gl`=fryBR}>;xE1UEKHB>pZ1N0qn`~%q6kfXij3I$es z-gM!qd`($N$Jl%pMH3Qa^+lesHY+!Tt(+Imt!2pz1=O8PT%U$1rOOY!Sb?7vu&M;| z#eR-J-tTQ_mDb?H(j^56h}dCU&?b>-U)ipoarEyZk$n$m4`1&Az`-&_@{=y^wS&R3 zVV&#STMH_PrkXqtf@W`vJ3t?J;~%{wa_&rAELA9+FTEaHq=$H)yd`Zk>1d_WRJ3@w zI4}YmEQbEQzKb@t%C!?pX&wC<)}Y9L#FAAjm_Qq#z;FR<-ZVPVSD3ETWjT}`+ULon zhZQ&pcKdPx{7Vm&s=9ruhn&0FMAPNv%dBYTE)Y*p{?A_z79Rq-EVW1HD_z)AvEYxWp5ym-%SIkP$SI~D zsF@~XalI8nSq7}yr+)2k8&mpu>B2Y>)F_~U@nqWWj-LY;VaipTgcyTnK` zh$f386&U(nuMIDf4ss&LLQc~s=cWOPK3#|&9>Ro_O9fWTw8VzgUI(jwF-Bh8qbovt zjV`B7SByU@U2da5T*Z2dUq36-vz|rHUqNj?1d&}&Wt*_vD)>B#B;c>asAR|m*q-;3 zI~6e_R4}*3UKU-WJ?anN=pchpBVO#0$IZ5>T3QLKVz#fu2?`PX#@fmK^Ru^^u9)E0 z0y31BpKn~Qp2MDF7mid{&F&FLA&ZsX7|@9lXkDQE@ZffUY3R^4}kgxD*CB^T4T-(iEUgK59$nw#BH@v!AkcU5|tqWQ`jI|h3RH3YjVl% zirh8dj%p(kr>6VB!vpEX^aa=16U2)(I2N3n4cmtZ$d`PnWz9rhRfi2-8Rb0HL~u{1 zoD2L*GP5J$7gpB_FbYzgjn;`mnzh6tMVEXE&@1cln%?W;mUjv6c2$GHln|S~_V%r2 zkNa$uo5KpaDlT9vRX!W-$+x0|t~=7P>s1sx1UJmR>q;1Ee1CF(6HvL*riXh`uITh* zRmAugu#T+$)lrUy^T@tnuPRbQ{rnMk6TIh7B1;^3ni}bBjW?W~Lh}j->@}S)izi~} zbLhG#L$WsC1%_2u?dO@57T1@oR={dh{Pl=4aZC{QS}6v6rFzTrr`CjOEAhiS zBA`O5ly);Y%HV6nk;gmnO zgSl0!E}jylzB44+daNU3JijVZrNZT;fkYP-__!&0;VQgdc5lmRAi&k6NYzph>_vQo z4lOn?HNO=4Ni8GLZV{L6OkmuuTV0xj2Xg#m6l(gCb`dg++e_Lnbj6nLh~ch1h=&WY z2k#CMuMy;r9krPuoYEju^rn=kNJ4QFjy<|Gwo{B8>+yZLLyr$wriLuJSk9fgg$95e zBT?|*QHb&et}?lZ0HAEt1MIf0FDMx_wE!mEH&^$~j_Xp@gsXE5kf`7hW=KVP55$1^iW$A=|NKz~UV|$UQXMYVzhAsQOmC zM9JX2I_D4zP6>Zn|J@<5VN1s7snMU<)sT{lt!_SCriwqpmURN1Z;N%>-3Tz~Fjy_L zie%Dg8@TJLJ;nBEz|MoE%X7 z2(lJ>BpYAXci6LBC>h00A%LSsgpiPxwH48-c`n?JGZYkoTtGtpxR$-|ZH54ED-Q?M zn2gEX6Hyu3d0x&3|Ljq9>q0f}J_V3>dhHScD9PqgiR;pi+q4ZKVJ6?UtA_ zHdUZf^g8GdsL?gSq_`zI@Se78qgRX>WLdU~QXYb6l8RB1Kc4J=>xsE2X2SoM@i&v! zVpl0U7beIk&G*0V$}&N}&@n^Hbi--A<3(dMby@LY@1FZEFA->a0*!w zfprK448}AeAzr%-d&*XGDG}$*H4WTJaqncu48%`yr`J_m5{B)+UY^L14#r_7T-*em z-B>Hyz`{rtxa~`4&Y2PK_q?>W+9Oo*r2#BwlgJ;R$x~S<+}m6afRBrpDGo9e{738A zxL4ct@3jgK`N_P@{BXs&(n$T(@&J@g5W_3de{!N^wLwP;I@Pvm(EWuCzr*Hq=Lc3p zr1y5wKIA|k2(%oYGJV;@T=|@j1JXj7FsenZhI*2qF(2*Gvc1~Lp-|iwW`p=W`O?bm zBU0wDv?#b@%;e$w9eYVev}x31!tWxVN6g!1PVN1TW#~z;zo{bmu)1I8;3tQM2_$28 z){oIp1crAU7J7c&%!LfUv-@+h#I<>DO-ZH)FA-EpdJ^_k_U)g`EXK8hQ1&4Fm2V4Qd-h7U0ezbOq7I3O(p*vQI~L;NOI z2b(2@Yc{7(SLI?ZVh2e8&z|z%VPkD4B9l?KnO;{3{E_p(j)_>RdgYUX+abAY&4=WL zg@6aDxAXR9_jY%K3bpbg8q@ZHAn~}PkLQ!)z37U;2Cm$g!|CiH6GmI((FS8}?cM>Y zng%cB003J<9;)N8U*`D!h)#ZFq75fbk0W_B>1I_q<~7@{i>AE}HICG0Y~g&(`nNvf zo*$s^>Oa->-YirU^zNuVh`*cp|3lYk@a+96HrzKYHD^Fq1V-Ylq!g_X1tTN}I=i(J zbT_=c+CwdgITU7goABW!U zD(Snb5dF}`=tN}@>&zXm2z2kb3SI6?u>jV3?={*iYNBdB$co8A=}|V5{5kerntF|s z{zJE%Z=Kx6ER^(+aAulTBYw$17);R0sFXk@vjUDS3S%q4GH1Tb`)yNuQC^(o~HxD+~UpcS4hO(C|TF zl5Pqa&~1t}v4r@xZUNRy!+XRIT7e|P5h39G8WEu-|Nb&*^u+Ig^Eb1p( zC%Sgd`ViuT-kX6|pN+og*HT!A`#ZC^K8wM}Q((KIcYC>QP8;^Z2uSu;nO1&)_ zq?@+Az6i0HmQeny)Vv!_cDOfW6J<5$GWMn2i&u?%{jt%?K&kz3j9&?AnclI>-aJJKXcm^PnvWbd?O%sax=blXyk5=GX%lAb?r68$n8 zlk}J@NntTvP1C8cC5p}LBIvpf!{U}RrQcKWo_%|PasHk&{CIpgbN5g2Wz_YQJ1~t9 zOa@AeQ2|4$Jv(lWNVRv7&FSodz~1Xom?UB%R5nvZvc9Z*Li~*yDX8W3$41DX6J!6c z){O;Yr!e3hI16PXv}x{oUq=d9>ph5wrXROj2C2fnK`vrvXtWm6J!RR?A3k#-Q=oCKGH(dq3h7J)E7dCO7qjMDG@(J zUSeHe0U#P)p0kQW`NQ;}hvK6)3I*0ZMKTTtrHs>hnHLZIO6yPOr@rn*Yt&VD{dRjn zgYAUlnSPt{L~jf#^a48&n_CP>2Qr&V8Iv7-$~_HxMUYSMiFZZwpuraV_SrXQQv5HT}Lt?j8c{?zC)r90F(Tvn(@vZnx#7WndvYb$y>gAMVIhR&}VUcRGi^ zkAT3xM)LuhiZ@}z3|ONh_s^y)V;YUEcKJOU9(?t5zJE6}7#KKbdgJS4?6d^M*2*s_ zvMOf#yV}S{*B7Dv-gU%eCqCTWL88Wee z^W}3pJBAX^e_Tk#SH$Ox!4Hw@wUP#vc0%|rm-=K7CY#V^L7tjs7EK-2Jsq?4ujt~# z(yD9wn*PBc12Y)cMc5vyZw_ocjVpv7HIYwCx$#0vTQ@doOnTRQI@{yh`y8CAhIm8L zaBKy`S83jHdW4YWmEoi9F7H65sV{S1i7)Z2(urr&mK-rys~3KOZoUD2U!(t0X=VMvSIA>H(#BWfdB z5U9KT<=&?`>H4pbl@fK%S`Hc#&QIyt)$ycZg7luddwMcU`9l79NXds+e;VL~r6&cl zD%iM@*S2--N&wBs|L#*vf7PJ4F+fX4SG9)16A)5EVcw%Ju7-ZZvdo!pth)Yqanxmb z&`88jylqGX;IW}8nrq@=S4jrAxRu{upw2QZ2Ch$42B3Tv^H9;1oz?mn@wm#o=>jD|gzFyCLo4Rx(xp4)dyX zWhntPRBaKR*`0kE&lwSt|J){$0Ms!-eoc88`&|w3E6Fe{Mdn5DAB4QnXBlxIH&dfS z24v}XFvm8I4NW)vtsN*tLJYE}FCszd6Ro=ulNReeLsX(Zzv%mZcj|T`hkfF{(FqU` z%vxs-%PsIKD$bk(GAMm<7rm#=I&(EUAnbkDReyktj#VAU@&me-;LF3wwd*M>Mxadf z+F3my3;nIk7}rGA0?|Zpg^mI}h>CWGj9fLl*F4=Ln1*bR2AhU6Giyht&!cxJ zR5Xdc-n4nrm8Mb~Vqndlls3`3Vv6(GeSwdYJNFKvh0Ajb5lS4xQrB6(^cWs|7s-y* zy9KT@l2foKAgS_yc3khr9A`=Wtyy{>+4FR{Yfhz1Z=vRv6Zc+?g_YMW4xi=GrPZAs zrECAfwr<$-%efsox%+%#4ag3I!p00u=2L0vf?HV>iY578X+RzdSx354jgm3GzV2lj zN|l&seF9DiN!bje(E`N^%3tWJ3BWUc8RIVB+ySX584YfkWVy2jeOW|pGOt1l2x?G_zmMwt2(O!I} z=h86HH>=2seYuqUqj+TB*MjQVP*TK}$_E>vf7hge-lIm#c7Ix2p>HYLYOXqUi zRwsNumeVSBn*cU_85=Li))aMME30W>0UWIDp3qE{A(~ zV59U2y^6JhS#9aez|lzdT9T%!qKYQ0O!NgYS*pa+)sQL=+M%T|wUVo*P1^RInme~; zc)++#^X#5LMu;4bRIk1N@0p&ZxHDeP@X>s2ki^R3IEJ@Lj#fq(AYd-i5T|rkXZ`Nsn9_E}=8(!^Y)Tlym zi;p%LwBx_8UByD|HPI|u#d5WLu~qCM{e8_L6R6Omsx7BGIqoG16$>ooU=_pB3Eu1P z<4Kb2|7Em##j4Xx01~I}{gZJ4dYZqAk6sDqh7Cukn1SqNSh0sw+8r1aY@D=Ai2{%G zuhsD2Rk}`NbjR6)`9qLir+OJjE`(VW(qg+&Udui%@$+VBr7d14B|91{gDWNkIP5m= z4bioh9U^^S@1DBv(tEP>mZqv{m2At?BnWj?HedtV2V=AV&m-k zsS*r0@D0r)X)h-rQNF?%^z}OGQM+a|0C{q5pIso(APnIooVz9u)JeM^&pTaNc!)q% zaIy?CVvt|7uotpD3aQx=@RA^A)O%HL)aH z7~X>3@h*vHWr<&ahyg5?FKNagSsxtlo%epdN7c<^k>1ED6e37aJ1;qw^50%cF zi{Z_e71DiM?`hI}17lv}r25ds+VcDad6M(VE-4mgw%O79N5;I(Nr##Q{hVF~~e0oILDu(F|J9!Wp#o=$yJtXK?GiU_W(!M~Bn zMl!fJLeUOIfS*(h{^2eLT{m|5@CLZPBa@~I!C|%AQl98?i-x$p#Ek3 zYQ0tOk4=Td7|aPlUo+*#wAaIh{69V+J<%D9Z(NN(79n2n1hz`7=US#%M&@gK(SB7G zd^rvOwvK0}SlbponVBkgBz$biSU~MXQZZjfFBWk@5WEC06Hlj&g6nllIubVgRy73i z)2#F~7d=B2UmhRPSN!keE?JZpy?=MX{8#?3I&!s;uU!|6%RK@WqNN$`eDeCUuS>Mb zgmkuNebH)mZ0?d#O12t@T$%^E{ZcUBq3Fil4gtF_sF3Ro<@q)9g1;@ji)UE?@{rsG zz(+D4?Rl7qa6s7~{xn)E76bqIu<$6Aob7q)Gzn?pg~`I(_F-B6u3sP8fVoD%s!srV z^{8_Sx)6sQ8U4>abhDyk1Q49d0hHu0V1-3V!G9Sga>LvlkM~QfbUW7$%bf~9khswR zfk`BE-P#~VFvgZ9!Q@pw7C9;bb22aQph?_cd!#_+5i-$*L3BNIieV+xsT72&Y=6hA!^$(pz5pbuT>&wj_qVpB_O#Avm#`t^k$YYi0D>5&xX_x*`|07KJ9vtdE>h|;QReZ!Q!yg z?RX`6#fTOVm%TSa1@tV-FQ_N9dK$2FTwNx8twe>-Hy`g6ykz}EU_GIvJJ25c3Wo`P zti6}%PjN(4=TXa}Xw&^r=srLXJt}mcU8`qelJc$GvuD`}Ex2JJ*&NGnNdbR?B8`SlzcINg z(&f(|%oKK*cC?D@?5Nz^NPbMB`=M9E8e_;~>81dPz*?$xAX}|@AvWX!y|Dga5;OWX@ zzym834z>z=WXa^3aAVxZ2^0`;L$zP+S$Bp(ibK3`z`5w4zxu%G(c z9ftn$ebh+)R%?jL!L)#$X*$D8ovv_f&*%fgU2PDGC_dJon@As&sp7s1uz56fH1i{A zc!+!OSCgI-5Bl05P2oa$_oGWrR*JFJJG7bb{3m3?77iEt6K6ua5qG%636Y4qiPkt`YGLxsnCm)IZ zzVssJcZ331t?E9lQw|sOPVS-MeQ0%xBZk{L9ie#WCz;&ey%kjZSK24^ow>&{+_o?T z73kzE+-pNcwYxfPEBwaun_~W_!0MIKdhIp*A`m!uIGK@=sbjU7naasY`b59LUX5s` zG@V_N?12!wegM_$bJju^^CdqGANggEwhf}$G5;cfJN)JXN7*sBZw7s{JsuXK#H&o3EW|Xx za&eZ}XsW}RS5#zAB`5G^fVh$QHu9nBsN_xG%+cLFbDJk%>}R8Ci2UuKY3-b+Q0xYA z$JCBg!IG7w(S3s8!v7R-iiC_MMRo<%@7^HAu9yN{jip>q z*!SAasbhO%vRZyQU4vR52)pKLDC!|7g?MguX(lLBXm*u6ITQK4Vl`A0wS_b{hVkug zad4N8L6Ke*nkjuiCHkN`UiO6P_K^bqD~c!35vi@3t%{I<-iP^lWW>25zz|}up%Nlg zd7*W351u3|O*I(9+S*xvxHZSNZY9jX*8iZm+wQu^&*oHo3xpZPh0ncKkQ?od3RJ-! zy6-5Wc}UyIs|G{;AJREr&SoR+CT#e^9sqq~sE`}mp)O!QuO{AF{C>Xq2;?f-mC0%b zVsiS&k@dfRe<$FKxXSH2?>g`d-7|Ms|H`Lh4$5J7^Emw88Kp9G7NhWrr(BWJ+Jk5EK<;mabW=W#Avoy+jpY+;=exxMDR2rZH3IR3g$TOxhGAzj2!qKf z95YIAHd>NFK1@dX^}52vq-R*uC-$KpLJ@8TL(1Ad={@BlgKv67II6KQQl)bUPQV*( z#Ha=?eGL{)e`WIsmU3^VWVBSNcRhKT=*OK}_N7_SObP_qH1UK}~vy7s?I; zE+6F`7&*{TYWMP+C1)d@u4y8WGhR)A2W2=_8#$`;O_8&9c5z&)jv9tU1zi(&=3_z3 zV)Y!x!v5li3!;|_uB${~-S@K0PAIQoMoU*~fG76|Y#^2jcncJY@nS-l=zoa65(5EX zV8q9cVBVBfV{?!#SkRMk%Woc8x+WYF%CPm37i@5$Lkb$DfxzrgU-~Orb3DrHd2Jep zCA0U7M8ko2LG6%7{cKa)*@d523j}a6gd|Pzd+YWAce3cQEg=JUOhoB8?^{iNENem4 zZux%U80H9-TRhVN$1nwKf#Ie+f^UN$@)Bctjf|2ostvn4cIKzv4?sO1_-on#BuiYG zC*+g)+DkhUDWjRlYCI3pQzf+Iw%>oW#_0XXHs$gNh1!0PlTq3Gd_zOOY8&G&z<@o; z!-{XSw3jSB4zbhj3#!Ewuxs5X=5Ozxpmm~bruczH|JcbXj1)ss9dR_)*CJXD5McoI zH0Svjk};_~C#~Z2o|1J0ngXzvu8H6R9GjHzAR=A?&}UYI=<+me#lkC!VX7_=i(11mC)Q0UdDtf;nlW*0yP(sy(o1Pf4LMefd~f zS%fC;^`okrI@}on=kw+@aQThcK| z6a!zW#{C{8t7NSqG>d!iaz-eg0rf^8j`FXm;Vk}4g3yWT8>3g7hELj=-w-H3YNGNy z>(wuUquh2~c*N!O^1ptvrA?y=jt6vVp4!E?HHxoNPSU%aE0a3^{iJ+pBi=qCNGQC@ zeIA@5WIeG;wJj|C)giAS{Qi0=-_@#1etKX6M%soHvj=~@4Us?7?575{g zmcMQ@(L)euMe!0lKLC|xL047vrWy|Xgg!6vu>2-qzoT~#z%NF9XAT9YG_dT~*%8=L zy?OMNIl5UaF^WlK_2B*R7=~aD7fe{l?;?C{>5*)i(f6lB6Q9@#LD#)=tISN4pu*!| z{YN%Y{7AaFk5owQi?_4s5t-wh(50oVE#J%g@0BWrAtOQcc{^uU`g!4*0PN|my(>2v z8+OKcG}gf8FRp_*1kjLxMg(RN?b_zCYBMAw^QpG;&wm2>J{PoE{^*bQT&S+Q!wY=* zE5*+k2Ot_BgMhDI81TlF<}PO<$R8Xqoy?e&hYA3dyoq#=22PX%-^NIli$(o+wj3rY zUZQ}r>dK4Jh@UCx)XB0GO?5cFX$Ni>2vZJz^y1U!cryC12+~1p9JafUlI2bCfC^ap4E<_`utAjCO-cZ|dmT}_X(sK*`G~3O8N-J}J(cwCJYzc@eRJmEW-y;%_ z5x+V#dky8VrQcWg4T-i1A6P)CL zD!A3l);-k{_x5@6$8PJw3|1_WU6rXCj#=LhBE6=MRO$g~1rxllNM-NXkiL$T_PwS^ zl|qFKI4xTdmLU{rEC&#c)+=j(ruZrI_D^{h@(uKXw7Qiv$w&g@xKC)lAISES`4TBQ zm)gMu$T+8fgP|h~d04(j3M%{g4_Td^Ewbr#d1&bnqGWycW3gAP>u=O)C$qykap-0) z${qFkGpU21(OU?t^l=K9Lfpz?-(G={8X+;0(gdVEJmPYOOXdKp!!m#lW7+#5Tjg%z zyYyC)Mq>9W0@6KTC?TL?fTW~=vbDy}*IoIXxZ?Z^;Pz>qTnR3107E%mfcb<^!abvV2Q;%$OtANG5Tr=_5~Z#d?HS7~^|a8|wI8^}4Bw|d-SUfG zNkd4Z&xqU;L@y!5{uGA2OAD%SuIw>)=}6Q!H}$FAi{rIM08=yjHBUS~z5fh+DLX`7 z>D_RyAR&(u|L1qJB@KA6YL*mBEwaCdQm8kU&G4@oVh{o=F*k{^>)tppuN^`r#jKwQNT zzA%$K+mZ~s7@|q2?6ef?jqI8O10!&n&qRDpo{E#^RC2a^+$v&ZI#FAa5P1WSCqur< z?wd*rg;30B*!c`eQi7fdF-&C5?{w7e6b9#z)z zq0i5(V;s}Fwk&OE+wi@O@cRT-HKw%j{;}MJgbv^CFHl&8xVd6QX;=@3w~vt$uMH3K z+Xsgr>yM3^wU>o=e9s8nV`dTeTs?}oE8hQ-MeLwY^ZXXsctu6`?M=1)KlT{YkY^=k za^I{X*L-=z^UQ;7M?7QVJv>th^ue(C%5;q!)mxI60xfb0gu8Sa>S1BhQ{*v-@yU-| zFLC6I6Gz{GWHRBd0(|+7EQc29oYvzjx!IuG&{y$)@Hx1Z;kS+hHX=Poy3rQ6dQS2< zzhKMEn~yN4fMM4|thxnev`J<>{{~V^-8T1%_+bOW0)KA?Co4~N-Tf-bvB_Pu`MVa@ z_7~TAX>tUVyx_pd`kY~5`A$di89bU@+fFuDAQl6x>b`_lI4$1ZqSy*IZP=N&LIJvZ zUN-oJG`EeLG7Ofyu=0@U({M5*Cxuh6Ci%~MJ_Gv{$h@+9Gp?DXpH|##+F2x#ta%#q zB?g`9L+}T*AkTyjl_qwD)2^S<^uIXcw7(k~FKIn*`^{#NZhkH$AO&oLojdrHB<<@Z z7itgDaEn!%Xv5#e@|~y)rq=;!1}5=|Tac^Iw3WNY3tFwl;|%Ki?v$X%8;T80vL1(A zm7&cI8yGlD(1_Z6q^17g3JR$J_7wd}QqKM3Rn)`cRLYI{C_(DN`BNe? zqwj_CgqyJQ@V)doawy;JK~h|#jdr)H3ZD&Y*g=a~&+7$J>0!iHK$P#@rL+0N*m$H2U#Stt z0uy3`hCp*L9$ycZymzH+pl#K}!^dG47#}_@N_^)SHG~1f;t;`8U!19hb`^gzq0vZWtc-)U8SrV2Vs%8q~V_TWF>k}n~vfL3vY3rKP zZ#K-P)bR((!-MsBz&;C?lmj%P<`@f;b6ANmS|f*xdzVQ39(vcDQolaT-UtM6NELxc zszhGB8##UvnbaB|`gABb-tQeT0(o=10^_F6r0C*RzvuByi~TNKh)`mxN8|!P=3lyX2`^G3h zC<^5B#(Eovadqo8?n5fL_g3(ayBq}$KK=2zk^s4xC{prHZXlycCIBEi3Cy*`3yrri zfR+Qr05o#J-e*W~HZ?Qz=HX9C;rPju#4n9t<_-(+0SWn&lemZ*$QM<^G+=kp8%UL@ zC9WK2T9EEXgUe+QW3}7CO;ZhJnF5jz#8wLq3wMC-{R+OF5D~orUD9EtV)xa#&J{G! zpLtNeCg0;{aG*+zSbX=uX`EzliO`tjb28Dd;DV`Y%%5aZl%?!5)_}Ex7FnQko7rGd zM%dC`+SQE1ajMDn@x&OflkQt74KmQelMI>*(Yl3tv5W1i2zaULqCS7tD{IgMx zK6{>w`5wl3DYDNQc_#WBcZ&=b-@~qy$p{J0Orx-(y<_S0#QDyQ+8HoWZubR8Gfn=e zbnPAma`Zjyx~e*V^F*G0*@R5O$Cs}bi_dPeL!O>pbaQDGC1JEIee+OnraBY~H>)k3 zCyf>H?H>S}Uj#NHY$=cnPp|mi9nkW1)g65=ClMJQsk`Sr1A^pr%qw#^=wWY@Xv9l8 z3$;sLk!+34Wk_taS6+QIVt9HqpRXi$qcG?F?Q4z!ODu?e*>f`VL5P}W0KZLJiU`7W z^>*q}-5p z0SO1A_>DX%si6rTFmsE9*mSJVnK$-CeFjZ^rDl87xfm``p}<}ZISV#0-_@QaXnH`n^Q)gJb`ph@nkpW(l_XJf#qyBr3C8j2g zUvUt?E}f@cSLzT^?!zaSsF5WuE+kI6y?P_OAr)mrMi{h_!>sgIXw7OhCGnk-*@ zx)rkKXxNZbekJjqv93UZ^ub;Y;z*;8{Ib+seNX_chEITs ze%whGU@q?kei`kSQY}aivOzjKRn(G3R8t;+(}{{0cqlJqa&Nx4lDNf4{B!iKF(zG* z2+$UUj~mUqozdYGzX3x43mzjSz-aYA4Za{{qe)A_4`|VdZ1|}P$^~5)p_V*gk70Kv zd24Fsu62+ni$+sK2qc^z(M7m+eii40IGyF~0VeZ`IqycU<=tfFC|l{E8pyCQB_)A*qD=?3|GH#-=ntTf!lA-=j2rrNlN}25d9sV55t7v z7L`OExtGHe=xg_m92Dgnc%^gk0y-^OEwx#rpe)5ttZO7B@~(39=&7bYu- z%;66T1tg5M-wcvL&56lE=4-ET3R!R$i?hIu`MFUy_HyD#4BNkxqySpv{15u> z_{SO}d2?fJy>~o`RYUALV!`TFCPC2W6iAe0i2;AZAZm3+OZ=7k0XdGy+u4Pu=w8L` zl9pLkQXxB4e((LJKsp2ggzFDc1&T(wgE&9q#}_Bs;GqsOYLfRazrx(O<7{j_U)os} zlaS$nT1vCrVxy7-b`?9>%af&-eRhG}Dnht~G6_oJd`Oe%{k6Z}!Re|pL#0AaHA|Tr_I}&rc#Yi90WPv%T zJ!m+b9D_@SXw*E&2A&K2HSS?ZQ*THUJM5D{tjjmWj})P`pYYxE=2`hH{?t~Wu-|2$ zT)j}jcvTp&$QvzA!WViR`;+y77E?2J7MKfO6GH3=m9f=N3EjSE4cs=so`vY)Ylg)7 zGe+R5j2xm58#YG2>Ad5XysXt3L4v%wDuVQAE>O3=wqU4g&;G{_cQsHSn0kDb$GG;* z=i=)pzbjc=?euJx(t(MczL0`qt+U*^6+q3644Rf>_c?7B5L?`_Yk2C3Fx3-0>k#vQ zdT^RmZOsHB^obLlxZYZrIBTl0mq8N2?&V;Bz1^EXOF+_=r_)(CzQs7P`QeCV1j7^1 zZb${NuHdcgP0U!M(+h#FeH@&gQaRh}FO$U_cZ~p1G9Co}`mXMg zF5V!;XQg^E^9k{1wy>v2I zopv%R2Aw4VZTkuf8a>5a`ELb$Tz}R3BKP@~8u^as_RLH;%O?WcW#H}hFO$P|*_=uw zB+QTU0ch)?PzePRkiC*bori_n3LI+uW%^c)Zb8swJoAT`pKk~r3n}(?ss}cziNL_7 zstH-s-^gR&G>Vw|)32bmZ5Q+#jz8caz5Iiz1Zl=kj*yxadDaE2BIqXM-iS`eH-g1T zvpwoHCrh)(UR9^%IW(weqYdiPvNr)xiLNHiKwm#?x6*Z@j}lo;G|BXEKM2QK3^Iav zClE({RhYANVrVEMg#-2mAzeQ2Ez4u~)_m1J;wM~b;cn&pIV5Ms z@R;FY-1j^w%W3Ni&iviVt6$4XJH#u?cJq>$5#%5JN98_ zaVKct<=Y(D15af})(9XpDJe2N<0XxD{Vnn@7ll-|v)4r32(JTCM}HcrCx=OqyiIPj zAW1pR#3sO%v7=fs@I)1Q5Ip0?EgEC6v`nklBL|7r-MNawehOM3M@7b5F%bv0U@qPO1i~&>R<`=UQq)her(=;O(yq`(7eooee zUs$dOU!^P!ID8u{-Ei1Oady~a4?*Itx-Ji3G%cUYfZt1g{L-NEOn1QJag?z(36ARO zMbb>FBs5f)bMdG<_GV>$F-|VdLIt~NOWfGZ=WNWmfsE9J7WB{M(0gmxnM74&C|22T z)(~WYgbx!ij~fF53S!i}lht1dU}9Wl1lgq00E%Bidft8aI;SP(Pk1!u&o<3jZHvTV zIh227b+^ZKFUrWsQy|CEFKyTFc6VeFPZ#aQ1EzQH{Lg2I+`*a?ClA;#M_N)ua$)OF zow|Ok{>ntopQ_-u#}2@3z(YS6nju&^OR?|Z(e(^`7 zf*TGkEw1}rRFAEaXI1?!Gxgc892k|dK%!h#6`OK1{Ou_EEKH3XKSg+r3p<0WnQ zMm&KD9~G>gq2Jmh-?6+`&*1arbUuJgO>;9j;x8rb*b!@U0?kOgJvg&cP26j>O zVuf2Q9={=k=S18IqOqiLp;zOlS{V|3Qp(n_q&3oEK`0YY`&-ZyLUcCaIOU7;xmS^E4dqiI#0qpJ#W}YuAlUfMi zu4=m^RBDPj864@)I*6ZSJHi_h4-fKH_C-uYLZInp%>XD1tOAs~`^wJaBZ3~3)yyD15A1>5SZa|>3tE(qn~+-;Hpyk9}UxO#Rb z&D@kNaR&VRN6we!MA0Xmn*e;405FFr7gI$3Edmm9mQD`qi_Zp&0|#5vT5B0oSc~$( zr{5@#{+w=p0&=0k#fZ7pdT^Hzg0bv;&X^XY!w7QUNEA)0+xhG*?{a=!FP2>w!+gay z5_VV+6NFBCmHtbvR=PLTXI_RveRdxDt(*)CW^I0XD|Wa(@=g*3tO#(CLfUJsfh%;{ zY&katfrSD1{r1Ufk^la3{$`Ej_5Vs$;GdK8Vzupn4ZZbxEz^HPGEtMJLBd+?ik1c! zps)0iJ7>aB#s%oDtg>C}xT@OH{+>j9^%2O_Us=sM^JMWOa5WepAta#X{qPsUUlm^b zM+*OHde>ih{am}(ABTnu!q|muNUUdPazVl~vhQXo6O-631~jl^n@A+;;QA zmQpwV=w0X^RH+!6H1ANva_Q4uA>j)2(HoH^tJ~`lly^(b7|}oB0U1sA@Hs2| znAe+xk2YvLzF_3JKmNVU2v(niO6Y3@AVjw+h6oNmI>QmqMw}4@)r1HCvW(jo{zS`8 z4ik=AR9#uWqAWJ5XBpC@YzjwY9$Rk4C0SFv)!jVYQoG^CfhfKl7CztcQZFm8(h&Vr zw6*{6iHqM?xUG*V?|g!m=FOrtaTOHxF&pHWy?G`Xa_2Y{{GD0UaJ_<|2_R5Yx<-F_ z!B>Yt248EQO8>0d75i>|q-HTQtzqMH*5-cBIfo)XnEHxDDu+@Kn3=rzzpSa`-PBuM zZo6H2GC$lvgALg5Dc2WbAsMKqO&uAm^Q~)RqOMN&IiOAuFuQx!x#{mj3%YY&w%@)c zq6UyGdEyNTbB3koJr5EMv0(STVGY?}dRyZLi1r%*T3o{fdVv9erkk?Y#I0ifF#{G4 zWP^85!;GNiM>U@K$~Ay*pt~rrfAy8}GIsKK@IIIXk95#W3jP{|tPytCp|rbxoZs@$qZQ!*60s(;o- zo^u1efTz(5Uu_zE?;(-Y-5frT5Gwbfz9{A5Zpm_|PlE5?KQz($^QFT7+H|LL{ zm4~zf_P;ze`d{vRyIuVd(8$ITrWgrRg;kTUzNFY&4UoVnkT@vrO$`yp*8ju^8oS%g1oy788UlE7X)qpR_$Zw)WFOxE1 zeVV@76MtTG8Ts%dgdSR)69LSC+sVrf9suPd&#e@#3y(P;GHr9g>BRDj{koh>7nSfF z02}>37n8o%8xuHCoz5@F?1_*4v}=wMHaBoIdhRIlxEBE7L>iCg7m1h#Dbl#?+7kk0 zxc*%qre``vP}Uc}1+ue06hz*Uc9paM#mS0Uf|BOE-&SkS?le2Rmj$-fFBuudgWpVD zC}5V11edmT|MlgM7$HxK`=%5CcuRt-Ke3zb-mIx*EtqLbg3kqV`#z71pT? zsigx*$((<^dpoxhcw6;F1u3ZJY--^XzonP-?-y*+1U;^#PJ54n!KJ6-m>}=tc=N1-pji8XFQzzux&TZbLSN;* zOGve9x~@&CnQYNC6EK>q0!hRa@|9SfwQIi}jreA2>N|y)o2CYtetN#%yihgn(eaoB z?888kBbHx%OabzwMxN?)+Hs>{R`ID?Nz7?kF0PxYn%~K>+gK{tTxBSh8w9w?FVjq$ zR|8amQ6ul)^QtJ}?EjAIxU!s|#nAkY=gahq-9)IT76UTg;|&robnDVZNVrQDJ-P=7Nt=R_(O1V%k(=uH>D8@yl~ykv3x$a!vp3d|Tai-H5`cgy zEVo!PnqIg+ST3YV_`^bIbpeXQngXdP{## zuBIzqLPGgtVfVB=7rW^PZma1bJN0kcq638(gV`J7uIrNld~K%$#;+7%T4Hw({d%c9lc7)P%D+z zJ!(H=zTWw)F^uL!{HD!KI%q|>RkX9$W)v0jgSJP;`!I2Qe#;fzwP)=EJt0X?U+I3c zz&zb#m*rBS=mjY7#xDi$)Z}+HW{2hMW3cQhBqrrlZ4NJY9Sdg;ETv2Bv%-1027Ax=A$bW3$eTrYSy`y z2yUijDhRCUp;R?hhNABS*$J=yPxuNqsb4jkvHw}`$5aJxr>!K+sg}!FW+Z3!Ejmm3Nny6e(UE)=Nj6;WwAqj!GW>v=sRS{ZSc0NEbb_Evg7Ti zr?h}eZLlTWa=lScMRx(Ra2a&Wm_$FLchv4(TiEqomkfFTzOk|2E+A7n9#o*!v_a~M4JRvi7u2zvA>{?!FFD4gGSW!c*$tm*r_5jfV(+2GjK>?$hx39No6 zB1s5fCm9Ru~)U!!t}=tJJIs;9d&xv75ZMCyDqz^BM}!m(Ny>&24rv+#r$n z!)Um__oUxqp?ZE6|3CXo+&dJ?Vo*8V(yVy3zhc`ia%z0^EeQHqAF`OKsi`5u1%jjI zL!s$X*d4PWh&Gzg(iiRZHTTt% z9l4h^_|?r6P_3$0SL7tDW>lrEm}WwtylTy_)i`fRuN`&rNqjDvMbjQ@l8+snw%mBm zTeRD9=@Q6=gj;ZI+e0z<%u>QQU8o*g>GFg=axd`9gKq;_SMa=~f4^91fjlmND~em* z7@tF;C09-J!ZLeDWam*=aF0H5K+po!xM$NxsfHuC;9=$uWW9*vG4x{*J(ycbxr)c& zURfx$p=m`|M}y(~d&a(%HQo8kEIX}48LQaDv|9--u)Sk+oo{|1BF?H{SH-Oe)*!W4 z|H~AJe(LQzz$SEYkIHH%1!VFx?Fsq#J&IsC$)la>l7LviX)VP<*$Qkgym5DCfHMiB zl554PNITs%NvTS%JTLTK9Xb)Ae=6%dq?hsH7wyWTD!x$dZ&-OWup;A(SK9ld*}vG8 zmj9E9z+Ri4Z3g(gnjR<5rB6z8i^Xs0L5%^9yHbsUScQ}RM@`pUyRuzePjCy{o7*oR zoL^A))|5~d)XT}_Px&@Pt z87yZB+aN_Aamik3)(Y#IlF5F9ed_;h1-`^bhCH`V(6dLMECOX-&PK})ob0de6Ic5B zjLqXBi9JC;=*ug!-~#u0(=F64<8d1sIm-h#Mi=ghT|R&VZ=-*c1*XRcqRvo}AVp%( z)3T%!dPjY7l3q5t5Xmc$RH{{S?%mTADjS2!je=#p0RORZYCj-r&>hcfWe|QJDeuJG zTR`PBSzog<*-%&OJh%D3I}?0a>~a0Zb_=gtrR7hu^)#}}h1XRnyVvQLlmr-6bX~m66Ifbi2-8e%F?G8ZC~MkUc)1Ycs3UIGe|CT{{XWN_eWr* z@%iB5*5to0GY>P#3k036yCM1u^NzCU)Syz@SLQwha@F6-HIyL*nYUQ(y7ld1E-FsM zTL=X=?eUcmOLPGLabhvaKGk+HH^mqd>v|)&sgp0ZgZfR1UX81njbih_rm;Ubc8&a& zCMq&58qCb1KKnsEbRedvUW4RseC7W9eEnnr*z_=~^IA4OLvVCCPnGRta#A3rV>LI8 zOEme>S)04&an3wv%aoJV+F;;oUx5!W)57XqkBZ3#uJo~7){A$&Et_=iOrtKyp}SBGmBaFTudLd2*0ncR4-i zQ+R))t@cW1O;2POuVmWCRPDs>IX69%OGR?F>!THo$7iJ#o!)d}$C<1rfzYl)39PKq zZ_6C~T3JkB@w1M^ljg<-_aCIx1rda;Ad<-k9X2BF;*-N67AV2a9>Je2?mQL)&F_qoO!qgx1gfgUj84Qq zHKjFv3GQ7R`Dv1%k5J}C!LV5f!@zeUyYvEgDS}?=6Pzcg=&ybFZsn0dAuYH7$8#qJ zHBDa){KkcS0c%43Fat{-q8>U*+;;}`zi#rn8hcvd;;NA&k8AMH_w=hw+}^ZAZyK}0 zyv{89WM&S2@Wm>mWv7Ys>A722K5tqrYIqF(YaUL0nvANPdRZ#wjPT%lChbA9C>YPF zq&v7&11cH;Z7(lF_&DYCQ2V9mp=a4(ouZH{fx{m^cdy8-;>Q6p*nW4-UQ*)~z%}xM zYM967LT~g3bs>qUlx7Dq>sl6`tPUo)_Tx3w5|R1A{k7M?;N>M_y=~6#k<;Q#M)h02 zE)LSR9J0Y!&y(DORB6W@{7;}M@%2IR({Fr$HS^OiQsEL}Qef>(m;!p#(qkO9VZgL3 z*&wIaC%`D;#|JDKa#?-Gs=>cd;ks#pxxB|*D}sbTa~lY%Y#?(cdu>qHxC7d)j`<|2 z+zArPl`hVc5H-GkR$6jnZ5O@+thn_o2)A&_n#?vw$9V?vyGlbr)O740icXeeDE~(N z&)VOfmR0u5#;B^Ctrla32-o=E09m200CDgTH7=Az)VcNmrk8Ig!4~Itx*$n&o?tPq z51I@2|DyZO2gj^{%csCxICd6doD_IeP7`?7J}?A&O8@#8Y;;DQ^@amv zzPhM5ac|I5$Ac17MuNP^CTi}BgCEL#ic?1=ll;g45_%G(;CJ^~;k{;=dFPjj_Vye^ zh6TKs)^V)wndJ@*f3Xe)gg-lyc0ZE+fQ;T*46_FM=h}C26m=$f0`TiqZQ(M4z!6N2 z%J1f(*zfAHBj2<3W&1K#_G*KOc2gnhgtC(;;B)7A6+cu{HCdbb!JSL`0W zsd&OE^&Y`>>nGwCA1ag^r@{i8BlrRbqbLl%CUuvp23!(&7G`mWlrf~~ zm~f_nyg9Fny1jD9;Du%&Jpf);jhJ(%+9@;28jv`a0qO0u`wd{~!P5 zVn~nA&#ot`dbF(jGDN7>`TKqtDz?b_dS|@aJ?^RfSmn1N(3SU$Amt4U$UGNtL&Bc* zz2{scNd zdX#d2taLNIZ2cV!Vt)g%jEGga)4 zbp(_cS9;Qhabc19`Z0~h6Uq#fIoWtWS|ei1L$8%mbi$80wZ-VPScP zG3L7UT=)>-Bf#Uoff+sJdy>b-OLoHqcwH{5TCb(E5Z&0_W86Yh)!SE@oi)XhR~fUz zj)90kh7=LP2Bb2}PQa?j45#Th?eVlPtu$-MO8fi^>!Cz(!!nXSf;%GtJd-b6Z>-9d7Q9Z1e@BJE=Gq zzLgU4>yJ6MI44JaM|qc&G%PJb2Sf{sb$x@i&vZ{!I2`w+{OjtkNht645HC(5h??tI zWBr**m$8b?if0`QIh(iRzKrLuXr5%0#E561U`%Y4<7~Qf>hTh=0i8!V(aw5P=XTxs zO5eH`^>AM|q0X*1$$*m*WFFq?wr3p%9VdZ|#YEB~7eYxHkgU2CU}MO39v7mp)@S|N zzrr)v@z)qjDDb#n<~x#{5v1s~aC)wN;yzFuJ?4wWTWmz^{bocKt;18iRA4z9J67uK zX^gHK*6Eu`2J#P*iRP<(?rnVuHXA_0_T#X~1SCj(9JZ%G2O^bI^mX;s$nI%{Yg>yI zE7b7y4kb7133)5Gfm>;$jQcJ1-6KoPy>M|1{V(;d(mzQOJmLGUe@Tb^)pL|Q!zY)G z$9AE%Y_{R+s(Pn7tp{FjSgC?-RhdSpo|CaWb(^TYU-5jzSo7nRfbvsi=_1F8+KQF2 zs^XK8`$WV4S==BGrcUu;xkK#Z3a12u1=?p_Az|rN?H&9#S_>ch+YsiPXP2MUI&d$9gyy|G2jB>m>u^FD#~gA7x9gIflXikuY+JB6Y1S=2#+@qQ!M*mX zDzLrWjv2n-i=ehFZ*~3zV7NG7ga#$mqgr2IQ${_ORg~Z^`@kRW}WOplC7eKL?Y> zh@{lq9|C<_M9CumbB>q3Pc6RVmfx|ee_HG1Sc6NAByk=7u0o5P>-WI5KiFs#;)R?9 zGy$&T3EXO+t+AfT8(D<p{C_&aw@bJh3- z%K)_)&zV9YoodAV1N|T<0ln-wk~pT;yNIcI$Jc(yxGQ=llV2CN`a0N3KfI}tLGj+8 z$dkH~<8M`ywTT|3AEDTMQ8HvZu38WXmYx8vkrR-7KjUr&swr$3PUmr~fU~||}J=xr}3#dpg z+8@K8bQry4E~))Z=3!oot^VZF#VN9G=nZ4E-)2=R%wO5BQpY&02CkYZ=G^U#Qeufz@42mmA#TNac-YU9GgC2H9dF!NoBOa8N* zMH;W6Sc*np(ZyIO7i5NtjNLfRQu?br(3u!?KZ^nVD=1)lKO;;+ftBY+-yW72<8QMI zF$dl_^wx(#RGSt~H-}5~dm2y0CwV6GQb~}fXV%VUjkqd(RyofE|3O>W8n)Pw3=|P_ zTu^!Li7hqL%-+O)+Ts;nHVcM#~-Jt_U%!um?N_B#}_;49sIZ zj8pePH-Fvh2TM-0RfzIrZ6;?2AhI@BLZB>Lziu8o@k6e-Lva+4r|_;w5?LAsnyH8k zx5;{W0YffNV7LkT6$8f)Jwz?t3~^{qx_}gPFxKa^xI7fwW)@NT);i4ULS40$Wm0!j z^z}8V)7Z|8Zmw1;zlH6(M4`ae(-$0qR~#$O?rt|rE$l}WY~LN;7suW7yV~pVy#KqE zHOgqbsX+a!iR@h-MW1`J<1ZS&SAH9da=%jkw>=cnA7`k-5pc4cufSC5JytYVJ*D&> z=9oW+sRpA6g2bdyGLbbt`Bxf8@nYYPEA?MDeU9d61pm2pxW7iTTk%OFyXGASbcZLa zhq!=kr1GtIr>9mA>@ruW6$iO!SU)5YHi3nSzjeMxi$F%nsqrtUQ>xu^LR~=8Uk7i` zk>bAS$?DVHczjHedrLjrxu&@8J)=jq8o%s&J*(Kw#tOu4vQ#h>U0(~9Jk_}-lQ9ql zVL9D)b`FKAxWk^0SASFqUl2Voav3c*!eBN7k^KLqnD@d?PIr4k0V0yenlmT#PmBWq z`I=a8EbD^5Q5R=~CJVQN|5!Z}Uu+M&#S-`_U-j(u>TFw3YA{z|lo*U|SJgbOScoQ< zC2j1F|8Iu>AT2Tw;`mEiNHmvh9=p<}>*G$8!yQ=}`mPG48wiEZ*-=tUH~Cq1ve}KU zQJjPi56_3m6?sL;rlFQf85xj8UNhfUJFX(jmE5lifJ+{gHSCke4Y@r23}`@naV|z{ z|4U!^2LV~z%K?WIzD|o`3EXVyefo{y-i53bRO=_Ck(wk9pr9#R^)%}USpMMd3^MQN z+H_QOwP5GVg*3DQYzZDq)x4dv{DZ=I!?CwIz6Nw=507VVLN^c^zRQ3*moYp>O_9eD*I z*4=#Wn+<78HqS>s*VOLy-5KoFx!uV5U!&p8{n?fn#;32A1uFavCv0m)WZZIG^SMdD zX>mPVX~RG&$GGfg7%4H&34&)$r{dd7su6CxbzQT!tAuoieRHu!!PlRc0xAR@T`+5Q z+Z`-09c@piqD+dcn)I>1`}px^H_#e)xZ!d>fV&+pHtEaC#7JI)cxXQY-Hb2HrL<;)^D!HLD&$!AB-+rJ0_8kRN8Q1hN9YA8nWR+DH(Hi7IiwvT}dhk-59Pm~M_Er|T zU`7gb%PAlHI(2#)*Gd{YR01^Z*1xdxZKsz-K)~*E=7*FWiK6|Mk(6HjQ$g;ttWp3R zE4Z9@Kg+fT+&%OgSv*_I;pk@u^BSQBs2JGmr3&ef^zlDhJk@dx?nZOUd|jfrpA95A zxq&a*v_M*a-7^)i&wYhvLHuDl;J_J(+^q2B5HyTmrZRX9{Wy@1dBVsXf2f|ldF13@ z>j+rEYqs>HpeA50PU2zx%aWpoUvKvA<>smJ6S*DDY_50$WW1q&03UcPe}6sy=6jed zxuJZ;U`{F^P3{ClE$(P%35w=c#Z9Jv(Sd3ylu?C7yJ64iHY9ch43?cFRvvV@5!=T9_1hNF?x?H@#hu8D?Vsol1se zMP3M{=vON0%yIHWRV)wgizYo+iDZa zS`x3fYNVv00q3^6EjK)}4(*k}xDveY2&2WF#V#lF^?IOD);=x6L5Ex{=ho?0{OxF_f+?d_5C1# zGH5bfS{Nhm@MPF6PEdbOzs&zoEW_?XB%#ePF#DZCY1Y52Mh40R0%-&9VFeXf zRNRJB`=y*|G-l*w>%2ey)Dv)Eyf+))HOyS_z_}+O1G3*>Z0BfIC zdfZjNNY%hg4bmsp5A&UuM#`F5U8XJd%s@4xs7urInvz=s@aJe42u>9P=_8nbbWhDE zR~P%xJ}08ZdbgbZr_pmDcVl)3`p=LB6*RM zC%!4oSoXwo>V(5}SXf;MH=A0fZxzSUx}@k8t+Ql38b%%AFb&5>a34W5K5%R0OR->! zcFtocjp6+_JfP!1m(?xKTeT#%-)ka)g8tGa5*O{cF$9p20a6jKjLZ zX-8M+lhZKEH_?YY^WU7fx4+b@c?MwNE2E#E?Y`~~{m-eu?s;7^Z*cvg$*3&t2;l5( zf!xv$eA;m(`d7z*RTaW*DXCB&+>tP z;oW3^iKuj?GgJAA4)e6?5AmPQG#_-LIr$g@?q$!tg@oq~n0EXV0E>}!PQt1Z8U^x?~+4(30+_AoOgOA0gIZ+ zVpE2QJ*xHS1pKTV>$FeKgcZXeE5K7;p`20B7VUig`MtlZ^P3aDH_KEC-9Jsu7G!qJ zE9c?FS{_eF@a7fOoY?>G4q1K^8T&I2O#MBPa2~p`J~pE+d1`iBW**fFH{UVr68=aJ zDkL@doVE52qU{&yiteU{gs*=Z23+>~^Ei2fZ2BE13P{m4bN>zH!|~l~Q%nXsz@6QT z_>ugU2L#uKWvMrJW<_n4H-Ddv*(r}0Dw{YGBQNJDXXJOmGd>aD_T2`S3@n_wtmGi0 zSJ;y`t!U`RC0@#ftTX90{b6h2_AFO$ZUz4Xgq^C-rvn%%sa2C}@tm`lQ(P? z2@*Ea&s1V17SRB=@h*2I1AQ|mW#99$G`!)VPJ4Zu-f<irVRpa46=BF>Wj*+m8P@QgsP{Qc&V({3IV z;@*+ya*5zZ#_C7T<$x_}cV}{8Id$0J9pgueMQ$A@q30KBtpc5si7tRFr0}8pdgCGv z|4MsGsajR_@u8{dR3oJyx>@=h9edXPC9LE{bjQ#uvP3?Mdm0 zBtfb)dbnh{!E(A9!C4Dd%Xzl|Bm6FN?U%n-|A06#x=}x57D~Y!4Pg4G9^S2d5&w|g zdv~Otjowq{ZVum1^P1&60_67~FQ-usp>#*><(*W3+co~EX`P|4;bm-5a~Too*0Hz4 z!@C&zeRFLm#?eoZm_OQzj}#dwB1ckLl8I$(krx16UsZyc zJ>Nh;kQqC*H@f)-8TYV7=7WHipytniM7f1m1bm?6@_O8gihSXl9DJPDbg&`B zQDhU%ziS4qIl2{jQMNSWzDh@B*7s*Bur3+MPWq8VWIje7tPRvcj11AkhM{lF)@r?d zoMBD)VYcvwqsc?G&_7r~w4bPS&|*1cTILOX)|FbJ3!4iRKUU@jxuDborCl@$GV0m1 z99A-pR_(HoY{Bk|hT^z_l9G__k(*%9(x3=pASK;`G$PaVOC~!m+U{aUhH}X^-y6Bl8=jDVeI{&zI<)SD9JNC`u_BHzEsV8}HQI%>~F-U1v zS^uL>FuW?aq}u)p8DGvYCcM~N=$N5C$4!)xy1Oa=TT2^3;uP~7-Fm<&xLjP ztE;)!{_WDY@bMu3KfR5H<^lPGcgsB*EI8F;9*R+*64n=89bRMT;+C20m$y#+yp6gQ~&MO|C;odt0}fw6tXAFT$2wH zIWSC81qmt3k%Ye|hv?K=ma*#WUfcy$sm{yfdyLHFPzm2HapcXQ+#LM!kVs`FRxB|T z4nFBUxyqx^u6IC4Cd+uXBzM`bWM;AS+RFMfw!mYgr-I5vr&pZlp#tR9y5eaZ$7sBx z|91~E6!(0Z9E%$#RaS3Q+Z%m7rzl@QbPR*r=zf{mx4sWH4y2P%c8MJH1@okA28z)PfuYd)zy@xB&D*H@gM4KRrlrdB- z=P&L!>^}KyYBTKm-Iw-#KsNe}7O8PmUDw84qr^#-1fcMPR#4>Edr}b|8LOpgdwBN- z2wLBc*8k+7`Vt+_EUx~m;@5A@;Rt%OqB`$KmtFkZGpd83JefX<6xV_~h~qrgM&5V2 zXo<4mPx2l~3kfbK%y%N!$Mp9fRc78n2w{&)fzD@~g(t$*bv%fM!;|$H%>psRK0V`u zm%j=F-lJUqGT!gbOXxUwNdfxOXUmS`JdyT+%EC+3UjV(@I0{jd@x( zuP@J_rG$sC z4?xWH>KC*2&N*oB$At<6?nXSxbXE;&HY?WQdSTSK)cOoaJN>1uL9rp~` zxNm5B{hvw^v6@!38%l5PulC~Q%a^D1(q3EP{#Hi~G-}}9I+X6X%}w}O8B%Q0(cPB2 z?nn&UlxDp6vt83Q#BtyZ=8nY869K-`FiwL)`xT`iYN z*QI);VC~R(bQLq7l6leEJ>9R$KFp6z$SJD@{mmtxC!h_EB>0(Ach7ZULW9WM-snNh zdhO4}6-FI6*G-VMD*u`sHb6EVhNxD+iaKHj*ji1m?CElw7~#9awNdTA=nWJzVod#; ztUxQ{EpX$M2Jp#4@zkcx|4gVcdeuBf6S{51;-F+Zw)v*e%j2@7*gam&a&pz~^kwY2k`~#Yu6a~nfQiYpA+TLRKQO?_JPE{W5eR82uE*H`VdEwg!vr%4-L|pScE@ASKpEzkaQre}4C$8Vr)Z{A)=C zFUx&z1dd=yc=B%l(*5xV7ykA{jY)4g*1>jf{z{aF{~ zq7>egxoMtppxs^AX(7!}RFN9u!{gr4Nwwf`=fgX1YO2pGrV12iyY5>XUI|_=AJjZ` zCVp_wd+>v&9?kDXYRK^&R7DjdA5h8EuT}a>_UkP8>CPCnAHte6B)rOueb7ibVbGr> zYcb)Y;HE!EUK47oZQ&%GbA(18ZnORQ49vW%G2esUki)m+|Mi*(KE?V3x4DaaM+kL~ z4MYKgpcT530YF079-p*}BlEnvQxRF0OM0C0Q1eW3nw{Q5=gp+=WnRa16`q6oSbM`a z4bJ0M!x0W9)CNhFpZv|=8-3BOdHP4=V6DMhw)QaFp=Ilx9w*hwrtt>hO99hV(FgvN zfE9rO^sb}E%Ak&CrNEzg^Z>kbaBMrp9D!0V`5ae4gSVA&rd|8_yq<0Ww2QMW}Kp_#p)!u!)H>j~;Pg zT!`5m+Jz?=b3)AYkIr0$=vDLD$sU#4$3U7W&a_@AmpK-%~=~+jZ-LmCxTB= zLX4t-A0dMauiqiUQt&6-DKiyA9Y-SG+LIV>gvp!d_1pFV7FT_!?-0i2&pJiP_~M2> zQj`m|#}q0w=#|HWkR^|k{6S8jO1PFC%jZH^+ZK=QwLW(L{KT;NpLhro;qd#cwXsMi zcj)=`yPvi3gBa?z!T6vDMd@(%OW>+#h9Jn*S58LiymA8Ti|U+{IWz&eP^SqVPJ9wl z$>I%Z?0_alakAV>)$4ba(lCmL#h4ai_@Y$iu#MT(|3w``T`>Q1LL8N9K1T6LUYq{+ zcXiqn+!#@=EOdZLs?I&BSladE=(NrQGtI3sz4i>P)mZ(Lgei&F@3cWYBNqy8gcR%` z%PLHHeniQzXIgZZ`XJ;GZ8P>JXZW@Yp*)vV>VZ^V)IZD!T6h7ZJ_JB5rN?hj(iez# z;+_2LS7)R+Jhfwq@-i(9zk)0bnYL*lmeIeSrA+jwa-O*)vn%4Lt{eG=0@w7r|Am!Q zSIgxAp1YtHd`h)iA(K}D`c*d!R^firu-ZOX1+`INQ7!H~w!C}?8tXmjWf=SNR_gn~ zQ*pVSQHe8d`49nRg6+?^ZR~VvFeFTVzQ2XHivU(2@YNd(?VTF*kih_5N?J%R!$Vn) z{#PD9m?@}8n~Hjpbu%5h$|%^e!-BYn*%X5j;R7p1Idt3LKy&=<+c6#Qlz|C>MaIw5 z_VIY*t6=Tgfc8un?2${;n_JZ#GXU~$K+6xl#Mq|AT!ZvjTVfiDsM_wJUl(7pRs@vG zKYCDYe}1yR=lGL#niA8Zl_6Dpy75ig_xZc@bvfCCC5w~26*Z++6#*oo+WrAdh?sW~ zAlTZ%PLn!d${m;O@{ZfVZ8q5uVIxQB#Pxjz91;m67vX+IS(q)zu3dK}uH{Cyc(>Nw zuK6SEg{W`-CkKNl50KohrSw1BZXaWhyj|{l7n^*BS}%*7`UD6^9!TAYBK?FSZh5Br zQ=b=&+>BDjX+BdjM+18Dd&OnXS3XbV9$85L8wItG+5~v_6W}{YugNclQA)FGR+qH3 z7bk0Kb9k^FPrWneFa(>L==h~n{Ub5?oM*nM!%w;4oz3$i*marTqnp7mzyxpz?#EHe z?#&#S#KT8nh>Mo+i$ye2^5@XPUIPw=KCq71PmR1!4WL?!z0&+4VQB(6ryWk0=8v{1eYLSuIjQ*$2V%NJzLfRjS+y97g~peQ+37A&^@>wT z;6Y=6Xa4?qqKxjpb`mu(aJpH~u8|3UC{bQ)TxRL+bLZ_{(RNL6Nw7eOu)$M^oS3%g zIIOYl6<8`?1j3cgD7=R`CsQlfP(JF*ak+%!(&U8*eAG}Zms2{pphlETXF@JAZa^dO{NU#@l*@(+1LFs}Tv z%_5UMn#Q?bmZt-O_;&FfH*M*e0In!j9NAK*IXxZ7lKA+SJ|Qp)@Dn3Mtc!vxXtUwQYnGCC#0*%7H?G+$MCbLwMOzk8y9u%~*G7bEq8cfBv zCPf`!<@W$GY+eV-IOfy^nniUqlD(Tm4jbbbG%=V&GdxXL8+CnsmKMh5b!$N^sv;F3 zrJ9_nE`h56g+>GY(mhpHujG^d7q9+NM6j+0`T6-c7bm0jT1GW4dJsr4X)O0nMD__nm=74?WFdN7m7c^Qkhe7iO$SX?||g z@at_#PRXR{Tcet(q9fwO^^9{c*`tQ@`>*?mQAKxaPd94JTP?Eng8_Ma69@L(ZFfTp z9HT|q8>3}RD2?`LpdnnmkUq}Z$)4E3kReZWEf6#fx+8?Z~*zK43u zh?7Y9*mp%}Lgk*8Igjy*QjYj4EfeG(o~6n3YqYd(^xD!`y)O$;8}@$4tz*GO)i%oo zWklcL_Io-lv-hWRX0#r->-r`S&tx0kWIs+8wcy2~YSYe0_tAuEPDEc}4ob#Q2kFL46)Yy zRG0ZKDlYAc^-#h>Z3WDP0qOmXW32ITX^2?CwlbvoWuXYJ5%-QlPT6)Yf3(H3jMB@j zTbJUb*g(}#x0~e%3KiexMj{Gm(-`>tI(V?S1a6CcWfXoK&Gd9bvY&H1USf(E7(sKh zJf9%*CLDpi(m_2*@<;4laJhPnzdh}$m3E++fmXR#up@S?4}32;`w8Z`=ldNA0qP2r zp-2fl1pWspdEetVlUYYyKTrJ`LTt*s%NX&Y0!PKvO*0V;| zldQ*%JK(bbZ+b2D^pS%Hi=Sr9xLy+=`rL1c3<^+R$~x7HmL(u_q=V-U>LoAdu_103 z&S=8rT%b_gUmaFE`2p5W#Y=rQ>|I7bsP>x-1`EPHAf%JDY7@1-R>IHi=>E_V!>WNj zOEX}`C5vjz0n)?Fv#Q52niTh80ercjyb&^A9S6wq0r#C96$wF42H7DX92&mr($>Y~ z=>M{u$YigcW1B!hhauiC!22+H9TFU^d+P{Rq%E2@ppR|lFvr9UYwC^cwtn$pg$?_? z6i4}vmrrkkMwp`71}H(-F4V}EKzf@>#4VD2L=@I=ssn;wtqXE zu-<=>LB5y4wMj;I^TBi+3>&z}>?$tfALW4$nuaM*)Nm_IgYry%xde1-nGmIEmQz96 z4iZL2r*4{N_l%TytWcZXYpmhgKeQj^p3{H3p3Z--U$wKm^?O&BrvY_-)>!qW5(^#B z4}6)Bz)ii4oJ*pB_g|TA#`<`raIR$8As(z(>>cfI0FK1$XhEon$>N z9Yd2q`x7)_^W|v$#S76V#&b;MD8XeQ;_+aAu}1GbmkJuP(c?}4PChbWa>0@Np~~h9 zBfUHc82{qe0=M~l=j1rq&E({-nE}C@O_63^ob*w{>)lM&iex=M&F?;+`$x}d(96V7 zeR`Opz~xW+$DN`{Wqn|-IB;cCjvlnyQKjc&EJR1cmT~ddl{45jOZE0)7alC9riA}FvXNQ@tbMAqY8TIN zIBD42B-wxQO>6JVXguMSnwVu1$K#CbdYg_$+$%!)aD}w6XkAN}pQvf^*Uns_PjZ~r zQZQ{F0**XBP8JH%&pa82Yq$l$&g9djUKjrIP3B09do@a#I&CXU6+(Ds$NnIZ*nMBz z>#)eCCv|1t!uytSg+2kxli(9zdx!mNl6jYmjwW-w03qlQIo1+M2AS)19~_XE#m$w5!;@)=GcPK+M8|T0jz5vpB8!3L*wOHrFU((>O zJt0KGw;FJUui&tMzgE%M=Z~JlFRa?)j@wJhYz&WDrTNv%Z%BhAfkAf)E!S5@whXKg z-|FJ3TZXcnLS68Ui)Nb9dhyY_1e84<86?O&Pd!;3YSmRI;vhyelCSV}l9czD_M}Iz z%#S37&Xhp6Av+lhUUDo-LM4QwxyFl`Jyx}Qc^{a(&e1Xd*+zj zCerQew7A>!SpmYPCOW7+h=QfA)WL_7NUnuVpv(je^)}OR~-swUyK=9(e}CVE8VtzLYX`xK+cjc++KGnA4o;nrA6 zW0wj9ta*WFm!+@!i}ea+OM9dL+>_gyR%$GH`02S<6vHLnkK;(PG+n7I-BG<8CHW`H z<7!0!0_a(J;NVbgKf#VWbr^;j@T*dnSQyt;5SYYzCZQSr_d6$WH@Wx^n-T-@Aaf*dAGC=LUqe|I7oZll0l%!Tx64Pw zG}BoI@b7BD$E5?1r} zw>)w+(PKs1B{0cbAU`0f6Y%PUk4o;o5?BRE3#X>10mf4^r*WUtSD9UEC65lqUA?Ga zbsYtoX>Sn_AzCJ&1nMSP8msGrqAGmT&rfLxAVeF&A&8TSmf);nP+d#tzhzZF^Zb+w zJmZy)z}i69cJlGBJp>`NKRKIkesQf71;ISK22N;+V%3k@EStq-rAz62oUGQoH^_y64CW{(oiEXEoR^Riql+A z?!zwbl0dQoHXDSwlgsoAGp8lkLXM?^iGFpC1 zWXX-hYVL*rqK$R7iDx&m)bE0NiO1=~GxESQ6oIzL!gvZ!Sd)t<{a}oV!vrC3Q>#=p z!&gM{)u#3=Fa%$|kd&eN_syup?02FXL27Wm!TTG--4V5v>dD~=eGh=k>U(54X_^muvkF<*mun_W`98_z$G$dR) z4N+}U4-UfE&*U@U)8T)VW`k^g5N8Hm_(s@4$+@?~AFC?=*splpJ}8KU&1uRI)!;#_ zZr%oXJ4TT_mQtG@Xp1Y1lnD>;v!$u0DVOkem7cNYl~&FYtBL%}*bp?j66S+1v`S(7 z6wThG;>zkhw;K2FgwnDyIXza;$)RO<7MT+a!u@L{^5822(a?4vuk zMe{Sm&lGdyG6piJSqw3ras=RCcnz-a&lG*lEGW2XomxZC(RL&|F)4xjz><97i)9BmoC zkG<&?9`X3%+A{meMwL&p3-n}h@i{Qu4o*swn!apaZ$s$BVRU}5axiSY!XTpC{6l8+ zXvzWB`c^wj7E>+qx1)#L|JpU;;&cJzCGRuDol~_=?>5Yg#3T<+c5(`7AoDu7ev1GB zQ%o%78is$Z*-2vP-A3}W?{0-CU%F)p$CNsHBFeuXyX)R}!;&hi?$<(JdtVE29a{te z>WK+r|9})*DO5fbVOU*U#@#~A)z{>h z1JkC~eZQJ7Gq|Cn*n|3q;VS{tp%0eL`n_Qk{{`LTgpTBOvajgA2R^>_ZXOlfpKq^W z4z~$o32mOcbfr!GT>Sf!2aW6jv}kRf7;*(#upES@jyyqz_iDU}*5PxhS+DqC*bnu} z-9g)ePr{@1ZQ6t?@l1f*C}yTEy9=JB1`>u-2EVr9rVlWb2sSmqW_4Rv^EEAqE|TEd z!LOoS9xCDghjiQ^mN`6Io(7U|wUfp)ac7OEa4|it9=@bDF(8`*|9!q493H2iAKX5& zVVH(Fb`vytK58qAlQhh2Q^woI zQ`pKh#5U8Ho8fW4~vAs{b6 zOOO4jzp{;>AJ@NvNPI(`K3^-(lCsicNq{U^(C(xTRc->|+~L-QNHo5DpY}f?30N#q zLcTm=`q!oe)zMi2YnX@tpSC zD8_c(%?DNw*(f97m^-ND1-2q$H-DGRdfwoTv3ka%&`nZi&O0!3CW~m70+3&FkrOEn z^x;#T&PHF;|D1iGY^}z=3L0Vynho-DhQ_ajj?__FP^n~Mg=BQ9h=WRQ?8(pCd;>tn zjP~M8qmOYQ%}l*V98}!M{m8v4lvY9fjm&USEhj@=fO`$;0KQD%zhPM4)98bR!j&^g z?Ad|S{jX-t$?ms;ALV5CWImqEA;Iq1(;t5wOS#_cuMKu9QMS=Ke^#cSQ-p5X5NE?; zS1GQ=(C8rW!FtWT%_;LqpXM@QSxk9Z!#k_rgueq0O|K^G0E=LRRJjj@dANHi--4)D zH$txX6u@^6X^uIBfV5#&1wujw(IlJ~Lme#aCuJ#A4S&c5mNxxvYRTbAisiRja_632 z%bef-L)K~Y3p7$7aqMztKmqsWoH>{?9v7TF{Pl_EOQCi~3C=!)<_@lSxVxR!Jz&_4 z1`{kDFx+ut5FTvwkmDy$D7{4TvFO^!Rb%+XinE9GY6*f)z&IdfnrzAKB=2*jXMTPjtIz&gjakQR<2qr?s_lnw{g zQ+XxRz9;m-EeKxI;w$Zlo)+sHtvee&|8<~q(zfC0G9bZH&weO^T zn)SSG^4W8eS{vT~2RI~$31WFTgB2NWf;o(j=v#Z*&z6XmB21g$LJgj)31PPc>}3|G zttNmQG{5^uY<`+SWY79qOGJY| zv%NS+U!jxyBL>{mIiA$-%%Vuqk`T8!K0;--!?AbeKfY{?efd;>h0aq$JidL?uF{fNh=b5WIujSsgzSu`!JBcP^`6i= z6?kv{mWuH?u`i?}hXu-V0r#ni84 z-N4yR;D^9EQY0+mz)8fu`6~`)5TMP`pI;g8INjS8g4mGuK;{Wi_V*-z+(Nq$mtxCj z`mGjU<=ogCXqg$5H8_?fl5lIheq-?7D4)c2=1=n$AAll|dQESjV^xPkCt9vsF z(7kDPHZstGzhsfXai_((L6~wwDJ@em1@{LA(`Ngm#m~cmb zd=XBcietX;47Ka1LTYac-=CHo#*Lv7C^N5D5YA%4AkL6Y)4)4N3Wy_H!oOY)*xUY- zcD>%^XlOk1H~(Yzb@ry9f|~@JUzJ< z6AjF_n6{8?Zt?5az4R347L`#XsM>&%Tdc!{CiEjVR)n#4y0~GfUeTyF(ff`xoqg0w zW}6!Iu@SP7yZ$UoGij(HnaCtl1JAtbC=k8Ng zjx&nTy)%;BeKZ3WLj4vV3>vOgT<8;jyViO9N|H;1ClqA7H(G*I|UGFUm&UxUNwV`t(4l3I%f@iU*_ zpOUmqxYMTP59pESmhLy&B8tMO>&_y{)}FV0&+oV2jfsb3EO+i@?0viVPc-510(e#4mTDthDM;P07{V_} zA0Vb9{BLx%eNqNz9ng^^K*=0Kf|6}rcUd)lb@sTL&8C+k`m~!y8Kk_iv`2p)6!~#S z$<(j2_2FTL$6{RBgDRUAkY#qdm7^T{oQEmf!(rXnz`#JrVD`riZ3S?)&}Bk*lbuCO z&6dI61+evKS+fI#Z-FK<6M6f6R(Ema3`nOkxjg#fJZ_K}Us0WS#iNxTV%-;_U?{4#n5<*D<~V%-7M2s0q`ROF}{=|ju8LJ6BA z%jdBF{4Bp^-(3)*^lMeisA#3&*g%}4|AmWszY_5)tI+J`O6u0p{XISOmBcaQ>6m?h z@z=4XSa>@AKWw+w@glUf5e$-LvLJ@%@f=fEgVJM6s@zF++R1<>RUQ?Rlzuo;<(PE* zco!J#d@3o(8nyAST6_+Ykri;&oUCXEy(M3pdV?RDGcq+a%*JAJIst1LRsfVdb<~eC}&|09}JSdM^Alp|_m^c)pb(#}@&` z#T6DL!<^5rI%}fuf)lN1PNktfj~`u(NPUv*3HPN)y3~=!r9e?M;!)*X&!eq@EXaV~I3v2PM;0VxvRn^Xn(BOq^I3BQM`e>qT~8!JBL&FY$t6m2!yCLzVdMA+Sz5zFj_n z`PTh1kIBlmvzxnTM->t^X}S`6*vclV$yPclYzkaw%b+$D%gJpQri++-QFaB@it@^v z<1kY4kT2e8#Pw$$SFE7Fy5x0a-mFQ$8@dkEBl$XH-c?wUZyq`fs$XWdaGE?8TW{Hc zrNkh@M%qx>pN_ARSpRHqIUB46*({z*ls16=)sCVNbl(8&=ttTLz8#_PT{^R5d|0$2VQ!l^GGZAd)=TXV=?w=b zY0>;E3$U0sV38uv|1#`mTVuT#dktSN_)Eu zQl55SaB^hpRxjiS_ErY3s`A^1=Dj*=qh+IQnsapx9ek;TN)k#{U-+KCc15-vdx(`P zcdv-YT-tQT^U-UnZ3RH(wGe!9N)vOGXID}1u2&YK<5w&e$zQIs- zXfu$nQ!;>D8&fwh%yi8ZJtSjSVxi`s3KSiP>7U=8jlI3`KVw-+P+E7gVPOC`(2eYD zeu$;9N1>KD#Mh!lGocIj$K&XCO~AQuVK)Tazm4W2;L24)!g#|isX@L9!0{Zs?8-9# z?@T=G6X~sE=uVf^8|59?a+{aNflvjzDa`)JKxMK6e}BGSlAW|f-CWeBMsa~Zsaq(5 zPzEjl_MMV#yc)n|K2n)%`AT@83qZLbhfB;6+C$xHh){fIwpU|uI^^s zBekLC`%PQ~Z0d#!DL$ne8Fjv|XBE>yx`P-@rMPN->BX7NszuD9U@hLrwTZ9xgDT#a zQT1f(Cr5LMVDG?)<>kRr+X+-ipOXA+$UY0-weGke6+m#uYl|19!-4G_Y9d<_aU0SDDYrg{ji`AF-cnN`U#Y!{6<>|!O1Kxr=2s-O z6J3XA`TufrQK!` zGUTMVR)wXS`eo7eD=0#;Z&=$b7MYL~N95kE#Anp=Opx!I;tS_PKl0VHY#9VHY#Ahe zNMliHOJSiNXiaK@D;E}+&NvA8Gk|^fs3j-s0XlxSL*f46auqp5ghVzz*=ouc986C zF~EJcP6RTf#S{1OKE4SBH-Br_02NSw|7niC0dO4^ax2wCJrgHv<#fBQD)E}E)Gr=a z!+Mt(3|}GRMsSA$)e^l$^e$2*z8>>5=EI!<+O1q1yFVavQ)(uhdI+@ZX|J%2|MgU3 zMOWDrpiG9}Aa(97@C_E5rX z#R_C%zTvkuC+`w5Nqep4fy~}Kfp7D(p*z_ms}_}JKHK>gd&~WP4fpc0u<0zfiXOJ8 zMT8_-Mv=u+;Z3`rU-}Ik>x!m4(LsObH9xfZi$Du2zn ze&PA=IbLPlv7N1%Uk+S|I8Y0T;wuyIoqHZ`AXezC7q_*F3bak5(XZFe+uz%_Nank> z*xy8~K2q1bBeePJQ(^U0%Hgy^A#FN^=@WvM{okkTtC8YB0=I)%=6`7!;%9@`bxyT?kokvYF5GBwNHfvPnu>V3EzTF~cF&_=ZCU=`bKPAQq z$)@Jm;o;2lS0xUhT+u7#EI0dh0%HDyk?819qfjMbPb@1SUGzL0*p19E-4g%XKqK{; z_nTsG6J!OR6dP5!TSF)@?$tmMIk^;;s-&Amk-EhO-asLj9*c=9hlx5*#HI!{o(ZK6 z9E<|Pw=dRg@z#~-_Zr>e+2v#zq@R|g3Ry*po0z~Ed?)=-q1xdC+p^cl7aq=GD?IMA zNqULcb{TfV?y2}<+2y4Py(Aq^m-ti8DktG?Y-G<`aVrGco1*0@=!~Aw23Wf1QvOb{ z^7ofLqYG!>WBG7>PJ)up!WIAoW+kCB%})jr=UYen}xbgCe*M z0vmfQFhnsm{7i#eH{oVs(VR1VhIk=2;{u`q0sUAZsU7U^po?HPr6I6)7%I}K_86R~ z@)%D2=+(JRxedd$K&p^7HfSQlk0>e5WMrduCMT1FB1y2C&6+KaPiV4TY%EmE^!Dtnfe1D%&f%hLwW&IvCy?$3eo4 ztwgLcEp|Laqb3^QNR3SbBJfTn+ASsOwVT~9U)%EP^5`A)Me~XmJxH(=0N{LK%`5U7 z4U3`zw8M?=Adkwn5g3HB+v@nJz4>Ceb6Q@ScWgR>{J5%(e=<6I>LX;&4Y=EpfY6uGeOq3F&vg9$H>uVhlH z?D5=*1aukfrk(^&tM7?6ahC&Q+-T`<86~r9v1%(9Rgt+mS&4rwS7rp41xkl${0IoL z(hqvCVJs-WAKZ{LL|(_E)ScO>JKcEKJj*aP8z+KK`z=2D-)pV=#i#RQ=U{=RG*P@W zklejuQNVf=W~6*HfE$ziQhndsXKJ*B`xTmj9y?dy>;7q)6s(*{>98M|u z2ZX3eZMV$DjwA|<;Vj)SH5Io2Z&cEiZg?N0oae|({Mt{}Rj1OK$19+@FS`5onB@i? zQj~e;bf3f6DlU$4cxwn~G^j#_?X zZ*QODs;sQSX4V{4P_2B_5AuN6jfK>g^me~!RzkX-JM;P5-c+YK|%Sfw}QI7VLm!v-L<-+-^S`C6L+;v2N< zD}YMwC~86*Ic~2&K`31=ofPc(r3UL=@GbGoQ0#J4K8_a??FarD^RQ94CExf5f5HBaMb`nkt{z4o_cL3K`2k2dD9=J
H_Q0*9%purwsf-;tuh>iY?P9?0lK&w6zi)DFvX%tMo=)^PuxD zCtwZy5SS{zl+P(PcTnlTl$JQ%Arb2VpVKj zTfDsFrXUrocA(=fmW?_r-467OzYHySdCUB`1Hf*PTuV$Ub$drrxdl2mt$R|apUNvZ>6qF?Vm9Cwv- z?gkReJgM#QIfu!8x_|Gqwdz(bD2Y;M`=jQgN`0Kyy#Q)4_G&SNB2>X4P$|XhGfSYv z;}Nl)=xiddi6HJviIP)ZVJzQfMvtF&jylABVC?Kv%>aBV#-V`UlkjR80*RiZQh%l{ zCLClJeD&T(M$+=%RRw;D;~83hgQ6;rrMD3z^lw2wy;8{Wcmi(XT#z?Fjh~s>)jYNL zI6`h+FrHESwof?v4VojFW6(*fIqL@&!*+76@9v`1qv%3b(`wKDGO*ET`HH%JONICO z-_VrP)Hh(wpLqfjPXeR$hg|E=4RE-oDegs&(o9TWzduADer9E+YyI-sFOL3j8IdkK zavWQm(QOV=O+RF%yPXrrXLXpW`-YE5w)R>bB4YH3mGWNg%Qw?u=aUbxJM&bUzb%QpB0saJ#PhID z)_9L9csC9FYZf4&WdstG4~*{%6(50|q=AAXzPq67-U4rgQ> ztq&r7210l_FWO#53T~B}N_Bquo9+UGESQ@2UU17Ztpdn;sMdFP2&6a{p4%M_O+=}n zBie+Qt{Y4QiF3tK3UB*(-;X{W8bT#U`Zqf|g_*GhH($fSx4UGteh5I``qkg>V~_eH z=fm@|e|aq8Bh?}r^^mMost5*qxXQ&4Hav zV$z|4 f3^a051s8G!)|<=|tz@}a;GdeZ7NS(qBJ}?OoHHmf literal 0 HcmV?d00001 diff --git a/lib/pages.dart b/lib/pages.dart index c76902ee7..cedfdd77d 100644 --- a/lib/pages.dart +++ b/lib/pages.dart @@ -45,6 +45,9 @@ class Routes { /// The name of the logs page. static const String logs = "Logs"; + + /// The name of the controllers page + static const String controllers = "Controllers"; /// The name of the rocks page. static const String rocks = "Rocks"; diff --git a/lib/src/models/rover/controller.dart b/lib/src/models/rover/controller.dart index ef10d2770..266e4aa5a 100644 --- a/lib/src/models/rover/controller.dart +++ b/lib/src/models/rover/controller.dart @@ -98,5 +98,6 @@ class Controller extends Model { // print(message.toProto3Json()); models.messages.sendMessage(message); } + notifyListeners(); } } diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart new file mode 100644 index 000000000..c21ef37c5 --- /dev/null +++ b/lib/src/pages/controller.dart @@ -0,0 +1,333 @@ +import "dart:math"; + +import "package:flutter/material.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/src/widgets/generic/reactive_widget.dart"; +import "package:rover_dashboard/widgets.dart"; + +/// The UI Page to display the controller status +class ControllersPage extends StatelessWidget { + /// The index of this view. + final int index; + + List get _controllers => [ + models.rover.controller1, + models.rover.controller2, + models.rover.controller3, + ]; + + /// Const constructor for [ControllersPage] + const ControllersPage({required this.index, super.key}); + + @override + Widget build(BuildContext context) { + if (!_controllers.any((e) => e.isConnected)) { + return const Text("No Controllers are Connected."); + } + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + for (final controller in _controllers) + if (controller.isConnected) _ControllerWidget(controller), + ], + ); + } +} + +/// Displays data for the provided [Controller] +class _ControllerWidget extends ReusableReactiveWidget { + static const Size imageSize = Size(905, 568); + + static const double normalButtonRadius = 40; + static const double normalJoystickRadius = 70; + static const double joystickMaxOffset = 40; + + static const Offset buttonA = Offset(727, 230); + static const Offset buttonB = Offset(784, 173); + static const Offset buttonX = Offset(670, 173); + static const Offset buttonY = Offset(727, 117); + + static const Offset leftBumper = Offset(186, 16); + static const Offset rightBumper = Offset(726, 16); + + static const Offset select = Offset(349, 112); + static const Offset start = Offset(558, 112); + + static const Offset dPadUp = Offset(180, 122); + static const Offset dPadDown = Offset(180, 221); + static const Offset dPadLeft = Offset(125, 175); + static const Offset dPadRight = Offset(227, 175); + + static const Offset leftStick = Offset(289, 293); + static const Offset rightStick = Offset(618, 293); + + /// Const constructor for Controller Widget + const _ControllerWidget(super.model); + + double _getBackgroundFitWidth(Size widgetSize) { + final fitWidth = max(widgetSize.width, imageSize.width); + final fitHeight = min(widgetSize.height, imageSize.height); + + return min(fitWidth, fitHeight / (imageSize.height / imageSize.width)); + } + + Offset _getPositionedOffset({ + required Offset offsetOnImage, + required Size widgetSize, + double radius = normalButtonRadius, + }) { + final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; + final xFromCenter = offsetOnImage.dx - radius / 2; + final yFromCenter = offsetOnImage.dy - radius / 2; + + return Offset(xFromCenter, yFromCenter) * scaleFactor; + } + + // This can't be its own widget since it has to be embedded into the stack for the position to work + Widget _controllerJoystick({ + required double x, + required double y, + required Offset offsetOnImage, + required Size widgetSize, + }) { + final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; + + final joystickRadius = normalJoystickRadius * scaleFactor; + final maxOffset = joystickMaxOffset * scaleFactor; + + final xFromCenter = offsetOnImage.dx - normalJoystickRadius / 2; + final yFromCenter = offsetOnImage.dy - normalJoystickRadius / 2; + + return Positioned( + left: xFromCenter * scaleFactor + maxOffset * x, + top: yFromCenter * scaleFactor + maxOffset * y, + child: Container( + width: joystickRadius, + height: joystickRadius, + decoration: BoxDecoration( + color: Colors.yellow, + borderRadius: BorderRadius.circular(10000), + ), + ), + ); + } + + @override + Widget build(BuildContext context, Controller model) { + final renderBox = context.findAncestorRenderObjectOfType(); + + final widgetSize = + (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; + + final aOffset = _getPositionedOffset( + offsetOnImage: buttonA, + widgetSize: widgetSize, + ); + final bOffset = _getPositionedOffset( + offsetOnImage: buttonB, + widgetSize: widgetSize, + ); + final xOffset = _getPositionedOffset( + offsetOnImage: buttonX, + widgetSize: widgetSize, + ); + final yOffset = _getPositionedOffset( + offsetOnImage: buttonY, + widgetSize: widgetSize, + ); + final lbOffset = _getPositionedOffset( + offsetOnImage: leftBumper, + widgetSize: widgetSize, + ); + final rbOffset = _getPositionedOffset( + offsetOnImage: rightBumper, + widgetSize: widgetSize, + ); + final startOffset = _getPositionedOffset( + offsetOnImage: start, + widgetSize: widgetSize, + ); + final selectOffset = _getPositionedOffset( + offsetOnImage: select, + widgetSize: widgetSize, + ); + final dPadUpOffset = _getPositionedOffset( + offsetOnImage: dPadUp, + widgetSize: widgetSize, + ); + final dPadDownOffset = _getPositionedOffset( + offsetOnImage: dPadDown, + widgetSize: widgetSize, + ); + final dPadLeftOffset = _getPositionedOffset( + offsetOnImage: dPadLeft, + widgetSize: widgetSize, + ); + final dPadRightOffset = _getPositionedOffset( + offsetOnImage: dPadRight, + widgetSize: widgetSize, + ); + + final buttonRadius = + (_getBackgroundFitWidth(widgetSize) / imageSize.width) * + normalButtonRadius; + + final outlineWidth = + (_getBackgroundFitWidth(widgetSize) / imageSize.width) * 7.5; + + final state = model.gamepad.getState(); + return Stack( + children: [ + Image.asset("assets/gamesir_controller.png"), + Positioned( + left: aOffset.dx, + top: aOffset.dy, + child: _ControllerButton( + value: state?.buttonA ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: bOffset.dx, + top: bOffset.dy, + child: _ControllerButton( + value: state?.buttonB ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: xOffset.dx, + top: xOffset.dy, + child: _ControllerButton( + value: state?.buttonX ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: yOffset.dx, + top: yOffset.dy, + child: _ControllerButton( + value: state?.buttonY ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: lbOffset.dx, + top: lbOffset.dy, + child: _ControllerButton( + value: state?.leftShoulder ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: rbOffset.dx, + top: rbOffset.dy, + child: _ControllerButton( + value: state?.rightShoulder ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: startOffset.dx, + top: startOffset.dy, + child: _ControllerButton( + value: state?.buttonStart ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: selectOffset.dx, + top: selectOffset.dy, + child: _ControllerButton( + value: state?.buttonBack ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: dPadUpOffset.dx, + top: dPadUpOffset.dy, + child: _ControllerButton( + value: state?.dpadUp ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: dPadDownOffset.dx, + top: dPadDownOffset.dy, + child: _ControllerButton( + value: state?.dpadDown ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: dPadLeftOffset.dx, + top: dPadLeftOffset.dy, + child: _ControllerButton( + value: state?.dpadLeft ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + Positioned( + left: dPadRightOffset.dx, + top: dPadRightOffset.dy, + child: _ControllerButton( + value: state?.dpadRight ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ), + _controllerJoystick( + x: state?.normalLeftX ?? 0, + y: -1 * (state?.normalLeftY ?? 0), + offsetOnImage: leftStick, + widgetSize: widgetSize, + ), + _controllerJoystick( + x: state?.normalRightX ?? 0, + y: -1 * (state?.normalRightY ?? 0), + offsetOnImage: rightStick, + widgetSize: widgetSize, + ), + ], + ); + } +} + +class _ControllerButton extends StatelessWidget { + final double radius; + final double outlineWidth; + final bool value; + + const _ControllerButton({ + required this.value, + required this.radius, + required this.outlineWidth, + super.key, + }); + + @override + Widget build(BuildContext context) => Container( + width: radius, + height: radius, + decoration: BoxDecoration( + color: value ? Colors.yellow : Colors.transparent, + shape: BoxShape.circle, + border: Border.all( + color: Colors.yellow, + width: outlineWidth, + ), + ), + ); +} diff --git a/lib/src/pages/view.dart b/lib/src/pages/view.dart index df41b66a3..fcca753a6 100644 --- a/lib/src/pages/view.dart +++ b/lib/src/pages/view.dart @@ -4,6 +4,7 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/data.dart"; import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/pages.dart"; +import "package:rover_dashboard/src/pages/controller.dart"; import "package:rover_dashboard/widgets.dart"; /// A function that builds a view of the given index. @@ -115,6 +116,11 @@ class DashboardView { iconFunc: () => Icon(Icons.drive_eta, color: Colors.black.withOpacity(0.5)), builder: (context, index) => DrivePage(index: index), ), + DashboardView( + name: Routes.controllers, + iconFunc: () => Icon(Icons.sports_esports, color: Colors.black.withOpacity(0.5)), + builder: (context, index) => ControllersPage(index: index), + ), DashboardView( name: Routes.rocks, iconFunc: () => Icon(Icons.landslide, color: Colors.black.withOpacity(0.5)), diff --git a/lib/src/services/gamepad/state.dart b/lib/src/services/gamepad/state.dart index 5f0e1ec74..bd7aa220a 100644 --- a/lib/src/services/gamepad/state.dart +++ b/lib/src/services/gamepad/state.dart @@ -106,4 +106,10 @@ class GamepadState { /// Whether the D-pad's up button is being pressed. bool get dpadUp => normalDpadY > 0; + + /// Whether the D-pad's left button is being pressed. + bool get dpadLeft => normalDpadX < 0; + + /// Whether the D-pad's right button is being pressed. + bool get dpadRight => normalDpadX > 0; } From 1d3e2526299241e2d2b3ef5e445b418626304904 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 23 Oct 2024 01:02:50 -0400 Subject: [PATCH 02/15] Added dropdown chooser --- lib/src/pages/controller.dart | 300 +++++++++++++++++++--------------- 1 file changed, 166 insertions(+), 134 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index c21ef37c5..d01e69351 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -6,33 +6,62 @@ import "package:rover_dashboard/src/widgets/generic/reactive_widget.dart"; import "package:rover_dashboard/widgets.dart"; /// The UI Page to display the controller status -class ControllersPage extends StatelessWidget { +class ControllersPage extends StatefulWidget { /// The index of this view. final int index; - List get _controllers => [ - models.rover.controller1, - models.rover.controller2, - models.rover.controller3, - ]; - /// Const constructor for [ControllersPage] const ControllersPage({required this.index, super.key}); @override - Widget build(BuildContext context) { - if (!_controllers.any((e) => e.isConnected)) { - return const Text("No Controllers are Connected."); - } - - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - for (final controller in _controllers) - if (controller.isConnected) _ControllerWidget(controller), - ], - ); - } + State createState() => _ControllersPageState(); +} + +class _ControllersPageState extends State { + Controller selectedController = models.rover.controller1; + + @override + Widget build(BuildContext context) => Column( + children: [ + Row( + children: [ + const Spacer(), + const Text("Controller: "), + DropdownButton( + value: selectedController, + items: [ + DropdownMenuItem( + value: models.rover.controller1, + child: const Text("Controller 1"), + ), + DropdownMenuItem( + value: models.rover.controller2, + child: const Text("Controller 2"), + ), + DropdownMenuItem( + value: models.rover.controller3, + child: const Text("Controller 3"), + ), + ], + onChanged: (Controller? value) { + if (value == null) { + return; + } + + setState(() { + selectedController = value; + }); + }, + ), + const Spacer(), + ViewsSelector(index: widget.index), + ], + ), + Expanded( + child: Center(child: _ControllerWidget(selectedController)), + ), + ], + ); } /// Displays data for the provided [Controller] @@ -66,8 +95,8 @@ class _ControllerWidget extends ReusableReactiveWidget { const _ControllerWidget(super.model); double _getBackgroundFitWidth(Size widgetSize) { - final fitWidth = max(widgetSize.width, imageSize.width); - final fitHeight = min(widgetSize.height, imageSize.height); + final fitWidth = widgetSize.width; + final fitHeight = widgetSize.height; return min(fitWidth, fitHeight / (imageSize.height / imageSize.width)); } @@ -177,130 +206,133 @@ class _ControllerWidget extends ReusableReactiveWidget { (_getBackgroundFitWidth(widgetSize) / imageSize.width) * 7.5; final state = model.gamepad.getState(); - return Stack( - children: [ - Image.asset("assets/gamesir_controller.png"), - Positioned( - left: aOffset.dx, - top: aOffset.dy, - child: _ControllerButton( - value: state?.buttonA ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + return Opacity( + opacity: model.isConnected ? 1 : 0.50, + child: Stack( + children: [ + Image.asset("assets/gamesir_controller.png"), + Positioned( + left: aOffset.dx, + top: aOffset.dy, + child: _ControllerButton( + value: state?.buttonA ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: bOffset.dx, - top: bOffset.dy, - child: _ControllerButton( - value: state?.buttonB ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: bOffset.dx, + top: bOffset.dy, + child: _ControllerButton( + value: state?.buttonB ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: xOffset.dx, - top: xOffset.dy, - child: _ControllerButton( - value: state?.buttonX ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: xOffset.dx, + top: xOffset.dy, + child: _ControllerButton( + value: state?.buttonX ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: yOffset.dx, - top: yOffset.dy, - child: _ControllerButton( - value: state?.buttonY ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: yOffset.dx, + top: yOffset.dy, + child: _ControllerButton( + value: state?.buttonY ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: lbOffset.dx, - top: lbOffset.dy, - child: _ControllerButton( - value: state?.leftShoulder ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: lbOffset.dx, + top: lbOffset.dy, + child: _ControllerButton( + value: state?.leftShoulder ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: rbOffset.dx, - top: rbOffset.dy, - child: _ControllerButton( - value: state?.rightShoulder ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: rbOffset.dx, + top: rbOffset.dy, + child: _ControllerButton( + value: state?.rightShoulder ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: startOffset.dx, - top: startOffset.dy, - child: _ControllerButton( - value: state?.buttonStart ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: startOffset.dx, + top: startOffset.dy, + child: _ControllerButton( + value: state?.buttonStart ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: selectOffset.dx, - top: selectOffset.dy, - child: _ControllerButton( - value: state?.buttonBack ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: selectOffset.dx, + top: selectOffset.dy, + child: _ControllerButton( + value: state?.buttonBack ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: dPadUpOffset.dx, - top: dPadUpOffset.dy, - child: _ControllerButton( - value: state?.dpadUp ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: dPadUpOffset.dx, + top: dPadUpOffset.dy, + child: _ControllerButton( + value: state?.dpadUp ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: dPadDownOffset.dx, - top: dPadDownOffset.dy, - child: _ControllerButton( - value: state?.dpadDown ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: dPadDownOffset.dx, + top: dPadDownOffset.dy, + child: _ControllerButton( + value: state?.dpadDown ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: dPadLeftOffset.dx, - top: dPadLeftOffset.dy, - child: _ControllerButton( - value: state?.dpadLeft ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: dPadLeftOffset.dx, + top: dPadLeftOffset.dy, + child: _ControllerButton( + value: state?.dpadLeft ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - Positioned( - left: dPadRightOffset.dx, - top: dPadRightOffset.dy, - child: _ControllerButton( - value: state?.dpadRight ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, + Positioned( + left: dPadRightOffset.dx, + top: dPadRightOffset.dy, + child: _ControllerButton( + value: state?.dpadRight ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), ), - ), - _controllerJoystick( - x: state?.normalLeftX ?? 0, - y: -1 * (state?.normalLeftY ?? 0), - offsetOnImage: leftStick, - widgetSize: widgetSize, - ), - _controllerJoystick( - x: state?.normalRightX ?? 0, - y: -1 * (state?.normalRightY ?? 0), - offsetOnImage: rightStick, - widgetSize: widgetSize, - ), - ], + _controllerJoystick( + x: state?.normalLeftX ?? 0, + y: -1 * (state?.normalLeftY ?? 0), + offsetOnImage: leftStick, + widgetSize: widgetSize, + ), + _controllerJoystick( + x: state?.normalRightX ?? 0, + y: -1 * (state?.normalRightY ?? 0), + offsetOnImage: rightStick, + widgetSize: widgetSize, + ), + ], + ), ); } } From 42c8017d10b05e4be517e6abfe6bd5aea68f3b8e Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 23 Oct 2024 01:05:46 -0400 Subject: [PATCH 03/15] Some cleanup --- lib/src/pages/controller.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index d01e69351..888dbf496 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -89,11 +89,14 @@ class _ControllerWidget extends ReusableReactiveWidget { static const Offset dPadRight = Offset(227, 175); static const Offset leftStick = Offset(289, 293); - static const Offset rightStick = Offset(618, 293); + static const Offset rightStick = Offset(616, 293); /// Const constructor for Controller Widget const _ControllerWidget(super.model); + double _getScaledValue(double normalValue, Size widgetSize) => + (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; + double _getBackgroundFitWidth(Size widgetSize) { final fitWidth = widgetSize.width; final fitHeight = widgetSize.height; @@ -198,12 +201,9 @@ class _ControllerWidget extends ReusableReactiveWidget { widgetSize: widgetSize, ); - final buttonRadius = - (_getBackgroundFitWidth(widgetSize) / imageSize.width) * - normalButtonRadius; + final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); - final outlineWidth = - (_getBackgroundFitWidth(widgetSize) / imageSize.width) * 7.5; + final outlineWidth = _getScaledValue(7.5, widgetSize); final state = model.gamepad.getState(); return Opacity( From a2984e3b03c26f7775aeb4509419622c042c1eed Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 23 Oct 2024 01:21:12 -0400 Subject: [PATCH 04/15] Moved controllers view to top of list --- lib/src/pages/view.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/pages/view.dart b/lib/src/pages/view.dart index fcca753a6..80191b35b 100644 --- a/lib/src/pages/view.dart +++ b/lib/src/pages/view.dart @@ -91,6 +91,11 @@ class DashboardView { /// A list of views that represent all non-camera feeds. static final List uiViews = [ + DashboardView( + name: Routes.controllers, + iconFunc: () => Icon(Icons.sports_esports, color: Colors.black.withOpacity(0.5)), + builder: (context, index) => ControllersPage(index: index), + ), DashboardView( name: Routes.science, iconFunc: () => Icon(Icons.science, color: Colors.black.withOpacity(0.5)), @@ -116,11 +121,6 @@ class DashboardView { iconFunc: () => Icon(Icons.drive_eta, color: Colors.black.withOpacity(0.5)), builder: (context, index) => DrivePage(index: index), ), - DashboardView( - name: Routes.controllers, - iconFunc: () => Icon(Icons.sports_esports, color: Colors.black.withOpacity(0.5)), - builder: (context, index) => ControllersPage(index: index), - ), DashboardView( name: Routes.rocks, iconFunc: () => Icon(Icons.landslide, color: Colors.black.withOpacity(0.5)), From 276ef0a8886d72888da5af87b123611f48e32b6a Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 23 Oct 2024 01:21:19 -0400 Subject: [PATCH 05/15] Fixed weird size scaling bug --- lib/src/pages/controller.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index 888dbf496..c4b941307 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -98,8 +98,13 @@ class _ControllerWidget extends ReusableReactiveWidget { (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; double _getBackgroundFitWidth(Size widgetSize) { - final fitWidth = widgetSize.width; - final fitHeight = widgetSize.height; + var fitWidth = widgetSize.width; + var fitHeight = widgetSize.height; + + if (imageSize.width < widgetSize.width) { + fitWidth = imageSize.width; + fitHeight = imageSize.height; + } return min(fitWidth, fitHeight / (imageSize.height / imageSize.width)); } @@ -210,7 +215,7 @@ class _ControllerWidget extends ReusableReactiveWidget { opacity: model.isConnected ? 1 : 0.50, child: Stack( children: [ - Image.asset("assets/gamesir_controller.png"), + Image.asset("assets/gamesir_controller.png", fit: BoxFit.contain), Positioned( left: aOffset.dx, top: aOffset.dy, From c26a7a211c853bdb9709e8af5884d70409928e0b Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:41:49 -0400 Subject: [PATCH 06/15] Added triggers and padding --- lib/src/pages/controller.dart | 75 ++++++++++++++++++++++++++--- lib/src/services/gamepad/sdl.dart | 2 + lib/src/services/gamepad/state.dart | 8 +++ 3 files changed, 79 insertions(+), 6 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index c4b941307..699571d4f 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -2,7 +2,6 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/models.dart"; -import "package:rover_dashboard/src/widgets/generic/reactive_widget.dart"; import "package:rover_dashboard/widgets.dart"; /// The UI Page to display the controller status @@ -58,7 +57,12 @@ class _ControllersPageState extends State { ], ), Expanded( - child: Center(child: _ControllerWidget(selectedController)), + child: Padding( + padding: const EdgeInsets.all(10), + child: Center( + child: _ControllerWidget(selectedController), + ), + ), ), ], ); @@ -71,6 +75,9 @@ class _ControllerWidget extends ReusableReactiveWidget { static const double normalButtonRadius = 40; static const double normalJoystickRadius = 70; static const double joystickMaxOffset = 40; + static const double normalTriggerWidth = 30; + static const double normalTriggerHeight = 80; + static const double normalTriggerOutline = 10; static const Offset buttonA = Offset(727, 230); static const Offset buttonB = Offset(784, 173); @@ -80,6 +87,9 @@ class _ControllerWidget extends ReusableReactiveWidget { static const Offset leftBumper = Offset(186, 16); static const Offset rightBumper = Offset(726, 16); + static const Offset leftTrigger = Offset(40, 35); + static const Offset rightTrigger = Offset(872, 35); + static const Offset select = Offset(349, 112); static const Offset start = Offset(558, 112); @@ -88,8 +98,8 @@ class _ControllerWidget extends ReusableReactiveWidget { static const Offset dPadLeft = Offset(125, 175); static const Offset dPadRight = Offset(227, 175); - static const Offset leftStick = Offset(289, 293); - static const Offset rightStick = Offset(616, 293); + static const Offset leftStick = Offset(289, 295); + static const Offset rightStick = Offset(616, 295); /// Const constructor for Controller Widget const _ControllerWidget(super.model); @@ -101,7 +111,8 @@ class _ControllerWidget extends ReusableReactiveWidget { var fitWidth = widgetSize.width; var fitHeight = widgetSize.height; - if (imageSize.width < widgetSize.width) { + if (imageSize.width < widgetSize.width && + imageSize.height < widgetSize.height) { fitWidth = imageSize.width; fitHeight = imageSize.height; } @@ -150,6 +161,35 @@ class _ControllerWidget extends ReusableReactiveWidget { ); } + Widget _analogTrigger({ + required double value, + required Size widgetSize, + }) { + final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; + + final triggerWidth = normalTriggerWidth * scaleFactor; + final triggerHeight = normalTriggerHeight * scaleFactor; + final borderWidth = normalTriggerOutline * scaleFactor; + + return Container( + width: triggerWidth, + height: triggerHeight, + alignment: Alignment.bottomCenter, + decoration: BoxDecoration( + border: Border.all( + color: Colors.yellow, + width: borderWidth, + strokeAlign: BorderSide.strokeAlignOutside, + ), + ), + child: Container( + width: triggerWidth, + height: value * triggerHeight, + color: Colors.yellow, + ), + ); + } + @override Widget build(BuildContext context, Controller model) { final renderBox = context.findAncestorRenderObjectOfType(); @@ -181,6 +221,14 @@ class _ControllerWidget extends ReusableReactiveWidget { offsetOnImage: rightBumper, widgetSize: widgetSize, ); + final ltOffset = _getPositionedOffset( + offsetOnImage: leftTrigger, + widgetSize: widgetSize, + ); + final rtOffset = _getPositionedOffset( + offsetOnImage: rightTrigger, + widgetSize: widgetSize, + ); final startOffset = _getPositionedOffset( offsetOnImage: start, widgetSize: widgetSize, @@ -270,6 +318,22 @@ class _ControllerWidget extends ReusableReactiveWidget { outlineWidth: outlineWidth, ), ), + Positioned( + left: ltOffset.dx, + top: ltOffset.dy, + child: _analogTrigger( + value: state?.normalLeftTrigger ?? 0, + widgetSize: widgetSize, + ), + ), + Positioned( + left: rtOffset.dx, + top: rtOffset.dy, + child: _analogTrigger( + value: state?.normalRightTrigger ?? 0, + widgetSize: widgetSize, + ), + ), Positioned( left: startOffset.dx, top: startOffset.dy, @@ -351,7 +415,6 @@ class _ControllerButton extends StatelessWidget { required this.value, required this.radius, required this.outlineWidth, - super.key, }); @override diff --git a/lib/src/services/gamepad/sdl.dart b/lib/src/services/gamepad/sdl.dart index 97aaa020d..2fb210e3d 100644 --- a/lib/src/services/gamepad/sdl.dart +++ b/lib/src/services/gamepad/sdl.dart @@ -51,6 +51,8 @@ class DesktopGamepad extends Gamepad { normalRightY: -state.normalRightJoystickY, normalShoulder: state.normalShoulders.toDouble(), normalTrigger: state.normalTriggers, + normalLeftTrigger: state.normalLeftTrigger, + normalRightTrigger: state.normalRightTrigger, ); } } diff --git a/lib/src/services/gamepad/state.dart b/lib/src/services/gamepad/state.dart index bd7aa220a..10f7d6212 100644 --- a/lib/src/services/gamepad/state.dart +++ b/lib/src/services/gamepad/state.dart @@ -56,6 +56,12 @@ class GamepadState { /// A normalized reading of the triggers. final double normalTrigger; + /// A normalized reading of the left trigger + final double normalLeftTrigger; + + /// A normalized reading of the right trigger + final double normalRightTrigger; + /// A normalized reading of the shoulder buttons. final double normalShoulder; @@ -86,6 +92,8 @@ class GamepadState { required this.buttonBack, required this.buttonStart, required this.normalTrigger, + required this.normalLeftTrigger, + required this.normalRightTrigger, required this.normalShoulder, required this.normalLeftX, required this.normalLeftY, From 20bfb109dc7004af6ec05813250bae367a414ec0 Mon Sep 17 00:00:00 2001 From: Gold87 <91761103+Gold872@users.noreply.github.com> Date: Tue, 29 Oct 2024 18:43:02 -0400 Subject: [PATCH 07/15] Made GamepadState a typedef around sdl.GamepadState --- lib/src/models/rover/controls/arm.dart | 14 +-- lib/src/models/rover/controls/camera.dart | 2 +- .../models/rover/controls/modern_drive.dart | 4 +- lib/src/models/rover/controls/tank_drive.dart | 2 +- lib/src/pages/controller.dart | 1 + lib/src/services/gamepad/sdl.dart | 24 +---- lib/src/services/gamepad/state.dart | 101 +++--------------- 7 files changed, 28 insertions(+), 120 deletions(-) diff --git a/lib/src/models/rover/controls/arm.dart b/lib/src/models/rover/controls/arm.dart index bba27ef8f..d1c70c325 100644 --- a/lib/src/models/rover/controls/arm.dart +++ b/lib/src/models/rover/controls/arm.dart @@ -38,21 +38,21 @@ class ArmControls extends RoverControls { @override List parseInputs(GamepadState state) => [ // Manual control - if (state.normalRightX.abs() > state.normalRightY.abs() && state.normalRightX != 0) + if (state.normalRightX.abs() > state.normalRightJoystickY.abs() && state.normalRightX != 0) ArmCommand(swivel: MotorCommand(moveRadians: state.normalRightX * settings.swivel)), - if (state.normalRightY.abs() > state.normalRightX.abs() && state.normalRightY != 0) - ArmCommand(shoulder: MotorCommand(moveRadians: state.normalRightY * settings.shoulder)), + if (state.normalRightJoystickY.abs() > state.normalRightX.abs() && state.normalRightJoystickY != 0) + ArmCommand(shoulder: MotorCommand(moveRadians: state.normalRightJoystickY * settings.shoulder)), if (state.normalLeftY != 0) ArmCommand(elbow: MotorCommand(moveRadians: state.normalLeftY * settings.elbow)), // The bumpers should be pseudo-IK: Move the shoulder and elbow in sync. - if (state.normalShoulder != 0) ArmCommand( - shoulder: MotorCommand(moveRadians: state.normalShoulder * settings.shoulder * -1), - elbow: MotorCommand(moveRadians: state.normalShoulder * settings.elbow), + if (state.normalShoulders != 0) ArmCommand( + shoulder: MotorCommand(moveRadians: state.normalShoulders * settings.shoulder * -1), + elbow: MotorCommand(moveRadians: state.normalShoulders * settings.elbow), ), // Gripper if (state.normalDpadY != 0) GripperCommand(lift: MotorCommand(moveRadians: state.normalDpadY * settings.lift)), if (state.normalDpadX != 0) GripperCommand(rotate: MotorCommand(moveRadians: state.normalDpadX * settings.rotate)), - if (state.normalTrigger != 0) GripperCommand(pinch: MotorCommand(moveRadians: state.normalTrigger * settings.pinch)), + if (state.normalTriggers != 0) GripperCommand(pinch: MotorCommand(moveRadians: state.normalTriggers * settings.pinch)), // Custom actions if (state.buttonA && !isAPressed) () { isAPressed = true; return GripperCommand(open: true); }(), diff --git a/lib/src/models/rover/controls/camera.dart b/lib/src/models/rover/controls/camera.dart index d729e208b..25b10b668 100644 --- a/lib/src/models/rover/controls/camera.dart +++ b/lib/src/models/rover/controls/camera.dart @@ -44,7 +44,7 @@ class CameraControls extends RoverControls { final newFrontSwivel = state.normalLeftX; final newFrontTilt = state.normalLeftY; final newRearSwivel = state.normalRightX; - final newRearTilt = -1 * state.normalRightY; + final newRearTilt = -1 * state.normalRightJoystickY; if (newFrontSwivel.abs() >= 0.05 || newFrontTilt.abs() >= 0.05) { // Update the front camera. Now, choose which axis if (newFrontSwivel.abs() > newFrontTilt.abs()) { diff --git a/lib/src/models/rover/controls/modern_drive.dart b/lib/src/models/rover/controls/modern_drive.dart index 8b4b8d744..d582c2518 100644 --- a/lib/src/models/rover/controls/modern_drive.dart +++ b/lib/src/models/rover/controls/modern_drive.dart @@ -50,7 +50,7 @@ class ModernDriveControls extends RoverControls { /// Gets all commands for the wheels based on the gamepad state. List getWheelCommands(GamepadState state) { - final speed = state.normalTrigger; // sum of both triggers, [-1, 1] + final speed = state.normalTriggers; // sum of both triggers, [-1, 1] if (speed == 0) { final left = state.normalLeftX; final right = state.normalLeftX; @@ -99,7 +99,7 @@ class ModernDriveControls extends RoverControls { final newFrontSwivel = state.normalDpadX; final newFrontTilt = state.normalDpadY; final newRearSwivel = state.normalRightX; - final newRearTilt = state.normalRightY; + final newRearTilt = state.normalRightJoystickY; if (newFrontSwivel.abs() >= 0.05 || newFrontTilt.abs() >= 0.05) { // Update the front camera. Now, choose which axis if (newFrontSwivel.abs() > newFrontTilt.abs()) { diff --git a/lib/src/models/rover/controls/tank_drive.dart b/lib/src/models/rover/controls/tank_drive.dart index 1acbce2eb..6bbe0fd2e 100644 --- a/lib/src/models/rover/controls/tank_drive.dart +++ b/lib/src/models/rover/controls/tank_drive.dart @@ -30,7 +30,7 @@ class DriveControls extends RoverControls { List parseInputs(GamepadState state) => [ DriveCommand(throttle: throttle, setThrottle: true), DriveCommand(setLeft: true, left: state.normalLeftY), - DriveCommand(setRight: true, right: -1*state.normalRightY), + DriveCommand(setRight: true, right: -1*state.normalRightJoystickY), ]; @override diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index 699571d4f..9b373d638 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -2,6 +2,7 @@ import "package:flutter/material.dart"; import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/widgets.dart"; /// The UI Page to display the controller status diff --git a/lib/src/services/gamepad/sdl.dart b/lib/src/services/gamepad/sdl.dart index 2fb210e3d..bf43d3ed9 100644 --- a/lib/src/services/gamepad/sdl.dart +++ b/lib/src/services/gamepad/sdl.dart @@ -32,27 +32,5 @@ class DesktopGamepad extends Gamepad { bool get isConnected => _sdl.isConnected; @override - GamepadState getState() { - final state = _sdl.getState(); - return GamepadState( - buttonA: state.buttonA, - buttonB: state.buttonB, - buttonX: state.buttonX, - buttonY: state.buttonY, - buttonBack: state.buttonBack, - buttonStart: state.buttonStart, - normalDpadX: state.normalDpadX.toDouble(), - normalDpadY: state.normalDpadY.toDouble(), - normalLeftX: state.normalLeftJoystickX, - // These Y values are flipped because sdl_gamepad follows the standard convention, - // where positive means the joystick is moving towards the user (down). - normalLeftY: -state.normalLeftJoystickY, - normalRightX: state.normalRightJoystickX, - normalRightY: -state.normalRightJoystickY, - normalShoulder: state.normalShoulders.toDouble(), - normalTrigger: state.normalTriggers, - normalLeftTrigger: state.normalLeftTrigger, - normalRightTrigger: state.normalRightTrigger, - ); - } + GamepadState getState() => _sdl.getState(); } diff --git a/lib/src/services/gamepad/state.dart b/lib/src/services/gamepad/state.dart index 10f7d6212..6fafdce3e 100644 --- a/lib/src/services/gamepad/state.dart +++ b/lib/src/services/gamepad/state.dart @@ -1,3 +1,5 @@ +import "package:flutter_sdl_gamepad/flutter_sdl_gamepad.dart" as sdl; + /// The battery level of a gamepad. enum GamepadBatteryLevel { /// The battery is running low. @@ -26,98 +28,25 @@ enum GamepadBatteryLevel { /// The complete state of a gamepad. /// -/// A "normal" value means a value that is linked to two buttons. For example, both triggers -/// contribute to the [normalTrigger] value, so if the left was pressed less than the right, -/// the "normalized" result would be a small positive value. In general, the normal values range -/// from -1.0 to +1.0, inclusive, with -1 meaning all the way to one side, +1 to the other, and -/// 0 indicates that neither button is pressed. -/// -/// For digital buttons, a normalized value will only ever be -1, 0, or +1. For analog inputs, -/// including pressure-sensitive triggers, the value will be in the range [-1.0, +1.0]. -class GamepadState { - /// Whether the A button was pressed. - final bool buttonA; - - /// Whether the B button was pressed. - final bool buttonB; - - /// Whether the X button was pressed. - final bool buttonX; - - /// Whether the Y button was pressed. - final bool buttonY; - - /// Whether the Back or Select button was pressed. - final bool buttonBack; - - /// Whether the Start or Options button was pressed. - final bool buttonStart; - - /// A normalized reading of the triggers. - final double normalTrigger; - - /// A normalized reading of the left trigger - final double normalLeftTrigger; - - /// A normalized reading of the right trigger - final double normalRightTrigger; - - /// A normalized reading of the shoulder buttons. - final double normalShoulder; +/// Acts as a wrapper around [sdl.GamepadState] to allow backwards compatibility with older +/// rover gamepad APIs +typedef GamepadState = sdl.GamepadState; +/// An extension on [GamepadState] to allow for backwards compatibility with +/// the rover joystick direction system +extension RoverGamepadState on GamepadState { /// A normalized reading of the left joystick's X-axis. - final double normalLeftX; + double get normalLeftX => normalLeftJoystickX; /// A normalized reading of the left joystick's Y-axis. - final double normalLeftY; - - /// A normalized reading of the right joystick's X-axis. - final double normalRightX; + double get normalLeftY => -normalLeftJoystickY; /// A normalized reading of the right joystick's X-axis. - final double normalRightY; - - /// A normalized reading of the D-pad's X-axis. - final double normalDpadX; - - /// A normalized reading of the D-pad's X-axis. - final double normalDpadY; - - /// Creates a new representation of the gamepad state. - const GamepadState({ - required this.buttonA, - required this.buttonB, - required this.buttonX, - required this.buttonY, - required this.buttonBack, - required this.buttonStart, - required this.normalTrigger, - required this.normalLeftTrigger, - required this.normalRightTrigger, - required this.normalShoulder, - required this.normalLeftX, - required this.normalLeftY, - required this.normalRightX, - required this.normalRightY, - required this.normalDpadX, - required this.normalDpadY, - }); + double get normalRightX => normalRightJoystickX; - /// Whether the left shoulder is being pressed. - bool get leftShoulder => normalShoulder < 0; + /// A normalized reading of the right joystick's Y-axis. + double get normalRightY => -normalRightJoystickY; - /// Whether the right shoulder is being pressed. - bool get rightShoulder => normalShoulder > 0; - - /// Whether the D-pad's down button is being pressed. - bool get dpadDown => normalDpadY < 0; - - /// Whether the D-pad's up button is being pressed. - bool get dpadUp => normalDpadY > 0; - - /// Whether the D-pad's left button is being pressed. - bool get dpadLeft => normalDpadX < 0; - - /// Whether the D-pad's right button is being pressed. - bool get dpadRight => normalDpadX > 0; + /// A normalized reading of the shoulder buttons. + double get normalShoulder => normalShoulders.toDouble(); } From 548454cd6b056c370d29e85349c17d2996855108 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 30 Oct 2024 07:32:00 -0400 Subject: [PATCH 08/15] Fixed: ReusableReactiveWidget wouldn't update when model is switched --- lib/src/widgets/generic/reactive_widget.dart | 26 ++++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/src/widgets/generic/reactive_widget.dart b/lib/src/widgets/generic/reactive_widget.dart index 3b28466ee..619020974 100644 --- a/lib/src/widgets/generic/reactive_widget.dart +++ b/lib/src/widgets/generic/reactive_widget.dart @@ -1,7 +1,7 @@ import "package:flutter/material.dart"; -/// A widget that listens to a [ChangeNotifier] (called the view model) and updates when it does. -/// +/// A widget that listens to a [ChangeNotifier] (called the view model) and updates when it does. +/// /// - If you're listening to an existing view model, use [ReusableReactiveWidget]. /// - If you're listening to a view model created by this widget, use [ReactiveWidget]. abstract class ReactiveWidgetInterface extends StatefulWidget { @@ -9,8 +9,8 @@ abstract class ReactiveWidgetInterface extends Statefu const ReactiveWidgetInterface({super.key}); /// Creates the view model. This is only called once in the widget's lifetime. T createModel(); - /// Whether this widget should dispose the model after it's destroyed. - /// + /// Whether this widget should dispose the model after it's destroyed. + /// /// Normally, we want the widget to clean up after itself and dispose its view model. But it's /// also common for one view model to create and depend on another model. In this case, if we /// are listening to the sub-model, we don't want to dispose it while the parent model is still @@ -23,8 +23,8 @@ abstract class ReactiveWidgetInterface extends Statefu /// Builds the UI according to the state in [model]. Widget build(BuildContext context, T model); - /// This function gives you an opportunity to update the view model when the widget updates. - /// + /// This function gives you an opportunity to update the view model when the widget updates. + /// /// For more details, see [State.didUpdateWidget]. @mustCallSuper void didUpdateWidget(covariant ReactiveWidgetInterface oldWidget, T model) { } @@ -43,7 +43,7 @@ abstract class ReactiveWidget extends ReactiveWidgetIn bool get shouldDispose => true; } -/// A [ReactiveWidgetInterface] that "borrows" a view model and does not dispose of it. +/// A [ReactiveWidgetInterface] that "borrows" a view model and does not dispose of it. abstract class ReusableReactiveWidget extends ReactiveWidgetInterface { /// The model to borrow. final T model; @@ -60,7 +60,7 @@ abstract class ReusableReactiveWidget extends Reactive /// A state for [ReactiveWidget] that manages the [model]. class ReactiveWidgetState extends State>{ /// The model to listen to. - late final T model; + late T model; @override void initState() { @@ -79,6 +79,16 @@ class ReactiveWidgetState extends State oldWidget) { widget.didUpdateWidget(oldWidget, model); + if (oldWidget is ReusableReactiveWidget && widget is ReusableReactiveWidget) { + final newModel = (widget as ReusableReactiveWidget).model; + if (model != newModel) { + // Stop listening to the old one, listen to the new one. + // Don't dispose of the old one since it's reusable. + model.removeListener(listener); + model = newModel; + model.addListener(listener); + } + } super.didUpdateWidget(oldWidget); } From 509835dad42c3bd3f8902fdb993e79c273cf8502 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 30 Oct 2024 07:32:13 -0400 Subject: [PATCH 09/15] Formatting and compactness --- lib/src/pages/controller.dart | 288 +++++++++++++--------------------- 1 file changed, 105 insertions(+), 183 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index 9b373d638..dfd4205e9 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -20,55 +20,62 @@ class ControllersPage extends StatefulWidget { class _ControllersPageState extends State { Controller selectedController = models.rover.controller1; + void _setController(Controller? value) { + if (value == null) return; + setState(() => selectedController = value); + } + @override Widget build(BuildContext context) => Column( + children: [ + const SizedBox(height: 16), + Row( children: [ - Row( - children: [ - const Spacer(), - const Text("Controller: "), - DropdownButton( - value: selectedController, - items: [ - DropdownMenuItem( - value: models.rover.controller1, - child: const Text("Controller 1"), - ), - DropdownMenuItem( - value: models.rover.controller2, - child: const Text("Controller 2"), - ), - DropdownMenuItem( - value: models.rover.controller3, - child: const Text("Controller 3"), - ), - ], - onChanged: (Controller? value) { - if (value == null) { - return; - } - - setState(() { - selectedController = value; - }); - }, + const Spacer(), + const Text("Controller: "), + DropdownButton( + value: selectedController, + onChanged: _setController, + items: [ + DropdownMenuItem( + value: models.rover.controller1, + child: const Text("Controller 1"), + ), + DropdownMenuItem( + value: models.rover.controller2, + child: const Text("Controller 2"), + ), + DropdownMenuItem( + value: models.rover.controller3, + child: const Text("Controller 3"), ), - const Spacer(), - ViewsSelector(index: widget.index), ], ), - Expanded( - child: Padding( - padding: const EdgeInsets.all(10), - child: Center( - child: _ControllerWidget(selectedController), - ), - ), + const SizedBox(width: 8), + FilledButton( + onPressed: selectedController.isConnected + ? selectedController.gamepad.pulse : null, + child: const Text("Vibrate"), ), + const Spacer(), + ViewsSelector(index: widget.index), ], - ); + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(10), + child: Center( + child: _ControllerWidget(selectedController), + ), + ), + ), + ], + ); } +/// The color to fill in all gamepad buttons with. +const gamepadColor = Colors.blue; + /// Displays data for the provided [Controller] class _ControllerWidget extends ReusableReactiveWidget { static const Size imageSize = Size(905, 568); @@ -106,14 +113,13 @@ class _ControllerWidget extends ReusableReactiveWidget { const _ControllerWidget(super.model); double _getScaledValue(double normalValue, Size widgetSize) => - (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; + (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; double _getBackgroundFitWidth(Size widgetSize) { var fitWidth = widgetSize.width; var fitHeight = widgetSize.height; - if (imageSize.width < widgetSize.width && - imageSize.height < widgetSize.height) { + if (imageSize.width < widgetSize.width && imageSize.height < widgetSize.height) { fitWidth = imageSize.width; fitHeight = imageSize.height; } @@ -155,7 +161,7 @@ class _ControllerWidget extends ReusableReactiveWidget { width: joystickRadius, height: joystickRadius, decoration: BoxDecoration( - color: Colors.yellow, + color: gamepadColor, borderRadius: BorderRadius.circular(10000), ), ), @@ -178,7 +184,7 @@ class _ControllerWidget extends ReusableReactiveWidget { alignment: Alignment.bottomCenter, decoration: BoxDecoration( border: Border.all( - color: Colors.yellow, + color: gamepadColor, width: borderWidth, strokeAlign: BorderSide.strokeAlignOutside, ), @@ -186,7 +192,7 @@ class _ControllerWidget extends ReusableReactiveWidget { child: Container( width: triggerWidth, height: value * triggerHeight, - color: Colors.yellow, + color: gamepadColor, ), ); } @@ -196,7 +202,7 @@ class _ControllerWidget extends ReusableReactiveWidget { final renderBox = context.findAncestorRenderObjectOfType(); final widgetSize = - (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; + (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; final aOffset = _getPositionedOffset( offsetOnImage: buttonA, @@ -255,140 +261,56 @@ class _ControllerWidget extends ReusableReactiveWidget { widgetSize: widgetSize, ); - final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); - final outlineWidth = _getScaledValue(7.5, widgetSize); + final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); + final outlineWidth = _getScaledValue(7.5, widgetSize); final state = model.gamepad.getState(); + + Widget buttonWidget({ + required Offset offset, + bool? value, + }) => Positioned( + left: offset.dx, + top: offset.dy, + child: _ControllerButton( + value: value ?? false, + radius: buttonRadius, + outlineWidth: outlineWidth, + ), + ); + + Widget triggerWidget({ + required Offset offset, + required double? value, + }) => Positioned( + left: offset.dx, + top: offset.dy, + child: _analogTrigger( + value: value ?? 0, + widgetSize: widgetSize, + ), + ); + return Opacity( opacity: model.isConnected ? 1 : 0.50, child: Stack( children: [ Image.asset("assets/gamesir_controller.png", fit: BoxFit.contain), - Positioned( - left: aOffset.dx, - top: aOffset.dy, - child: _ControllerButton( - value: state?.buttonA ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: bOffset.dx, - top: bOffset.dy, - child: _ControllerButton( - value: state?.buttonB ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: xOffset.dx, - top: xOffset.dy, - child: _ControllerButton( - value: state?.buttonX ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: yOffset.dx, - top: yOffset.dy, - child: _ControllerButton( - value: state?.buttonY ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: lbOffset.dx, - top: lbOffset.dy, - child: _ControllerButton( - value: state?.leftShoulder ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: rbOffset.dx, - top: rbOffset.dy, - child: _ControllerButton( - value: state?.rightShoulder ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: ltOffset.dx, - top: ltOffset.dy, - child: _analogTrigger( - value: state?.normalLeftTrigger ?? 0, - widgetSize: widgetSize, - ), - ), - Positioned( - left: rtOffset.dx, - top: rtOffset.dy, - child: _analogTrigger( - value: state?.normalRightTrigger ?? 0, - widgetSize: widgetSize, - ), - ), - Positioned( - left: startOffset.dx, - top: startOffset.dy, - child: _ControllerButton( - value: state?.buttonStart ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: selectOffset.dx, - top: selectOffset.dy, - child: _ControllerButton( - value: state?.buttonBack ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: dPadUpOffset.dx, - top: dPadUpOffset.dy, - child: _ControllerButton( - value: state?.dpadUp ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: dPadDownOffset.dx, - top: dPadDownOffset.dy, - child: _ControllerButton( - value: state?.dpadDown ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: dPadLeftOffset.dx, - top: dPadLeftOffset.dy, - child: _ControllerButton( - value: state?.dpadLeft ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), - Positioned( - left: dPadRightOffset.dx, - top: dPadRightOffset.dy, - child: _ControllerButton( - value: state?.dpadRight ?? false, - radius: buttonRadius, - outlineWidth: outlineWidth, - ), - ), + buttonWidget(offset: aOffset, value: state?.buttonA), + buttonWidget(offset: bOffset, value: state?.buttonB), + buttonWidget(offset: xOffset, value: state?.buttonX), + buttonWidget(offset: yOffset, value: state?.buttonY), + buttonWidget(offset: lbOffset, value: state?.leftShoulder), + buttonWidget(offset: rbOffset, value: state?.rightShoulder), + buttonWidget(offset: startOffset, value: state?.buttonStart), + buttonWidget(offset: selectOffset, value: state?.buttonBack), + buttonWidget(offset: dPadUpOffset, value: state?.dpadUp), + buttonWidget(offset: dPadDownOffset, value: state?.dpadDown), + buttonWidget(offset: dPadLeftOffset, value: state?.dpadLeft), + buttonWidget(offset: dPadRightOffset, value: state?.dpadRight), + triggerWidget(offset: ltOffset, value: state?.normalLeftTrigger), + triggerWidget(offset: rtOffset, value: state?.normalRightTrigger), _controllerJoystick( x: state?.normalLeftX ?? 0, y: -1 * (state?.normalLeftY ?? 0), @@ -420,15 +342,15 @@ class _ControllerButton extends StatelessWidget { @override Widget build(BuildContext context) => Container( - width: radius, - height: radius, - decoration: BoxDecoration( - color: value ? Colors.yellow : Colors.transparent, - shape: BoxShape.circle, - border: Border.all( - color: Colors.yellow, - width: outlineWidth, - ), - ), - ); + width: radius, + height: radius, + decoration: BoxDecoration( + color: value ? gamepadColor : Colors.transparent, + shape: BoxShape.circle, + border: Border.all( + color: gamepadColor, + width: outlineWidth, + ), + ), + ); } From 4a0bf776958602058d47dd759a5ccd060a143ccf Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Wed, 30 Oct 2024 07:36:05 -0400 Subject: [PATCH 10/15] More formatting --- lib/src/pages/controller.dart | 94 +++++++---------------------------- 1 file changed, 19 insertions(+), 75 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index dfd4205e9..f4a499658 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -200,77 +200,27 @@ class _ControllerWidget extends ReusableReactiveWidget { @override Widget build(BuildContext context, Controller model) { final renderBox = context.findAncestorRenderObjectOfType(); - - final widgetSize = - (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; - - final aOffset = _getPositionedOffset( - offsetOnImage: buttonA, - widgetSize: widgetSize, - ); - final bOffset = _getPositionedOffset( - offsetOnImage: buttonB, - widgetSize: widgetSize, - ); - final xOffset = _getPositionedOffset( - offsetOnImage: buttonX, - widgetSize: widgetSize, - ); - final yOffset = _getPositionedOffset( - offsetOnImage: buttonY, - widgetSize: widgetSize, - ); - final lbOffset = _getPositionedOffset( - offsetOnImage: leftBumper, - widgetSize: widgetSize, - ); - final rbOffset = _getPositionedOffset( - offsetOnImage: rightBumper, - widgetSize: widgetSize, - ); - final ltOffset = _getPositionedOffset( - offsetOnImage: leftTrigger, - widgetSize: widgetSize, - ); - final rtOffset = _getPositionedOffset( - offsetOnImage: rightTrigger, - widgetSize: widgetSize, - ); - final startOffset = _getPositionedOffset( - offsetOnImage: start, - widgetSize: widgetSize, - ); - final selectOffset = _getPositionedOffset( - offsetOnImage: select, - widgetSize: widgetSize, - ); - final dPadUpOffset = _getPositionedOffset( - offsetOnImage: dPadUp, - widgetSize: widgetSize, - ); - final dPadDownOffset = _getPositionedOffset( - offsetOnImage: dPadDown, - widgetSize: widgetSize, - ); - final dPadLeftOffset = _getPositionedOffset( - offsetOnImage: dPadLeft, - widgetSize: widgetSize, - ); - final dPadRightOffset = _getPositionedOffset( - offsetOnImage: dPadRight, - widgetSize: widgetSize, - ); - - - + final widgetSize = (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); final outlineWidth = _getScaledValue(7.5, widgetSize); final state = model.gamepad.getState(); - Widget buttonWidget({ - required Offset offset, - bool? value, - }) => Positioned( + final aOffset = _getPositionedOffset(offsetOnImage: buttonA, widgetSize: widgetSize); + final bOffset = _getPositionedOffset(offsetOnImage: buttonB, widgetSize: widgetSize); + final xOffset = _getPositionedOffset(offsetOnImage: buttonX, widgetSize: widgetSize); + final yOffset = _getPositionedOffset(offsetOnImage: buttonY, widgetSize: widgetSize); + final lbOffset = _getPositionedOffset(offsetOnImage: leftBumper, widgetSize: widgetSize); + final rbOffset = _getPositionedOffset(offsetOnImage: rightBumper, widgetSize: widgetSize); + final ltOffset = _getPositionedOffset(offsetOnImage: leftTrigger, widgetSize: widgetSize); + final rtOffset = _getPositionedOffset(offsetOnImage: rightTrigger, widgetSize: widgetSize); + final startOffset = _getPositionedOffset(offsetOnImage: start, widgetSize: widgetSize); + final selectOffset = _getPositionedOffset(offsetOnImage: select, widgetSize: widgetSize); + final dPadUpOffset = _getPositionedOffset(offsetOnImage: dPadUp, widgetSize: widgetSize); + final dPadDownOffset = _getPositionedOffset(offsetOnImage: dPadDown, widgetSize: widgetSize); + final dPadLeftOffset = _getPositionedOffset(offsetOnImage: dPadLeft, widgetSize: widgetSize); + final dPadRightOffset = _getPositionedOffset(offsetOnImage: dPadRight, widgetSize: widgetSize); + + Widget buttonWidget({required Offset offset, bool? value}) => Positioned( left: offset.dx, top: offset.dy, child: _ControllerButton( @@ -280,10 +230,7 @@ class _ControllerWidget extends ReusableReactiveWidget { ), ); - Widget triggerWidget({ - required Offset offset, - required double? value, - }) => Positioned( + Widget triggerWidget({required Offset offset, required double? value}) => Positioned( left: offset.dx, top: offset.dy, child: _analogTrigger( @@ -347,10 +294,7 @@ class _ControllerButton extends StatelessWidget { decoration: BoxDecoration( color: value ? gamepadColor : Colors.transparent, shape: BoxShape.circle, - border: Border.all( - color: gamepadColor, - width: outlineWidth, - ), + border: Border.all(color: gamepadColor, width: outlineWidth), ), ); } From 893072e39f643df00ba82cfd772de9710ab7fd86 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 19 Nov 2024 00:31:28 -0500 Subject: [PATCH 11/15] Moved controllers page to the bottom of the list --- lib/src/pages/view.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/pages/view.dart b/lib/src/pages/view.dart index 80191b35b..f6c600d42 100644 --- a/lib/src/pages/view.dart +++ b/lib/src/pages/view.dart @@ -91,11 +91,6 @@ class DashboardView { /// A list of views that represent all non-camera feeds. static final List uiViews = [ - DashboardView( - name: Routes.controllers, - iconFunc: () => Icon(Icons.sports_esports, color: Colors.black.withOpacity(0.5)), - builder: (context, index) => ControllersPage(index: index), - ), DashboardView( name: Routes.science, iconFunc: () => Icon(Icons.science, color: Colors.black.withOpacity(0.5)), @@ -126,6 +121,11 @@ class DashboardView { iconFunc: () => Icon(Icons.landslide, color: Colors.black.withOpacity(0.5)), builder: (context, index) => RocksPage(index: index), ), + DashboardView( + name: Routes.controllers, + iconFunc: () => Icon(Icons.sports_esports, color: Colors.black.withOpacity(0.5)), + builder: (context, index) => ControllersPage(index: index), + ), ]; /// A blank view. From 3e91f33f787896c52b7245b97c87dd7cf77ea4c9 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 19 Nov 2024 00:36:09 -0500 Subject: [PATCH 12/15] Refactored ControllersPage from Stateful -> Reactive --- lib/src/pages/controller.dart | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index f4a499658..06ef4ee9d 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -5,8 +5,18 @@ import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/widgets.dart"; +class ControllersViewModel with ChangeNotifier { + Controller selectedController = models.rover.controller1; + + void setController(Controller? value) { + if (value == null) return; + selectedController = value; + notifyListeners(); + } +} + /// The UI Page to display the controller status -class ControllersPage extends StatefulWidget { +class ControllersPage extends ReactiveWidget { /// The index of this view. final int index; @@ -14,19 +24,10 @@ class ControllersPage extends StatefulWidget { const ControllersPage({required this.index, super.key}); @override - State createState() => _ControllersPageState(); -} - -class _ControllersPageState extends State { - Controller selectedController = models.rover.controller1; - - void _setController(Controller? value) { - if (value == null) return; - setState(() => selectedController = value); - } + ControllersViewModel createModel() => ControllersViewModel(); @override - Widget build(BuildContext context) => Column( + Widget build(BuildContext context, ControllersViewModel model) => Column( children: [ const SizedBox(height: 16), Row( @@ -34,8 +35,8 @@ class _ControllersPageState extends State { const Spacer(), const Text("Controller: "), DropdownButton( - value: selectedController, - onChanged: _setController, + value: model.selectedController, + onChanged: model.setController, items: [ DropdownMenuItem( value: models.rover.controller1, @@ -53,19 +54,19 @@ class _ControllersPageState extends State { ), const SizedBox(width: 8), FilledButton( - onPressed: selectedController.isConnected - ? selectedController.gamepad.pulse : null, + onPressed: model.selectedController.isConnected + ? model.selectedController.gamepad.pulse : null, child: const Text("Vibrate"), ), const Spacer(), - ViewsSelector(index: widget.index), + ViewsSelector(index: index), ], ), Expanded( child: Padding( padding: const EdgeInsets.all(10), child: Center( - child: _ControllerWidget(selectedController), + child: _ControllerWidget(model.selectedController), ), ), ), From fab5e8b46b9fd2129aaf3354173886dc43715612 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 19 Nov 2024 00:42:18 -0500 Subject: [PATCH 13/15] Fixed vibrate button not working --- lib/src/pages/controller.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index 06ef4ee9d..67e8ef775 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -5,12 +5,28 @@ import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/widgets.dart"; +/// A view model to select and listen to a gamepad. class ControllersViewModel with ChangeNotifier { + /// The gamepad to listen to. Controller selectedController = models.rover.controller1; + /// Starts listening to the gamepad. + ControllersViewModel() { + selectedController.addListener(notifyListeners); + } + + @override + void dispose() { + selectedController.removeListener(notifyListeners); + super.dispose(); + } + + /// Changes which controller is being listened to. void setController(Controller? value) { if (value == null) return; + selectedController.removeListener(notifyListeners); selectedController = value; + selectedController.addListener(notifyListeners); notifyListeners(); } } From ce8c4a374ea271be6093994a380f3162062085ca Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 19 Nov 2024 00:49:55 -0500 Subject: [PATCH 14/15] Moved ControllerButton to its own file --- lib/src/pages/controller.dart | 32 +++++-------------------- lib/src/pages/controllers/button.dart | 34 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 lib/src/pages/controllers/button.dart diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index 67e8ef775..a87ffb293 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -5,6 +5,8 @@ import "package:rover_dashboard/models.dart"; import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/widgets.dart"; +import "controllers/button.dart"; + /// A view model to select and listen to a gamepad. class ControllersViewModel with ChangeNotifier { /// The gamepad to listen to. @@ -240,10 +242,11 @@ class _ControllerWidget extends ReusableReactiveWidget { Widget buttonWidget({required Offset offset, bool? value}) => Positioned( left: offset.dx, top: offset.dy, - child: _ControllerButton( - value: value ?? false, + child: ControllerButton( + isPressed: value ?? false, radius: buttonRadius, - outlineWidth: outlineWidth, + borderWidth: outlineWidth, + color: gamepadColor, ), ); @@ -292,26 +295,3 @@ class _ControllerWidget extends ReusableReactiveWidget { ); } } - -class _ControllerButton extends StatelessWidget { - final double radius; - final double outlineWidth; - final bool value; - - const _ControllerButton({ - required this.value, - required this.radius, - required this.outlineWidth, - }); - - @override - Widget build(BuildContext context) => Container( - width: radius, - height: radius, - decoration: BoxDecoration( - color: value ? gamepadColor : Colors.transparent, - shape: BoxShape.circle, - border: Border.all(color: gamepadColor, width: outlineWidth), - ), - ); -} diff --git a/lib/src/pages/controllers/button.dart b/lib/src/pages/controllers/button.dart new file mode 100644 index 000000000..c16489dfb --- /dev/null +++ b/lib/src/pages/controllers/button.dart @@ -0,0 +1,34 @@ +import "package:flutter/material.dart"; + +/// Represents a button that is pressed or not. +class ControllerButton extends StatelessWidget { + /// The radius with which to draw this button. + final double radius; + + /// How thick the border should be. + final double borderWidth; + + /// Whether the button is pressed or not. + final bool isPressed; + + final Color color; + + /// Draws a small circle to represent a button that can be pressed. + const ControllerButton({ + required this.isPressed, + required this.radius, + required this.borderWidth, + required this.color, + }); + + @override + Widget build(BuildContext context) => Container( + width: radius, + height: radius, + decoration: BoxDecoration( + color: isPressed ? color : null, + shape: BoxShape.circle, + border: Border.all(color: color, width: borderWidth), + ), + ); +} From 4d435dd9c50f95f317fad717319499dce3e33365 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Tue, 19 Nov 2024 01:09:10 -0500 Subject: [PATCH 15/15] Moved ControllerWidget to its own file --- lib/src/pages/controller.dart | 213 +--------------------- lib/src/pages/controllers/button.dart | 1 + lib/src/pages/controllers/constants.dart | 73 ++++++++ lib/src/pages/controllers/controller.dart | 180 ++++++++++++++++++ 4 files changed, 257 insertions(+), 210 deletions(-) create mode 100644 lib/src/pages/controllers/constants.dart create mode 100644 lib/src/pages/controllers/controller.dart diff --git a/lib/src/pages/controller.dart b/lib/src/pages/controller.dart index a87ffb293..fc763dd51 100644 --- a/lib/src/pages/controller.dart +++ b/lib/src/pages/controller.dart @@ -1,11 +1,8 @@ -import "dart:math"; - -import "package:flutter/material.dart"; +import "package:flutter/material.dart"; import "package:rover_dashboard/models.dart"; -import "package:rover_dashboard/services.dart"; import "package:rover_dashboard/widgets.dart"; -import "controllers/button.dart"; +import "controllers/controller.dart"; /// A view model to select and listen to a gamepad. class ControllersViewModel with ChangeNotifier { @@ -84,214 +81,10 @@ class ControllersPage extends ReactiveWidget { child: Padding( padding: const EdgeInsets.all(10), child: Center( - child: _ControllerWidget(model.selectedController), + child: ControllerWidget(model.selectedController), ), ), ), ], ); } - -/// The color to fill in all gamepad buttons with. -const gamepadColor = Colors.blue; - -/// Displays data for the provided [Controller] -class _ControllerWidget extends ReusableReactiveWidget { - static const Size imageSize = Size(905, 568); - - static const double normalButtonRadius = 40; - static const double normalJoystickRadius = 70; - static const double joystickMaxOffset = 40; - static const double normalTriggerWidth = 30; - static const double normalTriggerHeight = 80; - static const double normalTriggerOutline = 10; - - static const Offset buttonA = Offset(727, 230); - static const Offset buttonB = Offset(784, 173); - static const Offset buttonX = Offset(670, 173); - static const Offset buttonY = Offset(727, 117); - - static const Offset leftBumper = Offset(186, 16); - static const Offset rightBumper = Offset(726, 16); - - static const Offset leftTrigger = Offset(40, 35); - static const Offset rightTrigger = Offset(872, 35); - - static const Offset select = Offset(349, 112); - static const Offset start = Offset(558, 112); - - static const Offset dPadUp = Offset(180, 122); - static const Offset dPadDown = Offset(180, 221); - static const Offset dPadLeft = Offset(125, 175); - static const Offset dPadRight = Offset(227, 175); - - static const Offset leftStick = Offset(289, 295); - static const Offset rightStick = Offset(616, 295); - - /// Const constructor for Controller Widget - const _ControllerWidget(super.model); - - double _getScaledValue(double normalValue, Size widgetSize) => - (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; - - double _getBackgroundFitWidth(Size widgetSize) { - var fitWidth = widgetSize.width; - var fitHeight = widgetSize.height; - - if (imageSize.width < widgetSize.width && imageSize.height < widgetSize.height) { - fitWidth = imageSize.width; - fitHeight = imageSize.height; - } - - return min(fitWidth, fitHeight / (imageSize.height / imageSize.width)); - } - - Offset _getPositionedOffset({ - required Offset offsetOnImage, - required Size widgetSize, - double radius = normalButtonRadius, - }) { - final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; - final xFromCenter = offsetOnImage.dx - radius / 2; - final yFromCenter = offsetOnImage.dy - radius / 2; - - return Offset(xFromCenter, yFromCenter) * scaleFactor; - } - - // This can't be its own widget since it has to be embedded into the stack for the position to work - Widget _controllerJoystick({ - required double x, - required double y, - required Offset offsetOnImage, - required Size widgetSize, - }) { - final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; - - final joystickRadius = normalJoystickRadius * scaleFactor; - final maxOffset = joystickMaxOffset * scaleFactor; - - final xFromCenter = offsetOnImage.dx - normalJoystickRadius / 2; - final yFromCenter = offsetOnImage.dy - normalJoystickRadius / 2; - - return Positioned( - left: xFromCenter * scaleFactor + maxOffset * x, - top: yFromCenter * scaleFactor + maxOffset * y, - child: Container( - width: joystickRadius, - height: joystickRadius, - decoration: BoxDecoration( - color: gamepadColor, - borderRadius: BorderRadius.circular(10000), - ), - ), - ); - } - - Widget _analogTrigger({ - required double value, - required Size widgetSize, - }) { - final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; - - final triggerWidth = normalTriggerWidth * scaleFactor; - final triggerHeight = normalTriggerHeight * scaleFactor; - final borderWidth = normalTriggerOutline * scaleFactor; - - return Container( - width: triggerWidth, - height: triggerHeight, - alignment: Alignment.bottomCenter, - decoration: BoxDecoration( - border: Border.all( - color: gamepadColor, - width: borderWidth, - strokeAlign: BorderSide.strokeAlignOutside, - ), - ), - child: Container( - width: triggerWidth, - height: value * triggerHeight, - color: gamepadColor, - ), - ); - } - - @override - Widget build(BuildContext context, Controller model) { - final renderBox = context.findAncestorRenderObjectOfType(); - final widgetSize = (renderBox == null || !renderBox.hasSize) ? imageSize : renderBox.size; - final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); - final outlineWidth = _getScaledValue(7.5, widgetSize); - final state = model.gamepad.getState(); - - final aOffset = _getPositionedOffset(offsetOnImage: buttonA, widgetSize: widgetSize); - final bOffset = _getPositionedOffset(offsetOnImage: buttonB, widgetSize: widgetSize); - final xOffset = _getPositionedOffset(offsetOnImage: buttonX, widgetSize: widgetSize); - final yOffset = _getPositionedOffset(offsetOnImage: buttonY, widgetSize: widgetSize); - final lbOffset = _getPositionedOffset(offsetOnImage: leftBumper, widgetSize: widgetSize); - final rbOffset = _getPositionedOffset(offsetOnImage: rightBumper, widgetSize: widgetSize); - final ltOffset = _getPositionedOffset(offsetOnImage: leftTrigger, widgetSize: widgetSize); - final rtOffset = _getPositionedOffset(offsetOnImage: rightTrigger, widgetSize: widgetSize); - final startOffset = _getPositionedOffset(offsetOnImage: start, widgetSize: widgetSize); - final selectOffset = _getPositionedOffset(offsetOnImage: select, widgetSize: widgetSize); - final dPadUpOffset = _getPositionedOffset(offsetOnImage: dPadUp, widgetSize: widgetSize); - final dPadDownOffset = _getPositionedOffset(offsetOnImage: dPadDown, widgetSize: widgetSize); - final dPadLeftOffset = _getPositionedOffset(offsetOnImage: dPadLeft, widgetSize: widgetSize); - final dPadRightOffset = _getPositionedOffset(offsetOnImage: dPadRight, widgetSize: widgetSize); - - Widget buttonWidget({required Offset offset, bool? value}) => Positioned( - left: offset.dx, - top: offset.dy, - child: ControllerButton( - isPressed: value ?? false, - radius: buttonRadius, - borderWidth: outlineWidth, - color: gamepadColor, - ), - ); - - Widget triggerWidget({required Offset offset, required double? value}) => Positioned( - left: offset.dx, - top: offset.dy, - child: _analogTrigger( - value: value ?? 0, - widgetSize: widgetSize, - ), - ); - - return Opacity( - opacity: model.isConnected ? 1 : 0.50, - child: Stack( - children: [ - Image.asset("assets/gamesir_controller.png", fit: BoxFit.contain), - buttonWidget(offset: aOffset, value: state?.buttonA), - buttonWidget(offset: bOffset, value: state?.buttonB), - buttonWidget(offset: xOffset, value: state?.buttonX), - buttonWidget(offset: yOffset, value: state?.buttonY), - buttonWidget(offset: lbOffset, value: state?.leftShoulder), - buttonWidget(offset: rbOffset, value: state?.rightShoulder), - buttonWidget(offset: startOffset, value: state?.buttonStart), - buttonWidget(offset: selectOffset, value: state?.buttonBack), - buttonWidget(offset: dPadUpOffset, value: state?.dpadUp), - buttonWidget(offset: dPadDownOffset, value: state?.dpadDown), - buttonWidget(offset: dPadLeftOffset, value: state?.dpadLeft), - buttonWidget(offset: dPadRightOffset, value: state?.dpadRight), - triggerWidget(offset: ltOffset, value: state?.normalLeftTrigger), - triggerWidget(offset: rtOffset, value: state?.normalRightTrigger), - _controllerJoystick( - x: state?.normalLeftX ?? 0, - y: -1 * (state?.normalLeftY ?? 0), - offsetOnImage: leftStick, - widgetSize: widgetSize, - ), - _controllerJoystick( - x: state?.normalRightX ?? 0, - y: -1 * (state?.normalRightY ?? 0), - offsetOnImage: rightStick, - widgetSize: widgetSize, - ), - ], - ), - ); - } -} diff --git a/lib/src/pages/controllers/button.dart b/lib/src/pages/controllers/button.dart index c16489dfb..fc90f4864 100644 --- a/lib/src/pages/controllers/button.dart +++ b/lib/src/pages/controllers/button.dart @@ -11,6 +11,7 @@ class ControllerButton extends StatelessWidget { /// Whether the button is pressed or not. final bool isPressed; + /// The color of the button. final Color color; /// Draws a small circle to represent a button that can be pressed. diff --git a/lib/src/pages/controllers/constants.dart b/lib/src/pages/controllers/constants.dart new file mode 100644 index 000000000..3ad6c0a37 --- /dev/null +++ b/lib/src/pages/controllers/constants.dart @@ -0,0 +1,73 @@ +import "package:flutter/material.dart"; + +/// The color to fill in all gamepad buttons with. +const gamepadColor = Colors.blue; + +/// The size of the controller image. Useful for overlaying elements on the picture. +const Size imageSize = Size(905, 568); + +/// The radius for a button. +const double normalButtonRadius = 40; + +/// The radius for a joystick. +const double normalJoystickRadius = 70; + +/// The furthest a joystick can be off its center. +const double joystickMaxOffset = 40; + +/// The width of the trigger bars. +const double normalTriggerWidth = 30; + +/// The height of hte trigger bars. +const double normalTriggerHeight = 80; + +/// The thickness of the trigger bars. +const double normalTriggerOutline = 10; + +/// The position of the A button on the image. +const Offset buttonA = Offset(727, 230); + +/// The position of the B button on the image. +const Offset buttonB = Offset(784, 173); + +/// The position of the X button on the image. +const Offset buttonX = Offset(670, 173); + +/// The position of the Y button on the image. +const Offset buttonY = Offset(727, 117); + +/// The position of the left bumper/shoulder on the image. +const Offset leftBumper = Offset(186, 16); + +/// The position of the right bumper/shoulder on the image. +const Offset rightBumper = Offset(726, 16); + +/// The position of the left trigger on the image. +const Offset leftTrigger = Offset(40, 35); + +/// The position of the right trigger on the image. +const Offset rightTrigger = Offset(872, 35); + +/// The position of the select button on the image. +const Offset select = Offset(349, 112); + +/// The position of the start button on the image. +const Offset start = Offset(558, 112); + +/// The position of the up arrow button on the image. +const Offset dPadUp = Offset(180, 122); + +/// The position of the down arrow button on the image. +const Offset dPadDown = Offset(180, 221); + +/// The position of the left arrow button on the image. +const Offset dPadLeft = Offset(125, 175); + +/// The position of the right arrow button on the image. +const Offset dPadRight = Offset(227, 175); + +/// The position of the left joystick on the image. +const Offset leftStick = Offset(289, 295); + +/// The position of the right joystic on the image. +const Offset rightStick = Offset(616, 295); diff --git a/lib/src/pages/controllers/controller.dart b/lib/src/pages/controllers/controller.dart new file mode 100644 index 000000000..a9ac51c35 --- /dev/null +++ b/lib/src/pages/controllers/controller.dart @@ -0,0 +1,180 @@ +import "dart:math"; + +import "package:flutter/material.dart"; +import "package:rover_dashboard/models.dart"; +import "package:rover_dashboard/services.dart"; +import "package:rover_dashboard/widgets.dart"; + +import "button.dart"; +import "constants.dart"; + +/// A widget that shows all button presses and analog inputs overlaid on an image of a controller. +class ControllerWidget extends ReusableReactiveWidget { + /// Const constructor for Controller Widget + const ControllerWidget(super.model); + + double _getScaledValue(double normalValue, Size widgetSize) => + (_getBackgroundFitWidth(widgetSize) / imageSize.width) * normalValue; + + double _getBackgroundFitWidth(Size widgetSize) { + var fitWidth = widgetSize.width; + var fitHeight = widgetSize.height; + + if (imageSize.width < widgetSize.width && imageSize.height < widgetSize.height) { + fitWidth = imageSize.width; + fitHeight = imageSize.height; + } + + return min(fitWidth, fitHeight / (imageSize.height / imageSize.width)); + } + + Offset _getPositionedOffset({ + required Offset offsetOnImage, + required Size widgetSize, + double radius = normalButtonRadius, + }) { + final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; + final xFromCenter = offsetOnImage.dx - radius / 2; + final yFromCenter = offsetOnImage.dy - radius / 2; + + return Offset(xFromCenter, yFromCenter) * scaleFactor; + } + + // This can't be its own widget since it has to be embedded into the stack for the position to work + Widget _controllerJoystick({ + required double x, + required double y, + required Offset offsetOnImage, + required Size widgetSize, + }) { + final scaleFactor = _getBackgroundFitWidth(widgetSize) / imageSize.width; + + final joystickRadius = normalJoystickRadius * scaleFactor; + final maxOffset = joystickMaxOffset * scaleFactor; + + final xFromCenter = offsetOnImage.dx - normalJoystickRadius / 2; + final yFromCenter = offsetOnImage.dy - normalJoystickRadius / 2; + + return Positioned( + left: xFromCenter * scaleFactor + maxOffset * x, + top: yFromCenter * scaleFactor + maxOffset * y, + child: Container( + width: joystickRadius, + height: joystickRadius, + decoration: BoxDecoration( + color: gamepadColor, + borderRadius: BorderRadius.circular(10000), + ), + ), + ); + } + + Widget _buttonWidget({ + required Offset offset, + required double buttonRadius, + required double outlineWidth, + bool? value, + }) => Positioned( + left: offset.dx, + top: offset.dy, + child: ControllerButton( + isPressed: value ?? false, + radius: buttonRadius, + borderWidth: outlineWidth, + color: gamepadColor, + ), + ); + + Widget _triggerWidget({ + required Offset offset, + required double? value, + required Size size, + }) { + final scaleFactor = _getBackgroundFitWidth(size) / imageSize.width; + final triggerWidth = normalTriggerWidth * scaleFactor; + final triggerHeight = normalTriggerHeight * scaleFactor; + final borderWidth = normalTriggerOutline * scaleFactor; + return Positioned( + left: offset.dx, + top: offset.dy, + child: Container( + width: triggerWidth, + height: triggerHeight, + alignment: Alignment.bottomCenter, + decoration: BoxDecoration( + border: Border.all( + color: gamepadColor, + width: borderWidth, + strokeAlign: BorderSide.strokeAlignOutside, + ), + ), + child: Container( + width: triggerWidth, + height: (value ?? 0) * triggerHeight, + color: gamepadColor, + ), + ), + ); + } + + Widget _buildGamepad(BuildContext context, Size widgetSize, Controller model) { + final buttonRadius = _getScaledValue(normalButtonRadius, widgetSize); + final outlineWidth = _getScaledValue(7.5, widgetSize); + final state = model.gamepad.getState(); + + final aOffset = _getPositionedOffset(offsetOnImage: buttonA, widgetSize: widgetSize); + final bOffset = _getPositionedOffset(offsetOnImage: buttonB, widgetSize: widgetSize); + final xOffset = _getPositionedOffset(offsetOnImage: buttonX, widgetSize: widgetSize); + final yOffset = _getPositionedOffset(offsetOnImage: buttonY, widgetSize: widgetSize); + final lbOffset = _getPositionedOffset(offsetOnImage: leftBumper, widgetSize: widgetSize); + final rbOffset = _getPositionedOffset(offsetOnImage: rightBumper, widgetSize: widgetSize); + final ltOffset = _getPositionedOffset(offsetOnImage: leftTrigger, widgetSize: widgetSize); + final rtOffset = _getPositionedOffset(offsetOnImage: rightTrigger, widgetSize: widgetSize); + final startOffset = _getPositionedOffset(offsetOnImage: start, widgetSize: widgetSize); + final selectOffset = _getPositionedOffset(offsetOnImage: select, widgetSize: widgetSize); + final dPadUpOffset = _getPositionedOffset(offsetOnImage: dPadUp, widgetSize: widgetSize); + final dPadDownOffset = _getPositionedOffset(offsetOnImage: dPadDown, widgetSize: widgetSize); + final dPadLeftOffset = _getPositionedOffset(offsetOnImage: dPadLeft, widgetSize: widgetSize); + final dPadRightOffset = _getPositionedOffset(offsetOnImage: dPadRight, widgetSize: widgetSize); + + return Opacity( + opacity: model.isConnected ? 1 : 0.50, + child: Stack( + children: [ + Image.asset("assets/gamesir_controller.png", fit: BoxFit.contain), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: aOffset, value: state?.buttonA), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: bOffset, value: state?.buttonB), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: xOffset, value: state?.buttonX), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: yOffset, value: state?.buttonY), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: lbOffset, value: state?.leftShoulder), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: rbOffset, value: state?.rightShoulder), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: startOffset, value: state?.buttonStart), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: selectOffset, value: state?.buttonBack), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: dPadUpOffset, value: state?.dpadUp), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: dPadDownOffset, value: state?.dpadDown), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: dPadLeftOffset, value: state?.dpadLeft), + _buttonWidget(buttonRadius: buttonRadius, outlineWidth: outlineWidth, offset: dPadRightOffset, value: state?.dpadRight), + _triggerWidget(size: widgetSize, offset: ltOffset, value: state?.normalLeftTrigger), + _triggerWidget(size: widgetSize, offset: rtOffset, value: state?.normalRightTrigger), + _controllerJoystick( + x: state?.normalLeftX ?? 0, + y: -1 * (state?.normalLeftY ?? 0), + offsetOnImage: leftStick, + widgetSize: widgetSize, + ), + _controllerJoystick( + x: state?.normalRightX ?? 0, + y: -1 * (state?.normalRightY ?? 0), + offsetOnImage: rightStick, + widgetSize: widgetSize, + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context, Controller model) => LayoutBuilder( + builder: (context, constraints) => _buildGamepad(context, constraints.biggest, model), + ); +}