From d46da98c9617e357e5795dc4eb06e7a8dab04ae3 Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi Date: Mon, 8 Apr 2024 17:37:31 +0200 Subject: [PATCH] fix: fixed bugs --- .github/workflows/build.yml | 2 +- README.md | 2 +- Scripts/cli/README.md | 32 +++++++++++---- Scripts/cli/docs/examples/get-data-plot.png | Bin 0 -> 30728 bytes .../cli/docs/examples/get-data-scatter.png | Bin 0 -> 17499 bytes Scripts/cli/docs/examples/get-data-stairs.png | Bin 0 -> 17172 bytes Scripts/cli/src/command/base.py | 2 +- Scripts/cli/src/command/get_data.py | 12 ++++-- Scripts/cli/src/dto/__init__.py | 2 + .../cli/src/dto/visualizer_metadata_dto.py | 12 ++++++ Scripts/cli/src/middleware/middleware.py | 3 ++ Scripts/cli/src/visualizer/visualizer.py | 37 ++++++++++++++---- 12 files changed, 81 insertions(+), 23 deletions(-) create mode 100644 Scripts/cli/docs/examples/get-data-plot.png create mode 100644 Scripts/cli/docs/examples/get-data-scatter.png create mode 100644 Scripts/cli/docs/examples/get-data-stairs.png create mode 100644 Scripts/cli/src/dto/visualizer_metadata_dto.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 765ff2e..5900bcc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,4 +11,4 @@ jobs: - uses: xanderhendriks/action-build-stm32cubeide@v10.0 with: project-path: '.' - project-target: './Debug' \ No newline at end of file + project-target: '.' \ No newline at end of file diff --git a/README.md b/README.md index 496a838..6220d6c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # light-detector -[![Build](https://github.com/YarikRevich/ResourceTracker/actions/workflows/build.yml/badge.svg)](https://github.com/YarikRevich/ResourceTracker/actions/workflows/build.yml) +[![Build](https://github.com/YarikRevich/light-detector/actions/workflows/build.yml/badge.svg)](https://github.com/YarikRevich/light-detector/actions/workflows/build.yml) ![STM32](https://img.shields.io/badge/stm32-blue) [![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) diff --git a/Scripts/cli/README.md b/Scripts/cli/README.md index 5932d0d..a374a49 100644 --- a/Scripts/cli/README.md +++ b/Scripts/cli/README.md @@ -1,6 +1,5 @@ # CLI -[![Build](https://github.com/YarikRevich/ResourceTracker/actions/workflows/build.yml/badge.svg)](https://github.com/YarikRevich/ResourceTracker/actions/workflows/build.yml) ![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black) ![MacOS](https://img.shields.io/badge/MacOS-8773f5?style=for-the-badge&logo=macos&logoColor=black) [![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) @@ -30,12 +29,12 @@ In order to build the project it's required to execute the following command. It make install ``` -# Use cases +# Use Cases Most of the commands given below require **baud rate**. It is important to be the exact-supported value, otherwise requests will be ignored(in the given examples baud rate is equal to **9600**). -## Get available devices +## Get Available Devices The example below shows how to retrieve a set of all available devices, which can be used to perform other operations. ```shell @@ -49,7 +48,7 @@ $ light-detector-cli get_available_devices ] ``` -## Get info +## Get Info The examples below show all the possible ways to retrieve metadata information from the board. Baud rate is important to be the exact-supported value, otherwise requests will be ignored(in the given examples baud rate is equal to **9600**). @@ -73,7 +72,7 @@ Available **gain** values: * 32 - high * 48 - max -### Integral time +### Integral Time The next example shows how to retrieve the value of integral time metadata information from the board. ```shell @@ -94,7 +93,7 @@ Available **integral time** values: * 4 - 500ms * 5 - 600ms -### Processed requests +### Processed Requests The next example shows how to retrieve the value of processed requests(amount of successful incoming requests, different from nonce) metadata information from the board. ```shell @@ -107,7 +106,7 @@ instance(RetrievedInfoDto): value: 20 ``` -### Device available +### Device Available The next example shows how to retrieve the value of device available metadata information from the board. ```shell @@ -183,4 +182,21 @@ parameters. $ light-detector-cli get_data --device="/dev/cu.usbmodem1203" --baud_rate="9600" --type="raw" --series=4 --export="./output" --figure="plot" ... -``` \ No newline at end of file +``` + +Available **figure** values: +* plot +* stairs +* scatter + +#### Plot + +![](./docs/examples/get-data-plot.png) + +#### Stairs + +![](./docs/examples/get-data-stairs.png) + +#### Scatter + +![](./docs/examples/get-data-scatter.png) \ No newline at end of file diff --git a/Scripts/cli/docs/examples/get-data-plot.png b/Scripts/cli/docs/examples/get-data-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3d7ff9afab9ea3e84da93f14fe1608307c4d04 GIT binary patch literal 30728 zcmdqJbzGF~^FO*Y(hbt3bR*p%h_s}@(k(5uG)S(3ph!rogmiaC8Q%e_SE^)N_!1LC zNB&`oM35c>oz)J7NL~)lGFE>0ofP`JCv;L%h^9k`vB)xkc!)1(o$q~z*0A`(d)|0% zEQq=_r*GEcuBD0IyciU<_8xk8L=XIP{roVdhKG-juiIweA;bF1|k4H7REx7g1;u*^#5-UMHa8OGQ#+Fg>>cibcj^)ZdD>2d}0PSbWE`Ps^#=phj)*ekPUD+}6j z2V3NFb#puK!!l^_D)lu!cFG+c8(ZIW-5REA?EaXNLh0Rnb#(;+6yMR|2$fl*4Gj%7 z>x?44-cAex?e;LGe@0l$l81IwFZ#3HpCmMQFYSI1TsW%p==;KvW!fIL;@NzYs;I0? z#AiK72@i;|tn`~g%udcq zFGuwpy$_1G_~lZ_O596M{BT?vk90O>X1w#A3Bre~p#ZTW{%C}Z#!jC*rZNKHh>?aF zCUVqhT&67(BCpSP`&!m7W}Qe`SXjW5%bSC#qJ3$Fn4C3I;Bx0>nPU5KZmuv%8m}dU z<4@_ga)yxYA7IP6yjMBBnd7L~nL4vMo) zy)H2c+FEF=xA|R=By`wt+7Yh{W=Zo}c~lzk;17GYb2^OcE_rEqP`Ar@b!FOJ@4owc zrTO8mI5#)fc`=-e@Ts!Uu7u0d?QU^1=b$*uu+#_UcxSb8+(ko5YV2E@TTt*>QqXC^ zu&KJ-YJk9Dwkp0D>G1U79wxc}MFw>S2^9;E<8{SHX#vRV8`vSuQSI}YZ!r?AyUrdS zRlbM*XWwXg>abgVpMDi^h&!A(+a8D5_p3Ayc#D3p)P}=Z$9ffktVD(E3cCpQtXACd_P0CZERR2;xFPSZ^?W*kAP<`VdXF!8yNug8Rcb!JZcyzQUrcCO2N<_> z6PS2Ssw z49HYb^F8FMbA8@(G5#E1ntsD* zzA_UD!j=R|4YgwaJ+og#6s1p-|NJvR{8(fUkUKf-L8g@I#A=tCd z0vm(DX?rZcjzl31K4)8WA+ls*UL|`k#69*BZ#?8wJ3t@1LH*KgzAXGTHeSOFmw*Y* zQ+?0Kym(XKOJ%2;fN|nm_;v!Rg-$js#a%KDjr;`)CNsD4dlO{KtysAsQ*ZCu8*<|; z9^?X9yofaA^JG~nL>!V}lQY!qje)OBG-@aYKdnjHuW5Xbg2bBbCRk&Wl30q{H#5eG zLG)g2Vj^d9bm|I2G{Ll3#H$cwmitRg5JLVpo^jl*yS7TZTrFw8GZKp3v^TtrGV0J3yGSJ$#PADzL6#2Vq`gR-(=_To%cY(JG-Q+RLRr^(;lk1zLCIm}u(Jt2Q?jL9J; zZ;q}PzAQ0E{Xv*kuO)>8IZUJ>XPFc6Q570qWAWwH>5wF>&JpkzCk@sm8oHp|VBY?_ z)9;Xw52%4ZDWRd<-)DhSD&N>anMI0_C(&cfnxt~yDptwavCLqYqBFTY*pj(Y1|6bh zOJ%?a^7|3asVB42Ow;HfpCVH@Z=2`j)(A;_GO7`WDc;eo_}^XI>ZWph2H|1zK?b=W z*eDY(15O77cXJx$;2T}gJkx<(K(da1;Z<4VJ_)w(f80^xEfk!J6p^WPTQDRocleF^ zO@<)GrhwCe??&6$c(0kb(`x#|t+ls=Iw;rCc=A^CEZfwji^_A3&iGUDRqFi)$m~g7 zGEzjE#aW$cH$P=8HR1&^DC{Ju<&~QF6Vl2#=XUHBARM`*clm_Huhn2f@FM@HJ+Zg9 z*McD=jkaJly!9h#FfrDHspS)$*p;h>v(cAe7^zBPM9gOBX8300WDE?c zxX10BmDUI|Y*h5^7HtSER%(`DpDz8Di7tYj4`Oa{)3wsY z(*3USLtLX0q$Fr|iE`oL{d=s(TeLRvOYh~;$f~sRn_|z%8xvZQ1JQpuQ#C1OjpuY8ISe_0pnAo%#(w%ooNH|;NMr_?ypG!uF(JK5cp3$Yqd*9DRF zS|cW&hMx)@)o0Uc;|wmBKk}ev*AT5UAY#X*wUA)r zpOl&2Q-x&=3$0oszf;OZpf%wn)r2k`^ORD3V1y)VK^`lo1?-h}Sx}4c7ois%`Nn23 zCVK0~2Gb%3F+;5IDzbEmS`Ca0TIm8Ps)A(?iNF-WnW>_lI|-3r9qW2h*?92I#xv2d z5JV)x1MW}L50+mKE$g^bL3;7nY4O^`RE%4HLAjckkzQ4DOV8sX%Jh%5pDHW?;m`?& z7%hcBo1u$qYtF58xGRu28F|_i){AfsI>!tW@X(MxWFdjlPC#*_X(7Gpo-S0HEhc)G zSDWbx+iv}ux*+sS-=}~+hLB+EwamMHT+N>+&85-t0qmAV7P=sS{0RVXzo9E>GA8*NnqODaMyu!h9ST0#i=S?>UW6*g3rEAc_0lgVAqA1omLnpM^ zHv;%SGv5DKIFBtQ;QdA-TKN{hh#RdTXt>m3UL7q#9u)i4pFBfNK{g=Pm>JiIKYu@3 z!Z$#hamg_Q{@Ns+i}5|6e(CQcQ>W@wLQNN=9vG;Bs2K#Ah|9)6+7N~Prui|5ybS}$ zEQoxj{P{rq?}&l)g88E4&I)9M&IV*A8hfTU1E66%9a?(&tf}^kuLv1*1yaBRrQ!R6 zNK&$TLBIoMxU){Efng!Zt;LFChNE7cig%J!NF<#%(#ZnX4(S_uc4E z%Ces<%F_7uyzI?=Amt$%u|LI5a<1c*w^z=hPkQ|6K>SBKu3g90|s{MRj zC7FJ3ek8Lj{s~Z>?nBc-B1A$$8p13An&e#_d!;$Iw`ueq{ zBLEIo=G=ye0RVd<@~~Gv6oo@2;*~n4t*zbDn-$&GCex)0XqZW{XPRw6ZJINBGG!e4 zrf_48g$FW%Q))4rH1f<0g#HCJ@WqQ4W&n<$7Zo-5{{4Hm362}+<;$0iMW>`7|C1i3 zlPU^9N1|8R%CSKf37ke}eRF`vVmM?I7oXp~1#qc6kiaw!Zu<`Czl8ut6y-^*&D2p@ zJV-e3aFgogaPYKo>UWbqtkHMDfiO;f{g}LQs+0`$ni90b%F1d15^`NrEIz$QlrqxM z`O@G4Bwmo%?}#mcdn!Ja4a34Od|i1Wl4FibiywQctY7;QRbxj=otO>cpR(+~Q2v`_ zr!%?}G;9T2QkZIbI;j%K3jn{hEl8N+zC66h1?KQA1u8~1@!R)W zTqSOss*l-=z>Tj_BWrN-y`5^7Q8iwcsiK)v-!n6(f3Sk?K#JuHTzJ9%A zzmwFMeP^NZm8K1Dz4{upJ|x)GB&C%eQ5fGp(sD7o0^K$Qp_VznGSv znHc;ZmvX$DSz1I~(fzR5m%sSt^ZM44{zcmnk?g(Bs)SG1NDq7{}+KF5RZK=4b=DzUQ1Jn{)Ez z|8b8Rx6(rkDo*Slg9u2}kjr=v1CD{zHu#mg1i6(SJe^vwv<2Hk7eM zuMIsOifi!8bhpOl)hVuVN_-*d)jQf_-4H|Z_-)aP-A54>Ynb2!*m=;FzVskV9ce(Mcq>lX}f0h@Nxe?$%a?UlL_rGQSv7=IZ z6!PR6{j;wrmR{%~X6;!VH*zqIzK&!gv~&7dAM1OaT3c~)C0;bwIq^%4=gPkmY}(Aw zk!AHL@n3v};y`tZYapBIiwxKZ#*>~#Y%xrhYrCBYcgG<=PO8#5%LRfexr_^#@dO*1 zq)=;OttKyKm4Pr@VveHOcjH2q)S+C8kPZVJ`KNRkACJKMS77hC`PE?B;Yh-ffhvC( z9Za3hb%HoSm=7fa$6f7w+|)(x`vCZ+@#gR(IHmik@pIak8~Km=9_(janx9nB^lSVQ zVr}WpsgtEqa#p`=?8t{rm);3bAW0$Z=>=&8t5Ggz^JGi~f_{$8Lg&*3$=}xBA;6fP zZ1yX?pj2J_%0HtNqg4xw&<=v7vv+G-E9fBy!H}Tz!TQn^(eH%6&c(zUxXN+i%r-ZJ zxej4hw!3Fp8I%%tp5M>einwC+QGV~6WI->EDyU|i%6UNiEsn(9ZcrNccgfwK&5#hq zE7u7}b#m#l3p-Mc;;XoqgjZKv`{@3jrY?o-hv5I$q-H0~<=cz8^e)6AdY;$ZMK z{~&&PWBq428+&kzPmnzRNHE9x{cS88Y{BR-J2HxOHRx#*^3Np)ZU4*G*}&~0+LO?+ zhndd4awANw`}1}3MrQiG-~I+c2pI?-`BHYD4h_OMi2^7RSRQD4b)FN6{$lqS&~2+; zb+5;b43~8GTNp`XBjm7K81d0^s=zU-a;w0GCv}jDKkZ)?9Y!Df0lqcJW{z=8v zB*3DZN|ovPs9C{_CM&fF1yjY5I*y)ZH*YNH!wB^a7oTU(&5rN&%g?blul+>4I__u_ z<$^*xbcFaJsW=!ty|9aZaE2D<6Eua*z8UI<|En zZphMHvLr@QLAE_Yn?Q9l$WB0hGCy6rKU^c>fBh1vH#YykglOaS^y3{e63L}=bDnql z5^6&UF_E>2k40aeuVlQLS-nne-uWRX+&spN{LKor?Ox2JO~Bp5uDP%cGz=2e&Zv$v zk`*Jv&ju!IQUuFPi-$ z;t5%A`!MZ7UmA_|_*Ex}#Y<%TfDYPBGtvtf_ST2?-Cx5@B(jMpL7S(qCVRS?j?YoD za`zJbUr0?^lT`=Uxms*=CkYcB#PnJOEs@D?jF{zI%(B9-?@N?68jokij6C(-e$;FO z&N%I%%eO&vH&P)%k7h2#Vo7&zWUT|z{F=Mt)@j)1ib$t1z&~3-~$hKDTR(x_&JwOLqv62r;*b##G8HLwAoKfWnN+sq%~PVGW1ZGMvZc5oen(4B-NdtKPt8cW6m*=nCQt{mTifZvYuuQK>{eMg4dc=EeV{19fNxJOw0wpSWi-N~~_+}4*5Gkz*OAA)Lk zWMIo?lPT(FTLsv>%jM)>x|ZMBGNf&*m7up_B-Xjj+ZUzXn81!glk73p9sEViC(a~C z-mB~_6y5yNoI(uFN6-8{o$qqTyZuXH$`KBoz0O0*BrSXL-KO0Wbc~2aY+;bW9K1X>~6}u8T7B#iTs( zku54+gB4S{uxT+qeYvkxGfw$%M~FkLc(?53{ARw9g%wF05j~3P615=gh$rbm5%0tC z!`F@Ev3Ctl9`C48`%OFCu%5bbxJ{to8ei1;Eh%9J2Z)nC3Pogr%+>BZr5FOtcVxkm zUhA^)a&xmNmh%1YOCMFefe*XRe*7lOp))L~n7sX2)@2a_qJRp_0ToOTqX+PhTU_hg z?>bWQv{Fo(xLaoQELqSvjjM(|C&%^O#SKfQcn4~U*4n{n$Tm5BWp>Z%xVmQO9z?77 ziYJ4@PG-_Q?sA#5i@$OiU@R9oqNeWXt4osZS~KyexaVsc{DdvGlIeR|?@uXgy2 z^5VA7vIaY^c|xSKDVstiw`EO?QA&wDPVWq^O5_fu@SC29uGWM|bseVg{32zN5exSl z2Q;`{)*+sM-BUUZbf`c~DjS`UdJCDI`XWu_XMApY=QAkP7=fo>G(Y~53kvI9iRl9R>sVGha?Vqx2Lk}>%AO8|FqB;>0s5~J4>oiiJ zKt%VvzW~Kpr+U$&1-O@NYf>D;!{xrJm=*ysXUMRh@ZA#h`~+UGST+UVNBY+1;|?mp@q#=4xFKxAhhj`$*##GcjJ zdojxik8|26ZPmW~2bZB&cI%vtHLANFG;!6f7LYd&au>lV;7i}&7bwfPVJ|0W#%;bw zqLYp`EeX?MzsG0QrMeIoC~qyHIQz2X=X_2e?^&5`T~wEsAN=suTo70u|4|xCMoB*A z#@+J6qGQDU$AYY|lu{{%*TFp&_}Ds?iyrV$lFvHaE2gW45jGb50y~S=S*yprbe?2d zL8!;%Zd;-^9>*f=gJw?dt*c&%$vY$02~$PUxisZ(c*slVtBSm~qheKL9jlM;g3XBe zJd+}bh8T~8hJ742xWz~;mRx|2N9T(bG_7F}>D8O;I_!2y8ZVmw+L)@-An|VE&1Z@@7JhYIn3^6qyZdCKc?zVj5RIu( zdl-kqxl$bEg}|rRHs(5`uhr~w!T<=tC;qXO{z-g34iu^1-%wJp}f zvVVvQJ(Y?bEcn5fs#YZYdhy(7@^jdW$5#-SaWBW>2&7M^17_#o!lk5q&J=!m9d4h5 zNUz|}FYP#KHF@NB`gC&P;znJ}I>N>EK#3ZsZ0euW^rp!ir2D>=SUpl{2U9Z-HXfmR z4^FRvh;_vdX>`#Y5yurH6Q(BI5|IAGhKN5PJsA%#2-7lTv zer@aDlyVIHfR|mMy{b#j5C6;&n|QM`Xu;E)Yy|BG+*$-6pp|aMd1b!WNV&O10$OcU zjld)&f!wFck~o7q(+`Z#v?6Yub=nMhh}lgn%^8x`JP2s?}_-S8Fd<14!AkcQG6NkCd9;x7TX=`J|y( z25mh~#&m1=-?!9*W-!Nqrd60pH1h#zd%Vs;N@i7Yo3jJIn9nr~0Y;OD!hdgaj7E)V z>+!K!8AZB#k<0=8`$RO2#}wh?p!l@>!RUf1OL}mgkrwyoXz#}5vUcXr)BDv_`sDv_ zg+Gx)Vox+2N<1~my9%4>vL7`|!I&Lf{>PZd{d_|aWxNjolt@6iq`yEacA=+z=Zf@g z7zTZqybz`YxlQF}o_?cwlSw>h8qx_&9_b>l^KKQ!FvDVc^mw^c%c<~nOGroCRJd?* zi61rfZVV0k1eE>T=1)F*G6^D`Jzo4F@XtHHU!;A(qZo}s%+GoC<)V`ItBv%jK~=V6 z&xuG$>to{L_$ZRplKEd?QH$xlrw|;p2GzK%J|Fp}fXm}~U|0$ie`1r9S&N#k?T%ZJ zaJ`IjFwbgQdCL*$u2}s|OH}l}-*^8c)_dfZHOBqQd7P#_X4C`7r}9$eB@8LAZg9T5 zenwtss(CAs+Z7>)(^==0-ElM*+VQ@y^N4(cdPot|j47>lr=Y;PNw2a`PE0mC_~toR z!r`{~Ay@n?N?4oCQ>Y?O`CS!TAJTtSF!?}dme*(7SwJ;xr6aP=2Qk=hP72WB4k>4x zv`liSaN^c`1xbU)l}qd8>qYVeIx7AOGZo7Evs@6x(_*ZaVuueI0qj* z#zDaVrVQ%DdgTsLK$X{O(ffjsBZybdis#C;Op2P1 z!yp{F(96E}Hf*NSTv~O_r@Lz6z%R;aP6zo4-R}4jroh9E#HgT??;4xUNPaJ|K%Bcf zYnF*7hh53=V8)M?*aTjXysu>7UrTI{+KdS0(OJtMJ3cgcYsyN{G_`z(Ex;!K9XRG- z{r&1xxM4nd68V_VDq?T%O>A5oy@5ZUdD&umxE&odK@6!X;K22F{jz*fQ=xvAwR8Sy9ULI3hNm z>$+(rA2l1f8+NRys>8&l{Q{xRdKOmxTL$c&gxEci*Y1p(M<__AgvVm_ekJ{JT$E`A zbCzu^;|*HASFht~Y8;=l0{Y|zRS1E`wY9XmrQWP{$AULQ9)XVO7F_!{R)C@+epgJm zfSl&!>W(i5b)*N7SQPDo-F_su_?O0R2rE2IaI;_!;^@q}x;KwNg*|wAGD^|F`rGUIQ%gC1D{7@*<7M zhCdb`DV|;_Xnh`KcFp{L-F#8p9bWL%U0{M#-J+D)(IM;XKL5GNmMjh(`R;14;%!j6 zSu;_uETpn5&6uX#2U?Ycam{uC^-GW8_9cuf@_V&Sb6R&!3su`SYMk(u6(nyFs*5 z+HU73uyk=MOd7|$?Y+_ltBkU(p&GN-xBznh)NW@#d&-yodhv$(5O ztGPjA-#fx(C(H#m$|jQeKN5{NHk$|iK%muGG<)LM2sxJ<%T}>eZB9wy3$S2PPIUh5 zD@vINMT3%ZN#rY2Z9UUU7IZpj!bXP7naI~8V!w2KlIpit9uLvz_>j0c!$!zP)gxx- zq}zWOm2Jah{@eR$<{;-;dZPHK*6Y;e(+1t$FeJC+aiuPkD$!SLrVoq!tNHGwlf@9+ zF^A8upXi}SXw!zpVwGRK1Sf4OC7G{t5~_xFg1ruT_RYuA_?lrOy%wf&6|;wWCbl55 z-7Ni}==6K@yc6~(K8&d!NDAI`m}kO}*{FLc6JLeF#AotLCOqCG=9{B3qWxMmMR--Q zQS{q#;rXOJQ1l?W^09bF-rF&kZDK)O0~RE2DKq~SHak&e&`eRvY&V9K<#4m$3Txmh z_gGPnoOn1rM{SJA!fM`)8P9$xdUER;G$m?;Tx8 z#u!2o@q)6eiY+&qjNa zAjw3lSJ*?ZG^R!Z2eX5*_*@%IFHvGbomNKns9HU2yeQ8Y6;53cHCR3m_mQ(=CFRrN zG(OJMOlQ+M4r2v3N5oU-xo+CZnNVzdfAE;G3^oK8-UZvQLG>!+^6#Rb06AoY4oX{F zARHiD=BkDlW*=cfQJF^rGPd8q3yh0S#dD|ALQAs?-abM8#ZS67N%6>I)-rgHYX(rA381m7EicXG`6vD#chaUv8+`PrJ?CeNHo z#Kw3`jpx07Kz2)<+!#kyryUX=l{I@gG|R$`(yLI)?h=zNmIX4bp4UkbYl9q8$|_kW zd#hL_fo*idv;D zbMPaa;nkcfH(9j|4L`f;*mkj8sS-^RZ%LO%!YYf7tUwB|=ac%bL6+r&xk5yqcjMR z>2*SH+SRQyz(rSI4I6U=({Q3vPC7B6mgAp;oC&SN`TEs}{uN}1Sn)?GSuO1u5jhcM z|4qA(?`}ybL__O?K{6W+X^;scae{X5jeJOSZJ@_;trV?!&I1af-Z^ylh*};|=Xm9` z(~o|nPBLb4u#w7Y^oy+rkAOpt@4Q}Sbm5r{{(%flmX~952++h0^eU3F`vETT$$xv zNB=zG7kiD9H~ASkm5XcaS2MG?DvxaQWf=1OyQf!b?{G+fX2VJ?V&3wL{(K&L|KzdU zz(=*9fp?uWb_c{Hp>h}-F3S=Fb4}cOt&ER;Mbp%57~_NKK1?(Od0bpA%1kcw;6@J& zLn)WLx0`v$JaiAGOK#FBUR3oL5e9KU>BWLILk^3(N+ch?4=65Ba_G%NyN>rtX9BKaO8Y|%wagL^ z(eE&z!qoTUl?nn?V{D=x7f~nP6h`7d(Gkz7wX;k*d~T?)fF^@bCgS|v0>M={Nn;R^ ze&Sv<>|z%CcSH5V{Y<5edAH}Uu*(sXd@V}*inM3-(%_e3Y6XG6+K^g^&{B4R%C?8Q zMV_hakg)xfBmQPx47kW>|BYT~VN-^Qy^^0Ec)hG*HJBj^Th*o+3Gn`bgsgZ^%~x?b zHjp$e-1CgiBP?ok)LHo7XJ__szWt%rN{_K;Woo^3wWsy9;5t9Pe(j6J6bY^*gRNVI zxE94(b9&ib!KTc@$1e&F@e$giy|A1R>&l-Z0nLZn6LLX9nRhtw+Ky_jlpPb2a&%6& zW__XFv$JrA@}o`UT@j6>$6qTt&ezND}aiRRlV(e-4PJ%p&&XrkZ@uvBM zC#uinoww~5`%!SDXHg#z>H8QN`f_y3V2Ps%Qo@j~lIw-m2gLyizPmTmmxM%{&m z-|<@p3LG&Q(Bcf+uG;6AggWfz^%RLk2o2X;Y$Q-rdKQZO-k11pEJLl{bwJT**raRs z#GTuRjqqyq^TjL;{M>&a<`ovCmC~BJG-zTXe!Tpx#3Eco=Z~e(%uJzSQ;%}(N8E2gG^7MN}Om19)(zIyf4c?pUci?3?ida(X-;b$~c*I0zR?cyKBgp;pM zvrw)cxMTXGxSmbXc+LEr=MBX{!Ns&Dag4sVbBGG~cWa+mKhE@>jaioRj4U1uU#{M* z3FyelZMbRP7y)E6RG~b?4}~h{LEj53Qj}5&>}7N0DyJSu4=#beQ4}i2m;{ zy++v)6n=@yLF4tNPj0zYU1Z^)kRr2u}& zZz#YW>rMIXe*-tW9BtY+?e8+ycM{?{O6{zc1!WwNs#qTa!2o$oW253?_K!4$h;+uu zGvS1yEb5oz{w1OpR3rcEElfJJm0qTLqgIU(!EYNjzWd_3Q0C_ThDO3yn)2U;3*CXi zZ|{(aWmxA|qRf>=yU$kq`Op*^wCKWwPEU_1RC@Ot-ZzOPwmDqpYwgSYw%3T!^?Swj ziW)5G)db(pQ)jcALU?!M727aCJF?R)A=#EELf*5Ef))R%VAIp{2ECefQiChd4n--k z`~@m^asNUtsRkZFIdts?))KxA43pp|wdCzrGr>=(5^-QrYj39&fSF)9Y4s~2A2q{5 zQedLzQObW*SyAyLP2lE8jf=VGReutn{A7`l{I};HET-$+cf}m{HMO;$r1@Xl zdaD5Cla5B%0viS<=6T;BuT?+UNR~XN%Yyf2B!yFh2D?$6Rx=}Qj!s6Ic~|E;l2N`M z6i$U90(oe*`oI<+Q=9=*ynpup1uYOhtkT)pdGPJ~nzDcGi%(A@0gfQlW%bv@V-P@h z)8z+JVt`l{0St&lsiulV0+hJOQ6h?1 z0=1x(6t_YAo}M0RU5Nc+QzI6oc%|d~Yb;8k;ax*o)gmbdRWvSiv$S-Ghq~(hd3u>n zlV>`6&jes1-N>qr&BT33QdqMBwxe=5T>#JR)!IhdJo9g2PHxdENaU7+fHx5_x+hlGE`~kNndA^I9)qDSl zg$3fk0l5!*my3lIfsa~wWKYfpB=uoS%4T^bW3B9xcTE-2WsL1y^>HjfFt~5Ycjry+P6)NF1=W+iWY!w^*bF0m8C>HJh}(A z`!j){)+;Qcn_ktaxpfqTm+xPSNY<(cR3PMIsKw<}Rio>D+ul7oK^nzn|E12##%4*s z1rUn$44qq1cq8T-eX8pz;pGT-3MqPUWT_m|Z4E~P7MSsD4+wkT}3^ZQjnRo7Ww zkNuzf{OB*us#Z+UJr&DtL1|;5D(HPmvv!j%*U%u`6?ZfKU2Bck@7(e6_?#f57A!}O z?C(|loO3E0?u=giWj}Sx{}8D4UGiMvcALEl%`|S%)f1DIll%Rb1eU>f;N??_^@e24 zIlv&G?nox})70;xR>ZmH%D>M@I`vf@I_~cfeLW4t-IhxnX!^mgO76?GzUgQPBGL zH4FDg%|Cc+k{Z99&ib|@K5mc{O630<(Jk_?tPTJ@^6^{)w_hVzE{FKDPB&~bS$A_= zUQW(}{x5&-H3`m3 z=>1Vx2w zThg-dkF}Wn!^+Dj|DfL>iz+;%Vw6KFyzupf!J5zMjN#M1r}Sk6e@{4-!}}G_X6?kX zq_NY-!vQqRX;CFPizk1D5t)tlQ<%$Bts$5)00@8UK77LEQh)qz=|3dy;c0+O{Pxg8 zL+jT(rHG|h|QtcKKh--iRF~W$yM(DfyN_1S< z)H@CMd=fW}YcavWr|%pdQ}F+Nhk#j{edR7&x!{g`w6@#HXB(d3N?hj`-tk~%AiDmQ zm3Gl;{HfT%c@IWocPYRQ>wzJoZM-1Bk9Ggo3abI?RFBl=1|16|)_i|Tmviw`)uWz2 zn|c55W<(7EV%u!!!zVnpQ=D$tYIHR)wgen5Z`C3yVhbUYYQ*QyL_8jQdK%z^ItOk3aQQ%->)4GD5r`&?@FGI6X(0BntE6M#uU0%0 z5te{y#815ht`DSLYAvE=?0~0Yu+?uBssHt$EUq{s z&>~`ZhyihPaj9|MZ_U+~djYc>75S^AZ0hqRxZH@;dzk$Vo-$(B(@IzV$_AANaNGJ+ zdWXXY>abh4BL^4}$-=hhG<>{UAIbnm+v%L&J4{UK|h!#L-9qkMy{ywqdL-Hdacj zon!-59T$Keq}@cSj{@*10o!{#>x6_rTZ)KsVz}Q>%>(t^l8+vd*%DJ4ZvHXd2e?%Bg*q^P2iXJw+ zVq_AvF89%)eW*I*NC+A#Mt#yJPp2ARzFFc+;|MVif?t0UlN+j55S~skm_rv)6uvpK zYq?_5;B>!mwsW&Cy{7hf!qUEOez=O*TP{S~5SC^t?d1Ui`uUi<(tjaGVaNw(6`;4) z0SvKl!CO}X4l`?^d1Oe>}MVs2ZBI>NC$f>MLq7Apu$V zSz?yJ&oYJ2I(qVWKyWc4M&eqr0%&~#;|k)}>+UkNVY7d`pah;*z?7z?l(5@|aw)t4 z3QTD{#`=HJciZWXP^f_M}F78C`Ihky2g9dH~p-8dGz1v+eTi`@c) z?*J*pTcSv^i6lm-5fLT0qYK^NnKDl#lT@?~&Vels_&p=@k12t;-+_*zMGw$-w#M^5 z`Hy{kyFDs@wm&PlMz;jd1t8};p_Pe9 z_tl2dJ`Z;=AF5VO?>p|dvlX_l;5~f6b*^&iMrMoVOCB&y1yvr$z+=08Xlp^M>RN-%#hV>5a89QCD*#eI10v_%)|CmJE9|wH8 zuQlumPnF=)hxd{U46?VEU6L1nf(XhX?t|M8nHN3N`J|ndaHi(2$B8PloSaAdpJ(%3 zv`5!~!P^M<&^)g+ABn-cGIT~@9t7nuX=a{VLTNS+c+Tae+xqS=M_M3MRR>uiAq4?L*=^M8l9mXe=HHAAuVme;Vn}H{M)bZ0Dp$mGN3T?*Ax3L~(j~Z2B18 z2sY!Z@I%(yRr8DQ{3qTMcql3R^U4hn z_u1j1alz|KB`yyvV9y1ElC&Y2vx~|T&=pO`9{ejvz%yq3KhEMGw6KE9j_4u+e3P<3 zXpF(5pzb+Ww5UExQ6MSQ7yw}se{>m#$)>*Lm}^8-dVF&^L|02|UF=&puOP~H^$b6D z{x76e-@3omsKbha52}HQJhKaDIE;7A(}m3k8Spg<{!Lnju~TZLQRNv(-;6<52E(DA zy_46s74C5SqyI0ql@WBbEy9XQOKy116(uT5DA+f7{i|B|?|0zf3jX^E+7r{W-ln2L zpW#QkMdC2c6p~fHXplwPnTjwr**7U-Ra!pE0GJ-tAJf~rD0NztxT|31;8<6sU7IW# z{l?2&cfHQ20YGCgrS82({pq6<8UXqF{fWID(KNtMhg{p1`rkonnc#>c6i3>)Z>*ID zkpVg6cu&pzOW$NtL!REh%H#nxz(XLm;2f>b)l8KG+e2~mZc)7||C=dwG2mB4t_M~~ z*wnqaZ=o&B?tNh34!wm>>ZInM;Qm2IbXALVsDV=l*k}-tvDY#RY)A1D|M`R;Eq(bGXNQlLvExEzYEZtpPYx3|Q0c=@ok;RmI=#HDa`+QN-v zl+clh?)V71KAB;2EH6ES4g%Uy3Fgp*|JX7)ebP@AZ%r()TXv1{())u#LQc1VU<`W4 zkxAhzwC!Fif98G8Snq3mc45`+?GWtXdx4+F2s5c1T-e3t7iDBrC4Cf%0h833zMV1) zOLu4Qfn}h@uNW-2r4>*pzkAuW@97}~O=!#4r`G@jU07O*%+o~P3Vm0pvxf;KvrDD*<_0FC zkvBhEQ>()(>4+ykXd?xgYwOSJhwgw}P~qJT#w)0ZurQj%0jd0t zH0B)mPC) zjMCiOU^GTO*PqY!QyKn0K=gi4s4J4Sb6F ztoTM;cSTuEZG?M;gj{u^HTm54fD`9H%Yk!!WtIntt1?W`4>p=I3F+R%{~?&cYR7mG?RShJe@0!I=Ng=4_<3>WH*d<3yvE+SHiS}D0;5Z0og%uy? zM2{wI&(4z45SAi(NV=CPek6GF2)1Y2(rj0FXW6B$kTpW(Yz@OxGQ!fE-1%22CG?!8 zvw4^Nv9WTsT8Iu!1^A^!brKs>SqakKl)9rfq>{=SEz0WZW24t$ytKC;m@vnf=C#*ZV~g>oZ7zL=}>JcYr~NdJGK08PsPGy_tO7TkM1> zoGrmkMkl4Da5@z7n>ZiBB1m(YXg?jVp^v=z^dTqIDW1ZHY=h+@{5^8un#(*5p*_OmpB65DyMBB#fS%QlPjz1?jiM14q@)W-%eL9F_W94{@Q-rVr> zv!RAYzK320oqFQBta^v=VB*&2trw3`dEhs{eC}>LcGm>dq>zBpX*aY02wR3lgo0#9 zS|{_}3>AYqaZ|dUM7njy_ZJw+6ieJ^FJAp>cA+@hig#(V+(GI0$Cvpyx_t4D1qcrq ze3jMId|g>nb1X74G66)Dc&Be7#oRvtlW`tPmDX=hM)Ra!x*%#l6Y_NsX76y_Dd5{# z@y{aL?4w7Ix&xc@t?yra)WWt>&wj9Wb$-a`INiGpspE7@NUZDU?=A5&grND0YT;5s z1l07NUs!^QGzmt;-FP~kTR{+4J?Z`LQth;(Qg6>4J`i>BDn?T2>r1{m9q0K9JYlyQ za#+&&`zfESoaP7RtKPtKr#-(rbW{4qZ7tEYc~P_R9vv}#MbL}@LCUpKF~tiNSJxcz zCD7pL5t(8khj5RPL&;EHQ<;V6y_>vxB5g%*E}OZ^peKHLw97gaPUaL_`~x zMQkTPW9Ld(i8YoYLZl>Hj>k`!Br$C(Al<<>7H=oME{m3<<{*?IpLh&WMP-M5p31&k z;fFRA?!@>^>tNtGDtV#&F{3B=`czb>*1V+iuNJ&7Li4L+whUUBj5N_p#ot$ZDY z8JZp-s6EvSi2Gj$&oEwEX7KA_yu`G6L8s*TJ377EEC0AxrU*7meV^jZ+;CVtZ*NbV zs0V3%Ld?>w-C}Yj!^;<|_?_1~7ZB40W#f7!&(-Vi%l-2nvbEN!aV`#aIl5HG6k4LG zxb_t+6L6nTZ-R8_-vf|oY)D<*|M3T;B$egaE~}h*BSA_06sCpZ-Z*L??9~}54z|<= zjG4uc605cDbSE=>DpX((uMhI(YB_xMu8>e$O06i%n+-+_9(+$jsSzBXAB2Ux3BuBzM z1hSXAEY6xk_^}bAy+Mz~qxY~m?KP$`NUM;mdzc7&OvWf9i=z^VsgCHgb5zVh+ zW=rP(Zc)<0lYj?NFFA=meKE_(5PS@U+`oWQ0RiwoyJvHzw(~U6C)jcpPin1$Bev$8 zMMnAWC+a|Lca8f5^p67BCHvbbSpHLPI4LzAS?X@619QX|nh7F`rU$A?k#@rm}^8-rQ7)&rJ5lYbjN z4vmEAg_EsgYJa?R%i>LSRHpE1L^GQg7paq;lFxS z;rnjRW+d{nnBqQlQsU`6x?ja1W(#Y@yWm{ZUe4vW{ur%vDQV_~)24z?OFG%!;BZx1 z_~4v=H_yRKOXI;(d0fc)sji{$l$z(LfUCwI%k)=^HG{O+pQf1T#hhdRq%c+yreaNX zJNGfOKDf^Jc0~}Z@6IqEy>hDIisysE55f-Bm&J6Hs?GXg9)Vf_Ue2c0n`_|kgB~PT zW*FJC|3&qv&C<>5ymTPL>9lv3-=QIBUk*L_5Q6qF1E-={OwLqreG(A3@E#sSSHKgv zOOm1mUSE26vQA>h zxiRD3wTy?&k+M6GAsqx~nTAU%hYHCCtXA;2vc`gdAL3?}d=JNCyDTQ}%s7Gw(70!Y z$_^063NWgj8Cvs?uBWm%*Naw{HyXf2$LMm#YVC}P3ttl zwqtIsj0QFhTdx_%EY*AY_z;3P3pj&1g?8%?4-~tF>pFg4A6w2=}ZJlJQP{w1(ZnaN0 z|ID>TgJxingw+%LXq+g(+5nQ{f-kQ44?MR_yQry2B`7wQTLNVAmY?*z2QL@VECNus zdnO#anfL@!|4S!%wwc4Q$h0_ODAuCxI4z9Muj&uxA7jxe#RCTngu(0rqRVeB4%O0aK_OW9P@lPp;Lm?)Alg%Q{ z2yx%cB&7MdXRrN9R%CkXzDap0)lo@;TTJ+H<>;gAqx4!Wpnzox6Yx)Ff9h`C`ek0y zLfeijf1n)x4h&r&hVlBG5zKr8qFuAtDc$OOywQBlncknPD^ro@#p_uCs;VEG&45%Q z&JheWUM;KhM}K}=Yo5#5v^GqF?6fSeKH#0m&bXKCoVo{<0`&em^9BhW_CiH>B;y@N zlCu{sN+6IbvJ>s%VK0l3+&)F+`_$f4TA2#w?c6)!y`Is<|9%?gMzz>j6dy;$+u>hT zw-c5)e*YTM$fvz{^R<*cJDObDBz!uPmIPW-8p33Iy}`^(}f zPT`YJc^7MCL>c9~Af8m$k$sQPv0Lx$F+6l(#mlPgpE-f3+l&-STE<3);4?oz_gcNR zx%SqEKH{hL?GLmvEtss#;h`eHdJ!xoYR}YeH~<7fAHm9_f9dii0cr8NlD1R|0?kW3kg#x$MpRx9TvvF{5Wh*SNPE^`2AMcvk47cC#XM&UhHJzwLV>GsKBYPiYf@87Bm z+vkjbAsOs{+(lsed@z9~*mKK?JHKc>yXTh;9Ci@7n}1&hd3`E0_LnAUX7b_(T~j%j zb(R$v--VJDrnDA>A-8YueYy0AK8mDh0y^U(ki5Q`BqDjZ;?`dG_4JHqUU_tty^$4At@+S0z2N%hO^yP*tOU9}a>lY3 z7YK&-%&mL+P_~K#FQurj5o3oK1gcYeLsY^Z*zUt<fT5Y$MM@sg-+3+nRiImpmxD z*Wlucvr$#MWG2c|~*va=Y zJJJL_dJb#x*xnjDVK*UJx{NRX|ICRi(d*SqvZuihr1V~sdfTQ%*oboU4qb1=eB%Y8 zLlL(382Z0l1N0`Jn*FZlp60k5>Bt@m?L0B;axn0*xfBEfw0jTh10|WNIJ1F~Vn^jl zN0-biz3uH9UdS@6IK0&ST9@#SIgkISUWyNt<3kfv^olOnR5Ene~a_N`Qu z|G(7{WV5q*ViH6#7&hCHPD>I35PNS9Za<_uVML`&v1W(=RRnCE^8CMGUyjRD=bwIE zSg=~*2R&VC(4#vBs@w+CUD*k@lN1ub2}*eX{<}+n`9#ad1W0fjbmv(bfcjbjq~8X= zk@HYN+NX(U36gtuh;K+Sh)VCzzAN>=@TGDT{Ok)fnmE2)>!NBmSQLS`N~s)l{=u>Tx~+hwAdT9 zR4|!#46t*M`n!WhW58cQ*S_YjncU2(7v~VM8SA&@KCBkk;n7-1I*9NNbg7h98f%8l zjv@Bv&(H!s5&Y^^IlP&xpwi9ot%5$d$v7 zK}gv5Td$(L=b`U(15GjaYI|=HB7?)C_cu1%W?M$Ok9g z^RQki@dc&?Ur&sTc3P4~Tz1cx_Pw6gBlexk_7)$h>^dcy^6Lu=E(9EBlf8&gG<{Iy z9F9O)ozf-dH7F;w7xom?!$^W7Gg7ke^7F5pgyZe$Z`$*LZ1Wr=Imkd``K;izy^3r} z(N75pJ!D^1_Qy*C{?7?@X2;2w``)9|b;X-YwW0RUVBniqW-iDV*4r@6?%+Cd@~Q6jwPeb_fHoKs^^l?k$m z9V#liXP)NMK*SGhys--LEi>)+ML)l&_S*V^O#p)nHbMOd8I===vjh?JfSc_YqzF_B zw)A>-(iunC{Uvryrr+g=nw1?~;jzcbp9%tp0*}6Di!?qdeWQZzaLY}fvkN|?l%&^> zYxr7(kjY&+WKs3YoycdO!bi3Q-{a3%e5{n^=!s7&NxqMeBBdujBiaA0c(ZRbSKp#e zH(E62?UQBUzWU!&-cD^@8{JOry4_2nCW>S>_4V45XvTXh+fN5l@2NOEzkp)lyXblh z)qG{Y-y7Cobe?3p_2L!m1RX|T#%6N6zBqV`9VO}i*CkaqbMuti*9TtJuQ}Up%jVA5 zO21w4Cq|W@7!oA7z-1G++FA5_E+7Wm?vyYssjhJ;b(xeN> z?8pV2N6^=7T<2YKd$VT4oJ&|xEaG(71MUywi7IaY7}&A;YF_SC(YKN@-2c$L_+w4( zx+=<@?%w8E)O#;VD#fqyJ-8pvV`wi*8Y;~I@nb!XC+wVO&_pN$|M@6X1dWK2*e%V? z401cPxJX$#S?ZQypjMI{R*ZvF?AO1pdMK+npup$6ap)}eupvl#d8I#jH};Yg<#X=4 z1);v?nB@FBa;f9XZZ#xD6+4~dXi>#mTGJDSTP`JfBq$%@y^E;DhE`^G)+^Jkwk;N~ zpm*j%s9mX1EF*heYA-EvD|By9@^RYK`CTrL-dXpKLI$RGZ-jYBL`jNr++xPj`O@VF zXB?Ybc{U6ZqN z!JApmOPGjZCySqU=w8zX(I6|7q@Dims97+^#!h?ojyaq-In47@W43x{CErb^ngG@5 zvHOsso{e=C+Qk_LtdNT9%Cj?R+Dj<+sj}5uD0y;5w%+eNtAXT>({G}w&tnHFvpg{c zG88D5-n~xZKBX4wG$c1$yrMoWHZ%Rr!=i8@f70%B%0W~m&0Y&{#i!3O25Wa{4f|Ii(u?h;_CgM@b6oHPo$LoWI7a7(HrXlfLvosMx$^hs)v?N;2oK3+#*SRy_lq zUTDu9iKhLaPl~Ek*n7Zi=!#%LseMmF=gd-n6-W0ZGEq_w{G$mLYa=?`bFGEHZ^3jh z)X`fnEp|0tKklZAk_`Ln3H!;(Qq}szXxH0Jab~H^u`?yE8+}@vsstzv&)w0od$7_T z$-Nj5wZpt(s_(MZxLm*0iu%XrV}j-xd{gw&T~v3JUO!C!OwzqS$Di}OGrROW`}jBNQq;@o zy$6POCgkQ0|<&FP{|UzPj6VVwB|Og+I1~5XIuU`z-?eETpGF2=@JUa)5!9 zWx__-0jHEa2<1TM+*S~-(9AVA<3OiTOu`8&qdC`e{FyF`XxH1rCd!!Qns_60v(-;# z|DSvEv7taap#2j%-5fc2q73x}PD(N9`tlJJ5^7s{^h&zTOV*4Bg3Yg!NF z$OrTJ>7K%N1&J-2jT*h}L3F6xC>1-3l1Z#1o$MkJDZKq7DC{6|xI^BB4ib#+o5$Y{ z%$UT?(slqq@+3$W*qF(s=KFauKE^R|wz@0Lk zAFK#U1bXdqRNv-zml%I@0_#EFb6r{%#lz_Q&N5KjA9c0-_`ojxQR}A}vcaYVqCZnj z&k`m7U4l5pY3){wNUKiVMX1KGSJ2;Bo<5c%WC}xLKJvKf-F4T{W++Z_+MNGU)((If z5J}&60(I4_E?T$^q`H&UGZIquu;O=<2OD=^EFE#_HD;HVPpZiyl+zR2Zd>b1*0fJo z9amWru9Jqs>#5xZSqV)1ij0j-L5MG;VO% z_9PAdC#+V_6C=d`Vw9aw|F|b*`8WK}QLN0+leCkl_fphRjV`+H<7nanm1rRwV-h=AR*nk9(LDW8AmBoSO;}O^);0 zLZ!%J?uVu?^jp*FisEbU_#ZTsva6+xg@L=OsjI82t|-BAoZv#4KUD5ihx1qfZ#m1T zCQJjY6y8_>#kf+B`r4R;JxGI?LOe8(X@(PkmL^H~!7|JSl=$pHzC&Vj?i)m()&a58 zg7$VZ|AeQ@wAGwBlO4J57pU`#HLU;*;)upMS|}Rpignv|5NzPq&TB|3m|)*ERhI|; zZYi8I^x5~=xh_9yj_xKnPD$|jKGr~2wM+0G9yY!6h21%npzh5A7JL?3&xK#b6_`Ptpvlc}zD)U#nR+u}Gp7A!t}R7l zDE&FHYlO1XN7L=iwF4%R*=D#lV0F`-uTgc4^4({6@T`a-I?MRh#@4Kx1>~>;Qi!rt zlhyKM;n0^a!3rW(Vca@5Bsd5NE<8oZBDQT{9c8NFJRH|# z_!@L_{6bH}#e1euP$&Sz0{a)JrP9T_XmRu2*deaNK}mvXi3>!=QmC(@l!WPITT|g|7#}8WB*vXerdUv&YqAj&XhQ%nZj1`708}^Y6RiST(_`X&( zK@?0@v*__GI5BVm$4MV!7l#upp8H1bs;Z#uR9l&(Xl$aGv zy%E54L2(+F`sY$EGCok-x76F8OV`Bdxqac$KFv`&9k;C|VYk9(gI)5r6HX#V_n_EL z08TzA1Ua>C??7#HzD95Lr88St`68n#pnR0sj#((5$)<+}!Ec35!=G;1aL1Vw;r9bL zic075R>}jIz3)y)O>Q32se=E{_3lIcAe)(d*Po(T4+RhQqi!rWh@M~Z$BqSO5(~<= zo-_W*KKA8lImcmZWlOX79vbIfP5Q|%UGB-cHGD$Abgu90=;|~zXFyRZfKwJ zV(u>>A5gsre{_Oz`{1`X4fTGqC}I?<@***K5AF=o|L0#`QZGj2%)0Gt%$!GoJF=2Y zfI2|xE?EnxOpRA8(1bQr>C<7R=&7rV0&`~?&QQw*X48B`62+X%j222yjF9E9HFl$C zwp%j!zU=<`r2q^M`{^;^kB+8oF!hGeMu|lGDOY9aM=@Qws1gQZNtW-xJG)2Cq4s6C zCcNrs3LFzGgiItsv`^0u{C98+ve}+%oVdy>Zih z*goWFyS)1*6Kj#kv36!N-T8NmV--K`PdV4bs_v5R9*gb#d{_F!MT2KfYNLWB^9NV> z_GMW+zWBJ)efx65iKpp~lwGL@r>3&6MmMI2YX?Ygqt-c!lHd zqq<$2Tw6+X@*dx9nlAYrGn;ql0MvBmczP0^xb)zq>ZdzZW=?QGnio#)VP9^_hT6tF z8oM4E16C@Hr|pAs8Hk$Y&$$pVNFW1!>9e4DcZbW?`eeEmoRg<>fs}YaF5Vc95D{?O zb`~6CpBnqR;CT7ocZ!X++!7<$JS6ja%yN5-;W?J9mg7x{=8_Ua{(Ppub51My5x-&qI9@%zqh8QzKcMpzn z+g=-(Y+^Wj2i3SSq5Y#2#O}*Vxt0y_RIN8qQoZ9e~mt?#Yf!?O> z#KC?fpkL}fmt6$NkXpXgu$;!pEp0M+4`Ak9CA^o=l#{qz1xH?e<0ZL8a{Fi7*(R?G zh)m>$NT+y%tC~9(CnrS>m3k}B>DCplpCzgvHi0sH;ylq@D+`M7Vq#}hy34dl4)`9Q z<@q?<_1s)mMM&L!ze@3mA1^xA1N_zHx6E6WE~%Yo%-)uT`CihZq3DIKiL^vMsC>yf zbJ&99MkbDna1Be9lajX3z$Z1Fj952wmlk>e27!wi}j`YZac3ySf40kgdA~H zHofW607?JCg=&sdM#!0mTQHw&^pe&~5<7EWE2}+jAGk;Iy{)KV`*b%7fNoCHb(>~Uo;*|k3FOR0k^@h!S8yxGBXJ3-?T ziBW1ZRLTgx{UBZQT6q!Y0v_Emgnga-?b<`eznPq-E}~-}X-&K=ro6u)5gdj%g_YAb zLV6p#%7dN`##v$QJO}tE;P+-HgF}XwYl%;(KLU_=-^f z(`;0ANh^tPK_zkN{52G@fgGzW>#cLR4Jsy^CwDe4oH|1ysZ7@}Pz!Wi88}wWn8x;^ zJ0O%<_ZmVHOi!E-ls`Y%EAQ@#`C>83qOJCCzPIM-(?C03T${nqV>Ic~* z?n8kn((;%46n4bY+zFq5d%C?;<{xqvHG|8o*E#bEbK_OdK3S@FRNrjq6ea5U>cwsw zJeZgEqzs?MmcOeqlxkc+m zED?1@f6(c{S$SIJ4_vk;)LY!ID=6MIg(YAve0f7fXREG}>)05t%4i;Dh_v-gD6%?R zYd@rosC7o(j~#cV^fEyGVE!M1oBuxS`CmTSl&J07ky$EG89>3$bs2@LX;<_;{~x;= BdxHP~ literal 0 HcmV?d00001 diff --git a/Scripts/cli/docs/examples/get-data-scatter.png b/Scripts/cli/docs/examples/get-data-scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..96b2ac34757eb14e10bdff3cdfdfc6e0254f4bcd GIT binary patch literal 17499 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 Nhs}S_J9zf${{rvhhh_i( literal 0 HcmV?d00001 diff --git a/Scripts/cli/src/command/base.py b/Scripts/cli/src/command/base.py index 9a0268f..4adf12c 100644 --- a/Scripts/cli/src/command/base.py +++ b/Scripts/cli/src/command/base.py @@ -22,7 +22,7 @@ def get_data(device: str, baud_rate: int, type: str, series: int = 1, export: st """ Returns sensor data of selected type. The available data types are 'raw', 'full', 'infrared', 'visible'. Allows to perform a series of measurements and export that data to a graph view. The available figure types are - 'scatter' and 'bar'. + 'scatter', 'plot', 'stairs' and 'bar'. """ GetDataCommand.handle(device, baud_rate, type, series, export, generate, figure) diff --git a/Scripts/cli/src/command/get_data.py b/Scripts/cli/src/command/get_data.py index a0349e9..622a658 100644 --- a/Scripts/cli/src/command/get_data.py +++ b/Scripts/cli/src/command/get_data.py @@ -6,6 +6,7 @@ from visualizer import Visualizer from dto import RetrievedDataDto +from dto import VisualizerMetadataDto from client import Client from tools import print_output @@ -50,18 +51,21 @@ def handle(device: str, baud_rate: int, type: str, series: int, export: str, gen logging.info("Data has been successfully retrieved.") if series > 1 and is_export_valid(export): - visualizer = Visualizer(export, data) + visualizer = Visualizer( + export, + data, + VisualizerMetadataDto(type, series)) match figure: case Visualizer.SCATTER_FIGURE: visualizer.select_scatter() - case Visualizer.BAR_FIGURE: - visualizer.select_bar() - case Visualizer.PLOT_FIGURE: visualizer.select_plot() + case Visualizer.STAIRS_FIGURE: + visualizer.select_stairs() + case _: logging.error("Given figure type is not valid.") return diff --git a/Scripts/cli/src/dto/__init__.py b/Scripts/cli/src/dto/__init__.py index 86db420..53de7db 100644 --- a/Scripts/cli/src/dto/__init__.py +++ b/Scripts/cli/src/dto/__init__.py @@ -8,3 +8,5 @@ from .set_settings_dto import SettingsTypeCompound from .set_settings_dto import SetSettingsDto + +from .visualizer_metadata_dto import VisualizerMetadataDto diff --git a/Scripts/cli/src/dto/visualizer_metadata_dto.py b/Scripts/cli/src/dto/visualizer_metadata_dto.py new file mode 100644 index 0000000..2bccbdf --- /dev/null +++ b/Scripts/cli/src/dto/visualizer_metadata_dto.py @@ -0,0 +1,12 @@ +class VisualizerMetadataDto: + """Represents dto used to hold the metadata for visualizer.""" + + # Represents data type of the received result. + data_type: str + + # Represents series of measurements to receive the result. + series: int + + def __init__(self, data_type: str, series: int): + self.data_type = data_type + self.series = series diff --git a/Scripts/cli/src/middleware/middleware.py b/Scripts/cli/src/middleware/middleware.py index b2339ca..cc33b50 100644 --- a/Scripts/cli/src/middleware/middleware.py +++ b/Scripts/cli/src/middleware/middleware.py @@ -44,6 +44,9 @@ def is_device_available(device: str) -> bool: def is_export_valid(src: str) -> bool: """Checks if the given export path is valid and can be used for diagram generation.""" + if src is None: + return False + return not os.path.isfile(src) diff --git a/Scripts/cli/src/visualizer/visualizer.py b/Scripts/cli/src/visualizer/visualizer.py index eb07a72..c02a324 100644 --- a/Scripts/cli/src/visualizer/visualizer.py +++ b/Scripts/cli/src/visualizer/visualizer.py @@ -1,6 +1,7 @@ import matplotlib.pyplot as plt from dto import RetrievedDataDto +from dto import VisualizerMetadataDto class Visualizer: @@ -9,37 +10,53 @@ class Visualizer: # Represents 'scatter' type of plot. SCATTER_FIGURE = "scatter" - # Represents 'bar' type of plot. - BAR_FIGURE = "bar" - # Represents 'plot' type of plot. PLOT_FIGURE = "plot" + # Represents 'stairs' type of plot. + STAIRS_FIGURE = "stairs" + # Represents a path where generated visualization will be saved. location: str # Represents a collection of values used for visualization generation. values: list[RetrievedDataDto] + # Represents metadata used for diagram drawing. + metadata: VisualizerMetadataDto + # Represents a base plot figure. figure: plt.Figure - def __init__(self, location: str, values: list[RetrievedDataDto]): + def __init__(self, location: str, values: list[RetrievedDataDto], metadata: VisualizerMetadataDto): self.location = location self.values = values + self.metadata = metadata self.figure = plt.figure() def select_scatter(self) -> None: """Selects scatter figure as the output visualization type.""" - pass + plot = self.figure.add_subplot(111) + + data = [value.value for value in self.values] + plot.scatter(data[:-1], data[1:], s=100, alpha=0.5) - def select_bar(self) -> None: - """Selects bar figure as the output visualization type.""" + plt.title(f'series = {self.metadata.series}; data type = {self.metadata.data_type}') + plt.ylabel("Light value") + plt.xlabel("Light value") - pass + def select_stairs(self) -> None: + """Selects stairs figure as the output visualization type.""" + + plot = self.figure.add_subplot(111) + plot.stairs([value.value for value in self.values], linewidth=1) + + plt.title(f'series = {self.metadata.series}; data type = {self.metadata.data_type}') + plt.ylabel("Light value") + plt.xlabel("Amount of measurements") def select_plot(self) -> None: """Selects plot figure as the output visualization type.""" @@ -47,6 +64,10 @@ def select_plot(self) -> None: plot = self.figure.add_subplot(111) plot.plot([value.value for value in self.values]) + plt.title(f'series = {self.metadata.series}; data type = {self.metadata.data_type}') + plt.ylabel("Light value") + plt.xlabel("Amount of measurements") + def save(self) -> None: """Saves select figure in the given location."""