From dd940ab5691baf6d9211310b7fb9329afbbe5ed0 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Mon, 12 Feb 2024 15:01:46 +0100 Subject: [PATCH] doc update and many bugfixes --- doc/dox/examples_and_tutorials.dox | 2 +- doc/dox/jkqtmathtext_supportedlatex.dox | 36 ++-- doc/dox/jkqtplotter_graphs.dox | 186 ------------------ doc/dox/jkqtplotter_plotelements.dox | 14 +- doc/dox/jkqtplotter_plotelements_classdoc.dox | 123 ++++++++++-- doc/dox/mainpage.dox | 8 +- doc/dox/whatsnew.dox | 6 +- doc/images/logo_palette_luts.png | Bin 0 -> 3355 bytes examples/financialgraphs/README.md | 118 +++++++++-- lib/jkqtcommon/jkqtpcsstools.h | 2 +- lib/jkqtcommon/jkqtpstringtools.h | 3 +- lib/jkqtplotter/graphs/jkqtpfinancial.h | 6 +- .../graphs/jkqtpgraphlabelstylemixin.cpp | 8 +- .../graphs/jkqtpgraphlabelstylemixin.h | 18 +- .../graphs/jkqtpstatisticsadaptors.h | 4 +- lib/jkqtplotter/graphs/jkqtpvectorfield.h | 10 +- lib/jkqtplotter/jkqtpbaseplotter.h | 14 +- lib/jkqtplotter/jkqtpkey.h | 6 +- lib/jkqtplotter/jkqtplotter.h | 4 +- .../screen_parmetrizedplots_datatable.png | Bin 0 -> 67756 bytes 20 files changed, 284 insertions(+), 284 deletions(-) delete mode 100644 doc/dox/jkqtplotter_graphs.dox create mode 100644 doc/images/logo_palette_luts.png create mode 100644 screenshots/screen_parmetrizedplots_datatable.png diff --git a/doc/dox/examples_and_tutorials.dox b/doc/dox/examples_and_tutorials.dox index 68582c8860..068647bb3e 100644 --- a/doc/dox/examples_and_tutorials.dox +++ b/doc/dox/examples_and_tutorials.dox @@ -100,7 +100,7 @@ All test-projects are Qt-projects that use qmake to build. You can load them int \image html paramvectorfield_small.png \subpage JKQTPParametrizedVectorFieldGraphExample `JKQTPParametrizedVectorFieldGraph` - \image html financialgraph_small.png + \image html financialgraphs_small.png \subpage JKQTPlotterFinancialChartExample `JKQTPFinancialGraph` (Candlestick/OHLC graphs), date-axis, rotated labels diff --git a/doc/dox/jkqtmathtext_supportedlatex.dox b/doc/dox/jkqtmathtext_supportedlatex.dox index 73cfb2eb32..c9eed86294 100644 --- a/doc/dox/jkqtmathtext_supportedlatex.dox +++ b/doc/dox/jkqtmathtext_supportedlatex.dox @@ -133,7 +133,7 @@ \section JKQTMathTextSuppoertedLaTeXVerbatim Verbatim Text Sometimes it is necessary to typeset text withou interpreting it as LaTeX markup. These instructions are implemented for that: - - \\verb!...!: interpret enclosed text between \c ! as verbose. Instead of \ ! you can choose ANY character! \image html jkqtmathtext/jkqtmathtext_verb.png generated by \\verb!\\LaTeX{} is not pares inside \\verb~..~! outside {\\backslash}verb + - \\verb!...!: interpret enclosed text between \c ! as verbose. Instead of \ ! you can choose ANY character! \image html jkqtmathtext/jkqtmathtext_verb.png "generated by \\verb!\\LaTeX{} is not pares inside \\verb~..~! outside {\\backslash}verb" - \\begin{verbatim}...\\end{verbatim}: interpret enclosed multi-line text as verbatim. \image html jkqtmathtext/jkqtmathtext_verbatim.png - \\begin{lstlisting}...\\end{lstlisting}: actually menat for highlighted code, for now this is the same as \c \\begin{verbatim}...\\end{verbatim}. \image html jkqtmathtext/jkqtmathtext_lstlisting.png - \\begin{verbatim*}...\\end{verbatim*}: interpret enclosed multi-line text as verbatim. Print with visible whitespace and tab characters \image html jkqtmathtext/jkqtmathtext_verbatimast.png @@ -146,9 +146,9 @@ - \c \\alpha ... : display the according greek letter in italic style (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_greek.png - \c \\upalpha ... : display the according upright greek letter. This letter is always upright, independent of the surrounding environment (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_upgreek.png - \c \\textalpha ... : display the according greek letter with italic style defined by the current environment (i.e. italic in mathmode or inside \c \\textit{\\alpha} and upright in text mode). (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_textgreek.png - - \c \\charDECIMAL and \c \\char\"HEX and \c \\char\'OCTAL : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_char.png (generated by A: \\char65, circonflex: \\char\"109 accent: \\char\'351) - - \c \\unicode{HEX} and \c \\usym{HEX} : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_unicode.png (generated by star: \\unicode{2605}, circonflex: \\unicode{109} emoticons: \\usym{1F440} \\usym{1F929}) - - \c \\utfeight{HEX} : draws a unicode character from its UTF-8 encoding \image html jkqtmathtext/jkqtmathtext_utf8.png (generated by star: \\utfeight{e29885} emoticons \\utfeight{F09F9881} \\utfeight{f09f98bb}) + - \c \\charDECIMAL and \c \\char\"HEX and \c \\char\'OCTAL : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_char.png "(generated by A: \\char65, circonflex: \\char\"109 accent: \\char\'351)" + - \c \\unicode{HEX} and \c \\usym{HEX} : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_unicode.png "(generated by star: \\unicode{2605}, circonflex: \\unicode{109} emoticons: \\usym{1F440} \\usym{1F929})" + - \c \\utfeight{HEX} : draws a unicode character from its UTF-8 encoding \image html jkqtmathtext/jkqtmathtext_utf8.png "(generated by star: \\utfeight{e29885} emoticons \\utfeight{F09F9881} \\utfeight{f09f98bb})" - The usual LaTeX-accent commands are also implemented here and work as expected in text-mode, provided the matching unicode characters are available in the current font. \image html jkqtmathtext/jkqtmathtext_textaccents.png - In math-mode the text-accent commands do not work. here you have to use the math-mode commands: @@ -248,25 +248,25 @@ For text-mode tables, the \c tabular -environment is supported: - $\\begin{tabular}{COLSPEC} a & b & ...\\\\ c & d & ...\\end{tabular}$ \c COLSPEC is a LaTeX column specifier, i.e. a sequence composed of these parts: - - \c l : left-aligned column - - \c c : centered column - - \c r : right-aligned column - - \c | : single line - - \c || : double line - - \c : : single dashed line - - \c :: : double dashed line + - \c l : left-aligned column + - \c c : centered column + - \c r : right-aligned column + - \c | : single line + - \c || : double line + - \c : : single dashed line + - \c :: : double dashed line . - . - In all these environments, you can use the following instructions to draw lines above/below a row in the matrix: + . + In all these environments, you can use the following instructions to draw lines above/below a row in the matrix: - \c \\hline or \c \\midrule: a single line - \c \\hline\\hline : a double line - \c \\toprule or \c \\bottomrule : a heavy line - \c \\hdashline : a single dashed line - \c \\hdashline\\hdashline : a double dashed line - . + . - Here is an example: - \code + Here is an example: + \code \begin{tabular}{:l|cr||} \hdashline a1--- & b1--- & c1---\\ @@ -277,9 +277,9 @@ a4 & b4 & c4\\ \bottomrule \end{tabular} - \endcode + \endcode - \image html jkqtmathtext/jkqtmathtext_tabular.png + \image html jkqtmathtext/jkqtmathtext_tabular.png \section JKQTMathTextSuppoertedLaTeXMathSupport Supported Mathematical Constructs diff --git a/doc/dox/jkqtplotter_graphs.dox b/doc/dox/jkqtplotter_graphs.dox deleted file mode 100644 index 38369f4cc3..0000000000 --- a/doc/dox/jkqtplotter_graphs.dox +++ /dev/null @@ -1,186 +0,0 @@ -/*! - - - \defgroup jkqtplotter_graphsgroup_classstructure Graphs - \ingroup jkqtplotter_general - - \section jkqtplotter_graphsgroup_classstructure_basics Graph Class Structure - - Each type of graph is represented by another class, which has to be derived from JKQTPPlotElement. This class provides a basic virtual interface - that allows JKQTPlotter to draw the graphs represented by them. This interface consists of these functions: - - JKQTPPlotElement::draw() draws the graph onto a given JKQTPEnhancedPainter (derived from QPainter) - - JKQTPPlotElement::drawKeyMarker() draws the small marker image in the plot legend - - JKQTPPlotElement::getKeyLabelColor() returns a color for the legend entry for the graph - - JKQTPPlotElement::getXMinMax() returns the extent of the graph in x-direction (e.g. for auto-zooming) - - JKQTPPlotElement::getYMinMax() returns the extent of the graph in Y-direction (e.g. for auto-zooming) - . - In addition to these basic functions, there are additional functions that can be used to draw something outside the actual plot rectangle. - These are used to e.g. add color-scales to the side of the graph: - - JKQTPPlotElement::getOutsideSize() returns the amount of space required outside the plot rectangle - - JKQTPPlotElement::drawOutside() draws the elements outside the plot rectangle - . - - Usually if writing a new graph, one would not directly - derive from JKQTPPlotElement, but from a cass in it's hirarchy of children. These children already provide certain facilities for certain types of graphs. - - \dot - digraph - { - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"]; - node [fontname="FreeSans",fontsize="10"]; - rankdir="LR"; - - { - rank=same; - JKQTPPlotElement [URL="\ref JKQTPPlotElement"]; - noteJKQTPPlotElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nelements drawn\nonto a plot"]; - JKQTPPlotElement -> noteJKQTPPlotElement [style=dashed,arrowhead=none]; - } - - { - rank=same; - JKQTPGraph [URL="\ref JKQTPPlotElement"]; - noteJKQTPGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nactual graphs"]; - JKQTPGraph -> noteJKQTPGraph [style=dashed,arrowhead=none]; - - JKQTPGeometricPlotElement [URL="\ref JKQTPGeometricPlotElement"]; - noteJKQTPGeometricPlotElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nnon-graph elements,\ne.g. geometric elements"]; - JKQTPGeometricPlotElement -> noteJKQTPGeometricPlotElement [style=dashed,arrowhead=none]; - - JKQTPPlotAnnotationElement [URL="\ref JKQTPPlotAnnotationElement"]; - noteJKQTPPlotAnnotationElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraph annotation elements,\ne.g. text, symbols, ranges ..."]; - JKQTPPlotAnnotationElement -> noteJKQTPPlotAnnotationElement [style=dashed,arrowhead=none]; - } - - - { - rank=same; - - JKQTPXYGraph [URL="\ref JKQTPXYGraph"] - noteJKQTPXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs"]; - JKQTPXYGraph -> noteJKQTPXYGraph [style=dashed,arrowhead=none]; - - JKQTPSingleColumnGraph [URL="\ref JKQTPSingleColumnGraph"] - noteJKQTPSingleColumnGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on only\n a single column of data"]; - JKQTPSingleColumnGraph -> noteJKQTPSingleColumnGraph [style=dashed,arrowhead=none]; - - JKQTPImageBase [URL="\ref JKQTPImageBase"] - noteJKQTPImageBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \n2D images/matrices"]; - JKQTPImageBase -> noteJKQTPImageBase [style=dashed,arrowhead=none]; - } - - { - rank=same; - - JKQTPXYYGraph [URL="\ref JKQTPXYYGraph"] - noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data triples"]; - JKQTPXYYGraph -> noteJKQTPXYYGraph [style=dashed,arrowhead=none]; - - JKQTPXXYGraph [URL="\ref JKQTPXXYGraph"] - noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data triples"]; - JKQTPXXYGraph -> noteJKQTPXXYGraph [style=dashed,arrowhead=none]; - - JKQTPXYAndVectorGraph [URL="\ref JKQTPXYAndVectorGraph"] - noteJJKQTPXYAndVectorGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nvector field graphs based on\n (x, y, dx, dy) data quadruples"]; - JKQTPXYAndVectorGraph -> noteJJKQTPXYAndVectorGraph [style=dashed,arrowhead=none]; - - JKQTPXYBaselineGraph [URL="\ref JKQTPXYBaselineGraph"] - noteJJKQTPXYBaselineGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs and a baseline"]; - JKQTPXYBaselineGraph -> noteJJKQTPXYBaselineGraph [style=dashed,arrowhead=none]; - - JKQTPEvaluatedFunctionGraphBase [URL="\ref JKQTPEvaluatedFunctionGraphBase"] - noteJKQTPEvaluatedFunctionGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \ndynamically evaluated functions"]; - JKQTPEvaluatedFunctionGraphBase -> noteJKQTPEvaluatedFunctionGraphBase [style=dashed,arrowhead=none]; - - JKQTPMathImageBase [URL="\ref JKQTPMathImageBase"] - noteJKQTPMathImageBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ndata-based images"]; - JKQTPMathImageBase -> noteJKQTPMathImageBase [style=dashed,arrowhead=none]; - } - - { - rank=same; - - JKQTPBarGraphBase [URL="\ref JKQTPBarGraphBase"] - noteJKQTPBarGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nbarcharts"]; - JKQTPBarGraphBase -> noteJKQTPBarGraphBase [style=dashed,arrowhead=none]; - - JKQTPFilledCurveGraphBase [URL="\ref JKQTPFilledCurveGraphBase"] - noteJKQTPFilledCurveGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nfilled graphs"]; - JKQTPFilledCurveGraphBase -> noteJKQTPFilledCurveGraphBase [style=dashed,arrowhead=none]; - - JKQTPImpulsesGraphBase [URL="\ref JKQTPImpulsesGraphBase"] - noteJKQTPImpulsesGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nimpulse graphs"]; - JKQTPImpulsesGraphBase -> noteJKQTPImpulsesGraphBase [style=dashed,arrowhead=none]; - - JKQTPSpecialLineGraphBase [URL="\ref JKQTPSpecialLineGraphBase"] - noteJKQTPSpecialLineGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nspecial line graphs"]; - JKQTPSpecialLineGraphBase -> noteJKQTPSpecialLineGraphBase [style=dashed,arrowhead=none]; - - JKQTPBoxplotGraphBase [URL="\ref JKQTPBoxplotGraphBase"] - noteJKQTPBoxplotGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na set of boxplots"]; - JKQTPBoxplotGraphBase -> noteJKQTPBoxplotGraphBase [style=dashed,arrowhead=none]; - - JKQTPRangeBase [URL="\ref JKQTPRangeBase"]; - noteJKQTPRangeBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nrange annotations"]; - JKQTPRangeBase -> noteJKQTPRangeBase [style=dashed,arrowhead=none]; - - JKQTPBoxplotElementBase [URL="\ref JKQTPBoxplotElementBase"] - noteJKQTPBoxplotElementBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na single boxplot"]; - JKQTPBoxplotElementBase -> noteJKQTPBoxplotElementBase [style=dashed,arrowhead=none]; - - JKQTPViolinplotElementBase [URL="\ref JKQTPViolinplotElementBase"] - noteJKQTPViolinplotElementBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na single violin plot"]; - JKQTPViolinplotElementBase -> noteJKQTPViolinplotElementBase [style=dashed,arrowhead=none]; - } - - JKQTPPlotElement -> JKQTPGraph - JKQTPPlotElement -> JKQTPGeometricPlotElement - JKQTPPlotElement -> JKQTPPlotAnnotationElement - JKQTPPlotElement -> JKQTPRangeBase - JKQTPPlotElement -> JKQTPBoxplotElementBase - JKQTPPlotElement -> JKQTPViolinplotElementBase - - JKQTPGraph -> JKQTPXYGraph - JKQTPGraph -> JKQTPSingleColumnGraph - JKQTPGraph -> JKQTPImageBase -> JKQTPMathImageBase - JKQTPGraph -> JKQTPEvaluatedFunctionGraphBase - JKQTPGraph -> JKQTPBoxplotGraphBase - - JKQTPXYGraph -> JKQTPXYYGraph - JKQTPXYGraph -> JKQTPXXYGraph - JKQTPXYGraph -> JKQTPXYBaselineGraph - - JKQTPXYBaselineGraph -> JKQTPBarGraphBase - JKQTPXYBaselineGraph -> JKQTPFilledCurveGraphBase - JKQTPXYBaselineGraph -> JKQTPImpulsesGraphBase - JKQTPXYBaselineGraph -> JKQTPSpecialLineGraphBase - - } - \enddot - - - \section jkqtplotter_graphsgroup_classstructure_mixins Mix-In Classes for Graphs - - \see \ref jkqtplotter_mixins - - In addition there are mix-in classes that are used via multiple inheritance - that add additional features and properties to a graph. A prominent example are the classes for \ref jkqtplotter_basegraphserrors "error indicators". - With these there are usually two variants of one type of graph: One without error indicators and one with error indicators, e.g.: - - JKQTPXYLineGraph shows lines+symbols graphs made up from x/y-value pairs for each data point. - - JKQTPXYLineErrorGraph extends JKQTPXYLineGraph with error indicator drawing/properties provided by JKQTPXYGraphErrors - . - This approach allows to keep interfaces and appearance recognizeable over different graph classes and locates the source code - for a feature like error indicators in a single/in few class(es). - - Another example of such a class is JKQTPColorPaletteStyleAndToolsMixin, which provides functions that allow to use color palettes. It is - mainly used for the \ref jkqtplotter_imagelots "Image/Matrix graphs", but also by e.g. JKQTPXYParametrizedScatterGraph. - - - - -*/ - - - diff --git a/doc/dox/jkqtplotter_plotelements.dox b/doc/dox/jkqtplotter_plotelements.dox index a54886e220..34b818de0c 100644 --- a/doc/dox/jkqtplotter_plotelements.dox +++ b/doc/dox/jkqtplotter_plotelements.dox @@ -62,6 +62,10 @@ noteJKQTPXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs"]; JKQTPXYGraph -> noteJKQTPXYGraph [style=dashed,arrowhead=none]; + JKQTPXGraph [URL="\ref JKQTPXGraph"] + noteJKQTPXGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,....) data e.g. JKQTPFinancialGraph"]; + JKQTPXGraph -> noteJKQTPXGraph [style=dashed,arrowhead=none]; + JKQTPSingleColumnGraph [URL="\ref JKQTPSingleColumnGraph"] noteJKQTPSingleColumnGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on only\n a single column of data"]; JKQTPSingleColumnGraph -> noteJKQTPSingleColumnGraph [style=dashed,arrowhead=none]; @@ -75,13 +79,17 @@ rank=same; JKQTPXYYGraph [URL="\ref JKQTPXYYGraph"] - noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data tripels"]; + noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data triples"]; JKQTPXYYGraph -> noteJKQTPXYYGraph [style=dashed,arrowhead=none]; JKQTPXXYGraph [URL="\ref JKQTPXXYGraph"] - noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data tripels"]; + noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data triples"]; JKQTPXXYGraph -> noteJKQTPXXYGraph [style=dashed,arrowhead=none]; + JKQTPXYAndVectorGraph [URL="\ref JKQTPXYAndVectorGraph"] + noteJJKQTPXYAndVectorGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nvector field graphs based on\n (x, y, dx, dy) data quadruples"]; + JKQTPXYAndVectorGraph -> noteJJKQTPXYAndVectorGraph [style=dashed,arrowhead=none]; + JKQTPXYBaselineGraph [URL="\ref JKQTPXYBaselineGraph"] noteJJKQTPXYBaselineGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs and a baseline"]; JKQTPXYBaselineGraph -> noteJJKQTPXYBaselineGraph [style=dashed,arrowhead=none]; @@ -139,6 +147,7 @@ JKQTPPlotElement -> JKQTPViolinplotElementBase JKQTPGraph -> JKQTPXYGraph + JKQTPGraph -> JKQTPXGraph JKQTPGraph -> JKQTPSingleColumnGraph JKQTPGraph -> JKQTPImageBase -> JKQTPMathImageBase JKQTPGraph -> JKQTPEvaluatedFunctionGraphBase @@ -147,6 +156,7 @@ JKQTPXYGraph -> JKQTPXYYGraph JKQTPXYGraph -> JKQTPXXYGraph JKQTPXYGraph -> JKQTPXYBaselineGraph + JKQTPXYGraph -> JKQTPXYAndVectorGraph JKQTPXYBaselineGraph -> JKQTPBarGraphBase JKQTPXYBaselineGraph -> JKQTPFilledCurveGraphBase diff --git a/doc/dox/jkqtplotter_plotelements_classdoc.dox b/doc/dox/jkqtplotter_plotelements_classdoc.dox index b14710ea89..5a04d8a73c 100644 --- a/doc/dox/jkqtplotter_plotelements_classdoc.dox +++ b/doc/dox/jkqtplotter_plotelements_classdoc.dox @@ -40,22 +40,99 @@ These classes are used by JKQTPlotterBase to output the plot. \ingroup jkqtplotter_elements + + + + + + + + + + + + + + + + + +
Icon + + Topic/Chapter +
\link jkqtplotter_linesymbolgraphs   \image{inline} html symbols_and_styles_small.png "" \endlink + \link jkqtplotter_linesymbolgraphs   \image{inline} html stepplots_small.png "" \endlink + \ref jkqtplotter_linesymbolgraphs +
\link jkqtplotter_filledgraphs   \image{inline} html JKQTPFilledCurveXGraph_small.png "" \endlink + \link jkqtplotter_filledgraphs   \image{inline} html JKQTPfilledVerticalRangeGraph_WithLines_small.png "" \endlink + \ref jkqtplotter_filledgraphs +
  + \link jkqtplotter_sticks   \image{inline} html JKQTPImpulsesVerticalGraph_Symbols_small.png "" \endlink + \ref jkqtplotter_sticks +
\link jkqtplotter_barcharts   \image{inline} html JKQTPBarVerticalGraph_small.png "" \endlink + \link jkqtplotter_barcharts   \image{inline} html JKQTPbarVerticalGraphStacked_small.png "" \endlink + \ref jkqtplotter_barcharts +
\link jkqtplotter_statgraphs   \image{inline} html boxplot_small.png "" \endlink + \link jkqtplotter_statgraphs   \image{inline} html JKQTPViolinplotVerticalElement_small.png "" \endlink + \ref jkqtplotter_statgraphs +
  + \link jkqtplotter_eventgraphs   \image{inline} html JKQTPPeakStreamGraphY_small.png "" \endlink + \ref jkqtplotter_eventgraphs +
