From d93870ce99440cabd5f124e73586f43779138527 Mon Sep 17 00:00:00 2001 From: HashMapsData2Value <83883690+HashMapsData2Value@users.noreply.github.com> Date: Wed, 22 Jan 2025 01:13:29 +0300 Subject: [PATCH 1/5] feat: set fee and expose fee as part of post --- src/components/app/Compose.tsx | 56 +++++++++++++++----------------- src/components/app/Post/Post.tsx | 19 ++++++----- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/components/app/Compose.tsx b/src/components/app/Compose.tsx index cc5a551..5da29df 100644 --- a/src/components/app/Compose.tsx +++ b/src/components/app/Compose.tsx @@ -49,35 +49,11 @@ const Compose = ({ const maxMessageLength = 800; const [topicName, setTopicName] = useState(""); const maxTopicLength = 60; + const [fee, setFee] = useState(0.001); const [isSending, setIsSending] = useState(false); const activeHandle = activeAddress ? handles[activeAddress] || "" : ""; - /** - * As the longest fixed part of a message is a reply: - * `ARC00-0;r;0000000000000000000000000000000000000000000000000000;;` (64 characters) - * - * ..and the longest NFD (including segment) is: - * `{27}.{27}.algo` (60 characters*) - * - * So, that's: - * ARC00-0;r;0000000000000000000000000000000000000000000000000000;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; (124 characters) - * - * ...leaving 900 for a message. - * - * I figure we'd want media attachment's at some point - * (common IPFS CID lengths are between 46 [v0] to 55 [v1, base58+sha256]), - * and to give the message format space for extensions, - * let's settle on 800 characters for a message. - * - * So that's: - * - * 60 characters max for a handle - * 800 characters max for a message - * - * *See [Fisherman's Discord post](https://discord.com/channels/925410112368156732/925410112951160879/1190400846547144754)) - */ - const sendMessage = async () => { if (!activeAddress) throw new Error("No active account"); if ( @@ -117,6 +93,9 @@ const Compose = ({ const transactionComposer = new algosdk.AtomicTransactionComposer(); const suggestedParams = await algodClient.getTransactionParams().do(); + + suggestedParams.flatFee = true; + suggestedParams.fee = fee*1_000_000; const transaction = algosdk.makePaymentTxnWithSuggestedParamsFromObject({ from: activeAddress, @@ -196,9 +175,6 @@ const Compose = ({ } }} /> - {/* - {maxTopicLength - topicName.length}/{maxTopicLength} - */} )} @@ -260,6 +236,28 @@ const Compose = ({ +
wmguZ20DPRL9ZCl6IclNGjwtTPvn&H zsvb65KJcg~CZV^@wgYnN4IPq@2$`)RD#;7J1?0JagQEuziS1)cvQ>eA4UCQ+6i3@u zfiD1lK9ChoRu~_XFeGk7jO{R5^@IFvAS>Dcq+b8%gdrmb+iXu@H5+G$qGWMFKc==i<~F(YCICnoGf_h>*ZBUblIT2xf_cW7*UbRz5= zG=^TV*@j~j;fmzM{xO5uN;k##2hwj-P>um%`U3h9-ZmRV$^Jl&%VQwR-&Z)Ye{Apm z(2Gro85IK@SKPERDY> &hBS{C@XiUyXE zhCE--IJkob#{l89 x1f?^XA!E@LX6XIff!J!W-%6|2Qob{yo%l!MOhkof9AP1~Hko~`=>VFpqJ}~*H zOeCkPj8c`Pqfw9PpKah-aFcP_-A|iuJaR7 }Sz zD8Er%@@IiX!0!gqRSi)u_ ~bU-AtO;JAOz)!pH=h4xTmTM;V%A zS7l=p!mIa+O|+eCA%_sF@5qEWo2_$8$?pfU92S+{(P*PzD=B{sNT0U?(&yIdQcv=^ zk|U6y)2kTsJc=bfY9w9%Z5vtLXW(hZ(RMalY2YegDd0pPmWkwE3L5}Rg0BcH0n80# z#6D~*hwLMT2Y`&s)e5HpIU-|#`8bqAkYFr?s-d{|s*KELo#gB-qvSf!9J0<5f5ecX zg5-NZ_A~cuawz{mKIK0E+09!(##T&RT ?{3Jwx7gUU_tH%iSe9{Hd}Lef)=+%IC}#}M8_q@BFe1;&OOK(U=ctzFf6|J zkUnV4cYqwof Yq3$&H*(#rxcuoVN6Os4*}iVZ@BE$9`GENyegjR zj*#B^NtfPop%EH-d8C|A^MUm88^~wH_n^;tv>9^jXUPS}$YC7=o^f*%Jm+N}@I`F{ zG0)8eaGdN}IFO1Z6}lt87 _BHAJyi?( F>v(Kc_f&cTzVb|E0waT|~^96v?c)D1|RYQ7;y zK15+l$myhdKzhISRN1$OuS@w|<5*s&USx*xYu=JcRtNiPvawfyY-I2(IU;9)tgP3N zkqI#vPHSSdhMbLGpDnvm`%TGj0dmD!2&CiU=g5(X0W$6j0clipOhOQ*e3H$YvFGPX z1D@Z-tWEm)70X&OtQlU)kRf3$Jz+4AhSWrd=<8k!WNZh5XNU3tOWKU0`HLt0F61hF z8|aIy6N=viWYJl`lED7Ja=<3QQoukZ&j~CG{_Y|<*r$Ph;5RCq4rKWOif;vEJE1@f zY*KOsB 5#MER=tx@9_A$_$Hj~oOoeva zWWgp1
pbh-nLX z9_UX^lQ;&*fh)3;Q_xu9Sv={9nM8mOFk7%K-X-I3GLU_44^#33hsVcq0@#KQA3T~{ zKyM{)1cVvMHGym@SYg>c()8j$o?Oa8PSd@CT(k2_3{38oF8k0KNX0%eF+*|g=YW`s z)`q~1pqO5FpE0IjN!@?Hv7}(hB<09tOBYp`MvOQpjUEVOqdkB$u93o>hh%`_-aI-k zx=+k{@bt?(AUlolGMCj6v57HA+Ug#Wwk y|1q#A@HCJO?FZ7Z9YA^oOQKni|0y|jGfv8>c^Sz1HbGAPgqT4iV&ePYAc%YP zUZZWc9A{)t`^3hZ_w7@`)0+u#(Fy%gsRs&{0^b*D;yY($Ptt&_I0Z=k*2t%!h0e){ zvY*>kyzrN~3w(3((60E`4wXE#yhgccuWy~bvy{JwR?Z0UcWJ|nSo}R`r24yb&2HTH zkJ6k*K!8gdVZ;Ww92f02TTRsHZlv{h>W&=7{eUQKoDmS{(!Mfc@%LjR6@R0Qj6j!T zmWRz&9m;N0b{qxQ$}IXQ(5dHh7@I0ZY3+=RN-p~X7+cHOI;@rl60*cFf2X4$oXEyd zKG3PPFfuB;*jA9saR@mLkdwm*3356#L`6ez`Hi$=5k>~`Z$JX)Bx`KhULQ`bWdsFA zYDq?Fu*-20JX_HXSmLlFR_aMzaE-y$vPx>N8>v-Xj$M$ofy~`(%?%TTZOdLY1{amd zO;KD9)~uZ{GOD_CxBNz6NR;L>VnbYxX_$R%OgDywIJI*|24wlMIIx?#5fb2ZGzBMJ z@TjWOF%=xm$!UayI31V4v1z;Us8fUowtN=LY4))bxLU@8fJnyzB}a9y!W*G3&EE*9 z?s9a+B1KE>rZ<-usnuQDH%12j`WXRXF0F$R8|HFsC}gwMftJR;YLAT!LZw70}^*v!~kB~lkfi~-?M_KOfi7!Uj-wO}K|>C!eC0TC|k zHzO8*LyXi2mm?WrNn Ztb^gT23!-f4wmACW*sP18FeTwr$L{t2UiVwa`>-ia;(LHEwPcAN3JV4wk?Nx z1-J;4qa|02)LJeL4zA^LB>2i43 je{e!62|?&D95Z4R$xD> z< o!7(ar z=JYrOj%_-OM~LR%6o+D!oQ@hesL(TVEE9}?`Yt_3Ib%TmD6Nx`THob3Tn>>01#`yR zJ<7v%#)C?cT4y7+fy*%id@yn~;}KSey^6zRz+C&%2x#ci0*%;)F8j6$Hd~|-6cDL> zZ)89kWCS#FX# ~@Xv8*lISxXGr4t=`)Fwg; zFzz>w!nzpH#AQzl!1iH0XdLPI9w~OkW(*5(+A9a579*&7q!wocG<7+?1kYUb1Ho9O zk`)4Qf;Qa9XzJ4T8v)JCDbdX3XkXc83xjq6Bc!HNpI+IVL&qSjY6OKuIvyd_$!sbu z0_#H%7m~U-m(;-g#269GFSfrysC~i(oIj7qIaB}IR*H(aQY37CWkMID4 zf9zLdr@bV!ni>zVp!YLk+q&$JC6C1~3Vy6_>S3nXCxUZP&v8`A;Wf-qH!L (t;t4ho304@IiFY0f&Ppod2GMtFc}Z!&P3qcZ&2&a8sgOaRwLD#AhU zf#dX$GtDbfhLs%a?%>#S R)eGA;4m s!q-1~7rbT#wL2X=} znme^WjMT0!dt=xuJG~Jp+365;B?6;N*O+UUmT07Qb7}L84E#M}1ax<4KNzvyU5?sV z+|_OZlZJrf6p-8J79*gC%MsRC%4}xr4FyMiEG}5Y)+i2Rh`9U^9D)%;gSA}G)x;Rk zGs;m5yP6bo`p1K#QD`8*scka?qFs)!AVXxRMoSy1(Jrm0krC~(8%^0YoC@q8Ar)k7 z?G~wd8>ziqjuwa`OjoW@2&{36Ls#oK9b3RLilvEPfMcwhCfdE4bLD(cC(_;wsRrgM z@Fr5U5c)No_V>ZnG*2RVTF3x3S93=@aJ1Y!Iy&A2$1>(J=C}&3m01JBwLGRhTf}i- zXM_hBX2~c&0ghdjX8!?>zVtAIbPUv}Df7-EiNWS^2OZ4ST8=w7OxkAP*g zK)%c!u*v28t?M20g R$1HrKm<`QU61&0;2MJ*2`FwhWl*1rZDuwW=ofXkYfSHNY?OGl~B*|{#@ zFv~bd7?zdbI5}}lgY$gRON1Vb;sEvqM@__i*9h%3Bd~Im<4efkZ^j+wLbwq-)a6*) z#oAG5*B{_y@Q`Z`FV-~cAU6eExXGnOJM9O^89|k?-6F-U2EozIX)o6eHgQF?FG8x9 zF{pK<_QXhy$Hd17(IR(q9i0dc(MW4Ck@NMCCkXTlb2b3u%sk1B02cucbFG`xu?-wU zSneOU!O^Qyvr@ENOC>iL9F{nhw;dckF7v(thY7B@Fhp4vH{luX3^?8^ndS66y^R4Q zqV!fK*yr{(`#K`haS17opsc-9pKN6u%fZ#p%)1Q^ai%mo#NbnoOztW;X=6yV(^0su z&4%?2n&i5G!=&dN$Ba({$FVT)u hsWP}}vfwACZ8IIo>a8*$TqmPC6 zXK?fm{Qrv6(Z9d+qseKzjEpfZ$79G4=Zv5rr@eWsxiVtBXCu|vDyiKxGRC?b6$fMs zdPfYnT4qVMv>F`aBfmM}odd0@0}Jib!8PMS%>DsVjf|l1NQZZvw5*^R)xE*Vx_IZh z5*#BEKEYx6I=DKfCG4N~Ad6$)JA+dmg1^>- 6}-vh_LO*m^EwSX-x7!APCx zvQHSwrC{sCNXHqZlz(8i+b|hBxr|5Eo%VX*>QW2$(ixL*?+u=-0ctuL;U3R(95U_Q zkcu=OOp0_YMk-hu+R{AMPj=axCeW=sa2iOl<5=TyZ*>_Qr;>Siag<1uVGj;durD|+ z4)T~&cDS6Zk{bbz2IF+(?{w@0#}(Y<^8N~r;oxS&Lv#`SK@3leWX?K=5FU8X# zZUJq%f0rC3_nd;}a@G@ES2OR?{0I*)G{;=c?0H5rItI OVBdYRRh zOop4yR4=4D8V_dIaz_GF0zGt2q-g7Gm)6GQe+J*qOf{WkP8R6QLCVzDA5Sti&2qWF z4!4;)OOZ0CmZRC^%!yn#!W~R|W6< `8fiv&k>;W@OKj5Bk2vW^V3sBm=4_qtb!L(ZL zGwFl}3taZBs+U97F;n#iaP^F!?veWVS;l~cQTA)IIMQ3&M> <&SdOJAlKj z?BZG;NYt0*TRI)zgKM72wR_Xb 6&n-9=XEUv^vUOYZXIm>*`4R45V6^sVkYO zGOI1wU^5l8p_V%mc<6@$?rY2lL#jn)YC&e|)67)4wU%C7X6o(C)bE+82J1KrOj9yb zmoigD*IT(=k!oP-t;$S&k(u(}VCBYHDaS#iYMJAWLjsO*85>;==SG{&30Z#L5jqBg z>j4gjij7Xk$Kb-i;rU4~r=wdc-d_VJkGvPbb;#t(ZIY3M!yq>DdEmGf;XbaG({T$N z;}x4VIRDLZw#cn}6gbWSEVMWP?*m6oa1))5Vq4^LWzH78?G__&bChEZgzN$yR$y7V z39g!1^)PH?1-8oI#`*@X7Pw}}1BZLMH^9*(+3bhl8kn`D)s67jW*ww>2h$atY5)(m z7Lzk~-Vc%D3TZw|)GKT^282X8dTp0Q@kkM8+2!Em=1ki@0T+$}@}aKh4tbi9=e?oe zTFE?Uz6*|;@?ou>W^L-Mr6#yKrY0R^D9-GK{R42gyX{oVW2faQt}>m#ah1W58f*D1 za2(%!<`MD)IF4v8b3M{_$#SNq-eH$ zhZGxu&2ZW^a1pW$oK|2rweZBp(Ge;78G(THa|t;11=iz?`my5V1K*%MnW2e(#)7LU zHNmX~N53K{>p1OqsA+87S4&Gb2JDV<#HY)F!LlCV#B;@r-7d$EkcC?%9D#eYhj9;Z z%rno__J!c0%#+{;NJUt3NA7)@qX(C^04FV=gJ-BbL>78=RB@OVIFkJYt{Q4VA8`l^ z-!J=*TS=UD$ADuCG6r{odrfliMxz6kjeI0G7MzSvmOGL?Pj^3P1n!S=OgRWAqquyk zavmHF#QgKe=Te7^`}?ExHiwMB15x&~hj>KbtzG%U(f|ZukW=q=*tmZnN?&!@2s{|& zc!az*r~$Jr!l^eqVr)7XrH?sc+&>s)KYi3ZksYk%evDi7gM*Rwaha(Pk-|v_vcTh3 zDjBKvrtCvA6?DXfkGiNc<^-BCQ|FLs!IY!uNx2|nd|`aslg9lcQI6>la=zgc0IUTq zPRS<%lG_8WeP&*+)6x?%uMIc`nR&KwEC _8RH83Rs6>4VQ1n@&b)Ta1j8E (-Y6Rky9X0TcK}7h>yoltn zo|=fIkRR6CdV*L_FA%Tn$aeaI+(5Brbjk$&nu32tRy+{IiiUt#Q9OuOcGQfPr;8cm zPV*Rz*OvJQ*Nc!{7y%-V1o0xWrO{+?5y_7wgNsQ0aSF#PoB-sN4bApVfgKsIo7oas z!DJ9Cegi~)Du@@6^64PTXMlKRM-TAxO{qlc;kad9MDh#p3XWOPA}~2YIGLDNcBBti zfmmR*!Zko%FTxy F5dhaPcA`QNz+DAfOFN5sa6%Z@D4x+&yEB*$M7m@k5LA-98e L&6<& zR|$x;>?_5aXv}`c&m5?)m6XU*-zok@$Yvg@e4+#Ni{gpQ|5foXfz3=+D$=~)Rlye_ zgWnysv;R32<^r-D-~F-~ ZCK>Z9 z1L=mUKwd wwB9GI>zpAtfg=>`p7*=zk%PG46tlgELB)9Vt4iA1^R&JFq8u_kOPyDV1pq_k;uBMDV|6^6i88+ zLZ^~P0BKkxkO5W)NJH8H*+56d_XV=yAwcTK16glU0un4Z3P?j}5c$bUVG0ocY*YD1 zA(PXUe5R6TM~Y_S4;y$BNRP}{yunOdM97nDLMbd&8QGBw;07gs5i%=9<^K~>Ws}k) z(y+}YV*Ix#!B(X}q>K2zG;x=bXGgkrALQ)WA*FXz>19WXj^hvUB>u46IUwu3Ksn>@ zq7u9hq-7rfc@e32Mai!!Ig!Ei1(0L LBh1G zu~KLTWY1nvd`BQJB4Z*N$YAXcq$h?0+0aNJx8x*X9^gzM^%tr9#XuUe9Ow<);|Bk; z;9dw=;Sq(Wfpq0LAPZas(sh@ByogMGfIrl`s^r;``qv<*hrR^TgWmuP0iOa{uX_?o zQ_&8jr3HYzd#M2A1{DEhPZ|K(vlc)a+zQBzr4x{b_W-h NN$HztJh)QP z$aB?$#2wTYta6F0y^7+qBj;b3lK&I3KBuZDLSYSsHC6d+m}E8>i3}F3trVk_B9R8U zfE?CditnxRiJX!A?mVv-A-g{q`E<)LrI&>&@F}1H2|!L=?lfGhXQ=}J7s!syW eGT%mX(_17t$$o%z+&yK8TBjjAFcLJ%BuJ9lkTuDsOHAjFfa7<+o z$)8X>lD0aE=+Xut<~IWI%8oRsF^Jd%#EVG2sY2eiVg@JKdLqG!dVzRlM>f Ov`g+kLFRqZ3 z^KRw8M_=^D|IQ;XtDgTJebE!ypLCJ`@6i{%@ZY1a|KC0OD*dmIzIN^VCeNg#fmNpF z{Yrl`I_8u4x35m?DpvLw@BdYevwqt;4FBxx;71;xT)cbd_S=JZ-8iv-*35cW4@OsR z@XgQrCJhU{cPFv CW>K0As96bf{!S8U6dXMfqy&%Q-(n> zMO>!fTD+D|gvV>mw5eiZJOtAcpm8@I8q-Bc0t69>5G+i9V5Yc3!95BZCPFY<%u9q| z@o)$pQ!q!=9S%X05fH2&4#7O}h=L~+bQl4FAy$uoAY~*3_K^@Q6m3UB&}kF|yD1Pt z8wG*KXb56PLGYGHqhK!uMMgugR78)4p#K;MPEoL2c#eU aSQ0fLAm z2o_F&V6(VG!95BZCPA=O%u9k`aWVvtDcCORCPUC c==3@SyD3N)+UpQ_OokxlbqMx}Gz#`oP-HR$2SoH_2>MTf;1mUi zgy$3pyxxFd_!J0^h+`C-rJ(#95F8W3-hg1#R0uwz;DjhW6$1Zh5KNg0!6|W>f@>6n zO@rW!m^clBY11LNOTjxLWI6;9Gay(v9fI@X4h8opXgC9c3u4|32o}$T;4uXkMctVY zG?@j#`k4@17LO=+LP3XF5PTq3&w?OjHU#$B5PT%s&emSlu835^RiV8JxF$Liu8TCn z$HFlO@QH{fd@A-4ZV1o0fSV$ga7!E`+!o&R0C&VN!e` ?8akJeLCg z6tRS-;ut`;>7w{Dt)s5#A|5D4Er+omErYRcqV#fD@4o_qDa#?Si^~*TqabVr1UbdT z6%b5Y3Bg?o93o^TJG=^lg)1S*E$&cokAjA)Ajm7`t%6|jYNQ@hkYChY4MCGN5UgJf zfv0#x!4nEPtbw4ASiJ^ Xp{Wm~xih>fta{~lk8zC6J0Rlg9jDoWil-~$JX)$ag1fx 1najz5F#E?@PvX6TOkM)tG7asvJC?JHVDE*+iehZ+77{P z3Y O!C4B* z?}VVP7`79FQM(}ch=Tf}^ezbe--ckyE(jWm%M@IrAna`j8jFc g}WhWF78lpkAjAKAZRJ(?SWu%Is}g?Xf5idL(pU|1nbiwXe%C3@PvX6dm(s5 ztlkSj%039}`yl8b+U`SucND3FSB178&`ESAbQWoZ*M#E$po@qmbQSvu-Gt{sKz9*K z=pl{~dJ6ADfM_ucAVwWVBOe_?BfUlG!w~o%fndsE2x7!#3a(KQb_9ZcV&V}9rX7Xg zE(Nh7 MG&upm`r{A`6OSl( zLP3WU5G07zCm={U34#421j9w!lQ4LMNF|IE+9~b4Hb7iBr5V~J5q( 6N@xJEeZtsmx`tq`=wN!RQ_Z|{I7-yVU)5l+htwpT= zUbc5!toa|B@*}zZ={K%vKDxvDuUcPC*FMpfx@#Y%FTbT#$z?pO=x>^GDMRxJh+1fV z6r0R~)_;~Z7BW0^H)Zid;^Oe1dD=cp*Y0cmG`;Eyn*P2f+MLteMV$v)C;NqssDfS0 zExWkoJI%v>cn4fWVSYEWvAGW*G&R|oN@i!$(I!3)PX1AN{-8B3V*TH4+556n4EjME zsE=L9RtK976D=O2s=23Cqdm0ry+3JvM~O@CYrS&y9LA2okt2lv5WSXgCF=H)wm+ZB zi#e^Kz;mK?R%|UM4$%uG@g+Hm_%t~Oh!@`tpo~upyePocPRaPWZ6#BJSCf>C<${!~ zy^`S*P=2-9ygDcuKZ&lYWPB+PZ6ulRI2~4>24hz-8|GU*+mx)6lJV1!c}mt<$@rN% zKg8$tnv(JJ^$WBdR~IGY>qnQAtgDjchwM{+o0nHNCFCn&)_XbKA;UlZZ=*JMCUEss zdVK#zSF&g&<2y~7lJ!!u!jS!@Jl 5=`^0lR`=uqhx%rU}ggN?jrt~ z!y(XPdZWM6<6B&dLA+v>471PHTlIK=lKDW^3o>?cppqr|g7Hud$0=b6$QmixASEja zSz{#|tYm(W@jYo?e5sPjQlQyL^BSsTrI9X#G&{sNrCu3O5gp@Cq4g$aS)|v2*rNoc zSPtoFswat%;UE9&OIu$h8=>?nKo$cTdp=UhDk42r>G9=GCjCKUlx!T|J)|`Opv9~i z*LYPJ%aZ9%$|fioBfqTD }4 yRVT*^Yv5KYv}k7I+ f99ih;a9#X&wGUr-59Nzi@h z90&51l0zUaB3nS)L0dtaL0m*qK$}3Rpf^EWMEGJ3-}31LiUIWn^#k<>VL?f<)kUHK zs3E8ks4=K1s2QjQs3oWss12wss2%7PP pjp#&?T-)A0Y7|=p)b-&{fdKpie-bf^L9rf^LCsgWdx14Z+1AzCp-UYz}BH zXdY-j$N=$W$yT7&pf;d(phlp^ph!?{P!!*rbAbXtfuKsD%Ag=nHBczX0r~+^^9krC zXay(*v=#IS!+8~S4fGTPoCD|v;xd{OWC!uV1?LZ!Q7)TYCb=x~b@HTN@#h!NEMzb` z&83l Cz6RX`H3D4$eFnM%x&*om`T$f16o?@R096F>-Mg}& za-dS6(j0$3ByxckfEI!#fhK}xfZhO21HBHK44Mv_3Yr2+1|@+8g5p4fKsiBt#cVPf zo&w@)X|+I`klqa10;&u?2*elp!t7lz7m*l&jH Na3F5f%G6CzbaD# z)EU$X)KJ3&tA#`q$OYnN$IUGg#0{+`h~K~AMutVowg9vcR1oA1@&x??qZ)&5gKmO8 z0euSMyO3o-xj}hAYeB0)D?o!m)1dPPm)+x_+7N65ZUq%Wx-iHI8Vi0tC=nD7IuE)4 zdKa_-v=+1mv=Ou(#P1NU1aYI}#>h>No7@P{d3c4tA;R~x>w@CZF;Qx)?$u#5Ql&wq zK;=OJpbDUJAb(I9P(=`5Mkx#G4(bZ(4dVBpT7lYtT7&qtlg~jn#PTtEv8LZ6$#0xw zfbN67260Qd47vp3`~G`DyFlrn-Jm_7w?S`#_#d zu7j_pqu(b$MUdvJq2rKF0KErF1-%X01zH8-{@WiE4@v;>E&PU{jW90-lnUAm+5*}N z+78;G*+kiKx@XdxVCI1g&_d86kN_ _Q_Sfj$IXVuPTo zppQY pAf76C zia3Xi;V|F`6i ppCWOhL-k_c+z$0x=6zB-zHw=A2bwR~Jh0p*_ndUcJ z*Fm2L#8IF;$ZG~_3i<}blT9?JsnX@yZ90fw5uiRd#H3{W;aQEZ{qw5=Jdf1`RRsBi zcEKKnt`~K@Z>Zeg%~V6gZBpU9;`X238*oM+pZfZKlH8bmNCJYvEqVpum|)u zh%vPjgvd8%z&0Rf17?M&lBC;9tN^ndlni3jGx`^SI4j1bcSzF9=8heUG)Bv|05}me z6Eq*h88j92252%U3B-CPfhK@pr`aKv IuJ0j)NuOP#;VdkcA1$5|i8&1&~W zWlSfqa;p%PGY1Lj> @kxgYcFMECLEBjAhz;8*J&axVz z1L+7lmkxctvKKW#KV)x&1Cj=!?q8g$bY(bVgso9}&a%H4#&Du>9Du(wF1r!W*Y~3J zX;XVt_M%>9ugLNYd-8X#-;F%>mc~sH@65r-X0KwW%BKC#JCvLJL6Eh#z6A$y1D^}z zCeF>Bd8a^!vZc8{uY=A>U yFfl>IuB$6)IAO2 zx$~Toy#qW8IwR8N>V=wGcJQ#lgNMbd$C6K<@5lSlvHHS8O$LaY)>V;ro?bEEJ+P5r zzXE=#iJJ3teB}rJc`8QF)A0m-p57_R4xXEB0}zkt+?XqX>VxWmYJ 4S|h7 z>>xXyi~BHLVjWR Ecw3DtSFJA9!n+NRh$>Yryi|g?vQRIYes7^3>>g4GtE}}CE4tP_G&nRgxT>ub zig_U?v}xl`OTv4-W9Eb*!xkZemgwF-)~~mn+*9z}p&{c=LZMo4crYGm_P|Hay0 I++Sw*178^0k9{NJwy4aJVg9ge-;nQPCXWqkbzhIof;b z#3Lml1F08WJs7^dCX$xwp+0v|kpmTt^@{v8c53^+REP);g~okx0X2kMzwY@;%O93L zoOOFM6~co >mi%J+?9?E$L)F-5JuwUlS_|P>#;s^cc-H!zTc6aVTid?cZG&p{ z;HvC {;;%h7FV?OE#wLk~m7v6(E6Kmk6_TNtoP)Ln^EJ46@4 z2{C*n#-pl8B~%eNR_gs^ Ag7dL{r?*4TZ=U`-H~J^DFh|Tb zUbI{TA6Y-x>)xqa`wKZXoq_^FjS5A?L@4MU1;w&8x) +)x>gN!@k#d*v2rb}`cmv$i$U%wBG;j9>$iFv z (PxVqVsx~Zv9g5{kFZwwwdWa0ZqXR!FV#?O&p_ofAI-n zxOlu?ujDvf49hYslbK?{M!jIJ?oJdyaOL(E-8aBvg~g)^2!#@2-Ubx(7n=b-)-MTf z%5&w {KPH?q`p+Sut9 )Jp_(B(SSNjS9Q#+F3{nLsC|3{{*dCzg_%CoVH_V znFb%DC{`c3X1>r;;hF)$hcI8%Ee*du6s^I9$zM9QC2tuL@^;*}y;q==nvq|Wk`4A6 zR<3rP-1#Gr!*GO$Ld9|v^(pIz!9x43svKYAeeOhIC~&nxgFVD$*%Eu}WBs`DYud6; z8vVQy3lQ|oiljTjtRF}Irq62~Zqz#3017pN&4p%Q8R@9br^DObZ}!VK$f=4PG;v4_ zV%_hT#a;~?MnBqp?Gx8Q8F!(<)vDXR7OSD4Z4?IxCRfa@x~(r>RY3@FUABHCIpm8? z<5pH}w;Gj)FlfUg__UZ4=g_Pl8x{U;^l9dV1tUJIO%=5_>y^sRtAIli6rNww3usnO zhM2k8^m*n&EDmqhi)UY%RXPV&N^I96?-s >2rHZ3ezmxSlZ$F(kEvrGSmVDk>dgH}BC}?kr&D2{HE*F+xzxi|UPn(bN zG^93(ba9J%7sM~S;Gdcz=xuQ0MdP=@%@AYBy(Jcc3$uRd`oQ~N_DV^3d#c%12#v1l zA?N3s&?~K0uK&fUtU%6q@yFX(fR)irMa*tgdqa4Bh-&YN19ah!;sQDpX8mgMCci(% zf84Z5NnK+cp$ePz)6=)MZ6Ewfo}E~UnS=PSl@ZG?p>x&`BB!0YaM^#%h^ e~ zu7S7=bq>OcJqU@e;%l(ji!Sd0%oSe~wu(VCYOe50hux>epmcB_i8=cKUx?M@9*YA2 zpBye3w-=(m_ S`PVbniA79BgW=+S_-igqq6hRPIMZQc4#g6*@(^a{ZwGXz z&ruZSF+NwtacwfZHhf>0UUqUFx+Yp4#4y~2LP03_9$UDh*@D6+sDPCp#{VoPLP5{b zP%JwLPnKvX$LoX1D>|oqUF#tgp@wC*s<;Tnu#QmRb}YKj98$K;y9)|yjUXuiNgp7$ z<>Ve+=j2>_sk~`K2s<}glsKe&`%Z-dyV!4Jasx+=JpD`sGkWa}M7u+J3)!bopU)bZ z_kPJk9*%5KbVhqO_@bJ;J9s1>9Kw2KZ!F3j*8A%D8;co-aiA|L4jo1yR!Yx(M0aX< z$G84beWI>66Q_?tD|a&yd`!P*c`WES*0YnM`Ejgg)~}(r%5zuz95^`!Epb?*?N1l(x-*17+qo8KiAdzcRO2s!`mi`GyGdyM^++x+2nu_yFDKbQ*z zb*`w_N=DClkBkb ?2{S9t;BNHZT-;t`b8_gv6t#u7YaNb!<2sF@(I{#{iJ$* z$AL9D;tJ1$0@f8O$Xg5%cM@x;y4@HeR-c6VW5fY~kM%3*rA|I{yB5;0tvhxP^KQ$w zT6_nEFzaX4C*}Jg<;G|4@6S@Oet5lMWm|<+*RS`?%6TYipF-W%FSYN!d#}^ye{TLW zOQE6|1_iBwm`S}}?c@)Qj$O07*{D~q<0NR=Fi{+VLYVc_@SS(wpWY+?fhk!EM^Usi zyjrFGjT)Cfsh6$jU+42ZQTH?&Z6>-9UO26#Q1|RCZl2Cu6P{C5>(MRI1It3V_2ci$ z+$I>lUG`MVa=rEQ@DoOC4sF`<7aU)$ojvz!V%r(LuQphWeGeO4@L9dMkNlB%{M_$b z18eu6@vGb%%o#94q@9J XK$}{jc<1x(*~}fn$NEY6{-br*zRP#I=~{K%?n3*y zh5gwRg4&E {6CAW+iavtMt{gV7=i{5*B?AN}(!F9M>q~W(w84o*e#11HwyYB8*$l-|+ zIT7Lzidts}yg5xy9wB@hVy)!* z&hC>>^+G9i2EQR(IAh=?`-xWo<{`%$F9Xk} zFhM;12ryF|BezmiA(t*RZh9BRybFLY#2xI!zJK(PYv}1OA5H!9lNpz?tjgb0biaT| zQk6VYOq{%+?@>YUuj6mEsA_n&zL_HAB1ZjLgQX@LDgIo}Gkx&+d*kKK{(p0_kkO^i z5Sd4c?B|W5?ijUaPZjd0BUW8Tm(=M;orTl}t3vmgomHJN#nAUrN-3C!TOMQ09asjl zPdpwXmqV0{-@ju2>hHgPQ=Oo2udc#e9adk`baPS_71uw|OZ>w`l=kcS`-sXPB2HB3 z1&JO!;XON`&kUOiJuK=au0r$KAbmDS!o+w+?z5FW6NxX*+a_9aQpgy$rpPI=ltN|T zvtg(-l}W0FjiT*U#AaDB QYv8MwdlGR ichzcrH$A+a7er(LOw urBm8aT|{5!wx_ zGT!c*+#%t26T@q^5Q=Yt!J<%I)>XtEg`SGbER?;hH@ Sg61>9^Ww-Y+(qAj0ymba%f9Zkw7}I5u}f78H5+^=dfY(|nv06J(a|2F%WZJ) zimedp9>c}l+j@htp2KBW|MfwJmD5lBh619%9laHv8L`H{JV0lY)&umcMnVxkcW8iF zL#3Klg@4~v-4XJMll61yx+Wj#i&fY3!j7ogr9yBsYx_t{e27}_iL~#~5%-be=r6jL z?lV#xehRELQe1inY&BB6`x&s$$c1&>y!0_67kv(H{z&oA?p6(t$xDBaIxdT#$LL$~ z=XxWbhj`&57=HY#c@M>%&-KzQd;2ThOZa~AFWTe3(EFABhw4;AvIC;jUA;0KizbSR zs&{qYTvo|~V?^>#dNuLzu3j*^g2Pgf72wX`vb$T4f3yF&%2j7n;a9CHU(k7F?GJb@ zuqfQ)J*89q687#NBCL55LBKljP5{p+d2+=>`S$nwnY)j9 IMM5#-u)$fYF61W(}gHlEkkdR-FumN*@v^- zzxO}y1QC8;uNMAS56MSu!Bsm?kSkPb>k^lj&42$u*2Et$L9Dos=u;>=-Y|0 fzPeszbuY?gSA0U2hrw{-smNqEbYy# %gd&@2py8o;NUSS>e)v^#tzp&Ti&Q zxA2@Np7Sm~A&SI;rH79b9lzJRzg*{E80s%!&|R@zck}jr__}-s;#1(2CzE%sot8Bp z)$riS6IWv0HhIw>SQqpCs26{J*?rD!)_AJX_bD_P?-^jqPyVt%sf9T`^{gh;cm+=u zw>38})qS;ITMLM_=BtGyyW3yRLC;5rWuBZ!|Lo;oe!`YeZ;J5!8B15oDbiKWLpjqA z__jV{PJMGX?>0rWfrcJGMGW{^55z8<^hEd0)gy=e{6J-kOFv^1ka-?f9)-nyL*9^| z-j;mp)7zsC6v;5FHrL&nZ;19!GOKi0#mtX>8$RDq?WrQyFM0#L`BahoME82O5jBv{ zg`gGd{}kiT#pO#ZQr3R0d~NQgFA F#FSGDw z?~C8RY$fK$?v4%9<>!Gf?v^svx5y0n0pG!(AL@oLKY An=I;_`RwZb(z66_ zH)M@ Q arH*ZsP8e(#D})CXSA>YE?W=`nLeRfn5bSUgJcv-GI(d5eA?pWd3c9(c(I?vFtZ zKXdR$me^ zrp$T0P?Z^n&vq?i=2Q*FhgLs|mbo%3^2u3E9*6%-S?51yi{n1`MzdKwT3QM{pRKj= zsv9b*zA)iwok5L5vMXF }gdr;^ElV`3g+EoTYGA+=4=QPGP @LApbiN2jDjCkyyr7=sDZGZE~>Zw0YES{CKNsP@8 zyG}rXFCCN^(^|Vb?xW-^h1+5~6vBU33e)13R=hE-Y2GY__!aUt|K`mj%Qsg$RKp!l z5#TSx_v97gPuS(NNNIevDDnH%uAdHMX{3md0*I#lqB+3lUFh*~L)CgqdZg#b5ARtu z-4aPq2>)IwOmpATzlUedQCSN1m9nUZXH=!V+Jbkpa=ccG_X@aqg;$0KXQ9`xzlO9s z7ao(PQAgz*w|(2VLWW)^E2sTR;p^$<<=bCr1QzrU)n ^E**2O}$IuUPJhUSEJhQ5e=P>QW`&5}q5g6h0T1p@7%Mz6SW_ zUnTY8daikTW!^q~s$+Sl{3=nZAQmh6W}9eN(5*UF!Knq^Lan#% Hm<4MZ_ z?R>DjRhQ3(8l{K{)NG$39zs*^og!}gyLpLoMKQn4*W @J(P{|}zQV{M=Xfd!u z&-#<5pc3^F=7JQ_-3LZ&6fKKkTn<2y0rTU>Ws9s%{oG|Lng{QTVj>jq{~j$R{4TVT zIB^tD6_-%I9+4`JmO|6I7rKcmOM1Bl<{Gg{t||H!(asBtpL7KdD=WP)vVZ?p*y1hX zLoc@$zD>5tXS%!INt$1;- ?Ko=}q%9)y2ES zZB|=+kE}NOc `5g=;NrvQ6~zMTySovc%DRU!^wQ)#njP;2AVm z9(ZL3G< y=NI!tpgE@rN%4&wS!sS=2A#R@%4jKDoPB*%)>7 z%PGCan 6b^tNr(jw@bJ+aO63Fm;BJ63<@hmWJHNpCEcpOIR0Q1 z-aL{K^bdh&MsiCzOG5GC7sJq+9gH=GuUO^h)+%!%$e 197V1ru<@Hu@%+Ll^l;m~&8 z->-DXxyy;y?eMi$aS;mP51~*D6 `@Vivc9iFgD<|lz4XY{PrqEd zBuiuYQLzddKKr4;Pm9iXTy)|64=44=>Z0tM_@+EU?6L?6M0YbpX}n&mdz=!rDq!CF zpAyM|Zq>xJ3U2+aS8q3o+!dkuOaY$-SaNv)_-fned9Qvp43B&95qEVSy`-L)Rnct{ z_O$%|Zr))z@SRh>JM!KahlVbG^D*9NwhrS{k;Avrw|#oxo6-rDiz7!ZVb3%t=K90r z6tNk#Y0@5R;|NPTE8U&5)!30k1HP@NYj{J`ybbvrHqy;^rhSr_*6N&xSvfvgs%m>j z1O@!1^I}YZTPsz&@88#|Tx9vfTs{hm9)WK5=e*cLx1SU51!Bw!os-V0@O9x*Ev|o> zq-O@5(h$WfVY`=a?dS3e#=DKUI#m(zmE7uhCPv4`jf@@Kr*W6}D|}lit>O*wP9--# zd=#7kD4nyY^zA1d#;$vHb1CnF;5qsei*?BNv~cyCB}G7GXfGE{CB#;CbK#BpRC2PW z;y3UZDi?}~KSS%q?Py+b8vhpqT$_GP*Mr=`+&rUu#l^%|iS0dPa6(XgOmy$W^suUK zKgEY7{w1SIP vXc89~l-{Iw zG4u`+5G5#56a*_aiUq*}zvtPRO#*N5t)Jif_5I8H;?YR1)@Tg2+k2~$eG^-g^Eb%!rCt2D20>Wz(aj6QL$8=bfO>gM1pC9`8Wz3h<8 zk>yk8yE`1-4o6zA RR;^TS^gGooH!|@dK+rb971?) O1xt|YApx-GB67=!L;iampo*|V29&Nc+HAhsQjS`eMYg| zV93Rx@1@G?1TKX7(_*ZIBP}7hcHe +{1aq4+%qYzSA4R= z(I4K@ZVQ->=m;nCD=T}uflouGeo%Z;-}oSh!>YF(6wYF@#eL$Ehb6+(r1;^ 4d6}Bl&`%aPG;UbG+5_T8d8!Ni{Z$+i1}6-SOHS6HXI#!g&*oJv zBb#y8N9qqkX2sjVbZ|pisZRwn?j122$gLnVOxGcoV#i)af}R#toKs#FP(DCj@ZSpR zR6#oOXgLW82OWL^jG(1msOWH@t!W3qXiM6hO3-7vq^&az_j0MXFk{#)UxRtsdx}4* zBIRLV`fts=+6l>VklF3Sk_RUAL_jZ9mF;>FdX_V axQcgW3LLs{CDG z$TiY7%0${qmEl!W1{&p9@mT PVX`$ZW(W z#j6xAH0wLdrIxBEb5jO#96KC+P$MHUE>O p~cTiM+0#k 9feuIW7%8s?^Exalz2Z &yHDHd+S&D~)*&}_yg&mI6w3m@!=*uJI-r#c`<;V>0Bxi3C zrN4 TqCrN<+_BuUN<|u0^11$JK7KeSdV9vR!P?!FBrck{sxLVZRs5 zsWB4F>c0gS1Fr;gWX(|ALvm_bOC(An!=4NF(6b#ojf&}D-QLo!G?*3q(Mxtj1?(;C zsBK_Yv;bTRya(4&9zIwO(K&r&T#ELU+yPvSyTP!e5KKphBLb12#|<%@*^-pFfx{9o z%IyQrIp{gSDuY=;Vp6Xmy-}IbUv}h!1X=K?xTL;}NRa{3(fi0}2j2v<13w3|;|_s6 zYa!8Mpd5ndRmLgBeG&%uu04FHW6B^|!B{h~P*rV%`Ff#psSn^7oxK9)TEA|nto%JC zzXX|;-hfQr24;7DpD3L=sN{i|X?*QZlKS%SoV~FfGDj!!Yxf&AXy6^_S)Uhzgl ~Dzd i&@)I&!Ho8T$+DMP<9h0wm^ohIdUA&8S-5Pf-M~JYtn5WFD|vUi z?13sX q@N%&aAzR1XO4iqz=>cw6&Ige z8&f>hVb9R&v!w%%?ppSy{OAg0FA?^P9{-vg682JK!a>Hi0UE?uA2j7yt^t`*cnVzB zVOA+pI`t(XSKTNuM^Au~J;1#5+j(+PI1a7^`Au+n@KmLb2UmpL1kBE^1TF`5D*k$| zy#553`VC;#lLnu<$;OCVndGsrg< zOTMJ|xZ-V!7b~8oIK|?oINKw^UT>?ok>VPPeZU;n1r-0hNXnlnKC{StrD&bhd24Wh zhuKJQS@27We_Sn#Zw#3MtqrEXzKWfSA3dAjSugvncYM#`SXdo{lJSOD59rx$yWFcN zAMT~54UA72OoJ^O<%Mr5J_7@G`shtkkIx4ww7UhFqp{DxxM9QMdvh_f?DlMy4);&4 zZGBM0;yW}hDLH;K^ju}X+#>k`m>rkAl~d5% Cn^l5nxa7Ajvh-4!$kh zkOih;@A&wkIOnrNEJJ$(;KE-@U$WDjR;;W(d6&7aSlLt+$TZtF3)j$z5BEr?v%#!% zADH@;ii_@(0~Mde;|9j{j(3C1xZK<;8;$X4EvqRB!?3qG982~~-+n(JXWlh1f|Q!} zj!dL&0&}FyRXh&Nbva&fYj7#Z5#W;GN?=CU2TaEbgBcYpeO5V>kIJdr0$dLIx?q;) zaZK7L#}7)0PwMS(@N;O-Q4UA% 0d%-G?NF$CHF(2eNaGo$bFC|S3MzH zQUuI`3xH|g2KjU}F vT98pagd_vsJi$$7y=jh|&_w=o&8VLo);K@0i(muW1@JUB)O6 zha&{WZZtMFLTYVY>RmHj|J}npSu;v=nMN&_mTpGZav7)KqB5@*Zajd*n%vBs8sS=f z)2QuYMYUbVI>fRmatfHSwZn}YkeWd%V#d}A*IqV_Ixgo)42wSI%vO=kdWe5RGp0tQ zHqgwj<1)5FW*xc-CyXB 8B$>w#># zcVM_N3{pen6*OZZ?T5sQon|JaLfF`OT|vgw*$h%c)2l|Lk*@S84`JA28X+#Ngc%*; zGNQ2<(N(7v$SGzvaxR)is7rgwjK=%3W=5#XFtOr311pV<)jl(gFqc-%jK+IkGXw7% z&FnCj@nv!83u>7W;f__WrFpt;q&~5PIV~*8xfhBE)2n)<=4ToaE=`!xc)xCD;JvJw z9pN$tVf4`#&CCo7H?kmwL2|QV@I!81PTg>$CdMrzhTsQ=YlBRq0moK!1D7)rQ?VVp z$#@m1=d9~_#Sf5Jw!4|rIKrc}6bhOQ=xdOIkR^NlXs*Ozc?VK+E00pNpR88)@^nZM zRt0q8h?(8crBybKMlPcVwoK*}WKfOykQzWT%vdz*8YER>V7MMy#`LTiWsE9g4`=U2 z;o2E9Bg$nID=T##)?oZdNmkDqepnbd1`1fc9;YNZ1{OhLU%8v!sO|xz4v?hF?J@ru z1rKY^nMy)T5TPrO zTnx(>BRrJgw5HhyW^^-`R?5t1=5j8m;&4Qo zF&KHDnnrV%R@#ildq*<^@0n(HbC>h0su%+1>4-?fr&{hv4-3~inHept^{$0Wzgx}p zd@c%0VDxh?=i=%PM`P3Lxk%$vq}T+9nOQyD>01Mrn=v7gT4ysl+GTtInYr*EA@;9n z_dOb~^)!u^E^W0Ljdx6gmM)`lEr%l%) 2Eo =>j5=FCA2wK`_Ym?)!uUE6hU z4DRGSsdl(?Bcw1hCMMGO94W3o=&`_XXL(c^#x5{AAjPI>rZ*Pa*^t;3nERpO+I};- zjZ0f-X0&k`PhoDwO1q$Nr%B0-35|6AiPTHhOzjwKuWt;}bVxClJ;tGN0TTY9mYfz5 z?(iep^r{)DwKFqfUCz&>j0LVH!q&vT$T=92i+09FrPr;QcneY>tT2h9!i^lPE}R QtaOdBk@uR&tq&^Sznvu5^-E~5&jbW=-5H-|&wu*Pu1K;8}s|5Wq8Gqc;d zoVDw-<7QTmbaq85#PTPTDcH$f;~1oNQVI<>d=bqTtTO1&07z}EJgz)@AaNd8Q_AU# z m~iJ*B%d{B#zq=D z8#x^9p~vcrxO?G(7jvZ^xsrEqgoi7C2MvIf8+l_BB-E=4`34gHDXAJ<%aevfLi1JL zCP=y0IlqDQJO_! !z^iSU4c(zyCymV9ew zzwB~`z+c(sIY`Mi$D;Vk=v_v}TAQ>uGrOxx8*dujT)5{DjrXf&MmLvH1FJWNF5*X* zUWTNWAnc5 tw=0M^YmFFJk^IRIe8b> 6pG-!;0#A~eO$~X$CwN(Q5l46+etP$6xMz}+0ZH?P4 zNU@o6@A?)J_(WV;caB&q#HvZF;BX&84`o* zVdk`r@PLq4U1dx@`im_VMRtM22+2ZBNazAip^$Ln3rMmzxN?-mTF22R^WMXR?wKpq z!;I>YE6s+~Emyknkkksx!ppgNYaqRpE9n@qopPm@Aa%% *=0TFPjsyOCNa$uYZ(G0-tQ$(22q|xV9)XlQKMk+Wwv^K- z!UF;(o9dw%kk}_Ujv;^sT8a?}#}Ihui;$X{F|{If@sioHR+RAp6bLxS9!~xh&5WTg zV|EuAAGvgW3yDKRN)ZTSgIp;IQkW&>#DzQ8P(tAiJ&*{78YiKy;ZElQ_{2X4hQ;ANk<_`7h~hX z4XqFE9$R^oo`ZyGk15MJzZepG!rBR)A3|zq9l%QWl~Ynq<$jRlHJtQsL8^yq(D#tO zfW+V+{4a(Z?fc0vT9UTZG{(4$&!EFF$4J0B>5NFQ*2dbA#%QEk*jH+&Ok=FeDBeH+ zn12CML+eV`Gz$`k2R=n&zE>Jx&m0cW6i6+3 QFs<{~x7HJe1C_O7?4d}LzWLfaS zm;s67(P@3GIS%O=%M-S*z@S_SYff`WDnf|YYmhi6 2ivO?BI|4pDU6@I zjIl^@pkXaS&6|`YSG22;=!f+=*;#rB&njLxWVS>~4o +)pm5_B^_H!7Xt=X(B4R)*d|oytxSU%dM^bibNj$|d)e@;l(`!Pc zF$t+U($ko54TtxME@xOWBg>;^8d7XK_6K~V*$;`6$vVIop2Ot8hlEM^BBZvKB`0Xn z;c~jlgHJC=^cH6&+(B3ZiEFr&zJ}BalH8WZj*#0)F>WBv{g7Vf5@eJfDNC12Q-4V4 z?^==0El72+QUylgu?O??)Q0XzbhA`9kZNsR-gUHG{xKY1j&O&7&&P8bdW@0logAdQ zAz?F}-OwEg>oVuFW0_)^NVKxb`~<1ztTHQ&%N@!!!u2uZ%xTl3j7w0mCvX4>3D vi^HrC7nl-ACGZ!h@HfK6oZ&|lT>IL)k zOcy?f#msEz4iQrT#xK5N8?Qx58s9@oPLMSd?A-fEwKKh@HuRV%*J?y`Xt@6MM048g zD5KFNdxG(3y$liuD$ZLC!i|rWBp3G*lVvAjqr$}O3W>u+9$bz?vYO=doC3Y&-*Z;V zt3jkO87Xd!GU}Hg$v&z!)gB13n2^IDage~hDG?q@K=BwAei`bcmU9YHhy&)%X{5My zp-^00YMN}Dl;R=f*-)9oUS@koVA zKk&h2J0vcAC^#nE_!$xxXDPLvX>ZTW+X6}EdBdSfv+RRAB 4JK~L zs~jl&aFK!( (UPE^z+Vf)PcSyZxrJ^!9->I8| z6uP8#q<$*XJo!cx?lBn)T!!m4Ib3B67D2)p!)_g a;c*D-^id0`qcND33D^-1g z!_nPJP0dYxjg%~}=|Veq1ya(3KalFkD~uNx*+(bbK+<1dWVT!$<$Pm_HDs4ZI rFJSUH}!6A%4eB15n MRcwWw`%-RdIZ~Jb z^d&b{XQizhW~FAXXy}dvx*ulub5qZ*vUQVlQzz||QTk1}WaCisVz}19%vj?x=0X>a zjx54YbjG`ox `aXix7!sCNe6}dHURpv*$1MR!T&b)XqHkVr zo?IVgI5yb34y$blDM%KEJ!mi_4sI-MaN-R}Ev1CdWM4p{OLD&t+K4bg!fu7Bm;#Ao z84{Mg-H;ku5}M+?L&@4TgEpb3pto-J=@U1Z(*mQ6gHZBP+~&YZ^mj;{;n*PIT>Z^* zvzK>Vhd_G9%EQeB4+!)ISum`zCI88!2c!t(VUa}Md`R-L%x5Azlpq@sxK(bea_t@q zNk)rJdK(f~7o3UFq;Dayj|*ELz5=$%UiCC%Ga@`7@G{F#-@eV9wk^siy50V` BLpX=&W8OAB-;OfQK&keYh;Yrv z%y`>nypSaWD=(W0iL1UG&HGfIJo5bni9II|bAdZ$V`N?eq%h=R9O4ED1RBbbb6sWO zlq@1Vc1b(*2aZ+kAjzT0Pcw5MF$}m>*4{FVfFQfE=x+IGOU7g+B X0KDFL+k9l%;l<_%~%`IP8MfJVXGn85_T<^QroVF)Q-?Y~}xhKk5Wgia+I8qoB zkYe2!d5GPfede^iQTqLT=E=QLMw|Wi#)TDLU$ftAxi89j0ZJTy_ce4s$RpUyeUZ*r zkm_WmF6E|z4sp+A?$q4W6{PUx0dzr!?bKwXUa)i*kiwDXfJ f!q4 zBj&V&QO4I$vR85IA1lJTqw*s@K2}eN;1_u9a VCWi41ul!7_;Q%=W;ET-KMpD3wOnEc~yvUjv^G>N$ zN;t$@ul($U<`tzUv-Al7OPQqP$zZ<7)K3LymjUpVpFJRFT3X4pdkx=iTPh^13r#Q! znhO*J76N?bX9jHvzyg*kUIymtaa;iU)mE-#mcLfXYx#f&3&a*^6^Jbj(H?X{#szzp z y@8b{Z@dy&B~R`;@?s-nbl*dvTDHsW7%WfuwG==en^V>In^>ej0{$AL>Z8I z!Eu24cL2V~)Ssk)*IzO1PFq%z>G1nX&STjxkI9ghG-S)p0W9zWK!+|W`4cc-WafWL z0k8Z_`>Ryqbrs;O_yXYT3xB-Pv#%)Om7g`U^2u_RgWn>Dm))QVUXNo|bJNO|Y#@DC z$z oeY3bEElSTns&l}e?1C6%?Wvi1Y>0)Hi! z1s8%`UCA}U3`1QoUu4!A1g0uj>GLyHAu2yq<%4TLjZGj=@nqRtbgF794a4zP6x;&L z#zljvZ;3Y!lC~5SGyer8lPR|YQ`KJS^E0pS0zI44O>vyE1E*RA^n!xA-YSF4WIWzj zzyL7gGlWXTrNEPwOlAccN`4#{L;eDlPp1814a)~#i&X|$Gyi sf=p3FgZOv(9KGcTVmWqyC!1Mo>@ zsV9{cnSFdo$^Q>nE SqPN zAcLdyS7nf&8Igj>WJQI*wDaPdVlQxM$c%SIFb89GFe|L5?8q!SP|0M ! zWrTz2SOYMJjSEai+JIR>dnLz%S@B>n?GwQ)I0?+_Mu6$acqLCz`4hqT=SbxP#C(yN zoT_-5(&uNYX5ft#%mgzcnM!_*nRt<@pQo5l_VSgVxvZ^{`qp;hA!gocb>UwzP1Y(q zvS$8pM(*kxATb`B6>n2k`I&Lt2|eB2tLzRayZlVmA-s`~;EmU1gIWH&O8=gcb95|M zjL%sp_#)Hr9GLo#l%C9y^EsFu_`TAT>Ci1OJDeBuIt|PYEugp%82=oF@y1JwD*0(Q z3~4G#KtWIaltCFKR|FS^J`l_onaL2v;b2~0AIu7)l)kajHv#iSrejT2ehV-g(w0jK z{yARcn_~8OH^>}{@nE(*3CxOyfw_&21wRFz3Z}iO^5=r-$Qxi^@OGu&0cLr76(0dJ za;fhi!3*96)5FtXzQ|0T!5a-fRQmi(`*YAULZ5>f!EeCa1O5QBTn!h~P6yLbFEBq= zR0LxONp*xG!Im@zvt`j>w)A;0_k#9ddj2w)1$71U^*Cl$9Ntj3qc@li^#@ZwSm_hN zEGLOde(GU@ieyV6nH7$P%oe1o{4|ySICe8*J}hNz4;iqc`_q**nWep^ t|&V)yWmrB zMX=7^euUYT?n?hx%n_Gb5QZ$!1I!CO)rDm03n}?=%>1X+b%m9E5oJ$ieo>WQOvz8H ze8p89OmJE8R~ckpSVqZY-TdVv`B|a7(vs hW%ncvWfrH7r~T`77f z12X4pUnM_|8Jq#gXV3;KyT>sd7>az(>#<-i OiAo&vcK8T@mZEt`f47}?oi zuBY?CbmR?HF`0G?Qk7x>m=`QlGMNU;m7Jeh&`RjJl5Ymn SAM2L%>gpjZ0kj){G8%w@ISa?mC9RI*6W`z9qbR#;lTh~ zn*UA}L`$Y)NdP$+;EPOI-m5Zi953+iEi8E}i&0#nqO(--GB96{V~*F=R_?#IuudWl zjNfS$4>Ct--mNQ{@jg~O>-C=*d3px+-& + zAqfB8!uo%83u}AY56)La=uqu>ZH!1Cs&y3AhH75oODe{Rz(go6P%$?Vid1opim8cE zG)saaU1TOf5s?JNFH}qrjgz6cPQ|KZC?<*9RLoD-3X2ZIw3gZwv1}L=&kcixb2uzA zMC@=V?ozRXis?d2fnv>YDB@F~m?^eW(J2Lr5+k5^Rm6>e!eay!$Ee5@-Xo#dNyYGy zP?+Kn75zp+QF#;;b4B7PD11giagGWh0!Bk|f{IC_p?F>7P%&~e6rp3FSRm5JKv8WB z6kk%YNCb|B;sO )!tQT536l>C;h);)Nqu5GCr*tSvyaL5$ z5%&rd9 #xU`592Op9aM{V%an(o|^`Rb2=2+B6d0ycd6Jx#VMi9 zfMU&bDB@>8aawGpqSFj0O3Z}feGxYk3Xhpk9HSyfc+Y}jCl$kILGgh&L`A<@P*i>u zigP0IRjs4;k;o>U7Xh PvQ{iXW{z>=ogVlx+Ahlzlwkbpu1ue z>7K|T{U)j}1pO}3Nq>loq(4RABCVr-UlY?7X&v+jn)nQ?IYj-%$kjw9NJK1#v%f5c zvu>jC5-6@yv1$nvPH~%x`AeW^zZ8msV%btCo?8lqa~Twdh+PK7T`G1^QAlXZp;)sF ziumPFc!{l4bXty7i4{;35pgS^@K^!GF)F-;_ev;sQZalb6i SqF5iMe~ptwuL4l14(+D<6eWI++X6N(tIm5NR~ zp(wEniZ&u{7Ze`5pg2ZFtnl6q#ZD@Q?}p+ GO2a5J0aSsM`2a!$cC<69^ zI*C!F&LW5OlBm89)J3F|UKSTgT}9x2P&bi5>MpL4dWiZ5Kye}yBq9!=l3xy>l3t?m zK`5?MvFacc@!~cW^AAGN{ty&>#j- zrcP{bdB zVvyKMMW-WBlsF2-5D|A23Xh{u9HSypcprmeCl$kwL6IyDQPJ-h6qS!dF =96EYk4|9#byDW^}Zi_O$<}x><|Z zlCzpPcuI2@7j7UBHM0V5qI%6gE9SOV&JB|ka$T$OOMlipoG;+-6^e@67qlk6E0M%k zsA>7VxBe?J5qnAN!b?2!oMJ_TW$p5R>%udz$FgqR(N2u=>@kE5K)J(2g+#q!nfnjq zi@F$O@w+*KuNaY@s6U tbBt6Hgv(oYTozqJ9lF}7{?xMT;#;A)@@);}p!Iqby!$1CimX6<4)Ve7 %mZ7fL9NtD~`0Lba6^o0y;OP>zS&Q{93n|DzKN*@u8Fl0AIbK<2CG#IcPDX z(MQ?wF(?7>)mP~--5lM~Vm7Fs()l6XLq#D$=~DUBHJ|3?tG`l~LAsgJ4N$tW&^1@O zfl5~nx`IkKNa@N$Hv?(D_!uIy1At;kvq2o8)KvhA^YJ(;hbm=7q*nlJk^SsqC8Q@Q zuajVhe~!w)2&EgQuB`&yNTnMN9g|goo=C9eqm*4Wq Hy=Rqoc1VU0sep>&ap81f{Hp z^a7TG7oW`J#eu*=r0M7+r3*s3D$;a{4{Xvd7 `auzp7d zl$`%zRKP=e%08rFIKVs8bbwEJQWpUn1z5-|rK^whF{OJ|=^8*j%nR_Et#pw{^A0!5 z#nYlitOB25C*n1Ad{*fcy@Hm?=X{C-C4f?Z58w-w2K<0;V9duY4gk9WE+DIbH-Xi_ z8elE34&Xwv0hkVO0pWuzyn_%2^aOeVy@7aui%ArpoN0{2vp^G|DbO5f0Yn2Wf#-o3 zpf%72XbZ#wF97X;_CN=qBhU%x0=x`#1>)g+Ux1HsWdmHTP66)%T&2!%Rmwr)EbsyF zA#fhJ09*tv0UraO0G9ziS~nM%2k`Mbu3$5OnZPXIRbV#2Ck>wmS^+UY8=wi$6o>#C z0FgjL4uUE`RiGMB9jF1+1?m9>fLj @nt+NY0(@kvKCl+)b-;R{I^-GvpMc{dV!^<0{)sxCA#>CQ z>Hu|tK!ATtlmSc!W&pDQ{sC7SFbWs|qyTY1cc2F_7#IQ!1?Gy((YjwMAE4X@YzN)~ zb^vb!S-?(U7qA=H1MCI%0sDaiz(L>;a2PlO90iU6$ANc%CBQOZIj{m)39JI%1XcrU z+!5ThNUQ_a0~>&iz$Rcbum$J=+=IWr0emX rmI4ESDX^IY976rpQ+pf18vs7^=naGbqakMke2^*; zI0>8r-UXHc%Yl`^D&S3EA+Q+W2AK?SQ{*Pd4UP{sp8&D}KDPZm8utT`dIN7afm^_B z;A`MI@D1=Sz`w8f4EP-A348*y1Y&^JKpUVeP!1>$1OOF)ia;fxGEfDm3RDBS0*OEp zkgVY^MTa3V97q9103!iDGXFks2G|B{2i^j90B-|Xz&wDv^nBoTfcp_QNN$MnV)!_{ zVrm&A0|0K)%Mj412+m=k7}9*SatzW*z-eF`upL+fECGffXhVT`fO|5Zaeo%zA1m>1 zQK|zq0RB lITkJ10b~K(;dcQ8(3+a4 zq&83o*ao}{oCe+l-UrSAIlx)q1K>m89Pklv9=HHp1Wo{N16jaMU>R@#bsPj%@%+Oh z22T{D0iKbvk&y%k_@`*~fW5#zU_WpO;0fUfa1_`L>;hH*A;58ff6cTW<&;GCInW(^ z{IW61`yKkCz#mZG0QNzj%7;ODKGuPmP;#>M1o$w0cfb!9JOexhv 0k2^hp=alVa*zlmohwt$`eX3(D65{}#^jJu5fCsnwKoy`W zzylf&WX$JQ+aK5fJ =P4!E=+HcMS46$UFJBJb3M#OBQ8ud`jT) z*B_vhoB+eXV_?rCHP7jBzzaY$&>Uz6a2w`!%#TIfnz==D2yi%XSa68!0Nw&Pe6|8x zL}0r9bO7hTT3{it02mK&SkDLM0A^NPx?ZtR+-peluLn6jI2~RECIJ(HSAcN W3M6sZ?e& zd|W+f!j*&}X2>3`j<&RUQXW?yyOk`D-C S)kpo zbo6nB+U>Q=qz#uthWXJ3QARzfR^^Xoaxvzj%t~445`Yfc11x{k*z&~yTfYckg&c6~ zXAVqu$m5)q4v46kdVv@_Qjhw<<#!dXUkPw&TnZ@1Et&bY%=8N6FBi98#kuTFBp=Pr zA0Kwoqw#!Ftn7F`>R$fx*i<&3p+MMDb7N&!!uT-`j4k8&Xkm=Oqq_Wqm`<=iHUqSM zTukYZ9En(}?M`~cv;T06qlwP3!=B{aU$peGE6$pBDC}{q%wLcl8Mfp}q2G=?dvr_? zmow3``HR@1vg!Y$!Q)=M8{ihmz4dhr5bm|J!Q5|80n9rB?8%qrmbwx)hrv~V{Q!5d zeNvxl?X$L$h6j;x03dILd=fk#oDF6LwB>%h1iBMS_YU|tz@3LXQvkReP!_PAvJVxu zEN?&7eDL7WR-M5`cFTC$_!{8Wb4~=9des77L5y^W4yN9~c^>JH#9UMF===uB>-fG* z?~=-ojMac=fg%9+)=EHQ;29v2G75YO+yDpzxG$ABvWAxH-T^? =_I?#?j}0QFtfYZC2TRfg o?m9yeF zfR)pZHnu}7h~1OlNr;YQyd?o-%I<(0aD6T%I8u`mdaq%Zps=puGohEwa-Xl)a4+S9 zRXaGkMW;8ydS>fdx8ORVb>Mkr(S4!r8*2Zk*U`6&o!mEM>`@p5)d{N;gs7vu(zvwm z(I%ZYANSg7 OTZNIcDP9!*bLQCq uaVJ z`RJnpLv?KhG(|=1?|KQpRt4mbrSJ|`AsDs1n?2BZb49zN`1Wkv68${Bqz)+I=BxRO zAxm{%t+M!`xSOw^{fnsI4LZ7@)7P=5;9N+ZdUbF!w!XMc^CrSo5)>nD^Qumw&@xaj zv5$F)!Uf6C{+ZX#>nnciH7R8;$_PUl2;NMw1eM@nmYKY2i sSl7|4Z)1CnX*<2z zc$ABP)Txj4QFK`Y^Y+4v)KgSlqt`Unm%<9m0m#f?{jQIgy+-#5wSR}Ioc>w2*c&%6 zc)Qg{b5W`NtFn`dzC3W?L~WrJHq6{WM+tEm1^d~*U%T$9kM2KcaxTO&uo`w=c&|mx zpNX1l;ctTIz7{>+P;6WaKXiY&Z1{_7v^gt&Csh^Y{4gZ9i@NJ{-!}FS)2 6yr)d8isBIZqq3I>m8Hz?@)(*k9SM24xzm4g4xYL|fy4DFAG&(I6&r-nM z#Sl5+dv`u^cyW=XPF>4@2Az|(L7YOZe%TPYPz8G4{;o#z;_kY(0~&_7sJM0+PPP(_ zKhcYeB3E=L7PpO5brdn{L8+p)58S^j(kWdR3qXE3 E(& z=+4K(Uih} jJoM@8cl9)-& zJaK3f3TrGrCdG(fsC-Yn|Gi!cdxDfj%4WTou>dQ5H5Be8GB?9!fjCC0DejTp6ScQs z8CWPbZ$TVa)s~yU>mA#Be>&}r%~qf>lW@yW<$N=G!?2KJKRj#YL@*~y{E18b>|X+Y z_SLV34_#jHs?`K*9-R__TjAm;@jR)Nh~J7muQHr`8cr=Kyz1uZ(_tsMK3UtY!&B_p z4!g4AG|jPM?*+9G+BQ%t;YW%Sjot!{6K%F(5%@V!JhMkH;g0DOC(51HONzc%^%CN} z-MR;!Y02RQBgA*G#4~H As@>E_CS^;=o&ajO|rfcoh(abqH;(-La!rm$?lNAT&W3zL-Ka@eC0z4-;KT&x&zb zpw{A5NTK$x2%kT{@<_)Gg?;k^YX8pgVYlyBmMH!E+g4v#(_xIbj7$COA140o`}>3M ztUtu_kXp@G3h%d3#comaZN#Ih=uWA>7)5D>*hp!zc!!dYK*7F#_V2bY5B{k2l2!M@ zl^52YRyPX^qH3BmdVa7NSy9>^47fW_QIxG(D0p*Ay99y4>AE5M8zpk8iI_ir*b`{*q zb&Q^&kOCrLcivSGOR9{%V#RJfIMn_j<*VP6{Qmr!Q}Q5cO@jYywq1INC`4!ENK(Vb zN4fZzXjzvbTvNnMT;_MaF#?CNb-Huw`Xi4osFUaQ!;O4M@>~3@TyIj|irRm9-LLG` z`Z$uJ*b$=1UiAKB$NUI!n?pZEe2TDz*}nmu8uCWs?}fkVVbyG{6+bqS kXvze~7cJkKhnx_3 z+Wx7jcyB*Opl36=^n5UJapyJPHN3@ZaV3tXWdxr3@(pbQ1Mab++w>t7+rB%exE2ge zQD|bp+-uXizx-;!6=y12eg(48eMB2v>OTwyoa%i?q%}3_Kh@VVum;hOO~k|ldMnw? zU_bkZria`b(X`~Wc5aAKkaY8kD0dL6+K o$~mm zO3T(K-?bWG4fROzJ`L<&;$Agx@%PU1JsQJ+hh5a$PPiS%!Te(};5f>wD<&Ps)OqrU z1^cnMe)q KtY_CSP}Y)A5emy{iE9DkKS^-5ZEl%9eauO`N}a%1iXVP)`&=u z-{Dy60h_dDwH#HJUcA^N&+f7q0)tTdSG;$8dA-x;_t)RgGq8W>`|~EVGLF3$GdC|M zQ0!yb_78)PS-z;{$c`6r*t2~YEN;_>nWE4M*lm0P`vC?>-FBDj=Y0HZK07%>L!Yov zU~1Yw4Zf`R@wmy=eyyhBfSw5#Gg O`EN;?H?izmfZ!$;kdZX3q_nKCP z9oAdcC{HGSK^P@mxcq NHpMC_|D;mEK$`O}A{`OD2AOGt1l=~k~JCo<@AKk_5_c5weA^9(RUyX%_ zhk;$PvV8bDDT%Q;==X=cljh>i`~Q*iki&jY_Eer9{ugHzIhxeDB=?w-dx9At4<(Nt zQ{-7moc#bTP{${Am{J?E8mkZO#Oh=!mVao?1nYQe9gR7wtQ}j9Ucc_Rty~F%VBGG- zyO;g=-7I;s3dE;mHLleW_wV>#R{U}f1Nq4_PWr9?(Mxpu2z{@HQ)!XOk@IlBJ=8mD zIAL38a}kyg54?v5L DhB;!w zMQoczMb<^!$LN6P wv|;nCH3dj@xn M zh=rH*miT1z^(DQ%w2ILmB#0RwBWi|N^)YtJL&ED5tOlq0%TwD^-4>Srs#b?`Y7%2L zus+lK;?I4$z|Q}3W!I?hncick^sfXv+)w2Fg`54w>`!pN mp-eZc zB;FKp6v3leTqu05tvT@3f%W<7Xdy16aOI0OR(SKy!4xsBoLeo?@v v$Kh;Y{Aaw&aY}=>LTnO?Oye~s~;eTH$uAZFV<@A$1{@i zu6{|JLdEznT;?jsDvKYDEoq&Iy^4NTO3Otbar#r;FZ2oJ;kfjDqKsnW!^59>zIV@Y zswU**ufkVTW#?B0Yx$}W1+HPZY!?C7;MRT-Nh&YeU( m4$zuOCoPbvhlh+#0`E|O}I^=||;jS$2%Q|+7 z+bG=cBn _EbCGx*F7`|jS8wS)`lu9f{|nv6|BV#s>Tgy0{gODkxr6JX z6)(qz6fye_EDxuMR$qcIq=>dZfp4XVv@dZeH$>cRlv`Jv{!;Jm*BZ}$)Ol=^TZ^p) z-AakswcR|`wYYKlr{286UtFRJ6Ib2cN{jJ7>dh 5Rl zx4+?%-TEK&TDkGU)$_m0jaRN(d1G~9B|C`!IneE#0prBN?=f1eyK}z&S>xmawYE)} zoQ1EQ-D8bs&Mn7@aiZ)Ga9VM0OyN>)Up+jOABl^8cf7dqgWm0LIHiWdBjwt2Ln|q6 z-@sI{d$+Eb`3HtZ)J@EHYtVQ98xfVR=9ckKulp`dY``>qWY#Lr{$kQT5) E 1fIj*|j(*yjMPLyAoHk#b##Mb$( zI;s5_``7x3V&Of^_dOFu+26otCW z^CyYjzvW(J*cWva1%KC@JzCU)$ztg5dQ*MvWYPL}gi4mhZ$kfbe^g`lkxlR65&GDn z^*2@@)v H3Tvz>X4~xH8A|4%Q4^P6}eO(S^T@KN|v#6@^VKwKk2FBbt zH($d&L!N6M+o->AJ~?CV_ipwXgr5;`2Kfie@n0^h|MOVd!$myh=2qICi~QSZtPyr# z|Hh*7*ckmEoIU*42f6=|Uk?u_)kXjRrV1Wl!14Uy^~XL2{k;=g?*8`JSc(Q7=pR|W z-0Pz3 v+qbv3uzbjMMLhImzCLG;3T?{UamDy9AehQCeEG_I7Qv6+5 z7r|leouB?Ze|=sS&hdw*i^+ytdA}+% ;>JgLyo$Q@)hEssDMj6a!ZPQ|JNA=_j0pPuO!K^) W z_R5t5i`ED2tM87_`UpiR{&Gs?B r{dk>xLhdh~q}!5(XXj!y{1-T% zmcq(7XtkJC5o@=69LR6PYB@vOU%XbcSh?p%V}@b`@#E@w5y$6+q`&^@u;a6Vb&GiP zESI_cTgwj5+TbtCR*Nk@II+xMEuKNa`pVVfDe|_};y(3 so+)Gh7i^dAZ1vhb}z;PdTDr+>Nu#{3EqOYXciqHSrnAXYN5v|A0&57)|-qsMx& z6M7jFU%#_hGq`tkK5)ai@X8PJyEl9#jR%^oXTJ11>qP@Uw^sU_8^vBfjJz!yWz-_( z)t(b@q!^wA7?0=C=$^9BM{g1z@rqlUL?wT>H}uV$#X cvS?&CuQ7< z>921Sx5~Jc_uq#8Vv~GNWEz(zZQ( 4P_=A~SHj0wv+=4<6zAbn8k-L5gcQ%M-g&0O$ z>c <2jR@(o`8r(s3K*95RFT6p zcM7Rt>3>M|VTqz!_l$mZ@O=2sr`r&ZhbOT 7}@F6`!B zaTS;Nx$TpMXZala Sz^<&z0LvRWP5L8^3dS@`;FZLDs_-*xTyCF&qbc{R$tD!{th7?5M7# z7d5oH7ehSA;Ul!FSR*P4KagJp?6{Iw{pQr^2~WpNbH@$f@H#;lnXN?|7=*>cfcF^} zZ@e<_w;t_R Xqb}sd+iq4v6n@t>5pkC ga5#6+c#YdqwU~#R~@U z>D=DO#q1jJ@JsypCp%};CwsmRNUl}d8ZOq<&0k)yRzP^yL?yB=zbB8|BBDF(tZ7=J z91E&?LdGC7>&TIW3V~B~4G&%7n-o5?oxi2xYE8G+ssjACYAi-IKFDsHwGccSnjqm* z8}qhTwmi0K3vU&Ac~$ooRzpxzpd&F`w62Xv_R1FhYP+?n^yEkBcdEZmxLZqHsO|O) z_I$pE#U%_JkubP-i!NuY+^D&=>Pb<(j$1iAB^M0}__>6fZy&cGv$Es*^1crsb5N(3 zYG3$4@sKNpL $th_e^45Ats<&JS^6ZN&gZHq?gu|RaLe<>s@2BBm3XcB jHLGV`w@|mNbwO@FCy5?w+=_@ = ({ + width = 240, + height = 240, + fill = "currentColor", + className = "", + ...props +}) => { + return ( + + ); +}; + +export default Algorand; diff --git a/src/components/app/Compose.tsx b/src/components/app/Compose.tsx index 5da29df..a0eaa80 100644 --- a/src/components/app/Compose.tsx +++ b/src/components/app/Compose.tsx @@ -1,6 +1,7 @@ import { useWallet } from "@txnlab/use-wallet-react"; import algosdk from "algosdk"; import { useState, useEffect, useMemo } from "react"; + import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { @@ -18,6 +19,16 @@ import { useTransactionContext } from "@/context/TransactionContext"; import { quotes } from "@/assets/data/quotes"; import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, +} from "@/components/ui/select"; +import Algorand from "@/assets/icons/currency.algorand.svg"; + interface ComposeProps { open: boolean; onOpenChange: (open: boolean) => void; @@ -27,6 +38,19 @@ interface ComposeProps { // currentPath: string; } +interface TransactionFeeOption { + label: string; + value: number; +} +const TXN_FEE: TransactionFeeOption[] = [ + { label: "Default", value: 0.001 }, + { label: "Medium", value: 0.01 }, + { label: "High", value: 0.1 }, + { label: "Priority", value: 1.0 }, +]; + +const FEE_CAP = 5; // Maximum fee in ALGO for custom fees + const Compose = ({ open, onOpenChange, @@ -34,13 +58,7 @@ const Compose = ({ isReply, replyToTxId, }: ComposeProps) => { - const { - algodClient, - activeAddress, - // activeNetwork, - // setActiveNetwork, - transactionSigner, - } = useWallet(); + const { algodClient, activeAddress, transactionSigner } = useWallet(); const { broadcastChannel, handles } = useApplicationState(); const { loadTransactions, loadReplies } = useTransactionContext(); @@ -93,9 +111,9 @@ const Compose = ({ const transactionComposer = new algosdk.AtomicTransactionComposer(); const suggestedParams = await algodClient.getTransactionParams().do(); - + suggestedParams.flatFee = true; - suggestedParams.fee = fee*1_000_000; + suggestedParams.fee = fee * 1_000_000; const transaction = algosdk.makePaymentTxnWithSuggestedParamsFromObject({ from: activeAddress, @@ -126,7 +144,7 @@ const Compose = ({ } setMessage(""); - setTopicName(""); // Reset topic name + setTopicName(""); } catch (err) { console.error("Failed to post message", err); } finally { @@ -146,6 +164,35 @@ const Compose = ({ const quote = useMemo(() => getDescriptionQuote(), []); + const [fees, setFees] = useState(TXN_FEE); + const [customFee, setCustomFee] = useState(""); + + const selectedOption = fees.find((f) => f.value === fee) ?? { + value: fee, + label: "Custom", + }; + + const { addCustomFee } = useApplicationState(); + + const handleCustomFee = () => { + const parsed = parseFloat(customFee); + + if ( + !isNaN(parsed) && + parsed >= 0.001 && + parsed <= FEE_CAP && + !fees.some((f) => f.value === parsed) + ) { + const newFees = [...fees, { value: parsed, label: "Custom" }]; + + setFees(newFees); + setFee(parsed); + setCustomFee(""); + + addCustomFee(parsed); + } + }; + return ( ); @@ -268,4 +381,4 @@ function getDescriptionQuote() { return quotes[index]; } -export default Compose; \ No newline at end of file +export default Compose; diff --git a/src/components/app/Post/Post.tsx b/src/components/app/Post/Post.tsx index 5662e27..3a1a50b 100644 --- a/src/components/app/Post/Post.tsx +++ b/src/components/app/Post/Post.tsx @@ -1,5 +1,4 @@ -import { format } from "date-fns"; -import { microalgosToAlgos } from "@/utils"; +import { formatDistanceToNow } from "date-fns"; import { Button } from "@/components/ui/button"; import { Card, @@ -31,6 +30,9 @@ import { Link } from "react-router-dom"; import { useApplicationState } from "@/store"; import { censorProfanity } from "@/utils/moderation"; import PostHeader from "../PostHeader"; +import Algorand from "@/assets/icons/currency.algorand.svg"; +import { ReactNode } from "react"; +import algosdk from "algosdk"; export interface PostProps { tx: TxnProps; @@ -42,6 +44,20 @@ export interface PostProps { avatarSrc: string; } +export const formatPostFee = (fee: number): ReactNode => { + const feeInAlgos = algosdk.microalgosToAlgos(fee).toFixed(3); + + return ( + + {feeInAlgos} + @@ -189,7 +236,7 @@ const Compose = ({ + + ); +}; + const Post = ({ tx, parentTxn, @@ -67,8 +83,6 @@ const Post = ({ if (!("raw" in message)) return; - // const formatMessage = moderation ? censorProfanity(message.raw) : message.raw; - const formatMessage = moderation && message?.raw ? censorProfanity(message.raw) @@ -94,7 +108,7 @@ const Post = ({ {...{ topicName: formatTopicName }} /> - + {/*
*/} - + + {/**/} {replies && replies.length > 0 && ( @@ -182,12 +200,7 @@ const Post = ({- - {`${microalgosToAlgos(fee)} Fee`} - + {formatPostFee(fee)}@@ -228,4 +241,4 @@ const Post = ({ ); }; -export default Post; \ No newline at end of file +export default Post; diff --git a/src/components/common/Layout/Layout.tsx b/src/components/common/Layout/Layout.tsx index f29adb7..8a9fab4 100644 --- a/src/components/common/Layout/Layout.tsx +++ b/src/components/common/Layout/Layout.tsx @@ -257,7 +257,6 @@ const Layout = ({ children, breadcrumbOptions }: LayoutProps) => { - (({ className, ...props }, ref) => ( )) diff --git a/src/services/providers/nfd.ts b/src/services/providers/nfd.ts index 7503100..807ba9f 100644 --- a/src/services/providers/nfd.ts +++ b/src/services/providers/nfd.ts @@ -20,6 +20,8 @@ interface NFD { }; } +const IPFS_URL_POSTFIX = "?optimizer=image&width=256"; + export async function lookUpNFDAddress(address: string): Promise { // TODO: fetch multiple NFDs, up to 20, in one query const url = `https://api.nf.domains/nfd/lookup?address=${address}&view=thumbnail`; @@ -60,7 +62,9 @@ export async function fetchNFDAvatar(nfd: NFD) { // "image" property we extract out in a secondary step. // An NFD avatar could also staright up just be the image itself async function checkARC3(avatarIPFS: string): Promise { - const URL = `https://ipfs.algonode.xyz/ipfs/${avatarIPFS.split("://")[1]}`; + const URL = `https://ipfs.algonode.xyz/ipfs/${ + avatarIPFS.split("://")[1] + }${IPFS_URL_POSTFIX}`; const response = await fetch(URL); if (response.status === 200) { @@ -71,7 +75,9 @@ async function checkARC3(avatarIPFS: string): Promise { const data = await response.json(); // ARC3 JSON object with data.image set if (data.image && data.image.includes("ipfs")) { - return `https://ipfs.algonode.xyz/ipfs/${data.image.split("://")[1]}`; + return `https://ipfs.algonode.xyz/ipfs/${ + data.image.split("://")[1] + }${IPFS_URL_POSTFIX}`; } } // IF the content type is an image, then it's the avatar itself diff --git a/src/services/wallets/index.ts b/src/services/wallets/index.ts index ae83b4c..b606da4 100644 --- a/src/services/wallets/index.ts +++ b/src/services/wallets/index.ts @@ -23,7 +23,7 @@ export const walletManager = new WalletManager({ }), }, metadata: { - name: "Casa", + name: "Casa ⁽ᵅ⁾", icon: CasaFamiglia.Assets.CONNECT_ICON, }, }, diff --git a/src/store/index.ts b/src/store/index.ts index a1d0a28..7f67f5d 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -9,15 +9,17 @@ interface ApplicationState { setBroadcastChannel: (channel: BroadcastChannel) => void; handles: Record ; setHandle: (address: string, handle: string) => void; - theme: Theme; - setTheme: (theme: Theme) => void; + customFees: number[]; + addCustomFee: (fee: number) => void; moderation: boolean; setModeration: (moderation: boolean) => void; + theme: Theme; + setTheme: (theme: Theme) => void; } export const useApplicationState = create ()( persist( - (set) => ({ + (set, get) => ({ broadcastChannel: BroadcastChannels[0], setBroadcastChannel: (channel: BroadcastChannel) => set({ broadcastChannel: channel }), @@ -26,10 +28,17 @@ export const useApplicationState = create ()( set((state) => ({ handles: { ...state.handles, [address]: handle }, })), - theme: "system", - setTheme: (theme: Theme) => set({ theme }), + customFees: [], + addCustomFee: (fee) => { + const current = get().customFees; + if (fee <= 5 && !current.includes(fee)) { + set({ customFees: [...current, fee].sort((a, b) => a - b) }); + } + }, moderation: true, setModeration: (moderation: boolean) => set({ moderation }), + theme: "system", + setTheme: (theme: Theme) => set({ theme }), }), { name: "edaga-application-storage", From 93485b7674c30f229e325fd72da62907f379a9ea Mon Sep 17 00:00:00 2001 From: Leslie Owusu-Appiah Date: Mon, 9 Jun 2025 14:21:57 +0200 Subject: [PATCH 5/5] fix: remove input style --- src/components/app/Compose.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/app/Compose.tsx b/src/components/app/Compose.tsx index a0eaa80..c162206 100644 --- a/src/components/app/Compose.tsx +++ b/src/components/app/Compose.tsx @@ -328,7 +328,6 @@ const Compose = ({ handleCustomFee(); } }} - className="inline-flex items-center gap-1 rounded-full bg-muted-foreground text-white dark:text-black px-2 py-0.5 text-xs font-medium" />