Hv#)$06=^dv7N zT>r=I-=}BL<9yv-YU`AWzKf-CTej7)r$4Q^GN0VuR^rr3TQl45RIvAQ%iI7ZXIE-Y zS@3&_#{2Fk_#f_sza9!CZMe0YkXRP(Y@ZbRy;uG7S+u^OvqviSE|&GUWrk;eyH%~C zMd~0_8)FW}RzIX-8;#x8+D0cPIm(;=`2D{9A|*;*``(pZ&+<8EsorjF zja*5f8wZkoD1O_TZri(8sLmDTT#+v3bi%t(368`8-vUx&>`=deFxzi>bx&XE3&p*+ zeW^oKYmBLPYqT0tM_QJjLuk##1K;>{y}5toR`f01ca`>+8{f&iCiRm@$e$x?C$Cri zDShVmrWDy>bg7VYs18E2F-D@jvbA{Nsx{Zl+99OYeka-AyRL662F(Z!r}a`IB&->W zol4!EkmfkpU-5^2?|{LjZ-u<8e0jO?u(;&OxTVK!B_0MpZvSSOK|QpeU>l)B)NYLF zX^Z7=MlRw L73swc+YNz+ex-|uG+=T}^d%j`9Yk|>F9T)_Au*?8}v*!FIRw!ODa(;+@+ z?6t6_`zHK~mi`aS9^2f}f@zWWu=dAwn;%Gz$d*ZrR2Torb@BJhuU}iWzBruKONo+* zjB$^)$!`@4wf`F)^ZP!-tTDTY-ds{^%p*z3Di=HCX`WAY4SVN$GyLB6lMce9@trJs z@iqQom9Wdd=6he=zRdAW`&6fD5!|j#TIns-e~;_T^6HY{nTzh5R&C#GD8_57s}Va{ zQ(VV?)4lE||aCM{SLH+jczKO7b ;{{6w!pZ0tm{R-Ge9`O!UshD9Ro2G$u4{hgvz zO%T?{AqhKsH+jUIt5R3)VPj)2#B8{Qp#DyNS}L>W*qM3ypG~uTBqhJ}#5f~U{}kMF zFb2xE`21e*SiuA7Xv+3>#Z2Cmp!D8r18 F&zo?TEdI z`|OtK>!?faoz}-X+Kkt*95QTs{AND0ZP7tE3VfMzrk>BzQv6Mj;UfO;UcdMYuKk^5 z*1|5`dk?^ryJFG_qv{8Nn>wod75#g|J@<8%kF;cCY^ J=EX--eBrVNGFW7aa&Uy z)-1EMME7XSogXglrNkc}e|2zgH}|_tmm7^zO?#UTw{A9FO$GtoaxP-e@1EW58jh(9 zk=)m|P3m{pj$rz|{n_1Pjt}P)JD@Q;8dc{u?(S)`uD Ol-vr@Y15+4={*- zN!3%sw#Hty#x7utbd%5R-BEvO+pmLgvks&O4rx??sfM5b-c9kVrmsCj+?8y?;$vAw zs^3ctjKcql*dzBWt9z86#b_?9V`?{#P&4G?s2}#8HoK>ALd0k;$!YGR1g;YOr{La$ z3_X{ehjfTfbrt9?|93Lu-ZMv6Gk}jsM@mYL?6|B-^MhLEp$vI4cVUTt{*hcQwpohc zVB<_x7bdw)+@j5*N{bM_c}inSyD#{3X}Gl44|~78&6li@g?kDX=PX-I5_9^RHDj#h zT9NBLPMaGxl|y<6g!lX5dFgaiUe6r=>R>U>Yn=%@)yc)3Se$2TMfA&$Uqn{Mn|Q1F zTp~_LN{d=Mqf2QnBn_k6T%ufl4qfX%CJ@`>mJe_fcwHr%PvbpRWE#)vW8qfnj_~4C zC-9+Xb0Li)?l#gKyD4u@`XpG|eigZtM7~>=FZN1~6pl_{IuO3NWSvYK(A 4${Xc|s2P4VI#FT6g7`f04q|b3{YFf0 zXLwK5Mps`xjTz0#L$HQ>W=5bX+h3NN{V}trgm};q23}!5i15|ETVjK<50c+91_BzP zT5ir)oU^K`f)eR9)hzB2T`Lm`$<8)nydu4vI}@#|;n?wziOUBe7tWl)u+nbIk*$%U z^&6Glw;0$@tIy$EhAqxFQ^bh;fAM;sZ ~VESx0%AdX!* zo*ey)r0y?*37~3b&%zng2~Oq+KOEYJ<2SRz_|~kb542dHXNNwKWwUDFEHC6BJZ2kj z2DBI@vXbSpLx`WTwCQBD=egFg&7le5w1be30Vys|&y0qdEk9*9AD?8J ij$woU7Q_l31Tk>R;(~lCyaDhenw4e_qqhX=jXn2S>98naY)OujJQeMD6 zhS^f5mQRyo9Ko2XGSeY=po+RbutymtBMT?#fBf!OMlgS$0`kVQ%eVGLSALCu^+2g= zOOEu1V> PL6J4G(NAQQCC|J+=(>jo_UI`Wh5I&W*psN{TJpskqjyp)JV(`KS~ZS!Rf; EI4NGEeAawBTm-K`j^!{E~FIL z{*cU)Y_a{6DeY*tks4W*JZCL7H8L1>@szRMnb4r7xT&@GVdnR9qzoUO*$&lX*&mp5 z8zxh&Ow(>`W;g0t8t!TCsQSd0oV}~VcLL7iIz-Qsq@7bvYE%I_55fUX?mWVCzQjPM z&F^m0uU?IR%oh#ROs>lBF-jEKC{()(i?MEjK%x!!N2%8ZeH>`r6-qxj8v{Cu#oUY6 z@=dQf#6Dkp?_}OPlJC4xT0}rt>>tuXIxes2?OM~ r28;PxpX`0JO};<%vw z5h*U7OC(=8@_ (H~$-e)-hX^v(c43+3js@Vq->sNwd&TPHHKW zO?Q4Tn-|1^6|HrwtjXkrX2hDOX2~UIHmw+a`x %V+M-s- zXuf600`SdI1?^uhyGBlSvZAd%MO+f*Y{Vzj?le92>tLfB*_#_zo@B|PAF5mCRb1PM z2L;u2w8Q97N0^?k)#p_9?5)w{{G(9#&yR{VR!4u)Hk@6$!{@E%I)OaOHl9w}j4S+m z;z|Om`@ysW*ZK<|4nLO2OnEbT5TYuk`100u#km4;MSMN3s{d1)m8snBS-b6=G_mt~ z-qth2&Ua}7z`0<8Tu$`Z#QP(D;e@(_boq2%mx_p }}0)xb->&Bft z*1je#r1ECx-;!y@-!#EwY9VtYO31aNs+ x%sjj7xvg9y?c>02bp`2 z9yek*yV}wTn-{OuR-7jHRhN&(Z?gaqq$qaORz@n2b 4;A2d* zR+hzu;e5n_Cm_@>{OH_9jbcgq`2mXk1>tBhC9aoV)!76>PQ~2FId*6mu8L|P=QE*- zy)hD%FV)Gjut})RR*2d)%h|5clZ(c4$owY}{0WY;I38drb7%BVjl` 8de-LTq@5g{I}VdX@lr#|Aa89oE9XIEhL@>g zl-1H!LP|k$)>n63m6hWQ`2+_ph?Q0nQW4L*E33;RIz*qyxJHMyaN*?)Ko)k^XlZd> z|3Z9y(4AFb+zHY3PbZbl CK)niRN@E}nfN!^OvWDKOdPAQ;e zZM*BbvmtQnW*@m|oUvOwoXL}#MB<@cGO}Jbqbnz~>*?)T1pgcUbEuni$9tVigwj?k zHQ7gGnp&K}@nS#mK^t2 ^nJ~dPH+B@%0XL^Tlwb0cD zln4uCIUKvd4RlEDcS0biRrz#$Vvep$SMk>0+hVH&G21fHxpT_n;^QW7#T^EZX4<-3 z4Nh5hOm?&q<9k4MJ#+b5 LpDlkLe z#^X>;%;O~YxQp-s!4StcN*kStJ;>W3I4)FqZta@xE|>RPj4FE-;N1_D26h6boPlXG zl(>#>dTe%g)zmI2m|Jk9hIqUqPA{c&x(_62E~$}vn<^drG3i;BFmAkk&L?hm;Y*Dr zrFc@h%W_M;hj+eUX+utnkC@OU+-o9Y+qB}60CIDitf|oGkD-D*a!q%7-utR^MMk6o z(rmg95<*QoxLf-4T#T#iHG#*G?raK^{_woG0SYmO>k7A05S4o0_2UQi-RIGhtk0qv zq>zP)@UEd~l%1lZ5w93KR8)gE0CO~(rBOfA-E(Pw;B;{0x8SiV%d1}_34y<<_RViU zJ#(gZ_DjdX5sIoA_j|9ms4EgI%H#YdxH%P)-0GzJm|hR*I6awjC~!EM%vI;F)B9xY zzXCu;xz1AmSh~<;<&@+%uEDRvo3AzdMF-LKoPQN2y3JW82B)~#&7FYu&jKar6DhAB zIJ)0ZHm98xN=V3>bI0bhz@2QEP^Ie+ldgHrNzL@|K~0fHa&o?-eu~sT)N_`r> }6MqEH263Vf!)w>4eZ7(NR30t_9@rp0| zHmv-LKc++#W|+VH(+}=oqiVWHyINmQE_nF#oX~ +lF3j8OV*^|#Nc~(cD@oPQga19`J!?x5yH7qGo>UBjwp_d5+kY{rzr36Bi zjAl470g5 I=x9+L^q9&kz zS+e+0bcWI(VCX)!Kw?}?wRi!uIGsCpOahyy&|n#TGyl<$ikyJuM(o9x0)k9t|4>%+ zQ1xl=E7OlF(HA_tMk~V_xqBSNwS{ZF?Xx_)&bMCp!f#; |EzH7cg5KUDk(;_{dBAB;CE70P5RsONyLb%z=lfo!6F?x3eOj-6ZFv52 zjad*AaXERd-$(92wwV^U5 ?gixDfVTHxH=gYRt#ItY|y{LX$;-M<0= zN_9ODz1HaAaf z=`=KX6|*q{&yaE1!f zTg~xTGgV?wi{0{gaQ#dEnC99}t%+X@M9B(;_AxJEN7^}8X@2)5ziqYvy6PY7=~QFg zi*wzCU0mokSU~hE#EyLO{C>A^0+(VW*_0fl6u%u4t`m8a9Vi?IGYl&a=l3e1;d$AO z&Ngv2Px_kvFQqd=JkyV#? p;|jnMC9I366U5KX0j*FP==) zG1v(ad&}>gw^i1}reRv{w_3xK_r&&$5EPuMNsJJLYfDz`^74dB%gqO`9O(DQT**KG zXLj152TMes<7YHQF0ZUvDU=;;O1<+`f7 GYe?GplB1=o15{Yd+ zBV-(#;^GL-co1S4IGF0H@%$RwyKr&^DE6wOiYzl_JXA6kEP0z!zu^-vCLhw1$AOx+ zm1j5DHH91yb7zt%YKDK0$YK=&BJW$<)(9EGQEDgtXlZ6gQ9qJ6 0RE=4rrWj)TKg%6^O5uxhvr?97}atR$tNa^P2C8s~W#y!>ywHqkbN zA7*svO5jaOK3| DlyrB*q` z+*xIMck^uRo14w7=K!OTU|Qkf@x$fn*J8WlyP6jg;)zr)l{Mv49?#O9ex(kR;ZZhs z&*$Ae>D4Dfan-#hKkDc}YF?c(y<9)jF -#}O5bCoOctH16>_o2V*0&75e7xm zLnL!E>0Lu!ayt-|G3UE5;nlRp1q~zAP_bMu j`T7ep+^l*n#kgU zs#31avnyGWVJR-$R{1&xcp;~EXMtrOxu~Cjjpcu7ev=1?@~jX~LW+wx+koF1zKQVj zMt@bQWnWEYqBDgjpXghYh^;D%7lC^6- H$`SwyJpe} z`wq2N0)ShWpAI8*hlpibHdI>sRKvUDCV-}$q0%jE(0 >|1E1xsUTFVQxVNuyLX&_(zZ`^wjFcB+ zNBj{bLEo2S1F#NXqesw@ce8zKcv0086^)Rg6 4p2LN*rvU*$AN=dZg}QO? zCfNunf6O-1qcm=1a|*m?^&Q)7m0Qrlwq~QWBa+z-msP$B7jNfyj2(h}loJY__Zmo= zP$Nbj=j2qt4U<}f`u=E5Fr+MJaT&m0!*)Z_pq^hOhK}ByCMnZfjK9a8Xwb5MKw}4W zNQD&a!h3w9FkjlY&Gwb_O?IUdw6%x&PaDJm@qI Wi7;+ HEZ (1d{wSZ$rEE?0qk*KtT~zBc5vkGrThBvvMa2y;$szL4uI}kAxdJ zZqxJc5>-Br4H|~hIS?4)^@x*5w68S{^V^?4xkV~UGJ0jn*7N~)+yKUHw9%+E!QE7^ zUxy-vrycw;=Itm<9&hcdl8!zOZJZk{ytgSsSOVu%j{}@gejIe00ppq0 A+!v;GJ=)I`+b7<`=lL~**-0FDZ>^jdB?LX=Z=i{0$FEW{^+hd zcgkSW*76l8QX5}EklBg2EOg~-yNm%Wv|zc?`RO*5a{p0OnKG54#ig`F55{OE)}Iq4 zP5AnYnz72}eTw-Y<-_b$Q^(b?Y*dRA#fR27WawF{_l~dm4vKH~QSvrkbE%e}R;wo= zbm>@igD?I%$ixtO>9^{S(I)*|T)ZLd-ViFB7yJCq 6Gz-e zX-cpzokTIZ$Sa#m_+!?U&AaR`&Hy*j{c}oN$Xl_VvkvrqrYjHQgGz5JEPc{nT473b zqN-X379l|w0;~k^zzm62G4%Wj`fbCS27(Yi@azMRFa437wFAx%+oTpB+i20sM~DiR z_u0d_!cV&TRBxWCRoYJnOYaX#X31g3+8k_avj1cPaQU-?IwdLMe`bI(fboeHpX4rA zpOwb}f@Q^o(*K#YDNtG)y4bBs@eNL5wKB%3bi~JKzfdI-L_BKckY@yTh7namHHzUM zfx19sUV3*NDk_I>`IW2m$S)GhZQy9kQY`af#0;@3?a)`H+g(9Tp-qa{o oi?w=y+A17E SUF32&x$i8c#*6~`7Df}A9v8ZsqE#wOEXL{NL572|YpR9No;|8h? zXQKsIXAuP!i;@ayN1!=Z;C8KJKDxUI2!?HIm2!$2_G;_J&~3l(q-Nm b z(3-!vI~P~;NZFjq=yb;qFvk!huXhMSv!_~ZzcnBu?+q0;T#6@Gbv0;GjzT%l3aN8J zkw4THO^?bf@bG5?M2DXby%e&4$)`yrDUBJDC7^6xp&OVYo>1W`LC%&NL0`{LeqeWg z$Xs7h #*4mh4}7uXFa1 zKgNPFaMm9qm&|Pvy1t->UD(NfsT96HP`HZpmRgz-mQ1==0~tHjqzf|?^T#~-cu{%0 z$Su!dgE0Paq-bj^H!Pf1?1PdYbF=AO`>5ztyITjT$Jvtau|iG)&&`6<18GFoW8foq zge^i|iMGgF?^3n%$CSZwEk~$1-*x2|bD(+Pu#^6|xeKJPAC*J}YnecCdtT@g;u9xS z)CUwUdP^+!xqLnpKZ;7rg)jpUDRzdo &Xm|+ae z9`V)^w9j{anEUzOhZL752O+JApAH0`*5?^5!Ph&68Vt{Ec~Wk-fR||oqdx2ghCy8? zbs3y&?Vn=w_UxcuNy_rLUqj7K4LNId-!nT_$XVN9%jHGis;}1M`egWQtEaL#NqJnR ztV-Ub{t3Mb32T2W3`$@@gD!ik( 2#P1PXzK~3s69- zv%Sqr6f%F#reV;CUu4tg)3;p=?8iB;NrQ(l8Of@01=1mqS mRTj_P_87@Rwotp?+!3gP}H{ wQ#H)Q-~< z)KhIYRJo+u?%WGH*a_ym&HM$4+xtPZ60i6Kh1Mw0{@(d6?5C9IAOYuHN-K-zZ&KHV zac6h&);3Jc&J0>awNtP`OF=0GqbcJ0f;)sm4L6dNtxGu8G(ntjaBqHfkhY!I7yj3- zhF(f$DVwtuDo_lPjmdtpl?9(8{YE=O5}bEyVHp* >LgbZ{$7e !piylUcleU5)nUg!dPHR*R56w%nc+~7- zxn?TS@7SPYx_@zjN%k)N@{J^mzxr!-LU6R5tkv2r4rrc&pz}=;p-W;y^7Fy^n~V6S zTG{cHweN0fBNjw5&;CFPZ<@^!k76VK#RMq}H4s_-SOv{>p5OMzjDvK-L-R5Bx(d*h zByUlz$1u-6Y~q+l2c->h 2>mr z;1>7ansoW$QYdq}RF!YQ?Sa~JMU@N)X!Xu;!GAQ7{Z{X(q$SDmaX~X65QB$7kG}`K zN=shMvpkP>#Qmg|9E6b9W;)l)&LpK2B(On~?!gTCmuk}!O 12dEG0ObkYb|>d5fB?fvu&LJB_cN5<9%W{9Ov$MiFC{c{)HG^sagY(E_RGLuqh z! f#g!JK5__dSmQJ11V7}dxaOH0)77bnh zYq#wWKfF8q{Z5QRFz-$63v;k_p^}@b5XiUV$FD@bO%;N&sa9xSI4s1)WNT9{Gs*n5 zuFbRzUtN3EX|SyZy)?X3m4wLOAe~SCpc3QN?{|I)p`g{HY`*a6X{YW6I>}Nsn|!ZE z=~jKYt53y`n;<|ck9z_@>`jVG5i>-AK8Md#y@G1rA1Ik Pf+DK4j# z#~;P^rnsyv?pk%Da9pjm1%@S2_X&<3WHSO%3P@R?+&_B=M@%;z_SRBb98=1?dM4X) zLTFA>lncryr*R {Jng5aV&lqiYcBBr|FEzA7{;A^+6tdx(vBJf zuNLP`rDQ7z$(v_XT_CamA2tJH!1(0K01VMo7dcSws`cDPOG)XDjVWcWfo2yP&KWNd zfGHYR&-XQ0xp(PUI6QJPamm+0{4h`S!|eY#5GZ8vYxE-6t_$0H9VSCIq@Dyn>#iJy zN-4QB1qwRPWvC|EcTP%;sLj6r$TV9dw;e*zl-?EFeVAvr3ifk$In5wW215RVPHQ;B zKW3`fHp{u#II|?`XS6?X;}|pyz-)&OLPjPX8}jN<+gjN^NX^GE!)dRJy9K#oad_Ve zcD~x0wTvBU;GNIxP7668=Z-*bM)D%!Vz`2Nk2(81ebZ5sCoS*qRZ*g8>HB%`3I`Oq zkTE7cXKcqOWPyq2yGW~! vC zfAThJM^Hj2XM10$0OA-uRBzwfXJ`a7ga#*n^P`tBF?{}*nU6s!%W1S>wZvm=4@`P! zB<)6cWmR&AkjITrMg70zd?Qd-l#s!%P_^oJQk56}M6FimmAAvC)jYAyZtBfx=Os5L zU0J`@IYiFRCM(m|0j&t@n&FeTi|i%j|CP-6PJZo)$fiZ~=dGL|W@FgkUFX_VgA1Ho zyK~+AA+26cD4$Z#P$caDs3OEg7z5k2*p *F#)$2$}YYja#;bc4zLF zuaYTOgj@#*q#-j;o{h);n2RX5`i_qQwqjXI3$ylKV_bVA0Q2erKhpXQ0a;{15a#=O zQ?*5D#vc>N7)WYg)RaL@FfojT5Vs>eSd(6)6tvj%m&55FaH!YVGS~+lgd+$GcPpIf zpU(BD0IvdwV Lqi^~ofbkTP;X|2EM>^6_#K*uM<<2zT`dni8O7>vq zOQ}FrM^?zliP`&pd=LoNG3bmm3V|W9vtbjp4!>9$>Nx?WF1|*OuaK?qW`$~tKKXVy zAAry?*c*L*mVE@GHTYdYjK~6{VOBZ1vUN%U&gfim$>X$dMNlGQB6VpLMbilkX^_B9 zobcdrl #9FduAzPt2efyS>Muw_)Cs0n>amnGBgQ;V_z0iL&|DphgJO zr8S$Z$uPlb()WzzI{<{bvY{StI$(9FRBpVm*oSrsy}0_MbEM=bv{AFFaMDTL_lU>_ zI(rWBHD>TFDO^!{Y=9mTbW?2qFyM!FJay_s-UPqR)W>ue7};InkwGDNS2jOFXXX=a zSpijO_q*c!`Pb0 Q!2P(|qNeA j# zjW3ph9+!d>dBiHxYkxX&K=~3&PC#!LaE+VBlD-fI2<7+jmbHV)?!<@y^PiVz-` N z;K#R~bm|`37gWhl&L#4(1e`S;Ek_$)kvjOl5)iZL=|tUuc}ys5uks3`s5$8=;z)J2 zD$#z46+EhZ3Qzx*JoHRl-CGL`yW)2edNc&&)n~4xVbpzG;&Nf~;qD7uVxiYE6ohyJ z{~_Iym!zg*?5?!Q#?;hdP*`dg{9zc%cMyytGLr0i=DjbhDEw6I)c4W6QsU##k+O^) zSnvJ CyT`BQ|!hcIriCbMpGvQF94YRF=@q7 z{+L0En8zQNs=klPbc)TttZ z_?YnIlt!A8;^bjS({!&|l^v0~njb&?XP&FlW=PhFTwn6bfbPyj?RMXiXw%H2vSt5q z%?*o*;!_^ab1!%Ds?V;AOedAuUl2OHLJXH>`$= Hk1W t|=g(44csP-GQFmtTIvsgsnB;hE7Rd`CPMeC;1#Gp3AV(q|gv5$? zJlr1C5Qbj|+8KC}nR6im3Vk7hoBwDU^itR#n@h~&87mnt =N^)JJbbg~DzizwV!e_mImry5FCTB+R_^5KL%HS)P<8cEjNVc}q6nc%XvVZ!nhV zauYB1M2sF{ *eu@A#@^ z_~?t=z!dQ|+*SL+3svzpztszX&i8iA5WJS}#~^;W1e05~ldlfpJk6!CYrUQxf;_;+ zaBRt9V{WaUn`Za$$aE^+eN?M3U^9%r3{R$iO$~DOel;G%=+NJO@4-)4abNv&S677Y z3ND&bMb{ x&nsJ z@GAjoo6nnamujvN{{$&9 8Y6LxI(eG0;)^uCjT3{7Tx3qO~W2>9P4zYt@Q=YSIb@ z_3!m;MmqY?2AaCCE!E`tjE~7;{3@t*_z01Y-XRThwEy^9d3 1s#6+D(*_a?7nOL z3P;0RUn>O8=<)4qrS3I=qF%prn9Ie_z(89*Fa_d`acWGa_h!GIJy8CS=Sm%g=9%`T zEYsV$*IcD*ioVW;`xd@<$<@txD^{b7#CT k-u(iu _4fC^t4XNvS&Sqih% z0NxvSc@_v;hJPn|>|1^;NL2Lc^+{%k!BW!4Pksk&*ZjCuha0;}tv&|HT&7lkBHFc$ zS=co6NaZ6%fFzKsMwDJ*k}J2ILF19AiUH7k)G=O&`;s02a^(0gRv?-c*FluAL5n zAp|vz`sX7ad7=V`0Vk~ojM;3E+x;_Nvr6gNYCXl}*luztU;&_`!G`Ua6z-+bQkI92 z$4)tw_)J4(iWB$xle#aWyl7CQGOQLA2l}XR;@M7??&kPmQZ>DbZkMgLRreg-UN;gk zq*p2Lj& DcxAf%wVM1<<{1;ra_-0Ds6{U_4H9B5cs18n0Ad hfqOsaq>fFOT(8e&S!eWhBuW^@qOXWJS@`wJI zO{G1V=L3i;WlI}#Ji2U2G4$%9PvOqutF$MR-$rEz3O2^5E@fXXvd<6t`uNSqM5Ty_ ziG^8)wszEx;&yE46NVna;V&v-as;O~G(Be-wiw^pf;V(X>xsFDNxuyHFs}L1J+Gu) zc|4h_E3JSi7_FR`@Gzd@YpNVR8hI78jMOGm&{#R_Qy!nwQxMpi*1RVPcf`4kuk!X; z)C4rJGK~3X_?1oO*!z4{DxQ n?Wz(|HRViLm(v5_^v!|6^_-G7(My$4^@lmA&)YbdBdR5We?JtGAi1BI3zeOuTj zzrKD7y#k{4V*pXmK)JF%(D9UzG5S+-t;C3j6wNzt;&VH;rAoZ1s~)u+>z#CHr2>U# z??Y8|i4e9mt}gw}tt3!^(jt}A`^ iL>`PFRf%um8!WC-#s*tiyooRR>>-I -eS9vQ%fM98yjiS _@ZLc=8DNX=U?n4 zHBrNwm}W^6)Jv0r6Skcf|InzeX{8RO1y9~4bBr-fqH`CLDRpDk;rksyPW$peeo3?{ z%_MIJS%UT4A9$#t!?7^Hs4r+h#doHG_{P|tmMuo?KHI5BTV=;Zi;5t>!J1BJqCd-x zE*8vPIX A#Uw^B{G$o_r;?&OH%O8um4-e%mk{E`NvsVrAmrcEvh$%!Gl#jo=Wfa1*a zDP!P@9ncLNA;ZG8Xb6zcxXsCcaubQyt#f%C9KL-Ds*2Ow4+9CmU%K zqr}EvON{eY%&*<#r@TdeckR>-7}svrkk44bX3o_U(X~#b!a7h1I&bl0%Njt(T?r+i z?-j2|J?(p5NFM2j*QnqEfwgY^RidSZbVd{LDnDCeeTT_Ni0$mVkS2E1>dBTdm!{$p z`AJ0`u`mNsFmZ1N-&oO@A%d0wY*Xpogt@L0u4s&o$y(G9owG|rRz~Yl>@-K+@LAmG zcQw`9hea(NSvlp3Oc8J@?;U(SvCDH&f9Nj{CktZxV4x&%9$4wKW)7C|Y~}Ha;-xn9 zDIh}ugM}LaZWY6B{xr*ZZ?aIdwk#PiE-F4*jb@urc~cf;(-f{6z6nYbgV_o1`sZwZ zQQ&)vNAzhq_|gu{Y8xEUHiv8P+cwt|6Iu~D$fnAzFAd?h2SvnYMwA>jnaBDFve)je z4Qd^*B)jf{OBYUH4E! `NfIK=N*kNCvDkd!yDX`yQ%Pp>{&=baL`pdO`DaC-2Im;(jz zEJ3izO+x03zdhjuZlzJJBDGwmR^O(x^T1cjELHR(+gn8#kHlbaJwdl3xknF72n6>u z6k@+EnJL2l*HFKY0nKZxi8jcKB;dEnt>sfu)a9llJ@UW$BlH+3bZkeX3;+UAjI;gX z4~WN@v1Klf!72XkLqTs`Mmly*k0%g~drr=;bhv9U{#mHo_1GDu%SAJ&^07GLkC{FQ zX;K2_!L2;rEya<{jy=fweNz$Cc8+=Y71X><)mLKM#VTk&iI{(`=4RM21 D7wwhCbtiV`R{v1nqQ?}a?Uc08S=OJ0g?v+^a;S97=j#d4vcanA2VnhJg za%hrcUVxt59Dk`i{k5CT6c4*n>R>r~tP>;iaBB@W&kBza)~Kh%JM%mL@R)Us;13eL zx)PAkx4;Abj)8$gUPehs{=5HvaCq_kQYgd**K^B{QG>_vlC*vhhfdKPAKvS!y4 -bSzn+$2u-CB&U zP2tS@+M2vF>(rt$4!I4`h@AHDmZ!~cm==Vk1 LvWI3HUc5kngF7`dzQM z4!v WCtl=N@V8bpNrqi_ znh(EvJ8@9Ld!&Op82*l~&TC!A^5g)<)A>Y 2&lOhWbS&%FDt2__45GDqlDG-``=vI^xqe04assqm~hkNuVb+)1^(;KZ(v35L^4 zc@NiGllAs77d*xj9>gzEujzZulEzH2Wbp|$xmc_F{7Ip(vk@Qe)$#nA?Bp8b9qx0) zhhZE_{adgV@0yLb%HE(m#dg(rJW71UJn7~6 BIA`4G*9?1b4bj)Agb9U z>J>fOofI i*rumV;Y^^O05I@U*-@I)jKU-G@PC{t#pF z5<|$?wFv;6cFjwBbSE2oJT)ka9OR$}cZR5L?EMAUAjy}yOOn3Cz%T?AF=vBzIJMT$ zL+!8YRC4P1OJVX!6zk3Z>^$C%bi)QoCi0TFKw N-j6sSVn_#geqC?Wx{fs-3H&d~N4wu^{&PP#<@?*F- -paFt zN;W8;)0h9O_#RP(c^3TlT&vd%83VC?|3g;;0S6K#G}r!@;~@n$sA3fA^xo^QgGn5R zGLYQPf5ddT616Mh|9Rit&(B?_R;1njD-*lT_<7Ai@hTD8f7o*fjw%4sOYZ#tbxCk) z`R`&HA%ku$UjHK;-OtY(jszwWt>FI=Vh_1LQAUz%^M5&-4>Q8~x$Sz$KSv_nQY$As zXXPQi{;w@uzW5O1z8m5HvCQ4wML|(6Ch99Ro^NP++wki;6|(PZ%rahiJV3 }xuUDP(|Y3rX0{52z}8l+3jlz*=<)D5~z*BpcLp$H3d zYxI)lpNqT9mKn|h89 ka(!$^-_UN?`0G}v#^-=T2%&`8fBLvzt7Zw6 zC%FhPdW%W=?`Acy*&j36{}I=++x7jk+jqAk bIdGu73q{MKtcq`2au_flJs0T7JFd z`daF7 SRrMf&ED^=UUw_a;ek5+ z+)+8iNw4#MU02cpM0pqjFEign6z^h`zt(NlKl=+G2viMMAP`#7hQGHnq#WFZRbwV? zDy663;(P0`GFwJ9ra%?HEdb%uTlHU8+;@uEY|3)^238vX|L;~sTv*^~L)(JAnP2mr z7d}W+{G=&e_{v$wXhcs|v`5d9@t_86aUW^m*DJ-XnS>jjO9*zfjScz-f=1%Hl{4wS zwBHPFdzM_qG&_rD%2K)$qM4uEO`rrk1p~dO%_0=@r!hW@zxdGzmMVAx^TdE*%ah$< zOUrf%t9v(q-@5~RqBEJ)I?|MmAGWNIplTZb(u;aZDoYL@6q&N-GsFeH{9+K6alI*s z#>bfs8!g;2#6R`EV1j@vp*M;#zoLPeKh)7|Iz@bDD|QGy#0BOG3~F2L;ZM6ols-wH zGj_upLM zp_2zSQn2lxs;m$jYnnWfo`0TMqGy+?W~V#0EHETDT9WeiV)%3|oi4aO1q-+UXplbr z{54N& V9K)*jA;RjaJL )4lM- ?b-fpE4O~ewZ##THAQ vS+y6FPL`_DtO4?{$+w`?a 8MYrGA< 2MH8_A<64`1 z`p5+j=}NlwhJ@j{R%$bUq^lM#?eeJ`r=bOO&h}wHVFFiwPjzKP1qO=%0J%gmuIJDK zn>Y1XVi7KoZyX~RW4QB;++yy6$C-CjNOMsZdrPt_o}u5@l~dYGXYb+BtGZyZC-fmr zvQpDB<{1shk3U#qsc$eJp0BsZ51hVnFVg^8`Pm{)PZgLG&!HCk2LLTYRKr9QH)y}n zhX1l|aKo1hM!9~4)`&EvvtEgH7=X_UYe14L*5h$sP+e?clV#WsCMo{Ro=to2yWDnS z*r*+kC4aS`8}5u5Ij8fa ap$a4pA|ZUKL{H&`1QcKuSFzg zx*l$|!sf9MLiheWGV0tVB@A!!JX7JNKogriWO6S4JOUUdK^OjJ2N!1Fp!Hd(>Fzlj z8r^oD!U1-Ud_~62YU+GP q2yS@cD1TmT!Tb>n`=Pi&;26rN{VL476wx z5uM2f`m(Y^{g(qx8_(xTDrXWO(`b0IKMpP7$N|5heMF*=a|NtT^3;{Y_krN6+u$c} zZ&|IlN?As!8UC8&i}CnEVM*@%Dy;psNDNKt97UAN7iSUkFMhx1n5-p5>YW0y$0eEz zK70Np14W;k(Rv|ltL*YkO_(y=Ckg$L!@V7%FHiK- B1#vxT 9$dEdz-HP${HO6D+M zGJf18FEasq8uLTH6`4>|sa3DsK+oBidV?6)>})S15tDIjn&)MVuEoL#k$@7v&G~g| z+6l#QcwQY`7T?-O^yRz9_T&d{y3g_pb~Q^Io0KwF!F{oZ
wZ10; zUPp`|$Nx;=B=E{f#Gd#dr0C^kOlSvcTcb7O7XF&$(!oB vz6^&SCXtt!@*r6#flG9Rp$vlHNz3Y$`A*ULcjuqXrXY_XZb5h7RYlSa zU#Z-&p7pPo6Ku^@us5_ID>wV4P*w564l|_G4Q3IYA+0ou(V+h7HJ!qDaUFxL7D)L^ z|BNRETK!(COFAlXY+?UUql+O=JyX!4BLe^Wg&!uD|GxeKPNCSUqm2wy-q%h;iWiLc zYuylo2TfEHeP{&RnH%UTOxL9%G&k oYmXxnyx`8AA?GJ@+o3m+PSJ8!9^6U74@)s6+l=N+Z{)H< zKr{m(Ww0d3c|IbsOvw+kgAK>g@DKw3Tts%M#agJs_zG%7QQWVCKsE94i ib99;^HeZ6g z`-1;W`cJsXPjT$O`$ri^JXaOzK4UA6g)49ZVc0|!2N- v2A29pH!$?1bCtK4eZX%9#`hYo z4_+*yY)4O~D}Fn%T&}d%1eT5dE6=bFBP`ad&7AI`-cP}zZe1>2v)C|Imf!jJw9wML z4kVz{`n6$IY47Rc2%o#oXNPC=`fGES%<`T$@2{^n-3%pI`X^&1$q@wemvbua_X|(o z^B1coSEarkoZn*&?liQ1&ucb)puvLFJWW1dyha|{VcjUcv@}W=tGAXTn5woAi#x@xaQzzVSC9|zKo z4Gb=3Snr5ScKh6P7JguYwF7n3701Rfc+Ie#l7k82GwZNDen3qd)7buL<@7Z^geC$# zzWqYSJ$*>($kE;JXFtmv%~ePK==vSF`mb9MKlPE@T+sSE{X_8>@mv_+jJBZl?~gxs z)Y7u~?bjSt|3`Wwt96O}DK4AHB83ppc@4<+vG9P8IxPCrz23q_GUD(l?K(MWYUowi z3S)s3( C2#-&4S&j0mfwdu~LKO3t*jR5v#5{?^5!M^i !t|NzNK?xQC)(8VN|izvAgf!0p8P=Fl=QxJf<<_g5zlXJ>~L{v4i> zoI}2Ky%cNnuM_()gb>Q&Ssm^yBYx}fl77+84_4DU;j>Tva+YVGvl7sdj6hrKje1$j zTM!0yv&$AiZ3fuulL(*b%rzS?36s=;CUT473B|H9Rm@O8HUB&sj3+zOFn)FC1{hHE zgp8e*%lJ#rgN~I0*{jXCZp=MA4f+y&T0XyQuRXz;=fb^a*i;Buj~AZN%?9M$un&&7 zBodIaQl@(`yw5XgId|?V>ks14j;9_8SXdWqVyVigu4OOsISx18C$1YOZLwTdCLtRL zuK4uK?>-`PAWX$z2lHNT;g4oR(KA* iCwqi;@kuFz_KL`vH^h6oe(Dmh(z>ywdyr;Ug`wJNA}=jC2i z)YPv)e6tP_(P8ydwS&|pfvHMY`L@OFhB@hd!_XgXZNjo?A38=TH+J$9G4juC3p7B% zGG!f4K_PG9*)VrGmOTFYkb}il+|l~1Vy0k&mumZn&p72mCEryr-wo)YIkbSk8oA~Y zGvuGMi#=-PV8gvp=Ghyvgsj4qtQ6-1N8id>?T2 CZzUoQ zOJtwKNHDS;jh!YnxnxTBbTc_FFzMSRwXy&ffE0w+x)M}L4ReWX_3oi=dnbnybDh`k z=B>Hwdq=~K!OzZDzTq$gNB@ppq!TTvd|-4sH`sSx5hbw%*Ts`h)Zp<8#`)Pbus$_g z5tBXDE~->;kJ=wymzjr9;fmc0nXSs?4?|o_YV?pj?s8UM$H#_2jQ+*L1y;pO9o9zf zfa9feJ$mDKXO}_VdIP3$+@JD{)w&QZLYl!o=dOtlBeNli+Tq_iNy3`SWGc!_LJl}X zJDSNrdkkwYSwx-`j= v1Ex)mx+kPvzY4A;v4CrSJ}>vTRpvS1vIW^4?JDT&b@=Xm}MB7sTp6FUi;RH zWFQUg@au??*nGxj8kiiZ>h-Cho;Z9CaJZ+shCw}&<3sGvn#z8WfZC2r7IIF)fX?sO zY0P&PEq#--Pbl5Uh+n42z|%89jQ!B!+MmU<^j1 u&t{!+Q6>)=4MToj|J^*s zCJN3i0J0BrEo0wF*YIfJ^TWlI1_uw$Q6d6Hc1w#actKKDtW>jkKW^}No&bW%v7T&% zeC+$!lEwvU6~2EEaS|o~^A%H)mzeM7=WXn1^Nc!X*1p<{W6S}})8IW3b*5S-n$V7| ze`C)pq~#qx3>y<~Xuwx^3*)S~kk^oVGH&Cm!a55E(#oXUwAE2MN7j)lKZ^GTxmzuu zAhKe`Yza=KqS*ENKjP(j{YG(7d)@d3J)-A+@pC(AY*$L}!}9`z+z7DGmo{GX<0oXK zW2S*L4_9!(DAa5j?INq6a^C%*fSA@;3j>5-?o%pKZw{ReN#{OJ>Kg^t?4cb4W=D{` z;N~3K&<^*1NG+iYN90Q}NpFosKh6Y}Lv7D`^P7tl;4L|+kH!@f<@JW3FRgY 5TrGzKM9FdO`6x!CVlwEDZVhHZ*mVfX1;Q(cAY5Lg+yj7Io8h#E=`Etea+0)&f zneMWtgT);zRR+hTNldC+X!no3Kt@Jtk7?VD2i80aZgXw5IJG|#9h@NreZEp7tZ*;; zd|%tDk&$Ps{yQ1UwEa@}WvqXzF?IYy`u`Db+G`)F(h|iirDSaF;>oCtEy8Jw%g2On zXy6wNFK*Dz>_D>dru}R!Dv)-dY5&igWaD?ILms1n=$Cm3M}g1AbVMy-k^As|{7fL? z=(F7mLX*x+5Hh(I0vbZ}B{dSt<*RG3@HMkrY|kz);7OJVhF7$J>52Pg5RbRws;U1h z8T}|TPC0Yy07L`+RNHJ!9ZQzbiU@(e<8TGyY2WXBX6_*ksJ#1SJ0o;K)3$?AxeDz8 zZ!`HnfRavaHMVar;Vs7~pqh+!7gzhU6o81`%Bsts^{#)PZ41K*L*wRJjZ)^8-yAJC z9-OnoB(HFKExg13@pNn!wk*Ic^;u`LRap2mTO$qL&B^)d7!3NF3+fH$5p1*4UD$-K zXlCwOKg(uCC;(bGnPoift} kyX3OdS5_Ul(Wya_A2!GZw98cfNsM5Ml}|hdI1F zX%vSr>?Lu)qJ3JFmEf*zA=U>B@NiS8b5XJytM_^O9db})>ly9G*=Mqf29fKb`_}KJ z?NSxv@l)mbX6D;;>?g}y#!+ZvH!hzLXIA}g%wj7T`?J;8^ulc@1chRrtLHlG?o)(& z1nqabagczZArLj2uY92$izWIi^2g ARM72%0lykD? z-T@+L6mj@;2<*1rE6tqe=w=;ZI}J@-(iONfG7vG4%r`NV329Y$85zsCgV?wcaI`VC zPN3$NN$>LE0J#!^CZPX(yTyY*w)2MDFpN*r!8`pMH@Wn(=-v4K*3MNa#Ng4y*LAlu zpTNwmQ@F6#z?k=bjhUFD=nj`Gjq7d>u^<8@q_m9=DIV)4jXG-@)sE}WyZ_ay8+zt$ zfFb&B q<=Q8A(RO_b0=HHzH>8IDjId$v&nk5!jnaHe7$*6e= znWPERHB0|h#Z|KF0C`|Ozg!Km2R-PV=b0~FSgB%EAM}Ym3|d%YO@3tfyQz%_* y~dkAw<$24<54EYe-Er|LN8EU#4vIh=ZD2+fMBDo3}X?8-NKhgK0V4H1#Kx=(1 z?C=@0^Iz9%lPaqoVv10(Mr(S_mqH6G^i<$ClgChPw6c#rh`>IZG`3DWQ1|;nMtc;J z7|dYxaif-APg{|0$AW^sPlHF#uirWWvKYgZx5wGw7WYxVe^YT2{o#>e7oA>@Vjj!K z+y6tDo1x+5lQ3d9YyBa0Pg^S>K*h{024X^0{dwOcUpiLG@{UbL9~m~4;2WMKyfAV2 zs8l7h>pA{*)vbjpT84S$17rb>z=fFZs9GsRx4Y8al>$;Ij1cG!$F(Hw$kq+ENa|(R z&+Xw9*jRdV?OQ^s4siK2l0{}^*j4XS$ *Z|{ z9fjj=n&1Lf_rC1bfT(lpRONzsa}fczeyt>k=>?kTY06{CyVI_4(0~#*vhb%Me}&Z} zSjSr( %2{}edAro@ph;5)aDH00pAGj#2>vB}Pj09qv zrEB xgdzg$Kp0Kr`sC0)8? zwA=!Oz8^6bcD>B;{F*i5%~1aXZZ%X4J aw> zq5U0~(p@#R$kD;WSX8R{embXlcxB 07@Qk>=}Qhc@sPawm=>$#8Xv1rlKu2 zack)Bu2{BY{U2&IrX=SN+w^*68Uo>Ngd)@}f0K>L@m#fq;__MM^KU1wMf47yMyAaN zK~v;&vKy?d@-`TpqU)M>Z_5VWpxuV_2i!M(Wx0Cfj$YZ1b+VmbSg?R*K57S+Tps)p zj1`?hl=wfZCT^C``!mv?lQgcOoz^~rLgsexuqR-eKkX}cE&wol4 U-y0Oq&(Dwd~`_gZ`y+oI&GwlDoPHab4#*jWol;WaX^Z1{^~uZkYLjGvQ)Z+PFR zRrPtXU3d4cukP7WCFf46@T#}A`sZMYHU`n*(cGcwFaiC3xzwU*> 8=RN; 9)uYMEe2bXs&+}46&gHTe$UFJAhy-DMO$k=X^g^?1N$$n)#*d=k z7%+^p2nwsFfTw21atk8I%pd$tl~1J`4M ;xxCPBJNbxCYbfj(`}YUD#CMHXyan|js;V&IZyo6hr|un zQc`N085#J8k-KhXtOA9S3#ql3gvJTdgcn@$PI}O;YTQR)Aka2-2BM#62<%;=jVQ=y z+gWuy4Wa@~!gLx@7_aG Q#og zA8GaCs>Hl-vA?}T^VTf1ICPPXDT^D%YV6SYQ9keLn??pDe<@N!zy!fhw;K|yE_CxX z(q0Fv+nv~o{txA~KBK?h810#t1^2trXHuJh65XaGCpou16?GyXWmYsr$=$|F*gJ09 ztJNzwdAty{ee+Bdzu 3T zJg9mPWlvJ|;<`V>Dy}84*VgXKBvw%VRc2 K@X2)9?*RJF +w4<^qa?kN?_6;LI2wJkbVP=U-S_MgJ!JZ*wk$W)$XWN^qGc_6Lj?Z8c~d zw)IHuzkW{#9(%Qj-tf>yw;RB|kZo+!)}ElrdqWpw;Tq@5M-6OKh!FWXX<_rpJ;_u> z-L4;hWh3zh}jwb0NAQsHq*%$a@|`v((J&>psquV^gnlcHLiR-0&93nye!oK!V# zoi!D=7U9)_cRWCjGU0lr*cG3GDAQKWXb(OsP|bA*>J*y*N{<)s5T|qPfN!h7@lo=j z+kTJRZtEfb^7F|QMI~*_tBvBFJf_cPJ3ZEFd;G5ch=*au{$4d3-|H}z$4uu;KFGfC z+MN{a9#x*}3yH{7wVd$5jBCvX(7G@1$moWpcGVTREOis}ve-K3_(nb9NbT{mwejbc z;f=RNzFE~$(DH0G9Cj|WS@+i(w}e?S1~Q34{5BTpKF_d{heLK8Qz?UU@2}0(_|6%V zfOed=h4eoIMmie^NW}p>?pe!(c_QOHW^JsfoU7q3OjgE4XBSz8;!05-RxZ+1@Ff8? zHT|_^a?r^_=QONeMk3>==vIiQJDy1*qWgd?7^ui`f|njM(e%FdhN_nYi MqgS(WEu$Q8A xX*`y`O{n9 zhlZ@Yd=(t%!L;zUU|0Lq$)do&Oc}m}m^EpBO!H(J%vIFG_>QY{{><_=2k$0$zf+$R z4SOTE@ZA%rE`8b2%!_%Y*oLIz`SC+M=lP);wkgbQ?O`#Z7gUZB9ye7X1JSvsyUNCe z=e1C+AsF^>C$<_jtPxrgkb|wYrOr}*(1xh*1=q2Gi&LeyUF-k4YPR07!+|~jGD1#F zO^6t8rHf@r!Kil{_Giuv@B439c%gPTTW<#aZhkXm wX9?R$ok!$G{C&)X0<0=AWVtH0)QG&hZPMe7h|o6!`EyJ5fS}#yY(u!Ad?MT z6Qpc|`dCh;Y|jmk3HhGpmz}@d0g&}~w8GfhTSh(k3)Ri!pvPHQB}0=70i;8;5lxvz z>~2F|Di0tGFs%=aYS@6mC?;^<2h_#ARz|)4+xYcaL`23_MiTS>GFVuLR-b*-&GX-< zmW1mPH@F~T!SBzRx)3qYR*a->qY$J}ZthN?m$bUw4=DiU%FmR8NPoUB2DyLSwP1Fp z#~50wsehCXz{A6nE4-{XW!4Pm-lV9dwdA+B2YtD%o;g$#eA?EUzKgmJUjM}FE 4Ye!rHZ zsbhCN2T~Bsb>;Irl=WcBC+wgip6KU~P7 >jIpC!j8ok{miUVX1#jWgt&X8g~O12u}ZG*(`#PKuq+ z0gyhd&-A9$jopp38mq;ePBIYF+*Lq3y#-R^oVUW{tn3DwOPo>jq9+X82jYjx17Y_7 zH~Sl3*`;ZTEuDREGE2p{h=RP7vjT9sxE!3^MkgYydtWaWxysg AR9GRu5!-RWD;mYm&b1h (wbh}b~HofnOM4aAIA z7sG$8RTWZc^~-mOjeuxn>WXah%L{E?=k^y;KPqi)W=|y?UD{Zdcsdwa;>?BMU;| ^8R+x;wORAu{7=7_{Y zlD82*ZWLBL+jqQ~+jMaGA7nC~uDB05v@6RjOpuAMqb(yyK zv(8Yxi9W=y^0q3lgXSmmOH^gtnOU2!RMrK6u$WajkLtC&l@8E+@e@DoD4=$F H@P-*YR^$H1q#YTjSlfxAi+waR3Ium$jWj;fkFViLeP_|zcQ~-|yV3dA zHhn8K;S8o*DU|ml$QstVa67QiM%J;y<^lr0dADd2U5B&`jXh8#Zv5ecK*^?z{3^V> zg@)0Inbuu96WiBB=C W@+%5Pz`7rInxz0xptIb )4C0~ev9;`&XlK+-g-yCj!Y-?&k14ulI9O~NO_e5-O< zybP$#7D7Y=c?7@;X-M8j(VGJIa3K|VUWlyv{W*{7e>Uvf1(i2VrAlU#vyT>sB ~KTx#>%^`2{PX3LdZ-mI`E_$vQfvqK&IZE=z`q#H?FiJ1hoI@be&Dr2${fa=|^> za+ZU}x#}ux7y*F2q-;%=^HHMd(A@WP9%hFId@}JhXpV1UMLIe)s3(Gmj@G2s%KgzF zAPY?89yCxSzpTGT=3T==w|*?%mB)01oumqr7k1OAu}Oj~geUXPm51VscNBWxztG*i zGJ3xP;F0(Zh=(j;A{(jqN%}5?VUF)uf|4h?NhU;T8%g(%MjVb6V~TmyS9pKOEdb~e z4I8f}usLH{<3?lSC2|!W$mAMaKc__iUU-m^foF&)gPWHfEm;69tV-QqWM&q_Uz59( zQ70-p?!m7*ckt}Y^%Z{*dq6=~^;*>8DK^qId)`jbjg959c@D8PV+(!l8yQsn6t$f` zv0{j_OZ~5ia5}F9N{vn5b+e{Txc0?xAcINkRyamf{@6&@;tEv&S|_$%Il(BKhRC!R z*YAgR*c*qNTGRx7R2q8ykLhY%VVvRtmj(1j%*>=Ajexq1_|q`Tg41KS(ZjbunT-XM z$Mb30RQnqR7aiDp!=Xv`5uR=$+L2f|dIx0WvuL~g^C!VNE4YUbn9|w2H3b&+%gC(V zlMI+b%YZ-Kw{qazz7IcwjyMRgNa{^vsufO1dn-;W?;93L+-Q~oM=iB`!Az-t1YKP((;5R67Y z$`lj_yd^(d$IHu|-sTB>7sI2G^%G^T%{VEGGV=ZpN2h?!WC`x4?tg|tfPg7!P(XzQ z1Vdp?g$lF1)d<##wnKfsp;-Z{72=>lMRf W!yl=|a7ftC7CDLd4MXPBaG*1`HOhLyg &>_AlMKP{haK#!Tk>) z^=mB)v3UcYG>SeA?2wgM3A^r9ouo&ZkPwE q8u z8Tms`!wX4*Igxpza#=As3NIPuTZ6o+U6la3v#$=RVY}J9q=2H&))<|T{cg2tT3tkh zY1}^}fZ#I&>ODTw1HolH>kPOEU?3dG&+y8wpV%RY9I6MjjNgEKae0J|eCdx6p%|QL zZDX?#g#Oc*{cShl>>fEe!Kn{*G>j5&g6j&$*_JT2I{?Z;+>Nv~1HDL-5}83GhNeFF zk}2A&By>CyGSKViX6<-y >1Q!k5zih1XjNY zkZqdfN*aU>l4wDz{hc)kzLgdQ>xQs_ysW$s=z(-EcAo_-^>m&W5fCqDb*;XUcFpOi z&Onxl3sN|E3Bf;QrOZ#rcHhX~6q^@sMii%?g-Qmo>EUP0^O>Zx4^tr=Tjutb+ -gqSfGf>ZD;XHU@yp%WY}f0i{o%*U?!I_)8J zt(37hLV26>HWko=uR<1OH8U%8f%%(gkXfPcs{l7U2dvCF9u;z+kaTQ|6U=%B=p||I zhoE~`!Rm=G0#jwL$XKLLO&*B@P7;N0tn>RGQ_}Y9ni311a5-efl<53n69T9LUW{sC zGbIonr&Ov`BsIsO|8CH?D9-TXZ8g%1GtnRQHY(=5U~;~kbAA>l2IKLHu4xM7OwI*q z$`)l4k|%H+bjoK|yIY2|gm!(%tL?O?IN7xcECayRY~xKnCjILYhC<}d2aAUq!gfSe z`u0EdnX;eU5mU)@zZ%-H@7=lzTj2?}fHSibhYvRZrR0%p+|_7%YLJd_qC|(L>BLmS zC;iN=KwSLAdEL4xTohIvKw@ceGlOBkKF)Ld)MR7PGkacX0638ovzP3?tSXDuC-Aex zy|XOoi>whY9{e;01W{8sd4lgC85OGs*K9?f%!22ZR-VM!0L&T;LKo?0VDV#=dvrb| z7ERiLNEvevA7u(%M)IPo8527bF~)FaA3ZFV=?XDb-sY c4WIE47|8jQtVk4eT Ros7ywA# zgH^NyaG$^BZ}0o$cwVMmjwKF0QjANz0qx@!4L?p6V~>4Y9t+f^F-T1~l{Q*o{un=C zL{B2BTw8a1*t3;zQ2syg3W7svXRWge1@Fz&Y`9hBYlz0c6B~EZ+|5J=akyHcXC(u0 z5RGG>Iaf}gFyrB%$kwQe-IwOEV%)6!D}%Y8v=7yv&Q@LpGe624(m uNN2I;LXs z>Iqwoe2eGFmq;zUgT!Zh0FPrt4(PTBtOzstNVTe>;~N ;D!SnzdlUwM6K2U*(Ad~2BCUtEd8W;O`DuA~>e$x=UzlP3(+m4eJC@gq+L z1Y&S?D6BfSGDtjE--wKtE@%kck~v}yxHq?Zpm($Q*ozr#Tj4%U(LQJ~hyi-;v 6KE{&XseQ$5;46FR7`z>ak7SAUn)#KdBhYjv?e z3Hz%=i-=U^z`O+|hrcV&K|SVHXorC*)|$N~s5KUE*uK275prqug0VLS9Q_E{3jTX! zYD~_b2yIm}cojpxc>IglwMU7OBa=F8-43(a)}gH7m(k55Q%Q>zt;Z$pUtUXya|285 z6}~s_Hq-eyd;jtGQZ8#9Fc@51Z~C$K=UcR^o`ZK7kmP{N 51U9SRzsk1>^sj`C>Np5}MA-zzwsVNpOah=CL z3u2vO)nP#UQ+MkL%MT#0{gyAN4@tt13;lS#QM2z@+#+9oD_p^haW8Et9Z;KigUlhM zSHMW?KuQS^3 Lt>bZkW)1~(%a#}bW61uQ{Hnt}DMNrJ?6lwDKn z8hX?;qY)OorM>TV5a0$8{aJw-n+%G^#uy(p!_KbAvH<#bBj+FFEZTE~WEey9z=74@!QZmE6d41=Vk4DTGsO>*%KM1;#wheB$UgPVt^d=bDt$F> z7t09|dnIQTxVBqoJ7a06nuVzDH0t+09hwY~-iHi2JI` FW54};mP?k9mBNJwVsF?07=?rHdYsaReBYi7R7D_i) z9l0890er`pn&Z%%LIMrsf*`dE!xy^euNN|9DY0XuCy_^E{W@m%MmIG}fm6X)Vs05+ z6;)mJ`kF_5*pz+^%%}9XqV-%osCYdEd%{cy$q9%}PYk0WguYwQ`Q#BJKP~oiM4f0+ zoOx^ql|O^mEI2$bh>e{{P6prO)p0akX0x*#(=KWRW1jdvKi{UU5yTN>3Q{StUMQt6 z2@U S+ahZ*2qe%>B3Y=v)glC~!`c3{~*hCibMmuS#ImTlvt)U@%@DBu|PZqr@ zFy3SfGd97EUthJ&-83`VUk0n#I}PxTADtb@C;>?z9?g5~aX70gO^c&$>w~_k0FTk_ z5BjWo?0m )cE_l=O45U`hCq~K-&A3W~;}~2(#(R(Jw#W zCwJ6~ehe>DJK3(&3^yIZvFTO*Ko5xci(#n4qpbZdT;&C#rAS~xQ@9@<4gT1piZ_b+ z+xmUW4zZgSmvd(<>CDrON)y;89SHdLw1j$Jzh#tpV7YdoT{44}nYWNi+M*(dly2a7 zTO;g(0x30pi&2^HK@U``!x}cA=URP{C M z#vQgSNv_Ok_>xdKzQxuGpjJLC%tl!q2_}vx91GDqH+;7B_uE(Ru1`NbxsU&6sk83x z$Nn?+Dbk~$30 Vg_}` HUEToX6<5BlJ)_wWk8Pi}Mo4z3QY~ht3 zth>DM3~&7Vo_{!;-Q)c1lX}N*PFw$253uc3I5=TR2L3in(}-_t^fn~tnCwiLoQn;A z?X4e|IrITg_{XH3zA?pD9g1Xk+Wuzk!0k+--uT0T8f{i5J?!w#`s=MCEDZr6f;_N8 z>5DW`-4HM+M7&HKEK9<#?jWRN_{R>t*Gk~rNwdrG1QhOv-R@u0M(7G)N6km`CI_aM zr>Ktms#n0ro!@PVIu(0!5>yiZ&LP06C@xEOEB!81vhdy23-oMWK3^i-{$7U#r;?VV zh4c$!UQ)~#rg-IlZ24yeCGgW%zkvlwL1<(l^TcJ@`#FJtJN(}M_W<&PlFwNF)I5yS z-qj2&V 6krOUQ`uKY#MP|JC6@kv3`ZaLYx}09gmZsD|>_w>hU9LWNEC zC)C9kioS!cZpu9C`(fg=JWx>b^3uOUzw)3r;&7lqo3wQJG(jyWqnSX_L~D?4&+fg# zq%Jr8{(L}lV<|5N>pXB#=D^HT!yWquF4i0kmIajCx*D4n`6}$5e!~9@|B;i3zr2&C zmIE^VSN!|%I|N#@b$#1I4s51Qew0=n0@bnQlbbePKwtJ@Z@&%J=|6Ui7$-~llCV;Y z 0r-10yvm~Y`Qbp8wwZzS=|$fInTCJ)`TL#QQ+ @zA~C(RuL|w_{2vGSU19DH^zB!|byixi zGanl#@6kdfbBD5GTwhqGDUg!Wb3X!el4h;weFt`_Z>jT>Id>vqQE*6I^2cuOgi|}L z1`M|Sh{c17TjdF}O%M7#Rxj4aAAp|yLlt13pLW*72Ws7I@phkN V7n^5rRqltuH6`iC)-mxh%YE-E4W(s{v<`e+?pVPq1WqZ_@EM zDoRCbqio?|d^gLi=iHv~K>Q!u0afQ}PwdxRyW-Mmt&vEaJT)t!hXjA~OLgGY)Y91| z!PN#6DN+7jTkjU~Sc1ag?^;UaQ5rZ`dScsi%^b2^weqR=Th^)nF_ggVfZ3=G{ms+F z>SME;ZKfg{iPC=maY}UhvDTonp;!9&!+y2=cp4bvDtsLF-%MFaa}^dbXz(>3X*JL@ zu^YWO`Td;ezfrE5d8MJhX_gpY*8clX*6vlr-p~90@w?=CuU4-CXR0HR5=7}ael`>q z`5(m Csrnn`q@t^B #^5X%YexIW=HW;|Ckz0lWHV nu z!dXc^hkQo8MRpsZ#`NRR|5%mMpO)xa=EiNRrmRwZa*JiW@!wlp;%hZ3J$hR{e^@U5 z)iKf33L-Qf %{FnXXcaNk7W6inY_u=@B^>x`t5nB0lRJA1 zRv8@5T+_^r3}QdO{h!G4C!;6t{6;CNOox*tc1PB>QTdmVcmGGhN?Xk&bJso?ccwDJ zsxLAZ`B=Cyne}9mm6=d<$G;>~mQ}0vv4eGdAezI04L`?5E{Mg=Znoe4PYBzuDTk9M zX@8@HReEPbcQ%Hz*IL1A!{yRqn*Wmdg*B=S;vDf*GCr`4qo{zce EL3qp! K&+%<3Rgx{Zcu+_lN$8TrKYM>Pr^n~6i~UnIp~H |2m4jgt$vt{$)!|rR(Yy>edfb(8kb4j{=~Du>rC-IH#kMO rbMht&zZ!6g@K&1jv}C;Z$q6BPl-WCC$t?XGPp8Ub%|{3Y%NPF-rv}|} literal 0 HcmV?d00001 diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 0000000..1dd79f7 --- /dev/null +++ b/uni_modules/uni-data-picker/changelog.md @@ -0,0 +1,75 @@ +## 1.1.2(2023-04-11) +- 修复 更改 modelValue 报错的 bug +- 修复 v-for 未使用 key 值控制台 warning +## 1.1.1(2023-02-21) +- 修复代码合并时引发 value 属性为空时不渲染数据的问题 +## 1.1.0(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.9(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.8(2022-09-16) +- 可以使用 uni-scss 控制主题色 +## 1.0.7(2022-07-06) +- 优化 pc端图标位置不正确的问题 +## 1.0.6(2022-07-05) +- 优化 显示样式 +## 1.0.5(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.0.4(2022-04-19) +- 修复 字节小程序 本地数据无法选择下一级的Bug +## 1.0.3(2022-02-25) +- 修复 nvue 不支持的 v-show 的 bug +## 1.0.2(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.0.1(2021-11-23) +- 修复 由上个版本引发的map、v-model等属性不生效的bug +## 1.0.0(2021-11-19) +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## 0.4.9(2021-10-28) +- 修复 VUE2 v-model 概率无效的 bug +## 0.4.8(2021-10-27) +- 修复 v-model 概率无效的 bug +## 0.4.7(2021-10-25) +- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ +- 修复 树型 uniCloud 数据类型为 int 时报错的 bug +## 0.4.6(2021-10-19) +- 修复 非 VUE3 v-model 为 0 时无法选中的 bug +## 0.4.5(2021-09-26) +- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 +- 修复 readonly 为 true 时报错的 bug +## 0.4.4(2021-09-26) +- 修复 上一版本造成的 map 属性失效的 bug +- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 +## 0.4.3(2021-09-24) +- 修复 某些情况下级联未触发的 bug +## 0.4.2(2021-09-23) +- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 +- 新增 选项内容过长自动添加省略号 +## 0.4.1(2021-09-15) +- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 +## 0.4.0(2021-07-13) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.3.5(2021-06-04) +- 修复 无法加载云端数据的问题 +## 0.3.4(2021-05-28) +- 修复 v-model 无效问题 +- 修复 loaddata 为空数据组时加载时间过长问题 +- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 +## 0.3.3(2021-05-12) +- 新增 组件示例地址 +## 0.3.2(2021-04-22) +- 修复 非树形数据有 where 属性查询报错的问题 +## 0.3.1(2021-04-15) +- 修复 本地数据概率无法回显时问题 +## 0.3.0(2021-04-07) +- 新增 支持云端非树形表结构数据 +- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在 nvue 上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 0000000..179a4e0 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,551 @@ + + + + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 0000000..cfae22a --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -0,0 +1,622 @@ +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 500 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default () { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocalData() { + return !this.collection.length; + }, + isCloudData() { + return this.collection.length > 0; + }, + isCloudDataList() { + return (this.isCloudData && (!this.parentField && !this.selfField)); + }, + isCloudDataTree() { + return (this.isCloudData && this.parentField && this.selfField); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || + this.modelValue !== undefined); + return isModelValue ? this.modelValue : this.value; + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = []; + }, + + // 填充 pickview 数据 + async loadData() { + if (this.isLocalData) { + this.loadLocalData(); + } else if (this.isCloudDataList) { + this.loadCloudDataList(); + } else if (this.isCloudDataTree) { + this.loadCloudDataTree(); + } + }, + + // 加载本地数据 + async loadLocalData() { + this._treeData = []; + this._extractTree(this.localdata, this._treeData); + + let inputValue = this.dataValue; + if (inputValue === undefined) { + return; + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1]; + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value]; + } + } + + this.selected = this._findNodePath(inputValue, this.localdata); + }, + + // 加载 Cloud 数据 (单列) + async loadCloudDataList() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let response = await this.getCommand(); + let responseData = response.result.data; + + this._treeData = responseData; + + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (树形) + async loadCloudDataTree() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere() + }; + if (this.gettree) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue}'`; + } + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + this._treeData = responseData; + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (节点) + async loadCloudDataNode(callback) { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + }; + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + callback(responseData); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 回显 Cloud 数据 + getCloudDataValue() { + if (this.isCloudDataList) { + return this.getCloudDataListValue(); + } + + if (this.isCloudDataTree) { + return this.getCloudDataTreeValue(); + } + }, + + // 回显 Cloud 数据 (单列) + getCloudDataListValue() { + // 根据 field's as value标识匹配 where 条件 + let where = []; + let whereField = this._getForeignKeyByField(); + if (whereField) { + where.push(`${whereField} == '${this.dataValue}'`) + } + + where = where.join(' || '); + + if (this.where) { + where = `(${this.where}) && (${where})` + } + + return this.getCommand({ + field: this._cloudDataPostField(), + where + }).then((res) => { + this.selected = res.result.data; + return res.result.data; + }); + }, + + // 回显 Cloud 数据 (树形) + getCloudDataTreeValue() { + return this.getCommand({ + field: this._cloudDataPostField(), + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + let treePath = []; + this._extractTreePath(res.result.data, treePath); + this.selected = treePath; + return treePath; + }); + }, + + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + + _cloudDataPostField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + + _cloudDataTreeWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() { + let where = [] + let selected = this.selected; + if (selected.length) { + where.push(`${this.parentField} == '${selected[selected.length - 1].value}'`); + } + + where = where.join(' || '); + + if (this.where) { + return `(${this.where}) && (${where})` + } + + return where + }, + + _getWhereByForeignKey() { + let result = [] + let whereField = this._getForeignKeyByField(); + if (whereField) { + result.push(`${whereField} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() { + let fields = this.field.split(','); + let whereField = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + whereField = items[0].trim(); + break; + } + } + return whereField; + }, + + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + + _updateSelected() { + let dl = this.dataList + let sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < sl.length; i++) { + let value = sl[i].value + let dl2 = dl[i] + for (let j = 0; j < dl2.length; j++) { + let item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + let value = paths[i].value + let nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 0000000..6ebced9 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,323 @@ + ++ ++ ++ +{{errorMessage}} ++ ++ + ++ ++ +{{item.text}} {{split}} +{{placeholder}} ++ ++ + ++ + + ++ + ++ +{{popupTitle}} ++ ++ + + ++ + + + + + diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json new file mode 100644 index 0000000..038f9ce --- /dev/null +++ b/uni_modules/uni-data-picker/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-data-picker", + "displayName": "uni-data-picker 数据驱动的picker选择器", + "version": "1.1.2", + "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", + "keywords": [ + "uni-ui", + "uniui", + "picker", + "级联", + "省市区", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more", + "uni-icons", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md new file mode 100644 index 0000000..6cda224 --- /dev/null +++ b/uni_modules/uni-data-picker/readme.md @@ -0,0 +1,22 @@ +## DataPicker 级联选择 +> **组件名:uni-data-picker** +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`+ ++ ++ +{{item.text || ''}} ++ ++ + ++ +{{item[map.text]}} ++ + + ++ ` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +` ` 组件尤其适用于地址选择、分类选择等选择类。 + +` ` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +` ` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..8f03f1d --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,19 @@ +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..e5eff4d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..2fa6f04 --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.3", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/websoft/api/order.js b/websoft/api/order.js index 8d9e701..f8ba473 100644 --- a/websoft/api/order.js +++ b/websoft/api/order.js @@ -8,6 +8,9 @@ export const listOrder = (params) => http.get('/shop/order', {params}) // 查询订单 export const getOrder = (orderId) => http.get('/shop/order/' + orderId) +export const getOrderPay = (id) => http.get('/shop/order-pay/' + id) +export const getOrderPayByOrderId = (orderId) => http.get('/shop/order-pay/getByOrderId/' + orderId) +export const getOrderPayList = (params) => http.get('/shop/order-pay/', {params}) // 添加订单 export const addOrder = (data) => http.post('/shop/order', data) @@ -20,6 +23,9 @@ export const removeOrder = (id) => http.get('/open/order/remove/' + id) export const setPayStatus = (data) => http.post('/shop/order/setPayStatus', data) +export const freeze = (data) => http.get('/shop/order/freeze', {}) +export const checkFreeze = (orderId) => http.post('/shop/freeze-order/checkFreeze/' + orderId, {}) + export default { pageOrder, listOrder, @@ -27,5 +33,10 @@ export default { addOrder, receiptOrder, removeOrder, - setPayStatus + setPayStatus, + freeze, + checkFreeze, + getOrderPay, + getOrderPayByOrderId, + getOrderPayList }+ + + + + + + + + ++ + + + + ++ {{ status === 'more' ? contentdownText : status === 'loading' ? contentrefreshText : contentnomoreText }} +