\link jkqtplotter_imagelots   \image{inline} html JKQTPMathImageBaseModifyNone_small.png "" \endlink + \link jkqtplotter_imagelots   \image{inline} html overlayimageenhanced_small.png "" \endlink + \ref jkqtplotter_imagelots +
  + \link jkqtplotter_imagelots_contour   \image{inline} html JKQTPColumnContourPlot_small.png "" \endlink + \ref jkqtplotter_imagelots_contour +
  + \link jkqtplotter_vectorfieldgraphs   \image{inline} html paramvectorfield_small.png "" \endlink + \ref jkqtplotter_vectorfieldgraphs +
  + \link jkqtplotter_financialgraphs   \image{inline} html financialgraphs_small.png "" \endlink + \ref jkqtplotter_financialgraphs +
\link jkqtplotter_geoplots   \image{inline} html geo_coordinateaxis0_small.png "" \endlink + \link jkqtplotter_geoplots   \image{inline} html geo_text_small.png "" \endlink + \ref jkqtplotter_geoplots +
  + \link jkqtplotter_annotations   \image{inline} html JKQTPHorizontalRange_small.png "" \endlink + \ref jkqtplotter_annotations +
  + \link jkqtplotter_graphlabels   \image{inline} html JKQTPGLSimpleBoxAndLineONLYLABELS_small.png "" \endlink + \ref jkqtplotter_graphlabels +
