T@7y{M*NWPCZpjo^cPRK=isEV&
zp1G{vdHuQ3kq@#X&ISDa%9ymflXEAY2tS@&VbgB@-lCL~CwH?|V&AOrKgAu*tk$cm
z*DxmdQig{Ftrt6YP4+W?NP7Bh_!3I?a
z+hl2~gxVRK_1(zE`X^*J;L-pW5<^f(_FHdTUrN2#!rBWGqO`CLv8w)_`>c>>wd=P2
zSNKZWshNlC9?|CYV2V#o^SRQI@JkV(WxehJvg}jH9GsA&L27V
zt8m=}+x&gV>B5`c@j%!{sM;`}fgLx#Xu~stv;K*-m&5?o9GtXa_s$lAV|*!5FI%
zSu@iv!L1@;tWJKNi);OMrE4#}9ZfFf#76#>e7(sZ
z|Aaem1_{)79nEd}*FDRrHS>#MRaF&m0D){)qeW}SG4L;hkkw$Ub#Qvk{K5~&WNKG!
zpEHOodH_4GO$ienerdn4MIR%;Zbsvs83eRAV)I-m0>DbM<5#}fUj9y|ZdWq7W=ugu
zmrmaR4Bbb_SfKV4fNF%#B3p8JD0q-tsL@pvRHJ=4>54`eLh8CBGGVV?IS~Ah`&5z5
z+7F1IS>?a;DR?{R2(zLNe#8eVzJ?Q~I~Sq#19DJL_yMJ&lpjy<=P!l*fHK+Evp*t!
zLy?#W7)#dxWCZZwO8_)sU`Z&xfs%$mfH!(zUFgcoY^zY=Zz?ABR5^e{f94bODqOnZ
zKpwv-=wG<0^#?cv@Wz4&Z-@v|a?Ex*`J3x`k#C2izkH2fdvKP=|0sW5;x}~q=LzA7
zwSv@~Q~mGkDEwmt@|QTBDgI}my`M(yU)CC?AxYJZB4X^#Zj)Bsx(gWS`IPvHUR5;rPyN_
z;7vsX$Hx?)V#IDY0|Y5z4T?0(X!xCs1V{HFFcFoJqv_O=HMEVCN$
zMj@n(4#T$NVd=tyAN&s&k-s-Rl`XZ3n;9OQaLn
zI059&Mx2Imsl^TL!wXL&auxvFgsfrvjr}8$(idde+9e8;hg~#`6g3$gdOsJ5a3udL
z?uf{oXh3ziE_=>t4B*38XNCv?@duO~yrEk>mQKUyg8FG6hpd^gh1t~nEf0XY|D9hl
zircN@MeX*HMr;{1hbRM>3Io{F`*EODn%oC@sH?owhLC8i<7R(@zXYIL2@bPt%)dQ8
z#~=8+@CR3LwACR|v;N<3kpAS5V1h`Ah@OFwmFVpDcOUCbI4lwt9G&%w=4&W|@-4rBh&m
zQxa(de<(AGx9i<6lH0e2vp4mvn`E;KU@K5gGq)5p5FFycQAjKrL(
zH=DAJ_s78ss@e_eskReo^N}`B{OH+AO%8HLfia$F436z%_&O=+A|A4x>=tRCoXFtN
z7U@w9X2w^vg{>b-X4HW)-k5Y%8;R5}-YQT|HwUYcuzzZ76KwD*Gs~tYq}}Bj=Ne<|
z?l&)nG>1u^{b^sf6S-FoyB_xAVAN9fapW40QpiM4WxUHr9v`r!8h2!~J4?b*8Sgn(
zuJ$-{JiS26b-(-Y@Nhx7MR@M=Vrzee=FDq_I~rUw{TGycJ>oN6!i#&7%R4_5ztwrW
zAwFB~^r)XlLR$PRB3Y|!<+M%X@$akO14@U=r(Tt9xSLxFS4lnHe3^744V!h+E+>
zCB`*u*WV8qeY*4ERVC_DopMwy@0MC>_-zEv^Y6b+A~xNwqV3zG0obVZ{O5_t(;CdQ+g>4XXX8h3tZcMLk!{p%1LRK
z!ctFTrx!nW!VbU_Jv=eC#(#dzSlx5%4S(*L=*j*|b_)hY`AG5TkV=!CY`qWv9Q(Qq
zTnTvzyV+-uDC^1;Ww)%a>N<7j&HYbhRrSO7*@`5Qnj8N#HB6P5cqYCTkMLpnyE<5B
zi%%}7{!}Y%<|=S32}wVWLe>65D^w?oSh5?m`I&ZV%iNJe{H1*&7jn?{rZ<|59+1P%
zGOlXW=K9V`r%p@t*!;adMzbFfonS_^sjx0^VK!Od1iO_5@Hz-?Yi|m)vuOf*+4;c^
znNGt)TS~*52ET)UjHzsRl|hRw}A;1TSRygcPm=y$>^laUO
z1$1-dZDOmNCl)sMqK-sI@blq1XZE!yZ|8cEeR2^_N9rl=XUa(Po!)IQr&0VaC7yWv
zv+F}zp}*y%hczcFOWqDCJ`-1A^Yhy{Ag=G7vw?Oqr?^6&EhuR|_ua5*=_9Wu*;>su
z8w(GLQATu?wez-CsxtPhV2#<#HcR7eo~HAZO|w;E;y%qwBHsI*_zn4^bZpA&+cyqG
z`kxh|tI#((H!Z?%(ll31U24)S5|7>Q07`%`*xM`er8X1drg7&Wz%e0|Yrn$}4q=+WZ2V_CQO{+XiOiis-rZ#6uG|cNF=${Aoy7u}JTnT&TgE-YlY8*N{o$bGgTU;pMexxW%~T#E|5
zD*UWRK6!Bm=JV1h-$?9EqHsRf#v8KjU6x)Vmm{x`!rg#4I{9Sdr6K2+Wm=bpJ!ufzzf6Imt-EfZjBE&NyNoAL4&HRJ7Nb
z!Ft5fm8uaZ%Sh6Mlcn0WbhMr`$UV-izmlTHW*%Sev%f@ii%e}iu*o3Th51A#tX##?
z@u&7Ad&9O#qetjX1MsyxRfwfOL3@tpVu?rstUa8Ot1FzsVx6U+ldv)xiyanmSq|7-URENj~^scvJcT#f6@ta{GE)#W;K
z?(zw@#eYCcS=+I>;@z_3_4J97>ix(sN5f?d}r$xl`v=?&s$G3TU
z7c$DvRV!UIWTcDiH?f_QI**ddBRj!otQ99L+L&@;A-=Mf#PQ&6;M=`lPX-=0?Ymvg-PT)5yIEuxLzsxE@-08O14_grtL
z=!6knB>nBz()%76>$BT0-QDz7{oGsf*f~Zq
zI}JMC1T(aOMsZSRO&axiGpjl!4=d)?5B!LUEP?cCwU|#9U-dM0;s@*ssKbh$LN_vNo2j0)|3c2JXD&*XqY36kK+`anaG8BwIAcOy4I8PD5
zXM84JAS{gDidCz}EgdfuMV34@yQni_d5@gN~`tzq?NA&H{{oFr^g(e
z+1A|KTFtBl1qEw#w^4)B)X$Gp^h6{!f2I=AH%a$&xu4C(F8JSIWszHxAJ;(^c}Og?+A~?ySYXMt5=7MzQ?~j
zc=Feowasi@aG|{{fLvV>nQ;zh;v3}3Dd~;X(VvEFNPq24>
z?iVF4ZjgkGW%QhB<9gI`6h*c@H;&CVFxaGin(M;2V^x+OsL6?Ji&7{c-1O%=lcfV=
zodkzPn@JC0g8j`C48~8N09k@8et7rcR5hx4T;#scC*I2ko}OFIy)W*vMW$FPa$op-
zXp{4(zFL!s+uZ6vlOgreDvJnx#lnSLCxf!5KOq0a-RgX2rK-0|Z@GnQn*u{}&QL5<
zmy-&d*t%)jA~m@^((897{aE)8sOkXr#+fa-9}wxB@%|7dbL+=79w#-#hr_C7Z0j5J
zRk--tG|Q<1RNO`l(WNGy%*p}WiP_haojI+MatoF>8c3bSn*DEl_p`;#3>pcG%4_(Z
zS7&;lVlF0ZSi#UQ>H9>JUwAxHX(aDRUZziNtTC(C2YV&1#O!5-{qJlZVH<(
zE4R=$oHa_oHS!HQ&erST_eAIUi)n+>b8D5KzaD)Zbg@j0hvT+%T3FMZbG?{bb6KLj
z+i16%ZKc~FZ}%h9dzZ58zWVj#V?MoDceyywW|)fEV9mdANKdWDM|Y65TNZssw5tf^
zDDc;7O7)DCLm$Ltz8@obF~s~ojvz1&Z0!49P>gr2IhJ4uinU&Zv4oTU#(>N5jZ?;{JILm-5xXT
zyA@{btev;Ck{(Efeqf4R0$}CpX;8WEUitxX&VX-5)@~@Z;DJw2|Ff2i(+$%`XG^fZiJGFlN1H(=E~V~Be^<79Ho7JVdsFv%r5YY7HMohs@S<|MQn>Qo9s
zPEt0}wo2IDj{EJ=2dQNlVkHoT1GMTQlJMY-IH
zq|ruPH@RfLw!D7rb@p;YyR1_hmqJR{D7WB!zJ@qtMQxWs9#W69#^{WT)#Ha5v^3gR
z(C)ad+V>Po6S559<@bj|*atVW79JS$B_JQ~JHmMDg}wHh?-)O&+BW~EejMZemgs3A
ziubTU*EoFWS7j^XS4EU(31^R5^|3=Cf+Y4dQ|nEnO`uHzXFeRTFl-wFh`gTGlDUTC5
zmw28pp(Nf-%s0&5{@6(>mop!3lqX1E(IBh)du&Eb^;9{6pDl`dB9nzOhdm?nD9D3!
zg^yl5?@n0nzd}DI#D&$?U>S~|3EX_KC_C%ux?fUz?7M);_xNyq-cPyjzKaZtY)6n?
z{Q=b+6ZA(M60h4gGdO>gkX_H>>yGZT??)PTDb)w+FaChepQ#L6P@ZnkIY^Ol+l)Su
z=kO`|A*PbLQ%nRfE!_TMswHZ^p=a%8VXPe2N72%Po!mp{i!ho_dO+*B#pFB>JLnp!
zPT^Il9cG5!j{R@cC2F=StIFs=rj-m%oue0y&G#N+thM`_zN=*UuqEzDWmTZf?Mc&?
zdzqJw0NN~m^kTH(K-XmSzP}j1(C+%`=8N;?gL>gFJ~_!rp~}tWLf;;xWMz&!of>QC
zrc>Y~o%GZ^WOor8MTNFHwEdC8d`Od+Peai_^bBsSkSSOsH!3ba-A%Jz<${xNO4%m&Z56N>kv)q-7(N7rrAF&VnB~8AR0Ob+xE?kSn
zswXP7C1tQglpCNKG&+8E^>&^dc&bN#tLWa&g!$j6Spuld56oyVkN0aNwSS=;J8j)Q-9Hy&0
z<;9<`k-pNmwuBIqR8Bl=z_91|R9o^Q}~Is#7YTqeh4zt)MlyXC3Gu2fP7GX9s204wR%&KD7-1OwRmD)7#$r=&(`;$b%_~HC
z36v1QO%;k@Qa7`udy9dycwh~VUZ?M|8TSgAXO`|}N?=oCQU%3rY}roL-&11*Ph%Dxud*=lw+;_X3DQEyZorL`J=js5|(+lW4(ntHdUIyew=H>Ljk@;4C}
zb#~s7o~$gtHq`Q6TqWPnkHP5~QzO%Io>Qz;i|Q?r`+}?58oBqSlcmGS)(5w7SQx}&
zQ?~op6TaLQ92QBiY2PrArN$<--{$Gyr5T+#x=W!={oP>p2gEAz;`1)MZRKaVeeYvC
zW9nb5O4n0G)SMR5Z0@MWqdYc|6V1pYEDKCK`}lC~90rBzap9OKOq+g_I$4{c>qg*3
z>+>PV7ALIiDW>5#7eU#8(QY3#s#o3M=wHj<%_NprWtx8=Z%#zbcY|A~+D8@q>Gzr^
zg`yL#oHDo~goyTD@#c$$QN?x^gQ(bG?p#U?Qss+35yIkNPJMOXckbb$#(+jISw?bn
z(wiYSaPl0DW!B)6#)R?3jfOBkh|{20k@uVt6x1vyHB8z*mCzu=7msp~UO_ai@=3e(
z+hRuJ+d#g{0$&&mnG^@wl#B~eM)NwPLORENcw|-*Gd|NJ7W!!l3U)0@sYJ&GQxJvj9Q>FPblBsYR3{OM>
zv+}HTSxTPUhR21>S_*m5^FI1K0!@L6VL~pg!8vxhHW3OaX*Oeu09GG;?hEJ=KF2TBA!8Ak6AUiNj8rwE2rA&-Tq$=B4x4BYH
zNKW*rO*DB$zgF8l61S(2FXeB&(c+({Smo~N0gz2&G3y?2Bj=M)0epj=-Z@?rnft};
z`E=)$C>Afi)o^zkH%|y(%8VzOrWLbiA~Jm44#?M{@1S$$TOBC^C%*yhcf=5(0$Gj+Y%spDyd$AFAf#u(T~;0
zik)*3oO2egdaE$1k1`i?E32>Rpnf1a8hcJGUK10}7k8<}qrQxx=VDYpLLi7zclxC@
zHlZGr4b*Y5VylQSx_Kvq+ZkE4ZBC>5m*joi$}Z3m21>mjNjzHhZe_4d}jEB-4mT
zh4J-k-G>J%h6ftuRj1IcVBGs19{9aJ1TkUdxk6M`tAde8ELRpClFk@eK_SdQNy(fg
z9G{Jfp@MSJs5o6RCNwG+5+FsR&XGVY;GGJJ(Pg8dBcmY`;4%~c?6=#Yf)kCp>7qvhxwE(`Ki@_9Pu!8uF5gaB0q*PE&j2HLAxKgOn7if|Q^rd=po{)D02-dVUy}XEWeEivjGe1gMLk(4gVMNkV{AL`m(Lf6SiU)4f
zEgX;A6NL9-uWhQD6|4&G_n7hfM7>7^cO<q`Y*L&bd*RsN+Ktb20?qw
zz_yezf6fP@-eY!W$~7e;aQ^yZU;;DPW!-rXBIn+GAR=?F2_?TC7Yl(?cW=zS*@mXh
zpW8F$Pqjp5Gz6I-_S$=D_XN+W%9BD}g!$~*XU}?Q0i+367GXq?9EfA?&BwG$PZveB
zGy30ZbM;UVBXP+;)&87=zUsUiaha$Xg4(_L1Ax+|Z_SF8|qlJ_ukUfZ0Q~aP*
zd$(v5i?MJHZtoWV=w@$3)H!)BkDto~E7FB>_a=~wrbL<`_xuMh{)+^HcfN}n`l)Ac
zV#HCHAhL5NlzW|EJ}5Y&5?`7xqvrqRv`l-;%(AAeKnv_K6HEY-5QXMfc}#Y9T6NlGL7@*a3K%S;Db{zl)NwC?tU7
z54IA{w0Z(R{TXJ`g+NgQnU)mnCJ9)kTih>EvN%Wp*cRSRd1P5Il7T^$X^%=ui2$`Y
zwtIkijFNRgjAU4twQDJcK-KNqj$E3LLWW>9=XDL?f&zhT48g|NML}R`R05=Mp%Gxl
zb%mh2woPNUBgy8e$eOU4acY_j)T;dEO#EPtYDlDwY8Hbkoe2d4sQ%Un=43>C$^dis
zK%5CBcpR8FxWbyU#2VYX)jhvyI=`)!@G=-Vk0ngvzrT~D^aiIaVZkeM9xJcBseqhU
zKxTm#Ba(rUD@LA+u*@t9GNiFE1BKW*u*?knGW!v^afrM);7ffuF-x&AOY^DoAvRqh
zkyP9AT=)Jre-Q!y%>>i`@oy#w9FoA+q@)lz+0P#lkU-3W3h>k0>foHsE!}3D*lzg=
zfrY)F5$G_T|L*<5m0x+Yp}YrIS*t0Q{LWg4SM_Xa?Nrj3^HQ*@n$DxB74~_{yJgBJ
z$DVaf?Ef14+(5@TQd84!$yy`n2ef|n;%o5XeEaLdOV;}pK8&J~tV7uEYqgJf7ru&C
zTJdW66!b-cZ*iQLk%vw_+gI>TiOFwGbB`K}92sAcXWxI*>Qjd#QzLcjS4mXIw%GAm
z$oZ6mkbiKoP`A~7jpu7A`#T5v9&Le^u@uAjm}bAQl>cj>3wbC?!AZ+J{$e9f`MWS%
zBfns0<-v=&McyZX`f`<>!p%GSr?n*L$I84X*&)}L=IJ^DbkLkCqBM*xNH6FfoQzIynM2#kxK3O}^=8~g{
z(%p}lqdVU0vWRQJq{ub}KqmLKd=_>P2uaqvAJd@wv&CJ-zspw
zxvHxBw}FN<<43ikBvOs{&OeEGzWvE@a^P_J?M^as+!JC3jq{
zg6%N2sZURJUonVWxc4aF!@{C9P1Kxb$ycTOk!N?d1zVF>OSM$}KUA2oFXnyssR(u@
zd%D(R()fLjp7mG*-;&afPkc{*h2i_QpxuV`thS&J=cBLj3u;Qd!fyM-YBn%FFV%9t
zyRXJ?XQA~`l*^$k>kk#SeGwHCH!e%%n^K#tXjuE26@DG98&f5P_79z?*eujLUe{ea
zDZp0r2(SsTsWXdvWd&FFJb`KHL1jWU=a)6cB5mB?u#0jn^N`!u0u>O`G3V#|+bE#p
zb?>wmnBqQo(N6gH8_GpTcz#E%5A
z$r-NGg~mj}D&|S_PBs;$1?4}u-T6kV#?axA_&Jtx?kA`8nQlJ{r-i%JwyI88UAj~_hWeT1(PSk*S*Fklq8y{l?^}mj8UF{O!
ziL!eCoS90_F+yHw_^*^a;{nkKr4ps$PZXgPjfm0{3Rbc5Z8vulOfN^2XFwg^;qTA0Kg
zw`XaZxVZ;ro=h8b9s(1Ga>_HPTacHd*9C^-(Q|$3aiL20V*QSHq@8cp_zamQ%2&?@SZ5|taCabaVR8WE8K)Du4Oj(=5o!6
z%^5NYu?q)mXP_se&y_oG+^@0~Z)-vLzgv#d&afmuCL~gqewp#DTvwm&AoY_7*TI%+
z-%~w}Pv!)>oHD3z(jgyli>Z1qxa{yj%!iM!Y?-Y7;OO%cn^$E{SU7wPDgOq=z!RgJ
z=5`7w@4QXw@7}TTuvfsLs{9*j$3H>By+icON{|EvO`G_gyxZxL>Yhx4w_N<9e9OP7
zkh0}X@m@57R9bIm%E@T%|7xjSrn$Ck&6^yr;~izf_^5&`Z1a1b&vknKysnp>AEPt2
zo->rJ(Le@`HH_AcPny;e4j#VpV)v>1?t&rhCE3J#cE?SolJ21!{#kgXG*ltRND;+)
zAN$>}by9udAJG@CJX&IjeNh`fAnpatL$mr9Z@$SOJBt2jt7q0=n#<0b?@zViGhx_;
zh$)GpcTp#y<^E`6ns*%XZFzXkBsyxxZocM*d0g6*b{eYc`#d)Xf3RshT6>6{+}wFR
zb2>nFT`tsqYTr_KN7(Y4&o!BuN)*-45~i*l`T^NxBXDA~M(mO$y=X4h{k){I#%I_p
zAXVyo--iQLDNfV>h@;RCVw9c#8g#zb`Bfss_OKwi3E)BN{nMo=t-07tk$Wbeil(sj
zA@9W<-y3Dh7K@CVOXnM-daaT4(0(zrDd3<~^k#XsIT&lz>V&$B(y3yf50zk0qrmVPkDJ;D
z)aJfSueO(qy-Tm;DSvO?zU_VD@5>GSE3eZky%6s8{v)1j;Xbp5b-sTKGmUg^k;QdT
zoMDqEp-Wc?Invlu6B7cAFv9d+@SyUw$V|Dnl}4mHhc1w>UN`(IPIY$G))G0G<_lv(Ilg^=;>2k
zBP>GtQe>>(%rf_yW8l*L*fr_s%h8E#eNWtD-njur2+t^nXZ);_k$+yqrO_d@lADqo
zmnuwp1fg{`Z_!g78n^s*)i8{y+1i_;?)S-$zt$M_zKOx8az_*%|K;kYot`JH5>Ma<0_%wJiPT`aM*r2eC%fy2DD|-wIe9OcY2LF`WOP4QQaV^R
zbW-7byT$sbpgBXxXdP{OS>G)o74RPza$R04ZhVFC=Jv7kh%%;HlZj6A3}Fk8CsEXV
zdF6sfYcc&=VYoo2Qi_eMg7muXQ-)UuJQe7HTJN{^nxSocNSu!y`Nf6nlb}SdSW8CE
zX>vDwtg!9*&=AWf|A5=2!_e&3y?(F5U&1oR4JAa!OkXE&oIexkyHml*zS8>5Ct>TD
zAZ7V+R(b!|+WKVdPs@9~lhtCyuU`n=l5M7kx7MKdNN@X=!;(S=
zZ|KacYQl@_Th!c^vh@e2OKzK_#g|Cp{qt~Jl;nOplb;7WPkbGnW`)zTkO
z%e>^JBPGwy)IN#g>^W8k+;6nPVXG}t>7!3RRxF?SU9^eyQp+t-Yo&i%;pjjo`L)nd
zW~K{YtQMdDW!zzvFd&}KZeE^z!&g6X&&=UmpeDx+l^>RVTHPN155BLcBf0Y`SXsWUYSK@-RjUQRiU(m
z9wna}sggyqR202Y4D=Eb2Sb`qsP3nZo8{^^YLV`|f%RDzMDrOKzY=UQ5|jGk=2(0D
zTTyy*cM>9p#tOPXq0Sqr5<%Wv(J^h{ZpJ{TG(P)hSbIr@pSqWmM!uHMfBcyx=MMAP
zpjA~9QSF+2y&fKBC#3UhG<32gSuw)uKHx;LOgK@Puz#>sR(H(M|0^rw>qRy?%0?lz
znmOdW?|T1<#|5in9dU^d
zCza{Y!^}>?IG=}lvCusCnvAQb4VnD(KNqFhU*#=^UR=F8dWX*8^W4Vma;x-`$%sri
zi-%3Vm1nsZ^zzn4mhI<72OjU%I%VZv%Q|GT6*kABge|xb(jMIYFhqUqF}wBw4ey8c
zOTBMS9v#cHe!;1oMm~7m!lP!@x+ad)P`xWx99g@GIIcZ}dbFeE@ig#7uhnj{b7b)F
zxo>nLqj}%I*&K2IT2G-hj1^jg;-%)Q8`*=ggwckoWLV#CWk}0%w_S00ZxA9b7Jo1&aba_
zsgT!|mjyWamS<4aJZ(Wum_I1bcxB-cf#8mJq#o3xC$s%rbZfaX-8@KYi!tP8dDo~A
zJy}%AOxJDm#If&&+}Jl7#SIPu5CRD(O=B;u1!o<;k7iVrRtkeaiGnWeoW=e?Tnx
znnjC8ii*D}lQg$D4Douf85(qMXe~<9xV+(+)1_`Gd#hCo*__&Z@ml5U=2kal3k!yLabSL)_sidTuVzc_2(thjgLUw#}=
zdETsg4mh7+;q3c4J;Q>R+bzVzJ@Aow&PJ)dN~3r9T*+aT$kz+WF`HI_2Sz5Mqce
z{G9e_=7?95EX?HPi4|r?TtB50sjK7B-h~xmupOx3`(u$yii0BACR9%EZE}_Q&hGC2
zd6j`}6Nl1~-xcF1t`qIIeWY1?X+PYhdAWy(+$S<-zY4|;`HzVfSuCrXG7aVvZ1v$O
zq&MPo2$DH*As8p9!NzXGPY%XG#x^}YKj+QN-g6|aYYTB)!77|XD5KukU=={jBCH}J
zLQd#is{QO;@y_x2-K!d0m@gJTa)c{5=iEQ%F|kMms5_tIv-zi_BbPU%jNW6%=f^hr
ze%*-dJgJ7AzbKA5aKCb|*2huc#EbORVoY)%rdcXW#KLxbZd+z$`-IF0GiWpdRREZU$9zC9c*gyNk#(CZVheAUhwmfpIXMItDJljRchlw&vCsjI&2
zSJD-{U;xol>CesQaRjvPCI+%*vvw|Jb{A9ztA7{U4ioo<)@NF3U7AArLeh%y!fF2g
zlhXQgICPd=_M^;?8?p{Rut~lMnML2zF=vx@=xTURJf>Nny+rNu@3I4LzpHTnzE=sG
z0QiW@Kk$L_#!@&{&l~ZdM2Wff(D96_VkY|@)leE1IyU~;#Q3N_jRzjG=XX~5^S}>g
zEE|D)RZJaE61Z8b{rVP$K52lUj7wlU`4ijxf!wf5pT$CRk^ofY@P+Q!0;K(7}{ko;c9t!)%#6
zNvg2fo)gAPji~1_pvSGxp<3M-B>IsHWiZsuZu2S>DXmvy;bqMeM&lPD=S+H;h2W{t
zOq;yh!21WatO1TA|jto&GUsoW$diZ(r4uDlB#*1hf(8Y5A4
zI{&`o(CEjluH^2~qH1DJ4AY2@TXIqL2=zII-&dS|!wM7?oC
z6gXAM#uFp7UTvzc8i@u0D5BJ#vQeA%pl|PQfx!(cC*UZ&Da$@vU7I6
zSK&YJo~+~FjLvvkP-K=WyLn$Pelchl!^|`=_;WJ=lMYKV?ph)
zT#+1$pG3;Nb^n$2FEuzhNu6i9hMFkoK7>F*!e(PB@x2=WFqqA^@XZgMPLo-NO
zPl~yJtwPg1H~tf1xt!I8-G;n)T33l^`fwC-t%dHkP2{4sXi@`J)T(N31*P5apwA-~
zkS-^tSrHmLkejbc*PIKq;JMRXjZM?KMiT{7AhGV8Ykst{H=Ujb`yWPA+%O60WXOm#
z*RTEc;C4xKC}s6y5S2kd-M3FvqA9@fOSG+yvaOiDHDHh%5-U|)c-}tO%g#!e?g@mH
z7UoS+Yw}&6B#dVjLJt8pDHym}mfZ6S+iE=?9vv?!%J7VyWc=|Dj
zuMV(vK!+Onc2P#^cRinb*+*+s>+K99o77{N5Gp#U<@qJw^p%j+C11LuN9H=q{cv$a*A>dRQ8653UuKl$bH_8phOmfuyR1r}SjhUnEo3dlLLR`r
zGH$pY9)orUZXbgd_it2Jl%^endPn-_7?*aZ_NT~gQUNtRfR_0$wlav?N!NQoOoBWY
zK{C`kRqD*zPlQZJ;Q(P3C7k9ab0sKeI2C>^g5(yp#T>J3CiT$L{O#!@P?-q5CEN?q
z*<-6DzZ3cWW-l(AG%4Sb?69g{Nn2iPETVYok^&hg6cluiW*F`!1q!&lXXa?oq8;9E
zqnFy}$h%`|E#myYUiU+QC}@O-u_v(;lx~Hu5}wLETK=WNeoaX>{wuPfi<8Pr=ESa=
z*aK@{024+~Frn3NOqk*Cz$Yy#Nw$~4?@!=lp~Adx&+BH!=We7<<86A(rdwFM8Ucs*
z$0^?IlcIhmD%g0SIZXQ|$g_DLV>7!a{IJPgbme+;sq3~ox>vJxqhVfDtk;VF6zYyE
z|0$*ONsQj$FmEg$?=W3VxR)82MjA=b9MAg1P(xPCseHw%Ph+l?-^b^BAwfbvcP7eP
zDjqf}xFkO-KZCBJTEN@B;mMvy(m)4%njkg;rjd&q=aTsBwLT#R%%xtj*-`gmnpx$}
zy`cgP*KE+3CJxTzSrSB(6_fDZ9H}!H$>=P%!2_6KQBMr@wGRB6TJahGLVq;4xi3U;
z6r~7!>ip3B2O-+Bj;@avi=46>fhV_^r83UA7Pk%+3uJ_=
z$f>d!WMF&js8+Ex^>LnOgK4@uz}Pne9D2OOi?xzLOKp}DcX*T3EFifNZCPa1ZS73FF&vHc)Z
zSuev}TVy8J-i6(m_Y_TrzG
z8PMk=i`NW1w(%L)+pZ)(2o^?k%p+KENBdmV{|*&U2QGjkrleYLp4*lyC91&9Cq
z(FQddH&aeOy~ywl;Cn<0--`zL9@nXK$kA*OYv9R^Ou<&BUl^|J=X&(38i(2oXHUe0
zC2f`^^t>w6q0CeY*SFJf1(1(^>Gzh}ztv`Qm3&Bk&tUrP?NieziNC-acmaDqZW
z?(+e)WPv3MI7GkxzqXG4D6q(MG`aK@cW1(<$*~Ip|G~<
zPtKK~uzWTnIysO>wew%k>}wck4B^f!{0F%HsGb;D`K3o}UMzD~1^f^&dKm)7EMH{*
zwUVWj62OLIb%~KKzp9|*HOVe&CH-B?TR$~QsYZd}rChzM_OE6E=K5L^`#t0A1GU*x
zW^AP<4*QDs89CE;kk*KEkE>1#4mg49$cuX*-=M3V(U{6-Lw|Cib&~KHWfR4GDP*AQ
zgFAy8)?#I(SQ#+Utlo%fg#`Ohz~l#^VXuu%Xg*Bly4+fngZ_p9F;2M+_HQ3nw)$xT
zsbG28A7)xfQA(O=&e=2;S6f(rzs~-|UECRwa?dGxO+F++?~T`0Jtk3ILu_)^BT-Vv
zbiziRe1Xsv(3yKF@sk^A1<~GaN5LhkOr|Euu~pzS+Ek^kG(T~I;oww8UZ$10yqD
z!^443I)OIiI1K7`=Pn2|8tLlS!PkFO7r{FiABv;@!8>77&fOxQOZCu9T?rD-|2V#B
z+Aorqy*|^5g^PcYpnIZw5&|5JyY;2`j<>2QXBtV-2ZRGR%!`OLJrSX0Z_)TWxf?)o
zvixXvKq|-$e^i%Os5_hVd5EO%WGGJPB3?p*j~aY`>&Kzl1>#5{N6%ha8aQ7=2QX~_
zWxVj4GHzkMi+whRsv*~A-181EtP2C1p@M?vH^mEjB6l<_f++6e&~Jlr7C=Dh7a6}?
zxVt^F4E}z|VNwSE58*{Fc6Wcu6Zc*KXloJ-f_3Pxf?@GpM#Ac3=@U;Za$28`32UdJ
zq<@wV0)PLlRI$t_Wbc@?MH@
zv?EB|OsfW3M%h^~&9!CqN>Q?u9t?;E$0GO~rWq2NRtNNG0vPwqsxyt#l@;6YehjVL
z5f&(rJI|6Q{41@n@Vf|-7>wLyt$SNeog86dz?xYC$tx*QujGoR9%JJL08A>Rn`5mg
z)uJ!`6tIBD8P58}_j>O1FhzaC(VUSZ^EKQx%>tz6q6e07)_b9#X7UDO!x%Q%@bVWHCAUE0pZ3Xm*HK$|H
zSAg8-I5(^Of>RQ^(R2|Q0tMiX@$BQN7m@Em)F_<20&cO4dhL1h!KXW(fj6uwMsGfv
z+9!QM%?DI21Yv6=ftiDqWxWX>w%f5#>`R#lPN_%sIj?kwvAQ%g=%8qE5GpweTzw#s
z!{(Rjkn_H~$O6~8ZE6sk4souVhR{cP>|VnaKR1lQd{pm~E+NY_%wa8WT`
zDMU}}MNy!VDotRj3`YDyDcxxG&oh3y;ZAm#ZIj}A4y%xEz(q?^B0Pr5$jNR&TX?u+
zS$;}{(oDQI7y62esS`|JDNZxbg+9r&B-Uerk8C`UAW6aYu)i+Bfdt)39I5(<^$F3Z
z7-`1_?If8V1K2)Bhd(ElD}L$TqXU!rOuEc^2xXr^H}iDkC8qu%DfU2)C7dRt^!idV
zDcqV8y*mB!{{g0l9y9tTCnuG{DXN+Ew`vxc>qsaYk0)OK*`n%p46;}45?>*T-!Hhx
zIPW)pNSp?L2N>8f=*~q#m^mKM53o?<|G%HC&0Mn~&lRs3uYpV}yghi>C*(ILRpAaG
zcab)Cl8Y8I?{v4m+k_^!O>9%xWWR3gwUJ$||7ucF1qgPeI6n`6@v-pPgcvkNuo(ePqw$dy933^sA#T#}jP9$v#
zB$E~FKRVK9ZHOSPE=HbsIBvxS6sr)B5G5TBS%Ad_`$uRF>j#dM$H#Chw8y0k*2PIT
u1#}kVH|EITo~#%TiQ$&wkU}F+ODHk~JaKI-eAy2i?IDijvxJHtPyP!%R%>AZ
literal 0
HcmV?d00001
diff --git a/components/UserHeader.js b/components/UserHeader.js
new file mode 100644
index 0000000..d18f1d2
--- /dev/null
+++ b/components/UserHeader.js
@@ -0,0 +1,82 @@
+import React, { useEffect, useState } from 'react';
+import { View, Text, Image, StyleSheet, TouchableOpacity } from 'react-native';
+import { supabase } from '../lib/supabase';
+import { Ionicons } from '@expo/vector-icons';
+
+const fallbackAvatar = require('../assets/avatar.jpg');
+
+const UserHeader = () => {
+ const [user, setUser] = useState(null);
+
+ useEffect(() => {
+ const fetchUser = async () => {
+ const { data } = await supabase.auth.getUser();
+ if (data?.user) {
+ const { user } = data;
+ const displayName =
+ user.user_metadata?.full_name ||
+ user.user_metadata?.name ||
+ user.email;
+ const avatar =
+ user.user_metadata?.avatar_url ||
+ user.user_metadata?.picture ||
+ null;
+ setUser({
+ name: displayName,
+ avatar,
+ });
+ }
+ };
+ fetchUser();
+ }, []);
+
+ return (
+
+
+
+ Hey, {user?.name || 'User'}
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ header: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#fff',
+ margin: 10,
+ marginTop: 40,
+ padding: 16,
+ borderRadius: 16,
+ shadowColor: '#000',
+ shadowOpacity: 0.05,
+ shadowRadius: 8,
+ elevation: 2,
+ justifyContent: 'space-between',
+ },
+ avatar: {
+ width: 40,
+ height: 40,
+ borderRadius: 12,
+ marginRight: 16,
+ },
+ greeting: {
+ flex: 1,
+ fontSize: 18,
+ fontWeight: '500',
+ color: '#333',
+ textAlign: 'center',
+ },
+ name: {
+ fontWeight: 'bold',
+ },
+});
+
+export default UserHeader;
\ No newline at end of file
diff --git a/screens/HomeScreen.js b/screens/HomeScreen.js
index 0831cb0..81648e9 100644
--- a/screens/HomeScreen.js
+++ b/screens/HomeScreen.js
@@ -4,6 +4,7 @@ import { useNavigation } from '@react-navigation/native';
import { supabase } from '../lib/supabase';
import * as Location from 'expo-location';
import haversine from 'haversine-distance';
+import UserHeader from '../components/UserHeader';
const HomeScreen = () => {
const [from, setFrom] = useState('');
@@ -102,6 +103,7 @@ const HomeScreen = () => {
return (
+
{
const handleLogout = () => {
@@ -23,6 +24,7 @@ const ProfileScreen = ({ navigation }) => {
return (
+
Profile Screen
{}}>
From 0c641abaca9245caddcf988a1c02cd26f14367e8 Mon Sep 17 00:00:00 2001
From: ModiseKgosi
Date: Fri, 9 May 2025 10:28:53 +0200
Subject: [PATCH 12/13] sign up
---
screens/LoginScreen.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/screens/LoginScreen.js b/screens/LoginScreen.js
index 9fcd1d8..6b33e07 100644
--- a/screens/LoginScreen.js
+++ b/screens/LoginScreen.js
@@ -140,7 +140,7 @@ const LoginScreen = () => {
Sign In
- I'm New
+ Sign Up
From 005482a95b74447fff0a261da953c2327af3b2b5 Mon Sep 17 00:00:00 2001
From: Twanda Mudonhi <161071449+Tawanda21@users.noreply.github.com>
Date: Tue, 13 May 2025 14:33:31 +0200
Subject: [PATCH 13/13] MostUsedScreen and ProfileScreen updated
---
components/UserHeader.js | 29 +++--
navigation/AppNavigator.js | 9 +-
screens/MostUsedScreen.js | 218 ++++++++++++++++++++++++++++++++
screens/ProfileScreen.js | 251 ++++++++++++++++++++++++++++++++-----
4 files changed, 461 insertions(+), 46 deletions(-)
create mode 100644 screens/MostUsedScreen.js
diff --git a/components/UserHeader.js b/components/UserHeader.js
index d18f1d2..ad4ecbd 100644
--- a/components/UserHeader.js
+++ b/components/UserHeader.js
@@ -1,11 +1,10 @@
import React, { useEffect, useState } from 'react';
-import { View, Text, Image, StyleSheet, TouchableOpacity } from 'react-native';
+import { View, Text, Image, StyleSheet } from 'react-native';
import { supabase } from '../lib/supabase';
-import { Ionicons } from '@expo/vector-icons';
const fallbackAvatar = require('../assets/avatar.jpg');
-const UserHeader = () => {
+const UserHeader = ({ minimal = false }) => {
const [user, setUser] = useState(null);
useEffect(() => {
@@ -30,6 +29,16 @@ const UserHeader = () => {
fetchUser();
}, []);
+ if (minimal) {
+ // Render only the profile picture
+ return (
+
+ );
+ }
+
return (
{
Hey, {user?.name || 'User'}
-
-
-
);
};
@@ -53,8 +59,8 @@ const styles = StyleSheet.create({
backgroundColor: '#fff',
margin: 10,
marginTop: 40,
- padding: 16,
- borderRadius: 16,
+ padding: 10,
+ borderRadius: 50,
shadowColor: '#000',
shadowOpacity: 0.05,
shadowRadius: 8,
@@ -64,9 +70,14 @@ const styles = StyleSheet.create({
avatar: {
width: 40,
height: 40,
- borderRadius: 12,
+ borderRadius: 50,
marginRight: 16,
},
+ avatarLarge: {
+ width: 120,
+ height: 120,
+ borderRadius: 60,
+ },
greeting: {
flex: 1,
fontSize: 18,
diff --git a/navigation/AppNavigator.js b/navigation/AppNavigator.js
index 7f6c7fe..198afb6 100644
--- a/navigation/AppNavigator.js
+++ b/navigation/AppNavigator.js
@@ -6,6 +6,7 @@ import { Ionicons } from '@expo/vector-icons';
import { Animated } from 'react-native';
import { CardStyleInterpolators } from '@react-navigation/stack';
+
// Auth Screens
import SplashScreen from '../screens/SplashScreen';
import LoginScreen from '../screens/LoginScreen';
@@ -15,7 +16,7 @@ import HomeScreen from '../screens/HomeScreen';
import MapViewScreen from '../screens/MapViewScreen';
import BusStopScreen from '../screens/BusStopScreen';
import TransportInfoScreen from '../screens/TransportInfoScreen';
-import FavoritesScreen from '../screens/FavoritesScreen';
+import MostUsedScreen from '../screens/MostUsedScreen';
import ProfileScreen from '../screens/ProfileScreen';
const Tab = createBottomTabNavigator();
@@ -40,8 +41,8 @@ const MainTabNavigator = () => {
iconName = focused ? 'bus' : 'bus-outline';
} else if (route.name === 'Transport') {
iconName = focused ? 'information-circle' : 'information-circle-outline';
- } else if (route.name === 'Favorites') {
- iconName = focused ? 'heart' : 'heart-outline';
+ } else if (route.name === 'Most Used') {
+ iconName = focused ? 'star' : 'star-outline';
} else if (route.name === 'Profile') {
iconName = focused ? 'person' : 'person-outline';
}
@@ -76,7 +77,7 @@ const MainTabNavigator = () => {
-
+