From 25a06afb50d23ca58faa986d8968fb570438fd11 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Mon, 30 Sep 2024 17:42:55 +0800 Subject: [PATCH] 3.11.2 --- Documentation~/en/changelog.md | 23 ++ Documentation~/en/img/tutorial01_axisdata.png | Bin 0 -> 23064 bytes .../en/img/tutorial01_seriedata.png | Bin 0 -> 26370 bytes Documentation~/en/tutorial01.md | 241 +++++++++++------- Documentation~/zh/changelog.md | 14 + Documentation~/zh/tutorial01.md | 8 +- Runtime/Internal/XChartsMgr.cs | 4 +- package.json | 4 +- 8 files changed, 196 insertions(+), 98 deletions(-) create mode 100644 Documentation~/en/img/tutorial01_axisdata.png create mode 100644 Documentation~/en/img/tutorial01_seriedata.png diff --git a/Documentation~/en/changelog.md b/Documentation~/en/changelog.md index 96050ed5..aa270236 100644 --- a/Documentation~/en/changelog.md +++ b/Documentation~/en/changelog.md @@ -2,6 +2,7 @@ # 更新日志 [master](#master) +[v3.12.0](#v3120) [v3.11.2](#v3112) [v3.11.1](#v3111) [v3.11.0](#v3110) @@ -71,6 +72,28 @@ ## master +## v3.12.0 + +Version Highlights: + +* Added `radiusGradient` parameter for `Ring` to set the gradient direction +* Added support for `date` and `time` in `numericFormatter` +* Improved `origin` parameter setting for `AreaStyle` to define the starting position of area filling +* Adjusted and perfected the documentation +* Other optimizations and fixes + +Log Details: + +* (2024.09.30) Released version `v3.12.0` +* (2024.09.27) Improved the `5-minute tutorial` +* (2024.09.24) Improved support for multiple Series in `Legend`'s `formatter` (#332) +* (2024.09.22) Adjusted the display style of the `Documentation` +* (2024.09.09) Added support for `date` and `time` in `numericFormatter` +* (2024.09.03) Improved the setting of the `origin` parameter for `AreaStyle` to define the starting position of area filling +* (2024.09.01) Added `radiusGradient` parameter for `Ring` to set the gradient direction +* (2024.09.01) Optimized the position of the first Label when `Axis` is used as a time axis + + ## v3.11.2 * (2024.08.01) Release `v3.11.2` diff --git a/Documentation~/en/img/tutorial01_axisdata.png b/Documentation~/en/img/tutorial01_axisdata.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4910aff32ac672f731a2d7ca7ff94646cfc131 GIT binary patch literal 23064 zcmZ^~byOQ))HU4Vt_f1CP$YP9ZPDP8;7$ppXp6fQEetNjHMo1Rq9wRH6ljY(g(5Bb z@_XLz`Tl#eR@O}Jx_9QznX}J6ci)ppn1&)D-ZQ)>Po5AeE6Hm;d4dK!e*JOKA6vp+ z6)-#=pfEKZXm4+CZEfB5_I6o$#n8}DPiJRKOKVb6(qsF~%uGgR*2SMcy1KfUn3z#f zQ4es$yLa!ryu2QCtsbQH#U&)RK4;7Zgl}Hf)jwVk$4yH^yWrt}J_~&vv?WiT82Tv7 z%jkGLJ^cJMsep?hJT>ucJPX0-?}xyH)Q?8*+pnsQSEtOpzjK6t#MAuYM?m;0ik0fw z^+CqI=W88*zmM(U?n}3sTmG|hWYvn)A0tg3LHV<)Phy1-#DPgY}~zoBZ0|=)e2Y{c6_~ z>KYV~%K&7c@#_kvUtd5%{(gBvdWG1QpSfyHU_{PB5q(+t9&_>Z`xxNgsT8aNJ%vAf z@J4^lJ(y^6H;N_4OD39HZFj~IPxlHwWUxdqD(Lr$=NR-yd5b2Yc<8J+-4q=nGS?ih z8j6&QDbVi}gYLHg?^CITB>Yflz7n1ryAg8ai?rtJEog(j7Q2kfnMrJz8hO(@iP=(z zH0S3I!)}ZqsgjQ3mxfgnM9M@7=`+tyiB+>5WUx|XE3W@OF;YHP4c}4s?kCCmRroCu z-@8Z)?p8J^Swn!3OVCl$Fw0OqzLS6GtbCReX$Cs*jKv4uP#T-mF+rXApqz)1;C+l~ zqRMt%Q@%fl0^SM$nTBj(!aVI0h274`o{D0a_m;QH!Q7}gBkDP$5J1%XO2I z!S$#Q3RBG6x7XFXezVtHyx%slfk0&^N;t^00o9`CRMwL-ItB4g;s|CFY8m$SUpM?@^PZEYV&cP6n%Az z>EE3DE`}eM6+?~Lmir7)PDI{32iaSpv+@Qm#Hs>LROFAGBAbUWZ&X*kpn&2O*@! zAX=BI7@S^4{*GD}_onDJI6ht76FR1Kb!k-$kjvR z!1&`2Yl{v!fwbq7+aKE>|C|U{tZuoSD6b!)7x4W&NwsT#A49~g zU8C1VJnyQm(S!cF?;b=4iou*CZLqNw30*3V0xi4Hq2t=^2Mm5R8U590t}xu_W!L$=HmmLAmRE2I3EKd~-0 z4I~5K;c0(u;g!{pieIfx#~myu<>Zjz0B?JLGgxxW=zF4&)7LjPG02DiZT zC5EzP>OL?uegWA-;lsR;I0+E9(h81eMlp2;dqH$;q)Yf3$#^;BItZcJW2j%q)t*|k z&BXDhy7Xp>0t%5i1EGZF;cB#6i5WbG`=y$)Ouf=|U9klak7CHP@v$E(SWwqEM5hd2 zQL@0C3~E;8fq)-Cro*E(rv@oq067MLc+g`9K_pkIL46RBy;ITcM*$o{7 z=a(`V6|ZHU<%q{3e{=`i zFo~;;GJXa__2GrRWZSiQX|ztZ)uodBsl6_2yvkN(JL#5=SeY4|8YH5r7C^S!3OG!G zMh-9|5iol*lQb&B=UeZgaXMW}`K9v1(OX@wy}k0p&B2lQXqCl!n94JxbeerQzrEyboL%BEMGQv_5Er zpeAYJS3wFv3cpzh-1Y1J2PPdX^2>p{R%l+58?U7Y1Ognp={=x2M{?$bsGCVwG{?8# zH>DM{r~=3rXXAt(UagZ~g2f^pad5YnWy_~NYa%uJ#33^e1lKM=t{UEt%=6Tx->B@L zqe-*|4W<~sUjnazLm?W*dVd^b_Rd-;!6&wJXe}W$f_+AC7Rm;D%QJci?$s-`2Gv-# z3xVLoMun+FVl)~~WAB|0)se1*P)HVf=9=&0>j*;N;-sV-m6@43vwwGSAjGJF$R62k zqe~N_SQbp}qO%$XH|XrdlF)?2I>+F|$LHl)qc0pN7l!R}c84T2~BRzNWoQ#zkp7Mehy*7Tfh zyoG%-oaLJn>`liuK9Fw9G_FO-l7l(0#{32Ch!d#x*_iy1Dsc>$7>F|UD3v$(6y`y` zD;Ms{KoA+mpoYaaxN}NHO89^d(9{WXOC$}QU1Js(fgRQeV7B$yfH>GIag_0@+L#pB zN5QB`Rug!%)&mCs6)!YHch;>M(dzKEEL{fe1|it8W#B+nMxJaaB3K8mc1WrJRWU&i zRKe-O*Kg2c$X|GeQEdQsqqTxYygyO*)}~W{tGLj~1d-a^fk83keY1MqMQ4*>IxN1q~NKWmA!JorimqNDE?W=W7`djL4QL)~FR zaji~I%BESaslqhsbb=a0BFBY5TY+JnMvn$qzy)dNydO=~3dVNsdecq8^V&5uYx_ea zC4RA&`y^Kog!Vf5X*QvWO8Fhc;(O*}gk$qAkU{WfOP{s{ji-%0pZ@r!1-IumllX1Q zcq^{Go^^Woy5JH#yL}HEvThNP^Q3KHLa2Qmrg+x}2KP&4J}d}6nlLy2Zye4XxMXAt z+2up~gXl*Pa@gzoq3dXire}mVsY`6fbNk_+j+B~2>OUv{ZDB%CHag86%##oVRT7;w z4Mj)gTTe?nmo`v5`9TMznStp;1z?rTti*D!wh;X2&>cwnME>|0H8$|`PtlbEf%;H4 zBgh%<7!Z&PgB^Ad%jKrNCC-Cn_9Ky>a2^O^es1g_q9`dFvcr|{g{oBj#dd+sj<~EX zn@jYc+qbgi)m~-SS!lkQ)P;s}$Hx#Q4wN z>yK0ItIs>*0tdYy=e`l}fU^Q(x361R%<`Hdk#*u}QRi z%gZ8x82pmkq(&X}0DzWMujXyLFepR4)w$|_GM{q)D``sK`W+KU zl@@Tlaug>u;jsn=OBQLt1hu}9Cv7Fl#ydH-5UIc&Ml7h@Vv6yL$qEgUM3Fl%*)%Ry zQLLvE=KD_pL7wi-5lzn)MB}~i7_V&m_QKWQ4X&JkeeY+6JG2G4C9e(urXXI|CdKwV zs`|kzg#!%W4+FReZ^0e+-+CIWHXJ0$RyL<`-vS_#17xPkIET@ShqsTU?)wFJ4lHQA zCSMnX*mIY?9gBZVKVuSDe;(fL1-)vD?*89 z_?g&0MmFyqT$SIENySv&R*9XZF9;|_2(v#gu)G(KW-8~Lr@%}xg@ay*Pmr3V&@=DH z%oD>vlfbOyj_OeBWU^{bG=+@_9KsjHDVsvTxdVF`*U>sT^0RvSy~w>6%;`S-c5_7| z3>}*>KGA`>M85$AFpcI8QMrrlu*RQ+8fD|Umu(s&)C*I16qVlyn46?}rtb?s`QBY! zGZyGXxzMvPe`mQuv?#Se_HlqXAW6!)yP)0wG&IhP;7fDjT+YH72Jp7xMAsKX2UIoD ziSmnGJ6AX$0P^rngm^tVDvkL*xeNz6xAhxIrdUljjyiSR>i+bYT)t308dzQZ=}Ub2 zr<=G5Nf>`<0a{JWz!TO7Wmy~r>kB}ka6Q=^x|A8e(w%=BUu%_IeP=d~gex@iIBW5b z_&=a$9<=vmMzv2~maT4+Ue1h){B!?#%=Zu&`(5?QY51mjk$e93>l3eDa4KPAR(`&X zC*2}V)i?gudqxKC9x{7;{C0!(kMHq6XdZnX4WKbdJpO=l(;Y&)NZ8U<(%!LiLST}6 z!($)#@45ZLirb9|{sA>8JJOxY;KAqjD&(D}E+ls=?+3+qydCr}jVxa#`~}GvFsogw z$R|!$UpVkMOVB%RcT(4NJzmJ+*ge(N_a6k`@yFcX%~e~_17p6- z@N2u($Y#Z<>(rUR!_W9Ge>e!jK0W8-hZ2m|J~Wx(9`-3`32XQUPG^uyNlQkLr51F# zr&+NP#Ui8FiQRPpQ5Xm%>QCSfe%nO})p=#J47o#NTohC~kb zFM_^6n6`%z*&7xUa`($=k**rvYIrmQn@35~kYTm<_S;w3T^Jfkxqih-HJ|ex59B(J z1yiru9wCpga6>a)|B1t7uZONaNoB~PK<jY} z6xkx*?k}LztikVi=51DicmEv(Z=g48LwZq?-$i)NboQ@SLVXKT{*_YVJ97!r;$~=F zD>5LB9AqjQN9A8mkZg1pE+m_yhDt}sFJ7=YfE;fR4Ty6 z0UvqxF$qkN{nifQ+odVd?Mt%!ZB#qXpZ)j6`U35-|A0I6b#3j;>-!HN)H?GC!W}BZ z2k~a6mT*KWDQJm(KEJG9yw6U`gIG&n&TLLpQ-ysM%Y)$MCLu-7(aC5ET3ddA<)C=z z60jNawI_KvLHNLPh{Eq_479>9V4c?qO3H^#F)TSydHxhzf+cq6BV}e|CH42KwZ1OK ze9op)0Dh#?FBeK&+Myae4`b*;-Uh2sVt^H zofnG=wIolMsE=Vhu^ zy;HbMVx1~WnvtFJQC6XXScees#Dy!5Yq$H~M(&FP^)e}&7Z$o*I!14<`F{gE8+!Py z_p5qchjm~t(GlX^{jzp=Xwi%K1QV{(r*`=YI{jlTk(T&9J}Wn6`Ccr`e?Oe3MKCO- zW-6DkJwL48n?iKqt#qNYw39STWUH>tG7bJoIcQir&rCys2Avrs$~R$42*9@=oN5 zPtPiUuFqk!ucX(vo6l?hm74UfQl>Lg@V>bV;kG#!1~24RnUF*Hsk20Y<$Y>u+f|X% zKuBEd`sDZBMF`XMU-yS!(xg49FK5juVq=*S#sW&45yFBn!8KA6=?*UI_UxJw=Q(TK z$<_(~igdF6K)5gkqM&KyNHj@Qh?3Z_XUGRTKs=u z0QT2|h0I!i2r$@YTN-C3P3mU>rFvI*fnM6Y3s&YWtd!GP)$|L~n`?vg6fl+y8dq7EhlSKuosnsV})c zF4oCib6F8Te6?fC?jYqfEh)rK z3J6UX0}&}?!Rk+gkya^rYT@u@7GG5Z@r&?7_OWW5$gS1dN7Lxsz>^E@Er-`^0~?1k z8dUNwrkYzFqRlphugw#Y>QHC2%vTp{iQnwHIDyE~lC?LuyY9H-r>;N8!WuYpr4AK1;sNs<1r?|7rT>=HmF% z&mFn>gKW;GeZ8Re=DK?p{l1E4E6`fq(a7vqo6R%xMW)zby;A8S7PFFVCrA>xHKmh z7oo|vy!;rN)hwn1(sri7{Tin&3@S@b^Qv7`^o7e0_GZ@>NSreS>hmCZ zLLhsa)>%@YGDxpjTyyWr{o~>h@h+pdZ_-zrsGJg}(=~IX%4%1fL+)0e)>>%te$4p| zp9YjvP+xBJEREI_kNRR=36`vrYiD#N(~D>sx?cCKwE;nYLKymL_d3`HW{)wr(_02R z8H0CVTBI*iF-+mn0)QDmoeoGf9v(@kbkE7?OymRC=VIZbQUA^EI$efd5&#+I+@&m& zCc5)If|3piM5VF=LqVK9+>l;z8RK7goB*S(upS6KN(L}Zl-^@zj?o*P85C<01I~Mi zAoCcHazo#Lh}M>tfa~Cs@+MXNvGYYs&gM(}I%d1A1OrLG7=!RsL+&9UCJPv7Yqq>L zyJ`ZV;4yypVDb{?hyE)76p36;&4YNPG9Y*HzVjC-2>{bvpd5H|EEo#^RqA^FB%zw@ zT)HmlCl~~lmJ$Lnv@zodHo`C6un+L7WE>0~tW z6F^xBD-@1GMkKc)shFRp5b7tBQ1Quq!}U#i(u$4iRBrcX-RC-Fh#cL}~=RMsTnDL5MOWSj_wyperTO9F(mOMy5 z&SUS|gd_ZpXoDBHPs6LWC_|KaVbaP+@ z66(3c+8rpY7R?TCv-6=tbun+OI-$nVL|{6g0*3wSAS4caB0qp>_35J!-jPHUi*VGY z(jo+r`r*p0>T=Q2LD4chntdt*Mdr-uymCKF68&}9{S8UHh~2!qAn(34{xITQ_MzGQ zsvU0yqXv6+qBF;hXhmIxSJUYGuj0GN1>eR*>>5w8oNUmxw7pP0Zh5XEsYk!>uvf5h zAkt@MdP|scg5_UN+mTNn|BTfn?X}BvD^_OGYx;AooAN5X3IFYdcB83+h4yESb<+nW zV^>F?H9k7?0^=4P1+KXlXKOSoc92dHFHf`z2r!xH!*G4&^Ay$Fx+Y-VjqR_7;Bj#{ zZ2P6OnAu@G22n6{qvE=pQibUCnmnSB;5R$c=V3*)di^| z5cmxBu*iwN*>A{#Lpd@E+J1_uyYf(3gUxKHffyL?vTx)R7gl&F3%Q=XyZcm3loyG7 zk@Y6iS@sJrWjq$?+E4Q}!SBybC&SMP@bPK)0$aB2#}mSc)0#FW-iKcvjQ8c; ztLcByuhmoQa_H0vKPRQ48%-<+>_s(17<6WN!53)*8%7;lRFY0(dCJ!`Vo16Grjm8z zfp?mTcROggayV(XHGaF|ORo*W*}?zlm=lj6E4o#Bh-yj^jCN6#Edcc-RN&X8wdDHM}zAQ&m6)I6zB^TvR< zso4Fub_j)OMPoye-@$pMdA|=0@=dAvn^#G%-Tr#`H2+pLGO3dn6dRAHN9N`k%$1kw zP?_WJCNh5#Vpk_Pq-H3t)6_`$Y|s)uWq4j z_XX%u_+l2JjRXGsJa5Qad4z)k|K`yA(-Z^%k>9@{8{7TlqH)KZcluMtnA-w(*T8?glTd5@5(1z*MQgK2-{M zNq;W?le~P_h4ciI;xgjggu(h+fBhH`_PJFwL3i1|bEzrVC9nNGwSWngyrn2P$}gtF z?M+n$!bv7^#zB}9V&6mrWEMW&E zQ5#4`ROeIVn>B}@wnCu0UC z8gBwh`Ihp9IxT?ZPuoXAyXaw71v{`Jq6$fcESBJzgg4GoH2G|gr{q$qg9Z*1pQ<-y z>{`k3ZA{fbj+I|hPvL={R*Ef43n5A(65VpBEv}dRLL9@XK{Ds;)oD76g*+=bjm45wh+fxE96^`^C4S7OX zA3tgX-`uVmCtkbq-ICJa(1yIwq){SPha%fR8kKFfss_Q#N`AzyBYsyb!V^k`5H2e^ zpS`(2*B`CrR##+yi9F2a?4Bz6nx~|N7C(tgWA~*fc-e%HyJ#NfRLqMRM+PZ7NAZzhw5N}E+kzMbKj!(#B`K$PM@U* zo;6)>#mqB_6>FXk$;wJMTZwfB;K(r%Mks z=ogYejU@B+D*ioRda@@6iUFZtGW!Pt?3byW%>}fVpAOMb``_@eP%&CGA01e#6?nQC zy^3L4z+nkMCTg9Zm&OlmQn|~}``sjN$xIAm3`F|qoquuL1AUx z-?qZ0MeKtY}Jn?cmu+6-YYX9NxE**n7x|8)nthFwLIVD%m4bx6lLpnA4X z9#ytg3(?If?F)6_EG2WN5Yp6d97SI-_!-nmT@-`IrdH?SV9a0z#6Wh3OXL>?- zp86|KnUPF3=9T(w6R~LUzL{_b$!(30O&W}$Mo+%_L#H^SV6_2AQCLk25(;2q<6GLA zMJTAO6qJ66EMJDHMRX2VaEfbF@?rp3){#mdAp7-2zt}77za~MU&K7lODiV*+NNG~{ zidXJQsb1|jJbeNy!Ug&{v#2+Lg-N?QW^kSP`KG~ruFh$VK^#}LkU4`jJ75(o5jAuj zxvuo;1W-Wj8w#@&ykK4vpmEk9;3cFc?y~>1+tMUm(Q|NNgiux1vsSCuNSw3HJoHsQ zga}hKWLJyoO%&jyl`d%Athm*TeaQG=SG2uaG{_xgTXP38DD({w=u(WnlG#$d=~2Dh zCRBUxg9#nTm5lQIvDV1Y$!^od-SuyyRlg}duz^kXb!zc!V7>nhQ87hF=z3t{Y23~c z6`tDi2*J{~Zr9jX!Q{}Y1Z4Tw`0zG& z<`t-H6XBSP_m65uT}Zo31j4^%(-^9zR^WII8}*HF#ED9cK}ogHC$gOb?nKPUUlHw+pN_E`IZ7(_dUjPJQ>gT`oVa?l zM=Uj(^uDLGA|niUT=?_fnFgy?DK;wS4KfAuHelo#D4gtm^@(PBb3ToqrX|?P<~Ef} ziwctL@lrdmZ+^vUA`X{vbH#_&z< zJom%~PyTCy) z^DSt!Vqg~WuxItu{>{0wFbA&rwe&}end&DKZ^*B{5PIi3Tm8zV*O-sHZJryYvGPlj z6hdKO@ds5{EDEPBZHEMaPQ?A_3}dU|<0F&q$x__Tv^@=XX8T*(mXBfOp_KXa*CeT* z2QC!ZbkKqNh27OG!xBY!Sm4u(cXnB|SSU`K0+<~-9Soaj&?^{1duT6TpQ=;C!jx)UR-VBK|_<=QQzRqiM``~f?d3u*F zTi+ATCFbvjLvCqZXW9R|o201}yUPPIApe(r%4EQMugc2!pOfIZ04+E-RyC(gmEvo(oa$=&(zY}>8@lAXwP_&FgUR`rtqpN;l8p2f#M za9N`eNk$sW_Zx($ERrdJY2QBP>EZkn>4Hxd{hNb&$qX#mVlxi`N6e2ta*YLrP=~4I z8oez@*%|EPpy&(w%F#WZV2q@NwBf3$QN(4o9RoV4c_$ecE`X%!{zoNIIM(GKB zv@9Rz{-+0ZPgG}2E81`@lLO4e925QN2Pz}!1FEd#tlpjYqvhHdXdmZ5fn&#eDu`K% z)SVh=U{3;6gG;zBDf=bQ?7cem0pwYq}FG!0rO`Dv=l((;F_6c(cNw_J+G1(U%{jNXCvPQL8YA>WGiR zeC826g4g}2H^Yy^B904iNXCvu^%Yo_(&%7+cAvZ)hKqWCCt6ttcDKS27qzPLS74M8 zVSR@|JL>+;Q|R*E`Xh_GF+eBl)%gZFhtss)VK|RUbBJ*~Ay`2zPoV*ZBZUH#mS|C+ zdMvjmfE_aW6oAwFAH4r&Xf9%O|2t6~^l6U=@O&Rd=Lsyw1)z@0R`Ha%HaJxo9UDre zFg~^AI@q=nH$JlcBak|omdXEm9}jZi)&Rem*lo|l$18pWufL!}Jsc0F7!U0dX6pw& zR)eYDnkDr)??di$JNRKf+L*}SzZ*tK@E&WF?vB#l=<`9M3P8zAN(Vf6so^ z7vif&?vQ)2y}!?Rtlt_5V=&(uhf9T6+1(bft5*O6=z$O20T>eP|l%h84L2^1&0iUIVHP} z+@b727=2WTmk!=|(T@)bas%RueDV#LnlwAN!kK=Ho3&T3#iKg%sTNX)dA^wK)`>!f z=U;n!yNxT`na-HH1IRe){IiX)U8;_^m(jrlAws9o9GrUohXcJ8O#rO z%@kkQnPY$q!F;N-8RG6I61&f!-Mc7(^j}c z0MNTMZ~qGB0p%u8+B`g(CIDsby#fOEr&_!CZ_0*ToW_%QAc*d&dBb)lbSc@9aY(oW z@{YYAqTc~Tz%Vk2j`Hw{LT-xnv|)^`ZPQU@!DhMm8ijX_)S(a=L)zcFf5FTz>j1vYTx z7K?ZiaggSck|v;|;XJ%5CR)J$MCKsa{XSjH(`r~5&3_3^Q6U=fsnfv38Ns*y=J6gS z5T8~t-5D{T2K|3&O~0|Ssp(9vNz^~vZYHN?w)axSZ@UQbyzf})zyrdd#za_;cLA7A z*5waQ+`iI&KC$1<5{#L0T}Tz}#cSXV?&CT!)^{_1R5(4y+{Bq?Bm#Vhvf#N1s8il&?oV!$Lcro|Hla~Q28IG ztKrGAIIRv9oAtQ^3#Qpz2e)^Te%XIF-yuW{{WmyFbK)5Gihv{QjzcRvZwf!|^P~OE zUvd%#bN9vAny?RDio`OL<)_n^dB_$ zGi%OYfYN`gZL@6syzsc_Evk9@_Q2&sr8a0z<`!I$I;i@l?uXsGGNT%w&jdoi>#$h6 z_H+&S`8En|>BclPT0iw^@lOxl)IxzO{f>Fcv4TX;ahHRP<8p0~WyH+~mTZB{Lrg)l zWf!6d78Yz$rTryTiIOIy{K-`bv|nt;IMvNKyB!fd6~z(H=bBHeVJdnenw0iqJww1; zd+jK6onKPXM>gSGn>-nA@nReDW`70T5M0();lk%jZx3#8FSUvAJ04&SeLf-x2Iyt9 zVW6pSL@n#$V7Acib3^tp-V`efpw1n7H75kb!?n?pJf|gyLGFEVg=Woa(_~da^#P(5a7|O1+pqPj=Q|7-1+dp_1UcyhSxfIDxY)A9-@ma216?(aJC$ z;H3I>Vh>p^lk}uYn$OxMJ5iWt7*Ua(U#hFLJ59!n^$O&7<$|7hohg$|f) z6yT2$UDt&JRG@0BKzh3Q5drsv;0bOshjHHoAtX!-sB)g$eNN=goUX)tDIfq)efv(p zVk?`FE`x*@$xJ}r>7R2Y!?N>je$I|B#eZ)A1w2koAHvgNsQDV_^8D5^2~T4>nu&C2 zh(G|qD=E~@`!vW+=Ro$XZ9rs`bh;zoz#tTfk%EqTC$32Py!=A&#wf)}*f@vzv$Q#D zoaOnW4i$d{DpYVZCBZRpRN+aCCN7rH&+?nXq$L2+?9)PP&Rrvv4a~PGO^E_AyYZ_<9pC9c*q{}AD+jZ>f(prR}C_A|BMPUxb+Mo%qUpvPLKaru^Z-1UP zo1JrP6{Itdyv~>huj-dT?#ax&MD!I&#>x1?Rm_@rc00wPr#uLFMc2cyznd?psaU1T zzO?}hc&RXE=>4NDS;GE*$@YI(R|BTwVzaBMY?@yR&h;PHB*Ge>sV+7^-kfjTCi$Ap zHBgti3vTqB8m(8a6x3DN23()|TU+VJU5oBX5T8119%YQv(^jbJe@)Qg_P;8bf-&SN z@t*84csUMZ8~aN(|IdV`zJ3K+M3)Au_2UtSpneIIZhu3$`BM5m=?Javt6=+bTM3~ zCJY4tqmh-p(%@wA_uCR6vBv*?j(D@JuV` zv6@;s)z>FUHj~qtlI6_yDgOq&v=a>|BKZr?;(KwKJ93G{wH4}aBWuYX-^pXJ6{=eG z79UU`2T(G_lWvU|=PSFyatElp$bz!ep|$4fM^9HgRg%p2N`FZ+I%V*Qzh?oj-d*Nu z&KmL#cZNkQL3w@f9$#xBty8=oyBur`jmY;aQOH^{Qp5$|1nv1-k|I+ z*S4zmvv!)6wd$R_evB@so6?qmFU=L#TN7IwXRq6WYv5nA-miZCaW|;xxKG?Q+lAE` zGVmbPANU7@p};qiNuKw+KugxEz@3+LW|vc!fi(|@@BRfC-z}j9d^r>${@uLxQ{VjV z?PF9}FIZ$%QcOL=UHUQg(0XZYg)jhbop1&Jz%;JxV#r29Ja*KKa822g&Q%PtT}$+qRj;d))VH)x5DQMwRIO6uSu})3Q}$}fro*|6eFTI z94>y~AEA3m4o&%->a{~~CzKt2WEp}adQ3NK9{G>-|Z4(%rH6v?PsnW|U>Cr1m+gGFMd3PWFPWT75+ovZC0 z(+<(exSE=Dx!W`8y7X#zFy z`T2myLVM8qLis>y#D6nd%f}f@9@Fo_&(rR9{{9 zsL5)rO#57@oOyZ2a52jKvx=tanBvgmHOX5X(yc$afgd_b5gwl`6?b(}Jd`e+_e!YU z8!jeD!SjU3={#LaJ9X8y156og$GaHKyj}?q<^aAriqKH6?yV@T?ei2`ZQWd>%IPv| zuz7zwC75&>Zh>~ivtNCvk!XC3g6G>Mebsps<$G3*9K+;=JHnj?I!gk-c65P zy!OaRm(aN_dHIh%+**Iii%Jc;A@dR(gKeP<<&SP^DP;<=sKhi^g+71|{#|{s3fV#e zn%`{iXObSC8P`{?d(%CUP;BJ5Vq$dwL zT@fMVQ#h&{Go(1|l^1vR{dC735aXq=v`*q*Q?ybxk)nnSKWp>k=8nr(dP z>6f7yxA8B2yO8`(V&?1mTv`r#)*@Zq!rt}g9^}pg>_rHU4}F+mRlQAUOOpl%cJ~ zxo#N%R6&tGsrYL>(3v@Scu^cx)#VA4AWd*8kp9FcIP9L>o=LbiKa8P z6{sQBqGd(Pe@csn&342JnXq{+(N!45PoEboYPb{`i-FU9UhY5SVQD)HR96_d=+~7X zpRp#Cc(ZN4ah&A#QF3m>dv#WbJV76L{w!fv^I2oGyBu`y7qj+Yq5S@4TiLEFm_}%l zCLQ?htd7#M2t{b3rdw#f958MZbEMc(L~tMLR+>U5^KAqA6gjZyDmaD<5k3cWS`z1N z9QA$<&L&$)=$Vg$4N+R?ngedgb#D#|Qtf2IvQVcGV44j2RlMH=Y^XzEgln;iMJLU| zbuBVDZuK}@o-zYFia*=Eb-;8UC$c69$a+>lYv~XmB4i^X-b&adgUg#Y3q&5ki%zE0X$fzlvPI(5CO@^H^ zw-ll&^#q!pziY7ckyBjvbH$qr9op8kO%F8`cWXT0q$Izk1fBe;!hWd}4fk;kOv~4= zDBTh(FP_v=O_u!aQ9hp8oYPJ23SH^w zM9*d1_wCSQ$#(AiX`=HTLR<~1M%UW6=XJ6u_j6C~TF_1K)_RX4oPOd>Sqpa*$2uij z?>8dHtnHT+r)zO{s-^E>y^R&#s}mwbT;(ks_F+G*^N!iuoQ)qq6C;+TEsQ+0-;95Z zlm9vA@QM4hwHFx0%?Ey^UgK@=5K?9%iBpU`eVzvNhrHoLd_aa`TkiP}w(>BB|{vM-l;yTn^(O<)@AfX@Jl-TmCNy{%2By^+3^EPZJyGQqdTx zHUg;*zG&WtQbe`v_P3>cCj5H2XTF;CR`iKyxBV|W$6Yvx&@=}MIkeP+lkkC7F8T>peEtiOZB?aia>0ELKqU081{bi5*v6s*&nP9c?Zx7`UMr zAw%ydw=$SVk_}jr%{ulQUy{_idom=Pt z%eR)0@4AA~3|8>R5bFLILZ=SCk9;3lx-N6lF%z|}s9Km`xVpmU= zMx;bx7m!{Wq!n06=|&m^0i`7*p8Y-l=gt4!yqNo$JKuZHoHO_HJ*RD{uSH?yot29D z3JJu)hp^f?@~tCpz?Xh!--Rb~`s(tqj%R=OTo@GwBR`*`0v9v~U@+z$XZISdyNNIrvij%D?=1(k(1_qv2=P4UzuW z=GyqQv;_Sa+_Ua=v!`74nl$T==ZgQ7xv|vKIld@+`d8MYMXBxe*iDIIfnL|uR91In zrQ90evCE_Wpx(wj{I+B1^;)F_L4U$s+eTCdwIv$H24C*S$s6rt_8T_WT^N=kSn3sV z!61*XM%9l*Q0V1Ij*P)P3XRGPC?=;4(2Tt=??#FcSHbOB38)tJt$#~vOi~A_=L4NXZ!y# zF8QVG<)Xv%)&6mj#uf86>ugoe@+WoIY>@bhQLx^=Ph2~TqrK}x(Z*H9dF2TU{eI#N zNwT`q7RBzMci`5 z;X}bPnc*QuQ`k?z@US&6IE(A8lbh41i*+6s(dwA}e{(ty1G~j|3Dqxe98Gi(kZT3Q zRPb|u+Su}%k5+v70+kW_=>}~4n=;NLu!zJPFPvv?_48AdElv!sN1r4a9y0Plj^fl+ zT^`j%nfZ$!DEO~o=RWs2?IDtkjX7)=+awPz6a08~#hf3MY4_!=%n{$%3&&<3xBgR_ zOJq`9lx>u~N^Z<07dL%!=Pj0Cqb{vgOVm-5&eimf%!CsWJ*~^_I}j?80HH%}Hs7Bk zM4YmvFbUFZY94>%k0b!@$aXi+SC_CO8hcNm$6*jdm8EhzN}Hr}evxT`y1c2-D0!87 zmb-xo^vcaA%Z2%;=^)%PE!EO~T8%Q~_@DKyK*6MSVLKGAIE0V%x*n1Ik)be#T5n4v}2q@8J) z57%1+tlQP$J+5Dj5=Uf_UHOp-1{f}~O&hRG-$Iolh z`6-=`6IGDx?_u8E-F9_vzbATsK8Pp)QM%(f3?S}j>y3`}i6uEi%tFL`SuEBkQT@QL zz((#%;2$5-AG&QKuLF8o{;~TudOz{;>G{6D&3;|}{Pz_@L7+Wlz+T@`W$$NM&CEE|`5>=BJgZ)ys1Aq8>0R4_h7zc4HV@VvQ{sE1FII9T$^|y5FXFhz6FF_wuaW z5ERiWQ&KikIgA3YX~Co@B%#H6(FUq}?at!r_)r8O@$#ASfIwJC+~iy2$2cNq!tuW% zaL;5;^~G$2CG_LiPjJ3+uESe(PjWNTmOgZ41PS2Ah%|e(IElYa5PNN;3~^GXP_E{a zV`l0t-9Q8LP`eR~u3r>UmpLLiQXZo;SY)GI|W~t}>}5qXyc7Ua8V%!X3qLbXzOYHj{eVz8KvE zwH2TE^A~gU7P(M?^P+$O?UVmENA||$AKG_`>FMo&XDPiqR&CN4jc=waB#4BN9;Pj3 zaEwSAT<7IpkAg>xL)JR~e(b(Y5~{>A0PQW|v>LfM!~v1HC1)v(E8vEC^yh<2*C?mM z3!=teNu^XG9IO$r-p>N8~OmdkG z13ith^~unAx8(NN1fS0yBp>6ZXb>kIJ|Dx$yn}5x2|YVSk$-WF-W!^tr1fz38mkqM zO?2Rn5a3U6>&i;g8CP?33;F5BC1y&e2Zw z^*E2v$mnMjF9(u$E`J=|{~`Ee?uo*you$un-Yo|uGE2E;-ub1Qd!Kc9-=4c#aFV+d+OquxAqZ>o z{b1ZHOlPLp^y29~5g}x%Xk)P+tnD*4*~hw)71>#?g2HtXY-1^_hW561VK(64ZJuOI7!#u7zrjW05a-ye6$`*1Oh}oK*a8Qw#ipw&G+ASJ zjr)OT(p4FWZznxIh|+Tsn`cV{c>1AkrHS9`0`HDuahnDd^yrklS^s4LaETAsgiU7# zGjeN9WO)g{*u<9a+f{kKapN|=*jYRykGXdVf$FAq*oKdD2?dx}G-AgL!B|2MW!kkf z4AiH`N~N+GTL^npOA8n&Aq}swfNML7w2q1~t8tkUhx?t?`z7$RCS24&L-MdQ_c{Un zvRr2oTv97k;9YUxy;!QPDm5J3O@%KD6QC-P_A`9>hj3%wU@;5&2dWCgs0B0Ea%odz zdbj_t&1%jZl@B#N1z)S6prvu`663$VL&96viXM>f`rTZ}orcKS4Zi!@efi9f$zp7M zOb$&9b<13beKXe2%BXz+?j4s~;?j+vQ2yu9wpA6xq8fL;LgIM}6yw%FtU2O4gGH)w z8V6aWJwNCe9&v~K?a=~e*eF12&JCf?GyV}~R6;?S?o1v)WExCqG(ciPR=h$=35-FW zsj=+x^>`{5cH*s{`WE%m{#Mp-$ez4`toholn_N@qbh8SbCXbWBL3MddxlCs&zSU9> zdn>z-^cV z<0Y=I&8i-1DP7(I&y>4^+txh%!$%)c~akiENw(?^G!7@C$%Va z&WGE+BR<@qyJY-rvB%wrGz|H?+?Ov;WMm&< zScQ)C;|m;JNour+W|lS(=eIGr2G@TRe6a;rWGBmVemvUj)^8q-j;W1~zb?JLtLpl* z3O++`MlZmQ}M)=y+ z!-ou)L-_%(Vz7b*ox_L#-BUJ@bV2agY%`Qgd71S|-XyerE+op{#1VXYW3(_)TmnkR z^mZ!#zYQFf>i#x;wDkvlD+z*(OCfgy$)pnfqc%5EdZ?%Y4Vvs+Ta;Wv0xWU00U4I8 zqZ`HY`H#^6UB-b+np8XP%kDEMa|8Q(cw;APtRP-X$kuV%Ni1|&MQa33END+PAk3fL zfed3Fs`8rFv|Xqht75VkFBsbdANRpE>*;G*ku^U{kTnC63rMQ)sJB?-TVt(@d#-+03bdLKrJ`ufsRB{+nL4Pl}!XB>rDQ9DwYQh>{B4&mIemGuN^SDWe2UkYl;n4ato=l^7@> z&K{jRaMl8+mrxKBP3a=HLyNZCm_C`d#QA8^Sh$^jWkgp!Jh)^rY72f0xd-*r>xXHW ztZafPa(q88Bt);Z8s58=SS&Q-CslwFW=7DylY_=OMxh?Z{2!b1J)_QeZk5tc1y7eg z93sQ>{^_wX9C6mkU}dBmh#g=Yap;B7`6UaPUVQIj-5N1($|6mgG9OMNeUNh$#swl>jO*zBQ~6qWLDeQ;or+4Rg!wX{Q% zT5o)n3hK>n;v|f{Z|)YN)bVwF^r`>o25h#!q_3;6VL4xLrU9$)0OI}ebNVnt&dHDe z12oIrZLbws2JkG%5;vu{=#BHK9;7L8#T4oT1!*Qu>m#u1CXxnW9?)f)xAnv3xGD9; zPRQWcA^_S4rR&_sm~ZAHtE3FV76L5x?gai)@IGCC%5CCN6j{2xcHFR>aEH;I-R1JN zQ~A%(IBrTiaOf7ogk*zl_x`P;hgzw!I>Key(o+%Wof~qT(ng_{&_?ECQmQV4E!Pz8 z1{>kWz{}M+&tGA()32-)^oMkz%C<(Ps2}~b#~tr~Jql4-S|m*(f0+~2|DU2kRe0m= ztKaodW5(i()*$_#V&J~};zpHxz85aNVf(G1 zT=0QH~F9y3G{t5mV3gpL{8qFLnPW`<2~swyYc0aea!6lF}|T;gce5^?f6WhQNY z2GFji!FIVF|KeZ&UXuD>4}?Jg4y(aDq5q@1Qp3@V$>Hx$uP|f{Lkp$*R4PTo+>bX0{N4Fv;YJLxsrw%0K20|%ZZNJ?@EK#GF zVepXKjAq=s7z5>Z$_P+4Q&a$W2wMz!w~USicjO!;+~?Fkof z$IR3CMx!n4tB$@&3CtolGpEKuNu>LL87zTs%A}lrt7_AhY{Gu3eqPh8lB5wkA1Ao= zknpLvnu3tv188$Nz~uTj1}Y-j#&1av|5tctEgq^oI7ABt{Nej`20`pH4@Fl#DuEANXLAiK9^g(; zc5}lc@7qajVxNXT|4+hldOh5#g%32ZrqHFO*a4wbp*d4MkREUhg7?da<*oL>L!qYB zk3YHXfI7HgyRwHSs(=3vvi9cDE{~MHF5aG;Kc?K^Ujgpj5na^K zl4-&!!i0z`b(`40RH+)gW~5YH?|KBbD5N>lrWGlhFN53AO4{GqrHoPcLZEbC8SQtT zLAB{oe9tPx*zx>ZUxXgI_=YCBi{>h3-C)jf=DqJP-B>tS^Z_niiGj$uVevl2T9*{) zF~^Cvx!nPiW4>$FjL`%)%osuj-T7ICW;>*lt?~ovwcW7Z#o-Zwa|`62sDFx`PI%d} z{vLHM6K*XCG&!t;G#6`s>jR<7##aBb?k|Pga(pdW4JZ&q8%D$1`>renkA|KKWEFjV z54{ZXf7UTy+!wmnq2Yd)fpgpD-zCS9=5GGf#6kAJ_~<(`P)&gA)Ys0j1UmBa?W3=o zpHu+-sdu3kQ0&O2uEDY1Lc?C)RSUeO<)VudFprIgn91biTS%R~ATiA=#qNKzcik|X zot!Gz#t}KoQ>)OLG>5*t7NQXUBeMo^qc#;aO3LKqy|xGi3LJ8bntX$Itj`5P>PQt*y(iBWmX!LLS4uCt{$g%nFrB|1a~sev@?1K) z6QgJVu;kgR0q?yWybyPX{R6%V2_aR_MSz&Wn_%K=P@akWqf^~_>H{l2>dza|3_n?0 zRH)>;Xc3n*`J+ft5`^nV>D~A=1K&rtz6B5tTp}0Wjx*p=p^euR!mu%d^l0MWDwDhs zgMR942Zf(0sXlGSuKP0@{1OfJcz%C+V)lbCxhSII`3&NwW&Ek5krblv zQ%QkeEYS@T&Z!v|!=;T}mF`@Ps;XU>LMpDz>xh^<^6A@T0GU&NMs`6r0ASRTwmeq% z1KGjnswjW7$r4H5r(2Egcrcj>;VET@Q>-)(??eqy&D!9gbU>}1yFDq8(LMq>>HQT0 z{~4QBuphhOMNKoj0Y=>W=ut^P*|@n|+JreRXQYelOA{&G{$guq^6bb4TOAR;)$^Or zMZyYg_=mn&TjvIY!va`2cO3-WOD3iWv z_LXIgJL$YclAjbGy6W3l@bHU?f8Nd_-2zy!PuO48SVzT8@rI?G_}=CJ=-9va##Un; zTZjehSd1n~vOS_R#hvhw9^VObY@FL@CGoioIpY3!#xHS|BMB}3^3ME@J<+5hy*}bf z_Lci|T|^c)d$K-^*o}j5dU}<2zh!eJH#mV)%hbgdMz*v$&kEV<=6|enIa4)e@8DJ3 zMlm{q<4(G0v0Y&x+pHMllg^J8HQO{-sVv0!WaYTy1;TL{D3RdM-0ZZ}Id8FrTTE*h z7sVWrt<?vuQ*jWo-$|$kuM-@c>UTKj<&8Y9}#kA4tH!pIF#9M!R#!k&GM-Y`%&h_ z6?hMaB`0Kbvgam!Q3#@{+}%WbP0h@C{XO6~N=@(|iQ;m^&khOt&x?u4DQnS?oL%Ku X#2!tG$LkW3nXhRgbX9T6)^Gj?m!9B>LA+WHx1qcqo2~My8g9So>AORM4cMGz(y9E#K z5*#kS|9!XKt6T3>O-;?QJ~OBL>#tAsgsZ)m$HgMYdiLxYuA+jh`m<*!z|*CT@#3k5 z9xFuk=_aZ64i0T^Z~wco@u>3Q{Pc8uY`mwZr=p^w@q&Y%J+rV;l$C;eJm3Ej z?v*8i6T)T8;k%T0=|AWFk%Bw8T1AB8Co9(TTOFfv|LjN3rhUzKV_bqY*M|Ri-J7-^ z@8uikH>D;Y8Xvva3x{xrT-Zi;MeBV2-h6*SDZ+hrljm)86m=ZdQ^j@SfKyIhHvIz) zITq%tG`u9B<4@lZzb}M(D^V@E{pckZNut9cl3SH{uDU=8vS;}teW((+Mk<(+Ec2dr znG);AZ_$Eac*k$L>lJzI~qp) zO(>T!DkMyf?fjb9Pzw~hf{6&N+OGA(=CXY2bS3S4rEGd_Y}>^dlrM^z{C3U`On*{! z5L~%oj4H7cBr^~auH2Vd?PTxxHueSgAjju2man@pa4siw=i!cn2r>j+8JHxndDMK_ zX6#epfS)p)Aw?vdqY_hymiBnnPKWk1fOYh1WA+-Tx{|}Lqbw6+c6QkCB}k(;G6hVc zPI@pktgDtf!{9(w>0iV6;KG!Fe>>I4$$~OzQJ{fZ{;klFB}d0rxc~>DNc{zv3uG71 z2qRT4*$br81Q9@Mu!%t;79>W8skU%ggZLBZ&kQ=*9ra)R<)<}0l5=+PV$rMW=Iup+oI zFSP?DhC~322y0=~71RM~COWz2U*py7!%oZ5^!7~%y0i%0`f;K9&H*vJ8+ zE)dI|eC?P042@eAyfI(CLRfj{`S%o0p(MrHw$^yHOz3qX69z}?w|BJ+k`H%6ebbL0 zt8PZxP#$hp^A&1?@%u}tUpREXCJ~$J83>BV&;P;m+R?V8R2uH`{Y|_K=Cr}T&?sv8 zSmg>kU(t@~@a(q&Sk99*{TA&jRLIhZtayvMse2#LRNw-hvcpWFl9VmY75c*5r1Y_) zxxp!pN?qkb*L6r7z$0kMq4wpGR zSI8ay4Iw5$VS63AD*d-CQ^&NNfrU_6J!VuX(4k!G6Di~B&WL427E8p4bQ;KKXplf! zW%Sg9mYAFbRiWW1@b{f4@t{n{3yIw(bOFhGtQcmi1L+g~-yvPZK8kez46@RL-;K_$ zAmVk^U8ksA2(O%3I%u7JddDZEH>(u)S#}#8eR8PTN`&isEoamsJt9z_xj-w-x2x8^ z-`M1x$?OmPw^EbVmok)ijOAKp#>!ne&&J~xuDb(|2^sYe()|LUv4Um3-;AT)embcz zSBs9N*RCmw5Xi@C#{jz1$`mHWVS1qH=w8k$z@?bxHos&-ijt>EB7NI6e=)L1Lfvm4 z{3{&j9aBUY;t6jB4pQ106tR3o;fRkmW%~Fb!b~PHsS;nGXJ}0gR(yB}RqKiX#iX_C zGZYI1NUh{U0D+HVcVTN)nVro>d1u;Z25{LG7g`h~$jp@xY#td+m%aUjo1r;m%sUKH z8lPC4<#{5SdyMS=kg&+Yju^4D}kZWKL2Y zI{z7vzIz^3cKi+w+81I_!U$vd>G`$-#4`D{kVP7bid>CbqlFB!h}6`#Jp;H&*qvRH znX-3zAkN45jy!9bFyWMwGYPzBG}!+AJz_-Zt!BAgICoE)R9oM)5@2RAB!&pvCaJN) z1_Dzvl5~0u;j+>483v0Z@&u}~lD6OcN;(9`)lfYcA@nrAtgezk9@T8XdZM_JU8~AEZ4VSEg%T%i=C(}lbLMz*;Do6}Xf7a{MGOPD~1Wa#Wlhyz$ z){u7|dO|MU`Kju22doR`ot_sg$=g44I+=MqRQ6@aj}p4;zlhuzv%O#1qe%0r)5`Qr zEli~bi2^dGR%kV1U)M=f^*Z&MnUg+;$ls^qOX#dCH+S&DPH3vB!4w|+meuz=f0Jb= z7Zyr=!so_kF!6o^|%t2jN*g^fiLCUK&>9L!EVLnlsE(iHo zGuL7NgPZ&Z%d#V?`wDR6zo@9*i21ad>F=Dz`re*NTj^}5SK!s;d4LHrV;Rd)mk2`GcHVq5!}|9DZ?j5xk^_Q5n`w2*xL#%bTgAa3x9$e} zIEmE00bj{5&EHuQT{x-GwbJ(Fd&iAFIl6V@MMJ@2y7ex7_16k}s{7I&BhsG7z>6Gx z-nQ;embh2p9~$4lmAy0&)H`95fpqm$m5qx9*BX8NPM1sd{MVL2=FkdV95EI0M>z^7 zGrRud@^*5T+_d{iePW&L!k}G_sA200rgyw`whIe7KeYxOg6qaSkLM)Zzf%vpRu$K^ z+^+DnoG}?!2ox49dz6R+bWW@#5%`@7QyfRraUZORdIGO{3K%4_NFk10a|84ueY3)y z*aQM*nBx?f>8b0%jdIKBkqK`rj*9VWt4y1-?d@T3PP4xbxm^Ioyn(aaqA;V$4|b?u zijXM98P4vQdzV1yvV>ysD7pKIlkRu_^9TNVQ2X!nH8EH8s+DCax;@Sr}a=)yVz&{hpY z-q0SwJwQrUHW)NG_;Ja!UE6Sx0?qHm7jzanCI~7#qj>)98TYseY`$u`Ntuh&P%B+D zu;GH++bPw|HH9suAkU;`;a>{!XV4hl&8KC5$|HA}()!gclP@Mx9by6HeZ$R8{|eix zcZOEE(nxJGj07W+Q2lRAf?bG?VYV6Tl6OFv+z`CJ;y#PTl&f4^qPLR?4MdhKe;k3S z=MF~h{#eh>1?54kx|AZ?U{b1IbE+TSNtSBqQfF0b5vPZg(3`+gKGX&+N7hiy+J)A; z{ks1oHvKbK#iU>z(9UXG73?&kpB$)jE@>_{n02MOQj%_#i{aumZexMP?}y)7HW^f z4|0=Cy$+i`OM~>?H+Mhsxz5hXsoh%Cymu5jUbL(N0+0vBB|cHuR4kNVc|z+>S~=be z+G~ypUC&a`$i*sK8*Xy~uZzF-5kTuh>43!EmuA|x=lQ+K4H`P~*C+Y2!$T_*ub->n>YMc@KaPEut05MU~VTZyW0qSCW4rj^p-~1Kk7^xH8t;<%tU<}cfvWhnP8p&zODr9-ALvU{bG8a|&G~XRYqTZ!vg9G!9 zc%>>q>^>$#yJzQSu|>j_!#=NPEui=5zEw$PLTC2IS51g-UZvUa*}=_3l*dFN9;yg@ z>UK9XWh+`jJOCjVjmsGHdZ=InwZltMy-LL(?YB*Jf!x~?jYF#6b~zK4eA+!aZy9>j z-vpLK5W45IUzqq|L914HK2a4E7TM=#XeDlz)+PV+9`n)X+zn}{6u3CO(XeGJDM|Y& z5I3(<{!XZHp@5|2v2MV2%@0}K$a#@Dnpmg%*@61vGT6`d(o#*<+2W%GE3Nw^3cxb8 zl^RC?vC6Nu$goO`E{SRin!L^E<=%+FXi9-Hb2kJdq;JtRadyAyz6M=W+}eg zGF3Rz{H2l2j@XU&d~0)jB!eYm@X)p{<@t8LR)6b{L)S+b$n5dirkkCSt=(MPW$w(F zH?G-|U2iMNpPk3UczHk9>MYm#uPnTs$#l zyESYmDYIA8zCqQA6R6fLZWyh9?*$`eR=uBKPXZQX-B^@cqW&CIqiG-ZCy(4&Cx-77Vn7uuH+UV zuD+HjF_RH3b4uPAqGL$Z;Lh!eyd0q2 z?#pVg%fH&;cr?2GhZ&vsQ+KIr^|FkITB|eKnM(pdObcN$rwIvR#%b+=)LzCAzVW?J zADSjn+rT)+2b1Z`f*U^MDgKaF5(<{y97?nX(&ff{1nHM0+E3Vxe-U3ZAtx`F#G(u9N?8IW-zu!ymbx$SV(FVcwN{h9Ss;$PCCSMyBye6F+Agjd;jH@dweOi)d9 zSRp)%F7V^9c{D)&jreXvZqEs1D9LI_`m~pKm?8C;&Q_Ug1Y~JEb7aQq!~F{Sk}IuE z6F%{s4O}A+lBYUC)G34FCiep}9Iker6nRb0tzS;o7t6#fjBi%>0Rx{+MNGU+em5?; z4bP4V{MBHg!|RSV#To7aOl3Kq;OX+|LxTV;$rqp~rK@o!?f9Sg_n>dQPceN|E2$LB z3n%xJl8uzrI;N++wMvO$fgwf%cr5c(*5gF$%BZwsj_Ho>15NZJ>bU?k3`^R z1}CQ&zEzKY{@G+K^jmdzOR%$mo@z!uXmut!k-;t&M$T__uk{FDcJXL!TEcjmWTO|@H8iPQ9c)UrsUz|ARZiQ1;F%RDzIBtLDhqEUDD z>QK;}|4`01ayOt{_u_7M=m{HgW(@468bT>YD_cZW3dF0|51 zbjz~Xu?{Xgzu9~K^5WD;Z@oPHUh;U|8k_KQo?^@*ZZ%|E>yN_T&828La7JBH1zQHp z`N$JnFseBn=al^@k^W;sdh;o*Fg*ROiEER+yoa$jI~6~6RO@y{A8y1iKU=z#rXjiH zVYeICt#hFioZgcL8`wx2f!rsuKQn$7vS!X@_W$DEzX4eGfYEPGkQBmg7}<7kliuPC za|Q>uAG<1%9(LTe?JK@5SxK`e@t&TA+@Yf0DLhoAyHkDwwR_CmY22+EH>bA2WHo@t zoeSgk`T{AZ0g~3^lt6W%qXoTWd@u{j)*d%X$Dib4a!>#d(~*BfTek9>u^<;p=!zjm zCK21ot7=VS5)xL(+NZ_o(F{6>S5Xu_2y84D>(2%_WX9TSk!&=`14R4c4mU{^cCE@K z`(319mcYtnm>8-F)dksYdtDZ3nU%BiP%yp3e!l9|@3xtpOAC!qQ<8%9c64^<7*!~T zh?;oj?De#38gEX9(7c`Se!PTd+28jm5_b5r2J?P3izz1$cF~ciqRJnBU^YhhR$t72 zIq61?C}^xo8)M4MFS#k~6=K+KA>xd|+!F13<$e>*IGKUbT&2~6TEYs$?hccXAt2Zb zMpSGTDNqu+isem2k*j(zQJ$FObk+KPj2cm5{%4ksuKcZ-4uWN3%Cw2fKv)nd12Uw+ zAb?)lGvL9T4pt7aLVY$u(Myw^{-j9MqUt7QXnf$qgsRbAeaj+kWfzwRt)lW&qF2SZ z-89aze=d|EkW4!u1Qxvl`h;c1t{lvq!T|Yy6&7We6NU#V8=|>0?wI#kD9~tOGT3C8 zY5({aQs=ODD6*UlxOYW5?^x7d_jXFFcr|kl$zvCiZz-H)`a_?WUCRLj#?Z8KKmRR|%EupX{NGI(fAod#cdkuZ z1RCJKuYEQ4LH{bC;!GMzx6~Yr1=<;?k=vqY!OL^)*w9JA6dkff5v5I~I_crPI!X59 ze&M5)d9^%;59a-DUg9dW;$-uzcEQIT{q!!Z#6pb>{3t2|T6NOb_$~;D0|vkCIaH1* zpwh7vZu%}wu;v5xe={(S}mQ>V-n-v@2d}Yvk;w`qZMf z2esj(haq0$NLix^MsvIi6rupP>!^<4%jHy+-c?Tj&iyiep%#yCXZfOcfqd2zgeKI{ zKSxW5QYWCv^ivdFYTLzA7WTXb2TPm?=(Fy8DU`oAg?ByP&4UX?Dqf_09Qsd1 zt{)gbl%POA1*vJpJao$m#Yz&jLH?M{3+fdSK+oTfode@?jG&5O-W4bEMLsA&aXSYO zv3ekEBY@r%sp_xza&te-gw6?sRHDRzXYA9P zEb4)|j#xT`IHVDcHYCJSWU{fkp-pS-3(>&72JPR#G(TH`N-XFn(K~lesjrbR4~ASJ zbb%OJq7a2&<5-;ty|)CmX>XqQ$xyShlat5L*O!t3SjVp9sijKS*KX4hL9LFb$}yg< zy{1#Oj^kS#X|pzbwkf7Z zG`3)cD6z(W`<_(p96ylHgPpGX!P9flR|`!y+F5os_2in79g{{!x?k#og}U;B_IbiU z6uTT$K#_Qz-hRo^SumvPp?LoBp4UqFS&_=>*G7pNdlT=lg38fz;?*qPq&~?MsoXFM z=$mKr0d^!AvqTCK6w+{ko+J!xm2$4%tv$?^+=+<-e~)p9PB{G29z~>o~KFE3^`8N)f z>1X`!0O~hOhmTwjWTG($Y%D`5-KooG_9{zc9+~f&<<|uanAii~gdyU)(QP;EIU*5j z4X9CYPp|n;8=MU0079D)Kr5LXGRA-c0HI}Hl;#`s-hzrgmz%^8PLlb#cBkkryoL#; zSLcbM52wGAlxqbo8?w^nVP9m5xd~5cSs*x!=7U*k*e;-#;lD7EwxhGm+oP)qt_iqI z%rmX8ZAB_R-`v$}R55-iK!*+%CmCLBFQb`@B9!FmT9`@L$!tSMf2viZGpfcrJCsDQ z6nkW+lOEDX_pSgZY_bTBCqj z2%YCcD*!m~0h8McKPFr(TbY$tihzKLG*+0M^{@TM+Vy1asRDT-{Fk5;23b&4>aXR( zQQEeQi60g++|wDoJaJKEWM?&|vAGxt2*+?Vq8+nuSz$+57_ZGghha8W1;z%qPeLN| zRA7_hfR|YD+%?B~S7SMmhy|^cDrrs>Y_n?47^P{DaF@{aUH125FgKTD zbkX->EWqCkQ&NsVqj;=)8`bcb+Qoqe%=7ZIFCCW}1GCZ;2t1~Oj}(#~JjI29rdO6o zvCZM}-g$b|_|aEzT%U^fHQr|$AOaCwt5|Nw1Z==QRxCPpEB%8uGekINkQ1` zWM8^EZS%YI(6eR9AR1ZZeZW zSkTkU`vl6e9{N>R!^cy8RR=?z>YGkq8=?4o_ry=kO%8cMRIHfqLv_KN$)Y1ntw%gpaDB;Nq_qun5Sx@Ie{U8? zed?I-jX?gCJb9Xm%Y;Wt(n|if-ieO__Igj!cw#L(zgV?DgLn61RasQWdg}4u0x|mH zKUQ?V_rdb4Vq08(oP!^s9)ls|doL?&Jfu|M`>@HRj2eQ*iHbrILB-x}Xu8fsnrJlZ zH!e}5c6_9t|7#rv99Y+z8KpHD$J~mJVB%Mq!nK97+z280&Da;Pw>7k4+HJGH%K497 z_NF52M^d+Zth3H2!h9fm=8{X+Al(=`CMyOu4;mD68=QnCeOzHcgvrGcZT5>rQ~Q_! zg!4U&Z(0l!I)`@f!dr}TSi2J6$CCd+_|0~)zU)bDRd;bs=aRNOG8n;(BM#}eK{s3> z1Eh6msGj@sxoP%|g-)MyWGLhj6?6B}GFd?t=bN@UnQIyLE#p>xhIVy4Gw=|(+3vG|d%{IgZ9 zu}>$bl2UhvagIbeCQ}H(n3op%eotC5&?k!iEU|To?;o4k#%QI;S4!>LSvQ@zJps;( zsoHIx+UA$gu`JS(x3Q+LQQr*&ewszn0}bn7oXA5#DC)!S5E!`}77wO!_+w~SSCpcj zvTUqpnaD`ok^_^(9BSx^nX1H0JW|ok_1A21E$6wJN)PKXWb;ktCeN0w+Zy9{&qR`s zTuUFd*taQ)P+;3$*L*;6%x5%!XZD0g@)eALDw6-38i*BAICz3Z3}Z-OK!hFZMn-jG zp_YA*bYuYWC{jqnbnI{lV60>jfAYWh-ylT>W)sE$ zIspF|Pl7Z?b@N5X>*97vIq2T+n_+!q<8O=f&$1R*U)Y z_y7ETC&%h?m|pB?NX{yWdEaEbQfcQ$WKyZkZf_$ts>vb})$N4;oB(=f`bEsfoN|PS z5540HE4eq?USzu!y;2XGjw}y3OTa=0_`{fMa#q(4I@T&&r$cf^j`W2=#bQQ&+mHk= zw}IK4=vVsw)KDs)w;FV$8~vHt;wD?%43z(k{EmQ?tx6DI@(!T_c_1?ik6>y~ZRownqkDo|Jqu16%#gBy#;*HKUcB zkwI%`d_a`Nlc2=kA};CeH6j{cUQjd%w={uK_ss&F&6X>X%+ynV*#*kA)WI|i zEh~;y$(wA82M1MLGn|>17aOp9KSv@@J95j_EtR8-lhmMavFq3${7xSSH)cAxV#BC{c><3{)QZeRyU(5_4r{CQ4ymD9gr}P0a~-Ev9qac&HpUk%xFF*Hi{oC5W)RYp$S6;Mj)lc`v2B8>Hv3YYVmKT)liJlqP}9Q=^PJo36G`b{>9$ zcyvO^m^HU5mt^XhI(~k7KWtGynK+G)wS{7V4lQ4f4A8dlW|MDY0d`1uSPCmLCpg|0sbhkv($4Moeo z5RPggd2}hyi+M~469kK%d;tvjxRt}c0}|EJD)OAuxodv)#!%q6Y>f#_mP2k_x|L-L zISg&mWRNreRknqqBJ8b++w%E@PwnKaEyl*|*6)tw9nxsA3}J6jMGM#;k?wc+gVdIu)GDMnDhFEOr!X>v^^{gQziD=wwWu`j^+$+f3Q@!QYq1mH7% z@bxjokCO-7?V{SEr{UJhC#)Udf&8M(s8o29= zsgcPf;E%^^Fe`|oA%mPtb5i~3^cFb*2gjar?CP(pAdSQ_=$2BtHbR_qDSTiV!XAe$ z;adTKWsxBG_9P787a&%_jZM|hrzFm2sWxbP^>S&b!czh1pvKxFc&s6fgS$*l^NRB1 z<(4HxBzB47igsgV8KqWjANfi%d%aEAZgo$Ft318)R0jOSM7Y6GX&)fuq9z(p5y{O~ zhoE83?RnJ0T~t@MZc*lp2+ZwW)b*h`;)Ju&`Bs{gl|FF&tyX!`13xpVu10LqpC4uy z!-h2eN3S@Oo0xr8(q|u#muQQU?PiZ`+MGv5?W;`n*GfGW8ps<-2U7nI+$Wh1JWn!@ zzW}lmYHz%wmbd)Cil$a1l)gur6kNT90K?iaH4JWk{!RO!#bzCCPK^i6NTLXzXc6>y5&ee!xUlsyZs~_6n1JMA zk-m(vs8j{6c{g3>{bbM-Ru&j~Pqt@QK)Nn1XR0D}VvyxzBVRPnmqX_(Zbx#fJ?5nM zsUn|=Z8U9Gi>JE`qJn5OtaJzw;?4|?==n0w2S(OecC~wF(&sBEgQ=vAg9>KD^&z<| z6XHc!&6Gc6*<{Ay*m@;41%*0CSO|hub-hf{B!Ga4Nuz?K2+|0H_HN6QnWQrXQ=4Bw zg++nnpX0N~D|^sUoldmQI4mkz#(7GpzxA=J3PHkqQf$pGnhCU9C2)cX=b z2M*DQy1n_V72E>eHd=)99Gkx7_`UJkNYPdOgbi${3>D4*l5L2RIKWL6g@__Z?z6c~ zJUYQJCTX`}j2T=auzaEP;vWFAb*+yg4=B(bd1+ znu>_O;XX2aTG&FZ4fk3HmaAl~I&860Kv_BZCbu^x4`a+mX8Q}kxYkf+)^m*Vf}3PdI6(6s?)-n0aE|){L&NDIMo2PJa_cLwv3+?p)ZmvAVZYvb z2`oiZKqLlgcD55Aql}SxXgtTiW^Trdi+V?zL8jLayjZc`M=s!_#2h-Sr6YCY)C&|2 z#bLT=AL|5yBI7hpR(z2WDW%4R;?)g_(2?gaCDJ*Ia+j37w4Y$akCh&&n-7|{h}cCV zPCV!i--Pkri*ZSQPN%O?$%P#Bd=sLP5cw^$_TA8!a-mj5KVP zKdqPUT)Me*Ch~fLPilMsM`i7wbjmfA@(Z(AOr%3t->B4-?COd(WS?kjLdAf6W{t~E zZ3yBoBDp!ol{IJ*lmc^8Gz_cMa(uA~l#$ zKDyk;neREKf?ArcRRDg`pI2LGjY^uD!A6ekDg|NeILA@WE}SHZy!_z}1xY?f_eP^| zSxTEPG32x#xxu1NY~arQS!lq6Izh{eF?LgXEU#EVZPa#>yKtM&40LcH9#f#BmTY1w z_oEiR-<=EeRo!|S*xHMx7xfMxA`16yUj8lQ;4yN%hXyAZ$sDy9Eil3<4TGbeCnf-Y zX4MJkI7Ll;jj?F>MQl(6R@LU5Vb&8Xgj1z%38+zKHPe}4S=c|sxN82q)P%-vBFePK z;QPq0Kzo|x+Utu>&bP1v%)T1he|>e$vSlORe-qx5X7k0!Xyc4~wJcHPq zp|JM6J0M$n)IEx&e62>feMgo`Y@e?P>S6eJ*}K&3`2Ppo9l3z(wZ!xylF9Ipli48E z%m4Xh4%)WO^Tvj^%MJA*e?`nl>fJ8u3SBSUB<%x+8v#4gvejrHi)+M#<}injF1~cR zWfH|J{96XBH0Nu-}|!-SP0jy-moy2eP(Ym1AvUl>y&l2#|E zsKS+P`N#jtu7NJeBYtfO@bs}w+Hm5T${^#oDkGf(Q<|w97WFXr%~bqhOJxATBVV3v zL`}k<%}Z5F4P@N?HBUJ3UDXIHj!th+zsFFX_FA!4k%_vf2QEh9-bIHRZd=fFpMHJv znD>r zK=Kto0cp&$&RFl$zNejW_QsI5uIt&t_kXttsmHWAEP;`?Ap#zz*TRX&%3-$<$ z@>j^6dN;LRnrK2l+l@L6S5yH!{Ip>v2wnWMXh|y zly|pb3XoNw2n75YtAIl2UXG0uLw;!x5WUc=D8xXMu|7-!jOJH{KV&09Lv(#)-zEc{ zv+#-;cP~D&Y~s`5mrrjZ6V^9Qj_=Sc*ZKC`MAs!5^bh| z^dNS64}H&}aA{9F$(`oK`xOB}r(`Lpmw@3Z$!md~{BRo%OQm?jOc9@cK8aA{G0>AC zz>V~=U&_p>(GznDu=nkSX?8uw2$fi5?vR4Pw^j;fzB1KU$(NugaiR-=Lo5G>(_qaT z6tsoA)g`_UqD~r_2v);AJ$6kJsyZ=wPHC#=swV&y$BL_na;naiW}unTVM8$^j);81;C0N(>^b?%h#bZrYT}IN?^&o zART*A5Z#JYsjs(2C_Y-97UYQCJkcl)uuE%vtdElYQfkUmX!vK}+qZTjLPzhfU9c_J zQ0V)VrZ4rW4zcw)aCcX?BV;YW$lk;k0^h`!C5fQRG~*en+8-;(7B$fL{k*wCmMc7I zBa6m&BBCi6*lLMW$I4xM{RHm_(?qAQLgwj}sJ~P*>1Z1Stq#47lsE7>FsEMA#ExcQ zYVFo$>E%$$EnkG^0A5J`WFTnvJ(6?%u3T1Bo9N^B_i2W~3A2RYiabVs{=&jwW;W(p zI_seC8}A_8wPh8r;825HocbV8R?ZsBVNsIuFT>&~6{$`Y&2_lddt|Y9Tnd_ecq%-Q ze8z^PIz3Bb)3>0P5(Ql@S^FtcgNbFB?lX1d?E7}D$Ehs0q-gM1UH(!w&@(K|Cp3Nj z^I6KDVfc9}!S*0Hb9)X>*f7U`_PC`f}BpRq&a_-b4roSNqaT|!0MoN!sY>F!&N zij~|qKJN&glU+JnJM_3i626?LU@sO{^X$|XuIWLhH~oaIyPt4Q!i#0%)sojL*%m!rtbG#U-Nm8ba%;;HbN%KRA?;CUyn& z_yqaTWNQaC(=&C9gVU9R4y{ZM;B=Lki$`e~2cJ}Vj>onul#3COAdHlq% z$zIX4ITR?gNInWg`uC*kiPU&E`~qk~_X@MV=_!?5{lz@rvFn@-1h2)3n!j)T0T**s zDccneA(c^<8rhbKY&4N3k0DTc@zWYHe6F8Ty`X?39k#-khIU^YeBbY|`?-+p*ZXV7 zO6&FeNFac3P>XkLNGC@ROzaNzw^a0q8F1b_dSPM_1MWTX-VK&4U$BeQZn5s1qy~5 zYja(cn>WP>0rO<0SKtCI>%r|SI|zAt_03t z6pYA5jH1-K*c1rNk`NU~`f^3KvaX9(#saS6lMNnt(5+eQ;t*1?8$r{tt+4mhi1mH> z<@gia%uscLe;nVVMSQ*e6vwFQfWMpVK1j6!qP*6Qm2Q!SeR-Pb=6 zSiWG5dxed-&8<7}9oz6$f{fqw`1tRdweya6#1ge$q0zQ&>PHd90W_+LNF5u@QSK>k z-mSZn&kXDPJOM(BpKtv`>+2u&2@%LOW#PSlZMmij{4-q}dJVTZ!u;RJxmr&(lGNb^ zeaw$2tQl+mB#@gAkXB+vWarc3jTNA4@T~-FaLmx>!;Y=Yt=DKQ%HQfv7K=|{MU)17 zpYoG3UciGZT#X7kKx*8K=wwSTAz44GNY}>>G$S!-&1PJ=ZdNfQWS*&Xc zY!fa70CN*d5537X7wupuONAiz1yGZWzv?-rOeR+aLATk?#dnDbc`u@@DI3u} z)`0h1|5XL03%h42l zzc9BjS=jZ3fVl0B?=Epjemv^6dz8#MN}(Q zGP$gCR&$aa4C?;7;1q#MvX!`x?_gOz-?84(=wX&nhQ1e`mkF42kWwRhjr6H>WW)6r zQwDNI6Nds54b*)qdBAP0s!$_wjx!N;m$)~})x+ccTI7onnr|=QdS)IwdiSnpxXXMA zPa%=#4kMD8B25k{XZ_i5AnC^c_{IAaEQjp4AnP(NR*9J;z<;_R9}jjilX9NPf4l4R zz%Tk8Xj{xTq1!iIt2)2~?<^zeB@xkWKeZq?U z$P%^FXpXsXm*?jC2pk6yOT57Wcl07%)`FVmZ#QA)5cf1U*2e6{o_#)u+{>@J3OpgL z@Js$C;=_}TG-M_7ma;-L50fNiJ1VO)-1Rwb)*1J;HH~y<{lpBbZA$l3c4hTQu5n9o z+c*I7WVR(~L=W_d|F?b6ZP}UAqzn~#3w30J!=wQ9EpkONUIVKJ{v~N3&Md2n44NDs zua5UtSqoD)Pq<%Hrh(>xG$}v2)FylQbBjFg(f5mnc$pY)i$KuhJ@ZHIGNWl@s}Mlf zjb^Ff)06Er%Z^aaxlx0Of;Bz`N*O|fev5AfGIS=tDHcr&ssuTW4a;;;cB+LaMy?sK zH}{1~IRX2TEXWyd{cwB!$ijTG+}Pv|df7T!#(ng65Ol zz6^ly@%AYv@kv`WAkwO9GNKv{bquS%LcipoITf3Ozv9bx@v+Q9%uy;gC|$GSwi4lx z1U0($V$|k0oC>`Kpor~C5bcqOS6~;d#2&kdx0X2i@G*zM@b96nkF5Rd6HV%Tn_08| zG&Hm!A=l+I|KuOgHV@(fM5oBB4IK94S08YkMZ4>sj4L|Oo4K^P9Y(?DwUe;VH^~gBr>|Yuqi?Ze6^j``D8rmQE z@yj0FTxJG&6r6qlu93jEH0Od?Q`S-R&*MB-fyxr{Sj6Zy*3U)_HsS{1ve%3&pR_VC zA(d?EAIZ#c`qc;F8@ookmueZF`M&VTH;IX2j3RRb|B~5l({pB7Nq|DO4-* z$o~{;gvGz))C&S-@-~l##R3_h2t-lN%z9#+19CZ7=X+C!nX#kEZ@_=f|pJ( z&%x3)aEE$aM^8*zu6Kg|S6Am9m((Bs`?7MDrh+pU<^U(|oT*`M1F@V9%)R&4EKS2b zbKyWxFwsm)&9qDrHO0MCbLGm+nQ7ML+wb1TecbyW58%KbpYwjbUeDJ#kI!N4eEpuy zoxoW1(DD-33+hwHjkT_&8xZ5o6sqbg9g%kCA9FVMMC!|qKn9{W_>^#CD_1Gzo})j7 z7^o6>GuG^m0Ec^&OV?lFMh=^@q8L|TSD#d-eG0a%&6kG7atYzzCZBmH0~>nt{T5uH z6vQE{-J8Pavst>7<=-)`Q?`ri%$-Y;uhJbEqI}scD!7Q835q~yr@6I(1U}8<{Lm{npj6s4Ead-+*ie4@3c0#)tq|$ zQ}s5t-IK!}ce_gLTSDj*=T`mm869)j+izoC|HS?{fnYdoe`vdxAIS~u>HH!WLDco8 zxq>cC<{qZwy?06LXY*1}>#?Jtsv&&HN$&N4eW{L*;SM9vs7Ko1I0gL>%q;R2g5`ynH|;Vz%Nv0f$Kr|ge(i;;5Dpxn_l)GAf;e(>t!yxT*hg~m z9FWW~VBAu>?RAjT`uDoTPAgB{{LXlZFBdQ;1pbx1)X42VdlB+7Hsp}ox9&N13<;U= zoC(%=^S9VsN9D(!`swHgQ*vz(q>2_zFRVV&#Us8{Ntfywbs6bG+iYEC#<|y)?K7RG z#S4SS>Le;=RH<*4sy*j^avI0pp05Ob$UM^}O|CX%Fcf#GCeOaed2%a=ROd#x4(ggqW4P>uxw+~!T7>M1)|6EOM61DBY8oK8)(JbXviar=^` zuBF3Yu{dFaL>j+E;@2<>3ksL#?RGk0Tjgq2K7w>VebAe~aFgf)1%B;fIRh_c$dm2b&0>Kq)qPv$O zww{uZ|1GusovmvGesVn<3%7daw1oa;es}8gVyRNKDU3m z`rj1FMYPglAuVzJ7xz*!TPjGTeB0Bxd=;XgBJC_u2aX9q{&*SKN?{{Qcb-->)NDG6 zttQ6&jhmBRfQ~sH(*EQkWZ0IO^IlKTgtZQ+xzNWE%xs-7ufZo_-Dhmx@JU=e#0Nzi z+hpRA3+6vh8xHrJ#J>*fLD;D{iKk>(jDakKKBYGdDdjAA=Cm9aUTdtL*?L#k<}W$O z!NeR-%tdpyU-&t*q+>?9N)f9(_u}Y11F>l^D_Hhg}J=5K+?8^Q4X0ug-nH4yo^tO&6EK}FQ!_{~alUZl& zA#WaefiWpHiXiDG?Pe-R?RY^Q}7HPuoZrgVyoWpr4 zhU|B}{5~O<>zPfBj4TcFryp?>$U&*tjjU98Qxc<~{Frf^ ztMh|RkWZ8`gF0zu%aM+IXzl1YehJ6f(lJ^IQLfqjX$ZP!|Sk6Hc z+P+lgLN7GHftM00dJ!R#fNb4AtPM*CS)$xhS^x z3xzM<_QV5Hh%lofrmfm<{Sn4y$ z&&fJU^~+68oAis7YdjH7+7{?H#zR+dPeRXwBh*uB@&OlueY3+>&K8$ipZCewcsL=s zGM%Yej@log^|ya)DnVXwcCOz)Y z;>durbB2JU5#Db}J*dxM7~0v0TuUJ`j`**YI>Z4|-tg@y zmw_~IuhRAVshEtrD&89MuhrhpJ1Y3N7iUc*yZ|`03`wMO1Uzrz9*Gil-mo^zn9$lT zszxr2e!Z`#S)(Ctbm=}ou}ju)GK3=n@2bZLemece^;b9QgcS&dz7{gB_J8Iip6IKD z*gpee%D{K$sOe@4wa4l`N#s?Ms`cJYJ)_()D=lo(3kvjyDaQwg$d#4 zf=1GSaS_5V_j})K)_3D#-YNCpM&F;v0`aDI$2p8QFC1^`Lg?lA-PBbELWaav8(eXO z54uNJe{^$wiA7)(2SK{|a5wLGX1#qQB52p9LU~6C^@48VR8YqdouK|~%UlZCIk)20 z!RfiTOlS6Rr`v?O){u?j!%K=Lm1fMN0Y2~y6#`)lm!P6z!uhd2#o**dRu`XEs$ifbfns~t1a;;H3*;XwVifS1t&J)zBKj=pQhQHo`#WX%02|&y$GN=ak z$Dt)vsd)H>Y)#UqElFViyJ(IBR$I%V;T}Og!GpgBq=8&4pcqW@RZu zM}9iVQkq#PA&oAih+s_5&$e=YkDDbXQe@(6CAZ~{2L`>N4g3oc^|E@uVse2mG|&RQ z_y@fe@HzT(%4RE~6n3wa0d}!)ZOx7xGW>n|bY?bd@l>pPxrLBOXC}1mNdk~xWK9)r zKpp>0>Zu(vyOz38W29vWe;-m|R+ZqHJ@eiS);B+6=OA>lp?O#t-uJIj0JgqAEx55R zBBqCCgTw!LIX|Juy<0Ddsc_zCjR{hZu+(z4@!mute-e(|*NZ%R&-=_xKdvRx|NWYe zs?}_u|4W#zPyOyzUwYnnZ z{gyC|iq^?*rUP7)i72tk`bZx$aMrdOuq-!!m&@mr8JMYiIZgu(!M`YR5lM38lIBCHF$gxw;HCtw#6-PXLr;w3gJ;d+JNO( zlIlYy3A_nIHnA+l2CI=3AkM;M#ZK9TBFCCdW8FZ zgQJZzBmWDf&MdUTlX@PCg6jsrS}rhli= z+k$0XX@RyfgX$*2;^rE6)?A$GhupHU*;J*+~qku0We|0LE7 zrtm8SMt5V6C~;?LMbG|EcuDuzwv{oV*Rz9?U;yKo@;st#}<2@8%dM*rZ|dywjvj_o5oH_iw} zxFCx3u`Z((OQC%Rl|XQC7nCcW_4ZXct`1C5`&-9_X$ctdb*k>2bzc*Y+?oI49xEhO zukZK<=27CSNjDJL{<)PLY%m>Y`1<-1)17T0xxv3awVn-yPC1hArY}hUiEnHD>!B5K z83;(39t}NqLLs}(-kj8|mw`bB%K<{y&9s6wi6j0|5#UVjAPJ+`sQVk*lld2mM~Ubu zQ8Kk1%hD=s>W({(EJnYX;Bn(j1eVeYW<{|3>Pg7)RoJNS)phU%B~hd#F$=T&vx=@? zm~1ZN96_=D2Kgk>*(44_+)oCd32EPPA#U)|g6F;-z${~VyaE(+gG^=4*I>V_VJN_w zq=B3(yIz@Oq}_g*z3!ZPp#D(m5bV+zj4kMp6fK`t%Ci-Z>O*$6eJJb@ez8liGr4){ zd9stbKu__H$^tmKcn0!W1mZNH6BL9r#bfK4xgvO15B)KZC(=8>THZ5x>CDuGaN`nE z$(GBZI<5U`4$Bi&?3^9}kS9CM;8^!1S2_ckM`h$MwVdGv6Y=^6Wh#jZcl>EsWoKq! zX}eCGn%=r!$zV9>VU$t$XsW^`^ZT+rh{a$#_K;KE>lQR;Av3dmg5@{NT?0loPJAWT zYqNU_U5oL>>r8#Ih$!0zQ*O^)b^M%zc(@^YD*OEN^qH!8&Llds7IBe!P5cigt14IT zYbq$#6h$1u2nx^?k;%=eQ9NM&t8o*C{3(^QyQyNB;bci7SIwAEf+IiGLqAAT?>Z}j zUxBM?7oAFEdh5I>#d*P%e{jx-YKf^ynW4)-of%}d9rCxO-W8Vpmo?S0p#$KMjT@Eh zs;^`Rs}NsGKkB~46S(`eQY$<(o~GEjTcKyL3ogVXinP%V^)`HGtjDv^K4tTHwbJ)`JL%p4VJOB?awCrZYvwz}@j@AgidV8QQv9 zB8&KA)|OhnX57=Bu??W|Sgtpf?f6BJzC2OHSA|CeJtooY0>0B?2K$qT#xr?*L)uYv zZ>)b}T#b187MZLRWo?tH%3|-+@Ur6=UAFPSdHAWWKqrQ;VqN>13DjuE5dSMA6CI%C zw`CvbEh6lV5sZ2l@Nj5UdsC9)xtbgKKQ2oU8NuO} zX!sfN)-UNs(<~p99(Hq*7Dj%=q93Ew^@<03DjgcGwziG2rAjG&@8!VY^TbDg`DJG1 z)VKK(Dwdcq&d?kHuQfr3{(|IzNYSm6yV&Tz0TsyB7ghXe74|gxnJdM9F2%+Hq8PrU zV6dBF7CF-kf==U0#_0>g2%D$OMra~kp|-Rk@33fwE&k|oIEI4(Jd8AUp$C}GL_Mem zcI4`Q^R3KOm!HQj-`>{g?NcAn^vjxG>`R2iO zTL<^6QLtgVQKS3<7DKklZ$!gupr@|uL|%5bXpa7*OE}E?%V-<4n}UYKM6kBTlO!#S zAXys61FD$dwT<{KVrq35I&5bVWu6b|yp_Am3+(WWe}4DUQDLQXR_+bge5>(m8cfBaXgLF+S+y$GkP6odR(9(<)G(Mf%6+X*XXP9FM@w0w^x;axs0I zOW-sZCfJvWF3~9ix$id=%U(x!eLP=F$crRiw=9A^?c((^fY`2*cy}u{B1s$xbp4vy z-CZ(m_h;@>V)HN<=L>I>vYom8UhH@7th)H#|00S|O1HS!<`ZCo+GvY0gqij|Quu9u zH6Kd#10Xu-vgC|1AW)#^D(}eo9v-6O7gHQ-)M>@;DIM5WLi^ZeOZDWy(2Xq3tkh%i zkzc(iG+9pgfs}a38(cR%7{Q*b|I8pZjyKUO9=%JuIh`j^GWjwcE=xg8Ca#7cX+KJr zbji$?q&()AXyK9l(3fv#u$)WaprS5$FL8LnB%>v<_VTNeakp~0;6FvIpYoV_SQ2dc z@l!4~rNAwRf(M#FDq$?UIJ+HCztX*`3`XUoTrrlEV+o{V`^&c+T!hBRje?4js6l}Y z%^H<9A~2?dc8Tk-SJzLay)QN-p5eY~PAyNZymCzF>z2Yx9&?|(yG%yEv6Z-zu*4b0 zg*2rL%#&q?nqQ24pWa?}Hur+MIRX%SL%x@-PvL+r22VGO1I1j2-KyDlb*x{Gmw9Gj zo(R=3T^&v9HZoee>T4_m-)|lb2P;r3-SL7l1B*LLiRI@^g^S_rK{j?(L)|$RJQ30K z4D{WB_T?aVQD0?}bXwc+z}3cbR%(SKDqZR?$14=AudQPmm`?(MTtJlMs(-zEIrs+{4nI4yMeY@ z>Tn0d#xyYRns}d#=;Uu$^_L=BgrEJ%x;?9QePz_g+$Wdj?-*^I2?l#i~K z)ZtBC@&UN5*xn$J5)UP-SNJT~MhYzba$VXUNG*A)rA9ALOT2^Ed%?&>zpi#%3etD zBl@x^cUxs{t0cX=W|fKZ3Nhgg2hQ&f!7@=D@3eWIC4CCfu1JGcNHSz{|M3*p};XV>90 z>B)4P81x9=t1k%PQ-^F_$EM}Syvm}A#Ex5XiHUBbLltgXddxxeauoG` zd^fTJxP-_0`vt2U4k8Q1|bM1dV=N_bb3U zx`)I4%<{P16fb2bk9a+R721tKm?D2`n!yw>P6P0?GL>z0$1}7X@bEc~r%08a@u3ZE zpF_q;+mb}1SIY=H#a;{7Er*;#7~=ecm#+~0s;%nDsr8s?XbPRyEx4bEe8BsXsb|Q# zK`}Tp_%U45R4Tb*`JN6AyZug(qIeyB)8T0b;NU8GnV-N|a`x93e!L{z>!SZ;{+|n}-*1K`Yfsx$X2onF^=@DLaV%=iyYomY7u!3z*pv<>Jr(aPa{^ zye?s{R@a+CbZwA+J1I+Ff~<-9L4UxdhyM^bdsruI#V_Xo&6g|Py3G1`BKwe9w2 zZsHaIC?%5lQn#~hpYvjvHx6ZHQD3+-2feX>bBEvn5+>W=}#= z(f-nVc%Bl;l=(aNPTTIHJs}!0(l5Ozzs#keZsdrZeuA2T69+L#apw7kr$93}r%4{W z=<-i@pC_$^kkS{6WDAo+3mj#{<#saByk?%D;aV|&^)dZ||BEF?{|}ZRcGCXClBIps<3Evz&OOg> zvW5{1ekI5wSTppUW8AzpPB|})zwnL9KziLzYM}AK7moh{FMg!-LVoI7E5Wh)*TUK{ zuY&*bGo;kM{!-c7YgG|ctShzLs<>s@AABF!M&FDnUF=h z)>r>SZ3cGH&1S^Q=LwH9tBQ|`qjmi!l(kBTj6e<`!?{ZKY|B&FK%VcR<7x{Zud4P! zo#QEI1+v+%ZV>d-&ZE}?k@hd#?-nYc8~VLNgX>tCwkm9)H9PR&YWYA|9GN?Q^K+EvI&BhL7l>9|{e-W$P1e`DHFD&g~~}7bBE|%9e*b zq5iZR^Rm#GpBR}=o&b@re6HC<6fn^bh zd`JlX*vSiAmCmDXF)9Pb-i}B+ue-Lo`AXxv&-_TOIcqhocK2%6IK}2yTyWpTq!#rY z1fVQHWKtPy>p=SPk6Zfn{|~p^FitO`U%t3DaS72GCG2W!(VrMN-hXQ~b@CiBt?c_BwA3t`qK77=XlCL4PsbFr9>E{^ z-1cXL5Si6*N|}JN>);kidK$Q-^fN$VBC}n z7zeT~2bjOiKnuw8=|MK0q3uIN_QSGnk(6sjo|_D*mj|8cd!GD2PIv)Oj|08A1avYG zcA?`WMyo!tJQE{KMrUMl0(D~aV54hpS`Lo@t;$?`PL{3xh&akLvJ{;9$W78a8*4_A zhA~WieB5M<)^6qYl?(oLk-mjcA2ykLUB8DA+iT)jr)7-T6lhtTs@ z$oNBp;sldlI%=B90id*0k9nWKTB)w}WzaU(xhw&za1{mw>Fj@`%=>}P<-r2jzs~JT_dE9WZ%38_RgGvL-?Rc zH?1(M*Uy*&V=s@KbFx`bU~J1XX7z_uA93e4#~9ld)W(( z_|@*SrE03<2_|#M4x-{~H>Sd9Jo5>0#a)o!MO7y3RZrQWdh};ve8FAxlgrk`k6S}O zANtCE`iu;CBt)Z%5Sn=vqGNi)!LQt~g^lEQ1D>{^u{E7Eo9%{gIc8Mm{Yae6u9PEj zwPIG#x;P7Du^eFuckkEv?kNVG`kxCoqLAn}#O}YA$Ob+C-@|UdQz(HlazUMoHZKBR zP=;GI|KpnYA{WU!Pdy$s7q=T!-fldsTu{Y_domd`pEeQ`G1c4NVNu^p*77!>v>$s< zOsplX`!@>VRmG40W^O=F!VSqWJ`poO1HIp#mQeORFQ1m-Hd;40&y-JlTg<@!#5QMf z)h^kmr7OIw2MF$ssikgv{RN-=vCYB$K8~K5sd*KnS7Wk6JCOQ{ZXOXiWA;sk+&J4g x_kUkz0>~#n|Fr&4HKJ{7=Ow2!YqArAF7O+#3s%mhJ&ERw5zPEXjo$so{|i$kmJt8| literal 0 HcmV?d00001 diff --git a/Documentation~/en/tutorial01.md b/Documentation~/en/tutorial01.md index 9dd66ef8..782f33b5 100644 --- a/Documentation~/en/tutorial01.md +++ b/Documentation~/en/tutorial01.md @@ -1,103 +1,143 @@ --- -title: Introductory tutorial: Get started with XCharts 3.0 in 5 minutes +title: Tutorial: Getting Started with XCharts 3.0 in 5 Minutes sidebar_position: 11 slug: /tutorial01 --- -# Tutorial: Get started with XCharts 3.0 in 5 minutes +# Tutorial: Getting Started with XCharts 3.0 in 5 Minutes -> Note: This tutorial is for XCharts 3.x version only -## What do I need to know before using XCharts +> Note: This tutorial is only applicable to the XCharts 3.x version. For the 2.x version, please refer to [Tutorial: Mastering XCharts 2.0](https://github.com/XCharts-Team/XCharts/blob/2.0/Doc/Tutorial%3A5-Minute-Start-to-XCharts.md) -- Have used Unity, know the basic operation of Unity. -- Understand UGUI and can use UGUI. -- Understand MonoBehavior script usage in Unity, know how to hang scripts, manipulate scripts with code. +## Prerequisites for XCharts -## Get and import XCharts +XCharts is a Unity chart plugin, currently only available for use on the Unity platform. -XCharts can be imported into a project in any of the following ways: +Before using XCharts, you need to: -- Source XCharts directly into the project +- Have a basic understanding of how to use Unity. +- Understand the basic usage of UGUI for making UI. +- Know how to use Unity's MonoBehavior scripts, how to attach scripts, and how to manipulate scripts with code. - After downloading the XCharts source code, copy the XCharts directory directly to the Assets directory of the Unity project. +If you are new to Unity, it is recommended to learn some basic Unity tutorials before using XCharts. -- Import XCharts through `Assets/Import Package` +## Obtaining and Importing XCharts - After downloading the.unitypackage file for XCharts, open Unity and go to the menu bar Assets--> Import Package--> Select.unitypackage import to start using XCharts. +XCharts is primarily maintained and released through Github. You can download the source code and Package from the [Github Homepage](https://github.com/XCharts-Team). -- Import XCharts through the Package Manager +XCharts can be imported into your project in any of the following ways: - For Unity 2018.3 and later, XCharts can be imported through the Package Manager. After opening the Package Manager, run the `Add package form git URL...`, input XCharts dead simple URL: ` https://github.com/XCharts-Team/XCharts.git use XCharts after ` wait a moment. +### Copying the XCharts Source Code Directly into the Project - You can also add the package directly to the manifest.json file: Open the manifest.json file in the Packages directory and add it under dependencies: +After downloading the XCharts source code, simply copy the XCharts directory into the Assets directory of your Unity project. Once compiled, it is ready to use. - ``` json - "com.monitor1394.xcharts" : "https://github.com/XCharts-Team/XCharts.git", - ``` +### Importing XCharts through Import Package - To update XCharts, remove com.monitor1394.xcharts from the manifest.json file under lock (some versions of Unity may be packages-lock.json) and re-download and compile. +After downloading the .unitypackage file of XCharts, open Unity, go to the menu bar Assets-->Import Package-->select the downloaded .unitypackage to import. After the import is complete and compiled, you can start using XCharts. -- Recommended daemon into XCharts (not required) +### Importing XCharts through Package Manager - [XCharts Daemon](https://github.com/XCharts-Team/XCharts-Daemon) can ensure update compilation is normal, when the local open TextMeshPro or NewInputSystem would be very useful. After importing Xchart-daemon into a project, when updating XCharts, the Daemon will automatically refresh asmdef according to the status of local TMP, etc., to ensure normal compilation and facilitate the execution of automated processes such as CI-CD. +For Unity versions above 2018.3, you can import XCharts through the Package Manager. Open the Package Manager, then use `Add package from git URL...`, enter the GitHub URL of XCharts: `https://github.com/XCharts-Team/XCharts.git`. After compiling, you can use XCharts. -## Add a simple chart +For some Unity versions, you can also directly add the package to the `manifest.json` file: Open the `manifest.json` file under the `Packages` directory, and add the following under `dependencies`: -Right-click in `Hierarchy` view or menu bar `GameObject` drop down and select `XCharts->LineChart`, can quickly create a default line chart out: +>"com.monitor1394.xcharts": "https://github.com/XCharts-Team/XCharts.git", + +If you need to update `XCharts`, delete the relevant content of `com.monitor1394.xcharts` under the `lock` of the `manifest.json` file (some Unity versions may be the packages-lock.json file), and it will re-download and compile. + +### Recommended Import of XCharts Daemon + +The daemon [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon) ensures that the compilation is normal when updating. It is very useful when TextMeshPro or NewInputSystem is turned on locally. After importing XCharts-Daemon into the project, the daemon will automatically refresh XCharts' asmdef according to the local situation of TMP when updating XCharts, ensuring that the compilation is normal without manual intervention, which is convenient for automated processes such as CI/CD. + +The import method of XCharts-Daemon can refer to the previous import method of XCharts. It can be imported into the project through source code or Package. The GitHub URL of XCharts-Daemon: https://github.com/XCharts-Team/XCharts-Daemon.git + +## Basic Usage of XCharts + +After importing XCharts and compiling, the XCharts menu will appear in the Unity editor's menu bar, and you can start using XCharts. + +>Note: The XCharts menu in the Unity menu bar indicates that XCharts is available. + +### Adding a Simple Chart + +In the `Hierarchy` view, right-click `UI->XCharts->LineChart` or select `LineChart` from the menu bar `XCharts` to quickly create a default line chart: ![linechart1](img/tutorial01_linechart1.png) -## Add multiple Seire +If you need to create a chart under a certain node, you can select the node and right-click `UI->XCharts->LineChart` to create a chart under the node. -In the Inspector view, locate LineChart's panel, and with the `Add Serie` button, you can add a second Line line: +### Modifying Chart Data + +For the newly created chart, its data can be modified on the Inspector panel. + +For X-axis data, you can add, delete, and modify by expanding: `XAxis->Data`: + +![op_axisdata](img/tutorial01_axisdata.png) + +For Serie data, you can add, delete, and modify by expanding: `Serie->Data`: + +![op_seriedata](img/tutorial01_seriedata.png) + +Serie supports multi-dimensional data, and generally, a line chart only uses two-dimensional data: the first dimension represents the ID of the X-axis category data, and the second dimension represents the corresponding value. + +### Adding Multiple Series + +In the `Inspector` view, find the `LineChart` panel, and click the `Add Serie` button to add a second `Line` line: ![op_addserie](img/tutorial01_addserie.png) ![linechart2](img/tutorial01_linechart2.png) -## Add other components +>Note: Series are added through the `Add Serie` button. Different types of Series can be added. [What kinds of Series does XCharts have?](https://xcharts-team.github.io/docs/configuration#serie-系列) -The default chart does not have a `Legend`, and a `Legend` Component can be added via the `Add Component` button: +### Adding Other Main Components + +By default, the chart does not have a `Legend`. If you need a `Legend` component, you can add it through the `Add Component` button: ![op_addcomponent](img/tutorial01_addcomponent.png) -## Add Serie components +>Note: Main components are added through the `Add Component` button. [What main components does XCharts have?](https://xcharts-team.github.io/docs/configuration/#maincomponent-主组件) -Serie comes with only a few common components, and others are added as needed. For example, if you need to fill a line chart area with color, you can add a separate `AreaStyle` component to Serie: +### Adding Serie Components + +Serie only comes with a few common components, and other components need to be added when used. For example, if you need to fill the area color for the line chart, you can add an `AreaStyle` component to `Serie` separately: ![op_addseriecomponent](img/tutorial01_addseriecomponent.png) ![linechart3](img/tutorial01_linechart3.png) -## Add the SerieData component +>Note: Serie components are added through the button on the right side of Serie. [What components can be added to Serie in XCharts?](https://xcharts-team.github.io/docs/configuration/#iseriecomponent-可添加到serie的组件) -If you need to personalize the configuration of each data item, you can add a Component to each SerieData separately. For example, we give the second data of the line chart a separate display `Label`: +### Adding SerieData Components + +If you need to customize the configuration of each data item individually, you can add components to each `SerieData` separately. For example, we can display `Label` for the second data of the line chart individually: ![op_addseriedatacomponent](img/tutorial01_addseriedatacomponent.png) ![linechart4](img/tutorial01_linechart4.png) -## More components and configuration parameters +>Note: SerieData components are added through the button on the right side of SerieData after expanding. [What components can be added to SerieData in XCharts?](https://xcharts-team.github.io/docs/configuration/#iseriedatacomponent-可添加到seriedata的组件) -XCharts has been iteratively optimized and now has dozens of main and sub-components, each with a few to dozens of configurable parameters to support a variety of flexible and complex functions. +### More Components and Configuration Parameters -Using XCharts for the first time, you can add various charts in the `Inspector` view, add or adjust the components in the chart, and the `Game` view gives real-time feedback on the effects of adjustments to familiarize yourself with the use of various components. Detailed parameter descriptions of each component can be found in the [XCharts Configuration](Configuration.md). +XCharts has been continuously iterated and optimized, and now has dozens of main components and sub-components, each with several to dozens of configurable parameters to support a variety of functions. -## How to adjust parameters quickly +When using XCharts for the first time, it is recommended to personally test the actual effects of each chart, each component. The `Inspector` view can directly add various charts, components, and adjust various configuration parameters, and the `Game` view will provide real-time feedback on the adjustments. A detailed description of each component's parameters can be found in the [XCharts Configuration Manual](configuration.md). -XCharts is configuration and data driven. Want what effect, only need to adjust the configuration parameters under the corresponding component can be, do not need to change the nodes under the `Hierarchy` view, because those nodes are generated by the `XCharts` internal according to the configuration and data, even if changed will be restored in the refresh. +### How to Quickly Adjust Parameters -How to quickly locate the component corresponding to the effect you want to change requires a certain understanding of the component. For example, if we want to show an arrow at the end of the X-axis, how do we position it? First, position the X-axis to `XAxis0`; Second, locate the axis to `AxisLine`; Finally, check to see if there are any parameters in the AxisLine component that can achieve this effect, and check [XCharts configuration](Configuration.md) for uncertain parameters. +XCharts is driven by data and parameters. To achieve the desired effect, simply adjust the configuration parameters under the corresponding component. Do not modify the nodes under the `Hierarchy` view, as those nodes are generated by XCharts internally based on configuration and data, and will be restored upon refresh. -`XCharts` provides a full range of parameter configuration from the global` Theme `, series` Serie `, and single data item `SerieData`. The priority in descending order is: `SerieData` -> `Serie` -> `Theme`. Take the color of `ItemStyle` for example: +To quickly locate the component corresponding to the effect you want to change, you need to have a certain understanding of the components. For example, we want to display an arrow at the end of the X-axis line. How to locate it? The first step, the X-axis is located at `XAxis0`; the second step, the axis line is located at `AxisLine`; finally, check if there is such a parameter under the `AxisLine` component to achieve this effect. If you are not sure about the parameters, you can refer to the [XCharts Configuration Manual](configuration.md). -1. If the `ItemStyle` of `SerieData` has a color value other than `0000`, this color value is preferred. -2. If the ItemStyle of `Serie` is configured with a color value other than `0000`, this color value takes precedence. -3. Otherwise, the Color value is taken from the Color Palette of the Theme. +`XCharts` provides comprehensive parameter configuration from the global `Theme`, series `Serie`, and individual data items `SerieData`. The priority order from high to low is: `SerieData`->`Serie`->`Theme`. Take the color of `ItemStyle` as + an example: -Usually, `0000` indicates the theme default color, and 0 or null indicates the theme default. +1. If the `ItemStyle` of `SerieData` has a color value other than `0000`, this color value is used first. +2. If the `ItemStyle` of `Serie` has a color value other than `0000`, this color value is used. +3. Otherwise, the color value is taken from the `Color Palette` of the theme `Theme`. -## Add line charts with code +>Note: The color value is usually `0000` when using the default color of the theme; other parameters are `0` or null when using the default configuration of the theme; pay attention to transparency when setting colors. -Attach the `LineChart` script to the gameObject: +### Adding a Line Chart with Code + +Attach the `LineChart` script to `gameObject`: ```csharp var chart = gameObject.GetComponent(); @@ -108,10 +148,10 @@ if (chart == null) } ``` -Resize: +Adjust the size: ```csharp -chart.SetSize(580, 300);//代码动态设置尺寸,或直接操作chart.rectTransform,或直接在Inspector上改 +chart.SetSize(580, 300);//Dynamically set the size with code, or directly operate chart.rectTransform, or directly change it in the Inspector ``` Set the title: @@ -121,7 +161,7 @@ var title = chart.EnsureChartComponent(); title.text = "Simple Line"; ``` -Set whether prompt boxes and legends are displayed: +Set whether to display the tooltip and legend: ```csharp var tooltip = chart.EnsureChartComponent<Tooltip>(); @@ -131,7 +171,7 @@ var legend = chart.EnsureChartComponent<Legend>(); legend.show = false; ``` -Set axes: +Set the coordinate axis: ```csharp var xAxis = chart.EnsureChartComponent<XAxis>(); @@ -143,14 +183,22 @@ var yAxis = chart.EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Value; ``` -Clear default data and add `Line` type `Serie` for receiving data: +Clear all default data (including Series), add a `Line` type `Serie` to receive data: ```csharp chart.RemoveData(); chart.AddSerie<Line>("line"); ``` -Add 10 data: +If the Serie is fixed, it is recommended to only clear the data, not to remove the Serie: + +```csharp +chart.ClearData(); +``` + +This way, you can set the configuration parameters of Serie in the UI in advance. + +Add 10 data points: ```csharp for (int i = 0; i < 10; i++) @@ -160,59 +208,74 @@ for (int i = 0; i < 10; i++) } ``` -So a simple line chart comes out: +Now, a simple line chart is ready: ![tutorial01_linechart_simple](img/tutorial01_linechart_simple.png) -If there are multiple series in a Chart, the data of Axis only needs to be added once, rather than repeated in multiple cycles. Remember: the number of data in Axis should be the same as the number in Serie. +If there are multiple series in a Chart, the data of Axis only needs to be added once, and should not be repeated in multiple loops. -See `Examples`: `Example13_LineSimple.cs` for the complete code +>Remember: The number of Axis data should be consistent with the number of Serie data. -You can also use code to control more parameters, there are more Examples under `Examples`, all the configurable parameters seen in the `Inspector` can be set by code. All parameters in [XCharts configuration](Configuration.md) can be controlled by code. +For the complete code, please refer to `Examples`: `Example13_LineSimple.cs` -In addition, unless customized, it is recommended to call the `public` interface provided under `Chart`, especially in the data-related operations section. These interfaces do some associated processing inside, such as refreshing charts. Common interfaces are: +You can also control more parameters with code. There are more examples in `Examples`. All parameters that can be configured in the `Inspector` can be set with code. All parameters in the [XCharts Configuration Manual](configuration.md) can be controlled by code. -1. `Chart.ClearData()` : Clear chart data (without removing Series) -2. `Chart.RemoveData()` : Clear chart data (will remove all Serie) -3. `chart.AddSerie()` : AddSerie -4. `chart.AddXAxisData()` : Add X-axis data -5. `chart.AddData()` : Adds Serie data -6. `chart.UpdateData()` : Updates Serie data -7. `chart.UpdateXAxisData()` : Updates the X-axis data -8. `chart.UpdateDataName()` : Updates the Serie data name +### Setting the Default Font -XCharts has an automatic refresh mechanism inside, but it only triggers under certain conditions. If you call the interface of the internal component, encounter the component did not refresh, and indeed can not find the reason, you can use the following two interfaces to force refresh: +The default font used by XCharts is Unity's default font `Arial`, which may not display Chinese characters on the WebGL platform. When using XCharts in your project, it is recommended to set the font first: -1. `chart.RefreshAllComponent()` : refresh chart component, to initialize all of the components, often is not recommended. -2. `chart.RefreshChart()` : refreshes the chart drawing, only the drawing part is refreshed, and the component text, position, etc., is not refreshed. -3. Individual components can also refresh only themselves by `SetAllDirty()`. +- Find the `XCharts/Resources/XCSetting.asset` resource and modify the `Font` inside and save. +- Find the `XCharts/Resources/XCTheme-Default.asset` and `XCharts/Resources/XCTheme-Dark.asset` font configurations, and click the `Sync Font from Setting` and `Sync Font to Sub Theme` buttons to synchronize the font to the theme configuration files. -## Use TextMeshPro +After the font is set, newly created charts will use the newly set font. For old charts, you can click the `Rebuild Chart Object` button to refresh. -XCharts supports TextMeshPro, but it is disabled by default and needs to be switched manually. It can be turned on and off in the following ways: +>Note: It is recommended to set the font before using XCharts; when updating XCharts, pay attention to the potential restoration of the set font. + +### Using TextMeshPro + +XCharts supports TextMeshPro, but it is not enabled by default and needs to be switched on manually. It can be turned on and off in the following ways: ![textmeshpro1](img/tutorial01_textmeshpro.png) -After opening, you need to set the global font used by TextMeshPro, or you can set it separately in the Theme: +After turning it on, you need to set the global font to be used by TextMeshPro, and it can also be set individually in the Theme: ![textmeshpro-font](img/tutorial01_textmeshpro_font.png) -It is recommended to plan whether to use TextMeshPro at the beginning of the project and set the font. When switching TMP with many existing charts, some charts may not refresh automatically. You can manually click the `Rebuild Chart Object` button to rebuild the chart, which can be initialized normally. +It is recommended to plan whether to use TextMeshPro at the beginning of the project and set the font accordingly. When switching to TMP in a project with many charts, some charts may not refresh automatically, and you can manually click the `Rebuild Chart Object` button to rebuild the chart, which will initialize normally. -When updating XCharts for TMP projects, you may encounter problems with missing TMP references and failing to compile. These problems can be solved in one of two ways: +If you have enabled TMP in your project, you may encounter compilation failures due to lost TMP references when updating XCharts. This can be solved in the following two ways: -1. Find `XCharts.Runtime.asmdef` and `XCharts.Editor.asmdef` and manually add references to `TextMeshPro` -2. Remove the `dUI_TextMeshPro` macro for Scripting Define Symbols in PlayerSetting +1. Find `XCharts.Runtime.asmdef` and `XCharts.Editor.asmdef`, and manually add references to `TextMeshPro`. +2. Remove the `dUI_TextMeshPro` macro from the `Scripting Define Symbols` in `PlayerSetting`. -Version `3.8.0` after adding daemon[XCharts - Daemon](https://github.com/XCharts-Team/XCharts-Daemon), will be XCharts-Daemon import project, When updating XCharts, the daemon automatically refreshes the asmdef based on the locally enabled TMP to ensure proper compilation. +After the `3.8.0` version, the [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon) daemon was added. After importing XCharts-Daemon into the project, the daemon will automatically refresh the asmdef based on the local situation of the enabled TMP when updating XCharts, ensuring normal compilation. -## Change chart parameters with code +## XCharts Code Control -All parameters seen on Inspector can be modified with code, the key is to identify whether the parameters you want to change are on the component, on the Serie, or on the specific data item SerieData. +All parameters seen in the `Inspector` can be modified with code. The key is to locate the parameter you want to change, whether it is on the component, the Serie, or the specific data item SerieData. -### Change the parameters on the main component +In addition, unless customized, it is recommended to call the `public` interfaces provided under `Chart`, especially for data-related and list operations. These interfaces will do some associated processing internally, such as refreshing the chart. Common interfaces include: -You need to obtain the component first, and then modify the parameters in it: +1. `chart.ClearData()`: Clear chart data (does not remove Series) +2. `chart.RemoveData()`: Clear chart data (will remove all Series) +3. `chart.AddSerie()`: Add Serie +4. `chart.AddXAxisData()`: Add X-axis data +5. `chart.AddData()`: Add Serie data +6. `chart.UpdateData()`: Update Serie data +7. `chart.UpdateXAxisData()`: Update X-axis data +8. `chart.UpdateDataName()`: Update the name of Serie data + +XCharts has an automatic refresh mechanism, but it is also triggered under certain conditions. If you have called the internal component interfaces and encountered components that have not been refreshed, and you cannot find the reason, you can use the following two interfaces to force a refresh: + +1. `chart.RefreshAllComponent()`: Refresh chart components, which will re-initialize all components. It is not recommended to use it frequently. +2. `chart.RefreshChart()`: Refresh chart rendering, which only refreshes the rendering part and will not refresh component text, position, etc. +3. Each component can also refresh itself by calling `SetAllDirty()`. + +>Note: Use APIs to manipulate data and various lists, not directly access the list for processing. + +### Changing Parameters on Main Components + +You need to obtain the component first, then modify its parameters: ```csharp var title = chart.EnsureChartComponent<Title>(); @@ -225,11 +288,11 @@ xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; ``` -> Note: When the earlier version does not have the EnsureChartComponent() interface, GetOrAddChartComponent() is used. +> Note: In older versions without the `EnsureChartComponent()` interface, use `GetOrAddChartComponent()` -### Change Serie parameters +### Changing Serie Parameters -For newly added Serie: +For newly added Series: ```csharp var serie = chart.AddSerie<Pie>(); @@ -241,7 +304,7 @@ serie.animation.dataChangeEnable = true; serie.roundCap = true; ``` -For existing Serie: +For existing Series: ```csharp var serie = chart.GetSerie<Pie>(); @@ -253,7 +316,7 @@ serie.animation.dataChangeEnable = true; serie.roundCap = true; ``` -Add additional components to Serie: +Adding additional components to Serie: ```csharp serie.EnsureComponent<AreaStyle>(); @@ -262,14 +325,14 @@ var label = serie1.EnsureComponent<LabelStyle>(); label.offset = new Vector3(0,20,0); ``` -### Change the parameter on the data item SerieData +### Changing Parameters on Data Item SerieData ```csharp var serieData = chart.AddData(0, 20); -//var serieData = serie.GetSerieData(0); //从已有数据中获取 +//var serieData = serie.GetSerieData(0); //To get from existing data serieData.radius = 10; -var itemStyle = serieData.EnsureComponent<ItemStyle>(); //给数据项添加ItemStyle组件 +var itemStyle = serieData.EnsureComponent<ItemStyle>(); //Add ItemStyle component to the data item itemStyle.color = Color.blue; -``` \ No newline at end of file +``` diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 4c634e2e..ae226da8 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -6,6 +6,7 @@ slug: /changelog # 更新日志 [master](#master) +[v3.12.0](#v3120) [v3.11.2](#v3112) [v3.11.1](#v3111) [v3.11.0](#v3110) @@ -76,6 +77,19 @@ slug: /changelog ## master +## v3.12.0 + +版本要点: + +* 增加`Ring`的`radiusGradient`参数设置渐变方向 +* 增加`numericFormatter`对`date`和`time`的支持 +* 完善`AreaStyle`的`origin`参数设置区域填充起始位置 +* 调整和完善文档 +* 其他优化和修复 + +日志详情: + +* (2024.09.30) 发布`v3.12.0`版本 * (2024.09.27) 完善`5分钟教程` * (2024.09.24) 完善`Legend`的`formatter`对多Serie的支持 (#332) * (2024.09.22) 调整`Documentation`文档显示样式 diff --git a/Documentation~/zh/tutorial01.md b/Documentation~/zh/tutorial01.md index 9c83fa1e..0eb4eb4b 100644 --- a/Documentation~/zh/tutorial01.md +++ b/Documentation~/zh/tutorial01.md @@ -22,9 +22,7 @@ XCharts是一个Unity图表插件,目前只能在Unity平台使用。 ## XCharts的获取和导入 -XCharts主要通过Github来维护更新和发布,可以到Github主页进行下载获取源码和Pacakge,Github主页:https://github.com/XCharts-Team。 - -对于无Github访问条件的用户,可以访问[【国内镜像】](https://gitee.com/monitor1394/unity-ugui-XCharts)进行下载。国内镜像的版本更新可能会相对滞后。 +XCharts主要通过Github来维护更新和发布,可以到【Github主页】(https://github.com/XCharts-Team)进行下载获取源码和Pacakge;对于无Github访问条件的用户,可以访问[【国内镜像】](https://gitee.com/monitor1394/unity-ugui-XCharts)进行下载。国内镜像的版本更新可能会相对滞后。 XCharts可通过以下任意一种方式导入到你的项目: @@ -60,7 +58,7 @@ XCharts-Daemon的导入方式可参考刚才的XCharts导入方式。可以通 ### 添加一个简单图表 -在`Hierarchy`视图下右键`UI->XCharts->LineChart`或菜单栏`XCharts`下拉选择`LineChart`,即可快速创建一个默认的折线图出来: +在`Hierarchy`视图下右键`UI->XCharts->LineChart`或菜单栏`XCharts`下拉选择`LineChart`,即可快速创建一个默认的折线图: ![linechart1](img/tutorial01_linechart1.png) @@ -224,7 +222,7 @@ for (int i = 0; i < 10; i++) XCharts默认使用的是Unity默认字体`Arial`,在WebGL平台上可能无法显示中文。在将XCharts用在你的项目时,建议先设置好字体: -- 找到`XCharts/Resources/XCSetting.asset`文件,修改里面的`Font`并保存。 +- 找到`XCharts/Resources/XCSetting.asset`资源,修改里面的`Font`并保存。 - 找到`XCharts/Resources/XCTheme-Default.asset`和`XCharts/Resources/XCTheme-Default.asset`两个字体配置,点击`Sync Font from Setting`和`Sync Font to Sub Theme`按钮将字体同步到主题配置文件上。 字体设置好后,新创建的图表就会用新设置的字体了。对于旧图表,可以点击`Rebuild Chart Object`进行刷新。 diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index 5890346f..3f4a9c70 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -21,8 +21,8 @@ namespace XCharts.Runtime [ExecuteInEditMode] public static class XChartsMgr { - public static readonly string version = "3.11.2"; - public static readonly int versionDate = 20240801; + public static readonly string version = "3.12.0"; + public static readonly int versionDate = 20240930; public static string fullVersion { get { return version + "-" + versionDate; } } internal static List<BaseChart> chartList = new List<BaseChart>(); diff --git a/package.json b/package.json index 5e13d2b8..f2957ae5 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "author": "monitor1394", "license": "MIT", "version": "3.11.2", - "date": "20240801", - "checkdate": "20240801", + "date": "20240930", + "checkdate": "20240930", "unity": "2018.3", "description": "A charting and data visualization library for Unity. Support line chart, bar chart, pie chart, radar chart, scatter chart, heatmap chart, ring chart, candlestick chart, polar chart and parallel coordinates.", "keywords": [