From 20352285caec0009cc9d52a56cae88215a4dbf47 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Sat, 11 May 2019 15:56:11 +0200 Subject: [PATCH] new: improved styling options of boxplots (options to style many more elements of the plot), moved JKQTPGraphBoxplotStyleMixin to its own file new: notched boxplots new: example for styling boxplots --- JKQtPlotterBuildAllExamples.pro | 3 +- doc/dox/examples_and_tutorials.dox | 6 + doc/dox/jkqtplotter.dox | 4 +- doc/dox/whatsnew.dox | 2 + doc/images/boxplots.png | Bin 6482 -> 15848 bytes doc/images/plot_boxplothorizontalelement.png | Bin 0 -> 15848 bytes doc/images/plot_boxplotverticalelement.png | Bin 0 -> 25559 bytes examples/README.md | 4 +- ..._simpletest_advancedlineandfillstyling.cpp | 2 +- examples/simpletest_boxplot/README.md | 28 +- .../jkqtplotter_simpletest_boxplot.cpp | 16 +- examples/test_distributionplot/README.md | 12 +- .../test_distributionplot.cpp | 18 +- examples/test_styledboxplot/README.md | 119 +++ .../test_styledboxplot/test_styledboxplot.cpp | 214 +++++ .../test_styledboxplot/test_styledboxplot.pro | 25 + .../test_styledboxplot_and_lib.pro | 8 + lib/jkqtplotter.pri | 2 + lib/jkqtplotter/jkqtpdatastorage.cpp | 11 +- lib/jkqtplotter/jkqtpdatastorage.h | 29 +- lib/jkqtplotter/jkqtpgraphsbase.cpp | 18 +- lib/jkqtplotter/jkqtpgraphsbase.h | 2 +- .../jkqtpgraphsbasestylingmixins.h | 4 + lib/jkqtplotter/jkqtpgraphsboxplot.cpp | 720 ++++------------ lib/jkqtplotter/jkqtpgraphsboxplot.h | 256 ++---- .../jkqtpgraphsboxplotstylingmixins.cpp | 785 ++++++++++++++++++ .../jkqtpgraphsboxplotstylingmixins.h | 440 ++++++++++ lib/jkqtplottertools/jkqtptools.h | 120 +-- .../jkqtplotter_simpletest_boxplot.png | Bin 35306 -> 30900 bytes .../jkqtplotter_simpletest_boxplot_small.png | Bin 12415 -> 11865 bytes screenshots/plot_boxplothorizontalelement.png | Bin 4496 -> 0 bytes screenshots/plot_boxplotverticalelement.png | Bin 3762 -> 0 bytes screenshots/test_distributionplot.png | Bin 69687 -> 57840 bytes screenshots/test_distributionplot_small.png | Bin 14221 -> 12838 bytes screenshots/test_styledboxplot.png | Bin 0 -> 13699 bytes screenshots/test_styledboxplot_small.png | Bin 0 -> 9315 bytes 36 files changed, 1979 insertions(+), 869 deletions(-) create mode 100644 doc/images/plot_boxplothorizontalelement.png create mode 100644 doc/images/plot_boxplotverticalelement.png create mode 100644 examples/test_styledboxplot/README.md create mode 100644 examples/test_styledboxplot/test_styledboxplot.cpp create mode 100644 examples/test_styledboxplot/test_styledboxplot.pro create mode 100644 examples/test_styledboxplot/test_styledboxplot_and_lib.pro create mode 100644 lib/jkqtplotter/jkqtpgraphsboxplotstylingmixins.cpp create mode 100644 lib/jkqtplotter/jkqtpgraphsboxplotstylingmixins.h delete mode 100644 screenshots/plot_boxplothorizontalelement.png delete mode 100644 screenshots/plot_boxplotverticalelement.png create mode 100644 screenshots/test_styledboxplot.png create mode 100644 screenshots/test_styledboxplot_small.png diff --git a/JKQtPlotterBuildAllExamples.pro b/JKQtPlotterBuildAllExamples.pro index 9a120f9125..e19977d62a 100644 --- a/JKQtPlotterBuildAllExamples.pro +++ b/JKQtPlotterBuildAllExamples.pro @@ -98,5 +98,6 @@ defineTest(addTest) { addTest(multiplot) addTest(user_interaction) addTest(styling) -#addTest(distributionplot) +addTest(styledboxplot) +addTest(distributionplot) diff --git a/doc/dox/examples_and_tutorials.dox b/doc/dox/examples_and_tutorials.dox index 6b33131543..914e18011f 100644 --- a/doc/dox/examples_and_tutorials.dox +++ b/doc/dox/examples_and_tutorials.dox @@ -78,6 +78,12 @@ All test-projects are Qt-projects that use qmake to build. You can load them int \image html jkqtplotter_simpletest_advancedlineandfillstyling_small.png \subpage JKQTPlotterAdvancedLineAndFillStyling `JKQTPXYLineGraph`, `JKQTPSpecialLineHorizontalGraph` and `JKQTPBarVerticalGraph`
C++ vector of data
advanced line styling and filling + \image html test_styledboxplot_small.png + \subpage JKQTPlotterBoxplotStyling + Modifying different Aspects of the Styling of boxplots + \image html test_styling_small.png + \subpage JKQTPlotterStyling + Modifying different Aspects of the Styling of JKQTPlotter diff --git a/doc/dox/jkqtplotter.dox b/doc/dox/jkqtplotter.dox index fc099f97ea..2208b73bdf 100644 --- a/doc/dox/jkqtplotter.dox +++ b/doc/dox/jkqtplotter.dox @@ -8,7 +8,7 @@ C++ standard library. \defgroup jkqtpplotterclasses_tools Support Classes/Structs/Functions for JKQTPlotter&JKQTBasePlotter \ingroup jkqtptools -\defgroup tools_math Tools for Mathematical Computations & Equation Parsing +\defgroup jkqtptools_math Tools for Mathematical Computations & Equation Parsing \ingroup jkqtptools \defgroup jkqtptools_string String Tool Functions @@ -20,7 +20,7 @@ C++ standard library. \defgroup jkqtptools_qtwidgets Additional Widgets for Qt \ingroup jkqtptools -\defgroup jkqtptools_drawing Drawing Tools +\defgroup jkqtptools_drawing Drawing & Graphics Tools \ingroup jkqtptools \defgroup jkqtptools_debugging Debugging Tools diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index 7f2538c2cc..716266543f 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -41,6 +41,8 @@ Changes, compared to \ref WHATSNEW_V2018_08 "v2018.08" include:
  • new: JKQTPXYParametrizedScatterGraph: added functors to transform column values into symbol type+size and line-width to give even more control
  • new: user-interaction tool that shows coordinates of data points near the current mouse position (when mouse is dragged, while mouse button is pressed) \see jkqtpmdaToolTipForClosestDataPoint
  • new: user-interaction tool that measures distances and angles when mouse is dragged, while mouse button is pressed) \see jkqtpmdaRuler
  • +
  • new: advanced styling options for boxplots + example for the styling: \ref JKQTPlotterBoxplotStyling
  • +
  • new: notched boxplots
  • changed: removed old selection-code and replaced by general highlighting feature
  • changed: JKQTPStepHorizontalGraph has been renamed to JKQTPSpecialLineHorizontalGraph (vertical variants also) and have gained additional features (baseline for filling and drawing of symbols)
  • changed: filled curve graphs (e.g. JKQTPSpecialLineHorizontalGraph) are now merely a specializedly initialized JKQTPSpecialLineHorizontalGraph
  • diff --git a/doc/images/boxplots.png b/doc/images/boxplots.png index f30d44672025f51eb6687fd74f3c3cb827ce7e28..6a1b1bf5dda3059f3e2c8678a44c6be74527b014 100644 GIT binary patch literal 15848 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�T$8CY;>bf45U#rtm~{7;^mWv2PeIWZ%HKQoHs>oN9XTg znz&}&%D>cmzv*r$IL(<&(@NuLS z0?STMCP~)#4oPI^8o_kef3))~ONd-G(B}bQ{)0l=N_1~+NA1W?OTOSipU!JlSsk0@ zDoS24b~v_w45~hAXj0^2!s~RC5v1sd!eVGNbelVfH2k#QVO!O!d!u-;v3f9*j|tW+ zr^c9DS-X}vFSO?@XV15`fg=6^t2I>+9w0sW(c*=Fkd+4kt-jh&=bEgM-27E0QAPI7 zyK33dAULwS3J_Sv_3UdFgb$lPR6TKCRH!*pad;9t7Dud4_dxK6i9J|QSGnbDuwfzjtQ;+ei{CESM)e)0v@--S z3d9OU)BGLZI)dZ1j&>$j9u5R!Sxc#3g~A^{0{Y{yP2D`U%Z`PPd}#*fOd;V$(x3IV z;&*$Y#&lpw!{sk7Or}q=>~);;>6^{(e*tHjnJu;T=;|aQ{+LXoBOkjitzxGAB821e?I|ewAAP2xBubfiZ#_9CFq=SNpXnzSs8%4`LRz zbx4s;E1gcKPK&FNj^UhmN|JyNu|B7(2;xTn9mfh9aKb`Wr+kst2RkWI87>I&U`AW! zBy^Q^XD~ELDqAw6`yS>!>M<=Uc_)UOwgNN0g_JU1+Sa?Ji}P=fwzyU9m+TJa`f7%Y zxWAJGo7+&&l)jMyk|=F-Jn$nu8Chz);mOV<-Id>3=ltdFX<28It#W5A%4`4N%e_&$ zl(QSIRF;CRAW-&3*pVtVPKq7a(5-?>Lh2|rWPAwdFA zfq?x}Gh3QA-YAy9r`d|T4?{F@QoxHKwtOIyvu@@d;nRQ8OYWi11ZKKG*plx|#H6%D zczM&JPWA5rqj(D`hyl({xvH8Oedql2g*Htm!KIJ$r*5Ezf4{v_=|5Ob^|@f~Ulq%HcXlx@+Ap@* z)wTH}qm8>Ac1bq#Qev6M_1UlI`8QTw%2~HsNr3ChgCe4>2I~dXX$q(e z5qUU7v3uBA^1iYFRf((WX&Xri0JrDQ<5J^!8aC?B$qEVpZ)e?of~Rw!9sWsa-?eG+ zyr&sD#pQK6o%)mZ@am*GbzxzHT%y~0p5mKzlIe+6KixH^t~)-J#mm~3ID*;Rvb^77H~8m3*o0g-b*^$pEXLHN47P?P3H`d9 zcNz4Eu7<@vMVS5aelZ|cyN#)I*PZ32k*1x2?Ko;d zBjHr3xOYXwuM1Y$4EF_S*HTUnNZ0c01N;~xYT;wpm@akD2tZ>y9Crh>^KkO;U=|BB zl;s3tho{wIW{TrymHfB2ds5){-A^Y`C05@8!6aEJsRwnvPk%s7$%__y;&$w~6RDDg zSQ@kLnoQ`pe-BL`DxLxk8&EFm2!675WNFt0gx0fr7tyxNIpwCJyA7mN&C@~+r}1bY zL|)iblS_W#8)Ff47P0yr<5yvotaZ0Z~?X9R-S?-ZZ`i$rQ%pH>5_$2PDJ>KRpjrs4(*6JD>8m(te zUilSOPVZJoTVB`AW+m96fU*;=M4&DzZK?PG58O`y48tcnkRV^xR1eT&OXU zyZ&s86rmIvOf2g*$+71z6MRr6ZIHyO2)?WL)YZ3w9Tw7hJ~P9!+%7rJTeuUXXLZg+ zrhsHq9w(kvq+C)|IARK6WaQx<^su(>;59Y)QyYE8hyXosLjKS?%TO|W_CgGYx;bmn zdsbJP-Jj;QbAAg~Xq5gcu>v*r!N-ZScI4k?I2y`1wZ=n`H&e@|H+FY~QY$u;9KE&n zS{OL0UHgp9#P%+6`@eeLR5l6*(3{;eZMaw)J1DMrwp0%2x!C@y;-aqG4at*AfCkBK zOfMC>I#gOp5Z+{19d;aZ{LI#DrZ@&`beu#7civZ>26EhBti-_{;qa2cnXR)8lT2du)A*e;I?M(=xD0`E*0?LR$Ro zwuG>!!Ol?bSP%mO4_-6idMr<}#)*?ZH(KmuSZ>SLHK{Ru%k#c{nTUde-I^O4-;WiY zR#``1LDca45V=u+Fk8-(HYD~WtVAeNDR2D~)cBkEq}R>UJ*^#EiAd}ME^DDC6&+Dc z;t^IJfH%dy(`*&Zk>HoBI4fO}(i)?*+L_?8Z#_pXGtd5`-r|v^o#%iEJdn80)*+)j z(9qRZI_ARLJlkqlMAj&A{@h=xqQuA}$zk_SJIcGXa=by$|7&60&_^t>SR(Im1=20} ziPl!F+{W%YHhIFDD={_8Z3owkqViZot1MnYcc12g;m$_g^9PGm_qR4Zu4YYFQOf^clH`s*%S45knhvENIksbw z&`bJAKEI&CNhb229}u>miN;Z_5Ypf!<><9?*`I${KeDIvR1w6zVh|w-9;nnYa zNcU%oho=2`-mAj-dsjT5+^i5nDMZr*Ww^H`fu9M$Hz@&%Omn1e`PA7Shee-5uPPY&F4;=R&RmdE1l8EGHlG?CKM)-? zhI~-(%$7#^(vMv4CJCRuS622gNQLicH+w7M(&0!(&+CHy_~u)+bc!~* z=N}-#@B)Cn$;pX|wss7-$d#fL3W|Fy;hlIEpHZU>jPmy|&ko-25|$i&EWlxW5q0VR zHvaGMBApB}`r(Y1BtY0eaKV#rE=pbB^f3=6C^fsNqlQ-z2*FTY%hI+MCRvav29C6R zmOIjCp=Yp%tq$UPgNIXDYa*(|LU)e2i;Wu2#Laxlg2y4OID4loLnNp~d;_tVI^WGH zq!uAXA11oGX+pr`Yx`Xt?;9tMQ=zo|z~?u~2%GRQEAJyUrz=x17-|d}_J$zk_MLr9 zOuom!f2a27XUx96kA(eTF0}a?)x-Hq)8X?PC-0MI7V!4dYTwT) z$E2eVDOKz97c%4-)f%~K96p`i>9AW`DoNOPKC`d}TR#x14E8I!BL6#7?~C*5!EcX~ z=i|!4%5>TI_W~w)#vI#MbweF8yD~GZn|Z(aSLqr7XQt@FHwOlL_od+WA>2k+PX9E6 z^P*oL-y!sZ#(?^hOJZ)}GPrL^I=IE4c5?Ivl#G)Mx#0MIM8%j@j0B@G;SR>m$?}N^ z1tSExQ1gt)BXvovWz`-91rt6`1{&-Omqexi7-C=|tLLl1H;D|tr=s{ERrM#*&YleX z6iH5#G#8>ShF}6~hA9C5PPRp`-7Jmv!`&2J6G$H&!;zmKQRAUHqC=xfYPqzJF7!U` z5)R!9E0z00fyDO|&YXPkrdIAKD~sr$uu{{T@Gp%mAru>+jNJ#J@d;47M7~u2O7ZuJ3@^o**w|c;*Xtl7Eqbe&vIx!M>@PpyG%H#2D zf^d8|o->gbKF*IF!Y}==H~&yr?Z3`+FL5-CVioj;*I=dl>YUz5{OegK)?kr4py3H5 z{q0&xZg6Tq^tkR!PBm8=%ZIPAye4&4LNd~~c{{hrg;jpvc-EN9a*i22Ym6e5ziAlh8GV%)Kv z*O+Lpd!1^y^qm!$)8vtu^}m`g6<`mB zr2g!@Z_I>izl-GPE|f^8ak4GGKHm64@p^lPJuz%U5M7`d3bvYSq8F=lQze#vApsaK zn^9txvmCyn$&Ffn`M?cK5@!njdAq*fS9mhnZdtrXB*nV*zqe~Z0 zhA=FXwa$JSr~YA;dR`t98bS9XJL!-7CMR1}*+IEnwu1bMg|R6<-rTr+?P6rP}>`3v`g<5c6aod2X0v{PdCMKMS9t^Kia7riUv zK+@7;f}>)2rTW8%|41c16uetZ5KV&t<{VL2q9oSzL{;=8--m#H8${o4dVCCWA|vxd zM3Lr-$ZE-BWtsJyI-fx^X)qbOkVzz;c}0VK2p)t%ffWAu7eTnB3~H?}pkdX|S~?3a z>rkTZ`=$RB&J0BZuk_-S*17d&)ZIdQ`uJ`M(CHmFq%@L9Ht*Bi++xEVsnM5t&;WrH z*6O2GVxvq&RGVOCxt!b84avVUlt!o)DNy9Yu&mxZaU~Q`-U)pG+e|Bv6*g0Pnu6F1 zekzM2?fc#zM?2&xrJ61we)>R&x59w^W0v*+-FaS;7cUme_@DQ{u6|X5XIYA#)D>hP<$@xnX`Kt#1O}(oPvMu-`=NoR7z7QoV&mdr^WnP} z?+fdSm9SPPog{?}|DRPsKXZH*8%AF2mod?b0MyXXI29m5TI$K=;m z^c(0?Gimo_1%Pvw4V+OxLRozqCj`KTT(1$9rPh;e?a2x!xcXd@OvFGYCQHU#tw9xZ zkj|f@7Yo9r2O+;zY@H~E*JW_xg($}ir{lNaOqfZr`mx}lTPoZen}cDKUr(G9!hz9b zJP)W-9)sz!-M>9cm49k6(%ec1h>{IRWB{WV`Jz5BDIy>S+{AFY@4_0$iTU%N(ZAms zs`0-MpP~W~5@hWpfxJ9x1;pDNQ9!86BwWc^Z@;nT5WqF6V?;m^*wzF>#A%2Mo&&~M zBEP40*wVh~et&&+b<}N2z+X1h4up<`hs-7}IIQmP96B=-kqDq757{1?gJ8DdH1k81*o;0y@m z)C|QEpx$!luDz~G^xj_5;`8FfD?8Jvph8D|R^iKnG+&n1)7-AHh`tQ5W0;uUqHW@4 zcX{p$u*UC&VkIQSmg#{za@O>UB{Tw~3$;j*MXqv z-}GPl|2@4F2OF#i-M68+TM968@z9fOk|EL4KZ|w(_;>G0{ZZyoh8+dg9kp_Y{{F*X zLzO|IK$#SB4>13ho8jNNqbH1YR-yUfum1seP*)iMYXaa%!!%-|^d7DRo@I?{y$rvE zGfj=*rdr2RxfaIK;Anv34MOIahh%u^0Vh6i{Sr7rKAMbad&|9f2NS&?V10%8Vd#gea=YP4E6V> zY+eF_o%P=pPx%ZI_1C}1349QY{~3jHL}|y7il=n{z0*4Y3^9PU{^$NKAl5~^M}Cw+ zS+O)T^6&wgAHX?@b^tGb`S0cb$2C*#|DWF_D#B>{Z|@cgx7RrqLGyu&*jRE>%E%JL H8~^_YfiD5l literal 6482 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 diff --git a/doc/images/plot_boxplothorizontalelement.png b/doc/images/plot_boxplothorizontalelement.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1b1bf5dda3059f3e2c8678a44c6be74527b014 GIT binary patch literal 15848 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�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 H8~^_YfiD5l literal 0 HcmV?d00001 diff --git a/doc/images/plot_boxplotverticalelement.png b/doc/images/plot_boxplotverticalelement.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5aa19d74f68e16606691d13a143a33d5d0eaa2 GIT binary patch literal 25559 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 C++ vector of data
    logarithmic axes and styling
    plot line styles
    internal LaTeX parser
    add commenting text to a graph | | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes_small.png)
    ![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes_dates_small.png)
    ![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes_timeaxis_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_dateaxes) | [date/time axes](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_dateaxes) | `JKQTPXYLineGraph` and `JKQTPFilledVerticalRangeGraph`
    C++ vector of data
    date/time axes
    plot min/max range graph
    internal LaTeX parser
    data from CSV files | -| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_advancedlineandfillstyling_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_advancedlineandfillstyling) | [logarithmic axes](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_advancedlineandfillstyling) | `JKQTPXYLineGraph`, `JKQTPSpecialLineHorizontalGraph` and `JKQTPBarVerticalGraph`
    C++ vector of data
    advanced line styling and filling | +| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_advancedlineandfillstyling_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_advancedlineandfillstyling) | [advanced line and fill styling](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_advancedlineandfillstyling) | `JKQTPXYLineGraph`, `JKQTPSpecialLineHorizontalGraph` and `JKQTPBarVerticalGraph`
    C++ vector of data
    advanced line styling and filling | +| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/test_styledboxplot_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_styledboxplot) | [Styling of Boxplots](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_styledboxplot) | Modifying different Aspects of the Styling of boxplots | +| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/test_styling_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_styling) | [Styling of JKQTPlotter](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_styling) | Modifying different Aspects of the Styling of JKQTPlotter | ## Image data Plots diff --git a/examples/simpletest_advancedlineandfillstyling/jkqtplotter_simpletest_advancedlineandfillstyling.cpp b/examples/simpletest_advancedlineandfillstyling/jkqtplotter_simpletest_advancedlineandfillstyling.cpp index 253d8cfbc1..fae179fbfc 100644 --- a/examples/simpletest_advancedlineandfillstyling/jkqtplotter_simpletest_advancedlineandfillstyling.cpp +++ b/examples/simpletest_advancedlineandfillstyling/jkqtplotter_simpletest_advancedlineandfillstyling.cpp @@ -109,8 +109,8 @@ int main(int argc, char* argv[]) linearGrad.setColorAt(0.3, c2); linearGrad.setColorAt(0.7, c3); linearGrad.setColorAt(1, c4); - linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode); // use this CoordinateMode, so the gradient fills the whole graph area + linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode); graphF2->setFillGradient(linearGrad); // 5.4 fill barcharts with transparencies and make the surrounding line invisible (colored transparent) diff --git a/examples/simpletest_boxplot/README.md b/examples/simpletest_boxplot/README.md index ba3abee868..1f49cd5ed6 100644 --- a/examples/simpletest_boxplot/README.md +++ b/examples/simpletest_boxplot/README.md @@ -45,18 +45,22 @@ After adding all necessary data to the JKQTDatastore: You can further style the plot by e.g. setting: ```.cpp - // 4.1 make fill collor a lighter shade of the outline color - graph->setFillColor(graphh->getColor().lighter()); - // 4.2 make whiskers dashed - graph->setWhiskerLineStyle(Qt::DashLine); - graph->setWhiskerLineColor(graph->getLineColor().darker()); - // 4.3 change mean symbol - graph->setSymbolType(JKQTPFilledStar); - graph->setSymbolFillColor(QColor("silver")); - // 4.4 change median line color - graph->setMedianLineColor(QColor("darkgreen")); - // 4.5 change box width to 75% of distance - graph->setBoxWidth(0.75); + // 6.1 make fill collor a lighter shade of the outline color + graphh->setFillColor(graphh->getLineColor().lighter()); + // 6.2 make whiskers dashed + graphh->setWhiskerLineStyle(Qt::DashLine); + graphh->setWhiskerLineColor(graphh->getLineColor().darker()); + // 6.3 make whiskers caps solid and thick + graphh->setWhiskerCapLineStyle(Qt::SolidLine); + graphh->setWhiskerCapLineColor(graphh->getLineColor().darker()); + graphh->setWhiskerCapLineWidth(graphh->getLineWidth()*2.5); + // 6.4 change mean symbol + graphh->setMeanSymbolType(JKQTPFilledStar); + graphh->setMeanFillColor(QColor("silver")); + // 6.5 change median line color + graphh->setMedianLineColor(QColor("darkgreen")); + // 6.6 change box width to 75% of distance + graphh->setBoxWidthRelative(0.75); ``` The result looks like this: diff --git a/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp b/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp index 7097c20e84..9e13ed2aa0 100644 --- a/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp +++ b/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp @@ -85,13 +85,17 @@ int main(int argc, char* argv[]) // 6.2 make whiskers dashed graphh->setWhiskerLineStyle(Qt::DashLine); graphh->setWhiskerLineColor(graphh->getLineColor().darker()); - // 6.3 change mean symbol - graphh->setSymbolType(JKQTPFilledStar); - graphh->setSymbolFillColor(QColor("silver")); - // 6.4 change median line color + // 6.3 make whiskers caps solid and thick + graphh->setWhiskerCapLineStyle(Qt::SolidLine); + graphh->setWhiskerCapLineColor(graphh->getLineColor().darker()); + graphh->setWhiskerCapLineWidth(graphh->getLineWidth()*2.5); + // 6.4 change mean symbol + graphh->setMeanSymbolType(JKQTPFilledStar); + graphh->setMeanFillColor(QColor("silver")); + // 6.5 change median line color graphh->setMedianLineColor(QColor("darkgreen")); - // 6.5 change box width to 75% of distance - graphh->setBoxWidth(0.75); + // 6.6 change box width to 75% of distance + graphh->setBoxWidthRelative(0.75); // 7. add the graphs to the plot, so it is actually displayed plot.addGraph(graph); diff --git a/examples/test_distributionplot/README.md b/examples/test_distributionplot/README.md index e375cd496a..ffaca77491 100644 --- a/examples/test_distributionplot/README.md +++ b/examples/test_distributionplot/README.md @@ -47,6 +47,7 @@ After adding all necessary data to the JKQTDatastore: const double rndMedian=RANDVAL[RANDVAL.size()/2]; const double rndQ25=RANDVAL[RANDVAL.size()/4]; const double rndQ75=RANDVAL[RANDVAL.size()*3/4]; + const double rndMedianConfidence=2.0*1.57*fabs(rndQ75-rndQ25)/sqrt(static_cast(NDATA)); // 3. make data available to JKQTPlotter by adding it to the internal datastore. size_t columnRANDVAL=ds->addCopiedColumn(RANDVAL, "RANDVAL"); // copy random values @@ -99,15 +100,16 @@ After adding all necessary data to the JKQTDatastore: graphBoxPlot->setPercentile25(rndQ25); graphBoxPlot->setMean(rndMean); graphBoxPlot->setMedian(rndMedian); + graphBoxPlot->setMedianConfidenceIntervalWidth(rndMedianConfidence); graphBoxPlot->setPercentile75(rndQ75); graphBoxPlot->setMax(rndMax); - graphBoxPlot->setBoxWidth(24); - graphBoxPlot->setSymbolTypeSize(16); - graphBoxPlot->setSymbolTypeWidth(2); + graphBoxPlot->setBoxWidthAbsolute(24); + graphBoxPlot->setMeanSize(16); + graphBoxPlot->setLineWidth(2); graphBoxPlot->setTitle("Statistical Properties"); - graphBoxPlot->setColor(QColor("blue")); + graphBoxPlot->setBoxplotColor(QColor("blue"), plot.getPlotter()); // make fill collor a lighter shade of the outline color - graphBoxPlot->setFillColor(graphBoxPlot->getColor().lighter(180)); + graphBoxPlot->setFillColor(graphBoxPlot->getLineColor().lighter(180)); // make whiskers dashed graphBoxPlot->setWhiskerLineStyle(Qt::DashLine); diff --git a/examples/test_distributionplot/test_distributionplot.cpp b/examples/test_distributionplot/test_distributionplot.cpp index 8e1c4c6654..0888ebcd89 100644 --- a/examples/test_distributionplot/test_distributionplot.cpp +++ b/examples/test_distributionplot/test_distributionplot.cpp @@ -61,6 +61,7 @@ int main(int argc, char* argv[]) const double rndMedian=RANDVAL[RANDVAL.size()/2]; const double rndQ25=RANDVAL[RANDVAL.size()/4]; const double rndQ75=RANDVAL[RANDVAL.size()*3/4]; + const double rndMedianConfidence=2.0*1.57*fabs(rndQ75-rndQ25)/sqrt(static_cast(NDATA)); // 3. make data available to JKQTPlotter by adding it to the internal datastore. size_t columnRANDVAL=ds->addCopiedColumn(RANDVAL, "RANDVAL"); // copy random values @@ -112,15 +113,20 @@ int main(int argc, char* argv[]) graphBoxPlot->setPercentile25(rndQ25); graphBoxPlot->setMean(rndMean); graphBoxPlot->setMedian(rndMedian); + graphBoxPlot->setMedianConfidenceIntervalWidth(rndMedianConfidence); graphBoxPlot->setPercentile75(rndQ75); graphBoxPlot->setMax(rndMax); - graphBoxPlot->setBoxWidth(24); - graphBoxPlot->setSymbolTypeSize(16); - graphBoxPlot->setSymbolTypeWidth(2); + graphBoxPlot->setBoxWidthAbsolute(24); + graphBoxPlot->setMeanSize(12); + graphBoxPlot->setMeanSymbolType(JKQTPCross); + graphBoxPlot->setLineWidth(2); graphBoxPlot->setTitle("Statistical Properties"); - graphBoxPlot->setColor(QColor("blue")); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("blue"), plot.getPlotter()); + // change color of mean symbol + graphBoxPlot->setMeanColor(QColor("red")); // make fill collor a lighter shade of the outline color - graphBoxPlot->setFillColor(graphBoxPlot->getColor().lighter(180)); + graphBoxPlot->setFillColor(graphBoxPlot->getLineColor().lighter(180)); // make whiskers dashed graphBoxPlot->setWhiskerLineStyle(Qt::DashLine); @@ -140,7 +146,7 @@ int main(int argc, char* argv[]) // 11. show plotter and make it a decent size plot.show(); - plot.resize(800,800); + plot.resize(800,650); return app.exec(); } diff --git a/examples/test_styledboxplot/README.md b/examples/test_styledboxplot/README.md new file mode 100644 index 0000000000..6b967df6fe --- /dev/null +++ b/examples/test_styledboxplot/README.md @@ -0,0 +1,119 @@ +# Example (JKQTPlotter): Styling different aspects of boxplots {#JKQTPlotterBoxplotStyling} +This project (see [`test_styledboxplot`](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_styledboxplot) demonstrates how to style different aspects of boxplots and how to draw different types and styles of boxplots. For a simple introduction into how to use boxplots, see [Plotting Box Plots](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_boxplot) and [Plotting a Statistical Distribution of Data](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/test_distributionplot). + +The link http://vita.had.co.nz/papers/boxplots.pdf leads to a paper that described the history and different types of boxplots. + +The source code of the main application can be found in [`test_styledboxplot.cpp`](test_styledboxplot.cpp). +The major parts that are concerned with the styling are: + +```.cpp + // 2. create a basic boxplot + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{\\begin{matrix}basic boxplot\\\\\"Turkey's style\"\\end{matrix}}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + + // ... + // ... + + // 3. create a basic boxplot with mean as symbol + // ... + // set mean value to show mean symbol + graphBoxPlot->setMean(y0+3.5); + graphBoxPlot->setDrawMean(true); + graphBoxPlot->setMeanMode(JKQTPGraphBoxplotStyleMixin::MeanAsSymbol); + graphBoxPlot->setMeanColor(QColor("darkgreen")); + graphBoxPlot->setMeanSymbolType(JKQTPFilledTriangle); + + // ... + // ... + + // 4. create a basic boxplot with mean as line + // ... + // set mean value to show mean symbol + graphBoxPlot->setMean(y0+3.5); + graphBoxPlot->setDrawMean(true); + graphBoxPlot->setMeanMode(JKQTPGraphBoxplotStyleMixin::MeanAsLine); + graphBoxPlot->setMeanColor(QColor("darkgreen")); + graphBoxPlot->setMeanLineStyle(Qt::DashLine); + graphBoxPlot->setMeanLineWidth(2); + + // ... + // ... + + // 5. create a notched boxplot + // ... + // for a notched plot, you need to set the confidence interval + graphBoxPlot->setMedianConfidenceIntervalWidth(1); + graphBoxPlot->setDrawNotch(true); + graphBoxPlot->setRelativeNotchIndent(y0+0.5); + + // ... + // ... + + // 6. create a notched boxplot + // ... + // restyle as Tufte's box-less + graphBoxPlot->setDrawBox(false); + + // ... + // ... + + // 7. style box + // ... + // style box line&fill + graphBoxPlot->setLineColor(QColor("red")); + graphBoxPlot->setLineStyle(Qt::DotLine); + graphBoxPlot->setLineWidth(1); + graphBoxPlot->setFillColor(QColor("yellow")); + + // ... + // ... + + // 8. fancy style box + // ... + // style box fill + QLinearGradient linearGrad(QPointF(0, 0), QPointF(1, 1)); + QColor c1(Qt::red); + QColor c2(Qt::yellow); + QColor c3(Qt::blue); + linearGrad.setColorAt(0, c1); + linearGrad.setColorAt(0.3, c2); + linearGrad.setColorAt(1, c3); + // use this CoordinateMode, so the gradient fills the whole graph area + linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode); + graphBoxPlot->setFillGradient(linearGrad); + + // ... + // ... + + // 9. style median + // ... + // style box line + graphBoxPlot->setMedianLineColor(QColor("red")); + graphBoxPlot->setMedianLineWidth(3); + + // ... + // ... + + // 10. style whiskers&caps + // ... + // style box line + graphBoxPlot->setWhiskerLineColor(QColor("red")); + graphBoxPlot->setWhiskerLineStyle(Qt::DotLine); + graphBoxPlot->setWhiskerLineWidth(1); + graphBoxPlot->setWhiskerCapLineColor(QColor("blue")); + graphBoxPlot->setWhiskerCapLineStyle(Qt::SolidLine); + graphBoxPlot->setWhiskerCapLineWidth(4); + graphBoxPlot->setRelativeWhiskerWidth(0.9); +``` + +The result looks like this: + +![test_styledboxplot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/test_styledboxplot.png) diff --git a/examples/test_styledboxplot/test_styledboxplot.cpp b/examples/test_styledboxplot/test_styledboxplot.cpp new file mode 100644 index 0000000000..1f2550faf6 --- /dev/null +++ b/examples/test_styledboxplot/test_styledboxplot.cpp @@ -0,0 +1,214 @@ +/** \example test_styledboxplot.cpp + * Shows how to style different aspects of boxplots. + * + * \ref JKQTPlotterBoxplotStyling + */ + +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpgraphsboxplot.h" +#include "jkqtplotter/jkqtpgraphsgeometric.h" + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + // 1. create a plotter window and get a pointer to the internal datastore (for convenience) + JKQTPlotter plot; + plot.getPlotter()->setUseAntiAliasingForGraphs(true); // nicer (but slower) plotting + plot.getPlotter()->setUseAntiAliasingForSystem(true); // nicer (but slower) plotting + plot.getPlotter()->setUseAntiAliasingForText(true); // nicer (but slower) text rendering + + + JKQTPBoxplotVerticalElement* graphBoxPlot; + double x=1; + double dx=1; + double y0=11; + + // 2. create a basic boxplot + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{\\begin{matrix}basic boxplot\\\\\"Turkey's style\"\\end{matrix}}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + x+=dx; + + // 3. create a basic boxplot with mean as symbol + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{\\begin{matrix}basic boxplot\\\\ + mean symbol\\end{matrix}}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // set mean value to show mean symbol + graphBoxPlot->setMean(y0+3.5); + graphBoxPlot->setDrawMean(true); + graphBoxPlot->setMeanMode(JKQTPGraphBoxplotStyleMixin::MeanAsSymbol); + graphBoxPlot->setMeanColor(QColor("darkgreen")); + graphBoxPlot->setMeanSymbolType(JKQTPFilledTriangle); + x+=dx; + + // 4. create a basic boxplot with mean as line + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{\\begin{matrix}basic boxplot\\\\ + mean line\\end{matrix}}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // set mean value to show mean symbol + graphBoxPlot->setMean(y0+3.5); + graphBoxPlot->setDrawMean(true); + graphBoxPlot->setMeanMode(JKQTPGraphBoxplotStyleMixin::MeanAsLine); + graphBoxPlot->setMeanColor(QColor("darkgreen")); + graphBoxPlot->setMeanLineStyle(Qt::DashLine); + graphBoxPlot->setMeanLineWidth(2); + x+=dx; + + // 5. create a notched boxplot + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{notched boxplot}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"), QColor("white"), plot.getPlotter()); + // for a notched plot, you need to set the confidence interval + graphBoxPlot->setMedianConfidenceIntervalWidth(1); + graphBoxPlot->setDrawNotch(true); + graphBoxPlot->setRelativeNotchIndent(0.5); + x+=dx; + + + // 6. create a notched boxplot + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{\\begin{matrix}basic boxplot\\\\\"Tufte's style\"\\end{matrix}}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"), QColor("white"), plot.getPlotter()); + // restyle as Tufte's box-less + graphBoxPlot->setDrawBox(false); + x+=dx; + + + + x=1; + y0=0; + + // 7. style box + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{styled box}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // style box line&fill + graphBoxPlot->setLineColor(QColor("red")); + graphBoxPlot->setLineStyle(Qt::DotLine); + graphBoxPlot->setLineWidth(1); + graphBoxPlot->setFillColor(QColor("yellow")); + x+=dx; + + // 8. fancy style box + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{styled box}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // style box fill + QLinearGradient linearGrad(QPointF(0, 0), QPointF(1, 1)); + QColor c1(Qt::red); + QColor c2(Qt::yellow); + QColor c3(Qt::blue); + linearGrad.setColorAt(0, c1); + linearGrad.setColorAt(0.3, c2); + linearGrad.setColorAt(1, c3); + // use this CoordinateMode, so the gradient fills the whole graph area + linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode); + graphBoxPlot->setFillGradient(linearGrad); + x+=dx; + + // 9. style median + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{styled median}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // style box line + graphBoxPlot->setMedianLineColor(QColor("red")); + graphBoxPlot->setMedianLineWidth(3); + x+=dx; + + + // 10. style whiskers&caps + plot.addGraph(graphBoxPlot=new JKQTPBoxplotVerticalElement(&plot)); + plot.addGraph(new JKQTPGeoText(&plot, x-dx/2.0, y0+9, "\\textbf{styled whiskers}", 8, QColor("black"))); + graphBoxPlot->setPos(x); + graphBoxPlot->setMin(y0+1); + graphBoxPlot->setPercentile25(y0+2.5); + graphBoxPlot->setMedian(y0+4); + graphBoxPlot->setPercentile75(y0+5.5); + graphBoxPlot->setMax(y0+8); + // set color of all elements + graphBoxPlot->setBoxplotColor(QColor("black"),QColor("white"), plot.getPlotter()); + // style box line + graphBoxPlot->setWhiskerLineColor(QColor("red")); + graphBoxPlot->setWhiskerLineStyle(Qt::DotLine); + graphBoxPlot->setWhiskerLineWidth(1); + graphBoxPlot->setWhiskerCapLineColor(QColor("blue")); + graphBoxPlot->setWhiskerCapLineStyle(Qt::SolidLine); + graphBoxPlot->setWhiskerCapLineWidth(4); + graphBoxPlot->setRelativeWhiskerWidth(0.9); + x+=dx; + + + + + + // 11. autoscale the plot so the graph is contained + plot.setXY(0.5,5.5,0, 21); + + // 12. style plot + plot.getPlotter()->setShowKey(false); + plot.getPlotter()->setGrid(false); + + // 13. show plotter and make it a decent size + plot.show(); + plot.resize(600,500); + + return app.exec(); +} diff --git a/examples/test_styledboxplot/test_styledboxplot.pro b/examples/test_styledboxplot/test_styledboxplot.pro new file mode 100644 index 0000000000..8708da16f4 --- /dev/null +++ b/examples/test_styledboxplot/test_styledboxplot.pro @@ -0,0 +1,25 @@ +# source code for this simple demo +SOURCES = test_styledboxplot.cpp + +# configure Qt +CONFIG += link_prl qt +QT += core gui xml svg +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +# output executable name +TARGET = test_styledboxplot + +# include JKQTPlotter source code +DEPENDPATH += ../../lib ../../staticlib/jkqtplotterlib +INCLUDEPATH += ../../lib +CONFIG (debug, debug|release) { + LIBS += -L../../staticlib/jkqtplotterlib/debug -ljkqtplotterlib_debug +} else { + LIBS += -L../../staticlib/jkqtplotterlib/release -ljkqtplotterlib +} +message("LIBS = $$LIBS") + + + + + diff --git a/examples/test_styledboxplot/test_styledboxplot_and_lib.pro b/examples/test_styledboxplot/test_styledboxplot_and_lib.pro new file mode 100644 index 0000000000..35564d409b --- /dev/null +++ b/examples/test_styledboxplot/test_styledboxplot_and_lib.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS += jkqtplotterlib test_styledboxplot + +jkqtplotterlib.file = ../../staticlib/jkqtplotterlib/jkqtplotterlib.pro + +test_styledboxplot.file=$$PWD/test_styledboxplot.pro +test_styledboxplot.depends = jkqtplotterlib diff --git a/lib/jkqtplotter.pri b/lib/jkqtplotter.pri index 61a506e409..3a61b2637e 100644 --- a/lib/jkqtplotter.pri +++ b/lib/jkqtplotter.pri @@ -20,6 +20,7 @@ HEADERS += \ $$PWD/jkqtplotter/jkqtpgraphsbaseerrors.h \ $$PWD/jkqtplotter/jkqtpgraphsbasestylingmixins.h \ $$PWD/jkqtplotter/jkqtpgraphsboxplot.h \ + $$PWD/jkqtplotter/jkqtpgraphsboxplotstylingmixins.h \ $$PWD/jkqtplotter/jkqtpgraphsevaluatedfunction.h \ $$PWD/jkqtplotter/jkqtpgraphsfilledcurve.h \ $$PWD/jkqtplotter/jkqtpgraphsgeometric.h \ @@ -65,6 +66,7 @@ SOURCES += \ $$PWD/jkqtplotter/jkqtpgraphsbaseerrors.cpp \ $$PWD/jkqtplotter/jkqtpgraphsbasestylingmixins.cpp \ $$PWD/jkqtplotter/jkqtpgraphsboxplot.cpp \ + $$PWD/jkqtplotter/jkqtpgraphsboxplotstylingmixins.cpp \ $$PWD/jkqtplotter/jkqtpgraphsevaluatedfunction.cpp \ $$PWD/jkqtplotter/jkqtpgraphsfilledcurve.cpp \ $$PWD/jkqtplotter/jkqtpgraphsgeometric.cpp \ diff --git a/lib/jkqtplotter/jkqtpdatastorage.cpp b/lib/jkqtplotter/jkqtpdatastorage.cpp index 3dd932b6f6..6dfcdc3f74 100644 --- a/lib/jkqtplotter/jkqtpdatastorage.cpp +++ b/lib/jkqtplotter/jkqtpdatastorage.cpp @@ -336,7 +336,7 @@ int JKQTPDatastore::getColumnNum(const QString& name) { QMapIterator it(columns); while (it.hasNext()) { it.next(); - if (it.value().getName()==name) return it.key(); + if (it.value().getName()==name) return static_cast(it.key()); } return -1; } @@ -347,21 +347,22 @@ int JKQTPDatastore::ensureColumnNum(const QString& name) { QMapIterator it(columns); while (it.hasNext()) { it.next(); - if (it.value().getName()==name) return it.key(); + if (it.value().getName()==name) return static_cast(it.key()); } - return addColumn(0, name); + return static_cast(addColumn(0, name)); } //////////////////////////////////////////////////////////////////////////////////////////////// JKQTPColumn JKQTPDatastore::getColumn(size_t i) const { - return columns.value(i); + return columns.value(i, JKQTPColumn()); } //////////////////////////////////////////////////////////////////////////////////////////////// JKQTPColumn JKQTPDatastore::getColumn(int i) const { - return columns.value(i); + if (i<0) return JKQTPColumn(); + return getColumn(static_cast(i)); } //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/jkqtplotter/jkqtpdatastorage.h b/lib/jkqtplotter/jkqtpdatastorage.h index ac2fbf6304..0257344c15 100644 --- a/lib/jkqtplotter/jkqtpdatastorage.h +++ b/lib/jkqtplotter/jkqtpdatastorage.h @@ -197,6 +197,10 @@ class JKQTP_LIB_EXPORT JKQTPDatastore{ /** \brief returns the value at position (\c column, \c row). \c column is the logical column and will be mapped to the according memory block internally!) */ inline double get(int column, size_t row) const ; + /** \brief returns the value at position (\c column, \c row). \c column is the logical column and will be mapped to the according memory block internally!) */ + inline double get(int column, int row) const ; + /** \brief returns the value at position (\c column, \c row). \c column is the logical column and will be mapped to the according memory block internally!) */ + inline double get(size_t column, int row) const ; /** \brief gets the index of the datapoint with the nearest, but lower value in the column (in a given inclusive row range [start ... end] values of -1 for the ranges are "wildcards", i.e. start/end of column)*/ int getNextLowerIndex(size_t column, size_t row, int start, int end) const; /** \brief gets the index of the datapoint with the nearest, but lower value in the column */ @@ -876,16 +880,16 @@ inline void JKQTPColumn::incValue(size_t n, double increment){ //////////////////////////////////////////////////////////////////////////////////////////////// inline double JKQTPColumn::getValue(size_t n) const { - if (!datastore) return nan(""); - if (!datastore->getItem(datastoreItem)) return nan(""); + if (!datastore) return JKQTP_NAN; + if (!datastore->getItem(datastoreItem)) return JKQTP_NAN; return datastore->getItem(datastoreItem)->get(datastoreOffset, n); } //////////////////////////////////////////////////////////////////////////////////////////////// inline double JKQTPColumn::getValue(int n) const { - if (!datastore) return nan(""); - if (!datastore->getItem(datastoreItem)) return nan(""); - if (n<0) return nan(""); + if (!datastore) return JKQTP_NAN; + if (!datastore->getItem(datastoreItem)) return JKQTP_NAN; + if (n<0) return JKQTP_NAN; return datastore->getItem(datastoreItem)->get(datastoreOffset, static_cast(n)); } @@ -896,6 +900,21 @@ inline double JKQTPDatastore::get(size_t column, size_t row) const { //////////////////////////////////////////////////////////////////////////////////////////////// inline double JKQTPDatastore::get(int column, size_t row) const { + if (column<0) return JKQTP_NAN; + return get(static_cast(column), static_cast(row)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +inline double JKQTPDatastore::get(int column, int row) const { + if (column<0) return JKQTP_NAN; + if (row<0) return JKQTP_NAN; + return get(static_cast(column), static_cast(row)); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////// +inline double JKQTPDatastore::get(size_t column, int row) const { + if (row<0) return JKQTP_NAN; return get(static_cast(column), static_cast(row)); } diff --git a/lib/jkqtplotter/jkqtpgraphsbase.cpp b/lib/jkqtplotter/jkqtpgraphsbase.cpp index dcddf362ab..d1ec5e95ba 100644 --- a/lib/jkqtplotter/jkqtpgraphsbase.cpp +++ b/lib/jkqtplotter/jkqtpgraphsbase.cpp @@ -197,11 +197,11 @@ QString JKQTPPlotElement::formatHitTestDefaultLabel(double x, double y, int inde double JKQTPPlotElement::hitTest(const QPointF & posSystem, QPointF* closestSpotSystem, QString* label, HitTestMode mode) const { - if (parent==nullptr) return nan(""); + if (parent==nullptr) return JKQTP_NAN; int closest=-1; - double closedist=nan(""); - double closedistsec=nan(""); + double closedist=JKQTP_NAN; + double closedistsec=JKQTP_NAN; QPointF closestPos; QPointF posF=transform(posSystem); for (int i=0; igetDatastore(); int imin=0; int imax=0; - if (!getIndexRange(imin, imax)) return nan(""); + if (!getIndexRange(imin, imax)) return JKQTP_NAN; int closest=-1; - double closedist=nan(""); - double closedistsec=nan(""); + double closedist=JKQTP_NAN; + double closedistsec=JKQTP_NAN; QPointF closestPos; QPointF posF=transform(posSystem); for (int i=imin; iQPainter to draw to \param x x-coordinate of the symbol center \param y y-coordinate of the symbol center @@ -228,6 +229,7 @@ class JKQTP_LIB_EXPORT JKQTPGraphSymbolStyleMixin { void plotStyledSymbol(JKQTBasePlotter* parent, JKQTPEnhancedPainter& painter, double x, double y) const; /*! \brief plot a symbol at location x,y (in painter coordinates), using the current style + \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) \param painter the QPainter to draw to \param x x-coordinate of the symbol center \param y y-coordinate of the symbol center @@ -236,6 +238,7 @@ class JKQTP_LIB_EXPORT JKQTPGraphSymbolStyleMixin { void plotStyledSymbol(JKQTBasePlotter* parent, JKQTPEnhancedPainter& painter, double x, double y, double symbolSize) const; /*! \brief plot a symbol at location x,y (in painter coordinates), using the current style + \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) \param painter the QPainter to draw to \param x x-coordinate of the symbol center \param y y-coordinate of the symbol center @@ -245,6 +248,7 @@ class JKQTP_LIB_EXPORT JKQTPGraphSymbolStyleMixin { void plotStyledSymbol(JKQTBasePlotter* parent, JKQTPEnhancedPainter& painter, double x, double y, JKQTPGraphSymbols type) const; /*! \brief plot a symbol at location x,y (in painter coordinates), using the current style + \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) \param painter the QPainter to draw to \param x x-coordinate of the symbol center \param y y-coordinate of the symbol center diff --git a/lib/jkqtplotter/jkqtpgraphsboxplot.cpp b/lib/jkqtplotter/jkqtpgraphsboxplot.cpp index 36214c3729..e720155900 100644 --- a/lib/jkqtplotter/jkqtpgraphsboxplot.cpp +++ b/lib/jkqtplotter/jkqtpgraphsboxplot.cpp @@ -32,258 +32,12 @@ -JKQTPGraphBoxplotStyleMixin::JKQTPGraphBoxplotStyleMixin() -{ - - boxWidth=0.4; - - m_whiskerLinePen=QPen(getLineColor(), getLineWidth()); - whiskerLineWidth=getLineWidth(); - m_medianLinePen=QPen(getLineColor(), getLineWidth()); - medianLineWidth=getLineWidth(); - -} - - -void JKQTPGraphBoxplotStyleMixin::initBoxplotStyle(JKQTBasePlotter *parent, int &parentPlotStyle) -{ - initFillStyle(parent, parentPlotStyle); - initLineStyle(parent, parentPlotStyle); - initSymbolStyle(parent, parentPlotStyle); - if (parent && parentPlotStyle>=0) { // get style settings from parent object - parentPlotStyle=parent->getNextStyle(); - m_whiskerLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); - m_whiskerLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); - whiskerLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); - m_medianLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); - m_medianLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); - medianLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); - } - - setWhiskerLineColor(getLineColor()); - setMedianLineColor(getLineColor()); -} - -void JKQTPGraphBoxplotStyleMixin::setBoxplotColor(QColor c, JKQTBasePlotter *parent) -{ - setLineColor(c); - setFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); - c.setAlphaF(0.5); - setHighlightingLineColor(c); - setSymbolColor(c); - setSymbolFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); - setWhiskerLineColor(getLineColor()); - setMedianLineColor(getLineColor()); -} - -void JKQTPGraphBoxplotStyleMixin::setBoxWidth(double __value) -{ - this->boxWidth = __value; -} - -double JKQTPGraphBoxplotStyleMixin::getBoxWidth() const -{ - return this->boxWidth; -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineStyle(Qt::PenStyle __value) -{ - this->m_whiskerLinePen.setStyle(__value); -} - -Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineStyle() const -{ - return this->m_whiskerLinePen.style(); -} - - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineWidth(double __value) -{ - whiskerLineWidth=__value; -} - -double JKQTPGraphBoxplotStyleMixin::getWhiskerLineWidth() const -{ - return whiskerLineWidth; -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineColor(QColor __value) -{ - m_whiskerLinePen.setColor(__value); -} - -QColor JKQTPGraphBoxplotStyleMixin::getWhiskerLineColor() const -{ - return m_whiskerLinePen.color(); -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashOffset(qreal offset) -{ - m_whiskerLinePen.setDashOffset(offset); -} - -qreal JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashOffset() const -{ - return m_whiskerLinePen.dashOffset(); -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashPattern(const QVector &pattern) -{ - m_whiskerLinePen.setDashPattern(pattern); - m_whiskerLinePen.setStyle(Qt::CustomDashLine); -} - -QVector JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashPattern() const -{ - return m_whiskerLinePen.dashPattern(); -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineJoinStyle(Qt::PenJoinStyle style) -{ - m_whiskerLinePen.setJoinStyle(style); -} - -Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineJoinStyle() const -{ - return m_whiskerLinePen.joinStyle(); -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineCapStyle(Qt::PenCapStyle style) -{ - m_whiskerLinePen.setCapStyle(style); -} - -Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineCapStyle() const -{ - return m_whiskerLinePen.capStyle(); -} - -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineBrush(const QBrush &style) -{ - m_whiskerLinePen.setBrush(style); -} - -QBrush JKQTPGraphBoxplotStyleMixin::getWhiskerLineBrush() const -{ - return m_whiskerLinePen.brush(); -} - -QPen JKQTPGraphBoxplotStyleMixin::getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const -{ - QPen pw=m_whiskerLinePen; - pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*whiskerLineWidth))); - pw.setJoinStyle(Qt::MiterJoin); - return pw; -} - - - - - -void JKQTPGraphBoxplotStyleMixin::setMedianLineStyle(Qt::PenStyle __value) -{ - this->m_medianLinePen.setStyle(__value); -} - -Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getMedianLineStyle() const -{ - return this->m_medianLinePen.style(); -} - - -void JKQTPGraphBoxplotStyleMixin::setMedianLineWidth(double __value) -{ - medianLineWidth=__value; -} - -double JKQTPGraphBoxplotStyleMixin::getMedianLineWidth() const -{ - return medianLineWidth; -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineColor(QColor __value) -{ - m_medianLinePen.setColor(__value); -} - -QColor JKQTPGraphBoxplotStyleMixin::getMedianLineColor() const -{ - return m_medianLinePen.color(); -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineDashOffset(qreal offset) -{ - m_medianLinePen.setDashOffset(offset); -} - -qreal JKQTPGraphBoxplotStyleMixin::getMedianLineDashOffset() const -{ - return m_medianLinePen.dashOffset(); -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineDashPattern(const QVector &pattern) -{ - m_medianLinePen.setDashPattern(pattern); - m_medianLinePen.setStyle(Qt::CustomDashLine); -} - -QVector JKQTPGraphBoxplotStyleMixin::getMedianLineDashPattern() const -{ - return m_medianLinePen.dashPattern(); -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineJoinStyle(Qt::PenJoinStyle style) -{ - m_medianLinePen.setJoinStyle(style); -} - -Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getMedianLineJoinStyle() const -{ - return m_medianLinePen.joinStyle(); -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineCapStyle(Qt::PenCapStyle style) -{ - m_medianLinePen.setCapStyle(style); -} - -Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getMedianLineCapStyle() const -{ - return m_medianLinePen.capStyle(); -} - -void JKQTPGraphBoxplotStyleMixin::setMedianLineBrush(const QBrush &style) -{ - m_medianLinePen.setBrush(style); -} - -QBrush JKQTPGraphBoxplotStyleMixin::getMedianLineBrush() const -{ - return m_medianLinePen.brush(); -} - -QPen JKQTPGraphBoxplotStyleMixin::getMedianPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const -{ - QPen pw=m_medianLinePen; - pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*medianLineWidth))); - pw.setJoinStyle(Qt::MiterJoin); - return pw; -} - - - - - - - - - - - JKQTPBoxplotVerticalGraph::JKQTPBoxplotVerticalGraph(JKQTBasePlotter* parent): JKQTPGraph(parent) { + boxWidthRelative=0.4; + useRelativeBoxWidth=true; posColumn=-1; medianColumn=-1; meanColumn=-1; @@ -291,6 +45,7 @@ JKQTPBoxplotVerticalGraph::JKQTPBoxplotVerticalGraph(JKQTBasePlotter* parent): maxColumn=-1; percentile25Column=-1; percentile75Column=-1; + medianConfidenceColumn=-1; sortData=Unsorted; @@ -316,14 +71,7 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { drawErrorsBefore(painter); - - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - - int imax=datastore->getColumn(posColumn).getRows(); + int imax=static_cast(datastore->getColumn(static_cast(posColumn)).getRows()); int imin=0; if (imaxget(posColumn,i-1)); - double xv=transformX(datastore->get(posColumn,i)); + int i=qBound(imin+1, getDataIndex(iii), imax); + double xv0=transformX(datastore->get(static_cast(posColumn),static_cast(i-1))); + double xv=transformX(datastore->get(static_cast(posColumn),static_cast(i))); if (posColumn>=0 && JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(xv0)) { if (bwfirst) { boxwidth_real=fabs(xv-xv0); @@ -355,6 +103,7 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { } } } + // 2. plot: { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); @@ -365,11 +114,9 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { const double minv=datastore->get(minColumn,static_cast(i)); const double maxv=datastore->get(maxColumn,static_cast(i)); const double medianv=datastore->get(medianColumn,static_cast(i)); + const double medConf=datastore->get(medianConfidenceColumn,static_cast(i)); const double meanv=datastore->get(meanColumn,static_cast(i)); - QVector lines_p, lines_pw, lines_m; - - //std::cout<<"(xv, yv) = ( "<=0 && JKQTPIsOKFloat(xv) ) { // collect single-value labels for hitTest()-data at the bottom of this loop! @@ -379,72 +126,33 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { labelValues<=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { + if (medianConfidenceColumn>=0 && JKQTPIsOKFloat(medConf)) { + labelNames<<"\\median"; labelValues<<(QString::fromStdString(jkqtp_floattolatexstr(medianv, 3))+"\\:{\\pm}\\:"+QString::fromStdString(jkqtp_floattolatexstr(medConf, 3))); labMedian=labelValues.size()-1; + } else { + labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<get(posColumn,static_cast(i+1))); - else if (i-1>=0) xn=transformX(datastore->get(posColumn,static_cast(i-1))); - else xn=x+1; - - double w=((boxwidth_real>0)?boxwidth_real:(fabs(xn-x)))*getBoxWidth(); - double minstop=p25; - double maxstop=p75; - if (percentile25Column<0 && medianColumn>=0) minstop=median; - else if (percentile25Column<0 && meanColumn>=0) minstop=mean; - else if (percentile25Column<0 && maxColumn>=0) minstop=max; - if (percentile75Column<0 && medianColumn>=0) maxstop=median; - else if (percentile75Column<0 && meanColumn>=0) maxstop=mean; - else if (percentile75Column<0 && minColumn>=0) maxstop=min; + double w=(useRelativeBoxWidth && boxwidth_real>0)?(boxwidth_real*getBoxWidthRelative()):parent->pt2px(painter,getBoxWidthAbsolute()); double xma=x+w/2.0; double xmi=x-w/2.0; - double xma4=x+w/4.0; - double xmi4=x-w/4.0; - if (imax<=0) { - xma=transformX(xv+getBoxWidth()/2.0); - xmi=transformX(xv-getBoxWidth()/2.0); - xma4=transformX(xv+getBoxWidth()/4.0); - xmi4=transformX(xv-getBoxWidth()/4.0); - } - - if (minColumn>=0) { - lines_pw.append(QLineF(xmi4, min, xma4, min)); - lines_pw.append(QLineF(x, min, x, minstop)); - } - if (maxColumn>=0) { - lines_pw.append(QLineF(xmi4, max, xma4, max)); - lines_pw.append(QLineF(x, max, x, maxstop)); - } - - if (percentile25Column>=0 && percentile75Column>=0) painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); - if (medianColumn>=0) lines_m.append(QLineF(xmi+p.widthF()/2.0, median, xma-p.widthF()/2.0, median)); - if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { - plotStyledSymbol(parent, painter,x,mean); - } - - - painter.setPen(p); - if (lines_p.size()>0) painter.drawLines(lines_p); - painter.setPen(pw); - if (lines_pw.size()>0) painter.drawLines(lines_pw); - painter.setPen(pm); - if (lines_m.size()>0) painter.drawLines(lines_m); + plotVerticalBoxplot(parent, painter, x, xmi, xma, min, p25, median, p75, max, mean, medianu, mediano); // add hit-test graph points @@ -505,7 +213,7 @@ bool JKQTPBoxplotVerticalGraph::getXMinMax(double& minx, double& maxx, double& s JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=datastore->getColumn(posColumn).getRows(); + int imax=static_cast(datastore->getColumn(static_cast(posColumn)).getRows()); if (imaxget(posColumn,i); + double xv=datastore->get(posColumn,static_cast(i)); if (JKQTPIsOKFloat(xv)) { double xn=xv+1; if (i+1get(posColumn,i+1); else if (i-1>=0) xn=datastore->get(posColumn,i-1); else xn=xv+1; double delta=fabs(xn-xv); - double w=delta*getBoxWidth(); + double w=delta*getBoxWidthRelative(); double xma=xv+w; double xmi=xv-w; if (start || xma>maxx) maxx=xma; @@ -603,7 +311,7 @@ JKQTPBoxplotVerticalGraph::DataSortOrder JKQTPBoxplotVerticalGraph::getDataSortO } void JKQTPBoxplotVerticalGraph::setDataSortOrder(int __value) { - sortData=(DataSortOrder)__value; + sortData=static_cast(__value); if (__value>0) sortData=Sorted; } @@ -705,44 +413,39 @@ void JKQTPBoxplotVerticalGraph::setPercentile75Column(size_t __value) { this->percentile75Column = static_cast(__value); } +int JKQTPBoxplotVerticalGraph::getMedianConfidenceColumn() const +{ + return medianConfidenceColumn; +} + +void JKQTPBoxplotVerticalGraph::setMedianConfidenceColumn(size_t __value) +{ + medianConfidenceColumn=static_cast(__value); +} + +void JKQTPBoxplotVerticalGraph::setBoxWidthRelative(double __value) +{ + this->boxWidthRelative = __value; +} + +double JKQTPBoxplotVerticalGraph::getBoxWidthRelative() const +{ + return this->boxWidthRelative; +} + +void JKQTPBoxplotVerticalGraph::setUseRelativeBoxWidth(bool __value) +{ + useRelativeBoxWidth=__value; +} + +bool JKQTPBoxplotVerticalGraph::getUseRelativeBoxWidth() const +{ + return useRelativeBoxWidth; +} + void JKQTPBoxplotVerticalGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - - p.setWidthF(qMin(1.0, p.widthF())); - pw.setWidthF(qMin(1.0, pw.widthF())); - pm.setWidthF(qMin(1.0, pm.widthF())); - - double x=rect.left()+rect.width()/2.0; - double xma=x+rect.width()/2.5; - double xmi=x-rect.width()/2.5; - double min=rect.bottom(); - double max=rect.top(); - double median=max+rect.height()/2.0; - double w=rect.width()/1.8; - double p25=max+0.75*rect.height(); - double p75=max+0.25*rect.height(); - - painter.setPen(p); - { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); - } - - painter.setPen(pm); - painter.drawLine(QLineF(xmi, median, xma, median)); - painter.setPen(pw); - painter.drawLine(QLineF(x-w/4.0, max, x+w/4.0, max)); - painter.drawLine(QLineF(x-w/4.0, min, x+w/4.0, min)); - painter.drawLine(QLineF(x, max, x, p75)); - painter.drawLine(QLineF(x, min, x, p25)); - + plotVerticalKeyMarker(parent, painter, rect); } QColor JKQTPBoxplotVerticalGraph::getKeyLabelColor() const { @@ -758,41 +461,7 @@ void JKQTPBoxplotVerticalGraph::setColor(QColor c) void JKQTPBoxplotHorizontalGraph::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - p.setWidthF(qMin(1.0, p.widthF())); - pw.setWidthF(qMin(1.0, pw.widthF())); - pm.setWidthF(qMin(1.0, pm.widthF())); - - - double y=rect.top()+rect.height()/2.0; - double yma=y+rect.height()/2.5; - double ymi=y-rect.height()/2.5; - double min=rect.left(); - double max=rect.right(); - double median=max-rect.width()/2.0; - double w=rect.height()/1.8; - double p25=min+0.75*rect.width(); - double p75=min+0.25*rect.width(); - - painter.setPen(p); - { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(p75, ymi, fabs(p75-p25), fabs(yma-ymi))); - } - - painter.setPen(pm); - painter.drawLine(QLineF(median, ymi, median, yma)); - painter.setPen(pw); - painter.drawLine(QLineF(max, y-w/4.0, max, y+w/4.0)); - painter.drawLine(QLineF(min, y-w/4.0, min, y+w/4.0)); - painter.drawLine(QLineF(max, y, p75, y)); - painter.drawLine(QLineF(min, y, p25, y)); + plotHorizontalKeyMarker(parent, painter, rect); } @@ -857,7 +526,7 @@ bool JKQTPBoxplotHorizontalGraph::getYMinMax(double& minx, double& maxx, double& JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=datastore->getColumn(posColumn).getRows(); + int imax=static_cast(datastore->getColumn(static_cast(posColumn)).getRows()); if (imaxget(posColumn,i); + double xv=datastore->get(posColumn,static_cast(i)); double xn=xv+1; if (i+1get(posColumn,i+1); else if (i-1>=0) xn=datastore->get(posColumn,i-1); else xn=xv+1; double delta=fabs(xn-xv); - double w=delta*getBoxWidth(); + double w=delta*getBoxWidthRelative(); double xma=xv+w; double xmi=xv-w; if (JKQTPIsOKFloat(xma) && JKQTPIsOKFloat(xmi) ) { @@ -908,14 +577,8 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { drawErrorsBefore(painter); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - - int imax=datastore->getColumn(posColumn).getRows(); + int imax=static_cast(datastore->getColumn(static_cast(posColumn)).getRows()); int imin=0; if (imaxget(maxColumn,static_cast(i)); const double medianv=datastore->get(medianColumn,static_cast(i)); const double meanv=datastore->get(meanColumn,static_cast(i)); + const double medConf=datastore->get(medianConfidenceColumn,static_cast(i)); - QVector lines_p, lines_pw, lines_m; - //std::cout<<"(xv, yv) = ( "<=0 && JKQTPIsOKFloat(yv) ) { @@ -968,16 +630,18 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { labelValues<=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { + if (medianConfidenceColumn>=0 && JKQTPIsOKFloat(medConf)) { + labelNames<<"\\median"; labelValues<<(QString::fromStdString(jkqtp_floattolatexstr(medianv, 3))+"\\:{\\pm}\\:"+QString::fromStdString(jkqtp_floattolatexstr(medConf, 3))); labMedian=labelValues.size()-1; + } else { + labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<=0) minstop=median; - else if (percentile25Column<0 && maxColumn>=0) minstop=max; - else if (percentile25Column<0 && meanColumn>=0) minstop=mean; - if (percentile75Column<0 && medianColumn>=0) maxstop=median; - else if (percentile75Column<0 && minColumn>=0) maxstop=min; - else if (percentile75Column<0 && meanColumn>=0) maxstop=mean; + double w=(useRelativeBoxWidth && boxwidth_real>0)?(boxwidth_real*getBoxWidthRelative()):parent->pt2px(painter,getBoxWidthAbsolute()); + double yma=y+w/2.0; + double ymi=y-w/2.0; - double yn=y+1; - if (i+1get(posColumn,static_cast(i+1))); - else if (i-1>=0) yn=transformY(datastore->get(posColumn,static_cast(i-1))); - else yn=y+1; - double delta=fabs(yn-y); - double w=((boxwidth_real>0)?boxwidth_real:(delta))*getBoxWidth(); - double yma=y-w/2.0; - double ymi=y+w/2.0; - double yma4=y+w/4.0; - double ymi4=y-w/4.0; - if (imax<=1) { - ymi=transformY(yv+getBoxWidth()/2.0); - yma=transformY(yv-getBoxWidth()/2.0); - yma4=transformY(yv+getBoxWidth()/4.0); - ymi4=transformY(yv-getBoxWidth()/4.0); - } - if (minColumn>=0) { - lines_pw.append(QLineF(min, ymi4, min, yma4)); - lines_pw.append(QLineF(min, y, minstop, y)); - } - if (maxColumn>=0) { - lines_pw.append(QLineF(max, ymi4, max, yma4)); - lines_pw.append(QLineF(max, y, maxstop, y)); - } - if (percentile25Column>=0 && percentile75Column>=0) painter.drawRect(QRectF(p25, qMin(yma,ymi), fabs(p75-p25), fabs(yma-ymi))); - if (medianColumn>=0) lines_m.append(QLineF(median, ymi-p.widthF()/2.0, median, yma+p.widthF()/2.0)); - - if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { - plotStyledSymbol(parent, painter, mean, y); - } - - //first=true; - painter.setPen(p); - if (lines_p.size()>0) painter.drawLines(lines_p); - painter.setPen(pw); - if (lines_pw.size()>0) painter.drawLines(lines_pw); - painter.setPen(pm); - if (lines_m.size()>0) painter.drawLines(lines_m); + plotHorizontalBoxplot(parent, painter, y, ymi, yma, min, p25, median, p75, max, mean, medianu, mediano); // add hit-test graph points @@ -1108,15 +731,17 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { JKQTPBoxplotVerticalElement::JKQTPBoxplotVerticalElement(JKQTBasePlotter* parent): JKQTPPlotObject(parent) { - pos=0; - median=0; - mean=0; - min=-1; - max=1; - drawMean=true; - drawMinMax=true; - percentile25=-0.75; - percentile75=0.75; + pos=JKQTP_NAN; + median=JKQTP_NAN; + mean=JKQTP_NAN; + min=JKQTP_NAN; + max=JKQTP_NAN; + drawMean=false; + drawMinMax=false; + percentile25=JKQTP_NAN; + percentile75=JKQTP_NAN; + medianConfidenceIntervalWidth=JKQTP_NAN; + drawNotch=false; initBoxplotStyle(parent, parentPlotStyle); @@ -1137,20 +762,13 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) { { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - - - const double xv=pos; const double p25v=percentile25; const double p75v=percentile75; const double minv=min; const double maxv=max; const double medianv=median; + const double medConf=medianConfidenceIntervalWidth; const double meanv=mean; //std::cout<<"(xv, yv) = ( "<pt2px(painter, getBoxWidth()); + double w=parent->pt2px(painter,getBoxWidthAbsolute()); double xma=x+w/2.0; double xmi=x-w/2.0; - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setPen(p); + plotVerticalBoxplot(parent, painter, x, xmi, xma, (drawMinMax)?min:JKQTP_NAN, p25, (drawMedian)?median:JKQTP_NAN, p75, (drawMinMax)?max:JKQTP_NAN, (drawMean)?mean:JKQTP_NAN, (drawMedian&&drawNotch)?medianu:JKQTP_NAN, (drawMedian&&drawNotch)?mediano:JKQTP_NAN); + if (JKQTPIsOKFloat(p25v) && JKQTPIsOKFloat(p75v)) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); if (JKQTPIsOKFloat(p25v)) { QStringList sl=labelValues, sll=labelNames; sl[labQ25]="\\ul{"+sl[labQ25]+"}"; @@ -1201,8 +825,6 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) { } if (drawMedian && JKQTPIsOKFloat(medianv)) { - painter.setPen(pm); - painter.drawLine(QLineF(xmi, median, xma, median)); if (JKQTPIsOKFloat(medianv)) { QStringList sl=labelValues, sll=labelNames; sl[labMedian]="\\ul{"+sl[labMedian]+"}"; @@ -1211,11 +833,6 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) { } } if (drawMinMax) { - painter.setPen(pw); - if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(x-w/4.0, max, x+w/4.0, max)); - if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(x-w/4.0, min, x+w/4.0, min)); - if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(x, max, x, p75)); - if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(x, min, x, p25)); if (JKQTPIsOKFloat(minv)) { QStringList sl=labelValues, sll=labelNames; sl[labMin]="\\ul{"+sl[labMin]+"}"; @@ -1232,8 +849,6 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) { if (drawMean && JKQTPIsOKFloat(meanv)) { - double mean=transformY(meanv); - plotStyledSymbol(parent, painter, x, mean); if (JKQTPIsOKFloat(meanv)) { QStringList sl=labelValues, sll=labelNames; sl[labMean]="\\ul{"+sl[labMean]+"}"; @@ -1327,6 +942,19 @@ double JKQTPBoxplotVerticalElement::getMedian() const return this->median; } +void JKQTPBoxplotVerticalElement::setMedianConfidenceIntervalWidth(double __value) +{ + if (this->medianConfidenceIntervalWidth != __value) { + this->medianConfidenceIntervalWidth = __value; + drawNotch=true; + } +} + +double JKQTPBoxplotVerticalElement::getMedianConfidenceIntervalWidth() const +{ + return this->medianConfidenceIntervalWidth; +} + void JKQTPBoxplotVerticalElement::setMean(double __value) { if (this->mean != __value) { @@ -1416,44 +1044,19 @@ bool JKQTPBoxplotVerticalElement::getDrawMinMax() const return this->drawMinMax; } +void JKQTPBoxplotVerticalElement::setDrawNotch(bool __value) +{ + drawNotch=__value; +} + +bool JKQTPBoxplotVerticalElement::getDrawNotch() const +{ + return drawNotch; +} + void JKQTPBoxplotVerticalElement::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - p.setWidthF(qMin(1.0, p.widthF())); - pw.setWidthF(qMin(1.0, pw.widthF())); - pm.setWidthF(qMin(1.0, pm.widthF())); - - - double x=rect.left()+rect.width()/2.0; - double xma=x+rect.width()/2.5; - double xmi=x-rect.width()/2.5; - double min=rect.bottom(); - double max=rect.top(); - double median=max+rect.height()/2.0; - double w=rect.width()/1.8; - double p25=max+0.75*rect.height(); - double p75=max+0.25*rect.height(); - - painter.setPen(p); - { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); - } - - painter.setPen(pm); - painter.drawLine(QLineF(xmi, median, xma, median)); - painter.setPen(pw); - painter.drawLine(QLineF(x-w/4.0, max, x+w/4.0, max)); - painter.drawLine(QLineF(x-w/4.0, min, x+w/4.0, min)); - painter.drawLine(QLineF(x, max, x, p75)); - painter.drawLine(QLineF(x, min, x, p25)); - + plotVerticalKeyMarker(parent, painter, rect); } QColor JKQTPBoxplotVerticalElement::getKeyLabelColor() const { @@ -1464,41 +1067,7 @@ QColor JKQTPBoxplotVerticalElement::getKeyLabelColor() const { void JKQTPBoxplotHorizontalElement::drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); - p.setWidthF(qMin(1.0, p.widthF())); - pw.setWidthF(qMin(1.0, pw.widthF())); - pm.setWidthF(qMin(1.0, pm.widthF())); - - double y=rect.top()+rect.height()/2.0; - double yma=y+rect.height()/2.5; - double ymi=y-rect.height()/2.5; - double min=rect.left(); - double max=rect.right(); - double median=max-rect.width()/2.0; - double w=rect.height()/1.8; - double p25=min+0.75*rect.width(); - double p75=min+0.25*rect.width(); - - painter.setPen(p); - { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(p75, ymi, fabs(p75-p25), fabs(yma-ymi))); - } - - painter.setPen(pm); - painter.drawLine(QLineF(median, ymi, median, yma)); - painter.setPen(pw); - painter.drawLine(QLineF(max, y-w/4.0, max, y+w/4.0)); - painter.drawLine(QLineF(min, y-w/4.0, min, y+w/4.0)); - painter.drawLine(QLineF(max, y, p75, y)); - painter.drawLine(QLineF(min, y, p25, y)); - + plotHorizontalKeyMarker(parent, painter, rect); } bool JKQTPBoxplotHorizontalElement::getXMinMax(double& minx, double& maxx, double& smallestGreaterZero) { @@ -1576,17 +1145,13 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) { { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - QPen p=getLinePenForRects(painter, parent); - QPen pw=getWhiskerPen(painter, parent); - QPen pm=getMedianPen(painter, parent); - QPen np(Qt::NoPen); - QBrush b=getFillBrush(painter, parent); const double yv=pos; const double p25v=percentile25; const double p75v=percentile75; const double minv=min; const double maxv=max; const double medianv=median; + const double medConf=medianConfidenceIntervalWidth; const double meanv=mean; //std::cout<<"(xv, yv) = ( "<pt2px(painter, getBoxWidth()); + double w=parent->pt2px(painter,getBoxWidthAbsolute()); double yma=y+w/2.0; double ymi=y-w/2.0; - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setPen(p); + plotHorizontalBoxplot(parent, painter, y, ymi, yma, (drawMinMax)?min:JKQTP_NAN, p25, (drawMedian)?median:JKQTP_NAN, p75, (drawMinMax)?max:JKQTP_NAN, (drawMean)?mean:JKQTP_NAN, (drawMedian&&drawNotch)?medianu:JKQTP_NAN, (drawMedian&&drawNotch)?mediano:JKQTP_NAN); + if (JKQTPIsOKFloat(p25v) && JKQTPIsOKFloat(p75v)) { - painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.drawRect(QRectF(p25, ymi, fabs(p75-p25), fabs(yma-ymi))); if (JKQTPIsOKFloat(p25v)) { QStringList sl=labelValues, sll=labelNames; sl[labQ25]="\\ul{"+sl[labQ25]+"}"; @@ -1637,20 +1208,13 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) { } if (drawMedian && JKQTPIsOKFloat(medianv)) { - painter.setPen(pm); - painter.drawLine(QLineF(median, ymi, median, yma)); - if (JKQTPIsOKFloat(medianv)) { + if (JKQTPIsOKFloat(medianv)) { QStringList sl=labelValues, sll=labelNames; sl[labMedian]="\\ul{"+sl[labMedian]+"}"; sll[labMedian]="\\ul{"+sll[labMedian]+"}"; addHitTestData(medianv, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); } } if (drawMinMax) { - painter.setPen(pw); - if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(max, y-w/4.0, max, y+w/4.0)); - if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(min, y-w/4.0, min, y+w/4.0)); - if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(max, y, p75, y)); - if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(min, y, p25, y)); if (JKQTPIsOKFloat(minv)) { QStringList sl=labelValues, sll=labelNames; sl[labMin]="\\ul{"+sl[labMin]+"}"; @@ -1667,8 +1231,6 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) { if (drawMean && JKQTPIsOKFloat(meanv)) { - double mean=transformY(meanv); - plotStyledSymbol(parent, painter, mean, y); if (JKQTPIsOKFloat(meanv)) { QStringList sl=labelValues, sll=labelNames; sl[labMean]="\\ul{"+sl[labMean]+"}"; @@ -1697,7 +1259,7 @@ void JKQTPBoxplotVerticalGraph::intSortData() JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=datastore->getColumn(posColumn).getRows(); + int imax=static_cast(datastore->getColumn(static_cast(posColumn)).getRows()); if (imaxget(posColumn,i); + double xv=datastore->get(posColumn,static_cast(i)); sortedIndices< &pattern); - /** \brief gets the dash pattern for a custom dash style of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern - */ - QVector getWhiskerLineDashPattern() const; - /** \brief sets the join style of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle - */ - void setWhiskerLineJoinStyle(Qt::PenJoinStyle style); - /** \brief returns the join style of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle - */ - Qt::PenJoinStyle getWhiskerLineJoinStyle() const; - /** \brief sets the cap style of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle - */ - void setWhiskerLineCapStyle(Qt::PenCapStyle style); - /** \brief gets the cap style of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle - */ - Qt::PenCapStyle getWhiskerLineCapStyle() const; - /** \brief sets the brush used to fill the line area of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setBrush - */ - void setWhiskerLineBrush(const QBrush& style); - /** \brief gets the brush used to fill the line area of whisker lines - * \see https://doc.qt.io/qt-5/qpen.html#setBrush - */ - QBrush getWhiskerLineBrush() const; - - /** \brief build a pen to be used for drawing whiskers */ - QPen getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; - - - - - - - - /*! \brief set the line style of median lines */ - void setMedianLineStyle(Qt::PenStyle __value); - /*! \brief get the line style of median lines */ - Qt::PenStyle getMedianLineStyle() const; - - /*! \brief set the width [pt] of median lines */ - void setMedianLineWidth(double __value); - /*! \brief get the width [pt] of median lines */ - double getMedianLineWidth() const; - - /*! \brief set the color of median lines */ - void setMedianLineColor(QColor __value); - /*! \brief get the color of median lines */ - QColor getMedianLineColor() const; - - - /** \brief sets the dash offset for a custom dash style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset - */ - void setMedianLineDashOffset(qreal offset); - /** \brief returns the dash offset for a custom dash style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset - */ - qreal getMedianLineDashOffset() const; - /** \brief sets the dash pattern for a custom dash style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern - */ - void setMedianLineDashPattern(const QVector &pattern); - /** \brief gets the dash pattern for a custom dash style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern - */ - QVector getMedianLineDashPattern() const; - /** \brief sets the join style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle - */ - void setMedianLineJoinStyle(Qt::PenJoinStyle style); - /** \brief returns the join style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle - */ - Qt::PenJoinStyle getMedianLineJoinStyle() const; - /** \brief sets the cap style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle - */ - void setMedianLineCapStyle(Qt::PenCapStyle style); - /** \brief gets the cap style of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle - */ - Qt::PenCapStyle getMedianLineCapStyle() const; - /** \brief sets the brush used to fill the line area of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setBrush - */ - void setMedianLineBrush(const QBrush& style); - /** \brief gets the brush used to fill the line area of median lines - * \see https://doc.qt.io/qt-5/qpen.html#setBrush - */ - QBrush getMedianLineBrush() const; - - /** \brief build a pen to be used for drawing medians */ - QPen getMedianPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; - - protected: - /*! \brief set the color of the graph (colors all elements, based on the given color \a c )*/ - void setBoxplotColor(QColor c, JKQTBasePlotter *parent); - private: - /** \brief line style of the whisker lines */ - QPen m_whiskerLinePen; - /** \brief line width (in pt) of the whisker lines */ - double whiskerLineWidth; - /** \brief line style of the median lines */ - QPen m_medianLinePen; - /** \brief line width (in pt) of the median lines */ - double medianLineWidth; - /** \brief width of box in percent of distance between the current two posColumn values - * if we only plot one box&whiskers then this is the width in pt */ - double boxWidth; - -}; - - - - - - -/*! \brief This implements vertical boxplots +/*! \brief This implements vertical boxplots, optionally also a notched boxplot \ingroup jkqtplotter_statgraphs The x position is given in posColumn. All other data are given in the medianColumn, minColumn, maxColumn, @@ -213,9 +43,15 @@ class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMi \image html plot_boxplotvertical.png + The different features of a boxplot are: - \image html boxplots.png + \image html plot_boxplotverticalelement.png + + + The example \ref JKQTPlotterBoxplotStyling discusses different options to style boxplots: + + \image html test_styledboxplot.png This class also implements hitTest() in a way that displays all data of the boxplot in the tooltips: @@ -381,14 +217,43 @@ class JKQTP_LIB_EXPORT JKQTPBoxplotVerticalGraph: public JKQTPGraph, public JKQT \details Description of the parameter percentile75Column is:
    \copydoc percentile75Column
    \see percentile75Column for more information */ void setPercentile75Column (size_t __value); + /*! \copydoc medianConfidenceColumn + \see see medianConfidenceColumn for details */ + int getMedianConfidenceColumn() const; + /*! \brief sets the property medianConfidenceColumn ( \copybrief medianConfidenceColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int. + \details Description of the parameter medianConfidenceColumn is:
    \copydoc medianConfidenceColumn
    + \see medianConfidenceColumn for more information */ + void setMedianConfidenceColumn (size_t __value); + /*! \copydoc boxWidthRelative + \see see boxWidthRelative for details */ + void setBoxWidthRelative(double __value); + /*! \copydoc boxWidthRelative + \see see boxWidthRelative for details */ + double getBoxWidthRelative() const; + + + /*! \copydoc useRelativeBoxWidth + \see see useRelativeBoxWidth for details */ + void setUseRelativeBoxWidth(bool __value); + /*! \copydoc useRelativeBoxWidth + \see see useRelativeBoxWidth for details */ + bool getUseRelativeBoxWidth() const; protected: + /** \brief width of box in percent of distance between the current two posColumn values + * if we only plot one box&whiskers then JKQTPGraphBoxplotStyleMixin::boxWidthAbsolute in pt is used */ + double boxWidthRelative; + /** \brief if set \c true, boxplot widths are calculated automatically, based on boxWidthRelative, + * otherwise JKQTPGraphBoxplotStyleMixin::boxWidthAbsolute is used. */ + bool useRelativeBoxWidth; /** \brief the column that contains the x-component of the datapoints */ int posColumn; /** \brief the column that contains the median-component of the datapoints */ int medianColumn; + /** \brief the column that contains the confidence interval width of the median (e.g. 1.57*IQR/sqrt(n) ). This is used to draw a notch in the plot (if set) */ + int medianConfidenceColumn; /** \brief the column that contains the median-component of the datapoints. \note This column is strictly optional. */ int meanColumn; /** \brief the column that contains the minimum-component of the datapoints */ @@ -414,7 +279,7 @@ class JKQTP_LIB_EXPORT JKQTPBoxplotVerticalGraph: public JKQTPGraph, public JKQT }; -/*! \brief This implements horizontal boxplots +/*! \brief This implements horizontal boxplots, optionally also a notched boxplot \ingroup jkqtplotter_statgraphs the x position is given in posColumn. All other data are given in the medianColumn, minColumn, maxColumn, @@ -459,20 +324,25 @@ class JKQTP_LIB_EXPORT JKQTPBoxplotHorizontalGraph: public JKQTPBoxplotVerticalG -/*! \brief This implements a single vertical boxplot as a "geometric element", +/*! \brief This implements a single vertical (notched) boxplot as a "geometric element", where the data is directly given to the object and not stored in a column, as in JKQTPBoxplotVerticalGraph \ingroup jkqtplotter_statgraphs \ingroup jkqtplotter_geoplots - \image html plot_boxplotverticalelement.png the x position is given in posColumn. All other data are given in the median, min, max, percentile25 and percentile75. The different features of a boxplot are: - \image html boxplots.png + \image html plot_boxplotverticalelement.png + + + The example \ref JKQTPlotterBoxplotStyling discusses different options to style boxplots: + + \image html test_styledboxplot.png + */ class JKQTP_LIB_EXPORT JKQTPBoxplotVerticalElement: public JKQTPPlotObject, public JKQTPGraphBoxplotStyleMixin { Q_OBJECT @@ -563,14 +433,30 @@ class JKQTP_LIB_EXPORT JKQTPBoxplotVerticalElement: public JKQTPPlotObject, publ /*! \copydoc drawMinMax \see see drawMinMax for details */ bool getDrawMinMax() const; + /*! \copydoc drawNotch + \see see drawNotch for details */ + void setDrawNotch(bool __value); + /*! \copydoc drawNotch + \see see drawNotch for details */ + bool getDrawNotch() const; + /*! \copydoc medianConfidenceIntervalWidth + \see see medianConfidenceIntervalWidth for details */ + double getMedianConfidenceIntervalWidth() const; + /*! \copydoc medianConfidenceIntervalWidth + \see see medianConfidenceIntervalWidth for details */ + void setMedianConfidenceIntervalWidth(double __value); protected: - /** \brief the column that contains the x-component of the datapoints */ + /** \brief the position of the boxplot on the "other" axis */ double pos; - /** \brief the column that contains the median-component of the datapoints */ + /** \brief the median value to be used for the boxplot */ double median; - /** \brief the column that contains the median-component of the datapoints. \note This column is strictly optional. */ + /** \brief the width of the confidence interval around the median */ + double medianConfidenceIntervalWidth; + /** \brief indicates whether to draw a notch with width medianConfidenceIntervalWidth */ + bool drawNotch; + /** \brief the mean value to be used for the boxplot */ double mean; /** \brief indicates whether to draw the mean */ bool drawMean; @@ -578,18 +464,18 @@ class JKQTP_LIB_EXPORT JKQTPBoxplotVerticalElement: public JKQTPPlotObject, publ bool drawMedian; /** \brief indicates whether to draw the percentiles */ bool drawMinMax; - /** \brief the column that contains the minimum-component of the datapoints */ + /** \brief the minimum value to be used for the boxplot */ double min; - /** \brief the column that contains the maximum-component of the datapoints */ + /** \brief the maximum value to be used for the boxplot */ double max; - /** \brief the column that contains the 25% percentile-component of the datapoints */ + /** \brief the 25% percentile value to be used for the boxplot */ double percentile25; - /** \brief the column that contains the 75% percentile-component of the datapoints */ + /** \brief the 75% percentile value to be used for the boxplot */ double percentile75; }; -/*! \brief This implements a horizontal boxplot where the data is directly given to the +/*! \brief This implements a horizontal (notched) boxplot where the data is directly given to the object and not stored in a column, as in JKQTPBoxplotVerticalGraph \ingroup jkqtplotter_statgraphs \ingroup jkqtplotter_geoplots diff --git a/lib/jkqtplotter/jkqtpgraphsboxplotstylingmixins.cpp b/lib/jkqtplotter/jkqtpgraphsboxplotstylingmixins.cpp new file mode 100644 index 0000000000..95a973af5c --- /dev/null +++ b/lib/jkqtplotter/jkqtpgraphsboxplotstylingmixins.cpp @@ -0,0 +1,785 @@ +/* + Copyright (c) 2008-2019 Jan W. Krieger () + + + + This software is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License (LGPL) as published by + the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License (LGPL) for more details. + + You should have received a copy of the GNU Lesser General Public License (LGPL) + along with this program. If not, see . +*/ + + + +#include "jkqtplotter/jkqtpgraphsboxplotstylingmixins.h" +#include "jkqtplotter/jkqtpbaseplotter.h" +#include +#include +#include +#include "jkqtplottertools/jkqtptools.h" +#include "jkqtplotter/jkqtpgraphsimage.h" +#include "jkqtplotter/jkqtpbaseelements.h" +#include "jkqtplotter/jkqtplotter.h" + + + +JKQTPGraphBoxplotStyleMixin::JKQTPGraphBoxplotStyleMixin() +{ + + m_whiskerLinePen=QPen(getLineColor(), getLineWidth()); + whiskerLineWidth=getLineWidth(); + m_whiskerCapLinePen=QPen(getLineColor(), getLineWidth()); + whiskerCapLineWidth=getLineWidth(); + m_medianLinePen=QPen(getLineColor(), getLineWidth()); + medianLineWidth=getLineWidth(); + + m_meanSymbolLinePen=QPen(getLineColor(), getLineWidth()); + m_meanSymbolLineWidth=1; + meanMode=MeanAsSymbol; + m_meanSymbolType=JKQTPGraphSymbols::JKQTPDefaultSymbol; + m_meanSymbolSize=12; + m_meanSymbolFillColor=m_meanSymbolLinePen.color().lighter(); + + + boxWidthAbsolute=m_meanSymbolSize*3.0; + relativeWhiskerWidth=0.5; + relativeNotchIndent=0.25; + drawBox=true; + +} + + +void JKQTPGraphBoxplotStyleMixin::initBoxplotStyle(JKQTBasePlotter *parent, int &parentPlotStyle) +{ + setFillStyle(Qt::SolidPattern); + setFillColor(parent->getCurrentPlotterStyle().plotBackgroundBrush.color()); + initLineStyle(parent, parentPlotStyle); + if (parent) { // get style settings from parent object + if (parentPlotStyle<0) parentPlotStyle=parent->getNextStyle(); + m_whiskerLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); + m_whiskerLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); + whiskerLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); + m_whiskerCapLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); + m_whiskerCapLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); + whiskerCapLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); + m_medianLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); + m_medianLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); + medianLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); + m_meanSymbolLinePen=QPen(parent->getPlotStyle(parentPlotStyle).color(), parent->getPlotStyle(parentPlotStyle).style()); + m_meanSymbolSize=parent->getPlotStyle(parentPlotStyle).symbolSize(); + m_meanSymbolLineWidth=parent->getPlotStyle(parentPlotStyle).symbolLineWidthF(); + m_meanSymbolType=parent->getPlotStyle(parentPlotStyle).symbol(); + m_meanSymbolFillColor=parent->getPlotStyle(parentPlotStyle).symbolFillColor(); + } + + setWhiskerLineColor(getLineColor()); + setWhiskerCapLineColor(getLineColor()); + setMedianLineColor(getLineColor()); + + if (m_meanSymbolSize>0) { + boxWidthAbsolute=m_meanSymbolSize*3.0; + } +} + +void JKQTPGraphBoxplotStyleMixin::setBoxWidthAbsolute(double __value) +{ + boxWidthAbsolute=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getBoxWidthAbsolute() const +{ + return boxWidthAbsolute; +} + +void JKQTPGraphBoxplotStyleMixin::setBoxplotColor(QColor c, JKQTBasePlotter *parent) +{ + setLineColor(c); + setFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); + setMeanColor(c); + setMeanFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); + setWhiskerLineColor(getLineColor()); + setWhiskerCapLineColor(getLineColor()); + setMedianLineColor(getLineColor()); + c.setAlphaF(0.5); + setHighlightingLineColor(c); +} + +void JKQTPGraphBoxplotStyleMixin::setBoxplotColor(QColor c, QColor bc, JKQTBasePlotter *parent) +{ + setBoxplotColor(c, parent); + setFillColor(bc); + setMeanFillColor(bc); +} + +void JKQTPGraphBoxplotStyleMixin::setDrawBox(bool __value) +{ + drawBox=__value; +} + +bool JKQTPGraphBoxplotStyleMixin::getDrawBox() const +{ + return drawBox; +} + +void JKQTPGraphBoxplotStyleMixin::setRelativeWhiskerWidth(double __value) +{ + relativeWhiskerWidth=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getRelativeWhiskerWidth() const +{ + return relativeWhiskerWidth; +} + +void JKQTPGraphBoxplotStyleMixin::setRelativeNotchIndent(double __value) +{ + relativeNotchIndent=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getRelativeNotchIndent() const +{ + return relativeNotchIndent; +} + +void JKQTPGraphBoxplotStyleMixin::setMeanMode(JKQTPGraphBoxplotStyleMixin::MeanMode __value) +{ + meanMode=__value; +} + +JKQTPGraphBoxplotStyleMixin::MeanMode JKQTPGraphBoxplotStyleMixin::getMeanMode() const +{ + return meanMode; +} + + + + + + + +void JKQTPGraphBoxplotStyleMixin::setMeanSymbolType(JKQTPGraphSymbols __value) +{ + m_meanSymbolType=__value; +} + +JKQTPGraphSymbols JKQTPGraphBoxplotStyleMixin::getMeanSymbolType() const +{ + return m_meanSymbolType; +} + +void JKQTPGraphBoxplotStyleMixin::setMeanSize(double __value) +{ + m_meanSymbolSize=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getMeanSize() const +{ + return m_meanSymbolSize; +} + +void JKQTPGraphBoxplotStyleMixin::setMeanColor(const QColor &__value) +{ + m_meanSymbolLinePen.setColor(__value); +} + +QColor JKQTPGraphBoxplotStyleMixin::getMeanColor() const +{ + return m_meanSymbolLinePen.color(); +} + +void JKQTPGraphBoxplotStyleMixin::setMeanFillColor(const QColor &__value) +{ + m_meanSymbolFillColor=__value; +} + +QColor JKQTPGraphBoxplotStyleMixin::getMeanFillColor() const +{ + return m_meanSymbolFillColor; +} + +void JKQTPGraphBoxplotStyleMixin::setMeanLineWidth(double __value) +{ + m_meanSymbolLineWidth=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getMeanLineWidth() const +{ + return m_meanSymbolLineWidth; +} + + +void JKQTPGraphBoxplotStyleMixin::setMeanLineStyle(Qt::PenStyle __value) +{ + this->m_meanSymbolLinePen.setStyle(__value); +} + +Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getMeanLineStyle() const +{ + return this->m_meanSymbolLinePen.style(); +} + + +void JKQTPGraphBoxplotStyleMixin::setMeanLineDashOffset(qreal offset) +{ + m_meanSymbolLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphBoxplotStyleMixin::getMeanLineDashOffset() const +{ + return m_meanSymbolLinePen.dashOffset(); +} + +void JKQTPGraphBoxplotStyleMixin::setMeanLineDashPattern(const QVector &pattern) +{ + m_meanSymbolLinePen.setDashPattern(pattern); + m_meanSymbolLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphBoxplotStyleMixin::getMeanLineDashPattern() const +{ + return m_meanSymbolLinePen.dashPattern(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineWidth(double __value) +{ + medianLineWidth=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getMedianLineWidth() const +{ + return medianLineWidth; +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineColor(QColor __value) +{ + m_medianLinePen.setColor(__value); +} + +QColor JKQTPGraphBoxplotStyleMixin::getMedianLineColor() const +{ + return m_medianLinePen.color(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineStyle(Qt::PenStyle __value) +{ + this->m_medianLinePen.setStyle(__value); +} + +Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getMedianLineStyle() const +{ + return this->m_medianLinePen.style(); +} + + +void JKQTPGraphBoxplotStyleMixin::setMedianLineDashOffset(qreal offset) +{ + m_medianLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphBoxplotStyleMixin::getMedianLineDashOffset() const +{ + return m_medianLinePen.dashOffset(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineDashPattern(const QVector &pattern) +{ + m_medianLinePen.setDashPattern(pattern); + m_medianLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphBoxplotStyleMixin::getMedianLineDashPattern() const +{ + return m_medianLinePen.dashPattern(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineJoinStyle(Qt::PenJoinStyle style) +{ + m_medianLinePen.setJoinStyle(style); +} + +Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getMedianLineJoinStyle() const +{ + return m_medianLinePen.joinStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineCapStyle(Qt::PenCapStyle style) +{ + m_medianLinePen.setCapStyle(style); +} + +Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getMedianLineCapStyle() const +{ + return m_medianLinePen.capStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setMedianLineBrush(const QBrush &style) +{ + m_medianLinePen.setBrush(style); +} + +QBrush JKQTPGraphBoxplotStyleMixin::getMedianLineBrush() const +{ + return m_medianLinePen.brush(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineStyle(Qt::PenStyle __value) +{ + this->m_whiskerLinePen.setStyle(__value); +} + +Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineStyle() const +{ + return this->m_whiskerLinePen.style(); +} + + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineWidth(double __value) +{ + whiskerLineWidth=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getWhiskerLineWidth() const +{ + return whiskerLineWidth; +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineColor(QColor __value) +{ + m_whiskerLinePen.setColor(__value); +} + +QColor JKQTPGraphBoxplotStyleMixin::getWhiskerLineColor() const +{ + return m_whiskerLinePen.color(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashOffset(qreal offset) +{ + m_whiskerLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashOffset() const +{ + return m_whiskerLinePen.dashOffset(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashPattern(const QVector &pattern) +{ + m_whiskerLinePen.setDashPattern(pattern); + m_whiskerLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashPattern() const +{ + return m_whiskerLinePen.dashPattern(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineJoinStyle(Qt::PenJoinStyle style) +{ + m_whiskerLinePen.setJoinStyle(style); +} + +Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineJoinStyle() const +{ + return m_whiskerLinePen.joinStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineCapStyle(Qt::PenCapStyle style) +{ + m_whiskerLinePen.setCapStyle(style); +} + +Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineCapStyle() const +{ + return m_whiskerLinePen.capStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineBrush(const QBrush &style) +{ + m_whiskerLinePen.setBrush(style); +} + +QBrush JKQTPGraphBoxplotStyleMixin::getWhiskerLineBrush() const +{ + return m_whiskerLinePen.brush(); +} + +QPen JKQTPGraphBoxplotStyleMixin::getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const +{ + QPen pw=m_whiskerLinePen; + pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*whiskerLineWidth))); + pw.setJoinStyle(Qt::MiterJoin); + pw.setCapStyle(Qt::FlatCap); + return pw; +} + + + + + + + + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineStyle(Qt::PenStyle __value) +{ + this->m_whiskerCapLinePen.setStyle(__value); +} + +Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineStyle() const +{ + return this->m_whiskerCapLinePen.style(); +} + + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineWidth(double __value) +{ + whiskerCapLineWidth=__value; +} + +double JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineWidth() const +{ + return whiskerCapLineWidth; +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineColor(QColor __value) +{ + m_whiskerCapLinePen.setColor(__value); +} + +QColor JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineColor() const +{ + return m_whiskerCapLinePen.color(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineDashOffset(qreal offset) +{ + m_whiskerCapLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineDashOffset() const +{ + return m_whiskerCapLinePen.dashOffset(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineDashPattern(const QVector &pattern) +{ + m_whiskerCapLinePen.setDashPattern(pattern); + m_whiskerCapLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineDashPattern() const +{ + return m_whiskerCapLinePen.dashPattern(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineJoinStyle(Qt::PenJoinStyle style) +{ + m_whiskerCapLinePen.setJoinStyle(style); +} + +Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineJoinStyle() const +{ + return m_whiskerCapLinePen.joinStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineCapStyle(Qt::PenCapStyle style) +{ + m_whiskerCapLinePen.setCapStyle(style); +} + +Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineCapStyle() const +{ + return m_whiskerCapLinePen.capStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerCapLineBrush(const QBrush &style) +{ + m_whiskerCapLinePen.setBrush(style); +} + +QBrush JKQTPGraphBoxplotStyleMixin::getWhiskerCapLineBrush() const +{ + return m_whiskerCapLinePen.brush(); +} + +QPen JKQTPGraphBoxplotStyleMixin::getWhiskerCapPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const +{ + QPen pw=m_whiskerCapLinePen; + pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*whiskerCapLineWidth))); + pw.setJoinStyle(Qt::MiterJoin); + return pw; +} + + + + + + + + + +QPen JKQTPGraphBoxplotStyleMixin::getMedianPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const +{ + QPen pw=m_medianLinePen; + pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*medianLineWidth))); + pw.setJoinStyle(Qt::MiterJoin); + pw.setCapStyle(Qt::FlatCap); + return pw; +} + +QPen JKQTPGraphBoxplotStyleMixin::getMeanSymbolPen(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent) const { + QPen p=m_meanSymbolLinePen; + p.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*m_meanSymbolLineWidth))); + p.setStyle(Qt::SolidLine); + p.setJoinStyle(Qt::RoundJoin); + p.setCapStyle(Qt::RoundCap); + return p; +} + +QPen JKQTPGraphBoxplotStyleMixin::getMeanLinePen(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent) const { + QPen p=m_meanSymbolLinePen; + p.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*m_meanSymbolLineWidth))); + p.setJoinStyle(Qt::MiterJoin); + p.setCapStyle(Qt::FlatCap); + return p; +} + +QBrush JKQTPGraphBoxplotStyleMixin::getMeanSymbolBrush(JKQTPEnhancedPainter& /*painter*/, JKQTBasePlotter* /*parent*/) const { + QBrush b; + b.setColor(m_meanSymbolFillColor); + return b; +} + +void JKQTPGraphBoxplotStyleMixin::plotStyledMeanSymbol(JKQTBasePlotter *parent, JKQTPEnhancedPainter &painter, double x, double y) const +{ + JKQTPPlotSymbol(painter, x, y,m_meanSymbolType, parent->pt2px(painter, m_meanSymbolSize), parent->pt2px(painter, m_meanSymbolLineWidth*parent->getLineWidthMultiplier()), m_meanSymbolLinePen.color(), m_meanSymbolFillColor); +} + + + +void JKQTPGraphBoxplotStyleMixin::plotVerticalBoxplot(JKQTBasePlotter *parent, JKQTPEnhancedPainter &painter, double xp, double xpleft, double xpright, double minp, double q25p, double medianp, double q75p, double maxp, double meanp, double notchLowerp, double notchUpperp) const +{ + if (JKQTPIsOKFloat(xp) ) { + painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); + painter.setBrush(Qt::NoBrush); + + + double minstop=q25p; + double maxstop=q75p; + if (!JKQTPIsOKFloat(minstop) && JKQTPIsOKFloat(medianp)) minstop=medianp; + else if (!JKQTPIsOKFloat(minstop) && JKQTPIsOKFloat(meanp)) minstop=meanp; + else if (!JKQTPIsOKFloat(minstop) && JKQTPIsOKFloat(maxp)) minstop=maxp; + if (!JKQTPIsOKFloat(maxstop) && JKQTPIsOKFloat(medianp)) maxstop=medianp; + else if (!JKQTPIsOKFloat(maxstop) && JKQTPIsOKFloat(meanp)) maxstop=meanp; + else if (!JKQTPIsOKFloat(maxstop) && JKQTPIsOKFloat(minp)) maxstop=minp; + const double wl=fabs(xpright-xp); + const double wr=fabs(xpleft-xp); + const double xprightWhisker=xp+wr*getRelativeWhiskerWidth(); + const double xpleftWhisker=xp-wl*getRelativeWhiskerWidth(); + + // whisker lines + painter.setPen(getWhiskerPen(painter, parent)); + if (JKQTPIsOKFloat(minp) && JKQTPIsOKFloat(minstop)) { + painter.drawLine(QLineF(xp, minp, xp, minstop)); + } + if (JKQTPIsOKFloat(maxp) && JKQTPIsOKFloat(maxstop)) { + painter.drawLine(QLineF(xp, maxp, xp, maxstop)); + } + + // whisker caps + if (JKQTPIsOKFloat(xpleftWhisker) && JKQTPIsOKFloat(xprightWhisker)){ + painter.setPen(getWhiskerCapPen(painter, parent)); + if (JKQTPIsOKFloat(minp)) { + painter.drawLine(QLineF(xpleftWhisker, minp, xprightWhisker, minp)); + } + if (JKQTPIsOKFloat(maxp)) { + painter.drawLine(QLineF(xpleftWhisker, maxp, xprightWhisker, maxp)); + } + } + + // draw main box + double medianMin=xpleft; + double medianMax=xpright; + if (JKQTPIsOKFloat(q25p) && JKQTPIsOKFloat(q75p) && getDrawBox()) { + painter.setPen(getLinePenForRects(painter, parent)); + painter.setBrush(getFillBrush(painter, parent)); + if (getDrawBox()) { + QPolygonF poly; + if (JKQTPIsOKFloat(notchLowerp) && JKQTPIsOKFloat(notchUpperp)) { + // notched boxplot + poly<) + + + + This software is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License (LGPL) as published by + the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License (LGPL) for more details. + + You should have received a copy of the GNU Lesser General Public License (LGPL) + along with this program. If not, see . +*/ + + +#include +#include +#include "jkqtplottertools/jkqtptools.h" +#include "jkqtplottertools/jkqtp_imexport.h" +#include "jkqtplotter/jkqtpgraphsbase.h" +#include "jkqtplotter/jkqtpgraphsbasestylingmixins.h" + +#ifndef jkqtpgraphsboxplotstylingmixins_H +#define jkqtpgraphsboxplotstylingmixins_H + + + + + +/*! \brief Styling Mix-In for Boxplots + \ingroup jkqtplotter_basegraphs_stylemixins + + + \image html plot_boxplothorizontalelement.png + + The example \ref JKQTPlotterBoxplotStyling discusses different options to style boxplots: + + \image html test_styledboxplot.png + */ +class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMixin, public JKQTPGraphFillStyleMixin { + Q_GADGET + public: + /** \brief class constructor */ + JKQTPGraphBoxplotStyleMixin(); + + void initBoxplotStyle(JKQTBasePlotter* parent, int &parentPlotStyle); + /*! \copydoc boxWidthAbsolute + \see see boxWidthAbsolute for details */ + void setBoxWidthAbsolute(double __value); + /*! \copydoc boxWidthAbsolute + \see see boxWidthAbsolute for details */ + double getBoxWidthAbsolute() const; + + /*! \copydoc drawBox + \see see drawBox for details */ + void setDrawBox(bool __value); + /*! \copydoc drawBox + \see see drawBox for details */ + bool getDrawBox() const; + + /*! \copydoc relativeWhiskerWidth + \see see relativeWhiskerWidth for details */ + void setRelativeWhiskerWidth(double __value); + /*! \copydoc relativeWhiskerWidth + \see see relativeWhiskerWidth for details */ + double getRelativeWhiskerWidth() const; + + /*! \copydoc relativeNotchIndent + \see see relativeNotchIndent for details */ + void setRelativeNotchIndent(double __value); + /*! \copydoc relativeNotchIndent + \see see relativeNotchIndent for details */ + double getRelativeNotchIndent() const; + + + /*! \brief set the line style of whisker lines */ + void setWhiskerLineStyle(Qt::PenStyle __value); + /*! \brief get the line style of whisker lines */ + Qt::PenStyle getWhiskerLineStyle() const; + + /*! \brief set the width [pt] of whisker lines */ + void setWhiskerLineWidth(double __value); + /*! \brief get the width [pt] of whisker lines */ + double getWhiskerLineWidth() const; + + /*! \brief set the color of whisker lines */ + void setWhiskerLineColor(QColor __value); + /*! \brief get the color of whisker lines */ + QColor getWhiskerLineColor() const; + + + /** \brief sets the dash offset for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setWhiskerLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getWhiskerLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setWhiskerLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getWhiskerLineDashPattern() const; + /** \brief sets the join style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + void setWhiskerLineJoinStyle(Qt::PenJoinStyle style); + /** \brief returns the join style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + Qt::PenJoinStyle getWhiskerLineJoinStyle() const; + /** \brief sets the cap style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + void setWhiskerLineCapStyle(Qt::PenCapStyle style); + /** \brief gets the cap style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + Qt::PenCapStyle getWhiskerLineCapStyle() const; + /** \brief sets the brush used to fill the line area of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + void setWhiskerLineBrush(const QBrush& style); + /** \brief gets the brush used to fill the line area of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + QBrush getWhiskerLineBrush() const; + + /** \brief build a pen to be used for drawing whiskers */ + QPen getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; + + + + /*! \brief set the line style of whisker cap lines */ + void setWhiskerCapLineStyle(Qt::PenStyle __value); + /*! \brief get the line style of whisker cap lines */ + Qt::PenStyle getWhiskerCapLineStyle() const; + + /*! \brief set the width [pt] of whisker cap lines */ + void setWhiskerCapLineWidth(double __value); + /*! \brief get the width [pt] of whisker cap lines */ + double getWhiskerCapLineWidth() const; + + /*! \brief set the color of whisker cap lines */ + void setWhiskerCapLineColor(QColor __value); + /*! \brief get the color of whisker cap lines */ + QColor getWhiskerCapLineColor() const; + + + /** \brief sets the dash offset for a custom dash style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setWhiskerCapLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getWhiskerCapLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setWhiskerCapLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getWhiskerCapLineDashPattern() const; + /** \brief sets the join style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + void setWhiskerCapLineJoinStyle(Qt::PenJoinStyle style); + /** \brief returns the join style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + Qt::PenJoinStyle getWhiskerCapLineJoinStyle() const; + /** \brief sets the cap style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + void setWhiskerCapLineCapStyle(Qt::PenCapStyle style); + /** \brief gets the cap style of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + Qt::PenCapStyle getWhiskerCapLineCapStyle() const; + /** \brief sets the brush used to fill the line area of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + void setWhiskerCapLineBrush(const QBrush& style); + /** \brief gets the brush used to fill the line area of whisker cap lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + QBrush getWhiskerCapLineBrush() const; + + /** \brief build a pen to be used for drawing whisker caps */ + QPen getWhiskerCapPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; + + + + + /** \brief modes of how to draw the mean in a boxplot */ + enum MeanMode { + MeanAsSymbol, /*!< \brief draw mean as a symbol (specified by the settings in JKQTPGraphSymbolStyleMixin) */ + MeanAsLine /*!< \brief draw mean as a lie (specified by the pen settings in JKQTPGraphSymbolStyleMixin) */ + }; + + /*! \copydoc meanMode + \see see meanMode for details */ + void setMeanMode(MeanMode __value); + /*! \copydoc meanMode + \see see meanMode for details */ + MeanMode getMeanMode() const; + + + /*! \brief set the line style of median lines */ + void setMedianLineStyle(Qt::PenStyle __value); + /*! \brief get the line style of median lines */ + Qt::PenStyle getMedianLineStyle() const; + + /*! \brief set the width [pt] of median lines */ + void setMedianLineWidth(double __value); + /*! \brief get the width [pt] of median lines */ + double getMedianLineWidth() const; + + /*! \brief set the color of median lines */ + void setMedianLineColor(QColor __value); + /*! \brief get the color of median lines */ + QColor getMedianLineColor() const; + + + /** \brief sets the dash offset for a custom dash style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setMedianLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getMedianLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setMedianLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getMedianLineDashPattern() const; + /** \brief sets the join style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + void setMedianLineJoinStyle(Qt::PenJoinStyle style); + /** \brief returns the join style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + Qt::PenJoinStyle getMedianLineJoinStyle() const; + /** \brief sets the cap style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + void setMedianLineCapStyle(Qt::PenCapStyle style); + /** \brief gets the cap style of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + Qt::PenCapStyle getMedianLineCapStyle() const; + /** \brief sets the brush used to fill the line area of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + void setMedianLineBrush(const QBrush& style); + /** \brief gets the brush used to fill the line area of median lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + QBrush getMedianLineBrush() const; + + /** \brief build a pen to be used for drawing medians */ + QPen getMedianPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; + + + + + + /*! \brief set the line style of Mean lines */ + void setMeanLineStyle(Qt::PenStyle __value); + /*! \brief get the line style of Mean lines */ + Qt::PenStyle getMeanLineStyle() const; + /** \brief sets the dash offset for a custom dash style of Mean lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setMeanLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of Mean lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getMeanLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of Mean lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setMeanLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of Mean lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getMeanLineDashPattern() const; + /** \brief set the type of the symbol for the mean */ + void setMeanSymbolType(JKQTPGraphSymbols __value); + /** \brief get the type of the symbol for the mean */ + JKQTPGraphSymbols getMeanSymbolType() const; + + /** \brief set the size (=diameter in pt) of the symbol for the mean (in pt) */ + void setMeanSize(double __value); + /** \brief get the size (=diameter in pt) of the symbol for the mean (in pt) */ + double getMeanSize() const; + + /** \brief set the color of the symbol for the mean, or mean line */ + void setMeanColor(const QColor & __value); + /** \brief set the color of the symbol for the mean, or mean line */ + QColor getMeanColor() const; + + /** \brief set the color of filling of the symbol for the mean */ + void setMeanFillColor(const QColor & __value); + /** \brief set the color of filling of the symbol for the mean */ + QColor getMeanFillColor() const; + + /** \brief set the line width of the symbol for the mean outline, or mean line (in pt) */ + void setMeanLineWidth(double __value); + /** \brief get the line width of the symbol for the mean outline, or mean line (in pt) */ + double getMeanLineWidth() const; + + /** \brief constructs a QPen from the line styling properties to draw the mean line */ + QPen getMeanLinePen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; + /** \brief constructs a QPen from the line styling properties to draw the mean symbol */ + QPen getMeanSymbolPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; + /** \brief constructs a QPen from the line styling properties */ + QBrush getMeanSymbolBrush(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; + + /*! \brief set the color of the graph (colors all elements, based on the given color \a c )*/ + void setBoxplotColor(QColor c, JKQTBasePlotter *parent); + + /*! \brief set the color of the graph (colors all elements, based on the given color \a c , sets background colors from \a bc )*/ + void setBoxplotColor(QColor c, QColor bc, JKQTBasePlotter *parent); + + + protected: + /*! \brief plot a symbol at location x,y (in painter coordinates), using the current style + + \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) + \param painter the QPainter to draw to + \param x x-coordinate of the symbol center + \param y y-coordinate of the symbol center + */ + void plotStyledMeanSymbol(JKQTBasePlotter* parent, JKQTPEnhancedPainter &painter, double x, double y) const; + /** \brief draws a vertical boxplot, with all coordinates/sizes given in coordinates of the given painter, + * using the style properties declared in this class. Provide a parameter with \c JKQTP_NAN of you + * don't want it to be drawn, or don't know its value + * + * \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) + * \param painter the QPainter to draw to + * \param xp x-coordinate of the boxplot center + * \param xpleft x-coordinate of the boxplot box left edge + * \param xpright x-coordinate of the boxplot box right edge + * \param minp y-coordinate of the minimum (lower whisker) + * \param q25p y-coordinate of the 25% quartile (lower box border) + * \param medianp y-coordinate the median + * \param q75p y-coordinate of the 75% quartile (upper box border) + * \param maxp y-coordinate of the maximum (upper whisker) + * \param meanp y-coordinate of the mean (symbol or line) + * \param notchLowerp y-coordinate of the lower (near \a qe5p ) end of the notch interval + * \param notchUpperp y-coordinate of the upper (near \a q75p ) end of the notch interval + */ + void plotVerticalBoxplot(JKQTBasePlotter* parent, JKQTPEnhancedPainter &painter, double xp, double xpleft, double xpright, double minp, double q25p, double medianp, double q75p, double maxp, double meanp=JKQTP_NAN, double notchLowerp=JKQTP_NAN, double notchUpperp=JKQTP_NAN) const; + + /** \brief draws a horizontal boxplot, with all coordinates/sizes given in coordinates of the given painter, + * using the style properties declared in this class. Provide a parameter with \c JKQTP_NAN of you + * don't want it to be drawn, or don't know its value + * + * \param parent parent JKQTBasePlotter of the graph that uses this mix-in (used e.g. for line-width transformation) + * \param painter the QPainter to draw to + * \param yp y-coordinate of the boxplot center + * \param ypbottom y-coordinate of the boxplot box bottom edge + * \param yptop y-coordinate of the boxplot box top edge + * \param minp x-coordinate of the minimum (lower whisker) + * \param q25p x-coordinate of the 25% quartile (lower box border) + * \param medianp x-coordinate the median + * \param q75p x-coordinate of the 75% quartile (upper box border) + * \param maxp x-coordinate of the maximum (upper whisker) + * \param meanp x-coordinate of the mean (symbol or line) + * \param notchLowerp x-coordinate of the lower (near \a qe5p ) end of the notch interval + * \param notchUpperp x-coordinate of the upper (near \a q75p ) end of the notch interval + */ + void plotHorizontalBoxplot(JKQTBasePlotter* parent, JKQTPEnhancedPainter &painter, double yp, double ypbottom, double yptop, double minp, double q25p, double medianp, double q75p, double maxp, double meanp=JKQTP_NAN, double notchLowerp=JKQTP_NAN, double notchUpperp=JKQTP_NAN) const; + + /** \brief draw a small, stylized, vertical symbol into \a rect that symbolizes a boxplot, e.g. in a plot legend */ + void plotVerticalKeyMarker(JKQTBasePlotter* parent, JKQTPEnhancedPainter &painter, const QRectF& rect); + + /** \brief draw a small, stylized, horizontal symbol into \a rect that symbolizes a boxplot, e.g. in a plot legend */ + void plotHorizontalKeyMarker(JKQTBasePlotter* parent, JKQTPEnhancedPainter &painter, const QRectF& rect); + private: + /** \brief which symbol to use for the datapoints */ + JKQTPGraphSymbols m_meanSymbolType; + /** \brief size (diameter in pt) of the symbol for the data points, given in pt */ + double m_meanSymbolSize; + /** \brief outline color of the symbol or line pen of the mean-line */ + QPen m_meanSymbolLinePen; + /** \brief color of the symbol filling */ + QColor m_meanSymbolFillColor; + /** \brief width (in pt) of the lines used to plot the symbol for the data points, given in pt */ + double m_meanSymbolLineWidth; + /** \brief line style of the whisker lines */ + QPen m_whiskerLinePen; + /** \brief line width (in pt) of the whisker lines */ + double whiskerLineWidth; + /** \brief line style of the whisker cap lines */ + QPen m_whiskerCapLinePen; + /** \brief line width (in pt) of the whisker cap lines */ + double whiskerCapLineWidth; + /** \brief line style of the median lines */ + QPen m_medianLinePen; + /** \brief line width (in pt) of the median lines */ + double medianLineWidth; + /** \brief width of box in pt. + * + * \note If several boxplots are drawn, the width is typically calculated, + * based on a relative width and the position distances, see JKQTPBoxplotVerticalGraph::boxWidthRelative */ + double boxWidthAbsolute; + /** \brief width of the whiskers, relative to the box width (default: 0.5) */ + double relativeWhiskerWidth; + /** \brief single-sided indention of the notch (if any), relative to the box width (default: 0.25) */ + double relativeNotchIndent; + + /** \brief specifies how to draw the mean (as a line of as a symbol, specified by the function in JKQTPGraphSymbolStyleMixin) */ + MeanMode meanMode; + /** \brief enables/disables drawing of the actual box of the boxplot (\c false leads to Tufte Style boxplots ) */ + bool drawBox; +}; + + + + + +#endif // jkqtpgraphsboxplotstylingmixins_H diff --git a/lib/jkqtplottertools/jkqtptools.h b/lib/jkqtplottertools/jkqtptools.h index 6e2d061f4e..2429e5c650 100644 --- a/lib/jkqtplottertools/jkqtptools.h +++ b/lib/jkqtplottertools/jkqtptools.h @@ -75,6 +75,20 @@ class JKQTPEnhancedPainter; // forward class JKQTBasePlotter; // forward declaration +/** \brief double-value NotANumber + * \ingroup jkqtptools_math + */ +#define JKQTP_DOUBLE_NAN (std::numeric_limits::signaling_NaN()) + +/** \brief float-value NotANumber + * \ingroup jkqtptools_math + */ +#define JKQTP_FLOAT_NAN (std::numeric_limits::signaling_NaN()) + +/** \brief double-value NotANumber + * \ingroup jkqtptools_math + */ +#define JKQTP_NAN JKQTP_DOUBLE_NAN /** \brief C++11 finally construct @@ -110,7 +124,7 @@ private: }; /** \brief C++11 finally construct - * \ingroup jkqtptools + * \ingroup jkqtptools_math * \see JKQTPFinalAct */ template @@ -120,7 +134,7 @@ inline JKQTPFinalAct JKQTPFinally(const F& f) noexcept } /** \brief C++11 finally construct - * \ingroup jkqtptools + * \ingroup jkqtptools_math * \see JKQTPFinalAct */ template @@ -150,13 +164,13 @@ enum JKQTPUserActionMarkerType { /** \brief convert a JKQTPUserActionMarkerType to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPUserActionMarkerType(), JKQTPUserActionMarkerType */ JKQTP_LIB_EXPORT QString JKQTPUserActionMarkerType2String(JKQTPUserActionMarkerType act); /** \brief convert a QString (created by JKQTPUserActionMarkerType2String() ) to JKQTPUserActionMarkerType - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPUserActionMarkerType2String(), JKQTPUserActionMarkerType */ @@ -184,13 +198,13 @@ enum JKQTPMouseDragActions { /** \brief convert a JKQTPMouseDragActions to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPMouseDragActions(), JKQTPMouseDragActions */ JKQTP_LIB_EXPORT QString JKQTPMouseDragActions2String(JKQTPMouseDragActions act); /** \brief convert a QString (created by JKQTPMouseDragActions2String() ) to JKQTPMouseDragActions - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPMouseDragActions2String(), JKQTPMouseDragActions */ @@ -208,13 +222,13 @@ enum JKQTPMouseDoubleClickActions { }; /** \brief convert a JKQTPMouseDoubleClickActions to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPMouseDoubleClickActions(), JKQTPMouseDoubleClickActions */ JKQTP_LIB_EXPORT QString JKQTPMouseDoubleClickActions2String(JKQTPMouseDoubleClickActions act); /** \brief convert a QString (created by JKQTPMouseDoubleClickActions2String() ) to JKQTPMouseDoubleClickActions - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPMouseDoubleClickActions2String(), JKQTPMouseDoubleClickActions */ @@ -229,13 +243,13 @@ enum JKQTPMouseWheelActions { }; /** \brief convert a JKQTPMouseWheelActions to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPMouseWheelActions(), JKQTPMouseWheelActions */ JKQTP_LIB_EXPORT QString JKQTPMouseWheelActions2String(JKQTPMouseWheelActions act); /** \brief convert a QString (created by JKQTPMouseWheelActions2String() ) to JKQTPMouseWheelActions - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPMouseWheelActions2String(), JKQTPMouseWheelActions */ @@ -252,13 +266,13 @@ enum JKQTPContextMenuModes { }; /** \brief convert a JKQTPContextMenuModes to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPContextMenuModes(), JKQTPContextMenuModes */ JKQTP_LIB_EXPORT QString JKQTPContextMenuModes2String(JKQTPContextMenuModes act); /** \brief convert a QString (created by JKQTPContextMenuModes2String() ) to JKQTPContextMenuModes - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPContextMenuModes2String(), JKQTPContextMenuModes */ @@ -274,21 +288,21 @@ typedef QHash, JKQTPMouseDoubleClic typedef JKQTPMouseDoubleClickActionsHashMap::const_iterator JKQTPMouseDoubleClickActionsHashMapIterator; /** \brief converts a QT::PenStyle into a string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString jkqtp_QPenStyle2String(Qt::PenStyle style); /** \brief converts a QString into a Qt::PenStyle - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT Qt::PenStyle jkqtp_String2QPenStyle(const QString& style); /** \brief converts a QT::BrushStyle into a string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString jkqtp_QBrushStyle2String(Qt::BrushStyle style); /** \brief converts a QString into a Qt::BrushStyle - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT Qt::BrushStyle jkqtp_String2QBrushStyle(const QString& style); @@ -312,14 +326,14 @@ enum JKQTPColorDerivationMode { }; /** \brief use a JKQTPColorDerivationMode to derive a color from \a col as specified - * \ingroup jkqtptools + * \ingroup jkqtptools_drawing * * \see JKQTPColorDerivationMode */ JKQTP_LIB_EXPORT QColor JKQTPGetDerivedColor(JKQTPColorDerivationMode mode, const QColor& col); /** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alphaF - * \ingroup jkqtptools + * \ingroup jkqtptools_drawing * \see QColorWithAlpha() */ inline QColor QColorWithAlphaF(const QColor& color, qreal alphaF) { @@ -329,7 +343,7 @@ inline QColor QColorWithAlphaF(const QColor& color, qreal alphaF) { } /** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alpha - * \ingroup jkqtptools + * \ingroup jkqtptools_drawing * \see QColorWithAlphaF() */ inline QColor QColorWithAlpha(const QColor& color, int alpha) { @@ -339,13 +353,13 @@ inline QColor QColorWithAlpha(const QColor& color, int alpha) { } /** \brief convert a JKQTPColorDerivationMode to a QString - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see String2JKQTPColorDerivationMode(), JKQTPColorDerivationMode */ JKQTP_LIB_EXPORT QString JKQTPColorDerivationMode2String(JKQTPColorDerivationMode mode); /** \brief convert a QString (created by JKQTPColorDerivationMode2String() ) to JKQTPColorDerivationMode - * \ingroup jkqtptools + * \ingroup jkqtptools_string * * \see JKQTPColorDerivationMode2String(), JKQTPColorDerivationMode */ @@ -368,34 +382,34 @@ enum JKQTPCADrawMode { }; /** \brief determines whether JKQTPCADrawMode has the line - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT bool JKQTPCADrawModeHasLine(JKQTPCADrawMode pos); /** \brief determines whether JKQTPCADrawMode has ticks - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT bool JKQTPCADrawModeHasTicks(JKQTPCADrawMode pos); /** \brief determines whether JKQTPCADrawMode has tick labels - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT bool JKQTPCADrawModeHasTickLabels(JKQTPCADrawMode pos); /** \brief determines whether JKQTPCADrawMode has the axis label - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT bool JKQTPCADrawModeHasAxisLabel(JKQTPCADrawMode pos); /** \brief converts a JKQTPCADrawMode variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPCADrawMode2String(JKQTPCADrawMode pos); /** \brief converts a string into a JKQTPCADrawMode - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPCADrawMode String2JKQTPCADrawMode(const QString& pos); @@ -422,23 +436,23 @@ enum JKQTPLabelTickMode { }; /** \brief converts a JKQTPLabelTickMode variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPLabelTickMode2String(JKQTPLabelTickMode pos); /** \brief converts a string into a JKQTPLabelTickMode - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPLabelTickMode String2JKQTPLabelTickMode(const QString& pos); /** \brief converts a JKQTPCALabelType variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPCALabelType2String(JKQTPCALabelType pos); /** \brief converts a string into a JKQTPCALabelType - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPCALabelType String2JKQTPCALabelType(const QString& pos); @@ -453,12 +467,12 @@ enum JKQTPLabelPosition { /** \brief converts a JKQTPLabelPosition variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPLabelPosition2String(JKQTPLabelPosition pos); /** \brief converts a string into a JKQTPLabelPosition - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPLabelPosition String2JKQTPLabelPosition(const QString& pos); @@ -482,12 +496,12 @@ enum JKQTPKeyPosition { /** \brief converts a JKQTPLabelPosition variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqjkqtptools_stringtptools */ JKQTP_LIB_EXPORT QString JKQTPKeyPosition2String(JKQTPKeyPosition pos); /** \brief converts a string into a JKQTPLabelPosition - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPKeyPosition String2JKQTPKeyPosition(const QString& pos); @@ -502,12 +516,12 @@ enum JKQTPKeyLayout { /** \brief converts a JKQTPKeyLayout variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPKeyLayout2String(JKQTPKeyLayout pos); /** \brief converts a String into a JKQTPKeyLayout - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPKeyLayout String2JKQTPKeyLayout(const QString& pos); @@ -549,12 +563,12 @@ enum JKQTPErrorPlotstyle { /** \brief converts a JKQTPErrorPlotstyle variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPErrorPlotstyle2String(JKQTPErrorPlotstyle pos); /** \brief converts a String into a JKQTPErrorPlotstyle - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPErrorPlotstyle String2JKQTPErrorPlotstyle(const QString& pos); @@ -606,22 +620,22 @@ enum JKQTPGraphSymbols { }; /** \brief converts a JKQTPGraphSymbols variable into a identifier string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPGraphSymbols2String(JKQTPGraphSymbols pos); /** \brief converts a JKQTPGraphSymbols variable into a human-readable string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT QString JKQTPGraphSymbols2NameString(JKQTPGraphSymbols pos); /** \brief converts a String into a JKQTPGraphSymbols - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ JKQTP_LIB_EXPORT JKQTPGraphSymbols String2JKQTPGraphSymbols(const QString& pos); /** \brief convert a double to a string, using the loacle "C" - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ inline QString JKQTPCDoubleToQString(double value) { QLocale loc=QLocale::c(); @@ -630,7 +644,7 @@ inline QString JKQTPCDoubleToQString(double value) { } /** \brief convert a double to a string - * \ingroup jkqtptools + * \ingroup jkqtptools_string */ inline QString JKQTPDoubleToQString(double value, int prec = 10, char f = 'g', QChar decimalSeparator='.') { QLocale loc=QLocale::c(); @@ -645,7 +659,7 @@ inline QString JKQTPDoubleToQString(double value, int prec = 10, char f = 'g', Q /** \brief rotate a rectangle by given angle (rotates all points around the center of the rectangle and returns it as a QPolygonF) - * \ingroup jkqtptools + * \ingroup jkqtptools_math */ JKQTP_LIB_EXPORT QPolygonF jkqtpRotateRect(QRectF r, double angle); @@ -867,7 +881,7 @@ JKQTP_LIB_EXPORT std::string jkqtp_floattohtmlstr(double data, int past_comma=5, JKQTP_LIB_EXPORT std::string jkqtp_chartostr(char data); /** \brief wandelt einen Datentyp in einen double um, wird von JKQTPDatastore zur Wandlung benutzt - * \ingroup jkqtptools + * \ingroup jkqtptools_math * * Diese Funktion nutzt per default static_cast(), kann aber für spezielle Datentypen überschrieben werden, etwa für bool */ @@ -879,7 +893,7 @@ inline constexpr double jkqtp_todouble(const T& d) { /** \brief wandelt einen boolean in einen double um, wird von JKQTPDatastore zur Wandlung benutzt, * Spezialisierung für bool (true -> 1.0, false -> 0.0) - * \ingroup jkqtptools */ + * \ingroup jkqtptools_math */ template<> inline constexpr double jkqtp_todouble(const bool& d) { return static_cast((d)?1.0:0.0); @@ -912,7 +926,8 @@ JKQTP_LIB_EXPORT QString JKQTPSpecialLineType2String(JKQTPSpecialLineType pos); */ JKQTP_LIB_EXPORT JKQTPSpecialLineType String2JKQTPSpecialLineType(const QString& pos); -/** \brief round a double using round() and convert it to a specified type T (static_cast!) */ +/** \brief round a double using round() and convert it to a specified type T (static_cast!) + * \ingroup jkqtptools_math */ template inline T jkqtp_roundTo(const double& v) { return static_cast(round(v)); @@ -920,19 +935,22 @@ inline T jkqtp_roundTo(const double& v) { -/** \brief compare two floats \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality */ +/** \brief compare two floats \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality + * \ingroup jkqtptools_math */ inline bool jkqtp_approximatelyEqual(float a, float b, float epsilon=2.0*std::numeric_limits::epsilon()) { return fabsf(a - b) <= epsilon; } -/** \brief compare two doubles \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality */ +/** \brief compare two doubles \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality + * \ingroup jkqtptools_math */ inline bool jkqtp_approximatelyEqual(double a, double b, double epsilon=2.0*std::numeric_limits::epsilon()) { return fabs(a - b) <= epsilon; } -/** \brief returns the quare of the value \a v, i.e. \c v*v */ +/** \brief returns the quare of the value \a v, i.e. \c v*v + * \ingroup jkqtptools_math */ template inline T jkqtp_sqr(const T& v) { return v*v; diff --git a/screenshots/jkqtplotter_simpletest_boxplot.png b/screenshots/jkqtplotter_simpletest_boxplot.png index 55f844c8f4a130e90d8b54e2382df87997f5d955..2786aa119cba0e3135037ed18b783a25bf49c810 100644 GIT binary patch literal 30900 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 literal 35306 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 QgFxIBk-C*7to8W+011#Q>i_@% diff --git a/screenshots/jkqtplotter_simpletest_boxplot_small.png b/screenshots/jkqtplotter_simpletest_boxplot_small.png index 11e72a4e40e24fceb3f3770d4f580f762ada49f9..c7d5ba1b298485291f5a8336f3bfb9343e691143 100644 GIT binary patch literal 11865 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%0A$5vW)o;@D_27_AmcAOGn>G`z5D)==B;<8 x@aSR=D-rPBxc_+Rr?qPvBb4T_x)2sZ{~xDI@BWdOSiS%N002ovPDHLkV1k0~k52#q diff --git a/screenshots/plot_boxplothorizontalelement.png b/screenshots/plot_boxplothorizontalelement.png deleted file mode 100644 index 6833d4e9b39ff8d820b6dfecf0078d3cef39b810..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4496 zcma);WmFVgyM~9B?vh4Qa*!GjMTQ=_n?a<9hL>(+kW!?(K|n;hOG;vfMv;`70R)sB z286@=edqi?KlXn1de&a|kL!N+z4jYD9W`>2ha><1fLude*#H2*DY-ubAK>2aH_K5k z0RR#i7cf}Q*Fa5)Q$qzT4FpL`i%5t90f4~#g3JIT!zBjzRF6!L-g~Nq^l3L|16+0T z9`#hw$3S8#&Hi@)ZfRvBFJ=AI$_Ekx8X_HN zgN_k->l~NiZbdy)t4_yZi=BXXH!%cXw9JSj$x6)VexioslM|hwL^x!>0eCRLhF4RQ z5(7pRHwQQLdlD>%7Q@)nNx^w_{dn$q(g5JDD80j+8wk+LPC}hvmaLc=$7B^u^Lg8J z$Ff@`wUOeQNN)3J36nJ66Jg8HiyQ|^(5Xc1Q|1X@_Prkv zY$N007+k45^cA`3bw##Y1jld?-TJdLP~Y(M#*3w^C{I*sacX6@Sbn9AC&*EXQ^XYI zVkif1%a=Mb-~7N(PiLCpR&YI33}*)jJf`L(4tXUseH=zQqK0>cNSw*ZF1VhGz6~>N z*Sh`6z!Q;Tucj=~PNR?fm3w1>E6E8^QN-I5iy_o!>>^CH3iA19&p!h2|2I3Tjk%GTTCKah- zUw@^dH-P(bg1@phzBYTuvW-Uorq*Lkf4~b?QpcrNJSaB!z*-ZxU*d?iL<{&m>;#a5 z+luv_X|VLcM32OYD+eq-Q^N?Fpt`aTQeqhg#(qo4a)?H^^=EkDg;E{G>JDaYP@9oF zkE)`Mq@tE9O%$hQ_@b(m8puOT%~ku3rX1Hr@y9#%a*mD!_0+1bmUM(FDnLE0bkcDS z`q!JKnI$GA(q%RJM0y1up3NK23%HV;Q){cbl_F-4Xn>!v9CJaUsH$mk-ZUG!2~B+_ zi=`)wDX~uirZ7clvGUP3;WjZhvCO4_UNes**;O`}eUw{dJxCxQ_WAr025cn>p$ef1 zA&^fAi+Qx^=hZ4}YxPtoUTDa8!@`T-%hZduow=K4jp{gwa`^Q3#2*KYYA9v+gXbwl zTmrO7#Ghi-l^)xPl)Rr-m4&oJ0$=dZoX6`7d6h=C$C+t7Req|=%G=AUukOerEf~ea z<<51;U%W@#+ynS zof%nu%&s>p2~_r0|5Ht4Gp7EgZb;vv!l=y8XfJNIS;BZp6=Vbg2Q~R5o)GM)(FqU7 zZ-Rg7CkR{%I0@Jr#n$LL7dpHvb|8@N<7dpgH73(_Yf6lgYU7HTGs zd(#WDm9Wg2HU!tRHl4}TUk=YK4y&aYKJnGc(v zn{TTQs9v8_bjfy!b=!9RH6vU5$B)82WrFo6|2+tfT3L*hLP$Q6G<80jW1Y@loLxMb z8=tM2l`A_p%KLO!Qc%+azK*>pr!XGXRx54-qso!?aU_FjsmKqn&VZGEQvQGac{|TL zV>+J%j|A%nzYabOzC0tw3jgK#%ZBa28WPG8auE^`))BUm|A`YGq#Lx3`x{rEoRs`B zNt(%@SwX_&357UP#zU&tO-b5Y#@ulh>Vu%OAD7U6vg#hZL?+!N0|C|oStQ^Hwn>8B zE(Ba;nn8y_DUmRdMT=%GEoTtskYX__5+gz?(j{DE&TKYp>E5*8hIMxLEbv%$4jYYo zN$YIrJZFDeTbCp9t##z$ht-MIdPgnlpQ$hpCy&v#W&41+LRXHLeFMGUZewD~V!oCj z>}F^Bfin$@e+UytNbKDm3j&nngFtov$nBmjE)AIf3jKb?$XE%}>nZBL!JIBM zF9bb@mZ!RgLZ;!Hv^$1}zU!t_GD~d>0pn9^p0C#hBbp=L-AUiE;8@_SMD9jbD~|SO zM1{R5FD7`g@PaZL5v?+yz~!Y5{d)1P>y#WtiVAogJsmlHSaSI#X)yD37)J^*C22iz z1d|=DKGjTLWG8eiI+LKDyN7#%`&cAMS5wpmWlKU zD#J3;?XVBa@jnE<%eK25Rn};8KmvIgA$1TT&2`URk6ug$!ZgD+?8p0NhtHEGuql&C zlb?$R%PVbc0;Zx_R|N8TN&ZNrN)Z)^k9(s%j?!zJp%iDAZ$GCrhdE)a-HBSt%4zql)<6pxv%H5X2kg%t1~#{iR#a_;OdMZw%qf`o zTI~cb5r278N?W9}Ta^DS!+(EoZ+p(Z2NHao|3<;LPORJWH*9+86csvEuy^_EdC=PV zO#>;CF~#PU^{>utuWH}^@Zv3^YYsU=HbQwgE4))o-uj5SP$qOU;W}f^w5PtXi^1z~ z_UldR&jbB$o@?suTs>o5S7;M#9jeXOV`|0RmocnuyKuHA;X3z{C0z1vgY`bA!n1t^ zx!=%%77!+}QNA#KvFA3Jz#EOlw4AEp=R$W@*OS{z z0eyit65{moQnyxTH*@uQwjcVw-_0I59Q%Dg`)kTv?`V_NtsmjLA#&h;*OeVW`=sNz z;aKQ-b~yTq>Fm!@Rg!K|INoLK>GfML$H(_SNn$T`b6)^}V({OEGwS)_6#zhZr=k49 zC@}xfTEWv$gRUSRpV4L7;Lyb5M1E03%9^L#Xt_kPWNCMYK2~H_xH_6{Mz5c;cx3tX zkyVtz=Zw^N?gwezf&WOX7kN5%qv#gT^Fr1Xdbi{YgKXEjJ3F~!&%)OIt$9aAMhIJk z=%ks>GJXs@G&|4d%kkCIDAX}YUG70)?^(n%z<89a46Tfeof}q}qOwHOSIx?*jQJC@ zYUoO6bw@}J=B(QDEK<3I)nLYRR5s|we%gI6DW+|qLwFUIq@kPVqx-STbY zKp_46=LtuUs-TdI$puhjUg&8z;SLp_RH4qxUGEzx-3F}EvfxqKXsAIJ$EVBVu{8cy z5}?4-IFI(*+%=}|u>RKXWY4iXJK^|$Q+zG%_3ySuF9VLhJg+wOvz0?EFD@>ct!}5H z5=l?cGsx*_XV7+{htva>t;l8!CiT}bt;-NQk)=whg|{K;CCSbZ!TGNHv%9+Hgt({{ z*UT}{>buq=K%}H4#el)q9=_Xx)|v4)JVo3|$EE@2X4di9mTxKPQum0r+@S14JVT++ zjysvFHxgG%qpppg%;Ip08_?9`=ok^Y-(_E!nV6-4-Bo4|e?ml;10{#zEg zmKerWSc(c}%lo83j_{vu!v}LqI!n0)6SIi8oKF+kT11h}&Yi5d<@@MCkb+w0-yhUJ zyU%3_2eV(Wk^h84w!i>RP(s9&!(aug1irsN-wlZ9U~|T8gr!3U$6?rv-?`>Wn$J&B zRMM29?2W$bpoP>UHo$D@o=?BUdCGve<8&{Rgm|JbM*uOS}&|KP+S2g01_% zhJV!Fd+SS~`0RhFG}RlUcnc4{h&$@34XQ8=fQUHp?x7BjbAk2VrVic0c&`>AL1K#< zW&fK1#FvS7#dwMqlGYSB2L5O7T59b0q(-Is+Xx;X(J{tWbARtkl6_;gBt#QI?E>EIVJ8+XQo=;*hu@a$=vy%}c^ zJ|ww{_NLDjz;-HIO!rU(9y(J;`1ANaVgY8)p>+u@kEhA*yU^-Ce$g$id~({iJ{rg= z;(kS1rKo&N^saXMvrip90+6ML~V**vVbZINKOSLGxrfT*uC{v2Oz!Ur}~2 zl(&veV0HN`$Kv6PbUi< zzKLiE9S-5uJiqXr+o5{ufw`9;rwD8{h>uWs+2{&^tgrE19^0C5tL};CGNpt0fST?X zPD1p+`#2b6Ss(%LFD@t+jg%wr4P9jj7c=>P1p48W$*lWcdrNbM=>J*M!1LxYWNK9# zXyALU1Un_+$}g9th*)vYSxIQb;j8xrPrNNoHKLbpwQ$e(k}^nW61i z1zP;#M;Ogn_iQ640+&OybFef$kEn9&wF+*GNlsV1-LFqYqsK(1{h_<;}3}QND#-Mys|~E zK%?Pc)@K?0F)5ufKC3XOd8+4u*yF$xj1z;xAvEFvXxMXX#cA*Ng3xM$0&{zOvK@#6 zf0Nh@Z5MP1_tK7n^|}A90Ru9~Wruwy(3ceatZfVq~|aoE3V}?0B78V6|0{ssFqJ@ zPF_J?%2nL89WotkbCHvB`ZmKhB6t^s;30OOSOj6{0H4a78sNR&upsh*Iir6#J_X`V1U9y5#!jkI*QUQH1{7E3rr2Qx1kG=0GA4iG&~+)iJ`=(MZt&# z*+ho!tCIQVjM(o)rtu6*@>1{}SP(Y=BErN=9pETBPC(u2)1){Xjhnz^<(=cgu22?D zdRGJN{K1J1nh0nUv+>w=_JuXM3@<<(MzIOwT&G~^yz#k{sR_WaL_w|!iMjFGPI@Vf zHHi$t%fTAbP_Nn}QO~WW<$rQvj}}Ma~A>Dm1C!s*KviIbvS-VWB|5@f3*uLIR_P9-Wtg8Jg^%W5n?D9&b^&88XMS1XP=2s0 zct6|(L9xDZ1SQ#%yh%!r#2*`Uz$(TbFO?PVYScT(}beY#b-k072Eype4 zE%*KV{Ehu1{dfFNkElsvm;9G^No^!kpdt_qqy$z08|n6=#JX9#ZK5utsuSW9p2o}G z_68|K&F|Aojmf$F)BZ|L_O+aq^Q7IIQC5c`sQ&$*uKx41vUPI0((k1?q0ysvM<~}? zN2A5Z*$vp$;(&3SddyR)m~I!RMC(cMaPeE>tzrdMAj{szu63J@r01^gd2TvH`+!-W1E|akBv`aK=?TY1BxMEGqpdW{N1xkyejUQ?W`?dHGTCrmuDwB zC&KPMKX9!*0prmtEPqUQJQpo+a`TNdK0~-)?vaba!S%sO*Rt1~WY%O0A!{M;VEvux zp(xdoLQ2&cRfe$9F!e5Fu!ol2z)4c;Aszk}-X}6_JY;+ad-^rLJ0lXslSs{QtC~9a zwmpk6<3vYDi``&Y24yv08{aS=0f9ki7x@>n6|)rO6hGr4=OBqKG}WEiv_ZGL$z@k!mnEOdoyt9hFeHgLBLsliloAemSXp zwzS>gmi~`|6Jce+Hf4&;hZmE)_pwzC-5Zn_ldeRqFHT`U-I9R_TiBEV{3`wG-1vEz+N$zNgeXeHy{K;LJzN zmuI(rEHvJQSV-U`d46!$ws}%HXbvW3DrIheF|xNXZjAe+TdQjgLeASb88tL)qP%sE zwGu4!1FD>N%D#VV^=qx(-k+N?FMniVed<EAGr7s5`J=gm zbBH^~-Kx<6|N4|zk9tP5aiwY~E@9b3{!*AppA^_h+~R(C$G5(*zqEWcV3=^qGo@_q ziTvX`PyIEvh^4?_tswVdy7%VB#_uVIHeG*0ZmhCrmE;%qJ(uzMLwq1EZ{u`Z#qZbg zMa``-jzn8Wo9&k09`8Img9=xv&UqApcY#XLT+uC(N;bQoe7V3C^m+P}MO$@#E4#bo43fF5vDxHRez>Wu zxM$ZDuH>*#Bc$SVeH8R%9eifr8!?7By!S)1Ul1iEsbWj?z0jUb#gzA|h+ZSlM}E)y zbogFCrP!4Ixk4UYOjYMRspy!yp4@dJc+DMMT7asZZ8N_Z2YW7wZ@FH#X8Ew(Zzj|b zL{+ka*3WJq?eCVy8x{mnoJJg;|I5Q!{S{|EI|M-76dcfE!?KgsPcu z?oM9Ks~<4d=qH_&@C@2W7)_t)n&X%e!4?`ID#Q3(!_bzMVZ(7?S3C~Ps&f@WKg102 zUC)*1O1eP~q65=4y1A1IFI@rD6}!yf+H-$2NHUpszRf>v3S2pY%PSb z$bQ|7cH-u*r+bpVnfCW|h`Xtm;N?i;_)S{%#);S&#;Igk$;~s9c=p>v@sB(~Up2O! zKBy)e#?~i)zNZp_h_Zyg)LpY}zC!{dlS8j?v_%tyfMTYz_Qegau*|`}`T6Q4!tSp5 zIEzf!nB(gH{?^0VJ~*XxBP|94 z&V7yBa&(R&2b(wyh3gmDX#dE!X>7J9*QJg0NDl^?YuJ|GT_A|0<%BRiN@XpWJ z5viQf80*gl>&wfb71|^WcBc02N3v1p`!4du%cxnO%p3KLjhaQFdc&7VXjn$!n#{zT=tLTqy#0Gv&->!U%FtF5I;YDyoU*$ROvt`P&@IVMWJT( zdXBc&I-&n|T}nr$0}YBN4rcbwa{Ov1uz1NVTkGP*>Ui3nw;R!c*cjTbLN#CmMK*Xc z5gCM8;*XF^1<_I+C`?4cV|Fow_=tpNl@KtpQfyE?cWOm N&{j7%ppy!->es8?@ALE{32&}!=o@@`m~i0)m1tiak?O@H4sNZI}xI z0d+0zKf(rw4{-41*~f}{kMB7=eC%fGY(b#pY++&V^2p(_vGz%@WXw`o;l}-^#`B4! z73aGL0?ATH?&jAm($#6qQ{SmxtaLRmImtcMZNq2$nU(v5tC(xBQQr>ig)h;X^pf#h zORThKa_g(Yt(VwC#L`j%%%&$h?rCyt(L>kM^&dmol_S9a?$f&OHDQP^77W^#FVw{t z?##wBdu=S_L1Wc8QH^jkZ+}B_X!&lEr(E92W=hP-`Lbzaq0gHms620e@O#{!W%+q8 zuf!0%Hir^J30fb`Z)oDb2EP>%eoaX!40+c4O%}0yFAu@`dqu&p&+f?wExz;JVzN(n zLNzUpZzodB?8CI=7m}Jjx`)3%_+H1nnFwt;@;^V1?ik|s_xtzLBL_GC_46oJ>*(if zDbI=LTY04`2QC34Bc->JCWhjIFh%ct=d)dexI64GIvo}|cqjE8T@J=zi-~&A!XFxTtLUd|U*N9SWbDNKuT{H&2 zo#+#imcJGpytX&S^SrwL+>amPx$@b`eIc*$@SN2NxKNn7tss8?{8X-sb+w~Azv8)! z_e=42BoBVN*BzGsX;N*1um52x?93O5t+{z`aRk}t32TM&ir?!|$y`;{E@jOuEOtMEe z(JJU@?FWCXao2gTfcL~q`)MQR2FYZvt(N#?vD|Pj3Ho~^x38s|7Knz+podtKJoY=U z@3sg?CBh)6d=38OB?TNMFX*xvhTIYsWU^RmUDp|jH{ zU!XW7{x9{t;OCXPR8Df6>o&|54)#y4F3&twBjkgwJVt3JLC_JiCMoB?6*6!%;l1vO za3pqp*K%~P!f9bxvx;kahgAl<*e_Ovu~|k2=6RXfv3kRo9zNpX{W;uLiP&jvOZFKT zKHQ=@@HtSc|5mkqVl`Gj{VUXFp?O!ZApLV&QsabN(p|j4@_g2fj2V*&(XDM&W?8|4 z!;7nL2M;YBs~EqLVK~*}NdA(LobY42gp^*ZZ&7x!LMQtF;rq)g!z)~4kRwKMGl zk7BDDv%UOx0`8dEqWHeKgu~qFxVd9B-+fhMz@LG>|HUS+0f<19-4gsxTICDySc^GA zYx*Q`{;vW-YAInYS4~{cm`E8|@>}|weERW4)t)`8s!)+~C6+`6Hmoyp30a1BVB_8G z-3n2k8UW^Yv@o zYb3vJ&=<~Cjkch~O;e&d*YsOXg3;ZCk-UcoTiU$<*`zoe!xr4B2xtxH7QdpM{i z+NLbA?}bmYHdjwLRvap_=&uUrtY(}R@HXY9J%3~Qxm*3D2o%f9M)#9Wk+VZ->QM$b zE`-;ZktcTLxm(q@3lznBtcX!Yv0qwjsxg-AW-kycpYxREpfMdSbo_xw598pqV~%^6 z!}>MX{Uw;^kk71)8+G4d(l`NHclMgq&#$A1!-WzP1R*BLbGLB5mHGOKil;J#dtL#u z=$<&~$CG2r{a4-4msAt36iYAH2YOvmiH@rD^I8>bU>jw4{J<|~Rq>(NL|SL?kW~7c znQ1m$MuY_ytOMpLEN?Z=<)~X(mFrenq_t{17?^AnXi3^{e;ist_+HMIHzAA*;e&&GPg$}-I zoj~@B8Y|>l5cV4+A13tr?3TWV)e2dOVb$BUajdFfU@%PAjC z|FR{Yg5vpVhN}5WJ6hn9%O~l(wXZHt_SCORct7~4eULrN7!mL8CE;-6`5I3jIlfSf z=rTU-$50A*$M>EvdN|*Kv`7-*5OV^x)o`5E7`wdt+B>FT$>d;pmnDWK7<$PIdxdrU zDnF`T6bq>=gH^mR1SP$sYP+h!wMT-OCC5+_@%=e5nTeMx|5RLjVAc9T>DQ^5Vx?EZ zn=e?*&xYe~T6B|GT!vw*nUDG4JFcwaZngg_@cQo6V%tr99m?j|9}UHOaRTrIeWgOWqstN9YFTzS-e9YV0w* zPjBdBInDrl#D*7txqYXqW_*OB8m(>nIl;@Xp;}se7W*KO^)*jP?fgsP-BlHbeTj{5@v9Sw2!OkxuTB>K}7C*&iD&d1=ck};+7gRTed z%TFOF_2w(){VNqcR4pVxklgwz?3MQpJffjEQz$T1%7Eh>2by=1y$!~ws%>(IQxxH1 z_Hs7z<)@qvUaPt)xc#Sa-Xki>rz3@z!HI0yVWi=L%8(TW z@8EaSHW+)j1PS2eSD=%*lMa#cuEc10V~Ox5gY=1-6{qkv6e&7e`n(7VaS1{N-J?|Q z`x?Dq5*^Lpn4}pAi(-F0B*j+e&K2Xmn$yZF6)mIb;@q^c5f;rRlAxJn%Yoa2H58nV zO_W@8u;R*#1Uo|ooyYc-RFUu?izF`X>Y|sg;r^Exni-#;nx=L5j6VnU91?p|0dmah zm)jvy^_0KvmE;Ouwwb$~;?t>@64Uk<`xCx**VNV>u{H-c4Y+8|u2J^d^ zft}{U-A0R+&(A=Qf*6XwXG(M~cm$&3AL4lZ3|{-H;V+Pp26n>Al*> z_0jv4#MJUwq*cRZw-juz3F0$Nx^kGz4!50&T~W7}xP`t&l=hfn#nSwUTdK=y*ldD@IWSy zU+Q8a{alK1beP4m=_Dh!;chbPTuw4*ZU~LkvM)^+?$5RZ-iOHyfbYRIgetfF`9}Ei zDt^`$X`_hyvD3-2jz8p>Ka_z>82ex?T=!#4d}eBkqI|P0K3Mt9k9aPnuD8h^4h7m| zagw1^V~jn%_!7$8aS;(f8hOm54u5*G<`f7O8%Q-YiEe$?1%R{`c@oA z7ZxAp-X9BO-W(gqZ1kgKof$02qvx%X7#fgcc)Ov^{PHyTP-8DT zX;-zs$zjwGU0VEUD$eGU+tMPjNN+}ZlFDG4 z^p+uWZrQ^Gr+U-c0IZzd2Dn_uro?nYXP`|kt)`Syl(x=_Uz|;hk?UJ5xcQ-1Y4Off zyaV?>u;JF&z-%48Ny@rNuOaU5efD=YmPSW`&AW9?5~r%xJ5<3FN`w7G9t^vUVjb2AqJp zXg|CXJB6dp;P%exCJ%lVd4`VuyUD-_ypy$UtI8@Tiob!_+I6NpRt!y3r zlY3#HC`(o(z9jAvChiV!MD;A-foZ_)V4ay(e%V$WkgWUUklmT|WUu!e8L-(9;ct4b z{TAMD+*Rc`A!}pTl;v)%k;1!CAXMXm^-m+!<3$&;3%{-Uty``CYR{`!4Wda=lRey9 zn~X78B%bNaH?5V~U%$tEJ62}r7hCC9vX1m-!Sd{Z&LUEHM3-TgKR)KI4aqU=8D+O| zP8F$t^jSVyK#>8x?zgTiA1#BFvBIEPqX^(tduN&4;V*;?-6xk@glm;iUS4Ndr%SzT zUuME4XQ7qJ8#jNa;>$N}oqO za;+gZ-C8WZlW;bhmK5fwLJ}T)9c!7h$f9%P z7%zzT@fEXfD-!lc@|ea5nvPZ`)hFZ>YUr)UJfyTU3t}B6a&9Iy)4Tok4L7GgM!_=m zhWoP>jDp%CZwB@@Y6p}Gt*kEM{)tA@-OWuTKQ(+Vk6Ey?RP&0oq8{o8qkp*J_qz8` zGiUk)hEwR%JWOGRDX6fBxIlcV&xi`(myf?5Kp*mG{$r=DN`E!kZc*pGOE&K&hcKti z!J^d@cd4=eANGWjpmNIX`*Mx? zGVYZw6p!_q>~6D0eu?A8fOUsYg23T#>eD}a_duRPBl@F;4DWkx&Yd~BpUrne{;vzF z5J1zFQ8kEzmF9^1F60>fpyQLr8(upl!VmcC{kSfnzy0g~hp&-iQldEsVXEQ2Eo2>B zgt0U!nndUzb_hy8`oG>~3>o}271~rRR)y%?h-255CqhTF9<4d@!t*>rNK(ra7K5l{ z*%=S@h)fpsSpbDpaf>inN+iS(>9+sbD*DJ1H!xz`w7-Vc~J7G4F2EC7f+8yK#=xFEL-=|x&zXBqwa<;y4WSL>>?I02gy8QAJ8lcy{m;HLuu?28&D=~&bVvii zOV3W;a<1lbFDa6aQS(&!wC*f~2(dLp#-?MG1>|J}_^Ih|j~=|B5Ymg6h}kl}xvkDV~K z3;o|1Ac1Q&NBCx^-j6|iiUa`C9QzNtRw&&^c zT>9LbXHr#1XFwU#UTCRF@NlTqiRqCU4)Q^LvmHh&iwL3VrK19kWb_%(RW(~JEh-9j z?ljK26e~lK`({#=?KawwwbiEcIQo!!hX8hXu+Ih|exOf-l$gAXP7oDH5HGmImu*Pa zGOCb*qM80$`uyp49yf_X8NQCjKy&gT|9c}3qzdjWI?E%5Z=M^U_?c*UvmdCVjwxPTgyn@W} zmzUnpo(pRV9-;_gQ|tyg?roQl!;i+yaBlj4eoyZKM& ztL>RjuL!E@bJ0HrUp%|ZPSFkxYA7e2h*k}XwI@1fa*I^w{ClW#R=z?yw5b(%{=ZLH zv55jsOcqeSp!3QI@p-Ob&l*EmKKV4{-q?0KW(avnxPiz@_F!F%Da7o~ zxyKaTl_AiK*-7(suH@?`#ez&=m5^i^2_`T&dNjM#Ii2q)!*M`RaWN{auUGFsV{HPZ z=08OT9E*Z>d~}>ZD9it!xj4dC%^LRK(bTgfcde))h(bt+g$GcwZCF_BrvfmiQy2$-xq$mXO#BdTx~WElFhQ16F7* zQC31)JVe)h?#KOG_MO@ytC7h6%dg%m1-3sw2a%kNT<+HWY~=h>n$e}XO@=YaJxw#< zrvXQ#D%V%>$rJlp!_E)At;iF+#G}6mh}S){mpJGZ5Lc|`?x=&%E8M-p^zt3%X$9`& z>uz^Oac-!Bum_Kz;zxPW4USSe7t&A;Vol}jo1qJlVmHoR6o8a~gkB_i>K!*{kQ%?j zjjlT(_d||SyY{TFZPy3KU*DHUJX;q_*`((4Px#Fv<-MTu2`;AyV`&xNJn9#K&@WB+ z-}U-dOZpFQimvVym^v?^ZDysY+=x~x0?YT(q zP{!f4AW}G;L=h(Q=?26+N;Sa9sczk`rSb0VudMAvy!odl>$y6Vf*K~&@3nAhl*Lci zi%+J#q;sZK;>}lS`foT{M@Ya0FDTa24>?P5GAUTF-~KAj;m-{cSIa1fB`5H-Y9H^w z&8$BC*X=}-%8RRrzQJv|2h2WZN|*ZC8;d~|zJ4x;5yWT-cgJJD`Cy@% zU?J*W7?*7)XRKu*+61w2UeK5bN(j3S2*quD?8)`m+GV89lfLOSem~apF~E2J8BNVv zn}aeHJu-^-U-(L&4@t$)wL1TWxHeSul;o34OL|KRfpbhQYT{3q*MvS#_)#i&uC*?I z?7Zn}#OhS;I;L;)e0LtzQqgD^4fCQRg{P_<71eB39E?lV5zQDS?3Y^WLcr4M`d!+d z(;Hu~FS8KuR7-lm8t=L2SiVqWS4>V1V=v1zZ*Y7@Wt+X$$c4HnN;~M|Y0?b^93_Pp z6n9YdiO>&igeo!nPJJZ~eV@yfVh!hpB!;}!9G4$>DoGZ&y9nd5i#(pfe9)$b6;nfk z=O<%oZF0%o26*OsT7_FfgaZccZA=8c#-77}KD3D3q(CDM2ZdXe zxj1x15VXiBf#3FtBtQoP!GKQLx?cZryW(`Bn=!&#)PWq6ThSrh+Q`NA`|mGOAPz2$ zI0g0(I+TlKfNa642n57llfv(5>hZ6%?*vj`9w>2GBIda>So~19<;SxOYtNf@!mEDu zroyzH6QNb9pKgV6A=I<&rZ^#d21HQ0Uj%M@lox*V zq}&AH_#9!ZLsr)XXH=Y6|5vik>{!dBSmOCG*@Iizw#QE!OFY)7i9wO@93 z8%w+(ib}Ts(R|~Bec><%(`y01-nLel2vUG8a97}f&?2#paghPa`=qbuKM#&1h@;x| zVt#;{s2K&?TPHD@DN`rm_c4uug;6iucoMztCz8Osk-q#90K75WQ6+=&3!!e9A3l!X zkLL)ffAq$eU;8Yw00PO1h`WreE8~qRc%iH?mG+Vyk`+J#2O%Z%-B+IwX-dxNa&5Dr zY0kv+W%~tAi0bdV0iq$O2f1-GuFHf<0%BlFdU!dmVsmR$rht|j5)LsHxV9f6Jdkn_ z?{L7zu@IV#SzlCQGPsU3J%bAUJVvTyo+rC&Ik!vQPsYr?^`PeLdfGa7GG(-aTP-0FB_-sT_KXS^N|Qr`vA>T*m6C`$kX$Fw0k=G2?6Z! zhc^_0%i&c0BE1z1qf2B=+g5*H;h?A&{Yt)@%d|B|rZ2bLXGZjfJs&gX_Ej0=UHPlt zyPK`s;d?4yU_jt~NCI~%+nyonM_nyjT=olTdT~+0IfW6uJ{EG;>Q2^6p0k*}6BpHc zt4G~N3s=y^BRla5{(ps!q&_xK7xV6(9rw%b?`klhnjH_|H`=MemYju@FSPO)m229J zj6Py`s5igm8P> ziQ-ki5PcYB;65>p)akI7_my#|9qPkgr7w!COO=3k-?;{tF#D_D*mGFSw$H>~0zJf% z1GZH3ef_fJx37evwt7h{%?eF_75T5PNWiI59i-)>pRCo_Q+rCpY4-32^3!@=F%@*W z76^_tTwiIYmIkpC#8(-{6`ZYIEM^~Lw7C$jB-31TUUz$3$pyopE8v6a5F*D|bEwaT z0V;*_t;Upt>kKYzQSDx68zH78uL#bKbd|WSHh<0yU1fpsLV7BJ_i8s$G!6gq$XZJw zv{j4J!`JhJbv=nZS2$^rsVX4WN#NRAE+puBEjwR+I~4+0TxzlgZ#LbbX`k1%DP1bW zbY8BD4DAI}DiwyECs9s^7$ma}c1SQggfE+p3Qqc{rGFv4a!vk$n(LGk7GaPf5$~&( zsX&AVsZ}TA8ax9qS`C!`7IN~j6=nHqlVjPJ*Yj&w#=XzY4{aFG{00nY_zn4JZ9tl| zjs@8wGl=KHBoAuJB>PIJ>7sz@>-jc8mxJ$z`CkVf+7qGC91!yxaylG90gCcflbfow z(&9th6x~a#xfY<9{JC`dO@V{dhJl%#uoxk%|2SAl;8DDGa;{s$n>XUplQ(Y=#`m5KEdG8USYpkQ>Hak?ux^)BhcLRq%xu?x^@eH{RF8>U!r8mCKXXEev15t^QYIBU zNMj-?It1`GX?p65XYC6VkIS6*X4URyk)?UCV4Pw1Tlvz1ow0t)Kuww0mi*Y)zS*|N zB9-=^i?EZy``+9TXrq?8GUO=F`0BCx3){EPYs|x*cO)TZQgsc5)72?PJ@};d*B#3y zBVG;`QS|Eb4Ou3`r_}8WTYlPbL-@3hRk-uuh=D(lz^QnM&^ixPg)S#~Sa0vl1(-a- z%Z5Mw_;YDwDaoiQbzvN3?u8!wKG?0hEA7DV=k=L43>*ns=*ma1r$KJmr6tQ9n(yrnsmt(|dB zfvdbTz$>oGN9X8KQNhw~;LUy==qy0%$?_wC6QR!?g9*G21XDbV?3Tkpn^PP|>L8xI zS$4%hG|2q@;M{4_jy9Ehc z1PPownpZuZ?qEZAyXsJS?<;MdX2PTDj{vklRMSb|=K=Rg%~V0{7!*KqoW^T*7Ymsw zK&}K>r>2gcru>QOfvCk`@tAGl^Jacpd$jV??>ENk=m%+TX=C3BC~M6{9$R%|X05F@ zD~}onX4=^(DpW*%*(H0|7&uTN_S&cU!7!N~sHLeasz9W2jO%I&;2-rA!g&aG5@mQE zmab8+_t`Vhd*?3$2fM2-Eh}zSK4WwSf7#?+7OZd-ucd^|u-SBS8rtM6*HF~vRjyhT zJ^o`IK47yGXOTc)$@SS4sQ4L_ubaoNXi6b?VX>Go=Erg)S1q&8?QiFs6T4)eSZ{Ci zj>*$Jr#C!pU*#>nJKspjQb;BC(efcJ*N!?)cp^eSRsq`XvH5z=Zj1$vRg(oKN?Km+ z1Q^YGH$ZIU(IaiWPVeTkzVBbC3X+SBh)XQkzLKc9r$Jt|`z_tp3AdXL9>Tx9qPZh0 zkKsuj%gadsD3wCE$NIIElRs}y#w-um)IRCS5IQsWokeQ-%QAr6add!X`tm0N2*VDD zcP6j;tOLwrYZ$;$^oK{4*cz9%qBD&HzsAFA$HS)cGxFpB)FmYAn@a$i+HqEie&vMTyca^#kjoI>K@%;el_}ICCPQ(AK zjb}ng*#z`ZOR60T)1_uQ`L)dCl+<+V=H+ejX7w4I#AV!L=5d@kMu)ChX+51U*iaMR z8XEh&wWBR?6VUiWtmb}i`*l}JmgFhfEP(NE{mvb*nfGBeQ97CF1=3p|-+qbyAXJ$@ z3JqgGZ}g05%3`%6*o(}HG$4%sBi4Z)leUAN`fm%DQNc!>l=_OYxLz*~*WP{arlCpm6>i$9NTH&@LW}3ay2>Nrtx%2FV_dG=zIZ}F{rfALhK8E+mg>NgMw^s$_jL#ja>MPNq(SZIm~88jUv=& zqeiCj+LO)2Fl~hJz5mTxHg9Z9%0lESCE z`*oB^?b6(@!|W9tZ^i6rbHF$U`5}^$TDSPyZ((T(N%r={9O`&Q1{AL{&NWXc zl?iiVI)!J1Y37{mw(RI;@x5p7X;xNBwzaGY;QuW=nY zaTf%7jJd3$Ug|85+ou3z znE_zpcX`id*qP08Y*(CnWb0@73}v}G%3@<^BO>Rjdis*E$yfMXHtj3sB~Nraj!mWl z)b|HP-0Bq@?dt6N$>&XKZX^u#%|>>6U)W5FF)@Ij8TE{}XV8e7@YIe-nG!lS=KHx` zliDbqRjGmj>#?P(>AlBVph< zo8e*>g77t={U|?g83UnYsjZgU98vb`79Ohnvlj67M)HhlNVri~Kjk8X-HoQfdY@?O$%^iz(*umT;Lchxqcn0$T$*@wxz;jyBRqm#MC_js@;xO?X3w!NHxcnv z*f}Lk?Y5jwfpt#S67k4v}~ zK3r<}9ZS;&Z&*q;H29LcoVxAJrmXcI9K|1Y*u;pgSXI$9AO7^*ykQ4ZgL6*~!i%Et z&NmC^2I==Mf4b{zC$B>Wvgtb5F0K;un;a)aKCLk6hs=z`L<2<>%!nZ+4PBfI+=tY@ zlKEQg^nD}dM^!La@019@WNLCc>i^)38K5iJuu=77KlyMQV}{#t69F`PX)>vi?gC@T zVzgnr4S*bgCdT240{GAZYC?qXe934{YV_(g*X=PGG@y+^=vCkO71!!a8h1`}zXw1F z0mllUiU??fq(DKm*F9>AbPN`d3bjKkZ@0WFeMsB}mo$297=HzqIjw(t zX$Y7VxmNu3?3hs1Hs&V>Zf_@`^U)l$CZD9N+9n1{aijykuiwRrHIUz-YPhqnMVNk9 z-vS7C@3PNAYERgm`IuLf7;=y+~!pLScot~Xb}h(x8yK> zZQSackXmYqZ*N_$?DkfFD2uR3#Q7L#%;F9X_k@7egT9IE;U&S3NQ9K@h`S7$5@(Gj zzxhVd>iQB7&N=MkWxZWE5tu3h8BiPK&EIm|{R@~hwF2z!xALWY;+NiD_=FTid~tI* zq}t5kDd*q;dP4vAGB6MK;RA}sl26R|xE3*XkaIm{FmUa6+E^=ZpFLqA~OwQdv97mp|{;tMzL=MK-uWC^X>4LFjrS=={6T zIj(J!QDGaPCPZXr^bo*7%U*#2o$ZH{FPck75V8qYoHTF?&51A&W04}PNYi$bL#E^t zTTk-BdVia=D1r-)QM`WA=JuEVdsoW@{|H*dQ08yk;U|iEE|7s(y=x!W!!YhU??=Y8 zJZ2r;J!EzXOr_jnCs3!?d*Ht|>AA3>xTs_C_0nP0xU}hgDojtg+2@?xk*1iA8o&8> zcj?QX2l)aM-&i`6)To1iJbjlFmPd@Penz%Ce6L4FQ9x{}12AzB>-$pm0+L0GuO*i% zXz9WlN-ffLn1vsGe?!LXb%lvGBjR#w?Nq+$a>7M1`y6N_s)Ss0k~W3BoCG zHla>Halbg3W|ec58nak+=);`*5Y{SC4}@#@H9P&jsw#wN@oeVd*7kVly&k8M%hTlV zo%u)4po_YB=x9na=dEaa4tMzZ_jm0KW~Mv2@J*43-WRD1GC-_O2j> zrTJa9Qy_oh@JF>P<4*_E?b1k}iIrTy1qLAE-S=%6(IKkGp2H@6=mnB_yI#Yqv8=ou z4B!UY+*v1(rj`r8Ad;`Khx4Rr_(06GKy1EyYXL???rW1{5`4B<65NarpU!`p^MacL ztP%;n&A%+PsaCwMTAg~?aLQ-&c0|_)Yw)W~&{-k2!ayhGqwl5t#pp0^WxMowxTzih z4(==_q;!vr-T|x){#nQ^)&|o-rp1ZdDcTD!HNZghga}K83Y6Q5oBA8{zs9A)ZepnI zM8%B~W@*$yDQzqTm^-q-@r0%rJabOHh+*=;_=sPUmF`pvU8d>-ZSV6I+N4lhOqysB zGh}XC$#MHE4h_cQ0(ccPZvaQgAVr&pUB13Mf3VW`;*3lsz&3nMfJ^j^SeANUZrSMh z{#F+|i~?g;N5eLFE}MBx6GtQ+6Q4+hUUq#QmJLdnB8LEmOMM2X%D~C=aX`U?$G<)yr5QC)j?c(G8o`o&b+C6G8He3KC888ph1*SpL zZ*7e(S=rVL9vWgX#B3vscR9+pYCTE8P3(Nz33j41@M^(9k1dnS@irJkTwZ$!<}Mf$C$F_UC7-T;QD3a~jRbsc~Po^C$<#qTiFW0l4G%I$V0?JrL_7)Qa!bFml^0Kxo*P(CAat?eDItz80t^I zAO_;^?ec4ClNyW5pWeUu!5c-Kn^@|-|TKB zHGUho8e1s^jHUYzW9dsHr8n;P73a7Q#XkHQG|xr~uhXA9fgXJJ<6Y=}o1rUKdV92{ zQN8I3APF z?-Z_RXM0&`Ro&Mv+EL!`OnYu%KVxNE1zxcM?kv=#zmnq9LfAjP;6ItXp;p}dCL7!f zgntKE2<)gs16ocV3+ z+>(DK&JsH7{=qY_c8J8 zo@eXCfSH#IEJO}p{!ZrN zeFg`aB#k;#e0Xv|OIj<|`kUP5CXGYY$}nT$I1cwbtr6l#O%j8s2oS#dsSFns(Q9olQeS^VH1v51CejX4YZJZ@K-k2ytaQ)ri0 zxVZ{mHX({GW>K}Ic}z96-^Z-l!1UVCpzj*I-w-cWMhoG!a~o;7;%3p2XRcTlao41Y zflIU?CT0Nboz?btMGTI0nVLC{J2w`Q{{7fT>lWoiv&GBdm2a94-64|pYXEqa*@A4O zZ|z69+k5rkh5oPMA7d9$HjDu9{p)OC#Qhu+BZ7I-BZ9xMAGZ=Esg!fo`>00vKn$a= z5%&Y8FLG;l+`63aUyJd=a@<m#>vz{oZ1Xn+Nr^xl4#T1&_$TE8sD`;83Aa+` z3s#Yq2u0$tE$*Cts~zzuFb(TzNilU{n)yLOv8uD3aVOG3IeLnv8RJTZhBov$w+(JT zHM6Vvk8!I3a)^ImbcJi2r=*mnte6G34Zw%<1)J4qp=~z1Fc*{!Ehoe#_a8N@=mA7> z=kyZW^daP_W7@<(00`~~P-llLkyJ3}{GwPo!-^ZucAyvB3it&f42zd1(b1>iy<3z6 znozQSA7{tmApDWx7P3m(C?SZi?21(nyRi4(`ulD;mZ(jU)OC0#=0Ww=XE&+67ZU?D zY0CQ?ps&zimu0hmx1|2p34~ULJ8>+#wkDp;2wcDvSB&h|6)o{#(@&7XIe?yPzar@; zAEuG}1oU%2et@Ndf&--eQVB4&m{^J0dQpflcYtyBX!L^e9|6k0X>Z<-hNi*&%Z7!{ z&I11lcnV_lARYOqJ^RJ{){j3THc&RfR|#RtoRH=sbL!0!k~JS&S@|SAzTb9he|^<_ zXMLs+!y5d(*!Z)@#$0cn$9D*bQLLkjmJh@;+dF@PZ-jpFiB3=EPj$RGofiNS_h8$1 zDqYEGyy1d((QFU7&Ho2AvWOirc##hCv^q(XRI>$Hl=&2Yy66hgPX^+qN)Ht&fjPD;OIW(wN4Dt;godMccx?NOng9QP%cS{WejW-uuYbc}Y z7;8}wpuIJ=WE={_{FNjQph_8#EKz+rn{B6>o_ZcDaGsw_q#j#;h zPhMXb`e@sM)iwjfyAjy7BC#rz4E;?u&%@LNQFBe$3gB4$IOkED5w!bnT`M-4+@I8L zqjVTt;9DAeH7Yc-$$Jg&;e3rd1>*~)iS8>U2iS&WXe;PL|5K`LB0(2A8{VB1g^she zJ?gZ1cAdchTh+*XDjVbj5R2LDo*(6}j5aU+lE%UjP1pGTVAP|m?J8G{y_;13aQDiE zE|J(Y=Od5RS}1+~Ory$~pu~z+W*sSO69+V@qxT3v2OVSyMbr-PDY9(3mgSOmz4DjU z)zXDN&FBK)uc}Z07rMVu_$Tg`#s~FV(o`J`B#TFM&Ej!x_q^|X8tj?9iMXcd_@N5vAQNb;7cXY6g%AfPWgNcV%GY$b?h+^KjR(zoTO}*y?=2}J-H%JXy z0*si0gTbkda<;t}Y=#N!ML<#n%~i0|!Qc?+qV<@Yzk#Hr7!SA!6px0}2%zg5y_@?K zZV974&}H;7(m4(LW&tQ?(z%}k=J z{4qIB$rF9~`|XJ1hKR^TB$de(KnsV=pZ%D>%n$V4Obcf^0Giav;J-qI_vF#3(We^1 zw!({Ij%U4(8foY>LbTF#Qq{_zR@sM&GFpGHI|T=%Fy4MP)^<9v)~eIXEA+VIeB86l zwgRutX90G5XuGWE$qXK~`{+?QNuleVnqzxwo}A@-&df0Le_NF^zDxFj5YW)7Xl`wO z2+I>dT4^Eff`2?7?F@IzoNmx==Hnv=$!GbsfC(kOJ+#Cg(aFbR+QPEpxl{ z6EWGzMF4mmKVd5Y=DW5oHV`iD@z*F~iH#%UJP<#RH9J9#^Mw7M3s1OUlWAzEud|ft z;M^7OI6YnR(Ha11gAtC{Y_}!-!}ZdCx4_W@g#EO_Bw5nGtZYArZ`%BPNkW9y62Rp@ zJsT!mi|VB3=DM2edb z-o9V>Uh<{m=n&uD1psWZXTN z*V|tCvF_SPLaHvuDFX7^?^%YrjB60jcXs)7g3{v-I*2b*8(e3N7E3;)o*zlU#9w#7Jk$uG5uI2F`Xsu>5^?;Kj5D z8gYLOqZPhSiXqYxKG`_iA9Z3>Jdd$aWPev^mWK*fQAKMrvI-tr|(e&BU7)r#4+L;-uu znho7IFoIZk--QIqJ26pv6??uwTP7hqEE9F4KZ!z-V>d;s+C3u`M=6DE0VVPG z#k?>b{g>CshO4$LzgN9d&V2%sIT~nGT~x68GTv%EcU_K-uSXJ0C?!1b(zG|ZhQ&5f zW6|@!Z6QE}$>-}iHK19H`moUT!(RYp1F#_sho5Jo%6Y>fKuG~3K{jd-Nd)6z+J!}u z^awpkBVcFi*aRGjRwabaPe|{Ds)Mx07^9kd{`drp%d)l^8|x(hpESy!#nz`Wxh8K9 zw!$5`UKZ8qT}CEC_aX(S9~Vs0QNxGZ=6v=JUu~uSkt)B-A68DJ*(dA;NA`&)J9L+E>R zugccGNeWf%tv(Gga0Nq&&rVQzELW2qX@cOrR-g&~V~Fte-$R7w#)&WT)RRG*LY+`M z;Quzkhgr}*YfsL#cc^;a#PhIV5DTbu$#sY%b`xbo02g`PMT5NTHt19tX-(80ec0cD z*I8@I1s~%!zowM5q-q72>{rU_0k>Tj>wbFwK+A0W&JC-AaXY_Pw=H)oXvHstK`aft zHvCF+HPeC^W>|C)9jTRd%d`2cZo&G6C5fJk+BG&&I)Dbj)lm0l;V$Hi5YD)8j zoX)d08OBJNhnPY8v#2U(Ch50bLMxc1NProjDWvu(_z&HsGb5J#2Od^=+MH@G7?q+U zNr|+TCD`_>SM~hp_L@zYi&x4NIOtXu)$u^n3?!HUe9&CSMz0`~Aa4#*H%LRgr0B$z zwu=r|r**3_OfqPo$oz2`K!*pS{55FzV4@F%fNF$`*~%`HW66aT&)2xFAD$V?_xeo1 z)Ao1HxamhJ>0oepuu6GILhk^9@BtF_CsVBY+5YI+Ok__`804w`(TWmGq5S)v&7{!z ze7618Hh`rM`IkUpjl#{&97{IZ*D?;jXwL=SeKjgOBh@5~gJ4JbmQE}~)^uMy6KXj$ zKkjcn#W9T=<~~-xR{iE*C_WRE^%%|HbyqIAi$nFt=1L_7g{Lp9_S2euZizo(;Ym!& zL-01>AG~1a+?`vU&Fq<%Ka+m~aac+TC~(FRS}6L3QyJPGjk3E~j@E=RZ++o8_{gvS z=jAmZ4gveB5TRGbYwd%*CiX#>{zRDT?du^be`lH;0!%)RWAA=Re5ShLV>5dnVNb{N zdkXw$GOZ5xCg|8yyyYFr`00%w2eGK!cQ^kw*&G3MKJEFl*h&}6pJ$Z*>P*85f4uMq z3E*S7dd8W*%Ue%e0Kc%ry{{s@+nt5pyUT9__aqGD{>S#Gi2L(R51eId zDaStCrDFqX_Ayy#KA1_VezvcCeLQ5Wux&tD9}N2alWv?M=znoW^xV(f4YA<~pg}4g z5xOXNzg&QZcy)5RaNDKIoy_27(24*3z9>#Xry}g%-x|Dk)h()O9?A^fPX4n{LQd39 z|0#y$z&7zo&+@RF(PO4RM}&vKM0l0=VMy8BE_QnNcDfERj>$y=#Fo)>PA(u#gUW5N zHM!8G_57>LbK@KtK$^x0Y9}#CJ_DTZOZj#ixpwirZs1!${ZK)B$psu>xrUsS5L4fz z-L~76WQ-%M+5Wh;_X7UP-mCFHR87BiS9$l81xC@QXn7j|*>0GrgggnV0da7t{j zC3)E8+r`SYS7D$ldxU#qS6P~=FCRGe&b@yXClks7lwJH?&r*uMnCa9B9jW~jU9|3PQI+CU4F1J=WVK(W!?}g{>A@`@BCNV;CEMX&F5op z2MJ(v(35j+2)iV?xLu$3kH(EPFZmWlJcPG70LT;&lRv{IP2yU5d z#E*NS?zi1wFOQtU8^Gek>*}6A2$_?4|H$vDr!f!yKkU6_RMg+wFH9qnN;eXsQqmwT z5`uuDf;32XcMPF)N;iT6N_TfRh{Vv{DP6;}2le-l``l}tx6fMV4GUdsW|;lmab2I< z1ttA9u?EP+UdWMJ8*I$~_EI3y0eUuN2a3otOKKeIoyB4Bux>VHNX{#va1BaOX-;zR z6JzM9M}e(ED+(Bs>VJx8zE$RM8b-EY}w7c`VM;oF?ImajX(9 z&^Z5*4Lo2FJqGe3j-J!aT_AW+E5L|Y{}#4sTnMD6AeADeJ?0(lus)7{+f);r}_5lT7%+4uqpi+XLBt$?%-olBtIeSNg)muCiGsTRK zCQ{}%om6~;tpYoIT{+_do0zC~cWS{F76wbD8WmCH9{e~Rz3YVq?_?&=0ON8N(gYEx zQUs9l6Hp@GsH#+{L6VwMWg`;o`;*Pw`C;q^8is$3r0RokegXZHv@3eRWrbjb#>e)e z>g54r{_oe4hEF@FjTdEP6)neLid_ASPSyIiCo6$W>aa}KlsoHufAg1k;XpM~@hDg? zHywK(TBlOw`(?VY!w0@c+vGs*C2I*RZvV`RugIi4#ZrZbvat6*3^rg{wIfgJSJ>bT zNd~)a`{DYqVT1(HXLEqdZU9?0cAD7tlOGtSPLd#gaKJq;hm zo2?!Q+FVO@3+L@qy1cDoH8LSSj9*oD>rSZBipSpv&A)az-oj`MCg<%(mU{tDGeQeL z+MeV^Du!KMV0NmOe#g{9H#4HcjNe=Vn+~qf5@vEf%D<)yC>6|{@XXv_KK8jzxK@maSJbb+Oz$pSW>*sjj+ zXzM-eVAGpm1>I~^zRa@435cZp)Ro;72batFk13ywGflEMo&v`G&nnACMTR#*Jwm&z zQR8Nt*dmKX2ks9g687KWB}L)S7E-!ge+GQ)-xCZltMN^R#JjUDrjX<&2PlKtXJnp# z3P~2i&i*ap-ou=RXAYNiYhw+oZ-oY&&ndKIA^>6zTwJ%o?)1jgUX;gVEBo8)7BQb@ zhi$<~mP+l@g&^3%s5e}L7Y%2Fegd_QSAJ8>m@7d`3>AJ-;VphcL}-ZE0z#`EWx8=>f&vfug|+x(H}mvRb^c{6AKt?RRnJY%3*0VKS#Iq$Q0D1Mn zz$WA|v6|!b-eTC*cLSz>WC&?1IC{AK1Y1tlhdM#pF{$1qj?$T+ApqMW95nv^6}fZp z=Qm&^@JoK;eBX3dm_o2pW#AD$d^F&a1d~xw9;btIQr&SEN3@KU7nx0e&Ng@%`wgTL z;0oUwQ_a~SBmBTrKv55?)*6}m*YkPdwbk$Jja^AGs&;u|_g7VpfhG0mEt1fmZmy?22(29mUJBxVu$Z7%O0_ z`VHc!g#h_-45{~P2i%n_zG@!SWEcwe7Gn#(a?1^01-8WJaJ(|XlR35if>m%1;euAu zZe7j&XfHzQkjx+lgaCY(ew`)fzF5Qi-8>9(>}2IqleSCMq|Q!|IG>s}(BK1*BTaN! z@Re@LP57Z{ic;K)nrB9Sv^5@5ewha&Bl*yi$2A|QCgOfI$qS302yWPCBZQ;IGH2n- zbDw>tC9(n?OtR<(+}YxeBF}qXg2r`)7Y&f6wMa3B@NokLA29dImW|%h<4ofAQL~^B z$W|^qy*e5bH%l3_tUU@d8DP0l+V#Mf!*|wj>@^}YL7KJ8*H`xF1e04UbE9pa#_Hjn zA-sAA(&}Wogf3fUw8@&B)m5?(FlFoY+QUUJQ60Uy(1Xo*5+dqFzb9W-s__&jPG-plr>fU<-Z zU?B>pbC-R0J89hyBa%3R7C^M{GxQG-0w}>QA{=*3SYqQLe>yrYA(DjJ&4C)s-pd|&eG|90q&*y{Ke8qh~02`WZU$kxed-JS` z;3A;`oP5>kdiIz~2LM9;K4gE>OyD267+%4`xvl*hBwHoV3y%l2`yC^dPlH(sJ+H73 z@{hJFw(Y&5K!*w}Z_z=K+d!tHW`PmL*K9y;w-qPIS=V>|ys&?yDgH`^DvH_cf4uuQ zPqTOO2{LdL(X-B5vjTkF3<-E#Gp&SkGj0R~>-D1yRosEl9I^ZRug;v_51j3o>&!8{kI;J25eRu|9ZjotYLCGwK#+->w|a zS4%k=XB|3Pm1mOnAd7X2MxF3&O`s4Y$BibG{TgAqcugSi&D5&%c9Xojk6ak0QvH3v z-uP09jj8#G_@Jg>Dm8Ge)ks;baWs*dZ`$URT!>W9vi)gqe^1(*KWYRK+Qz22B^xkl zOzG|8f~rPsmh!bDrwJ=EGN0bUJad8|R)QKwsYY;o!C!kU&s#heM}D1RxqK|Ut`=Dq zWZ^}BR{<^8LD<#Hc3HNMbduw|1}jr*quTKiK)|I(;TlVv}AR&i7H@#MVJe%0m-QvU2k9|DN!dInirDBMj zMw_=Y1+OPj^ghBL9DH}nMB-pgv<`bY?(2XluTD2^x~n}bCN@yxQ`LdCeOp)}Naf;q zzV^U3r+~_$LgTam^3gDvP}Bac)0oEm!GIsNyI#ZT8_xGYsi8$0YxHYAP8B6wE`b2_ zs;6Cy^QHwKK?-0f8R3lGYfxLx#~V(Ro=-dCR!lrnH!rgaU@$Az!>A=xNi=Tioki)X z$1`&?E$rY2YsN=*3{&#BaF$yp$%X-H4toUGh$yYdKxg#wJ&z#tPU^0h2tY!3(_ORt0s7buM!(3AFXAC z`DRE>x;9*26!!p`@CIn6E&dsu*L>Go=hz}aG=zFJ49PKCvMGp1h;8$1ORfO;#u zj?lKL!w4x~WVCT{zA4^0QA*f}h%1?&ZAU7&Re(}K_)I|ldRPG)!Q-?^Tf6y#RW|`H zMs&^*GL+2p(ltz|dD;OJIG3laJFG6YvD2X)iRK2b?|}!}eiS2C?JP`%_^R}RHnp#~ zF_v@SqVI*R`>cLwszK7x^^^Wf*9%ri|Dd&EB5CG$MrM+R8nWr+PO5y#B~Q=g;>x>~ zD`#a_=ZFw$HG_*9rHP9b?$BDZtKk9YW%}a9OyRY><5umkf3i*91?u!w7iW4AwnA!G zm4~9phY0D{Rmt13-_VPL;FVK+QicpXQZw|Grk=2B?N}{=O8eS^CSj!Tgi2Kaojez&mR!$$mTO#*+lEUa<*P*l1v8 zlv|GJf{P;f+hmHLc;tcLl88(jpS+&VA8y6bfNgR0>?Rvth~T}?tZGPfo+lug;+dWO(`mLM>loOf*ExdpUaIfKdw`B5cw%;c>A|InM`t z34g<_-zo!b$byY{jJO}n6-)n*Ep6NvNT{d-Mwv}(?g z#EGTHZ!718OON^kmC0s-{gvu?5iYgBLfxH_LQd8vy5l)5cOyb9X0OgPXfublBNV8e zud`0@BR=Nou7*-*w`j6{J}ZEnoR??`C;FS&T`W|v?ZD=Cp6M-4Q0~rHPpNb;(2`H@ zT5oiBZUrk62UvDhHj%2hr6 zc*XaCRe%ltn$}f?+N+kyfKEx?K&OqMth*5(xA$^z8WsYW;JC$8upO@K z6|@|Onm%!@#dK1Rdvu*;iW*e?yH6Yhjqk23SCIUNc0rn>2;Y>hTr~sKz z2$j%zw6f;DSJe7yDx@A10U$AyjK^#|E7fBI`Qfk>wYwdN)`e$QRxoF=nd}0l{C`PH z0GPF+3HL!SXBH7Wp6yFJ+-C#A9N@Xo@c4wkA_wDt?1%rMCIjY4;QhW~Z2n!ogwd(^ z;5Q-jA8Zba-ovQhQk*|z%?+sqDpc@ciom&X;{t@I9CHJq;a{~I*NvwPo{9B49QBX< z=l}L2e)AXqBU9o=19=lQd1G<_dK(}Y0|P)N`)^?iAn_9fRJ{H#GV6bQi~r>#{<`-6 zE4JcB@(zB05BvGX7^xL#)}0@1D%a_7|8eaBcffDwC_D)D zEoHGA0Dlpp;hCPPKmL!Io_E4Q+_lzC_RW7zkr6ZwQ3fOqgv=v^c!2ef{f{sc5DxS= z1LnV%(;p`-$OD8=kQ?hZ{Ne!k%=s%1AO4TO^mjW0kMyGX@3FWc|NgI6>>pPah(Lx% zr~JQ7;cvpq|JxM)6-e@5TigF~#{3^vY?LBR##4D=ib$)O%L)#r>1~imV_zf)t^6_vK_DjF-e5VSOdZW zNrKQ0-uyK~mqg*L)%9zU>%;xEotl=TG2GR7#woqXy`l~`J|XybRMvc$Q7Q z>uDRYuyDTdaP##Qo4TV$4;+~RV$6M`jh}nnOf4hIxU0#$Ta&zQtCZB#>)*1P`*=#Q zT~Ba!Ylo$H@~E6>rkr$h?n0>D2Bl;aH%5xRn1K)sL{tDFgqaJCPkW3yN0Ph4K_$7F zwui+|Rm*O}iD^!Tfsh`*gBge`+3%Ai|G1fp%m-rgNkO})HAzAy~^O~j(~m7v_0_Q1cU*6(q%%I|c@%%~Kb98_ajQz;zY35L9e zvLis1O>^1pVQ1^+THVhX3I7H35Fq7`4%YX?x{jm*sYH_kR5{N*Z!Or$XG=xPiDy%TzQ15P0MsT|S#a zvXH?Qkzm*hu84SI@-zEJA2-eJIOEL7OciF`BcCU1FqkF=uFlXFysyXrPu#P2`=pG) zCkv9HgFTs9i8(cBTsiKKQ35YADf=DZACU~;%7zc%fmg82a4FoTd@>7Zz*R2EMPi3| zp^}@u+?_8pFOUCGwi&4)c;{=t&v(EN3?9Z5m)zZh-m4Sx`mK6bCBNL-Uj+cO{TlGb z0sQCmi2|4f4wL%PKWa`sd?bdgWoKmCZzm8!&ew-0DjWw&-H1q4>ebBk6#^ClP9~VJ zyjOSXDunx-SLKpz`*XP%Q(utJR?m4`iq=UG_o>>S&YSI|6xF#NLyyx~pSB0fZI5m* zLausN)s-d@IRqo&Lxs+mq>Vt9gDcrPjxX>3T^=!|_Om z)wt~i<=>P)iqxgI_z3ZA{NitR3SPUB62ALrqYDr|;N&e{_hTkj?Ubxpkk413CO=Df zGQybcov<6ee0`OArz^$Pz`oNY2Rg35xDIpOi61S>=z|8v7SH?gq;7#2I2FUbK#?mu z^0&47k`31C7WC{XPP6WLuvzz2d>UHU!%i7wT`^UVSaGp!m@%^dR*F(Tv4&T)iWSj2 zD>)`wJCxt-SsBt>E-k+1-Oz}`z*ko{`(SzVZ>sjfQTCdgKhjzP}1{!7T9ql z)|x{5u9&kNJCL3fDSx}h5tp2jns@r=ikZaM!E5bdkceejt0P@{GINyU0BtjnSw30- znOglEL2`G3?zV*Lk&nGrfO0nY;Cxp=zU8on2ip@roxS$8x`#)UhtyYNf565bOl~+e zTA+2MibGgT#(6)|^7Y!)NgmSvymCyyJ1?2uTL zgw!n;j=zsFd}`Nbm`W-V{bcq!Rx8+eJlsRm=K1Eqc6kXb70?}7smx8E{d_t5jTSov zwh8hpQkq_izh1vS?^%n-u9%rH*_=UeIyY`00;qO0>Kps@_q+6;<|j2^Z zrEp9VVpE5>=P2&Zphb01?+z1;etCYpw7Xg0{_>M*aspjAcg&v&72t&x=CKs9;+s7G zecm%niAmal?6XbhFx+B?uqtv5LWz~Ar zG=UQWYScYnF0&pj8`q_X-gZ*CBodI=>n@kQ1T|DJq)GJQ=M3lz#{SGJ`bdodSEbtI zr9!OvZ2kOP6HmD;?DA>=k_o|6T*YMLva{vStupXAAs+!ge)#PZv43NyxY@(EYYN!W z^{ftu+HVWFj4y`Q%AZ{9vMd+(fJ?*Xc_w>PlBaBfwA9kS1Aldj(Uj*vCco!TZ%oyX zL1%&EQ4f#T{hU|Jpt@$01*t;3Pv$%?`#q-km{56yPPKiqLU?)f;&*tfI|JntZTqb% zrgQz19m^Fo8g)eVYFidvKSW_~-&qSGV{NDnkx=xL<0*R5N^KE=eD*r9$1uMNOJPyN zdhN6Cr#GG`FA2=G>_>95+_#JZ)0m_ii^PyT*$$8lJcb(c%D-FAvDS=7j!`;DAL?|8 z5*47i`k54FWlQc47_n7%rtpCYjNRYtAH+t*TIgA%`})r%0e^CcR9+)N{ir99ksBEj zB76o~3T9mk6!6B_JI3cU+`dBr`BKssL#>jT^&J7&pC@dik{!Mm09VlXgGp@OQxsGb z`KH)X_6ed{h1I2_WIu}c0|V*1@3kM}?1|NjVI?imCU) zd^QE6T(JgRtD-2qRNOe4l!9f%_w{UD*jl10b3^SSLLD`5~~cC$SeG6{~dE_abNmb+%|)FhT4VO zsWcfsJee)I)8>&zq;Ji9RSV^#W%65&DUouN1DALF{x&yo!pI>Ia6+cs-d<7)2~txX zb~CwqSDv5n@)CV*otlJHl}snfSk~$H1&DYzuf%s42+JwQYMLN_+{X?RnXz$QAx)*p zpDKXNPYc*5^lyQv-*T@KKDEjLg(>$61<$})x=C|G-ON`UxmqGEro0cF2ZUk{9%lV4 zV4yZ3>9co*IWyh547{sd($`M;Nnwu4aR_4{#coJH_6((}dCXxe4%L|pFX<7?SScU= zY-Zhb`L`;xlyHKW-}~Qxp7*;)mBZC5{ONW8Es62J%L8p~Kdry~!RT-L^TEOXkP+G7 z}4N{W9g_+w84GNN!E6HO9 z!TeXpiG8!Q*AG%>>hccPh>Pya-6qx?FXULrVkv)|6lhR0Y?YwE_zcWI&rhKy(jqV; zaj$(eppGl{`ufO{d;B%(_lO+((IRJE#?&p_wAhK#u5&Sk=O%>zYG0Xvdv>0Gb-bcD z1v1k?@Xa)zoh@ig-NRYj3y0DyJo_F9vv4k!AS#OgrBO3+;c_}x9A(&f*NjYXoN7bx z(hBBm40ci6z)+DHr&}qVBTNP3i$(DU#a^5VK6I9oJlDhZmEam33a(BPoJ_=$v=`-H z#T(P69ZJp&_Xl`i7NJu;9;;*+hxM&S+SZN9yab0V)T{k_ZzwcbRTZKa5Q_iD3=>}J21%QQ}5f9^cuUO zy7;_H@fcJb?P`Cwg(JIyPlLKs^jIX?bqS7m;glUa85w-}<9S>$6nrlHz5_yIS>LMu z3l{?{JdO9_7v~jr-FZ*s%mZ^IMjpFVv)j0f6874NyQ5}PT0~&%Twv_U9C$LY$Y+C0@Gsr z=YM$tABN{uraN1##w6ucXo8mA!yNHwLm$Rhud_R|vU_k_nOF}pgn*7)Pay7b24W%k z#`I(J21q9z)aVNRD_Cm>R}uxtY>x{dD(*9`1B_|+0(eDvrv|Cc2#CHiH@J-|fiPQK zU7D~+`R`$R@o_af92N-8=}uTY3E&LN!sh8b=f7_@EQkFNk558vK`X8Coy1c8g@Ht~ z=Ck&OKEz0`lrb$!T(*oZwSFZP1_c~FOs~&O`GwQOyNaTbhdc2LYz^bTENVsy+K5y; zjkqgla2leO9{p@IWAMstL~EX|?eRZF z4tiB)-!-2fm#GX`5Pb8jcC4sC#V0SfOode1E=jxk6UyZ}`1-X6DYIr9ZI_kU%otK1 zR1R5EQ@RxjB?U1eJd?&d8{=QeP7T`y2aavyYcg2i!{*JFwEes(a3JpMFe{&Cn|;=uS|<`_A01gf{F5>5>Z1T*9o?y6{6O8-X7+UWbfXAT}hO} zB)Fh?oY+&@BFvhgX;|JYt_HuW`${{CzD)7A9T+D(uOw6`)n6b5(3Dwp!z0z3_jy0C z_;=-miSQ7UTst7(4Stn%nzk1fW0E zVAhtrUF?_~Tn!Z%E$|MRYIz)YKk&n?c`905{x8D6TJg85rnf65sSF#W_Q!9>Q&-6> ziEd71bz0O8IcQyy{(!|7bXOtvVc=sKE`}j1h)hd9ex9m^*MZfcID^J>*vOrag#Oq) z#ZhYt((u;Ok8)%2+l;!c3Ucx<3+YV|fXx{GWfYz$euLnj%6AAP5f(Ptel|Z7quQOKdUcisO6g*Fi1WY-&wLy@*5lL( zP&m^BK;)uWRkaaa(r_wIzu7^rfS!F|dp zVQ^g`#CZP$e(>?}c#DlN%n3PaCw_KtiEZt9WSBrdLXeVAisz6Ry2?_76xk1!n%p|u zZYoBI18w{;1_drk#U!f&j>xqcgSYxtJwt4%lzzS}v}$YNmUq{ON89x^1&Rfl9^KkA z-U!J_XsWX-j%Eas8`gx?BB=o60g|@o5^{~{^MjbX%dwzn@3ik06QCD z!(kW;HxfVuEoZW&a2La94s82rnt=tW?Bmgha=Yk|FQvf5E>{OCBiJ?TUR9oN9AAub z;k}_Pn$*jT55}^Zr}kJI=KYeDQoR4{?#T|Nm?BZQ*J}WkMHY7v83rdi8wioobau%Z zJ7S#H^spYwuGZ|Br1^5z&mmDHL#lA;m_$+T)5tw7^-gYMMSc(_G^z;&Fx0sX)TE8D z4=Qf_tU4yYq2B9OKUHzlW(}>spSCB);bPb^8KN69xffjk+p;7>aiTi@M5$MMJ^vg+ z;#^rL?J+$r5kKDnlX(8K@1?yQqX!mqKO}zq02$gAc7zTQIr%0nR;C5!@oWvX%e&vv z`BGf-h04+uq*tC`yST31Tde&^%)=+J^>~uL`!>~bINI>MYDI~5hLL$J>+$*bO_R9j z7UoB{;%o`uIqSNM8Y=FP+KqI(t|$Iw1qFQrps zr-iGNtBGbZfl)L>V)emJJ0O`Gvn$s^?gFZUO%jgP{2i_O7n|e zp2V7aYRenGTeqQ1|#?)q^4QYTRDJ%%in&NJ_%IkZM^y)AABYJoe~F56|Jv@Sj` z)Gh4RO$(sNRJWU(Ajk1X+m{FAck{{qfvdm{Vw*j{$|cV*v2mwZF} z@N>ADrTfl8P*$&C$v}7>#jWDkl>~TSj9;A;6ZZ>G-ts9Iy)F$J9cnKdEuQs9`RnR!?kdFZHOmFNJgQb*|NTB8TX~)gFXOEs~Lm|UgUB|PIvdCE<=f}d?!_w&`O?a ziz=q)Ku()HG$Xx_CkITVQ=bv?UD@fAI_V0~&WnB?*Z)>pm_9nQA+8g1s>iD!yRvtyH%f_Kk+ zm8MsKvlz?$Fhb}dz1o-`^YHNkWJMitO*w$kiH)$8&sCIp<;CdX>?{Tj|b0!_Cft)P=;^Md+nt)L;z+PUmk zl309mr*@VU^iz0{G(rr7W_HUeefI?oNA8ZZegUdZZL(VKTs($xb6#0I_XY%I^uE^F zW`Q-DgL6-Udci=!jR#Ers;|0yaPz}Dn0#c0L`SGx$1Tz`rc@nflWZqezj?lT@Mt3> zBdlDt4f6g+lUUT;>0%##&92Qn%qx0$L(`GuF}MpO>NQ6q_qzp!oLr8O`_D*Iti1Ja zIaTe1H1x?#(~$Gs#R;M{repai(ipYobBDwUebTxjTv{P3g39E1DbfQ9zCq=qnq92g z@|kLn8~|&$H(7t09N8f+84%PZ^l#|Iu&eHHwNfO&(1|R$kSF2AT6*3;q$;DAcY)D= zhb}mEiZ6pR0r$bGkhC;Lf>eaSj*&UY;Mc<$d?fH-cVETVh$fEwXx_Sm^m8#?V9ei; z3plkc<|RCpD@E*%wbeKllP<$}w5V>~xc|hgB;;&y{hUgsHSB&p8G^DGrTlK4VTPb} zf$ys+FZ2l|S+-CkHyf4>Vo-IM9(6 zF!lzY-4|X%;F@z3YjL926Ys8=EzeyedUp?pVqB8^Y%1L{j^9T^dY#KU-T8dYR=>ZI z^6{OY;QFRBmS7+{>84SBzwlN`=1a;;3Xv?@ z=@11JH61ll4qs|`e<&PLDq(yl-{ME!{Y-B?SBgFc} z7cb*W05-4>7VOs;LpMSO#r%t@%^6qnoz}7Hl~pQw?Ux;)N7_rliMJCX*BZrfiYNk; zHk9At-+w1p`OSY7ckgIt8(&&666jpND%uVtU-lzC{*d)>S+Z7<#)n=s+lli0u*eW& zm@;{u6`QzhHAQ7|Ara&UGCD0{%Z8tBAbNz#HTvt9G?1=P%#0U#Ojg298U%%@%tBJS zE2;Hf(8rmwUJz1d5o?w9E^5s*BaqSJvr>OZuoNbL9xMg&<-fWu6ZQmZaN4fa9Pgu8 z)Dsvl48#}mrBqkYEEX`m=YxUn9+Aq35F&Qh7WY*+Qv@QL4V|zpWdeDd|M?_8^7N{m3ZmU z?ul4muI(aNZ>X?|4lI6moPUoUH~sgD7sojX`Daz=UCbrpKGjaaL0|X-C@7*<`|mT0 zH(bT6%A;|0fGp?VeoQEcyahH{H=U)rckk?8Eq+#fvmU-&e=&jlsWL;=&Dxdfb#RQ< zj1%nyo>b^&hynEaAPkjvJWaT1NGkEV=FA}RbhfJG`n0CRevJD=x2)G2)u#6 zIALw9+kSel$FiPXi~QQd>p~@E4IP_No+~pzB=|#-HjPX$ZdaA#&iKR1V?KYg(uh|! zhc%Lq5o;c*_Gl(TJY0FurgF(HqLAMV)wz!P!9I_i7EV9RB2faXJ1;$UAq-1FXhfUx zmeqtsO)Ueg`tZkaj9R{M3f5{|3l*D&dzn338h)OtrI4BglaVaJb8_Q{d6}-)M+N6j zWaHl=ue_aR4u8_m1V$>9Cqa+owcK>#NFaEfh-lqb!OIS17inW_L**9>3X1%feDXB9 zFWCaWWK=sG&Eh#|@db(4WIR(9TVJc*G&^{9fLK|Jj?qpPMmx>B#Fu@S|8U2AK%IQ^ zN~V&UDg;<{zEQ1e4}n4xpkIGz|Lk}qQm1{`g#kuC4WC2q)!gEk7I`sqZK2q^+4|#C zM7HImz+uqzC2e|ZwdE3YW}{6N4n9@#+pggK-Wa=janva2vM*t4^SCKgAb~j5kjk|A z14cV*L7f3MDSPwO0l4mgGm)jdust6X`6jfGaa6|ARX|2SLBnOKT`Yp{+K;yOyrlYz{`0+d^1NH&{t0IFRjHEhtI0&rlB^M(%{=U| z7>&_PE&x0pVRT8q5PEJq<9zgb3+zOaWkwHy@uTR%i1@4ENfJ9^xQt~ud1*y2hsUg3 zqCvwRpIhZCnh5Qt^2rH0R+p`0M>7_546M?hiZP5yY31_Q_(?WJ~MwudF^o+VSk?`ozU)1AEWqf25Ou( zOjc1L@ncb%q~_9H|9X~ZwB<*wij#!2kMB2K z*GY@*arqH@)}^O@o|vhcizdiH4jOGK|BpY#Bvkaclg=S|*@9fxD{VMZAz{pJ|J3XO zile_J0!Lb;(Op7e62|#Y^D_wEXgmEq=*3`ZQEvq{3eCmrC7)`rUbWp~^pet1n=(w~ zSs6Nkc91M=5jzSvpOx34!;YmGh&`v|+mL`$*^ADmapqRKm~IiDvHk(pmW4s?2(vC|UYO$7YOU?hpX>(F7RNK%VoML`7pZ7CB1q{>p+#ix?}O z9u7MQ)_|8#Lty;i2E0vyK#H`bHsT5tZ6b)qWji_fWL3UzV|t0F;)6R#KHJ$C(n|}_ zAsT{d*@tG$?2W1wCX?n6Qh{SqzA$o(Uw)?0EDJ)tgUbWSfzlv~?5rTeN!`#Q1zqN< zFD$PojR;*^ms`pQ>aq!q5WVBN z{T6o?Lqh9K6OB!1U9b#7acjPHgUQIJ-+`g8@SH4cC4@!a|5B$eA7 z;$+qyO0QHmr9)x=XT!l*tqCP3Yo0F|jZ&c~KL$1C9JMCrB8FFmGTe!35?QXvSH-|SGkq=UtD&2Ub99JvBB+ctaqQH>Vttwcy9R_%5z zaJ{5!JE$aiHgk0gG3^;1iK~ROqrC!M0ozZ?Mv8bn>2f{!J6thOKhJA8mbq69%g6BV zVI%#}pqUof{b_hN85Pum(qv`+PGhtd+I&u(MBm4)rDib>`Y#j;G_M_6VsV9yx;oGH zTFkRVM-C^YsG%5yvk$M%M|PtY!xVN*aSBDQOK%sNry~tME?aKYl`7x>VYu zR{R*;so{URg@{#xw<{WEaW0YzK$c?`Ukw5s7)wf2EU{9gSeq8cSb(MWms*Wfp!b6y@^*CF*`S=MI0M4ofly79##DdbE`0 zf+hUaCA%r>m3|#9G8}8keUii)L;n3IyR{`F{IAe)`2DY2a9M2q=>ySU^7Zc2jTvE_ zP`By6@%6#Wm#b~8{2?+pS`_Bfl$9xwd&>_2QnG2j!W)@JKZV7lpr`0a6b(=r7$;}bvL(V-Z!AgH=4FL z|0TEchvD#lrrn zr3}6BIZaXtz}KZL_DS$azaR)LMr<*ce{@=ia1!oZIiAepw+{0^>bZQ02t*v}wsILL zNp^xZ!*bjEgaP=emyJx+_EFBGt(!%m#K!W1pCn&J9*y<{+8H55`7m3*Y!MYd_dA{H zMxbqE4<-qlH6ZVKBri)Mmnn`==0xAVvYHghh~J(5EHE?5NsuMI<@!YAA~BmW8!=Hn z$>=J^X@o#8E2t7Gy+!aY&}~ZKi?w10A2E(Fp8{&78jbbB)yq(~W95kR3rnUb-&R}g zj#m}U36GnO4HiBsB}l#v`l%qYJj>0LzXl3@5Ty=RIwy{WGdMQx*O&y)-IX1md(+Hq zQ5+yNBE5FH$ik7bmFBZGk+93Dp^u}okYpvYPdk-`IK#F>e&v2aX41+#Ys_eS>D2K7 zQ^kPPRegUo)maHqA&La@)Tar5U%<(2yBMlvMZ;U%tWkw7NFQ3zHsD2bt08f(W2c9V zgbP0`)s)qBPD&86xc~Af$=0Ba!lROZto4AzALUn^{b;WAF%7BkL2%z~t%ny<1?x{J z%$voBi@=#`D;A<-RAIB~!gGdQMdMc8IdKzs9c2J_HxHLGZP7Ki3(iCTAg) zhAPo}g2OGlTKbiEXnLzTi9o0f5fOPYTjg7SOKEJ^$<^*avf>Y@RZ!V2GNa%fldc=Q z^v075#D5^I{8$i6YmL?0f($Rh2Mzinvy*hrsK%Z%D>|I~?R@&~r(~PJq8?C=azByM zM}n$ZlB&(cY1{#H#}W$L{ge@I`jd5Vlnh`n#)*Gz29#|WYkCK6Bhl9>*8=lTj)V+P zwTChu`eR?891h2GaJ*OhBr({&qD`c7&qcS5FzW~B5I&n5?$z=6W_e75^-G$*AF`7O z?CTG?Tvkxz%PcKlXBY{G@&snx>TY{y#h#0Vy+1`MKsH&`xfsgnSTkv{a+a>pjaY+# zCoN>1?oJwXiObhm;EmC#GygHKhW74+r3lllF-*~C;%0m7y`a+)y7PHrC~X^Tw?@-a z)YdvFlAq~q_dBRe6M<2CJGL|EwIP{oz|VUwg3l>eQYKUAkjf7F3_IQ)?gdOD-@f`K zD?420>aLF?(7OQS48b4QKHtZXmTY+S4CMt^%tC(Ms0<=adM}_*oc1>h4h)-DXb6lF zjqa@8nywst>TCUq5g~|D07nRpMUqIFvKVZ=G>WbXn7%0O%Y51w=K-xB9-4X~6T8*m!Kio=I+lIsw$B$M1 zKKJpkQjiMj+TFDw-U&79;rY6xF_Ux;k`VA3Y&2nP>9<+ zcph6Ekm%SseXE0>FvBI^9_SS;83*6taQ@2jdya)9nND;1$@TliP7j3h;9$U^doW~+ z#>UDuX3~?~qOip$2YoF3LwneXa!LTl zM^^UcqTqsqvW$MqHJh;wc-9Xv6OZbK#b38eSTih>b-Z0!3_C!ECR$Dm6R;Y7S#s&V zI+taGhELH3jem`i&VQ|*yEvdrTX$8?;9uURTP5qPzSKU=XsRKTU$q0p3SOJyge8(K zOjHHi6t&yVjifu}Z_&J(2|5LiP1RL7l|~GSIj5Z}A|Icolkm5*^+%#;U)z+;>+Dm4 zxZUqs5?cgR=at3S`)?}N-p_xq+jo-vN{RZiLUyzyYaVILkxagdKxT+plzi$6SrX{# zpw)+zPvT6^wm4lWp00DvZj+U}@9_H|Bw@oo(d^tlxdbG}2V}OVV)@NWp1X{O)x`Pf z%Ij{yA4il=sMpdl^zK@sUfhzLr@2Qea7U{jsTaM(MzGSv7VG7?ek@d%kQ5rXLy0v9Xw34bP5-WECtrqswcUTQ>=LuP+Y zy=`3`yA#+N?dLO?#~@U57j1!Ff6Nxin{vvukE7>jyg`Cw-gw^B41K>+MOeBl#mFLo zb_2CjnpY5hEapiu3wJ>1HB$8^YtAEqA?^>h@fMEfr@B6E)w(}^JWD+_mTptmAdf-k zP&cVPFb=JGXukd1=xzC8o}O>M%Cou&lXY;a$HrcIs_5R%oqbU!J6;N3pL?XRxJ}{} zw0?P^k=i?B8LhS)>h-Qviw2E_EMxBZ>-)TT{AX2%k&LF##UE3bpg6)tTNihi z;O_43?j9@*5+F!|ySux)6G9T)-GaLXcXt`wxt(vHz3ZIw=iYypDr%;Brh8`I?tXQx zXEh!X=m+tomAm*V`-Ka~`un)<|g1Dg+> zBaQui#h^lw!%@8M8@)ky^4ud*Yd_&`cR9y-1QpddSI4|g_Kvtso2zA|l%~)*fF6Qy z;Pn6zrUGpM+Ir~94Iusy!$CEbq{e~4pH}iT=xNA4xh3^}xG}+a++1+Jhn?F&D1>57 zV$|TcpZ*n2Ix^cKM{4cd)lKWpufZ)x3%(h18vWwRsfu?@ljld3w6FdF4N=@t?h_?= zQfviku#t#?>VRjV-j8-gnmR{9cW3cuPOzh2ZjG)7^L45)zZ1%>??`?^?L)!dy#8`WL^H?wELAooPOzT~^*sGnu|cHy}qr@7b6ARKC<`RgX)s}jgVlm3a( zc|UVsejCi{Ygej4L#&Ate3t16j}fi5SQ=J0@s$e4Mb&iwwly=~Fi3a1A|MmQq!+Cf zvt5JATP=zG3`HmL6tR*sF4k3uLg{FCUt7FHeRYp7N1ND^J61_Y!;CMZseN#PEk_tB zoKuoJW)@yoML!Zd7T;kuFoLVm)PULXZd%VNqV#*O0v!I{d~zq$=yu}sg?;2; zTmu%i)&-=x&RNpyP9eEyU#}-#yo{jGAf36Yek{*9B^ki+J_RN7!vBAo%m=v+>=@V51ZPTjM zVqx1)&!mL~(B6aG*53Bg-}uU%;)kK$STD4PT&=+)z6$NeUF8$$j0r#@QpuMgtb@Tb zj~C(HW$s>-`->J!r=cV!yc|rmND1_u$H*bi10MJfc=uEMUDBMa3YK%Pid3zeP;D2= z-?u(_-YvO>M&)hr8+hBcozRfdM-Bo@jx{op4}}l+t?cJ-OLvoEX9Ik1uZ%YFBB#Z8 z5CqK-o_)F+@QqJf@cArG{6uQOkQl2M17^)Zb%oa$iQ?fQZQDtToHkV*wcEeoAb=@Q zg{FfU_lrE-$Qn7U6iJSOSzWQG6eV!&)iss*ha!MviSw z=$E`jJQwoBOJCunsGj)Z;ku{993&4It3KFf%y zfIf8=Dc?9Q^1PVlMnkzoT(0(aHW9v5TzH1$;}o2K@nHP~KY}xr?x*29*aJi1nKi~K zu6jYz3nSYwi|s^wp~Lp;Q+~DY2bED!uA>k1B@`4NMp2xK+gFL6gyc`9KM^fZ-)yF8FzL%=dkqE-wRy^FHzS!z{Ah zIM`BpAipigAxPwDyA~_GZ8T=%&hcBcP|LGjK7`0afnnr!({oC{PD-@9vao$X&E48U zRmG>qtp&Yb_F2TkYKo!IfY{)1N0XPZ2?mT&?` zor2%gN-sHk{dn1QJANXH17EVtK?>LpL%B>aM;4z4BS%UmSFHJ|UlehMJK9#X94q&D z2@hfiKUtDEmuUz$jxf%Px!AAk1Q>hV(~}xFtMumfbwb?yGI*(h)GmUa6rRoMI>=Ml zEcUi0m+2!RibHajH!n(Nh#PugEP7mRM>nRCM$FG} zfte;77HH$0@2eRF4K_S_gCc!Xn)_5TO*5r?dnT;B&l`pq{&VBcs@>Tn!5(8&Y>V%C zLE-U!Z`Y+*DCtKee-1Dx|C77n1z_2Mp7p@r5JXvOd|jyt*_>IBbLfh_*iBJ1pkQ_V z?TA9hvOufpRI$YvbFi1Y$DUbW{=yiWlzg%TM*5HUT+djGki7&DWzFAM!p_&m zaW4uH>fM=O9S6qD12>>)A~>Gzcp&wH``RPq6uV!9j$VV9t<_YL&YKS&B)hw1c0e72 znub7oLF#EcuWj75?Z2Kh2m<^PZ`2(-@gjFab!-9NV;A@z(ja7$ z2LDzVK99JE!zauYtxsp1P5=}yuZQxZxmG||<+b~hdtOpr#iCXLI&wEb;`Gv>1k~w_ z8>K!hmt&IOZR%OHw1_qGxUt`3d2rMirc82xU~-0vm1y>?Jy_m}>guS})>zB(P6$j4 zO^k?VWMxSSzWE+~fENA`2z{N;2|^Nm9>Z$ZMU|i25}Z}m@3J4z4xOLo{zS+VYrw;b z5P4qI7)Q-7#kb0SGSa(`VeYc`c&!$#@1*dJ5YcH;$FBSEpigvrRUu|?nl&SaSMwTb zfs)Rh_2A4cYSg>HsnAaTzxprO;%<{P>E^DYsD%RDjQ=4eLF!YT?8MuCz`WN}NA?F( z+IR4{?WLaOQuz!#9xUW9Hfw^EQn2i!__o#egK%Y>7+zkS^F=Gk{JHT+X@IJt&9h(I z`S$yb^F)p25b6R^$rfWI*|uqv_s({-Qg6f{X6uS^rL>0-rJ+})DPShCR|T@I4KJEC z#lX@(PRE2)>=L5;JQRK4QV+hWj)RHMB|=BL44Nu!R|pdTeSb&4tiB!Y7$kiFv;P;r zMGh?AKXVD()CGho$X_9%LAH@DxF;JMtUWj((8anftNu5Mw#aBs1g^ISY`)Rnn^DU4 z7`=v~o{}scT70UCUX>FX`kOd5IIdZv@O%NuoqHeJ=;d&`^=p|Jm`Ed6{4PY46m+Kq zb`>IRmz4|sfyBEPg7u*2+R@CedMH`{Q;rk8ndBJx``v*K^~gHvL##GmNVqL>L`}*8 z-1jlA6EcpO4v45SUO1u}siU8^T*i;?;Exc8JvET58q^p8JB6I*1gR^;>djAIM|u6e zfBuMTDOHHUUOCZ!ot`6bcNuD6Pa^ZS)^M`H&NLB2f{G*;X_>!vCkiI!(%3yNTbWj^ zYTaRpD%BybNl~&r!Z5YkuV^Clk`2f9U&5o3TR!@5Veb9}ctHxCafaW%ut}BeV#`QY z*59;WkEP2c+Fb)P>aCbAw}oxZ?>z>9RdbFv3J{r}XlL#3&$P%3_C5NcLEM89JU;cX zU}QSTOADoR~byl)vb#Yahmja zCL9|T;le`KlszmHbJb#CN&P3&$doG}DsYobqM3JSa9b5U9BCLPA26pFx&8$|~ZH zhv`Iv_R-6ubtepLmgl!a*}df313SF_O&ma!(B;>EmCJ-!jl56z^b5uuR{@9(Gwz;J zV#}O_pl#ONq`3S5nrPN>I_leywxngfj^$(C`&Kn4w|%zmw?b*`*D^&DU=FaIhmCya zW_I8}3=oi_!K3s9N$)3B285OSxq_L-Tavw@=%D5^UZOgWo9W%r#nmTgiGwRXzjiqS zVmbpylHI3_$K&EiCN_NdOh-B-Wd}oAU=*xJSYSSc!4wpIIzTij+=~Kd4#NI*`Fvrp z79d&q09wk0j}m(?=Clbd-s>de?1kKnY8IU-F&og68VdAjT%Ga4W&Z=qn)O%??F&2T zu+@tg$Pe24H9S?AMmN^W!qv} zb1!ymy3|v#x*BUjK0Z4cZRX^hW}Sh|!jE>e_d- zMq62zgjwKagdyjZ8Id^5KV1r5htm- z<;ynmXuG|R2(sPa-tZMEoZq`>q)*|*z@$QR)YravHK0dIYx(n;8(M#w0zbDquOw-z z>l<74l=#)^H#VjBz4T5r#1;-YUDm~(Mi4>K36?H;nlm~In$7$lVvsX`J&5EdiuNA@ zIZGy$9r9t^#EW(_#O5~#(U}!i_*zpknF}u21KP3C==UB*EpGl4e=R8}fr zxRN@##}ZXci!=D8h5u)*3Vjw;6rAiJ`(Ep8wY-L{ohhJ!a?U=3 z%!V)PAVyfSmBlm4?3UO+_r=u0O)3p^BNtm+suInjW2|;gsNi$AB+4f}4%VC|#__?@ zHS%!-L6DvEiVj2T2GR|<_FL{cd{Zq1)#?u*JN2Gzs|k&Zhj_bGrhfE$UwpwL7A}b= zwM7+UziUeiz^sHyci4%YhgO%VM|$ghEDUQ65_-DSQ|&KusIVLOyd6Zua9z@Mgq|$44xOz8NLkD85kU5tQw>| zT=vGs(u;^PMNfQJ`h}i{o)fhV$VZS$IwC|e7LA+D34>OC#7@)J=aL3w{1Q87i3-OZ z`g&=yqGcB|MgWigxGA*s>L=mnxlIvE>s8Jtn9$tG7PA7)bP((vV!&2o|g^6pW z_XB*R2J|VR^hq$(KWc8Ia1`Dh%4LNUz0EbH=#d;{tAqK4ifjeG(T8%;Q_Rd3Ss5n~ z;mAxlupI3;KXg;E;`~ka4x`5kgKl4~BfEpTXG|zD=(mIY7V$lQrw(1feTd*`m`Rsa zPCjLQP2h#_8UK_nUoZcF6n_ec-g$boe18!ZEaRAPu3U?yugpuq>dG?Xr(2Cl&OXL8 zj*hp)zRz6@1LTYQjXMTgj}9xVmok)LN)E!PO%uB@B>R?cUgW(^fe4_%=egI-q&l8D zf1dbgo7H=>8{D~w4a=Rgf=rJrXwIs_EgY)9&VX`#pYQ}Jf|0b#cV7q!SXU~x0ehGZ zg}=0@#1FRh{75%${LFC4)QNQ8``f;&VY=7H&=L9hOWRp(&KHZk8%xXjt?D$gnc_SgUR|dQreadH4{rfM;&*ybrz)9ze z!w5(!-%cb)U=TprPFyV#{|O-{jWWT{c$n;gf+(I}QfsWe1s5hHoWR|a{0QzN$29C=0euH10i~l$KQA~xp%7U(AOe{Kj^h-)l>UOl z4V2(3q>9bvaa?$ord)7}gV>r;3A)0|Ww0yHfpxod+-DOPuPdoEYhYFRAF(QGdp@&H za4T~a!G!8~kgOsF=B}bP%J3xDf#p)&hlOv?M)To%Rw``qR-`lada7x48=L%v8*k5p z&|QM=x|L3kbm+4Ae5+4YXpU|`yd+P=*Dm6l;|n4Z-1w%%4i)U?$Dk+^WJPLyVXU3B zr>oJ}_3ijL_DujdJWJP&>_Y(n{h}?pFpi0Vn3XK_II*@r#K?YcEj+@;x-aoMJN$*0 z4~!ns6^COU)L|FqOgjDflb?Zg0SF{trJx5!q)@t5rM77)D$9Dbs~^}{7@OVnZ_-H6 z2u>S!7pqH71yhH^30z2D7N`Un-}=x_Ru-0J-VlGlL_=1sKJ^kmw7{S^UMBPczMGAQ zVs#WB$kO?7zoQwIwiq$!0e*R%(HAs5s8p+c;w9r+a!5IgpsORYD`FvD=dnE@P65@` z#9@NO-uYRJ?6a1TYg(G4$QYWsbp!hA+z6QQIyD9n$6oP#?8n36FwSc7inuD+u+}fM zRJ6;;H{9I0ISq&yF#F=I8pS?PyR<9)vnJfT%VY6@1Now+9~q#3^+OThs;;smP%Q07 z1;f)um#)%WGrj%Ox5Sn??v$79#M5z1m`>~+0emuYCONZ#7$Ek3k}{fEas>z!n5#1G zdg*Ff#8+fUps*_kBTX}m)1;PVKmSyt`g&9n+g+pyhf>XCc(X-JOoT=yIt7QhU5dN` z>dbolVVXnxnSpiQ*k=p7Ae^ib|6VYO%SX(85|na6n&Uy9?I`PwovidVr{q$wd0>Yt zpVzgBUs!9kcq$OIx8p>H6a~k|jsRWNJ0~EDwinjB?m0*}Vd(u*6DU>RcENjrOIEV| zHM;ci!oQ+zo49((LT5V!kvG5N+XC}>p$wqFtE92lbvfk^5%HUrnO|X+E^A(}WMU*H z!`yevLF&4Ss`%tQ{^Su=4D{<7j;yLxb1LcMB-cX3HW}WALfm>N0a5tTjt?SVfEINe z7i!KHmsr$j_ihPk z0452krNP9)>Ue{6{wHYEb$}k7fNPOF>jy#7!BF@agtf%xVmDnc7pNLb6AnDW5;B=x=8@l~f${fzG{>Sz& zakLn@%SMZXR{2k^Tw)D!EUiZRU_#hF!24XXAS za>@Im1O6v-z#GKpQ;LHP%=Qg+FlzzZB ze}zT@Gy@J8V#k*-AUA-TLX3s?tsT$qwr*XrW0fGzKb1cKL!3+a|p(rE=$Li;F~#cq4J#Jav?!>q004~QP3gdyU3Ot z&XlyK(gzkF8=ioA*pOf2Y5t7Ose8OPg7~if?;g4?OGAoE+Yf8={vL6im%YQHat5ta z2?py;+-(7ypG4sp+eJP9I>ikEqI1uCc;8^*(Zdr~3SFqQRq7*xL!?4iuoS8Nk+zv3 zn(xm=U@C0rtR-V&Nma`{{VpZ}V?p=4`bp9B zS-nj}{HP!1zE_bv1QxE(L96tMQh0e`PCsV`hz!tfP+Um`|9+LXZ`(;0If+wiP0R*R zL$!t|UxU^0Z^RGUAAfKNjys->|Lx0&A@zHLIJ59kk)$L3EYUgs z{@5P>fd%IqoF+7|E{Hn>k%}+`kueW#t_tL1xjG*0B8~1rr}z4L-k@phL`73AXthI? z0BnQ#dQhJ$j8Uc~sWTVI^t@{Wgn;LJ?#sbCxWj2rLJMQQiR(bLD!cQ|zLjAT77$(9 zEMu=H<~YVq#1{>ca*+Y4VQ;4z_QL*cG$I)G;6qsg8`Ghd|KQkn`0nR8?<6+Ly6McA)i^u-ob8XcrqJU zNBr(_mlT8kw{1x^hVSrhjvcIdMW4~43do~^8Gp7Iz%Bu8V^9#9*y`Pn=u+Bn(qn}n zGxFbye~?$oJf~2`OZoAJIY|&|)iGoe2Kw7*ATwPs#KQ`>e$(~Mn3Jg zg%FY5ub=4GiZ!qU$BgQ*VtqHWcM93mk91EoSGsqycd*%~GU{_)td3sFPB*l;rAAHs z80qx~>D(f$H!L_@D#EVt4=a;mc=91P8p&bDvr#NInQQuD)V(;@@(HRFfhqz`#PjJ7^Q|I%isS+5-wUaS+ zVmTf;l1weKrZkj5QZxuR!BIPi^e;_maWrHYFyigISR0fm$_F2zS{4@qIQb8^k666| zR1PiOC`l#)4|E*+MBm%BsjyCAV_Kbxa}>zP8g>OCK(#EMP9`947Wc)0Dprm))qHhS zJJRj=$!MG=1DnH7kn@%vtX+$a-ltpcf-VTAItHLtfiP=wl0Rq3E5VvtO3p*yqx#3a zT)tH0{V<5~uDeRn8YA1(cZ7aEHDiU5rgykLXk;vJw|;x`-p@Q6On#FGjdnNxx$T2* zUb*2g8`JL2nu6OW{nG&stDp>rLu%+srXwofw7v|LBeShcY4cn@5zUC?3Qho&&UuuZ z-9?rZO&fNPJL`J=H2Bqr^DL8Um|EO?J>Zm85jh4&T@O$e~ zpP~R(`jJjNR@sWDWcDlJZP)wW5o$rcCSXMC+&_)OGpbH`5V)gVgppNWiNGo%8NrRT z{Y3{mt@}4;C9=;J4m44SOz!|MiMe9YX#k1cCWXwXn1ZI_BqU8kA(j#2c6(u;)1Q^HC?D%jDs_+mgu#F|ilakiXDj4Vp7*C9 zzt?gQlFaVqyuo7|0&vs`(LH$+Iw$FATw-DFc}%VYey4l}IOA=2sq=gOfw%^b`Btj5 z;P8s>?GVt3Rh2i~Mcik1W{Jtvh-4A4UM0nJxQt(GQH^w2F$vwjG+#z-uW)8ALO~a+ z+pu7z54sMOjSm42HwcxR(|iMj+J>zz!_ema-#TtjIg~$Y+hl%05&cp2xi`jaTWkC> zdUbmz*wGLW4exFl=3F{>6kE+5m1Zx%a5`y|@13`;aFtr&hTWGeAJ&guko42lw`@%V zqvecQEfK<@rDM8ykXs&)G>Y<<01TpFGo5&1&p3oT z$OClzAs?BFr^&9KLxZgzMT4LZRk#=Z@? zU0{VMAq&5?lXT-NVw7msLO4)verYI zKp4w^;)RUF2UNJy-})BdSL>1)e^Qe7Vs7hzYr(%IvDVt20T2=q%})e)+1`UuA7oL| zi%xYl)ay>%wgJNZ9ITOStn?$z?Q1L<{tr3qJ*1Q68LtB+&T~R%DL&XACdl7vM^7&_ zYV0#UPtBnTEeaPtWD{qYA;af_9{`M$f9B?LFXu+YARk-Os{&4SqzAEB#Zc@Zzv?#l z27QiP6r5K@r1XWYkLs7e%OGitoL&AS((vEK=z2R!PhuW)> z%K^U9lB`c}F;_lza3&UU-I^OODLe+y=PLF?%<74j3PHqGZ86$E__AHrxHKTl?St6B z++sfeTjY*C1gdL)_zj|GE8M^qpb@;$;vo&<65sj-5$Ajr{4i~P3}#Tmsh z(w_s2U&cjk!2PlOJEq~Zq;8}sj~+FXWi`xr0?U8G8@zZg_ip;8f0=Yy- zrHe`2H6N+J)xMNn&QS`MzkFmxr`MGyHI&r9tCc^*BAex1okY%TTdzosKJM*T@_&0| z|FN0Jk%!39D<9ZZcG;gS*3-rv>6h%Y{WAUF)_)Zgk_9x=nHDh#$jdGBL<+9 z`K!NG)`X)%ghvlzN>WeHN?1W}e29JP#=cR0F=$Ri`rdxGTuvD$G$H$hP!vwa`x4c; zjT|0`16YjI@El&I=_r1(RQHPl+?Z9mInkE$Q2!B{@PjB0bX%gzF6y(RyCVuk7HEsvp? z2$~o?;f*A+5a-~THK~!di$=(8D;HeOV3|dsb8R9*$ug>#VgVD3ln=i$J^{GDy!nnc zkv}fO^r5*3L^4BHj|X?^39si^4hi=oFA<$oT@t}p?wHR^O*eFT)w%sfo6K(DQ|3FI z=V-26Wh{8;y?vuIwze^}q{A(;qopWlhAJzzJD9kUrF)2;laZy%ab%7zrowl_L0H|j=^Yv_iWS0+Z`waFN7(RY-I zK42y53O(q>3mOGU%ljV|?gv|D4SOJ<6j{z2F8t7x_%!X~OqauCT_E+g{otr!4n$Gz zFGE7D;#QJ~7DP1}t*kI@1{(DLCw3&txe5OMWI%aVvwD|_iHR0#kYG+kLZ zFPvI)9Yonm0VU zArgQ{-0iMxzYzUK5{{iK-qua~RZ?5*vCm${c_^W^W(N@6!aUJ2mHyN*m!H@ju8=eW zR_;kYokA%(ieSILh-|CFgbs(p*u8f?6cG#_WLgq-YjAjlndQO8MFm2~b}afSckf37$oK8bXu`}4A&r> zA+ldQ^UD|I#eNJJlam0);UhQa08_%lQVH|UlbKpDB$qxOY@lU}>?Id(VZOX1`J8P< zCYr7UZtJ9upFosFBZWaC3Rz64|E+czb)5hED{37*r9^^<&Ja3YL~n3DK(}*1f@U_M z`tb7_ke=IV9GN2z5<7-y-J9}qjgh-1OX68Z?s*wn>p`~eUM>%~?d3c7>QuJXe>9!yt4uzs;* zLlB%7BWnG4C^fxdA*glOj-2PhCnc!@1}6TFXJ#jzkz|M&&4-jLm?qe+KWOW5s=coi z@*#Rofay$uHX;zn-o&32f8*=BSm=tS@>+Px>TnRdzjG+zuPsagnvd)$#nV8 zCp73dak^tfi<+peP5xH_fccd=1q7CO&=0N;(^u0sa<97`Q|-pX!Ux?mo3@ zJzjSOWz;0{g#nztwY_M(dz(k4zM`r*{oGNxL!Kn?pg56pZnw2LQiF9*%ivOUFqPaV zLNul7v4&jM63fj^kjQPyTwsOncGz8gC75?3z_g1>EL?qVSs*UB`ohw*sKrWe*)Zpm48VE#f8b7OOZGA66G*yV6ij_+ zG+jBYbL#_`pRan^*)r~vB7Q7hTd>iQ13~e^GkGOv9Zfa-zEC~Q9wvC_o@YE=bB!yX z=;Z7rS}%;-UmMqm0B)KHhSNoUtvgU%v2z?e8;HHX)cN8!dN{(uJr_-DemL9$)c6xI z1FTDI^)x-7V=DoT^ejadHAI}&;V9d4Lq8Ch@V_JU^=F|8E^Bn|?6&|eP%M1m``dy~ z;SQ0dT^LWEP*hJhCS}(PXR=}LdFKkTCwB!r09Qi6#(^~lR1_gw-J_Y=iEHXdz{X#0I6j<=b&zB}STJ~<3q;3PBL;76 z>Ru8CmaetY8Ow)!DJ+wJK1=uUZ7>$wk!&?xFs$2_aNv7+npM-W;+_PeUak$&JD)2n zp!kYC+=u}ujr@;luT&Is2TSgQF@hL0#50WNHM$s*8t+cy4_}!9yb^A!^PM-*re9cf zbo&3^9e}F+0biSG$ty*0HjNx{b4@=36`dtp7AvZ`Sh2z53cOV>a6HZ{`;bXIb{!khPqZri=ZoeAj10R zTiEKyZodDp)pA&q$#uU@A5??Ic1V)&*mFB6njQ8{t=+3df8UaxV(4*yG-|M0^#1vy zy(xEnGR$im$Y@4sPZ4Mt9+>DwNL1B=8AlG0k9kmKo#(_3cnu559*FnKh%~>-Bi-+z(Zft|>_c z9q4boYkx&gF7g&-z!0de-q+*GG^S4Z*k-mVNfq6PLtBt;M17(kqakaj)9*2JrLrEN zhbo#Hw{-d0;xec+EJ-Il0XCRc5x-(y+G7se=G)_ePX0p^-J+w3-NbF3Ik|xu>d7v> zK@7P!3-~3zaw4#6;P38m$B(d6j;#mq*ULA|()rCY+bSoc70(Lw4PRGGYZ z@du;D2kRMXZ!c+6zHM3Iy}RSo+q*-$eEjk$%4T?^r7w8iPR>2B^BOLAxv~q>f#uLYYU!G&$CG}aFLr&;YB2k2BqmQAvo8qHc)gf8G}#nX=>A1v z{Mv^yA9~He@d}}ER zxzok*%i`48Q%(2}P-{s7AuiK0aLRT}tL@KNB2PD3X5_lqG2`}a<5h}>04IAGq^QfS zO=-D6gt78?V4%&A&TTTg=Dy<0>;Yv_LR$_?Y;BeT9RT|`s8EhX+t`v(A+)M}#+l{v zxKnhJ_9YZ#NJkE_EK=c8mZm?@*|kjH`sO7hYG_;|o-i_{sVg-C<+H@2?xam7IxTQX z@9KcM8{n8uSFDJqPfs9>&@}5{dj`bQ+pL6!iehyjw@+iP(bd0S+1}nPUj* z<=z`1cZ2U4Pxi`sakzjrJqGl*4|?7HR{^xZY_+!a7{2!qq>83zmUvL61*fXu7R+eA zCOxvlXMwCtzs*3natw-(@D7_9g~T_2NR;Q(6pOn&lyabVW$Q@Z?$#f^MRJgR$FH?k z6_5>wck`cpbm4?s7C4v3z0R7HZANyFYU5N4TS#ncsMzsco04ud%tF9#;5)Uo6@I2L zw_?BY232Uqy!iBfmg{MQt4$ORiI@UV6DUpoLe$E3f7KS(hZTi|34!{IoYag#5m*G1 z;7377Nf-=gCQc*ms4&$WgatWGPS4N}%b`exsgWlCa*0j}1M~E{p4T*cwCdfqdL(kd zdF_1_2B5RL!Nm;LeBu}zBYyIA6< zyx?0{tA{m{A9`p<)zycX#VMTG%$tASA5!4G?cwH{Z3?PnkIRL+Qg5pA$a zthcQI{Zc9`L6d|-BSUku$>P`8_b5)Hz1j?Rx)?k$i$naLaRi?Q%K(1LDNHzDE753B zz&<`uQPQ%Z$za#vl;me--Iab-fsl^rqTjo z1WF&(pwW<}`=0k{l+4rB?I|B0y{KlTKNlV%D|2AVv!G0FjM`2R3m{w;PJL%ER|s_D zWAa}JYRa!(T<>tT){&%`rS?-Fl9ZsRg9sh#NFWiQJYx&AocFp-f-CsS@2yig6{rD` z)QQSY;EG*)dm=;fLL|v;&szLm3MC58k6O6M5ceAAY5mJ?m9TnpRb>YEZG8Awy)rh- zr=clRrF6y7AO51|XyKIuZcGoT?G)_FKoVb+2zBk}U<7>=c=9-fLGpgSogo;~Yhr$N z!q3nz+HbAHeG5791jS4bOI^k~cVc@1&0BEResj>|p%8YaRSB+D#(dD?yMZu0_%~5Vo z+jg1~vw+b53P_I}d5s(-!`so%y5u~)e7Q;Xz_J-$NjuUEd;FEbDI=)ld7sH1_*d)@ znw~KUZ_}iyqpE+dLzfLx<-%|$Lcea8(0?<)1+#4%>1Cn}1Sri{pRUjk^P?n!ce6Xt zO=r(mMvLJhQ_|p6@Pqm%AJq$E(I$m72CbC=f;#*wDBDdq}|`ie@Y zvr>}zzZ5E=ma2^+kq9ZmR|P>GA#XI-)Qd?5wA-Q*P_kr%hSrL*Ueja4u{(Wlk7zX( z1J`{S)x0&Tf?CDgm@N+Xf!;+KL|Q?;*}Ly{H-)dx(q)GEdoM4Ii$;pW(8ssK979AG zPb)r@^hVL?T$;1j>07eMVYV9ypVL-nx%U|3`@CD3v|+|;my)`*icKqDa>+#;_3?QV ziP$qGIh)BMhRjgeEPtW0Vvc}<+DU!r&mUSPUj47eI7us)c{*D|_Q48ml|(`H!9KyR zh$BM7D@NxLOhZi9me`&2<1sbCDj0TxT#)emeCqVEMQ{Ef^IWJYM9OD8$_K-}w;klA zz!MlZ*yVm$`5x&9lfTxeqKg1QN5ml+f?kUd&Q%;lQ_`%Lm0CD$yP|lqzTrQbw-aoE z{QybNGRM>NLuFgg0u#zYhYXeVcF7#^a>H_hxMeny%rM2?ts%{_57wskFSTFwFeeTU zC$jobt;`S#MjSV*+54Npg4&$^knq=bd%Vp*u#v|-6U8Bq*LzW-jzz2J!6k;?6)rV@ zUZgiU&Q_GfSol#zdA_DRfOtrjA$TF7zb&W|N`YUsN{xb~Obq6T`4EUtG2Xb{D`998 z&R0s6uzM=!uh7!m)4-#s-f^#TxIbZWT@T6U2ntGVmxnsUPuXpVWDzV;eUr=cLdP7A zKjuzGP|=%b^`Rr_)6<)OC`kB{p0GseOEHQe7eA7V>%UMlNSYk&H6x*4b1?Oba^ocX zywkuggQkJ6cOv)d^?G01&s_CUDDm!m4i}4nw|s;i7va16+}U{KTwq7PsM%!4g`7-F z%NI3K1|=n>FZULcl^`URZ>xHC*`ZWal4%13jxeFh$qy0~$grVfP&k}O`Z||A@H3)^ zT}4!au1OQ8k<_BAmT*EEgK;XjJLC>=TM8*kj0l(C@^C-@HJ zJ@W;&%El&@*tb(ulmt%m3A&|7;l#xt=o4D@Vg4VL$OqSBy8eErSEJ_Y5g8FazDJBl zbYXHc@rMO&HB+70P_%`@oScy@15Ebpf!NV?e`8(w@85J=6!t6P@dZCN8W?9J4p$$% zskmIQ+EYOYxed+qcP`{eO%w!wn@{oQAC=#U!N3xrHxK!a7|I;Y@2(0bdNx}+lPMdY zW+1IFI2c~eeS_Lt8Yc_%7`!Il`mUdCYDgabu-_8w?yypF_mvvHYQ<^s@6H8ihBZqA~9Id|bH*HThM$VnB)NnZ9ITR7SdgF}ASp{RN~xNc!g{tdI0}K$+$yED zsg{w!!!%r+W$Y8U;eYjg_qTR~@8nIP6err*1Gq~$v$l)3V~5R%+51|BAOs~aQW*sr zZpY@YybVgfsp%>|LE4zv?N>1SB7Ph+?bAK_20{h{1+;Yz=E?uj(iJCsAtB-&k~cIu z_#IA~ba0y#XO+(iRF#ej3X!yEkGt53)eKtonv2RO^Qlzle(xRf8Ta@Wp9`(@B?4Jh z(ov9>_8|VRi*tUu%J{NmM=D%#*61~nMUvO8yngbDiG)jb`FV`~3-Sl~*$V%ovCJ8* zb)uilEcE6$wH}hdwJmg;9P>x@RbSE0?y`Run@%ykmJmLpPJ>aTE)6)RD( z9K5UTn~(m}INu%_ZHPJEzxE+SGOYxK%xJIVD8lbmTBT^P-kP&HtZU|T?|0;`&r6)1 z8zuffMB;Y9Z^!Z@;Y)-Rr(Gi4~Bc%6U5v<33?_WY}<2e5hd z!-6C&Adv_{nTdM76w4rcc4AG}TkHEGOE)4AEVk<#ajzEy^3%6F_amK&ThOzzw!L}j zN69?6uL~1Yvk?EgwS@~4LjU_9N&>FGZAQ~-(Z!g7D1%%rfAhoy$QSt4#){K5_t7|# zSpmO^oJ2fFyH!0MH9`rB;)H(e|E{DohD_z%5Hk(`@8S)?kUU04($~AXx~fjS=zLba z<_7~)bwzheb(Y^qxqz6`h^u%qu}aSzdPYXcGbWw#DPh$dVNa}vCZJ}$&fsu8{+L2G zX%Q&meOGYz_WBI$WY_iTmSPM7m3!uR0Kul}&o@W2Jd-FmwbeJrbI1mfbqV7c98%XA z5){#O2@SR@I>2E*|A9#%v!v)H+sYb@>GXXrdf`W2`mT`7{h$4saciOB(Kh9Ffg@$D z^tU9ifSNCJ-Pfo41nojk>n26p-rt^iYT}$Jdh>q^xu5^-W1R>^SqP(XCG6NfU8+q= z+BJMTi8G)Oay`cJ+aVG5Phf}0iVD6bivqFqZRlSWb{#Jt2su{FyON{C25ju z{IcxLsZq>L$$IyTn%pT0uhHvTn zZcFvn*o}SR^F z^+X5w2;XNno7ct_yV+I2ox%7n;DX_=giQ~CK_YDh1v;Qgm;&{<4UfV3%d7xY##+$#4 zeo#5x1`Rpb(layv{m(m^HvD?++mn*8#?OEk^1P0Jr84P${ZHw+Ul`>)QOU(w+2H{- zP@n;YbF?$?|Gyq1{*W!DDeC2q`vb zK@yfSIR1f&Y`o$HMgmK?hvo9cC27TVrs6ZE;}YzL<%io<9CI!y^4hv4qME?(7I-Pi zR74dV{Q$WpsXp|z`%S?~{E zB$Jl)|6JZk6Co1UNLUBb&|1t>?H^L-oBw=K$wiYfk9bs2qo%!`|1ma1hU6dk>qoJ) zsUeRJVZPMoYLLBn69!H#^~0p%M}JD_zx(jq%i%$EYgBgOL8a?dI^mSsH5x3!>bk!< zciiZS=ZU6RU_zM%_&MOlsbbSU1@g^ivuAMsvC0)b;t;|SFN@Xc5Y!IjD}7-{pp9h@ zBvhFbzaH9R8~=E`HGV^jLK{mOIHO!6?rZ?#f-FHn_3xIfQT+E6IR9NK7-j$eZ{|TD z2<|aq$47yqnw6k1`}ZWc#{p&@qEaAOLk`OnKi3i>so7eh_-@0?nFFtK*Ek|8^RUTd^6S{N7VGr-Uz$=h@32FWt3ZnJDFTA`qS9kBYwGr+e z>$mRBK>udK!@x7`$CtirHXnsFzS>m0)%oj7K6-4z-+zxR-`#o4OC2tR{JZt&KmHzB z-JV7k_QpgU&7&u?A@vEv#zRlVNpa(pmIP6#&OL6^%t!?c_v$0F9l z)BzU45-i*UKKl&RHOg&FET5LcI9ViJzV2hBARQVo)BCfbGmOGtvy%lZeCbtE8gask zO2KZT4RdK)&9z_qaw`rB9aeL0)IY!3#~b|I)nv)`+UMt5qkEQ5KQc%RunedRb!VU$ zxXN)WhDA3={pOctFHc$PS8`oXT&k$P43G8HEY^EJt+H;}ID5s4e)G(X=Nc8n=L2DO zq)oalPHrEOo2wHQo5Phs)Q=feFS)Hhr%$CEZ}jru&U#oOPS^yUkxYGCeATA!YS|!J zdp4Jx-*o|ou+GW9I0c$%`g+Lt#k;$(&~ zdr_hzT5B^k4M!{$=`3!^&i@RLcuq6a^J7IMhudrGmf^*(6kf9KJ-+u;DF*yURvzD2 z%!P0;*C7&OLsH|63k`gcT(y;QcCqHR!IENxY0;hUtQp<-spz}f6D;a*^fFI;svV>D zL;mb%dbxh|llrwwi+0E*6S56v8Vg81NnlqbE9%^$1o!%vSB!z?w}LUQYx4JoUurT;49^Fiix`>6yC0N6TZX%k zH2zt-CEY`>wi)er{;M|j>4$Fu(U{hg8y?Iy0upoNefAyK<>mN=jBJw_pR`@;JMzYo zU>#X>(1Lb5ZYRv>4N-%n3H@8L&bV{tHi{<@M@l&P-KTgVorblcqUIv|0>`?G5kKw< zIyXMt5Fq2`ixfh%oXgZ0U)ucqA=l-$sY(TO{d!xs z_>>1@-1PH>3Iottj|?Db;yp;FQvjOIF5iMr6)E`gHNIjfV}^{+z0^lMjpU;R|%46OYb z$L{x2Q06wh%=v2b83gw7ZOhmuMs1C*xJzOV#V6Plpo@!nb7JxVj;qt6@0KU1JlS4( zb=7qBd%bF{ZWH@b=#HF8>k75=pV;^LMZveP1+Ed#)BS1f+|Z%*5NSx4zn(H5St{ zveD^`ug43-6zL?_WN>D3hbAd;FvK#!~McA1AjDX$ra?)b*2mO9K>< z7XA4%`zB=E-&=?$>j~zYTM<|1lfZ6d`>62wDBF|6C*rOy;zNzh4iRI|!NZ?gDka=M zzDe3+!=leh@H~538>3_NEy~}kIF~=B1XkZagJ3*?DE2)$(M!|(euQhZ+eM`I`yn6U z&aX(rVaqP7Ao8R_!mdb-&U1*3MN-6&QQsohv<(tQ_^)lOYQ1mafFR^YRv+G2v|Dv_ z!`l>dH=djIc#RvSlz#AJGVk%*M>7Ers=7G6kHnpp=zY5aZ)-i)rzURvowe}u!*dJx zs020#gHxkX_pt^#5;d5C^FFP~7{+n)oh7&?N7k>%DP4-bU3}{@aSeBDtXhj|L*K}) zEG|Sg*Kd62KmDU&9$jr1P*&Nl~;~&~zXKI$pOjGGLdICF*k!*_CwXdK*8! zd%U%T{j*zVx0qqN5+c7M)lEco;-#71d<2@=na1u>-rDt-Ja>pTX8c26Ge2u0Osa`u)@GFrd4x7X ztA1m$BeJ1@7+nR6M~k%T1)F~Ml|)!7a36_KlIv}3{BdEe_)!jN7VNbdG5FRM`@IaS zQVRE(z1MwnG@Pd4&iL6fLk7`Q`weHVYu|>Qk%|;ExbB384-CY3(|sswq?g7|dLp4p zXqPY6d~_{xS8KMSK4Yn-}(9v`bDq^zH~P2tDZ#k2apnUfDN zx=165k)piu@l-so8Oz21^H}p6Dd1n8$P^L1#l~lIq8VG96uAFpgu`dNL+eM)$}?i% zt;*F$XDQ=kmsSjS;FzFNDavqrkP_J3>sYYBs<83ZpQ4FLmGbw1aA*;zZ|66D&NIkni#3EeZQM#_UXs4KtQhsJAPep?QR4~x;mr@*5FVjBrNEp(WZ@2)}A-uURttX8d|rYuJ~_$>q& zRiix+?KZ+?`&zG4^@iG&CScTxuGxuSu&ivip|qig)mjm6K~xr@luASDJe{mFhomY7 z`Un&3*-I1)QSXXEvy90pSqK}hTrm2X=`K`}_>+91;0ZzqC>J39+^Kmll@P5$cgaZeE16 z(IBZWLavHW>EZ$p9<3bq9P-^*{$yJ#n`aEESsc8oB|XU{4m*u6Ld}-8u+zw`m9Sur zf*+fCPjZ`tjQIWpc>v9n0Zyd$>+^cw)#Rw^OlKr@ZeLlK>{Z37d)18C+y~wcpVGXf zIEe;`EbPeBg7|!S@~K3Bu3@u&YxE)6rT3C=OkRiK4|)h9$~vW|84XP=6{iAM7_b-b zky#crN3dOOo+jMR)N{b5O}I*e(?foklBIGg;@p>$oC_C+DF-x85970xXvATwQW!Qc^3key7AQl z%=!Gr(pZXf^<(w{nm*D z`GuLP5x*|k)k3hLwhwOFq6^*y%*v7ofJD)kr_YZu&L^T|y z?K$;K-*utaux<6qarpzo0Vg3Gd_e7_xx};hhp}BrPIu|JvT@i)dK#i8a9_ZnU-7 zkYibe3&dwU&XA0T-BD3l?X7F$!4bdJA{L0v^2X|1aowVkIMiqq$!xYXvbkZWIJp1e z;Xfu0Z1y%((Q(I8vQWh3{O7kB!&Jb?11`8f-@O_Y2!3KqyLgDhSPi0QcWF3(4cL8IvQ@*xP~ z-_d;gDkx6~iEZr>ap9}^v7G-Z>3}SayedFQhG~m3xK09yOEL2F=QV?s-6<4;kv_Z%cZEgvM}wnI$JfwEhbdb6xI}sN{UK!XNyma z0`7An`RXNH`;9Q&1NfUEIzjZo*U5pmmwtpA7;n4$IaNVt?p+;oQnK&JFv0oz*^HG z^LJ?$s+~c&1!~jWEX59PwkMK!gj02N|#eC?Mb~kZJst zOcB${!s92i>hcWa=T!FSUJB+VWCs|ME4RXT`|t=<+RcfiRlPm7>CztgLZK)!u(E%g zh^i8fd@}LhNpFRQzm5LCzx|r&N0>u5#TXO+7Q*4Ww_}80J808R5*2aZRzQH^$oI@( zxuj;W?KCw)bruQSTi;hEqgq+n&?W-=PQdHuLdB-DUNy%ypUFCuq#N`6`~0BZNvc*- zWLUp8?z=otSg7JwSSs3N7K6Lo6*qDdF!P%TV|2N-oLpg~DfqS5(A@Iq)65`thfvD% z0Nr%8SUhFe{~lmZ+4UclVo`pxr_CuK?h@(3~nBeUZd(M|2U4FI{2uT6nb5 zxH*Jh9Yqf;WSSRE6+>@l29ZhLc*Cxtdcph5gGVZ=`#>nFeOw=l4^sB@Q%wu5lm5Hmg$E#Nsy(C`FQ7h`$u3l%>>|MlsVg(*Ob>a8*Ed~1p|$T5~=22LIYruZTH5{_(RGJ9cVrU&@3E= zD(}ao9sBuF{nu_}3nDgkC_7AE+!-)l8Rr550}kI1PTs>PW~ZWCZ&ZEKv|%l55${0h zWPS_3&~lk?dNx_;rJ1XRwt8Ng0v%U+AJ-9N-uVtwP*^ai*vfb z4?u}yzfBT{C*1p)h}xFzxFdzmW8dxbkznzhA{Xuxk~5qTf=)ntdM_m1YF|_Y6IVEi6z4pKTg*iC?{V|Bkr~$iHh9tIs5a%VaPTWoPMhNd`1Vawo&^X&N;6X? z`K)zy30}{qpM}IGC%%|$=EFV)9=p5N%7<*B)DBim)bB@LYsr~X?w?eQwWL0?9zu~Q zsKdQnkEZ5rnihJluBR-f=6bI{L7qq7snUKc>F92o1pOfw7YF*DSO3EqnBlbd zmo^^anMgBK5);s^LoHC|@QFys!?|>?!h|(!eHjK5dn~vL?2#T(>i?R!kSIdNCtubV zZ|suPZ$Zk|%Eyxl^+SYHwC3r4(e`tIb~;=Uvva2uG`pb*6-_TE|93YcP^O+q$r37L zl4j6Amb3vjFj_3Xij#+*p(pEm@p0sF8G%ho70bJ^B;sZ!a?kkH6>XlfGa?vpCA#G3 zeTm;jlc6v^Wyr~~Q#pB$QF_}OisEVAoe@luv%H*2B z`@jWT%e%VvhLu4!B>l+65^<6lsLx|O37@&L!(IXf~NL*F9EINMjgZxg8KV4_8(aX%e!N1g9(PcHGoH22MWn zz1@ocn1Qv#3B)tO#%!%?ymp(NiC`@|+$nmhC*HuN}n9>ZQ^9YGgh?ztp`k z^Rdi`MP&{v303EXu-Lwe3VW$%bq|pY>CqoAiv4z$C8<_lS%!J?mzXMnPPhHo)szkWM z|2qy1$ZQW;PMYW7cw@=i>utg{Gg#Yz*!>|>!!@&KWbPcd$=z6-{u+hFpWr~!*Ric`qyLpTZ6+7kMKmd>xll%YVEt1^> z19mVrutGpC>_U(KHy5K*LJaDkBeqf7t5z4kpU^q%mEAk%oWlC~Zy zB5-M2+xjOAXTo)lCk?Wbr33N=P@&t&tIq%JMYJrD%7C&`{Q=N<($KPibNL?&2n_f| zHV_gbFyGy|5kcZR%o9N2fK=E;4g7z3@dG!)*rmvOQSZL!yK7@E{wWfhYloSP)iur) z8M$8ca;Tx08Fqi2bk7VVKU*pMwiJkK`S7$=wvl@3mHavHW3IO~U&I?%kI(Yhrs>Ze zhoF1^k~%?c;AbY1l-N9Cy{C&J*hTBmzT^1?Z@+sU29UDa{nUXp+8)Ya&0REVJv zwieY^3-Kf98L+AUErf#Oe2B9~ z58TR=1AGYuP2IzVvp8%2rHXyAjWmXp zI=|;moXvLP?>)VEC}D8TT6CaW<=sj2=CuLH2tf{_non~`By(@bkL|5yq&9RqCVfG?XkH4!* zdgMp1(2FJDU0T`(Zhqo*)t*SQlS~?%7>bF-;k}JD(`83e{rwtJ+mfy+R*d*LZ!a{- zE?+aPefhXun~sw2=IH(O`sIn17ItIz4dvzHhI}d!K573>8AIRs@ToU*)$%m!s;c?$ z2z)~HVs&ba=8Erhk$G|YEM|Uurhc_%b#7Auo60VetgUOL^*Xj0e^bTk&=G=_({YYM zw%Gh}zCF>SgU?0ULbo{5!sB4`4{y8Mug3AS2DnrqMBg4w$=mc6J#gJ6ZT}ZvGdBRU z$pz9EJR^gc7dEN*OVlu#?Rgv1yDVJ-DyZu*oyky0!I9r)MoF1;ZlL{56pA|8y^p~Y zZa__>FKqUMV%3hn*k;QKKlp#$gouO(xN|HWC;t62+r%5sf>s(YLSldyhZ(-Tnd|2Q zm*?C~q!OJ819p3vsKFC|UKHp0MZx^BhE$O@&)Wnlbh|heeKDpJwc`T}E^6bhLw8gB zgvho-+zSv4ZznqJpn;uV!-<00af}4)mZ8Fnp#ht*?Z}j!{zuG*pK--W!T6ms^pM2Ap8i*Sz2O0W=aoJ+R3+bX@j&=HyL7Ftvr0}iMbZm;UJgE?DK1h6 z>R5k+hAp=%&b8&FztW3+e<@f@Jt3Il_D3aS_c8&eyj7vxDRcaPxCnv}k;ME56a4={ z%@zXvKSn%6Ab^&V;9p3CHO6|wFn3fksTn=c)yJjWKMo(z=+SxKVQ?IYjoa`1=bONP8!Yi>k_G z;4i8Q>j+)$Z8@Pjn~OL7mOdaY@XM@-%;s<1aMy+$Ex_xm78UCySlw5((#)39bKuDC zykpSRvq;@3Ectyf%Ee@jj0``o`XRKI`;n{i+qfqd4iNgZSR+#mRou$k!rHM5|J(T7 zg&?b@m_6U*El^xTNwhL?gF5_(y{DJW)fXg$&*SCTC1a~$7@4?a&I-yVqtbWl4*69+ z|JzjWN1Q-#2rRf{+Y0n??xUvgkrVR^kUPLWf^FI>7c%b1nO)6P>|Xu&^t`ZcDcfIG zvZd?EcNpt3@U|~x11@V}rpI!ZjDyU_iV@CHgJJ$nBP8!nOHfRH{Y$o73ww}Z_8C@@ z0u@H3BpuoKNmbt~`Q>{?nrUK$wQKd&UUY3}ozf?Vu+jd7WFeLbHhv)VE1a9b2813o za2U6mgv(r6~Vvi^@+!jy}SZy?9v0*hwK? z>g}+Wv*8stSajp6q0W?ocq!X|NWYu|vZ{$84Q-HpqOkU0J(>PvZj7vf1I^Vkx*@@Z zq@?~=I}UW)i|=G5vlnqWO`?n`1N6zgqi?kK9S=rP%rVL>jL2ikVw3H8r1<^Oy_>D$$b34 z!A)N74n+1N1Bbxpevm_x7v`ctY5Kq7gFRlP?etic0@q8dis1T5ou?vdLDy8*Uk^T8 z9^<&`An{+m)c!mq<=Eye#P_4I;w=q;{%17U$t=1p zpo{uz)=D86j)xl@Dj2UgK}Z|;DvB%G+M4Bl;E(^7<<*H-@-(KmzP;eSSLgFncE$dd z`$6)po3g6l*kKOwcN5eL@WM`Czxo{|Px=}RtD{_%4TqhUYG!8M(*EuT0n{5L_i58^ z8$J~Yv%5@$6q4c=PjBmL$>@vqSGkNFV88Jc9bYbaE3bj=djd>}(S2X3_qm%I2^?dw zgLu{FUsTsEb7-Ng%uA#~Q1`uNdumQTu-qy7N~mxH#V)KnrHGLfraN0o)^Ho2C&BL# z5*KO{x6-5z36PN3DRTk=1Q z>8>4}TA+5m)0IJXJsOTd}8io}V&5%JyFG zYxqH_{*yPW--Eu85yvv&R7&AyxsB4!sepWHzC8P zhv#R_8o9+abY7>`%?;X4&!$QTcbp!%4%$Z2C9XslRxkWV7Bpyr8@-yR#xQHC^u~Vf z>O;FrXJ}6=ZKm-IzQO3~T)Hn(omc1;r*9BxIIBm_zzUz+&ul^)d6uy@ORfCPayO?+ z=$CM_G^xQZ%wdJs)*4w#k@5OfvVYmdc2cE~LIwZSSyJlb%EEoh4gEmihN3Qd!$~7w ztlGo)=hsG>goQ^nUjlW?8+0L;Q=h!QtA_K2AY{CSqVu&aXO3ayD4%%Cz}%`C&6+D- z1*%^9)7cW8+sNfJP$_e?A`|skg0j=w879f#MP5WO;|a-1RH-Oug8X@bI(2j8ki^uYoxq+?}hWL^C3`0Woz1@eaJ#e zA{(&d)7IVLP)aaq2hZ1a+NwqU}3JQIk{4cUm^JO8ED|;bFc=b39m!=&Tlm3hoMu9{}m#J+~Jx! z4*u5GhaXa;T-vPAIAP+>2azv4c5w65O81!oDOHVF4SSjY^l7A!d*QRzj_Mk@eY3TX z=5sb&ySoE~Le0#0jBFi>F+4*l6_qhM|C?nh5=NAi)=^4H#lVUmyG+rrvVo2z;kA=L z4oDh8J{3(P{zIn=CgkPE!N^leoy=MuO1uCb z^1@|m^AhGJrIMwO-&{0G`a~rKC7kgO@6`7h8xYQ>`}Ou@oOdq+6?jV2$|O2ce|{cO z(-ipw`I|=~Hmv}^wv`Ip@1w=OrXo8T4wF}h??nnB&;iu7#d=-O>CPVS8@KptIXjW^ z8FB^-9U9TV*r_LheiQ_Pg5`!W22R;Bo_JeR@lQM5$w&eiu_=^AesoC{B)qW zrv=x3mL5xUQ-^o_<*oq!;Fv0A{-T?&o7vj%CN?`0g$(O~l07iYSNcF=dgUcK#0lzn zm{^bBf{+Hx8KrXu_A|w&ZIZNcP(?U|G}5T&Rsug~K)LL8NsM3~+nMOTN$jy4JT=mG zKe%W$1q`}V=YXO zd2k{8dp-FBD3e%dfaBZ8*US^Fe!OXzTdO%%(@LezE`BSFzc}`kb+d$|5TQT38G6FQo80(-GFngpJ}}FN@b{E?omlqqF}QAhY4F^3-JMscVk10u<$!GiKo1+FC#WI7hQkoCVZC6 zy{mPpYS=SnMhx^okG91?4fYe$*KOH8lroKHW^i<@TzW(An*r`sj`EGl*JW^1n4&rx z8&%B%OM@|9SIpHkB|CHsw-tl|SNkVHt8g%2=F8pi1>6$mB@>tsHE@qVBJf)KdC!SR zO4@1TZV?+;|4e`HJ0NFlva6W`W@L2hnHCab$`eqoeCsBRP_^A6*Wp*cCcus|I|}_2Y!M^KIX|FK7fr^H z>UarltE|s=7*LJ1!J=A!djW7(AthG2+`?L|*PN67-NT zP@^~BV&?b>oqfOPgopHy8lWU){E{zY^{EMq6GQ|La4x`~wTftJ2m@Zm{C7X#uTjs9 zaS!gwzvyt|&33pZhXylcC1Bwd8eBY!o!{pMoV0%l0FZN(0jRlkVU z2mCAouZW{HW(t_;QZ7nLP6qU%=s)3!&kyF%eK(x#>dX8fUL+0G|j)u_8;P_HH~j!bfh-Z z8Ga+cM%b!&Xy9i$3}ioV&1nOPTqr$gOF|M^_-I1&-tYBXrx>_>H@stJedvQQ6g*Fo zNvtU~iq+H=3xuGuqfJ-4pgd1VY|kr9a3#G!@30*9aNN64f5~IHH|?^?Qn0Lq@fFNs zO`%cAv{Z0iw3L=cTn1_xN`MD_&dByosIB7YB^?|qDX2^cle4hCUbZ?aZ({Y*fuNH6 z=){`j#$$u=qES<6$)UdnUPDrIjXy5t{=BBp?Zd=Vfu04G2+1+6Y?Q(k@1KQhZv@)p z!GkjcsIOgo)+!r{Z^vLjK@7!o>K*N2^9NCR$m1`!7`~)CVsEcPSWa`E5<10s>W*sX z*-yugk&`E}L|&UB0c~=LGttlIIM-{RcHJYR4lTg@nWjm5I7>pNdu*KO#0tGI+3`*q zkm=s5vV{xHhQr>t zx6T%S{8BU5d~tboWYf9XI#v2Mx7hhxORju(O;3FOS>Nn58w<|~^LCCEQF((=P?_F9 zI(JyEoyvM=WDvALpX)#Gv5N>O(0D`+Q95K$9nAH(nQFpEwkB^zxM7X!rU zwpgEhUivU8}^S9+dlOVDS zb@Q1WPC6cS7Sr0!KzZj^DJTkp7!j0gSS|~y#>XP>0aLk4#bRZ6R{z9;8=6U&0k-WE zuU0|HxR^l=`e>s1UfbH+48LLLBb0`L!}{IuS=OnGexMT=XMYePZvu10dT~nnngC5C z+H|1|72JjZLR5U8y1)$-((i@~Q^Cb;E)pD;0X_Cnly~NPgx9lXN+?f_I{B5TrSIrn z82shU65ww57BKu&1PDZ?UB1eJmYiVTZ{sSEg1vy0{8duyervNF1ru*R=)jxJ z9+_J~2_QtbHvpSw0fvG~orP_FE|(%g?_Zs{zd#NZCt@tlNUZWy6WkUyO+Zvd0*GMJ zj|`#se*2k>t7LzL%^jFygcGU0EY~2aF*%{CAsJ(IfFKGdi2Pddj6k@#z z5RiXH7%K7ss-ap7N5_lVeiGwFWQ6tIL1`SuSnlUNTHoqQWM+4ot78Bu0P5g!fqcD^ z&ayT9lI^h-JcQMefz|QB~&JDrR*07V(GL4p(Y z9DJE-D9*P~IwK81bNwU7i5GqcX5JNjJJb)_V<1@_Ag<(!%sH(;I9n61KSeX(0|N+Y zr;+Q`j+6R+J+!oxV`9S+Uz3F@huco}7QCs=v|b$e)Li}G<^;2@K(Q;QGk}(^2>VhXda9XN^ZcXEhmBu`VLU zzPbK0LGLuvKcR<89p=DjZ9R2a7eM}FY7 zIv+xq1VVSzSQpcv&Vm$jb+?D4cqX&3ht@}zeSxT}>OZp7#wp*UH-E4VVYdstHfO&G z_V>@I`W8_E)`|~tCu__TZZ-Q_U3^`r+cfKA(|vp?=A|UHC)|_vSAAnkUEwOSrGB!v zO8B!-6{_y;koymZ;v?}*mvKBw4jp>yM*ES4pkw0?Jrzo!P!(n#IxP0L5@2HD9g$w;ZBq^e*eNn*g2y#M@)W`P$Z+p@4Z=F}PVDBOV_#2E>`Kcy$a z!6#|@cAuv~ev^_a7?puyfyfInV&tqKDXbWeLNJO!tS94l%-^OR;Y}Q>!faqg=XGrx zMcND~JmFHn`)Qqpa7s$S+%Avz9;gvIN50*Z<4Uo+g>fePLa3O*> z_VfDiz)VAV^+B3(2((u14*6JHXVL!tHP!WWezy!DZ*80jBt;4~$CNr#KC03Sh=adn z-F^~=xiUspTmUOh#7Zz=4Jas+0K(!vAt}p*#Y7p&NmgM0kzIprEljOhD)4brY}_3v z(-}~o2}D6WV{|28BZ>~4cswO&7LOt0u0PL@&_50U34ym&m*lT7eAZkUp=5j)jNwBJ zKm#8GPu$fvYAHs^az*)mH? z>@5q0q@jdUfkiz6^EfB=MXI!IetSbqrVdEm>q{!YAl zC@GoooRx;$=9+k)8nEMAc^scoj9Ws$LTle67{Nk=R#bMGWb{f#H?mMEGJBSc$4-b1 zLvc+Fgqf@8ocLh7C_bX{7urDN^)^qkAj5VkFfnAM2Y$g8s^fAZ@dvJn2c8j;tNbfaLgdh6QZsm46rICJTLDuj`lQD z=O;>bo~&I4Modd5?V*)gnG39Jm;sn>8yQekCV_l9>=n)h%@2jLl9Cm-{xM^~vXpVK z8H-C+WD|A@svrpsEb*VXo`%PR#?n8;>7E+2l6xP&dMyii1|lh`1R@n-J~Nqq=c3b} z96O3R3)5BG54uths_u$T_aZnERZK>OyeE3kfx|EIX=!S7{Ok47BaS1~6sIB|$0gHaDqy;9 z2Z*b8IDsG^`5)>vSclT!z(id;jQkvvJOz>{!ZYGfklOzt)hj=t1`Ao%zy%Vf9taJ@ z5%zhPS*!TIs^^%}dMCZ;fwtAsSfB=FMFrq&( z)DpcVb0;Kq)cpUn$k~dvo{eWOr`Xxl2&W*h+B!obY9Z%oVoKYv_W5fVThbzXf@JtX}J8Ys?S4C)z& z1>LuCmS=(%%+2CL#IE#YmXj7w`EyfGu$=#t>c)QK{hpXX;@w1$Gv-K7+~xtnHqh?@ z^lC3f()!7PD;NwYE+5F0pij_T6Eq7$ge5qkCj=fe z{bQms6d?W#>)ZRVhbzUXRDeUYNFlv_jABg(k<+8dQGyoyqiW^3B5n65i#iRXrmj>- zOHvY81*pPfAY+0raP>&Fjw{=iG_enen5vZ@g&3cL#f&c6UPl|0C8rJ&I@6g1pdh?N zDX+7d9|zn4T3dOS^$;uduVn)qCzQiOj~;E(G2qmDy|wp(AWLp}F8N&^J#k;{A2&F7 z2jvlpCq>4SkyiM*3xVz@TsbsyG3TI3^b|Ln}S2hIw0x+R#g< z#A;?S9$RYP8$exZf%X$PGq7mdiAF^!a{Y=l#OkYVj7S?e3A%@Bvd3n{Ab5#O%&r^B zYqF$~d#$JZSfaxX2R6b6BSQ_Qv9bO6#}N&R{;B2jDg@~EPaZ8vhXu!bPlq0=np=X5 zHNC4#cyl%Fp{(gg-7AJ<`)>V`0~Q5YVN9JV7^sIG<{k(KEvefF9Cw1qWn8D2@JpPs z##|o-9nr|`eIe7Vm`%o1bvCY6XV7T!3wv+vQ66+L43_3@{M|>wQl$!-v9(FlU~9i9 zhu`-T)0DdKeHd5-Xg2u8?c}w}uY=P})52IxvW&CBi3+c(!!X9Zz!m0#1^3;`8;Lkr zlllseQ88D2EwJ#YFdap9{FnH+7A`hYz<+*@rF&h^DYdvFP&_1;#sGpfu#j#8XkW#2 z4o%S-%0$EARJLD~#&Pt!zucvSNy4~(xAtql!u*v7eN}PDFw^)VKu|c!K+e54Kaf{6 zN<~?E52g{lkCqK~ zqQ15;^QLWk)SUq8x3-T&C97c42Rsh$+C!kwfj9CRbkPJPJk}kgwqT~yH?#r;(bmNR+p5z~ANfZIhM`YjgVL1>|#?$4U*gY~*TJI-5OCIUx~Gmw-#{0Nn%XX>B7 zCsy|G{t4sKQOWdGw1+t>qDA;?G2j649k8m>Y9XX(>=fJ;yQ%?ad;a_M?N*wcF3pU+ z$+?hLelTjV3*^)Qsspe!AG^##Em;TS)PUCk>TCO8)bL7fgX zz9pxS-QxGr*e!gmRYw7@QeH2%u>P5msj5#fp}T-}y+1~!Ss4p!NWx0}J`cN1sV(pz z44EBg(v&sQlUa!|osSOzS2u8Iyc;unS(Ii;cb6#=vdP>>0glCY!`B%wNL^iUdU{J@ z6n@$cckafRTD%-&+NH~&t#e^sdvj#W>)Tj_oFps-onu4{Hg_I|Bh@{hup_Cd4IQd4 z?F2gU@S*t$%5)QC&k{g@fJ3aGdE1%uscMXcHk8sMaYM_xppTQ!eb zQF3qyA?)2=1#liWTxyW(-S}bSuy@_u4T>>Mt&725JaQ(e!V9a!cG*9G8T0%a1X27K9AlnitLjr@o<>{u3~bZ*k}NVFfuk6TwsyDK2zyQ3xaL zuM8Q$@uC37cx7L`l2Sq4ZJ-O(;wF;%8uY^o+fmFiOxGA39K(eE(sW{5omPrF+%p8P zi>z5LvuA`cz9b_gGlab^bgB{ZMHcF=rP)6T9qC-~ICd_dQS2Z7qdWvI(q76AD(B>)7!Y2hMK!~upc?;8{yTJiW}+nbk^j)F`? z;0=+2D`9wi4|u7D{-67212Gnb#fVkG)!WcF!9HQzDi)gdDpt>aI ze)P$Ul)%0T-4W%Q1Pxy=c5U#Z?6{DBSBsF&5GTM|-UfT9i*^<^8RO)Xbjycc1C7D@ zmI*dKv|>I%ug|4FFygsLqPtCAUfB<6Oj|h=dCueh&P>Ju0q^Yl#hdJtR{mW^kZ&RZ zs(t;wKK?f5y$n^%pb_YJ(h?*eU_tu0*Vl(J-6Mcr1_o??0JWuDlB@2TWjjWjAg&(S zfc6{m>bGtxK4iLkE#e4xlLX*#=%c^yklBn07jT4^sfe4s=B{dpcI!NQ;J{v}ErBe~ zxYas(zcCbxbgX(leD>$-dg11f`OX?tp>J-Q=Tu*j7m>g2Yw+JB9L`uk&Lmn#MCo}= z;h*#d6sjduDBw!oWyc#;N+JsliWF4GwdgSM6>+Nyli!t|Rt z@Wzk1KBr^@z<`@d!Tr}4#_p>Wl{{DN1z@C9dHwR^sa13i)9Bp?GN1Z*%QuG=X(8gA zrzWKV8UOR0Plx0iaPIxvk=#Rh^U+JuLLs|)kcDhO5Auz6>~;?_wHi2Z1p2 ziYofV#!hLnY1bo=j0PPHSPv@EC-$NELl{h4a|o4aExM4c`c>VzPQhFPSHIYN)WyQz z*qlgst9bkeUk>f7TYbK@%3~&l)viBX^dYYgEH%>j{78JnxCyOn1@C1!Vy^BmTk)nK z1O@4fz^Cu$9Rdks1Qj^2zh}T4UPDbqs4{>LhhO4v&V0Ms*d~@l>)k5_B ztoywB%xm%7HA19F*+Qp&8~&QNuT0}rxcphu83^fN0XVkAmb&!aosE<5UIB1k{s#%_ zL;DH^-yU$}{kVl$t0^1O@Ho3SgL8=v}zC9ndxV)xQbTS0mmrn>h zzX%y!V@R3#St$XSo5YC!)gwg5pMmNHq=9%7NBhSI7Imp%yT$;wj9<*$aHH~i$8n+} z&qMdoR?e{PmhGT{PY;xJQF#RpjYT>EZ=$ENJGEz}9H2w`e3^?fs#uCJAtp3?K|Bve zL7483PznDGqVk|XhUqE%8bd6)=Ng#C*C|1j~XmoGBcSb95)xz2AwJuZ6a-4 z1`%@kAu()6Wx7P#`arwFuBe6yL9tcfulXzJel)1@no=~GCI%w#&JWG*3J8gy*bMT+FZ&@WcOzXR+mZ$E{9U5#r5spQ zU6AnVzps0GxCUZu0PmiIn1%gSas;wn$1a6p79;zFc7q$1Pwueydk z8@qB@>JF;*FUAw}x31}6#>2uf2k|QfE>@fFu=l^j>H!#)Ga{EQ>RZh~AsgNfhz^^t9*~LB56i{35^KUqdX7M+U8I>N%u5_jSAT&`wr50`)C(!+=5- zKN1x{-QR_N#4g8hQ5pV=;RKrgkrCSvJ6P}9lB$H!$+-+RpPHCYpdPS%*Au$oY|fA5b>4~ ztyur%?~gJb;0pOYe@`?Gbw@PLsKm8vAP)`NnSLjsMC6-_de*#gWuSkEa6=))Rw@S| z>@7NfC*?2ak0O4W!gh^8%knL2Zc*}1rZG`G(9ibTs5;5lSjY*mYXT=seLw+ z;M*tzhYct0T}YnjHW?^bWN$yxfBdtf03UQM{MfH?tQT-3hm^l}_H)OrC?@DlIbvxM5~@tztaE}UyFdk7NZHxpvcUzcJ$is34)#@ z7geXruGoQC?_q|RL%+K~SfVRuv8m^8eg}s>SM{!bYZvcY123tx9p0d>lVrm3F<~o0 z>sw;MTNiee@*V|CA{t-W+`2Kf@&B;*mSIt@ZQHN{ihzJhNjrjobV-MTNOw0#4P63K zgCZdf(v9?hbmyS7fCvm-(lV4Z3^05b=yJK%eZTLvJwPGf8ZsYFK3a7Gsm$W{e-GrPCrZ30_BlSX9ts>M-_nH+69_vZW2^C7WHNMK}S@4t)R5O4{{i1gC^r8syR|t`0se%ah z4F*-KBiy(ofL6$#tMbADv^L{CqvkJ@>6wkBKdhHZrG|d7OXb~vayE~n?a~QIYyI3* zU{|ENP-=)4pd$?tz1`;^0#6s*GhX^xi%1vKFutIzMp-dV?NJ56LnVj=@*}H6|2DY? zvQ0O}`EpRoN@aF3u`d%v{h8e^ZJDoFT!E6h4LNihz|Kjb5=r#RT@zUU*c|ALnpGOW z0#mVi`%nRZ{ifdIGc_>lKDa5aIky|L^=nGd;mgG zbpQoa?Xsfik+4$x*qxMXIVkEYO_q3>2DcdpQjRpZ*>`_ak!5k|<>*Yvu9no%?y7&L zFFJj!n)UqcqgZ5zjWiX5Y28o%OIWVvKhen?<-cX?zwrm3 zex#SuZORc)F_gUy*r@ev7p$k9tL1w4kltYK%41^Z4=O&1eO*8|-o;x2g~`~9m40SVCo5N~fz4B{@^hP|SGTrKIR`v4)v_YdCx1^r${eDDdN4J~zc=TV|y53`K0 z4NnWuZM%7CC4l%(9i;T#UK`?hUejlPElC5K>?CYA`Sl0sZ_Ikbper{79_GXww2=1z zqOv_2P>S#rii#iua+*@o!?|R8xfO=rmfr+B5f!&|C}TU|g`+OWupe!sZ~_R}{bjbi zamGJKAxj;oErZoy`Lhe>?i6dOoMtkOGdFnM(!bl7JN4+^=&d;2c@_$gD}JsfrDoUT zXqEVO*z@}}LqLy+$V|ooAS?3IrP#py2mqdpfUrt5u&q2Q4p;5DaX!k*4_6gz+eMKzW15pIEn0X&~_Y!06rZkmN_=m;_t(K zAbSs_E2L6F>lP*@Ob82{fZzjm&f)i+y2VgF13&jX4eMFl3|8He=kkZM{Bf%$wByZI zq$r7?(*7syM^YPsg0+bi(WjK z=4Z1l)ugAy(RO~nN=fSj6dL-+3g6Hkm7=7EisHBh zVr|cM3p5O0XYvxeo)l9r3ms3gZ?`hcnKb}pOMh3HD$Z2OE&v<6D6(k1^C%BS z6`b4xqMvsD;_Z!;55?$OS`NU?pu)6m>$AM1plsZ~!vpcbxB77*l8D5`@(6gX)CL(- zlIjKD5^ykpMPb4LLeAE}yhyA!u{!z3%O5nX8w1bAe=0#<_|h^zn+_@cTTmFbrl)Fl zaR~ea)at=c@bAJAmx38U=spZC!7BO}$K)xLy0;A(`1gt{`+acEJ_tI$8>hEe(g_P) zRAVB)bl?|P%vT}{EAhvB6>{#`;$dc)^P@pS^XJ0if0drZ2XBd08*Cpkz#`x<&KawL z=f6%DP=p~4duR%{9Tj>ZC%2`Y;NPHtcXDX zQHU5i z1GN&lbb>$y(4Se0yEYOlD|VvdJEYiE8DYW|h4DB1byJ$sRr??qZWfgU)~~mhu<|Yx z%lR3i{yy7qwJyJ!dC`amhX<@OXR^?e-Zp{Pe_ri04 z>p#>JFzMR^>fFCgiGrWafmEvIhvy6T_wDmTJtOkz z{y69d4@^H1=3FO)mD!Nxpo-w5<{sp~PptUhvKWsdcYpgpHdeP8DU_PV<#~3l+ZNvN zA4hJ0%3tnC7D^tIRC2srGHc)(sgl*Z$Mf4=2dn_nRIqxYx|KA~JsnZyS)2X7MX;08 zBa~sbLhvj~$ICEZU8xJeTk^k`WVNsMsuErlbtRvaA914dyp4r>(!)ks5X+4R_W>pw0G9oHaZ0H!+IpA7 z?YgWqRcn$O65&|H5ZTsc4Es|?1d99?$2H7QGme`&HD*EsnirE)kQWH3nEdiVw2_hf!SJ#uBwtm$oAow$3mH1}}%oCL$9~9Uq8+BW=6i|S^1V=7-2!!Q8A%{%3mrvhJ%&bqEmcRA1H_QO+5(_*UBnUahf!p9hSwcKL(Ubdy$T?Ip)@~V z1bL_2FCtbz9eQoLLyDysZW)^Z5O{u7?xi81H9{y6jf+C|OqC*%ucK2xI(aTFHi?Pp z;(h|9_{%%4or;~vt_~$xFz89M+s%$_B#80gM_ug$lFz?l>PiOFp=VaRQu-v&k_}a% z@SyG8lZK~O^>972OV0%8SORGhP^GJid~gbd6Uc1jz(eic`~BKD9!a|Gx6A z3pcd$YE^fBND1G5cwzy20EvKmM@{gnaB0Oy0^JJ0H3h0#zkJqBknCfe-F%f3)3d%0 z$tvUwE@diPu5V|}f+Hw@G34iNgOY_&&ZF{C$j>5fI2=4GXEasn*}2mCqG^||_R@+0 zInl(^E(mg!-bP&A3)x=d=6$jTfhnZ>Da(hM0P7fA*YWD&MO2VJ%TP949{;`=f zhIfxW(nkYNy}KGxMO?qAJ&i`KN}maTj-3}x9v_t>x-_`JTLY2A&j-!#j|3eaFZ6(WLsmy38RPFBC2ug=9sxTN2C5<-r5C`+0>wz_rGUpWPR6{e{A4 zTu~sqJ2oz3n+Kl_?q?BPRui>9-4(=ac0Pu&rdM|cAMld_RfazfpC?f{ZT*XxO}`?A zqwlp59k!ebFryJm*60LDXiF+N zq&8-mqAbES~+IsvOWBBi9IgZMUwIp2qVHp;-ll@;p|XnB1y>*}9NPUDoc9v z*{ex5fsM@O9CrjXui%uWCm8sDtUbUrz9>jt@GU{nB&~Rq0&wnV?LEP)*&@toO93EkG_)z6E zrY@m>n3oH_jQ#^~ zVK%&Pn?%%5#maQu)+Yg0+1^?F#qUG!_3mXft~5ptnuqV8ocFqDjXGFtKyT7 zv)MzWCaSMa~H?;M_GcHK>*;3g8V+H^%ClzL}-s{Dt62c3+h9C9#)m9 z$i{nF=1aa9!U>Ad4~V>wjP}LRPQ)$mF{|~G7US$rL)^UB`^eI#jW!^r-4%{o0P0Rz zt#cWO0WRw@bCFfQ0U(kh!JdEX3`4GY2bGu@t9mk|ToTg&j} zoIfDh3u$?E)p5{3ZW!w}veW>Wv{2rYD(DuT8KUaq`*gIJX$#OdEuR72NI2Nlfe|C5 zbvf1TiT2ijB=vOD$>}8?I6`9Rb$hL8t+-)cT!>GdUg`w^mKwq!7AcO`M`p4*E0tdq ztAdnXtd@`939jFR8hCEFWP$d4GG2IWHdC zKd6v;Z=i0s63k>4Z;@ae#~{!Oy~QBlHgn~U(;6_S0CKVcG}Jp1f~EwF=i9U`QpFEO zliei4z1$bOIwiv!Jr||8?N%Zv+;_U70>iyt76wuqY|RB~dLPZTgYd}~h&ej=p97@H z%BIL}V)|CjE2d+t(hRDG4$HoNA3fVzInRXxke34_=GcEKTpfs+Yv}4ka7rWED#+HI zlC!_2=~(gM3p2B`eZMpGC^xU2g2S9PxBT5TVlATq36cv{bdGxuRs}#Z9{Y%@vF9Ny zfLe z@j6bGsY2oHJ3tv&v^gOz(Z2auPPx?Ob+&17-SQy)-t&;TTk!?ak*pu1k{mlo0RgOf z1#_$srog-B^UI0a^iQ!y{KZ3sOoqFsTcPM;G2go88Q2JE9{B1@=G#g;y)C;sh#aN( zd-2Z9$H7Ac2UQur7H-ll@>(H_kj;|1a(Pw>-DXP2sHls`T&M zADDiLCFsSG1KOPat0v-82T(LF8X#7s0O%&iB-}3aeIqPwg~nwUtM-cdOSX5S;}!(=h)_(D%3W$wkl7g}~pRg9ZNTP5|hQ|Cq+|j~0&q&4)n0Rv;1>3B*nO zU)uSBxkrOq|5Ahbt+eyAaTGwiE+t+7dB;DR0xpHXfp%Kpjs6@R@w-*@vRCJS^dSJ= z0c@dvtle*x|K(7o|M&x!bd=wkju(8YKXs{pw=@0Ji~{I+zXsj>L2w*6Km;X<$7U*-k5XAZaPp-LP58LEDpT>>r^(R$mV9Na;ySo5PJzCgx~|Q8k3A*NEy_>b z{}%@oCEKMSAieg*xgT0HGr0W;$Ex`l4#0E3kJYagJQ`IiX|}5Vk>;s(xQS>!>4i^R z&S3)_=)VM}0RPbSz%+y<7f*DmHoR>>vhW%)yXs_0I^ZKnD6)gBGW?eCi|AW{Zu=+m;%JK03yLj6F;l*KFB>0r|^_?8^h~M`pnf zZLo&Sf{?(RlIK_poynFw)ZW>4wNGGb^A-Ja(joWw`-M#6fJI@G3|AX9D70&k_uh|v z=m@q_VS{}zG zSsTDjU>Y68u4fS=qIJ{IXb6*KJge1!griQfbaUfLv5uExQ>6Q{a;hK`#ah28Z?qE{ zr8XFJ#>#4QlgBdb5uA56LE7wfWYdjk184aP8m&*hIK)lEXd*8VP>(`DZMsjW0x=>l zs1ahcQCKq5*y~TCVGpyVdmxuu5H28-&R)@9Y@VVFn_RD7>&^BvgaFgNplg7BY4O*> zcw)&w>1cSGCqlrv_r0PRGXh}IW?%4%|74zB(z5{CiO8u^O$;VwwtPMkDC-=954NC@wS9tgE9cIS$P zwCF4+E5ZcMbK>{zq8j^Bqb6gT2$(*W5>VWM&MzZFvNifF z#M7~y;pI)@@N3J9Bf9&u#Q}J>252|0%ia~4Qe)^7teGvg4&Ih(@hq(b6ks34>ByX| z8TP5(7F^F5(e9M%TimGG=X88cUvZN(Qvy*vDR<2nbzD_T?{e!$wQV(r>PNTP)uk~Q zS$JiuN54Ri+Lf;wNB3pk3Ea?Q#-z4kgadlNe+;j?XbOg(h@XL<)=U=X^AnQa*rgBl zxJt#fQ7PdWru7`lWe3<1$UTC{n-tD|B!gB`V2TB;INuP+%tluH0JmVnJarf&x;DGBN%X z!iEs&7gANTXvG~aZb-s5f-~r^Y&L`-*2_asCl5f`8~>q_{svfYffF2UrU3(#m^mt` z9R_H_TLu3&gBNyqb9~Bqmy{EKus^b>Jou2yG&0#L4fIBZzCY5Ke^^vJpeipNbh59h z`lRdp=6J@FdOSJD!)aL&aUP>r#posrT&DY1|AW8?ob*>-J$L%5y?S=i&lhW$&t4wt zPfrK=8!7Lw^sqIv12>f9HJ(^(DTd8plC=hkMRrwG9j4Ff;y18>;}) z$`M1Kro@;lqf=H)`WD4?fH!*pGpidlsK?9Q(T#IK|AR++dC36l(Q-Ij=(#zt1@b&| zQ5}3%nHG7~eRw1%zCevmNV1)Eiu@QK7GfGE31^kR@ zpfzapf& z(2SP?A_A-jrr^8R@!<9ZEw{HuNA?+{3am=YvO*0X=-eh13wX9^c+N>aUXcf>5lam7!(1RTO(33?jTj4ZC=tr?qpcby6UE4GFzdJ_mkCz8V`~n(svo}X&CA^ zoj0?#9n3m~K=ehh8{9Nc))!E6rtScR5tfa<>$-WmR#4cihBB)jYY1T-WNUnUW|=#{ zRsh~krMnd##yevFxrI4|ITQ9aX}JUjU(H+7T+PHowU>I;?6uVPivwCwRDcPi9yDdFHb346^7zoX zZ%drb5X3B;8rln=?V^WWIvVZ&+7bgSFYmOej=!$`FbgXM_;{&8v^E|MxA!_ZxIth` z=pKsXf z=$7FCQH`pf;?r7MP|T5*@5bq-AeUzArOX!4V$^8<8v4x}2S_emG2HX1PJCI&=eF zmd>^=CoU9Gw?ehSy7T!Z7WWuQp3 z#-=J($Jjq}$f%-^@Qc^_v}5NZl6gIU%vSx+>92D}-Zf?tpZG6z;nPY{IEV6l`aFZK zndZ2#7w|DH+C>}J`l3!SH5f%5qucNVPfOR!eR=`&pqr`>8IX|IZxB&BT8q(s8mifymuxTMk`o&o zcRDCL78;KYLu1{)R&{nTab^AUo9pj)zR9viVQ;P1<+;iw7m-NeuRz%_dFWv6WO!HO!7Hmf~dTo?lq)ffL-%Ga+T(tEKsVaSphi zyAv?HpfS&_bP`==Xmm#BR&xW?^YFenFz5t|!?K4`5PUT1xU6GFbml3k;eEE!#PF#= z9vA)^%b0Cl;H^Ou%J&3yGArRvqQ_1|^~N@!S!+pttwfY;g>exd%_4Tv;@jlO1}~9^ ztzvseKTooOXJemXNu7Dr*8L1gvI6Fhbe2{AUv&$U>)|Tt^Ipy|B#tdt zt;WsFu*Aw!Fn&!jP2gevdp?D-fA6~9lhW*4W36Io&?XioG~zIAfsR_c&_8t4>>B!h z>8JsUy`TQpQEMq&9Lh@@45LW$DkKH#xGzz=%?d-Kl?oOcXu`odFO5C1kofeG$ThlTIlr-uDoy2MQVY3M%iKfB@Lny2@pr(;=@Yc?=I<9z z#PKY3o(E+<=oFnkbDy&WCCYw13ji-~e6E=d|4a@0;j4Dn`Cz>M9Pdt?8ZbroEItC0 zDiT|)?YtW9bzYXR!XWcgeU8K{b!4fnfgt`o3(4JVtEdT;rb2ve?m_-w#rI?#|qfFTui zWi5ZJZwiEaf_<`QiLQp@?D z-Xt@nQi@)Byly0+(76X#yu4WhuK_rzkk(;-nqvUUQc6nEX}!2!W{ajgDbTihz(<`- z0N#6&eh!wbo4d|6d=)S3(PoWd#Tzkcz}Zv#*f3^)%*=R#FKmi1kwqr?bM9?XkC>B}BBxnfMv9}zQ?t{^(dlMPEG_qIwD8}rib=58`q5y#+Y-8P5q zYj6?u%z|mo)C^bY7a4s5ZYFd03)NTfb<=)v|KQzrbj{^Tat_l^?6K&k@OtLoFXyl16eB?gE$_`S4OH+Uxo9*unUnb&bQv!#!Wz-}=R zf5CoYp1kTx77k?S$iiG6*l8y3%W(cZXA^ez1nTUKe$gs{dz#?(GD&i~{2I)-xM&WO zJ=Gt(eR;x0g+)dtq95vVA(f4UrKS|QM4IrEhJy)#=utfrIx}AhTUe6_LG^@82^y0x z>UjL%T$ZyBOXj#W5 zoKK9zt~@A>vZqsL#(Pxmb7nyxvdnl)$cA>rAGgE2r@zwYFjWNk^-(rX{Y|sBhsxWU zZfn;sP_puad!~;sW*f!0V3`XQ(mwh8OM?I)!J2d;0&q7tbbJG;dHkD&&Kn`-;QitK z+2EbiojpZSXtW|wLbz%2tz{YZEaTdz4f42Z6cTv?jzwv>9e8$K#~&%W$Bg*Vy8i}Y z)^afA14A)Q=vc2}c5@j9A52)+Ti`Z$wOn1A+#+tN->j1q{fgU%7@|M%ybi=wn8U{U z$@azPcj6kcZ1%t`1Yen)lsa-xle3K5Dh>4#Eg3MV&Da>;# zbl@q`k_J1YBa3?eC4x2K zKNs=akQN;tuSjI&UhCp;bKv@rV%4^ZN$JOGzHsW2F9Nczl_8&rm|10Ee!?5dJ ziM(x{S*&3)_I=ZSkwTbDEfRqgG<0t!OYCk7Lgt_Y$JFqStZPE z{z|2()|PSLs%=Z0&|%8MUd3`8t*({yJYuh$e0TJ+OUi>NRd#{|^E=s$AP3iY@n;A&a+V7hbo)bJizm z)BP}yR`eMj$n*GMvQP8;U`*V{WMFwfa-a9ssFwKob?^??51x|7OqfSd6W_Nh>Muh| zAbAraCkdYpXSn?F_=w9-_yp{m%&?b|tCQ_FAwwF2+b=YA*MKq%(sHt(V`YjUoY({iPS_0 z=hj?RjSwmaGveLCQ-w0sv`O41zHtV)F!{4X*gk#{@#V~&UpTaMJ0BZyl5v2Q0khgk zATnB$ckWAbFDJ4|l4$A%ckmbJfMK;aAOSuGi zL!K_dMC_8${%hG76&d5KFdX#j-*H<4HtO;qxau`_$WE+5qr!KiddAiqA&tw}ENcdy zt2GX`W&RNLF<%@6Np=`n4*kc%dyj|Y^B&! zpgDuh1mpDUiyn=B?h;wiJB$TBiq}(tr82p*jMuLr+}w;S@)C31i|bZg4L4pt$l6GE z)j8Y#mVOS0q5R~LNNeGT?)(}~_Z&QKC{brW&kEby@jM){-=yT}mAkWO_KA;+V@rl< z)ve$O=VDP2LtF8jDhBotb&~^O=?UNc@)Iqba5bdkT6e6%IX-iShO@orS`>3UX6@fAB_Gke#-;|MjK+AJzplDeopDr z2o2!dkveOL{$ihQ;#sObR=p_kV+Wz>wHe5pLD{rIrHVonPEdWN@FlnVic6KGmB{@f zAJQsF+kMqe`BcYCcr+&-L3dEvDhHZxBd8+Pb4wkGS>*LyAI3V_Dw)-b(9mEM+K+*h z2oK%}Y}gV}J^IXqROB3^Oa@FR^wl*wmy8=f$SK~suMAtgqj(GC{3qej7?Q-&&D+mZ zQ61#Q!03ACHS9$L=0IReAa2WBpfD&;6ZFD-ItKeYNN^0L8fAMrgnzKm+$?3PXz=mx&LLU1G0tPwCBGV z%y+KJT~oB0G8?Zcv0GWU4e>$spEz#_?dB6GFz9@Fg1H*eg#~{7jlk7ka0||a+>xF3 zFurFg^Pp7SBGqh}r9aUE0ZSd*6_YP*skJDm>)ENEe9@X-S#pDcgyPdN4e5ksZ*t|~ z9fu@wyaCC+@j(l$aEi{$~aU5(G(XVUY{cP8yih>EN=S%{@UNs0^; z1%*~oGT67f5m(yEEc(r_z8kX_-7t;3*>H<)02o9jkL0z9AI&vt znX@#g!Ng`mgJqDde@JmA={dNlq|%uX8l1+yq!Cz|_0HXz7;yVgbn_Nv(y&jP;6?4zD(!=f5Sx887Rs zukoDv>iCt~8)!H|7x}Enn+o~dX@Cc~tEpVHF*A};b1L_zB{!(|(qD?<8#NuM*$hWX zCb{>#u~P6n*y-_jttb){)CWii+?h1dB-pCk6cB!Nb&{sResszRz2Yp~B}f&5s@t@k z^4!Xl279u1Lm+FN)Gk;;EyV$K#Cl36fzvuP02D!fy|;x`P6HE#lwH$@K_rMGgMs$6S!v#`KtKrGEm3cojX!{u~)UzJ6D;tNGlZ-`{k?d857% zHAEO*t`ANR!#B3#ed--tbMQF%z6d(UroCiCLs5{WDcQo6IC zX}_+b#d+fSMwhGi-c^~23Jd3Sy7>f?%D0c1OIbhMUX!OY1`ONbto!~K**pTKc7{0^I)<>>1DRZ)p9>f?248cCG0uSpdAHA$vvvTY^KgwMc~ zlWfsbKE;$uiWia994R(@OE%j&KHlCski95_q>YbbR5ru1Y^zn`_idw}Dcn=cOUa}b zX$?<@c3tJ$+oD5jrf>lKt?_OS?^Tb|!a4&qIU$A$K)V7dbZ);fj|Ic3hEYXdcl)Dx$HR z$r(JfVm4LHL%3SMzV;%I(e4aD4eX)bCrQxbCl$ehY-Gxn+~A;rThI9qMw{sr;KB*) zcfQ}&0OpI?%Nz=1DoCQ9t55w_n=k}Hq&>}>i2k0F*jxb+pY~cdU7sd zQ8m1m^_uT9_?0pJ>Q=DG$p_X>HTaW@*aS?2&;L}AnoP%LjMU=0*vrYIZJl?Vn)HuF zl+Z?D+t1E$W^X;OoZ5nw>|5u=?j7QCkl5g_%+N$6X#1r@27PJ)Co`>!d3(xPQ6F<7 zUnT2s7G{ZDtulNryZHFq-s6DtQ&oFF#%N7c6~uDHca^+!Qu79NHNek&VL`g=ukx7l z+mzr2T<_(eH1Z>qCY-&3b{z&2A?CZE|0ZjwFn%W6zIlK$X05o;4Oj5(k`ayZFzmc| z2yMS|h!Y$Md5hagNl&F9n&QVtDy)@smoesAh<`K)zw5e_ zZ*Lpgdx9Hz9~;LEr4WEKoRftJanp%+Eow{Kh!VdQ57jPhq4r^p58SD1r^m1%659HN zvkz~@A5|@BuK)hIozt<)JmCpWq|!m=jrN#_NOutmO6^r;$<^5B6()b^lPIX*vNdLS zW<<()DFs-0A)yZs^E&YN(O-7F#zZs-@!)UxO|3Cq344$v&5Ut%Sn9m@;Ba~UwViQP}3xG$&@mIx?-;3|3N3j#F5KV{ykqFZI>|RW-KOKL? z;c;Qfp0j;<75GVX8uKD1SGN*`yd z5!bHfn*WSLZ+$mqv>_^{QFR343FIGtZhu{&c#=XQVSBtpQq)zh;PS?|m|>o;eigUa^N za3lUPg@z@CqXqm8jKomtt!6_O0^nLmiiYnZ#B$<_S0UuF(D7hY&0$IGcEJ_%>( zu2j#z<5wd0ZjLlz)bfN2hf;=;WSz{FT^?Hb*pO3jnYPK2k}#6VlsPOV`uytL zcZT#yKw;Uij-M@fVvvsM!G74kG1X>VPQX-{_{nr$yOBMyJxXEzKLn^0I1a69>3@bPz=N(JO2jDtc}k>jVZ(hQ&TOhY4# z#O`iAw3jQCXV=Om?MD^4C+}I-8tc0zqF7S*Xg2V)=;A_SAxG~YK5Qko|4u?YR^U@I{#`iS462zBx ze9rY@i)Zg-_dL1R^S(s|Vp7BT-M8DF6u&B_eSob8jZ=H8iITCM9_K-JuVGXB2rU%e zJQ%kt84$t#63_3TGS@PP(P~L&T1^Fb9=E=D-gLNU&Fp~Zqke=< zpTPbECc)f9lL4=~7xP(e`FQnO_%fhD>rH()t-06!Rz=f~-8>Yvq5Of2T*>*}&`uCN zDEYsl@;l^5L$j#d*&z1ADZYU{CZBf)M7&i53SVc3x5ib^&CL!sk$46H+Y9?! zD@GvazMNT4zdDCxR{1`^_3Ftza_rpn8LzVQui{+I-{LUWw*W-U{-|G|5VB9`mlW4@$g^K|Ydz}JYRG+Mm6y**KR@X8qPj{>9Da^2 z7?i5A{)n@#gRJAFfrm7V;}JhS@6=b9Cv!b)`<_MYGzG>k0E4X$tE2G~wgA5t8n)-5 z290DA^4tFC{y3|3+q+SN$&?LIRQ_!0>pT3|N1EYicvGOj?@knai`e85(JanQZzV{E zv&z{Diwj_>m<|~nn#e`3Lw#Wr6>6Ne=TZ67u0zALb5evK2m|k8l6m^QVWlS$!ZPYv zQYX_wI{?4FmNXkamqJgUuJZMXBUQU!bV6(+eVDnr&!3U6RuJmAE=JK2 z@y!c+fH$s>MYWTR3i|q)==+>ED0irgiiw$5G^)zuV2kw zJ_w5#tred`-%hqie4o^um6@-xGk5;+5jl+5A-4D0=?Ej@Z60J}ER>Ib;CDxNI4{DT z09jOnxSmmd_$;%?pK%Voa@`&VsZSL|f~Um{T@xQRe!s7OBfU%ROIfEm^VOBsc9J!o z)!gJg;>^<+)x9FpKB}F@R=j%Q=yWo#B_fu`;HMP=5p;NDaKE~YH|0MHiwD}Bt5$?pd= z+Fd~U`3Q1ac7R?P4{pg8nXu%pDX-{?uu0?lsPDEK#=lt`y0mcf<9PY;vH(7V&yMuj zr=tClp_6dp+m=yod!oqvxB}Z678UGQ9pq?%(H1|9^l?!b_OE6>c4+AKHR7TCN%qj< zwLUdIq_PlnDj(J`59=Ps8y>TyFH&{Ti0M&o(dIS}g_sFVT|>Nbvf=N&F6lmQHoebU zn{fcTX+-D`MrrCu!{l+9K7m^G5=fS`@ZtiV&Smx74*?Iv%zCzDmOi%O3D2qe2ddT`hQ5-;b9c85H7 zWjmPGq>ci}TsR-ku2NH7@Y=d>*2x>*M*H%N7MHrr)N_%?x7T8B+AIj4ov+5R{A0*FqR4X8;elY=I`-464xKo$;Ud1qhH$#kYZZ%Ay^X4%oF7zRAE4y)$j;;#)7 zlzrS<{Y9Yu!K<GVYHsL zTk-CP&`T^Gno6(Lr7R*zbo+D8!8hBA@*z#{U(0-_S5j#0_z4t)tHujvj zH0UN4G*Xt+yLzD&9U)Hlqr{u=DC5P0d?jI7+j7)A)in$Wu@}==C|M$DlCzj+xDP0d9Dbx zy<}wvP8-E>JU>_TzgyVfV2#7hi%w+TO=6&lz4F9N>VTmJ(QCCQRULWL?M1js&~xv% zf&U5o|Qd0ie~@$ z5*vne%lX&E3_a9oB!-R~;b%j*6F2^meC6<&pq=L@g1l^D# z*Rk&MUfwYl0#|H^RYqyu@Ing*$BXNgVlaf@o&r#PNCD^`uEX;@hmY6#4CNfF#W6Od z!3B<8rQ=%7&Op$%I`?VSG=AZGOV0Wo44q905*Hk0T#^uzjazig1UpyX*Yw=}swY?O zBTi6uc7T*~Rww|xu*JP__<0L z&#=gD!>;ADhL0$*fL!74hFzszDF5DK!*d@{tNAXQDaR?!MRVBC4yI^YKS;pM3PD5J z%KSd@Gp*az*lvo))=&D6w^BZYsw>f|!T7uDOlNm@-HkH?rL{4DLgnM1=O zX?d#KNZ%{&FuYoC6IO1<@*mg$kI+J}|9b{e8*!X_K(E0K3_@$>{hOq4+>jlQfSZFu z^IWD8LYY;~yeAp!|tcHhI^FKZdr9F=5|R&#>O2#Z&5cX*rtU(MKw6%jYj zMOz`|>=q^b3jDtYRRn3dy2iu9n~7czG5Go;A0&1QiE=cM94Yy=a)2WZx(Z7W_-fr; zrhFh}FklyDA}bdncqdg4NIC6)Bw{?rt?)X~Zu)_Da8vt4{DP>04X6SClpCcli?Y|A zFAi)VQt^u@4Z_X9^85a+f|Bs68!#A}1=4c|$eVyR%KfIh&ar1Vw8%l|wcc6X(#=%r zt@hetY)WsRq4BP1tIU?m(bGF)U738tgFhM2k&Cp~{=yw?@NmS}#W*bS@e|i+bvD=V zqmZz%BLHjzCo17(`6}JFM8`w~fOd5weNG2X)#Yuti0|Vvk|lT_aNs;S1AbFzg+l*^ z3=4Hw^cjn6rPh}k=B1P=ht_q?e6QmiI}`_vc_-pq)eeg+AL%<9e_2*bNS@x~2J7?< zFv*flU}p?6?tub*%t8xDbL?e`P2!sEwr-pjTAcHk@$#Zva|*+Ls=c;MW~4Ml)nfLi zCz6O#_ilj8c~(w3MsuPYmv59#|AXp8=;M>N;~@0l)?gPiNYCIG(Wk1-W>|(XYJ9Wh zemkGTjr7@Nk9EzV)*uiUSK>+@8$boMTp2NMxl-}0E{x)(5ev-hcr_1+@6>IH6|JBb z$xZgJE=2LcNVb6XGn_;4RNM9dZjC;s`!KNxr$}>bKnPHh`fY&_{r*{(eJKh zG9oCg8t$5@c>v?gO@2Y}?wE>`{vz}R*B3WwoExvM-2sTCKR$A9fw+L5c0qNoKcnUc`P+OXK15sU{O?1NV&q3A2F`%^TVjA56cOj^0XVLDTNDn zGNP&FPO0P=TXMhX=+E@T0ZcLC+gisKP&JEg(WAFR#W^5<_2B$yfm9GpMjuBE+H0DY zZeWxQ)I7I94d;;mkF&Rmifi50MR9ix?ydoXJHa(L!7V^=cc;+c7Tf~_cXxMpcbDMK z9doX;*4=CF+s?y%s0IzHRTYCi`rqXf>v;H-CixHS63-;{g{Pi_^j;qs1^a;w$@p}< zqD#>|AiD8yqM@`Hf)>FSS+Wzbzk1dG^LQ)~VnorXA9rF>aMcVMqdOf|%mwx)9^^CsEmc9J*<5SZn|I3ZaRD2lO zB3MQoL`5M58|#jdiw-mXK%M=Y!BrnC8qRfhEF#e0ah7lDR8W@h_}l*H{VyXr)iGKm zCC|qUT#;ZQ+!=Z~sxayL46sMC*|Sl`1k-#dl{@2k_oBt@mn*hw1M4FDQ^f`YRe?t! zGrj#rqzp@B#L?E6Sm}e2XoIWW(-~!;Km;Ad^RsKDz?O^_L=rLH($tPh7fh=iUyaH^ zIH>LSC&J^X9m`Ct?v0-HG8MgSAjVE8--D+qH^jWi|yKXyP@kW-M*SY)8)JD1Q5miFnr0FBD1G{A}if$q$AHvPH+gUdw zc?G%1rFy%(3Vb?%*}A;!c_LCMS}ln1A+bpD9PqqIag`!Z(qH$^o4DM1vOH$PhP-o) zuw&qPb$X?;lk4vIAOWvldsgpJK-&wm=ozlNXj!qZ3-A(LaRuKNUvSvyN#Q3y7LHs2 z>p@vG);dSCR~Oo6OC6NPJ{^x@p9TneMfOOayr9)#d%hKCjaO*TgbAL)H;81b9`F03 zia&XkmKv`v!@COMoCYIIW9Khtw)<2>nzLIWC$=MbXeEs=4vsal)*Z}PlVDa=Agys= z^=q5%Upmth)AYJH>kl~=0aJ;%h<=KKVB6T$ikt0u9}56Ui6C0v+kLFD5zt4N7GByR z3G>(|W^Jj2d7_p9Ol#Yqjzh|mxjrg)r%AS%;;W#VGzET+z@53m1(EAd2fwsaVA=&4 zBF!DDC|Har^eoo_Bga;`X!N9}wmGLU$2M|^(VJ>{%<`VR{Kv9<%2rO8tbR8;F!j@G zB-ah|2u4iIZW+$q{_XMYkwqbLKOXd7AmkVb&|+&O=X50IhflxVSCW7xWf!7^`@x`Q zM-%WnSwR$5M(6BLou@fVjetprJhse%iV#3md7NfR{ zlZ_0tbl&yZUcXXqv^UZvp4L5Y8L(NgX&x2$@Kk)y>h_rcl2#3s7OZ8bIIjG%N&LPn z0YQ@A4>DUo+4!>{ra?J@tray>b?BQ19c>~r+yHaSPX|I9cS)i_If$#8Vftn?|5juI z91ZI*Wetyg?9`@=J7T8R$|Z_4RH5{As}Bwl#u@PC<~j=wt#$=F9xOX@i!HmWo!xt@ zoptU2;oo%=7%@YiEv0+&Tg0D)8Y}3%BW2 zQ}_F|eXKqRd+OSoPcO~l|9wcC$#>E))vB4>+b^^qQNJ>itU~B{*QLjZ1ly6HR|dWj zbK?`Nw%g}yEBKGVL^7N^y*?e;{w8tHZwH*M3fwM5+RA-jWo0J-4D(ob>k;Y<7!!H9 z$*TV3uUy@YZv;$oN*v(4q0i9gDhv7*kdPnb3GF*xYc(=lQs2V)-uf=rJx{O=oi*vy z+uq+i*mpt7DJ^z;iGKo&D$^FVPT5=tTcTm|EEjUPHhu&e1tD3}*dzlTus)N0ANEt7 z9Dt!pTa?>GHjlUS{R;{rp}sm+^@lYqQGL2>M;!Oan){S>t=dR;k}aQzi5G#T>GOtI zj->he2;YZ$QL+D?e(us$-`q`)-K z`6F~&@36B0qpB_d71n^+;urb(H%p`NhFvtT46dGC7gi~pa;Q290*F%?z#ct&RX0A75b$nl3Ds1nZ{$xbQmrd!Lt zezO*wTaH`vXEXEHs>R}nWk1MAE^t){TR9Do>L1Nnu0O&UBJ=KK60YMv8nRm}TKL88A zasVE|Zd9`+)+o%1Z3c2A+d1xMixoQ%?ffEP>~go{vGQ~?RWViV3ki8ZppKB%i?dBR z01K0TFzJM4B(Y1sgrW0x6nMKCxMN5;snb+jCB4XM1@9+LW;{qx9YQGT{^kAg;Fhv> zvXX@RWBHBAw2Go>AtJrs-p;1cwUW;u*%P;sekG0-r46+UhFwA|i3xmDck3X*INGzf zLrOyPG<${8YQfA3ytT|lEK~MFLMUN*NBcNU6iXD_{LduuP~9iafD%T`Q{2089xlPx z+Qa2uCb*tOhcsZKMI45zTI8pVV8gwLNU$36r)hgP{+2V{IY}^TGCO_KE}_}N4T!*z zF7yHWjGqU)oH1X3Q{E0HUYv%Iy$dE;@*}$r{-5vY{+=i z{P1PnRy8SU&dQ;wnrlMuDeFGo!r*sUBUQc-aLf^k1zLrYO=knYw)-=%a^WTOA{?yD zltbrHe1dy|@|Qxe2e2e@#y&)$pSwx}eP}aO4Y#a>g53#=8VS=({JbJKfI6^op8RR( zxydEX6NOUm-VL?(A-k)GOqMz)MRISwtqzkC1i%{>S|0bus0LBbuNvhGT?vuN6pr#Q z{|wx!3*5x4%S&l0M^TcNn5R_Y{*+x0VzwWqQ?ZB1?E|q=f&PN-#{`}*w^?&TetG|R z!WEmHGbn_Aq|AqsCK;ceVC=8Sr~qR|Qq|n?DsO3{96HuN6u1-D9%Bzf?kP=H9qwKg zC>8p;lYiNvkTJ?Pl>Ni};%sC8>B86f`iJ+1)6Bl86+9MHq3M&s81D&I?fhLqByvw* zlq`V}f|%%fob(_~s+pg(6t&QY_X~po3UTn4$`nVl_ zN}WCh6Ud9~<)445D@S=U%2a*_mqg2ZSd3TgEQCm)Tn>+({{V`h!9H(M%woUGI+g`j z?0)6H{mizR=TKqeEcb@)*R}Q{w1=Qb2KhI)C{)FV2UA7y zk#JGJ6DTejPYeiGwbDW6Cg5N4aWVgfIoqNZh}f`JJ$!bktUyyq~|lY1&!3Rlu|us?fu zvciSJfCav7sTj~YY$npeDk$K@5Op^2qaK;mAWQQT=OS}ZX*L=O^OwUwai5#+hkhd5QCls~?|c<7Gr3lP2A@paq8qXDRS zfz3|H2!x7OB8GJ#v$QseS``{<+McF{ulRaYCJEfa<3jDhq>X&usEo z2X-JT9KLB%N#25n%&zRe)U{%J(sa5{;=cm|bn_zoDmJegkg@#(LF_Y+kFrg*Kppj5 z&J-F7;DzFSo}?9*9Vc?7r9L@q=gTsSS)q0_`|hIaMoDdq0g$+v1YNk|?l1A>6LRYS zK4-XT+EBK!A4r>4G&U?QWGD;@U(<x^@EH)0DH?vHH>mJi%Y`lENS zB1k(nAWJqnkwLR+5}(NyKh(Or{16i6WssVNv+apl`bVc=JUb;ouxw}G7*>G@&Wf|HE&_7~VWS{TKeXnpKA1oyvpRh(7i*pxJHnbP_=t81}!=+FR%A?Tn6!{(t{Yv$EOs`j)c$$3w!q~iY&cN zG4|dfSm}rW5~vTv-fN>1f;9DMkF1HMeKMl^Q<|K3X?wHHtRalc*4y)mqK>wWmTG7q zG+E92d1#F6^S}dcLHY!f61dlTrzE@;u6KlrNwmRHT+sXcEtJNJjc}mp~EfVNN5Imt~VPI>Xm?JqfCiQh@#b##3 zZYS~=+KOKbD++>5OJg6+vOgdGxeB-4B>E}(TcSfLJ~E6AZ{xd>zjCOWf%qVq6Mfz5 zlOF^}kY?0NKCfs}U~z#$wDL-{R!qy2e=KTQmE0-t^!)jN7?`R&{EH+**6v71|JZv=YPt1mc z1Suq|v0SRfulsc+w`bj^(TU`1)5DP_l zU0UN5{1G?d>#*r{j57Bt0t3f;6>=FC2E>4jEkQkaiJ!F;nL2VvCv-q0W8Kc8=;+Uz z8$*B1Q+!JkAc{42S&u5kuIx?hKmKAdv0|z=(}&|GZFPcm2Tt;M#OtS%+cMI}YXY{g;l^h0R2NG2$2=@* z!=0(&Z@&;1P&nxxcSty~5kkccnHnQ0eJ}etHz9f@$c3bR$*+Q=rCFD+I+NHcZblif z5@%Mz63Ka#-02bo0y?NWJ7UF5l<7BVcQnNuiAYb5R^Sv=b)GE%S%r%XM;k)>AWv)2 z<(M;D1fg}HbA9UVq}j@c;6S-g-<5VB}7W?4(0lpSnwU-{zHxz73^%Rxt7aV zX`34OKg04K9o^S$*x-t+Awmi=Y zE|fHhTwou2MS9m{@?j(Tx~mXYv$x2#R&3i{0AP>vA~7Q@0n13&$6;OpCvRZt(Gzk4 z5Mqoie&Vi#XMnR9_e@|_TV&@Wu|o5#wh^6YLN!Wls1%d>uIu~ z2;i_82;aqlMxV^3Dy2`#3QvrO%%i6+{o)mE6j;VhR?qE?p$EZcp~B*jI@vcr4pK@~ z{TT%N)qQKMwQRRYV1VFuFF#OhZT(rt8xwERCH6fJA zCh%9%8hSBQzWv;q1I8oz`ML(+-ro%g0Dcgcg(gcB^|+zu%4Dg}dz+qk^^PVYy=+#C zx84%p+nTFKAuAtFfVg2`)#Cee#}Dt`I#fuh@=snEV&fa0EIXoaSF#xbR*nv223v!y zI+!aku3fR+W=QD`iu^eZBAwDvpdG><9DqnPPWJUi-)G7UMIqWm7T`T+@oQ!~R<^%f zVdkR~R6g$Sf9=F$-uM7=HPXw6SnByPNLeqhN9-@%ShW~m$wAqw+H9Z-G=0RwRmD=> zEf=XRc+=)I;I3r5u-I|hm@Yimp0b>#pV^hVB$6jC3)Z@W->Cit-< z^CUcjRfjVTRE@u!$2t;pE$>aFSQuDL3LdNi;1d0`Md&6@dy; z{yOY99{VhgSkcyL8a$7ZWomCJY-#9gPn3miN76M1;FrnDR@OCF<-Si5B;S5CeH81?b5)7{HG$HU*?yqJHS&7GK zPG+aUREM~@WLYuycN_oq(Bpjuy^QJ=+{1*##pl(`RHL%F6Mah}TWK9bKLrgi)t!I? z09DYH+Etk&eSoM?+h$el%o9i5-;>ZGG%?dj`TD-u5K@y7CrXX7KV{iR1*MYE3n7HW zfM*h-ww?6k#+=&md1@ROL;wtA(W`av+R67fu4-QQWL+2{w`{uJ1Ajm#WsC;tApkLa z{e;~pi0Aus1Gx#a)?jILba!LejuNqt+mz(-0P%%a~E#)4RU1O`pke21j3C3h%0{YTU@JVU0kF$`8i zY8ojzrbML#*f6Mio^Tq7Jb274igLhoFw!ZgAK}p-E<8W&0UnkoWzZZ}3g-sC-Yz z{(>H5A?-MLIy`d3|ANPnn)G&Kvnk`eImO|=98t17%t$|ODbl!4F`Aq~|09zBayR?i z8Telsm(_r87C;~SkN-9r*^aFi2C!Mc`bSOvf90wD%M1H2!9{?ZHuCZ>tw`m;RGyd1 z9?$!8COjRFqk`zNo0b-y$3uVE_Ek6ISEfDhyFYL0vY+HqayveB^x-@q>YHVq`4qBj z0b!kHQR(h^u6485i-tt>y8|oOnaIsx>S7YRefN{okupYj(pJ^)<4UqsV<)dY{2TQ?weqKppDq>RuS;+~a|wmg^b|u%`EIVtdrf@j6pr zOZPfE43NEF;^l!s(z2?yy>~quyLTd|LvT zZ1mvZ*TeI~c7AVH8ltVPPkfeXHorU2t$Zyp_%Ho@dZ1BgQ5aCl$80-}?)yqx%HM*G z-`~XfKA8@i(WGBO&Qs~W_K7c4YhuXR2|o%oiA74<_EYk|tiXPAnI-^cG$eILa;{OkbU zs0OrcOBqNO0EO+{&XSbZ&7&S&-7|7iQ(fAlSY*r;N8P`T)KeOBCPu?n#Ahd+P9RD;8+?Fn;L? z#TX>2{?J_e#_4VBtxD^7F)ZSV!S(>jDCz|9U;amD08@QhnnoICg7>8Kc}gl|N9f%G zFod-L5Zbzs@}Uc!`oFt=b=s=z&!CZy9q!?~KEC)uW1n zQ=f44G->dLM8YRuvgc~`lRxz!@$y97CGvvoW-HMMMM|Mhy7BkqH-JC_aDf}v)Ey;( z`>+~aWeusgvfH`BTO04?$&Z5+&DE_Mqw9RL((CqqJt2XiWqsYax~d%|bRVB>JLW92 zT=m-Ov~9~az+sp$X?n`7n=LS9;=H?Bhh#U|qQ$Sib6G)J7|vA%e9yu9q-vgAY^?P|z!rEe-1%z@nv?Z!aM(xvce(#XS;d zoUoC_%jWHI?D-`IExmk^h=kHyj};A$7uvEBjB9-(Bf(6j#S3 zV;8#dTs>qwXr-fTy);lrrOn?Rw=!J6--{ay0eo(;1WFRVwAN5ck@Zs$5-Dl{@Fnj@ zSvPvJ3ef@k`1kY`QwKc+2A(Gq33>$E??s;n<8Tp-cI^F)B@H5xMN&L91efDux=0Mr zb1^Rw7D0cI5dVWo_)a=my`357!(ROYW~T(mvuwa-+;{H?8U+#%+N63G>Y-h{hZUM` zN;LW|vEU3GSgp4BzG-dv#>PLCEs5E-VZ)j-trptNU|ot368oJc<7Ig%7v6Luj?F@i zX8Kfdr?w?(%)e9HzP7)*cpqS+%LOVfE=sN96tHn(kStAo5Js=u?Up!>0mNfC!}m$v zVks|kBW{>h-argq?UM4d$p`?5ATUqmyLfh=Za-e#r0Cd%_JEnC)IqFdGhVP;4k0o@ z?U2s}4+bdi263;Vb(&FskRLSpd#h+`k*ehf0I}z8Pw@<&%MtH&K&kP$-|xkAUI{C1 zB+Q4B?NPWrEoQ-^#cdt-xfZ+=U8c7}LLouPmGgLYewF-8Xavs0C5LjBE(a3W{2ccU zBQwZa%7>cp8N%2vCqNmtO_78Nq}h`27wIr2I!Neka*TgDpAtKU$!dKtmMS?cXy>M} z@v=vr7MHKrg;?c<-~+9{em4c6cde~@<>BOx$A}{GRNdzsBwa)b`U%Z$-;TCZIRbZ__P_KE85L0M$VK z3@eVK+39UbD`;tWw&+?6pr;gAlXtASg}H6xOW+I9?hZ%UW%paLQif7YaipUfVnh_} zc}2M5DHt45Uj8)N&^gAB0&b)KM|4^Er7(O0r3B*;?)>wR2YO@B<b z6~O6g=>2p6kPNSrR)^8ex%r%@?;;1v0Xp6BL+Xy`DB` zPYUnRq@S7mQC*%3eHK3h`_?tyWrDD0?j*nHwZ%dC2;Y4S63nXDpWz(Kdy8%y7!WSt z&US_M3MT)5;0Mdm}( zLQRe5&EK#^_vwN-;R~IvTEyT=(Ho4@*^dPJ3_+C0`1u!`Vd&(nh)IF-YwKTis5RM` z@lJ_MXaRiQMUu9HEd~l<{cxt!0Fei5$D>4p9c!ykU&mJ4jKWt;aFnO>7F_x6^B!3P z{uEfE=YYE_U>%EyzDWPz3c(0oqTsV30kQ69Ov~6{7c7))$746QK(jrkgmE;~N zwD#AKjN1C~$EZTVA#WIuHqLt`;Z753(zriXLKUKka=yPbQ*hIL9;|3y>a_eaRvxI0 zcemhU%o@eQaZ*|n{(DQ#ukaU_go9rAyX}QsXFlz?pbeV1aX|lP)gKs z_dW1FDl5)RDO+A!Kht{aD9rS(FDa>L@c893GpDO7z+Gh^usHWDqc0Od0v`yg?Z2vg zw5p(=rjwzR!3x-{9N}PqMkOiCw?^S!?0OgcJLtS<oh4)E zH4e5V%e0XYw?k~>ub($YqQAL{J-~cM46nF&y^C*eGWrFNhtH%smMcDO9VF0tTHRa_ zbJ>Fh%@45IJnmPG;;DyZVlE?(_IofqZmSFUvqc_$xgb(-+a+t;CT0Z1H`S;@U&`-t zevyhP+b#c02r=wd!PW0Ex#&qSZEhguF*qcSC4Wwq7b!yEa#TPCefdmW);C{J0XD!p zwP^_3it9|`QDm|mF*g=;p^@*9v_ZX6(gu0VT=wkF~e?1{t>4%Npxh+Gl|n zoq`zvQBkd{VHc~U#r=n0TWv+`>c`7ZzzcC&$HzTIrmKQ`mb9}0uXn0M(yL=D?_j^P z!#>XK8=&pz@L9@+8UrUJ*)xUp3YnAk0&n*C)1ievqzUeSN*Sf*-he-WJEjWb>lfX;HLw6dAE!G<25T3f)95Ojp(^hQuF< zB0726j6nl`iRusP!*=QrRpHr)jw{0ck3)6L|K+35a!1=On z?fFX~@#5Dm5h*tmBdARt!2p?iaVNT>kxc1=tjA$h9SynX{UzEY_sssx@y1+>2H$g` z#O@qW?l}!SNxmFEtG^})tS+2H^&u^+JrOW}SE@l3)O?ddZ-7ShqUm(ya;UVG#$}!U z`7sWF(KwKv_bCYQp6T^Ah4ftRC_W;v<8u63&&M(No|J2cotxGkX(9#&Hsd{snnfSP}XE&KhgC_ zY#%cyKi_NCe-Z6%_PlQ<3?ixyRcSsoByU=%+`1VQDRNz_qkQlfZ`rg&kc>1|96m%1 z?u#h%3y^X0{cUJwr@phx(!#E0b5?<$e#kr$Ef_~4`!Fvv&*|O#VDnb@YdG12^)Exm zM{_8q^req>o4!*9NcfbfT)J*KwIE3%wLekI)KF#6J{|ztwRZSnTUZQq;q6uEW-zea zz>@Boc}m<)G#NnbAVu90;+zW~M5gOiWp%>U5o<|lF4{R=Fr9Q!ExR?$KqBz&r8*pa z`9~p>TC65qKytD_3OfYQ)zG>;Yp}NIt~PbZfZ2F{P$uS5u#)chWYezo1|afmQoB(1 z#xwRH#0rwf3~8pUtm;#OAo#*05Ldccoc%IRXQf@0=idPVC%qi-_Csq3y7F^f9on6}R*8p2uWz(m~D{ z2bq>El)?055O64>K{)suzZXAmv^&`Rz^CFe_q|TL^U@J5P=RA&p8tX0t6s@uh3*+J znJA##Rs$sw`i;QHPdwY4z?Ko$!p`r3dsEC`E;Vgj z#+PiP_{p7R564aN8%R}pc6Ks=nBKU>p#19tS%~pxsV`cW4qo0{FSA)V?!Ts+i2laD z|DCS}aP?mR1)s!+O+)R62;0bN)CsdLhKj)k)Lodgey;r>spw8_$Un z1LpkZ@`eTvw?C}6N*oU-n{BhiBX(Py$3B^2Rezd4Y`&dOsu)e7(0|fI7^ptT#LnXJ z69%MRy&iKZQ~P(>uzdzxPia%kDJOm0AgSB{mZ^@42(1#aK8N{ATt*Pa?V;hx`?%}r z5Ew_5`OY8gXt`QENSFuIZE!b&;XJS;fg7b~Xnj+$>~*nBt_fy!va|MfFn?77+S4|n9rG9D6E#HcuaX#^_yD4T{gnXg8w`WNdCq(4F5K{m~!scMVg2vX*L zMY@44-v)sYh1T88_;3gtpY4lOaTl5EqvR-0Cw8K7W%;u2ax#Yo4gd|rbJ~hpg>>Qv zcRv;AM{etEIL)DOY$HlmPm^ty7gG1%SZ5^oRzIn}b-_K~VkUS09`><%zh%MuA^coi z1&4$b5qLDy*Bu*H32?}N)GNWyB7QG?@V@N>^w-72BAR7|p>tB>JZ5d#X>FA$lmy!P zA&~>PC}6=u%nm=*SBHcJ`Ep>wAWcmf`=0aIOPY{7ACYT}Om7y=@qK}r5|&#<{Q_|e zH1)#r}pZK!z4n+7hdALLKw%DsFgKVts{{x#9uf1L%CB!Anl{I8#Db-QW>_qb|F zbp5}N;F(M2kvWXNSVvwQ0XXA~IWZtHvWNgt9KgOA@VDj0s{YF;i;W~Q8^kXAU3n0Y zs3z9xczcRFn5`~^2|68N*?a8W>e-_kzY*vL!W!Vd>5xs-HE|uc-)HiBb2{Yn3w;<# zvmJJHS$`4gS%|c1ZDfThW)k7|>5q z35J$%XWTOo4W?*&w$b{&FZV8mJ&XPwVP%?(oj-{&HfN!{Ras)p?!r)VYsDrW`e2M< z=>5SMj{z|aK%vL+W!rmfQi^omwxuB8d=~p;6vY1_t(~Y{hRFLNhhP3jo5#(U_i>M8 zT)mi|8%`>Zsr1mIck8k&&}HiGZ|>TUxoRw*G%87rK#8O_p?abPm483ma}3-WHeD|(GowAJ$)S40nFIYzA% zX<)H&+zCB~C0tC3WKO>?FML)4Yek4ZDKqP#y}7VG9aT*c_Bw1R7o6miV zvt;v%4b>gkj>sA1ifCERxz4xI81H@*+v+eZz8AZhU&Sh>NDIes&NB;3pg$OP%g<~Tu5vssa0jo#G?o_jvC@oKhNaP5u%H%|nSZkk5 zrT3+@#)MfWm)s8Sp-(Ll;BdSx2ozP9sHvAHY|$vebaf3^NmV-#IVhqc5cGw?rjv5cL7Lt$j|LeX0%t-$_&EkUKF?XNQJEnkv&2**V zRb8k=xz^yV{Hr+=ihwE%NAm$OUKakC??mSG@kvSY)Uolrp6Adff>G~Ha6F%4S==Th zzq=zdp&AXzWc0!Hk~UryQhA9&U&3g5Q@ybnrx!jr8Vqgt45VQTI!bkvLYN8_GJt@A@HCZ$s=DNr5yWk!2W1B}<0IAL3XCy^F z`SA&8#Qc;Eo0jHg;g1}5j{8y(&(~SnwYE*-{9qxaoix18ajs#xA3Il%W=t!6RJGWS z!H=PhTvx2?nP%~i6++4&&`1eS!)TUI;?7%DU~~iRbHPr}3WXA7Ee8j-S)EUN;;5=` zDWWQIrB*#FexOH}vFO`W@N`QDcoA~nfh)l5EPW&RB5X3A!SKCtE123&?fCF^fy$gF z!^9KtOCU6UvM%chksaNVrVU&~A!e-dJ|s&^qqeI<@WJlPDsLHAkMbB8uIm$TM5FTd zhf)VgpTc}^J%!Jpp>OR7Zvpks ztO_o)I@Q04$RKV0VbYBQu?eRdgt*5gP)i+#g#SSb%*O@tC-|zkwHzis*b9QtF|B(+ zbUk<~bBkPRN;QSEyVHf<6#{;~KV*S!DGI(tEyp^+lIx0mc||ty+UWH}vI|xjsTTx& z{O*pXT|Rg7P86nw)Kx60StV3sF~G5{mbC$ggT;bMSc}wkO_U&#ZMvutoi5lUy!^oR z9wU~I{@O!w?0_cStHRRSR51?Vnp>-oa!Ue3sUJ0QAPUz8Xi@VVHY%W>yF8SLvn7-Q zi!w}@uW|rAJO)SbR>P9AQTb0f$5jt_W}ymA1R!ODhOG=Gy&|BPo+S4yj6Whd+@06){)MHeqW5CsFe6iU72 zcK)_hovy{9aVOfBap9#hK2$j_`j9Mm@~OITjJaiy0DASsI6BesmvpBjyin0QIjB%u>OY51@d(C7nR#0<65ZpnXiZxej5?{Y!oG#UGlU!?5frN_$$HQ6uMYn$eu;9 zZt5kEGIbgtD-THqGZxbm+C;mz0-cAz1T>nqW*&9duGUa{6-!|ev2 zno4F7crHzF(w`22lJ&!)x3iS`!ROkKqy^PMf+EyPNs{Hddw<5TP_^o%NpXd)+?baZ zou4u20nR9WITEj!B#%n0Qx#?B;y&-Q;ayGtpaa2(z*GK#Y^$}8m%)F|12#>sOxb0x zFoSx5g@mr1_w{W$Iq#yQ!z4+-+TaqH=Eqe8K5)T5aJbKN8wH&X{Z>>l29zPO{?kTk zDI4F%>}?`wDS#M#H3o+f@hW1Prd-Nn+B~|T-}{)$GBpM{*EsGFmShO6Zs+JtHQG~k z0ncUezkEagZbX4s08l`lgAVj2=58K0MJ}j#U-x#2tF>x+eTD%afcX;e`xvr|x;7x|bkY6`J!qUWHV$Iv-h%d^dp z;yGEMRasko!jyUPy4c+VBr4+o<+9HOarN%_d5q_v0(Vz=+`4_pniz~q2$T4lSTH6e zy2L9v32f%77)+haIoZifA@FfzoDFG6(+)GPaIHg7=mwr( zvUe_E5{muJP%TuC_?%4a`?M!uRs7{IzhXgr5k#}3OS%y|2PP9z_hAfVrmrX$bR)_7 zNjSJLkp9A8uFJ){bg~?_1h`q%rz>3B!1n~KNVR$~G>imq2~?@d2_bo%*xBeqDoN%+ z?N4eaq_V^*rB_fJ@?44hrtp$~GOK%;$w*p4$_zBBdf<=NE;FlV3rIDUc>NqNG&n;?gN(aSjPq!de1?@v9*Xkvg>Z#MHa|X~Sv&%tH~qs?0+kCSU*OEIkBV9fY1HUF z^Ue$p8A^9_vMl?z0;cX+_X(y;bM%*@jaJnTjN5{yVYEjghIyfx&k3eaP=2giAL3cE z7=h2Kh-oxf$fynX??Q)?m=|TK(VmG7MXOvtBgpnLggA~NH0IRlxz?+xHmWD&c_)S{ zP*ota8M;t!-9xtgn~0O%%>Y?R$m8{%dYQHj9Uj=}nkyA7lZpo+nsEbU0YITy7LRqr)iVq*)Lbb$ZlO@RcS# za@0*G;3R4`b``BELX`8X)tZV?i+sVeTn>5cwhJ~lO%n}ce}9M4f6mac#w?lRom;>z zj+BH(4tQ^K(`Ls?pvKt$B^O&Zk)d7f9Bo3##n7zBaw-eK2UaK`0E_Z3m4C4W|L&{dL5ze5T7Zo$P^$wW+MV-1Z%9!x z#E^fN^T1Q={ws=sCl`Mtd)^G}?szkOhpje|9`YWmD%GKLrP{HLm4Mee`n~;dC98FJ zJz+g9c97JjPfTiLYMb#Iv|O*3(*Z>Rf;CRvF?YvQ=SOg8ydS@8epG~#yy zQ=5w4s|FA<_;yriEusZXMgu&6q6Lpn2DeLST`cN0K;mgT!t@6iP{k-T22TAy2W`G!{Q#M}v4KAU0;mtz`GE$G{d zxs|rn{~%BD`Dwo|hj)Vry<8h>PdhBgo9c(H=UIl7=XbTZqM|_OzOLdg2ly3bobqx+v95gU2l8^wfror}-NPq;gURvArINN*= zGS^^cC;Qt?VYlG3)EmhgY01+bi#TBjN}bxA?2_~Gq3NLixRKC6bh1cv!}_w`R0dGr z{`}nGvu&-RO9h$OFqknZO^O`?ALOiSi}sQBMg1o)aqFwRKSp|NGvL7c=q z=4B_)$ludArzfdLwtFQU`K(h%LHb4lyf4kahT=^h#&{e}&ckSiFK-mNFNk<|(eQGJ zulyzMVmGO)gQAl<}#eqDwuj z-~mTPYq4%qv?hJ2?HY6`?AY-0tmnFv-(ovPhuJau^V>Pv*ZX=hWX$YNyz|?^`$<^d^Jy)*R&F z)&Y}{k%1p!IMr#kNfCmIp`w``V493fAARNYbjb;ET8q+B z2Xza>I&kxJg|lO#0sSJ#(Spsp4iv!JqZ(ULKHF%}>-3|RTHDQ;wo3-faq6vFzVx!a zWU>67(0i<NCouB5G_kCi*h7I2loWkLPBJa^E#CPl`1l44~LSuov zNumUw*EkqkvsIINP2)F(^9l9B`!VzZQ*PwXmXS=a>O*5_d|DH=sD^2tn0Cz~LXRRH zahH+k4`kT0n}v96f&Zf|{stUI>C1=JFG~~oG*o}$o-dMZ@*F?)qodE|H)pW-wIJ~P9(jgn2dJQ_V@M(! zE}Q4Y6+)qW4qbCi{^r&Vm4=NdS75Du^t% z2_BaJDin@+9JUngcaV4RmnH)(H|%bQL9%LgC2~T~<__hir|(*j5D{Raf@t3lBSs=v z!e4FM>TdRkyeeliRs_Bh3D{OS1IZlCVV%>Den9((u&6g#U*>YlfWz|KxJ_tihRF0t`N%Pd7eL_iOMU6RAkTh9ed6(PmJq;dDlCmUU#Y175Dmi%ZMK|pnRXg1SrBRtHckG=(`<~ zjabnOzU%b!2|O6MlRGa~#`*UOK1r?XRW9gVA*}_$V?#bf`wq4+0wElNaO<7$rS&#R zK*fFZ;~RUTZ3ojuc5kVmw@K|{P$I*gX~bH~2rG_Q@aG>2Y_8?}q)jU}Y|1AQEMLDd zE;hHHIc<0Y(mINQRbI)cf-!}-_p2(z6m4hqp^hv$GHoUzi83#z?C!puZ_gvFcpAEi zbAeewCSm_y7d`c;TBmhULi~88!EVuzO;!0~UF2+gGKaHOy~Ag!$FjgYfLV5NtN8@S z=Mr)W*ki;?E0ao+qHU^^M(GR4gvL_B*b^zTWY5@_Y>5cPAbW{IvMb3p5<+Ah`@Rg>x9nRb62Cix zew99*Z{P3vo%8$SJLfpYJ!9VYKF_`Pd7jtvdhXT7JLUSwcj^yTqno3cSnWajwCViDw*^Ky5q&+9rP)CP->nRRX$x(`im(T6 z3mJW450}1-+GH*#G2F{L`}uK%R7=-YrKU2w7af7p?L^w2&eQWt>f23~d@QHa&IflY z{D5&_93ZIAtVEUYiIAg48UCr9*Uw%kScF;h_osZE>rnL}Xw`y9D+Oh^@%72|k#SfY zJ}C|gGLa6q5glzQh%9$m0-_scQlYn2U+<3)9ti9AwkxP|9@OiiEf;J?jig-9+&Ek$ zWUe|q{>X%yyCsUn_gkO=DxFkCB!PMBF6mf=YA2u6uokrUd6U(BaNrFY-(rd!asQiI zlVmuHLUwqTrykkm*6uh1&)bT?B(0=mh)vxRT{xTe=yJ3i>V-NZtQWGGmtE+y$8H}& zB7+%wTg5+T<3)(fa2H-3;zgL!rAI>>No3lzAOHa#zq;S4r9Y)9He)4o$@)!Nv17ZQ z=$L8Ar{vPZ^0!BWS#sAuQsmf0Nf-pUF5pQF;S|0+iYId<@X_>yXOVM+=KZEvE2EpH zwR2t|<6OP568C7#z@t$2?hB7coxr`3Z*L7%_bzw|-uR&EaNDYhzOeNG+hvi6X%^BKnu)f;Q3$>A&>Z7X z9$rO-#&|I!+xzA1Jj~nsv*NN;BM~}?Hc_C4fv>w3+{YB158$L4f^_dLu+gPlTx?Ss zSBVC6l=-uC0+kc5iM$Dw++61ikrE){c$!?^!7M3{aTHH?qr$!I0zpurQ;hqB9QW)} zWqE=9a={>Pk$;#}!dZTrK(eDJiwN!Cd$=t{EXw0$6~HP1O%A?fR53=d*6*A<`Q_w= zmb~_hkF*~d=z}D-Yn1S;(bBb3g6cQHJq4+Mu;y;ebGj%YwUPskGCiQPp@oP65bVCkg=EVT>d|7Z@(Y z@q$AD5}-C?w}-F4wOH$1`(j+!Psi!Czx88cKhGRnKq4`~;kt&U>8wwF&2186WUr4z zzhoUQoUGKyabSM#Z3R_(R%aqRRw4T4Ce4xa_^nYwig22$76)n70nb5GgjZF<>B03# z?t#qyuj04PK7PLuqRsydMB>y=!v&+$CsN$kObV?wxeV@WtNN90b}px{pv|rsE=q9k zuR%BpTkrEjkjkQ*X8LTogo~dQuBcoxqx6b8?wV|_%Y9|qgi87ILz7SEp9o)ky3`?# zzP(yb%BSU_3<@XMdrZ)lh=yPo+Mg0%7LtCzQV~V@O6vgsV=69^Kx#$lPLXIy6yZtJI-{~lsc@7L zO;ihwJKE>{oI=2yI%xj@%6gIlFMp+0+ zZPcW}p8475rL2VjL`NKCt`p6#L99B#5;Z>#GaXQs0dRk!Kd0XameIJGR!&J6T%b&8 zVRz8SdJF~P$Yd+q+oICGWKyz{DC;-=ngsmvTcw}6bof9Gl(4)}h%%+3Lv;|X;H{75 z!fba$p_gPFeGkw`MH&pqsIQ&w_m^hrlQ@5e=~+)jjeSjg zSE^_PywFsdDAnV`e8;YnacQ6gi+e_HuU?@W9gV#SzmV6OWU>g3rWA({FP;GRKC5}A zQwhZ9;6U{(4aG=%K5`1RfA{S=o`yBXu#E<1S*=AG0My{?l5 zW^9A*xr-GHbtfsc+yMzka>y($Pn$N!E`bccHB~vmSROrc@C=Hd-h%Z)SPnR{ z=${(`I~aqXU4_mib(>>RnFyv{>M0#{|`E{MKNKLP39||TJ+yuT_YBrUJJOpoB6%1TOZ&>z^I8LBi zvhw>)_eVd85*)Xr-(=PC34d3TP0kBW+)s>rC?&S#ZjWTWqVqGAB76*gpkpwaRzx)u zT6hfiO1T+7t$1lIV9gCgjM-i~J~QB!A$g-ZIQ-Nq08w6}Qx`qA%)m45Go_HW^^Hu# z(C`*Dkg%VbQ(tCPWuD~>Nl(!aIFFhR{@FPNp(G`;i!3XwQ|W0YxTPBJ(l4Z8K>YBn z0Q-dtxwg2=YFPj6{P)t%Uxr&(!x|q$0)?B!;d*aS;_zJ4T57I-kZu_*_T$#v9+eo4W)V2x zkQA(2hDdjf{9x;MNi2!1h?nC-^;Jo~=o%1bl)nM6-I8>7`F%%L+2Oxw-^K@LkwJH{ zpgYF%#R{#*1l;$GVdCse9zd6&%+LUr&}T2U%76B3|0PD+o$mnWzM2pQCVEhB=)$Sw zOg&P*V#76M+#L*mZ@6V{1N%G@h;W{R$M;)hMdY6Z$3T%OfjjM>`K`Zz{mcxDsU9%c zojY@-rMk@RAIHKGdN+AKP8mBALmCl#Cx-y+E=W3AfT(u1f63%{N7Q?$GQy1b;;xiFgSKSCbau8r4QS=vE5z;Cgu^N%kCgl zVoAuw;ZUffX@az0`Ov$)9oPPzr3mO^h1W+?y>a5Oesw9~<^n8B9|73Yvv1vobDOPg zlXeM8KQCOY?Cp92$LmQee5t@u-gb-c5EM)#ah|q&M60-rdmVE>_+_147h#7_{lHxk zlZDySZc1FlT>&s+kS7gFq;l5&;qM*#?f-Tk(~;dkc{eQoE{<(l)n7!_Wiji-f5q_n zu8O4XsDDRozb1-=jb-C-a1PNa%1EjITS=pTLJ9sO+3u__dS^gU<5l_>V22-;)ZZn( zz{Xgd1`fVduu1rNs)PO`f_~Hf;}QVtAN21Z=lowP`Hy4RUe833ydT!?jVJciw0$5D zlFN3SY?=fx>HdgULX-jke96Pxz@<(Q!_D&2du%3x%`c{prpDMF6EY8zTLkXm69JO| z1e6Y})`LadJ5vO+tqp@cJ)o<@gxJ$d_PI(Kmm$pr?ZNLUr;gvT0$s>=No*IEZDTOAR%F{4?=pk_Ae4rGcMSiX zoI8AiA6M)j6)ULp2R;11pPU&osE^rql%Ls|S=8>U*F%_M3D&>(iFpJNNAiN%cQnSA zFGlU-u^!$tXWJ|x@c3I%HOKjBipLBSY%ISoDy;YLeXDIXvDl4yMdc{~gs-6nQBs&p zjv9%l$iK&Upy^InFuiCSI5N92gU<{V26;|I6tx|1e%Q(%xHZG_NOxp{y&>lwqhizJ zQ^sn?3h;a8NwwwTSr#n?wa~$CGg30hc6Y;i+gH zgQjG~a8-^&0x`TJ5x5PlTa(Rk65ty2-2i-Z`BAB)QU8;Dn25OXT{B7^T%Fk1xb`X^RG##HPlA4aDapZQ5N-=jvFs{#U9o0l7}G#aG(U257UzBq+o`TBgVLwsZoM+LsEjb9toee`gE1(~H|W?Frsx$pLn(+uh<+#s zWd@Nekp=VjN)Rm~5IG!z9rN2w5%S1AQ;Ai*(k!u63duT+7UICVn^%K?(AxoZBV9AA+rYCwbwvuOB-C?bG+xTv zno$^td;QbQ&2GJ$XdswpVU1COgmIOt18&XRpG4O4(h0!*!GqtE(5hr;=bEBr&H(`` z$DJ#=7VH%z5y-LpaqRBtbSRw>&;@SVYV4|fIbHp z$-vk42{Wz2fbYOj1@S^I7PkbE18`upmoOE&z?Jbi)boengoQ&(A%c-LjY*P&0xgsb@*gE_hk)plMW?o~?U1DCnD}%qYI~t-Kmi1OZ{s zEAK`v#CX>^te~RlR^89X>10e|D8MzcwD9dQy>9TJw1I zGyOIrMTes$=hXwql9D^(RTD+sb#6{@bsF%k6{I(7zkMG;M0;fCr54D11Usz{ fwOylk?%Bd;DUiL`&#$r{2fP$zRb(<@hIju5i6@e{ diff --git a/screenshots/test_distributionplot_small.png b/screenshots/test_distributionplot_small.png index a3ec9440eb2b5acede0bf5e4c21ab2ee99dc57e0..7199186b9a36ac5050510ead1481709d2285eb97 100644 GIT binary patch delta 10246 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 delta 11640 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 z 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 U2jMy7mk*S@w2D-{gjx9i0T{|nxBvhE literal 0 HcmV?d00001