+ + + + + + + + + \defgroup jkqtplotter_linesymbolgraphs Line/Symbol Graphs \ingroup jkqtplotter_concretegraphs This group assembles graphs that show their data with symbols and optionally with connecting lines in diferent styles: - - - +
Screenshot - Classes + \link jkqtplotter_linesymbolgraphs_scatter   \image{inline} html JKQTPXYScatterGraph_small.png "" \endlink + \link jkqtplotter_linesymbolgraphs_scatter   \image{inline} html beeswarmplot_small.png "" \endlink + \ref jkqtplotter_linesymbolgraphs_scatter
\image html symbols_and_styles_small.png - JKQTPXYLineGraph, JKQTPXYLineErrorGraph + \link jkqtplotter_linesymbolgraphs_line   \image{inline} html symbols_and_styles_small.png "" \endlink + \link jkqtplotter_linesymbolgraphs_line   \image{inline} html stepplots_small.png "" \endlink + \ref jkqtplotter_linesymbolgraphs_line
\image html stepplots_small.png - JKQTPSpecialLineHorizontalGraph, JKQTPSpecialLineVerticalGraph +   + \link jkqtplotter_linesymbolgraphs_param   \image{inline} html paramscatterplot_small.png "" \endlink\endlink + \ref jkqtplotter_linesymbolgraphs_param +
\link jkqtplotter_functiongraphs   \image{inline} html functionplot_small.png "" \endlink + \link jkqtplotter_functiongraphs   \image{inline} html evalcurve_small.png "" \endlink + \ref jkqtplotter_functiongraphs
+ \defgroup jkqtplotter_linesymbolgraphs_scatter Scatter Graphs \ingroup jkqtplotter_linesymbolgraphs @@ -170,6 +247,7 @@ This group assembles graphs that add (textual) labels to the datapoints in a plo JKQTPBarVerticalStackableGraph, JKQTPBarHorizontalStackableGraph + \defgroup jkqtplotter_sticks Impulse-Charts \ingroup jkqtplotter_concretegraphs @@ -201,7 +279,7 @@ This group assembles graphs that add (textual) labels to the datapoints in a plo \image html JKQTPViolinplotVerticalElement_small.png JKQTPViolinplotVerticalElement, JKQTPViolinplotHorizontalElement - /table> + \see \ref jkqtptools_math_statistics_adaptors for shortcuts to calculate statistical properties of data and then adding a plot with the results. @@ -273,6 +351,7 @@ Examples: - \ref JKQTPlotterGeometricGraphs . + \defgroup jkqtplotter_eventgraphs Event Graphs \ingroup jkqtplotter_concretegraphs @@ -317,28 +396,32 @@ This group assembles graphs that represent financial data (such as price mmoveme JKQTPFinancialGraph + + \defgroup jkqtplotter_imagelots Matrix/Image Plotting \ingroup jkqtplotter_concretegraphs - - - - - -
Screenshot - Classes + \link jkqtplotter_imagelots_elements   \image{inline} html rgbimageplot_qt_small.png "" \endlink + \link jkqtplotter_imagelots_elements   \image{inline} html JKQTPMathImageBaseModifyNone_small.png "" \endlink + \ref jkqtplotter_imagelots_elements
\image html rgbimageplot_qt_small.png - JKQTPImage +   + \link jkqtplotter_imagelots_overlays   \image{inline} html overlayimageenhanced_small.png "" \endlink\endlink + \ref jkqtplotter_imagelots_overlays
\image html JKQTPMathImageBaseModifyNone_small.png - JKQTPMathImage, JKQTPColumnMathImage +   + \link jkqtplotter_imagelots_contour   \image{inline} html JKQTPColumnContourPlot_small.png "" \endlink\endlink + \ref jkqtplotter_imagelots_contour
\image html rgbimageplots_small.png - JKQTPRGBMathImage, JKQTPColumnRGBMathImage +   + \link jkqtplotter_vectorfieldgraphs   \image{inline} html paramvectorfield_small.png "" \endlink\endlink + \ref jkqtplotter_vectorfieldgraphs
\image html overlayimage_small.png - JKQTPOverlayImage -
\image html overlayimageenhanced_small.png - JKQTPOverlayImageEnhanced, JKQTPColumnOverlayImageEnhanced +   + \link jkqtplotter_imagelots_tools_LUTS   \image{inline} html logo_palette_luts.png "" \endlink\endlink + \ref jkqtplotter_imagelots_tools_LUTS
\defgroup jkqtplotter_imagelots_elements Image Graphs diff --git a/doc/dox/mainpage.dox b/doc/dox/mainpage.dox index 33c313f1fe..23c0696231 100644 --- a/doc/dox/mainpage.dox +++ b/doc/dox/mainpage.dox @@ -31,10 +31,10 @@ - C++ standard iterator interface - \ref jkqtptools_math_statistics (basic statistics, boxplots, histograms, kernel density estimates, regression analysis, polynomial fitting) - \ref jkqtplotter_elements "large variety of graphs that can be added to a plot", e.g.: - - \ref jkqtplotter_linesymbolgraphs_simple "scatter-plots" (also \ref jkqtplotter_linesymbolgraphs_param "parametrized color/size/symbol by a third data-column") - - \ref jkqtplotter_linesymbolgraphs "line graphs, step graphs", \ref jkqtplotter_barssticks "impulses" + - \ref jkqtplotter_linesymbolgraphs_scatter "scatter-plots" (also \ref jkqtplotter_linesymbolgraphs_param "parametrized color/size/symbol by a third data-column") + - \ref jkqtplotter_linesymbolgraphs "line graphs, step graphs", \ref jkqtplotter_sticks "impulses" - \ref jkqtplotter_filledgraphs "filled curves" - - \ref jkqtplotter_barssticks "barcharts (also stacked)" + - \ref jkqtplotter_barcharts "barcharts (also stacked)" - extensive support for different styles of error indicators - \ref jkqtptools_math_parser "integrated mathematical function parser for function plots (with intelligent rendering algorithm)" - \ref jkqtplotter_functiongraphs "line/scatter graphs can also be based on C/C++ functions instead of data series (C++11 support!)" @@ -75,6 +75,6 @@ -\image html screenshotsbanner.png +\link exampleTutorialProjects   \image html examplesbanner.png "" \endlink */ \ No newline at end of file diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index 94f35f01dc..e53a74c1c1 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -53,8 +53,8 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
  • FIXED: fixes strange rendering with distortions (especially in text!), by correcting size calculation of internal image buffer
  • FIXED: exporting gridPrinting plots when using only a JKQTBasePlotter
  • FIXED: fixed impleentations of JKQTPlotter::beginGraphs(), which actually returned the end-iterator (COPY-PASTE-ERROR!!!)
  • -
  • FIXED issue #99: Clipping of Tick Labels: for horizontal axes, additional space at the left and/or right of the plot is allowed so labels are no longer clipped (thanks to user:allenbarnett5/a> for reporting)
  • -
  • FIXED issue #99: Height of one-column key/legend was too large (thanks to user:allenbarnett5/a> for reporting)
  • +
  • FIXED issue #99: Clipping of Tick Labels: for horizontal axes, additional space at the left and/or right of the plot is allowed so labels are no longer clipped (thanks to user:allenbarnett5 for reporting)
  • +
  • FIXED issue #99: Height of one-column key/legend was too large (thanks to user:allenbarnett5 for reporting)
  • FIXED issue mentioned in #110: Lock the panning action to certain values: View zooms in, when panning close to AbosluteXY (thanks to user:sim186 for reporting)
  • FIXED: jkqtpstatSum() and jkqtpstatSumSqr() did not work, as a non-existing function is called internally
  • FIXED removed unnecessary operators (<,>,<=,>=) from JKQTPColumnIterator and JKQTPColumnConstIterator, which lead to exceptions on some compilers (MSVC)
  • @@ -72,7 +72,7 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
  • IMPROVED/REWORKED: reworked JKQTPCADrawMode and coordinate axis drawing so the draw mide can be specified as ORed combination of flags from JKQTPCADrawModeElements, added flags to draw arrows at the end of the axis line
  • IMPROVED/REWORKED: coordinate axis code was refactored
  • IMPROVED/REWORKED: zomm/pan by mouse-wheel: now there are modes that support zoomin AND panning by trakpad and mouse-wheel simultaneously! This can only be implemented using heuristics, due to the way that Qt handles track-pad events, but the current solution should at least improve the behaviour seen before. Mainly jkqtpmwaZoomByWheelAndTrackpadPan was introduced into JKQTPMouseWheelActions und is set as default mode: Here JKQTPlotter tries to distinguish the QWheelEvent s sent by an actual mouse wheel and a trackpad.
  • -
  • IMPROVED/REWORKED: better example graphs in \link JKQTPlotterStyling.
  • +
  • IMPROVED/REWORKED: better example graphs in \ref JKQTPlotterStyling .
  • IMPROVED/REWORKED: legend/key positioning as combination of 3 values, e.g. \c JKQTPKeyOutsideTop|JKQTPKeyTop|JKQTPKeyRight or \c JKQTPKeyInside|JKQTPKeyTopJKQTPKeyRight
  • IMPROVED/REWORKED: The functions JKQTBasePlotter::saveImage(), JKQTBasePlotter::saveAsPixelImage(), JKQTBasePlotter::saveAsPDF(), JKQTBasePlotter::saveSVG(), ... gained a bool return value to indicate whether sacing was successful.
  • IMPROVED/REWORKED: More save...() functions will appear in the API of JKQTPlotter, so you don't have to go via JKQTPlotter::getPlotter(). These are merely forwarding the call to the internel JKQTBasePlotter instance.
  • diff --git a/doc/images/logo_palette_luts.png b/doc/images/logo_palette_luts.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc1c605dea8088672107455f55d8f47c7b9bc85 GIT binary patch literal 3355 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 literal 0 HcmV?d00001 diff --git a/examples/financialgraphs/README.md b/examples/financialgraphs/README.md index 717a4da59a..553fd853e1 100644 --- a/examples/financialgraphs/README.md +++ b/examples/financialgraphs/README.md @@ -5,23 +5,119 @@ The source code of the main application is (see [`financialgraphs.cpp`](https:// Here is a short summary of the important parts of the code: + +First we need to set up the plotter and then generate some data for our plot. Here we use a simple random walk (with normally distributed steps) to simulate the price of some virtual stock. We simulate severals steps ofer NDays days and then calculate the necessary statistics over each day (i.e. the opening and closing price, as well as the daily maximum and minimum). Alternatively you could of course also load actual stock price data and read it in youself. + ```.cpp + // 1. setup a plotter window and get a pointer to the internal datastore (for convenience) + JKQTPlotter plot; + JKQTPDatastore* ds=plot.getDatastore(); + + // 2. now we create 5 datacolumns with length Ndays entries in the datastore + // these will later hold the time-step and simulated market data of two stocks + const size_t NDays=31; + const size_t columnT=ds->addColumn("time"); + const size_t columnO1=ds->addColumn("open(stock 1)"); + const size_t columnC1=ds->addColumn("close(stock 1)"); + const size_t columnL1=ds->addColumn("low(stock 1)"); + const size_t columnH1=ds->addColumn("high(stock 1)"); + const size_t columnO2=ds->addColumn("open(stock 2)"); + const size_t columnC2=ds->addColumn("close(stock 2)"); + const size_t columnL2=ds->addColumn("low(stock 2)"); + const size_t columnH2=ds->addColumn("high(stock 2)"); + const QDate t0(2024,1,8); // start date + + // 3. now we simulate stock market data with a simple random walk + // with a few steps per day that are summmarized into the four + // properties Open,Close,Low,High for each day + double price1=30; // start price of stock 1 + double price2=25; // start price of stock 2 + const size_t stepsPerDay=20; + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + gen.seed(12352); + std::normal_distribution dist1(0.001, 0.6); + std::normal_distribution dist2(-0.0001, 0.4); + for (size_t t=0; tappendToColumn(columnT, QDateTime(d,QTime(12,0,0)).toMSecsSinceEpoch()); + // the open-Value is the start-price of each day: + ds->appendToColumn(columnO1, price1); + ds->appendToColumn(columnO2, price2); + + // now we iterate the market over the day + double L1=price1, L2=price2, H1=price1, H2=price2; + for (size_t i=0; iappendToColumn(columnC1, price1); + ds->appendToColumn(columnC2, price2); + + // finally we just have to add the highest and lowest prices of each day: + ds->appendToColumn(columnL1, L1); + ds->appendToColumn(columnL2, L2); + ds->appendToColumn(columnH1, H1); + ds->appendToColumn(columnH2, H2); + } ``` +Now we have all columns necessary for two JKQTPFinancialGraph graphs.The first graph will be drawn in the CandleStick style and the second in the OHLC-sytle: + +```.cpp + + // 3. create two JKQTPFinancialGraph to display the data: + JKQTPFinancialGraph* graphCandleStick=new JKQTPFinancialGraph(&plot); + graphCandleStick->setXColumn(columnT); + graphCandleStick->setOpenColumn(columnO1); + graphCandleStick->setHighColumn(columnH1); + graphCandleStick->setLowColumn(columnL1); + graphCandleStick->setCloseColumn(columnC1); + graphCandleStick->setGraphType(JKQTPFinancialGraph::CandleStick); + graphCandleStick->setTitle(QObject::tr("stock 1 (candlestick)")); + graphCandleStick->setCandlestickTwoColor(QColor("darkgreen"), QColor("maroon")); + + JKQTPFinancialGraph* graphOHLC=new JKQTPFinancialGraph(&plot); + graphOHLC->setXColumn(columnT); + graphOHLC->setOpenColumn(columnO2); + graphOHLC->setHighColumn(columnH2); + graphOHLC->setLowColumn(columnL2); + graphOHLC->setCloseColumn(columnC2); + graphOHLC->setGraphType(JKQTPFinancialGraph::OHLC); + graphOHLC->setTitle(QObject::tr("stock 2 (OHLC)")); + graphOHLC->setOHLCTwoColor(QColor("darkgreen"), QColor("maroon")); + + // 4. add the graphs to the plot, so it is actually displayed + plot.addGraph(graphCandleStick); + plot.addGraph(graphOHLC); + +``` + +Finally we only have to format the plot and coordinate axes slightly to produce a nicer and better readable plot: + +```.cpp + + + // 5. scale the plot so the graph is contained and make x-axis a date-axis + plot.getXAxis()->setTickLabelType(JKQTPCALTdate); + plot.getXAxis()->setAxisLabel("time"); + plot.getXAxis()->setTickLabelAngle(35); // rotate axis tick label by 35°, so they are readable + plot.getYAxis()->setAxisLabel("stock price [\\$]"); + plot.getMainKey()->setPosition(JKQTPKeyInsideTopLeft); + plot.zoomToFit();``` + The result looks like this: ![financialgraphs](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/financialgraphs.png) -By default, the length of the drawn vector is determined from the actual length in the data via an autoscaling algorithm that is supposed to prevent the vectors from overlapping. -But you can modify this behaviour by adding a line - -```.cpp - graph1->setVectorLengthMode(JKQTPVectorFieldGraph::LengthFromData); -``` - -which will use the given lengths directly (only scaled by an optional factor defined by JKQTPVectorFieldGraph::setLengthScaleFactor() ). The result then looks like this: - -![financialgraphs](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/JKQTPVectorFieldGraphLengthFromData.png) - diff --git a/lib/jkqtcommon/jkqtpcsstools.h b/lib/jkqtcommon/jkqtpcsstools.h index 574ec0f308..cf1c208a9f 100644 --- a/lib/jkqtcommon/jkqtpcsstools.h +++ b/lib/jkqtcommon/jkqtpcsstools.h @@ -43,7 +43,7 @@ -> (%)? -> NAME | # - | (rgb | rgba | hsl | hsv | gray | grey | red | green | blue) ( ( [,/]? ){1-4} ) + | (rgb | rgba | hsl | hsv | gray | grey | red | green | blue) ( ( [,/]? ){1-4} ) -> floating-point-number, i.e. "[+-]?\d+\.?\d*" -> RGB | RRGGBB | RGBA | RRGGBBAA diff --git a/lib/jkqtcommon/jkqtpstringtools.h b/lib/jkqtcommon/jkqtpstringtools.h index 1a0513584a..35016497f3 100644 --- a/lib/jkqtcommon/jkqtpstringtools.h +++ b/lib/jkqtcommon/jkqtpstringtools.h @@ -58,7 +58,6 @@ JKQTCOMMON_LIB_EXPORT Qt::BrushStyle jkqtp_String2QBrushStyle(const QString& sty * \param style the string to be parsed * \param[out] gradient output parameter for a parsed gradient * \param[out] image output parameter for a parsed image - * \param[out] rotationAngleDeg output parameter for a parsed rotation angle of the pattern in degrees, where the direction equals the direction of a clock hand, i.e. 0=12o'clock, 180=6o'clock, ... * * \see jkqtp_String2QBrushStyle() */ @@ -234,7 +233,7 @@ JKQTCOMMON_LIB_EXPORT QString jkqtp_QColor2String(QColor color, bool useSpecialT * * \param color the color name to convert * \param namesOnly if \c true , the function only compares against the list of CSS colors; otherwise it passes the string also on to QColor()-constructor, which interprets e.g. \c #AABBCC - * \param nameFound[out] optional return value that signifies whether a name was found + * \param[out] nameFound optional return value that signifies whether a name was found */ JKQTCOMMON_LIB_EXPORT QColor jkqtp_lookupQColorName(const QString& color, bool namesOnly=false, bool* nameFound=nullptr); diff --git a/lib/jkqtplotter/graphs/jkqtpfinancial.h b/lib/jkqtplotter/graphs/jkqtpfinancial.h index 19e956e3fd..537cf08b5d 100644 --- a/lib/jkqtplotter/graphs/jkqtpfinancial.h +++ b/lib/jkqtplotter/graphs/jkqtpfinancial.h @@ -66,13 +66,13 @@ * \image html financialgraphs_width.png * * - * \section JKQTPFinancialGraphSideBySide Severyl Financial Graphs side-by-side + * \section JKQTPFinancialGraphSideBySide Several Financial Graphs side-by-side * In case you want to display several of these graphs in the same plot, you can make them appear side-by-side, even * if they all cover the same x-values and would thus be draw atop each other. We apply the same principles that * were used for barcharts in JKQTPBarGraphBase and add a shift-parameter (setShift() ) that shifts each element * in the available space: * - * \image html financialgraphs_basics.png + * \image html financialgraphs_shiftwidth.png * * For example for two financial graph elements per x-value one would set: * \verbatim @@ -80,8 +80,6 @@ * shift=-0.5 / +0.5 * \endverbatim * - * \image html financialgraphs_shiftwidth.png - * * Two functions are provided (JKQTPFinancialGraph::autoscaleBoxWidthAndShift(), JKQTPFinancialGraph::autoscaleBoxWidthAndShiftSeparatedGroups() ) * that can be applied to any JKQTPFinancialGraph in the plot and will calculate all JKQTPFinancialGraphs' shift and width parameter * in such a way that the graphs appear tidied up into groups by x-value. With these functions you don't have to calculate diff --git a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp index f5a8b57cf6..c6a97b2c8c 100644 --- a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp +++ b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp @@ -466,22 +466,22 @@ void JKQTPXYLabelsGeneratorMixin::setYMaxNoExponent(double v) m_yMaxNoExponent=v; } -QString JKQTPXYLabelsGeneratorMixin::getXDateTimeFormmat() const +QString JKQTPXYLabelsGeneratorMixin::getXDateTimeFormat() const { return m_xDateTimeFormat; } -void JKQTPXYLabelsGeneratorMixin::setXDateTimeFormmat(const QString &v) +void JKQTPXYLabelsGeneratorMixin::setXDateTimeFormat(const QString &v) { m_xDateTimeFormat=v; } -QString JKQTPXYLabelsGeneratorMixin::getYDateTimeFormmat() const +QString JKQTPXYLabelsGeneratorMixin::getYDateTimeFormat() const { return m_yDateTimeFormat; } -void JKQTPXYLabelsGeneratorMixin::setYDateTimeFormmat(const QString &v) +void JKQTPXYLabelsGeneratorMixin::setYDateTimeFormat(const QString &v) { m_yDateTimeFormat=v; } diff --git a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h index c957bee852..bd9c286fa1 100644 --- a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h +++ b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h @@ -384,14 +384,14 @@ public: - /** \copydoc m_xDateTimeFormmat */ - QString getXDateTimeFormmat() const; - /** \copydoc m_xDateTimeFormmat */ - void setXDateTimeFormmat(const QString& v); - /** \copydoc m_yDateTimeFormmat */ - QString getYDateTimeFormmat() const; - /** \copydoc m_yDateTimeFormmat */ - void setYDateTimeFormmat(const QString& v); + /** \copydoc m_xDateTimeFormat */ + QString getXDateTimeFormat() const; + /** \copydoc m_xDateTimeFormat */ + void setXDateTimeFormat(const QString& v); + /** \copydoc m_yDateTimeFormat */ + QString getYDateTimeFormat() const; + /** \copydoc m_yDateTimeFormat */ + void setYDateTimeFormat(const QString& v); protected: @@ -405,7 +405,7 @@ protected: QString xValToString(double x) const; /** \brief converts \a y to a string, using several of the formatting properties set in this class for y-values */ QString yValToString(double y) const; - /** \rief converts \a x to a QString, using the provided options */ + /** \brief converts \a x to a QString, using the provided options */ static QString valToString(double x, JKQTPGraphLabelConverterType m_xDefaultConverter, int m_xDefaultPrecision, double m_xBelowIsZero, double m_xMinNoExponent, double m_xMaxNoExponent, const QString& m_xDateTimeFormat); private: /** \brief format string for the x-label, use \c %1 as placeholder for the numeric value */ diff --git a/lib/jkqtplotter/graphs/jkqtpstatisticsadaptors.h b/lib/jkqtplotter/graphs/jkqtpstatisticsadaptors.h index f856e9b8b3..78321a1f26 100644 --- a/lib/jkqtplotter/graphs/jkqtpstatisticsadaptors.h +++ b/lib/jkqtplotter/graphs/jkqtpstatisticsadaptors.h @@ -1996,7 +1996,7 @@ JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegres jkqtpstatRegression(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); \endcode - \image html datastore_regression_nonlinreg.png + \image html datastore_regression_nonlinreg_exp.png \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRegression() */ @@ -2038,7 +2038,7 @@ inline JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTBasePlotter* plotter, jkqtpstatRegression(graphD, JKQTPStatRegressionModelType::Exponential); \endcode - \image html datastore_regression_nonlinreg.png + \image html datastore_regression_nonlinreg_exp.png \note The line graph is added to the same plotter that is the parent of \a datagraph ! diff --git a/lib/jkqtplotter/graphs/jkqtpvectorfield.h b/lib/jkqtplotter/graphs/jkqtpvectorfield.h index e7d6ad834b..75b13800ef 100644 --- a/lib/jkqtplotter/graphs/jkqtpvectorfield.h +++ b/lib/jkqtplotter/graphs/jkqtpvectorfield.h @@ -317,15 +317,15 @@ public: virtual bool usesColumn(int c) const override; - /** \copydoc colorColumn */ + /** \copydoc m_colorColumn */ void setColorColumn(int __value); - /** \copydoc colorColumn */ + /** \copydoc m_colorColumn */ int getColorColumn() const; - /** \copydoc colorColumn */ + /** \copydoc m_colorColumn */ void setColorColumn (size_t __value); - /** \copydoc colorColumnContainsRGB */ + /** \copydoc m_colorColumnContainsRGB */ void setColorColumnContainsRGB(bool __value); - /** \copydoc colorColumnContainsRGB */ + /** \copydoc m_colorColumnContainsRGB */ bool getColorColumnContainsRGB() const; /** \copydoc m_vectorColorMode */ void setVectorColorMode(VectorColorMode __value); diff --git a/lib/jkqtplotter/jkqtpbaseplotter.h b/lib/jkqtplotter/jkqtpbaseplotter.h index 6fb60fd0aa..c23e07d72a 100644 --- a/lib/jkqtplotter/jkqtpbaseplotter.h +++ b/lib/jkqtplotter/jkqtpbaseplotter.h @@ -1206,7 +1206,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTBasePlotter: public QObject { /** \brief adds a secondary x-axis * - * \params axis the JKQTPHorizontalAxisBase object to add + * \param axis the JKQTPHorizontalAxisBase object to add * \returns a reference to this axis * * Usage is simple: @@ -1231,7 +1231,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTBasePlotter: public QObject { JKQTPCoordinateAxisRef addSecondaryXAxis(JKQTPHorizontalAxisBase* axis); /** \brief adds a secondary y-axis * - * \params axis the JKQTPVerticalAxisBase object to add + * \param axis the JKQTPVerticalAxisBase object to add * \returns a reference to this axis * * Usage is simple: @@ -1663,8 +1663,8 @@ public Q_SLOTS: * * \param filename name of the stored file, if no \a outputFormat is given, the file format is deduced by the file extension in \a filename * \param displayPreview if \c true a dialog is shown that allows to modify the generated output (zoo, scaling, ...) - * \param outputFormmat specify the file format for the generated file - * \param outputSizeIncrease if given, the size of the generated pixel image is increased by this number of pixels in addition to the required space + * \param outputFormat specify the file format for the generated file + * \param outputSizeIncrease if given, the size of the generated pixel image is increased by this number of pixels in addition to the required space * \return returns \c true on success * * This function may generate any pixel-graphics format, supported by Qt and listed in QImageWriter::supportedImageFormats(). @@ -1686,7 +1686,7 @@ public Q_SLOTS: /** \brief save the current plot as a SVG file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed * * \param filename the filename to save to, if empty a file save dialog is displayed - * \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. + * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \return Returns \c true if the file was save successfully * * \note Exporting to SVG requires QPrinter-support, if it is not available on your platform, this function will not be available either! @@ -1696,7 +1696,7 @@ public Q_SLOTS: /** \brief save the current plot as a PDF file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed * * \param filename the filename to save to, if empty a file save dialog is displayed - * \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. + * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \return Returns \c true if the file was save successfully * * \note Exporting to PDF requires QPrinter-support, if it is not available on your platform, this function will not be available either! @@ -1708,7 +1708,7 @@ public Q_SLOTS: * The image format is extracted from the file extension (jpeg, tiff, png, pdf, ...) * * \param filename the filename to save to, if empty a file save dialog is displayed - * \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. + * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \return Returns \c true if the file was save successfully * * This function is comparable to saveAsPixelImage(), but it allows to save into any graphics format, including SVG and PF (if printer-support is compiled into the library). diff --git a/lib/jkqtplotter/jkqtpkey.h b/lib/jkqtplotter/jkqtpkey.h index 3ff2967afb..23692314ac 100644 --- a/lib/jkqtplotter/jkqtpkey.h +++ b/lib/jkqtplotter/jkqtpkey.h @@ -217,7 +217,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPBaseKey: public QObject { inline Qt::PenStyle getFrameLineStyle() const { return keyStyle().frameLineStyle; } /** \copydoc JKQTPKeyStyle::textColor */ inline QColor getTextColor() const { return keyStyle().textColor; } - /** \copydoc JKQTPKeyStyle::backgroundColor */ + /** \copydoc JKQTPKeyStyle::backgroundBrush */ inline QColor getBackgroundColor() const { return keyStyle().backgroundBrush.color(); } /** \copydoc JKQTPKeyStyle::backgroundBrush */ inline const QBrush& getBackgroundBrush() const { return keyStyle().backgroundBrush; } @@ -266,9 +266,9 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPBaseKey: public QObject { inline void setFrameLineStyle(Qt::PenStyle __value) { keyStyle().frameLineStyle = __value; redrawPlot(); } /** \copydoc JKQTPKeyStyle::textColor */ inline void setTextColor(QColor __value) { keyStyle().textColor = __value; redrawPlot(); } - /** \copydoc JKQTPKeyStyle::backgroundColor */ + /** \copydoc JKQTPKeyStyle::backgroundBrush */ inline void setBackgroundColor(QColor __value) { keyStyle().backgroundBrush = __value; redrawPlot(); } - /** \copydoc JKQTPKeyStyle::backgroundColor */ + /** \copydoc JKQTPKeyStyle::backgroundBrush */ inline void setBackgroundColor(QColor __value, Qt::BrushStyle __style) { keyStyle().backgroundBrush = QBrush(__value, __style); redrawPlot(); } /** \copydoc JKQTPKeyStyle::backgroundBrush */ inline void setBackgroundBrush(const QBrush& __value) { keyStyle().backgroundBrush = __value; redrawPlot(); } diff --git a/lib/jkqtplotter/jkqtplotter.h b/lib/jkqtplotter/jkqtplotter.h index a432ff4503..a23eddf0e5 100644 --- a/lib/jkqtplotter/jkqtplotter.h +++ b/lib/jkqtplotter/jkqtplotter.h @@ -922,8 +922,8 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPlotter: public QWidget { /** \copydoc JKQTBasePlotter::zoom() * \deprecated The function JKQTPlotter::zoom() is deprecated and will be removed in future version, use JKQTPlotter::setXY() instead! */ - inline void zoom(double nxmin, double nxmax, double nymin, double nymax, bool affectsSecondaryAxes=false) { - plotter->zoom(nxmin, nxmax, nymin, nymax, affectsSecondaryAxes); + inline void zoom(double xminn, double xmaxn, double yminn, double ymaxn, bool affectsSecondaryAxes=false) { + plotter->zoom(xminn, xmaxn, yminn, ymaxn, affectsSecondaryAxes); } /** \copydoc JKQTBasePlotter::setGrid() */ diff --git a/screenshots/screen_parmetrizedplots_datatable.png b/screenshots/screen_parmetrizedplots_datatable.png new file mode 100644 index 0000000000000000000000000000000000000000..85c6669fbc2cef4419781c73b0bcb54c9881366e GIT binary patch literal 67756 zcmZ6yWmp_d*EKo}?!g@b1cJLuf)gOY-6gnNaJS$I4ncyuyE}usyA#~qPIJG{_vdiI zMR!B@RM+0MWvx}A^0JbsNQ6ir5C~Q3iITO8YC2{r5V zB=>OBR!z5;v5l#OiGt~U77dsJ$sb`-43Xrk2r?BSZO@0mtH7)KXM0Ds*nw0o_JOZ4 zdyYDe#%!0Vj_HmjyQz$-9l!-Zv73&HSy`1FRk=fK z7i$W4?<kAV(}irw=mWxxqxsDJ2AboAAT}59@B{ z2T1_Sj~BcHjB3YWfv2($cE9?k@C{GDbjuopLldIeR_C-oNr)VkU1z|d*dTQn6%nCK zT<)Y@W2Iz+Hj1n600A6>gN_uJ6|kk?@0b`xEcjaY>w}cJ&kz47K|<>4NqN`*NNgh` ziMYY~#Ib=K_5J-{bPmHJBYTU>+rog$Su%-CDRq@j`-&g|YFb*_szaNlI!0Z$9h`5M zYWz$IkH+`ylb*E{w*)d@%9Bs)Yjhgj2L2m&zg=Aq7D5VPgY|C~m+K@fEG(r>=+47o_d&^yW=>(&ly5E3t4qerkf+x%zU?s%G35*O4zweO| z5EQyHC9n8zQN8^`NcBfxW;g?v3ic^K8TkqQ4X)4!-2QDz@!*H3SLk{i zbEfh-!lm)M{OCC#3|wB;uCbUwvayNOGTPnS>mD0JKRG!WO%Kz-#>W0@Jd|*Db>(!U ze3VsD@osf>_3Yxp;q9!T03kg+{p{xE$J<#$13qw**+f=Qb-p29z0C?31T3G)0rtx1 z$w@_JHMMRC1hSx18D3SzrmU*kH8(f+b_P5vE87?lR*w0-ntC-Aa?QBQOZVff%YJ zK4-dz>%+aH!uj4R;~^H$J3AC2uHm=OivIL~@ceMyeRsZ<2HdUQ?kxyBh{gFp*;KBV ziOY5sMNV!^!a1t8Z#0encVc1)gw*4|8w23cH!pUETwm_@-fraae&Wf>&L*1i?&<9{ zI9+WWO%J9frlIMYekR>E@Bj0z7r4>WOY4Tmtg+t@9)p@z5m_S@zQ_qjLWF` zSFKz(@__$)Bq|ZtU!T{PNbk>WcbmvgNAr~vrx4&3r$5{ny}mpHb8T_;h(Sgc4LAeG z!*he@Jsa>v`0S01i%Y@ETB&d>>FmrYn=Y__WNwzV0N40HOtSL}vG}$@3 zy|ukMK?l7Jej-y8-c+vJ1`GzT@9pg!na_^^evs00JGi#iKGB>8rN7w|N<&ZYc*Akj z2Y3M#6cq4kD}f;)**eWXM$;u?a~F_G^12EXvQq_N{RlQTHb&F^J0d=LJ@9xSf!UjW z93LFfA`By-qKccD6;$U>d^fKH4^2&B&CJXIPg>^!q9+ax&VPr%rOit_@}i<5c@>qN zBXbT*I(qu^fsYyMfcZGfMqi)TUY&1hQaIw{jQS8PATnJtTv6V&VSEh z1X%OG0l2Jr0Wqf5zqB*wzqpd(WxQ>!SqO<)S)|=N-$ZyLIT6>sc+ptG{t* zy`>LeL6E+g-*#2NR4#h~7(`HDAPg`)CWI~+H2e*&=M;lOLurDjoz|F`nDWZX+ehXI zHnAxwVX3LargEZoeF{e|@HTd0f+*s4}KsZgGQ_6JSL+ZRPGic%;cL0ui zU@80Gifs@mZzqkcUu*NPscCC)$i;GS=sNF&*Kqxpc}h~{9nk3;7l$2Ef(&{~bQR7T z-TExkhYv(VO^oW_atHQ%!|^77%s{Q6l}G#Q*Dv4k@o{Pek3!mCDJe*LdU`Ohu)s`3QZH}hr<`ClItm(R`#5T>?yJtEofd__X?omO7o6kp$#x@zzy@vf{C zvSP6N_wMX^t|NuBW9R zChkm*)U{pD#dDZ-BVwaJM_s$Dnmc;|Nt{zRE1BJNwuKZAF9bL+T&OZuZ*jGc#4`ud zH%R_cn~<{9veO@y1s{dSZe1wSc;Ko0p3Pyabj12#y0CVafQU%TvSir6Y$NMOoT0r2qGl+BE()g*}n`FKQ@m}sT z>ax%0@%GPjC(Y=_Tac~U2m%_fC;PZhuL4D6-uN@OYv@}~_t>g>Ua;B?AZ29`6qHcC zjZh+!kUG9zvpWut>$|&ulYS`ks{ZW(V*YIfhjB?OUApPDj9DHsY;s^;!zPG@tl`vEg$(^xOVbE=n-u`&f>>Nf<-+J4;_B?u^ z9XH?V;likMp8xq75f&DJPzMS{rF8%V{j_dAJ}Z7{%+5S5ih+Z{~{pPZab8NCJ~ zy=bv&DF{SGMa4-nt+R1|f4MhNtj6r>=GNHbnbLDPDE*!u`E%PjT+3L7WVBZOc++3d zDk&)o3Nga1YN>CB&|hcEzagM*uZF>PJatCg+W`aBZVSuKD;>P=TLx;}!i@$uv=3MlJv zzH6YkO!g{!Zl-mcR7v!tDxs<8XV&d0Ir|WeOB-N;14SQD3iTdX0@0I|m36+}Rxk1w z8)2k#pL!d0sigbLA{(eAD)CRqvbx}@xj}a@>fKrG97~ZTdP8$_w&+^h86vu*lM~0M z$0PQULwn3i;u!INCnr%+B>aYF>z!3bIm|`H0;g;3?NfW>1sQlaoqG^6KQeESq2YRL zJgl-R_~fLaz68Z=2I=3*AOC?CBwJu1uY+`c7#MW?o9H+WcO_wCqbZ1qNrGQ#<$s3( zWj0bE{S}6d{l0%Bx8QIVm4+5dK+xdq9O~g3IxK7*D9bC1k>yo_5_EN)41OFVWuy!G zu^RdQM7T?;)vLq@?TiK z!0mO|a>g%Bt4NLQ<1Jw-3t7J3Es4B9uvh23|F~p%TNlBxCKuE#N zjPB>>SG5KF;T;eIfFgI=eq(`c)zfCzh*_^KqQAdi(-beURz7s?gu-S$w^-le&6FIKbb_|(KK3j_glEI zaPu^axu~uIHg&;Iq(7tJ;83&Z%bhLnk9#1O3K|2>g^`IY^?n7-$|K;!vuDr*6hX+qL>*>yzGo{ul0oC(Cf3{zr(>X=6vr3v;z2? z7T7nZYvnxU;^DX(JBfOI5Hg>VLZqfe*ULu1>uDt(`%RcUxeVYH3;1-%;#R9+-qh2PU+e3L>)yc9d*_PO>S5xt?mj9PXC0? zF-TD35~r%B>#SFtb8_syenDUqX4D$AWu}7V@k}}l{Ry&ZPQe)%o7=Nc?l#M*prZjv z%QV{J;CQy?1fK3}pSAv`^phlo+8wR6)?$k2r*L8v!_B-5jf^baq2Mq*T@}-AOARm6 zfwp^nZq;W2!RvYxxRH7PF8f^G!F7WL*IrC6qUh>!*ZBFe1s0+fM)nt9Jx!Rj-cWspQ9n1W(` zH4haMmjHgeoeJVML0Pd$_-?Ai(AWrdyNdi}NVD7X$m`ZTJfDtsgU#5OxP03}IqR?Q z=20K&iJUMLqkS5mg0`C*RC;=ix0~Ap=I$QkR#D0C^`7iKU0CPs@87AA*4u-OkZ^LO z$R=E10G8}-4*1k^WzUO&J42QGSLWNq{K2X-Gj{OuQ13g(&~HmMRmwLl&Nq8qACK#y zK(;OC!9@_MQ&&GOpish0!oU)(Un|pLFke4K|86`{%VmihFhC`nwt2^Dq|VeyC>gC- zATB0f(66BV^>^H#;!mnwW;x zR+|0t)3a#Oc(IZ`rTKpY+713)aY>`st{|S*>$$V*>mV097HS{}H_4`HmM`g4eMd}S z&``A9f?YJL1IsiZKzUvup55;`RXZOcTphsn^iFW%6KJU6TP?v|9U%(bratl2+vX!H zl#(CRS}xB5pRbf>_UCkes>GSo1jW*5pPX}MTl(rc7g=GXDi23au8DK0Zs#1T!N+nI z^!nKDX}$ZEbSjGEcug1jy>?((kR1k>E_Io@UnsrmUk+|O#+sfOq!g49ReerNyp2S? zs!`<-G?ZDJ2{4a0F^@-ry*LTqG^w5@lGVHr`3F;DI>sIMk8*iCGNDTO|Dyh|iY|F> zZTabWL&2edbUhW8*f7n_YhqwwCxTq(bRPUyc4(OLW{L`ao(zT|HKC%y!R>jtPh#@8 zvaBQ#ae=hz!J@$++xAl8@LezhUZy3vc3>nKd07hC+kp6iV6ro$(Ne9$kNXrC*jJ{5 zB9g&5^x)9!Qf<+cO4Hz-wnIqjgmm%36#p);xMz#^=2SsPdO`9h}Y zomv@8pt#6;v#0N-?A1-Ca_4_=r^l^eRjchV(m%^3uG}0u{jN0^HJ}WQJh0GI?TauV zj-jfoj8IZ^KJzwExFWc%~7+qS%h4_0({4=NhAuglp!oo5$iTLrsuek4F zGZrf;HodGyH17nhp7ycvrl>r2kV-YI7su21Jh;O1n-IFh|7imAf_ynCV|6-HOOF*0 zj0&yYj*#~k3hSa72Rtb_A%vRLPN2Y4GgeV zG^HiXI_DCj(MWvHw;Ibs(3L#h-70tIQh9y9wpRs(4djb)}Nb9=X_j z3NCNmO>G=lr&0LO6VK(u?O{Ww-QtR|v$F&AVMhIfhN>&s(UY$}YhE4Y?UP_*a~Hz5rpI?Q&dn@n-AHpwCh8siN*2WR(5sIgY?xG}uf} zmV!6=<6sTPdL_iyeygNe#yaz_uWHY{df2SjBmQZf7yqeEy^XQ)(@OKgCz?;`swJ{% zcP_IGO}dT_#O!1wIeB>$5X2=M^^cU4&;V+501b-@iT*qYNv$*QzEhAXD*CRL7#|-5 z01}=0Ec$uLd+(W;&;T&52WXcnT+a;ws1Eo(YOyAdO_wpsac2BKxDFnTxL}{#>}AfA zpz$0NXlRPve0GPEIURqIhT}0yczb)7-dmbaOii2D;g(QuQD`?|-<^r}(Mg#cFlx;k zjg_oXfcmJ!C5IB_`-hBBiy@@3Yr1Z{y`9L+1!LCT!A-O5ynq3FttUTNZ$W7uG3iWl z;mK50xiSa{)ZlTeWaso?SF6Z(#1>93^YJ7JpDAuA+S;};!*(Yova5d*OsjNsbJO14 zmNJq1^vrQ~+rIQ!GV*^xf$8T&|5`QY@`?rz!TRY_xeqLt_2w(P3F!4fEzS7z|BCa3 z5fx8Q&kFZz3!vicGUIr|LHY*=i|)xl{s94&eJvM*^y-y{umA=a5>K!8hGnSco3(xQ z_HNs}Q^=Mer>4&9b1+`*x$p3U#%Iw7eR{bwLLp#-k;twbeM+H!3rZF_7Kf+pa*4CC zaw)5i50;t+3;_m_68e`WJ8bYoTm{X$HDP(DZP`IGGE#w9A6+pC*(JP6dgMNzpQiFI zCPKLq-yCIv2-*8ynv@$G^By#Vf+CiHZsptt*Tt`imN8d+VhRiBYx*ijl7#01D5bvv z9r{w}&%ZcBguJ|-Wa}denuKG2NJ$0OMpAkm8wkqV9_V69uNDp$sy{BS+KA#35dmxE zW@AQ8uaq-SGz1OkM%IskBz%FTTJ?re3%s|$Jp7w3#99PE z8&g?-6NU;xV_XAW(z8Ay6rpxIsD{UrMS>qhT;qgBrLMb)dXqskki2hBBebFZB>eyQ zl$#qQC8tJmsaTX8qz($LTAb;}^U)dk-TO!Lt{Ex1l;2I`4i2i1yj&Qs<^~68;MLwt zX2F*JdVW;Gr>1sjHZX`-a6hVaKMbI$0%FQ<@qhjTuL9x#W-34?wcH@=^17FCNo@b% zbj%XE(M>>YcSR$JULP73*7ciG5*vE4ySv*SfK0b{cF5()p=jvnknHX4|4rtGQ>&#d z-mSKJWV@WMawgFF+Vt1daC~hbk;TNp2?F4fOf{e9Vp`FiIX&}6 zRy?(4m&+{6Z`x9)1IA}0d_CY)>DnyW^zEQlOSK)hK1j8)zwvrL=f$NTrQ}s;@oD=W zqI7vflT#?GyqutMMgyOFT*3!EJ7zpU5L0<4v zjgF?|W!gV~94{i;?}S+`^%0c;&Bkcz2I}%mF+&6jOWj2j{{honJ@aE@%K7de+s&>Z zWS}8ef4?O)-(XKE5lI*{l`lsxYdMi6es{MOZQ1Lvz^)tC?!FO(S78J}19boeFN^(V zPYO>7_nIeG`^$r6X+z0wROdg?$Nk6Cc64TD<^|@U4m8!W??)qPE|Y23Q*zD$9dc=g zPow?6ofAJhhjHcxqt~~+)Nn*8Jdp41P3_#?Z4ElM+6RbywS-$8jPE%0u?M6kv*G*tyi9E;ym1^< zTwJ(5k4tM6Ksal%1(K`5Oes+__m}PMv()PztXhce>ae2)^mjxu9y`!bA~S?5lH1T7 zGWU^)%c`RusBg=oi3{D1&o;W%>upG8%XAKVlFbd%yR`$2jg0|k@J~!s%dS9aYzeO@ zi8#p!LrTd~QgS1&#a5G&5;CEtuhxo*6~(HJv1H-XL&wYpK& z{`zvP=I=g^8ox``?)1NjhlJP$r_jf>X6~)2qsU^m{Fc-VOWCNx$>#iz?6j>dcV;tT z6w;X5Gcz?D?(UNm3r(D-!L2R6KxNxx44`u-SoL-oO}Ic_-~3YMDdX?&`m$OTBr-G< z&YgL?qW1qQVc`;(^-jjmNB>q;Vdm!MHaH)uW+SG%{Oka_Uf0vs+p}Igz4dbl8HDWR z3|_LNPS<{)p=&DNT*3X$pe}S^D4S@Et+~A7S68<{{|Ygufzu9B^|FY_Hst$v7Jk`M zC%*(|sizC%QX$Pga0GX8Nr{(ffrK-sj+@KcNV9b7_Rho+8S!w5Of9aECM^vMY_F;5 zl-K(42rn9eNN0{R)v8&}9T%Q4FE6&gfx%OW$rxOooGA$-5rzg(Y4%fC^|ZY3^-e>` z*pv5q@eVa>h=*gSWGcQ7#JCfkq5#|vP!IT!h>MH=v;8*Q^d1dE9q8=CaTzh0L_7+M zvWAZKGA!|ipDtwDYzBY?IG5Dqot7m=YjSXAaQ%M2JEXQTEi2m(o=ll6F~Y%KaJ%YZ3Dl=hK!l=W z>hgIdQm>0hh>#>@ZDrb%=J!aL#o-;2cH$`IcIfG4HPfV}WMTb%sMhQe6`pN2PGORj zoot^UG$`Gtqk)wu?fJsX=v()*80%xwOhNv9Au%5FWRWZ3KO=VsTr`qC1 z_XR9hxvsH-Om!2DYN8qz)5OGZoDwCUrdH)xAWRr(DPHLD(hT$=6s0lZc12takh#a_SoReA1ytX9L&Iw@{L5hG}Bu!&~_r zgKa+Nf-dh|HAPD}{b$+n9BZ10phz=h)2?u)1%5gH+SV%NP(*IU8+H8$&wJjEzUrVui-%%~uH3Yx*BN$UKEy{-y!tPfkwG zd@CuUY4Ew(3f>TxU}Un1Wv4??xZMb0A0&cwMAzNi+;bwF&Oy{J8qKD+93)y)&g+H9U;!`ps|lDRptb`CgJr*{fne-cGjWE#tD^=7n7| zGb8kP!%)ZP@S**)Qr@`555Na#ZVn;%tpFT2-S!xD?x`5Cn4gjNGlMM%yarY%nVl%;MIXf-D4J5HTD}n?@t>ABe zxHK3!2=VaX0fY}YnORuNn5_Wn3AIm0aX0a!+(9D7Y|i;r>_S>?*!LRker54{d(uPZ?#XU#73a}O~_&+hBV zrdP}#&w+qmw?AN~Ov%3#he`trK_@#&`r2_|(YL2#&%ZDF|Fi(D(wQ@bSfycD)S%N= z)7FF(q4)A8vkXev4;s}6NQFmM?ldQDf4VGtk&27W8Aj4wPL@MUN*F*LLgDz;QnA$J z0AB~7l&;&qB@g1f5zx>iOiZXnL`Bd0h;0ArwR^J=M!vCF4_EtBW(Qj4Z;TS0GX^dW zYr1(KiY6%t&PZ#v797W@jEHz~Y?E_4vb3j8$*LfTMn@ZZ{zcjh!x6Kxa`twH(7jX* z9-Ylqi&?Aw;_~cjx}8C2NNp@V$`LwMK*~}*92Z+9mYTMnsS1{x+q-Pi^iNFJ=~r{w zSnQL=kV-RP9jl1~ewVuaJ>7%x59eCTKn@WtJukVi>UYirld;=nM|6N}fF~o%;2SV3 zwbjee9MaCevZ|&9;DqauC0q8NUN4@p4PlYFGJ|YWjNFMqf;())GYm2or-=!Z;spu6 zx4+Pdlb(2Qr?O17-FvZ5hFG9~w`6iJGi1}SZ#YS4QgH?k|kRBqRFI$RoB-8h-9Pd?@It~wrL4wM?l@7Kdf@l2J4C}u;_;|`* zD28gRRo~RmBz5+H+)Fh7L(GuRs9TO)(kk}FdzpygK$WVyN1&n2GZJuU^psG|LJ9QpQt|()(|b^E!b=O6s7Cf>uf^IiN@EW=fHgR!Yza<1cM%mcPBQ<`+3r zmbP>*p8fq{u2ey-M>fpHMh20GtEq=XPDqPH0%c%|Zc&jd)Gzvpi6+icjs1NVpe00s zhGP+xp6+#^1B~zgfocX<4O8)0NKS4&+NXrRs!Z4TnE@Hu9pGmUYf4z7rDD>@np;2Z z`&b$^0n&!4lDDpobCx{UxFj-Bz0tv#v9sP}gfOD^U!Osv&5$eI&^`35))fy0+F_c{ z3zjz=^fE`BCrxpYNOPG^P=~{ZYeh2-*56Et1nlbGnI$DZG8-=(^7^&t2MekHPWLEC zhc$`Q@@wgIU}F~~nvPrS436yJGZMImhB|4Oi_3|-`a)jr?3a3Gt`CQgrYDiUgtmIz zrzLTH<4qVPwOQR3Jy23t=~d?~)Nm?R9hQZ$NOVL%SWg8*)4uRI`5MeJXui*vg-!QB zGlLP7_(KPPqR5*kHmz}J9hSaM>^K+-{BXr8^y}T|ht3w)3r7n8HUKc^O)CMYQqecZ ztN^cNRw&|%C}de$y5uxz1)I>lP#I9zB=>2+KX$Hsj*;l^_M{@Fx&&pw$9M+e2@bBCfL>Eiya+15w&FFr$%sQd}wKvi>SExU8wA^Q{wr+lG}3-JCoHN=rydpN_h^ zXc)4y34XR41Z?dwzvGaYwn3med|+;88Gk-$cB51p+e9i@GZ~Adni_k)5siF65wiv8 z^h~C%(>9~wuxTE**Ow;4FLagf@qVQx(VUWgl~uKEl-DlNz82tCTd{~q%pX~FdTw%O z!0YguG&H88%lb8OFclqTQZ8KjWdIuMqlKP?VK*E#&AhY&8xhmzYh`OcBlMXWYT@{# zFB8;=JnC7xHdv;+OrVZ;m0S zDV8+rywW7@l9Yh#pDuJ~Ip^9nIb|ttd)Cr(b6lchV%hwM-Slo@k*JO6-(kz z45#k#TbtrxRhsyL3u@e))UoD|&%4!f87*(0HCa5YD6%{R1!mWqrk0?AhVAn50%6QnHo)f4D-~$ZD%jwrm2`>greN{t?)h2eli0k3EuWbz#4607iDXKamZ; z>htQgy}iu?NQSfpf1pTxlry}Dm7|N25wHiVMG<#m$J*K4)a1uaT);Z+eTV@KLhI8G=PMG==c zOwFFyY%%-}L?*6w$Ym#5FS(EIxZFWqG80H0G~mudNA((8D> z+&T7mdwP1sYvx8Oua01(sQ9gvuJN2yL&L852dWVyN=4gL-i48ib7lzMx8J5;}l(>FnLD5f84fJOcA(O z2qlMe$+Y=DtVSwpuhE3+4b2O!y)dZg=ofsOZ1wanzC*%`i|D-NZjTJcI#-&_BN>_Z zZr#S;!_~^Ah$XH;qmQ@pdGd%G*|9*c8X5khe!WuSYLS(J1`^BCd}T+OPKV=IV~=eM zt)QHooTQ0K-q3J<2P;w2zgn_;CgAw`t5p3{Enj~W;j+goCEEQuQE z_g&iPX8D>HCW?bIZ^~hK8bW3Wh`|7LSVK`qjCPBLVr!=Ux=HLII zCx&12O|wb&$K0C2CL^1#dY+xg(Qcj!3K)PiW;S5Sb`{3^={Hp8Y=8gX9nrF%#ws|~ z*x6azd#)$MTb*%+kvAvCE4aCu8lRtp65|vRgQxP{gcGV~rAjoiOBL@IYdf-|i;$a_ zwRKx+6TaT<;2{YJ+AFX5$l2%S#J+Zb!>cN6fM_mENMM^VMdO+(zmZ(shp z##NzvT>UEFEsM{hQ2JqDLLIFYP5R`WlY7o?H-V4i_m>u{*%EK`cqRP)v^AgSx6Wb^&b%#PS_{lt~XDnK^TsYv) z?IYC$1+|wd2|xJra}L7+ET9#p;3u+?pj`Iyax42~w8VuiDUo&6d^&D&ZLyLLTgoKj z0-{rs_)}TvE35QQtwsxA~;1Ej^3k5j-s@@D-2r`vKU}B#9>Qe z90Xs&!s8j0Qd5VCxn=lpbAx98Lpvpk`0 zuD*Nz#*Fc;lGML{bR>&AJI{m_Lu6*QF6+B;+F|v*i4e>FjT%b2fW^2sRt$;L za5%(;Udr%NU30+vC^so+VcC}zIPryE-H?LOPS9hq{*&ZX`)9IzS%s_C`@CZ+78rk% zpFUp@9+sID6DJj z_42QKwK;IG$0xrZN97iLS-{EL1y55%P50rWL`*4G!PVN7GHusHm@g;_)=Be`#uUq= zl@f$%YTbdJ1Z-9&b=h-s0)-DWAKy#QD~*z~{$3*HovhoT0)!5AHo3k&2Zg~HYAPyE zf;su@l&nl>JRY;y|8$kVuOPY4>0oDT)%^>P!~*>dmmj3S<{_gEui)Lt`|$~0{`fc& zti|{M>@u(>2-GdmqgSe~)t_;|uvr^53N$I}lc8(S})Q4}kWv$OmX=Z*Kav$3ghr-8k*q$Pop*EYAO0@rkyThA%# zjJSVeH!&kZxAS!73~0Ena$~QCJuXD8_2SoAs6!I4%*kW>#LW78?XrTU>FNsGyf(*J zCYG~S=_6NRn_KJ>kDV_!iJ%Ag^#RXlebs%4^>I?{4Kx=QHNj{?+NrxbcE*I0UpB+w zVNw`qEu7$HL_Im2`_nU1s1#9H*>abgOIz@gG8f|!RKr!REud~(BfJc zsZhiZ9@ojMOOGNU2+0n_P0UHCdIu6unk945O}{Dm)LQBSS}IkOjHrF^5JWk{DWAZme|^LT%fDF}an8 z>9$q}-==zQW?AWEH^q#GHSbumsXWx)uo#|6imnebNtmTtN=G!AGybqNT3sJ(RLc=uK#F zeX{Qxe!hxz`1mFt9{1a(Q1(DTPN3v<{e=sl3l6_?^lo6 zMndkgx*@53kz(qKX_&YK{Ni9tIZcSuX&J-a@(L|SoGi=nV&PoZ#dU5_MUk{ys;Z2d zM)J*FUJ1iVfF`t+qm?~vUj7s+-Q1B@B$>DVZW`%^S>&`b68-1T0M4n+?qNI6f>b*4 zhX7PgJ^lydZEXX6!eO?g{tVs-Wxt?cT9Bw@#QN*=Q7% z9e&-f(lR>`I2d`9?QQjP2<#cf(QckLcabQ3-zp8xJqj{(+oSBl!DKf4kXnD*_m&p3 z$Odm6-eNgA)XeQ4Q;LG5-N(|7=xp`rrEtJ=CV#4u&s=#Ji?Y)ikH@mJv|kk zL4u54(*=8WuII*vOXkQoZX|j=+@0`Bqa+BiEHovr}(%tTM0Na{vSz$Jb^(_(SmSK8|VyKO?H`Eduu=6 zy-{V9RS4`@m}i$w&LCfad+HzS7n(oY0Qs&O_02O@EKdtSf5V5yZz_snQ)$7pB_3jWLCx6ZwtvEY>w5tR~iIvo}Apz@o^hPT^|xTp(8Galp4 zRfG+IgIcPiReL#EQqw4q!W%7NxaZS1Fc^NPWN|oNmgX*z6&=mxXUt(?n;-k9xcz0=)#nV2kQ-dem6qg;T1DIvT?YqOhL{+$QY2)fuh|KTcyQ3L`KdT|Pp(Kq zJz_}RQ6!Boj9PbEx{Z_ej}!fG!~n7+HsLX^!w2`(vhusbD3YI_oe-iKbPj&*ceduh zkdFwM$jMdjJ!I|o=>r@x{~A2$`s?1P#woX&at^~^n-xV|`IsPSL`HkLm8OZv>}f0B z4}s^>(uWR?MhrveTNg%PusURanfIPmG=!~M2C??};x_+!fA`xxt4?!K;$O2B%~nYY z{i4=f*lY#8$FxaBuZ4i~^9aXDy1U_p=DD`bKe@Tslvva}vf4O!&>lA+NK~coQGr3^A=QOaHxu7)Wqz;2^dtts7A|? zF*A}w?$do&C#6iD(_-p}vk_|wm=cQGDU0^AN;ez3-;RwDV`8o#!a9vz7eoNAn5iOX zS%@ejEwgX&_({q>=^{7ysmPhS}v>PFGQWDwY9_iLYNnt-{_YoA2en{1R& z6xSek)-II#r(32%ZO9O}2Nz-Fe47_PupuW9P!@M$6xT#gWLt8_efuImim8mGJxft> zaXGW1t%>Bi>XzR$Q=mexYc-moMhYlDl`eM9u5yBa-3@OuKiTx*qZJr@CtnrFOINKR zlOa|bBm?CIb-uqpX!Bhr$M>{MrHlck{|zvkMHKU+ha3t``jf zGq-;&HVZ*>BI2S16t0%!RR~1s4GlcNP9B8U=Tjerl3h-JS~wY*YSTofDL~IVUTdj_ zLiTC7QLpK6j#lxcrMgaqj#Xh5te|L^0gF6N{m%VL-ZtiFOSD-2Ys5vvPXyz0n2Mi9 z7DZKOM6CWeNAdpTGj+KpJ4lF`GE)2a7QEh?MGy}+bG&cvFsh<3Jn$m(VZnK+j0u(E(9yeAf_$(a?#nX@~W0V+1ngXJhQm0Nw7qzHZ`?!vS z`QMcSK(N}XX*j7-&!{Pru^uLI8AnZuHG0&3xP|wAR(W~8Ii@v?lO-nM1Jx^~7$YLc zm$$->cVQEktPD=Q0~goC`7Miv9B9dIt_$~REfAr2oe&4DKHbk6;gX2kv$g{Yh~?e$ zts{lIZuE}ZwW%17ix1IK4s1T$io$wiWC<$!lR=Qf{@)LO^27hrj#g_29=AWDVSJS3 zxci~wC!5A+aC5YP|Jhrhg)>l|gVt|Hd3QLIzZ;-5MlvH%nk=@N@^W(r;wjMO`Wl3e9u@8Y>S0)2L%s zeFtSVb|&jFQWI|PYn*zQ4RHPbu7o|0K4|DC47_7<1j-3ukq$uZTJ+o*z`%})-~Scp zEp09cg5UBa&yct)I|UdozN#ITv%$Z^V%eBbTE=gqTjSTb-BP&4eJ(STYMt`k{Y2FV zmy3hNc$eud2>lopLqw&nw1!q1U*)ifbeO~LOqvVWa`x;*dtU_Dn1y1dT4c}R##UiN zQa!nS;I`sIrX$k+n09^J{9~t=l~Qz7gd&usF)JmeA&&kZA+CgsM7#IJBXBJjD+0SX zS5-_oY);V;3m0!_?n||V1s$V<`?6DGqd?t%_%($fNrQXskKs&4tCc}Qi>Ml*wI*Y_ z=3faCon*Lu?R9-W;}aZwj0}C#_#4YUdEv)8zX+Udghc&m7g{%rgNNPV)>?Gt6kX12 z9WRi9=<^0mD(aTxf6Y|q^_W#ITp{+*TER!b#-A&r9n1IeX=0lm->id95_Ep3xkwsK z~9?v)4!rb(L>S7FsK_^Hh> zR1{_OVEC)rHHB*Zl-RhQKsdpkzQq&5r*p~2u%8Ku(8a2(H$w`WMHTPnTmP&z5^}_2=4qZP^ zLm0BQwifxkJk9#Dd96^A@gD}ZYw4ZK79u6zh~T^-5c=rDnQ*)xx${)Mc;!`WJDQ5C zs~yj`)&KH|j~6E%ew_V%!spE7@@{b;SLU=|C?`9+9J@HRjC3CAmnVfb8{?VALP3`o zIv64S`lX^&Z6g#*z{GtyaW^ipdi{ufY+hBdE2fBUeVp8T%>4!?-3zy2j}$U9P}MUM z*&a))gwHPL)L~df_&ldqV%+QZ=o6BupJgwGRBd^>gGrT2b66Luvtkw{;9ajy%PggJoGqKSX z=ZGb@YkNVn%hG>8R4gyY9cshE(ZS0?W25@{9VGnj5JE~u#*2g8-<=s&SSDWZ_?7|M z!5Q)O5CBl&Mnb{b$o7tgnS{l$>AmhSbG~LQHP@ej z*Sta!W@gTa_^{R6TGCBdBkTgEvX_a}etDQs%k5t7&Um+0$Tv>bDL&`i91}2TspffB z67c*o22W3}Ln5GN%hk|k;anA3-D3CmEtn!D$#(cMe01HGtH)9-$Ojs00ruVoVg%VP zHXKV4KR4yjba6o?8T`S7$E=BdkimxoY@=-wg@(3lpUXqN737+A_sRuYev@tRfycEW zbqc0t%2!KTZ6tYy!kM+0{s9G>9_z>+F(n98DK@q|2My<<>gHaCxj_}T`pq!G3w4Ia z=*yy(LtFw|*;tE|lRc|mBB6|yhpWeBv#xso)*~QQsndvjHvu@X{DJtq>5=+X|xn+X5-%!_PQ=|5kWI|ulM zhsEg#Mma#;?28uvOquCk`r|0zq3TB5k-){vd%(nKYnwMp-zzV*MM0@CqE$#b{foTi zz4vSDQ3A*#J|LhhFp82*NoKaCd zu%TUETwROBRpjS%H#$bd6LRzeun&MZQ#^K`KB z)zzT+4O3S*o`z+i%jsgdWoV_M#Vm?hbme3UlpLNml%E_1JdxJ_V)Q(amZ7%ZuQx-DkP9qQ~?>_yae;>y%6E>{)72&Vt*iYyzlNp7-`{nyBVAAlZ@XpYYW&LN^h*_yQN7+1j#f)~IS?ef|BBNSwz zLqg=S+E&|WIL2>p3*8jUo=;D#E!Zo9)*^b+IBsD52L_gPD!lJ(!Z0+c7+_V)vy*Gu zr)m=FOdnRmqD`&VmEt$`0iKyWSYI(3ErI&ilk&C zOy5ACJy*ec7@Dzh#F=LEuXQRwV!J{9$ZKK3iJa`g3*<8dj;E zvY`jkZQyx?;m8rFpE)WVhr`Mv%B1|!5VmM;F~^pLpfiGjIr3ioh?tG@u!o;$_KRlc zVZ%S7K)q%9@pief;P~QPztw@Z!n(twhWI%Q(|LQA+j$GdsV}V6hNr}<_vZ)aCVl`9Yp@zJEF?o7=@Is90U{KitQ(^XV^ha=y2LM@Ta6GKR}&{y zSSXVQ&Bh342c{EyGC%kN#c#HbN6xlpOP)K%GRnq0PK@49S$SvFOumt{l%F5mk&b49 zb>IbivYV#O>Y}=rYW%UyE!{k(=W+w)v-cJ$)zy@xb%07{ow!9# z8G;oB#N?d|t!(SdO;wegUpRlw4|zWwjhpXCC@JYloi_U?{MqGyQ^<=qY=DBI44Xy6 zuK(Dprea=J0mHZ_d)WUQuTeP^7U!S$f_5V|>C3GqJX%GiBA3rYplY7|b~C@H)(?#s zDZfuhyE1{%C=~+F9w!H^{hS<&`80vG~!afJo%&BxygxA{$lY z9$6%|ak^HX;&5=-=(g6ax3}1M0W!7o(=KDF4S$p)lk2fmvbVK%cc(rL_-aBv%E|IR z%T-?ihVl7fG7*tM&F7`2B1-wNzUj+Vvt?Dyl8=0l7lDC~Wkt(q7`h7G(v$i<*L3f! zy=SXy`#nvoXsf)nGu`1`m0{@=2in$i8^bO)C{6oZK6!nBIz8ob$o{6;|%XH$bE)nY!F zVdQSKLN$&;>Bq^s?h_cm-n@01Ds3i&TWV1^xUpUPTBo}?LY4`#~g8n!GZwGnp7s&!y z6+d)5LOGBCPPaQWEDM+60=%d=J;kY78N6 zsFGp-K~*$GH4*k_a4Y;G@A>Z!0A&%7(+HWFQAQxy6Aw=m;fvGD3WxuOGV73(Rdub2 z!0o|_>Gq#96n=iDOznJ0RK;i0X!-~!#Bxm*8E=%ICgnA}=(V?)J3MLB&TOXqu#?gW z`W;^GN$#4&qg!7#czNAws2GZVheYr96>4&XMO8CaGLQyPoi*9mue3PULr56@`QtVk zguFWh$RTiwtsd4kdz=iTh~$!XCv!&oSDK;+$cX*2jFafwKUeC?jrb`e&h+@xXN;vC zr!EB}8F~o|39T9~m11hA?oZTVMw3}Dr-rEw8|MWDQkfcp?(fZ-^bW^3r9snK_FxSV zb}1c2Kv`h1C+O_FU1 ziHQb>(*;qP;m$TI^87y^?=sFy<(`DPFyw! z2RC=RUr|DJJ%-tQFX6tsnqbixXlF36V-!tlSkeaF^v*I1z#=Ql=FKnp3@oT==9z!* z`aL{6t=5Z?tvA^g(aX@axNu8O5geJ6*Y(SR$j< zicjeGX+GOXPYZNr8tvy$6BVv&L-?7&L?3lLW!iQ%ChZPFyO|Ljx&YQJVDbS0@P%Oz zur@AFEPDXqn}yEEw8LtU?9T+ia{%}#2_RLY@LkJ~9R~&m-Y;~$2BMOP=}l$};xHLN zi$&o46gKhOdw#fT&lz?Nn1>HYfM5$HA)NnyU@^(|JaC1;_CU+kKyIp#N z$#}Cp;>PPCMI!Mpnmj#OH%?J`0PB^>@|E5Esx~q-5bOsKcRyAI2Tq~YTH{xnAguzy z?hK6kPRP*8YULL?x6I7%>bMbyhZtXrw`!R+qWdER1>au1*181X z{rsuwAFsP@ZET9$eZFvdV9c$1i!VfF5k)*aw3`7+?R^YXLACYagm%Uc5etCGgE1bu zAS=u3gq|y@A_-etd>%d*s@{))r|@5`qmi@Qk9h^IrY5%8qYm|+dH&$g(DbwlRrDcm z4$~;>ku=9kqZ9J!)wTs)O~N0l%lzI4ioD)<2TPb;FE3|ow##0Gbyx1v($bOPlj@FU zrxOe>PwRs;G-XPK`5uFx(^CX=UH)3tF~YSlQJIkW5wPv2nG6Xy7{-pZnsZvTahXU8 zI~Z1`1ZovmT)pslS{#N^WO<>rSnR8RuyR4|yj`*c*PEdNE*bB&#|0fvq%?MGp)7uH zJyyI6;P^0jx;+_QPAb%|@197CjrDU~bBCp|HC<~5v>3&urGM%s_``>XL2fJjkdF@! z-B-7(We>-#nY!%~SC&Tk&jF;^Ng8rZrPP__dAao`2PI1FEK^D~8V(FcRK0FD)Pah3 zr&fvOY??FzSx=eqz0$4x-jv8=p0y7Tb4Zo6R5_oU-Q#=#0P|Z(xd{Cate3}b&ug=0 z=ObvRqkz&4z2+uclz^alFM682@xB*e1ARJ~7j?+m9u_C;u2<6)Z30BG$9;X@712s7 zwf#M1k$=T~*iK=g;9=xMP@Pev;s2fC>q!wLn-0~;-dMtv@12fTRO3dj{f>KyiLk(vy)Lr z7(N?@iLv9M-j&IL2nqR^L`Rjw^YqSqx0Kbuv$gxvGw12d4Mnv#QELUL6Z%|@$EN@h^=jC|ND__B-Sg`UXN@sJX6Gt|j!nk??b*OkRp+0XGF2)Yj*CU6f9ehJSFbN; zsS9~|c^80x!$zDO|4#xE57&WH_Jv7}o{q&Rf(`jz7I3Qt9faPy_W!hHf3iRd8z5b6 zY)1=-X=xEOrX*+r=5-oE`Fnr8Xp(JA*qCq-&o3?nEdw(xrn{$Jcv+P-%hI&lW+_fi z$K!5NSe!laG`1_-4jkWhu{G-J0cRcp-%|o@B@O1n|L8Tw<3%a@7^z^y8!h?}u7Tw9 zyH=Z6l7&ejRb_E;$kP|JKX+ka&00zHqloy-0Z_)Xl-ahrR>?frEU%Z?PE2K~w)B{z z0wk_1sNe3m@J20?+}+&lmNz%;P*6A`A*%t_w*8qD!?*I*R3=jl3?K-i@a<1gs&a<2k|=*xQJ3j0w;R zXk6NDiua{34M&Iea0g9#e=Rz=U86!jG=|Xp2!*?C%nJ?GFD%J3XabPdt+ByKd<;KD z^ut&*!sSZ`c&aOWjG zw?Y?O_0|~v-j41WA?}~^da*I7X?Jj(bfBMmYA>;BDoDZ>8jbY?tidd`)r?}Oh`A^K z#3+Daq(5==*)wQ0SF1|KkB&;GN#!4)f&a%<2aHA9JvCz%04TPQ&=v&S;OmQCk=#AipAy0X@HaarCuOn?d);?@t! zhr`bgXJmKZ6is1TG^cd<`YDExiVEY>dKn5(T}`Df$uku<4Gj(gzF40ds*l14C0@y2 zp6_3H9D};= zI{P&c!DM`??#QQ}Ck(4mhlb`R2ox0!WTaXFyFjl9f}wCB1L7v%tHQ%^%~r;Mpv#+F z;wbAWzkxDs9*qqhZ%iB}sO7!U?tkVppLhJW;31x0UZxaF;2-PFf7hFX->zqx8Hk}W zq(BG5VUfE`a7YC=J5fB+i9J9tD=*;NIYhTuf*zg3R%TSC!&|e~tlvQ(1WtAkR5Kr) z5MY5*4F!so#$8ZHC)wpO01f;!o`gIIOGmR@Og!p*aaoDsxU34Nd9A7H3#>*)%CR7b&?zW}6G-+e5UsdLlP~&fW~BbMYqK9vXU70I;}J z5F#XCO~B^^_-Z}$5dCu4L)?S2-)$X)qaA@jMG0p*#9|sdJUj$D8rMY_mh)z~O;{2Kwt|Qc$R_xgO~0c9)6M zJ(j*gG+dg_T2T?O&Y%itbuk_amJ_J(ZihuF6dlxHF)xVdX|y(1P%aI{#2XHPX=pX> z>|8=8zHWuBtD|zdzP)L4i#ZkSFfzSrUZ#$S5DVLGJ8RU{BBQu+^?u>*n|OY3^5yw+ zIa5O-`oJ>5NO*d)@SrB+grJoKxHx#4(^ryuc~OoFJdGaZieY!CW3Ke~f4u|X5A3t{ zD`Y^bvgW@3r5*6UO6GB;_j$Qd1EhM-kH=N1Fo|PKU?h+c>ACNlID$VKDk`sn=2H!L zYkwe_paQs2@Xdh;xL!}kRZE8D5dB<8INxcMgrLsu9UaZ*F3*d<+-)9PQuFB_Ru-3T z_4SxRpLSsDCM6mED^)qz2x;@7P~0Y-1^9-m-mxRLZ$2Aow(>28u)MOF`MX2-rs*vF?Q6) zyRNvq^Fk&gQ2F}m{NUrIECosnjwf^Br$x(tM;wuzdTQcxqQwcJ=s!czFVxj>$pL%A z5kP8i$mT#A?JW3{ipJ?w%LGd{S$^5sbAk^sD2vHo@L>=7lwf z7(x?W5E{uJw!9VYSU&no1YYp(%iFy#4jQRmGp3>XJ>Xx}&X!7;c4U73GR_IaBn=C% zF$U$8It9lljK;6#FPoBVuA?QTP-y51DZe0~VY;_ppAN%5AMDLstpumD6jR?Uq)mo_?HcVS&j?os+O^g8HNh zGk?DMm;m-X*5s)X)l+u`#5)GvK%Fh&ot$O%};PdZ%9N)Lr zpXWdUBOM*>2bq-H>)-ajHMqZ^UPe=TCXRl>x?Lfiv&c$ry5Id%_u1#ep!eV1ZS?Je z85br0ScZI4><3&r6qxdA!dDd=3;{Ef$`;{WTW)EHa z?y}MPxjQIOpY&%(h~A6mas79WsNrB zznNV9Uqu&jjo#+$bfvG_hvSkrKmM^6CzKnq$wQ`gN2eQGBe+|ovfz) zHSjRB0h)FYE|g3MsLHdHr{%cto=B;PiBdyGEcM|1&4 z$J^5aQHOldC0wACw>x!ATuy-({Tq)bk-~vamG%c#2onBvLAt>GSBBIw)hSSp_=?lP zZ*dXm?hd` zCjq;(`#8X|l+_p`CZCdLtJ~VPZfgU`n#DEk+2#f15lFp6-tqLBnnQ!xFqNVRJ|8t` z*FbJ=^68TF1%Pc#v~RxM%f7%3CQ;+}W;o31XKf%Q&{YbPLPFfJead>v58eR&O;Xdc z272;7Gp=^3ey0B;_9K!B9F>0oM+&5|*jO_Q#F(cqVJ6T8Z;jTgT5{olaGOpVF*-e^|2}&DqSJ|KGFYE}2x-CLK2>{4_GwW?Mjg*c9r@K1>((A=pgQ!5Kq{&7hUA=;?w{AO2JdCc8klFp>>A@XaR`wN%jRhW zs8U9R#vJvqS(2W?Z`4hY>UTO@wlLZJCC-9T5?tx**n!C4RA`bhwtCPrm*qF?%V`Kr zn1iD=WS}T8GAXU{DYKnD9>qni1QEs_8Jw<2r3LMu>(@{$H+4B#P9@hl-&(1}fXqum zmQ!0aWMv(;b=y=^5BRSlN{>TKP*tlv8tO|A*L8DyydMYm5C6b~;@tkD`crJu+d}{R zoZX&2v)ov-f42@f2$Ia9DbVEc;A4CZO@M8#2y|l`ve@th>6h2f1hvC zrm}{%9i_QCAUXb}6_P?Eq?Ix$BrSQ{7l^IHBx1n6R4LneE9AoESS7^_hJ9Ak;M) zF&2m^20WY^nsI7t?LNVMt=@V{@qXnMb$3sAyJJPSo~8X$22lVtLO4cT-rpY?3$A4E zvKT-vc@2wfSW_Co$dJu+iIi(EDN$)rd3cz9!0*LkB*ziBi5D4dbx}z)tJ3GWe+>JY z$tXxn7)N1vf6U5TW$_I)A4QdEuyr(5LO(bL!7 zKdEVp%Vs4WJknGRKD(gsDZd%EsZvt@V(0O^9W)(X6krt4eT-bS55BRkx1nn+XH)RF zAO<2GJ15resVRs>E>64K4Z%lNp)#b%k&sBz7TqryE0$Y3q>la-8U;2TgnS}q8N5`+ zv-7PzX(XiiM(umIw6lHmNRDT;~ zay1ncrgZPiZ?sE1VHFQ1gj#a6k6h^xJ z(ITs7)ke_}um)WlIv=7weIm{t8Sc$ITBv%(+V2aGW!6i71Qo@3bwmp!)(5{mi)(bv zer01zxB~IK=|<)kg4PV%T!>k*X+JCQdbfuB74(mnlbWqa^O`TO@od8QHv3_WxE-Ex zPp{5-o3>7CTka1yee{JQfa4yRrwBb%5mCUXNMOSok|K-q|;CCpDJ1I$Z@f=cca`s?ZeC}BTEg6`kF+Y zZ#n?Q3~aT#8*8|KN8!yT)#nzs{jF0g>3CRXY$6HPpddyL8@nb4n~pi_t=Xjlu7z8Jky5Y@t_rH2pj?WS zSm;vi@iw8Imd)D>>cg%Wr``{(`zWHM!MG0Zn-yxJENUJ`4z)}JfBype)x{bE%)mhV ze}!qy*ESq@?9uibnZ_feRkjxfR2OISGStzvwfU_jzHg<@=^4h-W2EjRo12$hjjHYX z(jiSIwq>Yb03)PAEmV*CGSW5SbhYP{%;El?sg7RyD=qGCvlArG+xJR9L&);e~t z?)S3{$Z!v5C23C#2ad2LYHFBCz6*b%HPp#w3k#d&AcMIH-3tv>q|FY>B|ap(`~Bf) z{sSsU;e)INr;`Mcd?xSWlhaeIHA?V(uq%3?Lt#78-dXII?*I3LtN4|T$?iTEr9`R3TxyLrH9 zGLwHq1fpNO$Z7&SEwC7zxxd6w$eA1!IH}o4^hYJ^p6d@K0PwfY#4sAsTAwJr^54G( z!Wh^ifw-gr&$CJ@?nJ)N0OHf*+^=Gan)+>`$6slJUy8@qH?*+PnKPq12OZrfR+ zgz8v3IyN@$+ub@djGVTJxF$CE^z<@CRxT;6i0p`@dR8n59lZeOJ5n%mNftgT>Cs$W z(c_JxA}N${2~{~)1l`wJRjSh!s(BSFD`%d+Xk=snS1d%(*B7<&;(~a?5`O&|;8!Iv zVCPgVNCk}GV9p%o59Sn0@KXc^#u}!kX_7UstcWb`?+%^C#*!{AHQBDV*gxHk+?Ky| z#Kk3qo4UGkbw(iW#9h(AS5t~w8~u!Jq>UCEU0Lh$ft_`=&^b}E_y&QmRQa8K6Dz0~O(ac=T*VL*aJvABGirjkM zf#Qc|lthwSD7Q{m(G-qWH61dJT9L`ghI)=Ry7$Vo5#U8wHIC)X7(>8{EXIJR5GVTG zYLV4*sfuDsG5ed$w^UI#%#9zH)PKZ=yIZ-R^yXj%x=PLEfW1{UsJ_5%_C!%~F~^_0 zk`*slr^9G`XvauW_H7S8G``-7YJTi;w_yR7S;WR@`oZTL|y?;o6A=RI>q0A$ECr-SY3;Z zR6-{^JbcF(iO@<%i%y&RkJ%C{YM8S&>_k?QMHiJ4Z4(+(2IVT?O?yNGT3t0>7I>p= zEG1K|#K6wA)pdTFY;LrZZ(j63o}ZHt6of4352K8v8E-H^)z~>{+B_`UY}u!L+k}-2 zijD{fM9?2iF11HRy$t9w4i~AnnC|S5o`}n^_GzUAmh~v0m$7Bh!vKSx5HT?*@nLV! z!HI=f%;FlUi$a)RS}?Ef*3l#t@cFbmG@vEH$(PRX2%_?3Lo?iN^3XG1Tq!k8$M8@K zXA0E`)s#saH~H?suUDeAvuFggez)Naq+$CfbmRX1{#Fbu zN@#Doo=E+X+oNk8|EkQyGTcuI$Q~Y`)s#2b&!z)i{9(%kg5X)hC;O+kTXfY|R#xoF z&(clskjB}7XOo2SbLT_Qy2ow)#(_d8v-3a7F)SH|MeWv*UE@m6HhW@oDauHLhlfzn zVrbx5pf8x^pwh7p*xnF445>_fy#Bk?AZ5iNHI<&K)lNB;^a(vayetk-5POZ{7$4JW zQMy~MwgT5A|23w}e5O3ywm_leYCl19fRK=)u`0fkqui~je1-civ-@C zRz!$#bMtI(o<#?D2>_R}lV7Cvx~_g=T05@^MDuCl=Fn1U;qt=UOT;q^N$A@HGu>k{ zv72qKN%+;~l>jQ{aCLrH1;nuFq}*(CUbA1B6)#=5ool@qySp7&)X-io&VOBc73}Pm zpo9DR&|>75!OTnw-a?Mvy(*xv5VC@qMx2LD*kc7UC709qkaw7^pFy2CS4(oes>Lzk z2J7j`7S#$gO)5l?X53c!C~bWE!4aK9XA*UeD@`WU1K@+xzes8&A59WL7WY zA_bh2DnDY~;qcw*{~W9ScWA5NfIS>;Wnu)=3DE3DFj1+^_q!Dmj>A-({qOY{3P3ve zh^GE$N+B0xXlOoqW=tjnV)}4ahRw0%(duN`l&@AT4xK`Twv-AG$Sal86kt03{i`^~ zVGvMz@pPw#c@Ey*k*wK^hs!~yh<6Q{7{@vuPc>s9BNtoRqr|)|)N20fSJ`=`#18Sk z>0~SGu^FTVy^qaokv7YhK2gqt`>{Z3x6o~bE;e3EY32HuLRHPgWOdnM4&>vy>9_0M zXqH2(D`kz0HHZYJx=Hck2Bvs?J{0{(G(|(Ire4{Koo$SMp*+Ur6KL{Se_L#KdA(J| zJz+P6Wfct?Ewl6S%WYac-_#^yuz74-EL`GzVUGS3t**>z!zU53E3H#K*Fvrf#T)v02=LzA{I zPn>STz%FI-J$a@Glp-1a@t@h!QdzMNt|!J}0|m$n`8k!bqkaCmy6yYcae9+b?`$?B zroLqleWpLP}2X>Us;gKdjVS(?2WJ)GRM3U0*sb6Mg;ZFFqFr5C1I9z`_-xixOH*P*Qbp z)(B(7%7Y(JBv|@X%1FB`E(|0iU?rVg9OK&4Q}3UoNJnCk7HjfE20$QMBH^pOVNJGT zOt5?hQ8L?X<4=g1u6TA8822hv)FX0xes@K6m8=+airEHQd6N6#VN$ewR-u1;sy8W$ zAg6lPfsXj$-+N4xm-=hC4Tmgrq~@<+^pM>WUB|LL8kt0bua@qfE@Jz>d-L1 zw^wYRM?mC7ip$TUM6BZDGfh-X4%7@VMii%8V!i0(*Lr7rdRp~Z3Tl?W$0vlo?BwSQ z%EAl{9i@ihY07}pV5c$I{7UMT3&YK)MIJ7SQFF$}9Wu*hB$eXQY+|9WrHse$9<0hx z>yvQ*lNhA>&xJ&aRcZb#$g!9CjQ)W}t+qym1~gw8=zJ{V#l`ls?EN6+j4{)$KfzI|x%(eexRFKY3x34gEo5rSO<7;eMR<=k(DKD^K zArVsR#jBK_F4FsU8Qyv$t=@#(AC29%gh&<`Xp|)&cl&Uq#p#_|k4{1TrkmgRM`e3S zB>0k`T+FJe60CQ!+Li=3Gc#GtQr@1fF1v|40SilLS*Q+Ox~ zDkubQ=t@y4jeRo5e-xBmsGF+8FjZA!2pH(nBCp;p18sLaSc#$u$9RN;FSCArpn2=s zEUTI&a^(BZ^2V=*Q!#G>`oH{2Ocb-TV+6Y4)I=TD0yEnfXoAZAd3#{wa)^RB_xU-$ zYW`qKMIj>lYs;rfZJGyqHuEW=(#G)&7J-zSxVQ)&hhC4k5iB~R;mq-j3ZgEJ@X1we z?VF|D&%jeTtVuU(`UC?LOHmO2xYI2vu4yZ88HGhhx^DUEb$B>eTkrsq>(FsndA%3j z+g6^`Ygj&MnmM^$hFoN}B{ZjyWjvZwJ9aI<5qVGbt@LV5`=H7I9~=ly9-gc79u$rx zNOLnYR)}a`;*tKyYO|Ofi<^Jya~$U?viBs-g}nNH8^Kox|a{^R-eP! z80AGe{e|b!qukwzUm3`_bcFNBxkWgsFu{$n{%nT*h(NOqos)*xSTuH)fAC zno{^Y*@4byd-jsjj6>>-9EHuz&E4x#Vq!sKr%i+T-wFz> z@#uueo;u77T$Aw)EjZX`pT<}Z6K!mye}>W-pg&p9!Sg?VR#c=kn}&Wd%^D)``ugca zN5`3>7xp8lE2qKI@@+gMEsfOo?609u1ZqLXRz`a7w6shEKbFX^k{YY{F|t81n6sF7RP%pH}!*Z?!3*@>lnGGOxDQs3U5T1iPqr;?a! z^g;48jDruDaYDBZ$o6BmX$O1zZ~Xk3B}zr9+5)}#2(@(2|BTQKY>TZwrp6nm;cr_R z#IVl#e2^xOW#j1YBR#yeSg-0D!XVu1Pu_E6oAr5-_Mk|?-!?I@1>ShelR3Wic)uq#S_6T6{&ck(!(kkoEB%VI+KpFAGbgxJ*+*9m);dFWe!X?>lE8yb zBSa;iRFH>Raj*DzX5fPIHF43=(1buF|L*D&n7)1cW<*L#xmFcxnH_6s4j>O)1JN@AUw>98{pLm|s+2 zFpP8Af*gmH5HEn=~mXKX*S|7H80u-`Z@N_!9U$(aAs%-tuRDhFAE$+Q}S}C0x z&;JJS&Eq!SqDM4*V=pa7o5%c0o`u2k*)8;Y^5W|p4y#0?e&~T&&7XMX7dBOVxL@hi zY#alRaO7-$<@|GI7KJp-xwGRH;nj@hkg=)oBZ-nqnwCZ;pqa^O#Y05j5xSe@CZt^8 zGGP|Kr+uuLDh>(?3dy3#ig$SU04p&*_?ywuM5VW9NV2qp|Ec_RFtnlNb0mn6%}k*d$|l$>2cs@$bM!Vm3*s9 zAkXRNV+xWym*{+c?_QzHyCi&j?dua7j`h7UIwBFRbka4=WcGsCM7n~4@7kgFY@gtM zy{fjf45Lkvkj$w}L$Q=VrjF9tU^WaE=PXPRpv2pxoS#$5Gj$9)>Bgfmb zCcPX8!U;ID+r57-g(!q${YozOYF|1L7nSsh!=srVkMz3TfdFKz*Dh^nW)JFxgYK9EA&6 zeAq#+DbVpk)o93NWm34T1viP7W#{-K!wIx#pmll6{)~jyiSMSdgoF?7U*DFG|I6XDwMLcg)lK;Xx-*eF`55M zrmxP+tL5kULL_^13N#LT;)<=Ukb{+$%eR=-Hr>lxe6;r&pM;)I_}}`YYj1Bay+JAs z%F9zG7*FZhl8obg9%Y$Ev79eIvW7TqmCEJUY?|-LI9)Yv#jtc2@&7o7W#>HA+OU{N z&O)8sx2{WD+3GMfYW;Mszl+LDM3i!_E{U8H6DF2k8u&MvDOS0%@FpO}WNf4Ji4?EV zt;Wjq&L*^Qcjvo%iwKRQgNWYgDoq^o+ePpwzT3g)6}P;{7oA-o(v8gfK%kJga~hJk zQ<;;apSIIrL&vc?t6b9xoN-}VNMEQMfxaBhRbDeP#J_19Y(hd&FS7H4<5DRTml|Or z`3Oa%HNubP`g%~LP*@taMkNNKVuk0*l0pV6G|9S-!x@ZHc+|q+mYRUJhP&P}X{ue` z=4M*R^>F{^<{Z_-Rcvkmw$2pnNx`ts=l+WUudfb?kD}xNu`Z-ren5kwz{D~ z>S>LI=1M~sip*!3Wo02vt8Eq0Frfz8&DrgIe&ONZn8Z?QOCXbR*-2#^USKjPKUbdd z%O%&>Cq}ewLpp5{hqiO7hilUH4dhslCw(|30P-{MYZsR=EMXFM*)AKH#Q!ZSFfb@o z0$PRWFFYGL!CwWkYIjGNnp;6x<+{EVs|SvwIJjN5Sq~>scw~I(C>;^fCGe))85P5G`pc`F$X9u-F_%6zj;xECRvP+>jnPwF zI2Q;}<+yIcu)M!G?v`sdMFBx}&dlMWYD^|0a40)*e^DxuC6ke?GpaNMa)X?yL7=QI zmmi3r&TI@XE*|lDq`F-zSMzvYMXtQ_gndZxaU11oIh|3^A+X$jLAw@(3=!w+7-Pa@ zdCIkqB6b|MswN zOuS*+l>i5FYp%D0gZp(0IW>hA!<1psHzbKx?)$8Om(^&Ya>wuIFIo*0J`H-%n3#wc zUH<(bScs<*v zo-O{=l#Nm*#ln=F1)5eK%vU^m0Bqti)lfTNa!;*cVWpfvq18-#YS!zOv@xDrB9bda ztP;64^LCDLi666ks2g*p_fp2v!X=h!MXkDCU;0Xw!?UtP>X5(qb^C8davX6?)q`%U zw1!$I_&Z6ZQ0?jO*|6{tnE>wl zd#hJIPnQbo6^oOf6@LG}3A~`ymo={_60&yIk`;+uYq%d01+7KE~m&Nzct|{y&=$YpbXkKqW(Ea9vZs(Xgq! z)_dH99lr7SmzOJ|=X6X?Y;k20dfwYNho#`-bAFI#K;v>so0!eDwM9Byr}q-!9#MG8wV~s_H2iXwA)o59Tu; zPrG!{*4gl&fnCxXQ9h>EMq4jILFeQRNLF`&R;vbpe&=2KA)U+!X==J}QT5)VF)S)i z5E^KOr8l0=Wwlfvnr7RX(l)z;V+On^yJygWUfF>DO@PQfU>+AY;ADmB4>`9+F0-g8 zTFxhAthA~^Bp`euwt9WiMOEA*2ieSsi7WxQYRokf2bjN6&|l=h>$L^0@b;vl3lOFl zc~=?X|BnmMnkti)KcJ?U4M!}6%B~cFS{{LjssRIo*6n#j#YJ>_I^UF&W1mnB^lf=> zB?XwvU)u?$a)Y7jMqyb7Dp6Gxb1uN!it!QB_(82uQiSc7bmd_tO+h}@nu>c9P z;_{WE=tajgc1ck~t@LZpQc3w=%EUHHq@Pag?TNKUr*iy7`q`~x$M;{JgheZ3)U~vF zZ`<7zTGy*|=qhNI8ZkA2`U4igfQV)i=(3=qi6hkU@v$4BQ`E-ARX=kq%>fQF0R8Ii zJ)c#Qt1+D*d{v$#k#(q!R}Y93^;ZuVOJ&QmT&P59Xb}_t|1mLLWwU5;kjdES9>&W> zFS>}a(P#Uk_(eAbg;=Z8Q~C!v0Ek;w(V;gO1b3VDj>}S`M#dBdK!=)%iiL5OhUVq% zfOdBzY!-(TRALGTC9aToUYEY8XRSFb2g?PZ!T1RZp?#5R-gb3o{F&Scso}i)hP*`M%-q8iMei89-Z}YGu zY(xS|rRQ{Bs;QC$8ZtHMqPPn-5+!$cc`aJN#!MP78(<-kUM`UBv9hv`evK59!h|pH z-)hAKzsKh9TdMvsmVU?i1!}j$vh|N^Q|d}H6OGu!po|Va7mMG@DD}j@}UR_42W9|GAh_bGYUFumQmIyW~VdI1&Z zvoMPGP>-eZ`zg-!T{P|EF_hF2E9B-6F&X$WQ@%KN-``z`oeg@w3=1}yp zDm@G-=bRapU2$!SYdnr99n6;>^S%#cFn|9d`aT}gcq!xIL9`AJrB~Ri0Hh}C_nZB` zpZBquqw4f60^Jh$@_@I|+s#CV2{EB>#DZ z{SwP70Hfr_Z)Wf6v9bQ|d+)ys)c*dHaXkTW3MNo5Ujul6bc zD4%KEjPUS4Oze0nCa6H{hZO$5u+t1nA9K@s8EvhR4uUEe1;EBXR znEBD{X^nFEX8Qg6H}dLZ{pCM9b2cZel$3)l^!q$fPOjUr~dC=MZ|`s zZ#X8p=(d;F?<`|rK$Yd4IFj4Zbn$9>S`JolbvkOIpWj(HEAi zupb)o=zOjX5cNFO+gr#1Y*FSHZ3Tsa*EYO;@-}Hbr}$<7+^Y%E-RC`JMZ>qjUiHyD22<Ig$E>});T<`zK(>Vu6@_%1H*o|#xW822Y#>RFwwry=}8=Guw+qP}n`1Plr`aV_p zXDU-OJ>Bo_zJ2dGuakb1eP^^UArEpmNvA&;MVwzyUW|70l;Z2?Aa%TO#_RbQgoNuE zM=slb^H}-GVdq$P6oTvJ{_#MYnVDPI?;pcYU1BERq&ehxW60(Gc39_F!qXaYHB=CT zqu#DA@3y_?^%MjtD?kg7Qh3B-Y%&?98zM}R|599Ldmi(9u!2|$e4v>jBJN(cKyJrV z@B_P{dMK6236CGoPXLgRw-**VbPAd^t!^>E-vKM|V|j|n#UbqcQp2t3qVJ0-6xV#j zZWn~IBr`{S{KqS@pYMT3oCrvD02`X2&hp=p9_qflxP2AAZ;JunVN>}$A5|EtS?A*t z3QBa^_MV@E=4wsM56;NQ4tO8cVSp92yQ}@u^)*&bUMX{P>yTeRpTX}vYiEB`N>(Xz zvOE*Yu{HiJ^JJs#GO{Zthfg+xo5jbANY86WDuw_UYt7hSbv*hJf{2P<_dt3mDI2V^ z${PP>C6KeR;Z%V_2b3ZIwGCLakXFC_6jjOZ(HAT!f7L!cKQ&XsYEpB|C|+}Pa2_Zl zUO(I25z?@)S=pPLHaB;%^P4MlVDYxMcLF11)c+CZIBv*~$dr!$E=S8(9!{ey#+cgV zrq#2VsD_+uv}OML^6&S>Kt%rG{gH(74pT-fppjZsU5(VC8>2IjvbwU;a%(oXWW93) zq#8&?PS3iLNHy77xA*8P)K83cZ0Y$<7=FH6eXe>jL=w!{&(W3fzFA2e0PHS#BpjUJ zz@HB>`GJ9ad3mxxfN~wJjwa9mr#Pf!;Mm^T>DTj3nyW4HzrRNr9lcLX!X6%<-#a}8 z-hluKsS%%W5f*Nr+q~>oP!QdE348=Xg@&?>RYkT?;Cbnb!pSb!&5g@=PSwx`KDivL zzM0w3D}1$noWIUm&QVFfAjF38c1wwK%6pS#RM%C~vMmsF-_p{eI;2N)_2h8r`Y@hW zk;RAW_a2EURMNMxgz0A>&oAi}tfHo=6p+`B=T|2wxxBK5ih~iNTQxMZg6#x+LQ&*1`C5|=;#Ijb5L0hnyeX9D}~PD zO@D<$39ekIw#~uO(fw(|6!IX)KhZqGhS%42}9HIS1B zasfrHI4CHn#z>qASlgMrX#@V?CstcN(OW(|W42vcCIb<572596Y?ewRqqB96W*BFS zMR!Lz*j6j?BY8iI-alN4GT70peZ2WC7x(RVz^qn(4Fl5$Ab@%WU7BjkS8wuk!K2Z3 z$?>_`KLAX;x7VqmKZyz)VwuUc(qE?y;pR2t+V`q=Ad-96CW1V_h{N|H;2KJT*W?qA zoSa;fZweqT*K>k^-Tpvx9@8;|}d+yF8&M*x1ZWD`y!^P0he7AYY$YAJi|=nOu&=LYoDvmI3jWkqtQvv12qL zIn$utUafYX^H5&)Ml|9Yu{HjNQk?x%HiZ<2*8`Ct>-KD%b)n!DMkKH=!Sc^RlN`>u zvRA70XZSylHaV^@6J3WZ++wTy*%J0I4}ioLhR)&nGUbWr6JXpZ`*Cg)k81Gyy^6YV zrPbN8+=!Qt@85s_0`Dqcwk=ovR}sxLfywCYeJG=+TIJF`#qf=S!hNEr2l`s1>ZwFL zhNRx&Ah@H$>la|F`~F=tQy>Qz1r-z)X6ENBMMM_;Wnf|Ha9HEcLh$sY0G!bF_BBI2 zJ-``@kBuGt4Wf1T;sQ8hf!90{kv$_Lpn;&Hqi~7IIGpaasj*1n=NEbP^Mb#rjE%7< z=|fN{qU3cUy0h!d9x8NzCJy)eJ4jY^*de!O)3?1GZVJf5aqF>}0whc|_f$6zVYlXJ z7wetInd`1#=bXOb2%E*^$-1ttt_3E1ZYTYi04A~Y3|3cG4)X5))0+B;Z{LlgL_|c? z@ln;|`mL=q#C={RZ+tRTog|xB2U%CvX4z3w=#<;H$Ys;j@r}}9O@3#Ll&jHf+N!Io zXI06&ozVe*AgbQaLR&Mt8H$62jc6YC%mH8&0?fmGQmwGmfRV&Z_l5;={HLmOc8C|k%` zZ8tOdAQ99zOnX-woIA7S5Vq>#em^d>y?O45;igv;G5VWWRV_jgoE|wXef@7_vj>D>jkh{$ z&`KWN-Hb22A@g7@>QH_}GJ<2pUREMy5$U>k=9{qB3*lu#JK0h``ptqhx;%TnwN=op7&s71+VBkv5$;q~8 zE%=jeNf~{|M`>jtKWu+Zvo?#xi5Tt(=A=68VqI9R?(DGuU!Vp;K>IluK9eXIuGYQ~ z&9nd0Wgr;j-M;60-%j8?)l~$CuG?NXO9KtOBPuFaq=~-?h?HHguD=ttr3kju2290S zUc`0X)Fg|eDFhW2Jtt?B+0oMXalLp+nQ?d3iZFxCb}K3A4tx7D&HqNG0RdjOcXw2j z!zI<#)x9Mt*R5@BG}+mg>spPm%03-j2TKLad5`xe34&Dq{wk6u41`@N@Sjb0(qa1- zMTPrJ9`&%02xyLK&onAjCKyxW7tQ#Xg0h(_SL;e7SY6AO`?Ev<+*Aer_}ZHx=fp^ zp&4^=Kq}%D!HCnDT@)SV>xwwRLAGmLJ=FQz@!m*WnVmDc?hJGLZR%_1unQk?T)^v% zU=y_C-$ZDc@=9@@eQ8QJvuxB{wQT1Hd!U-`NbgDu-Q}g7XAduXD*|yxGu2v?*>s&5 zSakGcbE}7frlzo*9Qn!$rX=;n*!?XC~g~wLZoB2fo{Rjj*AS&hL!+c*Z9@ zF|zkaaAXor$Kt42fPd<aZDy+>c$&=SV ziH-IHKGO=S?W-~L^(EgY%JCCG)q7#ubKpX(&i)iXESDYc+mLuySE5^u64TNI;tcI7 z=tftTO7t>`0j0akWd-|X-nms~C>-e9Uqq$wND4jUj=;LQ()VPO(A2~)B1Mx>_oXvg zZS8k1mkO+oPu_unP#|;}WE*=Z$1ePA()TmH?=bhIxwRE&HVlvRim9t(r=_*L^BkFc z-s29)UG<#b6O2~`x#?PR#pqCp(rRIdrO?xR-N*S8xHfh_)!gWtg{pa}4OV`9H}fVy zUE+iG;N#}u`Fx*?Sz*A>n-V8v9JtfDq^CAIAJDk}yzyCeN+@~w{J3zx;uF{Pp^p?# z_zHe&wn?<*5}YR7id%4J9ZQMqez_3`kCQf?7HtaEK)e*SJ?d_WrLX7j3P$Wk3S0|w_Tnzu;Qxf~4|KG(cUnG9tM|Imr9s|HtW+%Z9 zPG@X>`lM#d?o*(=7<3dDbFLs*a&UUJ1el{Yp0_!q4e*9@W3GGQBt6aB!f+E)iOeRW z<>w#m6p~yT-!^WLTHh#Cwo*zcxHWg0-C26xV4%<0gY4G_l~f%P6PkA;5I0F3qpfPO z1@R=`p^de?%hjyEooRL#)Aru%?MxFfo`gD@84`CI4F%MNBLeB0GCc4wT+`383vxQ;EY;3} zKXUyNvU^N=YVZ&8JC3u!SeA`x=uf;$K}kufCsv)w6iA4jj(3Vx7vw7Y=Yor!nwtfY zoT*$Jne_)quN|P^>)DI>X+ez$3DL{&Ww4I{GaHGi<{L3L$)T^nV!o9fY+{zW$CRiRc!-h+(bE%~gJ_u<$}(1mSl&y1 zBR(e1*GeeazUu>E^ zpNjUKC;8|KH)Jex1udje|A4T1w_gIGDq24bxBm&$bX>6ZvV87-Uoumcy2uLt|22E2 z8=K=X@^nPc5TrRNC{TR>&XOJ{cW)?R@BPU+MHW8YeJ1`){6*pPAN})~oWlK^-{*Qa zXs)};)+&4u(GJl@nFpj)i3(z0O+I7=IxKJrmxn^>ND&O&My#dS#`LK_Gd97^adAS% zs^d&!)G%?SuXhKK>|pR2BMdUhfB71Rc;eAANsI~<$zD`eji;6X zeIz`fN1Eyhe3nTC`5Dq(UKJ1sPD%;{f$2Mdeq0`Aw44PZLIHJw1#V9daj#QyUz*8* zzAeKn&0k}IPcjO1^=;4)DG!G#4xGqaH@i^U4ICsQ9k%N%-;<{=lu(N0(O zeQyCwhU|lrk`FttTPB+i2fUFXPrKuxJ5oaFo{_oGXQ57!ubS}g8V=!k4n{XdK$F8} zuL8(Zs;$!6r}Bx_Yrv?f?=p|Zd$zYha=gin2))r>AA>2f{bmY!mYS$HW=5b(GD4;H zZP(Z((@$pt-*i(0J}tpvF>#h_FL}8s7+w*bOm-~vywX2n)>a!2@+UE$MqHQNH+f%O zh&l%}5I!-c_9l+%c=&=oAPv5RuztZ=vXEWc= z!uXgOti!U?U%-;eIf6R$c3Iv~6}xYoDKolnS!0C_=znj3jHo&jSgUo)-POWbS)g;Z zDpd00f!z4U5cn+=bUT^x!V*gOO2)Uwqx@L|uZV<4+xIukjW9(j(r&hwHHbHtU zq9ZW!nVXfCPJV-;NPNE&BK=AhyEmty7ou}Y+z!f0-uE#vXNw!eveR(}Y zB1C-J)bbv$HkhUPK^g>1pnkBR%4MV3*EpXQ5&pzaOg>CVOY6@1&cGB%ghgpqc1M{_ znbY6vS8Ti-s-T1(|ILzEWb(863w4%-=%WOjwN7i`U+Y3p>l4|| z@Yp+x9obzpqLJvj74yfw@U&SU+$p)E1L+Q>B82Vn$=ASQ#6MAZ5nA5Ns1p&xjXy>9e#7NezstrQ_Y>Kp z(IG;IG(iZIBUWDeJgfl!A5%U!}nYZ>t9@NaLQ6H$<8)?xSc{6jKM_bqGE{|ke^ z=i?>kx^gKaG3ChdZi4@Q?SZY**SWG0{%KjR-Q%5wSHJ^hk{2$4yyvP*?Q>JEq^fi7 zb-RJ;JI z?IVFG9L?GwvJR_23W7;}-%%#LdGs43+-R z6Uqn+3xM3;sV( zx#dQTMaqP|*C%*j{O~p=zdR=|WuV2+GA54N| zW}ZW(@+fy!7jts$tT5qpz5sJz!p>Kz&UbWpv~nh2emq`Ej+2u)BKAg`xCVnjsFG*5 z7r>qf=+y<+jE3x_WD>pS$MK)vY)_Iv?4GOd)vm8W5)dBY@TrL{MiX1*NB^o^pVtwi z#1LZIYhfNu&RhyG*gtC=^KwVCOzbVMnSdD`ZUFwfZ@!y#P**5WD`3CHe=rbsen5l0 z>uaSXc|D23y|r%jRes8YPPbFhYJ!%;@0&$d=rI_+os>+(ya1BVHya>!2!qzoAH4jF zpBRkWIi6{A6Oj5Z#9zeBwkWW(lFZ)DQ< z<1PKX%ZV3ebfSD5Oyg0lh_&4MtAYj>PGLQ*4)LRx(dg9sTh}K6a+Az2WD}F#b0Ma=-PbEz8)83(jMi# zN=vIJCz2rbEzvNfj4OqJ+1DcsY4k5-c7#6^8&=_oXf5HX3S-1FQUQPsf8`N_AsM&5 zWwe?csF#~|3Svlc44?%BUi4LX58j`RP@2|jBV*XNdj7eR-z{pX%v~KnjPgUcaJ!ki zaS0uiteo>!FJ5)ob*3C`2prDIlk5Z{<~km6Hv)dAt+>C)#KhZ?41YI*{7-jBhYu%| zF3ex|P0`cwVDb*1Pk{C1^Lw@;k66ga|)h{sLJr3J)B`uB@S`M!t}>j27! zz434XKYSjMVR!eQQbm2{4{F(!s{P}J7#X~*UTYh6ATp;8 zhEUY~~~+83M$Mrm|6|a#G4_E#@p#0`s$zRq^8bteMiD{wc0NEUBl_knP3&s?9Ui7jnS6Z z6vvp4TOxK(@-ct5bVW zD_@>)q=7jtx|eoxGB&nb7ImuHB$9%Q%Ro?T@_h8DYU9Q0c}ME;iZBd&?w{PNX@$w1 zk@AgpwxGpd*vH50#3c0HBQ-G(FT5w6cU58+z>2`*VbVV$N$fC4sd{(l5Qxu>*4|;S z)uJTzATy8@H<3Zaj`1^x|G3F!;Bx@8Jd!4s%fi9Y;6hVQ;1=p1P<~F0%Z&V^rUcom zXYuGz{|gLO7Ja{Pk01#P4{D5NKYvh&4>nj*Tx{gHfvs)ysI6l$YhCn;+`sY&%wyNz8IJsO0Iq4wAzCG4V(rT=zNT>{40BT!T|tIs3YIJafvW zLC2j{=rVwfPQdejp!vK_yz_6m{j4g3G^nVW z-97jA56J_r%1Wp?I7n@=O`4MG42LPBC!dq(bu{;`hw)7Lv0*3MP8N~bFM@cYCvulJ z5?}+#?=nH7$$IuTXkHAL7zyOEWz)rBO{-vka1idk{<3<{rJ?uN4Qhh^(T>0VV5@#| zBzj$Al+;+JA(tJr*+CZrifl+Br%tG*2M}7>1PHqh#s)^K1;_P#cM6yKQkgJ@PVPM- zyOyR)5i6;voSrW@Brh0;?xs-9%|a{15#6UXJKJBcU}1Oee?RY|&W6D6xfu|}U3JnR zx*;RSqaYJ9R0d~caAJ#%S#Ar~+ylOL(VY-n+7fC%5g=DSDOAJ}?Ce|vc(5Gh`Yj7;VAI@(&63=(Mw!Cx_4hgp%gy9?&{Y>E z(?U%F07-q?OfcyIyDutAbobazOeQyCw~Dn~NTf2f1b9LmDOwELe%a)xq9sKOa(_y} z*|^jpWcArV$cf8=vam00?t0WwW!K_Ju2gYkN99-0-IT!CTw9!S$$pF#9rW^yVt*u= zzlyG0%cMV4#jRObx=$^KAe%cv9Xn8`5cTN0`QP-{u78t`+i6_ zHdrLN`!{$th1D?`k$x>?I=dXgg#h4j28!n3;&0w};K58Y`-7v;Mq6GI(;v#5cYS+> zapJ?_zX;slyGSda!{17?3v-wr_}>Mx0=GhQ9QW>HsP$}rB2}JDqGe4Ih1gll6o#v( z=Xi%awK~_!$^}!F#{WiYwXX2M6DX9NKJUfHtvT;9(eJ7p5qa=* zwxl&#{_^3^k-B**J0&2B{1^Q_!p zcahE^L(1L|kwDJ+<;D#@qu;ffZkd*T#|!!CP9M|3VFY-A^|zJegRvV*1`4MS59EQU z$a2TKyb`&*d%L28z17@*MNl0|%5ggFZX*Y+mD=I0or|A@K7K*pluW0{DY(*vgoGMI zlQpzgypL!pyd#HS&-8-Tc4(?VwmU46j)?);`@7dyNA>#2JoI8EI{w1P+nQ^bUh|J) z`*okTQfWZm*{ZVu0A0@D;n8Qx*R_u@PpPOfb6CN^U)+jJ^0++x6V-Bh{KAd)V;QFf zr`8O^)SqZ>e{Z3jRQV!i||J```*Y4|!5QQV!QS%T=KwRMI ziU2%0&rI>DJvnI7wO($Fz`>Tg=g>W`=+)wSdzIc^S67+1+~n67fQ{({F1YdDBi(I& zG91KoS#Bk97)$)43696q6JfW+&|GW3$>d^mEWWn*8=0buqE|>Jt-mj!_-0fFFu4fp zoN0I;u|^O(rZ9P<84VbJ^e0WW=fYfr@^Y!5OSM7YNmRg?9gGS)IP%4k66T@^2!Jap zdgyx6Nr@~%AU3XL6=*fhT3>3vzuo`d&NwKROO*2Hd;wwjgqi9@(A7L%29+8W(xa=5 z(^BgJpQ_x!u+6jemG=umtuAY(2zC87BLx4^3VpRa?NWUpFTm*7Gx1B{15Y5m(oE-- z6~)ELptd;Tri&g0GM%9djm?bDbJ0nS+u=M_oqc=+-ONZI`>XCZYP=K~cTT2g&F!7R z2Dh=}Vc2BxlCC3tbuvTfzVRd+zLa~F?l&Nl+&sdLyjHcU7$6MXl8B4=+wtX`Y%7;s z&!3!ntxuTjDnQY*;KX77d3*wFE=bJm!kqLBhy^|RdcK8Ak;8-cCyQ;wonHhdrp4wJ zWs!eyZ>}Fi7t0dNDVaTYG&DLiMUF7(P;wZM9*V!-a*#A)1nAEd@CK5;YsEcGa1htt zJ}epDhR{h$?!G-v@*HNxAc2iK#8FG`!unk2R;z;CY|t@al2K1`AMNe|rsV!D-%l1= z&7hto$PUFAW9B@iGDQG=+j`c#JQ-+L|0}d1F*r)S$VzEM-dg&2D$Akt zu(bEH$2E7GI1bSvK7T7K5>+J7Wi$fM?CrHs8zap^%)p!qchPn#1*l> zNTkY7>#f=TI99YjIG4)WK8Q`FtSlXh@|Vr%_m1Hs7wIVI_PCQ(v<2H8o!jbqbe*KF zbo+Fl(fFP(?XcOtN^JRH@qA3eYBU(Oc6Ss>9@Xicb!m|Uk6U`VJmXFh0?+4iCAL|n ze9_7enW*xByTFc47f(z}-FtPe!D?cXe>s24rPZMcMe%2_^*Fazn6#iq49$_dVX%Y+$a~p*$I{X>aM;8+&T=`G zH5V-h7(~~GhEQ@+!Y-GYNIoqsyB+L$cq)_WJ@M00@6-?G3b{f;{0nGG6a5BrH$tKW z3z>ys*2eMD=meC*%wRqVW9bpnb+LMJ6icwjJM_-r2{I3gS z5rb1O4rN1XVV2#o5J-DmwYry3eR$w-U3&_}F>iuTzK&zGQq4|JfF#kFS=-!V{dS+4;Cc`#%_(GXl$04h-80^R7)a$>bsG_ z!D2ju!V3pc^Up(b)YEDsVth=xesw9Z_AgAZkw!p5saO_O@3~bQYh?c4zn`!5cSi;* z%&-5nLM7w-zmDa7|LVZr50g|o(|Ggo1;6Z78!&pXdOfC9OT0XFU5vs$`aWW#4-CjO zKG?N=xa<_TltrrzIX&$T7)KGxtGaV_Z2E4sbgwomo~MvG&v*ICqMeN~h%&XX*qiKh zzV*8n>UF((qs-0ro4viBiT1?{gZleBNy(6I-~X-wCxGpW7@_}cQOJSW z^YhbHcqpc1?fr#q;7Ua$pNE2Mpf$RB-}s#s=gmDC9y>fCiLA0Z%iWGktj4N94a2HH z{bF^2u9DX4?H{9b7KgmZU#o$n;E@DN5mm7e^`l_e*wo>doxZZ`NAml<7}5HCX-uMM zt2V|hcgTfUB8h_owq(+1-Y;G>jM}4}&>Ltd{rla4-9no=XA5s%(}{fPP=sAl0sH(g zhc_-;Na(jcMC0fNV|*SM%QR_c_81(p&o1^LfEm~xjV3aG_lE;$*GMFj!g=uZc)vv~ zU0?U*ABx9Y6w8mN8TkfC$YHG2iy&qM0DTqWfYDf_sIoHQOrA(XI!)uNElf-`)B(U6 zc;kM&p`~rbNy4KwFZEBCjvfXD#Uiqzo;7ap?NQ5~he`3BkV2+=Y%G$vLDLI>O(6pf z#;blm(B1s)&o?Udx{&-1&w(S0kJr^YkqKh9uaX=I)pG1z{j@vVcq|#etmfKSx$h>4 zH*9HsQH<@WqL}ZQ<6AU&>Bds-iJOyKG39>e=T-=W{4$1y#0$|7!*YzdB8$C!*|?&u zz`0XnG^F0;!$%>PX&$A*PCqaJs3Nmwj%ljGD&ZX?yXbHY4H>zb+m?vQL*|Hxj`w!Y zD;ITrKhVB^&qILCK>FRizLUqXQ=z@O&l2OCx?1o~Z0^zlTS~&<_ ze@*Rr%w~AB>|=SPj?od1*M}phKJf0OdLQzcUUyueo~!~qQ##mKYbv^wa`r#!s-D2x zWN%3}im=fT!kPTr{I7OEOxlK+CX*>4C4Kfaa}p#`Hm1MC9$^x$`*5n_$t8_eZmDLl zsznGKgL=T!BoVqeus^cP^EphCUu@P71w@9*zIS*tCU6t9`pWhU(qC>x zcmMjN41q^Q22PV;39mD{nh*QE{*l%75z>(ZV)Vm3l37g*@ad~g)Lu$@1ktTdN(clr z{N|q_P)3q!iqyfS%{O9aIt@``;(t(x7Z!+81U^WEfEFa9CB^|hj}ieMZGPt2Vz}Y; zLb>QX6={EqO4z{Te%qC{FCF}V(wf=MjJRn3JjT#*(syYz*r4UlcgLNfBMFzr=G4s= zWwdC4k9s8Y@Nl*<&IlSLOx7%(KHy5~u*w=OCKA^AcQWgOB-+Pk5|`hmvqk9l8|*KI zpzLV#^UEpGA&bcywi1cFL>KckS&opIXi|$Q@$uZuKZSK+{`9tOZ1LIIldlhFD*%Cn z?0a%h=|6`7^Lam%GB(VXF=J-asq6_rgN|e5{AVhit)UXaa)Q|F0NvisxtW{h?%K{> zHJ3y@1_P`y@6&0Ub$6@kTfU!N{b~Ug+yWl28~)u9g~PczcB>M+)RYCc%dZ+c1GCGn zt{O3@db!F+w4EZT>tMdEzQC!TTSB7#t^lPhoEG7c_KcnIH-pUtyE#gQQG+vGPIm-3 zQ^6zsRA+FvjIC@C0Zt!`eENqtEdKUnO0IXnYZZeddOcsp<|-xzqiD=B(n-pJ*&r4; z*l1MJtez=x>KNN3QbVgNFj*~91F%*pxwfj>}K#RHnGW z8=`azMIe5C-1G#-Go@2b!E#wa!#ErWjW!MP$eR60Mv$sHXlP-(=dVF=1A@!O4g_TN zNI2B_+TtQIqK)>)RJB)b@8|Mk-(v(~ zn`~p&6}A15Ql*nY*z2GcESMS!psjvRD%)VTP!DwD(8vGAP>g$Kj8LHV*Z%uV!KXg* zy>kx?rUR6L&)6~#)2Dr4JN@-qQjBH>cmV3E%Ye-Z0x!&g*5sRZiIHI|1Y^sJzII2O=XTAwcU~ ziix@h;;e{_O-|fi7R8(Q4!Qt{E>@zHtLC+)V7Y(QW>Bx8+gse!v4A@x#}*SFVn$e} zalkZE^BD&6h-L$-((TSi1LI#rxHD@r)V@aWYiC}(&TG!oD=+K}7+BlTZt1DKe>*#& zmJN}%uSWtW+{RFWR`{y`A62^|sxnR7rSIj=?em$W{mo{=0U{6yBzi-&ae2{@3sobU z>SN0n^EaR4UKl=iR@k&UG16FaPr&zHkQrh3771L9Q`6a5kzb=T{<`F-&WQs9hITIn zG2EDH7#>d;RLlAKt(NVAP&I_UXvBu&SVa3)o8p3QlmkPspv^W}NE&0w&~YYZYuId3 zA{q4PDorLs2utVO^AiV(_uTGaT ziYiHtK!tHqGSYb`$LW(<{W{pn`P0RH=vWxeOB&%#%vFTYm1U%mF5in~2^go~kMN_Y`r!Zzt2WO*c7$)hXo|{y!XYc#Bo`w4#@_mPHU} z76ps6y<^)UxVv0#(+RUmzWOj_p`#L;lG?>en7KB_Ys-2WL zzl@lABQJ*`dP(U0%khYz3rZ_ZdM59uY-=4qkm9C^lMn?Lm+W+iUAnL+Qj<(q?&(53 zA8iOqs}u1Rh3zCG(Omcegr{>PIPZtC@W}FO>h`H zro)8nO(@Yjq#8%e>_tZ01R(|H=m^uqP!$LoRT88xR)tP9PbN)Ts(8NO))KxqtiXva>DQ9@;txIB>@>h?4stKxY0?)Qp{3YEWBi)v*}LFtt@97V)yL0m1FO2AdWND7poFu`?4hcp^-YYSjHI=6-GleTQ57XoI<~x&;Rc-t zhvP_juR*9=GUE=@X$8@gzb>aLvS_ zH#fVG$IZ4mslUy5_G(>ii4?5)e;$232ga{!L#Qj2Vpv(iXVzb( zeHp%?;(FkO3^OX~s-Pa=l>60tj&6IFrL#XBxbgVm!;cKy2(dQRqSiqbsB49v7&$KbX2m@B)p$m9=*FE^xt5f0CmLFC04Vv+n*>-ax`8N}rkU0(#I`6FPNJiC*nrI{_Y(o<9m&xAG3n4a?05#7XVSthEe_8ABquV4iFX;~Qt7tE&MGB1%R-X9ZI>JCtFTEd((qNQ>)xR-j_!_x-SRHJw5*dV8cz z=6&KaI+8V9Pc#ofuolcaWsBw!RqreHul~|nu7~aXyfS@#h~6$Pn~7qYl9e3^NtM82 z0g0yQO9rprV|}+LFhvNwJUo|`K+0@&a|avy9Z`+0cye{Mj*bW1@>klKhhEYh522<= zORR~XQVPPHMz%oJ;F2Z7l^7C1 z=Pyka#NxXqi?m=a6AKLBI36>ISc$98sfhYj9F;Ms0H)APqUQXAWl2@%leX8IeX9zc zMs>PC9FbJgaIMk$KWvUb+cese>G#DV^-kV!beeds)-R96iPZ_ZCeyq7x#Slgv0N}p zkuVxQ!+KeU>XEWDC()qb@Hqf7qIo!RCUtn*x9;oOt>%uM0s*^>NV(sJZM(m#0@4ysWNQ0IBa%pWO^%Q7#fjwj9}buq zLoH)ng&!6pc#;x+<1$RdCjC%x9#%`0j}ALK`4XK(#M0!bV5a~A`wz!4U4p?k`z?45 zC>l6eR0^1yryj_}!675ov}-~RIjD(jK2dJl+>R2Z*VTsO(J|<@J%qQ5#|uji1{P`Z z0#c3?p9wsB3!4bWTe9!x9Yio6+xl|xBdqUXqS7GLw~Pv5{<3Ix=~DBb2I6e zH2r>|vY;-$@3E7r4i4hPB!de~{KJ3HNnl7Rz{Y+V6S}h|F3Clf6c#Rvma0~$_h{a^ zdY&)WMB#Ew(p8@pbfWDn*H{8dDxu$H5Loh~oiL9S`!}C&(wr{mar}!^*qfNDUz(0uMFCt(KZUTZWc=o^?dWlPKk_WG+8bbe zHYr-+s|fMsOwcn&f{0?epQd_2DEKhwl8D>?Dwc`daK|Ra2Mi8{V%=HuWWqmvClcxH z4Y~*nZ2rp@$w(^`MjNWgl@t!6`^)dhlAJ~Vf>0Ve>XACJNkKx6^Ph36Dx=Q zM%Cj-Y1I`j2!a|aD#b2_9HNam^(n8Y%po0%RFL4|9S!yOY7(}b#Uw)n5D z;={ZSth^F!r$1ca=B!HU9Cq283Cn9_^tQn9$mH1RP!7M>KYM#Wr*t9vFwN|h)z|+< zC4xuvnA=r0V4(a*KHR(2y=N}RI+Ijt!e=ug{eGWwjF1~ostpTMzc@|49$(*1C!hoy z+U5>raj=v})}0FqU2-sYiz6c=x!+`oQjHb^tHXRfO8QPqGFHl z@S$8Nn2R2oNPz+Tie$$ zDWMowvsjy*P2v9eB5^qB+_Qd#Q`lauFmD91z>RMLKr+nCz_;*c8}Cj>N4b}ll9ylkwYvn}bb_0j+yx=X2JGG_ z1;0!0<>jLNg=74U^vq*kJo0n9?5n4dqnq!rHfj6xIU|JrtXPr>EOO)kgF>-{7|x0$ zhvnA~$l^HyY?J{k3%ZPm=#Io2CTFKY-92ErTG8hL%o0ilSF0>KP$i@j!S6`W zg#bA58#rX+UJvAx!@dNl$^k(st4D7ypZjT*-r z38Fw@Ld$?wJn7kji=Z*7)Su$R)3rltuZuATN1HDn5QnK8io1C#*2Ck`tgBAx{_b+m z!Nr5^g5VD6ZU3d6Gg+ivEul2IV9CneXz1&Co$IRuMsf`L!|t+Q5|e&AOpMH8^KSmf z>=mU!;3WnUG3gI&%0d4kHK~L-=pyRSc9^IEu@2;E+;brDqf!)dc%>Uk6ef{*OU{qZ zACXtXqGcT0MJdCxqv3riCil&wkZaofn27khxOYg-IvUtTEiJU{F}bJgPLwWQC%H=F1|dvV6 zT~%FGQ~f-Pb)^0RupcJ7E4I)rnAZ?cLxKI2LAy%e2IkBn&{`edgj(o+DfR3C-xHB$ z1vxIX&!Y-^tZ2)Y6t&L}Fz#&tMW_JCay#2giCADPBTg_#8*^gdy{yv7>acd45FBVr zLsiFmT<3~NC|zJYq@@)VzvsJq3tP* zHU2L`S&A7Gu0JIqCPiN0XNsga+-*5sn#Yc(^CcuJm7p~Pd8UX#wN(aD&!=qrY0*rc2TAo)I5af#RLbMiK8r=hA zf@=b9^+57)EzG-ricN*L`|ZbhH$wj>!mC3V%!g00eK&g*(jMT7WfVfhy`P?Bfx}`> zDJx~;F@y}|bXG^3v~n%*sSNAswDB|0jz!ZG%fvdNVC4+j z6b$?=DxVSN9iT%a?>N=$9aPGyD*AF4^y7+wC-pgwAz=&NAII%V7!I8_sWIXlN{V5S zq7;ooOhYON4n<2|8GefLKJOlXd~_AIv4L>*efH*iKTkPTz5vro~aI2J0=vHZOi}+ zu4Eb%XwO7>PmMeGLj{u*kiW#>?Uzf>$B3>F#w%Y@R81K-squG@2rlS~*r|9fC}|`#ZNlB`z8h!ntFc3bm_`N5N?XZCg%#K%=(rZIws3$2nIz{t8cl`O3iYh;L zKH0i@e&)awF+2XL5e$X= zF3*ZRMP#t19xUWS$wDf)_@h-737ppACaEHBWEFKT=d5dDSe0n=9)NA*VAN0kMOMX# z1&upAT-vvwJ>Gg2yPxwSDC6vWf+3+i$pN5wIPOif^S20~RvF6MI53mh7Tr|q_3M7` z-s(D>xp1~LI~W-GcIWk5T@7LgAPVj!SBEK;D=m%LzdjETNL+++8$ z#$Hkusw*K@8fLK~nW3 zN`d!jC7>+P14%IFW|jEA=39yE`YNUDEuSz@oc)xFbzDb|*ft)B#I$=k=73n1lAN-7 zyh~nfmp5Y{?%okE51e(g5JJJwN!fn448Y9Xq4)R4Y9sq>QuO$X!G)5i>;p{f-=ax~ zCqmGkrOnJBHNVKT>vbx+;U0wGS%9uyB+#UdHIcqL7)YjHA zH;eFR*j&e46C5o&?6aAtwmFd};xfPcMd--7{WazF*QdRS{>kI#Rkat~!OnvG{PUX| z2d)Qbijf7!Qv+%igCXeAWVXkx@X9l*`tjk3o92djxR`noZ*T7ugQAWTpOVc_G^QsU z_|Y7U+rvj5m%WLHf}X89mH}#1LcN=lm?maK8b_v@P>j#8h<33BK^;yM{r*p1zkZE* z_CXpW;k{-uU!mB@Tw&tQF(Ghml}hgZam{EBBof&swe2QOaBy(AM;Zw3Nm_n)S|4mw z`C4Y$-(vYJFBPW$X1kzkwj(1IqIMt)6gU*+5tL=msVpwi{FceQ+Q5(&5!bO#NbyHR zd{{x=v&B%mV;kjZCCOaXZ{-9X+d{~A%&0CxgvHQSh-5%9W8Q9XOX?HO(qR+;*A(~r zw+nM5m^_>L+B~#q1l&T@?b0_ttWm0gfrBG$XUAw^VKGk|niC^mGhftH$@g;e`-d4P z0r)ImN_hk_pbO2klMKMd1|e5O=DM9M$2y3?y2bsL+Bym2xp2MnGYkFCY&oj02r`miMf9S-Ne$KDx4B&iskg&^sr? zthK6QCh4}2Zr!S04`nZQWzV;rgoH#RO*wzOehnJ$t}=jSL|z=BTU7b-iQt_Exv8WX zF29G`M`Vy#FA>xQ_or%l1?#bWyh^Q4aC~4X{t=eFt@lQI01ykxQ)`tu)ZEf^lnyD6G))iVh?JLZm_Yj0q8e6?jMKWQS=+MsIuTdy3;A7811+KmU3?Y zU71>G#HUZ@$={pxEuo;H^^ecGLwW(+8K?@>R>a(lUXt|lYt0|U%KM}1$(@}qR4Lz{ z5{yre?w>Lohg!YBfxm;HVxR8b6gN7+n#`A18(rM%|8$g(s;NI#mUtHKbfwuxBZA1K z6v}!-$gT5!4PdX2#N$1Wns-8Sx;xgY}&DjsJ2{B#@)@s89ojy1lK9xjFg- zA(yZ5JtslsbkD$Y6+?CZ=;&xVj_v7*R$75J&0*G@MrwB65(N zaF-0HoD1u3Fx8GZ1q5Fr0?_Tl@1RK8y{h^!e;&g>vG8zkF5e)l8>>#V_V>Rp9rI}> z=P274WnX(NkV~YVFPc~WY_k3H;n!^G;tv35D7ocFszqdZQ>_8!R&7^00JUYom(~Dh zzwc*dkaLSc|SK_I7NF=Cl-+Ge;~*@+ zYGF#(7*uuF@}|ipxM@Z*1g56m`2HT|ZEI5!@H5DhF`uvSU^L)uO1mA4$(Zjh!ZjTQ z(=IG+RI7DBIk`q9aOWO#6m?0&CX*jwr?_NYKCiyW53U@06@dK=;&qh zzSwIx5fhlHPNP^bIctVRdePruG^!eu_skJ6VpdiIZXC9Xq-gj=8u2*7Y{1sSZHitG5+DTSSHtVtmr$UTB%$HWAQ>Yb_R zr|1bUXF}mI(f)!R*96s(kRB6tx2bk&7kIKb-!^1=zEA)lLB1!|piFQv1Zy>~h zjaGXDg!(SG>9`1BtqKp*C2Bj6BL@`H=4q>WD%+d%r-vEugFI#L`$PO_lC_vB!zY%f z9ZOMT&5wCyh=CK|zR_yZAD!rJ1;39j=aV|1hihNIe?dN6Csq~_IXam)$(R&dI|3$2qVJoNH>81-No(h>#3Ul$_Vmb`Wqs{F#K z7(|#uiM;s5zd*taW%r$05X@C?qNQG2sEBgH?Jd)@*Mdpuppq?JR@Fplc|3P9v zz#Y;*KdTqjT`@QHeYS4eY|N>OXTO)4EgVOYR$&MYY@tHE_Y88p>1~F(J440WKr)l) zXZN`bQcN(p)m>C`Chk5Yj?W1fi)Xs(S*?@BUYEthl5w?{@eEgTt;_6h%DF9;Dvb6v5 z`nrS_}X|WAmaBVG& zc}oe*9gS#0pm`-_R36w)6e*JT1}+j4?{lEem*}@2Q!rDmKc%L|gs=Inudm$JyWEkDVrQ@5X6+#6pX&BIc2i<-a&ZJQWqeDGE>y6V+Im3x;6b~xRtY=j za{2w;$I!Z+(`FkBqK(>*K)eJwq^$VW=SYj0L>Rg2?kx$qi^?c6;q7%O+S$hdf22gS z6Vl7yfzCp?Er=?;DXsl}S;1u7M6KO+rq5()CZ}&}PQUH>!a6J?dgi&(S5a;X!cC}3 zQD6v-hrIuVp-ou2Csc>}yUcr7*fq=^V7(Fr+!zcz*au_KO~{BXZFz7T#@)4X%@*FH z)f>wFo@E%BCWyp`NDHP=cyTj+BE=B@Q?onypGx2sB`9jS+~lT_?mis1LeoBI{56#e z+`8zu1B`MAQekL_v!dM8?5r2udQ}A;sr7v7p=)6%1uHeCXI7Yer} z_#?dn;Hm?2j0H|!#(dCsth|qeW+s#JPWvEQk$SY3sCOhpNC?%4VE1#Vt0S1Wb=p34 zIY{3}0bh4?H|_;a0xlwD*A@gG)VsU8#b&?O(hN$4MI1v7iVKuE#)3@F=qs^)XzRmB z__u7}=**4tZB$O$$;_{JU1FA7-PLz&vyn}~dy3$eW`$_x=cYG04y#QzieBDbLJJ`t z+qNw?1U8wg)Q z2l<#V8-dMXwiTqSP2au}-KhlMecLV};m(9X*c&CoQ1vK~4nyFLh%{!)8;ro=`#y#4 zkd0I_5IRil=8R;!OsYWf)Q4b+O0b5(GOB3)^A}^!JS+XaUICk0Xt}Xh(9a4+QDhUN z>*@gAPw`f5kL>>4-P&zA_OPB&HCuMZwV{`Ld6iZHFImxrl&FA917ZIBxX(~FSH=Lm z;{LW(bA#^2MX2wI5KJ>5Dh_8SAC{xs{mcnc5zk@0+aqghB<8;tSJ(ilhl@<2)!{q++&hwlAm2!tCcTX4MRhM&}t;|ymXP)pScEOR!|Sf(#@ z>J^w9t;l$y4-ud*d!+~2r{~TgPJl0vc>sO`;_h@@3rFdlnMAAf-tJ+Mr44&SgEoMDENAZ!i7K&<(xuY0%;DeW!0R!~rQBT4f-bW%p<1lt1EC z;8nxW;EkZp^i79wpDPpmD|n+s1zHOqB?@x*usjn^c1|V4#hLh2_kTJ8=YH5T)$9s6 zZCJ%XM_%&jF89In*h}ijL!#HVCOv|ip@tx&N+L|><rU7&^_i4(gUC)Qd zcB?$-cCWj0zN=99CeG#yYZ=m)q@Ze%V__PYWI2Qd&vN?})^E6v_FTu047AI3{UwCx z`y+!?sT%qWc@k!E3X^nckeIAcuv9YcQRRww-neK2G`D*LEWC?ZyVi0*N0`D_tn1tX zBiF!OMJWYht!lh`y2YOA#ub0;i|)lBF2wB_=>^Hy&7tCys9?s=&;O+p= zvJVRS(a<5?hxP2>$;f=Px7ysltYIQ{hzwg73q%g~+my77>00&!|5OY?phXqUVpfY= z;J2rfYTAGyY>`&SSPUY=jAlK`mCOx+8S4APAsg(a%LSJPsr*ji^X!$BEaGPv!O&C|1g<21WxFi@cWkeMgA5(`x`d;$~Tw3vM$H3+aYC?#IJJh(aRaF?iQ~y|sDL z`}_A$;u3%l1L!=u2$Npl1(QC+kgU?4wXfg>06@|;Yn4q7csUt%E5Za#o>+GS)kUti zI$_ACwtfl)!4+z*ep*%sGhi+1o{#K0X)wg?rUo!r+QD%&l(=1M4BhX7yO7XK-~>MKL%ou=>}JdQs;_`Y0D0{eep_F z52C^dU3>@YC?R&RF0n&NL&c9Qsp2@2&6F;Ic@L<9eT;G~=?g@%7N_sUIR>6)n|@1qxin%pL-h{P>f$Yz+siCY+ekygCSL*d#3Rnv?qa zD`-xyQeTD(@{M$~$?izfF~C>I^&VX*1oWR;fO&&^gv#6@AV_!d1)v$hARdQR&WO8C z&}6wCO?Tib#=#*{wNfA%Q|54Z+)ei{N!p4!w*s_MHh?jgXL^Lm5bw7 zB=^2`;bjORLokBR4-%vShbwHNA#ihjYjT-k_ww>WCn8cXF(GqlM*7izva{~e)C$ta z1su1dd_J{M2uQuVYqqBS_vCfKoIYjIE@f1(5-nX(A0)4Sg;i0wT#xGVCc_S1<|c|L z#DtN#Udb1P7UzlU5?Z ztW&Y=pFk|KtJ4B9WFwdh!K8_k&QnCFpi_UAm6jHUu$n9aP-P}_)gl`=_j8O3%->px zS@Dbq0n_`t!hZ`EV@&B>3Lignu`beh-5WkIjiqxeP~X8O;l!uhbgtbg4?@__m5SU@ zJdMv2*|diPyInPU{qQH+ElTLjpPC!w!Y|zcn7N(;c=&K6h-^Ol50YL-XrSvL|8@cM z&zquf$VO1cYlsrn;#PM+eA1+kb}3ILjWA6tp)x`?4dRgBG}bFo3k*kQr&_eZS_=Z` zCSV%nD9m7;qS6!6mEV0vt++qoadCBN3RpLwNWXI@GH6ZaVrhpFl~M)IB_(C9)FTCo z%@n&HT~6{`kN^g#YThKRD=)fw+FBjzD4f)2;2p*{i>xXF;DuV?*EyfrYfc`AWtf?4 zzvPS@A4G@(qc{cTMs80XYAjAFa1g7EUzAEfv!($gGU(&(TS*ig_6P@f9V) z{M$lk>a@F=79y`qeCR58QBUewYdNkCRko2?5`zpN1($R%OT! zfh`J7-1w%YZ;$v)Vd3B~bi(^1Gqi%sxpYoVC;xh-GSsdhnS{@j!#?_Za-NeGtocZf zR_u@7F*3LHw-~A=3G^}y!7-OxPfx7mh>t=h$^=9spy1Z;~)2`+hK zFf1>qS$=t*)iPJqcS6v@LWrX@y(+hDYd%YrAs<}GrBPJ3@`fxvtDsCP>nw z=MKTZqnw9BAxB7-*RFc>cbw-i$yzxn!8$ztRj zQa=l}+L#dl1z{A+6_V%lD z1_WR8QhqeCuQqBd#n@q>y|h~b;kHk#E9|-sE$W?@o#&BxNYAE<$9Sy~ed+>qG&Qd# zGQ7){-8Zk}S!X;PdYH88M2xYFmY!_^lSu2mGC0DI_Qq_cT!E)9hwy|MjUnW5APCq0(52rg;s249x<2=_ z#2LheD=j?gou3zYPVFxa z70n328NFVm_`{rCSDY%)>+RvW5Jp2m0dh5En3TV|XT&IFyYMlIzVtaFsEp<&8i2|d z`6oD=si$OF``4^?ioV$lF^YSlXl(-l=zqo(7}&7^0h3i+bV3T>8auu;_!isL6-;)9 zyk!XZ+K-jJhb};MqA~i_?+_VM&;St4ZJegfbic1E|_DAAYPojkvWPGDD8j1~fA1Fz=gud7b5-KUxw zFD7M5PG(yVjJ&L}0!*KRWM#m1j&8eV&5=>ldz53PkD{7fK8cxfvcu<2I&7HPD=64h z=qn^<%VPdib_$sJ4CKm>)>xa>!G_-F#o6`!*rI`OVRhk$gr>L1&Ku=}CWpEzVQY~H zd@N6(ThEZr+m70WIUTy5Ms`zK=G6Of@z_53x0}zX=U&ty&tWaZ_A&csjEP$KPdZ=cfIv?o&tMkKz@P5JNF~t~SNGKp1;C<$` z@aX8c*b0xt=c$ryC{I8lPtt;V(Qiu+^avX3Foz=F+dSBeb($*DVi>|a4J^(xb|U6BHa4UxQNFEiy)&AE)pJ?GJbz51iu8A z3I@@qEjqWud>Gk0b#-!#kU`>)DyK)7z#|(b^FM-&MlT5zqd%y`=|73pkY%09ynmR5 zuT?xBzpwoACE4YrO*fRwIb{9M)5FsJ#UKPwKvYm&Q8>leWJaTG31I&7oS-(@@KF*Z z|6?FsfRxQYE*lW)Z{skUtOmozG-;!}S;d7LngExS)n`t`BYqq{t3oN4#s2`7D4% zuG3{Z{VOP0i&T$-;)nWsT&BfzAN{1utGlMx&qx@2U=j5ijB`aacG_@9xt1cHGu?)YKV< zdWD9~d`>SO2v5?mW32tS=U%ZAP|wCnRtB@DqUx}slXQt4(jIE?bg>tF>8aEDO4To% ztb0rotrKwU!mMO_GgOmPHxx7SNgIhx6v$ju;MBu<0i?A-Oe5>yiK7%2g=A)`sokj;k z&R<|~WJ~lrFAF-~TW_x?QdUknnT#w^c`FLzD~Vw>uip@ll>~S{qumU-d%WvBL@hWp zI3=XI{y0iN(4+EKX9*1PiFl$%%ZKL)56J}YdEAY6U}lt`RuMop9*36pk}=>@XBX0? z$HS6x_IPf5^jz6W7d};ei6K9C3^z5i-YNTr84I^nK&GLuvVbtRMuAZd{X0P@8 zp>NgD9^O}g&_4@dqddrpfPBq?W;l4Vf|6MwO#3Z=IY>$nTuvAx{AVX|HQ?omZNub0 zvo)?6dStAc-W=2b%+&xRv4|dgwz`iPCoF`x~11{$t70@3{5QI z7Z|D>e#M0;tf33OHkeX(lQl^+e%X=dwtr%_9e0w?Vj@dJrt zCNfze)PgAYwYU=#$XUP%{HBgH1}VD=N+M~wD4JqT+;!rYTc%D;(9iEjKXJlCF&cZE z(3$tj@B!7J$E&rlfxRDY(C>~pmZ2aas3)>Ur8XWd-H=4VrV0`Ld^!x;RXar)4!9uZ9-I5Ru&fWau9~2k&^iL+S%BUb8*e3ZUcK-!!j5!e?{JIS4B*H@%j1W zb#*XZR~KsO{r1lXl-5nCWj%da0HK|M2bX~_EmL)ZIlH5xB5{6deck^@+^w*O>qKgW zhNUM7S>mdb>zw-p$3`GF%L*f&ef;8wm0%CAN<@E7lm^Z2RfAN4vF2en3y#?aF?0CY zdcJRFnn;}WJ+bo+ED4BO7=@I)Z-hHwtWTXB91NH4{|xFel1)dFuGsCXF2R)&*YIp| zD%o?_Q3v}aM6fTx1+XJ424_-Q{eGyK0%>ZWH5EYm3*u!XE*hjcWYsKaPKDV+E(*5n zPqNZ1_GGq5!2CMGpI?WP^)vS5SzyLP&i*;=<17 z?QON|S;#V{CnVs3j1djPZPYj1mAUUqi(KRmyDkA3sO7vRRZJz(&ESlRfoxG0m;@;3BI z$S1}m2`K1NQ4tjrg9OSbw&HLBf*oC)j~_p3Xlvg-JxMUGG(4QFRZNMv7#8a#OWm^Q zw|X!M=fsHvUCv^b3bj;~w8oj?Ay}*R;p!cT-5upwo!a*fc)qU2=eNa5@jLqf%|8j3 z%^Y6*vQMn0rmiFSBHrQN4OCBco{0~OY>uegRbHh8bV=>=5vETFRZpsUwTv{UU9aX% zpj7G$WG%+Q(6q>Z%dDhrm>2cne^eJ)i9F#&Rp-d9fZemoddy7NcDgpXTX5iMTK@qt z`DoA6J>C+J^MZC4cJ&hcvN&>E+}RWMa0Z(R#~>n-^Xr%G zqrXUly}E&cg0wUo5-xKguvHK!Qqih1SlVDb81&mH%9A>@6yp$aqWK2FRO;Ozdh{VbWY!OU+FdDLYy*@yv*YaxE~){!@6X70PvC5^{@ z+0DuJc9sAnZNN4P!O<_Tf+oDcc=e*sJRJA8RBrO+uZuE`vDBhV;r?aUG>MRse~0Vs z-Ip&|4jq3iA)-EgT59v=fVkWn2VQmjaUiI;TPqTiG?Vw!#16kbh9o1Wi)=_vKEGUb z-fm+=2^1*qzREj)5e_^dizG-P!vVah_4z$?>;X8dM zJ3h9P)A7SqOvMtzt`(!>iU0A07Fp?6;Y`@T1PrrGcuKV!b^QzL$_L@_hSRhyAVwlEm+rFCih}Zr@_V#H_lLse|K3n!xoLX)h9~Uzj3P z%8tdQitvtS23nF?_nwW??CqjDOQ8K_)=`zEOEs81l1M5v?7Q>n;f^I^$-)!jr>H2M zZ)O0+PY(R$(Lyz_AtclrD1cK_>#4OEHAn(Cq9jLTW_Z}Ijf7WsAd3FUa7;*#@6Nkj zhc=n#T422xr5S)UO3g$_sV5>E-WSMg{`I?`agi6=h}JumGAHiO%h4=SBsE&_=+S6* zLyT>euCV_-dd}Ty+aXOot)DMwl=HlmN?63qH9tHp-?Zv3TK60eU#=J&iloN zSAuGwW*0sUV0{Ma$pBhi@8a^5*cCW=aGov}IK96wVyY65&7K)Nmw{;V;r%xsn!dL= z4h=1~1;|TCK+Ce-JI;MpEl73yvkP%Yqf{t_M@hpe&Oa8|>}n+rHbp+@TB~&Nv7d3O zrBhj2T3Yqq&#EFUXLersk5kn5n{cqiW(JSTK7GMLQp3{Ha*SK2d3!MNL+q1314T5X z)uM@%+A6mW1;&Q3|2}c7?>Qs{wuQy4rpDFcjcMP`uu-yA+nW!!{vDM)8IC^)K<5jC zB+#3WNGy~rb*qLu6-RnfC2*sJfS~3B^7@Sk+%l)4FYoTn2hlOBQFC&BxrIsNqq~ft z5DkJJjQtp3q=Pd|N4K>f@;3Tlo54H>5U8ox2ia5AWjt~R!hfYE*~@D?6)@!-Pe;bL zEy&uyAJZ84&|xyS&mOT0=0!|78J2_AqLrGP$*=IEfbo>Y~ZP(;VOLnx_f zF6Y&iA)SES{FqVO;^=RRQ^ySMi(e9GkWO{A39&aGH*HrK5V$OcBihL!P{Lq!g$b1w7+2exwt|23H=ieV@+%tt&$4feH#slE<%B#?ytlFn3Ol>k zN02%IRP@ujQws}#)@$r{K;BTP4=*aAh|*wxxm*wj<_U~Y=Jf{R#NJ*fS<0-|6?boEcJ|!cQTPJJ@gv1x+0z3+ zL}zk#a{}S}M_^;?Q{IY`#_9U_*6jxTW};!MjEo%O#v?C_NKSm72*!rbFS>Q#-?9+G zLQW8YXr9LqoAUB0>{i1V5PSZ&tp>hp?htM;A&U*f4$BE@O3t@7@j7!8!;VQa`ZVb~ zuYuHGNr(a|8z)Te+kUYbNz!IF8^MAA?0ev3!N6(x8G)^B503yU3=}0LWoQl>J|BiS z%6#D{%OI)V_2R>I3%3rejDiv>k1spxYgkrIy!;@@BKNbQTMbzA0lP9y`1b1E!xQlH zlzscr`?ANilj6b$gD(n%Vzur6PR_LkpcRueu-#u>vc3YKlxeuQk`8BzIjkl!W!mj# zY5xiDfDd_1P3&Zgtp%ARFcvu55AgVQc2kTk0g&;!y1J_uSU?~fRe$0~$b?v|a0Aq< zv$L~Pi;H-XDbf7@W!_RPyc(M|ehNv2S{cjBBXMzY5eaxiPfYlSW!dG%xSGR^)-vKS z>WG?}no=4m0nbHg2b9?vI7`>T4|O4H2->+qVLXoTFu^)XO^MP0>S^TSFdK^Z!4@gFwP!?C&~ip zAygDVx`BmIDwO2k8T{|3L{hTCHg)Se0VM+w_y6%oPr^EYDT|DV7-}9Gu&G+*)FGC9 zj|zN|E%<+aIT|(!B=jF``|rE=O;O&~*0LiaBGS^*=2lcN+QI@&MPxRg0&c~Q7GDOB zV^K>BLFY!C{oCT)?-pn4?a`znBsr7&?sUPJ;QJ?kc6RnQW+^9%o~tXjrzD4nvNC$c z(Vny04~9{jlA(%FJ3zrEaN1NbIGCQEeg{MnL%(-Nb!*=tjHa+y{rSCnyxPp+JMos( zukdd?!9V{k*8TYYZeHK~??-xZ8DgoNr#EML^boeImmnBkZpitE#Ju>+6%Eqmln! zEGnY5egA%Vc$f{y9{urJtT9!{5f)n2erIW^rmsKBwP4U&`grQuxxe_W8e*7tT-`WM zj=6=lD_=@G>-Y7}eufrOO78L+b!L-_N{|&=4}d8zgz!r$FxpvjI>aJCSYFZ#lKr)=jql(O)=_8 z;UV!~_!LYx*}oc<9fMiFg6U_s{10I1)c+}iK*9*nA#MszlY(j2nE&g_RM>Y#iGcjZ zY3tXumV&~C`BxNZZJnNmUjWd<|5F!pHAA!iOGExuXX}=ktetGUBznLMVgL&1s!4cC zP)v5ZXPYG~6>0|auRZ!l^^uflC}z1)z+CRXG<=0~7A$0jfax9{a&q0EKSX&D&{TUzd;%OhS_SHO5^TFska*CUPA0w_TXfdq`B4JVL}5Z^pb^n8U$f$$aDkM7l8;>{Jlg@Ay6mX#FK zNTg?Cve+Jov0JR^K2p2?u22r@2mMb&tFjugB73SQWsURt06)?GmA=>i1~b04W*zze zFw9MP5h~HS|FL(kMz=qviTG7Gz>&#-xc*~y{+$!xBMNZR{_p$#e|!VpN^pf$jvo#n zQU4fWJ+4gecb1uXP-8y#8u*&kw0RvN$iJ$L}=vz~n- z5r2chzc#l5Fu#k}7w@av=L@R6o~{=V;6nO>g$Wr)Yik%89tBxg&{i6n&pIA-zFR8Z zZ39`iwx^pF!RNbe!TW=Pzn{Q45x*O)uaco*mg?Z{?(UXmDD^Dn*&yJ;Dwfi$$1yN4 z@VV?nuwC~(I0LB=FYG*o*Hb__)PM1%#N~MJrIGmc8$bWX1sHTAV3YmeFiYv_>0f)Y z_!|AbU#RNezXUd=;$1*V0jdh|-zkOjmM_nY0zltuYS2e(foDVkpy!n9qW;Q=P4S#b zrG6voN`r2r192j?Vw9Gm)kkguu228_fz4AlU4kd}uY&$-9Gk$6jU#}h{r^bR{@;}a z+z2)`H-FP$|7!4Hpdf+Dwl-!7abQT#|M(iEkdxcLde6In`wb9P$qaE!3ii%d>bC>Uc^ofx55y1x zr^vW~Hw9!1O;`_rHh)Y_iMqOefBp8w_8|5WL1A8=*qbOg8#}ulz%m2(5BoF(O157S ze0jXAFltW+s-L8OQWY>WF~#icysI9?t1*81r40zu&=ETvBL_#KSO}cA;XvRTkOTjc zl=ONE$WHvLvfx8E*v!0^ez!53cd>JD43CXnwM0V#&=rKhhVZ%t3uGN2d!(zYYm~xf z(&}+y_H=)3l(IFFE%ZUB-G?jSu9p-917(!5Ehh<>x7wlMVN(EIL9fLp`PGx)O66MNL(;I|v&7bx_O7%a__eG%i>)y~5}%ely4CbD@lkj0D<@ zvUqD!bQ|Y?^=4#rG>y;IlG2u+;Tag?i@9oluDus}UjPavjl&8x1Rm|C6WCj&;H@atDL=bw_*^7x;# z1UwT`Q)T@9I~Kko4|VuGSlif`4n*U>e)Hkxq@buMtl4$n$8aQ&NZ28Vtc~E*0qV_&u(7e(UW#7*iM_Ia+#diI#LG}FfMVv=MU9YI ztZjPDJ^>EC-p|@@Ktp?K84;0?N~@}FS~8n7jE$8|O}7w87wRvhb#?K9dI2mftScSZ z(xa`ce=MYr0j43Eqb895Ts+rYkhsSHUU&oRW+IL9K!bfUqizqdbhR2x(cm~gR|EK$NGi>0GnGBlHR~mX3Bo}%=tTjGPU4MS=TO+Cn4u;}(Tqp8(&`owo z+m2rs`Cv$RHn*_gx?t$}&0&q-5KTfuL!$-|8$f{bj<)iun5g$AbK>k*?w^1bHYjh` zJ7Mm>o+||`h%f9NKm3^tm_XrK?JAT_bQ2QP0%jhVBb_>HFp%pdH6MtczCNFVMicBB zNn+>~@qF@^5lQYpsdQ;!)T0C6vMhn}=bj-}BxBHbxmGnnLLehG?!t zd@ex0B{rUK8ZRE6wh&H}Ee?HTI)7Gm>$SMi0g?_(2(VH8t1)88!LpatT$v^^i6Gu+ zZI2^G3&}b?BV%7J<9vl~uh8vk!O<2uFphCm`z<6ta+)&!Mlcu_%hnpN^ZR4=?~F^P v68v4ALF)fpHnsg5cTy+-c_%;~LZ1S16r1XPkX@%h0RLpAlq9RfO@jXy_Y0~o literal 0 HcmV?d00001