From a128d70074573cb8428bcf6b6ec5163d587b8f7c Mon Sep 17 00:00:00 2001 From: John McNamara Date: Mon, 16 Jan 2017 01:10:40 +0000 Subject: [PATCH] Added support for chart line smoothing. --- include/xlsxwriter/chart.h | 4 +- src/chart.c | 34 +++++++++--- test/functional/src/test_chart_line03.c | 44 +++++++++++++++ test/functional/src/test_chart_line04.c | 45 ++++++++++++++++ test/functional/src/test_chart_scatter09.c | 50 ++++++++++++++++++ test/functional/src/test_chart_scatter10.c | 50 ++++++++++++++++++ test/functional/src/test_chart_scatter11.c | 50 ++++++++++++++++++ test/functional/test_chart_line.py | 6 +++ test/functional/test_chart_scatter.py | 9 ++++ test/functional/xlsx_files/chart_line03.xlsx | Bin 0 -> 9287 bytes test/functional/xlsx_files/chart_line04.xlsx | Bin 0 -> 9305 bytes .../xlsx_files/chart_scatter09.xlsx | Bin 0 -> 9269 bytes .../xlsx_files/chart_scatter10.xlsx | Bin 0 -> 9296 bytes .../xlsx_files/chart_scatter11.xlsx | Bin 0 -> 9275 bytes 14 files changed, 283 insertions(+), 9 deletions(-) create mode 100644 test/functional/src/test_chart_line03.c create mode 100644 test/functional/src/test_chart_line04.c create mode 100644 test/functional/src/test_chart_scatter09.c create mode 100644 test/functional/src/test_chart_scatter10.c create mode 100644 test/functional/src/test_chart_scatter11.c create mode 100644 test/functional/xlsx_files/chart_line03.xlsx create mode 100644 test/functional/xlsx_files/chart_line04.xlsx create mode 100644 test/functional/xlsx_files/chart_scatter09.xlsx create mode 100644 test/functional/xlsx_files/chart_scatter10.xlsx create mode 100644 test/functional/xlsx_files/chart_scatter11.xlsx diff --git a/include/xlsxwriter/chart.h b/include/xlsxwriter/chart.h index 7d168c3e..a0186269 100644 --- a/include/xlsxwriter/chart.h +++ b/include/xlsxwriter/chart.h @@ -724,6 +724,7 @@ typedef struct lxw_chart_series { lxw_chart_point *points; uint16_t point_count; + uint8_t smooth; uint8_t invert_if_negative; STAILQ_ENTRY (lxw_chart_series) list_pointers; @@ -1333,6 +1334,8 @@ void chart_series_set_marker_pattern(lxw_chart_series *series, lxw_error chart_series_set_points(lxw_chart_series *series, lxw_chart_point *points[]); +void chart_series_set_smooth(lxw_chart_series *series, uint8_t smooth); + /** * @brief Set the name caption of the an axis. * @@ -2334,7 +2337,6 @@ void chart_plotarea_set_pattern(lxw_chart *chart, lxw_chart_pattern *pattern); * to the base chart type. They can not be defined by the `chart_set_style()`` * function. * - * */ void chart_set_style(lxw_chart *chart, uint8_t style_id); diff --git a/src/chart.c b/src/chart.c index 8c8c9c57..f1aa13d0 100644 --- a/src/chart.c +++ b/src/chart.c @@ -2070,14 +2070,16 @@ _chart_write_marker_value(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_smooth(lxw_chart *self) +_chart_write_smooth(lxw_chart *self, uint8_t smooth) { struct xml_attribute_list attributes; struct xml_attribute *attribute; - char val[] = "1"; + + if (!smooth) + return; LXW_INIT_ATTRIBUTES(); - LXW_PUSH_ATTRIBUTES_STR("val", val); + LXW_PUSH_ATTRIBUTES_STR("val", "1"); lxw_xml_empty_tag(self->file, "c:smooth", &attributes); @@ -2211,6 +2213,10 @@ _chart_write_ser(lxw_chart *self, lxw_chart_series *series) /* Write the c:val element. */ _chart_write_val(self, series); + /* Write the c:smooth element. */ + if (self->is_scatter_chart || self->type == LXW_CHART_LINE) + _chart_write_smooth(self, series->smooth); + lxw_xml_end_tag(self->file, "c:ser"); } @@ -2249,11 +2255,8 @@ _chart_write_xval_ser(lxw_chart *self, lxw_chart_series *series) /* Write the yVal element. */ _chart_write_y_val(self, series); - if (self->type == LXW_CHART_SCATTER_SMOOTH - || self->type == LXW_CHART_SCATTER_SMOOTH_WITH_MARKERS) { - /* Write the c:smooth element. */ - _chart_write_smooth(self); - } + /* Write the c:smooth element. */ + _chart_write_smooth(self, series->smooth); lxw_xml_end_tag(self->file, "c:ser"); } @@ -4000,6 +4003,12 @@ chart_add_series(lxw_chart *self, const char *categories, const char *values) if (_chart_init_data_cache(series->title.range) != LXW_NO_ERROR) goto mem_error; + if (self->type == LXW_CHART_SCATTER_SMOOTH) + series->smooth = LXW_TRUE; + + if (self->type == LXW_CHART_SCATTER_SMOOTH_WITH_MARKERS) + series->smooth = LXW_TRUE; + STAILQ_INSERT_TAIL(self->series_list, series, list_pointers); return series; @@ -4272,6 +4281,15 @@ chart_series_set_points(lxw_chart_series *series, lxw_chart_point *points[]) return LXW_NO_ERROR; } +/* + * Set the smooth property for a line or scatter series. + */ +void +chart_series_set_smooth(lxw_chart_series *series, uint8_t smooth) +{ + series->smooth = smooth; +} + /* * Set an axis caption. */ diff --git a/test/functional/src/test_chart_line03.c b/test/functional/src/test_chart_line03.c new file mode 100644 index 00000000..551bc0ec --- /dev/null +++ b/test/functional/src/test_chart_line03.c @@ -0,0 +1,44 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_line03.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_LINE); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 47673728; + chart->axis_id_2 = 47675264; + + uint8_t data[5][3] = { + {5, 10, 15}, + {2, 4, 6 }, + {3, 6, 9 }, + {4, 8, 12}, + {3, 6, 9 } + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + chart_series_set_smooth(series, LXW_TRUE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_line04.c b/test/functional/src/test_chart_line04.c new file mode 100644 index 00000000..3564d160 --- /dev/null +++ b/test/functional/src/test_chart_line04.c @@ -0,0 +1,45 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_line04.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_LINE); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 47670016; + chart->axis_id_2 = 47671552; + + uint8_t data[5][3] = { + {5, 10, 15}, + {2, 4, 6 }, + {3, 6, 9 }, + {4, 8, 12}, + {3, 6, 9 } + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + chart_series_set_smooth(series1, LXW_TRUE); + chart_series_set_smooth(series3, LXW_TRUE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_scatter09.c b/test/functional/src/test_chart_scatter09.c new file mode 100644 index 00000000..c6e77e9b --- /dev/null +++ b/test/functional/src/test_chart_scatter09.c @@ -0,0 +1,50 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_scatter09.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_SCATTER_SMOOTH_WITH_MARKERS); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 45953024; + chart->axis_id_2 = 45954944; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$B$1:$B$5" + ); + + chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$C$1:$C$5" + ); + + chart_series_set_smooth(series, LXW_FALSE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_scatter10.c b/test/functional/src/test_chart_scatter10.c new file mode 100644 index 00000000..6af6cb80 --- /dev/null +++ b/test/functional/src/test_chart_scatter10.c @@ -0,0 +1,50 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_scatter10.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_SCATTER_SMOOTH); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 84754816; + chart->axis_id_2 = 84756352; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$B$1:$B$5" + ); + + lxw_chart_series *series = chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$C$1:$C$5" + ); + + chart_series_set_smooth(series, LXW_FALSE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_scatter11.c b/test/functional/src/test_chart_scatter11.c new file mode 100644 index 00000000..f2bcd68c --- /dev/null +++ b/test/functional/src/test_chart_scatter11.c @@ -0,0 +1,50 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_scatter11.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_SCATTER_STRAIGHT_WITH_MARKERS); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 47439232; + chart->axis_id_2 = 47670400; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$B$1:$B$5" + ); + + chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$C$1:$C$5" + ); + + chart_series_set_smooth(series, LXW_TRUE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/test_chart_line.py b/test/functional/test_chart_line.py index 6e299953..5485541d 100644 --- a/test/functional/test_chart_line.py +++ b/test/functional/test_chart_line.py @@ -15,3 +15,9 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_line01(self): self.run_exe_test('test_chart_line01') + + def test_chart_line03(self): + self.run_exe_test('test_chart_line03') + + def test_chart_line04(self): + self.run_exe_test('test_chart_line04') diff --git a/test/functional/test_chart_scatter.py b/test/functional/test_chart_scatter.py index f978a9db..50b31b6f 100644 --- a/test/functional/test_chart_scatter.py +++ b/test/functional/test_chart_scatter.py @@ -31,6 +31,15 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_scatter06(self): self.run_exe_test('test_chart_scatter06') + def test_chart_scatter09(self): + self.run_exe_test('test_chart_scatter09') + + def test_chart_scatter10(self): + self.run_exe_test('test_chart_scatter10') + + def test_chart_scatter11(self): + self.run_exe_test('test_chart_scatter11') + def test_chart_scatter12(self): self.run_exe_test('test_chart_scatter12') diff --git a/test/functional/xlsx_files/chart_line03.xlsx b/test/functional/xlsx_files/chart_line03.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ae5353c79e4095cc2b35ef682521de891c0c7029 GIT binary patch literal 9287 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 METM(~rugynKjb1GsQ>@~ literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_scatter09.xlsx b/test/functional/xlsx_files/chart_scatter09.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ecf8aede9049c985a3d83b69b238b5466354486c GIT binary patch literal 9269 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_scatter10.xlsx b/test/functional/xlsx_files/chart_scatter10.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dc03d46fb54fcd5b8c304b52be16d4cc63788f6c GIT binary patch literal 9296 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 JM*QQ~{{X*8DVP8N literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_scatter11.xlsx b/test/functional/xlsx_files/chart_scatter11.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b722a7fa0bc9f3858dd96da8eb232f5bbaac26e7 GIT binary patch literal 9275 zcmeHN^;?wdx}E`PK|n&0p&JAQ1eB1JZcrL&kQf^26p&E5o1vw<89F3~98yYDas(?j|*}gRp0JyjX0Ne%4 z1GPlK)(*zj4tlCCHpccktZ%F=DKgis(rB@DLx zK+3VoKqQIv40rD`o-noU>c*YT-DzGcTHG+z>^R;Rm7IJP6$zhC!g{N575TKvZ66uj zSKo-PE{ybexNvA1t55I(W0@s-3(#W%J8$ScSOjtwRI8UieSY2cq>qHe=k4LE4VhID zYAT)fU^mK11C$F}F4v{eX>{(jvd&kqUi!zlmA;mgA{V&W`+H5FBZkx6-ea{HPB$`J z*2&N{@@NK2rW_Wjd8ymKRMYgevxDKjjA$j(B=C&DU4{a1azx057(N0G41;lwIxa9{ zrsCt9wtIaBj{vA8QBGVH>3uZh7TaZk84C@b3QnvaTT-+Z;4u>^nRxKj@6EVK8Y*<* zxrT2rRdM-(xx;9IC$=hfL{OKN=nCjk2B-!p#?99s_i^$UN8!^lm6h(eB=cREtjy#f zpE$A0(}2S(-9S!HJ#y3CY%H6mZ@HIdh1a&pxn7e;XaKRc*%9nYefnl2QTOwVXQNjI z0$RuvAM%ewU!$YBp%n;z=l@n-!zBlP!?xyO5GNlhlzNx1-)U9U1S@}NCNEK>U&@d0 zFd2r|droDDoJt4RRyew@=C!4gc{eP%c*wsHY%jFA>BE|4mVeeX$iI~9|5?uHOdr~L zM^z7@wtsRxED&z9h*)`u;5rEa9r(tQ?GL&;gY7H~z+j6Xq2^EO-}*s)L{R$weSM7R ze~s|W;-_z~{Ng1_bsaQ{TS$PHL+gVu8~s0BZK&w~?SJ>@M%* zRUo?0f4*`+{5yV_s$CsRB6LoG;Kv<=;t~A#D>FhPeugRWQ^^az$8L#%kwGuym?(uD z{K6Tw;T=(31%?vUGVm7DWF{1+k6nj*`?H&?U&k0v-cCqm$w-1UOA4)ls8=$+cwBoNLg#PGK5$?pC@)K{>4E&aLtkCEW1fOI^i9O- zy+01!$WGtc+}hNh?awcde%NKQ3iOBnYCvf>4*KP1R6LKp z5Pj;Yl9Ku{kR+sOhJqSt8PiT?-gSXkV@-_tajpG~jOa*LCaMCfbp?sO!dQKOtczz% z9U1Ldam*;V3thq8=2jA_@f$+ELpL}2hMkF^i6!*MX2)h2Giq_0EV8(t;)S~GVXEJ5 zqp>|7-YFbMN3(CkvA#(P)H+Xb+=v7Z$58KOc%gU;R_gn zs8X*PEMcV?E0rqbpCL31D~k#Dgdb%@yq1>U4s7V1^+r2+|1~HES09H&mtaJ?pZ2|p z^sQ^SW1=obUD=Y3%yRcziD{qQk~Ph7zQI!Tf@MQc%wV&eEas4>^7)=Itlc5F)=vl) zaxrzmV0D%|PLEL7Km9C@*wI2GVuco=R_Yrn{lnq@Rk1%EuK$Mt%rvIn`vch7t6)cp%^nGXPb>-_;gAChy}m1Jb?1KmvZoc5NEkVs-@jiVv|tw+f4^% zJ5y0`(`n(i3aHU~vPv~1B6DjLiJiGC*OrrxSs4|a9}+At@G?GmQ_@icq-LTrPGXlt z_8+n2l`HD4_VN67^MoY@{7r}z=3krt;Y94sjEx=a|BN?3AAYj>KW$!DY>(*}7;ALy zXN6zBp9==F`uZ+fnZ{k3Qqgv>LR=&-Y%0S);&S7{HmkG~JG z8#%PKzNi3z%7Y)Z+)o$kU}kJ(%=Yv1=a#oL6u>jw1TA-_oGBc@R`k^m&>VxO%94uY z9&}g-l9?yOs;guQjY@eufG>Lk+w1k?fDPO1mdwLQ4Gw8^T7gB#-w977rOWU2%Z#Ev zm>3Tfqw;dUURb7fJcj!PWr$MItlG{L>J+;MbqJEfc+K3L11@DAkVRs48-98t3!hJx z+=Wk^@9K0WG11@&mkP!v)o#C)rcH_oKGMI}-_K9^=#yM+P^s@rJk>5Fa^PH$+C;&) z32htKiDD=<0Ke5n&$B7??p7!E-iGsuF5 zo?J9{q66>6V$#8N$1fWDCdM)6Wr-hE8CdD-EL@B_Zussy4D1m=8B8@dC$(NW*?mWC z9pfmT+;nuSN=^m7T0oO4Vi8X~zIt91HNxV(wal??U8PjiaE5ewOq-yUBA+`VZCoaX z-6J>=xA$P&#KUa>`XIcMCwA|6(5Ys|VGq@4e}LBgTDnlfc^{R4gG3>27@l$IDJ>8v z%RBS%Eg0aQmDoni5EQ^)&lQ64VZ1;+WY2^3J78ESfG{i~k>1GHBWQ{B{c~S~0RR|Z zJHAY`S({|EG5iQcPIcy-9U6{@cV8JnrFAlKkgSXx2ZWkFoG8S} z{FY}z+{W!TsjF%hIoL4??zcMD5pd!X89 z;@S#Kdk#YPB$^&Ylv@s10lyO^dm@WAF*%--B}uRTm@Yz^rVi-Z`YPb^oZ{a*v&lW5r^MBmrLx+$7Lg?c`GP20b^T+VNCuq%zxl^DmXi=p@ zpq|%M?^5bfwh@^XBX{7>!L4Zj+*%q&FEho`<#BIp^Aj*)B`}A^zq_)QuU6<)1u90d zU?vl(Kd%p2!*mfKy z{TQFVaT-<@V9uAar+wl55!rnE+EpgMJ8^1$(AmV{w-oC-t$lL5 znHCc^+|ba_s<~~{?zY&T$P;N2Wz%pQNN#P1^8BgZ3>h)gisIYI@b4bLFu!~d?n4_877SO_ zCe88+%P#MFCb@!3R!ajFmk~5&0OqqZ3ObgOL!#6vTX&`6P%G zpL^_aY5u9xowvAOa}puOt&8$qY3HdX!wkc6@{bmhNg{WfxY4dQ2D|Av8CECsVZ%lz zL*gvcYTK?A{4;JL!RznDlhlUFk>UxfeP1M=lrXkEsnOIbi{;X_FlzH5j(Z#cZKRZ5 z97WrBR(h@Une*IM1e_=838*53)}YGWZbQxd9%;oN&KmAyb1N(gR0)MhX~1%dqN+8k zHS}z9lMV&+Egw#6TzJSEei=yUAMEW6;c|Md-#y`EnVk=B!nP_)5!I&*j~1#PF0|~`g_;>b_RDuBO^x{G=TvZ- z)D;vs!Ko%IOZ!{G$(FLLuNZ4iA270TLwUEPzkMma{;m@&MiLg_T^*ezcTiS;u1rG$ zZ3Y$5Lh<9JU1+{~F~uZi9Y385oTo~wq;!>Q3`>#rsDwk3SA@5@lh9VHL^TMlgrqYu zkntPTg9;?CJEV{~wekxxF>o^}Voj;<`oU+OEXAR|l!$BB+y;emHuZO`n7up15&Z<| zqm84rjYL+*-YN&u6=Y6|aWAFv7(fHdz8v(-#T)0;Dr7d~b#L#?sQD&hz7Pjxe%{g3 z^T;VcvXrsps^5u!i7DWQ3hz1Hw4Zf_+M4?z`wj$Ts%!pm1T69 zsKX!+XDe^j0M8p;T2yJAw-|TUHI18gGSBejOde1THAJ@@Mj_Qn2f5k^;eb(cH!E_U z=xLVr-lfnv>>n7=D72vuwK@hksNa!sfwE21La)`cbmtg{X_We~JO`uTg0d>|o4ZO) zzbz-gl6E)*h?RUyL>>2sHVw`6?GUNg&)Xjv$O}1z2aj-@UVinO($uDGkfOkiNDs$U z#TY99;xr}9Ni8i^y{tw~@>;wYpNDzbu z7}4+ht}|$MUVDo?O6&m>W?!~9o`xTt>GDvT{Gom`r0)|`qNuO1KiL{}Iadye)6=JV zB2vdbAB7fYwF@FiE>uJ0GuH2-vbp3YfFTgY{Pd5xDaWF_JN4_M~KM-8%Y=!FY+W+yPDlhwsCFRwYuhXEf~bxh^& z32<8A2;MVAD$aKWtWv*LB}W&v_J(s66K++IM2wB>^A3KTS)RIj zX>E@ejv`cpJ&f(G`yibdaLFz73^0pR^W+tiq{LMIwax4z`)HNt+iH86nQv&Yi9Tsa zks~akI*a=Sl~uQux1?6=4wdfbhX>g*j02-sR29BLY3bu%A{}AhN-3vby))g@E5DX4 zS7DysK$EFHPJP~6&BP&nV)PPRZE$9QPn%Sw8xm%+;5pf3QiGIzT+_x}^KAW8zP_or z#7ypdgkn3lcuKRy)c8UF6{NbVVq+xKA4k21n23t7opmWOP_M#hDRE-I&(f#zin1zj z_S}6>S38<+e_(`Y9S?($M5|akpR_psjW^OvxidS9S8e^5BwnP~_SBc!#gK`pVe#*N z+gGI)(~RgAu$YJzp~p>wP<~)gyyv5AI!Ftp0jC+qsP=M7s7=ee$g9||%4KcUQrnte zB_hZ8N1dbmpTb=TTam={3ESq(?9DRv?MZa8*T3KqSy0bDy42aLdiGx3t%mJRr+ainR-kUnF~3KnfufCtIKl9{ z*{tc^hJ24PFlW||4p!(?X8Q^bF02lt+q&_~&wlF@Q9frl)*^gjFT#@kEXw~< z#QZ8>LZgNhAnXL*yL9KzxSDne)&lEqv2%2-Lpy34=K1!#pPNZ(p4Uc? zPuzB^O7_RKX2Pk>sH0`gYB3pr356m(Oc`F+vsaCf4s}+nc?Jv&4>Zw|QF2q;lB1A( zAd9dc7e-OhHdU9bu4w;&v?GOWwrc$4t=*8xG*eaozaSw zZp5&aKGt8lPo~69YP>KwU*AUdm@$2&B+Ntk5)@QW&5)2eXVVW;FHC*q$iM?4-(d>n zjyDx--NcpX<_ew0YhOv@I&=`obyMJ>HZ~(W-W0!tZ?pt)DAZ*2WS5^FxkETFO_ZLE z*~;dICNms5;JY;Cw!|LKh+j@@w5%k!xIPJPoQK&kImTXDkF?ld&CN!;kf7R!%B|?W zhHoRE&F`_z?PHSF7W;ESeDISf)pZmzJq&Bh)KaqIhlMo?;joWgL%=CKC}v5$YF{ed zl-Jue0Z*w+YM+PsyCK7lt7jOnA6>0~*6Ur)*#Qy=ZEGO)G z6v?`O68LhpQx^x>^!w<`#$G+fBuW#k1PHcJD$ohg4VJ4F^Kq2Lcwvrm|EaI|=EVWk z>f=>-Yt+c&doO*l`K2`aHg9jI6f$eee?zJN4yE##U|2nz5;v=^Mriuh@yfP$xD!_x6`mwIBfeyK^84AT<1QbMq-Im zXlz!Qd19Va{XM~FQ1FL4LvscC`EV^;Ar~gzRn&MGUCX3f%#u`wfNtkUwr^Q~s-c1oR;H+dFE$~0a+GBSv8_+Zx!ap|cKj~7 zUcjk&oiZyV1HWIK5fhzzf|ZnMzw+AkP@F)LZmg>t5W@=$*1FvHgRjL?L?N?GQN5zo z%&d&Xx57$+qV)U3(5(&P=6<6vgz;jXjx;;rN*4DWRQOX1=VdfYfddTev`>#(avUp> z$pv>6-uYD3%k=VD1nK3s@Fh`q1q26Xp_Hs>tIF0OpC^J+9P(HA)%YyOc9q+^%unu3Yl@*EY_fy>Fjaip-qQf=Bwo>8f5~MV~Ncw4yf1JNlpO_ptBF^EUW^>+J`51QWon zUz*fY>OYAOv{sxRbxZKEEpku)?*635=iTEF>Mkju~IgdXBj_baF_0_Kq zkJ^vzsu;e7@;#f3ZoDwQ{P+A6i1ZMVTmJs_g@0-5U-#d<%%CXqcYwc-VE-lfoSSoxUr6r|Z)n_@g4`6o*}wlKe1-8-__y8snOwn9~#Iv0dKZpe*q5O{`a2#x2Eh(z?+@TUx1$wRU_h%ZuU8E0^F=Ke*t(Q z3Kayvud4H==*^<$m#7@kPtkvrI5!b)CUn0LqVC^3j$i5BO_aYU3coM_03SrZ_aAA) lP4T~b`oD@_gZ?7^r{7nUK|!$iM@^0mFhdwZ6UC3G{{iY`Ax8iJ literal 0 HcmV?d00001