././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.5017366 guiqwt-4.0.1/0000777000000000000000000000000000000000000007727 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625644.0 guiqwt-4.0.1/CHANGELOG.md0000666000000000000000000010077600000000000011553 0ustar00# guiqwt Releases # ### Version 4.0.1 ### Changes: * Added support for PySide6 * Fixed remaining Python 3 compatibility issues ### Version 4.0.0 ### Changes: * Removed support for Python 2.7 and PyQt4 (guidata supports Python >=3.6 and PyQt5, PySide2, PyQt6, PySide6 through QtPy 2) * Added support for dark theme mode on Windows (including windows title bar background), MacOS and GNU/Linux. ### Version 3.1.0 ### Changes: * guiqwt now requires guidata >=v1.9. * Removed spyderlib dependency (embedded console now provided by guidata). * Added support for dark theme mode on Windows (including windows title bar background), MacOS and GNU/Linux. Bug fixes: * CrossSectionTool: enable tool only if there are actually image items on canvas ### Version 3.0.7 ### Changes: * Added load test (eventually highlights high CPU usage with guiqwt.ImageWidget, this issue was solved with PythonQwt v0.9.1 bugfix release) Bug fixes: * Fixed io.imwrite TIFF support * Fixed image.get_items_in_rectangle function: item_type parameter was ignored ### Version 3.0.6 ### Changes: * Added support for more TIFF file formats using "tifffile" package when available * Speeding-up image alpha channel calculation (avoid slow NumPy "clip") * Image/colormap icons: now using exclusively the icon cache (optimization) Bug fixes: * Fixed error when adding item at specific Z-value after deleting items around that Z ### Version 3.0.5 ### Changes: * Added PySide2 support: guiqwt is now compatible with Python 2.7, Python 3.4+, PyQt4, PyQt5 and PySide2! ### Version 3.0.4 ### Bug fixes: * Fixed Python 3.8 / NumPy 1.18 related issues (type errors). ### Version 3.0.3 ### Bug fixes: * Fixed Spyder v3.0 compatibility issues. ### Version 3.0.2 ### Bug fixes: * Fixed `AnnotatedShape.move_with_selection` (traceback: `AttributeError: 'function' object has no attribute 'SIG_ANNOTATION_CHANGED'`) * Image contrast panel: histogram was not removed properly when deleting the associated image item * Fixed `BasePlot.add_item_with_z_offset method` when existing items are not shown in a continuously increasing z order * Interactive tools: fixed `SIG_VALIDATE_TOOL` invalid parameters Other changes: * Added a new demo [dotarraydemo.py](guiqwt/tests/dotarraydemo.py) showing how to create a custom item drawing an array of dots * Documentation is now built into the "build/doctmp" directory, hence allowing to reuse the previous built doc from a package build to another * `plot.CurveWidgetMixin.create_plot` has now the same signature as its `ImageWidgetMixin` counterpart ### Version 3.0.1 ### Bug fixes: * I/O: fixed support for DICOM (supporting pydicom 0.9.5+ and 1.0) Other changes: * Added CHM documentation to wheel package ### Version 3.0.0 ### Possible API compatibility issues: * Added support for PyQt5 (removed old-style signals) * Replaced `PyQwt` dependency by the new `python-qwt` package (pure Python reimplementation of the Qwt6 C++ library) * Removed "curvetype" feature (Yfx, Xfy) which is no longer supported in Qwt6 * Removed curve "fitted" option which is not supported in `qwt`. Bug fixes: * scaler.cpp: fixed destination rectangle ValueError test (was continuing execution instead of returning immediately) * Fixed Issue #4: mingw-w64's _isnan function crash * Fixed Issue #38: error when quitting "transform.py" on Python 3 * Fixed Issue #19: added all qthelpers.create_action kwargs to plot.PlotManager method * Fixed Issue #21: Baseplot captured mouseDoubleClickEvent for whole plot area instead of just the axis area * Fixed Issue #22: added support for int64/uint64 images * Fixed Issue #24: Item list widget was loosing names of curves * Fixed Issue #33: update color map axis when active image item has changed * Fixed Issue #32: show cross sections only for *visible* image items * Fixed Issue #34: editing any axis (mouse double-click) made the color axis vanish * Fixed Issue #34: editing color axis parameters should not allowed (not supported) --> the user may change those parameters through the image item properties dialog box * Fixed Issue #31: added option to sync cross section scales to main plot * Fixed Issue #30: make.xyimage now accepts lists or tuples for `x` and `y` arguments * Fixed Issue #26: ImageItem.get_lut_range_max() throwed ValueError * Fixed Issue #27: X-cross section was not working when image Y-axis was not reversed * assemble_imageitems: assemble images taking into account the Z-order * Cross sections: adding image intersections instead of picking one layer only * Fixed Issue #42: update tools status after registering all curve/image tools * Fixed Issue #16: ImagePlot/rectangular zoom was ignoring aspect ratio * Fixed Issue #43: install_requires Pillow instead of PIL * Fixed Issue #46 (`guiqwt.io.imread`): fixed support for PNG images with transparency palette (Pillow) * Images with integers: avoid overflows when computing LUT * Fixed Issue #50: 16-bit images were saved (io.imwrite) using the wrong PIL mode ### Version 2.3.2 ### Possible API compatibility issues: * qthelpers.exec_image_save_dialog: reversed the first two parameters (consistency with most Qt functions and with exec_image_open_dialog) ; parent widget is now the first argument, data to be saved being the second one. Bug fixes: * Building process was failing (since v2.3.1) on Windows with C compiler other than Microsoft Visual C++ Other changes: * io.exec_image_save_dialog: added `template` argument to support DICOM files * Sift: * Added support for writing DICOM files * Improved support for DICOM metadata * Added support for multiple images resizing * Updated py2exe example (switched to cxFreeze to show how it's done) following https://groups.google.com/group/guidata_guiqwt/browse_thread/thread/f8db01cf7149e964 * Updated the build in place batch script: building on Windows with Ms Visual C++ ### Version 2.3.1 ### Bug fixes: * Fixed build failures occuring on non-Windows platforms (Issue 54) * Fixed requirements in README and setup.py: guiqwt v2.3 requires guidata v1.6 ### Version 2.3.0 ### New features: * Added support for Python 3: a single code source base compatible with both Python 2 and Python 3 * `scaler` C++ extension: added alternative implementations of C99 features so that this extension is now compatible with Microsoft Visual C++ compiler (was only compatible with gcc) * Replaced all Fortran 77/90 extensions by Cython extensions: * Building `guiqwt` no longer requires a Fortran compiler (but only a C/C++ compiler for the C++ scaler extension and the C Cython extensions) * 2-D histogram items are drawn 3 times faster than before * The Mandelbrot example runs faster too Bug fixes: * `guiqwt.image_nanmin/_nanmax`: bug fixed when data is a numpy.ma.MaskedArray object * `guiqwt.styles`: using copy.deepcopy instead of copy.copy in `ItemParameters.get` to avoid side effects when using more than one instance of a DataSet object * `guiqwt.annotations`: fixed bug when showing an AnnotatedShape object on an empty plot (unit was None) * Fixed `PolygonShape` items pickle support (save_items, restore_items) ### Version 2.2.1 ### New features: * Added support for plot items serialization/deserialization to/from HDF5: * See `save_item`, `load_item`, `save_items` and `load_items` functions in `guiqwt.io` * io.save_item/load_item (HDF5): None can be saved/loaded instead of a real item * See `serialize` (save to) and `deserialize` (load from) methods in plot objects (save all items) or plot item objects * See the new test `loadsaveitems_hdf5.py` * builder/images: added option 'center_on' to center image data on point of coordinates 'center_on' (tuple) * Flip/Rotate widget/dialog: added method 'set_parameters' to set default transform parameters * guiqwt.tools.SignalStatsTool.move: added X range to label * BaseCurveWidget/BaseImageWidget: added argument `curve_antialiasing` to switch on/off the curve antialiasing feature (this option may be passed to CurveWidget, CurveDialog, ImageWidget or ImageDialog through the `options` dictionary) * (Issue 29) Added test 'customize_shape_tool.py' to demonstrate how easy it is to customize a shape created with a tool like RectangleTool, EllipseTool, etc. * (Issue 37) Plot axis widget: added support for mouse double-click to set the axis range Possible API compatibility issues: * guiqwt now requires Python 2.6 (Python 2.5 support has been dropped) * `guiqwt.io` module: file type filters are now sorted depending on data types * `iohandler.load_filters` and `iohandler.save_filters` properties have been replaced by a method `iohandler.get_filters`: * iohandler.load_filter --> iohandler.get_filters('load') * iohandler.save_filter --> iohandler.get_filters('save') * guidata.hdf5io.HDF5Reader.read: argument 'dataset' was renamed to 'instance' * MaskedImageItem: masked_areas attribute is now a list of MaskedArea objects (so that MaskedImageItem objects serialization is easier to implement) * Removed deprecated tools DuplicateCurveTool and DeleteCurveTool Bug fixes: * MaskedImageItem/bugfix: fixed rounding error when applying mask to item * io.imread: drastically reduced loading time with PIL.Image * RGB images support: fixed vertical orientation issue * Fixed memory leaks in selection tool, image/curve stats tools and contrast tool * Curve plot: setting axis scale of both X and Y axes at the same time was not working * Issue 27: fixed FTBFS on kfreebsd due to Werror flag (patch from Frédéric Picca) * FreeFormTool/MultiLineTool: fixed warning when clicking the first two points if these two points are at the exact same position (happened only when creating such a shape on an empty canvas) * Fixed "Edit data..." tool: `oedit` function returns None when dialog is canceled or an array when it's validated (fixed "truth value" error) * (Issue 32) pyplot/better compatibility with Matplotlib: `plot` now accepts lists instead of NumPy arrays * (Issue 33) tools.LoadItemsTool: parent constructor was not called * (Issue 36) plot.PlotManager: fixed typo when setting the plot manager to `plot_id` ### Version 2.2.0 ### New features: * Added scaler module: resize function (using scaler C++ engine to resize images) which is incredibly faster than scipy.misc.imresize * `guiqwt.io` module was rewritten: new extensible I/O functions `imwrite`/`imread` (see section 'Possible API compatibility issues') * SelectTool: * added Undo/Redo actions (triggered by platform's standard key sequences) * "Select all" action is now triggered by platform's standard key sequence * Added 'get_segment' test (analog to 'get_point') * Interactive tools: added argument 'switch_to_default_tool' (if True, when tool action is finished, plot manager will automatically switch to the default tool) * Added `label.RangeInfo` object: showing XRangeSelection shape informations (x, dx) in a label. See associated method 'range_info_label' in 'builder.make' singleton and unit test in 'tests/computations.py'. * Snapshot tool: added an option to apply (or not) the interpolation algorithm * `guiqwt.pyplot`: selecting default item type, hence allowing to use directly tools when there is only one curve/image without having to select it before * Added new guiqwt svg logo * Added new dialogs and widgets for manipulating (multiple) images: * Rotate&Crop dialog, widget and tool (+ test) for TrImageItem plot items * Flip&Rotate dialog and widget * `pyplot.imshow`: added interpolation option ('nearest', 'linear', 'antialiasing') * `io.imagefile_to_array`: added support for 16-bit Tiff with PhotoInterpretation=1 * ResizeDialog: added option "keep original size" to bypass this dialog * RectangularActionTool: added option 'fix_orientation' (default: False, but set to True for the SnapshotTool) Possible API compatibility issues: * `guiqwt.io` module was rewritten -- potential API breaks: * `imagefile_to_array` --> `imread` * `array_to_imagefile` --> `imwrite` * `array_to_dicomfile` --> `imwrite` * `IMAGE_LOAD_FILTERS` --> `iohandler.load_filters` * `IMAGE_SAVE_FILTERS` --> `iohandler.save_filters` * `set_dynamic_range_from_dtype` --> `scale_data_to_dtype` * Created `guiqwt.widgets` package to regroup ResizeDialog and RotateCropDialog/Widget * Moved module `guiqwt.fit` to `guiqwt.widgets` package Bug fixes: * `guiqwt.geometry` : fixed zero division error in `compute_angle` function * Fixed minimum value for histogram display * Fixed Issue 16: use double precision for point baseclass * Fixed rounding error in image.assemble_imageitems: concerns the snapshot tool, and the new rotate/crop dialog box (Rotate/Crop dialog: added a specific test checking if exported image is exactly identical to the original image when the cropping rectangle has the same size and position as the image below -- see rotatecrop.py test script). * scaler: linear interpolation was inactive on image edges (first/last col/row) * ImagePlot widget: fixed aspect ratio when showing the widget for the first time * Events/Hit test: * Plot item: fixed AttributeError with cursors (when clicking on the canvas with no current active item) * Curve item: avoid showing dividing by zero warning * tools.SnapshotTool: * now fixing ROI orientation to avoid the negative size issue * now handling out of memory errors for big images ### Version 2.1.6 ### Other changes: * guiqwt.pyplot.savefig: * added support for all image types supported by Qt (JPEG, TIFF, PNG, ...) * first argument (`fname`) may now be a file-like object (e.g. StringIO) * guiqwt.baseplot/curve: added stepsize in `set_axis_limits` and removed from `set_axis_ticks` * guiqwt.image: * QuadGridItem: allow set_data to update X,Y along with Z * new item PolygonMapItem: PolygonMapItem is intended to display maps i.e. items containing several hundreds of independent polygons * guiqwt.builder.make.error: added options 'errorbarwidth', 'errorbarcap', 'errorbarmode' and 'errorbaralpha' (avoid having to tweak the ErrorBarParam to customize these settings) * guiqwt.pyplot/pydicom: avoid the annoying warning message about the DICOM dictionnary revert * guiqwt.tools: * EditItemDataTool: new tool for editing displayed curve/image data using a GUI-based array editor (this feature requires the `spyderlib` library) Bug fixes: * ErrorBarCurveItem (error bar curves): * now handling NaNs uncertainties properly * handling runtime warnings that could end badly in draw method (example: transforming a zero in log scale) * Annotations/pickle bugfix: a QString (instead of unicode) was pickled for annotation title, hence leading to compatiblity issues with PyQt API v2 * guiqwt.io.array_to_dicomfile: fixed value representation error for smallest/largest pixel value parameters * guiqwt.resizedialog.is_edit_valid: fixed compatibility issue with PyQt API v2 * Sift: upgraded deployment script for compatibility with guidata v1.4+ * geometry.colvector: fixed major regression in coordinates calculations (significative impact on TrImageItem related features) ### Version 2.1.5 ### Other changes: * guiqwt.io: added function 'eliminate_outliers' to cut image levels histogram (previously available only for display) * baseplot: added method 'copy_to_clipboard' + tools: added CopyToClipboardTool (copy canevas window to clipboard) ### Version 2.1.4 ### Since this version, `guiqwt` is compatible with PyQt4 API #1 *and* API #2. Please read carefully the coding guidelines which have been recently added to the documentation. Bug fixes: * Sift/bugfix: difference/division operations were performed backwards (s001-s000 instead of s000-s001) * Sift: working directory is now changed after opening/saving signal/image * label.RangeComputation: fixed bug if compute function was returning more than one result and when X-range was empty (e.g. selection is outside curve X-axis values) * curve.CurvePlot: fixed pan/zoom erratic behavior for curves associated with log-scale axes * baseplot.BasePlot: now performing an autoscale after changing axis lin/log scale (set_axis_scale/set_scales) * annotations.AnnotatedSegment/CRITICAL: fixed an error (introduced in v2.1.0) when computing segment length (returned length was twice lower than the real value) * image.XYImageItem (Contributor: Carlos Pascual): fixed bug when Y-axis array is of dimension Ni+1 (where Ni is the number of rows of the image pixel data array) * Fixed compatiblity issues with PyQt v4.4 (Contributor: Carlos Pascual) * (minor) Fixed label text (too long) of 2D-Histogram items background color in shown DataSet * guiqwt.io.array_to_dicomfile/bugfix: Smallest/LargestImagePixelValue fields had wrong type (str instead of int) * LabelTool: label was not moved as expected (default: now, label is *not* attached to canvas) * tools.ImageStatsTool/bugfix: image title was not shown * CurvePlot: autoscale for log scales / bugfix: handling zero values * tools.AxisScaleTool/bugfix: when updating its status, the tool was setting the axes scales even when not necessary, hence causing an autoscale since changeset 1159 (687e22074f8d) * ItemCenterTool was not working as expected when centering annotated shapes having a specific transform matrix * XYImageItem objects: re-added cross-section support (removed accidently) * Curve autoscale method (curve.CurvePlot/ErrorBarCurvePlot): * now handles non-finite values (NaNs and infs) * logarithmic scales: now excludes zero/negative values to avoid confusing the autoscale algorithm Possible API compatibility issues: * Moved functions from guiqwt.io to new module guiqwt.qthelpers: exec_image_save_dialog, exec_image_open_dialog, exec_images_open_dialog * Markers: * label and constraint callbacks take now 2 arguments (the marker's coordinates) instead of 3 * removed method 'move_point_to': use new method 'set_pos' instead (takes two arguments: x, y) * Removed cursors introduced in v2.1.0: * These cursors have been replaced by shapes.Marker (i.e. objects derived from QwtPlotMarker) * Removed signals.SIG_CURSOR_MOVED, shapes.HorizontalCursor, shapes.VerticalCursor, annotations.AnnotatedHCursor, annotations.AnnotatedVCursor and associated builder methods (annotated_vcursor, annotated_hcursor) * Builder methods vcursor and hcursor were slightly changed (see tests/cursors.py to adapt your code) * Use markers instead of cursors (and SIG_MARKER_CHANGED instead of SIG_CURSOR_MOVED -- arguments are not identical, see signals.py): * base object: shapes.Marker * associated builder methods: marker, vcursor, hcursor, xcursor (see tests/cursors.py) * label.LabelItem: renamed method 'set_position' to 'set_pos' (consistency with shapes.PointShape, ...) * Annotations: * method `get_center` now returns coordinates *without* applying the transform matrix, i.e. in pure plot coordinates * the following methods were renamed to highlight the fact that the transform matrix is applied in those computations: * `get_center` was renamed to `get_tr_center` * `get_size` was renamed to `get_tr_size` * `get_angle` was renamed to `get_tr_angle` * `get_diameter` was renamed to `get_tr_diameter` * `get_length` was renamed to `get_tr_length` * Removed the following deprecated classes in `guiqwt.plot`: * CurvePlotWidget (renamed to CurveWidget) * CurvePlotDialog (renamed to CurveDialog) * ImagePlotWidget (renamed to ImageWidget) * ImagePlotDialog (renamed to ImageDialog) Other changes: * Added module qthelpers: image open/save dialog helpers (moved from guiqwt.io to avoid using GUIs in this module) * Annotation/default style: changed string formatting from '%d' to '%.1f' * baseplot.BasePlot.add_item: when adding the same item twice, printing a warning message * Using new guidata.qt PyQt4->PySide transitional package * Sift: ROI extraction ("Crop"-->"ROI extraction" + added the same feature for signals), added "swap axes" operation for signals/images, added "normalize" processing for signals only * Sift: added linear calibration (signals: X/Y axes, images: Z axis) * Interactive tools: added signal SIG_TOOL_JOB_FINISHED emitted when tool has finished its job + if SWITCH_TO_DEFAULT_TOOL class attribute is True, switching to the default interactive tool * Buider: added cross cursor and marker constructors (builder.make.marker and builder.make.xcursor, see tests/cursors.py) * Added SignalStatsTool (standard curve tool) to show ymin, ymax, ymean, ... on a selected curve ROI * Sift: added support for curve data with error bars (I/O + operations + processing) * Added coding guidelines to the documentation * builder/make.computation/computation2d: added title option (defaults to object's (curve or image) label) * plot.CurvePlot, plot.CurveWidget: added keyword arguments 'xunit' and 'yunit' to set axes units (same syntax as labels) * plot.ImagePlot, plot.ImageWidget: added keyword arguments 'xunit', 'yunit' and 'zunit' to set axes units (same syntax as labels) * pyplot.imshow: added keyword argument 'mask' to support masked arrays display ### Version 2.1.3 ### Bug fixes: * tools.RectangularActionTool: removed unnecessary calls to setup_shape_appearance * tools.ImageStatsTool/CrossSectionTool.setup_shape / bugfix: parent method was not called * Sift/bugfix: Spyder's internal shell was not parented -- this was causing issues with spyderlib v2.0.11 * Cross section/auto refresh toggle button: do not refresh plot if disabling the auto refresh mode * (Fixes Issue 14) tools.CommandTool: docstring was translated from french * (Fixes Issue 13) Fixed precision/string formatting issue: switched from '%f' to '%g' (on-curve labels, ...) Possible API compatibility issues: * baseplot.BasePlot.get_selected_items: added argument 'z_sorted' in first position (like in get_items) Other changes: * added *this* changelog * baseplot/plot axes styles: added support for physical unit * annotations/attached label: added automatic axes unit support * annotations: added support for measurement relative uncertainty * fit/Fit param widgets: added suffix label + code cleaning * guiqwt.io/sift: open/save image dialog code refactoring * tools.ExportItemDataTool: added support for images * Added tool ItemCenterTool: center objects (rectangle, ellipse and their annotated counterparts) * Cross section panel: when a cross section shape has been removed, clearing cross section curve before removing it (notify other panels) * Cross sections/update_plot: added option 'refresh' (default: True) --> we do not want to refresh the cross section panel systematically after registering a new shape * Annotations/annotationparam: added 'readonly' and 'private' options (bugfix: these parameters are now pickled correctly for shapes) ### Version 2.1.2 ### Bug fixes: * 1D Computations: now support error bar curves as well as simple curves * test_line test: this test should have been excluded from test list + it should be possible to import it without executing it... fixed Other changes: * guiqwt.fit: code cleaning / reimplementing FitParam.create_widgets is now supported ### Version 2.1.1 ### Bug fixes: * Distributed source package: unwanted Sift build/dist files were eventually included in the package * setup.py: fixed sphinx ImportError issue when building autodoc from source package (not finding the just built extension module) * ErrorBarCurveItem/bugfix: did not support empty data * Cross section panel: do not compute cross section each time a plot item is added/deleted * annotations/Annotated cursor: couple of bugfixes + label color is changed when selecting/unselecting annotation * annotations/tools: code cleaning + minor bugfixes (styles were not applied as expected) * scaler.cpp/bugfix for float source images: values were converted to integers * Sift/arbitrary rotation: added option "reshape" (default: True) * Fix building the f90 extension on some systems * Curve plots: fixed autoscale behavior for logarithmic scales * fit/bugfix: when the fit params number was not a multiple of the layout column count, the last parameters were not shown Other changes: * shapes: added ObliqueRectangleShape * tools: added ObliqueRectangleTool and AnnotatedObliqueRectangleTool * Added averaged oblique cross section (panel and tools) * plot items/Refactoring: methods 'set_selectable', 'set_resizable', 'set_movable' and 'set_rotatable' are now mandatory for all plot items (not only the image items as before) * tools.ImageMaskTool/icon: more contrasted icon (in order to discriminate easily the disabled icon from the enabled one) * plot.PlotManager: added method 'get_tool' (returns tool's instance from its class, if added to manager...) * tools / New ExportItemData tool: supports only curve items (for now) * tools.CrossSectionTool/AverageCrossSectionTool -- shape setup: added class attribute SHAPE_TITLE + do not hide computations anymore * pyplot/Axes: added methods 'set_xlim' and 'set_ylim' * shapes.py/image.py: code refactoring/cleaning --> geometry.py * Rectangular shapes/annotations: added method get_bounding_rect_coords * cross_section.CrossSectionPlot: added attribute 'single_source' / if True, only one image source is processed * Improve pcolor, refactor scaler sources * Handle Nan's quietly while computing lut min/max * Added basic function computation on hist2d * Allowed Histogram2DItems to have VOI, palettes and transparent backgrounds ### Version 2.1.0 ### Bug fixes: * cross_section: CrossSectionWidget.update_plot argument 'obj' was not optional as in CrossSectionPlot.update_plot * Contrast adjustment panel: when setting range (i.e. possible change of image data), levels histogram was not updated * Tests: handling I/O errors occuring when user has no write permission on current directory * Image items: bugfixes in ImageItem (scale issues: replaced x0,y0,dx,dy by xmin,xmax,ymin,ymax) + added intermediate class RawImageItem (ImageItem without scale) * Image module: fixed pixel alignment issues (get_closest_indexes, ...) * TrImageParam: fixed wrong class inheritance * LegendBoxItem/bugfix: missing argument for include_item * guiqwt.image.get_filename: bugfix when filename is None * ErrorBarCurveItem.set_data: now accepts None for both dx and dy (interface consistency with its parent class, CurveItem) * Image items/Align rectangular shape to image pixels/bugfix: this feature was not working for scaled images (ImageItem, MaskImageItem, ...) * guiqwt.curve/image: improved autoscale method (now works with curves plotted on two different Y-axes) * guiqwt.image: fixed issues related to empty filename/data when pickling/unpickling items * OpenFileTool: now remembers the previously browsed directory * Fixed PyQt >=v4.8 compatibility issue: PyQt is less permissive with signal string syntax (PyQt_PyObject is mandatory for passing a Python/C++ object) * guiqwt.fit: fixed rounding error due to slider's non-continuous behaviour * guiqwt.label/bugfix: text label was reset to '' when redrawn * guiqwt.fit: bugfixes when using logscale * guiqwt.io.array_to_imagefile/text files: format is now '%d' for integer data types * (Fixes Issue 7) guifit: standard fit boundary excludes rightmost value * guiqwt/curve.py: added workaround to avoid division by zero when clicking between curves * guiqwt/io.py-array_to_dicomfile: fixed ambiguous VR for PixelData when changing DICOM data (forced to 'OB') * Bugfix: recent versions of PyQt don't like the QApplication reference to be stored in modules (why is that?) * Annotation/get_infos: fixed unicode error occuring with py2exe distribution only Possible API compatibility issues: * Panel interface: added mandatory method 'configure_panel' which is called just before adding the very first tool to the manager * baseplot: renamed guiqwt.baseplot.EnhancedQwtPlot to BasePlot Other changes: * Cross sections/apply lut option turned on: now clipping data between 0 and LUT_MAX (0-1023), as it is done for displayed data * Added RGBImageItem * Scaler extension: added support for boolean arrays (e.g. for showing masks) * Added DeleteItemTool (add an entry "Remove" in plot item context menu) * Plot items/introduced notion of "private items": new item methods: (is_private, set_private), new plot methods: (get_private_items, get_public_items) * BaseImageItem.get_closest_indexes (+code refactoring): added argument 'corner' -> see new method 'get_closest_index_rect' * Shapes/Annotations: code cleaning/refactoring + implemented 'get_rect' method for EllipseShape * Tools deriving from InteractiveTool: added arguments 'title', 'icon' and 'tip' to customize the tool's action * MaskedImageItem: added ImageMaskTool to edit image's mask interactively * ShapeParam: added attributes "private" and "readonly" * interfaces.IBasePlotItem: added argument 'ctrl=None' to 'move_local_point_to' (ctrl is True when 'Ctrl' button is pressed) * Ellipse/Circle shapes: when pressing 'Ctrl' button while resizing the shape, its center position will remain unchanged * guiqwt.plot: added classes CurveWindow/ImageWindow (derived from QMainWindow) * Added transitional package guiqwt.transitional (regroup all Qwt5 import statements) * BasePlot: added class attributes AXIS_IDS, AXIS_NAMES (removed AXES) * BasePlot: added methods 'set_axis_limits' and 'get_axis_limits' * BasePlot: added method 'set_axis_ticks' to set axis major tick step size or maximum number of major ticks and maximum of minor ticks * Cross section panels: added interface to handle the cross section curve data when updated * Panel widgets are now dockable * guiqwt.fit: code cleaning/refactoring + added FitWidget (similar to FitDialog but inherits directly from QWidget) * guiqwt.fit: fit params may now be changed as often as needed (the param widgets are reconstructed then) * guiqwt.fit: replaced set_fit_func and set_fit_params by set_fit_data (non sense to be setting one without the other) * Added vertical/horizontal cursor plot items (+ tools + cursor info label): see builder.make.vcursor, hcursor and info_cursor * Cross section panel: added button "auto refresh" (enabled by default) (e.g. may be disabled for large images) * Added signal SIG_MASK_CHANGED, emitted by plot when an image mask has changed * guiqwt.fit.FitWidget/FitDialog: now working with no fit param * guiqwt.signals.SIG_ITEM_REMOVED is now emitted by plot when an item is removed from the item list panel (as before) or using the delete item tool (new) * Cross section plot: added tool 'DeleteItemTool' * guiqwt.builder/scaled image items (ImageItem, RGBImageItem, ...): added option 'pixel_size' (alternative to xdata and ydata) * guiqwt.fit: added option 'param_cols' to regroup N fit parameters on each row * SnapshotTool: added options to add images together (instead of the default replace behavior) + bugfixes * Renamed signal_app.py to sift.py (Sifia -> Sift) * Sift: added support for image processing * Image levels histogram (contrast panel): replaced the 'remove first bin' feature by an intelligent Y-axis scaling * guifit: reorganized layout to gain some space + added option 'size_offset' to change param label's size * guiqwt.plot.CurveDialog: added attribute 'button_box' (reference to the QDialogButtonBox instance) * guiqwt.io: added open/save filedialog filters 'IMAGE_LOAD_FILTERS' (types supported by 'imagefile_to_array') and 'IMAGE_SAVE_FILTERS' (types supported by 'array_to_imagefile') * guiqwt.io: added support for "I;16B" images * Sift/added image operations (+ various bugfixes/enhancements): resize and rotate (90°, -90°, H/V flipping, arbritrarily rotation) * Sift: added run scripts + py2exe setup script + icon * PanelWidget: added class attributes PANEL_TITLE and PANEL_ICON * guiqwt.cross_section.CrossSectionItem: added method 'process_curve_data' (called when cross section data has changed instead of calling 'set_data' directly) * Tools: added 'toolbar_id' argument to all tools deriving from CommandTool * setup.py: removed the hard-coded -msse2 compile flag --> added extra options --sse2 and --sse3 as a replacement * Added ImageStatsTool: show statistics on selected image item's rectangular area * builder/images: added option 'interpolation' for all image item types (default=linear) * builder/images: added option 'eliminate_outliers' for some image item types (default=None) * Sift: added image cropping and flat-field correction features * Sift: added average operation + threshold/clip features to image processing menu * ImageMaskTool: now emits SIG_APPLIED_MASK_TOOL when mask is applied from defined shapes + other API details * Sift: added support for DICOM metadata (shown as a dictionnary in a GUI-based editor) * Sift: new embedded Python console with a proxy to manipulate signal/image data directly ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096210.0 guiqwt-4.0.1/Licence_CeCILL_V2-en.txt0000666000000000000000000005214300000000000014061 0ustar00 CeCILL FREE SOFTWARE LICENSE AGREEMENT Notice This Agreement is a Free Software license agreement that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: * firstly, compliance with the principles governing the distribution of Free Software: access to source code, broad rights granted to users, * secondly, the election of a governing law, French law, with which it is conformant, both as regards the law of torts and intellectual property law, and the protection that it offers to both authors and holders of the economic rights over software. The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) license are: Commissariat l'Energie Atomique - CEA, a public scientific, technical and industrial research establishment, having its principal place of business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange, 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France. Preamble The purpose of this Free Software license agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an open source distribution model. The exercising of these rights is conditional upon certain obligations for users so as to preserve this status for all subsequent redistributions. In consideration of access to the source code and the rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, the risks associated with loading, using, modifying and/or developing or reproducing the software by the user are brought to the user's attention, given its Free Software status, which may make it complicated to use, with the result that its use is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the suitability of the software as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no provisions are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the use thereof to its provisions. Article 1 - DEFINITIONS For the purpose of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this license agreement, and its possible subsequent versions and annexes. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and possibly its Object Code form and, where applicable, its documentation, "as is" when it is first distributed under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder(s) of the economic rights over the Initial Software. Licensee: means the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any other individual or legal entity, who distributes the Software under the Agreement. Contribution: means any or all modifications, corrections, translations, adaptations and/or new functions integrated into the Software by any or all Contributors, as well as any or all Internal Modules. Module: means a set of sources files including their documentation that enables supplementary functions or services in addition to those offered by the Software. External Module: means any or all Modules, not derived from the Software, so that this Module and the Software run in separate address spaces, with one calling the other when they are run. Internal Module: means any or all Module, connected to the Software so that they both execute in the same address space. GNU GPL: means the GNU General Public License version 2 or any subsequent version, as published by the Free Software Foundation Inc. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE The purpose of the Agreement is the grant by the Licensor to the Licensee of a non-exclusive, transferable and worldwide license for the Software as set forth in Article 5 hereinafter for the whole term of the protection granted by the rights over said Software. Article 3 - ACCEPTANCE 3.1 The Licensee shall be deemed as having accepted the terms and conditions of this Agreement upon the occurrence of the first of the following events: * (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; * (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2 One copy of the Agreement, containing a notice relating to the characteristics of the Software, to the limited warranty, and to the fact that its use is restricted to experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it has read and understood it. Article 4 - EFFECTIVE DATE AND TERM 4.1 EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2 TERM The Agreement shall remain in force for the entire legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF RIGHTS GRANTED The Licensor hereby grants to the Licensee, who accepts, the following rights over the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Besides, if the Licensor owns or comes to own one or more patents protecting all or part of the functions of the Software or of its components, the Licensor undertakes not to enforce the rights granted by these patents against successive Licensees using, exploiting or modifying the Software. If these patents are transferred, the Licensor undertakes to have the transferees subscribe to the obligations set forth in this paragraph. 5.1 RIGHT OF USE The Licensee is authorized to use the Software, without any limitation as to its fields of application, with it being hereinafter specified that this comprises: 1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. 2. loading, displaying, running, or storing the Software on any or all medium. 3. entitlement to observe, study or test its operation so as to determine the ideas and principles behind any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modifications to the Software, and the right to reproduce the resulting software. The Licensee is authorized to make any or all Contributions to the Software provided that it includes an explicit notice that it is the author of said Contribution and indicates the date of the creation thereof. 5.3 RIGHT OF DISTRIBUTION In particular, the right of distribution includes the right to publish, transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, one or more copies of the Software by any means. The Licensee is further authorized to distribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to distribute true copies of the Software in Source Code or Object Code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Object Code of the Software is redistributed, the Licensee allows future Licensees unhindered access to the full Source Code of the Software by indicating how to access it, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the distribution of the resulting Modified Software become subject to all the provisions of this Agreement. The Licensee is authorized to distribute the Modified Software, in source code or object code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the object code of the Modified Software is redistributed, the Licensee allows future Licensees unhindered access to the full source code of the Modified Software by indicating how to access it, it being understood that the additional cost of acquiring the source code shall not exceed the cost of transferring the data. 5.3.3 DISTRIBUTION OF EXTERNAL MODULES When the Licensee has developed an External Module, the terms and conditions of this Agreement do not apply to said External Module, that may be distributed under a separate license agreement. 5.3.4 COMPATIBILITY WITH THE GNU GPL The Licensee can include a code that is subject to the provisions of one of the versions of the GNU GPL in the Modified or unmodified Software, and distribute that entire code under the terms of the same version of the GNU GPL. The Licensee can include the Modified or unmodified Software in a code that is subject to the provisions of one of the versions of the GNU GPL, and distribute that entire code under the terms of the same version of the GNU GPL. Article 6 - INTELLECTUAL PROPERTY 6.1 OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes that the Initial Software will remain ruled at least by this Agreement, for the duration set forth in Article 4.2. 6.2 OVER THE CONTRIBUTIONS The Licensee who develops a Contribution is the owner of the intellectual property rights over this Contribution as defined by applicable law. 6.3 OVER THE EXTERNAL MODULES The Licensee who develops an External Module is the owner of the intellectual property rights over this External Module as defined by applicable law and is free to choose the type of agreement that shall govern its distribution. 6.4 JOINT PROVISIONS The Licensee expressly undertakes: 1. not to remove, or modify, in any manner, the intellectual property notices attached to the Software; 2. to reproduce said notices, in an identical manner, in the copies of the Software modified or not. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors on the Software and to take, where applicable, vis--vis its staff, any and all measures required to ensure respect of said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES 7.1 Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of services. The terms and conditions of such technical assistance, and/or such maintenance, shall be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2 Similarly, any Licensor is entitled to offer to its licensees, under its sole responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it is free to decide. Said warranty, and the financial terms and conditions of its application, shall be subject of a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY 8.1 Subject to the provisions of Article 8.2, the Licensee shall be entitled to claim compensation for any direct loss it may have suffered from the Software as a result of a fault on the part of the relevant Licensor, subject to providing evidence thereof. 8.2 The Licensor's liability is limited to the commitments made under this Agreement and shall not be incurred as a result of in particular: (i) loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss that is suffered by the Licensee due to the use or performance of the Software, and (iii) more generally, any consequential loss. In particular the Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY 9.1 The Licensee acknowledges that the scientific and technical state-of-the-art when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of possible defects to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software which are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the suitability of the product for its requirements, its good working order, and for ensuring that it shall not cause damage to either persons or properties. 9.2 The Licensor hereby represents, in good faith, that it is entitled to grant all the rights over the Software (including in particular the rights set forth in Article 5). 9.3 The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any warranty as to its commercial value, its secured, safe, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any error, that it will operate without interruption, that it will be compatible with the Licensee's own equipment and software configuration, nor that it will meet the Licensee's requirements. 9.4 The Licensor does not either expressly or tacitly warrant that the Software does not infringe any third party intellectual property right relating to a patent, software or any other property right. Therefore, the Licensor disclaims any and all liability towards the Licensee arising out of any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any and all liability as regards the Licensee's use of the name of the Software. No warranty is given as regards the existence of prior rights over the name of the Software or as regards the existence of a trademark. Article 10 - TERMINATION 10.1 In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2 A Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS 11.1 EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as defective functioning or interruptions of the electricity or telecommunications networks, network paralysis following a virus attack, intervention by government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2 Any failure by either Party, on one or more occasions, to invoke one or more of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its right to invoke said provision(s) subsequently. 11.3 The Agreement cancels and replaces any or all previous agreements, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as between the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4 In the event that one or more of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall prevail, and the Parties shall make the necessary amendments so as to comply with said act or legislative text. All other provisions shall remain effective. Similarly, invalidity of a provision of the Agreement, for any reason whatsoever, shall not cause the Agreement as a whole to be invalid. 11.5 LANGUAGE The Agreement is drafted in both French and English and both versions are deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT 12.1 Any person is authorized to duplicate and distribute copies of this Agreement. 12.2 So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, who reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3 Any Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement or a subsequent version, subject to the provisions of Article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION 13.1 The Agreement is governed by French law. The Parties agree to endeavor to seek an amicable solution to any disagreements or disputes that may arise during the performance of the Agreement. 13.2 Failing an amicable solution within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the more diligent Party. Version 2.0 dated 2006-09-05. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1541340161.0 guiqwt-4.0.1/MANIFEST.in0000666000000000000000000000070300000000000011465 0ustar00recursive-include guiqwt *.png *.svg *.pot *.po *.mo *.dcm *.ui recursive-include py2exe_example *.py *.pyw *.png *.svg *.ico *.bat recursive-include qtdesigner *.py recursive-include sift *.py *.pyw *.png *.svg *.ico *.bat prune sift/build prune sift/sift[0-9] recursive-include src *.hpp *.cpp *.pyx recursive-include doc *.py *.rst *.png *.ico include MANIFEST.in include Licence_CeCILL_V2-en.txt include README.md include CHANGELOG.md ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.5017366 guiqwt-4.0.1/PKG-INFO0000666000000000000000000000524000000000000011025 0ustar00Metadata-Version: 2.1 Name: guiqwt Version: 4.0.1 Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt) Home-page: https://github.com/PierreRaybaut/guiqwt Author: Pierre Raybaut Author-email: pierre.raybaut@gmail.com License: CeCILL V2 Platform: UNKNOWN Classifier: Topic :: Scientific/Engineering Classifier: Development Status :: 5 - Production/Stable Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: Unix Classifier: Programming Language :: Python :: 3 Provides-Extra: Doc Provides-Extra: DICOM License-File: Licence_CeCILL_V2-en.txt guiqwt: Python tools for curve and image plotting ================================================= .. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png See `documentation`_ for more details on the library and `changelog`_ for recent history of changes. Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the `CECILL License`_. .. _documentation: https://guiqwt.readthedocs.io/en/latest/ .. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md .. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt Overview -------- Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve plotting Qwt C++ library, included in guiqwt base source code) and on the scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. It is based on Qt graphical user interfaces library, and currently supports both ``PyQt5`` and ``PySide2``. Extension to `PythonQwt`_: * set of tools for curve and image plotting * GUI-based application development helpers .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt Building, installation, ... --------------------------- The following packages are **required**: `PyQt5`_, `PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_. .. _PyQt5: https://pypi.python.org/pypi/PyQt5 .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt .. _guidata: https://pypi.python.org/pypi/guidata .. _NumPy: https://pypi.python.org/pypi/NumPy .. _SciPy: https://pypi.python.org/pypi/SciPy .. _Pillow: https://pypi.python.org/pypi/Pillow See the `README`_ and `documentation`_ for more details. .. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/README.md0000666000000000000000000000526300000000000011214 0ustar00# guiqwt: Python tools for curve and image plotting [![license](https://img.shields.io/pypi/l/guiqwt.svg)](./LICENSE) [![pypi version](https://img.shields.io/pypi/v/guiqwt.svg)](https://pypi.org/project/guiqwt/) [![PyPI status](https://img.shields.io/pypi/status/guiqwt.svg)](https://github.com/PierreRaybaut/guiqwt) [![PyPI pyversions](https://img.shields.io/pypi/pyversions/guiqwt.svg)](https://pypi.python.org/pypi/guiqwt/) [![download count](https://img.shields.io/conda/dn/conda-forge/guiqwt.svg)](https://www.anaconda.com/download/) See [documentation](https://guiqwt.readthedocs.io/en/latest/) for more details on the library and [changelog](CHANGELOG.md) for recent history of changes. Copyright © 2009-2015 CEA, Pierre Raybaut, licensed under the terms of the [CECILL License](Licence_CeCILL_V2-en.txt). ## Overview Based on ``PythonQwt`` (a pure Python/PyQt reimplementation of the curve plotting Qwt C++ library, included in guiqwt base source code) and on the scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. It is based on Qt graphical user interfaces library, and currently supports both ``PyQt5`` and ``PySide2``. Extension to ``PythonQwt``: * set of tools for curve and image plotting * GUI-based application development helpers ## Dependencies ### Requirements - Python 3.6+ - [PyQt5](https://pypi.python.org/pypi/PyQt5) 5.5+ - [QtPy](https://pypi.org/project/QtPy/) >= 1.3 - [PythonQwt](https://pypi.python.org/pypi/PythonQwt) 0.5+ (pure Python reimplementation of Qwt6 C++ library) - [guidata](https://pypi.python.org/pypi/guidata) 1.7+ - [NumPy](https://pypi.python.org/pypi/NumPy) 1.6+ - [SciPy](https://pypi.python.org/pypi/SciPy) 0.7+ - [Pillow](https://pypi.python.org/pypi/Pillow) ### Optional modules - [spyder](https://pypi.python.org/pypi/spyder) 2.1+ for GUI-embedded console support - [pydicom](https://pypi.python.org/pypi/pydicom) 0.9.3+ for DICOM I/O support ## Building/Installation ### All platforms: The setup.py script supports the following extra options for optimizing the image scaler engine with SSE2/SSE3 processors: ``--sse2`` or ``--sse3``. ### On GNU/Linux and MacOS platforms: ```bash python setup.py build install ``` ### On Windows platforms with Microsoft Visual C/C++: ```cmd python setup.py build install ``` ### On Windows platforms with MinGW: ```cmd python setup.py build -c mingw32 install ``` ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.6892672 guiqwt-4.0.1/doc/0000777000000000000000000000000000000000000010474 5ustar00././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.6892672 guiqwt-4.0.1/doc/_static/0000777000000000000000000000000000000000000012122 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/_static/favicon.ico0000666000000000000000000001731600000000000014253 0ustar00  6  hf( @  |||S///t&  ,'''u:" ...-444B???^WWWUUU###pTF;-999VVV@qqq됐UUUhH3  jjj=ggghG.aaajQQQT8rrrY9Y6c^^P(++;;;>pYZ< v documentation". html_title = "%s %s Manual" % (project, version) # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = "%s Manual" % project # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "images/guiqwt.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. html_use_modindex = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = "guiqwt" # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). # latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). # latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ("index", "guiqwt.tex", "guiqwt Manual", "Pierre Raybaut", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # Additional stuff for the LaTeX preamble. # latex_preamble = '' # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_use_modindex = True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/doc/development.rst0000666000000000000000000000100000000000000013537 0ustar00How to contribute ================= Coding guidelines ----------------- In general, we try to follow the standard Python coding guidelines, which cover all the important coding aspects (docstrings, comments, naming conventions, import statements, ...) as described here: * `Style Guide for Python Code `_ The easiest way to check that your code is following those guidelines is to run `pylint` (a note greater than 9/10 seems to be a reasonnable goal).././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/doc/disthelpers.rst0000666000000000000000000000362000000000000013555 0ustar00Making executable Windows programs ================================== Applications developed with Python may be deployed using specialized tools like `py2exe` or `cx_Freeze`. These tools work as extensions to Python builtin `distutils` module and converts Python scripts into executable Windows programs which may be executed without requiring a Python installation. Making such an executable program may be a non trivial task when the script dependencies include libraries with data or extensions, such as `PyQt5` or `guidata` and `guiqwt`. This task has been considerably simplified thanks to the helper functions provided by :py:mod:`guidata.disthelpers`. Example ~~~~~~~ This example is included in `guiqwt` source package (see the ``deployment_example`` folder at source package root directory). Simple example script named ``simpledialog.pyw`` which is based on `guiqwt` (and implicitely on `guidata`):: from guiqwt.plot import ImageDialog from guiqwt.builder import make class VerySimpleDialog(ImageDialog): def set_data(self, data): plot = self.get_plot() item = make.trimage(data) plot.add_item(item, z=0) plot.set_active_item(item) plot.replot() if __name__ == "__main__": import numpy as np from guidata import qapplication qapplication() dlg = VerySimpleDialog() dlg.set_data(np.random.rand(100, 100)) dlg.exec_() The ``create_exe.py`` script may be written as the following:: from guidata import disthelpers as dh dist = dh.Distribution() dist.setup('example', '1.0', 'guiqwt app example', 'simpledialog.pyw') dist.add_modules('guidata', 'guiqwt') dist.build_cx_freeze() # use `build_py2exe` to use py2exe instead Make the Windows executable program by simply running the script:: python create_exe.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1452446690.0 guiqwt-4.0.1/doc/examples.rst0000666000000000000000000000662400000000000013054 0ustar00.. _examples: Examples ======== The test launcher ----------------- A lot of examples are available in the `guiqwt` test module :: from guiqwt import tests tests.run() The two lines above execute the `guiqwt test launcher`: .. image:: images/screenshots/__init__.png Curve plotting -------------- Basic curve plotting ~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/plot.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/plot.png Computations on curves ~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/computations.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/computations.png Curve fitting ------------- .. literalinclude:: ../guiqwt/tests/fit.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/fit.png Image visualization ------------------- Image contrast adjustment ~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/contrast.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/contrast.png Image cross-sections ~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/cross_section.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/cross_section.png Transformable images ~~~~~~~~~~~~~~~~~~~~ Affine transforms example on 3000x3000 images (real-time transforms): .. literalinclude:: ../guiqwt/tests/transform.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/transform.png Image rectangular filter ~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/imagefilter.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/imagefilter.png Histograms ---------- 2-D histogram ~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/hist2d.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/hist2d.png Other examples -------------- Dot Array Demo ~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/dotarraydemo.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/dotarraydemo.png Image plot tools ~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/image_plot_tools.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/image_plot_tools.png Real-time Mandelbrot plotting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/mandelbrot.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/mandelbrot.png Simple application ~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../guiqwt/tests/simple_window.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: images/screenshots/simple_window.png ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1640626338.704891 guiqwt-4.0.1/doc/images/0000777000000000000000000000000000000000000011741 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/curve_widgets.png0000666000000000000000000007716500000000000015341 0ustar00PNG  IHDRGIMgAMA a pHYsodtEXtSoftwarepaint.net 4.0.6c}IDATx^XGјILokb&jIh1Fw{FEDE{/t?e98}3;3;;xwvu d5 d5 *t[GRI%_Ŀ"VI%/K*5%&VX)Eu7IZ%J驱R,HƞR2 X)+R)^46_U(ARYƞe_+EEJ/%߸N3'~jUd5 EY 䂬FAQAV# QPT}B.jUd5 EY 䂬FAQAV# QPT}h.\atu%6v nGZ?̘qR!ٶc{nŒ0pg$>)m-"[>x-go7=K!61lpYٺyx&$}ӮW QډӅvIʄFAQ V^|yv톏1fر 1y樌tvک3zq"UGcM2E\$>CQR{T튙 Wmkt#k6:wrkJ+֋,8} O_?xp\v_a^GG6>"%CVզM#ǎEDG £" hidzí'DŞ47kڴ)G,n::'^k`53Nbhj7:LYvq5@Br8U-cڒJFAQQVmѲŁC%q z7,^/++W[wևbcPpe˘ѭj}xĿ/?enݺ5lpQ(?YjS:xxɒ z+zWַ}kfqJ<[-:6RwZT"G%ZpMNY]۱(ÝI\t3A=09fⓒλng`QsKl\ܮ1mرo bh7۪&j`9>ncgW7ޡ!QPT}T`mhH 6O?n)%ǎ{I;uRXYt={u9ug}feı$| ;[EAÝ:u?!ݵ ޱcG/Չ/j{f߰aLվOz&LجY3VON^RΜsYyWdlCm X9ki;>@uɸx:n5E__k#x7&,*Jo^tN; nعa5LiwT؝cshްQs9n7@z 3GipVffe9(l#coyU[؜QY|Yʭ}ӦMԪ$h۷atιegqsv zsq,Z8q1%Y ի~ʢ=£ء._S|j^:w޳o/܌Ei枽zA֬>bx@pVdNX£W+a588;]l ~n6F# v+^,x204:}<dž 'n5I~G  W]j{Cm3kMgCiqVfJ[ukQP? p` vv9502Վ7mذ!zѸqc KE/] 6>>Tz%ȼ5Ң Oo[m Ke\I crWn7trz]W̑;GKy= srb&bDLO`|&۝RO}[ Yݒ6KzVlROqsp^*EG[Cmڴ ԃX$RD)V 9ٽGЈ^ڵ;}?TS,Ч$EF@{PCQS~۱SG k;P儠Kku׉`a&FR#=n5$RsHnaSh5( $Dw v~Phgհo]C-vݺ{mhRq5/uA.@ou[w/]M,3S7SDL jՌGXjdxhՌW`Yʭզm[[Ӓz$CVZ|_Xmm0Fo~'6mfN-Xj!a#GDaݺw/ ;jNبcNŋƌ',^WmW+nfY (,|} 咬isvvtq-Yh5XdnC.DO_vɭ,VM<&ܥhк~۞޾`44q-A~k6R)uV  E J+EG[ x :{7o2>x zg ~S Zjq%˖~[s 6OM/7[`y5jSjF&Ƈl޲yj%^fdl'lش׬ᰡ-۶HԻm?p&,_⣏>߳nW.wIc}FE68e|+3;wE~!\`hzNY]IjP `Vsvu[ֱ:iyןqvA(jJ{wKW,la]nujڷ?a2h|>w8Gt-lE$#_w۷Б C',5?Q(zW((>jϡGmڴnݺ]vM5{tH 7:$Z8vjݭWnŸP%*OCV U>H&<1_WZr^rS;](>£VySήn},>UuECV \((>j!d5 AYꃬFrAV \((>j!d5 ڭX;VYoA)Y.κQ ήc䊧Z`ۀ ,Bٷ{9Aʼn6+jQ d5@jQɐ!D%CV# V=btѓgιwFƢ,/ sϻzM$^u骧zO$8<؄ժvˉy |;!f%bM GKR8ۂi}2YOh5] >7Bq  ;Px%Qn51cǴnݺC[=ftphgҥkW K,Y 0P 0pߍ}&uu_|EISͿ;wIE Wcf.[d-"]asµdܧ_{, Wo\ziGG19:wzOS |/YjY΂'ŋ=ẒS{WV,CXN]>½+0çl.lEZ`j(_`oG2zsLaNkiӷ?T\ 6l=q1!9M6?g` _tskݦY'82X-!^GGgێzLv܅cB`5hLⓓ_zNdleDx)qڶxAHTD+7Z|62 x, ZC򳄠\ngG 좚zS04^WeN!;X VTZ}wջצ-y{2t蔿9uW1ݧq,2&ZXާO؄xhӘ)S jݚOX"#0 F<|5kDEƘ2}~'D>[MфIٿ?(g>Ct޺};,ӅŭS;Ip뀩9d6 o5Wp= 2MuR7T."Z->)颻!ShpU_Aϻ)P561ەƇфބ#bblngb 0>z򵒮#cP؞٬o`jeIy+ͫ޾XU Pժ5T-n.q!{CQGkj{KH8rqB5ᎋx\7a+ʅZ ^9j5%(^=gλ+փo=o|^׿g>q̜q6m^&ܺ}#B._u:l(7fXÏ>\t)*;c߾COG޵[GϞaF=z @% /mx.-ZL}"$:a>짟=vA &Zmڵn~}O]0I@xӦݣg_~iۮ퐡C-,ݺt2_C@!8vFbF$/^ Y0 %6=p-= ڸx 5L}BcjІ3#':ozpk]lg45L 1+Oh C Bi+ I07:`Ն.a3:rR&oU~v{mwuVh5$diS3բH!=įZ_%d$ ϱrqEboiVVxr"Y\hՐ[F&ƒz Oq*kq䜹sE]u]Wo}L|E:q:19xSP|Zjese D1]/]lۮ% X_~^h![ҕ_ )Z\b:\T[7]v{vcbh& *Z cY7<M:}\bYV >|RFF[-04l}h >m1!L@j.nW@H5~j!7K,JxT= ˞^ :@ZH]Ro{@(K@hD$܃, Pιp}j2OZb@_sЙVh?ϡp{EYjII8C.B~05EmgMkWv BS:TjyYB UOMw/1kvgWB يjOZCGD_sܬg^ ʎg۵oᅄ}׳9t0*mڬ[ZZwlߝ]7o@tl e+VU~}.| ́_8 C{j݈8yfjSN)8tp?Jn#J!o|VO Zխ yzb謻u7F!۬oNv:$ &MFBrmʫ`5d`.ӵONX$$'oڵ_i(j s۱[ VF6 AusVwoN\R"2B}VdF!nn |8CչDx(LȾ']K8"{I {v #da#̄;."Yi^~W{IOIx$6!޽;2'+=IIƋ+i̸жۿi*qlݰiSϞ=\ڶk.n5$XC5nGҾC&V84?@SV|)5R- s^~1Ujj8feVqv9Pسj1 pm{YW[m-QZTlݙ&G1€3 !̇oEdZecrkle Zl !_[ ^ 3A3595a~Pb5$ 7.jp 5˳W^vk!sS'쿻68Ȗ 37+nj`Xdo}6n~Ab~ ^[XSAWjt`\)̕jů[ *<'s_Jh5t[(á7j0|:\ j[vngryw/Lw A|@{*ׯ!{VwZ7O5j`һOoj.]l׾_OsrUW}'N }^=x/2'cfqjn5d:| &ÿܑFNOHV 6XOj~𖳫|_ +j=} +”C{!r8|E7rRiV+!W<1axRDFa|L^.jQhҦ+VtwO??`YڴhԩQFJ0=q_٥,VdtԢŋ۷oꫯ֯__~gV,X [_/q_piРA:u VC闟1Fo?/X[ \v}GX}6-Q~qPٹK;wIÑ}7~饗tׯC\cF)ՀV_nkx;KnAgՀѓιKh5}VmZ1g;%h-jQ;v z;::[28?wA,]Bo'Zdۚx5[uH8vw\{A[NE)p7\Do?_;CG;89/}Z=<RgQRhLs) & ؊9 )GxDZ=bpX(oT{z'0{GS~ټyXdoPiF=)>v8WC@E .\vUŔy O Y'>); )JSJ㲧7~>"WO|V`h(p/~e@He/ލS8t%+1 ]Opb=|[6_JVK>q:8֧+^Un5 JjVS9kVV+[7rԨI'ItCVv{MBB>Ԣͬlᶕz۽ط5X9_ŝ~d5fjrrogϞcƎ3v?s+n(Hkvvulڹѓ[aʧp {S %*Ah3d59e7]]vۯukx\E&V>ܽ}bM".1q[􍏞pm8e$04H6BV#mFOY A<` B CɏFFyUu7Y mZxrAH~/H#aJubqmeFOYZjV;vPa,\Pd Յ脲ާJV#(޶y[C燏><GGST/jDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjF\AV#djDy qd5BjFy6p^_>F\ޡ 5 A^MWuGyLb;Td5@Vd56L4w} a쳾fzЙc׆eFjF G(_h/X<`=;'ص6?w3%=WyؓF"d5P勣>sLlziю7{]%VqLreCsPܱJI(K*Zw& ^ Q.d0#/=3=$u@$V0'-7-Qф+CV:t}/9#<_M])b&it:=lk4r'Β%Jm@^ [h`{={we~ko`uf`{}{Ddi>Xk>a1m+,ՈY (x?d{uTchqq_9} ޲}K\ 4k+ضq#FwEY^zꡌU޶}wØ,j>ZN~/s(l~,Jֆ6 1vZE%DoZVjD j>?9sGR{aO{ |Iޓ?NFw+V@JG&xkIВzgޞ=NAAGW^qVjdd VØS|?*b Y~=;8YM#SY egۦK/"'Z-3/54ޚ57! iߌ'×svVMվ>udZ([ Ygyn܈gc/OM=pVNġs|AV#dj:Oֹ^©_:;(2;?{ؖN-3!L3'ʰZ^AT$bk0!n1o$̐m|9 ՈY 4Xx|0ԗ_ ?s@omV~Z<{8&Sj6m\︾cǬ ^|y{4HV4jD jڜm z[hz[;x70R(X-_tV I V-E%ݻ mbC|LuDeZAV#jd5PٙRܽ"+CVɺoX /jy} ^WU5+:VXK/I<m}C1, Utjbgl k_YaW-ThnȇP]Ww{8F*jd)\o3%j姳rYi/J ]=[۟>szhdI'EuJ#6]-{XMܥ<˥Eiϼ atP}g\vjO&fdG'g(.qIÿ]߫\t[w<%5ʴZ@t? 拰-f(;+Mf[-ԗCk%"/X0rlroxME!#W)Ve5W%`5Mv{v+ )D2ZL4emYܦ4nh,vJwxԅ@4U`G~Qi;-x 3vySAV#jkyaDBzf^Y_JH-VNXM2P&Xr,u9,Tzբ~AhY+*~'6\eV>P|^Eɖ3[+jV+.fڮe_%V?H_El}Gs(Wn-m-5gVɐՈ@Z,܂AX|_Ϟ:?qBV+/YNIK+Rn50> Dt}SEs֗VSf:/.T5QZ6=nmkҔ7I*m$u7Õc[XMhOO([McYCӬ~c٭hLkӟ&g]gX-\_+ d5d5BdZY~vƾTǮ .ߣQ˃>?1Su4|ݰ(^c_, υzXÑ}(8j%2rt#Ec KE˝ʃs\ˢ֏,٪4|Wj> @RnYdśzaYN>lm]mIVǢAϺRۢD:jaW@reOJ qd5Bd\XmH$+][*+OW׳x/&xKd{Q~tELO >(\6(n5]R)egʷ-gm:_HQkj::N5,Az("oY!qd5BjZ'(J/h,ހN+wWrNP/XmSUJ:V _xYR_H+߶$VC6՜AV ~q +ug[-E +͋WYH @V5j-^CzYi0j*EIVӑ PYtt͵ZSySzPۢZY%9YZ@V#jd5P]帽JSFJʍb.%K<}aVMMkۡ/*[eCJ-B0[Yb9LSYM1[*Vj&ŭj#,T \AV#d[~CvOE?j!kX4 8m_V"g7(x{rnрi/^i5 bCn[irVsWnVmT,{Xg9>>L-xT;*:FjD վQtݧhZo7w~⅟,C-5`rAkˍz+wu,z<SzhEtBYѣB"Uv x c/9rv|Q^\vqj~)X7x&vM@cITvd^*m۷_S۲JeR   ަo)V>Qvj` [)>rdhd@e-1VX& a5W(1fu_,Gc =\2j(~̉Vz[E ,Z[eV(#٢Zm0{)9)3 IU m+p?K[^\$-)B*ji/ǥϔ_T5ISXm/&J X) ^^_A_ViLN]V'V+\o_`~wAz}ל_ Hq{gա8ˋwF-:tXCPջIV|F^y-8x+-\?+/"BҳV ~yȩSñc/(^@2ZM?Z?0%PRT&o &Dlȭ9zbW,^]܀iK͙[X%gf' x;%'#+_2t_Z%b4dK׭_G&t ߲} Q?\Upbېg[#xi U \CE7Ztm`ͭc7LlɤrյdwIҩ個0+. k{6Q<]$vBj][wGM TŔ\G{(<%X |j4f[R/9krdGTX ?vn1ﯭq728lQ]Q2N9`o?9~X]0'Y2_* ߟC!i#Bӣe2VɜLII/YGVkkB׵9fC7]o6uhĮII0޵{WM BK Kx$y?;z~=x'%ٛL-VKj[ DVDGo(Dee|U!+anP̧W]E:-gvo۪G9p@[,lUȪUV"F CMmEm6(psf>@N2@麚:[}h1iϼ}}=jD5@wU{!_"~Yw#XYcsqz#U2iۣ;2JV{@3CNuuzMM'$#"nd@&ǁ{ '4qϾ9 ܽ2oJսӢ{/((PO.!H$_e:v54}L8sqlUnd5 ;^/lE$0"),V[u(QV a8/V\}9S3fF6~rN(?jn:wnz6ccM%]WSG67Mjhڐdw~AoM\6uHuG~*NJ]UEWb!ym\R6icX[/433*9tHe#jGjN7礷, 48)#i}j~Ͻ<)ڠK0y"tө]199߻̌3k|v~٣jhw7OV# r-bz惇BFV9cײZo_|ipʖpb58|]s-cVvV|lqdZdtZtojYjl۸FF73o^ǵDr0۶og޿䤔b50yIMwA\ ̒TV}wD[έ϶gU6^F"JX GoUh9S+u@QwJξ:J׭ e$[Yj9kEAHzLN c2/; 2.8.}dJȥA'+'=$uӉDtC>jZ骇ε7ul[!H  GLcIEݲ! nw 6M9xԜɛZ=R3n-cT`%a0=ȟFȂwto?d7jyt3z*bOn:u/VY d ?+jlӶfkd5n#FȂVTV-d ?_Rȫq'qd5BjVR+j$ӵ=ȟm$WYj:ݔTV-d gh݋Ptf;@Gvt YH  մZevY ?jd5n#FY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY dZكFY jܧs=uԪux7n5WgJ~0,Io5BzHpf߾VjNՕt#jd5Bk! ՞+^'=Ot⣿W s:D'|kY d\Q-کWklzY0B2 /G+ZƬY-ZyBVd5 =Wh>6obupK`<d#{HJ Y d\VpdF+ڀOߓ̖ YB˭û$:r .;:Emɜ  ՞+jMBhfΑj2@V{r=2-S!: YqYMjZn]GxI\=55H2gB.j&d ڳ@VPj&d ڳ@VPj&d ڳ@VPj&d ڳ@VPjjIΝ؈A׮YV $݈Eww/_?n#FY Y-33 bCF<-Ɂ}DTnuZBVEV];w!C$VUOʳڵl{7ӊjj•Die* d5g;i̶g./d5-jrY٢f2!-CDp:R{ӳY#VvW/yF,NZBVd59FlQVs\!y`&d9yB=!(q6Fh5h!#G!bdfjQh/f.DgrQTG~T祓J턬jrY٢o/RsI) avw6{''h5t؀7TjTG-ivBVd59FlQVCǒ ql49DrJ" / f.Jgd޲r=&jꤽcN&-jʕªU_ .xj$ ;^SR Vj_*b=/Kj$r1ժ<'vਯRIq-J"/e_I:+%w|E(%hl:p@DUl~uaPPHh2aC ong ]XnK026ޤFLf0@:K[xJر U?KjQyV3e'1N&x7 RToBxa2y7՗QsN\cՏ:/K;hd5@V#*L{@Zݺ޽;scDz9KZӻ7ܰ^qa"ie~MtIZ_lHX\Z/ҩ*/$4i"̙XYMShaǻgK\=:W$s*^01WV&:Y T+}p!8#G9^_سGZYv *ww!*JZ_rE֋t"! u14Vktpc%ZCCLJ&mtYN3Jng Z5>V{eaN!+KXXΖ>J#m5dTٳp$ȸqܳfIkd5M! $F,nyԫja?U jd5P};µkKkSaW_i_#X `W^uc=}WW>\~,dj^=oA_ /~]Y%P׮ܫ;˚+XZd9F:TYx USZS' P%, V9XDY i yʩgkl#JfxKmYsAZM ]@?3 L 7ٱCuKg\p``,Z ڸ|5! c)VkB`ASSCn~Ø1BF_\Z2399Blp!Hjx(EXؐ+z"&NTu:U X%io߮^Caֱz|GccU+ٙMz85zA`h* j }O|cpxaEJ#+Xa{pF56S2I-Da"7>Vdc%(0eJQ+MسZfI BXv>p"+8a7$6mÙ?zTu&0&/zz촡0{6ə7skv?r ĆgLowAխ+,X17T"=sjRĺׯ aaL?3iİS_n9{Vx}v͛ɓ ٧SuYNYMSn5Pˢ˧ywgVFx+/XԖLO iU'nȯž=ȟन(TuODž T:vdP-ڵh6gn};8msC)V6y#U,7N&OOvVfYv7ΝxvYV#]3Y a&\XY;`>__Ãa5\3XZ~y7kƴ@&MTMU| iTĖZ5VE K;LQSԡV-6gn5Uϋ: CBSհ-bX۶E,ߟ|eJHIa{ԟ8N_PdGunefL;wZ1>5gHD01csXD^T 41a bLKcf\LjVtՉxO'N/HzwG:% !`5/]b֔)E_mw߱w)Z -:ŧN)whlc ?vrVեKٕ;wQĞy$&X eDzVwsc ;a#woUkX[mFgD { 8Xl  g'XԳr i Z3}Qgǰ$ @g/}v}#վ+SVi\\sRF(Yy!f5q,["_Nڲojߺ:X 6$ !8#4vsxm9:9L`ӧ \]D i 2c׶&nZY T@&_0ݬoԮ-(lj8] & 'iK0Uחr~9W/v^ YӦqqڛغb_¹slL\94Z-29CkB=Ok{l!U2hdꀟWU'Ll%j[;&Z~EqćrrZw9sb䪃cGfnl4z4#7Ɔ%^ցĤwٷ咒v \]hɐa@:Noεkʟ|6UTĿ<"'U+TaEyxv!f% "R}SEYi4ZRtI~z3(FhZo5:R#[aC $#{,)A'~ڶeHbVoڔ׫Pƀm ~p4{-Q ^S/+g'F\D[fĴqcY=P͚.сW_eěhc,bW 4YM !USug@voi=4YM !USj3=[ZO<;d5MAVBj&f i_½ij@Vd5-VM! YMSմZ5FT.d5MAVBjQ4YM !USZnƍ{FA|WKX*πR)jZY"՚6eGYo^K*.]Ecj &xI4-BVd5-VMjM(ɾ/T䓢wh!ZnucFsjժ)Yme\mJAWћSӠsZ˖,-٩oakgJծʓ'gA!\]Yχ#65bqvf Q(؋c''Ñ۴aϵgW\ebfbg<(Y7$S ޺\ٻrrسndDeÆaX7#toכ;gNg?}̼nx%1J4aoB<=oQ*&VB4٨DAI~Y%``ph_٘jKɼ+,Ep*rA[ vAO?d1 ;aQVx9s1I= i BVg5|ՐHBgRc5X D%J{{A d6!U_CZcsQGA~r4$%Hwrw(T^9d`df,XPHb ZD ٷOCu5@Š3ED#Da[J@eF㸸0az8q34YM !USZ~0c+`\ a Aj-\GvXYb54b]QsTQ4lȲ֭?SFyyk.3ix"V\ ʼJY H.SSK<k`Pњs?:`TV) ;_T*CPZl|Գys*;dؖli1QI= i BVg5$XNNGS03#2~ppƌafBOS;S N]BVCΞ-\|9kёUP m vjE!Tks֭,)+Qe9 ́_|g";; &FANJKcYݱc,]gVъ11V)Z-:ZU"o֌]Nf;{9F>V_qyM:8ZT)jZY"Հ9sUF,ZoZ886h.{ aITUF`CCvF鬾7Q{{V^I *q' ~ !kqh5$))>6EĆn.u;X 炃E@@D]>dj^j{ ؊'?ldTVv ;MH~El ;g;/cBܧ#fLբ:d5M𡙕.ձIsI7B۰>g8"syT/̑YՋ/AJ:R+[OiSvM P6;9 (K%>FQM♭͓&=ՂU"e9d0vv,mՕv(a۱%ٶF9/ӏ"d5djrX^=-m~*G%駂B{%R9nͮD~B5|[:j%j<A<Eu Z5Q)(KժyՈJFQ]VͣlVg&&rY U((((( U QPPPYYB-jo!4n,, tԈԫ&˪:uub YB ֬p:K4p!{׼RLaLieفwwi}qs(QiBv0b+0wᅬuI((((j ½{B@I#mmBZ_N֋@CL?n5 EUYOOC ?(PZl&WKӻQz75EUY[7!5Uط4ׯ ۶I;Mc -[4XmxK 5i}n0qг'֚4 99m|iC 믳S;;@tI9RY>tu~c{@ZY }l4|(cKzKiV ;wUƎUu",[&٣zSAVТ*Ĩysvș3BpЦcZwx!$j [Ũ(5NҬ6t(˙ˋ "XQtOtܲ%f#x{33k¦M:LZWaXYs +V1U 2.Nx@8wNhؐ|آ*$& ,)D/0/>B̅lAAlXִf WϤr QPPhQTpt(KcE~*xx0ߟNYm/֩@gD)VCfH0fLFV0+tBlLhBP0?;[S8PɅ׬ =̆DsgV,!`8Ha!*ssweʇAyXץ'X[$6]wcv}{*EX_wlGG_,m,XZ}Ve Ac3.[V&'GI<)4h ,Z$ KNl#o۳kb'ƹsٙCqS14d J[`Eo ee #C`JYB1Jׇ34m~Nׄ U ''%Jdi]YI)SXj\ukAw,;cyСΩN6$ }&NT,}ΑS/ʿ c0> YB֥ ; #1)niQR!-̣..U.b6>9@$jƏ`CȺ$86ZܵYaCvv@>O3#b[|oaտlz5:+NB ݒfU((((*jk f0V8|#jЀu7]R?K*hkX&Mذ%Y IOqW)\ۭc :ƶj)S0@ځåhhZ bu/{UF ;}YreQC֑5l0hWd5 -Jګ W2?}ȄP_m[>A)VL҆lu]]V +㓢|{zd۶@ؘUz@VТ(jӦC! Fݾ ԱУKbv|Uoԇ?$G5;C9/g'"kACOIXH:ubQR_f@5"AUu _,bkJ|vf .ɓDɌ:dKIQn,`QCFhd2>`5pTl[ lQ%WgD[{ΎyŞ菝pigcn͚=.r $d5 -jj8ƩFoW%YMߟ%FŬlڐ3gsS 1E!+~ bW}{m)h]U9p +|c=yz [zL˗d\\Jˍ~B^ WՖ.U 2&sK anj{R= *a>d{07PR>Bn"d5 -6or5Z aToֈ ߈꺚BV?xzodwL'#RsA%4X!<c{UJ~] D@:: ۶_ iN l*6,AF>ٺh5ĄUb69sW,a6*d'ola3]C)y&& kbe G'4/cO_TFAAEQz`&Rŋ8qq>Ce~م|f ~Cj.]bRh51.[^|Ƈ<`D(WOOs] b5RHukl[M b}M"XDj . @O|R!77ծnܘ|HY&z ʊ9X_M_:@!QPPhQd50>;/rWgg=&aJY!O¢ziՊ/ +3f\Z4h )= Znzd)f@``NFG;%}J>[WZ_njH!ZI9!QPPhQbZyݻUOp VܼP*?dvxCVТ(jQjZd5!QPPhQՈgFAAEq\D?ZB(sJQ.IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/guiqwt.png0000666000000000000000000000644000000000000013773 0ustar00PNG  IHDR2"gAMA a pHYsodtEXtSoftwarePaint.NET v3.5.100r IDATx^klyEI /HJP $!HRRHMQy" [ `< TB``OgYfa]ܽsﹿ{ιgҡ¿ŋw^`A7o ~rR 9Ƀ Axw…)k?Y?C@j!^z5m޼nJ;vݻwӮ]ƍ#˗/ [pxAsG`d`(.Z(e˖ȱc̙3/磲2TUUQyyy[iii8RPPмbŊӆ>o@ ;wv C4+\-Y5777H4 UTTS]]T[[Kuuutuy&SCC566۷Ν;DΪU0Avâ,CTB| 0Zٳg#~cKJ r7حB@~ZOcq7[+W>r~z|Sj7mT&ຊ1i̛ވy{B>yd+CMϞMb0jkl\ׅ[,[yOϙ39@WH 6˗)`~VQXPὶlٲ&άi!2R|KX&h`ռ>ܻi׭Ćf l`֪ԩSTRR4*^]cf V>9-l JSUgִ)֮]K.]j,?\c`'n@!Ы֍/`aھ}ng l)vX`;G+?s&Ǎ#r>#UĨJ@ԸmĀUXX綊Tՙ5-@`ݻ7,X(ߔ)VFB=(0|8uڂDiipFΟ? S;i:[,VcLJ0I"{GuD~oڵ< 0p87uQUJ6mo į4 _XUu#?geQ潨̡o0x;SoSͺuTw$DYc7ssD;n`9rD?4E4ds qo@ZfC.\3|}L3gRҥdt֥  >*Xޣ+@lqpb -d7Pfs-jF?F21Gp2c1A.(Aק`JZS%NlJeCҵYyݻtv`q.ѣ/ik XL. #WTGTZ\\6U (iD.͘7(a89My8Ҁ`~CVkÆ RCh#X\ŧQvøW5vMIK5`q}V^́|28:T4y3&Mʕ&$izuțO ,ھ$r iժ(NWZ|.W&/lhKfc>i`͚5#,0BnK:Pq==0\(Q~USεJ%=D# ;v,1b*d=mt7J (JX.m >NfZBd-fSRzqVXy6yWQQQCT!燨hzj[^^^ҥK9~c:G,;;&TByz `tٲHLs&͸?їe~Pe\*SjBo >E7ڷoH/N!:x`o Q@r׷szah tۘ{}' ;ΉJ.&nm؎YB\7dukgp5|ϸ SG@x2"%iC*Waw.#dw@M:Չ%rmǹ[ 9F[BĜE%ukg5UuNtŒ6Cf`:L14/Xr|`z\6$˒e'q~xG,l$$]-Nd.ARǜ3%)K}D1nuO`bJK*BruL"I辟w9v q-sD+xkv1[X |&2RS#KduB`[_b7AMXkL,Y?l8oƸXM1$%I_=,p@Ol[?(f6J;lLNݶ{6]ҩ5AdwȐ7Mr) ˄mʃހ@n~J@5%ӜX>m=.XlYCHqMkH2,U2~+^Y [X|v,+7 sGO:kՓvnY*/>Hl tB9`WmS 2gx*cM6*VFukd蟯1 B)HI e2r:em8KsV*6]NO0vU ldcqc -J ֍V[Tl\l5-q*e*iOH ˰(=SÓn#Cnw6GC*)+aT"t$q w큕(5֏ZHIOV5rE[g/LdI\ʍp2;;ϬJw^OXlK2)SP/=P_9M9E༊~fݟ☋1 yG oi*Uާ`x4iӀO< x4Y?MpIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/image_widgets.png0000666000000000000000000014117300000000000015266 0ustar00PNG  IHDR=gAMA a pHYsodtEXtSoftwarepaint.net 4.0.6cIDATx^Xއͽ_r{f1I4U{]&*6) (*v{ea.uw><39sf9г l<),*V([l`u #bb3P`C’bfBż6X`0o 40o1[l`5 [ `M6X`0o 40o1[l`5 筬ܜYG̜l2Q S&$';HAqQRZZFS{ E%%ef)qIt3-+Ԍ̜|se&rSӹ Vk`bistx멧h#fΞaGvjz IHNB >,A:8:f/!kBv$b Njy+061)y*-+Fz\@pLZf&& AfNζNH4VnaABJP(IH Sg"%;?Bd gs a.0.+#''R$A#A?(}h0BѧϝF01b,1E4)!5g[u):&R,3r.<<#+ƼCy?τ v?3gBy>˳riɕV;vfgϙ]NF}7ɧ{cNZdg"7DYM3- !w1so16nԅ[g0Ǫ+K-MJM5l۱zw+V~g:Cǽ>Mox(f-(䈧pզ]3^rAgHs:bD[a"?L/qB z r_Dz6{Z ,@PS%=WoEB8[v+nbG8IKN޽uM]qa!Y6V-6d©vήFi3⭋QP+/`$!4[ >0Б=G_$zW^}y7||1dey__d^ƌ%A?aXz~aƔԌt}]#u5oO#8-=z CU.E5RGGF1'OV,V FDlzMo!BڴQ[w;9oaTY%<*MEP&@m_1@G󄉩;Ө|D^fy.߰m \x8ǃG!nu@I,.+/6Ty2 :0-(jn'mϏKn6[1]尟_fy0?[,P\bnF{gB0)zcz;p̥nނN/XəPo-^eզ]A!W8oeX:l7/ZaCno[py-vhBDђXY-DK /[% y"Mgz{Q\ ^~:" x 3&!zVae9._F@.r3R W!Fw-Ih9]mz ;o4 筅 4JNKFK+OC|3!޴y}8rvx ]>AY$g0~5oa=s 7o_DB9~Ǟ(I,S/IHDV{uLm-Ls֥Ѳu =KE|f݆r ӆmz+9=}ڂafy0?7ƍ߫W4t)ɋ.A-aFoD/?#z+0o e3Bc .DVko%&'~݊+/ h Q?LYv.Z >D1;rJ(uuݨ6'%'MY<|NAEy v13ljS\qc]rOؔcᔭAҰߡZzof'#wDEȢh]8B$BDZ0~LP]$^~Z0 hϾCa"эZ h TMaxFC 7 ՝:2#7[?Kz;(+WzW3!\brZ7~c)r`{;3Si-vLDžrxQ|vn6u:"7ay+6Z}C8l|mtkqv7w<Í[ ##f'Oq)8j|rR ~r.ݼdv-HAhxjDc^h,[XɅKKplE w/㈏ddgEFG Χ@ ./B.GD(#ѿ+w𕛟/.XO>&O:nT;x7&":**tf&!>3"8DGFhnRj V6"* +H ;:4 `HN~A3L[a]k(06~8@i[vo7%%؆{ [XAgg6(<;/3g;r QaV~qQzVV|r2}*5f?:sH,X\|r \F; -o[aA!x{C~ 7#)X3x ؋W_QO#B^!&6nIa℄skdݳ=d;h>3bA?_z%ݻC}wb~c?>fz7_FSOI)fvEM8'|z^}ra\4bTڭ4EY}Á1:@9~T·:^vЋ߾v f-^w{{ʍ>sW^xly `wۺ}۠5qq,8Ƃ=N=}^C }W1mێ؅lۆ֤AQLVqt3b`z!"bTq]{cb"Bzڻ0at@ 8?}A-8}f<rvզ]ԙspߩ%kYy QB`5zC0@lővᐻ}5 -GdxޚdƝ{?[Ag\ :n^'0Λ@ڝy #O΂(؈NRoqs3l㈧{Z2F:|ǚD' JI@E! 9znBI.@`w5-,ok\!&{IEAC$;[Eq;rNvnγ=GpP}=Co~3g"5o?qKܧ8oAQ殁w>1_~(3eT-gAh5/xG;rx+#'{͆-- w[vNZf@Z6m8c['Up['QoQPUfNNlw--XC؀74'D`7gٺ].)d͙ o-^r󂼢5[l/G]yX O|{={BpSoAc.6SoCnQwO!<:q6d0D`tv_y遧>3Z|?(筇zh4ݗƛo}a֬ٳ9o1ט3g ׈赨3¹rp=am-Dm4] "eˆI! !༅ rw:B/‘],Ts 8`DLD(Q̫zе>-3g:ȣ$m_M >㏟ws傤>}:rdE$w "-Hn괩Mw[3,(ݗ7\brj Co;|0 z 歋Q{]%%8oz5ȍǦdd@QL,GtlfF۽n䨑}E /XE[Uٿ 2dXO"~]¿7}u}Z$׉%kyhzl·3+-VN.<}P}6ڻb㎬ӈc0#Z ;PWP>ݽb\z!|MNnX"G{ҰMoA//Soﬕe04{kA8iRϞ=Xr(ѣGs==bAB=cs??ey39ӏ?pwɽ)`يsQi4 ;o#*ňQߍzȘh_<cƎ0`B~wyW^\\В~ր j1s+ ._{ ~ / /\u/8=5,]+К ѳM|aBJO@BUv맏#AɽMVض >{~ݡν0E BLv.<!DySQ94=J_\` fBbT8>}HS k3ӯOuJ}y("d#Ȍ%/$~J\H,Uӷ6׏DE>}>v:Bߨ87oI7'ެtBsO]b0ӑ~`A, W-Kfp*}39Y> }u "_ZR9q1U2cko e$g =aC$~yЖ iVkoM*8?::>s^]M 'R w˼eBae:eO} '՟zYW]g.g=ve~%QaK 6~b8\ BaX٤g5EW}8|<;725_bW#PƵk5QUgZnLAG,y[b,4/5L$dfXS-qlc!elLr;D VLJ{N>jaHEy?`#t~XXR)Sw]\TSO3$Qɢ~S۳v=RHVSzsMYTYjyR Uf0`.М2E\Sq-傖] $}`E5_r%1cS 颯r d2%xtu2MTJWXLx4Wo&D&5ȵͅ'nOCSC%5mcN<[{F\ҙ*^{(7Tz}EާvMOkQB_Jh {tiT5 唝4k,a!ԋQClfib8O{dNܽWtag!>Hz ʫ*4()uc7aXq4~|QuGykZ\TH^y %vc9*IQ 3G-KYEu2""jwyq4w*iE67My8[ Fu:Srb\ʴѩO6A\tIu ,-nN~Ż ?{2JŤI/ 675I(VPDI!)A֡[G%1մ ^?\yL{)v@Yw85xaQAgK*:fI6°&%O6riUz <#+p , !#hvbNVBB-6""'x Re Waf%sުvxRX}zI8>s9YgCng&`SBN`[]LzeWb[1oy<[`Ă8*M:mk4^azM)MdQo?S~$]ʁĽ&/4VSA`4nkŽ,TN\DJXu !A|Qj@q (AƔ ⱸ7"\fNbWކϏ,̎u-GO+4yeժAMڰ\}Ar o]ָ-*Vbυ ZÚ(Y 'ܟDX3[jMNl:( rSc?N2mi[ab0:."$F*!/ː%Z]#^:-rBI\[Ӑ! ZB  8T5\\ z2e@Dς[[f7dӱ6=Qyan -y :o A\'0~Bƥ@-4BZ^J͗Nە.No c8-0o1GWx Aza$?Z\.@:nK*JDHA\10rI09O' ̊5 %A:t&|8AOQ k@dx³B{ .8Fbh!\"MG"=m6z `Í$h,CW MmܢG\歎ֈw-zQ,|r 5M FgCehV y`jy`lV [_RC˙:-5¼:>0o1 &yq]0o0歎[y[Z`\lH ajAo"emkOo|~ܘ)?$eweX$"eDMZKڗNy=C5tVqR-:ʩ*qoc3ɰZMZrn{oL[ F'¼՞ 'H/"/0%D9u2MbN}M\7}E/`t [r}kXqI.Vר:ȥ+ ؟sLGFy/tBI5S.$d}:/.D\N|8 ԈJר`6$A],G8(iLBL]KQ35[^;TBDW6yՇHr? +jmMEnT{3,y 9o9]/U^YlD [R>o$l:8*ނP۷Kfefcob݋*3lsK zZr[IA#[/cG/Qz%y=5|~\druo1hHngPr]}| IC܃i29{2 UI51iҵr#T:kg:©;>@"ZRaM)<]2{w&|s5k Zhmbvƅ+I`!,tx ƫy P~|0czbB-}+ VSV% J˗qﶆ)_?gt**Yv^(L_rMQI׃ԈU`q/- m;m&-~ k`j`o!dx4Oҡok~[́.%b2rz(w!N\: 50VѠ*U:-1aw׋{+K!7H~F\^  AT9 +jՔ:Jӈ2Ȃo@̮歲rsXTz>EF@KXk"Q#tS'm&]-8RFLʴܚB8@h\-~ k`j`oATRMmfҎ4R$ AWۼ5b.xkGsw ٠R+JFH1`F\u0ZtYOw .Mm@{WwwzҤ;4FHNȡElk/$Ԟm:ؚy KwmEPNq{sjQf([]Иԃ0TN]Z-Fm3GHeZqF=Y hr%ڄya޺^*A,z4W0"Ap>>r:wqr,"XT݃eMە^Jܥ%CpH(TRx-xvlwQd3v}$E'JȍBƮoyYhIOK7=f}riWCB4 8XƠB$r1ohY"쀈f]t4/D\hPP鹸 'bR# kb{rIB:\󙈞ۼ(Z`޲vt_SK!0oe0o]/[v¼e2[ ct6M:>0oY>[&ü0Fgx?_ANn歎[OIS6rajy1̐ *(WVkr9:>0o1 3zdRzG\e0ou|`b\[-0oY;fVɢ%G$)Ui)6byq]0oeSg9|.VW*jT]GI:|*D&hPŰ2L֐9GVANn VLJ{00ySeZs?ăy\0o1 3ޗDm$l]Fc!d0[ +Ì΍^P-U^Gڄy\0o1 z1+Px[yaet[-O4>6a0[ +:RUtЪM:>0o1`޺^ -u0o1Cv}9VbuE !щ2䷵_X6 =O-0oY;}.%D0ou|h{OgXkky,C MJǽe[[Wya L"y\R7@hސ~8Vn`b4o$r+)ȻtA`ϔWڽ>E&^[歎[݀քim~ay-k4o!*QK2G,S#&dKUFIa 0>RVZzI/ 0oe歡bSe{ѷHk4F] Vnkh mgjy1[3%J7[%'#*fVɢurf4vޅm$[-0oY;y f )6.hpR/U6ü0Bǽ$8XLimm2/ӼF,r) -~CF0[AM7,~E"$L5dRI#0ou|`ୣeQ)R %P1oet[&üyoHTPDҥ<¼c̐)m¼y`2OyVK~6/~cL^Q(Wt)y2Óm¼y`oEsdFJ5ƄW0oe0ouL,z 8qrs#yɹ2ZwVRcպ[-0oY;y ->+"Iuڔt^֘[nJkuz#.9D\]YGJϿ&d7`o8[^-^tF\]נS&~-0[şSY #bw8\*Shgfc:5|A.ς*FQY3+JI[HY^>M3ؽ3 (dɤ=¼0&x ?uK̐_$56:f ajy1[ cgck`1տ*?[^^y ÙS,I.gp_R1>i{\Kmiu&Ğb[ sa.$k.U9{q`jy1[}'.E(j1DT&6zVis0o1`zN Nk#ϏsS'Fv0oe!3$EJٱXUͩɹ u~|?ፅya.LV%ْ ^XQ $Z`޲vLЙ[仑sf"ؒd(~@˾i&xk*A Z?g[~V\֝F+lV [֎ޚkԯq9>֫o13o]&x+ ޚiA28.>_!i2v5y-kUujqt؜ؠj׵Y*}X[&xK&=_˻{W\Z5 c3W]~qgS%\V0i=~lɒӐXLk t"SA1tVaj}1iR^b{`b _T.e `Ѐٻ3+=WdoIeZA{Y¼0blqY 0&xErJ[ONkd -|6pVϦwDHEb&0IepRs [W&MIZsf>wo,7a_$vRF-0[yq.U"ϔ3fBJ͒_^QW']H5 c!eh.%Չ=ΒwiulLA5o [y¿7*B?nMF\f}EQ'sbbYz"\Ek\sSWըJbٯo oxoy&PSbkp-T)7Uu\rWGy 5!ٱM-MxBmO1o1n8&x `-rH\营F9;˵8;Û>ʼx^ aZ4ډpJJO'G =o~jU-N\KLЙ|E);d<٨e%*͍y?a:YWgv  ^ 6n[ saϗ+u~N׸Xe|ُȉao]HSUlN,!1A]^^ ø J2o(oi513nfvCvv(~o)˖%-%v&zkV,k9/X>qAr[ޜ*ShKUX|wMC:s-0["TjO((RH?0v{J)w<^QU_.jn3Co=#o Zkz ~N{냐^>[}5st%.G\:-N$쓜}90޷cz>hR>#|æa 0[ϋK˗5hLI/R˵\lWѵ V o qY%gzcQG˂CC1#p>t}{Z}rhֻE h@< TQZ|v0 z1Z|òu] [&x/^X0rv|gbRK߽t5Zo1\TnhQ- oK=iQo}J}8*zhlYb_ 6N"ޢ7 DG2E< B$6eB_$ . UT; \ 歎[* 2C2jYbZZ=ۥ 仑MI] [TbE1re9E".]X_MCAF5@䢒' Ƚ-Co,=Ue;Y?ByTɤi5*IGu׭EU LOh0?%H&QVF+Ax0~a|m<ܹcΕ6 ,0~-}]Y#~NZv!Wt yk BxPPy y,pJn[ saL5ly'&J[7N4n[0̑\ni;YQɕzvV᭍G6$xkʤUw؟W'-v^㚻@,\HmЬu]}5a޺xuTzjX0"V>U2հXw4ofڟ( &/ITjm `üy ŝ'>99A5:]#Dͽ5柬^ikjkxkUҪYZ54:M6|U1[z;R `TlUujZ9X2lN~ߐY(W`iKeړU͋Yɹr*N~`ij5IçK?Kfdbt6[gk՛aBv:Zۛn%Ju]]ֵ羏>;Ņ/oo:W$y )<[0 wqLk`)ULtOQzL3I(+ 35ȵHUɗo±aX\osO &fbt6[+JU;< ZpȦ]bӼkB̬%M^"5_WD7L-%ÙE͎*c#ϳϊj;$ڔR^>\Fgn&iV<]whD]]rt_6J"CVIΨJ7Ki4]ÊDX$7Z]YVu8 DQXzk1̘-9iVKk\sw^-KΕusVE~eӳ  )=mUR B@ zbas/wb)n#:U4b)[o,+1bb+.^k)Nfz+O/yF}QrVV-1[CgIl=oZ":UTusV~$?[R~EbI"L ժzMMp(r (!9 ](SjpԥP鎟);#!݄mDWcُf~8CW'<5ոIuo {Fǿh{{xmY(\\^xOwy+l^^C_'A6C>}_=2#)Az%ӼoMBB-*,dWdoA$۬:WEWOەsZۈڛo}<1)AԝsɻQÇ3%[oᇚY$qyiQ钃JdNCA`s5t!\ڰ-=yu3eY5zoЍ <=Q^'А௼HACtrGD{Ôo n:~ ;<|W <$<˰qZ{A];.t=Jo=(xx(~2׋c'OiU\/UV_R+kիgZ* !~8=pB|-Fo;ER - iC-Fgcdw1 ҂f\UUH>61m=6`%+x:@׏^C" Wxd,:.ApQe-^Kg7$, Ag^_/^={:k bg/IHۂZ{}|餡o者v녶?z~=XeNz#>p$:ۛ t }ΧXټ8ëk8 "FIzYTocPlF$ÛŞOϼBP\Ga܈+x㈏?-^: ]):{^^ -ۑ2{ӂZ'0Iy]66 (Ao1+[lkRV ٰab1[nJ*^cLO^y`z6IFȪ&#Bg{1ICqkCN > E޾AhKg1-H?% jx0SĻ<{}W?0VkoAqŠ 2D µ6_ɗL{h]rI/tKzo}<1LTrmL; 86y ݞ :"t=Qx9(Ga˙F#zE>OBgYyޫ _!A ,nEژ=VxA6{&}Bp Dg1⭧n:/|o G@/fgb>o އ# ס% nœ|ǫx׷xpkpYXw,[dر!H rz%I'}G}>!4»xE^1[ѩxPoad4qAHCZlo};:{a^_( z"`BEo,-wbr{=e+d߼z/8(xef߼O6ɍM7 ]_ VC5{do ן\yk֏^wySngʮFIy{3w{``9:lY^ adrֹ( 넻v}CfH2Ȼۤd{5[ZoATϟ|o4qQ*RL^K4;&x+ J*,r9x+TټSQ[R%\i4*J ȋڼ0nۼnsuEu&ur#;2vpUE>}g!J"v (dr_1tVlI%CgJ>)8M|ΐ rMp7cG"|ˌsf-bpFn^:]ߺٸ כ|S0[;[-U5h.%^uRN@OM:>X z723Zb:0_=tPT-BN`WNCNb]"ơI+I+ xn!z~yϑK୽-OZ'mJ݄ICoJ-:/OYz4bLl=BDuZ]Rj+ ޟ|<܌Bb'w&]!qmJKnѬXEURuc^ٔE_=z ; ӫOa!.BrrdL du2t zvӹqsdלYߍx;n1۱@^`nb/%kԥQ49GI,{re1wߗ,WSo{]DH?G6Q_1[Fw#HK%eC?>DK-[ZV'arTL qV=ny;ߒ$Bi:ק(*E}zkޖJ ##CoeqX0o1ӼEOX(TZ8k4񏫒THFZ[Tz+&M,.p2&n 8ǩHGWQFWUkyyE*RC`>-uc}Ay+bPxV]۠Azh``z̆ 6 UՅ§߶_1=ۧvvVT[/|I\-Γ}NKU4VYp(DѠjsiV)bhrQDݬ"O ¼թu+5I<{ l>˞+m0[ӹq32}G.K4iQ[[cRpTu;S6ze"~?[Xll+T:lgAT$eÈ[TU560[CgJpt5[m^קש.e]VCVijd4}}'˅lJG蓎,zj+t+xNa]nq_:+^yO? W{`/WTWrKyeJ$kO͗Xƌ[-0oY;fg\0 ޒdԋҥ<3 !Obѕ~o}<;PP)e0o1aFo &jldoyau!{B;L׷,-1LVɢ< -JY$iy`2V [֎i:+"-Hk I [ #-E"䏍)?LȧsV [֎iނM'1ʻ`Vn r;S&m~Y/`bÌ׷Vn;Ox5nwx-ya.LV 1oH +Om-!TJ*3[0o&&_g¼0&xuEJJ'N>]*+/R)U:sͺ%0ouL$j0,N_=Co ~<̛0[CgJfdɕj~6kΞL)[&xk.9ŤJe_-2v^y-EC=&h -ʠgJΊ_rVn@ǯo3`|Ernϫx0o`k=4F-J³=8ʟcYӳ`_@C Z+ߚjXj0ou|`뾌?6hf ajya&;^opwVRPkRї/$W٪<歎[xc=O[B[KMЙZY5baڬbŧsmI,*28F0[`)CB*j`VV%&+=D/d{1Ų^oӿ%A!&(h[-0o1`SjM#*w`Zu[ueK{IiKe-=M ͍_ 4o &I5FZW/66*nxBu Vn`:8#+UwgߦY&ߗQZTGXۻb]@gü޺ݟxS7=5üu5[&]ɕk?[;=nhg: n4)Ξw?<~{xM~0o] 歮Va`o=qߞ b, 8-ܝ`޺[]A%F_e,[x޲?Z(0,Ck֧ _$v6ao1oMiPI!tiEA¼Ղ%{뫣˝NlaQ5;No:kTj]zȤNטU,{1oe|p؜Yv];&[=oFh*,]w'L8O8q{Z~%0U<&=9W\7riaI[-0or_7Y^Y-հFrXW OHӉ{<5`Jj$_."ksZ8W}5 ɽg5?!1z #\$a;zӼwLVtBBYWi̺FB^]^`2V 1_Y.aob#1$a8r^ &xXHYuf}֠d/5QXzvL yE߫pWVSĮoq0ou⭇xґAĹ%6D\H0DTNEUy-Cno$acMR¼y?o 5/<_Q۠FXP\8K[-0or_j?[:zDң̎ 2 ټÊ=Brngʶ[:Iz(n%'e;s͋ 7Yd]y|ɭ(0,&[-0orx焘z6D4VԪKUtߛSw9[^W@,|;q1m.݇{d>޼?УF~b j]nA#ɨdN#yRlibjyː[;&RJhW +NٓYUL3ݗьy+|Cp6|;'&ٻ[&^0/&x+2.!% *M]#yCcw;;¼!7Δ(UQ5V"JȌ=a}r #K lI9 o'8+ߒ{_̌-Qz*wcקTIծ%HjQQ=˾[Dj>LRoa_Byúo%%%_!3XɌ,`u/l.LOJTAU,IKse_/U+TY{Zh-Cno"+: VJ,)A?Yž;J)ku 3 Sud|.Ɋ)"z$IQ12VL^_MЧUZ}XS 2oM=א u4TAR~WU6a2l^ܡ`Q5-9EJE^#[nj9UH'O+#*I8E0b)7[#&ѹk3yfp5DzGwg1 &x+,60o55oH"1Sn /oЗ7g'22n-1p=<^ 5aBm[W_bW$4Ύ0oevd:>0oԐ\.q[BE2bBrPdr92VD!0{56\&xFPuqGT4>"n^aCZ`2y0ou|aO׫iIiU+c,A29+W!&If!DSjR}a9I(Ue5nBŕl!o}'~^t1dd3oeV;aLגȉ?ŗskI]qYr.;YDt0VXTd.mߔ:[/֕-C 1/7Yv*nVm¼eV;a޲:[;qxsykM~}[N:>0ou;#5B{zhuxK(#zv2҄W'l_vzNe_ -C Vr{#퉖)mqV$!k?}0o1ڦ85EK{=T1n:`b Vajⶻ]<#9S}t闋m8-F0o1xXs&$,h*UxErJ[(Tɕ|Y]f[;J0 z6[7I9kyar/Vk&.MH+(W/U 5abXo~\EqXpw^;Vdr]rl2-ۛ5ηgo*&[ ;=n? ˡ!:eϓyX$Q)Rz;-DZc^6=0o1xX3rU:q:DFs޿-3*5wofTU,7Yo˵u2>|>{U 5ab|o4O?۫77n# ǭFvVE+dO[:]cE/% <müabP[焘>w0D]}'~-F0o1x0oYV᭭󏅔9my_ďX aPF+xy߽춻|Wal>üeEX/Ufɍ6fdj᳹nf>Lok5b eS o0a- My-C=[-ˁy`0ouc,歮yüՍa޲nV7yr`:=[-ˁy`X"r.3I  {t3#Ʌ!qiIBZW_kd0on5zNNԼrb ˁy 0ou{1[V`0ouc-3a0oY[fyüՍa޲:Vyüeu0onV7yDo 7>s[-n j2˘uf;ȯkgu[\r&H7K s$a;KV%Ϗæ?0oucdzcS5R'S*]L*7_4\9j%ve{+5_q#3l30auq(4)yNK!9?V$V7y,o}4!P]p+m]2R&mO k kkdd( 4:rK{bs( #.$;3f!JUTçK2{EpiHmmk`) {MY윅 u\ꖏ>D(VXDhx:8ṗ [K|NWr5IGNbCrBPJVfzqZ@'9fэ&(/Sɴ(I+^˳`Ҏ4XHghJl=:#eC{jb^O\ھYG +6մ͏ԚF}^HıS%XS8gXw8+e_t,΋C PEmؒ\?L< /U\}yJvIk}{Wwg#b`@&7|5,[+ԗxL km(PZ)iollMI*)W8ZoX^i!nENʕ:1iRm4F(U$Wuɹ u5(Ȓd#D%m?hb/bv|a솤:V=g6&! RZB53{7>m:O'z1BA, k\sMJ/ MQ`; ǣm<+v+Uf).&U(Q"G4։Fb%4*?Ex mX\L+Pӥ8\)Q[KyD,\-[yBJo;qZq PQQ5ύ).kgLu[i2#4aN郦7 KIwL"HɯZ ae⼽͋렷3k` #~%Umq6asbRV):56 \32~m&[< `zRtvޅ3n 6tۥ jdzcN+$-LrRl-z }cy$b'r}z"8|$,x\9nɥ6>*µEY*tzͦ5׆DԵy_r,@2Ȣ:R#jq2Pn=NoYgѼ{ck`Ր~MoѴyPo!Zu0` VH5TTBF+VI5(P_jDh3rx0o- ZkhCVRNTE~BQٯV8`]FviUi~ȸ*\W\'4B+ԡMCKlur-t(tȢB$9iw-}[Bc% L[&W0#fBq1 ƽbJACoނqFbeMBvIBLsX5ĚI qYnxX܈| ͣy~1o`j'[z2bA޼bg IbN+֩D&C^,6|/uե0ou{n*o}8!&Mڠeֻ,9T'Su:0o$`&5}\|A_ h-]|W@hܽ-t6h\J <{]0ou)[ݞ[ʪU㷦!< NFt<@9_.$_Q@1G!#tn0Йq[ȳKLѬX~kΈ7֢TEo^3%n"uo5O"<]!#wSfeí+߆3y?U LyM a]K^pұMBhI7Ob; ih$Ʊ5.mC:6#&q+62-ρh;?wM}*Z'w%͍\@_\='whށn㭭~B/y 2mNX\t-BXH*tSjaJסiXC_qXz ++Q Vczdt[(,I]JCYFUIeZ[ֺ6oƨ+w~>(363靈5 ho:[$Κhaie~ZE_\\BIt,NuNц#yh$2.Au$BBK@qKyѷx ҦM5@y ||UP"_DVIR^B30TԪ^SGTlwu lp8צD+ !FY[VV{hYijb[m!tȄmi|'b,:SbzBL,e7J JTێoqqUJ 73&U49M:bd{.fJ:ME.M N }(ڃf #L5 ׄB9|y|R/֨eJa<"M% 06!N-h0iLP[O>,b5k8Pge YCx˜oO7[-Q4XqTRVyub8ԩRaA p3u8Q +iF6} NU(uIu3m3HV }C -lbBv2%YtjQ!cָJ22o-ysx+0:* m^ޖb]3<_tH+ѾaY0--ɱSNǐIT'S-; *6'%~PI׷SQUM!V_, ! IXV{gI"$xv_1,--imc~O$"$Lsw='-a8#vYPp1r} 5@c5h׵ɕuj_]x$[[zoUkfnnG=pତEd޲=[oBx]|?E$" >x%Q IdJw%oq @Do{T z-Y *$ӼPg"l -N9E_^~Q5܉I XI F\Yh9dC _A^?NoAtRjGⓑݜRd܉AE# p6tFyj`<ނU$eqI+4E[;=[kzw`4J:uIWi'khMzX\MYAUit(@C\ pjTSVPoy߅y MB%5+maEVdoU(ʠM o_j}T/#£:KIDnCo?Y4 EE{^xg_t/Uw}r^1r", zHCO")Rkى/hBT>RD:d!7>;Y4nk*X~LLjzM-Q;*\/{tb-sye ![͋ͬޢ$t([@u}ŨzQ ^xkn Q钱ʿmoM@]Rj~ 8B wJeJ,5{L`ZSt4o{k xAyTdƫ5Tƽ`Bi#(s/ڌ\aeJK،_nⴺF0I#jQ8]I,jçKS\[VU{ jknty-,rl~IiZiq!'ck͡%mJEjHQme5j"23"jW‘ )Β@i0hU ssf -bG=XG̈tMdW _[X+X(z|G"2rh;aư~\4_-Lrނ 0Io ɹ j "I?(fKAP>RoaFlX)<(FLB"BB9=c\%Ieؘp6m>y1t 5a޺0r}o˰X--+}յ(müeE{w:+f0o1چyyˊhG&0Pե0o1x0oY[V) i}&TuWռbs2- o3¤V-桠A&1ev,SӇjk{С\6|a޲v`bCW [fyB`ځy ]50o- yk-6tev,VY*II_y_{vvbBEE 70o- :b0z?[<0o- y,xh'Oؚȸ&g/}ogCb'[V0oY~o1I٩_4t[{Wa90o1Zea޲:`޲y0oY[wީQ/=㧃"7_t[n!V~:wnw\{a޲y0oY[F}` /2dYO;F.dgq|>$D߿??iiÇIK<= X,x`2;[VG7sJs)f}VVs&ǎsrx?3_¼ea޲:B//:bxIaO=ն]`AUIN"ۈrN$q&_{M'dCHyURg|ߚkxxC/)O|n;fG%hpwCVX"ZN<i!)üea޲:^11$::^*%ڭC‰[R&x 69e0Po!N icqUnnڻ(_~I&s!CD[66o'BN'@i=c(mܓg $14yI.rq-3k'ȵlN'r'I'My 7e{kj"01-\zu2'dOf&Yֶm֭$B:uL$7G@c}1\*۰'&5ƍ#O"Ցtdz {f_4GHɓ$qR2>l^($uӛ/^z`1䎌y}(i0osroLS3LܾCm PNPY֝wSr99Aw< x޺> b4j &$JPȼ`JLB yQB0i0osro!y~O'Mjه'O&y9ԩF>Zg˿_[RW|z"'!YoI*7{0?&gho2w2z4=8-nj[/LC+T)SH1 14 H4X;DZ4pS [9X:UU3-6Tu[m|9-6Tu[m$ņj`޲΁yany:-[l-|Sj={]%< l0osv:zKh'[l-<w։ÃN_Dn#7#w:0oϞOyaɪ+k)Oɉ}Id.׋/qdǻGxH;઩7OԲ*0T(KE["*вŲ)e *R(,Dq@pdPdPAQ*"""*"9s3Gk9ӹ&Ƀ|wc,}f P-˷23-̷BW%yVʥ:aH.E D%J­ŭ>}޽Y<Fu|6m X=wgܐlðt DA{{T-ZC@|fL0#7y5j9'<ƥK..||wTH D%J­-p]r5V")1epkV,Ê1kn-\*-|3fpӧsh_pk6cڑŻnJ[ES%,ӚxZsx$pkTzWxK{V`n2'ax8jnEG38::޲BZ%*QnMknuxN[v9OaIBBK%ˆT p9s#VNQЁeBs+*v#lfGIu6%#ѳ:mt8͆e+nwZ8JCՊSRŭ`cJrtiW0(\TF˔1&vl0UyzXeoV7}QXU#8L-Cb-F/؁[ì|f3(4:pK@-?pUy[pZ֖"&Yo["n[ʻ;pK@-?pUpV;)辅["n[ʯ@cFknH'n*s{0-eŭÇswėPm\s6jdV,aUOoر?["*Y32e];,,Yq㬍;2]1u*`

pU[ge5DѣL4f [s">Q>eFh1m9jbGힻ].[%rBrT)&v͸xͺTFK;eƂt)'472\/\{v\^yXg릅[ʷܪ\P.Ǫ%_ zq曍gaKgcN٬` DETV2/]KxhY]n.;+=y,iiƏ?+e}eᖫ-pWćnEL?&TsJT:/۷pKTDUHnMh\61G9|y>8xXϞܑNݻC|A> G;eÆ\IoŊ﹇;f8`>Q,rUVXՌTLqqVnXƤIZ+n`Xy &|M{*Q 4SI( uI[2pKTDUnUk.׮p<ΝDwqG[z,7#na?4^%K֮5}a/X x]ܹd 8/$XRnWd͚+WNdO?~nv ?ҁƯs`-0"^O4 2?֙5+ww[ʷ܂#"xQ 9Jp`5mqKPUsW")aʩ$8WՃD|p&Nŋ}ƴpK@[Hݱq8Z1K6NFVqG[3d7IIa/-¦D ,h(d@o:߁+ &5E8I 8ijNDHhe/]8wpEgƧ}31W53 \Ϲe-;=͑NF辅["r-)#<07yd-+j |Me˲ LDHmC?=F{|.|7QphL̈́K<0ڕ=ad ]YgUϠעEjtfᖫ*B܊q2?g'["r̭ G߾c,5hPap ѕR?/(#CJZY IS6[` vm,p+Uh\Ar|:|؜_?>T#ʓW+mݚ-WUU-9cnh_՘%KY>&c-Ԛ3g26?PL~!c&MbhML!iؐdڴ*5"ڗ3 \pO,9cn-_n|lD8F\32;89Hq z 7?z)k=@ƺuA V @.g3йz;µhF9}:ɞP  awj:(†+mE۷s8?z}5?rv62 [?K}ΝȾsk(w><<>|*TG# mۚ`g} 11|vXl[ ҠC8IIP @/v 6mrA& ![7cNVN vtsTy>p` s؎q5dc 9鉇 BL"UW~Qnx1W=Z-cyfۗ88cxn;u*JNJ2FDN1" ̥ 0n9P:wn]x-H$ͭ&!{scu0b U5uŚ[Ӝo7涫W3"652@n='={Ϫʷ] D"Ȗ\Vz:ኯsk4SfsQ# ۮ_?Чڑx e|(kH$ VhQ*ײl-**O γbzTs:a[*1魚k`ղX9IQթ=o,[jxb2':sdu23Xv:mv^"-nD"-y[ W76p \ H5B^=3Q&MX5sU #0:uմ4Vp (r9];bc̓Ȱ֭a (X-T.2 F;*["HdK ɒW^b | b͛gruv-D"["TkK! TL榅["HdKر["HdK~ŭd~-[%DWt˖|I辅["HdK>V*ޠˊ[11H?8c֛5jXjŊ X*:?k̜imt-H$%r+8XN:| ZWp/\9 K|n P5i·SR=ccr;waZ墄["psB0c"f@eT;Mn-g-jUA[0СێŴR{38Cu&&@'* pE D"Qx ڸќ$,|sE DOԉTb0mӹmRYEІjfՒ +o:E-B}e_Y%Dsnٷ~Nhz1͠c D"Ȗڵ3g̲i7[%DTU-D"[n["HdK-?pK$linJ[#[?f`Y5 ^bIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/my_plot_manager.png0000666000000000000000000006756000000000000015642 0ustar00PNG  IHDR YvQgAMA atEXtSoftwarePaint.NET v3.5.6ЃZoIDATx^xU׶ݵmwյ6DEQ@E@TDDj:zO or0d 9ޛ;wfιNW' D"'  D"~ޯ^1djD"HK`٪x-:P6H@$ .x"D"/$ x! DH@ B$  RV D"$ уx "H@$ уkE"AH@$ A6$0l~v܂|o+,Xqq?~1vCԔC8~%\;y}hy-|3jT>>ۚukG|U[_9yn6i{K[vsO5- YS A H ^&nO<ǜ'z㎻+.UC6W^}+uŕW,['oִ[_]̳vsVw7tS[l3-1%U5?h&Μofn\M󗮠AUKNۡߎ]eX0|xvma= 26n$߄CK f<ra;w/:.ot<8yeKNKOyȯ@_!!<哖]-j@DoÍa/?GWbu<#Xd_zVxK7aڜis Vԇ `sQ̓g% x<4;|'{{#rqܯa/xɲAVn!^xCzmgf]sftMQ}|{sseΙ8=ddO>{9_}5_G}W#GN23bvmdt|R&/B9n{ee8][wĈ$&Q"ϝQ_|ü%㒓i<3p>mu*zXvԹR22pkÎ|Ӕ۶붘Ӽ#: fh\ c)3LX|c' [a3mS%^p=ᣦrNɗG-9=]]WOض3gM<x<8 D^h1O<QmFN Sn}D-hhW_v>yFƅ@>п~sU+?_yo4xK/9t<̚OwoouGx\sͧvs9r^z\ /CyPZ0NV~㗣~LNK3!61: CV~?'YTځa ZC3Dnu:H߾SۥK`>nhy(Qp<|ds-Xb8/^6rDt*oISТeKV~͞;hIŹdj# DQGg(x<CxΫ!reVc_B5d/\GzV%tg/\XFl L17nU!1%?\Ï?3ۇ(S)-]rg*<w} Cyg5l:tjX| .Q+U{HIO~RHᤫ-,"rל|#`[IXRj[=Pߞ@M ǔY1 :uZf @8T9ˈ'[8On053sYu<Qa:lG||SZ>+CC'&k-V\^|X`ŗ\0<5#W8ӗ,3/Iҧ*=D/nz}oJZ\0iҩPYj1}*I!2"x n5)v0*O笘񀈶8ez{făxԁoMgHY:w(W|m7cu<@' КP>;<~yd>Zxjo]_ l \c@,f.F K/]W^~'N9c{^%-Y|)lشQ--#]1c8 ӭeiZֈTzğ<տCVx~xlo3jiUPQP՘0ib`pb('j]tb52ozF6)5.<~Zۏdy@1yW߳hj)G_|MxIVr +?xh-ݴMk4ÿ7:ǚ[MZt<' Eea #2rH G/ڡv@3|$;%bu_9XdE\X t!SSX(Ec#\I(\xʹJeLqE`܎KIp%fnv0T]GS-KTYq4OMo>A?v`nz8"ja/oYʋU6P p+RRQ r*6C;W x1"f_w\`O>n=1؜n=+x<;mdw!fp媠/2Sr9<$ xq<<{XI˝~ qϬY.an`@ߥP\0$~ wЎOʄUx58SGICC'$Uk`٫F?1ʊU+ Ųi/jjaVN)?h ];=a<R_$ q "H@$Њ2,D"H@p&{<  ? H ^H@$  H уH@$  &k D"& D6uLҕ49D"HF]{`P9H@$+$ xj"* XDH@$  " $U8B.zm!T/=Y{.v%U:e$ xM2îLgY.״^+[{-LAЛ$.Gۮ厪Co|韺h&٣._ zqtr'rktl#qdžSFJt/qliד7;|xKvTj Jx e !Py iI.#bxce1).ވf oi}< n#׬>ѵ4R ]JJP)ڸWtu3 7HM؟*CHlؽA]Y>4qnEQF~Z粱A2pt$*+WAbt~sm}HMSx;#nwx}upQy{iJ-?/(?=X' ]DV ֔o߳j)KN2XQ_dkPr-[T%4=4pO>9a -ꇻ՟ooGxz1W>Ȕ~qNjEEdZ 3h?|Ř_ PjnkՁ_}!dވgÞUi|>0n NhK<+_Bg$0|3} 9 hTC,Y?L-׬fF ^3H+i\rH._tF洡sBQZA}vA0 @\0cDEeݨ>nVCO"M3aLQ@d/xi宕-Zݛ.-c|Ԭ99t<( hx$|Y97MKW]ZPUD"54q(LEwֲ$.`Q"^\δ8 )/| l*1$nm/_ZMʘTY_]}SIO$Lq xv<ӲbVZ\1QcD1x \׉%`mb_x9XhGYS"q^xU);v߉z0P$%DȖ 't<j>0v .OmMw2@ 3N!F -c~H]BS'x On%31#wf]:}ה,3UryZkuKT`ø#+<=M7hoƳs+x Ȩ>֞:-t?DhI}ʊ)xt<`Zwʋ8RA-<0^ 9%ԇWx Q(WL'V !Ux༌ YM9KWD8İ,$49zu$2 e, ƁpStKOW: \^im)?lwDo:H\T ~ U*m{63?>ao[$HPぺqgSSڥ4 TA+-; )BX>* :()<"c?kXŪMJ,RiiWK('CSUH 1!Ng5K[P鳏: O̱ 96HQxxp˃\7ҴUJӮH܍c08F j&%k`v'H=)XN Ej6Ae"[hY]B,0!zSKcՊNe,`0B'F~XBO\MQNxd+R-LMLbaa/e %oX/le JaM\=TXĂk"'bDӦ#.0.ٔJ'䤔Wb,@&&6q-Y7Ȗ؎B/Q%٠2f:_j@}aϔ: K*O2K}M@<1}xH:#;dtnԻpXO98$)CqW PXfc,Lb dm ,@b:) 2ں}ouTahW5<:Cb~W>gm)Բx0 I>( )cK>Db $T Q(N^z:VݨvZ;u ΈRjb<W?+W#8Gkd[3D"[=.%RrCj`z2.=<`@-P>58 nݜ!;MO,> rlZE%ԝM9P&r;d _xy7kFˁ^'6& HzCkg n{P^k]䗈xty7a|IT +k&z ?R /#'l<!rOEC<&x`dA9.}0}}%x iIYMKߕoPr{y!xF}WSW(x8|`!eQl;A`u H`_ V7=׾H`k K&FO xqE[N xQl;A`u H`_ qA܋z{Ӿ6lfߧkGe#xox QW2m3_mU'EN}Gxꣳoz;FXG3 {wS̹`; Lsg\Vzovx%l7L=9n2՚t!gʼltYf}N{ u70O;kzkA*9l> x86?N->@1pƨpbqsm;./?H}L]`L sa LùI G1- Px΍U[>̽Fs+ >YjNJ]p > xrym}:L;0o6$ScYž{a~CFSo&whrx(An<˾!3^}q7XgF{E}m4@ԍS|lC{OF1o6& %-#;kKX8`#$tuGLՖRn''xPq@3]˭G`wC;aeQpT;K4T(ٱ뀣AEQweU4jj13 Vix MYYhl_ZBQ^bCAm<}5Gj;*lTtPlTQR!Ewh&XsA =Uu k3'⊵_$O8HC8AtX=zĦ`}82jJqB{uAGIcC#PUuI[ؒ%4*j5-ZM9*vC`BR5|& ^ ʪpWh Oo=ґ%h4]J'l| JLs4f*i 7َCC6p qT>2R6.<"h H)au!*@G9 \i۲:u"z&eAk?9H$H r$uCFj'Tei_nI2͍גE f8&kôQs`Z L `FW8-N%BTT¦M`{J/.>Hb_6k"i%ԇdJJcml=`q3>hLZ>k[.lM7 ;!痪<@yKJ(]_$cw(Nl$Ĭdz푭J-xwDH\~$B:Қ E B PcpJ.oRP&Nu׷lOM\؊!JLdRC(U^ȍ?8EĈ8h٨Um&9\`@;J!,@A*CH[tРkbZ\yAfkRj*Ur kFT!Μj7>_׿Kv7A/1 x~7ݻޜ\-r2J’b]D xqKCm1FM>.7"CmAN]b<-Ů7_xlxr"wかKɾ>Z潖2ЎlݍNqF|*7[y>!gcL3x1#9zLWF%ԔA}TuTQ̾n/b̭dt}X&xj1}g=o|otW-wἩؠߚ(Xtobrth\n̔9SG=ۉ Hխx(RߧeV|A0|F6svU?94$lcбԿuQ9 )'sэg>ꤠ <:J.8N#g g c&tnR߅gcPrJpfU]{pWY< 1ia>i$쮡(]YyyakN'IÃHqOs0aAT/&.̟p?ǐo_n [COנ'ssǀ>/ ?^R[RS^1%V02 x$dU7R \!j#%'{Cry">dbw%fWK|;O=?2ߣ^fj`M<(uF59]/Ot3;l֩9e)75ҿ8`w:㉋Nte5sCߛxܼkט.wV[ s+sLRy+[J MaN5&Z}c}nM/^uxhwn,ӖNZP?0*eThqh:xȪȧq^n/2A-=܎[7&9xɋO@sP &?}[[Ԝ;RxnuFy&ZXw%Kh m CX nEtx`ܶ񶿭2y:i5e.Yu rff5{Dh=\mUxtH'?V >՗+ͥ0_Ø[(Mw1 ظ34wa|ƽtW,\;`y}9?[RFKcoȷIbx%'\E [{-[T%FΫ썍eecd2?WXW{G}}ĉ2@s6Nau4P*)> |11EE@roGَEKkՁ VX9  [%0+Z8ܴ{ nFHuE5>#vbZ!|1l߳9ڣ_u|Tb10jE䅐*e؏^W2=8XjWxݵr.2 T.8ݨ>WTanw"Wy m߳dk?о=Im}O!N{~ZToik@ >=,alZ_C?.+i} ʻG\o8؅B yZIzg97m! ^8fW1兹U*Yp%:>?Xs>ԥI'\Px_$o^k&;~`?V0F3*c,"-X{Px CeQ3T5C ZU&PL-7ӬCnqG?m|❑_RCcm}7Ok\AEꆯ :l'Sǿ2HD\z3a@j@42>#ȩʨQ'}^J*Oҷe;_lƕKVZ."q:~;_5&xضg۬YzE4FぼTՇ+'d _%DW!j"EGĩ4nᐆLQ^Z<*^OMf2 V~D҈zO0VxcndHP`Px v1>Bs0Ɖ#B_ #xi(S;gM1Aq8 aly'.sg/mwF(z>׶',ܴ?4Q0X*t< \m7R x읚=ʕqS5FY>FW%N{-5Nic?3] k깆7t[x C[xPxe-0?]cxв4mTpQa%1rO_ѷrj CdRc SJNx;F ,6}E'cE:E/6ވG+X`%)/d¦(<\*LƲeg񀃉BrY,U.xp$1 (KM*b 2ld9pSȡbJF#<5I'F__z>!BDG D'LuגBTYU}4MR2I}jeAWFcCuEz|ʲ%~M򤆨lzWyeua{Gu+w>:`ぺQ*eF *DHo2Hh2YFKPxaf{AŸ, "J52dt<6N>lڥ4 Hd tǔ rP҆s?+D%L1#YUpϦ{(Α "K 2s#qBoTVQxx?}G?c\sriOeSi~m[~ lLYV ߏKɭ]2'}a4\=0 I1p$Y\]bJJ(JCY / Mְ6%ڢN%XAj"|b-&V5(YUыXՊXFY#umXiaA P=zgeQ8iZ4f~ ۫L/z")v_q<~D >sU/Mzy"Ud%<9d[R@="d/ ` `uj l CT1Sg (M{-.طǦ'S9`L9k_aXDžaޏ6͋&r}ߑ,eZ)X)*4m ՒTAٻ|rꙄhWBW%2g} [8UGgX݀ #՜m}L/u@Л_)Ųx6Yĥ\/>;o5!GxPf+gS ^!DHHTkc?c!#X˜Udhi0$A1 >9c1+UNa3VÛ>S@U52 U^ %$XqUVѯn )l}˄XTS{N PBqXEOZ$_}h`P={&Li :Tx􄇧L?;f`T.Wҍ_ x0.%7&p}<.{%xR\nǩ_@oO.o;6\(l֬<<׾pO xA`u ׾H`k V7=H`_ KE[N xq&FO xG=3;"۩O` >7Le씀 Mr}m>O ۳\7!wuǕxo]`86跶SgpFg ^`)M9&{O`p<|ge M+ڶo%šfb# LU~Mjgymd6å}"}ζ܍fi8M>9O`޶/eu7ޜ8i7|pMvѝ:Q3HwTos]'x0w͹FK tB2FݍZbrh}4yxCбK;> xxn P.u?d1n<̘6^2UxPOQF1O`ir jZ{[l4WۘB-aW93qV[HV"уAoN=K5$zpHw<:pF:Q xXzJ x0XjDz6]A I];\*Ƶ]÷iTtpI.\B>g%;wpiQ_AyFX!{EvUj#x@[vmq,0dx plk!WWXٗ9qY?mF?ֱ6ӱ=߱=OSЌ'!5nf9oYfV^)z`P" cE:<C%N9PM(6L|Y5EwT/ Qب5^b$0^(x0؛mpT"-Mђ, u+ ^ۥRO:Hv )JAU&у9.gIO vB%x T<`t޴ALvpbiZ#B ҆Ɖǟ ëCŽ l`E4T33R_Aa-OQ}@ޢq]Z*j#6.x0DF9&uLxX|xrpx&1}{-vhF0" Ohwb5;2F)\J';C+уK8W2HT>i E[)w*#(DwhL Bl̑䒑J.rbw( |,^!$"u6ru;E(NJx'Dm>f-eajz%>%e!/Ay䎰&F<0QeQNj"wJAXrj TsY"Rvk 6m*{%8EUfB0TPFj==imm+*S7:5' ;{Kq( 6] *n ̵.f[<ځ!@d`/p!)9ZUY ;Q&o^ W:Q+dؤ`N-!tS|Uk&Tٸ(_ V ([Ӡ4<1eP 65)eP".4JSJ#:hFȁ*Xzle'-Z,i=t:&(o&k M o.2Kzw‰my+K&0;I(tJQO6p],YǦUϋqNU4#0CM4!y5E'Rt7<&ȭxnse2ts{O&Up&;[g虱eY܍ٷxCW%Xn<|DYUY>;#7S<#vS"x0(㚹o".UIAǛ2t<։CqS̵&Fl;|$oʉ܍.wAtKy!`ҩco#4ED`bN:9׎|/8=3L<Ւ>38}tŌѓw#0QxF8A>i'Riÿóo9!菘ܬLÃY*~$<$M˻<zcq<Vz /09ѝ)tf+LO.F̦uo#+׏HN_뇸eBVłM'A`!-,Mϯw`Ea.A,ڼfw#aԉApK{>dyK⡣'w#iƋ{<3,ᑦ=2$O>3<^Ob1w/Q ]c⒴]wuޏ@c>T}xyx=c?NRvt7?Et5lF6'hhCPSœjH&juٴOn3L8H{\wssAJػpvUo>CMA@լo䀇M_Ym/ofrvjZeevV ExNYb{QKݑ\NZODն}:ʩ6Y(bLЩT{1AKќypPlAi N+>)YH8lvS{ A_NoNs1Kb9.]&vNbqI#g02fEқSA :ޒaShnޫj5qHN)o5lօLO:aW E8. )l('/[{g澳{ Q$Fl߃\gaT~9uy}*<]2]ա;H^KW6х|95{/ԩ)HNǙȽ>K t*HsQCDz< d-,i?>12׏Rx@z ztC\+rb|Fo}ڰ:8+\P]ZY< MY[U`΁ܚ."Ba;x@YڪV D,@k6/kֿão!f/; Ã֓׼tfٰiQbOղ|ۤ^P 75nqc$.3⹳\\<+8YY%aత*X\$}!1N3`2*{j3rN3{c1|H3UQkxNv6=40,D'%.X-:"3ds??LG[V̊R!*C5}%E6|1>XCG(t9,QPZK 8xm&:c(p:8>yvD"메'lЕ5~?rIJ@ x:;p:[Nz-@q#x<px G1|ڪF'Zw=(|O-x<zX#&uP&NuOvEE[=yv9Y<z85H\ H@$Њ"H@ ?&jsPM$ 8$ уD7D"$zA$  &$zI$  H уk^aB  $zI$  H уD"H5 Hйawҧ^D"^I/O{fdgm ztNE"@ࡗvˍD.J@ x D"V$ xa! DZbr1f"H@slUhFvl"H@$%Kѱ[& D]aهJD"H@$KP2L IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/panorama.png0000666000000000000000000042635300000000000014262 0ustar00PNG  IHDRH~ZsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>viIDATx^] \uJl_2=L+̴L+˽2r}dMPvTDT]YwpM03o޼yssϵ*zF[[[?8 6j۶m:(=OpqqYnݺDz(} /_Ojݺ[联y(=g'L|oc= 4@ƍBQFEk'@\7o(9֭_}_~2M L S|齿Bn_軏1ң*=g?wy & 6&v~G5<yם57~ڸΚ5ɪ_Ę1coE2R:uc߾kƷ={_K.Ffkkrrsw?}z^~-F|@qtxc(HoKxWǏSvvQ0kB:|ΝKcYX`ƍb(t4o_*|M̞=/-ZV2iY)@goX^6oF]駟0PLs$~0ڼ῏S0_1v`4{cŏ]/ʊB!]v'|Ν;_q8?q]^7᭷*HϰKJ56ƀծ];׾~ ڽ׎Oyq)YOщg}CO>;ou`g9jгgOc*LO>Sm-+H߁_ӦMwk&MЪeK-:|}XyxN3\&ư4s3gbڴi /;'QlhRFDRqr͋bsK?3,}3sx1s^{h"wAO]ߜt~d}FCwzbrK?3,}3sxOhi΁JcJUoRZn.ܘ)mMݍ8#F8\vİr_w^)@!檾 %&&"44!!!Dtt44;Ec?pn6mǑnKẘT <^l >z:;zw@q&,ŋÁŖi%Zmjw[8:fNYft-o׶ܵxR?tSc^k{g:ԟlMҿ Α%i}$xܰaQRuSJw5Đ&8rMzYHtfBʱ:4Djz1m")) 'FؒiH`|#ΜB嚆ĉ8z(3_CAP] T *ֹYz+Z}ůd]hݵ6ܷo$> R#N[{{{۱ ͝m#ac1发0qN?~abo yi@wGhӦ XmbY~tH]H޶ xr.?@F)aC1ἀ`?iۻ'~53&Ch`ֻ?: ŀ_bĐ9Ak eqa6eLzc)SԠAKW> *$2UfoMݪzD`Ć0[eǖ˼;bk\@N76n<ܰb,Xs /[9DN4y/~=y|ϓ|"@Lc Uaf6oٌ˖Xl4t;vXXd\ݽao. 22 ]_d k`)' pXG]Ϻ]d<** K`mis>g]̿\Sc X%K?922s :#I)|>t76V`?kr-Օ$>b9N1jZ޻z#@{>~߻;/wc<Çz=ؗ?wt/Ӄ@YB>0R UYϓlIRƩcN[;G-L{ھ]`- پ~o h~a۰љ9={A ї P_^y1b;zf݅}kZsO> yFZ͛~h Iڻwod_yx0`1@ uϠUZk G>=aI=ݡH8H"h9z$E 8m߆ &j?v2ҳK7r&Ʊ#/<+/iӱz:FwmbK1IIIb̘XnM8|p)@qaI)(* Q$Iξ}!f֏C \gxzz|.xu^sN!e B"џ~r*C SstU| $;9!"o5Wx q &Aiρ@&k|9-c|0Xc, om+ Fƿ h 26iL|p@PJoaЅm^Ҧ\ +:7)+5WH|0p= (h9Ҹ,#G\8m+P xzvAOpPd|}}ܟ1 }7r >cKKDHӴS1"Pu1wq_Moו$oÔ>}ziLtw6ad ȼN n!ϒAR_|R&#Q ιN>7lP9I״ZVE 4մ.-~}f>uYk-x{`^4#_L;o~1_3/];3g]Dfu. h2OXJPkΚ0Pgw:g?}O^QQ;''a{}{ ϲw?5qL^J]/࿰ ~AA,_D!tHϺϑ%@::ž%.^Ef3K7bMΆs,x96^Çp=_ޫ ]Ss;/Hj$~PI61K<@.lsbP:gdUk sI C8;/i~Vn/4CW#qXr6=I66+/ܧ3\{Dcx"$p7T%ܱib-TUI( Q+KH^Euͼֻ )l؏!gxTLvw?珑9 ,*:H% / T))AG̍+M]1/TJyZuךŲȌ.fx5R@@ p4#m V\i{c<\oL)$$;a~bfJyL` AٴمRl\=ָcdFL̰HذRe)P_/ô69l~ޕ+dlԩsXOGiH=!xyy˳,D1Q g߻M}.3ά5/U(46/n=}LG"Hױtrq>ws=о.TwZ ]6/.떀,Y|.-:k VVXC?6Ws+(~Du=wl-%ih t5XfI7JgK]|>%)U_]nX+W.Gh^D:l1G`';wzD^lEl;m%'W8 1(鋰=Ʋ]~8e~q/`7$#ۯ]Nln .*H\ί 2Hז)i1Ҵiy{ʕ2H#G;eʵ^@?u3A|ެi7o8Pk ||nodz*;M̙3OkkJĆkqXjFϟ خZH}ol 5O9iW \@Eie\6S@[!("}Qs/en,tIc bFQԷ} |322F12`LbLe`beg,`,b,f,a,elzkD#OKJ$@ @/Hr] I/D.\Kҿ ))Y"yo"0/)(̘f1V0V10236 *r#'`Z/'Ŗ#iuN].|Ê-XdUlY-c'll|vWG/X+҆ ?*FCC^OD.^ܯ#]ܯvA*qZaDFè{0 wJBuHΞ '.AJ>C¤I )23ϫ .F-7KGTKҿ Im=vV-##>SGר9WIZuھ^_D_o|ч#FJcS4!ha!+$@lt3c+cÞ^*̿N층o) .4{mηwzPLO\b=͋?Vorih\] v.7_r3GŬ MA^ 9)=6ǻ1]0~xΣy'N]g`BGY7_ h2]k˩'F_k05Ĝ1+fflٰ1n$L;/@\w~˖аhv$Kgvv{x8apv5?:|mm6‹B쵫W lM8z.[yv0zZAJK=IaG텓?jxo.Rtc#RlnGdtw?b fо IW׌f*MDآ Δ.(C$fHhK!qb0 'Ë],L봍y849fy~I'=WR䊥ȨbwHRCVZT}Aݗᅛ_)A< MH~|c$=3DF#nc='Ya(\3vh^~b< `T!Кqrא41'? "nE(jX-vQ*#Ãޅ[n,i];tg+O$_ySt6o_ÜRIOǞ;1u4&ZA!\I7&a5K1wڿӫ x_}DH%]5GmB3>f|0Y̐Hk1F&0R M"Δ2(C$Gȵ0v1=2F5z-{0Ev%y@]8f6+d~xc3H?>6huw_< o7؟]p$&[OMb쏋Q81}8--G1s6a5Z/]^ە)$J녴ql38:0qc:| bgK /Ooϐ@p#yƓH!ďLj)zx-) 囿nbi26 O]h2]hJy\c/鵥 Km4Uu%Q' R1!HUiJmC41F&0NșTReEb~G`'qqH`a$'Nh۸jOMڷSt+cxSli  }w0HN6c'IFdۓZmu%S3?/BVz*Rn'6TfŴi羝'|1_FOحۅ/an:㶲iy<6vvoE 8: 92GC v}c1 uex)ɗi2.St"# =Ͽ!.W]J5H78 uMCg̀ ,Lpԑ2z1TF0k$Ita#EJ)&vGLXB#scV;HB)+ZLN+ ZuF5z-ڗ@ފ;NW盛ض JY7 Dn/Zxni`YXr-&16\^lrRlW4n $*TX}eJu/11ǎ3B嬥)?@V)6l[L&s$p$1voF4R5ReX#lv Hl`bw 2tkdeAFvY)Ԝ8['*Wh^kѶzMf53ܗi&.e2V9fT]RlH )H۾ jW+VoSӕ:y+fX&h΁Z'=)ȶ+H{ w4|~g)8si :5~N.Rb}>"ctiz ]l4.:tw#\ UOee"wL?)ky ʹZqp$J:MF-k$4FJI8m#E)bw XLk.kJ8*HF5$:QGppsuF5z}4ef1XܓK aN?܌1w%U Q9[lL4" ~kk畈~/,7o;߯kw}]y]3fhp>Wq랩!h:OGNr8<ty<_?gXlW#b>9¶RnpX刉Vcĭ+V}+}.ÉylK2f3[b~|x 谠A:kّᆬbv ZF]pvba(Ʃdv,eS~%Ǎ] f̶ izcod%$3Ŗt$͔c'p<(.!N @: qL9(>adc"#!ȑ QB)Rt+HW(8<`o1T&Ajh-<̔FLkt/CUf1*Fbt(EypHk,|H[ c ^R5>Hvڗf+8G RV&@+2 i.E-c8Q 9Rn)@b% zh@ FkΌn SsZqpn4T_Ѫ.S*-#E+byģnt"qD>AQ߈ d:1e:L&ط(~xguYX8o?J`uy6x} k{` \B~Kgzb'H/SF㭇zcX2 *1s>COk^':h];T-cR>GV )VI^F C5?<cd#^Ȉ SpGS\,\xo6M'}h_ڧX&,Y::se Ste؂N%sAzW:r+7SRp 'Y"L̋]?~">0f*wc[, 9N2ئU>(<[FGziS~5WRR*&^M/>h/m52w}|i/'$]fbLWCgNodDMG#N~D`b<6ap[c襽5zt6ܲc+#e[6h)"lSoT RX` ~d &b{c$sQwvs2Hcd&f0][aUMQ!hH] 9 :d]mN\i4 3 i7@qEEi {L{)-h%`\;:`-zXNǖ۰qV 7ҺfZnv[6UJDa^~ᝰlVlz7۬ƪ5nMi\=mpWO"K \U(=P*ҾPjVA[r0e]ZdHw$oj8j1d9!GLH=7RU4|)u U4##1E~hhlx>xxvx[6sB˴NlKp >/S6qJY%)jQ=3te t7sAjV#y&<\#atwd:'Lޑ8d5F}Q.v{8Ădm\?Bͮ瀤6/b*_ ?O_j\j7Sxɦ GL^ҵHB f!-b:}Sضܑe;K3ek }ś+3~B^ -:R*-zF5b>x!dIdƒoWb[n*t)Cel@V{ 9]U8 AV!;B58OXZHVebU *RtO})݊H<1H>ޞXh9}ؽ67n.β\O_zEpyN)8ݜ]w]Y6E`p(<<ݼ~7kl\]]k.nuT|SvA#Hh"v)@Alq)ƇD-p7 Rk|1Z|ɐ'pz1q$͑V3Fb3&QFv5:pZi.1FFJ)5&H@F@FzZb-` ڂ9eZm6Mآ6KԾM$fI8J@IǧԛGəst[)H<7-,s=٠5s쑙ı19ůX}~1+g #-S"6:L#Mu$3/nͪubˎ-3q,v?|DjNHB ~xA~:c 7zɩ6ZqGp h}7mAJ~ e~5ԥ-qjI #ҷtGڟ඀H֨4e1-|Hױ7,_8ܘ %u}$Lݑ˲BpD2R5ia8 "T@5 Vd*_X%p()B}Y8UW03g0FbpKIJIt ]P'+i'="?ܸҋOGq1JUۊy* weUe-N F3ToXU;({2cC&#OSZM̑8PFeXb c$6GHi1=&( Yc)>t"|hB|dLZm=VV]4i_ڧ J)ԝX%%Q)']n#'.+M*L ]?~gh>oѵ>%r{BjFkŦn4V W5P|ptl3V$5ґm;>cT{d&#')oΑ]93'bv`bS0Leoߝ& Im?(p'e*O a.Ӑp^Ȉځ3aˑ7n"k26o_dseo8j)K[#yk$`thmmDdlMC܄jbߤqC7c4 }$J*7AQ@)_5=(@ZNk(UÝz"Vw05 $ L"@ ka5nĸm=R jpyaWnd*0egm+IAbtLuQ7d4BQYW ]bjX5{mܸD9~_iIKmټV.Ǯ"I6=}O*`aG[V [# #˰Q)+ 5hZD 9&0#GHFHg>>\tl|Y܈вf>eݜz=sgC;CF7霣{`vЉzGP\m<@'7 YI; 8(r$'cWs0y2ڵmD ȉi6||g|o`X_)+>#ʴӺ%|2^UR[w}ktۥvYGTU9GG64Fިō&sTJG%HQ1{+V/Y}&/_A**$4=cPGٞjd=E1X< 6QSlCQfp.*,̆X<_P3ֲ!CQ}Xw Aҳ) dnn`t\i:#&Gfzm4ds"Ɇ = ?A, ^;\J]3vB\B9i7Gզ6Xg"HNͺ qN[.ou#=RY#y=0CUk*0Sk2HCsR~UQ-͑\^HDbi)%`"mX1<FbhzƢ7F/F{+c`8~* FƠKczPY%1Jbt|fMlX/ł\֒M2[YҒ XHtT$5^w4Dzysq{yiʾkذH8x&`aH#q(D j4{_DdrvէO{>xG:+;ػmB<|k˾hZ `m_1"`0Ztlzc4l0y ;`lHC}fw$ ԉSz2=?7 Wɚ!b{+ GH32FEH#2G{D# :dq(Lj)WugyvUAKucpBT6l_j[m: !s x oGhG.ZGc{sF~M(~&r:;`B0o+< ѩ^5v+vFas bFc/+1{>J6خ}%;Cr%c[2N&×=3Gmm[qڮڭp\%d'?^@=sأmDJb~< RlL"#?$TXo @n!(LN5^qꋞIUXODف9('|@M2'z T=ŽCBQ} Aj{RPkw"DŽ_*0mALǽMԚeoMjB&iX=I*IXVI"qnu@tc,)HHڂAُi NNNjTp]i;::_9P+t~W<3կ_Ii3Yfa_Ö{zz&Tec= sjhP3ZBJ{$li,# ՀVUkfjm; |V_JIusd#RSZdfFb}  ̹I.%M褤ZArvGIIIKz0^)'A&$?%3"[z9y9fkf'Җ")ѬV_\uSlv1;b/[3U?;~o7zzl7=t4{9?l}qd_y~/̡'dV9#+Ik5A2QHldGiLiu+f*,dtU \,UZZ!/Q/HkՆ@d'KF,%Ss;2:Le9 '`Fh0dQnJ*MMqGr 'iO48gUF~O=qkE'&2PƓ)92OVrs/}`'f VU(ݜ#TNCHF$36vU3b~@~Jg>}`ŗ,!:R:*H}CO3RDԌVr6G9/fjM~G~ >#+HfUuQZM̑ >֨LD!0;$#ӃkBnL}dYLlHZwAML?pKa&P8SM%nbT&mrГ.IKNX-)m!>=mq/ #iY':wضh89lҺ2qkx:fנ0ގN᱃{po3N1(Y1vYd*ڭ P9r$& u&lE R$*VEW_}xrP/Jܰ@׮]c/ܹ9Ǫ?~6C}@X[h<h^3jH+wj)~k}2cGz3T(LIwx/l^#H)53Hz!i<;$## )kغR}LBsC˵^i{4^ 0 ,i{ ( I^UErgP՝}l"=RI)?˾]Od2HreI<>o1c3wq8|(Nz,Mc_us%4 |uǏ&pv;cw1kًeS7cگ c þN` q&jG~o4Mp e g ΄,B^&حaX !?zW ww!ZGVhF'C}o<ky`7î@D5-nX>u#VnA.?s{M4@"vZy#$1H)Pwv/Ae0mexXTSӤʱ:L5`-9ozAn^AY+ L>ˬ"44P臭DA|f1ЈB~}Ҟk);;qk!Y,e5 @,$sTɝ2S$?&ٖD$ DME)$2HHf-cYTD?L}wݻ7w^}}CѧOoXmw|2 }S 1h8F ~7_uCrСېճ'-zz1Wէw ۷/s;?.{`#SN۹6 ql`Lߺ^/%ŖAkk/WBzR-2cG*7#Sͪ55KI) %HwGi51GGNk.;4vO@OGJh<=Dák v^BO{*4*&&RO?i.:v<`&HHJbKh̯oY?&ek~1 aa&ν赇U\35Ɂ-BVHNP~s(Fo fiJI.٦H>*?rx[ ,9HQ Ы; F@^1?y^8n !;|{d#G'`Ѽa/`δ?9cل?&a巬9GE0̘<C3|+xW /G+ܼ |ֱf1wRl8+*퇪L#!~f|f3d )liLԜKRkbMĴH䬪00)}1J Di'H !AQ 5p[YwfW4/Ɂkh PaQlSg:#ui zIn:.U)y*tAnˤBIJbbҶbo74d?Ub/P埿6:dla?gHdฆYLcwPi8Qmn<_&VĮrx5pXEmQ4h#6b|V{l(Aۿ>/cܷ)8vS\ .}=6-َm|1;=Y/jt9?M y!s /<>u :m QVP_VDD B(XZqx8Q,>t`݈֮KTvSlbLdV $ Ua-lq/H5{aՂ N٨8;gr|3:d.G7ncՏTm '=3&XdR$&1;(5K.;Z/I^Мz6ڏ&1KbJJHXS՜DU&}&KIU $Œ:@L `G2HjAe 8vEڮ |YQLEuh|4WC&$k͈ p3ۆN[gW4BN9t3;k}{$ReQ@1:h0جFUŏ:},JT /H[  'h`>o`(A? #(4Պ2A"k*1va5Gi¨r >IBRk9(& 5Q'=X*UUN\?Rvwcȹx:SUErfuDg݁Zpݝ(r;I㇭* MkRv4} )D nKoF-t5$%}Mh[R"`ԊD2RLV;JfOFO1KT-'6mڔF9W\⭷* ]k}mw.].b;GIeKtCE2gd>Rzm(LI!#L!NpAY)["3&ݑȨcN5Oy9o%2H%Wfjil2[Qi5bې չ(=$7~fC#pƏ/vʨdJ)[B}<9 ʚ_>lOX䉪8[-AJZڧؔ{pU{*⏠o6['$7SFX1$4p[#ȾPZng\{)@Z lnL`sL2R{ = ~Sԋ2wMk+fzM췖GߣF[MhU/~bY䒭310bGkJ98PQXh K?75ʸ'- 8 0 ,a2RwzOiOIǣAn3bϽ0X$K4OΜxޛ+fΞ~ RhLs>zګC_з 팂R/{T|Qc05$f9 92Q"#M3&bdN.|SeK_gAPYD6Jm -Otz/՛UmFj{wRG6R`KnB4!5OD'$K:9Ð35Rظ ]n3RmlVk!YDh[#$1HǏDFF>ǐku,|{<yb@i(-CH/ԀD(3-A\Q!Y;Yr0g - ήԤ/_`ܿnTw@Sa[>/eq2#WINT${8n<3Nz.H͛[ߍǯj6<0VQ*zx%[o̙EiD0Vހ^p%SZ3k^lg Ar22+UE~9Mtbo:a8o\$L$ôWΖO#S# ̐;XӼt?"d. Hd$= 缇2Gt p[ w+>.8^.8h:$?wg- s(]=d'C-رq$6Ue[AR ɲHq#982҉'q8$/TR=jFŮ Y(f+yt35=횉RQ-%!x?{QjVP$$>fߎ5pH9gSI% %6 ZJNoZg.z;Ti_ד76I'fwu4猖$=BlJ9dTy|х oHJT<ɇ"$$ `Ac}X^pp(x_4#XF>XO#""wƒZe(QDX?J>_knli߾ 1H s8B001^Fq\fgX?Z_8ΐkU)Ζ)0S{dGJW)T¯qH,#%@#`$vHGr T8q P&G2YLMJGc[SNJ^N!u2%ޤi{AQi=;H&IP=dWհ2=jj|ݕ9a| Y KˆJ{1mƜk oـ-.(ދm wbst=v_ ?H,iXwBfA c:>DyȸH8 \.d*ůZJ + V!%P2Ro  Ҷ ,FL9"`KA?/v;uS^Fܜ޿zs-#DGc|=1Rۏ8f]!{حr>`ޛ#;d97u1Yݦt۱Eo zt=i6K_(qdx&;bm3El2f86lq}v;L:/ovE>HRo*תl]&YHٛ>)wx@6e~+ sڹۑ6"F둓q8ySd${İ2#@ %Mu5NL|) Bx d$mF~62!i*ijt6+ ɓqɒRL̝ `Ւ2kAOڗbZH m;z ;.AGN*=iqXmTF@(i1OwJV,Svk[#52dߍCuK%LR!Xي'Pn[CMxijn%sT*0EhF&@Z5xgI@*6yR*NX)Sb:J$djtbߕ.E>15ts^=;B ]L=lk&^`o~qt bY<{ qCJl(&2?~L4nX϶yq&+BBV"7l ?"2ٺlDجEGhJ5;gb_H*Lǝb;!v܂c*-7 9|G'afNOώ|Zo)m~(ۣPm釔? ~ p䍶–n [[M 3 >8-Pbv@w$nf,Sk&$S % ;ذaA?! 7/[7[t% 10}nS`Fc19`;NFY~|f 3 !RNQwPYQpڷz!ai&L^%616 q:s,xv575%chPz<<[W /(1ۨC7Y? ApWIi~4cf?/1 + yy²(}g<;v`ܹ\NNndn^/[DH˶Фr,~ #Ϧtsuq9ﵗGLm۰y|zBt&4xzx8@qUlBq!0g@2[/W2cگI40@iRck]3G*{&GU^< DqQXA tH-F&I$Hfvh0 % `dx0 м cÓS,(=J'S 4JbJ@!f2IJiWa_QPRUIq[LGnQ6i^3MuRlK1^)_dc6$j>sv+IÝRNrN'u<7 H2o8aJ NnƶewD_ d(gVD]RM"H2%k<`L'-ل`~P?A#z,A'Wߛ=ab/ 5c0Ja>HK4 !ooBry"96 .6شv/ee,ϋ83 Ꮆ8<A5!|  ee#T$Ȱ=;alNh'~b>pƲΘ8ZpxW-`ȈA>Jԏmٳذ [Vc${r b 1f"74÷ÆCiQf-a zH]ɫงbSt>,O%s}b#ؑ+]^i|ö ,ܢ*6+ $Q{TƊiDUy嗈Zx<{`4"OߍTG)W` (&? 'MHFnGb0M`HA< ӓ+ %#3rz$ wDW ekeOprڭ $M&)S"@Ss"q&؟7"2 PRiҶT98(W'L S7h#C]L=<l':Uͫvbwi 9_)#6">8R}[ WcX?!6H XXxm،\eQU_?o*6򍢦5{o5Z\ {T 1qto"mu_َ|M ]DL4ԝFu[ݝ6HF EetN7]g9n%Ѭc\?e 9 Ik$-# I-IU&4s˥2pEDq[odV쑬d\M!-w.7Zb=Nk]m?̢ILZ?[쉈]}%Lil5]"dW5J8n-RV_ЎcƒHg(FIBmY$Lz[p^k2 %عy;iJ; J2?hgsbEސoPk|cÄ_6bOk/jL;‘ WN} )BSlx;IۉM8@XqwMGla〜%(7pB_?ѣx5i\&`ӳ:WEH;hT f&XFJ. ^l =na-8#,oC'>GE y7E$tfaƓDFS1:\Q)BvH:$$4/P$i;3̫VB.{s5)/U_x0!Qv9+~#+R QqH0kƍ{?x.ep,AkHΌ [65s<&}e[-UljR+mS1y$$ tHidiM[5i"SL`GQwƗ] Cnzq}8eհSMl*%HR'W2WPrVjLǨ01^%PJ_L`qh>qI{z3mkҢ[e3]SW" ۖ;cw`NVHŮC2eP|y+Ufx} o+T`lZ7D7ӛbSK(rOK":3]I nٔLzz;Q2"`f.jt (վ2n2u^<C֌hX"ڵqMύ5:9XǔZa".MIiy|vb1եEvѝa >Hy'g?qR{Sx3]\KN)61H&@HV(VRb QB 0NN <=b($&J I= LR@Ǡ*:Y H$$3&3K:vIJbEC@ZJB .黿po on%Ǿf+=灼5,ewH('1Sdb}ơQuFv_Rh]車tIe3bEFq9+0wRL?Үq.M*<U7D:,FJt aB>l!X9ݎxq 0YXfy~,W?9 6L1 ~6ЂP3Eqz ɦ"}Va}+|-^`rw7À5ѷxt;jjgi>֯30tWT@`t?5JMFoD%b{7Qgv,F1 l]ObxSK]q뭷^#TZks.dK`4qv1tSl4\HлﱝgH 0V#s^Q}zqgGI'j22郤N2˅Z>B*H[| aH6ZZj6;Ho1^cx0^9e8!vRpbƕ#%$&I6̠ZTI=nTә6SVE"YƧ|pOr$%@2H$=EK> A4MTזYykQTIG.) "RHXnsq@THO&~&?lTj$ Nn>X/Fآ*UϪ}Zah yu$0ތP%7K4-bc@ΫQ|̰*L@M\5Hq2a*U>HbH#QVH*W%Rd_3z2`pC&~L)u4+1g{Bp#h{~xnGQp$;ff\OM}~36כcHm 5b7́:؎)Fe!B̞j_K_}#8eZ;0 TYFa#Ѿ^ln9^>E$Sm0-6EbSXuV@,:z*m@ zpH:2Čz рQղ?f12v 9&͸"%*NfUBpC9]~yOBA~ڟĄogǽ$ wқ}OE[4"+foE6{#֯Gd 3G9UySk4\%!\b@R!dH 5O5/۰;(o$&-1v- P_5zdP|ZUgVQͧIf>P܆އfw`D0zGOtZ$Q ǹx?:B]z` 2ԸBff"sTM[ % hyx"= GŊ H)6<-';owNNNEbuad32Ng&30^aћ11 YW3d9& 'N%$ԖRFS K@DVH2z#u{`nNoe* CI J 4K&HRm$ITzm+Dn*WU*LR$6}?")(Q($W.`d{) W] 9B< })r}":`wB+=p+# %"1-EQ1`$@$|!T(uPEm9׾7tBKq0hymg#$vi@Ϝl?p/ 1qma n8xtހP80 I7^jADMgjjߢך}{Vm )#$ޯ`>zoB27o¹1ױj%(jruv"XRKFZg1<@iȠ~ț %˼sB* xE0~-lFu)|H]1xv>D51_x99/^w{$3ܕF~]vU/y^:||;;&y}$O_̩Xj?f`3l^cѣF_Z ,_ l ÝȈf+b7u/2Z3>`te`Mv#ɢ[(!eM"ĮɖY̋|T>4X[u4A<(} &KcKyK0f<z! zs^bo4۪n\m䑤 :6UUZHr/rDV9l+Mh"_+K}HcjtAiz$XbBB""{C2M&j<iDMssE=2mNL{dFu:>FIu ԯMԥosDR"%` Ҽ&ڡt6X?DFiB?rwQkқLL}g⇣k Yt޳IF{#Stm L@_sK/5I{FSf^yk)7AQuTZѵCku^*4󌸣ڽ-j= b-lv9?kLE/{-qWp LaVpKGhoL=a~-md)^y4L܁xf3S5nkI (G{ۃ ;cus%3Ӄ.6?w^m3wޞ1_IM\轞L^{-gj.B(S0jeaD2/U{QatNT@#0xzsv0i I/vC-A b?R+v#%55? h((Lȯ8f=ؤ14TIc)V)V5Z,R%_tH=,$VdeR8ugqŊ*2nfQhx$I!X U+ImJR7{c[K"ɯIrUH2 MH1k-  #@tc$]cb7p, DZ-2l?)69c*k^$:6 qk0X,RR IgR"%TdEыy ~7# w2r|b;DǺwh me͕c34ܸ3׼gt:ǖh; Sö }٣OFC+ݿUnݪ ⃍cH%_rr!@2y"[)ML^#iCqۮ8vwFL?<76~toB+ W%64c:혳sYyi3 a&洀oVcydN#5 (?\ پ['wUG. T5Oar>ve7ksX6e &7"{,!C>{/o~{zj<_2)f2I:JE $/){$kt#(E݄7JrwᡯZܮ.K(۸9|w=Oú:o Py T|iIOԝƮ2lƊx6?ĩ5D+4ݴms}6\q/ɔ[ lUI%n#F~h PgC<s^C_|Mʠ3Ӂ}mc :mO*?al`k~VMA~xЅ4V`H;QҺ|4إT|ئo:VQץZWTBo[7d@U ,P7oJ/}뒁p*k@0EvkTjEr͇QP 뎷[O;]0̔Jņ .Coe7ƺb-"կl][+|=<#cH=ҨjBW; lMBj*;֌JjϪ̏YL?˰R7u#(M@ՃSӓ(& e?2Qd%Ȩǽšdn Cϣ^}`8:kw?KƫFC0ӯ|m_}Ux[fW~q'j}܋6ǗU1)S^&. 7>ɻ⦮ӂP۟7FJ=Ȇζ E(Qk[:.3ŶH WCǏts{&rk S}'+w{3!=etH3z+dF+?$[hj6Y$"ŃiQ_65D@mJ 7ARRlJ['ܢͷ>7]"3I[x+̝8%-r?ZT~\lNo t=ˑD>JhjplJ%ͬ'-`ϦLjjD-/\ Bzꔹ|SRrJp.0 ]qwE\(YLG]poa-J)&p4!R1 >2ꆪ9rYYmy_xZ|.o|}:͹.= Շ;BA(=AcmÇ>8g[G} blJ n陖,Y AjjjѼVry-ھ^_mo_SZ2ky<_{s).6^lӧOmc9czsRoHnlLYFJ%Lg4]l1)K4|JKU]_JUmo $@;<"s!yb~8佑F c6Hu kN[pu 2-I t9M#]ij..5VcT$)v2f^M2:cF xM`&n4҉!6ēAakV=Bz!Sno2К ZKzmٜIxwDDD<f F#^j4c* s|'Vy+ּF+aFPR@!\yz 纸r|M| `|wa2JYw>4R*} Bm(=]›mcވsxE*bfEeWAk,ѕ j*xviGd^~,(~&_wKY KV^W~ } 1M VUBÞJ~"*P0z٢tq/ZV|Y-6-Z[į6DA)WD8uJY U56{OyS1}:c1@<61Gi4옌SxݿLAQkz.G ?NP S~s mmԚoLT+Ewc{⺍*N8=+ogx@ϝsQ-0i/^#MdC6(q0q5sP˃x?l)vEVܟ' [:FR8~qWxg:Tqp2fC/4zFP]W# 8Ŷ)(Ҥ_tVG1̿-YΛ?5X ̗|$2WȘ_nۈ_*63vprFgK- "6Mr>+MU$0teRbPƱj tA 6wa6g$ sCG,o/TQ U`pQs*}mi~IFTj7/*7ZYTg/:M#/ϦJb,Sl)Q;jUXl%.Y ]%{4,Myb@(FV**iVu5G'B!’l< sP7 7c6m<:'Pnn9GvP{d?p7z=ڙullG0"TᖔSy Z2@)J}`KCoBABQB`r%zobH)]CDE2Mr!dTȉW.l@#U?n_5-cJBH&t!Њ7[ީěvi$rd M͏Qg\{KL,oᡮ/QlE3Er?$K`M$NjVL=S=N6 Yd*데qD%x;O>\{5^kzƴ>,*7ngТR |x3L>Usdh$I=Lt/|I&og*{d|C&!^5xHj[ت> HbZft OYrKjH85pjݰYzdd$%[4sAHf ٹ]d~'q!MPAD(OᶱnsQ~F *ʓUTLk]MY kxC^g_H "+taw7Xf`IR`¢73lRI\<&P#+=嶯f'|ߺXO{' )7RW# ϯ.$Wnd7k}yLts/>ח|[.V稤Pj<H`x@B*5 %uB I̔_ӅVX\.@rF0RMLJӈ2G,RF8m z"~lQl];Mw5)Hv)F__:kT\}|#u7e(kw5>!BI%5 ፆOVf*r_gS ? l>Pg5SycVn C3(8Oy3h]6H ȿhEaIx)0eO(U-hV UHtXRqyC:M Rt!tMl{گ<Ehn=njHX.aU KF-a2ƛs5LQ[,[% 2u>ϣADD3\>6~͚9 `)Lhhhzs*d_cx{LSFv[mOo^BǛQ/Uoy ~iZmJ@W/2ponۺtDl@kSݏ7?>7FvtfC[D(`%[^5QeݎZ/u8 '|Sm݃TM X5'P˅6xAY%z.i.虁F5!L?b^M8}+CH9]Q# FV'>28}ke$E|J#hM[ox/1j q-aMpѓ"tX ܵO`DxrF-[H4U>ƽ{i3~HOV>/֌V-~N^^^HBmCxjnkڄe&z!hF ?C@UW/廝B/FzBwИAt٥/M>iJm4{p)ؘhlGn/ZA25Hc:Qtɸ\X1dz&@֝Fz))evj;8s 64kFJfBOJ J?%A]? 7G1(?4GMCQ+3rUFtɟџ v>!s%`;מN&2TŦ6]K.©\L3 P+"66i@FOjQ=;2>QַJtC7 <&"r4ܵ?&א*|j]c < mx)$ؽ b{ouKt(u/D^=^VnYFabR~_3h^lHs†u0wH1{M<S.)6H,kKuh$$[,)nl;S̹+U|l"sh&}fűuݑ^J{޲MT[a1CHMe3ڱ{m)1wRuMAZM' áH zl%0UI)8%($)ӼqY< +G{V %^!1`71,D|mbm7 ^o$8ƍqY IRdwGLl~ML嗆u~IpizV Ve4uv1ӳp\;,h }Ɠ k1 EI족G*;Cl]Fb:ۘ52 0zÎElSBa0N˿Sg~փ^YQԆĤmI =}o.qoGExr"5o㏢sfsMePb LxrOԫgn7v'/1b{)=aSw:iLʎ9ĶL@iM _Ti/'O7TJ)b i [?s8K$sW2<7wƍY4Eg9Ǖc!0Y2Qx31/~)hϙ/%B("KߎbIߍ9GLWBr|.:; cT!؏yn λ a窺I7i w%} I:)&i-o?IT/ SH$,܇9㍚@1ך:p7QܢFV7tT?şiȶ 1L5$7EILUȻ[c\LOY*#pȒhiTĐJ3&TS2włKݶK+gVBE@` &&-%8bL@.NXV)(~7wS{2u'M<x0dϛ~|֑SryQ:9\5sZp,Ea`R :GAz.O9.c~m0|3Md,5;$=y >MῦP|츖o1A U< 8G/K~Rr{JmsxZto`256g#]'*yu/vtr|? 't.%(l RҨm[2ُ* A76Eld?] }P$r&yxn|BXi RGKdlk}5ﮨJ'dCU\M};޳p,+|V! L=>y=QY>,QpTۣaǛl۷\d^} t,/dRw<>ƇIl{lZw~4ֿg-bC@bK%&mC@2`^RnAqYoJg$Ƶi((AsJS"IsBp*K#|^G~dI _NuۘQlio@١>n c*NrPu" 5DB 6\&{5Λ"Išpe[ aNxᗸ;*_βQ3x &Š~&w`Y?Gy dݽnCH|.oF^p)^Bits݁ *Ce<:@B_j ;i7ߛɫ=VS>m$)%L_O EqYP >h6PȢ}X uP0oyyS3USjF9AKdºhiLh&4QV(v erV ? eYT Wԝ &| ::"3^T Kzj=%Qz/谲.K= Tة3a5W~HR~qn7a݈Mׇ'U {^fX΂jN` r؁LY /n#JLXUx;Q<62#ʓlr3.F` zI~,#oJBd|^֜Jj`.7rd|Sy]"򺉨ʎ(AƄ>v 3 6U@_j\pcF1v1dnN~ra-q,ɱ8DCsH>* [3; b>4yXI;1;~e/ZVO.^Հ%k{+'~;X]N*Uv繑ueW p5߲!}G2?;&^aDw~Vr+O3ouwNj{<{`ջb% HGZ|LF)GP|6NvrNU3ĶRlwV%Gf٪,7fU¥Qo,/TҾut=FAv*ϛA:w7V^l 0f1-O#jR$TXaONyCGYNx88gZ-Te[le #Cu:Y>#pn3RK7$$lY9x+͛i o8è"y&XLy5P*K0 z!4#U ӟBN Asmy|USZz_T>sMc,D@b6mB# )á*>yZofvB(w}٭WMܟ5}u`0̩0&^T\sZ tpqah'wDit&4 rM͚7901q ٷFa̶:އ¸U%S?s "3Çʱk}b9 4ٞb"wY3fD3 mu1َ2i_*=yH{L|_+#?%z;'#*HٜyM^+ԺpYSס!?_ +!oǨ,Q\UWi5*_2?Iu6ma>!'^`!tXa'O>cH}aF۩STh0[ūز* >TJ]yy }XgF3PkM$;q ޥx5f1>;|o{?eݸ<֬ss}aEOcl|  I@ebzv7j{lTkS-lĵ IE1ѣ ,Co}w[- O3nsf+}-_jФ-Q+Q\%>p۶Z8s#E:'=iѢJx{fQxfl+s!Qh7 Ŧ 8 Zb{<!6G mZV"Rl7wmb8A4Ifo89p,?Dex s! (Š= 4k.%xH˛À6Ty,E"dzeOczQ,*~\xRS_CltѼH3CE[{Ryif[8Lh KC! OK@u)C>>ryB>gfm>tlvk읟P 3P]=,r!ȟ pޓ2RfBXa*#;^J> RULEȁp*Ӻ4d"Xyt|YWFqtK^7QHt똽ֽ W`72&`ķp&L@z?ץDʈKca^sf&lYݎM.["OŠ;d}31_gLpw>ֿ!HJ`_\nBPW -fzj&ҕRs2|) IL3#8j~zHV|#ðjHaL_K|ix6+)$i\ jݻ?txdHy X'Js=iRj[YM@o??Q(|?FK珏!s$`"E#%K}bn^~2);QЕңxyd6mQԇa5*N҄V:GRKJ׮MX^_ }APm4(Җ 42lrSƘ,>V!C0vsm9@p<,sckc2_S&% {6 ]@A͚?2#Cqaۯ*!YmɳdWZ6"$YzO !Mbp-Sr`!' VA@ 'Nf& GĿxT.-\*AJi,޳#<ٺdLIHi";JVQF*qCK)j` zK+AxuԾEE#LJ- ?ekïxuZorWi=d{‚Ϝ4ܿ4 " o5|~VOƥ^ɕI}Zl C9V$ 4F!EHT# )M!Ħ"}<XD b\'ʃ_u߼ \dF$Eb, |`X˄HIHϚ2f"*'L32?%4RGƒbK2׬r!I=J 2<N3%R`R J9"/ܲm~d[>KZR"R EV0lauD5=x7 nbʎjIڝiaB^7rAJN(;%D*RQaWzTSJ9u:2ЦɴTy&=F𽖈,}Ȳ0 .wPU Fxx!ۏT4@:9Q|٢|%9/0>?< vNŢjr|Gi'u.؄,ixC-ui lD`45s0VOշ8;G4 fH0hϵD'opvaϟMesl /.E!w;r3W&k]Zz-2ě>Ɇ`d-mLQ9a4 ,B>~$:mF'vGCvLhDSpj T,ì01}ȅiy/ ݪ3| +crhxm{:`*Pf W;k'% TH,s"I {\ T>l|Lz&8$t>4;3'ͬ m& #H9{$ ֚璐: {L@n" X(ʿc7X`aTzCtWJR?{NvʶBcTcS_.VZ33:Jߝ$U+H?W^B5aqNE`HC6=\3W[τKj|U5fa4Ԙ7ZAڵ} oߎSg/`ȑ*/RΜ94iҨ%s.0\_\-?&WGs}b֯omqeyuA) AOɓGϫm/|_拾Fڶ?iҤAL=9sf5fkyT˵e,;v$۩ϥkU-R$쵻3$!NT؎!j(W'YѢ*βrڶ1UjېڦV6TTc==G2E҄ oS">2_ bN挋"cG5=fS Fɳۇe257Z`I"}ɚ3Qx2 :Mo}":q_Ku.Пvn9iүS;wkErn5п\ek*j6qy.;wnG_nK,urȁVZAB8C }ʜ0kD:qi[*’!͈#y TńooB@#mˆU_ }] Q$)FX޹ILsbCl&<5DYP/`Nt yHJfDaf,V)@)HFY3bM'j&fJ5yry"*HRI@dFQ O4zK $+yrfT#`0lg~mv)\JLޠ3 `D5H a@/ f+BU0_E`JAѠ?v#Maȝуxܤb#L OcFH@aq,y`|ZG9d< ih[F1.)pB՜Y񹑄63V%*.$oc2lMiu|?nc9Wgxu Vn0 ܶ(A*:+e 8ExR*Q HXRϥrR^1s| Xeʑ1+qtoIʍs&`zB2KΘ9@+ S #ʗ! .}IRhEL;f"g tTףiӦV J1j۶(hBmFCIur }W @̗3~=$Tu(.$ ҅#aL,Wi>zjZ }ُI|Hʣ sc?x}z2e:)%{ChIGYlVO굑-o)>!Kδ|4Ui ݨѸ&3#YQMܛ465$gJ&閃7h$$gHN@9gUo69&5-jg<(;Է:+MDm?Ak]޼S_6pyFTh|٩$$"Z,~\l*;R]!Ij=M"R6}l1e4 `|?ڄ\ܥW{2!tYJj W2}zJ>@ń5Z^Y{ %`&niRUB<7/f55#'DzL׹R52;2)uA<*[:Si"ճi䶛Ǵ :*+ii$&3ҫ+Q2 4@+NQJ^I4J$%ܘDPY}=;"UQT]UlU=igG*Nf $DB\ŨEd wTT TURB@R]ffi碁iBy> iia=}MG${{{:lGeX ie\[VX1?HΝÃsMcGi{ǽ]Sq7>5Oֶ)5"oxKOb>ҥK8t;eW~{Y?{qX?,K6 ɤm/ץȂtѴKRH!Q{UdL KoVLw͢{>[SV.Dy",$a!" %Q(S; ἑK=/+L2ڌ/ [e _?v%$m:h8cH-x> TEhn}̩H*dqw$CUFVERU!,#1q~D)!7}W7qK!s 381_pR߆#VvY4iK[jV{<ӽ$4Ṹ9$ )վh֖97 )Gېq!zf:ӕ,qҜG=a~ ݃:4Q$s^ll1KkN) WR 3/A*-tI9\Orks&57Ħ':;2 Oia5M+Jzpyh"#TSN#b*(PY y0dvv `NI`PC УN?RsQ^%J5T^AWpZ م,-m?H@N _[@\Lϑޯ$ʙ޵PaM{nx-4@rttT[1a 6+H';<ŋc,ܶ_~ӹ믱.5k֟I/e~iW8q`&MR\[f|X\hĶ>e\ΆdQr}8d>qNV#ɳ?#*5ښ R8TLa3,z1C-k#9d ,`EE"u`Vri"$f pȗ:IF`*~,4=ycNz&^a=U =3T7cGh6YS6\WC`c>5HҘ+ чs$M~HSJ"EX&H>'32! ɰq$P&!5JR);7('KHʓF,\e6C"P`* |Y)J" "iFmMI\ ZN{44u|$A_9}O?OrKflc[b~?t99s[lySw?C ={V]D!^k [NQǶl}>^[nms7߅ pՇkI!iƌ56,4 ON+L Šlr5A-is@q*+}jx($>>/b$Y`[V eUB/,/[0XkTlD+&v [Á!!.1jaLE0xc^;2UktٷmS3!Cھ1I ml]4dQR&\xsFaڊR1\\@+'+ኙgF #JDXVۥaz*,k##dI"<}N+\*>Q)GܥHo'V03cH TߧLtLb.l{񆟚# 𑀓u$ KRLҍ*'9+ySRxL+?G˛!Xf&r,TUSb6'E?PnfcN\a:R 9nBG;f Yf m.K@(ӝ2)aAt.;Y`?T QRo$*K8̊dYB#.ՂaY@Lew> khr,73k;H@B@(H:>m '3M^JG|@+!Dul)$ 4I"%NtqWx6΍6h)Z4U0U+ai}Tu@PT*ThM+V^S%8Wp(Z@ EtTbV `[-ڋ:|0엖dVaOT)Ҥ6$VhOŹ-qi\޽;﷋Ǩ×5@ڶi6c.&ODvj́}1}D,ZV-Ʈ_.k}po9e"82 gkK`5ߏ<Sy?˾w5 ɛ;'b'x,Ykcq$Tc&,7læ6w  +W,cj5)z]OZWw)f[?X΀jܐvIS FIa[0\ꖀ JBdD[BɊmHKdcڢf|0`Em*E62$/dZĂ&E`D8ӱ[3{NH֌7vVN zk. i s:\;\$E3p 1{@?KB`a 6X%&|xsy IAB2dD (2OymGBnCsTgܹ/b[¢a"a P["H7.PlݯlY;?|2X *_Ә #cՈ;%̻Fo`0 ;"syLX 'QaRՖzY>$RM*6-Y nlCjH~LLڈ`>c5^4~e;Yˏ#.f̹Xh*WqMV> g]Ը8a8̄".jw!$7Ț]Ԍ2b֚~2 $b5[DEB',zR6@97J׎E1+|I*r⽺ j,Y  ! % -]QhjVHD `ȶ9ʖLo`gL4n/ U2T5IjL5(LRz=ЦH<mB=Ze7@փѺl? UI-,R J-kشReMXJ<}YGX&sU7H]ޤY *˵U.pinVT(FwIjUweaN|Wkg_УwOFn~ }1mo# H Gз0L:cƌƠгgl-k#~15 阎i.bL G"b -N|ϨڋmfLu`8.aBɑWE ,6lّ 9erV2',]a̾l޾HJ90eЈ10jE ~ rhԌ*\d1F,N;a9_InE.ng)y[Q#M|aYJ1 ʈ!IzPEaYɾ&b?v#|v,ہ lzn)ϩHjZ0*14p~Թ:L [Ta!4o=LD/kCILPJJcf]'QMbuy<$jkši/,{܇Ai=X|]yM:K^l76bH@:G@Z}(e.rV d FGa;Pd6b0'z>Rj`Q>-gq6M$sn[MBkѭSK!*l IIʋ|H\ H&n]Iʽׯ_\:upHڵkG-[ӃdF"nj)Mcv8_;h ٰHRKa)h!/a6iTؓ&dlx6%IBÌ&o +B=ȜYk:*HI2: & "qy0F 0\CO#{^ YS9!/Yq qG>ʻ`S;.yi61JJ&/K`3o#>7|cmhrs '_;Ylַ!q'Ld>!fs~x< ږ IqȬ xìCZ'2}7 Oaޚ=%sǐsza +; aWm(a2heWp\hJ0kQD%8cV| uӋpcZ/ 9WH,yήwa۟յƔg-65ƭ“jE!jp]Ǹ}xJW @b8V ݉ć:l] H6m}Y:V@7ms_1{quM9@NpiRw(O(N "IpI3"_`G|f]P?QԮ:G~Ȑ ZG6Uk4:*IZFFѩx:(Q0T 5juFӖ EH0X@xi$, NH[]MeHM +q%)"jzԷ, HcƌQ%Fx񢂰J[\o?q]M6h׮6N5ƚ5Z"mDDDQFJZn+W[ӃdCS3bEkO՜fHIDATDYaNCMp.J.ne ]RB$#{f6R枾ϝ64e$!<Q!eiNs7L I.{n8Z%3WF#MNi ļ#qH2YH BΆ*L¸"19ib9ml#bvQ&[Ci؟{aPsꨘZ9GRzs$|G2SnP CTWB|lk59u ߠ»vPtF%w.¢K? /g騄&pq#2P'"̰i*^!`ә} 5LsF#M?’>}ߑ*ۯ'U+fPQJBmN8NJ PJ~ ܂g =zW/tؼ%2yb´iXĆSF1?/ Q 4ߍh!'-)F`AfyQa<ٌʌJwITXT0GʔF*JUqs iJ$?bT3Ln'mZu 5o;ፘWtSRF}THNq*G)?[$R!0*ȝR4%Ik"jװФF5BA@' 8_ H]YJe%E'_P-۴Ejѡ]kt =GvmAQ1Z5C.=1G{4k{vE愭йK75 >VE*UTԐE(uI˕+M,/<*6ƊFĄ9a^0V|VDI&z\V>p\@wv83lXz(KXr%Ljkf͑z~,8gER֔1b+֝٤ap)HÚh\7s_ޘ-h$Mmِna w0FT&+zCv+O33)H̏"{:yFKBLzPrΤb9mk{̳[qĢj PKkner|΍=9l_U:}T~Z[`*_|HZ{}h+H,iERGZCph Cq8G@[?Z*V!7"*o;s)U&'Cj?J RRaB 7I+~[Y͋G~܁ûY+صkۚI܍7ww$k޽K$7 CxXy)͚P؍@~4l kWFDE#ѢnJ иvqC\uk@bh޲-J `Ɯ?߼RZdoپe˖%P:g˺`bOjYZ̩$*~$Tk毲Ҥa&{jӳM_f%,S5@kUϧg66@Yt tSZ}VS 20V#*}D+GZDHS6B]AvȈ7"C[ktRj y! ~Bi:Z@G4E^6FH=I|MjwS`TZQj+,U5kwV S;XvjH_52h%ն(IRÃJ,{Ck`hҖkc/gARqY=v~hʵ s?H즯ݻo߾x3*[>Go޼x'H燛7o~@Q+zk/_>,5gϮek˂XR.E.X{fUA e}`a(, 1LF45nfi#`JZ8 Y}x̆$E&N=kyfaƦVT%V.:;r0hI=`iVp=oO##pHYdʄ-@8Q*IR.b3_߳(zLؔvF(0a2u$GHВ )I; [ū%.~(7}$;Mj&In$\Oj\mVjW, oL*uh}R+>"D"ip,YN$LyI={?AXyH lk@E>IKFJ|O%$M&[xyl'Px͹]aZ̊Z1$X6! :q H)S7}$&ūRқRx:r>)# jTY) gT.QfԱEoYzj-}vi oMR*Ȯ6o<{}W^}ӧxw,y[Q|2L:X i;Ҵ8A!&>:t$m/!S*S84ee񄝮þmkkw#_Y7iq%"E+\9ل“".P5AXk. װye(c/ߎ>_`njVP|lڼ6CIZ#ASn%"g>S!Ȫ=lPQ W(.ټ`}*kX~;WKޭ%I60C?w7;m8΁7RQJO l_f,gxPQJF.3'ن wV)zGf瞇aJɤ*qvof+-%z#a,N"U!bGb^*3EoIwz Ս(t4TM b.ᱍDBdcs$?`#D% \GeG סTpvp^@ݥ&Ҍ1r xN5^0K||ޒNaJ^`4M_V(}}< AЈZ2X+ 87'z:է`3P`ܓj&4x}jUݛ~ײ ۋ%: ӗEctY E,>$5 ^Tț/ZBVer'gkb0CeIxLD tR{BKm1inB(=/Q3Im1ZWN)A6 4TV/IH QE}ŷԂԨEe IM3u @)hcVAWKqm %m,\VAH:ѭdi}׬>@{R1I -Z3$Ai/'7 ;{l 7PӘ/{L:s{ŊVA2(%\™zܛaJct~ 9P6+a M0M <`Tp(MN%lAVr~@S23rC{fSHʨ<~pֿR i)G~$)3.B]%ԇpNqO!L}@= `YZT+Qpx O!\. 'DS<|<< 75F",0X{]TRK"9_4|gX [4{fᏐ) { o˜KɌ@?M$9J'e{ͩ݃e0^(d&KAVPHIطg~--Yp^s(@:-X 5n!6:kMZ4+Kű6vLJ8J#_A*F$ &p"!5Q#kt5SQb梎#f/FQ%E H5B"C$!6yݝ6I Qv`M-ʔl'˥@+d۪!cpc; 2yA+vKYu*# Rb3iWP5k?0jժX{I݇m[;Z@UՍ'-l'&iQqfA[?}W$RC Q?Css/#. KqO~GePl1ԫ_l4kޑ9Y%/dl& ?fwLՊ }$U&f9¹}Ȕ/Z1Ԧz1SMg&TȣYa!lO)ynOdo c7LiO4 j=NsPQOhˊݻE(b<svŠMCPTu&!/-F^.v! "lCxb5ImdTYHbؖ*UnmJ!G`1Àό`csS3 \$"H*/>& 2,sp$I=%OΗTBz0|$cʄOEr!wցt:=qeք*•5x5ӥK]zh$ ߸T^1NϘ hС9o?2# 4| ڷǺիelڲ틆@V##;X97UTr(M.)3cMgV {%fM31( +7əl+13܎$Oǹ,o!ؒ$g!2ۆ^TK2)ȉs0'͂J9²+ou/!y/ "ex7!/a܍"`nbm#?zh e#XH: y]*$p`?R=qw#~[HT;p^pߒ(KTjCa }Ex$)1ĥs"HܧIBsBP#6*G:G/վUvdݤ_4u1j\C t°0| zS T9BD! 9yOdIdETjrT QzCyTZD)$9sjt@~J*\|gkɗ@%sfodgG6i@I%=GZ!?a'f]/?W~ÖOI={DnlVYr*)$CN쬅sG&ѐQAI6! 5Ġ- $bIӫ7Fu{>UC@5(+w,:/`7akQشc } )QNoXE/x-4cWocγo0JN_Prr3#̒eU$,S1={e1Ǐ^%6`2am:C"49Q%A,sTˬWh2z+\S3c+\;ŁǙQ<؋t1UuTv,wF,r("%`m- d!$Fېd Pt k¦Ts_1F΂#a8)#$"4d#PeN)@sXO#߫0^.#$9TldXFm7a3-糦$ǐr|Ow9JȏaD+ _gL =Al$[UMk0M^lR~%T,%`2z\U^KM@맣 &߫#Èu.PHl=* m}6Q Su&Obn ȴ06_4Hf+ѽ髌ӑ,(*xR=jЈձrZ]Eh-;R57JQGJaI LSmG:GjwG1qE9PgǠqG$ᶏ$ $#Q%IB7FDd $ktXV%*H0 TBz،$ʒ/@ I]"ò"?•j*TF:r2 ĚEse[WΝnR}tҳgqࠤl0ۆ >!, h 3*v\80 vE7D h*&C'3mKdv,Zv4FeK,ghKo5k> M"x23K ׭RϾqQ<&hSATFF4l$m*zBg `LS%=Ґ-I<F2"qՒb(4sg^ 'a=ߤm%*D:+W>&\T I7ő4L,%APsx$r F`LAB= QLD3kffaQ!TȡGn:ಁͰnHU(A'K#PB8 "!dZ$qHe1.KDʙ̱wނP%Yb ]< qO9=$<9 sDH#~—W!:)HN }e5`%271q=RS"qHԂr r"ԝ(,:C{vPyQhLXQ=J$!5\@𚥪ΔD򬍔,*y 6ڃP@yL%΀$׮]ŹsѪ /JbKGM .^y}C,HZԬMP(7QvQժ0_ vWeMZ{ HhL$%Q$_XICc $_Gy5EkNУv̅m1}~;<l3̦&(H VўcT9'9-^Z%>1)Zƶ UV$G[L@c~/I, ʢ^\Ƥta{ ϙEp%|Ii <]&YRˆքHZL$U瑊W1߆B-_Ҥ1ĶHL@U=%?c$}%m$KK[Vʖ+7S{{_Ų5#Yv$L֠ioCۢ(5jOeIl1e0WEz#5Dj|KR@p[ ă$Иj9BR1jJ?L3ńY={XH$MM+ ֠+\Dj#IyكQQOkJդ 7L!Y(%IBI@=<ق$ g:b1m׬Bʛz@,h\}Ϊ=DCaۛyQH&Ը2כF֜5~R,>&!eǣ:,K]@n{ ֮&̹@ :\BUgQl Gky,3}@g`RW6`dmQ%c7‰.}Z|In;ț(}Ky 'Qҕ B 8i<p8:\,bH/E]m2["/vt3p"+vKLIR 2|K@8;G@ZlF.lgҞѽW_fޘ?T> i&m*f%d-lU;P lQ4oA҈V+hh7DG' >C\'^! GI ג֯@J`%Ra[eZTז1hhJ,#-&hl%=D.MoID@[BlTʿ@R)քj3XXXi322QlZ  hώ'>MǤD$K I +cj&T\ ];GjU]-6ͯ{6C}ѳs[4n]:Kn٣4n횠׭Wuk.hҴ9mVP|lv9[{ŊL4l/]4xDV\9KRx4k$/]) >n!t9L=flnH9 =Ff)`0 ?T$ax̚4aV>$cGܩB1Df9MRHLU(jVk&THd Sc49`Z.`ZI-+Bh1܁qљ&t{`[2/ <^Iȵw6nPutM?(}g(1leM ӝ6x5yhe( mZ.*? 7H T_~]߇YK܁ɼTvCd"P$%wnL\ Yp^KTl03%ܴPC`9 hfvXV"Yfְ%iHAREPq&,yR,<ϥL2w)oѐ2]G(+}kH:.pN()ڃd D7Gg 9g^NA@ . +g/_NG^`u ll}e쌚cWԦGGF`IYFHF/﨏i|-#)z >T(}}NGL/4v$Mc/`$l_G^Km wd V-P̢4Uf'Q3÷B1xUCUlv؈ mK+Xԛ&>?& M8xgGV#޽{5&tjCjp <{OzɄ~vά* >{g_&MRm6zQ\]l6J1y(DTDn1e۵CC0r@އ > VgL+MΘ8a"A=:7:;￞]w_dCH"Gi=OUf3^r A8bL&t9q8gaFmMPIA -C}>*;'xsRϫf:c"(&׉Ǔ"44<әQP6&LzX'yuuh;_єw;Synn$>rY_Ӑ=V["X҉?5 b+*CgA7j1h `}{m.a"Obd7ş$)xܥa >\ö&yA 6 xY` ' jA)M)?=(2횠J}tF,Xqomؓ=$J*IEI~p˴  HGF*u )@Z E il'%Ф]ؒ,7UV@Yo0FcrÛBhlWJb =0@U0SHߓMBm1G֘0uÆ`1|4n=z F v-0||؏̱Ce4L1l2x(6n߫;v _:˜{ n鯖?{t wĤ1#ʘZ]fo/U Y0u\0!DaT/O(R$/fߔ-z]u+I5h@-kGh`@SM5$HC.C~ uw{>unm#q}D6gQ̺P>H+Äis[fLS70NGKK^$pLI22tf,T&AHEDԉrۤj45XI;9QA@$3rw ReCvȮFy`.>ɿt x ] `svGx1-cZ0Zl!6}5^V/|  2DT&2ٯz; bP-z6H0o:jї6M"`j̾^w0H: K7c=L.RYێ%f~ ez93MGǤE}3qV:o!>H±1ϓǯF"s(o JWW3՚ړ2wcY{XKu!RD f$O5PpB[~mԦCF]VBhq~.m!tcv\ ̘s돔}jClAGtmCT-{t|,[GbؕAБ${T S/ !j}1־C`D0Z2VT#QM)!D6&q>JY 6DӮTnФyj$_!d> glj?J_RSɹ[5 X]pSܕr,BB!|KHiYLij%}bgy6. =|޼Uߤ ] WN۷q!]_a:ׯg_CGORNXkgo^Ú5k0H)?:s񢛡Wd[,6 _Hfd… ɗۣGݻO::lÇO}xGc|c׎ ܺuKe'- 7; ]#~8'k\wX<6LnYop;Y@ĺFjsȣc.B9lw`[Pʮ?FȢ+&4Y9*.;l"WQHB>eE3**(9R0 ӟTD҅0n#CUN,k?oGs`Γpo"ElkJW;7x؊IH"{ х[pueφ_`zDܜNZ סU?lNU: /`vٚo ^O =+ۗ!_UPsdk˰TLΣnݺlZoϡ|7]Ed|<$*>}U9n> 2g)x.}u!d(H-#zϑ@(KbV6HڇT M1i& MU+G̭}"Uw21l[Y1$MTJPIjGHcPaJ\7Vneh.ti"=D=W4᭘a5cQ`'C_gy[?H-RիxE|5bK*a=$)^zz/\,_$1.b֔X!#f-20܍L HÞ(ˣ `񞌺.%s3J@'7]]LiuUɹ3KjK3G*HEHɶ]t& <˯)D5.5P)]NO狼-8 bs`1JwRQ :GeC-0`zb!dz=DNhBw.TpKy†a:ӂwg&,Y~WaVs{/I8ˈy^Yr,t-Mҙi7aW*2eCȑ@IJu'<]ծ/#\TY7m pd?ss7@%4R46*75.D]\ 7bcܶ d4, PZ.fKd^P$I0h 6×ﮓ?|{c ]8{J\8=ѭB7 QkEbwx:ZAb(ֵi>i+JqoH2;v0)^zԵ PA$ PVTdiʒ _]a>J2tAj[)CHme;QC/XO.tY #| K͔J٬M6&?. 0s9_3l݄$šaEPAp ƑTh|nrTL'@^܏a\.ÿ-^ $Z7OE /r$l* J#p"a-T=C$$^"1M 5nPI (~h>?ڌ}Ufnnã4W#܀DRb@SDeSGbEJ@K$V}},YލHr֓PEYћ,UF%H)l=,X}޻w12ɏ CI<],*.JDLϨ"]i#=s .jCnXXk˥ӷue<븜m>>K+"MsDR{4fvGa@+ W$vF?OUa4߁Vd[C ޽z_Cjg(OJ6vN?¸)Odٙ˱b)X}? H1ClTj$Jg⪨ 4%A'PКf!jl Q0&_I^zTSMuIԾ$J$REղJ)* w]ETեU`Qgb6(>h \ȳo;f=-rwa513a0՚T3C0”O0d}.)Hכ 6%@5'KD鏖PH fX,!,ɍOzR\ %1?Y8s K%:6^%y[ Pb&6{a+REYOoEClmBXmz[tk|s&mI/\BCh&(W5r*I[`H05tV*Un*ԍF2RQQZ ,vЏQY'4n[uz- zSfOC\A(]6j7QQmӵ1wmѨmn.*RVn\KPX<^Df< @?U8ʔ*ZscTז=ZQ˾*V~OfR2aLoniҪbbNU-@9*lev T,Tʿcfe `Ҵ3k&; )c-7g}ӣBla6|)h$7=-I&dcغA'0{n'TZgv^8=.? h9P/Xp @OMZ]8w9v,.};o`ҩU3kZgUk &. ҁk^ё`Zxl/m[x_djϩSp[ڵU "uQӦ1_qnY6իo4ܱ-ۧ+uK_0 $iSHt?+ixDDO!hFjzd USUgBg)Mp?Qdnf:' :j7U!90u ԉ &ʕ$& ֞H)۝N͸}$} Gdǔԯ`\o/zèU͆>E;aޯF嫦 IJ_ Ç's􄩄Wa:lĒ幮&{JK-$qxZܑkQST^s2.pocMmGq}$I*Ӫ4@$+j 9;F@p@RQH*P(v]JȨנw=V6.\@=  3faS31r]QV U.iЦz hiή;7* v&PQ;T*AҵOCpjF Բ굤).2+S)'v%X_3)W.f'l@hl_*%lHkҕK8qΜ8 Eٵc .~߸Nҗ NA:}<8 IMP 5guVlش;NtN6;#TiҊØ f,y|[Vx/3l# ? Q6Z#R;0k,lؼ=?^S1&LGw~f^)UGA"|C ,S^AVr|'%Qp)N7~_3MRc ?q{w #$ȑC8v2ɍE9! 4e+X h#$ࢩM*ZLkmS!(2L#CFDhWjDELPs)'ZȄ<%wcT57)}V6LЛ7E0 y2~*Q)b{=4kg  ^ $Q%|Ƈ<^2^>r/gx̛k%T݁0F,.+=uxKQA*+DUz> m&?> I}]" eBd[a+Z$w.:Ʊ]s%)٦HծIӰ;* cҍؼ._*O+ ,C8kx{QÃʣZ jȶMQ[mAp2l W~ s_=$U4U!2Uق %Ckqy*IBmNnp-fQTUҮ\+@8leU{vf̙H5!6!)߁߳%>b*|HOt۶m5}Q>BCϡu VF:픾2_ &s.uC AH{ ?77c{M7??^#3a/'a0}GchkT$G:&@EeС_£?gi$$ĹHo#va#2qGbŊ gIQI[eu^ʤ-031O4 /l9s 2; y='GtwW=χ=8,Ym+Cguϋ\<\=_'@Z iΗ/BYE+"g[<{R(Q> wpsyd&woK13[ 9<; c \#!kpid. ߊE~rۢp2S<'[qA\Zd_o/f!yx{̙1cFycPN_z.MG<;|؄X|Q~΃8+C=j0SsT Ay APidU4ՔZ J֊F:mah Vm ;M[0}JZLd x )3'ۘaCs ZvAmѽuJA*WIBJ*P LVA%h50F 0*5+` K`:hV_R"I8QI-'m52krH; =y$csYvLom ?_\oHaz"ۼj1IK!aĈwTq^D^4xc>5i==Ħ͹glIط74]oެ~{ CȪU#daFTA1}p]:g CY1`L ]ɆgbinFAj,f&Y+-E Q+[8s0f Z:VNCITSΈNh1y ZO6cYr4߰swDVpۻwԪ۵~uA볇UȈϮ?ZWZ 9+]wRwGvqqL]Q~5]g35 ~oҪe qRl߄N]~UMB_ZF̃/Viz/&X3m Clp(HROIݲ)ɦ[F[,IKFC)HGZۏbYMRzPL""g7nBDU 2}pդWI6lnUqcZ<ݤ>aG "i(_[Wa2!7VW:uBʕH>一:V|I"_ )QjWU ʐl1v:*naPUP#˜eG^5Q]eFCqQm`S4A٪?#"K 4; aS }Obm% -;f1B%1LoYY}5׆(IJ7ĸIS qі*R^Cы~Ge=l"6j-(ГHH$GQMdDV%V}n 4jC&0m CL~0s 1__ <7BVMyIjFp5ٌՋbX5޿qЇ WI~22]dKyOJ}Ko$Yl1Ç%>.ڑ~ eIxP_}O< ]v/8s0%KԂdGD5|7B/"ZcG =\&p,Xb=GM;vv@ѡ`4 ak)vmn#1֗T~{2YXUΝ4eɚvRWO_Z@yHfK?5uՕӘ.Ju)M)~ ;eG$@Xq *~Gb,~T 8$+?jԨ˫ ãpeY< CJ3+t=5u*m* 1]nmL5?^޸^~[7oљ\5xkW/&Oftqf͍5Kᬘo+yw|[^l[%Ks!6i(*RhV2r_Ԗ"dfjE4U-h~`Ȑ!*`)b(>m6? IʺG>}VfXbVH!R"M+TiN51fK+C45Y#Ѷ(VGb؈i)}5ڢ}CgB(iACF Ǣ{Ql1 L@Vm( MG 1!YKPn fu 2ZDS`N'qTMc$T@:FCuEc@TVljW\ i?;4GJC~(L(8M6W|u>|[w~WwRjh">ׇL?Lʂ3gbĀq 8= ݿ c)MHoU_(2.e Rq^a 5,3מ?@ ( bAV#F=B<.96a=Ο{Bŧ·Raz*#ǖ_A5s6Ve+}מ< Y#YtjBJm/^U*-Cl}G 7IYPm@lhuFOgaԘ)0uouDPHiUZC'bi9_P}u;%#NCf}I\wp æXIgtİY.m FecZf%G5PsɈkՅq(ؓTp^"*5KO*N?>gׯ_ z>^?o#_HWY#WmQ~c!23Nԉ#a.ڗY#X XUdc.?&^uج5BRJk5k! P(!d;`[RHB\~TTQCi̮EQSuuŪMK@@PTϞkvfIM#WBw-O .R+Rd@5QM*xz$&udQ$x&R(T HFDD}|5>|kYˎ;Ƣ+USwܹS}/>bou̻w|%e]IT2džԳ3<*6+! P4$mH ,M҄DƵIRMaORTI'0ZB^cht`/5:C\2ZЫԠ,ݫ@a:՛0S ѻj$yNOXmI/δ}w$UmHU}!NnLHjƲY a:kEeyU> I61` $/IwYm]U[ZhH*SDlQi"i&me',u7}GRWSTMH./JAEðz7.ǣg/cm6 v=6Bc2.o' ?9ϘLn=Xlk*b-XZ@ Tzb;#13TX9 zW7Wڿ#wWm gAy\ X)JO$6$IEWyݢ2ϟq%߹9>}ُӗc?VlǏiMs@1NhI=[a}lsؖq=ϿNX|0WMM?fIcYi8[ Ri;X$XUI}Y}]LYݎ>E!sD xjUt,u~IKd?mtcH]寞icO&җѭsJA:B@I@f e@kYѠ;KTB4a)LG*j7hG.M%M@c1h܎8:`_S[w釚T~4F;jwshlD!ʛ7Xg("JE&bHQ*Y-$C>RpG`] U$*,GhI72yl˴%fu]ֶt恶LnRmgx='c|hR+4H]&b+ 8x6n Ae)gBVڄq埚vhZȃ 8wmoG;MA:2Y&]˸Q@9c&6% lry@80>_m4*H&^˙j9RE`d`ceW%UQ[BjZ?|dc @H$$ 2V`Y>gZ d> Q^~QTSKEXzj5z)0톨v# a[Ȅd7 w )HGW?bv=ǿyaÛHBn_{W_ŕ~nmwm.-wwwwwwww'H$@ A<8ݒ|s2o2/e̛#9|;&\-+/+K`Yp XՠIbȄ/Ȥ-:T1 ܧcr}~n݈Bo?ۇ>ŌIW!A72RcwdP ɩ W$`)j.=k$1*Crfyʏr<׀ȺcHR k<}>|6d~N\>5mcI5M$(|\n[t%Բ;༩5@IGύ`%,l[k8s;r`h"0HǶe.ԙ;s618ByM\iH[V xDVּ٘phZG9^%ԨIͰڪh-ffj?^D+2İ琩 TQԼiuXNVU,`)@5jAcTQSOX] ZDS8캞C)F u0IJ(^}X@-5Hvn(BEpb3R-1?!$Ev ?YLAb(/`+? w\em"}קFȼzwmC0k3!=vuyL` JyuXƥK•z= %fo& rdM}^GNPlj  p> 8Ee:@ں9XVzj,Qm}wMd drz"=bL Yd(hA2q;A0X :#\5}AH<sS?E6ɛ%. GY20=i{uCR|ib(CUi~(Dԃ 4Go<_GYz͎*}1 lilQ~O&` @D7iԤڞ@ N0-lT[U@KjXZia^RlhذI_QGȨ80n*LYV7jyi ̵FpϮQ۹Q` ROzf+#BlkғUCа!Ç;Q + _s.8Xijt_Eurb -xa  E-ʉ}UԢ^&zd7Bk;ePXLHvnzݑ*̲u{F${WFYl2n˂^8/K}DHb+ׁrZY`A oA@vZ_|bR 9";0SŎq^/3@*Hm`Is9COB2/IiJ@B!ʓ yu~+ ~OB}V@\)C `&#CqSl&uIdiZ=|, g) uLdp:5jQ=U; *;zx]b*CT]nw>-zQ"X#sEPF""h3T%I>ӧ ŋY0Mކܭ Zd0Ah4xJ>u|.l[?ۭm͊<9RB$<·6 .uNR6C/Hnߌy:WLqǏ(tlEI;W $2 y25 7&5*ؼf i).KY;na=!=;euZ zx2L %Esg}țd)tH];أNś 2!7͹,CƇۺܺ BHÔS?r~8^ڗ{ic^`~SެY34i\HPlIyVU;i?JA lO3Y #D C07z& 1̥A0$ T^ʔi _mߠQYqtsFcafijشR 2Gl,j;C=A62W=bh km4 %0h Qm3Ee,{hf*6d9j[Kt;xW1)-o ?ܵO|2HP\C(ݑrEټ~5!74Xv w? 6 $ng7Φӡć; t^|QN >r`;+S2  Ųd)+qzf 8DY-K0vdc73HeiZ)6$$ݵ]oܦ(QPhx,KX۝HJ#fx%IpSH$4/GqDѩ?E##3H} U"z21\60Y#,#NG拠aBg9sy& DtB̙'+ʲs. ]8s>iԛܵ'Z=m8M- +ћ  yzi hnӪA1Pt@g {zhPuTf>5ÒHQ{:w; 7%,,W0o;M6 e9u`2D[ 2mhtLم 0c];  */)+b;>$dW}qFm~&4Z8C$i0H ۷pHfUm 1ͿQ%GR?-I^-5>Pu-X@+f yH݈e9BzxO$@m;A-¹QR@CÈ#u0QJ6p01􇈡Cr8v4҆1q wˑv|Ml!  #W|H2A2(6uGam6ߑ\?HG5xԮz*%~g98 aCv\h?^M;tM`mN4u&$]c,-e*RWʕ[8vT~@̖zgX+- D[jׅQYI9S[J@ 3Ή|m&ldD. ndɅm21H.LJNT˱9:HΑ mӵrw=lW]Zo|ZSqSdѬ2eZߪL4 R 7Ut_C jRr{)VA6yo*ox>E_-`ԁXLHFd ,Y Ӆv!"CPD\zݕ&ab!DFڤ;`~k{cEIy4Q ^Awy԰)JTMKrM(X:bjKz ;HV `v{,6Ʀ)-` `%;7H)} Oξ)x{v:0f;v @FO)]q"8JHHnʝ]@-Su m][fJ~΂}ҁ2nTٰvFmS2ٱ+ZB%LپT 3 0 vإ݈D/qZn(o=bwṚ}s;mklֺn`EMNZ0!`u԰Iѻ!2834FڪUxLB*dn @Zl 1,/Dhʔ$vP f]j[P A%`RDly͌;IX( K`m^Hpo p^E$M2y #wbAcxz_%fiRm EukZh%$4e_߆ŧIj @ t^6kI 쵆)"a?e[ Q% %&菴aJK@bJh3Gvi"}Q{DƩE;۠*2 ByDfN/ޖ>,@87'|~=0S󆛀y^Tr0;'Ors j1Ok|v|[s۽f3f}$?},0FwRo॑^d H Y5H]^H,5Zlko*VU =.k|l6=tHMll^ǣڷdhjGA*C}60c.micZ &t, H]Ң3@OQ2v8X3acw>H,Vkdn{Vɖ4ؚJu&/,?>E6!EȬʗoR +jFVI &3TnCMk"d(a5Be;94jhl1F7# %F Tnw>JoXG /Rcْ$G%]#'/ޗncꟙlOzFb ƀ~ )-`LW]6.@ʍGdcqu=9ִ;wOjj)ҝI)5Ezd! mpBl`oF__n2`Ν;!ŝ?',#$e G~cȍ]`*0Zih6u$sh:'Mjj#GpDQ~̀nM˓kRQyudx^rJڤ yg c*j7z#DD$yBY$5g(bsTdh=Cu. .B s ܵo~ }=B4vq[wYlDAb=0ru[~_[CGNJ HF$ 3ȑòy2!6; H&cgzg|x`1oc`ޖCpbk& yHV<۩ AZ^Bl YUl9EgN9&۶l=3:indUqj]oRbJJ=<8j8$Q ǡ28!*;8mGm$=`ibTAlຬF !tl }:cCl?a?B1<_SWi-ŗ^W`7jf"k@#Z9ZZ9`a1!iR&dma"l2EutV @D"vLW`xoEmeQ}aۚ:J1Dޏ0 קstֿ׏C6;;eH 5XmG&pxWm-}WJ篅gyNF$w7S2GX2aÝD i"#P"0""H:4W(=wG[2DKE]q9LU ƒ,fKT& 5ckBw %O=۱@?42tl`jm3lkbm(&Ek8D'j"0-8]9~鬜ܨû~M؈ ]2۬1b3>Nꤽ ]yW6\*%$4L.Co)Wو>>=:wz~_\vF{a/[C=d27ow5uK5@ڒ3w9k }?k/=ҿeɒ2;̿S͜oJAٻ{LoTje'J,}[?#;Ok DѢAREQYkH)C:$OFf3qlyM;tf= N3ne9O֧WB\ Gz&mm[}Fn93`$K/y3WTIJT ߿-%*Rmu裏6j803is /B]U!6) O>co{Eg=/ɦ2ZM#J#!h2XA (Bb#"N'XbHJt@UTJF:tD_Gd4PwDIc6MzKtʫ| 0+?X[X!Ydu/&Ȁdo)'@"Cdλ#Q(F٫:B-~}UdSHb#?3200<4e;g\y!IdA qH 87;6վ [ѫGmPٛg%`9UCE"m2зq܍R)Y1Ht6]/-{ zz8'A2 2@F'~_ol(@;OzˊQ?sYO˷jJ+ɗ`R)vs8͕JDGf)vbjF QAڀ9˗%A,%Edfi`Y x']s-0x St, $j]w!6wm^la/`Q;v2g<6m m;X'tΛ75#IcXvYo%kgif?A#2ъƶ)w)R*Ѡq/UVGd~fkϣz{"ZPlI!V5U i+ӾTiF%aJ8X'Ab`m^*lQs3Aà?( gҦW1upK͎AliHL ˕H*Ħ\Cl{vrh YU] orȴw /!1F9Jߺ.6Ȁ.c3i޿9,\;w˄;}sGyMPׅ̐6,.'K@K"fDr/cX2C?1}pa1l%Ό;.WΟ#qg7*A2BlkY$7 q5,R[ Œ//v_|]^c?.sx뾅k7OTnIuKF&-:'w!6Aͼ sz$s-.>n$=2Kdb#@b-TPm2HGbܵjc4݅).,ӓ:R55,fh $v׶b3 q8E\`'6nlxd~l;k;޶.Fڵa>@֯__Ys5E^ԩ#UͭkJHڮ_u*8f}ED&Ҹ`J>gSQ>3=y?GfD 2: %v rMpY!SUMXϭl&RimlT_b[@Q NYARpdu[ Yy j M¹VK¬C~'ے#n/Z  H*U'hXwԶ`(#=ٱ܇(r/A1}rPm!9ylF۩ OJ8ƐCzFI_Q$ :Q`TN[lEڭ!O,+J#BڶBb~($x2 yA3i:f#qQ֜RR $P@{ɧ rD͡RR;e~Sg/ 3lɡCWTP`vq%@pĞc*b;v$Z!NLFևL]SZBl'O1Y["vB%8p/ $ΚIK- P"Ƀ j hhIwFZǒv}gy&L7SȈ8x"F3]Z\N݃ABhmx 1ڸ.~뼝8a Aن-˜ F /yd*{LrҾ]WNj>@HF԰aCi֢ atXT\A/Hkӡ}[RFUm6k\<8g3zqʖ]uirmYT+V )F6IJQ3@ ;|JHt. s%j@o>j:(&GԨR!`w4!05tFT4NAUN囪?HEj6Nm #͟`Ka5qRaR|R]԰?(kP|qi&kv o0\¬'=o|1H Pnd@t īeߎG]%@ے5סG"Gqjpf~{vmb\mxm kBԈ]wI}r,I&*L@J$k C QF=AFTy6y} b 6^R2//=%%n' lbZI$) ڏ?ϡ~'M/ _[U%YdX/X%@FiJ)%G~pO##N]2H{+P<VyمDh,wbPj}k{uZl~Ȝe&^gLG3Bhe<+%o)Y {#@ Cꁥ턩ApUvtagGʽZ ]bXu jifleHqlQ$Bs]Qߝ'0e҄\-Ff8#vUX0ov;4 GǮH/^Giʣ l/Qo 1vJ tz2v@7iݺ4] CKߡ#ea2~4ܥ-_կ'C'̐I}e2aHUt&v8lӸrQ)Sbtiܹ3R!WrrkԻ#N>$ ?$96*\ɓ )B<6&wS28 y)0p.ˍdR[/ۤ,]2q2DLVF&6 I*@(\jKD7p 8R ZHj*DS\CEO2̢7*nF;{8dx\A6ǂuX8X[ aG(ySxY3H6C: aNY,Y2s[5HstO)$o{:$8'K6QY`lHnDx6 - ހ3W$}z}z.^ɻۯGF$]-E#+~򝢇9"(ԥ˶Tz]T8L+.n _P]t%mAYs]vtlY/,\#ZR_:3؁#LOcJ$bۈv0njґ#|-d 1rARd7^H1ٳY-K0n;jʙYGtfkeO=$$tᕆfW^12AiģSt 5s9؟cgb2`d,Duyd 4msٲƈN` \:\w R{2׉ұCEd2H쨑ug2q&MiZ%+4ӵ_m|Y?KgC5g*Y?t[Y-u/!yseWmE(#6lsJ,)S,~)58/׆ 7| fAT-{2Rb;۴X=b>bgCW/ӡTJ9\o9 ZQREU G,1FrRm%e#P\)ߤ1 ~G`GAW}:RlCyTIi?"9T (nZ$IE5LV/Wѓgo]oC\Nj1&\ix-CNegˤɳe2obYhl޴,(T J`Yz̘5SN.˗,+e)r+?j2fɄ)eҔh,cȺ1fw. YOMJ3%XYvgXGt8#y(@,uLޖj&r3@8+ 2dܱx r}؁+s2o|xM׷nBe&ف7d歨&L֮3WIHY"TN~(Æ݇| Q%<{q〲jYAs RJZ'9F p\ΙJ* C̝ #[2LjB/]JTZlFϜy6 1QB1oLT[f(rB|O'Мݻǹ Gtx6vNP4sf7ng 6N E[}H7eBPm$ӽRwj"5B8cǓ20 TVjרR/"#J56Dqz8`b&5P [u`@ n|NVmWt3J1^#gəH} 1B vޤNEk/( [Z|YrȷHoܟ%Fb%QmÆDDqN4q"]NJ0avTy+V֏`НUu0J!vZL]u)ݹHciZµaPa/Uv}[J}7+Mlm@Rie5u^h} * }#X^oyihcSS` (X#xŪU݆N'$iCPz O;d=i)/%[AN;%Le`$Fts-w $ww nԩw qG IT  Z+K"DeiۡtZ :+V:v*-ZvKe ,qg4͓V]H!8R3>n'O$!D6qH;:;2V=̝/7nfJjI3 Y7$$џ\mb*=B9(J#mPn--@Έ۴kyRz씆HvCT8"dB'UW3tH dB,tHx#4//dOgf}\qɛ4Gd^gd.9R,OH(dy s~s4k 70!y+S;[RפxBl2:23tƎsdQD>m&u.&9R/Nm;Ғ^{Q1~'0y~ԓuöS[ĎoCH *LxDef {)HA2b3#>grUR!zTnP[ݔF#{}UIߕw+*T>*\ $`k ?SlyJKJr,f;{K^*4*|6JEIQՏrpY؇/Ti1'J4cg'iHV@"?lN\j-Cye%Θ|̃yL6X-LQo@ҥ$Cܽ{`[X%KGZ$LçĺˡcP}@4{\S=V;WUYm;dE i?9ə4lWAۀ5Dl!ªiNR`bRx#t=ߤB ^*u+ {fՂ[jg3=QLpIqz - &s![jX'_$:8YɇY*&l4?=$OF.+Qv"ugԧO|T!cc\NAX-BV"+*zk%<̉xN6miȍ :Bdsme@KIs`\uףZDhb@Hܩ~J]?VѮ"wh0-f3H2]Blft |kɹ WԽUz{™/T&oJ uMǀ,~UTJU+isO0:ZxioIBgJrVJ!"MAj snې ;'M[=bKʪH=*1vI;(E !Emr ?bXo# lR{;=I33~Z22E>GA Đ"Pb茝V'd*UY=#ARCUh >(Tn.ft0یߗU'h.yMm-2+ds0HHܙɪA*COiIۗ4]8zS<d߸Pim5xx<2H49dbf31HI";F< {;kiu ՚A^QlLOM`a3s֏zI*HA쎉C@%1HzDG`|y ShDE ʤ dc1sko˗C̈́"8HHr?& TZ5j,a|l " EDd\uF 6ofņ39r^0;5SVl%8ߨ~󟯩P=ß.$M3̛?A^,\ y'gQWWGPRA7vsfHb؏~e>dµRﲕ Tŀr4AXQw\5vΥ @2ƝN ׃#M'kn4wjOwr$4D&5Hb].FIw$cNhQ'o0.8T#`u xeͮRVW^ {M˾2 (PGDqns6! B@{_f~(Z˒FJS h+)>o%in1`fIҵUyBT7Ej!-Y_ 2Ki*^cfJmhJnҽd?;t/M/z^fG ?u.ŇhUIRH ]40H U2e׸8@@uWB>k7n0%8E)PD.}n_=%A6߲2iP0;K@otsie.{d;T8@qdͤ;0<$/O5]VT䍓6ClZpD(ȐZzj(%KP x`zIǁD>d3ݴfq] 5nldU!GPy_ecag*ߺ7 2y:$ti5H0H̞ͬHvϥQFvv a L#Ujd|ҩ!";(Dedv2QfL6LFx<KA^1ݤņAH Mei HbydwIuF܇sҟddH Rz%-vCMI${M|L7 Dg8u꧞!*QI#9sV֧dG7W$J ]lKATZ܊reh:s'k2r4m_j6*cfIUծXϓ[e~G@U>aFO~P;(L c{}p. 2yX*nRJB. Qsy39DO&pF>$::7P-;g-$HqJ!q>2x5YDa+@JLmriٻ Aufw)ݞ*QQP第" |8Vw$fm0B7 42t{ oLBCɒ)]d*@AbgEgl]Z}GS!2@6Б#>UHm{UELgGT~auZcgﵛCLdNs;$ vΙTsT|H !#Jtu"_aPI僴` v22+U}2oj7XIlRtCܾV ZwYjunś*46g3ֱ Hv*qvXfU(HKZ};w]n\Q IplI·Ȧpɠ/MMaA2jf3&$UxC* ٟPC#V6}|6JxsW˶B_W~m^]$ٷ b3ʕo A+'r0U%[HMc!X_llj~I`b9X8mbسe i4:vGl\~,5HEVSʈ6c(أqZכ}LlYxPM@͉wN. \Suzӫ&|% @;'jȼ^CUF|icԿZ*TH2זɼ4e tTbAH+haH5teg|vNfw6MUf0Z fUmj!ߨ=ߚEӢKdj&f||H[.eLe' 4vq\BVrW B4K\t$}L@q'/;XCl?(fvmS"} @'[}"j8'u!˹?O+ .ͤb0(XZ\SKmP'3`mAVxyVWO>+9/+vܥQ=jٴ 5; *T dt|UV٧XO/z}Y[1~]\nMw+zrbv4S"{v) du[vʺe2 i˸d2{>#+Mv)@BT0HFGovJN:_@Ab 5zUj}]>QWDgE8 hIZFJAR~I{*s∪L+[~U 2tR8~,!6!`ʇu vs۶m$f*J;q"QN19BMzD %F$6sW!6ceM9l !6̮]K@zRIic93QF#] .Bl]mc=~||"JW<3m k hgŀwKoJ.Ħ$o;)MȰad>}t"5nodr,F4 @3~iMVX52͕<>˪AX˫WE/ (=˙Nx}MɕJb!OrÚ/RM  @4OM7" 'Vs࠲B*Kw %'o˹Kw%-ٰ]+;ߐsY&Ozb;>^3UgvƬIC>| jl DOIaԈԙm\sˡdr(sD 3܎8Zן8r 48I >|V:w'kfCcjQ?  |u1\ S~Q>Hiy}64H}]XFhIcS[D7L>(UM9jPC }tcCAR[T&ɂUkwT#=v^"#0ׯ֠#YNJ&%D2K'`:* mm8c+d~j"ysEHO !B̖0CŖQ$ dY/O x3j1 dh[뫅͈e7&fj'319͓hy$ZZK[%Z /<-u*Y3B89׵ p y)b%HʬYi>HqVi$I#Ft}2 @kbh{uHF 5%T1RRZK"%rJ!t_,QUu&sAwY&/_)XjWu^}WBU{#[6{1B1&P "#s h Xv;ݐlUGYwQ. #^x fmؿ/.~*No+`gH,r|#oQ5*>źހfw*R$v'wlm琊A%,@4{!Eܼ͊g2jfϬA[a~(ʟBl2G(?b2jmp3Z2yVmY:S&-.ʐ vҶc#9 K茬[o^A+RTn0{,[a2gYvY5_6o eJ?X:tk7tuK[$fuf4ٝ;Ǽg- Ŷ})rmY<'Qcܽ܎*2XA*?k2.",HV.RVK;Je:-Qsͦ!A?aUQGw"67tlMVS:C2Ep9Qj8 'jTpJ @ !SGjyGGW+4)wOԭ]&9aRY`Oj%RDmU/n!{l5$uZOI@R(ɎAb<벩'R*ȁv۱f;ХT}@жeJAbG51FIKQݤif2xPmQxBRta`k$ 7sRj%)QH^cE}/sHVlF`I*-Fse2l '3օhh'hg qH| @hA>?SGn8bfBiٱWVX`}#b-3~uD(8]7.C䚱2gL.@?0js0vj@$nۯ&UXWOviwd= g$ SJ,։}xO_@VMsYhʖk a[f3\F6H13lưCg*^SY.{I)P@Hr}_,&Nc;>Rj٨Ebc*>S59BmGLLj2̂R#!e}z# @A(4ͦC& .͟VSD#CĮXMCkA rvPr:k0Af 0c\YRl#5}9O)rj}9$0A"fgx%63EsdJ?BvO pkc Ad?0Fَ:3efZ27ٳH:@exv c2R.Y@ @ͨ2sLh>z,^:U\)ƏN;ŷ|"Tv Mc$#f8LiHa2y@Ya&/3KOj}n ^Ttfҩ`ӼeV: UpY2ur<V2/BiES؇KV]\*n$rlٸZtA/ ~($ <ެs #;(Y bƬZ$f=a.uƭ9[݃B[> ORo^s5ǧ#l={C]mNU%2|A6穸crbRDo@A2ݗnzvաI9M5NF@` ȒS9Z-Xe̩yNV,+cGǻq +e2btY/ y+Ҧ(lO>bMQ6 ;bPFN["Gϑ2Lʖ'4VNDͣgɨKTZo h{,c'Jf0.I#H~+INfc Co( ڹ]KGr`x ;v_"Ȟ eV)#Dڞt& ]p]3/4!(z#!lNQq]M aD[Cl'fH7 nޖ!68CR\~vrb:C2qf @5*iFva2g;T"lDYvڶMHgR׺/]zClTصk'~Q^EN?$$S.]4ًmGNȝ[U)Sg]]ݽ \sd=j%;,jH uE]ZM0‡=nZz*F%GHnvMfc6j 3[t/] =HOӦfu0+JkVV+w @RqT.}?ik2xDi޴vs'$&(XS,V,0g1Hv֍raq7㥿 +Z2z(C6|n Q3wiJN)Xa[4;tGjgDYoBlހZ ;$%oClo{缄mGšcT=q\6m"Ǐ{HΜ.LrpnE 2T>tDF [vEI;% }C*yUUUj N* 6]z=s? XtUu=}A֭^)Wu6J`H@JF+Iua{Hw,IozsCl@%KɌY$`9,MΤ $M3LƠ}8=RF%Ç A@F!=E-$ܨ@Z# TI]5b֮ 9 zz@\c\D3=={\xt%9~Gyx\WdH.}96vU9Abm9q ;="^Y0H;a֣kgm}{bc[7H5UQG?#6A Zox?d~}Jׄc6p&#]zɰ#񌕡#' ;MzuJ/5@G*mzW*U=XSUKjTc[0]]3fRbud 2y"#>DlԄxSaÓV\,ֆ5Q#. S>(!]>4ÌѓQ$ WD{۴hHQ2h^0&:TpGϟ_(ծkihQ6Bŋisz>nڵԒz6UXG`(s>^]ߴ$B}={ƏQZ7 G[s~/א9[JNfN:#ǏXo\7ؚӧ^(?^2( .RVZewOBu뤯5Ͻ^щj - kT;!a=e񿏥rNAb_" .*WlI0}mھ8V0ѓPh:3董eʴ2p8)(>RlSJ[h#Iꅨobz'qK*xF.S&;wm.gY޼m1j (0`<D-[ʮ{&͟ 7q$5K86;Mr?DtR.$>M'u]5ӧUZlEuےY8j1fjυС%(YD׺aY~:"wn ";k9:JClfC6(8vB2e?&& 6;xaF(&?&Nچk6!]V;jk}p[gA2FY@UD ѽRӦ/Cn#4|2 b8(*:rXZAC }`r P |Bjkң*sW>˧$,dXA;?,<~;Y[z hW;vj+J"MlɟxGF"l0WJ7>3:pyKT]d8z F5n^Og_Iʌ"Eh[<7!6MPE4y3XUCX2w"юYX+WMFQ KoтmaX H@8m%\f;uPOukd5t,Z揎y9\F]$:WS0@AJhu(_*V{}5%5H:P`knV.+,c'N\GȌ3Fʂ>b5n4B qqQKHۚOpᤧ̝VƺIKʲKy#[ i"8j tXEu)aBekti"fB$9[zu|\ F ޴͍xFBۡuOm+pFM$(֯ˊH{E824@+2!/1F04drKbC6p\ƲI?)V9_d܎m1U=Ƕ *Vi/e+,2 )`DN{>ez9p l: kF(f} $EJq#]i:]Ũ H g9 dMvy D0\LhmBߏ! un.ĖQσ]s-Z˄OBk(HXꉮBGO}>?'IېH~)z.9@40HL(`?$Yr#*έ MOn}'JdkTiҴT oZmehwU7OPgT STbf*Uz$f WEwAz 5ogX-[@n$cMp5<~4Ab-6feSb@{rAz5Q4g̔n.8w YiskWTjgu:= kWGe9x0Q:u ̙_ݛh딾SJdKi}f Ҽ~}2]C eQـ!;H]|`A>HFxd$c@IA? n5$D3njrX$vЌE $EhQeAdZ9E AlmuTqG?TK9:ɒ%@ afq[ݻxP!WPEɝMH=Pi?%bs$eAȺArwꍳmH+*%> ,Ԣ ujx|h1 ?/jKu vY߭iyҬg H 95{|Hf,P 9@"xχk}jZ1J4x`?0*U5k~gYTx̍lXOW6W QV=UQApneh(fXڣE%dY-#%f]|muV6Eo {pf ' 3˼uk>I1dN)'7^{-Qsm AQbClN( ,_]:ga4k3)6lXroBl f=@zF H#?2d %uM3K űz/@lֱLpg\.bvNInuAH2xL4f$TSe|D6YlkYҳG`]=# H⨼"m3U=+GR}gmE"5ESArD`"qM2w\Y/Y'ɢ+ehW.[*K1 Z/}[J߿,'B.Y sɥcK$H5k5LhTM5^ԉ"$sPoHy3:6DHZxUʚ Ey %M c>( (9~iRZ0De̠pOTvwx)5QeDn5Pi%Jd :2Ft vZx c\q#Eə;_+md3H#:"/]wIgV[.Vs|1G|ufj\./bm8H?I@3[8Z/c-5%l2f(XZZ$?jPRke_ 9ʫe9rKT Q.aכjG]53Ԍc6$WP R "5l6isRHI=>*C}+rF^2k7W!\$ &;A2T瘼aj`}ZٱklGG kȊe+e_Lےye -T` AkdGAeD1/AKɒA@u,gxǻwPO!{2H[bv\+=yOiңREH~ ҒdUMUɗZl ㈎,R6TXd͚Ku )@SEE"hDti ɖ*< \U+Ti*R#)Vb}*Vm@y*=/P$틒RMb Vnn5HHY 8`a\\p8tfZ@2bۼ9;a&= I)^jI9HYLb#:xHvO9`&u*WNP cI,u?v#7bcF%.Ķp!2QV&MmٰN&'Qxɶiw蔶 ?M @14JHkNg'%-gA$`a2YphϪ?*lB^q|{{7!~ ~gl:'BFQ`jf6ku~w;CP35'vԴR8 ZD 2MyɤhHtS R;:Kd|Q?A;{XapվYq^2. _4W{LTώAJKM{5:bqo-h_TSw+F"j{Jnj *\WktB xLjɖhdqGDIԕ[K"5Ɖu׊h rFa8Ŗ}]  ֪:.C]BvJ7&0mHvr׭=E.XH<=dv\]:8'DںF[ uU!Rt+K D@jZڍ8Z{5a;fL/Lz?~vv'޲xfV.@ 9y (nپ)(fj:EɥSjHGaΊw.3oӘoƲ?;񻱜ߍɧnϑy/'u]c]m^/8/|t^}3M3H 3qhrwvYlݻ@]d jCȫWLc Shi2~]C<@u1tOEJ}1V[ DiF5Y3_YO3oݵgޞ{ <fCk A" %V)1.Odu`*$jY"Ji"a#$jne QMflp!*Nghʞ{ɞJn3@~Utָ'Ė=܅2 {#9}H/O?MNڍBxN*;' CD R$Ikbceu$ɝQ$UHrJ24AH0qwy)7p]GcoG}vKoxxziݞm op &t/AL~dX@Fq{Iwc1 RVȖm\fNiHozB38pN`5܉}M;֨N4kV35J]$HF'GɎ}v$2`E%|'̅2 Ǟ隘Wu Qc' ƒL=z$Aw>1p-ӭ]YV2H0UZ Q~a+^w*嗅YB)28:fS[DH!=*p }Y"4$.P5*q{+]?JZI 8%# 7$df$^"ZtHtbM졤ю^7::AcS'uur1"Ė),6ے%J(m>Gױ#FiUj jtMج$_Eڤ3c>3KqD~eAGI̤4HF0 jTF\#ݦK m7DO1B|g̈W7^D!"beHz+B;wIˍ%Ki0o-6/*+idT&[^FBe %""a,#.c&di@Q7 Ԡe?N%n,9rq_o(R㶃`S 4e[jn ɕ#zx<  lRB^@b$  \ ʹMXvTɁNiH6%JŊÛ$ JTd=jL_4W+Gv޶e!^o;|PfM S͒ C>uz}[2D#+"S2rL߸`g6ls\ Y6@X$$!آD0%8"vm쓥6f`J X-u.|9kGaC~ %v}KWtZ$X t,uHUY S(FB#@Ҍ=BJD=S 7@2ITUnZԪKMoU$t5kFb0HJ5AYHEvxz}slC9<?/ 2"Ud!9o$kE̋j_ȉ qH>~&VV OLzWdxi\$U%[%n5ĥҌ-YM{Ќ]b= #/,LV\%[ NM[i&37Ylf[fPg]z: (cizYqlq4 32ÃvM-z>F1p%zq.a:kɜq$^2H<]đ's`r}f+o~3pc[C&J<ҡT|X[ (['Le?ߪM?r];S"0 :5o| <^1H6%kvV,]7p/}^}zH^Q=sXHwn+j4gE 9eP4dv>?s[k1H~h1sk?$1Č5#:#y\ vMwOM/2l~;zLC(F yK˘ѣeӶ]l 2L7ˍ[f_';-rDAB2YbS.}!="/ Q#" @2ìDϦiF7EA2K2ctTZ$GEF4Bl5wGKk#]<@FM.4T@uə @ںy#mrRX3HD($P5ĦoFHfH33_JX5K9s =ByWIGHsݵ1 |?Vp feMt$fcvAcxئ(2Ivmc ۷~2E =4o_zVĐ?7l&Sg͑sU(XVdMP WV$X~97 ;drnHOa(č%#*C9%' 7c>~|H\j2% R4{+q0}<Ҟ#SQsb=qQJL9z8F^2)ًrq9$sL#xH]E돦+@ ;(H,IDAT Hh48-CY UY6- ZE!b^xEB7?X 0E"QDĐ[Ek|&δtC%:*b%*)fJ/,(_Zt.ma^fǦПa i*ct^1iKa2oLYgV4lSSb&w)^Q (r_L2b771|o$Gȱ2A%54Hiax'NKÈ2o:g+F Ak EId ku{1BHQd =eH1088[0(H=%,"R  Z%ׇukdC6ه{$9"Dm0[NɪAw Jo]vd(jNAbM3L#7?v EY=ۮݺ&aGvmےyq]FM7/)fsHp`FOdos߶_4@а՛fwz}g YE1H31q(a技5>N:ݟl/TF}=tf*d2?Y{/ HQר,U\)~YQk+쯮"5j3@ZAURv# R R#_^\d$:&wfJF -)-m"`gңdEst6 S 8G Y)hGOHEllh^Q$:{;IQ$#\"o"͆tQKZ;w-݄m7/wgQeP>2b/5!Z.FBi?HLbcSY9ϟ?ET q~)2HkCSM0*zCC6&;Nc 9t\mL /dt;Y?tH> .0Lz(s5XLb9f Rgϙ)˗,+$z%MZ]\c?䯦64 zJguzQ Qt}.Q@HJ<1HOgSj<~|%19IN2$<<+EHl"ǮRp29u;q'IHފb+ DͰWf@< =!#?&40* XE))yUvH LeҴ )]4DfZEC]SVh꯱": GZ2d:Bxc~;F ׿,6-낊2eiv/o"|PZ8QOMCdwn|YzzI19rDn2}HF@3vnذ9r:^yHǎTl?7/Ȋ8a7\/o"Kܾ~Iƺ &*2hAZJ"ms-6ޟ+F'9û~%oP2tCj}3=edA%b9<"ῳ75Q#ܚAP:#E$CN""m=<嫴næI.Õ d %_jRYOlJkX2ZIMk~I/^Wl6RNayˡ^sL߲;[*Vo) iH~z }a CC!6WmduO @̖!4vj@jپuw QST( @"wVG"f͚=r?(@j6o+gN}ⅳe2|08} 8T._, ʜE$$pt^ zːae5B _~0 "j?) y ?=Gsu`n޿)c]BldR3xUP:d]2ܸ/>u?{Kr}9yd^d!6Ï;¿7:ksf2φ2QZ|`OCl^eҢ>FMhz $Sk"EHu~%KJ\vk(GLG[lEҺh+0cM iOs) H庆5:O@!Qi%p EVȚuC^l*`Z)gIr1'2W . .]I7X1thQ P?`"|x <9dr>"ѻ̒sؘrYhL9?{TN?h Z,9_N:X]"g/zoX j2uH{.A,e wz@ 3ybsdރE5Hsaг;z9YJ;%H{P&l|3x؟^)i,@_g&&cw_fS@"`q L㞯sZʕN)F6?'G0N"fj=8MMD8[к2/pY;z:P0\ FFto#Zce3px,Cm'CoSNsw(~ Y$ lEb.{Ҫ(RsĹyd܆Ji1b4ۺ q piw4:P ?ʙqmix4ΰ&[YYejDq m31)h;CmiH|PScv)x?m#TJi_R-Ew~FOlV(?PWzuw{y ]@ f=$n#7t#BJ&s%deFz;ٴ lEbl&cC`hk- wj硷w$M ,m8q2`3Šx Yj AiiDo)A 7[4O:BeRUKFݤuT: R#"[TUO^^R#j´/kѣKޤ{r4/e+zR~IW_t|H+sNHĎlVXsH p$]$׹- 00`jن]x$H;ݖMU}p{K~4)uk/Jܡ/]ahn^ϻ _8sZ?J'p)k<7 %PiҲ{3- R H rs`^Ô.2V,=4Ha1@VgSlK7F9ru6YZD? H_Wغ+bJ~`"!R@ ZRM)YKH"|W\ՠ܆Qs˼a^}-UdTҚ?*a瀒f9S…O{N[#k֬E':  e>hD]Ќ, (x #@2I*8 QQhڲuc۹&˲UdPٴq3JlE!ٶcle%OVC8}L`9:z fN)`;~RncYA o޴N&Mxy_̾HY9KkҮuST:/?G!/5NOʴiseҢ]6fLχVp$7|<>H'NRC|Y6m"{ٽ=z(ZܺG ;*>!C?8fH"SIH[/-{>xQK|r˿ ie>6wۚv9]:d2ݦ6rTuMpE6 iRcV.["Py}DD%e^yf~ R\1ʞy9Ulh)?t?&>B j_v?}2%J:_͝H[gҿ Bl-Ħ;z"v; B_BA2Az'Hda9Lo]{j3QI El Wy[MH{7:$>) c ,JkߛUKmQ4'O!*NB׬e*BlNU9t !7"sGp1`M/ w E^$wH3J Ӽ,,X7I} E(eOvBMoǗ.u;mRTl׺^5gqp5B /*]… },Z*Y&IQN>'o;VO82Ah u YɂQWQ%I;ɺ)}7 ʗuDp/$:oJ)<E 䘧fN<Ģ e"zqGMgYjpyqHiiJPSo맦9͵lu\p]+inJJWL1[ܶy]^17@޽SV%w^jPtx @ZD-_SF$O{ge5%@ ԹvOK`$,`"" r)vf2H@(oDxi)|~<F.^&?^4/`Ȯ}"m0H~9þHieȴBZX}`>)N6z}^0$ n93 }bZ?7u]ov5u׶ suۻۇ^7Ed8 r#{^z5BBQ uғ0)Rw)Ҧ-{$p6g1 i͓['5tV\.P/aa̙>Eo$̐ɶ~JYdT))'B= b_ Y5HZ4z $ 5k*\}ާ$Ұ`yA;63Y^КuJZľm2>aĂb4\sjO3ݦi<30q1o>t22}r),7_//o=wLiSsP+i2u=g`iF$>L<Z=stDOIyMJ́}r[/ Q?,~2㍔ozݔ~ԧu:YoaJ;Kq'ܶ;H|j}#R= Y@?f(d͔KW9僪ƣG/+#GE8dqgxO:G%6վ]sR;ntHyv_\Mu *џi^f]mXo@;nd|됟]{vqPiiuR8"ЦI#>qf@"]N3_8 db+Vɾ1"@bMskdт2aTYr*aC F|%H!!ၲ^I\7 `Zo5jb0^%׿kx t~d@`!/BO9;%x哴9x;t)@z 2Jo -@zڵfK-dH߾ҭMSt'4dWz Bܼn]iW@ =3;oι3qˆ+Tn;|{sv@uOManc.=w<>9rH?/֗u˛}iۗu ̛[luq*dݎ/t0?un˹ ̂9|4 p׾v>e=6]KTw))а^$ m޺`֮\*K{\?̫֊Yb1ȒE e Y0w r^ǰl:M[{}ex6of^w0ۦs=s,<'. ]b^tcƼO< ys\bŊ~:?kJ tփFRR-߱{;SrT_2Ik y#O iH];7j>p`J`Ȝw_gL^\!Yrg#-ˬyҼlZ{lu]/AֲW rR7Y#޶af @~9Pre =jt^VrY!ѮE9?옿V s=g|r(,XoVO5 ΗYlO=;G%*|52d) &b޽IU/ 2=d&齯[f+&NVFNKI%12 0H %{כ6V1K/KdnX$ >m4oČhO˖ߌc>q库A"p|c"5DZ2t[ƪf2,XyQ3^\3AJ)״mܴirz<H? `2-iErd읰}a֜rmP?c}S:7&`'n!\cFDPXs'c!K(\/`KvL}b*UdٓΉIf9튯#1Ѳ.84uqt'Ƣf \{J  ?"[&Ǹ^;yyIհQGR(WʼTFNDZ2V~Q)Bى'dq2} i/ɟH7#Q3o^ެO=_Q穙kgضAE-żyۖ\tV7мC:lAirVv8hG6%d/;ԝ_AYӤStr9ҫGoYc^ƌH[\[Obz *3f͔i%;fgҊeax^o i'0WMy dB 9si灓oy,r9z"NƬsiľipѯ5à rgtcwj 2cfǒYiL$bg;eRx9{`~Kn:㺤ىFvv`87V ٣"vȑc̹ .sch3Alrv c̚=yL3LuJwFmJ:2D3qpk~aԹ?rH&y)@% ӼOS6Sթcu^AuA45k%x:Y.:Jo&%1V#tK K׶gh8Ec mI J&)QiH#-1a#d2|`dg(]K1%;Q2={ 7.= Ùpx,5 }e6 >%#H}dа2i(x4ܺNVO&6m*x:Eu2g /-һ IIOf dI '="d\:wX 0kftC3/&ҏ$r u.m ,ݺw݇l\~=l\{zOOG:^R33lcq6>HU =IϱBk56nB0" V! SHgpy yZ/#Gy9E԰I{vtt^!DVTV z]k>""R('T‘Y3 5Ay @M[Ce QY:@Bn°ߝCl[7: t?{ ;C#Gbb݂vB,p GmffٱN#l#tFC.;WRBVԅ,6Z ! ?ԁ u?O/ e}MI}Om!< wcOmi7&(đ"_}J6 $_Oi}G` r8HLѝ/&; KJ.=k֬E'"tz ,XnEt~z O/W?Qz-Z<נf͚ٲe+}tݧW++Wb,&t~z 2ȝ;w"x9[hIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.7986386 guiqwt-4.0.1/doc/images/screenshots/0000777000000000000000000000000000000000000014301 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/__init__.png0000666000000000000000000010226500000000000016554 0ustar00PNG  IHDREj}|IDATx |ս&% b, R)m"Fm zH ث\iRmFVԊH,UELi/6Pbyϼ9;;3;|?-Μ9<;s0i+YHV6# . yط!UZ[W7u?>===Ǐ{nUD=#d%%% :z3g-'33w<''G,ZYg zo}kĉ|g?X2MɩJ"B˾)?'LBPFX'##hSܣ'DOvt$Kh%ƍ{d={dvEedd>}ڼWzXǰ@t?񏼼<+c>֫oW(YFFOH( d{2zzpS4{JH{4tǓ&M6lXff&cǎڵ뭷ڳg U̙3ػw۷;J~G& z֝ e3 UxuB==aIhA_mR%T4=۹s'$46 {aa{VVg~H-K(R4zh+yvg|zPTT gTh8^Ә/#sАoTĄ ,lSLJ&m&s98pࡇ:uןP 㓢w}W"Ο?[ɺv"¤_vʛ͇zW>}$ܰRϨ`;>͝;*aS)S>d@7ݫW/? طo1ֿ+ZX2J-P'B֌~=ְ314gMJH`Q3,DbѢEyyyULA2۷g]wuQnYDǾ ?6Vp+97q}. V7 @sz?vX0͕<7ɭd]Qft{˯r:3sQ74'U"1ydMz-u=ܓoϤu9u~ GV5G?joogݾy o?li&t=t%͞H%#O+(4Kro(ʡC;CGzIK 7[d*Y75}dޅ%k{JH|sQ7333++k@ssw\yE,[v;o޽{ϝ;އ\y>Yw<?W}p͕_?%?QvoVI]7!bM8|Z/_Mx.}-gZ !]gL{K+#z75?!?]WWVI֭sڷ/v_#ڻS*2{J&66C[X ]!BOS4[B_d@sz٧ZF8pȐ!TLJ^xᅫڪu?3d[{y֏ط/;}{'\O[]|=_PP@Ŭѣg͘q={͚OOz?zo3J]՟~'c{r޽}jkְdZ7!Z[Yە'"ArƬ7eіK~ִۻΞ_~b 6 i[:b !7g;_\>nlxͥW=ރnTn~g_4?=M89~ewo;޾׺_~=~/R#+;s?V}a[ 9qĄ :::b=0''gΝ3WK/}_:kd1yҋ]_8˰F}`J$tz/;h/dggz~۩I&MBsk֧i*?ng?Q^^d>%"-3|msNB"~!7hzm/3MzUzϳ@k4֪ ugIOs]s)kCfGox?/rTs^:mYX^9v.˝W.weww-'&֝=apId.{W}%^]*M^=4no> pqrȑ/8ѣG 8\IsssaaՁ^GőZ>f>f߶^2rrn*ꪫ4= [~ԩwh՟/M0QhIĚu]}GS=^e=!gx'_"<]6寬˫CBn?ԃp8z .롋z1?՚VUj<7RZYsw-˝¹L{p?}s>ӏ;c?{·?ͺf޳s]B=_wn z BoGMn\Ъ‹?86bD?qAUdٶmT)b+IJr GY5,uϱ#eZ |ӳZӳ{Ѓs^q1TN<%eoUoNc8~&k zVgt_тxnNY}}h|n%V]驹QfaTUГ̾g9l`:S'n|܁.۳+*zn^vĹ c&KϺ)& ڮDwzjgz&dÆ5$G_t;ƍZz/,M^mBMl]>aC3G۽?M]%716޷:thԩmڴ\fƌT^uui!潆JIAsTf.`7m~ċ~]ߨӳ[ud7|30H! 8Igg k[:ć}=>>e0΃mNovls!򍵟,#T^ߗ\i1>Օtܙ =/l$B`ɬ״ȡ7?9wxoD։c{ 9:ՍvNWz5tXybÇڤ/ wqG^^^SSjonJmq}o/.͇|O'~w+7=ayNz/>=4={g#dNWxp߻rӽ_MT֟OzҀ#G|+_Q>T?ST/$#J?3B=]Y'+$9UBƘ!gua|_ٺu9}R},۹B]Gr8cؾ}ѣGǑ#s}եTo< d( YczB>.kJ,\CT䌸ϰAnM֮] pǏO>}Ĉf+ 0ïjqŻS,vW0pHNdtLZ T2;}h1- >f>ƢʡA{ZhRЗ^{2iYih]SмgPM\hL1⢜ >%M׮-TgR`Fw(g=l?1U{L3x3bc7hг7>UEiBwL IkDK^LZ3uPԚp㍤휻;YTte'׃z$bE% ]Fd|~KN~& %D xϟpU](X|Jm4;m_q3768ÆPrܖoI>x|Z1qy^? ;+;+gkdwoZ<ZmGvO$]j 'N/Eз6ru(؊< ̿gTzE7rէ%ݷ[${'Z i;gBH~򜇈*W|chu)"%GzQg _LCώ=i2d&GhT'p4(bFϴ3Tۈ^2"v.vl=J@tv}4th~2гdI0``n+Wtj"1*I3pÇdf0^ @ϒMLz3b A @VmKgfm}ɣzJM<g9|̌榞Օ,$+%T V=xva=s=A) 1V2K){;:gs 3:azl3|LK}=k U*Uyu%wUOsĽCIq.AtÌM;UԄ&vj]w,/+4zሞA$m#(;[[4eQ,Q,Yr͕JVGc|&TR_*)ھT=T}{|gc3o%A5qE1 p%@C!Jϴf:FRFΠg'>362Jj15T3Iz&d3,m+IͦU5n%21#pLzzfj=YKZ[’ 2q<(nQdI>P^:KNNjHćSJRfa #z: egAѳ= _@ >gzD=rIӳ3ݡ̬}fed[ápęO|"}ze@<ZϼHgaA2=~}cw̌p(ᓧNzӑ{= 3.믩mYMT|Ig1g_h10k3BܿRw߿=׳p8|'kpeggDZwiݾ_,VF(' wv|rޏsf˕3wpJg˩ ]` ڠ>Q&aGsnQpk3~g'LNd ?p@~Bߓe{v9_M!pg79vdg8oTt8TX|h}1AVv͇˭'ժA=bv4hTt sY䍷vҍ.Y} LI{ӝGOv8zy1Dz9L#O=|l뷋rj;|jugG"K&/oso~RӍWlZ2oqRϒd 8`Y#qdfPw93 Azzh)2_/L~@PI[ݩ+W{NaGݜ}eZ7*Y;v]hӕ_xxB~lϛot~XW>4ωP8,l hYY:s$$ß8~Ɔ+.{vN '>|IaYτ-M۴-"rxg<'6 n!kN^\67n5 OV=չZ( T}pץrI_S-@#*~ԈňU-bSӹ;H%=)0[m:&bOӢF₿S rJ}fccOvA"wVYkQC3=׋dy.4D SMN8wb:afV#KOZfuB@7=KwԳ7INNȳed{cŒ䣏>gvu>gPCvycN PB!rNb8{zf=ߨ͆1"gF冐\RP)|#_qZ Kc+(Yt|QXal嶙r9虿pPށ=ovߞ0("{?Eϴu;1'O@=rӃ~CBcFvAa0$B%f %AkN[ ܙ?:|+wWE*ņJyA-UU'3롇ziS]oYh KrfOvCW͑@z{3{ :2笳aa}X?^gvw3מ/geipiG={u_E8rKX⠞8dz9:aWdeoY{]?{ ?%YggN?ry}g}ydGQEb8(.#G/qi1ٻK/</՗~A#3fyӳ=&gS愯'Er lU}XȡNḿެd=p`FfpF>}{I8W(L2r/ol~k9PhF{GolO}ygty1R$Q"+P[nBz$pI(]]{ރPx/:uV 3nq~O[ꉁcxŔU߾sS0o^XHQ\3%/riD,K _ Za m=SG1<`tWs.ey}?)?>gC??_MSO)4# uIG=FdPÉSoc_zS .p ZR$虿@|@ z̢8C >R__t$^oGPL}Hj:4jo !ip9[A'4lOfƈWT׷9 $itv}aQ"IECUA`oiӓi&)t}6 ra ,@ϒ zlgzzn~LNĀ!z~曏c ݈_/_㘞QXrU9) ^}+ 4O2Y}egiz5Y:g&=xD V)hxdӳ+k/gi[ZmGYcO߽Y, TrW߽s\J6-)գ I^?F#ゞ}qjOLȴ{LB3Íǧ|{OIgKNO'Z.&:4Xurlhem 3_'G ?yC]kI3g-̰xqKiȢ6 ā:g6O2.?C+ġgVQT|z n?8맪}q&?5L6gob#F–?Nf,gMؙo 1Gp.?MR>Īg1wIeO"d&fQCYӡfYRH=ՆtAL@\:a1Iz*/oL63虿@|@ z/gIԳG8<@ggԜtg䨯m׵gTh$҂jvGpgjJ5em62|r|gmPUUֳeR[$zᄞrFQXo2>N*h&P3][@|8ggaB=pjQ4mQTa^k5z/ćCA$/} mo^bݷ^bԳyC >^: 7$&5Գ^ 8L+3zƄgMՌ$ d_68gW]uS7nc>x`cc]ެYhI 8 >P=[n]QQQ~~~䒭MMMгzH$=+++SzJ@郪g===Kfdd$E_ⵞm]wӣ䶧ۖ\ߡʒwjwrنY˒ty}h[E\G];'u[]05T*wsk 7yɓ'Ս߹6HϬ$7q=[;/ua[V[YۖMqY DuCݪxecy}I|y ӷg[}=r>O$uY췙JB4ˏK?Wv>=K*m}GآaP[1qrIE|)\ Q]hǶ^XnGM4WjT*/y\Bճݻw/k%K J,+E2Zd,)h>3" w+i.=!HERڠ%u@^%m(`xȤgJܣjNjq3iRiB杅V};Җ~[ҋ :W*A'9zVT 1ˏ:'{\'MNIUUy^|/Yz >AN>})}Aߞ[BE]c}zHz-=z LFsh;2Q[g1kCbrtiDsܯh5q}ZX{ҺP42mu#b%|i/ⳘU|( 4"Mˤ[eS6z\K O)u|uKg7oLTc1 "7]Up}vzObB 陵YϚH2l {c3_AϨ]Ud#5 u,>wQ;ƠgkY"Y*{g‚+ bF 8RG"sփHr~Q)ԳTs|= l ?? 8R#]3aIg`X=c³&Gl+Vk3VI= } } }H 1gzzHg3|65~ɌQ~Z3z)h73@c=jxY'0 cǍz$@Ka܍soH*izOsqx@P~2 Y$*5>ѥi?O6q㭞 bFDW+Y?"82s_ OLg넞ʷ8P5Q$Pİh,޾8LH[m5=|u7$4|jܒ<&;k^2O܃褚q[RrͤM~x$gVGw!!MʤR)h5^T|1D([ZFC ~!ET6AcTu6u&+.QUr"e@n{CJuE(iӔ'Lo6B3509tǍz&8f%)y]gh3D,$jb,E뻨^]duWjff:?I GV|&]97Z L`ǁp75-v&6D eO-*l9̤I7Xk|i7IM~xgg+gRF']jX]%ub6tu~~8bGϤ26Qצή7sIihavB^'!v"ƥgL+eY"Y͑6q=r,g3Tǖ{-3vbJ+#o7Ȇ7zguVkT&?#gB\6̟579|cq#: YlV)h7 VKŗlVXխ*!$Iat)WCA#[\ GJ[! 5іQq4E30Վ"gK:6rӄ*ir*yg#ۨR|KCdTM#}zF_-г?\a+$<zdg΢ L4P߃kL V0=SH.L7=33Gh7rb0LzpW@ϠgTz涿֊e?ilW~Mc Q }𱞹䯯bp٧dn|Vdj-бgz撿> J>1ь걲FYmc CCYl+ڮIUO ̙}JF27?s"4)ܛpԳ ]-Xܪ17lQXlyI+kHbET5~@eN@jz/f6 R kKv׃HLܱ\hp+;g-7W#z#5Rq7rclLs)kZ/RѶ8\v|H+ho8jRz>1g#VΌ'l: 'pgsFn5QMeO"zf_$ X\O@Vτ[b+=# V Mt&"Zugo6e۲:܌&Lj/?Op6 +ճ$w}+Lbl?#.߆\eVYYLI#,J6Q*s5p`YDV3zf [zf}xv5yIB]J3S5]6IgnUDkг =ۺ䴵\ebMu;!ebPlU&!s52wu#)SZtxfmƲ>)7tV$=Z3߂i̭Ab<+_ςO🞹hG+:gO{LϴOCG\iAYY5psIzH|g[fGm' }9UtFSQ:`o' }YWW}AR1cv,z$j~g!,>zfr}҇Tӳu环t> xgb3j'G򟱶Fbh39{IF81 ŵ3 IL<~WjNsR4krS V&0lWn<,2KQtfQ~%Eke7-FVR9ĉ Z'zF4Ny'>A3`z7tkHs3?cUֹH[_H|L& ͇36Qg,3ZcF7p$T6Ժo:mSXNiHNfy9#oMPvN #0i72Izd|dWd-g68y*f-jwkx)+[_:b!ֺo:gSNӔC4|!;h7< zfgIN= 23cʘ~+Z?NIw8W{:ƘэwL8uGK,8XhEywAi]GXҀuG)43z}L[?G?$?=F :f=%= >mZ> 1T ֎*SXjդ3Ff[Hjֆv\}cᇞ뙓T 鍆7O۷0&֝lg!,n}HL\=\?=zHRPo4J-^\ gq**Xᇞ҇Tӳ8q+MQ2Ӓ&6e==̔)S|g'Eϒo=[;/O|ZHuLXڶC듇K%եTɃoV84f<3 πًWnN{ |t'b 1ւ'] .Vq%b/Z؞ Xᱞm]>o?1D-/ŐI6*3'0#V5k]/#Br0Qd{1w*gAPD3$i9)sV3N3 $sY1ݎ"͛b9ςϖ?޺GƄ cUf3EV3AѪ\9\<5YuSI[v-0\@9%]D@[E)>f+!\LIxҼpB!M}sC1a-f,xg[$d?JUf7JRecS _k +3+HXT,/؉M-FF=cw@lIz 34ot{p^gwLIcz=QT"'^%U"zfqpH5=T಺'ۢ)I 䊞Y&yӢ(Q􌭜*9 }%n|f3Toxv#z|#'ejDf6- d3~\ˑ 陹K L!Ӣ1͆LT߉~Fg~ Ĕd4 #2_k|f N#=OM_Yq5cA, }㎟8o2oŔLC7C%٘ZC>1 fwJVs 1Ci6wIkN$Ε=[:wIukLH&?'Y, &ԛŹōmg|cb=9误QVqO̊x%sY3/|,[Dp3"a,^|gNk̊5D {߸',V\u%hFҵS"Y?qg~M%~IMW_@줠/ X6nsO }H5=K__V8]:iF玟83@?=KXkp*?qg!t,n}?qg!zYTDFг 㱞۽D4lBzpY|Soa2|IΠg灞yr=8,B >3fXY+f}]jd!)-(+V:ǩ6[N;) =3>Ƿz9zv+g}& L[xfϱ#ԠQ TQkڌk~3AW=3曝 VOUSiVZDlk횪37m[;>3f# 8gBRO>WW*B)yگ&aIw7 [)Rj9M3}K 8f=QL4/L&Ntfӌ*UCg8D~]eb~O~`Y,騮ZQdn=3zfkg}e4'Q&`q$-YXŅjMMG }🞥!9C=г =г =г =г 㵞))Цh?R-YG]eHQѶeBׇ5*%wVH+憫&x<^Vj<ľ @ςzF+,z^Ys"279lxdճ.2u(c[n2SkEDwMׇnټZL*,r)aRؙL͵s̰3G&8?s =K=S/G-#WtC}w zƤ޺|9YboLĮ3U0HzOF3`p3gE7Yc輝sG3c0Tm[ &RJϢܛ0f~N.'))=ݶFfC_BsqT^ner&gxx~8F[\>^a6.lI66껪L֎*+fZvI_ } } }Yz -@CT=YʭYl<ѐ85 <ӳmz:\ vڏXI{fBSǗz>eM_gi.>ԉۉkF%ΛXzp_Y %d.tqMU증l 4qRGlGﮞʼng!UA.Rz_qgynڨ`ꕉ7ߨK'~LI=篯kYJvR]6†_ RBR‰'zM<*@?=K-+ds]3@N>@= 23@\F=г =3_%#3@= 23@= 23@?=8QfeKag]'~w }#}ErnjJҬeU>w$dhs8Z?cRҘAyA#60ڛ~^P4vVtS waerIiiCPѶeMNjNAڙL"}-_#ʭ /_J."n'#{y_>/'¸חzfp\Zމk%bتr?;Nlօm+u&?J7cD$=+);rJV%ƚ9Hmi4*1QdRׂm)iTYV҆9utnUֿ9av&x]+(AZR+n\Zaplp7҇䎼+_7z#;|I|ty+ʨg =ͪXNIzl;JDT!ΰXޘr6bwb3 -R2|_&vn*b?mNn G34TACŴ%}xAmT:gKgZ17\5>3(c2v>$qb>M-*[FLX1`*;#+*։Fu3YqT_e7jRq|gڝR4 =p鿳6h!],8A^2YWR4] ҁk0R+l%^˜E3\b4dOԓRμn^_:M| J,JpFOS`^U嫹6; 'J q8%fB5#;M6ψ~w^iqFrOR̎X׃vw=Sa3,!-d%}ag3cgֳXoצ;mt1HFUuxʦ9kr5_Yd~P+gM?:4%NTԾESL*3{FT6RFI Zn.ylM;Yﻑ眦>#͇[DYWW}AR1._ggv=7awQ &DkI厂ӍgpMQ:doE˷g4AK#zeqgˆ뙡KQg&=˩D8۫#cֳ< 3:gm=3)8qճ.2u D{%#~FNACeir`ThSj7b5$&|%̨ MRZ@6ӚkK["^I$HA=&)^!9آ& K`1os vng#cTOSk.~F]))~Zzr"<5 Lg"|6FEϘIM*n+sv+*$HCaUh j'[V{|Ϻ-oԆ1ct@ς >OyKs%5D?3@K=3X6&;+9>K3@/Gl61~g!},&:?)\z&d}t5яϸ%g,J)&LG[g%(:if }H#=K23@?==г =г m3~R4qgitx>A,@̎;@/,;~y+<=Գy >o }YÃ3@K=~{#eWmKQ\a~cFt?E!9#:óFQN~ܝ7ePd~"6n}@ėzC3=յmU=k[U 8{UߐԕTF‰>-%59 US_?ŒaW܃2΋A줌龎෇E.{IJ12)nJКj[tq}&7IQZ0m}h[qqnc㾊ڙ-eLI.ꊦږ"zm*(+{a>l!~i=WT4VWȱ~ES)b~G ^WR)hؙ9G 7W.*VYM.-S#O[~FbL憭'd87MEgmP> Z V=:S~m oW 1Kk}v3,VI봆*CM2uWj|ᕤd;׬j-_LiM5E,U1 9\СF(oMlG?;fNp,Y]YC'C;iBgc3>!xoA:Zin܃ۦ/`PBu/- ,AϨ]Ud#gzqjV!ҁ;+K:WWI&ܦ/YV1ZEb3f" BߥUJYj+yf+CfpΩY ǠgLWS:iAdgAs=\a3Rzfqx*!-;K[6K-Dķ1wAϸ$&=S>V:#3z4=Kj)+xgB  ]jKs^m=c&|cf#72`ԥ TVl 5%d\@k) ̜En'ˢ!+gkZ%\c+%&(Qq:S>)]>T Ɏ̽&ߦ2ַazqgxnK ""zM&328Ϥe zf>aV |i7rkw/i"k9ykmyLCAkY"f⨢X.1^v /f).GQJZ'2y.Li]?g+rC&LGlͨܡ+ڱc"٨tI^ay>3"ړh^lC4 nJN_$¯S*/.nlldjI=Kc< b8:n~~[|?<f)?fL]uT,ï q{SPP<UE,U~U0} Ř Vg՚D3ffܬg##9Z]K62Y[m1T%atȞ1$_57 }IC&-1`Y$̷Ӌ *j36/7ho >P,m(3DRAU Rn-<3^U4}XX/A&W% >Pw/L,PKG$2<32g;c }𥞩"?SʘzHHϸOWLJ{LMg:̎$v)r-l}>&0M;g 1&zJV>3OFx;2lMSzd<#гF;cV,dK"FҝSה̜W,BG>MJ#Gֶi'SL+jfJzd38gRV/%k|nS;M`bimкYIM6|% zDgyVSp_4y|ThdcbR&s{=KDg>3Ӯ3%E"9gII׳6dcTET0|g=RhP2_Z(dz"鉽.O˅.gH3SbH6+&*ϕgqK=Ի}Gu<ψzXOg\*I@{]jOќL?Ju/LKp3 -~leX(g13ҏZk z-B5xڄOO?=S}cuǏVeKfV0{Lgςҧ?C=_"[dzft }l+E()ɓyK.^=3ݓ㷩B|c5˾@,nFyoX(=)g 7e7 eg!e  >@ςψP+?bp Y6vVvqg-0o܏g[m9q|gjI"zfyc=j^=Ǭs3^bz&L5*CIzE ,%Qhm nH|L {{g:+b)g\}՛MզR}e?~I0花ͷokJy33O"V|uU6@Vqa zny{L@ZǏ :>3 ~zY\YR=<5 }qi1:}K~|g3@?=G3/>wΐjz{Oy=ߠg^{C,޼3@>zfe?v"zHR\@Dgzdgzdg!pz"Yo󟉙䧬x]prT0Ys岢Mم׶dFŅlQм~Y6M"6 {;)td+KZ}U|g׏n3^>VTY]HbV&A"Pj}hzֱdsN }ї477/Dxm]~j!p\^by}HHږ풞Q_O,[k4u%4ᆩԭZVFf6ڨԺjWgTE xoКmYa ܇E Xb[ulRZT]\\XQ[R&pVTAE?Y͎o敚ViAYYRs!rexڪNrD}LoMDJz&/Fq!i}m7>YlMCuDIDz}4i`D2J*_C|&~y泯%J"y[s$"KPӳ eP}U%ӫXV$C1Zr\,^__ʕQ=YyZp&hl,&%ʂ3-jrՕS%%\T=8b)[T0_/cVO>aI).ӳ+wkDդ_- qw7zfegKZqzճUU 53 IjTg >3 b^"R%Xƫgy: &wS=1|iUx'm!_Lۖp#a|Xv.yiiՓaPa%83YA:{\=cJ374z<}-R}5;*9Y:~B~y@ς >@ς >q }9̅U >]<;&(!QEu$v+N᭞$!?s儥K!N,AĮgpNݤ?mFԷ0A=cCDu"͜5pؤ<Y-)O">| l-eG~!Lrx!(ŕȯzfg^KRzY73/|s=S]&ϨԐҖdD|zf?>ĠgU=b}vF"U=,bB8La4 o%%GϘdž g!N=4J3uU\lydoo9(U22z,YN3&3!])odȸM!tP7q-˙o=/gSvqE%3RLlL+Xmczi e#ɜ'SNr;1Xj|82~!,<г I3LIdƝ,\KK!I%e:_M@ = 2>3v5s<53`f7w"%?Li^ G_9:sW8wq'RI7R5sREȔfW:]سYRIq뒞ggJKA@r?OܝoT3u8)Ĭ3:# 9@ςt\&*"',aOf3bpEփ@΀@ςL=OXSvu^$YI7=S3iB,:Ȼ2mdqr4[2f k9*jk[g -k:CYLOLv>ԊVkf .<zd<#2vd8}:KgT&JJC%"LrrZ^2ټq%!&3F]M\N y}h$|Ԭ<&3CgA[=p-S2u.s??QϚuZm\ZRThe I*%#qz2ɝ%URę~2 YVϘ[/'K2H3-RGzg?٨_= 2^?SES=16z?z=|#!г q3e>!ƅ陴CAY"'oV3kIe`ː o;UҐ;/I ފV+gL=zd<5 } } } } } } } }Y@8fhwג!+oȎ г m3-홚 M!z&a4\2nsJ8YN7d gAkF%iW Y]I6IOPc({+Rȸhekê󯺵ewc:]Hަu !,x/nɦ@K!=Oz=c3ocByGwcĚHUBl= 2 ON/uLu[K3&{`UO>y*PBim-^P)e} k Voˢܕl>s!)k>s@ |dg f|gL+vkF,x2br{ UsۚP5HMh3%gTc#{>In}Ad"i<ƸӸYx23{La9RZrpo!KfegJߧv\'ϔ |qs&bnߧ)_k~|d3) ?gJ>𙒁|d3)w96zA3`𙒑9AY`0O1<)f13W`}a|}ׁϔ'7ܵ3- yJd΢]j.Nb|~ ow%'W>5iժUm9ҽ쐭t_ |d='5Kxbo\>ȷ"K7dӜ/x34\>S22p nM-,|Y{B#s+Nob. ң*𙒑gLjseHL{dR1 vsX8^!g LȚ/&Fz^b IJeBA,ZvAaS >K¹(3L3K3h7J3Do8=s߆"|>f$Kޤýׄ7ߐܯۀϔ | Lg>S2ϔ |3%Lg>S2ϔ1ψ?agϔg11[=gK׫{M7zG讓'ON0ք|?cy>o?<\+㲘yjZf(LKK4oe;ZHKPSѣG,))Z-|3x6>&mjZϴiOLxH1lb*oڴ >%11<̼KAfu JuK5??sb F\ݘ{^善g>g$m!O?ɀ6C榫<Ҭ/DZ$E%X==')ygK>1}j Ν;ZL]3>Q}j\YAAWd3>Fds% |u[W𙒁dN'\Sݻ>%#M v迹5+++Ng{}Fߩ rR)_SS#rdd yY1]p<ɕGOFHH/"FG%$,ʩ5' @|^ߕ$#\ytc̙NExYNNΓO>g}Ԛ3n8g>}f(9im\e_ӦM_ZYL`lG 19𙒑gDy皞]a2+}0&O,[~)wq))|&ʛIh7m*3Q- ;ZgSL؛ O>&9eYs3%#K3M<F6jo*<6>DIڐ[.>l;1ì9𙒑g/_Ɍg+}F ,""g<C`{ *f )_>S2R檍Lis+ӧ{=HEnn..>̚))|$#\y,y L?~<0X5҆3f uVC/;̚))|fX͕G>;uAcccy}6f҆ʆY9ýϔ>#gEEE|x#G:thĈml? 3g{ 19 |3^>^+p#gyF7lٲũ5>S2B)^Zbb"|πLLb!b-D7*)^Zxx#G&M$ϜZs3%|1b sn!꿼r)^ZTTԐ!CZ45ĩ5gϞN_ gpϼ \>.3p ̻53>׀ϼ \>.3p=bY4~L3/)( 2+ը{ 83bV- W3qg> > > > > >|!{)Zd08A0(;'>|Fѣ/++kkkؽZݻw & 6 6N (2DN4|&7,###>>>%%E{z^Jo;%o`"ADgr,deeуΨЏhuu… ;%o`"ADgrΝz}zz^A@@ŋSSS7l؀%o`OǃɋgK g`XCbzEhLn\ي+ԈU5@(-7_~Kq t$Ζ\:q%(BT弢b"ȈU^[?Ç'o=bKE0mMKs}37d>ɦM ]|k3gK8,jp>FV~/U4ōE-qb'l2#12 _[]v][`dtt?,R56ӕ?|ťΪ梱?aM[n8D"'>|o 8*IuKUi[z e4Oz}[ч]ݭi W=:jBՌvBqjF:;nno9Z>}ҥK CKcKcI=;S0qT/n>Bq*WF0(8WrlW[}k'8.4kuiAC},miXdCK:'Hhb]Z@DN4|&7.^mmmj,^0Ż{t?Ë?;Sնzz`NG_$k2 ѡnߎ-dג_$$̟PonZE.%í7uE, Li̔1L0& 6g}t5aL ga_g XAN靯LmnJdMͧfƭJ&[&>|hѢ˵|qtuベC:ǟM{j߿4]liإ>pp`U/e&bZ$>F7Bf{ Ð TnT M{TYj05*sٴܛe_? 1Vќ}g&GH6h>}f4+TY!!==vqn S0zc%/2ʌAJr>B` o3_ͅʽ_~bxP+N[ $+YB0Ͼ~g{;q%-_yl'BCz!8~~=+ީ $ѯXӦ.\6enO@UPX`%d}ikBxz)TzӑtcW2Fp $զٶD!9k{dN(Į~ob4TSYYYXXl℻e-rl}UES^[vpub[jNe'lXvB0! ^xDBb1CWmJ`H[-[1uk$&/ce/1?9  !Sɍ >?> ZZ2cWL42͙Ꚛ_<3HKgI'nGފyl/y.Z8\a?j$mvbdOwj(n\-rZ|`q{cGaAm׮]idgggc cn즪#}Ijr,։)tӋ;ℝl&5Gp@ $sq]x]2-A]ºE-yb*ԡ5}Q[׮]4Tk‚;>&wfO ;yb?{E#{ƍXXxӵ]W}<ڲ-k۴G0W'՞Sw7.N3nIbQx\gwiQaEt]ND]"'>|6k֬Ċ v. UmjO&ru;zj>} 7oތ%7N V^c==d`G`ԙ^ƨFFD&Euߧ >oQl =;_"'>|6sL6{ۨʒhd` c`#pZG ?rБ}.7^C͍hLn\ٴi|iO+8p`~~m۰m x0\tj1hz9"c&c9ܸ󩧞߻:ujHq`G r3qgK,۷obbEVTT,[ K? Y=zt߾}"xT*UDDDJJʰað1m Qd0hLnYhhh``Vmll( E <83">)>)>)>)>)>)>)ǦX3p;>Ócga3Op<= ?dIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/computations.png0000666000000000000000000007673300000000000017554 0ustar00PNG  IHDRSsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>v}4IDATx^y]E6wV{z}ק~6plW[@$*g"S@ cZ) Sd3 BBe Pu{i:U}QG5@ ../Q52fwtA~. @@"\]"_`"bEb&@ *o3%D׻@ jBCϔG5yf@݉;L q Ho~M"k(W[7<ʓ/&:3ϻK"c7@LV[h}_%nV!~%ku}JeTay"o_w;'x^xgzꩵk;_w^v3S~x"^~}TIV15kO?MD:wѯꌰ?>{T{:_@@(1k{Q-<,sV\W6~2#>Z'ʟ5nv"<+SLR6<_)c&bF\v{N0->\{6u;T4c @Hvuo_TK}UI})oDKYk#m^۪S1zVZv{]w"c֝zꟶޚ=/25Z E^iٸOǷ\y긒vts QmZTWy[0BZa-iȺ Ou3]ο Pyy"Ox]|3gw}_+'~ݺuׯ׶v|O|bsW9V};Wu-37UlW˹ UlH'r{?{ o؄{r|Þ|ƍKO"_\[d|g+ F?etƈE2V0BTZa-i]\7 ?7~DVI 1,wѮ3fx)%t|W_WұU}nO~[ڸqo?E}fWO7ct?VyϷYq[6sDoJ!umOHN/Amf {ݾcW 7ܙ\1獼ӿQN MrZ1hamfz_'RgzhѢS9J^HJRmuZ>ÅYx|%C_NSty&+|oNzźS=;+Ndxnsw~ڭ]0i]w@ >6t>Kp 4/CS]աQ#sȟww|>'s*O2O?bV8뮻;H[nfh`Hu4)x=<18?_bԢwrMv~S5yp?MH}v ZYx'u9N|@`ctRb>Ϳq28jz>-˴mg~2OԯZ'ʟ!bwE{'pJ-3W8qn]Rxߤ7rGoz{>K~`sޛZk*3iU]~J$}S3<|A+2٢ @DQ>*%ҝ\T~[ l7G#-WQCӧ7Qy"fꋸ'=.݁71oy?Ϸn|3dr*b΍. h:/BilcQ-2ǻ׶/ Nyam}>v//Vov?\^R1r]-odoywcS:›e7Z6* @l&ӦM4l/Eu\Fria;v~v|={N3Kz_Tje(vl@ Di^EL& ww_xs ϞxKz>픙} Z'ʟ!bǸ@$mx"R>T+G.#?_yֆ+Ϥy_?^uK՛Y*_"f.  @4FmE(] n!kdsO?C<@ P+ ZG@ ĉ}D/p  @DLtLMOȈZ  q198h @ !bh0 @3b @D# @Č@   1#@D9+@ @̈ !Nq 6\[/bZG @ C 1u]'||qw7c @4 L z,_&ה~G6 Gt B3eģLM! <.@ fYY$ Ȼb|"bNtw\ O 0 ZuCa3#b+NjބC3Αdn,M̗7v9b}ւP:l&}}~]Ae͚_k8cO_>#n@ jb]nY\t7qO\{5]w݋/^[vC?L*PX| n=+N?9g_~yW~ϲ[oo_P*f3)t}GR3*c_;Fb>ȩ~-<=W?|aԗWOOG~w|yʓO^|[+ƙH54ɛo~_xM7D7SOA D(,]tev[.q]og%,c9\O~wmK:cܭix2s×އOa__υoO8D[Uyu=<{ N}yݞ9餧9{3{3Do귿[++'rf%KKY?U՟\ⱃڰjyY@a 8bٕMR"fʛIʞui&\27_r=$%у竮3|3gmIs?[?qnr{[ 7rqǎG^r51¿g^t-o_uӂo[/^h}D۵g96>/ [F"2O&|!@u @\LL--y?q3iϛ+2+#q]w믻.'ǝtg]0 vw]|\\sޤ;,*f4ϘotOlw5߶͙?{6;gQ~9qxvKwɗf m^K+Wm]idi|\r.ߟΞ/~'\~=}>e̴wW_%}gG>t))1)|ڪ!@"1gL-W?qi/X>1wO/JHͤ'nFq'#=aѢ[N< vE^~=\>/>y94!1_Ń^vߔm^a|Urԍ2/K-h%[M${bHRի2+3:C9;{׿/}vwdnKzUgu1SnX^zv]=*c1[a@hGTXvl=3? 'Ι`8!T{6WR谑ۿO~rA=kWl7SNo8W\u7t^\})g?y5T6!M̗npnz,W??>30r앏}v:ҋ/:KϿ3/|գoNt񭆍f>4p=ugz-߷ۿ}S?t;5kr!V{em_i'&;4fvS_on e[a@hx!b^xqŊU?7cWw>\/<[|50}։'_s5\}ݽs5xt܏9 P1 H}Wo;-Knίnƽ}+,5g|ޯ~Nʹ-yCb>fޒ/rՏNG30aW6ͽƒ{oժՋ-&s=s^{>kO;N͡~-_g'}z֬Yy@X|)?7;:SO;W)yt ?xb͟gFZ1yC>S=qO9гgqK?c^v?Kyk|iCZC߾ɳ~rx O.L?[?<>9v?8"fJՓ~zuL|57kvPE.u"w\Qi2Bnv>;@O8vR3滯cL!VGn'?ϟt[Z|f"fsȳn>G>7}'#gf1h3Y']x9vZuXE"yFAɹ#7h:K]3w8^T@(G3{У9zųzqǟCDDƴr|ͦݶt}i6~xFJk% ӱ8ǔ|s͝=c9IN8X&+N˶Q?7_oywƇ o=?d$#9/c^"BC (Q"N>: `@\`'\ˮMoƝwO&(Zbv*@ #1k|eϘ1r尅e ڌͣw| 8T@T">h#<aII1u!b y @A̴Φ}kR2${byt" '|2⺎;8Ms "f@ Kd@ `'N8y3gҋ D @3;0@;v @3;0@;v @3;0@j:  :R h @PR!9S&kʜNtҴZJ a}饗m[矷-/a0+a\,!WN~-=xZ(^4ٳ]Uz_!Ie@TUܨJ VHi!c&ZVܡ"5{}>rNR͓װ42fdsfZDv+aiFd3gΤ?z5{ҧ\13 b36yrbl+{o~8ܒw7^6bZNլV\Bv;.6 )`<@ʆm4 ĈBXæ=n$,̕#!b5)U{XrDɧ-?<QE^6Rv 吝D{du*c{x/5ˠ#c&YWɼ*5 jEQ3lX'b\WvsQfyx)C̙"< D6VYo?˭&O;l7^$Ly5f̐flHq,V{]#Esd#Grf^НHↇgȝw=pYrfPc`K3a;hyÆ*%.-_}D7pe N?{|ýs{R]@w'`݌9; /@袊 `0U9vY#)=.-c226XNMNV6x=6c|rny$]#ׯP&tTR=F&V)JuIKʖ%lh`C( e!SM#Kَ<4u gڳܵ9rжN~o?9-3qOH]=+#D0BD&V2f*)[NJ{r .{VcN\]-Hl8\8GClճ:չ㽗2fS%LO24we }OJ}A/,q כcUKn#p*̖KW=1W<ޯo-v K/YBVJm>f^%ARvUG [L8=K]u=`Lwwv6ԗ|ven1=:NΪb;)7c\4u13;aXBU!NqOY F8/5K{|V6qs$'lprK?Չ8[99f%OVf&MM"K$1䀐YMҒegԹ.LϘVSuT 4Rv{ .8YSgWjhbF%J&#BV>]q3lY?i,>)U;Y'c-QKPEϵ3桒C9{KvҍxBs˻V+s6d5v&1Ĭmfm +c&t:#\:<f_\mL+ƕs>P=o1^ARvb΋1*ÚaZqfsFUaF%eWG?5Bsc"6KيY"$l.e9Vm5K 5d<U{@9b,#e3gp!fqMf43cCKf_*BαK0[FA*bE#d[Lb{F);[%'2F挕HjAԆvݔ+ IKTq5oQb eN̎3]5s骠5nƌ3%f޳G.\lt@qظS5:643cE"?[QF 5-;36S` V ?L[l3)/?T'ϾT*.9nc c]Bs3lv"e91K(6 _(/jfqںjشY!e+ZT1sԆImQw۝GOebPr.g3f%X?ʘ][&.1cAr Qz[/t*L@̮db͊Jmb&Upڤޫ/UeeZ`߰;QR}pKvekCܜJ;VͮtY~'1"j >a V99b^Tm8kĽ?8H3,۔M|]ūz`y@ه^Cuɗ mA|T^}dϘ#oY7@NRv n6`VC<ܧr{MqSt @/n:I]Yn6*)C&1aQh8dY|(\uKgV %:W7mU大1ձJ79Ӫv\USna$A;l\"es2{6R.-ld"BȘeʘ[' U+H#hJ G$ ~K;/ճebC18ى)AYv^cwGvl* A̹CnŮl&vo@&ySl9&+[ 3]>98V+'0$6JFW\M!W%Cjlveq&0HdՓ =Agʘ#ؕO1{{%&xC]%MPlK3dI41)&2HPWcbֶjRRvEAaf#e)a3-)qf |̎[cMWWF1ѫ4qHʟ2fևKl7bCM"]$0tFDֶjR1 jA@=:#نA!R\2`,їZBǐY1-1XT*א3 beW[b$1[%l&$eܔ@&lmAUd7RU(?ʘޕaͼ k"sڽRc#tX ĥl$g֢ĈpnvLJͿ0R"u5cVɤlZՅ 9K̙ BUte}uWFPlZ$hcU-2ڮ?bjbqX[$Fyw!e܁(ͯTbVl:?HWT+[*0BLQ{l1t] lL g>kŰfF߼b fm:1uٽ<ؕLWs]ZFiԄVp]xF "`/^Zs͘m?a!÷^ߚ1,"Pokwl&e[rgI6P)iذYzk&1K8!eCv\m4K(6Sk ߕ0cLR,r3B e( !P 1e%! հWv/⇽F16ǔI۱2lhN$|FI2 '%U'լ͏ LR@ yA#aXݟ0gZsMMRvΙ(ֱ2"1P)B30"S.?!)W]XX5yFP7;lz}Vv1E}POlfuN:iPY aiYu730ʘ [:vM1^8uLر9 b${O6. QxI̐%$kn>s RIʘ3l <̻0:-VNJf>K.)IsZU9 V|W91cW6cloggx1Q fhDq,)+FgJx#‰geSL>*䶧ϝ]b6=}ge.6Xy7W=2\ ,˼ܢ1 #/ʘ+ txàIn'1=hm%0 d?b\hB`D v3YhJlɓהਫ,>6veʶ"HvelU&%ү cd mstְLveKp!-)pvZ3yPͶ"Hvesqۀy^@308X;9y ӻ2lü_=o&1g/,d}.lkܜmv3l eZi;R:XW!ekz ekO7ni.ieIȘC6UynsuN,1jțHVjWlN7!l̆\@m, f(lo@edb N !yMՕ}] (>b.H4݃*]4/&3N=;t9F3f c 5NqݯnHؤ.HM`[b]*J`ն̀ԫie̡ve;slbHf^sM!{!C1AqQ#Z@V#d9=bȫ J f5$rZ!fm&*R䒷5` Hm+YzZ9EyUC bMWW345eKiÔEZ3veۄW`4Ԓ3XGt&Ɍ4K 18.%55xhY ֑f3lQ͍7:kl;)Zv#veCG^ΫJDs6[A692khh ek!B#CӨUB^I+c+ۍ+[ 25J43c&EF$0b]TLY_%1b.?+;.(4@nL2HvQuN3\]+2f?tQ9boiUN003`ܲN%R]HI|w`y1(I+c+1R6V >x/ fj0q Q+ey',Z4G)Of^Şe]ٶ/vedW6zU~qЮHT몶; c{weۮȶ<{\֋{wʘwe3|YŤ{lӑ<hd2 NÐtyX1KMOX;G$fHJlHR31GxȸYnZslvHGj)W%W>v{V,+ۙ#<`Rτ*u_p Уff̥M^#1t9G )[@jVYKh@UqljMKN1 !fH)syKQ33fHB "<6/3Z5F]fV ЩdpJlkB@Zrg0\hPYP_~uP8+[ehtfige`ZbVje_L Iٌ!곲! YU.J+cޕH)dtY[W2Vs%VÑI#.17]Ƣ0 U\fLb#vƧ9y)[ۑ2 nծQb+2̠YS͛I`Di0z.]K+cܕͦcG=fd̞+˴l2Tu鮁CdHbt ܗA5nMLMk$fHJP,pa eJٞ# ,iL+&buհYH;5b8N*`\V,+ۓ=`˅2< U]kZ8qɓgΜI/&~K[S9Tڑ)4g;s lpϬS>+5-{&IM Q >U̚lRvۤB`HL+ v pŐ@@fa]5geCֆHu@tCuʘ+5nõk6tkf\h6oj{l{b ; \ڢL 'f[&I* hKP.1YٴwtQuMY2N+ߟU|}Z -c!julH>7>qյ`Zخl-0Be\6&2漻ؕrʅ`^p>1wIFW ћfsD爑'a3hqM׼eSىaî]#6cVˬ6GU>VؕM^rZ@cZ3y+fsޱ?{h7Ѣ\1Wc.&Xh%u)$&6%f3l^%w:D"e[(ewZy$aR, )R#ğcu3YFn/;ALSv)n 9*0)/ O3i_O4m֡ۮlL3) U&R\,&nn*%YnjyleE 9SQA j fHټJՑ$EϞ]Yv~E+[ Ȋ$9n?꒲3^2sj>.D cvunȮL,Yh%0i7 ΣmW1Jt{i9GkGeǿ )a~ 'U bf?]$ʓh5ɸTJB=؅z^QCYQ&GJr VF .* L7WUT%Lu~\*WpUoKItQ5I.6;6\־l=-<6'{v4ޡ ںEOʘ^g3fH:|(s- 41K7geC Kȳu#Ly΂2B5+J⃩Q{꩖ veP=ك9mN mλ3f~6fc_Q>ZX۪0Wƌ][ﴲ+EfjҁkWvWn,@ʖlG^Ho=۲lZ3y˝rsgeCcsSzLUz%A eeGh*gaS(8ЊiA̐«ULgP#ꬖ EY۪IHͨJʮ~)R iM^ dF)ۖ$)ۄxue1㴝fakŴie:6)X79oL h-Πh;`Du&ɌY F-6L bn b6_LgŸKJl"8)!H,\cRvD鞕͵+]ِ W]ί1qkӞagP$%MD웥 rbTa8=MItYKqIم9Grf aa-,<.7.w9b*Hc_qzuˊk#fÓ es)A.`oq%ㄔm&VlqbC!eaO4MFʴ%.%esʆ݀-#vM6%̌p$5l:bȨ fnץRY*4; g ]n&18J#6I.ӡR64.0 eYʮ UZ @+M\]T|_L\*\j֡ːa\NzVL޲&-95aӰ>wh33fC8CbȨ fV7(Tc"v- {Ĭ2-MFuRX}=`1cNeW} `Z񹉫*bU8`1d (NzD̼ sk#oVm&J;̌pd4l7bǨ fH٩P~MPn$fCJ%6$lrC|\5,+`=]ؕ\ތRUleZٮ/ ծlBʆm8{ŜCͮJugeAANXTThޥ lUE*]T:,p]S2Fa> *`Q+'6)1bλrV<"aS+ho{& ]ӈLˑԪh#c]3lÀ*~Z9kMlH٦S-L'RN1(H3D&DX1r<73cv;_!5 0QTbڕͻ[-VƊ$f+<$ ZE;!e3veKdIټK `jUUUt- $l8@ʆm8?Ѵ#嚓1s*pMMr8(|lV Rss)`ŏ!e!0BeUb5od0鍐!'H4\WmшTve14k@j@+ɘX9\LsU<]V9+7šYҢlc 0~] UjbVbXiSw3h hy1IbvqLG$lJ.H\u,$ctur;4"e1g_uBV1V"ش2Y9'6U+L eWZbHp0M!c6 t'X1FaǤSl˭sCʴD5DA f[-)*LbvqhJ#6%{=!W+8L3Dl.5;i]6'Mu HٚBSm)91ˉC#cMqEC"0˘ fn_s'꣩ar.1g^/]͈Y]TN9+DK @]}DYK0b"LI#6%fBBʖH 9Gƌ]م),>A@@¦j lH@E+fiI2/@%nff.Xf9ZJO1z_*Z>eZqˈ?,$f7uT<"a\rmؕ]K̼{YYhp[è5d~I aj]5GR6d `P4!c{ƌY.7rhO4.rffn{BhT@pA fբV3ki3YƩFSBi%6|uq{藆*A8F e`rcUfZy8TTUs@9z[hsߵcUNkveKK!$43cv6Y 3N:WRWL3Y k#V6lcx)[.1^hsd2)W޳ ~@*{p0<\Uպy. 6]rx:bulE!R+mA:49 )pweC¸t h'N,HwZyvU#Zm\)[?ֆP %X}7">LhSYِã7Y.i^ff̆ks&bqnwR vA|I>hM[Eř6\q3DC#Hٌ$Y&Rv0d/Jk\bu"H4'#+ 2 {r3yfձ<`ğy3,Z} jfƬ>[Fv e[e}bh죎S6!!ug e=F3lƙZR$ B)(N 4Nvj|Θtlb}H iig/Q33f+F t][ePR+RĬvΝvZ 5(XŜ<"aVrr>΄\ME.D̑0)d Tʧz@@¦jlC@MͥP]v3fIp&P(RbRvl=BS{jʴj Yr6:svu5#@=j5(1&cp6}|nauXWպ1݅]qg4- Ϫظ)`2}5rKï1)t2Ɯiuka OXvڤZN!ޢphjflڸbhz[WgDr?dSmKJe/_ܰj&1{㠔$l柅a9XrUcޕ]Șql5 W vѦZ e)sؙZ_9mZ\-KxDlr^͆mmAmasêZp Q5>JlWO'WĂqضԶAr]4Ƅ}# fuJO8q3gΤ?zEӥ/#5#xYVIq#Aʖ:F+VLydn|-):;[#EfClxҴCJ61q1ձ pə" <;4iOOYB-I1v7bab) Rt qmXu{Y39e4l./K1IUʶߧVdOjS! by&6u^7^j sV6`S> rB;1G+{qHu\9nLݺxʭ&T#Vۮ쮂lO E}[JIߦߘB"UاWa'f,61aKRKi;RvY>%͌)Z1X#ƊQ|LQ5VK"LYrQ#Zg 0R:$ Vy*OZ@1E!N׊S.M!eCʖXX$lZ'Z)ێq KJYٿX%fj7`yQ_)L,䀘E2fm&@̶gFꝗ& fPqXZJKɈbZLYQ4% 撋U2XY$*lۈf ŪܴZ4LM jאM {6\(g7gToCشa6C_]ff,:nH#m f/lY"Dlbpf3);>2Xa\1FbƮHn,$ M+[11 $l:KՁQ#Z7-P87;Vv6\/2S9Z2bH%&XyIV w3h]-s`ko|F|UKerfRFФ`eA!$3f)M<ڍgn ޹a-[I\2NM yD¦b+Br V~){+m\)éjIL+ޙxEHY.U@)Xآ6P riٽzzsrP4{N5w+M̘m*@lvbJ(},:vS]L{G [Ǐ2NІI."} u&-(8GǮllUiebKbJy)0L Ţi5IUngL?5q_KVb8/,53cvo-MKjpפ1Kܔ$.eCL4۰ZoǏ2li}q]ǘ9F+{o"Z>h5=IL+ۮ >C-EW4kPc"%RO4xZ5k>#nX ff̆HB`_BJFRvlYjh=H6?rnj ANv]U,ϸ&F>wc,[|ŨMWa2P݄53cvb{ ۺFvJrLsg&jHٞQԙ~yUus I̼2m`TKr1i}wDU6ʆ]1aMf2O+Hِ )!v 4C5k^j3,],5r~5ScmeC->*Ѵ 7G5 b6&{CSL~J h6yeIT47itmAƴݤnSV҅7]٣wo܈ٹfVL+c6U9֩edalfbfMv5GrX b6Ή-FH{k1D )Z3 B,+N3f0b>̧M+nX\0+aea HV=T|fú\Sief-lXjkXwF!̘b&{B!4f\?1E_ e`ү2\{I̼2NHBY-Fh >X,SݕOf񜕭 l)`>mZRrU¬M)eNpVB\<^,2-p\҆GmM\/6  EFE NbJW33f[K&-ӤԉdZR6yCHuضhp !$f^R J!u}\-=`ē e75_ ըRr f)e#0b>xUȚz!zswe{3CK #Mɘh`]Llf̋cX>AL7C f TԄH҈fLl&1Kᯍ:Sa$,lm"1X!Pe"fHِ}ϸ\*\VLXja#^cg^ TnLG1D̆:o1(t즜¨eM mf, lF/x1qb]:͘kfib3)s7)4iBGd4C6q(I ޕm12kV6͙kZAc2XHĸN{5¾TfҔ)<|J4+ 7 \?c&ل|h4g3.`W,+@O'N8y3gҋ xe{{̧ u<42 @lAĽBbH,_ZTJkr$oy@|%Dh#3!W%KR)3cdWI )6LMEkZAf wlweʓWG#o]#)u|ɽbT i&(ZD7S\EV/*b.b$ݝ,zA> l\ĕ7Lmm.߀.F!Ϙi+&rg䐲cX.FC lbɹ_ܘdIh57 ũHSlCbm;LfMC`Y *aV&!hv4iΏlb*ʾ.م]j1Ʈm1ifk3dm2$I32f}+CjlsٷҬS ԵL3i#f_!r530rRq/4,fc$fʍyYdQI`TFmZ\UruC16$fHqw6MeZAʮze2 ee1[v1UV[r_5l.ikpfc̘m9<40Ǭ1}=hc63)[N[,!yRy)-`7Z6Vn *aV&ahR6- { hZs_bn֟}̂1ѩ!϶*֊Grjp,)*,0ͬ1CGIOb {S 1xQwQeyrc1Ur7eYu\˞w{77LSbfl猙7k-S22ebb8ٗ.#TSH<+e1!u1R7Cʆͳ< [V+ aV&lm_ۑك$gKHF!Td7tWvV08)RvM3velr2N D`@ץ.F)[Wsf5L+Hڧ\$) ɞ.cv\B@ٍژmK!T6J[ z+c0Z nB8&@̐m)i6#iRu)Rv0G5$1XBvWC ) )*.1[%l JM d_k9+[ B3\Qq){ܺjHuq #`VffY۵!f!v;lr ~6wWv*I3֦ffa?0HbƮlJb>&%o&1K:KK8,fA-` j+6cݒ]2fXuV+f%lB.g3==u ieÛ"ձKeS2rMR Q?0)R}D>%#wTk4d#q,*DUrPʶRK2veYpM+H, 1Xؕe^g|e}i=gVbs`VN6zW6zj63c61_̾ @̐+Y{xZ&h0-)}I8` j.e'͐۳+[0)Jb*aV&&Hمk<+0ǬNC SXM0m)4V7c8n:CsXvw&N3%ZZ6e,dlTY"•RysRΛBg̣s$"h21;8&Rcx6"4\,!W e2veUR:ѕV¬MH<>FJ|2&,Mn"Qˇ1ss3NXOшq~X#]V 1GfwCE8=#t)ˇf:ZcĴҸXrUb\ Y0lbWe0mmɊ!䪄Y IBt=LgmV!t0/,fZ :6XČF\6?6^b3)sJ>iBCY2s~LleG#[Br!g$J$%KԥlόR6W\&e._\/f%l6M&Upڤޫ..fRI٭n5Ϙ#Y1q#]7y&RKlyL<Ũl\2b5Tfl-1R6-TFfCK9BԀfmm=RĐC-ШqƬfZm@2fyhNJ&sIϚ1И1ح9+ 'lICK4A9R/cc4+*AʮΘHٝtÛG!eO+vjšʶee!W%JzWej>:m\M3"Sd\Oz NkJˈ"U Pcžgib13sE8mklZ2`l"8 MIr+.bD9Lb]VPOe\fC%J̅YH.33fHq4Y.IeܴiE!eG5OI9`A& =i]1&b,ABml[yω0՛1Nۊ` DL%:6G bx-m_o&1Knv&8CՖVMjNb\ߕqa#GƋ 91CʖMaHNӸDU- )[;4aVS:H@֓=(!]#Q͞խ'*0!LbPV5J暳+5,\Pmq2lrȌt#W\Yf%l m/q ZM0~O5(+f֐N~ ý>0fZMse}jZg HU 7:-]1ptsy39v>1}TLcKڿ5/; fE@Mh f-7#<'WIRvzy)Y$SW׽z7t '#4/kS»݄zt0s]b]ær)ƍC{Rr2&,A'ꁱqe efSܦ =geRV.RRU%BA>̆%qfiH0ُǒz$y1@zbYZn(GΫͳ{QY߄"2wQdulu-?&COiB\QK̘5Rvw!I-F||ڵj-&lebvQ %ng|&߿q7[bOUTGYmIæb6 Čf%V*1b.]}Vv3yÆLl\- Q[C3+s]|xfMUr*G][by32sSYr d>S?r]Vy1W+tl&YiY+Jkgew1BU6=#de,׍ws㚌PJNGK"cϘ9_l`T!XƜw!.~ZFzƃVKvٕݱh>.Y1f QLAʶDTh $F2+OX=S* ;_B7|Ō s$I*4 6 s1K?wWnB; T2sq4aWj-1$l& 1оMmsg#gRȟ Bο&w6cաaٳUB M[pU9)jUX+J$J){HԲ \߽R- #Vƌ] \oy&6u^vΆ^\7L1.lc0Rv q1+[]TہuQbؑH/%OfZJ VT+[YRVLXX\kWvn$))B`&bƮ!+&Qhɐ%cֶU@h1bnᰡ@ T@>@ @ Z$3I@xhT١*!ڒ$lRf%lU*M*P@&y@nVM @U U*ͨb b!XH،j5@ bD+9<-ά Ĭ]XP )*!J(.0X HSTtT{F`9MOL)Jh0X HSTtT{F`TĜʐO mCy i mCy i $GsL9Sh[2Ƕ(lh#q4cLq„c4^TJļpڤ wPEȝA͑k6J0L؇R" 9HHw (* x (q~5 X ց{()?w0!0;@T';¨cɨu:D 9‘1G8(&.aBTSoK@j(4 qƀgg&TģS@x#tΔ޶< R_L_PIVm~D̙F} c-̣XGf/LNJR"G E  `D&L E  `D&L E  `D&L E  `D&L E  `D&L E  `D]\@ @-LviIDATx^ lUy;2qIn_M4D7EsFPDQ(PP8 {<)9 =z޽ګjs6V5\ZUwgyfQjŗd2뮻nifF`GcMoz߾x%Y2@F #0"}/{\d5}Yg)KF #dR^Z~W_}id@م}w]kF #d#SNHLwj-/,@F #X@tex%#d2MxQGZd2@F`!pt_*O#/~ < 9_#KF #d [;,O#tf5(}#P_>|ڳd2@FȾ/ۺ4b~xjvea>kn/??$Wf2JƊ[؊mUy? >5gN;t7s=wu~mRn;35{eF #,@{^a+5\i$N=.w}7 [n;N?/첵^{}f2@1 ׮?#XzmHogDLxe- T(ȿۿۻ< 1_<$*n@F #"_a+5VMtqHSע؟T:"b~qOEqAol{}G-WO7Qmm~y|Y=#LW 7y-lŶ?P'ډkx؈Iz BF`#P_:rUWx㍎u|>Kbu_<{C=0,D/U־gϫjKMuf}Y=kzm~(#LM WI#[؊mCS#vhnFl!~?M6@𷘱.+UVݹOYzoŊ^ڇw|)3=~j}\]~^Wۅ5Sݦ*:vVfޭjaE㶵,ֳ2d2 &[VfU$ njHCr[oWz @ OEk[/;77ҥO?>:}7?#/yK~zѓR\rqm,W~G?`B}ꋯ|brn~}@sQJO4Nd2z wa+-wڡ)m-6b'l {6B=r+/q>0HUzUq=U}ʫ_CյWJ,]Yo'd7 777ܡZZhzK#2@F "]zKv᧫C{w;4-4\l$veV[]s5$>{{p8Px≧7 5Ѱ6{o԰nSԨ:ۮn8HX١l\ߴZ#55ekSh9=Y-O=$d`xWZ貫}ebuݩW\YYrszbmO˫Zm'm[-XYKF'd2@50W'-. 6vEۡbgZ7[OOoWz @ iWW6ls'B{.|e+ /h:|BSٮ¬ *^zS+VTwenf-aL7jY4Wg2=y1-.FnJvvn45=lۈIhgFo~wwg@LWCr@F #@}{=fi؊mH/[v:4r)I]w6bCVLtjnvg2b[#UFODMv>#55e.T:@F #p"2 b[չ͒d"9od2@Fxp-lŶnFXSGm̒d_ |eW\S@F #Xkmdҗď[?%# @˄Xf)d2@F`*~(ɒdU|&@F #QxLTI@F #0Kٌ@F #0h3<0_l,#l _/ᅯWgd2@ "2TOdd&?|T&$w٪e2_/3 ߚ%#d2''w? #ˌi[_6P,/xwc;|wݪϕKjR6N_,|$|?#d# ~,KF #0@g?fmܮ|Z︆lŶƀ6C_Я~m7aOn9]K.uI}Fl*7s2@Ft7jWb} .n믿.;ꨣ.]ڶ~d=禛nb[Cm_n'Wmk꥟j^^M2kXϻԱ2[E#6[/PF #j,oo{뮻nnn;Yb eF #0}{|~c&6>ѻ{SߺFn[M_/l_O\'?2kXϻԩ܈J_@F #(]/wo$l^8ۯ+1}v #(F$oG e]w}G`_WzXf \VE>w˿G?M\nzu%*t١@F #hp(;kpBo3Ϥ||I'1̥m.g2| <*zꩧu ؊m|Egn?n| fd״lTd2 F9e}Q1? }m߽45??dIO}8/:V b%|NWZUVf.3o|æ} 7C>[E#6[/PF #$Kbu^<{C=bTvw{晓?W~;^3 M?\^ވvf&&'޸/Pp\sM[YߥSoSƿԺ@}Fl*7e2@Ft_W(]tOEjġ;?=YXk_nw}>om_g93/{g?}oV޴+?ȊN?*}ޭW޼3+hB+,EF`#WMwo2p>(ˋuUz\W/_3vKMRJ-ݗ~v(#dZ#kQo첧/>xcK>:z"nzk6kٮBgnsJ {΋_9ɰ}4F/}).3_w]_|{Gmo+a+1䛯}_j*Iߗ@F #(i ?ܻoB/E1zK%·/{ˊ۾u] y,U]y5Y/*nT|W/q'= Tm9/zk>V,eh{LA]]~VyrM8k}Zk-#ßx_.*pd2# X_ 'xja}/|!OZܚIr ~^}@Ӷ|n`4ڿYk տY륕MTgJ'?fw/벶`Nj}j;ަcϗk9\1[cWVG*V>[E#65T+ne2D@}EKa6d<ԓx1viK,Gy/x?WgV}g]TBް TjSaz#5+ogMySk2 V6i[afѵpT):\/?p/r>mb%Ƀ֣eMֹc_o5ghĦs=_^i;##dlOe/wq9眳V[o^c5/o-W|u;EmxŖ8~-7?|)8/ӧ 3]Z ng?֜0ffh~c#0 |;;G2'F愿p*c~;]wqm&s[f2i;[a ˋ_wq]vV5lͿ{_Z 5V_]?}je/zj/|QTjԬY8 3BeNGe>LvھJb[?*=~Qlr?nm_VшM BCd_MZo;_]u8;=ݍr_#  E/zQ~F #0xO6L`۷XVlkYx[g l=ǿ;?>[7YveݷVjn[E#65 by: -K378c1n# BY2)7ߜmb[#ow~}m?RFn|cwm;Yf @MU4bSV/̣c]y=dZ" (KF #0>]eؗpzj| {+ovݚ,[-VшM%Ḷc]@F`" b͒LGp烾SV|#~Ǐ=z~eٕQM`c1nd2ËK,D(a:Ki}4ވF^։m{iĦm=KK?賌C+.t>cκt=tp 꿭ꖻtkG}G._~9ʿC+s`O|z |U\sg&%IӅ^xFlŹ;_x˖} nk6=Ws&G]O/ԡ/~||yozJ_g@I" %# n#>CVXq '|g1oj&iԟqʩ,M?bŗ{A;v[ٕG2w~gz5_љ]Hr\s>~5lٲjY▛n.\ӟ$+븐rkO?}{SjTk/;{ڷ.ۯw[?7p-śś>M?-?8Mo8m{WY9#P$?dj!~~?O/;?9HqtICf潟vgg?&#%+yk/XkqO?0XcE۷掿;wtOv> +c=?ރY{߻~;wJ#>V|d}=jTk/>洏ȓN^<5|]O='.AޱϢwWY9#P<9Qe!KF #bb!_}Bxk?Zgl,cOx{q\wmMk={Wrϒ%} w5oos{#yhGn}Vk/87r3O\t7v6?lG_{EhoUwM_;y@<?w?s}??>0φկN9SO= `_(#bkY~qgw|ƹ:vε8gW@~5j}׹7G]g'ls߭O5Ce]=g| '|ۿ߶]vky_g@I"[LYƁC=φXPyO:oOC8ԕrO:,?SO8v?v<@XKе*cOql}\s?=c? wc:^w]_3(+|~{ }{xcq[/}o':]?9jOG[zzu}7!#޶!/hEkoUN1YlH-d#_4`;p/*'x 7b|+ CQG9Sr-GN9m8؋<`d^gr}}O^\_#?oߚw|-}a{1ۣ|xXP|!}=8Oz'3Xqi`5}^c(7UT]Wd<[4~qsC>x5^S;0cO'׌G`L KiGqnO>s{q'?K>;w>`,?=#>䭝70F١wgn}ķlq7[g{$|nƍ71G ~};y-<$G}_J>cwպu\C ޅolԆhG뮻w> ^ T=39so{s~߮ e@oJ)#0Ctͻ~w/Fu9/S>`t;H3Eo1ps<)v~əqGAg䐳hbAoupX<@tUg x՟/߽l}۶:|/痿s?ySl~?}nW 7tӻo[[lɧ?я}|:hxp0Gc_%+/^o|j&(]sOV{w(,L7|LqO<?.>CױgP";0f#@SF\RWeڝwyW'tlOoN{a0 K.qS`mfi==:S~zy,}?~法~s~ssվ/uޙWlsߛoy˃-_:b-[mu{z=w9-_qEu٧;W~޶z/}Ko~myV$%9ٍE`{}ozEm=w# ;Ur7kǭ_6_?_; [m[מ;yo>y;o^~]˕'.;f-g,:ۋ.9(W;m_>Kŭ,oη'˾nl~ҷKout3Do*m_-o_3Y\ۿݿ:`.n fyӫV{[;ŏޛO<3IȠ8.׿<@ng@y"[s=LSFgw[}{.uo:pWE͢Ïn)lя~}`F0Tlɖ|f+?/0&CFwk:}ط+~-/O\3{a~ `'sQU;6?ȕovmo_}fonMȏ;3;n[ {G вKvSY*wo 01{}c~fV}$EY|Gu9\zŌ#YM78MǛdߡ4dhKwG?mu=]z[m+;ߟ AEu9bE3Fu^~姝vo!$x?;Ca0Z5n+vz>/7Ș#2ݱ_]avVŝ|l Mw8/Sg&qxfO|Y|o~;w\Zy7ی Tr_?øDЇH/Yb{MT lV.U_r.;pjݾko8;ZKv�-^{ '{,xoO:??\נ`?.? Td+Ej2A\: @*#LWrסo]+M房D2'⤓NHba oQ8S+W t cf=g/u+zףcl Qx Tr_=ׄsMrꩪCa^s_phTWgrF`D aNy3vj=}9(mDf3 3& >-6bϽp0O+cp;e2#@_{Ï7|W=skš!nܱ#f[&븊镟:cUîQe!?tō],McLYe˖~84҆Zښ *+s"CuM;j_70ރX3_K_WrV.[愿<8;hӟ1wpciF` "0wE߽ާ#W=zGz>Ҳ&7?_^{#ڼG-;_,œ=wߝj*;髦#y@F #0o[x_?rݏſoܛ~_;v8Ňv=oez9oQ/ַw޿Kq>/_K/c6m੧/Xf=}T@oë\>%v[nd2E`KB~ֻ=qcUwֵsg_wW\BknìԊ0y»?%U9QˬGY2z f@=>KF #dF5W_}˃\p[~;/o?oӖ3gO[YX/>& hċ\XU[7'~r_ Mw-ZAzAO\5bEoMU+_*WߞvZ9wkǓpw <!#dJ/suWu+ߒoҽ^:@F #K掿W\Eoqѹ./_AT)%\.=b}`*^ȱr#k+۳RCqbޏQTzŖn*T?7]&C]mKr"@F #e^i<ÿO^ Aﷅ"Wжy`7b[_]?*ni@;^.j,Xϻ: :PPvodC.WNϏDG wO_v>#Ls掿_|:߅~ rg=HֳZw]uę;o #w avgنߓN:)YH8rAe*0q5L|;=+;_:Sp2tF`_⮛o~yʭm/S^NY}>j?gLߦ!l;_7Sp2tF`2{[?-gӞVi=W/V mں߼|%NM<@F #0H6ӏcX<_!I)8y@F`:#{ =)Id3NQ cJ)8y@F`:#kʊ(z8Su;'1!#LgfdFbtfQe2)@oiQd2%pLvo;y@F`E 񷄄]6 ?gd2A#3w'3cF 7w.#"&g>F`wk3@~o~֕U8^cXfl,U:y衇'c&<>,ǀ ZM?8}aTq2#0U +6_l ?[n{ kX?>2E`?}~BߍY3#PLVwW:) /}_Zl_Q+@F`#l>|)|'l䜑ݛnkAR|N_A~ ]|s7򶷽m,TDl>ۣazl*3@[)=֌g߰Bs_w(C,$NAd*'r~#Eߥ!x c/dOZ#0 ]dK)U4?ķ?\gu6hgd&<|8-I4?c) 'y.MMpNsD]< viCCߺoOSMC/K o[DD2k  I!w:Y2Ο[+l/YWu`8cxBJA(r6KNf:G3k?|ҹݝ.*xR8|ʭ2.& M pmy?@F`#s<2tH=?3M{[ޅ;TLH 9vM똢N?#>~E[Ow, 'E坭V,U:v&7)#0h%"j߹cf'NN_2SIv, GW.]c+{xt=n\s+oOY-ߩ<@5DXʏk.Ň-Wnۮ {o-7/t6:;N'+dG`';o'uOgPuf {E dQհ~#NoBZF`j#wwu@ŋCYBeڋ U܆U [H 76޸juh]7oޔAjm|E`EK xmRkV" *VO]:$Gz6NWC;Mwj',#0':${PZ qF-QHh!6/ `63L*YaX -,La_;-ᕔLx2a;vea-ՊNΛƯs(\Pyk׊kY'./nvi";+6pߐ]˼;蓇(oM,>%x{*f4'o5B08^If#y-*&nEIo"Ga&=3I@"0zm6j~hފJ[SpE̘$>+U"7)):ko}[M]H8BIL=}v^ V3F`v,7?$>]i89VU6 }[4 AFm[empm6_uܽFVܿR %Kb ]-!rL\e2#KIw9m zܢ:ڲd4? 38~s@=n~xc) *\ Fj{`[~}j%L;;\grSŁu𷄿٥4?$N1!e6u,Ӫ2lW,y߅FSs4?L-e=Z^Wmojy_׼ղ뮵Z/}K_W-/~Ϫm''TÚj!M%K\h;-u{7V>?_ꦛnZvu=؃o7w[vmǘB/~lep 5Dfܤlt%w;'DǍɒd/_qڋnk+m;LXceylmtxql3ew^TAoJ jRo[R>ϭ:7P[o=X5\lFK, a}Cl/E9|g}q//UgGG[vI7?߱;ʽ,N~s9QYjAW-oyh ܔw%ڭ 哟{s$wՂWAS/)xK=3X&)eGբ?Nڤ\6{2}@m-WlZ=|u{;Ge)y9^b;:rhIK^QP//Qj)+jQu|G?Q} X0 g :CÈq[B̈a߸Zx;81͞-Z4{o/p7w6\Qe-][P8]w(,hw8C9H1$)|,tpθ~cB?}5eGANV~tC[4?#8R@%:˨n59@ }[Zn1T-G}'x^-.[o (π01m" 0{w1"R4E X-!ФUի<]G[/"a~ӱΊoE3 .2F`Aoqpz;FLr@M P~ӟyjcv_`% ~x(r/_j9s`#]<xyIPhiv 4nj <䬓Mh ϮaP1W\j  ]m:)9Q=XG&EZfI|_l9/9GU^ЉF9q ӞNz/cZpL=sٜFh*w8^#yטwM-6_ XiV2 BNY'@N3ۮf A6- bp0q3NlK6]5nSB/a! (;F5>泐tÝK+@Mt,ag_~wnvc*P@q5f:0E\g\3^O^r,י(TQgB5WMī*l`Ɯmmka* =  $^|J0_&EխmnO)ĮNKIam\sە-- RW.]c+{oKޥ/U00Zv+6ߡo 4?٘WIv5FeAFP yvpd3\P7PSfܢC@k\ǮZaMnû#ol>_Briе.ЃQ4c d;D`_wJwU8y!-g9lɒmDCVlN#i~HYpk:a૔+ dÅz)x|f/8b#WPskq}+R',MAg&/{-2 w ؝:HAv>`&3SoV(.5{[R h==V]\[L{vk45qV.e:UW]>V-}}aR٭؜FR qR'&Zt!-> JxV\w#TU+6X/*o[٠&iex'gW虭UڬUX-t{{nj*R!ƧfaU]]xtkJIs٩>#W\?\-~3Hϓ;i~Q&zMK΅v% b<7//jq(ff@[;E4jNƎq hY(tI5B^9=.F-GZ" cx0)r/BYMesYa؄s-m']˗K 0;sxlk@\fT^YWڻ3oEwk[T͙hLfc;VoPRo,Z3Ǩ#/"j ߭؜F;}m6E֪WKhe^Ha})IjfC"[f;1@Mwo0&B, U-I82i5 _'.5H[Fle%j^`n#$bHr7 na (GzE c<ʃUE/eߥP&PTs%"ޭp݊>[Pskzm(\tڴ6ookgoo uo;o`QY?$xK?j!B?Sߒ_ғn~ Nզ/o)-fU0F Fvzl z6/;F[ /+ͰF=P_h5uh$/p6;ƴ]Oo_z"'$ءGtI|^-~wHoߟD,3?{ٕ>Ц#'8 _4zN`|6\00,PK.v3;ZۂNcB.3^©#sZfceon]N?l~8lk씭R@šoEop8Uv^.3=2D) ,uR^Me!Ş' &p7[9$ Kxgu6 `h1sr/l* kʄJOj(Pi\)=sAPtWyˤ`XL8VKMB?+z:8-[X `yD,[Zs%xݚu[x3)DXSIWWu,lj%.͆dx5ל:4BS>`OY-[vcJ+x Kt`Q38 C-)K107N#gҀ{tVU&5M@oYV=HFQKnp]k(arSۘ'^M631g8dZ:ćaW4l>łh"]KI7?$N f?3eʐ/| c=Xy{IJ;/0N7@|(L X7pǖ1h096[TlYf*^p~Y#;O>A,k fG`(,ٜ\dm^'"/h=wY{*9Mvǥa=ӈ:/jcBfA&(S8j:M=Vm_Tه@y"m ;wU'>UWa)!a? :e/ڰ̂&8]VkM4&`@^0ؑpF#=W%҂"15/ `{XxZ&1[$X0znBGU%,% y-pK-8N쥳60=CI-vdO2 0 +[V~u+*tӵrRoo\Eb_D~Yw[f+ 8JxOx45TK }u bЄJq3AIimмf!gy2*Z&m"d*gS<#Znu,P~+Sk~V-_ 0:.-/r/rjW&53aQ@rvH[)]/3oo8qBb!.Pש8j4rS 4`AU5.)^8']M]x(sk ;TA/ xϲN|lV,fD Ovle:0wӪ_9C3PIhS‘g)0+$r\f΅ pBL#&G)U4ꈠ9mGDlC!K2@Ӧ|ρ_MHW+ca:pL  .dLƍ2G WMC9  @Zjcb 4 xSJ 멩@SWP Wl|s/v#֜xqj`-en Ie7@(ҳӂ@ 6F%ۚl c@ϭfe GhACޢZ6pn छXPf2Ⱦe>oʆ׀r MbEWV }-tJUF \>S!?Wص:K#3T[5۪(˂\\+;FtR+5C89xv ,>);0wL[=ADe aL L_ + ?Y∈/=q@&vc&]c8[I.^T}{oeGeFzU'&v; '(a?HQ H"I.on;x.z}1SusH㖍1=M%i~(- UV.z$+b0` ё+ ( ꈥ8U]8n]\` ]B7eC*٪Rt/XCKRսӀQQFMKN\ )5if|06jjn%:e.dXӽOh3&c+K6!zm 8"Ѐ)(fXƈG&#Ӛ]q]k,0\TW;3;TW.]c+[g[ˏ\Z}~are3eۦU$=ןYmԌ5ُt@3YJhuh҂ +3S >Ћ4 Q0S?D@FdYڧ@c<k1m @*AʔcbyWEnC$i1 ѢBQRY=uYPr~ Bd`Qnn36S2/q^~kNk#1>6x͚s&V!gteBm=~u\si|.x²*O 6`n^jta2w胹fU+K1Z W/~ r Hr6 e:Xʻk$0z^%`Jĩ8630PGTƅ@n] &\h= sC@b,,H+ fR)6w\#ٙl؀;B5+X[0K&{ {HR4+[榥u_CޤKI𷋼t9rHW+V^6m}R eж3>ߑ\3жHcVl|x,=S{+]7C]_:wgB7tp|1o}]cexymŅ5u 0qH;Wڜ cT5gKu*o5i]ӰVm#h}'{ߙ30ͯ2+b!F1p5;sm~j]4UiZl^ܢ)ڵTeݢ, w[B;ĴxPvYΫ @Pi &1 (R fuZ]XEX%_=@:@gjȓ(: QpLyIռ ^ZYiV0?PViH04멠AJBb2 rCMF:NltNFa\p3--{E.`lxNC120gh VNAxBAvnOeߺ4kUԭp0ekUjE&Tv:m*f9 жu[}^A2FZtP5n3Ԗ *cGM?NUѮݟib3L P Ȼe^Jm 5&sV\ z'<&\G W0/%fP ^aGd!e4u3/aaE_y|)t@z 1eb 9p 9;HKkKu ,‘p6^(J;՞A{:gc׈ %ocøf0,Y{ } qox+Qs"8'_`C:oU25}Uҋ; ߙuQQ}Ȃ)"*ȿ PoʶMZѶI7\U(ok)@ۦ<M UH L- רQkFX1UU~^fnTAݡ44[CE:懦tUEmTW~2$,K3_}l15!M\i9 :J窰i ]exɆJ4^ױnXc5`"Da_gZ(UX\] YVSVj-8 ,0H%gfiּ'F/gau\T.c']wM&]B*ó;ͻB<'Ɲ#FIXh61Q1bCί":ء.s^:;uݰ&pQR;_D QUQM΋jeW-jn Z)mPm9ZCgM y؝g_%DbjvUTtqwеixk&P@V}^QAPu &\6>-|JMM-j.3UC-Jq}: u4[FCSfm{PW#o[JhQCȱh-D2;o$Y]m:V/~Z?[v\ho+'+[+lY͜yAl>gG}D%P}Nr^LJ^DHE *4ީ kiY1/Eh;Z$i&cN1N.mdW*vGfc0s0}`[îًʨ}ћa Rs˅S ;>Ac7J߅bc & OPG(laD*fCtl dsG`3hltCc*{\YLVt4t/;~_G 6U: 'mXAg38unwmUWHg(בCǪ\ qţRsTNqS">㵱 @Zz2ӏ&I3;+~\ȸ<˶euv缿a4?]ZuX`>X ʔl4HLZ`fEyGX&hޒP[9`8PR p9>-8'^ _d$bS֟!A$պJ;oHvBh21Eϱ0Me@4Wd1yY=#ۊd@/Nkc̏FSNfaea1~^p$sqʸv lX &ޡc/ 0 }zjC$HۀwV{,vhm]#*lw ]Kq* `&P,-@]$sX9\fVSwTaq: 8ז ؙ(V7f4Y9P[0a') fw ;.yD [ epA, =^n9:":|<)5)3¨GnDil%ۃCiRnsBE6uuwN. s` -v7NfRWtO:g`YC;eFy tpO(OAl$;Y[@ƹsDc;hAKM-4F `ja)XPfBs fĀX_)fSMlL8ì T;HP/RK3EPeWUv$F# |h/Ȩ%232'_) ND/j00vV8jn "̅+(Kˆ]Ǭe8v9͙OlfNg-.^N[`1Ww9VQcr]sͤyKpǃ#e^8-Sp8o;Ǧ~`&0;\(m/c8w1eq=o:3PT7A!;bC1&BZQv|ލp|ӗ[b60thh(赊aS餠kR"Z3`Bd]Y-a g 1QC@V)Ԥ)*P[م<@V*;M1c-@[ ":q1a_aUU6;af5Rst,24͊#(< `+p λsfU']l$H㉨9M.sr)8yFV'LʀDcg_G>cn ea4<1 BdWL&,ʠzm5$zE[Q`;.1@#hj/b)Ws&sGi&,Y],M/],ak醛k2 YhvX?UlTQ-Q8miAg sk`$x9YPHhPq{Ecy6exd<8́2eHgAo[qڋ:`[QkL7ǫQ@_U/'<Eh{\ٜj؂hZ0Q64+)ÈzgQ yi"&HP|QkNUMbȫ#bGZE:A"~{!EނAE=jBA,A_u`_0 y#B;Kə>:OGWgoHlL, {G/‚B'*(5mP8qA~z¤g~mVy_Ě>ɼ|~K3.ߢ͡rs;Ԥgv,o uk[ʚroOYJ]1++3\>XN7gŮtcwGR;"h:<<\1 U*EYRT^^-iSEu[܆jaf#X1AlEf~`#ӂbeQ%L A-VeWњ:*l(t&b.h-R^!n,\ g:$\)`!ִPlMiY!1vt 3hZt$,&Auj:׀Ԩɰ9FBoVQ#]Cuy@3a {?'?KKaX?i kk `nx)R?ƀ"ZV!zI{BaմY9lqHs !&.Ea~0Vco$lb6 =!þq,8*Ӳ,:M^a"BDz}cM r-1SǽSE^ڰ|p`} hAFܵDials:dCSKnp/w,%1?ˮ\KWn3j^^:[K]%߮I_V憿39}댿`m &֠%knwe9lI-^KONF`Huʋ‡ρ8Cs.t_`bk0MV DSyCʙ@}Tӧ)!^VPvUoCTՀQB%{:s[IHPXe ntOT٬Q ʫ9ؑ .,+ʅ֮Hjx5X>lNj[OT]ֳ)v ECp\`NK8*P=X9jqt_9o-C5LQ%>Cu]4^t"vq(&֬DboN(.%^b=:j~eaVS0`Z.V@KI$BĺBy,aZ0u oE_[9 4KMl Drp@$ A,cpZ5ÑRM y1D w)|xY-8ve` kc:#JÎӄ}jp P"{oco$\ނx`݂#("/agcpgsU8YtR=b)@Hdю BC!tAعe of~X\fC-^\/!Li^p*VgGmAUm/G2w#+>_%֓ &)9Ζ A Ted C p)g| ,4`,JmͰkQp ?ee^$UI5pkY SL`h^tGJ0xq0t-Bq7Y!kw{mM Hr-GWȻ7u`}67Zk&cQXc1ݩ&!uӎ;x y8L;Go%!s\T<[+L!0 e;O:Oۅon aâUb(KQ3'խ3+w?UuwqQA Oįivr#yi~gۚ~j'pj29[WZNo$V-Hmm\=HӶHoyLs@9Ql^r釟:w- vSȽyP_>l(F5WVT;= d·i6$UhhmX< "K75U8`,`GpP!To]`Wٵ~ÈIo2qX;4rhH.KNU8*{VrVaՍi N:낉)NMWfp+\`tN; ٴ-mVݸ.lۺm76@{V4?[_9}&@9I)`4ϭ00r"/( F (cn +a0:Lq|7P`O_:B`k)0$QG &-EcQ5=wP-@]u*:@+``Y 74Zb5FKv:`{,oI*>oaۙ (duӤ^6T(VDۍkx-]an9O<꣍@p4? [1~ntCQ8T $=`Ǻ.x]Bfi؈muʲ 8R 7o1WL9Fь_L $+JBWt,;W:c Pn`5&1 zEO9XE[dw ,>WJLC\\izsFb: C1##$xMUp8:Kؑn;ίg+%)%7 4ɌMFpq0B"9^|~pf+VŒw{PD+\-AqM[Pt5̌' psFb{M[Pz%CCL|6Z@p𷯠d}qNX&GIa<6x~r/E 7QUƪ|49EY:\^R07J#:Zkj'PB tfʽae!00㪳Fv5N*Zzkzc[ Xiˆ^ tjàeig([_kKuP]ٜqX\|;v5֭K"9%tkP8^ܺpd2yY XNf74BaθZ)Fߞ l~h3wnē[g"=}9Yn8$iq>’Tii`7 h01z)P ְSiuہq00Fc.@47/6hBׁ12uX/y2G!vldV pqҊH[F‹\te1jp}:]tТB8σf Gz@x2x8N@ 5@ލe`lW#F.o0Ql#,rbI7?xaVR&PNh%<d~/A736 AupAS @? À,tIs>%fMVq-a, *hLv,Z@Vs0Dk(*:eRXJ1q U@F2+̵Ttő'X83退1i,<9k­#B>c[eH0 _$bR < 5eǮ5!, \3sAh͛.}-`+L{Bǒ?%.OMMs8(.ӗ앦0?iV)a{FMCͽw-S~yܯǣjRB#gf7CEڤ_%FS m YWOGRS5Z)Q$F>/FvXoLtl/TVߛnj-m:LoUu$^k }T@|us#r,``-%,(0SEkC.M;x~9<)lHLϣYzD5OZa`NT.|D_Nl&oSu2drP3h6ez|J@l=oO_нU*'v,etجg,KF`#s~ٲe~]`nY}]1Z-]7 ]w67?j=l'=]tEҒxN/qK\sP; (zP g܀ Nb0?@]-|zI)uءoQ';{O7N3P85:MlY:# Hg(5?Xw9fMI772aq|:=fW81`gI`Zo 4a_nL$G%m6%Mvnu&]=cI5[.arxi[a7"Qm)TAl T5Z,rժU: I)2(JG_Qh_啽+50F2H ;ߊQ28MGR`]9MS\kzpQ/TVc1}Y!\ }<(q*5Ɂpb@z(|#=Q[amU]83$4 /\ B⢢CܼY2t\~\u> ԃbt7ң:ߤHl^bJ6__u9~&]vn;_a?鮲#Ϻ^KOu-bOɴ>F[m8c@I}k9U7yn~-NH1:zÏKec[ЕnƬEUm,CVU+uˢVV+ s2قj:7§Ś ]T)Od"sa oѷVg6 J*.ݣA;LLgv/Y._ᣀ ͛vCsK/!*ȷZqz `hc@`t_[[ /Yƕ^npPZKXy}.-p5tjr)+VH++f^~I`5:01H~GLu)qR\YM5EqWh[Qd0*s+'̉|ƻ4Ý 5 hl)?a*ȑgOX-|-"8Jk4L⯉ɨFe . m MwBP{,i.][ Z8]:#FgߛS ;6+Mg̯ d9_'HƆEadHFCO>F6ϩ( aX=S!rCigl%5Vݿg1@.|ÙmM\9~>KW # >CIoѮ{t6񷏯nUKXhzggK/]JE5`wɚﮗ%BIeYx+v=1P¡o GD2n!;,k@>t>d5cꕚZlG7 ,>Gnb=ʥ ͆X)T4DV6e[ È ;rZ0h`0D:*aϵce,SSLM/:4X<;;‹ Sc2c[ OLFgM>20[ g{L"$ ψ:Nb..B3 #jPhuL!,.mʯF)vU,֚ؕT>woo:ZZ-UK3Fߪ$|u-Bp']ϝ)PȡXXno5;@$ 5J̣+blM}Ef4U%kV6Op8+R!.3b#ptKH^g CvuRprDyc5?8*6:u\p,,E!ItjrPf]豰4] "nE“mncO#u­h ,-3X~Ma2Tv|umbzy¤~ұיn~!򪭱_DmQ-_{/3TqK}[g7\d&QIk~K7~;,a[ gJ"1p ^ Dcp%CXF tA(ävuPTIPE:-p7YucȚ0b1 6bP]o( 1tሿ5k`z n-BUĕDZ::kMʉ<&cX8O6>БLg4I33n ʻMfnk =?eyt!>W)г:1E0RXc;(wT]`iFEww;C|(!vkޫa`q+77wO {p}6=W_%` u9[KD`l2d(ueW"UZ-]7 ]7m)W1e"p72_6\3tM4NȖzj&-L:߱,"N.9eϧ m^tXtS]7lFJ:(#Yg#x* {9Axb}|ԮjʮʓӦ:k0bibY6@1osЮۚKԱkMl:UقV JCv&g!< :Q{>Mf3NX43DX&H\S ?%S+V$vg_jt^=2?U;y  I0"O)fWp>&>X+r8.lH:R4U5w9d,pwqP+4ÒJWZͭW"#gРλs 5݄ #΄9fŋEpd~݄h!z%G[BɕɊ@asP3?PQG.7zElџ'S5i5hnkoYΊ I7)߰<HdnGkFvr.<&sDQl>go1t=}Y^ioS5wfLbl۞믶7׾;s5=}&`TX~3NNWB0j~p0((=l+AZ VjIp$bd29*o1Q˯n3;{Qp[t . c:R`مb1"Ceb1!R]V-R_ǽt تSI#:8 >fB p$& ΂)Űl 魧2gcc7R{Cc:qzexJ ʵ ߓƌV٠ + \M&0'XJb~ s0^Nxv4'q2?ؼ:?S_Ժ'AMC_ߡPo42 u(Ŕp=[kc;(6P 7Xʿkz4? í9/P e默ܘE`t_U#l%z=B5A8ˬ ;E=,(߆)B?.K-aeلލmQV-[s Srrʺ(a2&!(nhQ4Eׇvӑq\*jHa{` XkLNi;Ü-j. {n~:T@'7玎;= G6%vŃae YW(&Ay =#S؊]0ї<^]AjIW{jPHm6-[QN+Ȃ*Ku5g SBvM`uI.N GQ`_nWd:֊Ru(%ߑ:'xd2 `*/m޴oK;uIWccۅH_m| @a Q]d6F7-u: ڧy!9< (mH:|T GM:ӟJ/2*#Z#Gުz1* &`Ҵk"##\^aSطA}b'XAxpL-R!:+vmB4Q1", ú~CL EdжPʘ] Yt_Db^ 9V sGЎqЇ!Ҕ;B> b0㬅vN4ԒX+(Y~\SFϽw /鼞tHVr.'r8(G7]y aL(6?O_E'=aa$@c|Z#AϘևar@FR4Q%3ֺlb/XL2 NYVG1.&ia]؝`6bf1GlaX}ɺ M (4KlA^ rA|v5!虯v5:gZ`GЖM):{ |?]( 98"{1/&2_ 8GD_ }㖮:dxZ]Yc1]4k!T scDѷVD!B0Qt1eSRS Ⱙ;)fW1ҩ"k}BiXf0?hU~^*ab,5iuSxϩaW0t[ & QUiSHyT_1hebZgB %) 7|$Щ{uHưނ/'2z8˱# 14Ts`oX=CT #E=GŁ SٵmVc^I Ƞ<ի ˺xVG˅e۲,cZo}q#*oˉQ2c! F"a..~.%f҇[z/ [xwTo8kΠiͰ˪ABX\7RR޲U&m[۹z>L <\࢏h_U3熵~4؆[vTd[2C @[T!%5$k?xܤ7K0+˼L=>giU{#_ǖA2(zR_Alh*Ju Le% ^5`>8ʼI(XiX30" Л:bi$ʻ,& .-ʻGtQx Sf  (t^ ߢ?Gp YqT* ll 1'Cj9 6MNAr>-!&v@GO9}0sGħش,ג)8O 6\ g~Vߪ6QEm+*chZVϸo}([ey5 jEk,=r̚˗hrZ^bMq!j*u̾h ʄESlZcOBϷ% @qvTنQu"mÚ*=ckvo~HqYgJP Nomq*Ae^HMUMz-e;KױUͷ}=gmߦ Yp\ԉgKSmP{$.ٮ}XXmڰԶ;*@p+?okReNW'STz௿J1fM[єLqDZ\T#ݕM@QT57&] Q eXVPYbV`1T^;:Qp̲<@¶t}A;//c#/pddL`!2Q4#gX`IBL L /2mk#X ' LaY7ttSL?Df*\?ar{|naK7̶_ 3B5[&Vo:qj4mz`WOלQ)Ll0]j0m"3gfSh3p>D ,L˩/ ǎn~ȻD0.mJZi ʱ3R ֛gqڌc)K)Cn7)g\`D0ow$p|O-rEX^IdO.ń.ӂI8̸eT#2Q Rj(/MQ]c,A6iizTM? V rMKFS]OQ?xPQr5.ɿ0? Mۀ&`-ntUkeu!w B kPKB,97'noN)AP)\lĹ ՈAˍt6c ȵPbt۵IW[TK]%앵~bz:]g 0 $|d~D V^ pDXH$(PE [歷+gq5H.T6δZ 3Gz)mr%PMjFlcof\s¹$4 uG\0[DSO%5pĊ; g{ Ko)NLnm建CN{1jǂ$+\ͼil.1ٶ`oUEGvo$“б, Va!;֙/zIKf|18ˌj ߪ[)u x[ױZhe^( j*UWguM+>`ȴȢꦜ<DOݦ@Z`a3WZjkbXzQ\Rvd^ nr샣xjNWq^ț+gs9;(Pț+[#o܄pEk 6/pK6[cI7?Wǒ; TE35.0bp>2ب =lXGmeGM%3t6ϔ@[VUwa d! /9lpp3zgx<OU>o8xpw #ɇ@QtC⯿c`j.*.ٮ}\mڰԶ;*@p+?okR νU/[Zzs}e.gTꯓc7OZuC@.K s ttT  ,a#0@oCx]CSn%Z9Ċg"QAwТ큂#,Y\Xԉ!i~y=G]&p4517'5~IN="N8-8;wNA{p;Ds9t3mp-2L2F-%DfBՓ ÁwoM"m &}7 ޥpQ0AbN ):¤ѱ,w*W@ 5C[W[%8+j6zm+hn]ݒkauQCYiC3۶?Cʄ1w*,^z=<5?DߞݒoL{!bH!VXDD  S5}|⪍:}a_}@(RxLxc`&pH)=I[nLf>ΣAR TecE#͔XjQ/#8 ` (CNi&; ܒhC@Z Wn]QnڑMi]oZ[ nXY7mфYނvB~CQ2\`nh"Hs9|C rDK;c 7WDHnywepVDv)kL 54Yj]iIm[_!Gx؍YXxV]C9.jos ^" q/(ֻJAv=8eɱ17{\LV q6|b߉PJE >>k38=KQF#pTldHwi§)!g_խdH1.[JGH©븰Y6C4٬A%;{ Wd!Rj(*>巫$z&C Nlf ZkQ7YSTZC.5J-ZiTք}XXyDΔ 셿8:A2yЌG32KsS$.1dQuO'!Àdk"̕cf7 #nDJg l&iw ΄<[kkַoV/sk˻+hɜfB-GIlV,[lT.bi*@(` b_*ࠬ&fa22IN2&Gԫٗ=,ȎgิPY.D(AeVpi<]va|̿p{mӫELhy箻B Iõu VLi2W2P&qcwڅ 8k"&"q m ,^G gyPutpE52=.@8`0_.aֱ[ܓЯl0#0Iyc^Z^n{3_Ǡg }Spm$x8g 6E5z$Wb2"(3wtM 72.A@0 @f`t}´V;, @#-#!8R$? 8%y[p$%IVT,oq-RI5 <7܄f1pv7:O5:1 E/'x wYLxYX%fc䅹] AI^3iݩp]kt}8]?.NjͲfrS6C!n߫`,5b(6tݶcY8{م ML{k%L1٘JW!.;-An7gʅ-Rgk)xM1ro9K[4nB6T6,+ 之=?$QqppLq2 eK^£8-AZu,A Hy IxitS+JPͣ Ng>31|˗'8;'vЛ Ga&t k`&JR4xO}dk]{ I7h kb.w FBb !:zkPˉ=c[U\椛|t3[ m_<^-]YlM'z/3ۚblyn; qwBS ߦTg#7?4}3?wy!77wo,ޫ]MDzp-gqyF ߮#U oEgtD4Z<dES(!!.*.N}_8/-;:T Q"ZLz=aWhB.dݘ! TD.ft =RK) L[k@LD@SZ;*ot^g8Js#@|ɱcW5 fd.cwGm1 qZS?pD>x.|'+ѢNNC$8 E_gw%›~ͳ[JWuoWMC~bMhI5ͼg!9[(0u9t'02J*\ ģ"l>x E=r/gbcL6MF2n?c.=Tm7oQhY2a2^6N慄]D[04oBًCC8vt¤t]VR*1mļU;568<$IUtTǣΗ}N%w`:o8 Zi~[BA(Ez.igaŦvtEi nThŅ۶%gÃE`"toS|DOrj]Ka\axkں;\x_CmQme@i`ڥVN:KDo%Y {G>୽ oy$q›*)2R\lW`!>ljn("v'T758Cn4' B/-鶆vJTL )TI53(l(`/iME/P skZ_^ vGdiETn9vEhT"b2MCoVր;3/5o4W -(U굍hge$YUSF.-$El\Ȑ>ӿ5ԥj(RBukTi*5]O%2k"l3ٔuT_Mᜈ"%Ud„Ӄ#%hZJyG9̕^zų@eEb_U^ψ aIԭٯs91 #)dfH^s@ڑ)B0ˉk/BRg߹gZ$ok63H 2Ϛ/EJ:24A##WC,5뛐KX]PVz.0ɿ`G[lxKvN B%l`0 Ds;EX)lβkaN鹡mh(څ7Gmub>YK>&:܍L;ݴC͎mdghNƷ './|?t{!ob^n6W2eǒpvtcN?7 7#0Y9~'(~La11:kX\Z-]7 ]7=KQsV-3@j %1@aP?w1n(#3I@[oT*sU+CǽWw lkM. P&SԮJ Jpin;jkƮQ%,8t d bkUe }i9۠0r\tD#"ZllЧ?[RcHsF5i!-gkaj6'X}B9(39;^ip9k i'6p`]H.5sd,Ɋ@=wW-᳀ri{cڤ_XGmYDe}Gݡm>=Xܳ%ΊM:S ߈j<\ƋgB+3+5BgN=D_4P 6'YbfV,H@hTGc]B%t/H[XQ` ̆A@`XZ&^wGW9XMӦNY }p+B/w:cŎ]j:= jlhIM¶@kT9Gae>-*M1Ae_ ptBMcG) NKz!Z2}#l!ut_DJc~U^cQR6sO~Y:P,Xs6t}Hck׀-0,&vTay'&pTH$LpDq^JSV /9,^x,΂|\ƃ~)-rl5!2FR"nT] ryc9->q]@_(F4Fؐn؂I 'hHX&V]vD6cdT(*8C]51ͮe\gǠH1(@F@0T( RK.R ONW; HrS.qn2l%Iaw۵+jhuz Vg Z!ҍD^ˎDR}{4? oZ̻P"yD+ȆV q2k&`$^zm)IP쳘L[fhW^ҷ,V-\ ,T ?7I!OK¼6q6'TXB\iSyJmL@O'2R;O8Й󮒭jf o*T+d{ *O#M#,X(҃pI.{4WK;%Y\c1o Z;#+ ^@M c" ͺp\Lno\h.QCz΋3474\ic)psF ߞ[_ioon2_YVkA ) k'vi!L7 Z 5[5?̴YЊ UVM}h%wV-W˝T{b^4? +&dzi#.sDcyz h 5Q-ݫײ WEEu\\PV>SUgF#&WUF6}NmewVc[!jeZx(oCn2%ǮL?Q1]VԛKQL3Ĥԡ{(!G j53EjSD{8;BW/to$6kh~O7M#EWmKSE" B)Gй[L|KV3>-haCa> Z Qjk{ L!wtH:Ζ۩ E+p;wDAlPVl ՏJ'n[4״yl%w7KFmH'Nwt? ^GTdL94텽̊JЉt1Jv ;0 h1Y:xYxI h9Fn Ѹ(9/Qa2L-rs6ɘGT*X8Bf=GXC:SYY6ueM!hhupC Y#jp2S}s e#Rȱ#:`=[y[=eZ>4`*xM;AnBj"lʟc˓nֱ;N˾Zg#ƾZUy[hmhY}DH'EMhu@-F/StJ%C AqGfV@Ҵ؊ʥ2*QnjWje[ԶNf}!E 24r ]tɭ!%3L&@oNfw'~Q0β@klmָm`wj%)w+;"̀ Qd9G<@9ۘuq:AO"naf ͵\n\H\\\T,X v`27T/bk{N:z3[) 1;\г 6IP6u &b'7l qVnlsZVj[Dȵó(D1"f@=pW7'&&tg;o}(EBUxA[–:^kd+vs򲂞rCb$ZV2sa۬cZ6͖4? D(ߞ7~{ĹL,6i:0 2aLK/{Z<-lN\mB5\PJdMt*mjETT$ljVBSO)̳Fa9ң0/ʨQDIs|os&{-YTs=7光Be>ycSє`UpEPMp|3Z6)39\z -s,^[n Gƒː .TGQnM3 ԧ{6(=R3F"J0 ZvfɚJ t3뺖BDd!;ywh5]qp@˃¥µc t1 +1Nv4^zGWJI1ƳYvjEwЧkW oySuXBkM]y0uf?L~[Ð~񷵾fMxFR[u(S6#-'υ՗r BK4.b(5akQ|p#{xh3]ll_ҿO1 `=VʎZ#G@n 䥩(6Pz|cMilE ZŇFWL &Dg=GgfӚ 8-YMΚ>Ԙ  ;",p5h#"u1/~t/8ࣺa} Gf\s+E~Þyf<{l&M4N!WM8Cbs VZ 9x2&Rd?LeV_Z&Qh*oO\cAƕCtRhD1S eACԊ ^54h)\}ԬqfJ'r^zA*`~aq nؑc Z0%@NrAa+IRQKv#!2EpWxs nqQ~zP˜Kv)p8t5y/Q45l-qVntG[֩mi:cLljݴ[*npќjwk#F7d}Q:bR5$%5Rf'^t슘]+7]TeZJs,-$=Uo-Cu_بe懾~[+}!, "RYL^[iMTPtdZPeD yЯ7p~mJ[C߼H coMkYyEҴQ۟t?;~%|;:0O-+Tr$XQ0֪5T̴ԪVm3mFK B*[׺&[ ] :`np0Oa@Y{vAcx>EѪ ~ XRYCjn@=AD|^*ⵄ~_i$"*.@SGJ| J$'ethj}ZvsջLqDR^ArB5e/uflH1Lve!lHFaU @R#0[Afs΅vF'':~ي_]/,BuG[&NzNS8/qG73N/_{PE;/5'0f+}oI_N174$ -ԄY\ӺlV:o"͹ڵ:gw%>+tf$L퉗oE];&Ok|wjwt=3m{-ԩ!eE/qքV3kc5 Cl;*`dhmOm[-6}o c?Fz슿%:Jn~hiMrN !!gZxC6\ݏ-m͏TMD5ʥ*JڛV-zMv2il :Q>utS >.&L7teSF$R™NӰSa* Qx>`^"S:*yzk-ÈҗT+ص˚UqsAZUޭӖⳕ'KdL1?=y$obcxz~9^kfc tf2IW'GG]@{vK)ǂbpkg+i7lujxj[DԺQ߾p0z NѷGKMx91 $!q}s0/[Ӡ9`)/eQ$E{Q#3y9[/$#ʎ:S/iPt,lc zc ^5]Ȕ0Ik A>#a<}[&>tVhn: GD4םL!ʕ+Ka+4 _krBYRMKqH`tb 7 B(0ωb8qIL ؋k @7&B|z{ ߹ާVJ{X>ﯪjZդN"\5PRB uQrcU㦕$1D EuZ\HQB!B v18v]cbl66s{=3{{o̬>=3wGw<~4P`=ܝ^'\O^GҷG_jj835{vmu}ꟈȏSyGׂoB4(~`7,$3CLxEB )4iX0.m*aBjWJ}ށ2%D`1DUSxP (@V5K1r [춮Tօ6F0\8\ᳰ *(OP3xbJcUdJ ڐH\ (Vx|"yW j7QFk2?KfTP\ @@9'B[\ rTmf6&ƕZa~]X?KgdZ=b)¥՘d(w(Ⱥyiψ?tOoesW1LH%okzώB=w']PoiS~3 .E䥨{W-׃ Z6Nu6ncO۶U10o FuA Z{YTX57,bY ȽH.,% ^1Fjc6btVX1#zf\ Z(gC0B^&,s1xLs<T#h&òD{Oצx'?Ua LK4{lPaECwOB>uvsؖVeN$׻k}.0;w.1P2荒j FNPSB'+8XV0&2 ^PB$j5{q'g}[ԮeVGԨ X̥h<(z[%Zٗ\ Gu4GpᦥC5?k $I6Ȫ5?8WRe&>')sfL+oE~A,Qfðx%f076[0lg Bo7=}4g͞YZ#cBP{c۔,{Bs7?KiW)^_ֻ+]ҷP{oz}MjoaXSąFV;fډ7Ty[V5WXW\PVy_z;tMj[:[۲^??~y0-@wj!s0G8*p B/Fq] ǝq;ӈ.I)Q^p,G&ՀR3tbڋǴIAdcPAU3N_DG~PWOBMwe{PFXxeY )b0:Zg\՚?p-ONˎf uZ4ᮜS=ØWUhJѵXP# B-6@w<:6 J܇~]5h4ߺPoۙޮr=;iyC_W:t"!k=Rku6' u;j)u4"q6b/~tU0+KIp1JD 2. ՞aV{œcȕ?1Ph4f'GLhc `QȰIi[H! 2Z`<#b`cR!&$ MWn暗M_6Ne'e2 _tXwWkC|;*;#(]ܤ31vz-iL6c{ɿ )}DFhfr\pF`5(Jepn5" H=Wj@զX!gCƐyA4*FHiR%BStw-v-qSY]S5n%?W1TB@QEpYCt'q5dUSζ+ԒyNi]ڝՒU=Jv13w'n鍰Olq6ﮝ)pWNh.8#`14uo|掿r=B񷃮+wPVa߻Z{t=u>lW~]uw!WSzwV5 ![e۴@'oe6Nn2ޒ.lGmpmʀ|߸o;> g]7hS#ы'; ^t2줸w|䆵`6Э[k80  F^w^PZ6`9 GS dYiAy t} ;V]DYwPQ *ҩ^ 7F5*f t [G/ϣOsK O0-({c/;GBW/$dg5ہ'<:wIN_:=跦@ IɩѢХFn٤S=; '{h}518A/Xy*m;vpuL;oW}ʃu+x̼'?.`n[޴dLxH;6+R/D%=~l'P_֦h07ڢ4QB(/Lx}|c}I$'E@y} 2X%QҴ<+ Y2kPJ`i]`w}ɦ /Ƶ1< tGy$Y6-2G(i a6lMrfr7>?odsf!`''Sxly"oNi&>[aATu^biS 傷?Y2y >%|ԥ$ĻkWU1XQN(ԣZ) Jp̥PZ)Kbf\4 /$L)h.;0wcBFc41d5gr$y*.ZCqZ k @rN 0NĔ>,, j`j6qݵrPW4RЃ_h{]4*JvXȘ^}K.q!WLz^M5*j (RZTSD^9R ] WS-ݴ *`()z &uI(]PY (/RwFN'KίgʏL\Nׂ.tY~⭟7Rri*/| 6!}jL[ Kz{]%{J:TwGw >Hk)d#*؏|#btwp+ ;%;6n'P4%fx^~闢&9cku?xQQֽy_MAA&ۿm)~hle`_'Td Ѕ7y׬noV,Us)n\-Pq) nɵ /cJ˪ #<+j-w2m:L %xUl hy4K/QZQʹccb_yBldL, ipXN񾒝q)zg9({C7-0*.危؀{oc0m$d1)d#cyx>Uk (Z6Y ',b85f:Y} qĄ1r\Z ̃&(Em{' (זU$fz)&?t%ݬ(V3CJa"Bs7Z6O5Ҭ(ĚjHøWG/E-S&c^ \e)aM鴵 cXTץoNYUo>OKK^mNiܗL?) ??6D%j۾9N@f8yyYY5ҝ`~Q@\ŚE^~(zpeYbrOf'2[b~h(H6#e| w}n~w\<-fj3zi3fY@G߾;Hax>L2D;ݙsQ[MbEA3=0le`s=>W-;eE ҉`rnS0t{M3ok٠T2B(*ʖV;оc*1(,fS[Q.3/c"-xƣ^%. 腚Nu$;$j*<3Ԯ9%xjNq&+Bfd]]Ep!rrՒC݂&>Ʃՙ]"d R# ^9Z?` c-~e@ 70p&ff+8.(L&ں6K$|/G'VuE.4HD c~ UyeL-@àOAln\@aInKpZ b+j/ uA2%/Y/驦c:2rY9 bʵ&.*+`FdsZx )^?5| [E7͚WF1!ϗG&?˿a&5lVGӒ++6wVtoW8Z//-IB;3_)i ~xo ^3mHfFCڹjͶo7aች%;S ; 1?\JmP qpRg%(^_Dw?dn ).Yp(Ob9T=)hHZ5 L0u P4U^EF57Sՙ{jȜ'CR5D\6k5bz͕U)1px*7ԏ9-sGM(i 6Fm]  fn6°i>1w9dΚĄӡˢ0&9x۩eGZKF .#]/Vc~ }/BR hʅ ʔz)2 ރ@@߫mڃJcrhoF}Y Aq+'Fiڬk5~ VΨ)Si&DZ XP$o!NyNQ2YF3AB*Z:x_sWIϼD=2o_nP*uZNp Q.-¯ y^y˪p!7;F>W 1W` 5dcW!6TyI ʜ0xP-q;nPEÁb_ʥ*E \5W\XkpҸ@DYS1xX\\dV%oUjƣڕpNb}Absm)&u̸iggӸ tĜ=}hNG aP8;g{Ku k6øf]I}7o7gW~jOU 81?xM<駟׀~&AĖqo~ 愱Y^!n"!!)! RxFfXw}`2eɞF TCͺ`NtVU^_s8tq+59%P 5QNنW73 ^[%[njg7亙g3'ĜHy9(LH!jT𠒲q tTDPh2~0;$[ZeKeFsr3"p=nC ~ _ 8cw틿= Pgf@L fu-K`_-{phamLMٲ^mqXWTAnI4,:/;ZGVJ6KDL&6b$O&B;"/5)4+,οr6Eby·ڭ|*,;Ro?h]/7[] (>PtF.~Xpis,e2{@wr=;UqEZnkñ'c/d8o7z/o\X(4RHG =QiwT- $Uks; MsnS~pSH怦K[ӻW=+߰R4OeZU6,KeR(\Zˮl@ш]PyMAތhϲ2]fuy@TMUf%U(:B*Vv\)HМYp*owabY[Z3e[c bK|Żr(&my9oͼ f3JG=#틿-] ty/ ƙ+[@w1 8Ky9K&; uo4^X藕D[ͺN X!< p {j)j̫R.&wV`pт |:}kU}BYX,v]swj.  3յWq; ,+:~`p~hn5D7a;ڻDߞWsul9G{NԐ_ <*@<bNoB`>`KOj\)hX˪xIe2Bb,Ƶ n nW~pJ^(j_)-2bJ 騶3D%n~ 0?bð#аVz%5y[ݨ` Nvu`]3O"Wwk5N'Jw?QJ8&ܠα(Z&  ow Y0ZBUdoRSm1i&f: (_t7OXvfDҦQ$% x]5_ǚ,up< lgy/gdz)6 Pg* ㄦ^P|]2QJ]*k"!+JyLC˹|g*ZL%a1ȭUujGq;_ 207lnM$֏A1qj_ҞU}B_i(s6lu0"4.r {׏"Nd85]xLVZL.5@]z,,«cD=3@Ã.׺$ãGhILsFOc287j&/c_+;rYhxk$:-?Iַ5 Sjdדy)V0Ƅ@^읫bZ7BEěӽ? Hwx4'=zo9.4"Rƪ\eK *vA>c(ghH׵3/) ANnJWy̨ubtnG@j s0wV{z "WkD/W O]46jGsW{{!7i M9nQW@ )@B0YO8I@Xؕa&Q'16ZEfF+g*bMS6 ;PzߟDWu׺bj siRכkԡA F]Z6:eKs&Ո;頠6ׂwy̢1pXߟds wF3uT9ӛ+ksi@:8{Dw|WV ?3KZ(TCPQ ꮩ*X#ϛ;1`5S!VKtJ5!ZP+U7̓VYx`<ڊ[#Dpu<<8 !4 ֑M],TQ@z},|@1ф$aDtdG8W Ƴ&T{l , 8ҳ>Lq(Q)F po9mY$ @7;!NP;(a-Li3sᄓ '} !_H)-w|ХZ0TR@1}X9 W G(0'..ˁi*-mڊl<ﱏHHWՍݤo3ORB(a`LӤR|xN.t} ,3 19 /Gq\/ 2B$Л)%>[=әlm:jQ2+Vn~ܒ rwS\yeE @ QHjb5M}L@ʫ[EZBiz_5 S5JN S+uA FY.P4K:)+UjƥqșG9w9<@5;Ϥo "˚̉Ώ?iZU,GG"{N:΅>^ 1h_,L_ wݒj,wk3~Q XG\3?SjW9Qm>M益$>;ڜ,mfO=q p6S?nM9"uV7{={x׀`oh3?{uf ם,Ȫ?Ga$˱mq r h(M;ȓ=1&n6DYTXWKaxkf%alp %bnW{ZR# H׺>йS[sX@.*B.NȄPJ8 @d 5BY+b@c$sÅՁ,"~b-P|M*L%E`3c; ߖ˷X;g@i~q‚̹ n=sv ދ!ja8 P(%Cx6Yҭ\.\a02? /4,4zibz4h|Abs }7@] gN' 5n#gS5(aUߵ*=`T /9f Ŀ6`"-U̅M{ 9 pF=VL3r"-4NxrBH(J~g@j"RQnq…j@~S̸XD?R] *IL }veTU-@]9"(Z7 DeZ1)r85nͅtd׌J+!fX%UV,ZSrx h([K__ AvʛL]!.{mH 96sBcgoo![to2A pc 2}r*׃F >`F5+par[0TFTRA wQ u5(˩A2:G1*- R{O?Hm|vφUGim/TCG J)˕O=rYQ  @,P+v)A<_k>5ז7@,GM~ZZ!"&vvQnL5"p'fMό.x=l]^'YF^D̾+X+`9ЫZ1{x2xsQYYB1qp4{S˯y{Cj9 e/} tN@"p~愿}< 'zc7l匀z^;%CR b B<,rqV6v3!0L]N!/| VF?Mh-? ~6K.jzTZuR >(/"N\B] WIMQCM;SUqW箣R5[≭(zON_i)f?g7`\F|yƩo~ㇲ]%ﴐ$'G { 7懣n_3nl0cT-ߓ/90HΏ@/-_Zשۿq]P);ȽG&h*JYn_n$z%R%[ӆk0XĺV`TC'4]Ec靂_)Nݾ? 2BbA Fg$R"HיRa- ;9|dȽHfPFOO .ȓ.T);c~__ mflA%:%/n :q;pfAwx`z;7uFcgﴐ$'G U~$BPϴnMpw66 ($6I<2%&~P3n8 ?SVFtem=jE6b?YȵZ(6UcݚLka:2pXC3x,\3タaV= 8J31&O7pU?$h_G  0wa7faG>T»-|Z21wvdH7n~[ܕo7''%LjUP>WqHP|9JO aY%瞱K*׃mtA $o_mj|_I+\]xQ&'-w!3n.wdZ2_~ v*kT3 {)[7.E2MmFЅ h@f5*( UgeW@2wp_v[;rcWkא+Kbws ȕkWl$Lsy/~ڔvq<Ӥ9][a l0h1XXКMY A /R^?M#ZAHj:\)hb-$V1$e[` XF@1Ep879VVx.Jq\O'++ 4cp0}i7kbПtʂ*GՁ$4dk~T[0iᧅ* L̝? [oc?$Ӕ?h0} Z5Szgxt8qʹT-ף6Ct4@u:<`  yV5oҞ{F -r5aR}`Guom婿׶jBUE䶻b$R%JP@Y C2DUEzT\1GM[I!p>AʯJ- j^\flNA@zC߀ح@4C wI̼ā(M)h։[iA61iӣE)0S4m0sE_Ĩj| 2ٌt4Ԩs 0,@2ЭIS F@Fݱ0(,D_0K;,r#"T+6wl|+RoCs)P&: jk I'f\9l?}*E1}فL AS: f &CY z*RPw+(!Gw®r=益rZڿF <*c7GgS{oϋF7~f&3-4- 5$`:M G4-^}rPeכX+ \͕ަv BtLGjGH_K*ĦyZ_w*6h99X&hߌfpX:xU].,G032݄> zp`< ^{.GaPA 7%#;ndyGf؞2yӨI) g5\"A; 1:Nʞ/[FndAF=7d妼˪B(X$3ϮU$3spz' -K}jnػ7@pm K(4 k6 `):.,} i6ݭC{qEP)xP)]SMxOҗ\)B8lzP^ٔ0m_F5bES3Z~3"^z)ŸnAI4׃牭3X~HɜYD5%])٤yvmKeT"IgF;qNo_yeQSQYFR8X/l}a&CWzfQWaKAk0ª\!}Ȃ3%b5Q"("1D+겥4n~艿9z ox}GYFEƃ}񷥫T^+%A:?\o=B!jayb5ծ:u{+g8epXmfpamĢ0/MZ).\cRgSsś Z@HJ},Z"NsWgGbn`J#<_#&ga>)%Xӯ3N8T~B " >W.rH٩%]+]%ﰸ36+4K6a6񷻠+P%<+_Ay%_JfH0 ܶMBT!`^Tiu4^A4(\š,/+h֣r 6ʨ+xb;ۡ6/4\K>/+Nb]FqhҼ&pPCXzj+x@Wu\WQ 2XֱQDg  69Bd#4Ι"&>pCǘ +Ns߸{}c*끘f:*t?al9YF}c~$Z >waKo[G7e=mZ/mBwA sdڑ6fZI@׬($VaG˽{BnL /X3hr vj FOEPG(oeBxFQֆEeR yʫ+/]Wu"V**s:zu  ڧܞ9`YE)ө k(wrs & ٘5< c>1B(\SE%RC0jjZ@ “Áf `s] z^vEJ:=$P,6xPRX-rS/DEaTX$¥ZI0(KfbH)T)Dz)kpB{"WW|Uj^&$JaaYSvpw?-ºp)P k a UhtF09(x\r:9fW-Ipvԧ5l> ` (qYi;AÚ)ԡs3~`zM+vߢR˓;w p85DY}fpX,+)Nm `Vf1YnG=h `r/&(#ʢ}Bl!Bc zu88ޥfLUZ5`mZ3/I>5@Whm 8X͒ 6O8\ :]/ 1ؑ ݝ,ԈXȻP`oڳ5y9ܵqT1 Z;]OYb_ڙ{ko6֎QO"Ob_o_pN_,s"M]u= $# NZ0ޖ1R 93BPd v/z7Q1ȍ"(Mz8G"]:7"RM.-fu(HK"t0aAQFE`<h/ylLԉCj ~5RPXmL-Н1 ^b^4oW?ېյ)c%LM0 k vΚ.m+0ir;z{]v𷛜c>_~iD `}񷥫@a3RtQ0b6Pa,ej"RyאBi|ɛ,\FW+4!"/]y6Q\Amg\s}o"j@"0F}7aɅ$*qlHD] YnKp[;T(@yf30pBu#s6TRg&2waGX\8 H_f!`yMX[H.+bЭk8 CrkM6xkg:P:~]`i,aR Kvy!td5?1߼|=c\f" o_pNWh~KblZC%V0.Ed(2˪@F]iQMuӌj:U*AW^;@;b 0tV96 ˸(`%<2Z$J ,:7+'KGCShИMza(WݍEaes ;O _~XA ,Acs㱁u7ʮwKxI"pvX)wf?Ή){{߲OfD $WU\)p\=HSV -!HK%e*P?{Y_iwn}yY6 z6h[ @`E.|t*#CpYG/׎XI|>V{4P.< %[f} Lb)[;xycHڌiB,}4@ۣz^/0vL^4n~vUQ@" ĮޙP\e~Y5]7C;∳VPxF+4oeQd!BSvyvM@1 jQ^XhTJ/I3!aUT5ӂI 0*buFxɖF \"עq| dNUcƌC+Y@EEeT)6'xM(OUv4c$0z"1CB6\tl CU nncr_0*ҵ. NS1P~/Gy￶g ߸ Ns@abݸAXēZ[̾b-{֜\f m%?xWt]Z<\f^SL1D&tY󩕹d`4,Sǰ~_Tf1R sx^rbFK ylgdN7@ ̈pg 0?-~4HdfBkljo~cwWySO>Sw[.`eG`ԷA/05v7SC`@8 Ar* Xwzjd`Bs+C-0Z7pq,MpSf[W_1WI6ewٵ+ٵ49yg+Z5xhCV*}R`ƭ˰%cdHdWRlMjS׈b9#4ξ0wo[Szr>swM8'D`T6~N;͌Nu틿#iG𷫳 i^r>Ёߢ z7C7ޢ/ᣥ`Ep̊L˯^ r>* SJ')_T͌|k4a .JfbdS+ J )tLad;JLpA3g>mȷVmx@㪿HdC<ΨTyXim4. mT(k{x̧{!}`Шw1s&틿1? bJqJܯL|FѢ\ UB^b&/ho(HD=h( Ѯ)w6uWR VY ?.]ЯtQ:M1YwuvĎ?{s!Ы`(,5KI.-\7+5K府u )d2fN s7?cO9 ;yn I|vxD\5];:vۂ)? ۯw7<נPpԀ+MRMu`LU7: zYuiZ?Avc\2;qةJ[ư 45K_Rjpf[;jzy3qOhݢaPn&A״f4ol>H;,lbwAuBE+]: noy.`M%hsjMtFɅ#um6۟'Q!]z,a2 Gj-[0(Z.+1H蟸fWYJ5,ݺhL/(S#c`ZSc"5ȻtՅL_:r c Y18` 3_!^Qۈ*w`VVn5𥐋}=߷s7?+{QwKxO.6=Ԃ1?ϻZ7;wtU^x*?9߾;p;HkQ `2{Xu%PRE+E@'Hqr&/j#—8G;*WV +/àڮ=T-PG1IP5*<F`_fTҦLMLLF3R5K g~gmV'd:k]%{e1@ׂ>تp_/u /7Ea kpDD'cU-kPPϻD)yF P7MF6p)[a5ٺQu:>~^4$QEM };B;˛o,7yj'xGAB,r:[ ]o2?lO&$YR,WhA`r)@,J B|A"np.s3_ КAMRAs-_`(: V lFB ^& ں'fyWn95|C'XEmOf;=D(`.3|Z92,7w]e" c^;orA 6iaP{D h6H.e/-נ6u"oKz!n`w@BDpC B`AofQ鎭tiX jJHQLPyu/<]=QsTVsTC(e(U7Rwweӈ(4n˺hM/J_5_]iffOU3kROm틿1?'V'+,Z)ga}1ymJYf]kyʀQ1[;(\ aq5)6݌k- zr7"ڹ2cIE{>>ߓNہ8P%/@R3 _),qK>s7?G4ˎ "]ͦvv6 hV@}O$xW-_W&*&}b'§+AY!Ǧkbj+a1ªT =&U)軴caږRh5u >I5dcu\Wю(F,_R@^&>miC旀| ?HFll6pwX vg'}ݥ̃^>;EzƃNsoj/-ۨD`ԏcсoJ}1?&>ەqɭ 6-(B)XBky4a<.J0JKkO*SܐYCL3d5>cƁ3쒹L2(<ɶ8:(h2k؋LLIX3l4)ݠYg .^7 btl^mrFBנQ<m+/փ;l҆AZKaiր<.l``@0_ LLz/B4jdmY+7}q Hk @O PHx:ž+8+]+؄"bjx3v)3+G/ڰACzc=ֿ=L~6/QxaJn[·O=SfCP ۟$悪-rL /bV+%.LjD9'{fAUU-fe֢XVW& A{R6e[jR8|ޚUac5l=3GQP|Y]*} [S"ZOKe"0Ph?qmblRm3j/߭p^öLG.6,tml ZȊ5)n g޴X!1-<~`5Rd#g9B/K)Ltc6s8Oa/x _̓|I0w2mpﴖ] 3v\n@T')W!RpwjK$ꑀ)`1J2*Ph0z 'l `*´ofh+bJ5q鑱QL[ƃO1V /{{{B dT"Y7qk<9_G?я~Fݢ2͹\ڗ4NPXˬٵ$ Mؚ9zf9[H.SI;pS{RdcݍW=Rn3zq8'ݼ"|챻^N*Q^NrZM))mo! aF5AL\,gt_P9gM,>8d;dvV益4>,ۇtԠ犿\3[g|gp,X18e[ކN$#?!|8קO:.>p냉Wo b ڨg"/m틿=Up Ry4%H>[7LWa{tHӉ@[зۨCؼ|b\PB6of,gCf* Z"BD c qs-4w)$ˋ@/ئsul35ag~]gkVdO<>S.ljXs6P˖ Q"[0C- 0i*X^jv.*)4Yȅ|34,׼症Q"pm?[mY#]l"km$jvsԱ 8~riv۸MN[ϣ_^T"$W:lkߞT[vP2Mk@"$@w1llsF B2_5HD`GŅ4,)_RD HEh%I2D}1%⛿O8\IW2)МcDZ LW>6جͨ}{^Wkiiر%saT&^wP)$m"eоZE)؎U={N\NAo1pCzID`T1;x'LZb;ʙLmo1@IzI_MڞiW<>/&S:)8%j;&(6 OaNANX B 7D`}{p՜>Φ2Nv @I@w}ھ ԢpCzID K%@" o(I/"w/ݴ$@"p%B"&KaD H!"m %X@C|馍D HKG (6^ ;'@" onH/"K2m<oO]f'Z#gʹ36$ ",f^k^'Dijݪ9ͥߺ+K0sqys)ؘƙ[? 4<M94۷iceYއUmKgK'>Yl¬NAo; N02D`#D HdQ#k6s^F Zwz_Q"$ i|hm:5bsD"$"0M](J!i<H ψD H4"t$#=+6G$@"L/'oi624xbʡ>al.;(8*r"7Q/ lq! iAQm"0-5# !*Z_s Df/{OMЖ˨忲3D`m+{; OPD`0(H*f/ow Wr]4mn7: +wǮ== gt&ffIGE`o_i18:zv/6__2kݣ9G`P[Ic_L_5 ~}:͟I&|8uř>U83 =]XO=51">sX nwX7NxAD`|xtڼgFNw_ݕD`v_䌸fi益/{Ak3f?̷\2IG`'v`9%:tEÓx 6I/E۠MGQzR"$"0Mm zs,nm:K{sԠ/UD H4j‚?3_X O-;WoZJD \^x"Ѝ9yԱ {r_9HD`LWn=f:<ͦ}D HE`PΏ@?jaԠ/UD H@wR$S@w޴$@"pL["pl^4='@"$cI5~&~Hv 5hQga&@" ;OpH 8fqkiAΣ$@",!'b.m/d"@w _C"$ یh-2cj撑$@"LF? Og7[w _C"$ FoA#7jd$@",!Q/Km ]2Rc+/!HD ;%D`3 o.@"$K@-{D)]L?%|g@"$3GFL$\2D HD"H3D H##L&o.@"$K@w"`a$ӏ@w _C"$@w̑&@7D H%D ;0G /!HD ;}D KF"$"Xd#]—~$@">sdD"%cxwVgX3D :ֻ'3'ZJ: 7Wo|+^?_K{{~g~fNR"L:o\f+ĀcNSD {5՚FoooWG>++j:t$@w}InFO{#~wwk/ooZ_?eK?M7wm/lD|c"?k~.'ݭWw8Nl{MDS{'+ҽ`x὞9@ &uG 8ZE{ տW{ܪ?sC4㪳Mw乓6tUEb=y wYyk xk՟D|{\?V3 qpD.,*[^f q؏溷J|U˾zB!Hw6`M q=but;߭A>3" S/6t v{oo?W ڹ_//t>4t>cM~`!?t=ʇ"?&,7}:G׌ øMk3G]Ec3# ^7 co_);5ֺkղvj>hd].9_S cbUpwc c:atLY6OD~e+fk)wAw"}Hg??kۋگgyfQ0/z\"+7;eZ:vlm誥ɸ͌53 \\_t_ؗ8t/&5@!M3oQ&sO@w~7'[<|ɗ|W}WyX3%GE`yN6䎽*O~e'c4U?{p*Moz| AKF QT>* F {t$@"7zhAZmrFKzzv$@"L7$\F5: NK?#KD 8(yu.isEtF%K"$t#%i.}޾6l^mӬfqkѨq NK?#KD 8G7=w"_\$n N$@"L7o(i4X8'gߞ3ƒ^~_J"$$#t%>{軒~' #ГίfzZN"A%@"pepMz0hqzYi6f'hk+]׺t{;y~[O>{PPM_/Oqj/g4Tj!M4g|4nB|NĮQI&3ԧxMtٌѨg'{fg F{Dwgߕ+e8 *Os[/l:iX ;5$;;> GҚNأz96Ωc~eDoChvb~t}ni'>QۀBE4Y mp-#U]LџjI"iζNcOgCP/}pL=٢m7LemrEZ-Qr[}I>(p DKӠ_K3V7켴ZzHw Is>1_퀣yV[Nba\6mLg^.Xroc~s;ͯ~_ڟ<=_ 5[aoӝ@9;O9i3*(,8iўQm:57 >TK'?/^=o}/懃Q!懞ZAώjO;wk?9me/'QM}(>_}yk}|{R! Q{B<50kFebaoQ6ٻ{Í{>Zs4gq=(|gV9󠛀6H4$ џ )A\o^_NG;-]K&>4An5?">^C}=;>Oc."}zua5l0 Fn5?1?Vҷ-'γZ{,h&LiG]ˣ5{zh!;]TԂcDu6ڞ^u?rKNaloelg4w-فLgo}Hw;1?Pkv€Cl{$8 4m/^ٟٯ{_~im%hz~L=~Љb~8rx"4Q{B< g mY/=g}~f3JG=#0]O|[g1?4EF ;O9W Ϩ9٬0 FO|f~udIj|v3nUjvJSuf?D:oj?ڙiujiylg@A.E3l: -t5`թE oKT׌lߞ:<p$SHZF=dkowQ0?5[rCJ gL懣7^ad~8r#ܱD}&j'C?潶gNЀM hN[}O ߃igw7=޼|Ԧk xߵf[3/9<H6#p2G G]i;5'KhYKYW%8gG7<|I#g7Q5?JZW"0F.OܸO m/[\ O%nՎkAގ;Tjg^R|V_tTnC ivpCMT}Gc||!ʜt ңWW>;D`$}4?aHPG*C4Cpv|Ou5懃|C< L-o&7ƈ~ep>:E kδQ}7|$#O. jM.uP.8Ad~1WD`lwta+ã!&3o-&EOr_TPㆊP,PAp0P}}5C2D0nO|6Mk S7^ 9_3zJYhߵ'vnLG5nk6H|6o〟]w{BK`J"\g7o}$i㏿u{ģ'|ūrݟle~L|VK[y_$P>=T;Βvc68|M 矸q0G ?_87ɊOnpvM< NIkߨW[rG oQ.{)@"p@{ ٚ3|ήok+r>G@7;zKID Ho~ؚle^CygGm{{_|6v?TjgV>9PPt] }Sg! Վ3'}i/D 0oFp['KFkm< (:F.(HzF{;Uo{b谜ԿoX]fw:ȸ=ǩ$"iMp}΀3?9#k3FLfqkiOS}mvEOG@"3 z}pþpQ䛙d}{|E=c6Y-DCyQKD hZэ? o?k~ߪl,WU^n;LzuM(]SdI ըn%'VWIś}vUߛdy V~o=f=%@߻o~G|CwS˸d3$iwߢsZE=]ib~qk)懞WЇ>^|ڷ@kEY6o['{"S`D) e8+ZY-!?'^߿Œ̎9nLe>C .ϳm7 [ E[17[AԉG{yrmQ'__SO}ߺۅN}?\VaF]kwǀM=K߆5?%P$g uvn ;5g}~-گ3ib~1?61 _ }_XN_^3O.0#敉L.C=*P9mp{x( 3ãߙ֊{ /uYI1]Kl̤eY1L|gݥo:yȞYkݝۅq[L/oϋE}˼S >ea2#敉򠭍g6SI| A rcdm/ӎ9<A#~䖇&9)lP￑kit#$>թ_, ?eFk?"+;rv#nx(GE`]rE q.zߣxqecodY1w òOgyЎ1ʼ;;0}kZ/+>~iY1/w}ޟg1N }}d~أM3Y:~E3C3`SSvjCP<iWU2?4L[OPӏ?MuZ7o;[_ro 3b^MnFܞ~#>{?eL v"$@wd=1޽d{ߵWSZ#v[1e5Ur7? {_%3}Kgwk3oS_<2D HY|:O|y{x ^ha;5f#Egy:kf\Go㙛IiU1b[vkr7۩Pg'=ݛxk7ՇO|_i>HD`=cy^W!vTߟ?аG^GWs}~7/}C ߷_ wE/znfy33wyw߄;9m\fFk D|< {W>ȷP0 )S*JC7RZ ?Z^>~k}W/A~-Ooy[~n{|V_7Nw9!'1Q'q9Fd3F8ix#B`7PLMpH bӦŒ75nje&]?]݀n>}O?dx\lyMYPg-nŜoM:~7 XR?s?%͚0#uC 3W>ҿ8XO<{Wb.6#zPoڙ kNpH b=iwo/gw ˚fF+yȦH <%6h 3zןȮ}{4kŒW&= !:j}vh >"XT q낿/}~տK1/f7/0#敉HAD;n _W~=W}W_']K,BC " kIH=YАeRO Bn/e/{ի^vo&\O2$@"&6q [A.q3O3:@"$cE ;Vdn"@~qJD H"(i&HN@D H"=-n9*H@wHD H^ S*%hXՏ8ѣ^Ѣv .̉Z~ɇ}1DpO=艧 5d mȈ`lZQ[a&SOZI"4u{ "Gw- aM;a6i-HzǾ׿/|y_sw"̃G<ߕvR}0vGUTN#4H3[dOF;13Qnj&LjjLXJbB=9י5:Ѿk)o3cQM@"?^2?Rp%槄1.ƺN{*7;.\^=*#D ot"$B"P˃D H?u|B83D H9G$@"0Ts>d@",4oJ"$#E BV"$7:T"$'@" // '%*RD`ݙD Hf"Y'J"t$@"0tD"3%@"6k@1K:OD :߀Q"p ݙD Hf5Og%'@" o(L{@"$@'sLD H@7`\CCwD HF { 9&~Ig@"$CG 0J!ߡ;^"$l#l3D H# %ߝi/HD`^d@w_x"$k@wδ$@"0}2D~>/~̧$@"$W.\8D`_>)@"$@"]*d^At(IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/cross_section.png0000666000000000000000000036017500000000000017700 0ustar00PNG  IHDR`zDizIDATx`յ6Uo"ۄ^mJn1ph$q I^ H8$B(,.9ڣh{ўevvΙsj\.TUU%X,J=5H@cEEűjm'bX1OEtNnPHEEœO>9}ŻY,|:p̙3Zb-Nt:^{K;v쨬`!TM,kȰktvVԸk.]B.mˑmStm=4ڵ&㏫og!ϟ5 qgx]5{vnx mBWX|Ŧ~ /͛l2@W9۟~qQJnݺ'0 X,566NB(feeo6vl,dÂ-^x9%^m.mAqͻĴ:nR6h܀55yfΝZEժU$ju/C`uh΄+KWbr |Xv u^r3W7>p- 1C:˘j_9>{x?,L&Suuukkk'޽h4/7i+ag=c3-7OJ8iK. _b>#I ݯ{]g~h҃?\· Un ܀,_=S:seT̕0&klIuwΒb]9s?& B4]S'ᶳ{7]Ι~Cy_rٲez*4qܶm#ٲMg[7sLu}c)_,}x|DSŊ:::N9bۦM>:kN`{GP yo qگ(`kxLUk|mq%%%Cƌ쮮_YDHr7OY2lHs\%*:Vt*.{t@Ri>η.]:ȿodb%Ҏ99jllܺud }Vb RVr;Tfkuv(A@>ab%l6;ubYFŅ1"RNB/ERꪫO?JfX,+!t50 Y, Ǐ- mbXqVnn.`n&bXX'tbX,o1 Y,!$bX>ĀdX,ˇ,bbX,b@X,C Hb|bX,1 Y,9qxbX,V(ڸqG~LX<|pbX_w֭pܹ@bNwnhhRN)2f$bXrW_}5,#y晥KƵSW=z9Ŋ ׬YsF;cʕqTbn1 Y!bFŀdX[ HVb@X-db^ . ^H/򓟄s9Ўm٪׈ |'C[:N ƽKzA͛7/ܾokil,>7lٜNVMST#>vl=kVhƓϞx&߮=EV:f﷘C8jr\V.\Ngs[ׅ?=X1SB~1eJŊegeeX,:ngeeM2%p8/%%%'ȼ>NGڦ׿l۶S/*{X*{^8=ioFQY[c7~;37ߞ={Pg7l xϕ~' 6M&~1G;sC(o~_﫩֦7,f:`0Crlq\]b xPHH={rZYLݭ7Zl/ݪY5NWKȑ eҫ;1dY+Q䊋Auh wY;gxoǎ-XUUU1cwM{ʰ*---6ڀ' hXT/r"@z=Éc=~ ̃Wg\&޶4ު7騯>juUYjUhƃ/_~`gy1nkGaEzNV赶v8,ݽkIw)WJ*% Ҋ^|M]z¼/>\բv #G,70k S4܌FW x d`^II ltuu~#mo\?h}laәwj3LgwUt%lv+UW{BPXUrΜm/1#3Kfg@Κ5+-- veَ?0k J߱HQTTc[[;T ?~WA!_~Tgr"@|?Zͮ3 H7p`O,`ۃ=xO'g<4}sl rv2Z,n:;+Ȯzb(U6lg{Wq$rSqZEЦ~j}לpSBv+.J @Νק˽4F$Pn,#=cG*}v@׶mY?!ƙL&p%333bBxG"l@[l;7Κeo2+ڀ v!"ZsمRm&yByW[ auL?͘9#3## /U/+L^rU7ݤ)/:df=7dc3s BD]~GP=Qf0rnF:ZVaj vmK^{*\J8@f=̘1#2Rr˖-LciZb|޺fNwRӓ1;t999Ilg?7TpaDbQ9@aonȗ@74>XqKM=J/:2(۠~/DY,nR/"==/s[o3V[[[YYYZZj4:TTT x'Z*&|lfG)D}$D˃-;]{\[L<`5||X+μ|J&% =EȵO=_2 UT$kޭ3rsr::'9s&aٶm@;aɓ'qP\Lؘ;wnP%Gr7Ϙ ?7NwO80":;;*0???  oջgڸNۼp^tOm6lֵvtt~h!٬6fdw'|. px@lXIMiii@Jdb9ə3zbEBWd>Kd2?۷wof qLT{/~kUs$+@3g&Ѯ/ȻƵσ|m-տN;mϞ=&MR2NT-/4f,5 OlQ d>ۨk˜t K=r ZzS֝Ntˌj]vJ%AOÎO=l+2MW‹/^ 7xocǦ9+tI]0u<д}O7y2O $Noo/bFEKxկ~jb|WJ?TM__ p^a.:mڴ FlLomȜq1i@XPA٦>$D1}\;h]0;Co0e@ns#LAٶf#[J e@]𼶴>'>Țo9›iGEII׌/G֮ٵ+j5|;y 6*ݓz8,DBY9;n^{7_BZE ?ۅSu/q/pfT:J )Gh4;;; g^c!L* X0Ɲ솏?v ׼ޖ‚[Vᅖ~p}??Qxm^?L=R^VqrA\;&0R':r3MMm-ynWA`4#5G$ֶmۂM6@>i.`cΦ~_|酗-o!xg£/==8@nσƸqSN>ބjjjm7rg^ի;wn5#GPٳ;` !} 1 0Wx B|7o#G+cssKf\[QQk~wǏ/3t'xBF0#{YDPҋ/[++Ɖwݽz[ZZr∀taQZbEmm>BAC ZEE޽{aOUUaO3h{u[wX -]yYdNfo 2ap~r}# mP O;[TuI'UNmtXɖ/::oJVSN655;[,s0i[ZXr)icٳ كd%{_㏛WTToĀdX,ˇ,bbX,b@X,C Hb|bX,1 Y,!$bX>ĀdX,ˇ,bbX,b@X,C\%5hѢO81޸qF,+9t>9|gQQHz,YoB[Ζ$@߭[Gʤ¹sVWW dJ*bFr ТM:5Rׂkjjʀ b%rW_}5,F>3K.e@R>b[k֬{awܱrJd jСC=Q'F\6b@b&$+9Ād)9CO HYt\ k93 Y+tىd $+b@@ H)X@n۶-Ν뵇J!@S*!V$[E#\ ky<y02eBdXr/Lξ(VDp`dʊɊ"H!|0*R`i(R4f@R>ܫLmYGIfy耔w@Bd@>á)k:c\`?21 =%ȍ+Ϯ]U 6kW}Z!Vոwx} H 8j8$_ Ϗ(85ɒ_@n\Yr#>v5_ 8KGaIm>/uts D52 YAxxxaRXSZ !ك`XSeaT~bRrԋɊT?z@D}}}NJ/ y /jKCGA3"Rp;O HV̔@9CO/k0bd? F*Z΀dL hA& ΐG$ ')鸵h G&G9)?q"ɊAFXb9$L#NΌ2@.sCшOK¾E)+\t@S{Hg= H)Ƅ6A <,FƋmF6MrAyf= Ȕ21b3=b=% #kvPz>()dX5H:9`,2z#}T!ֈJ!@&Azɀ @T 31 HuLFFR D3E9Y9<H8{.?Y9I<|c8B>҅ V-~ ~_rFВGz4CiQ@`8xȨI!{}q}p\j,wJ>9n)^'lJ A UK}ԅdTŀLAE16Tx"=@+*p@9)d-G{rA HV̔!֔++QT?E ChL-ai B舯;XȀ skc@HV`=Pry*݈%ⶆ/'Gx!\%uՃ .$+fJ(2J:@ʭUDTJ:ʠ1G\Q2#8*):G4 ʡ'$+f6 mTQw / [ҴE> ཌྷ T!2(\2igwCDSlFs(ֈ([(LK}J2c HUg Hٳwy'##cӦM9sfZZڈ3 SP) !eyԄД8!-*" 4 $:|O"2z!Vպi&xg]HyYgz{nvvu)XyQ A ͫt/T*x" U!Q  _1c\r%]khc+[u?i&@Wp3#<23* ph zrǎ kkNP.2rXE5"I'B2x:!k Feꪫʆ 5"gb΍Kna a@bGj!VZ(`c2H2AB=qd[[ۇ~x7k u/8uXgE 2@t֌bjA櫬W1'jV]Uou: "ArϞ=r#j:{~]߽Ə2Zr}: :ݮ 7]*y=h2*ߑ-Ow|C1GfW_}eX.6MM.Iu ~ǟꑏm鱿ˀLAfNj#rcč ^ey JL36$]bW46J uuu{wIG_{̷ *.pêr7z~>g\e@bjnuU)F"-<.dEے@oۭ'wo;u]zK..jgp yyyˀLAERZ2X9ĚXk3Ě,(֏>(;;;"S87ym-1mi*.b2 SP 4H'"J R:5͉$U +~, fK/t%4k&,(?עxȘ+V\veY)& 2k@(b@&XEP7B&zN;8t_*kp}_Mɝ h &L~]d *bӛ"çL$hA"nAq"OKo33z{{?&}}]sL6@`@8;?e>ىU2@UWWW]]݇>HO^2(2 SPPOOd% {Gk 3 #"d *q<(!'~5\><</4*G[<՟)ꃌF)JCkp2@1 Y12vb@D$^GA 3 $d *ߠY8( @; )!"bm4↍ LI ۩d gM#(db31 c$d 65ŀ)$XcTt&ޔH*@b[nIsέ ȔT 2b25j7yr ТM:5Rׂkjjʀ T"R L|<5՛\~W_ 0們<ҥK)D<]gk야Hb@bdHXI 55Ll9[N E]D1R 6ǀdJd@% YQ``߼ydj4b>ziy1 Y1Ө$J1 YQb%()[b%0LjB@])9&1brlyd/S/ ZSPO544͞=b@}LbŖ'^ΧBu ¹sVWK2 SP ȠI̢ļ[2b@AEy9<)$+Jb@&r-W%1 @l9[ΖɊI -gUĀdEI $[Ζ*b@$b@$$JnHCvLfV+ryNF[4>ˀLA1 Y,Vr+@\`~ӇmM Ǎ_|,{[3tW-MOsLA1 Y,VrkD@/v9=}cfX'u] ŎyiSP)b@Xֈsu9Ͳ}[ z'EwOeX٫3f8^z Fd *EYW QfUU ^1`H7f׾-_^Ɓz}U?o[J @+Kb#N zoMق{H[ |{ΥZU??nV 9󌭻 ?^]Uiwd *%N[QAݕ?T><:Wgre=~e1{^{2$kRЍU5%RL}gkeuչ/:P\=z 1Lo[xz?` 7&c:Y4}{1be *5MሃJlQjڤ|iIc9Թ M{\e]} L#׳m4Wb@R,kJ67Z*/o<چYQ{p#yS?ZѕmL:!b@X ].so/1kKl;+sWiO5=S&ԯ€LA1 Y,VrK=Q& ,UwjgNΘjPn˗Y|k4J2ŀd:I|X u@5O=q>OƦ6!rγ{r=0 SP HVkp D5q Ȕ: ].իHse`G٭uDUP%d Jp I90")&^0%1 Y .i.n^ٵ.x;"Y &Ȫ/w(Jp V+;Zժ=U59Ө jU-F(JpI} RUJ9BD6.ڈsفb@$$+5, }yC5*ŀdEI HV' î@lL1 YQb%(b[ HVĀdX-@Wl.ĀL51 Y,!$bX>ĀdX,ˇ,bbX,b@X,CȘ gXZhQ -qSQbN`_dō? P=ܒ%KTNiii)))Q/vc? LͽnFqC?SG3"WȽb*Aи#k3b"@BrjWlUj_y7u1 G?CĀC$l:t嚀č#Cb*X3"Wk-ay N~U^^~!/YPd4mĉG< b b (7n}}}H nh4b|~ "$+L1 !l&LrL]]H @AظA2 K~?xl޼^1(j *夔#cSq4ޅFTYUy$eZ F&= e SAFCf?^#GQPFYү0ŀ*7N嘆z"dHb@(_GM& Gt{>K)*< ^R(*t<+df ,,x0Ű <_M>7k,U@1 U5(h0C /@*3(-fM =|IH1R* ٦3!($"X(/" Mdyix ~:\ݥ3zҍ1X8Fw C#f<ױZ9tmj8 ~&B1<=v䟕:V6ySB=m]/Po.MWi,(P9!D#REq BĨ BQ :[$Gx$6N7؇N =^}W8F.ʝOH_!BkKRܹt߂ ENID2Ճr8xG.Px UCxt;ۏ'n"BѵdXz8zE0)>0xnZ 3Ы\-ş @46Na9A23?_Dsg`@2@1 ɀ Dd* kb@UCV_#Hqm4Z:lxlÞKؙUm(RH2b Ea  |S?>Pʀ}f aJDp%NV(ˁrx]鳤;33^쏄=}4VxcRTG bIsoKRH2'Ċ?.>H|Հ?~5; 9x0<∰CLS9%LgAb@U=Hᐝr&pd 4S(->X ӢkѶ<crh*+K'<` +!9*< J[ chRKdP/P(5ad]}Q+V :dP؉'*nSƑr'fe_)ˁg@&1Mjd-<nCj(g2Y&p<My \f(4* Ó"JJ'4Jyi6ǹd 2NHDy R;O0 =ŀ8;'78CE .p%Bi =3l(<݊"4Hf>m'Q5^ߠ\h4GCڊ5@9=M?, ̡ۘ:1`Z/#O~zr|3{sSoG*utK1o5яBd4XBtWl#OT)F3M?1 үAJji"2"c(/O-'@Ҝ jaGR<¹\sC.&%!i'4Br^r1ԽqԲl!$/JxFȕ@E'xriX leZHh)fT!BT9PϞjL@CoGDNx&{B/Eh(,U,OL!(yL3 _ z),% O!K.U@jkb@U|sAU ؞R.VyƂ3Ig?=W!m 0 p h4ωBMR1ёǫSrm `yz Q 0aT.aDpkp;3cŠ.4#BhitP η,m“Zvݪt1ezڠ|#jVr(#q o4Js6U8 4j`&eDcűQ DYv>e{╉>33 * =#CD}c@S Dy5uK_1 TՈ!V'yzbe@FF^+S62C&$ҘVx2 Pj/WѺ#iL^kP^^@P=yJ9) %@Ǿ>wimcsscɘ N h GP awd`jGKR hޝd e*jb`BDḀGUy4=0T!-LC(#/WX$vRA"1tbHx(b.%@x a ij KoHx2*.}t, ?AɄuL~G@ҸMt^Rj1u?AystO^t&&Ť-4m&Q2k17%ׯ,9#A3 ³޲6%?xBy4}m4fv57XLp 4 $8++[pA.0{IT3YMloj:VՂMKDfKT'rKк[$|ی X!ZHh}Mᙙ_Mv)y{b2㋑W[8fU9h+Xq%-Mt<?kx d@U|=H aFV4C p" U({\q>b@kۉe, ز{ ɗBM·ccYL o{{=xFc.MQ=lo2+-5)ciiewViKLpxx"ZKS̬K^5:TɔײoJ( Me/!Y¤`cw $3KFސzMJTٯ 05U25CV)~9=#ÐaV\Bi:Z|)#N{h=`MWh?,8J/lRNhEHUZS^1WQv1tR)_<<4עT{F l8rߤ1+ꪥN(j.+SEo@f46@R`ẌKU/1^3tFOY F#K_b`m_!wиej$N*yn Z)D}Rɰ$<5dEb HdW4\يaASXQhe@U"̃4,eA^976EuV$dJj4izl.qH%hlYMYʎ&Y#E-8i |[37Pn JcwZ8fLB}}ϮaGGv4 |E XggSnn1 Ԭ7:`'~0r®p.8jzFfv{:l60${.ؽ5Ղ1L$EA;i- 5pPā ȄƝQ9,M?&U^BH]Sb5^Y9|A0Ns򋁈\7{dϑvYczzܞeCs6uB˄huv68 VOӎ3>qT\=++0 Fc޼3W]_`c}^]}]8(,)/(i< b68CIni X U>ʩ'G Viڥ4-dgHY!*O@x! %h3Rݪe@*!ViA!XczW8NѤxg4iY8W^ӦkA=z2ȫyKCm=P\<=c'.l9$%mNA8fk4i6޾A!W|bX:P xЦgddts=i+09 mmGf>,d|Qs{ p;,|KMt:GﭫrF9L]Bh&q0,`3M9-k*9iE]ؖ!"&"p*+h%E3ɡarX8T٥o0O9O ixWqB. OCkbMnS0I']@VLD+E5(;F\u}́9'8 6&N6sh6 W;o z_X6̐nh NoJ(fL=9$j 3p9lp m_ fS/sz믷~p`'5\(~ko?0&Ҳ&L=` Lcvb @vyH5yp.VdĀd@ @܅ H 0&3 *% iyMF<:1du#Z2cGO^(CRpśŬu8KZ !`N=pSh[[`Tad,*7br~Ijnupkom4*Kkm6wXA__wWW \@dr:8-Dx3Dc-vl[Q$y,H%3@۞y(N+Η1&L6V{Oz X[^>;ݾO>a(l4BFbUӠZ5'ß YIXسTN^VĕJG i8+IUA<ڜjq"eRVd1 ~_@b ;jWAcvG}B:Ysj`n5%`QRЄ߷='`P8qzyu1|vǶb i==EA OYkt{Nn&ZO":33 Rbnwgɪ!iK+85- H۠p8tu;'L}:9drLeeS1 heJKcP|nzt2eـ"h(G$V&^W՗)'I[q" ͔T٪ by.T g@UC"P,C>y͵43ak<8kEl+E"уFG*?3o99G쁫X5s.8}˴]-- 1/BB88s-.O(FXTA6r,RUa& C Hɀd@߉mVͦrbҟjnv1\O_ŽD#NiE ~BY<qbhL$Tg8h+7֦7K3 ƞy@ޛu]}h4v&RDʒ,1v2ٲ-Zb+(cKVl1mlj+Eђ(+Dľt]AvF^w} sG>0wp EMGΟ}Iu++51Q_6#]]zX,fF9!^H,6pKf+p-ז&D+5O;R:Ш;V_;ZXL*e?W֧1>|-{2{HͦF/y鿾CA N'J]#iT3D!BgH'5a wnc]%@𑷴{gg'L{fGgϼTGnR2Drjn.Q|Z0P, <YcsH8@rp Te^0Ec+&<F*X-M Pɴ{pbe FtАHşֽ($4i:_Пd6H*~2)pЄb$)6fFӕ/;FٕX٫fj[0He;:y4@6mz!-\{1~+`iW8w瞍N3ªɮ3ʦG/@aBB`v#ށ!2ЎHo䅯̓_ ha؈E ; jϴ.Xp5]10HX^l--IQȉ scPv]<յ=wxeKB{s`ie嚲0A#Dͨ(r 4$ǹkױ}~?@uG̠q:`'4} +!8~^n4A78#'L 5>|S^nFfY9uJɁg@6T5\QugO(;g(4G޿{y1y@&0NˈM TV= c^o}o'WwM$ۺ+l1Z1``,G+#Apmñ|*?;9Hp# nN+UQ@TEYVMsR& u"dKWΒ\l,pEh%Hs wOtFCʑ#oeYX}E)coPwhzt|leA©Yf%SqhS'7NSZЯB AٕHl"l tWu,dC^Y0=eq#O<_X 5AuHSp^Or#<(,ިC5C(R&膦+UfK!==ûw,aH&-?~>wc_#:3|iT lm;N "cgX_ q$ DzrH7m@B&SF/ہ]J.Mtd:bf.\ 4Zkjk9ڹԮVW_\4@'e98[|=DSɉsJ\bukdr+ՈSq*CH 1E<i4ʥy 鿥F d޼ '6 7 (66{x6Gۗ3ػ>ֽՍmX׺{)G#e˛_"/uScJ\ c4f)qZ.(ta^xl=Z>pC?h_'Yg?>)CH$*@-pjSeиd10^8ºE3@4a-Iޜ\6U,t<55uۻ+yZ YX̤FPB!CU2bx@TRd.ڡg^ )sИ xGf.b]ŬMB)c('n*]=,m'ֵ 4 7pQ3y8jG>{きQF( Dvu~VPB* m3/[jkd [arۭܲ61@]~l1e`:'sck4nb}B kyv&m݃tj̢ضb$SYI V0_21#@ƬGXq λ__3*mah; hIڡ{w [>_;ԿTY"J?eUr,]86tB] H hsdpulj1SDT"10~Fvvx;ݨъ=qp"ؤeey{;:|Uy1A!Lή#MM^@3`%V4AUfQ5 UgeD\\4u@Bw.hmoZ5ȱc_ ܚ wlX׺;bRcZp2FQWyTi0z9mkZILHjƘ?8Po0Y8^-W7A $bA7h? w𸗪K&uJ+no u}m<"0T_SL"ϻdg[\~/(cŪ8;Њ. [x6ZqƵRfqtcMi<q F&QD=(u]@b&; OOKE ,H@Q׍tpRRY0| wGzb;h:?675uQ"mLg9H-9{X^ѣށS,N˂n<>@E|9AїxX2Rij Re"_s]+|]vr.ʮFVM4f[j G oH[CX[F6g$hx`L ,Ϙ~cc549vܡW?}J{)/;59y~;7?[ğ[fg*)|ŨT4tcNr'f&y%orn-\ \,r@@nTkGZZ[5@ ap;:|L?Wu]wQc:9 CnѶb粴E#4Rv@c/򡋳SSzzvvW /uP T0gG8ĖR= YY^q8|:ެJ:=_,N]ך䥦Mۭzru[wԵa#&Q)|5 tJ":j/au8_؞='tF{OEf12w796[J3Y7[FE!8mZ2k^@=tcف1`XEّZN*Ø b.a9k US69p_PN[ZU=uHeԘ zXĸ|P,]QU5$+?G7uL_9wJ{M?_EP@ ( 0z tHLbjڝ4":ݭgOu\L݋e qlV9ڙ.""?,#K^r,;JP[P*bHKtk%ӑ$H X€16st9G cea|3ȥҴ2t0;}d:@B!U,MNO_Y"I$s0U ~Ŭ2Ϛowv2OgclښLɁC[ZUN Wm g2@HaqCSkN54׭G*;U ,Ҷs÷X:}Icw<틞{ Bf+>@G i Z[4et%ޡ Iu;;Hwˁ@l< "i'4ތ+UپV;>J-rAj+qʂeBtE)#&y^TT^ʧs 7%~+Mp'vԪٷnaLH- .?Rϔxx};'ѯiP.ldz { (#qT 5&+ܞi%eBǐ C#:c#|߻sH+Ntv$H\ٯ>y0$y PŵU <q%N=)Ywk3'H'*w{}&je,f&/b`H8 Vk8\joy;)KgpWgk;dfvvdaa;tuI~ tJo[{J)?YBgQ"1 $#{Mow&Sy׷3dbN$ƬDmfj]WK f0)j,CLK1~uKx0,OKx-{]ȭMo ,>vSf-T ϤRM<cdkHWv[ڤ`ŏmzuH&k7J([p1xծ02J&ՈV`gvP˝;\.y?z۱}SO_MY=k`K/ߋ`JGZ#AL.G>TVY+W:(0)NY 09;[@ xY  Pu]gtUJ2c8ofA\vܡT4:_%8zER2_°ڕTk_yI?9B)tNϛ 5ݶ}1D"#q|\?FcWV`b)YvƸ̬`>*RQvk&y)@~ҬJUimv+XWk4Ɵ|zC { jh#: |ZyM=t4-22Ç3p,4!/>.8h?鱬< h<kSڤ謏 lt7(V\=m+59^z?"2@YD$Oyޠ=bBu%=Iq&e n/L0@bpB;Éza;6̺`xq `:P(p0r~$, 6KA.#PMH#Ang\~RהtL6QhWk}dɁG?eh*>r,y˵Ҵ}0{`wrKG3raJ=,-.ʮ&{k;t聽8W,mqr%%Ej g{! N}-~`B!J+! ^1RdtŠ.e vVdRGF00V,:AR"cry3rnv0rf;xZYFdс֨Oȼ}96+2w=w ^|KWvk#ή>)ްp8%,]qiDZC6@@ L{!/Ff xX1>/d NPI 9k)VC[R'~7'SU;|$B RBRݮZFqsj,:L#XWdBvæƒK\8&'H~>M%,xF)ģfL؎…+X\}Ŕ beͪytT5Ԥ0SM1v䂺tfr$tƽ7\aG]wbcYx LYKB(u] ##/D"TN}ٗ_n]]ɍ@ Yk8.6 FU֚ s ?(0!- HQp9J$̷ILuB P X"OZK&tC$+rE @2 I+(Aw@v44! ӠJ}`EIWè=E0HL܍^ D8/@lpH0e/#!a"rCJKUcR_b{29N3`HTS+dwOF%B Zb3Nձ/Q&& -U3l]WL?-u(pB )ֶX@ծTJ 0x"`#.Y"؏CW,;3:-Q {<=>Gn\k{vv48)ێh4*TeHiЛݚ@6mՖPZ&&_)Iu1 @ k8FNuC쬒(޽w;N gN_ty],OhYB + Wehprn^+fd%x}  9yHVB` L*tj!]B!oл\Lj3Uvj UlFHQV@ƁԈ%U:6;h3v4tjB\%%OS~OϥK/{+-9qf!37>5Z J΍FO]ɶ6xჷKl"x( >_$b! JB!LG<}\'mtYsF\##y\XhrnIijVgjZj[w$:to 3XHaryMS5?r.= I< _{̈zΣ@drVLcY9-oV%Kopvw-/{`F@&1Oi)B00?z%I*fT[ja"!`FqX9 p<IVJ0g/F&q(jX=\2GI R@6еXlџobT|KpJqWiI[@$d2 P'~,h˅C~="'$ͱU;=??&hGejDƷhܓY)-.emj&7xjj7Zj[wT0HL~5XHo_娪F{]c=gf$3w9xrO=Xgsv^]y!֢ۃ&` T vZ9u`p ,nˈe‘N@$hELFZ$%Uyɀ[JfPەN@Vd*Q/aЃvVl|:xZնtj0oӟ`lLĬT,pvKqTjZXwq0uaa eb(na3>~|0Ѭå:ÅF.O&e' );p&\SMۭbekȖuHZ.e;%l"\3JjB%u}}RY +(tum,d˔ - t8cwG@@?xõ:)DOJa.?Ph KgcX|Ш4PA$2UiHHfū\B(k,>jlXff^ Ha)xxr63C<.`X-Y|Ng=F?8_gBp9_)MI@懧LN 4ӡ_(8q;p'bݾ Fus@A*ݰyTU+U!#4S1a%eY6s krݽnU@6@2ql7LhYJ[UK벊9y,}fttsϏt|ꉩJHL"yEa#\2wPig r04 t!*["(%~!:SdE_>պBy\KrB]@NZ햖vG?0ȢfjFϲuK=B&K5L~qqBZ`H=RӃ -nw>3F#ChqCh1Z,=Ϥ x,;-, 22+K0sXlȑź{0TR%fq,׀]#71Vj+TvըYg@\- :ls Wku]jCr@rM@6m F\k6@0 -{b&N/z5*TJlJ<>~}[?yL h-;|PwP01rn/eb %}4x\&*:,Dj/'@_%1-6 ǬEvJaž}}ڵ)`Xpp7Wnũm6Ҹ^mBYYJH+~88Y>O~u%ǔāJm~|>^Wɉ.e2z{=1yLO _?vII *ì_#S`V Ie s(ovkO49MR^[A^ֆPU;xKgYA ͱ>t8]av XV ٵX4:33WE!g| O= bD X /KL@G\!(rKeEzw rc2fXzZE(g9eb%Yc1 BA2$G*؉HWJ ǒhs\T,O*A+k8#c0łĹ\Q@@Y<~ÿI;+Ku);uHn FOs2K#Ĉ f6 b]]1#>|Lu"=ّK۽A~K6YZ5hs@ó֑)uGB,X _ctP-\mdk)[ Ri+f`:.q&Z~ 00;w#@*q n=9y3N} Z, v/%N KI:DeJSfSPt&ƣ` 0 CC|X➅1؅:Cc(J^̓ԗ)<"(Cq+Tf`9gi9aN(f/upk:}ß=^8̕Gt6F2*ɗ:w7$̀>>͍0'۱v=WFuumܳܩWܜtzL4*xx4g +J\99Luښ0N5@6kմbźm#zՃhYY}ƥJ-#O{)r>ª>C?9;33O͍r]Rܻ}78`>FXxFNi$&UyX-Ui#B9ZD+/* WǑpgfi2*O25gU h:cѣx_"n‘bfn*x$`#g?&:] OnsR:4o^kߙlf6Zzd@rնƋ;.hµ(# r@GUƏsכLqcƟFGO-,+MDA7q`_.oP/2 H LCO)IRm@Zy*bp4$a6fq XbU Yӊ@k< i+ ݖ e}5ty&ks3y7WD'9>? )h5uXM١:-\mT*ѿrCN]߄=X9 Y8Ѷܵ㞇"+X?4R[e@O47<|{$&Gb&hj#jʒQ[QJ)_1CjO gbXy)G;Q:_i+HC:b0U> )`F&%Rpy~M:=%F`*1gaJ8b1.~ 1A:@ cvdx¹Sc1-H$UX$ ERFܔÇrzX~s0a~MdFG_dʈq׶M*etJ C:`M]]5xXSQ(nukq+HgFHVjLA]VGJjtmv`pps`RX};W/b3Ojf_,Fadq L/+XpX<w.}m5+]^1\ d юYT?"EqvS )T| Qє,:D+ҌT,+>+lYh[cXfr<0$@ /IFM^C7B<8O8B N$UԕӘ(PEo@btͅ rI@\?kwLJӢ3r/B}̅2?X,#+ypdLdyw3uo]or[T Wo o*4rնjkZ5fQm߾%H8sv=?43ߑDY+ ѭH>\6 0Nh"Yi6{Xv|# L0*֌4AdXe\Q %-KI)ldE`|>X;D'0_iIu4YqCX { ]@5KAlV__$%tkp9Y05 3ϟ\XY>] 0x|J}_4'cOʫ;=u#;ܞ񱳓P8sg%a |֕#W0bR@g,okr[wP-|uA[Ū옝VZȀI8l 2*}JMeWN>q⇙ d*rt5La$hW7̴ؖED JbIk I$?+8 ţ8(Yv(;тefZWZ]H~`}G)zLB`R+X9`ftY[` ?& VJ}؇ ؍~Qtj̿?uQ?w:L\Zʞ@([Hw,cg㓝;:rYqbR,f''3N/zFP9&=;=N-xx&&7J`]4~(4."+ݰ[(#MrW UFH"PGqdi$ReС7=ttaJs2];{kO# ިv7 fёc zxcQSz u<u90 D8@zh[\c|Xy<s&1+J=/8FoN\6Dܟ]N"UeL5/AOX yjsv܇^Y{<zztn C y4B\dJWnRFkCUSĥ&>WjrY hm#$2@T=hb9س=lO_Xvt XTJn&$'sZ*:c1Q,K9Jh0L#ViY v25МL [ Uk/kӸF涻;+n[:@(y:~]&%INn2;4(_nbG>lQ yT@I ɾǺ.M_d*kvv4K̀Uvۏwx?088Ll&@]}#)m\%lt_xɁo' ri\&krն `NF(᷀NN ۷.lݟM'褥۶ Ev^s#/}|ahЦ+{YtҔHîy6R."T;z3z#qE(Z/R$mFSS*^Evh蛃0VVjl%. 8;8 +.:h:5Wv/'*m*$X/#VrV*0CVXuЬkL08Gյg`2M%}yҥጣX 1^lw%.@CއS_r兮.YJ}[:8'5uhq MsBiWDm-]׵:@^h [٬m>y"Z[j$ȆE%1N޸<4th߾j%XLJɑucH|b` eit:x{ R[-l1oglnGP9@ވm$^*g״8R 24)= 'g.׃u sP݊y)u)ЉK0HYjW7e tev6\/FELeZ[Ur]/ \ۣ#w(8Fn; y6#\1 &a6@Ws63%>9W4;2;v" /Jh<>53se~IhDD^i.ܲ_nrأZz۬ZA:k6@X]axP6I]w=70<6z.Y;DE2176v&, txtz<>sgojJ b1W̧s5Es1 ϰL|N/_'x% |aPV `ƺ2ZjD_6rѭL4r\:$x̀$3mr'8ʨ" ,`\ĦUj я|ǕK^Д]0{3SWp\;Ǟ '³S]=8wI: .1)KOώx*YՆdpϟ{fnnT &a;|o_=wɁ8Wr9\fo mkd [qlSfb5i [Qv6$M%w:{1㱫av'3/<O%& @ ߿'']175jw).!XWӲUl4-zaIӚm؃\tw_Y-W(ICm 2{$QPKi'_1|T-/gD@$B HNsHgxUU% XLh<LbJqRK%ҙr:E-"ܶ7alg < 3h*8^&\*UiRuD!0ɄW}QR:;3%Y6'mđyJZSL.IKX Pg6' YOKo3(5=`vFT 1츱0UՏ;<q2uab^I$:yvÁ+Ӕ]85W\G"¤dvv9 J q G+r"!0fzf J47@~&밄mV-pm@6@j+dohr"۱;{px/ɥ[% E}X;2=`$n 1V&VTzW1zNn0Sif Δm-Fb$g _t lĖl /km-._Я[Kb蜅Ax^K~؞gJnPA/3[ +:R`O縦J4JgF\]V> ={;tWVj 8v؅43S`~OO]tLfQ+x R*՚6ȿ{|vy[Z|JXARhqт&Kǎ}ρcؒ''/Iulϑz\= |!tހ`TLUQwvW1ePl-@&3B!U*+ aX|{.z]4j׏KQpq;kvȵOEB^ TaX&B;d{2kP tucFEt ~WkM+J8/AsŒɿM)Q`y`d8ܣ`YoZǧ&&1ONu̥~GKC'8z"Gnd@"OiBXҨ9.6|Թ&ASfb}m5ț6jd j~ųM|ϱTAZ [ WmARAMisBl6~;$91rytT_<kvS/ lO$fՅ`to8AW{;K}g+Q°OJ/RK LsEJTɧF.GX|o+(ڷ +~zq0o]ͣ- &U WoA-\md}ҭrhHѾ SXZl~btŋ]|R `ג={<񦇰sNRYJ6{u]4Hcp=R!UҔAEG5n =z@/:qFbj;eB-"aFF_{|J{-F3S 3^z@,`m/),NéMq+Vs SWO|_ʧ$4+T!E G2;Ys=}ت׵Lf\0S==ZwĹ0tgx3M*:ZTa]jɪ ?t'GzJy pj ojdqr>,zİr43#*\bNTo<~& f]g`,uj.I T*eb(A dU{_+5/f0NRb7@K["D]MK< \JQ T,+F3k$EV15(#֚@gJS䓆 ; EE0E Hxj9 perl!evrۻ D0\X8^O*85%42BGU$jrkКl?x>~/vx{g9/+ٓ'ˡ,f(fTS|fHH{cXZj e 2 CC"rC3*K~##/V%衯oj(s š 1EéD$fd.U)@C/"]JaJ=A/1AӪ5o=>*gc>Cl,m+z!ε=r ܄ < lǯh/6Rka~A@:)(LĹTj^{nmN6T_~&}wo|[_Ŗu-bmd ?n|]-ֿW-\m4Z[wfUaaořY]}'aˀ"O3VH;`O Ȅ}4`|!eQzҡ8OYH2F\v{.wv=Ie"WR)c§/;H[0'0ՆUKQqJQ| WCX~-Q>[hC=U F|\mڥ  0CQ*[?~g7I 8**.UV֢:si}ujwbr'&sSRı8PBiT\X *~& / fm51k-\mTzQ PDKA]V9w  AYu5odĩ12;RخqO ZٌԔP6P%[@mbG.F!r6* ozfZ8\% PDÈ+KDk79-}* gŌׂS0\kwpY*#gdr`QѼ*gCy->?U;Pr%W(e(8,z겼RF۲or.-s嫃W(&mrq{exg}xYՓ$\N!N*s5hMϟpyXBA ʛyNQ:J). AԱ&-Aip"@2Ady ZWcԕWĦQ8FQP:mHQk<#]@,ǩ=rj=*Rm^P@VJ)M'n8I.K-%F>?K]\˵JњSLz˙ VI|՞NO}k1C.aƼی})*]]vmaf' H* πMn*):H觳i[79E+-\* rf-\m Ŋ9='`+}Pg 20=x##gL rG G;]F.xYS ~CL ?Z 'LA 4.48'aw Z&00uA~FVTyo)5@I6Gv+t$uJosR !O$'jI-3S0 a)(`,TI/(#gB'~ &aAjrU5EGRӣr,roww`bě;M''ϛ "bg綝;v.Sofb,'ӳC?ڥK-,rI։6JX?ݥZ r9\źm$#ym/EYX*Մ}a|Ea!z(QTȑl0jg3`'112@00U&bY) MPBmYZceR$PAVg`^4@K.D\HT07ɛ=JZ]gZizG% ͖y{48ohT6w$CPTP;'~% wq;b}]0\ba+Kx==Jl`?SaLM'573 04Wc'YU;ux)mHNJIBEC tT2M+vh *\”ʭu)B19yXZVj߫tJPN=i볊KW ~P `޻z:+`:B e!QD"bJrlL6᩠w,EQ=[T+U|"?H*$:!$gZT#Ap,)GcZ]2ŐI[eu > ala|/%dr:/Á{ VR395R)S;L,{ YĤi"ˉ \lutvvX)mJPHN/_e]T9N̜=K\iI\&rUe֮KVTPgTDdKuwH$ %@!::77B" (#*K$kz߻64KONa$`NOGfQyZ:yZ` ӵS''c$o'>E96Ux;γ9DbG2SN7}_w~*n}\uSڶl CNp*%i!x|&?bdW jFR֟E)Q.mj*U x LMTJX=w-xs C*xj \32X`l`Hv `F q! ^lq$Ds2dٲwԭGo)T:R,uBޏ=O:k]QQb%`6UD !;А -3Y:=qfB%B0 ϋ=p0aE(1 pGx+V[D$`l_,~X!9Ujdʏc 3Y \-) ՒvJXr yXGMsg.zZȣS ձS O NWgMh ~0m|? XZS |799t,"tK}Ffq$&'Y>'K2+֫mzU*Gtfo^YU|ޗܤk FWNg1VZ_UtwgI ǰ"Ŕ-5`Zp 0q $&\Jtq, v^~gmH',˟ N /dvXSiɓ SB4S-̓:hk|fst .AL,ydst``JK.B&5,2a"ᔼ4d`6dɎ0ܤ;P[UD5%pJqYIm X]208d}=݇8AV@\Q!fWU3#EddcuPŒ˚1m'(* H7huJ0Ԯ,/s e=PB mW%Z<%iŔvҬ Byv%[&Gh P[)7Wb8)yo6[^~̱RQ̢ ,h8BY\QxccytguuH&TLJIsg~@L}H[7gJ;qM< H3êUɆyet{J`gc^"4 @sSS~jL@񾚚|e0 OhOYksgqpM0LK֏WlbagT2" Yy~ #h[W 4S2&N0V샤ɗ2SPQL\wC&FMYRta`'4O σ1DX$FX)]bGs$WWRl&#BJ$PИj5[L#)0B$i<|JaNiqGі)yAqi}8.SExdp*T5{'q &xʬ0j.ZK?4~n>h|. 8S ٖb HX@f8Ł뭰9`H5H_k?c@O&CnM̫9,HԤbh$DbuX{FEh(t Nut5|zYkdI!IAf 0bo; L?'nўWYTT4M#yaǩxQ6LTkXR({ tWrcrUWlfeJԒ'(Yǁq/%\m$). \\}|r@TX,vg:J,E7*0^i;PTUÂ+ex( c0۝".Ucik{E)NVS2@t_y+9^}'PA4 ,Wj_R(jvjUcYP`V bjeZ&],IVx<`::[/3哟 e8-X(Ƈ(~Z*%tG@_a)&~P@iaYJ1ǂ/< lok}AAWf+BX" \QiinRm2b iѓ OX;]F;&:KyԖ!50%sKJjsREXxj vu4\qTMf 6VƔzJ3BV[,o,&utBFj"N&!pjҲk)k] ]o#*Uz:A m1Z`-`:)[譐,rw@i$F&kH6a*5KyX0 t@`8;ۤs]r m\8 ea)Ea3 >jq6_}+4 z!N\8"UTW)awMqTVvM`OĨ`~%G`wܪe }-x+A>}'* XOLs?v: &':.B) a\@e@*=sW 1dHť2uvlYg Q 3΢-)9qOa[l֪TJiQю/&ER-Ho{z'?"f;3&aqSS"+:;W}:P<`W^]iW*&`MHEi= 1Ng5m`KWpV5kenF9Cjjm1L<ޙ/njc0!A*Olr8Z*r 2v erH0 Jɋ.0F18s|JOV497ƚ*8aQ늹%?_9 :$XwlPwIR1h&-CE%ywR:CW%XVOI1z570'd @|&К-69Ynd]*RZh&Ug$d$=,'i YQDJ'ӦsN7с}tF33%lgI& 1;^YXkdBFKg/9Y8n{ 4KE.Ôs KV}giEvUJmx63-NJ_hq[J叒JpFJ,U6'_< _9:N$+z5I`sd2& \xNN-[KU:[ QIGT1HÌrW?ϴ GD4pBxcÝToJ2Sźz[@:HDGGGK61{@ *nLXF ڇeeXEE=7R!)+,5U6K$%7<bdBF(na+r͢` OW1žWK7J)JaX YT6>˨6VF#]>AAw^~YZAzYpSccP[Dѿ]Qф>xTS: HEhi}x/_Q'\v2㤞-Q@.H?WO4y?+ZڠH|<~r%; sx_~"l6X|3mٚ5\؀4JcQ:ѕSP@)oܨ4GA# 78q 7&e+1ploEufsR8 gljiH?4$q%8X҈5DY)pC ATdaƅb` F=k?&-Bkad"@.9< ׁYX1t&{Q# !u6Ƹ_OL'“a&LU:wd֎^ĉL,0}2>3 ~᝛E㸔V1xh%RLfν ?v/kb:ǟvf>$`OO3,. H>CQy mhݸ+*@8&o"5}D"!sʄ 'm,𠿿 La<̀DQ@5Fz5Z-YkZ4Sڲcp׮?7yWn%1f Gde/ԜLha$+UY+\;tgCS8g"2VPpXzq7sM]L-$H .'`9c@DvvLWsG.#~* j<%VJ\T_rE`J!.Ii4km?(OHX\\]XX`/D ЯX&UYՄ*U`>3go Co5rqk JkQȴsM_G <{|x׻.}]Iӊj~{]]\:7j s 9\wG//T'"[ƺX2@.Xe@rlI*k` Gue]CqU2Hz?d]V`DA4"rlaj; R N1fv<eYk>$A H|vj䅗_eia𤨝̰.yt+f)",Hn >g` )'SUy~fYIN 7+L(&Z-AV;/s\kmz ,Q,yFo~c\b.ϜgϩT*k<˜p z^x TW~Or >\e}e_:999¼Sű fg%p}6/ޫLȃ_'O@³ 9i5CX !Fp4޵dt'k-CnjZEUn+19^_ym{)*~ XQѴ|٥(֩ce)Ca:bT ]H<36Hۉuf8@>$N.5sfs*'tՕUHe )&6 qeno:흝/W1 PR*06  v@M#T#5S$n;d[7fs( pHVVbb%SYwtwӟnlų6SZ|---')7/e9~u]@ MO=?_~>jnc>BDVuj]~TOǚocwesm=koκA}S\atju֮).VxR^ŭ߸]|LFf$n+߿g611T 2MU d#}d S3d1*!8aThtyP\\=4ԉ^c]j:Xlbp d32B,$7S[Ɉ4P7~FZ$@. ?c::6oSA: ,flI1%?bxAS {ݺ<+u;g?kj^7%^f|Ϻ^y7d%~]oF|st^|l뺎(!? 1׋}&ܰSg7AL߻r ,1ƻLWupʅ*x"YIt +'.4_#Bub&Ixcc+V^$pyyWS',`<ߥk] h7ID>LH9Jy78XeAGcSz'cXZ;~0y4mCu _lچwX̒HPZ_PL3wy ,8a3 :\#T:9fUL۲us.ϺgͥJz??+|At偫#Vm6"1;z%<8c6d&q&S;hLOW|翴⧟w|A ݽg˶7>u+p[>Eu3z ~e=r$<Ϸb<ItpƢrym*0|DћonQPii`BI>(CGF3KY&bJrz%ɇPqY =mJ 87j&}!ZHV9Zw$-@~׈Knlqc:[*qȌh ;om6g~\$ߜ,qLՀ%ͣk?L!FG{aR"p;M&. O)nlG*Y4C-H@Dgenƕ|f݇[o7l٧Bӭ$N擌BZ^N eeuZYݶwSS77o<%L`K9#[Ȕ۵!Y*uNo(VA?1noJk("QTTbnVNGp_i/++(1lyUJl,fH8:սCiG~::\\!)䖘NyFexe{=k/[~sOmV^@,"\ 2bj۹nMMymڹ'Plpl?o \p~]w_4gcn9o:Ѳoś|ƽ{rznΏ׺u Tˎs?ХDUl^՗ge~)uɎ̌ i]SR^)>;qr|S.I0M214/Up F < 0P+@%Qu]I-VOgK/IMHAZYV.hTzj7{WjGNү^P;HȜ  ?p[ک U*x H#m 4RNg NI*ްe6 P[38,ěͮ\ںӔ^8TkRb`$sx4QLj!_RU37\3K9&gh2 Efgg1kTQ^mbbm]C|֤i/~YjID/se7_pA릶&o_n>icO^G;4\krr۴jYj\y(jv?mEhUvWwpi9G 0%%5:|{7 at]Cp(W$q©'m]J)4X2{,C"o>4<=hXZ&tz;99b_yY,& br'UVDNw~2Hf@Jo2]5GgG3 w4^[7s@ni]D+۩okkmbU:CDJV421HtցE)ٚdȴ54NyIԛM1qgXp[L,dPIWaO qfEr GH$$%`e,rRsm˕$I4@@rss8 o{"gΛr`"qͫoL,0^`֩6DI Y896 djy$àBX+[5t)`gN~/zv{jJ8򦦳K˪M##=zD7'˿p;xV7cP&m?Y7-DJ){i ]&;\F;N$2# H٩͕e>_-8*U.R@gPgQQ-zzD"_@`n7SSx=A*cE lV:Z6es{:ghH$tn>۔2׬d2;Wi`i6<64s9)QIV9\̟L>ags:VN;uBMz@D EWE3֤]$3irq"̳ o|k珵^<sLvbN$Rx$5qORhyp_>_?{((.fs=T6vHRw>\內"Օ]jz#fBm/9|SAxP2 U Xm6]r\}WULq\}J$.\֢!!TuǙM)G[Rd"?`^aqɄ β_{mg%' Y <YfdN+SX@zf"Njk9usTtڻSh5D=PZYOn` 2JyVtt~v#ȻHbc<e;]RQUlh,, mA<9WW'˧}di6YkY7$8.np8P؄@@4`p097).4́[.:A.f;%R\ȣH]$ &lwY" ;@H$r`m-/< pM$f/>OTK]$xs/DQЊ)* 3%F1ْ?7ǐ-W~Z5qVz:>)T܊*#Jq sJE%^cL?sWHFbrse(L?cȦBvΧ*~p|fSq/[ B5Z~[q;g\ex>2kTWkYT.˥LE\,92=Hr$~jz~h 1QwٲwlN blbd>4tH;tdvR/ZJ _izɨ9IDATTr)jgaՋZhm r U-g/R=ȣ%[ si D**8㼲:mDp<_MOG;V?Խoߓ0ٰyy5k>M99fT)*@BB٦XX 1дV@kkĸn\f:3Q *0t %*``%$uCkY" ]*%>0Uʆ]4 $`r$zT*DhssHdj4) Ⲕg@N-pd[iogM7nێY93@G.ʄ 0/|F51` d'DM}ޮsTAaɔ_UlZNNMډąa|29DrLprwZ\Ճ<1ȷ=<,O)WxoEM5BO;[#^o#A#=Ӡ0K(V$H/T*]*.tZ:&għdUꔃ>Q9sTO7bR@G-fWd,V]6mFgCjú]Hwc͕:{HhLOteeOۚz7>wcCRq#O3yȖ'n`aϕ_J-jtbR? &*y9 / #GJ빳RЎ @T2nUn[)?'4;Oee)ʊ<es!lkH㟱%^ $zUZ۰" wrl57?t3 3E訴Rs7iܶzGoK.72 6uXiSRRCΔ֖j=8>_X譨^~}}0p8b/-=CG7*EfY%I :,2lР<Qt),쏍ۮ+輎V=F8Z^~*C5b}86n{뚲e]<{|meK.@M{/l}qFTt<-_l$nO{7iǷ,߬v4<nV/*-˳CW\'/{kZny[a{>m}C!0r1 )xA%1g7I!iV F # FH3)6Zl KyȘ $f*L E>KOLL  xm0›HDBJxRjj)d8${d8@Ȗ9 JA&`A+-HKz4+*^e$F Qsuyݝ]ދ#g겲ou#?t!>Hxk~Tܰ_'҄8Ӻҭڣ[WmXqm^x;/ 泳ۺݱk}rS\w{.@#CY*;M4[/9 bY|VXegqӶ뾹KBc"DlIjp fJ~ɍ+dgƀ0p,^ 8O+ᅟnbfK56N<< %zEi *RVbӘH|띗mVnj 8Q۪6_Ԏ=43m۵kHzDžWeed1Lf[nQIx_Tkj%w#-_~l`ffdtDA ӆ#.fjRU>01419& x9ZƱ>̱|eՀ(`(;D?$ìZcԚiyb-?t<1ž \OS _/rZXV9I懙!3<H$>aFG[:alD Gi.ADHMJ9JǏN*3"z Lܤ=<\TpSN$ky4É7k)G.xlYXi:vlr2[]5v/o]~ײ~G?ھeݣMWy%Z״ݝu.kCJpP-_UqspVh չyC˴I}\ [;̘1% y[62Vj ,Q@NB#\_8%{tQe3,pz;)y$h(x=/҈(ߔIomFA~Ms^ y=@.`sd'd/p8L8p ]ǰ*K-6Bf@2T\~ ++YUs<V^4:KX@zkz˝b `lwb&C2ZLZ$Rb"7F\zgwg?/fu+_ ̖ 9-*:>9 -sTI%uۭ}Y;?f.gxEs_x!yl۽2]t-;q饻]8ٵtޥ᪟>1;K/]i[WdK+u/}+k7&+w9D/Jլroko'JҴyL_FxhĞ ā|cv (x$<,e:f.W* gn7= Ztr&IV{M:UJ N Vȣ q9~ `¬"y2\V/@TY=IJͨ)sNy`b@o'&ng †U;v~o P  b23L/(o_M:i pc'&IY)3YWKb.uϿpl)R8ޚ5VD8<41ǩ=)hg Dw!`˽䎴% 7ltJU} Z_U MގQ OfR֊6ի¢BY잘Tz96dr)50UU+.CX[)n wp;r0눅b$I~:e{({,\Ot]q捑ै=*%=Es y$h1'+ۜ=4jdd%=\o\у,VT 偔_QJhe4nnA![b30`2lr㦯rtRj:FQ=/(p; d,9 T"㓸q8KO`\Y2Ճ3BWhۋ*8?<<|7Kʏ|ߌ X7? @ݭ'́_*b=:f&oKkÚ<$5qvoK(|ÙǓދV{d1RsJbvrkinw5()9 _U_JYN0smiyc255trZm..ڛF7sꔊb=-s\Go\2A 54Λ6c$h"XXe]?`'a&'ǀ0I$1p,l_m0t2ZV)bS<φ;^GNW@p a(Mv{vq3@f9-!R0DhYwhvwmih`8_9S^Kn4Oi&:}p}|wUU+e0<7kqX?iZXj|@#}Tu** qy"PSI L0oWQBfgRX}n>8!FsL2!h u 1Qi C!qՆB11)\y`oX#=ܿHdJ!!!> XT-ϐ l4~Ϩz0N,Lo>OYU p†<8R*&n&LxLy:TN|8{:[-%JN0W:zI<+)fz1Qj\}&S o~:,W='02nBh:c fB&QPp((>I(lnFIiF՝| lBf@`,(mn~A=Lz&q^^~ʽ7R>o/V-*|]I j#.X-@.dISK.֣LfGkh%sK4ln^n_GX)#vtV(5q8,h(0;( 3uw;KځR8+n2~HFo `{ԙ(.f3Wnƍ\F4!  w ɱ3UŸh HX qpaNyE|؆jIGZYQXTTYfuC K؀W@ J9]LiCoo@eZkFE.l@.L]Wf70I)Ub¢5ee\Eۅ1mtKnFIyHfs\˖ @'`%A3Zhn]c-e?P* u mK 0 O[Þ%*c\@Pb ;}!0<`TF0I^X:PM?QNOG[E=-+f"?d18]E/TF.+g>h}st FN N@29uv7NJ_3a{{ a`' Uyx gҪ ?3e1`N-ؾGo,0W- @~?Js෿yGoQ I&0/(Z$ a91H=b$M9S*-˗<āa{__ϷT S`N`&aR!db F lCDx9F[ ##(qc ^kĞ\~%UF`NW)q g6)q# ^ l(b)2b@&GGFFz#8jVRɍAU&È88uˍaG$a/X0T4Zi ZvtSvz~XE%VVWǏ}xU@A"pg1PVkŊv0q:Sx`W緷^R@ c133Rbȯ/dQ.7$\rN 0\Z$ †fgDSÐB5>_}y2o` v`c0ViA.1쳦fuIu) d7rm0RcLțB-JW lAb% "̞\SU\I#l"OWpqkF|B`#e&&C~\Ht(/Q\% 3_-_`owQIyu"j6U)|RpX8oO?u8 ! CA@80'kZnr۞rJ:5ڬi7-[hǻ) Ifmol@.@Lȯx/%I!,WwxpͰXI>]]Ыw%.WXXY(Ԝv.4t% CT#Qʫ*%ÕBYruY, qd!♸._~nhr]՝y6wX|Qu8aw)U#1MqR*V¯/q{<>]3Bth3x"&ǔ+hNch)gC7o5wʼOtu`x7eBp܏Ɵľ)MI8 (hANL:ojJNRRRd-FxrL&>_Uumjœ %2aH7xOjkO_⽾e匶9ݘxa/wUpl0y_wj Ny\ȇ6lPw brh6)0 6YٲfMOG@ʰv X,y߂vX,o>IP\\Xv}B3|n lbYh e^QXBK%|I?^0Lr ,Lɺ=`qRUYqbd$ &Bf `å#b  SR([ybh]MAtJ34RQJ'89woDLaRhWiJ+0MPύ3F\@4HQ`P(ffry`Bo};לp0#xВoS]] VR:ޯo J+PTTYQTq4fb yarMV(l$ t~B.)MCaq9iLCD!;[0- @ux2̪#TaZ [(B"?x)1Sqr .NmxpH1|S3S1? eEq`' kKccQ|*bBBJ{q9<5oY1n K::0;- |!|dJጧc_p{dD^xpGx0@ڕ=O_X3W %PAH75L BgZa5SS߳jpQL| @l Ro:VhԆ\ {߹R-I `;KyԶK WKvii}]ȣLHlS YXlee˰*rxl; 5Tړ H:ͅ $jv133uҁnud "SX^ <6)G)0ՁJ`8 ϷLSds{J#e4SHt5[l.qEҙP[FcQb';=p9;qEMo~Rg8T0H6BT%_ ƅUd l0?|G>7xLKbȵXS&`4FG{(y*+cge`wG~UW?OoҨZx8`H( !)$ tC BG60noW]#FӛHa6u1_޿w\:HI"͵J{ng$77SzQYt"A;w7%mdk+*Z(WyE.DK.nFZ,޹Y #2??wUuuJx~3Xm+0C 4ʚ%3𣡡뀫E2 calo6;.=- axO;̅Z#$!Av`,K+Mvl&pM z ΄QK*FsO帠T a\FJ2"eV r<ŝ Vky#|$1b)\RD-g9BGY G#J1' )bc<ܢH'+ XUUJHZ)~oհl6}/E M|, ^*KQԩ۸ o`iFѫ]{;<;~WEܹ= \*ފc+Í&F(NTڜ3 3=>dOq.WIU<q x l2j4[H9 R:DE#l2&+oRa 0+̑pi90Izr 8DYn%"rZL42=g'"+q4:xPa9n+cǔBe. ,[Q+zRTi`/}}F{J03h6}>"%,|Jy͇+bϻdN }~aq _{Mç؁cW.vhikkxygѩ/)eNHٝ CzUȝۅyZ$0j*l'~LMKK?{j`8xXǁS?>CSIn`m67zp^GQI9ZQa%K%,juY\qOi@ :Y!^IsecTeXWi8,LOde.3I(4PQVمFC˳er&˃bAHd)!YQW8JNK??~~,Ls\&9ɱAS C4"YZNW5vVWGeknՁk77=YMܨ+. d fzl"4(Kx ;-@+/@~bU;+]  s橒sy|2JâP`kkۧ$HP-Eqg0>Sml fJ0fi 4k8^c{VV0~tZ6Q#*˶2[+ɕoY$ū6 iڅQB@ٜd{ Y]IV4Ⰶ8ZQXi$ 0`x,M^ K7JDI /t=v1އ ~qXfˀY~44tյ'IdCX š& F !PUDa,mlٳw)ף W9W\xj>'&cAΞHzVT%c|NO?Uȝۅ wG|a;"@ oǧQrv],/INM`ju_..N$a[/ehR.؏Lpl{^Wy=@/$VN͎!x0Љ%|yko~2_+d+k`rH2Ebw ЈҖUT/Y6{[ [3ggS/C`JbRC|](ȴz\DQtBlgII$D4Xf#4[ݍ@BHQjnu}ii Cmj 7H{NNoL±@Q (YπRKD)@zX`N)%"KՕJ.YlLQugwV'`(%:JAR0W&0G^2%R̸U>󳸁.WfEܼX .OEF @`F3gYX[Kekp/@? HpwÆ|*h`WGWi©IaU9 -·dT z;5ŅcGh@8z\@[“mۊ)Ut )4YEUa` m_;J;|8x IL~ЋN2Qxs 9Q+y[?g?fUȝbVbV82MP:` h_v7_|_R]uUHXR&Z3k陙YJpf85]V8I-j%bEd2Jlyye$"9v{uyyR"q Rf (i}sҶز淲FM8}EetVnhRhlK rY2"PUC zRdUĢg)Se.8BIFb,C\]&qR#IcXIjajqZpEF~'IR(YQ0@׷5fp({$ x"RiDWs~6>؇Ku\)lpDžQ`T;OK$ABᆼyc Ar۝JXEܱ@8$\%,) NHVH$?=v!§59K>l\T*kl F95N)&$B4=% jr$ԯKS1('3H N8JQ '&2ImɔjƆEj>{^uߒ}zSbdf4`+F"J|T/?W\v$_XH"x|ײ .ЕA(1ݽ=ƹa9ҜL(0q+-|[>gǏ}-؞LZj>c+d Y7ߘgǏUȝۓfȢu[$] [VE[rmiG2Y}ɇ&Fc,lqR8^[ѱH 疚,TN'Rt._e2뀷Ǝڲh Jl*"šL6brәM{HũfہJ/"'FmikT#5"ƦC+e~lgiF: Jӥ0ƑqR6}gT,GCKKTLmFH_<ɕ$bbfw;Nt&L&.OkN>ASWjn\[o)&W%USLlxJ8,X9Q. # .,iRz6UoX?v  O4|X ۧb dE"<;~oUEs{$[o@xmme` 1ӧǕ=)յئaqr{v'y½(GnAzC't7ZVj1ڍ(B&9N`Lp>ZiGnW%TQZF<Ғ$fa2tu&f*-ǰf!0FkE9ÈqHK[!?;s5$C߮ +kd/_`7}oy$rE[Z]V.:Y3ЍKJ iEƣj7EzjjSHh1}fj{obD5a=ȒHC?ŋ]XGK07#yv'ߦs]u.n$씑>(%5pj |P馫6d4%p6 Hw/,êrMd5k*ki{\\^quuTkJJNDSF5!PDjU1-r%9@;⯡ԣ4,ej GKWvmEӱv!f%C`'+~W198RFc.$U*hqx{[֌?E9"ԣ{` 'ObƠ5HыT&NX,v3J Nn'\bW QAŖxFG4D1IaV!߄KԔ\x.<;~oWEܹ] rwV֊c+̥UTfelxȡ銃JgbѠYԡ\ƧFG-,H\ 䫯xpR:˵z Etzj3@R%0C8AADh"CQNB`X:NF ÷\&UE* G)#Y?X%ZRa:*83L8~X ߠX傉x!8ьG>4lJyjzD RdxI2^O O #3{ v8 ຦ަrlzp:J3?µm㕣JҬ[t,57yvߩsR-|[ wlN*[ wlM0L$CU`]43xԡqSE"'' [ڊyCI5Wu):<`m8Ԟ]߈aKLf3k"*P8' YYiiq0\8)J}4?+ @(tP ЎrJ8!Mh)5@ߦҐ4 u2Å*Ԑ@S>TL#Ubk Yjǧ>W}5 a:1<%)|fӠźvjnnU%\Jg6KM:aiU{O8w9Cd$2%:{. @'Ҕ.b.E&ha_yvw"@.8/cdźۭpQ:~ +oc w GD̮K`~V"Y 76v;[]i.5Ƙft8, z}G(\_YU#!jn-PD tIj/YI)NH(U˳N ƝS{̕r ClX6K -ό>g7ӉJ7)aȄ}Uʛ)倉9rLZxc\.aB [T ʱ#:iYo70N )O{OY6I9uvhp*8gKR>qفiPssO ohuT;pqҠOc0(qȃ?R "NKo^!fxMBMh"@  ah˕UHg@ nޞZt)]BIN]dRl0y<==SZg[t Ѧ)ToSTt* B`0@pGOVF;Wᘉo"V~poj#6zO2< 3ؠp ddvV٤z\YH28 U/AyosQi )tfxt?}/Ώ,wEhgXR*uM-^urc!6Fx: OWW@-U;{zj]%[SgK-"d(ѰN!ek/|ޟg~T wnuwts~rV"@R*@g}=; Ś&.n Њ_ٸ <+FS:śգ nߕamO䔒G>dagga>㰘pr3)NHNbqW[i"Kl*%b4 @KFc6t, sH+] rZ Y 08#E҉Jև٤Ld2݂}e,e͉N]e6 !ńH GĨp7:yxf9UTqI2˟ o?VEܹ]p r{̈́"@  24EEAa8g,$nz;wL՞X^=Ā|;&a+0ͰTy^o+[:[+P$UI@h$H2VIrDURQIxH0 TgXE9xfDPpIHQ"`zcc-C,DYcx($6B'o.Jhni)kzL%3>qyY6G^m;VZ3wawzTZ52;q|+y84|h >z|tCV't3:%¶KhDk^yvz*B; sչBȉfse%$m86t\xonez=\C%X"ÕeY++VɒUd؝2H SUhYEYPHBTEf3QnWsT5 -h.~;U[t<ZYТ$n^}LhBi6lL32r~=_\\+gFgR))v=990770rS.׳YhH{:y*mw\|(Xtv+$aV8U+dR==&#(fs]|S\.@!8qj&w)m^&%PLK$ -U k:Ⱦ=G-Ndy Z]VRP+ku 6H zrW2+ 1Ug&l% \H] IDL#C,'ْܕP7ׅ~`KWL`*\/X&=Aa i:z/BG 2Fh;J3scc1NLYHa Y#g7q;)M%{ 4ŭ4PߥoeIy:ꃼTRrrߝ7?/@M?QEܹ=l< PjNj%VPr*a>0=EM'`c+Z|uPF|!ƿq+(x] _CLS:milfie.9.X` #M~RƵUQ֦JΪ{fB`FJph&kEgcӈs` ~ady9շWs z_fY3*hҦlZ=F~CoM]+ SL/rep5..'C ~Z{z/*|gxik1}̌`uT~[y|6]fRjկ<;~ k wj #Պc+Y"@/ȇ5ڬ?Ył;Gb}ޞ'Eܱ@.q\a(0僋It:`03;56ҋղ Ξ|pcc u~~tvҫY<3^o}=m0K)iQKojau`pfֶ3Dol\Ǭv $Ū$R]} , ːQ&X 8ZC\ xcz1[r׻ST4twoRtnU|x.z&ݶgN;ws8RQ^&yu¦\8hn9\e$~8řQ 0fű1Hry^  Oޓg/}Id\ & [ypE ܸ#D ]E|r-'y:Uni G0S:X_/- D}slk%6NZ\ػǿ4{^{t,b7墽4xN/Xi؀a+ˑ21 еzA,:P\'}N 7*cln@ "1G"#]f^?zDpCwY'K1Y$sipDz=I^HaM}ލk n%5R0EZ\5~j{ȋROO|k1@X_O>˯} yJJZ*MU]ps>qA=-00:]%`k%)v 0.g/}IT pA`ۿ>  m7nTb̯pu#IA2O+dYY% ȗؗ=gXi]]How;xunɁIW&]>N`Q+a %`̬Y2 h4P7cu?5HGBYt]2#,vhƢ*^VYƂ<v׍ !ǿ8, q{9I @YCm*2?,) Oš$)1 lB[c+4>Ƌ!,"0Դuw_P[m Ra4|Jng;vnd~bE6JMbqXJjqH퉎$,PLB\T] 䂄LhE?&[RfQJICƶ[9ƝX/0il"5*;,r.20GiYEV (2)Ej賺'f85o; *kZZ$ё)n5lG"~kW A=Vtv+d Y<;~RN(Ui:RUfXs{VXi wl zi@G Z1@**bCMMt4w^ss 1cyyjhb]ŪD"WW\4\MM} -^vtvi8-@q(Dt1Qdds+E7< T[$UU.v5[UU1B9V]u.x2h-o& -=UzqYU8Й1 j6o 30%ȑM>@:uȣZL#Jѡg1WW(`mm[r:ى՛qED}fHWV$dSPhHy6zcޞYkrsZ]{Y  _w_UbD' L;Eܱ@2c5º8v]MRGKяֽTs~ Y,晭~ 0]mujq əV1- K1 ׫.>Hi00X*Z_=6l.fE:RCH`@)I' !@q/-.N2`RqչQ2y|崨tSRQbS#J#%g%xqEb|N@q ~{DL4I,6- xP k 限'SfAdN޳yO3}Ǒf3CXA#Oxn>LRFAqu7|W@X_ȳW;G WԊ X.feT|^ciD)]؏W|hnkk~X[Y8JSoxԙ)mzm[;?qa+**(Pܒ/r9SiB3g~69y碿Ԑcc&rV~x[mT638g*G<;~QEܹ](s{;"@ oͳWQ(P;U`Pڛią.ɏ=6 ˯[ wlboJ n6uJp〒nlzZ}:S>=0o#U]9Skhu8j0o.W¦0S 59EIL¯*zt,-v3X MUeU.:tmeMC2T肱%xhd+re`PLYzJ\db*NXrn K̨ W sR:#Qⴼكwb 0BS C6D1v5;=?JGR܀70Z shIr m'F5778wYW $K*W8cl';66vn? 增{ʾ}5v71?CwVَWax*ؘi"yUF1 zlnvm^!A%oγ#8F)䮶E"@  y:B _:/*5GnI#k"d=J ]ƤȲ|hrջ-v^Kv ȃ#eP@`milJ" uX8pdԅuM,1ш|aZ0U$2 :,a>%³y2'憕浹aljfpDF,-M7lCw101_8j*h$3+_).V  |ksuuS,:5ג:Ҋ98SSX=;2suS]\ `/yzp w|iOS#*56v!IYHGrUm>G= o|B=(VzTźN#9c7YtM0Dg1 E,d_<;~T ozu$.v+4*yfg}#71@}?j&Fr["+Q9=XpʼnNq.VW776v83uFg^_Y?9Np A0cc}#I$`'p"~i`$iΘHȚ`,jm݋~҄0"/E ̩75IKIDC﩯صxUJb ,Ɉ!\L.,=J׽!Fe=uyyO)E'n/rΡYq4x H c CE[n{dUBϳ㷾Uȝ[1HJOWţ1ԍP* S뮻n׮=m=3ca츞,@%SF{ͼèUTz=NF]GVfk=q7=>AXޅdTr[^)6Տd'kDUկP*!8h\VU1&Οg.S+k:E|}Gv{1qs'łB fE6[ hdX!B pB.KDfP( x Jc$==Gp78aw?Ja0\(mls#KK3TYO|OTǮ ] 'bX"97742r?LQ9#R|{Q V [w Fry}T wn P]{3Q jxPzȲtoRҚkEX; ѱjucߦj̝NXӷN~)n.)-w7?&-ڻJss|$@6&8#0O'l*N4*6 TNkn`Qː~f|\_R\pֶ+]brr@X[[64W Mք͈I tADtTM\c`0@ t`Epg$4\b` %tv2W*N؈F\P-I6'f/X8??N/H}b30=˔ jDy=G?d$)Y^Z?9X6? *fad¤Ai=&  w_gǛo*έdqG  EI˩`<<YHUm-ɳ7*έ d!HJ@*'TV:Ep-pU}c - tյp1ƛ\rᶋDf!4?2vٲuڻ8jA_piA^ht)1?->##g2` >s0@ &#Z0D"VE`pɤ*6fc@.C|`aUz!dY,v`Ǥr& uuD}5zv(4C!91y[ꗧo}mDVMu^Rbo]jwWTU,IH(9=ʆN3?;b-݇u@l5iLBKхyxmC7$UN1GQ^O/ W^U5?`SEgϫ"@b+d-`gźۭ@(P9,Brf!#p2gЖ4ͳL'0dMM=88 4 Wi¡{Bef-sŋ@[`G:pȃ4wvoK$@rNN  Vʪ@0 ?rt{ f؝|4 PU0/Zpbg0s6Q rtp3==GpQO^,d$?kQ @S\ %?W^7S> lbӃi O*͕jnɱsgCz[;ǢZŕ+4׀/*]<N,M//#&&NONDK08A F qUty/|u/"@ A>qlEܱ@J:nq:OPC\zb!nr,=d7u./L֊sbj &iFyB0߱*ě4b(k0XI26=~N(##wL!g+[S#0 [#z.Յ *0& (74tYx8jsW #7B#ץ} :+(u/h]={ Xvj.k=tHof=3vrlaz'd+JJe) o]oo]YOV-pk!N>w=60NV[ Y?ɳw%Uȝbpy+䎭@*Co_ϩ;K 80=Hq[6N-; v-\|oH89]$>N  v ɂ޽&Whkj;; \]Mb`*sTe2 Q{v\(e0l4ՍtY|mho;id2F[Yo\W: 7een-(X}p:m3c'X0Ryc}}L//o?.N.:kqmE ThW10\Q O?zܹ{473a>پcx4%%6  D|/}Fo_ۙSx,M9kuZ}kE1< 7_*c\FMrUNUms?-@>g~_T wn#G֢u[6]recyTY2XND{0AY(MhU>U( &Y̓D62H ?Y[޽g?De! X`}c\K<?Vqp2EPLXa--ʺAJ+02@U@UxJo/!a /} aHxW>! !::<_'(2)rޫz$;'O.hKQ?Okb{C*Ro2wu7|@ʏR-. _0 }klDYY&.J^*b ^$ #OtC{n,til@ /}JGHc|ے:ʐ(CȞ\ ,U*MɈ2V W[vHl(6uD>.E'Uѣ55b^ ɘN1ӃLW2' ʥũ!Ita9c1vp <MCaRoZ r{t\V50MOJǚ|Hy0i`,,10Wd)(Qh ZRVN%/JFKÇӵo?M6SZd1]gDRII(p٬l*d$z =|ѕg1Ku)7ȟDN7D73]Ț%T9=8[aD. 0\*7rg^7axQNOIII`i膪Kv##O+\։A Rki݌ɓ!LESγgޥ$c5KȨɖVHWʴR9+zl9|Eo_UA.|\#D_Eܱ %r6mTviP;[吕ʥ JSRŤL(S=5umyQm/Yw>oS]l@=7<75qpH`Z2> RhI763sK&2O}}XϏ$HSve Ual#\ڶZ ?Rqi{MMڟ|'+_t[啿AkwH-FUqH0&)]Z4(ɬ>vۗ_*]:\1.~xMm3bR`౴_ҎG9;<'G@0/XiU1Wf2'~t"^'&N1G<C`+@ -\ҳ Dm:t5$wa^<;zWT wnYq<[ wl,Si VԫF #//m|QO=H$eUG5=uuh: ۳r;1CzAQ!YY]M7t6|m!x8Ly./N Ep z974We=ҋ|ǧ?94נ Le80fgAfr!9yPj1_K4dI7G/fgJ7&Ot}!*Nib"@؊Y"@0@Q"@b{RsOt{"@ IO>X.apɌb:F@֖ƞF4D3 T &.n:@>{`ăG"WWe{C^oY +ŵXi\MV+W+8c6kB!|=%\|Օʹf  tQx<޺&W,J;]̉jzRLڎ!aO\`*2fX6+/*ylQ +'a1?ky%ƜS?ţ9{~qRnɟއ'{;F8tV*8#imv8F~&`-ncEA(Y\;>p0:lXecf?(s=*WsT;wy*έ@\ctk1u[a$'L t,A_i`u`,XZZ -KY >`WW+Zff33Hy;;X}G}Q%LwX,ƶ6U8h"(@ p+S!ƖxW 04 @Q\)oU*pJRuHQ(]Ebr%i3J)3TZV ֘l:OT\N2>җ> nog5.sB eO}&I?Wܙfס.;q72>^h!-.jfIc06v<32< %UysHƒʕ܆@ dz<;_WEܹ5{ Q"@  |,$UU.⃍j$mҹ1c3WiKo{{Z_!HWk5?/\p8 ǿ>P fs_gȳb78][[`A#t*(֤D >iM*%5idg(Fb]Uo=$3աBa4BfA/1-G~ooaX>@»$FYHIcCUWWW}yNߩ.u:TϜӪ}ù֜t_t³2:T eaOm;׆1AAO;Ad(ɹݑp좉oJD_rx&<<| wmAv}zzvyqAY4~}hrb[ۙ.y؂[ !F!9% 4 ri%뚞|U L@.$组,-Q/IGnWeb@ڎw er.{qm13o0PvW=,rϯ  بKϚ ^Qf 衱|"ʿ*tQQmun+{j2:` 4F3 s hL\%&t xwpf<.u~,'c~6$ڃ7@_iMs PV3`ǻ\9ztK)pTQ:Y~ݍwU6Oي_@>yy&Ӽ|;v-<@ a],q(K|ӄ'^ 73==7PO ȥ- c sOP@.MȘהx% *SDy0[Ȑ fr IGДH2Hq gd8y[,m)`{vI5W_0\Zwuѡ_źJ@rt:G-hŐGRzQXFGvAA%݅0"+b( Ҕ0fkos_\`dnd=2/1Oq-Kn=M0")`O7oů 3*'WHé \Wә13lfNvh|ou8]pPIy0F}#8 OICӕqwvӪyLe'E>4ԅ!t2Ѱg+X{c~l/vSNA7[h^x6^h-,D?tʷֿ ܰ)a;6ހG ?qqhmO *r&5-s"BTUϺ")]]_rim: 2ξ4J P<#8FaVpoZE >A1=z h⚜;+W`-CWkzۛN4v_g C13cF˝?},>ɝ-tO0ε63a,̯`phޞiS5gaÅcm8=^.Sl ,ŻSS) C$ G_yȠD8ʩ3<-F-6d9] 6zK_QPQҿ?:e:g߾{=xLuvV#=#097e޻s'^ N?w~E;`GNt__@;.#)r8Q% `^drcE0۩YPPm-CqM1`NH&+S&s\#rlhkW`z\V'i֕p߀;Lq rWi-ȗ5+F\ٙv`n ҟ,@2S#؇eZl c:d31 sǺ.Ԭn\9erzON~pckvnO۲6/(|K « @\Н|.%Eii]TSej gF ]RWX-cQTZ_!(rKr=Ͽ|S[l-/i YP5zzбhcau?W@6]`xV ZON.A &w߇" ֦ F/% ќo2ʼθLE8{ KFٺ-kj+>srEΎ PF|kl/#~v^6q: ܂BS8Б`ILt ν.HB!iQMfּdLVOEۄ2ű@& h3w28)+'%M$ TeX2!8ryxs? ` o.m ojcŶJX0[)m-c__+g5aGud¼n_lii h9(X\[\TÃqusa#ay$ C׆dg5\R {P{NKiM.强6\RHYěRuּt:aɥIqLO۪3!|{rK@8l~v=k1c4Ǩ٩ٙBq THH-ynvSp0 ߞi:.vu`j ohk`'v Ɲ99_:SKMK;O{{[,' SSr@ƗV!)q!l4/59]=Ng[*1l?֭@X("gV࿯ DXɒellz7CVʩTNvn6:dS.A,m'dI}Iծ*\v-06/natSx5E魪.՜׫\ve#䋗l~+WO8>O ֦b]ToIͷ/% k\z1z=^$M Vr TX;kdϯ(+iX"'9e2nԌT$Јqa2\991 # C?1&&064 %'lkn[ZN9l䴊nw#}MEո pUt:,j_ U8m!nw!=&^ @ T0U.t *d0> +ss`@M޺wu }A%hlj:$%uuuaK/H;p(-e8/eA Z驥@-SEt rMLԁ;:ΏtD!:lZ6_(LYF Yoy ߭/,Wa XcueB Iɞ`MF=萧ڬyV#9Z D*ݞ/sssK^W&g;9cδ Y΢rg%coǟpU",*0ҫ:o{ݵjaVnHٳ/F cǝYJn+vggOpzx[[ZNMNvD`* `6PUQC&5OcOp*>*(b&'+$I}΋0:wff=v趜_8Cq|ᅟ ȥnSVLLyaNzHbLWCh;_L"x`1IQQMnni;1b:^idpc0;_F&VbL vR0c hg1A9Λfnc4R~Zk=[ڴ;6&# 7qYYB*-B 6H-+*!WKV}wĭ{,C&~|ũp-\iU՞|ܸ=>39SP!dK`{{j;6`vw7\9؟Wvigr;`V#TXGGJF'G@k2:J2 aƯ Yw]:[{jgflh ̹Rjfh}JBw3z^|0\ZfAnsjrI% 5EtXo!)W~9$),H9-QYp?nbƙ-*TA24` ap"@2e/[G`0yN4>Fe55{{@J⽠|@ô)aak,Je WN˃ ,!,EtwA~_y)) ݸI-0.,k:`&ʠU$*&uu}-ooJ|>s o40Lb{E~E#ڛ/b/."FO} \ud;&xpd97 igRgGCK0tgxΑV{K-p26sC]Cx+cLؖ&}vO7(4~|Ao3|%tIH+a:ӕ+aF̅ܓ3ʆAy?7 >Z1;x}8(])Â?mvKq)@^DE 杚 2-=1Zn-0ѺA&f4nĖP(ĭ<ŀ1/WS /˛-C_l$< kR*p$/,е|$(1)='$ffg/]-- pSW|v?$w}oI mzp,]X` :wg薺w|ohVa>- ә݆忐^XE%",iC@wGdd()}m՗_;xr+~7ٕ917[|7S6b ȩnzwcW B4ftT4L#33!Mge+aNb\_1 i3UL=8X8n@F$x瑺?v$4:YzK@."d:*-BňQO|s27O#@dlJ͚SZ41d^^ f (i1 5V)lDws<!8??+ϟ>۟]*=}EloO%;`JuIg3*ځE Foʪ&$dHG:Zʀ 1HM7;:<.#|!IpP_6`nr2g63-=z䡇~o]jƁl%Ñ-!V5>qRwNץΆ? XX+r25̙ܥ)G##U_wFOXU۬|;'#=DbXz{_>-n4@-6ߐJwp|Xu")VU._utQ=?mGaQ2֍exr=&bܲ^WY+WυuY`(?p{ J4q,>L,60-) S\SL 'vWIIۛG`P Ɯ%SBiiv7@.:`p-\s2сV0d] ]ບZTPVʹ ϫ䤆V#bGEڐ*B863ոP.bvb־.[>3终>6Z4~ d fй;)78qkހ w'΁ qRpa#Bcq1@LYe&&&H|xa'O7aGHk.aD#v>\!tۣm<-kzWTZ9;J0eMHXO򉃰L(cT%(qɥ/Ia;`0 RS:.~\zcێ[o 71k࿬L|u7_k&eeyNDfg?3*ϟ qS5۷$Te*l᯼H*.k9n]-v  E0+{=O~7%%99q~gY"/t>0Q>҃:vtγiݵX3Z44UsXk2&R(CKW0× ']Zq@_yEV߼q`'nxlu-H6{ۗ244LX@7 Pc$0S,F}tΧl5օUprʕ=0']q6Vĵ! 8ނ4{-M͚K%c P7>:dӳ\k_N ,(]!>8vsDPVGzcN,w7t1;4 uhWgJAGXl*8ű5'?H//. Bcht͸:k fh|7S]:.) Qu]/*l.%fϾp8yvS-c9pYO&N75] (4>>>_q: }47o2ٵS߇l!YiwJWXz~k[X Xo83FkUzdq[m\u/Vc8j@.D$Z չ8$3g2`#"|8ĥ* jG`.&r ہI'3Xy* SYh\@2:/˾$vCs;%&{[zɒa$cc޿|\nB ­9zoYXGg_OS,CQ[Apvc &:6B7, G5وQ?Ͽt>-Y^<4B0NBKԕIФAU^COxL=H\KR|C.<\ST_y}[wLX:,,I9djk!erI% 1<QXj]$ԺN&GRZzhhCq7P$}t|v欚zӕS  m''7ǖ.A"=tL#%W% $`6q:68FMb^۹VOμ"O=%P_T[TTSb*;rKrwU"jYp4X% Gcpulm_[5lA9? #1[].;ChDXV& ]mI9ggU,t靜ԅƃg]pOv3آ3DH:M|u8<DvoN@.L/VaGH O: s$|֦v}z>֯1k~XjKZgN[ge:lYX)>,ES#4ed3, H=N]b\+t ==~,Ǯw~0p͐c7X0ƙ-B He H]s8ʫVPPYYZ3 @[Eaֳ/AG#&ۣf_2X Dp2}/wWn+RiTa" 2fU(Ӕ|{eEN{-1_hsLD,#u"899gVN$dV4gU@dp@88r2d|@.D>g^[։5T% YEm"`g]`sNK\ZYx"Mz2e`cW$~fFv#}# OEdl-rN؇A,3&p wZ! l\_''&K/w_-ϯ꺄7r惿ʝ4?t8 +i@ ?iI7d q/Ay;?Bo0SDW2tFQwhi1WsyYFv7l|/h=ztAMVkxas6=Eї*kV\@_A@.C R*aeV+uM#fo!'B@FlbL3@#9ʄBL @w~LdP:qfmh U2Bt|͙S@8?ʐD\Lex_j 8V(q /_g)1gfz'&{܇#e⾻ߙS6N(4k($UDF'!χqg)+X>;??Ñ3a e ~X Ɔ-%,%Deq6<A|@\)IW"DpX>q|pLFI)Q>臎3TKvqyw97^K$2j]YeX7= -՜䢩+΁o02d,2\R`A,_BM2 ^(Y8uUa@)iv)d8!?" rII@ Ud4>3p/0fhvnvjzLV.R:OervFq^:uZ(TWm<|+SUEr퓹a9 z!TpM֐)Kәff0< ZRIlԉ 1`<>qھ^y3%]i@a]E?q5@E&OYapqz6'sDlJD5^QL:|̯i3LCIПZd'e{ȷTYYF7!e$8٥'0ZssDgZ{̘aTT2's^kE ii2Ԅ|GFcHMrq++S|761851_ΤW'`*q$Q@QQu ()Z\T,-D_~lQB$hFR,'/Ga7Z~ys <I] L=@;llzrX8`vQU;;i\Q.BU_9t豱!mu1Q0.rR4M9b> Fe`Vs>}DtGeboB)8WUYRvqy-sS H K' 㯜pcD@Q(avv֤_)zvh#3PQjdx bqqmVV.# lnpEte3)8X4MDu&'&G{Gm6ӎpdl!?#K<82D M^;Aܒ\6RNy۳/ φ+y W_X](Pk#@ P$) x 08a2D@E({ACc2X2d]42}/n]yXWXX*k߁Y>JudT߄6<|S%6CfN#Zj7| [nsS H 2F޽9B֍U@tM}9N{2_Gsc¯L?f]U"\ȴ(,%(=gGtbMS?eg)I H),f I&rb65rKsA5NiʚiP-5-k{̇ԃ`\ŎSzH˯[ϴ^z`;s2` A_0+7pi,'R;.t|[Jq ڦ>'@r`~[q*WU>?xg5@!-}PhnLѹnNfjHHNS>b>) GHYD/g[5󎈺F_7O}ܳ@Ϝy]@^֮q$N@ZGs}ѣ?s".a+A)Ԩ*"saW< Wq 0v? yS{hHKݼvjűPatnBYkktQssarU9ngj1 }1$T8݀&2;+Z%S3ݙ@/h qv7tjPv0 'Y9,odG'Y'$]It~N` }d:m~=%zaB]chGS Xz~aB.tadR<'ߍ*b:YĚYڈ@HL:{3g 9h& WK ȣ>*(E)^UM.aELӏaik4+w0pd< SXcBNz=ܮ})=# U[r0bcĄD,~i/O6H %;WUU'8t+ пfoLco0/ GI]-[WdPa'\bؗ$i]>GI#ng|)OhbYl2lu~*Vv+z:6kef6,"ݲB?w~ڋ'ԭZ@g@^ WK 颢1DѥNpCTyP1ҚF`JwܭK1`8쫈:g)•Iv pGW820.yu 1rgfze$Iz cv@$h;%$y~ M baq 7b#C0y؄PP ݮzB (9%/ULjkũ HrQ]ŗRPNqcxF2uGc}sYB|d~|ֹ*f:WD=w3'dFq[2זLO>pW<ΝxIfr \"jTZ XuL'>APOZgpXI8eʕ-{>%F#F8A'cPsA$  ʤ dz:O xZwm"=pd*jz:5)9NY0~+!S Lɦgv=S:]`!<~Ŭ{>fe؇7 2 "L®2-$=gBa~,.Sc&UI :95PG?},,X'yNՍ:[*WISkci!X;v N4_t9zJGIGej(,ڧQ{?$5u864u^VqH `"jI+ $+nU]i$TN%^~wS( JZ*cN"QZF#!*3Y+qiŀƮJB1gJD=6bCWDaf:+ m;$UC>>fᓊڝ X6s<_<9VPDvzmI+KĬ? d4_%CJ.:<7E:6k֮t#A5<~zNׅ t=X!,E[upDr "+h:ހ7El-KRv(J=B^lVHdNgi0S^hT :33 ~I"YAR @x-13k s !aEO\?IhlΣUIY]GhrN[2F!FuH۷sŋgDBF76kD$32㸭#iL igeVw֏L┚t$ڜfb!6=ppT4+dgjˏ &&, :vVLfX0iDҲ&1zꒄx]챾'Eh]QDsgUDlD]J;Z>5aj} z7VD5~KM!Eg20l9\8Ja8pl!FX=ɛFbļcb٣k.I:v[ ֛Ҽ9JD_b&cV+T"ڶmW/]:'i2\sYm0_XcadX}%׎ܮ/겶礵Jř5eaq[ZvHֻqqIDEpIy aU,hJ6v zZWgpҮ7GSźCL zV|cVW뚥1.k8ܺug/_>/ 6Tk.HHay-[v904Pݼ ̺VCCCyyynϽ,gS߲rU4r{}. +MlZSUMM rZ*22*cj1ڪO*䢁S/\S7̇ o " kk.577 j-ȫ 77 2SFoSfu-D@dKʵk|Wf rCdX7]SJ۹*Wِ)֚84 k?fXWٿtJjX7BƂ4z2ZOkk04P@œZO[[04Pݼ-7QSJ۹*Wِ)֪8:  H#Xk!*>mbـZ߅^bdiddd12L{2%FFFFF#D@TG-pH-?vl-L6/T@x7Zڔ]ԥX(‡]%97')ɤdy%u%)ILM'M$ו^reU?ollsd 1-L645A(F#hc'j^TuQ|@>}zEgۻwo̖@ >##z֭;vHKK[uuyk{5'8?{'o9ɌO ͯ+^l#o1ȠPn,&Tsm m ޽l$v.4Z@&Zrb)-s|<3{aһ$X[w\22N:ېW9>oLi\8t؞Z;id_?̭@L ƒH-LX)Dj󢀌|>ӄjs, {abv$pIX9>T~?C 'W}K;d ԑgNM'}lI`x/ǜ`#cG;TW1kŷʴ),1PmެJ]t2!tnL.][] |˝@… :8xoovm[xckw?2r6%En LgJ2Gz dKY,ʴXmK6o)֘ӽV$x.J5r5?Z|'?OƤ2)Cde~O?b2<'^93c =+SIO賁t5&pN&leKd'&hk=hANv5MM.]*y~w7f SDウl>ǃ$uEӊ{կgהG?Utdҥִϥ?rF{bha ! Ww@GpmmJԘkZkmXXK.]&`. Z"׬*MMM@HE"~' d e~ G (fwR~~xk?}}~Er9[?|/99WMd W.@mV5"\|yzzСC<ZK]iY"}Oy|𕔓?y߿sݲ{@bGNn9s`tU#c~QL6u~YfFwp:녖vU}vW*}Ϟos|ۺwdϞx nI*}Sd]Ĥu_@6u/Qk977s|齵{/^M =?𽎑'_xGN[I&>Rˋ_}Mڣ %=3:;Nu24222m Ǐ\ }<{3w224nnh>wq>o?}CbctfI?|G=lK~+wo;ܜhHofז1d1222 @@NNNG?z衇:B_={sw읶Mw̶7'U|#[f0tŖ~^h*95MG.L vu_)[#eitF3Jpm xιc{ S^rMV-xСҷ O3W@JEqxԟvf{mdg_ҝ?=[gW"24*n@E,{FO~A=T/xR~hP95~ ~|)۴mc{lݺ 2z,^>Ak [SIWWI{^=g#99w-9YYdiuuZsѺ+> 瞋ٲQcccݯ-o{Ey]u5<33?$_.|n܊rbdiumc#mb*EhsSӋȱ1 /GS(A 6,p1nd*{ڲJ<{g4BB#dK 6kby~d9Xlͣ7zV3dK 6]GY| i0i~2L{&W}zfffsssGGuiY,Ŋ CRRRFFFSS[?!?c]Hbb4믃.6mڱcb]0bb!Clܸ>Ѝ3檫mmm.bX1l6k֬Q`rRX,d2566VTT{bNN=ʤ6L @| /_?t|bU[[[uuɓ=p8p.MfйtzƩɧ N: 0++ @&EEE/u%X,ǏVS4t:=wQ\\L+lW)Ů3zSs.%˩w:ar_oнRz3A9{.XPq lKKˁÇKaX,VuDGGG'&%%ܹsذaa'555 z4 tttNӅęY?|[dݻKB&SN6mZZZXvr\qo߾fbX cǎBi6mC c&k.:^8zK. 2\J0tN Vސsa&cW^ygl6@#(i>ᆴ'x=bb&vEl3yg&/XWc5N?د{>W[?wÚa&Yf/ )S͛hp"#yf+8ƌSr˖-/dbXبpC1-- lAygp |.`g&k__Sm)k/z9ڸ 3A9 H OZ\\,G4 U_s^|h"2I/Zte?GcjQ,ُ=vѥs~l#bZ`OLOO߳gO^^w&/rsdԒd_Cz7q#V!g`M jҤIo%KT0>S|3ww4(vߪ*gb/쾉f]>I7(İ9?~S_N;eYL9na6Y,+U__?z`Oػw/dŊ^{O=2Y}֨$9gȲqltyt쁃fwf2eJ' }]`ҥ)))h4o4uG[~ŋsخLJJ7o^]]]g-xɈf79cNw9F1mZxn7,_~Cz,x 9n t9.e\NN%%GpV%3[/w>XmsM9aw rwᥗ^?'Lt457^pA$?>Vt˺d *p\;,哢Iꡖc#?o?vϔLf6ow}< O{3~]9'y} -7%)YX9mo˟,aWd/^5랏-^X?`,^sM=nQzKu@B7F NruSKu񀜎׽m^ cGܸs8Oo|g͍#tKuvwz'm#zEKY-o 2L}8}r[򗝸-%QJL쉐wN۠?qg;6_yob$9eXiĉ!,w1dȐ۷gddxgiӦS;QTΤV}]t]xg32)NpU jƌUNYg|`Ե?Ч*T4- SO=z괴.|'^u͛^}uS{e٤ z!7ͳg>kIk9%=;[]]tԬnX/{ԩ/Q l~kWI`;K)Hَ_¤ l< hugyfΝ`e"5%Օ7rު2|@vއ\9_S{ihIIrMo)ۂ$u{;7j䍯_Wqx95%/~q_<8iWhK{ʛϻCh-CjrPECk*ɑׯ]Z%TrxeUvg@X/0N9 NvEEE7oIɷݱK.Gp|0GK7I>~$*??„ ɋ./\n_ C:i/sa='DRa/v"7%//^8R=5v4 P YG#Q-_}飛EFaaW}zlՏliLv_Gvx}'4#xɎՖ~/@֖bJӽJv< x Ep̟?at֘WIK֤!)d6YksBRXS64uGάLt \SvfAA=Q{բX`jl0.Ij&t{ƻ]0X,V8u#ǽVj8N@Y&piN'X!_bEMMM_|1 K&~raCY9UFa_o9F40HUYJ=6.֫Wu%X,啕/ađ#G4&,j C*/tʢWN@ ;Jr끑k ٳgwrժUdb=wy]tƏ>(M(L_|֜S ҩqPqĎ!oҩv>3A͝;?b],JJJ:`ݪb˖-gM{zr /եxE+*iVm_lXk䫯fX,Vߓ^q`:-82p..L dۓLP+JfX,+.tu1 Y,C MMM.bX1Vff&駟Lb8 $bXb@X,C Hb|bX,1 Y,!$bX>ĀdX,ˇ,bbX,b@X,Crذa.򈵢bnf9N^*/;gj֯O4'LOA҆¨76{t)Tp8tV6#Q<+B @s93ONJ2JKKV`iiiF oBհOGB/N;4:.6%ՅUT%}˽n?) rK+|&klU]?|~. ! RG| B%''SS{{{rMu߾ /۷',_3+\{ZB=W9;jmfKGi]rI'lvCuxQgZX1Q\mv{Jr瞖;n:tP*x7 uǏWAuuuЊFx#МA !i@O;9)7;#N핵-*Ns5TOՕ|P3C5kmmfss=饗_|6 5Ls1m2u\7;\Ƃ1qOz}C@9H]oo>úY1rwlva[n;V/,(Cv+& @ycvޙ`Ν;s[Z&M/`ر+))}8pPB;koX0LMMB AE؀Z 6Hrۦ[&L0enK4 xqV8.{YAbپ}P߽tBj!.;}sK!CظRSRz} ~Yiuuk׶͚rs%ު>X]]$؎d+Uvbϗ5 zޠ7:jsZן̀d- 0U/>SC#7olN5="^oZwK[I'ܛ*r޽;MUsssJJ ҥgdd&-KZXJ3>S|nE {sCYW^S}&7+3\~vqPe:bB7X )]N8 |O)2se`!:lmm6'cm?);+륗^ US]mU'YjokVT@H 7m31&s8_m MB\&6d46@n7\s Y^?q{'߷/5\PP?#ݳo߬_.Տg̟} o8x#SUU?),,8 >ɶmud4[?sΞ={FxHH8AS"Db_#\~nn.fq ?76 GSGxoj[by[Bs -Uʔu\^f5 ׿WU}CI'LlXۭ,6ikm-x7srr.}oyGeРAǎկ^mu SOF )Ze6kۅ uBL"OBvp|n슊xnMJN9t~?:GN?[gNގc[Egimmq+lE;d?)ҀlutcMy긳XPX=T=(5/K;MLol7LII)|ɒ:ؑr@i8gdPe[x=o/,$Y@^ͨ_>l3,zyee%<0rp%7c+OWtAU;[ oa+^]W[oO>ٜ}Pt+0",XHmm-.^8ؙBRH X8͆hWiX<" - T':kfqdtOs`?>8L[|uX8?`8p8~xNs%~o7bDeOy=W^)sxt 6,Y;:.+ ̦$Dc8$22 ?_pQ#x?w.ᬫnn |,VQ\W}wÆ fy/-;++#z_?0=xa/#Kfӫ:SB>H3f&YsDUe}fj[UemfJKUuSɕ)>,FL"һk֭A-pmOʇD϶7{WUW8l-ͭ7:sƍ>t0l .lN<=?I7|ҙ}`ho#W6qbZO@hV: F*!ƈY7t1xenmkut\Rh2N;`FXr韟koTX.+x/<;vY~tm(dЁkc=Ox㍥jh9 ZQQѾ}HIIɁ`sυ3H[G*I1UW5fY-ԶzŨ ܇-A-0Tzȗ۝W{Jr-ƣoψ#GV2jwMw^}O?=묳}~NFf/G&><0)i"8P cu5.GL8&N$)PSsO>tuEGDlDTK2(lwEpC:U4m4$''㑠r宠i-X9|eee '_ǁgԡCvᑭ)S <8lp4ĀdX,ˇ,bbX,b@X,C Hb|bX,1 Y,!$bX>ĀdX,ˇ,bbX,b@X,C Hb|dfΜNaâpuu| b' ]=Y`k͙3'w/ qUbX lRVVkN,؂#sA+ĀdEM ~.+|~D51 }xҀv!sΥMnCJ1 z3ʁqH'?.a>rn C>ɗsz`u֠0V[(R7ֽ}bd*,]zKK͒E6,}u>vH-u_=UXF%B+Xy$ο+\4n3 VҒ 4[8|et_t5FRȰ(,]Gq&FT!KȘ+>Ke1 YQS,a=lb9TTåFDYY(Ɋ‚ 乐GQDQsf|ix/x'S-$+jb@Yq~Q%'g[51 )nz(F4L]%Ck}gZ{?\TH}o_wT@JC@* 43 Y$dx_+EBxP*m, MT7n8€LX1 àl"-Dsx=HVĀ$ti6qz[D!C.ދ@*K)<|s<  ɵ)T)hCgȜ>I(1/)Ҁ-\}*zDXHܽ{wyyy$\Hd*BU BS-ӑ՟ ?@Zk^+V;w.2.p*,>JL@'b/Ϫ7sDsjmmlyGb*rDjRt-Ht`]1j:ZV裏2 S dAzf@\x#K4iQc1 S$0sq p Śtg~ިUEOu#>b>b(Xén)DH+2 YQS]jA#n {:nY~0>=*怬iii 8tP)Uvv[Z!<۽ݛ_Sou6-;;{ӦM)))cƌ9餓N?tH̀dE˂tk'$};2@4b {c xYupyAz J .6ma[>tj$|ŖrW H 'pG:1,ֹߧA$+.кqbAg\0YomU 1!N;{w3O=3 Y{b# \ZA K}Dd+\ XW5@nݺСCrV9=u⋊ʌ5  )YvDz\#G&2 Y 1/jꫯ*++/2ض6><#)SId_/3_T}jؒv߹4f<ɊB90/[Rc ($^E( g, _@bmy58q ןˆ޼ė_㏞=sιx">HiYȇb ׯ]k#aUnA˶U;ڷN=yW.5yqOg5movC~ HV\ ҰXR}݂.+(ϝqBdcJ{,P'J.[nb@(GQzHJpE'"jliiygg͚u-:mV'|G!o[oUʀdEoUS0mBS$\ +TVEO!DHN -NEEŊ+:ÎCA&GwN"ʧ0 Ybe F5@JcoVc[ '=.d@b<b@XaWD{{VȀDݻ?NNJ4dqc~x#0Veĉ T$Źb> YxU~)a$~e˖C_IM 2K R$T1*c@&M%xUȿ+)B€L@AdX@v{J@E'.RlIH RVh52 Y$".VHx.RȊ_{Sϼn U>2hIb@*b V~a0HXB&ɀL@1 1 Y(Ûꓑ RX(*g{Kiޢ>`رb@*d:Xg rТ=:w`$2ŀTĀdzxU0i' }ѹs2 PP 6] ?.V$$xv.[ ͺg}s=<1[@b8: 1 5q2 Y,Eғ"Ƞ'<1%bnAvcUr"K- ]ᯯ/n42\|ë\F"/wKrWld+dŀ @ƕ#SlA&qd:X]uÕyu֞\zʔ)'&5>l/b@v"uȘb H⡛$ RHF'Oe rϒ x#Ċwt9iZRȝ;wUz)jf H8,V@vnvӥ%@*3Nj=$dƙ1 ܴiSjjjFFFJJ``@2 Y,V 0,D.҆ KOܻcժy7y6wk9'oۗK/eggd#c]()'M@Y2.;uK(^V քumR vWp6]/.(((..8plf@&4 Y,VA@ޡOyNpO (dbߜfsFmwŋ4h̘1`D X*Jb@X8Rymvo<>v#悻_=\W%',C+d^ jH> ?=z4e@&: ٓ&kUAc.twHe։OپJ%b}Bx @^J;rcq#$Ŋ/fddc`^6bk`H[Ar>.$b Ea$KbQEIŵA Ű*o}.ƙ#@vn3 ɀdX}Crڴi=vӦM='ADڻx{ H# J V!ODz3Qk.~3. "ȮAƃU<2ZP5T_b% .&jf{bj-l7u\S%vcЇN,>Q 5 M`&?3{mW}k5Oq m1*b H Kb탽wfg9SYʇr{`@xT)9ifi]}zS= =7fv 3MbP 532!9|Xb!խ˗/+'''kdxZJ"]L7U-_4] !bx(^Yq^zV/䳺r۶mТA;B&ų4>Aȗ#H0[{-N1 }(8?+΋_ϊ|VB@ uΖ-[B䡇쁋'igrW%ۑF6Uv<1KvLRγ<.^ii<1 ;ŀo28/^=+΋Y݊A|bx#psVk#e4Ϟ.v|mTA:C}-">yxezљw1xk>MFgyB>[WՏ8σĀ6H\G!CVx q̑tCq㏹6H\)$sqm*HqU Ȉɀ좸\\$ R\U2b@2 Y,V_U_1 ,Ot8DM͢EV3+ݩӉvڡ]9eKKKUU+++-,++<^cf=T_bbzHK*3~y'[Z h| OTlINrQ؆#***F)))م799ɀdX}Cf};ܪ?q\A]k`cacnk:\lnnp\ҒXkld4SSS322AvwbbCVf[ufN9d{R4ZZ ǛOT)QTeـxd&LLFU`;Tź8QRU /\Zn,ڰap;ҸnᅥKCiUKgU$nK Hv77-lJe_Sq>+.l3^V.m6qX_D&7dò]h^vxL.^myԃHjZ ,]Sv^ʜsi?K>cF%ʦ)%*} 'cN HU]?ػ]Gƾ*]Y΀m5?͒1ЭZr7759=@ 5dbf׭~?KsaۨwN,{{ cm8L?5z76]€L@1 Y,VV@\b群ٿokg;\ztعWIKNru]aWa@&,o+pcͫo2 5Ǐ7rmiqq6"O $b%Ү{!3'm[6W8{-C= 2ŀdŹ:ϡ^g0 Jr}J+%YЬoh;]"ʆ @b- ,ܭ ($+%ͯ^Xzu7)qAg}NNA@,u[X+b@"$$+eA,U D%Yɢ=%.[ A-*!1 Yq.mAJ!]j?%q:d!1 Yq.fn@ $(aK1 Y HD+Az!wA&bbb]ѹ2ĀdX,ˇ,bbX,b@X,C Hb|bX,% 6b̙30m1qč[ac@X ,ˀ q?lH/k6gΜTWWζ4OhEνv[ΰ\%,ғawQ[K0 W!@ 0b@v/~X2-݋]}b a XX H>|ÇdX$l m ZM.W7b@ŊCa5ti=*qcF]%SOEQuuƍ'Q6/lH'm1n+@oR[,V ۬CHSv=h؈D1 bš*<8@21 {(_xjhh**b aJLF  d@?dkBbJfHSY^.+@91 bš8hP4U_=lܘ Hbk+*X-gXk~@@V3 oe$X,+V6k@AA45_dS"r )3^s1 Y8YHSWU%TȌؠ%\xqH-A>KPie˙cjc]j=ZnRR2dNɄPEH8)xt*(+ @U+AP<ɼSp#WLr@MĢFg `r =!XHbzBT=^Fq5'HW._f YyyNl*6,J@;2"t"H-sl G)`/jFfQ 3S:;4:a Ķ[h'"dO`&qN֏ 6hR!ʘ V r3* \0#$+AjA !ɐ:qKz,֘6|GH澇 dzbUk_ˆw#~!H|7kQ9#[ȴl(V.4L(8d Uڙ3YvЀ> $$)elSQ[O}~L Ӳ/ChȠF@V&!:N\_ޕ3aFBVqLc.0M19bF#a̡Ho䢄#$g2di! ,!Z]钿VXŲMn ˬvz)z;]/Po.} ҜĶzo~b HZ'%Fm2z"& <”; L=}W8F.ʝOHAJ5yQL\pzoLII##I6"BUzK+G j#AvtӫtO.7줬lt-=^M d/ #W `%` *'հ25;; OF2 ɀ xdJ@@3 *\s؂e$X9rBq-k[gl&'nU!Jf< LNsBV肃LoB6*GJC>LgF@N(^9[!"f/Bk:x]Y 쁃K G‘VU+LJJWG bIsoKRH2b/GP$j Οц_uBy`&y қ|8@䬬'Z$%)ɀZ!+dL` v;4hP[|C/=Z- #J ͢la7d!GfѠ$* M60::ڨP/P)1E`dd]}Q+V dP8'f,NL&{ MҶFb17E,^N w/L"`(kbBz#`^Lɓa:ǯ[INhjlAWxcF2 *Va3&6IBmprs4|QHȵ&G dD<+рM6 5ϲ΢kx#z/As婫3\'eӴT| z̭G`7H1ֿᷠl$+Mj!uOzԷMF̉48"@ʀ" z꩸^OuuK^ H`@jTYt2 *+1`$X6 eЂ6|zB CeaRGZAsPw }zצ[F E}î/9];(9{G)vHT{IҲ@3 XP@5*-^)BQ+d ȩۨZhb v|BzKW6[;z5MWe(*klEs96XTx;!uZ1h(Bt-H]ZZ[[ҿ"TQ#~C@b{Gfgh`H2SS328D6N꠱BVphA:4Fpeh F{T9䡭X4ShM!%`>diݍ͆nc8nST8aq<,? *%~zr|3{cSolG t4D_ ͓qitWl#OŔlS^b"_`$үbkAJji"2'0/o0le*6Vh1on;.F\O IK7*5VNZrdr Ƃ_i TЌzS(#S0(tf,uzݲGvFt[<"ѧkO [[1tSRhlW;?E3W H`@+ mib@T)2] 0c{&R^FXhdBi -uAA2hU[֕,I#=gZHSyEEŜ e+Uk}ko6hȜA`7МYW^ 4 -pdhiVlv==;Z_]  komm96Dmm_.SE^Mt̒(ȡ*fgCJ.i(ED*r^N5HU$.V, mHA @Z_ ~#4ސMdTL ;dU^M@lG2 *qhlyb( C{Z\d&Š-4m&Q2k17ׯ(9#brB[oYxͥ{.+0`I,C9@cm C22K \P0jm:tsJZJ}e++bBjlF&%"3$U݁9%Ph]y-Rd>mcxIo$fu[ qo.G^^0[Hb΢Yr9J_VLiMJ pbrR<?1 {(_ւ # n <9 Bp(w(!B#\NS`)GpŖluH Pfbzz6ѩfs]m%;"ߺ2LGdZR.*gPC5liid[PP=нnG{G.\nkSzBbYxV"ZKz  Gd }Gk644-Bd Z䏥&m:3!y d{@@0 *ʀ#ʀ W .ǃZBz~iGuPL4(1'oD PH .Y$r\QxB3Dy֦PÆq* |#m---GTii`b└tu! GUR 1%¶ٜ!!\,:S鐧Z^-K &*MAa-O,u P#P B!Oݴ4{4%8וG1J0V}mkGW)6'ÀRM;EqjN->2I>H7ě4рf}}"B{B#eEanԅ1bK( FC^4BssO4C }p#--u**%!Cˇ`lV[ZQ%5#l96KrJ)Ŕ=Nak<5:`B(˛H`V|k[s[[S+@œuU]uTjLMM/,Y)7t667#3**eR3x,Fĥҗ%GP.1|Z 5YZ=lk#'<~A);Rɫp@0 JN h 4 A%)&Qa$X$$l?y+]-[+@fG2 *ASR F {LmQxU)<MZK\R7=&h +hBH=RԂV]hU?XTqT\=--0C)Ǟ:loG+USEpGPPpСC;m6 * P[C|6kxG9ԜbHoj]JB:yF2 Qy(jt(:&#l Ld@ ( %ւ^A"n FZ:G)h.ҲV]/>W^HkӻvP$恖. &<0` Y0dhCMt6dgç9N紻vX:ʎ=vlkĈx Y\ pP  ۄ6=%%`p宠plΨ+=6qyX!uu@V0(opE8g+_0x&/W^Wt91lqǟ"pG`22ٹ MɦuU5`Af<[Zm6k[[3pNz#Ld3\o\ˆ6/bS/s 9w8"\ 'L<;s@&v`d]ةXa[d $WMTZk %mt:-AM )»]h]qs%/W.@4Qf4&Jary.i$ OV2 ).VT`$үbbEzҰ: S܀>E2@%=3b,hj6F),͂0#ycƜ %4V4jYch۪ak%PF#o{Lղ=P #b(u8iiYP຺2y(dСc_T__y&(C~Tރ )l)?.WPPSQ_]sN5_(<"]@hˋi =B]D *BzB._rN~1;QP@<>0 ).V܎ %1  ȸd]5W-<ҟ}d@UlKBBMz SSGݧr/v!qEbԺt@Td-0G8C:Ȝ7xHl[F VWShT8lJXAkkScc5\@Fr:8-Dhba-vl[Qy,H52@RryNOOϖACG3{sR2 vqcO:Jmȑ]ޅ< hĪA7j4W_=Jr'TA^VĕJG i8+n'y:u!< Hb@P H- Gtq5m@ ?5If'ђX\h 9abQTRvЄxSؿ-'`P6cYCU;VV- ڛkbZ-i:SSD+BIjC6@T ̭iKVu [*4פ$ m!=0A ilv ZW7)}`"pc53 7TCHzV 2%RRT^>(\LY|6.'35עCAze q%~DeB3e#  Ȁ+*dks+Tm 'ϐ4&c0 `鱍ÏNT,r b6ggjq %X&.:&G%,b^aP6K`Hnmݼt]B+JѲmd$/9\d{OVՙkL翬YaѷS̝NL&; bK>Z$ݽ [됾>@VzA'};Z*ҝH~<o:90*Cne#NcC] $?,YW|dts`̻tR*=τ7FrnmT*Ks<É`bH\ BzM'R z}t3 ̚vvӍv ~Q88~QpTᦸ] fyd>DbTp)clXl֘q;~!OeYA 5vփQ5^\Wd.L3̽1D-[ nwR6Frײ RY颌S'ic&eY_Ј5Ÿ`X-t錃uNxO9\7慘CA*[_}f7P9-~(ږArxx-` zsgz])v@JOn1! d̕PNG(qJ4$U MlnL&gfNSFGA@1CCS#J}y\%Z@\x먎VͬNL@*0̘TMHj4͞%st&d&dB:L#;vWK Gٵ􎉕=ȾuJ Ȟf˅c:V w+= U>@Z}d#5gj4:3v:nܑԌHdß%-|r}S5uܛʫtn0*骬r9>ǎFI˽8B DXb1l4lS$_;TǏ:tOzQ^35|e~J@mӧ?8utCf-3wmYSaΨ„Fk"=`^OT޵5DvNHk\k4\8)rkz#kɘtԠBϡn f4i7}v TmIkNpzJ>c]%@x͵U $Mx޵Koq`4jA}#Up CM@) &.-Z=urYAڀQ#/תG`^񦀅(}_\7i h$nPUYtd0$Ԍ㼅VK8؆ 0,D5?NCv M&HCb.NAR b{ƽ=C $g5{ 4|1ʮ|ڥ6K+աw~=G(ۙ1c+@Nk5zobݣaJǨ᨝ޝgv& }6AY3#Kht'ylro] dOkt,z[^~뫫7-tQ_xG @":8 38Ɖg`xJ@,_M6qKu7<2k %ʥ'QUĵ8Vj)+ p4BBVP1Jc$ÇwVVN`h84N;ۭ3wMt`25elw&4V8.ZOySkfe W.b{AzDrײ  e,v&eT"M*+o1VeMIyrΌ tHaؓH|O~x>W~pxmbnu:&_t y$803\,fkK*bD W+ET!@7U۔&,r ɫ#թH:s`*;G+94@{=4p>3>t㪕k`2@DZC[nf%qh'w.hS&ZЯB CٕHl"l 4W죉u-d-S?anrײiR4aWn:;w8cjlː9(EìqT˝*,#GemV.#{}8! 4օWYxD1I ȩT C(;nl@\"$)LɷPbuyݎFNM:bu. 4ZkjwbqۡM-2K8hVN#!ƃ~lj8-|4FGFGc%y.7p:q;dr+7hDƍٹ!o$4rҼTR{Rn"n^K]}P4yTώ}}b58IW3mɗ41$s 74Sb 0`(!]Pbz=q sD"cwKJhbH8B"^0hMAcE{X|DfX lB>S.gёl26mlp0Nk (|ˤptR(dU֭Ednڡfv^,6H*uCg ΞM7 p Pbt̶B2;Ѐ. qg,qՎL~4 ;XQbϴG޺>@VzA䮥}dBB RFrײN:b5Ӣضm$:SIV0oHSv ]^imc#G @tj铸8cFGgģ@o7Ysɶah:66 hf8QzP †%;f&&Q񺶚[9Yʕ >72+u o{2+J>fhv2cxb<>iJK1XL ?J&on;* -8NxT%t MUeqCcc7@I ZmY?RG+@Kyt6Йҷ3_/y^K!N砻Wr˅>r xd 8ONRtLȚ,Fhv8Kp:z[}~&~"c8}GpZ" 9r䡇??+|̼JYztddZo 4fhZۙf*,%{ XP9\LD̀|okwIϏ6K66qOIU-W[֠}?6ݠ* v`]SSNgRv!]lIjWEa ݋*(1ѧzqK-ֹR˅|nH]˾3HuH`v~0BwUi̘!TVৱC|G1߾V:rρ8&W ?TJg`[>_R(B/~I5h/ě./],f>@ɣa xqҦQ m抙bh(DrZ%s{|ͱ{zd֨CQ\+qt* Ю @h50N 1X \[^4﬏̐9=#l&8zz?Ϭ ͽɫrqJSs:*;_%to*e++(e"5m+ k})[X;@=<#GɁo&XIM=w+?=J[)_yci#>k8GcC M-U*Ph8`?`8 R #Og4TtĬ7nfoɔeP:)Mxb%IGB :G.7˯7lP)7`tvp#[[-jJ~tڶ;ޠ|:*lv\. y!:mȪZոs(NݡԪo:ݣGV='h,@61=J'=~:Q*W _[[ R#TtJX4~!0X⹜<'?9wk 9;Jlk4Xfd\Xz\$ B<ߤEcT6'y<~N]Wy]=dbey7QwԹ\#&;Q%|5tL"k3/av8`%Gσm&tDc?9+%abNF 5ccbWzLY^=@Юt30N&ԝthG ty].Lm9gn3JlP<:Ht,ڭШ4*)4]*L9{}P|t޳|.X`n/Gex,kzK %b`D?s^V\.#s @_*Ɯ{ҝZ}"3[yÇy兛W?k##?oҟEϮ{8VKpAѸԸ4"ڋ+m,f/mED2Uv%QipK@]!Q0xGp .LJjJ+@Z[þ@4#T4ȏˣc"n'REqND5Hb!l xP&ɥҴ2ԕt:GZ:IPT|p"0K$#d  +f>/;>> eX'$+K஖.v.a}ܭ܋#kw=B psjwTx~|_MӐCΝ~)ŋϓ_{xʅ WPh%1hoєљff7$r9oKh$iA`>toF,[+\-ZIjx8 qʆe+<SG ͎B>T߬5MJ< `nՐGTRb@] @A*J}=f b S<[ h(& -ʊQQ& xv3;_eYC:{WK O]k̍/<|7>~ 9s^9)?#&={ i(#qT5&*Zȷi%e:BG C#h:c#|8vh|8MߺI\o>aF%ۥl1(gն{-Wp8\!H˪[ݎh\J# t"qH  ʨ\N--\CǦ '<t Ump)KWբ艇bpдK|:v+X 2;5ugR@d4">MaX%ĆF<Ո@22l09ǟxsO"Mf8<>~+tj]ΨDm0fQ#A ̪c]E!:ԌQ4bkbvdD»_|/hOrW?1]r/y2HK|o>@WR&SQտԿNJ/dxʞa o$;UKaci;jerVjDgvpT(\B~Ϟ~_p76ng2=0ॎCgpm-  ^v6(ˣrĒDGd/nHB'{Vf3NbInWtvڝ'Wʊ\BLv<ܡT4e|〥^(^RB6MҟF/S/i'gXH2J )CImr? 1jؘ2$:әKYjeF}P!f Gl&GY>WŮy=ȶ!JʛʝK{ܻ&Vбob^޳7{LR}cT[ O֤VĪbQlSf9y MKO?#ULzU&?7 C,6V*E*xA.Ե GQ!X0.^vm o 5  bJ˜ br5AYF%Nq=2˃)j#[z;C{rB < E V8b dv}6 .FfJPL^|F8x>d0MJFo )2T&8"$4&|U_'5 MNv J\x&&>wp'/1i|s_L {챟 MyoOWw\.sa?L|Hp:]f4tzaR=(urree׵Nz؉Jr..^)>߿·F-rLz/ CC !Ѝ~J,WZٕ@t D -4)&)LNǩS펌DĄ3Yʸr\+hm 8@FKp&f bj[YTFMԀ-Jp9["š ~E 7qloaPmtjW&l@UYȑE\]I#:fe:M@Ut*tR=v|.:_$:0JN&ׇYVgqwpYoR].| .30;vL#ܣb}f;L ۉfSZul qr?8sJWeS=0x_UYvB@qT:8$& ">_g%K$ :J;buQ &P˹21>t \2cr9Yʕ@&rr)Vq#)EM * %l[7f,Xk¡2YJj>`[0d08qqPCaLO *-zSrqk+%ODCx\Q?XH,TE hINe5]mi0_#k( 07ٟ ~_f sAtދ?%:M]{f;@Rܨsׇyuݺqg=gGN\Gt0J4:8}|^y6<BBg#j=luc6k;C &@H5%BFyGY1oQ"T?ӑKr _O&\xNg[{"Gn< ogov ٫yas˅ ح[bŲ:b9K6suR0p:tbh='?<kssi&g{lvۛ/k_ (yb(??7~"@A`XNMd$B@j֛Tz-h+u8pR$!֠m0JڔJ@WP!O,~fPƝq|dfJ8+{vQm/kVh{/ꁞSh7'@ih|8:q۟ŷŴ/>aaNK{w"ǎ?y<7,h*b^[f7p>6!e^0x&NpH_4{& ۥ @+@>Ȯ^1r i|"2T' ֌c_2p:mGG2$Q ^O$0'Q(,jpd$ 6J*ZʖHm>DD )V8F U*<^lzHQV@ƅԈ%U7;;tg "pQ=!5i)S٬bqfQ-9q.[_Xm ɤ/a(q u0i#ggO|@RUS9UTC8mKyPsAL#~|NU@+N3xz@kd{!kD ϏHN w+lɪ]ʾ$ф{SuBN&64u_>KNpՇ\օ˗^X]Cgpґ R)hy*Z(#]mm{`F@&уOi)R 0s1`| KTΕ*ْ^ @FCFq3sx'*a18j`* 36C^ɶE$VCZH(#> DQY>O'hB)6tj0r 1hjS8~c#tfxR1b ʲ2~Pud` G[m4,͒؛]Ս.>][}tT}R eb5 k3҃_ v-Ǜ:U0՛c'/ 7_憆0b^s>_0G` T >rv ΨLnU̎"!@$hE AES-e-[aұqC'őU? - k[BFa >Ȇv Y (jUުx50jC?&$pZY樳\Gd Hb5~f~hDqkǙ+nn.*<Wrzp :p2Z,/@Kt%sdJo`~ = qV'Ϝp|d]ͤ-_b58w}~ 52L|s:]LmNMeWm ĥޠ /uq9/҄k?מ'= =]J Ȟȗ_lK=EGxdw{}^HFtc0m1Y SEczFGjHdsb&#sJ2i'O;Xx3lpM7 wL tᑑP4jL=%_b@!Hp^k-͟nKjEt(F ~O(rd*q ii7WFP)KE"_Hu݊ۀ1ҸކmBUg&%aXp,fx"4G:]j[VnZbp%muӋ{_䊡\,bq'xSx://)cWͪ!:b9fWېQF |ʠ++n.j 2O4&VZT18ᅢ~}/}iZT (]2&җUF>MrYșퟜ4{kU>@ZzA*=;KbG*բG~ njIGJLF: G Tb:pdvhjx[r@{PhX)-(xR|x+% 9)N}ON@ҙJ%00 @E`^y9.<%ֿQ^ZZ;5٩/S. !x(- @EP - `(Tc9u°W~mM!Y I -)ft>ѵW Ա+|: ~?ƚlv38~''Nlޘ2<|`47^bp *3Ҩ5pۃ),*tbd7j _X Sg֣w 9n*5{}^Hmj;s+R0Ð5nUj"8Fht#fէ?Y?L_9n>LfĉǧOL,* ƃ3vJ$G3Fa6 rDAj-̅r\L=yT]A#.Nq K8jiP T&`Ɂnt^i4tOe҈]\NVqTBzIi_mִ>9^EL\2 X\izkl;[-mRg?{#?4:׿A8"#"̭\LDC2[RɝrNJN+]KfL)@ja=ٛQKE\4^A9 y!g{CŹ7(&.? # BGh $o2@agi6 gy*feq4$Q!.m9B(Xc9WUuD}N+ɔ^"#6V(j[6Z&j3y[(6Z_f#tt u)nNb4$W܎̘I0Lml&aсG' C<챳'F}:,Saxծܾq5)C>0f22BSuLw_M7), _|)@r>@g.>=#~KA]>@Zz hs:]С7affEG(Hz/|Vo֗`>Q&mhZe贷%+Z0uHIP! 6CY^JW<91A:P 8,b͕p>=k@4rS*lv'N:h "G@ڄsвbTh?ݎ TrdA`}0a'h3q!#ݫxE\4Ʋ`}y1Z!V1g}pטJ1(O ~yhh*c}OeD{ɦY2:Tp! bnՍ.r+@ldb)ٳQKdfLȜ2H3ѨNLMgnLJ<>/|7WpҥXQS_&YM`Ņ: Ge .ХjYfE[Ft~!1 x D(8J|N1"v! ;$Qr$RVV˕J>+D+dm\DQ-1y-LxKtr^1 ),%e#nx:=j$n@RE]i>*}lQ9V6orMGpLf٬.,_|s;vkKGsrTV~52:= w{˅Q}ܽ]>@Zz ;MV?f"`dQYiln.b:;qSO{s>Yk GhtNfgzÂ=x`L/ Ǐ t{ 󗗖CJϝі=*Yg;ۃ @~wn˅:tPrS& &=*HILp3YL`)M49O1<&OL<:O7Vj%CįE0Iªڞ4ņG۲HAQ̒Ն̤?38 Ţ8(Q++ЂifZWZ]H~`~G 4$!\QBqwJ`0#:L?Vf-c"@xYԘ0'n(sJh5[liVv"wqQUY e/i0Zt;\:r y1bR.痖ҕnvDP1'N<'%=8$ <_pPEW%N8FU?NӅQdV~ |VW<nwd/G.E :BAY l;uNM,bN.8|Aw|^z!lԢӑ#yA1*0']RM-: fpe( &qI@c*)G,5|aⷢL>Rdd#qZK5 RI ly>sg$RiZ3>-8EO%S+ ;H X(ݗ)Cǯh풧WDD ,Y*u0'c]3瀔N6Y9>#'W^x[zutt&*J,774LAs+M`vQ߹y˅>2{,}ܵ}Y.~!KXsXbA95iܶl܃` cnovȔ'UWoӫ[[=jI˺ᑉ :ŋT{pXn2ux&Sc6굚'0-ACCVqћ$`Q? LS'~7jG\jc{'2-bɬ1."АH*h;  *AWe͠)uHƫ{ gvvf>hd]Ff2CDCTk1,0;|myE74>1qr8$:rpy|^e sf(+KMfc$W#uT~+" P&ćlB8`@\tC'>̣" wq򲹶}()zpLɼzݝ"zGg w;S-n>>J/* ~x8阝Nk \q~0.ⱋd 36v8>>$B$+^M3%(E`T|p5 06&[qįc/έnYC|(`d6d&^{@p55 }T]soucGG.jf@bb {JŊlraNL<>+ uڵUdJ,Uw^xq< I@zz57U<'3hcjRwv`s4`S(h#ViX N244DE!A+&*Sb1{kx1j?!qq5ޤ$T3RI[Ξek se`F~_G, ĝn,//N<>Ƃrc%K땵B!'+>VJS9ʹs=cJ:z O/޺ Lmcr7/aU@͵].}OylLw &=*il\Ms2BAN ULa'LoDbFZNX OpTtK+G(~D3q*lڤHc^6^Tcp2#N;ޑ"&Iє!+urI%:zp:c{E_ܯ%1v ]p l-Fw3.gU]1tob}֭ucH|f0rJFO }4P`cP6R\^Η Yv9H(urW̉ :Fl#Wi]2ɑjq0Hg.׃V:߅96<i墤^u`?| F^SYlFUr:M 2u@ :2[H^dT(8G$?)ݨT d!11} 4vr\j0/:#hcAS?29d οh y}v(0cD hk&V Q)OA<~}T4% t!Lx}AF@ƙKkxm@n@#'|PU:TRD@;1RqsҢKfm<unym&F %rY<& L]vRfq2^X'i,y#FU\BgƓ^jHF{냸.=܃ @~.~1Kx^QɾuJ ]>@v+ M5*]K/?ʊTE Ç9v틘v|k /'ND h08ђ.p7; 7heeiTiRh[ OFF"5!  JU*02[$>$t+Q:v_eJd֖6OJٍl 1*nT-/3u"WZ~!z$S`6i,k)u戲 bJDX- ސw"P džFA/aRpBw ٢mX_Z6u`x|R|ƋŌ`Gw4Auv0w)jjS?L {9s($.H@&9>~(jx\[.RK##z|ŷ\JX;bnX@jah#ȟ?td+K|fۯI_l{z%hQ 7D0L@&*r9J6M%WA\BB_# ZTdr@P8iJ%1` "8,Hob!Q*c#Flh@堍NN'i drePH$?1T'`LAP+x;]^{ZhEn}a4Y-:E% S)vQ"1,n EDswT*Vx}F]r]U*,p-@ϧpps:r6>!դ rqlj5ן|C`\?@ [eiJ/P>@Zz 8FL 8D?wԿՒIۛO|[^ԏy _q̔/#f?@U-QhFYШ7$>}=S)A8a@x<~@2*/A&VTzW>\Sif %ϔmzâ$g_p đZ3 / 7kmY-ƕ2m$1_)VN(Q]K2飨8K*4|( d{-•)\l4C)FrЖn/_>8ښB0E(Ň'Vs  #+7_a.o<"_~%j੡/S)՞9vȿ~j ?}ܭz HA#4i>7mVoUYr["v{o:B.JASd4  U[ vvf+`vfM<*GԀOl:X^)[BUAs^q[ r\\'p-Bbם)d(2NpHsa\-!`T&y$J6N5d->S #/TΕѱ|VBYH{xRnm'ﴣb0,c:a4 A<#"soA7J41ϠiuMwwqFrzE礪 z *5|`qoJ[5+W,/#i:~ne=YkF0;ek~7Pdf? CN;[k=pr3 , sryVs>12зsP7tΞTyoE%&ֻXzMUx 4kht;^fv>w 8m=m߾Pz x1: y;dwڎ+᝭bf9<:]̹6C(ՑBSo5UV:SؒL[l;m^3pֆťv22+!5M-G0'?K94S,ҋH5ܸX7[_8c[.7;,`R>ipt!]=^;]bv-&S^nWR`mhrL7H,(-,GaIoSB~k@o `܍| k B,e:PAWDlIMvv[ޭn?pREPn~LjkN"q8v|.3 jYffN n-C;Sty@\ljjyc#/Sa'Xi3P+bd.3-Xzhr≣~O <~7O /=lGX&Dp06D+5\Ryh:z`(B,Q(%sK w :RIđD8Ub1\q'ȼ0pfYb|lO,$ry*]jYԈBGfGz 굋].U w/(dKsk w-=ʘn?/.¯<w[߾7 [f66;{Oxl<֨73b@F>v6 iN`>e pЩ7,ߎLTPW*㸜h)Bvm[̛mWh6+rPV\KaGi˰mnyY+ h"O X %}0 Fz{рQ1@KvQ$R Sj\r]y]H\D@Z? CeF. )sK R~vr(4F c{<8ڱX`>uG2]U߽v}%>@yeo̭}ܵ@nx|  R`P`h$2笝˷oK1֥v= >Db  ;mQ4KqNO ~H̢_(׀ЗR|vR[ܜ\iO:P+Ia%ׇD􇉱DL~ꤡJjqQHB0+2uNGn[?Pm2\ :1VI6m߭T@a0H` Avͭ-b MTcpydXk׵ TZHCGѠ4n,fFN[16rZؘU*E9]3eIԫKkkS GL&|*Wo{tȿ|.~3{Y~"FM{T>@^ȿ].#>@^i){@"k9;oERnfamL ڑ ̘o^ l d8<<=}'<WF޶d&vQmm6k 80.Vzːo[:SEiQ&%[L E~W7;U+'O[[Iat씥.1zrPTdIYz `= zZ'2⢾ծmi=.vgǦ]fTt2jTB-[-KtaK\W Uj6wXv@)N =v~+Fny`σ@tuJg^ohrX$2ҒIk=_ we-Tl09Q*UQ;ztW}V>Fr#)xvY8>At\0ѷZ;:AnןKʼn,Dždj{X.*MО6nM<>A5 Bh^Gg#v 0m' }h%g…n:VLó rGkulZǥh* р7Qhɥ,~%A2Ip1Ӓ}>9Y w<#r` ]K"ں%Ec"QOirlbtZצDqBCqD3ߢ8-J+J ,Ң,鬝FO]I 4?|=_㥷77O|%ˤP:4y]{P䟿F ᱳX@>R1+a>1qP&ͮfŇ^/ϼs\ׂ8e0]b~X#mfPD*=D\NCM5:: ft͔ƀQ86x{8[Jn4h $2L+= ?Q[~- $sPv# %ɜwv2YX K3h97)IcG69.ȼ YO~Nra.>@Zz ؃H8w`0~@v+'Tw#kꞾ9JxOrKKö\{nc.G1? 6XztbN#n?˯lHZj7N=1uR@L0d  >'0պ]3!o1ժX&%c.]AqZ.6-mRJxMkO` sr~v \\(2Y>_OqC$i 6z lp[-aytНǸ% @ jdaH(P-rIԘדKvZȧfX\i1 ipD+7o^hn@r'j~_z!AF"ky `z_>L.80^/U\}7~T=g+ho?v>=.;ﮪ3__ǿƟGW~Ouv@:5sx.0ҙ)}BX&Dmfk?"J70ia @rl{t4&G8r&~%p4|jkVinoQ9lDI@Z١TEG+MW*6.R5lu e-2ܑPF(IK;DQN+J^(*ʀmZ6j28`,Xl0E%kl:Zi@{&y.&WWoJx|RŢϝ8D4:VW|>YDƢLasm=ztkk2z XTW=Q%-A ]}VFr#,s+hllGatmI{vcaR6X[W:<=◾rϮ .Nyc1}U9u'˒`6A`Ͳcr^vm",h0b‚`0``ؖ4N9TWΩw~ƞbFUתu;{n{#}oP}tU? <;1btIߘ:K@HJoj,N 2S36)%蚨: (!WOqn|b%9-6\LK@A>)n$E1XfZ`TUdf"GԴV쒡0T uƸ i\RvłRB"Pzڶۊ!X:wrl*S(d0q%Q:98\]W'&'bOÅ%Hgfܧk?)y%],3j |:P;TJ@ZɅo}ݪ n7vPk4-.W@iiÇ}E&=떴 ¼ټ:ozVot~~~POtY!o}׻b1_7л~*)Z8< c-;]-2teQw@I%RSFv+o) ;hN)" 2; 8M[*g3RN5Aہs:&Yi0c3~giK*b^:<|w8Kio{@AI 2Jm0@Q\m4M.׋s j7%T/l5[(V@^oWbXbS:zb6HS?s"g6 UsdS|C lnVT/4FE Vvvt Mx LLtr.-6$\q^\ɦR`kk3u"E N{z8&pU겎ë5;([f_-vxZ#C8·} nJ+[ @Ngd'Nv|N^/#qdGszwcaV476}w >:/[7>_u{w~{Je`'P-?YU!S-W'p,;5S> N:4T.6FY+E?Tm@t %.%ȥCf c2wHo*,#ck, nwTt]0)SȥYugMcb" >V)IaBY K aaܨjbch|@QEҨX1e:$ҤV8W$uwǸ#঎z]b˴:x5K͍+dX_r^#c==ֆ~UqHpf s() !zjM|ΕZQ*Sf扑$\*u"}q&e(iv҅z<.@k.Åopzw^&f %/>U*fOmK5bmi7x /{yoFM>q Ç"0(għ?rwn > #No7 bBHAKq X#}}RY!pXAr|UoD cLC!AY)W4OMJJGǠ_pnN)? `pܔNe̺Y $ӑPfuZ#]:q\Hww|R[IH&\I7u2APCC)2ŐI[F ௌEg=wb"a$׫'rhrLtm#sHTIR$@`6P'Wua 5uZ'X+_ xo@8^[ʣϻƞNm-JvM]a\0wZdKvFLe!܅e]Ōg?ե0r/$Ptz JmS:.(N8z>҂a9..-.\RPoo"pl>ϏGn fVp=Ol]w(smo;NY~.'Ͷ;L5%w:`o\C][^]NjuAB}@EP5*y 2&Z'UM&O9vN+Z;mkͺ1nNf)Q:_T 8 % V̟tI!'v^84YJD4YfyD٘zYjm843 ЮPeIO Fo14y[I0K,:aBo'`i`fws)lۺ"h.[W92rrBAS40l_pE{AT*:;+zlJfsLL2]_I)O$61v]dqÕ9<[םztNd A^eh_>oykT n|0țz-Xlr-YÙ7Υ=pġtGLb' G7B;{fnñzdʮ\qw;B7C+p0[x $\>|ACc8@p@*ӱ@P&GW+;m5TʹdpxӛEģ6@q$)mX937SӅj6}]u9:ʋb)}Aykc s8-8Dgu5;K&'FK3(#' j૷[:! _$x.Q&|"_Ļe#+ޞ\M1wLk>%]3ZnKo~#oO3M./j[ dyncc݁tzXS|Cw,C{ꜯZ8ɂLLZ:]3Mn)63$-D*ً9q3NZ:g+^ιʞ80/uHh^2t3 t. 9~#fNq9@)ۻ;IXD'y-}_Aq{< frn{p yf/^v3$lkA<+ \qEo@^ Iˑ\r˧j?;V% _a)L$ whq32}Git.B g=ƒx!#S5W¬'67>|M}^cBGt=C'rE{{'|`^fOM+٬:.V猑/{G8n4V-F;yu:-χv81MzqG"ew~QiZ =0d@w4uz]̈l52L"c;N߅?8)h\HL,SI&#N5QlM@*TlQ qw\M֣vZS-KKWVj 08]>=TS=h[;;;Flĝjwn+3~a-'h**yp_&N/\|NNx-X|p j6^^j5AVԩ‡}u0Տz2_ʮ/}5?yM.7z9d}懵51C\- ٞFk-fV:~00O`TJ';*$ԡ.>&a̝x|uxHdJ|&0V)?59n4BIE.KIqp)% zLT:F ݸǃ #hw勧RZ-3%#Ml6'`@ `$Uq\ӲH>!D[2YXJ̲& ~|`$8# c)J:V2InHҫL40@SX`I) Xj*LPȖJy$wV/fBt.X(-bDR3@;q9ɤXq]O7 w7_GI$̹ or᷿u>oPҺ_v zNkHX@S\|}T* ]>w>-1jG&:)@n0j{@D Cz֩5&Ll5vs0EAi9l^ h@@hX K,GG|Cb#lK,YKz &[ VKbkqnn.*]I ) B Gǎuu>LsdI쓐 Z_^Xf新WmR:ngWB9ǁjtIEƜH+M1I0*I L+ OK%B;|L`A)r^\mnnU[_kΪV? @?~Ʌ^^Vyd /`kd o)?|ɅUoP/4#j/&- 1 lD^ rXa:0vx SS33ObŠY,V"5w8vPuiaXS[)q@J6nCv7Vis _a܋"o›KE*\lz+}5HӳssOiU0X̢N$l0aDz"n&\q'PA4X :K&I#qdr3yeFĸucidUrR)<6tdDgiרT,8"2zP.14t [*n'eq[ \_"de8iZ?HSc>do8NQVfFbt3LLNMҧO>i9;{kƶ9Xp!Q+jz1EM\v֕tYJ3+  B5vkH)Y3, vX>?Z~|qi0 O}^]XO'hXySX^0+9'Q!^0ԄŁy'+-VZE45ttIP=77/}2 Y vt~ p1_1mj}VQPcJBٵ  =}pg<k~MlJh. Ho&u'-օ l`}`JolV[ ?/V/h|sK3H@*rW Ӓ(;jժR pF ` snPAP=yH+!%}]uAp2l=TA`&>3R %XIixC^Sx|yyJ~ m,EƐYbg㣣8~+T@wːJRЪf1O ҉ g.InL&znD]`KW| V'iGJZIpNpN8iD(%J()_H5 ~)%:\Xt ػtQJ^lm-b6m>Y_9,NΌu2HYg{sԩ0LBKI["oM.rbb|$S"i-(*]hrnCJg F6WWgWW l.w3pPΰNS#T5eR%!#PUu=92<1yR[iӹћ¹3EbTK=8Β&f Bx:d=N]GfBFKg/9Y>== GQ XR`m z|jEW@oQ 0{888Xc}U#W⇽NTZg{uUs=SY`RbtR*"{{L~vjAb>3}}رcJR Z6 ҥG:Ŭ %ݳ]6ȯ=HN(9ׇ<<- @~n햍bUm|>{b;vL.Pq0a6T,A^rNI1x]<4tk@6$yl$E+kWud\EDp3LSg*@\6܇, ܶ/rOOcB. 2&6 {{GO ;89\1YFW9*zKjn|EomOm.>zaaA& "&`)]6t @g0'=f@6c1\+\=tۄR?YOt)36Q:jHp;sUĵ|!)\Ɖ|12̙ӲQ57G RlXGŭ52`*x2gbt;@#@8FM.}@$@>X}'/N@A^mfk cK8<>46 `[1LئS{z=SNAl$ѣOLIA?*ЫT(JLOtxӝ/\2Q$hRQi>6]̷Tk"F1U]FSf|hb#ħ?HldjB!/Q1YpbQBXyC%6g6[##C.kc|%R|tV>pwɺtpg6ZZ_PLy s Jl aZ`Tȑ88# v9. ܔ\t82`D#Yثq`Of$0px+bZ5O!BÇ@X]xBĊZ>x 2O<=>wCjDrqy>gOLU:FndӧDb L~Zrvww2N*r`(675V2*I)%d+(_7ȯ?H|s>#6kPH/Ab~h8) SS|}(Q s?NN=>~'jH(R4f)Tz^'TUHR# nul#V[4b_) ۥ9ÅD߹S H a񡫯0{Ai<~ `DPQ ˠ!N\C !nEOf 9,`mmL+`>ʀDrPY:O3tfyҖ cqα,ܐǘ) !&Huk+̄f@bB\Nch0sg>aO?usϛ)r+tD7W}R)Лȅsr|(IZ!Hw?׷QT * mm-@9Ŋw9pd42yJKlvK:&>[qzƒXGCMQ6bIDC tznr#I.Hò.  q#NCC/Y}&xn0LWsG.#~* jAY% {F_:E`j!Ii43OM˷ $Yz6v Z +IcWXOP\CyB":f7u`W,œu,)D!< HL6Ϟ#=>uכ0:K?x::ZWu}\\|Ѽ lVp_K 7Id.և y[@vv3rz_-a -{0 a^`'Y̓J2ͫ\:FZ#NT4$}(;D1@*j&9Fc4I&9Q^"6m Qe %%/+L RTO#Wi@'2$NJ+FTmgyJ+KĺNx[:G2m(˧5iH%~#\/Y( XN'g/X,B!38xĉ/›ú$Nwų!Z 踶6 N?⟛\orAx\6Dn8:[dYQA mldo?5z }" m[z3pH'tʑ#|ݰYj>adv8ܡ>Ռ'i`\.`028xv#OCMI*;.j0"ˍ$w-b.72'st`2 Dnpp]\8ȅ9H ^0ݚ( hs twmn.ᆵŒ0Cs8=,LH&`҄R5o.iOnr}z?Q86sպ3z{>~*imqd]>yCW@turxHCcvå\)Mz}AXލ AĶD#HISL(K@,jj+c{n3@IzV1KAi3&) 4| ϟc@[Eت0ނx=HՈV]S3HP[y*+:i!qܼŹ0 ?U( k&+28<|l$CH`(0ⱸj S U: ZLOB"Յ+ ҡO8[?zx}}GrB>svE]j]r@Dm4\߿-Fk ?;n Fw˿2b/&c6T/w jW:gdb6]j5n cْ-XA1uhhͺx4Ca` ('sGFZRIkӢԿZo_V @g{H kIiL;`u{c SS&ZHv8 j7o1 5Wmϳ}A[w=VO}h%iUdKa̝w8@;R}=>2zf7< JNOIB |ONޣ4&/- nnM\=PR9U4љ@8@ϧTl(8=N~h'w >S` XLk#(kT #ML tB{ \l56}jzsu5[dJ3̤9A. m9 Gmpt mL461 F0k LI)F /R0%Ε!W0a _Dwv(cJbM'.=t' Xc +]5+uvάꕇL{H4nw4o<4+ oy#W!>{C.XvS~-6@hYlr|Rױvjy[zࠟn4o-Jk("5poHCZ]5hOR…ϔJy)J;2/L*DH!ZfGoVD~݀ Z9i@ 02IDAT;sCXQJGB=cTt1%fs}L]]]x4Ccx ka 5i#t&rt}mN@P`61Kai99rl)L<kW ]xt?vb%4eÍDۘ-兙3g&TR٤px,O (J'wfLHhɧ<4^jBx#ͣut~w \Ƒ.f=fZ 4[ i| ">r7# T-m.'<yev /]z42`׎d6,)M;Ac.΋Ž3B.қy +rl5<*:y Fs<(׸{r2\ R͍=HaQ 4D\s.\B);<,S38tS n;6[K  Y$q7 3ů  (Nw”+8Fܓ̶!zf*#Qzp+^;%r Yn]Ag7麒Ɖb~&&^= ׸ 2i2Hf@FIV?4|W7s@>8sV9[ :Ht*ȡt$1L@A"HuPv\ vt)`Gp܅/-!R DaLc.ˑV,̌F&- 574EFVrFdbff@H{jnn +v(DɤqN  gLjR R8!Ȳr̳L<JmvGϐ)ōocul."&6ZNlvwC%H:ct+IZsXm7r4YlSdy$àBkE@ؚ\ ïdԩIѳE~Ç )DW˗E'q|v4uVoX̵@&zQ5Rʮ;ccu\79@~Wu"i8E"㑾qXTe{ kb]]ڒTZ^@:Lf09~ /q9_ep,!JB+;X5w!Q}/E_tcS++SJ>>̂!!7H@8H,)2,y8],䘯a~> 9p{=WܜZhsF.,f21E`.6"Y LۏQ0Lđ5{qŹH14C6pUs5b}ÛcQ00}68ux ЯzWL,\SNQ)r948#ǟ|_ZkAˊ``)@~ύ :[KZ U ֻ\@ ^3%`Gx0TLD/_رHI\E9CB 32Eb36hY֊r丄iyy!)mيWӟ; `?c6O$6AF&y:3XȢy$b auį@>,om'f 'h.Ǭ5V!,T{N^r9K1*&_ \(Y q/$'_%/U"!qӵQ_x+$x*su5BwShtc$21<|oH:.n|>5]]Xuoܠ(Bd8 PXC!I񻻌e&5Xa6+Wf.;>$6ĸO5"-x nΣ7..el=]NȤpxA Ng.O\^7QX80hW73ԋ  ϑzd@רQJ/ 0J1"qg>:4*Gf3I;ݍEu#Dޱ].D TD_#''q|s.te;;{{ª5k˩A[zUZh mljU|m ~j׃vk3l-ނ˽Ԝptjҕ{G?"G=NRH8dUw.2e8V鼱23.tq>/ᯋSsg|SO?y+Ȟ"涐.fb3/zqfsIƃ/ϟMGbuw&tk>z3_>_H]I=.V+Xvrq0@FSg[~@1[uRݤbb_Y$Ld`d # .E.'[J#c= "8% V)qC`1nQ:~v T a)sJ3ڨ6qH )A\`7ri<ܑU}X'<(Lvc;s)B|0j OƢ%d%cU2ӃB6`!~j( D"z#j޹Z糚q cL  La& &hmYů6`4&̙CGa8x^hkkQU A:p9GJ%…QbQ%z[>7 @ɅߠA:nh#[ ?$A#d$@hFX(X|@ѣ">> < sMF+~z R$ D(wjґ `u"]1Q[XK)1"t=&ňY9$(]gR#aq[ 1wJMdq-D"<N.<il2)6j P\~bhYw sń^/ȴ'; V[zqf̨I zQ:f=gVBȘ18Jm\thę ą켔{L#W:я|3)ӱS{:( K rK/l:h=ϋ\U*eSUUxU6/\cFK͵tY[A6@uiJ/Y8Gܧ' g1O\^Y'oZ[]_ՙt:4@9r _w1C+Urfsڞq';a4WLQ2j;LϠ ]JMb&V 0D:~QT`gUUcb/Ar dHݚ84EO3s\.tc U'bT'\fD =7ځ?a ̥r@t,&+q\W*-\$c!qy2:{HsXl\^ L8FIsVXNe*IB-F?*EQwhwfI#n%[cc**"* "bxZG Nww}A<{R5ZqTcWzrMy)NJx4J7Dz&3q')2?z+8Wj\.O Ճz,\.arl.Δ E]Qz6|)"ˡQ%ժ-m ?tyu6@nQlZkj<&^ݮ$/ڜdw9.HؚY#02.,Up:RBy`lժ`xfun1ߑ ,a(1%0'ӴRbgLpS-H NG3OB~u=@w˸(I#fsUhtIbtrX@N.\Zd(U8YtLKL?/bY@^^_^Rq#H`<l>RK5Ǣ$` e-RD H &epvjwvE!x zzoG#tKW._>U/ۙ1V=7b_&Վbv5]l7mfkId9@ҍ ^o}ۛHϯ "& }##'}nø9@L?Dz:L.S0̈KXvC=ORv8in iҢhmxhj+?t撛_.vi8O9SKKdywqhϱ8T|]Uj ˘##.G,A L&f J0oOQIwژdi(>MJH3&67X(`s9qrǤo`, W'ik >](dKJ yi GUD#[]lel׏mfkd+s`>(qՂhݍ.K*Z|kEKu 95 ׁ[Pft1-$u&`P٩ÔFj 0悝|jDer-4 HRAgZpx`P")d_Itkipt{{j,IEւ#C2EcM)Ke23C]ftH`=W⨡%iT%Y% JVnPo`9 oSoBsdjF;;+±2ʹW A `hQ# 9}5_֦J?3_f? @tNcnmlm iU NpӠ†<8ᵊ_wMBsD)]@ }R5.#W, 644ljqs`a7@o-1j̝c*“5Kah;e6}\MFe;-KKN<*=9V`fhF|]\jufU(AH *\] 1fkqZ8Tsna6p0v%h,$D3%sƌ&qC^G/D4"@z+f$œ` j5gϝX+Q{> رv;&0J>ѯD!Xv4:']Ӏ=ȟ?jrwvεۭ @)EKm30Ztu;dGK̆3XX8P> qÇhb9qp2]J&w`ᣵ]/Nt NQ%eҞR~1Wܫ?p!@-∸v"x:reI8B8h:pNF7faZ1* &jF+ Drݠ\cJ.£a{8p H$\jL?zU4oaM Ӽ:7xj!^0\NERV`Ƀw7ȟldv Xo2iB zdZ q@Ȋ^ `rHdo`,'! 0QXT,S2ꦮ'l.b+z>3 C,ٍNbk3!oq]יW 0IbEJdem8NST'N9ޜqqoq:K6eHE"H  V %[ ϼysjQl=}F*ꠌp1 P@fODJqEnPU\I#l]'+]. %F f0R&M)Ht(/Q\U% 3_ BqbKkx_:"C­avl9m9#J0otB.3puuveE F]v^rvth~W( n7!4.V*_t, M4R*@uWWypƫBڗw = |^* d"[7cM 3e`iY}DYJ* %Sz|H*y^1,&Q36qi3&r-FnH (^". d3s^iB*^ P\)#Wԭ _yo׾Oypy䗃OZ M,jZ[~,\M&k|X6rC<+Z'Ϥ"5L Wۇ[[eVVh=jrȝGo'T 8lJWSu*H! [ƺQ*s*o|2v30/ U &@YUeZqW UZ$SEADŽn thlovw&#l; 5TړH:݃`dۨ] Lt[sx%b˫*'&H9e SZ >L&+4VjHT.@j+L2588HFnm)\Nb+l=$VLlV*KxF 5ɢ؎ۈ9a]bU l@ꔘZ}RY q7חqOgvƝq{ ~oQ/"٪t\rtaFr!ɡY\5SOEeѱK[tʕ/_yY[Fv**P jwH\-a nkYY%<8(eሉXet z@Fl&V&`Z:[(\5bO@R9tt<-~Kb\B&O[ hl4 sX5^{ۥ&TNr;sF).>UR-B*))2TN sZwRjE58Q LG|2~_g,ĂS)*XjDD?CxW9I!RQ>YuXLjjnWB%d}Gi~a'8EW2ur_KPY"|.<ąU^x0<.M3^]7 @Ͽʁ* n7ȗ@F #ev'p*mg`&faf.^|(6=6l6~<n t@etz ruȉiGVD#M"V2XlV#+?!D`T2pR#12J`WkDVm<J!Ù idz\-O2DVhtpٽv 4)Z]X(V#L%Mq&a gT9=iøDJNYD\5441fG'^dW. }~aq b1s=Kؾ4Ĵ-<OދbNH> @Ew~Pyp3 HaepTOKOʙ>>`#BkiΥ%cG/|naeN!'v8`؂;:ُTs`&J*V {YSFGRҀ3tcC2I+cTeXWilLOde.3I(4PpQVBY36ʲeSA@yD$@2ԐX,C (߁?X]ܭndLs\&91S&C4Tڲ۽nkBEkn4{~Q?NJT5D;;G^oĉf/O`n vp1'̘,,\c t0VO?[ jt^c3V;Y1OM+Q [@;ucJtZ}A]"L 0sX!Syv5q-;-Noc#ӉnT!xCS^io#x7f |!Sh( křI`͍"nuKR؟kF5c=l234Ur-,gJ(@k4,Q0(9)x.3u?,̖d 3MF'hiOS*F΋' FF!PUDc,6=yGNl+ߜ~sx@P<ӯzIssLA$=+ߓ))קUȟwU9~mȃ y`3H k ʁ?L<y/jU"Ϝ9"+7@zQ\F]ul67ZWב[fхH$2 Z97569EiF\2*5O:TO-r xo z:[cյ,岺#B鏭5d"d21 v{Z`Jg8Q؈LN~cd(=oC6$RzJ0t P667-qr.9n풜z.ֶdKb) `) :K + <l5\,bO޼'OXv v3htbg|SsLJ.=3|o_JB{}@`oAd+ڃkkKWDbunntuu(Slo|^-Vh~Y?V&@L56 l PW+'pQߨEY*ŵejui屙+c_H$"M8CmmqqD?Lvx: d,L Y*EtdVX\uJ 0÷lQkf> ,m 3ƚ"/.nIƒH_k?tPDæq-uu"&߉YNy ղŭ|n;o<f =6Je* 8+T)d K33+]<ta|C tS9[__Hd6KުJ|)C[u򡾾؂ znTtx̽v/?oOы0?? ;WQc41$tk4F^7 hdvc3ȯ:* H2Ebw HӖ56ZoAt@//jo <^&2aIFU(dTK'8G}CإG9PFiy` <^aCŜκTjhj9VFh9C!Wb5(56v ]$"Y'7X U(CCh*mDѳrJ#60SJnfuɭZjspRK;STcA 5DG)|:&3 mLQrFm |5l١Dcn pࢼA//S`/2a)Riu0sչ܎"^x w&l},/'t-HH8VL%^ JpNT7ҸKy#m֏ğU9G 7 y`$S3 @jssyre*Ыgx&'B@~4X0@lը _5d63% A@=]-*U%+0) u+q<% ul.>m*ɑ_d[VRYc [3bvXnqK1ᔐ$)i(P#~]A18)\QpQR-5Q>q-[$- V ;B'(=¿Ҁ (vS (kR^ T*:[(uׯe~@u۩ţKvu5.OH?ka3j8<tBWک[;c?'U?1ekl&@L4ȚwT9Oȃbf䁭v.M -i CG¢mP9 tuveYGΎx۽s* 4Mg2뛛XF]9~ ,:om;\sKM{sb1G/UJm[,K<@ s,6 ]bVr:i,N'BEDD(-7 _vJ~d^T߸WV5at vO[xBH>ei͸'%`_SN q2_\LUzKF䞄579X<%\({@)]l4|rast!:;sqeeBiYy>2`! xT&_oCxj. -Ƶ/Ώ;ޗ$Y3ԃK>9HWQ(Xy*?L<.kl&@j 5H)#}PJj6q L),t.$p HSrMd5k*kt\\_q#'` ֔ oV Hhs 7j4CI(n73-rw@;⯡ԣ4,ej􆞱U^kj`Qb]El!gʘ[z)#Qw-W@EobձJ3ZKq[֌?E9ԣ{` gfdDAkI3 Lٜ׼;$8p}=m0~pGˊ{z'$ea~.ARS*סU?r;ȃ QY@V*AhS^<YuAtA%xop8=tg,갽c8نݖg槦J\tl|A:܀nw+r--Hoa<F_[ aHB9f'ȓv6w萔(Td}()R +fT8a륪H#S;A4e$3Uw 9,n/\6)Gu-|0-Z TL ARD3B# 1ͣPYd<FCL/[&#ٙщ'aS#g<;&.Df)0鳠50ζܐx|ʕ/`SGGsRM| *2f56 զ &@%X߯rȃ b5:a=~*`8࿽PFѥ6{s:㹜}Bj-K>k+GɥǷX;ko{U9]edL<@/N!dNSU0R5Ç>zν^ב.㉄P0%QCZ.G5礆 ,ldR؞6jcQś1,}G`kuHvS~eB\ +崐lkX҉  `@pZ0$CUi(:uu ldPt0- "/d8 *%ŒEq#%b˄1YK'b'p.O<IT>g*O+-o:ϙ'W:o*7!rA˻7c0?UYekl&@j a`H E i*eNWP?tRk| {ڊy003>3s^iU]'DJC~aY5w2[&a,V+k"*P[*n LljE /U*=nPP͈ 5qQܢD* ꝝ\.'cߋ1cx(KFm\C\kVr9qxDES;)΁J`qy1>ZJ2^sѭַz~Y)>Ofum\4R 143U%uu{'{wt 544rD@`0ISN>9=6FI"9Tb1u& as))KYp5d]b*1 )2T_ƹC"ߪc;YLC1X|TIA5pʢ -k'JIjl0js0yxF?*17ٿZERlDL-2xyp*= n7Dbu~~[Z:-3G`B@}>/>D @~OLj IzNu TEpxnЀ(dfa!SO}}@i̬Φk0L RZAJm #609 `u/|{,>Wy m"3apPnrb2QFx^\o0TW5雰Op! o &er!n dKrWYd\X%5(fjTz2 }HqTx <+)nz-O穼4\Z2=}ĔOi,l5N~];>rvDi*y @G)nA.E},ҙU⯍V.җKyV9Uud]E}nH ՠԜJlzY%UF|paR'{4֛N$8ѣ/s[IB'a\+L/{/_~42ـ>k @:)TtB,1wa qksS)(4 YY #pR[Ai.dSc(15r pø@Z_/mޠJ{nA+jfuUU2 YԀ-w^kSH#]JD|4U-FKL/*ep-..Z삚ՙ'C ~Z{::/*|Ww t"sB}xKG?;}-NO?]3n֩}יA~I_r_zCs/jQRB׭4ț h_r'`rJskaqXY꺵ZH6u`(0僋It:`<Zݷ-o[~Y~+Ŗb?ú2tEլ'^L?]4`Pwt :`< 3vZ[{ywYu.HˉcV~u݆F@WGbU{{ok.>jqFfjpe(Po,Sb !PNG.C=y۽@t"ܭn "abRKQ/څkuYHq.)ͨt\^,byɸL< 0HG C='VWgtU?轊&@*nxQGރǎǘ'77#U>;FRDY]ha(3lio?[< P'?쳟{^K} ]]ZdH#t6D>vvFK&XxK#:tĪz[}ee}"$id 0P1It 8ˤd-6B +.5i0xUi\2g%rwlV~(9y]D:c-# r$nn$D;qS-V/0l)*!@w$2n[:[煇]C[xOJu4POb"13@U5=KU$ j76@Fy`d`&LB鹲 >Ԋ 0̓'&=k'ii|+h^V0ͰJ4p:%Xl}@(h՗9޹.M@,|VXsi`!Ma ЅFHْ]:+DTq##vgXl6%dXfX ,0Ui_+ݞe%U-h@\Jǯ`H<Rotn[lgM]r J!Nr05#,Ҽ<M蛰J)lʬ/O.'c^íT{^QAbtӑ1K>j`y4| O|k1@.>9yFAZ,psaqA=m6z F.m ~I Bmdk/T9oVL< H l\oAT**La^k^3 m`;.0o~nt.<&I;vqt80xra~ܹ4 V]= t`(38`fQ @8kuaA8" ̠dqXyXiUzLf?8_ww8[@+<0?4t$46)q#NP79DzhH&qH$2=0pV ح<@"t=QRQ(J+1Z\*N)׃ԾY5C$UBƶ^9ƝX/0 -6KCsG4Ŭ)kegl{'f85!f*R9'xajg?lD:=۩T$ns@bv=4`"HFNu41TlOI+%{ iȰUUetmL0+ayw~U9bX&@nѾ4f &@0@l~)lAal/#M<@2tB "~S 7b(hr|>Out ӁG/O,bČht>`Ū\.77\4\#6 HDC 9g'-Atی@@UJF9wIt@'h-o& ]}C͍vqYU8-Jچl,a5f`0K:3#X`T 8%MN>5;{0x/=% f0gN݁b(wur޵5%u !X57443F{#障x✖)l^֚r_L<y[$Q!3Z#? ud> PqЭn;{j-[a>^좷@iU=X&p"g̴& L*,u^\k`$yH`la{\XsxڧVRH !@q/D"sՓ` Y}2?rZT`: )Gv[eieY|Xv@\Ue"/'*)FjqD Ql8 ĝᔅnwT,Jl^F9^ NG̬gB!chWgW1v\~-I|Vpx]̬(WQ#U}er84V#* uuAr+VWJ :f[39Ԭq^xdrv ?#ZeaCD. ]rKGM;r.>UXreb fKMpl7a*=Cxq!P'n:nT٩o"SD,tC$7gSs85+8\)4Qry^wt.(kv*Zo7C0|*8x8RXcyy\τ$>2 JwF0?<\<~&;w`iuZCC! (?|EHVBZqn숺Q~qpFZƫX#Q?U?P&@n6"0/j5J֨t1#/ N#O~CgHO1nXt w_Wڦ<MTx@Y aҾ\aggS9o :<|.Dfcl̦ "д4R[CdbR9DE:3[Of2|t 177Jn z" 8q/(U(tՕyv2@yQMR/Z0*M?9.~^{\vU:lj-2iԚ-;SWAr`PL㙁lދ칼Ela$7ad,>><&EUB23#0{gŐ]סUb'* U1n7 @&@jA.V\̡:Qi26+e@743 l9 @Gb vvO>rcRZ fu&`jaq:Xyt\(,"%+$PHTڡc[{Ke$R n1G .24S4X셥+FnF8<|6hjn6,`̬ah±֣H A9(`n sZ@m453Ks_j1TV`+\SGZ xk{zͤ ͋aq"j$V"x:xj33;FI5(a7CXsZ`D??R&@nB^Fy`3H k ʁxO?S%,tiboJ 6t&pA Zc'So}Ul1~ǺTu\.IrA2jHi ^{Nd ]$*W-f"2[eZQVUC6D 9 Ɩ%x>^[[`L!9l3^oj{\-.5ؘYiFNԺH6n@]r:}TzS-@CB vw)T}}=ںޑal=2'DlV^,ƀ_,5kn]pJ5b)[ȇ7Uk!H۾Uxza7Bʘz73@&@j RGDJ,ʱҜzX7MVZ:U1 D_b݀3I G0uKby~5xp(LY(#\Wv*06@JX>l$Da"\vK}@0 i%w0_%Ly&vڐ*hZ= 3Fc *Z2ŽƃdHbdiFuJ;.9#7'WTa}}QNf?(mTO #z,`,)sh̑;o]_^; > Sk+K~O,qjPI9 v$j [?侯/ WO]l׈&@j scO`T0BL-@,&)@S:~8@>@;|N@Z[6D]ߤt8g?'fDq zOm`gUt쳟SWionZs͋AJ1}.ו'&&5KlRUon1CPL[Ǫ'EXuz^>\&g/@EjIf6Ykm#IvE5,|n{y>/뿭LO=|u uP::6px1TBXl6ΕQndz֣PPh%ab*NXrn Kh9)ґ8< o#'`'%aPTBQolE}iQ7` X\CˍQ-/G"szPr~W)o+I"qTp4Rw Ν./OzOrQo?cON GΎZ\,* ޏ z1?쳏\TَW1dx*ؙi"yUE1 znym^-A~˷hTc衷Og߮#M<@t@tb_5GI#kd0t0I.Ժ#vϕǤ_u+od49dj}T,[ B!}B!2-Ra JLF]:M@dٌF D%)`Hi`)^ ϓ_~fyyBi^[ƞ&m,Jdt`ƛ}.3QKGYMudyf+W:Ū12CL&Fu$k%{mEsЛ&|c^o;׵tcd_G?mO5=}!IYHGr5m>G=5 xGOgDң MWՎU)k|[bȀ4 M4fNuTPQfK*H.FzV#IDUUUe^ZfIUP`m676Žs9 6u[Ocם؞9?Cp /(gK$`'p"Ea$iΘɚ`,>.WKCCSS`E^./DojL  osj憍!=ˆ!\Y,`pK$؎-J׽!Ne=u}}OC'n/rΡYq4x0.F;]FfO =xAUj5q`O;u~ƪԘd2`G_ww[wy .֮]/O,9.#׮#TK(ם CٹqC5PZ ʁ ͳ+h3fi1 kF |ޒH5^6;0ІeH*REe?Pe/G\v KcÚ^O/3tk`(͍́MNkS$h'6)K@od8HNiC5JEx|YlYNB^><ܙ^ 9`L.C?DHd6Oa;0Fs9l$/W cPjNG Yeik|d [ h{DALPf.{Ie|6+A!01aoЙ!)h7j&!kvps mnAٸnm(41qbͯMor?RPt 7|@^;ƈ(NQRbh!)mCa`.;<t00 hEYSV ;e0}2LFH€s":t,^>NBV+7L3oiİum]H=E7nqj\ƀQ]Ld%AqLt6 hMA=v.0r  a`{ܒcg#:t7=+ݪ|ĞF+IG;3u= r}չK>}g0Hn&?j*y4} M Oܳ_ W N^D8pxzji,S+ =/P)*.r & o*~CL< r7@ZwP(pb yVk/q ̠PU:g#w -.X]Vpٙ=p4;\KkkGnH3|@w8i!\&ɥv''_)9"~DOboctuq @>X}ȃ ka :/Ub5pF}(=r\hdH7)i͵"f};n{ql@?W:ꆅb!{Uw<%#IPiMp^tuc&<331 H71$|:`WpiPѝuZsZ33=r}KqmpP9ګtQ}`S2> W*Mք݈I ]@ŨG%E8x1*d+ i[-'q<;1v Ͼގf[|RZ/K7֯-]9':v4d/-3;sQcW (H֮*ab7|T9߿T&@L zsHW{ aă" aUZ( б_fsNXLi 8<ɧ'/^OHսW 0&_aB7no?u1LF f7 )^(Fh,հX̉Kcp8|8#&5J=ͫ%␵y\±c$I0eYY|Q&0lvq0V2!rruuq'GGƄV>_k$XZ.n*hTpee 'O0(UD#T:^7m{k^6tO 7 3gb LUxMfP1 #& Z HCx6Y _UߣLfV޾$F~u3i*H Z Z 7 /iԑ sQ)s \UlB dݭmm=0b&}YMLlml:Yr{Z\p|mU^tz-[ g0?->'K09-F.OJGb `p*vfc@.C|`aUz!bqlNŧ`t>iqA ,aGg Pc81`BzhlI#!<S z8Vf{_{cs,L&a?.}Rt>ɬw~ijb)Z1 IWW8r@ QݐWEix=0\zUժ>M+󛿯ʁ/U&@L b})[Q*X2C*(8Gd>-həN`::9 4 y+㏏`V7ߍ'> -^ TR萝t*$@rNN  vUy" fa+(~Hp8IY:c(#8)v`?h_" bD`Fi<g2˩GFy. ݁|by'S(D\ō #/`pX!sXM|aa 8Qa+&kSt1t{B!*Orq<@{ё#,EE6rG_v|Q\ y.[[X_F^җ`$q2B!t$J㚫ڧ~_C_u[|䯕 7A>[C 54kh5*_:WB:w_x`Yaw ͧsGzO>47xkH'%q.9?YB0$,RtDL$Q*0'd!b$\E08D~t?6 `ɀXPD؇)R$+Hg?<2O~}9~^Hۙg0f`! 0܌Řq3)<S =cGFδvJ Xc6-xtzO_<77 t;a 7sIߞqDᥰx|℧Js@R둴X m\ 9bɑJQY-ǿ>/U|K?) n&@>[$0FyJTQ2FbQtvHr ۝>giDD$K=q\zx '6-NO&g(#t{{{ o% 'ΧR_vuz(G38%-E,Fmk=f")uH9 :ru+KcZGj;Ae}C: #8)DfoF C]0ܩw }\ҥqLĞ~gOQ@Űuk .!]={ufunJUgB@Mo@O)GV{e@;oQ/L!d1)cMMS׿Q&@L /@2h0O\;J3# ̀V s_Jȣ#d4npeki~f;:;De: $sccZds٘Դ `pvd~䵠gܐŰHx|=jBCn\3lȢqtiv(fgs@+_6wzowpÑyTlGY]v[_v+mvi!y]L_J85RYmv şl6IWN0[U+f'g~~{=|*?sq)mM6}XOc,yw KWJâъKƽ$aZŪF1mS?: @~Vȏ~jd /4 M4я2ffi5LPHF2GxNM)#*fޯN`P=Ȭ\ |hm td,pNIN}.87F@+GϞo>oi?1Dss3r-T+7lҕDb`W_i]:C_#gF|V5rY,G>xs9uǑ+qM}CE[vwpnYLn5c +>ulW#xd.nqO[l6Ɩb+j6I~b2sSO]}-s"`Ovd,Mݡ:ׁ W"bo}Hϥ S\&M:=lw/?vpxWVDO1< w_*c\FMUEUs׿ԭ @U} 7źbZ>]qh RyG˞2XND=z0%(,?8gx*pyaeYUa;;G@[H@TkH$Mj-^Zd@htwqũ Cd'@`}c\K69V9"(&0ž}v!c(4x#@)|&Q!KyOD"Wƅ*@`)'![M<9:q i"kokp"cx`2]w>zϐ~Օmwz-]EpMSIE*ͧMʏd -.  p< 78xkzFL\B!,pIF^?5d"X,[ gL&JGHmc|:ʐ(CȞ\U ,UfOɈ2V_V r?~u@jٔ C+ԪM9sElz nC2S`?S& )xriqjqH]xX tc`@C![O8FOcZɞ0Xs2OB>VW47` #1{'Cq68 ӹ…ׅXMf/_TV?*u4 ͛bſ8ӣB_x[X+R&&$(K($k+2vV2"IVf.#R(x1b2M(CEj2vwmqu1 FBE uW8.tcq8$\.OI|ɸ|]\Fa~ h$IQ؊p7d-nw!%RWA>S難(#boI—Ԗ0'Xs(3h'cEUr}_#_?g>5;kZO~Yܢ/XQrT96Pe9_BKDwȠچBh9+);\K c[G{Os°}a&*\O&GpSQ q%d%tRʕ8D K=]u(y#G0\YfU&&ZYgaHʘ1yA{rʞ_#e^ ghx;D~@gzG\xʕ+dp4`tƁ~:h*+ SaovFTa,((隣Ζf4؆_kd"pT(4xqnA--N, U8n/''aT߾[?1Oܞ>tV26)d0hp+b*Dkdv,9?I$φ3bT lM\W&/m3mgμk_m};ee <ڌ;ݙw/ϕmS8흗.kPZYqI]:;;2Iϗ'& _-F pRQqAy`뗃V @~cOq~$"ȕd,H-țds)я- W$2 KV"9S*,(tXB]WL+1[***.(h##1>BM!t@>=G{G'<y \6;5guyZ̵vFsXV©):L M3KpUU%Fv xB82 ET֚faϷc=8Op'Nа9t i7yeSQ[<%dU~Ɍw`Rs!  +l╡=CӸkO-KIw> /py)JHtN.(=e$vdw4CY,ظ ۮ,2]*n'4#+S{ E8=.I{nyϭQ yq w\pE,4LϦ8'?0\YƂ7@GaBiHYBy-F؋x5·٤bebBUgXnϞx~ ee rv GHN^~5q7>zq<.?wÏc] &/ lCӾa8(T<<7'JqEe΄TId!5iES./ KNvX<&KZpڮs]h N@& ΁ @. D2.|||t$t+;8 UG> w₲hdL{ =XT۫viawx [.y؂ !F19% 4 2 ,Gv6>:(_@~rΙD[6;S[s eں}z+hVEE^('':iؾL 9tysV`}+0i\LVڏ~Cot9w>ѵBuy/~iKj1ՎDO8?}^@܋( S(M. c @kc˾tсn,cy5t0&2kBAaٸ.^Xk uñ_<+0' ԤKϚ0 v^BIa6 0~"\~U]lPHc:cQ`0qQ  un3,pay\X: \޹h0}`LxZhM9?A{f+ItB|!ʟ1 cvOb{JSᨢб&Y~)]״W.ofg ~'C;|"kQe~@'4>ߍxKEZ_ bΏåD\z䛖&>RHVYV؀/ @~éȕu;[7NGaBi _Mq~]an[@2L)s<-dȇHt3qPS#Shud\z$S$28a{S_.mY`{]?8_|bL[fK? p2k. ngk68wqZϲ EUt*9ǷzcJ@jtXЇ~%Ł??ȕu{N2:&DŽI21Z1QGvA ^E' QPRR-^o)1v?e.ǁ:>xױ~7[#3|_>:> a8CTJ6#r硽2vxS_wN {s:%%uBI#ʃp]Mgƀl 0BE;'pQ<+a&d)_qр**C{,-B+qwyLe'E>6և!t20/:qora?O"zL=,nz y} V~o?yK)a;ӂG `pXۦ84ULv/Z E1OÑuERv~K[ocrre݆MQ@.Qb%D2Q.D2ܛDCOPgvvJk񳼼)iܹfg A"a`hqq!0j^ 1 ei O"lɵ45usp ca~B@{}5 |씪! 8D?e*0t`g/ޝb͂]$+еB9`g¨e؆c7160 =FuXr8\~z@skJjJa؞>tއ65Q o'&`soeH$؍/j>pk"W=##!9/=492ҍ ?F*O"*mci~<`k/cs*1B8DX ߏn7@d /INGEbK!3\U{/K&.:V %%5>_Y*rm<7f.u儴o_ͮ )RpgNvVvȩ).^qerxrt_\WTRQPVT#.V[r[˚#|V 0`7\]% )߉2u-63j1Syv ДHs9]gS}}UjV[da29X_Sc}mcUu].328>B0rAwq18F>iL^U}u_z -}vBvoޠ}~V=m#JD^ցCxPUEK)/dUNȕt[M4d  ߍ. BǥJ"PJ+3|P݉98Vdř@aI))p;Xdj|*>]3sH/pXZT`9CSkjvjص:1&{{/ã]]g6L'&q, ,yMw̍""qFF4, *Zy{WP(N|{0pNg`BzPk0kv2IJlS:9 ;ˍWɯj!E,6rPr[·Rh(xо>ŀ4(E:-BFS|,aOhAA|DbɄ||H?d_|re&|t)dii|O8䊯)n)OGaBHYěRuּt:aɥIqLO۪!|{ +@8lyN=ܱ1ce_,cL*k:&'2m _=ffA{ݖm3ՃQ[5n0#T&oQvyJ<_;Skl<;,' sr0'eU#`g}J\9KGdNW`J.xok6.)陻AXɒejjp?>70@וʩTNAa:d[>A)wTmi{'dEsEݞ:\ukzj_ Xj[U']93W`G/٤W(do7J~)| cA[ނ\: J@5H.=NI{Q/L`}+t9\D9}a5 T4UѴa,8 d2n f F lF~cLL0`jl LMAJO>>vt>si׽24FJKq ұପk:uEq `&T6mCjԌDf JYdffRº8,--,::* l B.K)v'I+2ٳ/$د|'wP۪p7dAZٹٕ͕@-SEt t;g`^=='&{: Y^6Iw-wЯP_&TdQC[j- +Q@^t1Z+: J@ 5$i'{ƒ5=(CJjYMfNhՃ `v{"+,`/,ngcQ`Žq8sd9ݵ؎Q{sb8?!P,FPqU5u޺42{l<Ȅ݅g_@`ptILܵ,L%XuX{IS>_pgGǩH$d'2'SqP(#OI⨚]2y{PaVAB"D&%z{/z]G?qw{d2'-:GCaF;quw[K63ᲺBxe坖OL  uʌ[2IQ3ڼ$*bY=T]זLܚCE:|S򡇞Hq+ W֭:ʁy( S(ɔ7&dW/+te1Fk#-)ZL?&8)+k(,x8;:=9xE "YPNK4   ȄR铃,[~lyac4B`b2Ƞ=#x%OzG={V7=22ҥߩ)TpT{t !T; lZU]B(< ]ƭ{,C&BA|ũp-\i]ݾ]bܸm̗H/YR8n?~ŷں|ۀQrywd9-v$FBy !OOTO$ָet^dAŒ_tV؈F!s^ d=){p\>\gle  e)s0 5ee}-/~ |eSS87%ƥ2yMWDJ_E=$ oQϧ8n TjvL`KwE 2\݈ w}.}lpWsA-LT(;;%cHK`-n\$>IDFw\_Y&uN@q%T[8-! L ȏ8W$ W֭uB#e GSk?+֘b]k{ jB996[.g M%%&+2N#J rҌSn KJj}el{ݞ\ ctESEa.LzB*')x^TQ~D|GQ :gHH`rPm܉) :}(.STY -G촟ndQh~FG{;;O: fJ蒐W-xuX_+WN!&Y 'g2qM_|8" WV j[.V.6o4bZz*b݀qS[`u Md9ݞ-4X"PZ-FJa_#,?/g߼l$< kF*gp /-ѵ|$(1+='$]p澎K9'W v{0,w{rhIB <mnxxt6 K]NcB*# 8t:=m|\ eYVQ;;3+’f0(:tw;OGa_JFJ\ݎ vvy\{G{Ff`˵1[EC@, Gq[`j1aOo"+[ Ku*`oI ,%C f(>\OOq!r%m]@n)$$Vi(Fz׫:*sT:DMfԬ:E`AU1!>l?aր؎S LH`*\c (P6āwT}2 ]ÙL `W_It),<9Y nY 0Y6ґ`rvL.-;QA-Nx|p3/8 M'?FsӰaS6 ,(,^y x:j&'a&0@ ò7K xEN9t:e6>dc)SK~d_ηs>3KyNqoL@-:z#fuq" 6!|:9,j?XƺOD ۶ݕ˔1*wΚ򅸼. _leG`Ϸѐ 13LOls" yK| .8~nwUT4{Ej̅nj|:L/сA쟓c+`#Ñ &]._CbU8'9i LIDE 5Ko|zh9q8/.QHoUX89p3fWMư*B863ոP."@1APoz33-]$cs-q}?ab2F\KGjx帏5o>70\Y[΂`QrE \\Tm8r1eCoOn'F@Nq\Qie⒒:H5 ##c=n':@̎R }PF$$i,=;v]]`luh۹坖w: Cw WUɔoBow塡`: [PPT̨< vI eT_y_ӰViuU\Cq /nyg48,(¬_Wn޸ O[?Ώ6l`(*c8m@wLp /=xLcOK"Kv]5>ECu8V(c"2n}t*'X;|Kpu87eMȕYh Wd{S SiKL)(~]n, \&1ɺդ:\rG.,IWq-G‡ee Ng4ǞcQeb Llf&g<6Z#,pbfiF ]H(p4lֱa u.v]Co韜b?vhC$ n$Y4)Uť,##h3_rd*j+9wRʫBZ|gsI] hp)7{jw给~~_e} 8Ph(v2vȟ 333 'sfr];}HϦev^t6ڻa{Mqc c9D29pT K/Ux9#0Y^B7S`;0q!00hg /x`8{Y-d"3Z /KF;dͳÌeq)P_Sb\U!JV]SV< Rwhm 8eE(njwA;b#]#(-BY0qTV$R-8އ_;,U sH'%p4irtTאc{&''&!*?GRrƟ5C3ߐ cQVs;&d#):>;sVM|F}NtyJ$ 0x =\ 顣fAD,a:p,W ; uIө):muҔsJ}9-ɀƲM2Sٱ%(VXQPIX{ dP3K@O>6zGj4(`OrrxF-cMѷ(>\v> e hDXV& ]tⱘŔSScH.4-HDwp~%qR( 1I!h_oi8źVh4St$'9UbZ>Uަv}z>֯Kn8<0:^+w |g,E"@)HQ2^|C2 N$.Ezf?v۱=*"}m dr8q;EAIQ֔R zG|JJjkkwcO>ZR]k%q80`\4g=Kt=i=jU(5@D Lo^ Ic**LdXx!w`XƬjeto0:iO2eW1>$"yё:3&l2A+ij* 2Kl: `yeq*'X_rI`UmvvPtO=i<ͺJd  u6892N*yXj,j;ˌcvrm\jZʂuLqmW)C&X+"A 2s 6°`d|-1%ch$p> gqfz]>q83lO~WxŠ⚾Kxm>/"s (O-E*g`$ |23' ǽftL`8vNd琼J@OjF_Q$ݩ1X_E$Je]h tѩE2YY3IS$_b[)PyqrM,HtbM7@tJg=?f@j(ķod!ň i61&dNJeeBWLL&k x Rz# 5BGnqU1L 6vMa2J@HXQÓ ITeg@c` 9K???;ܷYP ,e''nMq e>=="$ c1vS')qO&]̪ Za9/5?IR~}g+橠|SLq*VH5uk>Sy kn M5wRxkֱ #u9 p XZ+*,HKS\ Eu9']1q\N 5^8,Z(E2#>.e<'0DW sn0PA!/j˱+ 0 ǧ.ZPX<9YUxUUѐL(ɡKN }w?q7n/ejuX}27,'ZAtXzEA4>1m5d\bg&<&2A,[0zqŸ4g'N;57`pDc|a HU3k'θƜ;^dGSqN:B:1S=8[a)32+,^" t| ŁǏ.n@ SrE e0ʲ1C$- +.;;mutH86=1@E k?h_G"f("tH^zeUpQy?'7< \Y!+*T[.7fh0V! cJ\~vFe=NXwn:ׅJ}.Ģ1|i`, `3n!>h6leE<ʋZK o^xz r2$AD"!WVrxX坏iOYUrϋ)E2==BDbmj52UH ;?Ł'N! o@ SrE 1aSmLJ.Y4`S{^̙"9tVFt+R<HL#դdN7\Sd*9U9`K=iWaJ2/:}YH `s)?2qG![)VS09y,T%8=56Ť6L C `;~҂p/6 S820I6at7;`NCQ${ff`j)RgISxF!32C3$!&XB"kIS @8p_O) SUUU݄J@odh:i1cQmg0S]F專=Z.bpɑ&$4p;GCjrhnQUQQ{ўl8ߛONTf3 H6!2P*PRF#YZ`G؂*KI2j{ȃ-?<;r~m9g9i,W'g@V0.(*dpjjL[] jTƦfgq 9)h2+R$|"xF#N1ȿ7Ih "ƩS"!ʔ_ի*y݀ @qǽ)bl#oEtuq}fIhoLJq3 DO32&{b\'%\|."%C%_و:hG!"p'aɹ"4%#0b~]{LqsE:F& )V5f 5ۄ`za~ݺ3ξÎH1Κ[/\dLn@I|yqY# Wgjks].o~_F+0a%An47q5Hs>"o F`٩YS$A]*$@#QsJ^H b-6?7AIm) hF$~DwC$b3p6C ix~^L@@X_\t%q5>2K?>Od:W$=w3'df;wBXiD@n i}=yaz +Haiy]ir)<H҈2x@.KG4*-܂S:OPÓv ^38DOq2ʖ=ʭɈi+&%^9C 57 L, $+`,f3$2mԃ?ٲp*|iU޵\ÑRtz+2i4"9NY0I)OdSa1/w8ܮgW,PhO8 u'CL}H~r*Т.$*BƒQ"!0 o݁@c|j̤3:95PG?},,X'yNՍ:[6WISkci!SXvݑ Nt+(ȍb=rJG[IGej(,ڧQ{?$5u864u^Vp `"iI+ $+nU\i$TN%?هpM-US1' cN-S%b@,HuA$# u*>Ycgր|Xd>q8+'蛣Yo8V%eu%9oF6 k @ܹ/Ł/4V݆|@ӒQ\mIёvXFmpd NXM|iM2Yl&E\ j*# %|m1Sl0EAǮЕWժIs@gՔ"HZڤ2FO]p~^4x]챾'Eh]Q$sgU$lD]J;Z>5aj} z7)AXklLC.1d/drՓa$$sW-q ճgX:cS$o*>x @KLL~ {tE]Q7IgnV֐zSKɗ%KV+T:ڱcO/]:'i2\wYmpɋZ:v9RGh'믨/겶礵Jř5e9+,.Bb˒U@z7.:HZI.C?ϰmCXr,ͺ]czuV{_'zc}dK*XwXxկDKKVW뚥K\U)}^|^@m ]Z۶Jq`Kai}$0z>{wݚ1\ɽHS$ wا0L+ȚL&^K,u.qS}iddY" wا0| gwKoޗzd.q2422hMMSvY@n6V e8ܠ7%צg7ռjb]m;*2Դ->mm-rSed2^K.!}]䲁SC/\S7a#?PdccEVa6 W->[[r/|A|[+G Of( E@64dGd(iA.I W2S[fu\lkCCS}::ڄdZ(&Iv.+xid" S. 6UFFF-!>]]hSu򶚷BM5Sm\eSXS)Vț,cdB/ 6Kdmm]} ͖52J!H##YSSbnq89.4i%lq٢m5ojXW5ʦLԤاG 7+bVҫb*MIe,H#$)r]t۳mjDǒ2\Ѳ%9~{Z?uo|yIۓil]@mȵb]YSm~~O`֯^5i;&Fs򶚷BM5Sm\eSXPIg=tI]9m"J5cK:2/9)>Xi7-th4a5ߒݬ#i$~.m}H##:hebm[B67^hvE,901qHFFi"H#|Zo@VUUmv24Jk眤n@JFFFFFFd e##5auu[2?qO1WBM5r _hkwX}bddy;I L>W12Z2$Cnm-@nM*ZM]+4ב#G{Ӈ@nM*ZM]+&A:ٳ7-4vnVijZI?O<988Vg|߶mzzmU7-4vnVijZlii`ظVg =ZVVt롵44222?>9l |Ƈ;SO=ϡ+z/FhsD@>s=\?Z@r)H###͑M\n#eiddd92m 6G7qjuꧏKbP3G>Ӝmie*Ҩ{[}g[-mJ.Mt M\.x0+W \W22Dt.cn>b->xVN6'I%MM=9ue4GM. ץԀ<}ζ%[VP(6=_ ^RrqQ ~qɜPY^ÑvϽ~2od"rsW  /UĠVZ2X~M6_m-{z6yϴ>]z2ݺt+iٝo87ވb_kjj;|^K @g[r?3y`|eB?}=}2m=\g?6{ǎlI1Qg0[kQ@N[Z²i H4e'-ӲK6iե뫛$pŸ{fAA'?ɫܿ//kG@n^V$F؎ǗƲl9~Ưdb˟' ۲V1j:m)Vfң[uu^+rҼKcvF:f ׿W9kn "Dm}줳iڽG[]z]SӴK7D"! /ӟpV@f/?r]ogZ? #?˂ojWpO6ɸԙιܟ=hkdi*! Ww@'vmmJטڔkm]LSI._@ft$v]lX- +_Y* D>@?wOj@v|۷)/ZO$\\ /w4Wm=cgN^1\diddd9Z@.6jTYQ?:1H~{ן|uw\= Nw?g2[\m?kiddd<~8'x#ptg:?--<qz{ͬ?z~su#k "dSĤutgmˋQk~1ݡW:^S|[yKYG2}^tb G3o ||e-VL?rwĞdd|!;s9}(}\oPFFFFMd<׿ǟ=qK?}r?y>x=O^tp҉3Sǿzև϶+{cbtg]X=W)d1222 D@ 5J/..׸+۟쎉\[TxlN4m{_I:bGίp4ZGfWC.L vwYgiZ#eitV3Jsm. C__?=?<쟳ĺ_w@_WeS /`:<>81 w(sN~qjتRPF[\ ǞѦ*5 ~H,xR~hMP95st1b =75*^yo/7=vU_oYZ- #ьGWE}o ‚(_xVo@mq]ſ|9hÕ?K/-r#ʃ 롡S9۳gÇSX ^V$^By9y Ng^Y.bgaU^9Kdiu}&=*U:{ cl64O=W.b;JKKiXrmeied_DgZ/ģ'~&]-VhdJ@ She]϶6_#-Y,[=Q&.24~qɪG2ŞF'țFh+t)D]%ia`r#KihD@~[z@2>ɿ/km V8MPq|lbSmF&ܹsLW =z|Ϟ=Z@r)H###y:ۿmk/24222i@ 6G7 F!H#####522422222ZFFFFFFFh@-#H#####ediddddd 22422222ZFFFFFFFh@-#H#####ediddddd 22422222ZFFFFFFFhy@NOOovÌ6Y[FFFFFFFrcdddddFJradddddvz.qF@IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1452446628.0 guiqwt-4.0.1/doc/images/screenshots/dotarraydemo.png0000666000000000000000000020507000000000000017505 0ustar00PNG  IHDRxjsRGBgAMA a pHYsodIDATx^ULYPIbdӺyd*.f83 %'%'%g$+9DrT۷uoW=[T*^3ia mI-  HdI  C  H1dI  C  H1dI  ے?ĉ_5 `AAAkIw9yÇ?~ƌf͚:u1c&Mm6L"  x[SN=zĉ6lػw:tȑǏ7OG X@AA~Ν[pw嶤_瞃XFAA$k`RR٭^?0@cJ<,'|2eʔ-[,~^t>d,2yh19<KJ& "!QAֳusTب%YbmIWޙg̘`ӦǺuKZPPX5d!{|ADtodI HEǒ5%ܹu̙{vW;zbaG 8zt=޼,3g ˢYϫ<)YR  1EʒqaI{dɒގ?>q{]ժz䑃:߿?//ˢpl{ԓڃH2ĺlټ9Tgvd؉0*8>;X5!IitcHA08B1*PV̨<,g}6n?u"גpM|S9tDz(!MYȎ~}pvm8΄ޏtlWb43cCN *R{0Ɓ%Ο?'o̙Vڼy֭[ׯ_駟0`ܹu2f806;dkM# ;:2S4Ɇa *RX  KZd@hYR0 .ڵkΝ?3flٲEnFl&֏٦olἨ85v=?Ȱ=&,)AA6YΌ  D tAYR  b YR  "Ő%M*7nġ8}  R YҤB   YҤB   YҤB   YҤir}e@ǒ.X/?{ߧ#fcO>ټnM4yi#1{l &LȎlqΜ9䓽 <ʎ[tK0+yM/ⴌ,}ut>|8&O?&'狏?^d ,m۶ܹݰaöy:  5Ma }R%-((6 SͯX>щ믿_ٳgӦM0|0 qA[1}~kϾ5x.@OQY6=fgveXMNurɃ?7N s\@С$Ly1[ 9֥7=z\ ӧϜ9ذA x` Hd,# bMj,%+4fXE(,yΝ;ɩSv9uTǛb\v-P{uEЊeAQI%zczget̞=gΜC=c ۷o2eI9rd>.^EaH4,S9?*:GI[tLǒ/FyFWͲ^Y=4lccG-8|ȡ'O >kөS˗ /\Ea^YYUV-[߼V{2?uȑ=zKkg,8xݻQAQI%u 8>;|N2K ^\ڬ?|aas?0mڴ ڵk;7lذ4Ē%K_#LUrK:cOɭ)"&,mr?_ nu;кW]6?Z0&{*b] bX&O1laÆf>}N6Lr6mtĉK;w>{{܉#G]WdI B-իWdJ=,)c挙;wr L… 6}9{ӧcFu;w.Qp`>׬Yxbgx 0 ͛+H%=dϪ_,Eߒo4ǤqB-}ب>G<_|bUxӧ,&MmIm{$;ϛ~'sf͞ ys? FfrfϋC`;ٱcӧa[ŦX c!gϞ=JAŚTZR/_#G:N}]’ž{ĉSL=KΜ9s#G\nXFLӧϘ1L0HsXRp@@ג~:g=]2 l}K"k/9d?/8=fݸ~Lxweт>oM4첿Ym/{vWmӧBĉ1^OعkWV-aCi)cF>l쬬7{䜜J <{,vyy ~wohAQI%QB{ze;h|%v5nܸ &L4iرǏoݺѣyfXR`=/^윾V\ O?ݴi*IQQ?bOMiINրU/s'~C;FcfDKj1K^ܽ_6?cwjժ;vfy#78 m\ھ9JzUAƒY Io+Y\~$Ԗa߾}[nuvϿ?:NB3f|b ,#N;$@I%' 8P`:ۈE]'~:MzFMߑF)FMkZ }Z}n'wͰY_YrD:-z淗qN^0$,]v? ~?}{ϿC/^t߾/<1}_ԛoggyVѣ/|׿`VAFƒ^ѣvuȑk ZְԴKHXRpoK??iӦ:irUƍ6mرc?SkB|ӧCB dIWLɶonYdFk漶|-sG`oM_bn'zS%ޤ߻k^~?3~D.y%F8,i?? G#~~p'{ܿЈ?7#G:qc6ڵ|[om m@2= 77?7M?;ɟ웟 XKbGz{/z̥#K o'ҟǏÿSL裏L# XRp@@גn]C[~s+CٷlmWV0ㆽ2Mfk~xW_}5t,i3a/;Mk;r}~XrmI{6ƶOt|U ࡃ.8 .ے;ˇ] `Qϟ?Ƕm0j(,ceǎ??1XSUW\ l~׿FCzT>AQBH%7oq?ݺO2'B|`#ۃjҤw]L Lȑ#|A 8pʕ= $GIN~e??~oϯyUyô2_,-[F%='nEǏ:[.?oo<_w -_[Y<ѽ'\ػgƌ5>:8ͮ]f̘~p^(v\>s^`Ν酢AD!ո;{;w^Vver` ߿֭6lXjsC҂ =`2b60كn޼yBfΜvp֬YӧOcc+M%3Q?|195w{dп}߿× :t=g1}Ns{Mc2?G@{}·ذ Q㲚n1! t:},M(#F? ŋcǎT?,_~\ YU0|GmAAr  9)c>my}#G_x_iŦ()p=zp0`0)pve˖ *m۶={ XR_`Yq~]`@Uh"O- .˖-3|&|n=zE>}cO֮];pr4w0S{leǎ7ā/ؑ#0   5)\,ݰyvhϗrбE#Bq.AA[R KZ KJAD KTȒAA!KTȒAA!KJAA@,ip̈  (N$ޒAA/ȒAA)&EAAqR%%  KJAAAAD!KJAAAAD!KJAAAAD!KJAAAAD!KJbB5?DskdNfI>A%%J t@ܑz"Cݬ_4-)9W"M`fW%%%YRDX]%:Rag4#?'|QB!KJ(l{i1Ԕ"YR"-! ?Џ.bE#CNf J"Ay!KJ(ctj}ޙ $S;XeyTv6ќhL A %b4z3'mtpڰ C 8=G{n7'L`v G;Rv fGsFdM %u>L YR|~5ڻD3m_t ݣ&{h "YR{ m#霉1A3ȒGdhgfBGp|9kThҡ2a#'m6N oC9AcȒĽKd>}e30{P#kВ' L#"ή ,)Ap.|Gv4Ʌk5]0ёD KJ_Ȓmb>4?1 "%%/dI öw4dYZC&rYBS5HU̘D!KJ_Ȓ<,)~r߹sd ùD#KhT}p*dDةٙ!D "%%/dI "(*A%dI YRH9dIYR B RYRA %%  YR B H0dI YR "%%/dI C %%  YR R- "eY_3%%/dI 8?4v3tO`#"@zXR3dܸq8/G0,R.p%@0l.|r`%eޙkE0DL %ȒAA5C24¶i%%"YR  ,iwDhvFe'I\}{Ep^>}FJh|P'BB t/erC60VB!5rxq\Bh8 Fn0h'=}'-W2#QXd[Rp(Qtv胭wޱ㏭]]Weˬ]֭=+]0aBbtn-_>ڹ5)v0n݌|~ێLam/.yQ  _3x9Ɣ5v }@QlcH#Wv! 3}$8! CtT$<"ٱ8,>lOrw;?4L%lIe~4݆B/6`'ѻ7& yHtRz+f 'A@^,Wi\n Yp%l-,4J tB =tB<Vj xl&dV/LGG訰9ĉ8uno±L#Rgf]|>DI$4K) pĒ|R&M0QlY>K[c K/P8v,22Nʔݡϡ)k3g#iNW^bx9e$|b0Y8 ȮK E8D``!2K Ա~Li,\+*ؕrhKX@LLHLY$|) ݻuWAŊXŢ/Y3,a1Ш)7 _Lu.S hڔϔPLSn4n%,[} ,)AnReI#TzDF,qѫQ}])}a kۀ n>S >SB&0s&V ^KX)jU,aP5mV 2E'L@|,P ) *nrLދ%, x,)An%bҗaKy;"/p)\,`_r*/w4E>_~MK Q̸cCooTEǏ'[իl=Ю//, ^>充WWA҆`TE}J VA\*:va~`_j/.MUWa'ʀ j/*ʔ,.*0%];\95YR ]K*mIǗ%߱*U\,`Ɨr ] \"ڷa _gbr!Щk#Q4HvF ?bf KJ"`I^u}ted) {3eBSX|U,jd ^9/@v倡uULY$Z5>SB0M}֍tLU` H-6^f KJTYҨ'MMvُ\a,(*ƍLaddGdޭkje4okN@f|0d W hKX)uk,a ?X o*ys>S hْLLSn@Z'% Cx/ dI p2K2~ iB,)аwW^f?!^Ѩ3g$୷0y{,/ Mh  @SB =ix^ B7 xM-g&.h]PW#@M`Y gi ,)AnRhI$1|@tJ)W/'Tp5d& V  Tm%\TBt B `L);1S;KP ~~ t@0 PAS`@ 7%ؒ]Ant\>~<ɸrźv#Æn}A-@ߛ>\%`Lp]@-`hLqHQGQ*0V `. 1( [_3%%M MqCξjJvͲe֣s ֯O6 @v͊o[ vS 4kf$`*֮O@_N@V8%ys#W @ ke-[_0SVQtKC!`rq\H# d7>kO ' Oa1@dh$+'er{8O%X(`AFi&YRWZw#wo~|yK(Ԩ' C!}% 7Hp|0~94*6%ছZ5?B<, 8 h*@K|}I ;Ԫ)֔_3xs`ƈG Ya bK1QL Kb2-C i7bSOx,aYT@͚|,P6) UtZX<$S3` H[X ^m*n]>S _ϔPLSSl֍z%}[l`` OBK9ip! BY; q%ų6,)Q !KkWÕEFɾH|3ŧB&@ 96P@V& 0`V PKX)|y,a!MBiHLKP@n.}E_,+7[_?_3xhҡ!H=2v!R a fP˒F3L'Lq`CY5lI#hӆmѩ_oU&խymiԉ/ϿR &Տm~s͛i8;NUƍKjUQ21l|U:-|s[;Ur@\* + Z1O|yA4YW,U.MULU1/=_`p/z!|h2b YD g:mMZB=id7 k{ i%ob1OjDуmea U,g nKX4Y! H2޽4Y*%T_-` K2 U |ҭ<>M22e!di&S0>}?_3xCW UZRw2)R2D1,+|\AXR)oKXV=.a@3e!tn؀U,&SbV_֯*Ckn22$&eB( @}‹Y)@x1/ Eْ:Է+jRMQ2 K*Bfg[ :NY5f phks|yS 4o}1`H,00t0 {AOOs#1K8 d +ǖCT::Ȓk p }SG,@xY<&uB>.6,s%Jk5CIA(4 5o@ŁTAH Ȓ,)2N}ՠgDcX\2,Ka\2,)AnȒA5YR ܐ%% kA!K+Ka\'"%%% klIA8QR_}ֻZY'[wc&WZ˗[zYmZ٪'s/ &MvvM;LXaee P ~Ih+/X$D+OJ%B%J^zɺ.9|ӡ˔jz2g7xŋ1_60wME0N Td5lc=)^yŪX1~.p!&x"Р\XOϷg I `'Bc=)`iJ[Ƚ @˼yP,D5YR(%pU\g##~srbl@С&~ '4x-K Bo\Lb"`ϗx~I-OJ,)ALȒJ&1Sc]w_vA! ]B tf*v\ d!IB<r f 1JP [@V& 1/`))0J؀ݻcO5YR(%ݮ;J6|Ge|w.m-S/Kp}w&M0 S%qcp,p$GZOc Hx 0FNUDp`4 BS&XVB6LZh 0;5C,w^S5j` ĉZ6 dϔE@ϔP>̚U,Wd ZKX)cMU,N: !P )dLY4Z7`YIZ[l`%Ò*}*7cIg=gm5l g>Dq8XRְ%<ZwwW|_k& -];>M|_k!/sZi8ӾSNA}Fە)XWSP_nYg[qm[*:_2*VF|":urrp11\;id%Uܗr t}Ƅ;gbC5ra". dNdPN!ƒl6DmS 9-Y%SJ;( _oê/wtrQP\.M. #KX| r!.KSP5(`\"]14,l13оGD#-16$4hO,<CpğcIKqg dI]|aβeO?*3eqX2y2 \ϔPԩW ^9L+*):Xb(@LYTgB(/Ժn)@x倾H^9 F4b9%ti$Zh;7ؒe,i0AȒصKbPXŒg ##>"fn]S+Ф ) X¢/Po ط*_/M,a1Ь) к5U, 4og j%,Z3!_֍-%i 7[l`͐xK?=lΌ 6w3 kQR׻)Zy֬ mCXnX IA8ܥmJ}ٳRMQ2 KšC/wr9sJÇ fm"k"f С~Iw̋9!@ IEDI,@.bh\/CȒDɄ,)A2f KJ%AD[R(/AYR|_1X S.~=A),)A _3%% Y0/{?O\BH&`(~\`@ 7%ޒ;f5h`}ҡw3{3gp{[5kZ7XXuMV/8~p=з//@L)CX;L8 fMZj x [@F'qaW*WM@FE s ҆en"xB\sR kA)ٖK裡ٸZu;g=s`J!^ҵU _)iBO?-}7B@v6((u JSOY.ah s7Уt 9 .^xB,'@c s͕C rhmOwf KJlIw5q]p$~UgY\Uzj\bP"Զs43x RC AX^W s"(5YR ܔTK:gvUx>u`ss\<@<8?Z˖akcY̛%`bwc(`Bm@!'|w<4&1S|;`:`"w#rd o'0ٍ1?.f KJiI^j]a<(p+(_^| ?, >}' Q\P 0dp$GM7It>,|s>' C&_?bw'`@S0e.Y`#K8 \#`[5kA)t2-C i7bΡ'^xKX/7P&)ԮgB(`*]֭*}=%,3X¢/֮*CW [ϔE@3e!u/^=,aI }[l`!dX4],22WM2:ǜHα'4Y T%,P< M2HL˔P@n.& з/V e&`kq/Bn? _3Z X%ʂaKy[@6|oN}j4YTn?hۖOSDN|y~ lT~l۶Pu[kޜOwq"6n_UڏybK/OUW εnTEZPsid&kĔ>d!\T4yVL0Vdǔ|rkA%ޝmea U,g nKX4Y!+rr4Y*i*>dPCtB芦<>M ô[}{cf KJ_%տMER_+uϼ_G#6`Ŭ ՗Ŭ֬ _g3e!_֍Ŭ ՗Ŭz`@ SK hmϡyq ֨QX‘45VмZv˿e h\^@Ssw[ u9ip` xa>Y&D_@;_K^h  dI K x'2 8,Zd*@y 9Td!£S <:)@qj:GsX!`Jr*Ϋ#@t^ Ԫn4,]q5YR R|-)пjoq)Ԩ2 1p ݇2H@Wx}1fs#F#1SLfUAR.Nx 5YR R-)лU4gdW:Z'ʗsk$FuT:<"!;R 70qԭ+}~%'yy[>|\mf"fQ=;Z7%GD3ψ['0mU>,)A~)8j>Vzm xի[j}8Jв}Hk [ۉԇU8zKk7!\hje$`pS[`0ЦUXcu1ַY'ҥ }#4`i270jT[f",)A~)4̸cq(^"|rdpQ `R/mقCbR.`αm%nnfH%]ӹ~kAiL AD``bId^wn%eFDZ A_3mIq1>tML/Ec%J%Ȓ2q?!u`qc3aϐ9!`>232'`~hCS51c ӞZ̬C6Δ{TLB'f͎k޵H3()Aa ] 0NVԷ \0vr3@VE#ÍԘE9l)谛aȝ54F2!3ZK iPu KJAH!OxC~F~q-0|[4&fNMaʲi014)Bn|L Dх,emn}֟jΚ<ڽ5z~ M^7LxU"!`$kNl$,`~Z/;LXaee } de^##,\˖-`|EX֟4_a-Hvq 5C;tدHb>F^)2V8nR0b>kI Y8(dL"M/du>eXwm5jc=3~ nzkbL嗍̝k?G-`"L*Y XOW^*V_矋,\ 4hc=1꫼8֓q@҂PkXOXڰ3ro2o&x"%`VԔGkL>&;YLK4 b;50~t͔,4C| wqQ(eNȰz}>t((,_½1 M*"A 8d n9p0}T<_>D%>a+5kފX nгscFvb07oᬹa=SiBx,~ƒmfE norG%~)(`KzM|cǺ:믷0C\ j]z  T.B ;x b.ϕpЫ,Lb(&^RR`.fcwd!`+5kO\2;Ӕ$"@I-T)iS8z*[wG2 Ǐۧ|w h9N0+Z7|}gb Gr\{u4p7|sn$y^E'&k(A-(4je%a$ E3_3%UA(HK}}" *ؕr€eK,a+ ])4jgB(`nU:*}͚a K2& oB`ֹLY$`2e!ӼN>SԺ W2a. 3KX@P_3̒Q)t lYOR%>S5j` ĉZ6 dϔE@ϔP>̚U,Wd ZKX)cMU,N: !P )dLY4Z7`YIZ[l`@ 7aI`kؒFV;;|>/]5Ѯ>˯\ѵ^˗[#.Mgڷw)(h2Zv+x}Ubr_J-l|<ζmTEk@SЁOSDN|9S_S_?"f:cG>M̕\ʗо=_`,)AnÒ-)v{1%wtӒbUC\"H@dd`/!G&H m×q5YR ܔHKG9˖Zo6H>qDф,'7ްYqVM7YժYYُ4jd{/>:yyQoݺ3q hDA!.I+3Hs8sԱg]j<NEXڰM 0Cpf00FlBcⳤD\!>Wzr"K:Yq RYR9]Xe>ҥ=^p>+AZۡO?n<*Xqx Lv)`|̏ w<Agb8Ёus_$gmn|)N~ Zc02 a,)Q4)ʖTePܖUF ƣb G޻RŇ@ Gp% /H)}K{#ছG:xOCa>䓅!Я=q. 8TLKC4HV !&58,ihu$>4ɼ%uEGY; !u YRhBŲeZ҄qerS5kH@|,Vk:bsX’L<%, mZb1zuLY$~}>SB0MM Z7d i &;}FKým$/422 8v84vWL=ZxNNΚΙD$Epv!KJM%Ed?*!Cq[Ү]W+"qXҫ& cN$@،BYY|,@a}*` K2/%,q ӇOL@r|,2e!˧U,`YIZ *`` w:݉lZh |f?r1t,^/txSه7 ٙv&98H{gGd܀!0dII¿X,3–4;݁6mV:dQu8/m[>M:g3OEUGŶO_کۏ~^g@l=s PL*_8Ur߫ ˘oѾ= HaVAAAL9S_^P`/.MU`/U.MULU1/=_`|ǣKQTRxωp(>Ll$S->~Q8QVVŠy [%;OL) 'OERi/@xV_ :D'h d8LLX: _3%eMoWjxU}1QR(UKy?`IFk&bѿeJ32$@:BA XŢ/@x1k2/f%@x15k|lB2$gLY4Wu/@x1k2/f%@x1_3$ϒTȒEjIC:q(nK hmO^ Q#hky} мٹ -4ﶖ ޿+Jƍq'.d &xPըx5뮻0c'Boc=1F, XSBwй?V h KX)7E_$@ e" ) w֍6 ) sX¢/҄dx ϒjϙzY%8L, g\+eO>*JLYԨ%,'jۀ >S ^>SB'0kV ^KX)jU,aP5}:V :U +L@*|,2e!j e&`kqKl5%團ml)V33M1 9SDrDcm%˰<r4G8R{.(2s󓵇GN۳ɒ8XRĀaKy;">/tIL@@[Fv|">/rERC\{-_nYZq}{*:+S%`W2|-˯^+ )/%T)ܲζnͧl۶NUt:Vd:U4Etė>>*!bc :v\9Kի|/Lv<Xug02 Y1D'd0 KJMȒ#ÜeZs`w󙲸~,a4TIۀTgB(`]]g͞U,KX)Z5,aLa̘U,M38 0Y.SB0M}֍[}[l`͐Kj>N(tl1-4 4>4)P`L#C܀B(%us}*YXŢygIF[X4F 3&MLaݫ  `,|zgo%Q0~}\a/EJ GXth$~q 5YҠ!KJMȒA)kAC(%bu^_[a9r˰,Z)@?dsːkA;~(6*,)A _3%% YR "@f KJKbh\Љ{ RY0878O\@H p5YR ܔxKzHsVl? yCnUuMVjVrVz֐!8JШu@8Euڏ-I'Ӛ0 1`gX@@:VGS1`\QtK&~2 dI pS-i.V2`tiW9;g?Ԫuص[7#.X?.Pu2)P@@x~,9W~Zz}h s St\h=X^." ,mB_SOIB@c dI pS-iV ۯjTpl0Vx_nW=M|` 0Şۀ`*U< !YpUl0* ۉOyy/_3%%p{[ICIsza'nA:GQ&;Wpl ݡZ`2w#vmLv5kby,^n ,\ (<$d7zwBLYg,Znt@ s|w<&0> dII pADZҫW5nW>%{{J!ʗf' C&Oy:w+<#B.Mn|>Y=|OL@~Ĺdw'`@S0e.Y`#K8 \#`[5kA6>jȒS"-eZ6n*C#N,_n*fM>S ]ϔPUu[U,{KX)gE_]U,V6P.)ԯgB()PF_@zX’L x,iА%-:%էDZҮ]W+"qXҫ& cN$@،BYY|,@a}*` K2/%,q ӇOL@r|,2e!˧U,`YIZ *`@4hȒȒl( -iкm":uåɢzuq^F۶|":uoh`zc۶\|<ξS)?q(Z[n\|y~~ UGUpuk*RoԂhߞKS$s0A_ )//(& *ʥC `i 3??%˕,_3% E%eq[R\tȰ*ͳ]܂%,|,dM99|,JJ{ô`U,| ?DW4iAMZ y,ْ\k2''M&d^sMkS KZt KOWRxiV_X²rwPu `b 5 P5> |,`Ժ 5 ULv<`#!XG LaR~\iM)YҢYR}J%4~qм׸Bk(,Hw+hm-__4ov./y)@v˿ͻeֺ48f <0, H/@x% P4nk#K1vq9N/L|en6b-掅Ll%<"^yP.0@DI x'2 8,Zd*@y 9Td!£S <:)@qj:GsX!`Jr*Ϋ#@t^ Ԫn4,]q5Cb,)!{q}\zkm],. qvmff(/s`==bPcEg=/0mu,#G̃\pE!ȒJ_7^x8rKSjLC |L$ hի{>S#T`ȑ)& )[l' `# 5C,mٗjFhd3qPrlMg!\S6ؓ sP9;a,iđ<|0,)dImaD t5k NU`_C>WK Qb,2Jg=)5PX@+ <͵rG,3[>7͖Cz@cKDk['0>!) >}b%_`XhEd70bK3`n!Y҄yP.0@Dɶ3Vfa2eF Q8V=g0[no1Gp, s!Cxspj~q>.yE #CZ?o?Pвu"~/ !@Lq ШO D kYR:-RK6фHkpY; )?J*@.bh\/C,}Ӂ1x`1]$9 6v#:h#F'S"I#À=$7Q=:Í%% kOWF&֒LC_xMCQw ?dI!KJA kISەڇbhHyKJ%E|_%@0l.'t KZt KYR "@f K4dIdI!KjYw[&YY[SZa>VYYYV۶V_`> `ɉUSX{b>.`Ϟ fgb >%2/: _3% ExKYwi?y:4 }դ d\e70oW^Td5nc=s%K0Fp'@kYwX< x 뉹_7`X…[|lzR 4lh/,Z$4 Œf K4`<(>`Kz7NddX֓}B+S+} 2dzkPB<p- |T`E(EJ1iΞ4  Ĺ|w(5 `)_-9`k) > dI pS"-ŋ\+*ؕr€U+,a0e.Y22eI\,]+Z`ͱ%WUj\0d73e{˔PLSsNPF_d ^/҄,)AnJ%0ADٲ'`KJ|,j/As){/) ɓ}5 XT%,P* (Sƚ>X LuB&J>S r i nrL%x,)AnÒ eְ%<ZwwW|_k& -];>M|_k!/sZi8ӾSNA}Fە)XWSP_nYg[qm[*:_2*VF|":urrp11\;id%Uܗr dI pmIǿ%,"rAR. #X| 944E F\l34ȒDZҏ>=Y5gV}7)IL蟴 H@|,LpuXŢ/%UyVXb(`4Sg2e!j ^9Li dI pS"-ΝUTd`KF|022y5L- h҄L޽XŢ/@xMLa-E_oB'&e C& Z7OKPH k.|PpJ%^Op.K[[c>w`\7lh$ԩd(UJ*@3 :OB3h )\%I { s`a,$ȞDv\d=!/DS,%XVB&!''kAo "? Ƚ ,ϧWBz~BA,!j:T@Ngtuf ~0Y ~;_…ZQNX # ċ #`\ zd!n 3kA>AA4fI mC ,[f=/G5k0JgMs[b_| 4m#|5+`jLPUbЮPG!@@fF`]VO`u. dI,)`K o͜if?!lg:k*[6`> `,|zgo%Q0~}\a/EJ GXth$~q 5YҠ!KJ,i<$ޒy 31,R.p%@0l.|r`PD-w^_ȒC@ LvPPM7Yuڏ-iS s  k1ߍ:u0MrԪn@*X XTSOYݘ xi> 0emt92䓘FS_3x5K0NmSC7%25jpKM` N|yk,azպ~>Yʕ JfB&x>Y`h U \*2K84<0s xA>Y 7'r5S撅Cϡ/tkȒMԒdI!t2-7i7bΡ'^xKXV0P)ԮgB(`*]ຄoXb.N>S<%, mZb13eLY456j L7{q.i36^`@4hȒ~!K ݺqLXy+7ߌ%,YY|,dt9c3N ^KFʗ_P@߾|,dʕ3e,) \>M ݤZ йO dI,)׹0`kؒFV;Ц Tѩ_o} &խymiԉ/ϿՏm~s͛i8;NUƍKjUXl=s i *TV֭HUR r{}{.M̕}r^\,*&* *r/W`@4hȒ~Ѵ&QRݻ,2$5vAr dgi ?BV4i(U*T%,`oy6P!) /O0m2F_c$`@4h^_p뉅,X}\µiVċ/b ʕge H@ݺ|,V 6l*}‹Y)簄ŗu밊P5>+)|,`Ժ 5_`ȒD>2D%HK hoѯ1 Q#9ʗJZ~B!@nG|M d50h*md x!>Y2k]NX47/@x% P4nkA)t< A瑐>n.4H@&`;l`, HNx akA):#ٓY.^UO/oS!;Hz*%ۗZ"B @s} YԮ-&͕C SG, B<kA)ٖ8}j>/խV:.@*7RW$-v ~3;'Z5eKbsgf͌ b*ys{0wG@:ԾFfa_ΝKKGh'҆en"zD #D5YR ܔxKfر8/Ƈy~H)P\%`(7nű/ġx1\)0t_ 7B7_3%% YR "@f KJAD`@ 7dIsU ˁ 0\` 2L! AAD`!dXAtv-A,%ÒmMڷNv}V5on?O `䳭['@@NN<hΚ2ڻ V@K`Ϟ kLm&εjU$GlOS+ %˼h_!f KJ_J%};Okﶚ4̝k,}# ?DM@]w/`<@N@2VŊVF8֓b ׌̟o=@Ř '@oXO4h`$`{vn b'B XOX0Ǹ ayuk dI K/;Ȉv(Uʺ6w؀vOaՅQG@nM `Lp%B@ FTۀnTba7l$`ϗs<_B`+5kAX[Rҥuu| `.(/•pЭ[toL!:c4 3NXE JP JlS0} P@G(H=1YJ,)A~I%Y0K آ%}euGR{&?nSWć%P8q"NSBki h94.m?%I {+H|s  8}:`0q. i ]à),+!}l-B44hq5YR HKs}-)RNJ~Li,eR\+Çv\0+oKX@LKL좸La'\) ={tWAJցXŢ/E ,aIͱE_oBac.7LY4PF_psLYr/VP_3%%/>J -iđZ$~֡e9sLYԨ%,'j^ >S ^>SBS0kV ^KX)Z5,aP5cV :U@;L@*|,P*) @}$S@X¢/`ȒᗤXҘao`I~pX%|.& n}OS[+?.MAzQP@v|""+M2rK@NX\@|".G tȧ) pdpо=Vk7_JH%K%Nw%)oIy>!_Ӓ喵?鷿u;Qհ#Ɣ1O|OGȗ[Q.M_7NUt:~VAĐo("$/)/Uկͧc3$/G 1/W>-)_`,)A XőaIKIR|\@|,OϞU,KX)=60mA772ea~ԺM2Љ{(.%U%zRhs>tN**U Q#>S[oa )s пM,a1Ф ) {uWE_@˖Xb.iS>S @xX o H@|,`u/d{q0iBz`@ ,]Kj[0! PܖyNVV7ZG`L7h-T)'S,| o%@x8) { U\%f0X. ''&Y^Gvu@S,%S#Z֔_3%%kIwމCE%M@|]wanݼP~w7%\-@昢/;1Snd!t~V7pm| j{{  'p@G(H=կ dI "n|Yͻ6sd[BۑS*ESo(Lq(;HU 4jƂӇZMTys` Q'lf`@ FߒVmp?}l5du|?$mIx>9 ^}ٖC!Y?FGի1C8yZ %$ 0A_̋Xӧ#@ dI "nܖtu37M!\vLmoRbߛjĦ-qtY/wIGIYoI ,)A gIm_>?~ӲyW/f?3k/=8#n [,kPgټ_Y {Ĵ3]fO/YR "Xf KJqZu[׾svΘm 9lsώ~kQe>⑧'׸qm;aA aw ;Jj_a 4`=}eL;bg$s!ȒFtG0,R.p%@0l.|r`@ ↵/ZL#v_Ώa~{nyŅou֝6QtGKZv3iFZ',)A,_3%%a-)?~Gm]rud_C?Wy݃vIh1:&v1f1q4n A ȒDpxO/֝׉:թW^>'=1CCymGu 33 v]ZQƏCrlF#v!8V3==!j<^ė!@6H84dAR.jU[!@}\\Hx U _ 7W Yx 0,)A$%vۍCF ~ꅝK)}wGzP xq>ubMR>VFG@:&9jd7 @g( i(`"-K`5|w(u)CGOc <$&` dI "nԖ4})F ca>Gn4;ʗFW瓅a(\ `$x>Y<`.MX~9< , n C0YC0e.Y=`Y I1kȒDܐ%UtrN@ڦMX|,-,aYT@Z|,P) իuZX<<$Sb HP_ WϔE@yϔPLSSl֍%+@l5YR ВvwȰ*~[%+OL1'sl l>MJpX’L*` X‹ ˧B&\9>S (_ϔP@^& U, M2F_ f KJq֭PBQ`CY5lI#/hӆmѡ_o}&խGymiЁ/ϿՏm~s͛i8NU~(R[n\|y~~/ UGUpU+*R{>̖sih׎//(drpnͧC J ~@1/×+Xf KJ_()%tQR:JJD)ZR\xE,aYBSԮg" u 0S_@@ג 04ۀL`\,T_@@ג 0еAbjI9:FU5jp$G@dw'4~Q@lQs@j o.ࡇda b0YC7 j srGCz`@ _K:oHX<RxlaBS:4f yBZftN9$G蔃ţa ,]%` w@SB0MmԺ &^_=&4}uhlYkbn>S5j` ĉZ dϔE@ϔP)>̚U,KX)Z5,aP5cV :U@;L@*|,P*) @}$S@X¢/` & -o">"\dNdͻip r>ǥ"W9 h׎OScU_`eIXYn| " ЁOS[(" 4E@}n,_ڷ*`M0ɰ`CY5lI#oIc[R^OGȗ|ekْOǙ?ѩNQEc[Ҙrܧ#ajŧl۶NUt:VAؐo("$/)/U`/U.Mgyǩ/G 1/W>-)_` "`(iOOy~lbI{CEi>N 7֍tLt @Zҝ;u﫨T*(*ڴS撅!Ш)h"wUp V hKX&BxUQ N73eLY4Wu/@d _e.@ & -)V0o., C D2'Ojc3 s3ZG+ h )\%tVL, {A1Xgꮂda,:dOK jI l-Bt@)Tz`M`?m۶_~ٲe}ٌ3&O?~#F8h :t(5 &N8}s.ZhժU6mڽ{ѣGq&=-)L!ݺy?}Lv=m(A)ubOߎB̟z*@AjIxR}BQDB}+WΙ3z9w޿cΜ9sɒ%_}UAA J$ikI mC `t9;g*_?k:l'"b $j]53YkWLGXEG k"9vNڻwo{F߾}MnݺǏ"oI HO@.bh\/C쯉_|ŨQt>.vڳgϜ>}慀lhG}aÆ'N7':JJAHHv9cƌ^zk3&5pcN6>[|ulٲgϞ:tp0UGBKRPϜ9s„  ޽; ğ~)@'dI )_E'N\Lzx8dȐɓ'ϛ7oڵw>ܞC~0hHXanuƍ-:u?C.]u޼y3."(& δ S.~}IҥK틾?{А`IO91c}wС֭sFDdBH )kn=L{#G;wW_}6qА’: c_Z~=NHܒ~ʕedXU~PH^UUUFGgs-JԎ ׏pl7ߴΝñ:ӧRߪWH@&瑐+( A8JN P-iSQtKX ?!,_`M%-Y$={?~ҥKwڵ'Gt!АK #F{،m۶tM:[ݣfzd0q| 릛rC9ګ5.]|R,vmwAW ӡ2SR(9 jc$fQf !~ں|(_FDa˖-DåG׮]G.vΝC8~@CZ-)p:>ӧ~7=&NqDQ%m-i>_AϟrUlTJ ~ŋc* EAڑx PoޞV0t!8̂bpUHE13^&>#4Yzwbwp(4 -)p?~P=zS3 $iIε_u\@⽠=绣~}Lv3'Q&1|;,Pڵ1 YR XDK⥔5kU ݤ\LYg2R.&㩧0ٍE0?.&R… }=2iȐ!aQgϞӦM7C/!iIk]akBKvGֈXru|0<' G0C_ Rw+'|0~982K8 d5LLKCa>XVB#r 2k"u=z4Z* z;v8~@CZ-i׮]q(֭ҥKqNDQ" -fMEЈXa*@Ј SϔPպw_U,KXԭggE_ Wn(/Lԫg" SByy|,@^7}&`kq/BF+ _IڬY@yѷoŋoYR5 EI^^, %QH%ʂaK iЁ/߷~6Wem˧)C}֭[? !-%K\z 9Ң%U%tQR"߿?&% ZvhHɒptḤt҅/"%M浤/%,+VzJڵLY$@BFd^ʙגᕔגjn2ג пR( r %M8풜]Μ91hHɒK ~LܹsqDHCK $ 7kqyb>X-\qr7wCP9P!CL#~G{&G ;Ӈ͛7]Vںu+hHK%=}z=y}W^9ܶL~js!WzEX:oOpDHOKgއ Aq`sI5ILʢ,`B-=49*.TΣ'.x0sI 1ٍz.i[n 6/nIOٳkqiǒ @W~)* RAzZRo_3&sW~uBR |sw{tޤ0lf 10=ߗ竃HWSSZj?`M C#y-[?  X6w:uB,ZEI'm-) |zFc0׋ׯ \lp+_>:hw͗{ )yyݺ^!'G*jԪ%X1 h,!`.r}u0BW_!%K'v^{-gC8wڒvZD=+&"x%}3-Ô eȁ5hΝGB>}6nH i%=nAu]А,)0|\ƎࡣA쯉?D#k׮˗/?J i%=6ngC!0 6,"`ߒmMbu`udMnߏ^m?ڰ}{Ik`> `50mw/1@ CWS|K eK>' _ 壏>B#aʔ)А% l(CeI K<߿?4fuU >zMɼy7x+0_hzpiNCY˗c'n*YMXO hX%  dfXOR.`{vnЮPoXOF9-ֵP@aus` P58vM6!%K iȒ|UΆq,7 %͛^Š+P$ikI JgdD;H*eqJsscl@(@+Wo60`JeZb$`@ύS-ӿVh0dJIB@` 쯉1n8t:/^_!%K iȒ}iΆqj"4zTFIZ;L!]Z]Ǘq/7ƕpУA 3K@G@~,P@^ޫ򅐰JG@G@>,W…Z@NNm*ϕpa.r o) + x 쯉mÇ%K )cIOlh4J>wR=K ,]Wkע8"0Ӓwl*eRO_Gp)pp'R,)Pxu-k4.m?%I {-dZ7|s z ӧS,& ݡ%Q#K EXS`M$ǣǑj*FC!e,7V6OSB0MmԺ &^_=&X4#H4dIà!=}A e#Q8,+W<ߤK -@-k͙U,wgʢF ,a8QL=H 2ŇYE_}a K2T%,ʔf*CSjh RϔE@V3e!u/d \KX@l5/_FҥKѐ% mp6cYsΩ`OP ihI~pX%t*& n}OS[+?.MAzQP@v|""+M2rK@NX\@|".G tȧ) pdpо=Vk"1ݍ~mڴ )Y0hHK8Ʃ㳤\}E}D0$Ò eְ%Mt[Ҙr>-)_nYZqt)(rTv12;˜r4)/rXZi8۶SU6d12;B[p9 } _hKKwqbF"-iL9Kի|OKʗ+X&~̙3ɒ: 4lIO88]7t-),v\`D"()tN'9'… ׈vZFC! [ү,l(q[R(TQ"ihIoۛ73!"}-[b K@tsOM7i.no_Bz`M~A%u@7 iؒP6/&8q"#F@D%^yWR⛵@@i @i>I&-@%M#@=R2$0j:{T#!PE޽{1uT/s6of6k׮U"{N"%<])[7B<Ӯг# ?(>}V\L)1S=T@<(^- OY:1Y=*?M놦F’%KȒRXSvsgC#ϝ8ahI*KU&m-iamGJU<{FiPT2IINS獦@U R 6 dT-G"<fItyq` c >a+5kŒףѽ{7%Ņ%߬[P6{АA ##'˖o].whCnzQkjL7,^}#GU0Jk4)52d+Wb'zndVO7 @*7K @˲e[|wS 6ָ[ӄ!|-3`M駟< iB,m;>x_㥗v<YG⋻^}u_{[%=P6hH ,իW +FٳQ%hܒ[ӦC󟭙3|lgZiiQ0}3Яn61cu H)̺]b">%2/: _f;QF!M%3fߎ 8&ewcEܒ/yLZ %1ccƌADIKbܸq8/0,R.p%@0l.|r`M1tPt4"LВ¿;{jQϰa-;˕5cWJΞu(4.KtR\1" *DSL,)A_fٳg!5g_3jۻ={А Kz|4N'M;w %]f ٨H4dI )_fAG#bhH㳤[nw-˹4#{G*:4E N!'&ON%e+FD.]P%h%}3-Ô :q_4ڵ+:/FC%ݸq/~hEhHShIF ~M,]pH@DA 3HXlRtq,q{ZϓH$r.&@/#aŊhH}Y5kv<4g΂wܱۗKzQ#N'LI%b$J"Ѥ%=}~_*WKWJ˗qZ[VbU`=5b4mjUj?\@ֳz?-E ECX;L8ٳC@M l*Y3[="Ð!3*WGs1`\eop6H@KvF`'HՈ2ׄe$D^!6m9Ι%!v=aDCKz7)ĮJΞ:@K jqH@DIgKڣ%#9 I\yrVzZ]\d=X@ݺZ\ s9 l[&?TOWݘ xI>  vN{AB@ژK) ,Y%@Rʚ5|wԪnR. N)SFSE_fYf!հ[gq-L۽qunv>?/]%=6~jT-+pň߿?$`K%]،iVq[+Lq" u XZW뱊E_c uLY<, 4 |񅩀zLY$gLY456j 01ߋ˔l-n@℉_f91cƠ![WΓq ;>?Kwn{HxOS322?w.hH㵤GĞ5Ξ:pK:g\1"F*DcbIbIw;\Ydd7S!nKX4Y t" :f dQ5hV f,aI E_^7C}i 9DD@ʗ3e!ǧbtLѻ7VkŒSѿ4jKt}bo_ǏhH-Æ 33w*OY;b1GBKѐeIO޽;q4+ h-)+FQ%hⶤ Z*3–4݁6mV:yOFѣm4Et矹>MիO ;t|<6WNU| %`?QZSUGUp"V\Çr{}{.M[\,`>SߋKhl/4yVK 2)| x\95a… ш֭ƍ=-鶆 9OG۷oGC%ݷo>lwOOz;㴤|ʕ|u4''WŋJ"ј[Rq %nO:JJGI()%t4FՖtܹ;e1q7lH%u7b·g+na+:Xؕ!:u'G‡H40k\%lق*D%WBJ`Iy-/b ˊR&vm>S пQ( r @x%ۀL{Uvqf7k(:3؈q7fwFm઻.`lm t MC €(o/塼Ay7yneee'4;o̺%^B3%%-i477Qk-Ʉp$OIcU]ճn~cGX>P.Ğ>yҼZRjp>$2FEu|cjI]ق@}Gzʉy)gKJ.]>ꭟ7|k9_Pb/:e'{dih\(Ox7@О@9}q0e52O8!mkIXpfѿ|%hǎ#G v^tѾqzGǏYhϭ %86Ά4tɒ%|Hd1*i>ȏ%}0@^Mf\R1)5LƤ,f˗ o\ j( qI5Ln*d իhF5 0.iq©JcI*x2!>xϏlHkI=l#;9GػMݽ{ݽz4+ј,i]]/ b ՍMpMsz:H#^ ^EA#ٛfL)fܣ|NhhB?H~PRGk`MSS+V[Mv\x`a߾\"%ؐaI?{"l׮,C`(ظq#NDUdhy>W믗<ɽ: ƽs׹{uS̗j9I o)ċx(пB!7(is'Z ]k%Vjm\@~r$ΐP40}1qኊ 62̙#ƏlNXHKl޼?rܹ%ؐϒ.] :|!iْ'O:^HΗ`ΐ!Fxwl@Tۥ_(=)%+%@iM@Ы6'Nr 0}z~iY_~ɯ@nݵ'# 8}<8T?ߔ@Js.ZF@OkWWWK-w-k]~uk-۶yxɓ'ِ`Iw{9> RnI[3{6/-[x)'蟿+ pGjZR!ќKb Ȏ?3io{'aA>Xv-˖-cCbI\áCɏ&fI?{QvƁ~%fàw D,)8iؐXO>)83!>x-i?gAi>;rh| cرk7p k֬[nE0gmOϏlH-ڰaQmӣG=?J!ͫ%=vبQx(Kjve96,@&.d{q_l۶=gyՒ[㬳FdCZLNcf c把>>cC%}W(CbWI(䏆92Faϒn,6ⳤCYc?&2lHcǏ <'p Gcc#;ޅR[]j^n4"n^nuǶv_sGC[ lH㴤 .Wi&>x NoIw.:OG 6EhI3xܻ:tw/]zt#˖y5'&̨G 6"$#t[Gkϐe35f~sr\JP%8ϯR5wV] }D}Hs˯z\fL{PJ@6yXKйaTkWB/I3zl#6o g?>{6 lHcIMpOpВC`ƦZKιBg;l&I?%1ir">Zv:Pγ'$.L@ $矯pVh}>E*V>]CڅF@tzt~Yj L6-^zIbI3loh6ؐYss+1ckZKڹ APCE%/ d!ƍS~yʄ[Dɜ,R@UU!OIX('r2Bz55 0Vm_(^h@.T,%Tvp YLv= ƌKʆ4KJbƎͭ5I%WQV~x.MKnJ 3BhykCg|LjZ 80\%<,m\F@ykCJVR &)HY51J'O!%m %Μ9Z"-0);v?]i\rsWZȔuCr@[p]b4@dB4T1=ݺ0\`(\R+f"& m6?l )@j! 0k窪(3gRXؐYҷzXAuu5 B -yF(>y5sb*.K̟otyB%?3U.3U!`AU~'\⧐z?:vtb)ॗ.S!f"&={ m s1@mw?(\Co_`CKJɍՀBBKb',_NTA7(i"(܋B*p挘 a4MO\%:XA )VHF,4@9I@*`1M\E sF p bcΜ9lTTTs%eCjmIIqq<,BXR~xm%SL[6-(###ZRqN?ܫjNsGFFtGئ<%mSND Gtb9!C4uUfhNCbȈw!h"#@,(@,'?Cඪw mf -ir"3gT,.yB (weC K(R[[ͪH9K$WIq7q7 y7AlݺulL8qӦM薔jCު6dВ?܃ǛG̔J맋< )I\oɰ{H5˗'RSWWyfXR6-)?ܔj֬Y"@I%%{^ee AJ P PC fQ`l@"Y?lle)p$2j&`T@ ^xEjL!%m ڒRլY,\$H%%Bڕ3>N{}='K ]/2|lK'. ֱMLRB\x!gJ?tzc`2P^@Fu~՜,CdL.+ݼy3,)4̒FB %}Y @֒'5LΝO?k7liP :3gr @L%Omb#` ȃڗPKa(vp9δiB/O:Kpl455!ZRڣIN62y !RkI=T&gO įlsn-_}~='2`(K#Xxߩr֭PuSNYuGk9!O/@?)*kpB(wm%`*ի9! % Jk+9!:6p I&QR3nܸիW4G}f@L2Arܒw; lo'p-rl֞:Խn+!/2# {y9~d{ hlt&M۬ T"mBd'arojsjy{t9r P5( dC*"Fo!%4cI7m4fn,5uuuvx QoIנ 4VJ̞={˖-,Y eʔ)^x i`I(J&?$&N~z6ޒG=(d.AP"tΜ9+ᥜ,'`ن%hl/ I@ɣѣ/^ Kf͚crhygIJ @ !Ⱥ=lhhhhlldC,)i3yc_(`I($o=j(SZ(m޼y[li?|͊ n-G^|Pl%3{6/-[x)'KSRN@ X , lXD[ 0 i6o\UU*_=Jِ%mll0a0ɬ>@rKz;]a|:8zS j}|;vάY $=Qo5|tn?A<|jB:j#`4[hY_~ɯ0}s- 8}Z@k ?UJIjϗ x_"!}i2`˗//UKJߪf"ټPْ':ɓ9Gu]I-w> 1~v^.ছ\Q 鷺:P峄 G._?wP4Qzn0a яrpVhe;@{)+@kHɿo5jj8Aq@7=z4,jkk~mϘ!M%ݴi3$za$?AȌ_|t.VWWZ_"@?W_w*@@1;P;T@Ϟ!f@ h `""Te#/-BXkPL|SLaeƄ ^u2鵤vɓ'[2cԩyI%} ٠ 8?~&99ҥ~s1?sr{]'C#`2$w8?H*AH! j)`*#Y1oAƍ7rrЖMҩ"qq!?_A X95(2ґ4|'˸q͛Ć4%t˕6.yI%rەN)&InsgJϜq~S1YE+Jqb4.2 * FNJW^)&K9_ƅ`PGh-@[qU/`.JJaP:Rp j#[dِ%mZj,: =H )k׆_{\W? 04EL3U!a6qs%pMb*nK ʏF[I- m s@:e {LU\in5(b6nh8Q_=34!KJ#'JVp+)S6E -رb܇%~ƏT`rЋ\B*ZLSEYU~{.).]ďճnjk4U\""&; TA&M*?(3H!\ń \AqCnŊˢSSS3o޼5kܹ i-)U^xqԟzꬵl^bI:>Ӆ{[M .nw|O[ ~ik|CtTg딝x`r4>ӧ D} TC{FX 훝;w.\pܸqlRNeeEvo鴤o~y4ȫ ЌKj8&Fɘ,`r#KZaA $>.FX =z&@@>P%6lx"TPkhnn~6@EEł v-J @ נݰy暚vyb̘1@,)%_ÇϟvҚYf%`BXRK~_ 0q {/%K`O`H-…ΈO8/)+**>̛Zou==ۉg5IյOJ|sy:CN '$.44%H+\xڑPt/@.VK4rB@a.4B'M R;̜9ͦSNbH%Yڕ3^d)d!*+LRB}yUB@@m-'K @T"Ba„LIA e˖UTT 0#WQV< |I.M.T3\yO?-D|>\>) 4 K &@5=]w P@pVNJXm^pFT P+fg-+lb"HY5vU__Ϯ3۷sВjJvѭ|v>2B4+!.c/!Li'ɄLiAQsRW]0ҟ&ڲ) 3ULUH6 b.@d{LUHmJ 0kZ8vؒ%KFS̙3RhI3CqkqK/3Uq\qRb*bpeb*, `c.'??Ы1бtK ]P CTELz3U!@4@ b.2R@\\+_Жm۶ֲTrJ. Z҇;\M<$Weke^ ?i ;⟐89#hB*`01MWe$VB $#*4MB&b`) 1BL%1@$Ǹ*:_ȑ#/"{OG޺u+l^bICC.Dmʣ[RQFDG(Gb~A1M?Wպf!G-莰MytKڦ(@,r:Ci8^Uv"CFFtG( !GbyDb9a)U4uzv"9lUv!%mSNDpXђ?_ tDʝ;wr6jRx4'|^@!oܿ W){Ky"ܴ qo/7ImsVA )7AqM@!`|UL 3U!@4?HmsҧHa o.Ҥ0؄ܶm #y%7@[k.+'NH3| P͢d(ଳ/ 8}K G"'^(T*'O&,6krC#HL-RLPp _6ƌqFN @:-)a?T/E0Td&qPqbzC[ P*"ǏgږQF-[hKj-~BQ$cPp:M4Mf|W^l̘y@j) .T9tBQL( СCg?z(Bj-ǝw??l!Մ=A-srb嫯v֯P \zi+V;pUκuJP@nrrh#vv-' H'E%`NZ%z5'"[[ c-r%'BF{ァ@[RbnaÝ'p-rl|1iS4; KFtGa سV@c{^arTJ-0MPS F}rkr›ilE}TUUm޼(K 6ݻwϚ5QF'N<о)K:g^X lhaA`߆_`MSSĉٍ sh*)%_=tJv-`RK @ ÇcƌaCaѫW .)K}+@&.d{qBss[o%̏xb~?J*i47BR@@$. ñc6l0{ESvK-ɓ=zu | jԩ7sAQm./~̚/ 44 zk~x+~Մ 8uʝ5F-X 4@{ K~KO@ 9sO,R.Z{`+t-AZ;}<tf#Glٲe͚5k׮UfKZY)JtMFswR]h(Y ?nA~F~"J{o 6he@-S W)߷55c3IA]G!JW_w* O z q$S{A/Oo{3fX )VBc@ҿ4 hh\b&t?n[1?A-SNK Rpub~0bpb~04V0:6p~7A#㦛89ʕᇀ43׏^m+`*o_1?kYMPNb(|bR_@̤Ӓb+ R)`tf)`d#: 8_VWҸZ0@`L.(jK\JLWs , P}H-f-ЖdiN) Sr:W-b&tk3^P{qn3U_qul\"& ذTMʏ_K &1S%~Pƍ\R@cLU$[LUH6 9 2\jz_B*WPvA_@̤В+v6%~ƏT`ry̋\B*ZLSEY s?Х 1zR@m s^$sg1SRuub*HI\\e):[ 05L!,)P?Œf6]x!b}!woQƣi>\,?x;Umwqz`1M~ثʖݼټуZ_.Dj#G۔Qg[ECpz*[:/w{LHŰabys :)'" ˛<Cip3dˏnb! ]DjJ#^O`X>`rr=NK(w8?9!?sr߶`20jLF04cR^(o V V`20jLWhZ.DfXP{&o\='1@ ˗s~Np 1NKJƈ^X?US7' ~3|eE^Bs<9D~r{ VhUH\W_qPFkZRQ):}"ӧK;woߐ!c#%:m`4C 7N>ɾ:nѣRs4C[P#KtHޏzЙI5_@ْ̤'N8eqܣ3h;9uu?\PV_Р*F {wk] p==ί@nU-Gg񢔠Vv6[ @8:3x4=uO5? 4˷B< q6@8 `/ נ /H_L\^?is & O%3g/ths,ˉXa 0q oCA vPXҴR*WIנhɄewiѥO/]Y4Z23̧\+'{͚.r~Mܙ,{1󐭋Yzj2[μ_i"XRJņ]v=gZ\!qGm-Ȯ r˚Bu1ߖwKEJ٫ ٥} U%@ ܸo/AZ5'kq okqY2x5L$Sw˾t=$`Ѣ'+bb磏x9ip@h6h$ .ڼx! F8fgZaS7s"-Lkew [wIȬ[ʬWݨՖ ^Jv,&RnI p.unݜP/wG\S`@++W_ \r;B!% ]sj;QxPf&RO/Phr{WCYZ.@3@Py=j(% Z&hIJhք|?wg0po Ts|L_r]w P^w PԩfU!?k$@uPj~)&(>3xuMi@(4tNWSB+nݜfCfBȔu=%~7)w) {#>jc.@w?% пLUH6 @KTELbԒ@,i֑ ȃ%7g;U~.TTs^0IIe X %KʏKR@^\\@ǎsA,,\htB%G1S1 STTmP6 RHݻssFglp 1ђY6>j'*_,oa4M9#hСW$`Hb/`1MAmVHS$.H{5L$KwP%%멂3Z,ivӅ薴M99 IDATYR[?ixIΘ{q?ixwZ3{)?Ȉd'\XND 9t~1M[nͫjNC>\HE"J Ve"  2!ߊiZ<!% DCpXђ?_@̘[Ҭ[lho/nܿ*WMTV%ƽ/A+ps{sB ޴$`"c)ॗ"5 0qRMs6j @gKsFglp 1cjINIxiw|%ϕ%8qLit %~HS*W$\̔J=ܿtsG[>_E!}f\)*ڦ9@j `/` 1St C `34s˝ɘS2Q i^,)32@ǎ]]-F 2J%ĉBpFO : .(@pIa/p*'`8 F(T! P+Q[I)+lb" bԒXRS'⢋8SʨQCORtK 3&\@]'K0vl G0n ~PaMLRB?|Δ2~|m!pKPUU,%Trfp 1ZK7N+eeF~T>t2ou2|-@_TAfRYй5h%ٵi/6N hh4`/v R;I%vT;cf [W>8窫5k8!p% XT.`jN%([7 % ;s e˜+XB0mگ_@y9%T7,_.b'@JCJ@+H!$ ~} fRnIݻݡ s}u>^o;?ݻ&Lp6l,X4-igOh6hG)99P5L-X "qa^ r"qmX-6L\>PkkXRJ%kXRJIؒr(b&IKbk$-),)HⲤ@URr .I $.@B@@R2i"hCHH XR AZmH)Aڃ6 hR`I6mh ! mh4=hC@J)K ,)HXR0 a`I@I%[=D%ۆO5Z`f $p6\IH%鶤z-͑l+Ȱygcd斷5ێ8 )%ՖE/.LNȜhV8skGR*dCM+'9%ep6F'! ,Ԇс%D~1gc$ͅVJŒʿ@$Ј9!hKsm4'GeTjKRߋ9}</~wN86T㉓RmI3ݯ\q4bT|Nh 1"$2'! ݒK $ ,)HXR0 a`I@% K {#j; |P ,)ƕR; @mo)K 765,XR%,) ,iK KZ2 ˞eG gIe}[~;h3ZҌr&_o환,G[=kܿƫy'>K ?ߑ'O K L<KJߗwwo6˾2ȿ$W`IVⳤ %-Z`IV`IKXRXҒid%@Z[I(.WJ0YRߡXR0 a`I@% K $ ,)HXR0 a`I@aK@ @$Ҡ0IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/fit.png0000666000000000000000000014605400000000000015603 0ustar00PNG  IHDR9.:sRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>v˅IDATx^ Źuo}n{ȑd01 j /1j|QTpā8bDD@DAPPQdR@QPI]멩w]SOuO=zϤ)@ )U7xë}2 c8CcGslޮ]=1/|d&@K_}JqLd߻(l)@ `rA^Vk9FϢ}X=QLYj^xᅥK._|ժUFQGmm۶m߾}Ν|f ڲOl8s}ĻsaeAm=Ah4Ʒa 7-94̋ C9HR  Q0O>;%%3ǚmn!qN[0͈ՔҞ "Vw~Shl/|ڵ{ؼ(m>߾yu{̺L<,& ^vdlV#c㓘+aYofmJ 5L6M˽OTI )PYGuOScϜFr-p0ŔXq駳eSNgڻw/ s?aBw#=^ٗsp{O3=1×'x҂Bܲ!De蟤)@ +u1T\U a.9osp pڲhCLZb~+V=;vl p| ]wu $X+8%njIY<&O̙9W4}>?R9҂ Y}ғ)@ `@b~s0cO6L¸hC֞(uj6J8SM|G 6xX ^=餓o?N;u={:5~j=s OsAFJ]haH(N l^h,+Lցΐ)@ TP;fjǿ?@.'{ 3aD1":v/Z3AjxW\1sL~>C?a`\U\~Z@I;N8v;~8;5(H<|h}nRD3*GIR *`!o HP6s&a{(5!VkOS:b)naÆpПpݷ|} :++F )(u '^y#en'Ȝ9s h8J0ՔҞ "V;BuA7PS%lOz3֫yL @)u'@.Z{aޤnIFiHR H f* /s:F?jJjit)@ `p<7{@.sg*bC֞(ujo=SR HR4`wOFZ䂼a)=DtA)@ )B 0= XŔ&Vky\%HRjJjijuT7R HRX=QLY:t HR H`kpQV^)A)d5% HR H>$Vk7חXI)@ q҆)h HR JVX _eb'O )@  SA )@ Zj%O* HR VÃK$V) HR(Yb6$0|JT<)@ )@6LIFS)@ )PjmH`*<>xR HRX .mXR HRdڐUc5]JI )@ ӕ$HF]%GmVSv8J@ )@ \b50K Y駟6l@wM74o<ۤ)@ @ V$njUcǎ]jCyIVC )@Ӕ A ʹ^`,Ө.Kח,h* H+@͠ ʧ'rkūFV"HRE V cXEǾ{kJIRXX}SMh" V@ <L%V10[&ZK69M WX}SM4Zǰڬ'ryW=oc_]1WWWdԩ'O0!{衇NN63g=ZbѢEχΉ/~V\ _AHJ\)@ H VD0c w=:*-1cٳ/\f͚իWٹΙ;>?qAj,ID#?g_[璦İ}l>ղ:9a3v[QF[ֺuz <ko,W_]`#F@HJ\)@ ^)=F_v=0i1N49#<3+,~}̃>%ko╣N @2ݲ|զwsN\7UmXm|>k`?K/,Y3vvu:Mwܱqe# ᑵ!C6x'~|rR()@ jk=U#1Wv}ǝ#p-`gfڸ?O>7lG>䩋?pW?4{`Θʸ <<*g`7{[/lʣ+zSHW+W>2y2?Gῇy磏Noe^CYt;>^foXV.䓵kaUc[8"(1)@ Y {hB xg5ͷ܅ ~6s5k3FP>heۣSXNo=~ds:vɏ0n܃&|xLX8gky|1ef~G>Z׷Dz޽0k G{_4Y ww >9p̝5{6-X{| cfCn FiϠG_&)PKՈ,jj-[`14ٵVȔɓas9< <6<_ n!;a O>8'I[F@2yjyN͘~«G=9߿]3ɫG>1ho > |Rxsk֮=?@BN:mƒ3vῷvG[oܹвq5x5d޽@c}7+ ^ Gݴ Ĥ)@  V$8ֽ9U7CW=|A2l }=ݡj]vQ]]|W\zE\xYg~i:_}O?_ VoqWhUvxOVru-aŊW>UX\XMK[JL J,j/*1P6m+:tYV C3x饗c//oKؔ&+ؼ;{ڝwϘȣ_a3w3si gVߺ >cX 2eّݵ:wOvI\6fn@ʓ x)<̒g~; ?===Y~å^eevL?m|5k_u_hEZҖRb5KRX^Pۺիnٲ+?Wg7gw;xˆb?g/O6 ZXHgϼi|k]`'x2y$0y鑗>zS.Ҏ_5u ]r? 6`5hk͟윳9s{n߾~ E]R_qŶOwz[\@oY>`;wG߾},~B+JL mX^ܼy DN8 X|ubj}-40\O~b6]!y?]q͸˯97Wfy~io9Ѧ׿+ƢϿzu򴎷v-v͈yNyπ y[oّέt~ujuT+aOV''Ol 7^s õ-`Gw~c@^B  Y*.ߞzeW\u붿ڀK^xwt˟lX h ˋ/? s6s`P13s=_=N'!Cp ?0lj`7=oϟ؛{L؛9_n W^4ty7O+z tၳg\;&/Z"4n+@zRduXU ns<g(P<;7߼ ,)TX͒T(V[ƚ{oGxӝS7ذbh  !1{ p lB.0467oۓO> +PAh XMPya;jP}x 5k1nx W_5p~`~Hjxa#~5X߄TP5(?$dsB @j[ xaOo?\+z9{VJVT.%HR Y e/*+Wx.vjO@] Vc*@VA^jڒQR  Y*@g푄X=ڙjI E+@fI*݄ծ۷;lPX)@ > Vs fЄ?MxΡX> (@QҐ)CZhOS&~ {ذa*㦛nt'HR *Z{ZZG )@ TDb5ҞX :)@ ):>}tuu~#TXM()@ )@ *@FF;j(=)@ )Pjjjō7* HRUXXXMwPzR HR8ՈՈՊoT)@ ))@ @q i MIR H*`%Uvc)@ uV]lZwѣ_+VgV-[87&8ì::+m[ācn+m):|4 + GcyrՇY6=ͫҖR^){?6s8;;Lh-jmJUy?Ԁ<@pZ%HQb56 afM`^b5ݘ"Z vsrRXMK.JP3z5PvC,*y W+VWbW̦ Ҷ WU?fwj~k:S{PM%@_ Z54(K^Y-s0c55>q% 0C!uȕP# %ncKPj:ȆI}gVD)#U߹Rx.|WrXP])F4f?V3yR Md5%nKrEJ'fXTl{EtPQ@"ʿbIFi?!X C(M~X-x1VC橮>>lbYs.;/${qi/,aHt >Ӷꥬ5P\4\3W.f,5GEŋ#K@5'|b7'c^># u5P-6eGʉ6Z81/l"ޘμzjVq/|U5h4PV( w='-qxBPVӮe1k\˪#,ͳ{a5eJY TTKrXMd236Ky heЈ8lL9Uv7ZrLpB#UG̍a5hܚ 6aOo6z^XL?״]őJذ¹ \MfX_Y;:qj9LiN[{ 4?x f(ZjX PZH"W~Xp T I^Uw(j,A[ ^߬Vj(+먋F\M9K>BWPv5bv4״@7RT9/[V ãhJg W6Mf"HVS+7`3 kQ#-jYP\#VCtJ@˰Z^_9d_|V 5@EN P6u;^X>%Jx#W#9%a?._9vIF@F *jWDN@k遾7Q|VK+|pH0[1 *(R>W`?åx*\6 $0_n(K'JnjRϾdu?bJc r<䡵tWK;vi<峚؃M!o[jxO\My5i,W7WA5m?^;c2(u|^#-۪b@Yo굷a?rɸXa5'.V3\XLx"[UUXa"VZ(g+W}ˋO/B~~@U/Fu@%,tM W$0Hk,Y@1]*2Y1QRi7\s|a5xZ!]rW^ /mOj+'=CZ|.?&Xmkj'#Fq5OͶ8ΤsMnt#+_.HUSHʔ>xj^u#;FEN7}EqlD]Y 7hbW&~hZ"&[5вs-ՐlpQ&W edĬ{Y&6L|Vsi35NTUF.l!Ab=Wk=!=[,ɰb=qwA'ʬ^km2XjM]^ځ͎c'|Xm`dq/Qʕ_d|{Zg(Vox*v峚j67N%٥E,>qax-Iƕ2ΈiҘu Iqfx9 gWߪ#@؇mnePգ]n˲iin% vd&m)z]ad&ƴ[N+\vVþ_zbf9 P ĵ?JG6ձ[Je4oEjA59yz@b5*tތa=-F벚,9ob5bs폸*YCVhbbuz2*[ΛBv%a 4k:oF6-ej؅E͸ZҬUkaXV3> 54̢аsqڨ*)Zr T-bia9 XHʘ@˰ZBe².+^M*R傴rI2j{u~z-b:iP\-穵:O>]]]^kR6PXr-*jTnmazAm6 /{-Ud5 X-huy<)L&M]i.O;a=_Mukw:Ȳ4jٰBsm.\67vXS7D^Ō6";Ͱ2,ZL6r/ܰ.Ph5V./pC]8r65nWXpDHթKf nmRrrJ<WߔQw҈sb։'ƈZlҰFV7fӻxh-4Bq5K-)Td5W3\SnpS"J³&*8wP^q+; FFjjTۻZz˰Z(9B~UMkjY;5K]*/+qP/W*NܬNnPpׯp6կ$>IlfB,N =C*ucaL!ܛz4z #]~2(j%YH+2t7]UA]np(87 J6ŵseU 43#:QI%-)6@+iP RjHagG'z6#*CۖYuD('SBZբYIL# WzmSnf1<)U:[Zs]W=kZV\(ްF;!WXE$I_w9^'Z :Z0-VC&6 5֚{)֚뺪_ZYM-:Ekjh(峚^|}L1e$z_РV,i|Uej^)3ҍg Rs+:qE7r/ܠ֌b Br5~$\5셛rU;QpC2VJ7ja[&4@H`R}KV+՜`PUS2|;UrMږW[:W,l"t6V&OؗQ@95^+øZ3Y&$5DvZ֓2 >HaHJvm(`j;{/ l> O!ɀLH*PDSH tt0)Gc j`8w|wT>aӼ4*j,n@>@=j(`jz]]]U)s0gj_FSUlwO>;1[X8ߋbN+vY7Uaygv褹9I Q0O-cֆ4>#y՚ˣ]-=C-j_3#5?z~䳓k[mXePT?ٟeΤQiV۷obWp2W t:+M*x$V$ؙ.΄s; زC|!q^ fv{[L$LAb-º`,i\ʹ#\D- !dĺ%n +>[6pi>;q3Y@us~]ʍAXWK +Y-sTO7 ?6-ן iel>QMXg3rq5ßlO4 [ARunkY-x ,id@kXEH6נ|k .pX ۊtKM!z֫qg 4nן#VCtJ9E! ˝wVjwBrZ%+iuB}-xBMkSط֨.evz6qjec3} mJXPÍ) "ܼ^*M欖iq,"WzSg^ȃ{fi߈o w1u4 ӻR5k o>e9z6FqfA(Tk\ ˾_ ްm;,OFOLOb ַ}jgZIh#VKK欿!g수p=PG5,+J5PI7r-Uw (nW>=-6qjEEp!Fgծ(c \()-jZ2IM,;UKEtJzU$5,GЃ>ƍK9V\Uo*U\{ 4l2)=L5gw9 Q i 80/i{>; (˪zieGx"iGvMG|},ﯦfW[ Λҕ}#DzۯXiҍExN.-*Np*CjJ笖.*/SDfy؃K[plY!^Xl"M{ '%_X-+WSW `=u[U{Y WUg秈DeG\EXKWe ՜-Vj6MԝX )DZmKGiS>ܨ" +²ceXvb,U]'v8-B"[bbb bTM1/*ڈ؉ Љ.ʰUŔb/W1~S9IftmeX<Ž\iW]O4+ 6a5b%'Wxb((L{XJq8z6q~m=Qqde3{n,f*ϥ5PYЍlX * a5A[X MтV@!d]a;4X'F%eVA7 rQ6 Q.Їzt @G Vt* Ol^?[:&]adP (X 1VQeK(\r%pu\ЗRZHНSAׂVa5j5% ZX ^Y#]]|  :Yìt2ek3c2sp骀.6p`Sf!WS8Ρ]ZT{)Ey6и,M1YA58ޙ0#IfMr/Ȳ^)Ȳ 0L` gA xS:tY"{ͪp)1V3V؟,'{4.lK;م+YqpkxN+VEUQu5Z  Uv&äYjU  g0U[d?q¢Y)fk@MDzOL1t0ۊkIö M;6rd$s` πMNG6=餓~{챼?_6~ N O|Nռ%ȁřQ֢&<5YLVXVǙwWa"ݣIVcgQ/Pڜv_wqkLA@.}g|ў[.:@c'[H)!=䂼A7#Vx׃`>Q\Z̵e,WGV<.bzo\VpqZR[92V;);?Sv7 \F]O~3޺5^u͹+ ˮ?<| i %\3JfXXG? z(v"Nݾ"f8T]$WٜI8*PMkp=Ev\xw߳>oYf/>zWJJ)t^\> .?cXqՙ˯<{U-׮> o! K fXMu!sjjsT}Ӽ5T@\M 3M3zYevX|x'I >hY\fo֭[}ݍ7n{뭷օw˔qݘݯ ր ܬYq1/}J%Hx kܹ 0;A.*ծ;gm̀\O8!7LQ\uj!j R H˸i'tώi+ūR h6~1Ҫ ?-Z34`/=1=ycSoYVB8żϷ.ٷVslä p)kLڰ/!Splt+"zednn AU(PïZ x.ʯZJL / _{sx_˲@zō0S` ˣalI_W!iT+W_,2YW/PWE8]z8 -O c5أ˖-[v-,{\9r\\oQw96v׮]Foy\wzC% M\o=MX>o@Of9E&[i**{9<-b 1 䂼ծb ֿTjPS'h TXmv~壯L7`6-ZFs vS}8sf[W3԰1X /~}͘m?{ݷ} SPXݹs|\~}-;cߊ!??epn}Ttt_^`߂Xu]kfO֢, B>X FOQyG0 l I9E5&t՜*4F Ѳ>;v={ &I wV|~gĿDO| !7L9 SV ni׋CcŶRknk[|__3h [0-׬\ey%++}R԰XΰA4M?b1O}\!Cطob5ܞ_;*0Lf[_ߟ 04o}ע;WC?;K`io YOaЁF_$pyf\bF [Q!!ɪ6  .%727}s1/"dSL~&\;8l7?N> C.nX-{F@+̼Y3)!E$is1+I1-פ,|X;=9?e!S+^1Vp+l@ BkAek}oۏ'jp\pyFݷO%/ >y28oVOWk{hzR·)$H|7n˂0Y`aԿ}1}l5De]m6awƐ#EiT=j I3аY/@]ȎyrH"lϑr}+_a]ON/1zBzō0SWӎIq {*=P6?d. nxP6u`Qfjzs N 7O+Z)j"A՜,)?(X vg w^/@>?( V꫿/B[< #Ǵs> Ap`럾 sWds>l^}|@ `s`3iՑwAű O_\ !9TX䈬}̫0Q2W#t\k=<6CQ IÍdaq ; իW~-%9yew?٪p}rq#T+J/klm6->Kq2|`w{v\tfEz NцEhe0Q%N!L{p?j0VV`5x #x@ m۶m+1ՒB|i]?>} \/_ _:| pۗ1&:y|9J~O K|-8f90 -GWHN/_qrHÑ_ Yϓ^60gXPؚ&}WEڬiQE|N78_RW_Iؤ 2g!}x/9!7Le\ RwY|)ډL4(7 ]}"V fNh V320LfXOu:&>ҫj ϡ_r%?8ŋ pa}_Ծo!DG|:Fe+ H(xA ϋGHEGz^,YG7nV\3!RT _D;Pa 椬֬^ U_/EU!N /별Հᗝ~"|7uۦ{R rq#jzn]hD:6 f @Ӯ7VD+qED[^9w#f;F9}Usjt7pVD/bմ鹚f(j!: }kC [p&'WSly`Da /}5H$  Kؙ~GgOC_~G\Z%cyÔc ("z%t1 5(J%6P0ʫ_{Ʋ>'Z~XBn{@\\v s÷ɓ\3EqBWcBk&0anNx8cl2$i_o92OEin0VC et>iQ 5<ӓj@`<կ~UM?yͻ_bj;_?V+I 2'a?z϶g[ gv2OܟC.nUk/\v-ı&,Vs $GB疱Q=u.h0[jZ`0< o ǖ˪Z^1Ș4+\r,|ܑH,N&r`o`z֔ |ߌ}KJs|F$SH_~ / >6pU~iۮm7햫O{mt/|3p%rq#T%Xr{6xtW KRc(WuouOT!Mټ{5P\P!QJmH61_Zz@f4@ĝ]'0j|5@sk]X Wf *+:䂼L 0̓z;oxmw߀w^ p÷A.aZմ&5Ӯfζ\i~jf&۳C{TvX ej(qqjWe dj*K"óyj S,NBK9uʈO 0ёL_N4>a e~iW=)h̦&hF7mہ3 Iݘm;n*ljޛ u1\mZ3^39&nW.#K:e`:jsĽHA4=)K2=xfϺۆʔieQ&֒+1֐!>R[fsKd5qZQ9o\Q({*J~|tVb@cj16zr.6Ԛv]ZssвU\-X땈WAmM6.W %sۯPDjkI@h)(5P3VQ\MUdĞj?8!>In_,n OhrC`N ;)&H*"]h`!ßW_*m0`E\.*x":?Z}_A-5Qꯈ\\!4_YF$%babYQB7^wt~NbQdVr5-$ӮXFδ2 i!Lʠd4s]Yf`5~]K^7,լ"eڨ~݈oNԡ_mY|r톒j6P5QX5]rVAqMlbYִ֦[ b5J}6qK%gYVˡ(~s̳1ҺrUd5M3V΁!tU_цXl_l V3ʣwV W7;c]+=g ٤&ִb?Z6KO puFt.Ƞդ)Idv$tJJy>$!aef΅'YZStd5a/TfX5Y 3#0bjҖͤy.7kIVK'S%VI`yђՠFI ⤑]kVKlء;]. @69pi\"fϪMjҍpQY=P#k]Mwҋqk+ʹi& e3v9?T-'܎$OZpX Lc5nЀXyb:4SEf5Dh%5߶#jeDjZmnjZ&v6L!<)ʜ]"MEfSCb53\xb#TD4FM'|IÙ!Hȋ'c IjPN\"!;n4SjrVӹj5iҽQ b5<PJ*zk ) oLPM)X&VMR^Y5PDCZΰ҈g:^Y(H:@+xÁ[V_1h:#fŲ)VKSW$ʩ Zb_\q/\>|^ۺ'.لe\z3;CX1uuV$b;\)~bl9g8M4A W%\{ at4a,iX-mGupWK)Wyo|T3`)jd:&,yi>Zve'+1ZhfPJW5NW3\ˍƴ_#Uک Ux~2a!L?$/XӟGG(}ES>zK\2u ]tTR%/k fj6zRR72d5rtNVM ZF6,mmb]笖MEڬh~@~XivB ʮJ|׿sd }T,fH\EٚՀnzuuJBR@aM 3i tU $5}V5K羥BL/$i1V+}/ĤPOLG4 FQ8&Uaӛ &숿SWﮆPbT卛Xz݅w P- ^L5 &K-B5~a}sYM ,hgGG/| sxp*~=y#8ow"0."B"I橔$?Ig3mh“f83.YS 1ڸIquJӱ4#PcD Ɉ ;7(>4(-`5h< &Rx%*-ĨRe#fs]2&.SkRNّJ+,j$Z,b5P\h|^6,ߵmb.#qV}jʅEXMi6dT*ҰĆEb5t? ⇕ǴiMnqՒ$ɒY$Zcf]'f;jk=WѬg6!3`ft} 5Wl"z ʟ>K<UTx-Y6p)".'u,Y#YUocidPQ:HZDR7q5YW))4gM@;)kb5UM v*N~9Fڂ!lO/a:0͊̊cLjfL \:a/!j@jXLxMU'q55 S|2d˴]a4 wXG·QCKu5fhoH*CA^hy^ XaQUȸ41L%)+Q9ަRҰWp6AkX=N+ո(H-@XU@y}pqѩTb5Eѵu@5X-Fs3z,{D(G3h*8icRTEIjhR[w E־KFL4a5%꙱Ҭ"A֔Na9f\^,8=k]3d7HSLRV4.*W3h՚e!Vwf5MO!2,R(+U52z˺Y bY-NմojV NZfSvOpb57X^ݬ5P줐&V%Me5dfNH k5PEt-jJZܬM"҆tFELj&m1ʖ=U|cW韴G5 W_鳘*N *K+*XMjr;XiWQD؍Ĥ,6]Ufѝ"Vja./ =9&4a}'҈_Y鲲¢j;w];t۰h+YEHWpiS+[DƲ(Y}]%fNdXuЙbJi\+XM ^՛Fs u =}.Քb5WBm7`=; &n)ƛbJIմeN}:MT]G2 pXMI4XML@L \^ꖘv󣌬 !8xX @,B`N0N&bAJgXa(C0$Rᢎj6HJf57n'O Z1RˬܜBEIKyiWEjҲL@vfcZ:1H4FE[9;x*Rן^\ :MWÜ\' 3hW ` onrUG,V÷u?WjmnέWNOa3$95yI?ЕW UV'N;Wi06/PzPĪ4;)PQ\)CߊHlj!V+~7 *tGpm5q.?Xb5gmK/W.]܉D̪n۾4+V-y=YUb5Um!&^wDR5hM=\DĂ .9"g58lY{ -VÛͫH?PjDjfML' TN'*yf4Ѩ }y۠Z xۙ-*UnenO`Vk֢ ;*ntn =mjXv#RG j;].o!Q~8_@Ft89UNPVdG?VEY^ek:RN|g59O-g55P@y`5`1hzDb<ƿRKW^MWO_$T4鹊V6oB枴JaƅdZ )X$ryd64|8}:N^Wp~Y} fUIڴpXt@XV3@v4kjjWZKb]9pJ%WVP `M8sjNZ[},Fw4 &ؗvO sϰ#5CJFcc=ܔf ƚXe̮0J5b]-nډ]QcxtM3p&ʖʵtPNdya>}->/s^e5Pܸ^QIfӉ^C i3I!q[F`5j V⚊ [.[97b5>"˝тԄ!Q6 &όт\Į9fj\<OM>ĽmzѴ#}/vb Ɨ>$Xc}0g=*+>yKX}ef&&<폦 0EV ʕ3o0[bbiuU3g50!8߉57lmlUz@5;uXzrV+5$OqXfvlg'gLUafՙ 4Wb5x;O7:;{WCɢrX^#J X;%ED'@$ 6j\B"ggYĂFF'H&_=Duq6<-I3n"D5q(h3KH_ڻZn2Zn]K9_rd<)f5C-|Z ˆuϖ۟ͻBwbݍk"#6.NbFpxy5c&Y-$ѯƩь2天,]?ZX"X ߳C)1{һdEvCL*ɉ1`v2[RÓOver%-k[*jz68Oo2/޺/g "V5P9omk'iմu1ʅȅFj8oX͝f5 :rz9x'<|'n2GStIcS&:3w&OT$?_<]o[B%{Ӿkɪj7YP*5o޼ǜ9s M?m I`9i63T,KV3#DBq5|p1ݑRgdrdX;4`鬢{BL4#~[]s1b՘A2H\OV3[Q:T>K +=cbzJ#ŰZ 2Q)̆U%X-k05P ϪmXo SUN:CN,}:Fib5um_֖)$dfMV3bX =2<-6yyZ#JxvjFNuИ4lXOjh=[DJHVnVc8 Z_l&Zp1˅F7 :: b57 l0wLOм˛0)j6΢)f>Yo+ݯG~y܆꜔Bj :b v @665Y kV9@T\0+6k((jfa&SCyf0rW歑 i6qWjA|  j&ӣ+tզS *d)bKpU;a20\Ym^-չFH:1bC%3Vۉ8jM l7ј 03EdujHOF ((HyufzUM3O50T|(JI78#N ̬j=:;y,08p"=mLKpXVni™13Tn9*WLg>Å6̅Me9Zeil+^u&ZG¹j8vҗf"Ô^b Yz\lf$J,t~Lv/BY4Yƒ&:5] >d~ (*kɌEkG扎ԙD*CRr6>'  uMY\%c9<8Ӓo/\}%T1(2q، g5l AY,~ TU{8# ZEv񴯲 fW$C7򍪇AB|*]E'1-_5rOTh@b g+fx]K!E_CBt&2.XMmb\F.ՀB0blXe_ՠDd̬՚,{r,u;7Xq Nuf5Y CR E;W&Se53ì-nt\-k9-R~؁$KrYԅ!tVR$U7 T&{J7QZqb--%}^-Fx 䗠rVB[VGYcI.FFZ8y.& rCA HXmppDc7je.&3ǎK7W ZylUsәYw;*J`5-kj9LJ/iI&+I($ƩXM@w x/(?`kxάfXRWMsUrjjrb337p[o  Lֽ$ +eYQv>JԮԮ*k+Kʲ#:w&"=b@xWs T|=T抧-|g@ňYl%47G̈́0[i6fk̾0+# LX8WgV`2-^k0e5s|T^q5lg@?6e>\ayDъ{5Cy=9ܺEmWK&{3--Wm UH/iXm6+Z#T-c\*Mb}Sxa6UP"\ qCUb4%nh~u7f_+aPdh j-SZr!dCsav/(8d)BFiob5k~Q;xq~ݰ0\ņ>ֳgw>;XàQuY͠,iW5Ѩw+[5oh;E2ǘLYNXUb2rMYJ _UTVF@+e2[Հ 訚Jj VSB Tr&Rp찵9┬jYV$Wzl=Jr (ǼJ ~ײe5%kjdJPMZՐ5 >t/gTMcWC,mYMI'hVsXY21Z6V;$Iޜ!z蹚_𭴱,=s-,jrΩk Ub+߬v~ 5Pk"ċ3H&aNAZXBkZNcZV\.avIņ4L]h>fҹ~Y H-O!+| ZM\o.|9Ld\AcY&}j-hpƮ FZC dLBfI*9M|(8dZf=52͉D}߇6JZMf]E cXҞVC AĈX=Q}U T=b*bY5MW䬁"r^2@O(DJ| D*P?TBl2 ƲQE7V\լ&+>&iMqŧRd\ |^p l ՙ7R,ejMP6^e薳l~1:.ޔȏ%Zb[>!qmCby􊦲qR&Vd.E&3o-NK}Ad5k.>*\ D1+՟K,]EX)FFj0Q(sS]"=gZ=;FX5P27SEͩMu(B`57/f2$E)jYj4[eE'm_UJ>ZJdD6"{rU4?.U39X /5,F-9/դ.j'*մ]#BzY R_ӌT#3F%T8!jt|V[RV0M.U0}Kz(|?|%4X%*\cE1u-Խ1XYǴ剫YTˮJEfX vvZKL!L9<{ۀ2tKGda7%P-j[ƿ[`WCjZd*囟XMo?fda";*,+Yi*YY)U Q՚?ö q+U8!`Oii!?(g5 O\dYe1x ]i$i/,JIjiJUZELº}5ߤWq*H˭e5OZZ#J(gX,-.XM/gj"I=Y-G3.ej[˛Vs*WAc5u U/ye3SA*\F.[VKJf5)Z\jwV+Ni%9Z @0TRG5XjV^Y,f\mx&d͘l G\-xk $[`Ct3֓ՐK>o'6+yմUk۠nPU9WnLyGKA@04\ef3cb\M:ğ*lP[Oڳ'SH;)SdMx^i{c5sCI&*#t%+g*ȇOK(ڔěj Pq쭥 ' @57^\@]1qUh]EX3s?X&VÜ'e-YG\݉MZMby*՜Ą{ amrkׇM0Kk>.ZhbfnՔ[ie%KGo`r9N#\@UΈ;+ލXHLp A-AG^4W Y` KU^UԨk`[%m\,f=\Z QeD滈D硸om\5kT8'6ӗ7'fUвy¢(#6WOij6`V_ͩ~rʬX5P1^l}˵{xgSzRU׬ZՀ 訚@*={<>uuu e6 ~c''sSuBq?8U9#UHuƩv877T8k*e]xe5nIb5W#ׯ*Lv׶b5q5=vW3Cs)*"Yχ >l.Bq5O$Af}+znkN7V06+j 5P0<*0it1M1kNܮ`5Wf+a|T/G"{2ԎX7cTюLvCHVVӋTluմ]űYU'WEjj{TaQAB!f&;b5m!8#ZU4DR+:j z&]EWwhSv fEXM{aP᫠ڮX X@k՗ٴ>lB)Rؓ5~77H@Xx/Ĕda5u,N=c 8Yeֹue0iw$g^"n0ѸjU۫a (iBfn"PNJ,D6 2m? eP*nݑ\{S+$WT7irO l@=Y-w2XphSW3\WC^X\u *07jf\KB՗no@ 4ź}'3Cn{S;K=Y-VmmEsVs}YJ ժi\n酵HE&Fy0DNv^VE{%VZm (?[zaKVjI]˂jYkM#f sa5E5P_/vW̘CU6e\\1պѯ[9:΍'e hEfiMMSUoA@Kimأ9Wn*5SneoժV:[V26+kD3Į^VMYi/ʆ7j1HJܗrK/x(F(EY ȋ1AOo1g"kjUOVxViwPg?UPmWi 1 "g( ʼB>o8oWLZjB,;uMq5^!%*-L$U߷+>69djyq,1k*Z +zAq syS);iV+RJZ1n-؟X-10šɅ&I~&-/^d Ŝ!V3Ac5p=ݷ]`k/'VlBqZ]M}FҡbY6fuYm}>kVh T|&'aX 5roJoF<-f2M'^\ 훏_ddŗhꩳ|nѪ(P[k`Z-̛o'j:V o-'m.BYU납EG|i 'd,Tb5=k`x*8 ә_S LtOi@[=8bobvhҽ@\J_ [EAh>)a5))h-h THkJ~ T+fX5i-*&jCU6mBCWC|6fXMO_,8eZ,$逘r*L j9Λ\帚jj_|ҋ,˭ǯimDfY(_@q!dY X @6)j҉|_ۖ`,ehXye=Zc+> Q Ğj?x>_6_1s՝~ƾWe q[Xt?Ռ»f5 ]1>DY_wa%ȅ^u6sy$XMZeסgb5V=ZkvrQE߇J@V_m||}}ǖP>ື_/5ТrM)՚ ͗}Ѳ55b,OT[XUHZ-bZv9b554tTPemϞ=2 gGbۘ-= Rj % ͇M(-Ui_{\,Wy4(u`\?g5JB\AgV̇"GJyu j]' f,>lq-sqRd[lWL=u\ތ+[AV3&\|iҘ0~JnF.3ca]闝׋[i BA(`ЪO\ @*(Zktf}Z= i3ᡲ3: %5VUZur$#@Z-5fɜ#> UWKZމ+OfV,hUa˷\.|P\ʷjX$LP:RBuJ傜jEN1jIW{|zO axG,eI]YIJW㫁K;|/\i\MyjldPnزZ`|7̆+ VuҬ&ft5a\1Ė* Up r>lcNnj@5L'j+u5匿p_/-WwiPJ1;|kd*V}LϫZmj"XmbWBDIb0Cz Z%b'&VkG^Tn"Vs 3c5fI7f5`VPșn3ܙ-eH: j@^і}dO9Y$VC:ZH"'YG&#BbNHƎa5 *I0^dbb e'J'cGHrYWkIJ9 pXMk/\ Q U؞W^jvXϏr <.`S\dM6CLv3W1hgȂGX-jd ggb5k1VoG{yCHX*'TR1;IJ(3탻*ar8+̊L.&5bʴoGjj45wb5,YZr~TK6{:)ľ'V+V*Ē,R8_[h ОRՐxǹd>-a(Zoy𗈫aX5ʮoS=k0pU9 :|˥*մ*LQ"#ٸjjgkE[7 2NՐ.LVOVQҚ=Im|ySհ3%N,\M3$1k׫Q ]o_^ ژMgAsV[mVƻxj:$~6t/:&:Y׊*Ix&V7s\FtK1$jx4޽Jj7E}&p+دjiSއM(+Ǭie~jeXS.P&G԰G5PdPrjZfKlyUR"J@=YC WC[M;;XgcEa5dYL,jt^'VCq]˦&@oFZaߍ]~O  O3^2rR ד6 V#Qj6d^ aҸ|@M@3Śʕzmi,*M=oӬLrpkUS@> 13)'<|'#661Ʊmjnl:rƁvțjxID k7@뱚wJ6J|TPZΛ5ФA\\G_찲5.CU6Rnˌ}(æmXbb5OBfj}vaCIՌߌeߜ.w`Tc5uIT.]U2_ Q:TVXM{XV9C.ljl1X~jBʂ2/]; I| o=Vsxg̪ι8aꯁ욫~>ր<}X\>Ta弱tYM[uP jRh=Vӝ<=:^(?jҕjYK_±E|ajk;Qa=_oZ:oR!b5jl V9p5d+WU0s#LWV;$'X4t9$Z-jU۫a (aB&gbqxSgTqC,:gtO\kմ:?WyXa}D͇>lXe3@"d5Ls`k(M ԓՊTe<wYߜWo[5h\ :j%bJ7O#V|`:~BŽ/mj E=F Eb5&V32d*/$]cyqUs TcS0PGp棱*> `5o 41}(#ZQʴa=u+oL=jjq,(܉E{O*E"ȒD-Y_ͫgeɖ *jӂ<5{P b5]jn'V+Rz)@ ej9@&vE/tMȝskjR]=МcaŇ(+U[_LD˴]űƪ(^Y͇>l>+Ve5 /hK> 35>%,[*ܽjSݮj9T낝ZjVNբŦ085WpHz WkIJ9DbMI5a5˞q?Y>>wUWC`Ƙ"MdX+DwVpmbΎ„%r86B:U)V%d`M<>cI:Eoc&G286AaևͶZFh Gafs j5WFrkWO) K`,toVQҖ@@UOŹ\ėEkvX*0S@՚oUh ԬKQWgt\͑8dƿjxJc)J*purXY-Z-r |@x&A Wd`505t ]j R`J[l,m8V|,¢U}ҹ(zrՇY6-xq4f}*ڃ#F(fɮ! aZ=jA )PKX% n{`XK)@ W@ՄZᤶ~=ZmXr)@ ~b5}O )@ Nb P TϸZ)@ )Pj-Ft㮌C>l{>I>a*j@kUS@ z9x'a*C6-j Zn*FbH=߇M9%>a:C6ۧP(@F(@3|X|ؤPAU0Ail VQ*4r.?X5Lf+@׊Rj+@mJ@-U&Rc3Ouv EţNMSK9ӯ1j,['V׌r)@R.*ZrZDuUwbUA0]XMY%J@ )@ @kZ7ms T)@ @*@eY}b68ڤ)@ )@f +mXJ)@ jm['VkӉM )P5d] ]-9 ѯ;;YW^؈ml9=گ4: (r3֒tP^AH-;5zP Mjjz`ָä-8OnqjSd̝4iY%PlRDKZOQ@Ml׊".XM(dc2.-lS#KxQ%j\%VPDc(i:;;HE۵$*X\-hZc  5dC8]2űCH)W h@rX?̌AƖB$j|O%J+yˣhhZF[6Cht%ihNm{Pj8=V4vE3=3,=?i$EOqD#VCcj(e5[_[oٴZvQzEJ)Q ՜ K15>݂B$†w a|zDKӻ PNd`Ċդkjqb×B>5aqkRh3"5ҺFȝ-р򭰩};Vc[Ph,]Z |)@ GXͣڌ\]b5Dϥ$)@ jU&Ff1(+)@ )PXc={5zڪU`^j*aGT#R@ZwwرcG5q{_7x]w)-PR( ^j˗/裏U//'ԫdV[n!I{ pdvCP۷ivM7AH)Pm[rUz8^gGy A p*wccy(x^Ѷ%ڲe̋W1 j*Ռ <#ӧO%3f̀3pL67n' ڄBV{7۷k׮wy>Bx̟?'W0Vۺ]ˇv}<7gGρEf β]juꫯ~fEw=yf\\S+P#Wf0 T8 {ҦNZ#xcÀGg*(@bD"@Y`Myf59Rǎa@Ѡ[gyYk"JUXa@&>d !`?mNǏ/ICÀj+(fiyÆ c]m/B5)Db5'2R0V<;_d X9F8#g 04dR4꒓3 Y# *҅SLP#Wq5adҤI@c{SW5j }@^a@jYSuѣ_wS`Y_S*qzbv0Yfs5)6M:yK.pŋcGq(8q p53@ä`IB3ATPL>'2|>v@^峚À'N!%lsy>0 @Àr@mϞ=Vs4`rt[kJ)A *al>9<*6<^1&N'w/[~: Dyf@fqJ@)G2$\]j*,dFq5im޼yl/>Iz#gY-@`5>%ijkV/{Q#VQ@jRݳ]6E>H#3v>c(n'c50"9uS0V{{۟q{}gGFgݖfqܱqŋCDf%wf~Aʏf{ !(x> oܾm՚I ${$P0 p5("(VKFy&yN3VHE!58Ʒ Mggjfϳݳx+$zXKeSNMҋKvLZ"ӃcH^!D>-Fˡ<EЖEׂ2ސr0&QFy c@x9_#y<*i9-~ӗBYm…1.V]GX>#)VD+,FA^峚ÀPء( ˗7nٳŌ||Ⴡ#x0l< x@Àa DP Ղ+~k<Ø,Y3*(GOi,HwF-WGח&JVkY '|NK3j6M;yF=(޼[Jћw(`mԫޯ@^-j̙3il޼v#G}=OH&g*"j>kjViQ 4I Cf4jkylvڜ9s6nX*@^峚o6!f#}x 55j&Lh>~/G/nsA ޓ0a5 c g)~*MWҸVcN4&7Wg5ER)d9L*qNUIMRk|wqO4j/>z)ԫ|V3~pŊOn1c'>|@2`$OxdP@Àa|5)jV I(ژRdRf-6b8{v댠Ɍ5PW.~.ZDЋ1L%[+̛4B,צ~:PUWg5"%:5z0=S/2ԍ7;ytMjj읖ཌྷؿw}7_иa5meZZ Na-߬o$V-fbػ\by4A¥06#{d^%FmF[Uժ2nʘ팸Z+ I/6*7b^h6HjώN8ፁ=ޙxخ٧}r:A^P;n)i 3^Up?гgO^u>P0GV2Pō^ziS>>dxp Lm߾ âkFmU&359)ZheĤg< L櫨@1q:kb5V)uT%)@ ڥ˫'ZySɤ)@ g5@)I{Ҟ?P HR P q5J)CXj'<~s߾}Yv {^tE/u@;<Q% HR  P1Ç뭷ެ5zAj?V>쓩c޼yC i&rEfIY ~}˖-|u@^P;bv;ZwwرcG5q{_7?^3T)@ +tA\p+:HQǬvqmܸ_u@^P;b5 2j)553 Z߾}O;nI%&H V#W=r!nt?Gn=K8f̘g6mc=6n8eP#ZY] oߵk;x!<ϟu׵&TeR V'֮]ke5 |5uWFPV;wDC>Z)SsՈpjVϏ{>P% lX>Iams@^q@nÆ o Om۶ VNw 8| uUX-Kj7I,g˗G{ZϤI ; ΉX A__Elt jYgϞrX_*)X͏d(Zb5"-{ܳڲeˀz H{رcĉ@c l0j`q,1FI[8Vjg523x jVskaL{M At v;'؍eT{X8tm{^}moY?֘oS/B&ƍgˤc|bSYpl2`1Ŧ&> 4TRDai %PB3sLXܲyڵF}?!(RrVcNf{#QcYM8%ΰ)!iJ')qV$H:+$zekYh~Y%>T}O h AĴ]pqgTKFu?'A@~t&]$yme==3KtK-\ ~JtĈ`g?Gx| pڄ _|/KϰL:1E+?1ax&X->'&,б4h%PZ B-Y4"1|i 9j"lb)'(MiKb*Ouj/jYXi֭]7fG@ik%J83i{v;;Vְ)2=L15zG ϨũY-;d{V 0Nf eZq5)(,5K YW.rdj8IW6OKWKkWjARLh< s gw6<}ɀX O?//IxÍF@iG&>( h-<; 97IC؆,٢mbG_95ODS^eу@V\?[=喈y*}0bEpJ\;Z!V+JV ^Pl>^OOfXZIloX3 0Ty{VuLxKv:^z L!C/۷Xtѣ,;I 5zA WxL#WXMn=gPPh8,aXY msmLr7vi'tx@ҶHHR )@ @ Vk+TYb qr HR V/meXŧr HR Ty,Z8F ) y—2KO )Pa }tuu~mE!TYzHiHR HR@TXzm HR t >/)@ cj[6$Vs<)@ ) >/)@ cj[6$Vs<)@ ) >/)@ cj[6c[uLvxa K Kpqmb1Agt? ~b3W^K6l+5͆QXZ#FZUadZ~ #j6@^k Dȟڍlkj˗/裏>tq{?{}}O]45z&C 3wҕ.[Wk_[{K@S0+c_GǾ+c}ɎEÔ3?3hg͐k{!V+Z|a?3ezvt셜 I~P#Wl"V|۶̟3gޓ_~G=rIGNw\ԟ_ Y6q8Z *ij!avt,BL#™/8}GL̖?rmBժ K%Xmے+vf532sO4_C~10nPmK.Ϯ&NGjXOZM} b;6t㹁=;z|.2;hYv2wC.0^}UxnĬ429`cjjBޞў6(S&;ܺ'w?:ktݱw~wֆOykY=N歛# ZyF57pU=61d}(% h6J0(,a&3@~,xbFW 2Ka&撞 wXX-6M:yK׉7>RvոoxdByY$Go€2 tjMLL #icq?}{9ӌ^5oՈJ`F7yKӘ(0zIҵAIO: L:8q/^ ?)>|Ecp{/7uW/<= ` 5#F͓(:Y+O8l0aw=λgLz{Fyg/0;9l4Hbeg>M%BTU٩,x$?*W$^[}{Gσ5ΊZg}^RP=Wp,v쑼SBƗ+Gᓐ+zGdI=sXX-{WOX)e1D5+o] gCkEa9a!U"w)LY5ڀT)ՠ|w}{}qʀ}g 59~HJ>gCL^\{ohCM{tڒ? S-:ljKn@He56ZC|\14A2V8e~+1w^HU_-Ho$n!<~<<| #xӃ=Mύg4QQv&V#Vg@bl&=􈎎W-P|VUxk޸^=a8"جGOc 2VY<Ah }&f<҃OWo{|w׌:L&*kAWhfW?΁W+𱣄791 -DYTRlfb5b|V{n]xK5zZww;SnAjRTЄl!|m?zcD<쳿C?u1vЩ.5jg^sϽVU!e&žEg%V#VgC<Ԛ湿];;6gΜ7֬P#Z(S"LXrP=Xq@O8qȐ!^z_~IpiW\qe]?%4mڴE=|+[ej#9U V#Vg5㞪ױiq=0f͚ԫOA^j*hjm8V{'M7n̘1cǎ}z)S@'x^Gc\i) (Zjj^9oFP/ t$|+A*NVPsPx6)ln̟€2DN4 :kb5VqXߑSqb5(S{Sڬ֞OJf uj74&I߿?vIDATx^{eGq&xbb6fARF!#^dQ%YBSjzh20n2+a6k1i`Œ3!ςG,BB yn[9u2T{NsG.kΝZA@X馛CbV 'g=+% @… RN O|_ @7M% @… R0$b ނr  @vTV.1&kA@D K̐a7y"MdXA@A@x-$bHǐ 7 A@*A֋_~s9:Q _pE=2/tJ̰}~_]-DMA@ABys. ;< A!_A_y׼凿{?&| m%^W1Mb~\ @=o|%\e~ށ R k^/W󝯹7|W{Sh-=Қ(}mץ^Ϸr7/c޽{MA@A 7fRJǛn۫mow\t;_󵽯;xo _x )QD鳕_}e/G>o|{wsw~n;9tT"^  S#v*1+%9rˏ\#W_~땯:8 o|o|o5çfKkq%fu]!7۟7 nB<dA@ADR|2)D?{k'߹77Ku7=r%fk[$ی G~;@ܟ'ƵW^  ǘ Ux'~mwǞszC{5Ql! Yv@e}???a  . %=L.Aq;͏O̪fqѷZNuugl꿴Iʰ7Hf./}n=!ĬG <^ZVbWz뭷^p}/} 1\}?:Lp<Uѣ_9g>]xǞ9zx/ef? ꂖN:'ZIS󈉇)GպS <7olEG_OO:?F-FJ2s΁`szA/ Hf~rWzw\ti =Қ(}f\_=?׾v;o_뇞{/{z>fߗ|Goz={'wWvt;Tۧ]SnKV-%>l`UC YP:] _ 50'Rxk^VÏTY-།BK Zx-c;5>zo/|i+z譿cw􇦱g =[#@| ?ysw]?m׽]otfZfq y/$m.m~¿齿|mb?֥3}ѣ|*|e ?pzsV4\u 5 Es X4u!B4BaX)/\5cwڭ?:iy-!@21@7__9病L-g7͖$ d5l[fzh.O~aw  UzB w9g)?{Sӹy^ZKb~q3f6pA&?dž߫:̾Oِ"u1v n~3+ tr>q'x+!+9AG.1?y>Zs-J.­"f6TRÔћEt{*D:_ ,dmW,wGozY7fj7͉`e)G>rq`Nyu>ӷ`ʻ P''tRtbj=!Ao2?}OgexS<`6K Ql%o3!/`n0=sAlοе/߼2tYOο[Ëm~^ؽ{5S-]]M}- Ԉ]"\uWu|K9cv=wLxG5Prf0N7kK-vT5blՔC?ʝf[cܚ~ғw=y 8ڟvdes)7{ m]]˧ve;Q:xO|'#z u h 1o-ݎ1/_bUr&^. Oku0ܶF=+l qɏckClX  d*6[=?q } T4x>eM֓\ b^^4>]?x>]C/g+1Cu_v)kX痩]QUܨ |A0?xxYj6TB__\r_ⳏy^7J υ^ZVb;GwNVFX %!pqٳzA/諦B%w}zս|E流];w^@Kh&J 'A@jAR|NA]rAV^WMJȟ??/.ݿ] x>eziM>[n% Tx C/sTBk_c؟<|^7uhJ'A@Z4>v(\ 7U$@p FVb%  L$IA@mVyǎ >r  $@"t C/tb% \,9;2  0$fq A@A $1d QEA@,>  $悌! A@\1DA@A@  P 2" HbA@ B|P.A@A =-$17aj @@V.*1߽s!o`kVQ__RDi92A8XLbRC,L&ea,Pk]VLc|h\t<}@A@A E$N HΒ|QO_\EH:FY87%Q& 0-butmPr cKew=rBcӓ,< LR”K3Adv N|LOPQ['cFI2!Y9ȼp&(! [1ML!!6BTkLK"!Ua,Rم;ʥW|M옽A.07Ohz%WIiq 7 W kIW~Ǧ"PcoE9Lȹ`q2L1ZN>qdreUcpCfuTvQX*Vc[ƭ1ڬ‘:H8l E vm;7'Vc@2 %N7EBb(ۄ,(T097+<L&&j+Sd`C&Td)&0e5-"+TMCcCar'PB AP=@.:F;fB+(<H Dj\zl* Wg~gN> .`;sߘ1A18iĜ¹9 !YfCxIZ/G<~8!-`.&sC&m4=1FBe"&鈦+qM& 9{M;6w̑n xZU>Zd(-QR]ֻG\aẁhVhvWgآs <hnA[7)|йӧ)4t I{M%r,{颲bV΍B0L&[*J@#S) ͩbĆFeRٴэs 2ESo.iA 23֦"=ev&BcpU\JW%8Fk;fIٖk- t-'L+åfZ uA=9vjluGkcdC*̎Q y `b .HXp0iƞxX2c@/3Nj{,Zlut9l^l_8%C𖓡4b= »c. g¥Z>d>[#̙soDЭ.A&JPpl'L̉2HG9d21ZY0ih`+6cqdr"/xA^,c9dFes @"s̗^z)7.e TYGmR 9́q69Qdw/Ŋ#rOuNXcl2QvӢY݂SXYn }D!zVF1n9޹|كC&iRل$ JVT_cqdr/A2DXr,$2 T6$gAeO[ b3$TџAsXpYtMmW#+ZnxKF9Pq@i^T6dErm1SWlm[9zC $bi6ITY7k'.oQ/J <0x @y)QUcp9%["XǬ]-r_襥qmRUKe-:/='4}2{^*$8d¸P{l92% 1XPBLx/G +uՖ1")1;}i0ctn cȉQjOXuUU;wcǎ]v۷^, ۓ{͜P{o5pe)lUV[*16H}aKs,rS97{֚9DS. quSq X٪ymw1c)jzKe[N͊rBVlbsgZP`P{|Oft5ceGyQ٫]DNwǦ+) #t E_/; R* Kc#b IkX8pތ9񧄐Ϊ2 p̾jruV(wHJaY1YFQ1"@v!]pUcr ú1Aˉ6s傴 LC,ȤZf3r|=flh`B*A8TuP)MUDeD1UR!1AWf:z3FfDem01jyHP ]5o cCLU;ؠ)XَNb{̺2(#2G?bG4`]wuvq* h}?3;)!娕&c36 ? #u1! HTVkc=L]Yb6u|] »/ Zq4}+TG{GEb|}S(ucqdr7tjvYy1V=9P4 Ce{Í@vY9UPpD0nuTv~ *mZtugBОԎjOTQʓ\H\VIr3bCN߬OAOHSco(pom;I!&>H ĉ9ߴ9Xݔt␩e6X^ۛmӏ"L[Ĕ|aZ Oxݻ"(F:)e-3=7#gEes$h$jdyfBSyli8%+'fNq\mRc'E9poo92\A=LRczrʱ)LiYSѼ͊,U_w 0%ʎ;ȁ*I숽f+ȍX3* .+LU{k@ :e6 oޮOW9ΑʎEs _];<ڊm`N(es L'2sr"ϣ$GF;fE f۽y%IRjtKR:Fa4Y52`\C(eƁMq9^*{x7CLqC&Lǩka2ܣۓcXQ`/'a,cāPU[SyCo;;*[)%pl!|Y9ZnJ 71~(1W|51:ڃVI*FTHcpHb^Gf:K_iTWRzEE1,L̚+Ƽ3x9L\, kᘛqTvb Q尔:UTv(/e:-fA)Lj{f7p!& r`d'iV>b0Zn#~j7go7 ge1kDVbs}#fwn|Lj !"{[6er"1R*|٤ ˜ &08dr06_xqT"6qLjX29`M ¬7u 8!*{5فjcb D0S*^f Z$\c^+͛1br#%Fmfզ:lR٤C3J -vű١iزS EhzF Q"vqrp'̎fbʦb"! :+JU\;E#PrC&Xшm7strl 8dBe#jܨF)Lp TbRe-ak/|Ap8JGXhJSC~*=Pwhkۑ&y ˲Qރ3:86 [6c0Z1TK5[0Ky6dl|CC;fH eT lNV1jgBO~]\v)t #bӜh$Lr&3(شp县8!ԺrnAk,r ` `UMOZ>AFw/cP'E=)c*۬#61hn}0_FoCsV8Fh3 D8"1gm{Tv] H5 ̪ecL6;hR27~jq!M;rKcfm&19^ix)lFHsbC-;㎿0VJU+_\=w.CKTl9 U$RYNe{+#Be2w,S/~^|V-&\#%41Ul.OGUyWo۱cǮ]/?x@s[Q%pSٌs <7]ΩTlЮ1ʬؼٳ,LrsÇ҃HcM9HP VȦj9~Ayr8(Kx{*ã9ADvQвc+1 ."|?//Dl%r^Fosl9`t e>9#iN+91$1Ok5;K3bL܌ttL=*O= LV,ʎ87onu ZT8grP,E3 1^UEk3e*B61Z y#1ϔ?x][vY ˬFF7AhŖRcJ ڬ'1plm{;JEqenbMH^QW*c"dv [fbrnAoǜ/81LPl2 rnU2i@9p|>bmúZF r#LqB*{5ohCZa=f9rϗn}CYoG292jɎ'́ZmwDd^a ȩכ W%C{v^m ?* 41kK0X&ۻsTl)E^>: ǖo}|ol]̖-1}bNyc=#! %pmlӌ<צ-a,?.>"9+6I:òj ^{ eeRͼk*;>rccKϡ G(GnQu0]QJ[[ -{s ZRcu/bzqfm %f0e΢(@s.fׅ Ջe(eL̥B'.#b(obSZ=]; -Lݢd0X tr lxEDBT52i@z*]@)ӽ7C UF^lj7b$s 2$68ս\^96bhbBAa{#dx'ږ?1J;Vq{1 E.H̑tY]Rkc׷sP̍R@uZs̖LyangSa]bKb`nϗ;F<% 6Rý7`;!Bd,ɹY{Xka,oZ n݋ Ms-HULRmr.+LoceZ즨aMQ#2l>+ʼjh@ce,o9/ɸB3bЪRH[ŎylӌtySaCD6Ĝn~͇%1{iyW_+jӒc8͛L{;ڡqtzd8 LB&SjkW\̜[Jb0LB0=Ge~Wā@L_SEiP5VNT{YJM,z7G6JgƋ[]!`v$7|b&-N`J7bsM37MUU%l9ZZoexk*#S)Y^jLRʧ{/;يyYQ7J\z֥RMel3SٽM3&Ɩ UX2Plˁ@I*8U4R*y?C@PJV Gnʻz GIs1"@uqaY>b 1Tn/džʙ{RٽQO"ĻqcP6[!lv{17F3W~̓VBzb2{S_TϹE׿ssފJ:<+>` Ӈq/+MeVlT.-Tb@QRbBXo)S4덿v69|.fn%sW7J6JI;$f ׂ$foj8^bN|\ 9=B9DU7M]saB'RyTER١;feP<w*%Xee M29TH=[-~c67/pͧ;RUls 9d؂r4flc%ޯ$ʟ{/r?g™r =M i81K fmfb֜m%G321z!C[61` !cS-pЧ + yҖ0_e\ b1=kwf8b}WѤbzVXʣ1y`Z~ĬQoiWce,9:KB\[u~+es&xo98F\m&f ,0=!!w&<3 ݻc$T6&`#T?eY9N pc!ӽc~A TYGxl&fL̵qտ~qȦWlWq&!;PtBGn;>mM IbW5ܱJYKy|oڦh8Y±Z*Ubm&9@%=!wE9738d8ʦ1s .4JUͿKy8dj*61ϗeR82̨3^%TEne1ci\ZE'\ Ҍ'bcZ@8OcHb2ICw l312Id·ǝX2IAeۿ1c@ ]PCp}$Wq߁61 A-l6r?';f7FQ׺D4 s Tc>ڼ./T )q,i"fз9z Dofn @-I(J;u`ZcqUWl-r 8SW%fS]FT~ᐙ.?>Č%᎙X2Kql8 9t 9=F8zq 10|ɬl0fM<9 l* fCv KUi1dx+.oOt'ӝ}c6Fc17$PM1'nj :Klu9;ƪTu I̖qKeG8d&ccGT-l8Q$#TieŠK̴꼙sYŅS*2v}w6jwpyiKx_X˜뮻Nͷ[,ԋ]θ5t Xjlm7FeY>6sN|҆h^/{UCq:îwz K%1U:4L[Yh&QFtP*1;&!eאpvĽ^'cW~;凿wm湝ֿV/s#ړT!TD 7(!*6=1 q*&m9gVʛfeGv̛=wΔ6qG.C7jG/11W=}&hs쵴$1$1[}QM]*V:|3Ȇ-8B^~<)3?%Bfbqe=!3*ۑe9Tα 18sUeXc|ݰ5CI֬8X o"9+UUxc`Mo9iY+%W _ nآrז۠MCZz7xWY JWb+UW(%g4,+򁡪:6w^Ks_6yaZfŚJS4犍Ij31{iApȴR.츏ȤXHfѪsXjyV6 s{i;fT9dQߘPUl&T1d d*{ʾ=;HKl|Ԯrc7Fs:l1yp%ɞnTJ;fQ%b,cc8)o*fbq78BeGNb*6T9d&TU3Spꝸṉrew2[ =obb-Z%_@um1-يLO.规8~j$t+ `q#AG܆8>LyUUG?Me~&U1 ]):Yر)Ne'sY BV_c=XS==DIdAIʵTrɎUKpX:PɶR>.1s !AeIBelGvbmXWy3938.#KtPq (j)THGVz|./z|7Mdw5_lo w ,Wԏ=y6=g·s{R;_Rl~۽$ݠMLWxEllMtUg0116ESZw%fS]*;hzн1bR5熬{<:6mM zk]l?˳Р"˸}*>"U-xņ-9d[V[;fA<^XLZs(Beo- !e}WX)M]nGnxn$mpUK5zcKX:'frLLVU1c"y$fSrΘ?혷%yN8/&Rކb>Ezfb8#zCf4;.~T+t&:kpb_fHqx=R究斯KҰ_a.!SL%1s&q 8d,Tv6 1EY e6\AhE1f xdYuMMThb-_eI=/coTa/1q63HLQK̉b뼊}TE=`D}W*#q!SWlIUL D&l*IƁLG\MBe Y$,t>A TICIKB3%m1cƈ,3eVW↱1W auWrh31chIBe=11VhNTul%*ۊ2uB{0I<ˊb@CʎR!jo.9F1ܿ.e*gB CSטȎyw<D[l3:ZNy~]箟~\<['6c7}r:iuvy?Op,[n/ALq#2SlGBbR5 viT@ÿFuNUgeŽ焎.)~!S99LfXV$ G~Eh1"҅;2M3R c7F5}軪C(Av̫DN7ep2 .*I_ %1xEIČgG%fzCf4 ;#&U—&f;Za*UM8dj*bcR{YRJp*En/Xe ĸ;Fꡊ£ 7F 7iORڴ%7Vy ocZ?ni-%S88[wxo,%ann31iApȌ1IU2] +6l*7OԚ2qݗʦRT^Vt8dzj\АS?p5#\fڡ8Gñc^,<.*1A3>7A l)X./8$f-σ3$Q{izCrz#27Tc\d&fX{p/+|.@8dzc`\b*!qhz715Dm6̈́7"t'O̅+T q |;ץ]4>G2 zR)H#rh"8<#Wh\b ABUquבITB%VQ)l*[J[PYˊc@C79PBess}W_!87*,ab.pvq*%fX혁l6/KjfHQ݋e א[Cn a&(DE.b 3.tFVLz+#%fS]S'p#2pk9Ť*7W*|*ڄ&_qˊˊJ@C7Q)Be3?!3hot}0m7#W7ߟ_ӆPe>| 8o:F;XFxc hrKbK3VWr@&c1O j}Xqh2G8dz)1k8OV82֨n9!WP٣TvV"]4LM;좇WlCQ#Jc=D&.1[ns%E- rrnʙW&q|-D8wfb*;A AB%QuMP>^U!CCd&f&UYmb@Cʆ!T6V?F}ef4$f0.GU ݁1s#21y eTe62sj}D9N~;" 8.+́LL\p Tv{:,l3Կ88S}fřm1OVyKkE@CCshE7 L̡421s#21YK/,*U{?Zퟯ*{TvW|c|jqBl|j7vQs>L̘Xdجtdnj1or܀/еssVIvGhOeKbFe'(Yg0K*bTFeC26/!x;& T5VYp]o>1BT @zo3n𱱹O\ա@nT7&U#+ΝPNВJ *ڽ&%fS]sΝ 1%ůwK TTq hFE}2THblA?5^眘A==ޥWc/džT9D"8Or4yK`R5X&TT6w U5Iku 9mJu00RcˁiYE R+=cmf2/iٿ18׍CW` 1f"q6w^z $1o $k2 uK@C"IHJ o `x z5d .cϣgR5X UQX%TUl@TI/rb|׆iYqTl␉4VcrP4#Ji]Bsigo105È 0[mCm#LNfĸvY7f*1Y}o^ L4&1s#2RЇT0׿ URٴ?=K*AW:LƁ޲JLr,+&@C&29Xb*;ʦ\2?gExԘcm0Fcl__9mu I̘B1L4&1s#21K f&U#]QT#BUd@$bۭ 8Sb0LBClm o)Yr2+y.10(A9s:F;f$C6ۚK/@scȣ1 _ۼ6se9%"2g, !TCP1p-+IUe10i rH?=:ƢI?/TǾv«<Cv Gņy}|9hcw7((%0z5ߒbk318A:qCzPWfz3V:W5N+NQ M=[_qPw*kbm{m,'W0g*[shܐ,cgI9.3zC&z"q*ob ʚLAUIUBcy#4p U|b*Oe#ފ-T`1BryO6lEso DP]G9ڊ +񻪡W~9cˆLJJb^=7q'fzCrůAˌIhc9V +42x*L%BYYkKũ JR1Jh,oOBeM"[xY)YnފMsWlcYNeG87o9F ExlZlybl]̖-1}bqU4M37BTM4u!1]fIUظaz:3جé_Vlc9&#2vG݆3U'#.1WaID:F1ŸE)ъ|QL|&11E{lSq91 (ld{R aVe]&fTM4eR18 K2L:ZˁLx &UC5]Vw$ ccSٶ_9xY푳a9@͉ڎuL4 S4p 6aN!21 0WcQZ!JSV3.u)T3fM33e /t @Nr$;j; q5߫<ȭQH_yp\nf"܉9.2ʹa3 ҂>U@%_KdVl!o^ʟ9᫘m2*{MQ#ـ{93&̈́q슐S q>CsǬ 4gН1Mq f++z9)؆CxSaCD6(-1e,*k_L%R5L)&fvYs 77)V4!rQ+MM*Ӎ54"H*{c{ħ 7+c/&^<$f]3471G@CfzsAT41c!0|2T$f2[F12_&A8 VHֶRHǘŎ9݄H4K}t6%QUݻ+Re)#++}'`RkonMKe~V8hLHz2\-‘[eROeF çjhb:XCL**/|ZKRqwj|{&U96ncE 1XE 8!3Wݾ!Tvo,hR`ͩiTcw%QB+6ZGfzImILGsČ_f>;@[Bc,,7u+P).F,.G&f8ҹl)J\*6⒮kIU%bcR_)`&a)nU+6*&\ĘRCNe*P%N77̨19@*EUe$:mb:%1q8 r 5D;8zǺd:THczjAwR~7A 9FyͫWeIx5۠wPG7r_fwU򏎏Z>5ES&rUCh&ƔLj*K/U XػW;n "1VsQPAÒ/+B+;<U:*FOU;.+u&tccRՕc$j}sH]a21gGőyZIXFXcoO&S~t#6lwؔE6.ފmP٣Qcbvpzc49 91G lLTܽdSȯ9!׹ ̺Lr|?Xő+M9A.]cVRy+VM3-C"T!03F/L%fڇIsXވa]_EԀX210SA{;yHKǺ%a0ͯu11-q<~U>9:1/ u6wTPn*pMsqk F uPf>*1B ؙX9nwdTl)Hfb&VJ \ظ.*}IIUMeG u $zf37Le/KEӃn|X1f2&0Fs:pCf:*6)s$y8>O9Fz+6Ǎ plA8Vlm--FgeBy6*ۓӘc`N~gDQ8@[sdAf<TvbūeʤWXCLdSݵJ3U`jRAFOr/C&Ʀp ~i?,qWX{H}@q *KW9|b( "Њ3Ɍ<7קwW$t8 w M1zxgX:F)1(C*0[Z8^~=~!)PJJe'_ˉXLbCKౝʆsc R+|T = `=]ˠ>4  =|woC|=8dc*;B={ JOoՎz"%fi|S&"0sy Qa`mP<1S?. 2#\Bˉ.tÝ1w7t&݃1"oIiLj lLTP)fbzCWϼ~ ^%.1Ćk֩yUbm@e,S8=*;ր=Uؔ]Qha,HUCsb"fc+bc␉t1UlBec\zMb>K_fqYy8ϔ0jwKa$,!lKu ,qCn~9E'&11ӢM-"f9! "sO$!A)[z ٌ@IG 97sߐ_咲]Rˌ"4^Llm*fe$AYR`2AC&RЊi'o $u)8d"`Q֚PAK{ոw941G)Yy8Ϡmcz2AU<^[юA]V[9[1 Ǩ^l_JKH/ܷc6l#lGxL>0v~xSrJ9FUQTu5pts6&p*vXcVӁ71K+b3QUG 887cGWzInů,1B6Yrn԰h -ӷC*;ebh[6N|csHXvᰔ R~81.o87p_HbPE8d&jfb}ʭD-͘Y/!W"- H#A51zwˑƒrl#@jh5?Ap^t"IM+n K`,oÝ%Z9I֙۸7Sw%%~l6m1mB46ss40zv7 r*+I0CRIU|17Vw#rXXGzؠ-O{Vx^w=1"4 Q Cfm31ۘңXw6zQ?`87x&[El=알͖.j%6$f?n:\ij]Q)W-9R!31SQAُbE[/mz6sscqy㲲frf&vXjL(yCU{uXa"/Ѝ b*6LMb1-X$<fbr oc<k"4$QHqٞ113m,o0!C&s>է ]eDŚ^c? ;OޥGXʓڀ@cHbF_jTڹ!R+' QDR36u( m&h1*62C"aҩl$̈́*v!79,dIP &2M˽+UdV,Y՞c=Oife$Zfgl_+1@VH>J 671[;miCXV3P|UըsdG*K$R\^1Q$yBPC{!:wEY2sQBeRUsn8@`Rժu+1sonU9Oj!u3qV|3ML.|mU%fS]fb&h0eA ㊼4֜W5 ^%hdv IXc, XK׮.f:O.(*BFh31ǝHt;S9wzvbRuLlJ YUphR&M:FyǤj*Xjn31p-}cDe(_|1·k>?TlD=+^ǐ^4d7K[~<G`tmuuݑfDfbq0on#8傹نIUc1"3j_ajPej,c0!C&zK63wCa|7T&S{IĊc4`D)T 15D)o-zg:q^Yr*ZIPi Y1`G7:mCiiٔDg8(|ijϒğ$ w]b{ Dͤ'o_я!\h3!WU 0nq{lƩg:lby&U;b9d2P٘Eoc,of\*C]co#cf5Uˬjkx&\Eg>bq 1d-v:[.^MrۥXm&f<dMz3-BZU|c1BeiΖGU=U| ?b{Ai:HU82Cw̛m'g,bjw%lg0;FkDF4[Vc^l_JKH^e?]94葖 A@A jMSvѿgmo!F!STT9)*r 'S&!N2%p_T9YJbļBy_p,*RGe%Y$fF %̚_VE$!t6RcYJs-U8u5-zbZg)I̵طV=֬X"뉱j1V$1bZZg[b'ƪXq21bSA@E@s(b^A@`D@3#"ZA@E@s(b^A@`D@3#"ZA@Eļ=VܿNu63m,ip#Le4U~n&.9uHA@Xuy/m]jR0 q0韴u`^c̺D ; r'f`}aVA/0#$Ե!A@png˝o&l$I *@**1?k3yÇnk?$1 /$ g~pu`^}?qYǷ?o`F0/I̓,(TTTbKg/_g ? /ݝկB~ꢚOf0#$Ե!A@ܥ|ߧەo+/xW1߇K݉z衸;u?}uU/OK$ JA  x,Ro<4֏912[k9e+$Y^(w6}6]L (SWA`BTb?=KWx_ڒ-O\?׸w_=a0G\5[wIzvK!f-LAKv.+ZxTb/_.;˾%Cg/8ΆlJ98Ȃԝ/{1[fn}fuپ' Ks LcbvL]J:C1Iׇ71g)XbaIZP[',NS+8k ]9߹q/cF_uu6Sfxg=M[:X?o1Kv̓/.Q@Tb>gW—_ɯ?^3gw):V#b[a^֜b9n>3iNV6uL).Q`^cփA`rTb~Ͽ+m]0o߹Co5`^'_\ 1|뻟~g^ Gy[+n}܉ӟ4SK`^cփA`rTbSk[ם8Ou'O~`_aF0/I̓/.Q@Tb>;?pc ft'[5f #E/zMWG^^o `F0/q8$o3m]0#{Pرc׮] 5EA@׾W_}5^׍%f5nrL\viIDATx^ TyNgikm3ҙtF:nҢbQOZ[])^DuAE^d YE˾*"{OI$O|||?y$眜I~Y P*`` B<<6T ,$8G)E2^^EПݜǦT P*`,uS/Kcz&nzO 2o*@櫀E/ry_m{E&,o*ћFGU`v{G3a"`'={ {?r^o \v R{e{}2(gǏ2jK^+-s%@6L>w|}?GJiJ}*}x%?;LT/=itEOq1w^w; ^F{<_˾S'< Mo=tv]5\4ïϙlo5ގY [#~zr-%B.nzgH)>gf"^ ")CT`n 7-y{=|dmx/? KߎL}K_/O|O4vŶ]7{ {?fQ`,1VaiAD 7YիF#SnG?_JIY;s*Uvs灩T ;;pWJx{KsdA|qe]d<eC'-mfAs}edJȫMQQlr2fF{ BE/[lӬEbgo}k^)%e!Df%z-Ax%ϧ T P)ЗXffm>ht<أ#}qЗ<~mϜC'&+x芕-._˗A+I y%Q-<miƦe*02/-oyLI/N3wF)`;c*;Oo1*n<0T PFY̴]˗/?>l-r-ʒGxF=9-']+7̕ʠD9c=WPV:!yDo-XLS3eF*0&/z誩Dx%ϧ T P)ϜW|+2N_ P9* [oLM/5kdRJʢ妒N:)lZgTEП͝T P*߸lܗgP~YFT` _x1k6r%E *+JPAO*@sSlgvlChB#!t.RJʢTsT P*@QL.T L@U|EJIY(J%ϧ T P) ǍT N0",J%?;LT/B4]TT"T P*07`; Sn<0T P0񈭢Pϧ T P)Zkug}.T PV<0T PQ@A_7qT |P*@P*P?;;MT})@# P*@E#aT` S*@ /8T#|P*@(RW ~ʋT Pf }*Бk^7 ˖-Ⱦ\T P wD9 ,7h#)*@T{YgO:R i<T P*)@rX-Xp,-_L \T P /8T#"Ї_ P*@*P o]+^tX[Vlp_1;,VK@emw6 P*@ LX7R*~VR _vKs7`QQ<r1\r%UW]5~.f P*@H))νZrʧ5S|WE_Ws^Z9{PW_L",kdM/qr\{\s\mo?"HT7`H))νAqvgxtIw8ϸqV;12(Xd7} 9!뮻Ċ//ʏk;1qգ:-.fˋ_]wno=nnMG?z+_iJq P*@@? e/h+ir~ru6s~^O{֮rySo<8/s6zWW-'t,h\VۿDQK@_Fuwq\Xn [O;kܿ袋^WsCQT KIE#;~Go=rgA/}JIJZ}0? A_wYŖEVG~dܰg,S*@ASRR-4қJ%iZy@}Csn뵏iSu?~ӛչ1>vl>ʁʪmw riì$E4NP_׊}EJIYc*)E4=VA%G-K*iu}o{jzm57ݥֵ8u׸@gseϬIvIe$eoVF-9Dl9{"Sm]wkUA7 o., ;^nZ[g} e]vua,7}+p/=7X_|e/seje z[%v{~HfHVz5X?w#y./ 2V_lP_w}X?SU@]"F",d1[P jP7K%-o~FO}ctֳx3C}ցOn8o, eNtC3A? b?PR /d<Ÿ ȉWw-?lP+E~Kʠq AsЏG"~v饗^q}y}w~-{ժ6w{d(ʎbIzkr[7rx{:ao[&J/kAke%G8~/>~5מC%i *e4{pnhhTUrT6TAf *@"s6/]7[P`kJZӇ7{W<~휇^诓/~nZ$)zu?}v7 >nVE\jїR~ѯtP/ozS!wnx#M]su=NOmѽw!ȋ1%/ ۗ?~m֭/_(p~Y?wP atoԮO} hV_OHPs;~:=9,ݵ3SrԦaU482T ) ["/DмނJ5(gV+sG|{g{_b8ozetkt>XFwEL1N:xܭ;ޮ g J* -ވ=q|o+^G/o㡇d$ҥ|q/|;10cl /|o|c-(e, fݨ;Uzw|a Z%[A;sGFqȪȴݗO(yNz|+޿XѬ(-^%_++!VfUAߞ8(rdGMc/;ٜx9OToNJg*]Jt3SD ,\%?9UT * 7)%eQDނJcO,K<|=~W?y|g}_r[j~䷣ߗ@;d" V7+g:gu;w y+ҾϹZ@)YzeSl Q'~YQw*~؎x/hbA19IW;pWֽw%9!]vEf2ɍ2Ѹ$3&>C'-e2[j~~-ڒY` WESuS?~՗t(\V6g f )shXlOB|&3nE&gy2?TS@}ٲe_!{ *A O[nrk+z 7.= w_cKs~BoVq;<_>?x~IWUm'x$ҥ컅[{OvXg~[~&}G'% AEGS]ע_޻~ .y}~V!:.rv276lsGˤ[cӾ$,??_twBng'&絯]υۢ99X3QVŷg5:qPLo Z;V՛+ #JSUt,tЊV4'$yjtg̹ κ P*Ta-2O Kf!lGt%Exc3-i=_ng_zˣ}Iͷ<u^(7T 'icOt` OXE̓3A?3jdѯg?yK*(0Aߣ7#.:fWd'p27W-d2ni GI>f>-I,o̡˗Na>[~MJb˧Q]>G;3^]7*^p{t-j'* V;EN4/͊Z5(9k:  ۜAwݞ=O{⢚Ӈ78F*@@3ѷjL׽RJJ2`BWƘJZgO:<̯<̕OO|%w>ǝ\uD ٷUO{b_ u'ǸXsbtWVwݩ Ŋg~E?0{d5Px_}D6}0?E`OfGA`+_ʯ{챇L]cO(^qwިhDҖYv&vlѢk|X`ѷzkϊ%uoPJ%񚵞J,*E2-eo@t}󼧜yʳO;继|=y72獗*ٸy WXUjkTT`F[oO|r~>繿/:Yu\9t,6X;5X0u^Z}]h弫?nu t]FoAsЯ@U1T PFb",7Jf}K[.T P*@Ƣ0|]|.R m[Ɍ?W{AYMo?Hy B(c *@sS@LH))vϽA - #AsЗqsT P*0"u)|+!>EA}"GaST TR?G?gBHD'Wc2T P)@П#苛>*0:nҁA,&.T P*@@o <.2,9s@J@T A6Sy)@ozT tA^R1*@P*@hKamRֽP*@\ǥcTMT P*Ж Of*A{/T P*й $9*Ч+A2@T-]P}`;T P*@Jh= p pCaaF~MT E?ęN;1O!vP*@(U`A} X .7UfT P*0q_B\s+Q*@hYc=6o`1L "#A勒 RAP lT P1(0:Яd&K٨}{'[vuSN9e wl P*@@ {[&JV7HBW_ݢJzI֯`V*@~->|f>u7[$.V5Xb}.o]&SjM{mXχk<T @o$贈~@`=]oK4%YM٨%N?K^]J6%ՎP@_v:ü虼{>ܼTq~}N뮻I7fǀ?QAKNtC3A?h`B=T-Aϋ虼{>\±j*@@~9=n~?f^~oYm+8SO=U"J<;]AIfGa)*@Ƣ@_G?횏-e2|@?坟 UWf~7|Ke,%oǹVջO}zޅdσly˟Sj߯\׾N\r%/BYN[>AIfGa)*@Ƣ@_G߷l8RQwr|2nH$ؘWOC{׬y;߹O@G?lQX P(0)=<pSg~"Bƙ+YLq7 OK ]w} ɩ!nOԝ̷I9Sz o-b+0&?!wuY @_Bbѿ뮻x1G?-wW~ٕ7{/+o;DXk?[ىN+'ӗVufя/r>pG>'>M70|C;;cկ~?#7|E_,?g_}5ǝpʱ3/XKZy^9lw{?<ܫN?N8I2Hǒs&9|;jsgI={|V8 3ɳ^uO7_y]KKno{v/)җG;fkګnvT`, 2pH04Џid'@駟Ww{PE<пO:ēO>Y+/F_,%şg{W^yС+O;~p곯J:̫Vl?/d{-Gw N~mO\N3;O<裏$[Ӎ2V~q--ݶ\|uqo[2+~lxPT P uG,?ٿ灾8O_׿~'y7|ONrm|O;3+517"seޭ\)\Wi3T AA6U`|//wa;KX_|x @_LGqxI}x{̱p~iݿ}?;?8XVeHO}O9d_^7,;m[]_nS+?Y[~YѯyG?w sϽ^{u{{B裎>?<@77nnL~t_\y2.iu fT` 3A֫a~*0RFG_\wfݾ-SG_?[SǍ>g?}{.3t'{|)q߼݇]oz-o}ы =ܻ|ZJWeUWݹ.7_f+\<~հkiT` [RC-П%s?,Kx^ /\[>(_fvm_|v[q (`eb^yҗO|Bp@+{{ua?<+O:H~uΞ>~GKV]!+^~Q骍?p5NHbKA߽ͩf}`֗ ?ȁG}C=e9%M7D7x׼zͫ_Wb×߯u97t;X?.cxk_IvW|3nţ& Җh{~G<2eܟ"5\ww~z?`-gY@|#>WՒAm5W]uwu7~s"V.+v֭Mxc˯|\ULh'+B?x'Gb=wsF}ay]pw~O?|n餄*_ Xu{][9FwX??'}WlѵUg+[7]}W/߷n\vn\%Λ:Ҍ~%Ov;l'g޸~^]ŜoԶK|}s#~1osyw[뢒o`]W߳FbSq=qb˗dmfҖh{QP=(~.2 םի׾>7}Eqmnb/}#Ge.}H(|l1 ;p{绷|B¤qܵEs7Ś3^yw/r?97V ?ɌJ3NnSvv8_|_o׾3oN_Wv?`uS#E|(:f#8A?\g}mW^'oe&Ea  v Ȣ靾w~S˿p]wKvqUV{o2Q\p9#M+ZdSe/?atA_|ŧz귿/| r=ow_x!uYa5w oO=tSy }_qķ_|^;7wzWm O4#y_8Ҍ?w;_9c_;joݏaö~q>#8*t/|r5)gcAoᕫVz?xÿNi*28ff (/a2@Nm|MsX,A٪Tf? z+Ock՛)5wpe虼{>\% P*Ё~ _L6S hZD̊g/| w5&35jLpTgNUO6j^)RC9:K} }{챇|ߪe]w `Y%T Py*'Y6w{M-;䩧Yo 'V}:˾e/3b"OzKXT*(L|[P|E?,!\vHՓ1!Z#cp+Oˏe*ʞII̓;A˖q֬S>ʌh]Wcvx?[&MT`< mVI_95$}j X2PzxtmY/XfP<bu'=6N?xU~C/Z:~zG!C__lmI"c2hC`h/*:z3:3GusUNwHm4!S;rBT R oTZk---m/#y !QM!g뇱IZ*fMaj^t- >YfN-&Ǝ|X}}=W [չ%"xyN`FY~fU&`2EA- K,79[HDSmK3P*@hTg85Z?dh6%Ż:7ȓ2ЏGLSO?]բ`56 ]W)2>UF>G_:8KJ~D'^RYt٩2 EЯx_e6*@P]O8؀8(I\#c1([Ţ8$] -/?%@HVẍ́w<߳hYtT<' aCb 2& 3x/>A;JAP+5+g8#$.AE]T P*PQvA?sI}L3śkh\G}5^36) Q6Ζy6~4CV*Xyx-Hڴ$o,례Z7y8ŕuX|PU%>9uy_$QC A}٨T BvA?QҎ3Z_Lts뫝 P +W P*@  WDfT?6AT} W2T PA(@Я8FAwm6 P*@@E[\b(P,*@X$\׭HFЯrҹPi+ c~M{n+T`~_y}ɕA?Ήnd0Q*@Ȼ{ OtT> &fcT_Bvny<[l㘄 P*@D[ի?Fle*@/}A|y mlm4s#hOn+ P ȭ[nน]]&OЯkvZwݝ֤m,3K$A.22 藃<̅ P*@Fq3:X/a7 Y gaA RΗfܡKKV}C:|}g/>d*@ޞ ŮxFâ>;ף~fe;0ײпt<}|<Ʈ끾<C*@n@)Hb`~d_v/[XAm%5Hΐj ,4ȖY-~6/ GآON>*@0/i@ S 3X?X;n3'xPA˜e=qgrGAܻp >.^,lq T P)wK7qwshp݉SxЏ37 @?]>]wGa>cX3:L0 o$`w)H޸Mx+I夷Xn,Dx6ߠo_ $=0 &r2iw;@'_T PR8i@?hő7/>G#M`fx qL0/lɎ7Ƌ L#:A@x6$}Yz5ki]땯9>AOX JA7#{Szk_JL#WO_T`( O+q"3\Z - P*P ;NA$xLf ͯB~|*MXaxM2T`b S@&ą ,}O=ʕ+=[nt믿f---9g @ПأݡT nL Mp-d۰gi6֡VN;NZ,T`2 ZqDЯ(SXf" Tvz< T LJR?q $ASBD6zARɘ$ÎD@UJA)H!]a?CG_Y9T` yShaT`V-1KSN9p9餓cUVI悿 ZiѧE P*0)JA)HCA-jY}kRdY*@@ ŎSx7\mq|VYCP@ؽz}CʩsW/uDЯ=éն$qjŜT]rSH6>ARol@2?.*0DJAJ)HZ0==שE7F+B]@>Qu KXCa\TfVJA)H пxuf#JXNT˘ @/#d\NƝJ6jAJRпq RM_ismWl!C%>/:k<_سF I]z|i&jX")п¢}~tcEv/W*ЎEl[s~{-+!}mb95Ou k]Z `}Iz=cn*@Ĺ_ <5{ݱ4(cQ(;_O;7ԮEݘ9?t\y`^~=I]Sˌ@K]Q+\wV5ӢOX@ ᢬/eOЯt$OKN =$S8و~O :cm|tqvԮ{3=wJ#s>zC?Ae+c=~~p76wil=_v´oA  TR?:E_նk38]Џ@JK'w@䢬LЧEX9 )H@ŦT\|YZ}ye;A?m/dž [R;=3T  +ĵbxMZ +P˟VZmH\XzF>ɲ t7u7Y;ѫEqwr%e̸G6;'.&׭+_SaE>Skeu b*P OS~emעVsZIMX>/~ gWh>F)1wZ{@; NA"藂GדAγAD}0Ք&K\Ws@Ə3\r+O A tӵ t'JQ>T-vyƳ9S@П,x@jX#lUSդO!*.:ldN5k^BRqA >{3A|\rɅI'{LYd_, sx9qAvH W`}kCIX/~' nᎌq?_jm+P*3G,μ]l), ٛAЯ34ݫ7iRC8,=aC4"M]GRٷ# T 5T;n @9qAvH ȜQ/hKFзӢ\z0WZutq%Q堿'~W~N뮻]՞Qo9ҡaĪ-.9S@ A?A? K qI%P21>/DOU67tLyErqYٺE#_oiI: `gZ!| %/1̯[Og2u3&A@_Z?C~^~Nuo@K & /Z/[-¦`˒\ e퀐}uAf<цu'Nˊ>QB }7Xߕ}K;;3KlHٽj =*=y䑳 X?A[:1ަ`g06?GeCڢ/Y1d]w&V4|%@uԏѰqupq͂A;.E㐄ǑB4cCct 㓬uYGG#7C(ˆoYE=[#mF˃@4[rI~GL|zcҲxuw:26+Jmc̀~߸Tm O`OX{ `|cFGF=17mxOl&GEpIwv;s Ag}E?tA5 )5lo4ۓ yrzm_s9$mcҳ_=@^%(m3P ֎Y&]Ѻ{3#K; fK"tX^3G~MH!}SEl $ef"~]L~.+ ٕmvŬ TRi_G =G\ww''?r{~=:%3Au{s>xbR6sZ=S)p0rGy2I&L{nD ŜyuzJ x&:lς݉Y&m'Wz(V&> gZfxv(v4IЯ^3B;޸X_b-!{/ne0؟my{Ye>=8D >vpXQq F^UA ca@)'T%'4p8@"3 DxpZi'/wWOE, RѼm+t!l,Աf9BQtGUNz NOefj[YUru93rڙ#A[,&a~g˸ Us\:&O{ʔ{7?0 fo2;;/ؗq3~OЯP3= T!!P] yB{\ۙw MAZ\`ff A=S}]rT^O&r`KߢUu@~,=HOil1VQWУ&3`N3Kw%d͎_*.Züy5O e& SۅZk+WʓTAsv ~P/7kM2uNЧθ٥J_h|~K_T]MZ[vD^DZ4?ֿv}*,7VZ%O}~e#V%Ű7eӮ26p"i6y8~1{3h ?̹8!lT_*—u }f & xșk BPU /HE? 3+'FW1\,K<Ac& Y~֠T?( rfA_ˏچ,BŶG?7VB?{ly!_rCdfͻ-yPi ohSqQb$ l6%s" '7?+ͮ@3`mPjVAz+{~__f LҩB]g0e^s6 Vd%7Nq&Q?u$bǞBߘ76f(%/p~ú9Ň(v%ҽ(B n.z‰h.'6;;{5Wa[ʹӢ_KdoKT P;n~$7ZZMbej24 sdbl"5g]TLɕUc7L}GIX5!0xD^I&ʵgu4p~P 2%l1H̗ -UMVrqAvCx, jp !{S*N }'0=qW/C᙮ Ƅ_޴IdAdN'@TU Kt~ģt@9qA4EAmkPA^ %B~[ǚW=}~3>πmA@9'4T"ݧqoO"-q3ٕc뼉av<6vwcRY;ϼaG®e:(@aAɽBUfO7XmAK*qA&l`yeDP9Ӿ= I?OA #aPi;ny|q ~1/KqxnyJYo̦Mْ{Afjl_ύ)k&blob$۟;XR473FyMaNȘ3P^ BU0R>ݞмxCWzKQ  >KÃX; 9~߬saò:9ge_/Hsҫ\_Jg w7?-?eC;89x#yDP07{AR`]Ck + RX AAu|]J6ٔK@q1;fYyQ詣L/(Gy53UW=|L6CaA%-<9د$3kS^sVL(7?5:ۮ&ikq˺G1-wWE?]w1~ɩPv,vb~:CЯ >  _4)׮E?sQaz B A[Sﺓ]C[}omn'ɸMْz'vEwAm]gq(#7?G s~D9ȔE'8-)qIǢkz5DlJch'>?)JmԽڌ?\UOzk7aLwr =$ 0{IΣ}{$ka "4(g GT"D 3|lToQRɳ׍T}DʜUwD 7kA1; uyEd&C\ˤvo6ek(G&7qZC(qh!qWfq~0xvb/ZC֫9dM:VV̌tQw`_n7ƯvczB_RZX1OɆ7yc&VuɚUoԽ\W{P6gA'YPEP䩧Zr{-_6liiɩeN( ѯ`T#{OՇ fYi'~3f)*@ADQw&1zS'Yys:>9Ԩ1i,Wt]WFzzkiF3Vy7>$wYW_F#MozmoQ.̉LνW~l02g 'aMT~gfm ^;T J"iT bx6  ͦx$݋ǸhK $ >#Gd!9؛7ۓwldl_䥒vo \wZ]cS3(8n~"7 T`  pY6OЯGl(P;n~"V$*@)@П j@$GÃP0O&R82fIÃظ 4WGzDmXDcbc 6S 3:ۉy1y2eBZ9"+Crпq󓂾oХϠǪCnȓ~&Q*Ѓ}~s7H? >A\.9~{A2Ob*TqG?M39dM<bw=gmd`Gj#V5ss[ )>Vj]^ˢo@^#eVX0ɜ:񍶲s|dk{n|X[bM۳ITd+7?Qc,/&}>AO'/7?k3ǂl,  % c5LnZ 9֯*/ZqG4̇JҙjeǖCULU1k$fT%yMfc^E|98!;ʹZ-fպM-Su3N-1f 2c9_?dv6,ȲcQOor2c΀OWI4qC57L@z%{Ͳ5oB[KRPίUm-5HMz,:#"iy'n܁|t66^׏ 5x^lA!W:Su瀛3hCkgᏯl9i@Q.VQu 3l?@-5VkV+^-u/Х`ҡӥUONrʾANOmlyGc{%ЯAХ=ԗ[(@ם1|/n Bpu]ȳIKϴoDHί͜i ~04i{Vz= f2Zan75ffC׍>qrK%ECQZMxM</u-/%xMtmp.rJԋbW~3z 2JdҘݎ U3,X  D匏2ߡZwr_pjq}*s뎀RO -a=tEPy}'>MZN")HLUFWDn&:sq m?ABf$8dW]옽&[d\ 9|_͌:#\aoVT&̎e1o\`ڰ|cO_"ُ]JAp[ 87?.;AA[ƪ?bÌD ]~S~ ##>>@bxà }cOo,҅NA$藸\' w^5[S#d\|̢L x 2jhGlfR@uCZ]dW 3zc3/ml0et[؀y84)ToLΑ_mi*ltm5ݗē"O~>q 5hxMVGƄ Wl@蔉ox dPU!61;A)* ㄓȘo$kxշO1)P >$k7 Zkeʕ_33Lx$ `裁-~uG)?OA?[*UNƼ^&RH~) Y`Mkb+eEaԏn\gHȦU\p ewUͬ 6{U(f͜ǀ~s*>k0ᛥ/E󤳣:nvvGQ&`ѯ78ˁRп,HYpbZƙ+6)`,P-Ec$~(N :AíDJAn?I~cuA~"r O3͟\(Y!SuD[P2fbd'N~ pgUo{3MJ͌j ^=|V-㽉6{l:*K~IDhۢ [&ܧ:N ^DVb]$gb؏m5|5TM^@)VA$29sA >)@>WXhPxV$&1!;}Sy$ N1$jX|  U6?  $Eg W Gsnq )0NDGttc3;YM)>d^ AL{`ϿfQ+F{*F}ͼ놟jł#PowS& Y~F/CD}~,JF A$>A8jTRп}nA$CC; A >)ɸZfRi#} j5qQ6ks|+n9oڨ1EAЩ6{cf21tt[dP_/l{#I3-?`O7}o}4{ͷŐ7!jǪ ȧ6ʾycLѧsV.N_e>(?(Hzq@߈|FC>qr-X:J3XOR2=g-A?t'/HJA A1XP,{KEZeUE@_idЙ#ÑkasUr2.3yoMMn"NjI5#7juľU^˺9KXo6DGc{Ifoz07}?1hN!0y+X,ێ)Qҳm3ܩQnbMWnbS <V}ZԚpщi cOU%{*3Pʾ0ldV f;ۍ jV7hu{<ԽporPFD؃dj%0k;aW>Z%`7MN)gfpͲ'=Jv0W^3iOķ"&3C*HQc @c[Mт~dAEX*E>7SqUIW~:W Ϩ \hG9訳װ;VS^&?&fl$ -ahm5T.es-BaNœe߮]A%Fzv*P F*l go*khW~=οi<*>Azws $1*P k$~nmnvڨ@u/Z3'Q#YlKNdh)j^xؓ4*bm4V?^dFhP# 05n-۹y~5S`w11poV`J}諃C{74ԩD%^Da͆M_E|;\LE1ys5ЛX=&SX5Z4\in‚D'Q*0ͽ{q [ ss sYKA_^e Oq#oL +0Z5\u'Xzϴ‡CT|3Rɸ39ָz8fҭfgaVuw x#ZQ{p{p{`FIqC呥&T/m>}{I_&~~ I^5՛/´o}}z[ho̙&鎛͗q m/`Y55+F4JaL y AJ$}x7|/o;x@L Ǣkz9Ց>&PVk>%|~{j3av;I `qm|g :︒4>~q Vòc~ouɸbP*Q} 3g\wң{1ӟӲCZjLq*sܿ(Hyrϗ<衇2@fDJh_K{)0Z~ɜDL>Aߏp* (O @R?h|D.V?#V{ohw?|\,׆O_X9{Ӗ[RMoݙ*ThhsvaVBP 0&'zIíu_ U ![^cO°{c]11.6EGi?|we@ss-~kSx-5_@~٣w:y}M'KR[>~uzjY_8GkWnU_ mh(~0?AQ&xE^@ }~AZT|Ad ޾u8D9v,[1[\3 >/X~P>&Zxh4_b-]Xur4x{]7P+[2ŔP.1+@gײMDͧI m`U3fβMYXA*&:F~Z'2mj9\5G0S6 [ٷ\Xľ4l)q\$kR>Ǖ;#:]o憞0/ns`yxk~蠺ᵀʥ~GXT/ g%,afN1ӃAno.;{sJAIA?]rkfRz+Wʓuʭ(=\7, 8ʬcLPP? /ٷ {}k('};^aڅt!c$Dc(mW2x1@ϿZQ-Hs(/(IVbgjLxEyG!J`SeMɣb@~,hyfkFMgk [й F [A?P$ ,F NIg!FBun*خ܏-ΣG#N*UUt׶r^rdkd#{91a#(}1I~B;8cmӕ`ݫ ۂ+T}cpl ߘ]mUG-_(_0(o-dvA@At63[ sF' ?O ʂ4I/$|kJQK'|7m?5@?.U4& 8aAS] {g > 4/@ 4\c5Fz *,jc3sIhbf-J%[ֈkᓃ鳒`h? L棶a zH~Zw:="|m@2 N H%0ss􏙌gDA"=5x뢓q5?~ୋ li~ok/U|̖^Pu_]f~Л(u)ЮNNcL\H[Q1,IGtNp k|~Jt@\?I-}dl]AȠHcdoQĨ_M櫺ث~5NjWG)])*~ZGpe^ݎKomG?JA_fhgs/ݮN):~zc}3dX5W?_I''>5>Ap'3f4$=Gk}C! RM_zXخ ϬN;h"~?Ito:@]_l~ ,LE,j590fc]mpW{?kfOz#`Wu5ed1=Vz:#SuՃ_ 0c$W?5L0N}ÀI_+A̴`m@ lq!ثPCG]_-8 α+KÙք^6~&֝J裿XCR?ݢ .l3ByWz(#Jo`ͼJ5L$|6LOQ0iظQLUHv1RRO jԓ8d L6;4LMuoI},W1kR?ݲ 8;{1O٢L X*е}~ p-AY2(7/|q)x/WYj~Zf0k/KouwAqt _VrIv~* U1э5&7׼hY525ڦ5 XU_ :>!&u /PW'ȦX}kwɓl\}ݘ5^^-;I,سJFIpQ_dSg!m ՉL~|Ou ho2+|{cȗ-8 jW~܇G7?~YzZo\wr'gP. @)ݪ )yjYv0>1tky tz ך̼Ghۏ"i@AOЯ4D,(X[oUfESXa3*P:3W,ީC*R6VyYS=geK5si? , 諥?n7fc8S>V5#lkr>pIpُf´uľTzLU/|dV =>}%!VScDT}=""uJi_K ڦj{Q5Y}kU^S}|S5St6,f ;XXpk+W S@)}{AtU({2V71KNaE+,ۏh}e"Ҥ>X}>-͌{f#OPh֛J Z*L4S*5񀿍Ύ);pQ-~(x0d8 VGXU xKw?0($2:iYդ_l]u!9 1]쇁}>H:YeİJ?? #4哠 Kȸ7H*өm]덛T +m R-Џ̱֪, PYz޺3UW9-|I *AS>A1Y(=wz_15 =p^?DCGpu7x tz mFV|_6jU/|c/]y ;Z͗q1aTTຣwjt[ߒm]w40%˫ ^fૣ3baWۼal(]@8aW`=4B$aa׈x}UxHSyb}W1zM(}E߼tqhKwS^<+_MVwwSV^XG" +u/zT9V8^2vo#* +;v |uh-&p> Oи5M|r}7 pAY]丒ud:q\I~csأQB]w0Ж``'~_k|x@jI꺃3.=] #Mi'i}6sg3s^YKXj n{ Rd욯&Cl=t`wQ`Gz@x\'{|oSJp_b'S _q?P0f+y4LT&\1A&|ZBFݱaF{BM:6Ozũ|df*,8cx%7ocH9vùEb# uL4.xT̒!/+I#ฒ.=8iIbZ`aᜣʅ:ass-QK?ΑqZYV{?N5_5Iuc7WycYyq/JA Rk1~{Ƞ_ofMeX|bVul}A'K2t8񱷤~ u=~3DUjbOwj)9t/EI I}5d\ݏb7@Kb߸ -X`<CQ7w]d$U|L{E !un.VWT]ݎ+IKa{X*n*LKЙD?UܫPqw)z^ͧpG>TP6zĊ^2&~%%nIu9#甂.v5U~趿lR 2H`ޤ`6iXÎB{QwM oʪ}nR^ds]l'7$rQo 1^PTSNk]zBlW 8p\IL6@\}x꫃ \Ĩ|/~R tn9'S~ةC$0?ңd=usv\` mY:] O\R9GZ*GIځJAsIAKQ#6LЯFx;P3G kVtz~mx\G} A?_T qw(HY7=ӆ +Qf۠Ԍd {ϰS ~?z2|"׼G)]jLdPh,o~LU#P{^./6{Ɓ~|3KR,&b7f٪_ `]=v4⻹=]>+ e:UW%V#շ&1eO}$]te`~? udh۫1W!P,C;D)o~ G-0A!A5vy 4D鴃}Ps\wG5 ѻ~=k=AHRW R{?>~`ʩ*ЀTA~Wxe;CxX nln,v d[Q8uGR݄4Aخ$خ_x >|+j=UȠW`ګaYieaeWNE_m⸒W4>:^Ch$Z>E.IE|uT ڦͅ?#bQ]J=vt;~7Z=jKX޷o3?[|3b'5w8?x ,~˟=X5&*XC'|Tװk0-~ڤ=f$-S0 t@@KFƓ!m,,|E6w&ΒLQ> @mn<@t2.LoBa{6.:j5$@~8H]}፣~5%yToתEvw‰0K!t/&㚙JA?j 0d0ȦQ }ҠpQu&4,j _m؞}`2nhǻ 79ě[85_jz,4ZNAj êTEX9}  lbq)o~ g'a'O *0C̹y YvU::S: AxૣsLչf~{WVcf½G}r%vuC0 \?A1ª>^A_U8 Lٛ;?וK봓3حt(H3MPO'#{~3_{PAj3f~ 7֝ ?"mr% ChI# c5t1͗qWcquGCLwUtk|Wy; O {?O<:[L|}Z1C}x&|uOB0>LjWqjPN^)?|̾ W- g7[^HOheZ2 (C R7O'D~~~hxdϓ|2I 3??6(: 0. ~uQ_ p0;pQv 9`w%uMsO!͏֬>Epі-'z1u9{2*ʸK c*_'Kz4sYXϺ8uÃ<[I-*娠\\ VA?N+ՏXJkY @W5A$1F| }ÂWd[5KNIʫ`Q~.9vpt&w f ʳ8jjfQE+GY5֫ss1U.`%zTh~-jNȑFMN]n0VW*obcix?@=/ Á$t'|/& J4l*UoQ=lꔏz1Zxog{amk%>)xUfk:ʩ}b)ܣ Lե*菎N`*@ZQOЏY  `@Ab(<c $-+T`t ;V&n}'˴ڭ#O3Z-t?pQk,XՎ 3ƾTs f :H XղhخeP=R(}y^Ux=5{1Nxjѩs^*aNMFƬj7b|-}̴QR 'g´臿eu!@? 9yٽUU'߳E'hxٺ=9S'/kXDLIȦ`|UMd\d0pUP :G? jW|7/ tn.\hs/ {-k,j74p'qg?z4aW}SMjgt;*IpWAD| K_hMA]E6 cl|)";YziTzU UޡW@){VA"WgQހ(Ao| GlyRe5 Bd\P몉鎱DGcQr-WSۣ f:[n ײJ˫dD'bPQxLj@un.G 7u$:~S5Ub8z9iO!k·= M{e4:f 9իd9i_g34 er.=Uuq8E4& t43iy`M KO h}(C$SuqFҁtpd\=}u"fȋi9!Amo6sq*_ @z $AS@ձ9XCROdS|(wƳ"Ţ<_f+e_JYWu_1Q(~^8+O(o(كuubRxۣՓ?JEd|yᜣwu^23=ΈΚQc8A4g9ZrW*/~ܱy Z_^X]( Vl(4Ȋ=[&͒sv@'c&|?=ZX$3FJAUxhx^k6Ƭ\R*t#<~@b* kcKk6{b dkM$uDcW^uYM.|Nt/{gS&о .p Q8*I5lkY_Yg_RyIes&Csb m4٪i+&TiVĭ4|S'&WaTg rCŽ3A~U_$Ld4J'P޺X{= "$c^lW{XV&C? 5+fn߀͔\Ey}4|M\W>D~Axfá#dPL%'Fi֛43YϻA |g⑲K,~%?uPjxম.X5=A U`5Qw&qјD6+a1We07:4W Y%j51yjh4&|VDiF~DYc΋oj-\3x‡[͆ mfvDW ȯ@gaf}W`71Lͷ 'o?pO΢6olt5ȜE4\Qz'MF%fyL~Ɍh%x9e2r!dNK( ɿFZ1Aǝ4I&UT tA{OYU *B2 AYUQ<0Vu.~sUPD6s+cTEWY\ O-7Q,eNޠBjf8)0atSVNy vjfԝy4\WH#9:5kMkO9AƳȌ܁XMe Vrп)'?M{0v+tAϕ9أ ϋK/OЏm;2\׸N~$@!0ksD[wxU?|43bD4 '-]pqHr Ze߄zTS4&jm-mS]h&|5%,fUyZS ~d\נS-Z~}TZ#d\㺣/UL>ɵf H~DY_7̃ j0Dz+M0-00E[|IkfNMr G6o8~җ#PWN~"/,T`. t:H&Sn!uA'q ld.\'?:yN /^b^R/7 [⷇4Lj̴,eD̨>̺jNeZث2 aVv5 uXjob:Qz<c>v(Bɸ6VO2:QJ00tXMxPB9LZP58njP·ºq+azʵyfa&Ԫ|VKSOBɆZ N.utg\txL;Q\sثu∪5TP\;eoqc"GiÌ_ m`za-U2[3ZWvф0WܢsO ^pi譛b kNZ*@j)@'fb7;K"F 3H7S/fT` {֟yIZd ̱ @^I1W`]w ,jP9Ν y&pnBp*_c_Xc N8x~(#*&ݘMR]ȚYmJE} */ m_3Z)y m*ռ]8i Ư,I_%KWFBW_'wg>)VX dvM .~mm1j4 :?djaۨAgПV1`|uD BH2j+pP~(k`Ma`8!3^^ ~+y꣏RW:ux |K08꼤@_38嫗n7p Sf@FYm-՚MP|' SPUl楊}#qy2Xz%{J}&w#";A\ם<Wo^'>6L;g5DЯL SQwTL[Wf3v}3L ]K 蝠o,gN~"Z&ֶGZ&S]A8~#/@㺓~2h\ pբigp`2^&hz\A] ȦfZ44н |5ӚZ?pD}a^ifԍWʆgDDh)m*jGfs8doBxU!$Ȩg:D79Hخ &9^n^M32f~@OuyOߪҟ ȕ.xl|`ZXg'-N~"WgT`  }O'WOG?HXS\'?K?fmc)* G͜hgj7@ )܌^ t[ks3&حa0VK*o\Ո-[39YuؤmLf lҚL5V?hf/K D捇qaq,m j歚of3_-9xO1LבFf]^ܻ;^:)H^k/]5+ uphUIEA_)^6mTsdU𣩺/.o6<${9"NM]%ygwaovC+yPn?u$A Hbb֝~4NA:j4eM56ss  L%!G8R!A0Pu^%dbgZ1efxCDfČ4&*gFw1!q43~M^y[()sX7P5p" a= Wqa7ιa&E:OO$;?y`U!苮н͑00Q@ZLOqlVtf|,wn2I9yo;q& D@?#N[ЏD~&~OW=o{h^WM4EW#0A ?2?Ѯb+2A&0ˈbK ,O5 f~S=@ya4g51U&LfZ=|7=H0_EԋՄ7ƈȵ/J&x23Nq10fl7_Uȫo+cY3ʨFz0^7W&CG/WT}-EB塑V%Ǖ$xli'؎ aaG/7ڝ-_#BYm װ8z^rg"#=~{rd(x׆xtDo3X t:@"W跈u"T-O'XA0OfX)h6R֧yo=@\9˱,1eίM{_|36>i^ $>jG &a\0lӅ՞m,٨|&|HUj2^WĚve|8k̈́?j3~&6y-4u,LΑi>:2&F3b:vWǕ0m븒{JEE$}O("~zg`[ÄjǕdKd9fKhTPXNV6d8A?Z~uWG:?gɸgt>cA`O q^k6Ƭ\R=J=(C4V#6֡JA~[T:5[cOYڵdP?dw35j& !ӣ@L%dcYx݀wM  ֜u[uG ˋOo 8fhqнh=2kku'8R0nI@UuAqHWʸX '(<jvr\I꫃gGIUaq%.Lɑf?x0J>L'hfHhPKxIF '܏ 0|+@ONzOגthmB3w_ǒ}o?57ks7hѯB)oMW?֝~ԩh}~|$? ӳ$>Am}fsDo7J7Q#v*A|(ڙ3̬8}a6(fޟ /}XmuɜkSekM(z9c53,kj7S-%i!LQl.6XDW1L~E\ z]z# >8ɷ&Z\4IS&YygTKnv8A@?6G?l zzX=I0n- !NEd-R 28Ū f\No\+A{Ȧn6ʏ ŕԡ4ԽpW_й7j4 @VU=Aovq%-HZ"ǕA^긒q%Iq%0s ^Xi-?*I/_K'`! #p(tHB D:{>8SL$`p31Au 4rC0q0꫓9'svWs=d{iPN~$W?A19D?}s2.uGG!Ӿ:)O  } c& dT3d.t۩h~iXyL n{hX7_ƅQn خfl!5Z]X:$(n^Cg~|W=j45}*BV[Փ @EOOxSX {^S9A_ζۅL:T}~/*oN~"7~G.GNO;.)?G?{nrnj~ԝ6:p v577e?ǼԄk+u⥁9JG?x0fs:xdN l%xpL^V)j)3h1U΅őt+'`_85aq$&履9^!LgG2Kz9^AHճ=Z%)ݩ8$}a_-pWG&"$({;jǪb.i|ӄM9)~Q/SY=@C~{,N~$+JX_isѱA:S*nրySOG QX~-nO1P?>UQ (7uԮFkd> Cf.k43 OW~8hW."  nl^cd1TҖ~00kB{ g2!#X\:Aq$EG0]8N鎃-(+ #п3+0-/P0s7 R˒ |Ա4!+I5O^GCA|L ,q]8Ĺ_M4=LxM38*Dz9]'?;qU; N^KEkmA_${ }>A,ϰA & *_48cAp>A1W-Y6OvV|Ǟۛq\U1 fd?07*v& 1yC&nyoi22Lսڪ_l:n!!? RE^Sb(Mj9ӎl踒4 =|uBw;H7:^pQ;kSLiHR{G1aq2K:O?ю#IxH>Lxpmأyb!ܯ%0=W=yඤ>NԀ~IjXRL&%|i o>O߆\0ßz͙Y.=^3~-N~Rwb 6dYk6&\Ragĺ3ˬtz e)g'1 } 6A&i\x tJxzYQޱd2 (n3-o2n{s3U7̤U>2 ͧ7Lat[?pobFM͌^,NX?mM%&zEg?*1sv4V[5ᣔViro%FeLr\I9[u2.kpI1(9s^uN~q$Av%!ί^u1zI0q黎RdžǑt\`?;L9ÄQM[]pܗd=0AYǕ~ȫ~:I6G5^*.LM37s4W^bὗi'0jy}Uo宓SXLϣ4A>{ñ(PAD_ϧNret7|;!R``;&#nr3WqL]5D"2<NdW_Np::(JR`* Ⱦ8Lp*&*"Fp4H0-Gb:|q$};L9aK6L: <::*@H[Äld)(/$~LɳJ9͘)0ү̪/VŠ=OOӸDes9oN=uA:C0 AAݪ_x}~?iJo J _/u$A0NI@o LS7n ^:։YMUyU~ u^kscW{a<Ȭk>k\wBcd3Ɖ `kjR 4C* _e\5cmcX]失aGtHIoF-`zr-]+2lu~-|f0#L?}}Ado :iUt}F,4w}^X, tzUOÌ*v.a|~='xU؈Y#<3~%@y?D2 L~]=q$GV:$]AxpIzI@y݋C&8 $%y!~4Q_z!L {eUuq%%}t $^ ׻UzzĀ ΅#2FFyߨfhr',²T J-0`r!A/@O'KrD1T ̢AD_6_j"&UIrl`lCi"ۍ}p eͷof NmJtkB0C_)`فMv$;'r1eE}',j_r\I&سuG<[$<(* :Nƅ%aBz|q$&H:/Lp>zGM;oD:0r%C2ᛸx=" ~uv}I6I:?d\'Oh#q[A\N?'Qܢ~OYe}~ɸUl }>A;?OAa C, GMh\Y0 XUdG88HB08HV%Sŧ>Wi7IՇCqZq:g5l߼E}=at=ܢVO菗ir*@}(@Y߼0>Aӏ:OTT`2  f6lodt eO{&`fX6JD[X%)EX[Ie'NO(d\l^&+ehkj |i<6<+Css~έΖAv Pb5}xyqB4Iķķ(M޵Sc!c37taI~O47!Yyy87p #㞡8fSNMJz^G+eH1A r\I瑄`\I~Ea3IWC#|VOk$ H{t$56_W_gxIWOa°d0i/-/k|s~0| 'EOzUO__WW~ɵz]f l XW3o2X_P'>و P(@'8 FcOzo }_7j7wDП ґ{Yfi!R* 'ώzQl27sv;H#ҟ-zjfLmO86 D(n`>l =yfc [jŸ)CEUyƥ@/Ö2.Z@?tb bxP B8y!CaXޠ 0_죬3{aHK2[EH|?KO# qx|?JK~)>èG {4<[!( ?u:E98 @yʫ fŸG2+n?R5F.:*0\0(P0U[qt;*I<_ `=l@0z =$W5$F Dykͷp~ ˖ $Nx'qot!o?MC7Wp7o0\$9'ZF*l-ǭ/\܀&'X/O'wdR)tDПT  AK-M Z=> ٝ*pk>ԩ96H gnD̉_x@eCdNdG.7/"{N7Мl腝؄TS4p*juPp1BZvL 갠Gn?ثQ,5P= k|@W5?~hDQЉ0՛Ndenff-N)sF`1La jbؕpmrJ};o>k7r䧺Do4΋cx\*@  Hy=A}9A_1䧺'{ Ӌߏh}+M[NG!/&Wsi2g\w)(Rn^ d:{2J6ﲚT3E04XۀQalnҭcGS?{]^C=b~I 7dJ0!UL{}jބlϳW3mUܢBONS)ψSA o6@SIj&W| ʖ=0~xj`^KrsJIz&R :*Pа AU%f?sT5:ڠBƑ HB @|`8ZND Akff'({&g٠|1?*#UA?DB9AX >'~up~|Nk\_sCT,[ANE`;b~Nײ$hLs{fT%-8 {`e cY 2 >CJ2s0^Fq5c<&|A5UcU3uj{LxO~c~NuQK8ܬFV1C{;-ӫ?lǮ& *z$CzS:!=dx3ajDak92 N8lYhlm(%@aY@3UcroH 0M7֨"{GHaZ:Wr?~~7:s,U@K8(c@P0Rމ/0sFNKuN~"7 ~3X9-A? des= >1뷟;b7A?~3{s4Ix2n=tC4aȥTc#u!;45\ԂTYf%' >% YrHӲJ8 W_<2a&F!.yx*eu"|\Bm8C`1]qL%UH=<-pC7N4oe+${QX9?u򓂾[YpaVZy?e@'o-7~R~8!>E߹u$-DN]#߃bg3DПguVѯRޯC=0^m\8֡ny+ Yū*KPT4  ș+۷Z۵nCdy^D?S`M Q%:#'kγ+;{ 3[q4IoLTC+H1M@S@l-h9t>i%.=ž:ljd4;eUž@E4漗Pr{p6mÌ%j]fB3Df=5f5{j]wgjv9IdS$bT`. tI'@o,Z /B )+:vHO4A?zCПf쯵r4I_:+A19Do;}7z8Pggj۵`Y{UէIId>_iO}~m@j@żQ>ɵV ]w Y[~5d敜I+6 c}Rp9$U5'{lF|c7G4g$қa {1k)Bw5;fռ0U Lì2u^DUe^9gs<Ɨ[u$AX!:egL:?F +6t+6uj>ANfJo[+spOot`I~:$ =яutzт~d>Az択3U?nV^uSIw4ѶWԡEgQއƲ_5ǭ׺TsᇧG6@CIQ&&fZo}w4Vsx([E߆MI~$1Aޤ;sGN/~=οizfLA^ߑBRqʌ 4Ti/dhn]Ū+7ɪ$Le3"l83B˩·6](HE[7>I6:U.!YW\)OxSXacQ+C#{=;-ѯ$0q gn2o~[P~)S>u_Awy;ɸCzʶۀӶf3 Rw-tfMu^H24\rgQ"o؄_+A GNeh9suhAߋS5_ztݙ»V4Tv  ZlOEn0Hq$u[C$S5s{˯hQx͊?aX Lgn 6VЏEΞmh]va$يv,]W{fT6Hqr ذ syGƧJAXk{{*pF.F0MdsRl[FsnRI꣪ &~zH58K2(8}e>PU-l[ع bfԳVKk?>EuF搹?8?a}~)9],Z+| biV8i߃\E  FzcֆYt4I IMAAQp@UAF@?qrA1aT`!@?>>[gDžV7n sl6_=Y?)*v , ɾ~){8<9Nn"/&T` C> t8Nn"Ow)*  ՟LW׊9@M! KNm3>]wfp! \f8kl3X8*1 PEyC3K@ T'7[G VH }Λ;*@N &ǥTu=@`M K.3׵Zk---m/\R+T`  }Q/dQa*@zU8Q I@^Ӷ#wT A &~z`*@FAOЧT LJ qrAu#e  m=;T[T/+lVXj;T8O6M^FAz44c!ׁD\m] @I~@94a{Cpe@wM}0aC lU ,:,mUI}Bv P*01n{/!8&P-efx~0!XtGhͱȏ 7\=*@Ȼ^: :NnUۮFKc8k,]G bo}5DW@nrrO'7}|vUK6j!SoA_b\yT JW]'75b1GcQ-yoQjn}/jg={^d'R*@".~s~{'q'%  9PC#{/Oy]w~pCItǢT` uwrP~&gpN@j\T`L @ ;I{T ^~ɸcb ,}/<QwKT`8 Nn&gї^s€(;!Fyݩt\YE.#"*@Vn5)IYyoOz4d:b TExAS$WN;6tz,.`UT P*0 ZU6LП~u^Zyo9Jo=@i_v恩T ̠0A$(V[wxf L2 peQ*@+0LПӏh;J3j_RmnT P);~w-&EKχQ{Tׇf Яx^f#[aͫyAOЯ3ak.mhxQU?L~TdM~4+SVi7^MA At t 1L3cNh•({Ӱzg٩h36 F/C˙u5^Lchg)r*W`Uv{''Lɦыɐ%OѾa~-~~~7NoszDmZ+ɲ5_i\Wd:|ki?$bfWT FЯyev*@sU?(Jcc n̓S*@A\ŶQ Т_T P*@A.H5){i 6"ԭ T4Z(`ϨT` 4NI7EzHi@"ρS|OT P*0]dm2Ž Vx][BrۮOf7zŦaF٭~ hOGqx"@\36 ذI*#x+6 LfLPrA?8Gp^ 5˥gtz4Ў5{|'B@f 'y wӋ?;< mLp@_üb}/K{1FxL͏{Na{P\x@o~[1>Dsm8g2NGigZxfD$;a^$E&w +SsA?=Eū[~ GීT5 ,v:;ҪbNl)1_ToXNA+N*V`~w6Χ~%wP`f:`d2UQgy՛=Ao~54(II'@x=C _~{윊xQ\\b=9CuÎ ò怎tj|*8olF>]T` [SE,"l[z]Tf]T` ؠT P*0&A(6 _nl+T P-QGXx q/ 0.A(6 _nl-Q ~՟^[߫T @-Q?{6@fW u?LП]@zT?Q3k& T~f t@L5k,kT` h-v/6V reY*0bnřGc_f6[Vl9lH)@oX X|PI(чߠ®Ė YT` /TE| W @xA?p En?2 E vxD [DVE@[ GtogS@E_y'@>tP'^sP*0ysGT}rA?Ħ¥Xo-kT`3vp퍠?ýET "~H|@< T Ph=PMӏne'?ýET @П (@2EQ%~T ̠"Āub͢?j,JTw{~@e@R*@A~3h`~8hrM"peQ*@+@,TaT`h {CT P*@fP`g؞>C+(KП^ˢT P*@zWwJ| LY[HR*@A qfiRi;}h; ZT P*л @hd@({DR*@AEg9AOw:= A{-R*@])IL~P7NoGM~ԩn< T Ph$+P^pP ZT P*л @(CӃb<, x~+e ߡy@*@3(+,J,gV~XI ?ýET 0Ab8v޺ @< T P&wG*sktG[tNA{-R*@]wucZ8XdÑuML t?ק4NAN:ijONkI:;%IVXRoRO&eQ*@\~[&tJz[n.?6Ez$xc XÅIDATA:!9hJ#)̓S*@fP-ߙ$KA_\Ě?Ez$j'CE"Qv^83Še Q7?`iq}Lz$j{aR[zp ޏnFПˢT P*пb^ ~k>ңVoW k֬yGk1ݬ Ӵu$zF ~QzxZ 3(% GQ+Vo6ڼr~6ﻟ2p(y-QH8:j" AJk!3SQ(H?3EsUq/r묳ù:}\j~-?Zz!})(^/[Ox6%_Xn(=~Ѣ>66 R?)N{rW˙_gs7:ɽ.m9眻ᄏɁ3zW.\lm {|}fSFz$#"ƙ;E4a N2;vQ*@Okt=}&]L]@aX N~/ tJ:AAT P*m{9#/p^jdk1ˊ-gyw^M &{D]z6%츷'*v'Klژ>uHE~.vD^/T̨;<ge o{_o}9G=Y6ͯ^6i'ZkwW^}w4>lw=?6f;V+i2?DbM[z;P"eTTW_ ~*@PW޵COkݰAժUz}H:Wǂ9'Fxuf~Ύ֝ ?8E(Sݗ׿wJ)-wb?餓n)Z"=~v P Ok?v[_ ' gfZ>Kz$#ӔX tAp P*P@ֻGc+c=oR/#Ww+ p!F!@I/{r?T` oֿڷO Iz$IW^yZGүCZkiii3)6W\)O0Aƥ-қ$3P*@Kү|y9ťqa"[KAo6 P*P@L>&`qҲV[}#bv?wlb >I P*0Ps^iq1[KAo6 P*@@џ;<T`, T P*0&~s =l'X(cT P*@B ;K*@# P*@ AL7w P*@A"0}>2T I> P tsg[T 4}ysT`1=[nNLi@T TT#x%*@X?_lT P*@@-З<*@\1Ӣ?7OT@x.T P ]wJ%b*@*P m kT`B D@\a_6qT P*@zS?!bW}a}.T P*@@o DFl Ũυ P*@SȊ]R Å P*@YȈMR } T P*0"+v H<<&T P讻o1-#;>Ӟy5@磆 P*@ w B{'toV[yZN_3NПݜT P*` GWXM/Iwyx7Lk8qCT` Kye [o5o|~(8< f 'nA4PBS@P/5H0H&*P hk+nBywwfv[ffe)vg72T(IWMeӧO$"Gw@@czqHpggrv5JU}ٔf%v5I$賂@o4?~cK.].i]opK"EpD/@@czq_<֮XI"ɥ݉ +oݑ\GYA @uM7zJF?}OjHr}wllLn۱+I$ŝ @~L7NW//I"ɥǏWVw=FMHrok@o4Ϗ-Ԡmri{*޺uK1 -A>*D¼3\:K)8vjGN5 D?+kn|jOs"LzUgxsD]z߽yG-i?^|mY%>Q"$W킇rmo/ѥU;`#,( "M=Z)+}/ۺ4K\ٿj^voTZSӹz K%JyD.T@@czqlmxO&g8cL)ߖeo^6###Q-)$fuV'=n貙jEXHr*xbh^ҙNu+{/E0x|r@/cP?ݖٟ>%ۆ3>s~'ݽN&{$~w\xtnt&㲉K @ M}D_x<64v vxϤޞ_;=QL#;}}}~476S n񧍻XO|5.$W eyA_#~. @ˁӕUkrۙ ;YZ{g G:8Dt9^<7ZZܘǁi^ʦDLI8*z[dzDOGÒAF@HDh1(ѿko$ѝ#}ŋv!$ ~zʕNV~S6>GtV@XoDPwOԦ/3qU?>ڔZH"rںbSA=:k&__K!@ M}DwͽKvz}ܹsЮܗ$"GIZ!@@czqWOmSDcW}ٳw޵)dDEKQ @Fc߼y=Lzcn-w$t .B| v5I$۸& ,"xt۷%vQMU66_ܺcBA@H'D+1/n޽[>=lj6mtD6nɢ?2n: { 1=8];W`d@pOgѷw  o4u@pN:   )oBA@H'D+ "@ӹ&P5 XDя`0L} @@: F_a 5!@"~a  `$[PI7  t T @@# S #Dߢ( NWD sMj@` -D t@@ D?kUCE;::dUAH\XXt$  @ MJ/K2 @4 @PO P#*(IIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/image_plot_tools.png0000666000000000000000000043546100000000000020364 0ustar00PNG  IHDR|sRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>viIDATx^] Tڋ"UjhQѦEhUQD$D%THB3on3sgʙs{s3].2>ŋ7c~!#øf姘ӤI6mtԩX X X X X X X DLOn`A{4%ڬY3,c5`5`5`5`5`5`5I(Ydk֬ ZTtd' k$-N;^ԩjtd?\jjjjjjj 5F)Gц+~"_jղTk:įfiX X X X X X I `~}PF4RbEdY[̊_~Ң5kA-ԥJ" L205=bVx~H{ `P F8Y`u`ƗMӲe˹sرc߾}>'|W^ʕK=i5`5`5`5`5`5QpZZ˹DN#ŬX̛7?v/O?>#>>z(μ 6tղ_"Mu֭PӉF8Y-f>hO=ԯ m\Gړic5`5`5`5`5`5`j p3Y$}饗NXq5F,fMVi6%;9zC7;@-y=( ֫WB]HH҈khj+XHQF ܵƻ 9gY[nс:g\5 Qy‡şEA#'2Y$'W[>VVVVͦM8j.'j$Y'źVa￟>}Xf]Ν<޸mWZޭfM$P-N9Ӹh 0%x50%$[+[>ՀՀՀՀ܄S58&?PWh-ZF8Y$MvF^jFmO7߿ʕo\۵;9dO8qԩ#Ao=V|unZCלs:^r;wb7ۼ_Z1xŝ4+ӢE E`{ɜQWֈk(ēZa?בVE}% baְ| nFGG#祿R`WW#If^M+[6-fM᥽^ s}`V?~?yk<ԩ+vY z̙gς\Y9^=^:P5Sс ;evb*㮻+fq͊α3z=qQ;Zl`MJ05_uk]1ц:߭R7۵kwԢ+mRFhϼD#f X 6k6X̚ i3bgРA4}ٲR ? 0 V5̺8(}4ƹsoL^YsSPĵy?NWO/_Q\- 4A_4&hj̳1`dN5fiU1pKjjjj kpC-RF/hϼD#jVl6X̚,K{e2a„{"c`ϟy*Yg͚#h[yt|s /;^8P5O ܔ7±Tvb1*zBDZ 1sVm_bvq]ll/M{2Z4tJ F\EMlyԣM$ioPu58>z׃D:t譭m{O>mBvڅ8Kuj̺vY<ݻ/ l,f-T_r:w濒fco1EDKpGWR_\ܹ,?9qٳwܽcf}UCz E-$J9N7JzFKOѢ;*W1v xRSXe`E?&W4|Y͵?Qv)dYBMp0;UO>Ӿ4 n |ԩg'L83q >%Z)!LZΜ-SF`c63GW]{޼' +.Xpg^~9-\}U!=/%]7{n7Yt[g :oE2jT u2*_إX>%`=ŬCtX2TϿŮ]|9Зݦڸq}_x}{gǯ& '0+yx.`faYk藄nH f6mZb<+,֏X'w?ݫיuѢۨQ?ݯߩ,]z`zI̕@ὼyh$A lfdvF n 'ΊO`|?uXɖLV=F*yʴh$׿?׋9c.hU.ʯ)ìv)~wBO>KZ̚S!fcO= {MK€Yy ݷ!O>'x<|_l/o[ڇw={N<|f9xs g"~?m/k]2TШ1<0zO>(]׫a>>,Pyl.OF3'إ҂cY̚n/9f ۀ &a >uQ &_\_~>ܺ{_駟e8xOZͭ_k=}ŮwIz;6Wd}n=/ fb{bK[²gƬ8u4dȑ[mλoϖxmn%xM5k k{(lg;wvЃGϝJRqBF7ݔ&>] [>Ŝl15_kv1X[Ƭ)q fՒx T,إ҂'c X tKeBYXo[a$mkK7`dgy?O<`;V}vY>8KD1P۳呯}wlb%¬Co|\cN{Wn`s;5v;w 8q䁃 }O^۵N:xX~{P鯿{bW^&ۑclg͚@GI#t@+ 'Y˖u0U ٖ5M;M 6% aS#a5( 6הRt)- )U,fMxԗ ŌC/Z.YIDH:>+\>`Ȱ_8:t(>}իSlݺm^ϼ‹u[\3Xl=X9Ϻgۛջ;0vmQ4qfckpKǬs:ԥs3gN4wvǠ޽c-5P/9G6/] ][^oۆFy~;ȡqbև^䗤"/}fg[aO>uOʣk^w]gQg5>d;>Q&N{>rʭhּYM5iܰa ֪]xw4i_'_}ɍϴm{f 98ʹi?ur]mn6|i=Ig_KpYp"nK>lǼyO3uZΝ{[Lrk@d$2!B`p\7N pO!ɦ5f]qƬW?ySW9ڳϥ߯5[Vlm&̜}߂'__pkA^zEK75~}s~ =qNj^x:Ѭ)%vٿ +NBpuϝwS 1Ñ2 l`XS,ARk{<';S2e+VDq<52H9Ϫ: _.}qӯ*XcglMLpeկu¡ʑإ_Ŭ"\ Tu/|x܄xr|ŮoI:Y |@YE|1b̀ԩcF`o0tظa'FAwx7fu~h9<ja+VϿvhg>\j=2o_ ̊ H$KRX—vGOX?g-ۺM/|pތz Z_n >|YUk~Zfփ3fu+`z+*j5ibDRgHCY'O{wϿr¤Yo}+-x(%8->>H4W[n…7>}Pڵk֭<}ʶgA=z|Νn:$EZ5f}[oIyk]4}vIJ>6D_NKRk݋6>%',zύ̰OZiF]ϰ*(9[0nAܠ޷bbgφ%7LI?ϟ(b(@JpY^ɠA0ڨQ $ahAo?K z 6 ׯ1$YRF~v)BЦŬ\ $u߷6f-{fASY8T+&lL +&j:`~뭷b}]d@ 'D2dq9I!fa7 >p3?8KN޽;!a.OX"1 b =]o.p#U҉ųH Ɛ%+n5hNRibV_|H0Kpxws;?N9fTR7Y\ ޶f5`5`5`5 X̚0 f}Lڳ mRA06?.=;{R,f2Òk 2[jjjjib "T kyΝK.T>CĢK؎.,fM{@33 ^UmHk5/5fbi Y^fΝ;(P 2;$4fMv%VVVVVVVӀŬZʶl5`5`5`5`5`5d Xj1+ /+ۜՀՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1ŬY X X X X X @Zj1k,ۤՀՀՀՀՀ@P5`1Ŭin`јŬZ̚vٙY X X X 9 QZj1kŬ~߻oca"%/5I)s_l*Ṩ)F:Pk_$-rQL'Oj+E.# %,V%iEudxM*~N kÚ1&d] [ג@ .FvMpa/ "ޔz!Iڸo`#7>inv(I\DcRƺ։Ic'7sqt̫֒.V|xQA ukRC-Nk 1/ ݅Ak 饝F: f_C>6 C,fՆŬ2γU8bրbރaѫŬ{ɦ`@yP5%/ו=& ƹ M-x82!$V#-b(MV\r41Qy $5fQnMMxF!FH2j̹_w]aH2uUԩ RlrCjl ŋW,YR|%C/H޼8W_$D<+OƵ IZD8e[#6,gղ4Խ2MEj!ܧ gU].d]j2:Z.^_.VuMVex((+WsIE F_H%5H5 a""p#7N͹ pcJ5wVΜW;\ Wfv1 )}1Q RȄ\lR50sh Ӏy@*Vl\^WHNwcdvF5o>ҾH>zk:H߁Ӻta,π,= v j#-Z2_ , fz5SsbRQΝ وkL\`N?Qd xg:rX=rOמkiwN?& e\P&DҮZBO>~'2!t4j$a$bVёH5c/~ [*BbVYŞ CǕ]&7?_b1kX `jW"*^ڦ4+&Z&G+ZN}uK*^\tu+4װӝ Z2Z)k]"40^ )V 7Bl9ҪPR-Z Tr+ TڲBFH@8nذG 4@ CWo *l.$.{L+/! "6_\ye>%/+SЛj\n[e(3qD@.V̽Pɔk蚵b}s^u]]hDMb2YXdZx;H FjAZ;Yðq.”. )w6]p!kA ٦6]D&6mO+h8ฆjSC"b]h"ٺpv4 [3@ &UƩ4T)*V7T«WY+Wn yPKLh+1kRh~ܸqo /NU?`O3P) d6$ z:ru20VWnGkB^be_q \ՂYrbSQz05۷IIYS:#NH4bVY-fMG; Yv%рŬDA4W7i'77"ܭ`LsG+][574M(P#&y&^.J#&X.aFfVSL.vD*xDA'eO6jRaLFzA2P y;?Yaqe#w jJ-5 U mH7mڟ 4@%ܗMII8oo*u\K !~ICd^"^e|&5NВf_ZoƱ$L&Xib-0N?jjj H0SŬaظCKB]bVQb~bVK4YjҤɄ fΜ9~RI"4Y]P) &BAm_QLs:8͉F2%IK% oQ$XҴ3'"|#DŽfH,qf2ouM"_6a`JQ`J_ALз *CM17W W 7#@uϢBreS>[mێ#9]TxYAEYس/s#W TY|4|6mRo1V(WJ*V̺M ]QZ9ŧn ˦u cS_sWM>5lY?{pFbuB2a,`wLJe)k>2iHAǏ7^3cǎe?VVV)  j?Y  % g=nj|pj6vN._z5'> $(17]0DrITu!T6+Vir,ϦѸN/%@f@m}k x>!tǶ;]oBzz] D(}`խ0+!,cQ  aaB@TJD aXD`-tG2 `9#ȱ7˵Ll*D3.(@Z[ 4 PDo$6"SSXanz P]9Nt,4*sx8V,ǧzL@གpdf }'$M/YO-f5]aV߁f?VVV!LŬI=dqd8 F1_ OmGr]즋7Jp;UQٵTqLOqQSX=T}sѮ?h*m@*ͱN"4'…+Bn8+]S$Qɋ!PId2* .bK="2+#mMKN-RUѧ [늑p]2RҮ4?1~3/+&d*^4Eqi <3̭DkiEr!6MTԯ!q5j 1uk:E0tb*}[xwuW^UIa?2 #/0JvYAOXj1+)-aVxK:~ҊDٳN:tQcI5 a" Hԯ.LrQV6䓴a*xgvxgRL2I~9rL`Z\O](IMgɬ8vH=" ҔDAmV$ 2&d"4v hNLdΒ~Qpb~\s͍i^͊u1$0HI*0flj.)| be |-Mi߲2ab ,FH0M:lUf=S]33_Toa%כ̚J](`@ʜd1٦ާEmlY LԬimYsHiOe;zL-ףgȾϊՀ f͚ӵkWVj_W w~]̿܂gSb܂WE9p'. A!v̀D{Yb Æ%Cx (qYj!La3+ p@.xT(tji4 JgqK6EլYMS+7כ k-!T wU@34P/SpR$u8w^U3l+H\31ok!,UA0ČrEBXD,Ib467 Yd-]aQH,NMF&f4-uft$*֓ʗߡeW3FԘLRF*2i,gȳӷo'x?v/O?>x9|ѣGqIeZ X DY]>XKr885w̏8OA{' ;i1Az*)'rK&ݕH.*֍&as^d[Ұqsg=G\l0%K ]2dUAJ34X,Ε+b$RsdIgr.RRҴ4L.i2s\3j Q-&\6]PWvڻ,U,Y<+<6?#GQ|e,owA_f]{l5`5 d>6LL-[ )_j.𬳆1!quQKtͳa> ]v iu+kTM| 2A[|ײ[f-m+^D&.KbUù`Hܸ'T*);ϐPYR/0CŽ?ka'MLvU0ǻez!겗/sdC d$ce!`3E?Ҡ:wQ;rRж1_:iJŝӖBhf[%ӌkdt Ogo`[m@҄/|@\@S8ەͅQl>Ʊ~ig_bzc`Sgm ~ٿW^ =zu,0pEB~al;M[ . 2~Y|hsuuf1B]N'f=0ORigPJט58@F$e,fMh5æ 3e~#+,fFWmꫯSl~7 `\Ou]o}N3K?~ĉN:|۶mͺun4·`L̫JOU½qжmۦ;?hd*X@ٿsvU*<&[d Nf9ۋ?roqZſZ˗ppfP]]X3?&+7ĺ:y ?/x>8Z1˖--ȋjNB4nz(̼EqEh 648|jƳ*9Xi `ևkq8mZRR|ԫΛGnZ  )S&1 -j.5?6f$wYQKY Rh&aa> ]&۝ŬYpU_g==^<{ߜy _n|0bLsMy !6XmR A,Mj@/KKk_)mtJ1\f/IaUkI ɴ(@&ϊcSdvZ.,tm>&]c1ĮS9n6 2<6Ək{&LhڴiҥaZjjìժMtv"S0;v~m4dcǬeU+V~XxbUo1o,J΂y.*Q@su0hG[@$F,f$j OyYÌY)xՐkx*O"wKWШnV@cL/gj{^i+U/eJfmخavkVD'|Ng^_C11M_+> .\ʕq&򷔹u7DRĿhقypKůlW@ĕtʔr[<] 7.Rc[p 5kVEHS&=kڻQ.y\YJ*S pOG" 3u1EU Vw29ߩ߻ꍺuv?Iۯ)W*O"'Mm}&{wj y%sUrCJO);F>Pqy!8XV"% :g3TD;WE"J_}{AVvy! @hR -pbwIj1 W!WX_]&(o>h|R$ʵ1-p4Xz$h;<݀袮tDODDȥ$F@<"80VEҐ`R֗r"J!i4Q e:*W )[V-H!زm w  42W ȶYz[ϫ3;8& hT C[Oxھ4/l Xu1lTXB7 ,vk؜3KٯF6lE/Bx8;TJ,BUWo"&.o .1GLbv/Z0K˅>[K|Ldb[3߁lOU>rdyw/@YIjj hH"cƌB]/xbo;>#}Zߦ˴G ¿8gDyR#lbB ŗI8XRZ|'9,\:/֫ ~ᐲ_U fl/[~)mG G3d!C ̊4c5`5f4Ȉu0FPzC\7q'ujݿ;2#~Y4 gpW2ǡN%--lvrW&M;cg= -ZSm!𚒐1 ֳgϻ $V!0|yVڏՀ@Z΁WAy2^z/?v~^~'U]tY5#/p55o9x"So75)A^0kF8XbV%T{]̟dW|X}m`V4D̥pĿˠEk2K#lbH~'xԗL:l 9*tK0⏸(Ӯ|)*fG%*~ me+' U+OφV )W~bWaJVzh]_pW iiM.B +R HҊt9?mQsɹפ5*Q ,?%p'H\r܂:*HSкPtk1T|uFFHxY>ɒqW{^yUqU0,c+B e4oۡXȀ3 [ɤY`M8,9k4>|4&WijF>/GG%NT`\Z2vmW.s`׶ʳ.9ӟ|U;,K$ø '!K_xdwŰ3PMZ9\kZ̿gҷvrר­yP:1U\I*]~f.wÉC% G+֢_|Ȱ"VaOVڼsb \ V&ւ_nƂ¸a H˓u?/ TH˔yh,ez5s2١IfTD1Hƽ! OFL8Yc] Є"CpQ &c&{@mFrY&>7(|d?AsBm4 affD3=H&c0l܇ _^'/c15{tW 4䘵QɘIPj)y+Y_^@ʷՄ.0j1kߦPkbV.~235MT^XSt U˖WU|]ׄjJ2|~QY3sfuU6z>ڠwkbē CN_/rY^_pOr:cĬ*w=p-YB W;f 6Y'bP\mVVA@ZìLkʆң5E Fwm͛J]*Lz~sKZb;I2C`]@/T]3*X[{n*wSyސXRs4j$0Eh} HpB$TR8-1)ò} $\Il84'eAE)zlyVFc m1~3*L8`ûّFl"pXKbs! HCPj웲gv$\ t;3W e2s1ﮨUyނV/#oMies1 VA*.[Qƈk<*cy֠mVVҀŬ&8b+a+lnt3ўlL+H.6eѨZVw1pl !8@6+@FO^ )QOtg3p +Ћ6O^:Zyv;ppDn'sRVB}v0vViiʃ >+ &2 0*(,|XI f=huaJ̊qn oTXaJTe3b㰎 'fe*8w P [TEJ2),pǝe] 9_a ART-ڳ"S7#V`,HmYW Zl(Y\hߴ7U-cOGYpj@ Zy/Ŭ^X X Nm^oyQR gIYĬ *Voko%{OJ1+"Jf}/k.b,bR-f նl5`5t X#&bD;&:xD>\e?ڋII$GuA.!̛ta,O>ʵa MCb" >86m[ۀmVV5`1kQ% U,f51k2zݫ4kPMB9#S7f-pCB7]"}3ɐ!)bVY-8Hb"x33uޗB6AܒK-a2i'sX2yܭ =Ӵip t1Ȍe锣x #6[t8Yy:t4siiIK ("GIdFAd2)Ey>RaSų*I(L \ɿ"y+2Lii6J'Vd4$XW #$OLUp_gȤߕ#ɺ胅6J(K[U0`%' Zj_!dvi kex#W73d~[}\ڹ\Ez>[LXitUHXh464'$.z [v$h|2.R{֞5U R,fnjbTY@n\22\@5-H7-%`-KJ4d,D! S9 @*frL QPSuF8Ռ"fL2#vhǜ \e-E2*% #@PMKVCp@S>6! eokt[1R[^~DEE~e<d}V:. Ĭ?a:*r^Dp°]d&q,괸n dvn/2*M@B!HFm@M!ĵX$4$$򥣞 FL@.9^qyr)Ԇ=δ(p\t9Iå|f駟~`W֊9cJ@4`1kQ$e,f~eΜ{te*Ŭain;ׂox$SޤeĈGfx0+'*]xFGug[Mh ы6k5J5`1 9!;xe+z%B Qbr2yYmǏ^IjMENB1'V8N Ði&/j`@Rk}rol 锜LL7 a(Dn"Mv +YFnkމN QbdSsteFKn;KTd+6}CVt%3U]!Da9}|`R &sIXu1Pǩt^}"#6 ˳?R)CXUN-I5Ry(IRW*Q.3>/WMf!3\< FWюZL*!**5_Yd-~oy7S4 4!UzA@ 2S |tKJ.Y*5)؀R8NNto\u$%BSRfmKkQF0)[ a+M=*LT9`Ne_ pL,U&f;ȳ#Rќΰ cAܢU+rtщ k:mȟ˖J=(~"р&p汊qЊL<3 @B\Q]? \dRFųYϝ;lٲ &̟?ɒ%xߩ6t+ 8vU`V JDz7ͯ6lشiΠp9~ bĕ>|lHbY1i, @yƳ ȷ i Ĭ@YԉspBAL*<[2sA+}bӈiI FNTxXpMi2a-:5a ѸLiFTuwЛXil0gY/2"s+&CrK}Br(x15 F =+ Pz)7ٳ7XQ#D@CK?ih*4X4l`+|M)BJkG.o911 ~U'?̙3G>}imf5a[~ēq`̊q]MIU7߿μ_hF}Pb@636+iBT2b| f5{MM fmneZ7)%3~1S)ŬYO> Tcƌ;G̙3o|ej-썢T"0k|sl/#X$6f][b?`*F&fc{|SŬ!B7+J\OO(@t1 r.aaxJ@t +3#kiWЊ/Q&"6n )"M.<<hm '- Cocկ&Msc 1/FxHr*b`g к5#ai_CKrSfnbMϬId]_}˳?bw _~=:rHضH6$0+r儥~PO 7bF숊0*Ө]Q1_G쏊>*槨_bND.<ŬG?J īo1+~[U|d$` 1k.7DJx7_@ì,Ynx8S:l5tqg buȐ!y06l؟y_߰ieL[DK$դ33::gEG'(TdxҥEY]ՈDL]/*~ԚQэDE7ZHԚǣ[F`VL/LLbϊ_Y|o*{!<~n*Ea.5ayV l<Մ.8L>bVkd'/Ck<2HJʄ46uA-; 3аa_jkG1c[=[TɨsQ1b!&j0kH(f'0gp>cVM o Y}E~BjM&=2պu7/dI?  ֧0_t^a-m:h;/~ܰa_q:cVӧ/=OfO*`@1 $J?nq{ȃ99,A@<4L"@lC3)!؏:! Șz "x[rY&$2#TE-m%ֹ+Үǟ7؈Y[ԫ{-_c _*ՖB UWd `xE11芚$fe+.%@,!f+W $ V.H !ʇgF^%29O\$`X$$AdVlViO6@W-"Wdih8kG|@4j)S3Ї/:Y9rK.) cBubVi[3f1VN6 ]-79"db[JBPU%k:D/a͟M.5W)aV2EEQk:jtQkn!::[LLeLdgld&=ksCYĢ) ur\r̊1+`AxkVШAW6O*vMY[[f -[pdu9Y}, }0 0~0?~V@J:Pƹ-\dyVt]B$ZYgӲek%tQ6/|2TI{o5\/5RǞ֏+)GPuY-ܷQ1LWcF{bbr%g(BlQ5bD\IVΘco&yK%}C,fTny+V˕F s14E"3U=E񝺔X\_kw3鍪Vm ưVFݳhCJKkޘh]Gꔌa DTk8dunR#*5>f7Qǎ?(X^%c Z_ZUSϫ[7JWpy$J̓մ{GJj9%', RU]U~^MzM u<PEHḊ=nrޠ蓠ӁwJD MyJU@{DĬqf3ܣg,UD#U@!{;O_gAXL 4ΰegܘeWk L?*M"D 7ܗYQFXbP?IѬFFr ty%G|.)q+L9f7n,>܀vvÇM59g_lJ^̑] x2i,oMcM)̪`XcV"1qh3^g9/`D9=I=kL11bbČdL11CY pc Ya8+QrnB\QAjGP&o|K5%Y2ېŬaCuU"̬e%R|D&ȳAzJDf| 6P rʵ\ELx)i0da[?x\%N٫םq1WB&ڛ&GPyU%b<"!,8i "yVЄ$VII*֕LfIrL1 BB^(yMR2'\Pd$)[0&.K |0Ga(VxerqJEvϳA2˗A!a/s.x}iLUf,\YW<Uhio-ыm˷H#m-V BAȌje*b!ӌW\f'Ѣ+ӯkRώ *&omnp67}@[Ӥ/OY#4^HCA>&SO _*=X\|ĬaظCN.UmY#1sE*QV|fnVܶ )^m| fM23jb'EM&bĬśUsֲ6knΜ78g]oCK҉P Q9TD *1"d$@w.m0q0zWĬ#R]4brg(OE$0Q)(A,ʕFSD0`FC VeQXz&T+m,okD!h0A K5Ԋ)|!XW]u ȏ?Jo3ҾHZh*@-d|t0!`,ĕ KӆGėuM3*.#`鰘58uO9X4܆|Ĭa?1R 4Y4cO"T4I>߻aSoW.}gL)awOBMcbXjI54KsJ5P3hY~x`&cð|LGbͫR@ Q +T19q!g2\_IeQ_E 5©4J Ȁ,X;;+w,\BDdr{$N%k[\#@sc )r1Pl)E;4!2bDEDً}b q_^[Y}ɡ@u0%'0qtoW WLcAГma `R1:lAcԳi9q. Ƒ߅c\ ;yEqpEȂ !V!uU\}FoU!JVyhcCC$NehC<= 2ڵp/ŬŬ^jSjŬACmG0tK%%S;f-4ʵ&YCi |͒7w]"oip]>1kŬ&fmѺU͗w ꯊŬŬ0ڳdy !i]+/mb*,bC_QW|YUWt^* sg YIz͋S@kLDĺ:SZ͛bs@{\NqI$vY^~7Y{= m*蒂d)QD**)7 Ⱥ lE.A qȝw&P th)tzjQ8ïy"OxgEVQm8Z+@0Nt4d90#ѭQ05aṕA97ظH$q;uy_~^Ч3+#@aڨ0x0R*qAh‹h fj.Ң,eS Jg >+.mdIҼ"^J\WaUӪ\KPsT+Zc#ӳѼ6L.0t8Ұ P-6‡T (" 0qx0U86%Gs߰|.-[ ]YvO}v)wש Js}ɯ1ߦ WdKB+M`AgCxẏ; 3&w6/PM]7NB70+(17 '-ҁ)CY PU(A??ipdglw oSO-XГNC?w~.֎˟=e[ƬeT.Y]nX;XjmB[ XR$k* h0tr@@۸2])qo9]qtsY(g[34 :.E*.~eDY6o*NU_dzrYAj:6 Y ttS&2$~?EAU~ޙ߯:<~๗G}3I"У4!ĪCqCH!׬z51M%.ďrRN/,♳^ k$Y EBX\h +G9rkBxdq $eQM3A]'4[꯯R`ʸiEɉ2VP4e1~΂uXy,K-E%>)œÑYX_y4g {ׂ@p=YkB[{s;ܲfkՕU aV@L۷5mVn~*U "3AU+_@=ccW4  YH ttr %Ml p M4]w*jy|{[?u2vDz[wZ켙@P@ QS0D' a+C ջ e؀2@F* C #t+!,8Y3`B@x.+@&zhfc\N҄Q>Y{:<+l t %ތ¶BڑŬ yԁY{NE˚*1:D>⦱<'O&Ͽv烫DZ񓚝V5yxY~V&#gkb\Yðq.B:STv*fH%Y](8m}Y)Xp"EK 5ʻ(S&i2mjЁȘzF J^,=csYq_!WQ-욕޿탞5*^ȝkSe U9c&%M ATZFavknCa'UOdҫ⌕g+FU,YDyzv][)T9 qN J;]:ؙm87d-ҫ V&"8"ٷ]Qb#r`OI% \|.O• S'/x ­пMS^Ytb}@b (眿}:Y#D,{ZfMapOQ^ h2+ħf]S}{:|Xw#=;`ZmGZ fXV^qӘr&A³ B[`zC.EZEY-f '(M/  _E~!8j,[&VAMь9'Z Ȱ\& dXrE!< +UbCe%leA9693ۓB_#Q WҴdd+I\l:tmU|(Ү8#•hWynљi% Nzusol_}]ŗͺ"a|ȑ_~WǏ?uԙ3gP&!OxP8LC.xkbV?0k6EKXo>ڳ ܑynb/(Ϸ)gƽ!͛`C郅|S!@t `-@DK[ztUtkc9ZtMQ"'*{"W?~V25!aSm˙Ʉ3|𕘕@Vq(J 7qON[}pn`joihwO*h?A*x9bcrظL7@a"Qk K9)$W Пz6IҩtbaѰC"Z4gmݺr AxP!r0~f "7+`0õ=!gG Zh6@\ʄ2Q:ef^e>&YΝCqٻ)3mw俽- O=nYvO}|c|o,hMdLډ5n}y嵖?]|{f1NY;>,+ `1k>fM֩S JOHCjڡ+F~ [4bpd=+h1ڊ@dL$+'P sVp{lD']a] ⽪8|E،&We<$+CR^Cm,CĶrgILGU,qJ-3Ҫ\)sK(L",5ELd;yŊ;wV>u*ѣyz:t֐뭏nF4ih!@͐@U0Z L*9T,UzaԌ+yF~5f9yAs3~xXdu@Z]כumܸ3ˆܼH/.Q.]1~0i~4i%InGp"?9W>ci +_ٳhN)I >RB,^#;Ϛx41 _%YuSudzYÈ҃}qx:#[f }Y+5y k7k5bVV~3R{ G׼6@16xmݷ[YjMkn4bT+ydmh *Vz…l9i:/N':YGW#Co֗jގъMС^zXSis~"Hu3,fdN o_2T3Q*K|hG)XXa, !V7TF& C_U ,U{5+0kF/aIΌl29^M1.DǴJIxbFdHE&#C䎊PAU^&Vxe. K'$EXcXdIԣGheK'>|զMUƼQ{MQs'JOE,n +q'!yLWרC+Z6,}e+)\Bt+RW,ҫR4I 72V4ezoomZ)$C\pWd#c wCl#@h4`b3S ,=PL"L.`fJgkG><+RtO ZVbOZpqsEPuJ̢e]͂$xl3q.(}- zx-$Ћ_ ^ik j bVVLT_N{TWq5}I p*"M+ {]Lwi`V:0 R~ל]]J{@4L{~V@7q`34(!d,VXO@Z* *7YEl* zz iM̊bLz&: EO|ZAI̚k}A'ܰ׿=o/*.'+9?ַIi9~NeT+Դ/8KDnFKPn0MbYvpINU X㪼=bوX=n;@sQݹcϻ/mY ˊk|* 7 #d%S@ @+Ȉ\Y\>Xl'0r.\HjbOQ)3 0wNtYM$H9e2:NFR, CKX Vro+,36cY"r0|**QfBUa.imaGN\7^P0w@Y@7m)*4seU`f,&kϪ8 VV س ӟ}[xb\^,v n"8*$ldZiA^B7Y-fE‘YjDYeMbV?nO5{3=?ٳm&pҙ #'¸#>sJ?Ηfݶjgeӕ XY#7JN5b;FEpO䀖.g/piZ8ǝ:ɀ{5I,oِa4 "JYðq.B:SֺB׊txz#?U!D SϾ@xZgʖq +C`GG!@U#I:2vɳҞó:Axpf,J@kW@:-,6`+ImUy%jz#tfbn*S*JG3܆8)'O34Υi0P5,cMw+=, 'F}u*GVVL_ƻVU<1ɉM\T*5^27LU-R.^Ux2tL kÆ XʅKcVrg.4Vv^{ K֨vWZi]J-p;f 9nyk^#Am4HNWt\hOyUJ&Y/z#%2(Mo4[!-XfM%?UH mmP Ճ* HI+X‘ҭfq;۬rj!r#6Yʮ`f{8XxyrwFIJa*Wqg;dF鏍JqnBMv#Q1+ݧ @Y`DL&-y 95-1.N-0E5< rZ*;`W 'x $F.}^ܹˏ\`;M^~#`c>~ҹV0۶\qջh$޽}|V(i.(UuYw7wNW-Zpm|-u{-$tثv(S+ht$*%fœB.ihr 9mĹ@` ,n“|LMJ`*@̐LJ6dm@& ok%݈(udm[O>` H C:SzbVXtxj9 bV$0k~#fx 5[zB]' Gq7 ؚ|} ʻ?o7Fv£ްM'Yf }H mmfT(Y̡Tb1b}9Èlg\$za ,b=yߖw$,}Wn[=2Ɍ9ĤY%5N_芵x95yD)*P1:b0)w̝]iԨATڠr>C[mE+bƪ RqK6pp%Wk&h+?Hf>ʆ^~Ȓ6z í]Da[f)/u-fa> ]j sy_BUZB䫚&L "q:c 2=jG|JUp𶮲QǹxhcxUIψ '|1Λ(WToOR4.oq_up8YViNU\0* Z@PbF%2njsS0f뮷la'!'DټԖ2S٧OLK`|g_"y^iخkq>篿i^6UUq"7,DNibpsR(C F1 r|@ڣz= k iժff5k5˱Jw4Ф?vJOmi ¬r? c Xτ¯8r4@aBU=*p?zNEelGi lk)XڳgϚ{S(%#kgr\tŬ`,W0+`+HGwUx8h(Mw_k1kff-f/TQ,<"ltًU]8{_ggM4AweHƥm$H[u"=N LV6R 򉭵o?Ru_E5c`#] WWPkd@B;疄y D4'Y:r8y{$ɛbTdRWl&nC32`ဓ"N"Ja#iWZ@ q ]z^E&Ɵbd(A42*{#<%kQy( [:7{|{ PV<PoZJE%eW1gȕFL!Y杂"=s:Rånl8IT;)ۦd=jdFaBba i@~Con4 Tj2>}96Hd;p RR2•,0t%#^wঞώ50 :|\ZH1+C@f/~xK#>UO^6M]1HuA^/WZ5#k mV*w XfMLŒANiQ:st(x#&Z%'b< 1 2'HJОwՓf;YÁ- > ~ȳR@wT`4+0*oS p`L WJ9h<7ߕ݊䫌qE󼜁/r0&Xf v^DzHP{+la 80ĐҖNl/O&W6-cR2=p<}㏬wG_9i۰,E]LAF(H%L tΑ`^UIhCES,37ڢ3\4Ytn׬Uk*"+li]&`v5} } nDy+ܪ؅\hWҏLt˳d`(*ZV YX5-rL:Kg>Xp7.?C>f.@ƻ7paV 0- RΖVD^i#^N $K Jt}@RӻY=ȓ>7&2&l"0e8 [9(p4`#qP(bqk#'2+tƔ9w:a=Sh9x1z+qKN~6hᭁx]ܷWͷ#E_F@NG% ǂ!5,SElDq x50)&ŮY T܅*E V Q#2Babҏ.x?|i u~Wzh!1.msbȆ'`=b{ Xv%UL< yqhu]Ú%V-Lq<2ˇ̝n1kJ0'v0Yhg-zMNwl~f/vt4ZlD+>m1kޅj"0(va55fxebT S*CI;f|V 7"ƛDnnO  :bSWmda%;[kaB_>/)4 i#㾼bHH6,&(8tyĘ>Td+6y`L$1[ OŴ"qF=㉋3\E) R!'źPYa4B":R&X+Cb#rNX,ӏJqb uCO|w>q(ff_7<&#ʻq2x45W\RrsDn3!E=!<>aI0X e;J)ò2+f5hlJt0> Үv@uEbL+B29ןl~ϵ2QXN3AGA6bV^4!/|1kmŬ)ĬE,vƬqk>S9~O;;k*LT9Y6Q$,E5H g'<+X^3d@ Z^{VQ,{\eN&PYD3ȴV3U5L,BUV[lYYx03(qۊ Te/'!Ks;D/ W2* -IXMɓM[ 8Q.`dZE+{TRV "lq'j1@*w?\]@|@#ezY{;R!!tJQ a c 7|Q7bYoq2vroG*Q/<]@!tG膥`' ʏ3&XWl|eF:fNebڦ\郅x\z+ 2e 46@#&WLD&Xԩz1c'Pz_?7AcI%Y}FֳCZ&U.-fkne1Ƭ忩S5f ^z}o#ׯǮ᭫֎`e1k%5yFY{&XYX믄0sQKY5pp8EЀŬa0l܇B.l@%Y5B^#C &!8m202+wQ.Pa\y:Ǟ,xV hՈdyols˘"d9g<"wA #M nRt;-foG>D2`+򫼋̫ظqdq CJf,tdz})abUS!2=q2-D%'bI"LZTC[,ͯ|F0Z% HLac@ T{-`z쫹~-L*m<ij4MA1.õ˦8VT!a2̴I%`ΝG0*,a'  32g:)‰TKXeCicU-`NF (Ưʮ/'l0g֧*|Vͣh䱊k*l!79?$6̈́ښ] F0~& Gbc-YȂ7޹ۃsJfDYS%leO!ob d%ZQ ԭ u׏/SqmҞ_hac9 6Y16ʐ Sf\X> &A*\A#NI/_89 sL\woxĶDm3,8FMl:nR9!i#凝Mvà~ iBTcP%6Q,Ռ )RtIi:]ᒼYt4'V}^"-oz9oo=jXh;iiWW<}@2/իRN+JZBHo6ә̥d.7Ļ&' a >5,} < L]@h!еx 0J+l ̘x]ZZ𤇂gM$¬"b3]1[b21*҃\Y¬& ict\8Wݠ `p5 nBXRaf,]52g20Z[o}[¬'O[S?sU1"SbF:yƖL5+"JlXX7=ɏ&Mqmäv*-sS@X&K-xxJ>6m A_ffUͽF"OaN0_2eoد8]/9RX%˶4`yVxր#bf0&;9;)"!ԪPĞw4 Wp:ڏ\¸B`Ja1s!%ނHR"0,U’ed"ؿTޘMyHNEYzvħPQKܤu KbEF:49TY|4[ѩ2i9aMAGҌ1k!0]%`{tWB'g%ӬSWqd9)N ~e1c=!\u1eS/3MqɊ%bYLkz_1D"p<+ 5ϩS{GkHzZկw [B+ٳ ZlF\fPa,c>4݆)1ntѓ+ GnSijf2`@~EV␟ϺBs[n{5ENtqI`y ⱞj 6lC;% m4`15 a"K8𥫷 )_cB h --q[dVxEM8zV?Ŏ~r 1uB0Coグp"%5D@0]N$9 *V{)X F zUG'x1jFFuL(ww~,l+<#į fHV}\d)i$]Ӫ0((zѱ#Ż96DȟerOg׶x]U[vT8cm;BۢEe>^.o0bV.xXh93VJ \;F51 Hn|Dvd bÑ|U-/Z==_ֹ_I( #@o+M XhW @ Ʈn`s_i A\Bl K̊sbNbjY~ܑ7aL !N"+Ln5rUrVV*Su,F/%e% `aZt+{a=/  r9@?pFyCbS BX+O-+Pi,h b |BpxT Y-ˆ! ߿imG%xf^=U2ŖVQ|V!D9W1Lh@h!j@oa-b'1r(ҹm@mjZVmٲtYkbh0l܇.~Zbs՚[*N`VimYSY{`)re˝;o|sbEoNY#ekg5`5b Xjm G  MbsR;fA`-XWJX?lATuRb+L΀n F)"<+8@.1qylI7rą _*у8U4' ++h8Yj񡴍n+ *O.9k @Hey_&D ]x>dǸTP/& )[^h bdJƈ8':vąѫo+]yfQŤ .<B lxV^Љ(cHf( c);I*k)g;WK$%#ٹ KW`/7¬k2s)eTv]ZF c(}ע'Ԝ-2*Uf,&DH1JoT6KdlHhKfMXҦ: RZ? jǎN+=ײ5 j"k*}DBC{OլٵW\)^hVSФi䘭§ iVm 'I>JPg BM~dTʯ:~ɰAo f NUOֽ݇Jpdy+ =1e31µv>ġ&ݨ (fbV\|G o  [ 7xR?@B[P1Bw]*}")+ZAcҮ`o~+Y(I_KPᆛ۵?~oeVh„j!?@Xk"O# "O,>Dx0n^>O HjRjbVY~ㄪb1 {|nŬAǬ'/SiYCY;\Fė%Kf];guvmi1|冸j k bV0k6EfVS MFd8]1imM6rAS8fo,AAgC@1+w-\E Bt'J'A#'b"]"A3ہeP} UgCyiɄLKE͊t%bLfו_y,_fV'h`E^sn{#. aF5rNBwH$ _H*)&%j ȬD@0iߟ @4+z$O<' 0BETAB8.xf*[hӦ;95fd[A`C`(s\fu=s֜t2+"nqG,df!ܰx@̊5_PixBk 2k? ȑׯ/cRoge"T+`+bVY/0F,f &fxJ81uaYCYGM_,foP`Ne:d)qx}>Xo?3w?ԬY>YIgҥJp6Ϻ2ezaVa@ì[.oS'zbVr ' /9!EĄD*,]zx' Ya9p+7Fg Wd;fΡS VFӄ"M18}[]t$–7H9)'Dd5=iߕJ\#U^U UPUK*דgT^_$tC&_"eR` m峺+Щw[,Y'~guw#[ q4h V\+׆jFSవϯ %9<:5o%'*^/S#ózf}|e"J# G< i<@u^8d! ?j|X,Xr7A.* pLZ%؋̒(0͂3Z-J3> $9?5B ہE8 lzFܻٮ@¬o)<X99'>`a> ]#Y%l{PbaB8-f )f饒 .f1'" o4q²F,fu੉-fug :—Hi z z@s2! wN@_49 X4VM\)!Pdb` HaV6# ~_iBBKaIt)`>3WwuduT \EQ{7O(VD^W zE;W~l˦buA ,H~$X * Zɬqbv o>_tⲥ YXD&a-KuFC}%k2 k nxaJ@TfbfХr~E)JeJ]::c26rCf8 <+j)~3(6d#Tk9ژK)@?*}&BA<*?qn2&\MsA .0'0ظ !nS*B.2 ҟ2 I m܆mw*Ebcc#%*,Δb3̭002o @JFkAWo NX&j62vPY/ڤsmsń.ҝ>R4hZmNR$5M cfx0XvxĬY RۨQH&뎈`ūB`LJYu !|pCacTp>!A h9P?f&Yհa&T4˜[Aqm9yK`kd5V;GEu~9C|g^!l@= Y/BI/[u./3V3aRoWoŬì%Nh3_%Xu¬@i_h%5:<&u^sƞlcG552Oyf o "\[YIO`$O F4Sƈ3F{ 2U ƞ,nABQ, ͛I C #{XiPFCzq'Cg] ظw¯CNctлBTW!#!=H808h=(q|ť_)m06Bqi30owN6nG`IÆ *!FouH5!+!E/_YdT էg.3ɫ]{ۑ=AZA*U@Wo֬YHttH˖:t]uXH NwЋ G{Q\2zp̀- xV4`RFiD˖} !7ȆUo-1IP:j{|@!Y b[ժEC=D,*Ml*I\~BdYVAh1+_%rZm h cAsvi *Uk a4tW~K0xY/K~S5 %c!myˍ_=AC֫B30Te_\.rsb$(w+Uڎ XVBbT+w)U ne +,9(5**!,^XҤjꢭBS2kj8^‰9{V(GԴg7, ]v gnDB%ޯ|{dO H7 /]o iP~9&[hNP'p*vS鎄\~=taaZbVGSvD+DDDf9yؑSM5k6T LA)R굅`0DlJD)!coz(Rϗ0w-((OT?p^Ӧ  #lC`@i0TѥpAmXJ@h~PN4N EMҮ`6G'x$<6 a /_@j( Vsbf,_tƢ*+=.֢xF (^O>:8q2Z ?d:~B!xL,PY1xCalѿܭv? [ۅ'k1_/f3l1kH1kc1k1k}YhÈ0ߕŬ~$[<4`1k01k6EHggG: iذ4`VxP*T0\+ ʗo@Ed+B8AY VJHidHtAmU a8O`bV'kηCŇZzAH鑴^?h|k'r0T~:]a*gʔ ,L)hR>da$.P^_7&۸q=Үr4 …hk$VuUuo,Jk; Pqz{>Vt̂y W~6B&MǺ,sTY+=]n1;ӟwc1kʩ֠LP`1}]a-f Ly;$u`~;dRq@V2@0i5c]!=ɋ!ĂӼ~]r7̊2ޗ 0Q2"*HPQQ3 asuԙqu<3wM{ާo{zSOwMGϩSTuku6Cm1OM L!+pP>U +[۬?<ۏnPbjdeS&F"Wtɫ ,G?z0l4ʲPJQj)EKn:-WF_(H5Tɕ5բdJbOCj޾ ߮p*hqR)+a LbUbXTۚcɶRL0J~"[iWbѕ D,zSBng;R*{*^rSMak%HU>w4%\UzIdh7 2obO~}nf E`ggUV"9eaIwa,2eZQeBQ8wP4IJU7~bת,AFzI1;D9 fBoWz+˕yRrXŶV*2(Js+ P+*a&ѵKIϷZDˈ0d+kheE߇2:N@wwjD}(Ҭa/3gyJϚ'*]+gd0o'{/Ŀ|~nYO?g^`hw<0o{ݮfzqao!{= zv}GA 5fml g&d`R-1 Ϫ6Thcu"KOdH\-Lb4cn@Y<+ }3^Aq2yWNh>pBB" U>LQ[9EodPr>פۧ/>wSz`/{g? /xO~x Є _1aP_h^TnVYɱw 854vo`U[[܊*4Н\(9K;*> *0k 搸.q$!C9vm BRJ +Obw3OaoJ;ճNO6i߭;\ƿmK[Ej/^k".Zxo aڪ7BBNzJ`qǡ\&i3{YIߒ_;.EKJ<{zPNm@ص*`pP-,CFU^hXCjΝafDZ7 -Vw| p?"H0Y1cv""q[`n{@V BSW@~_(rHoŬ VŻtgPϪ ^Yo\b+͋GI+$\~ck>U Wԩ*a0\Q'/=;'k8Ƌ+V{ ttg\rAc6%0jO֐UI"yֆF lh[ pyv5}h(ua5(f{ޫ}V¬YSwYM;2ɀ?f)]U\۠uNnώ Fp.y[;|A7E#ǬpWob*C0g՝"Ҳ,S4c!Ş3vw׉W 1vƊR.͆,y1jꧬK({Zg 28?;5J=Ba+c.y1xV pZVeo  Yhj%MŽ•ZG%AEQ䧰4ўTa=̒nOeC]EWs-'U;NG$ʧ<#GnHrv} p[Jq"jY80-V.\.6W]v V=E@8dez=%i~^HJ璳HK+< bk^xYtr-dXqfՑ =LzVճ°{a9źPC+TVW !Υ/f)PKo+x义Bڡ[|GFF@dCz$a 5pWuClYYˌ0M&۩T@ KՂ[$z-,"5{N}TEISn)E ^J0W/ )Ғ4dvnUPdϳh@n={G?j]._IgV< t$BըgɤKYc @IoBDK6bVг\f2A V!n ұ- ^`%b1f̀/)ZR[%*+D<'I?hrA*Ovp^[5G Gl&f*xK)?x.VhNZ#ӧ@AH{X\ 0k!dn,z 4Bb =搸<]$̺މܺMV[Rl̘u׋y`YWj}V`:eCk3PY+ZABB=R$&9M#̭Lz-~dXOtO1g5JշZp4Ko~zY`7q5+9Q>$;%>)ohxE>+nYMܫ( zɤ?>PR]oEDR*ӪD9G =` Kg-Ve;\z+ib˰-˵-9w)UݬUDmG2Ϻϲ^!pLRy!Nה&0m+5U2fX]eX WGw>Vr&+[e x֠iaj;QWL 6`?ikڧ5vZIL)#FD U֬[rHM TgNoqJWX|RcNDX)ZUVRa/anխEj-Qi$)tU0 DKb' i:Y>:Pmt&!IgQR^g_<}' Kc-&ibeq }9"ϕgU lMwWKqg'aWc%!ʕZ L9DyXRwu|{BU "=Д%Wv,{8`an5N:ZqYzzYXh6/]0?^Vv+p%Տڴxeil.@Mp @[;]e6vYK%i HjQyw4wLAwmhsYBznLLXM+EФ;}!#Ymg\>=GEK+&VVmGC=3Et]=ܕ )S@DR՝Yti}Tr`>ϜR]cS1vT1yv:O^ knKFO8~ kg,=쏮H`dl~ ӿ^uAӵtRǜ'e͖_9_=q;3􎲪IlJ10j |_‡w7f"+z>?]5nn*&]h4*ࠉϝ .T@?'>EIVRW?O(4[ junyP"R%ꦬaFG_ږ+}oh_N-n$Z?ն壭ZۖxjAPEK~_V:zq'zR][mܚopԒ1k,~U <xY4(0kY6A1:}FY=onLiTo0/U}za 4bi7}\1Y[wMzO,8'mX£N\ f={>GT@u[>IF0Yu UUh 0ew`VY޼0i\{u7ͽiw\3ˎo=NvqS9jCWy}cϻ->lb+RonY7(0kB8` >1k'iZCs2C <ˬ2 jRV0^J罃߻9ҟrSU7jk"B+Jd\FzVnBbWMVv5g/~E+$޳UG͙1/zi{,y;9+??%p)vG>r7ލ>5>i Гf,7CO n)xϿ|꺮$Pox/Z+<抗wo%]cKo͛/:+J6?O'.9k/}=\ûޑ!0v^oguz7bh{nثWYOi;B0S>:Gn orj}Ջh 2vfjq)_vc2ggά)1Ï{O~|Swt 5{La{⠝_w7lqm>y'F>~ė[zeӁ}{OϮ׵v߽{~8 zFn6Qnw|ou\m}[QkݳZ=޺+kSŭ&&Mj,WU *ojSFR5yŁj:%2V4sfZoQIDAT~mSh[Χ O< pdY{=h}^*z`ֻQ£OM> | fޑ yg6hmH|ꝋv9X>wMY>qD*X2fc/u٘~Yf6`Haք=;T.,x`K^귷v_wD''}<1U/ͧB^90OfFkfyf3uά7>Y՗6sϫ^ǃ0yQիgpM膇3z6}Oz‹W߮ewYŵÞ[Sݻ?ٳnH?كdoro9qw7ꁓ_:tfIp:}.9kϹknwŭ!NdϨ+wX.aȺo*-תyc֥K|ilf.6.zm%@v\zU P"EY Z~ @+8 tͫ,gRUO4+ $WT"0 `m uxN߲a߻³ګFDх4JW]'UWL-2l*ԳڧxjRJ5 ؗ5>rn.AՙsMA$dt߿ycR* iV]Uc,P.-Yq%=ykU^sd.5䄕sOL:xv}/A "?'m0 C#7/x˯_:o΃0]x]3q~;l4udҷ>}л}Oh95}oOf+ozwz,luzk?tcUk>暯_}zOv^}^Ozͤ7y_߲-ܸ7G?9ݶj _q}Nd; SJĤ*NEY@y!FQg U[ Z;];~rߕ6-1-ԭBrgFF+ߚ"*+ZvAD5U hM0k´ +;ع-Qv}uEF{ Z5}&`yW"u`)KR,`qTg a100O5ue:umEی]qEGW!1XA`[E bP2>'{}^3v;lʔc[Ɋj(Kv?*@ ,s$ w*h+;zW״f9L;>jz` L;>L$%sNQ@X"k%K7V|O-'KpI?zi* 7>9L|Ճ 8ݮ{?{o;q]R'1k*xIa֎C+%֕j֭_k kJm ?瑯.%MwQUm5U fMoՋgci[Mb¤ۏޯڣ6 }{ꋫw8j@=mȆg pѰ Ga'nz7&~0_G={k9?|8vhYzn^?M7}_-{?p+uu;W/}{nwW'C'9bIϿz̋{+S;GΝ&x9s8O}񲕫ny=)@Gẓ\=Mhxل{Ob%`Vϝ&`ֻ'`GgCu1gxtᕎ6Y}/Rpj Ou^VzևZPuP* PdPE֔L-6jr4sq BcY௻n++G|%z,"Ѳg'f=I{âに`6Î> {f G^6&5pCO:mIA5QQ H)$`[EpK쟴۞MΜD&Uw;}ҵ?Hr_ n?>}#O4L+ŀ-[S]<_?^DwzcnvED՟q :}.Wӝ~a_Y,S̘+S:K-&iHv %6&YGPKg_B"~8 !o_RXvl izqmu}V䄴_W߾C4[mQ;U HwlO[H\i1"y"#M'-o=7QAPSYl6^Lij&X?v>ͽ.g~qSf u%g壟ŷM\BK IVy=a}78u0A_Z݂hGsuTPҐqg\N.m]r[UBi Y ̙? K&3)/Y,˟NLJ5Xʗds-xUh3P`Ĭ9$s8D82MtE-0A̝<]:dqrȞC']:c{?vg;;~K6aovڸGC~1ϟ]^g纬»L*|w6}<ྡd]#6}Ǝys턱WMݶbLv@JEZ> ʴJ*5<"̚nC=uAsG!؃ Waֳ~R1ŬV d94$&#`,{ [ˠJg}ܸ7 \6*DXS߫teО ߫䭈ۓ9(%{yʜYX^! vY>yg  ؄t PBWU9YU6Y®R}$j]T i v 7xvhd=$NTߛH17Af\`Iun< 4Xerk/xOGQWAGO'uJ-`-d"!ʋI=oɖ73^|LyVr_#p3'y@ ^8\b 45HK=8w4}{uu@CSPP1aj~McN/-#Uo>ZJ- d[jg0Luv8kg;A $sZ=F %vK8@UT3ʧdXmNbՕҫ|%M ۫}; D5JT-{Z眿P]C%[2: S"L*Q˂ 3 kY^%M0{K~:Jkv-˅&@Irݤrf?i?!>Ǟ>[L2@ +Yy{'BX`K5dҺ+Z~cF9IDA*O,ZZv6Vs~5hzL`Vo+-RŬ KPhbr58Z#?fmF hӭM˿7n7Z&X)f=)>O7DzgWis93Z H0kb0Ni`}o[Il0)O~6-aT7q|/s?%uV}3:j7n;hfJ[3 ;tkUU=|AY9JjŬ sv-ǬUN_xoqKUUvu)hc6|pE5mE4Y̺[]Q`֜(f (0k0kQ#̸W.үhYaX :n4w$L"!1R0-|%Pin1aZ{ϻ}Rd>hi/Ѯ)kP{·RА w3~ĉf_&U㇏xϫ޾>Tjzй~^5x MPoرX?D90>*}ŏHVSмܧ>smk߮zS'O(Aշs}y߱pW\&b>?~#a'~⳪_^:=yv)/7-6:c3&; yD(B#XttRVP IJ\U'v#Q?z}'Oּ~|ZE޻逤=G'Uo\5xH p!YaseL%C9 !\mRVbgӊ1gL˶O\}TU( 4 —Fn;e߮r*ZU2T(? գ\Jȳb'=EV6 K/V(=#3,fì6'Se4,fAGcĮT杋a|TGNGyoVb֣n` f&Iì?ә`փnyW^VYyC C!ӜpXl_\ f&Ԫx}.0 fjoMُnF0g?ziR̚"DKU_ fR<]Tcm>⮄N8v|;vO1}S O7hgZhU`fh.Nb0f-0keĶv9 K#yV ףו%pEh?S]E]]\}u[f;XtU4"Z+UYܠDU.+X(o$sh[ J֤ 4{2OP$!(͏>uPҢj#1^s|p>o jTT){GBnˤ9%56%$K׾^# gAp흪>b ׄSf~&:eh @ 579m,+$澒`;NUڄ+4 }XZ5ϲ)> 끕v+? Ldg='Rq9nYOUQւbA0_pO?¿N5! KM9dժwnJ`ЧFRd!kDByeyX'J˪¤~/ VT4«b,[ 6?Z27]F•"Ž!LVyE󯿇g~Q>s $WfEvyV͌gbj;ff!q!o>9P4/I#+hU@X&G؉Um|$FYMF-- Vb8jVbQ%V 8X_XYIm @<OFd[(Ay㢢%0G>}Jƫz4~x~cReR;f"z%|w2/b#MW/M5lз86yAG {`%Q=<%)~~̃/zvqOޘe/U}rہ!*P F)ܧqw(Y߽-5DNo/x9]p ^ߝ:Ԏ:*^7jԨ_z_+Y4~[cϟvi@>uŋbV޺h֪q27c ZUníM3Pk άϭЩatU%zu ڬX g7fbO]"f/tXY77R_¬Y kx :_v!e?ytu+^^g`0mjŒw%R>;y6Y/:{1]1VY}&NXaEc~dD%z^/ jUիsӼHY<ƌvVZauo-@fm8D\XǠx4gf-r`6ؾ oH;: %jctUE^p+N Y]׏W,4\Zj$oGSYASQ $G4#%Vbu6(+6ZmC ^6,-By;-̀kZb%an3mXL@\MV/*,W$`= bKs)kN:+TǡlaOV ¨ Z/nEd}l2ߑ֩(| c,\%jKN,O5\t"B2lhbݱ|?NHXޘl5Xՙc56l[3ܶ"S-VQ!lY&N+Fhf}~+|3y~'<_#Y+Րg!q! g|vuQ`ֆƬ/~[5ǝpˮ|UY!sHf-_S&YYZG 1kS}B)Nj=0vVXĉg]E@ QeBxEwuYX[gmYj6~]&4d`kJe SF뀝mf"lV`%J:`oi!9?2Ln$vy!%"QXr _#]2L5& s}k+`ݒ0 M\],-є5PW'n&DDyd}K5 1 si3#Xs؀t*0+[ !#Լh8"^3:K B^GlC0ڷdAjbh0f"`ؓ/~Yأm| 7 @T /"]ѽت6`3WkqU(44qہlCu5ڲZH?}S1hXJ|G7ٿuwYo;MzUIS&YS5WͶY?!f!q!en5[(003uWYvn[ИU t; dIU.qA#ZfK[#;x]JY>84!S(W~2\!V5*ƛ 4)̺~PERA" TܪE$M4+"=82l ĪmTH]PbVhi X!VS:ք2tl+Kd7aGf VK*yNW-7*Ui:S%rt˼UbʳL0[|@IXTuDbqjBdғ*SY1{̿pVS5 TGBPaĉE;WR앪&"ݟ|Y-y~go5L=X;j~,/TVM?JdAYy g?:ic^Z~qN&̹tG&rԁu5 hCF Fq< ^1[9%`biiO⌄%f)*](51^DfL f!m* HM4 !+@P? Jr[Ӓ19:t*g{YS-5^ P(V:mICnNyM-2#W=[ۣf_B(jA7xOBZYV7f-ÔxA3gB''RL.ɤ3Lj,u6ݢ]ɓӏ7v-83=:Zo]f6LhYm@)՟%mBܖVLM_.I%-YUl@Ǭ`e5}zV|0k:7Q`3_lI@5iR%`yZˎ,t/>~0?9I9׹?S*Ƭlƞfe+4f-,p&C5J[]dj%56&kU(ѷi2m@v5^5j]\p2"YZ r+>W%V<(Vq gIa֬Uu)ֲf|^CZIoU#e5a.B`;]'9eD'ca#K;iKw~Q4P EPMb Rɀ+ܘi xaŌMP HԎO~U쑋#oV3iz |?h }Ҋ_wa]ڙ~^HYu X},q35?T p=3`:~e?9TqnjnNJI;UBKyV TB0tnI.u 2C$, I>5i40gqA2E)jp^9YY.W6 @bJi ȱ@cu)U֒Qu;[{U4'X9`vGv\5zգ_~msĬUUpRn|g8nzҼ%f="zU? 1w;O>} 1xG>n kŘu=ǬW6(f=_HUVd~ЬNZ1[d M&趚n]ʨb0ƬK20k5&(\,xk,6C aem5}GaU©b]+eUHZC:ЊU^^Ն K ,iVmo2r$u90W2 U_Qf#quMVPβkXr@ss>uo{ˇN9&!JxeB=ι=/rc;}.+8&[DҢ 'Ls⑏|`PţTkv?Ogg']g*OS]B=(X^mUV\pZԪ/ar1"X 'Ԅ>4coX>%;k?-d:J5JT\l{zy$\5kJT(UXY£Jܾѧ! Ͷrg "o_l:e ~I0QP,]8OD_X<`a@F$p{) Jӧ\/;+-'?C}裏??SRXd}\uǬo3#A1k:yR [GTu^=7ڼ@>Y맠搸yBϊ*#'AUb 7Or\y;qeGwKG,l-8ז\}=O6|OVTflɧ*ʤAVg"FpQxKʰ.y^<7%<Κ[U0Y!U̺;ӧǏ9q9c޳d}<~.y˪o(5:kK}`ъ\p :^Kʭ'hU~Ѽ](cՊo!/t%oٸq]삞U [h4ĪvTji8Ta*Th\V5N.@z|"gDB+m3#}J\Rz VnzO 2,*XEIVX\ɳnmϞ-B&򬐬!JD iWa0#MK ֋fZTZOUQcѪX>8Jsxfmxݲg5B5Ĭ˞聆F82 -h+/O*0]YgWgϦuo~z}8RBT=~Yzv+M#aU9Vk!1ktXyW̺=k>pl>6X1:MHZƘeok=+^yњ 4UU W }@G󯿇gIj&N<+ֶ݋Hv[Sl2%p`S!PTBRb[A/g&m۠!E-ק,][QJk!x!ldbVW?eLҨ5X4OYSbmgOiNV뺢JtM Z֔ghب5_XNXӫ늭܉MYb$%j}u@*u*Т>'fgF:yQ~3e*"GVIWj1R.W=L[S7-ZtSmp[iF`y*ѭ[.tiE ݺ*z 6ngZo( m1P µ&ש@8lMf\`VjB5mSZC̚C>CTsC˟ TG2~yD\pýOsZ28@+iж۷O~&L% ڗhmZ#Tpxjפ0/, **=P*%m *SUB++1oAVhj_.[kVh<)ME5bէ)uQ W*=PUtT'* V&[,f6'_UG'*hE%ʵŠ]+jV0dUpbߤIq=z"[oϭqUP&ҟ4"Np=Rٗ2MAK{i `u$t+ٰq %>p/.lC/lrnT}rTx9$s8D]3mf=m;1MYA Y[}j=}6it8J;ܦ.5H0ku3r@|ˁIGu"JQɄFC,T(U"yX_QE脅ѣw#SP+_ͯB\a>b8*Nijràǔ$B/T4Jݬ,~WgY=+[IABv6TSueL>RDO\f_ݧLdRR@J+&2PF.xXl+zSij7BAjʳ'hϝ?m3_j02E!B*YUB* B+X3ED*]=Q}:?3蕲M"htZh~l~#JhsȧzpEIC++ܷDXuDVߴ@*9B,k VmA7JBz՛%j1ͯAٝ r;Jnہlt f] .0k]eCl>3G2LӗT<} UOzsEUlK=lo-Eo@tE3Vf/Zx kjݷaR b Y`EɁ]YKE%+zk?ɑD_. q£DP][Fڑ$#Lٞ; n.œ>9¦O?`<zsj6j,<";ar8S y8-qęp)u\`:Nz<>m&& X/={&g}-,IFģKE_x$ @ȕ-Ҭ!WI֑=;> ?Y9g +)z8\pS @qNj u@hq+*M]3;P~.r ȕ[} ~GPKȅ5*CTs0+O۬o6f&3= Y׼f.]k 8t%ifϷ%5ܱ fMk Zy-xӒ3FK%LK.%;EH%٣+"2ru& R QI2Hgn̥-ƌف SLަS.9كt>ُlL#}É÷dn0~Wr"(I߲{A{,υgpYckֳ.sdX[9?:*Ceo+*1EBy՚wDV6c@#I{ 0kw./&RňB^6bRZyB#/jr;/q xֆ{{ 4?̚s:~dFY@uVi ĬX:0ߍ# ZW [kFBN%qEAg%;zk VUƔM+#4^K'Arp$\:_M*/\|2`ZV6@_3ɡeWᶝmwy9c2g#tBB잃pulc-#^xv.}F\᭕d.i˧,ɢP7 3)°e]v9Z٫i}'VJ;rV$Ӗug+ T;`|"l[ 84aҧ+M-1z7~*&@C}%ikm$ Vt1*笱ͫ!0WGv;fmJUL|߈~#<4t/]D;Uj!zС_l%.\|t5>&6 8Z#C a!>6r.ľF|޵>`Stҥ;o7S?RD]Z$ HM"+m9nseM3RkE5QoTvVE*i*=Vd u(>J&!%c2^eV5+,/T'{~VMre`Ea,ĭru,,cɰFUVzaVh-^+ Xc$?+ 7\u`'qHֺ(SS֭[g>-bnpXz)LPbVZ}j V^U]e +W𮦏ev5jv=W㯧-!xu tw]WlJ6jJ9cWiuˮ#1Om-;~1zz5^f320_y0 USϢOjv}/Z'a:WM$nb;O^Wbu߽Bg[[{e<+m2!A(%{W]hС&ʨYC94g1ճ\1J܉`5eшҜY#%D[(%)SU~t5%]D~2z&rh(eX*+#3Q#S\xJɥʳB={VoJxD!xx+1ҜE#PFoVTX%]Afg_\+V *2+* 8 ˉ{숑#__5my% ߒyXe J*cE[hL j2VٌGA*Y+Gþ~S*y|JĪ7o0M X\k-yG#tY˗k Fɶep%h|knxU~ rm* V1j%H}J͇Y9FP1mcc d"MN#ӏ%Lя>UJT(5F⮀S(i1H +@9 &M:|:Fx88/Nţ5`ԅ?#jxEDѠˑڮ_PRW@Ǭ?)`^f͡?CTsYW=~5^Y7ko)0k}aU_}W/0kك~ڀ3P@SYVAƬKA]<`fYzX9A#eHF< EW]tACP-% $dt{]f˝vӲЦnAD>Z,"+&9'GH$ڀ4_JyC+HED}Q=imAr{AAJIXFڼs؂ vĊ@[,&Y* )sPx yW֯Pi`'35Ac¯/OhVNDf*gk jms .WJg>pAJ?kȪ_y֦V1)2?TQy1ܹ`&vh$wTB+o̓sIM{,@i)?l6Di~-6y&q2W) 9;W{ ֟PCb%%[-Qz?y,W:V@X ^E!?pX?+_nPP}(< |Dp†JHmA/&vXLXU+j56ښHZ5zBzcSrVp̚$Z.8h1@Ƭ\.j9gL./̺W~cf=7hDYL]~"ڀQBg OZy[Ek HSVK>o~z]Ոl+ =+>Uz$G>)\ZMZ;B/)U;UBOI -hD6*ZkZo 0}[n-L&MҬeede > R2*M"K*|>3y~:fE!ic`< F̹IDGͦ9 qID?~=ܢ%NGM°Z:&eLQy\ GhY$s"ەsuF:136ØϬռXX Eʳ=BU|%巕qf#.=߿ 3)',"+9 <+uɛ̖ ʚmEU;)ե[1R C)dٕPKdo]`I@!ou ڜ%Cy |~N>Ʒ*1aԉ'XL\ﺿD)Vq-ZU3 Ͻ=V3xaݰRrzG{ܨ6/x֜@qyrUI.0k}b:ћf .o³0 CcAf <ч ۖl*ßAO Y|~{z d{m A(X#XkOP$UY]t]gz$ʡ#`,kyB̹']zkHVV02,N%EGJ5A^2%`묹}/a$5, XO6՜;pz4+#cy(S J=7wĩ7Q+y߅wmv7| xtm*8gϚ]Iz[oSf+As+S/JgVlӟDt 2G`tv D[ި6o*QMZ1 ӛF𳢕jȳ6YTsYG Zwz>f#f1jY/j T@3g!f!q! ̚m֚\$L6iRI[w?i#$\m+ ,ҮuYŗ-~>l6xA1oJս@eҊT LVF]tdI;ʒ72"a@3ix8!.3dS)H2mZ12RՓ/geٶцGi:o)S$/(qjX`QjQtt6[՘26lPЊ>W*T <.<رIuxpfb 泺7XBVTevvBä-SO.;&ּ%Է+ٚ~+c}:.xD$ԷtEj*.u`Q_uϺ=pf5D+c零#j<6h<3P`Ĭu7<7\u[^jV-0k1끇v-0k]0WL~`~õY æT<f-0k9XzV|,2ruJX®RNGAKtG ngItR۬knAI7 ;M fsZC&ʘZ_*Iq^@493 Ԩ͒MD=)* %[jw}%u.%,ّ#؏VSኯǒ+~]eZB2҄>x(cJ*jRpzܩ =3'stCS0ݦm\ɩ5OHW1Xg_zͫ(S`?_->|kR<]@1Nu̘Xwbw*$qjf䶉lCnaSEAwVhOa&[m5MUm; kda|`EqUt 0^܉ㅞza1_?v>1kQ3& Nd#,17)1b'vR(r Xz£ڝwV=?, ,.F1 dQ٢ a"3`s*ƍۍ*ўJtJ$--"+*UQNy Yx<ҫ~)M\ zJ8pf+UV1`}iOa0]+Y"z(sӈ* `l 0#WYZO^y!$kܓ:uՃ=УΧaFt[VQ3Nc[n`VW[@hKb~S}f!цqA ̚(T@3^}gN>}g:cc=].eYMzN熍~iff|f n˜o-,0k |3P 1?뮻O>؜}Yģ59!CS'"́Ƨ3!k%(òJX%~5`(]e$&WnkM낪u͉^6 ]7ؠ?!Nf)~2}U&W>-krHKDHjۨ@2la9 G%`T2 R "6lXA+%CcY4VbNn~{vb5gAr'iT*frNҳ;]mgu`R-Ugy%"aOvt+G7K,BKIUq\$.+'P?XΧ~ѥK;S9YA fOXȞJh#2^X% >,%6#`UNةZG޽@X_qkqԼRc]LgjR/.Sm+`u-N8BIRM¿JIʤ&L)RiBh]ѼO6NiN>h%IDOVch. MmM{,+.ʰ2eL@9eg+EK_;̩0uM-Ȯt,-Q-N"B!k`f磉@{%+K{lIU0+Ͻ6X^ m7U\ĹWa yVw}-[Ѡ{|yӥG HX3 f% ~,ɧWIUUs_W͝{_WbsvR`z6NmW-ɖ*4e<-OޯZieRo>ba>UڥKUgNӀz`7ܰU$@]9p]!jSBufx@id*+iIz -V(0YʁUTP+Vf1(Gt!#\;[ ੧):'bPr-#J.ڞ,d(n+y,AY?' "j産ԽvB lV[zpD,do1|DK:V !c : ę7ZaY}Yx*r y,¬g]H@S1~,f}E/¬'p7|IY+ǬejHЗw}Wď\Xr8DϘ<7lT=[~ܪ>f ݠ[`aS.]߼e[Q`3@NCs:(< `t$b{/K?UG³~MW_9<6g'ff,jģ59VIdT @xfBHkB:`?WDDzT+WYGhjP*:}: ^ N7?}ysS:CAXFB^Nx!9*UL aXr@2̧.,Ir$VJV8^D_Vj+8(fmq @{a+},$~0սX%H s ,e:f N :z]Q*1ASՠ}WΧ_1ί(I~ YA1+ծRLszSbP E6S' 4d@uTf8 JGN@cqV"hamh5ENV4$ T;3BhՔ2QoCwjn˒R1S:(8)ET*.u3;0il.n- \oJ,}޹qb+sn7m+׶VEQoU<'h_l}!2]nt~֎rbӲz/KzևUIWZ ,Y .;]465>uu]b#ο,f]p߅Y9>؜C8.59~dR f (⇀Ib= N̜¶6IAgDP^YTt>{]u٣E=M@°$\Ĵ6@@%e>>2%%&|RzHM@[wW|PA+We^%AA&UpR6%ղ=>ޱ4QG5 ד%M/) +n'd(9y|yhh%mjKc[lʼI۰U5=e^!I)q!9!~SVɇ7Wo ~ 9ȰʃIk~- xVsxsT֭nh/s UߊƩ fo^.lY ZU +e2Zym+1+8%ϾvK,XpcYьգ>[9;)akY;[%M)f>!?Xy.UV̺ޘN/F?u9Ϫ̽P`UrK*ԑ몑ѷ1k#g[+71뫯 iʿ'|rWW]UfDVlN m@Yk 1DO:Z5ĆnJhbEȑYO:jOuW)}jߵVEJH 0jէpThP*&+amR"^p% b%% ^WPrxe`XqRh+$daVU-n! f@P՝Rױ,l&Oxz o!<.MJVRy+02P\:]Z2 ì8SU){1M w¼eAAV^3Mvv_vXm.} - jdq&5Xpݨ,<#@RwHpD[DVgMg*~iUA&+t*^ݰVڀx9O̊0#H/:|@SH EP0 0; Xq}+2[YT<"hC|P H-Z Sz)WEeXDZ|{BYduũM), j,feXjbBX6,Cr<+a`vNB!~ėk.ĝ ]]{&Zmo/_5oۤ V%*W ډ~7Km#V8Aok*T\n̆Yݜ쿱ų.g_[DXd&ȳFIV#dvO/C=TCzᇾnbZSr1ynؘ1+->qYkY'=?٣KǬwj ?uԃ?k#!5RH`,j`F. f}g"ϿW-rb<롇 /BZ`ZUA7 yÏXTdI>%d[CyǯVp~wQɳkJAI]|\8^Akķ˃-{DYi<:I+U)"IXeкШY%ebY ftQ%ZYj/eX20 ʖq U'}Q*,n_2`fYmD-u'̌CXMo kM-IMJ VtĎYegoiÐ~wK8bqy`\^a8Zx +P/'k)ަn G2D>ˊ2wyK(A0ċ .rYfU8އlUwWpڦE"UeR@$O {WƳrX{!.a>;UDfKXu6BhEw&Y!,GR'׌@j'mh LsrɄit0F 7jm"¼a}8O>'Ά.pY'ZܵJ25tA6ߠ: ˢj@~SXU2Ĉ;x =ܣ Kڷu>Aձ]Fo5ylB:p$ ]jЮ~Ö5[؄Yk@pXlbؚU|! Ya?>W<_q!Xpī)SLJ-s&W[ -l fſ~~]w-0+qu-nfU͜ŬOۦZwܹKR4?5R%h1k.]S`b9AfwRtD |gYR1d5"m~Y:WyVQZ^ [l.aPE"B.vk|wݣTze+X4$ޢ+IZх*=Ո*[E%Pvf(ranPAh$*U)U+VRJ2l$ n9>7aRq@5K) ZGiXGeGElh rtPNHIzt©`b᪝UyLqՅMV~[OR{fcv[}QITne/h}A2,bw3Z s`M$ܰqg޸c_ Vn8P [suZKCYkY @UwXz =MyϞ .\6Y+!RU6SVU&ǰ`T dL8XhClh/}3ol̘Y.Fڄ򬵆rg0k~v#'oW`oc ̚ŬfoZ2d-0k hИ^CrߧϾ>;'f!q!(sU7Ne%%P/+P`/E؜WP f]zI cvm֮g]vc J,M[!\e/aRNaNXej- /(.PeRDʘY7Bzܗd`Ad /t `X%J9\V9[vrIgE_5k< I)lh*󝵪첼5UF`:~;1f{I4^%YC%PET\^g^v 8㒛/QOb !/A{.6\,d e+x] b` ZQҦTϘ<7?zG>pf|PUOUsԁYd5j+W$SMrh eu>~KѣO~曏F)b0ȊԇDU@fZQf)Klfj%;yܰ&f ,Lgl~> L=v(YfmPY虲Й ZGU; ߝΠڛV2"HVRѫ(,M<\^jӲJSqpշdg+1ळ&sopEly\̉s7qbf/N^fR/X۝堶.ܶmuWF[ۺf)Y?ݣb։ONpPY3]\/dsf=.aB 9$s8DnID'H_f]!cمnX'}VeX-@^AJ-6[]Z ܬJO${r_Jd[lq G6aUSA& wzV/˘ȕ.|vL=:I(/K&Q/̧2Z8%*%(R-T4;qeQdA!+`'^v0`wRwUݩݴ+SO{m)k_++3u֑1Bԥin5dİ\߀˲n7gArLv 4zݡ57ZWoTbeСLxVNzUcqQ@'[eq\ӜYs4o@ ήKF.| ߀ʀen1kOh'R`V1+fuubb#O=k .mΝ 䃽XΕ[Y 1+StºoPO$x3&C(u_vJULQe|̭쀥}Ϻ-(1$ιvѶW(YM5xmOu^|Xiy]5Zb ڀĬ9$s8D}<ň$ ?9 dk$JhHP3@,BXrM7^ 6 evkthV][WNbmv'ˑtZv`#ߚwfe+xIV ih0#>*(? {h5`Bp׏jy W^ + rx0Ĭ~8T?{M>(YN#jO8Θ@*S$3慌  \ ٯ.9 Zfaֹ6Lxxmϩ'qz+ U䋸gY~{ h@XEy ".aahٚ\-3?{-~U -ɪ³f߾/QKp^|{ ܻWi.{,V/f'fmiUL6m ܾgLQ`V in#WX:V;~gY30gJƽ$ b&` T:f-0k -dDn. BJԒ,{+o-XWeUJȨλN*A'^L=um݁U%V9/Flrc.m-Z}кf} M/*-3K8Kܕ,+YH53ax5.V4gAvW-Bj6z*H[ < IJWNyEn!KK/V7g_)R\VR'ʥe[ɊU'\sLXeH@CV-6u'{qU0`ŬZKYSкd"gxDf3P`Ĭ9$s8D\ij&E˶ǵof\1}W@zEWEmn,0krĬYZ;غLԧv>BP9RUE; '" ZiFA82 PKENv9b;9lO=sQg` ti0Իz]#;v30`XUhKUSVkI;TQ^֕ܢ%TIDiΨj lP4 (y[(0UWzlgtʔ~ sO KVp*BiJX:x<"<%Y!Euf,PKtވ( S[V& bnqC $\QֺB4 nM#Aҷj DkF i_kSJ֓ϻ3ڇT~j2nxaZ o\hn5GdZh=PY} Ma|@qb MLUVY(1kE9b^$ $H,Zlot_GQS9mV`A X&B.ElE ̒dѦ+ RM3,k6ݧH>Z VC(QGw e@@4ʺ2ZP%Hs ! (yJUB(-(R0-÷l'%(H˝Hs26wQiY2?բ[KLp!-car_/qCVl5̲nGuU>vӼlf}UE6"ZC- /EZ28XoEJ4UJA!1uSjkꥎB&:z(s̶ b5,/l4>XeY f^Y @'˱)H@j6ip xʒhRr?5٪{AhI\/AĴ[p~ 4dq.8 k͖2 I xxVg7.A-JOY) \e̵EI%V O=Z($dEl`5ZF;>^d)[þ,6K!6: !Zᕕ:g尕uNJ<8:9!atߘ`C'dSp^x]m%r2ϛ:zmP iךWݺW%W\WZ~qg\N8s4[DS+i y[wq?CB\0kjj0h/6/fY@Y Ĵs+fM4[V[q0G61plKՎKɺܵO~9,eol&s:h[^{?|؎0?~soʔ)ܬI֬owQ9$s8D]ɖU UVF|%PIe-Z] /EhY%)% +"* Wɷ*+$q#ajZS$@ߣ^7jU-Ne4?.eHDYle)*M|QEHBI6 h!IKo~ nYl?'>Kdr~ɫ+3~{xnfc Cl.o>-Ap0K7jda= kO5g/$터$<z΂,{+Vf>ݧÈaGDzj+ZN#{>W{~$lT(%P~^&#xV*nV⮪}BJ 1D@")Uj,okfXtShX$77T43PRN@W7a7U݈5,WUh՜h SVWonwI~<¯%kݝ‚JB!Cr^S+ÎoV,HY2`+{#}B fee[YoWKhU?gWqF } >1kLzPzY[Mknq3nu; qڎg `-0kmV4NZnGEeӛۼ@Z`& օXBj,%A#.YZ -KPbY] X V\P&v°*Tt#,-HbƹF[}#Ld^YhgMT32>uB ,BַqʿR',ebsExd13Q56ya]v{a/iW(i\U_qʲFJUW c%< {h*j=:{o#au*%j2 DB-jD>%ZyR ͭpaS"VCV(3(Ym䢊1)Z_qo~CԖy0\0+u zQl8̤j޲4u:=:`3.k}Ohm^x!Ubqܻ;qKy.Oܚo^!55k~Me&15dSi| ~R͚F,F*V@B*+s x@akBLG8+hJ%r˭ sn$w]x U 2JXy 5Pf=7EDҢʷ@=eF/SP6)O\]2 Asx*NC2 Ob ~sSbM1k'iZ⑹bVY5<1<0&Y5{wyL;U@Y`֜1R%n(f-Эj>:Gi3P ߉YTVfbφ֗|eOбъtͽFVn`dT\50EeaL2UC"TI2Ыt3r[CHmĸh;鴮n!|T!J  e 2`um S$ĥc#<L U5]1,' h8/̺ƣ?bIֺ-;q`ю+qRQ}(r`nVO 9:K^ϸbg[kLx NHqF_Ж!tsU ;B=|`y=dl62j@bUq$ 'FˆX,C$㗡%V٬E "ё8 O?]ZKz^%U֞c:f~Ƀ?1s9sPu9b w7 o9*E5<7XS}Ψ3 Z5}Vp,5f}ε '[M&ڦ2;>r[ܦ*+5o^ ^7}q7HuF 1"Yyˉ^6"FE-g"̴͢KvUF=Ég\.'6mQcqdML7d?Y~ kʷae m^W~n%VC}#~6pI}P0ׯߠ'"mٕTnjC92`' pCEc2JMQ5t*+Ysu k^Ar Yi>|f8lgtx׉+jj L*ӝ[^Hz *x_'baދ3C?e_{sL!2V0*xV`(K2 [ƤpB(bhj ,"vi:1p0=Z[oBa 6m߾Y3V^e}b̘v0"VS ' }5:M6 z̏gg˃ӎvySV>ŷ i*Ja[,rۤY #( [ (y}W0q`qaxJ@ 7..(+ʺxx5D ]4Q0w?qfE1V^%- bE3+j5W`Ĭ9$s8Di 5<4b|kBQۺ;#Fc}:-zڀ`%YRɗ bgRf-XaF9f@ۏڵ{c ui63< bUt8{Jj*-u&ݯkܫwȕ*@+ @-p-"Z$4Aswp-o\CX'm@@Z欼\;wRby=33T~Y: (7% /zS>6 Gv?f@5̺?|q nqNZ߶KBY+2fm*8ٕTNfmڀ24:g04 *Hn &)K#Eѕ4a4j>՚m[59]:ZB}VW?C0B zgS`Iz#E{)2$ܞvm!~s߬1+ RjG*ڬDfpyQȕnRӆݜ0OA(bjzcܪL)SuCBBc EA3`. "]t=_Ǐߓb쇐>*ׯmjS\3cZYb5kn̽ I}O!hjErE)/!/Ϫ(ǞDüzI+Bk xi\VQ> '{-&j XV@1m Z5}ș7iE#Hfx#9Rd}Of[gPU5+WY0V!M@ [(?"a-^GOF>P*б+b[ۀe݀Wm1g4eОt<`Dȉ>5I(ӭL%,a>ͫ{% :M+A=FSb=7n7b%pfUf\v׮oWծ^} P ' n\j˿lwMΪs.zE k>@)f"TU\v+෍SM**UF(Y ( Z@^$Y3qzq, !V7r, TeHB1h*v3¬ϟЯ/bOu;|] ~{I}bFj\VY#G2-Vkavȡg7n9bnzvinVmzM^bj5f2)W#HX/+]s52&$Ao/Oj  !9JCeW_A*cΚBVvV]rNzsаܷ6ǂ2c{+ _KXuGg*o)+ SPgJ 'qr`.]fh뎝~Fz]/'OeUi`K*a j*fПWɤQ߽<̋n$h=J0$[X8ZUu^DВO[u GHH}:_FoZU+3L{V@*V[ ^2Dň,]XP"Q3k),R`KaE)l!hE0G³-#f-Պ,$@Ǯk784NV8XbwϺ~QPSк%5搸=`rު+$z ^gFN\0j/fOwTΘĞ+?J˿lm ۄȤfgm|fF;JsĬF%5bQ55ĬMN>+;\`ಽp OTd߲aV6e$2 A" T*[ Wk_PꈩNKw!90[Fj-xQ#znѠPh̪rҋp+lprf $*[殶-Z 5ĦzKYD +PP튒URlQ4m5Q7Q};pSijEX@Jz)FV͒,%0QYjUY]sZ^VmOka݄0SRT9oϖDZm0^~S~\<[lAמkS4*t,+EjCjYM1"Z;o]RnU 00TClv-ף jF?+t>$a)& ,L۲ (׌S`A!Xa#4[zRdW Dђ}@d]۵:uZI5g}pOeT/u떔( 4A~AAA]*l>RT_> |wظg5 \]kWM7݂`'V_ YQ RUv[5[}ժ۶ݏ/חKf-K]o,q&^$୚"yxj/ $߸R& E~J$JMDU Kn!(7@ːTX>iIgxyIJ'*O`"'fmBO 5b3 `͊W mkEWts6fMIvmZܺC[eGW^wF}! 0Иun5 YmcS:ymZ^Ǖ%DuV]`6s1bX 4#̚TZUT5XB'XQhmMQ|*+&uE6Yf9JJ_J4U @VfK*~J.$KD _@ $`,aB0Xh΢D|mp2DuyruVn}x/2iW]{ .0_?l(f4ʷr$ea>IK7 OU =msߢ4 UF="[Y+RW Ye޺fmck۩cNIʡ U\Xe%MZ4DI+֫–c2ȈG*_7V~"QC s_P˶XrK \l|eqԩVk Y_ _ka˰Dsp͉/"!(s㣲EN/x3P@ KK[^{?|O ?~RI/g߀U1EUfM1k$i۾mZeVyuN㻟{5_5M78u='UY7U׾j6f1ƛCsY`.)A1 4ڌxe:UE9F$MB U*(g=̵'r..MLb ߺ8IIkso~Fc9P+JIqW^ m"K$d (z%ri5Cؕ`iݶm`^[~ܲÃ:z-ѳD/%(%$_$V=N:<Չhz6/id{b:zP /M4JUbD>jꮈ[{ŀ7K[ϧ^>hlH7ok6]+G#FS1O6rPR _'˼ZDMkY+a56y ƫ>#}dFFҕ#7vbrS, 8Y[JP^ϽŒ0!@{U+p' !,֏f4s q. U  4D R5QN̸xo۶Е١mZ~ Ow|k[ߵG7) G_Veѕsٛgz5Vd.w%:V|VYaѪ@qG[uW*o?ڬkգqC71PTj'$*UMk^K棨4:_Y~>Q`R+^o_2^ S֯ Ej*`#4s :^x)Zu+4qwdn{;"l7·Yʺ Xw\*WPZD1 4X*%8[` 9 IY?fmVxWtlO۶zU[ٺ;_Z 5b-dž{wa_k}n1&`F7@5~NǏVn_-;q6k{J;R/f-bXfì9$s8DamfDQ[ԖQA&Ԝ8rHJqC LlJHJʺ'c #YIKg@ B hfqd+]IPOsԠo<WRn.G ct*&ʷ]5WdN񧫶cn꟭~ޮ;z]c:<Щk|ѶZ[ޮݿtl٪-ZUj[cǎϯk9]};٬ݦgDI蛲$)ʪ2N /1'$*85zυOݹ;ݔR(4B.E|;Oah^3tg5OݞgA/+{rb@pcO {CXU8S%!;WPSɺYZB+mf-b' h|Xfì/_Ɉ*xIY9f牀MM$ >l@ױ}Nᡛ>nn_ ]ձ[]6h>um6h6V~|Eqտ Z3P@ y+4eTȞ]#=^%Il Ix$S% &$=|ybt @HpGoFYsvpoREC˫Ayp"ܲ yn4Zwǜ*b-{cY:ܭmKkT1R4Zb-mGWJD'ZyϻlsGe0~ѯr04*(Ϫ<Y/Nӭd!e;f*3-"Y7CdZ1WR6Y}؉ *U9E~{'n|YV2̰+%+wj29Q}zp#vm2{{U;zɳ/7Г۴g 4v5}s%EEbTZ߆!kL$`\f0S V"K]Z)6J D 2JV< 6麹\U8"0R"7ajT#XB.hsɉI( .X/qJ@Xg<ǜs˼L'U<ѮӋ*?^sKtygG[ۿ-pPϜ(~$ B(fΝ T:QQ{x%6']stB|fitVv@~ ^$|׎к(#B[F#/Z+0Z*A_0 |z{5r 3'=f fљwDc =V('fmbH 3P`-f&ܚx]Uo|Ttsf-s{i~ڀ|3 4]YdDy z_E~Li*9lYH6c'_.JaF,Y4R->2,*yE'4 Tl+)o[k)HaY͝sPe Rlk"ڻ Lnt`Eu"$J>RSV冻YuM^ӳmkx|}bWtzf5۶~NuOER>;bpҙ0ΧH=Y/M|ڜ쮗_pcouNj/^ L={ 6p+0~\2V]>Y4$,r؛3AN3XO smͦ"T. LV\ e^W\%by 8y9#pܮlE^ì9$s8D82M ڜ0)^=KlyoFvֵv+0kY鯸Ldzȣ8b*Vj6mK&YUl|j\% *jtd,!KHPP!l2.)6zG˪  +%89dܹBO`+x$*~ʱIڱsʧ4a0ҮD(Pɬ*tyjEERw v /Ww?K*karYWak~{{7$GϹP Jg/ )'+Y[]XM""'aPvjOЖ@`V -/.%U˰R)_cxw Z=Y Kݛgqdͭr"e Oc29xIAV^[гV.*f`揘 +.kaBiYM"dr q6=M :1qor'WAf:GFu|"o:?Q%p,G(n4bo8wby>V_rt5 y}?{7$/?/wz D{ad+ҙw>H/RxT4 Ov؉8~'؏* !~wbP[rver/=UȨ*ߚ_[L__Vq!ל98vQ>8B1=cS`x8&yì^TJƉ{a͑}#";ﺫ :uEʼn7hPMEYkYsHp .ynR`;E*ٝ6or; YpX7 c|'X&(VT*@1,QTYYt̀YCTa)lbk_ %` %$;!ϠOw"$l\Ud*B3,j'At̘ݭ"#InˤiJ d ͪw;Yx➟ ]n0Ks(FBf -=,HR>R4 hcwAXKѻԺ(> TӜ@3cf3IO"$If~R{Viw`Jbp,, /pfUʢ<.W_Dx E7B,ǝDV˱ចujlmϫy\ +4fOsuUlM Z`?E Vm1J~S|dS6!`g>;Q)eH )j8+{".$ jY !.$%'gQP'oe`,s+՜AA kzpl;^*9_ FuK"r%8/)=w(N._g繣:˓t|KH.:[O%w]#L >;X[[Le\i}KM»#,Z.]CTp brwr8DY ̚'ű/@@>Yu֬.y=*86 bpYE6ՌH)RJ4 60i5Ad*_eC%pUu"=Ti+lɎ~]ѪJNNJ=@7SReBMKYXIvb c<%,Q|JjT,R9Q7u!o:SD~&ʅ 5 XN=)j"Jl6#ZEGg'Wݛ m\G~wNhrڝmV)y `5aХfp[!He,Ž]j87TJ%k*0kY5:V$PTԓ%b֎~OZ-ƒ3#itrjO5o<JYEJZ\?G>L& Spl%tJ+9P`r֙$cs})=NG2WΣvp̞]fZg"gP%A(m0T(p!!p4' t~N^w!UY|*׌RpT{Q^`[BD8u91R7+lU몬*2]GF+U lrrV6vF[v5}&{_wtm RC4(RC!C(!CCLAC$$$dTWD}{%w>g:|gskns u|ξKp-J/luzyxrp䌴X(poM$jT  $U7tpdۮ< ި:O(wR"vJ=y$N}c t-!  OiN~(ewbθ-IOKJn.dF "D.6oW hXAqIy[O0:`tۘ0H31!S}R LA\GzHIx#pSv>w?K~l}d>%2p2'Jk̋ynkfkC8k❓vj \^5κO0P^=s#wک.;teW|Գq<}sA}N80Voa<y}9A(c ~?-n}`}@;0 / Y4۲p84avݵ;u;Y!Zɕ@:B [NU50#9jE6C$wtêlœ뤶mP*EPION-P9N T(!&UO^G\ap/: +5ʖX-'Q WO;:׎43692nzƑ_eA^a y49{0IV?q?vÄ@|m@R4ڵ0F a 2]uغҀxB.{ȑ'[ %Eaਜ਼l U%K7O^n^zWJ=Py}yGZ,zN+`p ]0Wwk\ vۖ8,_[apڗz,rz # YsmH5g pSK\;gggH,gu: 7|B@qtxYzm⨌Rsx)WxoaU(fJ ը5T(q:FC yXD ,e9@+E;TE7N QãK+*,[1֤s wv&l ycDʮޮ07IȮ\9}"dbZ)Wq;/Jʖ(@Lve8ʏ8F'GYYy8OIa z),jo R4B-(x :pat& c?qʼ0^wHb9 VSp%LZ[k0T07?:T0Ni7*!ofwݺ^pߚU2 }w_炃yʲtuVw6+?k;-9:wŒ̋snCsV K:237i9ntm "+Ηq#\ &Z歴hWXe׈τHn.ߩO<C2NQ+Liė +Z03.XM&fyV$dБn`;o#XMH'_URXs|줒<LIaQ]ǟ,I AmIRIa`A\7T5ף +w9Damkwa԰-܉ĝegzҭhБW=RrN 2 ?`ї䕷/s/W_ga"`Wf0 1rKo {cc{r\bݍ^'_7nF>(Y3='B@x44guirթ4vj \^UXU}Dۻ5K 0ŗ5Yv"Oj&ӓ\mn.}I/0v[m~$!17UO¸koKy]jT[` ؘ9j+ZmK=Qxc(DQ d+4Y >VrON!p)eWZ1:P@mq 8+#R اJ:> 3!PTpO]Ra5%.{FwAe?h CD6`3Z.`0j0j%pWn LV7NL2L PO)"* +Xf0nٵpc==A Z;|iZE&DCz};.|[aXX+\o`1]grNT V6Y(Q"@q GUc8k:bֵjY?YYZLg%Fn[6tV*Yq AS5gJǪMc|(>ʦBQU2w=7XQA FAVd)ǘ1:Ĩ2$R o0z2=<H~DAoY'aˠ( 2H2ÒQVHץ.0~AzK`λx1C)!/OT[!.b$IꚖbXOrP$^, )2jOy/JH(JZ]Y,+C=rRE-7 };QfpZe2WLՖYebG%Rw }W)V*OE)TL& J!o%n @o.^奲FWXXj㟦Ruq܄[J5gaUXqt5K~0;"+. V3-!gnVpi+`aО#<{._c۰hn.bY6*#a7Cvl$1)X';!g%dZDzȖƏI|%>X#vmD+2,9>]F]qqFÚyt l;=o| zO^|o.$LVxai#o-ysOd v$v3fe|v ?emJg)20 :ሳh-/d\b֯znjZ|@o?r ya& H疼 Vr֦yۖ'GO H>q1{d쒛&G'GzQ;]ԫ&o9EgmY :r~Sض6o!ΚVSV(%[ 4/묬v㬞d;8W0aeeyܤ̟tKonn`Cз,P :k}w7،G;PIz3A:ź? ظ3H0FntEQr9nھeq:"}=)h0S1_tyooȇ<_mY9#dL(GǑ풛O]Z{^}kQ`Y#69yv#F|WO^ڽ[Jp.DxmMUl]bǹ|sOAL垮t3&+ʼW0_?;bGu~ĉG8~N6S8k77]ĩg].7\4 GzG539r z|yϿ䱗5_U;gfG<{Sg;㤛y>0ħ_#rꃏ |hN[ooҤniכo[v8 /ԉvEhjɪ,=*BLus]vq^T7ֶ3/:33謹NJ >+=;!5-9qt՟sL녳vvF#|ke'`(ɗ{`/ċ=OyО~Hß?'쁇wgožCT =`>u`߾=[ a3 ;]~aÆ =z1c]| 7=iny%{o3vvɯ$K71|zn2_&W7_tKʹ h~Fm2rF87[N>~E:IvuƎ=il8v/h/q޸q/|q׾ү]qŚǯy5߼oN ߸5'N\kҤn7v߆`ڴӦw~z3:?͇Yk=~f_5gZ֘3gy֘? ;,qΛ9s_oۗ|ź}_6 [޲e/]%,^e/yw>nG+mxY7廿l?Ͼ^?抃xϟ>ٗy3grߟ6m{]wm?e/(κ`xCs@@}I*fAC0cJ@}?Ӧ8qs8+<N>3 Tr]%3NS 6cȍ9gKfABIߟС_Wo]oW%]3684}0'm%R[;`&& Prl@oYSYouFr+8kMZ-߻UYa7,pv\\^(jc(=a7߼qVG37$1HI"[?&!aB 1΄Xu] ~M]18*3R^-nOoM>Xg޺UGluIv]n$!U]5XKDoFqտU];?{,9JĢ|J$§tLڊE J*7`)112'd9Fb#ʹ `O{15]qf:u P:l0 |I鍸 Q̍ nW8{,D\D)Xe*RDTR/u"l h0nEԪj)%(2$g%ie)&XE@th?<͌c&]柸yt{q! 1r 9ka_+ 4t$ =ab]q3p1?c' MasTR>*¢{Qw9bE]w՜glҦZ^*s~WfƲ⸉ r?PFF 'W| cgMY,hI%|Iqւq$ȹ)YYx Z ^! Κ֭;@gz.w&VJ)jErX-t&[fuldn t{ssn4з"5)q6 #Lnd~Js){፻s*DSLENdY 9 TF^q%lĉgP4r*R_fwb)N;a7B%=zQLKNVBF\# ?5Ν7Ae2^2(} R埨Bܨiak.[̐ +:fș\ <\CΫ [H@je TR/(~oб;M`2:R\G&_gqgf]wcX[=ueͻ\ԍ/dIDy:oxn+7Zל%F'4!7i'˻Vm4%H a?l6DnYivC-|Ķ+Q%LpyT $.`\W_,WX!Y\܇bƅf0!nH $Qa9?:5s#mۦOx$؈K%x+),(w"gx>;Ke*L6GA< S8p/ )ƀ`p6` W$ޱ@Jg_4sWq{=8t&7 ĶgpS&68OqrJ0Cݜ^(w5z׎ncY|ouXW6a09g{WB 2Yq (g:aqVq@ԇ]PqVq&v GD@CsV*8F|æ֐"jj\eu7]X{Oy aX v(Z`;` .Aqw [`XgPEMhA܊:i( p9UcB#q,kBe49J,ٕ 7wE[AzP5z&ZCw?е3~oӦ]s3R+߹-_)tj ("<oyl]\\ (À#쮦 uh1On!p8ƨ,:}xKs'9 Wⷬ: ʮ}1FJ4,!P 6Kv9k~EıYCp7WZwzԩɵYZ~1;_:k"gwfPҕv՜uHRYY 4ޕz !A]E&BaSgs3aɍ2oWKIMVί"2=W<10zBQ)62$ULOV ~i)0uV0, {/1Wi 0es]A{m\Hig?_G>w.[TV3ɆWk=r-V7f1Y:EQbcf.wBMVzsB$j/mz!RȤ;)>?l#2O{u,G/(i=gmkɒ_o/o&?έgC@w =6)ܟS=b,}x5^r%Y2Ek\RсXQ JUn7 yZ9OAe j)uSXU. mI[:0 XOuvk!w,nuס־n$;Q"V! R! ΚơZBG ]x)/M̬ۻڲ5Pi(mVFwq¼DKځ]J Bh*pGF*?+71ss8'\ QZ'}Nj|i>^ZGVս%-knozŸ޿tCVҥ%9vcدt|C\uKM 軱̓aMo~vްi)2?曏zi$7߼ͶM+v q0f{+f*LEhO?z3gZ~KoE%5q38~:*{xkKMMp?\0fyGWtɴL;]w9u~w&]H.>iگJnõ$+ZRL;c+~pw4x+73$ h{r=ܓ8o9_zگ8\og6~AQLJ.{Zi'|ˋ֒&g1]ѶYߜ&%YxY{Vys_!۵<:妏g\y>@?pǞ[KY|': ed bl"2B'5 9gMYh"_YY)PX$K-遬*/w%4tYfJ\-%B#i>g0d,BVEeDTP-d< _38Qe2-|`ح~q!3d?\xR)8 7nkK~W>pEv}|d;4{qznG歷&x?Zŋo2Kjӧp /çWU"㠛{VW+Ieu#GS_lIcmV=.y#.X|ƩGDMsޟsمIcdz9!@2 Wm0ß\%2B%cw,lVMMԨ33URni5"Ԫ`yS~/y]A7 ͢+ ,iYnU!aq޿^YqVҖg YϜYZߌפuo/o6=q%ӣoYִJκЛ4vή mY/vY'gM yjojz\l0w޹c,.L\~/M9f4Bͬg_PRv?-EM" `QF_ f9^dXg-Z_(in#:~J][yp-{..93.( |3a s4dlY K0<\eчiݴb337qdco,$-q npn8k3[y(BA`# P$ሳ v|8888@YYY`dY304ET@ZS*sYqVMa-v$>ng=w]MdrQRQmu֥.A Î9<Sj42#={,#=#P{hQ.i*3a2kFat7*V 8D2 #UFpuAR9(=P>vC(&kmacKu*?Z}m;IDAT 70TP9맰ʽ [,S`e[Ht]q(I{+4TEA(]f;XF!l@#(X+hܢ Axݏ0a08-}U-nESL?zQD:cMg^]@\C/g?it"O[$@j@;ìJYYN4Kks-s䊕V}֒[0%yumMvy1q]!:IE,,["^*,\Ŕ02W0+2 SV*-FDaEk\*9Ò#A4)2ʊ|k,l,XA+vmŎpAׄ2HFn%26GDö,V BMYKICNJ 9BtJNe{L0`{B' 7eg٧XmFh*b-$˥|~j<ؒ }ѐVek0"X+c(2 '׆Yq H;,/*J**Fb1+1\ DܕGsp .V ț!Vn/tMxx"*/ł?MVdy%Q"fO C] g :`!\?":f*qPWmaЪhCsVJ:237O*Ke `tZ|cg˗hg2> nZ-s3.2+v caw\l[T'xY9'#c,+$ (cIQo1i?+9~X4O': c?( bP=cn¤ {y 䕾 m&z8<2IRfˢƂ>ߐu$p줿l@Rc_>eC9n2%fUnWpݫ>˪:E `W!A54guu9 DoQUUUuuY̻θ+X&cG/SN͉7|>-5Jw -lݓҔb j\z=봨j-sK9 Lj%1R+WM Rve*PT)"2H ͕$Cq)R&=NDWj:m3-7ZIPOe)N 9(U^ɧa<5M+Cʘo{Y1 eF[RXj:HG6 7w,sqK,|!-8+IV b,ʓwrP$nZK'`B~BDOw+ܶp nE1n~dqr4ï svGX>縑y`+l;sJ~yD%ɞXW7G|Uue~Fire* %;AU5DoyqVqV0TqV>θs`k(M 60 力8k:`>@jzƖYM1jiSqڶCJx 1=62ˬ8*p!` b=/sKeŴPHĬI` TS0QR,QIqukZ)uV(;QW깪-2'LUʨ,UIIx8P:K*2[5ԩO<c|z*4U Ca!. p0"Eܢ"7v٥V (+&/[oL4/-i nwOTTܘr|WөZFUnxkт,[jn[D}G`sO՗Κ0|(C0@l86$Κ7 88+#YY`vuUB@T88kZVWyK1!-EnHbb<[f4E2xaUɳL2wFhMȂ,nɒ`T[RI\?t/A8iFp (ClqfOhĶ @ J% ;]*G;\!Age% ؂zJr,꤆JQb gad|C\9/ VB} 7'#-κv{fZQXe]PשԔ{2am幮+>+w5ggyYm> 54@4GJVxtnrYq (R YңLE :-[ZV=tZؙ""GاY!^0m!>;ږZmI4b~y4ܥXw=n-tF~i36:FqVb(A. t@Vz7F|O8ca0&@Um0D13g x352DaT^+4 cw[.XC,{>yhNv}\48g Ԅ qtUiˋ.qDsglp(qVqYe"`& W2acJeBŲΆ0HP{ W] Mق WnJNauUb- s=A?;ƤK~ r6BnÐggE@ 0oī,NyB&TJ*{˃8)R^EU,FfQݎY?m+KqYɰ`P񆙰TAa 9RU`(Hù`[3*\2\Ō0:lؽgMK 2ԴX/ՔwyNS-mP[9ETfG^db}@Hg-sV1! @]qglP%9$ّnY#*VXDک%dyqVPqVp\qV[wPY5y !аgػCmMNmZ&go@~ ̟Մ"aԶS7'WaI ,Sm٢vCGC7my`q6^=[5J0}+=\-) !YḞ-`tr5>*͵+l?*$YD)D&S"(5QxR )(, 2?0(rؠ<~a  (JWa72RUn'Ow= %ܼr[qnE~Y?;kn9Oq1laܯ͛YyhB uYW`FYKE-Gog-ɩ-tyM6q\S%x։ S?jp[lKrS +~oXv.}A( g1E(+°`HJ.`AۘdLƅ{ S㷸N3Zikd<dKDm<2*C` R Veӗ7ے7/ ĥzmol-{ܥ+-a|c)z.+|boܰ*)ect!ط؍:`%@'g]GWY[Y,h"'Ya ⬞*xOB 0Y1e<1gmWӦM@o*$9nR:] %{w]zjf>ٖZ&.Z+٢<0\+WB maU T "c (Fbݜh-f§@9 FڊOin8)@(Xe6FXPe^> WE&٧ic ܼ!O\?wNOSyR=>r]L|SN7,e&vܻ]yGZSvm=ót2isEõ[>8|:2ggg.WmqVLWmK*{X[1K^z'f&U>фOa|V'i`W3iƲg}/WB;Ӥy +FT,u7g'0vz:MZ}k6ab{bb*ZfByql?ZCRb&,f+WvUϧ>u/]#Cv)O&szҩO]Ԗyw7zʻk7@:kx>_2߈A_C8kMd]N. 5zoyeyXoMBǰRRQ[6NЖ3 ;(ױ\wa5{u`B ʘ<{MX,Ycf(oQc.cl,cfYm@:gw=WI WI7mocǽ_A-ݖWIGݎgojWBVYqV3URFHGYGz|WEqZߍnLE:kHT9k[B(l8n 8kV鵺 }&lC2'] DQJ[>@9jwn^[L@Ï8~e*&# T&qVqVMB@ ``u1sB1gMY Wi׋_jiu1GZ4anYh10M-XC 3`ɵ!qtZB@Ĉ@19k3*B 3ǘ8*8k$(⬵/y%YEY}Zz#q*嫫JT2uD;!׆Y}ΪB 8ka`7c{ja`L4+njB! |Y`MTT O$DsB`dfnl -XCp(Yq&1guKɛӞ<蒚(>L{mwT;Y 9 ޱ8(QAz'9C5K4un4ј"gu: @,J\Q~m9/ @*m꒒ *mҖ0v)DΚ\f1j1T -,Z&Ug(12M T%%⬕xE2p֘& @ /8kT!bƯQGp.wXժd`u _yB.p+{W[(mr⬵z\ײ]MD?lۍy3a/K^YN*+p+ԙs2wP'5yتF]-$]_ 5^:n"al86$Z{{ƼYz?WΚteaPwdKYٮN ! bC g 0f:12l!vur8klӀ# 2p`n4 J gtų]B@Ć@s0C] aDYc4! @] &E@$Vdų]B@Ć@Κt8h(B@,J\q'6 ;FzO6Xw3`bo4yl_ غ|gYCjcns7!8 j2Zm+I\o1-{/V7wػe\rr1DNPHq83c_)Ŋ]`+/kF=VsC]w^/w19kSF!D@5Vv\\kQ17`z>gm^87ŭ˝P5(!1U>O`⬭{c~ݞ1F9?'坓jP9pVp{n){ V۵8U^  FfPB $Bݝa0J;TZ"N4('wʥepݓ[Cz^ 5w[w h->M5,YgYJ^1.5sົCnIU9kM- adKI>k! @# Κa.)aW|g g󧾺/OY5$@@>BgFhut~}J:lB@!PY4l'0 qI&B@5Q`jB`8hՐ@8k}?{!PPZ%d*e*_WB@5PCB Yzhu jg8>gFhB q<5 !P0Z>M+maJQS˹ႍPݩq`3q ZcW ! LMHnFs%ec߈nq&ΪC! j@19k=LCaPH*ZNgZM ! @19kS{x߀`P|8jB@ +Mqn" <7q<դB@:Zyޔ+(ΪC! j@19k3n`*5%_[Ytү_>}쮗B@dhDgU`, jVP;!X+@ṕrVVB@E5I@[V\BjK! @Y\+vq-;g{^B@! !PLΚ,!0l2s ubFڤB@ (&g C phDv"hH'NB@F0kUA 3M{bUz[J?Uyq֬[' Z@@'NB@KP'@*Ri f}nuB@T@19k3nĕA ߈"Y+xT! Ȋ8kBCY:O! *@@5݉JMJ \g-\B@D8k*!  ! 8k|B#" Zǹ% 5@I3*BY48! @QY+t8kQB jY@B 0Q B՜wY8WQ# ZBgzNEE gŌԩS+V,'6l3nܸNE}_B@!PSBaY^ ! A g,BU:k4"RqVRz ! Y. ! bB guM ! Z! ֘ E!PKYE1qZ>նB &YU1BU!⬵|m! @L7[f! Yc/4! @-gB ?Yk|WB@govkO#L <˾+1B .s=묳?F4|pcl hW\t-q`uĈ'N;3 [g-[n\/H#5CCB@E@I*>hտzYLAatO>a\x_q֠t5&q֪P+0`0qV|}>1 #¸4pqֈ' M!P Y;U)@ŊQrV}ethqqň0. \@tuE!1UVBwn[Z!j;Q`\8k&(ͪ g[+FqO/^ _ƥ聮! "F@*JYzo\/jYq2fmǼRA0"xæ+U&%ͪ g?_|ݗ9^6Z^j~w3#1S_({75 L=È0|c+lW<5Yk@WB@g %rO7گݦ6\}m`돫ѧFO?tN}h9+g,'k-ƕ[+m߾WW<5Y#/44! @-gnV@$u%cMxɊ}Z)TΜu̫Dd*T\ҫ&}呕zƗ_~(KΙ%)RGA{g\EV[bDW^o՗648/ P[nYv6" !ݬJr;/꾞ݵ[9NNN]G>}xqS{>*FW&] tw[>9Oe`DW^wZU\R[utp;H~\V?pq|٪]!аVvXI5"WkҖʗ]3amr[:1NƑV~*ڰ.%ͪ g}QKszN]N\uw*[^VyTrO?'dk9}k9nВQ&u ͺT^2kJ;%'xdFq:6בCMDbhGbN_Q58k&%ͪ g]rN=:^>:Kvj͞=05g0"Ko '6l3nܸN|Ωm! YBI;u}88Aˆ]m֬Y˖-i Fqi?hB@z@@CYG}[n:焿9o a\+^ƥÓ^}B@?UV6lذK..>øN=qV_xw|@@I*3j(rXM5pO?[gcKW\1XxB@g %lJ clE_gnЀ@@CB@dF@xҫB@G@5dq%4! @1gpU! 2# Z'z!Y3O:QgYB#B@q']B 3xҫB@G@5dq%4! @1gpU! 2# Z'z!Y3O:QgYB#B@q']B 3xҫB@G@5dq%4! @1gpU! 2# Z'z!^B@#6ی7S?-5! %ΊE/! @gS^m ! @U/! @Hhl yIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/imagefilter.png0000666000000000000000000034035000000000000017304 0ustar00PNG  IHDRqNMsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>viIDATx^ ]U} s>sӷS j*HAE%~A+VQATQ* M ("A4QDHHp  ;o{^cu4=טc_5R W@@@o?Ů8_n@@-f͚ڠ0e~e d d d L lvo}[>o}[s+[ [ [- _&|sh|+x+_yAa/~qh|5— _)|dϗlll)dy}.d}u)8ɗ--0- Qab%3*@EQ/W?z߬O33wۿڟO.}I *3BS/}SOk)_|wq7x… g͚հޙ--0>G/X͟'u_wگC?}:볫f/a?G9ʃh̔Sq/5[ [`[@Lᯏ}cvw߽qx`kݺu?{,YQ:*--0S$c9~]w\Rgp{{]__C>u!lKso *3BhȔ> R{ W\; ˕+W,5O'|/5 {1V8*eG/h?@ۼrvwr =?f d d SבGy}k{~+t^|llHG5/Q{7Q۟[?`&&p?JQDCe2?qĔ_W_}5%:%o_/|!@N S?ޣ aoκ/ylbӟ"~{ڍ8Vƣ̝}T{QDCe*ϒ|bJjjժKI9^lp$GO8v%|ᇟx ߿Rs/5ʚ~lػ=Vh痼i -0i,ґÏQ^DKwm}8cu)g}OswsawK݁A4Tf*SS~S[oEƸS?}Ow%KM=GyG~z=LYWT*>ST~-ԏa+{*:0jSgˇW0Z}3Y'v ll׿{ۇO߼y3.t6n~_XzA4Tfʩ,י---Pϔsի)Yn؃B6m"9կ~ucxo|OW?>磌׉!o?_^}A|}~W5q'm\1B!)wTn;fgKFqc館=q0^Ly-0}tGʞ׿\;sw}8c5jկ˻^Q$3e~d d d L- )ߘHzq$yhO=O_>=_*Xq ɾ5W;o]ۏ97rNA;|=w)q>?Byrvz?#v1 S>B ?O]a__VG(Mu+e L| _4 \5QN÷Q d㹯}W,@my(N9+Ĕ/ɝvillR5vF/k;9c5u6Oo{/}iuÿlkg|(2SN'Kllh1%Ș_`p88ce6=Gf<~xƿ?0އfՁ(2SNJlli1%?+[ [`,Q0}Zyűg|[?c?Gph_}nПW5g d LM )) _`0_舼ߧ,, 2SN'Kllh1--- dϕ|S){Cf d L95,J:%---E Œr*>W5g d LM )7d[3%Α< d4--0 R_o}[wΘ1cf~e d d d 2SfL M$__h̔x11rB5e d d d L@)Q(__k̔x1jL\^)[ [ [ [`-2?zaaLIR`Lًi3[ [`S=-)?[ [ƔSbF@f^hxHޙ----01-2?za2SˆUzGqwoܸX~ua֭___JG?&ZbJ樍'r/mos!x1l1?>`^T_bw@7x;95u>p0l~e d d Zbʹsn{ŗ\z%^r%\|E.__^p>_|1OckW&'k@I%ۓz{j2ScZj]wݥ^w/[nr8ף'n}A%wOԓOnm}f˦'7!IL(Lw#mGN3>LɿX8 ^L!N'(3?'/$U<o| .x讻5ۺ뮏= 4i&tl׼5~] ]{o'tos'jW {༆wƉh_ +=Qh(WsfG@@8X+LHdʧ |Оܼg۴i3̔ۆԀ˶h4S&Pb+VGS2Ϳ|L>?HH/lH}GO)OK6o=]qxxP;H}<Ə]}ko6k S Y= }x-lll~XsT6n|d槟߯K.{7lO?ܶ7cO< Voq(}8K4i\”%eo{Msް]WG}Ӭifu5SCDacɲ6IջKtڽY,eܥ{Do[F$}C򖷔[7:2{͋gTw ; 4Pg~8{8 ~zRϩLF4gVȯlllq@LI<ٲY8v?4矿}vzꙵk}gJ?i]`J &Ǐ)IB Ϳo~JM2^[W93ei?+3宍^o}[Y C<Xl2Iy^Gs)}] Ly=+^;0Wpˣk|)P*Q6+hr&]]:sM'3kDsL9Lɘ>玳gf5Uz~=Fit(2Ÿ34yyϼg4hnzYZlZ^Of@^RfʷY?qGT9W(y듧z멟G~#7$----0:gJTx?V\mömzx{f~&)[}5hl'#n”͛Av}F9C>#}㷇!.R6û]W_2S3Zn+NvmZk+z~)L{9])wYMPձehehg|L@@@h)Cx>oO~rݺ ?8ؽ?{Yw?܅O'ˬc^KLYo%}$N;mmQmO]?yڃ_UWo|$M<Α/;̤C1PY,j}ʱ6851iHԇ9ٯ/3----0 S~ˮ|衍 oсnnSnhu.)nЦ.ݗ6=h,jO&[ [ [Lb^fIzM͔S+3S; [ [ [`BY`252SNkxXrB}d d d S) ̯l.ZPҗJIq5wSf1M;d d d &S7#(mJX eJo1`._<3@=d d d t)쑟/g,rdfJNٕ{fʬS<.[ [ [`-r$w,P:9XuqΧL|^Or@fvaΜ9C^13ayb[`*3ede m+6y`uLyO@@@@f&[@LٲNf翕@Lw>o SzzRNOՇS{pٲewW:#.3f d d L }xnFv9ls>1%w~]tlذ13VNg[ll[`*3e?̯lIkS)]J Ř|FYV}>]?/-+[`bZ 3e/0- pNݣe]<fg'1[`t LLN̔=C^OC塳&&&SB;瘙){>yY 3$果3t3ɳ`>^+3e'k dkd>C^O?ll6#y;ξy!=-U36S:Ѝ%-Ъ`1DěgM6R'lnd>eS6#3S_,09iӓ-Yf~_\{\sͯkӿڋ/oQ]uŕowi7t;Qro]WG͔2J){ڕG?S~}~>S}ܢO=tOiϤO9~{G|Yo~?~/FΒhm0"aDO! S.}ީ10&cWsf.h驙;g kĔ^v?<'?=ǟhzGaJI rƍ6mB/ \/ֆE.Zrnw]sMqm_tIX=5S.[wI~0;*C>0G^-Srʏۻk _xSz}b7tгޫg׭g|«\|t[3õ?6[m9yTZi}`O~}I'L9{tʓN:Տ[׾q>'>M_Gx}b<;o䣲Z0eMpUwaGnZH :#E^vMZ`1?O 5s#1K/dŬV"Uw}EC/v\umW?=njzkBz^矺wN2JSw5N~lZjG}t|-z|'>=vbT~0?oΒhm0e a3VTe gk)K9}D}jnQ?>8::Sڟxbӱr$ӍyE_3cy#U]w3q)rl6,SO# O7'{ao) 7ၓ)JKyf,0tJ]j%#frxJȋ]twMŰ[lYrA =a{ɧ ./=痿;3Ձ_w?o9xO[=Wvӕ۷_}GZ[9:{WNlu)9iHy| w?l)@x'hW\ʫ./vҥK.ȪuN1ý^o8wIU?|T@r۶@CCrt[#w_SV*%wff (&Sh<>zh#X|Qs}%^")/Ÿg+VOs#q;<>gzSo)zꩧx<Ǯ6vXbt9[% I}kw`ݲ$}(yp`^p);d^"gy& HS|o~-}w+>3_]y/ sdޕ??8T6Nsr[_q93ژ^zȘ: Zj]ao]!w?ݾ8g:S~k_7}ڵ9֡r}?'^~N|%>v衇d[ ]Sr?zCXԯuvg?KLْmsN,SNȓ(|fn!NLLy 7KPXst-G}E_>Ƭy):7pe_wAAm2GIҢ.KZ8tq'Oz^3Y'uKv=^{m]9ɔZj3%5?w;:ky~<ײַ}ksK';&ݾCǽfykmwڿۮoe}[_e7ˮurHK]jc^i=7}:^Ϳ[g^>wm 6[m܉`>_SB2Sen(7n|;z衇~~ß>;}$0,}Λ7ʯ|+GS}n9>_x.vˏ>/t~(:Э/^3om5ןXynXk/_d[.:MupQ_~1B^ePKq8LsV_?ܯ:8y3}}Oѓ`JZ{K}s}n>bo׷Ёnx`K;K/Ce'7yox}wۍw;ȵҬrl6;ș)8y>[`21o~s>*+o:) ao_=oo像?#x=ZusiĔKȣ~Ó~c~t7{x-;&S_H>@şO|ozӛe+~`b4}?}?{{S^sW-ۋvmՂ| >V”8d;ˆZjÿyeG{>狇숣w>w1G|s~Lݻy=묳Xmk |jo傟|Ώ^?W~~#~w>?s^~=wE:)Yi{ jW1Eo~mKp=gĄìd+xÑG/Ёntnl6,SB1{ǔsu}(ۭonD5w^t~3[|6o}G>NRߡT ㈛m`cr@]T]vyUWQ휔sՆTo6e 3G簡ZL僸'u77cRaG~WoFį u-:Ѝm<-І`?mLd o&ks)Kx=>/Y^Ιo|H3)>}>]=m0<u M@b}-}I}˔GO9ẺyaUƮn"0![`"[ l9aIܭ|h3]N6Au̔1&$)XE@S~~GWɘ܃/nB>O.[/L7, ؉hhK/e]C1(Nɷ߲eˎ;8Rj:#ӗ|lllhɔ}{D@=큀_}_~q80bʩ}9[ [ [`2[`b2e/~fldnL|ࡇbNpg0&2Sv$̔-R܌Fb}ׯGq_}c8Ajr2DsL#ti^ФL $>-Y`s]{L,uQ bqљ&`>_h?#glrf,MU̯}߭2p:d.so 3S<{g\@@d@wr6&ͩĔ+yJe̙  fព%w)o-[<_2pɾ]---0h)Gj*` _ݚWGZ?NYFJR,ջ=Z(Lj*j)u3H)8?[ [ [`2[WLC3~bAeՇμWfYuF}Crn(dDݓ?u.ɳ?+QCa̪~ 0 󭝽:{ͺYqV"^%߷I?g.0@Fw{Z}BZ`曟~M*S(g̔<=[ [ [`-e= tV1 }wkoTGO01k8|2I7:H89R޷\ޅXNn홐'բFawpc*S(g̔}ϟ---0-e4IRQfn2%1 e1 ㌳J{:}SO&?(kNmd?{}N`4nd8-K>!-r2g d d L )Lm2Y?tY(#/f>]C+q8DTutm4)y7&5J-kG_:$S+?_b@@@,+& WF3 ]sXPf2fUM#"Gso"]|4#>gRQEկ~ʊwWL8A2S6---0,e= s ̴3 w XjcW^K`INmt2-R.SZB-U>`\t>H1 ^2pL9%f d d en)'Uw$=+<u ”K,ٰaM*S(g̔=g d d L L4LO(f:QGaK/t$nj)u3Hf)/1[ [ [ghL]2SfFaʋ/o_WL8A2S6---0,ܙD)/{H^2pL9W>6ʯllll,23eƵIauvm;xq80?>Κ;wvaΜ9Cl͜95aC~d d d d b̔=bJ k{w}oA>fiM:O*3grYg ƅtnG]|΍ٕF:GʅtnO]Hf^0e3[?ɭ򗿌Ĉߟ)Oܣ Ķ&Cˇg d d LR dϳ?%[` (/X7D)\rVdr>c̔x1:Hrto);wfu>„ru0aNo?}]o |\H̾|ᢞ׫גOђ)M a^M2e5A:;CCjGT7? Sv/{hm6N6~WGpo8[htةk>4/Sdg҆fauRT?[ﱑuxٍinO'+ukhSqt._la- #5$."N/ Ϲtueކ|&ٖ>WٕoSL͝)GÔ2Fdzf\[6?S Xj1J)%,1M0~7zJK+Kḥ) kڦa.o*]l.S{BT4t͔mRNL!O#W깥,bև( hFY;G3M-YêP钍 Rvʠ靜2hQw J5ڳ&)[}Ú-锝;:swXfЖ2ET,L*);){>}1)zjI͔5w9:2e_>2e^ Uߨ TcPl }%M%k|aV-g*IDwT$Y贒8XLKW̹$YtVJ؊N'gŎ<)RPӳX*> Iа*HK?tOEA} ?>1 r,2e!%rm }oʮ|Soح5@zVK(3e0!I˔&ҁ>GOG~һ$6=Kp(JyvRyJcvnjpa_:mabՌk80CVNJ)'ut9m>#bG68om:aD%2j&LJ0m$o SNgAJ?Rֶ> >4O93e<:4{>|Z`3e8ʔ{;aR z5 oj6Y+4h* ~reK񟙲h/uSo3~)Kh6 )px:WJW),j}Rv7G&P:aݐKSaŝ5~il/m:KC3Bt?4´0aKWkLum(ftv5n-!Sf}g 2S6N_><ÒSdfL9YR_\SSͽƅ I=3SfXbP2*U$8dP%l~_Kݺl+E}:I6ow7lخL)Xo;׭[aGyOӟ+Yzj=W%<OŚްux} EOgNM?K8KjMX7+Ii4"EI}}xkvL04[6ѵLeXS7* hbYqJ~! ?͎SWdUD) [[%S4 7mcw} T>tc/'E}&S3h "4+?Ŕ͛0eZVt] ɱM~F]d}E)^f:e3Y|%fTcnQSBUT&EJSeVmkZV_i:%ͧ@(⥥Tc*lStrW"D=meOUb߶M,YՆ؃tLi%rVGJH?z]<=+_&FN!3zV6#k=QO3P*#T4!׌Y3=q_wMCվC3 c֎yQF!fX=S:w c(qyP[li)kW'wu~B/XM댆VnhS. Rǔkkdk+ZSVut |wҏs_?kIK}AnWcOaoհ~э)cDu.衄 )C`]!4%ff)tfF4u9Fjd}.:DgiL`_64^G#sb͂%:L?J>~Է\z욛ih,AtSh|MIu :eUD2T)oA\hW$aW g)^SipTr5l,(}f2ܗFݴ==_8JG1t}c cV [kldq7E4sW4?{X#zz9S)J;?An|?;:ڰşiPg2ryc_UJ ?fl5(\3dh>)ՓI*)yHJKPJZ^-?Tr\3`Fqa¡>Ìͤ6RAO;z]GsgGgl);|ɖmTK22S\b0OkOf̔]mw;oB>(Gdv/驍vKpڝ`ǍvE-Qr:jǷlVLSvVb_6w\ [Q5T|]p_6!m@OIZ(ug_6Rp<6w7iK9zhlnm=Ì6Rk̔){lcB2E;URH7!LF=DpDOynLS'1Sz]aWu85N5y>>#kX hiĩ8NIu]pqs mK\1E1ѹ05Q,ngf=MX㛤SX8@}WhJm3ԞWy21ergW?ѻO 7?ɉn4̔M1eGoVkR 0Uʙ)ӘR%OoRfА=!@&Qe.IJYKlq)Gbd mhJhTN ۞9c۩2^[mmІaj1%I&*m*Dl\g3reBўo!&д[5RS5}Jg*qOςeOIN3\B{*Rr2e_}?cωs7 xLf83eSLW9IsT̔̔)Vv囧Oj'5ѻh$\D\[_O23emJB^N+F {*.u:_1Ɣ(笤5_}:\K53XrqZJOJ 肚O*CX=*+*^Wʭ}u\Jϳr9>CkqT%mej蔲ؒ\ /PO}Fe~@ꔩTԬtsnC4A7Lc թ=s-R=J);||n{󜲇oVy[T}{z9)b=ם0 }&[& /S}-BK',x l)O)њRvӈRhz!i$4mYO6uд连SġUTšnn8M b;:W]%/`H;Tnx[W +ϤwQTqil:DҔe6KqT}eyH5 Q:޼g21k(I#dP(ك}0sUD<206Kt@bg-9MӭhȖi:ֺ&X۪[C[O\mQLkMFU.`j,d.}Xphc@^auXg5 - eYYΔ\(:B8Ki8)ZMo^WCȾNc{ٷO?dl);j ]Գ-%C-zhcZq "nm bۮpOFa pȠcOZ^'%tV.uPɼ*6;&텕d伿r~ѾVA{d峴W9:f(L!eìM &o({AALjO<"xv:6J@1}j)Z1ٛ {ldCFG3XS LS3t9wNJISTR7ݢTYCa7){\y-Qoӷ mh)3SN51釴RS6Yn]tnb%N|RL`*ִ&TbJiE0$<D[FGqhKl܈.4(h9>R9*V&""b$#_=r"u8#L)xq ŐR`4ѠITLؑ9I$W90+[`Z`2S6Ŕgmw>$L23$fʉ슊 ̔i~NJdI:eJnq4TL[/Ln$yIf45K )p o(ұ eh(!%\&QAxhU]98Q),Vڋ;6Jacpd(olPTD\MrdKtGi8ӿXsLS44Q̚yx<5vrJ` f!rAm,O°[wKÓ;,ə1(nc60݁;A~jKtۤ۩"uiTF*szO1Cufb%Yx0wɃd ܺwuʦt>f=:]ߙ2}f/M n]W&,)CC~ mS \]>ҴьWH Ⱦ86F#rcSpI`ӥ+ue:wfVbUeebzuP=97?/gy%CFl(zDbVw.GS/t>~6hJ:QCpP o4}"ˮ|p̔] d̔e su#LBwf̔̔MD>}OjG#gÛ3>^L,MJrrC[e4*)*U,vʣmHXSOKG۩6]EZgKHA\\ ߬9(/STh?yN}ږWbTF Q2~tnP(ɐHA4U/VD舰{^P()0z6C"myqp%Oa](Ago"{57wh\> zWk0NȪw1YʧN|ZHgR8w+7/C& ,/IK_[a$uz$ ֟:wn? 5jּZKAF-m񲤰..S6,p>Y2[,M]}FL;$C=D~žwG$|ٕ6-кr}.0eY۝Z V#Hҧ `pa) Rפ<.Nފ Q 뷂4&)" _Qa, X4;zX bz"Dh )ƪX9qaJ=o&bb=S&bc &0AJflIh d L9w81̎ė) OkQ0pHy(40Ku,BsIIa್(a%CF" rcLI Ϯ2E ),T-3 MG s$m4]Kpx$K,탱qDr"X0Iϩ18>V? #eJLrKh'W`G}C8Q LB#2C8 W`_!,A>#qȷ~ctc9?6qk VS(2w|cp'Wwua` |0e*76E)UqGbc'SfwWnČLɭ\N.)ɟ:.!=&(e dSv|I>i$KPD%]fiHE%XnE9RXe2dT(ܤ-K[J3jU%7nM[DZs$z-%hA˻HBJ5M0zV/uP 3Xryu mfe\$u1i* "J $j(vjaR4ZP5pg_ B=h+剳3h|E":Q?B$B;ڒTi{Js8yLfD?-(N'j_vTxfXG vj6TSM~;IeT/P EArpwqyӊ9pt"1=epW1Nm`D8LgdCP#HmᏆGqs 9/ qrqmqE}G- ᳈hPbrǙ3Հ01L GlFTx(MfMp>)<ؙ=+C h "BHOgF"4+Qh6+Jt]ﻗ6أτLٕO*- dL9o?#hzpȠFr XV$ -秸$.c2eGeflPRx`FC#Z5$f{UxJ)ϫCeJN$ JFUXGъ&zj`ߪ"&`ȿfJ3SEIhu NaAi'ڢj b+VAi o)톶$fK*_Wnx|qnӺ;Es4Deˇk|FdB zIKfD!ϲG}^4Q@*oeϛ{hn̔ޜ@f.0x}x=89!E?sfʸcf̔eʮ|)ew2ܡ'9LIvֶDDK)^訞rZOJi I P:dvG1&:Hq\G0'ﭼ(XSUzh˃'=h>TD !҇Tb5VzTJRש{Ae~_yfʦGybG=v(D_[C-Nӣ=MH5_^lgJ%g-T܂c[U>hŕ7ӞbGt rANM rmŰ%ᕆWɱAx ӔSW8N"t> @䍀kAT V1`T$N̔2S2LW7O}OiF-Њ2SfCNM'␤ IGJȵ&RHRyz'vFԾQ׬6A3ñK[\dyӂV8p59j 2NaPvZ1>oGءJ\![ eQp^-28o-rnpK/'qiHY;>"Bk$RII˨3_{Ah+׊EgNS0s:.]l|Z1He^EF)ð|#*I,ꮫVC"?nn4y3||@zWx*Q37iw]S0+:.4KL0)b=ם0}A?|C\z )ϦRbt3vbPfW,VyT{2P̂i6VU)T`G߭S, D@"XOᰆ'b+jAr0)V +iJX3wUl%~?FP'q#CNc=_X3$Tǿhq>9ˀ" 2xaS&->GTHgdgk4b19ﻏ7Dy&7(t2SI=-OE zH :RB3d2Fe a*D / 6Z\$Fƣ́PS3E\*qQy9(J_ە/ 1jT^TF^V029p јO`yI _8jjXq*Y3J\\60 B ЩCK\Ϳ]A*,i"*4yWj!"ɟ"?jϤh*!S͎Yu~gph>QXΤ(;dJ}߽xO"2y]fI/3eRd?S /3eQR^̔)_hf^`W5ϻrsAb.lK/[dIf.ӹ&qf-A&UɺǒdavT\}PKXU n rRYt}meٕiukyI-lm ^9rϚw3MEpFIV8pE1Q(ȿ'T>A#C8"2 iW<%:%PcꬴI*=.#(a\a:?Y*B9u'>;A+--h4 4J;Eϟ6](zHj9k)N5tSU2W1 Х,VmZN?]%Rz3 ް nqpywK̾cA2Sv [SN;ntx,|-x7]QA$bGR;/ێ4SW8҃J ӟIA ʔ*ySebU:/ԓm ܳK$C-,2A$ sE zDf8yi'rcZE%%N }Eu=2SMJB?rE OudhG6Sns+tr8|X / J溈)64 ɹ$ݠ}Ui Cl ɇYg-ΊQő\qi H\SN:=mM<>o&sb> Lr'u4#RfJk8Pe'<묳dhQ7qO, ;4MqxL%e]! tT5jf"bUή^<LqhHPP b#X*nLh{9:DJ A`b2 Q@aȡ^V L)TH2AC<I5ET"wi&ȲK ČTLC00J#BC#0]4)mUW˪ʠ,mVYSQ7N(Ea(0NSB()\h[?KGeWo\K᤺;oNɠe1`W2S) К'3[`L )ɭE7锣${M3oAlUs23efJ+#1'wȾ^ФS*C?|x@j1MSGR*S-8~:Fd[ۖ' Rfݑ+SO8$k^5 nN!mU5𲐱f C4\{-D{˦mIhowz^U+P$2QH+SRh(2c.9Q=R-:28ct%.Y Ȅ/F4}bܚҰpOƁ'܋KBD+2vVlil@J 4vB6)Ƒ|P5XrE$iAÜYE:H'1zyUabP S@sZr,i((yx\s¯Z(y8 =h(E ߷@!FS9t'( ngOʎ"o('.S߫8aS8aLP+"+qV6dQޚ ,11, |)["#Ze=ם0};ca"?`z꧲QtĶE29pR). _RxY&$OZBI]vx8GCJVq<'bq !XBB%Y8 ( IhLc+'o_tEQ}чqR3ZIg‹LVkl@:k,,*q2ãLU#c+TNrI.4824}|!CIgY)lC΢܇8W)RaҽaLrŔ%xL9W`*03fM1*t̟Qۮt6taLy۳C>̔M)w !X5y=)GDVr0>?ϒeLr1Ә#iWDL3efnόGWuHI $ӦL -y`fLdq͍GX^X eJQ1'3efaw1EŜn+=ii!9-V-S3 k\;Y+sV>@ _9X~4(O,ǿt44K7D4]*I's z*9e8*5TON A rN$"2u+.񔜋jhr+K]'uL:FNvW$9֖1 UJPDb\>bJ$OKF *UZ#,!Q\\SQ,-Cx%pEy#F&&A±/[CЩ [d˴8KkPH7*j)GqOv_[j5]^ՍR&oi4uU)v3eʏUNl˙ d)rOAĔwW_Jvixn?4 PXis.Eҏmۥ)>0gClgw pVmWfo)n ư}xlpģ4HLIHH;d ~t%.T.tkv0((S tG 0*0LWiG׵Jò + .qۇMvNiCbyq /6 \STkW3Tr몋YL^> ( IPH V|>b}Har%{>b=ݎA]XIQ@?^=^mxX1ez{OﻁS;tQ䬛FhU*bL7Beaљ@X?MfR<-2SDJ]v̔<r_1m( 2DLz0+yx xp KV\PO )9ܭP휨>ZM2bhAҺ6j>Ji`P(ilGhE\>Q3,);40 S%9!&U[@).K5W4LRtrO){1T)SkHOQϦo0ީ#2u0e}Nfʩ̉\/ce;3SfL23e+OmGF9:p^#ʋ#ç1%Rkw}oyRkf/>|[!S`e 43Sv);|>?߷o(Z ѓ$Vg)NN)R(ivnV'}rHyqRg4.o/RChTFC?@DE6  [h\oRkjӂ[yVwQXn" d:;hUd4E:JvUt i T~_G)M!L5j.I%|w]|HA84KUŘ%FC-O-lTTUH.E6, %U*[# "m=RG 2ծv i"){ 5|Q|.U4m[ 7RAKdҕ:)|9TV%;2$M!#Gw|֥ݫ6}~w"2Px8G>gzØKC*`H)'Г'OeB[ 3e9_q+]`odL~ 8Sv q͉ϔdrB$\L9n 4KL9ߡӹsf4Ə)Qh$HqV=;2}Kq*d!qeVd뷢A̋㢂&9 IʅZ&7r{6AED,j(cqI#- >w[CSuP] ᑗ}QmTFNDl|RI×)Sr 9鯪4QϬ$T$HOL:oe3󯭣åI 2W6nyл{iH1G㊐$6I' UϚn\вL}ҙQ{hA$|yus*"9kw:; ,!KBU]?mm{'ypSZk><[ @Lk U[pǛ܈i|NMAuH&Qdܓ,)@"2trv Qw#H? cNV~UeU+ 5P ,RA. e"7^ b#[ *O'4h" ]?Zyt?8Q7'*YHE?~:| A{)ǽ˔әKdD' U]7rnدMiYuʴ2kClӇ7= ۠?vk3m)ĔP6cǘi7 5y9r=_MYAIMHtQ'"_$O{89 2{8O).#\Ԑ8RmgR-sw ShDU2\ڐ ^[;ȉFgJ!+*횗\ ()պ;:>*Ә眚 ĘQT.XOZvt<+‹L?"J>6srUlNKȗ҅J,s1tr 4i7쑔nucK:ڌM>~:6ON.?-01-02Mj5Gßz%̕E23efʮ(]wgbSNvEdr}.ԧ̾.hj84Mqi|pËכ@JHX7q$(d|+ haB8@cB1{DiyvE,KI)N ^d(N`GF-tAII5):.8&*cHhh"jXi~9R2 TJFLC+PBf.YT2ʆt,&rE*题i&Z\8EɅ#[8(b*>D nF D>nA/}Efe ?b Ԣ.*rZL9}aޝ%<̇w܍]vQ_^zqHYl*85.OIt.H4Laj^6F+iRS+4VHt6%m'#H[2K+ )RNgyoUF%LrZ5[7B8DC v*ourg۹FբxAWu0*)r捘O%B^ʘ!uRO4KF,Grs.xO8Xvr2 Srm~H>댮:&5$aYT~f/3-$@dS:rP[(=DQ]:t5?̔]9 [fơfLkflz9*N)XL23eoYĘ}2S6OL9捗;`b'Lٸz1ZIscQtBn'dt^Xe^ "Ӣr.QhUC3WU bڢNxwFrSAҤJCOg 4|jt˯}me'Vv*jpyto $kD;Im !ժ uJ.k32U4i 6i$/#uV9o(TQves:W}׺8%L(YTK5tRM}T ^jJEJ:/Ш"7L4r̋hQ֕nBp渹Cp'yFٕ0NS" P8 {n&xʇO| )Y[f0Ŀ-<ՆTnqv )VR\3hI, Qa7yhg'VQFZ^NСX&1E4r4%AI7{y0X sw৙3 ̓mqkΔ.2y/1k^^zOfʮ1]ҙw̅<xJ7*Tm)ZӻՆADͽs_gDO<ܸG01<*iRhJ~fٌ cj4^.]i{eސRC) s4KiiyC&ʄCPI! \T!9Z"B[)/BIZdCU]݅ W"tjvZUsθKB +R[$W' >ҒMZkC 9 DU,BXI#JS\k6#l("Βa нR4wNv勫˾{%ŸګyGz!“q??s ?[|S+Mpo ;ujk#IU= ?syLĥ.?!jWsAĔ,1S[+ʵbtI?JP'?݅ꠕKN.ݐqH\C::zk(%A& *g( 4!wj&bؖVk-hְe .\V)" t8P*GPEE+jAQm"wi5!3*HMI$J bJ:7bMgS [.<$tM":FEjd/ujq^Z+~-uJ )ѥER+)i]iQ)Ty6JV$(=@sjkAE%KgCDbGhJRUoƆ/u5gVP~- )Vyo/ 5MڤN7DxVjC'6'ԍjE1ˢ&%S5 BbV6)rR2eo})8&b԰MVsn diΝUsӬiC3?/I7ܳ=su^bZ:'+Q_̆Li>5@z8 qXO8lOj:[1 LeԆL9)w44s.3ef̔&ˉwLYnȠ9NfT,kLƙ”# )뙲t`)6'JȲE֘~>Y%DS2eLwgNϷ/DRkĈp/t$%WF鴠Mj6ɥ!\ Q,פS2ƠJҐ'hV/m^ThbuElSKԤ!"hDDgUKZ8£99b$шJ~A>̄9+c4E[]VzElkYR!M9R+%-W:AR:*RMaGEHTZ:p`NLy87iL??V_~prJ0Ɯ`9Fe^ظz?̔*IasK]:v[SLo3CW*c2T%𮊟 uQ;BT|H R*Rta&v‘KΨhJ)U+A8(&VEsQn3-6yL~{ @آnQWQUS*s89S]˫ `xʔAk$9,GG1I03jNQ۲LR U, LZL^ՁKfPEzIw,BW iװH( 9罞U{WSq23Sv)F ;Z <2̔DŽ],ZcN܂4\dK( G~@`( =dSv)v\`abkBKS #lҊ;jNVqrJ)) h}*)[0'4عt*JJssqbŅ,}N!&R=Q;ht:t#+AH~&rQE,JYs?G%JŸ,~rq#'hymlRRv4x;n3Sv%ӥ7ו59Hk3{x RC2SHͿ/4r01"3ef̔)(uL$&ԭLYH}+{^i:gʼN?3e52;QV2 D*GðuK JRXOdH)b?"%ڞDDAm*)NJϘ+MC墛U4$ pYQE0ZQ5!.?tJ;"ݹfz[G)JF +Zcb\+bQezHRTvG-C!k,DZUiji8\+Iz5 FuYu<%+Jw_9^Ao8LWۇD)'?lf͙0u\r љ[wr\?<TAعjU:cQ"B,We0ʚPj ΆaA4vVjf"<49QGk(\M ܤqv\#ZGQ]ҏ\]a~XLsk("SNpR1. WҊq J+GGῺs?oWV>Kϛ O+m$[ }1dɒ̔ tV)bf̔)M>1wʃ9&NYVï rx\>LŃ$IY.Q (ŸJb&oEiOFrT7[JVTb(%w-ixD0/͔(F KR#ujRJ6)O`Uvj7*JG\Ԫ4*[ʌ<).S_y| #!RZ=u\Z4Heҙ?uj--ʝgDJdBv‡oCN͍<Bii@T1 1,W vHБ ]A*%D]IJІDaBOV!Yn\ݪ5l,25lhlI U'8ԚS(8*pǙ=R Zrt'7(=>!?)p#9k M`‰ xi&'i[y62N4B)L3JV]zm+kBzWҒWil Bb,5T#rᡐd.H[tuV/aKF!0%&h;M7=;dhd"{b(B~* )\b.gwwYS{k_^M>G;֗<[ 3e}7pΫ;2e șv́!7_5QTcBA58=WTT"G9!bPxk )ig!V2_?aUQފTƷRʥi M+*Y;w jbe'+4qrk%I [uF22&:Tŕc]k}Ҙ u{!iyt0:Y[2[OJ:W_R8oi>o=aw !p ģx$ bȓ4$(n])a١d>)O0KKw JVPd'rt5[UOuh;^B:i}tHM1 OVOjIJB!iUXcs*"HGt&%xG,ذseȏtn=}{bּ33eSL}ߝs' i;ylg_ B0%N" $גE iX!z- ] ܩEp6 qH5Z̆*Oi(J[ $҂8v3B E%*SDI9F.&QΉ:b,PFZ dRRR0z*r)o2‰bJѰv YQ/:G)>$cjXK5VޒhD*'! 5Vω@*p.;PbIu6GYBB@mQވ?T\4kR7ؙL9}MO+ڸS,c̔M1eW~ ]NzYCdQbU~+ AV!kZQkD')כnJBR:ڤ8(򐎥HD1LVF8ĉ>Q 3|I:[aUܡæÒoD6Iz5Qʘ|Se{! F6DRIF.JnT+Oe ɘh_28"(OBbt])j t}Jŏ*uI;u= VBb]  ]^_&*J 1kyqA^2_:qp<+9}}]W U^Wm 3S4LNd^Ly tE=Nl㈻r-q̔)3S m7;ɘܨ(|N94wlO}r/G?vkl$c%lʔX2o*[eny%4K eCFZU]RHA%7^K"NB|R.vj)i2JBRc;495r*P b(U ǷaamKl~7 zC.iĶtJtFui{]Ҿl.* GIi:8JlXŶJWAs_=}4]WlwP*ä*v nڤ4f~e"8 mB>1"I5JWhȨS[[k1v"C܍:?U(TN=RAĿ*t~ix82C;+\=KCYJMoTmi; S-2ɘǂ)*k؊eLW9K\QAfz*,2> w["\eyɂAUW'w5OX@D~su Ear 4+ s|9<wpgˣҌt"FAvsJd#P!jnw.D*Sh]9Rh+@*܈ŗUY]a:T;5 "sw_1"`ŗi}PU@8[]f"(|jblk쨀H =!_ooH{)rc`M!]L+uދV99:O=2ەo6| ~CogGu^V|dk.̈JB Gun5"f16.ϥcژ[> eꩩ)Mrl738=xUy <@q6AIr42$V2HS pnY <>ù"@\Y$g*x1 T/챒lh- a)K̲'%8ByUk)v\6QdW(Q05'pT`Ta2+]LRHC:ѨYL+]5+iW*K&H8]CtL YK6/̩!@w!.=Ps_ 񗉢NSt?9:NS/UKm; kp02*}2X!7ݴtLp,-OYg/ߑ6gûVԥc3S)3Sv?1h+Z])*?ӠPsf'u{.i8SP=!3|*&ƄաK2Tm-Ç̾&1²-=PYZ4)N4|1e}1ϻOrw(C<_% O%0qϠ8Ҁ䢓OI5u!1 rRֶ"{4Dgjy.,ZyEk\ɒ iȠe9NQ ihQ!*/JH(|CCS99 Rd@l%4ULk/d1#,]]Y$ʙ}+UTƺB̤2.\#ǭ*.S2/YۺUhJVMU* %X}+.VwWOV($%|{ʀE' (Z6 gغPJW$~h*q0>_]-В&5?ɖϧaߓ)HiK\f2SJLه;dJx1:|uA@woQF:̔ (33egNB*$"PЁp#^X64%}1%sB]SFHi CkD[)NژLcCZPU-XP+)EM .^m MZfU('ϲ;y]yG儤t*e[ҍ+0$&/*J T 98J+uҷtG-xc=ѐhRRƑ\< +sQ MJy}s}YA"+aI=ٰLX㛻{I}).)&c.TDb)ՖS=򹻠Ip2$.*FۚT$tҝD͐5Ɠc%Q;+ #4*Zn'd^FD(@6TqZ*ʽC|j|xT+O' B)"w;\?>+99Gu':|O;1EKN L̾.=y;p71!zR1p?庍NrޡpfW;a--9Xb7Z~ZAZPM/]JXV >:Q8:(RS󴼎]S-:u]r0  مJwA]O9^;]nd 'WVM[i .Mpフpkhp n$4v\Uh˪e, V i+Y):]9!jOiMJ!Sfw%js.'h- LW9K\|] vtZXrOȄP\ISġ<@f9AWqr:#iFIn#f%LҤiQ$=˟oJ'~|*TEoê%]^ҝDGf9@Ƙ!QߢNUgrLu_")n HԇJiYdC*B99nYMqOI}VѰJt)3SL;R9C7@* rCtaT M!g)avhC Q/ XdKd fBՕ &;R^>v:eweBS%K4R(Y)EŘR1iJhJ;GǕ%RZy݁)*9U6_Ӡ3 Q_<<`gt'2%2C]i:/GkKN딊|gR{YybuS_E2w#D LIÔru9JxZzVJ\gtʐ:JQ8dϰʯ٩nuZ=pEd@7gO̾.hfLKAA2e}OFbsNyޟبg E)HzD%3Q gnpPBҕ`nCC>R:%b i%1 Պp@zJRFiZ 4\?HU"EQ*[,JMhw-4+Рޡ;4#/9GJ$!ioAnhTT!TT:v& D2$p=,_jևd&4tzVt`ZB9!p%U6]}S1 PY(]D b"\Qi܇ܐh>Ӓqfr˗B/h X,"%:%95 m_#X`*Lr\*SҨGHX1>dkV5Cs94(FT^Q-u 4cCLlE%2 J*4WyŔryo<"= iJCU@ELQrwhlثԍdZDSpHi$j΃\oyGxJh+L̉Jrī%hǴZf_~L̦ e.d:VR)JQIfH(EJ݄"GsU;O9!{)޴tA [ίno+5'h<% k?O#[`BY42Sbck3fw4NNf%.$i 3eegLٟ;𱃚+Gd,23eSwuc?`U\ pp+,)W"Y(GZxmE;(6If)62M@ڢ_Y_(a^?a9ѫI-ϲER!%/Q$KE|IU[%)+wQD*Q'\CԬ_ʹʑ.)U nb<<4+ekI d\5zʩ/R|X>Cb[>;V^K>4K- W'.7N oqspFّn٨ޜ R:i3ܟm? 7"e3DڤJξ料sl b̔=gNT] gbf T.H83[eyrG @F >VUUe!.:<+2B( wV*R5 ė,'lLLf8;fə΁ $eGv}tH9 c\@r d>1`Ĕq/`#(G.7t+h-mE-  oUU >>sët.Wgw?IAF"K𺢂U”phjZ '^qq3,$m^\3K;Ρ廔:Xىѱ>&{šӦ멬Yȇ2S)g[ԙ)?23eK׸`vS.a+eX]jl^w悢gu_1BdR)FINO$gj0߮ y)b̔M1e^oOO!PzhxPV Sί*()ɗѺSr:--N!+<֦^yQKJ”N)J*;[yiQJAŔzGtJTHb<߂ؐP^6vrF8G..;ήmNFIfNn!^`=tJRiȊHR4+ .KPyС^P+X Uӗy$ KJm; *6ҫ I*_G W*'5"je\qaPO|Zhr|dE4Ś "k]o{ˍ8%+_g|xeHFy[7|}ڴPzsٲĔ̬!VGi0R0t)J!}A:&'=:L<Ԏ"ؓ/LSZɾ.=q 84p!ŐJ- l S_)chXPM5\px)b5 ?1HQXV}S 9|SeD64:kLɍEG4-g )6_S]UbPZF/UӫDzC0T~sA0  HN{w%Mk*b$k30+lng즈Xfr'˜yS.~~ОPs~HU8ΒkqbO.Yd4B.=9.Fu5]q|hRv{͍lAkiAv"{(W?֫NP_b{-0<|V%Z5RC\f&gm&vç2S)v{ Zytx6w{D1w)4_#) \"1 :%QC%5tW10- ]4|:\ߪ) ҧIm@%sCB$1J i=CHDjI1r#q/}Q%4=.84R8e24d< dAT\NDR٩JZJBf^ZSŔQRn9MUAk\ [k ra>>Ψ A ץxʨS”|'' #ӅBd|t, U*?;OcWw`Ep?Ôyf<٨d`Jw)[@JiRSgGJIѰ^ZgPݕ~*23eS8>۪Lو)Qzueh+2Sfl"Z۱ƛ^SLىO7\: ߷] ::ԜN]Xws+g)_x8G8Jfʞ3e}wGrV"RPp-քND8bRT$Iy˵l"5ߪma%3*wX0Kk]"% 7OhEZFz!KD %{CeO+C d3f^_\TU C\ !=pBO+c $J1LͿ4iLa"/Sdf˕ʰȖ}&XZQSW$Oʞ,9eBͥGzIO>nMU_G>A^UlG67XTa WQЊB*5lkEC{7 4߷ T;|> Ck:G[Bl.k l( r悔ԙAVu}J$:Ltn4kݕͬf$Z$:T]rt%4Ò,ԞxN2f'O\Ȣ (:PF)A)Rxv!s# UO /)y* lhP6 Lکw~W Ws딊}u N^Ȱ#i/$xe~W'l,pDeaSʽuwOD,kZYl)Ӓ=Ĥ@ ؕw*ӹWS$՗,J΋>F[sT?r}xW<@fʞ3e}wA3S1"S`ʣ2Gf 4g Iς)/SNlΕ=VJN|X {Δ|ow K\ܘMȚSzkjp2\蔈d5E.g4RDD) ExQُX(5QwhcZUuhhA~KJF!vtlt|*֨z|d'i5ܥ^G* omo~wT>Z~Vngc+?[9h+sΩR;rHس }~R9GhGU~T>S*r/7=9UvY̹űizwG޵rߌmWc_LO85&@jpN+b\Oe9quX3Ҙmb[n^l?LU[b7Qe+ӿXZ>TlL~鿎ϟ>}~lO~jhN_?)~\=} а!SZ䲾fʉ3W d23eS7`J!KځvLXO b+&DXE^hbȔst,IH[ȸ2rCP3I\T ͅ~kB%.iU B7/-N!C!مPvq EPdHo6೐л*wozq(vl`*S)9]ʔLilHe.0%X))E)S]bJ>1rQ*}\V @_bxS,7}@fʦԳ@){Δ%%_Tҁi~1KHe:eQqQV5XIΔi/ШG˦)Q۪Unm-ʘt;5.ci:2TYsDRC,PUU(T14ա&RXvB凩NٶNM)`J1MLg2CSy|N)4SZLȆ TĔ.@\tJL'Dr|Is&i3SN=XWܔ2S6ŔEst̅Օ&8]N|ߙ)*YbJ5kf=;3ﻮzW<fwSt;e nn);Ye"12)ӂ[QxQ+L_IIu%._HJ%)BsYFE"8l)Sػ_ W^QDM-,] }ὶ@OkPCL̾.1(5&ָNPL&&?rTm*;ZS'<RQN ,ۨ$RJ*$H7g4")aUQ}C k=3+)nE.iՔyKnU)1"gX R1Cb( ߷yTt94T<%YM^\`J޴}+2%I9OJ*#7dJ2S۠'Li3Sa ҀjD* PRsGxUHu4iT)PjnHGaJ+cJŭ)ň2呑)Lwlom6}ox)CB9딠^GoIDD-(q+i:Z0*Qa[p%uJ[rY*?$q򊎩NDS*XyR:i[bQ ^C+}8"T&}bG ) ׅ N5x UI ę]r22J-?#~(T? *43$zFxJi%q7ChD)9Gⳑ)2)SaJ-wpXYZ[E"-xNS¦aî'\/^_B@2F^[} טق^LIy yO[\~WVÔL{lu JZ;kOу)utXɃ &{.x9a+38%PH 1[BʼtR͸*1SA+Oɿ`%mcP.3ښ JPWDQ,M҈T4tJI:)UÒʔjI!&LɞRô7!\.xJB*aM.$2%裂>`hR@h/ L,'!#mRt:?WEPTR$G50b,/킚 jfR*Z@MTe#LkXJaU 5%)9/ׂ S,GfJ#%Lk;K)e/V2}B!!3ͱyf-)uymƖU̾.1hfʘLٕB=lݶ,]a3fA)PU,J&KPIUHMDzM-#VQ<%j:%W%*?(ꔈj}#. M^oU5iFLp؃E9uy=[iRϫ4N{:^TY >u%Rh)j:VeŒ%Rje-ەe^<}t5*S>x'z>6[`|-00LId7!rlU[gLɂSF.!5M 1`cBMJ828mRgp9:wǵ#XI􏘒EBbV P%;>@IzIuzv (N4g\O$nyƵ`JZ5GSP#H$2e J;s%2N$[I-+2+[iTE!] tQ! BљRN2k甘R)Ŕ$<kNz1 z01SW|fJ-ͪ^q|+_m]Ӧ}Ҙݕ7-Poa{Oܣ 9]O}]Q|padBlz$P^H)h JFPA->1nӉۊT\&$8 >#j?%<rUo7I+- M&ʃN j+ ة|S %imI2 2Ru][&T;R$"4:JV +ĔZ1Y!)Ku4͔iy3:e) 86S**TL)F9L ;*G) 3*cmaFVbbJ%"e7J靃nȔ{ɇSUR)=Np隬. :Et"Et&Nkhps#N&ag+kZwá83Wv vƉ[b.!K!MrcS29'Zg_wjDլ{@Xt΍ۇM}2[``2Ǹ ;tO do-A_(H c}y xHAL 1/P%*ix)ʵ-.T]t텹ʗ-Ua -ԕZ4 S)Hc"DzslಏLi\jBI1DUIKUCԔMx(Jj=Luto1%ՂReUB^\EҚi-!݀)UHHL$h7;S߷&S8%)CqJ-hTeJ̾Y=F-{͋S*yQ dGj4N]ޘ) K X5) 925dyͯ!uٶ:s1 SÔ!ELuX$*Svt|?tH%9:Sj!e;E+o4KJeF K/q/A$8 nmJio-7tJ6(MJP(n xɿ$qQ& MTK8pW |$IbCi{r>O|QXAS tI˓R(U9R isڏZN9X DPWQF KG+匜%%]NHQ%߷OT))0a)*N)Qo)H)]+4JT!!*STHXADžuJ'}8e%i[a^1tOa6g42z 3q7J2xØlj9:xʺUcrOM=\1)h) LǴ0e F}b1?Ia0%pI1 B!iS82%Z)4')|h;$]>jksYj]HᏔQr94 -74pʞ  " BH6q-|L ;upJWVܤ zӄZҺ>->*~pc2DŹVHLI4$t4љ>ҁ a+g])Sz2"$FTp|jQSSU\HL S>V"DqʥʔŔ.uj=%7Ң!UV7}Ge3f|(LYrf1րltLHR5'bo6 ^J 'E]OrR<'$)LY|Vu y=̔)-"fL7I}u"f?S6i-[` X``nl">|Sq :묳tz>ޭ:`JRcErnSs -{JOt81d4D~QߜmvjǐٽKR3p锴U(%2RӺ]l(XJ*{FjbERRDIL*K4 ˢ:|򰫱-IrB#U[NiKrkMr{LBBxF/&7Mo[I"Dۧ2ݪ"VSR{$ [T+Z)EKY`4L9|N9~|YeP-B< *<'Ķhː s)!K4\䫊JQ#zߜt&KsF!,Mj k‘ZwіZLނ8i0BjA$(K _. kFt-#J\֒"QHjs~dZERamVIGJή 8|8jIPUqiu[V:U2dɚb;wIiT%s%;Ba.@ ][ىR^ RRmqtjMHU,֐)EfPPE(-$4*B.$24LـƨO#~l4lfIL=y꽴dg{l:#< Lo ݓ[*e٪Nyv#p u8Hf̔Lr'pNw;[`Y`3ĺžK 5oKL9>&41(.ő@qQ[ :%# !|ʋÕ? H<zQVT*],`AכV)LS@[uP,Oԑ44S"BDT7%pSn? wBIc(TS2s%}$D\HJSݼNI!EqJUY"BB^Tf`eqC[û7^}xBA5i\8`RT r95)DΘ1Vlf9QH1fp2 4;bbҕI+ eRlӖLysou={>{b}}gP77[(Ix "r<.ޘ,&Ao VbAh'%K:+_C 0?s\BH )vga+`MJs!O8bG@A?w,fX3YSP ;Ѝ1e'zLa5ΔbJ\$3.gK^iS0fU= ٧"efbJ ߧbʓrD'3fo .ͦ:Gt49Pdc.%w_E/57l߉)IÔdDBWSm>c9{Cpz1?S< ]mkWl.hS :D) d Kp@ٽ :cu+ۙ:Qp$@oC>O)vfD(17P\HziN䥧?9F0%'uV1%eXI%lLpf0eFPdUot$xS<\Rr SJ4/O^daѤR2IJÃ`vR\OJ)3;ebJ#e7#S9@LY<嶶j4p0B!ģ.ifL/ S<.L1V]dJ[ir '~wep (OYQE yجMHT7$19MM#gS€ -hԦ.M}wIDATj݆0Iػ6;H<;G6BJHΡ$4\fnx$rf4T<153%q1$%Ÿr)1*W*HJ%)dJeý";O B׃(uD Pz"h^|AS}\{C˩sty9hWe.s]OJct ¦A޼b6C88/lg|ֈD-S[ BU9 Acr_I"4KEQ8JfZm.!fԇR椴4I/4wO}E:bàvy Y1;=iCRNͨrqwSz7mRS7y;rzĔ'wh+y#ܴfd"r*hδXM!$\”S @L7Ṷ)v ʟm߅)wTWVrκԻ(OyeƱ̸oҁ_ēq9kY*@$\2;gyOG>]XT+]r_) ]4:SQ<%Pr?<0r; 'Q)RIFb<-TLč6Oiܷ)ʓånJ#i)ӟrĔg?? Д2c3*8hR@youLrtsL&=kh1%';DVcJF}"##h7oM[7wkp4E%a&)41[c1G*i͔M2бt2r¤;Ҧ0VRkyJѼ ([yRLzZpD0|Szaھ͈Kxx2{ʴq'Ԣ}PJRfNJ &]23eLgʴ_'C))!5xϽZ05P0Jjo08 |TT"'A33 ;K Ŕwh}sX+yǟ i\#0h.ImchLi)g`L&r 0cfP.\B ϗ0eO(RӶ12JhR@i!4[LKRditL|9zX=茮v3D4)̜RQo=)әq#=;rJ”cu!i;^?Ew{;|ѽs򝡓Vyx',sn;+<*Rh8\BkWha (ޭo%A͢}W`Jq$o31XP/+XMuf4G!GJSJZ_qkn@F.q): F[$z<ȘvZ``FsMuSF$4#dQw'4[(hR÷cOʴ/!K3; t<Շ24j'jՅɌ4|)M,™m7fBtkFR1CtKl߷߹_GIP>Oy;f?~) _[MagbJ!18 Ly*~1#i'm,N-sdUErM9}fs X~bLGq0h/EcΒ yc[*OY0;;G"hl;ǔT 7},LytT|<q}(e( Sڟ)mߒ~gA2^bS:\eoy꽟 Qm %/sy/9J"V>rǔgH8bb/DɭcўyلAb2w},БUO E,GK- r &ΛrVSSN8wV>ӟ%峳C 8EuÔˀC9<ʆ)% y22V"9Ch\L)WR(;IyKNnYzHcl2!;r2n^t=,ͣn&v1e"DI9bJ%2#l!r^b.,OED&=|i/]g^Ly$#m}cķ2@LBO 8S++ݍߧҎglV<^S-_i OYr\00eO){ia߫}or61Wj ',LҶQ SSV(>}0\Bt[L<>$i<%H'rEJK4AQNN(F(OyJHÌ6[I{ 0LQiy#8)96Ky % 5J%yDu6:"oEOLd1Cb,y. ˥vN#C97#79ghyK$DBڸ!&%)^zFL)9bJ e>v\B+r(VJ(1Ja mn@%6u BȽs,0彑Et}M-c%ĔR!YH8;z"4$VsyuǤ Ď@%>N;#D84Ӹ2d1f:G.%1夜/o+ -eJ̅vd><cX9);$4@$P󝉄ĎbJ S21%/ŚbJ{޲K藎o9[{  V&^oUFOS\iU84Eƀ\iˍ3(FDsk>v-qI㾣p<*Aob#yw&97%xшoczĠ=2gn= !醁)IIS#K(mO#Or'R3x1B%pygbǼ.xL~jSrd3RRO 9”$419RgS1:D H=\̕0t)_g6;K+ ?XqEyF”=zj01eپG Sa?w~ſͿO>/Ȝ<#"go S*go4?n*ܰgJj`ퟅc=sϝ63omV%WT*.m7|$ypw\ !ҏCi> Cwf-vZ1i]$ *mķҟf(oI,ಕ}{N#,)42g1Gt:5VgLx,xR\JRd[P$uF )?Vy=Ô@IS#ez"wll=2vy<,}ĸjmTXo\Ii\ `by~|~0冻V_p\2y^)OI/S{{x'TtN$bLcY;{Ե)quK`8}y(iMs_4$f78Ҁn#rVZV0MIst?k};2S4E_uL”l־ئQ1rU4Pc:q{pCwaʎ)O~ݟ~X9W|C٣s!qH8Way!vOl2AF҅6f,7hߘc:qmg8KV)S]{ro[}\oiȬ6^^)χ74 I,@RjI-r:@lJcAr&чRFZd*8LJE$oo9^OPg_j3PT`Ҳ4'Bz&.jrTBFgG-!$IbbӌmIOP>P|AvfwM)9C<5T<&|ϕA:lGÃ>qA[x =҄HG4" Mh.=Ex"(7E<ݙ=F^p ]-8)M`eƢxIr-}Nak 8&d4M <\ɟlãxwcJ x(|_a:NKCvhrnx⁨`@fSS4PDP#JT{ RwfSŹfh-y_&8쿞~M0%ʴq4r~1'#kRZ2R Ʃ@U'bF@Rx@kIE:V(0:w3t k??-:AlBB;vZX(%~m 2ȮN"-IL?޴FSQ\fa(4b*uz "y8L0IPb>O3ʔ{=z^T/da)=\6Yl9O/LYr[ 1<&g3Yn&*Li4p+ mj(r%r+_͗ȶ6ځJ"X<1BSō߂c sw*^B\u7RI/uIymv {Y;t>y-+=ؓ\ #rWx'$_HAF(4AL.kH>&.#H]Ϩm(螸.2T^nf>m.w=P>I[>6CKÒ.8E7'iUj/5(7`"S2QYG:cx(#[MuS,X'"lm*kDK##Q N) <b8sr[9\B|+ˣ9< T g;޴[0/Dn`-OV"PK '={`\3$y^<ceJ .MHs/ n'bӿ3aL%1-#3&@%;qET}/F4ٔ!L A3g6F؀JŎ 5H#CLzdox=~<%}`G:dXoo;4hTQ<.DpSBao*:3|$L%?|pĔH6tEF![nꧪR)w)clqڠ܃t81.b>Bꡀz2w Q" QLJn:mS)Eɣ} )z4cI4sfn@Hky%@ }n-]!2Nf9x 1zLoD]A$"i 0Gi#)ILi1cFg'$M-#N:rToIBgjI)z,,w6q<)Ñ,n[T`37E\;)S@UH^o15V{[qOXF0\lu&:06Ŕ(LYrX0ea-~jj < rmSCSOYqã: i 8X}~$O QL\ZZ[gJz^d>}1{WK0(N.T'1 B\ƌCVҦ̸-Osv/7jMgJq3K2ls;kD)AL:>B:ҋQ-uc􇯅|"`#ewJ\:/K$JBRNsE\jXL$^.޼,5Cg" RJS?ȱU@9=0xt.Oi]gx*'B'?ntk۾S~}ϮNaX)7\UP5P٢Xh-#GU7'9ps/r; $Z|k1`ZЙ-A%5i:{}ÿC1A$~MwBX㣢@NXE S2f8-nP8Fd=bn]{BSv8w )xuzw,pB;Za/EN:3Y# >A)w)vna) Sn3uKغF9}q1Sx~^xEaK6Sl`By[0A xљL:`Ixr(Ge{S)Lڿ S)2f37'>SqY{{ ]ϙlbFHGLg-H {գ ;ԂBHH^#OGa}-"x ̣X1²1* 43wĎܓ kFLk>eܼL'H&`a΂~>.yᛨ5ޚ&6)ٗ2CY_XlvMlG `Eژ(<1tk6BKL`zzςo_ȫz QpUy;8Qi)BJ1¹"ҟR/[F AƀdLx;p1kEa:l"~jRxO@˱ yjWk]k ך|aʕ0X)Rիܐ{EL#za&lʐ5#x9_ `qfשg`J 74=ԃ(8F";Lb G<2#[棑 i&MTv^k؀3ɴ?(̃)31+ k-y5/Ŕ&H/PDń[b>)-3/fD1:lTA3)z>cM{t@#Y[D6 Mgӈ0RYQ@BXi  *- ȲB\*@jJtWkX7tND[S.)L) @qH`#yyFpJ1 ,, ].7V< 6sRkoَ^*9F9,Ÿ́i@N^W v\WA4.b1W!4"mh ~sT\MrGM`1-vɆ w2[%4'4diAPU:ͼVŊ)0%qfIQDA].375m{Gf鈡ڎ1vט&BP.榤BȡR3h> 3}:UǒI 2 O lkLHc1ZWM@ 2Ps$u=_aL9{APckeG;jv7ͤ%ٝLdf wwm6G-ҥ2rRϺڵ%Dg4<- mCpfwFV3ŦN*#egs@i``7n ŀ-MK@@O"ޤrHQɍ{cWkejLy tL}?pm?ٯ} iNxǏSe{})GrÆ2\\Kc21=-S vLHX 9,𨻯21:fy=ߝu?|3RMM3?Q3 1p/pyuƻ6 xފ(V97\UP5Pr0%m'c S S#/yc N|+ FJW[S>.^އ}"wݺЙr%ϸ3|ܪt?sS? ֘1H%ɸrl#XH7[GhEAO1c3 _' 1q mJ3[QܦeYDa"\B>ݩ^Li4D ΜAmmyIkM?Ni#3pbJf)Scy:pmTNYͿ|[N6\4^C%!c1y G1s4` L4ޡ$K:+1ϣÆ?c{}/Z0ၡV4Gcm7o~}Ǟ{s>~vmsό;[߹vP LH@傺\bʭ5kw~8evaʭ,j4p0eG<,W_,Lyy0epڲ S'q+cJ+ Nj`mSU)9S{> SɟI|ou2gT[cʍ\drц`phhX c4[@#=sS )|㴕zPM#Uh7;,dA ֳC虛g)QRR+ [Xd=D< I;8LUOXFfE{s2ac@Ã8m_DiOR:ev}mS^!C4:P Of҅98p )+Q6>”̋bʲ}o e}74,`PgK ׷ Q TIt ω~J~Y1iKID :\ NJ#iAJ d+}CtTBzY$Nl2%*leDŭRlP&cޢ*M_O1(=8!.7p[ >nLgS\sǻ7ҷp'[;"gSF?Pq3)ndMf̙.ĚG7Ĕe:r27MG< ȡ>E1_{R}hg% S,L97qg۾9VV7*MWe<|-r G])<)hխ-CfB"ux_'.;@*W*NCхIAq$x(qd2w54,niDL /fH=5X g]D| 8MDL`}3a҉fq3 a:f(D4q54?!>(6Uϔ7Y!GPq3z$?3K}kOڧߌ0B-RAҡN7i-sR @]U F%,) ζz.L 6*a$[r<_&z2q h We>93@$$֓~у<ƴ>šL?~\5#1(dAuZQzչ~sɕgu_:TʛHS*4qj֗EcO=)j9H#j[>Vq?u9Z%S7Eٙ ڦ2~wۣمdKf݉Ew[FOrb6~`cM4hMNv0cyQʭܿF.v7Yu4 tBg/̧F!/%]~3@'=;s Jx b.-2ό~e+h.#]k}1z{up鶨u>Cy1.AcMME)FSZ|v|&*:wj9~2<<+k&SE>kǣ t{FL@.gHeo/_tؿ3U!a tpad4iNhwEYn^50^ l+V>) x6 S ”5x 7*Y( L”+aʊ(q{E볁ޘ "Li P9Cb~t.E6q MF8?)xx0+rxJSD{!nQ,7 ,7Ԛ|$ A ɄI9:H35:G: ',&&')\f{";4I <ҸoX 6Vd2v3IU" ާn.)O&WB25_s|?(X*Zmb.!ùDAR6 9G~kGm+$I5`dX9csvI-({ٖS=&ITh`0Jrï=%\(,0:-~r }$2lgCO<k f \!Vú xIFEZx5YYgG(;$ie4+Xi0eK&%J޻8&C3΅ֈ:. u:*߀´ŏXSs@΂.ڦ gN*JԤio2\'&XôDBgnzHۖ;Kk/}yYxA7\A;Th+ݹ^Cv'U )A?92Dg [,BsZzG{3$n?d(ܕmᣋVBݵjDWz+(L?T5@ib(L,V9”) ScU6)}jl.S)W”~5I ooE`z2(09^h(tT,a W9X(*)C˽&DT&|fEm&$H'd>4YF7CABo-hҙR5psN a3%abk֒ Lzjˆo_ B'QIAjgJOe'7g4{~ ^WwCT2Ӫ/J.EZ7ܑLôLs#1?>M +1c2<% `Rѱ2&}(2w}H?+__|2<[i`I) S׫e۳VBh(KbfL.L4G:lG[LڠA]XXKg6qNO:ߤ>G LO,4۷yDu"< ܌AA-HڸA~L{1WkmߘAF9,8T(;yቨS &2Ziܷ..4'3"Q8^޴/ uz`TJf5}+0%MC ܿcV&~T(zɶ<;ǃ=n}O ?rѕs{bů;q+f/?pm?C߮S Pޡaʽ}KdԽk0Jl[8scB"'۶[>jHTil<%2OAI i@8gnb v4%lXD)/']7<bRnđbPiCq'VgtB |o2CM9a2|\g,oEhj&Fxhw+P&]fGBpeLuԳӃŚZY(\μo+ܤpFSς/t|Q!jqV;ώ7nzA{@/ˀj'}%F̕)Sz*cH.dUZb]پ{Ǐ^]YLy*s()rCs@ljulyo8 `-LyOo n,LYrOng<%lv$+o(^zir`qN¸Fqٌ8A)ad1l6-PApT2C\CJ-*b|Gj1_fbļѨ0`(ZV ǰbKeٽ1L$ƤM3߸Jc #&4?fZ!($"54umV, 2ڻ2Ei!2|LWqD>ҎѼ>20fwDW!yv-Ӈ>r62f⤺&u} Whܤ jqQLm5Yt&Nk2G`F@ q5)73WoJ'X^rӞœSSO:Z{t\{sVaMf,VvE 7WPf I;1`>@t`?L4Nx'8 v$ Ek@-b20"!GfwFC3`bQDbe=Ԯ _MsFh Ȉ-GC0̜)iAi1\"`z7W&9x;jV&0OXB*NMp#њ IsCgyx5u’h9D`PѹvmM]Oջ%3 ͢Bzf~WpEkʌƝH7m L!O m#R#UO N.@_\,cXq D(pULS8Q 3£-*UZSko,028c//dWۊ-S;OSf U-{FK)=1}băA x}ėI4d2pPщ2+|s|ॐ #[ȒTĕmH|r9=Dϙ:[rđŒNi$JiR&,-7ȃ|Dc=ܻA7}h!l4H?tZL'p8G:VhI3PB}1 fJJs)QjyHǑbGQg4 DDzc QO]`c3f?d.Gu,V$n;)LYr 0eu SܒbSz$pY"#uC [_1|&YRŹJ)j<%n'{+Lyzv1);ܘ0"եwXr%LY-m{Zрe1DC)[W?Z-'ig54U: t]P\RXS5{x!ߤއƵnlNrv(ŔDB^삍U Lf~<k88R3̴^i2o%h;Г3Nz.ڦFpŅM<(ct>'[N-4pR(]1P ؗ4x1<)<+5r(3S&T¢9Z@9H_ꆨ_ S3?B˞H{hޢRoQB 34REɑscӣF\< !gJE3H׃V+cC3GQ[VxJlj]i@g2lߙ{2 Fs/No:"ڥ*Egv/v@i`4^Ha”`ċMJvbҌїnpٖm4?Dx:LtB0#s\?4C~X`/y"Ӆ(3d`5;$Ñ1q!|@#`1#rm#8@pL4iӌE}Ѡ04N¦ܐ(ͦx2̢]S m0x'>€ky&04cz1ƀQ2vj^h2"DiX6 Be kOs+/˳_q#lZ |HWVxġ r\.Z))ӫRoˋ~LV~+fOG5H5'ǵfɦs\ S{Kba”)Tn)&:` kM:(LyO^ٝ k,I$$%<qe3ND0wJu9O kieZԈ-RVc2(+I-Z[ZK#GO|}$ғrg$&d(NΤ4L-t! 4Zɦ VR؇dp&z!Y/"N!%ҲuڸAOFB{ -p}p25,䆓UVz$2BO[\+aFsmO">[)⃚XtRSΎy߻G'R =,8.̬.kIa}| / F@ixLt=bߙ9O` gſbJpƃ=9è=h]'kaM0.x>au3)\AQi4GY! @\zè0/ aOM쿁ϨT?(̍pKw7tu<"3_> ǟ -cۯGBn&oɓ 8GMnf4 M r3sG'~MDqz ZG|L6~ATf񫫟U5”ue%X9 nϣ;۹;:Jo&PI SNa)󞖪#K)XI]% shmEt 2쀜+&$$Ȍ~gHƻPK0 By 'EFZ nG _CƉAs1`nsp(C;|# Սd Epx= /ҌIz)ęTR4./ꌘcȤ"=JCĎ_%F-aS7O΂ 1ϽF/#}ƚbL 9-ٕ?)SJC9HW~=ۗ\Nk۾ׄ<vUgiZi0eپ S4}ca)>wl\쁡5y@~촗”)&)4u%'4C>i353b^ES *qŊ)}w^aLW}OO&HuY;0eaʵ S@0ea5>>_k`ʝnZ6νz &r)M5:Z}Q0Jl[8u2KDtSsQ2ڴ9Jm*`>mw#! wk솝 ޫٻ ,d&iBM4'3VW@c*Z~列~$Ő랣SBO.&5wF^Fm94LИ aM4FҍZw(x*z88l01ZW4\, o,6# z#('gY"}7"aSWH<#k!!$1M' c}}O.i6e/ p]hH-\0$`HB9-1$ /!@3!{E$59I+|' &LG`Ѐ5bOs/v @V;<5LA28<SLdrcR%3ZSڏ ZFa+G `W1=c`E6f0N #ZEHby) Jy2TfGp %H ʹk\@>b! B_C"s$=£hYC;CɂA:_g㖉D)uDc%sʏرkv E*?,y&Leˠ0Jlp&W0ea 憘lߓቝnd9y:ů/Aj@L@8Dj'c%,G SjSh;J7i:iONAbu婆c0!CIgHx)B_i{hι;a0]7A,^>B[iIb9 Y=a4RL774^hw_x)h]2J0C42HzS&ջfh/CЙة ^ؾ "1L8Z #sS(҄|<~j9/!,[7ʌ7ú4jaR䡄ԐN apoyaG=!Nft_s#S}:Nk1__a4cH\6]Y]c }XPfP>:vPl IK⒟YKӡ(]@>3 r !fo} 20b9͜Ad4aaSm'Rj? wbʵm;o|df:Sh2MNNaʕ0_{R$HH;+S1͡vpi׃mmAy -y 7o"rh*,HX:bԤJ|' IȼM/MW#g/p?8Y MPb v(q::7"g$ksr+( U"1J2LGD0Y]S 1)ftFQfK%5 hTp8 K_0%S۬J@!JڒqSCtW@o죄uFZzzn8?dDw %mna7)IÌ"̈~^9c|<|\gr SN;)_{S0ea)7<1(sdBv6jCbj^m;ϡ~G%Dt F£nR2Ze!̩!+G#]>;],/NA- ]GpDD~ 2WHklM?e}sƦ/z"L,66#A vq;PK)PA=;{H38lA)P;hMj8s #_w[2 3'0#zGK 5NEb" {2UZG$ptQI>#`ޟM d2q(IM3Rr%LYq[Z3ss ydebGj&i'26BHx83TA\EeD_dh|&)D㋦>@F; kbO}U (ҀG>ʍ\),Tن:`eztX5ŝ2D bD"]&]<,廛ޚ?eW, U; 8= ̘P;#델ŝlqoLtk*)-81dEO܃!-1fx1՟VH.4 #'ͧz"nCTdGs/)DJCqÑa[5xXiD@>L_A=S#݁ր$LonhY,ͅA#g7[4EO,ؠ?6v`M;a+E'an' S1 ʁ#ߧ{uO3:@>ǛZZĢFPi9H-zp#\_OD70%Y0 gڼB]'Y~ *\vC7lTw+KkؾwiU㥁Nv0j,Ly0ea”)/űe;qvD.XWS&l|)%<4vFh$ uL nH9ޗ azba{m6Y89V61T6 bSgAo4,6V (:1zv䔑1 -O$n^r=a^k$&`=&߽ݭsn~ ŝvd>1S@B ,FjfI" DĎL~"-K7",*ѭm Exv&}Z6huE G#^4+ h&gijtT+A96T8NQRXc<<) G5&B!$d:RƝ1|#qER}_ 8NFNUĔiݧ xџ''2=J` 2鎖vFvji1Z\B/`ƪ@: 3xX>v"K-Ƒ^>^S:H>nUB̸"0V+WS'b4jh\4i%W{(k&~X*2p], 3ʠ̚a*Cd1*01">i`Xy0>z~olv?2Qyu" `ot9ϑb ި_tw[Oǔ2]!Lt>I(]J.K3Q\ГGí ]R$~~.#@Lr)J,p?WH6elZq+<)`)OW SFqwF[ֹ(,”) Sn WyY>pZX UY/5l;in !urX#ÎUs)O_ [fȆQpQqyJHE%i#|hI.V7^'3#쩖}JRF"(tTT#߅8kZݣ"cʖ y0~c}!Q᷇Q['?6 , 5i̝C ҖV{J/6qhx4ahN_/\#ў9V]!ȓm囧xt8<7ǃYL*aU+(OKoEcFέ[Z&v4^G)\%Z#((@$ >t럇9x=IkHs/4ym@{ !5\Ґ Di U|ሟeCƲD:>hJ ;C䔩~8 Yĭ;{̽a7P@>uϘs/PS A Pϑ7k#X$Î 2nˡ$x{K;#4| c>mO h*zb.$JQ-(GׄJDvPD le;v@tyM%j`0g=kVuP(MaY )078 3ch),@֯ gSϏtRS ]!3;0L02]6}mgr@u=&Ai XK"70HKėb+X ?KZCۨ/,L^BВ(qj@ۛphF!ȃp)(ꅫRG28|(OI\'CHlELrt0`lx<3&3r$9Jcّ;Wk (sե熑azꘑ/ljʟmڐ,Nwj4px(LyOo nAO S쓸o}_3O l>^ws/LYrxѺ9il1446myy>h#aBh:5HyG[VLn$C$'pLk,Ui@7#l H(O U5E@"br !0H0%ۍq/x8BP60TwOxIFR&8F(%[8b6nأSsIDnq4Z9;)j^IB`^1/9ң ' IG ,y}^}^%xc3lQi= ycwZJvf8:ڌ6i*"9Όѡ X󢟔/Lt DKFrvo<1M۷eu qYЯ[rXE~nSFi(pL71Ën&t7F,p"e_}@* ӇCtC}.Gp #/L-GZ8w_-yb~f}cnH"wuH2ͤi n6h1eÎQSc*Oy}FT)Ծ~!ny:E'n#*9ڦZx%s{ (#}-! wB>74O9g8"<\)1Ϟorb(IfBhz1\x:VڔK |#OF[-SW/GL_ȥbĎoE47qS`S=2>}H)z<ϻ?83<bABvl8 >p*OdpZ0u&A$OZDluy#Ĕ1 si@l ;">֝مv©6\ HyFe]JW/?2ҙyZmޢ@ lM1UJ h~GÁSߺۣ 홌tgd0z[ V=K0ȃQ==p3`(Lb^,GfHoY=Cs.Ns:LL/” 4vJ,vl”) SNY;05A 5h0JσnbJCly%|<pe%WrrK6 H'V$% 4a0E0!O$7&K>2G?"l>m\P, ̜?~\ ('+a$W6DF%a ;燼3L{ЇMvK,Fjh4s/w²!1C/)%.3:٩3\9F^ʼv5p^ U)P$blFWf,яy4|OqN#u MussZMo<`m}y]ZH7jrM^*k a㊼SV5U@aʕ0_{R6W2O1!_KcwnzaFué0}f pS@$;p Rw@Jq'6}+qy6v{SDs(A٣ n-'-`bބ LSoBMkГ2nByJ7 4DQ0SLIal˗ WP9;20 x:2 LIS] hy +. gG ^ý_;gy7}pnxt'M?"?'Bs clfjN=(6)ӑזw/Vy}Ugi5P04;hNJJ4 7H@CmRKiDסPFXf!o߀ "%%19bhiUбjOa@X`1h^ } ‰ n;>V{*ֽ'/% @U@p*U>B$婎'_{0 jÔ`q@~u٣ c6W!/T(o9o#+;<p1P$r<‚宜awLλBbl u\cDŽ.“VSKaKbkk”+aʲ}o)= S bn)}@Mhbtƈ\Wq=Eu@;-dԭ܏U>ܙH#u4R &7 ??]!\ aiE0JyD e&uj_`A҅\S^jMTM~a)` {7sC`™i)8tZ3`.{ 8<4#H?BX#r\9=bMneiS,E kzx0?i&$Q8|'/M. SM(?\'rBp~ %7/,UBiΠL6!b=XH],$5R{=rT&+5nhf8]}^6!zپ Ԩi6@+[jF.kc`2h1L5`~ FI3mӏ{n =7`֗0a}(2cPvG#?k#vnX!mfn0o lcJBS^膘(!n B]T;3 0R :Sye3d?BQ,x_`[B;h+vm+v8;*-xf-zF+%<+glZ@4D(##Dlݕ8ى[zpnNЧ{TYnv߲wLI_#ἇC |Qf_tM@BOS)Cn hp£{ñRp<#'Nmuqcr7dGCy@d^66 EM݈S|@pf;D#oF>shBOJDZ"t+8} C?xD4R tDPe> W`%rOh(l l} Z'ZmFę=li7ph`,z~tU Qjx 7)OaL-"04: ѫͿSRJ\$bMWTwzꘛ?c3]-͠.A>RĔe&8Yؖ S)sn/,LYrO:uS<嶶j4p(LYrj]x:0C&)M oICJ%O&{4JJ#,Gy|g`עbdKŮ-dž@QLJ* }R6q4E(^MC0H,@x Hӟy@o&3; /f̿}6lMVxj5d˻ZrLdz~ԡ7JGb[&g MR<g3zaVl)PFC/s`NΗ:zH]x1=uKDw-b^̌$AJLѝwIx\H.{M]fF(:i^k/ 5”u r z&teK_4wkFрFRktP2#~`0EI< vD=C</)`ZDYgOޞ7ÿR2b8ꚑQ~N#a' dTGuđmxU*>Y:m^hHe6hN5bS@`Q6$\h#1=^GχҐ|*3$JJ.PfKL\(l9ERrbqI ׋G[`jyxÝղx)MwuT (LYxNj*LYbTr_wOyv8 pNRg(Lwt_\fT|)D-KlxN6&H"Y(Ȫ}{d TVGĺo%"YVKH㎾𗰛ھ0YCc Ĭ=`7kAe*X Nx"#kx76)x;<&WI0|Z- )0G)!k3(i<;5C+0BTT4(9N]7J"4[ >,GC"%eI*J sg6!u6ᔫHj3՘Ldyh,${`)!\;{g;i 4Pfem0^m r ׳-#!:!;Yŋ ЖkH#C{2 ytT;!bMQy4/B&j" Ii>|&T`DwhdDbx3rG9"L۴FG#gy1O#Rk$Fnv;Sô?ȁ`MĉxHvs / pjӐc AlFOv_$3|: ˖\@%S#. ^L_=%qa͟.}(Sw"A.cW/EY| #{W,o)+ ]j:kxʕxʭ|5_z#+C)nm) SYn;g?s MVJdi4p7)1Дڑ0ur4sG)CvJy=HTFT$RF%G|< 0BFc y< 2zd &/DFye?Ã=?GjM6@m&o_ٲy,PrH?hA&cLԌJ>շp B"u)7 'ʤzO,IѧgL8;O^ d?iJa72q9($q$\r\iC:ɈL^SwFd bch͵404z^)2q:Ѩ/ZҙihyD!jNMߟZtoygDelWPgXiEf46hA@Eʌ9f;w(z € PvP8k?eHX.Wb!rqW׆فnYT7kg<0T&b΂c7$CbڸiA3ۀ4R\Eq U:mMHJq &$7`9XfQ]ra!2ؚK4,EK;yߵmS} cʲ}V@ix/'b!F67AIC&D& >Kt8@VRI0;ʗ~ھk. Liz٩ފ\ S{cП|r.1FmXƧz:tZ6;")R?48#KVvMIj48{d"/=ur;yIa%^09W+9z-=O344pJF[Vo])r>z-r?)brmtkKk)g.t6#߭[9r:\o_L㵖4z7XCϥ.t0BZԗv!e> [J;bN8&b^XZ1x)h3% Г5O>vGh _ `'J%mǘ<@1{h].!fBOzn2ڵ]]FތL,R~3Kۺ}R9~T7Ĕe^o^Nl|We!mgb”+a Ƹp1$IOL..Lfq$5MN(@Ę M40q?28 $FBQ֖6ýaמ hD JʃjjŌt-1'56pھ1Ai0 ()?=m24yo~l.GI6|Đyie|d3y613@Hn[UJw&a#)=)CɻVqݮ 7!\ `~ iƉXM vt.p}1bd*)eA:##$a74>4v"#ɗf盈'aHT~_Ѻr1ڨ4#=%ҥeEU}+$$uՍV+)׎Xr`'X_0eaiv””@Yrr+fu6/36^0”+aʲ}oFR1IHHN%idY6͑ qHIj4n]X7 i4GH2T%MN=9y5y4EєCf!% EK7)7Q:f &mQ"^L7@kMLO SJplKޢFF2ȏBi7'$2Bi {n<6*m| =ܤ8JF|>P->Te2ߚ~΅yݦ$v{e<.fK%q3)vJ/bʵmiv &bLzYO-i:ZO +*LyOo 7svwp(ZqL'oeJͷe U} 7]w|ipJk!b&y 8Ͻ0hӭ3ebʰ8sP!1cG-1Fkqbh`5N]#ur)i n0kx姻9ӀhPNȈAs nFH]$nT=M 7C@?ѳ LwVOĎN$QD+*Wڵ]Os `1WQ]\H׷F|g[Yfk<^VܰJCz4wt󾧅S H(&2Y%@SCD"~lIUh@!e1QI.t.[ $xGCX Br\@=>\D.S&V/3\E(@0b|9#M5^ x*F xtdh!PRPg۾w/V㥁Q@È<+LY fM{ JG1;mZ63}LM%$JYJ5YF2N2B9\i; 9א&=2{#wMNHx&.p˲ڦ,=9EP\BP-fnJ=xn49 ̺L@{@Hd@tG$TD hno^+|HpJ$qEғ>k@AM;8wџ!ӀL>%t\ /k3fFqMH|"l#@$pK#ܼKPEJW>Ă\g|Xǝx1 }4匘2:?Bh8DXn;\!VOnu6!!͵b ;UZaʕ0e}oF$bJw܆˓=X2)NrP=Z bSEB\e {D2c.("-&LK%J뜟^<2w@oOv %)Az."OiwlB*t$u (ň< ;%#5""H$h@,Y,KyvH|&&FU">Vzl B44q 28\"rbBg"\@a*\c} i&ycS  \c\$oQța3onoKc,j2ye>)] R>2٬ijOZ#);9|IMr叢ˤ.%y#G2v#ǏV SN'vgLd.Jok(|JZ<mn0+B΋bʲ}oGC!6L4 pfDiRלx:Gj4]D kڊGF 4b/@LbVf"[7DjbMwpȫZP)<R̗"x-{CZ,"@,8&bvm LpOS]u2 3MK+k?hq^䯑Ɉ-q`<\]O}.) 9ФSmeklkT`"SNg We2MzJ}8wx@+ʋb fppDo…qVaDnb&kw2|O\ Hz%_;Mdi;{_b:_
L͈tK7A0$YZ4ldY8Ed|q+p:me6.ΩK$L`qʟ'ʫZ);:$c8y k7sr6Sw+<יL'ʩYO+)`2!e2W+L9-,L9b”̱7^\G{2(뎦܌ÔH., 򢘲lߛaФ|NҐKlIhdGKe݄hL3\'=T4f6|j\tԀ08bEp!%X&-:E>2 '29%W, ϑ5%U s^|z !yƼ/]A&~.6}+gT}d=sゔp^( U)w/j@)Cѡ]*aʇˤ<1:ŔaصUAכ7->7WŞ<$^{2=y"sm.j4p8|0QL%n.bM6[( @KkJao.ZlWwJh0o5h0J6oa+vm66>PqlD6_[l>[D6gپda SVΆJ)v^, \;<䭠V( 6@aKߧk)/YK@aʫ8K”jwɖJi05U@a3ީJu@aʫ8K”+dgYܭ mmo>PI=檨U@ih0JXqnj~O-Ҫuwi*y4p(L|޼k?c_i8^AMT7oa>)/}rݩf~)WdWJZ+6PK~Oy RV@a*q@t*M58/enQ[x\e+2(Lݯ}o>Yܢ2SNÄJ( .”j*}nQ-*1*\( L”j*}nQ-*04;hR( (Lݯj4P( ʟ@Ci4S”_) JuƔ;} \ SnZ+ J50P 4F43&PaʃɔJj` Ly[cMa D{Wna~Vk@i4p1ad<y0A}z2~Q_p~kpo~k-Y\WQ/:cidө,”|_-b Un:@P)vMu~m *]SV;'t,L>Z@)7>ʽRaʍƯHܬ<خmG:,n٨RV)a \ߚ> S]+  Sn{|vq!NŔص2hmEit߭}Gn8 46%}64Og^v”aru SKt1}hIUOrV58 xz_G+H@yW+wbOrH&C@cSLgmpNNa;H~O)v}ņoo)s}eܷM3vZ?h@G)7BuU MxGCV]Sӣ&l貔2"7P bSNOidf:;0_U4P( ;ݴiPdf:2ަhz+LyBͯ4P( l50N7lĥ<ۥN Sn][UKk` L9N?A/ao8 4V]l 7u SP+ Jh` L޶Is*p^4sАy”|V@i4pOLy`;4h^L6:*LyB:jUx{[yq8Ĕ/iPdSf:2ٌ>”+~V@ sS_Y@'uƔ;}Ƨ,MgLo0”}/W74B0 j.k`?14e=zT/{”]#( \Pi4I">{׾mo&Vq<: _SNM']L3zLo2(Lyh@q1g"[}8ZlCk`ʝnZȠL'S”ҭ6Jk@dp\/r'xU:\SNON0)FiSL6ChK0Ubqk)iBa=4tɞSD)P=( O 9w-=,VV'rOvj`<N{)Loj40py=Dέ0e}OخhSt=\Bi:lLNV~װKهJFk`ʝnZLڪPftQg”fg^# 9:azk` PkTj``iSr_( ;ݴ&F-f.S2J..”W^( v)/VNAa]!W@i k0 5(Lyk襁@iJk`?1vN6m[;NW۾_( v)-)NSr_zi4PΘr`b2XzLQa+m_/ JuƔao8ɠdmtV@a~W륁@iJk` Lv5W>WO,Lyk@i`XSZ( \O q^( SAu=!Kz5PJKn5ZÛF;r0n@i4p5UU S^o|i4Pح S*y”:K@aʭ`iP5PJKn5PPWi`(Lۯj4P( \i [ U)} 4P( Vk` B uKy SZ/ JWZk`+)K5PJKn5Pr* SZ/ JWZ),@a+m_/ J@aʵתXnXS5;[?@i4P8\ )W4P>c=sn{f)W( Jbʏ_i4p]551%TeJkBJkH PW( J aJ+ J}4P( .)E@i4PPGX( J”J]h0em0@izi0.vj4P(Lymi4P(LY{i4 4P( \/ nZmJ)^R- J)k/ v”J륁”M6_x>?xR5~>5Pz%5@i4Prט`s?swuw~w}~/c'XnO0em(@iZk0>7 bv”Nן=?fT?Sπ^Y03jV[NLzڟ;Eo 3b^,ڧ֦O>w|9AgOxnJ@asAĔ_o>/l7}_cm~/G?"wݿS}6G}+_YSfך-X륊cfGe '}l,i o)Kx8q1L)|0em@i4pK <nX@L>o_k:ko۽sϦ~~9F?{?ַ~hj1˘pg1xB-/ Yo\_`Fkw_ D|WӔxF֜qvċ4P( \k 2[]Lŏ+~?I O)-lsO=}-ѫvGf^gCGy77vݬM/['C4Te1#ӉxNO{FN8bU:{)^R/ J)S>a1glh?5_dFr&S =yg|G<'^6@i4p5PrCxnu1}?͇S7K~{C5saFr&=0*ݿ-o[S/Ly|i4P(Ly.(ܰ ?ƍa}w? ~g~ּ?͌WM-v=3@i4P(L!d”z/ɗJ”*P( }R(  SYV@i\ ^{IͶ4P( _G UJ2 z}ll,2R[[k45#IHHXv-ŋ͛r:555 B;$!YDH$[ D0!B/!(3K;L.H^NF֬YS˗/wt"caaaaaV}%4>M(*J3gΤY3"iTA~Qc !h(-Ie蓼R07a%!v{AANj;GºqURRzýP&={6%%|y@3`& MC6i1脮T&E"JLa݌'8# |HvvvNNZ޺i=}͛*,,,,QYYdj-T*Ԥv4ykPIhB ! !Q"":"dN#"38Գgf<}#G|>d1!tJMFv`aaaap8ݻwۘz9+WhȦ,Z)`ګ#g>1_ _~1B3kf /|[z/x0g1O}|>ↅt:{Y[[111.\PTرcĉ] 2{hTRNW n愠S> oQgS;3?vy>ڽ>}Kݚ7qן?d2ŏ[cM.B4FOYD;DuKT0s^9 z2FHHu{5ↅeZ߆/%%%>}Z66w.DϢFl6'N" |C[L؁FZ4y0C ?jԨzjH][T\5` }蹿{6mR~ƃ6<8>ۗ&Xjed{ zye'{ݷAz~pli9&M^ȅW1;Lrh3>?9R'C*nXXXX]ٽ馛e(!5iiiihH+dĸTs@TߔۨIiE}{3iԩ`0y„ ۶mێ= +Б VŖ==7}/&7La]vy k' ?d=,GN];^; 18ڣ<֍ ?ȵl꼯q?`Z= s@/V}=O>}$IbpʸaaaaurQF LݽlBƼ]`$~k,Flj^}EGej.*E&Ir޼yr""VͦZU'NW3|2ON6\5f#7GKR\Fع@>: 62c!J585~Q %M . o&o( i-Z/yF@n{'N_gR7hlK##"@}Y{lMFߺaaaaujY,Bnwǎ49+==}Ϟ=7ZcIAFξTxA3z-/]{ȵk7Jץf7o:6EA/vvI|g3~ btl.mFlzvM.iõ9aS$*ecaaaueYo]`jsN]{ය X6s&p(P&z6G"21]hS̙3iӦks~*mSr+6u^ɵXXXX]Y6n7333aV9l{m 0-eL`1D !) YD͚C}5kV?쳎Nd,,,,,p;`0,rՒ4bٷop^F^}(TFC"vjn$AB=Sl0-aF}A8J˦w4gΜ0XXXXXXaH& 2D?>hFysqe4Zz;,,,ҵ+^?˖-려хu5Fa0caaa] a0cQXXXXWCXm3s֭[ wvTT[$ejꪰ /A)08[+)Q'/2IrNv!Rն>vIR^nD"H$RDnWѿ;K+*~qۮq+ȗHb v᧹dZgҟ1pQ>A&O-2UjjjΜ9+O8HeޓΧw RօN !Uק' \W̿l] KJ: ]u0?6R:"M~5+'N 6/Wt ,HD LjDfGKm.U*Ҟ~QvnIM矇s!2T"!rƠxLĘ?Q9th\pE8zJ Ysm e/j=fێNcxr&*MU+}4i{kͤf7qc+P/xɺֱ90C"kFT^Vxx.ФOQ/ KzC\: Y3rYX!k nXt:pam#\0HU`~Ę6yʕ/b`&OӴn]f^RM,ǻٳ$߸QS^.Z & &IYR(;2hPTVf|]1G:hih{RTp8JRR ֶm׿(=eX[FAOkskJwJu)ep-Q{_Sd'']ku^c-s/ |~ h{O-ou"0h26R1cdlK!'`zaq9X曯0՜N=H*))NMF<kݻwwYi=T]mi}Zx̶0`~j]޺6*I2w޾g6,**gL5kD11޽ɉ)%ܼY{?{wժg(q:5y TMXM^R׬ᏽ}u>1AomIX} E_t`07Km2ٶnuu-gaGY?,JMTQ*Þ6V0yfUUE5;n'O^о[ýŦ_Nh. 7s`nlů[$r -&6$!& !=5cXAt`xlxؘ*g^iНx</^*--q9C $1~Ǐ1ȴjZuZƎ OwPr8l1Vsb}BNXƯ6pBSKK^thMK\fSEkg7`+_W=:=4p;矟:mA=7Chl;wNKOOST& &<&JNguuu_%0;<|MB~_VVf{|0ý3Џk.о`}MnRW%݁as2dټv&ClԻ&of[] HrEV[gH ۷/tpϾĞc0uރEΙ|#}*eW-r[_28+_P%$GS-Pn7'NV6o޼hbwB9Mj2M{[Etk֬1cFC966VPxIҨNgJZL&` t+ul;oK"yff`2ŻhQҥb.󮟎4t|Ecxguu|w\nrQ^YW_C8|G//+3o^Z0fPtySO33 kc̞MO6qUOǼ|.l39qT$E^Xn}E*++^/K_ =2ܴUFGźYx{ T|յ<ثW5yakVT/l27 6}R$..dGGiq)Q2e8&iжF#P`Z恰2U~[$e45v]`D=[^ʛ_c3KRLǟZ]ʤ 9ݦhŊa/)-}GQ,i ŸիSSR#}SI|k^~<fm> y<*6Sw=x?%Mgj5wuibsA͚W $}z7w67oGE$2y{oߟxgxS{S{u0/\pO~l6bмb1ٳ3iaIN4/\h4*/|SNUgzrC`]T\UV=p<-ꃹR},OBx=n /W2s3Cj? QfQiP}՗_}y >KeM7d9,+\0: 2MhT΢j̯ ?_)?} hb맪~ޚ:3323vL5<0cQ1Ąݻ]`ZohrߟrVErտ%JM:(,tqnyf kNgM[=6nzڵIj"$j5 fs)_ی 3fo1M"n]A>hG?֛[NF,g6 uf+:j芣a;z2XTW8 ݞnߟ g? S'=~6==zocG=..By-jY azw,YaÆ6$,%n^]#sۆ? 1Lfo^ZSmѩ=ZY4}σn~ ae0&w^)츠p~V+AR̌4ݞWIG|I=CږUQFEFF6VUUtM$׭,c zMݷ??%9[T:zw%Zg:\vlm3*jH_on=1ϝEFSR%MDiṅhs6fbI{эuݨS,+-OLJxwKK?|mF>s'GC\̰,c +=PoҾ#Gikfjkk/^h2'O_)z,h9##RttR og 6Elg)z`ARfp?|Z$eMjx`6_)f =$~~dG~h*tʥĬLޢlP;w7o^sӈarr› Xz+2!Ad tl)-U=d>bѢ+S'OzKJhLYffBVI$9~NvE`ϴɜjjj._55́?"M""4!Æ?** {X)q7 r{j/?ꖓV%ۀdN\7WT ffj%2ujF/f^A**.}A͜1ePg^cBj uoQ`n0;PN@8Ё`ºAF] R l.nԬuJl.n ѵڵk%z}n6a.\ء x 1caaa] ] 0:uh4B+C~&,UTTڵ+::u`º`2ǎ+//oxGEE 4gϞXXXXXXkf,,,,,,Zb`jwa0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"a0caaaaau"(`_º4eʔZ$[ &cbb::׉0 _ kaÆȑ#qqqD7Ng}6gΜW[EcEucEʘ4 080F\A"2"IJ";^qu|āyS RrEeĪw[doeԞ`z`fzEǏecQ f̡^IS_y%vd)fh-eI:q|}7uBuhwݘwh2LsJ|6:c cbU0;RSS/`^"pŁQkΆ~XLoƇ8lTVV[Vpab#MyV-mYXXX]O(̋0L|9׵\) s`_YÎ0`f$n6ojmڴwC_'Tv׍yv+cy}H0`2A0:Ǐ;#D9 2m`| try-fR̝ b  OC^ +!C+1_Jwy93^s%` 9-90;pS6u)̛By yРA/>q޻Gc~TvB.ozR `MٝG]4]7]4ڭ9 By: y| 1'9&s5.UZve`svC7e mN 1ca]BMH0ߍ|e`0`MQcz"R1 \`zB-$`0_ ?L2.&BꖠKrn\0_ }P]4]7]4ڭ9 !<sSխ7]rPl~$6 eFG,Q7.P0 ۰|eR; ccc;:׉0P0  fwC_'Tv׍yv+c@H0`j*`޶,u6fcʊSZ}Ys4qܺ~F,,EFF6šf`5 Nyo-֣9sVa#{ Pvvvs/={_Cy83VWSeQ]Og`!b1|X 11{⋎ō.m4N$IE|4$b0cu5u50l&|hD…ʪ e7~hln ܐ`t973taMZVi%f eG|*$_`޺ukGG]$hF _u); 1{d؃(vщ}"B?HDž E /@܅dH3f˯xB$aq6ΪG3_\\KČ5R|YUuNƴ'JJԠJn Ԛ Ɗb6 hxH l62@PxiӦ}vY3rE= {?8D "e?+n4cP_K11an AR@H@Vso}Pi]P>6Vwڷopbb6M_!i&X}b[#_[ M$if#B<- )+i93 x#f6.<X]B0pY= vzeOFDp֥{rG4RO-UL:U9▟Yl:M̦ hgI(/+HؼAw7F?jH2aSSӔV^^~imj1 )-k>߰Zbu0=;{,,#))eŗA-z8NusPF[Txz[xB0N4Xt"HFfqĞEN1_A8I Ig{i-δdKLa]RH 6)68S,&&2(fS*Eg@$+dP?x*|br+c*"֚.+T 4TCY.QB $DHi"&)EL=S59QU'盙*ȰULs隸jߴx2Ik=Wä^'f* vRlyj@V{9cRI'K}g⦕y1 uYRv_0H] \;[L2Tn fSUʦOp&)Q![PBVbBRxw pɴ빞=VgSJJ .ō>{\x{ 407 f{X6qŸbKXS(S_+bRs)ր0KŸձ2(LY&iq^yi J\ V^[i/~ T> TW S; &^ & Nlj3\FTwHނ@G4ʴ >84ː]cZS|eg4_ m<*RH0w`ƺqF599` Y*7D]94[vhˍ4-8BpOPrzG,\5k+#F6=TχxS`йa( un`i\sa_0^50p:\NzN1ᘙy짪{/@_9cxWFjxB I <ל9s]&^8DuyJ%)ܭqjYF(!^)wmERLoGjNmsIE4 9wes'-0&b14Z# MYK2D2VI-=~96 gLz[x/Xf* [).A Rhɴ?/ޗ-ogZp-I Ki| 5'@X!aj$pQovȝٟlL! <I Yf|>"yI{BfVG$5 "> dK7/M*6(݁0ϟ?y["uFB9?ޚ }&TWTh WǮ­r:c;;0[P+e̼}{@fr3T]ȧ̻]Hi˾{ЕJC9XtuH7 6K,s X7f.ydgA84k%o3tv~F#z.yd=DMӹF`nA-jWSC E˜d@!= H!RU! WkHI9-1oT|r+_T[f$>:gց2~e?N Vճ M>P%U~S4$xdVVd\NX;2p:Ai,oNx0#EV}e> ^DxdlحcXkbRI|ꫫZ\J90tðprę_7"L+ `E#ܑH+4K %\Xs!WMHU,Y08n c,g^2KaFܐJXN]=A]QgA_3#w]6VBPXF33H<93febu X\= s*3oovNj zh+:]Ԟa:v,2^)ec \T.G*D"3BIVFy7 ם)SO8f~jF/{,:H~VTǙ>oKI뼪 G6" *w3))a74es,ϸQ͓\g@Y~%HƓaB[ 7BV_ϓ Y@Ǝu'sSR`34oloy ]E&$ 72,{{6f"y()/Ф)Lny=Bh.Sc+sUVrva0V4e /J4FJRHxGu2Ё dd0L@mr홂/F!* u||7$ܥ?Taq3g/hh{u[TRj( S/[K+#N-\'o'zzp>/d+4n;sY$~QrYsR8y5ړ@Cz[ YcWF{ :2Y9,Nefη3sﴹ%Ѝ8W2))'HIO2_ ['k,\3TR-dw+QJ|eR9x|™3*.ٜWj8̜FGݼ+/{SiX'ykIݘv5L{ ۹p^VƌHۉ%U΢X8ڋEsYQc%|v)Sk r҉+/_+_:4|M @4jH7 c*;;'4M!uÀwiΝ;ٳg7fK]]>"BI*L*>7'Ýc6yzʶ+ #YYY 9?Q ѭwfUV8Ne yRRH7qfaJ;p2`eHC˭{+t*yqiFo_,pO -*)X]eLЋp%i-K{B&iJש|^?|љ'D8~/NVŒQ([А#|̠tΤ CJSյ)v$|+=r0_,ís)nO=7s-Ò܏ wp##rTn'1ϡ^j汌OktI`pi[`FG)\3r{D^mçVܓ:Є~Z`K~]}yOEXuHTr`kX {kOIhL!8ղFfːL"AvOI"Ӆ qsR"^>^60 W?G;`8c 6&  IBH_ܫCGbS%$u7 {=H9s|(v%f͚&Lc*sZk;\̾M#R2 no}trf V ^qP;6:3Z%wuVEcLJG~:J}E Bi eG??_j]hd޳_cDXo$-%2l &AHFFNtCĢS|ܼfD}yl^yGy\4}AΠZ-s8fesԔng!Æ&0x ,Q cLEG9G76΁|[B_]o6`R.cמw.HS!}Ԉ:@E{Wډ~[rG,T:]ô>Ǫ#k~Fs:Fc ~){lv'֯_-&hx<%{E@ w9I>QTw.@53.?7+g}JtPӱwvXRB+q \Qmܹ) \|#.0R ɏMO\@?8"O$~'| $h̎`V0`00{AT̞9sfs`6g]5WU7$H3O}-#ozT6#ϸo:9#A+96exYf6r%]`Fv%0C`XktWW3*0CYqÀ?1cR2CL(4>cb[- n{bRR #>VsέPt\P?pM܄H_ F aӫ`o *g4.5Z -D`5dKRw(r% L|"h,@@lӢJ&Q rt ZZ_C@d.%x3iVM%6;̂>2 T]ݎo ̮#]8(wx7]v<((J,7 2rzڱC5=~,qS3&ǚי]o[z_Y. }+ƛƑĜ%nj&HI _ZBТឮܦ51Z^<*Yn_f]I{ѥJ2eOI#N l;K5 Ne~hAn+32gI2d87?]&S3iZ2[8e]NᲐ(dHO6ezz8p4_.y_ؽ `0`㏛l 7M*+ۥ[WnQCƧSHCu=lWodlX,!o6ְ#m2sKjtHpP042 g)"@&p#XF+|L4,b@.0^)?h㝞H>kdJ4`1d$]"]Hѵ*Ѫ:vi0@8k1W j1qW<$RJP[>yMz32ڐbH7| dy|!JU!3oVvL30o[]3W@xXp+ڵk DATaB̠ym4+ 8(_Z6|ii]I-FF  ,h3@fx-t ~YW\ {`xt5`=]7Q!Ev`KS-?Rңd qTJ}Є̮;VƠT&%C JrfF[W1x|X-eУN3`:o4I?y C ۘW}.ŋ!}e=3![yJ.ׂZ3pF2]DȢ=^kewwDe@Fn SrZ]@#LY4F*(2p|UЌ= ",Gvu*Ϗ) ߢ> FFb -{᩺80ŨNU}clsƸJpc6T'ȸO:ӫE.Wb '|J^X5}.$;<(1N"/Б1AǜHT[v,BOt7.O%ܒ%h?Rm.? 5tU ־F<()sI4Hå3MD"L.Hx#O j*d~7]XOH tU2=:tsdP`˯ssv`u);mZ+ PjES(h8ma iD .5/$qV28i:nhժϗ,ÆBlYI-5<3ʁ F%H:[2~5@#\ `w=fcbIGG/3ÎdTUZJAL,\.Tb9`d Xv;IfHPU$'D\> ӆMF-I`HKd3r#!DVm)@*v,;C 9M"wRzdU/D [-f()X[%Ϩ+a ՠZ2~oѱ"[RJbk|xb7ejʎ W1 8#0k~[ 9Zu)xjX,zo'\yV*dL.0烰oeR|-~ fAUqA BbAh%v;w#( )A_dcdSHB @ 9+sB ૹ'nhO .DWluؾ\} N.Oձ#SNmͅ[li'#H#㱅6uAy0C sBP`8զQ٬`wAN2] =ܚ17BElJ~=3 Tt ݺw'KNзcn0Cu9+3z#dze࣐A0 My cneH BL7̝;C× y`A :R@0$xw}G,׭Y`իW?# $($"NQ*I4t{dM) de ajB, HYoN*WjruN풤[,^h #fz+>pҥKYԡ_")'|H"OM 5Hd`UK܋\\BXDu, lwP7`SIŏ|u ( 4 Z{Xf\# 6c cn̅Fl#Cj[yVV-^h)n.\Ký{[733d-Z+ɞ fT$ܻKJAH <ݓ<&3{3|0nݹk!yÆM[fQ X U2$v)+S#G̬;vm,ܶm xȄC+uٓ!JM. zWXm[\ܗ|=K޲a>&3u]?iLmLhxޔ@IwinsN{)jf%3=i 5p\`sh"=VK3C rBKQ6Ͷ- vI_NiƌsldVL9xh`Ò ٘llX`w .*)3t#D.+&4ܹ^8nnص_VV^Q1f4sCD uu#v\ ׭[gӦr[3ˍJKwf= R]Vn;hPyY!CJ#27SӶm[7oީ2t; S{_ sg`fTQaUձi6U1ĕW^/ٶm";y;#9K]v"a=ywqAi,V|?}3 oNЏp<=QbqI0ݲaa*3쵫Tmq]JO<ϟvElx*y/{󫯼2~|ӖMKW5N9z?|]O|z;܃ejiSM;S6)3y^t10[.=7,``.\0~@ˊ7fSt`h;4̿8\ܗ|=y?P k_U*N}ko'w9]~w)`!麿':y/HU5' Bi6\Vyip애.;VWid푛PR2Yܒ.%fLĢOl ywp`<.H0]xHkSII9_9rDMM͠A{vm[G\ZC,);hφ3iD#=jȐ=Wy[`22dءeÇ k)-Ͱs8`˺um?f¤ܹlDyy𰌌T~qlĈ2qhk뺵k[En;kpa+f{ h͛ׯرcGp%!\%|(WDw ]? aAΝ~yp~MrG۳k%϶f .iIeR -#̴Hg RoWmq{)o;=e|"i,T+Zw%9M#.|7$ G$wI` nV%I7;ueo7ÏuL'p9fٖ==4[i%\28 g|ƞ-[]ҍ *6믿;3fDE0[e8ٶmӦM]]MCgm۷^2hcGfl4hP*,Bp\СCŽ}[doܜ vZНC~/~{Q&u_źDO@KVkmh $id#vO`S w/AgO3 }d=/[r$Rᐢܯqx l .p#>̙%@/`T0?w/{^x'C)'==ޮ_uuw{sfw9+;nBK :J ;٠$S7\pa9(Q\mV@r-zgЉ`xQm%b4Uj}DUU^qUĶ<;ʑ#3Nׄ؀5klܸQjȴtu+%*>D:nN/nU:Q i:c.k[)1w_o&Q-uH%|a_I0pIY0b. 󭽆lH*ps_1o}K9[kݳun Ӳ敳 j/<&+i)Qc>w4duAzf)¥i1EW._s- Rͻr 湞z0dȐ!sq͆Ý^D84#FRUVM("m6oܷ5m2ņ{r8`==vCCm ju@uu5ek9#~9Pl\7zIs .`K> coioܛ9;6FeU?5ҕ!(irH۟쌢{w#ϟ/~M٧W I?3>: pgC[0%s`OZUU vڿ s^}HJs-T6e{n|;&Z$*CC 㻻%kJ}@:}ЮH6vXx&P>i]]ݑG<-[a;5ꞮCBuW9醌9h4q#yJ8/٥^F[еZLmmmׯՕgwȑ֭mM!E1+"91̋/13`9&1Cb5sGI4ek rcޝ3̶}@k%Fr:K1eTkjj6}˔z/I03L @3K`g)Yd;Um]tpK1#B_u[sEg'Q J"Ӥois"9gP1c/СC#%XcjK,Ѵy=RBc}z po 9 z4)nc w]x!GyTɥK:"CqQT#=i.c%uf́ϷRmUE;:0S?V- tǏ߲e !SfȑyzO"^z`Ns/"P[$m[()+ܣX_-S$\&C+Vخ..xjv=;mMX.j4TPǎ3tXvŌ­ec^qpkyy귙r >4":\YY)Z;?!Ysz^L'"yz*:,?s\"Ԙs }I8 .G}3t'yhy`L*}y1*U>Hs`sVz2 o{ۄ+WCۂj 5-b։t~ Ut§k1nrs<Mmsgt؏%|Zƒ*יj[KK w ֫$~`l*>cEgյG=ib89U"6v#Hy;"$UUUǏ',]L9˟t80! *)vZyQPJR,Xhқ7g"A!lud̘1TNF=̈~fT__n*/b3MVU!Q a֮T> }3̏F`޷|1g|iT*t#S%nc`{ /ci"(9oL^j՛o)e̳];{Pa={p%tEJpZzZSdGqƍCEqM0m03~衇9k]~?V^"1:b3肥bO<:&ߦS}Ǽ`$c`A" 4AMQ//n+j~ˢjt3Tyf#\bFvIh0 =܋KfwTi]tn*>2w]u2, h1+'\ &ras6\zT0y1/U={I܃D0?VE0G0G0]z`p>c9潔M4=e`A"6[rL -3̌(C(=c'N;4u[OQK{n믿-&]%ngL`XKK ӴΛuGSEq܌C8 XCYLߪ-4 #Z(aNZ;K.+w8S3;Ψ6 4PիW A#~#!]宑qvŚM9;OJb+++9*iآa=ƍs^mJP$֭:ٻms帑ۢ) J<jL)g0j~ffF. I`B*&R>Wޛ9Y49bJQVUUC-Z|yy&,YYlep[F 9\YBw`ΓX|1qWpO+fEmIlO x:EzEj+ĺhq9uD׵Ona܁#> |i*:\4}|@1ud̝)#{GyxJ;eX1Fx0wbq?曽VeI,0f+_h-P@JыنBct}JDk..⪍1mgyWsUkעѢ(Co+ֆv{Fi4c6xt:VCxb+)h.@)T0yy1uQB`NC-X0Ģ[t`E]#T0vy1ǐ\";&GaUUUxL0CbŊ`ggRm[RL$Ck8g9PsD)0_0;3 lq4EY}Ǜ((NJ'`'';)ۜTƨp۠jxϕ AGU@ٴ ʙk?w0_ 8\ܗ##̹r'5pD_fjɬ,f#* a0fњ8mfƅ)]~su\U|ʱ'YfmQjsUIF%xR%G $Dgzر| D"kn2/*Ods6H)|ui(*vZ֬Yi&[֦ {.۔}M*HLx%9MUy?E7n>MBݨ}zDYP!yUdݑKt\2$:L/zUANK4h Ģ N,b)"0/!ʮK0 $8*[ByYڤuwU~PB[:\Y5Ʋ]SSk1]P&Tmp|}*o`o`N"M0ANHvzW?^ ]XlKEDՉ=EV69O#y:-saγPNNMN*wy|K4(10*( a?z1[TvuY;sg+VtX1e555Guel%-S|ms|Ks䄊aHgt5QYވ|D`岧s*bu(TeHߖ@[C03e *i/SVtS%KAtV3'_Ơj#-jFQ7WΏ*ϚSa;fjqTE(A4{rr=hiz8l̷(49$lZ&: ̂/~ 3_e:PDcB ^r*;~srN*=N蝔שua"4Vb lGRZhBS!:[տ7|WږMC8NMbUٴi qhhh^"j!رcU.^GgΜٯC Dmʾ-WD0GɷD0! #(B`V?abCkAB璕EX]k'Y\BDMg~p_-ܞ4gL='~<E0"T0&EC:P?>/Yp K͇$eʦ좂;_Wί-S%}]v%Qc gvYH }O<x`ݺuAѶp<ٺ-l[ #X쫝:VHp"ټUK&`'vu "4zIuDYKPS5Qa6@uE 6O [lwҀ:~x6 5\M{[o9Iߦ쯥1Gɷ`>̟wߐ ݷ 0w:N~ W^ $yٲe&iŗ&d&Μ:4f2FbAy|ms.q1PLc"٪U,B๜ yʹw0#̟`o9Tist94.vNR^E 3uTi22*䣁V!,%)$ >J$̵!#ͳLmPΖA*5CkE&NdP'~jv}\z饺4K&wSO:矯 E#z.LeTXjE}pլ }OS3~Va*qs5u]D>~ݨYf}+_\r_u[n]׾5Me`ÿ/tMgYұzXgu}/.Wa+]׿uWPwDeӆ؋d9Mu=*tR|^s|ˡ f,ٔF8xʍօ^ g|b^dŚvI0~ ťmm[%Kb%3ecFW, r%բC[j*F$[U0I+ EY4F_p =1>f4fqC-FeuaJY6r&Tpn mgYAEeƎ a\vΈBZE4.k(C̋}3_ T0%r(9Kf:,u]:ҋ>.^x`R"tWl Ŭ: )DǏn^r>K<0L?nO~~]i^قю H,ҶO+œ&`+ڼ`VkUhs%b0mQ>\^T_[o-t_*vmگk(6ֆU[#t+Vzm05^__W6n_Ld-!^ _!):1S"=`c`>#9JP0~/^|ej~燀zj l!W^赖$}4g.T@䒕eBŒnckk+|t8ڳy{fYNtGXt ΍RɔRb$7`(;V -n6ͫS«Cu\B= l8Ւ++OyN_IUt~8LtT0ψ`o`N`7Y=nq [=׺uQ3'zgtpNSPofv ЖVQD\P bC\-vt00jJ4b\bݔu8)%uI-Hf05/t Vr E[cM *Dž*EIwK.CoXst ?jժ_|p'S|>yNX2ӗn xP" \"ӤW0K2-%J7/l車s&E7xGP" \"Ӥ[0?5Qwֶk׮nT0]MZD0D0I`~HdHMo" d=њu...I3L@ {Aa6)6m3/cDն]Jx9Ldz([NJg !crge!<1ks42e%a3k_MK(0 yMh3ߴ T5LdÇg=|tv]N*ynK7`A*s?xGP" \"Ӥ'0;Pl2΋b>Ҋ 0y^~ڵk.]\EDRbBUYY$Qp>1*TZ}K/;.U䉬V'tO0Ͱpx{e¹I>Od~v g08fdF<&ULk֬f͚fѭ&Y2b>VZl7ɪϊm]pf+}a{\1|u~_\ιXļmv$`G0G?`Nn_xᅰL{MnߗV$MSXڿ@d4*Ps)ryeS6 }eQ0me,8Tj+fkkN ӷmmm o)KatA kF B5#*AE\Oe^^V]kϦbfTx\s,v0J`ַ9i-SUis! NUKy!݄EI=XGL]]O|[\5U^``hʎo`Nn1w-u](aTr'J\bǹlt~Z[[Pјq{ַί@Fpv'1[" : ;lKsX`SdKV2^yK`6؈J R- YF,,} X:s1[*??`_QE"sīa/$'\e|]w]uUEӧ˿K1E~[/:0巙T0O^^r\*J%9M YBLJXA;/c}u0ly0Lh ;@1l0 .>jc9%󬦃I')k,xLE.qRqÎ Xk9%jePg fahP[7ĎNKr|Hs-*O:g[3M6kdzUV裏 ArfuR)h$Y`T0E 0%& %=c(kQ_\rbCIC `0UId'i %&ԘQ|C]#|6M"s3Zt-dAὸXHN&}ov. UN|YlsG'j 2%6 \;$vMS п!g]2Ǭl9px ƍkjj_De7p~HAP39Y$.@: ?K#["$kv}4śn;PNwSX$c+XUUUYe>0Yl`[KE.qʩ.b- &\)t!uύʜdNNxph+*'A=[Kp/.!w#wXQ,X?8tn6rض!K˜3ḣN#1}\tElo7C N`F&Y^\Ј;ڬ%IK2HSZBG哟OS 捥ANZb6TUK^o0lk0uYmLɣVc/<8xM4LИ-Dۨ+]fs*F,kԣ1C^{믿[ojL}|]^6e&E0GɷD0Ij̡^H ;}I_HQ:ԅ1؂W7d٦kdDAdG2vE |,ͱ\VMt<ѿɴh>P挩AZ|2SqHdKl186.Q: ,`'yu V%v1Pngv]tÉɭPUd!Դj*')1o\2u I{ԩ"֛oiǎlŊ zYM#["z0hԸqw+k̶B:x3.1 񫀔3C/(P\x2.ެ e(Ym %y!pKk, #ʚ0"u^X#m9 0^;|jQQE9~m KL c%]dDB2M J֮]q-555mmmK,a=7Foy.>ע_u]]o[2p7cKL\=IY`~gs|Ks)}M^_O?A4lSDt* 37 /KV[/1I)Xd!3VQ'tO~La ,_aKysG{VEN ;QwɜTm`Z6*ǯ%#%,v \yTK塼֭jrJҶ0G(z@z׻N? $!N-Pk= ?oSK`%&E1i„ k֬R J:(uڟbeL@9 Jei̎mj%h2}KbFvJp14QrB\`B7 oq^y'\8Cg^ q,'u~AcօT.U6h;|P'cfR<f(p+W}3f`pCŋUAivF 5++`>$4```>$̓%&i0S8s̻{ҥr"Xdl"Dy.I2q]l`&%#-uQ'xw]Z-B_x5;O6F{4@ ܼK #qV348xz Midƌ .o.cX f,R[3fKŘVUL׭umii!g%}d1 G.99"g}yz8`6dgIMٯybs|Ks1Ezdu(]fRHXdt%%/I %y FR(0,E&Gi3ʜZ|L#eWM!iq_ co-x]ģ6SLW2NW[d]`rhGGMmd a]])sHP*@m - ȥ+V ik$\.٭]TSLq>eX ͥ=YKv9`^ ##["ӤL9]6/\–dG&S6~$G W,S6$NQIBta I@ hiiO~2-P6a])x3r&oʽRtR.iWGa}b.3- cMsI|SUNpMdgmqnӸ!+Wt~@b lv- Ϣu },XE!Y`nLsCs|Ks)ª';ώ7NO/\pٳsGYfFhT]]M<)[j-ŕ̿3 "l8z`$(jwI'?Ti% %c-9?,X>2]mmUtN~lpK%k@)G`"ogC06MZ %8ו5773 tR+u 1"B 8U=ЬYQHDvi9)@6eL["["Ӥ(4Ys8/X,`vfNWt`2EHW.9J%9M]ElMM sEI}:`VO~٦d2Vbv:i0 l3; ,LRަѕM|+;#sI##$>Y.1kl TlM%b_eqQ#x W*G̀Ft㴥>l6`iFcpe]2,ׯgzh6224&5g.c _'=@rJfՒ0TH[S<69J%9M”Ub>TQQ$Ϡ{sqI 1 NނbӋm\YKt,Gqdrm`'|=|Иs%̜]0bf%g3\fU^4e݂9SyJC%B2"$M`JKb:T(3Pc{X3F?/~۔ݞ 1Q-iR\3H8~NAXly#_pV Wsb"j!RQI-'HFc Cg* M0 Ό(2h|M?ƫY D رH}>o@塝',B#Vi< R,! ,$sI(l nF-UeT,/VbNdku.g}󫧀=TyKkjjpTYK1tRq9Gܑ (4).0Ӎ7N>] &7,Lp}tYs- vI~ØI-2%0!nHL7Q>'yVKٖ֩Hmnu rEh'Wm0hCSdq0j'.Y} k Ծ%fښ4lHIZU,umj*[\q*Tm"+CrSv'1V8 7궲KM!Ns7yTs|Ks)`~GfΜ 'tzb'?ɧ~wyoST0`o`NИÐ.qQ_RHvޫvҥ8Kyr`e5("fךUBv^"E`9$#6YKK 횙Ԝ$$p'ZjEZaL677C;A„9RW lZhts-ڌt!'_s&KbVn8چ3w9]S;5rޞLNKhy!\Dj`&a$w,+$P(A.<[RHA-4,0oK(4) 0#FPu֢ɓן/^ܪWBqP\]!17\8\{`lGʼZR^%qBGԶ%a6%s%PԖ9iV9O}hʭ`,,v*<CLN. 2eE`J-dm>Q*G87xk>tp%*:(s WDpX`3 WA6n iC<Ӱsl\/)wWT0&R`.p`N7e5z Ǐw^U/)HHo>ꨣgպ Sx≙3gBd9eJy$p^Ӱѷm dժU!`k30m}\K|Eq'/Z8aYlA6FRFfњ*83s]VЃhڰ8yaDOZ]XZ3<#:0[Otw֬IP$ayw}_`#A򬎅+ӦM[p!Y2/3/$z ^QWSYEM1|aXNG-Kƅ#lvIO}{K-jpᘯ'uqAm [C͢麈ْ4~38:3m~0cn{Oy~R=9J%9M \cI;D:pB +W H JjS,ô䒬"E8.qDDE6qm8]tyfeADL!Aڃ16<fmyK2T*Tg]<'.6S?E61t FPl)I"/"6Aȝgv9\YLFWdP _l澩ђ12kΥ%kI} =UD9<<["["ӤԭW=Nee%@Q/lz]E4ikZ=,h1=t5``n[D5 1cKV[N,f*%[?> %5( <40%&EafEdFz01}w4$Vay5\CڶUZO[OhѢSO=>*j~aѠWWWic\à3qj]s|Ks_0D0GIͦ"!*zms|Ks2m2Ql߾](,y\oaL֪ua(bE 2\["Eӧ;?VK\0q5jԉJG&"di`n]%&lʶOVgʚ"]vZ +WrW[,UVV. Fᒨת!a%YLMtqܦbao>lyϸ &XpPF66gMU5GlkY"W"Ӥ5fdZ;vlyyy&1|pPD7ƜZ@Vj^a5Iœs4װ[o5XD`g>Èuh8azjNFl84fae#\#`?:ڦe.9J~%9M aP0eE9#A$ܮ\R{VXaFoU^\tbu,F7Ķڀ_7Xbn , RS޽{Gԧy`a+iӜGĉy5, #zQ[[ˊm0-m*"p9fKRǤ\b`_`N5e5TGI;g_|EJ#ЫG>k,ybA="T0hvN쉜e:]w-uK:՞tזڵC!MchzvժUۢ|s=y SΓX& &!Wc򆷧!RoJsKsE3s>>|Ϟ][74dd>hSИUWW4s_$?J)e5(4)4S `Vg|*bа|r/-[S?Kdl)OOC%Pׄ.-#arse֟ܐw.{W.=%7ڱy >K}iԩs_0=OM;wV;= SGftp X,fm p׳QcAבS5Ӏ)M`0569J>%9M ֔<my':+[mK4{͛Gg'F3Ẑ:,R yj^-z\eLbS{K5јImIXfFcn<)%w7`_`NBye[&>ͤ°:ʊ XzP}Zc;v,я&JP_.(B&'HƇU1mQ%;WrIfw[6mPWS~M֟9sF79ͅӲ(oX,HNj?l粑Ѽ'e:{}ҝfg4S~pD` >5JOpڵXqPc}J0jMojj*pkvfp\Z߸(4)4S׾ ̒;|cqoWå /]s0?7m\ҼՒ|71nS =}C_ڗkaolga`J:>sMٻ8_(4)4لȄHĬm 15T,:MXn٥kjjlzXW #5-wdc 't뺚~?{f׮=#mɌ'[lZV:xК5|Ak:*ΆX+mW0wNFu%Eg3" >Q1EhqoiiKp'ԷL %(!w4?_(4)L0Z\}-nQڳb 1[Z)7FVQH` YTCӰKs=зˆs}c՘W[Q;ޱcs S N 瀹os;y^tս6 t [Ҽ93Љq;4tgm{. HElfp|pl͚51CV=EdCE0GɯD0IM[rM4i>.YDݢ>J  =)漡lc6gԨQhKC`mKqK,rTW^ݼe[95%2-ٽ{ϛh^b[Gv\lҝ4dʴinݷoj9~g` הC)%G4Kp‚%Is}vNsoܢ̞oHC̋>w’9%o05fV՟z_|QԔNN0[ɱ=f>L~W[6$Z9眮lթޱkk֎صs۰G[ 2res@%lzg m7%<77J/FKKK{{{p RJ7+ϻonH]΂IBϽt:d/S h`.p99HMFo#YV#z~ɠA'~Uӧ_:[oVB%o 7EJ#;7'-{p`.p9/Q6 ӔM.*DT\Z[[Q_y$jzһoXk.8Ü͖_5;Ĺ%ڰ5kV˯[_m?ov^}5iҤ &t@a+3XN7HLHW1eb)$JN )3z:::x?O6RY׏9f3Ρ(Q5 D0`Q3Ӻb9NֺZ=)`~]X~vV[xwLEƬbS/ӆ>D8‹KT+2̬RW.%u8Li[g) Ҝg10[<YV !`Eb=mAҥK\{̘1ի 9H涆J)Y%~(!["D0g_`ې|@6|?ܸqgϾK/_zՋ/;P:gΜ{WM7te,H5\#YP/|Yg}k_]qz mݦ_,X/*kUX) Kz'O?裏ESN9Eo.r^8 QOw@G}K_5SIlBy:ꫯ?zzm.^O:S=xG4[NYYu.(S]D)X?O`# f s `-mMG6lo^'}f͚0B ]WM٫غƌeo_rp09rdst0}):0EB0jdJqr(C{ \JdVO.K ͲT!VYSmU%ׯ;QF#~dpI?LNʪ֯~"敭G /b(CO ֔P#&X RJy7wB?YZb "i鎵_B26Gcկ늝E>E`֛g'-!._wu]tWh̄_Ua^b[ WKbss3`*lTJ sQ+iRzj43K'lΫpݐoYDY-ݮJI j*'s_AxmG,p/Yq"So^ZBg[x[c#!h85QqQ+iR`wYI,o2@k?+\VѰчTC^TZFDKvX z]wE0+[o^`Fcz4 1j"2@ڵk)KK@84mO(4)LS~ e0w^;JWI%^4|&o(4)L%*%#EY lv-%1 ŜP HN \bƳugnhhp>y|m΢ۤ{=?cnD`>m_q0kl2(PlfLmָwF\[s1ٔԘ"S"Ӥ`,C*PDA!Juu54`aK,\WOJ"W"Ӥ0Mk̤_t:c(W]]ʼ+Ϋb[~U33y,ז,>UR)t.[[ZnCr0/^2oJ zM;wᴧ^2QR4fјX{饗Ξ=%/ṭM/KKKyx%Gvv 4eᬔh|E0GɯD0Iaj7([5 e=cQ;::ybIbz.LU9M2`>'sg|LwY{"{ӘpqwZz"+l,efA?&=trZXRz%R4/4R](\ɉ]`vS/P|՟"%GE>\uԥb9ܴip+++18\R&]%9"+l4aOu:zmi[;؜9sW5(R`5r>gTj YFPJ,UVYG}+ܬZ\bviVfR-W_}01u]cf LOy27/b=b_ª=S3a 8q&,1^-^JiߐB7|!4sJs) wq^pR_ú2êye?3gTNJM 8H0&ɁeRẘ)zo`cr0D`җ箧)exn'3ЍGe E8A^b:隷_).M)ƻ@JN4)LZ,_۝0ݨ[|t x L M'sFm5p"MlW(L,k._Q&ٳ4t-a˖-8'ΐNMD}D3i6!ۖH0'Ҙ5l`.p`NCX"s ;܀-4)LSF۠ӱcVTT`Z$lz[Ciϊ+C=tgˣb]^v+ $ <~|Քݯ늝E>E`袋p$s4O{}gq9|Y2O#!ꫯvttt +R# ̙TKD0~R`w3`4كaV ScV׆'%3 RJS!K AJ4ʉS%k`8XZ!_iiHq^>2̔??`RbW=}rjƍ.;w  [ ^T&8xg Whn ssK91tm[)X0XBN\M28]J.z~d[|TSU~r~see%kfWбԬb /KC+=GcxW6R__ρ煙8q:0 ]~$M).zeGɯ +'|}#O:sa3 Z=K(ZIG'Q!C=#=L΃VF/D޶RXMIba"Kh;`.1er8o60>Zv2mL1txx5ex#0r.f{UQgQ'c.dy _#'^t``a )%?8 KruJ19RՇ d JuYFEdͱK&Ηl_8|Z1p\߂y"FΝ\,"0Ϙ1CW|^V3eIrsHz̃1;-sJ4ܘRo,Wa* bƺэ)[U܅% "Ta<0k,f-[(]U2SG/kCiy;W_)3s;[gΜ8ҋd8og}KN/^-{<&xikk69"Z7ܜR\:R. 悐5ecmK&vHDC3fUVnn.^Y#-"f=Sf+2X64k6O|;lLE^,=67/^zLX Ҙ Q5"fy^CCC]]ËXدPB0ᖔ6^$m JsK19\'41wJii)+0a 8՟J]&2GmFX16գfiHR+'w$H /0/G> ̍+DU敭73mnnnoo&J7N}ĉR3=˗/DZ/MB0?)%7^du1>o'~x֠D0>;!&-`eIF>瞛70[{;K[ci,#S{; cek~ᶔn3Z\R`RUdeezULط7G755ٴi̐X`V+WTT8S2b*wX-%Ff6ٝk3}l=G /9ȗ&w&:w0e]&eXz5kwZrb¼ƌS__{<ŷnݺ~z'ں5e`;SJx(0Yrzs'?Ch2I\WWyA; %Z!V}.@\upJLSdR`@'; zMJ8$?z쯧NR1ߏg0^ڙreR<.~Yn){ڱ`i ONAhǵ. ]],9saHzgঠWH29y3^Gu73z+;l2\ FB0?𕔒g4vb>q# \6%.ٮM/2v]K}zFBqс8GniihQh;yMyY:pU S)Lmd0gK.$=:}Do]a勖9S{1/f閵IwZty$rs[5ltV?y^Nma3ƍS_zO?zʂ 8oGqq9 /Ћ$=yݢ`nZJɳ/v1WJQy05f8fRX<~xu:zL)1bU$6jkk Yc3yY3G,b6^xa}S2F|Gjpa@NŷvL{jϴ%f6$wJFڟN2;lϩ<΢3CEKQc;v,jആ}MMMk,=˳% _O)yNE.c_`N3k,zLU#FRa2T`\{c`oQD.BfINzEJ;d%;Yg1?ѱJG ^b?p7{Mɞ{ܽ"]g,0{ٔCEKE`>IR[WmPo#*&V֭[.uOh3S 9oV(n0M {Wzm=6tM!C|ٹ@gFZ h]ߗMΩOe` ޮ];LSyNz.lI~a+WD`)ކRJ^xW Sd.XK2;___O5klذA&a;=jCfssK|y,-.D)qz) :r KL?fp@POm9`fw%o߶m߶;[˚>0aB&4"uFt}ګ+ggW18mVΞ3F@$Df%yBv:pƼ tl,y%7O)Y.c_)0gMt̅+t[R]]-WkRWX/Nm]eڌzdܭ͐l0`zaiVO+"K~#jFW־rki^{-mG Һ~k<=+3Ǐ?weOd"0Ϛ5Kz%Z[[Gϗ/euҘy e 1Gɯ>sIESvB.ҋiuuuҘY|0m)*N<Ȍ3a^Lv^U +t$m P}e|ptmŘʲTimY7z6ymkwد>ٕ ݇_|1lY/lSRWرcGmm-KAy۶mҘy,@IM_mHI1e%zeGɧ>R ֔jڐ^2Ӫ*---N&|zU>W9]>b0؜N N/Am7|sWb{?j흦lݾmv޲a̫_'TY|饗 z%kiիgF.ѣGEb &L`1FH+2m+ ig7z01u&Dn%yGOgu1J|Ww[j}q~w mF~Æ \]֘OYxaG*5e58$O\&1'VL"!5qw}/#1l=ŋ[mlST#~>lذ˗yw0Q0ܭ`)%5f~ysށ\R`x)LSvs5WhAz7+_Δ9fF:PgFVaK`@3]KE}v };#=\=h"gcDzxC4t#C7^kjgb`o\ޗK% ^هD0IQh̄N,zb՟J{vcUWUGCydwQKX(2J ɨaMcSYYxi̇P'Y,au͡>vlh[=W7md)GwNX?DM\Ӂb'|Jsl, RnDeKYfzRTU۸ԺhF謫zDX'6;'3А/=O_OY߭^TT]ͅ="HۘI8xn/?0j`'}0;Y[?իWqjom.VU ?M)ykG] lh=h )E" \"sI, ǔW^y_O0?5?~.OSNs%96ؗ&S{Zܴ'#e<}ٮ_S Rƿt}sʁʛk]}P\j" \"Ӥ5朾SСCIv;[q@ƒ`\yVP64lȨUK ],%pM#-['+[4. >/55/'8'^oPƑyM8%Ɯirdv̵d7~GbX\H9sׅ4E& g熏? #er qp 11' 0v~!3f3X-bF_.,V‡> &Z`˿sJ>]̃gέ˕CQ/}Hy4'GKY㐘y(16Œ4nja[nyg"niiabj C=%Ml2ѻV4B3JJðNiGyA}g0X,죏;[׭xZϛ]0rm /?_hJyUKvʶ5ԲW Kk7o|2?D؄; 䃅OS7d~)\uI #fggX3BMfػ߂!aYaϪQ `мFhTxa bq|mbz% 7pA򱤤8+444&&f̘)))<î^aYjo6:r1_ LKYi\SoI:~Ѕ3 | YhY߁qֹLT5fqL qbݺubBޢ _{tRAliHPrDDEFF655I/GaPot\̫2sJT}#1bvZ\X|-wVunnfb^Bw~ppP fl {E(c04Pw#FSSS0zTK7nܨlqh ŋc0/!t3f8xa"::λ >UKO4SSP@ë 1{"f jl9m0a#my@J`cqc PM3E[뀆} .LpƱ_fVUx%0w-|ufB3&*f[*[+יLb`H(?pJn!1jb e QA1wwwcl_&m۶l2+kV=yyyu1U /u(/'NY|mg`lK(Z .%KKyoCHҕ)MoG.29׫JLI`y1bF)،| ϡC`ɓ1ccǎa+4${xߖma$|ԦnHzA3;.E܌㚤#d8]+\HL/|$ mr1dQ= u D1+n1wG1K+Kc$AÓ'Oƚ#R0q$][%Ku4NDv`o'Ixb?Ĭ#@yVIزٳgggg3K0 b^Y)Z$fBMAR_; _9NIp*c=Fb +WSqPEOכ7ox-@ЌKA WÇ755IjVWd|z*a4XBb8 C/GbT&1Opbf݉b}zbbd3gUUUIo`YbhՐ͜T Ɠ 5!1o*#UV=C~<>v{D\G%|Ԯd\aXfRQ9OPPܼ[\ꫯb'3_dqJ_6P3]Ḍf`V8ULSњf3|GXըO|GLK$\0k|Q,n=u^3.ۮ )f%a222|ꩧ !\2;ż SrO("1jBbV'ݥL1ǃM1DoqVq9""W$uy|#q ^8ܘ޹s'g2--89?BvSY%;5BLDYr6o\XX~pYƧ̓R0 ]-mn8=Me4)iu#1Bb桗e=(-4@\ 1؈lTTTO+'g]:*|ƌ99B===#nRڊץAc-ɖ {ʶmE<1f޺2`.>CCI`e(d[-tOb&Ԅ̃,ʇb&4|N&_/~H̄yU0 5,{ 7|Ǐ[ n3v؉8S]e#Z&cbS 1~D363.5#6lx饗&\!*--'D'N :::.ZTY6k_VP3D X>ňNLWUU/a"`6lk- ?'1 "v FPW^yĬbfq S\ss3k8b+-cbAsGr1+PU5Y㐘yT zMJJxh.&*)my-YD h{їa#l04š,`^ 1y*,4a1O1hӱLgg'81Q/و\̧)]gB3&$fMe3Ygc\?_0T&tY(3؝I8=u:Lbr1ck`3g2JEOOܓi*D4=/-S /L N#f#""L `:;<79SQ 5!1УW:Z[QsMKKaV`hy?_|/."aqX &Jb gL:܁؈p~aG?dwZ|s"u\s"9%Cw 5!1i*pjBB?d }؀*E---X*{: JB}fUsuRHNNwnذ駟b$M{TOSٳb9% $3&$f:MaԬYjjjJeb kcǎČr e8$ 6z]z] *}Jѥ^d_:D 644C Q2[{:a=z"I]33&$f:n! xA"LMq0VRPJ%``&U0 ?1c_"f 3^6›CxO+11f|JWU99B 6IcßZ`Cw?dچ?x1?a[oaEI6ú#_Y`‹ًϒtcZ[[!\ .1ފ=bn9L yb>a[s],]+ٸp23%$fb 1jCbT;0}ƢM?{|Ɯg tRRѠm)w ;i7 1o=: e#(WԵ"6FR)Ws׮-QW,1qF(F,omii!l%!t6R/91a Ç7CnOCsw0Rs&P&p"## F%vidYY"0B,5W 1_ѱV+ ,+TQHm3ɩ("R-,*ʼnRa%Vb;'Њ @@̷v܇USSO322"""N&6Æ.1vMQpsWyyX)@Z3$fCb桋T! ֛[nIyqc\\\kk+VP éw:X+==?o>`衘7iN/_N ~Wٳgwww_z饘y+ejU¡tuql]΢J3!$f@= 2bfarEE$*6UxV?ëV3 !1Ь@rTg5bʺS!p |[Hwx]gb^1^NkVV / 0wqA6, W? $fHe$f8Apsb. J_/żdɒ'|P1^"Cs͠ai)>}: ja|f Pq X2JX 1Z|׃322uBBz{{[ZZܯh|!oվ%ļ+P#ڐyhS^#I:vPB g +CL8OjpM]"LyϘ b[pVܴuvv644` 妦&Eree'\1Gb&Ԇ#Rڊ+&2ľQ"L %%£:&Ll e0CC/RݍuKFz] .8p!!!._q=_kx&eF;b81W瓘 !1+E_ٞփXYE4kɓ!z>r贴 .lӝ"؀n@@Yt:]/!1jCb#1;B U0p"NJJz(.ٳg PuabČ]ߋ١켵&!Bcp'bq6%%{;Ǐb(بW̗ !1u*{z֭˗/g2sC AMBCX gzLO?ebXpƽm۶#1;|Su2Д.8waaa ,ยbO<;ai5q*- 1jCbyT LyAi"Dx?1,H ߧDd٭*!)0ɝm/\f)]D0*qeSY<[G1~;>Ȼ {@rr2wfy|#iӲGA%\1B&1k3oy$ml+8m`gYmYC;O>[X:b.b hqGl\1_I36$fNeMTlo,Xa*--fسf͂~ĉ2!hll{7bfb讕3f)txlC&XR0`誶:::kߵ 旹bL< |bdr*T6JW_]bb4NCK2yd8ǕCۀgy&̂[O}Gm=,1r▵R䙷U˜!!%/?ÔMxc`1z|W =322 3fCVZU\\{/IXϦ*x~+kĪ50T]wCfE0R+hLh1N bLMٖ^#WbV !G.fN\%o) 8+U(_}%R-[\{111u"""n<[ /7߄%~{aaa}}#\s|'P3Frܑ;ep(!iLcA탰 " \x ,Kf[ȃ>Hb8 j@?G1?=$fBmHXVV$fCbT6C6۹U6/FDDdgglll,YC77731bA[ZZ_cdƍ$fb8 WPL "汀x:22 aeX >nkkcA Ihh(DPS$fbv1r\Db&Ԇ# AGGG33tqԊ&4qjj*Vᰏj˪U[ʗ^Z]>h&^l;?G-Fbf 1C$fBmH<-[\r ªxe81 3/fS36$fZ*ROapFcbba:))i)))G%UUUͰ-b8T8x3v0 /Q+Vmɲb]%ZAA{ ~X@Q7S= ˼E?f-[*VD/gpXfX?bfY=1HZ136$f%旚<"6Y!h8-- bb!ta*?!23`6^bNj~ftXRអ"$gU/+hJ H85K9Lu,wLegm? 8}|q̸n^̞V/b+Īڐy7y3Ji@Q "L'iӦef Xĉ'OYg͚USSm7l{1tڃTŊe{?٢]1Bv0p4,b"u{yu2kÈ]Nq*6 1jCbTpV8DcjXYgnfb 3P,++l6nvYG&<3kjXDT{KbƆrwu΢:mၮ_{%oǡe{Bb&Ԇ̃Ĭ1;cXroeIfq@)fM4_^VNnY-,к#|YlloY36$fMes EDD$%%͘1TUUDPPvDwuua&q-we*[3.!K1,휈/Bq+= [/X m_*hҼ"E!i_T \1?Gb&Ԇ#"f7[qC1|c hmZZZff&]wwwC3DPk֬C#~i36$f3k£v-MHHbǃ_5 ae36$fʆ'氰0ʤ! 9s&,:ujyyy}}=kii5kwpBSvHFϩ 7b^΍de1߷e*j_u1%Mb8$fY׸3s;8y9W[)b&Ԇ#w8L&"Ep ȐC3flkk^x!7!1Hbfnb+7H̄ڐy:=RLh-7ͅرWRRRhh(㸸8|2999Lw A3>PkQ[ pւ2s P3@opea:99y Lab=JKK͛>.Ϡ^ +b~L YU U688""<}tl6*{޼y)+Z<PkYnGbf 1/m36$fOe{'fLeuFbq*RAb&ԆCl=rQ Ap͸?$$~bl3l_0Y%xcew{|1W !1и=#UcĮqHf ! zqGF`/F {2q?eekI  !1f*{@٭ΛF+[<44?8d\\DIIIL瘘7̞wy>.+r%Y}1G82,`~4Kb >HTBw{" ɜ5wɁ#qʍ/z&&5N#fO]B ލfb?㖖o+WZ#LX*?w"[nb{RĵšΩ7*YQXd|N1"|',XVX6zΖ;H![c.+)F{(+ xX.F'13/#Oļ tI/8g)^"YPvĬqH{bvv$\#'"#]Aʞ]\##M.x1|GSrWbiX CK~ĬqH}:/Wywbv1~,{[J@|c^"<̃LbvOWAbf 1効:!ԆĬA,׽۶m[l{S0z6mvҙ{쭷~`b8=+C$fBmHJb&Ԇ#`ZeqxA*f!b3;!1k1cR/oRY\1W !1oCH"fsT~$|x~ ESb6 !1 1#86F-XZZZxx8_;Y㐘ĬmH<c^^'45Z} Ī 1󠈙6Ʊ@1oܸĬq^@b&1k3LsO?<<#\t_haJe3Pߒ&1k3moqWz8pQnZ *=Uȏn|Ck4߂R^Cb8$f|M'#M QQQ0/C*[T" a2h6lIDAT !Q/a` ~3)Xks׮-!*CqNFڧX^s9ه #-WǴpC<0xu0”bN4P3͊g[8믿>nKQ܊ r(FqHk&:19Fޥ|'SW>H=oT 8򘏲؆ 13S8%ML Y#[lYro ;3., fxT?FL^['vՕ8G(- FrA+-BV$bV-dlyDNI u!1rΰJbO*$+p1Y-XҕhFG1N*L.}<9v^Bbv[.b4P3ms:dƤ6D좝Kv(\-'wp~wYVPl{a.>T&1;~ ߉9Sdb$fB]H<U,JR|v0O4Xm&ŒղT36rp-q' \D\V6s5Y-|ʎ4̌L #f㲑 _bvG1pJLL <ީlN!13&#1Bbl;q x1{ݿLFb&ԅC_ 1k]4b4BPxrq2gkro)7eҒELܯ[cl<9Yx/f N_gOTNI) uѿwI-ط8Ǧw/ X$^}5k3=Ƈ۶m[lhϘq-KewsJLQ̩!*Ĭq/a@7g,o"zy(ws;(b&%<,TȮyZL!1{ Y,-(WָS-&S#10b ה/E.T\ݘ" h4SaS }5g;ڊ+\ngή|֭[/_.oWY2bvDu1oذ;`59A&S2#1bviefebT8C 01{9%MtFb&EbtZ$֋C/%%} 7Q/Q8GgçvrbOugo;1pJLP݋YPy.i(߿.Ed<"fi CaTؗK U.mhNy㜒&TFb&EbW(bqIeK9RWKMe6cv~}'XH,s׮-0ĝOE2rٰ`!h%{rG1433.$f$fOgB|0/tD!IabDzIA!iǹksms1\N )ۥˊm/,kPN*-|'8%MP3Le둫*fY*[`yGT(V[l,Ռ-o5bˡ9r%N+v9ĬKe)i2H̄yP) x14aN]$fCbAb|ļSd PƔvW_}cSٟpJL13.$f1{ YG1kt#1BbAb 1żSdZH̄yPlO!1_y1zl^ee2?Fb&ԅ̃"fO!1b浆313.$f$fO!1]4.c$fB]H<()杜D:G?7NI׌L E̞B.NI)y f/~W!1 1{ YGb~Sd-fB./^|fLb8$fT][9%M]1K^fob^߆KH̃"fO!1b)i2d^aZs5-HnBb$f_4V1z H&1vT6wP* $fMH:"f_$f7qׇjYahpFfCQM-CV IKO,H>3.E[P*M/q'Nu \nrK?#&MreXP*{ĬH fк_SGĶ5(7o5g3cLNVyyyff9sgTTTPPJUH̄6!1T[>}t\0;Ĭ2$f3MH̄/qN-*׿gI#hܵed<ļo߾3fψ& ߇@^yEFsI(Ϧ㒂cGe@b&d⊙DƹרbwOv ^v). |!4B[{B09l 3ZePgBy?u7;ծq#E-p:~U]Y0mA c;αMau.u J^P!9?b%u1THc-]iFsEe}F1XCCV΁ vYC?e1-6܃C 8Z]yn'$fHHc-]i\7ldCs{hhhpb#FY, 4h.ChrKKD/qdΛ3GOHZƇ9_|eyJdF=a8TlEWGv*$[T{0P,\:V&cY%;䢖?.aZ " !1q=rbDb^\peݱ3|wl] bv?u|v0*b;Nc*[VLWx C3hۜ7oכb~b栨S20Gח^]]e^y޷_uuv8ۏ%;O?kb4GD(3Kh.Ab5%$fAb5%$fAb5%$fAb5Sv8]ĢMMzPt@ΚݻWI̟|I[[{?|  ODD7gsn`f5y͗/\X\G.^*_꺆ĬqH̞^" B=KWI̛7o\n}K4]R#wӬݻsF]76XcӰzbjp:4g̾>BBB|u<6mW=nm~{VQ6J6;_a$1?_}OY<22b۶ח-߿c*w]SPqyH5/T̟ aggp_̃Gb:]Jbdskuƴcyscǎ1)(_ 山g5==cXNVٽ a+x!_㪫oi" 枿-#ݳ%ꥮk<s]>jЄ[Ot4VÐA^C,,07]M1A!kb޲eʕ+Gܣ|, 1;nms>fύ:v^8q_`kLb:cwûcNOhO  ZC'Bᡆ!&š]ߗ-1Ħ9r#٠ٳsmC̘3#;,,ԋo{Q%sjEEbypp3>s?~-)0啺Zh\m?O{w?N_-]Zs']l ?_&}ӑ7o\yڜzZZ{X J 1@ػ>~)xsw큊3MSN7|``bƌjk*Θ7322һ/Ag +wxLb 5'؏m޽0" F1f{Z4XvΏωS`Ҽ,?wڒ4,. ap8#1Uv/vOlK9_慣ٵHneu/u]㦘urQl c6O>}py_e6wY-BɉAq fCLDd=/M;w(t3]WW_{;RolO4$ŧ47EEe{ h>sWե3,9rY{w*A3aaXX?f'"ebd ^ ]Im\+_"E1yk6iu)um?EԼu;bnf{{޴ކIAySƐҾ}e&sOj =%!(6z쮊1~F3Ĥ 'bz,j={>LKIhjooxu b,&H̄PgY|ykk-c֖?Sq[nGG3f ~ƕĬXBbv`d2l#"[{[}JxjbĤ[4C|NnC¬C 栄sw_m,1;6#2f};^900А.1uYS CZ,I̔&4B̅k֬imk箻OwlXz-"fstwם8ގ'֮]ܣ_I>88>L2eW\o0 1OX8bagĬI/>94dY;ACh0 >唨G/3[dˑ\6iJFϐБM rٲ7SPϼeN d2=$$<:u.^E\̝;.^뀦cǎ]pM" !1OX8b~˚S&G64t[zc 6,( cH1%.D`HHZ֛jlx1FuSCpwa% .2e}AbhJ^㎘pl(vppP1888,,,J>L$4y2qĬSH̄/!1ĬqH̄/!1ĬqH̄/!1ĬqH̄/Qow_OmmW̼㎣UU===h4FGGGEEefd__[r'̟o0 1OXHL?կo0iOM#XÛYM͌o7@',$fCb&|B̻ͻo+m  =03BBB j ޷ojL_w7@',!L]kXZ[AΘbۼgi1.l6s]Mh,)!1OXHL]]e>l 2Y&O]rphjk:: 3X*,)10H&1{yrRSL :;;[Z_yŐ?o^,*JX[iSA7>cX!55UGAb&L8W_}=\Q--]vů^BBC׮y)S:::f3AǑ,ظLX$XȤrYI"D=H bOƇ882LummmRRRHHHOOO[[ɓ{AĹE|iLeiHf9$T9 " !1(ļw^SRR==QъՉɡ.Re,XnyEmEy3A$$fejkvL ]]e[o 6 "fpsrrr#YDr( " !1(|ތʠ͛Yrri\!4VY_~@l__-8j+sn"O,fh " !1(lz챔h4FޑzPOL Ϳe~荿ħϘ73A$$fFBzzj|p1,,' SYU;-&frYw0KS@b&L8K;lk1[ ׬A$fO 1D@Bb&i{HHm}e _||d Cb&L8qwuv @3:2#а~L p@!fBː " !1u 3YG " !1u 3/Hx ]]]'Ojhh0B"JMMJII4>" aXZ[[,b'_KOOaaa$fHqgg'˃VGD8 :e#B C"`e `aAcŵ;::}`A1Aq1A/!   m1X,QIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/imagexy.png0000666000000000000000000055545200000000000016472 0ustar00PNG  IHDRSIDATx`TUԔI!NBTTłowkw]?ݵ JDBBzdf23sϛ 2Co^޻{, t#..a\t(fȱcj4\daAlnoo?x`qqq<[999+hmm5 &K0 0BV[ZZlrQc뮻?nw!aWFߟ9B̙V^^ca_);veC]xqggVR1 0̯WWWR~z!˖-4]*a*'z{{Hwm"~~~]\RwQ\\|sS 0 hQFD;ɄzAid|\ngE&71f)rY,'u6Py===0?*mda)EEEIIIr\ןW_|Jq'.b"ƅ]eiS9w(rY&Y=VZD"rYn6br3v|$(LJD"&&0]&ĉ>>> ȑ#%%%( 0̯R'jufffxxEL-- XI.XPtb(,3*d2lR"ȧ9;;{HjjjZZFhb1[,bRׯǫa~5n[vuuEM 3(rEf+PQ2qYP1Mbp{ǤD$+^{ɓF#JXP#"M}}o߭0 @9LHH0MϽϙȺYÛT ֫ߣ8>={7_F{ݰ-ŒK$.is }d:CÇ*auQUU2v cѠAQ.9YXW }mtLt?F,) O 0QQQʉPaVTϜY)'O=XWT-W'}ue\ ח-qމ}zCTKUnY%>J])ʮ~^Qn眶qp>0`'ȪU{m3uq5N6 i7לo^agDrr)a>rHy  vٰ[_)XcMMͩR/y1_\--:\%5u&LזE n\'~Vx!b\B?ߐsuڳ.;3 p'% ?C&466ƶDww)3 3g~[/YbTefZt҆SsiSSߟ3 >ێgp-vt8 `ߦmGW&iz&ԙ_iR;N6Qrʷ;HqҶ0q_nY<{Cwn`ݙ^`v;LIߘ'*՝y ƽZ]Q/y/"l_D)UVQ0lJu/ϲ٭:bz0L/0 _(]@IHwA9 5U{F"_UW]uDzF"FqH#\姽$roECԚeA)#k~9xG}tʪY$͇׬1GGkW99Ismmŋ1?Uwa~!mu|݂y%>Zo-.h~޿hY^q?G?ey?V7_ޱt;k;7+ߏ}sjrpsD o|tsG?q/nM}O6iRn~}*a|/OtW%q7)ݟ3CgkNˢω3^T$ / x~;tg_v86?|j ]ξfő1jHˮgб?o)fյNUOrڎܻe?, >ʴny_{݂bMObZ6>>'eggȷ~;o޼g$mO F3dY`YD$N͛7wK㏻xlz`kNiImٌ<̮]UoJM]1iUKo1I4=fs?廟KN}#5/eDr4Nbͪ{/>_=y;YYx &n[)/xOD"N]r ňӾN3YJwk;yC }`'׮ڿoB:5V3%/`jo`׵{]8&- 7ߺsVWOQANtrꆩ K>pN;~o4m_yMݲR%+//Rфv+ӭJu5Id:&B˰^S`Ut|ݰVtͻ?7y1  GvijDz%?)h*hVUΛ,mZ w{N櫮0g **jҥSNA:@9==wĨZRSܻfMBwziOyR}5gި#/'`#6It͚{LYEi^o gepKa=C6>|~1ñ ռqn>y0%VӷURx5mZ{ i(>7#yꔘ>Zsɻeݲ'? e^sOރ;~pN;<'ݵ{eC`7ߟg*p=WOy(t؇i2V=ޝB7Ǿ֏V'{yv__as̆˼azƍz %ǜSe###qDz(g$rtfD,YwJioRB)Ef Ç<ϙ36m:tN.0^v =gVgƆ*|uVW4Ab^n`+XqW{⴬V߱o_̼GXEQk^Jri=5RnKf@⎥?~qۓaK}̰V6*n$L\ PZ!Z1졙ΙRWO//;ͪoؽ|nC:ϟP7ONg6߬JI!O?t.p_݉p_ӼazEcc)S4u۶mg3k֬w޽39)gDN\Xs#Asc~YqÒ6fv+4a/W M&7ߌJ,NDFZƦvu`sgmc=h]{Teqr/&È綼/\7?Ӹ0o8̬L-Pq$[^*["#0@<[!UgI<RزhiBLQ kFeOT`MRVG$q\BnzvU]B姒I'enմV άm9tfy1 洴"~{1缓+**jǎw:$s&xF"K7ݕ~S.i,t+vlhe,I\ۥ^yJׯ_o4f䎎B/l5fӛeaMKKܹs4砦~w]%g7UTL,@EމJS fLz&=[|+$8ݗ/^|J׭[׿&6wtW*0 3imm/;cbbꫮ.J"Y.iEH0ė?ePQ* ,Q^_n0mda)3f?%W[ss?.V"Oϝ$GR[Po-2zOt'rl  Yb4-hxD$nS'aѣGw_ݿb%Ȅ7Ξ*kG3F˸#hz \c>ݺeU7t)a^zu[aaz\,u:nR^WWW siiiבaa ǎŒ>\QQq3jԨ6 0 \L.0gggWVVb*ܘ֭[YaO?[nAEGmo~5ௗV`͎ao⋗ӟ|~2ݯfaK 3s03 \ X aR\ , 0fbƍ:+쯢R˽J𩧞Kvȉ32 9OwL7F{^X>l2 nd2K@T) dFF?⊠ﯬ1fY. _/wީ۲)(('݆3 3 pa~䱿 yםK4^9''G+NF3dȐk>Ʉ1Zsa 0KZo߾ &tk냃D٪jS_՗RJGKv}뫪w9]<<"4ƫD^X?Gy3gΜ H3cٲ_!CB䄽SGGS]>?sl]~~_ 0̀Q=uEWwwwy34aaafBؘtl644T*tL}||0ܹ4/0]ƪ}G3ܢi۽W ڟcDWo+P5UWڷqaʫ&_0_'Z.キby桹sGoҾuk@}ROUTi-Kgar~#F1}wagf@(¼䆫Q+4E{yzv933˫-99hO8zwI+UUU V2gyJ6K-{7(̥e>ZQzŋ@7&HK!+V?o Hxrg%REUY70** g1,m455E>؅aJE <{fcGr蝝uV1cj +4555~Tbd܏WytRFǍfOOϮ?vm |{RF*/Oļs^%ڗ+[ i 駟>0 ,4ZmêU199[ ,(HjZd\ƭ©dG*' +<0?|5 ~zyj}ƲYYYFq}7}}}^RV*K1zOXCu"Ǐ*#F%;0?:ef 3{^;ovQ\\G748O`7"*+7׻geomiiV a$̣F{M[ZZjǵ= 3/Vyȑ>t %3=c|7`0lj:䣧FnjiGc@6K-w7|KL?/%E{icMiDlZ.##h'kANd[[ZBp_bRs,MCCƍګt[hIe{,"UŅc 3j?Emsy.ÆEEEr^_VVjnja 5Dkk3=[GG;ʳNK-̙?l(KJƾ;Rvjg6an|sps[;^=5WeCϙ+/Yt5rB m1N'''꯾R~ݸ@WW׆6g{"##U*Ѫѫ3 3p,aF3+W[t<;כ39 ݽl2襤$ xWzz:t70@B.07Fի/5=$Wkx}1/*eSSSKv`wRFYFd` d/y]!J7WEUKb_Tʳ#?_0˽Kjjvlq 3 8 D\Ka~w?465ϓO%ѡut;NUU{ޞ'cJPPSyyunt5;So{QEL +x, 3qacْ#TYRmww<'ojkkCJNc(644;¬OjHԨTjgsf%ziڐklovҲ>Pp`Ѝ~3C`[<ī7*{-^m4\鞕i0~;]J v]^f[>|Xkk[sso_PXP1.Yrâ[~.4/[ S___UUO_@TGfT_GY755E x\ sKW:;M;z~Ff㢂Ic[IoBay|(wdj>Kn[oim)ҳt:V>E?lRb\FOˬ8?otto@;'0[ZkL&{W|ͻ+''g`8Lex׮]H###qO\\\aa!nL>=Kzå/ V74|U5͞=ʳK[- ш}$ y5_TJ^;D?67p8]lc#r, ?c~!oM矧LuΖƹzJNӪU?SN3ftea/c>x-JN80o/U?+>]S2Nd;MCvN/`tzB䥗^*//'OOhooǘUբ8'___FzqR¼mCXb Nd6Z[g-sJf͚^mҥ}olYHoLfѢriN* 3B={ᄏwO?4--v}E㫯z;uf!M,F+\yĂa~ 80ӡ׿АȰw[7ؓA8VWzy ΒDG 3]TtNNNҞ^ _xcK, ***Z[[&[w@:''N8#6_`2)lHHe'#Jpa>⒲_z#-231 za G܏\tܴiS .1 8&,r)K瀻?p0̯fDJ|*_a!+WS/n@˖-WztJ)u˖0Cq9Lʭ[_71 \ .0-K>|bgԨQm@a\&afa'\Za 0 30 0Eaafaq XaƁ`afaaafaq XaƁ`afaaafaq XaƁ`afaaafaq 0D3 .\XZZߥXaU0*aU߿)_t֮]dɒRYGu6ۧ 0Zafa",, 0}f@y` sDDDII p0 3X?v< XaGDm}@/̎KٿȀXdtM3D0lWoaሙaf! 'v&faf! :| Kك)֏g$a®0_p0 3Ȑ+|5 Cq$a?~4ꚅoo@ِy]a^R`Jg@,c:&ba"I+X^fdH¼ծ0favXXa0+i, /et"[?l"O&G]"+! s]aN`avX8bfdHœcWXfaA$vy wet>}f@Hbp0 3Ȑ̮00_z6=&vc[>ףXa0W`K +KR`Jg@,c:&ba"Ik ? 30 300_zN-eb!af! s]adaB/;K#B݅]ZzUE׺o\t7n=[Y:]Vr8Z:.ݮ0kX/#9g?o_ 0R$a+%M>o+̨˳sffaA$̝vY%G\v/㻲S:~~LDl>3 L$ Ů0Xa0 aaafdH¬+fS:b6ۧ IeOuE,̎ G 0 I݆|fGaf! P{ܔR`Jg@,c:&ba"I},̎9(yRw56ooo I s͉ My| `a/e3 2$aaO+N/՗1\v0;"/e"b6ۧ I>ʞ0>b/ 0@*c !fGafaqv9Ģ;l/et"[?l"O& D¼#fG#faAUXfaAU]tW6ѫ0 ~avE$^E"[?l"O& s]a/qT8bfdXy]aHx7x7冄UX^L E~LDl>3 Ld+ fGaVa^hW70;*, 0 0_mWbavTx){03 1`}̀0U+_0;*13 2|]aQaafdXy]a^R`Jg@,c:&ba"0/+k%]03 00jW?ّoo 0nWR`Jg@,c:&ba"0iW?`avTx)afa{ fGafa ,̎ /et"[?l"O& Cv-fG#faAUkW쨰03 2]a?fGS:b6ۧ Yv5fG#faAU+̯0;*, 0 0?eW_fav$z/}JgǎK,(* KgڵiiiSGKC:{ms%rVa]a~QሙafaK,faAU+Os]ك)qh?l"O& v,̎ G 0 0`W쨰03 2w?,̗MF<֭x^L E~LDl>3 LdW ,̗Tr޺0 D]a~ғ|Cօ, 0R]a~cUeS[=S:b6ۧ YM0 xn;μ|S.R|1P6$]a~q"faf bw ,̗'̛d|N-ТF7Z/ k"3w @NhvM9v3,c02e7 P' {Ah8 7'~mpB] ҉ɴ 9#~m2-lL8kATJE{}C ? vh}:kScJ"r;TA`f թ&s r .[R %N % (xr+Zd6 !IdM +aMa:p [[f&PCi0TBGVBLE\T8r(PVcx-xʢC۬MvSvTAz~ ?1] S&$jlᐑCd9K`<ôrٔ kqP8Hf I;c/9CM6MR دUGwxP)|S_BA$,p\$TZ'sa;FA=N- áT!q#D6T 4|:F䧓)h $î|}sa䡚*#FR"EzG veҩCYGUAH$,0 !¼!jC&"~>ڰwfC0qf,a)08^vР}ܠ SmU)ݪɂ AE)!f6vemy߳+0_6.0gd&f&¢"KCRNݵ<v^yi!!Hմnr#yc4]HdƓLEPP㻱Q6O@ADҙ ǂp$SMqEcOĚ;63 qJ'N4>6TAh*9VbN%i|D0Tfr-0I{_z%x}r-oZB. pN⽳t"frm.%J:,TE&x҅>Z.#zEw"as 7`RAG+E4 p`܃%Ao.NBmy~QT5ur:*$ď]3l9y١:NGtB;@/CO Uu9vDgUPG`jSQDE5`3:B5!L$2HR)e 9ULmDiza"Sx .﵈fF$OtDGA'4V8* >*hH-x68BYJ)GI[q?GŎF ~Вh4`cP\@S<-+ (.dH-PڄГ$\m6C[IIY`L8P5:5LE,^(c YamSywW< !]A0 '8ۼ{}`U$rZxuTGTRǻA 7vNv*#tn347UAxJح2MRa(`'7TJ":pz8Mj. /(CFkQqpI8"%E(ᝠT;NgQB28XL| bo);J\ H8T Yb>:-g=# DFr;N[ BqXsԑ L$?2m Ѧ@SYͳY'Kp+Ц/7PGFq?R :I韥*;U~99*> F!uL3r&:WX"|^Ǒ!8:ԖMR(N}8 % Ѣqp@.RXOG_M#NB8@MmV:, aQp&Q;&*O<e0@*,RPU -D %It =fV( wt.f3+)2&)$fAn7AuͶd^ vHkF:+`5mX鷖 Fmt B9$@;T2F{tJHgint& K?)XKѶlc!-zѴ%|PYH:D8B6P [Dd&[ĉ46\.&2i0 FO^a0 WB:!Ҧ(٭?5_G*vMpÈk)l%-Eh));td(ayo= uBvY|<^dikmH4FiqhyMbŤlnK,;\&ɥLg5$%ZP~ h0>b5v#\ ¡S"cYġ#ɇ^KЏވ)=H>mr|eǑ3΂!`$F`V%Rh?yVJMedpn)Ke  7gV "Rh: F3W9 WC~ XXVrDLJkG(yTg9 ԑdT;1t#86&l@{>ϵ,Ž|Fe35ٶI)#/EQuƊIu0=~tR07rLqC8 KBRDF+RRTZI% &I.r~B%|HEtBR@:ŕ #5zJame(&%ΑM^(I BU0uB@0v܏:APU 8{6Z¿b@:B=8gXbY! #*S!Q8+nTjQ1G*f3bu&7gBus?ɅI NbDCؤYXhBj "F Id7%uPQۚ'Y86)h"u exe,'[c!J]=AWG%8k1Q:-S+iB=Dq` Z;`u6~,*DXo{M `'|rR-y8R|a6lEׁVPzT ,JЍJm]t1jm.M;B'G7F{`%܆wbOАo bqq#&Y4:1+ NL!cfv"sQ<](Z tza.Փr\%_¢#vXGV~^h3xB4[?Ԙ[3Օ)°7aqш}U:R'qfw){]a#fG^qq[{1Z[o&h ')g#8Nk`CDu;JHJiIwi@ S -F\7 N  [P.ZIQB$s tNURX.>Cu;_ڕ@-4GJ'r H@ZZ;^^ef{LCɅ~)(*)^@J_K+9ق6#q)q-6ՔYsMɤ02IVQP Ғl0:ZZPܡ5+$NT**JB\ڵ&{#U(&ҭ .SRT Q9+Rѓ)OW $9tLmA&J:[͗zK$hMf3􌑢Xp~PoU| Jrpo4sGډή.jhm4~$#Ȩ HBh쨨0]]않m{đA4FJxP55jXcXx1f =٭ɪ픯k(JLТ[PPf xvCF]<I8߅V~262,жV#*BXDE'J%P ğĒL6pm61Gp, NmNAZVUKuYGsQQ2'Y-!P+*|:Fy!v<)̝z2k|@E4¥.j9>i}L6:^ZvVa^mWofavT \}O> ִ,ms^)|>DGJW(i+B 9(qQ6ಭ77&ư4҅H&60qScNj4_ i2[擏i ݝp(ş}':Bb(w/qABL_A&XXa8 dJ(-$!H% X rJ>% ?c"Sa7%CXC!^Eg16C4vrR1$-qb!5],d8٘?:ќ*<`9}iQdi8A,& RD|} *g8I茌Ц N(xQaQ8)j-'hyt Y̵,НK?Ss7IbyCݓ|1.u5jPؑtP %kTNm{=H(,tAa3 I CW7@`,,jQ\ɺSKQgV㥛neTiUDI{P a[@hgڎVlP ;$ ip `Q;q hgպtPѡ!DMi&:҄x" {wp)]˟BJ+!QEmzU( G;EyLMPܮ  %$PR*H\@p#\s'{OH%bxD ;.Z7:-VI089ZW*/b="NmI3 0B{B:B!*w=?֔QCW5@)Q~^2q.2#>|9M s~T'o*Thl}gct| [M. gM]s5|巻Md =X vFfGŎ0k ]_>n^:g" (d`@LLBupx$Qb]bJB_Nj4R)5!5X*?^!mVJ)Fٰ V)pE[Tntl" C 1b]n!JR&(c_P!u8"FaZ82#5qD2DQP]O4kն~OGHoy 5] j*z XGpx@ıNz]+z>n@h)iZO%jhpD"<&%:A|Îf1h)jP1 [4*AN)dڲKNaSXsB-+i[nA$݄ܞ j%ZP SEZlQHݵ$o- j`rsK_Sk(drUQUKږ-tX!Ӄ@y僥 dmq6-K\>k^gJ nnІQ¿o=kQ/~ 2v?H800Ÿ*=J̈{|I5P@8OC:`P.h@u&+[)4) ua1FO%: p."`H,1'eM'*\&Rc~9)9/>r:!ĭ"qڄn4PD80(*FbZ#=Da1ͅ+vtRi-5p4H/C蔣t+5D M^~SJ1h5yʳn̥R.; ^. A(3JIL--B))A9҅KxJ(wk1:5nFI-j\֪S.^&NE Gk $ uPQ-2iڭc{Ћ7+Nl,3N1EYf%][wpNSȣȹhI Fq-DR`.N0?hn(t3A3l>I}Sɰ']U*T(UM[1"a8sbr VjBF Fďh:OT5ie2KPᕍ5>rɬWA 1@(-Me)E߲'@zKsz5(Щpiyz *mj 6ۉZ Dw>HJUHͧxIelw2~ (NswN9wjL4Si]!w!铭7F JǓR((*b ߹͖n_ KpXR(ji4NŞ*.- _LoU^Ebẞk{+ 19ux(k0t]CF471EjjvJfGŞ0-c"az*Ջ FzJXi{7It'TIÜ-pE1 Ⴝ(NTin=t3zo)T 67vLe`^Z,O0]')ڮPHe͋΅L8ɃX 0K D4 zNrҰKc2 f$ލǧB GхWȻY ,$_NͤUrZ+k-$J/̊]M--A~_Tr15  耤gŤ=àW[2WsUp+yZr\'n} GLER!kjJQfo`+Dܸ0.!g`8Hvڮ7J޳5]7M  #NF"Ȁ.x(T䤖J0'sTL҃!puT# *8R6q*/[B&Pr45FZدPG@ l@#ښ'FiWJmc eNh*ʞQzP<)2dv cE&] Bu1hGk-M%lj{aY4,O36Z|2P(fq`U"o7- pV-תkX p N}ěFGŔ%-AEQN5 t#t^ᐁaHkr3G,  6W@^3/a_n#rqQVkMR\H - ђA/VS~ԋ&IS!ozX!D̩"; 'ñ[y]aQ#c y6BJy5+C$kg7}0fHUHo%aPzgfXAs2EҍQ uypF^D{IYTL޻].Xp ȻS0x CG]BD2DR @`A`Xٙ~ݴwuGaGQ'[QS]/3#6A^Қ4ms{Βڿ;! i՝Gua-3){~;:yZ帋6)bq)j&EVS&}2UЃ밣}clU0{K*ϛW5!۸ 0fYrvm˖='ࡕ FSGjsDFZq ,pReEPgŋtalb5u:ӛ171{XL $X$fɾJfl/M.ӏq~E5|LFil4ff3T}3B{Q1mx.[NCO_%X*v%TEi_٨vGnz22*북u]:KE9ѫ\M_1NJ O't)x{A_d\T')yƳJU!WEּ̒I[_+&2ptx JKVaIg;}m %:N:JLJyCy-ey.޻v-QM6%&P# xO'u|]#gK5t=Dl qKd nP|i"  Y qvRs;%uP h6x] oQ. o[ M2"v n.y}/^2r]2FIoat<IduKV*3Y-Rcgo7"k R3ߣ{߽迁I:E0 ,hTMFKE鿖訲0h44xY*XTLkP TDVv/'}92Qh!uU,f'ʬZ=v@'J\esߔXWH(q[EcewO''ݾ&d-_suweyw1I%WڍL"cne_z"0?'SjFשDoVS4Y.}e;^Gd7Jv&qs]V:( Ey3ARɿ!MG.yWڮYO%Njl_2ݭ3;ϊؽ&;ąt[M]rn?$;iwYZQ]slt/O+rz<aZkL]o089ʪ\l;^kƕ&zb<BfՍ9A~öQ rjz͔q\=pR9oPwj_y^JEQȔ'0*1z79~ ۅk;A2>'Oz06FQLe=|E;SGFʪ?BJRэ\o{Uˮ_hTmOXMȾ(5{Nc3J mi8孄9)-acŦfy(B!M@z)IfTҧav `azNܢC/>tU恻i8tWtopS&rW-9FYGc;@w\Y0+a% )6C6;nn}n>v|_w0eQn|eYv^Yxp ؠO7'">rdG%bFQ2O|6=g86b}۫4f{UWM{D4,Ҥwd&G4UᛷbmK!" ~3B,V3Z7Vl7|;##a(e%! o0V;mòS%0C?;p8Wvɼ.>*O34 ü Rs#T /Q}K/;_?KK1'Oz0$*Ym,.57>]uX)q!f_k( &۵ =XS3P{EmKtzhh2W acA=rF+fayϞ(KHehʱc'`1O9UST:z hV~F`9A  }HȡpSʛJ >Mﱝmy~?HTņD}d-LU9(Tg>ĖmYHK j?/ Vd 'pAV;S<$yF8JSpؽ֭R4RV[ܛ:jfe;($ 7}NwzmzUze#JYƸJs8(~P!bC˾["?kDXZdz8OL6WIl;tGr x"0'`%=66'S}In!pksyX> 짻ŬQ#G:mmRG mptvЎ_b$|Gv4HNO>,GwRWʢ ]d>2Gڤu;&rγsi._Y:[*tNH#s(3j+gq[FNKTI*F,R$@=xb,]J>̒j&B*X cZt UnYtȳ*Bcp!X0͒qew:jDŽeω*ləzbxOrª,Lel7SWzh=(Tv? LKȪ$zzkUa)$3 ,SQKTު֍:ְX[I.6eX׊AZU/ł)pޠb9Nw9B❉i4Oσ?SpjĘ71:pŭV6V(1 `qv/-NR%s5 lnw@fKx^Ƙ՞-c9`'&i7\ 6F# ohD2%*Q u^gZQ O)w ~G Q*jȯ7)qTI̻AvUͦ Rْ`GS 7XٻK?AkTx@,c{ɇ{i:5(X#+9thh{3Óziq{T5L;w](8O6=z(um n"l7_<5'?ඏ~||S,0jخ^zF&v|O쮸v\`"}+OG~lb[gE E}ret3E& O brn*c:-zS&ω݅=U$w~XYlof@ T9)`i`e̦z3N6_mQb5QhM q6\IؕHXc,Qau'9X@q04 ҳF?Tfgז-;Q0A/U_IW6$h\OٴEX{4fM ,߿1ޡݩ tsxX MV(" ;Ceu(̗|>6cfP+ i}tD0A/FPփ4cDa߰oiUNJvsˎ#/d(RR&C/sTO+"TVLj-35Ӛd.)~cCa&yA5ǞD|4)~J>M jDDYxe=WMy|Qˏ˥K 8>~Zn4x dz^Y r uE9dwmeqH-Dyxŋx /pih6JDMP::< ҿ6N=>>2U &C؎ELX*C=0o3^(^tiZr+ Y#̻?OI\vaYO _o+l6LOIqPz>rsEgDb/DgQnC< Ĝ:rfiO;~̚ezfbNѢdzO*. |iFcTgĒ}0U"mt}-/`b bP&թs`j!IHDBar5dYw\h -`q[Fit-0FA+!1de)s9}8z gFmRNy ]qR12dSxi*gTRAj CFsd9-q#7*NH߰RgcNjjcl`d`la3Rۡ|-r!=E#&@XW`uBK0K-hO U4w8ƇO^e_i荑'lx5L򷦌nj R-9 =[L Nϗ??MM3d xIqA ~j#7{uJhҽmB0͔Y6!#qJ-W-גE,>mJu&>ӁT*`hzA1 X61tMSFef~6Vh9`"04JYߖG9˸]Ko Br1O2գtGtg-9.lv={8I.xح0)vjLP2gY L}3$3 8E1 G({2SJVYXݠ#'S, mҞP)Ϭsޓj_y:v9ݸl 7! 9wz0|۹?:$u(v;?OIl2z Odm <}8]r~Դ5¢ɞ ?%jFUv7%'u*ՌoӢa JY+סFQq~k 8-nrg}hu)4<X"C.J=L7YbwGnٳ:7r嗏৘(I"Vم``[ߣ}TwC.'NGE~{䘏Rn1R4r0/mkhKoG챰n>X1e >.NLMu0d^sao9#(I"'\ҫt!fCfVI32߆;nMB wwA,rH:#+s] Ra`K`Y],waKhvbl9Pv9Z7r WUVĭ:d@ a: ֵ9Ku~-yk'W *028a:kit+ϺɆ0٠d;cvbn "n;U[чTe@:s='++c{kM$Fa2SӀa/Yͧ:iW+"k(9 F*^%PvB"lW./J-9Ghڄ٘Uanj}[UiϷ]SYsS`%ffл,E^$Jj g/E3o)h0ZWzR+SOmW`+@#ur삀 a`Y=MnzR,}/SRЕ=VzXGO3ʆɨ.%Z$mխX5VЙH`L }6Avx6Շ<İTPxM o"%xHoЋ EɅt;d [WmF Xf6'Z>`AғuP;aK2!Fjr/y?S:Cݘv4I7O02WVDqlX|KGG:z<_(t}SֿHEjq55 l{V$USAS !cT:b{4n0>*d6vz|MQ3}fe\ ޫ5AtV#!R4"yGn Nbg@^TyvYk:;]o/ɛc}jaf 5xA,U@7e`6Fj:)*g E G|36GR;&{X$h9)_#zE"|4z@8,o+HB7)(PM/J5v>횕IS&fڐVhBOU? CFM&*`MK3k?,xL@㘪g%W =?kFNN9 ԌR/3,Х\QIPIp#z1xiXJeTfFdwuv@VM8ٳ0h,b<ۅ%v)أ:H7ewƶi\;k~!w䴓bhD*zN`0za*ҝuZvef1߰c$B'mߪdΎt&1~5t̗OQI.k &bgME^\AѪOU]m$tA1ϯj6 c7~xsBdbTG5pt$4l4lԝTLUTBr1%\$ͦwZ nUmٲg1P!j*[R7 p4`UKe%QCJt"ޖv9nzXO&㠛 ϓ\(y&a Uf/љdZW e: wJI+VM77H {gv[-TJD1CjC+}rEdW7g L*bɪ l{~+S\vq09ߦўKX/P0>?O ?2t߾꼎‹-U@8UJv1z#j1N+^&Z"7@[6X=-;OkSfc%NIb1_t:f-ߡs$MVr?X\Vy c>:Qxvsk~B&V[?h۴ftVEZޙI7=.7~'c" ew؀7Eߥ5o43(\V#Vl ɼTqtч r QjB; ][٪?d!'&ju/w&e?N5.zh) h@NTq(Ǡ#KoQ!uU*{DX/X𣲁46@"PqqC*L+_wߊLf͒U9J]:in.n \[)6*)ALci Y6犨EN#%~ 4%# [2 tD/ 4픎/򧌖5=Vfa`cKzUJ- :k Rfyi,M#[.SX*TIS,vggm.W)ZK`W`Th(x@91wx! Ķ{GЂry w}raL#XWKT_;wuq h=zucjw*d{2b$xTٖ* xs[ٳ"AvS~SMXb,8CG*ٴTߛ/Uf _I_ + V/'_[@i;I<;$06[ҟo `~"0 ̟ד [M h?Za[+#T׳ RB8Mr%,g>2?:^xW[Acߏ 욈G**7CFPU;YKWGp:q(L&$W:DNVQZy0+Ͱm nɣKt gQ_ iG eb;[lg%޵ lɿ S!JZ>STS`# Qg#7YowF܂xjVFȖEх%`t*dٲ 0⪢c%n)4bTi3z݂<UAj{fo͖cL2KhnOAY4j llh2fwȔPl#ċd-)QեQc۴d]dg*vT-?UA0|1ZJ<݋Rl.#lOȫRYa fƏ@U{FnH ㍟*Gxѕ= <_ӥZorM]цJDMtԵ泗)MHtPYlfv.}%geOn}.Uc^+{F=[RyF=X˰>0=F=+w>v+{\)0R_O5Q9MhC"+_s kt[_ٸW$C+OPA(bȭK =K/яY5zkAnvK؜z<PPpך3PI2e~c8X c 6˵PK:>eVyNmR4eP]7G5u\9 x+aTe,#6ɴ'3(x Pk3/LY@nY] V:Wv0?́L%CI|#މü|xw e|$)T)$'[2ѓǥ4+ss[x>?7. &N*~JG xoi_QHVl!A$KaV&_7Spg{)Y &h0fQQXYrX5 y\5j,G\`ξF&̕E7ʿy|cʯ߼t7n01|Dn1ygsKOX7UJbG xR:0|]lvKjfKF-*7="ƇVumϾʏ;E).i;kFax"-jw4Dz7%NS{Y#"^^QNJ} ؙUߪ:ͣI;!V ,]~gy>Gۮ(0n8 V9#:k,IfѲ+=펧xUkU&\z1rv3V8q_oȑo9)Âfy<f^q&cEa2W8+:G}FC; iJףbR H|i]dUUTһ,=E=cboaytK]~2i[AZqU ^,8^o Tk6,Jpږқ,F?*&'U$͔njLgGk8CZuҤZ _tX%VeߠoX4꒺r6x934ǯfqXWě{fq:s}sYWʋ7NЕz>P 8U[')3ϰ'#zʦRr'jSm}/Ւe//*|*.yY#GZʅnhoRa8.[C*vQ0HKՃEWx(AfL86k-_'.HJV-GU֣j&Ea=-ӀA.C)7Z(gku GyYȶ v;{=dgnU8FN+p:1*'5 jHE^}';Ovd&{m (d,& TUMבwպOԬ>UJftT8-3UKdXtaUw(mK军w({7!ik8U%ԩS%?moÎIAz5ZU46"Qb|ܼQ*d a i>2>C6m?v+9 N[ĨB _-,r/=[4;c5 urب!Z"F&޹^ ~ Jd?ozUйWOk_=-t !$tBR-"*€pLջ*"{FA#GyuR R+W{"0.#ӿ._$&Q:gbכ_ [\VERj;| {ivGD;6l"g6[d0cta~egbJgʗ IY J+8Z@˧r# ]W֕Cќ<҆o0ONJJ،}^fMCÊa@e5, KD}iǪ#QzsD=]i|Jn~ Ggq/-W=[Uh| ͘<%S6GC/.#.cA1/>cwx9{^j埁7w}gݽb(r&e?،e)!قS[a(%K޿}fsܻ`o`- .LꒄiB ;>u8fͰTH-Dtcgu 6RF)įd_jR+49IAr ;tHo 'SP3|N i!@6#2B:ܮ>}]=wY^E$|2 B'HTyúEx2 <Ȇ>R\Y+魜A٤K T\f30ʜok:f0X#APP=nMPUNZ/s_AM -# }zש5O([!w5M*0G(DJ݇xdϧL@APU*!kD TtP2`('%)/h^!eK- fo`BU,/SA9ɭlz'٧mc?G^ՙÎkmR^$Gh KQ-Jwd*{YW#Lד|ej/+-zs[`Z6p]1R]YF\}V FĸG-CnW0ɔ,kr׽9ӱ<$zfg~jZ],joO6CW=BJ&>!V#K/g4Ql)nj")߻m6F<+*FΏq(z ,—ra9~k46Q}[l4.lIj7˟th3VY6uαT~9qzHox 5F86f6YfkRvX=շ{% ։[MB0T N# 5d}؊G7f(๴ΟV3ȢCM#XG:&F CT!WK+tY9\/ѥzs a{*ś.R_>3@W>X/cuG xҮy S^:y,! f% JYt\I,e,*{z稵L]09IFD*OGyFVLRƦ12E;d =iDVK;]0Kuz.ʹ}ZİE'vdIvh"X(kZ7*>+D] O/%zEubB LjSLc0&l즇8ǘ*mJ[U2AKV{]l"Cm dށݔc߽lO'kc ]bancC lmC8h_;ݒUE$z~b?h~$:KEx^2y <o|?a^a=]X4E&]r>F.]=wAuxh&U:xRvG53qXH;:X}yz.A+yiڙ0FS5Բ1C'|$T'.p O㶿(C"H5]ɖi\nZ(7HG8^%DT2jXһE<98 `Td,LuNGPR P.GȒteΠ 7 K%pz.Wy]Ƶ03>OL-.)?G, 3q.JJiiꨨ^>ԙUv"*QC܅]DJV̈́ڠ2~'+e*S?w!ؙceǟ0lQ[X277L"^u7BAMy'lezr27*E zF6>HnP=Rv,:+D{l]P]Xed;tS}r_ LO;uK%Q>,gdͦ e,,^ oǨFづRաRR |6 u(yLT!pt8ITK[;#œH/cՠB$8OS~ W>2A%U:-Rq\qI3ҩͰL`|h݀囑*)yX2p4Bu61xZё N!{ }RI %Wv |rFY~ϑ^#['1i aU fL~w`B_vX1x$e~hT1?d`jyM͔l ?N[Iפ ,Иʁj2Sdʥ:j?-L8;EX=fӛލ6\Wұ$Kk*Qd"a 'h_<)ܴTv # *{ [0.㳫c &*jϬ)MMLUKE}BNoڃ~Rm jl&Q9^&$FؼfNhCuSpA@xO4KI^ї.&ϭ-Lݺ}j>\SGtI]%?\.F%]bdo2|eV#:v$9 Y;I>Vv+0I s#f%S<.HR?#5TG$KDN1.ʭN܄G˼[afU4f^M{<]uh0uq:NK YW0<ƿ^ʏ1ax+NQS'Q;5$!#[dZPUaS>R%nxL&U*gv*:WwI91v+CW@3/쯟].=XA,bz#FJ+.tuT,m22gR?iIOHY^P\;P*y3qw|*J$tbqjժjv$xH0oT֧D;a?(]o-A뀊b)z*6oacAe0;t/WM"?Dt)l1gAק@Cl D<3ѫkfSdVhKGZ=d-fSAS,ìAkxKuDX6x0[$*7,:$Rn~@~YͰʮÛ"`vwXљ۴6&KSfƩu,rm(#,}r(:abz娤e*`"v-Wv?NsIu_u^/"\z' S`M0%*d_.Gf\*k d3:JC`IFv2=y;-32`Uܛ'#kWpSJ$V!{ie([F{=cgfwZGENN;(AII+#AlLO0 }B @R8@"EtQ(/4 ߴ9=`51ǘRMSEȟccΞq, ` V*+ـe'(?̍\qL>R\m\p{#Kb$6b;piNy/4=8Mgexfgh'+>NxhmncL,Kq:]=~>r?(QS:,Ѧ^p*.~=VnҎ;-͐0rl_L2BXzb۠Ox6?s+;-0WAiDWC)je=tǙ#p>Tl1~HYb/Eԟ/쩤9}mF(c;|a_ﰄvϰ]2"] 3hh'aߪҲ;g"*Wq;7=I쯥/2i+߿پ_" q:}˕WmBVl`z}Jv*[.ks Wu@r\5 A&&*^Z{l74\]+ E2+x[6Brfǭ6(DJ85 Ž15ǗXm`$&iV0ްzˋ.25^O&ʌKZMPsDj7nÏi7z?LdT_Icax]ǟRk2]r[)֧`B4uNy,\kngiǦ<SfrrB1vV.Zeo,fKy%MNyI>@*3v>jۜf͞CYrݺ!]Ý>(r#ny |`s j^D;4Enl |m٬ttnq1,-WuٸhXaww}rn~U `>dI3e}Uob0UZ Gŏg6hNx9f59 ɢWt}kr*Ke>dܐD-?v#_ Ls)0^_y̾%Y:yνb "}Ot #,nՁNamh,cv#o!-^KܴOt7+{Ɏ"b9Z-TZF5TbB,u;I+O-l3]첳̆14kw E#{}xD4>Q˪JħҥYׅ:lMft(.W q6˨fBs14,\Ug)T^HPВb/_f@p) ϯ9AnMU~FMٳԥ$nro%)U5Z LUUϕ߰'?Lm5Y$820[>ƩM!gQ69jh КWtR*x n.W+Cbr=KsLA5CUE3QK;CUobxT._F3iIW L`Ǐ5*lqJ%dVb/x~1fyp|׊[0'0N0PT*ֺH1J}IH\`F{EcG!.:Wwzfٵ W]D?eVq| KY쟗.^:oڮ"=! kz4-!jSJ~ROf `l ̱y}mg6y/!YMCgR]6BFBq*q\`u$Z5KN޷Ќ% O쫼ʨѼ0:QQݔ_(5C^-]ako`wWBg)ك~i* @[b+􆤲:!@&F - (y2i*gnSbpA$ K֏e4eE: :Xi+U i_T68eB#P rJ3ALG:W:7. x㿪`HQ֢TdYu:c}iB:9~ބbN0Zk8uU fԧ&$Rn` Z>kդ,GHsWެk1[hZdRgz>@l2l Ho' Y7DF6h~&mvSZeđ^Gke# *|H &2/?Ȓ{\c4~)6PIV5Z$ ETcF5r.H>;WN36y.`&7IƦb*`3pL[ _^2S|jX4 977 z[n(#x {GAxrv !aђw6Ny:< Sզ`0٩Ĥx0] '4 nHڡxǓhoF@ pME&x6iݏ`G:Ks=)=z+uH+' 敪vkm0+Y`6)0T=0jSqÌ٭Kthؓ^:HEذ:"i8oNd:hBG^~ =L"^)^2E]CXyYoD0M &I/iFQbSh%pL>ʾ(whl4wƦ"*,Qf騬]ίcNA݃>$l hC)'C֮ @nn0;Y3Acsz0s1U zJ7{=4CgKxhUSM򨔉IUEfwy)'*?sv{x27 -ЅPThI֊:<ݛe 5{ cK3Tvs?(ퟣ `N 0}Fg"M ]SQ?>?:O, f_0ғZ'}t|-'P!Fv _\a١rD!nz(턮,}J'\E#iIq{[E^_ 1[D\-f7&)X'}R.+)9;I=Ma+ )"+Rg_Pz.CSW{-+=_]o@+q)| 83?JǬ2Z)(T_:ȣRQ]~R;Ff%"M݉/jN5 bO!qA'̩G%<%r)OmM|t<_MnU$cBadm(ҊO†tvfu)x=9e~U):?S?Vg<:vJ|K伙?k gg]ŮԹ0?S}>Woѷ%>.*L| Vj|K(VЛbAve]" D,UBJioWtțwbʒQ$fN^Q^u8vE"tPF$i9A{O= 6$g{De:F(9Jt[!˧z}Yjb fo%4TvDM>JцH|SF<LytAͱejM2+W/!)7-wuNO%xobBawx6dC#)3OxSϽMC"hqa wR:{V|)?߇`EHy1\23L6UuGfe[U[ QUԿo>}y`ik:[΃ik&OA_ם)kRmŌXCcyE>Kq(F<]rNkOJ-گr(Rע0ǩsPFC"ٕ *N3銉ӃCEPw.ZcKL'CFş X&sN)lL2Q/#Rei8wr)ذ`Q0c<ԘXJ3 >}z0,@IWj11Ur'ΰGaxAC3*Wl߮C-0;SՠgPu/R {vʎ Wnl59’䳞^P 7ݹ+IzƆwԑfO |&sr3ZhFEIsVbA>Qg &:f#p7[]%]͂8˘xP<.3 ˬkUJqiE2<]ll=7&;mj($l k&duSmMb:m=6'% 8.Qtp h13-<SX./S ʲ $,Up1-,KSW6e.&|ۤ3 Rt%VvZ4먁;d-#;wo b:ybx@*`b>fTD //^`/b'ir~U ES 0Qi͏D<DHr"EA ?{i XYR6ꈗ٪)\E^-Q=>BWo݆ܰm34K+SzDLҍQQFqoӟe>$ߢ5b,޿e27ov%o5ryivznt\t1P4wl@3nt4KО4QIpie݈Yf@.ǃW,q2jKIݿµV_eIWJeZE2YSv ;1 L:T5PՆ}嫫Gp;(lSP2#[_U۟}T!IVޕ֘r%`>k`Rqec hm3kVdYƝŝsLU ?y9h MmA!+Ey `a&s eWd*߄r͋EŲ-|Lf eTvL/eXhhIz=-X}\Y5rM f\ej!0^&xQ]LUkk ZR׍'̮̐3'4ɾ%F|ۇu cʬ^j߭7BB0{,n]JkK4cmg3%YNF=RG 5WJlvAҀjM/PHlڼaF㬉[T`ݜA3AtzPO֏4 ~ym=ݏDKSDJ*5л"wuI`UI주N:&%-}$ra`o_Ib:qQNDP.+rIR0/{?K߮&/NEd~ͨ6PVmEZ>HOZ,@ @~Yp'][އvA[)3[o>Y:5?]N?{*iQC4~liGնXo$tfکH%`Dk.Ϋ, U0wRfP;<_SUMr UJcҟu1h55Ky晼 쵳Orz<0oy_o^!qB\]P] -)*Bm"Zw QC2C ʃyu 6#&|UD8Fw*E!H:D. @ugշ@E.Z`:*GW0PFX3yVJ) WFG@@Bq&TMt6(]d yٗ! d^CMp㓺lbfo٘W?aPך 2f3`Cm9MaPwȞYy lAt=ۦIQږm*%)VY]gqs}H"Ն\՚E~U^}<2˟a)-v&bR! =Xw/Ƽ^4 Eɚ%s~jYc$QsdP ^77llELA`U H4Yd2ow?iWɛ>[,F!OwFvK.g >/ALeJMs"{lUߏZj bJIIӷl^ߠTSZ51o]C TZW}}2eGhMfGQX3 M6TΒ S-1-5_jzJ ӄWʏ(2HH&T@zyF<_|/a;bfb J:+q~223k|!%+{~QqXjk̊!LraVU6iߜƀ͟^,$VӲjO*NTAއ"_KץK`-a<'?*[;pi/Pd 6<i/&gםRsdsGY9LF Uj8-E#"ŋT4#-(CbĂt7fa6z]Ԇ v<"$BY6H݂G0 %(iSšZL|Xm޲[V``Un}&1Sjh+Ȇ}ſ,4S!(6pU>pik@ ffz橥"?ƌYDeH浄~گ-S1{Gi_:'7>6`$f@uxs1FصxsQ4Zn޵~ld&aӳ;!uy6RN&bWYZ__;{%|^7M R@-a5alxޠ&+f`t>:IGjH+Im 'po>Zr5unA84,[ 32gB|(U /^,~]]?e˚P9zІ$W\h_aK(=z/K2wQE׏ ŸRCGtkaۚ7 B" 4Q'+P`0QJ9 d]lM j=qf 72j#G:CUN!DVG>8EPx9/5ᚗ"[Ö&Cv{*?JNjXQyR8ISaHugyhOEf} yec=vy łlԩ |V:j7%'funs$8K9fe`sJY}1>zeem-Lfl7 ДlQhAm8SLd\"Cfud?Wغnr }:9 :{> W*;5Dtyg,֌*LL`;gĜڟ}u&?aiy3,Nұs-tE-qJ1T_dUj,tKS0e݄/1z] (PyH4= -G~.1u1`SQG5i*$kN#̝`-Pe//;IC̜_s)7%e ODYqڞT_gWWh1߆~gI*2^۬my~ 6H<^T%]7ɟ=2̒s!pbB`"`t ]t"Ã0Eokq C=w6(]Uc蠽a~hbwjVgH܄Nh T=B(UE̮Gml3$Ӱ*Tnty)& YzTQ#M\\du[Y u[.a"gxcڟQqck*ȁ8T8H= \:+XյA:̮|8drpּ\iBa39VEĘ>[`c{%+X3<傌ClAk.FdIQTJ:˘QvX@'5uW{dQG>}:nջNN*'k~68OʍV?th\$Pλ*oծ;Zn[jla&ݛ\cK Ӏf#=Rm2/A'=bs'9{ulQ &0!pUZZ\ ș4QY*q(0~=2KZL$DWwp!f:SCd>.-gijWߛ7 vqVƦýTCj%^,bZgIyD}\ >a{ ; VN{Ilvα~c#*S*EbN&.]:a)w σT[ 4tּ"?֑,Sgu飧|m&B&L#I=5YGE@&I\bc}ޜ)R>Ml2)Xx}qUwC'ƀqp֎_]+Ϛ$}Y}w=]U2EVع="ll[a<^|',UY/B6b%0V(@R9!I7]V" N鱍#ѫY] Pwu~QIL̺v$AjCѰ5t%7U uO>~?*Bxx- Z`Q!\T.CfjO+S=\YM&38FcGi sSd =Zɺ )$)8%JTWb5!zft$)ZmmWq2=OU=Yk =XRo©veT/zיEы/;_$ރc:%ef"W}{qpJ㭠Afo̠wru(HFϸq-CVk]\Y m+.@Qkm-kFGgz)0>_NQS- ܲgk띙/EQfA<\6QwrNO!kpF|7Փ0,yZf6=~Ndj&"P@Tm7+]ʭCuQ/%=6eN1j6PԳ*3uj 5Qڲ&= d%kCU 2%y&i"Nd*dsdml8 QfuBUKA_Ue ,aL٦xvjg·;&*֌ albA$W?]m-bv\8'OT51oUkJL{FTnܣݼ.n+AʝR1￝6VFue,Vڪ#f ˩)ݎ v kZdU0>l\*0_UE\bIϤcuF} 8! eAX UBL q{fߙ4Tp=CeL9*Y* mvb-RiazR[`d9l{ˆdd7C氠`Z6ofeT=tx0Cw:Ğ4WtUφ. Z+~>QD P{F\(5@\*m8S'҇*\o d]s!h+AD }c xcPpum2u!e;Qnz ̟v:ā!3|2U U>>.NOAJW);_U(U -ۨ7V>YF Q6e2F麿.硆'{Unw_@=Y*-J2KW3`biaH`Qyo8eYϏ y*N\!^}\ȯðK\<ͭ+6ϫ>'VCy! G&b@DhzK)rsU7BVQ˳_t`mo3[9SERztb Zۮ>a#BMP2f3YHBrU:KHoJ"+ןjbߗM^b֒.8K ayu4b;=a'=P,!ӴB0 LڍtW {0.ʎtz*s;hބMbm|!q7+iPW^ EFOj *cG .5r ݼfsMQm>vL:e)@$X&G(+Af1:g˘Fvyu%ZuRΪwਘeT/V3x:豊fי i~z瞃h_$2. 6Cb>z%NǦnB.['k%;9:ČejFLH>Pal- iQ9bd 2jUU K:j;QLj?)HN!~ξlMC8ڑY/8=OyRa/Oex*,W[?Zdk5FV1;2 ԯ&C֣]AHjK ~&0Sz ̟6rU`؞͡JG|NToh`94OǰpCX*)YPĪF@Jc*7OVmOF2RBz9?L/&dքTAjd3KBWggGk)-LFc .:mLq*lxA&e20,sT_ϥYvy uK:3/h;D.[7Tŷa VSn2oc %l1$S5Ϛʩdϛ?.0')r!250dUx/AbÜƣeۗԣtG>a$KSY" 𼇝3Jn+FйiHaW1_#᭲BIP5h(f@RP;C{B_;TMi` n˅FIGhN٧-F9`u(ǟ(۽7ܣ|m14*EWEÌ?Ƹ)œOrDгR7&fޅOؖujl Rx8Hm̲lSͅz H'Q, 6hYR:}EَnN}qeL$ȡ*tYtsR45d^, "C ?( Tn-9#ϔ^`(bσMiVp;*!%ث"`xr VuPN$&U`i' h3rz%:ZpV#9I57!T<c*Eb5HT4qBU:Z<'w"5ǟʜQCc[*ӱW֕Ns1ITO.WgJ+"x]ݢ;_x' bajXtF¿ u(6 :M2yZB%.l3kx3d x[7fSܶw1GCSQY䣍l0D]M 0==TE& -RV2jtĊ QK:9T i1}zM߫KGirrjtںQy_i:O0%*b3=hپmu6=mbyܕPge|-//Z "PM GY4[+}h23%G#nur<{aQ eWHK?%wP6Z N;NZiC{Z7]TIf$9MŽyT*56?K1Hdo oUN"3ˡ XvKi*7x5e'Cr$6NK; 3*4N3O[4 {҅<]{B%~$daHS}n&1gZ|Y0V%; A5輅7tG9vЈ4 "NӥDkΰۗC(ˆ 2,S~9M-*uIJw,2⻀%FExjQXa4 3*T6\ b. fMw2 {Ȟ}WpðZ0v\΂mT3<ytX!xPnI{l8AɜlHAC5:47hw>- _<umrJT[A(rRjiIqyq x $SVMΆu Fek RMM:,*d:[22o%|7 !M0di%iګjXʗROﶏno&fDֺpcX5\Օ!M{{(v<z!W]1[Ԫ@`"&^c. >ejs~UWk3tybjӡ~hgS-f. wvj}<4. WKS~pفm>sz̟vsI$YoLz ەW; oҐC8Cm$!VCw &:y [ӎPXAÔ.IecT{>^.H~*n7,D齃fYS"ve~jh 3!,GŢ[F[la" c>! l^3 )5תdVe8SQEjj*OɨByUa)(w<~- ':aUup@Ej$snRe2B_)pckcncH?6YUu#mP-NL0R z۷d 8MO32|ǪvDX;W_a 5@yꑛืBb:ROx#}T*jq9Fw!|Y~od0'9..yG=wdⷱQw[R5a66RߦxވFT#60ϲyG%|C ܔxxgneoF\|m̅&Qw}'uEWWu,J6,ے9u-}iŢ#W1SUb8~en!K#(`vדj,v=t2i\5@eTR8 }Q E PIeާWkaGpHY'nހRnmPG=$+&a`+jwvSɪ#Q1z_"nvS=Ǯ3[T[FWZ{4G {AAOYl߰PocCSUL|a ƳJ~kV=zupk3lZ |x&$ ? `c{<ųrC ` gL5ۀCqr<tnds/RV61O:29r2ќ]VܪEwRnk*7l16 M/~8-ZiX>*H{MtvghC<[`Zf|RT.Q&K>-_qMdsAoerŏvU4_y:;[L3:jdXd'z~i)l> uOma F'Vt5zU0WBsDi +~ʭŹjw0UTJGX&Y'SJ1\#(J$($7!nݡ$٣Kg܋ͅŀH5̴z!ebơ4Z'a#$Tf<#:X#Xwea;XǼT#w>Yֻ Jg@ߤ4#)+R:&SR `6wRt!9V;QR*(Kåϊ<]ţ2`EՕr`lbp_L'A4eQ'gm\B /Ud% +)S!h$%1 L3 8v\5U J :dK&cߠgsxlhem}]4Ah6<'gʈRɨZjitj"%ȁ힓g2A 4ɭ71:V[V]?cwBoU^*:c$EnrXE{euvŸT*u/#dRWHF VUZHghc8kgh@g ]Ȧӻ^r@o9M6ջsHtlә?yvAvmUI.5=@% ܯ3Ƭ ];EVaph&;M+ 90+7/byM8f则U<+}#v bd/S9'Ԃx'\}<]=Ys^iUn&-k'mvLoh[yvO]ߩ}KQk/jg?~i2ľ?w7']S+[qVű v{vsOWSkmNqo/1ܵ&wOKKu@'B),fw3S!=k K^οYBxEa4íQVL]`mZ<[1R9xKp><.6϶0ɗa$o%BFrE^ ¬Q (_>Ȍd9WQOc'[U?ߪl7X fRzZtee/S"7WV`ܽƁXR= .RIHoG{)8Ay;!:^&GS:,$RD)]yEl-]dEAM.Ry?B= 0a]f{ -Wu.9,꿏eYc]j6+$Kc)7RȠ,_^ϱcNH-$rMókiaU 46|DQ(3>5`tW*Iv1 >{)/fB %( 1EіjH(چ(*&-Θxرc_͏\6XĕxdeR(0-kokXufY|^.1i]SEc}[OYdW+U5$ŷ-P=!~:v{5au;@^Mߧic{*݂ǣﹺS2_}T&wAOݪf|;G^Lxj' y0)~v8+ c!i.Rl ޥπx04t}UIh:Ppap;zC'v\ 5 q;0O` m#6R9 n%/L7(N`H;_7*?6dQ,Ll]fQc~M9Eel&#oRTJJ]wdI`dh/»xIdcc\voV0 SذѼ& `sfoai&w؊q ˞Ub.aοed7ʇ같Y7[VS! DɎ2Myߥv>t.J̹ "GJ0 N/'΅tmIS hQn E,-= W4H8= T[SQOr,%X:wmXV,k ղ̐S,&4^K˧RiPVgT%aU ,EhTI6#8PCauV.p c6Ǒ<RdgP;]n\)4Hø, Vc=I4U P TlTcYz=wm =bGo_9 $E,܊9B6` ȽOY?]-˭`jtHx+*Dmov`:a=u\VXņ_Zv.pRkƉp6CC%1|d TXENӺAzNˇ] oƫyՉYTgh?aF*1`FrEĜpâư`lfy`I3YQdì1  +hလR5M_w0/i2hG5˒-jq+;OlZ=m(Ꞑ*IT5^Pxh2u̪ FH) $ w9)z(994 !vۺdc0n e X. 7}ʝBCbXP%Tk D: *cы8ʼ)^@9ݨ(7,-3QddYF.q 2pme UI(吕J DV[w_&U@6. Α %߉6=,aoF`vZ82!1?}dzN:د'V5s e> &-O|=/Ӌ<ߝZK:!sQ}UKlR(l]UH_$,e_<|?πkU6)vbAUӫOY5UV<{flvyJv;UbA(u`>ޭ܂ /yA"{Fi;U<oM,VK#AؔE'06*5Qd2 F*OVvrVz+ -*^@mp6`Qy] TRE ٴrv哟1lŔ^vyԔ.-i~U`J_We5^;/*8Č<'#n|>^_#7u9@{N`3E~ zs}E#qN%ʖJRcxPZ7'2T]>,/I?s%C۸_OYh:P~9H7J!tv`a-S&:glXypm8iJ eר\VJq? =f; S9kpi)ݞsDŽމGKq1G]"W(#sILFYTy!V^;sX &fko,2ApCS׎:uXVn1xl߱eφyF\+**ִ [Ыj=`@Ni+bW`k&hh`kVXbt7gC?U"umx]{OU<*7k!tm %lXh1z>\2ԡ[X0jqr:s;-peGʂ$62(VtrvZ _lBu.<1bJu6O.)>%x80?TaE|ΩH2F0J\dF"P[ůו4Ҹ8yFͭCb h B^'u]d֋ d=\)ɽHU J#iZh dt |Β䛢\,*)G&Y\||WBwȽrjl.ꚤdhx@o,i^;TDtvA`%iY(O !@{f1?戯_`Jr{E/jQZY @NB;JZ]^ߘӣB\ xT' 0ϠBUN+:E郝Hez;.Ɍ7岃8_MS"b$ ߪKt[$%+'IȿizbCł&(IثB:_{؃mH^YBh(AcB$dnf~y.stcBNC-?.V+źUzMM>awiuj'?bH/VƜe*^|oLE̟Ày+> az՞#,L)>$=VvJe)&;tc"}.zf*/A6މI5lbSh^rX=}x~~ 0l<s- SMac3q5zrkbtƌӧsT~F&(ьn ='+بC: ĨAl:Hw-R1ZO!@"FPNz|XmQ]@g#dý\swk QɵfRu8fثBKF_7B T:QwHl$5# ЖP-F>r4A5o;Eہ W+-㩰BٌLVIe&XPgQ6[zٽDol ΄l91h@gѣJ*j?JgJhFRiYv` (U8/KSp<:'̺g\|9&L'Mһ1% */zTqꀩw<$*&WضVLr|nNɱAW=B61Z{jse$I SfkݯnHrQǻ  0VcjV,Z +KFy#ft\ +yKX$i:o)RӢ)*]mS.i ΘqbC]胒ad{k%y k_km,[E* /o~qA\PW)B*꽢l㚁 MML̵R'6rܿMj^72c+ ʌ0u,UbRk82OtVc{U@%Oiu\8#e8 -K,jhE]K +/`XAHAZE(,DL> ,IWȮRvvsiu%Sŝ?W"cRgT]bǔÏmq|;0Ϡ3I6yQ}(ށQg %MDi?A/yL ް^xߐqBEO6S ?sIf~L'/?fGmzsؗU֬ŀQ:/cCמ[~;49 ̔ r3U]Gba`c<2B25k"<&*?9!:MwNw$Y9"uf|TpT&e}':K/lW7؋Ó .mq˃^o&'@5hy|RóRB]޲&iJnd U@Ֆ~}lgzʑ=;Ic5gJ-^-칈fmJJ<j /e6/P* t.WNrj%UGlg(44q~9@^sDúDb8Գ'CT{}JFм9 ن?Go0hykXZ-2oYpʋVX%8+<$ST.[UiQD 0c~-Vkrgt طB}^M?Dwq)13`t>=fEye/6栩̒KMg珤]b2REN-RGW4#1m7V22j^toS._}#[djW{=PVS{-ASgufwAe”TUcjx&^]&썴fa|gP Q Kb9fAw`pbfKdz^wN㦋We*)rlҒAe[-Tz86'[Y :s\%!!-FX*|T,2dvXOcc I ȯo5s8t>HJ%8o`;^LI s;kg 5La4+Dc'B5cn1PTUiEU4Ebjd.]pI3)U}wq]j`5$ M-iz]W4EU0"3;LM?BcOUBISb W$'E) /h҇/RHŗZ 2 #hT*SWrA"i4C;%iJGYGxe@C5OEsS>1o>lTہs9Ty|` au0qkv\l}^:NYO;6nBź?.c]|j5xG LMOVC3`t>LS9j)!S6ධC OR9[Ca6INVѥEIlK^klh]'?wq'wlwrU#yf<죜5 I>[۵PF].=n,k=lSY1 OZ8.)% /GQyLrXG\9ĨK@nKaMP 3b Iպ(^_tf"NBmhN.M;ņ0(֧htid\+Qv$q2 ЄU\[E3"u,[{# ` QDyXXĸ!*|2@V!vXsb{!)KDb̝0l˯E)bZ+,<-IV#gpPÔ_va}'v̙ AF5 :Tb˄K}!y@5"\;jTDǀu^&T0#Ec0Hbodz%G8lrwLq|Ҙ& Fǯ]4Eo pw؟-Ma׍z}1:E:: tp+ɦ?(=a:鳹%PbCVYBmϴXo ɢ<0|Ql.-?[3?J k>OWn^edUϏ(ݨƥVTvM#KZҗɣPs8W!%! lG:R° Ħkrnro:OϹne+h$׎Ri c>Z6S:k”ⲹ:5L]Bu$b[:>a,Coc:]Nfljұ`*8U{!2w{' ^#e_2}otFwdJr*0;В:wvh΢dρ("x ~X`BHҌ5X(bwZ W5q*$0LJЀEmR!rFY=<+4, k,}`97J{9dd t%7/ueztYF Z79&W 7 =5zJm5Qո(8Z؁5"$Fc-E BArLm[vzY:xGuO=Ԇ{ܗ_?fI Ʃ˸ U{/K=fsvg׏|oC5un5LG)hK_?E7Xa*/̋tTྜĥk0 }>c>؋8́!0y۠hs0GGeG߇y8`s;+11NQ.<6+o9rSWDdRH9p-p5shij`6~P0 !0QK`^"/ۨq1asz},`pYF^[_R8{Ri]l8,]|A@SN\$zTBu٦}t-/[!mrI4_Rd.aʩUe xzwĠJZe.f˴M^qq3{F@8C`!uzJW8PhX&n( Ɨ r<ʭ^/+H#Qasƅ]3s^ BΌ>L2W!83/G)@Зcք* uJA.\?u&N]zwsݙ_n.*Y*^(}KFju"hĊ. қ)ve)=MXn̖IEPՐԟyn5z#!畴 #BkJB̺6jLPQ96(oHP\zC[&,-r<7A<%;<+˗4XesO*>̺V`{#j}!F*jO;,vv̔jAVV3 @(*œi'q;/]ž";^,.5_i.JYQ|LuUA]\p+u0hmHs&-6!cBݥeQZk))pIۺV6G$Uy]GrzEv\`?݂} - E;IcHm4.>KGؔ~?OgSΓ?e194szre]TNak.O|b|1}ߤ_lW.l=MO!>O$;հ\Z ]tzie2mDw}Lh֗i}^CWEꤞ{7i qۻ` G'(`ZfaXtmM=Nﱉo7_NpU&#dKÛڪ4 MUOHQs!(d)B<`bTpԧqth<[pa:0wӭv5:RtJG%ϥdE;7K6s|%g<` g~ߐsSvEgMaeTsgkB,0U{ }jfDxr锩5Oc+%بY^YJӊœ a`TcUaIF8G˶M&Sx4Tfu$.y ƃuiƴJm!]4"g`D}Ȓy?ɐn"SX+bv-B֤ղj* zj9ep8T}-v,ўF`ɿGs;R1JYe4RThWiKr qo8>b/ 40Q8,!nB"n-4-FL I01,]8KİLgrgP1n#Fh+1߅'C(g+t`U`.ܾقlGJUm$=x< ]&v}*-*ӳuKG.-m;7jhk(AGUj-eC[=b]$3%XPG5):(c $qg~(x5W2Xн(dI%,Kv9$ZX5M#,:K5,)*cTܞ[Sw\2}T2fNV2 mtϟ5_bvjZ~J{E_LTRU8fJ+6Բ$\wd 1 N}U֏.QY0lUx_|0UQ$Df$X ^`z#s7h { ǻc HIcGL;Bg=T'ZL?8PyGX(ҜCu'z i!Qwɨ<%(s$&f{Pywe̥;4Yڏeڣf7%xEYqh$|\uMz-êv/ޣ6E>SwAy,#F5ciFJ>ҊcK5vM4 Ϛ=)2|Wes(B." A"z7f)\ojwfc?ilu'B3c^a]D`7SPj҅,ٴ.&lߧu'p.6Ui> lq5ضy\q\ҕcU~ Զ)e`!PJsjkYAU&V k _,w('Y%_'4pE~EB-a' ;(6BZ酲RQ|ߞM?4);^]1W,rz$!6gP.**0(lD`i?/z0}rZI,`R{)P:ShOӛߢ[~/? i$% ډ (-pbSɮșo;3J,J'#T0w)zZ8dU<G>!fky#+~{?"" &av|O,y>\Z!>4^8.Fe eًu1{ O.LFFŁ`= s΍t&b5~>P&u=,Ew,owh#6t:7 u>4!T*놉dB6>blЖb@ng[<ĩ&v7LO B LC[*|*{-xZKtيɏQs0b Ǩ0l땏ƥNv&$K#X&)(#kǺEh`/2/W5 56R!JU1y`>_{f4L2چ*N{vWTR;ɒAj (6S_9IIC6b<>@; l"dg2?KquhQ sNM|80/((-d<4 D%|Mr!e/oRVYGQcgt; y2]HXל鴉Ith&UiKz@MMi{5%sOW6y(7k+ž2,ltVJ{z%ngEĭe}t%VE9\r%t*.C8h.W[]9Αׂ{U6#\bW, K, HW&;, Xڡ͔5\žk᳎YlKA}[)r7v7L /Fw# w*NQ< 4+Ֆ^S7rGArUF1Y^x̢`8Q%iq(k>,]>?bOW,+x0nII@>'f#:>=ҩG:0 18nܧ,l~}t x4c:hNq;Z !'4ְv;OvQ.K\W>E஼ ɬlR_=m^Ы^}#4wvRW"fnčS+Oe(b  62ӮVHg;5uHfOB{PFPB]f3,9ͅ]:O?6:exx/ɔќr - [U4kGt%1MuQ/dBS>7#Gr$KӛJks/?KCGj"&=˨CLnÝ(ƲMCpښ 9|sE4F]K^SKkFPYP \8fOQc>w4M=`X,U{ob0f=->;|d$Xn7U4om ߅J`+31k~{X'ŦBZU#tii?KoX5!KJ1`.&j*7F/[Ī{K5n9ˇ"6_4Ò=+[G#u"ߎh~u\a+ȟ j DEB yX7VvEdj>%:YpAP'F#'Lbf4Xa"MPV\vvaw*b}vC`fugHHp95 1{V%UOse1w_M0C". zh\g (~ޢ7ʗ{݀AP7}1 ;*JK3?KZ}@b۱;V ecF|aⓖ߫1g_0Ki9Vf$Hм@*r`Lشï~)ܓ+,6&U^\yry=z܃0bo]44@ƞ1;26C8/_*[-|!"E`ZRy3׏ǵ4(|gZG,RZC9z >|RH#R:)ҝCZ~6QUMh8_Н|Lr;DKŬ4o.+0l:![.ԩ?atlVVk%O&Y\ 9qفrሐ~YI LՐ)MZ"qF3x˓]ۍ9̚m[PR]]S:{ & (~X>RIe`ebɓj"%;!V!ܶq>QDv)K7jbɸH9ewu*wE&}@^1*HØkGȹ[VMWMS?HSUٗڴ2`cs4J_sAjp KB?{q r3+7&UcߦXCy*;p`~o; _>}vz/#e8&^ Qb3]d,aPaW8U].UOΌRL`wm:{.Iղt3Ӵ0Z {L6Cx[L'kW).ƏG$ڒW3 vjPxڬ#52k. /1 Imtj|.MaX, ha=&0Yf)9lc/$$fsT4Eeµ c4bĦU2V\yXYC0II D(+èh4<Ҁ>h) h jYӋ֤(lCHx#ܳ}A ©q 6>kpR= ! [!m*uK/ݺem2[L%-"`MGIs6btS34qSN#jQPvDxtvu(G)>E"Ux BLq8mY1V Ez2Z)OύhulR-~XA]a:h ǯLv~3טf2$m{@Gz t7ߓeɲ$a 4rj4V}4-c˦(}p0=﫺nQGlKi[v fk'mzƮlp3Ӎ4ZY~.{(&zT"ivÇEZ ޤoks-HY-5hw)&8j|^oև'DD%P=J73kMvn{-eߣcWK?G_fd MwH@lkVr|!D_,Fa <ؓvBӗi9ؖ*NņPCt+ZAm';x'u82!l9rrGIʩH.l~, 0A@rH_, <T.?ӟKc PN;2PR=dOE&%~jau6{]fǎVQX0mS_{KJ\?%y,ׅ]U:k2-@nJ%[}T~d;ŮeY3 @ad:AM bf>j1PdYS)$X\f3ICQuU3ڳa@[ͨ4RKBcی ͸Q6ϵkw8]:PgSQRE挰=fD@zdޘߦ Z#UcuRxd:c-8~fjgeb?W<)i61yx)|N=x&Xyteò*+,$NAe4|Pf uwPJACYɟg,9,3lյQ7Uԡ72?,QI0D4G#tZ-ݴF *Ae#] aJpv9:-tRWMXgd a=f7qH|l1Qr=n cT!W{wqHo1F.nng3NeV@IE!XJKQ5csHaY-}-򚓃ҝYtʋ:(2Eqhc߾7Ij ȃ>?OߵEcHfcSrP7;pKdE.*܂I` `oG?𻂗bZT=6ND ,ijS~ UDȕir) E4;bdvotZ+F\W i:c? o`V΢v#ثgt/pI%/p֏@VF5s3{$"zi _˓DUx-'s14լ{*6n^ـ`lOҼ^LH@907nPBò4MjeIh^iF!cfӍVYOW?NY G1o^v`0ڄ w{Ԓ,f_y#JM YnQ"oងՃ'%\n{WYeUl|m|p_b6Wt+(;9*y6q\[eMuM/ʔjXuQ+qC st ]AZ&LgZfMSf@ϤY Yʬа}=7N*HB'ٍ)qXǝՙ 5]T@_=Ӿ2;tg鐍6u6or67ǨH5&1 Q2 JIv&ěܯfjsKWrիwu]hj^VixK):=5GC%{Ð~@X֑zEh#vcMW؅eUT#XSaո }Gl鞡ìG߳M̠ (;{ X|FY+͘^[֡ʢe$;-}>"<vEy>w&f}ry vfy}w6Geƃ]oXI=5krj-: Q,>jZ6oQ#q{fo1]Z#CPpvBUR}M'YiOmAm j: qIw%ֱ`t)wFgLCKՉuFHV`RnPeJzwWtxK@FFbЅvV8ȧoЧ:"ùA7ь Uͩ:r"43ıhE|3_Da-Ir'W^1R"w*C;l+޼?fExfDeڝdN}PBCt+mE F5IX#HOf:ILJx ׫V.t &QX`SޖS'|\8:#s=XCaK7Փ4q^ߘ{g=z[#;"X#d 1S%/~$~DOl4g .gECd)b. ;1֮Ӄ'd6Ie*#{('kG$#+W*&ַ&G‘A/Y@Ө vdɈN׊pdTf־C|drWbO+ͣSr)5|֥)1kY7VVj޶q/Ht%jM6_>A+ |5 %{~pܶ5$Z7k*SbB E_&:*|\ *qQablv0oD\Iub%܍A8*5w^B3}gHܙJ,mNjd[ato4BU4a/ؖMcO7uW|jkpx ծgY .oG@]DH\ W*Uɚ9ʸJ[D^LACR-:Btz~nwJFګ@67I!"80*&={4a:|6/@Cj ]᯵:^S,nmc e/]bsn8FkfQPP-ng;ae)[ /;^Q9iܓRp(e#6Al+01to'wFs/H-\;.]iY'E F;1LSFBRKjO=U' u-[t`\` :25jv>F)& ZQP4l#3αwǁQ޹tG@>L7Ub5F$f3 wǽ2y4&L3J6%^ $֤vsN:٫%,Hce$1f dU7lX5rP`;PksdO^nQSyeOaL˲Q30 ={.o5"a Іe%4@z%qٽɒ"Q$[b^xb#>!\@(gTm:PMIeϳ̔DͻI"i.Kz͘*h_۪gf@3-n4m\bZBi_gy"(MU{.~L̲('nLt[CS[DБšpZMISyH==Wܢt={"ox>io?B~RxOz# ,||B )~+[,gDâ,S?bЈ>JדNi.=9j~T,%SᾣtU: x.R-ri{,Clؼ dW2SlF:u `qaֺv̕$ mZg$ۻdn=9꼛FŸJo}5V,ٟ`T{w=dI+F(9ʹ Ѕbs0ao{cfh]nmV ,Bf`#@EiD*FYa58md=[k#urzn]Msš$t4pOKPyzV"@:$*#ԎJ4 L2V k  wc*X.ŞFHCogd$%oSQcڻU bdK0"y fÇ\TmRMRW|9 F^^;ycldXs`.4bRVPsPNvR%rxKc¾kPj<q2CiY"?yۏ6Sp`rb7-ָp6ܔ2/Wi 5vXPpxZX<=<^ճ KVuj8{8{PssPTuH%Udb>G34$ |2kϦ''|EƜM~މ61D;$l)bG?FJ~)Fx;gq=}罿Fb!_Vb͙sLRKpl|*>ENg_2|_]Yna4uo갂nh_T z.iSB9oYK0K/s"'zn5%EJщbtL)'>7J5]l1MǾD6M+F.T*T@5*Ѽm2\浖VF@w-tϚ\[u,jJ~o%Jܼ pV+~[UU[+[O ̠ǜhrf˳&{)q\Ҍu rѧg)4V#V|"z>Yz]~r=w^8g=ױWļSO{c{ F"U9ÿG* .mpū^]NGf_ϳNkDܻ O@0eV#tָ;n΋wA%ÔPL*>)Y?.IO%,*RSia pU*+EIU3-V X9쵗,_~.}%)S2%XN[}*nmp8cLS9+_LQG*IY6#pl{=\V@̏!jV~ms~9}l@ lq MrWSp2HN5G"xJɗ!Ԑ혠<^0IM~JbJRvL< zs׃Hdp:ڣR n _ {9OZR=UeXS䆋XXRw)6I&;h~ qOnwnwIn0sl}HBU;y tf<2{Gv5jnI̘,wOI4#FYƗV?"<[4JpN~ C4?csY}TJ˧@+E\<#!ߥ'u4[o@f ![Az)b }Kןz7_S_?z{@zJ[\_lyT-LH}JTѷE[D5wc"jETz , 4ݔ\`uAy_VVF)N: +A۽ax|*~U1EP#P R8>jÔzu#+$r :%fIU I8&3I`j zbEEU"Kti(<0* P2*8^ahP)ng0T]>VivtDe;A3h]xGrhp$Cb}f2 Gi[l FfeH&U9if ȪxY<`ߘgCȄ *)\L@"Xs#3 jT r`7Uv>>td$\fh8juzѧ U1*nX61ҕ_9 ii0RR!yi?ĆD2 +l[6Nh8t!ɐ6rh@v(*:O-Uh{ܞ2T=0F<5TܼJ}S4 tq2Fu]f``2 jޤ*aTz `:1GYVK>+= _<Ȧ|j>w(x. u45ɚNeѨ9U9xw rF*Nf/!:k#&X~9Gzl`\pvE)jhyV^2;r%ZqjC'Mqڙ/RT&rlĒIN|*8̋ {vfSoDʝ(a*yϥ/y>_8=>0b+2khvGH1@t~-vט $MUπPUmtQBB!*x-D'՜l+B$_#&^UWecOIE|K蘪H˧,U]:¸.WS[ل3!ďj=_$ ۃd17)y g0#tp -(YlqsU-QuP+D #fHQMALٚavT{PkX=ph*Qh+?ee2%ցlP.YZ6%iKD]7jrnӶ\ V6x@LEh\87cNYKplLձ\KV>boGcS ۢVWBa}}I&)JD5nГujhE8Ljz7d gI烯!/L)5r0ÕАbn֛Mj}}MLW*eљtH 68͎&AS<@EBn+ ;ʄbjz`|\``P'ZUL-07r 9)lkK%6>xZG|nt VIRӚJ+N50BM'=3Im֑}t,dN EuR;:XzvU֑GU+?'&jxdW7:ɖ S&ĬyM+v|aSfLvo reVtaiyH "xaJ |@lf7md`xcw9 Uu b#?1+_~>R?~1L|5*ϸE~JDZ RU_`Yߙ}GX[@[;0d-'Z/Es-۶oC/.("9W[P>|] aʥuA)#uM,U:O# 4_쭲y<_(ҏ5m+ gep#Dž]$#i%Y44P!`v9bqDhrQfY COD'06AbuEP?3YrdWܴg;w 8φ`-*ՁieU =xr7ey2bnj ܪ芝&CztPqLu{ͮ݋~Նd/A>DcˌSjE6ǮP*#\X2EEn;֘?̋,6fS#^8,8tvTX>R?H3R!z-@ݥDF@_ F^:8wX2=KO__!!yB8[d`2I[C)HB^GҮ{o2tyJz*c_!/<_Tq$/114P{MW&LWٻhRKni*/z ]-nE(`g ^0Ce?!mn;:&՚⺠矁nT r.F%Tf^@gy,N"ST"G/҃ uth~p*H~1)n\d$ZHVi(yA[$# tbU+"˦vAbi6j _$th Tv3|E3&$qcQ1i3yO;HTn*IAzQWVa d8KL,R, c7k9UyCdɠ9lsn<]H=`ӷtJG"K\t.hY݈&Օ<yf)+7y}ى첼>kZ`W>Nr g୉?aa60͔m&ɧqn3_7;"7YM2;URHiFi) <t-!RsTN!kl͆-Na}ـqB.a8UlJܦ UM_qnnͽ8 \Ѫ-CTYDC<K{zbpmtz3ߑYS%#(,6퐑xf܃'+G77l+nT:RoQ>ER|>?{?C+u?b34ʹ0 ptDrHFzkTG',5d(F3IfD`_z>Qe@GtQgԃ:-:EJv Ra]Pn5t6{fik|i XDb?T8wt2v24>cyQc+2:r ޏAm]& oC=3ªnLnCuN;>֝ רޞ=qdeϨPsn3s >$G9L:1rn.v2g)4&A&7@^j#Swo~=0,\xu73jtZ2yf\r5gTbtfG~x0L3k.ΘD2ezfkʙ5Illt/IghgJ,7y9]@Q*7OkiV7(OT&zhCu]dAv|VO*-=A6 0S.nt'4qTtXe J{ {Jhm=N'Do8fHrq{V.JB]harFoҞFh.NpM<7",f9H3hViv{fЯ3*ءRGI^|4cQc^kbMFɿlGƬ3tYZJ1X*]8\XF0{W*[KVo t㌒d1ҪTA*F ծS.v[\Hͱ59IK) [D9 E:?p*9U!jv>5JС&jS 2WCLC8*xvhC 3Pvm8bbZۤ鳈3֙g=6Idb[J߰i PХ3_M~r9=eeEp|> h(vP%iin-NSծC!Ր ڹ%;p}]Ws>*-ݕfDȬV`F7 *ygEz&5M } AtF~}1l R}aHEl< %D<$ ;岮BW.JyMqϿ|>OL:P ~Jil-lwE>LxfÔ/J< #=VGFN:1z(XUR6ݰngmH6VG aPLf&:ǤȦ6]sWWLVz]{('4'<PkDF8 x{~>%=O10ñ3Tpb6,Ќ('F ݩW&E) ]T͈Cۥ)X'h%=NLJoX[ t6slNGݙӒ :"'d]4l5G+6IFڼ 3y JUQw|\g!lYo Sa/ڂ&+3E gA1AWƍq(]j;s@Dwƣa#G)&Ȅ0VncW>c )$pSNHe[ f Gml CkE`m(RYdr? ROL E(n]e;:BZƪL̨QVF5<.UR `&\E^W?ta˵zTq2}$Dλ.B T>oUtٞt|ά^ a:/b~ChX(ytg / S$*tTv%UQ͝ *ؽ~=Ő{U]l"'@)5eϬ?uw<,n~*$ f1GllH(]ˉ 8@#ύiyb#RT}TVAV[=(?sȚ&{joB:BFp[u)>{B|b;Y9)rpP8I}Tȼ­ *Q5hw.+5JYj,*@˜^:MfN9ՂsQLG܁s`& 04paqQ$ܳtcgBFѼ\^:^φGN<.SysQwf1 .{Z̎\|峛gR)b݌orsGߕ ̅jUI0L{S2|q$?l2 Yn m_5'(HV6(=穸Q c^O]%h'S2]_&wk$e Uޘ< R/ͣ 6K~xu{/ϋ\ۇAH }%M =:LŝCm}jE3=I8e1m k.0q8׷ ["?yO}zF;=R7 okp`ٟpGQ9"61x|ݹ8%'|׿=@q"p_*ګ,";@ZH#{m?C_.,^ Cp6(RWqS]|X4d9Bq MFM}[垵o&vDĎLk|$svT1+`/ozٝ}8>9A%)Sx#X]B@Y{xd1 y+FjLN+EYE5]e[h(7 խ'R}'jd(Kb8оXӫ^=%߃G*rz3 l˴CWR{Z%4r%˕H|(>*Rgq|؍QQxsE .*@_Hg%gkvjQ$Bcdi1ӂ& NRE5_aiS.h[@mU{[:7 <l1*O%xtZF##K~P{"NaZ l&(^NL,w5b.khP޳(¼՛#4V㔯Rܣ:2yUޝ4oV +K>[_:Z)$~v̈0]ʞɑr.6RrVƒɨ.fp =#2l rg:iUgwEJeaWM>q\[JSSr"F{|;~EԞ]iVUJ3SH vp1DFv%\RA.I]v/p+O6Rag MYWj,ФVԤWeEޘ$$?GoTYqܠ'-IV50T0rڰ}4s]:Bb/Ey>ޏп/ ػYe3f|6XUT)0uf;K"LkzABl%cNy\dnj,W4g0|LFOm^Rvt-{Ute(MJr`tTW&F;Wi v$ ?.4 Eɽa[c l6v=Mv :0b@%]4A9Zsۍ"͋u̠FYn8 6F3a J!I,y@v⚫bv.cAKeAVluγGLVUoHۀC gB2~8i].*\B1_0 RY%j6S.dx:?5tTZVU|2/cM3:N4UUTDՋw55Kh"nD$5L%;%1sTT&ZIqKaT+o6@0"2q,3u1aL7v1-yv&dEE>m]SҒ{K٨6%;[o*iXU|^`O⥈&} shmJfvyEʄ6㞤m<ܗa< z(LC#Č-g`,:xe|D'}tJwriƇ,e1SߦEwjS\b4^-\=ׇI mKU62F T3XER`w9:O())ڑ#+<#')%Sm0l͏3ˠ-mEy>D{'}\ _gYab~>3qifQ9wb\49E+@xl, h#zp̈́]F N5 72jE^:9DH c%<`}u`]dصp[tظ6JIYUN|`U.߬&&f~:[nU+\c"9\GulVгq78ck#{]L7[j=k'mgc1x:_#K&F:#uZBtp*0^WĮK/<@o~ Fo6F+CD`,^g|iS$N1Q3X>+{鐩gƎ{M:@(q@Q\Umg‘SJU$X1̺])ԎW᪬n@=ez(;(P@nn3u(ǃ,v͠:.NѠb. }s('1,{b\:%u6 LCަy#)J\jdNf{ϝJQj&D\4ͳV^sg//ĩ 0R6]rch*^bE}&Y2Eg^h}+ۧ̎VIfF)) (!Ɔ`' ;$蘽'I/(\LP8(i 0b}dF9VCey;SǨZ*L=b kV׆.G&W 4jq-RStL]jP5f(*C/OHQ¹ è-=dT`Hy^sa {x^z]fySs(8Grq-j|d;[.!W@IȮN^:.=EϕSߞ7e[@uF>@U*!4Qvv('{fQ3Tz@$ @M\;]ef:d[ -cr2!Q'떦(RaH̹`UyGE */TZߢ±nⓏC kS G7d}Fln- I0h>}H+TQ(CW_G6؍Z^HU,%-tKO`M%M]Xk3؇HmL;J/2f&;ʪ g:HᢜTw\U\{J{qu,Nyu3|3j>Јau&])M\lP4B"]E0 m RBLe64GT=Gh)Mq\9_)ch{wst&Lh7[*] ;Tf9ʸC[yYU$(Z#ƌEtʰI]rH*Gޓ 2-W%t&#NBR5~!^Js>D}j.m vC Na>rVNmBedOK6wulbڒ3NU>(E3-6BdU7dF@+Y(a+;(^UUYdU*{9]TחikdjZJ0;Q1/`ظs`_=^CmVы9*] G%JqNfދy>:^Qs>xO踔löx`ypQ*Ky;OfDׯN,QA#P'^;>͎,[yk#ɋYH5-g*O[ƨ,jG̲ 6W\Ec?5 qf`:Xj?J:~e*dC1&Vja6i^Eq@oXj(XCanCfPڳ&rC 'M '9t=9]O=7X)ȎT'ը01lUT6C1딢F \ai|W3jg0 As /ǝJly~w={FskIr1ko ^ vZF8;*5 |c°tM۩n uئq#M Jd7#Rs=G:=Ԩz\HndŚ3mLq{e@wL=5>7A]:fh>^¡E7uČhFQQL-T 8`0%6PQ;%Oh㛵F\\jFv^bm/GX!Yч~d*=a44Z+|vrac.dX&^"(٫2θ65c,c>$45t]2hw%CU0KieN4RGwJkr\ID. *iS'*҆C٨喧8;n щ,bE(Yx c>PI:9T.fxXOMKa򦊎(r}KBԎ FIcG: <_쀉Amylq -%`rGCȵC%Lޣ&* ](Biz!bU+ŕ$ R5UQ;,7X0UĤj"*5[f[j۰8 .Y) .`/ RpHbjō.==W(>Eϱ 11z0kEc4 lIil+ |Ny)%>8f>~EX|Yl͇<=I=F/|%Gu&:p7?@R#^Y:- Ky]KHVccr>@o M #FD,V_lY.~Q*N; *1otÔN1Yͦa3UFz\7~ReF|Xe LQ' SvYԊ >3yFlBfcd,kP%y7И2E| CN5F9 ɿ[7,/AeXvvJ w.9]͝Cg'M%FHϿAy o5ol$̤ҀY5ðw* ] b47$@;$U>It _.Ň@#}i}Ş6-WvZHO ex9J-f"V2Y2(t&W6ޢ]ԂjPrzJbku\%R'3 sBp#٣b,fX `<(JUϕr6hYz'&5Mre˅Wj; 6Iˡ)SE}L(Nf\V9BTVm6I򋗬jh vq`la*6}̮hjC 7f) 9vrĴs%u']6_مO$kh'5j6P) &z)Sa"n迲?&\. h#D+ȾE4\-ϙ+%ǚKI;l1((->`G z}ʻ >z`N UX4hSǣ'ݯn3(MR ^qF@iji1}~1n(X)Kҕ4/Dm[Mi"Z[ڼi.-ATmdT8 I< Z'mOVۗ7utsVE>BuqYTQyIm`zcZdlJL ԯ0!6l14X:#8E9hB4m/O1sV(s 8=5S3B̙ucЫCT¿yHىL)9^Kj [9_̿[tq}迁{:c`YFi^ϯZ|ŏSɲ}_ˌвJ's>A7RW, SdcGD`A0 "tZؗvLustTUm۬U_wYAsGV\2}黔['I%ʪ4h-q!+n'd5J9vqJ{PM΁:!ތQV 6ruBfq.Дƚ Z E==u:djrT]ƭUPưs'u12tpo6Vր.Psq`F;şFݘ>㥕 ^MF q7nX8PJ4tI]o.pÑ=9iIˌ+ 0nSd` fed'*AHi_(Sf_`_äPS! d6ctv TR"%8k4{bd<lE`,'n;SFM%;r,"%"\Z:9RDXcw]HΙ:+BMnBny4YI eQ۸ѿ؃kUq/[ڌ$oabѐ(եs&NCU͌;[!46Ț ^ yG\PeQT1P¡OU05H9Ovڌ &m-hĭAM~հ3u';e뤵yZ)fנ@Si%t TvY8PH˃2I݇:EcHR]:F)*GU Q,Fn'S h1Oͨ˥Ś전)%gai(]vdHm !imUk΂ Q ? :xgad1$Pl@xՆlojOSM&[\0Vtgl&{7ڗHL-^W\l ,/վ,r\뭘Lkԙf`H(W~ 7[$K^ {B17sXϥivw24M?cŁICxJE׶Ⱥ|mAVYg{X.)Kn=vdI^ՐͻhC~xt=Sy\L#lAOKTԛAZ|EiE %Ubw. Fg&jgtbJd xAK@*׆NF,%,hK/&;W: «)!?-d(6W@IY;F̮ӬxRhC[Z ]w\'+<~sEK"W C7ЉbVNgunҰXCI`i%h55|hUhs/jބ&Yɣd'n;r:coÎ}~!,gn`8 /WAπI|IXT*0UsԒi`Uu$] F64g-t0lU ;cUǷGuӨ>wriCi+NyU8aHy݆^f#UPp@C i4aJHȥz*ڢSe(`68;+e2#14[['="ЕAym,=(]!g@{^JLoMksBy< ;f=f4_8Wt+qߘ Sy\G@U83 Yq} V]NM[u(A,:FrmgdѱR;mu ͠tWI7smVl_)#{Tv*4esi7ͽv~Yy_Md-KLHC#lc@qF5J9 <]?gXH>ϼ_+k6zk#`hCeY_7~4/ x/*1')KQ\n7nfU>}iXSKUj*9Rz=/w^2nɷj40*7?C9&Gǡ}pɒ6'WBT[~G+ eYyhvMِl5audX+WuTr)2Lzy$ D߯P-&b" ,gv# fe<ſYͭP2kEh)R _RIrBkYbݙ8b6JPɈ3kb]7mÿA;G!6֛eM0B >,O+0=C#ªDL0+Ѝ:knv F Ѣ.">0ӟVB7xS;5gv@//AlӧR1Hu6-KFԮPb'0x:Q|4E)tv\8gVa"4ScXzAgGfʢ| { 渨TQXe` 8\ ͫ)fᩤg&Y.K];sGp{h1"9(bV OtcϹf9ѹ={+Sl>pzb+thw [[tp'8U5Nfs:"sqCYL6\8n 0-0#T[ߣ}|=MY6п#F"k"G 4qTF: Tv OzիEށj>TU a‡;1̀J27-Ϲx4^&jwQ6&zA^[*TyPoRFW, QA(> hD=G)îRL <e. |ZlFv\8Ly9&u3ddH+ɂ?R's4YEB/}QZ g$KE3; @'.;(JP 9`Z!vNUv60>AF;i C`UÁAc :sƁI̸HQa(JùZH9^h*6xBZ&g>M0*S)3*Q6ú}N KD*TB<%IZm֐"HTlxj[yeu΃U pwH\!Y4]Y\ Mnܔv{)'UILZK ɢ% ; T7zu`1}Xì XYwT_ƽږbq*0ؾ*w1)IHϽuhP#\=="k_3=ᥑ$89G:3^2 ǺuJ{ZMDeGt#z4㵘yX sr?VDD7P5#`~8_s.Sd˅q;Vn:X 3֧ɪ>)K^z%3+ks ]JBE#`7;,.nB!)M<4=Hű~/` e.?IOO$N%˳:t6渤5n&fo6-Վv{e]cT} 4$ ЁG@(ii`EVj 5A0V*8+[zZ `*d2бc3PFDJR' #4fV"arqAz.15#;#[b&[n2ę_ާb@!lE)dS*_]6)r3]{>nʝyP,j:οmQ#Y 1M |Dµ麳}bVA{&u\ؚnY; 4ll/7Uw^ հ:7! ?fэu*1CTlBѐNl,IzMtQ,e{*!9k=WVJ3 BPx&`N:605KJ znaʥYcVK?v:cda`SL0oٛH:0#p W&Ss1Nu8[9:Z8ͧ0\VI!,eYqrUaP]Y7|6}T otJT D}%S#/i\+ǯ4~NIpY]ʋ8~ Hu7%^6ڨe^*NlMJOA7, Bog]^IP~ 2UfApSoS-.LnI_4>pPxF'TFϩ:v(H '_gwdou*+VVWh*~[ ժ3[9 <ʗffk;822]ĦV,PUuJ%*y0cda4.JM-jesDu&BׁOV0 .kw ~~ѸN#V*[RVIT?.S_ ?5*VL:lܰfnS<Q;Bc~Y 媼 w&>GweFg~B^2?m*mNM7B;̽b1sc }] ;;7Ф͑Zݻ#,<["<5[ҕ X%SܕϭNQեP*0ldw 7P-rKF:Dь&Yǽy*N6sfk@( י2/R5kn`r۬mFyE*Lq:odyzy9祸 cE"7ɾw8"sVߦپBoI]wS DQ YԽyk#`VJKvH/-٩ur+fw"7VNʑeQ+<7\bs%zȸg1RvEY;2 h4"n#5"g 0ImNRN!h06QjΤӧ첰"*.<us@ֈS`ҳ1ݺG9,YR5eщ9PŦp4>RP"!UWP+}YU+t^v[>peIĠUCr(6֤ƘQZ PJ!EV":"X2pՈNt9:Մ ýN5-˱۶`CQP.6&6&xxTGL|mΡDcy_p @3qX0k:@㜃"TzUoJ -߄K1 MNpTn+N[BGC`՗,H(6(UmQ<-%E.[2T`"yL%'ZZQ,)o1^2/2: W\v6ZŢc;g iԇuFCd-R)6IyFl6]=(̴̮.K=]}DU<g֥TǰX<@*R\ʤh6Dvů^5vGYؘ'%I2AVϳa5ANN=K7yٸ^E0YQR%lQ#3J{*-*c ܌Ӝż.cHs ID - >'FjL{*۸ż4*w]mp6,%}[mSg訴2A\?0gHo2;(c1ג_c;v4$K($.%-1s3뭔/h9*%A9fQtu)C'ʮ>J(]Zl2NʄYClYzfh_9Dt@]%ФN=7u(T>~w]nqy7 .Zh,6{Icz-C Wk:L4Jꨒ  /M1(UEӎ۶Ũ w0)T2Wj<:,v]W)R{NC_OU[qX~~!vTBcU˨Ɵ"Z[C9C96;'ra\weͫS;J# }5?K56fkRf` efbkoˏ!>ķh;ӍbaX{|&3߄/Tfͫe8(%dZ6.C'ᯰ3ԁ`H7cj'9jqb$W}`6թzM);' wvC#O~d=4"=NՊΏMzȣ*u,';5RJ'neQ3/;#ǂùh^]kFAC { {"=>b<߹t~/1Z0ӈK |f#%/`:txeH5kMO >IoqJUkT`!Rstt G>j QzcwRk4Eů>{k#IW>C  gZu|qmS"7 PVZBR&̚Nzdu)=>~BDkB1()Ur/'oƜ}0s%wHzI]: Bx7 e}.gjs#LՙvB1f3G`̟RHލCccF =^S%{Q76p6v.MPwJ*W˂ȚJݼ:n uVR%/d206318Jb,'~ PVlU0TlJ7rc`NZF\shSXETgcY7kZ J;s'q8!=+Miٍ+,^L֌NieDLV064)PQ5Ou:kA*g ?gj`?}w~1cn&MѶɔeKaM^y"UB@`@u+@?m`'2 8-ϐ3{^<;MG6(t:HxMyJ"_m\Z,rb UaIvSӊII7 ̻DZHPf daSXDxqS3l 6{P;= կq.%($w( t[h!Ǭ@vM6@ߨ g-w_mtx Y:])>L*)'t ϵ1B?}>:-Q<3XJ94dla>oj^C( =G}j_ _*@+Gp6Zj$ufsDMo(>M'r3).wMk5gokQat<,0Kc:E$f;5݋O{NFGSbBH& Ut%ASMXWw9̧Byku] e{oOJP6R1,[s*^8@vFi)3iًS8H Z g>MqT~2 UU)jg/ qU#)zĐHҺ"I]8kmv*+=F<;vvUqJ/N(kyG%hYgʓ푈7\& `T \&uH<?O# SA!rt? ؐ.w/m[:#| ٤;6RH geca-Q6&dBuUYrñ.a˛2Z ސ0ӱfLdŁc6|a]d?)棊YT6\$U?] K Xt&H|:꟭\N.; 1L՘VbǓUT/ЈK [SFua&\zr3f/UV`wR绪ny2BGj?f.f* 6Kc" FZZ*}#OO/:v`H*r d'W&ůT4WB|m<ھIqg lŽ`*Q +AGl#u<6vHΐlrcs(Xuّ(Y`b/P%m fON)ֶ,SFנ&.U[:Rrtd<=y c{VԥAZTU _jTyRs[N}ĝ5QhKP1ź &uPS)WWqA`j4ajεK2*\t; #U]$a `-nU 9<aͰ[#;֬ZZ *ð-T: kI'}t4ZJI,HBA3Rb"G.Z$hӣ[U{Į{Mb6'F혽(xtsvCt, k /2q]h9{Us>Y% P"pB (/ē6E]l=Oʤ+qt}7p>:['Lt7媳 $QI&]SB{Oӱ7_ * k{|Rw~?Lv? Bzk`S dgv?u:sK[{jK{JX}ɂӔnmys)˜GUd< _nF} nn_) ;B»u66#d-mϚ 41*eS@B!̷cC( -xLd8a1g1+8W=+#H b43ImTWk ;,Wͽj&thTx+WF=gJPUc9]UȺUU84-UnJKQ3$= d~3yS6ړ",`akc+Ur젛XJabi K0I|߯; :K܋,OEFQ@T4գp׊tǦZʔYUHj+`'.x҃n&tu Jc>PV#2&-OVh76"vbIU߭Lsf%?1hfrRTE\D:Cgq|Xny 6NjDka;YB܅_qΣIan_`谊9~B y0J;k)=>G3ތ8gk(a8 sTX=s(g%`PɨX !ϧ!rìw4jR$٠g#h;U`. +jMlUtޯ33u!Ţz t5:{Slqi*>tEzsct >>S4ЗO|mԏ]_ z{bUUfŗۡFZ7̔bݷsLC >U!刾&G[)}TG+0C?1 BRQpwZ49>rB7yNP4m< űx4E^|a}<P(O=e}ۢߑvQQ/ӛ];#{CUytUzNl&v-ΘUXcsnoU6BE۩R7ľZ[*dLܾ jtB&ʈRVTLm&JX(eW2WxڔKźڰXױ)GE@vYؓPB0E"Gޜ:`4T *ͪ6j>7D/'= :;p1a.edr îk@ObfEH%0Y\XE=DT.ؕffH`aMUJLǣG(~G %:#lYxV0WoŻ/d>1~}75 7cXY\*u1'ﮘ^:l22ǖwMDŽ$B | Rr:w`Fϭ푫b}꩝NF'~H%4ihP:OF3Y͛qm3cxITkna f(A>O9/ /fh+ɢ Ǿ\zk#`IZ.n9{؁A;٬^&X;m'lʫO~eOhF**UU r&C۴2=+ m[[N!IPeStePBXLOa' X ջKʤgb5WFC 9MJaSضnn5Vl(Fe5233].GNh;)Xb֠nklFXȚ6|$LЮ ̭c.[^ܧ|8|+L6ȵ]9`v uWȩ0#ĪpKa7T&{,) ۩BI§`k cU:TmgԸpTyRYdJOE:C)2|_Z]£z6*(L~BlŚ7-0^Vj.;3#4Q#b9A$W%ػ^X<̶"8cl 2^bœIrWx)"83R#[ }5 2hk׭rte$xGfꎜ@{>MȶYym]ӄ/8$Zj~ò|jDh,-n`uPt|w=FoЏ%*,//o?e#`~8_l !b;WicS'i6Cc"2_]d{vа0NfLkNW-q2UNWh/;Ld <2Ww:N FRnB+0P;D7IQ?‘(.Kژ'sanqrn4Q;#f)a(^I)ZZuX\1S;q6605eC=$J"{.hF6*R(ŵ]_:B3ũLOev2/4^췱rƖ%4*[ ;lI[ƹ?-Sc;Aץ;ee@4cU5]4@WtS_m0 g^*g*%xshb:rf`,KY+ Xh2=cNM#+]DUQ٢p;S&XJh{So|(6u ܡr_G3 Gu_9dU%g;A*39O__fǨ/%cX'ɵen%zR[;G^w|VѢ/Md$#jY?Z?-t*E]$ q%?})F_lhSv=^h"rKim_e=25P*=TâPW^@+.˺Jހ\ x ]!, $ܒE5X^[c$ E>;]Xy2lR$b`s>FIU2G:Ӄd j9^k͋\,Qe3z)n "jyHs_6v[p|Jz@yD[)4*BP ,n['911/ƒaC56H7U5m/M1fĮY+_\HOZ^NRFlw`uWDU P۳׌_OwQ&KjhƤa [UX,b *Ҥj~;IնpQ`'t6o`C.ge/j@ 蚧 ^ F^Σo'>`S_e&/bDwFf9ʞABLg%Sx0FȶMGHWxKmؓ1-3!:σdcюSh婚rݩngB8qYɫrwRoTg\Ǿ)tcT+<>IFB/ {̨Me dB[{)*Ez%)zbTt@">`Gݪ2,wMn갤K'2Ŗ/|ObhA*MTdxu'1<"4έ3tiO~I.9 GyjR/ZJnVR :)o Ӿ f4 =E(sTzX+K9V("K`` ytdaWCNtE9VQ+SՖNfbTNOVĮo&n愲xt =E>FXeQwR[!l8&;K ǜ"2=F3:{aL٫#q66%I6dȤڠU UMW%lji@ N-&V)|t\Z@4{G$=Burm=HTlE{ndnkh:ϟϡvज़@T`DUSs 셋U>6QFCU>ۭ<:.[OR/{* 9V\MT &0}-;)׺ >-~UB" u 'im9g}HsO?܍JPIXKY/8}(z>c]6EnJ'“z'A_P`@pBK=<io딪<3O♯Ϻ!`S#RbW.L.#SEiJ̓N* XLYI6k8)ݧ`)=tM cnvR;a}޷*NMWA?d$XFבjd-|N̥7 Bkz4Qgk,ByI,y}")Yx ^xaibT+檁8Dm3]/mf `*ɵS">;Dhggd/] QV ||%Dk&/CfQ[ U aU:"m1\} {=Tw]|9?ZT042oLD3{4׉C@VP`0 aH9/\,(nb'!]Fu<^+{xd/SO h,Lؠ,2zQ]e'Y[" MMQ w|~1B%_݁xh-U8M9wßpym6bc}.wN~+p "5O\M1?:1JR >]]޳t-Kc|_L੔ma$1nP3!p]/<3kӟ$97aؕPRpoҟ~G%F敪շDM)2fPrbZ+bϕ yg'P/1XKY:-\B3⥀yO/m17= ~s1:]3+d erAL`wt2_O_Z6Y>g{$kFe1WG"1RXII#u4P'Y~nq/zfCY&C@Bh3cj&`7z8ћV#Ml2~@n%cxaΩbB   6;RS6`@t' jn"iܕ6ǩmDngCK$Z8䊴A  UtW0t\xz/VpYA ؏7- Q|jet|2UI XO_hˣA(b%gee|T JeΫj˙H9fp*8BhvNYvNBQ6?055B*ˮr~GuYA=\]цT60tuH~gy:tr$sB52u}d{>de;bޔQ?\44Je kj`j /;7P7|Vzk`OmT6SWDSYtB2]n.Y泌gh[yGyh7͑K6aHjvwY?`פwL0w5QpR ɇ]bֳ!=Ïcq(B]CwMP9Ylno>~~>.O'ph.(ASda _9-g{j`aݩ[#{hbt݂h:C)H=iWl=oEU:@ΒVFwRwjtRQ}s<>c[񉑌dY3?WY9,?SA΃,~(%l6u$0ȩ9Dd}̲|^~Yѣh u4VX0'cß8:aƩٸЦ Þ8eH״nӵ!H>4rml9nSi4D,@ ѵ%!bOBx!a=$3,_]]զ{{g{ f` NIՊ݅{ڸۍݸB'(-%RH <`]{otwm)0N;iψb.W#tmüe}%&EDP~5e&sҁkMAT]PF|>=QtqvNg7hдUj9$8EmMuTuJ_\,ނm)U-jSAwzy#{Ь wyס*VJ.YLⱷΪnrstl^^VA>3)nJGȍJvQ*C!ީ*,PRΦa+~(i_2p$r]q+-|kgњ:iugRUL*1KwÞu6.u0()" aj:g\Qemqd6%n=)yJ KN h mTΡ9g=|ko9 m 飺vRw#1z"Z<=M:筡Ұ^H$)p% Ehad݋f)Vo>u9ߔi"Dh ]|B GK< }+x-t=JYVgv6D?8@'A!^t(LO~;)?vE̻ '_/'1?U Uaiz][/o۟k - 3_vMб1y*:]Z b)[L#&RDRd?ٝۖ1(]<Z-sAgMvɕXGQ0"O^Rxt ٢ Ef'r LkuJ_xT%P]laz"TbX.Ώctd&}zΚaNe+P^_xm&qcoUR53FET=<8$]>N^mԖ谩z?\(m9A&K ml(/]4Ǻ .TItH)%.=Ыh66=_x2+HͿrN'zK} ̋͢@`fDlìܲn _2ǁyB+0OI/`}av*' 㯺d9 Of]O ?_ACK-;{ ~b@= ݣ=W*S`jiKM9G\>#_ċwy)!=lt+Ȳuiq M{ߡH_蛮 ZGil_5Vi'']g嬥^&^zuo&:>fEi3 *@cO7X{,`WR^H1~h U0-N2#Yqxއ&#C[n3J$4F%lAɁ7q7NU(+Mruu:Ty쒅w0m~Q9Ѿfj*"ɮ2o``'&`gX EKZskJUr-HgH'섌}F*P14x[GM~l",nL˲֭Rc0ExWĎy^{Z>ikdy7(g6] gx}:1.?IbÏ~/|rAgOun줇:DD V*E}YWX\]b,kT rk&2->㩡; MT}}O胛b8YSLғ=IVQsԐm}[2ϱZz$p#a&;4D7f2l`ZϻB m sTiUb텿[]E#tfݩ9rGnEqkyBVdX QBP\,"M QNF+.}ժqP2T)_F|󸽘K4Y0h3wBbaӁmvp xvuvwV[s{nJЄT*[|ήʪ؏2S*q]*$-7j?wTY'kB~3~qHiNל$hD8V3:[P5Nc3h90(d{u6YfOe=3)ʜĜ&0i`)-韢fUP>ݗ8|!czұl9G{h=unP ݵ\5#[ n!U|e>,,yɦ8*n ͈c]I}CAMJΦQj,c5A)n*7ّ}*CHlQVucyp۔吉 Ā4ў{;ʧKq:cP6(كH$T6[.v^2[| nx>yU/+'!W`jիwϯLQ7W% RZ)d)[Az)bAwD6aP_Nf/,=1xE̽~Xp`+I(T"eޤ=&J(=$@@Kǘq矰Si♤ >8@+O/ё^, O-($1h6eMyTetIZ RT7\SQ+t ʐa $3RRF[VrHT¯зЌ&-HI4;UP%[SSͅst L "P?dG&_,>BoMQa|L]_@vU0cgT)e8VT?fUą<ĈMRՓsk99`#⵬zighMRw0Aj[ZaB,5&tY,PաUքq:)ռά"װM8Q2嘴'\?pTIr9 ȲM&%y剝]"`:9FW期`-=6ҽ݇tsI.1**\L}`wXJ1LR#8rerf}vv)1a*a%eG톙`^Z7N:g&UPKzmW=2Ulfd/zw7wYnz$~p'ڔcjܱ)[Jsn6c($m{^\" Cګ*&W[Eټ#6cK5KSrusmT܀ yOnOSoQ)+-: |9֞#zʂ1}Д3T:aTy~m[:l#lR(Ǿ1Z)sC1%3tOɃ@d4$MJt `W\Ny63bE~|XKk/q7[^q.y ў<\=Jͺ 坻B-uQr$FqRd۔ L6!Q-]A.Icpe$UPcv~&:?= , OB>W\+{lP3IWOj˺"dӍ a7`6Q\>' bFh ;&{E)kE->= sL"7D? -S$te^WȌGi1\uޏG`b!ru$|؉c|uA^0"N؎'!UP,:|^%:UK_~mmjqB&Yr;*L.j`S;˝XmVgtALEht)fG)߿f z0Lp^ggE:nUbg":ZmV%K'.[a^u^(T)G3l~caS|%t0W?1%=G6W3b~Qx7z1I-Ouf1g.ƸT9 @ڲRz$i D˔!ҙTTƸ-vw~4%rJ\<ۢU:U)ijMna7[cV.\CPcu%nUkj$vnI=hYK>YMV5u2;BeG5ʃdsxx^z:-B]sx\4e]^Z,)Zƫv@%sV}pUDѻNeXe3B$[/fymH[ת&If7ɔHsӔmcb`cff44,!rbOtBbl!10_?)0?ˑ- IɼȷR?H FRag.8%_ìD7d,hOE0s3ߍ,O-4SB67AK~\J0`~B<0zR㙣v> WDYnn )3xUN1wnI`o>t8T>&:#̝mF6oΫt>؝nK%ڛ!#^QYӟ_ 6oLY%6bx(X}x:|떋˸FHf`9"*[K211$ġ?Lֲ"_S<Ō!r.dJDܸ<"SrQ*[<8IdViwGEVAIG&-u`mm}WfIMy U\r1,Hr^yAeq kB㔽Ȼ ZJz^Rtn7ҵoie\G O.qd<Ƕ"Gxo1#J<3NEdCcí72"vzTp'WoT%mb4vbcj Tt5wut ~%hMDP']ڋ6 仾qџ=`|/M[DnCq8 {YRVUw5e>+;."#zrCZ!ʭYbd/GVBWFw|MD#{Ql4ˆ3X,AhUJPIDUլJtXfObs! ;. %4XԲoRNBwӀP!L1CHC Cd\7)3*8Ma` f)O2,3 |j} LL3%s 6 7I;r21C3hgKb-aWqNdLn~.߼9`. hi&`cu/Fչ2Y'{De0~)izdiB[,(Sp"JmfA cXgW]ܠCdJPI64I|i{,)tJ%ˁiҕvHg+Nuvxueoϻ"ChxTI[!rM|HQ*Q/hq5$^!I"|ώ{{y?TX 3ZH gٙUhd-Eml=}s="&KwӇ=${ma*D')T-HTJ]⊔ɵg]O҇l /W0m4 d( {y^ߥ_96#.PP*vko_鯉"}1rAOӛ (-}L~@yyr) /؛dD+Y^`Ed/Z>LǤ]jaۓ]-݅l*J1Ks\O,<:[[,dXh:"Pf\X.-e\fb`g!SHתV\ UQ-Hi&~r5¸ Gi@<~yOE* *9g\gunYR]qcda2%RMB0tYP{X#U] :5u{7W Pj>i_>[@' 8J%ҕڷPh\QP?)N~N4;, lй<-}"E0Hxbm3uz+ᢥ4(XrZVm-`qݞ@ߖ03B+*ɳKOPJ4&hب kvApa*f0 ~4zeE\A+2َRY&g!%F]3eިzsf2g"P\XXUUa 7 ifqZU$L-.'S"!SRSElo0uj R4f){sm ڪ rl 9ѣ"L:T'Ϣ*nvFn/Q*Ɏ,ӌ6Cx…lȪ]JTze6Ieh&*PBN{Uvh܄\HLCdc8wȢ9̆?L|#kv~R[f0eB^K}lA̦GDb>#_#OY"?׋vۮcMFg;Rq]I'XGNVH s$ q#;IU8Kg.ҷf[5BNRZlKwj tQYk!ǁ5ՠRp`hF@MU0Bn@6mQySa[8UE3Y'nȸfn Mƻ- -\6VCZϑlhdl6- ()Ye#+hIGM|eFԖ9m^@SL ,vVl&u%JlNuU Kq(8@.ڔ,Rp`%9z>tlUکRjӻY,H1Dwֱ~:̰FA2{u$b&AtK[m}1b ۥ nȟemtW/À'=Fuhd2g)*?_eTeh^}) DQd/cΒi"' TͬJim]rw1y-9|VnwibpT8~ 5NbϘYxh˨.tɈT J8tȧG`uss/5xCLeǻ _"٧ gl1V1DiC2)7НMK+:G먫zquHըhŻwS`"QP6|f!Ѱ>`~PMR"B4'| )uEN6NDPʗԽ#?x#L,:@^3Csl7g>G76w2!fiLe>c ޷>7C-: РY<SVRa5[پynNzȺQE4^61cȼQAEZ%WJɩMEzMPUe 91X%? Gkgue]aR 0p^z0)1Rb1gRG+∼n0cnzhա̔ r[,Ĝ yk4>Gť0FId5Pn3 c.-?(ݯ$07a.g *>Ks#cT*y Ugpeڞ?BeLL o7L3ʌ*6'k2^>ZSuX ~)5x\.(XZC ^#-PoX0ba)\6J)[RKKkݔGW.!v-A\FAy\oFڍ:f}1QClh W'tU^oGe"SiOR^-mʈX6K]C 3F>-NKɗ ޅk¯_Ѕj ]qoX|ij0?1IϴRFbMnccpSѵ-G`wF&5.٘=?{蔡s^qC4ńw̫$BH rQ EA p2,R%[4#Z`v ͫ`{Ɵ1F^snx( kT<RglOھa:)ʗcW#8b:h$+,CSfN[b1ᜤψ31ݻW,..fiJBۚy:>8Y@^]I+T-G3Xm6Xz}h$sN|LT߄$hΒT–ıw <N AvBiS,6;|-:^@SʵZLLN(\or.ЩY)AOZ:QS C%xQ@]L`1ٴPk'q./MqMY$.HY3r^ڭrDc_UҽRe`b;ufD*yث ӸDe@ہVYIRѥȘ ~:t2:m%\쓄2J hI>L tG00Xu.9LEPT$)Ǵ4t$l8 GF$ g*84)lM:ǜ<8 C!x=*{J*(@6ߨNnivڨkX%8W$82A"Xz8M߁`e#oh3Xه@_zձ, Re7՗hVy`K,tq_,iQza^i9HyZR5`l}Rܶ@6ͳ~1e2a[9'"2PguY0n0bs䤳4AMlaN/Eex}dٛ\ӁA" J_t9lY'lz8Bܝ^iUWYidN-Pf:^k)M 9lrzR3uPkvr8|)4Iu^CT Xlwb|t|uT'x.B k5E2SröhX-ؾaC~^$AT[,+XQevp2|-Uy9:_^[T}!l^W+C5}jfSi-lvo]NIH@wZwɝRRUP>QUB|R6=G)"!3Ajî9Tn409zR4MXoüE&r eԕV6=Jil3wcI=d!*ڛ v}m%1Ϗ#F-,p !,/1QԾ0rL+w?m$UbTms,<͑+#93be}=3M-P}4t6S׷7hL4oNUS9*6Qq]먧kRv^6h2 |9,- V׷Xcx弲Sgf."2~dϏc Sh{v"ueGHK([kv /щ{aHz~QWA0րPwϐmߝemrf )0ёe@] },[Wҵq(„^$|f5_C qj4ke8X,_`,XaG_&$ {V-`dffNхh6V~Iw.+5gqm<3B1i5TLNbQgpR3Sid%jGFI-ܲQ Qv]ЧW-UYy7-㿿UeHUn3#dSGT)T,n6VEYS9̱GxoXa*g!Y ffHW~h|,Ek3ɬA<ʚ-~ s*LS up%.BӋ!{޴@ 2=RZ+2.q6GXTY; W3Xf6Q.}ޚ=7zX?WIi/Q`EőyMOc0 Nf AykAgLtKR)"[z~! ccǥNc. իmpwuTVR,nɵg=WL:X]爴gz_ ֧{UYBV-Fي4d=>na812SӇ2 bwryx)5QPaOx|)TtpyRqDgb.<:/,]hv+Dه3˲Gخbzꊉ+u&XfgDb;G}VHiVhUfT[^2u& t;`ESf3*L9?9%zǖ!!⹧E=hy,kqCj4mIoC&2VW! #YxK֙Ft !`8dMb`dy*x(K5Wxong{:|HrOq(iԘ QBO|1!? y+rVP09a-{*tS jރ YoýJr ?D&ɞ[?[U w[笮zqs4 xtVB~4fU:qҵm 4; 2O')b e/DmFFȖMTG3NF46}C<&/}31QSji gl-Q2X&$9{h2MgѸ3tc@nWڦdGOTWP,JUC}Sϙa[%x_cܻ <' uBҕ#LoXeaE|y[Ve~\>k;a CISNy \#rHOdK^{Xr+lodSq68Qk3=T-f]q۽lPjw>c$1g=g%5?x &il̼e_VI'*eQ%H_Qjw%Y=D пJMX 11"U@SV{{fx=$5һPuHOZ xk 2NNb~U]'y7EWtN1#F)ic){ nfevbj[XO.UL|3٠:B-|S;LlIIbbb`ewb1׵ hw[(A+<2*J<\eb>ɨa JóU@ɢi.W!xR%4+0 *aD |hEQJ]4U*O+{Nfn689I{!rU|-[DxdaeoGlaK+[aWK"nuO:&/(V@+mK@z[h {,:S7MOY-0V)c_D>&ig#ѳv;n2s S9;̽>(VH,mէ~wAs:j?x-_1WUEY_nDn5C;XCZRqm?O`9L*[+dKSRmr0rMy2zfHcb)$E #Ʋ?cN$CfE5Rtd}.!khi ۵,6O<܋;nJD*BzZne(@|:u#]+haBǸ=;8bۋP+ƊyYNVa6bXJ_nVƳe؃oIڌ=Ŭ̒377$YN,fFd߀~VV'; !@}:1<~3|FףM݊;c !lMayw\S7è1CAO}8,,k;?~s5W`Dm <flk`|*j4OKk [DU,+R -kǦ3Gq̓޲.SFy j}Z58Y|P8x#F," _76vJgfv?2E07[5=Hb.^@&0<T"{6cm>L8jPm@ˮfmdPƑ_fd<}GvHoܮe퇹Z n{pG!9zy3,]VT>2~74*w8JCCu1!nd} GQ"rps&PN]CT6/ܘ啌5XpyM0h^*WP= EA0TmU200kLH1>}oQ9GTP-ڙd9D3(F3JR)sP¿;2df1cQnfA/έhX/WþAE'|&>#- \ÔVCk[ݩf&*K5ifǎyI]!I ɿNL,Za3q2Y2AL|,Ig6e7IH&Y|V|%.f dnfR0kU#' g{m9ȼLjc*Ġ!jټ]RigBMHKƪMVLP>W{a-TGpoW[Qo ], !pGP#ҔSe>˪۰\H `f- Fj *1+x{>Y pD+룃6sI^B6;X2ǂ5Д1UefN '"9+5s"e#i)y1OCKԀ\hֿ @jTHN* 5on5ص;(ike|mt5z^k9oذaR$#<Έ,"v}e@"A**HޔAgQ䁭M r-I By-U qyn=z4b䯴Ys=32T;LT=Mhn0L!8Ϗ=apjNmFzm3Wb|<Ԝ"ƌA*&:@Ϛ*ʴ(Rs˅X/nmUiўTʐHmO(#sya(btv0`~yΗ75;/I>.k$;/(u֜_0v7Y; ڐp*$=L+I,*t* ׌mԏt:94Lv_f>ƃJ_ jJIAZ,MY[4d+4c n% . 'SlF;[P|e8H1Y ٥[<( Jt ˩W2AMmoQ5Xu^>%B*G(kt^?S˖gawo-ZѝYufRDW$n51pACT)ئ#~A9G:TauedbzUԪND)FǣU: .GҏjS-:1; w^@5 f ~^4cHU1l1I.3I3t%r:P&|)wP@]z` ΦiRL4Qes[e!X-22gȔ'nzSveٌU*aF.ϡ9nMW]Ai ^4mtg6 9aXlj3"Ւ$jKU,[q$@,`i}LQN }w].exFPPlYprTz*L WGh"_%>%oEd s2LVUG j#tMT@"gV {@#m# nC_< e"se-s/Qhְ,@\Ԩ BQ|9)ctm,#pzkwfxڣ!!L5J %]:E{,3T=iv6Femj iQ_RgXnC]`x9Nb^,)€U ;.|T9G.z)s'H[6$hՊif!_n]ܯ;dmXZ)7t^&Unӥ|aϑ!ȶ ݃nbnCv1˷KKyZ5Sё9GYKߧ}HbE`Iǥ/Ad˒YLlq@57w뀫e\_R]V)K3dSa: <`Oj0h2;@x׬X+hE*K-RO+,LQ}?ot5 A5xh"&F,B#Ia#THT<Ɓ|ޟq*a&InDj3~'T (8La:l pZ|$(&飯-ttt#xF@& bl!7T`%;K+k$IUT~=`URMXUa/a5mA9t Gf 9 8-< HvbT_,US"ZH&0.RJKj. N_Xk?A:bV Z9.}Q7Lho(XӰI&uzv*Xۥi5kd?vѹ,u6Y'<9ܪ0~Tjy3̊B[&1!tGj>x!V 9gCU5i+7jf,֩%׼k32QdMu.=\\D׶5#g0 ]OKr~^R9p=t 2IxgV1Q0c/:A%qJ_MLJ黹Gi~lӽIܤASM~:0z[ǦN[b II/]>z,]2P-'\/Ÿ"h1$#gG P'i55l;VA[}Л*ltUAY8EPj蝮JUeR=dTn i6&QKP5?u'+Ɯc~Gax*ӠF nbU|Xp*"VgvɔI, PO5cZSq` QmT`@X>USE#SE%wtoAꗥ(BۈR W33jՑ%]W: I kaH]z``Yz/ eu~Fʾg ~ub9rz hvO hձTUYSKΎmi-QltcA ,裩%mb@] " nD6<`Pg,br3,6tXlk'IrZ:LkChuywCq*_&R"JQ}-*@@<w]̢̥N]w!X5#}ZjqY&jL`TVd{$2SQP( [s$kۚ{1*KUNܱeZ$kUշ0mxU#4RōNYb9#ɖ#79c_{|)0^.ÿӲuU2[ /Nbè s=d_.Bz^ F÷Y>&!P͛rGrg:.%KͿ;tS:Ĉvk0ۼX*;XHFU!SO̿Ȧ:#߳t]_齪+a"xGe>p#S휠+n 6{gPVL~+uo%{qg*l%Y'V藂u6#P3kS K>!s_O- {+8K S$J9Gؿ?>*4/K R囏K@(Oڌqԝ= f+ƪGlv+m~0*x<9BGie1.(IIz&jEz)jpX2c7<41:W(ƈI<㰛vy8R0yHQq$_m^f ~QY⿨-ܭ{ѧy} ̤{tK3~G@gt9yRPpYx(cuБ~ MlS"ޑii6[d yU(q&.zDԽePP;n:ə갈Ƈ3bI\ݗm[)qKS$V6A}򢗭V#2KUЗr|]^ D $VA<|v@ 0ϗeⰉ;T5xiN^L,i\&0(9FGy0-h'@R4PtTg$4F6+Ыb6fmyNe8Dm Tκg,a=f#kA7G*zMSxN%pQC!.htHpE .N#>o JJziH7VD-fUO.8"߄S'v0ecM] d0T%ىM6^eƯrKˍFuC0g:r斌6%Bo@m9tK$E-fxY} k=ߒ~\ձ ω(U;e 7}[.M s?xsOg}>f[EޜI~k$YL.M\*6߳:^~ g衝O DUݍς0?"Ю6S]P7=bsnX[},qvHqfV:0,}}ꕞ&xX.= nWwȬ/}v~nf~ᐎ^xeeKEv \ckšlrʥ=l!3b&gC~> `/0x ̟Ǿ<[dPH5bmCJ̜N!\c@vY;\ D #RÐd>s"+&;8͋Pnhj7$^X+yoI;sbf6L|C-Kܺs Z 3lFﱮtŽO #uRWI/Wѕc0BT=vYϪJa,r>%lO'( @|}SLv)?mǮ_i/ b|4 gHWAgʐJ l?RT̮n%u&TP֚ͩRv);<*v N%"V,q5KYwBgn0?R  yaF kz]f+{Ma!h`CšYJcom7 J\Zt0<:Z&;S9ռ|Tn"Rj{Qn:֨s'qZlQWzH^8S%YQ!džȳt]=+XGU44!N {C6rq(o`OE_]84#eN`D}t"Q2PIsoЏD< 9Q},TyC#p 2XώRj7MZUz0"G r볏xlI*-LpYX+r'paͩe*M`^H9Hd'=ȫ3"Tه7g/0O:z$/pU_ ]lSBa[2Rm*a qbo%q@s c%nd8&^l?DN?fmIh]C]!3:KyυtgJ7xkxP5}fҭj+^F !G)/V-sӂ#G;d1jQmBzK;|γO!Kn%"# hWFraT.v!Nm'TҒVXP4ǒW@ަxB ?w+|)0^݈>VvE?)MyFGqQ|Ymۋ$Z|N*huHko5< (;u*KW 4Qڲ\#$O.-Q,T;II`UzÃ"'`adHUGU?ᰑV{,'M4Ƃflq﶑@{\yEsq[o b[>;,`,Q,}9Dm[y Dg߆REPY2hg;TRҦ{XϡLBk2>qUgRy/RIL"V=&9l0$3dҚJYRI ņ|}:^%G@T^TRaU2S9FGxEl:yYD.ݿH2?Gx)j^ [:sTu9(@3]?.#+t%j3P :a`4Iӂ ɈC)a\ 1جfxfThee= aI{=Uk:4L"}1R 9BnnKCiꑭo6D1 .0*Ul6be1Q%]إ`ۅ5CsjS&j^t˿Y!zyj$js Nv?GԖ{6hN9eIxCvAVӥ0e>}~v=ea-/)[:mZ$I+V O5E3b8@rZ%ȣyx4ίyyQYpoJJ1/h{v-!4>GO R2Sm*yN.5H3T ,T*\ &/̤楹?-kj.K$ew/ƨTw cBxMpG'\|] z^1" %+ud$srEW_JMr{0Qf׻OX%wa.,V6zFVY<FIZ68*c>3Cb7K8vVEE[;,e7SNhm` >k}7|,6C<:ώ1<}\A/GǢsD٤c+m%/.3S eG, ,;#I>v5m?-\} _10c_Y,qXo1=8ڼWB3P"r+Y!i?:-fI< {u~QDZ ;gzqj񝆞 >@{(r~:p/uts@KrMpɴ =uG ZJT*pՔ:A([^bvyTC3IJGvhXVK'ŪTj6cuzay~W0y6(ϑ 6C^uKKtIh vX 7`QpSiBԭL hé?cb^3dUwEU+ 4Tb7{r8Ypk4ӓ/xǗ;Vu$Pdܔ-G[ÙHu"YlBE>^`^*>:k^&C/lRMA~{Y.fYcm )W8K==PP&è,j4IوNV1C~+偌{,bi>әIRMYhW|X"fJRA4D]6&Y3Cr_PfB>CVM")-";V ^Yyq9+m54|g~th#u<BEH`1Cy@%Reyة˺+* KAJxdk B]:VzT(Ƴt5I T\[+|j3JYf-yM[sTɘݷ鶇WE5/3I?Z|lُWfV}/09֫9:¤ȕA7uI ɍ̉#Ŧ?Vcz} >LFѨ=OHT?^%/ۅFC=iax~}h~Cpk#beh跙Y\|&l@fȸJ@. ܋B8ϊy>D`03OQwss?˺I' |f$!M Q*?,ق ~7ZW#ֱ3B45_vɐڞN `~o_`~)0^9Yu'cuݮ}P#}՛pdpYIoaGG߻W`_װJIBzk_,jz[Vlr[,ZO 3PO1NNH#cNuN~gٯТEPPE׵s? ?oэJ,$j˟0\ndYuK^j5 mcPg0Wg"yFɦQ4ɼLUs:<\/aXucd FGXdR^LIV Rca@lK!V85/hJj|&|)c60_#-4.Ą "mT'2¿Ak؆{3F4-G*&(J599'>q4I%n S&^ T1u 3gȈnO7[#" vv wʌ`kfInt[,}}y} ̷C<[m Ag> 6rjػ)8 ΓX:"eߥ/2G W?y8,aG3jRDZ=-g O .׋6'ecO%;*s U6YkKj`Ix=keSzˢbii*0ka":$)Zowm2{,otv20~2TM@t UnpJVG0xx e=X,"<؛*. ֌JwA}.aaAuF_+;d{pf`ɋ9}.ۢX)Z r`^vvl$N0OGU2aQ{r>G~mÄ~1KULvsx֛Rgd/bD3LG_QdjYZYb l)sAo7\8#$;2/y\,]T{ JvqgD$zM4iu.9CFx`d.ǰ܍+b^PVNml3Mxks!eVZy9A ~1{؈}E ]Vx{_&-bɓ3,ѵF u둿=]] l*172;uZIGuœ9"==l(!)y%̷>36ɯeS~k_`S`>'zz;ASBkHvvA CFq]`@U/.S+RBNH/+IxvnQ p] GzLD3 1ïb\% X2BYws֛>Peo[$SN'+! %Y*ޖwC!^ TO5Pn>:M5 {룽fbeNExFC1M^TU9htvvg }ZIypRGGWI̽R'RR y})!QRתҳQӿ@5g7MfV^Rui-'Ic2V9* WY9b7-.XBzfh±Cz4ܪ(g{tZQ7Nb!tΟ{z';ۉaq,]$nyl*<[n"xjL%y6U&!4nԇU6n^BbTðUsXZdRI44]˧/Y28>'뾢4K5Jq}tLs':i<>nzr9>mLѠI\a(J5EE>Ǣʾ2'K #AF!qџ?Olͳ8WEd&ƿ\*!7u!j~N' ˢF ֻLd z0~^A([olr ,{RMВڢg0`_`S`> 0z74ivnfv0+FmLA3TNŚ+x >LO_@ x׵&|%?75lI,~W ^:tbC>7jޱ>d'"^(iYa\!Y5j3*|vUϗmd;hPҜ(hqyM RV=tj{tX 'Z'gTQ2Kz +WcD+^AIg՚HS&;~]DUV#Lel'M*hx"'VF6μwFH:H)R5 :QYh{QY= i nt;+mvYɮx^t20FBα6JeO.KɱNRzVaQr-f.Gq#I4OlSVf_Vw#;2ڟ6| }kq 4k{:>OS0 /2ǾqꬖO%ݠpݣ U!IkRTҝq,keNz0[GtT<{&'.TQ[`0}A`}l?G#Gv5jb0e7#{9Y3lnf?0{מ 4<]TI.ժ:X' C)X*Py5:V^&01?N\*gi R㍳v~Zg+xVZt[$1U6Cg q>Xwd5JlwϑIBz[Pm@b]gJn(OzRM\Q &ʲvT PAw<4JʊRLyl`LV-V 0z;ځ.>Gi](FK}/c0< ĩ i*1Jm`3 Gꔠq 8%FѰ|eQ:ˆ"UV<&A5(_etp3QM.Oп4J>-ЍkpFXp\ ,jPǐX T|vv=xn7y5A6~H!?DU@WʪjDkgυ4;D&d$uU-; YlmeӔxЍtvbθ"Bw UNN4ie0]ǥ8)½\@/SvOV$ÿ}Ci-2j3H-5P`@%,HDV >#Œl῟}}ן QVC] gWf8a4\"]@h/BYe6x!lخ?cMY,hM[tRm?^ O. a]((V$UV!?5Gy7IGIvlLOͦ^vձk@*ӡcXs5 >:bHP ѓA/mH c,`F{{*Y/\\ȎAhFL;FO0W#bFxG3x? Nk|fC2`nkP= ` +xgv W0x~FHf^ثWLEݴCA |r顩e*a<.^536Y'EWk N? 3OT -mP;m ޔI0 *=QՀem= s 6S r;=w: `QFTӫf:pn,#x<}fRH^ߦ\IQ_|4]\3ϣRƤ#ZHC,8f]@^ĨaF ֩){l?(y Ru0r^_\*!+C+dgGo~N|2;lB12B\Of2xaǃS5i&#'ctl'b#/0S`>tNLt׌BV,"|Jo| $z_qZrlx^ bH  ٣/ 6퇨,*2xITRlz[(Jz7.cIbT!] vJs,fVd݋;5U\w:pvH&icOӵYif_vc|9͒Th2K {sp(Zo}L ݤSVJ2Hύ5fc|BEX(ɥIQEjTot 'zj+*mbg%ځUBQ|'I)1Vl7ok<{lz?%C6]9IqDAA=]s)1H7LFv(AbTG 9u6A anXFBYU.tF0u[ؔmOdr2+d*bE 3&K{]"-67Qdll*O FΧ;g:9^nwH5[8ݽVV嬬^l ׽?w+| ̟ǾVp=G1ٗ‹QqжUH; q7X2}NPQ--vuR1cJ[!= hõY3j/(kX(ji_1m1Cz-,M@ʼIG=@|['+nAw30BU&Zxנ\5yFn -۬N-i-Obj 12ϖ{c;@^\;VmRbS:smg~>fWNd_jհa tJB>#sr▚>k[?L^65V!+3 GJ *l͓CH%%'- D['^,S6OP2[ubHfݑtaxf$cSBWQ{͠ʯ Y`L.BP@l$`IXKJ.s\ʜv[[xԪC9~Pܕ10tU'xskZQg,ߚ5:Z3I/ӓ;ܒ5""St!0/:)OwJ%nw UzmqgnSmZi}/wd `y9q!b)a!]o<^M1ƠF\Ue*Bx&T6ϳט!=΢t TuV?)0^ndNCd_:H@hHdm(wBȣ\TjkxBe11ROJ \01kprjWM?bWYe7 sxG| 3WJ>ZTO9EbVؽثHSAP7ByQKP]PX̬&˧cUH&YI۸-UD&(N uA[W~iڴ (_˟}|PPc[Ų{_[*vj:LFuOn0/:dVNQ0gJ Vs,]0;Yuu'QNFX_5`2$3ޤx #R ,׆_H W#~VBů=ۤ2kM7Tti7j҄cQUPٺ%v)e< fx|C*ͪBE>%WZNcTx00P5--7t)S1٭^m^ /oH6WBrgFkU 1 P푤Nhe7JF>B\9엏lBPNGգzi````1aVKm-əu9L'@S:A<Ω^ba4VddxtI2& Et(?Gy`U4,o2m_qv7 Kq1\/j)pޥcl0w텥+8]uHA6VTgz[Q}-t2 X2U.A$Dxe^<٩/v>^zϓ"zL2:Slh0;OǡНĆaW)Y Fi7ܢ3+ Fz::_?/l~l?$Aғ%蕁a0SGӃW~]=UŻ>JQI]5v[kbDÂCnVX Շ%MaVgp:u̩lY쾿6IDхK@t@bSj,(p3iBO lW86=Hӳ=+VV+:gШ6!˥zE6Z6QunHɣMǬyF )>I3mٙ*aCL=A +tz.vdwujaL OcZ%O ɆxVV´CFAFн"ٺRjMX%d:+g^YK'&jK=˨Ӫ37n[Y*̆/{9RhӒJYJ-K*+LnvRf>6%#ه/0`X~5C8c,n@ա*ߜ׃Yw߯!_${(YR10siS,ʑqnKn=TAeYM}SĠ8)Jmrw㦝rWhUȷIyҋT;~܈y΁k+mUԌ dCjuJWH#fvߟ~Z1I.|$-* G5KtvѮ&# kte%s&YLX#a+ =ժCOK] d,uxlʡT3;V1ʮtӗ04{2G u않,ʧ;aclHK]Z4I%SyuvyC>6壒K pTar4T7tGPxS*?u0% H9K‰7wo5gV(EK䴒@&˞KM(uB&JtkتJ; 3jc PkoRUw@S_R3$ձ*g6;CaR mGw1E]o>VWu$e|YwM!v)-1$Oq$|člc!f62`d W"e$DHЌ]fYUHqȚit~)%EůͲ!426wӣ|8e&].1XoŶE'ǨIc߻yZbvɆB_:sF/4{zDžwk]&QJ?FQGkC)Ec^bU {xYW`G&#( 95sO3\&Aߥ?_ ;$`Z`?ƱdPtPvΓ&./tz29(gG$<SvRp&.>.f|Erx3;/wpw-z?J]7mE{~%/<. {I"-ϔTr\3UL1wȞ\^*vIa9%ݰ~$nً'd MgԶ\RgrRߪf9+ d 3!GdApyY윹G|^1+Vk~OJ,-W4"߶|Cs񥭌_uOYq뽺=a.N2Ʈ.z]>K`pjވmwڹ.?3(/v>ɰ0?ɛ?oɬn=s| d9B6õ>wHs;#K;.vug\٘ˤk>+ۋ]mu\g>G冲ajrllc~FlޚLMw'KRcs!soX::ܱ*n/,>n./>_p "URyDc'Mߦe?u(:ܭX*Xw+m]i7]kmbSnv1>n#~ض cU7`yj5 ۭ%Ye3-o]'aD-X[h挥f|"~[%:o N:L$?f|)kdD/{Zn)>Q/ߺ'XU|#oA+qUa6<;sNcCN0L0,| ܇ϗLXF*U6xy{~2Ϊ|9.}u!.;g$0NPrW"my ⌗K$Vټ ^-kW^;kwq-(7n~bX;/qVYQKHv_^x;<5ds}Tnl_#VNmˢDU0r2L0kE S`~`ք F` 6`~(̯wnշ綞y) <3kG =0m얲dCO۲(Q aIlfp5>6` 6rb0%9` e/ckPvdCO۲(Q ]`v{ dc`x  |.k6N eNl5c(i[%|6Dk =f(L SX:P'v!ub(vdCO۲(Q 7Ov!pr[l qf 6`# DX!ub( ?k{ C% [JD}ږEb0I<ڍեt J1>l1D0@ab0w1n2N eNl5c(i[%b>ff1@ab0g1>aff(L 惉XaC0PvId1Vc;QeQO<ڏY'zPv!`/6`"7} v!ub(vdCO۲(Q TY!ub( y1Y' X[`։bv %>mˢD1=Dk:c`Z1n7,b \1>m1PvId1Vc;QeQ_M-Q"%J%J>-Q"f!P`@Ef!};Sӿ{۶C~ѻ{oe4#k>M9ֳOxw4{%s|z8s4q'| E4sk8)G0O7wJ}/ç"*5LmZ@7)H?yZly%J4VS0߰q8xnSP)ګgח{,{0TF=`E<7%|)H%&\pbCٷp)F0ׄOkX'_-p:NA5Sqci?Jy8)F0 "3(B0 %woY (5 ?Vf C3Ӥ*3!45)S 7O1єL#d`SuhwKωu.@Box7lTc22!Zש`n@Bl~[j|M]MwwMt @]|gل_)7m6i֍%zz{ͱ=7sOܕ `w`b/ND0 "3(B0 "3(B0 "3(B0 "3(B0 "3(B0<00Pp rC0׽3T\n͙w8;IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/manager.png0000666000000000000000000030361600000000000016432 0ustar00PNG  IHDR HIDATx `T2FVY]**ZھmmKbE {$@V{>aɐ$df8:9sϽss?{|^FJJJJJJJoDDĤI<<|x}}}KKK{{PVIIIII~UWWg;vL.|JJJJJJ,|~ 7oٳaJJJJJJ#Gn߾}˖-G^ti[[[ccPJIIIII~zWXQZZ:ԭRRRRRR.ggڲ2s nUIeeeUUH΢5kud jlluP_d%%%%%TXX際ɴR`k"ĉXɷ78kspluC69NzC%:}Nv֋wgYVBEGG_bpnnܱ.GMvʝupshئ/t8Z:|*Ni9Կ=̙3III---tqq J>ZWW+ 50]ÎzGKth:;d02}c|/18;;[X$*A`Gg^ߊv@ޡ#-!p7G,="ݬCȑ#֝ ]9;dѢEU"vӱ>eGq]fF+1ZtCco<+.\xU9ڃW0ɐZ껿^2c!5KĽ$?ŧs7Mc6~N>2_'i[é:gH4%+ޯqCIIIIi_YYinlww++/,X[A*6ѯhQJQ0%ۮV4~̜լ~ܱk׮>2NCƕٿ 0{cBi_.>?鳟z.oÅĕ[~zs{g榴7#=Wcؾ}R=㓴Vl{eB5(3jwfn~Ǟs[e%%%%P]]]JJ 92##wUcǎ 5~cBwY_o"0uӈnK -wݻW6”]}˿}RͿˋO<;2UȈgŦ>wg}IY $~{ڔ6Qq_>xē!OjUE!5}OnPRRRRK|1رcƕ`JX~,R=λ) u m"(5qhѢK 裏 ~5C}2_kTa;i7*k{oWo?9抽Hy8瑑}(-izh;p#?>֙9oՈ'ϼ9sb[1XIIINvɧOW<=5""Çﱒ>2[%nUu"K8tEl?ÍὥrbꗧY d Z5kIe}Α߶0w[C _"|} }Z!׏+xJc{_t-\kjziJJJJ׏jjjM&m۶+̙3Ds׮]ҥ[%=roJNܞTsfj)=θ:䍙~ї1xÆ rGɰEm>&/냿n~2Ϻ\#=:<|b{#lm*$ s/_p 9 4m=_'T]*JJJJJٳg_|qe"##oՊRIv$)ՅsnXqma/t8EF'@y睗~zu {L46hK_*4ҎG׭{$zscy)KSIIII?g|n޼Yv#H%Yߝ{T8thѦ׵ɡIt89p0W3d |BCjtK r .V՟nua]fiJJJJJף/^ltJ~pOC9Wυ  +v8赅t`1Vn0$;tg߿o쓵lٲK S*)))))Y.\0k֬#FTWWgmmW_}`UZm\tҵ aC;a[k߼8/1P_d%%%%%2a5#G/ _rH))))))ٳzfU())))))G7x >s̑#GJJJt>oܸqJIIIIIe!KKKQ866v n0t=B]/5˗eNPu^ٮԅRRWYիWW?^jP_T)uU}b^/v~s:]v)`딺PJJ>1&00?sa`buJ](%%{U][[S1.lRJI^ƃ]7n4+>TM~Ԩ̪9tjgf lGWEUmӢF[vGio2&. m;99;99?ޒ+Q4rK𣏖VTvttt:M>>kgG{ dয়ILLʇ4Z"/*srr<<6: P lxI.~>.2so 3?ow!u0o.X0߂:^ye^;:99 6't`p{II[ZϺ?>gylQ5 ?7ltrrsɭ}po ͱc:[VYUU]]]R\0j|977SA1XI^5 0ƛ *M8p=>!!22Fjsss^^ٳg'Nԟ~ŗ^>U^9fMǮwB}p`@]Mammyͪ|ѐ3~ٟpgO7U֟É.WѴ3ŇmZ<=ҬϛoO~;t:; *GϿؼy9XNNNdddPP{uuuSSnDDD8;;766VTTW VRW x0 k׼nD`E L `0,lG''Waýמhgrr2 ~eC[ph< #[rzƌiHߵkpokk¡$wU`g},i>>\>7Ԭ o;Nt184Kdpwt5eԷw,dzYm[~w|onvBkkgT+ Vy\6X#"\\\c0JB)))٢}<nTSsÏ>cɭyJ V?~FfX*;w1cFnnnTTTZZZEnn7Uza͜QUE'G]eўV;vΕ#B<κEM]UM 8cM >PQ^tx{;gC5mf2oۏ~~.ulŦ/jjjjė J>𡯯+{^+?s `uWrɕϡW~hxR VR>5'%%Qjmm宄[cjhh] ?yuu5>C]Թ/<Åp n2{uWYy}G gnfOO3;gMTY4e38Rk_>yYm;z?ZG]s[fx֞qrvvqҲ'mdRP1ẅ6mWwg!AB~=WYo _W?c}wchA믋#jKv8^X++˻ƏǭO xo=fLB}}Cmm|Su6Y=ƂX0WXTUU=󦭊v?_9:rT =t,.:]^|6ױ}^W>Lj\z@CܒvX--[[[oOl3x 6 v>bܱzQqş{{O5{&=; e[UPP?ONJ9(ZJax8QQW'{-MM-gо}0t:R_?SkyzձWq޼;tT VR.5wgdd]P#֮]|_u;ղx֭K/ǎ{Ƈxۚ Ayy[ͷ̭vǃ ZU-*k5VW PqbMw{@D 1Q+32g#Im_^r碻pf> ^4Ι1x/N-~[64Νʋ^yţ-<3o0j, /_(4˻$%CPR>5w.Yx7`ͺ_Ͽ 2C ֳULtppx_}Օ+W\ </^?eMcm?#̟;]8O6lXgLs4v#yT״:h΁nU5`ɓ"AAA&:e߿@n_Sٯw쌊hhh)OЁojjꞼ{3-gϞiӦ˖OLAsݯYlVdoBA7o{kڵg7MP>!!+W0;E5FٳO?lPR5X9 Lw12402"oﯚ(ؗhcSsY @:;;I Eڲ0ClsMa+Y'%i&\Y ^?7-))bK9hZ1L|^'NtXǏ 0څj"S|_ zORk*)]F>_ [zmn2W!]gBK.jƃ-bj.O_n+QB))٫kJ](%%{`[,! == +QB))٫,^f rlkjjjЎ+V eNƃSB))٫,dǫP866vRZZuV,שSB))٫,dТ9rd7nܸ&JJJJJJB3XIIIIII?omJJJJJJG}TJJJJJJC 44R VRRRRR)+))))) FJJJJJJC#`%%%%%bH1XIIIIIihd' o JJCn̙3C %%%dP7DIIlY 7jaէWf~y2#s΍1tJ{Vk쬵}lQV`x2wn3PG+)]?R VREY%l}&*s)+)٢m!m3nR VREG[ӧO._pO7˗8888::Ⳮ)nooG"vtt899S+2c7R̜vvvnjj.|tL'J9hB"J/^^YģVd'<...zM9l0ƶ+jTDurEA~eq#>QgzY^4c!ݬ{tڵVr#A8 _j\V`3Ā N$+)G46Ie'n]*E&a8dEa]BW6&R$*1*_X9KL NmGD6'xEAY?W S\\,I`}L3تzwb0HCb!M:TBp li&]#hQHtjd4yPc #xhiyKZ"&,+,W̓ã.$7-f# n/GNlD2OG=,J+\;gj}ѡ&򔔔+zPV`&٫, ;B$m^e-rI)iɨ0v4 K\xzz666 ~s$I{l8)%.\]]YAZ(y)DDy+;888D2`[Pee%L s@@P7V_[(;f\4}`3H_=a1D%$e-Ht\.9f,)BV%ƃ n83*]g ;<2l93AnN<+_.[ap``<B1T^^>iҤf;tPPPP7V_gn_tYƟ֭m81 Wr,qY9L6558C[Gx#yv܅<4|#(jJt]TgtA|]0P먉7Mdl{E_yB1DWWUyӻ>78[/y#m]G)S$aֳa@&lXN.Zhi._'v0DmҞ 4mLQX)(kF"))*&+D`0ªy͓˸i%7Rod 2xK F%3AG**0ꕫɫZ5y=l,{*iȓ-%WhGCD,1&{o!,gI(&J#嘴츆EKӖV%5!e-{iJcWٲK@ 𵀐ll?jr`kk"OMMP --GCNH/ &%;5r/~b'_2L W=3v$E~`E6MLV,9͡eZr7Idv;zXX4 Os///ȃRnH |'`d>_ `9-J"_t͌lߵ4^ x>>ޱc7,3fBwQUXXm1Z r _q^EK^- !bSr6'c6o!/ ~;xd&~IXվk\?xpegO)3J9]5ًK"Ѥ iY \1LgH%rVhOĸ բTMM 34PiQ!"8(;qDxL,>uM sZh#OǤqc!]ek:?+C+7ϴR|Q ~)))\8bD^h e*+&KŪ3m/Zt |v[ٞZI3ČY҃k qoߎٳgii}}}ñ76he39r8G l 1,lǓ6X^VVRpܜ'ObSp,`\ F69x„ !!! "󉍍URR#BP?{_-ʅF_^"H.Mh?m~ѦM|!VR3m/ufIg'fVmAo& dN6 8ܰaeL0a{#0ɓ8( f4#V<#9`[5J?+Vt^^,` 7^YYkּ|Q.r40a G{o@@{}}}aX  {'Or *Hɸo `'RRSSaOo߾Җe/BeF51qeNl\<G`]ObE!A"9saN0aҤIO?4}9j -""*//#!!4EHѠ,ׁπ0'8ԩS*'''ٳg]|ڔ!?++SrwI  m>qR?DXf0ܾxcm@/-r%fBYfVMO(b|]Exy죖ƑJ`xxYvsUTTg?03<0C )A80dhnJx痔 `KKKa~r(dffHAKZOT FK&qƽ{ { ZXMEC0H\XXH%iGáa999$ p2,`aJ[67Q߿f7/ŋU\bĉ݁y; ܦva)E.N1q5ǥe+}Ѧg^q+e0nnR-(5$ ޴jԪMqlLLm}}EsЗ]ƕpKI`z {ho… x Ti1V׆EF&___$Hb###fx36ZY!vя f+AJX] 9Ah'35Ͱa_"G,..F e˖DarmD`HLf&-WMrCa`l/D;? ^JEVF^ڶv#9̝L)lv0IÙ=w#a`0Rf͚alo6bI#ٝe-,l/,&p\lx%L&￿W_t?]:-=sYP7Tn%_C.]A_n4˥mSiek ޴jXm}pdA_4q. #S{l?O>$O?tdfyQŨ(R]] tP?ܸ'`ƾ`*H΀(rj(8SFAPH)aȒj=.n1DZc*\R04{E;a:Z%Ȝ DA[Z#/8yi+P]VVf"O֡j|}<9,So x ~;7:opv~UUiyׂ=("[cp۵A]X27ɪdg9FF"Y6a<`kĿo9M2pĉ%Dۜzqx&v*pnǠh$#?UOc\h4)8  < \ea`˂csr7.e&MvM)K^1b"ȃ+_'ej͛7#o<1Mxwt Ev҆Pa^M&^$ q99շmZexfԉ3O\ѯPyUtek 87 Ǩir@ќ9sţGΞ=;??@0 (B-e"e65~II=}ps7Fv{E^^N yـAJ&l}%n=t7Ǐ7nڵkTQTKHHx ,'pDWzx~ +jz`{Oq-#tNF{P-YTS@Atdr#'B(0}@ӧqt<&O|~jBٿXk,J_y;Dn{rXgnロҥK{c0N[ m(9_+wy"Ff,ƛbFm`^7 ;mFf=w,so+6ݶ} COhurƎP<; 4:u,B0o^WW%&&bh/rUCcq&d d<}(ϲ2MG0 #D;xO_n`Aq ZT6HJ-ZDXhZU:tMb84CfӦM۽{wII &;_\x QΈa84{͕ċ.**2q? 8O#_{5 wuqN `;417)s+w;՝1=Ʃ!TBAWE0&-\t>0Nƀh`+`cw_4= ڂhS\\ |ga ݻ7??xgJ&2J{ x-v0vphrABm0$ι HT%P9!!(ŹF 8 b/;89T~c4 ^.أ%111^v3h8 r' BhusQVVB:]o &G@={)p擦3W+c"Otto|{[pa7CK,.- LtOՕxRK-xkm`eUWl]tc=R O;XP+D;~TmÆ ;" AQ@BKUh mN^Q܋ =jf9isI B%8# S*.$g?,^5~GN?7CiBzgׯ_nv^"ɢ6\ق`v༼<ybcc1x͚5:#u0`0n.-2iϬ;yW׷ҺVjRH1>LÔñ t5>c Xmdd~XTTĸr1c qhaf.yDknYkMbiѢE~`t 88 Hxi6h.T뮉}lOQ1JrCBB f ]FYVsy`a{%/ZbPd興 >}qM JȐD[BFٰ0B Pý+ ҆F:mpzEєDq)/EjN &/R '~fp>:0\&;wܻ{npg ZqM,yyy'Nf^Ff欭Egee8DauMe}4(i~}|ڴi\~ѢE0IdlWx"V1GCE 3f ]Rdh.E͊c\/ (M3$e_přKx!` L3cvИ.֭̈́cw,6,^E>裴4pȑ#(ή{XfL&$%% ۷6<4?V?)a_M9o{0^A{s ~B? [z= S020tȕr#@ghҢn|D~AAzau,8@gĄ(40E pȌ\a4HW.vIO4g+~`pLN茌 y%&k3ܖzbB#dqzҥKQ{F0#nQQQ̙9iOJh&5arI"aaa %0-@R`-Ӯ&큙䠝h[D"tT`0 Hӟ{$!c b%KR>2Q1Xil iH\Y`Hw\1 `}L " 2Xx@sP)gP iʅ,'ᫀЖڑ&99s9a8. hFb w  0i`ff&3b|)V8 肻&8N#09gr G9\ ;f"Ojj;e`ka,k3~qDȬYmۆ"h$iHCew_ѣGM?~S^?73FmGc?3.U _]G ~d2^]]]DD_:X/hpD'ˢ,>51h2s"TEBS`fخ'q4^ӬHMK;^h\Cf\hTȠ"B+3Α&٣0-NYYYhYN:A7~㸰qxt6m]g+~Ѹ8&b„ |6xݲ.xI*ۯ#:oRSSan;v /p[mAG79ΨPGN9a$jr ̹X\ Pq脄0% Ç?~^8P3eaSྫྷ<( Ѩpe2C RPi33x6go;w{`\x1;Xaeҍ^njX dǬ\Hh+6 h,Xԁtq98-f.BA ?TWl_]e湀3g##ݮ=x󋍍ŋZ5I۷o';yv ig+vM뚰;;/x%vٹq׊咲peb=J1>L̝9sfUU 3_},H 7nl\.ND[tBC,NC"9*/ˆtubC}grY.$ 4̜{9Q-g?TBSv*lX"0scG$LTO0\'tANS, -l{5ܗE_toU >l}ѠN-((x衇lْq4Z]XXZBIyŁ^zM\fe\mO2lC=Ut bdMFdj19݈0^v6{|ciӦ::teǏƱО}qX:xE޽D\1aw 'W&Ѕ}J+hN:>}:a-Z=rHzz:ʫ0oGH"9\SSzbcc9I)w@8N,4W)ڝ  pM %}MW2N!Eح{]s!Ѥaҗׁ Pvԩq0+;#MXvي_]Ln$aw 7?s u ˖deۥ#Ebbb`30 yx| d'D6 }elgTEQ.+ >0WFbg52rBr-g*>qS "rt}΀\M1X +Ӫb8*(11 ƕa4\^K|_3sLq̥-ΗJP 7?XI~AnZ5j&mOʔ>iY f8$Ʀ nct6d!G[9U4l k*0Vz9|4LaFsHbx5 mGDKTd<~|q0{EFq.Gjiӆ;Jq)C=ը 4!Apڃ6p"u/+Ucyĵdpu77nܗ%Nʪܹju׊xА Lcvo3\<3cƌA=bDF`fQQQBFVqB?ӓ [ [uDLҟL#U\ޣGI A[TT B U@GѢk!4 )8g2fGcPbΝUYYN|h?|8u^Y8E>_|bo߾Dٳg RP1Xie 6z %peb+S*g0J$0Raedd<{M7"<`pBBlGMe,p"=]sd1Z 2ʴ<]>31>>-fKbU9] a %V5e4N|ezff&,Xĉ'OI!qر x%,EoٲDy扡싶X+) ܍e`[MYpIuq(`% 1dA_4~UDPjj;`bruSr_vvɐi ҇` 40%Bڝ8F;֭[GBsT8eA+ lDb1dx@&jPEŌ@5`Q>h\̹Fh- -Ϗ# 67Nq{Ix$[OM[P1ܿ힤dB˿nϗMڈ5dUx̍E999 .BwHr3gNU)gLƵF=4p``0h1@sx32%ӫ>c(pزVM6?hbkev_ǩ{")))c0aqj ˕ti:OCXhg2m\<*#a@@3E,{r_4 EUz.\7S hN1Cwx%}9"Cy(No|}ׅsGYB lB7lN/'&,ZHW,%%+3}%0oDh7)) v0.XyyyYYY0Q'8k,X~ Af|u )qiBbsL7iyTq/8qtv\v˗/g\kϟ?ωL4:9`  ,Dأ /gSHrCәx d'6Ը0rlR..~)uy0a2L[vJ_ta81 WvYJV!SfPYJ,}_487vX ܰu/裏2ТWb&ͰZI 5%偱+==jHHLLOGhtbtJjPa r CCsf2H$ ˥x|sΥ6.**:x ^;8ct|&p!dϺ -ߋ$eڴiv)7z xl2د0^~*vj \C)GҸNb9m7'''%%lq/GjA>`Ɍ؅˖ ]h-XN !8P6`], eY Ά` Vcjj*ƀj"6 `܀t.f'0G2z0Wz,s$2-|75:}a4s e llf3iJC-GNQ JGkFfYլc؜$C^îE0Q ~Cи8.EFF/ܹs'/&[YYe?֭3/@2MRJV!eA633f͚P'9쁗7pCPP 81dK0@-]3vվ}`v!!!Eyʔ)8 N ͙*E Q.Z̾h4^d...F#Pg.0[_9͚qDXp\,~w0<-ؓc\sss!--+/qAB@z9''g߾}X$+`7NJvS wa2%'=35Fĸ;v卉?~߆q(g͚ܳgp~!Ҍ\C@D\L Y "LF$c AX \nn.멩A Lef߿aI fk`+ 纊(E0P0@XBBͥq'rFu_s$ky",gpVM61=qQ|rhe tqi&.&A+4'd^d(۔)+85@t^Np2JFq\gfu Ow[QQ 6:!2欭E3JozᇅZ?XIid k6Pϲh8q"I@]VV@ m޼U6ˑWNaMnK$~JH66PDeee6sryQ8ZK%|GBL@m`J. A6t͞gфAYCws{R-0aǏg,5<j'vQ^"B%4A(R<Ql`AklAQl _*H #EOEe'KUr\gg{gv9{{j*iƍpӼlCNZ*W%p8\A/* fffrZH>gՐA[i[nU ᥌unTti%)ﴸ%(XsέIZ`r.]Rvk,Yxb-[YfQ@!//_ 7`._S>dŦdB2.R\R°)S`4Bpd; c,W`(>~!L_9b:Q-V |r:}v0ePgDuRS3}S olˋNy2.KBJsZjwq{4I&PKpZZ#AP[yPA!PF;T 7=V<+,'Bvխ[feexb [Fʕ+$ + c'K)!3rТZ PSf'" =i5|9Vm|Z jy\ȢE(WTOJ9[U(9%Z~*矧i6uƍie˖WB$񘏋0`@2zC~ete9;8}cW PFFׯ|v 64],(,VShQmE9YFh:ĚvZH&nݺי3g+WoԨ (-bV75XK2aM*[쩧JI333\"5YCb؞8q~ gGPDu)mܸqZE<?@;8}/b2{C:,bve&DDR7mlEC⧙jJJJ.+Wj`x2\aIӊfm@T "s'}wRFIokRrC`O1ICZؼ恀v5ٗv5rsTs[Ɯ9sds+ڵkG 4`[a\ǏsRbyPA߿[ȃ1)juX6FbHE)P2exΨS~| - :u6sB Sgej- baeزe ֭K PŊIC趒Gr.$9%7Kc@ f"JII1"pYj…J~ W\:-o^b/denvs1YNN87uR97 h-۠بҥKC X?Ocƌ [\9,zɣZBX#0BI+K(!HAO˫Fi HOorœ٪eymbf̘j*N5Ê+4iXCp2x(bY*PZ CM VJ/^ÇBx>hٲ%fffAP W<ɶ|sݷoecon}@;;EM]x?2u~ӥK~e!&!lP`yU`?V*4;aIsM[ȤfYQz?rܸqDb9iqbe ++Yf47eʔe*H~WT iNB5өM5諈-sYVr>6mP3=z4/ZkT.6ƼF(swAsٲtwz\}a6ŋ7*_믿fo+TalMyVh$ArXRe R d̙ҥK!7U[Zǘɔ@arVP3KG<@K֢2sTKZOB|aB8;IIIX͆`^*Ev?gy&B!qY|VQi輦E+YS{0|Ygi0Gvĉ)pkUI."{$? 8 )@%L KRf%K`0ca/Λ7u T5?GxO&/i^Z(`SThW251<U¾Jy,5j0TiR3aJIH߸q#Vy9st<ƃA#3z9tnLV 2Ҭ_@+Vȵ+̘C0X"3-[Դ` j0R!Y 21y322@\n] MNN*CMkRk )Zapٲe|d ARr͚5SLI+ӹ 4Z:LG[DݻS КG%D~LnTx#׿eӁfp vZE5sBZ%}2_&E`Q_>d('3;v"!`I& @#((Z c7k#%ty2D\M j2s0U\MLL$,5U-Z1c q@Es!b:*Os̡:ϓm sR8wؑ2fO̓P}|~G#yP0x/X%cS*y%%4/^zkX6 4iLX2p$xe ؖOӦMS4VfLOcjQF PBQIҥyo̢E֮]B̺uwrx)*MVʚ>}[[nJF&MKJl)?F(90v vm9Ǧ/XO*C 2Zzp_@`MW@NT)UJ92TbOC5ZRk.GdiN}1@kT3S=Ga :pkds@G LEkڏ?Rbpbnt*0o@ ٷ0yg5jHR⳪W+Vdeea&%樊mEN͆"|*KI%E8G+TN!Nm E -1vUFZh… N:˘ytjyڵ~˝ 0~xO<}tuI8ir?~"y1)h^PEve\Z4{ oBBB2eDMj$`O :hHSu:fЫKBm l5J*ro!@ '''oܸj 6ҥKe끣qlY$ҽoFb41}IQӇj~cS18f`QDK,ʧf bRJ UVgȞzؾUV?0^5kքR 9sϡ -UZِS4JQ]x %Ci2h >*6/ )LHÔ{ˏ )ܣGL^9Idƌ 3~_?8%w}6g;9cdžZbyWX+̚5 VQlD@ia-i3J-Z)7oV.eb#++Ohai-88lkRFm9![\=W$́[mjKn(rP+%;w.ԼuR!lnԨf͚Q 3 6l@h.n8h|=D(SOcS>186}Ѳ2,M6+Vjj͚5ӦMRZ@ BSRy5 b:>CMEZ_MN.ҺC _'KV؉q,Ӂ;v(%T̳*)΄J!+fS@+RhpRfΜyMDwؑp]oyz,XPJraΟ?ٲeJʖ- E,mY!V#_ X^bNJ0 #)fwW=Qb{9CB&A_1۔˕MUP*7%*F\=aMFȱS^u9\4g%֓&(kV}%.gcNN#y_7Ϥ?Jԩ9{llMҰ žAZOW^Ej!B 9pk/{ 5W+i+Fye8,Є2ae֬YSlYc*_rP L^"MN+Wel&_CޣG9kժb ~1B|yqtEG+( ["yvr9Ǭ/ZǫUхuuݼyuhٳa^ʕi * µmVy(,)f駟ԁy֤5 b(N66_gH_|yZ2MOV\Xҥ٠T3kDU4vĉ?\[seʔ>}zzNJ2223+hoZAE;B_|ќ:|DE+XhHIA"RFI&%%%q-[GVFÌIeQl+ș=pbv=-6\Tyڵ*e8 :uhMhj%أ9Q`XI9VMN"Eab̙ OέY&CM6]r%߇s.\b1 TcmIN+(qF 1)t18\1T". - \rrrժUA 3zFr!F!V#>Yj*TxEBi[nzxn={6 9s&wcǎUϵP\A3o_A{maߧm6ϡcS186X} s,uspǎ'Oušރu|r^Tvmƹmڴ0"7mڤ~B}lM^P3e*H$._yhQ=aO||Z ͋Mp!Z?\9riԩ"x2IClГmr7hϙ3Mdr?6?.`h뮋P_38-^0>r M_4VӂMsf,\L.]f+W308gq-[`Gb9DrS'T>H8!el,CS-W)${YP y+-5c1]?aӷD>tUZuŊ\#=\d -Zxy{M;V|=zP7ߴ<=O0$6VGhD2e)[LUl)SJ*|v|>쳜rw,X @ʊX]tV[6K9Z}Oy)NN6mZVVTN.jժQlɒ%Q ~W0s  eRRP*XUx{T٤eMm_}5s*HԩӴiSEiJGI)ql_[hQuJkԨܵkW%.VؤI31-&C4l!8OV4K ֭[2}==$'+}y|(﷏+J(P2Lԅ.ʕc(Qbg}v &L@1`զL‰ VXfcL-Ыb?jh_9?3Q> ZTRff&aym/%.bвĊYAVZQe˖/ZHK1 SOp=+( +"yprIȎ?ked1 7 bb5B/Hǚ7oYÆ lϚ5 pjpTYiwA8Py۶mlkoݺ:==]WK [D% aʕPvݺum j5 jy!*J+ITX2TΣCƍ+˵pi\2O6.9W A<E[E_veʼ~g;T;࿌wء_7g.z6v횇ٺ${T-!zFx≰bΙ31ch 䬌s9qĉ Om^n&i$3+26EMQuժU9geeLө sHkM--[*N6֭[3ڵkg̘AmҔ ˞/*U%M>|8]ըy=yHCFi_bpdSAQ`'aqs~XjUR `5k~T&MW~uyVe|ˇDʉrS9pbdl R* 9.]T3w/Ϋ)\p!RJJԗ-[VzuH̥a[k-ZsРA\`ǎ7ݞ7o>CEJS'}Sr.HE_r%p1) Fv#s;9僢aAIQ0a:+V]T-cԥKe>Ss vr9Ǧ/Z|GRJ)$$$4hРDZjbM.jժ*1c@:W,.]A8T7F-ZnTXVZD'OkӿqRJilq-l_\ϽTK'SbV1| )DV8QׯK)a%7mt\ː!CoO~N17 {7;u1)t1HMX94ʹ A R@(`8 RRR\64O|[.39##=={z5ldjoʕ333ǎKPCM99ɀoX1O'!ą\ W[\.<ЇtRy͛7<gIJ|ݍ]= 6.(# AcS>bpb-*&Yi,[-`ذam۶}V9kРAc]=QH,SO=UʚamL%|XƘ}` 5I&K,iyfk$,PB5CMHII1xO[R^ӫb 4x׀z-(ɷk\t)jޔC/\ &vE(?j`'.dkBU8#QYkTZ\r*Tƨwy+-[hѢ7nX,,iu֭UŋDP b91ȀqR&NL^ iaaZ0^Z9JĴ)geeea{5kVy^xo"s̥c.'.\iUD͛%'@ebsN2_}NN E6NOUv#Z٦V pվ}{XreB>L>,>>B@֠+V s _~ٳl:պ_ BXb²}\J/[`|^%B֡2ayR-`ԩS/RIII¹;stz.Q_Nś38}m۶Pf̘1`'|#*.Z4 گdG(oԩv֭i4krx@x B/>u8tY0+N9rŊNzBm R3lܓ<)/4+VoPbŊ3|dTՋwyOիuB_(qO 46lX.]LB[֭>}e+Jah/v*V\UP۴i*x2`'|pż/ZجJa۷C;}d/c?"0# 6;wyRRRq`5yӦMπՂIn)5@e,Xpg+~L2Jf V@NkBh%[ +~C\CtTPBff&&,czۧOڥMo͚5̐!C.]5/ϼ&;)DK9F Ȳ+BqƙcS>18}Ѳ[AAр h`_^ U\YK b>򚜜 =i$>%JL6 AbFΥw} ~Nԩ(oƀ؆d|Q8 cZy3W%2*sk9mjȹ| ŨA߾|rUf2oy*' z#m6AvphZP|-[Pfr A;XU ͮi{>xR|?I \rag`8%&&B7bb&$$pBdnܸ1~ wy3τ%iޑqP]b[Q0{ǎEK J*B8Mcb^յk ` +RO\yGd%++s:5cʿVSJ1mӺ?+ :͛7Pf„ r ACU yb́q׏ .moѢU@x>кuxV[V)v7~'د#GdϦMԇmjq=uTY8X׬Y (®T߭k bٳ'Yz5V63gg͉ktR*4ey} != SVE(( #Pfĉr M_OFe* YՃU`=1 GxA+f(Lئ@ bM*R Aڵk?㰙|(YxqL҅ NrꩧE/ @t7+ÿ YW^yW\1{l 6jdž޽;%mZ҇sRHkbt +T.OSbC ֐9m_tӦM#կ_:V:v6m@ ||0F4A:l$Vѣnݺ~zUĜU3j֬Ҽy?X7 +Vܾ};PttBBѨY61P zx{.Xh=#]P⢛4i*Njn~S>bpb}'%:<<0kkU>Z+VAFm @g}rk#OmR-lu:CyM?<G˹t4Kju)O+ʎ5ϪJ֤#?}"E9Ķ/q(?ctR+U+ȱ0i|+W BhjlVȷyf ?䧼~ؾ؝Pƍ \1-]RT%6h.##E*a%6"O _|Ou֥6eefΜiNN d0X(tt"MJJ*SL!{8%l^4ze5bR'iӀ=gaaRUvm[);vbŊDO֭<X .r||</(EUZmB2pE Z!ZhC`yiAap#={9;9c-5ة; %bC})Yzue@dB>pz~8w@ .`0McR0H&qǎ ֭|[YI82@9r"_f CBq:†|~.hNک;577-Xy³^~_4E2s1`'|#'.Z#rU,B Qdٸ:EA[\kԨ)U/骖-3YDMR']rСCaP]t:2MUx^9|۔Z{uXtD7&Lto^rOjڼnpE4&+%-s$ceASN;w9;9僎 +}2s!G…ᖅ/Bg !Y10g5 2vbb"drU<؝Zh/^ܼНJd?CŠz/]j&)2[).2Z$Ro)C7ʔ)Ex')Vd_eSX#-lJSʤ-Wet-i*(hKZ1+޷m۾fR1c$Ff>y/ilayH$y g|AANE fŊ5HєOOO\HP^f w2!}%K(Oe(amuիWS9͜Ջ V(JS3PmgO_?2ܟ.{et8oK'_t5"QP7?+\U@A"|]o ?]n\ 1wzϢ+TLVV]=J#^MM *8|HWɕ/sJy99B9)ѾAjMIU菪 ZZ7>608r NGt'$$.89N9;9F vrry9;Eb\NQ+܊ɩ઀ztr vZ9E''_9( Vom92GV{QUJbۿYcS1x/*XSI5Tz7r vZ9EW5z* Vof#PNQ+hWUuuB9;E]6 r v_^[(cS18U~y]o]oPNQ+`''cS1)r vrrq9;Eb\NQ+`''cS18j5o8_>pf=lgL6j޷m۾fR1^9=ͽ-r vZ9Gk }6kaL(H~}_ڧS}ƌI[ zK_nDNQ+3܌&tl+}ꮞyQ-`cpt*jmG==ߓaQ[yg. 6r N9te;$ڣQ-`cpt|t_ FoYNQ+(U @Td{019ަiy/>1)j'a}Կ?U˞4j{Inn1)jr vZ9;99ŸVNNN1.`cS1)jr vZ9;E܄W|cS1`k@䙿OV`|cS1`+\'$`cnr:IꛝdZ]e%ϰssvHv:9;EڗfN'=UPƜt*`cVx\Tc ^GDNINQ+`=ts42JfgEv$v:P9;E"__& gl#7{ tr v:'l9/:{#1)jr vZ9;99ŸVNNN1.`cS1)jr vZ9;99ŸVNNN1.`cS1)jr vZ9S}S~w/VcS t ֪;fy]xG ֯Umذdɒ?|-[̙ ԨQCu-RAlt_?K/4*LyXVgcaW2_>{dAWZZڨQr>&$$tСUV3NKQ:;9v*}}^{-==?矵VZ|N3NK˗/cPBG}4III_cp~1)ju0xE-ڸq#O:fyb#.. bEVG.O?}[;vx?p0 ,ؾ}%`t'7ׯ?1A ~s( VG^_4?>mvǧ,_|{ ̷fzEZ ykӆ/2fU/V,󅪶i|cV:۷a<ͬ}T um̦ީd۸Z6qsMiE*`h`5Ǖ^oъo"?~o[ ]fǚoVFqE~>ؖⶱ_t-?XٖujkǦ؟Μk߇` q ldmN|E>6~U΁z:~b&}XJ,Ǣ|`k'VW{) etNMﵩse3> _1)? {L28|>0ZNIK 뿵Zjf}ѓ}/[+eƆyͬ^3cs+k;k=Zϯm- (#p$,"2"`'T28s5jTffo_5_nҜ9`1`~;^:3{G?z{M{z|kJ{*Pv^zAS iq<=j]k`CNS2|e{8lbRfkW!D3vSOاo a7ߦqSncf`A"qv]nl;o+kЗ=^q ]޲B.i]4j ~y#2|`'T 38: D˗Xh˗\sph.ăO^hvKoٟ*=O!{;/<󎓻{A`Kɠ]GuoصF6W,J /rޤk퍫{3b̿^t{m|>7[p[-?/~=P?SCQشW;//ͦeni5{{W_<> r|E~Rwğ'n ~˗W{C,1xLD 18|gcS18/Z?~ao.F=iy`>Qofkn}J>}WIE}]?gOz~ {=|{Gw!_Zz,< _o/f씣J7;DBFf+㾶ꟿhTo{{v6tBIf?Uv&Žy}y[שcIqNq 44aO^=,@UGY+` ke˖{=!";;)?[|uEZ]mλk{#l N[. WݰЖe3t'=ϺH4 I5mi?Çqqn;jŽT}xOZ{s>GYbMZiG7Q$K`YemMIP6lO_ e߱ Vt\ceӳB%-P'ߘM6ۅG콪5c۹>~if9ޝo:O}*{᭞>=t!鰾)鞞}wcw\1)?^Fɳrms_ge -Y4~zoݒqs޵3b_lFX6=׏VeD&3| C2tڀZ/챰S2{ݞot??Ag}W[J]op w ZlLcTdZ3,r~0zu ]^3쭽}]\~|ЃOŮlk}OY~Omc&ZYڸ&ߘbo_}qSBKbW!9v_GK[m 1Fyn kB N$`'cpnEvZ˴ w<]锸eox:U!g4|b'jU?*{nM,Z~}Z BÞ~]vMyslFYWӾdHG/,:?u& .4!sk޶b<*L-O@;R-gT^@ܚP&6ێV4~&k:Khݹk6_kuWwg3ھ٭,\~o1YRcS18i'yCWmrZ4^cvԮ 75lڄemT6l a=bz\nk sJ{O_AW\c͛׾*[nvwI/|mA.kfN zO8ʎ N/ӛ,8ylޫ<4 Z/<غ^+jP*cuG{7!`O" zg\~ݯ3`fHc{t!KY5V?C63Anfv5nmjhHiϘC,1x]DvvS~184.K࿟\|I=ͶT Q˞ptg]Iyn+=nAaYfWbթrZlWǛ״F{OdgֳvMoʰfN9z3b&Fv+xlk6UtՎ̏;_ ۶n>eoLY?sM%ӾjVuq H}&h 0U fy2V?i7o"Vco<:bC9nw!.Ng_?}j ӿmel~_ZvcASnUb\ŇG{%86|ӏI_e٭C!c=7/~vzGq}f`wì`v.T}~vQ6#/釯 nRׇݟv6ˆ-Ldl'qۦS]yAkeo_ֵcIO6vCZOm*hBG/ rrO9V-wOV5[[{iNX9򓝲v쨟r͆d(gհ5N5FrVv&wϟ|Jۭ-ξa,w^G[zWZmW Ywo &lnvU?_^zU9~cl+:}Sn+Tw['_roϿ3(kEnٳwBvFq .(^R{}}.}Ůշ^oS[wOeMqճ]%Oz\lј/:QDOwOcۿDXNQ+܊6JK=j| O>m:v!}gjeâ|-Lxv g>?Y[{f{@q7m#l/s4*u: w fYsYѷ7ڌkU-3+* }OGg|h,UzԺ//`J]csWg}5!_;C(JάyonBwK31ׯmM pnRy%xjcS18h^0;_4z$6*=S_ݸ=SiB 4ٕ6%陎6{1{_ww_{%/X&qs/Hû .>1जXu5nl[N_/_`n~}SYSؓIx~NMڹ6m4WF'1Gpn':h?מ0ƭrE,6.=>Q.05O.5Бv~Ͻ?`²qvFqSZ H{Iiج֮.ЪoV?e .,O֞‡CNQ+܊:;X xptkӱmv|.^("ܣד-vϽdw 6AץFmжVX "p=M{DW{ښ^3{ᲅڳ={HkByg+ML*a.?CR(%IFY*KvBK,eo٣d͒!{pgL6{͜y̙3y~+R/?|*W43 x*0=ncϮzo;J BHN0Vwt:tbW].%21y͟7|`dS/<e}ʚ,Bca IjSf C`/B`/tȗ4sAyqpq(%wo#zy6`Yj jyg an:xOYc>j$b6 mNiгAB^Es qpq([]4`?JT\RLǨDRw,=̦6XD 2٭ I_Uaⴃscq4 '/^-,5ƂͻG7yN%Hk$6ô'1SF z?eE FA+Q2-p ɭq^Kҙ[4WaiC$31O{W3 `?͑{"ӻN* ?([ |9::Y(ݦs˹ǜ`U]W)N7EP+8P8-y/U 9>uߞ0 Z6Qp60vrI O_Ѩ_@ـ^g^& PE)؈^7 B?ŬR/2 m `>پN!)4.x0 Xi!̧Q)bĶ\RGG,$dG򘬁rp?D7LnS~!#S/&>Ji6g_eG썾 DŭmPu _]tqX`~!8.ef&V|E-&]fIɮ+%T?CǕZ͛ۤMŠ p։96;%n.*{Fk8tBK sO#<퐨˳=^0 |EYF tߤr;=]œ 8K%^F\;e>S vbzW [GIRP/֗F`'_?tCCA\-ѳ̶z%Z&D YU][|>q*V"q́/šlhkkmG 'x.ё6zEkrTO\ܢK@LjBmJFJQQݔeP,MԳ1` .iKͤ N >WVCfge6jx8,1Lqy Mx逩OYA1tixç>VΒG͛J7[_""O{ BMeQDG|; Ix^'grѓrodX`J C`¤BΘ~r,-s\3A*HÈ W%)wΖ{wrB WwDY!v'ٮQs*#c<n:F(%Tλܬf8[`O)\Zc8 ;WQRDӉzO֥":"`#&_ GTg9ԡ?-W']Fc9[gj.|Ë,eU?&i@P8BpLޅhb{/"+YLMy h…VƸ(Ch cd~R&+0% tyQ  ̤&}IݒGp+=72s4\ѧ٥^S@6㝻J4cȢ%w!Z6})*QXtū0YE*:rXU,[z֋MK'Lޅ3r9p88--.ts&fK^I~=*:װ;thfoCbhg.msz|390cY2a0|.|y1$Lt0zT25[uRH TyVPEMR^l&{)"k7 Ɍ[c Ůb"kGcXaXo$5fbgS[$[cYmJg-Hl_58Im xC EXKjh"wf?|]eӋ'q́/šlh^;^Y^}K>'`$^XHIY%cSm%vlnԡ {':vB,9;^s2;ru7- g#, CDz;-o#ҢT q~&:UZ<1)G A-<³jx52ʟZh@gzZPx~2y}I(ta #&mI-GVA0F/AoBU 5;vwj\8# O:#th?qNϥ4<\t-u_=%j'T-$>laY,e̤nN6~̻K"7)Z!ŕ/šLu{ t+.A `E`}NHa"he!ۉXC݇a3k2O`M7k>Ow\In^J&HތhA oɣ:aDV_z.5Ms`ͻH(l?0*`++L/U 0օ UȚ,}{͜R]!EO] DdXR$Mz2 62jΛJvOm#KS;MyЄ jD5z~^o4 +|4H\!!,%R뿗*_l?墛 zǖYf:ʉjUxH`WC%Ģk;h1X"U[bSL8_Cr(QbK*]Ha>G{;$IՓ,$JtʲQ[ k1Yk&[+D#v y)@R!snih+1T=>lV8xBޅBg1sP^78yI";qEP6l|h_ʛU)l*f-Dc-iC) . =,L6S`Uֽ`+{"&Ecʢkk3ZcGꅖ=d"$IqYw*ӆۖf|a m?笯O֦/ftLYN= _ XN2&!e'50B' =su[Y_l"SKVÅ:2jr0Ij%Skn{u}Ԃ] 9???:·'8\4#G ACŷ@Xr†B ]w.;g)yd >yF|?VץzOxZ L@`t2W'հm7Ҫ([J(1GacOCllBqXA ?Olms >;WI*00|s n熏 hJn* # 1.>JޯO\ڏN9-qpAi/`)~KC߽{׻woΝ;5jH88VSZWdh`8):wD\~HT6G[9ek' nYS}bO2 84t>2k<%j1;PDhds=`ȉ3HaxlIEͪ(?K:srҀg6[YcKL:FON xOYfN'5:{bIтZZ#2"(ԬEI`8ӧOK|R>]%7+`_7}KsPZ9X<\.Z($2![^[s5@SQcV oj;t!dIn66 8fNzR$PZmz zг ơAJWIdXgSR"G=2VBՙeduJL.OmaaGhA1`1<չYY[Bߣ-\ն^WuǺ}GJCȢ=t@am}'M/QE-mWl"?S%@C4S$7*3$f.Z.ſӿe~dB!oڢʹƂqT\bMuySSyIOxrz;mۖݗ2@uݩMa7A"%wIJ݄ d}N6SWeZn']S]L'!|F:szpZ PO,5w#mxȊhc_lRsĵT5"pl/l_9#ʾ?I[Nq{I1'+.W>^=̇7!-RO)?XE\48NKk=78{Sulɋ[񞗯_Hk0ߗMy\ɺϬt 돈2nt%n )ᒋ aV#* 6@=G5Afkn[r'g5C L82`Z=y^6ʼnΎmϻ"NW. :d_'I %+?؛$^-*ʷsJZ_ zJav$#{鯄'7<#-Ţ_+A8U{s;w {Gʦ諡@7rÞ!M̜jL,8+1Ouoٮ%+E !aiLauAو'8 1{9z+_QML "8栴881xw]by1F{S Ov l@B=uZ;s51nQG&_,rez; h>VT+qY+J)yD;VDE;bˋvxںr DTXd4 ![kfX,WaBur e 6Hq LD/@.A8l.4Qu\MxQ@֕iւAXlФZ8}1)>NHO*wZoAe:ؔk@&P&Hx(OS02(Kt5 ݗ8@}ulxγiW]j ֯;(l(9CʹF HU45x$3*QձLItߵƩ2ঊpY2%H{l.J@v3r.$BYr$F e1^ckfZ \B2}kr7hUU,|.,t±}*f<12<,.:Knj?\2 0׸Y!H'1!.{C&m^&ڹߧث,0-/! _iq Xw6˴AseK 7\ ;$rk~ゔ ^1\ jLtupˀTp3uSUkvkrkzq+ދevy>֍âIi>yGOظ@g7!صk=.tE4U Vgm޹U\ZM5_ʬ >_t@!8_ ~??}Sҵ`BkqJuEȁ)3^gQ炚Z]t~\S^t:9p|V2>)zN8G\ޕUw=S ه%oTÖPaTbbM,>499 Ƽ.l,,ŽtӖ9XtXWjbEDkv0zފ&kLzNd#(0b@P{MD\dv55LUfFJ͠W2rpM9p88-b0F.`WQFH[<ͭo8VQ1]tN)wtsb|b )E2θ wC"4qZFLW`$[At=fLV7Wȴ]~-J5Б9evA79F's>9Ѕb~=Mm}}@̌3ǚs &ylbwo'זh'z&4wI<,a5u&sGahz]|>P8BM+sAiqpq(۾yF#X_[YrOm|d厨]& _ULw셻zYG:LGǮg1AEc=&u>q0&%4l= 1p=ډ8(}d*SќT5[xWx`֚XɈ+̅'SpTuk@]=05 ǯ2kH5b;̓ڰOj;ÙElz7p{?o~}%xչ8_CmO ŢT8Mx[☬vDlM>ՖfGtȭR]` [$e57Yd(:9hR~wsp7iҪj+w1i%ZgHW SteM?3e6\9BQ}dI,ݻΓ )f Sғ`[S!T \Ԯi|vsP-ÇWn&"W'&*cߘR,9,%$sLB.q0IBr`[ p+$.s῀2b&2 uaE:œ )VaayyYB:p̸kz)F+{Խ]-Qd;E 7'5FW3vLcMk=ޗ~㹷ϞOSj^ K)+`OT 9P\t9#M̀kyʩD' ;o7>y([vwM60:Wm("7eZ2#oxID|w)G>twj3ZL1SeFC7`3B?a[Tp ԯ1Xz5D IRX@.߰l|b#C՛N g#ӷ$U]{s^8"Fuw6^qzQb+uzW;Ii|(S."~Xc:Y9(-8&ޤ_tGڛ$9ϔ Er/Z=RZnBe坯ɊKI0|Ylkji7OF˶?ʔ֬i`oR%vg9JpAiqpq([.Z<{#i$*{,'I5D1q6UL2_Ȳ5H=k6re-]O z}* k4ΉE24#t0`cmH/E%/В6iD #jj/5PPUHL $L7o~!HIEƶ#u',CVL^in,? {bCQFmJQef0=IQ&-żf=,wnL%4pCx/NSsȃj| z'o`ۜ ty(?CsPZp\J_OM%աCg X[j(VZ:M2{!Ȑl\WaP% 1(Ev'$->AѥXEB1 1vγ0itaFW݀X'5enQjN-<3M| ZP+07f3L7uykU151ӱDq%"m}&^B8H(ŭ"G X3Lf AQzڷÔ>,Ɵ6YAP0ya}j!}'d7T00H|7+K&LHq0š$DV" ¬4oLgJr` 2jE(1 YMւCl*&]hcdyiޝZ8^Z\pۣ#x󹡘A_*s5mIYp$ƮmqȦo4WjxAs U3T Fs T{4gÀeaj=r@g M 꿆_7Y@4 R7 1c>aZ;y򽭚L6O8uܰL(ꈞfǛnsN/|]JDĻF~\EߏYzZLc:h(< 7hرk8f >-AtS<[?ȥZE UкfW B+7Bӂ̿?Zrѿ{%X 9(-8.%VN^䙱EHSNJ$pVfYT%8oǨ>Q˃cz dy֪-̉kI+"HBu F (v+ \ȃu91+fi͑BRI%[#|x)"]X`BTX4.X '|0L8 B<٢8Bqvn3W0~ !iOs`ؾz3Y NG{9UAt"8SxzzfOKQ6o`L2,rpgun,sPZp\B[!@ z:Q `+~@Kc ܋H+{(6nMpAi9Xے~tηll{Ex*eHx#`k؈MK29 ٍpidiI6yQy>'[ xՃphH9 A$3 lJ UZ&OԳIuD['H\d%ۢeT8 E0z$+VGDI owt8R!5FtclhHJA=Ű:VO`@asllkɺ.Gf`~8(Lms#>{&^!OJR啩sFJ=1!]οW/zsA9M1Iŏg~ .6O|!&+%#8kCdM&ٖ #d׷k|5Br[;6-lD':-b6R-D)J+מ `Gq sQ3g@gVK "g[3Hbˋc |Tk/@S{Y7x4XgȤ&{N.ȹ#_ÂۼƲRj{j||DԀVcDӀsWyAG1wGZ3(cC8~<CR} Jޡ˳yw% Zz{m,(!}^jD4Aw]feVU).7h` Ze .O9G9tHqAiG׃%?5&gKq9Ƭ 5+/UfX:L9H^ܓ 35,llce؀+6`PN]:mu18U1ꀤU kL~FDžx4o`}bНO}+9^Bz_T4=!C,ƚ(ӄێ*4D;MHFzG)C"t`Mʀ_7_ .tELX_1bse{J)n3WJ5EO՝,aPMqed(`q5 Xo{,ep5YšthsJ"zQԾ..B#ps{#[YG =f3KV2ubF󀈕RGС$Mv6 hsjZA`~:GѩӿX SPFӰnC,`Osp\FWl$jx\B Qލ{ 4#!@#RBOX(=$=)蒨pK0e'*t9x/z>\z„…%^2Fbȳ Pߊ0j}$eBf1E=}5[YB&m]FdzOG==סbu c $N*Y|N1mr[ᗁ ?j^txAnF囒[׃u.6sMlsp5\+歫%`XDK/sŊoܪp9OnhU 5w&)B? g/cvEoU5%>P[Ts:jYt!b$+$]j'LfS?evrE\i^59~ֵhͿ]ѶGlKVLQt _Fz'4P}^ԃ1b:w;&F=/_Kvم:qm%E*lb}ˡo8 (m.ZRֲ3a9D%$&Tcx)eڢwOo׹m*+>,qjf.V/bNGU8^աw EiCJg;09UUQ;̚|u/'vyOX"^!}I~9,[3V$>Ta/zvUF*% f}!_D|R{YY&w6)U@ J"Yn03I_EDS)SmP\Qi Ƹ䐬ɒ|E9(-7R JXZG0 7LuQ|$%Jy\]*O1{ s0z 4Mo`]aq;>;))- sP@ȉ3C螹!g/nsi ]]1Kμ/{k#! ga4 l MN-"?.-`KΩ8h;<ݔyP˲f%5C8x~1sB:Y q0pAi'sbroKl/Uo#([.ZԞx);U\&FuA)fࢌ\m"s3qh#o[5:u`s%%ՉDLX;X.-$`v1h)147NMR,*phN_Yh1fp&4+,c׌Uѫ󁯶E)~I['4hѾ%N( 9V] r4Jq-Oeܒ 05L!QϴjmMj ߖo$YLqϙl IzsPZٚ,y'R~,iOcR8g4j&*skKS+@WFp%5cC=dG]z%D_8lyT_6-"I+φaU\ppO5_(`SH $Lł)o99v:bNIVxo!%aX4C8XμHKEIU ;GTn.Ie:>s?SiiHM1}N`[FmF+鼯b TP8x\cW .9XM|?G^SfT4QF24碍8ܿBKWa¨tmp3Oq$+)ۨѪcva<ʒN'dfۜz6[7MRw;QoEDyLlg/cU*;sI&|(oЏV0f`/)ao+,gV\4osE_`B]?CXCW?&sY2.UG y~]޽;;wwjԨK⿔~W+8rXt8 oj߮sB ƌߝ. ? 7K1+UM֯EsIR{H.z6c&xwdq廑J8}lZz~84:~.8栴Pe`NRVorOiUv77=rAiG8XZ6;~ -y6lP\4 Lϡ'cF' **9šlq0]λ@ D8wR[1ruC,[UWRyښ Tѓ-uqшxK5zF,AYGJmDL"VnHA icY=M;@IV%Դ`ѰA`~@2K:Y!` ,!IiF 98.+H*c&hԟwc:{E@#2VRBE',9oԽ!-[Q~Hk&۫'=|bD&Yc̻Oc]XD OpT8p\Ol#IP\9 jV_P Bc^ `==Sf (Ɇ0V bF xylC'jQ$l1HQ8M3 FA^)dL$΃'Ms>ǫB*$4|_G&MpcMi(tXmGxUx8` ELSbPE+3nC2MBjy'[[,1px9nJ@Or^iFiޱ%>WOI*/J d1YCOy~Op=([.V$]ͻ 0KZ@@NheEGN\~(n-L7p>ӱצ:ȒOԏ¹B++d{7zmeel|DlGxLKQP3A"sK Ƭi?.Y)C6sPZp\Jy¨ڃyk"J2u^oA[-ʭb-;EJ!or;h&7bK{~F305&KIyW=/`;$?)FD9 4i'a,Tό,Dt{3;D϶2`q3K^r7^nChߎ}LZ>}PrF~vAQ* mde= śGD ,ĞH4 8wgNNwGZ8xu9,]'_sAi8VHoOp f59O/#y P m}k0hCq2hlSdX7!WX5s]H )3S2 {hk=c G| Cfibx/َ1RYH+{yܚy|U#gAuPqGkN.`̎z{94W C8XC(Ob\o:['6"t :fOy`S#w-X$k֡\q|$Yo*P4G2?t;Hl)b6"sOݶo!a>_TϯVuO99Rr 1e?5 CD|K>5hTOҁ0愀3uR\m ѧI,v0&9h3(q&%#UHĎzha7oc1T㤀MAxTC'HN?8 JMEPo&ۮqp}E/dzp$9qpq([.G y"XKTУYۉC-D_;t){ѯB~əf~>=@J<߸cĵ[r9zEJGx[B,:}+рhht,.״ʩH}FS2UXXHr"0rieo% ڽV8|38Q~5{pXB 3l7Vu5zgQl.ìՌx͞T'G{ Ʊ㨈Z1F('J`̡z*Esq02n(lER9@Ks $Luš^Co:))[fIr[1ONw2v0'm']>;W邗*@PWLg.3`,i@)2 dkd}&O L&SCl ‚`:w'1jB>l1}ba<03b"m折|>,1ude;b)g68}ț-D^oH-vISxz#_k#X\?I_ٱ-f`ֆR`J Crфs;%X\)4ٌ/@f[e[8zURppcѨ(#(lǴ>O`9*0TpOg:h01 6,*4lۆ2@.z^_.Wjeld6LhN`ꐤ5EQ ОWve`wL'd(*y쁆l{0_3qDKA#j^,ICWx"`PiATHAb`Lb='` r~,rVcBM9(-8.%E; <䫈`y"0q3әȍ, !QX(c@u:p`nA=TL;qz7 F?9ŚFCi^z{T7JV[D[BfeОO@m$F6}G^h@ Lu4mzP@Q+ (*E X!vl(bE`W!*bDϛT"fYWw˴9s\hfBʾG9~q;t_oVd`i)Ȉ7;O#bn Zwٞv 4qGv[Ia-xDmES QuM/Z |V>o~0̲budr0o,%I(|MF OCTm.K;TyP΢I{kM{ >>r /E3†A_|ppP:>j5/hL:i^b?BUNgC൙G Vym`c3BZQc@ 1>>0#PטDy Vpt4v;=sSU[l+y}6% [ckXЈqk#bHT_2=<`:R#/ 0V<,7QsmB&\1 r9+勃ݬ L ?2TY/fs,r<ǢCDC8%NӜ"ʼnieq}+a-S=iт!V̞! "Y srO]n1a TsJ@s}VK$: OTC}KQՂ;L4ݒ e0Oʧ1;LCrz.þtǛ1Qq̽`,f9&z a@&#pkqXs) PF/_%ձm'n&S>}Ȩ1˱pGV0[8Ews{1Cč1BeJ+(s9QG/(׀`J 塄hfNJZBi&xnO^slQ' Sf@]=ic0WIo›{#=6o<cu5 '.9#3CMkGYba!R',SـVgF3!P-yde5>^*܊ [aCGj-/f?/EDLv"cEf8ۥaeQanmߌ^ g^M*i7&L?5}ux]8B֦bD1~&YL\Dz9bY ZS)uctmOX_6: Yvy?C 8;n/lN^;@V@ڈBRY[W1RAM%jsܵtFĆ-vd Yzs@MB*z EeQp0HSvC:󖘶8$eqCB*= gǩ=%G[,A`vMd:܄\(i)+E5Yi\[ue `9҂`LK?-l~?X\, >ECGW̧nq(y(l>2FĠuGLv=4d|ve)<g ti{賝)^ʆP)+>&wҖAs-\6"p۾KtH[l_OI88o a*#FcX ʕ#!ǕCG -+"riAyf$rj }g yV鱇tZ#j+@KPƂdX-4vE{6&N!)A?ZTM+|_֛$ |eZtr0 P830Ov ςnB(@iL LXooSTc%4mƊi4mО%+׎<:5 z[Nt:(Npqcbl`vao͖/*?23Rt#CéI%j0 ~jMb\8x)E&ʄF#n`lIæ::~+!aq5#wGӬIiA떬6. z|85};I yu剃 ,IS#_[`~"'7.}2ʄzH.wr]<,-U>v-vxw,쨁SzĨG9=:v4ǃ,OZy??jXt\&&NR[B2B$poTh|9:jGv?& Lr UmzآJCG-Y 0W{@}09?-pKÇW^{ u2?|\hʙ>6F˷HB8ayզΜZE6~E+\.V8B6c9RP6{n|JCQ1mrs j]=-z#l cnˠ5:&cx+Z]%2jd <ёkti9OS\`MA;f g4'󭧅]K)MC'c];DVc2[mUspf w!*a6cib}"fdv-k &9_8\DK}t73lsF\$>qqsax 55uyȫ^ &|^ W88M![̂E)`y([.1e"b No_թy;$Z@a4ze;}:t bԪ#Pk })X-Zo xELĝ8:&Vq4ץS[DϤ¤85i2%a+"Ql&.y!9~xf_+[.Qfax^ KSMEQ-t zoRN&0vm5f?|!oO^d++-cV5"_|R_|U4 T$Y̙*ߓ~+8Vf9҂`y(]!%l&j9]/I7v3}(w3'LēOae+`hXS` )͂=oT9@ GՉV(n땪^;w_; I8Qx4nrҏ 3h̬"嫣ݺꎋ֣8' ]1h4jOYiCB6,P,7 `iXTU_3gܗ/xô%AH%4B$,Fu7oyJHX.Z 9ؙY(EL3]{1AXW { bnУf89oha >yZF xn7ڒ[ ާIsﱐX, Xk.MR -9!k xB:r}V&.|NP%*yȻPBw!!`3:.0~n*xb}DKITx˖*ȁa&MKla!c("|N: y2?[o(fD&?oDpJB3\]? Y߯H3TgO19>7Lg~!"2oP<i Vq"'Ej"v2b_<&0ʂWh0j(W=d!xexd_ ^&_MI`"=V%Ls̷S *U>fQu8>޶ ɲkE>=F#Yg:kX*$dG9g1ixj,80%O,E큉w*ߓ̂E)`y(c.R79y}n4 åg.ooC+LAko]O_쑙FU:&3yץa?y'cĥB[;,JaAԍ"BrdNV*Gsp&s%`-#r9ﵟ }0JbDU$<@E:鉴5aޱsVB5:Hzh{23~~LO6v?}YGFPձ\Z+ws .W%=QJNP,`QP~,9D^Nj-ֹ+VOnI2#y#D}?ھ[}C!@JLqVtmh}+'M٭\QS?lhP%jdmƦ"Z,r$sg>S-M2Ş HxD Af9u &7N0Q :G>ly'}%UL3A:L0Ud!aV -fɋL2B2l>+녥2h5?m0cOXFw Ӗ==нy'xՉ3`CRǾV&)NGG-;'`swTS2 9O% &Z4,JqFimV<.)N7sAxEc^i3i8 z-CP~m) {G*D[fdxӑk_[\N5ǡ~XvъŭDr35T}my:3#7}XKNQ}\FLt1mBCN`1lhFQtg!pM[SAO.Q+a1+35gDqpBI.M0p@[ʵ$!pZhm9+W/wvfѩ+0{瑜q6g|PXKdΒ5e4*oMBlDٗSkm^{aV5\*ȉ5UkS8ۺK>LLL~ljj*2G CuANjf=E=T,>78 !IGO%"zs?I]PTt"(7C\#,7Lx=*aGA ) % Y?JR%!PX2jY-I̷q>t|2j"N afrjN/e2~x˦ NfG:/Ttq hޯs]r*IE[SᇆX)ơ7Cן4/3R-.߮˄\0۟mR $Q!c.Pg7T?Y(-t-wh2&֦&'Mh&h$ }opUWͩcsO7JB%c -4t-+[M $ d3ZNŌm4Qx}4*?ꁦ8N$PHVsRWPaQr1tG#UnlxOo?l .߭f>Df`j /¤&`V8z׳N˨{].Z [Q![Lqi)y]įbʙ)5 y[DIJR~% W`Ó~rn r0 şq 7-k*%H8%ްG* ANtyhmɮ:z,gA򢻺mֶI(h[<TZ ~=[DϼCF%CQeBqx-Y R&)mij~ IbҟK&:_EH&+a')c.]zGnH]3昃}ԇ؟#ԡEM?= Ң&T Ԡ0j1 1̂xH=u r_XEƵ- eg |3A%9)$ءԩ^xL~Nrj3(G$K}4-wEHZsѺKCwi#""c ,8阶Hް,#N , q4A#HKc+D:#V\hfBʾKX:y'Nt4zxj`0|^i/ AqV﷩û @M:m=抳$3S^r3Qp^E̔_otcfS'ڿ<"JRaoz(߲ 塄LBa =gxҷ&U¯:[DѨ` (S ^!1oO_t-+eGD]ʝKjLіC`s`@ǥGSQw9B[sIhۨ2<Ж$]-[dIvL< vU 5urI \YIowLn.nH#p$4meg`󉺖,z}Zt+ꏮs|{X1e#'h=*G ,ˋa>R6r0d_ Y(-X0 8[Rm Q-ȀWc$*biC =|D#k5#W\~j+eF=6VcBhL?'1_phDXܿiVaZ(<ȳ >NgXF DY@7s2Q@86u< 4p-3 S.ռv'5˖l EbqTDaHvk~x!0FY\SMBrr_EGt;(` lqM~>f!~A[qD̚+5;R 1hԒ @few֋ҴMS8)w<`n7sjQÄs^pT`TVo l&^~b5pcįMa~?MVұ;*$^-tDsjP3Kֆ8WUtL16i$^a&ԥ^XhoxXyĽnn p;ZGؚ9 P88D!z,X"X&PfB~rsܙq8mi;\%*OpAv0jx&#퇫]괾;"=L _O+mjKY 'X!μw3`MB-I (lҹD|?ܝ7,,<Gh$]^x f7P=y_ ˫a ի..d|(ت|41ZɊ0>N]yԥO3砠ݻ iAO*j6/@G{?o9胘vNaM#o1Ʈɷ xE>EtÙ(2G~[w7 #O;}KzWyS{HCUpx P5 #AJxe&Nj]7>R+,`Q`9Xʖ'{m]9(|q۔ ;1b\@O&IU:DxЪ6~eK<#8_-11~c^$:q.c/4oA13`j^DWo`{MEB秓/0I4f~ 5)7 ʜ ]4}㩑ǚd  ŨAf4۵q'sza^͖xXFʝR  uwS/C 98`,J,C8~%Y({c" wlkjGxE 8rz}ධ+|{ /$atdUw#arJ3q\0֬޼3xuZsw.L2k JNsg?v3Or[Puk<FTF}2ș?N|l0ОZ>j:V\t#|`,J,(spq 47$ז7^p\vk~3 2F`7Fz|a}Oє{"=$`)::m ˢ&Լ(\q7b bw哮SFuTic:qݬ  =Oc "`:V,)h]+ Zua9avbh"6; kbgDa#AR/<#ú-#" Cqq8y\,:XmK.?U!_e:Y,PZ,eE{LN储ن J]IE%Lh|1PWWn4dU ^mBf閜)[sp"@xZw*f|#'9P='f8ǫI%cY@&_RXL T[l 4;]R})sPw!7cS30/'9e-qeu;ܖcv7i'Q9oD+6D`u^ޙ˫v;Xi;Oc /)gCM|z6~){Bir<-NYQQ+upkz'Ø&["xˤTȵRm~DlkXwȦ O,ħ3(--0x-k'ʤPC/V9KXWӘHr'Y:T ="]v O}۫{vAC쥯|aq;3_GfcDLDS@<}^O?HWRS ]h|ce뼃O2x -5DXuq2i;YDeQ٠-HWBj 9/.,-SY(-X@>U,/҂LI_ϼj x݅\RT՛V 9XRՑvӴ1N?"ф耐m)iq B{CO{Ĕ;c.p2Hn0 b$l$v 2?6xjWxg }dj!G1.Z2w0~!ޅp#&0uM |֨ hl{~^ @_q|~ /}ۆI}pk=Iļj0$fe+xGf^XGExL/joTڜ#ޅv 9qGRqqCh^.W Y(-Xr0.tü[/W\'w$OO+ Dv UGBTEnܗ-!,p<솛} )3Mb.<"+R%6b{Pll1Y(IS-p`J lh >%ӜDu϶{8> A(͖]ΎJ"mˀfzN.V"KjKkaR >~xӌ\fп˚s<+%yHKD4͈CDH z͵H1ԥD4R::#)C¹tV]Uy.73j7+Z,Ϛۓa

b~Th#khgݜ ^^7?brѲ\\W`J lY}iE$Z~),D8Ivt]ICp yYBCqtFdʔLTںg$2eN8b ێd.4WOGKERA8e`:@Q#?T,9hku8{<=O ~1*H#b%QAx'vyqt#4i3G5~pUeޗwL.XC]ʛV^ή#jx\"K*iie5Yi\[RMCq06X&'.,a%|KO;1IS"ϔ {dfMi-tAd+ $%+IB 1±A/MI˚t]t,v*sOB177`/:s:3қ@xx]zd4̽'Ncz1 \LYO3L_5j̄r2];.z!N$ 8 WۥN@>d{ȉ/b&iwY~]f80MjDyX4m'ӑe@xG@(XFhiy߰<. ls QoK )J]CRauiiz[$o]I,P^,eIIV"<~ZyB_:dA$P-Ϟ7xIZt^/\I:}=U$P8\1CiYtwu=:)i<= #߈(_FNL!V|ij *>իtouI'fW*3VK싹++<'ijwqTBHu;K3BInLLYd,YS\u+n7H xW޾m79{u.W6\ w ܔ$,rsntF~zU& Jd`LZZ~NXf`9X|:3)T7 `otGjm-/ĐQ+Ć'D IҨcԅpZOIuFq Hа6ѧ D쾃\=SDQL|ZU{ߊ M42ToR.4,uk"&fI#uO}ҍ?xӏ7GT6Ñ W ` @>|ᄑ/2єEO㥄93m+&v`3:FVp* e*z=H"6V{B#.9( IKdё/ f9`y([]43|?ݒsI؇ 6${XVͥ}Toخˆ{)6XSo^c-'b4Wa__  M a h&Fՙ؄](ϔ23 Uo)$L8ծz]HӹUHV[u[s֛-wSwjEc~aF`Hv}]}䉋[`b!u2Ul,ФNh8q/: [jrS~Xꢿ* V/RP8ғ?@;3Rc%=Mfoλ_V[#cX^?krl.0J~iBZZo讆 IPȢWE叭c'h*>A_ ioWhSn+pg 钺p_ض\Q "=K.z-vQ/_fq^}}ffei'yF>Mѣ_(Y`4v/JHB`Γ4`,J ,C8;ɽxsjpn[Ued$`5ځs.Ϡ{Í;:~4:#suL1Ny=#K7.Z{@S4<$xWI+_)úLYS|luMΙQ&D31hYto5MfLyy%#V)Pݎ-Ct K:LoA򳦸ǻ{Mptp QAM1QŅS}9;r?(F43̂E`y([."_5 YtacLGRoz3jhfS3EL8^Cg4rJ iZuX]y =Ulr K5&S"It&7~9l}Ǥ 9-fip n'# EBoQ&`׳' dԄĹp^e\ Z 1y՚2TXi1u z5˼d i :5s97O)^Sclr0  ٻfc?>I'N|M_H=ey)ts#kЯCG[Ec\W7ngo_i0U6™g<͸Pw߼CT+aPKjNǴC;c6 ACĪݘ$U}q4!zixet#d!K 9Lat>s `^t+$})$D?[MLB{aێǢB*!Hx7dnUU},_d~)gȬGXkT`G> :&_/0"eEE/0Z<ieΩhыVBIHKst Vf9҂`y([.Z\-HG܈/L pvJFR/aPdQ,q=1^y!ǯYϤð߀Qvö#H(FȜcupō{?Qˢ*@5Q-#l _ cVeRυL[ouEj ǁI#x͠p0ino;Pf]$Kqdmdh:prsFTg.h<( b$}p+TkMDžro*Vl̂E`y([.LÇڴ[Nɳn3%4솥 5c[*m4%tj5f[AT-8z-]?J/P4 Ѫ,OG{Ύ@XMס_b1'IBڑӥ~X;oB,tj"⇬j< b(x=z(NBQ7v Xdj[SM5ioVCݮ}w Ft.\c`,J , RLU֋]-Zb푞l¥Lo]h%W0=QS>i~! $H1ଔ׋T 6[5hzzaȔK ߭^ ވu*"t(', z`-pūbGEaSn3v&]<~-#w*lePYЫ-zr.V_ I+<qVe(,`QjPb#gW _.)~;멩O22Au=}է= *5yD &gJ^>E:=LGw8W]ᝒnnO!MHIݡ N \D>*FӁ)їT,Gxx%߮A|~7"Dxt*f؊QA&7IDv !̪D/=F6C0o5p~aP.lE2T$t{6d#f?dY96gq /^Tη JM}Ζ~iccckKԪU  Ƥ5,X? y ߑ/ɒnÏ=crssP>L@܀p MFb(Qtg˒΢ N-})т[Vm<[y`ʕܰ}V ME ثq8yS2O×X]|--!JX5 *͚_66uSc~UiLW杵v-R8vBJ>'Zht;1SOrb7m ]cf7n{K%sAReOxhL"gC|֣yBU֭%oET0&-~No,JRȹ}oKJ* `W^%pt_B3!% r0nis#wqwO߽@4P!ߏs@KqPt₦0if]'%7q"H-Ұ Sh GnuD2S(vf$o I+nΏ7Dsw-]|պ z0;צhQZoԣgKir-<--бrZ1vN{3Ѭ;3>QX a!vf';)s٧#'_^$kwpp8pJJ98F4_{X!ITV]^R@X9pa/ _D[IKǟ,X_`Db[/_tڕ~sbɏ>`0OhiiOJR@˦+,/v7鯵Y`'VCHC VYs%łſ[YY]`xըQ'>-o8s,,,X,,`,PZ7@փ e\2k`r?ŏd_vg荖r0 Juewhi,PZOTYvg܍r0 Juewhi,PZ-u,K2Xf`9Xb/?@CCGAa8ڟ+VȾ2d>C$XVjs,|q:\~A9۷o)ru>fKLM`oWAsxǏx`˽ESpAz~crR?e9_BvACeFYmN ?U,Fy{S(9 h*B! /VqK4,{}[A@-'ΎU~?N󫞞Ǐ~*|˗/t}6&.9Xf9J4!ߓilm`:si3q*{Qj7 Mʨjhip4 2JVQJy)O j<ƧjU:c!T+jjj8qÇ9`,XLZ[p>;5%fM94)jښk.TGYT2-(]ξvE߾>{fmSIEE^^PP䡽=׿xv:::?wPt(Zbϟ?ӛ{=0%Y`rG9S~ؔE|RṪ1 NիHK JiV(jCs0G_[Ge_fK~Ջ׹9 }J-ޢz9C޿մ0U#Ca777feeq0$%%Y`po}v|w]P1+'2N6o Y-?N<@aYV@GE_[ƽYg%\{r m޼})ӳ!VBYm/_2L?g~Es;:vwwppzz:,X?_rpӟ}Svޫ pT*Zj/]F]]Ov˺Fo}"B s#Ud5~5:J "vrT,Ќ&Kkȃ^~y[7/~玅իgccC3nNNΛ7o$,+'X#OڮH[Ѷt7A!ĉ7kw#nHz;qv7oW{rxf2y*cߗy*.J8d]Ѷ·?OqY`gkzwip uվm]yM90aͻM}j둅_8_r4TU޽KVYZj?},BLrO`e}%>؎\%=9tƒpp7DT/Fz7~R<8K Afåz,l׎C0Ņ,"5UU8L)爴APJG$SDUדX]K6BbKwjEBq;%Tǡr4NZ%&xfgݝy}wrf'3ϳ%>' K㓹?;~MZtK?w'd RJGCݰ/igpFM#25{pb2x}nG9uҹ/ΟL:Ҏ5kxUzeg\<YɥطoZ>pb/… /tgW]0|U ٙKw}Bݻ`J Pc2ؿ\d_d}6`b2x^=>}wB[.,i D./]}egO2 C6{W_^k3Aܹ#3}.˗/Ҥ=Y~0\2BE{mr(h)Ylc΋{nU`Y~G7~K ^k׮ꮮ+VQlFܛ=Tچ}P\~R0ӷg+'ddUM%e˒ٳ6x\#^˖-±DV Ja QMiUƷXc'rݿE$~7ɘ`42@Ƒ `X qd0E82"d k#d#Id0tZ:ۨ'+ 9Z_ $ /sD"͢u>j7W\GXx-%p Q|m`5 d02ĐyÓg>Q}ZZ *6ʹr5G?⫘|v#P~O7`1,~2I d0%?u*^t.?R,G `(B^w^tq 23` 0  23` 0  23` 0  23` 0  23`4O>D.,Yt4n[wyg/$=oȅzbbb7tmvw\veg^2;{+E#_~/|ϳmmm ~;;;MO`~Wq3صnݺGyDmWG6*0{ ~@|_ /~cڮC_V-jzHC32أ>zuW2s֭7VXm\Sm`C3id2"z>}w,mڴ;-Xbm{O].k֜8qd_=|rۈ(>,]|n2?/XZqMŢXB9rřNψ\rLJ6#OC2ѣGϜ9'?֭ |yRr|ryfr֯{-UCɸ`U6Z>_46P,ՏI9+Mq&2o۹ 6W+b\,Z=p`D&;^u3~zU28n@I1Gl"z?~ܐ%*e>SOTE'p'a8\х^ŗחڨZ&ŏxpy9̔F1`dŋO^y ~駟x≕+WƨtOz46}C Y>9:+ʎ`FepI&`zѰJܺȎ@+Ub F+_W+|mɜ޸qc~7) '[^X\17X,OpM\ :7y Bx1 ,XjY+*fj Ƞg?׾ٟ^{͛gCoDP^ 7U| ȦӧOKs['EP:~?؟Jb9Y^{k`jVsw,J,~XGPT2X*|96&U#) m&8;< SA@ ,*or3f{k&cccIFHeAk<$,ei1KeTs%E2sЋ1 z:^4u0P=YO9+\2("FWfk/ ;>׶5|[A/Z4E^t@&{28011vx`۶m! u\.ܹ}8333<`dA쿖E%}FKX/b) `ͬܤWzvH*<\㽹!ܘ^^thӠcz zӋ@fgܛ+e4-?rd0+g\KM M,x]X`{, V,ȟdtU+<AQm?}ZF/Z3[2g0_HM7>7`zbz:A/Z Eْ-͢Y/E PWwӧO{6nܨ][22"޽wn޼Y}d0hUbz:A/Z 2ً&' aո|u3_[^~%k@Ed0j ~~a62ՙo9EhЋd/Z&&&֮]l۶M}2d0u0DV;wgffU^H СC ^o߾]. V}9L/Z^iЋ1L ;prbbA``=YV022l2YWR 239iz ^ŏ >tPww_I+i^\>u6sЋ1 z:i^ `quɄEd)lݺU,2ի;*dww˼*, ҈:_P)<11q)U_HL,a,Ģ fb)2Xz/ n^tA G/Z4E{ѡ tR{{{ j,E׍ {ౣ֔f42]& 1]=@/Z4E{.EӋ N:؏ @UF?:8\dPgs,h;%AE[;Hϋ#u0 d!:X32 d0``zѪ̷uL^AEЋ# ufd0 ``zѪ̷uL^AEutы QpO Z3"2X\_Hwx||w3|*i|%1(d0``Oh-#rq߆򟾧׋؇ja^K@/Z4E^t0[2Xb.1%7$vJq:xxo.bS@$`l![`e4/^/02k6ف066pa[bWC7QǂO, [. Xg)Gq̷uL^AEЋ%:ؒ&=Y}B# ̪ 6^:m1hӠcz*_9]E+dpB 8u0e M]9`3`DkFET$zuL^AEЋ#d!:X32 d0*L,Z!Eo9EhЋaL/"f`WCa`ꨃ5#`@kFE'zuL^AEЋ#U=YkHlՒ 6 `{Ѯ^thӠczQ48E[:"ikNZr2 {2إ=```[zѮA/:^iЋ1 F2)zѶ' a.`AWe Sd0``z.)B/:^iЋ1 3^E쬃]Za`4! lc/(EhЋH~Utы ?"Eܓമ.`AWe9d0``{{~}>*h%AE[;hE/ZB'dՙu0e `@u sEPFkF7G/=bN0zvK*ЋvEKf0 dܤXPuMW|.R)\MVfߓ j--upBNO}F?K_^>T S2u Fr7"^t~PfxoH*TFxo.b7c/:I/ZǾrŷ^9!NT2F^\ .eQ/Ci~zY< dp]?gggX…MomͫH12ػ:ṖOE6' '3yxIi|FoMrY\"7X2uv"N:;^Khzvy7Rx?z1:M/:}m۾ЋNR[rAsы.,/Z‰KU]ܓ0'vb~?8!3֧N kW|2%s+^tŽWVbz:^t"+L/"-UPQC ߑZ7,Ll28ײx\mw$JլB2{umzzK?HvLE{EIo[Lf0hP5+U]ܓte2-B"]`+KF"u L/ K'hB/:}ٔ m`C.&Y ejjV}GlNVu``5='[c#@j|UA2^tK )&yK;g}^t$M2ԸLf0hP1 *ࣞXEExaKdQV  Ֆd}!Ed02-B Q2! {_`z@he2E[:pdS[ \d0`BӋ `e2E[:d2-B@2XzdӋu0"  `  dӋu0DdSk2M ;<>>ܫ2%CٷajҋE.zdӋBVCbW%Lf0u䭔2k^ف066dpz! Vyb v-lRpxa$j/'i)epLOOZ*LR ӰgTQubض/ \5/'3ia! Q_QA'V!RE[*Ah9 6=/  ~dfYBЋe-cu B/:^t\>/mz 3`lA`lXzLUycivKa LÞA,i 6,K\d b4HEdaY:4%ӰgKp@(" 9A,=X2 ,D|F5W 6}ARaaaj `0Jp 222 )mU#ͭ/sNRǏOJJ27`0LE.ggg7o wZ*3vC` etL},ۥc}sUyQkǎbNHH铌`0LeILLlҤ T*e_E~u:JaGb%K9< 13:YR({֓0:NlR]t(+>U}%O'a7nlggb@RŋwMNN? `_RRR@O* \nll[P MLYdfE:!fhZC鑘Hd=t F~%'O*ڵkHHP(h]:\fÇë0 S#SmY Sb%{6:/Sg,0(g1hp:- Q8%}T aÆyС۷Wՠdd8ϟ<=YBX,^n]QQQMu0 : S(+ٶmm'MTn%Q rs8^m3ani_-Ȯ?! ^3f (٨a٥}] @}vS _dddƪp+ !uqq)[ Hr+9at[*6o$}[j=q8T WbFifg%XYYݺe2 KsΥj{Q¯r۹CSϏJiᨦ2o:n`0L!_R --->}joo_H~GV?/+ӢěnA i3TFb:9^G ^ݻ K,z𔝙 {z2cG4 .ʢwyQ=]7deߙkքzmzN$O8yc5-u %}ܱYՓ5>ٵk`0L͑WXXhVVVϞ=C#*ٽ{q*ڐQ%QgepW6D iҗ*ksT "88O:EX,ͶpaVM1kʑ#Ɓ\.w̘1={ͱZ \eXv\Mعs7Y"q{XD` JTm)oV_yyCNǻv!jWC^'BBik0"^=?`0L5R_ E 6 8݄5رcUJj_l20K4m=Sܬ|>}/9s9ݻB&M;vp##(b>|8D YrIeϝZ <k^lBYP{۳ #a= xc1de^%lkbm9? hn Y YO_|CjWM]CL]zi/nzcsa2 C&昘ʩJ32cW[Y{WJz5 4sP@kzx{{3cǎhBQ{mڴ)66jdk {7dC-˰wg#};˘-]r@׿v,q7 #pMk8ZqHJxec$Iᶡ `nݚJC ,[\zyyݼyS$[I%lTIL7O8Qܔz>-xT3KF lJGG@sϞ=oݺuĉ;w(QyҌ~Sļ\9<_nI#_ʝa+_[|ת2a>IXXycyc_{ICx41W՞<57$W|Wgc`0E^^^(=[ίxˮ^rPmTI}ըG#.Qˬg7jr<+>\Ѯ@jǎ &FD**'G[{a5,5KηkU|7_&ɔqxNueEv՘qO_bh+ʗJANo ,o4c0L] $$$11=˖)'ќN *&710ʶ%?dHVX;8pJaR!+1MBJ&N0t7Fs&Ӱ ig?2ml;Co>|+1GEEI`0 4 sTRIܜҜl&01u r'0SY &l_ļ> TL֥KGGI^eAAŋGoŽ:SpzaSz1E{nd/3VĨQ^y߾}5}1 1.ۢE $%###::>۪dztdzQf7hV@m$eCGJ{3`0Lea :BQQI%Ţ#`[4Q[bA%e'L%cǾ]j$c0 ^b1c0 S[(ی3@w `0Hbްa+1[`0 Ӯ];,f `j X "1 E`1c0 Sb`0 Ō`0L-`0Z3`0,f `jX ".fy `'Nh֬2o$攔>F ` b/_k޼yÆ kb0 6yb~Izz:*g*X:K> /y Ճ:xU:4{r_zY:~ ~ÇJWWYXXVY(?Cy?Y`0u"fLֵKXYYV~My=www%kҤ:w,!bX yjXd/jz?_wUB-A+ 7桥O7jx)0Bo=gv.y֚ez(Ι3G.W[lӧwӫW'eg8lG٩C }/7ojggi}[>]`0u"摡+X*&kkcS(A𑝝#;;;?kb-2~zkkL0%a`ㆨVKSR[̺-̪9>Mގg>U1oݺw^U3)<{`ex3g21k_Tm٢Wק^sVm1Lyǣ<>fg]97W$f0L&G,}T*[lgMT?{ת:gOmb7jXWu‚kVZGGGX(((ӟRpao$D̶WUa^_JyN櫘Um/^\~UN\f,E9Rj|B"!?` E OEv js: giY*$'\.T*LV۴igM.߽{VUdzH|ϏAiO5dT3mEw1l34IovD%^`mB8:4n<@jlN8kg`l Mms؇#J $"^$XLKF1|T!%'aaa?b8##cU?Jmzn =PW NJLK}jo˗M4̑--)NdF JT) jlnA[굦WR(Tv9_=$\] aagRnl(HPgOС,,f ?Mm1C=v9x)?r妝鯉h+;**j+W7l0| ܵOj<B"Eó}(Tj"qB&2D|yVXēfeKEyvzDU5okoogV1:tFy?E;Ǎ)91o M~ *JP( y{+V۷GA*DÅ999Ϟ=ͅ?|C>>>p|5Wo uG:p3_Uܔ *FtaLTZSNnά}r7y;@'s.Q%LGh5ס J#Sfhz\yIـӧO;aڿHy$yW۸ZLo!xqlFukAj`l<>P+4mZ)ou=;w7aeA3E`Mc; CR!ߓ?y2*69@BhsZ2#akkMӼ '7˗pDɟa04;;;;CkiIJJzQtU>#|T,t Ԉ<#P+lDRr?؆ߡ aa0LMQ\yknJOOOdCg{; `1cHur0 Ō"dJpsY+Wa0Lm]yΝy_K^^PXXX|`w!bmwzz3g6mZ=`w!f?::˗ok7oްaÚ> Mޑ1 T3^`0LŌ`0 歃Ō`0L-`0Z3`0,f `jX "1 E`1c0 Sb`0 Ō`0L-`0Z3`0,f `jX "1 EbƳJc0L)))5 33 yဍ5# m{~Ģ]KaY]1'Xpxju,xx4 d,Z[%9'$4Oomg,6b Xfh mCD˄ڊ+~꙼RYY|ãᑇh4zR2BkcwPvYdVO>jtVie|sN%3nraNO_<7jae|\e_q\>vqvݪY`MLLb;W,;EYQ*^JnW6-}1LJO.=sf?,9,f,f !?uB ݛ;!^fODRf ! drnK4nK<1##8(-$XH,6kn vcT^E>..iX5<\R)59z}B!63ځk/jGԹm8)tl3˯/IłtK۾v:Os-y Yޏ|7 9|SN@*؝U)1j3hycq?tH!ʎՌŌŌHԢ}/d't* ӪI:_o#񪣫slUPcIlvq 9Ӥa-ܒF2UV6R2_+f<O!?l Gl}|’񽛛b &޲=Vk qLmQ@w3" 2c325;d1ܠ 8BrhxE̤4iwEA, S1+Qmdb6ĻsxKbb`)"DYPYQKfZ. ,v`!M4+jiV٠d,P8[g>9[6n.Rjob.G@m-LU+2B7kO±X3޽ip)j4tG?M[ZEw~`]/q5Z6<~Yp[R-8p ,G_W+4nZe%LچOu}N,`eJl >fkC<6sh<"RLɕm!|lK&83)1jm~pOLLЗ縉=== ,f &-={zZ6z KQ!#HQd*őFplV./yކT7D f5[Gٴt7Q;6۰QS?wK '%(0^]E /}pf etB;!_+}h \Us=[Ep월G놧*Tk4;yQDICiO}WF|v􌮟uݾ ˒?LV^b\6W@:zs\)ʄbVt 2s&ʟH&᧾HŅk`#l\`1c05X "gNPk{uR$}Q1\7SeT˲B%H%#U|PܓǗdk C-C$ mn^glsel$fn_j=U(z풋3_5SrJQk<\Oq;/Nx,t7JJ-yyEc''.:WHIK6p=.|!rbB@ m= (.Y5u-q-ˢШ72(-yL[O"'SoR)Ō [оXi2B%W˄D r r:z;*?o8-l. OFbK,(Jܜyx44C IPTgAFg,53곍[c1ӬLm~6p;u@-ۉ򂲷l ZqvAndτC&vtvY T77[*SXwŵ9A3ۨVB+ d"۱v=ծ3z KT >.ˊ+%r͗& F|9"`pЭ Џp% Bj Ŭf[[;dn].k:F~ܾQta-$$Բ N힭7OlȎYK.t>2 L`&=p3l(c Z ڣ|I{lMs@xnA yT.caǦu's.G^o?k O 9Yo\t73W ѷ3Z[Se0~kČ;QS_qҊа Qѣժ7X^uɈsj wj^}$pQǖͪrJ*I arv7Ȥ"9qh|R"ʕT2Q s\D1oVXu ,f qq;(-C'ZbJJl&!D"8ǖ 0j=߻zrГ0t+ϤJ_fZjaԗcw{OfQz%Y|s/н]pݰoÅϗ@eĹʡa/ #@,p8pPy4&#B\P5Y)&p\>ܬDMEz9d\rS_\ .*ua弡;91) =% ݧ+V6dzL_Xu ,f Z@ bp-f0 QbF7oBBڟmXzC?|!b6zNsF}?ƚk-|xL2[#4ZQX:i*)y(hJd"~%uDjxnTS{GkԖ$p"WQ3x;pz%Ȧ"[>JX|(ω"f|2>2QbP0P&ކ2bKxb[`1c0Պ3XShY"BK1 g\;ҶNLNt+#7H̹ҫgɄ.v(?% F!z}'7ʣw;]slu|f0P*SǤt{-f.?;S&,Do<}D 7fKr3%BL HQ16A3DB"`8gעI;77V6(d:<&C(qsy~<]X)}bŤ!blIgJӓg< BV6Zpj`OC9j"w)ኇ04( Q:ܬQio^*yl=(j.WUEX(#_(GrGu ,f ;9jBw]-E|4.r+!cZNrtnejQ0uZJ$-0b!A?KAp%:tG߶ >·sld ! 4{X1C88F&BM}&ŭdlѮ(.C<\̎cYFU|UK .3 S1ѹQ34ᄝ *d ȳD<Z̯2QF̣c,OmXLuZ_47@ˠUH'! rW!Шsfu =0[gʥJjXx-M].i.Z]B8\ nFb3yzmKY(VF"[7=@@٫=NdCˑ|MrfĢ ?be*v0 H@=[)KmKbUVl>{HyLw& }H!8b`=f=ͅ oކ"%Y^T/6m~F:EJmAP(v}#ߒO An*/J S[Y:s cr[huY꿳 Ĭ*B+~sC 0 J."o-%xިܟ~iw6S=8KmّgDaeÂ(.g.Ō WrP[/Tc1`ћa㙝48hKO?n эdi0L li7 ekRQ(\6QG2DJ ѳx/wNMwد4h&mtPQ\-S(eC&x9::E&(4sɠy3u;%K Za4*s8a&zRSb2b'b6^7)f,y0: 2aPȦBXpMZZ|d췼D{D"U2D̔ Q13 Q@ RlIZL\4۰pG~9nTs,+]Jo- îPؔvlмR$3--B.5 Ǣ:uqv?\k5_G~Virsd?" 㦢wg~߷zJc$ce'Yc,j{|)drj<a+f4+}8 :!VnPQzxǢ_ 4Cb64P(N=/a܈RSE;2 پ7 u\նoBolAEPs$rX:se$fPbF rt8Ԓ\Qj0XSted.ČLgkf4pp))6 >'#~?ݟƪ+*1Kڈ0'ls,2AytP|b:Ⱥq+ꨘYɾ Էh`s=?oC,*Cu좶B+iE*ae}}$1yzݒFf]Tj%2n\{x}%|2m7ՎMd4Cb[y Za\y ?8`|;t P[X>xWrѵ ;㒾Ͱ47vMJ#hHv2QF̓ۮ3Qx,&Rԫө$ 먘`õo{FL]'jt@bVW͈1(W#Z_}]9\VM#|mA%ي = W"y ptӇhk51QJ]HmDK3ߐALQe{eCs~uj"a՟ЬSd.׋ĹJw'7>":- έﻙ4_ue%=[D1OiakdW,jN~@~ <ڤit9-}E1Z[rl4JV+4Di4:SZqQ6Q3k 5aeT^rqF×9M+ne=yʏA(z䈋`"vS`Jkafe>& {90j;|}|gHbJY O2iUQ: l!B3E/:ˤӣ3깶Oړs⨳q]mpx51snenӍ#G$J<:bL7eU]^Kw݈Ͷ=|p3$l>]./ۘ Jb%UayN^~vB#1cer%\\3},s:FHZ-~N4ɴ\t}&?98U螇nzl;يʾˢ`};QFLuVׂӦ5]:6pXU>dkh ╆FJUY(1Ohw{\-\<џ :cW1WD3p] OFCB4640~Lx<񟌌xS)9O8tLr6u3DEuZpiܬ}2AkzA>P1}43:-"DŽ5& Wz}x߂.t 5UZf=< X0hkX(#Y](qL7r3Q. P+6+JD1Du'Xu.fpA\DUJ Z1Z 꺌BO4ViEvZtQv*52Akl|TЌf5-h%{˷>D}!b;Q&4mZ|d/QWsVB*ʮ6\N"~]X[sATOuzo8jW_ z߁ߖ2bwמb[Q1ӧ̳lx,9eS;l;<ߐ6JWR-84Ԭ nKOk/c/ARq}B!ʃ5qsY1?3.8jD-fKtvᏀ8X*h4'F}ʊ yv̉ݒ p @ppt8jgO2z MHLF1s!,Wʋ݇D1n9dr,D3`ħ'G9f+R+SJ2bVÏBJl&$ޡYnAUzY W3nFS⍖gxgM;DRkb&ʸ#jdAޓgdB$O倥h@Dٵh15ގ viUyj=O&WBSmhsu%ŌvXkהzp&^ݸwY)H%1E+eifhozSq-}atᨭܯ'¹߲SNBrι**${UWX(#(c[]1hGXR6,DYUJ ySMV"oimP a]vwGpq!Afd#յhkN sw0$TH`5pﳙd710JT 淠%s3kjgu'Qoe>V6=իG}{Oj?h'VP %PDZ8dYkoXLWeuG_zg;1Iͨ{g}_̟5{槓 1-괘 oXDpRT<5,Y]ZG , =1#J=*tG,B\f:+ĊaC DU[8yZe48Y<--1pK47lÈ5nfxk>BCq_k _5eQqKHrOoŁl z P[EMPlm 5XlH(eZ\хHA~&/;sx́F̙hQ*b.ke&rs#f#ee2e!ݢˠUS;zBwŸnH:>>#珌5wѮ +hVK7|rC)l0rwﯗ'Jj4zR/Q%>ɞw~ٵ7_^kaᘰܜDAblYX-w} `eд.-z _QVXFR+0G92Ԇ< "HA u短}LLMroږ:Ⴧ17:YD݋ 3yz_.OW6Ñ7+J3Ek=A ڕsY(#oF6Qe)GدO`1uW(OMtxxb)a"ftP"GP 7Ӑ~5kAjb l45VEԒWe2U3(UbGvnէ\;(] Y?;pfsL ݴD1 M^humȾ޻rwoE=_[.L@Aʠ;Cik]kˏvih׶ D^sC$=q {EZ%y߾:g⠙>d#s$jueP'ٮ@(׋8yfj߮lR̆tvΗ?=ĎWk{V AsEJFGL~̈6q!MƸ)QwŌ1 ȝ(>,r ԦMsZEZL=%%J~;|&'\(>|\P/ɴDeXٖ w7&Ih3OtЖi O(_>]Q*M,L MFӿw\+ Vq>vw-\56uIbH?A,1AAA'F|Cw<[Z 2uҳSз ZsZYF ơ^iF=Apei0?b`MΚӼdY'q9D'},Q돟K6v8\{6''*%JZL(d`,1Ewzw]1#L !EIl]J6"fN Bw>@(txC$ʝ?n nhstol %Ζ} ip7=_&Vg ٚn0i~kY?jvU.y}8QB+)nFr9-mmy5H}p;mԭMԩJse?*jb&J,p)j[C|y`Kz>oT_lX hh"PP&,xOȘ|H |.? ?r| :mimo#dҋ[F[ӛ黊iwZggxG2gJz',9o~'7A`e[Dp5u͙u6ɴ/r,H~gX{)菍.*̡7eW_di𢝃3LD3.bF! x35^V*7g-FC:*/GaޯFʡ `}%=at]oNӞ <<n7j|g'(u5In݉h?#"Q+46VpǶARA&o0 0,/s #<>>Ý;w=s%~?'?syvvl2kr qofڠйbXc,uV߯_\|gmw/w >}ͬ#^i903[fg'22{b`.#?γe F*V`&婣]1.&Y*byG fC;f7h{Vs\VY8x4=oBɕqyLbYZ r+o(T $iAf ꋇ4xnѽ0ܫ:deB6rFOY58Fzz?'0i<'Gg&"%N B'I\fG{B졢ʃLRLV7凷v&ۤlŸ4*N ak-ۗCkdx}h)INNk*m_SL$.RHc>Y`Dqnxoj01cg%|QŹTԱݡ2,W/$ |]Z]gqlRt]8>9pLame FudTVZ)k/Ҥ N^η]hZ#8g%'5)Z nZ`Vʍ3NףNL5mĨݷnT/`sXRppFLY\d#Ҭ" [K/b ZSzV0MVD1~ΠuYaHX':Jo9@$x>Q\K2Z5ٗ7ÒZ:.JG aef$.AU%){؇J-R0_ 2+{J0??+[hnֆkut l0 6r_lԩZ2t6@{0 اNCo`ݖaǺS.Qw:  2qh }fTA|nC팯ڌOC d5=L$`F%~8Fg!xE,yT,ع['g"a<۸= EP̲! Á@ТZjc?l 0SWg+ja_ZP%;[W>a TL<] SkFy wn-{'_23ʕfvߊcj%l`tVVEyysB?B&O&:r'Ay68z+ hL a@?,f)$\ag"OqsrDlKzءVjbQ7.jm~SdzY*>PA{F?8]cx&{h଴[O-{M]ݒ~=lݹO9xo?aG 8 o\7+,\;vb9B궮J-3=1?T\ylY GNin Ѿr>贈v;'|UMo.c% +knljں]j|2*8_ g4`;66~ Re58?hPtHRF{R l"9Y89zhݹ#W4Z (Q)RZ/ zi9[(&5%uJ&#'N||d`&v߯evn<45mn ]h{#/KO?dzw{%g95_:f=oY䕬l%/S6E #`(⪴gA-(|\y#Ry$sVo2`H?f_V4 ZfɮA~{7dHeX$/ S7wĦ5T;:rw/|0<j0)SxRO3']9 Ę1I;gqkJ'٠YudZi4RCu؜CE6K0GQ϶ە9-|# YE/"mܗ!GF)QϿt?KO' |қ$8-靿wݡo *̀kqPC]{\zzn2喐0)rog")Uuli7zU .k˯ۼwmV<6qr%lra qyV7RUC绵L!|%Ou%g(C> jڭ6 "{RA^ccħ]A-nĹ^lXlu>6'j8EX[. ߱vCw;]="`,d_ڷLbt|m9|IJITSoi 䲋MK'+M䪽$h]Lmf-t9< +;riVLZe\fl8}aeJ6rt2w!%\2M& Þ߈z[h kϖ,Wں}&Pyhj&)5-4_|a⁄Mڿq}ʉ8QOefE4ԅX%+V`扲Tn*$°V>y~؈.z0shf`ز$±^-PML-c 0iN\aOPթ 'yJA^WO  mI }jR&I=ni8uYޣyXNyby4\~H36M+0ìTw?-9)Xxutʼ h YT۔K̑ K)/L5B-7s<ػZTj5{gUQ8%1֫V|"s忯;3mFNF+٣qQyɴCfv+sjL?MuhM.C)ӯ }c[ֶ2Hߢ% ?yw/d١ouyOܔ[n4SsmiL@Y Qv@a3}%3vAZDMƸ:iqeS!,J?w35<ˌ]꾍 wRN:t?F%yKJR) GC l_Wa+y(7b(UmOB O8 ZvqVLr1)AeLfƳϾǹ 6Oq-M ~5sY̛,WިfsfLN:g輺]jlG~`RkSͻ[ףXSVL 1Sfo:shGf @]孌'Хބ@7~]! eͤrR4 JQIyf"I,UL2 2GM?d`=PmbXz }=|qsstR^|5f$e#_q Ÿ@Rz=&u;NVX" AuHC9;8+b>勅«'%ESA=;ޭc^:^eR)E䣢Zrkgϔ_1Lܽ/e|>}pD%AVNc0C֯;4"7seͮS!j}QeV\Jx`3k~hJCu`:( 8@l{=/_õT~`wZ?/3)˚^\|&M̌t13;y'V\Z3oq* g`R"?в%!qH_k!fA̴&MIC!;κw3 ǡ υ/ދ tjݽϜٻ<5 Half/}wq퐃0w߫~vtu)4)(+1 /5S ;E-/>|4G@EvJe/ `. \fsNj.>}+I`L.!:ڵO]g|.8kKMd% ΧZ[ 8۽l3$E?TfF`^6'*sj1e!S`èИ)]3 6[k: #€.*T;@6011kU't {U{*Tgڹ }FsdTdȦhё23Z8np\;x0_q^֙agcNje`Ǡ`YZY}?ey*ϋ)%4̠Rås.$,O(eo'ˠ@-Kң2LpO[ҏ*3\+mfqӟc`X*fjׄ\ִ['_#G>&@faO -/0z4҅a~:V LIT@@H# p؈۩^v.62ќ[dj3HgeBL(#XZtSA;zۺ*b/4"^틎h3glnK*pnW05+P?T&ժsm\۸@2䚍Wg5km &i[yrgTFe-xNiq& ^IFq*M"Hd,Z}~0>^ޮ%qw5hֿտXj-#~>_ƨ3CJUMb6xJnZ]ܫyiVk9>;y.]Q`_4JT.73LefW-8mfڲJ0WVLnr=jQC_z=P ݰ3 >ݰm:PZYI*S#631;9Zj?Aܷ-"•I{$l6n΢QYYY[{]g*-T.v[tzN~*щK>ڿ)?C|i9q;vNLԮ<6$u$W@%ۿЄ};b Էio L鲝\u.[ѹgmEt;m:  Dn#}Xvkh\F*lrQo1.<JCiGyNY100MtA:q@.^J"8 # Kv(SCrX>'\R_3B2+NL_H΅%~,^R] v.#g$_w9w0Џ9xhtG}c~}V.IJ؝]&{rOM&o}k/ 36,.&wɮMWCzZ/( kuvv>,u%L*E;=-;^x,TZ<6+?GejTIV'܋3> y/ z Y3{T&΁S|H~_ԂR=v039=6U(B[&?\Jzwʘ>uO29c*IG=*LUEE7yf>2ݖR1WVQlPxCKy8:9DIa%)d1ELbդh۾T.~$x(^RVC8a `<vګUä4:L4_*4i/""r,GSq`]1u*jkNN7.yX?0{8<'(LދoP!9sj̤0ViMT99:)Ixum ` U0gCc-Tfi/Yύ6ДsmEصk 0|0Hr4db"~~7oW/v81}ݰU- \ψC4zم[ACa!H˜_aѺk#G^Sq^0J8 _uL͸_>'hrBLn$3q*xzTt;(%?̦eivnZ8 絔D?)8m ☳s*i,.,F)+ 0q;Q`~t$7@Zf{ƴ AGYƩ̌ie36֟Ub fj|TB-7FŧQ%yrtqbNnn먒N`q7Z;c6uO`JN!n8з3jfkkcb2nڤ_ۆRFLS&Ī_x?Wn?1K%^Bm1糩&;Sڥŭt0%33*"?řT sZ[B4t& X=vW2XxfgJA\]k??Hdܾ7?w碹̌I\X&0\rX\Za ϚmI4$S3C[~ۍ97kS 459A:ymhgRr¯$n?%G<I6q7Oo(ZE &[)_9VF^W؟Al6qT73 j0(ũ6Rؖ95Zmp]5<<Yti88X&='qux|@#6YnmgRAe7&k)c{Wb^73(a M6s)7g1 U m۫[֘m7dz).Hj֭15<1rJ[!ĖrNBumtdeMw)TVyAUZZ#6}x>ssv9z#yt|f :Ϳ!M092]^gܭoD(:Rhm['Ly }Y0;x<;-?D\KCI(i;Ϛ[PF8l4Z-  R6IJEsb&K }Qpnج uup$.˲=uڼĸF'81rzԇ[xT{M%&\b?|j S|U !nJG!KKn}0&H7e1B&SoYu!F y^]}izY^ZSeԤ*#"U*U-ikC =ӌVjܓGWdk>zGB"`3]hO98 i’CD=e*'P)m?_37J\ZEQbxe&*gڲA25:jޛh-1Dքf#KۡZltV&b)Qu`].nBOG*kk˜ǭ|K'.]A)&'Kb X)YiL:LP==!ܭ;xTSYYZ.-6$S֑1,LW^ 9dr.Mϸ `t.>ZtY&;B&ዦ2;j*zz_mC9')Qg4u.*^T儣QDG9rBFy82>.`:M՚Stm,ShQv=&,Nm|j?>7默dCM/`\NTR"CąT&/>j!BΐC4F`Ͻ4Bse- (1MY1ݳf R2SvpnwT{ >-鹰W?*lqev|/pB|[ׄ^ۢ # Vk*e_>l.AUHef<U 0c쥪:>6^4ڿ)DqgB,@dIi-xdN Ϯ?|W uWL{6QP핟=ݮm>IJiXLnɀS.7/ HL? 0*gE,b^nqu@˼ vjҌZ 6x^AY%;W% ,n _[–'#T)v نݐAt{9 mѩ+w8rqS1;7GGeaG>Џ FAY8fT n'HLFqrswvo!r?OR/ |6[f'~GuxR$.<0tìYs=0?^*?JƧۓCQyfv?>{(0~;L[N[7{?7*m^=]NmBTg`(c|N8*@qq2i`z71Qۧt͜taQ=ِ+H6-6טYOhf#ZѐL偝BK4"yo5@ܥ4y{aOfkkk,ޏܹRTS_LYy⮨ r+vIW\(wRRvI^ߵdlB5sE ;w<\ˡeo/ǤV(渨Ti=TbpTiFsѼh' nJbsѬLqRq`ij3wEmz]P_q &chY֜` _P[_GɃ==`x-?j_kEnj]*kb^}~?uGvl<,epdڜda( B2"=KQԞ*3#0-3;y+3w:o(2<۳6ҫjL?Aw}] i!B&$v?ՖUe0`6Or Bp0$ -Ub$p3w FUN *=fNNςd +:S~ Ky{ i_=rm=]WbiڀG1}7E:755^B\R &툏N81hG[Yע9f3=?[9Qϴ 7 2<2#Qu `BT:Zr@;$=DmZԀ7:&-;'v^h-:3O?BwQ³bI3{$Zj"}Uo?_e\`~ +.šgm3;86++9w&Gf)V{&Z3ݖC\)A,޵ZEes䲮\#d~#Ut~P0iF8R*ڎU-sr|<6hR<ɒ C`#0Ԟq}*%~.TA+M>9!hlA%0r*Ԃxͫ%T'vۯ^ꗋ}Akn\p;,`O ݠԣQxxT i0od\~xi*'&CF,U7բV\_Jnwv7] -9-~;7 m;F&}-nŔ-,-~pQ=Ge(TfF`޷㮙_ >Y1sN&w6;Fl.8F{tzNS]ޚh*[ f)YUf\_Xll. ̌H-)9DB[w3J㘩L5:Pi'?;3z׬l_֙(&h3nK& ].߮fKPs@ ./Q͵cWlpfᆬto? Xv&N]23M17Fc]y(v!vtמx"9&X{7GVfnp*NvtglSi#]5lWLt^Z87[WE?v47x[G8wU6 +lxFef;#ܽMk՗g]W\l<Β``6mп[:8,`d`(ɭ(*q@#6I*Y#ne3+IyǘQKF2>D\3ZgqsѼ VfҒzS*sf g-׃_$UjJBwx= ""FxOҸ޺vDl|Gsu7_IvQ]ͩIbnfdwlO8 )l:]:%K&mP5j;8PY0KOzΆLw`ȁ٨hܞ50^+0=2Zح0Tp) E+åliŌoS;<h^^403RNżq{(0x6fc0I]`+䵢M2n%x1xZ _ wnoߥMvd“5}o(M9,۝{7yLa|j @o҂T37K7}!1xVfN|l7XWrt^"@n\\_2JJv4"`5:9ǀ%A6G)d-NĮؿ`3O G&*KC5LI ެ$3zܸ|P/f|8"%!5t`\lZѮ{L @TrXc\zlo[&_s% ۥ*xDl's-`w ]x./tkSFm_`R~5i<⦳;i[md/n <{Ӂ@P ԤBx GD f)nM•=$>V9)p>M'3i:~&ߡ*ȥ+,2b A KeV^0Ǩ̌|dO;*A1M6ob3٠~SzÅDnASv*EZ^Ձ2*ٯ~9׏ƈC̬!$%3;wQU 5bǾoCR@PAi3+$r4 o'.r{Rb ڳ{٘Q<4ukgס8\Y\ ˦lg`+!W! AQnf]ܻ8:aj|GP~MQ䲹nceҧ)]RvhJT:p5*:j7/qCy Jl\pD$d)nSVL?Laμ~ +3/ X:2E~t[Liix ]mkx?3^ϩŅK3Þر6<㱐Κ)wHpZjHعo=`ޓɭ2s`P!K:M81%7n(c:݌'-g N6h `x+u]5v~69gD.? ٳ*O3sn^sjbߴcRfx-4`)ulz >҈6bT [hX{|HbFW( ^6޺q)B++E>Jes)THγutD^d= N^KЧ$ejƴ9frk4|”8MA7ă=Mį ̦s *}Tϙ3qRcHhVy1r:x ?GR tsOI6Bw/^X5m0 ҅♛Dnjg}F7K+Kզ[ίyA#U+{4ydz(?=<5z=xuC9#,&d"_0W\*'GUQkكUbR0IB Da%^B ox};'ˍ)H=h4y}c>-|Ŀ";hмJV<[Ee@0KV)WreOeaHBv2T/H;4A<V v-8]/i̥%)b!Lp\剥?vu:tyg?'3~,Cmqsq(85ª]Vif~EZ oݾ:T{Wp6-,Eэ~ YɥB{L4tSAgnӧ%1Lj7\9]47K4sNn=50Kp"$s6߹a&aAk4 TKdoD s+O,ぼP[f4$LUXfP]|fJwWl2ZB޸op*0ɳJ!d VXyzERqg1zlj7v)9$qҫ҈qm_KpWTaɸ<\V­BGo=Q.VniMF/tiWwsǦ+x\)$0>`mGȠs:X 4Mͻ[; KM$Kn+= c?#TfON$ٹUWV ՞B&uVhR<B.31$91=9Qm,A3(]7 Fgz T͌Nk3v*Fv|Sꪏ'"rGv.{, O[$CI4%%6C0QrP#8\P;d0Ӟ1:55Mg7}JJ9uW䝕 !ntq.Ae/|۔O2(=6^-'8xedQ>x^F[ )SQ"ω]'G71&,(.FImfjV2S̬h&a}rHiIa04;nHqan_g5ykJ%o)7G&N Z4%N>juB`߶ĖZ:P/4N;ɂZ}\*?V 0?"ٳ-/lf4ƕ`H)EA|[{a毟ǽI&񆏧ŧeTT"i+oZed(yL FwTһKGOnc\uz8pPN:Ð[#U7)ʘRl%'(2' 9t>==OF߹๚iQou{>=GX./vBNfATȁjUr[[+҅G%:AV3LԳА @dQQH#:LJngkɻ~1W:;Ƿ}FN[nMҐ9M䙡Ë)ˌגѿxh0THY\KKƉȂ]U]zU{(|S&>.97Q^ w3mĆ35e??T-Ls*g: *ׅ0'Vuպzeg?L?g\.3#0J1s@;gV g`b;F*L5h֝)E`}@hiPh[*_:*M]h]:aȹ7STZׄoS{lPg5n'AY:{=CM2`5%PSŭ9DD^79E +AlA侫TVM޷/*`s\?w۝f`@ZFzj*,gK[VC?sg"zd7p]>E[o`ZH-#şoˁػ$ w3 1(gb&ezkLbƳGxjya}%#M,عܵ+{pzcTH|*m|$?ߵ_K,I{Q) L:Íg]-c;g-cM=HeV1V܄c3fvnƉUbEq)4qmR`R,@ISRe\WïGKK^LhJ#vM48&'drV@+tFaН1 —~57GC7c Rc#smœ9QRn92J?i6(m91'uy4q˓|]CJ沃ny-'.΍WFk4yԤ> 6s wt`/O[\D/*QEVŦ9KknR^zߤ\bi Tky1pu;IK_ۉ8yޱu%n[ ylqyi}=B;Z/ɱ&`4 Wo$:L%6^H_-K PQfF9䜹eZ nq=}0;zS/{RnmE` ł\"+}!1P;< Dl>b%-;q4Hσ[>ޯ4wP!H0 OJoW}#<\Mf=~m<} :Z'H 3"''?48pFSL' ^)JStLl<)4}@S:5`.o +J1hg'P.}Shtޢܙ脉_ >M..6waZuaK(4eRg.(U4RN`&o}&q+8=_ޜ;1N"\&LLhKvEm FcQ]wNu?$,]:>߳%;?LOORnN^`F<, St*˱[Yq .gWΧٹiKV+V{`s -|zzX[?Ɓ5I#ZB/7 3_f'#Bb',N$}aڥWFYp_>].2ʝ_c$e26=_XI\>*3#02l0 XV*2"}\i[–Bi%Dw]&U钕CTI0>+M+uo`DoήC!܄_bˑy*51'=ÊDsmU2R̆Ml st,aJ M3xY{T&k`lt2}뒩9^%`Tq|Б8&?acuXzqL,x)v&lʊ0XvdV:e8SOףIIQW9(4Di}(>;m],ꏟUr?w*]\kO ?լ#{^bFTK0nkY0-ʦ,+--,3#Qe`6SˡZX1 (:>>Mu:-ȕ2>0뻗$0?[ܾ U<` yeI&2}-ae$kpLJz9>&yԤQҫs7~209C?Am؎gG/'\lVg )vRjͷsZ\ 1ze?k`rL3;76*\ڿ^aqT ALuT*PI^2<;5(ofT *8UxhVs~=|זe/\R{ 1nꜚ1,w^r|mcB xh N>CSR})dNN>tu jyb/{xW|fZzai;cqfIR\Q);\ ͤipN1Zʶ9 ^p4~ y +6Xh8cǡ{_H3Fej\4'AFZcq̬lOIS9,4sEkOƕhS ;a5z8K$Lh 'u!( \`9yӀ[\а"SLIJa (׹ס(;G9e>,- _O&o熳@ln ljm- SRsPAcm&J? ۨ1dmsm3ԿNCHyG|Un`S56]$/ʾ[|s\VǛ<9 PY ݛ>=^а{ NN6KFܘjreG3n۷6ǙC.7DàA Όe؎;Vv t];aEy{H4i'#=] j֩K)˷MĶIZ%aEZ?56-=wJx cJ1(8~evBA06>+-bh|5/c3#0߸jWCsEjO,]TEkl=EGcڲA4RJr'tvTl0 ΒԱMzگ9@Z@-HDdb/%.­+?;寏V-<4P`*Z2lTZh`ڏ"kbyEgB a=q%aI'ih°uf[#H_MţSٚ`JR#!3WsZwFy/զ1ė9_Z5t> #Ci*ps諟Kf7wjp; \mGlKv\u#9r_97r`fYM'zP5F '<,LJhXty0xS a -pLï$bdVNh`u fVKrς9>VnGf4}50/׷e ςʢX\C@Tn6(UK1ՌAڠ@mH HŅr[o}g܌ ޛ Z1Vq+};Y2Z͌3P$ťSP/p;` - 6(Ec;Fk`lE'Jť ߢKCnTUKspliqOmG{IpюiϛQpmGOi9;`~ +7!e>_> j+a 9͓JK=30SWļOd3!v6>HjA63p"4-! 1~v7lLu}uebeʊRj% TRkLEq@)OT: e,<Frtpg_w`@dzڽ_trsDu$Yp@ >ULCk[F7q9aztwa@sKPg_<TK].r,W*&9l?ss*I^ϮAl5 m#_Ǿ%VjhsQsRTΞdE0Ox[)/0EMM0`=Y[~$aLh7mÝ^y~"xH[1iKN-jzB8oub{"_>s<'ﭰ '?'y뮂rǹ=k/s/a-8J:&yٚE+=;ifX1sJJKZB/G n_'OcQ 3R, v۟?r흰[hE<2!M16c޷-uw\[N,_٣1I,Ȳ/) D&?PkDŽɗXwm/*u$f, ho43=п7X$<7]'=tkkksz)T?EP,͑#䁬9yf>v^:"Xڥ2f#;?2GVs+7GnZ=2P$12}cbH(,{ӼCcv8aXHҶ'a}8 X'*Vs~8eـvyazck.ٿmaBM)חsW}Y@7?qE=ǥӦYkټ&<)i; sWiBQTE<(k۶#!w q0'?nO:< O>,󢚂Oe=9-%g_1g |UƝ],I{D껂̂'[gþW^-{mXm1yB>=%wwP5@]ܘ-5IC:~*Uzzi[H؈mWn?J! Noֶ9oܑ5w 繟<0Vz6y6H5_yݡqZQ}yqausa~.25I٪iRq3[_V]\,}st˂9owgh2fqCivlCG `ac~ ޤ4!٬OM0q`U WfsrZRp'+4S&zD]0 g/ejnK#{h?ZGW0r&YS"_WYdŕKrS`sQ"ӳ;91O2{n@B:̤\6crk扅9jtAuaj5$dt:%2E6Ͼh?w>6nFHkz%0왑'v\BT*&r8!`68n-k9E`d;V@Uq,&`ZĮIQIaBEIK+,oE4 P)q<3 WO>ںwA\4$뮊wGǫM}q _*E\{~tԠz\b#^Z+U vF(zV'D2ү<fe`If$% ? ]vxC4Dsf_['mV@[[/2nYR)iwH#|2366\l@ȕKQ N/նSck[mpu} E\.*SrEF|zZث5s2粔g veTvl?\W~Ai?XNc߮lݭ *W*޴$HMzw|iѭaӻZ~4[QO6Z(3=?/[ܮ1Oǝ/xx 6ryGhRG :VX` M[DR}g#̮Jϫ3Z9fbKph}50us1G^rה`cQ2XcO%&:jϻ1ן^϶0JJ8|(mRF) >L}P_fYa91:k 6z΍i4KwI:0YS&?`͓昴(.轅4[olgܥ䒹Z k)'&,UNR{g: ?iE72lvIG~8Sd6h$ i|eo֬maX{/k3|ټ/-X0bVx‚ܬBa#|1ve"cˢfoӦgSo6ϢYٓdNg& 2*EexYFzvvp$/`<.t=~0+=8XqѧGN>lexQ$#-MG~ήvslR J*/88l W:2 K˴tL|#$tmpm7>{IHۥ28BX3'膊\R5bjҹ+u-Ķ~n$+_?28s~!ןY/_+WGM 06Uijܸ2PkDvf0.mIɂެzW.׊A(%~ gg 䎣ڣKwMM#~,m\^@~ԒߴD'`k@6nzv']54N; C`S+۷ygY|+(tO`QQI~NQn6H hFB-`h7zM[J#^CyYEeL*M̱*ʋGvtMֆK9Ԗl^îFwKm`Y*T6.䠢y6_q[qn.D; NT>p_kַptP4r}ۀGw[(^N<08-FYp7K`㷴d%=fm4:}; [|Ӧ\cr~ܼݛRsK☡W\"bȄ-whL^sds`² ,*mm1OfbJk)]l ZXX`&fKu;01ѳL؀>WnsܲUI/8H㕞-z%X/]p,fq{j^^{zLI4N?e#_9 Knccm.c#5L/Wδ.a8&% LቃG jm[ ĮS%X+"s>jֱGDZ˔%KOĶy ooC~oQ>8j߀gjqpjN7מ_<`n:;qO-F{yFqo|%ð&24s[@邖+!_iR_G# CɴND6{YG3Q{l6eCke c{f "\glqa(InF̎jHwQs@4&M̀d ]A0c5)8@-,,Y9Lu<=J=: );9yT *1_t0kIcfyaX?0Pt)zrUEզ 8.y^ih3~FW0ck9czTo&Ʉ,,%Ϲ6r'ޛ'W_7|V}c!ks/﹭qs$HN=٘O^” pܳ!cہԎݞڦtT~D &NjƵtʼ9R+ 3 F'3NBf:EW9:L,ees\$/EE%1451B۟#:Y鐞"Eh 5Q?$%4IST68S1J AQM2,EOHGֈ(.[ YOЯD4<=D~^n9͕Rt'/ojjҞ_nAW[iyoǩoNh7 \jڹce-Vއsz:{6/vEsv˵_:1Ar:?&kfĂ2]/%Ѡ`&j͈dBNesq%d俑caoœd}]D۵YPd\ R6}50wDMd+˃VpD&Jn]xbee*+͑;m5unYf=u.W5$-,jS^$'d>;v!Ml"ãxG$\,]R%YEsz.j:<8GW۩^򃫀ʝztү&9A"o%_7i0|l٠,~;-12գgs3`6F_:  K6̄1XS f!U+IY;+t%_4-ŀUr-" R28Fv~&8o_;[ QJ91jjrjsmUJ;ߜ_86,( ,NZ9J/A:Fb{yurBΒ`z֤Q4Y#Wp3a5S1`-3r~T!9/)$|+3#nӥ;p)gmPM]٭6W-ˠh(ԶTD힫V%ZTcfEܮVC6/||=K6 ns*NBӢXL@/V^X `zZE"n9e~[_Kv5U$\mYo]0Sո8#6ϋf !33qDFdWl"ىc-,0'@0uZsLhxR>03LJ6 Ei,GaV;fcer@3yUn6;RiqjN.3Ƃà peL]9≨M&F$PS+0)(HiޅUI asȐLh`&tN [/_ 3o?x ]gY'G"c/Є}t? NM]2r1m؂<-<%VX: cV0ufz!]^jdZ;Ouiu!s* dM2IS@?[T\i&j U22}`65n&`&hAOeEpB>Z6Ź@\}'ݼ|vuڠMPX:S*!~lֳ(UvzsYXSTZ Bk⩁d`6ʄv0zLsq 'blIq^u귐 9gc`a0^(Pv?+۳e`)>ё5Q|xdk!;^4ج^?y,hσz:VTr03p:"up~yǰWj;9иo݂Xrՠ2fYM0_b q6;ciZB.(Cݸ/<,Ѭ6I`k?Bb 3C pv63_UkGl籉R+= *R6W GY#uf <8G9V)/0)L@$zuO(msB7!'`JJel&{zx;1LA8Lg <[XXkG؄&:꾧)U"x~wl( Li-4j5:4nHLk^`,ie DߏM[G y l1ǁ:~>1ൕŽGq (֕JcF_~5)%Cޮ<'VqF}iӱ1+.m;ϛaˬo?QG;`/޳l`>bW^_X~D?j>\m*`.'وh7fL=Z3yoC#ݻkfƸ{fXDD ̲`REɠ{d3MӺߴwWOz\m*e-V\t2Q0 춬tvrTp{֜r˼M`ؖ?5>=,]BOa/ i< >e?lN70j4cbۑdn~2 2cBIN(byz>zбW?c|+ G1岏0\B/U͆?2fRdM󹙽]磲1ns>WkAd+ 8 K18 `p՝wzO|?l,E0Oqj9rb1tӁ}$97pݤ?$&6g cӞ?x!X+#Rs05esR݇.~S'm66cɝfv CqqTݞ+g;6i ON_P P}2S 1=?n*uӎ:_2 TDOyHh-wLJ6mb-Ȣ (02NEۄŲ߬+~agL558ܸ)Gr;"52f#c}`./K0+Z5Iun~\Yoj> ba5*PjY d vc%+GSC/mypoo .L*:m/~ѽWٮOy[ F_[gSSc#3&>6 0!:O S We2rVA$ISG3IeBf=CѬ #31=q:9,9lie6f}ܓ= RlBMty@=C(.tTeu:w ,b*gZ)JݢY+}]8еق"K*J*6Е&;B QQ =zLȽjV+Oȫj2E1qr$K)f =k:%հR+lWBS* ַr#eVt.+ckKe..Xu޿@]r+qxp*8F̬ fЂDbdvV^Sdm_%6fۇ,cK}?2cf65wڏsmy5 rE7a7&Dp٥\_plm̙eԬ?sW3v:vgSvYx٧UxɩBr`z`*`6es.=fZFyWZXCոfKncʢ!ߜ[7V/_N3wƑ $[5 %<(?Q`[ZFz6kA;r߱ˎM0󋝝8$J-$O+ sVDmz`E$װC-JiWU&T,pN ֏+èLPXׁ(,΃M|cǺ(!O)tr~u-fu*kȯMiJzsX`B^Mx$~K'WAu׹{=N|r@V/X`pt/,o1ܱg{ƶ'D&ǴD)Rڱ~ ;c@\H?DS0áV)yl;\NgjM/ 0ǘa b0"5P^}=U)uNRC6kP)l@-0#eepW3nvv2Eg>6:Ȟ-Lh(cZe'Z.ʵ!?"yyuzg.\PNeW^rGW9i%y5>Ϻ1Ok %]GslBIaI܂\ѳD6[Lzg4U,M ˬ[#Ʒ!iDM7ZHÝ檂vLhxf\R\_I=jo'|Z[@#V9$YkRO hi E>cqg6jܲڸ:ZZZ`٢A{}$\1恀l4 5Ws7s073J uӎqlY}QPLT:mBud56̚TֿHLS)Fʙ2Kfy&<@ O\}ҷ]&K|e}4L!/k R}a>Ip1흹,癡7 A/Xؚ cV<fld7}f¸zf1%8!&kHo$)xagxF휳7>>%ic79,aQ /P<ۢ& ۾\}W=Cx!/ƶh]d Qg]jzT$ӥxEYHo::iZo⦲q?ɂ@90 0"QHNǦ4c;fVFeu.}?t珨oԎKFug8vpfN6حcJ/N*I8r"UbrMO4~сIk~gz6"g'q/֙?o}F뎮ش4F[1|_V] m;dB^HG"2BWPMN`&t?2 n!.?>-)$p*֩Lh:sKPZVޓ fBD̝W~wo>5֝"=.}[l[ts,.əJ;D=լ}_23hyNN-`[|:$Fccc%[aK;UH(,-JX̜`&t.UgQ5=ls5\HK\`֠cUL@#`]l9̸ud73f A V'0*$: *:`R*#55큻=;KUx\ kе Lf?wRf~̭fig f06đݟxd*9ߴw"+ƕob˶||8aU|. ,*֞vI{;VC}*$QQR݇P}t=;pwENe9ܻ'J% \ ց0i6uAeBlE|HizYcV| \٦?li,IFE 4k-n %`.?*#-g@AT&EHy=vu WL'L-n3;L:b9.t@auEj0ЕYEl N]2f`:}-08~"Q**GUM:A18}7,šn>Z}.޳UGo rkL|*:( $oIDAT-:# ɖWլ?_$,~6j!?i+GɝzxzxַM,⍅Th7Z :Ղm$PT 3Mnl4{.h G~~qԭW>\➦=7]iggg3r f]%Jѵ=-̼<>lzCzk%?L";ͺ˄9}` !PσO xSa˩F`^Ӌj4i~_>:&2FBNW1oL A|Lݣ>sh;Xfy)eGy-*`& )Or ;g˸.*([>RjV]z2~uɝfxY{Vpc?Lqڰ~]p*f3;!J&8sQ]b3VRøS3C`25ܢ)ӹIPA,?7>|^;5;1|J0pvD S̄OuE!³ug9FfcjnLKsgo,OQ?aZs "^ 1x\>~ȎWa_t6:fN3stX9z,*ʄ=m<>s52Q/ N%o~fل*@^m0SHج f-59_J|On6ߒ5@gA uIMM;x6.3gwkz Tx`x߱])?zmquyz}6r[~mZ.0QK62yȬZVgL3Yk ;ථ޶2(,eZ?w,8O<Vm+&zjt`Cl̈:Mf ʄ--m\XH6hXc~D@J:PK7>3|^ ̛fmqp?S#'[ˆ6G+JٓK^=f[Ӧ]ܬkl p;5ST;Ϻ?/:ȏ&5om?-O!)[R,Kd` A@aۃԐo&vD39[G66CCKuGWG 73f~mܗ _%J?kg{*_Pݚ+Fvo\z}J-6u2"dB g:i:೶e)}Uxu2ByN~6~󏓧-Xwgflc`F|R}3YI"}q|mA*6Ȼl݊@>qpK k7YimM6=ffʹ)}{g/CɎ ٩%9%{ f.Wk4ϳ)0⫑u\𐛓?3z9B>Wrz8/"/u8w-:tosbA0Yf I#7.DDmjbl^DelMW-^:_V#: ހw//$뮖 B8ia͵fm9ѝ@3- `*JY<*R%6ov\% MszoP+`;<`(&?U:IQ>jԣ_H KNȜ2',W4"ylmS[R]cd 6]g_n HN~{m)Z5Ê|:jSx@؈.p`hβ`ZZ2MM9 {M&%cʥ7̎- Cʬ昴}%K-7B~ }&lPH! =* mJJ}d}?s)~>nv 9x0ba;OýfR+JrCvĶ_1„8< UXDڿO̶sP3yȐfC\T&4ٙ'm M1Pzr1 >qV3FE k3fd#TX(#q[0glwNi帥]]^\f -r91bN56>n27{Ms*ֱT@Nw̝bY5 0WonM m8k~I})6y{C0nP؍*6(Q&ÉV_[iOmvcZe9}p0G-`hbN?ո  ߮] =+?:~[O>⓷qynܾ0lV b1L3o!_OTi6\=?8m^Gtƽ< Y'b(4gDn0^AS/g{}h7%2]mkGae^>ӤN3/r2Ƴ+$~yMjə~GZww2:6`o} 7J3M[=cǬ\c&]p 0[YsAA"8x֘)ҥy0h3˛;ǯ7OѐNUpAՓ[.8xĔ`P^ѷpILi0xA\w451zڏs &c@hc"z.>ئWkND̂>e/@ fْAd0~gފRHL,9D}ia]NK0x.|<[64B#q6+ǩ KF.-pLc#Q%DUج)=ϱ~6xl?:ޖh k>*Sr۵UoR~-N9!pd@c9ݖXYB*p3G<:vOEKr@9V2φhsX)p ˑ^^9! 샏e wIQk" l`GWT̄7"Uzƻ}Qn l615:=KMZ" HHpG~ <䋍C1B6cw1 s9l!<x \u>QCQzd8$<B<D=.L^:ldeM66E휖>N %6'L3ƨIfرL3i֭{%oa781Cv.ψ? m(+"=A 2trml\U0A/M'166vzv#m\:5cjWЦ+fYM/z>$h6<,x8OYչ]\C0*Xp smS \|Au+7 vhj3u@AvHO-S[=G=&\*f$-]m S :wRˎne([pTYV j8Zf&k̵HeJgC\ 0G~18+sgI܏lfVЪ)mN/sCwTԦ TR70j2 ndܙl6ϻEYֵ3YdqKlWLMҍBI-`#$a/Yo]=y\&d_;2Wv`t;RSNj쟧 _z).TTowmq^`NSWN#iy)YE w^2|V?~ϼS5&Y@zaycd+ɕa G+m>H Cp;s8E>mѵZ˄lk̹U3YeHlO5Lt O,`OR"5OO'^xűe1XgNS:ן^xp'@K8Sk[xE' EQRA $Tz  )UpW- #$gs)"_Ɔwd9$8` r] ZgsswxPuŪaM 3h)}v }vA}>?U\dDZ,4+'W," ͦKS +`ހ'y2o׽|} ##/pKF*-~z/9[ـQzMb*]Yk\b1 еxn0G&(BQTVU9j ˑh[jUz/߰ncp[.0/z i.an\qٹWe0Mژ_%hW*]6͏?\%_yᷘ{y5&y*!uXzP;2GƗ(2[7'))tK>B \=0 0sNNxNUIG~' `n0 `+qZ[dg`/\UYڷUJL[o&uA.rr%0UqıN9v\&h޿#@LAP@Y({ﺵj WuѺVZQQ\ A  ;aν'\jߟ77wy#'gY-R=8 Qxh*Z?kƯ#[\"Pp2aZ1duXam$̟6s`n8ˤ5M+XIxf.AK)L˙5'd"e4qHT5@;~yƺ08axЪcܽ`3A`Rc}q gĆiÁKu/xul*dm~ѩR0tT3d%ۺyvm pN׮K˫6㩦[Z#Qw趫[:{j`}*m&) 0gFJm,@W(zRvzpCrĄNZIJ~<8Y9mu3 LdX\ekoHn %`/: dJaD-{GGS;ʃ{{KdE֜5:>SQ2Ɯ#au`L9$%H`U̲E,Lf@ANgУߛZat _`$aN}Z;VV^vqIq%a SM惬 YdHoYMRMZIMRMeHѼ ?^CVg9& ~#ɍ}Dl~_`W"fJ <cxܗi[yXoCO|}P(}CwOO2GFc^~τ\hjekHsss ssgmK#W(̂F3S q>*/q/) \9hes#/#C+6F"AjXQr.U&Śܷgzm}դ8ѩ0F>?M۸|0pftd.2ʃ(!ji4h턈'7^nBL3[׫~c33 +5kuE8T"QKwH 0oj}[dqQhx`Pf#e#9%ϘL$21,o g, i 1{.@#c#yYH>8) N'"QPP:ڨxgbbo.?&Lp#嬉nn UWW}@)qDzC+30honP99edQ9neO9EqS&X-0 8. KCFcjjX5b gcB`(ff&o-L]Ta tRJob3~рp.H,i TmPn7s )AoQABі/3saRH8jD WhGaż.,B-:',b3Ɓk1ЯU[\몝P˛Q<DfX72:>8תʸ=9['!nҊ]?:{S˄07)+Ae04H=ff縔L4Mi䖨yvv/g _8SV@ڛkPEp_'sd0"Yeƒ*cDbڄ) ;r2[@ͳ'hD]uJ=%WxcV,N`Ȫdi~5?C%v=}5|0дG9%ZC`f*XPQLTVRjFvAS*;YQ+hin&Yi'o_3(ΞF`S]:<߲5{ s++Mt4e]˫iǦE(()%Cd˄`Q9;Ԓ%?|R`*|h̄2,C@p:wmz9X[Ha ʵzl:Ʀ~[o,OML0LK+*ƈ"a)_>rg-MCh!o)*+P]݁@$F&8&l3'?t' cjޓ/6!600n0UiUes‹=[qMh(Tc3t+2@<*V -+܈UKK J; ,f}Nv E쀞y z(8(`00j~Nu W%ϚZH$uߢcpmGb[x!ف:XHxB*1Tr6|K,\2E|R'c೰=[p{-½q636޿6O:[FiTDV񉭇GP\bDam qJAvV:eMGw|w˫fI-HegƍoKrJ1fkiQgK y`6PX]@^'U"$EJr~S3!-@H0|S󙛇 3~ = ߼ruuGI=ڃ9 }erJE726Gkkަ%-h2É v'30ċ}<~vFdٌp[Y R >0L|2`M鲊b+tۚն{kJB%**W|~=x|fMkS_ffD[]M%Kp%$ѭ6Xt5q6tLsl~մٯc2b`(`LIlݢcƒ]Y]T$ ϕ@Jq FV/0J#bHPoqIѽ^=pqqA!|n> o˫aouU'c1IQ~ɝPvǪLM:oGGRM'{Loal&J0Jk)d6,:KЧ9}af}M% I1Ktx%3`&dL0.0|?*Zct v7n4)^ $a!.esXV36#kUWTmqJBݪӓ`,+{͝ˎn[IB>2+&_:ӟlAȗf ) oߥ l3d8O4t!abMHٻEFw%e}'7nlcbmlڭ>= -á:֫ SqVX3ǶrӮ[s!ypo F og`sc3AefTQrַ}z~ OX&*@F`2:V axpngNWËbj<.+ 6N:4eHzYøU; 1c0~7Y߿b6P(E!xe$0bF =[0܄`fE< _sgNrcm1Rb2vo ~5WqjoWLuLX#a ȴǶ_Cq21@Fs+p]}[kn^l}zԎ\9TC2 0hesՔt 1/172G_m1+9. wKK}oOfmfKB7 &,Q9<9}>"nsI^;<12]\ R!AZqVG7EH# '?GxC pt '@gl7sg~ɕi`f(l7?TaY,~e39=]M_3ZRV>7MSzT6ĀQn`2nNȟ-r1~* >v޿2kl5f~5><)f[weWU #X*{Flg>?6&\e+,6iC)0 t\M%19t 3Lz<&^B5U[D[o /R u5׍?nj S'^ҋ*U?jmZmY.yAxO% —GpDoX"|`^~Jnt4^ dCI;{fǣs R\~VMқdGu;R(v =NF%LHeB1(%$/-eN}̲_q{2͒QQ_sR+ }0 Ury,)) 9uJDf S*ͣCndG *3 oNw[:[hiᔠƒX*=|!1sSӬiFf4I He39]X6e JlҲ*pGvܱsO%yRv @}m%S(Ar| )Bpvp90wzn|#7Ktv}fWjXc/^}?_iIL_O>|KB& tZ`&di N I&}F#Vdz0 /=:7{y6""֤"iϵ5Bic٣Wg@d#9r9XےYv;rnYs$X J.l XX\u}mC´{gW?#T1G)sceCJPej٤d[LIY2x9,!lѲLIA_s)te3gL7s:iH|hP Y08*Sȵ㈜߀kvڮ-ZSKDqTLLio聐OPZ,,=`^lB6UyegHy)0$hx@ РQ5$UP[-`Dn~9 Y``48磐KzAokmVI^|Xp[liC vf\[32nFHE3/eb.pi^-vu zpڴSyH pP5UM UK ,#Q읢ak|z#$u4.L2 5ꦷ[05u7 T׊]&S*ssL|YQfL2K1uKj 4ZyUld,:"ן^[RTqvKC ܽmf{BEL*5ka593-/أ~>Uz0 S_=ݦAeUu@tl{ Neq B/0k\?+EvkV̌AX+(_Ս}WފCk!H//֤pnJш̑żaƥJR d P~n2n'Cc2qᵙk781Y`XG#}mA12[(LK6!(UVxyYųcx”L\k'x#RMy63_-ݻU٤ *ˈԈʄD]?!z NWdHPk$S{?5wX.!r%9Et<|efQP*~f13s]`J7Zb #?L3q뭥+ 8M.0`ۖ]da;`ZhV;r7&RQ':(5XFұr}mtĉ*]۬*8,/rG­$,rySǯ{ vwazj`@Ԥ)d8'-Z\ h7X?dO鲨-|(~Xèw2JS̀ ̄J3Vē{)f'Oض4B`@k >NAc@׉;k6^i֘jӲHX^c~R$ _:]&THI2]3fQ_"+03j+v@3w5I] 7U\l"i8״b]]q-vn(A&i\RpxYy51zW\>|Ս] X!2>Tl JY!0z.,>jF iMI?qC`1 t{ ~~Ё=5R]eVqaaNN.(BXWvte }N,㸴33 `h q~~Z`T&BmiHw/IphQwo׃qNFQaDW`xf$Jcۃ&/3 ?c#E=2'SMY0wRJ'TtPq4ƃ;N`&}}Xh YaqUEqk"@z4aE s{|ocNDXl0Tg  ظf^3Jkk33ďjVnQkUKx]fIwwޜ?[]q.N9wd)| [jcp7LճeVNYgcOU\;<<,7G-XevlI[t2> fu##Pfc_[ Vp1+~ߑQ_u:GhKd.&/c>WD,.f"9P$~RM?eb Pezo2d.Z:zZ,6LPLc3A_1͛o[< ?]0 1y̻G#%iݝ1<@SKѶj.zw./tbƳ`3OOm-]A`&[ovbSC|G~BpgM5'̨5 YlpO ܤRљ(uM 8JZIRÝŘ!*0D_5 |1.e:NpYpNF[V_.dׄ'*! P,~tmТ7Fua a8pzK3wvG.ͪXGSLTZʿ]f@B *$מ>5߱NadY:llՄSux6!L)֮`|.) K\Nlgv~?/u9Ow3*ȵ_{kP+"\qNcF$"WHzyP0=cK唲&@ZJR,o.n6'vuKԓ$GW+L2kS;k6fMď2`f 9U&/_;!_+H~bTq'NU9Te^~yA^c=:{9 _3vK S@L/%kB+#K xxly  dWd='XF]g(p c1Gƴܫ#C2M&S'3eJQ2rkc~gH~{NeЧ! uh[!3o~>vٱolLۤlw {/ƻ?{w#p|ha"Y\<7B'fge%w ;ߧ]~)k[}xǽ9KaXَxkhq"$P8Z4u4[1j-$WӬ2ءm%axuK;Tʃ20U~ࢠsVvPeVv+}p7YZ"% n@XN+ _*E ~~VvSv#=1e`V,,QKLOxniٌ0>63i>GCfd!]$e@p~^_{̡IW k>#ϙЩOk,1a:6|G'\Z< ׁ1n@b8wճGLn`(ɓ$cas, *S=9>vKok}'Ɏo°P]=N^ QwK{fv1c7/pA0\CXTuNQ㺛qc'N[;28$& G43n;HR!<p9i?u9"s]FS< 9Tx۾,T߰ܢfg7"LhXGۮm+4do+>u-؇{,lc/[?UZdriݶ28Ct1ymB *]9ˢ ! cnRrwbc+0YM90 r,3oxS4Uzp# g~6)f:@0p@mZض4걱. y,^\sN;+xnֹuer]LZ9/_bi@ȗk,~adUgK?6&θVS$)`'}dsBel/\똌1|T;F" ۖ saeKQm -yLsO~'hiu'0<@SB7E*YudO@)h,-EqS w£}p#3M,A?9Ҵ9`( ( sa.1h7]<l+7 <>|X_…3Р!-jہuuxB)´ļ*vKٌ̥U֩yMT8LsP`elح*FIj݁ք P648@ ;К^*%)b!M[l|R>;kY&>*}Dw4wRzu04!HcnpKAeB0g(NlJ|/5Șau2fe߉.% شxmΡ ,[O!YB.ƽ@`?ˋ.[R*z9 p"oEKG $k_;5M@|k戺.l}jL_32KpCz-85;kpqYogww؄R9%Wln<0R6JqמteQ+ UcNrWRnO sۀd#$+ mO3b 's1F#Xs%Ej "@~z o2YR_+Xlrp{5ӑض43ha]pwmwwHI0uKKaI,1vX59+g2@{u5zvE̾n4e4sqp4a7`ujZvd1Wzo rx`pr w4b)/X.R1sAH"b^vUMbwR};#Se6j .'th Ւt3\0`rTh'4bC~,҆Yy)o[1`3 5S^2Ϳ})ga:"-'ĈdQUGrTڭ{f` w 0OfJa@sI/9l\|ڑUXsb\Fa.t8=px|=x1|r'z#*1CcȬB!5ꀷj 7 QO(4`|2 7.`TH:8ۧ1dKK᭍b0\5DYs_CK>x0NF.a$tޭ,lj*68po"Zm :\` ~ӻs]iù։_+u GeˍAeBՔ*2/3ZFAZk=ғ w`Nbc&>=MW_m .gnKWd:$4 6{Oxr9,f:Jdϗ?~9}iot!sBN=0&Zax$L-2@5Xo-0s3~?0d6s2 V:Ir'ǿ TƦj iټSG<0h>ꗃe"htma*k\\a{Rғ't膢Z UZ"ˆBlX^L7^ݚikk*D`R'xz jEqTpiq3b "f}N`ei=bqx#c~ =jMV6QMq裂݋KĖ'^kG 84vy㝯,JoͻgU٘VzݾSЫݚoo#΍n0~DZgĨ' ['onOxyTy.hxpGU%(-#IH[9FB26`6SMV9ښ _VktͅXVB. [\R vcU8vk)3sK"tv3m 6Z*~`7,Ot._' n}g0R/r3q}ׅc\l0LѸM~ (_ Yyí)k1Nkf" +θæ!v1_uyy+ה` 0+ȦD1D'Yn GήcZ'I7[0k G z3WG= \AZkqX? /Gx'PWygؙ8fܯl+]uS gԓ@Qv*E*BKM/wc#f-CnFccUrAIKGrooHTD V۲|,}wMq HsŢX^VJ~<8\ڙ3<@`ԫtc}I2[~\1I<6WjbcsXƷnnzc 4̍{2tN&s8di5,}@oP`B^kBl֮c2 ;,@o[P7206CZ zg$`},`XGnn *[aX֝=5r)4e˔uۘߪ`W*#3`PURNDRYR"y2Fb|yc6)Bwi+,QlΩ]&f6ȵcf"K)u8:ܚ+aXtm2Q[ йVhq9޸-P'EJG_DvjBFe*APG3nbwЎ~[cr2wyʆ`A-WXg( MPeCQGplxS.߳o,_.*cSQNg!c.zE;'qZ~϶0`lۛg#gΰ#$||Q.ȂWoO G>33f?3 .D1RGçZN(M7#r+k["j-4j% ;Vyd}jrcPä@_364PYfh Utu1-l"h:\:+2Do6Uܢ$8y;liOܗ{n9O;3[FWQC26`6S9M%!0Uh..ec} +n^VzZ*-.Dc\Pew@K׳w15n%ѼD7\P]PXPɻ ,QNKskoNPv|՘Ԥ QXlf&Lj֤gܢ>/շ/H]԰h2!a~q!ɢR1=wנkSä3_8Ai T,e'M%YW]j-,kxB܋Ȥ!v0ia#LeZěxK^+ҵ%ѱ|펬EA*P?< .?$Zzf-lqIuEp)V6QaG;ܦKbӧkc=jpb5yu0O2$#5? .sXX*_T.CT&K%Te5Y`n! J5Mņ5;tȥ .lz|/6~0fUW̉ ܀x UMjj4X+|ܢtr2a𳕧&"<#W %3?j*ؒ!K/l#QKyY˶&%=e0a7[o}|I#_* se{G;Ck%6up| lb:߽]]Mۯ]0ۦj6f07rۘP%V@QSW.OOlc7ܖ. Uя}uT?*cf- Uw/Z@`4%^ .o~3QWs RY( 8xBܭY3 쾛CoRT$dHZ.Q=%z [ˬl \oZ~_ۃfߑ j1!o u0CPѓcMp4tigӽsL, 1QC26Y`~s*.cܛ$ٖ]:,`*` 1S;!ksY4'RЭfs-=Vuq1$ G᳇/_Bs;0aߡ!Gw+4[EF^zk΅6 h IpӌMf{5)-eO^ Lܘq(=.l5[\d[}1n+#⪣k.3n Sa|'9I0}mZ:[`<s6tEVrǁ(EEѾ6U @|F(v2_#PAVvؘ\uDklݗV_\{/Tf6Zv+3/$GWaHZ`vw`zffPc }Sm}GR^΢rMk 9dzz̦ћQ Bdz'P;vǴG[ p7/8Zbq__',8JsOd d6Qfz+Jx3x!dT&)HHl cj)8.jL@0%)akC(5Aấ*KrRba1KrS!,cG*"˯%5`@98xuN.X;=]W]W̓튢`$?2MxYm"`=1 EˡGW1AR{J(T JwH*#n0/EU:ܜ`*M:g@ Z,S *gy7k7mbۯ8d|ƣGcE'%ˉzfijj@5% y:Ѷvɵ6fieeu32&=_=qC ̒ (g`D2 * 2bilFE?>:mP4aIHzk 0Zߎ|"i2PF; y`) d;MG,c$õA;̚tau5a~V1L3Njt.Meְ ҡ!ctUYX鲊ZBdNns?ia\ Q*7^~ FARu1/ɿͫIT̘ Bu5 u#N(Jƭ?lq&ɕ OMUf;ϰvGt!]ޛʟbb wdųd$OϵeQCH) ,0WVfBbF!c3xV" A!pPa܍J-{*݋˯[ttj=u5ڛc3ay僬& {|^6fdҔl"[=CTpoTO) *e 0^K+@s.~XQr#j?Nt괅s?n 9z\-%H~ZLiIi)L-zt2L Da!ɶƭ,E?0-F|(0+ GH)(DhfrA۬N:Fؾχ;&0?SJS~Ln<[oow+z>h6}Fnķ12!tN@4/ϞMNo¶s=Y$LX/CW`&K*UZZwfpIfz\Lvug'K2CB):1:.AμC#8D_jdk˹ ┺"F t20vա[H),̄t9wӸ 7[mgV&Z^=fӮusOGޘcӅM=Pο MsS+=n +TϯM$HEkҫ+Ξ3J`R ʵ~sдXgGW+s[$b3hE\!GgHfܴY!05mP$0۞]׾4SMLp@C* 2amqKw$|@@+.-X }Ծ$tmt1Y()oh[Kuu:,\=Д+"0cWqS>w=COR/ PbQs;tmZt׮cےYP͍!J2h6lwqwUәG$v#Y<5,c̣E2RH& J:鐵edLfkABϯ̸%ʖI&@#dywxׁ|Vy9^TW VtX. S32SH[=F7va I62;woSO7 LܓLZ"Ji N{D˞M:N:h)@7Ȟ p "! Aق "[("P({#mfy\Җr~} }Sf}I5gi<&ڳ#{u\:vqqOqx{t羡C{jli0c]-3s3K rJ[7ߟ *~YNzKQf&u߁-Vf˕E*9[4W$3ᒐsw/)4[\.+)*?M F:Hւ]uw08;[?_Iv?¡]H~\Pf,,tb=r,#ш1[fsT&}U]P s44+8g >-/51AƤ2fs3`u6bh36>M ֯ɹ.O5$0wx/=f/\JdԮ+-p YպB|OVz1%} WUyܤûo2.hßwcAYW%W,v48.> OiiN+GSXc$쐌[l:ezfV& Bg9{Z\7xՊ1p=\?yzd@)z)=v@rB/&*,aiͧ'uhz/N NDOtNl7}!Ko>㯝 |w>~ݽ{LX)Cw'7ە-שڒ0V%2'Ռwz%˯(S]oTq72Xl ǁݮ:KUKbRH}Tm4aj(#'I"ŬkH49!5\"`/*?!6ғp )5aֺڼ5qaV#hW/0vG; е4p`!U w—}_}4b~\d?1V)R M2`حK|RjHVghJ^X$Tq?Ҡ%/qUh&W348HGr ݪ> BK-钒m7Vzy9( zn"t7)5/lT)PNK@ŹMzM՜}&\Ń\2&f>E*u|t/7A/dz6_X(`JtUgWm ZO<=qk\y|QtxWǾ9I=7VnzfC(ܸ`-'SG40+Wz)RoƬ5,70#]gӭ拽 <9$! Feŧ(g8ۣER\6^6% 4y cp0C 9W00Yk,fSv(-hh:Γۭ:v}֣;YjfTYrA[Sh&5X/Fff >5^< FZE[~B{кBBG(7 %Gw@u%(b_K%` a3.tXe3(]S.g1Ŭ*B-*R5 -16ܱ1mt0Q"PiXPpc IhڠS;sS9p41[ޡn{6]|g=[NOp7㱨0Nլ5zgS$lT?& Lcc0 aI"mT4XDI ~UqS#=p 僗y2}GGU nKQju'NZؿO߉鋡ckFL9,N1}|[aW挓rSkizߗqzr}!٣fl#⣋\t<( Qp 2g*]Fh2Aee'0:\1̥Cƶ~@VT]d  ̕SL|)miW3ӌjXnqwrfgWߣ\)8B-f 4&۶14dTjo\N?W,bc3 6]FF0`IB!gR֖ɤ_S34ye!r3lIώY4~J6o8},v3& ^yR4tz bGrđs𞱘M{UZ:%oM+ypfecoK`F`V;}͜Aw wDR}rCm`$7DknN3 4#ۍ9R޺WEWgλݸc09VU8I`;מh".RqD7_7)ɥLD+Z4#xnQFK'K/ aRb/,ݱbԤ0åJwԀ%F`E\~0Q\|P]9שs,Kux`GltK-\˄gl>R8!OEvid\8=݉?~F8sZîMWNjl\2n{ySDx/m5־Y;ʸqD17/#;貼!xmkn}7( SId\=%_A&?y k߿֘B9ȌՊ@3Y"cVYHn"N3f)hՓ&=op6"gq/#)>`Ja" d%q0k\/W{oqlMF=pkL)G.i;&%l63xa47]~||av+3zH\ ,Z9BwYc={~A̘f2.H/l7̸]pI"Isݨř{{g~;-ZyL5MT\x@Wa*_f*R VbqP6 ld.0c0֝$,{rՇ3I71UP5쿫9>h)_^;fK}9{Q\:L-e!\dE`(q%xo/,i g30K?U0\`,鯆$8fo,=usHnP#9}EL,zcmw]x̆r))<ɤAEL,h^yt/'NO6k~6&:E#11ۓo+ZF>;-`nʌMD<1'NvXr NV#y2ʔ, ,G134/y}~U9ug99pnV`~H1Rv'f+͢`-_=Km5E]ϗ!%ڄ=LA Z/w" 69{ 3rр)CZ7n--|xX ͨ<3̩)gº)v07uF5^2#Y<Y9!*˶lsU*`^^~{#F?ͷ%Nڰ-97̘i݁ŬX3qⶣ5sP"ggfOŪ 8PҮbg~̕]lBɏc͛+ZdOLbH$4]:+V0MM;r&`a| YǏO c_vK32ʀp>qj>kdWvc)?L5O?j+I4IX W⦅6vAMoٳ >G9->Rݳ͂c!YORgos&ƙ~PΞܜZZTK/yT%K!6:h?**WN%ƶf8E)RuLU$*r~Gh/?sת4 Ҵp?G+}bRF*}:Axc.)4iK~'}+Ϗ]EsTDߢh/) g+zusOp^d0<*v072U?E3yIFh6fYα8ȉ@n(~r^P̜3z7OCs j_vLwjJ6zy`-`3 q{6 ̘lm;3rR{ܼ ww4Mm°1Z6w\\gxӾ'[_4ͼCyU:3|~F׉mW|ִ `dkj7Q t;k0D༠爑+/OY[bu/@iHjU8ž'on|]rǤֶ *vvLar,B2~HŌYP`l)L42hyIN]J{vx_cfQDG ~ ?y;g%xYDc`Z FjISMg@R$ "쨌l_0cW40'G\i"h:`.ftw,:>iQ0u#;r")d:/M6'/dGG +臥'x%\EAn)<·ۢL[D0[ U9y_J3x]+ Pi_rb$9{t+MpDU"# :/]N:08"ak^q6TF`]nP$/L}wn*CVav07/#yŨ#hL.k;bq5"Tk8hCwG^<^mw? _oLD6f;Սf<8/b&XbnގW&vhKP&)4+UtpL ]_݇wn){#90Ep.Zґ*@P_džSc u4?C.sVk}|.Sͨ2=#Tw#cx 6jfM^CEo{ΉJHW}r}8MnsInxJr%t`N>4)8$ | DCD5dY-+}P_2^hofgZ@򿱺`#{e]IBs.]*7qk.TKƙAbv07/#w~`gge@M&B[\nɺs%7(n%JM1/&aw:Uc B%4 $Xh-+"_,#\3uw[Š2ڲ \8VN?fS¿>3ds{N!m$]:9س^0c.zr }ɖ]sۢ:z:0 Y*1tTG\(`b:Z0)t0`E %` wI pvޙdJ?< k;yȓפ# 5}˟q-ʏly*72Mgeۯ VQ4 ^ܼ|_-)/$?.rn\ j AEϸi}kKfd3Fb3_ AV o(€#OCbb߮D牜QQl9&08^$ށRǦ/[rO(ݐ~Neuc$A;<B[q/ QZA_ 0;+[R@ UNX 80XJAJs *d鶀T~^<6~|q`qf=9 {/7 ;- = 葖^H{ݐv(VK@ !2U~)aŖ>sh]#:z9ECi_p`-tƍ(#Nefl^ظF0FhgC K/a锱ΘN l,D;T5@6οU%>l4DF__ݖDըl`Ҷ|u~֢~e gRatn04#Y[*HFh`p1⚅ط՛}$W[o*h 7^xqKiH9][8y R!Q NI4I?ǁm.:ZrǐcoMgx4 ]_xh\ xP =m6x|J2ZT~Hƚ*qv\9 C;=ac< cWˢ׍dF??C=|t ,7[Ӫu]VcT;A:1$ *#Ͷ2FcFSْ5[5^VQ֨u(.`0212lF4"p|A{.N]SծH%p@su(9,KVNM.SCD0c] XpPal-R~f\@o2/ ZDtUbT#٢e!·s"`̶M(g IFQ!`KIߔ`A.ɸjB( xۅC\]KWfXWfoe2|yl-V#k91+UIN$!]qY㏗l L'5a( Xٰ,Hˀ>ZU9i0_^AfS)d(Z0ř[ KU@j+"j!yH(oǨ:X5oc^κQp\^^j"YP?ddmL%je^L8=r9c}9bOT3 ~bgG|-v߸}"XEdp7)_ E,"T&L,1_5*cus=Rwч-'0`m9ͻd'{Vޚa܎ pC$\G%+P1kђukPr,ݓ(KIm*%dREw= 3zR%^b7n3rjgmq/UJ#X|KLJ1y kMQ-68F x-T;֠ׄ1zq^ fss2rTAx佘us1bbЬԣMkQLi`@pW7rZٱYw 2_Sr-9iuz:I2upTFFf 0BeE? ;7/yD^ QfAոrhcAnc1hRRK&y'}i9H-Twlb4ږFn`&6;RZRqڳANٟfb{J`S(h(l̟ xlkGr H`\H8#TҶ9ysи,K@SX-;bv +ocep겯`'6g~=^P8xT~ʒSXY*#`50׸ÌT戰gľ%KrXs?[o.~wvvzZ -]I],4p/p8EѺ`D0ס~ċ`if0сU%?V4%^WNb/]}`*8,Љc ^$ ?۟\ZQَd5 YrmƲΰ=]9 ̃9]>i$% wxHXзcx$4:{@j< Mbיq$#$*[BY৤m6uD8Q*XQpg9nc0R2}̥C _B߽ҒH iԫCX:l ܵt Qr5H@1k h'l`Lqx۩\7kKA˿ (t݈=e$0x$O"g^ķ)»ʸt|?>Y>ZlYV]̟MRw L|X[ZlʸYd3,BHL`ʔ Q TGspaU*k}*%Jnee)44phr(jr_=cp _UlI(YB45XsgT+dN$Tcَ) X'^.<ƻVaϑM s$0;_KѸfeR[h Oyԗl6i %~J٩>~"Jy3c]nL*Xvc^\l]QB=j`fSG9}ޑL4u=~ZTz3r*gN/v}O,B"Йz 0})YC,VfVF5pG謺Q`]fn^2aKk3 ,4N_wlWO 9020PB"vq{030;]CѸǏH`@MVT͚#4"L:y: Mz$1#Ln~^zjkoAC:WS2=(*. {LЊ3YPN)T>9=_[L+p\~`JJUj-Ϟxlҥ;Vdgtf7WgXXo+g⺀zT"F7(ڎO2lܹ1\'a6k3(ɩk-vL4k G$DC.}A h0fi-0ʘ7LY}Vw2 Zd3PjH\gcV|ߥ;KElkʫ|2G-zj (s/*+VJ/_B:P|Cp9%|9?\;v*PT*uye".77JE}Lڛt)ܨC!Xf;FszHFF !'6 xs l3sX} DjG$N$zoO:ΊrI; {I`~sE3.s`]t!U1)u/LxSd"wYօQxxFNG©~X:fj [FH0uGh5Dз :3-iy#'#> O+LkBL憠2ָdjRTnjHFFIKf ئy셭0!B+F07Ifc\gGTq^R y[s1l3*g5.uWw0)vg%(cbPfA̢`a%Ju/~0P <]<_,T&*TQq6 EK /p`닙1/ ?_{#hm;;bO񁲸xndKf`9=Zx\42x'Ko_Tjf1m ﹣ L2mTdxR2F-g{1`̒D|<"❘q0DN-Y#ͅv$h$l j1Tƪ>hf806783p8].<>qiD8o 8[u7,WC'p.kYl  yJ&YwjyQBFiIG:2%x!Ei-xBP|k8M !e<$-xnbVIC'n*\ sFo69O5$oDV*wo$R=_s/@w Ўèl^i"_~Gvtx=4z)Tƚ$vBru1 KX1VU'=ϋ$#I47_0$f `FS"`OǟތWTѯw$Vywh[~]:lPVQ,pYvRfS q+,y]pP\|Y'ZK*`g1nkYFb3V0 i@c޾w3Ǡ6R73gѭBtiɏbp%ޣ?j@u}xWQqx((SEt@ZrZ)DeGTٵh0?#u3y'_h\1w.0Ҽyj/ 7j6^ י; 0iӣ]@ [_*,j9EYegd,_\4 pr[$a^r<-v,ܬ^7)GAgl}qôןf P3 ~n^wOXe2Ɨjg{{-_z!"8lbnj'~AqA&:4 V=hp|Zp?A~h,tv*?5#*cf`rԝ#R۽ّ\E6cF<\=„ڀ%,?{O[(`m_wnK_PYc&JE~Q-Jt^n"}LF™*[LV[n Gb]5~cQ񧖺+[:q)R1Q۔o"PBe]EW;|Fڜ3X~'df408pA7Մ\=.JL'LlG3 ̜cT̪pd֘G3HƭlF!x<E*așc (J(W ߌ\܄`ļ.wt-Wj瞚cP{Ą7w4sPtv9bJεTSѲA^-|KhwVHeS *9 Jľjt>}'-CIvUd`':L > g)R11H&>MM w m$0:Q0;= #g7kl6OkƌH}>RaY h&)YZ~ۤw9pe"emsYs=Rtv9bm80x bv;碿U==bCc$GnI$ ._Ө^2F=9~V#ù>Þ& f_qַ+@Z[S N6JtQ5DjWy,twZ^a2\eGo n*C )~bZe;`/EclssG2frMV76c*@ 0_+7rԋ7 WC9˻uM ѳ+"LF z::93P?.׽!LVYj]ߺpZҍU ' s=rˎ2{S4֍!v07'/1;m3lLrPD4N7)-)_1٩Me(w, 2P.,{ 0Z(ϝ~fFI3FPVAfyDs;]{BiCe|xc89Q!TڕE<o|f:Q߸w3y4!*W6$%W_Os0<,Mai"`S1c;SzyE07*۫P1)%!G@YhH{| (.ֳ ,Ck.p`SfN*03\`L4;'om:T319]6 ̘qٕUA[,& V̺<vg\TeLd1A.x}٪s2wWp{rg="65JWf: 훌+󘱚@Tn|#Y#1kf,fs ckvq<]c$tO$ Io6cƥ*sQ%ꢒìM6uf[ƳE6fCҪ ?"M_U]| `6Ko|07)*fv*0߰s=vϗʍd5()LL+"J/:$hR?1#]fz-nyu48k> ߦ33 LefүBsک\[{FB(fs\# `b?O}{ZAbUiu/jdS5܉fi%MmJ/?r1yyvvpV/-Uf|$τu`󳃹Pddw7|# L`n.0&36{y/_$x4ufۖM7yN&*"61?Vs'Qh(,E5fL 10?O@^Lf Rg9 tlrs4\=߲R|yraWskRlXsکV7<[sQnQ2QxU碿r`T^E~zI:SgJB-n;Ozϼ6P;4 ?Ĺ4e^EW2/`Ci]_M9"C[alsv*75#v߹\Of.Ujޤ9/*V<E3 cy.H\x[~ *b=/1cI]ςSls3&㊲HmA^vӌlphּ'+fkpl0_o >i#*S4*dYFڨ* (6[H`.@fw`n83_kk0۩ܼVx6w232nﱤKTrO,Y)'2#8k>#RG%aoRۙCOQ(;R߄::9A_9;͌\& w6*a7y}:/3˲us$#9}[҅1;Ȁ' r=A%TnPf$c|vTz Xe8f\`Vߨ!ߐY3i@chJvy, ~w dNp3%7U,Vq9*Z1hvUDe`ʭ/;~Ԗɐ9h8]4\N&k$0}Cf`nnV`nhʸو.Q|cwD gש%vL3 :H8?vJF=SK`պc: ,ͨQrf]S^YNIJ5yG])]y4u0OƓUa(Rh$1%}[2Nk$0mCxeq$n;)qc}kkM,`42Y *ib_Qs)4M1خpJy*a=[gHwHB?U8T6 f$4o~phVS8|1@xE)RQ0)Pَd #9k*0{|`3qcsu/-ߌoUFQ6idö^+=E'8S嗙&\q?]&`#p ,G=12:o pi x)Wr]]DȁU )ZUR E (-,v*S YkB){.a v9ٳNިEQns9j;o!.3b`uPs2nk8zIiu ʔ@Vd0*rFa0Rh`Dq+Ei( ^H_lP%JQ8ݔe;k43s`nn,`nj f;m.~' L+uI]C)!wpESuꀡIꎷ @`r_qn`pm |I.*M;)5ٞWK ddmLJX%SǵIR l!0sPOb56q0al@ 2֙0A1Y S$FLB4~ĸp;wWn|>7;fOǴEQezut'8uc$OҩlkK}B:)5e0۩\[#yOWS4ncRqCM v*[lF`fdL IBί: @M< !2Q!Tˆmc`)?L\|9ቡ̦) q=NYbGR p !ݲ# vκNH`~>'07$lTlf\*|ۤ9+3U~>@#Dt/=h%jdx=( bø}arBMڼ )Q P ,`F f%WRَ: ̏? hSX*ʿk}nM#-0`( UtGu?v{%'Hsgnp /./Lr )o>W ܷ%4`i4Nb;wvf׺+FY!K(iؒ"\l IPg&0ۧf;_6s6#wYJ͖!8ZCKas1qAxkDTuh#u۪eNfX߆wuΎWBZNH`~A+a!ºp, X}W~}Ud*{̬"n쮓<+OuNEH#yDH<,.*K3Ula_n5ϝ7{4\nAMRkr\k>|ZrpwǷ2:O |qn[6XaFÿ6 M/f6UBs3C]YjsdLcMr>:{DӿbtjTuT=,J=^w< 3_( Q* ]-J6ȗJ%, 3UvKGaT?k-b5QLja?9.qxf,"7u澲0._.4 +a^)JC(+6UsJzǓB<;XT#$:.!w_kby:[?= g=fiPse\`Q+cmUf>Y2Ȩc&EXDx=7U^V?8et{(̣OE.̶baf8ƅ͑1q)G.q(UcyC0w>d`KTFtalQya UfSLϳTJSD+!dw_W@UQR,>̬A (c^&̢qfTYu ]i>q57ĞYmUkoyē0S吢 FaY.al*N*I~9xgˉO$>UxrDZY!O?m^!̢fTYWYmֽ<0} *:Ngt}7Xw0S YFa}5KaMYyֆ9:.Ayw}š.qҕ.'V5;>} ̞ 3taљXÙDC- XxXu1G:yK_ٰI9XUږ~\$V04(w%̢х9)Ay ɓ6+aN}K$+ :>`ZS+T^xzz3}nn0UeVN+ЅùFaka],hـx+4K=S||׵3|P'|Y4"ىm~'?QᾝJ7&oן.k=#p~ϔnٔ*~Z.s~QrHy} FagWi0:v(lctTSv}>imK0K0,L6 ciwmwk9ْKGFI2G w 3F,v٣ǝк6a:T3U l.+d3]w0 h|ٖ[=&Y'Yn0}eLĚ%х'e5+"XG?O3 [hsFbmIv'h]AtaFaVc a0# Py/g6.o>bpGK1[O~f H;洚>qF*Ӟ+Oa~0 '{̶]F$@ϳ=.Ht{;yv,a;Hm.lvxݙ22^RL )$6`@X nj<^Y;\;vlqi&̄;[C,4ta:(Swzf˒s)]N@f+6$ Mzl@-aTioMaVf_Q7TYPxcO¼Q0?'gAll1٧Q#Ik;+0/e[ a_uI#f&`a_CDPReD/pap)kQœaGfk!̇20\BBCx0!Xa38 L"~7TzX,2`A25=0 􀙇 `F+CaXXe X5Z 4f8Иbz0 Ϻ@c(3B f,0`!YP33w;.deU-[sSzxb5w*ibuf=j~5a z~dzͱ*Soo"SkY)7Ǽjxu'WʐJRg;GZߺ޲ {NqTYcM,"M ]\T@vȚ0 w.ɔ͜Za6.U)6jTH۾_Rӛk , -~aX U?^?.x<';BMCH ݘތ;Wݽ`!"u6ڛ)|jtUn]/iS%/ױǬƛ5aOv8.W^s~KYs#T=`Qt1*k&1rzK?ۙ^ ̂|,fXJr+ޣwS NJp)x9™^fATPL8M :@؀bzB f,0SAf@{k= f@GwFAf@z\j~Jnۉ߫IxF'0Є_$3)f;l=pKX aġ}Yե:8}YBy}ݜ?0 ĺw3w)g3 *]#aJ𶽠;#Ϲ͇+"̀8܆Yju{;ߍV^v^G "XaB3B f,0`! !XaB3B f,0`! !XaB3XKTTTDD٣ ..fy\PP_^^~eO=znpm~ /Bbb\VVfҧ iWM5{8Tǚ/~eK^T7GOvX28~hģi)q{^=wܲryؒ?f*990?III:~e-v~|ңGcǎ-[0x>umkîy¿~4'- [/\\P0᝴Vʎ7]KŦKA,YۧIVm,6Κ2?>@xxxii 3'aKbJrJSR캟V^!&XrkBjNێ&:3kRi !JӚ)I-Ct4i'RۯzgZ񟤾4PI.ˎgm6 RRR}Y[ lZ[_Lz?R?dܯ'eƶH杞={\0x>pdRf W1Sڸ&0>1h+x)+MV? / YYYC=fKv+ ˩ ofwS~E{n#{GEEEW& ّ۱L6=E l;/ʕ3.̺ K3LQk¿^fܸ={>5Ӟy7+ڻ7OZ븲{E_AΝ+ǥ[=d?֦K͓ƹhm˶Vv*eyǕ|xuuuNY}Ĉf֟#Gl޼0x>J)? gQ0O:UsYYكD9[n% w9 -I12{8Zώ=[|A'O|M7;vSRRÇwA@>;gree]YY#F=L;r䈻!`-F`߾}ɒ%]yiii. CZ"""E`566^pw0`! !XaB3B f,0`! !X0wym Y:fQg9IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/pcolor.png0000666000000000000000000013772000000000000016317 0ustar00PNG  IHDRSIDATx յOu#80Ĉ;Aql_|//y&/&bרAM1& cu}ꩩ{VU̜/֭[4so9||3f X,Ūf#G~_d2mo&`^3m$Y,t?0s1'OX,I5| /qv}iӦرbXT={;wn˷oϊbX,taÆ+VؿK$W^fIN;y6l]wU\MX,Z544Zj=P𮹹Y5;s܀_u<8y'+e!\BmW΁~jVA޾}IFywbX,U}رc3LccםB=•wy67f37w`drNa4*_8I&r]o}{>uOjѭ`$\x{٬͛.]o|'mGaX,VU}}SSS]v}wkjj<ǎ߸qH\ss,t +4 *7;N.˻`{o'q% ŋRdҤI'On}ǎ|./WUUE͝;WX,Mg F([ٳ`urͅpl~-$c-O?C9dndInĈlu5k~_l۶:,t8k1?w܁{+O6] ~.>Ͼ{|ݷſ{hoL;"-&L1c@r(y!w_oۥKX,siŊc‹:T>"~$s'n.N;Lߞiд'q%{+e\}ߨ)|堣w3E]f\uAz`AϞŻY7xЋW^ЧVoxȳ>8vSO=uq |Ƣ.^k҉B3d¸_[UOD-ZԻwo$>ItOiӦE %ٜJ$N|MX5W%*an;y !B'|r+?Amm3;0߭[Fy…z+\KV}K 0CF8yڽ =K>q30dWkzsHb_3}'ÿG{8pԫ%73 9㶖FG_tXzWaX,V0p hS0 C'Q" 䝓^S>x;fIcKcySs$vqҾ[[W[ջ $p . mYLu`mu-[>]cPՊl:dxw6hV(z`?۸ѽVX,rڰaɓ?#w󩧞(+jkk,X^Ӊr C'ywĵ}Ū~V|^غMsԎKAqV0ϝ;6\Nm۶eٶsX,kƍ{TS~i/ I޻xe`G>Clg܎*U9bճ ~y^wM zdbڴi)ţGӟm%ry*AἻuaSc)\I@XZl.eQ7;`suӃ⯳:<@[,bQe˖#̿MfX,B]vQ+Vx`N$>pS@>uxǜpˢC8* ­0KBҗ abŹ[EX~S^)dYqޱ:sZ|=bX,Vy`fX,+-*y_~ƍ)X,IէO[n@[bX,+q| fb"3bX)bXbX,V`fX,+Eb0X,"1Y,J,bH fbR$3bX)Rt0ԴgX,=i޼y/>&5X,n[oU__lYR{{o bXI`^xYvm8 lfX,VGR%{>u{n7j󦭽zbXmJyΜ9_}9UW]5s6z:,U1Y`fXr̊(3bC fVD1Y,b0K?N:7p y8wحf@`G?^IU͹&vAUU }ӟ6X ' +Wn߾=e2E o~nC~{ƍY,VP*Y?uב]8Wuճ71رz]wMknnVAy=N(^:~6VzؙwyFRtMV'+<н,>pؚ+HoK>}FTo?Б^?o[71ᜋ?W]wG2#F4&uM|i۶mVn\)[,uW'bڅ-[L:SO9w^gYx .f׮[7vؤ;qڵk׊oϪ*aqDO=ר20`;Yn0OŮu}sQQc1w⿱(` ]S[إC"yܹDCPϞ=n?.9_;/<YSեKwm.]m>߱ti/7 }yhOb :e`Eu߯oGoǏC8wyGRs̘187ҸbŊC!Y%zį5dwi hh`t@,fuiӦy8 7ySsFv+o;69?={>?APYswgvYyٲn75E;G׏5+ړgXBi_9{Ț<^U=ج[od2S߱c5k]gwMPM8={ OrJ_X YGߪwՙk $6l۷-_%c~gN8iҤ80ٓ2VwqW_O<19}:idС[o>}GslYA|gߥ[hOb Ǐ]vޣث9߬͛?Dyܸq]vinٲ۾}ĉckl+_Xn~fСѭ\nKv%߿O 8~Ovګod0^{[I`/nř?Zw:;԰^Qx{=]a6nXmYbڗR+Ԛnܸww?دo lցYWݺ(wd.\Fm},a[uѣ@$4Ŧhw~uܸ.]]n0^X Hh"`O_}rhskغuѢEPSZKlڼiỈݣ{wɗ,Y"~̉YknzO-GnseΈʫVуXY`w;xNF6#9_~g{gmL&- q2 /^\]ԦMw.so^zm۶w[nga}>_y"D-`^|/pѵ~iljrXs1ziLq[֭@GsO`2dHϞ=׮]+>6gȑ]tŻ*VOb/ ̂yE 6uCt!f[-^֭{޽oXkΉc k…nW4A=zh/]ԭ1/~k{Zpop]7H[_~qZ;Tfs.^iGs;z(6wܯ\pu~:ē2 [oNjZnmԯo;3Π\`KďիV5'IfȮ] B 0.Xy.wnG~vꉺ:m|o-Em?>`ԨQxQ+Rc/\xҎg3`lO[v\իgvŧ=F8ÅGh`ɪ+?_Ӹu77 ~#*ԴCGf _on϶[mkV֭ ba˖e+V<ȣ=^z)߈ :g{/})+Mu7߼WdG+c0X[iOg<*[r3}~=ǜpQ)+m޼Y|{,JpZXGk׮^xaw^#f˖-n=f]Ń, h 7hXU^Uoe,?UUl$x7^D\`$w 4y^֯ҥkMMM|w?_.P=c>͙s7.|ؐP,j55:k_4ti`Р {?Tp۷o׷˷uP6ձ0ޙi 67Oٌ%:ijDXS?_<5k֬Xꫯ?AGfA_NY_ׯ_ (aTY\Xteǎfo۷7y}is9U >^sֆnw[ ۺ+i __̥K?{l)PwJ+(YtרQso~~[gȋ/O#>HÆm͟35#[ 7sLg,VVZ|kkko+.=|F[++o7|6aS++&FLQp@Fʚc}8ۚѰ5}o^jcߞm/ &4l0TFR.\x yf ?{/n<Ϙv[jw6or~,ǟ|";yv/Oh#SLٳwyݬ)*ԭ[ϛnrF(+|Ѷ~y6(~Ϻ\a:O=7Zrum&y5Ξ29-to/袺/'N(0sω/ґ#G.YD3fҥqGoElTn37׵j冾ՍϽ{l^%ܣaͺ #7R0Χ8/0faU>GU;j͛V}/noiGDY5硇گ_?_?Eo2ӺKr6}wM#mv=d:R>]aW|뫟~8Cxȁ8wYi֭EO~g]wuro۶m˖-³644˗o5p@]]].wlur?e9|o*}Sۛs6}s)JIy[=3fy856׏kfGмCsnB|64t9ڝ]E駟>stEjL|#wmuȁP4ӱ<-x,!~] ̋Fsg_K[nnՙSrG(NEƤ"OlٲM6bh{4d|vR;:_&LymOܜm#R|@?/,V'Q*ǟ|zOnsS=[>]bañX,V[)`܆JoN:bXQ fwbu1YU&R 6T.ñX,VT 0u]'׭['ߦo`UH~l*p,*Uo5kYK0%˗ϟ?E|YX,V9T 0C1,/[,=`o=h7bX$U!0X,Ţ`gobX,V;SbX,+q1Y,J,bH fbR$3bX)bXbX,V`fX,+Eb0X,"1Y,J,bH fbR$3bX)bXbX,V1׊fXS׷,J=sZjՠA?ӧO':ಞ<%oH{|oH{5 y3G`ƔYbX2YPy6L`.,ՑT0͞r92ekPv7ÿFeWi5&[[iQ#>`bXK.3b2E O]7&Eif3b.̿C0L; 3G9 C{).E|.9bbXR.K bXR.B|V40OYJkPv7ÿFeWi5`~ 3buH` S)b:\0C`HA.P>=t' m(3p ei6( Ʈu0Wx!_ѐLTme v|nwyʓw6ObBw.`ށ`.-n12QJӥӗ##hAPTg@6&CHo|=5;=?ƔFy9aIz #?l~7:B㾳Vؿ)F I#Y}xQ:w*nFhz(.P|2Q99`NXj0{uPvשN5vL)gP9ESFǬ$*O̫qrs9a@~ey׼keO۱/~{X{P6eX$F~͡u &NN: f|sv)̃b`^;.uhd`t~f#TNAocW8H4. ɠG2ۙ\0kcNsˆE )^Cf6=;&*朶HFxLGraij,#kb#{24>s۫Q0?`N`8qōJ4Q6߬{6(S Csp$bFl $Cp Mtx[)ZYLF*}ux`>%0;#=PvC}EJ*S"&ʶ)Fs`:h ^ϠߥCr@МL<ޠlƑm$*Om~pYOX(OcN8f: VidJgLi1FToֹa:6e2@+juFH#m]O4iqzoL`6WZ%0O Cٕ~9a&Be]3VP YYmi2@_o m +e{h%١4h4♿p%0sĎrP'MDf cx _C8TqcoN$[In^{?vϕP g`9}b0WH5;T]ou6ZTJp;>2a2b4GN0=d+沫(d0O.kqd*)LF;z08XP F%wBc<MN۴(ɦ &nq5¡(g0O˫/fCɘST6曣ye]FYWo@K 4:l`f46C6C,Ygw!N xF&Mɛ ,\%0/-\7{漩s1hAi:#Pً6#m_|3Y&L'1AiB0<֑X;fҭniFr!ns<|5 IQ1 6:f#u,v4i)m@rh@8emBK=FS ]V"i}k=6VųqS^Hke?ܖ{)hbp[goGBrWxB2DüN1jQi?6'tDz+A͘J`1 ,!`LOe4AR ȶF=th~$R ')#ce alNZklLP;kZ?(sġlln*'Nk4HeQY f<|DصC+3f8:3|3hP 1=2tCF%4.6/ e w;fcLwҶTVzh$v6iŮq*C'!E92eA1SM:lAP-@S3fJ` (ZN]?;N l뀍lD@H]l,m@3R 7`>q(;1mWwɄV4LNaw#_8z%ʾ7;j^9>6lWƍrF߀vOe{$UT$F۠!qQ3HXEvc+7 C7T-(/g0O V/JQ*L0~%ed請`ӑO: 9ZF"۠48 w Fl:2 !J`z^W]`Ӊl5b7xd ĎOky#Su&e`mKߌÎKT04G1ZcHcF&V!k,yp>wB[_P eǽm(/e0O ʡl+xl4rdAcI+rh@o !YphXDs"IeD%٠1Hw@&YpiK` FMGF%;Plt,Ǯ^l@p~@1RP4V`<L.GN+ WeC v9ݎi2ͬcGZy/24]{*;ɹ!kc%u8f(Dbd^!q<vʧ mFesԩ.~dr;)xVяeq:nzk:٫9.YlXcEF\2!3 ,BI-xϖ)~L2K[G| sJ`wGH3;vALamݎidl6BkejOj Txe8A6`3,BI6҈lxQ-<3P0͎9}ꤡ**gQ۞A&~L1 A6B;n%ݽ2FAm3͠ܓNlЦcys%J< Ls+# , e w;`; h#@̖2Ww-Ǯ dGa?wu7S#g=u<nju1mzOxs>N$70 3S0}^Yj%˝ZFg $rkWwⒽtr. 6% 譳<uU]rOLnjg#X7 `P-s_'bs D|*9}\-TVzXf ͖@FISW:s~esRx ͺAF0ܑ2[x|3S»B9uvo鋱G|9}DyHr:qTX7+)g _댲ĈF8A13͐VǬWĴq"$|5!ܵ_@|0;C͠ gS2 61=4`][n _u^L-VH8f94ڭc6fu "x#غa]lĻ%yֹ[ώ_F<>ulL'+VL&zhCTF( _u^~*IL:0fǬs}³.ߥl;0ulUٯ`ޟ>u<Y=2e4k"QuN%Gm֚Ge/9NuBt̠B/>@u6f<Jų6gRֹG\"B)Q o``N: vwƑ (,q|A2QmKev]WF!C >$V 6H&XlG1ЫC8Qeu:H[e<)do/>}ƭsnqRB/9}H} TgKìvS`Wz:C5%͜,l%#8f:tUu6ƴm6cYg`gW 6P;(2ӧ㘛ʰv b;Inᰲ:NͶTWI*k#CVbx-H@y c=q6Bk7CxXV$:묳`ۊͩU `ޓ>u 07.PfFlyo֍IkSIe_+%k%qq<늿kA"S`e:fe1XԅqT[9feX2t^3T9Yyi@=2*_'4 kGp:N , hCG)Yi7܈=آJR;kح33 MAu$fȺ"~PՈrK5Yg!4Hmo/p̶m%h@b3A12c Y,uHVasyR Q0w3aNiYP*ǫmv>{&Uʭ`PXcQN &RdL94Qsdnj{e9X }c ٪ _3r"وds(3Vٓ 9=Z]`gI}pV֋}pY'=\_99*ƴ5:#qǬceH1+.$Xy..ms)ˉ +K`vP0mQSf0W^.{5؁YR`6 .œs8Y3FlqI-):*\Ӡq ͈QF,ӚnNcFMs)ZC4FABȋhHnmJ`Bf c=f>ˣ]zgI}p`Nvz=߬gd*t*89MijrQ bC<ǜ`ٕ4Y2+D-md u#Nv)Z(;u4he`gI)JQW]=~ b/{hdy/1Li/|m$VN‘=Abptӌ8f cڡ1:=HZg˔UDE {`j3MSt˩4s'& sΠ$e&! PY=03g%c AlPCIW,sw̺6 *7]51Rmd t$C_O` ]za`tcNlN6e H*e_1{NJHBt\JL7uնTֹg@\rx_YfcY:7o $V&:f9g?]6r:B roXWB;lCPvYܶZK*ʾaXaFmKe"ZΓR]'HeyLg9 2ɺ̺1+ kNJ$=DǬ1H6V'g[8HV:io/͕ 10X`N Nu`/J-qUܸ]HLeUg890*# ?TeLg-R!d8fe: ߶uHL[gDh.$l5eiQ8Ccf̃vj59}Jg([3ڗȋXyzUV▲XFTQ֊m5Ar@ 4h.09f| 1h,0zeq=/uRrcWR쁃k׬iPhʚ'NtޟeEc'_.ථpP*Sj:Yd)@s TlF1ecB[,LLZQl vhn`Nʮw*;QI}قcR9ڪah?Vʔ6V!C c$ f-b4Gp̠.hm q+x+D$#{)brgݑ1?iSBٟ`ű<ω7@ s=222@ٌe9v-h%<;!c]8f <[MYsZ: k}J*ݫf61 \",>}6\VTrYW bg3ʰ( eGٌa/c֑XceW![cV$e"sldҔrf3JsϚ1 9mJ?.R9c/G(K peԦ v!vhS͐Ml% v?mQ/,c1H46Zi䞕]aE. kH)a n51@SxԾY\'Ś/j7T:kKozALO-S Z[Sx` kqLss"lǹY9 kGV6S_}Ruܥf_o~vRJG-v@U4}W뵚Мli#gl{Abb~gf9T?OЙex{H,e;c%t6%,l"uddcs%9S3iSJgql38Smsm]cրT&V᜖cd)e: 1< cF׀Hk-V7)87ԃ ڮ(BΕVR9lvf22O`0Mm/-v95#˚l:.j T b]2:N#n[&1gJb@\n :fHc͎YC)Ddh2_Nj  洩soreT6=BgiKmdgL@\奖AlC~xǤr3fFaeȎYlO26.%k]!T:f+ II*udh!܈focs%yMͱȘO/ə Q9͕Mr :QT%㤥+fAj$,AWy8=C%gT~ 6hJ)ph1˄;CqF$.$("e?M3C!Mxd잕ql%C&"hN@3fֲ{V2Cw̠r~"xVy!9Y$C PC c\g3rgw\0/93`N* '\g8[a:#IjYP+\KgqK-ǿ3hN)86oƑlqH{~#qJƳĠrrP4Ad(PEVc'f9-T.Us62f6U2N]Ψ+JFm=tz1b<ܶ>e*R͙,2E4#n$X8q$Mc6!v9֙LF6zl[|$ arL6' e@S?0Ӧ9淂v98 =tƄDx1l 2vC+AkXLeCOWF4@p~6Z)^9X܋:f 9aDuXŁ7N\FB=11{`N*啱3+JMmFw9mc~g0Õ1ّ-]i#u<_XZhxiN]ŴfaИP1ߦ#pC.t6ۆm/_~`^Xs12f;N*慾s4ϚMΓ .W,L0F"Jlg&[d u=:Ol+$+SVn ͺ~OX_._۠y)u講=esNgsR셾rV&~Thla4PkU1y߅Bsuv11lhKxg$-s:It 43؇C1Jڅ8f:M)#!(P!6Yw$q {Òh_P+5_CPw;59U4yaᖲx2_]zX3]s@\́/#wmI]bxM.M2:묣ohS7THdAzCp ۋٌ'1bK~ȁ'_ YSHrK/h\Xv9 -vYhJ'~]we~4Hqlj_rx!mt Zg q- yS6e!$3DY"hVn3[|$ASKFI3ŸS.!2k.. U9ZR/_plQq`ed;u=8]4}UPOJHlzcYYtVHFm$6p@cd{<{ 26X=Y(!S^RW~QKSf[غ2AژoFoHJ9d)H+IJcV8hTxǺ/_fb#&m9P#5!^_9)qOM;#T݁p8$҈D7VifUifJ\,sWޛcv)yD::M/ >6[%m6zw cά}γ *f<Myi Έ% =mi+l udI]Y)gVُdR\ơ18AChe8Cx ٜ]*.3P 0޽x݊O|Qe1cfQR|p N̸gܰ ǶE'mq:'MI?J$|sq*;Q[Nf<  Y%8TSl exJ 9K߅J.(JNjK0G?9CY3UnXSKMcO!+OeQ#4Hُd%RV$my,#߻O'1 ͎Ye t۲9f(;]0[sd̹߁ʃyV]LD(%INB3`@;Q7l|-rH'ЦqLt̺Ӄ~ 2jQsI9f9єdg4 ~"H6YG\$JT.﮹ +R U_ eg5ހKcM }̊ d'Nezh>8mQn]2M. O |p~39+,eCxqޫ 9ilj`{!gӢ@J6[!BeۤBىaB1|g.&nc(c| l+0'3WbI _D)"8vv4T:)N:VYɹ\xe(syUa,!9ieKl夲geۈd3C]fu,4N*5xYWAoqhʀWL1oݯ_c{=+UX1LmrFO(#I[uRl3\%9+l!g=9B2 N"pt|-=M?UrVPn"if(!funn`.#Ae#-Ee\J|)\2j ˵d$# rlV:o3$or$#~KP1֙v[t!\N̝)lt̡%mtF0F tZ0kIP%6lX4) @hDZE4JH_ɠO*lݰ6T.14`AdCE.bJe f_5O dRLs&1'a].~N!%CzxV6ZjնڲQSc[.mAj#r#m8퇴Ohu$ r$7`"uiBّrfY.~TzUr.123uc_b6~$*uVV;fL+CMW%eg3c?(Lj;F1 \#x.j}9٤rd6#n6Rm }~C579ʾ?*ʖ ,sgQVuжn:1Drk]걬%>\N q4` m@ q>Hb _X-]2B喓R_8 D 4a-KR>@r+b4P1$; Ul<4n3y]p%kZMD2%,7dk (n6Ki@ PkO͵TxvW+c~f~UqǨV)6zt#UƊ0CH'},F@32JYxV3P6%?Ld3%Y]VW#U5?*c\O[S0e ]EIB۲FY?|1/*x86#[ga*{Err9*@f$;]6UYbs(m8l6uQH9tH0{_1S p\Hi`zz)䏕 fcVEYd@RLnmP9=D@H3=v$ ~ϭ9uΐIP*Ox@#a aA[Ws1ߜBsTEs̏/k#j=N+mДXw"_hI0#%<9$>'cƩݷֆɹJHecCV 8d?Y&Zdd/ˡD -{h4`Yd̍`VT}c,3 e#f(u[VX r7W*cWx:4 9rqm9+D1o\($bLl`FoL8<2uݒZՒ,ɭ/l367ƃ0 ƃca4,, 20b>cm٬Gs l,:uvKj]}wWnfeVV/#"3Q?_A=5Cm/vͷRl$ΖȞOyKϐ6[{ 5rUBʾ7H;X.7L%#PoÌd+N DPWpxZsʓQB[U$TcP*\K}]4vg͖%2Er8aŋfg3j!9H#ȕ e_ /lﳀBٺI10", ']8sTcЕP62W*e:Dm4a ͱbT,FK|* f9ӳ?Ǟ+w̉c{TFiRI(r"2n5.+{jDco ܱ=Ε0Xh/3ͣB  kO\2XOAEbH11!9X9[HX6(AlxKA*drᨖ"{Ms\.o^uGӀBق`RXFHڃU`ܾ9WJ<+&-!sO" G:Qd2Cz25-#v9R 0x;Kue3֎9# XčZE4Ă!k$}=<̻#wu`Ycw uSV'J==MZpDY +x0/-'d"ND=$Oƨ<)3ffFS1!.3{9֎ 9 .3-5ىXͲ Oo>t\.с-}W5@`M`n`NɅ`c)^刟Bc!08d. qT{mUrdBgI>E8ATSu eF6+WYTi\0c˽O,ə ̉y^"`sbb8D#ռ@t>#(BS!Z0lh D8v0]6ʥl<,6ds:0JLǜ2 yQh)o-Q8&xH<ӌұA1&Y=[=Fn,fe!dXB[0\]D+X+ DZ{ v8]`ŗʉ0Nop4ɲ _L"M 'lafYgs~ql1eu:+63K5Y C̰O : mf$u fd+er 5@\KdT4$Gq/+>~L?Zٛ=!OEg3C 0gfn1bJes85ʕ(w0FaQdP!vX 4#?F@`Aq~]w_s:3sDYR/Q:J#TNe͖Td5F L⩊c FrѰv(W+fY63s YgЖ Y^ۦy}T[:zl]f$N㘽Y9FBRI^71,31͑Dwh~;4B5Syr&`W3ird2ā0E\2b8`u"0>}>\5z@`M5 eO1mcݼ-& Y`ljՂYEq Z d5%Zzed1OT$(1ruq k#9zfx!1jA",O$Cۻ̺I1o#9[03`!2uS`Nt 3Zy'処kRVKL87!H ~FDS.O * G#̀buW~tǖ5*8lƴl e ";`,;o{i~ӎHvlc70;^&Je8e qZl6 %<# m+%NS2GXgJ(η|NfSvĸɇhbLP]Qg1K4+GsOe`f3r?U([eTsPcUd*3^"DxR;0=4( s&W 3G})|0<{ŷ9X@eA0vaQVrAAߒ.DjևVe]5NW}X($ 2`vwܤaZY 5cJn*3oMeMpHW_50+͎Zƽaf2^(5G?q<&` X<b@l~`2cE0ڡl~Hp1`l*<<0@T́R1E`y͘z#R.0sp/73+̡c b#`4J9]MeFcXS4q9N('Ǜ1fgƔ㘛8HxǷy#`t//S "HVK`d:+ 5uH`8y .~32d:$f#,Ev4n'MD#O3ƻwEf1l'ssg?f-2^9T)ӭbkEX3*9uJ44XvA0q̗o$1%R;Q\O0M4[.+%fhLJHdMbfu/3TlD<<KҎP0jʂ`Zd&ӳYG, eC[7| ߢA"Xl ѵ904-2*eLg,M3;ek6 *J.K]F y,)D2cgN"fl1wՙ7H;WcOM1ĊLcq"8W#?4l8vVxL7tdy<94l9`\syy)XŇ0s"FX/f#NeI[>x-[#R1>̜, hA)Y`8+$'WTLs'ieS1?pBoJ[Dx/57_I ILSH NC[hqF+y)fŢcU%9L)T2ݝ䃈!1O-5Pr-ՉifX#1n{IozNc'0')yZW 3m"߾rH7,~)]قĺPv0343gR!)`/21d2˦y1SU~ Ƭo7r7Uxצ(E,RD834),ogi29E'(o$0'̦e![3[fDxKDgSD0Lsb[yY: 6lvJ5ͣ#3J#inܾ}[n'~d',\K!6̑T aj5T4sMf$hykF`7+~/&0'?cl2#Gv;f〹a3-&V hyylel))dla/!qF #SX4xjIh˅R̅fywO"`0 N"HJoX!0'̛R5OΰJLێxhdc-c,Gabkd[H.0=+xeHL4$4B,\lwSbyyEF?<0 v̉qt#̈2dT[%ŲiV҂[ơ6L2|V H(ۗa,cx"{e#PAV 1A *a,AؒrFF`(\i3./Wn((_9!=]lJNJ6ݱeF䆙w`7L* w#T慸|32i0wa '|A!ys|bi`oZđ}ySx X~fWx`(0e #qNXGLrwJq` X%M冲s2wܒ'u?f'lfj$NCДT6go9UcH we S$1*6S.ȚFF s0Z=?=0߉]s,_tamF̲tTca&J.5͕f-I)G;om9 (wLpڌV8ܘNb)`UD&4 5orK6̛ y)̑A<88Fo~ 7,YďѮ 6ڳTcv~}2owsjC1U=Wk_951\̟Gns^>M"HAsnR(;}PvC>z`~/ 9fDjHy`K̟#0'3D"5<0ߎZ+[?Q(HHB5; ]($Ǭ9r|u׹߮5S*T U>ߎfDlDjHy`~+ 뮏N4|)]м߄fDD"RoCu~"0H$RC(I`Oʮ>R(;}PvC>z`~- c-;tƷڼëwnh I$T*ߕsMvskޛۦ"fD".̯@}ylv(]w}PvH}Rd f/]@s}qeMQH$.1 5 f_6v4' oS`熱`qOI$ɑ`:fk6Q_$]906g6> 4Q(;}PvC>z`ބygJ0;`;n*76gֽ̹k%,A\AyȰa m0 ˄%$M"[o@RVvY7mZVSM;K`N:Hv$x\XW,7'`2NjDhT\?KT&b4]K$GKƍ*Wؾu.0ΏƲeH.$zFHB5; Y( ̶I\0 P9Y_8 dž3pחpo}-ze.X~[ /vB`YXǢwI[myVW+ªðe[@hkq8P*5wQuSp b_W_x]Q0?LKr'c٭/p? GGsyHTx^'r™6Bn _Puy#٫Z9hG .5w7u> tCW:Zj];U1ml>13 022]VErEHBqh]v nqU{ʗ=]c{.]`.7x-|PׅG[4!~߾S6ٯ+*NfWCܿ1?.~٩N?9ob']&A~<G¹Y 3[}!@50fV$|Bٕ#= *'0::T<\aC\صK|6:h/$Ҵ}|̫Ƌs{&0ֹ* |s;>2xy]RF`cf`[ yԼSq[Hd}1*m˫!V"ōL Ntv/gFxϯ&{zG:4ǘ}y 6\H'jqp6nt ]vyb|-G٘6B8%C)a|>9` -i)ٮĒoiϭζx(f@uAHO ٽ͌Z#o*wT>74©pEhpwnܚ^O Cڜb7iݕ4qecA`6?)7/[Rcs.rڝ9$zo84/EjSfS}!0~7~p;A}\3r̝(ke#/Ӆ sON8ʄvpcץ揟¸J ^ͽxᡕ-~6L/7<*Ov΍}ddB(gSE˪T.WaaӞs.zzzHS-`oWi/MF9fI2?1)uf zs uu]F`^~Ym8Mp9-%؈iB0-aT!}ֹ/hRyhtK>q= zӢ2P╝8 |2̯2.Nez` )WBqUdr|}l}\sx:x̰^X&kAWqnYƋKGVQ0*\<6;Q6}t[4tЃۿM({ f`5J؛F}R$$[,?5/H`ź?鰺5ޖ2qgd/_3 PWd?pT#/>Z~>nj݋ˌv]H5 #ǝ8fسJ^iؗ ek`&ʉzF*6[M)WOx`^H`O\09{sKsl<ᎋy/Tnۑ18!*!y'C3ʡQcg-zeͶcfvڅ/%\vUx:@!0[t}0;lP9> q :u7TF"R F6e upl?~Fl0ۿE''+$0 x]}1 3!07__>{Cx~m6c\o"3uT>}2>@C$VVrgzE]-6omUd}TCex0T:C6|RxK})sL3.y'%D5)]t0 KGc'4]uaAl?q}@at -έn Wo,pQT K[IJtf&0OI +#T+n6x{|*HbW<,k LD@J߲_pL g!=ynW?T|e-w0Xɍs#_`6l;gY>?ɕ{`c\'W٥c+'`+E¸L2ǹNvL5=`^˻B !w&lϞӉ6gxlOY #d0,̷+wd8|V&mﱬg~1Y(}k,Zֆ0<06hYs$}8bq=C.^F]6ÉQ˚8D]3ϜݰpFx5gkFo3_Y8E/].9p(fr./ڳs\WyEu)?jsÁٰ7.ұ-K0zf/&Ѳۃp40k]IxiT~DW=omdO űsr1Wc`nq2aY7}aFry`4:hYkp`CPfW9ݭ+4 es6$m{ɮY{\evAWl2+`{a au{} zk06Fܵ(c%z~4yOL138^sY.͇/Z7cTO𷬿<^ ߶˭C`I?ABR]0B5vѮBv ei./*0Wu.k]d 5$f1K@iuuswqS5TiS,&/DK#p[i (i 1*=: %m/~hJu.\iv-Waсc3$X֟񥴷?pƜw|!\f󰶤>-:[QA*e.\ĆS>J'8ж#'Sc xe%},;lnYg`~. 0&cmg:dqt87(=LƞFt^5+I/xE}efONZ~bmOXLDcm. C'g-3s0~0`],⌿tg?8fR49Lk^τrYZ:++j;:,^e 8.g}={l]4C~3Ig| 0oNdynճCu̿t e/B^X,ZS7!`&;6] {tt>A_K4ڻ*T.K͞"l.Z|6[!1ʰj28dD|P=dc,oj P)55j'Y)VuOsQye+Cf̖ lE3'֯}`^ĠCeJE`^U:w󆉽TfGߥ=2 mDt[S 6Y Ǭu;0O<[Z|{aɫxde4;1w/Λz@ a#PK̇%`20y*|[>yf%1--6]*Y<,#V<2_Usl^3=qyǽ $5[Q1Þ΂vIY1j"7|9Hbu믏?5J6 .0kx/y7Fc,CuɡiX[+O.847fr;g_U:?; G*Tv+?e;Yq*eEgƺlS6][Rǜw%t{g1לٰ`yxL7-?g aEckO1U;hI;tT< ya8 fDc.Z"5GGl f6͏-Di6N-sÇZSU=~fœҬ ρ -L<[N9kĩBotqVڡo)oLUl?6_z~mCus1xyXϜI̯Vŕ̯yWw 0;c`~Xi63`^x {¾+?=1 a'lUnf,5 0k&s]xæKA2m3s]$}3 I]+)cZ 0@۪`Yth| 1F_hl"GԈR\F);+.Yo.Kxa\ /k.ݜ/Ce5Q󢫎t!0;\cSaфһsUB. a8QD% 0& e]ƓL%|-(XG;VHq5CivJ0`%ܠ&zS|7a{13a$BbӏG>6>K /koi^x|~}5rlj~ɮiޡcWvRቶLJ`~0 i+g${LP#Hbq&u뮏~ ^yd#r^+a\얁"l*| gCl<˰Yӻaح}%?=Ne*7<߾c\8r0 ?B_<벁<WӾߪPfkg=6O ͕z Wv.Iq;.=XfDU8uy]aXV^+h˾yp6wzp3F𬄘gMp]0Gm?^ETA҂[cJanyRP>%χ_)\V'=ꁮ{vk2]TVg6 0&3z0́q߼ V.y\H,-sǡ` ;[M>ӱіR<լ~M+/,YSg<>V~C轾֍6U*]D*vf [S6 0& e]k7B\H? UƱw<41B %@ke&r̤)w)9fD}JCV*#蒣Txt+{7<<&ߤ{ ;`^?q*R{y'͊RybS{\7n.퓸'#UU0FpP,nPvCٹ5>d, M, _ CGT]lp摾YǬ(ݧ3(/Sow;q7XB6Dռ0B^X,nP6a#X0\̀#y&~ȈF}0$mD˕3`%3P,n"0Hz0<1U<[GxVg{giRénM fD#S~ qQqXa).!c>;ƚ'1Ha>y54ơʈ/Hb 0&3D"5*`=ҦX ̺BuG e@ʮah X|*u9fDjHUҦX|uD"R0iS,>hIND#S~ G e04c!/,u9fDjHU ҦX̹iUwx-;wnzD"R0Dl0{sq,W)]w}PvH}SB 0L"HU;6M@`MPD L"H )_ սuӦaۄCs$> o%Kb?uR{jlW|<ݜÐjLmA}NlM~:W !)_ evH$iZ滑6kA;6o"͛a3-ƒfDjHUMMx+ȀًJDZُkp&FYuGN4|)+fy+`:b6uraIK03D"5*`7Mf 0k+3D"5*`2ҦX|dD`(]/}PvH}t59fDj$ $DHy9g,h )g)i>R(fyrZaLvD"FsGGTD"2L"H$RL"H$F.`FH$IkY֤>GIc}DI=6H4iՑLsmϑhX#Ѥ>GR9Mku$\f}s$4H4iϑcc}DZ4Y&9Ms$X#ѤVG25],pQC dž pQC dž pQC dž pQC dž D"H$D`&H$I#I$DHfD"4D"H$D`hM[vnt6wnm1xӶ⶛2fc~}5 4g8.\UMvLD޽ڀ__oE؀?p9OvϤj u1Ԡ__k ؐ?p9G氢g{i Ѐ?5Qp:\NѴl (ڧ<>6Ykqh_\Rg+q>ՠ_h`f}&5Vi:8nM/Up: 4 3;6omϥR2}lȬOyk/Mt#sU~ Y T7$hojy6\ߠq'T_tNi~"0H$$D"i$3D"HL"H$F"0H$$R戒H/3Mܩ%%0H/32-_H`&_fI3ɳssOˀ;zMv|{]^ F6I:DL0{nwxnZĖYv[ڏUI$RL"iw#Yh48o>$SfI3lj#ΛwT&viIDATx^ ř}s>d38q$.Qc&I!uI4p7QwTD\ \WD * ﯻԩ]]]]}>KzϷ~j˲Jb}ݷ^B dY-VN,Pg}tҷoߛoy %Y,@ ExTpN+Qx`>}py_~(dY,@(3 `(4%dY,@ ԗ0;{᱕*HxY,@ dz8CN[x /zNNdY,@ .vOېQANG) 6xY,@ dpٳwN=ȏR(ˬhJȈ xV;y xM.>o}WQANG) ӇN,]q<[o ,Yxw}wܸq槝dY,@ ԁ^z'BYfSB6 eן ~߳x)b{GeF) ӇNȵ1bG}nݺ?xժU+W@ZrڵkgԩxdY,@ ԁsk~`,`JHۭcg{>=^Eמ\{kQqr@) ӇN/w?:؝fU[[[1V'Y,@  DpDb?G߯ |9 rض8v"?JGڜ2 1A^LHjW_W^AI0C,KdY,@ @^LÂqJ,GH$!syrɲާ .}~G) ӇS.ZrcddGݜPlKob%I=v?H_p!OR۸UdRY,@ ZȋM(! &YꂮSa <ׄC^*%#-B5k?E6lnҽSn/6}~-[p b_nY-x@S.Yf-{,'Ymgcekz?&ʑd;j{[Y,aˬE?O|+e.yߖ]*$5ڕwV+JkTI(Wd5 Y,@ 2~3=nɿǓ;0G~Xf~D!{ǃ7ȏR\{$RXcǎ]p!<+}w?'&|t~϶'@M6}pG?(fG{;.}uѠ_?_r.lY]|ܻ\{z_㜉OsCۡpGk?~awa{+9mC[v?ǡ{βs<ʖՖIv.ι a·U[ e v)%m P" d@8CLqJ,S#H"M<vQ ݥ??(5!p/`~0E|v[zs _n޼q2_~O~pqw ilc:AthCcBTu28ijo0~?IؽA8×'O'ێ~5qW$Cʖk 0p$1a `: !i֭ۜ ;o8/ªJ^yu^?;MN'/>7yru %/9p'>SۧYd^v3*6bdY,:w ( >E?|/v_l3 ?Jq!L\()h_c6w BI۶}>mڴ&\paւ;>r%K~L{?N{&< >q{klw!}80. /\ǿ;Yrm;}}=;K>f;~8xGWHOQ(\{G;WLUrOEYd9UJ[dY:, }Q)qvk#}2!{&LwE2l@^$}0a_۷QGթS'? |Br!}o(JB ܁֋D_v ;y}m֯䷦^Ͼm8<]@nȅltà쇃Ǟ0ɗyzM1*'բȔ+ޝLg# d`=zÏQI a;q ~#NX{~k ?ׄ=$JŲw΃v|v{B;:<ʼёeѾ^{A}p6l+R?PǎDw_ `ˊ}?bNfG-Q#X-Y<ߞ\OyOZpRQ2ʸt,@ ZlXR)WHG2T@gq(¶=QwR\yc!eΩtPTF9~/WW?oS=dY-?2ۘ/u=[׻ۺǮ} >k{u[f;윗R\{NIԊerJq-pߧ2p-OdY,K t.R-qJ,)!_s箿O?}ܵ_lc ȉ(5aCʜS 0pǔIdY,@ @^ AnIvBYfCSBnvmUٟٟ=؏v;F~0}sJV, 0pG:%Y,@ h!NB~ hJa۟}:-2~F/N=@+X|HsjۑY,@ dX{'8DZ |̆F@dOPфCS%bY{GJdY,@ 2{dY,Z=$JjŲ{<ؠD dY,^XDywdY,@ ԗ:yOGuwڐdY,PewMFb9;dY,@c ?I%M 񭊪F d&#RZhdY,@ ԱsȟVEU# dY]X-@Nw4Y,@ 9ORIu|dY,@ɈT, p;Y,@ ul'i:UQdY,@ pdD*C ,@ d:{TҴ@,p<# dY,^xG O"3@\p<(Y,@ dX=#~fd=p7k̥o_ENg! dY>,@?i3ETy͚5I^QY,@ jcw0F ` pwmn ɵ,~ ?!,@ Ųq##@&*Ar-{=&Յ,@ 4SB2S 7ȭ-& dY,7 /I,@{PVgey:/Y,@ h[=%>$9͢ YRud@#X=|IjdTkL*.\':ڡ/{_]ya\}hWdc>;jS3f(Dʷyf5:tȟ#KIs_F y~Բro;ume Ç _0ue6xg*އ~y->}ްaȀlȬw*E {\֢Ŷ@J.{bMep@?3o֌3x o5i$e˖<鯼zyL|Ν؉Cz'JGe[Ǵ-3giK#^\_|Z{J܇ >y;zh^J?lgvoׯ 믿޲eˊ+ߝ;ƍK~Xh^~ᅉ>{=031̅I/!=0H?04Be>tt<6[&'yxgu׭kjp^_8vd{==r)G[_< Io߾۷mデ k#PgΜ/55mµw߽jL*vZ~嫯_}zgRdY,P{  F7nއWc pG` <&NZj֭[o߾e֕+WLO[[o=vkO8e^S/l~ꉑ┹Oo ^Cx]sƅ'$TpµZ\[-Xcy1Gxǰ9~Ͻ7~K>1nذ%K>뮕Kŗ/^4♱^6Q-cO2xYjyi{c+mpAԶq#>={6}z+N~ iʤɓ2u4pR1!0Pyo(:z"OI6' d pW=S?HA>t13!c"6ff9/LxaȑsI>>}^}r̛ͣ؍'Wġlqo(iǸ1w)o>ilq}c࣯k7 Ƈ_0{GuϓUɬ߰aҥ^xZF==<mmm22|x1x@O>_ &GTD,@ jlARwN!ֲe U g&|w̽O5h ̓ /o>8!=E>z'Nhb|-g,u>:;`_3ܛn|G=]:]~_#xsƊ+Xϟ? /l:M瞻r|Q%K>թ~ѽWӧBebٖ2dl-@^?HJ5Q@J>kֻu>[x駟~z ݙuM`$A477?W_}=wE{qUACyns3Ox g9W/Fd{{J.xW~gޚpk;7s+iU•W[Ƕ}~זJSOoQsЋp?h;oeӦ/?ui^=ϥ~ ]uUb…pGm;7݄9F[>wo<昶]qtA,K+L -@{~,O>3~W^;Hxwd__zwFm}oxk'+{ qH ztj+=m˼ay.>WZRzꯥ~;9qW^ O0NzGb2TzK7>eB-;+bٖ2dl-@ W,1hW}w'Om  R5 _/R@9_B!//tU{"`WCr?XP~|Ď Zo͛Z/I7 {y{m#o|q۳%ϼ?>OAwlѰ+WD9=Ɠ2vX eKoiز,2_ؿ[ 5NAEdY  Re"-_?ns}ﵷLr]~}I X(CbgϞ=c U0)$&!/{qϝ;wڴi>_8yvۭOXGCr}?6yNj>j£G}g>x<0_A}$9s[BA/\9x|_wؾC\5nyOosc_9v,I|95N<S{% w3`4޽ِYT,@ 2{$Q@%'Ma_}<7fu%ID;qG l (!@[0%_~(.^\¸q9VePY,@ 9yK(uavE3;n dY,@ȧ"0cǎax/Q" qiG(Y,@ y@'wW^ye U,@5.m vt# d@m(,oSN9_8S J2qiG)Y,@ l/矟X4Y,p裏:~:̂o|}[]yU_giW8<ȉ(pQ&pt# d@$'Jd@b M޳g޽{_(K;I< ?J,;?6F\xk_dŋntͽeþb?"r"?Jq!L{ݐ2dY {Y+y䑷z?\dŋ}qOvK/J,66 eן ~߳x)b{GeF)."p# d@$tg1⣏>Znjժ+m+W\v-L:CO)Jhp 0p8.\;|5S\Ms'wf=lzي=V\}֊g/c5Zt;o/m~E'gB(Ȼ!e d@- p' ;Ki/"AO-n,iȐ!_| 6`{b6}ZvW]y>_Μ"l~e;s~%dY,pǠ: zj2!+; 2'MpbY& 4͘/x-zʔ)l_1J,3qeO[uY>W<&Ⱦi& cG?_<?8藿<۽yx2P_4Wϗ$/xpm? ;܁GN{3NOY[ :{vۡ Ugzbkl yt1ʑ-p!5餓N={6g}2ah;?ҟpvB~BSwZFx7@g# &`2{=\GSyfEW\~?OIJ__e1^'¾:bσNZt?BNm{ܜeL:o_?!G3Q"0CXEάҝZ?!Yz7H˖aGq:ٱ.caUOE~B(g}'mvcV<W=$;& rf bp1uumN7x؀b:g:pÀiWw`Q&gC좒 }~dc9mCڄ|v tep=d^ 3l莮c{?<L W8ǜva{pP[>.v+‘ vij sݏ+7! İYgI|ܹv,;6]t#eN!{&=_RI1:ҝ]Ȕ,ŕL,3a믿޷oߣ:SNmO*!z5v93 :܁o}.=jDd}9:3Tʏ )W|{wf,l}٧G?,/;a=v|8ۿJq!PP1^Փ:U,+ ڽ1ɲȖ+ ;JvvmFc a?*Gǎ,?~pww߃~r32p!v')X4NEȁ8g>nYGհ1@XNX:8LNBY&ۯ''gϖPm{>؏&<S۩ǐjbW_|uށ϶;~svw!wxx#HkXY@餇PrKOXu}೶W_qIm9y (Ņ0Q$PS36?3z5_Ϣ5_.Z[ ^隱u8pS" ZC]vFM(k?wπ7b{e@NG)."p{wU'@T{$kw1S/;ejBm}m[?_mz۷؉}g03v\afs6Na$g%Y( -nlr^jG)egazÝW 3s:!/qsȏR\E^;*$-  g^AJOKKKh0 TyWo}߽twZUl)eUJd@ qxj|}=;lVe[r6 GKʐd:m_}~l5>۾*#sŸm{Y( qs@v "p܎d+C q$q,9;;6՟UDLJdY@/\ij#zWw1Kb 6eA6>pԅǽ#%Y,@^BR,@ v {ۦ/7}/7oݙ]].m\[q ;WPaB dY@ܹ*`FYh*T+!( SA,@ ƥD:d@1,p߾}W[7lԶ |6:wݙ]p^=cBpgveBlsp|1 iI DY@|:KdY,j_zWU9ݝxw|LY[WTb?|P+#jgOq'pϴQd p7iME e l;͙-TD^ K" -@N},@ Ұ0amt? Voj4*9hR,Ӵ.& k6-[p#l Qfp FkNnڢ$,3  dYVg֬YȄl9T*Hm M*dZOuݼT9EOO?M(7%Ǡ(S*#{f&"Sׇ, S7 Թċ<׋2d@>-PUT=5 ىr kHj*Nj X)J͉fN()n&I9*wq{G"ECr$"hAO#iDֲ3kF(Sr :e"c^'xv T{ tF@M-__pr#Ho~1)2v2JH!Q!l,@[b3;D^I %6*ɰSNac>}DkA'˫}ժUg ^75PUC;P6EбD:2H]zUP*ِW*6_7kj^[5Z)67S@#V5RE hV7r@- *?SʽRMAGhKYo>>ۧ5Bʒf EKow;h ʱ1!2 =V- Pyȑpey܆vR6zo lJNPXk i~Q!-]: KgͲ:;o,ŋůnYpt y57R5JjjP󒐔,RlJ䱓M>̚zFה)SF'ËzWJqO+wMjWw!> pOE+}mREᲑ w`3PS={H fl f{CӼ*MiԂ 2{zMcDrf>|p,i[ όMm|3fͅ]h܍_!AaXe45^(}2/O);jMm ܙcU\I)WOާ9Il7%~{{{;==d!;V:~_|Aw;hn:% po4"W/ĺ*U ~Q1 ՓZS3*R4)Q$ߨw)[0).c)Ԣ#H< 29bK_a3!njCeWK;M-!m>*- P.~]he祗^ʤ/B+le#2"?? $g;n#2Ґ>ƪ2+q7ş_x>kV$=e|+W ?mڴ yЎw*)poйV#{^{wΞ]Dp3gѕ3w(@h8^_w Jl,yzp|Nwk-}H.6=;Rr>kEvAFĪ<=p/2]vY{!yݖ_۲Νv[ںuk@58J))^mw5*#wwum*|;3pu?y`WL2%GԨ)k^yR埡?LdJy5SU*k?%hp ]J/@xo;vJ-G^P0poY~)%NyZT|w\x<SGƫ"EؿvZv2bZnǽ\qWCt  ?'Z*<&fMW)\:%xՃWRQ; ,Ar]9TboOy&};;'MZ,yBe"cywtI:]?[)J&$r*SLsHPԑTTS*mR`[zyrMȔ=S*f+c۠XNe> q!mf:vn*at04faQCsCppWt3F&iζpKR{G'E2AŁ􊻝AptM8#0F<߃PpgzL? ? Ila~p2w;Zf#p71 H{% Ȅݯp{YpfЉvNv/u>]~iE>Uy8P *!è „a'?rkjC6i>,֏6AT] q@F&Rx2ؓY 'h_1磳ڿ>ડ2B@ Ptr]T߂a#],+~}>[/؍ξTȌ2d\*&*#Cp)4,L2%'+ {2_6Rgej)*+ѡe ́B 9 ͂퀜+ r~]Ѳf 0OvΦ RS+w>_;<~Xsjqpqg,hTSXT\2KVT5UCX=4=6W;{ǿۀ^]ow榷'po@"W2{{zۛO.?DB&j= Y v011@ 8qp?ACTepj'|~tń`3!gO?RĸguBDƸe%ۯ_W^90oxvZ.b`J@Y"6`6 u'hW )4tL2%'CiJiL4D^J. 90*ljD NugF92n1o;1#Ko-w2LzJŵ@1#?-]| H({bo54H<15b!vjh1JU :^ǍGT Q-Js}i}w.7ܱl 8 ̓{k=Aw䵮3 ڃ=Չւq5q{dt; ZעRA;'% 9L HU&pWFdKϣk yA~X3P_&b֬4˗#wl-U>{KִZɚYf%d}TVOJ&m'HG&ypQDH fu U&;\g>nj~(fJ)9fSȉWkRCA2 *c[ 4D\9ӱP!/LԎR_gAn.uRvTRRcJ֎pd 0Dpߔ[<#̝Y X[9yBsdyPP3YBs5ɃiKQ){t݊uqqڱ*[)>˾d}Z6/Kֶ=#33Ulm ;# x9s&jZʆSM͛ UAZSRw4=l-ppg!{lG{KRnǖuFnZ֏]33o:&gk:{K<n* ަ|cO^"%- t;TCT&-Nȝ쓞5~XESGДT(<)9RT Ka⊪ Y qHmF kvlj߶m[Òn}QBx.M`Y[Ɋ^2qwի2۠ {)wVwF;K= ӦTQ5=͚WVDӳFO>FԛwSrҋј0jM@oj)EQHQF3%'eSL `ʄS{8+v3ʦh4d&{R Fwqp\&S?w|pWl]a {1{:[wDD&} P8Cp'06T_Dqxq Ob'BU>k7wZYwQ,Pa :@-znJNz2M;>(' *PpSS)'*)Z;aN*Ye#q)Lf"Q'Sn2Kjc= gYpM3Yf- ;nӭTISr)C⨯7y5U7]H&%rY S5 U.22U>Li dsQ`:mwV[ %p uM)9*XerH9 EKXV SpoMʙ7,6kQ1= e˛RwM P)98)Q9ZKT _J}7etMY Y…TU"(>a6*(.Eoq,/ 䘨g}_߷tWmU?x |Y9-_|ʕWfk#q\J̒5d-YE%룒d}R֗4=vQ즹FNNJ Ʒ@Jn+kPG%dsyXzWMid$h+#w˴ιcMgA(@ ǝq{c~So,ueQjTR.nGWTvLj$!Iiw Ey;w?mC2Yu&:o~,@գN14G檒ҀRzyO282nrz(ՉA֔]JXEq]e_]>-YJ֗%k[ NʩA=QHRV==:]xaN~ ^-*c|H%"Q4]V}ΛRw*ã&7XA̠(nJ(-bL S2L9Dgn%ȑ#ٔƄ y.u7B" - Ĕfjm2ż+l>K >ѧ:-}n?*cf=UV_SF#NE5qg&𸳍9(S#;; ѩ yZ ʃR whoRjvw;dm,5?Zvl[ot붫eXܽtm{65a聝ʌ_T~Xѿtz!I;/](p78UfwseVΛ/ <ћҮd#y5*mmϭb)4v%$ ؛w݄M`KvŜwÕΐW*"8F6 ;kvlj߶m[Òn}QBx.M`Y[Ɋ^={]ެ#q$ Ijg -ø}|хn3IqB!)w?QB_L?:@Jww[>έb,[n8TI]kt uq^=WN፹(qrn\#i;HP; Dĸ]jvwZjQj~]uߖueu3- Up67#3Y$T٢hwWs1K#Ԇ/?nH2;|HHNDv z:9'U1vrBeXRYagq-ǦLO*yMZVc{ՎD| !Ye2E_;'lyT%Bl̿YO-8:ײ{]K=0G@~V=}Ngw;{-C|^EtHăޙ$7Rw+6ErpW5˯5ӥDU,sBI) {P C1͏!}ݺ}DzNK-ke=lY/^q/X+HawT|0H x}^tbe J1ST #w'Q>PXAڱR*}qk2_[o*ك̆ʈ\]PE#SD% 2RPF\2XbSQ^*/E%E2aF\gq 5T&2ev׵bw+!OXY|>|̙3WZ"*;v8p 6LMx{*|6e,OvGdgH^MRԈ6b Kdʤ kV8[svޓw¸P/_rիWTO.YJk%kfɚU斬K֢QZU>)YK._\WY?N|"wH!')C j6+F 1@! 6Th$ '5O'wiHQ3dR{Rv=Q;wX9R_gAn.uRvTA{Enǔܑ*y//k,KK(uujmpND.LEkJPXW *dw UM)T&V5%+GQ2{SPjgQ7mvJ0ڱ*[)>˾d}Z6/KֶSވ4K]'43)Qwǻk= EV%B:^e.wBkkuVDU2HwnҸ^*Dwj83G{R=%kcRcKݺ}[]-NJ., MM2eܮdybtq06&J!u]P kc݃BeL?dǩHڳNt| 4p<ɳJ;5e^(!OwjgwwLqf Ծm۶%kY%d}],뛖bj7Xft˛쀓tz^*8@`m@Y0E2SI 7r m;Dph㦖 H w)9wSPҔ(Sr7PZ''nDD:KSYe=9wf"pѨ<ԎHKَn]K#J͏ѾKn۲.ue] &vCM 3# } p Aw# k!j]_oD~{U=Q E3t +'ٔhS<;D{թ=.5cpgsp^}vBEx?.YM%kKڎ7egYZu u7(CS ɬӰɬ=v9p!F,RC}ȑJ%wc쌥sCdՍ4%2/](Vbef·35*b.<.nLyxX*Dyfbo~Eˉp)T!3q{P C1͏!}ݺ}DzNK-ke=lY/^qglU X-@{zZSj`mpzgͻ)97=d gWwSLw9"~C3Se | XىM] >T&z Y)>E&d;I/T޷e.N1 svNP+neu_[uejYZ$˚mٜ@p'{H*w;Ci%b**Cơ2i0 {V%dmp/)Mf8^J V0WXQUO\J2ޙ宱͜N#T1_pǕI m0rNtoyФgӃU@mU02i*6mb3?Ѩ";U>fzIH) /y&^H@QCi[dCց={k^ LS*,  1?Ґ!SOiY(FUuurPh9)g0%ʔ2z`ginPT9.}^wqp$@Mj9O|8 z>[yEF "a"=2&@yܝn_:v:_KG/!*IP6WlԀ/M{${ l=w;U^{d22hpzp>ۉcXw65@;%;f)GxQL iT{zָoNg0 `DjiWX q*2w{U|9yUB֫gU=AF\iCeԮl\ }(Le d xXʛG:8U)TưF ' ԇ{ US]7mpg  8 ݴ"yJYS8 ߜ$iǸϊmB= 2 GP:/$Jd TxLdt;id`wKwy{c )Q-jx7=9c;9k9QEjE{DR nd+'9cd48͢--bm@wjIUܗW\zj*]ܙNv{S]N)U10+ wqp|'YQ,0 MwrP0ݔTʔ(WXA!2JRVIگ)Q$a'#DNUhDޤ* @aOLpew[ pZ;Pθ=1{3'!`93>PI@[ %pgEAP(3vֺGiob558vm1:P7~L$Gbw6z[[VrH쌴ILCn*qƁd#%Q`j0p爬@pHf<mS8*e4!QyM@3 ,HȤl=&C6#M,PwR*uF\uF3`b&NϬ3D5'P,kʄzÍnGDfr7ڰ3эU $?w6m5oG R @a-SLrw)% *q֊UP w`*”|Lm?o"ȼ)W*wP֦Fgc@{PEf]$D|iP;3GT)q#}W L'T& jqOH,C^{5kx F(=b3r%!d SBK/t=L:/mpPv QHT9?Q: M2%'.mGSxsS w8{1r*O*gwRb[}}=Xn? yujl |Y9-_|ʕWfkp_kI=k kN) xbiȆڗ6K#(1OD:k]ObG;&bߧP=۝e|*u{TJ*3ڱP) NxQ;wO+"ک[yh:vhTvC+p. Y٦wȜ*#c`qu9궪u8ɰZ'j}epϼ+լl MqvM;gAe*gA>x\M{8pϣgJ.vVeJǎraLls^vlJ C-?" =V #~ܵ=cG&d )T&IU&IzD@%a.]NQm2bP)xosKN2*u[nrVfփ]-wݐ[[4}때jnz-枆ǝŵy\;Yo۶-ܗ,1k|L&M Wy)W`R%1^I v[y:u7/׽gj_#*K YTRwuwYEF4)ʗ%sݎ!m2Wr糃̽n:|tSW)+AF2R7j/51 ?ep#1&OK: ].$`$VgA1Q82\]e,^nt.qϵoځRT8u~L^-=/=*}Ph Д2AML$G)T[ΧQw.όrBer8~&w *fs7xߪi5(#Q`4fasp^})!Ft~z+mdnD(w|i8wWBh"ix\YRM8:\2۷\0@w#$$M 0p~mpp~wçq6L%є qvTFTL%ujgVǚSH=qeܷO'O"dFܫLRk+!sYzf ai=BSO)icg\j% Mg,casTmWF"O]BeNyI)O1yF|`n^)tƈ;||ŋs;IȫDp$r<]1 |N3Na7<s,'څ aCgCՆF svN'W?< 9.]3{Ѩ`jGQ^=$OAƳ@$bsώ;8%#E MNq)һp|xו0y#sgr?<͂ ?*'!n+{AA!NR,pWq =9+GlSLɉ۫IgAM̏l4H!Z53]f. P!,Qz%$3M?%M2 :G2w{JʼAWkp l.jG%r'T wXYXVr'w>t( p_ۯܕMT;6Q:QLA`*|b*wc;[ȓxgBy0)?k[ {p&NLjJ!q x7Zi=T܍ǜM+T&M.'p7UZ=Tr_*t ѦL*hك6yT&,9Tv v)F( O5VL@rav֪k1uyZHry )'Ftzj]uLQ2형Yݣ`#\wp\UFdbN qջt2.&=fk39vwAeֈ$.-u˭q wln]te 3gZCZ˖tԓ،]R10L1aG 멯.w(gRnLtySK98TJArq<2DQG{R)f7TڽyXH먴4oGqU1.X׳lؓKN习Rd⢜ #`b؆|"YzG-Ґ!zT݂> % bȶw1B<|Ddx]Ј-ݲldhFc1(̽9sq/+˗\rl-U>{Rpk/̉6>G=8G !po v p;Sd8GwtxtM;<$D=] jouFa3 h>w2r- fSLdƶn S!3.]^YeLyMMRaJZˌ('T8Αp ~ >FI s7c甦D#1GQNAyEQҔNI`{w)cU*S"p7#vE]FՑ6f/ gsCН=fߦX}#]w5u<{{b7u=:4N5b8()ZAcЃkD9jَIb܃RM{q2+.S>_3;ZV@@}.Apѡ/st0T%G; D,O ZZջ|rvo mr.Fy5v;V.1W(ӭvL,ڱ}۶mu=öֆ Y"UQx( n2;Sl^a{SoMڌ(Y% *9AێfeJ)9!`$>QRd;G]N$ *4%'^EW^*P6:{?7>gN;~IJ.vĵ s=,?I9ʋA}tBP@QVd{4& DZ %p{1F B\pϏiqS|7cX^k0S}>ǝ!y]Π0p_rvXm!<#Fuй^vvư@|E3} #2gwS?udzWr{=$!è=ۻwѼkWקﻳڿWT!~ބC瘷+v%nʹd2hu('{4& DZ %pP/TF* |y*ߔJ*2*hJXr䊕 c ۦݫU=H{e^8oBQz}i3vJ\`K<ծIcCpoTTz֭` ,TFsvk͍xMɁ2fD͚W5[-{Z! g9YFu1%ʔT&4O\9!WTP3%2~duD #>NZ`!og{СX !xO&pcשXswV͉H=EWb8Vrml#rh\TRp?3v$H(!py1PI`2q7b*CfTk{k*q7,SeJNdb)}ʑGo SK=L׸3xgL-~g U]*9 ޅ~viV4c<>86+Qq]˧n;Fd*=)y"cdQ'GgnJ0cʈwf Gm{dt;ː15$M>h@wwŮBT-tbV !]sX}sp5ktRӭOO Q_ s4zv$pV/+'\rl-U>{Rp3h ݓ^uQ.:r*K.2qנ8d, hb*dZ0Y*.%ܫȲoq:D{h5瀻('0NhsyheYN'^}V"=|q7BHSL)}4(iÙSYeSѨ0K]*w*>S/YeQ;wOX Kk`p')tH˄dhd/c|$ kpۯS~sL#Ķuݸcל E!܅EwV !$+pg5TϾk=|IW a_ۏMɿzȩq{BPȬ}P#S%5OUwiQxkH `' vVeJ~j:^/"v_iIuGRy;e uIjpV'wV !{rH=|>;Ղ{0oߚػ+Z_tQwYO؆FWP:.}J֮5vjb8}?3E:v}nu;6^ءk<w/'|]|vhzLR_;{uDǶ+Yqe7|~:ѡneM}QL^*Uh})2r'pY? 7;).R(!Y;{Z!ld"cNocMmq?ś1{ř8ŹѲ Rb{QlVE W}poZq afV֩R|djXk<߷ 5KAFgz s9 }gvڝ0>3Q1]ʍq: ܁=xyRMH"'?ă \UK܆<ۆDCX?n Sr $=}Zμx<lm˿_l{0ky1 fxҹ5J,,Q;*3b[}ĖfTE#Rphn A <]PÇcNnxWNr8M⻯ʈshP[ɕ@Ҵ@ϛ7 Y)lCe`<5{I,r}U MV/o˽bڗI;=3Y`wFwFmm1*v'wpaܹ[ybw3džϾ=]D;M^nFe𫴣z̍ǝFev`SϙΆ:춋q,a"Hc d/w?SxܙN7>]$j:/Bd_|ٽ^v%x5%h;u@38Tx L9 p. /2$I_j\6U$pgU>@9C{E_;` ~0p_rvXm!LP poF]]:i+x]JT|oDF=éZe@vɣ5/sϋCCAsw_3f@t:'R(!yj *#sߠ)p$1|v!9t>i;#a{݆۫^V5<L|~j@xf}8TF.p>1Fv7Ʒ?Sނ7Y)Ce]ܵRSd Iy+%9Wܵq)4>F(O V3㎰T, uJ8do >2fwi q2  #d| 9d@up6mڤZL}'L63'N؉CIHƲw fΜ vǚps;ww#1WTKc4`RG9 I8G7rį|K2!'QA}HQB GMd{ٱcǁbCڊΦW'2_:F2pJ;syօ_å.Y7-X̳cw܇ !p$wq@E9>{dt; )Cp7q2,{E|&NrgVY: 'K)MɁ<2wqXǧ.u .=rUfʔ0i̘>{=031̅S9v8d@69>r^^ZUt{Jb~w>3G̎; Qw6ͥ.p솄ȝRlP@r[_Yz5[K#pلƑ\M`P~){)cR |e# Ơ+rhO?W^ڗOzw8)en _Hp|F֎"HqqcǿtˋS5?}bԴgoU$ ry'G@Gu]A쁠hY~0w?V ǽ"oVFMܣ/>=U=KܥԎUT٪Ly܅մaV{>IN.U661dFBþ?ampCe8iI*LA]*ofy'?(p Oa i_> WÏ=0}ij w w `rOU 1;|pjH(j&'9_)l-[v|*լKIaLB⩿EtNUrz'"fy'D̀<ՃԜ = 3=~P ΁|^}r̛<Pl+vw CwNb;vz[z*zW|%쬯<6҇s p7|<RBJG>#Œܥ *ځ<,ڷmۖKNLhn{=y舩1kOQYe&>3AR{C܍{Rۥ*Tjw][SS0ǝȑCĨWʘg^33vʣͯ|;c8D;cqC"qU ܣ/8 Nq x>F2RGV{ˁ4϶{{IQsd AĸDž'O); iͻ)9TRQb,NF}qE_2`_|/ycƽ7{c{x"Ce @2{znoK%w,Gsϔ 3ΣEY=PupOګΔ<ʈfxU<*2 6T!y]7-U*SVH:85 {\_fϊZ %ph{$/CyݏKTbtwU} q?-|}n{_݂ Ȧ ,XI{aЩ/T&ߛ q4`m ')G 韪fZ|hT~NrZ6=A.%l!+R'=ۙR;*tVFX75pca*1 WfiMVz3%:5Y 'HܙG!W*q\mn{$Nt̽slu|pyܹyڐ' g]9Iʼ=G{W]s 7=qO\knxo!z&eW `~66ڵk%Y oX=@,On`ϥgp=^P0D jS="gX׫0ö~l(kB7l~/N 8oGq7^~W\q;3b2dHss3ڳ{8W] IiE<ߑq/r+rzV~wY֑NΔZ_vLzwz-EN^}p'P [0YMu((}ȑt?"OK,=䓘=>?O=s=7eʔڳ{ӳmi{= 'xvO1 #&2Ic M34 2?S@& a.nͻ)9H"Q"(T*o Y"MokxbSA :kw=':W4#I !. x s3 'k#*lL߯I e3ww;-DҐwQF!HWN*-e];Tɣ6w$|FvvC$*w`{hvE,2wX.=pO0YVw Y~{AYĻ G+)D5K1zmT*y`p{1Œ[OkwQ\l" 1a"KUP-EQ'NQ'qjp'P2G_1>{Drw>{0o=#"jdkz(ɣI!fpxOtu} aʨ7?n sɋw IҚ9/[TpVq\tےz+p7 kalK_Vp2{fo~:fg y@!^WA1EohJT!pOݲ(*{jwW1u?Φ Hk^ppHgVf6] kx*-Jʈ=ouO%p/7Ǒמ[uI/*I?L=ȄMɎ*#u;Νf{W:E ]J)۲X9^*U=Պ.>H#$kG#_9g[CUs'!p; @;[)9V7)98j?TƮºe8Xrv_HLA 1p/{im^)2`4x=Qijlqv588;S3э)T&yVB6s=܃V=CoE +10w~} wݞ$W k?(ad,Rv=U*@ܥZ]V` {+-@mgԆpqQCF?;˾nYU#ݹ3 {P ;u=n* ͓-c$-_Pd5;k.ިY )TQ~K7ݹsgΜjժH̞{ٱcǁb01q=q_+)9Wa7|xUNhӨvP'CwܩԿ^߹]=^*ArH5qޝ^z2|2UX7Ϡp6 CҚ8ĵXG; D,O ]{Qmpg1c"~g< *cٮ=ԾOj_2S>)qv֔Lb hBUϠU"%2 A׮]۔5ݦNfǘҵ9;G99 bgw-bFA5X-Vi"ĢH&~g]{ Z geU#RAHNqk[@Q挫ܹ-!EN%p}}dx;;{&}=reߺ5c];=wmvK9?o˵9ɟcUެM(`!?.HoS*J/>'d&A]-w@#뇸5gaʾ׿:OS^ ϢE&0aVz%şٴTBebbeqh&y$ɻA&aZjW)KaI@Hr )okl13$4it?GX1:] ,l/$\͞WP(I6yzd ؝>d$IzKy)[p_T|<&5Tct3QZX@=wux Eu-ZEABe&*Oe A@hN2h7>q7ڔESP=po[_A-dˬ6[tyow{ٳtQv 4{ql1xWwqb؆{'\&9)qcsR;M5bY,Ce3{awqOj';cpOc 4;_= [$OXf_rk&cCT1/?}7tʛA"u趽Ά'WʸWypeUI pQO%9@X[+'z |FTՇp[063bR\fLAf6VywSoMA-4E QMg!GƽT'7wuǾ:a+Q*b 8^wU|qwbҸX=$.:ų}ƜįzKm^7ZbUmD I|W{NG()hf? ,v$sRpzNM=z'>ۿg+||BB^ ؚʻ:ɝȱ| !8G ԑ3iFz>HRM/曢gnk%ٮW]8% g/=QOs0Ol>VwX<[Gw `痜OG/*P'))+Y ww_ouE*P4SZ̚1:Ǩ^YsjD{5WasU֘?Rt?XP~|Ď Zo͛Z/Wvɟ<>llfCwĪ}E' $@\uqD8fNnj=v+Emm 22ia&3`}ۓ79q2}r+۰Y+@t;߿mۜGxw]qIʒ6{f*=ޙ#IwEqI!)74[% ۱&ԅz.{%2s ħS)9Ӭ2 <;?Sa9m9Ywr g"=۶=d<[`ܖmp˂t=`"p +`LpOdI**ްw>L1d.ՆBeL6Rvr B)uq{$Q@,{oD]5ے{bLA2ݍ2me#ɯanަPjARRLղ9GFȯ @j| /'Qw70BerE+ްT%2{.}1!n )9op=*]~aAFfw6Be3g!̀9d7(T&3ճg !8zgYt<~hƼ# |-#w;\,>wCx+]OJfŧqףY3&ox+vZ.U=߅څJ{N$yZg *S넑qq\=?{zwj8V C}ƶuq1&|ܷnm?찁{#>}L,[o#@<`83wreԎ;zzZnW2Z}~̻Ki[-WKO8ʱ;k~ށJ&qD96tu7y">;/\;6ʕ?9'PX 1hq9U=A^A3%pUBe¿(`]  iajΒ̱bP[x̙IkW1]R`gyج3P^WSAy&sfoMu"]_'S1}͚ :tV۬c5` a{G pBWFy: I% r+Py$QLaOB xy{‰:V4yt܋ ̧Έ5H#q {͹A2[l{6C"Y S3\ѡCfj-sǎm8|, "me8;j0vfz֝jZg&S‰e I;ŸH4$FsÇϜ9sժU`;v8p 6؛n۳T-cY{CӇy7PV3܅#OhNCl߇-~OZQ|RASFm%yZ?#Y:t0֦~ܡt>)2h:a!BbACYl_~)饗^{N̵F)pZ3p/ǸvxE{c NCUjHyҷ@,3d: ա2Wcf[}{UTTM<GWʈwY=q_|X~pc26#vפ$@mOTX 6l*w dC\M+T^Q gU1bU<Ř$27ڑ"K,Ow)uy?gl{;Qy6(*Q Au1Fz™$'c3*>d1s117?OqFzvܜyf|8X\L .]$qL&dͧ(ǻc=Fz8M=6h}bSfB|(tׅYej*9낲0\ډJXUWPlUYeq<WgWJ({J̯V !Ӎ> ][MU "#Y-x:Eh$p2[ SpuBUf BDkܔβqzZ"S0=%oQHҀhE'wkV}L^m!pX\pGdؽa/Ė(;|5 pGڱepg1竹kM߹SIN9 'ڠEgBBe}K۝U&My7%& % JV QŢ7𛿊U~)U ypG/+PIcW2,q))Q!r\#`2԰ySXp\&"_3ov(/m<$;^htVyьL=LU0o`O<$Rmm;`]^fD &p7dtŨ;4c#{[B骘t臮lnf^s ιS$Dmrp*(Tƃ@+|#grM>O?1f|O7Ooҕd1ɼ7X?rCeٲ*gznJL"JUT*;ANR1ʯG<}wq*vpg2zLqER:]e^*rX̑jG^w#$nx ٶ)EċqW[xi ;Gr l. ;+m5#}! wV7^v[X)ܕ"׋[p4'pٳ.$J)XXh!/8 cV;^vsp߹e̅џWloJ ߫Nʛnq0ܮ{Z޻a]R ;Y2Z.;12U:O=i+2ZxwI+wwYwq;[SMh7gy$PYJ:*qERۚtĦxQo!*U=ΘZWTy x B_p{B}{3~/ӊ#9/?{/;S['Y׊؂Ym[/;U(EƸǦv?nr%!bpox+y!x&#2pwus RI܋bė'Y 4Q!2-[L &p// 9sÇϜ9sժU!wrRwOu#W="ڍLX{8 .pG&bLnR te'yT'=ǝl5Zgw_FgUv'pϪ6yЁu Cz="?|W `1_z7c\q*qp)!P[۶=wbw̛8iZEZ@ܽ2ы3*/yzLq7UBe^`9.1kG\Du+W 0l hqGtR.A ڂ=ǷDjjŘ0f= > BN^$^qg(TНYCy"RDgxUH[[w=R!u]SNEk{?W9C|[CW^};1~c@b-<w@4l^Hp:}@\a֍7] i\;iȕZ>AXܔql>TYݣ;ŸҎT=(<3>RYfޱcnwps=Wvk "SAj[P%0czk+.]VT{{OثYе ˊ&տU;H=*!\=x[c>oO#qwgV*ƾȯzy&`JkhڶƦ pN^ɺ஧azĥRӫdpP}c${#U'5$i;$3>xtokŜ47;0,lUQWBz:TF̘wIp5R6'ʤ"5K"M,ۯ_A}Q P>tt䗟y~ޛnO:'Wɶ8;UM4!pO`UwILy&A+1i"! ʈnKATp~STx] M[Bejw)LvnHAcS[Ayk[:[.,7(c=$Ko ~P[ upW 3!$ pWSƹTݫby&AtQQ}=H P"7 q5ye  =ԌۈF`bwynfil3Җ?PxD9[K5p,O--2b񸙓{*\M !1ʄocOEpKq~ȑY% <#۟f=fNr"}p6&՞RSMjV6fu 9ܿJ+a'ʆA2yh:d ixpAʩ/bI{aMC*%Trwce.׶Ç @wD݈z= TBe،ѕjz)޾ªhJkYօT*c_l4gDGF/xLdZxW DO(82rpg7&Y]ErX$cpO] sxuR<+}ĽǁwA;ºeH۳mTJ+W0cR܍5/Z}LcC ϢS8ϝPUSyh8ĽDM#rD{$K "pqP.1z}]dêo8}Sc/E?US%xq1BPZN7,&C`(pM{M̜$ףlI5N\;&cb pOjz)_ Z^.IzdoJ~BgU0k?&|7pw*TWbO͜A pT;T]I-}scOn^ڔP6#Kmf< j)3ww۩}tkѵOtY pWb<0iUgxgU$18czcY9s$' Uz%&{6IjlQܣ,*UsQ1ѮK㭾dN2+*ຓO:9H]poй;݄$w KbU?>oFՠb?QB=y"{ &̝l#$6Q3Kqd|{5w_*9*;8k}A.ngf- zXHgHMj64T2=ⶨ7-IC\;pF}4UoF+2w^$5B(Tf7ҦeLRݒo?8!*zK{IN,wOLȿ;μcҼ^Mb IA~r(R=2jYq?ʖro;W??MPP xHk!J A alCkצlCXA._Ʀ[m5KQp*R6Uyi)#{zP7Ewspw.b~BHcw(]uB̬q 7/]K>>5%iMMHԎ h:Z\pgϘHA:vS`*'>R ,^w]GHym:gŏ\.q*%ny:)^wCR+3iˑcF.d,?2 G+#f8HQs%[VeD% 1߅Db>|֍7] #Fu ˌ}$G\ 5ن~pUBR@`qb.Z7-TPTpLCΓvezxjDDqJk!Dz;j7(3UV^щ1=pn?xܮ*: Aedo{zː`Qn!<9jófS~, p2"{ ܥ)K$g'q؊K29h9*)Fnj(LOǯ~U}*ET3JUl}K&;1vu["أf@a"fΠ OKR RgF/ZDw#}ULp7U/T֔(U9b ܥV!pBMDJnI-%R i]$PZIs*zEt%{u''IfZ%ZY:yT@C,pջ/=<̨R;x O'{DgԞblny9ۡDVjşDD  <5q9SwECe-Upľ׾p @r{eB2KAuY~4! [ %pWqgA,$; o(Ce&(`#6?~~e!oCf '1xʪ{P Q#^$C ?į t=*z4J [Y2y!xAN* jVvtRP`> 02;q옲kHzc=6YHcǎŷ_|ql[LlH ap"CeĮ^^bU=oO uPz=-P, *ӳ<ϽڃSzᠠlus]kd=p io42ޏU]4UG=9pr-Zlm饗^;)kலVPIS0|,Hpܥ ^eOkd@֭k3 P6 1T18gw_x2aJBx]=JA? is]'N˖-ƶ~f*۱3 v_z`xߥZ&mkd%HӸ:ה(U9QwZfWbOT7^93H\Mr? v0UW]u駟 xϞ=! k:w(_,&geѡG8 e.!w6Q&*.|<1*=HK07T<}s _6Iqmg R0=̳F[{(wpv޽|$@H3m]IEt4cappym石m1zܝHYRwaՋ,=p^j擆IGw`}02wmȄs֕AKC[H3k۷HPB *N =2.r6ێ| U?^bG1L>)xG7Up}tSh#4ewpW[=j"iz ir/j4WNS-cpOgNE{~. p?0nx+!!;Y)*=tG00߅/> S !;bQ/`q9wֱM8spP~%˖"@j 2J (S:\- < $o*ƌXǝ=V-tY)₻(Wp<ņA"z@ؔ2YjF"bccRA2 .dl?*Bzm{.]95ݦ |v=udyh| m՗W,(T& X< Z0& ܗ.]Ce;Aqa}hǸ7  /3;!aG2C<3;WI!VzC6VPyt U>)U+TC?A|ׯ$fYYeW\V0]4vJ}᭭7n n/4ޟ퍒} = ٥!^=@58 \ʭR^w[œGQC}4nqNœCPw!*ׇ<굕3Ͼcf-O݉VAJ"k'wV !$+p4u+] ͟S$kxlԭ ad#_5&L/]Dm@/Gpd{%W{,9="KO-^21k,Y7`;(qAwnWE2wmaGI#D;u~vBLNxG z wx(+};+RnÄ0*< w8q:TFx+25MhY3 |;+kNuwRVw"eppgg#p<&ǝW-a4q8Z @|j&7HeEڶ>;OG\^r1۹KWGP5M!׎E~U)TF?O*S7T:ٖWw\_wvr'=~dp8=rt͋WyeѢROYt}TÐyklrR\pgPB48UtyVN A?*Hp<0V\piŎ=5S{TͶ~VNcDyU]~ΟrQp wY71BgE]r)1a>bfl ǖ(QlOUsw n/|Fn:h Ϛ5 IqBqpyiΨ^= w4 (0{\KpgO]qGYwO34 ,JƄ 5!pkN‚'TF a/οɟ5$é8K;ճKɖuFT3p~M8L ك**#}03ۈN)%4x*'W2Z2T **yfrq{B\ģؖʄ?KCe*N 0E^AP|pgs p- ]Ӎw Nu̅3fyJ8di {H]çA :(x{ i<x{1(&dSUYp׿S:XP6{ɯGP ]= ܫgPkz^L=K B˱2;{۝zY^!S[ZZ>Y)]3~Fq  z<|*S۫Φjp Ozg #=bLd*#qnG Q s미|wNq:u5k:).R(!Y^GXU () E_|2@\p4QyBeR aWJxtNK߀{hԃtH{l?4L}:axd.iU'"(j*L Y)yZM==HBp:o4L K/O( v|t  ՗:l='M[N CHVR 39(~>Bel鳗h;6Pw#2&wWANvQKmȯG^VnMC7'{5{ʃw<ú![|r#wV !$+plPEpw¥?]<̵W1d`qZUp_1Ce'$cHW(1kSLT&pO%ф=I g LIPB M{l<qX1JJa"|^pzҴFQL{=?{Bx̘`#$ppG[Rʉ }E|&NrgfBec1c{Eo=h4MwY>Gp!]%TƾXV,hiȮJLqDœ *4%ܩ98JJ8袝N?^zAT&yBKOw<ŸWzi<#pSk c_FB4q׷]KH:=jLXPH_Ȍr ʜ31!W),  7.$tg>|xkkƍ׮]o\օǸCb <=\vOïȞ)'T_qFRqi\h*ǓS}_r{@KZY9\V f3ARw/syhg5.՗4@O5?JP/~{$_4hYJU!5gTE !0+2:߹n[:xpI *RlSɑY`Rl"f#pAqЃl +( xϞ=Lړ2lpj(w=~wS6_po:cԀ:hm { fI\Be4zrd RPg@e4$Xߢ޽{:t%H(!US{ pWFsw{b^*io}/ nj]SYϜY5t% v"HӘP!tD[,gq^n߾}GQ{ pӶwXU>hpPnjMwp:H>~O8=@ ֽ.x;S_u=y{Yrz jыl}Ԯ5U/ŔrBet1ԕ.S=fO1;Bq?VZ0mNe+Q{\π>q{_ pǛs՘Ik/Sz-AA6, WwO{8@3H+{xf\wAw6]m|#ŢvdfPBkG!='mM|􍁏~#4~ewLO{q2~g.8 ;.fS(:?75!pOѸgbq/PÆ1kG&1 :x\!tR*Y| CHVoCBelpr8AE| mdP'oAGqm".[p_h]vR\pgPB_sTܹ'II=ysRVm?qttCO?:湇niLşGÞ}[^,n>ojrQ| prhr')惶sbq-5T=Pp홈תLh# <# y,$;g'Tdp!KOբxΐ>૯ꤸJ8%Tb"P sWl  Rpul׎gw-4F?֡ } ~wIXL9CyzUY8MݠJq'p+KON_zݦKe ڡ2ϕ.'d\pOBl0Wd8w܅=kDn"r}ƌ uNqgPB)T& 7z@(9ܪȊ{}0^<7(;)T>H^8gjxmlT6ȝT@_*#D d2] m$!:sYz:^2fU1Cy2e;^Ɲi>z}ʵ_%N CH݄D|0#=aKdCw3^R2wwBv<$o-T:\HYNY<ʗƔPĊnՃ_FMjUzv1Z^5QfݵO>9"wV !$+pO! Iq A}H QS*%2P } qQ2z?j" cpP7hy;fyvEd+)U.K)3 <{x/mG2*3u5kuR\pgPB&TF|;Gvo0)X* yYAڤs&=g R;u+SE1, 9u#:hK/j*6/.R(!YyY5,b)_G{8d.:`\IAk=cgٟqvNoM`~enܸqԨQzT@f<]T}&JƄ "<5HS:]{"whT<`J7X!>i$:pR\pgPBz2 Soq^2n7R"S v'z衠zꩧOh{D+ЪыS*{iVW!׹N,$T˗/G:R\pgPBF&Yݓ$7JT?Pi-v67? {^p0NpL#ɨppJ a=(O1\lA38 , 8@T[[nyܓ9 PV't4*lweSgFlWZFCRʏO.oFtp!_|q&[~)sͻ˱gnJ.7>A~-y}Ѱ5|kBTπU%'[}gQwPZ(ǬQIҫ;@1bJ )T/ܢ1Fχ7bgcPW^ g9]駟ޫW/ܓ cǰ9~O4dogEggπ&ga=8g_Q,\W] =ËQ ܣmTW9 {H;]Mw 2 T#ꯕCbgjEjD% k_|mF|z9mW^7>/M4y2>[ZNC_:iIn8[^y'ʈ#:OdѸָ:#G*cS&XzZ #F:%pOz i'UIpd.{/K. ^ĉܨ'|ǛG6]wyb?Z/>9W9D"C,:IcǎqJZ{ Hw;thi^Kd:DQy,HYAp~`5<eo~~oB_G:;Yz_|f>huXj{PoTWQK&jEp7 mj5xkD2lIG iCX-^{p6N\P`'2 A:[6k(?>f̘[)m۶ Au mvnAZ[TGѬ2ku 5 9ETE]e%BHOE*3<8-_\RH' {1i pOj"'p#kD^΄h(bܵ7<#GJ ke/ ZU[%O6G>Rp7gII {HLi&'9 ^-5)9/|M(T䵕wY"yLw#7|gL/q 0eLd-ںqƵkת_!?qs^x8榓n- B{C<_= )\G^O:-D&VV5$T`..,.w{"5Ee:HFgI䋔9:I[;c|M;x}ɒ%;o޼[Z>| d@6doK3{t8]цqvd׸YR:]a* Rr9IDAT]wQJ ewf ]u򊨲dɔz!_>qbtj tJ'.j-ҕL];Tb4=nL{@QjqU;w+33~&&5'?̓IL̤ΘtPHw|ԉҢ#x@M P0BU9(G[_\akڵ뺮Uj1dk}kOzv@ uٴ?>pt򮶶?zbCV;v{|ݺƝx饃S1*l|裁p4u--c{OS--p—_~y~3Ԁ6t(%&bw.FEwpO+BP^ܥw``tv_y "|e<==p SMq$+y}GJ6σ(wS^ywO=s'?zas;N~;1zgC5QGDS=jwʸR}88w=O}njtLs;G<@_YO>9x = sM$z}0DB+.neeJRe8zEr J '#]OIr&z5#=1&ӊĘ5|wϓ(>@[y6Z`ʸ/}t7p#(6$ =_zjbǏ:?\:;_;/v}'vq<[qwٳZ,6f;ׄ|BSXq+zmc^D19_y[/`/N=.e'[hu߾}nݺ555=%B-kwG2`ߊ˷oNϡҰ9 Cܹs-ٻwo8{~y\p/U_w,2\JOI?Rp.3xg˞5.^ N`^ݗf3M{*yۑ*QwI'BszLp$g}|{ A< [[Gwʃ;~*" Dܹ8CM2%j' Vk7G56^)(w&.l}A5,O ڵN/n=zϼy~wvp}85(*]d3DQb=Y•ܥT4fp+p/LSeNJ,Y(;Qƍϙsg?;5石'w-sS<V@Lܱ=wrtu- O*=PL=T>ʜnJy\n=RKggl<|O'sO9rСC[ ߫opo^pᓧfEgSd\=?3T pSq/㇃8x ܲT]q,)o, ܰ `r+|c ZRw;Q=RHYL 6ow!8qMgv=I  P1*lI(;hXqw$Nxuf[ĉ4I{KftRUrY*cp"9 j@QNlk (T8۸[ w=9Prk^ip#QV|+G?p) g)؝^HR;=JybT8Sqp#)xGNIfТV478D8UÿutZnipP篆v-pąt p74P@pEK|ٜer]߈|-pԋ5s[Y*jpO]$׎t M$eG4ReGReTgU>g ү=h%bKAhθ2]Qt]mLTۑ*p6MkL ,?^iQ}2 ~L`%W. EDdrjY@;' k.U^PH:Ur~Z|s .WFOO]Qόz&fg7:[N{>Uq §Xq~7P +~JC;}slnsC8ʠhG2l+wWav\#&ܔDݶ$1Ij-v$!"Ė F1~ 6N~6GLEG_whR ))3dꈪs޻wV;$x;pwV²gڣ,Ɓ_$gݻ}o+{b*^o'lPP@Y~ޡ)o u  1:A<ΣR뎨*q(tE( oQY icipy(#̡(k^ݟS&L+7nČTI;F2쭻bŊ'yrI*>;#D;G/^ 矏v8ݽS2sSG}TTcTU ?g-p>q-5|jDtP|ijoN.:BAJIB+Ly?Ƅ%G~Q(Ǐ'?+%'d5AnP\[Lg zqYC&umbGi2nr{_p'^-w-~Fc T ɱ+X4f5&gT|5vr"SXI'%I$TkJh*v{"ؼ!4}!ImExY;! Z@4#DG4w]wv#k* gWɍ'jIޏx;1쮍/MjD)U;H&13-o&F:ipy>oQB:%(-5}CH4RBBbmk00+|:TnQ&͔07BRpg pI*J \9,u\w?n)''LRlRZqHlP LipיTLܞfGW :~[C;SNu~qBhQ(J$vhTH DϬdeFCb5e'=a]].'Uq>c]!( ]2w),涮RچKږ'-v=47\vyg$U w;*ҷ7%.4K<:CSe^Jg=$6K".;hԉFȭhw奮M?PĺLIA4]E;=w'+`ܓ*UB c_C>~kJ7LEnflM]yx#Vu(GYh0q~)R]9Y.^|hyi i㙏w~=m.i1yӋ"ʛC .Z>_Yq6w)|.w;bm /~|I,@L^rX̔}2QQ,eGXj.\gq. e\/o'd 7<~uS.zN6]VmkV&x@!8ck}Z_H۫Q"nTԌ D랭Hseћ}[PwԷUm֓*r{ܯ~|Cj]wq͜9d~T%j`i Q壚>1KeEiSR=UP?isX~BsD|8_@|>z^6]W.P~[tKj]$\bñI-r0:qsItMTj$J^T +zZV^pz3~ԭ{yoONwox/'/[6\rd<7 smZDz#U+GmR7 _➅ꩵi=wP(wC1=ˠV+#=ܑ*DC u+@ײu̦ζq!-:Z媼^[r' -:M۪Uۜ䙶&ZwʭzɗaUux85Wѝ5{\'q>G +/Z _-P=IXڑ:FRTw'ގg]}J^&W BSAr^=vHԅ4g\I֐>Se Ud`/^ɖՃ+,/Pé%jV{0]@l{:bJXim|UXqj\IB+io*ZeCSlW̦-joq{M?7!p})DTt@A.yCk\%.술iDGWΤ9dpJxNkRF.t٩;$[@KaS2jcK=<\mx-~*`, # 2U®bur4Qبp7*~j3wm=*`9kۉ6 ,d ]ҭI{1pWW w0f @puNn+{^2Tб%%5]. Z>䂌(c'LM+.I$Rt 0rS$6(GbF_~9~}%t֍ޞJ]?{ ʹ pO%[Nh wTM=-ln"6 }] 3ӂHJ0 у=Xk+diX$ KNŌ]1VSs&`6s*!lԲ^5]Nw`PPNX%#R ER_XW^JzI*/RKh4)uՠL\" }=U,qɕ֥9TM9FkN܍ɸHe`[W: U:מun{=wHFc6#˖;@A!Z<w>l/U@p <`ʜ۰U@/fMo'J;Þm2;:DateO@.SHsQxB]o=X%N/uˎHQ&l!cp׋#&̷7jlH=YШQSX zǝ\"i 4[.|E78w[@pK<[[gggWW׮]ݻ~X?z'zVݷ( yٜF-~˞lf|ϊz6\} {\u+={nEN2\ezU|ԣN_d̅#PD5ipӝx0sSeBY![@NvXQwEWj~IJ%ͺ$BLbK]v]L՜Q?PL鲃$ΎܛJޭyj(W;jBV osX5hs1_iUS@X`"Nٺ 2@GfA7@; Ƙ<Ϟ=s!F5aM|g'/éNݤpkY&AyZ;!-*/*6"c64'tg];P ^x2@T E &+ F $@Ay2-ReUR>Rw`Z=ZųhZ"FNy,2q]ZJ\^t!L鲃T 2dA (P0a.Z/R=ר>0n.=~:BpsN3SiŜJ|W! X1*]!BE&k}ή srRW'/qM DN;7 %[ip7T˲kuA2sheǨ -*[hBZKSڡS_g*Z嶉hLa"UFhw7 {~56QipW<$.Ӳs9{CT ўQ)nܷXs rlRIyn2+j$ V3_c<|.Tc'o61G`n Ai2;AP{ R ]ZUD>{ۉ*wc:z-M\k065GfG(^]v4*#t|Wa{0 .B H{ Gp/s cd_yW˴) c>}Ml՗:FN];WPܕ &цz֠@#A[y}N -|怛"TipO3 w7Tdp_ɊƯCNR\\k07mv&*gRW_d2Ő:4@^ ";&棯+21.V%TD~C\+  4rsQwײwz}ee|o0s-|---lnº2tCWz3 s [+n$CQ M7. J~; (5*;tPReA!x|@E݅rŎPatZUp'@ utt۷/'wT~dŝnSUqyWm3%)NT.Vtr6ӑH>&*HI<5l%p4wlP Q{{{+KԫG%KWo(Yex# $vSLŦQ]BEUU@ A(..q@(A+ A6(U @6{P H(xg$,J ̙3+5RUԅP 5iPg j$e=(ȍ^pύp @(Kɖ^%{zZ%(Gy5 S.[jI@.{ @(riVi,pXkNzV!gls@đ!5NT ]NjS A\*p6]UT;ᤫ!5NT.'Q9rD71(/po yrv QpR'*p(Zw^ϟ߯_?![QD?EG1@wރBX9]UT;ѥ!5NT.'Q>cƌ{]("8L'6 b+S!:R#=nkΫAm޽hHcAQtQN_>|/P"x#h3ԩ)ZC*k; .`}?ikl*z뭌q,Ƃڷoy6Bwޣ@Tλ)Y ujs!(OZ}Blu;w\h^foڵ'8 -6iҤ)ow6w!CD*̾qw+_)Vۋu%EDq!p;Q r@ĆԐ:5RkHeT w~݊|>/w<s0`Zf}kqӿw;+ws.ذ-{8o9ּ /]tǎY|MW^=zah^T7;b Ox?+aEDq; *Cq!p~p-(Twnmoٟ:ͽgڈW~e+\5OO;p3sܷΙֲlcM3n_c|*@Buv_ a:/jΫGbmϯ&SSDP @(PtIWtϩqɶ毵Ovä{a5J 3s~:yWtG7~塏/Ո=O|ڧeo,tK,J&ip'3Ozm&M?q Lzmk'LYƛ*{~)S Ӻq;h ܏v :9@&JJc[ӣkO'bfюqF@W6]ax"^sn8`T#y ((sL#F0pNJ\Y#O>TjAxe;)ȒuݺutGiRʯ6>rBQ\񶹹ң|+L|w# A(@"ڽ熧>zg#&kҲaҾ[^߫w[@v$ /yZ u-aڦ,ol򴕓&Ma'OJN/Q1CЊ;0p3f UFZL&Hl1bs}G} {8~ir:)@,孊5LmONY.eMܙp|}t 8 C=%ʼsS͛$TQU`Uw(í1T1U?B~x'{+kiֿi}?qZ#rZ/X_[մ~ON^>O]gIԢEG6aʲW&.>beS>:eu6P([]_gU7뫏m#R&WZAY6y}ӦM<;zYΝ6cxs>|oo3 P1v}%ي XqVR"n;OѻxGWso@mJIZGi8$'FzϾN>jPDb\-;]|yg7ߞx8r2PW'>$p\`IbND0,$lYixǀ;r%z Bo}w`hu->oFq|6+˅;VO>5_gG5cVo9jfߖg: P1[eT7xcر,ǝ,R2N ;L.:8!.n? kʈO1R^V'ZYT1.~l]3Wjx{muz:I:~ӽ V 7N]Bd~˅}rȰO }0h\gBMG;=JTiUy+2pV=ե{oKg^Khoeg[?jȾ _x^bÇZv/8Zyԍ7DDS VˑgG9("\U8|)X#WTAC\N? YØS(0Yo<0gcuu~amc76nl}B|myAk{T~{C:o%jwEi﹯ɓ]MSҟ۲uVzhSY;{:Ha2p@/־;J7s䆑efWZyCTKkGW>Bq%K:$ݬ7R9<'v 78azu?{9V|U<(.~}{)Ԩn!nR|TJ!H^L]\C>5Ygl>UƤW4ᷖBk;-]vѢEO=O?WaÆ :^{wIp8񪫮}?*'C U;ydɿROiv;S"EMPDW6qWW+';N=hȗsS}=xW^Ą*Os1XeN|L:(D۶m裏i7Z#X`… -[F?~z{Ew@2p1컇I")vh;x~7"۷HQS,ŕM_^A{<&|1NwH@)1ܼ .1 0l^iƪGwb; ܻݓ"m޺ooMJ)j"xP @|*ps?tKHE9x~Bw5BQ\{@9(@[w"pݻn?9E"(:1(  =yM_E(" y((w{AįsOkQA9x;=ˑQ/y8OIW@w2РAD\{]r[Ap d=@ZkF@Bl+2 TT.(p/ Ώ+u4`ߞߩoV)aA(=@DPFBWُ3; A?}w;>A( ]F5ԁ9R΂^z'O _S]P @\+puy(=Y#S'_=!.0ng+(kP W s]pUeпviIDATx^`\u>6ii6P4m4yI{f ҚAeV̲زlKݑ׫juw$e۷^~3w9gΜ "##A44444 _~HdqqMRRRT@#@#@#@#@# ^~]^^^44444BGhWʕ+JJJ7@#@#@#@#! ---%% @g:wȾ}@#@#@#@#J! !!q̙|!&+ڵk_<$q^9}fbbb.]:y$S!>#ncNSS.= *Wd~|2IH A@?k/S{jŘ{:pLJW@:41B!!y@H $vиҧyKzTttݚWAHH ]y4{nn~[19@ hhF˿}t~*`'@er+)xG@oQ\vw.ՎHܾQ w]AL:d>3>|/"@\ [[[D D^ANz?-ld{^x|懿*!A>?8=?8aMܮ]{K)~exS+NF¡CϿ믎6׻:2 }gq_gtڵ ow^p(qh9fϞ=Dzw>_FG~1v̧޿셸HPUB>裛U@HI];7dϿOwrr^u}WB\Éw'cҁFFFF`#o(q)×(O|A߀D>'P;GoրoMK<}m 5v8} >Od|s:@hh@Aw~?1#>P죏>Q/ڞ='h޻o{~޻o?}w~?D@#@#@#@#3`0ubK*ģ7|l3$ጌ>kjjO {yPY|I5d #shDf]+Sf7'dLɉ~ D\@B߾)wr~_ŎCx xp臏q:D"-w^)9m*=ez S1[&27)SIcic{!2 EF@atx o#Pm 88'2PkTxuyx7C8*!tx= _gl12ʓgΐ9IH ^сFFFFF9!4Dz޽{7'm:2" M,:] :$֚V_پ4444/#RyԪW0[*AHJ~U % 4sg f9#4&U$GlD;;R}QC#WJ⛺˲\\Rqr!t6ߺpM*jOEM);Q&BsEqnA'R}SYodu+ߒ:m=³ qccsGkm|Y)۸xS#Kՙ%kkSO^KɊKknm+L(./JO - nmO1+<;ÃZ_ґ哘Wl6j(t,1 5]Y[UWXSUSU M.lI,,)(OK `$7@rcgbxI[fgTbjI[kU'1+>36,xǴ67'+nSDG"R᷻9.#*::8ʨYkZd)I_4UedMů髨dE^>.n\o"N1sH`76b.l&oce.dexᒴhNMYJm[Gc}[?+bzr2^Q;nbg/-%/sZɟdcPX<'-{^N,&=iu{yB;%qCc{?WY\W=X묜-ms''Gߟ4zC;:PuyMd?]0۫rJNV&ֶvFL5 вR{r "m2;FF@HlFHN&ΫVIH2G o:mo dkPL646Tɘ!hțmKcRSB2W֏hj VUQ-!khlfޘa~j:^a羚o*sۭ+TKY]Zٿ+ԕr첎MX|1fՕ}.)'tU+zuuZij Mf}Y1p W0 Ԓckbd*lh0Umm6Mތrb- \dLoJ "Y.'D%~ԔV,;Pmuωf72=WS)$,$)!ꈩԷ󥤚,Re[]S[pJ`F@EUAqe]]CS IHMWT*So'F9[8*Wfr|2I^>Ef$^_2#Cζ2_uo\bКU՘ܐz)ePh2 xHnBw-t:ׯ__:H^^e /KSv\_PVV6335ݍ8 2 -7!))) ,\innNII+$˂ L;YڍCuMMNn.Ι'!Č?44:rm:;)}V{zUBɷ(҅<RWWwM͚UhںikfzYHhddtrr޽{&ۻ8_7--%%%|044tvk }.솅ƋNH;wt4B@!uw fq;/ + <^XY2xs޾}_㹅s_7?oƓ`*CFFEЄ#;wjk``p=! ---!F!3|6%`/L48`hfe14\MH_|_?3w WAqWi$$`ѱ!>哐A } zQ R]sBy|N]zqꫨ9*6${HY geel2Tdy؆z^WWj`PflԴNZBt$Rkk{EExh''Q!YFܟi{}輷TMH}Ͼ?46S߫i$ޒ2x߈rr,GzBpAȂ0;FN%`Qü n +J 999YFBUS[!EWG5vsQ3+z 7T!, 0v4a[]MYY:UK_gg_JJoRRsLLMHbHGFJHC HH pqGhBBH`&{͝]+-S+ ͤn`?˞Ѯ~?ۭÓ@λ{w I{<#m/'$ `JRVWW<P7z'+@n𹧧 'FAF a$ >;Iے^t:&!$pnBʨiUBzѣdz bMkU֭7}G_*(jl@H 觍)?+2:qdd zB~z $ܩw 44)0a%( 3:))y_Qq )\hݦhGHm- $AAD%dB@MlB75UQ?:_7[;^f}|^/Gw OBAhKwsRAal5GD%LL]I d@@ x~^A"^*B>PRdD@N PjW|&Vu8Dɪ &N ` PWL\HFK5 ^W։1`5f:&GH`=11 ʨYD` T05u&~\ӽؒvBaO{oo;G1y#wvoME44t6 (S[@NT٥VW. -*pT:t ZΣ𞑑AEkI`q| 9Uf#B2r ANt )9Z}J{!QhmDNkiPi`I`Q}-TL'&O栟 'H~--wpUh`08/WZBt4 RGGgUe5OxhZr89 JZA0S! Dy]Kn%ck"!o[~w==g}vGץdyl*;?B*(j&@JK+ѓw89Q@W ޴3P T T65 At tRHW1F@ D |w8MPEE$ ֋!$=f5,I&1 hV8ɗZ[H,#uG`4>qlZںzz@LҦc@##Qbbd%u( 0wA؃+. [cq ~㝏44-nE*/]/o]ɛz&R^~ 싍OZ'$T\`?`eeS]:DP1 )*b,[}#`qqqY5> ]ijM-NUe%EeGƄTSv4JM[GNY%$*J:v>ـ"~F"aI>9ٳ CG23o5ޱ/*:_P&vݶcO?KO iLG^R?P#CwnI<fjp:;AUB fAn!,1k2f6Bz7w_315 \,?~u0(l#KKIM˶vaFzx޹8nZڴhx rѼ8 N#3A (2jEH{D.x-E[HᖓG>os]/j~ReD7"*қfN>O_7%czIHz'$-wsw&#H<( R#Y\W_Bbj߾׮ݹ318xZTt6]&^"tThQ̼|Z/'mDH 0\.ڈiK5M Xo??$7u}}}YAq_7"$`Z)F &>!Qщ6.!%$~󎺺@d`w XwwwDK ϵ>>vgCUmRI|etx(N*V8"S#5R~ykEm]k+wi=%U} Tn`SQ #ӓ{Dr2:hbbp¢9*q}4!m*FMtx5\O.''`jSJL!!lGEFL&$gxdDŵr{w-=[ʗ~?fĂ-!P'{ӕUu#vgx+'"!ȂNm$t*@4o8Ϻbz^uוye%"E3o^6֕$k$ct+zIej~ue9%S7{ uDo'z)U{Rts[37=,L uoݐ>wVDGIpk-!mOgE##) ?nbbC\>-,,~SN=!)+fE}863涒gNc?츂<b@s GI4u7[yB‘G!b-wˢw*KŞGXʾ„dcclF`5`{@.oB6Ӳzu !Yu2,C]Cs4O=vmhRmTs(KT,-%kdWrKey^TgoetVCbOGe@v{*!YeV$u/0Q3,SqQѣGNhYޢ iG th}r`6o -@A'$6cTZٚn}ZR2$r%xkt-kjϝSWh~NRN>NbW{  ..8/ϟ?/&&vބ4Еaz];OZJKble;tTn۹Y9+5]Jsg#V_3tt\Nmu[%/AE6kB4L% 5H^_6-rj/SQՌ.jjv9sm˪KqUP4ƧΊF`"NQ>SKKK._p@$d1!Ĭ;&Ř:)zS]!1$""$ x $$=^ipKsl7&%{_>&**.ۑw;79*##Õ5! st.`i'yJbq3 bbB#zYy[|)I<w^TՔڐ!ԱpFU׸ *fgPLI_w{Huuuуi *;k{? zL6"QIeEK gtgH .q[5ޠ~@BW\(V| I!Z :l7Ytm6nTQrqgVIKFB]s"l(44/3p({ ԍ%$*8BD` I5B.8 'f鰣Ɂ=@T;ntehhhPqD844444ۋZBRT 8;^CEr:77!)^w/vrDٗ;結p媪*yA_) @4444ۂ7!axa TSϙ3惶1po'-v!MHpfeajjENn%>z pcI\缶K|hhh^MLH+rJ ,/>x#BX0374ѣgGa:}5j<JH+))+rG*768633C!c(4! 8:FHHKK˃g_Gr/Q${x*-WX gh s@nNVffdÉʒª7 ^a`h}|yaLêҾ{Yͽ'S<K8BKH`FMOOs1 '+ rA2l }H:jQ/깷dl/ yOGsR6.斞rםrF= tL2}4, :7"$8 :+tNN7-Kn*5?ǴK*{jbmщf/GۗÒ/u7e-'f4fREő/_2 7}SR MHiJ|Xxip J_ε\;!\OvLЅ2 zuԓcfR! AMa` ;!ޘ^6b xEcDfnn[ $fEVv1Á+/OlYZxpXR(PO!yP٭kbyLG?6/BZu)Yߟ2ؗ1ԛ3ܝ㦮edeP쟞 ppt`(=r~~% )~2kˆ+^PBBaNB(e"FBX=؆* a1@?~ 81 /@uFAA]{s 4f!٭Mn smW/;wN~d8.2N3ms'}p633k`_95 숈PsL!Hu啉ٹV [ I&TNQՉLPVӴ7 Uֲ0־m y?*FG.w!(|%$tA-'!a<tW QSZ 6IaB*XAMYㄔmf xH<\axx,44|?s-j@N{LAhr${_¢zdΘ ?^4J 1 Iڶ'[NliT¶|SSSCC8P6H`g_d']O-MAAKCH;eKcG!+̓ ]i|^Iإm0g<4s^B%$ZBfDJHBD 6Qm}IPBۭVa' 6ɰP^"$0S9l_B5ZIHCl%gX:kxy o'!;^|Q-!SR?h//!Oy!tk$ %%$-Y JH؂vBZBڨq ̂;8y cupUEO!.\`$!M}: %E9!ElcK JH[*g:2 wowh8fE`AgDA^&&&{`"3=!!g#%$֗N^I:n.7KD}2^槙fv}H\R o-xKHN0AƑ (uDIy4n5Yˌ$?3S#ѹEM=0 aVqT$,䑄03+TMlu<`LiБ10R}SՍ> *jRr~i 7~!0KV)%%%000""'?1$Xrѧ~n$qҥ&#2ɖ!p^a\N 'A R3=f~E,=Nɉ Rp +<疞;%Y|^U3훊wDZ+(w% k)H1bȰ\ogn\s@R_H/BmʪY!Vfeкh*+ {wƧM Msz_7:<1srd{31!9O;xpwǟ/^o^chbQgTߜ|} i I~x${1资FBR#ss/WYMb4Ag% D$C&BQPa6TWJU#pr~CO~mo|:G6tpiq$$wK֧ji  О%.]S{,--{ΐK$D1tsh5qڃ@ H6g?ۉuxTFDC6 zQ:zG3JSf:~ÐjQ{DoܤGCoGpc-V#MO_G}mC77Pf{B=IbOYѭ$FPmvC9B3,d8Đ,:p֍TANg?*0= Cս+ 4۵3ll.]WXxw]y4,}n2#5zsRqm%sr:}MrgOa'4LOM*!%ZzTFPm\BZ._-b~nqtHKˏ% `JȸjgKS7//7}5ܙ{4Jlhd>m`|B"؄DVF?aD`V1D] r/906&*\9';޿r񤯝w`Kda>LU5x{]2O'C8_sz`tȶ{ؓ&ʎRU-rO&ë'ZpmA C31DŽ;=AR$7؝e8. . 7Sm;6|g6z !Yx˙uu, "-(4-!EFyS⧿{}ʣ5d¼ShBEH5IN}Gb2c4} CQݖ+RՆR" #xY߷:8F%Q >LO`gWeb"ޘH2b2ǿ,M, l&,h&"oZǔ[yg(MHP`vX\?f}'(!Qqyv8-<<<2krvNG[==ӏU'w>Z^SQ\3p*#Rv,̌$Ǥ6t6839cN/Z!e^=m=4;SzSdr۠!QzwaRiwH29̇ <)3=34 Tvq!ȴ5.ڟHH4!=;oX> cl 4f/\0z؄p!"yD;K;MLL5gj,#2_"d5BZ貼t8e=6qRzb1P9θpѸbQkeR=諲  yjk{W8ܔ#{sTnW_Qc!ZNC|Z3YW/麿t!fpbc|QPC5Y„-=@ $ƍIDDP9{ )$}N6YH}TV%`BǢr"ryY[ c/3eby~~r1{x8dX/&F5<5%ۋNNLMS]XQِ`&8SPBtTo=>voi7p aNM"hZ<P vBhD4!: ZKplIHHKe½^F/KeWXX W>疀+fff 6D~/9 *R,/ RWƾ58CA!V;r&g2 0TET[-F"FD!!@ލVh`t M'$0R5/LrIi` <9`+OƃI( _Ʌtc@1fW%فY0|DZS@VV!nHHēLt1ɲf'FN"ԽV~R^tC$,O,-޻yfFc<^ ؄4ɘ$9O'kZB{vvB*|B@"Wr۞ջ_f!I4\1^y(FBdoO쀂m:F=%$ N< `S%}D"N2̊΂l$ Ny|1!w8O'V;џ .ȊEkRUiR qP^UU{&$2]SY=f%$%b'|Q1_Pn!u?ydζڨ[EOPMo)6 ⓔPJ ֲtiEA>Eѱ)aa)!ΖApzfm5Ѱ,l|mqEyehp d-?!5^UxҾU M8,x9_G _7y )G, !xD"BJg"'!i86vP!񅄔p??>bVHvRH@ku+vp,(!qTZH^H{l b\♚A%mَ䤢һZCJOdLJnwL |h. rS1*jpW=y+2kr[$($7MEN7#^QGeRkakV /|Tl*U-!3%b : /F=uxdl)oB>d0 >8zTߔgq%-΁uANoU=q=|$$Lw 2ӄ+qkԞtP5:5a pC_i=Q\}⌤I)UI(*{=!iX^?.Z⨥ciihifcxLFZB'^IR'==AIΰEH-rJ)5^ B^AE;!j>JĖ&5U ߺ]?,BqFGW "NxIJ2l)sMnۃPF<  ,آB&@HඥsjjWUH-d8H,K-.DHq K1)FVRT_[TBP 섴5Bh1TP1FԖ"ie"0=0B⤈5 V+N0uIOtN wɏ*C״ ڛ8pZ*3,4egZի$B&XAT[B;DvH֡ o#!}z%$6Xr̪EH30Dz@O^*!9ꋫ"P{Fٔy?UћF$% Ui\DHچJ/zMHń,e<3;~+ǝxRϭR{{i\pA=^GA7+?iȜL?+> m!q4W1R pW9G dWs- K33P5nLfLZAfu_So>Ch+PUUvx!>; ޽rAp%m,B2K EOq$n2\N}xt{mFX%%#}} .La=d=Yn^Y\Ϙ,$u/.X^^BZlXBB3$$zy۟vLĒ_,K+H(*n#BBv?(ʪ}deU[Q:SMv=18 ]m*j~"+lhl09<63GJ%7]PD8"-;>$ ]kU\!@sUpc@_O]ST@w{ de'!ZOkJ7|ݘZՕ5t0Ҋ*;K<*ZJS#!kpecSrSPDFK78ӒR:a%"@g} ZQ= #B lIbEsP,@>,8 ^h8Mۋɳz)!4D^,TLL0 n!äH# @H \X,_{GD'}+p ;B|IV[X\;GT pF }`얐* DA휧A8-8 ̺2l!aωΧwL-#}-L4T3ۇmlUmIǏPCu=0̌xZ踘]qߗdfld @׵e?\u\`TOi?!q0A ՙwhK-\ &A8⌆/!z  x祠섈1^H80T`IH/=>u** |5|"OUv,7ߜKD=! N{a1f@hЄ]v;wn>O= qцvS v /c[K%GYoJIF3U`MީWm/-ee)ηr~y%Kc4c}gzmSZvK@X,?fxA' w7gLⶦۡ+T-=6!6ÀNwB I3 !OSG$.p)S*~7Po <_c8/NZ7Rofs̀$q$$@H`&|8TowaТ/B 'bɳZnŠIqK-+>nE}`t}<(/djץC{S}+GǤYWҬ~^"$gp %> Tv.n+w)i!={~x5w!6ķ"FD~ ,3$riYOΚ!+p7Āb sȼ+jfu Dsա^O.>jr1{!<ZE)UraDw~寥|<#[ogY$)&kO,>h Wv-GR ilOEzě6({'V.+MH[5ζ֎.MU[VY/o`![Qbhbcdك̶476ֹ_wrtP5,Ȱ՗w;iUmicvFuT:J#I;Ʀ+6NJJĴZONʚim꘺ZK*5 `"Q{B =FBYMAP%WXHHgAT2ETts"!7&{K/`pbt"ڷnĀsL"߂TNO*K^N]̿]!:jSTɥ E6 qy B O:63|CRW㭩!5 3].9#bu#LW !Es͞Nf |[)Uo8nk*znMBꪳvnR1@f߭ *7}骇u*+6$PFٷeeWq,M07+}mz.ja=6rf^N6IWV6mVa5;}NN qnh LIx5H C_*Ln[H&$HH +/Z#s̀~l4B r^UOJ i im^&{C/V6H=$UPeSbf!Ȝ0gâ'NtO| /mE!ַ}_4  G\RXF\{(i^kwf'=yQ1#;GCU9 v yIڲݴuBW2Z-$0lHf}Zy{m_K==9ix[h!oAmvvCC 0o$Z;xetCi(Bn;'vH"b(M@B;]vdvr*"x]a*EMh%lzZϬBO$"=zJԩSKKț)Oo/!AFېTKe[Kd&:h:'OBz{VYIJ+ibAqG6uhLB9c8ilH2T 6/*p653al\@EmԶŠցKP48EF+UDA>e>~i}If\BVM88(,ٍUPZSL쒙wjaFYw2 uf+1"*")^G_p 1Ufw_(%^W lnkp2$噜b}M%} Y%&zy{NXfEuUY[OWGbiINp!BAĮلrdoGcʹOX?10*NB1;4gJHIKgURrqג$!QZi]'cdkA7hVbI&!gQc!gEUK 8H_ՋN/+ ppKB]Z M)nh+qrҸ}M H</|*_tT/_o`jPX]beu ?[e-ʴsRF.7| Ffnn !G8$<`cx⨊Uxww_y|Ceǥ#:yY>pzc@ooI?]%VֹmL")!e(44fV\X3[fN"bTR_wH@q=KUBzFs;A|S)EaV.(I)z44jSPQS+*ִw0zdx$$=.動 {:۶f>%$Ƣw;JS{?xσHV 'Go{=|Lؽ{lG'V\c,/wM]BOcqe)+IOFKZpn7v/Ύws`k4Жk 'wA2RsqbVD(b 􌚻V/HvtNnq3V4q3Ҕ6S& )))$)DqhJDy} $_U],K,]RoBʊvL7suussrO()8_ \X!b~x]ὦƗ:r_tuuaHHH'(,d0𡤤з?_A`pwZDK| ,k64M^Aqgcb*dUBz<Of`\ugsᙵ]=2vͣO\<,-!VeX0#l,\]&Y0 r]Mr,w69IO517e}GVV eNm"T]&gz^]'̹3lڳ ULL tlS խeƔD(ii4M) 4S23WNHv:6OEEBMmS;; ek/svvex:h@A:j꺖> ʶVG*8oFHE7z)\ xBH5S* R60ѱe_3^ozZBA3vvv1yեAOUvelkpo>Y7R"-<3 54Ք8Dg;h*U'[ߒT*%礡&*F^ J.٩Ʒܙ&NFRT# pf:Gggk,W>ӕ!{QvJT~VE=2o$!t 8_c|J0~XCHSX'mdJ=pӉk[ Gƪrcyս#]pls}YI!e-'CNwuN5]s`J  L}(3}x,<nwLDH`\~keoÑky!^1 $Bﶕt3;^ 3V iA]fb n;2O9eeM1U1+&HK`]i"(ԓ.<*ʈ L)opX{ED``jnX'IHwˡ؂5Bȍ +aYߖē[{2an-1 讦44YG,k-iYeU-Յ9!#6%$ʪ8?,)m(] []V?Vtw6TԗA1Y\e3#[{Jc`#*?20(9;?-B43CSU)4=@F Yh뽸u'$U6׀cخDhHLy8ȋn뀤^R B-_k``XDv{OKaaeU~zim@{MRjg M J)(*;ZB3]=O 2 %n39d`]EH - YBBr1ꀐ.\Ww ^"^^uu ~͉L'"Džs$ND^dABVɩw~eуsRB|%M=3 Y{yk9$g2/FF8jFOO`\`.z OJHnZ:ގޕ-Rt]C-l\4ϟL(%Px[O\|hGҘ5HfHTB38&Oxeaތ9H B̎31JRyl0Z[%A0$ʔ'2'W_{']l1&:$"o7MTPdz23]ml%-BB,퓒̬n$ք-. g_ea@"z%X"gdU۲nm]si# G,3Bϒě.cZ h0%,*IHO3 7D_:vu|G4gΓglABkKRvspt YB+$!$K,=\$rI:;ttוӈ7'$b%V7%&<\QE?-ӂ@}}ڜPO#]eM_wkƎ1xxJH0dޗzwۚv[KH$$;555s;Qnj>ayC#f>̂L+55נ/55m;mizj6p0,+>+3"#fuN~!$ɧ-0(8++!cDH"D3,Gs!+&KtxNl* a쓐zA_O>Z*c e<9xt{vnUmCc;ۊ] 陠u0+OS2JO-'N!if,B5ӰcR~MR@O}ACYK@cێmT__ =t HHpg Qt@;>!(=oSX#׺|0ގ]3C':hE 8zSBM3qR$8%C2aVW_}w^b9gU'ulAOqNxrұQ.%P/7qSB8]@Aɹoe؞7 R(6uD9E !Gg=hi^\d#}]'9M鶍Md Fڷ-z`C ":hXʫ9]I<(b흅oUB* T *+ -eڏʋv$љj}25?6▌dl@zwTZU:$WOƪuzWQUWABL>cDH0]ys]X+X(FEoTj/:B4o1_.C $!Awlٸtq KED\_;G"h@j@H9R9 ^KK?uB3"@S0Op.9V3h $ !WY]_9̂s:O:vvvGOgs3bz]U9QEE1VquGξX{5lpX;J6 } niչ!W:kb "KYFDPl "@;FSa*JGưUIU>tSީM1rGE_6/yT+P Rj~*]}ho«@H6eG!Y$ f͜;wvȫc?1ebfzfȞz>|ȈӲ8 (1ƒ E߯/1+:+!"Ad"@B{ O^avm%e[Syzj:Suga+i5,YiGmT!$E6X^ˉ'X{H'M/) nGs2jm[vjFOUv|j(E΃r1eӖl֭N>!qɉ/ğK3TK-S;$ FIHFFFO*xj)ҫ(! B %qbAxyypb%'H /QՅCH%Bzæx 77:rp/l=%$зõܔ/B@gC(IH$R391"$;bL<Gm2!m>$!{tiq 5}y,7`u\gʾzU5%$`r$lol5A 8)/]bvih,ݦC"~GYфCH0=q%c\ί򓨏-9[ώ̞~xS!z LH.m}߉:UB8%ΕǏ@pZYZ+ ᛛ~S̃)Vx5yi sKXY- 3q)~z{Sf-}855=;>$?Ofp&;?hBDĘ!$pR W0ڏ}'섫f.uS+KBկU8TO P*-^Ob~.cSBc]ky!Bzj"TY&y`'Bz{pNKGJ<˸ ?MMK/t07v[ [0D&9ua*%iEt-K7%L0e.JItQrh6\ уP4^*HHСfoI(Ir[IHWZDU"k !A}C-//V=4nfDg?ݵxd$K'jB P],']LZ0~iq٭Mi WW_Y.wvrIv][ԔXoهfO+S1ZeSK^bфD LH]&fiEwXifffr+Mnm}t8#!6=`':~u;AN 9'2$܄$`} XF'bKH1&$SpQSceG{] 128&;oO1Uo_TUVYT򼆹UIOk~vA YO_K 3cnJҷPw0m0Лl)-i'+.nj"L2Jn~b޽ ɮʉt]fMNj-Z"d#fƨ"&ř& SuypthhM[y *p:ܑc5$TZw@&^~c&$/{Sl!{ۦtTgKq x-9)>̐{DoxW'}T&$*(8RmN-yYI)ǤnXOH% L1Pʪo-`'u0DBzBH'] kE`Ox4NDΜ0 ]/!Qd埗NQ'_IHp(VYALT);<=% 쇃$U* `kEC  >ƀ\F|?XxhSloM l5@%Pa*U<7jӔl+???vcz4n/BPM gr7*< ́Q D"`􎴎@U{98dDdT?u"3#?d̕sNߙ}095dw{{gw佩ɇp {SgOl~0=9a'&痖!+8?:21Fwgx`W =8:=#R(7ik;]=wƦG:{G>\>h)Nig;Z9w!a/ sBM8 $ eSWRg`Pna7=$Q@)j9 (Oa'Ũ'|8>$$pǃkHHȕ-FUaQ{[s`6۴x ^hŸ7ŁĴv_>Vؤĕ¬xUKy=7$@w} .&U"zLxFx- NGP"7=pCHDQq[pNN޲bibfWHRAAFu(+V&zGi+I i+? t ;c[B^S^{r;!0!!%b\\\KBc2(Ĵ1%Bcu& %z':{]"^BT[!N0&D8F'HBZTptg%B3%§0G୯/! cF3l$$N* %[+`"$j ldhB|G$!o}rPlA;!!MH"l A(|O~g)))O]-y S@RnO6~B>y.]"^BT.4! !$ZeǧױUv\4(^ oD~[XTREH'zARف"Q|"'GRH`og/\B>yVTTP;&L`J?t #! P[ 0}s|5CT᫉ a= $2VVR8RS’^L =0$5~b1 Y~84{B31YY (i מgmͧcTINcgr߱dH"$0y1;6 `O'- cFb2f 24! ; p 3lvY}gD4 wvb`3+y^cڰ.x {V]~onI$RXY"̨1s( psL#B}bj+j =-)=q!G00d`EAH[YMUF'n`Aފ} _sHHx=fLonj_.dhBt0?!$ڹ*nlw >Ot>le\YRG!?O嬋֝–MxYCIͰS.!psXT}_åHavZuy.cfsHyB&$<[m$[#_vMMMt/hKb%DfH ^xbG`'P()S(h}2N_glglv3(8C6-hj"{++Ѻы7*ՓWR|FPcT hhV3x*`&4?=*怐PȕߦCgsy~2lMHύZ FBjkk8 Z!5Rk$wJFvdc-0G^452w*0 dX4 !X(@ͧ8 o/;,[߿l<ލz_[[L~ݫyVذ1C}ʣ@* xṥFBb{Z:œO@7Ϸ8Jwܵ*tN7BksG}%rCBF sAH`}*"_2W<~۸G1Ñx~ cI~ 24!a<`7.Ѫ#@ ĭ}S`JG"&$w̴_5z8|K}*2kvq:yֽm4j 6>}cֳZ}A 8xRO.dhB˜jpR(C$3Rm٤hh i\&iTWWOI077?uuB|j$-!%={v-ݻWLL Є*K:3F@8g_L7vGt/—W BH/;X;}HB{tû>?kxxw_i i[;gp"!%42%ǟ( UBOl2hh IHpTm:Y?βVBU?Irrl,6}i i#=Mώ Bʁ: 6y @B"~IN*!&\AI_uq9=Xk%BRHl!x :L i vnA쑨h@ xhgb؎OhWX(DR!; OJhMb+0 $'(Tma.aalacDvT4B=\h/b{!xB ~~#hBlW1EHlAaOIB 0fC WjJkEk%$ЄsJ'Bt/~]bٓ47~ 9;J~zi#Ğx]sv$$_*;PڽO͛=:CtBYCH;;6pܚ*"+nvx? X~=G"$!3-! $gtZBx#pAÐ fAKHAs=5%KG\K"Ih_;%-!g_pٷ%*uxp522m_tKdSXt.cR,BdNFD/YSZBRpS*&O}N + oP_T pG/Q }>ph eqxn+w^ϠB\FLka+ i_*qi=~LW$"2Ԟ.dh l;&pi+!au=9ƯD5Q2#x *AoƘyvH"$K^nĤg@ ^! :!!$X>Į&QiCcG1Yj%K]$ě˄_,Aԟ'.ץhqA VxRO؝E0F8''&&^bʩ1 {{{93cR&aMƇ< i+U`ꍱȻU3,`z V$Aى8]攐8kPHc/_.dhűS @M7#7Gू^;ܽ9@JWWJy e ĭ@*^*'sbcI僕EH_ |X)qW8lc+>^Є7[m$$p^ vB욚`҄UHH###0нggg:H D$';8OC% S/h`JNN")&~ F =< 6 ES,Փ ia#Ohp~S4v9;~B{3|BO$hh/Hj΢ci3Cΰ$40BK?+D13@!bE21i/Ą'x欘~G&F-xo#!dz c F$ Q(~G 7v+!B!/6^m]hje3O{~_w|Ա<2j ѦEz邍n WM{iLɳdE8AHi3Og}28 n!aez.U;Q5f(%h_@NdhBj _usU%SSSD8h0vB;0cף&#ZW"Z`41" #;w0: Rš5^BTwqw F.hJuB(Z}=f A&$q<JAVBK9xs.lb <<<\pnJdS )vBt8<<ʋ 9_?c0nشDh@c 4! M!ݽ \> 4! :Hs|:M.k zTSOYl~ӜE8U&$>K +4NM'f0/ %iBK`ii={޽[*bbb;9t,04&&ma7[3n xb___qMZeJ—7ռmToKY(W}}G͠'؎}بaga|?K "@4HzBx W 5Ą@Pyh 4axxf;A'|~ho^?# *yTv99,B;Օ{!(P{J{;::֣Amv{5| NNN_>ݨ8 l/4FF˧mmmT27eK+}tuf^xl/ -0/ C5DS' 728mv~'o: 022z N!\p#- >#.D r'׼v-!ѮSbIH D욚-39cuޡcHHmeDwbl 0>) :!`hxOރ!&- kdm%DxUJ_u"Mc˜Y3*XDXW;]wP#|Kwt9 &lmrS4OD^ ~C9WLΪ  ̫zI4kNꅲ %rՍJK'FE Ci0 h0>RgׯB.[TOÌ^^(@x HIH PL(5!qn8q9* f4.4Bz򉡫&K~ۂɌK(^RV D2PCh6B瘑?56~EH #BSB6CÒ`R3 툐@s l+8 lPm@@HH=@Hp B@FZ!WzGUUUkGfX$|D4;D@z*,@gcd5"%5R۳gݻE{jjk]= J V1@û@a#;i18#hN@=mp@H —8 ))5#U__/|Bz$$"M> GSؿ19-! Y$tZЀ-XK`WI՞HUi#L:F! 6f8Zp1Ck[[9wg3F p`Awx9RO[܇%xGAm]Bsd ur|{BTJ=McRύrldJﵜ!n/BU 0mF7n!i&4>\ ;e}U) !}w܉<14I\Z%$2ӧS7؄r!CIBkn ʓ; Brv0ђ;0:{B8cygB uMJJj!/?5[A i#9f ^<!hƛ=WXx3ݛGoJ\ my` sY)vB z@%C8WOHAuFN(a\t&__ mz9 7>GWmyԵ1r!CMH<.^;-SsX3S'wsK' PxfMS*gث]N.4`'vGl%c !6__2_^+Bj]*!YcBf -? gHh1tfAO]2̄Y\.H#i.P"Ŗؖ6XU c !RDxHHSA]]DH~ȣ[[3B~~6B껟V2P2s3/lSϛFυB $ᯠSf¢B MH70 7DDD+2{} S<( E !mEB(: 3& A8+\ vtuu嘑mJ XQmJH[r!MqBԐߨw؈lQOiyNN>)oH*%!# dxj%$U9uioB&SDQQ#$AQ cKHxLx$K1B>f:;!Θq#Vken:Ea S!hp!%B{w$zMHIn|prZhzRܗ\.z!Ax;nr>%Sbc#*ac} 7 lg35!@ C ΘB::fʙ -fSBüF/!q!OHc=}$'ݝJ8cΔP|ܽisiqwbGfD Q2}w CN?C] Q]C'{$Gut? *krjr/6a"PPИ#w:;CHYeg0D.*pg+z!ņ{ZDZ5vªKOH $AH3fzUB25 lWU1G`^An!Mߛ6\ *;RBb)f0GJg禧umF:R8kxߝz8)u԰+n[S4q|Ja|mvjlL}e&vSpoO3"$Ϛ>3:gq?y(C3zGzghh۟OPƎ*51bt7;Μ9Zˋrss*@8@)8 ^h8$ B#9; Psz} mB7j/lPc/$AN79˿hXP_`籱M[ǯ5_y IFR!aލ< 5Պ=`)W?4q")!!O<(?NKlY%AX?ʊsVH}!2ccb# c^I`fƪW6h prvcޤ݀qff c 6n3"VRDHq)!$w -8 mwB4]E牕ve111ToVX#!B!P΢Xt MۋNGc=* ՀUp{.c\P% TYjx~'ڂμ0(% D+ú^~᳛7tdž8`>Hx$A)(,(>^ثݭ^'!z #{!D $P/w$Hdsh#'!aColGf; YO/z+sNAa<ثvAe!Z_QuC$#`! xث~ d"!=Av_ 3 A`2d)QVnjE>1$IuL`>MHlA=fiJH[Cz!a+,lt o3uS ޜ&kV .QЉ InxzLلt #8'xuv/N%%.)$+@ B*!QQ=Ie.`8[Y=@H V>>`>߽7u$ܭڀ\zzz0GoVjY  ~__b8'vc'܆1!Dv>Tr\[ - }=fy>Ė@^bBH[ٷX7@ZҨoqz%' ?kV?1ZgM@HXKěɪbb'rqd/`)ٰHK0RR "$2 Bzl'!Q#aϹ n,`gAHu _ΖcP =V& = .!Ap(&?-++pDXYBDTC %v( [d٨<[.@Pԉ\^TB@iqmG1Zr,h7˼!#hhx.Et A^\: $hB}~Y] UBbWD!9EmUt>2H@zzV47^S7TʛӽI5q6.;6 C+Oq̙{u%EH.\O[o!B%}C  ?(aHlQ\AxDUC 8o >% D$C&զDWCT2x矋ʪNhy07%``>0naVh/R{t: : @wfMgw;ϧ楤 vRIQ3c/KIկ=EуrG`D ㆌ{puM1UYw>ʕ83 'JEeo*;t8{H1Kg7`+i>&d+SD닲,(` =$t %ݤQ( 3KW^E^ B}~y=MIHgr22l򰶝nDiSYFFFB6 }C9'DH#uYw{ ι=XI0-,.k}<7'o)?vNc{Eui1!9!>hwNGSEIB[cuYQiuyiɑQרJ:=&:J ϘLcb[ɿ(A_hhp6mW9E%89$iHwg Qϐ:ʃ3:CZEH*d0_, W>a9V.F""$xR " l}?;B )֏a ~3ON琑!=ksi(,wsίP j1 NCQ=3,]|s`p-S€ßcIHho;Ҏg |Ctb"]$hTOԇi.ʹigń;3l ;y7{3ZMY腚ʼnvAf i*B_{!$qr0`ctSI]ZBF $rrr<==3uHN[/!րF%HBҐB6VIiuiq2,0!9}4(a ZZZa #z:ކ2ZZ~zf9-!E)DYߝW\SRlAWdW 9ƚ[[gxx#F] X_qyK+@Hψq'XV6ćV0 Yr*2XT@##<KH^ tjxxYzgə[N}u7N?kW`-a.]b_sK@Hz~L K躺6!˺U!{5,z.ʥյtu!BZȒ ]ʴw N3Oi+W Nt7v.jUR?H=tY HD,+{_wݗ~tn_:Mb8("  2#2)+岐fga&I@սvY-†`WWאڱy8=*|9?~-Qv o-l$ffEOy/Ȯn-o$4wg_ y }x{~ []eIҍ} 6 *u'H廄?"bYוui;S)s@FY?#܂_8CB$MQ-$LLFGh_n.fJ-/l#Wr$ gHĆ>CnD\hI] iՑaΐd ,,yD_[;3~=F$ }4 lVTF˵qiqE{RK_pkп{56{Lhm}amc|ٽez_2 b:qqio1@ZZmHr,$c5@ƲnIJ&NnwoZnOk0_<@b,$YJ9C 6"Z+ֽ|v~Pv]P)ؑ Bs+j!CspUsIj4CA$V4A z5xʙ4 I#T9Rh"DD]+aDhh(l*m{KMB=CR!_}A̹ѾWTRRR 飏>B5555 z 2U 7H7'oEcO~To~e8ugfo}mkxXb"RZT<ɪTիT*%q$+_ H5@R&YMr "sbJ6I~!ɐ6 N䋙t)_9:1R2"4BFD⪡"裸#IDkK͗BwPW>RA_il@d/zҨ֕Rh jﯴPR-i_Ȧp##6 \(ea雥 -4/ -5@xL`ĩD $g Hk SDv2ތu9CR=$mK) ȏ|ekTZU~X>&AԾ ES+MSRn *.Fp9WJCzlB Ɍ AL#HG짱l-r[;Few va?\"2+/qPܾѕ,W{Jb#ѳwgϐ(Y^dG1 |zH@>bۛzLуsFKoImAë 6!gVVJB^'ocYJZ_p{Hpwb6LT]#DsHe]0W!4R`G&|G-Rvג͔Dޜ%0ZJ`vTuTcaŀTYcT zlBl{,N@_^:v<]?yCDeƙy^Kl_ 4v '&cS݂IJ0FJYH*5H5bX d,;@me@x\wph3IvwYM"h3* FUX3J(K v 5k;K;]'X%Zs>=5-&'TQBiKXH x{PRx]0L/2  @&pκ4<B#dշ"#`be@q:<2Lf u u-w.Y/H«A]}dF78,R2n0rOzl܆&,Md\&+``'&BkR%Ή‚U?*>TP haIUhōִq 6WX\ H?c.,is:]K wxfcЂ銧ΰ/)4X84N&2CE(XJck#&WzTiaI!Lh.&9[oEŲHr΃H]9U{oYmMO$<@Be:e{ 3ʯ]5bE(hPQT𛪔PE(@ !JeM*E/BHU-&d0Y_Oܐ_~36r UKE5PR-WV"ehOb+@ÍH5*\j XHcq: IP3P#^ >m 4Bps؄ZTL&\@Dg HҦtƴ.J7-wwwXu߲@G0.5BRCER=p#~ϿEvp &wW6[_T)B `006QpՍ(3b@")@(b2Rm!8V@m!q}Z?>Ct*' lè4 SSSS}Uu݃슜uUUU`PQy  GFF[ֵuM9 +s!?#* `o<'${!?{j_HKU#XHxKH'❮aרx+c䍅ܡ^qFvb(@BX 9/MR9wR{\.)ӟ62J|IDO`-;iH㌆\xF!l [ L zv {lnmmm%мIڙ^N p*0fU9D@\֑O>}ʊ<@p6t : ΀:s-$°wHV7-3xB)jvϬΟ+ dZ]$$CEĊ*$ gP RXTlIgmcvxtIdlHG{ sfdÕ4&#9V !F;3o'cqFc2uᡠ +[?Զzv믿 ߿vՀ'2 HHΐ V'ވ;mb~>* y/sNFMCo^nz}Pgru+vq8Q5H$p1֜첻ɩAmv-r`@>C zwJ0nqLXPPe!mo{ 祰Zm ߩXޱCi^Tr( a<]qTP R$09j ńm!Q!60ډ=؄_fle>Z>l6{÷kw c?H2C * YHi8:?󉘯o1eٕam䑖[7\q,s/((I4щe^Ui_0=# Z3#IYH`p gf?N@W;Q]] GMxri$u2 Is%q(rro8av{[B zBX>xP55 O%a=O˫R#v1*y&"2#d 0wD8coo vѻKMq|,j|!'* !ZHJܿ0d7eWr.cŖhLeBTN7=>#6d`ūku<.mɑ2$Afa<SSRRb|R}R}|}}|._c!`ҚCȁ=H}-*U9TK#! JJJ<Dys{=Jz 6 1C0ǩlS05\3𶋷h,JKrqgHwmHD㌆ lف!wI,X޽Ⱔ,]h?̺~^?Z'=u9v? U~82hp[`˶=OkVp30FzS-흜 0 J ` ۦF,@Rĕ| xOQK'D/˦+䐈~m§rB{mD+'F&,$ex ,! PJʚQсy e5/3x*~r"D$=D"A,+2Ϥđl$.w(TCat"I ifi*˘ShbN5bd@ Q;Q0Jmt@ HMIIc$${{{-5& HN"H~R\L ^82;4} rD?Lb8p`9 0 8H 7J)B1 @$8=rs#p~=&?$8C@5%AG8$x^4##~~n~.>vv̬`׮r!IV.nߪZH ߑO|?MJ迲XuD$ A\L]<-VX^v$Kɕ;n,yCcǎj{yA`DM;OѾK:`ua@RYY٣G ]zzz[v;PSScgg:H[v8EUVo$" Hi@¯d8p@X@o?@><9|  f|ɦB<}lT7nFKnݲCZKA 7B5H鱝MZ||{N _ք~*^b2gHs$32gH3`. g͊2{׬%9񔵵~y*@n2 <7os<+`Y6, Jt> %e+2 %r@Tîq8 >˭=cMĴ4Z4 n' H*YHD+`8ka.aS~wc ]t Idfΐdq[C_ƽ{|57!8ZSo|3pz %a;(IMun@@Z A,S]X&[v6OXkڼo,_LC'OZzOexC9p*+L~ ֈHwz,gHÍψddxɓ'%'f'xE:jȦqQgH5Y 9)-6I꺇Z >>o^}ۨ x4ae&BZ.6Xʇ=,No3z|y1#Sbnlx t^89P2*(e3(xd9ڷdNiE{SNT@ j:ډp1&;ÁŁcD^Yz`H/^XH/Po kH-ecz`[oE( !) /y'3h[W`}|Hh)+`rLJp;$2@fZc` VZ1@X /J247yTnzaD$/OOF|V)h$4 ͆Ɠ+@נ T870 A/*;BAfʎ/bKW'ͪ!&_ʪZz|!,/pQƨ8 0 's21n*Z(4{忺̷̓J(YVqM_F)~j}j!" )MĽN1IIʝ!E9I2{c/ʷkmǴU9[2UVc1r;d.-Y-z= @P}S:SvW94=\SNTމ-RDsUۋ >Sٷx^[av48k?( 'c̝~u Vڲk+w觔g IH˒CR A D_O|Hi>NM}DjXU,Xvf*oh= J?kۖ zaϐiŮ1E}l7̙^RiA!w.Z٤7Խrƹ!\hPOJ0N7xC0 Q7oE:YUFclY\;y ߱P~ Һ=90Wjj)@3,,?{N12)HJ#2^xM& %%Qu=:ϟs M7U43}H8]&"̦7aog[ooKw_NaLog4HM-z&v#7-YH-eQ }8Dwn|騰/Rn˭|smc ~v~C=.]e)I HކSX˷;BPSG47ʞ~!qE6 At>pT8m|ؘUGN;3+6\5lymk`:؄40rĶ-xLʰQeUQ*Ʊe( ̨:E'uPw>کJe H٤@g' 5<Ç, i[w!oO(h.rfteޞz&M㼂h25>h El&!] )JuwHq׻ Nvۿ{ȑ&3~w;fNip!8$)бII\$ 7h ̮6C'% iv<4Vi[+5* *T~<`\5utޗAh$pD9A$"3VVqT*4hr 7nsTZq X (=DMv~ł5O/{JJ%V+,<$ m&c9 } [b!,t 22#Ke}f%%U cA86O^,5!AdAD(m6i<\>ȱ~&'FFS;+\3T@.I}mFJL\>-f@x }kݽ=!" C%A؄x:j&Rr/eOlB L `=[T^fT%aן!]\o0{)28BK .X14HQ盿HK^py\ H?._^aO{xlBvW#V=(/0z-aˌo-u oM6U_EXV̦$6?( WXv4v)u11c7|ngL?zy曎phUՉe sm!X)zA` "vuxp= 0 RY HsTH$%v@k ZtqgȊKj$iI@)\u5\JIIwyeW__O(ao) lWo~&B[7&urST=pHR@61!trr]-T\5UdUj/H$JjWj*A/ jXMPbՆ/!QC,=rKqFVuXh+P~uƗyj1a^ ʳd3"_,,f{#N_ kkݽyG<hHpA{ҾVhgVX dClsss?`-pр 4‡$C̀^-/9;UqB4-@,BRcb I̵۲Hϟ[>IjOpPGҡ31~rWAU*o < 0l2#Aݧ|лG쟄'X Ii֙vv#4csis[j &{|~y<2E~5%zf@!!2=9\4%Cq.8p9 &yDf9p skvN &T--ţ+#΃8;HVxZ6Rd A FPx'ۚ ̦$мh~F2qYX?T:Qg8Dp122JREUeɱ8 v)cS)~';f4£&ZiOm2{'?l|6:W|=,n?1ǎLkʽ{˞G~m{nt%': njp[ZF. <ކ jݾBm^lN[ ܪ/T)cL.F4Ψwnu RŢધ˺+WUpYa^W' ϜYN=4r8S{z9¶HbړVogY 7 \t{SibkpBZpN~]_P8Q0i9!$0Al!; %R -: 5(0T&(-g?5Z8pcUqƨNCF<6U<*==SN- b h$$e'Gn yq3BaG~uƹx%<0|{Ǐt J{\2Q8K` ) Mt]If$#7"eoӞث]؄pBƒ@싱p;:cdF8i^fv,$NXpcL٤^@Re'ˎT = qc|2:Fz&FRmW؄x:0pH !^_bH8g[2x#qy X'l!I:CwܺfgG2K},/_<_1PmwT޲sK&z=yfF'EեZ9/Uoyڵk&槍|0=Tj˽izQ_>gaeflnaanQҖqɋ=yf3l-;rKnwVdk@2Im!aH&Z :&wXAI QcjXf`."3ʍ2 8iikl UVu=}\Ҥ骯jhj)xKUUm][^ >T٪'&[ynO[?xJA]:&>`jJUBRSÑxQI{D9@TN.U;jRQ 0^SYMmqFvb#3rX$̠My=(P53_!U#T3ز[XvΥJ kva[CT[_kB~,8^FR Hل Htj$Kмǀ 7rU@Z#@z TWW&%EH*7^T9[EM2L2EBEkW9)*JSUSF53%ìs2*RcyW*qfBh C/N2bC/21iKUjT'U/LmDd30(E/p AgR(f/`4x֫8b6 $ {^ld,; "1Xi{MեGb[Hv-nMZHJc,pȌoҸ8 HXN k = j/PaիW]# I:8*H vH4˺ymKS{,8]&"*27TcAF$ͣBX @,S'bMmq`w*0jlo_zP)ZRT D*92;dּ۪fFA.|bP' uwI?l$~ L"I 0X@$!i_|駟j_~!HjgHW{`` 1?rztt\,5v9> 2|W,cR.OWbp@c✰k1?3 * 0w}c4oٶmxcuVvBk BΝ;15<yAf0M%@ژaUHw޽r :sIÄǏhgrr_xx8\b߿%trrW k:zh!^eeezzz|KHp%m cIě:$Y,0yi bK6 brn}}=1"""0 Z))) = xRJJʓ'O0uVss3!cLSSStt4F?~ \ UșW  ĚmllU z}K/ɏ16)zj02#ktrFiymla)rSTTԵkײ{,6SH]mr@Vn`iu@AxA$Pڗ pM ݝuuO!!!hE]2!h_;UT#3FS!g6]Hnnn dh')V 2/ l^hnK!M0ÓÞ9W9qD6;99Nv 7Q6L0X Z[v...~̴ۃ+;Y߲Gݝ]'d2t7RQEa*.<<ݻqlm8gۖX˿\}HLҘ{X/rz aR\񱑉*ԕewNs;*5 yCCFʫ{ lk1mv1 ˬ\ܔ;VG%aɋJu1 ͭo8ҽ)u{r7#/+z%- G&8yay푓c|[Jpw?LӻBbgOicvօa~2ro]Ik-KpYYW 7?IG}effqtwj>}wyUzGގֶ?ޱkg`J5s|,Sk[:31. s?;|Ay'/ji{.; Vdwi^AzND+#]&&&+Sq]M+69K8mu}s%34eݡ[\rKLm9~.vYm lM r;hU@uM t ۺisrt\>Y ˄Tl{1aX H\o~de燯ӷttKdʋ6 Z?_QngTTVz犥SBKk. Q5ĢRcq)@ +؛D(#k/u𔒊hSjdiL|G;d2\%*b:z=x'rk3շ*/E70"#0[v(O:˗!Dk0t= ߘu&,(K^ׯikEF|61;{E)aVYjEbWPP L FbYΝ^i̍Z(^ITgtFW׵a \ikQθI0&#&{YSXUN 0hR (mJ1[5EG<|]Y^|(ByV7%hJ3LKW-1//O|$uԠjpÁ Aa ֶ⁂"+Ï 1;;[l!IvG3N k#KL 0Pg7h9 ":&hCbbbhh(A%e0x8 @†YXHw랬srrVqք%Lo0xI8H0j/v(׀`D9C3d1`8p@ #s"b!?z _e,$u5SF t]/}eeS5ͬЩ#xH0aoIbddd1KʁG~~_ق`r3:HN< N=.27x=06% _x&gN=O \(s/_\ шpW> a>Ala}:,\Q}'}!_}_:ffK玞6Ω,|ߨg7=s{`Oӓ|l,,Μ?_FSVy}.r-$0-4&^}R¾`S{>>71*Yڗ[BAm`~z]/5Zxׯ2ß 3;js".XE y|"wT@iN 173ƻʬL[z+cYYEk_]gߝg,Nkޏz]+t䜰Z;Ze5 :Swy47\wv6{ϐ2[ۘQ8ʛ,KYY1nfAgg 1>iM-MƕGkU/6fzXH 7GŅSh9器Ŝۮ!2$RU_e ٳsZ_ 9tM.>nw2nˍއø6[ui*sԳ!LyT0otzvDZxxʼn*{ 'Cd!A@?^O2ٺ29=#I{E߭;!ү56=և:}}'Jn36 }z7%ȻAlm.D^"0B!!6a{lmr 2.յlyHצ(xk]#KCsaiI߆ʼnj{Pp R5K3[[C0pѹqvƶ.D"3zBR  fe꜎*jʺnź䑘pxZӦ:s<]2ˮeAǽ͡ICC׌mIDAT|viL Vw_H+>azBQuKna7ҼCYX\* A|PΛ}6C#<o> qg?F~ÛqGp~jma3bqBD΍9^.>>79H409hY#s\.$+\n3b_n׎HԐ[HHWdz:+419gz5_0Ge!)_Ԫp7V?<<<% 0`8p9׿`O?Ղ:` 0X $ 0`80_WIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/sift2.png0000666000000000000000000042052600000000000016047 0ustar00PNG  IHDRC=sRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>viIDATx^G;3={;ofv{g{fw[jy{{Sx(CQP($d0IHHD\9'"ˏׯr=77xkxZkZo~G|M:>??_5駟/~a/ymo xc#<'|Rx≍(O4 Fp w6ƀ71o <@cD !C{9ƀ71 o&uqaϋZq_x遆W_}Ui~kb:?I/Sz1n^ƀ7;0p| }ѰP6cv=z!c4 OG w?Cb,GKW)C6k3/ymo xc.(rp|h w QT$琇!qz@i_֖/i74'XVZ]f׬G}% 1o xc 7X\"֐A/py 6lgZkҋ/.]v֭[뭷r~|B\e7p4wm~*J~O[ց+kQ:ZӨʾRAǟyQeWTŊeOw3E/UF_Zo{W6ƀ71i `uVp|C{X9n~-[gi…mԨQ:wڴi|e끇~vkD ]ֿCWj[\A6hلIZf*𶚶jR[7dmڡ?v$$6ƀ71PK1"K#?}_vЈ#nKWv8iٲQK.Uƍ+8$=e]ć,IP;30TM''UO?&KU$7j^Ut-eRƃz&stm== G{cK^xc?_WapX%򑟱7tYn]s 1FXvuڶm/: 4x[/ @q=끷 2і$?=K}YApѣBO0&򑟱@Oٲec"ڴisB {ZxE/5rȂ]vY :sa-zae!ak1t! ᄃ*iNݺ*o}% 1o xc `yV͛]vVZ6 GsܠAxŊ 7"]>4i*ƻgB\`27T57 {&}` r>l7-ƀ71n*WKD>s>?"9nX4VH!!xxB/ymo xc`:"qJ H"9<z!y0d`*ƀ71؍@$h|8>H!1{.~_L2bOؼ䵁71o xcX0f=g?s`*"ݽ䵁71o xcLǢČ4<@Ѓao xcxƀC=ЃCޓƀ71?< C2~'gd*33CI:\'CJQVځ dv~T֡\Vvn^T~$O2f#.'oA݂) r+;+S#9ru m2ŴM yƀ71p`( LM:trrr郡#1j T%;#y `(@S G<󕑚}i馜 %M4@c]E#5e%#Mʺqݬ, Ρl1sy΋ 0=UoP )G ;|+kkߗ}#$dgӎS(c&Wrer`^NH֡`(({”u@R5b6ps 9l,vJFo\7))YӴwORhI޳Ȼ_) ڟ9R#+`;jd+'i L{MLѾ9&_S`AO6ko%)%)Ei89ug3ݓ,[}{Qޤ}F>ӧ,oS݉/Ci#;7#Ӟy7nt^{yo  i#0 $M,Dzpv.6wǝ'\ C 8 {'%'0ߑ57 0I0Jz #o=n9TJB3ڶڴ ,$==: 7~{vπazs}( ؍+h f )#J7ЕftM7lK=`\^i)J?\%eFI})]i  ɺц4L D^vRu>6u;`\)X|N2g!A*)M{`uXNRao)ogcI>M]9vyc`(\;OB\ #8˙.@}F5=ps \Sq3-̱V)3'GVVȮ{滱DvS䈹A¸=hpgf)=C}9țk\jZi*7&co2ܔ-q!9ho&.i+lA@zɾ5vúy F:j,ih/.)?3+2F eEWbwskKo xc 16hg2k}蹝"Ez_?1Cxo xcj x0䂡䵁71o xc#F+PnZ|\t;AosϽ1| ,^؃!7 ]pAO~؁~I'8;>>^ ¤Kj*ĉ]ıx}>f̘нCN{D> C,i&}*3S+w/XoR8a''Oג8<Xz0Mf#ǎ3Ӹ8p@L}G4 PO??\'Ϝ5SRv롧yAK,ndдgZl*ꄄ!wB)))堂>#mܸ1JJ#J|KJxر:i$'݁= CjG 8Ο?$/ŋw~`HXCrssW_ڵkN¢rtKIo Svo:ߐkL}w]u6PrC Ew cI>HPt8^=CЙ3g'![']~]~;3@SKDAg>Ͷ6m^7fWť/_~RB`(eȺ"m/\v¥Dv$u;u z&#׮TRشdɒ2&*gҬӚu&=Iklߜu5wcrr┉sO./-9SP^շv6$֤[)ڟU]ڵ컷Ӊ#1]օd|'SRϞ:{B&qUs5Ϟnt,##`y ~\E?^ l62M CXo>h`*ʹ9бKR:g_1O/Mg^T[B`h╚9{yeX C7nݪm۶97$WY9>dR ߢ.Q:Lč $'͊߅U?(oDM k*}+ڻaPD#ql޼Y?O¦\wf?{zfzv[,g-ǿ-ʬ]s ?~][?)Hڎ<ù\Pϔ~PP0ls-:^ Cb40t 3 _^g״<[Ziǟ|AwUOt$H:gXq2t`hڰq.]] B0g}۝:}f7}|onX4eٰPf ԉtqھQuu2/x,Y(rJ urӹ3 oж:Uh`2رC=X4mڴ\fq+!Kl=uvۭV]—g SFCy0tF\V&wYKmSVsSw^k{ %0t@P4yytV05z-  ]lJU^_ >\w @xyKv;{0&d C "'5Vr+/+PιJ=sM>JəP&kݺy޸S# Uso!wЉ lk՚,+ !vc 60uyrBۘqHɶm\S;)I;vpE:/gХulhPSW[-y!e n:Hahת:[B2eʄM . ?KvWؼt7M54~*q|rl;O; нlR]Uvň6'U1vf~8Sj\I"s".c! Cf2FFV v,C%[qG{OL+ l.g`CW^ugҸAQn2Hƹ >g֮_jKe, qg~٨zӖ(;wkʽ&%jZccGF>딙Mxbt]@4//vF,qcc}tTL-Cx-¦5kքRhwLׄ5&%j̊=dݦ_UrmG-Ǻ~;<[MF.#T}մetz#*±->= &lқ?ҕU CvUR'D$#lf̜eĬ,Q"mv338d]08.z65ؕǝqY+J&6`( C-xAGycѸl,8|bx"<ѸPF6>s/iiYx6^Լ-567YK3]OyJc'_4 ~?<~0{0SlBB֭eMvи6lؠĽNNP4Oܨs4}BYSP$VI9 wiNoj(oZ Mw5^YYuB-[+0gH-C)[2JO_`2C pekǍKI!mv_dM[N;E&{Cjf`h:4:kW%Xi:0]{hAMbҦP5x~F-NшI6/Qg;kȬVg`4gM4Y'LT[JNNq/es`xVk`v,Cd =Hy< C9ĬcOq_:yXYfd$fi! Wo 0F)o1{nzWX4сu4=!CA`` _p0rf#G(L~# |JMP? 5oR=n=zV 7^L iE!w`RR %hYڼeg0}8 *y&N$?"myvM2G5iz j>8 M竼+'`Ozu5`2! +3!~2DeбlxV~] ~]eS8c+dՈ2\"+\lܸv ߷n٪#xݺe0Z~`yWuL_Ӥ e QYM66霮204@x&0&k=i yX;פbj=YgF oMWW\nݺkN<ŗLl9v4>51`_UKSE_o7m<< d+[VW;1ˣF5tʸf{`܋2{ꃔσ 0GM߂l!VOp!(r f٧g4okSefxɀ/Կ?ԸIs~?wY_7 |„ 7n~'?w/~uCYk&ᬖů՚[Mf1MgV~M{ip\͟T9aǛSfٓ]wos0z~{'מws p߷:HV}z0 .vIeG3lt躙o]Bc;;jZ+Wwskr3 4x[ˬjܶ|f_3Jk|MPYN% : MWC,xXk_&z)dD"׶^zc1}߭W_xH^׬Ď M2ZWQێm5МmTruHfL֌icս]#UPFݦ)ժ5Z:h{bvojҐk{whYbZUj㐅Pnplg`W"S.]g+N mrWZMՠ^U MZt}7tel:TiԲmqƄWێVe6vZY;Bժ1rX<0j7˟ҁkսiUav}2{K=jwffljkx-V0XBtciոuuH9qZ5C|s ARJ)>ݺu3<$>G C0}Mf&kw ӛÚҳYKږznfjx2է˿1fkwh@zx\k؛2t\Sf523XE#,d& C V%+50c Ǝ^sy Yr1P0d|]>?.]^̐kI4fRmACl]˷˲]sg$s7`TU4Ѯ\%ݨ˫q{4um+wiY)?Z47c 4N+V,H2e@V5ivEI +MXe`iڿ~ʚ>|wk[hb0ߴ_7iҬVIpdwg̴:D3eKgosie.+D6.69}F:9y#33`qU\O'QijXZvlAf19wӾnU vܩ#F$Jɢ軴q(ԬMkv4r4o uBǢgL]'^?yt ȭ_yn@n{l/`@-* yꁿ71{{ x0䂡ziϞ=N@6fRnf|{ƀ7C ]nMޣ&Qcf2zOT^ycvwYI: եs'tfc+>7O~Ozc`( wZZا$'\:!tJ?d5֥]tdZ:ũyc] !/~ž^NNrssP ,zx/?Yx{Oƀ71Pb_gJmʐIԧO?4, }u*#|VGH}<҇O kHнsVU;LͦOU=NU5wZlpbfԮiM}P|vhBMv֖4ym5iP_/IYk@vjѠnԌT?ucP+C7aqk.qSM Tم)$Sd-K-<@q)}r6@&)լ@_c' &j@g<=7yUXWǭ0)^vwʾ ӎe><)w@+VШSձj]Fy:bjPzXM:h5JTqy0t+ eff%,{Iz$yJ,QI׌J<`hÆ  0`ԃuy0t~@:GtOglV4~9@CGԷ0I:_g-4pYqf35iɿzV-0E]jvҖe:qDX3m,{[l~ۜ+/߀޵X3f%ff;l 7U: ԡ Ws^0K['gOkXIX}*l[]ܵ<:-5waɓ%E9rZ-+ֲZ'$yO_-) O b,*:.\P1/3PbKL[7gK+Wʰa?JT5x@?>U3'iEjַ7ntԔ\MX4֠A=^.dϚ;N=UϮݴ6p@?eۦC)[E&%mVF&&'/Wg4g`/ ){u3ڱq.߷lI 7وi uF{ǩE:S.N߹-4kGs>ȷu;/0t8,i~,Kko135/rC;&‡ܤĹ۶ŶԆ c[^[= 1 C.ܹs=`VcOWM=JۻC;vRZV*?̌U{"sՇ:'JO١]߼o!6򲕸c$ÇO:ϋ>c}'y 3;ljPF/ i]\+yJ5Mu!bK .N*IB(x1[ի(0m}hHpWA q[bwj.ɖ҇Pȸ7{mqmǝ0-?MaæjB>np1C:1{ڥkjeuhQn ^WZOX{"t[@6ċ}.\x V'͵ʖ-|E2Iᦨ`镧_P^m -ҺcUכwĔ]ڢV|Oo,N8}ǫCQYen 3(H_nEg`)h *'%5H\p`0 d]d\τ[Xb"yfapT-C"1\{Y'izY߬@ev2"t6w)8+-[&ޙf2S/6%)MNܢ ?yP!B3APGjQ&27UëUߪ}KYPҾ-'5'0 ukkim[2NfcںCͱ elZU_}O}- la eI,C!^! (%ƎD,\~[?ӟ`dlP\!IO=%3җ˭lU4dX0 {*Z20{ѿW.oe6 8 2>Ƃ$^=#ٷ5Zyl@ 0o4ewځkejMy5@(0tldp?`.*,mI;A5k 6SV5Ckgֺy4|Qk[ҍ=&wa/ NߵjFCk0Թe7fN*\ 5hjX CQYh3©q@kY~<|_ (@Y0Ly#+pp tM C2Bh_LvE֪ `Ɛ!-"!€=#qR &%^k;HC9moa(и- E,Ce&sdٛ5jf4M*U5q9sy$S W M4uclP Uՠ%1RkRn(ڹ`7*h8j$m]+oT5kQWf'jvFjѯzmoV36׭ڴ6ܮmq&2pnPڥ~ុ˄]s/вeҪU/2hv[_2 ?ҁ#^(:p'ZHaʌvcUV@ R"?V !j".pŇHa+l>fȹۺ[.FC*x,Y{rMyB4ylڱ@Ҍ EpFŬ7Ļ~cI5bĕ.5EhqU͆m/n, jC)6ceݖCݻ_˶3Nrh#Sug+}hC[͖cۙ1_lǪ-z7_V h9r䊾76>isf-Cõ8? 宗{ۇmK+C {P1ֽ^q%!'6{ =䛪l\e+6^vо-0nAkrv0 YJ&ZsѷJ*7@na];Lꭷ|7od@R7 q~kb/2{e޼ZJ8*]ʳn7cƷ8sq.:呧R[rm{N㻅!L9>5پrCm=m]˷O[ef9GoZCݮ7{1;$kߵHԬEGM|m9 "q'ԍ<#+;7.D[c\ mhA^}-[/[m <e'Hvs|Eڇ`6 $pZel9gE쵨v?A`lYzsA8?YJyp)x#Z]qS6ufG\v`xA%3:C%Lw{ĸC qreei`ղݶoֺ6mYJ Ufڝ]!nR"urdlMM6h/ڽ֎;ߍM*J0D,H{vOG07B6w;ء_+ǿ{~l-oK]sn2n`@uVvY71`Mfu[6 ٵ!Pmr-۶ע\Ƶ,Cyn2Mc̸7;YZ3oΟX Syܵgrs2v%fJM Cn,k CCC1C9җ:u9kbc(1_;6NSfۥcǎѣs8k&+^`ȃ{^b,e0q%e Fi\nj֡vws@mVJt:2ܾXf&n̝e帨-"(l"v;0Ӱ\ۢS>3ZJ<.7XP!2P.CZs?SGfiM CvF:r2escM|+7X mis[pñP? YkrÐD|@ZgٙYv#o[,s,>I >H`(P6i8&]t=vBjEqKha_X *qc>c͞c]V+W4P5o<"<bbnoiMX_=-u0F`D C(l? &nVQ}ݺO `BʈKݺt]3V`" C}ZCn8& ϻۚ Cnw6.ƍoY/ w[0dakW6C30d|\](@0dۅ<pٱ2C<,к;c/R*Wηb r_ێqd0%ӺdrncCiii"2(8?azߙ4J]_SO=yK/}/^}UcZl`3jy>njժ9}]L $(LvU^˸jwjY_zU_z}؛o>^{vc֓=^j Z0Ƚ8 ZZ,0i8![oBJ12UPRR27-쵭J -Xgp߸aC837~;!m ׳C7 ኳKBy)ߖ) Í[ > EOv ǪHbXslL7H?Eh!`.34Aܹv@+eC{-.n C(>{ǥ_a2WIX&:d.bm XY@ yF*p0.Vn ?OchZU(= FCԅ-p6~/^mVGD@0ȂHX_l?!+mnǀ;:<qCԩ6fmⳝA2v2bv`Я_Uo`(FVh3裏6l޼Znf^heLAX/Ϲ 좋ă-Cn7P,CeEܫ-[n & CmÌ/f~m\k(x]uFsZyB4nlgY.1f6Ϳmamw!~w0u-`BuadO=vp17;[2'._B?zr_qBJ 曟mVM42ꚅGKD > 2k|<o7S6p H [[Y3nMҬuz80 ߱6o .̈:sNs qM72mI.)\n,3;rQ>mcˠn GbZ7b ː?vE.Ock,XymC %6,P5ۺpIe=iC y0D?' 1棝 w8:Ð//m xp8MVO$jt08UQ%|#ee <*i0q0pÙneͶ?i[yf̸P0} }-X*e-6-Nj%z뽷Du 3tc!,y)sWhIӖoTӇ ׂ4g2dVݹiK^<c|&Υcq'k7>cT@Q cHf'nQKt=Hf:ܧklo~;ٳ>VWVqE?n׿EYRnKJ CvQ>n, nײn̂sЀ/  3o=v܀V`04soZ(b3(zں墝- 8$7~2{ȞogQQo;? Y`rOq֧?cC,ebli&ud.jɪE>2ÍPO%fTfMx}OWjfC^le<0!Xyf%:I@ 5tЀ k-e}tw}SGӑo.~:ݭgiεP,CY.V.VAڸ :)pp7߬7{Un]U!Ȅkr (;; yA7qd{xV]˷Z}>0?~t[Ŭ]w#1;l~v:n2t(YgF9wo2;qDеl'-Jr[(X^j׮6`Q{ӻw[f2~#`me?i_:ݶܔAmE}ԮX6UyYiSm*muZ֫@0ĢVAdnWu3_@ 9Ǻ<"!<\e J?s 4ܲ;$L_;8W!O$0dA*eJg-Fp5ZTj_\~m;slµIdyHp2(q//W7IIJڟdⶎx+P8!wC8uvQ䶸f3sT&ǣᘙxRvL)GΙĔVWNA_ɻNŲ}ڦ p.`;o:w7K&geeߒxrn%cQ"%SMK&%;K+>u~#sɳqZpC̐oq6dG1c}ƨ6ϯ~ur^q߿rlymP\O.u_!;2ٱ̑sEnCʡ/w"`vkļ" .To2t-C܀BaÜ3-ӸWѻ gv_YRfڰ}jGuEktFjZ;kY?Ҍ~-ՠ}}w6ƀq&MtZ­.nۄrcC@peߖaT۸cF =?5|P09VFNX7\c y`!-7X;i,CC-+Y埭-7^J9ElooS^*ym`qm3<(6/Dfc1w>߱uҾOԳ?~2u<o Urg~駝k1n[PaH(azuss'`(TJڿmLv_ 28jrhaIf1;- 3 Vƃu3Zu'Zpg!8Zw qp^3 CGf`h y)0W+kfj\XS6s~F=i4cL*oC4j̜{|%| ^v/t&bwd@j9YlV -NXF<2">){]X_\&'OE_.r/s-G\; Y@qÐ; Cny Edl$ 3ܖaE&`Wnb`@@P.p0?s-|h?+C.D: m9Wǎ^dLjUմ64w]57_Cz5z~D<9gsw?={Jn&V)Xc&v?vb<pM@!!5+s+N[:cgM_ץ)uMi-ͯs-MGJ Ud!tPJ2Mh!` 5>U@?߶"Pv𗓘}CX0ːN P$ִXPk{a,7YN>Sn!nf)zt*.wjf;d DַK:oA&p>ۅAMMQs- -b&pW‹,P\+t>7+kغPePXM|)~s$, WcQ˱GCX!"]!b"Bw ygWEY/W3n2~Ws&y^xVhϠNeAcpWoײ~Q<&JX *RP4JBuEznH Ϻ;P03,SpN,C|}Ipm2h{0T` ,:m!n{={koHf)yɵp.q?E@k{X(Ie(Zy#Yt122lV`Yf+ȡP@:%@;(=z`xg#zko cTmJbqz Rt%|H̚QnM( %ϯ]:ZX4ˀcBE fKˉfl'C$#pz^*^`y`|)PkD C%A[! {"(VQ|`妤\w9wrz4)<ќm^PdvZ?+L^>f3`0‚*hnI^dAPBUr-rx7-C]fv+˃`ȃ1G([urÐ~Ӓ$ŝ*IǦ>%QK;F}, }s'30tI]zUyb C6f- P 鈻8PX?1;),9ϺmVY{b Мuj2t&+!:؃Pr4 ‚JNS4d~ݫ]wXe`(ߋ*z؃ wKiz׽?, ݍ[E);}$%I^0\_>0/QFf /rft {>Ns',J4y<'T 6###D\9cYfeuy^еkל%I'N.w*W|EjժAL=6x`3 |]rnBfqWx'e&C 5M=C:x0CXh"<9RБ:E/Grnڐv42Hd(/+;2 ]rEgTCهժS\Y}NJ֭؈#aÆ; CRE"O:ֱns7aҥKKEo;zm{2KC[V5nꪘA^Vj=*'LG$J7?uZ5h+3kH 꽪MP2Q&kڦPU mJ6EIFjgeH%;ymfzMK*4]}իQ[CaN0bĤ}jҦzjiּeΟc Cc/:Ud gQ>>byH*i! v>aՅJ۶ms{'==݄0w< @yթXRRX ֍ > 󔟟C=Z VZnPXDCU==vL1:w6 Cٚܡzk7)p6lg혢V')=e15cGM2I z,Z7ν1ڟvNfzkæCg`(x[4(i %%%\ܹsJL.,:uZNg뾀=+hh?U(10(ԅj+ː) -[V(/&2jд6,*\ֆzrzT!cdn\_ѣ]J(jz@}GV-hsjH+N0t$F7n)E*9qkgzn'5ha裏>={o_233yvc!* {ӻ$yJ,uI'++K{)1cS02~ E+VĴO8cǎǴ;qe0q ԰$e4b C9w~|%llm9ZԹ.* < k٫ k{d׬Vhِ~|GL`(il1",7a%s,"lV+37 Y0t'o2^gںduq\cy˃Mwi4Ҕ aZXfd PKo/Udwj}PFTF*9#tK$2V*UTt(n2 b .g- ],C9iԳ*W@@jyjU * gknt 츉s4oPUPC],o(fhǎfeñ˗zj}d-YJ?'6"-F g0s얔Ԍ<k 6vf+G4{sM|Sѽ<'aD#ٶC;p,q[%=>lx:eZ[\2tr 'צ=Щҧgo' ٙjgя~?ʔ){ i<| ~HS&h՚2sR.ة따~j]'kȆZx\GѺkZ8ZY#nгk"ρm T~+ڗ^bx];'ꤝ6kGMVCZ++CƂlfaai`_ "NM[5աCwaahOi5!N߬-YX͔tdMx)oURƺ%_y1K 1e*%P)/V> َ߽s@YW=!n(]<2 y4uj+9Q-=7N1Vp7*떡 % `hab~ ڵ˱H|y~p^m=14CahЂT%f}褽׸-ݧVhϾ;C͛vbz!mܸPnn>5 y0T40`(6@T0bHSSS{RRRXi1CMv@+x.Y 16}<\ ԁX}KB 0D[oOj.g?oZ㾿Ū2.B߰}o_fTc:k5ΏmU Cȯg-FF4SiL~E9cŪof-Ɵm4u?PR|+13,‰-7N0AN.a)>[8؊JF40tM;ϯE}?NoY츤P0ԸڼQO q[rmu>0t`Mz}u|mӀEh0T}KC5ʪq|0S}GkUɪ(v/|=ICꪺ_D jgk|u|] CCOkbnzɆ=>[xE -RZ̓ C_o ¸)o$V/'O?P^!bo߮M6vjr_yg=n3h g{ZCG R^Tzhv ֶd:#[im?FśU,gGC7U譵ukjL^EN#mm1Q`e٣+öAԼ\B"}9l,Y*oX+L#dSHS^kk[a`(nƽ^kZNTRFD-zf66V8H,CY-hRҨVe双+g^v[hU뺙鼎Ȥџid900.5jDd+PrӹZmFƒt`iuz }^䖛 s^q-7ha,e;2}7\`v˦tԘɣe(3_ Əĉ=ՠf]ZTrUŭѽ76"!hݺRNX6LSZ~tHӻO'+bv53\`S\VEW3&v Bpeĵ65^ ̘>nO\ŹDCP{yOm6+~ _c;v⚵էz{clM͈5޸Wioa.%6Ɠ C|%Ni! #Du`79aVo;Qld#[s 3R[>hխ軱cɆTG*jN\ OӑPxv]x;EC_cu/3etxD0/ﴫFMX^Ž;f6H-:XuV0]zJKuQ8.4t7]X͹04$AiauuӆjlF>`lYV~ڿvz/O?aśձʯT|=]&6jVI'*DVFwH`7kʆ# cHQDH`Ȏ5iJIKhp0rN@qb ݄˧kب13bz\M. ٘kCftm"oB> =j{`|Y`ڠE*UgGZW^YZOG C#WhuyLVՆ~7gqJAy!;|n ӞE3&TfFĸZ7BЗCi#Δ 2ԣ }`Zj QkZTHޟ8ic<˃ |!ni=j=iҥLXXOb7Ҙ;[8΃vH`ȶ H'*^edŲ7YdtշK{MX#HR$n }/eHX\8w)hԾL_^ORg[Өi[ UJ;C8PN@u0dAgvO4=W"fkwPg˩QFśE>ƶ7υ2h_C- ]wGWG+mEM-CUmh1&`z>u|2 3r[LS+-qn1[bb* $u^G^MA*TO<\Vߋ72^ڣTjSi~햫3 դ8C :f{33wnR=c3.gLqv?|,:C$ swڔMUr WH00qEyޮf/V+;_jCF"&kA\ZCFCN*zCqobҊ(1pĉ"/:FB'CX~I_}U\2* 5:~q,2+P KvnAC v;ΐC dq=K,)TڰaC蔴q\a@YN EY[tXt8`bŊ13;7זmK\]%Mq[y9"/ p?wMmʋ_i1JQm1K)v+7>!frSb2W'ͦO6,%)bԁՇiʌUڻiLyJbkA:t3; k?@9[~}2*#XVP+v/\+9g@3/&ͳ1$H:\K+W-9b(jmc=6=62c㦼X%;hʋUo{fA铴^Jɦ_92cvޔDy&&6lP͚5 b-ݻQ#IJUA#Y=o6 v9/ЋX``呿0 U^09 SP:vy'$Vm-Bca* X]˶3 z0B.\Б#bbBPѡȃ݆!Y(%~=ժUSʕըQ#m޼Y.\%;wȃ&{aO^+|LԷgA۰0mU\mH lRUTqhӦMxWUr̨ `! o61C JYbc,C5jp7$JEzKկoot>}8{رcoƍs~6S TV {`Q^09 S>j(3&fmU\mHڀ?^p |XɃՈcx]ca iٖ;}2V_-#i{jkì vt MF_>3uhXŴlNrXUy\naN~fgf,0m״ϝ˳ag!GnX*TP`a4Dy `_U?OUq{ixK>}FN:9xѣչsg5iı( 6YkW[ݺBkGs^ݝ- H=zpn߾Lihv7|3p~c4h\2 vgׯĐqs2ԑ# "C͝ߨJwdբZj^z9璗-A6d\֭SGG>d6mZގ $L9Ђnm9a Qu$?צ>>`h'{]ڞĹN^α.9epyvb|N0~ԫWSy~iglyg܈cdz}w,MXa8Aca fcڹvY{תcՑmiSaF6@a w^,fHf X?]=zNSf  -U~>{VzO{Γ,*3(GYoWpK0tEoԤTXm}J_akԳ1nF+#Xa;lMzSJտE9@km6sTycY&WСA42zͶ}a ̎::knD,="a3N;~hH!sͨ3OcZimTe†~}ܜMW^ubd>:S+7/vhJ9jZU60^5p nbYݎj[-416TͪCi͛~debgO Z}كr b|Q aͦ_z~9eqW̪ߌf,>_Pm5eX`3 `ͦofݑ#նm[GqΞ=ۙ4^X?G(Zj9 H͛(YWuWҬY5M*U@ffX)kqm!f'\v(}9 =Y^(N)epB<\+X]ۢE puG(իW;u担厢 _2eِ=H[6`C4$ T@l۶Msud Xddz/;oѢsڗ˖-sY  ,pړE+}㏝28sЏ?mLڵsG=3nNiN[s-6$!9{RR3V'}J?!mذGh?B{9W5;f!'n) m[0POLnZ9A{t׬% 4xPm[6YӉ(P\E)scUvЦU|ØZW^Zh|ΚkV|ԫF)Z{*LN[OhӪ3< 7Vj_]ֻk`D3{`fCM[-wi>NicXsN]̆ P:-8i:b@kZRJ0\ ߁i3Ԥr%kبqkDzmUX>И]c8\9xY5l_.Z.kٛCja*l HMSwGM[7ij' z.0KW/N`Y%zxÎvڨjիf ka`g9_|0K_Ìc.ku)Qq%Kތ#9sfE:Jߘ~b$zժUΪ x7[nuA(r`'t9s+ RJ9J eE ~{"}93Ƙ9P(x&\Ou9ˢx(ixGף~k֬qڂذp H=w%L$"70|칄2dT( h4i' zvc8@ (Jhz@ІL`ڵqiXFyԇva 7qm;.UY9ryl`ʏ 5k\@[ch }1ٳї\B.qn]쯘e@Gm5a8sW zi5xNOҠct00tXNYN?'{3qZGlbC;UC̟vBLah;HqNˣ[6===6ٮ^jwh^j۬p04s3#?ڕʥk/lw1(N56<[(e,l2 Akh8Ѣҭ4l`hb-cn@Oj_TnHaah6ŽTAS4 P~&~oVRφUe,vM`ʦ_7Iگ[h[47KjvG 6.DL1Cf, 3ciKeک/icOm tsJP@RA^8i]4Xdx &`U2(Cc)X  `e\Vn(w*ē( 0L(YT(d=X$6p ,ԛPX* %tRG@wuYx-x!;Aq-Oi tq lXp1GK_=0{U~ %%%9:Poړ<n:G9bahSsA>(78nA[Y-&.H}i# 2 /;00Je ؝h[\.ejL.ړit ۫MX,uыiG.ejfۮ5vOꮚk!rG;vѸuד=z{2âȯ{Xz*Zޤ'xvevpT nnBc>Uzsj\fF92վT]}oXnw]#sԳv0'7& 4dժafm8Kujֆ007VY*}WSZsVz4]~Ժaוm?ZTORon=f6M&cjn?s݁5 M#X]JMNP|N^kFkkP`-$no*{ uQش[~.WKzf_qHuř~闶_F~q|5Z?ӔԠumTu#C7_~i`e闯]5URW36t~:٪ߔ( makDx ,XPp! EXرܹzQ޸,E1b;J([ :u8kc@[QBb)"H7 0:A(}`⩧r~% wq)X0P$`A>cBndfᏼ@ hP&K0`ІXRK. T"/Ǩ`r LaqA&Ў1n0ű$?@B~3\i[J>d/ͺ+zD$ o/V+v!/++`˸ Cw2+&PMB5+6мK5IC0 2moYظiƨjDbCGs5uq&kUZign7ĝg mW1I|7{,XE8PTW?ʖdܹ9nL~d͛Mo+ҥKnW(O M_Ϙ_V "ڤdc>4PK72z (Tb.kTZcAG4|Cc^{%8ZSzCi~RVkɿɸK4_gJSꡧ4|wacT /5AK5Erا. |&N $ 5&MwZe3L?Ԝ^gf>I j)}:n:QGO.׺CL? QB .bf̍8Դ[iK} m+g:3mdNM6[~bejo|_ަXv8߇pDLl7_odjz;'v]V)Z  4OXe-߿ #,=@pBi}o(mH dp G>@„CQQhPlYGp<偼@ `@ r\m(v\.6^ -~(z8ڂk`xP>Nj/\B6<.4:\Y(%3 L?X'eЦV/l @ v"bݎ K.)Mqp\eI,vk'O3m @w. "Xh@Es@V`(y]cα`~E Ci8}9?~ۭYUuq[oWr֑Pj/=6ewM,݋:kڝ}oc܉0yixod[I|7{,X-[.@VACR/͸f3sg9$)xpy87Tbp3fEoj7Jecpe߁ʆ! er +@T9ŋFyB2|:P(M HX&K)> HCP CFda)º`gQ(]@ 2 +`@@@IhK\}ȇk ߀0XP ,U\X*!V2C}M -NGD~ʡ}pzc?ړ|Їˏ ||ړV@;c8X7,c@½G_gE^;0iC>ZpW Yأ]{< ?q͹G6,v3|J8GՍ]4XLFM9ɒ.:Sش~ga5C@ɊME.3f!<03U~Ln,J~af B gE%H^8`PQ H$Jk\ZPX#V`!@pj5QX6E2 ;V ! uDp> P@Z `\-Po\A(q<0CH9'p-I"ðJ q 0ae@@K0 |XHpFm>GvE^@ Vh/`3h ʢ? |#톥2,Z" T2.+-In)1 Sqٝnrw9|kH-CL,TiLNP9cG9БcC֕-LbdZVaw껉+bRWYھCm62cRW)/VbRM}?\ddҁfdUJ6ȹؔk)/V&N menh &C!8!V eue'氊b"'˸l, %# E>;y|Q Jsp 2otp9!+r @' rD$pp9\ ( פ " @@ ZG>6zؐ/z5V-vyX+`ZK|! *CJ_SG@~׷r_q,,Eԓ~~ma] pKy\q;-ِZ{2,.(`Œ!,N}%E,n.eȺҢ`_ߌe&cQΊ! EM6*iإ{u|̵֘uxE)/=fiݦ%_ybآ̵Lywc~Uھ6>#LY1K ҇{+ Yw&baĵ5A7(Z\U̞Eņ2El`1 !r8lY+%GsX>:X9XŊˆkQXRzX PN>J)k! `A,E V:oHsnڐk(A2t~ް ??} G rh8NӖנ+`#]H,MVmό>3a!z4m @Xhoi'vCFf@cڎ`BfaCT-CEXƍgú J/kЊA( &NC.lQSmcҙ[tyYbT2F)Xq)1KV,]lB{cRl[)j6j<=w$f)Ȩq, }b@YB (+w\#XaA DL8ňDI (@,ęXT`@a 05)zge`z9F>C^,-*xzG6P |QW=3uDuq(Bǂu|."dQJz(/<aAv'uJkq..i%VF_MѾeƣ,`W }Pg qAE~S)rTƲE~ZD^Aw1x? T1cgͅMv]$`HP(gU A BclVqW#H] L2=U46&&/פ>?%]:y81[fzM.~NB+`>"7ر@BV.@@!F}CۭZ^^@Ey 7%c]j(o01@B EcbDяd@7Q,x`(7Mc%ڗy8ua*e8C>x>x,T)fự3MԸF &2h>ƶj\T[yZ &;Ujl 虤۫^69[-hۦ5׬}.e:{F]k-CZ?YpgUF _}6s5J|U cf``no5 \35mh`3Z>Pޜ9CջꅧW}.LAahٟz +'j*/(kegPZ0n+:rPkl| +]I:d߉%AiBZ;1 (5~,(v K]KL \jp[Q>Jں"/B, +Q>ʕE\({/Xt̠`Y<V%g cA!?5 Q(uX 2R(j2’9dEŽ`Awd=b@\;J\ڕqf@ vl.~ȵyԑ0 s#d;eWʶ0G9ڔ #/eF#L:@`G;c%~ԓ;E+h3fL;?y6եyl@.Qܢ$:w|XCIXtcCXAfط d"s'\dӔ)'w,hx`hLu=Q// % <%헫YɷXֵY-2upV*1W4-6; 3AFǝH FD߮#ʨlM&467Ͳ1Ec%g rtn6v.ov3C6a^fAf32:12/ |}A_ 3ւ{͢unv}Լ4] Ez}f{!*(P<_sZ>6[ IDs9>n闬a(`j@d+luR5Kmk5L4Zr`m "bƒƲ`!J B1P@Jk zEݴJ"G) Xi+ lXW0x,X"pcBq<;V` +3uaq.bqi#Xhi/c741MnbBF;M V1,+>v%mZ Pe"5j^]ުQƘՂWiT:èkB<>a]L@ Ńe V qxhPȏ,(kπ#Pv}h6 |&u)P;;l2_t0Kdp>p*WWtKbh_CՈvô5-70vw5bϞƢ#Y_7~@v6Rs}?z`H&S]tYb֚l)ܠʶX!kvDx#N9Ghri,/]UGC9m:Wծt=#rO2242W62ƋMvv[ڳuZXf2}YUWjolcu4E7V3"1 };tA/MM+ m.YsZַ#w-*7OGj+u>dZp, V܁](J%ht"ƕzElpX@ab-܄qAlQ|vU \94 8צ({S:\H,!?.6s-HX=P@,/vfS.D[&X@B=(Bw"`@D,` VuD>@i+ mYv]pau8Q6a6cPqAzӟ.0b7g + ˘`Ѯ,Cƴم)O&%" .좋n27oprs}{U,0t$mZViEkw*-#H0zxչVRFS2vEi*/o CƙM6M|K4TB6TVÛd04氖n*OWSW(q \'Y&>͔ [oW3)hD1hahǯUWMFF7̕KJ֔UF-+;פ^'U6 24fSjgGkѸWsJ=mޞ#.i|qXC_af:b:nF6u.1g/`'ӕXYjLܒ C]D`r,P@(6$Rpi낒PX.x \(l`% 8n7W.PA@bń CȠ|"//({ j7C3P @ { ,,7XidNXF6 b`#oQX}O>>;clq92FhC~c,šcXiN7leA <0f`׃#22hڛ>߁HPC[&\sdE;8/U܋.CЎ &3FUgF q$3fnO=C;8O>c 7 {XPky f!oOU ZtE \<~9Ёca?JvO6pAP(^` 2 I>.Cȃ˄xՒqe(y8V \OXpY%@\p v(`k.{AX)K cA!/a BMy@tQ?< dDH} 6h2ƀ ;r_X6%ȁ$iO +XgJ{sB&4y>lz!%&&! I[;`IҷŽ"@Ƀ`0.>+PX2i>iK>{S뽩f%$iZjE;8 PvP5 W:(f3>n(xDɡXL(y$V(\`UP(M,71 %OY;[%n qF삅X N(qM5q ja|z (Ps.`K@6ڀ"@ Kp2ew{q. W;ΣX#d Q#∐r3 ǁI>@ $ cbtD>⛰X?<@ f\L1.<;,S.2%o;`(E'!+؃,Zu<H*0TV]`ȃ!bCN x"PXyp(<EYa8V#X@١ĸ.lbaP@%BP4(vd  4v Y*`F0d$db$6B9#.>S3;k ``AGXY=  P.X @wpB^,@  V`P#mA6P q]Υ n<|4DtX ǵU7!?`8[ B#7@\ JF?k7¥EhCaª5~=- 8#`>ºvVbqNgFdt?YqŸ*:CLqBL7Af A_ĢR7QSKuj֘CHY%wqfRچݦ1K6,߬C)sOR$m5}!/F1KiMYY1K {v.6e@yGQƂG.X,Eq, ,G>,"d%a3c@%//0x$p}!@dp ,,\B)?sXPPEpaBiS7W@ 2X8 $@qdO&X4P 5XnD<<`ٱ+ԟz5x1tꅋesEv 9((,vfú|+ E 葝Rԇ:Xxʑ8RFw\p-dPpy`#pظ فEڛ2Q?xD:.Rp_1@mh^+2~h_G<";ܰ (X)>U _iS.ԏbi2Cy\0.h?(iG\tvҎƴ .ifgR0VڍPy`kVoPMUjٳkSU*k,lJD!,C ad!_eB7;cMv4bRV<+?3K*6̂53c" (KY<=MFMcRYLQ:٨7<(ų܂+} B-hv=J%̈́ "?ǀ ( b}ClP@.(I,QX2% nj`$ DZ 61yC k-Ar h@nԇkd\LPbaǮ  '\,$ԑ:!0B,u7vC4`5:P>P  jv  +:Wn= 9?j7]cqu'D'v߱nEci# XcUhG@cj`Bca(.XJ:+I-Ecҡڿeع:^OK\8(eҸzoMK_7}(塓>?KfbeD@b#:/ x2{ (ǃCC C]‹wE'yJ'j0(O /0(v7 +(6El9dpAw"G;5Q(iZPƘO݈#Bs]@NgZ7AX26cG S>_nu&@B[10kbN%3bU[E,CwjE\} ؽDwR ՛j5xkP}Cw<go( }98CIhC,^)]XoIpuU)ehPSGyfc93Sڎӗc[ZrfmG64ŒQf, CBaAQ`ivWsGѡȇ"bk P YA  J+[Y|\%XU(4`U 0.Ȅcuԉ2/9;/cS-ꆵ#(qq>@;mS8:C-`BӶ@) ߐΊ-ڊbb CY x,eȌ/p `q1CvK`f )#`TqiSk@ռpH@1PA:l&򆂡PV`"Yt1(qA2VKvwcʪXfmLj!PJ=RꔚPްշh\s;50tE3Pg*ТU) ]4VjQ_Ӈ )ג-5ts}16RNV=#OmչU?թ駍_g{ T+hyN֍eւANcj $ZVe=B["mjPwթVy 7046AWs4,nvCg@uz{\jqik1yͬPuWG C+ucf]lVT_Gj`L69bz[UKT`n;Q(Yҁ" bPrX&O!EI,0MET"0/ftN@e @%@SQ$a),P@VdB^p 9xbE"5G! rq'QWE@Jp  !@Yn80hq KyN}u9qN1R3zGB kuDIHwʰM@pq.u6"X,O:!/1S!u)G!rQ>DI\6=vg5߃q|&HdҳOf(5YXi{^Mh6.SSl/1.2wb1.Z+aM3o&3 _zλ=$3d~ehzߗ cn`I3{39.+7PK neyvT0oPj~_]=S_~G C"Cmju4Ar5JU(3?Ɓ![4"WwG0daf̾Zs P_րR ahY5X426LC_{On 1]jdS%zkk9߀~̆{x5|(g\hWՁk}֩LeKp>l=DqVjҳ5fXKU bV_Eʘn3o4cJ? ˎu+wJHA}!,(|, `AN(y p'QtE!l\(@ cgP~@ !.`jB`3‚VGnHf.,,+JL kf :@y\Ōb(g!? ,&֭;XO.d5Gݫ 07()G1c=h': .iZ vcЅkqrhS B% 9`]c <@1@K|Ș, kq 6^NQ.`ÚذY:vmT*Twh,0nm4qIs.}GC}VGkO FO5VfUZF-% :Cd fs~jQ0sʔqt\04)QVeoX\؁oWV[mW}Қ ZUjo2+ 6<.`@Y!XyՙշvWwWuM]UJD+`q<#* 80 *8"2 (2ʠ(qc }1u^{5ϳ֢!#IT.4J *'U6k>W>'Q/Q2CXzE_.K}e/9NTԯF3~7-GL6zTrڨuO-h\?4,k r-뼔wU)B-qXqS,sgt5d`hӈ!jȇJ޸o^}n?=.nv%17'#T478.+y0v}D^/ŨasϾ=~wg?,T 븶Lb޻r@t`ΐwf1ȮW d#fƘîgΊ??5xzЂx{tXkaa+ġ?=<}(~11cnZ{!lT`&ڎ0vG.rv3qqWČOz޳GEkSLahjlcovecbw]n^CNn2ޕr\Nq& y-v-ݞRuW3z jhQX<3 25CYa)$x"0ɍJ8e<8ٟvՀ(z XÇ 0Ƀb /*9F=cΨRp8eՉ[+($ z:\k`I@q9GP(e\MYc;E2\B])'? +e/w޺M143']Rڟ# C[;w~u<*nm3"^jXMφ ss#Du12⾮2tmlϑ2`S{xgoqrWǵ T! ю0rHkz91 ͒z/Ċ6 r@}W󘸫 ;3=̧[;wq92<26,0:=7a1).ƛg7elLfjy\1 s[0 # ~R/Q[V)抓1P @U*[;`lM`d Q;{JBzV7}xF޴x@>#0諲6\IR&uJ?Ce|CLTJ#]V^u+aL@HWƄz]B1+ HUA`PN ,5LګPi |^b\'e3_ xEZ vkPyWKڝE˹}?ϊ۬1*GOm-iS[C;jC20%M B ,x,^P`0% 4 "iƝH@DGU?|po1+ p)B7* Ԕi%I`C>-ɓH> qˈjDR@&ЛˎB ʋRZ.OmWƅ"?犍R+O=T&OO*ʙ$:P~+_vQWn2Ҍ!Xv >GNwJ|PSn= >xZ _=ˌK| zC6Mzu\|u,CM-Xl2 Pa( 3)N: .g)a NAJPX J@!eS̀25A2/$y4`:f@<6[OY9X0eWx@IGppoJ4h/q6#n3mv m epT܁ꠍ S2^A}y`4aP2.E3N ѹJ5tNPԿO/cL.]RYtQ;OrcОZtQݪVjFKS뫹ɸU7tS~cjjQeWP+ xe?mٵތ+022 {Y JPTƏ13\% DZ@=(ЀBeWx.dz=P ]n(3Kwwc)TrT(c \.[p03=լf6uVM*M]E74$.mJ?@n)$T}k+"H8 PFGvPWC)?B_2{e<9UGG/zDe[򝯏$<شx*/U9}HS'׋|xsi~PkԿ1^{~>2Zj̙iޱ-=mWw}G!eOCv7-&fYZnZЌ1uښlYzd֣bʚ%͝vixp1+ǥVYLzfis3bä5Kz(Ej==n}ӃM#w6 d%$P-31kZP1v W@`t)e#N>ϼ2: XO\cɈ3 ù|(1P@? JJ\IϊDqm/,ť?-R1GOe.St&nA1:<ȣ(LJ PA6 A̔~}g cpտ xD胿˿bnL>ek9W~DT#xsPDrpO@kDd-$ǺfNW.!^>?E1~gW-0fɼѣg,|jkߦg[Ĵ}ēN5y.eʧ -Yoow7Zym}^zr;X*I>.U;wc/jgWekW}c/ZY ѬQz" /堼]aҜFgJR]~϶8 ՟Z Ԟ܋[G DaMA+tOJ~F8xtI'kv~[WsSy}ca;}qmx붟;T+kʔ*u9wQq%ZQhŊ$)> .΍Zk P2T$}PSԌ'HR6P0R}qQ LhaL=c=ɃƗAw 0TT(١ Q0alAhP(OT~7=FW\Cݨ/cKY-^^F}GbU_cEX Oei/=xrF dA+ߔ+;J#uј$y'tߗg^r 68M>!w6?{ɑIu] 8*wT?&M\s̥/FǬ|Ŷ,KfāyqmW5~_q]yBcX;8ĿtD glՔ{s#Gfo:ߗuiӬww6p&$41׊4S>[3(We8'nM1(:6<;^65?96(WJo=W}ٿcJoi i|?bkM.WYĀ)ɰcQ'EojryPS.2X (#xsp`ry=G09r.S_"Ls3b!Ɠl_(yOb8UQ⮣8%ֆCI->oʓ/#[4es )(R )`F@2 XLQp/+.,Rw|.ֆ7];:(ϓ7uA-X83\>7Fʓ"@Rg`OTz\ku} u*+Pj=5U-09qK9cMĜGVսu|_~PK7Fgf%oAvX>^E=-㉸6&C3̉{Ό'~=2"faqM: ~zd8ဉ1zkqϏnIN?'g.) =6`kL| K,c}ŹߓST3>,xam㊾mC110??~8w C YYӲ%hBsXaav=贸;70qm}zu"cxaxuVւoǔ\`ozG}x-A@g6Jo.0cf(DJ6vR6[ט gmw |(R,FlZpbqQ}v7U~v+.1bK yۡ{-CG p7a΍Z -J1Wďz@sX+wqطω x8Ի㺡[#s>*04:~8_oCWVJehQĉ?& ؙ2T.?ڑGNV=s\msn&m+b_[?huz8e/:PnrV`hhqN*j}[L 1 )lmJz2Fx0%nP6Jiie-` p[@7Wg.:b (H{H+(ɪM.h x(`Ap:RϬ KyDg qϸ+j sEScx!O] *J+KEN]Av?;+S_2S_}[&.Wo{u]7~>Cj7]VX:eYe3I+26hbȶnMpO-utx53T\<1N:X R#]*EhkqѷǤfЈ+r#+:C_98eѿ8w CNN;q@|πΨ!߿/!SDk =}mVo#57Y8ꈁsﰥ_Q?~jյإ:7GeFZ57٤<_|vgaެYv&kCC6?繳ν:^*yܕ16] g56> c17˃6Ѓωls ];oSllHN'I?8)6#&Xw߁!̪(SFfl@.FS9Ψ<%FA>7if>1 F('Ψs1eSe[ |0SFPCM~%J˹. jUfby l*uVuPXӇ )4L)@P[?ƕՙ%ť(ip լA:ק^fT>nOG16 ~Gߨ#8, &1QQ{б̟z"ׅrՏkă#0 ~C?MV`,!KPT2u 9olCZj8̵̾r~-%K>:C3knGS3[D{E* .>x5 (ˇU箯~Tx%;=zE|H8iGe/q/nU unƕߐ< ڧie(! Ͼrvth蓮#~e_88✥1|'c<oą>qQsU1m^;1wvqwC=2_8ץmϋq6eoo/̳Ms} Ccwo:w:S䬳YNYjwteqOqs;OwqgcÀq/Fc9 [;AĜK_~ˢw*tc:7.~51s piS#b?>.ϾC7571+1cdfX1W0`[߫z(eM'H>-FY`;}P6?5)[O~U_S80v Dj%U/$O*r+cCA?eǤn}ɀ~Ԫ 5OŢ,ŽxSFXK{uw`bNgkLߏ%ro+?4cVvK5>ayJz||3π!oWi]뇼nb Qޔފ( ܴîd1C+G~jcaeaɐwbOA⑾/U_4'1fw1"=w`w1jcl͐*}☡)e<G9.kލ#ߌub[:x^P!tﵙ[CrQ}7W\bRWmFf$^3a!7־wl -51ѵ>^bmTZCΠj 3F[n@2ʅ'}0=CGa2͜+FPķ0N|)H3֌:}0QpRK]Gq.8_9"EveJ`/w:#ƞ˯Ƹ%e0⛴ Ĉ!wHc(N/5E9Pp;u7f#$P2ʀ!NY@.PJP.m7'>SW^ 4]P  זkIve! i*ŋ-e.V?v#jWa[rXdɝ/Nە[]‹;u5}Eebʞ]U)bE L cb #ǡF0܎eF F:B_cQ}π^vM 3 - İ}Ҩ< mN0\5f 󵛁WQ\zc@|>~}}%H& -N?Px-ms,k,r(}ne215).20Gr>KL*XjR}+_ʐ^\m X8ׇȺ~`Zj. =ūX-ٲy] }qJUfEB(2TJVyUfBRʥ&^x,V*Swu:PB/n c/(SxSV/N@~@2S1#%/QM2LW9-A >@1tV*Mʢ| omҟ8)X, ƶ$hHQqY?ׄqՎ'wS/W@`w#G{{E\Zp/Ǔ@hê~Dбg^C /uC< Z =k CE-KYޢ*e= Cn x>F҃V_Ҕ{7ŝwf鑬㊬cnj3wvO1v1&+r Ftr*I{"]XߟsS*"d{傁1<]HҀ>˺Ic|ͼ4^Jfj2K00N5}z?p7߶"8s:wC훓jŲtIt-O!g~{mW߄TKޠ%H@|'yV(9<!wvšj '~pĥZr'z jQ6D.dj p'Ryr6C gLSCsO͏50S> }Y}1{Z#tH7Qcf@+5K/ݱ!7},[QpnZ \$Bһ7<s#YZ\ƺPvsֱViäYk_Inj77uG, a"nʐS)ʾdf-r~3a`ʺ=5 bUĞ0F)|M.(fٿM4&p%3N@LP)N:1⁸b.7kV>7;<[Lm)y˓+A3;/F,O1T41BN~ㆣkI} )JcJ}\a+1%\ crv>զ`6lF>ƯJUo`>t s׊ku):V'mnLQGs`rm-oTW6׹o>01=tnhos+n]YL90j=ŸOÐՃ^V}(j CMm!hf,7hq#XwF.Ոg 1K\0 Xɹ>bۜ{c6n@M{wc)0sLFϵ-6hSg'/Xe!m\ շ9Jl^Ĕ/}%&GhY`A~&XtN;@ ~*ݎ1VD2][OQGpLj9\'bkl;cImVrաlb<~ejfqOmal mZҾ+Wǖgӆb3[b݊}xl*Cl,/뎣BD2;7j*SZܞ[?L(F)Cߎ މi9ڱw{5 8 *!^>6xxw&5 Z z(^?/>;{Ö6" > x;gg)FsS3u R1CVݮ*5 flxy`za .~;**Ru}zLmj'1kЛq_bV.q0应c7SehT3`Tmdٟ75"UW>^U~]-zj{$c^ZCEi 9ó^S󆡦biF(ȖqbyF__+*5TzFÐ1D`TW\=5){ i("nT *z0TOLDp%?.s*I^@qz ðs^YR>ҷeEoQr&(y؀Ζ(ׂ" f\5e;HPP.)qyʆSc>ar@Trzܟjϕ_ ~qX yR~+`RATv̐оTv袀|21o Tlэe1J%1fƒ-Zg! hsp88;70-%=~6qKg}8G]PY>L5CUzItIzʌ( o`ιhAm=bS浵g"mmillc'rWC_ 8%7o4V5;?.yq?wGoY(?0vnM}UahJ|;8k+0t5┟\hɅ&OYC~=cVKahsTC\8qA/Ѹ[mG],k| ϭVz5(dFu|n3;}x]퟿<$|>CM-P b0)+F81TF` P^4FMwTڴ}`Ƹ3NƝ 2Ӆĝ) 8 3ݨKI5 JFٙ49q e#j-Ĉsa :FЀ&=(i>UAn֣@BI[̀O~߭(K6_"(/Qߕ*ˆ Ԍͱ*2EEXεEV}c6Wיdj fnJ^.K/"?Z4孥?Z%˳.+ MALq/Ŵޡ/ę!(Qfď#jj n?&.OĈs`IW-C#;,1NwįG,EēmF-Y@}TNt;kq&w>+ki =0G.<)&vA\vxbcn\eh3@ 1qⶡuE΋ zxX*C| G7T}Eƀ3}?ĕ?" s:+RI| 5"Iq"87+PscӺ4@GŜJX牁E0,̽dK@)R#HO`X*W8 5 FY@LT7EFԋ-8Sj`b7cN`A\Jz3HMX12"]CS;^eL`Q)ReB.5}(/ʑό(XnO +kcԛFR:P~~Mq)88}Jryۏ%oE1>Q10@59دG5]Tjy0.}0.\y%kC-]t1C4gSV?{ Ʃ_=g:7&}b`LtrH>wi׷Є㧇'ݔ;]7`\́ǒƹGf#ș #[&rot֑q95613uiEnrsyU`hqfnC._G20_AjlܓܸqWgGlɹaS9_~daL t x6qȁ19VGW%[ QSq`g) pqQi\4!n8kH\|wDn ~u<.ɮ/g}xa!B){4WYy 1`B5c Q/z< >Hj`Laa(:g"e5pޔ:72uư(1v>B^U).k#,0CDB-Q_^eBNTp3Sz~R>0VT%N,Ppިv^1.]eʎ~538 Ѐ!*]b}KgC]x '3.0~y-V)Ua٬V_3P^[I}* +ƭZCRj&Ţm*H`uݖIDATJj$C*?Gg= MNGrOOahFw2^_\7JL=L@.t~q\qWuFFcg`= @\];q= ppxϋoQ1Cl[#7?ݲ͏^u-_wϛ0T`gJ'`;f׹v.O190tY7ŭ?cNݲ=aqOĢTZCuտ:,%;>^aJnLqWO #i3U cX-]ƛ|0D9a;FWZG`ՉrT>? ĬUBYc`tӚ3^1''G#ijr5mӯ|(<]Zv<^86]=q~=]}:~Y?6m{qAm؟vqW[|^~GͶ1C;~6JXoΠgc9eι~C3'u?)or\dM%#)ANWYu:~sd\98phG8^0.q~cԅS^v8#n^l:=z 1C-ߋxpL<}Oo*F\ zGԉ`= Dݩ_%Q@4(CC}snnQ^:PO**OJ@,[vTs5ǘcs2VeytEK RX]2XtqAQx|MJԜTu6YiCS_ 8-YujzOT *[ e/cO-XOy@RK`@˭C=Np Sna9*+j.,V=Z֋14.c_͎o!-]O?.֯]#.kWQu(A6C!f wCG&!]ME*At\j~)[r08j~4/p-ɟreMS\ H='(ӗ(Q>ڤ>ޘ J(Tk>QM*3²=f )X핟W̲G%H5iPҟM3jC͝Z_m=R lK&Mz6;P3! ̟F:C .غbm^yP v(.Rz5 e&01 2c"(`2)uJp0J%Ka.9&f>xgcx@+z]~gc{*j:PwLU)%%ۉh>-eP~  L/kzD١o7e;}ڌ\n-eQ}]ܦ Q\38ȫ(eu@{{E}W-!\`l}Z MBgeYS3ΚJ4 .N+ P\c[WFM-ȐQDc~T"H KNU(B Uޗ(LƏ*cL(<̀զ c14f`}M]Zu&q@'K%ƌv8pP@^tQy_ ZEw<[PFGo9OQjN\Ύys;TFj֥uW%#9Uz,TW$=f&gjVNJ6*=2+efYal5KU֯WdM-X\=#``콚#ƇBD=a $a@  0$x`hJ_AƵwF`~V xB~ sSj % IV<uT!cmo/?4Rj́"SmQ`.6/`!A~5!@ CE0T <``]=3\54#Q ]O H `a,x(6Q@($1x,2/8J.ܘ0V0-+P$SjM~+_JE`lq< 2]SRc( p}Vۣ/A?>lbT3:^|GU/`T(XGXԟ` H1L9xpՁFHR )F-`WYb&q&,q=]?* l\Yq3RUq_B}Ԯ]*k Ʈk)[vLMVj^]Ld| SroV/dRZahA C_\?K@(cu*qxFadFpٟYŠ1z~dp3v:D N8"Ƨa_< *l6 1P@BS7G Z*lIB)a) \[A@*31e6Xو|Q@DYGy%Z߀R!b#rvqPu^F,62qO՗N-Jq%KA\X^6"nƯsM^_'i$CG\?Χ.Q'X%c:16)k-5 ৱ~Tb\6$.g_>vw4y9~QIɽ]\ՕcXFjbQ1q+ i7G#oͅ{ܫ.{_VMz¸bc.̿kK㵑u.5nj;9o, \lUdö)ymĸ<~t{a∃\Ν<1]l;~:N˓+GcF] [SnM];=F{qƺS04>;el mGǴnuUs~2;eeGl9sWfV踳ϻqUu帴L>Z8nxrkd{E\{Q7uqqbw>e> 5&ap(Ȗ`<uCP MY9a# S ?,S}juz*|wy}QƑ:"!(߹sAS"mD 3sKz2}L * (P޹.HY5Y^|8=Gm sР`G1>ˊ*A&H)[(G'N}wqg%jc3$ΉKSXL[ y&,S 2y^j߸uhj6YSk4]YhA-0:l2(w2തnC\Y=~kߛCޢ?FXn'۝'3]۬5̪)C[<]Co{._4VΘpx Np0^<cUy >nhńn`@C=ƫLm9`T~ T ;7:Pb܌ X;p _e#]oQ(jor\3 P#=ȄcE TB]k|cEcY-5MiM߲yC<'V-i<[SU -ccό!3~hsv;mQ20zONΗnj+V'r. 02FwjOzrn;&lS7%hpn ;Bk g1S?m)cxBQP\zF*HMt,u+,?:(n;C\ŋt ѷS͆<-aNg\w0}3Ъ&kCߌ._+Gf[>z?W}LnYo6Zc帜MvaƱqފva'g 1# ⺼~S>h\}dqʐ60p@OoPEYt" 6I񡺀P hX-LP*E``gFUT\HT/ _tƟ iROfqE:XPc |PRc RģMdk&#\9Qw>c@ ."& ,OhėW6f)/7qCa+%Y^"8 R7?` 1!c2/|MRon4PKm> 0UYP_Ꜷ;>yE]wRsahᔫt?0qYwLC:zvtqzMah#Ήy>ר ]cƜ}A{ 3KlWITfϲ{VM^Esvɀ[BL='^'.R8=rึݪzGh~}O^ (o;-:rlrr\Nq8rq%N*NgL'+N]s7Ys\.q6eL_Nx٭11pxyⱱ6oI\OǮq `֫Ίc:).uW xti'k_Y_:C&O*R })7+1={A?UfvY!Jz+Pjl=`I7<{6œrdrEq CcySc9S_7{Ͼp]r:vT>G:LY\έꔠ˷͈~w8gV\^} QŠKsowXa]fo6> z>>[G{=^NOƓ]ss.7A򮄡^04K2.&a!ż ./4.юG1!eDiD Z٘гl3Ǵ8dtq{y9.69aN8Bu147 9X5`1[cji0F_fbC`etF`81ja\hH67h@8˗BL Ť/}K1*r0nXT턌}B`8@)j˴rFEQ\^R5@y0PGgb֓jvFwC`|ߨ@+J;>vE 8@>)EFn.u 4U`T+ K.OmQ ۵V[sl<}a\ehk=Zpj\yU8cyVΛ&G^7kB3}?#'F=b+lw]f:|f53F{3{P C06u  `9%(y/OF:0ڰ)Eac8J=O5Zب^ Մ\0K](P >zLԨWCZ1fU^t+Z(9^AK"EɒG`K3ЇG?zʞgRSsS/@2hrDeN9\oo+-RRV7]ҫ M+9m嚓ڞ~NqE5t5'ZPSndtFOKݸɶLy7ZՓVd@5K/pnO\JҚ4VήU_~f Sr*XoFKẘQƬcҒՙ_bY/Tn|IeZy;0Ԣ0~N Oe( RQxO C bA[S(>]T*^0EihGIx eƜm|()J%;W:^(_#Pn?+p DJϵCm>6 *k*C{oqsVAz wlCY64:fԉ1+ׄcoKUKYu>Ta 8g{5]P>uk5!@ CE0T j w^˝|&W^nw`F6jB_d |,'.OfCvxO4CkaD(1-EL\\ba2(//Ɛiu{W|Vp3*-{W8SJc|SEb( h=$+Fq=fCd3Y[|x5enjr%G;Kަ;4E/dc(L 2c/pi,A2K }HN- 0sT*ʵJu(fA|J?,,Y\@Z-26a 7dc|^6imOMf=C&s >GV5¸.^vej,?.Ce|Ϩ~>?lMnZ+Uv(L0gak;{_D\sPwCʢ !C=b8AIcd<3r㕫@Z_ޔ1])T50\EC`d"K܋s:>5 8P$@`7|j@,ꪭwgh61ʀsCQ,@F5nl?bej1A)U0aK}`4Vu"~'r6-cL@@KT0f`s}jlė0T^tQ==&5rhL_`V0oкe*Oct3qzr $(N>snmb.c8#~큹og]lM)C 9Nb*nMƅ?<2tYSݵָlk,?}d\x\sbPNhG}hcAM^u|ELo}^\}P8mcgçft8X7ϸwmݏT>KN|lP<=骮j08r\<)ͣۧ?~370mbkM^11'ivOr)q6u&$z"\ɊlWSFVubm3t_ƚ.ns\nq9, 6x; NX֘23q]n3\Aի+nZPSq0P$YDz!)OؠpXQTM$*]-dFX$#ǃy1'P8ޞnGS-MeaGu< n) @HrA58Gf½C)2•)0bPD@ JC9J( Ы/n-Q@*73^;P~_bǐ@MƘ2{ *mF>*W(den0ccxi\TlRŝ/\YqSPKQ'h4ej5]k컢5ԥZ0zܸ-8S;ɽ Zɚ %V [^Cï,:n1; mܛ =uXz˱nqWψm'?ldsAKr[QC.W0[%Z|Ɛ~ɣWxxT1F;ЛϺ{-">X|U3/<*w>jjnn19x׬h1;?m{s\ԏ#qĸ-,.>eF ME '3E6$tKǻ Im?01j7lCW3'ń{]4/_>bv7s\d.KHcquE}p}+X?ި12l;4 ˖|ZPS1C) #MΖp^=j{E*3|CCu4k; J/sT[9|F~:.ge:TV]xY ;sD,>K ]g|uIۧsZ _7¸Ngяsn+r/KsAqe@?C/;Nk;(nsаǢgC:e[εQ>/F{]mUs=Yz?.;[L6(ƞ3w{049ֶ$8|Tꂬ^9ٻ0THиcG۟]tA\rC15;qOs' @z(66>>`M\ˁ Jv *:Lʵf1tNƞpU0V%!l`p sT< HP#?Clɱ53@PP RQW|˦|bwrsQ˨s0 %0?O*m'y1@Ȭ32Mp w2fU@C^V@V?n1U<:,44F`Rڨ r]kˏÀSl=ߕ tS6ʛkP<5UpFa&Sq'`Ĺ&;Qw{w@bKs|-ahw]fMV5%OS\w`hͣ4DKXS*DO^t[$uwsc'}8Kxwr8W;rn,>1P*B'VC2qv *4+bI &}+6\l\wHP{Vųvώ6rl,1=݀ObAkSQux 8zb< Ng .z}ml>#Vw$z#7}y@kl6Y}qe'$Wk G3Շ^f6.6>t}q$w~EPbk-!_bCae"OA`AP"c $w%{2վ,"(A )){qi@ǫ<3ހ,(H Ia:|sES2GBa̕%qQCp)p&U[bg*"jG߉ЀQ*6??@ lC9ڤ Ă81p1 TX %LP$F3GޕeOK&/RFpdls(G2p .dլ[kwⷪ+ƧZGْ9Q혇TU'Ĭ_|7YK]̟dejRto(Go/P.yfP٨aв.sGķgq+bٕK8'=˟gG/ gĹ?67l } :+NxJܸSK)RsO$p\gcũcs6^6U_V?xRlMW`li߽0zgԓzi=JOiM xIgŔNd}2<&Tq9%eˍ˰#Ĵ)si#./T y尸qǣ3NKG돳/͆ca|ώ>+{/?hpb ?/| 8z2x?-24ǥc˷r\Nqy4oLqL+[3T}aVM# C0) -%bS(0p2 h % GY f)c _0jXB`Kf|A,` FoLg-UצI,]pۋ.jiO(ClZ#ڷydظ&]dlV?"l;PC2~"JokԐj+P{RKOǽwd`o|^0yC}v+kϝk^^.ZR旻(mY56*/,شx&XbSoeKRZVxh *[XSQOa2 lC}byH.)ZMT^6\]CD2܎OO+}Ne_1OQ շ,8[ňP!?Q\6j/8_ j51M7am+xEqe~1k&^pn>}r?167y 'ܕqs) dץ_#ϴ2ywHbN'osP?1zMm#rMX5nzYOקg+PX2?ac|:-_u`&"6.`UsͷDB ΙI}6M>AodҜ):ݐyܑI e.J#eBolLw[,{joF9f 6rV&L,cG9y+KR}ڐ6f|R=93M0>z-{n>J*K)$Pݒ}65}'}k. jČ4vAJ 6jHڵ́cSQ=?~ҞPV=2#Msocok7oz_Xxjt/ cSLϟyvS!fƠC@C8HOw׀kHmE0TSAx yJ).rPP/`L=;\'u<p__U:"N*]&ʍX bթ4l|^LjOKYʼL)!bP}ߐDWlIX2_Mx+*U'S/Adp Xh2 뤻gR۬9<2!茄! 7g[f<`ߟq]2bz5\YY~)kyYUg(e=ӳ'1˹>>c 0gr6:;2vq)adZq^섘,Ml1N>@sv9t~gd^%֮Guq wcnq&>%۪% 0; >7fKͱ},WNz\}2:wݛY$XHmؿĒSJk pJQ j^(Z" MhMS<6}H;,yѧ9eqlal0ډ~T?MyIﵿ=@ f{&EEPXJwT*q=R3+$Kr)$PUƵ̘06'w$m=_f?=eu2@5*17Η5¦M;DQ@#W%H 4= N|PA|-Q@Ϥ@;`?0s2Ƒ͵_]Q(Q n\  RO.`hO-@X5@'q. ?>9crfӀ5c ĽSQ}0f.ks]v]9kJvoÐΘ'1{J!$Qb_klv߂߄߆}aEb_14֨+%ȚaoRTq $z"T !cALfoV yY4P nMؠ69pQ`(PgefP@0XTl`@cT 8o`kG)\ b@u`VU^V_K 8N{2[ݴ?ANiq__AE(%]lFuDW[yϲ̑yWȥ)L̘$~H6.,_cS5]s%{aО}W[PC!yɬyTE\r -M|aE=ƌX70bLr1\]\b8!u<b,??U@@=|&mC)}"ވʠ @ArⲤȓ3t?Tf6GgVfe9=q@{gn`Ȁ3o5 Dx}YvA7J}UK(OT.@\(Pߨ^x+ /0B=Ho%Oy߲ĩp>UٵaSLi}x:Q\sw!ukLS.*Zj> mSn*K#o7M^-ܵ~#ϯyCt@cT-] nh2f^ktlyCD)}8 yc$|?n!O|fHZaiZv/' -M|7` Gc3X &`2 Yӣ#'aCO?U/ |3X Sցb<^%U}ҡ*BLQPR7!6TpoPr(>c0st ;c}*_>uvqeK@ؖ.XU_R W&x_.uHT۵^uٞǡڮTA>P . ͽowyMqk1qފt]c<4~SwkEչk?8KM*C?49u=3NK(c{w; "|Fdd㖯^!7e#Z0$pL;lM}E\aoo{ &kj4ȊU? ogT qi p +qc9S)e =8y{D)(DR*Q\(`!w6QLC;bR@VOWɋ:Q Q` ƸRgA]NٗL_ȲOp|rUػ@z@/'եkL_pi|K_;ך15>^c-Kkpl_SGʆD.N?[ܔ{VV.w>VZ@]FkZ*1C~a+ŐIJĈA#bX)u˒wV^7V`[ Fx.6+67?}avҾZ3 y WOɽU&NK7] Ĥ5TǸ=Pȏ@PqKt ߓu?KeeX`i n[ rAIS e> 5&&Zfx c\" p11,bod͠c=+sh ,q"`q{MFQD2ۨN @)u->Aߠ{I9+_glk3'?&rQ9W ? *@n*xxy{3?k95}*o}R+*J<8+hRA1qR耢1V:fqD*[jm:?*Փiї ,m7YQ?do3 ݕ9j:H9tmvڅ{?L_Zn΍g }Czu7먴,ZP&3-B;W@۝g{3KnR?47=RZ?[/2~*cS3| ΒƮ.X f|J| pA^xzd\oD`gR2yF,yxDx8W/gb˂~ 8w `@HeV6uProN|Fɍ|:/*J#Us1iI(#.YESQ@i#PD.IpKlKYݚ`4ImЇT.c\׃kx@QӸ7q}R[`QU)GWuM}6돽k =18\Lqˆ cN1ǥqMߞq񜘢e/A1j 1ň*skXa1C ΟTWt ITRz+SeO2nekjZ\ԛsC+piP0"c:nO  LEϽSn3, F5*p$F0gpM;= %GѦ0<jAΔ Q}\m#k7X41ރ2l1cF;hNYWZS* ڸJPgUGť=`ri TgufW<7cʽ>-@(xkS ]\0.ʵNA!*l=5^S\Z>8}vyrYLg%ϞMekfw?lT3}'{Q#b`wUbު]WKj C7??Ŝx쐘TZj'cPKnԭ"nlx Tj7" _1Od0 ;?أ0 # .7&/e) 'yb"o s( 'AT Fl3 .]Z T ezxp0ARpjs@⾢l!7uFpgg(PGm6K) -T:|p ~Nn83 x,5S/RĨ_`WeqEQ@NSy uNA-߮nwAir 22A6N%@eյ\kT C-'?`~'La)o3 C_mzl+|@K!1cA`CAt H|Lx; . :?J *L^wK=;P$bSQu˥}% OK#m 9uD[OY D`+N\BG.A\Ye $HA0JQl!T2.2;VDRڦ@U/e23 P(? hx_'8$ߗE'7*ȡiત,q` xOǹ cgbukDԫsEbӺՕVTq^QcsG>M)nV:㌗9$Ojl%o  QQُO7{X'@j(10 :OE[en1v2 1;nʎϩ;a-2,a|TyvEc0d /BR_7rr3ד'j@L_|iVSMFpd싻Ppw0N\1p>s7PZ"?<3f0!ʠqYQA01wy`qn/u4x&Cw|?# ^Z8WR0Dwٺ;,.2CPPR`<; P czF (bSԞ #\;2C)) P*Z 1c|kJrJ.HRw(tS@hN8ߔAHQGUʶ! ,Pbx_%eS%<G} y)|Rn.p:UAE)lU(n@sj4XIXW2O߃HUta "aYc \5ukƾEc[reUK{v^r߲ 9}},xda{gޗS (;O43lTeArL2tz[!sen_ΎY>0T byx2ln2kXqM꧞[SVnlwzZ C؛]ygXbo>bXn՜) ` K-[f0Q(ec3s5q0TV]\]nsW.K1ꢝC0 bjU6U'Շ X؀ {U7|JzQ]0k%QmSqoW>jw#RMߪWP7# v8cKU/Kvj΢ZڗahӪ\`-(g !N:C/o8\^[9s^΢ETeA-9fΜz8H[DXqo>+ߕWΎY>0T5G^O/~MӛM0ŀĆ T5FY @O#@k |g - 2 ظb\PQF;qEw'*28rͫ߄zRcȋCc \x/P f`3. d)_=Q=by -As;BNBG Pi;7:X aځ0 4.Nѿ׿T<A=KsS2zW@y5pqa٧c{떻Xq@sȘhU!jь[c̝ U1X] _PS.2yS* p`#2vr ȵa%1f#]u)T{I8csx-3 \ !ý:0O@Ptʖ$Jc-YOaq.=5Vl3[^w/%6n~&^~ic<-[_7_8| {ۤ&vKUbmh,xGC?:oCXjE,U9Usk. q[`2XrUlLZuO5k+u׭6Mcӆ-ǭzr 9ͱŽ7!v=wVL1b}au4{M• ySN+7Xxzg8ojC(0zU<#*øS\~FR]sXFX90)&ub4R/ 0m9|QZvPM( +5$_S?xx\sph :K #(G~_&>8Xrm3CʑYCX]k-5IJ2^TP}}f;oz<_MQ <-}-<W$ԟxRsq4y^(X xk󝣮=~Y.r={]_q%7}^%ߕ= nj9͝ZovX>'$l&3g̟{V-\YX٘s1iq眥I1qt8ƍ#pc=uv9y1{ʽ1ux}p\zRh˰_w>`Z̼cXtir7a5tYW;/)Uak“'@OV.OZ3N6iڴ-ZN/cn ?>LH9s?ҵX7[S=8qK3:ř}І'F Tʻ㉧E3DDZV`ao+׾>{C=[RfbW x{-` 1N|~X3ԞʼnN0)c{Fp@5W<+<9+1d%.1+Q(*B& tJWvh#eT}+C:>w$,gims.(+OI=#,m{\f.A)p O(4e/ "gWW$^(9^θ Ku ”Ɛ[õT]%J~ qy?Elnzv]1%`VKlweP,/ Zd[pCSfǯrKֺ$wc9ԋDT~6߸4~Xhnٰ>2)㦸A3uSq :вόW_4m^gtXsAqʥ-kS_SG#':&%؜mpE@]أ~.,YIԳMNLVŽc^dgqm{o>N>&?=и׹Ϗ^OޛO%c[abb~wEۣ/ а1hغāqi>|xxʸ NCocSr <)uihm.y§PxZv0Q\0eo~*)J?-c|`. 8)qE.+<'V\ƌyS@jEQr0`"5=n =cN*;ʃ竏s][`ϔ8A$G{΢0R88G~ 3_@sa04QUg*~2V 'OnHuMy^A.P2)74gH>@l`]0cx~MveȆ0d坧]QJȟq%'%.l^-4Uw`hCQ'p/Ĥ;-qY#6yasވ|1Uږ\]v#7 pQY#7kg iīcKb)1{S^_RLqYtO]ow%gEm؅ƪv^޶:zV!7bS7 D.s.fw8rx;H<4wjxFnPyk2plƎ:.7 nwE qj,}]\yL%'owյq.!г~^t<]ಸ%qˣ6z|#g=(%ƂE,ɺl+fvm-b@45Vf18T/ 5hdyxƢ#֔ۿ \p0nqHH&Շ:CY[N(`A(`C* Ro2Ɯr|R/ V.Ę>Lj'?PWwlp)@\S WhCY]9Yxȓ*jPb O?2,=ys7363Uxd-*kt6 TC:IerQڎ)Jc5uNQ\R+ @MK]l\9&/~e_G,'3G+cy7ěo?z=6>zK+V>5}+͎yV-]|EZtvdžŷW`wRݹbitޔ4 cނE]O/ĔS5/7L5:9ӕ1u❗N )_@H7[aw2eCL~XgKk~2U{fcC7_Su}zD3RwG;y~< ?2Q7ޛ?3f/xrd?Y7x؛>w~Lp[ǜzzK>.&]-MfL%̘F L@4;() (Q OJ(?0nEj apJ H]> טxJ X;q e=.:*zP%IYoH;$h<(2꥾,si)m.AD C E^)_aoP,Bq"gbŒ )IieL85VcEn85ʠGJ}KIqy%H{64'&]_b¨=PU3{jEm`ȵUejo7Kj dbs@(7#7YtqymИlQŪkpʳjRE_ xt ZC#1pa͢c/9Kawj=w;t!h0h3ČCNYS|Y1$1d-[f0F0ގ`R|8=|FSQ! \euaĩC!Q??T%`H:`c0A1ހUw?@ ɓZ^F :CO].J%t H)|(x@&(G*AP>b G} ( >+PD[\?Ƶ$h,e8FWB@S*ʳve,ՒVسc]+ ʂ́Gګ=R>QIv^پ¾&Vj03wci2u' 9|1MgoAKaH c] zf<;ӲC;Qt % p51eaBFaMKu)ǔJ 7b~bTrU!U7)TFAg8 ШM 7u{e0bA@U,=L 3N}VaD(C"?}!;O}̝v{ Wי:k#`Se(=ڤ@F8)kC1.3@%`)eos\Ѹp?ׁ@iqU)c܇nXxXZCSߗj@]dl) ]; oB{]֮?l@jzh°yZ0 ב$6F1 (7L |ŀKy7\'Z{O `AlZ{(RWPD"N XǕ5dy mTھ`ʮ*0l#X1a $ <M}դRP{a(.`ϸR+X?K0Sf}_1)2iWqaq;8q)T6Ug>Mq1Δ D'ϔU&6z`Y-PbZtqgJ8j`$lGYf_UW}t'Or![`q0Z?.ucC r]1c3o@0րC 7F9`hPƗc^@+ƑB#0]B(;ȗZ^SpaF,>詞9SF 3UjA K`P6V(Ƙ?p<}ED-Nƪ܎F P8?Aeu-Ӧq+*4`v})P'`x>nK".CT׀|/8^S\j~`˱Vgj73^wΩaqM\qjeZ>% Zj _<-.՟O8=ɘ7u qEcgZ*C-Yt>\2[ˬ_Sі@ޤ[k5֭Z:ًTzb@ 7<)0 0@cPgFyE G*瀁28L N( 65ñ &@ŠR@\O >c*̔=@6;Kl#LM2emG{>ꩿԻ1VfYC\I\n ▨%\GD4qiEZ6շ }:(6J1: B%YzM2@c٘u\|\+؁Be2> #uz#8ebcn=5|VḰ5E h3WL)F ]ZR^{1^ݷCʉ-k}"l= USPGAM<3PeaA//*YT_VQfMq20,. QT02T2Ԅȣ\ʔ [3 Ϲ] ;# 5%Jp>sm$jF{ՑA5׾}2 ގ<P{jbƸm(c\)Ҵ\'xsQEXKsGdSKP@M'rsmɛ[gTDO`ieMR u#,?@q`E֯eHWІ;s{̺[WNCN)ŝ3k_Lv{+SOw C腸/8Zo޴3.-U2 500^\@L1֌:pPGuF\`18PD|pچfπ3$ߕU@5Pd].ʄXn3ET\V >T0#MU23eGa|OM@Uo `qHu)=܉/?`C чXIg>r@GŒEn,*w-[h3TP@x8q9NL=ʊb,Z4e\demPXso+CV-}Z[]5Gܘk=fNtG;{,pELYX}s?h1;STy,]}K"]Mw C0O>4zLᬥ.WbI(2Xɽc<;D0ZT S~^@5>*[0 {1jԑ#Xj#O`՘>N$ʞWtG ^)-J7˿T\ja̵"E iԍ+*(1SϹ LN'` _J,`8_~/t[%Ϙ12M{JQ٬1ȀZkW*PBY hjccs #NJy2ޔ+7C{jE`W-5MfAβ<83)+b}N;7;K=JDjukȐFɟR@S>G5믩ZaZa5EAabt+@5c;J'}j3lfF 2x' l(Z)KGBj'3ʸ2>/}`@@sAWײ|V(@*Qk).&[!R6?ڠOW\0'.-MrQX؀&e]_Af,]e[ }}(uJ$/&Kkq=20sPbՇ:fKJSYHߪ_w4#'dqnAE<Ǻ+3=kZj }Qj WS.楟)/nvl+ ;0_ck쬯OdzQ^Jƚ)`2 P02\e+AY=#:W\qTvg ī0e 3c|T ݟf`Q9 `sl8V. P2RA3Q66h_>|8{HTuQkWuZ TK$Gf~,cAr w=KyeQJQԁU@R}Ir<՘*5,\|SrR}1vKeƒOr-TK0Լbz1ߛN`T-:vZaUwp ԟZo*T )A͞) ?#-N tp!``ƕch{yYQ06up#1 ?;0^3J_Z* {O]qpB\Tu/CؗEoC< 孞TPTp'R(q.+(1K=>G%6|i~Pbr|+SI ejD`8U^Y^ڧnN9PxOtc|ur. +9?כR] X@\McMcZD)0jTܑ;{8"|_KehW]lN`ji$G* Eեi\G~ оZک }ӗddZX ] g@1dԄXK_>!bpV-#(O ^v`Ww?e$ZWOnjTps_wqK% EP( "ZqU9 c@jGلwbꫯ Qv1V\MeEn*XF*Pmq?~CS>P'eq+S7O Gf+/w00X;`@+7;ڎ5]ƾUe CԼj=xCovgE@۷hh}/}!٪ ;P>'|W%TP3T2ŝ&e'xF1J RIb+dA}O0f<Hƚ4P Q )ǓCR=ـRO+x%PC1CKyE1>L9^ߘYN&w.JW vɟ#PjI bj[#ַnuTօ@5QM TE/ qǁ N_隥$u]hA:S1J-+PW3{*ڵY-d؍3}{5gYj1۳_+ yabsd}9a{O}ԇҩL9F`0uha\py/>|0em?Oŕ@Q(1n'*q/Ē/@E𙲁ubBA Ey@@z2@<$n>@  j_ ;R@k}x.3߸6XRWF_<~@ }Z8)\n8}{6cE9R&FJsKv([hrqR*S՟j=x( (kP}K=(koOUK`(/VRzGSqKC̟Mm$Ǝ}3Of~kV#0DzgD}=1^SW}ޘ EGaC !XaȨԊR@KYŨI-kYa8P(-h*j[P @E2lJ<Hџ ~ elҴʾcTSVk:Cg;Hry@1_l60Q(Ae@ݨ?FЀYq{l}ڔ_>|fƜqfQ*PFT]]8ޘFւ;u:l jaQdj ՏNvLeE)/}ZahC P+} agۗnX_P J**Cɠ1v % ̨c5 WB1`|A#ĸ[.swVYHT)UpR3bģ0;c_I> =5FW6cGK u+% |.Or,W\bO ^ Se.dQ`A*ɇSkˬ@#`jlr>m& kУuN3HRS1ʐZC!3d?4vHn8 yyaǔ?f*CG VEnn*?uu_{/&1^ǿ|;~m{s90"+3 WPf1S æ@ 0aJCF+TbwEFBmà1>wWC Bi uHqʛdEP9c,,X1 E K1a0\Ds,p @(K `m2C͡0F`hs 4 x=c}ڥEӗ(O}ʦ8yPCO+#F)P>{`B9ڢe{i%{ XYXяM{. `L> 9+Eg<.I?}8uVSw|Z"m!lY"콵տ1e }k9 )eȌjRV ˊ쵺~^2zVbolDaz3C,/&Z]l}<Nz͗1}+w>6>|kcyxcqύw/u %d^vwso^cn Q9_HQ77uAQW- jC$~O]]KA⚙3aUSL1!z/ooyםg#J7`wyߍEdžXv31}=y[_{9V,Yf3z4^xM>T/[%V/UŠW>-\M!J cN9`&A};Ot a0E3e1@0wHa%Te0~q pPE@`ƨj3\O\CWՊ¤.e5JP9\}8l4ZAmR jPFcܹ[X =(17 ,hU p݂EQuVI8}+[>)ڦ`h'XQUOಶ?eטiSfz5rEi<'8}oKc[&l ]n컲b5[!1gR+ EAESlؒq5cf8ZcZj@c&*Htxx M}DZ?<1z /.y vo t흖ڳq9=cɫ11Kt3c+{{O^1md<ӂs}k C c̈ 03XQ`=S1ቾqˈϹh*F V&*+ TCqLe1Qru#Gxp(S@(: @*A+i zԎ2] Рbd4R F_Ť@S V(بZ_MT)4K.9\e2&thn9jkK~%H\]'@`>`=u!ҏ>x(*y/ n7Rcfv1ؔC\R+ 5vwEHS!0$t;Jڝe0 C{ ׺ĝRz&g˟;[cU}⼓{_=k֫%h |瘝1m-6}^?.μdP\ؐe:bP3:‰_^1}I5(Vn) 5"3e1 %@ bDY{XpPKLR!(D\= #=h 8 (2@K˫zYTѱʠ\QMY(PcKLz0`@ut} ngu%G-jOMFF!T$$&n4F,mø]өL$CQ@GPeA>1 npnN*h+PE\Gq2c Ј/`zNWh!,_˾_&$Eɹ\Kwv2̔!j p Nʎp;|`}QM@:UZBFhv.a_O@:H?U hGj em3OPTfxmLJϤ }\ѻr9`]“koZ5[-!}R>NsEQ{'o使1CKQ*ygѫ@RYg)okJ l $P+ 1bE2v-Ywrm>U<˗̋)Ųpm1mޒ][HƔ!92a\n7ϟglӸT1LMEΎDzgSv-u7dܐcn q Ɍ Ay%P˘e0` be'wuxz:@_ {+F;[Zƹ`gr+T$.F]q'j  >ul"fˍ%XWI+s+@*3Uyw+0S/mPM (cׄ|bcA~h38QYYS>&k>3^\0*@ Yl4> J]qf_f5@`aO6qŌkG<'ޯAqZ`hڴ1+G(VeX]={C^ɼx[7!ُoC].cZa1>Nݔ}5Qܸn21jի,Vk"d&.`0\@Za}J82T* ƨQ]Js < C >F~p.$0U}cs 1"C+>s7`k+ŅbAv:Vo@vQq@DY|$7wcu/kUV8 TV{ 'g dku(b\j'7kE1T?ymݮ GkJ:i{{Ep_-5V/S. t'M@S^s$}\fLQp}sډ۱]fgX솳G@g>z&j1Ίrk!x'zE=Xvf༺r*YF2 q$.XDru4.Y8Ӭl&{3viTylp.p> @Baq:ÄqvsQ{ E `D\ = XF_X #@,i|$ + u41#? K˾?دmu

H>8!Dz'K# W,Be/Tנ{"Ah-6_Mw4fShUN'-k$E/{d= *oQgt-yR^>BX6Z:6Y1݊+ˤ#qKW|އrm4;{Ç]m 1szJ`3h\f<@zݍfJ m#E=$++dp3@O~zp}9^>:p/8L!,2O57WG@ ƀQ]Lc<'ړ$1 ff_Khݭ3[w*7oZOj |*޵iIM[>:DUwM~7C5RJ4e GQ͝-_B ռ3lQw~˘vlsPYBtϤLZd(x ,/xE>DJ|C` qDl/fzN{HCre__Pz>zu#U*<2*M`!o3}7ma=8FCa*EN}o|gw~X|{?N`3ZB93ebWf<cx] Y(<؏4n3Q8EݲlY_~n _}~JGdTʲIYS@DT:ff7BF3.#:AywP%,]JRkTaeF̈́)ЯΨ19{ "i3{tl _MI X?2F¥tP< ¨'D3B !y2hoxDNzz8n[L*t܈رtZ-7!EK=YuBQtڙ>mQ,."Mrn9kYk^7i$/Bn.3@9C p̫_2aɣ (8y׌Y /\dW|KAŋ4E7G2LYAK ǵzL]Z SF 4Iy6T<ÓCZ !'*Y$&MG_K+Mbl^5@ՉIޘƘ -?wS?sW ԑ ?<pଠ2Jޮ6Z &r 24 J o\eG⻝$z bVк:ԌT*]y8p#RpkSܸi|q)J[~7gV'>v>~IkOaPlu *G̸d$F?/ߑw9џܼm+8p7:F_njyot3wA~i- ׅS vݾt@$PŝUj=KBi^;=;D7go"-˩N3˽Enfxd(u l\&y0(XRP~TB1xx㿧eej=txGDw| YK^>-c]4tbG%/*͇[,@ ljژ LبJI,/%REzFqFTuClWfi81/Jkg2P9=& (Q (`$ 9Iásbo=cƶiv;ilc%jyܰA Ge;yCNB]”JC8ڂ8ex Fxꌫ*˃c#{?hqԠKkCANZSsjp,d}އ|/>\%{4oy=7l|h$أo$2"UQV/2U׼|va/X+O ~yY:S,㲀nХ J#`eCb4bTDM+6L'8U%^YwFf^3VжWqC92qV2N׮/#ы5UL!zj4]NVON"%F"w˶Uθ?d~Eq:U_eTi?MZ]#Et^QmA9 j c܄xd`KX"ŕ\5b*knr &/P eK&`-zD=e;Kp%Deԩ!L]B!~(d,ߖ?^WqUq[jWer)l+βV7ilci!E?!$:l*G.KB-ƢVgM#rMJٯԑ*iV2.GEp(LB,zPǿy⳽B:>FLRեi?u>AɋX|dGYhjhIw)ER:V0޳kK=bU;H|pWMegzöܔp8 !LkzR>gXR.*͟1pşsv%:{(/٩x[Lwg w.rbսdT{#-f^osK ts87$%JS hב$lG5|VN2T*I;sS(6u6( kw9KÅEc#%/1w S(pON3d\kS"ӑ)J&tn)V<1BpP xuws_[T]{?L@w~ },YK^s^?19rNBfrJ,W'G TW:ӭlp:#OX4s(AĸR͚K 6ŅHu}7o FYZ9򩼬Gفը R\lT}JO9vx('@HW8O{=Fxe<.˳ z&W1@v{9KN+L醻8ڇ,IRzFinA1&{G,#[8FZu,rbQN5dɗ Mݹ:u|j]*fm gB۠/dJ4LMn .Xx1NƬwAUtrĘ'\aMVwQ8#sju^Ha :K"Nv[ʹM"1Pu!uFl⫰wLT )%fED*޺VIйn2v B5 F-t#ъ}Zɼ*fs|ڽĭn/^ENrv {"㧲8vo+!n".HDa\4TXp[;FR{[ΊE %sܲrFU%D΅ u4 ,MӸy9|3+ѱѻQ a{ 7O)FDtw`| +z=bu+ }(zz?gQ/΢^z9oyJ.C4]\>Swzf~|-<@ Y~ܰm$Ny"ʎh#'\"$;8DEfeɛT7l."A4&`# ([ %-giaF#73+#14 k)=yyvF0!N?[`›G! ?!:֛cex=˴% Ur-ѡсc=<Ǘ~&$p"MsΛR5yԑ Y4F[ϧ F#Zn/&jyy/|VNǂD pjY 3IxJߵۉy1ð54|o 5}nBJ,HFLULV T=ޣ .݉Oz^ތny klPq)(ƪ`bFHĨT#PxVٵh.BY嗓B[G fV}NU-7!w}R!^R1=f EaΑyZ%vQVR_ٯU"YXsjl-?d"E6+7Hr֟Fl-KIѦHHWcZs9qQ Fbs[m3jMa%E,ӭd,ztMvL,;W%\'jZ3pD| ;4:lͨ#˙"CpfeU3+^,N~_]/坩'?5>8Ň[+Ť '`=qm "JUFۘ(ۦ\Iyt<7› G/:-S 4ҽ/济/aAL$Ԅj i||'$>5}UJD%e 7&ljNG)p M>gE_cd=򴏪Zs9zx qG d)f>P{ᐎ3Jʐ2&2|c S\HnSp쭥;[}$oտ7|foۺ?L@_@˳^gQ/}SĶC+(/_~΍_=vs qZg+=$r^]eh-NBg jG XL^oAӥ: /N 09J[7s '<̔#qf#O DIaD#Tfjcl Ů\CS1-N|#@yrqP[o`zƘFP;)ۚc\]6y1_6ek%->P*%"/5yKpKJ z]o9T%o^>=~<ƒY'I%/ȅnjc%[b<ݕȨrQ$=Mf^nRϦU9 +0_3=E;,`Xk݌@>X+̖X8dsjZݫX~ [s͡uxa)6W⌴m|wm)/{MaĶ+ i3WjBۯ׋;5MX0a&4,۽$N5zcFuᅸy`s 2{<#g6=3pPXxY˫',cȂ3b*oSbR$wDR! U)zs|qβ2njmI4nwnpi/ Tu䲱$Kl!/֝Sx7#?,vtROxr3~lu62ꪬf,e_:z[.N,cE)s)CMMꉆ|hRoZΐ.tE4,wKy2[9L5Js~ΩfxuцIhSxȽyxd;͊7Ń^xf+򧆢/%Ӯ/ mqM^.a>03s54[ۮ9QiGV2U1URoim'=8-UFoNL c绚F!n<'l=|)>(1'>|3w{~+^x?~wHNu?p2^gQ/}#n%}>U,r쮒wK@Bl<ػl_8.V_n8qoy؋M8evMdzu$`P״ƻ#](E<#D4BUP#zmHc8n89CX_i%tZM0(pMiR'{tapYI^%.k5|$)j`_k ]zx?0-d$}QںoUodo~~\@{z6pxնfYFxs 5 yS_Fc4b{{&886I NޒՕP|Hi33b},:|`-H &$| 2j̡f/ YsNDGa]@5ldYQm~Zƚf]Rkzs"mRLJ,0m\Gų}2݆VYd4e3KEr/J,,7;)zXt7ŜTU/F*NCT*-F ݯSHE_9Ty6 lT'Tijo 鱈Vu 05f5Y-mb[,q6 w^HB~2iںE| GiP{xZm 47SmnB*}S tuH Byod91k]}j';g8'-ZZEbJ; 潴d"Fy;F~N?H({p$,*p8/6wumLJ Kzv/?~ǎ.hz.Е$x{0r$Z;"ҿ. ╫/ַHw盟?3>30V!?r(G~h()F]۟tZc Co;~yJ\%Qεo~ˉs~ 3zx $uX++ߠpu{9ancbK HHút_f`QbH2B'9M<FX\*[@D'%kO?k bR8ֱHIL0u9cq]T1D+ч\7Uf s@J)IV,7N |֏xEmx~z@樔_%, R鶝 b*QsmBŷbq;$FE*eeYQ˧O֤^< v_fMd@Џc} ;%A0"CF\;8e.wvd%5Ѭ4|nJL[G`f;!7(\ey;A"ǭKmEӉ&BD8}O{^kADNx@>UuEkqHAWDD[ot 5+tU?ꊳf͖vB-􌪝ijA%u(_AM7!tDJ(GId9d?&2 Y iO1/Ce,Ҿ#;j[S&'SʂGS(va|4~+˧kqe49pZ~(5m2ԁש/(t|;˜/lnJk/q3Qp/spf Ć5Up s-gsU *{ 9a|*FGs/Q"PE41 ^7xv^}ұ-&ɕ r"g-ŷP޹ؕ!9G&qni7{A9GykWaR6y7nA)ͻ[ x xlG`%^(ٻB9'C?Ēon%xu?猪pމzr/~K4fflM~rwy=Ep`-_%{g9OQ9I@7I`ʶN*0}jِl g֣53&T1֜nj+`5*T."Q)IuS9FﯮM:=ɱ~!DBmeiMuiGCxw #I)g5NXp(EnLm"()T 8)}ڒʽ}.lNJZ瘲Č% awq.sPN5ӡ!q$lVlAN>AmF1Dv(Dۘ&ѹ(:KkV+LՏn8o)uޙ/p vq$]Fk,6:VT FQ@p!3<~d7oYl 1{UY"5NC_SN`mzQ*"J1Yn:Mh4I#iT-ɒ,ml`05YJ eSwl6iBBɲ!tlpMdYV6Fr%{!}}GqN?,pA,UǗ^S4c4b-Biw?bۈTPuZaLe! XPj cu?NИ#{D<#adJPྮT asC[>^C7sW@ d0.YPÍM}UvVql>5ݱi\Ӏ õ5ɋ%3 }e4[2 nDXgDAt.v$ -hQfn`>_BƠ<3wFv2xX85w]~'(2 Dul :奐,,&OL!e[N V; bR4&`%хVszFyH}ii, /7< Wo4(x|z"o(j u!+#! 8(ꠅu"Cl(N~ ԋ>&vwJv LY$N6[ 9TDkm=CH-0# 8^dEɈ830c;=$0O(p EuCq J2ҁޘΊ[f L6߇ߌ&ЬFVQĦ<1}Xʲ~>qr H7I'gJy -iȤuhP/?Bn7j aoVg^L8˚BsԻ kO_Ϥ/BB 8CƏE0) o"2dD:;`+e. _)[sp4R }!7= Zb& 1,brjᜨZ!z%жBP5nyt@Z\y#\b)-쭋p.xIXG0WkukX}irG^.OPߊ{DILa~ U{p`~6mgܸ-c[7}wbc3oOWt Q$a,,72hWJ{0xlRcIw!͢2yDZ(%BK6ao7o.^&P8yiOS;+= PC)I;HB~f}zbeq8?ZEvPgq}tlb/ |Wpꢹ~jOލ'>J QN暢 (1"1ЀYUa$vhm(j Z9bKSNXM{N\#fq5zPV)^ޯ~ +_WP/.åbGQ01^X幊\  E)(b4 e6[ÂpLHù~Q1i(+֏+jǖs#sc8YѸlc N{sv4CU\ihBjUY,%(PQƸ,4lP$rIPo+KaiFV'pKj&kzubxrq<ad-Gj J;s(GUeɉtlPD4dWF1| A$rЩNA rs,ƿ_̖`k`z\V #Xb$LrlL\^-`IBc*w2[Du]CJhyº: Ol%p9"pXUb  I0:hi򀗻2 4' ^ʀu$#;zcJ+m"LDgw`zTV -bA 5^;uraWxUp#1lM3@樴!*|0fYs<8@Sr6 Tx2M5N#`[/^᫬^@@Mk0ؤFTqX^=bJ$L:Mr_f&%]:i[p|+s "!ޓcYgu"c@PQ7T/'؄(/C.#E,&ESyҜ!lA>_ k"qhd6;zvn<H> ?zԓ[! [777{_ e^r26@<C~(ѰjٺQ!L+–u(`kbi"@;T٘#78Å=ɔN9ru~aɹgVlXJr 0K#C!GpCVI&SXHsٜpM$^v% kG0M1Tdž5Kn]d4Nu¥H %.p:,W_eZLb .`aMCؚ&z8 05c8ణaC0TJuQ\ʵp:09ϠF C;eY(!Ոxd,K" ΑX|~}J Jp=* Uh[xO ,ֻ6Anm?7S a"| %e㱁I\R #CC __u`;&v+ܒguKyt#?#:VHazIqz^aYpT |8;CU6[BIK9 [F2.ꍼeX }PɁ"d{A+f} 3߀8ND3 _mbTwy%^fΏ:!s I5f[Vdޱ~RL@1ܕl#4aa }~.9 -B&7&K2X}" &ìnBDeijY#:0gn&' m\~n&S4w`mdLG*p<qO>B%8DjLub>"wV,`1c cʸQAf I+v /:Cک>~;eu{X|…&E)`Gkl/!Ĺψ,4i,فRMOTC[6*4|-p/{a& .O¸ 'O>W~xzG.\+՘mUnf;M7Kh!2oF.D1>\H6A7h T gQ b+lj:y^sD.!WRvʪ''6* ձaMft pOR`ǡlXzz$=`77Up&}~/zV'aAbrRO NhV-1KLJ56kd_/n&G ᎒1KQ&M- r 57(Aeo~ /2={~Tv78 e^EѮE1lǙl銭O-8Pє0 @BJ8[`gщ>"p(kiV¬ot5r)< 1C M[ѓ`iebeįty`LWO0 9CT $LMp΄6icѤzȟ5n#%oUxRa(*ϹkunE VLMI\ r8d;.3HW&cU9~uzTUS8q:5`j]k?pa $fxFHXr,B((xB´kJ.Œ1T;NVW/XY7 ' ŠU?t-7*X6/+s RBF)asVP4̋Nd{6pڰ'H4qKew=Ol럇]4Yg:E=Uрp dmFs1Q7LH&DTSպ@F{%u|ϸR-q|^K4Iʺ8yE37B~KJ O7o5b|$l\M}= Z7翳9Slk""!;KW ]QxcRX_pӃOL P .%>VOCi! n0P=5KFEֿ & tƸ r ҊgN"UH譧)$Pod S)@C^P?| ?ܾV Kd?zuk Tʌ* ĺDK>lؕY5BU \%?J+=sJl^|UCf fsu.A4%(f0ذD ~,L"j A0H&B2y`j5DMfgJNF`.@?mv/>ԗúE *#ᤶi`oо(\h : :"HŽʌb[F%Sg_t.LufrF!ރ4:Fm<jN K_[H$ $5>͠7b@U0-@)-)k\Ȗ.I Q Jcu^mwtYKS#bh_½_{ ΐak$c[7?]Zzi3n-sK؞}<6zΔ1 ?bxssFӾjaf[KQIc<W|o=ޏz |> |#QnKd~|r^w S{h#fX3`VMz:ҐRݹQ>^Fg-V\/l|C<Dt/ak&g ^+YܮVkD_m\{Ht;wNxBgmp=[sǝ5-C_׊l_\i⅘+ʚZ4HDb6G\֒/GT[6l%QA ܌1H љlf%~7: njH2qǻ!CЉQoʑ뢅NXuNd75 ]CrZaAh0$c %&u`xYMUH ֈP5wÐ@1TQ2"1e9넬ZXSYX裓!9mKnC.(PdK[Pvh P,O7 .OO/1pqUHկNR1Dv]C :28mneƨ,,~zp~MX=\,|Ϡs(۶!Xp1!X/3+%7Z2bKAʏj㗀0~V~$}B(. B[(j(C)4UKrM$jH*2~jᐫSLLjMsZq;+yJ | W %`cj3#, M\w謋H~9 ]Kh(a^BPGZ㠜'GV "B%6a. U{8d^&^P-E^ӋWA@RT8r [c d9Mu(aBf%nv 2OI;٣d`Dv$W[{Ҕ5DaZHo8@A 1ZPQHtu{h[N_OŶ{{ӧw‹,(Cx޻YMmy0IvQ1Yb,cE-.̏;SjO9S1l,G Qɣ i[. d.Pp)#"oȅhai'\? r^Gn'@ǨE\Cw;F.!lrߒ?B?C[_/аDox/rP v^ؑotY YWxlMME4ϽՎxq PÌ+RC0$)axCF^h7# /7Hm\s$RM"' Wb.@2t Gaoq^(Ua|v[o60ɉG S>#n#]dUNa\Ovk?j]PȜNr !3 1SD bdQqqXֹx}Xu=w_ʗh"|~MSp&?!hg(q7H ƌh%ب^(B]3iڷ蕌18!/V_Y7!Ԙݘ#0pEǼ _%1t1x2WAvuCx. q RaQC^'-ru%P_]F ¯I'n6GYw _Q s"W+Po+uB0JTO:O !ZЍ$]ÒlD-([h PA)sFE楬%Nb.ߦ&#Ya'kt3L OEɜZ#uI)_cxKE{jJSFӊcDkQ, JAGDm &I_a#,צ=˚/'q—7AQ:="XFFEW 隲&6cur.L;sKވbKRlY:ӄD^d  i9\ow£t2"߲O:*D[K*/Yᖭv! /`uqLB&:AS IS5"[p}W-rfљdzSXL AqFL0. +ƞtTm雗 7ͥȚ'*2r0~j 06|FF o ˊʐ+C\xKRFB4 `Ղ%9>"}q<; YE|uٻ#:?0ztwh͂MZ@=U]ob ~K, hɖVjZgim1YGXs ی1p xcsUZ©J!gapAyTk0)N;}x=β9 3P&(0Ky ff5d$ {tBZG{JHFQ"M! iU_KhˡԲX=c$&Bo1}xFqQ1kU} +Íf'<I5D-F ]L31:Gh"7 3Gs٧0qt|JYg "& ƒg#-;n5p^ BXhyۏC3m ̚gc#z$bO3Z#]Z!mNrsJ&d3^5s気m~R$z[hڤlysQRdB׉Y nsFK"? O k =nf  0CfjA{ۀ3[Ji<2[%5~Q7.KJ6#A&a% Ab!mb.vj{T\w}䰱>]y V e:O/DzwZŒ$jp B(ɅB 0).5}h^Yy;R݁:kQ0">!bF#,e;zB@~(@J Ek}0lB(zcSB0-1j43d>C,hlx#각:GIWgB~trBiP{pf8uHS!RWˬZ)D4qn9e%b"~PƄxjPfI$C͔2|8B_k_4+uPJdA%PG>'oZ:l }gށ7=uޭGI7A:}XMl)]!"dFyBm PܒqwN>+ KpE~3a,D=󯼑{Q#`M32A[j|6_;Ih{8/¸lp <}Zi  $>;C5R:|>G)uCfL~1}A7gaƠ1I1`7Bp6ڨ'kߘoZ38!OhjivGy2P;~Ck?͠%XZ8v~8pZ:o#`LikX<Vߠ]9U//XƝeޯ7C _$^qE^Ghnحsc ZAER)&ի ¬^Zꅪȋl? M$_q)d Vb0iHIiYȚM$0)-Αe͠k1LU%C/Ul^MB=8&@`E7;qzavJNOP:YnG>T*uYd"uz CyX<²M4.i vhb(+V/)rt;' sO+!:LE7ob+4Ӷ'6=h[7\ʃQ.ÎhuPz8anPz}gʋ/@D-5eFdWdoR,i0*"}ay >^sHu XmnUg XpOD mi=*-CA_]2Iw2 *95?(CĨ.WWeƄv3Jɓ[@wn7V0l`(䡟^dݙ.'<2 ~%L_RuF:Kڌcr:8(F8s>t 2TFMT3B_+K)g@ `<oPáA <(lGڍG$]`=)ixm s{3E`8L4nbY^w t$O#U~QINaᱰ^Uy<\Bȵr!U8D#/V=1VOӊl?AQZ )`_._UfB6 2;N8wƶӣ /t`j7Wuw5e3N8<6cGS}TR첲,[x~Twh}Qm5Wh)Aᣛj?L)e62kuM2L\,e}~0%Ep|tTCg"zv$Ǝ{"^Q^>Qk1q\#/DE|';p&$𡅽?~V7RC0<D_R+_z5 @8q$]|Bi943FEv"]k6g$8IjyF\l_@;\t@E}q{LDM&NO> UZ[ePhN5Xtt`2A`%n?\D,Jd%mTbQ 0YQ)GIJ=ݱ.ޛ. nji&)Eg!r&l+س@B@? /~/H)'tSً(D4OiNZoAom4"{rW eU:E`c+V>}01A, Ml1H=4sU Blcin^2tdz} ~D0~=㦍'Cs㊙Ӛnڍ/aa\`bec?P>ij%p@|8o"([?G۵6hj˼g0z޶ ~5 zC7(QJ Es= 1Rdzfh-¸4Skoe !c^m0W^Z,N1ݜ9NKw1HB"3 p(iM"X8TqrF]`pƵ@fyb|hULAVXfVt-!t6IA Xx8vw w9Bn={=cMm!a:\(z>u!N*^:xIHn]{##+`G˓ː%lML2J]4b- ۸ |dGJZ=~g; :q^T(2OO+*'**IIO{ ou" 'snU+!p~K[cyHܫ}RB)fmyT% ^b|[< fP-'G4Gz;ͻ%3p=Tq$>wtl:8T]Ldgӫ)jNY]I&B*3wXZiqE^85aIShJ= X<<>d贓-2ϓI/$7%&*1,:ڲ O1u3P;gQ߭? X\6z ԋAn)@M\afz3٪ؾRLDDo|xVAM9x9lET$u.8 -쬨ˌvZfl1,$>g /ITFd2iHe0x.{(ley&uBOP"@)O u_.pzllCcVmڂ=0: dqtڳL$ǎ .L%i6ahB(Tn&0ۧa%cx8'F4}'dg#8RB R]0PQl\m̛.M11qG$ge>͠R"A":}5ukעDblsMʂvբfm]PN* b5y7tUP/UgaqZIlEZKVX0B~'JdC^><#m):ܥpvm p P{&IfGl` <$22y7 %TDIrj%%I3g8' p LPl5p0ݙA=t9g G+lRdJoXM~S]yd͒'8 M?I*XƔaA92Kϸ~P~/|rnt+&-g+g͑ p!(lt2~q5| okީ=Dhl|Gg-3C'#lHjp5hw%zS"A[n/^46F=2\0{)Z=O}fiqkPByjI37j& VSF*{gVd3UA&M;VBIT苘'D?dJ~RiE" *Wx9 i q,q$4&-44DA 9y&eRcH3d(lc`jt }tZhyjZ-(Pj/VK PG jOB{/$ig;M!iWًA>zFbGI. l#PDlc+_WP/..evCLdx]8mdatϲP.XVG'Pl )J뫺nfL]Ŷcn&(0:<@PҫD Z $vDʯÁjkv(h]RL N7g!9KS 0ZctQcפIѸnL~ִUóK>GE-0mckQE$k,7c nw";iOz߀XLF%"s2BJo67jT$+EK6h`@Z⑆A:1wd ?X[[ؐ#3Q?~muE=l]}3npn pkn2Z6R.;(3IiF0@+<=k a`!zO1%(B..)b/2e8n>b8[9ws?W$t2d&yꞥ2lƴ3Y%Ž>z9fHX<38&ڭ Ű#QZ9٣-#plX׏kalâ"m"X7 }星5@XB:0T]n#;xyMi@FiXBX 9Kg}h,sy*9^<'Ed<$6ɸWdH>h$\Y<޸5 TEe~ZPG 0 8gCRVbq  cBfs# ]($sf~g+V bGBlՊ$fLЪy V`!26T,6=DZނ]}0qK75z&D2[ yyjt,E>7CZF^9,A-R+* ͈aO]5\w_o^R=U`SpOc PotiN ֣ErX/3s/w|6PmͶeSy{Z̀y PĶ>7%O3KsQNXobu#\!,EhS* )`@YqIC*4 &uVeAZǔrQq4H Eq92̍Y!°cߗ` V`+̠wK 'G8N)lTSܛriЮfiȣ@2Th=C#^,OhLx #z+!Wq[kbo¶lO1k6EN ) CȬx)T-]xpj1E" WD-6k!صt&IRO_¦-D3@)lB|=(=6נ`?`?k.i1_$:AoPDJ÷Cev)o'*/;_m}߬? ?쀣]Ӗ[?Y1ڡ]Sˇ_ę&Qp/$hrdeԁrpP[ ?TÿZIiUԶ7HzN^DSW! GMCX!kuh c@-Xx;@! NA6k}-<X2Qzz/|^孷1țpD~<#2ʹj~J+3 ae8NPhn_;S`\ zoLwA"hGwnum4]лٝL+mu't fqX n]%5Mrg K\Y,3pNàs iIRH@#1 k SPTY yE1!O*&`{:o#($F01Ij3`1!Gs؈~dɶ_5UpŢoÏo%!5CPXlmXBiwYW> F=֦}m~?z}÷@OZT~,mݭ7bavRS|GwУf_H+J6v)Y6#b AJqaiill"z|Zu[{@s ucocω\7 %:|6[̜Ϋ1H W&';*_Fgcb\ |gɢgXbX=8Է;JK!Z U$1 < ;tCIPx!Y# ;k—%5FÉ|٤\Sl[A` HpZ5C*U2W},!wqf޻7߼s&cՍ_xZ۠ L* /Q^|]A,ԛO2)Lڥ2%̴:yle(n^o=~ [U3pM޴&X75,£M-s%׽Һ`N,rA[.^_7`vQO2[ फާ*R %F,gs h\U4 _8Sc|Vx8/54zG(&9GaګoU $ 6iڣY!^ {|Q !lp/8c;7[MْKNN-l]TQ$$H6;{ 쏿!̽<!8lu x"l2Zycn/S&ea(IҿmBx>Z1gXKdF%a$kJ8!aqO 'Y-@e[ CXW:,u27l l-?43RFqջmn@U<_vqOHp]쓥4qy2: 6M1%b$l3@y'Yv)R{s=KvV,>;xg +?/Øj&;Ov!ug0\_'z {Q*l2`1q!ǎNZSis3yZlP+pIl;'DO\ 7iΠYN B|2;1g(SEgG 2᷍P|/l833 ?isǗw @ > ԫ(ɶ4 oL35 e(8] sabHNpp :P6QE!b2q̈m.8V*91:`OT)PJrPtL`AtMb}(GB=?m5;nd oq%l~y ʅD eE_zz^'Cqy6΂ASMKf%t1.bEX(Zڏ`i۰#4_r no5-3?vy!tt7úwշ~di3kEc,JCZEXޮi5p„>.7DV E ʒepa>!3ʎ8>1erXo uEBArcay3&TXÐp'H`sVV9 >RLAd( ց7Q)q[$&JiJ*)-Q8@+6rZ} qBh}ꩇD*09(d8Dh)"<5k9r=} qq"?Ol*|Z M:B[߃v7(O*[Hే@U9_,Xe z\\vJ^hHhR"dTs@p++Bzܰ(}7>Y R`=͜Ga%w O7ePwٳ$_ >tX2|UŸ0*Ed복w-l5xՅ.f`SBKBKbyjdbTZۍ'ƒ/KbaN󹱫qt0 H{OM =ăP&#-A_G&G"c\ЩnO a1/zp4Rk넗0P iK3}\9Y?eU]P?P$UOB'_>93g{"0}$BuG0ZF1f t4>s%rjc-8~Vq XER JUKgxrG %YlE*r )]u m&FC8<\SXtPh L(u7rkxf,U3J&cV|qc?)sn4FELBY&H4vRj5[ 9נjm${O;Ukt" 8_.g $*a=/M_=U¶oר6 l\l7Cuzj/ >+:<>Gidm(X>>zuut#4b"~I0Ҫ(q Xʶ>zT:I/">@![Po)r-g0 f!,` ~!\aĻ_6)N:`UBÜO 8s?|u"a5mp{|S†kBRfYRfl_Q":)]& y&LI\&ra2H !7n:/'#m[,S`{kS%Q.) "m";^RC@ke" ؈&%B$GP@ O2XGxԏ?gq18RZoy>va|n UOm"_j[ h`ok ns^~TKpGzMo8p6bI:͝qR X0}b!O?\V5)tɿ~5xn.f\gҡ1p{CFhˋ{@ Cw3ΆexqF+˵CD.(nIZՄ&^m/`|<]"A$N\N͚A1)}]DX 3K18 |/qm+uPmFd; >n3Аnad4αhPոOd޿b3Ĺh9OZH:iLR(y3F2 ;@O>iԊ)b9V=uWz9&1[&j {'|Kyr.D7bE^2D_|߁ޗ|׻gӝ8Y}dж`FvB ndMv>>|uu0cL +"X,c+/:毰WZ y :Ogno,A4~WvBZٱk;lK>tmћz_hzo e #\N{FIGQVY__jHFz9ff 9Ըѳ"ҝ})͂QOY.Ŧ c=tFn<0H $CBh7A Zp$Z J!N0hAx!g$P S7?xaUhB18kaE.mBEMd R',T %GOpݬ(ƩɨPY,**MK|#p~tBasO* åݑs0qa+@.OXv) -2)(L-N|pm®m 棢V.97 i` ݥK 1砒m${$ԋ[b\(EO<;Ѫ `p?A78=HEqVG$I6_x% KIdE2@^ ܬ#6. #TSF=XJ]cmgU}SM119}\DNZ+oƽJZ"qemDк/Ä/ʥm[Dv"~D# zܴ{U3,&VxS5y H{+)} E-Xe!`yi*.u1ӑsтdCTaqb6\Ҟ'_}iWaW+2ٿ칧7ZQ`,O _GDb3%==엧g}#~7n"ɐ",X 靉rP.溽ڇܵjƢcFLhx/yns`ɻ 1O+a6(]~{`,ZM:+oT,Ly%cAz-3`Iyx9K*FMly5@o<\9|?tvത-iP 4H~ u{FNr&0lL0pI CuQI'$0ECG6s4T)'qEs}Qg Z1s"!YrH[@PÝv:0>?ar@Cq`LR R#}f[nh_G$OulZ̹7&:Ghv:_PV|Ÿ9} T,513bmrcOKl'(c(viAt?~"kʌM@XI3< :̀4Npof8YLnfl^5`g < O{dwr@ I7_Ь`,2B863 Nk$P''mIȒ/۫ %H~nxmA!lu <[\4z= E](hNB͙uz<"z=n747QJ+9ɷ韒%V%[PJt+ YTy.,ZRY7(Wg^? DHx V/&o.zsޖ- MZN”ⰳWtR㹈n_a!VBU:PDo#XS- 2XL$W$D;5tڗ>t;ʹ-)g I+#r5LeǮ^dCdVD}D& Sa 5QF  TaFGD);e08 y8jף B[;fH4y ;觏xR2LK!X+U۰l^spbNX-Db͒ kl_Kp@3pq;(}`_!}sQWQ/^WQ/^WHE$ɄOoJ\!+ͷ/-(fס[y$6[4e{_SAa⣆x|hkG*oɰi3.G.?k- yBஓ-ϲ'C}uGmQ|bKē}$ƙ , ۆcz|#0ԃS^995  cX7MOy`FRVc! Ѵ1AS?]#1fp ZPC Ol3T ˆBo=NT&8ͨ0fDa`Le E=  i3m"A CA+{ Tp\]E&/_W?吗f1M 9! _u~s'`.Z&E|>dV$OS8P\Pa!/QՈ|5~g/JA!.$<WIR RIၬ:\r ͆c_ !͘5˝س0.aX:ht! Eρ]B}=)JѺt=rS=Ƈ7#]P/,h`zpjs\UN  86.p C(թig4Fa:l!RJ[+5|!"? @@""h?n zykznq"߅X2^LkA1RF47%/GqmN ; "mn)Z@E1L35'.^]*t!k}z<{U &yK?8t~ѳ^:Y=w þ]X|`Oo#e nQ'i=fnD -d!"<sH#KC/\pVpַsԽWTl+l;A[l`!ueG**9Խ Y7`Rr0S vk*t.*AitVDTMr zPy,} B䂡"#g48r94Uh䳲,${TKN{qzp+o8W)"Zl3b,M6b%0J d&-yJUbl$+~քKȾ_I#օڏ[G|ɿ )z6 MOv'0n'Bc]\<']2{9|e/`__?? Rr7ދ!n2%ԛ* QoJl 5D^G~PQPחgM;Gډ~-sV1t@0t5;OAb]U&ZFu;ۋG^md#+S ]3 J3r$[?4;cAhʡrMhB_DL)]t:|p(N1f'@(Dp.P!ZI}A#LSFV_NpV=(`p]1M>8`7 ZPFG 1Hrt /B\@-ٰHXP/2T$^9e4H`(:6. AcK*i'FG1z(bs9 TF476-Sc+=k[%8U., J/" n(oBuA(2[,Ln/eFv?ގTuѹG %qur k2lU9DBc2(~acTZ8/lneQ2u͐rI;&g$o~lۤ$5\)[~o\@*{ MP=yx5"Ha]_Xxypoם>ρV_5M$t n>;og&xY h>ɾP`eɐ ^ *ϕA 74$SRUs+uShC}:$svѷ6x®$X2GwQf3\.jqht>Νn1 r;A"[piV 3an OY)cJVQ={0ı,G V;UXlQa\'$lHȐSwca^P+3A5"s,+s0,W.&T^r,2qB R3pO+Qq <7lxg0;cߙ[*q$-P Uo9BVmeT*9OqVb;|y O3Ā[ 9{A~ *|u}sQ}Wcx]Ex] 5spU8ȇYZy"S]:NA"_s Nj2<vY0pJ85fM }N@!Tyzz7|G >;Ok)0 _w~-- Yd G٠"6!qOngi P vĀ( ­Ъ">9a\+ޖoh\Њ4=GcqX 7K A?   s8M*ͤk$q1J#8F C8(nkՔRN_hcJ80%Z={ VbW~k݆.yQC~䴴L>T-i\T7%wHk#\#Uh!G߇ ?]!Lfx(ŽRƶQH<%`i2;(l hB}{ hD;MQ%30nZO6㦬q[/YkK'\)*N!x^o-,]ME8zh Zӹty|ib'tᣤUQ!ӇP2p eHIO[Y7my.pUNN)|sN/wbWO 8peYW_ "įz;L7FZڦBM Ȧ(GO3=UP[@0ѸevS5Yo('߁|uW~۾,gO#/SX:p!UH'NRpFylOomكٺ K/wѭ" eϟztuu%묪kMe ~fq#T+a$}}}!T*1_0Jm֝sdhRO@5οC`i]8A> k۟5n/,?:{r[cJDVٻ=u[S ւTlAG0*`4Jb)FASHZ RVg%ڌZ40B7B(&,7΀ |3@ hʠّ,[=  -5y* *X*H4@ԔiL(oK;*a[_#9Pm-yge +4ԓ,JeMwj8fE-/N, Na+QsfS_آh0r:i(dz25^A94ˎ3x::N,џyvRJa-E12΢Hw=5IC zd\zL֩jQj,¾E^'{ivDdΕIP$a@Pigr.\z?V6lsQPOhv$ ,*D3m`e]oC*(0Bolb؆ 7#0sr fኪvBrMWQ/^WQ/^Wz@#x b4  tQ (t redQY矶EbgR -G00YTY:\kkoZ~0 =.e3}PQѯzvg j]jkg p&`PMM [tHB6 #TP@=0z0BuavboՆ'K#%>ib h 0n*iBAighc1Px2NO ėGo{駱0+Ų՗PI? jTЦWA Z<Ē0Ar48COY Fb$Q pB},(@ECg$lWHYؗ" 썪1Y$`61'q#hH xAˠ*@+zl5Lq;dwNZOV62yP4}vBe bhP2?ıg"nYvU $<[Y;o#WAG`i,RWT8aBLjg3 K@a }fAb:tP,S;["m5vQޢI3X]ԉOe"BepP( 8k}pu 97-Mek-؍EWǫmM ?髅_WsRU X[vCZen܋neCrz %)/.C}.**JPj^ '+(`"H?`y1t4?ᚲ9u%ܺ i;p4E-$nۍ/Y[T,nKf>r8rjgܝu_塙c#I%R<t4V40>ABdJȺo  B21P-&b M*EYU9CY*y+hk?3^&3n'SEBm0tPڎ(젥1YUڗkZ=3D3*)=(+WJ-2>zEBkTS*G{]ufE '"ф+)eϚ5׳",1}daSK3@P" O}|*)YGz:9(h ~EOe^;&AXZx]&1$Pw~Ӌm$8}>Ty$݊EU&!%(vQPoABMX]; [m 1ұP7w7b~60ͫ>fIeP7@%cHDބoíoV#TBJ6\ j$6![ }d(%ฃ;>OX4j3rm=Is9u8&Ҏ~ q V2ãNlVNGȗ:1^Πh٧6HSco@~?jU|/,g߄ٳ[pj_wsWx1}W)ϗKj%7?CWcSJ E<)T0屗 LdI$d8]5Ri5eW/f=) &:7_ior }_#++ ?=u _BsWh9Qg{y?.a~j?X;MsVB]5y7e< `)ͺwj >eꦨɤU2DNz.z$J~d U9ͅJAQB=$e?Z* h.cɐC7H҆ 1D <šnV}.BJirh04UP){`fPΠ~s8l"*#T3~~TV;/lBGgAYcCpk5ܳ|-EV7:6a5Db1!bHƞ:$hnBr}sQWQ/^WQ/^WMw9pԁ z0C!D8x eeV1.Uu؎^G[!rf qܱʼ46`0[Ty$=>C;SNV>jC0ލu&W&LMQ4h݌#"<0'ڳ]~"oB.b` Q(W@\( C/IZFB1 {է0z=&x0^oꝰj\݀azZŵ TyRP$8꼐y,A2lA0{yC{ai2>DZJF K8J9 _܄)q{K11Mz2AA banC2,;cJ~6 qI-QZxul}pܗ6{s[N݊7EdSnvH=b\ Xld`EjhGfܻx\Sg0*k}"֛:-t#rY;˯t?p蟬VbIHN( nL:UWP/ 4Rτw_ |tMz2t~.BmTC})kY-^͟#vXid6֬Oozx>N9m٤$/Pd2%w}}C{ Wa0s䣤 D㔴URHyJwXBF4@0pYHN!1<} ~  o#yals2hav>o0O(a4oj#ezܟªG} /.Q#bj- GDh|x1κXv.FM͡ uD;FRB`L-<4Y}Pڿˀ/N+\ "}ѓ/9d;S}NRn: {T̍' d 6Zpc 8 u._a'TR/Gkx)!Y ۛoaIYvCɊIT*vzнemÓS**Z +A IPZl!)NSdJmLRBIⲄgCp|v54&ni08{:.|~S;fV[]#ze{|% 52`7`VP1Mj.B&FM%~<lˬ!˩>cJ8!/}kLЋ[A(QLV*]I6;epډa\jbZf@WBJM&T귿c ĪHf/[0PDD|nr sޤIXHP/ E6Ҡڥau3 ĬC|(C իYM3wxu4 /O )( җ38x-B-:"uUXSy{KM!p8jZ\  >i0XE8 4QgTYQA`S#^-K\(;޾ݿXD6KYy eųGBԦi/Saw3?N 8R-R$Az\~^a廀ztls=N'"[)HJ\Ќ[#}*˄2Ӹ*i&T*EaUS7!IE)n<ψߣ/GM%U,'ˏRI./svGDwOqRim 6 ?>)A&6FvB:_A2H˶}7/"KV #m#6@KfFfV ؅..zMnD: mIgIr"uz}@҉n!wG=]o=v0&1MFmx}u'uG1[x#W}[fcur~h=F rPݲrbYyO6㌺Q:VV h_Yqj!IFu/Mh EEbȔA=OVEfuA?*5> h)Ծ gb8|ՒIKl|xjm 5dޡӶf*,Z 8LZF7䔌eP^1V͛)ă a Y0Ɛm9LTyg*nn6n'jjzfQ݌QMQʣKT,*n:h͊qP хlvA#l6ll%PBYlYxw3;hC# 8 U3sgG;O|+O2d'U՘@9p|Ԟ^iNh*i-r2 o'C i&+8Rf%MIņBgd oeJ=8 =Hཀըۄ[T0Et O%/f3ǜqm=w YC7B5ߎZvJVsKs!tBNG-sa,u+GɉvL.x 5%P/^C`ZCjZ)#0Ըt1v{=k񄣠/W%;덧{SX@%ZZdSÉ㐍J/x+|F`@ZJTOw,UJp!m )HwɪkXLs',w_ё# v?^t)$a 3.ǀzCFNraCxig}G wwє\.<&FP Z@QI~$O~+|b(q ZX1,W#\=p^sPy>TV,ON//'}#T رHGEAxZu\'=;Ö3#BN$MHIQtml wRj0.&C mv|.L6 9u ӵtbWXjS^, JJg4`뾭8Wȿ,u=l.AI!c5@\\"[tQFz 4c|k7 D  mdvHKr)4dְ k<1Oq\l1~+en*Z |Dq]u2Sy }lɪE^\":,xJug6 ,_sK6`wR5Ôl9|`3csa(ڻw[I_w9>G/ߌ+r6~e"w W^ 䭧O5bvWAsKWQ~;G Ǭ& 7!gxg}VoBX[[S{9wa&Q%>rW0 EKwΆSZttT}4YS#GOC 5XRrCxrL&u -\<u{^7{z7^ExEfqˇtXoY1ܨa"Z!#r:0C-vӘ,rsc7#0j!n&z"'oH>ߕ*CM ㏁e:Lw;BK*Yc∵QG/@7X H ?{,hc`! lX EH25^|A.ŀ'*`s ?Apce'SaU(\x?֧TV^xHr5>4P-cZ-$tZ:9:(߂!+Sr%jm%Q|כ:"@YM(,ksO|q/EقS# o:wjo oᕅ &C6 nI!\: 5CCkm.(x~PϣE{=U^<.|@O+LD-^Zyur8 Dc9\ \>BQZD%*Ȓ}j̜a֚DW [[ Eش@1`Vzh,J@Q}aҳ9S h$tI-߉Q(GZ,9E=!.H " ͍wab/pS 8_}?(Az,dXёGBoAA 8IEK B| *#$ƒ{(M LA3"#a0M$|Mi1 "-݆# Ӯs UgБd) +Yx`ہ4v@7cN ,O`KRg9LF_W'<&NOހNBAdp r(tj  o[Jc0Z6|i|e^u.ˀ7:*6(qŁH 7h tVBcu:J RC_U& 0¾Yћ+Ť7)^Σ"cg-z p/!C-?1 +; 9AE7();u4h\5$2}|/.C?zzkI.ghB+Bx,J h@k r@!A {q`h',(#Ɂ0)f!AgAA/qYYSS2 _4td4(c1YYa2YwDNGL'Lx+&*WuCL<";.K)*05xP;3|y(FܢH&2ӴX/FZqUCFWaquDlP+  sý j5_g#m'ؖ`rt/( ; y4 deflp{CkW!˂m6&VZ\ƾ)|Iye:m J13@ZfqlҘB]:nJ𐈋#uFS1*^tG  3LA^ 40ȗVJ*{*_<"( #Ia.\!W0$z>%y;;? [k mRww))tb_Q$ q>Πۆ9Bf~ ݸUoK)t89JJE^r E20[ұ@#ƧE2DQd8e܋TmHsMv[xeDj^ ꯰t<$Iv:aY8^汣o*<@/vdۺ9h.٤H[$vY#hC Ć·6{!g7,߳Z$ <6u Pn"VP!'Bh) r\ٗ˯MA8} &FX%C~~e X fUe$Q8b1Vjf=bEfG% pa;RO8eG8\4D!aؗtɻ 'lv~$D_`H \z|.]wuu%׆KȻ4(4Y&xT{s]d"{|PHlDp9l7ʡpu3\KcAkbw:!CÒZl7@q39{z ՎTQLsÄb C 16 191TZ .tW&J16Ki̓zhꃞ 7q:3O?tWӬJv#t< 0^8"0b@ *į$F!8ch0m(r K>҃ -.9 I(Fk=S_ .ȖNHHj% ﴓH⬠bpNd^*AUtJt7Y;JMQ1'5B' 3c@6ßU;'|楫d,s111xMv蟯U(ydBBBKbh.`nt/\Hc6E$Z\\]n] (kڷ/,{y\˽ u!*/ΩY"r ľL|sPE5CuR]؀jA]Us\?jU(*3r9?8 SMo3(v`+bD4+u?'*A|#Uphh)ToXa964*ӷ&I)ODExEx|[aWЙbTU 5:Wiԩ]ceNYp/QѨ!m,/\iQ!Ch%d_z+4VcW.בG|  Ü1ī-B:M$K0&}̝Z--4Cq㙑&4`$v@i x5z/$xGm9(〘5 2`On`mrvJFfrh\eS( CnҶ2MeO`u. UA`ϱ%3CCĆД@*ŘRrѤ.8O6O@ h,+4 %PX ե:Kaaj'bH;fB'A^6'1@4zEsf:EWNJt7?Yd႔]=N" 0T? k%dziGNd}5W_opV~j|kGKR&7o5+;'OیRoa*AunnU"~}Rz,Ť-*Ѿ 3*qƅB +8zZ#OoplȅP0#@E;2՚+>E\zĢ?܈#PnHQr%6P"4Dy3>Xe] a"6 g M`mh2f7d!Sr!+8)ft€s^(:P[ֿ )SP ky1]QGi0QܰO. BᚁZi fh 4P`è$C r30*;-p3r+(E_,FLYhAXVO`HZ}LF I2ʌȤ7ȄA4WjGRhaWPZۈjeWAjJahlB?ӽ zv/ReG:6h[04ؤM 4TIJ0P~a!ĨĦP;B[ UXJ7fNGцZ]P7 "j Nơ᜘(\1.EDB4@r#`J7ƀ tOr|3dR'y|$|*7ʃǶ=V^?O;LipWiB&xXצ\a 2QqV|9KPgjB G}f!JPߤǪ ƚ.E iqS/ЊM1c X/8MEKY4]' >H' QAY\7zm\Jq!(9?' p;){^p,\k|8 تޅ }HiOa:z5_ڼY ܄Ag&. {.=dJX8w\RDfd0ji?6ZF9: ,Nlq^䲂_)N&p-!z`dq=& 36680Z K8z(bFs^P\0$hԘN*D&B|/;bi~X/>{DY {ժ!nbή.Yf[6Tidc%hm"PJ@yahV#NkNrFQb$qToBZ(-L= }:`?J؜2O"\I Z\a]CY@pơqcZɉ䟈t Z&ҎLF3Lj W}/4՝Hgh֪/6ySVn<AN[/H'620OKܺIvh/ 4.{^IKd8=0 vBXʆ#>y&R*0s~3)ѪHujwf3/XʆVVWs` f0HqX%ap؁C΅b2L>L\{3-jMg-G}_IYA LȚ KRfC6Q>H !5JP '̺DR;V0t`/Xv̺ce&PNPh'ò`ӪYAً=8FލQ) ýRh4Ϊ;Nj];cp4jVtίf &2ږ`Vd[*X%ʁ$aveĚ`46LD7\B N3*-QpXx3(0oO"$P:] rR (ej콃W)\`,s7,i^En۞BȻT:ehjyǯ1nDY0m ]uz (ߋJ/juY4Ć)A驏 Ql& pe V+Py'Ϯ^}Ozx%(sظF,Cap9"2C%"WGvM 0/=x,/d;^|!(F O Xl"LF>Zf)zqG͘ឿK\ע<҉˃q"1EI9+oҜiUx Rdea[CrJaTO-Ep=2#=rk&^y蘂zDԻlOzb,~Z Wh8}8h#f^h[{_ j%`Hn`d涢ܘץP&3މ0g+ D[uB}Ņd" p# .W+'k-zKB$, 4j MPd-T:aQ\SW0守U* C1 Q^k^XNzAZder^P®0Y&ʨA5&7#AHԴ(R8fj0OڣCf*Z/p-*'RS3G H 4. pWLRCf J sKtBn[`0{zlnJTNASfIQpǮ q+O5đ-QfV8鳍GS/2 D跨gBrHԑ} )|4tG,HC\ҎFc@2嵡(gug U/P߉% k ';貧K vq0^s ZL.i`yf.h$Ei(!X `tYuk4أƥ\ew`c3Wh́8\͔5O,Km/@eߠ2 V Zt?L3G)m {aaHp(1*`#M͉)$N|;) TǣpWa Pp[ <j ޅKQS-p_丗 AIM|E.r4͹\ w'΢^<΢^<>B6Q @Y h^m8c Crt=Z{az9UKA@n|gx±ЁvC'I} ̬̲ r5n{NS>[̝PrCaC|NI.ׂ^j )vQALI Ɠ('ppF= ņgjX2r2pک5::0.FG!Y)IӇG?o U3cg{Kj#y߿Bԕ;kJՅFMwh <5\6O|$öpҔ/,b]e`u CE?G_$כI `dVo_>-Άx 8! E% `Y$QvnYBgLz+> |+kZ"ωD([ؿUi*kTz[d?BRT#r[$OsX wl>-$uvc6& Mqp*V&5=xeӫ X"c /\Azr<G^aZgCɺ @fɂ<9&).(7guvdE`C-3T d׋_#å nV4 LՊV|˼ T;:bl?: as|EZv|evZ>S w)({N ,[ހ'$w(W q lrRb]K|Och[ݷ, jl!t+{wU CtEPH]t#zE#7_ P4,q0+)_%TQ ^ #"(i.*6йiLfI׏azo/1_;q(=Q 'w 3?.~|xu64C᪃~e=l-x6=2j?y|!G#X#&4j±ƇS.gc6"1 -Nk)9ժS4ز|b{l'jl9!j|V*]F:r:E --i\S?>z8za#:M0h8FFAT^]XQP_:Rn gsHaې}x{Q@ 7Bٓ#"+`kJ*.˄V;̹򙰸]촤nWG3T.ڠ'36|ȍ"WoĬ;vdI.\\ )pmI]՞]^|ۍko3j#H'vpu?ao7*0R(9,[>9LDŽhJZ*RM]oPf!/=h3 8a6-1рܻ]8߀&Ol{lFFݺIIbW:yȓ[OF~cU#e.yD›$1?  hV0`8DEϛw/o.^B-tJoZ9pݒEnЬ͓bvd}H9zkQx"V-p8]` =g#e"B9zjB!GhBvi9= uB;.`Pzp0"s`1B $pNe1(x;i&;op7󣫭sfz c|}xyLQ6>ϪlVvj,BD]|X좻%u Gb PρA3_3f @_ORϐYu) g&|BBؐ \OM6z|(3Er(O=Muѽdn 9)D;?:zCo>7zknRP2dE1 g4;00A݉ fS2;qVu %PYFap"dҭ2 Y_PƄ PY .+Y'MAX<3l1 $\̐ *0膖Yz*n֠}tQ"-NѠ_6IB^nr?f`BC̤e;y 3̢ch8>& 7ۡImZg\C! jf OB0aʝgAŢtW#08 IλTBtaٳrK(ZˎDNRO i!O+*+0f;IOln pF`L5pataQS+^U?73!^)B2ЛnO곂Ri f-lZ2A,#Z؃E|j6B4( OyXa)4,*BnY#m&1F6M+!zhE$#BiRΚD]7I ˈ`8W]lRcm9e4m`Dcu`HN_ta(0Nπ*ͣl30`*aJ"ݼQzwqGR<%K<^u1]tهasP$xݱ`M˗СGPNX5}P/5+B4mc˭Wπ$ INXrţ0* |SHӁcZI;m2fm,A\/uKPjAǖիO6@c dfNzyi%VJv Hq=>~VX_.8~.TvRM/wJg&a[3.Ai\u/m$k|/}ˋ*Y. ndSdXgP3wagؼC$^5 F뽏Z()C&4!3NmYeKo;}B[cuʥg"l]I[ b:O^3F͇#7yGS ]l>G=C=+e:吖 ^n%LifoZY=ԥbĕno7!P W ]K>OD+΢^

9QcAx6i ]h囁Dq¾%PX sv3D#[&=c 81Ņ)+)8vJ:5Ǔ ?p7k$gOhF([N,VuB1ŪB4 C4,#z`lp?6; \h# M@6A ȂRqFҘs]q2vpߙ 脙Gi(}&CW&*YLEXKq2@h 7}:qAR'gdRdЍ*Xq\˵-(O7gjpFq,-^z/t4_0g&&J1>oKBU~?LE*!G:oܾG'egQ/J7zaWW[ϣ^WX IbiDB7Ѧ3|4c|&~K {RΔ˦(Ua@]d'HMg(ʰ׈șոfCYsBV0\)ԸL>ň6ޑ4˖Bv.Frh 0Z!C!haWSP㐌QP9%p*fQfBm`x8 7ߣ1R]HP_N !M;cas)4`7"*'J~l.\9f  +Z1/ZFlNGe-E\k~hsٌ+.}OW+Sӭb'Zi RCeOu*"RGV(U.7uE6B | 4IeF9{VrNs2B#p{ TƕS;ޅ T@^u{EMMܧT洔Ge^6"iI0g]L$E6pamVQmmF'9o Åsf:jre6C"F-Çp $[@j/t LD:E7V47TMIt SJ\RT2nZ2әRe& '3oPi/6q<n=:ۥhOaU S QxUW1Q !2!DzfDv8aa\awQ_][ y^4N#~d1g8v[Kϔ#}/,y5|YGE&KD"JY+`D* B$x$+F0lCPJ\\"fI>:^)Qq>v@}wr_qDY <8 NeobaށI Wn|y,zBZ<Тd,xLja Kq)M {CĎ=%l֓0vQ^ `5˚bv-e-3 z !wErR5 |M5*zZ_OSVDְt4E2QA`tPv-E9IRKmtHaTlu YͥeǜۜԹۋaMo/{Nn:}D ')w>*Oub߰-CwXK=X'jYq8S$˕ZMF.*@ *aܒ[F%PWsE5)w'gQ/oޏ3+%Ꝙk?w?V}~T͟<_K^˞7B+75wxCO-[8o75}DXs'?~;ǟy[o%_}K_|_;x{ EzgKlz@C=_C{?zG Aw}zK+_:3-w{`|7O_f7wr <[r?T~29KA9~KG|_}Q<=cO'O~z] O|=%{[qyϷ~3<#u'ï<[oUo/|l{}*dRԿO;!z_tO<| ~1{7OX{oH'#wq+,}o*h?yoA} /+5qP*5+2pl0&b յ.^D?u&,cYVq`_rp;1"d,\[$ mvƹ}MrP/`Io4yF%9ywþ5&gMG mc9PG&+t#n`Z77"7|n:u9u|FJ1--~x?gqw"lC.5,C=O,W o3|-zʽ5˒\rSY-I: cF<gqQ="E-怦 ![O`Ln DfL髡tiB(,_mDKv#g$K>A%FʗirMuZ렅'Zvn6*?+QYqr<-3`q-|BV+\GVQ j]Ss2v<k\M`Y(d37Dk]08b#!mo,ފںKw(c _?y%f8]VWQ)*Hi$c!_&Pg.~w ( :9tVQ^T"gR K$(»q )rV Gk㼂¨Naq\rq9gc5Q!۔F !}hl6lI>=.8zWB7_^ 5Q2HD0Vc7Ɍ9 FUi™죐4}Ak'-ި@/Ԕ H2$lK `bɫ.,Hui4^̨) fE=QJ L@U DCCUbXQٹ,3>5}4Tzt]ydY܍3IQ9 ሴH &B:"QN$R7iY-RԸ,3vsRш.ޖBoR Vb0N/ָ̰RiFPV 1 No@5tq@Zd%k‚iyNV TLC TmAH{P5skWcbBm~=w4\!ŏ<yX9}OsRT92`Xz#z+ lv{G O"Mvp޳p{/^syE^?z9bHHЇDl 2~1+<22nw\t@"~Cz-2yH^4"`[^ j< a|̥ DbX0(6Od88pbٌ<ݦYz\F3|6u -^@P X5(%۔|z Z68"XD"n07̀3yc0>]paFX5SBnbI1x)J>cͷR '[d*C4 &kXU_txY҅2ZSr9%qv oSCzF4 8T7^,v: Gr_55hv ,/"ttڮr"P|@(8I2t?ᾞnX3 `U[ ^y݌/{Jq 8=tڷabUB; . A߅+p=v9B:l~m,إn"cR"nA0DԬvW@,WdcX8)l,CĕP3 :+Yܒ{_?o&FUpҿn*QtOЉV*kpA FpnNP=r:{/(4:RzߊhHY@ uYrjfSـvKZ E[nBB{º̓pwG<4gHUcPC:t_B`y-+V0F'4OǞ&/Im"v2?yn&8d+Gb_<ƞ=xp-=$ˏ)'Ƴ)AL}ՆD:,T P Q "Vn(>wzҶ hPUwAgUϮ4oT@7dS[1Y ҐNUIh&!Lf"w>-mƄVe;38 vR /p`^nL*HR!\+ml^T_t3v v<;;q LÂ2£ÙT=33bpRfA\YT s^SanŌIAY-s{-Z#%ϑΐ_RhJ1e TU/yd]S}^t 3꒠'cotk Inm_c9-2g^(\8Ǧ>+î"gָ{s#7OIHܾ*M@PD_,iJ8C9܆1qOBg67&Mzd}1ʠI+[8%#,LVlD||@mp~[xK ^k@AZQMc.,]p6\j_ 83WBŦXG)T["CsG`pqebmO JL[TQMDDSBqUR.Nt J^(`,_mkm|DΏ>@WIM?.ao 2>׶9/l}p3|fU[5< _G<` ݇cF:aO?v(0*|fiUJ-^o6ui=|Ke*=x~6ܱ3V[H]crUH-Y߬>=zCǧ]~)X)w*AQP㋉Q#e ɕja_ѰMKO' Bo#R)\k\⥄W OЦ

tA`YA8wa ˊȫKLAu}NR1ȝ$pPېPT{ZC.RAgaL^5jTM%!{B8pcF \.3Ref]*Y[p#ʨ4),9l`2Uc1ǣ GOkB='pcx_u9XbQ ;õX5lτa<@OkrcTU[f=Ӟ}|6M)8-"42*7z.%I62wu?gr3=7'G up rE1dž;qC 0zQGTc/;Ya f4d7H oT9,,):sM}R3XePVMf"l1OB6.x/_ ~Zd?Ew*'ҳ6c(G!T_FHÜsjR5_olt\%K ØebDFPap%O_C\GKG]*-/ϧWᓬNgu|Act'iH ȀQo_|iՂ n aڀ؜3 ֮zةE0Jz4DX?UN%^hpO¨}䆽dj٠B{xơZfVڅnWKe)%m$HA^ .-hzOw& yGrJ\?*^4A U;A8ԕ3p\1Oao Biސk/ $eG[:҃ »v k+7Bl~#2؎z@fXFaz zi"n v-ݬYC+îAoF}8:A +^[ju&.^8FmÅlډ]Fc>5jvSt#Xhn~`~^ӰskazGz40Al?,jlK gcSg3S̫o_hukp;א-cCh% VH>SަOD gQ/gQ/zנԀAQqr.)u ξ͊-ւՔirfdH=> WuBAB.(Sp.(B& d'P 9 JP_=q>[w!p.jlph&n푙o~? 'ډ9b |"n1b)]!sp:!ҿf,^3yDkڇaxU˦mZڑ睸`@Dz/1OdrqKG%}`:{ F% [~z 2i" U ,93gm~fYI#~'z7 7V +>DBs/+ 5ĈD=s(\,ѭb)5dS ,ƗпDEʿXV`7Hލ)Jqi+tTXg{p95SxZE[qrfV%p\FyI"M7=@o( v?es0ܻBAP3J2{{zٴpӜ\{ ~)7ﲖO/K+|nb:%:w9/lGԆzl!Cjf 7YjӡC{am /{ &3(Ir`~\87OiI"2_m(R 9=جCx!QW) Έlw[dMz&HnIQK} ?+4~v;ZBhں9'-es#Ωּ!#TKI } ,M3[+摟&V~zIL* Wak?_Wx Ϋ(}vAٞS/D oG̸jkP̭њɿ=M=Tt*&ɞY pΦ+aWL@hһ 40_ SW`̢SWS$$< ұHY?~>7)j7|?^mYsa=en\*ÝЬt;T @ _.n  ak? q+ $jwNk7H>)38ZvZҒ|iJ*EtC'm\X PU`(ȋ4dZh($[ Vy-ȕi l[)L.- @D?ÿ9m$+$4('RTQq*eN9sc((邾E`5Bԓ>xIU^.DZ5w{0GH,{zr*ؘ{%ǖ#p Y~=9D7ÂɛחÆOBZx5DV槩aoaU=Pom\NXgើ{( .|^Y_~[V۸5%M[q:K-Ʋ̽[f@+I8iJ`(H}#aG:gl1I0pP$/ K7o XH|: zoH*n8a!TuFα/K(^6wཻ&]CFRq{gA9/eHv}fI岺~!39rػ82f•cE6p2rÍ.y9c9 7R?sqjM;#Ϲp1Y{%j^xCr]a*g͙%a!~9p C :Ӵ΋t1&r}\4'>7IS3Ap~1=:x2s fF'kj!q 9$L mzRu!I1 +Ph]>N?6HD>Y"/Kn-o~B9.){bhaD#R[EV|ئօk(JR E'Q FzLHϧI1gV~‘K?-w3 h!ʮ!,:Z #UFq"X8ByHcŞ OëZ4-ԓK w+c~v,m 7 Ư`X|:,jUx䢀pgJ -e>*jC>AKG?)5no.MS';6BRXM_LP?M}7'<x}|4&dwf^Ȼ_+ ozO|-ꭕPo/" _%`A!L&D(Cm0g"1y# AB4%/{ 1GRD7ТN` X3>{UQ!&jZM{Bq֯ B2S0ܜ}a8L-6q}v.[덓cJ+`6 kBT]D’" D"*@X3ԩ t2ĬPaFIxCY!k(* yHl 566=CC@c=jV!VwM{xdRrunoajoǾU;g\:'u,xȇGymj19;l8gC.y k*()xfOPc@!9@;Me¤v/~+vaJ,w,b7u կ]TC#1l?rL:[ˌ0he ܵ/\/$5_z4^4 q6/#+<v!u1Y;:hd|nm@aO]FNJ " hmIV>n@0 D51jAi }:TjdBE3 ji`Jqf"y8׍g!ç'/[OUȾqJ.5ž1 pd@T*5:8_'fVf_ #D5*$Wc}y9Mw:@2HcͮYYF]X眈Ѻ=ۊQp?xZ8InټbaRl@eu0fNrqkt#ە9V@+Sz{pMܽiU%ھumZ[}!׋ _Rmބ0.!@08^c33?>NgU:Ǘ.TBp[4M`^^uQmWSl;>z%-ËthĀ4 \tf4QKHZ|7T5 e$0lRpB7bt}I ѸV+APp_P;f Ѥ̀9k@V`Lukb #`:(XyrɄhCm-ʱz^ZXwSmu݄"qt%l3Y)`+)&eLhWW7M_hQ҃#N]Tlz|۴/r(nWo<No;O'"´kq41c++FPHى[[a_%1KìFD??E^2C߁YΆϳx;}Q7!ܿϗը0Rq‰2y\jJbvrpK[+NlLy!v;'<\nA'bn'-Iɔ\*=)C]\ 6dOғ"6gšm0fҹY(uEmyѵ/p+l`ҒV%99"9)e"REavIoLyz8zMJxd#ʱ;5&ˏyDE!DaX+ͺ&;=W}4)v{^x8?JxVKeܘf$3b9C i *C;WnE(&_p໅\pY*V>cϬ칑,-qڧ;QʡNe0D7R'=x#33p,iQsb (ߢPoע _P/!j(WnE((+jޚID!& tH+F>MϓcU 0G |ȷCo, >?[=bcCٚ<_*#;pn/Wg Fk6&d͠Ր5B(.񡨺W;-m֕۬BB0 Fl cDbr @߭`\lcKQTE %52q~  ҭr+}gԏ]q-k| 2?R+8G _d N=[a'_TqE;wt`vY*s!RYD6]^:4o Ȭ0>^cct~2m0d>N[V>q ^Px;< yܠ~rxmPddSހUzw2(=4v[U[ .G X9~VL?x/Z0鲝l@ Qw U'B:HLD < +`~L~o|8  9ہؾ||V~+R}YWb,OpFF)Ѕ]9 MgWuor{ /{ò/U#$7ҷRuP3g"P%1INl5KB_B%E5RwT *WnA FVm|op'#""E|ܜhf?up@vlJ'&sWv ohbK`cE.NJk/+n3CM]GtR)O۳89 ?xP~6+Z_|#hnĭqb\z&<ӅLQ`GW !?"q;|Q[5}w3C.$[:9#9Y%9 Kνꬩ^rK,J/pykr[?UE_|kOTo7M,c ZUO5LAOGÇEQau>^\wpOE AK06iᷱrʄkU, Ld@GnA|BnVW R}kb UoRTB`Wc؞phtrG7}rʮiJX E^PYqu-aS+zb6§LZ 5Ӄry:NJovtoU1"xKG=~Psy2N--zu^yyb?! FzD!02S G\w`a3h1,b/d7D% rY"!Fp+8zix{No)>hAylŒ*jUЉwZqF 0  O2RbwMOii-RIÁ{z;!11~#ǥ#m;ppMbtJ=mЦHLjNv$*Sva9k+Xz`av}dd/ "qA4aJNV`An~`;!%t7ОF*a* sXQ$;ϣp9M"ý =zpZ9[,_x79RG6sTI?`x NCƖTkMzn%=ѺZ<Bm&,m݊{m[~'(]5}2¥@n*)AN8E駴-ݗ3&#lc7_j BöED^}D+`W9;)&kemG>[z&fw9~'7vVNC fƖga,kdc9xJ2#ɘ*pj+ʜZ *4RvgQJx5-H:_2 !2HkTvq9 !ىO攍up8ié.E0NQI@V$'5,~,ř>0ӈ߃HtR$3@\YO_ BvS!J9ؠB1xZUlwDu* #z8(nh?k ꘙ}\J _P->W!؍$fH8Q6++VHGe M&%{0;Oj0yeC6~EuqD9Z#nD1 u/ϛ5Cpq&i}֏bp|ϲ˗Nbyp5h.:*-R<~EcoL,eݾ;Joe0 ~HhҲPW>,{]қ6 a+e;~̶CCuVI~k3Ga<{+ep^C M%W{a?7 W,V$:aɣol,4Pì./zk9NCoҧ4Wt-n h0k>!ȹ,&R)ϳXmT0)BK߂ҰY,M_ ¶$a8cq ~iFsh ) -/g0{8q^ 'ρ1šzNTOc(2SyQCA E@QxRJ63 Ƣ!#0!`ɮq2:@3)cV:;bGq6 *c jjHo mu7=T'w#{`L*E!9cj' Trz2p֜fR e*J1m"Q BXiOl@Qzj%ya7?xfwlFk=})a`pbB ?Js 0<]?8Xx8t  ^>aeMK'3["q[%(au4aά3HT0R@Wu)%*C;NFf6 r0fv.ϸ/Cd n|b|k 0~9[T]ݭ|>ꢋhsˡ OF@>~~.E/)Kz@g\rM?y~2,Wv@)l;0n)-NX .=VykQԋoz^-T)5teD X f(ib y/?BbJ j),Z v\IfMH24Q02Y[ !<=wݺtc63DOdF:iQ[A$tF^o#Z<*c##\G/>hFQyҾ-hT&Ie"CjDd7Wn<d^!4(B /~ X[#lty߃_ۚK~*9Kc-ŨSȰ.9 e //_ 7t  q,zV{w XeƒD,ˑ%bR\dٴCbY=b;KͧY !V[9jtl(֋zu*cNj(gVDAJ[yT>T* 3͍י6Hu*J\AC}/̲r3PE-Ds'ףYOly̆ϝ"f`tbl>[h }s9E:s{7͟h0It֐LoL Hp偛=仞aZ >JR?Z>L _n O _[*`eChNIװJ+=8[, 4ɐq#ؗ»lcAkBWg^Y^_,e>W"i^ bD !<,6ŘZ2 NHj9OʇЙ Lr}C琊FAFtA^Cm_zK.^|]@ߣޒÚpK|XϧTb=b!xa\Y4UmA2}(3`)3IlAuf,x.g1o@?88SA O)KرJol"QhF״aݙ.R͊$H8?DdTIsuCEmYLrҧMW&6c;ha*(b*L:̱xR׬ݧ!tT޳jao[~L $NWdrC+̏MpKDI~hvwV|m u/ m~n_lgh5-(X5;;.'Z7_B72ClccS)E(̆K~qj!cWXgn: ? WY< )_V'6ۦ9=7:!?wdX ep-3S 8@C"LWY9g;V%[rpgݬHt;c2*+Be9F\Q?Es|ٞ-ZdHT%E~TzPD2fɝ2nA cPP#j?67=L,<Ƈ`PoݲZ#O#5SG |ĭw|mEn'0-Ws%.ZwSl>QpSf1:jeowT')?T;{ 㷱co,\TjKp9;M449ӳ]Ec#B YDcj`&5t"%QFcN2ٖR+Ѹю@G'Ih!bl-P*p1jP8#+xJ@[,ǞC % Kߴ R7PjۂQl {,󡳏~p7SNyD5s%Z!VdYɩpp2nmY˱Oa:ցτKyxqÕWS?_[-$+^$85RO]9 1UYOv[ҲSS`_P~!lbĵmhe# 0fxeh̀_l3w@ I 4?Bi]Қ;٨iD^G'̔*Eec3 *g8f»zts$q^fz6L ?&{ߢPoע^ԋ _{ԻWYg(dw^lk7tA1eBbV]RJC#E-~kߐ j3SF(dJ62Hv&}zxmNxK>}XoBўdXRFl= *I<C zF0-W"Doq܊_b1Hmv;zD#@ >\,cP2 ьS $:?S֫OV҄<1,_:^7߹~2@38nУMy̔GS5~.gD |+䛐KS#0'M"F"jJ72v[TfT{ C_G%Xe RkyE~A!Z>mz=FwwLV2A—PYNZ ΃O+jǽ~~m~-,zk}@͂Ꞇv#fmTv4fUl晰 ]1дَnCT ]iΏ8߇e/)a=werkNȻN} oެGȋ:y8C)x d 11El]jE5Z0&eT:@"Aڋ"4\$y xrl1M$\;ι2-;DO qkGk^ʏem9m$ VcbY誕QE ;NTCm,@W" n!C$X$R/kLpM+ Yf3ķy^6?^ۄ𢅺 g7YD ɜ<tZHބR|"ЅȜץLw\0X~ݧiL >}WpW7z@M8 mԳQ]%!>iJ7Of|edj(]@?FB.71lSlVVNb#ZQu{ x7-ۂxiH#, Kݔ>E׎0]AU >Wj[ۯvPO'1bE9q {OQL J/uyҘk 3H)Brp= tg,aHsT0{'\ӂ~C42]|I ) p͠/{T-3փFzrB1#pDԨFV ,` %xi3&-a;YWfj@Ic֏l5 ЙwlWT;e n#qEx@[aTD$ JY+8@c 8 &\"!`oAـW׏mm?Z2O\nž!Z'Kfl]K4ol6HR%Z頞!<N)Q,"z}1'- lXKUkiʧk 1zxǞ̇>BAǙ28 |qBa^|^ S3S#UL!;ht.HCJNSF1@wu|{鬆 qSόk)Tƍr)~B䒙ʶT㐆Flnex҅4  ͖ ]W) l@:\ep ]^oykQ]ԛz ^nP'x"@7ߙ '5gCSC%RB5Jd./-g y;f}0+LIMJ@aw|TNF5iԶ^֪R*bXR1Uɡ7,P"QH$x0iUcEO&fy0#!ي.안j%ZJA ̆:%cy>B' I1r 2`Ra=g#[,;N d*A &PYٙMbE*6 hȫk̢Ҳf1~apFTg„PR3]C# } bg\s*ʫ&,I`N8UY%xALƪWwk9d~hĿMҡY)t#+Ф6(q ^-Ѕ5 l6]##O~p{{Wax_b~%17-yV|Kgb Z5'\^'6`¶'/e@ ϮR-T`x1:Af'u,6Wm(Iaɩ%g5?)w$I.5 (!yU)ˍdJR/9(AFnĤJ:CMn  W-( Z޵/f#'G ZfU8\X߄g1z6'j#=Gk8bN3ӗϞF42^wJVY)II'ͼIr.>.LB*n7G#[PXB^+! þl!` WGMGۂaLS>LΉfȘ9T[{vRo RCh<@`F;ی C~n Ut >"@4']B+#z ˽YpX'HJdl:dYxdme쩧cEHw-'aJIV 3 ˰ %JC};t3#˧tcBp ,x<> ԳUZo:Lk0FIĵ焑EǨ0Ii$,ٱәkJ{0`d~l-{ Bmt)ZLApl_1f Q8pnڿܸ ,1' 5JAJ% S{-tt?P^{rC4=GL|~NҜSWǹMבZYM_6Do(iz_@z 4&.P EK L.ͯJ[tZ +1?ГH$'FY=1@O?Af>4rJZUpD~ SzVҨ y!h\(ҝQ QVBlg+hQW갢ߠ.#(ݕ]:PSʍ3mVԦЩIkv-FjDlfZI8BD4#4$N^x7Ǩ ZB5j8  _[p-qe<}Úk@z9hptrV[H0I)Vw7yXhµ [pr󿯻Ixy - }:Jj;e[HS8 û _4.j x3Z%K:M9y;E=2Ю+K{Of?78_~M1tFR=g_&4I*M{PxwGJWl"H髱KrTVeQj2[\u`GNq\ӛ9cIney ΃Ō)(rso@f6:XG/Z ]ɮՊ0|\j, rIFrs+GH\DN9Wz o߄@}#I$wηg&}YAVoш/.B0$BыM NCph)KY.'i/+n㘈~,R) wO._@pپ)Rd!- zSr/d|v`[kCo@]a^Eym8O9:MwXH`֠6$unCvYB*$N/a1)9 Dx 00s>"夤ۀ$Jf ?Al`E*pu›p5S~=]Ȁl/L}}&{2(kaáW42hOGru;JV͇hI,2p;֭7=gSJfxԑ/t杠npˤ c- \9^H<5ڠna&Jr]$b^~ϼ=.#+7XG=3*x eH!ZpoJퟡ1@Wm šu.OaC ln[(af~ö'/Ā 2n‹onv24:P9 cK¸8R*ANS[WU(z Nu5_;)Vo\3R7Dͣ `x]ki\9@4=-[x s_zP/.^|}Gb =8TQϨÜe$aqV+dc=t-),A )\63֊5pj$A8 ֎ТLF:0:rfr* Hb@f@~m:)<9)BG =˝;9 ApJD7-9Un j<;p.zR[`TAbd 2.<J9㻫=ǧCa /߼IDATk+Z!=ٰ 3[F|twrD&+jhSx\u1VJ[ʠ@wP7 o52АE,BX0e1PЭ# ' Ñzc$")p_~mSBtW+a=wQBwo] _h- >7tw[V7 z홬oE+'|ţ*-Y\ۓBZanU d]jiқXˍRBv$(4 Yf\+>5mK}$tkcˀxOp*bw/C[o.JKTC N99M'jRp m5DPO'IO'8P+{=Kԛzpl2_\,yp #*b/ӗqaAl@F !FAJltp._|nS0v4*oyI bBŕ[qE{n&_n,!ӄZp+HeX8/'' ,+X hԇQJoI5Ifuũ;*b,,)5F.(>pi#<פu>Wgi&"@4 ˬc,08DضVF7V[[j9/A PQ }+:-J)Kvr2!% >GSṙz{.~pX33qQ}A/uF!}stFbw_rRN߄{8SDg1 __ ~v!=,ȏNyopŽ'~YDS7mgЗ%TgLomzR=Q<)|v rtY[3Dh$O_yT ryzXR˖iz~[:<D8Ė:]@z Py;JDJ9Q'P#6ÎP  ٵ#q* sq8#>fWF?ũYZx^ΥJ l,KOz DԤ7֍ir,`k K.Ak ЏU),fۏبI.֎}]E{]r{@JIrp}2[a]ܚL"LwdfO(hlY4: e*A%<| U^m‘tRN ֑ h|ꈻHZ_ d*y2L(@ƇacͰI|oAN\L=Fz t-^9}nX%}0뢭+/)ۻg6^R\ .0 V7,˸VތS=~gbIx!r5K\cVMYP[֌@[%Dx%_.ƒ.pfNy%)8V $/֑!D'NXLIHe[6]z59% 1; DHJGs2xqp\+Ð#;*b pEu^8:.o Hݐ~b~ڷ(/;( OnL1x{3<{u/ 0`cs؊Y dLmB 8WЗx.ԵC_TgQ E`7%DZXE4e]ll!F1{)7d8 }-5_@z Pԥ3"I, @S+X eDc*a @Ƅp9#$Lu[#DmzH/n„@/8b:jB3pEM0\wi^h; ا"g0(@ePgh<[饵̂I\P8VNd 5BaG>CHd( sh, Q =uZ yI%bݲJqN \0OVXpUg[Ld8$ Q-2+R:D; &WTzuwP ASƎ icgy3( Xו>|BHB @ƀW0؎qK6M:[Ltv:mڴMi4$M4!1;6`m#BHBs 3_gQrs_0<տoi|~yxu.z`a#ԿrU?7YEa_"8ШVt)Yˑ p@kWKmի;9^dVŰ[)1"ВwHZS2ط mwJ9qo6䳼^=ܐ=cM`=8;Đ:A~K9 _9{UHkMҞn@w݈z>P/'0˵{oDqn9q'xT8jBxvv!p( LEjR}k݆1PE:ޢDs!L*l$ljʂTqZm͍ ::0Fb'aEW^'; e5v~*Y.Auk μCQDXnua qvQ>)\,z]$r~LNf葖 @j,>ƹXDg9O`Jq7 xI2z2b[1]D(v.AXA %.q C9oJw!+V{ !Nhٵi;[V޺,(Kq]oa'ܼū{|k`g-ݮz7a釖/~?W6~ap^3~0nHϟD1͕2 O,c'_r3FzP91oYyDIeN"ln+ֳBh|{ E5t1n%Sf0Ǖt$dLXp7(/DQ/.^{\LD30q1t`tA 7 %Q#,h#E3a *Tew$@c(=KER1㬅V A6!tfM(($d6s IR騦 L,*]U([6$wpҤƎ1!OYA7#7hHTl&PQ%mtR^\ bƞM8C]xZɩz; YrYmBɦ]5WC%+!o;7_x1pPkgnxJ p.4\B%vZ~ Ru\:ï#(BݪnopϽ[/|̣X1M/VzV}uם,õ lFQh{D|R#&!eNJY= 0d7KZtX2_LiaB%Y둯Yr ¢m xyS)Kǵ |_%9 Jzǒ@AK~Gqs}+o;I)Wո [k3O k'J;ܫ"[k~x6CxV!#j s*J[ Š bgX:I 9u6Xou4l?(v#R ѰTJ!nF効\ܣᅮp%1ArgU#"z3|4Kr>}7V[t56B`sa $\Hyr!4I,/6yO|(c͞[{xU6QV,I׋{$'߁~9Н&Y_|A-U{h[yMYz,w@vkL+<.dTSi/ܲ g)~W nPvĭz;&Q 8-ϲbH#o--i\b1 Z0^ wSS(Xj-+ZX{ n~+zUPƜ2"KTR2ȈHʰ).F?/zuP[0әȠW4&PQK 2PGԩ =AKV`DŽ`AoE\k7Ytg,,at̉oX%<;p+vB09wecuCEHZgfx0N=XVtL=q< zAqe\wXT!ܓ1r/zwPPu]& 0 dkxCM\^ŹAa! KYd:PXBo#h ŻQ} nпo/W] >O`!NZ=ߴ{ᗞK8eHC ?Ro.K pB}~"{ +yQgt ]Hl3`{U e@.F4XŬwHdJ笻A> XJJE"2;/R}L:Z\X # AYiM%6*cr:,MS\USu#| ٤@ }2Q8 p/5Z8xW#F8?Ԉ ƆF^v-0Ne^n·R/T7-LD>FݗrW@sWa>&~E&{  JA0 95jiaqU#R{$<JHmWb;Mќ0MzzQ/.^|]G$Sn9ߊJ ԇmcdw{k~'@bcbJ~F#;_zWk$p.(\QM%؀]^ j+MHҽ@2N2tNmFktVv:ZC6Zl%䇢^eԋ˨_z5 &,] Ɍf猭ChnV-[\@e3rsFd`/|'äimSP;4f'Zsi^jycU33:Stx4O 4o7_;䃁nD.WTD\ư\ '56~.%!Q<ÂJj ) HbV3*M$ a]mS}`eS2#Se]N>sz9ALT(UhGy2O) ɳgo $8#ҤOJN!19c %cra12/8MVuB! 蛂 ^vc[7Ą|Ŋ[ndwr\4& 첼,Ϲz:QKvF lWܣjo[w_{$4 kѡi“=Mp,5_R$Yc|ǯ\kW~s1b } [`os!xZx&{\`p۾W#8޳}\@=Z*UJTnZ0}N2n-ǥ-Jm % =qaD#Ć57zgô #nkID1&9[JbU)BU";WW1Ի7Кz҄H$}=u NۡzY<8r. N3:uf 9-{n,ҵD3.7ꉼm'ޏP6S(3 يKȤkP V?^-'嬏[ƃ,f=LaQ~%_υs*84F$xHfOQ<!7Жo*c!CS,ъeyKº.tS<_ʽ<4./o xZ*zK8%bgٝ<%^=g/;Dw ~jK5Bi7,8[yߎ=vX ,d(A_BB%B4QVl)Mvf}cCǯeA~U ^T4T}z!\l@c7tȋ׍3m%bjv3{ zib743HG d} XuDRje *M /UyC2MxSqmBPwZe*<U ~*VP ͇Լ-~:FA2 8Oy`sR#=uUޤZi|VBhSFW4DLEJQoCQ2eԋKQ.#iV9F5NFatD|̈́B\X BVę%`a"4&i\G8PJg?4&PؼD{B eߑ]hMH^XVAWHjLrK" R- p|$]F^PVQW)R.A-d5 =GB9K-ED'Y ZuSmy ?s`zE[_3!p{#hf90pI?cHWA7N AOv1olN{`NضczxR?7*q+j&V~3>bez,يq6?7`V-͔I(d;pz*1!F)l>>˜uR@hxz;h_a,QeTlgJ0\E]-Q+5kfC*ZqoNܽ*\E}gF߄ש惘܅t~5],DԆ%Â{aPoCQ2eԋKAn(rr^0hҩo= 4:Y7Q3s~@ DPAxB\)רbQTL9 Od2 v+8`ҠDn@ hqz"N3hch .ږhs +SdsTZӁ` I4^?24JԲQkMRs{G؀: O$␜@+sC r`ZgSc%Vh>L s`n)h306m4.dbZmFU̽<^WvC}eh\^|H|["&a`\I?duKeC(Gk$s֔:'c3ءb\ OGDyO5ۿ ?_;_ڲ?^Gf;jƒ]컷%GQ`fu5ڳ&DK Ԭ߅va:@v$UXtx j[%Ԛ^cGaX<jj0wXCx6Qk٨oz8Fvk}/\? OnnjdL8w^m/M)E' ˓T@R/@*z7EsTp}x׸2Fwy,hxxXZMfQ|W)Qp@:IW[(TDR6˗+bsn;< V,ګF, '>@B@^/ň#Y l8Dm :p"­#RJͯ+_5З /wZzOތ3KexaՆ s\L|{a3@Hc`^ h'JVD{h;JW, 1YD=湾7qǧ1 c4iXa7ǨQ.ORC/)cpF\9 \c+܃ %^D&d7 *'qv/V 0F:i}U`t:]Eɒ!He7<782ُ~di ̼!LX1&|B {hڀ_$ŷyz=y*?-|_<8_/~Fx Xs{O2ԛhyzq%tt涢W|>C}#l g`y#5mDKszL`^ "oOIjh:)=(y:^ ␅$Nnۈ!kJM[Є>Ql˭b}b$)[lD,geBV> !fA/RwpD|̳8kL.D%Y~#"+R5 j!{ ђY:#\$UXPel+ʨ749hSE#r)S23;|n#?߉~v-).{{1)WƋ4_˨stU]ĽF; 』x]zezsQ/.^|]-]l+opI)-釀tk7oI2Rõ{|zd8(jgR2cILJ*}-d,h_,i)AξA2m&"r!#l'+B?6RcZFbS`҃Ef-hie*CNܪ0ZMJ&R@P:HYծ*v[gLR5292=\F4Iie $'> 3_˰iԗ,YT*r< uL 2bEJTr`8! 7vE<:J i$ϣ^;Z7د^:3߂Zm4TLwgyv< ZG.qHz.(#D Hc{0}-*J+]g'pNlY.=}<*!$m7ϖK4on)&Vm\ϋ-ǡog>L>w_#8?Mpzjllf;v(\Y) 6 ny4;-HʻݓVPuRQVN`VA~P :E&jDG<: VA/B3[T3ь>p s\n6^׃ #cKZ{>N,lɔ]{1tEb͎$ܦ6K't"(jVNh8y#=RvKqYaɘ-`i WFJ`zj莖kRݤ'@?bk =mS%;ok­u^Z=yf FahfR0I!$rr5LQQJ"peR֏}ޣ:0>)GoZ}w% !9bı Òp/!@G`EH她mIEM݋1;$]V8sz, AC{iI >ۑ} p$h̝! Xнk :YϜj8M`?K^A wm @tȊL32G :ց{ݿ ON{cPuә2k|o;K}Ik7GH7X Բ4Lb.Hs;₺%[ ,lŭ.C *˜%Jof;޿ 'Y@M _=ohBW"DEX>!s^Ňeԋ˨_zח/g(̤4aqKG}X3l elE3 sF2L2|J 2 wn"B, B73p8#&T $mRS+[BbBX!L7 ]  0kdv8cҥe?@2f}%S hP;>gG 2Bn M Y:ZR B `7ȝ*9VRy$ ϝ Rzzg$U`KˡDYA.53>$: LijJ܀z";慰&j&>#e^p4iT,,b mzz"R{2Q],ӆj-l`Pc_^+CyxgsߤR#퇥uSUl@Zh172PKpߴFG8 {?tgC}: ܱcIwXrׁkUS[[]~ωH``h'-)CO*kM r\$f6 J Q!X4f RxEd. ' Qo8i>z@SB'/}˒{^J׈!l\I Kʹ)UqdD{R >`#p -("C Qe~KZC%1˪OCRX7!ݶ @Ig{|ܪ:eZi1xp|u^6hy:m*jctt` @[t[u.D&R{[z; 96_BDZlF19&,sd*oc,d%5v֦D[e)hU( l-SDn!pW}}?]QUp \ bݼ)&JԖnP÷7VlgwՇBA Gu9Bj]/:DqzpYPKUKѰ`ecILZxCڽ^gw:c`Y0ؾb-%VTvp4V| ?BঢX_^8*IFC7Oml \G7kG U.^|ECGޢPi](wbZU:RNh>U|]C$g+].4m@nA3{Y5v)$" MSVX&G ICz]Zm\ȌIeώ~ N0a%iPD;7`SAVC$/B]0:XT)haANk*9F!=,%ťi*HQ,l$$4BCwJ 2]W">0˰/k.C`0mibT@Ii$`) >ϩ4X )R,Z:(3#ӆ}I8v |+]X̲wdΉFsR@UePaAZCOe}+/.+qٵ_I6hnz$-!:ߋ%VX_yMp|!tq Dz)ſ7=/nξ`>ĢEX/V okDuS-žxUyXl7r /x@7 /:QDnu>ey.+Ey _48qjVY`/JjE @I*OvvJ/ϩ,lC2\^H%pE<_szDM֪f!.{-bzoel\/@'o"2nKh5F̙s>1z@ @Taz ص{螭+>.lB w[,dw: m!>;HI+&)ݘR 6NXFO䑭*j<it 2xG02KՊiHԂl^1\LY]ضA =Էf35TqK]yDC xat]8`c>KP[@>pm֞} +飓Tӽ97Dر`7)9!Q6BLҐoFx jll֞4}}_O/|Q;yf[؅d!.O8kxGRKLxJx[[kxJdK&Ԩ+gрS] &-Vqj{u#/nU);`w&CطCXuIqBfC7~$?&/^|EKkW+Ζng'RҔMqL'go âCC`(FmLvpҐ8s%&Rd SQ[gܥPcSR1 Ap+vɦ "Av's)3T2 3A${MG y (2#7F"T"$er_u0;_65SyN+E-C a=x R7`.,AHRa>O~B0c"fאJA90uN{9,dr،iOvsc)uVPnB-pL)<:`֭Z`fǓCec&z6M{o-zOo L#=+?VDy[V23X׌US]:(Gn .}]u BjZB͗-B *ݴr@V#H <E*T8z(p OZ$cJƓ}N On5dqR$s oϳN1#.2dgW^cڄl >HZsRpKU#$Lsu%]6럜׸EʝN@΂svr|C\r}+:@o2׃uEd`HB_3҆PT/몀A^׈z#/)qF~y B` 3scZ)n_͢ϳMI+$Ty6<|p_Ҿ b`A)Up6a}[0 _ȹ"y_(1,4|EW|7}k+)4D,:H_ADh&B\Nd-vμ^Qfo:-WR.TnϠݤnsQ1DsqXLcm&IW _d'NPN 6aU'ïAKV|7sYP7ǿݦC/a Jj')mS˒~G-#zyqh*ا$9u _A/h6-ǹpldD]u8\-lχ6~x{/~w"?>O#EW7~2ץh81 PIԀFL 2o< 3QLeXneA}Ys陀Fo 53= )0 &ГWpWύ:dF MBg/p(sv VQz0M%`*A`]@_5ȲA-UJLBo@ 2ZpKT wvH$0c^j ]*LFgFa^)p a / (#.6'st&f3xK `ʴ\JS t~OHKD>^Ib(BMVm4X2٬ /L [lhVyr&{7K zp*TT`D%FY`hw+Psѐ%9HB\9$hQѹs5@s\@;7N]Áq6]ݷ'"0CcQ`vőVkf0JeZ*!qVH*pD+6j r/HFlл6P?Ed{M^WYxN?qѝXQuŌu;eSUL-;u΋\й!8#ovo 򵼉F9oc{\-:W!O "h7@Z28UPS .3%fnQB\bgn 2jnƐaf'S9flhj47Z,V@1ӰHr|XL4K^ k \R`=]"vc*,6|Զ4zZ1e|B݂۹^m|d*GɭO:_j@ܻ\`+N37G_LlPK6~os &K=;Fja_L0g 0? GeWf<2$E/nN0Нu𦆨tD3ԋt pjkxW VD&s2c2LO`BXQl\Ʊo۰*;Cߑ}vxV_V_ow'߻wX3%\FzWsݸV(À_XGmKgc8{v֍#j0C[hQ&6"׎lu|h~-Х{`MǾev/cb:zX̢3Hr(^*}?R^kk~1kc.^|] _=;Jef40R(9C%;6%*vD2:ۺ_HE-I/WT68+urYlq$%Is`z ;sʌaT͍,,A4,)D2iYz" x)<)Y-R܄U#R Y%h%b FQj:Q"Nj&_N$ȄLZX&'BR2-"o.̂ =d$!J}*͕Y.Ŏpf4sb-^!duhǝY 00 uXh]ꪪ%6}éh廃ǎg 2pURSpBRJ"Q4}v;׼uF٩jt^C?$Pė*'[we5 u^kOC/^m'q͓ Z?;fT}> }i=Xk *uj*/P:&NYA>N81漗YCKsRSt<˿΢KV5/ic :"-Akԣ7HCzz͈zjOCA(RdK>'{AL&ɸ+و²sq5PskDD}N/x0G~H]|s\j2!*>*mJ",DZB6&̊=n6$:5Oc{Ԥ`MJ+nr,TJ4t;}8w8ey=H%9H0h{,`*V)Bv):LS Ȟy{=R-c{̒NghT\`XᮻŜlp኷`w1Zl#x #`Xӝד̓C_+Pࡇ/)EYW3e0D b1^( u<=4F 6IΰJ|$ľQ28bHmX?z{V%ŊيR ~̮+t6jSeE5u۳ =Ka=e8paWRKRN~ 0P}/t}t\@MwzƊbst&)7%\SZ9J͗ܔV81j>,2]VOA5C$S2TZC#uIu'g5#˷g`HRzCCK@n([[i'@mW罏i^Q/.REaC7c)4ħPmou*Ibl&a,լe:yJ4zo ^}Q XR%/d'X<kjKJF5ёhѱѲsUpi"z$ȫ,(e^$ՄM34R5"Pቇd8  `>Cd*ǔOԠ#n.Ga\ :XPjQ3T8Uv]$G,ch<'Icݏ?ȥ=:%r}EXdLБ\*lC,5ئ4hJ?eVAm<ȬX)`qT*j%rd.E-+9lDt>2tHx@m4"*j\wA>JO>SbqQv Fo9D=Mt0V#yy^h}nz |wnMV9.0통µϏߖ}TOyJqRS;S MkΞ7wȗ{^BrM_1A$ͫ5`V8E=%X$7H+/R( 2Ɖ0Dp%kPto}V1daojapv2c NZA'(s:{fdP < ߤg)S|Ćxޝ!]yT+%0 #z\nl0/U%F h$*s%-sF8g)込cYć&U6&c':"qPDwfYc@7) )Jx&QYT4 L&w K:YbT*!~P,v<5uٍ$};m6!6}g7k+x(iryyr4b[Qgt5M0TRدӱy0A C;NsAtSt>GYP45H#D] DϞ&C"F֟}sytӤCMG"Gf: PQTC7 iPA\xC= Y$ŹmoEavVz9)w@eO({)_u~~xbg,&y2qokEQeO1A; ^m4AwIF7|jV"Q1d>tPb,Ǜ; roX)33:T(Fa/s9ر C4j$D2uuc#eЭ ~>K~m'2ૃ[;̦Hzs_Vx=o>#eުVY"SZA\GR˲_,0ٓ]A bO# bBOW'Jj(P$'ø]ZNku28P/[=(Q#jԝ`#w74;$Wc8<U[F)1-`l5C67! 2H}5u0S H$ƴfrCin8kԅ⢘O籎HUlDު׊šh}:%H\%rk@Y9 0i`Byf Ⴔ[HΌ8JQ$^/  Lȷof/˞K7Mō j$X32v#gtpdd0C|WM!M%?W5M&mӇ%sM-N}6`!f{7.Bb1)|Y(8| j4i`u$ҤS&8%G9g%$ ҳ4ZSU8|z|8 \P/4 03 };bQA=vxz:R:r\rU㍲:6޻^ 禡QO~"a=5=MPg Eil騬)Sn@7 ،5ÿ/{^Aewz7x)u_ Wz|my UF 6exvHk4cI/2DB f9T!SpTNR#BS"Dž Qoiч?߷O&{/^|]7{ae!Ye 238m5 8 DJT*e+VqԹ҃Ptrr/ë ?:v3?PmQ>P#HI2XX])ZudF>6Ϊp.afL L!;MubCB&PL5=(L`F> I $;#婀H i=niJ;f3Q6E8q T6"g.u%솘\Z84 DiUhh!BМKg/yX*g5J" !m#F>ql1%Aa KiV,Ldr)DZ T hۑ.'툧i)c1"udY;װ9mDJ86S4Ě~^v lm\),Ii:^aLbmYO闍Ē\XA(;4 $U)MXn[롓вo`-$&E6bR%) BҿFJB^!%JGTeMQcx>&``O\2u< ՛o1u6w?#߱7֤ĿtlD㴹s0 {;ޥ0~ZOu^ TAZF*`B#iP`:}LC DBX1.^H.gED<% t`*< JU0 ;G $dGwE'it.t؜䨜_a b蓵@[ bAOasvKR2ȯY` =Ev)c-6Umc"ǝjv@okŧ#*TeozUK\^BE5GZa/1΢.6Aľ8;Gk wBAP S?H޾}x2l 7"`Sa FK-9vX,RtG({=T0Bg9HJg>xf 6ӮRCQǹOT^g8Hq8A7Au`OE6<}nxz1~;7%J{ >f%WCЕ.qp솵GiNxB+]6j}u0iK(1'#)C4B ;7N{>& _Si H!urXD9q6:.MUawlJBok4|u ׶&0m\\q5jcƓ>=K(fӄWФZ]*/--(hqoH&P/T;{Z \¶ "Qcy@58OV1-0޾I ԧil+E&j{gO~.u?^ MMHm<k[aˊzZ]5CO,Ì{[W aPHpY'C+CdU@!whsFJ:uX6ѤSց0=5GON?eb` {L!u<zg.3uCޫn,mu 5:9Q; 8h n+B4:l752R,gl#bT2Ɨe+PH9cyXsei)Jٰrb9\f6h|yj*Kh2S" $ei"i4ڬzy!4w jrFv M'2@ɐ!LPB]3 0(.Zv))1.I Yv\ejHd!D$*"j=+qNr PB9M]j{2S:oq u>P+Q?+s6Bo4-x\BAC84is4;zmy>-#S\0Ѵ7 Owo\ƚw;h+NqNkkO~F3(!:ŝF8ko aHp(< AE 2VP;uBNkå$lDMb\aB$ц7tG3.wK\~^~P/" > DJ>&E*uإN\+dӉ# G'Zѐ" PC6ٮ\.E׭ DsO,@@&&Vb!@A]@QBȆ˷ȁaN6)*B3ڕu*9qt,SWG̽8H4/`n }rBHbL.ZQV0(i9.G8{$5"IyKb—n$n3\[w=!26Ta;I$‘e' d=WEx%rFdfDjУ(xψ~=^ٳg;> >T {qY[F$Z݃+r1"}5Jq0JFTho(~97GMh=OH]ajkCɊb?pq{Κ'`h_,~G|YE团M- 'v79?>ըf&m_;7ay{l=5 b@݅HX4HRxL&uJVhgX%‌s+܂fz*!,wY ]5$Bjk 2g%꭪ ;;^f^COٳ,\\Q=SeJ.M}Zxw}8kʉ4.g#FPqltX"h4{ͥ'$Ԫr8e0y6Xn*xF81P %H FX@M9dt!Plͦizz8*3-5Xo AZHW0k{l40jT ٧8o6qf`rKdyK5PV$I0xeE:aC ٱ a]o98LX0{.B"Pk,d<5,N.kum42co`T *2ǮjĒ07C+tUX/ldP^ůH\qU P<`i-|"U8G!NWd]f.gj }"*Nբ3pQ!‰xEьgN33> ?#lq,Mġ)EX΅ EGi ýD +YGH2Б1`B:qw]x]:AJS 2{_( 98I п̓$0V&,ֳ8Q}GB&dw:uܓq^oz^ d]6ٵa1ہUeyHC&s T>]v*0 皻(ƒ۠eeئ>f}^]BZtW~+8/Bw* /7#}Xc漋~g8oo(Az"|nEuY{3Q}b嵽ny}>R.RhV"v؎l[{vxH be~EkAKxo;ϲ۰? č8J䒁t.QG!hxr5"K_ZXQn:Kc;oRv~?XAgVy*coUd6|\?Fx=} v7cޡpj\/$J0j-.7A;GEw|=Kуіnc>'gn#j S;&(No89Ku Ag^D_>973VÁ^$6vYz솁1[1=jѳהIవr`f(n$9@"EFY } U<|ShE2,[^m%&BcΩOĐ(̝BK-56+#85I$iz"u=PĔ,>mƥX uehatfP <7u.%mZGB.O'̰ѓl]{JеSBI&1pK arKc@}6 w?ɿ< ђSڎ"v OAl,9O(ts̠E ?(g2Xt6GynFWys ^sIFGe^DQf)mPxU{] :m6PmWM34/nЫ`* 0?BUi}|yǞZ#NB3 z9p(u1x[2-H \ uW"}xJI }TqEZj$0/&{infu'NO̬stɌav09E̤@VHyQnWbH\A- R9IUUE׊s"/#AlI9Ny]d]7Vv}<bS j_%- 2 UWᲲAjC.2IzʫD<i`"Z { \:iF YD4"D.R큟dypM1Ãtx~kC+rVw2o j1͎'IE\t]ߌL"k`oHGu1r WcQ{vu%<|I;=[l?/8?ԋuUǥ8n<Jy A+ի\=]2}r v4 n5Ad7SM q:е7zעʯ#Sj %- Pe' T9 (mƫD47+6 c̛ܩ02ZP36flV^WxxR n!A`m上?TĴQVQ|wQP3['>kFT`DȬ8bg-!bTu+m68]Z4AS`L}YڴS<D8B_M"XLq+箩ٻ N81pVu <jzdƉq4O@ᔉph ,MC:nJ[ȘjZX0 ~>ym6B˜5K?p^F^gn+aaZ a%oFC+CCcbȶ30lʤ اɀb~FPovT^ 2ܦBUaqI/]ɽE\X+k5x~. +PVU.Cy83Xќ쬿@d\Ǒ\.ش,7i awAmɊ7:em#sBh W U+e1¬|='>6E4TA 7kaC&Rbt؂nE.YfKdQȾ7P Qk%,_S:/j/ T&*(YYwWD4s|v׌]P=1CBnpg6ZNbɡ ۨ]-qJ"u%0V ./CXt r[7-QXoV^J+ |q "™'D ~'fIDɀ*gPד c)w5SR0pKnNX@3pYXQudw|P\d\MƤ {0ϡ.+6BsZfFnc(bK02ٵkխ4،cF$4;Kyx!$xlii_o: lQ7tDS!cAX0d4Gyb'g1ˎz) NYR@AvA"[*]3W - S)f/R&2sf SLEx^3b/"ͯDв%aJ:!oXSB)8VU`V܌|p!{+պ1?5{[@@o!bêI*s;,:S<p{ OesV³%Y{st1EYLmу#L_j \˩ux r|W&R )k|++ oAN̠IBЍ/# .2H O[L"==*z5=w3p|X?3? Ͼs5^ZбDt:o4&;]X?",bm{=Ta.:j!.c+Gh'TONCvk[s-UP ? 2Xnݖؘt: WVBfyF>š7AP7dH`(2Ϳ»riHxƶs3q(̖{HH*9IXFڂ*Zp(ewr^Z] H.#0U|Kz-x\FQ/}HGb?X At-JašvzXR>ƃZnX@h#05EBc^0W|%RiHI- ]v=s-fg:bSiA&*2x@--fwԬͅR)oY?kKgmgϔʪP̔=Q(MXDKĉK…E  B-nwgTgd٫M7go{,Sh\Ґ9}CRWjR0>L4CVQBM"sNB9.je(;YA@l鵆JvN spqC[k6hV96˛kjތ!$lvS4=SL7#B|TVY1*o\&N ;fXm8UZ#T m>'cl_Y_+=MT/fS , ᮪煿W#dAq ed37aRKrY";6}Rv.rbjq0B]ىp[wfx48:W!lJûւ.(548F3 WgU6wz)+Q=aP:IʺH_Fs:&E%w;Q+wUΗ$mkG?8 UYc kw]x'^:y'?\¬ w/pcs5GI`~zz&P JiNhƍ tH_ [?w`oW~kpMwa]Pƈ1Gn<7a/8-84IQeYZ1ł66j?~gİd'vbg辩YD5Em2.)>N硋>rݚ``OM"GPhICDN_l0֌ K`GTR$y6> )纾_}/^}# V<PMQS<$њ5Urfê KIW4]A'7'TP, ؼ=4Q D-vPH;ĉ uiq\"m[j/j1 STSPY֕:&XKku 錬   ZY$ᅍWz'kد>j޶ !vn3tck"?}c5t:av#}tiwFN@ug{ݢ Q!p/Kr 2xq\TP^ఉ9¾Y[!LGDۂv78v돴B?tngg/Ln~kK.P3{?y<&~ˇ%Xz5#<+"&~)-8ؖt39$Whalk|kAh?_s5g/рSfJ|߼3&裨-<-#d{kY!/c_fTiʂ;>p/8S ߹qU1npW n0Ivn+@mOCtpffi^Է?[mzzf-zd@' N^܀GGpb% Fҽ bNnS}p>;PFuP@KX~7l[1-&x~r p5wo'^Lƞ"}"^(h[f-&)nc8'g2zm SC2d X NP;@gDC5uJt[oj*|Y\:FCz|KRIGӊ$v 6 ,hI TNgUQ)g·%2|q4NVvKh#32rD0Ujר6ԍm'S*_W'\h?;s`nMQWgi8; ~A ,`OhHՒ[#rJfTr2yD˗`{lQ,rm!bA/-i>_(cYc8n1 y@ 㴸JT-@g6$&$3d_s&kW=Q1.cvՑ/߹lƸߣnh bQUK1s 4X2GՔŐl<Bv%A,>ɣtE))G킀"IAQ103kxvZw+%ᇝ1l=~~"хIcX\VŌBYm7עSKsPVE( xtvWشj>#ԋ6Y%Wj ͈D;U鼮#w=0.#eN09{ ZQ09J];KWfh t!K[I kDVGDt.e2j!ə\IWz,&rؓRtE2O N`;9sڽǜC".b&8aۯ*W_/ pS¯םlY\ _~>=p6kX}Vrܷ@g=B3Bҕ`ZELPJmfgR U$/O~.Ki!{x c[d|.{umpf;+'5cV^{qj)s3 \_b]ywƖnC^ܽy؀ad75up?c*TNl@zjwsl;EW^6HA|;C@^ÉkڳfV v|8kOe{ׇ@01E"\FxIzKfrqS2Ɔ&C2aoY:c 9.Á\L0$dv!OaE@U#eP;t JI ֌e #4'Y$Nj&t0š XisA}'8=3̹'N dGA_-KaUrQGф&?S6{1fi0Kwc`߳cn,?c}*Rs܆* `. XL b%|PP{Z2pf B&򂘬exVh]PT:S%RaJ4ݸ-f>VU&s!O@z+Ч?c749%8_7Jqj ..p *g_>9̈́Ԟgٔ2or`JѮ()ۅ"YzcT$CUa s_gbg??/Vc+}­ 8CʍSP\HfE`ڄhg7}.b;.b<<"Ny{HPۦ4l^-!sG+XiVVήٚhɈ OԮ?. s9D^ȇgx}PӰu?W>f ]_m~6BzԠkI+ôjQ"+FQ7! DW9Ųs_ڐM/) P.Ɋ 0E$ [>@r\u8ԣKp/aC}ZVc~!>:|3 ?;ït&+Jl] (H;2)v/gn<^r uCN"C^w5F'@Ug/\{-XIjcvj|~`"$z>G̨I׋o&FQL\OVR"\Rq,lw>k 3/%_:&umscT/,9  q$|"7J;تA^CΌ19=wE@{oۡ:f`ZKӘ&ڜ[н 05JsuΊhW/''ϝA10v'?G:+#&p^Diz/^Q;c8mfIE9-h*؉̐-b"T* r0( Yj Ogb~@58 /?GW(ڿ"x`~sm)L=)\Ov-P^Em7!)Ñ .{Mp uȯ=NFIۜS׸HWߎN Bq+% ^1pC#)Fއӂ}8==x) )4$WYYy8%$:q ڲHVPqG[҉u &9$ (ޕn+7Ć XWdK, Id$o= ʁy`;( de!;xsC~KQD.0ޠs13q,k6fg R'`hz'_ܸdF:^݃q/zKfe}_ yWB 7yJx;T!ݍ G~%KA-vDW fҡe6pLW*2tb-p'2')'hz)JXRC)kZs4mP=t\[hqHwf4߇u;؆g__mDS>7Em6XVþ?yaAh45HeNLcc.pxNaۣh쬛/zQ^M9Oe{ׇt'$0cƱiIvz!,H, / 0kcժG}J BAx JD @u 3zaTR$Z . 01+Y |ZvwI&)F-0bnjeuQA"2 >SR4f$)vE6[j܆"AEE5c u$Ȳ& ].߫Jք_d/@9l 5rwsg]2KNx1w4u^88MlQ$mu>hj,bNLkPxti&hWbNk{47{nQ/L TTxwqi:m1!ˏz9HhePBk-Ŭgΐ_ʦY#^F0IS[p*h b y} $qkC-M[ ?"b(> sG$1&H<(CF5 އ}g<7SK>y$ێP}+/(P&B9I (@Z ,{.e0CBa30~@WFw$jvfѪFٽRA"KEQW!.C cQ r0дi0cS6ܓ!X`q3 z`ΌUF;tzaЏtR#\F-,B؟J^PI{؂p+6)*, B:B1 R/V)2wkTxe=>@Q(s~9 oNMm/Bc<{$ sHs:c2GTS >^Ύ5VK Fغ@.'~d^jD/nb0Dw8pL݀S}i.%sq ij fV`yekr^;>u TrjMŅ0E h)* rc$o02"+Np+x7MxUXO^X޸ 9 gW  MͻS\daӈ6j 7| Jx='n .SX DDk^J=Ͳ>IpPׯOOe{ׇ@vfh'*\t T9UVL q3(#,iQe3Z`OtƢ0&DW MӂS8AG ryd ceaL ^'&ĵ ̭xJE50./sP&^6\P[-^kM|fƠ8Vk 6LE 5SylÚ([ ^+j*Lg ${d b:aW9/Vt8X$"Am4U9Tv+x %Δa!h˅K92hV&) >5 ak!Wa6hj c _ =ֶ䮻n$;پBZiX#,.dG夷p|C/xWfqM\{9ے](A$`ɄA1^c Y_*E$1ޣc_2˵Gbxk 䚉w$8\4`7 zS\6(@| 70ojaV%5 SHfȬWOJrj̔ڡg#솓0lMd2Wa{nfZAi~|wӤ3hưğ Bmnu.h Qfx"%'R3z^x,5-ހ܉bQa&cB C<j3zR;#,+vr Z'hF]b0O3Rju _Êo*pSGo@ݢ?QؓhzZnd\JVe`-\mJ2˳" dAm}|H I`k]Tx{?- aסFp&E8,i-r5~p/.j6fD&c0DT¸PyUԼ0ZVDԣ\6س0dF@Å'`>ZϽd.g/ `I5VD Nʁ40jѡm0ҟ{뻹veL=&rSZOw>cmpXj 2G pMu~D9}R&$ЂC",O[TR,N[*R'h`TED&@Y>Gde5aq;UlcY9c'ma:q($GI N;H&K>.$$C¹/z-vlA 0~9vm,b~avawCnk͛VHA <.Nh"O`D ioV6juqto?8 ֓aL]ONV$0,֢vƢcD yTy s/G|8x4{Ng9؀DBX j4O|`p{8s\/4a^b7tۼo@g'}+;w0~tqyNbKp+p EyƇC5I1Poz!P6ĸ&=B^Q2*+j M~8c07O* EP*mƟq*̜*{-ΥU%_(S0< 9>MZDt$?h|PUMUf݂DTN@_BĚ-`en]+S<ip,F]*fP0Z)[.K3DNCu}[gKgI-ag@.\$*l$)0Ho@@lt,x Z]&஖rtdҦבF[|"l(Ttrz.jO<3LZ ps1B2p#*gc8.W :"{=ЪCm=yN(.? Qe_қ͂~~,oϭZW5T)l捉#'`_?$%c6xWZ560n g+n6r[D:aSt22r 2&qҹP&bnvg,).&!NC( ŘU78k'&Lwab\ihFu[ e X|eymͤCPup60ct/5TPɌUB[JylZ)갎<9>$`$K05s D?ׇdatφ u>3ٶj307s%x9qD0C"@Żҿ B!2f"Go 3]KiLK F:u=BqeE$ ҿC R )YKnvjk&u_h;#1'XQaՑQd,1"5)qOyxEXQ)A)Q|刬u~4  m?U73~SP;U~ьPvY'"pxEz //rЉ<>Bnn"-t^CeG8i;!":dQoe:Ϋg{_,,N"EJ(RݲeIVr獓㸗IJK.-U(QA .b̝ťWp0 sΝ{y!MW}@67E& d!En gQr`[IwVBZ\;e z\@k>Ȣ2WjltR?@ֹOr>~ *--?/$[r Ytsh;md 610Ѧq5c>h.T V(tk`_ݳ2?⁽ ơ'cmAI ("m+|&jP-[p`W"HEK 9$M E6;&8ʠ^~l8{>QC蠧Sᐨ.ԏAUjuk7?ZB<  oM΀+*=6{.dzڗFO q{?<쁔֨߳³9'$p=,hU-9Fdvb`iqLw<~㮆D!Mi̩ BnnA+( a,,hskzU6;N-;1\=8#c䶖cmYj9J'- NȱaA$6,6`8L~}yru- 519TEf@4D*&2!Nr렴!6<^6(8y0N-!-jQ8 uI>U!By!LbE`)Bt(N*v!ݻo_ݙ3[Ҩ /{?=  5y /wIBe0f`p*P*p$OvQ.c 5r~2d칦,,QzAJJ+Þk fD })&c@&(de%K2w'z+Kfiq0ѼF) BYrA!ʑߘZL:n"MȞuPgaH'!* nN1o<=*.IW^5LԛEM8mESnQRrІ+BwfγlIE+KqS2wc6P/@$Š.@,i׌:>)>Œ DPV+%k̇[sm_(PC^cϰ$/PX=r t4& d:/BqOBeaƇ>ԨT={Oa/k={ !LWWz ;}Xu>ɭp~X΀G?;d[l1+Ϭ:DIj/b+V|lI>5µ&Ln@MOo vW[;G!҄ps2*=sbrun&Kw \Noбy,5[ t>vfJvv,T?ԻW`?Jv̮[̀?zH( tuԠwHJ:1İ>.4@fn(Kmoۑh㡦IDj>aZҰƠ]3n޵v }eu#v[&an!uL P]v#£BxBC@fWV$冧?N^ Q̀B u-QXF2o M<6"#\r nkYےR'!R5'|Sp&a> 09T T;5!J*S)蛀0Jp91fDiO=6" ,&&H.ℤ/ JÖ֨ɴj1O) XT;sEQX_dCseZ*e.R$zbCl1ӊu @4XQk3na # C$Txݻ||#5%8郶M%|߁/Ѻ?s0Pp=~wHU X.ɅYYJY!͠dB  y>2dikӡ[ /9n/?h P9-,"B`>f$5WA~P}-)S@$O=X7P>b2- '+\VfVzFYCZ^ Tt ~V2XfMNF0q \/.\1,?|7 L 7hTo3"1 Is05CvXQgwcոEcѤ8VDpOf8qyTVgB8񹵊!һC?;9p fj{J3^i3^-Ԫ;Wlr34?0<Yaqj{>!EL )MEO#aj/.[>\[.j,Ji[Ja|u!09i _Rbfŀr[3oT]K}xJq§< RG!0#\Jlp J,S[I AR;0ЋMU3NKA-o[`{6͛p -lS-C=|wt%τS#,!L<y~U-,VJS#kׇz#7;co {uMHBƽ7\[r(k~?WY-+ y&z5pCоhtF3cg!p {-:Ufp>pV z!}T0mmwR_o)=-TC3j85A_i kn>Bw_\D)fS>RNap_ag`7p32$>]6e{9V;n_3WCC/jUDaoi_vlpRֺ9@J{\D iS.`dR<}$trY)IQ # Np;1) Bޅ8?'RU(zL/bx+˜r[akXZ33Rb΋S #>0$ siwz=ҺX ` ܊g"7.#f0޽cyg^zPB7? ?}ogUH^ZY};Ҟl>(ʋL?3xaRo},' R/FP 3ޓ3sV)Cw}]$O5/Dua{¹ebK%Rd;K}c-ZLz{RM yr+V2p1Xqm!DkYpǚL'u$}F"sOgK<-5 "  o-\SB$&+k F !PeD^;rK2$FB$ եRI- g#V1ޝ rQ$ɮ>W& 1iV"0&fi|AKj`/H l 5& X<`N~>x< sw7r `t Laӵ >uvzKe9vOv£3^X>+O aW++=eϬA骄S"Jc8+Ru/gعg tC j4L&*DOKn@f0ZiO|6־ Εbaf _W/~#buw!K]v* 4t{@SඉZNxD\=kW [`74uM 3S෰A5xEԻX]i{n&SzsÚuc%ƅXѱїbph]ڤ΃"|)g@j ͦ<>gphm ݸڭ:'h0+8lŘ ! *CY)5٨-R$&`pBeyu_wOn,RkMͺdB91 CPQY} -㹡3/$h& o ~ALN雓=*[>`?=]YT,6tn~J(\=ƪ?خ /Be0r7]8s ޶`pǹ 9!qzs_Snn5-4%3)W+B"Vm͊΂FD~4VwfȋKOh77By,H `7߼Nx~h]VҾqz-GaaM6߇ "P6=\a.XHL'x4ø DQ t9w(F|TnZ'9 wr];"\00 PfF-N'zm87F kQXѕS9,o Aog/x p߃rT)bC?8&* 47aP Y˞Z|q#aa磏 [cݘgh&>H& )$DnhIBG%#<, F_mڸ[" 3˾,hI1ǍJe_6&RRYtx $/q #c3.6^kl̪uNBe]p:ynGχc7EtW%,0VSMBUbmBqpۇ.'Ntn,!{RT7d*\DOrQO]]ÿXoK q9ĨC4yw5} 2|o<j?8KokX{ Cle'3w0x)Hp };f=D U"F㴈Fc{#91e =ܷVOxt(ܼ Ġ{@6Y15lRT@7MwG+T:,ɮҿa1ZQk[Wcw)z|W8WF± t b", RVt^ꝯ.,;7Pf+]_6[.K{Ֆ(9H3?c8٩tQJ(zL?$5p%).C-1 W5x= VKؚ ApL '9n%MJ[6zA\ &AԱLr hI-Mrb=vdD |^I )BϗSW`]ĂR;~!q׬Ɩ`b w'I ,@R8\s'v:C|̱Z@[ؕ78Cfk=DeaW6?wrLB".Լ^B]t].tAy; ^うK^f\lMMpx#C1hxXC`>Z.gC-ٿ=3M+FI3>˨PlRBjaA+ O*GrpU"R<r؊'Ƚچ 7Dėt-o}OF*s~wVgz,7Ii✋&W-SNE& I (p)Rd۹yu &wlEB>vcˀ*n/{VSD#BܕbO';s}޹坎W꽁zz˸wAiCuÎ \HM(?,Ӥъۉ.Gƥ(k (`2!C RS 打\ V-o tOBѴBt3 Yk&MA*U`iO`Кk=%5to1$<< ê5eU.s|.fw*xߴˑa` 1뚊s:Uf>iBi[X6nX=sOucRfUfp'ET-+Ј!ȏAc\}03ARLd=ɸ U.0`$£6!fl Pi1S#%BWjwsg'N/ipˡ ^; GHa.|uDe0dsyEdJax ZB +Q ԩՆ}CF#?}Wuң_!ѵ slR~=O[h];J^ wJ/BaH5=aǢkA'SFB¯pz*$x /1"<ex{ BBvcdqnbjvRlF 'eQp"bJ8v saIYPtpz`&@^U#cKX}oa MyWG-:m<'Ozj KZb=\涬cPqV(f͒-G^K"kZWgX N ;%< A28 Hx26 5G.P:c[X%`IOYC :?Ȩk Jt4/rof?`!~ao 0%ܣX(X'hbKT( ,|Wao4IfE /S#l4,ڰ,\0c:K<;[\ K˲yKpB /I,̺gGDGG~ h_º5@W'`wE )riX r3+`>)5.drEׅq[EX%T ht]LZI:1 d͒"72(+nS<Ra`:n]wd`t>\PkKc`,'3S-t|27UZtJY4/dUHiZPRb(F$luzpC[Xfw)}߬c31̀: ,DU+PbuU6k@o\NEs&=଻fG if sz)0;a?cΪUcJXa 9.a܀i5,q sFT4/Ϛ2|a9-< R hZ?GFtK& F//eK=a{38nbW,K/`wD̈ 93e#.0[$ge|JB*\: ҧzWbTB \S- =p(GvpMTDDljkZ1Y(e%UB9!ӉSrהHZh-g<НOL'w.2&Ƅ$ }N&/ܭn3<8vx%7~S0ˎ0D3.ha=6&Gr&F΀/o_dॄĽp8Y/I;lZNl8<:-p |1aţe-bE1"Q x$)SliQfz/Xglqۈ$+t; 0?04<4(#爙Ǒlڍ)wJ=-zЁ@L9qzchH9֡DE=0R#KbS  a3]7 IB5^'|ZbN`SM'0M`w b_"v dԋp݄iř@kjMŏ`[LָWzn8W +j< M ^bm#}8/~vS<oBǍL w[r)`)^ %v}|kfmFcoLr_{WZgkU?>aSvBt(=ٸ K|B~%0mX3zP>*p2 R ߇ JҍD֊#1'AVA@Nˮ{$@F@&E8+"1܈ZU,ő Gn(Z%lPM&8ΗiԵ@k^Z"/Ǖ @-CP;qBFO3F%}S,Z&絀9B6_zu9E&WdB^\6fykU<4:%. 0$橊| Hkߴ<-D~YILaT.X HޑU=4]{ֈ[ =ovPCv`-||gQy5Y(~xIݓŶ3tRW >@C=_K!RB2pg)&qKawizEgFܾÆPVhq lli8l<|S=9\Y5{'ŀAumtrP vwY6l{4%Ʃ/ 3?yF!H\ J?>o_r;UqǻdEzo^ԫEϲazZ[uM~>d f.Q2*LCv m5+5s"W,#?3x iJC`2Eql.|IQź J܌ۉ( B%R~rr$#6C"U0OpImsd5R!|l7qҳ|GrV r UT6TGx4]l#y8K 9gΆ OY_OKn.'Z:]P#Z[g8v#Mvod* azŭƇapK)$'X@'`  ^r`U( ӳ*MmLf8-BnA48xDsOx$0 LGd_E+$nT~zqC1>l*@D;R놩UVfTO nU_4Oqڂz%AFPoҖT AVHYa_\VԨ^o)ׂA%˳8&¼7|aa`2UL 7zY'`7q1\'^ .hΫ^ )gEa<+\.)Y $nGb{\\$\ vcl/G!t[5mÔ9Ík}E/!Q7Eí}n?h8K]"iD]X6&(cJ\L> pj:0U|,NU73<; 7.i-9F#/IW R _ !P޵ +>#'p2M)jq-{"Ai8FBە4_$ԏdS'׬ &s]_/Vxܟho6kpnxl5},d m k&DZ F&=d;> ?V >HK ঈ0Ԟ>]dŻvP:n/-y:B~Y}՘n( IWp ּ\ʪ"~%~kmL&k'!C,I)C` {E`ʋ:wq¶XWx_9J8onT.Naì\msMtFls"JY#;TMMHe X,(6Z؊qn\;=Q`{'aqC[nͽu4L"O |b>Nw7(>]*8gmJ߫p(~p2JL2`ǡ}[{/zܱ.s<[1(ag&B q8I дK%o\]Y>q!k9+ġg =px̎a "O(' (*Hf]3 Pvw ny4#Ĝ qEDFZx*\^Pz`sʍћʯ̳7Tzalpʜ@&c(f7RVU0>mDEM:rߥ5[XMRX(-iUЏ!30}pI c/v0ܴob/BGW"[. P)6Ӂ2(l`f0#Eꄀ*Ȫ [{f_ oǾ:X Kd6X֧ $  %á[6/ÚN7C7sw'ہ dBrK«[Z#ׇzw;c\ _ׁzՐY3O ݕ7Mw_5S/_]UCʝVϴR /nȎ-:tlBt&Gj*A!+A mV(1 ӁYyKoqZ a=vcMgF=!h_hL6N^X;=ԵTax3 @)-zxeTHW@(| ,} t,\kv8 `=>ӗ!uȮ!eĈ"4g徼рT'~= q1ʪƂ1辌DT!03 .  (9|+(&Tm"U078"9, yU|Z |WcQ굹hB!Hv9/iE&Kk1S Ըaޤ0 : ۋq%\ T~S;ˆrc;(Cqp1LPf<%S[ÃlD_k{o8= Ov 6_-f)f}nxNrNIf㎼5\Y&SE0T)0LC|߹Cr:/aFp00PD_2[%@Hl;Woq)C*Pj!9Rct{D.b߹ACJFy5"+As!.J RD"d9R.ZsL*Z(2Y?:l7Dx ͈`(oǞg q0!˻-#ex8+Y9\ ;\!A]tXl=dP7էpD@t,>)2™xZ;Խ2P6 f_w[2BHk J.z&̣4>(V,jǟe:^<~ 8`{~ d0fnI(5t­p&o eack+@2[:o# A:4[nAXZ6ÖUnD⹊z4>ӎ4.HO8M L+Cpwl",'~.3Dա_`OඖۡMPb 윉TZ,)fjNj%gkp <_p-HyGѼ;SPuX`]V4%SP. =Vn6+jp#fxъ{ = 7P _SƓ䊕i֭XV{tr[Ks*lilvL&N;PXw& ֜4ϊ}sY6(w*WؼeKԠNcay?`s݊ 0ACЭu zg]?d:0ivm8x~Vd߈ן 'Ul]x{L5J>(Bj8 #(SVBY)T@"|J9҅.e @fC8g6>P/>CsnI 1krl ǶGÉ\o__,C܈M>8ɴzLM KZiT9 |Mfwz9BU c_l,z)u #tn mƐ`z|V20aPJ˴iAL\ NŒrddO7Fy]]{_~Q aI25JД,.Q9W [pOfXz[R~UskxPѧa“U+/Ao.5@/קy\-!d~yɶ_/o$ Bhf媏 !% 폊KjpI_ِ Q0TN =Hb/,EF0 Z]-o3}6u!fLa{woom&5dH*O'M:)~~SdC]c - &K48HP,XIp=OK \'ENxZG"G#;ƞA6p$e֔=ʼnh̾yʚ[}\|fb8|Wh1 r)A=)DJ1ƒ|srT6H/ RGaְX:1Uk.ՇLTG")M*̳C*szuFF\T?sY ' r LM{w{d.SXLIи);G>UD[Fτd*? %x>M!H:``{;.<^L)4P 6mc%z{5HY|XK!6Lct:2-iH-zV ~FsnQ&LGѼ~T^ʽ2kĪMdʅ~6b u,. -1/\Zb ǡ/Pz{npBU (T"Xo hP@Hc'(eF;chMn/X d?g_eqOºpxMv&:XT^璗/:‚T4M^fgJ/zH6*dzg/`S@0+N#Bqz130:0`#>U_f}g㣬ζdf$dIH "ź}֭V]ֺժ.j]Kպ[Q@eȄd2Lf_s9O1Ky=\>}]f/ԯX9.LF+CHѱmrRf,Z2fiJP;˨71&S1 ^-1 rW)PRL>}.sy8$u+)ۨPAVE H`z>e7XG# !^X19wz`AI8j@ WSx]K1|oR[Fe"宔JMٳÉcۧ ƼOh1Kz#Fb . e&"&GZ`$d H{*^,YxSCVK/M#+lM yX'|ǂ3'" v*xN?3\@0S =́]i& o=T+p?Ub߄eM<5]O790kkfzrJ{v lCku``F+܋lω vh!l4e#`/qWjnۗk->l7lC=2&#F+Tal ĮZ/*lmz yg_5:Ѫ~t+ƶ'SEv5OEz[W}˕_(p*`2ajwzs!@l?mN9&Ow.٦zZ!˕9{0ϬX50~háKۿ V~^ѵ>El^]Eei5n3tl:Ѥ.ѰBəCaL8 q&z(ڻ6oa4M#m;^+Xޕy5j)_-}ClŢN{iC7Tc'c-ݲNCUL)2Ɏ8m;41MMISsM?%fB+`ZoԹV}/f oAL`&<|a6"!2 nZ<`c\ՑA%O5(E;'Y0LMlr){3: k Xbi$ Qȅi4*gt Fya̹*+قfǍ6}^%ɁGٟ`j /tjAJ^`T6U G@:âL,J2 p]([-"HXjOaEGjwlYQzY DB] sl kTpsfy3Q/C31jMy _ϖ)22b)YXNO|# RJ"1 mhĵ)b/Mxv,G"N\A5Xu_37+F\H}*'QJpqh\>GMfIaRIl "E"2gԹK0:y_K_?#} ;|bķ0[8 2!&{q ђ[&~y4kM+#Q9-9*G*^Oh<r^1WP)~lAetvJB0|zL#gdgr୯Yl`>;*)Cҝ۰RnAV`c tAǶ@lӻ&w"T(7`,``x a;>dD) 6 6 C |A X ]0ff2.^8&=8-l(ע8F] cs#Ž)3Qj .Չ4*\9U8zSQ;W-ia _eU(7"k]PsuzKnxnJ(}̈ .&܎Z%5*h2H!i?26$\0剀~ &ʶd2A ry+}&B]N/CI Fop,ᕰ 1ujjhQgZإ%9!FE'_=ʱQi=b H25h]"qD~AjFEDn׮q(OX#= fjڭֈ* \r-@i^Npj$/'䩂ȟ>ݘD7Y~$,c_43r;6NߦgyL2u(A&BF;FD0-sZOnـq=n { VXpヌ}hU?Y8@]:΋e ±TnjʲZ2ͤ l 5 U/&N65m-= I0谍{4LmBZEY#ny.TV$U;m0m?Ե¸rدA/J4]vf!27hy0[Ctatzp _ Qj"MC$oq$"`AѕFJ~6<5m:F#-t# ,1m)?[n@В%5C kƢ^g^H/hͿz1,!(&qb/0iT@ULrgt|55# yP'ܡ*B 8#kE\[ir-9LC͸`6~Š+;}HQlKv|#5$:Ρ]pW{0P^^n'=}:!NJ"$5:-61k&t E!쐐ȉMkB`fۉ3VvVd?Fh+ǩ)M&2$n-;=U,TL_MKiUFYaz_@d%k|J+tA55f2LC8 AF՗.(]> 1~MŦi DuHiޭHE ^22hؗ<23G1 )dt9Έ}}Fu9u ~ Q:Q3 @ Oض0zԦjew:XM#XMi֪J:}*I@IhE:t#iGL,$-@\ %B  %#lU| =ˣOPIde\DQj>rގK@lՍxf2ǀ5*ZCJ)@wSߴT0 %tvJS3EHb{SӋ}b̺ᄓ>7fsK<>~yh.^.%=Bxt0[> #$A]"8P/V ώP6 ys+ƍ-dF>h mMžit(/!M*؝-ahgb8aB?_>!|bA% tB_d;IHc(0*/xKԁUU;ᙨ[\/Ѩm{% Ϊ:ݶ!H!`.>P&k3Y .r$ ZU z K&۸(vը2p-X Pe?Ae QBQKyz>FTM5 z,Gyc##BIvV5\)<<Ut@C7| ǭ &jid`k+,x$Vn"nG=-\"$ <X"Bl!\&@_?g}7EP_y]qKh^-m`9U[cl ͱAĨJz.Z0HLy p]椸fT_3.Tfs(V^EINIzrOl:i&NYzCֈ'澱*o4-(ϽB* D6 LFe(CO% '嫪e%[?$7xGT*e?7~B}K cXxQuU=G&Se{ɡסtv?8%3'қlC ;iG?o8܉]ms >5m <o<k.?g=H/3Ȼ f ec8lv[lXIUIMwf³)Z^S΂^拒[Hheb#%KvR٬f8T_HiVNڕ%sƜ5X`hV8:.>V^-.VALj4yg 0&^FG FӼced[U5z7,|Nkzt*kX/w xwt[/D9؊cn\HmkQދ \ 5KwBziY`{(ZdA(h>\ak'AN[$>k^a L4Ailƪӑg~WJ! |JpM<4Z6l+-LdžC4ʧIb&_ӵ葳t[8ɀ]' :DPjk9̝s!UĐRB\b8%}r܉4ҋy6t*O΍YO1SGnnX<>0 O!6w"ģ <;pC31ֵ _HEk0u gOxvܹ+Gk'=zxXXz]иv(g$aXr]f;WECxgw?욟\|W]z+?<{7> ]q_s~.Ä٫Ny1ig]/++T_{71؝_sŠ?.Gŭ]cH{]As_tхlYz`k^ߨyf%\B/yH?+]t謿}v+[n ?5u](ғը(*tknͺLELe!`8ІmoHr'cѯ&C8Y|4,_ȱސ}fX,q1I N$" x*aRXG^+{S؋KnYoVkn$ȱ{%?ݿCJi1`6ElVVqC`E=6/Bdp5Gjb^FhLdChٰ $}{p!t^f_^n<*.%'T⚬d 0e`Xz88b`A |[\W |cɲ2_V 򴿌B@/ U 's>HLBMf>ÜE`?$p0ZiԙĀ#p3ѕtWj%25bd*'QJ:!.j]&Qs5"`<&*e W.{ܳ?&s'izhj&Eyn<o5 Z!z0Xy w#^7οBx"dpO] WW< ֕A:YSVk"p6f8 ǜ9ua,njYMmy?ܿV+ /쇺?.MnOoҭ>dةT?¸#P^pɗ-~95or ܸIb_ԆQQR9?GMx ? >NxL]w"LZ2s>}TN7hqce;I70kgR'NkA`jQbTp *+?AJԻoVWQe8F]&wtruA~ 9kDUb@#Q8CWAz,30'ƉA/":7cPBQ󌇜+ZPVIlfSzKޠ˙Y>me|:f6e `bkт_H,@TvLbJ!CIԀ .BB \ܠ#D)kCP\9B^k:%Uti¥gza_N4xsl:du?{;!bX뮄ªAFv'a'D:thNWCzM3Rph nЌqyTFcS*+B2a` `di;tKA5_KOr5x7 }0RYs@1MSK/]Va.iZ~,t&2㟍׫j^?ak#Mnsp,/+e0)$G~'XF uv!lH#jG^*@ Ff/1\\Pn`Ȍe!/8HE9) C#+-\|):D8n(2x0O g) ;x щlfE' PIH\J[~s@-]CY?8*P/œ0}JA*}H@!<>Q~rX0JuwL"&e[ͣZ=7uA֯TI f)xǾ5ZVe« 73DzRQ%J@:tb׉>h#樸܄}fo) TkD&~)2&hBcyiY@}=RZ%{-E(~ƕ%mjLgOCȥa籿mޮ#CK]Ȑ+ĥϳ /SM?f ^l:lޒ~N(*ǡԾlF3 G놝FL~r7\dDsv2 jnYqyf,ޜ kYk?>.dat={*tG kZAf{rq~RO vjÝ 5 H4ڵV *`HVg>!SxmbelhOb'6 Q6: !&Vr #pTN_?6qvS.}֥Ep=Ll#`a۷1w 0ghawgrg(D}ʏG(=i\ov_98}jEKjHh`;df{TgM+"p F`h½QU /1="|F̞|/M$32_ne4yZclX f0pU3;K#!/9AʉBp;PU-MH7$bEfN[=ѿ5h>R/QcoNMx1Kܷ>>}f-:3o7Ժ`?g))zJOphJZ#4VLN=<ʹ%;1Ru(^VZil6¨mV-@%b{iNhԹpoJm #ٜ^ 9_)g1$yK"zs:rm(_ L.T2 98]"N Am$VO7_sZkXXP j5FPlX&sUKכqIkԈVg03o1T*%3C-EI;ЇqoȓbCV?I >.IjЫjěh4'@3Ivr2kɱGҒ.eq)6FZ°Wz$ R_`o5g'fU%oLq|:)z]-pyB؄W΃`څ]O{ַ'ON~~WVٛ*hzCM"N-Jgyo 5(^:-k3$[?`)Mf{"K"^\e@\HoWD(ZN- &)x0V!& }lBX={PUnW0rݱ` O)*xq?3xy}`P ;VpjMu2$XY$. 9Mt*LI rQ#^f(2YT)6h707'gxb\hf6 q'XxH|'^us=CVÙWw=e:Xt~뚡U"ƥ[>aީXz浬Խ?߭ ;0v&GnTu*8H _lj1[K:ъ)JPJo;p}槶OqWBFRcP7e2˄õ[6~ QA=Ҳ<,F[3LuKNjVfӅ 6Cae3Y?c>QS@%,`\2p_=}X&aࣄ}MSpWsJ:w 1.T4πz_%orJ3p'u8vb6|_i %(4❻" `Ӭh8{->/Gl 5s-3q,Kdmpt'Vwc}z nS=434Cg{Db /؊kRQ>Vp  ok&mRAi0wYte1%V1sߚC\ HFYqNDtc5"!A0=S_W<13C{!~@U'x$&V@_cÐ;c͛D`Kʦr4-<60$tizm4YOq\ν[>mALᱵyeLlZ/\ X~gҺVOIEchuBypt-zNQ]f0 \52< #O7 Q*uO_rVy'!u4 LC)…NI7j!׍UC4}76F<3^3恷0L9W'Cr# ݄aY=ۀ8w2Pl|cv-"N`wd˪XmBnS``g$-g EP_W߳(3, Ѵ*2dQNgAD -MbPIQbnL.:7  shzޯ#@i0_" U_TfV8{$xyuǮ=K=Ġ(ߜso_ wfYK~"pp+xg2 n>M-_o!HΆ=Tx>^x*IEr>ndPptp10Ckqŀ_̀p$0}zLqj@zv0#hi.rDJ2Ԃy,ņJܦn~ &⬂` (PL5f0P /Z  wY#Dߋ7es `u*/ыn/[4EGQ/|;p\/4/~e)|tFd, ,QM!hYU:726G!}4E#T cÝ6=Vb͖p BQ #A+5HBhC@_OP:F M 11Xo}gӊ32Ո$`rJq󓽽ep,8|}pSΈwpnY| P=uuT*$acT+G l^(ʡj/8` (SjQՊk2T9"c^0İI0eC;J%Ȼ5Bإi3ueŁ[^s{M7"}3>Ր;]~[Pb:vL!pZiPіq ~z9US = 7fӡ0q۟x'FM46B sh#$s! V1|ƤNOkaj5{  ; }W! ?<1K@jECw 'GVqiKRD/JԻorZSpEUEuqH`xmgVOrmmU$q)ҫJ#T`hBo`Mh~xwtV-SC"'T d6 1m~ P/yl6c:S{ڋ8a@o}&9HNYNS?i^|Q[Piw؎*\2b `ZbU&D[郶 L:*Wk9%h &8մ#^B$4-*AqxH0KqW 8hGov+rNKҨˤ2c8}G^9kM-GMy@/?H I }4N|ƦUiE*.Vl? (ֿ.ǖK`Cݾ62x(UGRUFڙL"Ri/[;Bԡi?o:GƿD/JԻr'JV"ࣨ?>ujGmݱCawK=- . nbDA<"I5Ԫ)dF0%R♻V( "t=8Spz OjEB\fԣD$hlPnWA7zh8ܯS SnAHxۗΪ+a/[Ko>0aVuDp'lAs' "m!T .F]~4͏.~?ǴB&"$x̸[ȎnII5i$aGZ9!TR>V :lNTu'AP %s^JH[zkFGV*tf+pJ_ YJWnLAknEhv+,T)I9Hr?IgXe'/<%ڇZɌ 6*̪AyW돇vEBz 큉knZjw 5h:qŷJewex&+;o T_3}y͞ !Pe+k2^рcبgZ#$z͒Y eFfRqto@(?lK0zaiσ~d[T+wo>$Ff2`ssa Ï|5}矆(Pi!s3"RĢ(/N/~ZpXB+ d:,Ii"%W uqv˰g$wtHװd&ԹH$pq.ET"H, !m6 UMJyXU=% ? bfwGi={:Wb沐Yz+X5*yߦYJZC@UYذnטҡaQ¬}ﲇY=,CǙӭa Ƈ5Yga۵*swU 9} ̸N%p8Z{߉;w.URKno <8[`=0oK45u?MYB53 &_eΪMt(\{ π҂1Orќ4)e,sϡ~9Ϯ ~ng1b'vI"q+c#*GwS)}B\eTPBfjifϨQRc삥SM(QYOXQ?Al ˖*U>օ{AWX|PQ gZ}b9dg$ WƍtE`'0 bI&WRBSQR mdsRLtY4GB Hup[|HH&^6BD;5'FMphӑ!GWVNF@gk{4IřYgl&n"Xe\"cR?zeeP@H:Z=O`$ ]$ ="@'."G}B/g8򣁈6*|•$/flh(^+QRTM ʡ܅ތ^%ílɍ"G,DM:R_ݎ6~.BG9@[}~s<⍥lT-_M0{;L[GK)l% ž+䴌WO]~`xt+[j绸 פTm[ lQM6paK##r/lBrM4?8.fI$A*l 4Cas0y`>4u%2exsĴ\]aqةO޿+K5)ԍHqes7ѿI$.#9Fű=]ڌ=smROMk+A*Pm~:jL~Sϓ&=5ߡ)T(1cr+74T@("XRx$< M F|nH^b~7M?+g?GQQ?śnJV؍%`2YH!%K4_ɸ3iәf8 66(@|3KSVV=v{HG3ޢ$W"/TmLz!F- ~$UPSM\|X7; I3c5F#D'(" f^ldJAp2m-nBXhkMa1܅h-D @YԎa*-?"yӗDx$bIi3xg-X]MJ$?0L\KV.[~L`΋j$riX:1-(%#лJ)ӫԶ=EJP ;[k;q,#xϒFÉu%CvcoIJ`=qNKa.Wê|_ ާ~۽p!Lex6: u~8z0\"+΀^^;Xv$-=}fT/3D:m(4F+C}B%M+y%υz =Ju9$j.4!f(ڊF-81V9y&w@bɩ𩢢xC~U} k(ćW)V"Vsa~ zPf.h!]_ښ`醮cE쪾iÝVOA&o'G||$s  @V![ ҏWea.|V:EV8&x%w`KU0te"-}%&(yw6j3XM O1L^o o7 j!ðCu{a+=ƗMBp1 FFx2WG(c'5N !j)LNt ƆB.sSEC0݆c9з+!>Č ıR@"t*&q0>[eG^HP:P9L߀v:?sp(Z6<I4lT bi i;,I㱖v$1[5ʙMnΩ!r]~ !N\ ig$W\ fb wBK5N9z^y%"F"[`{{o0g"^}iŠ֛cOG)42,Ic3e#ԚN p¨8ٔ5—F<+_Б~<MA/VGu/}/ndw5rO'r,{Ķi{Fh`%Z> $6JobۉgJE47yސJ*'ϫmCltAtd OI-G7k%UR0D_-W(EGQ/|ԫte)U@J >j`UnoRE4d`-`7G#l_FPQ+4|=R)6جl&B:;(vh 9zc{Q˨C~6)5QQ+`\)T:@~Jz2(ޔd\L 9d$QoR6%S+<'Vi{b>zw}b{ M!g=XT 6;Ls%7Z!L 0m(j9 hxC% eńG9r6ju&C6W%RDPI $ .ɩ"1]`B_cz$!H'2FF$~Ʊ^"3}Z ~/WB;PIc!-6%Ecp/\]<CdRxJuX\=.VZ2ian;'f^E? '.x^8*rW +;9:)PWs\b$ @B'-‰  &+4d-TJ) 쵪L)VWLx ~ꍱ0UIK]-QLSB6_]{n\^S %OTJ/h:k$%I۪}##^_G%M`1pP# رzآ:Zi2Tb='W&∜ZM`{C^XܐĘpL B0jU QmxIz+D%mTzZ$+*[o44.W T`þQJGG87%@2fz&a\6 S5W >P0I-QIp CFB{趮j` Q%Rhj-ږlɳDZc;vRI8KI64iqzLlN<ʑmfQ"%R$%Hs w]% }w>7!a}A'qDEV%ň 4 s`]5m 桢}?x).!G5vґWgǼeؠ=sJ䦇1oy2h#b867z8su|վ, .=K^(q ^ĚAyELpcQD QHߗy+]|LC]%eRmbwYIFSYFC/BF]JAMeso Q< %Tԉc$d}>Ǝ3Oe=4XEuR)Pz|"Jj((XNq":uy/[,QϏ'}Ǻä> ,VU,)lsvx6VlڧnB33dQpeE:yBfIiu9 _}]>i!xz2Pa9WلN1%m)6W{_v2bjR#iܾg PT`eX(qD9*L{h0':`leePD`byzk2Л IeUP:P( !;V+X(aE],_s6#Ӥ`B!6,sGC[ >J"{C8ES%g2p~L(P턥͐d!0;6|q.H+G8 џW)4KJ5dqeڤAVɳ|>NfȀc^P0"Ւ#q2 dRռƌoROsDfhߌFIbv,cMn gnFep赡3 <:d{1aR]c8{0sCEإOO|g*E .m7='S(lǏҵPKJkn(}"#B݂w?y>Hx{8$Q5EU>;"5&+@p&kvv~puϔ =~q[;kLڦdBTվI -c.R2K .MHhP͋4(e *` 闘M X^g f " S8òؘA}5zn#WpCn"SW`_A*rBŹ- 2F/Ck(9"GłCfTlp^[S$s <%Gy%W[%ARt~ԭ:]"O iDʉ]\],bq3*[g-]ZfOcgjBL%fxHj]A/0$vf]e9lv(`~Cd:$폍 =uuzhR z FG"`QB*+5PzJVQkx:-W h7Fs9:&L:i ̫qv*A>#DeI(@Iqрh)AM2\.E`&{LW!dBD}Jn1u=M^T848HއVETյ7EeV~]>y{>}z4-/# %UӒPsѤjzV> Yp (tuhG,{>ʂy81/o >Mχ,/c=*Ǚjq AnǔhlNԣFYJ}$؞\PoidhraR: ^t\&Ձ&ޗ #R, 09=|][QPo2V"0+bq"Ȇ NGu3JB#"A2:T."XM%>4U ?ԇ#蓬\W#DcB fX4PZszMVΨ!Rd_.NÔnzNގKm]:[uEעO[ڥ>`H:~9}q<&C} J=-&CX}t$ - \QÏtG'x-U^}oR,ArpyޭYT)s"346^y ~䈃^6S'[Q c̄rv >F/OUri_540 ;(WBz*ցO/ c@5@Fy 8,Ė{LIx =;j`>scKH'y U§A{oh+olsئ`l !3<ž??m>0Qi$<|E#=^==~%?'} ILYU|8Ns: &wfh4^JȘ0fOCgzU 'Y/:'8v5}jFSGαxI3},ICJˈ>R7~V9.RAؓK͵װbcP3I+]|e~ |?E/ŨMW|G7С>8wHP+GJ&KL,$|d|K"YXp1 ?AI+)>qWAAN2d f#`8f hjZP AŮY"G8iJA&s BTwR |asl"*s}Q%RļrIdop L,b>j|=wN;<=PC k; iR{CT&fQ'?#)PeU굦\:)G$}1;q!ޤsZ2Lo2$OћQ_c1)E@9fXf`slu.Óܾa e&ԛJЅIׁ]CnW{W@iNor*zJX$pv/ۘg}if!6d[T W P&.<wzVuI/ ]12:ZA`-dg$i؅v[80V4#jνG6,H{H@YTr:H(fzɏuh%pΊ@ݫ1GYjk1+JJ(A}kƎj+r "94nY> AQ޺P2UeF" aҕ,} /IBE݂܃}s)Q]pa;OF EvB93Cz;}`N٭]" 6GΩf mGry'43[Hf1O; /M3V!uCQBL FM;`IsY:2~sI͚fy8a?r\3e 1\C 2f]CB%َ4&1 q$85K^k C1-=Y Վ76˟S~Cmm=K55ltSqFYcV0^hwZ9qz |෯"1x9N?W*?_Hg 7mQI7D`06=W:,b-8tm$ JX돱ie¸KiH aJׯ0t|[௟7Rgx̔^m;mx0+9 [;1y$ݹkF)݌p}vjl9vjEzsK1/z٘G|Nx|^AUzx]>>@/=]fCuߋz_5bꎁd7ГSu΅3"`%͘cd TaMCpҫ(\ G õr 19d R"C!9p+r3JL:(;GB8f5@x fBT6PfAP$)yVi2M(%,3dpV%f*lִF!sx%M%^[T.OfL/AU nly,n,CRyDHDpD3ꫡ֢D4lL70fАֈ; h]`a$-GrLԘ\sJ \}A3.#V .h/l ٬)Jo8[=nY t}pe81J+D.3x} .k`X=Qoǫkkŕn{?!=aK} -6Oa-Gz^\FS([$lHѩ 1Yp+&L@QF*P(6{[{gǡf_+0DZ/)ӊaNN9gVIW#*u~k-|n{-ip^1xU 2z"g0Ԉ)<P|3 Mʢ]?7]  ]@2=AWV`?c`tZjm0_(q%zaZWC% OrEHz$IlH!^u!F:V!72wVs[~/SLeQ$ū較6 +ɴnzKI8 c5)!/ݎ6AM>[ί>@Wi~ ?ԫ~nՀORx 96< _aP ;IzÃtt JYmVmjPUc 쬁/ht4A .;4]yK7EK.F%*,3L۠lڨdh*I\;ꋑ{zczc~>&= @m.Q}څI& %x$)-oEaD&w !>:`fB pvVEPL1~wU#߂d}{]nRTm$)&U*D&d#X-`5`!D" btxQ)6"B ,wR‰Oz΄B&|?AQf"$ <'Zq遐Q&Ukm:TdA)$ X*LUhGɪ^5J^V._&7DX˘ÉVs,JQ{|eTu]Xʮ9ᄆVTuǎl%@4F ir&> ͥCb5H{Y*,n_p7uڨoROҟpԻPEBqk%nތdX4"r˴AfZU7o=-}8U-8T#9`[XQҿP"z8M쯫\/o&?TVxGXuaӋ]*G f([ {# m bp#e+&LxZP6D [ݏwAYBe vC{ICf:+cNTCWˤvxkbRH}Sg_WYe@w9^h{<ԏg|WkSVuEBPjAe=LyXI##8Wq!F G{ۥxn)s=wAuǁ&UmW x_h181qrFir&RWC$~G݌bvb1?]>RwWpWM(s,kZt~ W< JAaj"жaWS jHH cwQR3<:j4bC$C02T"3c;ly0Gb##Ě$#vHGkeсjx\fSqI?<-inUlg`{}^Fw`Gy.I&%DEtk;B=wC'p$l.zN׭uꠗy.&_tF}-K<|ywo׌|\P/m)TYpUTƝoe'h Y :%2Jsy$?%T4^a&lB7@sTʪ SЏ O㎾Dipф%;fAb]qv|BJʨ4$R 5P[D$aC{+#1*y1^4@]|hAؘ .̠ |P2#'N3x̦YVѤ701 }_=o=#֣ʙGh:qZCq2]Sгe+k-ݔ3N$Gw^!:%`YcQُy'AP4P(g΂?qJ;QyU&c=ęR] ժ&wc 9[Dixo "| Γm)Xq'[Ŗoݺ[>WtN"*p$u07 T(߇aGRi0d!?cj\ັ<כ(b"pz0yy'~p^-p,a aabCtRƞm)H&q[%r+l[ؾ^xN[T?_F"pÙmA;O#CPy:҆ẅ. 8Sl{/ i/~avi4jkEtA.Mx~JBu `l5Y:5Rg񘶊wÒ$Qoͻ07&5c;||S !^{|EXOsT+*G& {&`'h06Par7{Yߎۂ#Bnz;Ը0Dv`O9a[Fs Rdo>#aQk!m{+<ċ&b 8{a4L5a`P#[%svA V"hhgDĒv0BQ/9%Æ.F.b 7jc^ޏ BI b'k%B^ٺx<JȰ>x>ׯ?h>/1y6@Y{tg|gRXFUtp(Ys0ƞ<4) n-_ g9 >w{ΟBl-\H9j IPDgnFV͈e :b61&%ʧ_zf1'P--'BuN%m koA4Β5-]0n`}j@ "Cz.1ux_zM+b&cDTj;K7;Fȉ*QLMUhЕ0jl (_Zʕ*D%g U;n. R.r2TDnFMzAx`K&U.zZVfyխi]5\vb&o?Y^_AnesAdEdBfa,1$'YM;3S08 *|' &.-+¯!'Ry`ɥҲ8d7[7/Z;t@HGQ~쫵 ΙR|$ G:p" .JZI|n cĎK*U8з|\V EPWn2X iDAU3FɥYz$0)(*:cU 4Dk#>;FkIΖJa{ג-2 Қ'zT\/*A\p_(R@Qe:¹XQXWD"6]w_q zղŏã)_S/&Pzl3^(Ez;ǵE Pau'vjed:\%KSĠ-FtFY^ ?b0Tj8E$0m -C\/&Ӣ T kžU 8^kmCoU!"/y7A5$vՊ\w'M@ v%O 'O^H7p!j8J-f)r{RjZbg-onM"Ή~77ɛ/ B:E_>+ ȘދGYBĥP6v E2\1#:UvNLXeFv9{pd׈jz@>,e;-i@rzC/ s2G7v%Ņn(|ӷopvH )1"pv:׿ESY58^]QO[ vl-p$AQ_-UU,K6w"Dzs=շ r:^Oq19 f${+\:TyI'nncn23,Kͧ/f؃ׯ7coD} <|tykrr]"׭ǐ'3ICތw>7>nqP>8&1-&knB2R<;SDDůޢRE<rKFKJIg =E'D]}kG2nzu9"+yC%G \*JFQ G]މ9OCTX;%=\\.6LEs_K(8W%J d2 [L=Pr090,llZh- b1HQ>lK^kԙr<>ZK}ٵYNd=/^lfsxI84{N+C03,r:PT*FKSly`(\rv>a;"{d+ZV@7[T ΰ@,W'Mzadݒ!Xk|-`l\/MR =Hpd5#Tٱ$7 \Վ;/4_2sJ s}#k׿B286=̠0 >7.Z*IkUk#KlPC^(.="I^SE)BxOJr:$yK1Vt+Vt^pّm}t-X@EjۀOܖzTDh#/HI-Kixa)(t+P0XH o ay_wӡ4rFo홭} JlxSfe Q e6e0)w vpe|L1>^oGp3'b ,oJ;X~Ǒwlpxn4J؟mQ ~]l0$?bkYEwƮ)vX wJ5#EQ|m`&z06MG4MXǵِܟ"}3x avN&iwhHd) P:AU!x ޸*F/y.9UxK_!zrP/wȋ YQoDy7$ӫӠtM laLC0::FaoUڝޣi6 TF67301DUd誆Ou®O9}\aftJ\QjDmv槇BpaB{Su{Fwoj/pC>=} rÕgخy!1}DeʉT2k63*e>Gg;:K 'wA͐ u0Vj VaF<кtiaĻTz0.Sk^dIfU݁fx".q2bSEsudZLM,]ұ9 d'# k]T>f r$9?ļIrP:,RPKؼdgAZ%k9J2",圠3pzQ-)ӟd? P -EmNvDa{8_INC+/;iYm%(C<5)MFf-:HPxθ1o*B ^~f`\>ѓhEq;&\F=}z5.4kaTNtH1jg-E9IQzh z-QˆEU}G,JA~lRcp v hw?<|[ER5ދ3~ ӟFs.wP Mrx6: y2*avwBfLHPo/Խ:rDqySy#I.[{Qq$|olo%Ϸq8=FI=7ZK}BJum9Ás[-JWwq=-$򧔸]\(]EA]϶`P- n DFboF&uJ>ءZr*+Pm+|@Mb]߸`8]mPMEB&M1ĸt|_'x xFcrp'32k+pnqra_vw:϶ .Rn[UO-h))U݁@1Ri֢e^a%̤%P"\Lh~x",¦=HE?~5pQn#=wã 3 ᚗ_x]?'_x;< 'ټN>!IRQc?, e0Mog~b$xSI;ND .4B#MJ wȹ&cMt7,t<'cf|dR7ۀbTQJˁtwd&"+]#_ů?Qs^ ˼g mWQ4e5\'kqO"k}G!8"LV(ָ=Q9ggyzTJ1:j|PHFm d "<-%՘f1M &矘q$NA97=,{hkj|X:6& 4Ahm~W)egy ڙ)_x&vz̙i%yeqM'em֧I Y)`ȵ—88"TW mt"$h.aj0{S݃hfvyAd 9UcTA UH,?k ~XT̢d/\ߗ! 5㊟ b[m:e_]jbm jGv!e,*aiiAKĮ\rz8Q/o֞[^ п@InPAl38272;+_`j`CD~aK ÊexAD(kE}uh u7" .x@dgsYFDW% = fxm&;:j+b/`(u <^0XRv+,ah@؅%mAţ#ijOބ݋ Vl8{dbi[UBxJ뱰Ndh:BvvKG^>s4m9&nҏys˦'`jAq&#W&P6D DLx EH6N_iYK\g.0q뮇oʦ%2+_.ovv-X Gul~}/;1ak;+nfp]Kaz^e\C&>οfk@Ճ<{†o,ry{.P{{5[h5P/=O.VqqQ0 XNRHw@nErvf|uJG*b6yI *u`!-X}p6q >K8,-0e(s0K1ևN%s0+o\r*q=v 2 9r~ | (.T0f𓕕.OyܤIE!=3 Q,k[\՚]v"br+D.sKIl]$?տ~|5Ev(=n&ɷDh@~Bѡ~d֛>f ]|(Ҁ!!F8 dX܎3& 9hVR>ǵՊ(StO "! %ᖢ4vwx ?RpCNL6X=@?4ma0p;N65cb*z(qpԻZJ~FJCSvkAݳ`ٱ)XruK>[;IzG@fY:f8E0 {M7>- 6Q![咡PU1 Az !t :Nj5x3W 5o؇/ɛF?1_AFƐϒ ۂ9w\8ZHlFd;Ԉ| To`7U`aUMۙH 5mu4 Ft39}AJZqIWD{â-e=@hÁ3nVڋG$]մI:JLFG4ǹztE,SEc\Y WYBZe& Ct*iRÜ;a>-iNP8b}SIpn49Vdqq_-8Ay !03 ]bj180ͽs-}PQA?D΃jZJBɬ (32,+jm%΀C5CᒋK7 a3fD&+V)y7 :N ON!6AWepPL!?NL2pT&anQ6fj˭,f5ٲTef3 ,U|#nڍ];i\{AE OF$zX,(`nH:nw +J+4fgcnG;-EcQQ3XFն+< >a!$x·$G7 2[`8Cqh;01 ` 7HW36+->N:c%BmXa`槬2]]`AǕmF#)_-x9ၵ$V_Uz(8sӏ3d:6HdEj@`pn#L(Ո|#嫏^ez؀3Om \XA8׍~T_w 3jYơxe㡶7ۺ|3/!ԫ[gJIr`w@!K9C\2Ю]l+=:vRn8Ͱ۔hYܐ_Vh+zt\io5^DHiJܔfDm*DgUo6gBޮ8;Wxzjl03˂#ܙ'HicgWH+ܡ_'}2 L_ɛY@9Cu{<9lRԵN[iNCD2+֘3( ѢnrY \3)i⺹JS 0ӏR,bO!D.h[ jK5Hie1d ^3J09}qɊUsDzhlQQ#*h3Ea%,nmbr@ GS9%ME]"ULE69-ZMiM: 1< 3P~尴FwѤƒ4BA4E)Ty`7I蟂BEPU-5L()X8;-JFdc۸i&61Ð[>~Ʌ%h2z֨%RUPJ^}EcrLf,͹S5[YF_%jnm 㨢D8?];[”6fl*F>%b\E\"[\kNf]E7E ^FO_\/$5XPҊ[$srFmoxX|/UOp]:a4 pF (cgd%8eCLGA2уtj*lg3HK {&k[;r,[E$fjR$ `I!=?YGk/ 7*p;vzYIey/ 3 Ar^!7x?⏏!+CM߉f8HnFoy[(@P-G)mI~L%j(Ji)pt[hq*k,jY6f0ڥ(E{ym_(; G%RD$^P?p^5 x>x%&= m^"ۊf韙SoxQ&zYJVmXS~xdGOtۯ6'u#ҼnUO=!D'eO"حR@4 \Zx D6BjRK=0Yހ.o~ZGepoVU04 V'~EmeiP!}4(##gwܧfW2ò>>tBGX[ s`axko/bŅ|,,w ֞q||8aj*'T 6SCYgv r΁1iƱgc٩J(~9KEJGed7`2("'&.",[R"bcip#tB,·qmf+ שd4cG.N4wWU UY8 2P+ .3la1Xl!>1r<ƀ\,?#v(3b OB7Njo.dGkl6zi%>!M#zRԙ3-4if ~Oɫ>ֻ|򶑿W.VB%|V=`Ⱦ@'J`scXD:hP.C F)9Re8 hiA2V zJy8RüYLecasoi0.SXntX)u+]8;@^5>"Bd/cYfƵl֡%u=~(t!r3ˉ H֫759V JI~.aD;))ceGa-ϓ'iFK]v9#[7 0k6~#pIv(vWʯfgtve5!{I_%)[ 0$, :2g5x;4;Pvd+b> vpb9Wz0Ց7&K˧YPa׽Ea' ҷ~3tFIsDnuI0= .wF2jI(04x=\3|lSQL ܃gs?k>lzG &ܑE!]=<P=*Sxp˧4Xcm\+Rwɕj_>\}2L&6CBB { .Tj[vmZkںU[-ZA+& ,0!eL22{|Àp߈9ws=>^(Nz{уv{7k,a5Kv<+^fzNhb1:>df~[=}?DyLKI1$%kjvROiܩv6x:aAy AH3G0Cc)Dť>5\} H:aNUh^2O&a}㑇{WFtPO2x¿W|x'p64u={Q0v*=JhIpR/]4fcwҧWN\;gzK2}!\8Q^e0eɟu9ԛ9 TKLA8]o>0R1>7UM? w^0KBܧ ?rrU($x08./#5@ la):c,]q#c;DHďlO䚐Efڍxwf„]F~:j4$`(̛lа G0p@b񜿗 |IRIR3c59TFnRZuLT"6 h٠b>U>n|䜣).&WGհ}RF >"AhʈQ#'o1Frr,Wf#߭>puTn'cԿ}(EMKoEV<@EGK]O7)_PGyL&I;+UDY ? IPt3A%q@~0@£qks} :bIUE^!jK񸤕),v aX " Ҏ&=`:V+)bݗ|l̫Zn9{g=%&yko#G_H&ٻGKY»cvƭqbzʱ]z{_BL/m)DjIbK uS`r~ q  x٪ + 2(nvMbp}6KHNpZQIWD* Nl"AC5b_PO-p{HR nlM;!4J]s֋ 7 "[@䕆E.>9KfGdEorYQF1or}uGtd.v+6 \`8ZC3oTb=(XAcQ6?4z;3/]ucwyEУ8 fAjJQ?tLQ({{ H@F}:0emPu,QZ;ō9HLQCǨ3$:}QSaa_8aHK~#@1U {qoL1y3< F6_V8PC+?1Y3|<Vj RiEudy5lnq^wa{`~iwԮHu6K~+B"4E}Вщq]Cώl=:7 u-߆ ~Es@Lg#|X Bg/P~oY8M ZS:%0_/vFpB-⋵L%y#VYhѠV\k<^1{;Ur+1,+Űe>!6}~B{]L+^LjV+d 81 {4T'̹4Ud ՐnDR0, dFy<(vZw){Hд \#2 5~ks=rhㄡ"E:LGųBSA)Ǎ2ДMD:%B-K-^^1 )xGދ#qՇ>h"3 h/msz1tXFH;xF)[i@H3Ph%_?`N UԾ}aky*&WwE }E**{@ ¬)4VI)U驰v?wޗUAR5±;?Ӻ{pWXCpڌKi /J8O$SD.ʗj^f ^M,)Y"lS׮<PeMxq1&>A_ ٳ". M^rHDr+$> ; b)[n: X\jujF ́cK_ ,wٷ߷ݯؙcvaS3aTfI!嵀Cm_V:&o+V"ki/x0-ċc)_%z]`N7JB۾^墶,"8~@Gif'c>[Kݥ$n#oF.kHp=1lɋ&p#p#u$1)Y8ƕ HK@g%:kv*epHuAhϷV(׃ys3^ Dž99);+JjUWi:T?!\TYFNJ?2臬z"ԭFzu (;HwL\=TU䂬-B7'oMѵi˱+O-݃2vLCK Huszy iSQ뤇4R1p:i\Z遖yL$ii85pP=BP/a>*}K8ĞEkost_ FGTAO 2W*ԾKY6W>l>1(<ɆK+qFgp9q̬w}P_ -z8/KAɖe Wt EA@'| !rrW+Άȋ AvPPߠ3p=d'L|"!*=#|%-Coa!umh@wU<#8AN$ 7'c4GO(9z3BX` ,Ta`rnsreˉd0С:( !79&XɃ*Ů,xy "<A! aq|G@a T2hAq򲐣By ܊O&, &|d#[fU34ώG?]]>\ B+cPi u2@fDx -!XV.dPq܍P좌.ʞٝ S̝5uB /RvgS+Pp;u|08*GeP>㝢( MF+ef²B$zۀ 5وefxHG?^ডz1zvH(C_`=[`zݍ/gƕ74 lR-IVk*VI0Q/rSo]Ôf_)|_b:Ր??c]%Cj Mkҹ_,կҿi#+砡v$9=Rrq5g$,$B=@WG*p$1*nJ>G.Yp+\[dhq 70ЋNrRrglB-J7f@ӎ n4!szPQͰUח׋'X#2L|դZ;_xفY h  .weI,7viքr=ɫAbjgV=Jt:G`5 iჾ6|)CN6, ˇґqi)H_j,`,EoAL1|a \G8Հi*eў4X+DhS^K`^Gl0u{#le&nR1H^vbg 0 S6OLR\Iq"0Mބӛᥩ;vm_oW]?\w5,@CtRCJPy :b빴"_܈vIN^!n1ctX4"|2cr']y#)`MqdቜLApsS[ o6n0]4"w`t5\[7+8vOrtFN !Df6 J8!,ħt%I78D°EMKB)66um'!4[-Of!r BzI"!9ft),=C%\QLb4vn (d\d(ڎq]RB 60C>{Fdf\ĩ;@=!QbYR"W؄}KdzsC\w"+l6TU9njݓ $}Y;wݖH|DN,d#PC'_@ԕ@eDS-vkUK} 4g pI+# v2֠pg4?o0ͳ:#7#˨u>F6@&'ѲK8A΢p~ fdFhH> AʍF.oo~Q]4x_^zˤU0u!#@UA?#)_(]Z'x؄0P>^ׇ)?]bx}b]7at@y՘Ad7xG1҃o$H~[Ń98%gD2ɨeoXG XO 2/ԛah fsKCj-W#z\R`-=hhH=қlMg >*/j),=B1H~=s:ט(a|$dGJtW^ ZQEfLck28^-)`|.[t%pHt#^5_O 饫 Qš0!IB X)8Ht`Taҽ-}L[# \fGr^: D:A<$l7/)J`LD p CxT,S&?80"r 00Mۀ0:;%#薡5Q'ĝJSK6@>Ǟ>2:(n.\94tF|W75l8s~@6M=Ңmc|܅WW'j[2Aek?TlᄧG&a"C'b`gAW[7k_i܊ꀝD {ͅ# 7 2ORI $ć~.A2 ]GlM&iy0r>^˅FAB?W@VCYmTTa\ݱ2xO).<˭B'9tYʒL"md^\0 ;ؑSfM0}-ToFZ:)ut/ B;AT)8-kD}Jm`wl uKl] 6!a>TYL6nؚc36nx2xV2~$ }w6ɿD؀$$;'$ڢPU$h\q]mq5_=ҳiU :#Vt.E : @ M$C=Pn_tM-z  ֖pvAbGhzҥ]#)/NȯQHPL޺a2 Ҡo_sP +IO~G<~*l5 FoFFw'7gwehkD:㣍0|="0r2]fsAݾDU{d!'bO5M_Ec::\[0e(४@㶌[wq_:(n$b[Z >X/CaUz/pσ[Pa,  ۍ$r8=IYi7xXlH?8t8@% K ln4XcJE,RZm:eha>)LԊȘ(0}"=U+,ע8%OE\L`T\S!t"5J %x i `k|/.Rq}L Ԫ͌dz/4@*@[+(pإBp:;dU  Zhîf nPACSN=6驨cikG"V]rJkSA1蠉Be IJ3\kB^? hs3aDFj,IzcBgr2 S:M~hSazgAo˭ }3> 힘Ny'XПJy%saز%,+SVHeU HM3-WՈE~nuk i+K1i`Gl!Mup0jXDKxH?p[rZ%~NZ16ЋVr`-" &1(O/ `*4 c L>Y I6}TPΫΥCҜt0h)P)} ( bhiD"NNnR\'恮R {+.+`鬹b+$ٍ%Ա-"-\ZgV8ޟ#%lt_ulhlcKߨ edF/Ba,oT$; etУ2#nwe/!bq 5*cz:F˧Tsh#NE厯2B~3iz*-{VBEa%l~{Z[+pf)NI,"Y](ɡohͿ ΎlxS1?]VЁ4MLn䃻kP h<{eK ߁Qȩ>y|!6+!a`֥0/qw\(nΓ)r/^0W.B[xH5Nޭj3|">`y1RLWӦ Msހ*x0۠8Ǫ0 Ӄl0gŀi8 =>4CB:yRHx#Ƹ3'wٸ2p $5:$8`l~` "!8x{$MCdA;=p"r! ix" PK]=xT*deBH EY!օj//a0H 5ဋYEp*:rdrriqL [b/%eEJ 8cx(dTdcVZ@!4]xC?t@gP$M9FMOq6~ A zBZat*+)1`Ջ!Dv<<4۞>k#՛o:h8ؕ m{v`&R &Tf+("CdNmxqp 0$@ wq(myv ʮ})xH/ : Jy蟰\$OxG|hZ`V†yWHq-CxedHst^ΑհWIDi\d\&k?6~|IIX.?aϙ;65M9-r qED$ƨюSy~1f#QRJF6ׄUS@^Kը:`?߉c6EDܐśi.6DewCdtx.F3`t _B+q _]bAp\ ~JY7AȮrC+)0@ar<6ty`- Jİh.z(v beЍs$5voiz haN$>C1\ Fmox3JlmvpXdfem՗T-=z# !u*!bIZ%sc"CL2B)JdrvA/MWeڠ(K 'j!:,&jPQhTeŕ ZDERS>2K`_9:m7 bj\)@9?R5&T%Q"*ȣ8p$;Cp^w WbM{n~w69BT B!Cdx];Āp86F (ҦX:su߆|ۇuAQ`O9U=n=;(, cUb 2LE>^ DH&;p"* @ 2m9pH# @-'Bb<D#lF:$fLJAU.[T`O ijBkܯfAq֪>dôDҌD1NW^$Lw޷@:yPI5fᜲμVH XM$J.'="H+Υ/HÖ-Zx~:Wӗ}YtgصP8 c :cud t;Ĭ2A=fkbxS:<p/C{WWAS0O\͕B 6#] U$aHܛe|M8ԡi.$ݩ-G頻dfF6]rv$b6~MiA:EQj>1yFXYDgFM&%w֤[-yB֗zsnLnɓn>qRQˠWD #Ϯn"YlEdl${ yLpkz$U! ˆo!t葯}5`' ^Gbt&m֍us1Vf ~ KQ%Gpc.a &p|n塖'j$mk31]= n38N8; NEm}.y~xH3q CS笛ҡ߂+ Ps-w٢$/[qϙ*zq9 .V ⁖.2pEY)EjC }^U:m}RJ,J$.KElTD3`IL2q+,aR!ŧ\88ΧenGҡꢈn>ҍJP2A*E ]\0)XH"/tAN􊃔iA0C ? !.l>D݈Gˆ A |r1Ph mF,zO- $I,~:zl\#)4"2f? &lF^돣rsY +rQ1FPAG O4 o̺``Pҝ\ qPkʎ0=CR եUY-9:?n+U9ЏM"雊ڪS`X%L@."*7^{dp: qWtdQJ.JQӏxS3"` $5C3fF >`cT G0m'39x6֞}־|5h >r"a9%Xj+Nb9ԫCVoDdZb,.ʹ6{ƾF08- dl@5X")FhJSR#lnU F+^5Te1Dž"@N,# )xxg mP= χ"\1wQyq6|o=jBs%T#_db5a}{t2(ObA{3Neo9o+z5|$lYCoS⦲Nxf\yY\X(6ˋoȱA쭩k M6%E- EC8E Wgp`v<)l2CW)T\ @nbkY,t2Зt0ҵ=ՃOtFVyn k`8_k:k *BFZu۷95"Tkd*,[aA*߀v8<{g &o_{l"U.x-Xڦ3!W?*`BRN7BpzmoF{`X l5u UtR7q'dW:  T`%N?닞_ 1ԛgc͍H:.aaYGO;$Mq0zٰ~41#YxZ~[Z \V)CEReXfPRu9],(f{/E L:)p-ï_~R^B78yXŎ|LTf[f"Fo c#&Y;dW]S6@!a.^c \8<[6vH&I uN0V#OB p_N `n:T3Ƴ'Ev YoVڮ1wM R#}ip>-!,J(F]'2ܴa7cG nq31v\B!:*M8-A&z_q'bxE2En_#p sPA g ~x.M{/} ;ac f-̉Rfh:N<)MGׄ0P a>pψr.^\yy$'y 紵'}vz׾ߴ|ݺy#zqZtIjDA6q#^e 89έ^FjUP-rZ¯%'IҨdv6 I2K@U*#&֢߹jM7DS _{͝.7`xmw=xs;҇Բw!G rսVhs[NOg P?DO\@lګt.{> WSE`pdFSpov}n]ːO tI/bӲ m4^Ga)oԛ{o3Y]סAoyzLXtd9a#"^f#M!e6 kFQE\zHPYm oaԵ!eMrI%)#ND"e,xTJZn`G@V/\ 肎j-Cܭg֨r$%ԛ )Ñ85꣥m۹YT.F8%hu$IvR?Ŝ\+ 7TtO!F8PSSr8|9^{mҥ꣸HK2}!F 5۩ϝ'r^e^\>r Ӧ=p5 Fs#4|1(vNY(݊8ɂ}vk F*%YnQ>bkd %%bY'">= n\L^ W9 J\499n+lnPbQ]ӜN|9>*I[ ZYgxvzۏIDAT_]},_X݉m78aX𭝏NQyP5SOpX}pXb`. qȐMs ԛ+)R@gQ!v9P2^d-t5#>#m$ˣJsma(]awz\Q΁y8B-md^Ʊl.iM*8ӥjtMh jN€/ɬmG$ѥAi X]Fe={..sZQ?=-_ _.Vr^>N~)gΟyw],aLb`lV XMkqC *ƚ$?`,'[MĮUhVl2`B@h' ă&y$ 6i3OB*à (0EbaR 针m:3 i6̝,FxA%`Z n|z.| ?vOmb84\ߨ޿uڊg ïfTFVBBL̢̇ݓ1b<n"@Y-N"̪">amsM/{-7o%q>pCt`:)>)gOwFP$R-cR)HJ`$!]>-1(`.OpAd#*)iO1R__sΦ ܽK2}kr+)'e v_X\}(>r_]N x_OH+CW?2gYň+L j )0xi؂k}dgIV)i< " K\xn f1yMz?&W>z:U5,])>[aJ T,'@E\QzԴ:~oC GSȑ_m2ذAS'eO߂9~Z~9ڏfx ;?%ix&6N |"їPanStpYֶ)0(uz? !/8P_q&uZ164&1FknJxF:3.e@/BSj(Yf-8u.\sx??zGJufLsY]lsi˧?O|~<$ϾQs)ap,ܭ١b Tʃ4*Pp\`[%`DV?;4(%[ 6PaGmW;$]n v'l@ `%זN5[`vrA(r N٫\?_qaٙyVAd7ti}+aΘƽ7q}xOAl|?IZ*Ɣ8L6[ -)LEki7뢎1ԫJCyn0kC.cݏ>zU ̄.%N,줒"3wTVPGy7jY|P|ϦJ7^fd=&10@ICJe ˱n+۬N ,- z 1gN\j0 lOkj9ex؝kcO) v]& 3߂+_~5AT퐺$` =2j!ycGuN]<Y'@}QrUv_%V: 3ܻDZqce{Ulyp:555FO㽸\\>zcy5h +D^p';~7yQ9ϲ\,[Ӟ٣SнIOvg!<pŋ}oMNsڅ`5( jxV턂=0f PK?iJH+|| ZD"Bey:f1/5,#~1I-T$sq; Ec$̧.$3jb2C c/t[uQF:"qU|Uvwa4 =hDqb422pqOSITѻ00W.U~aI7Ÿ'*N pW;R"۽KO- nAj|ۋ~M<3#?4oe?1"Qd;s OgE7`"!6TF",bxQ /;tA$邿#ž{2p#<$W9s C ZuoUU#wwv?K0!_o[ ?r? >nmv-O"{"ϒ$5 <Ũj n8.XPԛTw>ְX.h{CO}.i?Y,"OWgy!^lE诟~(Գ-s P^Fҋ28ZgG>n.PNؗnp[Lc!j\nOMÑIA?mUpf!rW%kP,l%x\ S` `g|eF)7wRxKoW*1xJ( ݑl~t^CcHJ25m\ ջa/P {l˦Ű):0xUȷƅߖkw3P \E^޿dO?7>8~Vt-a?b\"U}A;3 F3 \7ٹ pdI&qQRvr♅.6`'a\/lj8~|[ D |=C0}MLR,p봅0+5+VZ2< E~vR+ ($=J3$yybf*~Q2NHŒx4>-:WCge2nZ9+jޭl}!Eegj':_)gei;"[ᩧ*a D1N8E2)"t% Ըp E!#@l%3~+&RyQ\2V vt*|42l (笜%0MCEP+`Đ͔U6(81lV S cr[+߄EkP' x??M!Oyhmg@QHUt85u7XO#'?\ːjjw&~g)?liѝ&|/RT@4>ϐ_8x pTyB>DUecɓN'Yq) /+^Ӏ:ggA=~r@J _WsD6̸f+ Z|~Wr.3I%ewfaqElM *F'4\5O素O-; L7";|1E'EQ Tg!cz#x;B!\K2}!v > {{D>?/=%S޳Tvϝ%zgiapF,7)r#$;t҉7= D!! &L/g\8ωQ,Ł;KVk"!tYV# 0OdB%җdդL2uQȵ'M6M&L2AA @@oiwwܠ~fxi4Hޖ|~ΕPEet<^<dIšQ/ˀ^G|g3.t"yRc[aU\>u*q&m6C]~(NBF?I柶ã1nj|ͯwO&R M,8HO͉vyQeN WPշb~mwpIAMI5_Y+b?Tl۩ͤX랣[W`}+L9R"»iGULSqI}ɓVR_!^WkH$=!rj& 6+jŮ##=2kyP~Rۂmm..%>j}5۲./_4=~:wh$I@iu6whD8Coa><#{F);|s=s:)/M_9U&l,(əNu|Z6_8S?E2JK[fE͓JTgُ\4|)> '!3 {x ;> uO/Î E۵<cVï%zJU𕙫aZP/Cc_;P\N#t\Jeɟ?l}xk@yC] W]EDJ0Y*Fؚ.RN<<+~ {7?G:ysw /+K]# V"X8U'x@q/LdqVlvn>3V8V"u0m Gj0m?.LFn?!986AB2RG8u4F K_*F!mrAŬMdٍUQG΀n k{[f_&{~}:9nCvQp^-ɨZ 8~~f=p9W{F~QǁiA٠/~2Dk|gg‰eB7)7zcv%EAZ(?D*D֞U|>CDϠwŰ"o_76ik oĿ%P/I6bm}Wx $ x xg XA7衿R^>{,~gೆ$H{|;Ah;Dr; OAG!i0|g>ļck!lo;wWӜVFp%uv4 87}ړe}~:ZNꤨNy%<̑J0&z2fBkJ_y PƮŘy-sY zy. je,Je=@ʤQ9lE[!s*1ݾ@2刼X^>۟kmbhF﫲t'\gl..znk8Q=D1#:e;g/~F>GȹN{Cc $< wWoҍk+mIpf`n. >wU" '>Z1-=cbp!мgCUF9v~u9ʪLVL ձQC.\D㡆m%PvgRxm l5aY q2C(Ŵu‹,ezocR Rbw.'#6v`WgJ50Gw j#1Y4YtH2l:s{{7 I} TڰyF5 Sw5<_RD؞&\VߤgY_Lի.G"F#o\HzvtNb%)s1Fm9XOܔ+8 D~ȮH9G}m ,tYMlM?Zfh2.\gEYn%Daz5a ^" ,i8 ݴMvW@JڵT`yC8 Sbe8U˟/$0s< ,YV]""KJ%&IIOҦI=)9rN$Ӟ$'iͭD$^"b+" e<Â~6f}wޙ3~sdW!Q/6mZ≷1m_QZˣw=2n·;9F.'V* |ץ}T Yg8\QEIj{SsSe/:b YAT4˕O$H: `c @uh1ͅ[3?~jRNg㼣?b?]G{߹&>k~q "~R^/!Rd.>3ڋ ᄤ"߱ &fdi]T*N/2%]IG$a,2I(RW~ R ?/W-38Jv#'¯ }ċY]9Wzӱk|vxulz ^{Ox ,o.|F̬ᮧ15ȦI|6kEVvLs&e0I2e4 $gHS0}Xl! >~꣫]T<\pSpeu$~f_{F̵<ռ6z|AOoĦ"糡(t$#䜧BPe}bw,u5,n _93% ɚ٭[0U%$p:f3!'(_logF;3t2N岀2 ¨E# m'<֫~B<^-`mٚ3!%0+'ry@v1Jފsp'-T:aA21v{e?9Yw`e^RQP/O굂ivG^Bu>g˩LyկEeKȯI)RԶp}#|_.ݭ 7{xKK.w&% XҰH xi8l;,{}܇&EbXiG/:bP>VܲS(]‚X$Gƃ̐D|<8b!c^ ZI?x)~Ը:;];kZa25yas0mUZ)H߬!-61]<|ƿ? =[nxw'3x;r=ҕjO.CODQRomJZ^ue.NX&ĥ"KȨoiJ;zNE-G4evllG= 7Ep g20 N/1vȸ |Mu*&Bq(|iښ.=y_l=m hXKx'IfsaG6znH7`4Ɇ6'}`D^i=趶:gq"Ä)p>;Y 5ޏѫVda@z+q`^נɳb9Z8PNocGOZwzYG6J yCk˵6bJdw Ι] I|֪K%N!S/zU϶Uj_z/Wpo6%IQ%ZJc-1Q-K8hJ-`2j[ m- r9>ym+w36C$8Xt ֶvz] .P2juzS)@1Eb?>m* `"cNjNr Hv( o+RQeO}Llؗ]l[[W\eXlV@ɬ;[cɐXo@C줬[sD&t <0P?u;6_#' vOA$ڐ}1)9^%gp?ŠڗfC{'eΫ{op4p#w6Fs1Ղ'>H|?[_S>8qt yi&}gĵO穷v"ޙy OfdQFd 'jkc6XW⥩i4t ȄB14X9`1e%&erӔ`eWW =ΨT6w*?A ^>EIdS{H#7*Q(:bx7 \ `:"a% uwwe6Z5 7 }V?_͟_V#VDa#n;OuRkYa1v0pdŰK}!|[/$~/㜁x-nq_lN gla7t&σ*1I3YPcDPEP /hF*=II>jY s2e۲F@C8k"_Fe/[ɘx?3lxގc$8Ҭ;P~(cc]g}s hC;p3h+wJ@);i@vrZ nc[)1PXwn-F~R{'E54vD &.~&"]yPc*1(YHv}iČ!rsag2nE \ DS wm~uRY0/; v>|IOęEF{I(  9]4B cVWTy aGeI3:" z'+^/ٻzu-|6 'Y\i^>ǫ?Oh|!½YzK1$Ye;}`ao !D7s!R?_Jv\&m6ܸm; O_Ba`Clxh<ـ/yPqm׻8Vʵ] q;"ԘКǽ'Y/N^HXvҿGtI$S%9"%n"/4xOj%,ph4-""I a3m`G1iYcr:硛tA\Ic; p EpKH8t_0}υ.COYQRmTjtթL/Zvɂlc tL`{ 8:2҂=l=ؔ<hbd"|>aK( FN .rZDA@#Xoa۷ A [ao$x`ҽ̝O?]NO_$> =LaľuđK}KjIS.vtӹ]sBôfMK`Lid7bDwzH]Ź^pӔϳ-}%vJIS6R ;roLtu8+? =*Jo*5,ԫS//ZUA]mWa:ZW2P*5`[zG`ğAN.Tm|+ڄnޕ>,@-ZZ_18 .݊m-Z-O5"@Hd 2u0Q('_yp"" 28hKh 8k`2DĎ~茍h KaW 6,6ĦqB~'pYW+ y;ffA i S[D., 7B\ CoFRn/X4/%ird=oEU$X >#9;0X.ĉR3=i.Chұ(Y3|faT'bԼ]+Ʉϲ=jXk쾥 Hz9F|iH:Bp$&)&)C S-<RWat}m|79˩RTܮ}δؘveː]M[JͧESN\rw^A<J4hS;PN%~Fcދ nfDO!o,)Hۛgx >yvo=$_/lY, e.E`Kb;' +1/ )4UP*$U`׃JZY^a@X?31nAz`"|4LCː*)J}Jt/zf P^%3rlBҍ'Nhm(FNIp;b4V<$#lvceS6$Ӗ4Ϗ8S/͟xJ!/a$FjDʹۓ_Fh ƽ[^ݡ,xuPfr?)||n9&"AdyP1Quy}9Ǹ;.fL af>ZȑQ<)ŭ)faap!w%0BNq0&c(RnE,HفQr\b`{12n|7**oβ*&[.CvpE%~öC/+[ޫzea~1mre-7k2?!o#֗ V_ea5 7RA #Y\S>Z,j ݼn~ms,' u9s<qՕCj!Xc7y̕oI3do Ф.V8Հ/k>_-u("a' 2<(8WCAF bU>0tĦ梀ü·iz\ݰ//)5P}SN2h |DZMU^3.Oxbu?Y<6s)¡ P,C"TM fHRߚ dD)Ondj{Q3a8wyfr#sKnn40v62dzʊzT}uթJe*aq>QƌƘ;&0a$ uV߯Sj<^} ]ȣ f/DD3"dch0}1a ^ ͝ڳ!x^SXXQԡN$xv7eWzHk8DfD]A!fGFXfPt0t%AO0w,Y(&!Y3c݄D#Rq>VtOsxM4R]>*&rQ}#c حªEo o,iP9rr`^%8kzg#uש6SY\ڜT4fb9bFh'B.]·8+f8,ԘV ]JS#Oi.y&IK^;F:r ډ-/Ԧ^p kYX_ے^qzWunr/zu%4^-t'kic]hG1EG)QL\SO{xvaf ! z]dญ*¦B(g# .u` O[;P,Oqsj$zQ̀n`n8O%d(|SRq$ fv uf*PjJ y4^a Roj. rՅ(jd!1 -x frqjecpMkk~\=vk`Ə^B/zU5qpeԛzu8kV䛵tGJ <91k%:|n3SRrCFtlv0ƅP zEeMEoD#H1 kBBQ$ݤh)5㘓 7SuC@0ְ7C8T}Kkknšn?:񀘩ypÒ1OxQRWm*5.zu%do61<Ќ\g !<'c̨#LpOFV-wl\ZsgU3߸^]׻#\$V o=Aάc{}w{*͕w 9ɦ9 _r\7v%ۋ]DH6e YO2 vJ YP8\;) TIVA$׺9%tpx"So=ѹ#I@8G*2Y}b.(@D1X1 gc1 FH9 "A0TT$&%,\'w%uE[0: ]`f~D{bHJbC"n*ɺOeC~WD\"{3bP Aӭ|g9êbFȐA|{I׷y5>z˕YBsЩW^^H1xQFUkGKW]HxL꘢ 앛 ܂E P1w=L0JcL+~O|2Ev$6tp͊_'\E&yip*1ɪlɨѧ(N1[ #p$JPAznFr* ߹=If C ֕⠍RrdV2mNkμ#EjΈb04dM YC\(υG5pdćIbпϓ}R[#[OOܣ"3#'4R{>=GC3*d="MVhA,yN'. x7fy`RWKnKԥt7#QjШ@k~իS/qR/ehȨqkF]͖_~yImm$N$+NV{>7/ |¦:,.-+{m5R/]IT-DȐX浟f)e`M'3ȵp ^F U޷Kbm܇! $ NzPǰA*뭆JpV]0^p 6 y%%p 7߇Q1593f D x)+CrayOwY\¥.bN![2v6nFT[ās8 c'W)&¹h:egϖ, .NySJҼhgle4VHGzd$PgVR<51gNyxaKT]SU\,gM~OKQRWlTj{.^zyKŨ`kq2΃kgNX)t;[8w#7E37lX/ Pn0mF3>_wn+(#( ++u+d$Dڭ$nZwrϤ6s7zxXmA#"R1+bpSEr];)yE0WZIOoo||W )ZqK:nY>i>iZG\Bb❷ˌ\t[ǵ,j$+8^޶>|"{,6^`ս &x 6K%e|`tY;Ke4Բ Ag7)S":o2duG/ǐ%6KY?(>[J߻ٷN:R !)XOUo$[zm5jVhDq>G``_ϼh[C% #0ƺ&^ 0c1Btbcdɭ R1e6?!skPjREoeʈ*[xJ WQH_~l! 5I`p=y<[R5Jt)^荌 7½p.r(D'uəv&BT/Jƞ"C.vZpz"v*fH-*xHu%Ζ <<tyJ9v< h i$}R2=(X^~vdaF}(8m%9.cMiFF߂{ z'/wA=y8ݞ}/^Wa1 FjdxJhc6ae*+M6ʇH/c*zU*5=tթD#v5*މ:` h\C0jV9Pw+8xۑH?I.!a]}ax, bNcuR(0+)-p[*ßBNf.&xT`&$(bjkYDFV0)1. HZSv`EwS,H–t%&F\Iv tȍt۩ *g?YޒUo!ҋ^>EIjTjfAzu2&?`SW8j Hs>WF49zV@@W5 RӮ}iv b1 N?mCZca".Ż^`]/"%y^ ."Oe qAq0Yp]'xrӏ@#=n?`v*`"4I*Vƃz\.GbSMRWVm!-7 MbCH]P0{|t5d<,86=6kvI"z4z0|a~l8aC3aT0t RW=kr>:v3^ Č3|67AO%8%%`S\,A1H7K朙,pL91:$Wι,C&_`8\]EI_R}/{Q񧋋>N3+-}l⽷qg<{5ޒ+~<;9kǏG z5"# L*aa0i[|59v]]tt/k A x 10,[~`NaS$#zԦQl@,gţ |qs1[]2euL$!Ppr%=s`. )EKeVSw/k%G"y5&tAt^5eP 1ǫ'9S0Å۔!0dWT-_Z(*3JNfYǗ`+*v1M.9*-QDdg#%B^b<J2n>ao"Ų{vRllp3ow - $ 0O^V +(lUj :^qC_^5HcKZhXN`!cFRpC7퇦1'@}`U88Xԓ"DaXtߵ/Ks Ye'LQ$O-\ /2JOaX| >_/D"5@IkWɝ%63B)4OX le{wxsrPD aMczFXNH Yfԛ  ]`g5vsPFcV˧A+,-RU@Q؞3NKfv\S`܀?Y^\EIwڎ:^;[+-<Ш7xQBh$[`m4BZ8#e- j+eu stWָhhvW*AbDyDzpj)V?Su]͕DF${ta]RZ0T@5%ru`օ/ƾv#^wDOSLa.WpoX+Yp5<ò8;kw5EJYcnN\i(D'bD^I܁4JxV7Y^SEq5&B*G@I`wb:?rًpE%ժ|ŝ:^;2aw+(ҥKS-QTckxa'`MF|`:!|թwԕ5bQoI pl/⩟x͵R}Ӏhx+ZEȢfgz Etܛؑ Ȫ!o ص'AS?kAaJn,hrt C5HIMLM"ؤGH4th8[b+[Dz"4\XMf9cF!O ;wL9ۦpU:JQCu9`舶tvGxk19Ҿ ¦,W5> z~_p!v 8j!"/d1 *P[QYzb/W#SFE;fH\F뮛QPaU^i==y`/f65)/ZxLe [%6}ӽmu*\+z Fx0AܕaK{Uz-l娇B4ݍs-1*Q4<07o]YiRI#Yvr!~kYq +6gt皟p_4o ZxWBȏ8bxp1A2cUc9ˁ<ÐWbڙlηM\a%|-R׸V~}᝵I )!Jd`o0p"vv&$m2A]Z`8Y+ָ*BXmq.|ҿxx.[%86x6v=p?XPlYS0xOX.}4ehde ˘F4:E ɹ(\ UN;{a \ jj7&(+8|‹zoTgtЩ^p ͦz\aC# UBhche7qb7/*f AEχիrcbM iXaAym-YoÍ/~ PwXo'dhb{ˠgV(zF"lT7pARnE`Tm?B!SNa5} i]<v&l>ߗ(Z2XB]7BUH'χ3$9p^ݍyjTL) _dȣ`{5*e#>/:MְՎpBkP%cܜY;u8~6Fyy C|>r tG(rR)#|bnf4HKiz桩{a33k9kɐ3?D&,C[%|7[#1=*J]g;Rs{{QB p+B )XTi-d^?+ƲBZ: [uP8a׿m0'cxh!to}NOzO3gi ݮ;7oφF`&XN~3@Yc2?sXe;n ^* ʤvap+L즋ܷ(my < O2%!wYրԋm ZSEWK+BR!^|:XI!ߔa;YPqƑ#]c ֳɰ(;W =z/OKu*)]Uf LA؎F1"fRGŘ^ ,F:uP$! 6t=ܸ,ι9aWՅ Uuk\\tTԫ(iG^+z^%o6Py*\TrDYR3 zC;@T-jY92}NMݿ4֮yp_}Ӫ!bK3݅_02Fo}C؏nN~#KZL $8kRtX I1,b2;;=2ctpm$Fm7um>eYL)AH^ePxįg\2Oʐܭ ]4Vm$Tpdz!t'"}sQd=V.da$21~mo5&LoXm-q%Cy+v x{qFhْd N@U\5ha`bCRSq}@%w4."t8Σ=xw۵V;Ur2ݼmVɁ^'L)@"Y:@_Z$SFJteúXqB䥈ΩBY0R!׆TaWbr3d7}"d(: h BgGa09eц»q)N-x@:#x,Eh6 [̼na;B2S/rmt9ΰ !C*Y Faޅ_%rًpE%~Quթ7؟*?GQ9 6P@ja Jkwn]DO]H;yYCx 3z7y}{РmzhHWuVrm%LTl3<<%48/3|/sٽErER3[nG \7Zڗ(eP TgW)\. uPۅE6qp$M݋mh!B:@;Ws|pd`vJ tp2N % rb's Sj*r5&C=.*6@GK +Rf(w^&w)Y]S/1z'F"NCf ,Z^eۀk& G 3;Z:9T?7nzd2bĜ}%e0ꝳ| 찁 ֙/b;=8T\(MPe NϡDs\ Eh<'y8Y v#{imD@x5r[Xip*K ,_M9{A #bY EҋHS% QQ5w&w6o^"W&H i.l\ƅ7Ʌ.:LČ1Iq +=dȠgJj0<}U$yĶo o눚AbZQԻvNf7FXNXB?R,@C#0nԫ~ c="u O`#eF9CCݍ8/F]i/ڏ<'} i["xwW&BKĕ> h8\[L`jj=u(@Hq>' _.eR027E] Ğw ].Ep0*K򴲺`nea9*.;AD+NK)Jn18xFD8Q"o\wW%wh֝lAmaC1U"IaԞ0yfwuа"_;_  ,.;O%e=*J]mkTuթDQo^5@\$σ_-;f5o?2}ńw) 8Ka~wPhy #ph-FRb\הwP=rY*` Aj#`0ogY6gw٩_kI65,7¾v ènAI 1g5DK!.++m =-vQLTTMse Vjy*v./Zj9ILɍ*^&]%? !{Y W"w"VRa ښ"lu0 \偃r!Yd5bWVp݊e>0IV msaˋiZu£ `*2d?tu v*- )1j@E/WWQR [Jͭn|SNX:-[%#?K<`=WnEɾ!$!yA)nGQT xٿuw8fǎmnRb,Pu%GNΣië}4MA &D7rJX ¡ T%r\ZX 7Uh󐦁QE|qU2Rp'O Gyw*FR$Y4bN[H?&pm|bI!(vxFqK$`ZepB7As)wL z =TʬsGد1 2U!]k$ ZA*pE%`kUuթ˄PPAhi?`SC}*uwb^KO#"kƑ n@kߑˆ`JW^'|Y\JO>e!瘤a'j&G4@G/D4CRq;{}į jxF7>:v Jl(R h1VkYAϑǧ$2a7ⱛfN3br߰W!ixqDUKWs5->V *J-]PYzue7V%.k\#:~^WKr ͏eG=|c8X9[ <(LּkL9m\U]p&֭ "9e~Jq.n IHoLRa`?kE pKAe"롗g8n'pc`J^"74L u*+ G`!ۀtn U\]EI]T77~ԫS/ԻgxL{QA )h  *ר hA^TZJ ئʯxl0Dx3+Klt/W,,KR a(bl6kG"C¾Eʈ׀ъp Ag'ˢ٪ݥ@\"0[@w%j5x E6޸Ŕ5ƍ$xic3hXawt'.p89\òUk@M!ǀh͜z⯔$YxH^NX/6Hc'`[6Hc3 VXː55G\ }Q?#LO12֢g8\QEIl*5]N:RC(4cB`qMlGeFhھT"LJ1դÉ^r3G{"<|% *x4rgF \3z&shÅ4D! DÕxzC7b0_{kXRHq].'^hvPlBNB-K TO!,¾ҵ6yS1:poDF[`k]_Yvsڽ6Ε:{JU軥пx\EJeQ5B3$\pṄf~\{#`̪1QVU0W6N v|ꋒz:UjF:^СDr Aj`ŀF,a1݆֚2xWp5hU0к|s%^c1f:<6nй kqR0::PCXm- !*CҔ*d2$Rb/A%#nL~::: RW7"sw=2\/i24Oq̖: 'gg g^wn~vπ1ގsa.Wӿ?S!.4EyZ^8B8A`Y.WvmDgp: YCRTI}W$HtVyJ& x@håb}8ZԻ֥RsZ{S;*ߌJ<7 Nfc[0V^h%;`КPQWֹ|;1 So xJ_{e ƧK3ux=rDq-ǯ=$0j5LVO]#1w!2^֓2W0`pFefaѬ 03oR76o xo.p8ں QX֝|>UF*^Ϡ\*<4bq/5\,0L `.()$GssFV{yW'ː >\ծ`@Gl ˆsy\g8\QEIm^;xSNX.˜.'NB_Jq,q2Vz^Kk/r6AHq#QW+5WK ޅC0|p{1Au 4@ a7" ~0ddzQ]!k(DR/5gLZٷ1CxX!q| JHw'c+.%h,)<~fUw`K"euk-~Aô\<$ Z?Vz˧(wGnw$ԫS//OQ_y11w !~\}G`! GW6PիqMŔsi[ nB 1YvX$tNz +N,뎀H8/r[; (f8,F\yXS6HIg, +$.w;d`^L:0+hy;Ѩnhd+vHw I0+osB@{vP;O.g T: Rg1C uSن. nFW]H hcOݶk*a'ҥ.q4~nTK$H$$P8XSHZ\]EIЍ_:ԋeBfMnj)!*%8  G xW%^uMQ" )0 f/D˷ߚYAu`+);o$+ `Gyѕ\mfC8k .O| yJ^G?{p-q.ĕdv\H'\OSZȉf!˖쎁lM?EH'14kY |`CFv48-x7L8knda\-J   9]⌔㛂baP!#G.XuUNFn6: ˆ>CrpE%|*5kD^zz/Ȏʵ^vr v{ߜLŘFuhy̽JS?jhé÷Ӥ+XTe$+LJ$p_{ub! !|}2ʋ`\{r dFsNc$]KE):iAn0 33izHm uJ8z Oθ#Eʠh8BZ(esefvn YG! 1g!JhB˜WxaPօmTzcqV|Tp]u WJFʒ ׼e~cV~I\]EIm*5QG^z\nT3Ө;!TpC-QBШW`͐J#m?o?xřN#4S ]7c#c{< p2%t͇"(2gVs[ƗFqu!q;)F-VU4%v͸[T=QE ~5TRcXCyzrjl35MވF-퓄v;)y/7[gX6A$WP. [ Cľv:W&TcMHhs:?ʟ@ jjJzOaq5* HT/lXص9ы^>QEIN۠JJ7zOTNX>ԫT|gB~m;:6c:|5}%6E-;1^yw_ki_s<F~|zHXW0|w>pc $^:ݞ=/^ |n3e)pr>c!+͜-ʢDmw umE0}Yp,NFH挹RO-zr+޿htJK!J9$J] n#ЭBHq밦iNåE7iYs'rI"cL*>n EӠ>zY:9l I`!RGc(ѺPlvs 83N=BGsWHMV;uu6l #X;FsN 7[p]:PM#vo6 ^ru%[Tj N:qRo@4ֈj NL^rDovTG=*^]xD9/g`ց{jg_ak epc>E;m"Cx=lꮼ$f&^HDBz,Q҂H+ aRƍJ2^! tL\RH5H\zx3#];ubZ +Ql C' b*"~ ǏAERL܍8g\^~lIk+jĆ ظ> ~᳣| zUjga:ԋeLB@ChipԷ&z՛5l4}4&zU:96t(a]J-…i3O|? If e izk%-[ghbvw,<Kl> ǣ ؆ yv|/ , )+Bdh|Jkj"##tʹt beh=A6ΊYJr@R$H?.+z1u wb{K{UPo;鈚:0i#'%!G& h#r@o? tI^.{3TJ̓ L^z\2!Y.FmDKr8CSh+Z3X.(d?3ȣx)!n$'{&^t@Mk{U~3o ~n&YL;z\|#kqӲB[Y + @^nDʯmEI9ɑ*55N:bSCIq*B&@Ϳz6dS04 v*+3P28hQ _wׁ$^vr]1^0w[T:-ކx~߃o<ܵ̆ٹ ^ ]rbDz%Vl cnj> y.<"Sdx &`C¬hbvkJgEțl.eb >1_-K2(H*@,):N"m6 araՆ.UUwkHbB$@! / |AJTZ*׶Ƨiim}ZѾj}ZH* X$A aD^[ o3;sZ93s39Zk'{Im$t6Nbt'GD_޳ 4qCHNET>$5\ljMMy:]_vWc V*q0u:xm-{ڱ̓t:Xl~ oGhžמptD:t;& U)~:[ې- ؕ"CjGv{^,<,=bGkplo |h߱'NO7gX7n'ìhZ.ܚ/s-.Lm[Ł518X_)S RoCFon]'")TQY4Vk³I>({ o^Ri7^O <.5hnz7RR/뭔P:@ ؇NڂlC{[1I QQG56n]bfMdhݲM-H֭ӧZ;=n/㙭۽m!q[{&M8uinVxflXsktS-^S)oKþdӺݛD݄60v0a…[B6dNΠ5yʍǒlmx*[(QƗ̙/+y5\͊6Է8SH1wzeo sHwڗ&kӥ6 x`§>5-]Np6 Un@{ yWo=xɛӏA_N-{/I娷=[ۛR}ZIy[:rVmݞhٓ,2v_b:9l)]voQCiKi"c,lX<Ξ@mڴK|vƌ'p w/ڻ7Qn|.*-6LO u>Q=SӁ斧ߙz1O(1R/r~Lp4$ >X֎Au|)hN߂rgZƌVx`ڴC+kbaڵ+4m{[g3=(Mg~uԢ2ߺ]彡yigqм<]۞`k|[غٱMm!lkGF T匕jd?ۑRZ{-̘vI'M{G#G]OSn-zr„wqԖ-tƺ}%v-ʿDh쀱޿֠ k|,~1r5\ <>m;R޼K|c(dxX |xFX:D#u,q ]`ɳW%u_soL𸃿5w3{*)):/_p)%ޑnwRґ#nN0Lh;rK3[7w3͎g6+˯:;}'Y]fM[O./hQE4o{r3WQwM?"}l>}nsu!6zmmȤquMxSVNb,'VH8WbQ/SKu3Fe܆${**<V܇RHQkX<"hc)E$vj?yʧ=io}&Vipp a?:/R0ݙB̓Riwt0&x ԺM۔kN` 9Ͷֲن[=׺;gTnGܤ^[3Z 9p?iW6@/=<پqR߆+_鏒Cns*IP#Q2NDTZo*~`4G2$OM>h':Ylʵ+f'X._]_}_Du!S0BA&}. X˳KھY҄,`"_ Ftj+;^_LԻ8l;;ymַΛ7a^./wrZ8%e߁t>z=Z~\6CSk7ٶ"֮Mq7nݛ=bgJM]wzcxzKWn?. ÍCO3oy']w1O%`DŽ݂,HCP0dk$*+9nVZlN[(¡$O 4w@[V-[j -\6&^{UWee\%K(g,R +ZI춯j3y[VH3XbΨ/h_;tV޲-&=x[οt<ԜOzG7t+n?q1Mt9a+7vR a-SD؞o=ɢ{;ӏ:1lսSv' #ܝmmZj*,b+<~>Iѕ${qpz&6J_5%E\jrsk$iM+(3%ؖ< ]lm@k-lJ)ߓ4ք3[W,PkCZ7'n ~zE[GTlnO+Mk#Z>#|Kbrk)]['Lؼp? ;t֟ceېqx^"ݔ8u8$,ir) kx JuG2&@C[8N+ HN*S/REm X"`kiZ;lTwbl]i[  /WFO2k_{MMqs[J&w`+V koMo^2򈵙H=?brǴw;!o|e {f;@oo| ӛ!ݒRww~b緧XMOY{f([~a+|T9i=9/HE 4un(?jbv+)\s+J [ 4 ]^UPhȒj/j;mU~xEmvP$2"biC-;kMߒ+FOJ]`1 zӜgϞ rZJwd']6ݞ");.:ۛc"?Mܢi[y"gn5tI,:f[V.|jAzfMrm[S_K3IHwRR6%/Xn&lu WD'6_ESGvI3yC6GP$c#湝+G#J6#W8Dͤ,pUEhGdmЂx]BbuRIn8`i|orIt=n:"n.~Tϥ aOIy`ϒhad )NIktNnmI3սϷ<@s-EӍ_n4O8{q>? s܍ޯ4=ߞ.rԭ(gKt{Ƀ{la}Ț'0C{IGOPqPl(oDtAFrc >P1j)$hk(Q^RC'ć 6& XM]iUc, SMF9[*K=*#5뜯[Ҽ̿?yImjid;Z aGHvsʾKR.RvxoJ!LoI7Xsi_h{|h䭅FLrȻm16fMsv6BM),9mt<'Mjܾm!!M /au5׬#A(qqD{R"}%=0h'NpH%l,\.RR+!-No`(V\e0wPyI1J'P$$C{iznd3[>_ӵs]&j{I[*s^j"!s,8`@q8@&ZQ/)PモfT'>"R/uzۉ\HwEhU{[Joha12-'oDc..jl9_{[pwo6{\kyC)OowRʯ' 2m0wwj/Z{jyMgk<}ҬдG6Ϻ/ilxt?x*y+gaJ^`bD&#ꈣ$A >Q)PszDuIW,MNB6 V+Vmh"nX*V,i%eݻimo(}1ߠZ}|p϶3 OVfKsN yϭ]D&Fm2{e|kngsJZw|kxZ8#?%%fsfc;m=Ɇ#OHq [.|-8߆λ'ww!$"^5@@K'"[ԌhsjeUh8J%p+)Pﳐz_I^'p"&;lG4T WKc$[tY= p;mi7uO6KU[wd<+=~j[u: ǟq Tdz*()VjY*@(QƗIHGEu׉zjوPm{;j *FruP|Ys|+ؠ־'r_ꔍOL7[p0O-M7mp7'ܞR|z Ej4ef<3NC{ic>u[:|GkW=RzÜ-lBs9oݱG!kBɤH.pG8W6^_85OmhѮj=1?ZEZ+W8 HGGu2~{BI5c4œiSN%B5A+;Dk=2m\|=]ziԧ.iݛm#*MT}*RNr$:/%ݹ4r|*5GFNr;`ss&QX$` e,Iz;;RKyvNi"^.3Y^4TɤR\žadcCC'9? Z3o.&'~SZ88Lj iog5)%vs|O$ /ʚ?bSPP!J<М,%RﱑzDuRz1]/k*N$.vE0ym-ނ}ZPb'%0fRF@ŋ/Xl̩t^v~JidCD۲Ͷtag{kO=ktIlzIO{eꯤks%fokd-@k4kִǖ,s/v뮡7X`Ŋ*f0(io )ӭFվ(]¡@ Ή$Rԫa)M Op.b_yE*ZAnt]efvtΕX1:z{\Gşʾ}Ϲ;祏=EȆw},@z6ށN9{h.8s讅eHhwHM pٞhS= n„.p ,d'݆lzzD8$|)?[dAe|*8< h^i_^"FRG I^'׎e^M'xRz;`Z{b=m PjHV㚧^{Eoen =r瞙Jyh3O+jmp&M7+ܗ='Ght5(Mސ->&OYD #dQ:4B@kMyW$ 4K}(qh!Vo봏ot:vM'lt]႟dq>=}hVޝ=-}쮔}Σ7]Eឋs讓thB GN ͩSᎡt:e N\&s gםq}.\S/ms^=Sa":&W8AH'EuIx$%K.y"j[u 1yajA]DU۹'׸YHQpyj#8)|ﮟvj\hϜYOnw[wM=mm )e%K4]^2AZ=Qt^zw~n># FKiތɋ{ꝃ3mCZG@d8gc20'4OD@ti5j^Q/)PoR#[(Iשti>kS89Kmʖs]+eJtt Po+wwm=knrF^㇏G:ݑ"3쵧5O[F&^pKhCz6В|CN9֝3k$*,fؾmСK 5/!GNA/OYk4w1k)Ʀ/~U7Q[cZL-J%w~$R^P/ ^Nsdy}Y^pC+lCFz~BlnҀ|fBο8D??1&jh_PbZy0Q+qC_IzHN":2x֔)Tޠw|ElߑSdD, @S&'߷kO^vӥ/v̞C'>hx!{ڶl1CǴ65{4cѧAGWN2졙?/kf},2eJj;wҺu/_jL1!ZI'%sπTQx~mj)WN HeJzA]I^']5^/烶87hյZJ; 4W8ӡn4AbHVr9=f޵Ф;tij?v-}JlǤw|[>5w9 i{5& 7l[0mȒ W)utySjxD1iqSp(QƗw ޅzDuҋ=hۖ=^s hG| (Kr  hHHqӇ>DS6O7%a=Dm-h7Ϗm{&Tw׭yx*)o+&Ӵ<w6#}ay}ن޽(ױ4GKムZ_jۆFq?z^5q^U0iZ8W\ n{f^'zzE- 1b8Ikyb|DR tq upYfeE5?}{Ӿ=Q"S}.ݮa{ĴyҴE%/n'mc[кu]~ɓ觖:DˤR%,T. % ]bt8wf4rFo3mhS(QưH/$RޭU$nQnJQoeء~)h/u, ;>ը%sLoNm?m3'O>+<}ݱG!{Yzmېqr>5B !^ -IO5 YaފPD{R޻!.$RQ^;iJW^ٱ?5TڭPyZCpnJR{D'yy$/94kjEc^1(m#I|(=¡@wA='RHNFz[pTs6bW֦ü-pfʬIKX[ʦ1?8Od5w7}vU_~ۭa8jDsS[{gMǮ7 پ}t䝷h'(RQ:ށ4-"xEx(Er!$ZN_ոy{3uZ S=WfkݸmDfxFfZxi~]eUGŗ}: i^0e|IzoԻ4RKy{w4g;jhءmzU2 8iEX¼;Zb)UN/.<ɟD͓3/>8gCgnzͻ6d'ڱ?US|iU }1γ t)'@`pbO}I'IoNIΝF}%]w0RHNE1i vqu.y`о JB,5ɷT)'5BBф dݺ}v>-tD:g]Ӟzd ن {q0x QR _KG4 x{{;P8I52,% HN":zNGz5vr% Lc2 6!8I[wFWrm_6_Sɹdҧn<޿&yEM>mθ Fq%*{.qJ+ y"z:1-%$*e|IzoHN":zE4yvk`Pjƃ]`x˳aJvڤomӦ|+Bm~jVciupm?D? Q oT<= 90nz?XQz.qC_IzUzDu jBQo\.ͲMFWntK5~(yWa^n4}Ǽ/})]KMN!G]QWiA԰LkRs1"JI/9 htYCQ ͍b`eJzoHN":z-}BeLvZЈhyXW3R67bVFraDO<5?7܀ /͎֊ KBd3CD!NC}Ύ%ó}o7eh7 ; ~};Ro&׌Popp^']^+ڭ>#je[ū"kk^ Niy0>YJ.6knrB:Gn~'_rDz妝`PZUT3;MD-Z[bzEe ڰ\)*+sA<C(ݕ¡@7@$uɋzI`uP,kG $<L ]|+/`{G#|%4n鄌z/Aō3Inco% ًx>O?߸׹2f;p% HZ~:wCk3a[B+*wļ9g-F2@uzDu2(wN"`Gt-/=h:6z2: O= $矷;kOO[8(٫% 4PLqNnĦy[Q9 bnw.)Y`źQ/)PZH":NL!jY.vӒ={F#rqF9դw*XP_F.]8;7|uJ> 3nP6ry㑃3h0{~JNUn,)FQCT;Q[fh(=¡@߆HN":S/b~`GEk+;Yka4A=t9 ]Q1`=5`6bٳT$ݵ #oBGD iCQuڅKP6]c+ҭW(P -H#:7]kWW_.]j_RoK/r}\ygj-U*H/rC, F奍U[\ 5Y pȂ^گ+,*$E5l<8BDU4ɓ(QƗ? 1R>5+VWZڕ WN G ˶lYJV^!HY^Dp`DcRVRYK7RʁΑ2mw"l>߸̪3- {N1%P;1?ܪc#J1)7Eu҇ԛI[W-\۾[J<>+':X]/x348QWے-AZRB=; -LcJi 쀨ENܩe˵G(9>%7 \jajqi\LB.3~_ľA܍x l^'}K  xKC1jgJ&@NVNh˘m` Rw]6!x:"tɉš--.˲KCI, i2_.)L?J\s`Ϗ؉Z6,x&n+܈e Kz ":/ݲjŚW_)JI޲ةKiՋZLv5"=F9x" Ȁ|EhN?mH;Z8E6(LBjcLL>7Jh_m=J1)wPopp^'vMFbbIY8>:FFUKZ0`N햤 .hIheО,D,)b _^'6aV$`xݡwS_PJpba_M"BItվ2&|EQz.qC_Iz?]^HNRT bDRٮTA, 6 [s;. 3Tn/1N C" 0E f);%شXEVuՖaF׮Cd͎8޴S&f;-JӐz1RHNzAc Tv'RgOrpZ {R--]yT4*zfE5,2oypm+jc2iNJe4L%3&twƵ֋cRDa$PNܦ6J\ ΢DORˑzDuRj;?S?O0/t|1-eT\M{}Aŧ+[rxMD^s }YJ:m(Q5 #wI˿؃MGl18@~G2@W#:e&?jxJWDWט_Z[{$5-Ap)x~γ5īkn#Y#?--'Ah -|jBkx#nw 2tA^aqiv=ę14ߢtW Ի"RHNכf#qmغv c5,yKe#BpKs]1h`+5*j/l٫?CmrxE?}Un, 9^4H>ImUe|IzR$RW*OŰNPM iF;_AM ja6QwhV /qStv_$:5ĩ"qWDjMk ?![,ӨKvacWR#*}17˝%ؕ5_$RR^K]T3Y))klC ;8?v-L̫g2T"D j*M Jl]t 7 ¡bSX]^{ if/u+J 1HdR\jz :uU0SZdY%^A$D٦5x$>ᭋ-E*bd/y(P6hE7-1)#o7^4ZQeLJzWA]޼t¡dPeR+iT֦àQj.U xzVk(g8 U@b5_iX0hje1i"Ř{v497{bDbqs!vA4J% H$R |!cqZ(]T3IS2*e)~ "(#ՋkKdYOAXҚC/i+4v$yj,Zph~ 5(ݒ¡@R$RR$`bRz܊ёWJKl |VP' UEں %,ĉ#+h% uW(DsT0bfh\lEV,<7Ko|(QƓ N^'ztHFvӧ\V**U 1ڔnT'm` ub+\LŤ穁 OgsE;8-ub꼮;*+AD8]-N(QưC#:j`‘v< cQE-0k"WK5OK%?v} ~8 ]UZ4D5fy!/1?z1Vj@lH,khٵnIw[S?ߵi(W8Popp^'~:OS1b Kڧx69Y|~zIIɂMSq.r%d\OiY՚Z{Wտ\[ /2ID'=M U@I{n-1xΗW^mMF3ve1-h~N%/!5ĊS:#jHQӂLX '>%+XR@YLu[qh %C$RΟHX [}RsXhF_۝'pZ*Po)Ŗ1 kQp-:Rr4f֎xGs"qY{yB?LF֜G"Yr1@qH$ 2ޭ;`< ]+J ԛ@M":,vʢ6y{F*P6uQy7b2m)Ճx]ٟRuDL1RlYTT'7no3p >yzsh1fp,ii}ղĽ G2@#:=b:D5>VKcބ.G|{Ce%sY<[]; Чv,b?A,kklX֋׻$EY9An=8Q|H))eJz?$RjkРX^XsC*xjCRYء$?Z}-ZрƘ0~AW{ :&hK8дs;效u=x=M1Ww\5JS|s+J {z$RHNR_V]j&#lW!(~SP<#ZW!MⵢƩxܬwīeI{J$BAg4y\Ҍ{yNt qT#Qi)PBHN":)E,BWExFz:idbi)UmRk'ήHH!>|MÛ+_h뵢1/Zih , &:,fUs^.%6ޏDuIgjbHMc ]1H 4g-pV5sqUXPCܚѫ%: "{p缨q!J`M,:bh=)FQ¡@#:굠 J]RٝSoW&O *<  2z8]"~q}h! GGtA5-v ^>Q Ks15ZE/ ۆ=-p13R>D_RAHN/+]J&&8O+4jN2clTez'H'eweh`R4Rc;j~]Hyy}?fV1(]9f>Y0ib+miq>Ki ]{>P;ElN?qד_}(QƤ7!~4RKyl_wHD50fJSKt߰gV:^VK nqVENT(u7n * _?|I(Qƪ M%]bNI]p^pypmjx,%HNHx'SB[<5LPa5QkT5ZYWKevWuHWwǼ xP<Y͚fXzGg0+3DǂݝSe|Iz?phb+,˨UM KmB%$zt @v Jan)ӣFBr3&ކ7RIHm,+D4 bal>3D$o[qqb/-Þe\L#NQƚ.Z"E`-][W8z?rlc_qmdoFuRz[z@riX Wh˒jQQ항@՜ơȗb7"i aODx[bӸѡߢڟF1w\-o0P[s{H-YST;\K9J%H?BBKy[ yaBz_ ²k1K4,ʝHK5 Z]Efhމ]T;U0Ͻ nXƕԮaWeZN~Z%eRS8b"S/`HQƟ}z6򒴌!pxJeUMۅG k:`ho7jQtÐJ!*@tޚHN\3zщWqhbް`jյD (kv5x&xc(=¡@OVakf{z wlBD5\WO6dZ <se͋(o 4D:,VD kBTc~0?&E~jQ,+ km]3yXLidDݖT(cX Kz 6.syw.{K)%8Ude\' U jaVTKࠧz$VJ)I,pj- j>z^SE}QGS$3iπGA8b+ځVEo`j]_F]UeLJz _S*DuRzU.`@18jm㠟=K1xDw.oٓz5ҜEZ ڧ8_o"q-1^NmQ?8D}| YTs+J {5FuIY%}?L'`F2Ќy Rn${ϊ+8E"`&FĮ`wkȅF鍷.rF̪Q"iÛFƃA`k&k Qa)P; k^'zT^*OD+縦M;\^z3LZ9E McI5Q%yDr &!\4{+\qoE%v CL-:.P1 Zbk%/DuIԛ? gWԯ0 CXpⴄ=,1͓h uoGY0]y"lA38ZSzyU, ,xђg1zѺt%% bb D}%}/EuIٝ,T7)u,֭p,.e7n3fT^\:k4U$":<]<"K@dVJNHbN-%,qbiC[uxx4f(K {ޯDuI' V1N^%R{=CJ)͟Zps :褛eW~Z8NQEXɗ_EXB(ϲhS$ {J#9y0DDk: 5-z7~9C9iɃ Nyz0s_FtZ/{G} D_R޷@Z^'zH"/~"xt-</fatz?Mlٻkݢy0W,AA"m-'b/ ,AqKNOm$@~NIK#Et[ R#:ԛjO(+@kǽTƠ^]JbChWEˢ2|mW?WoLZn5xO;u"/D ́[<{_ˡw_J\:s+J {95zDuS*$T`œ Χ>/= ¦,n"p!}lhxq^rDhս(4b ]=D} OQLLKŲ sٚl_]nVCU0Uk#J=Qi)POCf^'ztzGy4)UbQ$#8oA*"8Z4XkH V H]>P47G0Qߡ?CM>H>"YHn o_Z{=)r2%RPopp^'v.+}u(S>nA^)%=F. r  H"^.ZӌTJnH)W_ ڜwsFK,aKk͉kbM\LTl%X-B~t[ ^xI^'ePpUs< 8"]kOxD:q^h$*"QjxaԨEc\Q怖4ޙ>p3+D.weUb@u}NZWce2Jf8G2v@B>RHN:^qgu6UHn$r mu<6Y+Cԕ2UyIW)Y !V> /K"#hV{0W = RCK${e0ZCG*6(PhQ=)POAN^'zT{6e}DfdaOmB;;Ocr ܕxEZ_A:"pJj\ڠ 71;]Ʋjk%b&|Ex:B<мĩ+G+J ZHߍ$RQ^!Qdjp% 00[z!tz=X`+5$hWj $[j4v%s7$Ȼk΋U@iȆ%ZoX oZ%^ HN":zůiBbuORkFцY^[Lts 09579Xƚ"d-Z*ۣz(=¡@ߑzDuQqGį{Zs-<(qU6bf觱^Stv:K$xMo$Ұw|Dzhjk ~*GpľT'ݼEK)W$J%}9DuI5%0 ;lyĕcqhA5 ˔f!f׽$ !K]!);sU;S ">T+hFW=i-೜Ʋd%R0c&yƂhyMQU)PzEuI'Kl&h.l3bn- G FhZ-01 "U~t^W]tE/ e= 4BgP$3qbҲo 牕24q3NS+TRQz.qC_Izχ{[^'z^ MځxE& IՂJ)0;.c)P-WAyj2~pn]GoD'V腯D[ D}X]td*Q9O>3{/) ^e|Iz@޼TK!x DE̬"7p^9VcؘKEdZyj~jDF^C|\qe RHKUބ8ĈA1Z]-(1?Z^]̍c  !הߡڟ vU~M)J(cU {.;#:m'qPX%GPRz;9mHGz>wPB2w+FIqivN%͍|,ZbrxqS)yZU|ni,W(J%p+)Pِz7FuIK%iXhԱLf o- K3olip.o Ky!z< x=4\w <; l]xR->ZL}YQ4L#0CB,FW(K {FuIשb>VMR()gLȚetÑV˛WE$K0'ҡCCK?jj(h2r@4EZVźZ^OJT4pljBoƞX É=W8 HPopp^']\+θZ[z\GZ*jnt.4uFC N=|(i8`DiM6 r4 fp;TkZ\k%g%ּBv+ wnjã>( #fz*G%Xwk$RnQ8k\b -4hMcK:n{2opJzV޼A 0Q29C]5Rby9D2Gl'VQc~eL-jQG˭6ƀ8Ի@(QƤz$RPe$61PqRMh۱m&FΗݒ$0^,2'KhJ@3Of`+Fh&zN cL?Ż @# ++ P?hgf\  HN":z fhYWIQZcɆزi42;Ͳ9+ޱvI#oď~c O28Q FD*V?1Zi Z_A8EQ/)P)z$RS64I%"-lLo.,WN<&/hc_t7jF4ʗxؐ /|5Dq@(O Pt6ȵ8 HݦQY#`A+`HA]OrգD_Rޓ!#:+Kkڗ>`JAш8gqŶ*Hf!vЉՒau03o7[jآd"xy"Di8ibء_Ndmq(J%p+[Vz׬8y֕k׮\X,[._]_}$ݥ^Lf=R)5t^*p+Ш:61pKx7Mӕ$V=򶸫 -}kyEwk%֛ݥ.I-`WH={1W`CZYs#~xYUD (RAZK>7=hgL8?,Kx8} q(K"^0aՖ\P,gmQ>HRe T~ܚh7 rrE~ dKrd@Ơ#b[BNKAG#Tn nVkLxD@6ĈW66EM$(p 9c88x}1Rr_ԋxA޲Wԛp]@xRA&*A5굸d X%%u89̺ _ #ӡp#P^ńg{]Ӝk)dPb#Y}%t(=¡$RoYyPoM _ҤԆ`RĝF!vuwZ8/`C$ƅߩݪ: C;6/`d[s)U֔I: ((QƶwЬwPeDhǪij,4Ҧ1*[Kbf0'ڥRR֥nIA(5TYh+qQb^椘v @>bMG3M9Q/)R @^"/^ELP/ x"h(SPf̝|6jvފѾ %b2-=2! vwqӒ W QlNgK6aQ [n?}~_+0&\ "N7KqP*S -uKYR Tt\hvzE흀V4FW%z(vB]>5\V]DIDa_XڠX{J $GЕrQc_qp*Q/)R@^1C**B݂FExwS\ܦ-^刂ݥ^. f`k6_K^NW%zi`K*9/|m?U[y*r^Yv=}E60 (QƗw6Ьx7Ro&pf׫b^Ml0ϔfB:r Ȕ1f5`ƹD@fR+^EWLZDOLoNjL[W8hY?Az#fe'&1l"ysQWjt5EͲM`"C{yŠ ĢW-`޲HdgXKǮdq#&'v Cż#J'?H$J,E= hORH] "H$Bن: .oIRY Y`2 ƧcOElZpk4sz &-^] GLV1ȗ^?ӸWľ(fØd,FXneQ)BDR@^"Fͤں4,0K,V *6}FA`Ic55cu^Gt(@4rrPrqͳ)ha UÞ}-A> T@@[^]>-dA#V2"<"Ίy)1v-(=¡HSf"Fͤs_eHQvꄴĽS0v>g@,8[-Ts{* 0zњRbC"&bZKA}܂f_4EY {JK~ <(cqZ.X%ؐ"N7Ro&zJ(!Tk$Q%jAecr0WCm l?ώFxþ}|3XlT V#BMǒgЖFb9u0bX1Hd(M{ЬSHtB/kq-NAJMWf/w- 9ڕ_@0Nj.|&RϞ)RƀFiF1!F-MsEĮL :T#8 Eb\AK\WRYHz3Ljb,DǂTs&l F2&sWDo0Y`qkkX6K"{p4lB,h%mYZ=ص} .a2} (QƬwЬBz#f#.uX=tgFw=%meR[WcEJh/aA+Ɣ\ pȠ2D_RЬkws+JԻhS)RoLzDFlP4n)D//O}`Z9p[\j*{!Hg4e<ۉ5*dCUcb@*mAm)]%">4i7Ro&K&]Y` $d^R&9ю*.B^c,XHwr{sFD@a"Q h8_~Ц#cX1‚1y4kZzŞUkA}'%s`?\q%4׈ewEJ6F!4Cܽe?SsƳy`T' jcњC9ŧ,Flr 4\-Q@2zE& UThq;bhU/! ŠȻQ(qC_Izwz}EԛS/_ 0-+۲t=`F~ja5J12'H%q"ڊD'ڷۢA-WbP^e׮W@ȑg 4{E> (QƜYOz#fRzK@٫ ٢C-Mw~Y{ؕX8PoGgK䫈[\xWEL+j8^:l[hv27BF7%b]m 'G2HzD7k  V/ӹãlMcN ҶaAZ4絈Dʟb˞wRkE5w,k-zMaqE;%xXEy '?qQz qC_IzI7Ro&ΚeŠ帋qXI;%k@uzIC@'D. F-HqVK&QМ敖 j0L_bVp~pya[Q/)RvYϧHz3SZ pp}N<ށVǵ"vhn&=3ѾF0BbZf5P iUD+ys-' "kj *qZH8c^֒"e|Iz4(RoLFzRӋu={ƈʾaSփXX0H!2'2%$DHc9㶎&QG#cC?֢YM4{k;W9 uDD û׌G%_!J%p+)R6Y/HzR:vg;S .ePԴ4o1[1.PW3@h>ՠ NbZ,;)DDˌֈPC:<*4}-p1`5Ef&UaH,8K{sWվeLJzz}!Eԛza'tyowynWDenp]KIF|q0ٳXàw4J4 ^boA(, F"y:G2Hf~&U5+N^&;|u}幒sI}R2I)ӆm o/` +wI]{,H0C?ڱ>X֠q$S̊F 6_6lbtb?}5,} <“g4wP0W8@^?*P+hu [V-}|U'_{-+Yd3IRR,F;Fea)5),nj=#rg3NtLh42{Ĩ(@V 53JGKl.\#yg x 1"_G9x٥]duCAfZ/~䓏p0|X ^2% @|T/^Sħz4xp`/G?iUNe\7^nA^:4`:2Wե%{[7`Q{YE>KO[We^l\w5[y{h&hp@`/6Gj[<]XsNV O]A^:w4ʖͦT/^j-ۜp~x۬kjޞ0'CpX`/V켅E.su: mT/^SħzO > @|T/^SħzO > @|T/^SħzO > @|˗Ǿc|)weQǾpXN] {IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1449091428.0 guiqwt-4.0.1/doc/index.rst0000666000000000000000000000147000000000000012337 0ustar00.. automodule:: guiqwt .. only:: html and not htmlhelp .. note:: Windows users may download the :download:`CHM Manual <../guiqwt.chm.zip>`. After downloading this file, you may see blank pages in the documentation. That's because Windows is blocking CHM files for security reasons. Fixing this problem is easy: * Right-click the CHM file, select properties, then click “Unblock”. * Or compress the CHM file into a zip archive and decompress it in another directory. * Do not open the CHM file on a network drive. Contents: .. toctree:: :maxdepth: 2 overview installation migrating_from_v2_to_v3 examples sift disthelpers reference/index development Indices and tables: * :ref:`genindex` * :ref:`search` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/doc/installation.rst0000666000000000000000000000273600000000000013737 0ustar00Installation ============ Dependencies ------------ Requirements: * Python 3.x (x>=6) * `PyQt5`_ 5.x (x>=5) * `PythonQwt`_ >=0.5 * `guidata`_ >=1.7 * `QtPy`_ >= 1.3 * `NumPy`_, `SciPy`_ and `Pillow`_ Optional Python modules: * `pydicom`_ >=0.9.3 for DICOM files I/O features .. _PyQt5: https://pypi.python.org/pypi/PyQt5 .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt .. _guidata: https://pypi.python.org/pypi/guidata .. _qtpy: https://pypi.org/project/QtPy/ .. _NumPy: https://pypi.python.org/pypi/NumPy .. _SciPy: https://pypi.python.org/pypi/SciPy .. _Pillow: https://pypi.python.org/pypi/Pillow .. _pydicom: https://pypi.python.org/pypi/pydicom Installation ------------ All platforms: The ``setup.py`` script supports the following extra options for optimizing the image scaler engine with SSE2/SSE3 processors: ``--sse2`` and ``--sse3`` On GNU/Linux and MacOS platforms: ``python setup.py build install`` On Windows platforms with MinGW: ``python setup.py build -c mingw32 install`` On Windows platforms with Microsoft Visual C++ compiler: ``python setup.py build -c msvc install`` Help and support ---------------- External resources: * Bug reports and feature requests: `GitHub`_ * Help, support and discussions around the project: `GoogleGroup`_ .. _GitHub: https://github.com/PierreRaybaut/guiqwt .. _GoogleGroup: http://groups.google.fr/group/guidata_guiqwt ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/doc/migrating_from_v2_to_v3.rst0000666000000000000000000000252000000000000015752 0ustar00Migrating from version 2 to version 4 ===================================== The main change between version 2 and version 4 is the basic plotting library on which `guiqwt` is based on: * `guiqwt` version 2: depends on `PyQwt`, the Python bindings to `Qwt` C++ library -- only supports PyQt4. * `guiqwt` version 4: depends on `PythonQwt`, a new library written from scratch to continue supporting `Qwt` API through a pure Python reimplementation of its main classes (`QwtPlot`, `QwtPlotItem`, `QwtPlotCanvas`, ...) -- supports PyQt5 and PySide2. Another major change is the switch from old-style to new-style signals and slots. The :py:mod:`guiqwt.signals` module is now empty because it used to collect strings for old-style signals: however, it still contains documentation on available signals. Examples ~~~~~~~~ Switching from `PyQwt` to `PythonQwt` in your code:: from PyQt4.Qwt5 import QwtPlot # PyQwt (supports only PyQt4) from qwt import QwtPlot # PythonQwt (supports PyQt5 and PySide2) Switching from `guiqwt 2` to `guiqwt 4`:: plot = get_plot_instance() # plot is a QwtPlot instance ## guiqwt 2: from guiqwt.signals import SIG_ITEM_MOVED plot.connect(plot, SIG_ITEM_MOVED, item_was_moved) ## guiqwt 4: plot.SIG_ITEM_MOVED.connect(item_was_moved) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/overview.rst0000666000000000000000000001351000000000000013074 0ustar00Overview ======== Based on `PythonQwt` (plotting widgets for Python-Qt graphical user interfaces) and on the scientific modules `NumPy` and `SciPy`, `guiqwt` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. Performances ~~~~~~~~~~~~ The most popular Python module for data plotting is currently `matplotlib`, an open-source library providing a lot of plot types and an API (the `pylab` interface) which is very close to MATLAB's plotting interface. `guiqwt` plotting features are quite limited in terms of plot types compared to `matplotlib`. However the currently implemented plot types are much more efficient. For example, the `guiqwt` image showing function (:py:func:`guiqwt.pyplot.imshow`) do not make any copy of the displayed data, hence allowing to show images which are much larger than with its `matplotlib`'s counterpart. In other terms, when showing a 30-MB image (16-bits unsigned integers for example) with `guiqwt`, no additional memory is wasted to display the image (except for the offscreen image of course which depends on the window size) whereas `matplotlib` takes more than 600-MB of additional memory (the original array is duplicated four times using 64-bits float data types). Features ~~~~~~~~ The `guiqwt` library also provides the following features: * :py:mod:`guiqwt.pyplot`: equivalent to :py:mod:`matplotlib.pyplot`, at least for the implemented functions * supported `plot items`: - :py:mod:`guiqwt.curve`: curves and error bar curves - :py:mod:`guiqwt.histogram`: 1D histograms - :py:mod:`guiqwt.image`: images (RGB images are not supported), images with non-linear x/y scales, images with specified pixel size (e.g. loaded from DICOM files), 2D histograms, pseudo-color images (`pcolor`) - :py:mod:`guiqwt.label`: labels, curve plot legends - :py:mod:`guiqwt.shapes`: polygon, polylines, rectangle, circle, ellipse and segment - :py:mod:`guiqwt.annotations`: annotated shapes (shapes with labels showing position and dimensions): rectangle with center position and size, circle with center position and diameter, ellipse with center position and diameters (these items are very useful to measure things directly on displayed images) * curves, images and shapes: * multiple object selection for moving objects or editing their properties through automatically generated dialog boxes (``guidata``) * item list panel: move objects from foreground to background, show/hide objects, remove objects, ... * customizable aspect ratio * a lot of ready-to-use tools: plot canvas export to image file, image snapshot, image rectangular filter, etc. * curves: * interval selection tools with labels showing results of computing on selected area * curve fitting tool with automatic fit, manual fit with sliders, ... * images: * contrast adjustment panel: select the LUT by moving a range selection object on the image levels histogram, eliminate outliers, ... * X-axis and Y-axis cross-sections: support for multiple images, average cross-section tool on a rectangular area, ... * apply any affine transform to displayed images in real-time (rotation, magnification, translation, horizontal/vertical flip, ...) * application development helpers: * ready-to-use curve and image plot widgets and dialog boxes (see :py:mod:`guiqwt.plot`) * load/save graphical objects (curves, images, shapes) * a lot of test scripts which demonstrate `guiqwt` features (see :ref:`examples`) How it works ~~~~~~~~~~~~ A `guiqwt`-based plotting widget may be constructed using one of the following methods: * *Interactive mode*: when manipulating and visualizing data in an interactive Python or IPython interpreter, the :py:mod`guiqwt.pyplot` module provide the easiest way to plot curves, show images and more. Syntax is similar to MATLAB's, thus very easy to learn and to use interactively. * *Script mode*: when manipulating and visualizing data using a script, the :py:mod`guiqwt.pyplot` module is still a good choice as long as you don't need to customize the figure graphical user interface (GUI) layout. However, if you want to add other widgets to the GUI, like menus, buttons and so on, you should rather use plotting widget classes instead of the `pyplot` helper functions. There are two kinds of plotting widgets defined in `guiqwt`: * low-level plotting widgets: :py:class:`guiqwt.curve.CurvePlot` and :py:class:`guiqwt.image.ImagePlot` * high-level plotting widgets (ready-to-use widgets with integrated tools and panels): :py:class:`guiqwt.plot.CurveWidget` and :py:class:`guiqwt.plot.ImageWidget`, and corresponding dialog boxes :py:class:`guiqwt.plot.CurveDialog` and :py:class:`guiqwt.plot.ImageDialog` Curve-related widgets with integrated plot manager: .. image:: images/curve_widgets.png Image-related widgets with integrated plot manager: .. image:: images/image_widgets.png .. seealso:: Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.8611355 guiqwt-4.0.1/doc/reference/0000777000000000000000000000000000000000000012432 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/annotations.rst0000666000000000000000000000004400000000000015517 0ustar00.. automodule:: guiqwt.annotations ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/baseplot.rst0000666000000000000000000000004100000000000014770 0ustar00.. automodule:: guiqwt.baseplot ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/builder.rst0000666000000000000000000000004000000000000014604 0ustar00.. automodule:: guiqwt.builder ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/cross_section.rst0000666000000000000000000000004600000000000016041 0ustar00.. automodule:: guiqwt.cross_section ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/curve.rst0000666000000000000000000000003600000000000014307 0ustar00.. automodule:: guiqwt.curve ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/histogram.rst0000666000000000000000000000004200000000000015155 0ustar00.. automodule:: guiqwt.histogram ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/image.rst0000666000000000000000000000003600000000000014245 0ustar00.. automodule:: guiqwt.image ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/index.rst0000666000000000000000000000053100000000000014272 0ustar00Reference ========= guiqwt API: .. toctree:: :maxdepth: 2 pyplot widgets_fit plot builder panels signals baseplot curve image histogram cross_section annotations shapes label tools styles io widgets_resizedialog widgets_rotatecrop ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/io.rst0000666000000000000000000000003300000000000013567 0ustar00.. automodule:: guiqwt.io ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/label.rst0000666000000000000000000000003600000000000014242 0ustar00.. automodule:: guiqwt.label ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/panels.rst0000666000000000000000000000003700000000000014446 0ustar00.. automodule:: guiqwt.panels ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/plot.rst0000666000000000000000000000003500000000000014140 0ustar00.. automodule:: guiqwt.plot ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/pyplot.rst0000666000000000000000000000003700000000000014513 0ustar00.. automodule:: guiqwt.pyplot ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/shapes.rst0000666000000000000000000000003700000000000014447 0ustar00.. automodule:: guiqwt.shapes ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/signals.rst0000666000000000000000000000004000000000000014616 0ustar00.. automodule:: guiqwt.signals ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/styles.rst0000666000000000000000000000003700000000000014507 0ustar00.. automodule:: guiqwt.styles ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/tools.rst0000666000000000000000000000003600000000000014323 0ustar00.. automodule:: guiqwt.tools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237187.0 guiqwt-4.0.1/doc/reference/widgets_fit.rst0000666000000000000000000000004400000000000015472 0ustar00.. automodule:: guiqwt.widgets.fit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237198.0 guiqwt-4.0.1/doc/reference/widgets_resizedialog.rst0000666000000000000000000000005500000000000017373 0ustar00.. automodule:: guiqwt.widgets.resizedialog ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444237198.0 guiqwt-4.0.1/doc/reference/widgets_rotatecrop.rst0000666000000000000000000000005300000000000017072 0ustar00.. automodule:: guiqwt.widgets.rotatecrop ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/doc/sift.rst0000666000000000000000000000157600000000000012204 0ustar00Sift, the Signal and Image Filtering Tool ========================================= `Sift` is a simple signal and image processing application based on ``guiqwt`` and ``guidata``. .. image:: images/screenshots/sift1.png Note that `Sift` includes an embedded Python console to manipulate directly the signal and image objects (see screenshot below). .. image:: images/screenshots/sift3.png Even if it could be extended with powerful features like its closed-source counterpart, `Sift` is quite limited in its current implementation. For now, its main purpose is to show how to create easily and rapidly your own signal/image processing application using ``guidata`` and ``guiqwt``. .. image:: images/screenshots/sift2.png .. literalinclude:: ../guiqwt/tests/sift.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.9392579 guiqwt-4.0.1/guiqwt/0000777000000000000000000000000000000000000011247 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625820.0 guiqwt-4.0.1/guiqwt/__init__.py0000666000000000000000000006326100000000000013370 0ustar00# -*- coding: utf-8 -*- """ guiqwt ====== Based on `PythonQwt` (plotting widgets for Qt graphical user interfaces) and on the scientific modules NumPy and SciPy, `guiqwt` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. .. image:: images/panorama.png External resources: * Python Package Index: `PyPI`_ * Bug reports and feature requests: `GitHub`_ * Help, support and discussions around the project: `GoogleGroup`_ .. _PyPI: https://pypi.python.org/pypi/guiqwt .. _GitHub: https://github.com/PierreRaybaut/guiqwt .. _GoogleGroup: http://groups.google.fr/group/guidata_guiqwt """ __version__ = "4.0.1" __description__ = ( "guiqwt is a set of tools for curve and image plotting " "(extension to PythonQwt)" ) def about(html=True, copyright_only=False): """Return text about this package""" import sys, os, os.path as osp, platform, guidata, guiqwt, qwt from guiqwt.config import _ from qtpy import QtCore as QC name = __file__.split(osp.sep)[-2] tf1 = (name, __version__, __description__) tf2 = ( platform.python_version(), "64 bits" if sys.maxsize > 2 ** 32 else "32 bits", QC.__version__, qwt.__version__, guidata.__version__, guiqwt.__version__, _("on"), platform.system(), ) if html: short_desc = ( "This widget is powered by %s v%s" "

%s

Created by Pierre Raybaut" % tf1 ) desc = ( "Copyright © 2010-2016 CEA" "

Python %s %s, Qt %s, " "PythonQwt %s, guidata %s, guiqwt %s %s %s" % tf2 ) if not copyright_only: desc = short_desc + "
" + desc else: short_desc = ( """%s v%s : %s Created by Pierre Raybaut""" % tf1 ) desc = ( """Copyright (c) 2010-2016 CEA Python %s %s, Qt %s, PythonQwt %s, guidata %s, guiqwt %s %s %s""" % tf2 ) if not copyright_only: desc = short_desc + os.linesep + desc return desc # Dear (Debian, RPM, ...) package makers, please feel free to customize the # following path to module's data (images) and translations: DATAPATH = LOCALEPATH = "" # XXX: image.py: BaseImageItem.get_histogram: histo1 or histo2 ??? # one version is faster but currently buggy for integers # Copyright © 2009-2015 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License (see below) # LICENSE TERMS: # ------------- # # CeCILL FREE SOFTWARE LICENSE AGREEMENT # # # Notice # # This Agreement is a Free Software license agreement that is the result # of discussions between its authors in order to ensure compliance with # the two main principles guiding its drafting: # # * firstly, compliance with the principles governing the distribution # of Free Software: access to source code, broad rights granted to # users, # * secondly, the election of a governing law, French law, with which # it is conformant, both as regards the law of torts and # intellectual property law, and the protection that it offers to # both authors and holders of the economic rights over software. # # The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) # license are: # # Commissariat à l'Energie Atomique - CEA, a public scientific, technical # and industrial research establishment, having its principal place of # business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. # # Centre National de la Recherche Scientifique - CNRS, a public scientific # and technological establishment, having its principal place of business # at 3 rue Michel-Ange, 75794 Paris cedex 16, France. # # Institut National de Recherche en Informatique et en Automatique - # INRIA, a public scientific and technological establishment, having its # principal place of business at Domaine de Voluceau, Rocquencourt, BP # 105, 78153 Le Chesnay cedex, France. # # # Preamble # # The purpose of this Free Software license agreement is to grant users # the right to modify and redistribute the software governed by this # license within the framework of an open source distribution model. # # The exercising of these rights is conditional upon certain obligations # for users so as to preserve this status for all subsequent redistributions. # # In consideration of access to the source code and the rights to copy, # modify and redistribute granted by the license, users are provided only # with a limited warranty and the software's author, the holder of the # economic rights, and the successive licensors only have limited liability. # # In this respect, the risks associated with loading, using, modifying # and/or developing or reproducing the software by the user are brought to # the user's attention, given its Free Software status, which may make it # complicated to use, with the result that its use is reserved for # developers and experienced professionals having in-depth computer # knowledge. Users are therefore encouraged to load and test the # suitability of the software as regards their requirements in conditions # enabling the security of their systems and/or data to be ensured and, # more generally, to use and operate it in the same conditions of # security. This Agreement may be freely reproduced and published, # provided it is not altered, and that no provisions are either added or # removed herefrom. # # This Agreement may apply to any or all software for which the holder of # the economic rights decides to submit the use thereof to its provisions. # # # Article 1 - DEFINITIONS # # For the purpose of this Agreement, when the following expressions # commence with a capital letter, they shall have the following meaning: # # Agreement: means this license agreement, and its possible subsequent # versions and annexes. # # Software: means the software in its Object Code and/or Source Code form # and, where applicable, its documentation, "as is" when the Licensee # accepts the Agreement. # # Initial Software: means the Software in its Source Code and possibly its # Object Code form and, where applicable, its documentation, "as is" when # it is first distributed under the terms and conditions of the Agreement. # # Modified Software: means the Software modified by at least one # Contribution. # # Source Code: means all the Software's instructions and program lines to # which access is required so as to modify the Software. # # Object Code: means the binary files originating from the compilation of # the Source Code. # # Holder: means the holder(s) of the economic rights over the Initial # Software. # # Licensee: means the Software user(s) having accepted the Agreement. # # Contributor: means a Licensee having made at least one Contribution. # # Licensor: means the Holder, or any other individual or legal entity, who # distributes the Software under the Agreement. # # Contribution: means any or all modifications, corrections, translations, # adaptations and/or new functions integrated into the Software by any or # all Contributors, as well as any or all Internal Modules. # # Module: means a set of sources files including their documentation that # enables supplementary functions or services in addition to those offered # by the Software. # # External Module: means any or all Modules, not derived from the # Software, so that this Module and the Software run in separate address # spaces, with one calling the other when they are run. # # Internal Module: means any or all Module, connected to the Software so # that they both execute in the same address space. # # GNU GPL: means the GNU General Public License version 2 or any # subsequent version, as published by the Free Software Foundation Inc. # # Parties: mean both the Licensee and the Licensor. # # These expressions may be used both in singular and plural form. # # # Article 2 - PURPOSE # # The purpose of the Agreement is the grant by the Licensor to the # Licensee of a non-exclusive, transferable and worldwide license for the # Software as set forth in Article 5 hereinafter for the whole term of the # protection granted by the rights over said Software. # # # Article 3 - ACCEPTANCE # # 3.1 The Licensee shall be deemed as having accepted the terms and # conditions of this Agreement upon the occurrence of the first of the # following events: # # * (i) loading the Software by any or all means, notably, by # downloading from a remote server, or by loading from a physical # medium; # * (ii) the first time the Licensee exercises any of the rights # granted hereunder. # # 3.2 One copy of the Agreement, containing a notice relating to the # characteristics of the Software, to the limited warranty, and to the # fact that its use is restricted to experienced users has been provided # to the Licensee prior to its acceptance as set forth in Article 3.1 # hereinabove, and the Licensee hereby acknowledges that it has read and # understood it. # # # Article 4 - EFFECTIVE DATE AND TERM # # # 4.1 EFFECTIVE DATE # # The Agreement shall become effective on the date when it is accepted by # the Licensee as set forth in Article 3.1. # # # 4.2 TERM # # The Agreement shall remain in force for the entire legal term of # protection of the economic rights over the Software. # # # Article 5 - SCOPE OF RIGHTS GRANTED # # The Licensor hereby grants to the Licensee, who accepts, the following # rights over the Software for any or all use, and for the term of the # Agreement, on the basis of the terms and conditions set forth hereinafter. # # Besides, if the Licensor owns or comes to own one or more patents # protecting all or part of the functions of the Software or of its # components, the Licensor undertakes not to enforce the rights granted by # these patents against successive Licensees using, exploiting or # modifying the Software. If these patents are transferred, the Licensor # undertakes to have the transferees subscribe to the obligations set # forth in this paragraph. # # # 5.1 RIGHT OF USE # # The Licensee is authorized to use the Software, without any limitation # as to its fields of application, with it being hereinafter specified # that this comprises: # # 1. permanent or temporary reproduction of all or part of the Software # by any or all means and in any or all form. # # 2. loading, displaying, running, or storing the Software on any or # all medium. # # 3. entitlement to observe, study or test its operation so as to # determine the ideas and principles behind any or all constituent # elements of said Software. This shall apply when the Licensee # carries out any or all loading, displaying, running, transmission # or storage operation as regards the Software, that it is entitled # to carry out hereunder. # # # 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS # # The right to make Contributions includes the right to translate, adapt, # arrange, or make any or all modifications to the Software, and the right # to reproduce the resulting software. # # The Licensee is authorized to make any or all Contributions to the # Software provided that it includes an explicit notice that it is the # author of said Contribution and indicates the date of the creation thereof. # # # 5.3 RIGHT OF DISTRIBUTION # # In particular, the right of distribution includes the right to publish, # transmit and communicate the Software to the general public on any or # all medium, and by any or all means, and the right to market, either in # consideration of a fee, or free of charge, one or more copies of the # Software by any means. # # The Licensee is further authorized to distribute copies of the modified # or unmodified Software to third parties according to the terms and # conditions set forth hereinafter. # # # 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION # # The Licensee is authorized to distribute true copies of the Software in # Source Code or Object Code form, provided that said distribution # complies with all the provisions of the Agreement and is accompanied by: # # 1. a copy of the Agreement, # # 2. a notice relating to the limitation of both the Licensor's # warranty and liability as set forth in Articles 8 and 9, # # and that, in the event that only the Object Code of the Software is # redistributed, the Licensee allows future Licensees unhindered access to # the full Source Code of the Software by indicating how to access it, it # being understood that the additional cost of acquiring the Source Code # shall not exceed the cost of transferring the data. # # # 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE # # When the Licensee makes a Contribution to the Software, the terms and # conditions for the distribution of the resulting Modified Software # become subject to all the provisions of this Agreement. # # The Licensee is authorized to distribute the Modified Software, in # source code or object code form, provided that said distribution # complies with all the provisions of the Agreement and is accompanied by: # # 1. a copy of the Agreement, # # 2. a notice relating to the limitation of both the Licensor's # warranty and liability as set forth in Articles 8 and 9, # # and that, in the event that only the object code of the Modified # Software is redistributed, the Licensee allows future Licensees # unhindered access to the full source code of the Modified Software by # indicating how to access it, it being understood that the additional # cost of acquiring the source code shall not exceed the cost of # transferring the data. # # # 5.3.3 DISTRIBUTION OF EXTERNAL MODULES # # When the Licensee has developed an External Module, the terms and # conditions of this Agreement do not apply to said External Module, that # may be distributed under a separate license agreement. # # # 5.3.4 COMPATIBILITY WITH THE GNU GPL # # The Licensee can include a code that is subject to the provisions of one # of the versions of the GNU GPL in the Modified or unmodified Software, # and distribute that entire code under the terms of the same version of # the GNU GPL. # # The Licensee can include the Modified or unmodified Software in a code # that is subject to the provisions of one of the versions of the GNU GPL, # and distribute that entire code under the terms of the same version of # the GNU GPL. # # # Article 6 - INTELLECTUAL PROPERTY # # # 6.1 OVER THE INITIAL SOFTWARE # # The Holder owns the economic rights over the Initial Software. Any or # all use of the Initial Software is subject to compliance with the terms # and conditions under which the Holder has elected to distribute its work # and no one shall be entitled to modify the terms and conditions for the # distribution of said Initial Software. # # The Holder undertakes that the Initial Software will remain ruled at # least by this Agreement, for the duration set forth in Article 4.2. # # # 6.2 OVER THE CONTRIBUTIONS # # The Licensee who develops a Contribution is the owner of the # intellectual property rights over this Contribution as defined by # applicable law. # # # 6.3 OVER THE EXTERNAL MODULES # # The Licensee who develops an External Module is the owner of the # intellectual property rights over this External Module as defined by # applicable law and is free to choose the type of agreement that shall # govern its distribution. # # # 6.4 JOINT PROVISIONS # # The Licensee expressly undertakes: # # 1. not to remove, or modify, in any manner, the intellectual property # notices attached to the Software; # # 2. to reproduce said notices, in an identical manner, in the copies # of the Software modified or not. # # The Licensee undertakes not to directly or indirectly infringe the # intellectual property rights of the Holder and/or Contributors on the # Software and to take, where applicable, vis-à-vis its staff, any and all # measures required to ensure respect of said intellectual property rights # of the Holder and/or Contributors. # # # Article 7 - RELATED SERVICES # # 7.1 Under no circumstances shall the Agreement oblige the Licensor to # provide technical assistance or maintenance services for the Software. # # However, the Licensor is entitled to offer this type of services. The # terms and conditions of such technical assistance, and/or such # maintenance, shall be set forth in a separate instrument. Only the # Licensor offering said maintenance and/or technical assistance services # shall incur liability therefor. # # 7.2 Similarly, any Licensor is entitled to offer to its licensees, under # its sole responsibility, a warranty, that shall only be binding upon # itself, for the redistribution of the Software and/or the Modified # Software, under terms and conditions that it is free to decide. Said # warranty, and the financial terms and conditions of its application, # shall be subject of a separate instrument executed between the Licensor # and the Licensee. # # # Article 8 - LIABILITY # # 8.1 Subject to the provisions of Article 8.2, the Licensee shall be # entitled to claim compensation for any direct loss it may have suffered # from the Software as a result of a fault on the part of the relevant # Licensor, subject to providing evidence thereof. # # 8.2 The Licensor's liability is limited to the commitments made under # this Agreement and shall not be incurred as a result of in particular: # (i) loss due the Licensee's total or partial failure to fulfill its # obligations, (ii) direct or consequential loss that is suffered by the # Licensee due to the use or performance of the Software, and (iii) more # generally, any consequential loss. In particular the Parties expressly # agree that any or all pecuniary or business loss (i.e. loss of data, # loss of profits, operating loss, loss of customers or orders, # opportunity cost, any disturbance to business activities) or any or all # legal proceedings instituted against the Licensee by a third party, # shall constitute consequential loss and shall not provide entitlement to # any or all compensation from the Licensor. # # # Article 9 - WARRANTY # # 9.1 The Licensee acknowledges that the scientific and technical # state-of-the-art when the Software was distributed did not enable all # possible uses to be tested and verified, nor for the presence of # possible defects to be detected. In this respect, the Licensee's # attention has been drawn to the risks associated with loading, using, # modifying and/or developing and reproducing the Software which are # reserved for experienced users. # # The Licensee shall be responsible for verifying, by any or all means, # the suitability of the product for its requirements, its good working # order, and for ensuring that it shall not cause damage to either persons # or properties. # # 9.2 The Licensor hereby represents, in good faith, that it is entitled # to grant all the rights over the Software (including in particular the # rights set forth in Article 5). # # 9.3 The Licensee acknowledges that the Software is supplied "as is" by # the Licensor without any other express or tacit warranty, other than # that provided for in Article 9.2 and, in particular, without any warranty # as to its commercial value, its secured, safe, innovative or relevant # nature. # # Specifically, the Licensor does not warrant that the Software is free # from any error, that it will operate without interruption, that it will # be compatible with the Licensee's own equipment and software # configuration, nor that it will meet the Licensee's requirements. # # 9.4 The Licensor does not either expressly or tacitly warrant that the # Software does not infringe any third party intellectual property right # relating to a patent, software or any other property right. Therefore, # the Licensor disclaims any and all liability towards the Licensee # arising out of any or all proceedings for infringement that may be # instituted in respect of the use, modification and redistribution of the # Software. Nevertheless, should such proceedings be instituted against # the Licensee, the Licensor shall provide it with technical and legal # assistance for its defense. Such technical and legal assistance shall be # decided on a case-by-case basis between the relevant Licensor and the # Licensee pursuant to a memorandum of understanding. The Licensor # disclaims any and all liability as regards the Licensee's use of the # name of the Software. No warranty is given as regards the existence of # prior rights over the name of the Software or as regards the existence # of a trademark. # # # Article 10 - TERMINATION # # 10.1 In the event of a breach by the Licensee of its obligations # hereunder, the Licensor may automatically terminate this Agreement # thirty (30) days after notice has been sent to the Licensee and has # remained ineffective. # # 10.2 A Licensee whose Agreement is terminated shall no longer be # authorized to use, modify or distribute the Software. However, any # licenses that it may have granted prior to termination of the Agreement # shall remain valid subject to their having been granted in compliance # with the terms and conditions hereof. # # # Article 11 - MISCELLANEOUS # # # 11.1 EXCUSABLE EVENTS # # Neither Party shall be liable for any or all delay, or failure to # perform the Agreement, that may be attributable to an event of force # majeure, an act of God or an outside cause, such as defective # functioning or interruptions of the electricity or telecommunications # networks, network paralysis following a virus attack, intervention by # government authorities, natural disasters, water damage, earthquakes, # fire, explosions, strikes and labor unrest, war, etc. # # 11.2 Any failure by either Party, on one or more occasions, to invoke # one or more of the provisions hereof, shall under no circumstances be # interpreted as being a waiver by the interested Party of its right to # invoke said provision(s) subsequently. # # 11.3 The Agreement cancels and replaces any or all previous agreements, # whether written or oral, between the Parties and having the same # purpose, and constitutes the entirety of the agreement between said # Parties concerning said purpose. No supplement or modification to the # terms and conditions hereof shall be effective as between the Parties # unless it is made in writing and signed by their duly authorized # representatives. # # 11.4 In the event that one or more of the provisions hereof were to # conflict with a current or future applicable act or legislative text, # said act or legislative text shall prevail, and the Parties shall make # the necessary amendments so as to comply with said act or legislative # text. All other provisions shall remain effective. Similarly, invalidity # of a provision of the Agreement, for any reason whatsoever, shall not # cause the Agreement as a whole to be invalid. # # # 11.5 LANGUAGE # # The Agreement is drafted in both French and English and both versions # are deemed authentic. # # # Article 12 - NEW VERSIONS OF THE AGREEMENT # # 12.1 Any person is authorized to duplicate and distribute copies of this # Agreement. # # 12.2 So as to ensure coherence, the wording of this Agreement is # protected and may only be modified by the authors of the License, who # reserve the right to periodically publish updates or new versions of the # Agreement, each with a separate number. These subsequent versions may # address new issues encountered by Free Software. # # 12.3 Any Software distributed under a given version of the Agreement may # only be subsequently distributed under the same version of the Agreement # or a subsequent version, subject to the provisions of Article 5.3.4. # # # Article 13 - GOVERNING LAW AND JURISDICTION # # 13.1 The Agreement is governed by French law. The Parties agree to # endeavor to seek an amicable solution to any disagreements or disputes # that may arise during the performance of the Agreement. # # 13.2 Failing an amicable solution within two (2) months as from their # occurrence, and unless emergency proceedings are necessary, the # disagreements or disputes shall be referred to the Paris Courts having # jurisdiction, by the more diligent Party. # # # Version 2.0 dated 2006-09-05. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/_cm.py0000666000000000000000000146715700000000000012404 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ Color data and pre-defined cmap objects. This is a helper for cm.py, originally part of that file. Separating the data (this file) from cm.py makes both easier to deal with. Objects visible in cm.py are the individual cmap objects ('autumn', etc.) and a dictionary, 'datad', including all of these objects. """ # pylint: disable-msg=C0103 # pylint: disable-msg=C0301 # pylint: disable-msg=C0302 _binary_data = { "red": ((0.0, 1.0, 1.0), (1.0, 0.0, 0.0)), "green": ((0.0, 1.0, 1.0), (1.0, 0.0, 0.0)), "blue": ((0.0, 1.0, 1.0), (1.0, 0.0, 0.0)), } _bone_data = { "red": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "green": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "blue": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), } _autumn_data = { "red": ((0.0, 1.0, 1.0), (1.0, 1.0, 1.0)), "green": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "blue": ((0.0, 0.0, 0.0), (1.0, 0.0, 0.0)), } _bone_data = { "red": ((0.0, 0.0, 0.0), (0.746032, 0.652778, 0.652778), (1.0, 1.0, 1.0)), "green": ( (0.0, 0.0, 0.0), (0.365079, 0.319444, 0.319444), (0.746032, 0.777778, 0.777778), (1.0, 1.0, 1.0), ), "blue": ((0.0, 0.0, 0.0), (0.365079, 0.444444, 0.444444), (1.0, 1.0, 1.0)), } _cool_data = { "red": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "green": ((0.0, 1.0, 1.0), (1.0, 0.0, 0.0)), "blue": ((0.0, 1.0, 1.0), (1.0, 1.0, 1.0)), } _copper_data = { "red": ((0.0, 0.0, 0.0), (0.809524, 1.000000, 1.000000), (1.0, 1.0, 1.0)), "green": ((0.0, 0.0, 0.0), (1.0, 0.7812, 0.7812)), "blue": ((0.0, 0.0, 0.0), (1.0, 0.4975, 0.4975)), } _flag_data = { "red": ( (0.0, 1.0, 1.0), (0.015873, 1.000000, 1.000000), (0.031746, 0.000000, 0.000000), (0.047619, 0.000000, 0.000000), (0.063492, 1.000000, 1.000000), (0.079365, 1.000000, 1.000000), (0.095238, 0.000000, 0.000000), (0.111111, 0.000000, 0.000000), (0.126984, 1.000000, 1.000000), (0.142857, 1.000000, 1.000000), (0.158730, 0.000000, 0.000000), (0.174603, 0.000000, 0.000000), (0.190476, 1.000000, 1.000000), (0.206349, 1.000000, 1.000000), (0.222222, 0.000000, 0.000000), (0.238095, 0.000000, 0.000000), (0.253968, 1.000000, 1.000000), (0.269841, 1.000000, 1.000000), (0.285714, 0.000000, 0.000000), (0.301587, 0.000000, 0.000000), (0.317460, 1.000000, 1.000000), (0.333333, 1.000000, 1.000000), (0.349206, 0.000000, 0.000000), (0.365079, 0.000000, 0.000000), (0.380952, 1.000000, 1.000000), (0.396825, 1.000000, 1.000000), (0.412698, 0.000000, 0.000000), (0.428571, 0.000000, 0.000000), (0.444444, 1.000000, 1.000000), (0.460317, 1.000000, 1.000000), (0.476190, 0.000000, 0.000000), (0.492063, 0.000000, 0.000000), (0.507937, 1.000000, 1.000000), (0.523810, 1.000000, 1.000000), (0.539683, 0.000000, 0.000000), (0.555556, 0.000000, 0.000000), (0.571429, 1.000000, 1.000000), (0.587302, 1.000000, 1.000000), (0.603175, 0.000000, 0.000000), (0.619048, 0.000000, 0.000000), (0.634921, 1.000000, 1.000000), (0.650794, 1.000000, 1.000000), (0.666667, 0.000000, 0.000000), (0.682540, 0.000000, 0.000000), (0.698413, 1.000000, 1.000000), (0.714286, 1.000000, 1.000000), (0.730159, 0.000000, 0.000000), (0.746032, 0.000000, 0.000000), (0.761905, 1.000000, 1.000000), (0.777778, 1.000000, 1.000000), (0.793651, 0.000000, 0.000000), (0.809524, 0.000000, 0.000000), (0.825397, 1.000000, 1.000000), (0.841270, 1.000000, 1.000000), (0.857143, 0.000000, 0.000000), (0.873016, 0.000000, 0.000000), (0.888889, 1.000000, 1.000000), (0.904762, 1.000000, 1.000000), (0.920635, 0.000000, 0.000000), (0.936508, 0.000000, 0.000000), (0.952381, 1.000000, 1.000000), (0.968254, 1.000000, 1.000000), (0.984127, 0.000000, 0.000000), (1.0, 0.0, 0.0), ), "green": ( (0.0, 0.0, 0.0), (0.015873, 1.000000, 1.000000), (0.031746, 0.000000, 0.000000), (0.063492, 0.000000, 0.000000), (0.079365, 1.000000, 1.000000), (0.095238, 0.000000, 0.000000), (0.126984, 0.000000, 0.000000), (0.142857, 1.000000, 1.000000), (0.158730, 0.000000, 0.000000), (0.190476, 0.000000, 0.000000), (0.206349, 1.000000, 1.000000), (0.222222, 0.000000, 0.000000), (0.253968, 0.000000, 0.000000), (0.269841, 1.000000, 1.000000), (0.285714, 0.000000, 0.000000), (0.317460, 0.000000, 0.000000), (0.333333, 1.000000, 1.000000), (0.349206, 0.000000, 0.000000), (0.380952, 0.000000, 0.000000), (0.396825, 1.000000, 1.000000), (0.412698, 0.000000, 0.000000), (0.444444, 0.000000, 0.000000), (0.460317, 1.000000, 1.000000), (0.476190, 0.000000, 0.000000), (0.507937, 0.000000, 0.000000), (0.523810, 1.000000, 1.000000), (0.539683, 0.000000, 0.000000), (0.571429, 0.000000, 0.000000), (0.587302, 1.000000, 1.000000), (0.603175, 0.000000, 0.000000), (0.634921, 0.000000, 0.000000), (0.650794, 1.000000, 1.000000), (0.666667, 0.000000, 0.000000), (0.698413, 0.000000, 0.000000), (0.714286, 1.000000, 1.000000), (0.730159, 0.000000, 0.000000), (0.761905, 0.000000, 0.000000), (0.777778, 1.000000, 1.000000), (0.793651, 0.000000, 0.000000), (0.825397, 0.000000, 0.000000), (0.841270, 1.000000, 1.000000), (0.857143, 0.000000, 0.000000), (0.888889, 0.000000, 0.000000), (0.904762, 1.000000, 1.000000), (0.920635, 0.000000, 0.000000), (0.952381, 0.000000, 0.000000), (0.968254, 1.000000, 1.000000), (0.984127, 0.000000, 0.000000), (1.0, 0.0, 0.0), ), "blue": ( (0.0, 0.0, 0.0), (0.015873, 1.000000, 1.000000), (0.031746, 1.000000, 1.000000), (0.047619, 0.000000, 0.000000), (0.063492, 0.000000, 0.000000), (0.079365, 1.000000, 1.000000), (0.095238, 1.000000, 1.000000), (0.111111, 0.000000, 0.000000), (0.126984, 0.000000, 0.000000), (0.142857, 1.000000, 1.000000), (0.158730, 1.000000, 1.000000), (0.174603, 0.000000, 0.000000), (0.190476, 0.000000, 0.000000), (0.206349, 1.000000, 1.000000), (0.222222, 1.000000, 1.000000), (0.238095, 0.000000, 0.000000), (0.253968, 0.000000, 0.000000), (0.269841, 1.000000, 1.000000), (0.285714, 1.000000, 1.000000), (0.301587, 0.000000, 0.000000), (0.317460, 0.000000, 0.000000), (0.333333, 1.000000, 1.000000), (0.349206, 1.000000, 1.000000), (0.365079, 0.000000, 0.000000), (0.380952, 0.000000, 0.000000), (0.396825, 1.000000, 1.000000), (0.412698, 1.000000, 1.000000), (0.428571, 0.000000, 0.000000), (0.444444, 0.000000, 0.000000), (0.460317, 1.000000, 1.000000), (0.476190, 1.000000, 1.000000), (0.492063, 0.000000, 0.000000), (0.507937, 0.000000, 0.000000), (0.523810, 1.000000, 1.000000), (0.539683, 1.000000, 1.000000), (0.555556, 0.000000, 0.000000), (0.571429, 0.000000, 0.000000), (0.587302, 1.000000, 1.000000), (0.603175, 1.000000, 1.000000), (0.619048, 0.000000, 0.000000), (0.634921, 0.000000, 0.000000), (0.650794, 1.000000, 1.000000), (0.666667, 1.000000, 1.000000), (0.682540, 0.000000, 0.000000), (0.698413, 0.000000, 0.000000), (0.714286, 1.000000, 1.000000), (0.730159, 1.000000, 1.000000), (0.746032, 0.000000, 0.000000), (0.761905, 0.000000, 0.000000), (0.777778, 1.000000, 1.000000), (0.793651, 1.000000, 1.000000), (0.809524, 0.000000, 0.000000), (0.825397, 0.000000, 0.000000), (0.841270, 1.000000, 1.000000), (0.857143, 1.000000, 1.000000), (0.873016, 0.000000, 0.000000), (0.888889, 0.000000, 0.000000), (0.904762, 1.000000, 1.000000), (0.920635, 1.000000, 1.000000), (0.936508, 0.000000, 0.000000), (0.952381, 0.000000, 0.000000), (0.968254, 1.000000, 1.000000), (0.984127, 1.000000, 1.000000), (1.0, 0.0, 0.0), ), } _gray_data = { "red": ((0.0, 0, 0), (1.0, 1, 1)), "green": ((0.0, 0, 0), (1.0, 1, 1)), "blue": ((0.0, 0, 0), (1.0, 1, 1)), } _hot_data = { "red": ((0.0, 0.0416, 0.0416), (0.365079, 1.000000, 1.000000), (1.0, 1.0, 1.0)), "green": ( (0.0, 0.0, 0.0), (0.365079, 0.000000, 0.000000), (0.746032, 1.000000, 1.000000), (1.0, 1.0, 1.0), ), "blue": ((0.0, 0.0, 0.0), (0.746032, 0.000000, 0.000000), (1.0, 1.0, 1.0)), } _hsv_data = { "red": ( (0.0, 1.0, 1.0), (0.158730, 1.000000, 1.000000), (0.174603, 0.968750, 0.968750), (0.333333, 0.031250, 0.031250), (0.349206, 0.000000, 0.000000), (0.666667, 0.000000, 0.000000), (0.682540, 0.031250, 0.031250), (0.841270, 0.968750, 0.968750), (0.857143, 1.000000, 1.000000), (1.0, 1.0, 1.0), ), "green": ( (0.0, 0.0, 0.0), (0.158730, 0.937500, 0.937500), (0.174603, 1.000000, 1.000000), (0.507937, 1.000000, 1.000000), (0.666667, 0.062500, 0.062500), (0.682540, 0.000000, 0.000000), (1.0, 0.0, 0.0), ), "blue": ( (0.0, 0.0, 0.0), (0.333333, 0.000000, 0.000000), (0.349206, 0.062500, 0.062500), (0.507937, 1.000000, 1.000000), (0.841270, 1.000000, 1.000000), (0.857143, 0.937500, 0.937500), (1.0, 0.09375, 0.09375), ), } _jet_data = { "red": ((0.0, 0, 0), (0.35, 0, 0), (0.66, 1, 1), (0.89, 1, 1), (1, 0.5, 0.5)), "green": ( (0.0, 0, 0), (0.125, 0, 0), (0.375, 1, 1), (0.64, 1, 1), (0.91, 0, 0), (1, 0, 0), ), "blue": ((0.0, 0.5, 0.5), (0.11, 1, 1), (0.34, 1, 1), (0.65, 0, 0), (1, 0, 0)), } _pink_data = { "red": ( (0.0, 0.1178, 0.1178), (0.015873, 0.195857, 0.195857), (0.031746, 0.250661, 0.250661), (0.047619, 0.295468, 0.295468), (0.063492, 0.334324, 0.334324), (0.079365, 0.369112, 0.369112), (0.095238, 0.400892, 0.400892), (0.111111, 0.430331, 0.430331), (0.126984, 0.457882, 0.457882), (0.142857, 0.483867, 0.483867), (0.158730, 0.508525, 0.508525), (0.174603, 0.532042, 0.532042), (0.190476, 0.554563, 0.554563), (0.206349, 0.576204, 0.576204), (0.222222, 0.597061, 0.597061), (0.238095, 0.617213, 0.617213), (0.253968, 0.636729, 0.636729), (0.269841, 0.655663, 0.655663), (0.285714, 0.674066, 0.674066), (0.301587, 0.691980, 0.691980), (0.317460, 0.709441, 0.709441), (0.333333, 0.726483, 0.726483), (0.349206, 0.743134, 0.743134), (0.365079, 0.759421, 0.759421), (0.380952, 0.766356, 0.766356), (0.396825, 0.773229, 0.773229), (0.412698, 0.780042, 0.780042), (0.428571, 0.786796, 0.786796), (0.444444, 0.793492, 0.793492), (0.460317, 0.800132, 0.800132), (0.476190, 0.806718, 0.806718), (0.492063, 0.813250, 0.813250), (0.507937, 0.819730, 0.819730), (0.523810, 0.826160, 0.826160), (0.539683, 0.832539, 0.832539), (0.555556, 0.838870, 0.838870), (0.571429, 0.845154, 0.845154), (0.587302, 0.851392, 0.851392), (0.603175, 0.857584, 0.857584), (0.619048, 0.863731, 0.863731), (0.634921, 0.869835, 0.869835), (0.650794, 0.875897, 0.875897), (0.666667, 0.881917, 0.881917), (0.682540, 0.887896, 0.887896), (0.698413, 0.893835, 0.893835), (0.714286, 0.899735, 0.899735), (0.730159, 0.905597, 0.905597), (0.746032, 0.911421, 0.911421), (0.761905, 0.917208, 0.917208), (0.777778, 0.922958, 0.922958), (0.793651, 0.928673, 0.928673), (0.809524, 0.934353, 0.934353), (0.825397, 0.939999, 0.939999), (0.841270, 0.945611, 0.945611), (0.857143, 0.951190, 0.951190), (0.873016, 0.956736, 0.956736), (0.888889, 0.962250, 0.962250), (0.904762, 0.967733, 0.967733), (0.920635, 0.973185, 0.973185), (0.936508, 0.978607, 0.978607), (0.952381, 0.983999, 0.983999), (0.968254, 0.989361, 0.989361), (0.984127, 0.994695, 0.994695), (1.0, 1.0, 1.0), ), "green": ( (0.0, 0.0, 0.0), (0.015873, 0.102869, 0.102869), (0.031746, 0.145479, 0.145479), (0.047619, 0.178174, 0.178174), (0.063492, 0.205738, 0.205738), (0.079365, 0.230022, 0.230022), (0.095238, 0.251976, 0.251976), (0.111111, 0.272166, 0.272166), (0.126984, 0.290957, 0.290957), (0.142857, 0.308607, 0.308607), (0.158730, 0.325300, 0.325300), (0.174603, 0.341178, 0.341178), (0.190476, 0.356348, 0.356348), (0.206349, 0.370899, 0.370899), (0.222222, 0.384900, 0.384900), (0.238095, 0.398410, 0.398410), (0.253968, 0.411476, 0.411476), (0.269841, 0.424139, 0.424139), (0.285714, 0.436436, 0.436436), (0.301587, 0.448395, 0.448395), (0.317460, 0.460044, 0.460044), (0.333333, 0.471405, 0.471405), (0.349206, 0.482498, 0.482498), (0.365079, 0.493342, 0.493342), (0.380952, 0.517549, 0.517549), (0.396825, 0.540674, 0.540674), (0.412698, 0.562849, 0.562849), (0.428571, 0.584183, 0.584183), (0.444444, 0.604765, 0.604765), (0.460317, 0.624669, 0.624669), (0.476190, 0.643958, 0.643958), (0.492063, 0.662687, 0.662687), (0.507937, 0.680900, 0.680900), (0.523810, 0.698638, 0.698638), (0.539683, 0.715937, 0.715937), (0.555556, 0.732828, 0.732828), (0.571429, 0.749338, 0.749338), (0.587302, 0.765493, 0.765493), (0.603175, 0.781313, 0.781313), (0.619048, 0.796819, 0.796819), (0.634921, 0.812029, 0.812029), (0.650794, 0.826960, 0.826960), (0.666667, 0.841625, 0.841625), (0.682540, 0.856040, 0.856040), (0.698413, 0.870216, 0.870216), (0.714286, 0.884164, 0.884164), (0.730159, 0.897896, 0.897896), (0.746032, 0.911421, 0.911421), (0.761905, 0.917208, 0.917208), (0.777778, 0.922958, 0.922958), (0.793651, 0.928673, 0.928673), (0.809524, 0.934353, 0.934353), (0.825397, 0.939999, 0.939999), (0.841270, 0.945611, 0.945611), (0.857143, 0.951190, 0.951190), (0.873016, 0.956736, 0.956736), (0.888889, 0.962250, 0.962250), (0.904762, 0.967733, 0.967733), (0.920635, 0.973185, 0.973185), (0.936508, 0.978607, 0.978607), (0.952381, 0.983999, 0.983999), (0.968254, 0.989361, 0.989361), (0.984127, 0.994695, 0.994695), (1.0, 1.0, 1.0), ), "blue": ( (0.0, 0.0, 0.0), (0.015873, 0.102869, 0.102869), (0.031746, 0.145479, 0.145479), (0.047619, 0.178174, 0.178174), (0.063492, 0.205738, 0.205738), (0.079365, 0.230022, 0.230022), (0.095238, 0.251976, 0.251976), (0.111111, 0.272166, 0.272166), (0.126984, 0.290957, 0.290957), (0.142857, 0.308607, 0.308607), (0.158730, 0.325300, 0.325300), (0.174603, 0.341178, 0.341178), (0.190476, 0.356348, 0.356348), (0.206349, 0.370899, 0.370899), (0.222222, 0.384900, 0.384900), (0.238095, 0.398410, 0.398410), (0.253968, 0.411476, 0.411476), (0.269841, 0.424139, 0.424139), (0.285714, 0.436436, 0.436436), (0.301587, 0.448395, 0.448395), (0.317460, 0.460044, 0.460044), (0.333333, 0.471405, 0.471405), (0.349206, 0.482498, 0.482498), (0.365079, 0.493342, 0.493342), (0.380952, 0.503953, 0.503953), (0.396825, 0.514344, 0.514344), (0.412698, 0.524531, 0.524531), (0.428571, 0.534522, 0.534522), (0.444444, 0.544331, 0.544331), (0.460317, 0.553966, 0.553966), (0.476190, 0.563436, 0.563436), (0.492063, 0.572750, 0.572750), (0.507937, 0.581914, 0.581914), (0.523810, 0.590937, 0.590937), (0.539683, 0.599824, 0.599824), (0.555556, 0.608581, 0.608581), (0.571429, 0.617213, 0.617213), (0.587302, 0.625727, 0.625727), (0.603175, 0.634126, 0.634126), (0.619048, 0.642416, 0.642416), (0.634921, 0.650600, 0.650600), (0.650794, 0.658682, 0.658682), (0.666667, 0.666667, 0.666667), (0.682540, 0.674556, 0.674556), (0.698413, 0.682355, 0.682355), (0.714286, 0.690066, 0.690066), (0.730159, 0.697691, 0.697691), (0.746032, 0.705234, 0.705234), (0.761905, 0.727166, 0.727166), (0.777778, 0.748455, 0.748455), (0.793651, 0.769156, 0.769156), (0.809524, 0.789314, 0.789314), (0.825397, 0.808969, 0.808969), (0.841270, 0.828159, 0.828159), (0.857143, 0.846913, 0.846913), (0.873016, 0.865261, 0.865261), (0.888889, 0.883229, 0.883229), (0.904762, 0.900837, 0.900837), (0.920635, 0.918109, 0.918109), (0.936508, 0.935061, 0.935061), (0.952381, 0.951711, 0.951711), (0.968254, 0.968075, 0.968075), (0.984127, 0.984167, 0.984167), (1.0, 1.0, 1.0), ), } _prism_data = { "red": ( (0.0, 1.0, 1.0), (0.031746, 1.000000, 1.000000), (0.047619, 0.000000, 0.000000), (0.063492, 0.000000, 0.000000), (0.079365, 0.666667, 0.666667), (0.095238, 1.000000, 1.000000), (0.126984, 1.000000, 1.000000), (0.142857, 0.000000, 0.000000), (0.158730, 0.000000, 0.000000), (0.174603, 0.666667, 0.666667), (0.190476, 1.000000, 1.000000), (0.222222, 1.000000, 1.000000), (0.238095, 0.000000, 0.000000), (0.253968, 0.000000, 0.000000), (0.269841, 0.666667, 0.666667), (0.285714, 1.000000, 1.000000), (0.317460, 1.000000, 1.000000), (0.333333, 0.000000, 0.000000), (0.349206, 0.000000, 0.000000), (0.365079, 0.666667, 0.666667), (0.380952, 1.000000, 1.000000), (0.412698, 1.000000, 1.000000), (0.428571, 0.000000, 0.000000), (0.444444, 0.000000, 0.000000), (0.460317, 0.666667, 0.666667), (0.476190, 1.000000, 1.000000), (0.507937, 1.000000, 1.000000), (0.523810, 0.000000, 0.000000), (0.539683, 0.000000, 0.000000), (0.555556, 0.666667, 0.666667), (0.571429, 1.000000, 1.000000), (0.603175, 1.000000, 1.000000), (0.619048, 0.000000, 0.000000), (0.634921, 0.000000, 0.000000), (0.650794, 0.666667, 0.666667), (0.666667, 1.000000, 1.000000), (0.698413, 1.000000, 1.000000), (0.714286, 0.000000, 0.000000), (0.730159, 0.000000, 0.000000), (0.746032, 0.666667, 0.666667), (0.761905, 1.000000, 1.000000), (0.793651, 1.000000, 1.000000), (0.809524, 0.000000, 0.000000), (0.825397, 0.000000, 0.000000), (0.841270, 0.666667, 0.666667), (0.857143, 1.000000, 1.000000), (0.888889, 1.000000, 1.000000), (0.904762, 0.000000, 0.000000), (0.920635, 0.000000, 0.000000), (0.936508, 0.666667, 0.666667), (0.952381, 1.000000, 1.000000), (0.984127, 1.000000, 1.000000), (1.0, 0.0, 0.0), ), "green": ( (0.0, 0.0, 0.0), (0.031746, 1.000000, 1.000000), (0.047619, 1.000000, 1.000000), (0.063492, 0.000000, 0.000000), (0.095238, 0.000000, 0.000000), (0.126984, 1.000000, 1.000000), (0.142857, 1.000000, 1.000000), (0.158730, 0.000000, 0.000000), (0.190476, 0.000000, 0.000000), (0.222222, 1.000000, 1.000000), (0.238095, 1.000000, 1.000000), (0.253968, 0.000000, 0.000000), (0.285714, 0.000000, 0.000000), (0.317460, 1.000000, 1.000000), (0.333333, 1.000000, 1.000000), (0.349206, 0.000000, 0.000000), (0.380952, 0.000000, 0.000000), (0.412698, 1.000000, 1.000000), (0.428571, 1.000000, 1.000000), (0.444444, 0.000000, 0.000000), (0.476190, 0.000000, 0.000000), (0.507937, 1.000000, 1.000000), (0.523810, 1.000000, 1.000000), (0.539683, 0.000000, 0.000000), (0.571429, 0.000000, 0.000000), (0.603175, 1.000000, 1.000000), (0.619048, 1.000000, 1.000000), (0.634921, 0.000000, 0.000000), (0.666667, 0.000000, 0.000000), (0.698413, 1.000000, 1.000000), (0.714286, 1.000000, 1.000000), (0.730159, 0.000000, 0.000000), (0.761905, 0.000000, 0.000000), (0.793651, 1.000000, 1.000000), (0.809524, 1.000000, 1.000000), (0.825397, 0.000000, 0.000000), (0.857143, 0.000000, 0.000000), (0.888889, 1.000000, 1.000000), (0.904762, 1.000000, 1.000000), (0.920635, 0.000000, 0.000000), (0.952381, 0.000000, 0.000000), (0.984127, 1.000000, 1.000000), (1.0, 1.0, 1.0), ), "blue": ( (0.0, 0.0, 0.0), (0.047619, 0.000000, 0.000000), (0.063492, 1.000000, 1.000000), (0.079365, 1.000000, 1.000000), (0.095238, 0.000000, 0.000000), (0.142857, 0.000000, 0.000000), (0.158730, 1.000000, 1.000000), (0.174603, 1.000000, 1.000000), (0.190476, 0.000000, 0.000000), (0.238095, 0.000000, 0.000000), (0.253968, 1.000000, 1.000000), (0.269841, 1.000000, 1.000000), (0.285714, 0.000000, 0.000000), (0.333333, 0.000000, 0.000000), (0.349206, 1.000000, 1.000000), (0.365079, 1.000000, 1.000000), (0.380952, 0.000000, 0.000000), (0.428571, 0.000000, 0.000000), (0.444444, 1.000000, 1.000000), (0.460317, 1.000000, 1.000000), (0.476190, 0.000000, 0.000000), (0.523810, 0.000000, 0.000000), (0.539683, 1.000000, 1.000000), (0.555556, 1.000000, 1.000000), (0.571429, 0.000000, 0.000000), (0.619048, 0.000000, 0.000000), (0.634921, 1.000000, 1.000000), (0.650794, 1.000000, 1.000000), (0.666667, 0.000000, 0.000000), (0.714286, 0.000000, 0.000000), (0.730159, 1.000000, 1.000000), (0.746032, 1.000000, 1.000000), (0.761905, 0.000000, 0.000000), (0.809524, 0.000000, 0.000000), (0.825397, 1.000000, 1.000000), (0.841270, 1.000000, 1.000000), (0.857143, 0.000000, 0.000000), (0.904762, 0.000000, 0.000000), (0.920635, 1.000000, 1.000000), (0.936508, 1.000000, 1.000000), (0.952381, 0.000000, 0.000000), (1.0, 0.0, 0.0), ), } _spring_data = { "red": ((0.0, 1.0, 1.0), (1.0, 1.0, 1.0)), "green": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "blue": ((0.0, 1.0, 1.0), (1.0, 0.0, 0.0)), } _summer_data = { "red": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "green": ((0.0, 0.5, 0.5), (1.0, 1.0, 1.0)), "blue": ((0.0, 0.4, 0.4), (1.0, 0.4, 0.4)), } _winter_data = { "red": ((0.0, 0.0, 0.0), (1.0, 0.0, 0.0)), "green": ((0.0, 0.0, 0.0), (1.0, 1.0, 1.0)), "blue": ((0.0, 1.0, 1.0), (1.0, 0.5, 0.5)), } _spectral_data = { "red": [ (0.0, 0.0, 0.0), (0.05, 0.4667, 0.4667), (0.10, 0.5333, 0.5333), (0.15, 0.0, 0.0), (0.20, 0.0, 0.0), (0.25, 0.0, 0.0), (0.30, 0.0, 0.0), (0.35, 0.0, 0.0), (0.40, 0.0, 0.0), (0.45, 0.0, 0.0), (0.50, 0.0, 0.0), (0.55, 0.0, 0.0), (0.60, 0.0, 0.0), (0.65, 0.7333, 0.7333), (0.70, 0.9333, 0.9333), (0.75, 1.0, 1.0), (0.80, 1.0, 1.0), (0.85, 1.0, 1.0), (0.90, 0.8667, 0.8667), (0.95, 0.80, 0.80), (1.0, 0.80, 0.80), ], "green": [ (0.0, 0.0, 0.0), (0.05, 0.0, 0.0), (0.10, 0.0, 0.0), (0.15, 0.0, 0.0), (0.20, 0.0, 0.0), (0.25, 0.4667, 0.4667), (0.30, 0.6000, 0.6000), (0.35, 0.6667, 0.6667), (0.40, 0.6667, 0.6667), (0.45, 0.6000, 0.6000), (0.50, 0.7333, 0.7333), (0.55, 0.8667, 0.8667), (0.60, 1.0, 1.0), (0.65, 1.0, 1.0), (0.70, 0.9333, 0.9333), (0.75, 0.8000, 0.8000), (0.80, 0.6000, 0.6000), (0.85, 0.0, 0.0), (0.90, 0.0, 0.0), (0.95, 0.0, 0.0), (1.0, 0.80, 0.80), ], "blue": [ (0.0, 0.0, 0.0), (0.05, 0.5333, 0.5333), (0.10, 0.6000, 0.6000), (0.15, 0.6667, 0.6667), (0.20, 0.8667, 0.8667), (0.25, 0.8667, 0.8667), (0.30, 0.8667, 0.8667), (0.35, 0.6667, 0.6667), (0.40, 0.5333, 0.5333), (0.45, 0.0, 0.0), (0.5, 0.0, 0.0), (0.55, 0.0, 0.0), (0.60, 0.0, 0.0), (0.65, 0.0, 0.0), (0.70, 0.0, 0.0), (0.75, 0.0, 0.0), (0.80, 0.0, 0.0), (0.85, 0.0, 0.0), (0.90, 0.0, 0.0), (0.95, 0.0, 0.0), (1.0, 0.80, 0.80), ], } datad = { "autumn": _autumn_data, "bone": _bone_data, "binary": _binary_data, "cool": _cool_data, "copper": _copper_data, "flag": _flag_data, "gray": _gray_data, "hot": _hot_data, "hsv": _hsv_data, "jet": _jet_data, "pink": _pink_data, "prism": _prism_data, "spring": _spring_data, "summer": _summer_data, "winter": _winter_data, "spectral": _spectral_data, } # 34 colormaps based on color specifications and designs # developed by Cynthia Brewer (http://colorbrewer.org). # The ColorBrewer palettes have been included under the terms # of an Apache-stype license (for details, see the file # LICENSE_COLORBREWER in the license directory of the matplotlib # source distribution). _Accent_data = { "blue": [ (0.0, 0.49803921580314636, 0.49803921580314636), (0.14285714285714285, 0.83137255907058716, 0.83137255907058716), (0.2857142857142857, 0.52549022436141968, 0.52549022436141968), (0.42857142857142855, 0.60000002384185791, 0.60000002384185791), (0.5714285714285714, 0.69019609689712524, 0.69019609689712524), (0.7142857142857143, 0.49803921580314636, 0.49803921580314636), (0.8571428571428571, 0.090196080505847931, 0.090196080505847931), (1.0, 0.40000000596046448, 0.40000000596046448), ], "green": [ (0.0, 0.78823530673980713, 0.78823530673980713), (0.14285714285714285, 0.68235296010971069, 0.68235296010971069), (0.2857142857142857, 0.75294119119644165, 0.75294119119644165), (0.42857142857142855, 1.0, 1.0), (0.5714285714285714, 0.42352941632270813, 0.42352941632270813), (0.7142857142857143, 0.0078431377187371254, 0.0078431377187371254), (0.8571428571428571, 0.35686275362968445, 0.35686275362968445), (1.0, 0.40000000596046448, 0.40000000596046448), ], "red": [ (0.0, 0.49803921580314636, 0.49803921580314636), (0.14285714285714285, 0.7450980544090271, 0.7450980544090271), (0.2857142857142857, 0.99215686321258545, 0.99215686321258545), (0.42857142857142855, 1.0, 1.0), (0.5714285714285714, 0.21960784494876862, 0.21960784494876862), (0.7142857142857143, 0.94117647409439087, 0.94117647409439087), (0.8571428571428571, 0.74901962280273438, 0.74901962280273438), (1.0, 0.40000000596046448, 0.40000000596046448), ], } _Blues_data = { "blue": [ (0.0, 1.0, 1.0), (0.125, 0.9686274528503418, 0.9686274528503418), (0.25, 0.93725490570068359, 0.93725490570068359), (0.375, 0.88235294818878174, 0.88235294818878174), (0.5, 0.83921569585800171, 0.83921569585800171), (0.625, 0.7764706015586853, 0.7764706015586853), (0.75, 0.70980393886566162, 0.70980393886566162), (0.875, 0.61176472902297974, 0.61176472902297974), (1.0, 0.41960784792900085, 0.41960784792900085), ], "green": [ (0.0, 0.9843137264251709, 0.9843137264251709), (0.125, 0.92156863212585449, 0.92156863212585449), (0.25, 0.85882353782653809, 0.85882353782653809), (0.375, 0.7921568751335144, 0.7921568751335144), (0.5, 0.68235296010971069, 0.68235296010971069), (0.625, 0.57254904508590698, 0.57254904508590698), (0.75, 0.44313725829124451, 0.44313725829124451), (0.875, 0.31764706969261169, 0.31764706969261169), (1.0, 0.18823529779911041, 0.18823529779911041), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.87058824300765991, 0.87058824300765991), (0.25, 0.7764706015586853, 0.7764706015586853), (0.375, 0.61960786581039429, 0.61960786581039429), (0.5, 0.41960784792900085, 0.41960784792900085), (0.625, 0.25882354378700256, 0.25882354378700256), (0.75, 0.12941177189350128, 0.12941177189350128), (0.875, 0.031372550874948502, 0.031372550874948502), (1.0, 0.031372550874948502, 0.031372550874948502), ], } _BrBG_data = { "blue": [ (0.0, 0.019607843831181526, 0.019607843831181526), (0.10000000000000001, 0.039215687662363052, 0.039215687662363052), (0.20000000000000001, 0.17647059261798859, 0.17647059261798859), (0.29999999999999999, 0.49019607901573181, 0.49019607901573181), (0.40000000000000002, 0.76470589637756348, 0.76470589637756348), (0.5, 0.96078431606292725, 0.96078431606292725), (0.59999999999999998, 0.89803922176361084, 0.89803922176361084), (0.69999999999999996, 0.75686275959014893, 0.75686275959014893), (0.80000000000000004, 0.56078433990478516, 0.56078433990478516), (0.90000000000000002, 0.36862745881080627, 0.36862745881080627), (1.0, 0.18823529779911041, 0.18823529779911041), ], "green": [ (0.0, 0.18823529779911041, 0.18823529779911041), (0.10000000000000001, 0.31764706969261169, 0.31764706969261169), (0.20000000000000001, 0.5058823823928833, 0.5058823823928833), (0.29999999999999999, 0.7607843279838562, 0.7607843279838562), (0.40000000000000002, 0.90980392694473267, 0.90980392694473267), (0.5, 0.96078431606292725, 0.96078431606292725), (0.59999999999999998, 0.91764706373214722, 0.91764706373214722), (0.69999999999999996, 0.80392158031463623, 0.80392158031463623), (0.80000000000000004, 0.59215688705444336, 0.59215688705444336), (0.90000000000000002, 0.40000000596046448, 0.40000000596046448), (1.0, 0.23529411852359772, 0.23529411852359772), ], "red": [ (0.0, 0.32941177487373352, 0.32941177487373352), (0.10000000000000001, 0.54901963472366333, 0.54901963472366333), (0.20000000000000001, 0.74901962280273438, 0.74901962280273438), (0.29999999999999999, 0.87450981140136719, 0.87450981140136719), (0.40000000000000002, 0.96470588445663452, 0.96470588445663452), (0.5, 0.96078431606292725, 0.96078431606292725), (0.59999999999999998, 0.78039216995239258, 0.78039216995239258), (0.69999999999999996, 0.50196081399917603, 0.50196081399917603), (0.80000000000000004, 0.20784313976764679, 0.20784313976764679), (0.90000000000000002, 0.0039215688593685627, 0.0039215688593685627), (1.0, 0.0, 0.0), ], } _BuGn_data = { "blue": [ (0.0, 0.99215686321258545, 0.99215686321258545), (0.125, 0.97647058963775635, 0.97647058963775635), (0.25, 0.90196079015731812, 0.90196079015731812), (0.375, 0.78823530673980713, 0.78823530673980713), (0.5, 0.64313727617263794, 0.64313727617263794), (0.625, 0.46274510025978088, 0.46274510025978088), (0.75, 0.27058824896812439, 0.27058824896812439), (0.875, 0.17254902422428131, 0.17254902422428131), (1.0, 0.10588235408067703, 0.10588235408067703), ], "green": [ (0.0, 0.98823529481887817, 0.98823529481887817), (0.125, 0.96078431606292725, 0.96078431606292725), (0.25, 0.92549020051956177, 0.92549020051956177), (0.375, 0.84705883264541626, 0.84705883264541626), (0.5, 0.7607843279838562, 0.7607843279838562), (0.625, 0.68235296010971069, 0.68235296010971069), (0.75, 0.54509806632995605, 0.54509806632995605), (0.875, 0.42745098471641541, 0.42745098471641541), (1.0, 0.26666668057441711, 0.26666668057441711), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.89803922176361084, 0.89803922176361084), (0.25, 0.80000001192092896, 0.80000001192092896), (0.375, 0.60000002384185791, 0.60000002384185791), (0.5, 0.40000000596046448, 0.40000000596046448), (0.625, 0.25490197539329529, 0.25490197539329529), (0.75, 0.13725490868091583, 0.13725490868091583), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], } _BuPu_data = { "blue": [ (0.0, 0.99215686321258545, 0.99215686321258545), (0.125, 0.95686274766921997, 0.95686274766921997), (0.25, 0.90196079015731812, 0.90196079015731812), (0.375, 0.85490196943283081, 0.85490196943283081), (0.5, 0.7764706015586853, 0.7764706015586853), (0.625, 0.69411766529083252, 0.69411766529083252), (0.75, 0.61568629741668701, 0.61568629741668701), (0.875, 0.48627451062202454, 0.48627451062202454), (1.0, 0.29411765933036804, 0.29411765933036804), ], "green": [ (0.0, 0.98823529481887817, 0.98823529481887817), (0.125, 0.92549020051956177, 0.92549020051956177), (0.25, 0.82745099067687988, 0.82745099067687988), (0.375, 0.73725491762161255, 0.73725491762161255), (0.5, 0.58823531866073608, 0.58823531866073608), (0.625, 0.41960784792900085, 0.41960784792900085), (0.75, 0.25490197539329529, 0.25490197539329529), (0.875, 0.058823529630899429, 0.058823529630899429), (1.0, 0.0, 0.0), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.87843137979507446, 0.87843137979507446), (0.25, 0.74901962280273438, 0.74901962280273438), (0.375, 0.61960786581039429, 0.61960786581039429), (0.5, 0.54901963472366333, 0.54901963472366333), (0.625, 0.54901963472366333, 0.54901963472366333), (0.75, 0.53333336114883423, 0.53333336114883423), (0.875, 0.5058823823928833, 0.5058823823928833), (1.0, 0.30196079611778259, 0.30196079611778259), ], } _Dark2_data = { "blue": [ (0.0, 0.46666666865348816, 0.46666666865348816), (0.14285714285714285, 0.0078431377187371254, 0.0078431377187371254), (0.2857142857142857, 0.70196080207824707, 0.70196080207824707), (0.42857142857142855, 0.54117649793624878, 0.54117649793624878), (0.5714285714285714, 0.11764705926179886, 0.11764705926179886), (0.7142857142857143, 0.0078431377187371254, 0.0078431377187371254), (0.8571428571428571, 0.11372549086809158, 0.11372549086809158), (1.0, 0.40000000596046448, 0.40000000596046448), ], "green": [ (0.0, 0.61960786581039429, 0.61960786581039429), (0.14285714285714285, 0.37254902720451355, 0.37254902720451355), (0.2857142857142857, 0.43921568989753723, 0.43921568989753723), (0.42857142857142855, 0.16078431904315948, 0.16078431904315948), (0.5714285714285714, 0.65098041296005249, 0.65098041296005249), (0.7142857142857143, 0.67058825492858887, 0.67058825492858887), (0.8571428571428571, 0.46274510025978088, 0.46274510025978088), (1.0, 0.40000000596046448, 0.40000000596046448), ], "red": [ (0.0, 0.10588235408067703, 0.10588235408067703), (0.14285714285714285, 0.85098040103912354, 0.85098040103912354), (0.2857142857142857, 0.45882353186607361, 0.45882353186607361), (0.42857142857142855, 0.90588235855102539, 0.90588235855102539), (0.5714285714285714, 0.40000000596046448, 0.40000000596046448), (0.7142857142857143, 0.90196079015731812, 0.90196079015731812), (0.8571428571428571, 0.65098041296005249, 0.65098041296005249), (1.0, 0.40000000596046448, 0.40000000596046448), ], } _GnBu_data = { "blue": [ (0.0, 0.94117647409439087, 0.94117647409439087), (0.125, 0.85882353782653809, 0.85882353782653809), (0.25, 0.77254903316497803, 0.77254903316497803), (0.375, 0.70980393886566162, 0.70980393886566162), (0.5, 0.76862746477127075, 0.76862746477127075), (0.625, 0.82745099067687988, 0.82745099067687988), (0.75, 0.7450980544090271, 0.7450980544090271), (0.875, 0.67450982332229614, 0.67450982332229614), (1.0, 0.5058823823928833, 0.5058823823928833), ], "green": [ (0.0, 0.98823529481887817, 0.98823529481887817), (0.125, 0.9529411792755127, 0.9529411792755127), (0.25, 0.92156863212585449, 0.92156863212585449), (0.375, 0.86666667461395264, 0.86666667461395264), (0.5, 0.80000001192092896, 0.80000001192092896), (0.625, 0.70196080207824707, 0.70196080207824707), (0.75, 0.54901963472366333, 0.54901963472366333), (0.875, 0.40784314274787903, 0.40784314274787903), (1.0, 0.25098040699958801, 0.25098040699958801), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.87843137979507446, 0.87843137979507446), (0.25, 0.80000001192092896, 0.80000001192092896), (0.375, 0.65882354974746704, 0.65882354974746704), (0.5, 0.48235294222831726, 0.48235294222831726), (0.625, 0.30588236451148987, 0.30588236451148987), (0.75, 0.16862745583057404, 0.16862745583057404), (0.875, 0.031372550874948502, 0.031372550874948502), (1.0, 0.031372550874948502, 0.031372550874948502), ], } _Greens_data = { "blue": [ (0.0, 0.96078431606292725, 0.96078431606292725), (0.125, 0.87843137979507446, 0.87843137979507446), (0.25, 0.75294119119644165, 0.75294119119644165), (0.375, 0.60784316062927246, 0.60784316062927246), (0.5, 0.46274510025978088, 0.46274510025978088), (0.625, 0.364705890417099, 0.364705890417099), (0.75, 0.27058824896812439, 0.27058824896812439), (0.875, 0.17254902422428131, 0.17254902422428131), (1.0, 0.10588235408067703, 0.10588235408067703), ], "green": [ (0.0, 0.98823529481887817, 0.98823529481887817), (0.125, 0.96078431606292725, 0.96078431606292725), (0.25, 0.91372549533843994, 0.91372549533843994), (0.375, 0.85098040103912354, 0.85098040103912354), (0.5, 0.76862746477127075, 0.76862746477127075), (0.625, 0.67058825492858887, 0.67058825492858887), (0.75, 0.54509806632995605, 0.54509806632995605), (0.875, 0.42745098471641541, 0.42745098471641541), (1.0, 0.26666668057441711, 0.26666668057441711), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.89803922176361084, 0.89803922176361084), (0.25, 0.78039216995239258, 0.78039216995239258), (0.375, 0.63137257099151611, 0.63137257099151611), (0.5, 0.45490196347236633, 0.45490196347236633), (0.625, 0.25490197539329529, 0.25490197539329529), (0.75, 0.13725490868091583, 0.13725490868091583), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], } _Greys_data = { "blue": [ (0.0, 1.0, 1.0), (0.125, 0.94117647409439087, 0.94117647409439087), (0.25, 0.85098040103912354, 0.85098040103912354), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.58823531866073608, 0.58823531866073608), (0.625, 0.45098039507865906, 0.45098039507865906), (0.75, 0.32156863808631897, 0.32156863808631897), (0.875, 0.14509804546833038, 0.14509804546833038), (1.0, 0.0, 0.0), ], "green": [ (0.0, 1.0, 1.0), (0.125, 0.94117647409439087, 0.94117647409439087), (0.25, 0.85098040103912354, 0.85098040103912354), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.58823531866073608, 0.58823531866073608), (0.625, 0.45098039507865906, 0.45098039507865906), (0.75, 0.32156863808631897, 0.32156863808631897), (0.875, 0.14509804546833038, 0.14509804546833038), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.94117647409439087, 0.94117647409439087), (0.25, 0.85098040103912354, 0.85098040103912354), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.58823531866073608, 0.58823531866073608), (0.625, 0.45098039507865906, 0.45098039507865906), (0.75, 0.32156863808631897, 0.32156863808631897), (0.875, 0.14509804546833038, 0.14509804546833038), (1.0, 0.0, 0.0), ], } _Oranges_data = { "blue": [ (0.0, 0.92156863212585449, 0.92156863212585449), (0.125, 0.80784314870834351, 0.80784314870834351), (0.25, 0.63529413938522339, 0.63529413938522339), (0.375, 0.41960784792900085, 0.41960784792900085), (0.5, 0.23529411852359772, 0.23529411852359772), (0.625, 0.074509806931018829, 0.074509806931018829), (0.75, 0.0039215688593685627, 0.0039215688593685627), (0.875, 0.011764706112444401, 0.011764706112444401), (1.0, 0.015686275437474251, 0.015686275437474251), ], "green": [ (0.0, 0.96078431606292725, 0.96078431606292725), (0.125, 0.90196079015731812, 0.90196079015731812), (0.25, 0.81568628549575806, 0.81568628549575806), (0.375, 0.68235296010971069, 0.68235296010971069), (0.5, 0.55294120311737061, 0.55294120311737061), (0.625, 0.4117647111415863, 0.4117647111415863), (0.75, 0.28235295414924622, 0.28235295414924622), (0.875, 0.21176470816135406, 0.21176470816135406), (1.0, 0.15294118225574493, 0.15294118225574493), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.99607843160629272, 0.99607843160629272), (0.25, 0.99215686321258545, 0.99215686321258545), (0.375, 0.99215686321258545, 0.99215686321258545), (0.5, 0.99215686321258545, 0.99215686321258545), (0.625, 0.94509804248809814, 0.94509804248809814), (0.75, 0.85098040103912354, 0.85098040103912354), (0.875, 0.65098041296005249, 0.65098041296005249), (1.0, 0.49803921580314636, 0.49803921580314636), ], } _OrRd_data = { "blue": [ (0.0, 0.92549020051956177, 0.92549020051956177), (0.125, 0.78431373834609985, 0.78431373834609985), (0.25, 0.61960786581039429, 0.61960786581039429), (0.375, 0.51764708757400513, 0.51764708757400513), (0.5, 0.3490196168422699, 0.3490196168422699), (0.625, 0.28235295414924622, 0.28235295414924622), (0.75, 0.12156862765550613, 0.12156862765550613), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], "green": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.90980392694473267, 0.90980392694473267), (0.25, 0.83137255907058716, 0.83137255907058716), (0.375, 0.73333334922790527, 0.73333334922790527), (0.5, 0.55294120311737061, 0.55294120311737061), (0.625, 0.3960784375667572, 0.3960784375667572), (0.75, 0.18823529779911041, 0.18823529779911041), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.99607843160629272, 0.99607843160629272), (0.25, 0.99215686321258545, 0.99215686321258545), (0.375, 0.99215686321258545, 0.99215686321258545), (0.5, 0.98823529481887817, 0.98823529481887817), (0.625, 0.93725490570068359, 0.93725490570068359), (0.75, 0.84313726425170898, 0.84313726425170898), (0.875, 0.70196080207824707, 0.70196080207824707), (1.0, 0.49803921580314636, 0.49803921580314636), ], } _Paired_data = { "blue": [ (0.0, 0.89019608497619629, 0.89019608497619629), (0.090909090909090912, 0.70588237047195435, 0.70588237047195435), (0.18181818181818182, 0.54117649793624878, 0.54117649793624878), (0.27272727272727271, 0.17254902422428131, 0.17254902422428131), (0.36363636363636365, 0.60000002384185791, 0.60000002384185791), (0.45454545454545453, 0.10980392247438431, 0.10980392247438431), (0.54545454545454541, 0.43529412150382996, 0.43529412150382996), (0.63636363636363635, 0.0, 0.0), (0.72727272727272729, 0.83921569585800171, 0.83921569585800171), (0.81818181818181823, 0.60392159223556519, 0.60392159223556519), (0.90909090909090906, 0.60000002384185791, 0.60000002384185791), (1.0, 0.15686275064945221, 0.15686275064945221), ], "green": [ (0.0, 0.80784314870834351, 0.80784314870834351), (0.090909090909090912, 0.47058823704719543, 0.47058823704719543), (0.18181818181818182, 0.87450981140136719, 0.87450981140136719), (0.27272727272727271, 0.62745100259780884, 0.62745100259780884), (0.36363636363636365, 0.60392159223556519, 0.60392159223556519), (0.45454545454545453, 0.10196078568696976, 0.10196078568696976), (0.54545454545454541, 0.74901962280273438, 0.74901962280273438), (0.63636363636363635, 0.49803921580314636, 0.49803921580314636), (0.72727272727272729, 0.69803923368453979, 0.69803923368453979), (0.81818181818181823, 0.23921568691730499, 0.23921568691730499), (0.90909090909090906, 1.0, 1.0), (1.0, 0.3490196168422699, 0.3490196168422699), ], "red": [ (0.0, 0.65098041296005249, 0.65098041296005249), (0.090909090909090912, 0.12156862765550613, 0.12156862765550613), (0.18181818181818182, 0.69803923368453979, 0.69803923368453979), (0.27272727272727271, 0.20000000298023224, 0.20000000298023224), (0.36363636363636365, 0.9843137264251709, 0.9843137264251709), (0.45454545454545453, 0.89019608497619629, 0.89019608497619629), (0.54545454545454541, 0.99215686321258545, 0.99215686321258545), (0.63636363636363635, 1.0, 1.0), (0.72727272727272729, 0.7921568751335144, 0.7921568751335144), (0.81818181818181823, 0.41568627953529358, 0.41568627953529358), (0.90909090909090906, 1.0, 1.0), (1.0, 0.69411766529083252, 0.69411766529083252), ], } _Pastel1_data = { "blue": [ (0.0, 0.68235296010971069, 0.68235296010971069), (0.125, 0.89019608497619629, 0.89019608497619629), (0.25, 0.77254903316497803, 0.77254903316497803), (0.375, 0.89411765336990356, 0.89411765336990356), (0.5, 0.65098041296005249, 0.65098041296005249), (0.625, 0.80000001192092896, 0.80000001192092896), (0.75, 0.74117648601531982, 0.74117648601531982), (0.875, 0.92549020051956177, 0.92549020051956177), (1.0, 0.94901961088180542, 0.94901961088180542), ], "green": [ (0.0, 0.70588237047195435, 0.70588237047195435), (0.125, 0.80392158031463623, 0.80392158031463623), (0.25, 0.92156863212585449, 0.92156863212585449), (0.375, 0.79607844352722168, 0.79607844352722168), (0.5, 0.85098040103912354, 0.85098040103912354), (0.625, 1.0, 1.0), (0.75, 0.84705883264541626, 0.84705883264541626), (0.875, 0.85490196943283081, 0.85490196943283081), (1.0, 0.94901961088180542, 0.94901961088180542), ], "red": [ (0.0, 0.9843137264251709, 0.9843137264251709), (0.125, 0.70196080207824707, 0.70196080207824707), (0.25, 0.80000001192092896, 0.80000001192092896), (0.375, 0.87058824300765991, 0.87058824300765991), (0.5, 0.99607843160629272, 0.99607843160629272), (0.625, 1.0, 1.0), (0.75, 0.89803922176361084, 0.89803922176361084), (0.875, 0.99215686321258545, 0.99215686321258545), (1.0, 0.94901961088180542, 0.94901961088180542), ], } _Pastel2_data = { "blue": [ (0.0, 0.80392158031463623, 0.80392158031463623), (0.14285714285714285, 0.67450982332229614, 0.67450982332229614), (0.2857142857142857, 0.90980392694473267, 0.90980392694473267), (0.42857142857142855, 0.89411765336990356, 0.89411765336990356), (0.5714285714285714, 0.78823530673980713, 0.78823530673980713), (0.7142857142857143, 0.68235296010971069, 0.68235296010971069), (0.8571428571428571, 0.80000001192092896, 0.80000001192092896), (1.0, 0.80000001192092896, 0.80000001192092896), ], "green": [ (0.0, 0.88627451658248901, 0.88627451658248901), (0.14285714285714285, 0.80392158031463623, 0.80392158031463623), (0.2857142857142857, 0.83529412746429443, 0.83529412746429443), (0.42857142857142855, 0.7921568751335144, 0.7921568751335144), (0.5714285714285714, 0.96078431606292725, 0.96078431606292725), (0.7142857142857143, 0.94901961088180542, 0.94901961088180542), (0.8571428571428571, 0.88627451658248901, 0.88627451658248901), (1.0, 0.80000001192092896, 0.80000001192092896), ], "red": [ (0.0, 0.70196080207824707, 0.70196080207824707), (0.14285714285714285, 0.99215686321258545, 0.99215686321258545), (0.2857142857142857, 0.79607844352722168, 0.79607844352722168), (0.42857142857142855, 0.95686274766921997, 0.95686274766921997), (0.5714285714285714, 0.90196079015731812, 0.90196079015731812), (0.7142857142857143, 1.0, 1.0), (0.8571428571428571, 0.94509804248809814, 0.94509804248809814), (1.0, 0.80000001192092896, 0.80000001192092896), ], } _PiYG_data = { "blue": [ (0.0, 0.32156863808631897, 0.32156863808631897), (0.10000000000000001, 0.49019607901573181, 0.49019607901573181), (0.20000000000000001, 0.68235296010971069, 0.68235296010971069), (0.29999999999999999, 0.85490196943283081, 0.85490196943283081), (0.40000000000000002, 0.93725490570068359, 0.93725490570068359), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.81568628549575806, 0.81568628549575806), (0.69999999999999996, 0.52549022436141968, 0.52549022436141968), (0.80000000000000004, 0.25490197539329529, 0.25490197539329529), (0.90000000000000002, 0.12941177189350128, 0.12941177189350128), (1.0, 0.098039217293262482, 0.098039217293262482), ], "green": [ (0.0, 0.0039215688593685627, 0.0039215688593685627), (0.10000000000000001, 0.10588235408067703, 0.10588235408067703), (0.20000000000000001, 0.46666666865348816, 0.46666666865348816), (0.29999999999999999, 0.7137255072593689, 0.7137255072593689), (0.40000000000000002, 0.87843137979507446, 0.87843137979507446), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.96078431606292725, 0.96078431606292725), (0.69999999999999996, 0.88235294818878174, 0.88235294818878174), (0.80000000000000004, 0.73725491762161255, 0.73725491762161255), (0.90000000000000002, 0.57254904508590698, 0.57254904508590698), (1.0, 0.39215686917304993, 0.39215686917304993), ], "red": [ (0.0, 0.55686277151107788, 0.55686277151107788), (0.10000000000000001, 0.77254903316497803, 0.77254903316497803), (0.20000000000000001, 0.87058824300765991, 0.87058824300765991), (0.29999999999999999, 0.94509804248809814, 0.94509804248809814), (0.40000000000000002, 0.99215686321258545, 0.99215686321258545), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.90196079015731812, 0.90196079015731812), (0.69999999999999996, 0.72156864404678345, 0.72156864404678345), (0.80000000000000004, 0.49803921580314636, 0.49803921580314636), (0.90000000000000002, 0.30196079611778259, 0.30196079611778259), (1.0, 0.15294118225574493, 0.15294118225574493), ], } _PRGn_data = { "blue": [ (0.0, 0.29411765933036804, 0.29411765933036804), (0.10000000000000001, 0.51372551918029785, 0.51372551918029785), (0.20000000000000001, 0.67058825492858887, 0.67058825492858887), (0.29999999999999999, 0.81176471710205078, 0.81176471710205078), (0.40000000000000002, 0.90980392694473267, 0.90980392694473267), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.82745099067687988, 0.82745099067687988), (0.69999999999999996, 0.62745100259780884, 0.62745100259780884), (0.80000000000000004, 0.3803921639919281, 0.3803921639919281), (0.90000000000000002, 0.21568627655506134, 0.21568627655506134), (1.0, 0.10588235408067703, 0.10588235408067703), ], "green": [ (0.0, 0.0, 0.0), (0.10000000000000001, 0.16470588743686676, 0.16470588743686676), (0.20000000000000001, 0.43921568989753723, 0.43921568989753723), (0.29999999999999999, 0.64705884456634521, 0.64705884456634521), (0.40000000000000002, 0.83137255907058716, 0.83137255907058716), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.94117647409439087, 0.94117647409439087), (0.69999999999999996, 0.85882353782653809, 0.85882353782653809), (0.80000000000000004, 0.68235296010971069, 0.68235296010971069), (0.90000000000000002, 0.47058823704719543, 0.47058823704719543), (1.0, 0.26666668057441711, 0.26666668057441711), ], "red": [ (0.0, 0.25098040699958801, 0.25098040699958801), (0.10000000000000001, 0.46274510025978088, 0.46274510025978088), (0.20000000000000001, 0.60000002384185791, 0.60000002384185791), (0.29999999999999999, 0.7607843279838562, 0.7607843279838562), (0.40000000000000002, 0.90588235855102539, 0.90588235855102539), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.85098040103912354, 0.85098040103912354), (0.69999999999999996, 0.65098041296005249, 0.65098041296005249), (0.80000000000000004, 0.35294118523597717, 0.35294118523597717), (0.90000000000000002, 0.10588235408067703, 0.10588235408067703), (1.0, 0.0, 0.0), ], } _PuBu_data = { "blue": [ (0.0, 0.9843137264251709, 0.9843137264251709), (0.125, 0.94901961088180542, 0.94901961088180542), (0.25, 0.90196079015731812, 0.90196079015731812), (0.375, 0.85882353782653809, 0.85882353782653809), (0.5, 0.81176471710205078, 0.81176471710205078), (0.625, 0.75294119119644165, 0.75294119119644165), (0.75, 0.69019609689712524, 0.69019609689712524), (0.875, 0.55294120311737061, 0.55294120311737061), (1.0, 0.34509804844856262, 0.34509804844856262), ], "green": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.90588235855102539, 0.90588235855102539), (0.25, 0.81960785388946533, 0.81960785388946533), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.66274511814117432, 0.66274511814117432), (0.625, 0.56470590829849243, 0.56470590829849243), (0.75, 0.43921568989753723, 0.43921568989753723), (0.875, 0.35294118523597717, 0.35294118523597717), (1.0, 0.21960784494876862, 0.21960784494876862), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.92549020051956177, 0.92549020051956177), (0.25, 0.81568628549575806, 0.81568628549575806), (0.375, 0.65098041296005249, 0.65098041296005249), (0.5, 0.45490196347236633, 0.45490196347236633), (0.625, 0.21176470816135406, 0.21176470816135406), (0.75, 0.019607843831181526, 0.019607843831181526), (0.875, 0.015686275437474251, 0.015686275437474251), (1.0, 0.0078431377187371254, 0.0078431377187371254), ], } _PuBuGn_data = { "blue": [ (0.0, 0.9843137264251709, 0.9843137264251709), (0.125, 0.94117647409439087, 0.94117647409439087), (0.25, 0.90196079015731812, 0.90196079015731812), (0.375, 0.85882353782653809, 0.85882353782653809), (0.5, 0.81176471710205078, 0.81176471710205078), (0.625, 0.75294119119644165, 0.75294119119644165), (0.75, 0.54117649793624878, 0.54117649793624878), (0.875, 0.3490196168422699, 0.3490196168422699), (1.0, 0.21176470816135406, 0.21176470816135406), ], "green": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.88627451658248901, 0.88627451658248901), (0.25, 0.81960785388946533, 0.81960785388946533), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.66274511814117432, 0.66274511814117432), (0.625, 0.56470590829849243, 0.56470590829849243), (0.75, 0.5058823823928833, 0.5058823823928833), (0.875, 0.42352941632270813, 0.42352941632270813), (1.0, 0.27450981736183167, 0.27450981736183167), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.92549020051956177, 0.92549020051956177), (0.25, 0.81568628549575806, 0.81568628549575806), (0.375, 0.65098041296005249, 0.65098041296005249), (0.5, 0.40392157435417175, 0.40392157435417175), (0.625, 0.21176470816135406, 0.21176470816135406), (0.75, 0.0078431377187371254, 0.0078431377187371254), (0.875, 0.0039215688593685627, 0.0039215688593685627), (1.0, 0.0039215688593685627, 0.0039215688593685627), ], } _PuOr_data = { "blue": [ (0.0, 0.031372550874948502, 0.031372550874948502), (0.10000000000000001, 0.023529412224888802, 0.023529412224888802), (0.20000000000000001, 0.078431375324726105, 0.078431375324726105), (0.29999999999999999, 0.38823530077934265, 0.38823530077934265), (0.40000000000000002, 0.7137255072593689, 0.7137255072593689), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.92156863212585449, 0.92156863212585449), (0.69999999999999996, 0.82352942228317261, 0.82352942228317261), (0.80000000000000004, 0.67450982332229614, 0.67450982332229614), (0.90000000000000002, 0.53333336114883423, 0.53333336114883423), (1.0, 0.29411765933036804, 0.29411765933036804), ], "green": [ (0.0, 0.23137255012989044, 0.23137255012989044), (0.10000000000000001, 0.34509804844856262, 0.34509804844856262), (0.20000000000000001, 0.50980395078659058, 0.50980395078659058), (0.29999999999999999, 0.72156864404678345, 0.72156864404678345), (0.40000000000000002, 0.87843137979507446, 0.87843137979507446), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.85490196943283081, 0.85490196943283081), (0.69999999999999996, 0.67058825492858887, 0.67058825492858887), (0.80000000000000004, 0.45098039507865906, 0.45098039507865906), (0.90000000000000002, 0.15294118225574493, 0.15294118225574493), (1.0, 0.0, 0.0), ], "red": [ (0.0, 0.49803921580314636, 0.49803921580314636), (0.10000000000000001, 0.70196080207824707, 0.70196080207824707), (0.20000000000000001, 0.87843137979507446, 0.87843137979507446), (0.29999999999999999, 0.99215686321258545, 0.99215686321258545), (0.40000000000000002, 0.99607843160629272, 0.99607843160629272), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.84705883264541626, 0.84705883264541626), (0.69999999999999996, 0.69803923368453979, 0.69803923368453979), (0.80000000000000004, 0.50196081399917603, 0.50196081399917603), (0.90000000000000002, 0.32941177487373352, 0.32941177487373352), (1.0, 0.17647059261798859, 0.17647059261798859), ], } _PuRd_data = { "blue": [ (0.0, 0.97647058963775635, 0.97647058963775635), (0.125, 0.93725490570068359, 0.93725490570068359), (0.25, 0.85490196943283081, 0.85490196943283081), (0.375, 0.78039216995239258, 0.78039216995239258), (0.5, 0.69019609689712524, 0.69019609689712524), (0.625, 0.54117649793624878, 0.54117649793624878), (0.75, 0.33725491166114807, 0.33725491166114807), (0.875, 0.26274511218070984, 0.26274511218070984), (1.0, 0.12156862765550613, 0.12156862765550613), ], "green": [ (0.0, 0.95686274766921997, 0.95686274766921997), (0.125, 0.88235294818878174, 0.88235294818878174), (0.25, 0.72549021244049072, 0.72549021244049072), (0.375, 0.58039218187332153, 0.58039218187332153), (0.5, 0.3960784375667572, 0.3960784375667572), (0.625, 0.16078431904315948, 0.16078431904315948), (0.75, 0.070588238537311554, 0.070588238537311554), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], "red": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.90588235855102539, 0.90588235855102539), (0.25, 0.83137255907058716, 0.83137255907058716), (0.375, 0.78823530673980713, 0.78823530673980713), (0.5, 0.87450981140136719, 0.87450981140136719), (0.625, 0.90588235855102539, 0.90588235855102539), (0.75, 0.80784314870834351, 0.80784314870834351), (0.875, 0.59607845544815063, 0.59607845544815063), (1.0, 0.40392157435417175, 0.40392157435417175), ], } _Purples_data = { "blue": [ (0.0, 0.99215686321258545, 0.99215686321258545), (0.125, 0.96078431606292725, 0.96078431606292725), (0.25, 0.92156863212585449, 0.92156863212585449), (0.375, 0.86274510622024536, 0.86274510622024536), (0.5, 0.78431373834609985, 0.78431373834609985), (0.625, 0.729411780834198, 0.729411780834198), (0.75, 0.63921570777893066, 0.63921570777893066), (0.875, 0.56078433990478516, 0.56078433990478516), (1.0, 0.49019607901573181, 0.49019607901573181), ], "green": [ (0.0, 0.9843137264251709, 0.9843137264251709), (0.125, 0.92941176891326904, 0.92941176891326904), (0.25, 0.85490196943283081, 0.85490196943283081), (0.375, 0.74117648601531982, 0.74117648601531982), (0.5, 0.60392159223556519, 0.60392159223556519), (0.625, 0.49019607901573181, 0.49019607901573181), (0.75, 0.31764706969261169, 0.31764706969261169), (0.875, 0.15294118225574493, 0.15294118225574493), (1.0, 0.0, 0.0), ], "red": [ (0.0, 0.98823529481887817, 0.98823529481887817), (0.125, 0.93725490570068359, 0.93725490570068359), (0.25, 0.85490196943283081, 0.85490196943283081), (0.375, 0.73725491762161255, 0.73725491762161255), (0.5, 0.61960786581039429, 0.61960786581039429), (0.625, 0.50196081399917603, 0.50196081399917603), (0.75, 0.41568627953529358, 0.41568627953529358), (0.875, 0.32941177487373352, 0.32941177487373352), (1.0, 0.24705882370471954, 0.24705882370471954), ], } _RdBu_data = { "blue": [ (0.0, 0.12156862765550613, 0.12156862765550613), (0.10000000000000001, 0.16862745583057404, 0.16862745583057404), (0.20000000000000001, 0.30196079611778259, 0.30196079611778259), (0.29999999999999999, 0.50980395078659058, 0.50980395078659058), (0.40000000000000002, 0.78039216995239258, 0.78039216995239258), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.94117647409439087, 0.94117647409439087), (0.69999999999999996, 0.87058824300765991, 0.87058824300765991), (0.80000000000000004, 0.76470589637756348, 0.76470589637756348), (0.90000000000000002, 0.67450982332229614, 0.67450982332229614), (1.0, 0.3803921639919281, 0.3803921639919281), ], "green": [ (0.0, 0.0, 0.0), (0.10000000000000001, 0.094117648899555206, 0.094117648899555206), (0.20000000000000001, 0.37647059559822083, 0.37647059559822083), (0.29999999999999999, 0.64705884456634521, 0.64705884456634521), (0.40000000000000002, 0.85882353782653809, 0.85882353782653809), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.89803922176361084, 0.89803922176361084), (0.69999999999999996, 0.77254903316497803, 0.77254903316497803), (0.80000000000000004, 0.57647061347961426, 0.57647061347961426), (0.90000000000000002, 0.40000000596046448, 0.40000000596046448), (1.0, 0.18823529779911041, 0.18823529779911041), ], "red": [ (0.0, 0.40392157435417175, 0.40392157435417175), (0.10000000000000001, 0.69803923368453979, 0.69803923368453979), (0.20000000000000001, 0.83921569585800171, 0.83921569585800171), (0.29999999999999999, 0.95686274766921997, 0.95686274766921997), (0.40000000000000002, 0.99215686321258545, 0.99215686321258545), (0.5, 0.9686274528503418, 0.9686274528503418), (0.59999999999999998, 0.81960785388946533, 0.81960785388946533), (0.69999999999999996, 0.57254904508590698, 0.57254904508590698), (0.80000000000000004, 0.26274511218070984, 0.26274511218070984), (0.90000000000000002, 0.12941177189350128, 0.12941177189350128), (1.0, 0.019607843831181526, 0.019607843831181526), ], } _RdGy_data = { "blue": [ (0.0, 0.12156862765550613, 0.12156862765550613), (0.10000000000000001, 0.16862745583057404, 0.16862745583057404), (0.20000000000000001, 0.30196079611778259, 0.30196079611778259), (0.29999999999999999, 0.50980395078659058, 0.50980395078659058), (0.40000000000000002, 0.78039216995239258, 0.78039216995239258), (0.5, 1.0, 1.0), (0.59999999999999998, 0.87843137979507446, 0.87843137979507446), (0.69999999999999996, 0.729411780834198, 0.729411780834198), (0.80000000000000004, 0.52941179275512695, 0.52941179275512695), (0.90000000000000002, 0.30196079611778259, 0.30196079611778259), (1.0, 0.10196078568696976, 0.10196078568696976), ], "green": [ (0.0, 0.0, 0.0), (0.10000000000000001, 0.094117648899555206, 0.094117648899555206), (0.20000000000000001, 0.37647059559822083, 0.37647059559822083), (0.29999999999999999, 0.64705884456634521, 0.64705884456634521), (0.40000000000000002, 0.85882353782653809, 0.85882353782653809), (0.5, 1.0, 1.0), (0.59999999999999998, 0.87843137979507446, 0.87843137979507446), (0.69999999999999996, 0.729411780834198, 0.729411780834198), (0.80000000000000004, 0.52941179275512695, 0.52941179275512695), (0.90000000000000002, 0.30196079611778259, 0.30196079611778259), (1.0, 0.10196078568696976, 0.10196078568696976), ], "red": [ (0.0, 0.40392157435417175, 0.40392157435417175), (0.10000000000000001, 0.69803923368453979, 0.69803923368453979), (0.20000000000000001, 0.83921569585800171, 0.83921569585800171), (0.29999999999999999, 0.95686274766921997, 0.95686274766921997), (0.40000000000000002, 0.99215686321258545, 0.99215686321258545), (0.5, 1.0, 1.0), (0.59999999999999998, 0.87843137979507446, 0.87843137979507446), (0.69999999999999996, 0.729411780834198, 0.729411780834198), (0.80000000000000004, 0.52941179275512695, 0.52941179275512695), (0.90000000000000002, 0.30196079611778259, 0.30196079611778259), (1.0, 0.10196078568696976, 0.10196078568696976), ], } _RdPu_data = { "blue": [ (0.0, 0.9529411792755127, 0.9529411792755127), (0.125, 0.86666667461395264, 0.86666667461395264), (0.25, 0.75294119119644165, 0.75294119119644165), (0.375, 0.70980393886566162, 0.70980393886566162), (0.5, 0.63137257099151611, 0.63137257099151611), (0.625, 0.59215688705444336, 0.59215688705444336), (0.75, 0.49411764740943909, 0.49411764740943909), (0.875, 0.46666666865348816, 0.46666666865348816), (1.0, 0.41568627953529358, 0.41568627953529358), ], "green": [ (0.0, 0.9686274528503418, 0.9686274528503418), (0.125, 0.87843137979507446, 0.87843137979507446), (0.25, 0.77254903316497803, 0.77254903316497803), (0.375, 0.62352943420410156, 0.62352943420410156), (0.5, 0.40784314274787903, 0.40784314274787903), (0.625, 0.20392157137393951, 0.20392157137393951), (0.75, 0.0039215688593685627, 0.0039215688593685627), (0.875, 0.0039215688593685627, 0.0039215688593685627), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.99215686321258545, 0.99215686321258545), (0.25, 0.98823529481887817, 0.98823529481887817), (0.375, 0.98039215803146362, 0.98039215803146362), (0.5, 0.9686274528503418, 0.9686274528503418), (0.625, 0.86666667461395264, 0.86666667461395264), (0.75, 0.68235296010971069, 0.68235296010971069), (0.875, 0.47843137383460999, 0.47843137383460999), (1.0, 0.28627452254295349, 0.28627452254295349), ], } _RdYlBu_data = { "blue": [ (0.0, 0.14901961386203766, 0.14901961386203766), (0.10000000149011612, 0.15294118225574493, 0.15294118225574493), (0.20000000298023224, 0.26274511218070984, 0.26274511218070984), (0.30000001192092896, 0.3803921639919281, 0.3803921639919281), (0.40000000596046448, 0.56470590829849243, 0.56470590829849243), (0.5, 0.74901962280273438, 0.74901962280273438), (0.60000002384185791, 0.97254902124404907, 0.97254902124404907), (0.69999998807907104, 0.91372549533843994, 0.91372549533843994), (0.80000001192092896, 0.81960785388946533, 0.81960785388946533), (0.89999997615814209, 0.70588237047195435, 0.70588237047195435), (1.0, 0.58431375026702881, 0.58431375026702881), ], "green": [ (0.0, 0.0, 0.0), (0.10000000149011612, 0.18823529779911041, 0.18823529779911041), (0.20000000298023224, 0.42745098471641541, 0.42745098471641541), (0.30000001192092896, 0.68235296010971069, 0.68235296010971069), (0.40000000596046448, 0.87843137979507446, 0.87843137979507446), (0.5, 1.0, 1.0), (0.60000002384185791, 0.9529411792755127, 0.9529411792755127), (0.69999998807907104, 0.85098040103912354, 0.85098040103912354), (0.80000001192092896, 0.67843139171600342, 0.67843139171600342), (0.89999997615814209, 0.45882353186607361, 0.45882353186607361), (1.0, 0.21176470816135406, 0.21176470816135406), ], "red": [ (0.0, 0.64705884456634521, 0.64705884456634521), (0.10000000149011612, 0.84313726425170898, 0.84313726425170898), (0.20000000298023224, 0.95686274766921997, 0.95686274766921997), (0.30000001192092896, 0.99215686321258545, 0.99215686321258545), (0.40000000596046448, 0.99607843160629272, 0.99607843160629272), (0.5, 1.0, 1.0), (0.60000002384185791, 0.87843137979507446, 0.87843137979507446), (0.69999998807907104, 0.67058825492858887, 0.67058825492858887), (0.80000001192092896, 0.45490196347236633, 0.45490196347236633), (0.89999997615814209, 0.27058824896812439, 0.27058824896812439), (1.0, 0.19215686619281769, 0.19215686619281769), ], } _RdYlGn_data = { "blue": [ (0.0, 0.14901961386203766, 0.14901961386203766), (0.10000000000000001, 0.15294118225574493, 0.15294118225574493), (0.20000000000000001, 0.26274511218070984, 0.26274511218070984), (0.29999999999999999, 0.3803921639919281, 0.3803921639919281), (0.40000000000000002, 0.54509806632995605, 0.54509806632995605), (0.5, 0.74901962280273438, 0.74901962280273438), (0.59999999999999998, 0.54509806632995605, 0.54509806632995605), (0.69999999999999996, 0.41568627953529358, 0.41568627953529358), (0.80000000000000004, 0.38823530077934265, 0.38823530077934265), (0.90000000000000002, 0.31372550129890442, 0.31372550129890442), (1.0, 0.21568627655506134, 0.21568627655506134), ], "green": [ (0.0, 0.0, 0.0), (0.10000000000000001, 0.18823529779911041, 0.18823529779911041), (0.20000000000000001, 0.42745098471641541, 0.42745098471641541), (0.29999999999999999, 0.68235296010971069, 0.68235296010971069), (0.40000000000000002, 0.87843137979507446, 0.87843137979507446), (0.5, 1.0, 1.0), (0.59999999999999998, 0.93725490570068359, 0.93725490570068359), (0.69999999999999996, 0.85098040103912354, 0.85098040103912354), (0.80000000000000004, 0.74117648601531982, 0.74117648601531982), (0.90000000000000002, 0.59607845544815063, 0.59607845544815063), (1.0, 0.40784314274787903, 0.40784314274787903), ], "red": [ (0.0, 0.64705884456634521, 0.64705884456634521), (0.10000000000000001, 0.84313726425170898, 0.84313726425170898), (0.20000000000000001, 0.95686274766921997, 0.95686274766921997), (0.29999999999999999, 0.99215686321258545, 0.99215686321258545), (0.40000000000000002, 0.99607843160629272, 0.99607843160629272), (0.5, 1.0, 1.0), (0.59999999999999998, 0.85098040103912354, 0.85098040103912354), (0.69999999999999996, 0.65098041296005249, 0.65098041296005249), (0.80000000000000004, 0.40000000596046448, 0.40000000596046448), (0.90000000000000002, 0.10196078568696976, 0.10196078568696976), (1.0, 0.0, 0.0), ], } _Reds_data = { "blue": [ (0.0, 0.94117647409439087, 0.94117647409439087), (0.125, 0.82352942228317261, 0.82352942228317261), (0.25, 0.63137257099151611, 0.63137257099151611), (0.375, 0.44705882668495178, 0.44705882668495178), (0.5, 0.29019609093666077, 0.29019609093666077), (0.625, 0.17254902422428131, 0.17254902422428131), (0.75, 0.11372549086809158, 0.11372549086809158), (0.875, 0.08235294371843338, 0.08235294371843338), (1.0, 0.050980392843484879, 0.050980392843484879), ], "green": [ (0.0, 0.96078431606292725, 0.96078431606292725), (0.125, 0.87843137979507446, 0.87843137979507446), (0.25, 0.73333334922790527, 0.73333334922790527), (0.375, 0.57254904508590698, 0.57254904508590698), (0.5, 0.41568627953529358, 0.41568627953529358), (0.625, 0.23137255012989044, 0.23137255012989044), (0.75, 0.094117648899555206, 0.094117648899555206), (0.875, 0.058823529630899429, 0.058823529630899429), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.99607843160629272, 0.99607843160629272), (0.25, 0.98823529481887817, 0.98823529481887817), (0.375, 0.98823529481887817, 0.98823529481887817), (0.5, 0.9843137264251709, 0.9843137264251709), (0.625, 0.93725490570068359, 0.93725490570068359), (0.75, 0.79607844352722168, 0.79607844352722168), (0.875, 0.64705884456634521, 0.64705884456634521), (1.0, 0.40392157435417175, 0.40392157435417175), ], } _Set1_data = { "blue": [ (0.0, 0.10980392247438431, 0.10980392247438431), (0.125, 0.72156864404678345, 0.72156864404678345), (0.25, 0.29019609093666077, 0.29019609093666077), (0.375, 0.63921570777893066, 0.63921570777893066), (0.5, 0.0, 0.0), (0.625, 0.20000000298023224, 0.20000000298023224), (0.75, 0.15686275064945221, 0.15686275064945221), (0.875, 0.74901962280273438, 0.74901962280273438), (1.0, 0.60000002384185791, 0.60000002384185791), ], "green": [ (0.0, 0.10196078568696976, 0.10196078568696976), (0.125, 0.49411764740943909, 0.49411764740943909), (0.25, 0.68627452850341797, 0.68627452850341797), (0.375, 0.30588236451148987, 0.30588236451148987), (0.5, 0.49803921580314636, 0.49803921580314636), (0.625, 1.0, 1.0), (0.75, 0.33725491166114807, 0.33725491166114807), (0.875, 0.5058823823928833, 0.5058823823928833), (1.0, 0.60000002384185791, 0.60000002384185791), ], "red": [ (0.0, 0.89411765336990356, 0.89411765336990356), (0.125, 0.21568627655506134, 0.21568627655506134), (0.25, 0.30196079611778259, 0.30196079611778259), (0.375, 0.59607845544815063, 0.59607845544815063), (0.5, 1.0, 1.0), (0.625, 1.0, 1.0), (0.75, 0.65098041296005249, 0.65098041296005249), (0.875, 0.9686274528503418, 0.9686274528503418), (1.0, 0.60000002384185791, 0.60000002384185791), ], } _Set2_data = { "blue": [ (0.0, 0.64705884456634521, 0.64705884456634521), (0.14285714285714285, 0.38431373238563538, 0.38431373238563538), (0.2857142857142857, 0.79607844352722168, 0.79607844352722168), (0.42857142857142855, 0.76470589637756348, 0.76470589637756348), (0.5714285714285714, 0.32941177487373352, 0.32941177487373352), (0.7142857142857143, 0.18431372940540314, 0.18431372940540314), (0.8571428571428571, 0.58039218187332153, 0.58039218187332153), (1.0, 0.70196080207824707, 0.70196080207824707), ], "green": [ (0.0, 0.7607843279838562, 0.7607843279838562), (0.14285714285714285, 0.55294120311737061, 0.55294120311737061), (0.2857142857142857, 0.62745100259780884, 0.62745100259780884), (0.42857142857142855, 0.54117649793624878, 0.54117649793624878), (0.5714285714285714, 0.84705883264541626, 0.84705883264541626), (0.7142857142857143, 0.85098040103912354, 0.85098040103912354), (0.8571428571428571, 0.76862746477127075, 0.76862746477127075), (1.0, 0.70196080207824707, 0.70196080207824707), ], "red": [ (0.0, 0.40000000596046448, 0.40000000596046448), (0.14285714285714285, 0.98823529481887817, 0.98823529481887817), (0.2857142857142857, 0.55294120311737061, 0.55294120311737061), (0.42857142857142855, 0.90588235855102539, 0.90588235855102539), (0.5714285714285714, 0.65098041296005249, 0.65098041296005249), (0.7142857142857143, 1.0, 1.0), (0.8571428571428571, 0.89803922176361084, 0.89803922176361084), (1.0, 0.70196080207824707, 0.70196080207824707), ], } _Set3_data = { "blue": [ (0.0, 0.78039216995239258, 0.78039216995239258), (0.090909090909090912, 0.70196080207824707, 0.70196080207824707), (0.18181818181818182, 0.85490196943283081, 0.85490196943283081), (0.27272727272727271, 0.44705882668495178, 0.44705882668495178), (0.36363636363636365, 0.82745099067687988, 0.82745099067687988), (0.45454545454545453, 0.38431373238563538, 0.38431373238563538), (0.54545454545454541, 0.4117647111415863, 0.4117647111415863), (0.63636363636363635, 0.89803922176361084, 0.89803922176361084), (0.72727272727272729, 0.85098040103912354, 0.85098040103912354), (0.81818181818181823, 0.74117648601531982, 0.74117648601531982), (0.90909090909090906, 0.77254903316497803, 0.77254903316497803), (1.0, 0.43529412150382996, 0.43529412150382996), ], "green": [ (0.0, 0.82745099067687988, 0.82745099067687988), (0.090909090909090912, 1.0, 1.0), (0.18181818181818182, 0.729411780834198, 0.729411780834198), (0.27272727272727271, 0.50196081399917603, 0.50196081399917603), (0.36363636363636365, 0.69411766529083252, 0.69411766529083252), (0.45454545454545453, 0.70588237047195435, 0.70588237047195435), (0.54545454545454541, 0.87058824300765991, 0.87058824300765991), (0.63636363636363635, 0.80392158031463623, 0.80392158031463623), (0.72727272727272729, 0.85098040103912354, 0.85098040103912354), (0.81818181818181823, 0.50196081399917603, 0.50196081399917603), (0.90909090909090906, 0.92156863212585449, 0.92156863212585449), (1.0, 0.92941176891326904, 0.92941176891326904), ], "red": [ (0.0, 0.55294120311737061, 0.55294120311737061), (0.090909090909090912, 1.0, 1.0), (0.18181818181818182, 0.7450980544090271, 0.7450980544090271), (0.27272727272727271, 0.9843137264251709, 0.9843137264251709), (0.36363636363636365, 0.50196081399917603, 0.50196081399917603), (0.45454545454545453, 0.99215686321258545, 0.99215686321258545), (0.54545454545454541, 0.70196080207824707, 0.70196080207824707), (0.63636363636363635, 0.98823529481887817, 0.98823529481887817), (0.72727272727272729, 0.85098040103912354, 0.85098040103912354), (0.81818181818181823, 0.73725491762161255, 0.73725491762161255), (0.90909090909090906, 0.80000001192092896, 0.80000001192092896), (1.0, 1.0, 1.0), ], } _Spectral_data = { "blue": [ (0.0, 0.25882354378700256, 0.25882354378700256), (0.10000000000000001, 0.30980393290519714, 0.30980393290519714), (0.20000000000000001, 0.26274511218070984, 0.26274511218070984), (0.29999999999999999, 0.3803921639919281, 0.3803921639919281), (0.40000000000000002, 0.54509806632995605, 0.54509806632995605), (0.5, 0.74901962280273438, 0.74901962280273438), (0.59999999999999998, 0.59607845544815063, 0.59607845544815063), (0.69999999999999996, 0.64313727617263794, 0.64313727617263794), (0.80000000000000004, 0.64705884456634521, 0.64705884456634521), (0.90000000000000002, 0.74117648601531982, 0.74117648601531982), (1.0, 0.63529413938522339, 0.63529413938522339), ], "green": [ (0.0, 0.0039215688593685627, 0.0039215688593685627), (0.10000000000000001, 0.24313725531101227, 0.24313725531101227), (0.20000000000000001, 0.42745098471641541, 0.42745098471641541), (0.29999999999999999, 0.68235296010971069, 0.68235296010971069), (0.40000000000000002, 0.87843137979507446, 0.87843137979507446), (0.5, 1.0, 1.0), (0.59999999999999998, 0.96078431606292725, 0.96078431606292725), (0.69999999999999996, 0.86666667461395264, 0.86666667461395264), (0.80000000000000004, 0.7607843279838562, 0.7607843279838562), (0.90000000000000002, 0.53333336114883423, 0.53333336114883423), (1.0, 0.30980393290519714, 0.30980393290519714), ], "red": [ (0.0, 0.61960786581039429, 0.61960786581039429), (0.10000000000000001, 0.83529412746429443, 0.83529412746429443), (0.20000000000000001, 0.95686274766921997, 0.95686274766921997), (0.29999999999999999, 0.99215686321258545, 0.99215686321258545), (0.40000000000000002, 0.99607843160629272, 0.99607843160629272), (0.5, 1.0, 1.0), (0.59999999999999998, 0.90196079015731812, 0.90196079015731812), (0.69999999999999996, 0.67058825492858887, 0.67058825492858887), (0.80000000000000004, 0.40000000596046448, 0.40000000596046448), (0.90000000000000002, 0.19607843458652496, 0.19607843458652496), (1.0, 0.36862745881080627, 0.36862745881080627), ], } _YlGn_data = { "blue": [ (0.0, 0.89803922176361084, 0.89803922176361084), (0.125, 0.72549021244049072, 0.72549021244049072), (0.25, 0.63921570777893066, 0.63921570777893066), (0.375, 0.55686277151107788, 0.55686277151107788), (0.5, 0.47450980544090271, 0.47450980544090271), (0.625, 0.364705890417099, 0.364705890417099), (0.75, 0.26274511218070984, 0.26274511218070984), (0.875, 0.21568627655506134, 0.21568627655506134), (1.0, 0.16078431904315948, 0.16078431904315948), ], "green": [ (0.0, 1.0, 1.0), (0.125, 0.98823529481887817, 0.98823529481887817), (0.25, 0.94117647409439087, 0.94117647409439087), (0.375, 0.86666667461395264, 0.86666667461395264), (0.5, 0.7764706015586853, 0.7764706015586853), (0.625, 0.67058825492858887, 0.67058825492858887), (0.75, 0.51764708757400513, 0.51764708757400513), (0.875, 0.40784314274787903, 0.40784314274787903), (1.0, 0.27058824896812439, 0.27058824896812439), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.9686274528503418, 0.9686274528503418), (0.25, 0.85098040103912354, 0.85098040103912354), (0.375, 0.67843139171600342, 0.67843139171600342), (0.5, 0.47058823704719543, 0.47058823704719543), (0.625, 0.25490197539329529, 0.25490197539329529), (0.75, 0.13725490868091583, 0.13725490868091583), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], } _YlGnBu_data = { "blue": [ (0.0, 0.85098040103912354, 0.85098040103912354), (0.125, 0.69411766529083252, 0.69411766529083252), (0.25, 0.70588237047195435, 0.70588237047195435), (0.375, 0.73333334922790527, 0.73333334922790527), (0.5, 0.76862746477127075, 0.76862746477127075), (0.625, 0.75294119119644165, 0.75294119119644165), (0.75, 0.65882354974746704, 0.65882354974746704), (0.875, 0.58039218187332153, 0.58039218187332153), (1.0, 0.34509804844856262, 0.34509804844856262), ], "green": [ (0.0, 1.0, 1.0), (0.125, 0.97254902124404907, 0.97254902124404907), (0.25, 0.91372549533843994, 0.91372549533843994), (0.375, 0.80392158031463623, 0.80392158031463623), (0.5, 0.7137255072593689, 0.7137255072593689), (0.625, 0.56862747669219971, 0.56862747669219971), (0.75, 0.36862745881080627, 0.36862745881080627), (0.875, 0.20392157137393951, 0.20392157137393951), (1.0, 0.11372549086809158, 0.11372549086809158), ], "red": [ (0.0, 1.0, 1.0), (0.125, 0.92941176891326904, 0.92941176891326904), (0.25, 0.78039216995239258, 0.78039216995239258), (0.375, 0.49803921580314636, 0.49803921580314636), (0.5, 0.25490197539329529, 0.25490197539329529), (0.625, 0.11372549086809158, 0.11372549086809158), (0.75, 0.13333334028720856, 0.13333334028720856), (0.875, 0.14509804546833038, 0.14509804546833038), (1.0, 0.031372550874948502, 0.031372550874948502), ], } _YlOrBr_data = { "blue": [ (0.0, 0.89803922176361084, 0.89803922176361084), (0.125, 0.73725491762161255, 0.73725491762161255), (0.25, 0.56862747669219971, 0.56862747669219971), (0.375, 0.30980393290519714, 0.30980393290519714), (0.5, 0.16078431904315948, 0.16078431904315948), (0.625, 0.078431375324726105, 0.078431375324726105), (0.75, 0.0078431377187371254, 0.0078431377187371254), (0.875, 0.015686275437474251, 0.015686275437474251), (1.0, 0.023529412224888802, 0.023529412224888802), ], "green": [ (0.0, 1.0, 1.0), (0.125, 0.9686274528503418, 0.9686274528503418), (0.25, 0.89019608497619629, 0.89019608497619629), (0.375, 0.76862746477127075, 0.76862746477127075), (0.5, 0.60000002384185791, 0.60000002384185791), (0.625, 0.43921568989753723, 0.43921568989753723), (0.75, 0.29803922772407532, 0.29803922772407532), (0.875, 0.20392157137393951, 0.20392157137393951), (1.0, 0.14509804546833038, 0.14509804546833038), ], "red": [ (0.0, 1.0, 1.0), (0.125, 1.0, 1.0), (0.25, 0.99607843160629272, 0.99607843160629272), (0.375, 0.99607843160629272, 0.99607843160629272), (0.5, 0.99607843160629272, 0.99607843160629272), (0.625, 0.92549020051956177, 0.92549020051956177), (0.75, 0.80000001192092896, 0.80000001192092896), (0.875, 0.60000002384185791, 0.60000002384185791), (1.0, 0.40000000596046448, 0.40000000596046448), ], } _YlOrRd_data = { "blue": [ (0.0, 0.80000001192092896, 0.80000001192092896), (0.125, 0.62745100259780884, 0.62745100259780884), (0.25, 0.46274510025978088, 0.46274510025978088), (0.375, 0.29803922772407532, 0.29803922772407532), (0.5, 0.23529411852359772, 0.23529411852359772), (0.625, 0.16470588743686676, 0.16470588743686676), (0.75, 0.10980392247438431, 0.10980392247438431), (0.875, 0.14901961386203766, 0.14901961386203766), (1.0, 0.14901961386203766, 0.14901961386203766), ], "green": [ (0.0, 1.0, 1.0), (0.125, 0.92941176891326904, 0.92941176891326904), (0.25, 0.85098040103912354, 0.85098040103912354), (0.375, 0.69803923368453979, 0.69803923368453979), (0.5, 0.55294120311737061, 0.55294120311737061), (0.625, 0.30588236451148987, 0.30588236451148987), (0.75, 0.10196078568696976, 0.10196078568696976), (0.875, 0.0, 0.0), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.125, 1.0, 1.0), (0.25, 0.99607843160629272, 0.99607843160629272), (0.375, 0.99607843160629272, 0.99607843160629272), (0.5, 0.99215686321258545, 0.99215686321258545), (0.625, 0.98823529481887817, 0.98823529481887817), (0.75, 0.89019608497619629, 0.89019608497619629), (0.875, 0.74117648601531982, 0.74117648601531982), (1.0, 0.50196081399917603, 0.50196081399917603), ], } # The next 7 palettes are from the Yorick scientific visalisation package, # an evolution of the GIST package, both by David H. Munro. # They are released under a BSD-like license (see LICENSE_YORICK in # the license directory of the matplotlib source distribution). _gist_earth_data = { "blue": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.18039216101169586, 0.18039216101169586), (0.0084033617749810219, 0.22745098173618317, 0.22745098173618317), (0.012605042196810246, 0.27058824896812439, 0.27058824896812439), (0.016806723549962044, 0.31764706969261169, 0.31764706969261169), (0.021008403971791267, 0.36078432202339172, 0.36078432202339172), (0.025210084393620491, 0.40784314274787903, 0.40784314274787903), (0.029411764815449715, 0.45490196347236633, 0.45490196347236633), (0.033613447099924088, 0.45490196347236633, 0.45490196347236633), (0.037815127521753311, 0.45490196347236633, 0.45490196347236633), (0.042016807943582535, 0.45490196347236633, 0.45490196347236633), (0.046218488365411758, 0.45490196347236633, 0.45490196347236633), (0.050420168787240982, 0.45882353186607361, 0.45882353186607361), (0.054621849209070206, 0.45882353186607361, 0.45882353186607361), (0.058823529630899429, 0.45882353186607361, 0.45882353186607361), (0.063025213778018951, 0.45882353186607361, 0.45882353186607361), (0.067226894199848175, 0.45882353186607361, 0.45882353186607361), (0.071428574621677399, 0.46274510025978088, 0.46274510025978088), (0.075630255043506622, 0.46274510025978088, 0.46274510025978088), (0.079831935465335846, 0.46274510025978088, 0.46274510025978088), (0.08403361588716507, 0.46274510025978088, 0.46274510025978088), (0.088235296308994293, 0.46274510025978088, 0.46274510025978088), (0.092436976730823517, 0.46666666865348816, 0.46666666865348816), (0.09663865715265274, 0.46666666865348816, 0.46666666865348816), (0.10084033757448196, 0.46666666865348816, 0.46666666865348816), (0.10504201799631119, 0.46666666865348816, 0.46666666865348816), (0.10924369841814041, 0.46666666865348816, 0.46666666865348816), (0.11344537883996964, 0.47058823704719543, 0.47058823704719543), (0.11764705926179886, 0.47058823704719543, 0.47058823704719543), (0.12184873968362808, 0.47058823704719543, 0.47058823704719543), (0.1260504275560379, 0.47058823704719543, 0.47058823704719543), (0.13025210797786713, 0.47058823704719543, 0.47058823704719543), (0.13445378839969635, 0.47450980544090271, 0.47450980544090271), (0.13865546882152557, 0.47450980544090271, 0.47450980544090271), (0.1428571492433548, 0.47450980544090271, 0.47450980544090271), (0.14705882966518402, 0.47450980544090271, 0.47450980544090271), (0.15126051008701324, 0.47450980544090271, 0.47450980544090271), (0.15546219050884247, 0.47843137383460999, 0.47843137383460999), (0.15966387093067169, 0.47843137383460999, 0.47843137383460999), (0.16386555135250092, 0.47843137383460999, 0.47843137383460999), (0.16806723177433014, 0.47843137383460999, 0.47843137383460999), (0.17226891219615936, 0.47843137383460999, 0.47843137383460999), (0.17647059261798859, 0.48235294222831726, 0.48235294222831726), (0.18067227303981781, 0.48235294222831726, 0.48235294222831726), (0.18487395346164703, 0.48235294222831726, 0.48235294222831726), (0.18907563388347626, 0.48235294222831726, 0.48235294222831726), (0.19327731430530548, 0.48235294222831726, 0.48235294222831726), (0.1974789947271347, 0.48627451062202454, 0.48627451062202454), (0.20168067514896393, 0.48627451062202454, 0.48627451062202454), (0.20588235557079315, 0.48627451062202454, 0.48627451062202454), (0.21008403599262238, 0.48627451062202454, 0.48627451062202454), (0.2142857164144516, 0.48627451062202454, 0.48627451062202454), (0.21848739683628082, 0.49019607901573181, 0.49019607901573181), (0.22268907725811005, 0.49019607901573181, 0.49019607901573181), (0.22689075767993927, 0.49019607901573181, 0.49019607901573181), (0.23109243810176849, 0.49019607901573181, 0.49019607901573181), (0.23529411852359772, 0.49019607901573181, 0.49019607901573181), (0.23949579894542694, 0.49411764740943909, 0.49411764740943909), (0.24369747936725616, 0.49411764740943909, 0.49411764740943909), (0.24789915978908539, 0.49411764740943909, 0.49411764740943909), (0.25210085511207581, 0.49411764740943909, 0.49411764740943909), (0.25630253553390503, 0.49411764740943909, 0.49411764740943909), (0.26050421595573425, 0.49803921580314636, 0.49803921580314636), (0.26470589637756348, 0.49803921580314636, 0.49803921580314636), (0.2689075767993927, 0.49803921580314636, 0.49803921580314636), (0.27310925722122192, 0.49803921580314636, 0.49803921580314636), (0.27731093764305115, 0.49803921580314636, 0.49803921580314636), (0.28151261806488037, 0.50196081399917603, 0.50196081399917603), (0.28571429848670959, 0.49411764740943909, 0.49411764740943909), (0.28991597890853882, 0.49019607901573181, 0.49019607901573181), (0.29411765933036804, 0.48627451062202454, 0.48627451062202454), (0.29831933975219727, 0.48235294222831726, 0.48235294222831726), (0.30252102017402649, 0.47843137383460999, 0.47843137383460999), (0.30672270059585571, 0.47058823704719543, 0.47058823704719543), (0.31092438101768494, 0.46666666865348816, 0.46666666865348816), (0.31512606143951416, 0.46274510025978088, 0.46274510025978088), (0.31932774186134338, 0.45882353186607361, 0.45882353186607361), (0.32352942228317261, 0.45098039507865906, 0.45098039507865906), (0.32773110270500183, 0.44705882668495178, 0.44705882668495178), (0.33193278312683105, 0.44313725829124451, 0.44313725829124451), (0.33613446354866028, 0.43529412150382996, 0.43529412150382996), (0.3403361439704895, 0.43137255311012268, 0.43137255311012268), (0.34453782439231873, 0.42745098471641541, 0.42745098471641541), (0.34873950481414795, 0.42352941632270813, 0.42352941632270813), (0.35294118523597717, 0.41568627953529358, 0.41568627953529358), (0.3571428656578064, 0.4117647111415863, 0.4117647111415863), (0.36134454607963562, 0.40784314274787903, 0.40784314274787903), (0.36554622650146484, 0.40000000596046448, 0.40000000596046448), (0.36974790692329407, 0.3960784375667572, 0.3960784375667572), (0.37394958734512329, 0.39215686917304993, 0.39215686917304993), (0.37815126776695251, 0.38431373238563538, 0.38431373238563538), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.37647059559822083, 0.37647059559822083), (0.39075630903244019, 0.36862745881080627, 0.36862745881080627), (0.39495798945426941, 0.364705890417099, 0.364705890417099), (0.39915966987609863, 0.36078432202339172, 0.36078432202339172), (0.40336135029792786, 0.35294118523597717, 0.35294118523597717), (0.40756303071975708, 0.3490196168422699, 0.3490196168422699), (0.4117647111415863, 0.34509804844856262, 0.34509804844856262), (0.41596639156341553, 0.33725491166114807, 0.33725491166114807), (0.42016807198524475, 0.3333333432674408, 0.3333333432674408), (0.42436975240707397, 0.32941177487373352, 0.32941177487373352), (0.4285714328289032, 0.32156863808631897, 0.32156863808631897), (0.43277311325073242, 0.31764706969261169, 0.31764706969261169), (0.43697479367256165, 0.31372550129890442, 0.31372550129890442), (0.44117647409439087, 0.30588236451148987, 0.30588236451148987), (0.44537815451622009, 0.30196079611778259, 0.30196079611778259), (0.44957983493804932, 0.29803922772407532, 0.29803922772407532), (0.45378151535987854, 0.29019609093666077, 0.29019609093666077), (0.45798319578170776, 0.28627452254295349, 0.28627452254295349), (0.46218487620353699, 0.27843138575553894, 0.27843138575553894), (0.46638655662536621, 0.27450981736183167, 0.27450981736183167), (0.47058823704719543, 0.27843138575553894, 0.27843138575553894), (0.47478991746902466, 0.28235295414924622, 0.28235295414924622), (0.47899159789085388, 0.28235295414924622, 0.28235295414924622), (0.48319327831268311, 0.28627452254295349, 0.28627452254295349), (0.48739495873451233, 0.28627452254295349, 0.28627452254295349), (0.49159663915634155, 0.29019609093666077, 0.29019609093666077), (0.49579831957817078, 0.29411765933036804, 0.29411765933036804), (0.5, 0.29411765933036804, 0.29411765933036804), (0.50420171022415161, 0.29803922772407532, 0.29803922772407532), (0.50840336084365845, 0.29803922772407532, 0.29803922772407532), (0.51260507106781006, 0.30196079611778259, 0.30196079611778259), (0.51680672168731689, 0.30196079611778259, 0.30196079611778259), (0.52100843191146851, 0.30588236451148987, 0.30588236451148987), (0.52521008253097534, 0.30980393290519714, 0.30980393290519714), (0.52941179275512695, 0.30980393290519714, 0.30980393290519714), (0.53361344337463379, 0.31372550129890442, 0.31372550129890442), (0.5378151535987854, 0.31372550129890442, 0.31372550129890442), (0.54201680421829224, 0.31764706969261169, 0.31764706969261169), (0.54621851444244385, 0.32156863808631897, 0.32156863808631897), (0.55042016506195068, 0.32156863808631897, 0.32156863808631897), (0.55462187528610229, 0.32156863808631897, 0.32156863808631897), (0.55882352590560913, 0.32549020648002625, 0.32549020648002625), (0.56302523612976074, 0.32549020648002625, 0.32549020648002625), (0.56722688674926758, 0.32549020648002625, 0.32549020648002625), (0.57142859697341919, 0.32941177487373352, 0.32941177487373352), (0.57563024759292603, 0.32941177487373352, 0.32941177487373352), (0.57983195781707764, 0.32941177487373352, 0.32941177487373352), (0.58403360843658447, 0.3333333432674408, 0.3333333432674408), (0.58823531866073608, 0.3333333432674408, 0.3333333432674408), (0.59243696928024292, 0.3333333432674408, 0.3333333432674408), (0.59663867950439453, 0.33725491166114807, 0.33725491166114807), (0.60084033012390137, 0.33725491166114807, 0.33725491166114807), (0.60504204034805298, 0.33725491166114807, 0.33725491166114807), (0.60924369096755981, 0.34117648005485535, 0.34117648005485535), (0.61344540119171143, 0.34117648005485535, 0.34117648005485535), (0.61764705181121826, 0.34117648005485535, 0.34117648005485535), (0.62184876203536987, 0.34509804844856262, 0.34509804844856262), (0.62605041265487671, 0.34509804844856262, 0.34509804844856262), (0.63025212287902832, 0.34509804844856262, 0.34509804844856262), (0.63445377349853516, 0.3490196168422699, 0.3490196168422699), (0.63865548372268677, 0.3490196168422699, 0.3490196168422699), (0.6428571343421936, 0.3490196168422699, 0.3490196168422699), (0.64705884456634521, 0.35294118523597717, 0.35294118523597717), (0.65126049518585205, 0.35294118523597717, 0.35294118523597717), (0.65546220541000366, 0.35294118523597717, 0.35294118523597717), (0.6596638560295105, 0.35686275362968445, 0.35686275362968445), (0.66386556625366211, 0.35686275362968445, 0.35686275362968445), (0.66806721687316895, 0.35686275362968445, 0.35686275362968445), (0.67226892709732056, 0.36078432202339172, 0.36078432202339172), (0.67647057771682739, 0.36078432202339172, 0.36078432202339172), (0.680672287940979, 0.36078432202339172, 0.36078432202339172), (0.68487393856048584, 0.364705890417099, 0.364705890417099), (0.68907564878463745, 0.364705890417099, 0.364705890417099), (0.69327729940414429, 0.364705890417099, 0.364705890417099), (0.6974790096282959, 0.36862745881080627, 0.36862745881080627), (0.70168066024780273, 0.36862745881080627, 0.36862745881080627), (0.70588237047195435, 0.36862745881080627, 0.36862745881080627), (0.71008402109146118, 0.37254902720451355, 0.37254902720451355), (0.71428573131561279, 0.37254902720451355, 0.37254902720451355), (0.71848738193511963, 0.37254902720451355, 0.37254902720451355), (0.72268909215927124, 0.37647059559822083, 0.37647059559822083), (0.72689074277877808, 0.37647059559822083, 0.37647059559822083), (0.73109245300292969, 0.3803921639919281, 0.3803921639919281), (0.73529410362243652, 0.3803921639919281, 0.3803921639919281), (0.73949581384658813, 0.3803921639919281, 0.3803921639919281), (0.74369746446609497, 0.38431373238563538, 0.38431373238563538), (0.74789917469024658, 0.38431373238563538, 0.38431373238563538), (0.75210082530975342, 0.38431373238563538, 0.38431373238563538), (0.75630253553390503, 0.38823530077934265, 0.38823530077934265), (0.76050418615341187, 0.38823530077934265, 0.38823530077934265), (0.76470589637756348, 0.38823530077934265, 0.38823530077934265), (0.76890754699707031, 0.39215686917304993, 0.39215686917304993), (0.77310925722122192, 0.39215686917304993, 0.39215686917304993), (0.77731090784072876, 0.39215686917304993, 0.39215686917304993), (0.78151261806488037, 0.3960784375667572, 0.3960784375667572), (0.78571426868438721, 0.3960784375667572, 0.3960784375667572), (0.78991597890853882, 0.40784314274787903, 0.40784314274787903), (0.79411762952804565, 0.41568627953529358, 0.41568627953529358), (0.79831933975219727, 0.42352941632270813, 0.42352941632270813), (0.8025209903717041, 0.43529412150382996, 0.43529412150382996), (0.80672270059585571, 0.44313725829124451, 0.44313725829124451), (0.81092435121536255, 0.45490196347236633, 0.45490196347236633), (0.81512606143951416, 0.46274510025978088, 0.46274510025978088), (0.819327712059021, 0.47450980544090271, 0.47450980544090271), (0.82352942228317261, 0.48235294222831726, 0.48235294222831726), (0.82773107290267944, 0.49411764740943909, 0.49411764740943909), (0.83193278312683105, 0.5058823823928833, 0.5058823823928833), (0.83613443374633789, 0.51372551918029785, 0.51372551918029785), (0.8403361439704895, 0.52549022436141968, 0.52549022436141968), (0.84453779458999634, 0.5372549295425415, 0.5372549295425415), (0.84873950481414795, 0.54509806632995605, 0.54509806632995605), (0.85294115543365479, 0.55686277151107788, 0.55686277151107788), (0.8571428656578064, 0.56862747669219971, 0.56862747669219971), (0.86134451627731323, 0.58039218187332153, 0.58039218187332153), (0.86554622650146484, 0.58823531866073608, 0.58823531866073608), (0.86974787712097168, 0.60000002384185791, 0.60000002384185791), (0.87394958734512329, 0.61176472902297974, 0.61176472902297974), (0.87815123796463013, 0.62352943420410156, 0.62352943420410156), (0.88235294818878174, 0.63529413938522339, 0.63529413938522339), (0.88655459880828857, 0.64705884456634521, 0.64705884456634521), (0.89075630903244019, 0.65882354974746704, 0.65882354974746704), (0.89495795965194702, 0.66666668653488159, 0.66666668653488159), (0.89915966987609863, 0.67843139171600342, 0.67843139171600342), (0.90336132049560547, 0.69019609689712524, 0.69019609689712524), (0.90756303071975708, 0.70196080207824707, 0.70196080207824707), (0.91176468133926392, 0.7137255072593689, 0.7137255072593689), (0.91596639156341553, 0.72549021244049072, 0.72549021244049072), (0.92016804218292236, 0.74117648601531982, 0.74117648601531982), (0.92436975240707397, 0.75294119119644165, 0.75294119119644165), (0.92857140302658081, 0.76470589637756348, 0.76470589637756348), (0.93277311325073242, 0.7764706015586853, 0.7764706015586853), (0.93697476387023926, 0.78823530673980713, 0.78823530673980713), (0.94117647409439087, 0.80000001192092896, 0.80000001192092896), (0.94537812471389771, 0.81176471710205078, 0.81176471710205078), (0.94957983493804932, 0.82745099067687988, 0.82745099067687988), (0.95378148555755615, 0.83921569585800171, 0.83921569585800171), (0.95798319578170776, 0.85098040103912354, 0.85098040103912354), (0.9621848464012146, 0.86274510622024536, 0.86274510622024536), (0.96638655662536621, 0.87843137979507446, 0.87843137979507446), (0.97058820724487305, 0.89019608497619629, 0.89019608497619629), (0.97478991746902466, 0.90196079015731812, 0.90196079015731812), (0.97899156808853149, 0.91764706373214722, 0.91764706373214722), (0.98319327831268311, 0.92941176891326904, 0.92941176891326904), (0.98739492893218994, 0.94509804248809814, 0.94509804248809814), (0.99159663915634155, 0.95686274766921997, 0.95686274766921997), (0.99579828977584839, 0.97254902124404907, 0.97254902124404907), (1.0, 0.9843137264251709, 0.9843137264251709), ], "green": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.011764706112444401, 0.011764706112444401), (0.037815127521753311, 0.023529412224888802, 0.023529412224888802), (0.042016807943582535, 0.031372550874948502, 0.031372550874948502), (0.046218488365411758, 0.043137256056070328, 0.043137256056070328), (0.050420168787240982, 0.050980392843484879, 0.050980392843484879), (0.054621849209070206, 0.062745101749897003, 0.062745101749897003), (0.058823529630899429, 0.070588238537311554, 0.070588238537311554), (0.063025213778018951, 0.08235294371843338, 0.08235294371843338), (0.067226894199848175, 0.090196080505847931, 0.090196080505847931), (0.071428574621677399, 0.10196078568696976, 0.10196078568696976), (0.075630255043506622, 0.10980392247438431, 0.10980392247438431), (0.079831935465335846, 0.12156862765550613, 0.12156862765550613), (0.08403361588716507, 0.12941177189350128, 0.12941177189350128), (0.088235296308994293, 0.14117647707462311, 0.14117647707462311), (0.092436976730823517, 0.14901961386203766, 0.14901961386203766), (0.09663865715265274, 0.16078431904315948, 0.16078431904315948), (0.10084033757448196, 0.16862745583057404, 0.16862745583057404), (0.10504201799631119, 0.17647059261798859, 0.17647059261798859), (0.10924369841814041, 0.18823529779911041, 0.18823529779911041), (0.11344537883996964, 0.19607843458652496, 0.19607843458652496), (0.11764705926179886, 0.20392157137393951, 0.20392157137393951), (0.12184873968362808, 0.21568627655506134, 0.21568627655506134), (0.1260504275560379, 0.22352941334247589, 0.22352941334247589), (0.13025210797786713, 0.23137255012989044, 0.23137255012989044), (0.13445378839969635, 0.23921568691730499, 0.23921568691730499), (0.13865546882152557, 0.25098040699958801, 0.25098040699958801), (0.1428571492433548, 0.25882354378700256, 0.25882354378700256), (0.14705882966518402, 0.26666668057441711, 0.26666668057441711), (0.15126051008701324, 0.27450981736183167, 0.27450981736183167), (0.15546219050884247, 0.28235295414924622, 0.28235295414924622), (0.15966387093067169, 0.29019609093666077, 0.29019609093666077), (0.16386555135250092, 0.30196079611778259, 0.30196079611778259), (0.16806723177433014, 0.30980393290519714, 0.30980393290519714), (0.17226891219615936, 0.31764706969261169, 0.31764706969261169), (0.17647059261798859, 0.32549020648002625, 0.32549020648002625), (0.18067227303981781, 0.3333333432674408, 0.3333333432674408), (0.18487395346164703, 0.34117648005485535, 0.34117648005485535), (0.18907563388347626, 0.3490196168422699, 0.3490196168422699), (0.19327731430530548, 0.35686275362968445, 0.35686275362968445), (0.1974789947271347, 0.364705890417099, 0.364705890417099), (0.20168067514896393, 0.37254902720451355, 0.37254902720451355), (0.20588235557079315, 0.3803921639919281, 0.3803921639919281), (0.21008403599262238, 0.38823530077934265, 0.38823530077934265), (0.2142857164144516, 0.39215686917304993, 0.39215686917304993), (0.21848739683628082, 0.40000000596046448, 0.40000000596046448), (0.22268907725811005, 0.40784314274787903, 0.40784314274787903), (0.22689075767993927, 0.41568627953529358, 0.41568627953529358), (0.23109243810176849, 0.42352941632270813, 0.42352941632270813), (0.23529411852359772, 0.42745098471641541, 0.42745098471641541), (0.23949579894542694, 0.43529412150382996, 0.43529412150382996), (0.24369747936725616, 0.44313725829124451, 0.44313725829124451), (0.24789915978908539, 0.45098039507865906, 0.45098039507865906), (0.25210085511207581, 0.45490196347236633, 0.45490196347236633), (0.25630253553390503, 0.46274510025978088, 0.46274510025978088), (0.26050421595573425, 0.47058823704719543, 0.47058823704719543), (0.26470589637756348, 0.47450980544090271, 0.47450980544090271), (0.2689075767993927, 0.48235294222831726, 0.48235294222831726), (0.27310925722122192, 0.49019607901573181, 0.49019607901573181), (0.27731093764305115, 0.49411764740943909, 0.49411764740943909), (0.28151261806488037, 0.50196081399917603, 0.50196081399917603), (0.28571429848670959, 0.50196081399917603, 0.50196081399917603), (0.28991597890853882, 0.5058823823928833, 0.5058823823928833), (0.29411765933036804, 0.5058823823928833, 0.5058823823928833), (0.29831933975219727, 0.50980395078659058, 0.50980395078659058), (0.30252102017402649, 0.51372551918029785, 0.51372551918029785), (0.30672270059585571, 0.51372551918029785, 0.51372551918029785), (0.31092438101768494, 0.51764708757400513, 0.51764708757400513), (0.31512606143951416, 0.5215686559677124, 0.5215686559677124), (0.31932774186134338, 0.5215686559677124, 0.5215686559677124), (0.32352942228317261, 0.52549022436141968, 0.52549022436141968), (0.32773110270500183, 0.52549022436141968, 0.52549022436141968), (0.33193278312683105, 0.52941179275512695, 0.52941179275512695), (0.33613446354866028, 0.53333336114883423, 0.53333336114883423), (0.3403361439704895, 0.53333336114883423, 0.53333336114883423), (0.34453782439231873, 0.5372549295425415, 0.5372549295425415), (0.34873950481414795, 0.54117649793624878, 0.54117649793624878), (0.35294118523597717, 0.54117649793624878, 0.54117649793624878), (0.3571428656578064, 0.54509806632995605, 0.54509806632995605), (0.36134454607963562, 0.54901963472366333, 0.54901963472366333), (0.36554622650146484, 0.54901963472366333, 0.54901963472366333), (0.36974790692329407, 0.55294120311737061, 0.55294120311737061), (0.37394958734512329, 0.55294120311737061, 0.55294120311737061), (0.37815126776695251, 0.55686277151107788, 0.55686277151107788), (0.38235294818878174, 0.56078433990478516, 0.56078433990478516), (0.38655462861061096, 0.56078433990478516, 0.56078433990478516), (0.39075630903244019, 0.56470590829849243, 0.56470590829849243), (0.39495798945426941, 0.56862747669219971, 0.56862747669219971), (0.39915966987609863, 0.56862747669219971, 0.56862747669219971), (0.40336135029792786, 0.57254904508590698, 0.57254904508590698), (0.40756303071975708, 0.57254904508590698, 0.57254904508590698), (0.4117647111415863, 0.57647061347961426, 0.57647061347961426), (0.41596639156341553, 0.58039218187332153, 0.58039218187332153), (0.42016807198524475, 0.58039218187332153, 0.58039218187332153), (0.42436975240707397, 0.58431375026702881, 0.58431375026702881), (0.4285714328289032, 0.58823531866073608, 0.58823531866073608), (0.43277311325073242, 0.58823531866073608, 0.58823531866073608), (0.43697479367256165, 0.59215688705444336, 0.59215688705444336), (0.44117647409439087, 0.59215688705444336, 0.59215688705444336), (0.44537815451622009, 0.59607845544815063, 0.59607845544815063), (0.44957983493804932, 0.60000002384185791, 0.60000002384185791), (0.45378151535987854, 0.60000002384185791, 0.60000002384185791), (0.45798319578170776, 0.60392159223556519, 0.60392159223556519), (0.46218487620353699, 0.60784316062927246, 0.60784316062927246), (0.46638655662536621, 0.60784316062927246, 0.60784316062927246), (0.47058823704719543, 0.61176472902297974, 0.61176472902297974), (0.47478991746902466, 0.61176472902297974, 0.61176472902297974), (0.47899159789085388, 0.61568629741668701, 0.61568629741668701), (0.48319327831268311, 0.61960786581039429, 0.61960786581039429), (0.48739495873451233, 0.61960786581039429, 0.61960786581039429), (0.49159663915634155, 0.62352943420410156, 0.62352943420410156), (0.49579831957817078, 0.62745100259780884, 0.62745100259780884), (0.5, 0.62745100259780884, 0.62745100259780884), (0.50420171022415161, 0.63137257099151611, 0.63137257099151611), (0.50840336084365845, 0.63137257099151611, 0.63137257099151611), (0.51260507106781006, 0.63529413938522339, 0.63529413938522339), (0.51680672168731689, 0.63921570777893066, 0.63921570777893066), (0.52100843191146851, 0.63921570777893066, 0.63921570777893066), (0.52521008253097534, 0.64313727617263794, 0.64313727617263794), (0.52941179275512695, 0.64705884456634521, 0.64705884456634521), (0.53361344337463379, 0.64705884456634521, 0.64705884456634521), (0.5378151535987854, 0.65098041296005249, 0.65098041296005249), (0.54201680421829224, 0.65098041296005249, 0.65098041296005249), (0.54621851444244385, 0.65490198135375977, 0.65490198135375977), (0.55042016506195068, 0.65882354974746704, 0.65882354974746704), (0.55462187528610229, 0.65882354974746704, 0.65882354974746704), (0.55882352590560913, 0.65882354974746704, 0.65882354974746704), (0.56302523612976074, 0.66274511814117432, 0.66274511814117432), (0.56722688674926758, 0.66274511814117432, 0.66274511814117432), (0.57142859697341919, 0.66666668653488159, 0.66666668653488159), (0.57563024759292603, 0.66666668653488159, 0.66666668653488159), (0.57983195781707764, 0.67058825492858887, 0.67058825492858887), (0.58403360843658447, 0.67058825492858887, 0.67058825492858887), (0.58823531866073608, 0.67450982332229614, 0.67450982332229614), (0.59243696928024292, 0.67450982332229614, 0.67450982332229614), (0.59663867950439453, 0.67450982332229614, 0.67450982332229614), (0.60084033012390137, 0.67843139171600342, 0.67843139171600342), (0.60504204034805298, 0.67843139171600342, 0.67843139171600342), (0.60924369096755981, 0.68235296010971069, 0.68235296010971069), (0.61344540119171143, 0.68235296010971069, 0.68235296010971069), (0.61764705181121826, 0.68627452850341797, 0.68627452850341797), (0.62184876203536987, 0.68627452850341797, 0.68627452850341797), (0.62605041265487671, 0.68627452850341797, 0.68627452850341797), (0.63025212287902832, 0.69019609689712524, 0.69019609689712524), (0.63445377349853516, 0.69019609689712524, 0.69019609689712524), (0.63865548372268677, 0.69411766529083252, 0.69411766529083252), (0.6428571343421936, 0.69411766529083252, 0.69411766529083252), (0.64705884456634521, 0.69803923368453979, 0.69803923368453979), (0.65126049518585205, 0.69803923368453979, 0.69803923368453979), (0.65546220541000366, 0.70196080207824707, 0.70196080207824707), (0.6596638560295105, 0.70196080207824707, 0.70196080207824707), (0.66386556625366211, 0.70196080207824707, 0.70196080207824707), (0.66806721687316895, 0.70588237047195435, 0.70588237047195435), (0.67226892709732056, 0.70588237047195435, 0.70588237047195435), (0.67647057771682739, 0.70980393886566162, 0.70980393886566162), (0.680672287940979, 0.70980393886566162, 0.70980393886566162), (0.68487393856048584, 0.7137255072593689, 0.7137255072593689), (0.68907564878463745, 0.7137255072593689, 0.7137255072593689), (0.69327729940414429, 0.71764707565307617, 0.71764707565307617), (0.6974790096282959, 0.71764707565307617, 0.71764707565307617), (0.70168066024780273, 0.7137255072593689, 0.7137255072593689), (0.70588237047195435, 0.70980393886566162, 0.70980393886566162), (0.71008402109146118, 0.70980393886566162, 0.70980393886566162), (0.71428573131561279, 0.70588237047195435, 0.70588237047195435), (0.71848738193511963, 0.70196080207824707, 0.70196080207824707), (0.72268909215927124, 0.69803923368453979, 0.69803923368453979), (0.72689074277877808, 0.69411766529083252, 0.69411766529083252), (0.73109245300292969, 0.69019609689712524, 0.69019609689712524), (0.73529410362243652, 0.68627452850341797, 0.68627452850341797), (0.73949581384658813, 0.68235296010971069, 0.68235296010971069), (0.74369746446609497, 0.67843139171600342, 0.67843139171600342), (0.74789917469024658, 0.67450982332229614, 0.67450982332229614), (0.75210082530975342, 0.67058825492858887, 0.67058825492858887), (0.75630253553390503, 0.66666668653488159, 0.66666668653488159), (0.76050418615341187, 0.66274511814117432, 0.66274511814117432), (0.76470589637756348, 0.65882354974746704, 0.65882354974746704), (0.76890754699707031, 0.65490198135375977, 0.65490198135375977), (0.77310925722122192, 0.65098041296005249, 0.65098041296005249), (0.77731090784072876, 0.64705884456634521, 0.64705884456634521), (0.78151261806488037, 0.64313727617263794, 0.64313727617263794), (0.78571426868438721, 0.63921570777893066, 0.63921570777893066), (0.78991597890853882, 0.63921570777893066, 0.63921570777893066), (0.79411762952804565, 0.64313727617263794, 0.64313727617263794), (0.79831933975219727, 0.64313727617263794, 0.64313727617263794), (0.8025209903717041, 0.64705884456634521, 0.64705884456634521), (0.80672270059585571, 0.64705884456634521, 0.64705884456634521), (0.81092435121536255, 0.65098041296005249, 0.65098041296005249), (0.81512606143951416, 0.65490198135375977, 0.65490198135375977), (0.819327712059021, 0.65490198135375977, 0.65490198135375977), (0.82352942228317261, 0.65882354974746704, 0.65882354974746704), (0.82773107290267944, 0.66274511814117432, 0.66274511814117432), (0.83193278312683105, 0.66666668653488159, 0.66666668653488159), (0.83613443374633789, 0.67058825492858887, 0.67058825492858887), (0.8403361439704895, 0.67450982332229614, 0.67450982332229614), (0.84453779458999634, 0.67843139171600342, 0.67843139171600342), (0.84873950481414795, 0.68235296010971069, 0.68235296010971069), (0.85294115543365479, 0.68627452850341797, 0.68627452850341797), (0.8571428656578064, 0.69019609689712524, 0.69019609689712524), (0.86134451627731323, 0.69411766529083252, 0.69411766529083252), (0.86554622650146484, 0.69803923368453979, 0.69803923368453979), (0.86974787712097168, 0.70196080207824707, 0.70196080207824707), (0.87394958734512329, 0.70980393886566162, 0.70980393886566162), (0.87815123796463013, 0.7137255072593689, 0.7137255072593689), (0.88235294818878174, 0.72156864404678345, 0.72156864404678345), (0.88655459880828857, 0.72549021244049072, 0.72549021244049072), (0.89075630903244019, 0.73333334922790527, 0.73333334922790527), (0.89495795965194702, 0.73725491762161255, 0.73725491762161255), (0.89915966987609863, 0.7450980544090271, 0.7450980544090271), (0.90336132049560547, 0.75294119119644165, 0.75294119119644165), (0.90756303071975708, 0.7607843279838562, 0.7607843279838562), (0.91176468133926392, 0.76862746477127075, 0.76862746477127075), (0.91596639156341553, 0.7764706015586853, 0.7764706015586853), (0.92016804218292236, 0.78431373834609985, 0.78431373834609985), (0.92436975240707397, 0.7921568751335144, 0.7921568751335144), (0.92857140302658081, 0.80000001192092896, 0.80000001192092896), (0.93277311325073242, 0.80784314870834351, 0.80784314870834351), (0.93697476387023926, 0.81568628549575806, 0.81568628549575806), (0.94117647409439087, 0.82745099067687988, 0.82745099067687988), (0.94537812471389771, 0.83529412746429443, 0.83529412746429443), (0.94957983493804932, 0.84313726425170898, 0.84313726425170898), (0.95378148555755615, 0.85490196943283081, 0.85490196943283081), (0.95798319578170776, 0.86666667461395264, 0.86666667461395264), (0.9621848464012146, 0.87450981140136719, 0.87450981140136719), (0.96638655662536621, 0.88627451658248901, 0.88627451658248901), (0.97058820724487305, 0.89803922176361084, 0.89803922176361084), (0.97478991746902466, 0.90980392694473267, 0.90980392694473267), (0.97899156808853149, 0.92156863212585449, 0.92156863212585449), (0.98319327831268311, 0.93333333730697632, 0.93333333730697632), (0.98739492893218994, 0.94509804248809814, 0.94509804248809814), (0.99159663915634155, 0.95686274766921997, 0.95686274766921997), (0.99579828977584839, 0.97254902124404907, 0.97254902124404907), (1.0, 0.9843137264251709, 0.9843137264251709), ], "red": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), (0.037815127521753311, 0.0039215688593685627, 0.0039215688593685627), (0.042016807943582535, 0.0078431377187371254, 0.0078431377187371254), (0.046218488365411758, 0.0078431377187371254, 0.0078431377187371254), (0.050420168787240982, 0.011764706112444401, 0.011764706112444401), (0.054621849209070206, 0.015686275437474251, 0.015686275437474251), (0.058823529630899429, 0.019607843831181526, 0.019607843831181526), (0.063025213778018951, 0.019607843831181526, 0.019607843831181526), (0.067226894199848175, 0.023529412224888802, 0.023529412224888802), (0.071428574621677399, 0.027450980618596077, 0.027450980618596077), (0.075630255043506622, 0.031372550874948502, 0.031372550874948502), (0.079831935465335846, 0.031372550874948502, 0.031372550874948502), (0.08403361588716507, 0.035294119268655777, 0.035294119268655777), (0.088235296308994293, 0.039215687662363052, 0.039215687662363052), (0.092436976730823517, 0.043137256056070328, 0.043137256056070328), (0.09663865715265274, 0.043137256056070328, 0.043137256056070328), (0.10084033757448196, 0.047058824449777603, 0.047058824449777603), (0.10504201799631119, 0.050980392843484879, 0.050980392843484879), (0.10924369841814041, 0.054901961237192154, 0.054901961237192154), (0.11344537883996964, 0.058823529630899429, 0.058823529630899429), (0.11764705926179886, 0.058823529630899429, 0.058823529630899429), (0.12184873968362808, 0.062745101749897003, 0.062745101749897003), (0.1260504275560379, 0.066666670143604279, 0.066666670143604279), (0.13025210797786713, 0.070588238537311554, 0.070588238537311554), (0.13445378839969635, 0.070588238537311554, 0.070588238537311554), (0.13865546882152557, 0.074509806931018829, 0.074509806931018829), (0.1428571492433548, 0.078431375324726105, 0.078431375324726105), (0.14705882966518402, 0.08235294371843338, 0.08235294371843338), (0.15126051008701324, 0.086274512112140656, 0.086274512112140656), (0.15546219050884247, 0.086274512112140656, 0.086274512112140656), (0.15966387093067169, 0.090196080505847931, 0.090196080505847931), (0.16386555135250092, 0.094117648899555206, 0.094117648899555206), (0.16806723177433014, 0.098039217293262482, 0.098039217293262482), (0.17226891219615936, 0.10196078568696976, 0.10196078568696976), (0.17647059261798859, 0.10196078568696976, 0.10196078568696976), (0.18067227303981781, 0.10588235408067703, 0.10588235408067703), (0.18487395346164703, 0.10980392247438431, 0.10980392247438431), (0.18907563388347626, 0.11372549086809158, 0.11372549086809158), (0.19327731430530548, 0.11764705926179886, 0.11764705926179886), (0.1974789947271347, 0.12156862765550613, 0.12156862765550613), (0.20168067514896393, 0.12156862765550613, 0.12156862765550613), (0.20588235557079315, 0.12549020349979401, 0.12549020349979401), (0.21008403599262238, 0.12941177189350128, 0.12941177189350128), (0.2142857164144516, 0.13333334028720856, 0.13333334028720856), (0.21848739683628082, 0.13725490868091583, 0.13725490868091583), (0.22268907725811005, 0.14117647707462311, 0.14117647707462311), (0.22689075767993927, 0.14117647707462311, 0.14117647707462311), (0.23109243810176849, 0.14509804546833038, 0.14509804546833038), (0.23529411852359772, 0.14901961386203766, 0.14901961386203766), (0.23949579894542694, 0.15294118225574493, 0.15294118225574493), (0.24369747936725616, 0.15686275064945221, 0.15686275064945221), (0.24789915978908539, 0.16078431904315948, 0.16078431904315948), (0.25210085511207581, 0.16078431904315948, 0.16078431904315948), (0.25630253553390503, 0.16470588743686676, 0.16470588743686676), (0.26050421595573425, 0.16862745583057404, 0.16862745583057404), (0.26470589637756348, 0.17254902422428131, 0.17254902422428131), (0.2689075767993927, 0.17647059261798859, 0.17647059261798859), (0.27310925722122192, 0.18039216101169586, 0.18039216101169586), (0.27731093764305115, 0.18431372940540314, 0.18431372940540314), (0.28151261806488037, 0.18823529779911041, 0.18823529779911041), (0.28571429848670959, 0.18823529779911041, 0.18823529779911041), (0.28991597890853882, 0.18823529779911041, 0.18823529779911041), (0.29411765933036804, 0.19215686619281769, 0.19215686619281769), (0.29831933975219727, 0.19215686619281769, 0.19215686619281769), (0.30252102017402649, 0.19607843458652496, 0.19607843458652496), (0.30672270059585571, 0.19607843458652496, 0.19607843458652496), (0.31092438101768494, 0.20000000298023224, 0.20000000298023224), (0.31512606143951416, 0.20000000298023224, 0.20000000298023224), (0.31932774186134338, 0.20392157137393951, 0.20392157137393951), (0.32352942228317261, 0.20392157137393951, 0.20392157137393951), (0.32773110270500183, 0.20784313976764679, 0.20784313976764679), (0.33193278312683105, 0.20784313976764679, 0.20784313976764679), (0.33613446354866028, 0.21176470816135406, 0.21176470816135406), (0.3403361439704895, 0.21176470816135406, 0.21176470816135406), (0.34453782439231873, 0.21568627655506134, 0.21568627655506134), (0.34873950481414795, 0.21568627655506134, 0.21568627655506134), (0.35294118523597717, 0.21960784494876862, 0.21960784494876862), (0.3571428656578064, 0.21960784494876862, 0.21960784494876862), (0.36134454607963562, 0.22352941334247589, 0.22352941334247589), (0.36554622650146484, 0.22352941334247589, 0.22352941334247589), (0.36974790692329407, 0.22745098173618317, 0.22745098173618317), (0.37394958734512329, 0.22745098173618317, 0.22745098173618317), (0.37815126776695251, 0.23137255012989044, 0.23137255012989044), (0.38235294818878174, 0.23137255012989044, 0.23137255012989044), (0.38655462861061096, 0.23529411852359772, 0.23529411852359772), (0.39075630903244019, 0.23921568691730499, 0.23921568691730499), (0.39495798945426941, 0.23921568691730499, 0.23921568691730499), (0.39915966987609863, 0.24313725531101227, 0.24313725531101227), (0.40336135029792786, 0.24313725531101227, 0.24313725531101227), (0.40756303071975708, 0.24705882370471954, 0.24705882370471954), (0.4117647111415863, 0.24705882370471954, 0.24705882370471954), (0.41596639156341553, 0.25098040699958801, 0.25098040699958801), (0.42016807198524475, 0.25098040699958801, 0.25098040699958801), (0.42436975240707397, 0.25490197539329529, 0.25490197539329529), (0.4285714328289032, 0.25490197539329529, 0.25490197539329529), (0.43277311325073242, 0.25882354378700256, 0.25882354378700256), (0.43697479367256165, 0.26274511218070984, 0.26274511218070984), (0.44117647409439087, 0.26274511218070984, 0.26274511218070984), (0.44537815451622009, 0.26666668057441711, 0.26666668057441711), (0.44957983493804932, 0.26666668057441711, 0.26666668057441711), (0.45378151535987854, 0.27058824896812439, 0.27058824896812439), (0.45798319578170776, 0.27058824896812439, 0.27058824896812439), (0.46218487620353699, 0.27450981736183167, 0.27450981736183167), (0.46638655662536621, 0.27843138575553894, 0.27843138575553894), (0.47058823704719543, 0.28627452254295349, 0.28627452254295349), (0.47478991746902466, 0.29803922772407532, 0.29803922772407532), (0.47899159789085388, 0.30588236451148987, 0.30588236451148987), (0.48319327831268311, 0.31764706969261169, 0.31764706969261169), (0.48739495873451233, 0.32549020648002625, 0.32549020648002625), (0.49159663915634155, 0.33725491166114807, 0.33725491166114807), (0.49579831957817078, 0.34509804844856262, 0.34509804844856262), (0.5, 0.35686275362968445, 0.35686275362968445), (0.50420171022415161, 0.36862745881080627, 0.36862745881080627), (0.50840336084365845, 0.37647059559822083, 0.37647059559822083), (0.51260507106781006, 0.38823530077934265, 0.38823530077934265), (0.51680672168731689, 0.3960784375667572, 0.3960784375667572), (0.52100843191146851, 0.40784314274787903, 0.40784314274787903), (0.52521008253097534, 0.41568627953529358, 0.41568627953529358), (0.52941179275512695, 0.42745098471641541, 0.42745098471641541), (0.53361344337463379, 0.43529412150382996, 0.43529412150382996), (0.5378151535987854, 0.44705882668495178, 0.44705882668495178), (0.54201680421829224, 0.45882353186607361, 0.45882353186607361), (0.54621851444244385, 0.46666666865348816, 0.46666666865348816), (0.55042016506195068, 0.47450980544090271, 0.47450980544090271), (0.55462187528610229, 0.47843137383460999, 0.47843137383460999), (0.55882352590560913, 0.48627451062202454, 0.48627451062202454), (0.56302523612976074, 0.49411764740943909, 0.49411764740943909), (0.56722688674926758, 0.50196081399917603, 0.50196081399917603), (0.57142859697341919, 0.5058823823928833, 0.5058823823928833), (0.57563024759292603, 0.51372551918029785, 0.51372551918029785), (0.57983195781707764, 0.5215686559677124, 0.5215686559677124), (0.58403360843658447, 0.52941179275512695, 0.52941179275512695), (0.58823531866073608, 0.53333336114883423, 0.53333336114883423), (0.59243696928024292, 0.54117649793624878, 0.54117649793624878), (0.59663867950439453, 0.54901963472366333, 0.54901963472366333), (0.60084033012390137, 0.55294120311737061, 0.55294120311737061), (0.60504204034805298, 0.56078433990478516, 0.56078433990478516), (0.60924369096755981, 0.56862747669219971, 0.56862747669219971), (0.61344540119171143, 0.57647061347961426, 0.57647061347961426), (0.61764705181121826, 0.58431375026702881, 0.58431375026702881), (0.62184876203536987, 0.58823531866073608, 0.58823531866073608), (0.62605041265487671, 0.59607845544815063, 0.59607845544815063), (0.63025212287902832, 0.60392159223556519, 0.60392159223556519), (0.63445377349853516, 0.61176472902297974, 0.61176472902297974), (0.63865548372268677, 0.61568629741668701, 0.61568629741668701), (0.6428571343421936, 0.62352943420410156, 0.62352943420410156), (0.64705884456634521, 0.63137257099151611, 0.63137257099151611), (0.65126049518585205, 0.63921570777893066, 0.63921570777893066), (0.65546220541000366, 0.64705884456634521, 0.64705884456634521), (0.6596638560295105, 0.65098041296005249, 0.65098041296005249), (0.66386556625366211, 0.65882354974746704, 0.65882354974746704), (0.66806721687316895, 0.66666668653488159, 0.66666668653488159), (0.67226892709732056, 0.67450982332229614, 0.67450982332229614), (0.67647057771682739, 0.68235296010971069, 0.68235296010971069), (0.680672287940979, 0.68627452850341797, 0.68627452850341797), (0.68487393856048584, 0.69411766529083252, 0.69411766529083252), (0.68907564878463745, 0.70196080207824707, 0.70196080207824707), (0.69327729940414429, 0.70980393886566162, 0.70980393886566162), (0.6974790096282959, 0.71764707565307617, 0.71764707565307617), (0.70168066024780273, 0.71764707565307617, 0.71764707565307617), (0.70588237047195435, 0.72156864404678345, 0.72156864404678345), (0.71008402109146118, 0.72156864404678345, 0.72156864404678345), (0.71428573131561279, 0.72549021244049072, 0.72549021244049072), (0.71848738193511963, 0.72549021244049072, 0.72549021244049072), (0.72268909215927124, 0.729411780834198, 0.729411780834198), (0.72689074277877808, 0.729411780834198, 0.729411780834198), (0.73109245300292969, 0.73333334922790527, 0.73333334922790527), (0.73529410362243652, 0.73333334922790527, 0.73333334922790527), (0.73949581384658813, 0.73333334922790527, 0.73333334922790527), (0.74369746446609497, 0.73725491762161255, 0.73725491762161255), (0.74789917469024658, 0.73725491762161255, 0.73725491762161255), (0.75210082530975342, 0.74117648601531982, 0.74117648601531982), (0.75630253553390503, 0.74117648601531982, 0.74117648601531982), (0.76050418615341187, 0.7450980544090271, 0.7450980544090271), (0.76470589637756348, 0.7450980544090271, 0.7450980544090271), (0.76890754699707031, 0.7450980544090271, 0.7450980544090271), (0.77310925722122192, 0.74901962280273438, 0.74901962280273438), (0.77731090784072876, 0.74901962280273438, 0.74901962280273438), (0.78151261806488037, 0.75294119119644165, 0.75294119119644165), (0.78571426868438721, 0.75294119119644165, 0.75294119119644165), (0.78991597890853882, 0.75686275959014893, 0.75686275959014893), (0.79411762952804565, 0.76470589637756348, 0.76470589637756348), (0.79831933975219727, 0.76862746477127075, 0.76862746477127075), (0.8025209903717041, 0.77254903316497803, 0.77254903316497803), (0.80672270059585571, 0.7764706015586853, 0.7764706015586853), (0.81092435121536255, 0.78039216995239258, 0.78039216995239258), (0.81512606143951416, 0.78823530673980713, 0.78823530673980713), (0.819327712059021, 0.7921568751335144, 0.7921568751335144), (0.82352942228317261, 0.79607844352722168, 0.79607844352722168), (0.82773107290267944, 0.80000001192092896, 0.80000001192092896), (0.83193278312683105, 0.80392158031463623, 0.80392158031463623), (0.83613443374633789, 0.81176471710205078, 0.81176471710205078), (0.8403361439704895, 0.81568628549575806, 0.81568628549575806), (0.84453779458999634, 0.81960785388946533, 0.81960785388946533), (0.84873950481414795, 0.82352942228317261, 0.82352942228317261), (0.85294115543365479, 0.82745099067687988, 0.82745099067687988), (0.8571428656578064, 0.83529412746429443, 0.83529412746429443), (0.86134451627731323, 0.83921569585800171, 0.83921569585800171), (0.86554622650146484, 0.84313726425170898, 0.84313726425170898), (0.86974787712097168, 0.84705883264541626, 0.84705883264541626), (0.87394958734512329, 0.85098040103912354, 0.85098040103912354), (0.87815123796463013, 0.85882353782653809, 0.85882353782653809), (0.88235294818878174, 0.86274510622024536, 0.86274510622024536), (0.88655459880828857, 0.86666667461395264, 0.86666667461395264), (0.89075630903244019, 0.87058824300765991, 0.87058824300765991), (0.89495795965194702, 0.87450981140136719, 0.87450981140136719), (0.89915966987609863, 0.88235294818878174, 0.88235294818878174), (0.90336132049560547, 0.88627451658248901, 0.88627451658248901), (0.90756303071975708, 0.89019608497619629, 0.89019608497619629), (0.91176468133926392, 0.89411765336990356, 0.89411765336990356), (0.91596639156341553, 0.89803922176361084, 0.89803922176361084), (0.92016804218292236, 0.90588235855102539, 0.90588235855102539), (0.92436975240707397, 0.90980392694473267, 0.90980392694473267), (0.92857140302658081, 0.91372549533843994, 0.91372549533843994), (0.93277311325073242, 0.91764706373214722, 0.91764706373214722), (0.93697476387023926, 0.92156863212585449, 0.92156863212585449), (0.94117647409439087, 0.92941176891326904, 0.92941176891326904), (0.94537812471389771, 0.93333333730697632, 0.93333333730697632), (0.94957983493804932, 0.93725490570068359, 0.93725490570068359), (0.95378148555755615, 0.94117647409439087, 0.94117647409439087), (0.95798319578170776, 0.94509804248809814, 0.94509804248809814), (0.9621848464012146, 0.9529411792755127, 0.9529411792755127), (0.96638655662536621, 0.95686274766921997, 0.95686274766921997), (0.97058820724487305, 0.96078431606292725, 0.96078431606292725), (0.97478991746902466, 0.96470588445663452, 0.96470588445663452), (0.97899156808853149, 0.9686274528503418, 0.9686274528503418), (0.98319327831268311, 0.97647058963775635, 0.97647058963775635), (0.98739492893218994, 0.98039215803146362, 0.98039215803146362), (0.99159663915634155, 0.9843137264251709, 0.9843137264251709), (0.99579828977584839, 0.98823529481887817, 0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545), ], } _gist_gray_data = { "blue": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, 0.011764706112444401), (0.016806723549962044, 0.015686275437474251, 0.015686275437474251), (0.021008403971791267, 0.019607843831181526, 0.019607843831181526), (0.025210084393620491, 0.023529412224888802, 0.023529412224888802), (0.029411764815449715, 0.027450980618596077, 0.027450980618596077), (0.033613447099924088, 0.035294119268655777, 0.035294119268655777), (0.037815127521753311, 0.039215687662363052, 0.039215687662363052), (0.042016807943582535, 0.043137256056070328, 0.043137256056070328), (0.046218488365411758, 0.047058824449777603, 0.047058824449777603), (0.050420168787240982, 0.050980392843484879, 0.050980392843484879), (0.054621849209070206, 0.054901961237192154, 0.054901961237192154), (0.058823529630899429, 0.058823529630899429, 0.058823529630899429), (0.063025213778018951, 0.062745101749897003, 0.062745101749897003), (0.067226894199848175, 0.066666670143604279, 0.066666670143604279), (0.071428574621677399, 0.070588238537311554, 0.070588238537311554), (0.075630255043506622, 0.074509806931018829, 0.074509806931018829), (0.079831935465335846, 0.078431375324726105, 0.078431375324726105), (0.08403361588716507, 0.08235294371843338, 0.08235294371843338), (0.088235296308994293, 0.086274512112140656, 0.086274512112140656), (0.092436976730823517, 0.090196080505847931, 0.090196080505847931), (0.09663865715265274, 0.098039217293262482, 0.098039217293262482), (0.10084033757448196, 0.10196078568696976, 0.10196078568696976), (0.10504201799631119, 0.10588235408067703, 0.10588235408067703), (0.10924369841814041, 0.10980392247438431, 0.10980392247438431), (0.11344537883996964, 0.11372549086809158, 0.11372549086809158), (0.11764705926179886, 0.11764705926179886, 0.11764705926179886), (0.12184873968362808, 0.12156862765550613, 0.12156862765550613), (0.1260504275560379, 0.12549020349979401, 0.12549020349979401), (0.13025210797786713, 0.12941177189350128, 0.12941177189350128), (0.13445378839969635, 0.13333334028720856, 0.13333334028720856), (0.13865546882152557, 0.13725490868091583, 0.13725490868091583), (0.1428571492433548, 0.14117647707462311, 0.14117647707462311), (0.14705882966518402, 0.14509804546833038, 0.14509804546833038), (0.15126051008701324, 0.14901961386203766, 0.14901961386203766), (0.15546219050884247, 0.15294118225574493, 0.15294118225574493), (0.15966387093067169, 0.16078431904315948, 0.16078431904315948), (0.16386555135250092, 0.16470588743686676, 0.16470588743686676), (0.16806723177433014, 0.16862745583057404, 0.16862745583057404), (0.17226891219615936, 0.17254902422428131, 0.17254902422428131), (0.17647059261798859, 0.17647059261798859, 0.17647059261798859), (0.18067227303981781, 0.18039216101169586, 0.18039216101169586), (0.18487395346164703, 0.18431372940540314, 0.18431372940540314), (0.18907563388347626, 0.18823529779911041, 0.18823529779911041), (0.19327731430530548, 0.19215686619281769, 0.19215686619281769), (0.1974789947271347, 0.19607843458652496, 0.19607843458652496), (0.20168067514896393, 0.20000000298023224, 0.20000000298023224), (0.20588235557079315, 0.20392157137393951, 0.20392157137393951), (0.21008403599262238, 0.20784313976764679, 0.20784313976764679), (0.2142857164144516, 0.21176470816135406, 0.21176470816135406), (0.21848739683628082, 0.21568627655506134, 0.21568627655506134), (0.22268907725811005, 0.22352941334247589, 0.22352941334247589), (0.22689075767993927, 0.22745098173618317, 0.22745098173618317), (0.23109243810176849, 0.23137255012989044, 0.23137255012989044), (0.23529411852359772, 0.23529411852359772, 0.23529411852359772), (0.23949579894542694, 0.23921568691730499, 0.23921568691730499), (0.24369747936725616, 0.24313725531101227, 0.24313725531101227), (0.24789915978908539, 0.24705882370471954, 0.24705882370471954), (0.25210085511207581, 0.25098040699958801, 0.25098040699958801), (0.25630253553390503, 0.25490197539329529, 0.25490197539329529), (0.26050421595573425, 0.25882354378700256, 0.25882354378700256), (0.26470589637756348, 0.26274511218070984, 0.26274511218070984), (0.2689075767993927, 0.26666668057441711, 0.26666668057441711), (0.27310925722122192, 0.27058824896812439, 0.27058824896812439), (0.27731093764305115, 0.27450981736183167, 0.27450981736183167), (0.28151261806488037, 0.27843138575553894, 0.27843138575553894), (0.28571429848670959, 0.28627452254295349, 0.28627452254295349), (0.28991597890853882, 0.29019609093666077, 0.29019609093666077), (0.29411765933036804, 0.29411765933036804, 0.29411765933036804), (0.29831933975219727, 0.29803922772407532, 0.29803922772407532), (0.30252102017402649, 0.30196079611778259, 0.30196079611778259), (0.30672270059585571, 0.30588236451148987, 0.30588236451148987), (0.31092438101768494, 0.30980393290519714, 0.30980393290519714), (0.31512606143951416, 0.31372550129890442, 0.31372550129890442), (0.31932774186134338, 0.31764706969261169, 0.31764706969261169), (0.32352942228317261, 0.32156863808631897, 0.32156863808631897), (0.32773110270500183, 0.32549020648002625, 0.32549020648002625), (0.33193278312683105, 0.32941177487373352, 0.32941177487373352), (0.33613446354866028, 0.3333333432674408, 0.3333333432674408), (0.3403361439704895, 0.33725491166114807, 0.33725491166114807), (0.34453782439231873, 0.34117648005485535, 0.34117648005485535), (0.34873950481414795, 0.3490196168422699, 0.3490196168422699), (0.35294118523597717, 0.35294118523597717, 0.35294118523597717), (0.3571428656578064, 0.35686275362968445, 0.35686275362968445), (0.36134454607963562, 0.36078432202339172, 0.36078432202339172), (0.36554622650146484, 0.364705890417099, 0.364705890417099), (0.36974790692329407, 0.36862745881080627, 0.36862745881080627), (0.37394958734512329, 0.37254902720451355, 0.37254902720451355), (0.37815126776695251, 0.37647059559822083, 0.37647059559822083), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.38431373238563538, 0.38431373238563538), (0.39075630903244019, 0.38823530077934265, 0.38823530077934265), (0.39495798945426941, 0.39215686917304993, 0.39215686917304993), (0.39915966987609863, 0.3960784375667572, 0.3960784375667572), (0.40336135029792786, 0.40000000596046448, 0.40000000596046448), (0.40756303071975708, 0.40392157435417175, 0.40392157435417175), (0.4117647111415863, 0.4117647111415863, 0.4117647111415863), (0.41596639156341553, 0.41568627953529358, 0.41568627953529358), (0.42016807198524475, 0.41960784792900085, 0.41960784792900085), (0.42436975240707397, 0.42352941632270813, 0.42352941632270813), (0.4285714328289032, 0.42745098471641541, 0.42745098471641541), (0.43277311325073242, 0.43137255311012268, 0.43137255311012268), (0.43697479367256165, 0.43529412150382996, 0.43529412150382996), (0.44117647409439087, 0.43921568989753723, 0.43921568989753723), (0.44537815451622009, 0.44313725829124451, 0.44313725829124451), (0.44957983493804932, 0.44705882668495178, 0.44705882668495178), (0.45378151535987854, 0.45098039507865906, 0.45098039507865906), (0.45798319578170776, 0.45490196347236633, 0.45490196347236633), (0.46218487620353699, 0.45882353186607361, 0.45882353186607361), (0.46638655662536621, 0.46274510025978088, 0.46274510025978088), (0.47058823704719543, 0.46666666865348816, 0.46666666865348816), (0.47478991746902466, 0.47450980544090271, 0.47450980544090271), (0.47899159789085388, 0.47843137383460999, 0.47843137383460999), (0.48319327831268311, 0.48235294222831726, 0.48235294222831726), (0.48739495873451233, 0.48627451062202454, 0.48627451062202454), (0.49159663915634155, 0.49019607901573181, 0.49019607901573181), (0.49579831957817078, 0.49411764740943909, 0.49411764740943909), (0.5, 0.49803921580314636, 0.49803921580314636), (0.50420171022415161, 0.50196081399917603, 0.50196081399917603), (0.50840336084365845, 0.5058823823928833, 0.5058823823928833), (0.51260507106781006, 0.50980395078659058, 0.50980395078659058), (0.51680672168731689, 0.51372551918029785, 0.51372551918029785), (0.52100843191146851, 0.51764708757400513, 0.51764708757400513), (0.52521008253097534, 0.5215686559677124, 0.5215686559677124), (0.52941179275512695, 0.52549022436141968, 0.52549022436141968), (0.53361344337463379, 0.52941179275512695, 0.52941179275512695), (0.5378151535987854, 0.5372549295425415, 0.5372549295425415), (0.54201680421829224, 0.54117649793624878, 0.54117649793624878), (0.54621851444244385, 0.54509806632995605, 0.54509806632995605), (0.55042016506195068, 0.54901963472366333, 0.54901963472366333), (0.55462187528610229, 0.55294120311737061, 0.55294120311737061), (0.55882352590560913, 0.55686277151107788, 0.55686277151107788), (0.56302523612976074, 0.56078433990478516, 0.56078433990478516), (0.56722688674926758, 0.56470590829849243, 0.56470590829849243), (0.57142859697341919, 0.56862747669219971, 0.56862747669219971), (0.57563024759292603, 0.57254904508590698, 0.57254904508590698), (0.57983195781707764, 0.57647061347961426, 0.57647061347961426), (0.58403360843658447, 0.58039218187332153, 0.58039218187332153), (0.58823531866073608, 0.58431375026702881, 0.58431375026702881), (0.59243696928024292, 0.58823531866073608, 0.58823531866073608), (0.59663867950439453, 0.59215688705444336, 0.59215688705444336), (0.60084033012390137, 0.60000002384185791, 0.60000002384185791), (0.60504204034805298, 0.60392159223556519, 0.60392159223556519), (0.60924369096755981, 0.60784316062927246, 0.60784316062927246), (0.61344540119171143, 0.61176472902297974, 0.61176472902297974), (0.61764705181121826, 0.61568629741668701, 0.61568629741668701), (0.62184876203536987, 0.61960786581039429, 0.61960786581039429), (0.62605041265487671, 0.62352943420410156, 0.62352943420410156), (0.63025212287902832, 0.62745100259780884, 0.62745100259780884), (0.63445377349853516, 0.63137257099151611, 0.63137257099151611), (0.63865548372268677, 0.63529413938522339, 0.63529413938522339), (0.6428571343421936, 0.63921570777893066, 0.63921570777893066), (0.64705884456634521, 0.64313727617263794, 0.64313727617263794), (0.65126049518585205, 0.64705884456634521, 0.64705884456634521), (0.65546220541000366, 0.65098041296005249, 0.65098041296005249), (0.6596638560295105, 0.65490198135375977, 0.65490198135375977), (0.66386556625366211, 0.66274511814117432, 0.66274511814117432), (0.66806721687316895, 0.66666668653488159, 0.66666668653488159), (0.67226892709732056, 0.67058825492858887, 0.67058825492858887), (0.67647057771682739, 0.67450982332229614, 0.67450982332229614), (0.680672287940979, 0.67843139171600342, 0.67843139171600342), (0.68487393856048584, 0.68235296010971069, 0.68235296010971069), (0.68907564878463745, 0.68627452850341797, 0.68627452850341797), (0.69327729940414429, 0.69019609689712524, 0.69019609689712524), (0.6974790096282959, 0.69411766529083252, 0.69411766529083252), (0.70168066024780273, 0.69803923368453979, 0.69803923368453979), (0.70588237047195435, 0.70196080207824707, 0.70196080207824707), (0.71008402109146118, 0.70588237047195435, 0.70588237047195435), (0.71428573131561279, 0.70980393886566162, 0.70980393886566162), (0.71848738193511963, 0.7137255072593689, 0.7137255072593689), (0.72268909215927124, 0.71764707565307617, 0.71764707565307617), (0.72689074277877808, 0.72549021244049072, 0.72549021244049072), (0.73109245300292969, 0.729411780834198, 0.729411780834198), (0.73529410362243652, 0.73333334922790527, 0.73333334922790527), (0.73949581384658813, 0.73725491762161255, 0.73725491762161255), (0.74369746446609497, 0.74117648601531982, 0.74117648601531982), (0.74789917469024658, 0.7450980544090271, 0.7450980544090271), (0.75210082530975342, 0.74901962280273438, 0.74901962280273438), (0.75630253553390503, 0.75294119119644165, 0.75294119119644165), (0.76050418615341187, 0.75686275959014893, 0.75686275959014893), (0.76470589637756348, 0.7607843279838562, 0.7607843279838562), (0.76890754699707031, 0.76470589637756348, 0.76470589637756348), (0.77310925722122192, 0.76862746477127075, 0.76862746477127075), (0.77731090784072876, 0.77254903316497803, 0.77254903316497803), (0.78151261806488037, 0.7764706015586853, 0.7764706015586853), (0.78571426868438721, 0.78039216995239258, 0.78039216995239258), (0.78991597890853882, 0.78823530673980713, 0.78823530673980713), (0.79411762952804565, 0.7921568751335144, 0.7921568751335144), (0.79831933975219727, 0.79607844352722168, 0.79607844352722168), (0.8025209903717041, 0.80000001192092896, 0.80000001192092896), (0.80672270059585571, 0.80392158031463623, 0.80392158031463623), (0.81092435121536255, 0.80784314870834351, 0.80784314870834351), (0.81512606143951416, 0.81176471710205078, 0.81176471710205078), (0.819327712059021, 0.81568628549575806, 0.81568628549575806), (0.82352942228317261, 0.81960785388946533, 0.81960785388946533), (0.82773107290267944, 0.82352942228317261, 0.82352942228317261), (0.83193278312683105, 0.82745099067687988, 0.82745099067687988), (0.83613443374633789, 0.83137255907058716, 0.83137255907058716), (0.8403361439704895, 0.83529412746429443, 0.83529412746429443), (0.84453779458999634, 0.83921569585800171, 0.83921569585800171), (0.84873950481414795, 0.84313726425170898, 0.84313726425170898), (0.85294115543365479, 0.85098040103912354, 0.85098040103912354), (0.8571428656578064, 0.85490196943283081, 0.85490196943283081), (0.86134451627731323, 0.85882353782653809, 0.85882353782653809), (0.86554622650146484, 0.86274510622024536, 0.86274510622024536), (0.86974787712097168, 0.86666667461395264, 0.86666667461395264), (0.87394958734512329, 0.87058824300765991, 0.87058824300765991), (0.87815123796463013, 0.87450981140136719, 0.87450981140136719), (0.88235294818878174, 0.87843137979507446, 0.87843137979507446), (0.88655459880828857, 0.88235294818878174, 0.88235294818878174), (0.89075630903244019, 0.88627451658248901, 0.88627451658248901), (0.89495795965194702, 0.89019608497619629, 0.89019608497619629), (0.89915966987609863, 0.89411765336990356, 0.89411765336990356), (0.90336132049560547, 0.89803922176361084, 0.89803922176361084), (0.90756303071975708, 0.90196079015731812, 0.90196079015731812), (0.91176468133926392, 0.90588235855102539, 0.90588235855102539), (0.91596639156341553, 0.91372549533843994, 0.91372549533843994), (0.92016804218292236, 0.91764706373214722, 0.91764706373214722), (0.92436975240707397, 0.92156863212585449, 0.92156863212585449), (0.92857140302658081, 0.92549020051956177, 0.92549020051956177), (0.93277311325073242, 0.92941176891326904, 0.92941176891326904), (0.93697476387023926, 0.93333333730697632, 0.93333333730697632), (0.94117647409439087, 0.93725490570068359, 0.93725490570068359), (0.94537812471389771, 0.94117647409439087, 0.94117647409439087), (0.94957983493804932, 0.94509804248809814, 0.94509804248809814), (0.95378148555755615, 0.94901961088180542, 0.94901961088180542), (0.95798319578170776, 0.9529411792755127, 0.9529411792755127), (0.9621848464012146, 0.95686274766921997, 0.95686274766921997), (0.96638655662536621, 0.96078431606292725, 0.96078431606292725), (0.97058820724487305, 0.96470588445663452, 0.96470588445663452), (0.97478991746902466, 0.9686274528503418, 0.9686274528503418), (0.97899156808853149, 0.97647058963775635, 0.97647058963775635), (0.98319327831268311, 0.98039215803146362, 0.98039215803146362), (0.98739492893218994, 0.9843137264251709, 0.9843137264251709), (0.99159663915634155, 0.98823529481887817, 0.98823529481887817), (0.99579828977584839, 0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272), ], "green": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, 0.011764706112444401), (0.016806723549962044, 0.015686275437474251, 0.015686275437474251), (0.021008403971791267, 0.019607843831181526, 0.019607843831181526), (0.025210084393620491, 0.023529412224888802, 0.023529412224888802), (0.029411764815449715, 0.027450980618596077, 0.027450980618596077), (0.033613447099924088, 0.035294119268655777, 0.035294119268655777), (0.037815127521753311, 0.039215687662363052, 0.039215687662363052), (0.042016807943582535, 0.043137256056070328, 0.043137256056070328), (0.046218488365411758, 0.047058824449777603, 0.047058824449777603), (0.050420168787240982, 0.050980392843484879, 0.050980392843484879), (0.054621849209070206, 0.054901961237192154, 0.054901961237192154), (0.058823529630899429, 0.058823529630899429, 0.058823529630899429), (0.063025213778018951, 0.062745101749897003, 0.062745101749897003), (0.067226894199848175, 0.066666670143604279, 0.066666670143604279), (0.071428574621677399, 0.070588238537311554, 0.070588238537311554), (0.075630255043506622, 0.074509806931018829, 0.074509806931018829), (0.079831935465335846, 0.078431375324726105, 0.078431375324726105), (0.08403361588716507, 0.08235294371843338, 0.08235294371843338), (0.088235296308994293, 0.086274512112140656, 0.086274512112140656), (0.092436976730823517, 0.090196080505847931, 0.090196080505847931), (0.09663865715265274, 0.098039217293262482, 0.098039217293262482), (0.10084033757448196, 0.10196078568696976, 0.10196078568696976), (0.10504201799631119, 0.10588235408067703, 0.10588235408067703), (0.10924369841814041, 0.10980392247438431, 0.10980392247438431), (0.11344537883996964, 0.11372549086809158, 0.11372549086809158), (0.11764705926179886, 0.11764705926179886, 0.11764705926179886), (0.12184873968362808, 0.12156862765550613, 0.12156862765550613), (0.1260504275560379, 0.12549020349979401, 0.12549020349979401), (0.13025210797786713, 0.12941177189350128, 0.12941177189350128), (0.13445378839969635, 0.13333334028720856, 0.13333334028720856), (0.13865546882152557, 0.13725490868091583, 0.13725490868091583), (0.1428571492433548, 0.14117647707462311, 0.14117647707462311), (0.14705882966518402, 0.14509804546833038, 0.14509804546833038), (0.15126051008701324, 0.14901961386203766, 0.14901961386203766), (0.15546219050884247, 0.15294118225574493, 0.15294118225574493), (0.15966387093067169, 0.16078431904315948, 0.16078431904315948), (0.16386555135250092, 0.16470588743686676, 0.16470588743686676), (0.16806723177433014, 0.16862745583057404, 0.16862745583057404), (0.17226891219615936, 0.17254902422428131, 0.17254902422428131), (0.17647059261798859, 0.17647059261798859, 0.17647059261798859), (0.18067227303981781, 0.18039216101169586, 0.18039216101169586), (0.18487395346164703, 0.18431372940540314, 0.18431372940540314), (0.18907563388347626, 0.18823529779911041, 0.18823529779911041), (0.19327731430530548, 0.19215686619281769, 0.19215686619281769), (0.1974789947271347, 0.19607843458652496, 0.19607843458652496), (0.20168067514896393, 0.20000000298023224, 0.20000000298023224), (0.20588235557079315, 0.20392157137393951, 0.20392157137393951), (0.21008403599262238, 0.20784313976764679, 0.20784313976764679), (0.2142857164144516, 0.21176470816135406, 0.21176470816135406), (0.21848739683628082, 0.21568627655506134, 0.21568627655506134), (0.22268907725811005, 0.22352941334247589, 0.22352941334247589), (0.22689075767993927, 0.22745098173618317, 0.22745098173618317), (0.23109243810176849, 0.23137255012989044, 0.23137255012989044), (0.23529411852359772, 0.23529411852359772, 0.23529411852359772), (0.23949579894542694, 0.23921568691730499, 0.23921568691730499), (0.24369747936725616, 0.24313725531101227, 0.24313725531101227), (0.24789915978908539, 0.24705882370471954, 0.24705882370471954), (0.25210085511207581, 0.25098040699958801, 0.25098040699958801), (0.25630253553390503, 0.25490197539329529, 0.25490197539329529), (0.26050421595573425, 0.25882354378700256, 0.25882354378700256), (0.26470589637756348, 0.26274511218070984, 0.26274511218070984), (0.2689075767993927, 0.26666668057441711, 0.26666668057441711), (0.27310925722122192, 0.27058824896812439, 0.27058824896812439), (0.27731093764305115, 0.27450981736183167, 0.27450981736183167), (0.28151261806488037, 0.27843138575553894, 0.27843138575553894), (0.28571429848670959, 0.28627452254295349, 0.28627452254295349), (0.28991597890853882, 0.29019609093666077, 0.29019609093666077), (0.29411765933036804, 0.29411765933036804, 0.29411765933036804), (0.29831933975219727, 0.29803922772407532, 0.29803922772407532), (0.30252102017402649, 0.30196079611778259, 0.30196079611778259), (0.30672270059585571, 0.30588236451148987, 0.30588236451148987), (0.31092438101768494, 0.30980393290519714, 0.30980393290519714), (0.31512606143951416, 0.31372550129890442, 0.31372550129890442), (0.31932774186134338, 0.31764706969261169, 0.31764706969261169), (0.32352942228317261, 0.32156863808631897, 0.32156863808631897), (0.32773110270500183, 0.32549020648002625, 0.32549020648002625), (0.33193278312683105, 0.32941177487373352, 0.32941177487373352), (0.33613446354866028, 0.3333333432674408, 0.3333333432674408), (0.3403361439704895, 0.33725491166114807, 0.33725491166114807), (0.34453782439231873, 0.34117648005485535, 0.34117648005485535), (0.34873950481414795, 0.3490196168422699, 0.3490196168422699), (0.35294118523597717, 0.35294118523597717, 0.35294118523597717), (0.3571428656578064, 0.35686275362968445, 0.35686275362968445), (0.36134454607963562, 0.36078432202339172, 0.36078432202339172), (0.36554622650146484, 0.364705890417099, 0.364705890417099), (0.36974790692329407, 0.36862745881080627, 0.36862745881080627), (0.37394958734512329, 0.37254902720451355, 0.37254902720451355), (0.37815126776695251, 0.37647059559822083, 0.37647059559822083), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.38431373238563538, 0.38431373238563538), (0.39075630903244019, 0.38823530077934265, 0.38823530077934265), (0.39495798945426941, 0.39215686917304993, 0.39215686917304993), (0.39915966987609863, 0.3960784375667572, 0.3960784375667572), (0.40336135029792786, 0.40000000596046448, 0.40000000596046448), (0.40756303071975708, 0.40392157435417175, 0.40392157435417175), (0.4117647111415863, 0.4117647111415863, 0.4117647111415863), (0.41596639156341553, 0.41568627953529358, 0.41568627953529358), (0.42016807198524475, 0.41960784792900085, 0.41960784792900085), (0.42436975240707397, 0.42352941632270813, 0.42352941632270813), (0.4285714328289032, 0.42745098471641541, 0.42745098471641541), (0.43277311325073242, 0.43137255311012268, 0.43137255311012268), (0.43697479367256165, 0.43529412150382996, 0.43529412150382996), (0.44117647409439087, 0.43921568989753723, 0.43921568989753723), (0.44537815451622009, 0.44313725829124451, 0.44313725829124451), (0.44957983493804932, 0.44705882668495178, 0.44705882668495178), (0.45378151535987854, 0.45098039507865906, 0.45098039507865906), (0.45798319578170776, 0.45490196347236633, 0.45490196347236633), (0.46218487620353699, 0.45882353186607361, 0.45882353186607361), (0.46638655662536621, 0.46274510025978088, 0.46274510025978088), (0.47058823704719543, 0.46666666865348816, 0.46666666865348816), (0.47478991746902466, 0.47450980544090271, 0.47450980544090271), (0.47899159789085388, 0.47843137383460999, 0.47843137383460999), (0.48319327831268311, 0.48235294222831726, 0.48235294222831726), (0.48739495873451233, 0.48627451062202454, 0.48627451062202454), (0.49159663915634155, 0.49019607901573181, 0.49019607901573181), (0.49579831957817078, 0.49411764740943909, 0.49411764740943909), (0.5, 0.49803921580314636, 0.49803921580314636), (0.50420171022415161, 0.50196081399917603, 0.50196081399917603), (0.50840336084365845, 0.5058823823928833, 0.5058823823928833), (0.51260507106781006, 0.50980395078659058, 0.50980395078659058), (0.51680672168731689, 0.51372551918029785, 0.51372551918029785), (0.52100843191146851, 0.51764708757400513, 0.51764708757400513), (0.52521008253097534, 0.5215686559677124, 0.5215686559677124), (0.52941179275512695, 0.52549022436141968, 0.52549022436141968), (0.53361344337463379, 0.52941179275512695, 0.52941179275512695), (0.5378151535987854, 0.5372549295425415, 0.5372549295425415), (0.54201680421829224, 0.54117649793624878, 0.54117649793624878), (0.54621851444244385, 0.54509806632995605, 0.54509806632995605), (0.55042016506195068, 0.54901963472366333, 0.54901963472366333), (0.55462187528610229, 0.55294120311737061, 0.55294120311737061), (0.55882352590560913, 0.55686277151107788, 0.55686277151107788), (0.56302523612976074, 0.56078433990478516, 0.56078433990478516), (0.56722688674926758, 0.56470590829849243, 0.56470590829849243), (0.57142859697341919, 0.56862747669219971, 0.56862747669219971), (0.57563024759292603, 0.57254904508590698, 0.57254904508590698), (0.57983195781707764, 0.57647061347961426, 0.57647061347961426), (0.58403360843658447, 0.58039218187332153, 0.58039218187332153), (0.58823531866073608, 0.58431375026702881, 0.58431375026702881), (0.59243696928024292, 0.58823531866073608, 0.58823531866073608), (0.59663867950439453, 0.59215688705444336, 0.59215688705444336), (0.60084033012390137, 0.60000002384185791, 0.60000002384185791), (0.60504204034805298, 0.60392159223556519, 0.60392159223556519), (0.60924369096755981, 0.60784316062927246, 0.60784316062927246), (0.61344540119171143, 0.61176472902297974, 0.61176472902297974), (0.61764705181121826, 0.61568629741668701, 0.61568629741668701), (0.62184876203536987, 0.61960786581039429, 0.61960786581039429), (0.62605041265487671, 0.62352943420410156, 0.62352943420410156), (0.63025212287902832, 0.62745100259780884, 0.62745100259780884), (0.63445377349853516, 0.63137257099151611, 0.63137257099151611), (0.63865548372268677, 0.63529413938522339, 0.63529413938522339), (0.6428571343421936, 0.63921570777893066, 0.63921570777893066), (0.64705884456634521, 0.64313727617263794, 0.64313727617263794), (0.65126049518585205, 0.64705884456634521, 0.64705884456634521), (0.65546220541000366, 0.65098041296005249, 0.65098041296005249), (0.6596638560295105, 0.65490198135375977, 0.65490198135375977), (0.66386556625366211, 0.66274511814117432, 0.66274511814117432), (0.66806721687316895, 0.66666668653488159, 0.66666668653488159), (0.67226892709732056, 0.67058825492858887, 0.67058825492858887), (0.67647057771682739, 0.67450982332229614, 0.67450982332229614), (0.680672287940979, 0.67843139171600342, 0.67843139171600342), (0.68487393856048584, 0.68235296010971069, 0.68235296010971069), (0.68907564878463745, 0.68627452850341797, 0.68627452850341797), (0.69327729940414429, 0.69019609689712524, 0.69019609689712524), (0.6974790096282959, 0.69411766529083252, 0.69411766529083252), (0.70168066024780273, 0.69803923368453979, 0.69803923368453979), (0.70588237047195435, 0.70196080207824707, 0.70196080207824707), (0.71008402109146118, 0.70588237047195435, 0.70588237047195435), (0.71428573131561279, 0.70980393886566162, 0.70980393886566162), (0.71848738193511963, 0.7137255072593689, 0.7137255072593689), (0.72268909215927124, 0.71764707565307617, 0.71764707565307617), (0.72689074277877808, 0.72549021244049072, 0.72549021244049072), (0.73109245300292969, 0.729411780834198, 0.729411780834198), (0.73529410362243652, 0.73333334922790527, 0.73333334922790527), (0.73949581384658813, 0.73725491762161255, 0.73725491762161255), (0.74369746446609497, 0.74117648601531982, 0.74117648601531982), (0.74789917469024658, 0.7450980544090271, 0.7450980544090271), (0.75210082530975342, 0.74901962280273438, 0.74901962280273438), (0.75630253553390503, 0.75294119119644165, 0.75294119119644165), (0.76050418615341187, 0.75686275959014893, 0.75686275959014893), (0.76470589637756348, 0.7607843279838562, 0.7607843279838562), (0.76890754699707031, 0.76470589637756348, 0.76470589637756348), (0.77310925722122192, 0.76862746477127075, 0.76862746477127075), (0.77731090784072876, 0.77254903316497803, 0.77254903316497803), (0.78151261806488037, 0.7764706015586853, 0.7764706015586853), (0.78571426868438721, 0.78039216995239258, 0.78039216995239258), (0.78991597890853882, 0.78823530673980713, 0.78823530673980713), (0.79411762952804565, 0.7921568751335144, 0.7921568751335144), (0.79831933975219727, 0.79607844352722168, 0.79607844352722168), (0.8025209903717041, 0.80000001192092896, 0.80000001192092896), (0.80672270059585571, 0.80392158031463623, 0.80392158031463623), (0.81092435121536255, 0.80784314870834351, 0.80784314870834351), (0.81512606143951416, 0.81176471710205078, 0.81176471710205078), (0.819327712059021, 0.81568628549575806, 0.81568628549575806), (0.82352942228317261, 0.81960785388946533, 0.81960785388946533), (0.82773107290267944, 0.82352942228317261, 0.82352942228317261), (0.83193278312683105, 0.82745099067687988, 0.82745099067687988), (0.83613443374633789, 0.83137255907058716, 0.83137255907058716), (0.8403361439704895, 0.83529412746429443, 0.83529412746429443), (0.84453779458999634, 0.83921569585800171, 0.83921569585800171), (0.84873950481414795, 0.84313726425170898, 0.84313726425170898), (0.85294115543365479, 0.85098040103912354, 0.85098040103912354), (0.8571428656578064, 0.85490196943283081, 0.85490196943283081), (0.86134451627731323, 0.85882353782653809, 0.85882353782653809), (0.86554622650146484, 0.86274510622024536, 0.86274510622024536), (0.86974787712097168, 0.86666667461395264, 0.86666667461395264), (0.87394958734512329, 0.87058824300765991, 0.87058824300765991), (0.87815123796463013, 0.87450981140136719, 0.87450981140136719), (0.88235294818878174, 0.87843137979507446, 0.87843137979507446), (0.88655459880828857, 0.88235294818878174, 0.88235294818878174), (0.89075630903244019, 0.88627451658248901, 0.88627451658248901), (0.89495795965194702, 0.89019608497619629, 0.89019608497619629), (0.89915966987609863, 0.89411765336990356, 0.89411765336990356), (0.90336132049560547, 0.89803922176361084, 0.89803922176361084), (0.90756303071975708, 0.90196079015731812, 0.90196079015731812), (0.91176468133926392, 0.90588235855102539, 0.90588235855102539), (0.91596639156341553, 0.91372549533843994, 0.91372549533843994), (0.92016804218292236, 0.91764706373214722, 0.91764706373214722), (0.92436975240707397, 0.92156863212585449, 0.92156863212585449), (0.92857140302658081, 0.92549020051956177, 0.92549020051956177), (0.93277311325073242, 0.92941176891326904, 0.92941176891326904), (0.93697476387023926, 0.93333333730697632, 0.93333333730697632), (0.94117647409439087, 0.93725490570068359, 0.93725490570068359), (0.94537812471389771, 0.94117647409439087, 0.94117647409439087), (0.94957983493804932, 0.94509804248809814, 0.94509804248809814), (0.95378148555755615, 0.94901961088180542, 0.94901961088180542), (0.95798319578170776, 0.9529411792755127, 0.9529411792755127), (0.9621848464012146, 0.95686274766921997, 0.95686274766921997), (0.96638655662536621, 0.96078431606292725, 0.96078431606292725), (0.97058820724487305, 0.96470588445663452, 0.96470588445663452), (0.97478991746902466, 0.9686274528503418, 0.9686274528503418), (0.97899156808853149, 0.97647058963775635, 0.97647058963775635), (0.98319327831268311, 0.98039215803146362, 0.98039215803146362), (0.98739492893218994, 0.9843137264251709, 0.9843137264251709), (0.99159663915634155, 0.98823529481887817, 0.98823529481887817), (0.99579828977584839, 0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272), ], "red": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, 0.011764706112444401), (0.016806723549962044, 0.015686275437474251, 0.015686275437474251), (0.021008403971791267, 0.019607843831181526, 0.019607843831181526), (0.025210084393620491, 0.023529412224888802, 0.023529412224888802), (0.029411764815449715, 0.027450980618596077, 0.027450980618596077), (0.033613447099924088, 0.035294119268655777, 0.035294119268655777), (0.037815127521753311, 0.039215687662363052, 0.039215687662363052), (0.042016807943582535, 0.043137256056070328, 0.043137256056070328), (0.046218488365411758, 0.047058824449777603, 0.047058824449777603), (0.050420168787240982, 0.050980392843484879, 0.050980392843484879), (0.054621849209070206, 0.054901961237192154, 0.054901961237192154), (0.058823529630899429, 0.058823529630899429, 0.058823529630899429), (0.063025213778018951, 0.062745101749897003, 0.062745101749897003), (0.067226894199848175, 0.066666670143604279, 0.066666670143604279), (0.071428574621677399, 0.070588238537311554, 0.070588238537311554), (0.075630255043506622, 0.074509806931018829, 0.074509806931018829), (0.079831935465335846, 0.078431375324726105, 0.078431375324726105), (0.08403361588716507, 0.08235294371843338, 0.08235294371843338), (0.088235296308994293, 0.086274512112140656, 0.086274512112140656), (0.092436976730823517, 0.090196080505847931, 0.090196080505847931), (0.09663865715265274, 0.098039217293262482, 0.098039217293262482), (0.10084033757448196, 0.10196078568696976, 0.10196078568696976), (0.10504201799631119, 0.10588235408067703, 0.10588235408067703), (0.10924369841814041, 0.10980392247438431, 0.10980392247438431), (0.11344537883996964, 0.11372549086809158, 0.11372549086809158), (0.11764705926179886, 0.11764705926179886, 0.11764705926179886), (0.12184873968362808, 0.12156862765550613, 0.12156862765550613), (0.1260504275560379, 0.12549020349979401, 0.12549020349979401), (0.13025210797786713, 0.12941177189350128, 0.12941177189350128), (0.13445378839969635, 0.13333334028720856, 0.13333334028720856), (0.13865546882152557, 0.13725490868091583, 0.13725490868091583), (0.1428571492433548, 0.14117647707462311, 0.14117647707462311), (0.14705882966518402, 0.14509804546833038, 0.14509804546833038), (0.15126051008701324, 0.14901961386203766, 0.14901961386203766), (0.15546219050884247, 0.15294118225574493, 0.15294118225574493), (0.15966387093067169, 0.16078431904315948, 0.16078431904315948), (0.16386555135250092, 0.16470588743686676, 0.16470588743686676), (0.16806723177433014, 0.16862745583057404, 0.16862745583057404), (0.17226891219615936, 0.17254902422428131, 0.17254902422428131), (0.17647059261798859, 0.17647059261798859, 0.17647059261798859), (0.18067227303981781, 0.18039216101169586, 0.18039216101169586), (0.18487395346164703, 0.18431372940540314, 0.18431372940540314), (0.18907563388347626, 0.18823529779911041, 0.18823529779911041), (0.19327731430530548, 0.19215686619281769, 0.19215686619281769), (0.1974789947271347, 0.19607843458652496, 0.19607843458652496), (0.20168067514896393, 0.20000000298023224, 0.20000000298023224), (0.20588235557079315, 0.20392157137393951, 0.20392157137393951), (0.21008403599262238, 0.20784313976764679, 0.20784313976764679), (0.2142857164144516, 0.21176470816135406, 0.21176470816135406), (0.21848739683628082, 0.21568627655506134, 0.21568627655506134), (0.22268907725811005, 0.22352941334247589, 0.22352941334247589), (0.22689075767993927, 0.22745098173618317, 0.22745098173618317), (0.23109243810176849, 0.23137255012989044, 0.23137255012989044), (0.23529411852359772, 0.23529411852359772, 0.23529411852359772), (0.23949579894542694, 0.23921568691730499, 0.23921568691730499), (0.24369747936725616, 0.24313725531101227, 0.24313725531101227), (0.24789915978908539, 0.24705882370471954, 0.24705882370471954), (0.25210085511207581, 0.25098040699958801, 0.25098040699958801), (0.25630253553390503, 0.25490197539329529, 0.25490197539329529), (0.26050421595573425, 0.25882354378700256, 0.25882354378700256), (0.26470589637756348, 0.26274511218070984, 0.26274511218070984), (0.2689075767993927, 0.26666668057441711, 0.26666668057441711), (0.27310925722122192, 0.27058824896812439, 0.27058824896812439), (0.27731093764305115, 0.27450981736183167, 0.27450981736183167), (0.28151261806488037, 0.27843138575553894, 0.27843138575553894), (0.28571429848670959, 0.28627452254295349, 0.28627452254295349), (0.28991597890853882, 0.29019609093666077, 0.29019609093666077), (0.29411765933036804, 0.29411765933036804, 0.29411765933036804), (0.29831933975219727, 0.29803922772407532, 0.29803922772407532), (0.30252102017402649, 0.30196079611778259, 0.30196079611778259), (0.30672270059585571, 0.30588236451148987, 0.30588236451148987), (0.31092438101768494, 0.30980393290519714, 0.30980393290519714), (0.31512606143951416, 0.31372550129890442, 0.31372550129890442), (0.31932774186134338, 0.31764706969261169, 0.31764706969261169), (0.32352942228317261, 0.32156863808631897, 0.32156863808631897), (0.32773110270500183, 0.32549020648002625, 0.32549020648002625), (0.33193278312683105, 0.32941177487373352, 0.32941177487373352), (0.33613446354866028, 0.3333333432674408, 0.3333333432674408), (0.3403361439704895, 0.33725491166114807, 0.33725491166114807), (0.34453782439231873, 0.34117648005485535, 0.34117648005485535), (0.34873950481414795, 0.3490196168422699, 0.3490196168422699), (0.35294118523597717, 0.35294118523597717, 0.35294118523597717), (0.3571428656578064, 0.35686275362968445, 0.35686275362968445), (0.36134454607963562, 0.36078432202339172, 0.36078432202339172), (0.36554622650146484, 0.364705890417099, 0.364705890417099), (0.36974790692329407, 0.36862745881080627, 0.36862745881080627), (0.37394958734512329, 0.37254902720451355, 0.37254902720451355), (0.37815126776695251, 0.37647059559822083, 0.37647059559822083), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.38431373238563538, 0.38431373238563538), (0.39075630903244019, 0.38823530077934265, 0.38823530077934265), (0.39495798945426941, 0.39215686917304993, 0.39215686917304993), (0.39915966987609863, 0.3960784375667572, 0.3960784375667572), (0.40336135029792786, 0.40000000596046448, 0.40000000596046448), (0.40756303071975708, 0.40392157435417175, 0.40392157435417175), (0.4117647111415863, 0.4117647111415863, 0.4117647111415863), (0.41596639156341553, 0.41568627953529358, 0.41568627953529358), (0.42016807198524475, 0.41960784792900085, 0.41960784792900085), (0.42436975240707397, 0.42352941632270813, 0.42352941632270813), (0.4285714328289032, 0.42745098471641541, 0.42745098471641541), (0.43277311325073242, 0.43137255311012268, 0.43137255311012268), (0.43697479367256165, 0.43529412150382996, 0.43529412150382996), (0.44117647409439087, 0.43921568989753723, 0.43921568989753723), (0.44537815451622009, 0.44313725829124451, 0.44313725829124451), (0.44957983493804932, 0.44705882668495178, 0.44705882668495178), (0.45378151535987854, 0.45098039507865906, 0.45098039507865906), (0.45798319578170776, 0.45490196347236633, 0.45490196347236633), (0.46218487620353699, 0.45882353186607361, 0.45882353186607361), (0.46638655662536621, 0.46274510025978088, 0.46274510025978088), (0.47058823704719543, 0.46666666865348816, 0.46666666865348816), (0.47478991746902466, 0.47450980544090271, 0.47450980544090271), (0.47899159789085388, 0.47843137383460999, 0.47843137383460999), (0.48319327831268311, 0.48235294222831726, 0.48235294222831726), (0.48739495873451233, 0.48627451062202454, 0.48627451062202454), (0.49159663915634155, 0.49019607901573181, 0.49019607901573181), (0.49579831957817078, 0.49411764740943909, 0.49411764740943909), (0.5, 0.49803921580314636, 0.49803921580314636), (0.50420171022415161, 0.50196081399917603, 0.50196081399917603), (0.50840336084365845, 0.5058823823928833, 0.5058823823928833), (0.51260507106781006, 0.50980395078659058, 0.50980395078659058), (0.51680672168731689, 0.51372551918029785, 0.51372551918029785), (0.52100843191146851, 0.51764708757400513, 0.51764708757400513), (0.52521008253097534, 0.5215686559677124, 0.5215686559677124), (0.52941179275512695, 0.52549022436141968, 0.52549022436141968), (0.53361344337463379, 0.52941179275512695, 0.52941179275512695), (0.5378151535987854, 0.5372549295425415, 0.5372549295425415), (0.54201680421829224, 0.54117649793624878, 0.54117649793624878), (0.54621851444244385, 0.54509806632995605, 0.54509806632995605), (0.55042016506195068, 0.54901963472366333, 0.54901963472366333), (0.55462187528610229, 0.55294120311737061, 0.55294120311737061), (0.55882352590560913, 0.55686277151107788, 0.55686277151107788), (0.56302523612976074, 0.56078433990478516, 0.56078433990478516), (0.56722688674926758, 0.56470590829849243, 0.56470590829849243), (0.57142859697341919, 0.56862747669219971, 0.56862747669219971), (0.57563024759292603, 0.57254904508590698, 0.57254904508590698), (0.57983195781707764, 0.57647061347961426, 0.57647061347961426), (0.58403360843658447, 0.58039218187332153, 0.58039218187332153), (0.58823531866073608, 0.58431375026702881, 0.58431375026702881), (0.59243696928024292, 0.58823531866073608, 0.58823531866073608), (0.59663867950439453, 0.59215688705444336, 0.59215688705444336), (0.60084033012390137, 0.60000002384185791, 0.60000002384185791), (0.60504204034805298, 0.60392159223556519, 0.60392159223556519), (0.60924369096755981, 0.60784316062927246, 0.60784316062927246), (0.61344540119171143, 0.61176472902297974, 0.61176472902297974), (0.61764705181121826, 0.61568629741668701, 0.61568629741668701), (0.62184876203536987, 0.61960786581039429, 0.61960786581039429), (0.62605041265487671, 0.62352943420410156, 0.62352943420410156), (0.63025212287902832, 0.62745100259780884, 0.62745100259780884), (0.63445377349853516, 0.63137257099151611, 0.63137257099151611), (0.63865548372268677, 0.63529413938522339, 0.63529413938522339), (0.6428571343421936, 0.63921570777893066, 0.63921570777893066), (0.64705884456634521, 0.64313727617263794, 0.64313727617263794), (0.65126049518585205, 0.64705884456634521, 0.64705884456634521), (0.65546220541000366, 0.65098041296005249, 0.65098041296005249), (0.6596638560295105, 0.65490198135375977, 0.65490198135375977), (0.66386556625366211, 0.66274511814117432, 0.66274511814117432), (0.66806721687316895, 0.66666668653488159, 0.66666668653488159), (0.67226892709732056, 0.67058825492858887, 0.67058825492858887), (0.67647057771682739, 0.67450982332229614, 0.67450982332229614), (0.680672287940979, 0.67843139171600342, 0.67843139171600342), (0.68487393856048584, 0.68235296010971069, 0.68235296010971069), (0.68907564878463745, 0.68627452850341797, 0.68627452850341797), (0.69327729940414429, 0.69019609689712524, 0.69019609689712524), (0.6974790096282959, 0.69411766529083252, 0.69411766529083252), (0.70168066024780273, 0.69803923368453979, 0.69803923368453979), (0.70588237047195435, 0.70196080207824707, 0.70196080207824707), (0.71008402109146118, 0.70588237047195435, 0.70588237047195435), (0.71428573131561279, 0.70980393886566162, 0.70980393886566162), (0.71848738193511963, 0.7137255072593689, 0.7137255072593689), (0.72268909215927124, 0.71764707565307617, 0.71764707565307617), (0.72689074277877808, 0.72549021244049072, 0.72549021244049072), (0.73109245300292969, 0.729411780834198, 0.729411780834198), (0.73529410362243652, 0.73333334922790527, 0.73333334922790527), (0.73949581384658813, 0.73725491762161255, 0.73725491762161255), (0.74369746446609497, 0.74117648601531982, 0.74117648601531982), (0.74789917469024658, 0.7450980544090271, 0.7450980544090271), (0.75210082530975342, 0.74901962280273438, 0.74901962280273438), (0.75630253553390503, 0.75294119119644165, 0.75294119119644165), (0.76050418615341187, 0.75686275959014893, 0.75686275959014893), (0.76470589637756348, 0.7607843279838562, 0.7607843279838562), (0.76890754699707031, 0.76470589637756348, 0.76470589637756348), (0.77310925722122192, 0.76862746477127075, 0.76862746477127075), (0.77731090784072876, 0.77254903316497803, 0.77254903316497803), (0.78151261806488037, 0.7764706015586853, 0.7764706015586853), (0.78571426868438721, 0.78039216995239258, 0.78039216995239258), (0.78991597890853882, 0.78823530673980713, 0.78823530673980713), (0.79411762952804565, 0.7921568751335144, 0.7921568751335144), (0.79831933975219727, 0.79607844352722168, 0.79607844352722168), (0.8025209903717041, 0.80000001192092896, 0.80000001192092896), (0.80672270059585571, 0.80392158031463623, 0.80392158031463623), (0.81092435121536255, 0.80784314870834351, 0.80784314870834351), (0.81512606143951416, 0.81176471710205078, 0.81176471710205078), (0.819327712059021, 0.81568628549575806, 0.81568628549575806), (0.82352942228317261, 0.81960785388946533, 0.81960785388946533), (0.82773107290267944, 0.82352942228317261, 0.82352942228317261), (0.83193278312683105, 0.82745099067687988, 0.82745099067687988), (0.83613443374633789, 0.83137255907058716, 0.83137255907058716), (0.8403361439704895, 0.83529412746429443, 0.83529412746429443), (0.84453779458999634, 0.83921569585800171, 0.83921569585800171), (0.84873950481414795, 0.84313726425170898, 0.84313726425170898), (0.85294115543365479, 0.85098040103912354, 0.85098040103912354), (0.8571428656578064, 0.85490196943283081, 0.85490196943283081), (0.86134451627731323, 0.85882353782653809, 0.85882353782653809), (0.86554622650146484, 0.86274510622024536, 0.86274510622024536), (0.86974787712097168, 0.86666667461395264, 0.86666667461395264), (0.87394958734512329, 0.87058824300765991, 0.87058824300765991), (0.87815123796463013, 0.87450981140136719, 0.87450981140136719), (0.88235294818878174, 0.87843137979507446, 0.87843137979507446), (0.88655459880828857, 0.88235294818878174, 0.88235294818878174), (0.89075630903244019, 0.88627451658248901, 0.88627451658248901), (0.89495795965194702, 0.89019608497619629, 0.89019608497619629), (0.89915966987609863, 0.89411765336990356, 0.89411765336990356), (0.90336132049560547, 0.89803922176361084, 0.89803922176361084), (0.90756303071975708, 0.90196079015731812, 0.90196079015731812), (0.91176468133926392, 0.90588235855102539, 0.90588235855102539), (0.91596639156341553, 0.91372549533843994, 0.91372549533843994), (0.92016804218292236, 0.91764706373214722, 0.91764706373214722), (0.92436975240707397, 0.92156863212585449, 0.92156863212585449), (0.92857140302658081, 0.92549020051956177, 0.92549020051956177), (0.93277311325073242, 0.92941176891326904, 0.92941176891326904), (0.93697476387023926, 0.93333333730697632, 0.93333333730697632), (0.94117647409439087, 0.93725490570068359, 0.93725490570068359), (0.94537812471389771, 0.94117647409439087, 0.94117647409439087), (0.94957983493804932, 0.94509804248809814, 0.94509804248809814), (0.95378148555755615, 0.94901961088180542, 0.94901961088180542), (0.95798319578170776, 0.9529411792755127, 0.9529411792755127), (0.9621848464012146, 0.95686274766921997, 0.95686274766921997), (0.96638655662536621, 0.96078431606292725, 0.96078431606292725), (0.97058820724487305, 0.96470588445663452, 0.96470588445663452), (0.97478991746902466, 0.9686274528503418, 0.9686274528503418), (0.97899156808853149, 0.97647058963775635, 0.97647058963775635), (0.98319327831268311, 0.98039215803146362, 0.98039215803146362), (0.98739492893218994, 0.9843137264251709, 0.9843137264251709), (0.99159663915634155, 0.98823529481887817, 0.98823529481887817), (0.99579828977584839, 0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272), ], } _gist_heat_data = { "blue": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), (0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), (0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), (0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), (0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), (0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), (0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), (0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), (0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), (0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), (0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), (0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), (0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), (0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), (0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), (0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), (0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), (0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), (0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), (0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), (0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), (0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), (0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), (0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), (0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), (0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), (0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), (0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), (0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), (0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), (0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), (0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), (0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), (0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), (0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), (0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), (0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), (0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), (0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), (0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), (0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), (0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), (0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), (0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), (0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), (0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), (0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), (0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), (0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), (0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), (0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), (0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), (0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), (0.47478991746902466, 0.0, 0.0), (0.47899159789085388, 0.0, 0.0), (0.48319327831268311, 0.0, 0.0), (0.48739495873451233, 0.0, 0.0), (0.49159663915634155, 0.0, 0.0), (0.49579831957817078, 0.0, 0.0), (0.5, 0.0, 0.0), (0.50420171022415161, 0.0, 0.0), (0.50840336084365845, 0.0, 0.0), (0.51260507106781006, 0.0, 0.0), (0.51680672168731689, 0.0, 0.0), (0.52100843191146851, 0.0, 0.0), (0.52521008253097534, 0.0, 0.0), (0.52941179275512695, 0.0, 0.0), (0.53361344337463379, 0.0, 0.0), (0.5378151535987854, 0.0, 0.0), (0.54201680421829224, 0.0, 0.0), (0.54621851444244385, 0.0, 0.0), (0.55042016506195068, 0.0, 0.0), (0.55462187528610229, 0.0, 0.0), (0.55882352590560913, 0.0, 0.0), (0.56302523612976074, 0.0, 0.0), (0.56722688674926758, 0.0, 0.0), (0.57142859697341919, 0.0, 0.0), (0.57563024759292603, 0.0, 0.0), (0.57983195781707764, 0.0, 0.0), (0.58403360843658447, 0.0, 0.0), (0.58823531866073608, 0.0, 0.0), (0.59243696928024292, 0.0, 0.0), (0.59663867950439453, 0.0, 0.0), (0.60084033012390137, 0.0, 0.0), (0.60504204034805298, 0.0, 0.0), (0.60924369096755981, 0.0, 0.0), (0.61344540119171143, 0.0, 0.0), (0.61764705181121826, 0.0, 0.0), (0.62184876203536987, 0.0, 0.0), (0.62605041265487671, 0.0, 0.0), (0.63025212287902832, 0.0, 0.0), (0.63445377349853516, 0.0, 0.0), (0.63865548372268677, 0.0, 0.0), (0.6428571343421936, 0.0, 0.0), (0.64705884456634521, 0.0, 0.0), (0.65126049518585205, 0.0, 0.0), (0.65546220541000366, 0.0, 0.0), (0.6596638560295105, 0.0, 0.0), (0.66386556625366211, 0.0, 0.0), (0.66806721687316895, 0.0, 0.0), (0.67226892709732056, 0.0, 0.0), (0.67647057771682739, 0.0, 0.0), (0.680672287940979, 0.0, 0.0), (0.68487393856048584, 0.0, 0.0), (0.68907564878463745, 0.0, 0.0), (0.69327729940414429, 0.0, 0.0), (0.6974790096282959, 0.0, 0.0), (0.70168066024780273, 0.0, 0.0), (0.70588237047195435, 0.0, 0.0), (0.71008402109146118, 0.0, 0.0), (0.71428573131561279, 0.0, 0.0), (0.71848738193511963, 0.0, 0.0), (0.72268909215927124, 0.0, 0.0), (0.72689074277877808, 0.0, 0.0), (0.73109245300292969, 0.0, 0.0), (0.73529410362243652, 0.0, 0.0), (0.73949581384658813, 0.0, 0.0), (0.74369746446609497, 0.0, 0.0), (0.74789917469024658, 0.0, 0.0), (0.75210082530975342, 0.0, 0.0), (0.75630253553390503, 0.027450980618596077, 0.027450980618596077), (0.76050418615341187, 0.043137256056070328, 0.043137256056070328), (0.76470589637756348, 0.058823529630899429, 0.058823529630899429), (0.76890754699707031, 0.074509806931018829, 0.074509806931018829), (0.77310925722122192, 0.090196080505847931, 0.090196080505847931), (0.77731090784072876, 0.10588235408067703, 0.10588235408067703), (0.78151261806488037, 0.12156862765550613, 0.12156862765550613), (0.78571426868438721, 0.13725490868091583, 0.13725490868091583), (0.78991597890853882, 0.15294118225574493, 0.15294118225574493), (0.79411762952804565, 0.16862745583057404, 0.16862745583057404), (0.79831933975219727, 0.20000000298023224, 0.20000000298023224), (0.8025209903717041, 0.21176470816135406, 0.21176470816135406), (0.80672270059585571, 0.22745098173618317, 0.22745098173618317), (0.81092435121536255, 0.24313725531101227, 0.24313725531101227), (0.81512606143951416, 0.25882354378700256, 0.25882354378700256), (0.819327712059021, 0.27450981736183167, 0.27450981736183167), (0.82352942228317261, 0.29019609093666077, 0.29019609093666077), (0.82773107290267944, 0.30588236451148987, 0.30588236451148987), (0.83193278312683105, 0.32156863808631897, 0.32156863808631897), (0.83613443374633789, 0.33725491166114807, 0.33725491166114807), (0.8403361439704895, 0.35294118523597717, 0.35294118523597717), (0.84453779458999634, 0.36862745881080627, 0.36862745881080627), (0.84873950481414795, 0.38431373238563538, 0.38431373238563538), (0.85294115543365479, 0.40000000596046448, 0.40000000596046448), (0.8571428656578064, 0.4117647111415863, 0.4117647111415863), (0.86134451627731323, 0.42745098471641541, 0.42745098471641541), (0.86554622650146484, 0.44313725829124451, 0.44313725829124451), (0.86974787712097168, 0.45882353186607361, 0.45882353186607361), (0.87394958734512329, 0.47450980544090271, 0.47450980544090271), (0.87815123796463013, 0.49019607901573181, 0.49019607901573181), (0.88235294818878174, 0.5215686559677124, 0.5215686559677124), (0.88655459880828857, 0.5372549295425415, 0.5372549295425415), (0.89075630903244019, 0.55294120311737061, 0.55294120311737061), (0.89495795965194702, 0.56862747669219971, 0.56862747669219971), (0.89915966987609863, 0.58431375026702881, 0.58431375026702881), (0.90336132049560547, 0.60000002384185791, 0.60000002384185791), (0.90756303071975708, 0.61176472902297974, 0.61176472902297974), (0.91176468133926392, 0.62745100259780884, 0.62745100259780884), (0.91596639156341553, 0.64313727617263794, 0.64313727617263794), (0.92016804218292236, 0.65882354974746704, 0.65882354974746704), (0.92436975240707397, 0.67450982332229614, 0.67450982332229614), (0.92857140302658081, 0.69019609689712524, 0.69019609689712524), (0.93277311325073242, 0.70588237047195435, 0.70588237047195435), (0.93697476387023926, 0.72156864404678345, 0.72156864404678345), (0.94117647409439087, 0.73725491762161255, 0.73725491762161255), (0.94537812471389771, 0.75294119119644165, 0.75294119119644165), (0.94957983493804932, 0.76862746477127075, 0.76862746477127075), (0.95378148555755615, 0.78431373834609985, 0.78431373834609985), (0.95798319578170776, 0.80000001192092896, 0.80000001192092896), (0.9621848464012146, 0.81176471710205078, 0.81176471710205078), (0.96638655662536621, 0.84313726425170898, 0.84313726425170898), (0.97058820724487305, 0.85882353782653809, 0.85882353782653809), (0.97478991746902466, 0.87450981140136719, 0.87450981140136719), (0.97899156808853149, 0.89019608497619629, 0.89019608497619629), (0.98319327831268311, 0.90588235855102539, 0.90588235855102539), (0.98739492893218994, 0.92156863212585449, 0.92156863212585449), (0.99159663915634155, 0.93725490570068359, 0.93725490570068359), (0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, 0.9686274528503418, 0.9686274528503418), ], "green": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), (0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), (0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), (0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), (0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), (0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), (0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), (0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), (0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), (0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), (0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), (0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), (0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), (0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), (0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), (0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), (0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), (0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), (0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), (0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), (0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), (0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), (0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), (0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), (0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), (0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), (0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), (0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), (0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), (0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), (0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), (0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), (0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), (0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), (0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), (0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), (0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), (0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), (0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), (0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), (0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), (0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), (0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), (0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), (0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), (0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), (0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), (0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), (0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), (0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), (0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), (0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), (0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), (0.47478991746902466, 0.0, 0.0), (0.47899159789085388, 0.0039215688593685627, 0.0039215688593685627), (0.48319327831268311, 0.011764706112444401, 0.011764706112444401), (0.48739495873451233, 0.019607843831181526, 0.019607843831181526), (0.49159663915634155, 0.027450980618596077, 0.027450980618596077), (0.49579831957817078, 0.035294119268655777, 0.035294119268655777), (0.5, 0.043137256056070328, 0.043137256056070328), (0.50420171022415161, 0.058823529630899429, 0.058823529630899429), (0.50840336084365845, 0.066666670143604279, 0.066666670143604279), (0.51260507106781006, 0.070588238537311554, 0.070588238537311554), (0.51680672168731689, 0.078431375324726105, 0.078431375324726105), (0.52100843191146851, 0.086274512112140656, 0.086274512112140656), (0.52521008253097534, 0.094117648899555206, 0.094117648899555206), (0.52941179275512695, 0.10196078568696976, 0.10196078568696976), (0.53361344337463379, 0.10980392247438431, 0.10980392247438431), (0.5378151535987854, 0.11764705926179886, 0.11764705926179886), (0.54201680421829224, 0.12549020349979401, 0.12549020349979401), (0.54621851444244385, 0.13725490868091583, 0.13725490868091583), (0.55042016506195068, 0.14509804546833038, 0.14509804546833038), (0.55462187528610229, 0.15294118225574493, 0.15294118225574493), (0.55882352590560913, 0.16078431904315948, 0.16078431904315948), (0.56302523612976074, 0.16862745583057404, 0.16862745583057404), (0.56722688674926758, 0.17647059261798859, 0.17647059261798859), (0.57142859697341919, 0.18431372940540314, 0.18431372940540314), (0.57563024759292603, 0.19215686619281769, 0.19215686619281769), (0.57983195781707764, 0.20000000298023224, 0.20000000298023224), (0.58403360843658447, 0.20392157137393951, 0.20392157137393951), (0.58823531866073608, 0.21176470816135406, 0.21176470816135406), (0.59243696928024292, 0.21960784494876862, 0.21960784494876862), (0.59663867950439453, 0.22745098173618317, 0.22745098173618317), (0.60084033012390137, 0.23529411852359772, 0.23529411852359772), (0.60504204034805298, 0.24313725531101227, 0.24313725531101227), (0.60924369096755981, 0.25098040699958801, 0.25098040699958801), (0.61344540119171143, 0.25882354378700256, 0.25882354378700256), (0.61764705181121826, 0.26666668057441711, 0.26666668057441711), (0.62184876203536987, 0.27058824896812439, 0.27058824896812439), (0.62605041265487671, 0.27843138575553894, 0.27843138575553894), (0.63025212287902832, 0.29411765933036804, 0.29411765933036804), (0.63445377349853516, 0.30196079611778259, 0.30196079611778259), (0.63865548372268677, 0.30980393290519714, 0.30980393290519714), (0.6428571343421936, 0.31764706969261169, 0.31764706969261169), (0.64705884456634521, 0.32549020648002625, 0.32549020648002625), (0.65126049518585205, 0.3333333432674408, 0.3333333432674408), (0.65546220541000366, 0.33725491166114807, 0.33725491166114807), (0.6596638560295105, 0.34509804844856262, 0.34509804844856262), (0.66386556625366211, 0.35294118523597717, 0.35294118523597717), (0.66806721687316895, 0.36078432202339172, 0.36078432202339172), (0.67226892709732056, 0.36862745881080627, 0.36862745881080627), (0.67647057771682739, 0.37647059559822083, 0.37647059559822083), (0.680672287940979, 0.38431373238563538, 0.38431373238563538), (0.68487393856048584, 0.39215686917304993, 0.39215686917304993), (0.68907564878463745, 0.40000000596046448, 0.40000000596046448), (0.69327729940414429, 0.40392157435417175, 0.40392157435417175), (0.6974790096282959, 0.4117647111415863, 0.4117647111415863), (0.70168066024780273, 0.41960784792900085, 0.41960784792900085), (0.70588237047195435, 0.42745098471641541, 0.42745098471641541), (0.71008402109146118, 0.43529412150382996, 0.43529412150382996), (0.71428573131561279, 0.45098039507865906, 0.45098039507865906), (0.71848738193511963, 0.45882353186607361, 0.45882353186607361), (0.72268909215927124, 0.46666666865348816, 0.46666666865348816), (0.72689074277877808, 0.47058823704719543, 0.47058823704719543), (0.73109245300292969, 0.47843137383460999, 0.47843137383460999), (0.73529410362243652, 0.48627451062202454, 0.48627451062202454), (0.73949581384658813, 0.49411764740943909, 0.49411764740943909), (0.74369746446609497, 0.50196081399917603, 0.50196081399917603), (0.74789917469024658, 0.50980395078659058, 0.50980395078659058), (0.75210082530975342, 0.51764708757400513, 0.51764708757400513), (0.75630253553390503, 0.53333336114883423, 0.53333336114883423), (0.76050418615341187, 0.5372549295425415, 0.5372549295425415), (0.76470589637756348, 0.54509806632995605, 0.54509806632995605), (0.76890754699707031, 0.55294120311737061, 0.55294120311737061), (0.77310925722122192, 0.56078433990478516, 0.56078433990478516), (0.77731090784072876, 0.56862747669219971, 0.56862747669219971), (0.78151261806488037, 0.57647061347961426, 0.57647061347961426), (0.78571426868438721, 0.58431375026702881, 0.58431375026702881), (0.78991597890853882, 0.59215688705444336, 0.59215688705444336), (0.79411762952804565, 0.60000002384185791, 0.60000002384185791), (0.79831933975219727, 0.61176472902297974, 0.61176472902297974), (0.8025209903717041, 0.61960786581039429, 0.61960786581039429), (0.80672270059585571, 0.62745100259780884, 0.62745100259780884), (0.81092435121536255, 0.63529413938522339, 0.63529413938522339), (0.81512606143951416, 0.64313727617263794, 0.64313727617263794), (0.819327712059021, 0.65098041296005249, 0.65098041296005249), (0.82352942228317261, 0.65882354974746704, 0.65882354974746704), (0.82773107290267944, 0.66666668653488159, 0.66666668653488159), (0.83193278312683105, 0.67058825492858887, 0.67058825492858887), (0.83613443374633789, 0.67843139171600342, 0.67843139171600342), (0.8403361439704895, 0.68627452850341797, 0.68627452850341797), (0.84453779458999634, 0.69411766529083252, 0.69411766529083252), (0.84873950481414795, 0.70196080207824707, 0.70196080207824707), (0.85294115543365479, 0.70980393886566162, 0.70980393886566162), (0.8571428656578064, 0.71764707565307617, 0.71764707565307617), (0.86134451627731323, 0.72549021244049072, 0.72549021244049072), (0.86554622650146484, 0.73333334922790527, 0.73333334922790527), (0.86974787712097168, 0.73725491762161255, 0.73725491762161255), (0.87394958734512329, 0.7450980544090271, 0.7450980544090271), (0.87815123796463013, 0.75294119119644165, 0.75294119119644165), (0.88235294818878174, 0.76862746477127075, 0.76862746477127075), (0.88655459880828857, 0.7764706015586853, 0.7764706015586853), (0.89075630903244019, 0.78431373834609985, 0.78431373834609985), (0.89495795965194702, 0.7921568751335144, 0.7921568751335144), (0.89915966987609863, 0.80000001192092896, 0.80000001192092896), (0.90336132049560547, 0.80392158031463623, 0.80392158031463623), (0.90756303071975708, 0.81176471710205078, 0.81176471710205078), (0.91176468133926392, 0.81960785388946533, 0.81960785388946533), (0.91596639156341553, 0.82745099067687988, 0.82745099067687988), (0.92016804218292236, 0.83529412746429443, 0.83529412746429443), (0.92436975240707397, 0.84313726425170898, 0.84313726425170898), (0.92857140302658081, 0.85098040103912354, 0.85098040103912354), (0.93277311325073242, 0.85882353782653809, 0.85882353782653809), (0.93697476387023926, 0.86666667461395264, 0.86666667461395264), (0.94117647409439087, 0.87058824300765991, 0.87058824300765991), (0.94537812471389771, 0.87843137979507446, 0.87843137979507446), (0.94957983493804932, 0.88627451658248901, 0.88627451658248901), (0.95378148555755615, 0.89411765336990356, 0.89411765336990356), (0.95798319578170776, 0.90196079015731812, 0.90196079015731812), (0.9621848464012146, 0.90980392694473267, 0.90980392694473267), (0.96638655662536621, 0.92549020051956177, 0.92549020051956177), (0.97058820724487305, 0.93333333730697632, 0.93333333730697632), (0.97478991746902466, 0.93725490570068359, 0.93725490570068359), (0.97899156808853149, 0.94509804248809814, 0.94509804248809814), (0.98319327831268311, 0.9529411792755127, 0.9529411792755127), (0.98739492893218994, 0.96078431606292725, 0.96078431606292725), (0.99159663915634155, 0.9686274528503418, 0.9686274528503418), (0.99579828977584839, 0.97647058963775635, 0.97647058963775635), (1.0, 0.9843137264251709, 0.9843137264251709), ], "red": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, 0.015686275437474251, 0.015686275437474251), (0.016806723549962044, 0.019607843831181526, 0.019607843831181526), (0.021008403971791267, 0.027450980618596077, 0.027450980618596077), (0.025210084393620491, 0.031372550874948502, 0.031372550874948502), (0.029411764815449715, 0.039215687662363052, 0.039215687662363052), (0.033613447099924088, 0.043137256056070328, 0.043137256056070328), (0.037815127521753311, 0.050980392843484879, 0.050980392843484879), (0.042016807943582535, 0.058823529630899429, 0.058823529630899429), (0.046218488365411758, 0.066666670143604279, 0.066666670143604279), (0.050420168787240982, 0.070588238537311554, 0.070588238537311554), (0.054621849209070206, 0.078431375324726105, 0.078431375324726105), (0.058823529630899429, 0.08235294371843338, 0.08235294371843338), (0.063025213778018951, 0.090196080505847931, 0.090196080505847931), (0.067226894199848175, 0.094117648899555206, 0.094117648899555206), (0.071428574621677399, 0.10196078568696976, 0.10196078568696976), (0.075630255043506622, 0.10588235408067703, 0.10588235408067703), (0.079831935465335846, 0.10980392247438431, 0.10980392247438431), (0.08403361588716507, 0.11764705926179886, 0.11764705926179886), (0.088235296308994293, 0.12156862765550613, 0.12156862765550613), (0.092436976730823517, 0.12941177189350128, 0.12941177189350128), (0.09663865715265274, 0.13333334028720856, 0.13333334028720856), (0.10084033757448196, 0.14117647707462311, 0.14117647707462311), (0.10504201799631119, 0.14509804546833038, 0.14509804546833038), (0.10924369841814041, 0.15294118225574493, 0.15294118225574493), (0.11344537883996964, 0.15686275064945221, 0.15686275064945221), (0.11764705926179886, 0.16470588743686676, 0.16470588743686676), (0.12184873968362808, 0.16862745583057404, 0.16862745583057404), (0.1260504275560379, 0.18039216101169586, 0.18039216101169586), (0.13025210797786713, 0.18431372940540314, 0.18431372940540314), (0.13445378839969635, 0.19215686619281769, 0.19215686619281769), (0.13865546882152557, 0.19607843458652496, 0.19607843458652496), (0.1428571492433548, 0.20392157137393951, 0.20392157137393951), (0.14705882966518402, 0.20784313976764679, 0.20784313976764679), (0.15126051008701324, 0.21568627655506134, 0.21568627655506134), (0.15546219050884247, 0.21960784494876862, 0.21960784494876862), (0.15966387093067169, 0.22352941334247589, 0.22352941334247589), (0.16386555135250092, 0.23137255012989044, 0.23137255012989044), (0.16806723177433014, 0.23529411852359772, 0.23529411852359772), (0.17226891219615936, 0.24313725531101227, 0.24313725531101227), (0.17647059261798859, 0.24705882370471954, 0.24705882370471954), (0.18067227303981781, 0.25490197539329529, 0.25490197539329529), (0.18487395346164703, 0.25882354378700256, 0.25882354378700256), (0.18907563388347626, 0.26666668057441711, 0.26666668057441711), (0.19327731430530548, 0.27058824896812439, 0.27058824896812439), (0.1974789947271347, 0.27450981736183167, 0.27450981736183167), (0.20168067514896393, 0.28235295414924622, 0.28235295414924622), (0.20588235557079315, 0.28627452254295349, 0.28627452254295349), (0.21008403599262238, 0.29803922772407532, 0.29803922772407532), (0.2142857164144516, 0.30588236451148987, 0.30588236451148987), (0.21848739683628082, 0.30980393290519714, 0.30980393290519714), (0.22268907725811005, 0.31764706969261169, 0.31764706969261169), (0.22689075767993927, 0.32156863808631897, 0.32156863808631897), (0.23109243810176849, 0.32941177487373352, 0.32941177487373352), (0.23529411852359772, 0.3333333432674408, 0.3333333432674408), (0.23949579894542694, 0.33725491166114807, 0.33725491166114807), (0.24369747936725616, 0.34509804844856262, 0.34509804844856262), (0.24789915978908539, 0.3490196168422699, 0.3490196168422699), (0.25210085511207581, 0.36078432202339172, 0.36078432202339172), (0.25630253553390503, 0.36862745881080627, 0.36862745881080627), (0.26050421595573425, 0.37254902720451355, 0.37254902720451355), (0.26470589637756348, 0.3803921639919281, 0.3803921639919281), (0.2689075767993927, 0.38431373238563538, 0.38431373238563538), (0.27310925722122192, 0.38823530077934265, 0.38823530077934265), (0.27731093764305115, 0.3960784375667572, 0.3960784375667572), (0.28151261806488037, 0.40000000596046448, 0.40000000596046448), (0.28571429848670959, 0.40784314274787903, 0.40784314274787903), (0.28991597890853882, 0.4117647111415863, 0.4117647111415863), (0.29411765933036804, 0.42352941632270813, 0.42352941632270813), (0.29831933975219727, 0.43137255311012268, 0.43137255311012268), (0.30252102017402649, 0.43529412150382996, 0.43529412150382996), (0.30672270059585571, 0.44313725829124451, 0.44313725829124451), (0.31092438101768494, 0.44705882668495178, 0.44705882668495178), (0.31512606143951416, 0.45098039507865906, 0.45098039507865906), (0.31932774186134338, 0.45882353186607361, 0.45882353186607361), (0.32352942228317261, 0.46274510025978088, 0.46274510025978088), (0.32773110270500183, 0.47058823704719543, 0.47058823704719543), (0.33193278312683105, 0.47450980544090271, 0.47450980544090271), (0.33613446354866028, 0.48235294222831726, 0.48235294222831726), (0.3403361439704895, 0.48627451062202454, 0.48627451062202454), (0.34453782439231873, 0.49411764740943909, 0.49411764740943909), (0.34873950481414795, 0.49803921580314636, 0.49803921580314636), (0.35294118523597717, 0.50196081399917603, 0.50196081399917603), (0.3571428656578064, 0.50980395078659058, 0.50980395078659058), (0.36134454607963562, 0.51372551918029785, 0.51372551918029785), (0.36554622650146484, 0.5215686559677124, 0.5215686559677124), (0.36974790692329407, 0.52549022436141968, 0.52549022436141968), (0.37394958734512329, 0.53333336114883423, 0.53333336114883423), (0.37815126776695251, 0.54509806632995605, 0.54509806632995605), (0.38235294818878174, 0.54901963472366333, 0.54901963472366333), (0.38655462861061096, 0.55294120311737061, 0.55294120311737061), (0.39075630903244019, 0.56078433990478516, 0.56078433990478516), (0.39495798945426941, 0.56470590829849243, 0.56470590829849243), (0.39915966987609863, 0.57254904508590698, 0.57254904508590698), (0.40336135029792786, 0.57647061347961426, 0.57647061347961426), (0.40756303071975708, 0.58431375026702881, 0.58431375026702881), (0.4117647111415863, 0.58823531866073608, 0.58823531866073608), (0.41596639156341553, 0.59607845544815063, 0.59607845544815063), (0.42016807198524475, 0.60000002384185791, 0.60000002384185791), (0.42436975240707397, 0.60784316062927246, 0.60784316062927246), (0.4285714328289032, 0.61176472902297974, 0.61176472902297974), (0.43277311325073242, 0.61568629741668701, 0.61568629741668701), (0.43697479367256165, 0.62352943420410156, 0.62352943420410156), (0.44117647409439087, 0.62745100259780884, 0.62745100259780884), (0.44537815451622009, 0.63529413938522339, 0.63529413938522339), (0.44957983493804932, 0.63921570777893066, 0.63921570777893066), (0.45378151535987854, 0.64705884456634521, 0.64705884456634521), (0.45798319578170776, 0.65098041296005249, 0.65098041296005249), (0.46218487620353699, 0.66274511814117432, 0.66274511814117432), (0.46638655662536621, 0.66666668653488159, 0.66666668653488159), (0.47058823704719543, 0.67450982332229614, 0.67450982332229614), (0.47478991746902466, 0.67843139171600342, 0.67843139171600342), (0.47899159789085388, 0.68627452850341797, 0.68627452850341797), (0.48319327831268311, 0.69019609689712524, 0.69019609689712524), (0.48739495873451233, 0.69803923368453979, 0.69803923368453979), (0.49159663915634155, 0.70196080207824707, 0.70196080207824707), (0.49579831957817078, 0.70980393886566162, 0.70980393886566162), (0.5, 0.7137255072593689, 0.7137255072593689), (0.50420171022415161, 0.72549021244049072, 0.72549021244049072), (0.50840336084365845, 0.729411780834198, 0.729411780834198), (0.51260507106781006, 0.73725491762161255, 0.73725491762161255), (0.51680672168731689, 0.74117648601531982, 0.74117648601531982), (0.52100843191146851, 0.74901962280273438, 0.74901962280273438), (0.52521008253097534, 0.75294119119644165, 0.75294119119644165), (0.52941179275512695, 0.7607843279838562, 0.7607843279838562), (0.53361344337463379, 0.76470589637756348, 0.76470589637756348), (0.5378151535987854, 0.77254903316497803, 0.77254903316497803), (0.54201680421829224, 0.7764706015586853, 0.7764706015586853), (0.54621851444244385, 0.78823530673980713, 0.78823530673980713), (0.55042016506195068, 0.7921568751335144, 0.7921568751335144), (0.55462187528610229, 0.80000001192092896, 0.80000001192092896), (0.55882352590560913, 0.80392158031463623, 0.80392158031463623), (0.56302523612976074, 0.81176471710205078, 0.81176471710205078), (0.56722688674926758, 0.81568628549575806, 0.81568628549575806), (0.57142859697341919, 0.82352942228317261, 0.82352942228317261), (0.57563024759292603, 0.82745099067687988, 0.82745099067687988), (0.57983195781707764, 0.83137255907058716, 0.83137255907058716), (0.58403360843658447, 0.83921569585800171, 0.83921569585800171), (0.58823531866073608, 0.84313726425170898, 0.84313726425170898), (0.59243696928024292, 0.85098040103912354, 0.85098040103912354), (0.59663867950439453, 0.85490196943283081, 0.85490196943283081), (0.60084033012390137, 0.86274510622024536, 0.86274510622024536), (0.60504204034805298, 0.86666667461395264, 0.86666667461395264), (0.60924369096755981, 0.87450981140136719, 0.87450981140136719), (0.61344540119171143, 0.87843137979507446, 0.87843137979507446), (0.61764705181121826, 0.88627451658248901, 0.88627451658248901), (0.62184876203536987, 0.89019608497619629, 0.89019608497619629), (0.62605041265487671, 0.89411765336990356, 0.89411765336990356), (0.63025212287902832, 0.90588235855102539, 0.90588235855102539), (0.63445377349853516, 0.91372549533843994, 0.91372549533843994), (0.63865548372268677, 0.91764706373214722, 0.91764706373214722), (0.6428571343421936, 0.92549020051956177, 0.92549020051956177), (0.64705884456634521, 0.92941176891326904, 0.92941176891326904), (0.65126049518585205, 0.93725490570068359, 0.93725490570068359), (0.65546220541000366, 0.94117647409439087, 0.94117647409439087), (0.6596638560295105, 0.94509804248809814, 0.94509804248809814), (0.66386556625366211, 0.9529411792755127, 0.9529411792755127), (0.66806721687316895, 0.95686274766921997, 0.95686274766921997), (0.67226892709732056, 0.96470588445663452, 0.96470588445663452), (0.67647057771682739, 0.9686274528503418, 0.9686274528503418), (0.680672287940979, 0.97647058963775635, 0.97647058963775635), (0.68487393856048584, 0.98039215803146362, 0.98039215803146362), (0.68907564878463745, 0.98823529481887817, 0.98823529481887817), (0.69327729940414429, 0.99215686321258545, 0.99215686321258545), (0.6974790096282959, 1.0, 1.0), (0.70168066024780273, 1.0, 1.0), (0.70588237047195435, 1.0, 1.0), (0.71008402109146118, 1.0, 1.0), (0.71428573131561279, 1.0, 1.0), (0.71848738193511963, 1.0, 1.0), (0.72268909215927124, 1.0, 1.0), (0.72689074277877808, 1.0, 1.0), (0.73109245300292969, 1.0, 1.0), (0.73529410362243652, 1.0, 1.0), (0.73949581384658813, 1.0, 1.0), (0.74369746446609497, 1.0, 1.0), (0.74789917469024658, 1.0, 1.0), (0.75210082530975342, 1.0, 1.0), (0.75630253553390503, 1.0, 1.0), (0.76050418615341187, 1.0, 1.0), (0.76470589637756348, 1.0, 1.0), (0.76890754699707031, 1.0, 1.0), (0.77310925722122192, 1.0, 1.0), (0.77731090784072876, 1.0, 1.0), (0.78151261806488037, 1.0, 1.0), (0.78571426868438721, 1.0, 1.0), (0.78991597890853882, 1.0, 1.0), (0.79411762952804565, 1.0, 1.0), (0.79831933975219727, 1.0, 1.0), (0.8025209903717041, 1.0, 1.0), (0.80672270059585571, 1.0, 1.0), (0.81092435121536255, 1.0, 1.0), (0.81512606143951416, 1.0, 1.0), (0.819327712059021, 1.0, 1.0), (0.82352942228317261, 1.0, 1.0), (0.82773107290267944, 1.0, 1.0), (0.83193278312683105, 1.0, 1.0), (0.83613443374633789, 1.0, 1.0), (0.8403361439704895, 1.0, 1.0), (0.84453779458999634, 1.0, 1.0), (0.84873950481414795, 1.0, 1.0), (0.85294115543365479, 1.0, 1.0), (0.8571428656578064, 1.0, 1.0), (0.86134451627731323, 1.0, 1.0), (0.86554622650146484, 1.0, 1.0), (0.86974787712097168, 1.0, 1.0), (0.87394958734512329, 1.0, 1.0), (0.87815123796463013, 1.0, 1.0), (0.88235294818878174, 1.0, 1.0), (0.88655459880828857, 1.0, 1.0), (0.89075630903244019, 1.0, 1.0), (0.89495795965194702, 1.0, 1.0), (0.89915966987609863, 1.0, 1.0), (0.90336132049560547, 1.0, 1.0), (0.90756303071975708, 1.0, 1.0), (0.91176468133926392, 1.0, 1.0), (0.91596639156341553, 1.0, 1.0), (0.92016804218292236, 1.0, 1.0), (0.92436975240707397, 1.0, 1.0), (0.92857140302658081, 1.0, 1.0), (0.93277311325073242, 1.0, 1.0), (0.93697476387023926, 1.0, 1.0), (0.94117647409439087, 1.0, 1.0), (0.94537812471389771, 1.0, 1.0), (0.94957983493804932, 1.0, 1.0), (0.95378148555755615, 1.0, 1.0), (0.95798319578170776, 1.0, 1.0), (0.9621848464012146, 1.0, 1.0), (0.96638655662536621, 1.0, 1.0), (0.97058820724487305, 1.0, 1.0), (0.97478991746902466, 1.0, 1.0), (0.97899156808853149, 1.0, 1.0), (0.98319327831268311, 1.0, 1.0), (0.98739492893218994, 1.0, 1.0), (0.99159663915634155, 1.0, 1.0), (0.99579828977584839, 1.0, 1.0), (1.0, 1.0, 1.0), ], } _gist_ncar_data = { "blue": [ (0.0, 0.50196081399917603, 0.50196081399917603), (0.0050505050458014011, 0.45098039507865906, 0.45098039507865906), (0.010101010091602802, 0.40392157435417175, 0.40392157435417175), (0.015151515603065491, 0.35686275362968445, 0.35686275362968445), (0.020202020183205605, 0.30980393290519714, 0.30980393290519714), (0.025252524763345718, 0.25882354378700256, 0.25882354378700256), (0.030303031206130981, 0.21176470816135406, 0.21176470816135406), (0.035353533923625946, 0.16470588743686676, 0.16470588743686676), (0.040404040366411209, 0.11764705926179886, 0.11764705926179886), (0.045454546809196472, 0.070588238537311554, 0.070588238537311554), (0.050505049526691437, 0.019607843831181526, 0.019607843831181526), (0.0555555559694767, 0.047058824449777603, 0.047058824449777603), (0.060606062412261963, 0.14509804546833038, 0.14509804546833038), (0.065656565129756927, 0.23921568691730499, 0.23921568691730499), (0.070707067847251892, 0.3333333432674408, 0.3333333432674408), (0.075757578015327454, 0.43137255311012268, 0.43137255311012268), (0.080808080732822418, 0.52549022436141968, 0.52549022436141968), (0.085858583450317383, 0.61960786581039429, 0.61960786581039429), (0.090909093618392944, 0.71764707565307617, 0.71764707565307617), (0.095959596335887909, 0.81176471710205078, 0.81176471710205078), (0.10101009905338287, 0.90588235855102539, 0.90588235855102539), (0.10606060922145844, 1.0, 1.0), (0.1111111119389534, 1.0, 1.0), (0.11616161465644836, 1.0, 1.0), (0.12121212482452393, 1.0, 1.0), (0.12626262009143829, 1.0, 1.0), (0.13131313025951385, 1.0, 1.0), (0.13636364042758942, 1.0, 1.0), (0.14141413569450378, 1.0, 1.0), (0.14646464586257935, 1.0, 1.0), (0.15151515603065491, 1.0, 1.0), (0.15656565129756927, 1.0, 1.0), (0.16161616146564484, 1.0, 1.0), (0.1666666716337204, 1.0, 1.0), (0.17171716690063477, 1.0, 1.0), (0.17676767706871033, 1.0, 1.0), (0.18181818723678589, 1.0, 1.0), (0.18686868250370026, 1.0, 1.0), (0.19191919267177582, 1.0, 1.0), (0.19696970283985138, 1.0, 1.0), (0.20202019810676575, 1.0, 1.0), (0.20707070827484131, 1.0, 1.0), (0.21212121844291687, 0.99215686321258545, 0.99215686321258545), (0.21717171370983124, 0.95686274766921997, 0.95686274766921997), (0.2222222238779068, 0.91764706373214722, 0.91764706373214722), (0.22727273404598236, 0.88235294818878174, 0.88235294818878174), (0.23232322931289673, 0.84313726425170898, 0.84313726425170898), (0.23737373948097229, 0.80392158031463623, 0.80392158031463623), (0.24242424964904785, 0.76862746477127075, 0.76862746477127075), (0.24747474491596222, 0.729411780834198, 0.729411780834198), (0.25252524018287659, 0.69019609689712524, 0.69019609689712524), (0.25757575035095215, 0.65490198135375977, 0.65490198135375977), (0.26262626051902771, 0.61568629741668701, 0.61568629741668701), (0.26767677068710327, 0.56470590829849243, 0.56470590829849243), (0.27272728085517883, 0.50980395078659058, 0.50980395078659058), (0.27777779102325439, 0.45098039507865906, 0.45098039507865906), (0.28282827138900757, 0.39215686917304993, 0.39215686917304993), (0.28787878155708313, 0.3333333432674408, 0.3333333432674408), (0.29292929172515869, 0.27843138575553894, 0.27843138575553894), (0.29797980189323425, 0.21960784494876862, 0.21960784494876862), (0.30303031206130981, 0.16078431904315948, 0.16078431904315948), (0.30808082222938538, 0.10588235408067703, 0.10588235408067703), (0.31313130259513855, 0.047058824449777603, 0.047058824449777603), (0.31818181276321411, 0.0, 0.0), (0.32323232293128967, 0.0, 0.0), (0.32828283309936523, 0.0, 0.0), (0.3333333432674408, 0.0, 0.0), (0.33838382363319397, 0.0, 0.0), (0.34343433380126953, 0.0, 0.0), (0.34848484396934509, 0.0, 0.0), (0.35353535413742065, 0.0, 0.0), (0.35858586430549622, 0.0, 0.0), (0.36363637447357178, 0.0, 0.0), (0.36868685483932495, 0.0, 0.0), (0.37373736500740051, 0.0, 0.0), (0.37878787517547607, 0.0, 0.0), (0.38383838534355164, 0.0, 0.0), (0.3888888955116272, 0.0, 0.0), (0.39393940567970276, 0.0, 0.0), (0.39898988604545593, 0.0, 0.0), (0.40404039621353149, 0.0, 0.0), (0.40909090638160706, 0.0, 0.0), (0.41414141654968262, 0.0, 0.0), (0.41919192671775818, 0.0, 0.0), (0.42424243688583374, 0.0039215688593685627, 0.0039215688593685627), (0.42929291725158691, 0.027450980618596077, 0.027450980618596077), (0.43434342741966248, 0.050980392843484879, 0.050980392843484879), (0.43939393758773804, 0.074509806931018829, 0.074509806931018829), (0.4444444477558136, 0.094117648899555206, 0.094117648899555206), (0.44949495792388916, 0.11764705926179886, 0.11764705926179886), (0.45454546809196472, 0.14117647707462311, 0.14117647707462311), (0.4595959484577179, 0.16470588743686676, 0.16470588743686676), (0.46464645862579346, 0.18823529779911041, 0.18823529779911041), (0.46969696879386902, 0.21176470816135406, 0.21176470816135406), (0.47474747896194458, 0.23529411852359772, 0.23529411852359772), (0.47979798913002014, 0.22352941334247589, 0.22352941334247589), (0.4848484992980957, 0.20000000298023224, 0.20000000298023224), (0.48989897966384888, 0.17647059261798859, 0.17647059261798859), (0.49494948983192444, 0.15294118225574493, 0.15294118225574493), (0.5, 0.12941177189350128, 0.12941177189350128), (0.50505048036575317, 0.10980392247438431, 0.10980392247438431), (0.51010102033615112, 0.086274512112140656, 0.086274512112140656), (0.5151515007019043, 0.062745101749897003, 0.062745101749897003), (0.52020204067230225, 0.039215687662363052, 0.039215687662363052), (0.52525252103805542, 0.015686275437474251, 0.015686275437474251), (0.53030300140380859, 0.0, 0.0), (0.53535354137420654, 0.0, 0.0), (0.54040402173995972, 0.0, 0.0), (0.54545456171035767, 0.0, 0.0), (0.55050504207611084, 0.0, 0.0), (0.55555558204650879, 0.0, 0.0), (0.56060606241226196, 0.0, 0.0), (0.56565654277801514, 0.0, 0.0), (0.57070708274841309, 0.0, 0.0), (0.57575756311416626, 0.0, 0.0), (0.58080810308456421, 0.0, 0.0), (0.58585858345031738, 0.0039215688593685627, 0.0039215688593685627), (0.59090906381607056, 0.0078431377187371254, 0.0078431377187371254), (0.59595960378646851, 0.011764706112444401, 0.011764706112444401), (0.60101008415222168, 0.019607843831181526, 0.019607843831181526), (0.60606062412261963, 0.023529412224888802, 0.023529412224888802), (0.6111111044883728, 0.031372550874948502, 0.031372550874948502), (0.61616164445877075, 0.035294119268655777, 0.035294119268655777), (0.62121212482452393, 0.043137256056070328, 0.043137256056070328), (0.6262626051902771, 0.047058824449777603, 0.047058824449777603), (0.63131314516067505, 0.054901961237192154, 0.054901961237192154), (0.63636362552642822, 0.054901961237192154, 0.054901961237192154), (0.64141416549682617, 0.050980392843484879, 0.050980392843484879), (0.64646464586257935, 0.043137256056070328, 0.043137256056070328), (0.65151512622833252, 0.039215687662363052, 0.039215687662363052), (0.65656566619873047, 0.031372550874948502, 0.031372550874948502), (0.66161614656448364, 0.027450980618596077, 0.027450980618596077), (0.66666668653488159, 0.019607843831181526, 0.019607843831181526), (0.67171716690063477, 0.015686275437474251, 0.015686275437474251), (0.67676764726638794, 0.011764706112444401, 0.011764706112444401), (0.68181818723678589, 0.0039215688593685627, 0.0039215688593685627), (0.68686866760253906, 0.0, 0.0), (0.69191920757293701, 0.0, 0.0), (0.69696968793869019, 0.0, 0.0), (0.70202022790908813, 0.0, 0.0), (0.70707070827484131, 0.0, 0.0), (0.71212118864059448, 0.0, 0.0), (0.71717172861099243, 0.0, 0.0), (0.72222220897674561, 0.0, 0.0), (0.72727274894714355, 0.0, 0.0), (0.73232322931289673, 0.0, 0.0), (0.7373737096786499, 0.0, 0.0), (0.74242424964904785, 0.031372550874948502, 0.031372550874948502), (0.74747473001480103, 0.12941177189350128, 0.12941177189350128), (0.75252526998519897, 0.22352941334247589, 0.22352941334247589), (0.75757575035095215, 0.32156863808631897, 0.32156863808631897), (0.7626262903213501, 0.41568627953529358, 0.41568627953529358), (0.76767677068710327, 0.50980395078659058, 0.50980395078659058), (0.77272725105285645, 0.60784316062927246, 0.60784316062927246), (0.77777779102325439, 0.70196080207824707, 0.70196080207824707), (0.78282827138900757, 0.79607844352722168, 0.79607844352722168), (0.78787881135940552, 0.89411765336990356, 0.89411765336990356), (0.79292929172515869, 0.98823529481887817, 0.98823529481887817), (0.79797977209091187, 1.0, 1.0), (0.80303031206130981, 1.0, 1.0), (0.80808079242706299, 1.0, 1.0), (0.81313133239746094, 1.0, 1.0), (0.81818181276321411, 1.0, 1.0), (0.82323235273361206, 1.0, 1.0), (0.82828283309936523, 1.0, 1.0), (0.83333331346511841, 1.0, 1.0), (0.83838385343551636, 1.0, 1.0), (0.84343433380126953, 1.0, 1.0), (0.84848487377166748, 0.99607843160629272, 0.99607843160629272), (0.85353535413742065, 0.98823529481887817, 0.98823529481887817), (0.85858583450317383, 0.9843137264251709, 0.9843137264251709), (0.86363637447357178, 0.97647058963775635, 0.97647058963775635), (0.86868685483932495, 0.9686274528503418, 0.9686274528503418), (0.8737373948097229, 0.96470588445663452, 0.96470588445663452), (0.87878787517547607, 0.95686274766921997, 0.95686274766921997), (0.88383835554122925, 0.94901961088180542, 0.94901961088180542), (0.8888888955116272, 0.94509804248809814, 0.94509804248809814), (0.89393937587738037, 0.93725490570068359, 0.93725490570068359), (0.89898991584777832, 0.93333333730697632, 0.93333333730697632), (0.90404039621353149, 0.93333333730697632, 0.93333333730697632), (0.90909093618392944, 0.93725490570068359, 0.93725490570068359), (0.91414141654968262, 0.93725490570068359, 0.93725490570068359), (0.91919189691543579, 0.94117647409439087, 0.94117647409439087), (0.92424243688583374, 0.94509804248809814, 0.94509804248809814), (0.92929291725158691, 0.94509804248809814, 0.94509804248809814), (0.93434345722198486, 0.94901961088180542, 0.94901961088180542), (0.93939393758773804, 0.9529411792755127, 0.9529411792755127), (0.94444441795349121, 0.9529411792755127, 0.9529411792755127), (0.94949495792388916, 0.95686274766921997, 0.95686274766921997), (0.95454543828964233, 0.96078431606292725, 0.96078431606292725), (0.95959597826004028, 0.96470588445663452, 0.96470588445663452), (0.96464645862579346, 0.9686274528503418, 0.9686274528503418), (0.96969699859619141, 0.97254902124404907, 0.97254902124404907), (0.97474747896194458, 0.97647058963775635, 0.97647058963775635), (0.97979795932769775, 0.98039215803146362, 0.98039215803146362), (0.9848484992980957, 0.9843137264251709, 0.9843137264251709), (0.98989897966384888, 0.98823529481887817, 0.98823529481887817), (0.99494951963424683, 0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272), ], "green": [ (0.0, 0.0, 0.0), (0.0050505050458014011, 0.035294119268655777, 0.035294119268655777), (0.010101010091602802, 0.074509806931018829, 0.074509806931018829), (0.015151515603065491, 0.10980392247438431, 0.10980392247438431), (0.020202020183205605, 0.14901961386203766, 0.14901961386203766), (0.025252524763345718, 0.18431372940540314, 0.18431372940540314), (0.030303031206130981, 0.22352941334247589, 0.22352941334247589), (0.035353533923625946, 0.25882354378700256, 0.25882354378700256), (0.040404040366411209, 0.29803922772407532, 0.29803922772407532), (0.045454546809196472, 0.3333333432674408, 0.3333333432674408), (0.050505049526691437, 0.37254902720451355, 0.37254902720451355), (0.0555555559694767, 0.36862745881080627, 0.36862745881080627), (0.060606062412261963, 0.3333333432674408, 0.3333333432674408), (0.065656565129756927, 0.29411765933036804, 0.29411765933036804), (0.070707067847251892, 0.25882354378700256, 0.25882354378700256), (0.075757578015327454, 0.21960784494876862, 0.21960784494876862), (0.080808080732822418, 0.18431372940540314, 0.18431372940540314), (0.085858583450317383, 0.14509804546833038, 0.14509804546833038), (0.090909093618392944, 0.10980392247438431, 0.10980392247438431), (0.095959596335887909, 0.070588238537311554, 0.070588238537311554), (0.10101009905338287, 0.035294119268655777, 0.035294119268655777), (0.10606060922145844, 0.0, 0.0), (0.1111111119389534, 0.074509806931018829, 0.074509806931018829), (0.11616161465644836, 0.14509804546833038, 0.14509804546833038), (0.12121212482452393, 0.21568627655506134, 0.21568627655506134), (0.12626262009143829, 0.28627452254295349, 0.28627452254295349), (0.13131313025951385, 0.36078432202339172, 0.36078432202339172), (0.13636364042758942, 0.43137255311012268, 0.43137255311012268), (0.14141413569450378, 0.50196081399917603, 0.50196081399917603), (0.14646464586257935, 0.57254904508590698, 0.57254904508590698), (0.15151515603065491, 0.64705884456634521, 0.64705884456634521), (0.15656565129756927, 0.71764707565307617, 0.71764707565307617), (0.16161616146564484, 0.7607843279838562, 0.7607843279838562), (0.1666666716337204, 0.78431373834609985, 0.78431373834609985), (0.17171716690063477, 0.80784314870834351, 0.80784314870834351), (0.17676767706871033, 0.83137255907058716, 0.83137255907058716), (0.18181818723678589, 0.85490196943283081, 0.85490196943283081), (0.18686868250370026, 0.88235294818878174, 0.88235294818878174), (0.19191919267177582, 0.90588235855102539, 0.90588235855102539), (0.19696970283985138, 0.92941176891326904, 0.92941176891326904), (0.20202019810676575, 0.9529411792755127, 0.9529411792755127), (0.20707070827484131, 0.97647058963775635, 0.97647058963775635), (0.21212121844291687, 0.99607843160629272, 0.99607843160629272), (0.21717171370983124, 0.99607843160629272, 0.99607843160629272), (0.2222222238779068, 0.99215686321258545, 0.99215686321258545), (0.22727273404598236, 0.99215686321258545, 0.99215686321258545), (0.23232322931289673, 0.99215686321258545, 0.99215686321258545), (0.23737373948097229, 0.98823529481887817, 0.98823529481887817), (0.24242424964904785, 0.98823529481887817, 0.98823529481887817), (0.24747474491596222, 0.9843137264251709, 0.9843137264251709), (0.25252524018287659, 0.9843137264251709, 0.9843137264251709), (0.25757575035095215, 0.98039215803146362, 0.98039215803146362), (0.26262626051902771, 0.98039215803146362, 0.98039215803146362), (0.26767677068710327, 0.98039215803146362, 0.98039215803146362), (0.27272728085517883, 0.98039215803146362, 0.98039215803146362), (0.27777779102325439, 0.9843137264251709, 0.9843137264251709), (0.28282827138900757, 0.9843137264251709, 0.9843137264251709), (0.28787878155708313, 0.98823529481887817, 0.98823529481887817), (0.29292929172515869, 0.98823529481887817, 0.98823529481887817), (0.29797980189323425, 0.99215686321258545, 0.99215686321258545), (0.30303031206130981, 0.99215686321258545, 0.99215686321258545), (0.30808082222938538, 0.99607843160629272, 0.99607843160629272), (0.31313130259513855, 0.99607843160629272, 0.99607843160629272), (0.31818181276321411, 0.99607843160629272, 0.99607843160629272), (0.32323232293128967, 0.97647058963775635, 0.97647058963775635), (0.32828283309936523, 0.95686274766921997, 0.95686274766921997), (0.3333333432674408, 0.93725490570068359, 0.93725490570068359), (0.33838382363319397, 0.92156863212585449, 0.92156863212585449), (0.34343433380126953, 0.90196079015731812, 0.90196079015731812), (0.34848484396934509, 0.88235294818878174, 0.88235294818878174), (0.35353535413742065, 0.86274510622024536, 0.86274510622024536), (0.35858586430549622, 0.84705883264541626, 0.84705883264541626), (0.36363637447357178, 0.82745099067687988, 0.82745099067687988), (0.36868685483932495, 0.80784314870834351, 0.80784314870834351), (0.37373736500740051, 0.81568628549575806, 0.81568628549575806), (0.37878787517547607, 0.83529412746429443, 0.83529412746429443), (0.38383838534355164, 0.85098040103912354, 0.85098040103912354), (0.3888888955116272, 0.87058824300765991, 0.87058824300765991), (0.39393940567970276, 0.89019608497619629, 0.89019608497619629), (0.39898988604545593, 0.90980392694473267, 0.90980392694473267), (0.40404039621353149, 0.92549020051956177, 0.92549020051956177), (0.40909090638160706, 0.94509804248809814, 0.94509804248809814), (0.41414141654968262, 0.96470588445663452, 0.96470588445663452), (0.41919192671775818, 0.9843137264251709, 0.9843137264251709), (0.42424243688583374, 1.0, 1.0), (0.42929291725158691, 1.0, 1.0), (0.43434342741966248, 1.0, 1.0), (0.43939393758773804, 1.0, 1.0), (0.4444444477558136, 1.0, 1.0), (0.44949495792388916, 1.0, 1.0), (0.45454546809196472, 1.0, 1.0), (0.4595959484577179, 1.0, 1.0), (0.46464645862579346, 1.0, 1.0), (0.46969696879386902, 1.0, 1.0), (0.47474747896194458, 1.0, 1.0), (0.47979798913002014, 1.0, 1.0), (0.4848484992980957, 1.0, 1.0), (0.48989897966384888, 1.0, 1.0), (0.49494948983192444, 1.0, 1.0), (0.5, 1.0, 1.0), (0.50505048036575317, 1.0, 1.0), (0.51010102033615112, 1.0, 1.0), (0.5151515007019043, 1.0, 1.0), (0.52020204067230225, 1.0, 1.0), (0.52525252103805542, 1.0, 1.0), (0.53030300140380859, 0.99215686321258545, 0.99215686321258545), (0.53535354137420654, 0.98039215803146362, 0.98039215803146362), (0.54040402173995972, 0.96470588445663452, 0.96470588445663452), (0.54545456171035767, 0.94901961088180542, 0.94901961088180542), (0.55050504207611084, 0.93333333730697632, 0.93333333730697632), (0.55555558204650879, 0.91764706373214722, 0.91764706373214722), (0.56060606241226196, 0.90588235855102539, 0.90588235855102539), (0.56565654277801514, 0.89019608497619629, 0.89019608497619629), (0.57070708274841309, 0.87450981140136719, 0.87450981140136719), (0.57575756311416626, 0.85882353782653809, 0.85882353782653809), (0.58080810308456421, 0.84313726425170898, 0.84313726425170898), (0.58585858345031738, 0.83137255907058716, 0.83137255907058716), (0.59090906381607056, 0.81960785388946533, 0.81960785388946533), (0.59595960378646851, 0.81176471710205078, 0.81176471710205078), (0.60101008415222168, 0.80000001192092896, 0.80000001192092896), (0.60606062412261963, 0.78823530673980713, 0.78823530673980713), (0.6111111044883728, 0.7764706015586853, 0.7764706015586853), (0.61616164445877075, 0.76470589637756348, 0.76470589637756348), (0.62121212482452393, 0.75294119119644165, 0.75294119119644165), (0.6262626051902771, 0.74117648601531982, 0.74117648601531982), (0.63131314516067505, 0.729411780834198, 0.729411780834198), (0.63636362552642822, 0.70980393886566162, 0.70980393886566162), (0.64141416549682617, 0.66666668653488159, 0.66666668653488159), (0.64646464586257935, 0.62352943420410156, 0.62352943420410156), (0.65151512622833252, 0.58039218187332153, 0.58039218187332153), (0.65656566619873047, 0.5372549295425415, 0.5372549295425415), (0.66161614656448364, 0.49411764740943909, 0.49411764740943909), (0.66666668653488159, 0.45098039507865906, 0.45098039507865906), (0.67171716690063477, 0.40392157435417175, 0.40392157435417175), (0.67676764726638794, 0.36078432202339172, 0.36078432202339172), (0.68181818723678589, 0.31764706969261169, 0.31764706969261169), (0.68686866760253906, 0.27450981736183167, 0.27450981736183167), (0.69191920757293701, 0.24705882370471954, 0.24705882370471954), (0.69696968793869019, 0.21960784494876862, 0.21960784494876862), (0.70202022790908813, 0.19607843458652496, 0.19607843458652496), (0.70707070827484131, 0.16862745583057404, 0.16862745583057404), (0.71212118864059448, 0.14509804546833038, 0.14509804546833038), (0.71717172861099243, 0.11764705926179886, 0.11764705926179886), (0.72222220897674561, 0.090196080505847931, 0.090196080505847931), (0.72727274894714355, 0.066666670143604279, 0.066666670143604279), (0.73232322931289673, 0.039215687662363052, 0.039215687662363052), (0.7373737096786499, 0.015686275437474251, 0.015686275437474251), (0.74242424964904785, 0.0, 0.0), (0.74747473001480103, 0.0, 0.0), (0.75252526998519897, 0.0, 0.0), (0.75757575035095215, 0.0, 0.0), (0.7626262903213501, 0.0, 0.0), (0.76767677068710327, 0.0, 0.0), (0.77272725105285645, 0.0, 0.0), (0.77777779102325439, 0.0, 0.0), (0.78282827138900757, 0.0, 0.0), (0.78787881135940552, 0.0, 0.0), (0.79292929172515869, 0.0, 0.0), (0.79797977209091187, 0.015686275437474251, 0.015686275437474251), (0.80303031206130981, 0.031372550874948502, 0.031372550874948502), (0.80808079242706299, 0.050980392843484879, 0.050980392843484879), (0.81313133239746094, 0.066666670143604279, 0.066666670143604279), (0.81818181276321411, 0.086274512112140656, 0.086274512112140656), (0.82323235273361206, 0.10588235408067703, 0.10588235408067703), (0.82828283309936523, 0.12156862765550613, 0.12156862765550613), (0.83333331346511841, 0.14117647707462311, 0.14117647707462311), (0.83838385343551636, 0.15686275064945221, 0.15686275064945221), (0.84343433380126953, 0.17647059261798859, 0.17647059261798859), (0.84848487377166748, 0.20000000298023224, 0.20000000298023224), (0.85353535413742065, 0.23137255012989044, 0.23137255012989044), (0.85858583450317383, 0.25882354378700256, 0.25882354378700256), (0.86363637447357178, 0.29019609093666077, 0.29019609093666077), (0.86868685483932495, 0.32156863808631897, 0.32156863808631897), (0.8737373948097229, 0.35294118523597717, 0.35294118523597717), (0.87878787517547607, 0.38431373238563538, 0.38431373238563538), (0.88383835554122925, 0.41568627953529358, 0.41568627953529358), (0.8888888955116272, 0.44313725829124451, 0.44313725829124451), (0.89393937587738037, 0.47450980544090271, 0.47450980544090271), (0.89898991584777832, 0.5058823823928833, 0.5058823823928833), (0.90404039621353149, 0.52941179275512695, 0.52941179275512695), (0.90909093618392944, 0.55294120311737061, 0.55294120311737061), (0.91414141654968262, 0.57254904508590698, 0.57254904508590698), (0.91919189691543579, 0.59607845544815063, 0.59607845544815063), (0.92424243688583374, 0.61960786581039429, 0.61960786581039429), (0.92929291725158691, 0.64313727617263794, 0.64313727617263794), (0.93434345722198486, 0.66274511814117432, 0.66274511814117432), (0.93939393758773804, 0.68627452850341797, 0.68627452850341797), (0.94444441795349121, 0.70980393886566162, 0.70980393886566162), (0.94949495792388916, 0.729411780834198, 0.729411780834198), (0.95454543828964233, 0.75294119119644165, 0.75294119119644165), (0.95959597826004028, 0.78039216995239258, 0.78039216995239258), (0.96464645862579346, 0.80392158031463623, 0.80392158031463623), (0.96969699859619141, 0.82745099067687988, 0.82745099067687988), (0.97474747896194458, 0.85098040103912354, 0.85098040103912354), (0.97979795932769775, 0.87450981140136719, 0.87450981140136719), (0.9848484992980957, 0.90196079015731812, 0.90196079015731812), (0.98989897966384888, 0.92549020051956177, 0.92549020051956177), (0.99494951963424683, 0.94901961088180542, 0.94901961088180542), (1.0, 0.97254902124404907, 0.97254902124404907), ], "red": [ (0.0, 0.0, 0.0), (0.0050505050458014011, 0.0, 0.0), (0.010101010091602802, 0.0, 0.0), (0.015151515603065491, 0.0, 0.0), (0.020202020183205605, 0.0, 0.0), (0.025252524763345718, 0.0, 0.0), (0.030303031206130981, 0.0, 0.0), (0.035353533923625946, 0.0, 0.0), (0.040404040366411209, 0.0, 0.0), (0.045454546809196472, 0.0, 0.0), (0.050505049526691437, 0.0, 0.0), (0.0555555559694767, 0.0, 0.0), (0.060606062412261963, 0.0, 0.0), (0.065656565129756927, 0.0, 0.0), (0.070707067847251892, 0.0, 0.0), (0.075757578015327454, 0.0, 0.0), (0.080808080732822418, 0.0, 0.0), (0.085858583450317383, 0.0, 0.0), (0.090909093618392944, 0.0, 0.0), (0.095959596335887909, 0.0, 0.0), (0.10101009905338287, 0.0, 0.0), (0.10606060922145844, 0.0, 0.0), (0.1111111119389534, 0.0, 0.0), (0.11616161465644836, 0.0, 0.0), (0.12121212482452393, 0.0, 0.0), (0.12626262009143829, 0.0, 0.0), (0.13131313025951385, 0.0, 0.0), (0.13636364042758942, 0.0, 0.0), (0.14141413569450378, 0.0, 0.0), (0.14646464586257935, 0.0, 0.0), (0.15151515603065491, 0.0, 0.0), (0.15656565129756927, 0.0, 0.0), (0.16161616146564484, 0.0, 0.0), (0.1666666716337204, 0.0, 0.0), (0.17171716690063477, 0.0, 0.0), (0.17676767706871033, 0.0, 0.0), (0.18181818723678589, 0.0, 0.0), (0.18686868250370026, 0.0, 0.0), (0.19191919267177582, 0.0, 0.0), (0.19696970283985138, 0.0, 0.0), (0.20202019810676575, 0.0, 0.0), (0.20707070827484131, 0.0, 0.0), (0.21212121844291687, 0.0, 0.0), (0.21717171370983124, 0.0, 0.0), (0.2222222238779068, 0.0, 0.0), (0.22727273404598236, 0.0, 0.0), (0.23232322931289673, 0.0, 0.0), (0.23737373948097229, 0.0, 0.0), (0.24242424964904785, 0.0, 0.0), (0.24747474491596222, 0.0, 0.0), (0.25252524018287659, 0.0, 0.0), (0.25757575035095215, 0.0, 0.0), (0.26262626051902771, 0.0, 0.0), (0.26767677068710327, 0.0, 0.0), (0.27272728085517883, 0.0, 0.0), (0.27777779102325439, 0.0, 0.0), (0.28282827138900757, 0.0, 0.0), (0.28787878155708313, 0.0, 0.0), (0.29292929172515869, 0.0, 0.0), (0.29797980189323425, 0.0, 0.0), (0.30303031206130981, 0.0, 0.0), (0.30808082222938538, 0.0, 0.0), (0.31313130259513855, 0.0, 0.0), (0.31818181276321411, 0.0039215688593685627, 0.0039215688593685627), (0.32323232293128967, 0.043137256056070328, 0.043137256056070328), (0.32828283309936523, 0.08235294371843338, 0.08235294371843338), (0.3333333432674408, 0.11764705926179886, 0.11764705926179886), (0.33838382363319397, 0.15686275064945221, 0.15686275064945221), (0.34343433380126953, 0.19607843458652496, 0.19607843458652496), (0.34848484396934509, 0.23137255012989044, 0.23137255012989044), (0.35353535413742065, 0.27058824896812439, 0.27058824896812439), (0.35858586430549622, 0.30980393290519714, 0.30980393290519714), (0.36363637447357178, 0.3490196168422699, 0.3490196168422699), (0.36868685483932495, 0.38431373238563538, 0.38431373238563538), (0.37373736500740051, 0.40392157435417175, 0.40392157435417175), (0.37878787517547607, 0.41568627953529358, 0.41568627953529358), (0.38383838534355164, 0.42352941632270813, 0.42352941632270813), (0.3888888955116272, 0.43137255311012268, 0.43137255311012268), (0.39393940567970276, 0.44313725829124451, 0.44313725829124451), (0.39898988604545593, 0.45098039507865906, 0.45098039507865906), (0.40404039621353149, 0.45882353186607361, 0.45882353186607361), (0.40909090638160706, 0.47058823704719543, 0.47058823704719543), (0.41414141654968262, 0.47843137383460999, 0.47843137383460999), (0.41919192671775818, 0.49019607901573181, 0.49019607901573181), (0.42424243688583374, 0.50196081399917603, 0.50196081399917603), (0.42929291725158691, 0.52549022436141968, 0.52549022436141968), (0.43434342741966248, 0.54901963472366333, 0.54901963472366333), (0.43939393758773804, 0.57254904508590698, 0.57254904508590698), (0.4444444477558136, 0.60000002384185791, 0.60000002384185791), (0.44949495792388916, 0.62352943420410156, 0.62352943420410156), (0.45454546809196472, 0.64705884456634521, 0.64705884456634521), (0.4595959484577179, 0.67058825492858887, 0.67058825492858887), (0.46464645862579346, 0.69411766529083252, 0.69411766529083252), (0.46969696879386902, 0.72156864404678345, 0.72156864404678345), (0.47474747896194458, 0.7450980544090271, 0.7450980544090271), (0.47979798913002014, 0.76862746477127075, 0.76862746477127075), (0.4848484992980957, 0.7921568751335144, 0.7921568751335144), (0.48989897966384888, 0.81568628549575806, 0.81568628549575806), (0.49494948983192444, 0.83921569585800171, 0.83921569585800171), (0.5, 0.86274510622024536, 0.86274510622024536), (0.50505048036575317, 0.88627451658248901, 0.88627451658248901), (0.51010102033615112, 0.90980392694473267, 0.90980392694473267), (0.5151515007019043, 0.93333333730697632, 0.93333333730697632), (0.52020204067230225, 0.95686274766921997, 0.95686274766921997), (0.52525252103805542, 0.98039215803146362, 0.98039215803146362), (0.53030300140380859, 1.0, 1.0), (0.53535354137420654, 1.0, 1.0), (0.54040402173995972, 1.0, 1.0), (0.54545456171035767, 1.0, 1.0), (0.55050504207611084, 1.0, 1.0), (0.55555558204650879, 1.0, 1.0), (0.56060606241226196, 1.0, 1.0), (0.56565654277801514, 1.0, 1.0), (0.57070708274841309, 1.0, 1.0), (0.57575756311416626, 1.0, 1.0), (0.58080810308456421, 1.0, 1.0), (0.58585858345031738, 1.0, 1.0), (0.59090906381607056, 1.0, 1.0), (0.59595960378646851, 1.0, 1.0), (0.60101008415222168, 1.0, 1.0), (0.60606062412261963, 1.0, 1.0), (0.6111111044883728, 1.0, 1.0), (0.61616164445877075, 1.0, 1.0), (0.62121212482452393, 1.0, 1.0), (0.6262626051902771, 1.0, 1.0), (0.63131314516067505, 1.0, 1.0), (0.63636362552642822, 1.0, 1.0), (0.64141416549682617, 1.0, 1.0), (0.64646464586257935, 1.0, 1.0), (0.65151512622833252, 1.0, 1.0), (0.65656566619873047, 1.0, 1.0), (0.66161614656448364, 1.0, 1.0), (0.66666668653488159, 1.0, 1.0), (0.67171716690063477, 1.0, 1.0), (0.67676764726638794, 1.0, 1.0), (0.68181818723678589, 1.0, 1.0), (0.68686866760253906, 1.0, 1.0), (0.69191920757293701, 1.0, 1.0), (0.69696968793869019, 1.0, 1.0), (0.70202022790908813, 1.0, 1.0), (0.70707070827484131, 1.0, 1.0), (0.71212118864059448, 1.0, 1.0), (0.71717172861099243, 1.0, 1.0), (0.72222220897674561, 1.0, 1.0), (0.72727274894714355, 1.0, 1.0), (0.73232322931289673, 1.0, 1.0), (0.7373737096786499, 1.0, 1.0), (0.74242424964904785, 1.0, 1.0), (0.74747473001480103, 1.0, 1.0), (0.75252526998519897, 1.0, 1.0), (0.75757575035095215, 1.0, 1.0), (0.7626262903213501, 1.0, 1.0), (0.76767677068710327, 1.0, 1.0), (0.77272725105285645, 1.0, 1.0), (0.77777779102325439, 1.0, 1.0), (0.78282827138900757, 1.0, 1.0), (0.78787881135940552, 1.0, 1.0), (0.79292929172515869, 1.0, 1.0), (0.79797977209091187, 0.96470588445663452, 0.96470588445663452), (0.80303031206130981, 0.92549020051956177, 0.92549020051956177), (0.80808079242706299, 0.89019608497619629, 0.89019608497619629), (0.81313133239746094, 0.85098040103912354, 0.85098040103912354), (0.81818181276321411, 0.81568628549575806, 0.81568628549575806), (0.82323235273361206, 0.7764706015586853, 0.7764706015586853), (0.82828283309936523, 0.74117648601531982, 0.74117648601531982), (0.83333331346511841, 0.70196080207824707, 0.70196080207824707), (0.83838385343551636, 0.66666668653488159, 0.66666668653488159), (0.84343433380126953, 0.62745100259780884, 0.62745100259780884), (0.84848487377166748, 0.61960786581039429, 0.61960786581039429), (0.85353535413742065, 0.65098041296005249, 0.65098041296005249), (0.85858583450317383, 0.68235296010971069, 0.68235296010971069), (0.86363637447357178, 0.7137255072593689, 0.7137255072593689), (0.86868685483932495, 0.7450980544090271, 0.7450980544090271), (0.8737373948097229, 0.77254903316497803, 0.77254903316497803), (0.87878787517547607, 0.80392158031463623, 0.80392158031463623), (0.88383835554122925, 0.83529412746429443, 0.83529412746429443), (0.8888888955116272, 0.86666667461395264, 0.86666667461395264), (0.89393937587738037, 0.89803922176361084, 0.89803922176361084), (0.89898991584777832, 0.92941176891326904, 0.92941176891326904), (0.90404039621353149, 0.93333333730697632, 0.93333333730697632), (0.90909093618392944, 0.93725490570068359, 0.93725490570068359), (0.91414141654968262, 0.93725490570068359, 0.93725490570068359), (0.91919189691543579, 0.94117647409439087, 0.94117647409439087), (0.92424243688583374, 0.94509804248809814, 0.94509804248809814), (0.92929291725158691, 0.94509804248809814, 0.94509804248809814), (0.93434345722198486, 0.94901961088180542, 0.94901961088180542), (0.93939393758773804, 0.9529411792755127, 0.9529411792755127), (0.94444441795349121, 0.9529411792755127, 0.9529411792755127), (0.94949495792388916, 0.95686274766921997, 0.95686274766921997), (0.95454543828964233, 0.96078431606292725, 0.96078431606292725), (0.95959597826004028, 0.96470588445663452, 0.96470588445663452), (0.96464645862579346, 0.9686274528503418, 0.9686274528503418), (0.96969699859619141, 0.97254902124404907, 0.97254902124404907), (0.97474747896194458, 0.97647058963775635, 0.97647058963775635), (0.97979795932769775, 0.98039215803146362, 0.98039215803146362), (0.9848484992980957, 0.9843137264251709, 0.9843137264251709), (0.98989897966384888, 0.98823529481887817, 0.98823529481887817), (0.99494951963424683, 0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272), ], } _gist_rainbow_data = { "blue": [ (0.0, 0.16470588743686676, 0.16470588743686676), (0.0042016808874905109, 0.14117647707462311, 0.14117647707462311), (0.0084033617749810219, 0.12156862765550613, 0.12156862765550613), (0.012605042196810246, 0.10196078568696976, 0.10196078568696976), (0.016806723549962044, 0.078431375324726105, 0.078431375324726105), (0.021008403971791267, 0.058823529630899429, 0.058823529630899429), (0.025210084393620491, 0.039215687662363052, 0.039215687662363052), (0.029411764815449715, 0.015686275437474251, 0.015686275437474251), (0.033613447099924088, 0.0, 0.0), (0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), (0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), (0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), (0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), (0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), (0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), (0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), (0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), (0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), (0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), (0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), (0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), (0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), (0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), (0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), (0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), (0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), (0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), (0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), (0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), (0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), (0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), (0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), (0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), (0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), (0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), (0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), (0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), (0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), (0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), (0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), (0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), (0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), (0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), (0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), (0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), (0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), (0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), (0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), (0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), (0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), (0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), (0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), (0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), (0.40756303071975708, 0.0039215688593685627, 0.0039215688593685627), (0.4117647111415863, 0.047058824449777603, 0.047058824449777603), (0.41596639156341553, 0.066666670143604279, 0.066666670143604279), (0.42016807198524475, 0.090196080505847931, 0.090196080505847931), (0.42436975240707397, 0.10980392247438431, 0.10980392247438431), (0.4285714328289032, 0.12941177189350128, 0.12941177189350128), (0.43277311325073242, 0.15294118225574493, 0.15294118225574493), (0.43697479367256165, 0.17254902422428131, 0.17254902422428131), (0.44117647409439087, 0.19215686619281769, 0.19215686619281769), (0.44537815451622009, 0.21568627655506134, 0.21568627655506134), (0.44957983493804932, 0.23529411852359772, 0.23529411852359772), (0.45378151535987854, 0.25882354378700256, 0.25882354378700256), (0.45798319578170776, 0.27843138575553894, 0.27843138575553894), (0.46218487620353699, 0.29803922772407532, 0.29803922772407532), (0.46638655662536621, 0.32156863808631897, 0.32156863808631897), (0.47058823704719543, 0.34117648005485535, 0.34117648005485535), (0.47478991746902466, 0.38431373238563538, 0.38431373238563538), (0.47899159789085388, 0.40392157435417175, 0.40392157435417175), (0.48319327831268311, 0.42745098471641541, 0.42745098471641541), (0.48739495873451233, 0.44705882668495178, 0.44705882668495178), (0.49159663915634155, 0.46666666865348816, 0.46666666865348816), (0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, 0.50980395078659058, 0.50980395078659058), (0.50420171022415161, 0.52941179275512695, 0.52941179275512695), (0.50840336084365845, 0.55294120311737061, 0.55294120311737061), (0.51260507106781006, 0.57254904508590698, 0.57254904508590698), (0.51680672168731689, 0.59607845544815063, 0.59607845544815063), (0.52100843191146851, 0.61568629741668701, 0.61568629741668701), (0.52521008253097534, 0.63529413938522339, 0.63529413938522339), (0.52941179275512695, 0.65882354974746704, 0.65882354974746704), (0.53361344337463379, 0.67843139171600342, 0.67843139171600342), (0.5378151535987854, 0.72156864404678345, 0.72156864404678345), (0.54201680421829224, 0.74117648601531982, 0.74117648601531982), (0.54621851444244385, 0.76470589637756348, 0.76470589637756348), (0.55042016506195068, 0.78431373834609985, 0.78431373834609985), (0.55462187528610229, 0.80392158031463623, 0.80392158031463623), (0.55882352590560913, 0.82745099067687988, 0.82745099067687988), (0.56302523612976074, 0.84705883264541626, 0.84705883264541626), (0.56722688674926758, 0.87058824300765991, 0.87058824300765991), (0.57142859697341919, 0.89019608497619629, 0.89019608497619629), (0.57563024759292603, 0.90980392694473267, 0.90980392694473267), (0.57983195781707764, 0.93333333730697632, 0.93333333730697632), (0.58403360843658447, 0.9529411792755127, 0.9529411792755127), (0.58823531866073608, 0.97254902124404907, 0.97254902124404907), (0.59243696928024292, 0.99607843160629272, 0.99607843160629272), (0.59663867950439453, 1.0, 1.0), (0.60084033012390137, 1.0, 1.0), (0.60504204034805298, 1.0, 1.0), (0.60924369096755981, 1.0, 1.0), (0.61344540119171143, 1.0, 1.0), (0.61764705181121826, 1.0, 1.0), (0.62184876203536987, 1.0, 1.0), (0.62605041265487671, 1.0, 1.0), (0.63025212287902832, 1.0, 1.0), (0.63445377349853516, 1.0, 1.0), (0.63865548372268677, 1.0, 1.0), (0.6428571343421936, 1.0, 1.0), (0.64705884456634521, 1.0, 1.0), (0.65126049518585205, 1.0, 1.0), (0.65546220541000366, 1.0, 1.0), (0.6596638560295105, 1.0, 1.0), (0.66386556625366211, 1.0, 1.0), (0.66806721687316895, 1.0, 1.0), (0.67226892709732056, 1.0, 1.0), (0.67647057771682739, 1.0, 1.0), (0.680672287940979, 1.0, 1.0), (0.68487393856048584, 1.0, 1.0), (0.68907564878463745, 1.0, 1.0), (0.69327729940414429, 1.0, 1.0), (0.6974790096282959, 1.0, 1.0), (0.70168066024780273, 1.0, 1.0), (0.70588237047195435, 1.0, 1.0), (0.71008402109146118, 1.0, 1.0), (0.71428573131561279, 1.0, 1.0), (0.71848738193511963, 1.0, 1.0), (0.72268909215927124, 1.0, 1.0), (0.72689074277877808, 1.0, 1.0), (0.73109245300292969, 1.0, 1.0), (0.73529410362243652, 1.0, 1.0), (0.73949581384658813, 1.0, 1.0), (0.74369746446609497, 1.0, 1.0), (0.74789917469024658, 1.0, 1.0), (0.75210082530975342, 1.0, 1.0), (0.75630253553390503, 1.0, 1.0), (0.76050418615341187, 1.0, 1.0), (0.76470589637756348, 1.0, 1.0), (0.76890754699707031, 1.0, 1.0), (0.77310925722122192, 1.0, 1.0), (0.77731090784072876, 1.0, 1.0), (0.78151261806488037, 1.0, 1.0), (0.78571426868438721, 1.0, 1.0), (0.78991597890853882, 1.0, 1.0), (0.79411762952804565, 1.0, 1.0), (0.79831933975219727, 1.0, 1.0), (0.8025209903717041, 1.0, 1.0), (0.80672270059585571, 1.0, 1.0), (0.81092435121536255, 1.0, 1.0), (0.81512606143951416, 1.0, 1.0), (0.819327712059021, 1.0, 1.0), (0.82352942228317261, 1.0, 1.0), (0.82773107290267944, 1.0, 1.0), (0.83193278312683105, 1.0, 1.0), (0.83613443374633789, 1.0, 1.0), (0.8403361439704895, 1.0, 1.0), (0.84453779458999634, 1.0, 1.0), (0.84873950481414795, 1.0, 1.0), (0.85294115543365479, 1.0, 1.0), (0.8571428656578064, 1.0, 1.0), (0.86134451627731323, 1.0, 1.0), (0.86554622650146484, 1.0, 1.0), (0.86974787712097168, 1.0, 1.0), (0.87394958734512329, 1.0, 1.0), (0.87815123796463013, 1.0, 1.0), (0.88235294818878174, 1.0, 1.0), (0.88655459880828857, 1.0, 1.0), (0.89075630903244019, 1.0, 1.0), (0.89495795965194702, 1.0, 1.0), (0.89915966987609863, 1.0, 1.0), (0.90336132049560547, 1.0, 1.0), (0.90756303071975708, 1.0, 1.0), (0.91176468133926392, 1.0, 1.0), (0.91596639156341553, 1.0, 1.0), (0.92016804218292236, 1.0, 1.0), (0.92436975240707397, 1.0, 1.0), (0.92857140302658081, 1.0, 1.0), (0.93277311325073242, 1.0, 1.0), (0.93697476387023926, 1.0, 1.0), (0.94117647409439087, 1.0, 1.0), (0.94537812471389771, 1.0, 1.0), (0.94957983493804932, 1.0, 1.0), (0.95378148555755615, 1.0, 1.0), (0.95798319578170776, 1.0, 1.0), (0.9621848464012146, 1.0, 1.0), (0.96638655662536621, 0.99607843160629272, 0.99607843160629272), (0.97058820724487305, 0.97647058963775635, 0.97647058963775635), (0.97478991746902466, 0.9529411792755127, 0.9529411792755127), (0.97899156808853149, 0.91372549533843994, 0.91372549533843994), (0.98319327831268311, 0.89019608497619629, 0.89019608497619629), (0.98739492893218994, 0.87058824300765991, 0.87058824300765991), (0.99159663915634155, 0.85098040103912354, 0.85098040103912354), (0.99579828977584839, 0.82745099067687988, 0.82745099067687988), (1.0, 0.80784314870834351, 0.80784314870834351), ], "green": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.019607843831181526, 0.019607843831181526), (0.037815127521753311, 0.043137256056070328, 0.043137256056070328), (0.042016807943582535, 0.062745101749897003, 0.062745101749897003), (0.046218488365411758, 0.086274512112140656, 0.086274512112140656), (0.050420168787240982, 0.10588235408067703, 0.10588235408067703), (0.054621849209070206, 0.12549020349979401, 0.12549020349979401), (0.058823529630899429, 0.14901961386203766, 0.14901961386203766), (0.063025213778018951, 0.16862745583057404, 0.16862745583057404), (0.067226894199848175, 0.18823529779911041, 0.18823529779911041), (0.071428574621677399, 0.21176470816135406, 0.21176470816135406), (0.075630255043506622, 0.23137255012989044, 0.23137255012989044), (0.079831935465335846, 0.25490197539329529, 0.25490197539329529), (0.08403361588716507, 0.27450981736183167, 0.27450981736183167), (0.088235296308994293, 0.29411765933036804, 0.29411765933036804), (0.092436976730823517, 0.31764706969261169, 0.31764706969261169), (0.09663865715265274, 0.35686275362968445, 0.35686275362968445), (0.10084033757448196, 0.3803921639919281, 0.3803921639919281), (0.10504201799631119, 0.40000000596046448, 0.40000000596046448), (0.10924369841814041, 0.42352941632270813, 0.42352941632270813), (0.11344537883996964, 0.44313725829124451, 0.44313725829124451), (0.11764705926179886, 0.46274510025978088, 0.46274510025978088), (0.12184873968362808, 0.48627451062202454, 0.48627451062202454), (0.1260504275560379, 0.5058823823928833, 0.5058823823928833), (0.13025210797786713, 0.52941179275512695, 0.52941179275512695), (0.13445378839969635, 0.54901963472366333, 0.54901963472366333), (0.13865546882152557, 0.56862747669219971, 0.56862747669219971), (0.1428571492433548, 0.59215688705444336, 0.59215688705444336), (0.14705882966518402, 0.61176472902297974, 0.61176472902297974), (0.15126051008701324, 0.63137257099151611, 0.63137257099151611), (0.15546219050884247, 0.65490198135375977, 0.65490198135375977), (0.15966387093067169, 0.69803923368453979, 0.69803923368453979), (0.16386555135250092, 0.71764707565307617, 0.71764707565307617), (0.16806723177433014, 0.73725491762161255, 0.73725491762161255), (0.17226891219615936, 0.7607843279838562, 0.7607843279838562), (0.17647059261798859, 0.78039216995239258, 0.78039216995239258), (0.18067227303981781, 0.80000001192092896, 0.80000001192092896), (0.18487395346164703, 0.82352942228317261, 0.82352942228317261), (0.18907563388347626, 0.84313726425170898, 0.84313726425170898), (0.19327731430530548, 0.86666667461395264, 0.86666667461395264), (0.1974789947271347, 0.88627451658248901, 0.88627451658248901), (0.20168067514896393, 0.90588235855102539, 0.90588235855102539), (0.20588235557079315, 0.92941176891326904, 0.92941176891326904), (0.21008403599262238, 0.94901961088180542, 0.94901961088180542), (0.2142857164144516, 0.9686274528503418, 0.9686274528503418), (0.21848739683628082, 0.99215686321258545, 0.99215686321258545), (0.22268907725811005, 1.0, 1.0), (0.22689075767993927, 1.0, 1.0), (0.23109243810176849, 1.0, 1.0), (0.23529411852359772, 1.0, 1.0), (0.23949579894542694, 1.0, 1.0), (0.24369747936725616, 1.0, 1.0), (0.24789915978908539, 1.0, 1.0), (0.25210085511207581, 1.0, 1.0), (0.25630253553390503, 1.0, 1.0), (0.26050421595573425, 1.0, 1.0), (0.26470589637756348, 1.0, 1.0), (0.2689075767993927, 1.0, 1.0), (0.27310925722122192, 1.0, 1.0), (0.27731093764305115, 1.0, 1.0), (0.28151261806488037, 1.0, 1.0), (0.28571429848670959, 1.0, 1.0), (0.28991597890853882, 1.0, 1.0), (0.29411765933036804, 1.0, 1.0), (0.29831933975219727, 1.0, 1.0), (0.30252102017402649, 1.0, 1.0), (0.30672270059585571, 1.0, 1.0), (0.31092438101768494, 1.0, 1.0), (0.31512606143951416, 1.0, 1.0), (0.31932774186134338, 1.0, 1.0), (0.32352942228317261, 1.0, 1.0), (0.32773110270500183, 1.0, 1.0), (0.33193278312683105, 1.0, 1.0), (0.33613446354866028, 1.0, 1.0), (0.3403361439704895, 1.0, 1.0), (0.34453782439231873, 1.0, 1.0), (0.34873950481414795, 1.0, 1.0), (0.35294118523597717, 1.0, 1.0), (0.3571428656578064, 1.0, 1.0), (0.36134454607963562, 1.0, 1.0), (0.36554622650146484, 1.0, 1.0), (0.36974790692329407, 1.0, 1.0), (0.37394958734512329, 1.0, 1.0), (0.37815126776695251, 1.0, 1.0), (0.38235294818878174, 1.0, 1.0), (0.38655462861061096, 1.0, 1.0), (0.39075630903244019, 1.0, 1.0), (0.39495798945426941, 1.0, 1.0), (0.39915966987609863, 1.0, 1.0), (0.40336135029792786, 1.0, 1.0), (0.40756303071975708, 1.0, 1.0), (0.4117647111415863, 1.0, 1.0), (0.41596639156341553, 1.0, 1.0), (0.42016807198524475, 1.0, 1.0), (0.42436975240707397, 1.0, 1.0), (0.4285714328289032, 1.0, 1.0), (0.43277311325073242, 1.0, 1.0), (0.43697479367256165, 1.0, 1.0), (0.44117647409439087, 1.0, 1.0), (0.44537815451622009, 1.0, 1.0), (0.44957983493804932, 1.0, 1.0), (0.45378151535987854, 1.0, 1.0), (0.45798319578170776, 1.0, 1.0), (0.46218487620353699, 1.0, 1.0), (0.46638655662536621, 1.0, 1.0), (0.47058823704719543, 1.0, 1.0), (0.47478991746902466, 1.0, 1.0), (0.47899159789085388, 1.0, 1.0), (0.48319327831268311, 1.0, 1.0), (0.48739495873451233, 1.0, 1.0), (0.49159663915634155, 1.0, 1.0), (0.49579831957817078, 1.0, 1.0), (0.5, 1.0, 1.0), (0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 1.0, 1.0), (0.51260507106781006, 1.0, 1.0), (0.51680672168731689, 1.0, 1.0), (0.52100843191146851, 1.0, 1.0), (0.52521008253097534, 1.0, 1.0), (0.52941179275512695, 1.0, 1.0), (0.53361344337463379, 1.0, 1.0), (0.5378151535987854, 1.0, 1.0), (0.54201680421829224, 1.0, 1.0), (0.54621851444244385, 1.0, 1.0), (0.55042016506195068, 1.0, 1.0), (0.55462187528610229, 1.0, 1.0), (0.55882352590560913, 1.0, 1.0), (0.56302523612976074, 1.0, 1.0), (0.56722688674926758, 1.0, 1.0), (0.57142859697341919, 1.0, 1.0), (0.57563024759292603, 1.0, 1.0), (0.57983195781707764, 1.0, 1.0), (0.58403360843658447, 1.0, 1.0), (0.58823531866073608, 1.0, 1.0), (0.59243696928024292, 1.0, 1.0), (0.59663867950439453, 0.98039215803146362, 0.98039215803146362), (0.60084033012390137, 0.93725490570068359, 0.93725490570068359), (0.60504204034805298, 0.91764706373214722, 0.91764706373214722), (0.60924369096755981, 0.89411765336990356, 0.89411765336990356), (0.61344540119171143, 0.87450981140136719, 0.87450981140136719), (0.61764705181121826, 0.85490196943283081, 0.85490196943283081), (0.62184876203536987, 0.83137255907058716, 0.83137255907058716), (0.62605041265487671, 0.81176471710205078, 0.81176471710205078), (0.63025212287902832, 0.78823530673980713, 0.78823530673980713), (0.63445377349853516, 0.76862746477127075, 0.76862746477127075), (0.63865548372268677, 0.74901962280273438, 0.74901962280273438), (0.6428571343421936, 0.72549021244049072, 0.72549021244049072), (0.64705884456634521, 0.70588237047195435, 0.70588237047195435), (0.65126049518585205, 0.68235296010971069, 0.68235296010971069), (0.65546220541000366, 0.66274511814117432, 0.66274511814117432), (0.6596638560295105, 0.64313727617263794, 0.64313727617263794), (0.66386556625366211, 0.60000002384185791, 0.60000002384185791), (0.66806721687316895, 0.58039218187332153, 0.58039218187332153), (0.67226892709732056, 0.55686277151107788, 0.55686277151107788), (0.67647057771682739, 0.5372549295425415, 0.5372549295425415), (0.680672287940979, 0.51372551918029785, 0.51372551918029785), (0.68487393856048584, 0.49411764740943909, 0.49411764740943909), (0.68907564878463745, 0.47450980544090271, 0.47450980544090271), (0.69327729940414429, 0.45098039507865906, 0.45098039507865906), (0.6974790096282959, 0.43137255311012268, 0.43137255311012268), (0.70168066024780273, 0.4117647111415863, 0.4117647111415863), (0.70588237047195435, 0.38823530077934265, 0.38823530077934265), (0.71008402109146118, 0.36862745881080627, 0.36862745881080627), (0.71428573131561279, 0.34509804844856262, 0.34509804844856262), (0.71848738193511963, 0.32549020648002625, 0.32549020648002625), (0.72268909215927124, 0.30588236451148987, 0.30588236451148987), (0.72689074277877808, 0.26274511218070984, 0.26274511218070984), (0.73109245300292969, 0.24313725531101227, 0.24313725531101227), (0.73529410362243652, 0.21960784494876862, 0.21960784494876862), (0.73949581384658813, 0.20000000298023224, 0.20000000298023224), (0.74369746446609497, 0.17647059261798859, 0.17647059261798859), (0.74789917469024658, 0.15686275064945221, 0.15686275064945221), (0.75210082530975342, 0.13725490868091583, 0.13725490868091583), (0.75630253553390503, 0.11372549086809158, 0.11372549086809158), (0.76050418615341187, 0.094117648899555206, 0.094117648899555206), (0.76470589637756348, 0.070588238537311554, 0.070588238537311554), (0.76890754699707031, 0.050980392843484879, 0.050980392843484879), (0.77310925722122192, 0.031372550874948502, 0.031372550874948502), (0.77731090784072876, 0.0078431377187371254, 0.0078431377187371254), (0.78151261806488037, 0.0, 0.0), (0.78571426868438721, 0.0, 0.0), (0.78991597890853882, 0.0, 0.0), (0.79411762952804565, 0.0, 0.0), (0.79831933975219727, 0.0, 0.0), (0.8025209903717041, 0.0, 0.0), (0.80672270059585571, 0.0, 0.0), (0.81092435121536255, 0.0, 0.0), (0.81512606143951416, 0.0, 0.0), (0.819327712059021, 0.0, 0.0), (0.82352942228317261, 0.0, 0.0), (0.82773107290267944, 0.0, 0.0), (0.83193278312683105, 0.0, 0.0), (0.83613443374633789, 0.0, 0.0), (0.8403361439704895, 0.0, 0.0), (0.84453779458999634, 0.0, 0.0), (0.84873950481414795, 0.0, 0.0), (0.85294115543365479, 0.0, 0.0), (0.8571428656578064, 0.0, 0.0), (0.86134451627731323, 0.0, 0.0), (0.86554622650146484, 0.0, 0.0), (0.86974787712097168, 0.0, 0.0), (0.87394958734512329, 0.0, 0.0), (0.87815123796463013, 0.0, 0.0), (0.88235294818878174, 0.0, 0.0), (0.88655459880828857, 0.0, 0.0), (0.89075630903244019, 0.0, 0.0), (0.89495795965194702, 0.0, 0.0), (0.89915966987609863, 0.0, 0.0), (0.90336132049560547, 0.0, 0.0), (0.90756303071975708, 0.0, 0.0), (0.91176468133926392, 0.0, 0.0), (0.91596639156341553, 0.0, 0.0), (0.92016804218292236, 0.0, 0.0), (0.92436975240707397, 0.0, 0.0), (0.92857140302658081, 0.0, 0.0), (0.93277311325073242, 0.0, 0.0), (0.93697476387023926, 0.0, 0.0), (0.94117647409439087, 0.0, 0.0), (0.94537812471389771, 0.0, 0.0), (0.94957983493804932, 0.0, 0.0), (0.95378148555755615, 0.0, 0.0), (0.95798319578170776, 0.0, 0.0), (0.9621848464012146, 0.0, 0.0), (0.96638655662536621, 0.0, 0.0), (0.97058820724487305, 0.0, 0.0), (0.97478991746902466, 0.0, 0.0), (0.97899156808853149, 0.0, 0.0), (0.98319327831268311, 0.0, 0.0), (0.98739492893218994, 0.0, 0.0), (0.99159663915634155, 0.0, 0.0), (0.99579828977584839, 0.0, 0.0), (1.0, 0.0, 0.0), ], "red": [ (0.0, 1.0, 1.0), (0.0042016808874905109, 1.0, 1.0), (0.0084033617749810219, 1.0, 1.0), (0.012605042196810246, 1.0, 1.0), (0.016806723549962044, 1.0, 1.0), (0.021008403971791267, 1.0, 1.0), (0.025210084393620491, 1.0, 1.0), (0.029411764815449715, 1.0, 1.0), (0.033613447099924088, 1.0, 1.0), (0.037815127521753311, 1.0, 1.0), (0.042016807943582535, 1.0, 1.0), (0.046218488365411758, 1.0, 1.0), (0.050420168787240982, 1.0, 1.0), (0.054621849209070206, 1.0, 1.0), (0.058823529630899429, 1.0, 1.0), (0.063025213778018951, 1.0, 1.0), (0.067226894199848175, 1.0, 1.0), (0.071428574621677399, 1.0, 1.0), (0.075630255043506622, 1.0, 1.0), (0.079831935465335846, 1.0, 1.0), (0.08403361588716507, 1.0, 1.0), (0.088235296308994293, 1.0, 1.0), (0.092436976730823517, 1.0, 1.0), (0.09663865715265274, 1.0, 1.0), (0.10084033757448196, 1.0, 1.0), (0.10504201799631119, 1.0, 1.0), (0.10924369841814041, 1.0, 1.0), (0.11344537883996964, 1.0, 1.0), (0.11764705926179886, 1.0, 1.0), (0.12184873968362808, 1.0, 1.0), (0.1260504275560379, 1.0, 1.0), (0.13025210797786713, 1.0, 1.0), (0.13445378839969635, 1.0, 1.0), (0.13865546882152557, 1.0, 1.0), (0.1428571492433548, 1.0, 1.0), (0.14705882966518402, 1.0, 1.0), (0.15126051008701324, 1.0, 1.0), (0.15546219050884247, 1.0, 1.0), (0.15966387093067169, 1.0, 1.0), (0.16386555135250092, 1.0, 1.0), (0.16806723177433014, 1.0, 1.0), (0.17226891219615936, 1.0, 1.0), (0.17647059261798859, 1.0, 1.0), (0.18067227303981781, 1.0, 1.0), (0.18487395346164703, 1.0, 1.0), (0.18907563388347626, 1.0, 1.0), (0.19327731430530548, 1.0, 1.0), (0.1974789947271347, 1.0, 1.0), (0.20168067514896393, 1.0, 1.0), (0.20588235557079315, 1.0, 1.0), (0.21008403599262238, 1.0, 1.0), (0.2142857164144516, 1.0, 1.0), (0.21848739683628082, 1.0, 1.0), (0.22268907725811005, 0.96078431606292725, 0.96078431606292725), (0.22689075767993927, 0.94117647409439087, 0.94117647409439087), (0.23109243810176849, 0.92156863212585449, 0.92156863212585449), (0.23529411852359772, 0.89803922176361084, 0.89803922176361084), (0.23949579894542694, 0.87843137979507446, 0.87843137979507446), (0.24369747936725616, 0.85882353782653809, 0.85882353782653809), (0.24789915978908539, 0.83529412746429443, 0.83529412746429443), (0.25210085511207581, 0.81568628549575806, 0.81568628549575806), (0.25630253553390503, 0.7921568751335144, 0.7921568751335144), (0.26050421595573425, 0.77254903316497803, 0.77254903316497803), (0.26470589637756348, 0.75294119119644165, 0.75294119119644165), (0.2689075767993927, 0.729411780834198, 0.729411780834198), (0.27310925722122192, 0.70980393886566162, 0.70980393886566162), (0.27731093764305115, 0.68627452850341797, 0.68627452850341797), (0.28151261806488037, 0.66666668653488159, 0.66666668653488159), (0.28571429848670959, 0.62352943420410156, 0.62352943420410156), (0.28991597890853882, 0.60392159223556519, 0.60392159223556519), (0.29411765933036804, 0.58431375026702881, 0.58431375026702881), (0.29831933975219727, 0.56078433990478516, 0.56078433990478516), (0.30252102017402649, 0.54117649793624878, 0.54117649793624878), (0.30672270059585571, 0.51764708757400513, 0.51764708757400513), (0.31092438101768494, 0.49803921580314636, 0.49803921580314636), (0.31512606143951416, 0.47843137383460999, 0.47843137383460999), (0.31932774186134338, 0.45490196347236633, 0.45490196347236633), (0.32352942228317261, 0.43529412150382996, 0.43529412150382996), (0.32773110270500183, 0.41568627953529358, 0.41568627953529358), (0.33193278312683105, 0.39215686917304993, 0.39215686917304993), (0.33613446354866028, 0.37254902720451355, 0.37254902720451355), (0.3403361439704895, 0.3490196168422699, 0.3490196168422699), (0.34453782439231873, 0.32941177487373352, 0.32941177487373352), (0.34873950481414795, 0.28627452254295349, 0.28627452254295349), (0.35294118523597717, 0.26666668057441711, 0.26666668057441711), (0.3571428656578064, 0.24705882370471954, 0.24705882370471954), (0.36134454607963562, 0.22352941334247589, 0.22352941334247589), (0.36554622650146484, 0.20392157137393951, 0.20392157137393951), (0.36974790692329407, 0.18039216101169586, 0.18039216101169586), (0.37394958734512329, 0.16078431904315948, 0.16078431904315948), (0.37815126776695251, 0.14117647707462311, 0.14117647707462311), (0.38235294818878174, 0.11764705926179886, 0.11764705926179886), (0.38655462861061096, 0.098039217293262482, 0.098039217293262482), (0.39075630903244019, 0.074509806931018829, 0.074509806931018829), (0.39495798945426941, 0.054901961237192154, 0.054901961237192154), (0.39915966987609863, 0.035294119268655777, 0.035294119268655777), (0.40336135029792786, 0.011764706112444401, 0.011764706112444401), (0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), (0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), (0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), (0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), (0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), (0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), (0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), (0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), (0.47478991746902466, 0.0, 0.0), (0.47899159789085388, 0.0, 0.0), (0.48319327831268311, 0.0, 0.0), (0.48739495873451233, 0.0, 0.0), (0.49159663915634155, 0.0, 0.0), (0.49579831957817078, 0.0, 0.0), (0.5, 0.0, 0.0), (0.50420171022415161, 0.0, 0.0), (0.50840336084365845, 0.0, 0.0), (0.51260507106781006, 0.0, 0.0), (0.51680672168731689, 0.0, 0.0), (0.52100843191146851, 0.0, 0.0), (0.52521008253097534, 0.0, 0.0), (0.52941179275512695, 0.0, 0.0), (0.53361344337463379, 0.0, 0.0), (0.5378151535987854, 0.0, 0.0), (0.54201680421829224, 0.0, 0.0), (0.54621851444244385, 0.0, 0.0), (0.55042016506195068, 0.0, 0.0), (0.55462187528610229, 0.0, 0.0), (0.55882352590560913, 0.0, 0.0), (0.56302523612976074, 0.0, 0.0), (0.56722688674926758, 0.0, 0.0), (0.57142859697341919, 0.0, 0.0), (0.57563024759292603, 0.0, 0.0), (0.57983195781707764, 0.0, 0.0), (0.58403360843658447, 0.0, 0.0), (0.58823531866073608, 0.0, 0.0), (0.59243696928024292, 0.0, 0.0), (0.59663867950439453, 0.0, 0.0), (0.60084033012390137, 0.0, 0.0), (0.60504204034805298, 0.0, 0.0), (0.60924369096755981, 0.0, 0.0), (0.61344540119171143, 0.0, 0.0), (0.61764705181121826, 0.0, 0.0), (0.62184876203536987, 0.0, 0.0), (0.62605041265487671, 0.0, 0.0), (0.63025212287902832, 0.0, 0.0), (0.63445377349853516, 0.0, 0.0), (0.63865548372268677, 0.0, 0.0), (0.6428571343421936, 0.0, 0.0), (0.64705884456634521, 0.0, 0.0), (0.65126049518585205, 0.0, 0.0), (0.65546220541000366, 0.0, 0.0), (0.6596638560295105, 0.0, 0.0), (0.66386556625366211, 0.0, 0.0), (0.66806721687316895, 0.0, 0.0), (0.67226892709732056, 0.0, 0.0), (0.67647057771682739, 0.0, 0.0), (0.680672287940979, 0.0, 0.0), (0.68487393856048584, 0.0, 0.0), (0.68907564878463745, 0.0, 0.0), (0.69327729940414429, 0.0, 0.0), (0.6974790096282959, 0.0, 0.0), (0.70168066024780273, 0.0, 0.0), (0.70588237047195435, 0.0, 0.0), (0.71008402109146118, 0.0, 0.0), (0.71428573131561279, 0.0, 0.0), (0.71848738193511963, 0.0, 0.0), (0.72268909215927124, 0.0, 0.0), (0.72689074277877808, 0.0, 0.0), (0.73109245300292969, 0.0, 0.0), (0.73529410362243652, 0.0, 0.0), (0.73949581384658813, 0.0, 0.0), (0.74369746446609497, 0.0, 0.0), (0.74789917469024658, 0.0, 0.0), (0.75210082530975342, 0.0, 0.0), (0.75630253553390503, 0.0, 0.0), (0.76050418615341187, 0.0, 0.0), (0.76470589637756348, 0.0, 0.0), (0.76890754699707031, 0.0, 0.0), (0.77310925722122192, 0.0, 0.0), (0.77731090784072876, 0.0, 0.0), (0.78151261806488037, 0.0078431377187371254, 0.0078431377187371254), (0.78571426868438721, 0.027450980618596077, 0.027450980618596077), (0.78991597890853882, 0.070588238537311554, 0.070588238537311554), (0.79411762952804565, 0.094117648899555206, 0.094117648899555206), (0.79831933975219727, 0.11372549086809158, 0.11372549086809158), (0.8025209903717041, 0.13333334028720856, 0.13333334028720856), (0.80672270059585571, 0.15686275064945221, 0.15686275064945221), (0.81092435121536255, 0.17647059261798859, 0.17647059261798859), (0.81512606143951416, 0.19607843458652496, 0.19607843458652496), (0.819327712059021, 0.21960784494876862, 0.21960784494876862), (0.82352942228317261, 0.23921568691730499, 0.23921568691730499), (0.82773107290267944, 0.26274511218070984, 0.26274511218070984), (0.83193278312683105, 0.28235295414924622, 0.28235295414924622), (0.83613443374633789, 0.30196079611778259, 0.30196079611778259), (0.8403361439704895, 0.32549020648002625, 0.32549020648002625), (0.84453779458999634, 0.34509804844856262, 0.34509804844856262), (0.84873950481414795, 0.364705890417099, 0.364705890417099), (0.85294115543365479, 0.40784314274787903, 0.40784314274787903), (0.8571428656578064, 0.43137255311012268, 0.43137255311012268), (0.86134451627731323, 0.45098039507865906, 0.45098039507865906), (0.86554622650146484, 0.47058823704719543, 0.47058823704719543), (0.86974787712097168, 0.49411764740943909, 0.49411764740943909), (0.87394958734512329, 0.51372551918029785, 0.51372551918029785), (0.87815123796463013, 0.53333336114883423, 0.53333336114883423), (0.88235294818878174, 0.55686277151107788, 0.55686277151107788), (0.88655459880828857, 0.57647061347961426, 0.57647061347961426), (0.89075630903244019, 0.60000002384185791, 0.60000002384185791), (0.89495795965194702, 0.61960786581039429, 0.61960786581039429), (0.89915966987609863, 0.63921570777893066, 0.63921570777893066), (0.90336132049560547, 0.66274511814117432, 0.66274511814117432), (0.90756303071975708, 0.68235296010971069, 0.68235296010971069), (0.91176468133926392, 0.70588237047195435, 0.70588237047195435), (0.91596639156341553, 0.7450980544090271, 0.7450980544090271), (0.92016804218292236, 0.76862746477127075, 0.76862746477127075), (0.92436975240707397, 0.78823530673980713, 0.78823530673980713), (0.92857140302658081, 0.80784314870834351, 0.80784314870834351), (0.93277311325073242, 0.83137255907058716, 0.83137255907058716), (0.93697476387023926, 0.85098040103912354, 0.85098040103912354), (0.94117647409439087, 0.87450981140136719, 0.87450981140136719), (0.94537812471389771, 0.89411765336990356, 0.89411765336990356), (0.94957983493804932, 0.91372549533843994, 0.91372549533843994), (0.95378148555755615, 0.93725490570068359, 0.93725490570068359), (0.95798319578170776, 0.95686274766921997, 0.95686274766921997), (0.9621848464012146, 0.97647058963775635, 0.97647058963775635), (0.96638655662536621, 1.0, 1.0), (0.97058820724487305, 1.0, 1.0), (0.97478991746902466, 1.0, 1.0), (0.97899156808853149, 1.0, 1.0), (0.98319327831268311, 1.0, 1.0), (0.98739492893218994, 1.0, 1.0), (0.99159663915634155, 1.0, 1.0), (0.99579828977584839, 1.0, 1.0), (1.0, 1.0, 1.0), ], } _gist_stern_data = { "blue": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.011764706112444401, 0.011764706112444401), (0.012605042196810246, 0.019607843831181526, 0.019607843831181526), (0.016806723549962044, 0.027450980618596077, 0.027450980618596077), (0.021008403971791267, 0.035294119268655777, 0.035294119268655777), (0.025210084393620491, 0.043137256056070328, 0.043137256056070328), (0.029411764815449715, 0.050980392843484879, 0.050980392843484879), (0.033613447099924088, 0.058823529630899429, 0.058823529630899429), (0.037815127521753311, 0.066666670143604279, 0.066666670143604279), (0.042016807943582535, 0.08235294371843338, 0.08235294371843338), (0.046218488365411758, 0.090196080505847931, 0.090196080505847931), (0.050420168787240982, 0.098039217293262482, 0.098039217293262482), (0.054621849209070206, 0.10588235408067703, 0.10588235408067703), (0.058823529630899429, 0.11372549086809158, 0.11372549086809158), (0.063025213778018951, 0.12156862765550613, 0.12156862765550613), (0.067226894199848175, 0.12941177189350128, 0.12941177189350128), (0.071428574621677399, 0.13725490868091583, 0.13725490868091583), (0.075630255043506622, 0.14509804546833038, 0.14509804546833038), (0.079831935465335846, 0.15294118225574493, 0.15294118225574493), (0.08403361588716507, 0.16078431904315948, 0.16078431904315948), (0.088235296308994293, 0.16862745583057404, 0.16862745583057404), (0.092436976730823517, 0.17647059261798859, 0.17647059261798859), (0.09663865715265274, 0.18431372940540314, 0.18431372940540314), (0.10084033757448196, 0.19215686619281769, 0.19215686619281769), (0.10504201799631119, 0.20000000298023224, 0.20000000298023224), (0.10924369841814041, 0.20784313976764679, 0.20784313976764679), (0.11344537883996964, 0.21568627655506134, 0.21568627655506134), (0.11764705926179886, 0.22352941334247589, 0.22352941334247589), (0.12184873968362808, 0.23137255012989044, 0.23137255012989044), (0.1260504275560379, 0.24705882370471954, 0.24705882370471954), (0.13025210797786713, 0.25490197539329529, 0.25490197539329529), (0.13445378839969635, 0.26274511218070984, 0.26274511218070984), (0.13865546882152557, 0.27058824896812439, 0.27058824896812439), (0.1428571492433548, 0.27843138575553894, 0.27843138575553894), (0.14705882966518402, 0.28627452254295349, 0.28627452254295349), (0.15126051008701324, 0.29411765933036804, 0.29411765933036804), (0.15546219050884247, 0.30196079611778259, 0.30196079611778259), (0.15966387093067169, 0.30980393290519714, 0.30980393290519714), (0.16386555135250092, 0.31764706969261169, 0.31764706969261169), (0.16806723177433014, 0.32549020648002625, 0.32549020648002625), (0.17226891219615936, 0.3333333432674408, 0.3333333432674408), (0.17647059261798859, 0.34117648005485535, 0.34117648005485535), (0.18067227303981781, 0.3490196168422699, 0.3490196168422699), (0.18487395346164703, 0.35686275362968445, 0.35686275362968445), (0.18907563388347626, 0.364705890417099, 0.364705890417099), (0.19327731430530548, 0.37254902720451355, 0.37254902720451355), (0.1974789947271347, 0.3803921639919281, 0.3803921639919281), (0.20168067514896393, 0.38823530077934265, 0.38823530077934265), (0.20588235557079315, 0.3960784375667572, 0.3960784375667572), (0.21008403599262238, 0.4117647111415863, 0.4117647111415863), (0.2142857164144516, 0.41960784792900085, 0.41960784792900085), (0.21848739683628082, 0.42745098471641541, 0.42745098471641541), (0.22268907725811005, 0.43529412150382996, 0.43529412150382996), (0.22689075767993927, 0.44313725829124451, 0.44313725829124451), (0.23109243810176849, 0.45098039507865906, 0.45098039507865906), (0.23529411852359772, 0.45882353186607361, 0.45882353186607361), (0.23949579894542694, 0.46666666865348816, 0.46666666865348816), (0.24369747936725616, 0.47450980544090271, 0.47450980544090271), (0.24789915978908539, 0.48235294222831726, 0.48235294222831726), (0.25210085511207581, 0.49803921580314636, 0.49803921580314636), (0.25630253553390503, 0.5058823823928833, 0.5058823823928833), (0.26050421595573425, 0.51372551918029785, 0.51372551918029785), (0.26470589637756348, 0.5215686559677124, 0.5215686559677124), (0.2689075767993927, 0.52941179275512695, 0.52941179275512695), (0.27310925722122192, 0.5372549295425415, 0.5372549295425415), (0.27731093764305115, 0.54509806632995605, 0.54509806632995605), (0.28151261806488037, 0.55294120311737061, 0.55294120311737061), (0.28571429848670959, 0.56078433990478516, 0.56078433990478516), (0.28991597890853882, 0.56862747669219971, 0.56862747669219971), (0.29411765933036804, 0.58431375026702881, 0.58431375026702881), (0.29831933975219727, 0.59215688705444336, 0.59215688705444336), (0.30252102017402649, 0.60000002384185791, 0.60000002384185791), (0.30672270059585571, 0.60784316062927246, 0.60784316062927246), (0.31092438101768494, 0.61568629741668701, 0.61568629741668701), (0.31512606143951416, 0.62352943420410156, 0.62352943420410156), (0.31932774186134338, 0.63137257099151611, 0.63137257099151611), (0.32352942228317261, 0.63921570777893066, 0.63921570777893066), (0.32773110270500183, 0.64705884456634521, 0.64705884456634521), (0.33193278312683105, 0.65490198135375977, 0.65490198135375977), (0.33613446354866028, 0.66274511814117432, 0.66274511814117432), (0.3403361439704895, 0.67058825492858887, 0.67058825492858887), (0.34453782439231873, 0.67843139171600342, 0.67843139171600342), (0.34873950481414795, 0.68627452850341797, 0.68627452850341797), (0.35294118523597717, 0.69411766529083252, 0.69411766529083252), (0.3571428656578064, 0.70196080207824707, 0.70196080207824707), (0.36134454607963562, 0.70980393886566162, 0.70980393886566162), (0.36554622650146484, 0.71764707565307617, 0.71764707565307617), (0.36974790692329407, 0.72549021244049072, 0.72549021244049072), (0.37394958734512329, 0.73333334922790527, 0.73333334922790527), (0.37815126776695251, 0.74901962280273438, 0.74901962280273438), (0.38235294818878174, 0.75686275959014893, 0.75686275959014893), (0.38655462861061096, 0.76470589637756348, 0.76470589637756348), (0.39075630903244019, 0.77254903316497803, 0.77254903316497803), (0.39495798945426941, 0.78039216995239258, 0.78039216995239258), (0.39915966987609863, 0.78823530673980713, 0.78823530673980713), (0.40336135029792786, 0.79607844352722168, 0.79607844352722168), (0.40756303071975708, 0.80392158031463623, 0.80392158031463623), (0.4117647111415863, 0.81176471710205078, 0.81176471710205078), (0.41596639156341553, 0.81960785388946533, 0.81960785388946533), (0.42016807198524475, 0.82745099067687988, 0.82745099067687988), (0.42436975240707397, 0.83529412746429443, 0.83529412746429443), (0.4285714328289032, 0.84313726425170898, 0.84313726425170898), (0.43277311325073242, 0.85098040103912354, 0.85098040103912354), (0.43697479367256165, 0.85882353782653809, 0.85882353782653809), (0.44117647409439087, 0.86666667461395264, 0.86666667461395264), (0.44537815451622009, 0.87450981140136719, 0.87450981140136719), (0.44957983493804932, 0.88235294818878174, 0.88235294818878174), (0.45378151535987854, 0.89019608497619629, 0.89019608497619629), (0.45798319578170776, 0.89803922176361084, 0.89803922176361084), (0.46218487620353699, 0.91372549533843994, 0.91372549533843994), (0.46638655662536621, 0.92156863212585449, 0.92156863212585449), (0.47058823704719543, 0.92941176891326904, 0.92941176891326904), (0.47478991746902466, 0.93725490570068359, 0.93725490570068359), (0.47899159789085388, 0.94509804248809814, 0.94509804248809814), (0.48319327831268311, 0.9529411792755127, 0.9529411792755127), (0.48739495873451233, 0.96078431606292725, 0.96078431606292725), (0.49159663915634155, 0.9686274528503418, 0.9686274528503418), (0.49579831957817078, 0.97647058963775635, 0.97647058963775635), (0.5, 0.9843137264251709, 0.9843137264251709), (0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 0.9843137264251709, 0.9843137264251709), (0.51260507106781006, 0.9686274528503418, 0.9686274528503418), (0.51680672168731689, 0.9529411792755127, 0.9529411792755127), (0.52100843191146851, 0.93333333730697632, 0.93333333730697632), (0.52521008253097534, 0.91764706373214722, 0.91764706373214722), (0.52941179275512695, 0.90196079015731812, 0.90196079015731812), (0.53361344337463379, 0.88627451658248901, 0.88627451658248901), (0.5378151535987854, 0.86666667461395264, 0.86666667461395264), (0.54201680421829224, 0.85098040103912354, 0.85098040103912354), (0.54621851444244385, 0.81960785388946533, 0.81960785388946533), (0.55042016506195068, 0.80000001192092896, 0.80000001192092896), (0.55462187528610229, 0.78431373834609985, 0.78431373834609985), (0.55882352590560913, 0.76862746477127075, 0.76862746477127075), (0.56302523612976074, 0.75294119119644165, 0.75294119119644165), (0.56722688674926758, 0.73333334922790527, 0.73333334922790527), (0.57142859697341919, 0.71764707565307617, 0.71764707565307617), (0.57563024759292603, 0.70196080207824707, 0.70196080207824707), (0.57983195781707764, 0.68627452850341797, 0.68627452850341797), (0.58403360843658447, 0.66666668653488159, 0.66666668653488159), (0.58823531866073608, 0.65098041296005249, 0.65098041296005249), (0.59243696928024292, 0.63529413938522339, 0.63529413938522339), (0.59663867950439453, 0.61960786581039429, 0.61960786581039429), (0.60084033012390137, 0.60000002384185791, 0.60000002384185791), (0.60504204034805298, 0.58431375026702881, 0.58431375026702881), (0.60924369096755981, 0.56862747669219971, 0.56862747669219971), (0.61344540119171143, 0.55294120311737061, 0.55294120311737061), (0.61764705181121826, 0.53333336114883423, 0.53333336114883423), (0.62184876203536987, 0.51764708757400513, 0.51764708757400513), (0.62605041265487671, 0.50196081399917603, 0.50196081399917603), (0.63025212287902832, 0.46666666865348816, 0.46666666865348816), (0.63445377349853516, 0.45098039507865906, 0.45098039507865906), (0.63865548372268677, 0.43529412150382996, 0.43529412150382996), (0.6428571343421936, 0.41960784792900085, 0.41960784792900085), (0.64705884456634521, 0.40000000596046448, 0.40000000596046448), (0.65126049518585205, 0.38431373238563538, 0.38431373238563538), (0.65546220541000366, 0.36862745881080627, 0.36862745881080627), (0.6596638560295105, 0.35294118523597717, 0.35294118523597717), (0.66386556625366211, 0.3333333432674408, 0.3333333432674408), (0.66806721687316895, 0.31764706969261169, 0.31764706969261169), (0.67226892709732056, 0.30196079611778259, 0.30196079611778259), (0.67647057771682739, 0.28627452254295349, 0.28627452254295349), (0.680672287940979, 0.26666668057441711, 0.26666668057441711), (0.68487393856048584, 0.25098040699958801, 0.25098040699958801), (0.68907564878463745, 0.23529411852359772, 0.23529411852359772), (0.69327729940414429, 0.21960784494876862, 0.21960784494876862), (0.6974790096282959, 0.20000000298023224, 0.20000000298023224), (0.70168066024780273, 0.18431372940540314, 0.18431372940540314), (0.70588237047195435, 0.16862745583057404, 0.16862745583057404), (0.71008402109146118, 0.15294118225574493, 0.15294118225574493), (0.71428573131561279, 0.11764705926179886, 0.11764705926179886), (0.71848738193511963, 0.10196078568696976, 0.10196078568696976), (0.72268909215927124, 0.086274512112140656, 0.086274512112140656), (0.72689074277877808, 0.066666670143604279, 0.066666670143604279), (0.73109245300292969, 0.050980392843484879, 0.050980392843484879), (0.73529410362243652, 0.035294119268655777, 0.035294119268655777), (0.73949581384658813, 0.019607843831181526, 0.019607843831181526), (0.74369746446609497, 0.0, 0.0), (0.74789917469024658, 0.011764706112444401, 0.011764706112444401), (0.75210082530975342, 0.027450980618596077, 0.027450980618596077), (0.75630253553390503, 0.058823529630899429, 0.058823529630899429), (0.76050418615341187, 0.074509806931018829, 0.074509806931018829), (0.76470589637756348, 0.086274512112140656, 0.086274512112140656), (0.76890754699707031, 0.10196078568696976, 0.10196078568696976), (0.77310925722122192, 0.11764705926179886, 0.11764705926179886), (0.77731090784072876, 0.13333334028720856, 0.13333334028720856), (0.78151261806488037, 0.14901961386203766, 0.14901961386203766), (0.78571426868438721, 0.16078431904315948, 0.16078431904315948), (0.78991597890853882, 0.17647059261798859, 0.17647059261798859), (0.79411762952804565, 0.19215686619281769, 0.19215686619281769), (0.79831933975219727, 0.22352941334247589, 0.22352941334247589), (0.8025209903717041, 0.23529411852359772, 0.23529411852359772), (0.80672270059585571, 0.25098040699958801, 0.25098040699958801), (0.81092435121536255, 0.26666668057441711, 0.26666668057441711), (0.81512606143951416, 0.28235295414924622, 0.28235295414924622), (0.819327712059021, 0.29803922772407532, 0.29803922772407532), (0.82352942228317261, 0.30980393290519714, 0.30980393290519714), (0.82773107290267944, 0.32549020648002625, 0.32549020648002625), (0.83193278312683105, 0.34117648005485535, 0.34117648005485535), (0.83613443374633789, 0.35686275362968445, 0.35686275362968445), (0.8403361439704895, 0.37254902720451355, 0.37254902720451355), (0.84453779458999634, 0.38431373238563538, 0.38431373238563538), (0.84873950481414795, 0.40000000596046448, 0.40000000596046448), (0.85294115543365479, 0.41568627953529358, 0.41568627953529358), (0.8571428656578064, 0.43137255311012268, 0.43137255311012268), (0.86134451627731323, 0.44705882668495178, 0.44705882668495178), (0.86554622650146484, 0.45882353186607361, 0.45882353186607361), (0.86974787712097168, 0.47450980544090271, 0.47450980544090271), (0.87394958734512329, 0.49019607901573181, 0.49019607901573181), (0.87815123796463013, 0.5058823823928833, 0.5058823823928833), (0.88235294818878174, 0.5372549295425415, 0.5372549295425415), (0.88655459880828857, 0.54901963472366333, 0.54901963472366333), (0.89075630903244019, 0.56470590829849243, 0.56470590829849243), (0.89495795965194702, 0.58039218187332153, 0.58039218187332153), (0.89915966987609863, 0.59607845544815063, 0.59607845544815063), (0.90336132049560547, 0.61176472902297974, 0.61176472902297974), (0.90756303071975708, 0.62352943420410156, 0.62352943420410156), (0.91176468133926392, 0.63921570777893066, 0.63921570777893066), (0.91596639156341553, 0.65490198135375977, 0.65490198135375977), (0.92016804218292236, 0.67058825492858887, 0.67058825492858887), (0.92436975240707397, 0.68627452850341797, 0.68627452850341797), (0.92857140302658081, 0.69803923368453979, 0.69803923368453979), (0.93277311325073242, 0.7137255072593689, 0.7137255072593689), (0.93697476387023926, 0.729411780834198, 0.729411780834198), (0.94117647409439087, 0.7450980544090271, 0.7450980544090271), (0.94537812471389771, 0.7607843279838562, 0.7607843279838562), (0.94957983493804932, 0.77254903316497803, 0.77254903316497803), (0.95378148555755615, 0.78823530673980713, 0.78823530673980713), (0.95798319578170776, 0.80392158031463623, 0.80392158031463623), (0.9621848464012146, 0.81960785388946533, 0.81960785388946533), (0.96638655662536621, 0.84705883264541626, 0.84705883264541626), (0.97058820724487305, 0.86274510622024536, 0.86274510622024536), (0.97478991746902466, 0.87843137979507446, 0.87843137979507446), (0.97899156808853149, 0.89411765336990356, 0.89411765336990356), (0.98319327831268311, 0.90980392694473267, 0.90980392694473267), (0.98739492893218994, 0.92156863212585449, 0.92156863212585449), (0.99159663915634155, 0.93725490570068359, 0.93725490570068359), (0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, 0.9686274528503418, 0.9686274528503418), ], "green": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, 0.011764706112444401), (0.016806723549962044, 0.015686275437474251, 0.015686275437474251), (0.021008403971791267, 0.019607843831181526, 0.019607843831181526), (0.025210084393620491, 0.023529412224888802, 0.023529412224888802), (0.029411764815449715, 0.027450980618596077, 0.027450980618596077), (0.033613447099924088, 0.031372550874948502, 0.031372550874948502), (0.037815127521753311, 0.035294119268655777, 0.035294119268655777), (0.042016807943582535, 0.043137256056070328, 0.043137256056070328), (0.046218488365411758, 0.047058824449777603, 0.047058824449777603), (0.050420168787240982, 0.050980392843484879, 0.050980392843484879), (0.054621849209070206, 0.054901961237192154, 0.054901961237192154), (0.058823529630899429, 0.058823529630899429, 0.058823529630899429), (0.063025213778018951, 0.062745101749897003, 0.062745101749897003), (0.067226894199848175, 0.066666670143604279, 0.066666670143604279), (0.071428574621677399, 0.070588238537311554, 0.070588238537311554), (0.075630255043506622, 0.074509806931018829, 0.074509806931018829), (0.079831935465335846, 0.078431375324726105, 0.078431375324726105), (0.08403361588716507, 0.08235294371843338, 0.08235294371843338), (0.088235296308994293, 0.086274512112140656, 0.086274512112140656), (0.092436976730823517, 0.090196080505847931, 0.090196080505847931), (0.09663865715265274, 0.094117648899555206, 0.094117648899555206), (0.10084033757448196, 0.098039217293262482, 0.098039217293262482), (0.10504201799631119, 0.10196078568696976, 0.10196078568696976), (0.10924369841814041, 0.10588235408067703, 0.10588235408067703), (0.11344537883996964, 0.10980392247438431, 0.10980392247438431), (0.11764705926179886, 0.11372549086809158, 0.11372549086809158), (0.12184873968362808, 0.11764705926179886, 0.11764705926179886), (0.1260504275560379, 0.12549020349979401, 0.12549020349979401), (0.13025210797786713, 0.12941177189350128, 0.12941177189350128), (0.13445378839969635, 0.13333334028720856, 0.13333334028720856), (0.13865546882152557, 0.13725490868091583, 0.13725490868091583), (0.1428571492433548, 0.14117647707462311, 0.14117647707462311), (0.14705882966518402, 0.14509804546833038, 0.14509804546833038), (0.15126051008701324, 0.14901961386203766, 0.14901961386203766), (0.15546219050884247, 0.15294118225574493, 0.15294118225574493), (0.15966387093067169, 0.15686275064945221, 0.15686275064945221), (0.16386555135250092, 0.16078431904315948, 0.16078431904315948), (0.16806723177433014, 0.16470588743686676, 0.16470588743686676), (0.17226891219615936, 0.16862745583057404, 0.16862745583057404), (0.17647059261798859, 0.17254902422428131, 0.17254902422428131), (0.18067227303981781, 0.17647059261798859, 0.17647059261798859), (0.18487395346164703, 0.18039216101169586, 0.18039216101169586), (0.18907563388347626, 0.18431372940540314, 0.18431372940540314), (0.19327731430530548, 0.18823529779911041, 0.18823529779911041), (0.1974789947271347, 0.19215686619281769, 0.19215686619281769), (0.20168067514896393, 0.19607843458652496, 0.19607843458652496), (0.20588235557079315, 0.20000000298023224, 0.20000000298023224), (0.21008403599262238, 0.20784313976764679, 0.20784313976764679), (0.2142857164144516, 0.21176470816135406, 0.21176470816135406), (0.21848739683628082, 0.21568627655506134, 0.21568627655506134), (0.22268907725811005, 0.21960784494876862, 0.21960784494876862), (0.22689075767993927, 0.22352941334247589, 0.22352941334247589), (0.23109243810176849, 0.22745098173618317, 0.22745098173618317), (0.23529411852359772, 0.23137255012989044, 0.23137255012989044), (0.23949579894542694, 0.23529411852359772, 0.23529411852359772), (0.24369747936725616, 0.23921568691730499, 0.23921568691730499), (0.24789915978908539, 0.24313725531101227, 0.24313725531101227), (0.25210085511207581, 0.25098040699958801, 0.25098040699958801), (0.25630253553390503, 0.25490197539329529, 0.25490197539329529), (0.26050421595573425, 0.25882354378700256, 0.25882354378700256), (0.26470589637756348, 0.26274511218070984, 0.26274511218070984), (0.2689075767993927, 0.26666668057441711, 0.26666668057441711), (0.27310925722122192, 0.27058824896812439, 0.27058824896812439), (0.27731093764305115, 0.27450981736183167, 0.27450981736183167), (0.28151261806488037, 0.27843138575553894, 0.27843138575553894), (0.28571429848670959, 0.28235295414924622, 0.28235295414924622), (0.28991597890853882, 0.28627452254295349, 0.28627452254295349), (0.29411765933036804, 0.29411765933036804, 0.29411765933036804), (0.29831933975219727, 0.29803922772407532, 0.29803922772407532), (0.30252102017402649, 0.30196079611778259, 0.30196079611778259), (0.30672270059585571, 0.30588236451148987, 0.30588236451148987), (0.31092438101768494, 0.30980393290519714, 0.30980393290519714), (0.31512606143951416, 0.31372550129890442, 0.31372550129890442), (0.31932774186134338, 0.31764706969261169, 0.31764706969261169), (0.32352942228317261, 0.32156863808631897, 0.32156863808631897), (0.32773110270500183, 0.32549020648002625, 0.32549020648002625), (0.33193278312683105, 0.32941177487373352, 0.32941177487373352), (0.33613446354866028, 0.3333333432674408, 0.3333333432674408), (0.3403361439704895, 0.33725491166114807, 0.33725491166114807), (0.34453782439231873, 0.34117648005485535, 0.34117648005485535), (0.34873950481414795, 0.34509804844856262, 0.34509804844856262), (0.35294118523597717, 0.3490196168422699, 0.3490196168422699), (0.3571428656578064, 0.35294118523597717, 0.35294118523597717), (0.36134454607963562, 0.35686275362968445, 0.35686275362968445), (0.36554622650146484, 0.36078432202339172, 0.36078432202339172), (0.36974790692329407, 0.364705890417099, 0.364705890417099), (0.37394958734512329, 0.36862745881080627, 0.36862745881080627), (0.37815126776695251, 0.37647059559822083, 0.37647059559822083), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.38431373238563538, 0.38431373238563538), (0.39075630903244019, 0.38823530077934265, 0.38823530077934265), (0.39495798945426941, 0.39215686917304993, 0.39215686917304993), (0.39915966987609863, 0.3960784375667572, 0.3960784375667572), (0.40336135029792786, 0.40000000596046448, 0.40000000596046448), (0.40756303071975708, 0.40392157435417175, 0.40392157435417175), (0.4117647111415863, 0.40784314274787903, 0.40784314274787903), (0.41596639156341553, 0.4117647111415863, 0.4117647111415863), (0.42016807198524475, 0.41568627953529358, 0.41568627953529358), (0.42436975240707397, 0.41960784792900085, 0.41960784792900085), (0.4285714328289032, 0.42352941632270813, 0.42352941632270813), (0.43277311325073242, 0.42745098471641541, 0.42745098471641541), (0.43697479367256165, 0.43137255311012268, 0.43137255311012268), (0.44117647409439087, 0.43529412150382996, 0.43529412150382996), (0.44537815451622009, 0.43921568989753723, 0.43921568989753723), (0.44957983493804932, 0.44313725829124451, 0.44313725829124451), (0.45378151535987854, 0.44705882668495178, 0.44705882668495178), (0.45798319578170776, 0.45098039507865906, 0.45098039507865906), (0.46218487620353699, 0.45882353186607361, 0.45882353186607361), (0.46638655662536621, 0.46274510025978088, 0.46274510025978088), (0.47058823704719543, 0.46666666865348816, 0.46666666865348816), (0.47478991746902466, 0.47058823704719543, 0.47058823704719543), (0.47899159789085388, 0.47450980544090271, 0.47450980544090271), (0.48319327831268311, 0.47843137383460999, 0.47843137383460999), (0.48739495873451233, 0.48235294222831726, 0.48235294222831726), (0.49159663915634155, 0.48627451062202454, 0.48627451062202454), (0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, 0.49411764740943909, 0.49411764740943909), (0.50420171022415161, 0.50196081399917603, 0.50196081399917603), (0.50840336084365845, 0.5058823823928833, 0.5058823823928833), (0.51260507106781006, 0.50980395078659058, 0.50980395078659058), (0.51680672168731689, 0.51372551918029785, 0.51372551918029785), (0.52100843191146851, 0.51764708757400513, 0.51764708757400513), (0.52521008253097534, 0.5215686559677124, 0.5215686559677124), (0.52941179275512695, 0.52549022436141968, 0.52549022436141968), (0.53361344337463379, 0.52941179275512695, 0.52941179275512695), (0.5378151535987854, 0.53333336114883423, 0.53333336114883423), (0.54201680421829224, 0.5372549295425415, 0.5372549295425415), (0.54621851444244385, 0.54509806632995605, 0.54509806632995605), (0.55042016506195068, 0.54901963472366333, 0.54901963472366333), (0.55462187528610229, 0.55294120311737061, 0.55294120311737061), (0.55882352590560913, 0.55686277151107788, 0.55686277151107788), (0.56302523612976074, 0.56078433990478516, 0.56078433990478516), (0.56722688674926758, 0.56470590829849243, 0.56470590829849243), (0.57142859697341919, 0.56862747669219971, 0.56862747669219971), (0.57563024759292603, 0.57254904508590698, 0.57254904508590698), (0.57983195781707764, 0.57647061347961426, 0.57647061347961426), (0.58403360843658447, 0.58039218187332153, 0.58039218187332153), (0.58823531866073608, 0.58431375026702881, 0.58431375026702881), (0.59243696928024292, 0.58823531866073608, 0.58823531866073608), (0.59663867950439453, 0.59215688705444336, 0.59215688705444336), (0.60084033012390137, 0.59607845544815063, 0.59607845544815063), (0.60504204034805298, 0.60000002384185791, 0.60000002384185791), (0.60924369096755981, 0.60392159223556519, 0.60392159223556519), (0.61344540119171143, 0.60784316062927246, 0.60784316062927246), (0.61764705181121826, 0.61176472902297974, 0.61176472902297974), (0.62184876203536987, 0.61568629741668701, 0.61568629741668701), (0.62605041265487671, 0.61960786581039429, 0.61960786581039429), (0.63025212287902832, 0.62745100259780884, 0.62745100259780884), (0.63445377349853516, 0.63137257099151611, 0.63137257099151611), (0.63865548372268677, 0.63529413938522339, 0.63529413938522339), (0.6428571343421936, 0.63921570777893066, 0.63921570777893066), (0.64705884456634521, 0.64313727617263794, 0.64313727617263794), (0.65126049518585205, 0.64705884456634521, 0.64705884456634521), (0.65546220541000366, 0.65098041296005249, 0.65098041296005249), (0.6596638560295105, 0.65490198135375977, 0.65490198135375977), (0.66386556625366211, 0.65882354974746704, 0.65882354974746704), (0.66806721687316895, 0.66274511814117432, 0.66274511814117432), (0.67226892709732056, 0.66666668653488159, 0.66666668653488159), (0.67647057771682739, 0.67058825492858887, 0.67058825492858887), (0.680672287940979, 0.67450982332229614, 0.67450982332229614), (0.68487393856048584, 0.67843139171600342, 0.67843139171600342), (0.68907564878463745, 0.68235296010971069, 0.68235296010971069), (0.69327729940414429, 0.68627452850341797, 0.68627452850341797), (0.6974790096282959, 0.69019609689712524, 0.69019609689712524), (0.70168066024780273, 0.69411766529083252, 0.69411766529083252), (0.70588237047195435, 0.69803923368453979, 0.69803923368453979), (0.71008402109146118, 0.70196080207824707, 0.70196080207824707), (0.71428573131561279, 0.70980393886566162, 0.70980393886566162), (0.71848738193511963, 0.7137255072593689, 0.7137255072593689), (0.72268909215927124, 0.71764707565307617, 0.71764707565307617), (0.72689074277877808, 0.72156864404678345, 0.72156864404678345), (0.73109245300292969, 0.72549021244049072, 0.72549021244049072), (0.73529410362243652, 0.729411780834198, 0.729411780834198), (0.73949581384658813, 0.73333334922790527, 0.73333334922790527), (0.74369746446609497, 0.73725491762161255, 0.73725491762161255), (0.74789917469024658, 0.74117648601531982, 0.74117648601531982), (0.75210082530975342, 0.7450980544090271, 0.7450980544090271), (0.75630253553390503, 0.75294119119644165, 0.75294119119644165), (0.76050418615341187, 0.75686275959014893, 0.75686275959014893), (0.76470589637756348, 0.7607843279838562, 0.7607843279838562), (0.76890754699707031, 0.76470589637756348, 0.76470589637756348), (0.77310925722122192, 0.76862746477127075, 0.76862746477127075), (0.77731090784072876, 0.77254903316497803, 0.77254903316497803), (0.78151261806488037, 0.7764706015586853, 0.7764706015586853), (0.78571426868438721, 0.78039216995239258, 0.78039216995239258), (0.78991597890853882, 0.78431373834609985, 0.78431373834609985), (0.79411762952804565, 0.78823530673980713, 0.78823530673980713), (0.79831933975219727, 0.79607844352722168, 0.79607844352722168), (0.8025209903717041, 0.80000001192092896, 0.80000001192092896), (0.80672270059585571, 0.80392158031463623, 0.80392158031463623), (0.81092435121536255, 0.80784314870834351, 0.80784314870834351), (0.81512606143951416, 0.81176471710205078, 0.81176471710205078), (0.819327712059021, 0.81568628549575806, 0.81568628549575806), (0.82352942228317261, 0.81960785388946533, 0.81960785388946533), (0.82773107290267944, 0.82352942228317261, 0.82352942228317261), (0.83193278312683105, 0.82745099067687988, 0.82745099067687988), (0.83613443374633789, 0.83137255907058716, 0.83137255907058716), (0.8403361439704895, 0.83529412746429443, 0.83529412746429443), (0.84453779458999634, 0.83921569585800171, 0.83921569585800171), (0.84873950481414795, 0.84313726425170898, 0.84313726425170898), (0.85294115543365479, 0.84705883264541626, 0.84705883264541626), (0.8571428656578064, 0.85098040103912354, 0.85098040103912354), (0.86134451627731323, 0.85490196943283081, 0.85490196943283081), (0.86554622650146484, 0.85882353782653809, 0.85882353782653809), (0.86974787712097168, 0.86274510622024536, 0.86274510622024536), (0.87394958734512329, 0.86666667461395264, 0.86666667461395264), (0.87815123796463013, 0.87058824300765991, 0.87058824300765991), (0.88235294818878174, 0.87843137979507446, 0.87843137979507446), (0.88655459880828857, 0.88235294818878174, 0.88235294818878174), (0.89075630903244019, 0.88627451658248901, 0.88627451658248901), (0.89495795965194702, 0.89019608497619629, 0.89019608497619629), (0.89915966987609863, 0.89411765336990356, 0.89411765336990356), (0.90336132049560547, 0.89803922176361084, 0.89803922176361084), (0.90756303071975708, 0.90196079015731812, 0.90196079015731812), (0.91176468133926392, 0.90588235855102539, 0.90588235855102539), (0.91596639156341553, 0.90980392694473267, 0.90980392694473267), (0.92016804218292236, 0.91372549533843994, 0.91372549533843994), (0.92436975240707397, 0.91764706373214722, 0.91764706373214722), (0.92857140302658081, 0.92156863212585449, 0.92156863212585449), (0.93277311325073242, 0.92549020051956177, 0.92549020051956177), (0.93697476387023926, 0.92941176891326904, 0.92941176891326904), (0.94117647409439087, 0.93333333730697632, 0.93333333730697632), (0.94537812471389771, 0.93725490570068359, 0.93725490570068359), (0.94957983493804932, 0.94117647409439087, 0.94117647409439087), (0.95378148555755615, 0.94509804248809814, 0.94509804248809814), (0.95798319578170776, 0.94901961088180542, 0.94901961088180542), (0.9621848464012146, 0.9529411792755127, 0.9529411792755127), (0.96638655662536621, 0.96078431606292725, 0.96078431606292725), (0.97058820724487305, 0.96470588445663452, 0.96470588445663452), (0.97478991746902466, 0.9686274528503418, 0.9686274528503418), (0.97899156808853149, 0.97254902124404907, 0.97254902124404907), (0.98319327831268311, 0.97647058963775635, 0.97647058963775635), (0.98739492893218994, 0.98039215803146362, 0.98039215803146362), (0.99159663915634155, 0.9843137264251709, 0.9843137264251709), (0.99579828977584839, 0.98823529481887817, 0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545), ], "red": [ (0.0, 0.0, 0.0), (0.0042016808874905109, 0.070588238537311554, 0.070588238537311554), (0.0084033617749810219, 0.14117647707462311, 0.14117647707462311), (0.012605042196810246, 0.21176470816135406, 0.21176470816135406), (0.016806723549962044, 0.28235295414924622, 0.28235295414924622), (0.021008403971791267, 0.35294118523597717, 0.35294118523597717), (0.025210084393620491, 0.42352941632270813, 0.42352941632270813), (0.029411764815449715, 0.49803921580314636, 0.49803921580314636), (0.033613447099924088, 0.56862747669219971, 0.56862747669219971), (0.037815127521753311, 0.63921570777893066, 0.63921570777893066), (0.042016807943582535, 0.78039216995239258, 0.78039216995239258), (0.046218488365411758, 0.85098040103912354, 0.85098040103912354), (0.050420168787240982, 0.92156863212585449, 0.92156863212585449), (0.054621849209070206, 0.99607843160629272, 0.99607843160629272), (0.058823529630899429, 0.97647058963775635, 0.97647058963775635), (0.063025213778018951, 0.95686274766921997, 0.95686274766921997), (0.067226894199848175, 0.93725490570068359, 0.93725490570068359), (0.071428574621677399, 0.91764706373214722, 0.91764706373214722), (0.075630255043506622, 0.89803922176361084, 0.89803922176361084), (0.079831935465335846, 0.87450981140136719, 0.87450981140136719), (0.08403361588716507, 0.85490196943283081, 0.85490196943283081), (0.088235296308994293, 0.83529412746429443, 0.83529412746429443), (0.092436976730823517, 0.81568628549575806, 0.81568628549575806), (0.09663865715265274, 0.79607844352722168, 0.79607844352722168), (0.10084033757448196, 0.77254903316497803, 0.77254903316497803), (0.10504201799631119, 0.75294119119644165, 0.75294119119644165), (0.10924369841814041, 0.73333334922790527, 0.73333334922790527), (0.11344537883996964, 0.7137255072593689, 0.7137255072593689), (0.11764705926179886, 0.69411766529083252, 0.69411766529083252), (0.12184873968362808, 0.67450982332229614, 0.67450982332229614), (0.1260504275560379, 0.63137257099151611, 0.63137257099151611), (0.13025210797786713, 0.61176472902297974, 0.61176472902297974), (0.13445378839969635, 0.59215688705444336, 0.59215688705444336), (0.13865546882152557, 0.57254904508590698, 0.57254904508590698), (0.1428571492433548, 0.54901963472366333, 0.54901963472366333), (0.14705882966518402, 0.52941179275512695, 0.52941179275512695), (0.15126051008701324, 0.50980395078659058, 0.50980395078659058), (0.15546219050884247, 0.49019607901573181, 0.49019607901573181), (0.15966387093067169, 0.47058823704719543, 0.47058823704719543), (0.16386555135250092, 0.45098039507865906, 0.45098039507865906), (0.16806723177433014, 0.42745098471641541, 0.42745098471641541), (0.17226891219615936, 0.40784314274787903, 0.40784314274787903), (0.17647059261798859, 0.38823530077934265, 0.38823530077934265), (0.18067227303981781, 0.36862745881080627, 0.36862745881080627), (0.18487395346164703, 0.3490196168422699, 0.3490196168422699), (0.18907563388347626, 0.32549020648002625, 0.32549020648002625), (0.19327731430530548, 0.30588236451148987, 0.30588236451148987), (0.1974789947271347, 0.28627452254295349, 0.28627452254295349), (0.20168067514896393, 0.26666668057441711, 0.26666668057441711), (0.20588235557079315, 0.24705882370471954, 0.24705882370471954), (0.21008403599262238, 0.20392157137393951, 0.20392157137393951), (0.2142857164144516, 0.18431372940540314, 0.18431372940540314), (0.21848739683628082, 0.16470588743686676, 0.16470588743686676), (0.22268907725811005, 0.14509804546833038, 0.14509804546833038), (0.22689075767993927, 0.12549020349979401, 0.12549020349979401), (0.23109243810176849, 0.10196078568696976, 0.10196078568696976), (0.23529411852359772, 0.08235294371843338, 0.08235294371843338), (0.23949579894542694, 0.062745101749897003, 0.062745101749897003), (0.24369747936725616, 0.043137256056070328, 0.043137256056070328), (0.24789915978908539, 0.023529412224888802, 0.023529412224888802), (0.25210085511207581, 0.25098040699958801, 0.25098040699958801), (0.25630253553390503, 0.25490197539329529, 0.25490197539329529), (0.26050421595573425, 0.25882354378700256, 0.25882354378700256), (0.26470589637756348, 0.26274511218070984, 0.26274511218070984), (0.2689075767993927, 0.26666668057441711, 0.26666668057441711), (0.27310925722122192, 0.27058824896812439, 0.27058824896812439), (0.27731093764305115, 0.27450981736183167, 0.27450981736183167), (0.28151261806488037, 0.27843138575553894, 0.27843138575553894), (0.28571429848670959, 0.28235295414924622, 0.28235295414924622), (0.28991597890853882, 0.28627452254295349, 0.28627452254295349), (0.29411765933036804, 0.29411765933036804, 0.29411765933036804), (0.29831933975219727, 0.29803922772407532, 0.29803922772407532), (0.30252102017402649, 0.30196079611778259, 0.30196079611778259), (0.30672270059585571, 0.30588236451148987, 0.30588236451148987), (0.31092438101768494, 0.30980393290519714, 0.30980393290519714), (0.31512606143951416, 0.31372550129890442, 0.31372550129890442), (0.31932774186134338, 0.31764706969261169, 0.31764706969261169), (0.32352942228317261, 0.32156863808631897, 0.32156863808631897), (0.32773110270500183, 0.32549020648002625, 0.32549020648002625), (0.33193278312683105, 0.32941177487373352, 0.32941177487373352), (0.33613446354866028, 0.3333333432674408, 0.3333333432674408), (0.3403361439704895, 0.33725491166114807, 0.33725491166114807), (0.34453782439231873, 0.34117648005485535, 0.34117648005485535), (0.34873950481414795, 0.34509804844856262, 0.34509804844856262), (0.35294118523597717, 0.3490196168422699, 0.3490196168422699), (0.3571428656578064, 0.35294118523597717, 0.35294118523597717), (0.36134454607963562, 0.35686275362968445, 0.35686275362968445), (0.36554622650146484, 0.36078432202339172, 0.36078432202339172), (0.36974790692329407, 0.364705890417099, 0.364705890417099), (0.37394958734512329, 0.36862745881080627, 0.36862745881080627), (0.37815126776695251, 0.37647059559822083, 0.37647059559822083), (0.38235294818878174, 0.3803921639919281, 0.3803921639919281), (0.38655462861061096, 0.38431373238563538, 0.38431373238563538), (0.39075630903244019, 0.38823530077934265, 0.38823530077934265), (0.39495798945426941, 0.39215686917304993, 0.39215686917304993), (0.39915966987609863, 0.3960784375667572, 0.3960784375667572), (0.40336135029792786, 0.40000000596046448, 0.40000000596046448), (0.40756303071975708, 0.40392157435417175, 0.40392157435417175), (0.4117647111415863, 0.40784314274787903, 0.40784314274787903), (0.41596639156341553, 0.4117647111415863, 0.4117647111415863), (0.42016807198524475, 0.41568627953529358, 0.41568627953529358), (0.42436975240707397, 0.41960784792900085, 0.41960784792900085), (0.4285714328289032, 0.42352941632270813, 0.42352941632270813), (0.43277311325073242, 0.42745098471641541, 0.42745098471641541), (0.43697479367256165, 0.43137255311012268, 0.43137255311012268), (0.44117647409439087, 0.43529412150382996, 0.43529412150382996), (0.44537815451622009, 0.43921568989753723, 0.43921568989753723), (0.44957983493804932, 0.44313725829124451, 0.44313725829124451), (0.45378151535987854, 0.44705882668495178, 0.44705882668495178), (0.45798319578170776, 0.45098039507865906, 0.45098039507865906), (0.46218487620353699, 0.45882353186607361, 0.45882353186607361), (0.46638655662536621, 0.46274510025978088, 0.46274510025978088), (0.47058823704719543, 0.46666666865348816, 0.46666666865348816), (0.47478991746902466, 0.47058823704719543, 0.47058823704719543), (0.47899159789085388, 0.47450980544090271, 0.47450980544090271), (0.48319327831268311, 0.47843137383460999, 0.47843137383460999), (0.48739495873451233, 0.48235294222831726, 0.48235294222831726), (0.49159663915634155, 0.48627451062202454, 0.48627451062202454), (0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, 0.49411764740943909, 0.49411764740943909), (0.50420171022415161, 0.50196081399917603, 0.50196081399917603), (0.50840336084365845, 0.5058823823928833, 0.5058823823928833), (0.51260507106781006, 0.50980395078659058, 0.50980395078659058), (0.51680672168731689, 0.51372551918029785, 0.51372551918029785), (0.52100843191146851, 0.51764708757400513, 0.51764708757400513), (0.52521008253097534, 0.5215686559677124, 0.5215686559677124), (0.52941179275512695, 0.52549022436141968, 0.52549022436141968), (0.53361344337463379, 0.52941179275512695, 0.52941179275512695), (0.5378151535987854, 0.53333336114883423, 0.53333336114883423), (0.54201680421829224, 0.5372549295425415, 0.5372549295425415), (0.54621851444244385, 0.54509806632995605, 0.54509806632995605), (0.55042016506195068, 0.54901963472366333, 0.54901963472366333), (0.55462187528610229, 0.55294120311737061, 0.55294120311737061), (0.55882352590560913, 0.55686277151107788, 0.55686277151107788), (0.56302523612976074, 0.56078433990478516, 0.56078433990478516), (0.56722688674926758, 0.56470590829849243, 0.56470590829849243), (0.57142859697341919, 0.56862747669219971, 0.56862747669219971), (0.57563024759292603, 0.57254904508590698, 0.57254904508590698), (0.57983195781707764, 0.57647061347961426, 0.57647061347961426), (0.58403360843658447, 0.58039218187332153, 0.58039218187332153), (0.58823531866073608, 0.58431375026702881, 0.58431375026702881), (0.59243696928024292, 0.58823531866073608, 0.58823531866073608), (0.59663867950439453, 0.59215688705444336, 0.59215688705444336), (0.60084033012390137, 0.59607845544815063, 0.59607845544815063), (0.60504204034805298, 0.60000002384185791, 0.60000002384185791), (0.60924369096755981, 0.60392159223556519, 0.60392159223556519), (0.61344540119171143, 0.60784316062927246, 0.60784316062927246), (0.61764705181121826, 0.61176472902297974, 0.61176472902297974), (0.62184876203536987, 0.61568629741668701, 0.61568629741668701), (0.62605041265487671, 0.61960786581039429, 0.61960786581039429), (0.63025212287902832, 0.62745100259780884, 0.62745100259780884), (0.63445377349853516, 0.63137257099151611, 0.63137257099151611), (0.63865548372268677, 0.63529413938522339, 0.63529413938522339), (0.6428571343421936, 0.63921570777893066, 0.63921570777893066), (0.64705884456634521, 0.64313727617263794, 0.64313727617263794), (0.65126049518585205, 0.64705884456634521, 0.64705884456634521), (0.65546220541000366, 0.65098041296005249, 0.65098041296005249), (0.6596638560295105, 0.65490198135375977, 0.65490198135375977), (0.66386556625366211, 0.65882354974746704, 0.65882354974746704), (0.66806721687316895, 0.66274511814117432, 0.66274511814117432), (0.67226892709732056, 0.66666668653488159, 0.66666668653488159), (0.67647057771682739, 0.67058825492858887, 0.67058825492858887), (0.680672287940979, 0.67450982332229614, 0.67450982332229614), (0.68487393856048584, 0.67843139171600342, 0.67843139171600342), (0.68907564878463745, 0.68235296010971069, 0.68235296010971069), (0.69327729940414429, 0.68627452850341797, 0.68627452850341797), (0.6974790096282959, 0.69019609689712524, 0.69019609689712524), (0.70168066024780273, 0.69411766529083252, 0.69411766529083252), (0.70588237047195435, 0.69803923368453979, 0.69803923368453979), (0.71008402109146118, 0.70196080207824707, 0.70196080207824707), (0.71428573131561279, 0.70980393886566162, 0.70980393886566162), (0.71848738193511963, 0.7137255072593689, 0.7137255072593689), (0.72268909215927124, 0.71764707565307617, 0.71764707565307617), (0.72689074277877808, 0.72156864404678345, 0.72156864404678345), (0.73109245300292969, 0.72549021244049072, 0.72549021244049072), (0.73529410362243652, 0.729411780834198, 0.729411780834198), (0.73949581384658813, 0.73333334922790527, 0.73333334922790527), (0.74369746446609497, 0.73725491762161255, 0.73725491762161255), (0.74789917469024658, 0.74117648601531982, 0.74117648601531982), (0.75210082530975342, 0.7450980544090271, 0.7450980544090271), (0.75630253553390503, 0.75294119119644165, 0.75294119119644165), (0.76050418615341187, 0.75686275959014893, 0.75686275959014893), (0.76470589637756348, 0.7607843279838562, 0.7607843279838562), (0.76890754699707031, 0.76470589637756348, 0.76470589637756348), (0.77310925722122192, 0.76862746477127075, 0.76862746477127075), (0.77731090784072876, 0.77254903316497803, 0.77254903316497803), (0.78151261806488037, 0.7764706015586853, 0.7764706015586853), (0.78571426868438721, 0.78039216995239258, 0.78039216995239258), (0.78991597890853882, 0.78431373834609985, 0.78431373834609985), (0.79411762952804565, 0.78823530673980713, 0.78823530673980713), (0.79831933975219727, 0.79607844352722168, 0.79607844352722168), (0.8025209903717041, 0.80000001192092896, 0.80000001192092896), (0.80672270059585571, 0.80392158031463623, 0.80392158031463623), (0.81092435121536255, 0.80784314870834351, 0.80784314870834351), (0.81512606143951416, 0.81176471710205078, 0.81176471710205078), (0.819327712059021, 0.81568628549575806, 0.81568628549575806), (0.82352942228317261, 0.81960785388946533, 0.81960785388946533), (0.82773107290267944, 0.82352942228317261, 0.82352942228317261), (0.83193278312683105, 0.82745099067687988, 0.82745099067687988), (0.83613443374633789, 0.83137255907058716, 0.83137255907058716), (0.8403361439704895, 0.83529412746429443, 0.83529412746429443), (0.84453779458999634, 0.83921569585800171, 0.83921569585800171), (0.84873950481414795, 0.84313726425170898, 0.84313726425170898), (0.85294115543365479, 0.84705883264541626, 0.84705883264541626), (0.8571428656578064, 0.85098040103912354, 0.85098040103912354), (0.86134451627731323, 0.85490196943283081, 0.85490196943283081), (0.86554622650146484, 0.85882353782653809, 0.85882353782653809), (0.86974787712097168, 0.86274510622024536, 0.86274510622024536), (0.87394958734512329, 0.86666667461395264, 0.86666667461395264), (0.87815123796463013, 0.87058824300765991, 0.87058824300765991), (0.88235294818878174, 0.87843137979507446, 0.87843137979507446), (0.88655459880828857, 0.88235294818878174, 0.88235294818878174), (0.89075630903244019, 0.88627451658248901, 0.88627451658248901), (0.89495795965194702, 0.89019608497619629, 0.89019608497619629), (0.89915966987609863, 0.89411765336990356, 0.89411765336990356), (0.90336132049560547, 0.89803922176361084, 0.89803922176361084), (0.90756303071975708, 0.90196079015731812, 0.90196079015731812), (0.91176468133926392, 0.90588235855102539, 0.90588235855102539), (0.91596639156341553, 0.90980392694473267, 0.90980392694473267), (0.92016804218292236, 0.91372549533843994, 0.91372549533843994), (0.92436975240707397, 0.91764706373214722, 0.91764706373214722), (0.92857140302658081, 0.92156863212585449, 0.92156863212585449), (0.93277311325073242, 0.92549020051956177, 0.92549020051956177), (0.93697476387023926, 0.92941176891326904, 0.92941176891326904), (0.94117647409439087, 0.93333333730697632, 0.93333333730697632), (0.94537812471389771, 0.93725490570068359, 0.93725490570068359), (0.94957983493804932, 0.94117647409439087, 0.94117647409439087), (0.95378148555755615, 0.94509804248809814, 0.94509804248809814), (0.95798319578170776, 0.94901961088180542, 0.94901961088180542), (0.9621848464012146, 0.9529411792755127, 0.9529411792755127), (0.96638655662536621, 0.96078431606292725, 0.96078431606292725), (0.97058820724487305, 0.96470588445663452, 0.96470588445663452), (0.97478991746902466, 0.9686274528503418, 0.9686274528503418), (0.97899156808853149, 0.97254902124404907, 0.97254902124404907), (0.98319327831268311, 0.97647058963775635, 0.97647058963775635), (0.98739492893218994, 0.98039215803146362, 0.98039215803146362), (0.99159663915634155, 0.9843137264251709, 0.9843137264251709), (0.99579828977584839, 0.98823529481887817, 0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545), ], } _gist_yarg_data = { "blue": [ (0.0, 1.0, 1.0), (0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), (0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), (0.012605042196810246, 0.98823529481887817, 0.98823529481887817), (0.016806723549962044, 0.9843137264251709, 0.9843137264251709), (0.021008403971791267, 0.98039215803146362, 0.98039215803146362), (0.025210084393620491, 0.97647058963775635, 0.97647058963775635), (0.029411764815449715, 0.97254902124404907, 0.97254902124404907), (0.033613447099924088, 0.96470588445663452, 0.96470588445663452), (0.037815127521753311, 0.96078431606292725, 0.96078431606292725), (0.042016807943582535, 0.95686274766921997, 0.95686274766921997), (0.046218488365411758, 0.9529411792755127, 0.9529411792755127), (0.050420168787240982, 0.94901961088180542, 0.94901961088180542), (0.054621849209070206, 0.94509804248809814, 0.94509804248809814), (0.058823529630899429, 0.94117647409439087, 0.94117647409439087), (0.063025213778018951, 0.93725490570068359, 0.93725490570068359), (0.067226894199848175, 0.93333333730697632, 0.93333333730697632), (0.071428574621677399, 0.92941176891326904, 0.92941176891326904), (0.075630255043506622, 0.92549020051956177, 0.92549020051956177), (0.079831935465335846, 0.92156863212585449, 0.92156863212585449), (0.08403361588716507, 0.91764706373214722, 0.91764706373214722), (0.088235296308994293, 0.91372549533843994, 0.91372549533843994), (0.092436976730823517, 0.90980392694473267, 0.90980392694473267), (0.09663865715265274, 0.90196079015731812, 0.90196079015731812), (0.10084033757448196, 0.89803922176361084, 0.89803922176361084), (0.10504201799631119, 0.89411765336990356, 0.89411765336990356), (0.10924369841814041, 0.89019608497619629, 0.89019608497619629), (0.11344537883996964, 0.88627451658248901, 0.88627451658248901), (0.11764705926179886, 0.88235294818878174, 0.88235294818878174), (0.12184873968362808, 0.87843137979507446, 0.87843137979507446), (0.1260504275560379, 0.87450981140136719, 0.87450981140136719), (0.13025210797786713, 0.87058824300765991, 0.87058824300765991), (0.13445378839969635, 0.86666667461395264, 0.86666667461395264), (0.13865546882152557, 0.86274510622024536, 0.86274510622024536), (0.1428571492433548, 0.85882353782653809, 0.85882353782653809), (0.14705882966518402, 0.85490196943283081, 0.85490196943283081), (0.15126051008701324, 0.85098040103912354, 0.85098040103912354), (0.15546219050884247, 0.84705883264541626, 0.84705883264541626), (0.15966387093067169, 0.83921569585800171, 0.83921569585800171), (0.16386555135250092, 0.83529412746429443, 0.83529412746429443), (0.16806723177433014, 0.83137255907058716, 0.83137255907058716), (0.17226891219615936, 0.82745099067687988, 0.82745099067687988), (0.17647059261798859, 0.82352942228317261, 0.82352942228317261), (0.18067227303981781, 0.81960785388946533, 0.81960785388946533), (0.18487395346164703, 0.81568628549575806, 0.81568628549575806), (0.18907563388347626, 0.81176471710205078, 0.81176471710205078), (0.19327731430530548, 0.80784314870834351, 0.80784314870834351), (0.1974789947271347, 0.80392158031463623, 0.80392158031463623), (0.20168067514896393, 0.80000001192092896, 0.80000001192092896), (0.20588235557079315, 0.79607844352722168, 0.79607844352722168), (0.21008403599262238, 0.7921568751335144, 0.7921568751335144), (0.2142857164144516, 0.78823530673980713, 0.78823530673980713), (0.21848739683628082, 0.78431373834609985, 0.78431373834609985), (0.22268907725811005, 0.7764706015586853, 0.7764706015586853), (0.22689075767993927, 0.77254903316497803, 0.77254903316497803), (0.23109243810176849, 0.76862746477127075, 0.76862746477127075), (0.23529411852359772, 0.76470589637756348, 0.76470589637756348), (0.23949579894542694, 0.7607843279838562, 0.7607843279838562), (0.24369747936725616, 0.75686275959014893, 0.75686275959014893), (0.24789915978908539, 0.75294119119644165, 0.75294119119644165), (0.25210085511207581, 0.74901962280273438, 0.74901962280273438), (0.25630253553390503, 0.7450980544090271, 0.7450980544090271), (0.26050421595573425, 0.74117648601531982, 0.74117648601531982), (0.26470589637756348, 0.73725491762161255, 0.73725491762161255), (0.2689075767993927, 0.73333334922790527, 0.73333334922790527), (0.27310925722122192, 0.729411780834198, 0.729411780834198), (0.27731093764305115, 0.72549021244049072, 0.72549021244049072), (0.28151261806488037, 0.72156864404678345, 0.72156864404678345), (0.28571429848670959, 0.7137255072593689, 0.7137255072593689), (0.28991597890853882, 0.70980393886566162, 0.70980393886566162), (0.29411765933036804, 0.70588237047195435, 0.70588237047195435), (0.29831933975219727, 0.70196080207824707, 0.70196080207824707), (0.30252102017402649, 0.69803923368453979, 0.69803923368453979), (0.30672270059585571, 0.69411766529083252, 0.69411766529083252), (0.31092438101768494, 0.69019609689712524, 0.69019609689712524), (0.31512606143951416, 0.68627452850341797, 0.68627452850341797), (0.31932774186134338, 0.68235296010971069, 0.68235296010971069), (0.32352942228317261, 0.67843139171600342, 0.67843139171600342), (0.32773110270500183, 0.67450982332229614, 0.67450982332229614), (0.33193278312683105, 0.67058825492858887, 0.67058825492858887), (0.33613446354866028, 0.66666668653488159, 0.66666668653488159), (0.3403361439704895, 0.66274511814117432, 0.66274511814117432), (0.34453782439231873, 0.65882354974746704, 0.65882354974746704), (0.34873950481414795, 0.65098041296005249, 0.65098041296005249), (0.35294118523597717, 0.64705884456634521, 0.64705884456634521), (0.3571428656578064, 0.64313727617263794, 0.64313727617263794), (0.36134454607963562, 0.63921570777893066, 0.63921570777893066), (0.36554622650146484, 0.63529413938522339, 0.63529413938522339), (0.36974790692329407, 0.63137257099151611, 0.63137257099151611), (0.37394958734512329, 0.62745100259780884, 0.62745100259780884), (0.37815126776695251, 0.62352943420410156, 0.62352943420410156), (0.38235294818878174, 0.61960786581039429, 0.61960786581039429), (0.38655462861061096, 0.61568629741668701, 0.61568629741668701), (0.39075630903244019, 0.61176472902297974, 0.61176472902297974), (0.39495798945426941, 0.60784316062927246, 0.60784316062927246), (0.39915966987609863, 0.60392159223556519, 0.60392159223556519), (0.40336135029792786, 0.60000002384185791, 0.60000002384185791), (0.40756303071975708, 0.59607845544815063, 0.59607845544815063), (0.4117647111415863, 0.58823531866073608, 0.58823531866073608), (0.41596639156341553, 0.58431375026702881, 0.58431375026702881), (0.42016807198524475, 0.58039218187332153, 0.58039218187332153), (0.42436975240707397, 0.57647061347961426, 0.57647061347961426), (0.4285714328289032, 0.57254904508590698, 0.57254904508590698), (0.43277311325073242, 0.56862747669219971, 0.56862747669219971), (0.43697479367256165, 0.56470590829849243, 0.56470590829849243), (0.44117647409439087, 0.56078433990478516, 0.56078433990478516), (0.44537815451622009, 0.55686277151107788, 0.55686277151107788), (0.44957983493804932, 0.55294120311737061, 0.55294120311737061), (0.45378151535987854, 0.54901963472366333, 0.54901963472366333), (0.45798319578170776, 0.54509806632995605, 0.54509806632995605), (0.46218487620353699, 0.54117649793624878, 0.54117649793624878), (0.46638655662536621, 0.5372549295425415, 0.5372549295425415), (0.47058823704719543, 0.53333336114883423, 0.53333336114883423), (0.47478991746902466, 0.52549022436141968, 0.52549022436141968), (0.47899159789085388, 0.5215686559677124, 0.5215686559677124), (0.48319327831268311, 0.51764708757400513, 0.51764708757400513), (0.48739495873451233, 0.51372551918029785, 0.51372551918029785), (0.49159663915634155, 0.50980395078659058, 0.50980395078659058), (0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, 0.50196081399917603, 0.50196081399917603), (0.50420171022415161, 0.49803921580314636, 0.49803921580314636), (0.50840336084365845, 0.49411764740943909, 0.49411764740943909), (0.51260507106781006, 0.49019607901573181, 0.49019607901573181), (0.51680672168731689, 0.48627451062202454, 0.48627451062202454), (0.52100843191146851, 0.48235294222831726, 0.48235294222831726), (0.52521008253097534, 0.47843137383460999, 0.47843137383460999), (0.52941179275512695, 0.47450980544090271, 0.47450980544090271), (0.53361344337463379, 0.47058823704719543, 0.47058823704719543), (0.5378151535987854, 0.46274510025978088, 0.46274510025978088), (0.54201680421829224, 0.45882353186607361, 0.45882353186607361), (0.54621851444244385, 0.45490196347236633, 0.45490196347236633), (0.55042016506195068, 0.45098039507865906, 0.45098039507865906), (0.55462187528610229, 0.44705882668495178, 0.44705882668495178), (0.55882352590560913, 0.44313725829124451, 0.44313725829124451), (0.56302523612976074, 0.43921568989753723, 0.43921568989753723), (0.56722688674926758, 0.43529412150382996, 0.43529412150382996), (0.57142859697341919, 0.43137255311012268, 0.43137255311012268), (0.57563024759292603, 0.42745098471641541, 0.42745098471641541), (0.57983195781707764, 0.42352941632270813, 0.42352941632270813), (0.58403360843658447, 0.41960784792900085, 0.41960784792900085), (0.58823531866073608, 0.41568627953529358, 0.41568627953529358), (0.59243696928024292, 0.4117647111415863, 0.4117647111415863), (0.59663867950439453, 0.40784314274787903, 0.40784314274787903), (0.60084033012390137, 0.40000000596046448, 0.40000000596046448), (0.60504204034805298, 0.3960784375667572, 0.3960784375667572), (0.60924369096755981, 0.39215686917304993, 0.39215686917304993), (0.61344540119171143, 0.38823530077934265, 0.38823530077934265), (0.61764705181121826, 0.38431373238563538, 0.38431373238563538), (0.62184876203536987, 0.3803921639919281, 0.3803921639919281), (0.62605041265487671, 0.37647059559822083, 0.37647059559822083), (0.63025212287902832, 0.37254902720451355, 0.37254902720451355), (0.63445377349853516, 0.36862745881080627, 0.36862745881080627), (0.63865548372268677, 0.364705890417099, 0.364705890417099), (0.6428571343421936, 0.36078432202339172, 0.36078432202339172), (0.64705884456634521, 0.35686275362968445, 0.35686275362968445), (0.65126049518585205, 0.35294118523597717, 0.35294118523597717), (0.65546220541000366, 0.3490196168422699, 0.3490196168422699), (0.6596638560295105, 0.34509804844856262, 0.34509804844856262), (0.66386556625366211, 0.33725491166114807, 0.33725491166114807), (0.66806721687316895, 0.3333333432674408, 0.3333333432674408), (0.67226892709732056, 0.32941177487373352, 0.32941177487373352), (0.67647057771682739, 0.32549020648002625, 0.32549020648002625), (0.680672287940979, 0.32156863808631897, 0.32156863808631897), (0.68487393856048584, 0.31764706969261169, 0.31764706969261169), (0.68907564878463745, 0.31372550129890442, 0.31372550129890442), (0.69327729940414429, 0.30980393290519714, 0.30980393290519714), (0.6974790096282959, 0.30588236451148987, 0.30588236451148987), (0.70168066024780273, 0.30196079611778259, 0.30196079611778259), (0.70588237047195435, 0.29803922772407532, 0.29803922772407532), (0.71008402109146118, 0.29411765933036804, 0.29411765933036804), (0.71428573131561279, 0.29019609093666077, 0.29019609093666077), (0.71848738193511963, 0.28627452254295349, 0.28627452254295349), (0.72268909215927124, 0.28235295414924622, 0.28235295414924622), (0.72689074277877808, 0.27450981736183167, 0.27450981736183167), (0.73109245300292969, 0.27058824896812439, 0.27058824896812439), (0.73529410362243652, 0.26666668057441711, 0.26666668057441711), (0.73949581384658813, 0.26274511218070984, 0.26274511218070984), (0.74369746446609497, 0.25882354378700256, 0.25882354378700256), (0.74789917469024658, 0.25490197539329529, 0.25490197539329529), (0.75210082530975342, 0.25098040699958801, 0.25098040699958801), (0.75630253553390503, 0.24705882370471954, 0.24705882370471954), (0.76050418615341187, 0.24313725531101227, 0.24313725531101227), (0.76470589637756348, 0.23921568691730499, 0.23921568691730499), (0.76890754699707031, 0.23529411852359772, 0.23529411852359772), (0.77310925722122192, 0.23137255012989044, 0.23137255012989044), (0.77731090784072876, 0.22745098173618317, 0.22745098173618317), (0.78151261806488037, 0.22352941334247589, 0.22352941334247589), (0.78571426868438721, 0.21960784494876862, 0.21960784494876862), (0.78991597890853882, 0.21176470816135406, 0.21176470816135406), (0.79411762952804565, 0.20784313976764679, 0.20784313976764679), (0.79831933975219727, 0.20392157137393951, 0.20392157137393951), (0.8025209903717041, 0.20000000298023224, 0.20000000298023224), (0.80672270059585571, 0.19607843458652496, 0.19607843458652496), (0.81092435121536255, 0.19215686619281769, 0.19215686619281769), (0.81512606143951416, 0.18823529779911041, 0.18823529779911041), (0.819327712059021, 0.18431372940540314, 0.18431372940540314), (0.82352942228317261, 0.18039216101169586, 0.18039216101169586), (0.82773107290267944, 0.17647059261798859, 0.17647059261798859), (0.83193278312683105, 0.17254902422428131, 0.17254902422428131), (0.83613443374633789, 0.16862745583057404, 0.16862745583057404), (0.8403361439704895, 0.16470588743686676, 0.16470588743686676), (0.84453779458999634, 0.16078431904315948, 0.16078431904315948), (0.84873950481414795, 0.15686275064945221, 0.15686275064945221), (0.85294115543365479, 0.14901961386203766, 0.14901961386203766), (0.8571428656578064, 0.14509804546833038, 0.14509804546833038), (0.86134451627731323, 0.14117647707462311, 0.14117647707462311), (0.86554622650146484, 0.13725490868091583, 0.13725490868091583), (0.86974787712097168, 0.13333334028720856, 0.13333334028720856), (0.87394958734512329, 0.12941177189350128, 0.12941177189350128), (0.87815123796463013, 0.12549020349979401, 0.12549020349979401), (0.88235294818878174, 0.12156862765550613, 0.12156862765550613), (0.88655459880828857, 0.11764705926179886, 0.11764705926179886), (0.89075630903244019, 0.11372549086809158, 0.11372549086809158), (0.89495795965194702, 0.10980392247438431, 0.10980392247438431), (0.89915966987609863, 0.10588235408067703, 0.10588235408067703), (0.90336132049560547, 0.10196078568696976, 0.10196078568696976), (0.90756303071975708, 0.098039217293262482, 0.098039217293262482), (0.91176468133926392, 0.094117648899555206, 0.094117648899555206), (0.91596639156341553, 0.086274512112140656, 0.086274512112140656), (0.92016804218292236, 0.08235294371843338, 0.08235294371843338), (0.92436975240707397, 0.078431375324726105, 0.078431375324726105), (0.92857140302658081, 0.074509806931018829, 0.074509806931018829), (0.93277311325073242, 0.070588238537311554, 0.070588238537311554), (0.93697476387023926, 0.066666670143604279, 0.066666670143604279), (0.94117647409439087, 0.062745101749897003, 0.062745101749897003), (0.94537812471389771, 0.058823529630899429, 0.058823529630899429), (0.94957983493804932, 0.054901961237192154, 0.054901961237192154), (0.95378148555755615, 0.050980392843484879, 0.050980392843484879), (0.95798319578170776, 0.047058824449777603, 0.047058824449777603), (0.9621848464012146, 0.043137256056070328, 0.043137256056070328), (0.96638655662536621, 0.039215687662363052, 0.039215687662363052), (0.97058820724487305, 0.035294119268655777, 0.035294119268655777), (0.97478991746902466, 0.031372550874948502, 0.031372550874948502), (0.97899156808853149, 0.023529412224888802, 0.023529412224888802), (0.98319327831268311, 0.019607843831181526, 0.019607843831181526), (0.98739492893218994, 0.015686275437474251, 0.015686275437474251), (0.99159663915634155, 0.011764706112444401, 0.011764706112444401), (0.99579828977584839, 0.0078431377187371254, 0.0078431377187371254), (1.0, 0.0039215688593685627, 0.0039215688593685627), ], "green": [ (0.0, 1.0, 1.0), (0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), (0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), (0.012605042196810246, 0.98823529481887817, 0.98823529481887817), (0.016806723549962044, 0.9843137264251709, 0.9843137264251709), (0.021008403971791267, 0.98039215803146362, 0.98039215803146362), (0.025210084393620491, 0.97647058963775635, 0.97647058963775635), (0.029411764815449715, 0.97254902124404907, 0.97254902124404907), (0.033613447099924088, 0.96470588445663452, 0.96470588445663452), (0.037815127521753311, 0.96078431606292725, 0.96078431606292725), (0.042016807943582535, 0.95686274766921997, 0.95686274766921997), (0.046218488365411758, 0.9529411792755127, 0.9529411792755127), (0.050420168787240982, 0.94901961088180542, 0.94901961088180542), (0.054621849209070206, 0.94509804248809814, 0.94509804248809814), (0.058823529630899429, 0.94117647409439087, 0.94117647409439087), (0.063025213778018951, 0.93725490570068359, 0.93725490570068359), (0.067226894199848175, 0.93333333730697632, 0.93333333730697632), (0.071428574621677399, 0.92941176891326904, 0.92941176891326904), (0.075630255043506622, 0.92549020051956177, 0.92549020051956177), (0.079831935465335846, 0.92156863212585449, 0.92156863212585449), (0.08403361588716507, 0.91764706373214722, 0.91764706373214722), (0.088235296308994293, 0.91372549533843994, 0.91372549533843994), (0.092436976730823517, 0.90980392694473267, 0.90980392694473267), (0.09663865715265274, 0.90196079015731812, 0.90196079015731812), (0.10084033757448196, 0.89803922176361084, 0.89803922176361084), (0.10504201799631119, 0.89411765336990356, 0.89411765336990356), (0.10924369841814041, 0.89019608497619629, 0.89019608497619629), (0.11344537883996964, 0.88627451658248901, 0.88627451658248901), (0.11764705926179886, 0.88235294818878174, 0.88235294818878174), (0.12184873968362808, 0.87843137979507446, 0.87843137979507446), (0.1260504275560379, 0.87450981140136719, 0.87450981140136719), (0.13025210797786713, 0.87058824300765991, 0.87058824300765991), (0.13445378839969635, 0.86666667461395264, 0.86666667461395264), (0.13865546882152557, 0.86274510622024536, 0.86274510622024536), (0.1428571492433548, 0.85882353782653809, 0.85882353782653809), (0.14705882966518402, 0.85490196943283081, 0.85490196943283081), (0.15126051008701324, 0.85098040103912354, 0.85098040103912354), (0.15546219050884247, 0.84705883264541626, 0.84705883264541626), (0.15966387093067169, 0.83921569585800171, 0.83921569585800171), (0.16386555135250092, 0.83529412746429443, 0.83529412746429443), (0.16806723177433014, 0.83137255907058716, 0.83137255907058716), (0.17226891219615936, 0.82745099067687988, 0.82745099067687988), (0.17647059261798859, 0.82352942228317261, 0.82352942228317261), (0.18067227303981781, 0.81960785388946533, 0.81960785388946533), (0.18487395346164703, 0.81568628549575806, 0.81568628549575806), (0.18907563388347626, 0.81176471710205078, 0.81176471710205078), (0.19327731430530548, 0.80784314870834351, 0.80784314870834351), (0.1974789947271347, 0.80392158031463623, 0.80392158031463623), (0.20168067514896393, 0.80000001192092896, 0.80000001192092896), (0.20588235557079315, 0.79607844352722168, 0.79607844352722168), (0.21008403599262238, 0.7921568751335144, 0.7921568751335144), (0.2142857164144516, 0.78823530673980713, 0.78823530673980713), (0.21848739683628082, 0.78431373834609985, 0.78431373834609985), (0.22268907725811005, 0.7764706015586853, 0.7764706015586853), (0.22689075767993927, 0.77254903316497803, 0.77254903316497803), (0.23109243810176849, 0.76862746477127075, 0.76862746477127075), (0.23529411852359772, 0.76470589637756348, 0.76470589637756348), (0.23949579894542694, 0.7607843279838562, 0.7607843279838562), (0.24369747936725616, 0.75686275959014893, 0.75686275959014893), (0.24789915978908539, 0.75294119119644165, 0.75294119119644165), (0.25210085511207581, 0.74901962280273438, 0.74901962280273438), (0.25630253553390503, 0.7450980544090271, 0.7450980544090271), (0.26050421595573425, 0.74117648601531982, 0.74117648601531982), (0.26470589637756348, 0.73725491762161255, 0.73725491762161255), (0.2689075767993927, 0.73333334922790527, 0.73333334922790527), (0.27310925722122192, 0.729411780834198, 0.729411780834198), (0.27731093764305115, 0.72549021244049072, 0.72549021244049072), (0.28151261806488037, 0.72156864404678345, 0.72156864404678345), (0.28571429848670959, 0.7137255072593689, 0.7137255072593689), (0.28991597890853882, 0.70980393886566162, 0.70980393886566162), (0.29411765933036804, 0.70588237047195435, 0.70588237047195435), (0.29831933975219727, 0.70196080207824707, 0.70196080207824707), (0.30252102017402649, 0.69803923368453979, 0.69803923368453979), (0.30672270059585571, 0.69411766529083252, 0.69411766529083252), (0.31092438101768494, 0.69019609689712524, 0.69019609689712524), (0.31512606143951416, 0.68627452850341797, 0.68627452850341797), (0.31932774186134338, 0.68235296010971069, 0.68235296010971069), (0.32352942228317261, 0.67843139171600342, 0.67843139171600342), (0.32773110270500183, 0.67450982332229614, 0.67450982332229614), (0.33193278312683105, 0.67058825492858887, 0.67058825492858887), (0.33613446354866028, 0.66666668653488159, 0.66666668653488159), (0.3403361439704895, 0.66274511814117432, 0.66274511814117432), (0.34453782439231873, 0.65882354974746704, 0.65882354974746704), (0.34873950481414795, 0.65098041296005249, 0.65098041296005249), (0.35294118523597717, 0.64705884456634521, 0.64705884456634521), (0.3571428656578064, 0.64313727617263794, 0.64313727617263794), (0.36134454607963562, 0.63921570777893066, 0.63921570777893066), (0.36554622650146484, 0.63529413938522339, 0.63529413938522339), (0.36974790692329407, 0.63137257099151611, 0.63137257099151611), (0.37394958734512329, 0.62745100259780884, 0.62745100259780884), (0.37815126776695251, 0.62352943420410156, 0.62352943420410156), (0.38235294818878174, 0.61960786581039429, 0.61960786581039429), (0.38655462861061096, 0.61568629741668701, 0.61568629741668701), (0.39075630903244019, 0.61176472902297974, 0.61176472902297974), (0.39495798945426941, 0.60784316062927246, 0.60784316062927246), (0.39915966987609863, 0.60392159223556519, 0.60392159223556519), (0.40336135029792786, 0.60000002384185791, 0.60000002384185791), (0.40756303071975708, 0.59607845544815063, 0.59607845544815063), (0.4117647111415863, 0.58823531866073608, 0.58823531866073608), (0.41596639156341553, 0.58431375026702881, 0.58431375026702881), (0.42016807198524475, 0.58039218187332153, 0.58039218187332153), (0.42436975240707397, 0.57647061347961426, 0.57647061347961426), (0.4285714328289032, 0.57254904508590698, 0.57254904508590698), (0.43277311325073242, 0.56862747669219971, 0.56862747669219971), (0.43697479367256165, 0.56470590829849243, 0.56470590829849243), (0.44117647409439087, 0.56078433990478516, 0.56078433990478516), (0.44537815451622009, 0.55686277151107788, 0.55686277151107788), (0.44957983493804932, 0.55294120311737061, 0.55294120311737061), (0.45378151535987854, 0.54901963472366333, 0.54901963472366333), (0.45798319578170776, 0.54509806632995605, 0.54509806632995605), (0.46218487620353699, 0.54117649793624878, 0.54117649793624878), (0.46638655662536621, 0.5372549295425415, 0.5372549295425415), (0.47058823704719543, 0.53333336114883423, 0.53333336114883423), (0.47478991746902466, 0.52549022436141968, 0.52549022436141968), (0.47899159789085388, 0.5215686559677124, 0.5215686559677124), (0.48319327831268311, 0.51764708757400513, 0.51764708757400513), (0.48739495873451233, 0.51372551918029785, 0.51372551918029785), (0.49159663915634155, 0.50980395078659058, 0.50980395078659058), (0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, 0.50196081399917603, 0.50196081399917603), (0.50420171022415161, 0.49803921580314636, 0.49803921580314636), (0.50840336084365845, 0.49411764740943909, 0.49411764740943909), (0.51260507106781006, 0.49019607901573181, 0.49019607901573181), (0.51680672168731689, 0.48627451062202454, 0.48627451062202454), (0.52100843191146851, 0.48235294222831726, 0.48235294222831726), (0.52521008253097534, 0.47843137383460999, 0.47843137383460999), (0.52941179275512695, 0.47450980544090271, 0.47450980544090271), (0.53361344337463379, 0.47058823704719543, 0.47058823704719543), (0.5378151535987854, 0.46274510025978088, 0.46274510025978088), (0.54201680421829224, 0.45882353186607361, 0.45882353186607361), (0.54621851444244385, 0.45490196347236633, 0.45490196347236633), (0.55042016506195068, 0.45098039507865906, 0.45098039507865906), (0.55462187528610229, 0.44705882668495178, 0.44705882668495178), (0.55882352590560913, 0.44313725829124451, 0.44313725829124451), (0.56302523612976074, 0.43921568989753723, 0.43921568989753723), (0.56722688674926758, 0.43529412150382996, 0.43529412150382996), (0.57142859697341919, 0.43137255311012268, 0.43137255311012268), (0.57563024759292603, 0.42745098471641541, 0.42745098471641541), (0.57983195781707764, 0.42352941632270813, 0.42352941632270813), (0.58403360843658447, 0.41960784792900085, 0.41960784792900085), (0.58823531866073608, 0.41568627953529358, 0.41568627953529358), (0.59243696928024292, 0.4117647111415863, 0.4117647111415863), (0.59663867950439453, 0.40784314274787903, 0.40784314274787903), (0.60084033012390137, 0.40000000596046448, 0.40000000596046448), (0.60504204034805298, 0.3960784375667572, 0.3960784375667572), (0.60924369096755981, 0.39215686917304993, 0.39215686917304993), (0.61344540119171143, 0.38823530077934265, 0.38823530077934265), (0.61764705181121826, 0.38431373238563538, 0.38431373238563538), (0.62184876203536987, 0.3803921639919281, 0.3803921639919281), (0.62605041265487671, 0.37647059559822083, 0.37647059559822083), (0.63025212287902832, 0.37254902720451355, 0.37254902720451355), (0.63445377349853516, 0.36862745881080627, 0.36862745881080627), (0.63865548372268677, 0.364705890417099, 0.364705890417099), (0.6428571343421936, 0.36078432202339172, 0.36078432202339172), (0.64705884456634521, 0.35686275362968445, 0.35686275362968445), (0.65126049518585205, 0.35294118523597717, 0.35294118523597717), (0.65546220541000366, 0.3490196168422699, 0.3490196168422699), (0.6596638560295105, 0.34509804844856262, 0.34509804844856262), (0.66386556625366211, 0.33725491166114807, 0.33725491166114807), (0.66806721687316895, 0.3333333432674408, 0.3333333432674408), (0.67226892709732056, 0.32941177487373352, 0.32941177487373352), (0.67647057771682739, 0.32549020648002625, 0.32549020648002625), (0.680672287940979, 0.32156863808631897, 0.32156863808631897), (0.68487393856048584, 0.31764706969261169, 0.31764706969261169), (0.68907564878463745, 0.31372550129890442, 0.31372550129890442), (0.69327729940414429, 0.30980393290519714, 0.30980393290519714), (0.6974790096282959, 0.30588236451148987, 0.30588236451148987), (0.70168066024780273, 0.30196079611778259, 0.30196079611778259), (0.70588237047195435, 0.29803922772407532, 0.29803922772407532), (0.71008402109146118, 0.29411765933036804, 0.29411765933036804), (0.71428573131561279, 0.29019609093666077, 0.29019609093666077), (0.71848738193511963, 0.28627452254295349, 0.28627452254295349), (0.72268909215927124, 0.28235295414924622, 0.28235295414924622), (0.72689074277877808, 0.27450981736183167, 0.27450981736183167), (0.73109245300292969, 0.27058824896812439, 0.27058824896812439), (0.73529410362243652, 0.26666668057441711, 0.26666668057441711), (0.73949581384658813, 0.26274511218070984, 0.26274511218070984), (0.74369746446609497, 0.25882354378700256, 0.25882354378700256), (0.74789917469024658, 0.25490197539329529, 0.25490197539329529), (0.75210082530975342, 0.25098040699958801, 0.25098040699958801), (0.75630253553390503, 0.24705882370471954, 0.24705882370471954), (0.76050418615341187, 0.24313725531101227, 0.24313725531101227), (0.76470589637756348, 0.23921568691730499, 0.23921568691730499), (0.76890754699707031, 0.23529411852359772, 0.23529411852359772), (0.77310925722122192, 0.23137255012989044, 0.23137255012989044), (0.77731090784072876, 0.22745098173618317, 0.22745098173618317), (0.78151261806488037, 0.22352941334247589, 0.22352941334247589), (0.78571426868438721, 0.21960784494876862, 0.21960784494876862), (0.78991597890853882, 0.21176470816135406, 0.21176470816135406), (0.79411762952804565, 0.20784313976764679, 0.20784313976764679), (0.79831933975219727, 0.20392157137393951, 0.20392157137393951), (0.8025209903717041, 0.20000000298023224, 0.20000000298023224), (0.80672270059585571, 0.19607843458652496, 0.19607843458652496), (0.81092435121536255, 0.19215686619281769, 0.19215686619281769), (0.81512606143951416, 0.18823529779911041, 0.18823529779911041), (0.819327712059021, 0.18431372940540314, 0.18431372940540314), (0.82352942228317261, 0.18039216101169586, 0.18039216101169586), (0.82773107290267944, 0.17647059261798859, 0.17647059261798859), (0.83193278312683105, 0.17254902422428131, 0.17254902422428131), (0.83613443374633789, 0.16862745583057404, 0.16862745583057404), (0.8403361439704895, 0.16470588743686676, 0.16470588743686676), (0.84453779458999634, 0.16078431904315948, 0.16078431904315948), (0.84873950481414795, 0.15686275064945221, 0.15686275064945221), (0.85294115543365479, 0.14901961386203766, 0.14901961386203766), (0.8571428656578064, 0.14509804546833038, 0.14509804546833038), (0.86134451627731323, 0.14117647707462311, 0.14117647707462311), (0.86554622650146484, 0.13725490868091583, 0.13725490868091583), (0.86974787712097168, 0.13333334028720856, 0.13333334028720856), (0.87394958734512329, 0.12941177189350128, 0.12941177189350128), (0.87815123796463013, 0.12549020349979401, 0.12549020349979401), (0.88235294818878174, 0.12156862765550613, 0.12156862765550613), (0.88655459880828857, 0.11764705926179886, 0.11764705926179886), (0.89075630903244019, 0.11372549086809158, 0.11372549086809158), (0.89495795965194702, 0.10980392247438431, 0.10980392247438431), (0.89915966987609863, 0.10588235408067703, 0.10588235408067703), (0.90336132049560547, 0.10196078568696976, 0.10196078568696976), (0.90756303071975708, 0.098039217293262482, 0.098039217293262482), (0.91176468133926392, 0.094117648899555206, 0.094117648899555206), (0.91596639156341553, 0.086274512112140656, 0.086274512112140656), (0.92016804218292236, 0.08235294371843338, 0.08235294371843338), (0.92436975240707397, 0.078431375324726105, 0.078431375324726105), (0.92857140302658081, 0.074509806931018829, 0.074509806931018829), (0.93277311325073242, 0.070588238537311554, 0.070588238537311554), (0.93697476387023926, 0.066666670143604279, 0.066666670143604279), (0.94117647409439087, 0.062745101749897003, 0.062745101749897003), (0.94537812471389771, 0.058823529630899429, 0.058823529630899429), (0.94957983493804932, 0.054901961237192154, 0.054901961237192154), (0.95378148555755615, 0.050980392843484879, 0.050980392843484879), (0.95798319578170776, 0.047058824449777603, 0.047058824449777603), (0.9621848464012146, 0.043137256056070328, 0.043137256056070328), (0.96638655662536621, 0.039215687662363052, 0.039215687662363052), (0.97058820724487305, 0.035294119268655777, 0.035294119268655777), (0.97478991746902466, 0.031372550874948502, 0.031372550874948502), (0.97899156808853149, 0.023529412224888802, 0.023529412224888802), (0.98319327831268311, 0.019607843831181526, 0.019607843831181526), (0.98739492893218994, 0.015686275437474251, 0.015686275437474251), (0.99159663915634155, 0.011764706112444401, 0.011764706112444401), (0.99579828977584839, 0.0078431377187371254, 0.0078431377187371254), (1.0, 0.0039215688593685627, 0.0039215688593685627), ], "red": [ (0.0, 1.0, 1.0), (0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), (0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), (0.012605042196810246, 0.98823529481887817, 0.98823529481887817), (0.016806723549962044, 0.9843137264251709, 0.9843137264251709), (0.021008403971791267, 0.98039215803146362, 0.98039215803146362), (0.025210084393620491, 0.97647058963775635, 0.97647058963775635), (0.029411764815449715, 0.97254902124404907, 0.97254902124404907), (0.033613447099924088, 0.96470588445663452, 0.96470588445663452), (0.037815127521753311, 0.96078431606292725, 0.96078431606292725), (0.042016807943582535, 0.95686274766921997, 0.95686274766921997), (0.046218488365411758, 0.9529411792755127, 0.9529411792755127), (0.050420168787240982, 0.94901961088180542, 0.94901961088180542), (0.054621849209070206, 0.94509804248809814, 0.94509804248809814), (0.058823529630899429, 0.94117647409439087, 0.94117647409439087), (0.063025213778018951, 0.93725490570068359, 0.93725490570068359), (0.067226894199848175, 0.93333333730697632, 0.93333333730697632), (0.071428574621677399, 0.92941176891326904, 0.92941176891326904), (0.075630255043506622, 0.92549020051956177, 0.92549020051956177), (0.079831935465335846, 0.92156863212585449, 0.92156863212585449), (0.08403361588716507, 0.91764706373214722, 0.91764706373214722), (0.088235296308994293, 0.91372549533843994, 0.91372549533843994), (0.092436976730823517, 0.90980392694473267, 0.90980392694473267), (0.09663865715265274, 0.90196079015731812, 0.90196079015731812), (0.10084033757448196, 0.89803922176361084, 0.89803922176361084), (0.10504201799631119, 0.89411765336990356, 0.89411765336990356), (0.10924369841814041, 0.89019608497619629, 0.89019608497619629), (0.11344537883996964, 0.88627451658248901, 0.88627451658248901), (0.11764705926179886, 0.88235294818878174, 0.88235294818878174), (0.12184873968362808, 0.87843137979507446, 0.87843137979507446), (0.1260504275560379, 0.87450981140136719, 0.87450981140136719), (0.13025210797786713, 0.87058824300765991, 0.87058824300765991), (0.13445378839969635, 0.86666667461395264, 0.86666667461395264), (0.13865546882152557, 0.86274510622024536, 0.86274510622024536), (0.1428571492433548, 0.85882353782653809, 0.85882353782653809), (0.14705882966518402, 0.85490196943283081, 0.85490196943283081), (0.15126051008701324, 0.85098040103912354, 0.85098040103912354), (0.15546219050884247, 0.84705883264541626, 0.84705883264541626), (0.15966387093067169, 0.83921569585800171, 0.83921569585800171), (0.16386555135250092, 0.83529412746429443, 0.83529412746429443), (0.16806723177433014, 0.83137255907058716, 0.83137255907058716), (0.17226891219615936, 0.82745099067687988, 0.82745099067687988), (0.17647059261798859, 0.82352942228317261, 0.82352942228317261), (0.18067227303981781, 0.81960785388946533, 0.81960785388946533), (0.18487395346164703, 0.81568628549575806, 0.81568628549575806), (0.18907563388347626, 0.81176471710205078, 0.81176471710205078), (0.19327731430530548, 0.80784314870834351, 0.80784314870834351), (0.1974789947271347, 0.80392158031463623, 0.80392158031463623), (0.20168067514896393, 0.80000001192092896, 0.80000001192092896), (0.20588235557079315, 0.79607844352722168, 0.79607844352722168), (0.21008403599262238, 0.7921568751335144, 0.7921568751335144), (0.2142857164144516, 0.78823530673980713, 0.78823530673980713), (0.21848739683628082, 0.78431373834609985, 0.78431373834609985), (0.22268907725811005, 0.7764706015586853, 0.7764706015586853), (0.22689075767993927, 0.77254903316497803, 0.77254903316497803), (0.23109243810176849, 0.76862746477127075, 0.76862746477127075), (0.23529411852359772, 0.76470589637756348, 0.76470589637756348), (0.23949579894542694, 0.7607843279838562, 0.7607843279838562), (0.24369747936725616, 0.75686275959014893, 0.75686275959014893), (0.24789915978908539, 0.75294119119644165, 0.75294119119644165), (0.25210085511207581, 0.74901962280273438, 0.74901962280273438), (0.25630253553390503, 0.7450980544090271, 0.7450980544090271), (0.26050421595573425, 0.74117648601531982, 0.74117648601531982), (0.26470589637756348, 0.73725491762161255, 0.73725491762161255), (0.2689075767993927, 0.73333334922790527, 0.73333334922790527), (0.27310925722122192, 0.729411780834198, 0.729411780834198), (0.27731093764305115, 0.72549021244049072, 0.72549021244049072), (0.28151261806488037, 0.72156864404678345, 0.72156864404678345), (0.28571429848670959, 0.7137255072593689, 0.7137255072593689), (0.28991597890853882, 0.70980393886566162, 0.70980393886566162), (0.29411765933036804, 0.70588237047195435, 0.70588237047195435), (0.29831933975219727, 0.70196080207824707, 0.70196080207824707), (0.30252102017402649, 0.69803923368453979, 0.69803923368453979), (0.30672270059585571, 0.69411766529083252, 0.69411766529083252), (0.31092438101768494, 0.69019609689712524, 0.69019609689712524), (0.31512606143951416, 0.68627452850341797, 0.68627452850341797), (0.31932774186134338, 0.68235296010971069, 0.68235296010971069), (0.32352942228317261, 0.67843139171600342, 0.67843139171600342), (0.32773110270500183, 0.67450982332229614, 0.67450982332229614), (0.33193278312683105, 0.67058825492858887, 0.67058825492858887), (0.33613446354866028, 0.66666668653488159, 0.66666668653488159), (0.3403361439704895, 0.66274511814117432, 0.66274511814117432), (0.34453782439231873, 0.65882354974746704, 0.65882354974746704), (0.34873950481414795, 0.65098041296005249, 0.65098041296005249), (0.35294118523597717, 0.64705884456634521, 0.64705884456634521), (0.3571428656578064, 0.64313727617263794, 0.64313727617263794), (0.36134454607963562, 0.63921570777893066, 0.63921570777893066), (0.36554622650146484, 0.63529413938522339, 0.63529413938522339), (0.36974790692329407, 0.63137257099151611, 0.63137257099151611), (0.37394958734512329, 0.62745100259780884, 0.62745100259780884), (0.37815126776695251, 0.62352943420410156, 0.62352943420410156), (0.38235294818878174, 0.61960786581039429, 0.61960786581039429), (0.38655462861061096, 0.61568629741668701, 0.61568629741668701), (0.39075630903244019, 0.61176472902297974, 0.61176472902297974), (0.39495798945426941, 0.60784316062927246, 0.60784316062927246), (0.39915966987609863, 0.60392159223556519, 0.60392159223556519), (0.40336135029792786, 0.60000002384185791, 0.60000002384185791), (0.40756303071975708, 0.59607845544815063, 0.59607845544815063), (0.4117647111415863, 0.58823531866073608, 0.58823531866073608), (0.41596639156341553, 0.58431375026702881, 0.58431375026702881), (0.42016807198524475, 0.58039218187332153, 0.58039218187332153), (0.42436975240707397, 0.57647061347961426, 0.57647061347961426), (0.4285714328289032, 0.57254904508590698, 0.57254904508590698), (0.43277311325073242, 0.56862747669219971, 0.56862747669219971), (0.43697479367256165, 0.56470590829849243, 0.56470590829849243), (0.44117647409439087, 0.56078433990478516, 0.56078433990478516), (0.44537815451622009, 0.55686277151107788, 0.55686277151107788), (0.44957983493804932, 0.55294120311737061, 0.55294120311737061), (0.45378151535987854, 0.54901963472366333, 0.54901963472366333), (0.45798319578170776, 0.54509806632995605, 0.54509806632995605), (0.46218487620353699, 0.54117649793624878, 0.54117649793624878), (0.46638655662536621, 0.5372549295425415, 0.5372549295425415), (0.47058823704719543, 0.53333336114883423, 0.53333336114883423), (0.47478991746902466, 0.52549022436141968, 0.52549022436141968), (0.47899159789085388, 0.5215686559677124, 0.5215686559677124), (0.48319327831268311, 0.51764708757400513, 0.51764708757400513), (0.48739495873451233, 0.51372551918029785, 0.51372551918029785), (0.49159663915634155, 0.50980395078659058, 0.50980395078659058), (0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, 0.50196081399917603, 0.50196081399917603), (0.50420171022415161, 0.49803921580314636, 0.49803921580314636), (0.50840336084365845, 0.49411764740943909, 0.49411764740943909), (0.51260507106781006, 0.49019607901573181, 0.49019607901573181), (0.51680672168731689, 0.48627451062202454, 0.48627451062202454), (0.52100843191146851, 0.48235294222831726, 0.48235294222831726), (0.52521008253097534, 0.47843137383460999, 0.47843137383460999), (0.52941179275512695, 0.47450980544090271, 0.47450980544090271), (0.53361344337463379, 0.47058823704719543, 0.47058823704719543), (0.5378151535987854, 0.46274510025978088, 0.46274510025978088), (0.54201680421829224, 0.45882353186607361, 0.45882353186607361), (0.54621851444244385, 0.45490196347236633, 0.45490196347236633), (0.55042016506195068, 0.45098039507865906, 0.45098039507865906), (0.55462187528610229, 0.44705882668495178, 0.44705882668495178), (0.55882352590560913, 0.44313725829124451, 0.44313725829124451), (0.56302523612976074, 0.43921568989753723, 0.43921568989753723), (0.56722688674926758, 0.43529412150382996, 0.43529412150382996), (0.57142859697341919, 0.43137255311012268, 0.43137255311012268), (0.57563024759292603, 0.42745098471641541, 0.42745098471641541), (0.57983195781707764, 0.42352941632270813, 0.42352941632270813), (0.58403360843658447, 0.41960784792900085, 0.41960784792900085), (0.58823531866073608, 0.41568627953529358, 0.41568627953529358), (0.59243696928024292, 0.4117647111415863, 0.4117647111415863), (0.59663867950439453, 0.40784314274787903, 0.40784314274787903), (0.60084033012390137, 0.40000000596046448, 0.40000000596046448), (0.60504204034805298, 0.3960784375667572, 0.3960784375667572), (0.60924369096755981, 0.39215686917304993, 0.39215686917304993), (0.61344540119171143, 0.38823530077934265, 0.38823530077934265), (0.61764705181121826, 0.38431373238563538, 0.38431373238563538), (0.62184876203536987, 0.3803921639919281, 0.3803921639919281), (0.62605041265487671, 0.37647059559822083, 0.37647059559822083), (0.63025212287902832, 0.37254902720451355, 0.37254902720451355), (0.63445377349853516, 0.36862745881080627, 0.36862745881080627), (0.63865548372268677, 0.364705890417099, 0.364705890417099), (0.6428571343421936, 0.36078432202339172, 0.36078432202339172), (0.64705884456634521, 0.35686275362968445, 0.35686275362968445), (0.65126049518585205, 0.35294118523597717, 0.35294118523597717), (0.65546220541000366, 0.3490196168422699, 0.3490196168422699), (0.6596638560295105, 0.34509804844856262, 0.34509804844856262), (0.66386556625366211, 0.33725491166114807, 0.33725491166114807), (0.66806721687316895, 0.3333333432674408, 0.3333333432674408), (0.67226892709732056, 0.32941177487373352, 0.32941177487373352), (0.67647057771682739, 0.32549020648002625, 0.32549020648002625), (0.680672287940979, 0.32156863808631897, 0.32156863808631897), (0.68487393856048584, 0.31764706969261169, 0.31764706969261169), (0.68907564878463745, 0.31372550129890442, 0.31372550129890442), (0.69327729940414429, 0.30980393290519714, 0.30980393290519714), (0.6974790096282959, 0.30588236451148987, 0.30588236451148987), (0.70168066024780273, 0.30196079611778259, 0.30196079611778259), (0.70588237047195435, 0.29803922772407532, 0.29803922772407532), (0.71008402109146118, 0.29411765933036804, 0.29411765933036804), (0.71428573131561279, 0.29019609093666077, 0.29019609093666077), (0.71848738193511963, 0.28627452254295349, 0.28627452254295349), (0.72268909215927124, 0.28235295414924622, 0.28235295414924622), (0.72689074277877808, 0.27450981736183167, 0.27450981736183167), (0.73109245300292969, 0.27058824896812439, 0.27058824896812439), (0.73529410362243652, 0.26666668057441711, 0.26666668057441711), (0.73949581384658813, 0.26274511218070984, 0.26274511218070984), (0.74369746446609497, 0.25882354378700256, 0.25882354378700256), (0.74789917469024658, 0.25490197539329529, 0.25490197539329529), (0.75210082530975342, 0.25098040699958801, 0.25098040699958801), (0.75630253553390503, 0.24705882370471954, 0.24705882370471954), (0.76050418615341187, 0.24313725531101227, 0.24313725531101227), (0.76470589637756348, 0.23921568691730499, 0.23921568691730499), (0.76890754699707031, 0.23529411852359772, 0.23529411852359772), (0.77310925722122192, 0.23137255012989044, 0.23137255012989044), (0.77731090784072876, 0.22745098173618317, 0.22745098173618317), (0.78151261806488037, 0.22352941334247589, 0.22352941334247589), (0.78571426868438721, 0.21960784494876862, 0.21960784494876862), (0.78991597890853882, 0.21176470816135406, 0.21176470816135406), (0.79411762952804565, 0.20784313976764679, 0.20784313976764679), (0.79831933975219727, 0.20392157137393951, 0.20392157137393951), (0.8025209903717041, 0.20000000298023224, 0.20000000298023224), (0.80672270059585571, 0.19607843458652496, 0.19607843458652496), (0.81092435121536255, 0.19215686619281769, 0.19215686619281769), (0.81512606143951416, 0.18823529779911041, 0.18823529779911041), (0.819327712059021, 0.18431372940540314, 0.18431372940540314), (0.82352942228317261, 0.18039216101169586, 0.18039216101169586), (0.82773107290267944, 0.17647059261798859, 0.17647059261798859), (0.83193278312683105, 0.17254902422428131, 0.17254902422428131), (0.83613443374633789, 0.16862745583057404, 0.16862745583057404), (0.8403361439704895, 0.16470588743686676, 0.16470588743686676), (0.84453779458999634, 0.16078431904315948, 0.16078431904315948), (0.84873950481414795, 0.15686275064945221, 0.15686275064945221), (0.85294115543365479, 0.14901961386203766, 0.14901961386203766), (0.8571428656578064, 0.14509804546833038, 0.14509804546833038), (0.86134451627731323, 0.14117647707462311, 0.14117647707462311), (0.86554622650146484, 0.13725490868091583, 0.13725490868091583), (0.86974787712097168, 0.13333334028720856, 0.13333334028720856), (0.87394958734512329, 0.12941177189350128, 0.12941177189350128), (0.87815123796463013, 0.12549020349979401, 0.12549020349979401), (0.88235294818878174, 0.12156862765550613, 0.12156862765550613), (0.88655459880828857, 0.11764705926179886, 0.11764705926179886), (0.89075630903244019, 0.11372549086809158, 0.11372549086809158), (0.89495795965194702, 0.10980392247438431, 0.10980392247438431), (0.89915966987609863, 0.10588235408067703, 0.10588235408067703), (0.90336132049560547, 0.10196078568696976, 0.10196078568696976), (0.90756303071975708, 0.098039217293262482, 0.098039217293262482), (0.91176468133926392, 0.094117648899555206, 0.094117648899555206), (0.91596639156341553, 0.086274512112140656, 0.086274512112140656), (0.92016804218292236, 0.08235294371843338, 0.08235294371843338), (0.92436975240707397, 0.078431375324726105, 0.078431375324726105), (0.92857140302658081, 0.074509806931018829, 0.074509806931018829), (0.93277311325073242, 0.070588238537311554, 0.070588238537311554), (0.93697476387023926, 0.066666670143604279, 0.066666670143604279), (0.94117647409439087, 0.062745101749897003, 0.062745101749897003), (0.94537812471389771, 0.058823529630899429, 0.058823529630899429), (0.94957983493804932, 0.054901961237192154, 0.054901961237192154), (0.95378148555755615, 0.050980392843484879, 0.050980392843484879), (0.95798319578170776, 0.047058824449777603, 0.047058824449777603), (0.9621848464012146, 0.043137256056070328, 0.043137256056070328), (0.96638655662536621, 0.039215687662363052, 0.039215687662363052), (0.97058820724487305, 0.035294119268655777, 0.035294119268655777), (0.97478991746902466, 0.031372550874948502, 0.031372550874948502), (0.97899156808853149, 0.023529412224888802, 0.023529412224888802), (0.98319327831268311, 0.019607843831181526, 0.019607843831181526), (0.98739492893218994, 0.015686275437474251, 0.015686275437474251), (0.99159663915634155, 0.011764706112444401, 0.011764706112444401), (0.99579828977584839, 0.0078431377187371254, 0.0078431377187371254), (1.0, 0.0039215688593685627, 0.0039215688593685627), ], } datad["Accent"] = _Accent_data datad["Blues"] = _Blues_data datad["BrBG"] = _BrBG_data datad["BuGn"] = _BuGn_data datad["BuPu"] = _BuPu_data datad["Dark2"] = _Dark2_data datad["GnBu"] = _GnBu_data datad["Greens"] = _Greens_data datad["Greys"] = _Greys_data datad["Oranges"] = _Oranges_data datad["OrRd"] = _OrRd_data datad["Paired"] = _Paired_data datad["Pastel1"] = _Pastel1_data datad["Pastel2"] = _Pastel2_data datad["PiYG"] = _PiYG_data datad["PRGn"] = _PRGn_data datad["PuBu"] = _PuBu_data datad["PuBuGn"] = _PuBuGn_data datad["PuOr"] = _PuOr_data datad["PuRd"] = _PuRd_data datad["Purples"] = _Purples_data datad["RdBu"] = _RdBu_data datad["RdGy"] = _RdGy_data datad["RdPu"] = _RdPu_data datad["RdYlBu"] = _RdYlBu_data datad["RdYlGn"] = _RdYlGn_data datad["Reds"] = _Reds_data datad["Set1"] = _Set1_data datad["Set2"] = _Set2_data datad["Set3"] = _Set3_data datad["Spectral"] = _Spectral_data datad["YlGn"] = _YlGn_data datad["YlGnBu"] = _YlGnBu_data datad["YlOrBr"] = _YlOrBr_data datad["YlOrRd"] = _YlOrRd_data datad["gist_earth"] = _gist_earth_data datad["gist_gray"] = _gist_gray_data datad["gist_heat"] = _gist_heat_data datad["gist_ncar"] = _gist_ncar_data datad["gist_rainbow"] = _gist_rainbow_data datad["gist_stern"] = _gist_stern_data datad["gist_yarg"] = _gist_yarg_data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/annotations.py0000666000000000000000000005765300000000000014176 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.annotations ------------------ The `annotations` module provides annotated shapes: * :py:class:`guiqwt.annotations.AnnotatedPoint` * :py:class:`guiqwt.annotations.AnnotatedSegment` * :py:class:`guiqwt.annotations.AnnotatedRectangle` * :py:class:`guiqwt.annotations.AnnotatedObliqueRectangle` * :py:class:`guiqwt.annotations.AnnotatedEllipse` * :py:class:`guiqwt.annotations.AnnotatedCircle` An annotated shape is a plot item (derived from QwtPlotItem) that may be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`. .. seealso:: module :py:mod:`guiqwt.shapes` Examples ~~~~~~~~ An annotated shape may be created: * from the associated plot item class (e.g. `AnnotatedCircle` to create an annotated circle): the item properties are then assigned by creating the appropriate style parameters object (:py:class:`guiqwt.styles.AnnotationParam`) >>> from guiqwt.annotations import AnnotatedCircle >>> from guiqwt.styles import AnnotationParam >>> param = AnnotationParam() >>> param.title = 'My circle' >>> circle_item = AnnotatedCircle(0., 2., 4., 0., param) * or using the `plot item builder` (see :py:func:`guiqwt.builder.make`): >>> from guiqwt.builder import make >>> circle_item = make.annotated_circle(0., 2., 4., 0., title='My circle') Reference ~~~~~~~~~ .. autoclass:: AnnotatedPoint :members: :inherited-members: .. autoclass:: AnnotatedSegment :members: :inherited-members: .. autoclass:: AnnotatedRectangle :members: :inherited-members: .. autoclass:: AnnotatedObliqueRectangle :members: :inherited-members: .. autoclass:: AnnotatedEllipse :members: :inherited-members: .. autoclass:: AnnotatedCircle :members: :inherited-members: """ import numpy as np from guidata.utils import update_dataset, assert_interfaces_valid # Local imports from guiqwt.config import CONF, _ from guiqwt.styles import LabelParam, AnnotationParam from guiqwt.shapes import ( AbstractShape, RectangleShape, EllipseShape, SegmentShape, PointShape, ObliqueRectangleShape, ) from guiqwt.label import DataInfoLabel from guiqwt.interfaces import IBasePlotItem, IShapeItemType, ISerializableType from guiqwt.geometry import ( compute_center, compute_rect_size, compute_distance, compute_angle, ) from guiqwt.baseplot import canvas_to_axes class AnnotatedShape(AbstractShape): """ Construct an annotated shape with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ __implements__ = (IBasePlotItem, ISerializableType) SHAPE_CLASS = None LABEL_ANCHOR = None def __init__(self, annotationparam=None): AbstractShape.__init__(self) assert self.LABEL_ANCHOR is not None self.shape = self.create_shape() self.label = self.create_label() self.area_computations_visible = True if annotationparam is None: self.annotationparam = AnnotationParam( _("Annotation"), icon="annotation.png" ) else: self.annotationparam = annotationparam self.annotationparam.update_annotation(self) def types(self): return (IShapeItemType, ISerializableType) def __reduce__(self): self.annotationparam.update_param(self) state = (self.shape, self.label, self.annotationparam) return (self.__class__, (), state) def __setstate__(self, state): shape, label, param = state self.shape = shape self.label = label self.annotationparam = param self.annotationparam.update_annotation(self) def serialize(self, writer): """Serialize object to HDF5 writer""" writer.write(self.annotationparam, group_name="annotationparam") self.shape.serialize(writer) self.label.serialize(writer) def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.annotationparam = AnnotationParam(_("Annotation"), icon="annotation.png") reader.read("annotationparam", instance=self.annotationparam) self.annotationparam.update_annotation(self) self.shape.deserialize(reader) self.label.deserialize(reader) def set_style(self, section, option): self.shape.set_style(section, option) # ----QwtPlotItem API-------------------------------------------------------- def draw(self, painter, xMap, yMap, canvasRect): self.shape.draw(painter, xMap, yMap, canvasRect) if self.label.isVisible(): self.label.draw(painter, xMap, yMap, canvasRect) # ----Public API------------------------------------------------------------- def create_shape(self): """Return the shape object associated to this annotated shape object""" shape = self.SHAPE_CLASS(0, 0, 1, 1) return shape def create_label(self): """Return the label object associated to this annotated shape object""" label_param = LabelParam(_("Label"), icon="label.png") label_param.read_config(CONF, "plot", "shape/label") label_param.anchor = self.LABEL_ANCHOR return DataInfoLabel(label_param, [self]) def is_label_visible(self): """Return True if associated label is visible""" return self.label.isVisible() def set_label_visible(self, state): """Set the annotated shape's label visibility""" self.label.setVisible(state) def update_label(self): """Update the annotated shape's label contents""" self.label.update_text() def get_text(self): """ Return text associated to current shape (see :py:class:`guiqwt.label.ObjectInfo`) """ text = "" title = self.title().text() if title: text += "%s" % title subtitle = self.annotationparam.subtitle if subtitle: if text: text += "
" text += "%s" % subtitle if self.area_computations_visible: infos = self.get_infos() if infos: if text: text += "
" text += infos return text def x_to_str(self, x): """Convert x (float) to a string (with associated unit and uncertainty)""" param = self.annotationparam if self.plot() is None: return "" else: xunit = self.plot().get_axis_unit(self.xAxis()) fmt = param.format if param.uncertainty: fmt += " ± " + (fmt % (x * param.uncertainty)) if xunit is not None: return (fmt + " " + xunit) % x else: return (fmt) % x def y_to_str(self, y): """Convert y (float) to a string (with associated unit and uncertainty)""" param = self.annotationparam if self.plot() is None: return "" else: yunit = self.plot().get_axis_unit(self.yAxis()) fmt = param.format if param.uncertainty: fmt += " ± " + (fmt % (y * param.uncertainty)) if yunit is not None: return (fmt + " " + yunit) % y else: return (fmt) % y def get_center(self): """Return shape center coordinates: (xc, yc)""" return self.shape.get_center() def get_tr_center(self): """Return shape center coordinates after applying transform matrix""" raise NotImplementedError def get_tr_center_str(self): """Return center coordinates as a string (with units)""" xc, yc = self.get_tr_center() return "( %s ; %s )" % (self.x_to_str(xc), self.y_to_str(yc)) def get_tr_size(self): """Return shape size after applying transform matrix""" raise NotImplementedError def get_tr_size_str(self): """Return size as a string (with units)""" xs, ys = self.get_tr_size() return "%s x %s" % (self.x_to_str(xs), self.y_to_str(ys)) def get_infos(self): """Return formatted string with informations on current shape""" pass def set_label_position(self): """Set label position, for instance based on shape position""" raise NotImplementedError def apply_transform_matrix(self, x, y): V = np.array([x, y, 1.0]) W = np.dot(V, self.annotationparam.transform_matrix) return W[0], W[1] def get_transformed_coords(self, handle1, handle2): x1, y1 = self.apply_transform_matrix(*self.shape.points[handle1]) x2, y2 = self.apply_transform_matrix(*self.shape.points[handle2]) return x1, y1, x2, y2 # ----IBasePlotItem API------------------------------------------------------ def hit_test(self, pos): return self.shape.poly_hit_test(self.plot(), self.xAxis(), self.yAxis(), pos) def move_point_to(self, handle, pos, ctrl=None): self.shape.move_point_to(handle, pos, ctrl) self.set_label_position() if self.plot(): self.plot().SIG_ANNOTATION_CHANGED.emit(self) def move_shape(self, old_pos, new_pos): self.shape.move_shape(old_pos, new_pos) self.label.move_local_shape(old_pos, new_pos) def move_local_shape(self, old_pos, new_pos): old_pt = canvas_to_axes(self, old_pos) new_pt = canvas_to_axes(self, new_pos) self.shape.move_shape(old_pt, new_pt) self.set_label_position() if self.plot(): self.plot().SIG_ITEM_MOVED.emit(self, *(old_pt + new_pt)) self.plot().SIG_ANNOTATION_CHANGED.emit(self) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ self.shape.move_with_selection(delta_x, delta_y) self.label.move_with_selection(delta_x, delta_y) self.plot().SIG_ANNOTATION_CHANGED.emit(self) def select(self): """Select item""" AbstractShape.select(self) self.shape.select() def unselect(self): """Unselect item""" AbstractShape.unselect(self) self.shape.unselect() def get_item_parameters(self, itemparams): self.shape.get_item_parameters(itemparams) self.label.get_item_parameters(itemparams) self.annotationparam.update_param(self) itemparams.add("AnnotationParam", self, self.annotationparam) def set_item_parameters(self, itemparams): self.shape.set_item_parameters(itemparams) self.label.set_item_parameters(itemparams) update_dataset( self.annotationparam, itemparams.get("AnnotationParam"), visible_only=True ) self.annotationparam.update_annotation(self) assert_interfaces_valid(AnnotatedShape) class AnnotatedPoint(AnnotatedShape): """ Construct an annotated point at coordinates (x, y) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = PointShape LABEL_ANCHOR = "TL" def __init__(self, x=0, y=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_pos(x, y) # ----Public API------------------------------------------------------------- def set_pos(self, x, y): """Set the point coordinates to (x, y)""" self.shape.set_pos(x, y) self.set_label_position() def get_pos(self): """Return the point coordinates""" return self.shape.get_pos() # ----AnnotatedShape API----------------------------------------------------- def create_shape(self): """Return the shape object associated to this annotated shape object""" shape = self.SHAPE_CLASS(0, 0) return shape def set_label_position(self): """Set label position, for instance based on shape position""" x, y = self.shape.points[0] self.label.set_pos(x, y) # ----AnnotatedShape API----------------------------------------------------- def get_infos(self): """Return formatted string with informations on current shape""" xt, yt = self.apply_transform_matrix(*self.shape.points[0]) return "( %s ; %s )" % (self.x_to_str(xt), self.y_to_str(yt)) class AnnotatedSegment(AnnotatedShape): """ Construct an annotated segment between coordinates (x1, y1) and (x2, y2) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = SegmentShape LABEL_ANCHOR = "C" def __init__(self, x1=0, y1=0, x2=0, y2=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_rect(x1, y1, x2, y2) # ----Public API------------------------------------------------------------- def set_rect(self, x1, y1, x2, y2): """ Set the coordinates of the shape's top-left corner to (x1, y1), and of its bottom-right corner to (x2, y2). """ self.shape.set_rect(x1, y1, x2, y2) self.set_label_position() def get_rect(self): """ Return the coordinates of the shape's top-left and bottom-right corners """ return self.shape.get_rect() def get_tr_length(self): """Return segment length after applying transform matrix""" return compute_distance(*self.get_transformed_coords(0, 1)) # ----AnnotatedShape API----------------------------------------------------- def set_label_position(self): """Set label position, for instance based on shape position""" x1, y1, x2, y2 = self.get_rect() self.label.set_pos(*compute_center(x1, y1, x2, y2)) # ----AnnotatedShape API----------------------------------------------------- def get_infos(self): """Return formatted string with informations on current shape""" return _("Distance:") + " " + self.x_to_str(self.get_tr_length()) class AnnotatedRectangle(AnnotatedShape): """ Construct an annotated rectangle between coordinates (x1, y1) and (x2, y2) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = RectangleShape LABEL_ANCHOR = "TL" def __init__(self, x1=0, y1=0, x2=0, y2=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_rect(x1, y1, x2, y2) # ----Public API------------------------------------------------------------- def set_rect(self, x1, y1, x2, y2): """ Set the coordinates of the shape's top-left corner to (x1, y1), and of its bottom-right corner to (x2, y2). """ self.shape.set_rect(x1, y1, x2, y2) self.set_label_position() def get_rect(self): """ Return the coordinates of the shape's top-left and bottom-right corners """ return self.shape.get_rect() # ----AnnotatedShape API----------------------------------------------------- def set_label_position(self): """Set label position, for instance based on shape position""" x_label, y_label = self.shape.points.min(axis=0) self.label.set_pos(x_label, y_label) def get_computations_text(self): """Return formatted string with informations on current shape""" tdict = self.get_string_dict() return "%(center_n)s ( %(center)s )
%(size_n)s %(size)s" % tdict def get_tr_center(self): """Return shape center coordinates after applying transform matrix""" return compute_center(*self.get_transformed_coords(0, 2)) def get_tr_size(self): """Return shape size after applying transform matrix""" return compute_rect_size(*self.get_transformed_coords(0, 2)) def get_infos(self): """Return formatted string with informations on current shape""" return "
".join( [ _("Center:") + " " + self.get_tr_center_str(), _("Size:") + " " + self.get_tr_size_str(), ] ) class AnnotatedObliqueRectangle(AnnotatedRectangle): """ Construct an annotated oblique rectangle between coordinates (x0, y0), (x1, y1), (x2, y2) and (x3, y3) with properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = ObliqueRectangleShape LABEL_ANCHOR = "C" def __init__( self, x0=0, y0=0, x1=0, y1=0, x2=0, y2=0, x3=0, y3=0, annotationparam=None ): AnnotatedShape.__init__(self, annotationparam) self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) # ----Public API------------------------------------------------------------- def get_tr_angle(self): """Return X-diameter angle with horizontal direction, after applying transform matrix""" xcoords = self.get_transformed_coords(0, 1) _x, yr1 = self.apply_transform_matrix(1.0, 1.0) _x, yr2 = self.apply_transform_matrix(1.0, 2.0) return (compute_angle(reverse=yr1 > yr2, *xcoords) + 90) % 180 - 90 def get_bounding_rect_coords(self): """Return bounding rectangle coordinates (in plot coordinates)""" return self.shape.get_bounding_rect_coords() # ----AnnotatedShape API----------------------------------------------------- def create_shape(self): """Return the shape object associated to this annotated shape object""" shape = self.SHAPE_CLASS(0, 0, 0, 0, 0, 0, 0, 0) return shape # ----AnnotatedShape API----------------------------------------------------- def set_label_position(self): """Set label position, for instance based on shape position""" self.label.set_pos(*self.get_center()) # ----RectangleShape API----------------------------------------------------- def set_rect(self, x0, y0, x1, y1, x2, y2, x3, y3): """ Set the rectangle corners coordinates: (x0, y0): top-left corner (x1, y1): top-right corner (x2, y2): bottom-right corner (x3, y3): bottom-left corner :: x: additionnal points (x0, y0)------>(x1, y1) ↑ | | | x x | | | ↓ (x3, y3)<------(x2, y2) """ self.shape.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) self.set_label_position() def get_tr_size(self): """Return shape size after applying transform matrix""" dx = compute_distance(*self.get_transformed_coords(0, 1)) dy = compute_distance(*self.get_transformed_coords(0, 3)) return dx, dy # ----AnnotatedShape API----------------------------------------------------- def get_infos(self): """Return formatted string with informations on current shape""" return "
".join( [ _("Center:") + " " + self.get_tr_center_str(), _("Size:") + " " + self.get_tr_size_str(), _("Angle:") + " %.1f°" % self.get_tr_angle(), ] ) class AnnotatedEllipse(AnnotatedShape): """ Construct an annotated ellipse with X-axis diameter between coordinates (x1, y1) and (x2, y2) and properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ SHAPE_CLASS = EllipseShape LABEL_ANCHOR = "C" def __init__(self, x1=0, y1=0, x2=0, y2=0, annotationparam=None): AnnotatedShape.__init__(self, annotationparam) self.set_xdiameter(x1, y1, x2, y2) # ----Public API------------------------------------------------------------- def set_xdiameter(self, x0, y0, x1, y1): """Set the coordinates of the ellipse's X-axis diameter Warning: transform matrix is not applied here""" self.shape.set_xdiameter(x0, y0, x1, y1) self.set_label_position() def get_xdiameter(self): """Return the coordinates of the ellipse's X-axis diameter Warning: transform matrix is not applied here""" return self.shape.get_xdiameter() def set_ydiameter(self, x2, y2, x3, y3): """Set the coordinates of the ellipse's Y-axis diameter Warning: transform matrix is not applied here""" self.shape.set_ydiameter(x2, y2, x3, y3) self.set_label_position() def get_ydiameter(self): """Return the coordinates of the ellipse's Y-axis diameter Warning: transform matrix is not applied here""" return self.shape.get_ydiameter() def get_rect(self): return self.shape.get_rect() def set_rect(self, x0, y0, x1, y1): raise NotImplementedError def get_tr_angle(self): """Return X-diameter angle with horizontal direction, after applying transform matrix""" xcoords = self.get_transformed_coords(0, 1) _x, yr1 = self.apply_transform_matrix(1.0, 1.0) _x, yr2 = self.apply_transform_matrix(1.0, 2.0) return (compute_angle(reverse=yr1 > yr2, *xcoords) + 90) % 180 - 90 # ----AnnotatedShape API----------------------------------------------------- def set_label_position(self): """Set label position, for instance based on shape position""" x_label, y_label = self.shape.points.mean(axis=0) self.label.set_pos(x_label, y_label) def get_tr_center(self): """Return center coordinates: (xc, yc)""" return compute_center(*self.get_transformed_coords(0, 1)) def get_tr_size(self): """Return shape size after applying transform matrix""" xcoords = self.get_transformed_coords(0, 1) ycoords = self.get_transformed_coords(2, 3) dx = compute_distance(*xcoords) dy = compute_distance(*ycoords) if np.fabs(self.get_tr_angle()) > 45: dx, dy = dy, dx return dx, dy def get_infos(self): """Return formatted string with informations on current shape""" return "
".join( [ _("Center:") + " " + self.get_tr_center_str(), _("Size:") + " " + self.get_tr_size_str(), _("Angle:") + " %.1f°" % self.get_tr_angle(), ] ) class AnnotatedCircle(AnnotatedEllipse): """ Construct an annotated circle with diameter between coordinates (x1, y1) and (x2, y2) and properties set with *annotationparam* (see :py:class:`guiqwt.styles.AnnotationParam`) """ def __init__(self, x1=0, y1=0, x2=0, y2=0, annotationparam=None): AnnotatedEllipse.__init__(self, x1, y1, x2, y2, annotationparam) def get_tr_diameter(self): """Return circle diameter after applying transform matrix""" return compute_distance(*self.get_transformed_coords(0, 1)) # ----AnnotatedShape API------------------------------------------------- def get_infos(self): """Return formatted string with informations on current shape""" return "
".join( [ _("Center:") + " " + self.get_tr_center_str(), _("Diameter:") + " " + self.x_to_str(self.get_tr_diameter()), ] ) # ----AnnotatedEllipse API--------------------------------------------------- def set_rect(self, x0, y0, x1, y1): self.shape.set_rect(x0, y0, x1, y1) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/baseplot.py0000666000000000000000000010310200000000000013427 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.baseplot --------------- The `baseplot` module provides the `guiqwt` plotting widget base class: :py:class:`guiqwt.baseplot.BasePlot`. This is an enhanced version of `PythonQwt`'s QwtPlot plotting widget which supports the following features: * add to plot, del from plot, hide/show and save/restore `plot items` easily * item selection and multiple selection * active item * plot parameters editing .. warning:: :py:class:`guiqwt.baseplot.BasePlot` is rather an internal class than a ready-to-use plotting widget. The end user should prefer using :py:class:`guiqwt.plot.CurvePlot` or :py:class:`guiqwt.plot.ImagePlot`. .. seealso:: Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Reference ~~~~~~~~~ .. autoclass:: BasePlot :members: :inherited-members: """ import sys import numpy as np from qtpy.QtWidgets import QSizePolicy, QApplication from qtpy.QtPrintSupport import QPrinter from qtpy.QtGui import QColor from qtpy.QtCore import QSize, Qt, Signal from guidata.configtools import get_font # Local imports from guiqwt.transitional import ( QwtPlot, QwtLinearScaleEngine, QwtLogScaleEngine, QwtText, QwtPlotCanvas, ) from guiqwt import io from guiqwt.config import CONF, _ from guiqwt.events import StatefulEventFilter from guiqwt.interfaces import IBasePlotItem, IItemType, ISerializableType from guiqwt.styles import ItemParameters, AxeStyleParam, AxesParam, AxisParam # ============================================================================== # Utilities for plot items # ============================================================================== def canvas_to_axes(item, pos): """Convert (x,y) from canvas coordinates system to axes coordinates""" plot, ax, ay = item.plot(), item.xAxis(), item.yAxis() return plot.invTransform(ax, pos.x()), plot.invTransform(ay, pos.y()) def axes_to_canvas(item, x, y): """Convert (x,y) from axes coordinates to canvas coordinates system""" plot, ax, ay = item.plot(), item.xAxis(), item.yAxis() return plot.transform(ax, x), plot.transform(ay, y) # ============================================================================== # Base plot widget # ============================================================================== PARAMETERS_TITLE_ICON = { "grid": (_("Grid..."), "grid.png"), "axes": (_("Axes style..."), "axes.png"), "item": (_("Parameters..."), "settings.png"), } class BasePlot(QwtPlot): """ An enhanced QwtPlot class that provides methods for handling plotitems and axes better It distinguishes activatable items from basic QwtPlotItems. Activatable items must support IBasePlotItem interface and should be added to the plot using add_item methods. """ Y_LEFT, Y_RIGHT, X_BOTTOM, X_TOP = ( QwtPlot.yLeft, QwtPlot.yRight, QwtPlot.xBottom, QwtPlot.xTop, ) # # To be replaced by (in the near future): # Y_LEFT, Y_RIGHT, X_BOTTOM, X_TOP = range(4) AXIS_IDS = (Y_LEFT, Y_RIGHT, X_BOTTOM, X_TOP) AXIS_NAMES = {"left": Y_LEFT, "right": Y_RIGHT, "bottom": X_BOTTOM, "top": X_TOP} AXIS_TYPES = {"lin": QwtLinearScaleEngine, "log": QwtLogScaleEngine} AXIS_CONF_OPTIONS = ("axis", "axis", "axis", "axis") DEFAULT_ACTIVE_XAXIS = X_BOTTOM DEFAULT_ACTIVE_YAXIS = Y_LEFT #: Signal emitted by plot when an IBasePlotItem object was moved (args: x0, y0, x1, y1) SIG_ITEM_MOVED = Signal(object, float, float, float, float) #: Signal emitted by plot when a shapes.Marker position changes SIG_MARKER_CHANGED = Signal(object) #: Signal emitted by plot when a shapes.Axes position (or the angle) changes SIG_AXES_CHANGED = Signal(object) #: Signal emitted by plot when an annotation.AnnotatedShape position changes SIG_ANNOTATION_CHANGED = Signal(object) #: Signal emitted by plot when the a shapes.XRangeSelection range changes SIG_RANGE_CHANGED = Signal(object, float, float) #: Signal emitted by plot when item list has changed (item removed, added, ...) SIG_ITEMS_CHANGED = Signal(object) #: Signal emitted by plot when selected item has changed SIG_ACTIVE_ITEM_CHANGED = Signal(object) #: Signal emitted by plot when an item was deleted from the item list or using the #: delete item tool SIG_ITEM_REMOVED = Signal(object) #: Signal emitted by plot when an item is selected SIG_ITEM_SELECTION_CHANGED = Signal(object) #: Signal emitted by plot when plot's title or any axis label has changed SIG_PLOT_LABELS_CHANGED = Signal(object) #: Signal emitted by plot when any plot axis direction has changed SIG_AXIS_DIRECTION_CHANGED = Signal(object, object) #: Signal emitted by plot when LUT has been changed by the user SIG_LUT_CHANGED = Signal(object) #: Signal emitted by plot when image mask has changed SIG_MASK_CHANGED = Signal(object) #: Signal emitted by cross section plot when cross section curve data has changed SIG_CS_CURVE_CHANGED = Signal(object) def __init__(self, parent=None, section="plot"): super(BasePlot, self).__init__(parent) self._start_autoscaled = True self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.manager = None self.plot_id = None # id assigned by it's manager self.filter = StatefulEventFilter(self) self.items = [] self.active_item = None self.last_selected = {} # a mapping from item type to last selected item self.axes_styles = [ AxeStyleParam(_("Left")), AxeStyleParam(_("Right")), AxeStyleParam(_("Bottom")), AxeStyleParam(_("Top")), ] self._active_xaxis = self.DEFAULT_ACTIVE_XAXIS self._active_yaxis = self.DEFAULT_ACTIVE_YAXIS self.read_axes_styles(section, self.AXIS_CONF_OPTIONS) self.font_title = get_font(CONF, section, "title") canvas = self.canvas() canvas.setFocusPolicy(Qt.StrongFocus) canvas.setFocusIndicator(QwtPlotCanvas.ItemFocusIndicator) self.SIG_ITEM_MOVED.connect(self._move_selected_items_together) self.legendDataChanged.connect( lambda item, _legdata: item.update_item_parameters() ) # ---- QWidget API --------------------------------------------------------- def mouseDoubleClickEvent(self, event): """Reimplement QWidget method""" for axis_id in self.AXIS_IDS: widget = self.axisWidget(axis_id) if widget.geometry().contains(event.pos()): self.edit_axis_parameters(axis_id) break else: QwtPlot.mouseDoubleClickEvent(self, event) # ---- QwtPlot API --------------------------------------------------------- def showEvent(self, event): """Reimplement Qwt method""" QwtPlot.showEvent(self, event) if self._start_autoscaled: self.do_autoscale() # ---- Public API ---------------------------------------------------------- def _move_selected_items_together(self, item, x0, y0, x1, y1): """Selected items move together""" for selitem in self.get_selected_items(): if selitem is not item and selitem.can_move(): selitem.move_with_selection(x1 - x0, y1 - y0) def set_manager(self, manager, plot_id): """Set the associated :py:class:`guiqwt.plot.PlotManager` instance""" self.manager = manager self.plot_id = plot_id def sizeHint(self): """Preferred size""" return QSize(400, 300) def get_title(self): """Get plot title""" return str(self.title().text()) def set_title(self, title): """Set plot title""" text = QwtText(title) text.setFont(self.font_title) self.setTitle(text) self.SIG_PLOT_LABELS_CHANGED.emit(self) def get_axis_id(self, axis_name): """Return axis ID from axis name If axis ID is passed directly, check the ID""" assert axis_name in self.AXIS_NAMES or axis_name in self.AXIS_IDS return self.AXIS_NAMES.get(axis_name, axis_name) def read_axes_styles(self, section, options): """ Read axes styles from section and options (one option for each axis in the order left, right, bottom, top) Skip axis if option is None """ for prm, option in zip(self.axes_styles, options): if option is None: continue prm.read_config(CONF, section, option) self.update_all_axes_styles() def get_axis_title(self, axis_id): """Get axis title""" axis_id = self.get_axis_id(axis_id) return self.axes_styles[axis_id].title def set_axis_title(self, axis_id, text): """Set axis title""" axis_id = self.get_axis_id(axis_id) self.axes_styles[axis_id].title = text self.update_axis_style(axis_id) def get_axis_unit(self, axis_id): """Get axis unit""" axis_id = self.get_axis_id(axis_id) return self.axes_styles[axis_id].unit def set_axis_unit(self, axis_id, text): """Set axis unit""" axis_id = self.get_axis_id(axis_id) self.axes_styles[axis_id].unit = text self.update_axis_style(axis_id) def get_axis_font(self, axis_id): """Get axis font""" axis_id = self.get_axis_id(axis_id) return self.axes_styles[axis_id].title_font.build_font() def set_axis_font(self, axis_id, font): """Set axis font""" axis_id = self.get_axis_id(axis_id) self.axes_styles[axis_id].title_font.update_param(font) self.axes_styles[axis_id].ticks_font.update_param(font) self.update_axis_style(axis_id) def get_axis_color(self, axis_id): """Get axis color (color name, i.e. string)""" axis_id = self.get_axis_id(axis_id) return self.axes_styles[axis_id].color def set_axis_color(self, axis_id, color): """ Set axis color color: color name (string) or QColor instance """ axis_id = self.get_axis_id(axis_id) if isinstance(color, str): color = QColor(color) self.axes_styles[axis_id].color = str(color.name()) self.update_axis_style(axis_id) def update_axis_style(self, axis_id): """Update axis style""" axis_id = self.get_axis_id(axis_id) style = self.axes_styles[axis_id] title_font = style.title_font.build_font() ticks_font = style.ticks_font.build_font() self.setAxisFont(axis_id, ticks_font) if style.title and style.unit: title = "%s (%s)" % (style.title, style.unit) elif style.title: title = style.title else: title = style.unit axis_text = self.axisTitle(axis_id) axis_text.setFont(title_font) axis_text.setText(title) axis_text.setColor(QColor(style.color)) self.setAxisTitle(axis_id, axis_text) self.SIG_PLOT_LABELS_CHANGED.emit(self) def update_all_axes_styles(self): """Update all axes styles""" for axis_id in self.AXIS_IDS: self.update_axis_style(axis_id) def get_axis_limits(self, axis_id): """Return axis limits (minimum and maximum values)""" axis_id = self.get_axis_id(axis_id) sdiv = self.axisScaleDiv(axis_id) return sdiv.lowerBound(), sdiv.upperBound() def set_axis_limits(self, axis_id, vmin, vmax, stepsize=0): """Set axis limits (minimum and maximum values) and optional step size""" axis_id = self.get_axis_id(axis_id) self.setAxisScale(axis_id, vmin, vmax, stepsize) self._start_autoscaled = False def set_axis_ticks(self, axis_id, nmajor=None, nminor=None): """Set axis maximum number of major ticks and maximum of minor ticks""" axis_id = self.get_axis_id(axis_id) if nmajor is not None: self.setAxisMaxMajor(axis_id, nmajor) if nminor is not None: self.setAxisMaxMinor(axis_id, nminor) def get_axis_scale(self, axis_id): """Return the name ('lin' or 'log') of the scale used by axis""" axis_id = self.get_axis_id(axis_id) engine = self.axisScaleEngine(axis_id) for axis_label, axis_type in list(self.AXIS_TYPES.items()): if isinstance(engine, axis_type): return axis_label return "lin" # unknown default to linear def set_axis_scale(self, axis_id, scale, autoscale=True): """Set axis scale Example: self.set_axis_scale(curve.yAxis(), 'lin')""" axis_id = self.get_axis_id(axis_id) self.setAxisScaleEngine(axis_id, self.AXIS_TYPES[scale]()) if autoscale: self.do_autoscale(replot=False) def get_scales(self): """Return active curve scales""" ax, ay = self.get_active_axes() return self.get_axis_scale(ax), self.get_axis_scale(ay) def set_scales(self, xscale, yscale): """Set active curve scales Example: self.set_scales('lin', 'lin')""" ax, ay = self.get_active_axes() self.set_axis_scale(ax, xscale) self.set_axis_scale(ay, yscale) self.replot() def enable_used_axes(self): """ Enable only used axes For now, this is needed only by the pyplot interface """ for axis in self.AXIS_IDS: self.enableAxis(axis, True) self.disable_unused_axes() def disable_unused_axes(self): """Disable unused axes""" used_axes = set() for item in self.get_items(): used_axes.add(item.xAxis()) used_axes.add(item.yAxis()) unused_axes = set(self.AXIS_IDS) - set(used_axes) for axis in unused_axes: self.enableAxis(axis, False) def get_items(self, z_sorted=False, item_type=None): """Return widget's item list (items are based on IBasePlotItem's interface)""" if z_sorted: items = sorted(self.items, reverse=True, key=lambda x: x.z()) else: items = self.items if item_type is None: return items else: assert issubclass(item_type, IItemType) return [item for item in items if item_type in item.types()] def get_public_items(self, z_sorted=False, item_type=None): """Return widget's public item list (items are based on IBasePlotItem's interface)""" return [ item for item in self.get_items(z_sorted=z_sorted, item_type=item_type) if not item.is_private() ] def get_private_items(self, z_sorted=False, item_type=None): """Return widget's private item list (items are based on IBasePlotItem's interface)""" return [ item for item in self.get_items(z_sorted=z_sorted, item_type=item_type) if item.is_private() ] def copy_to_clipboard(self): """Copy widget's window to clipboard""" clipboard = QApplication.clipboard() pixmap = self.grab() clipboard.setPixmap(pixmap) def save_widget(self, fname): """Grab widget's window and save it to filename (\*.png, \*.pdf)""" fname = str(fname) if fname.lower().endswith(".pdf"): printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOrientation(QPrinter.Landscape) printer.setOutputFileName(fname) printer.setCreator("guidata") self.print_(printer) elif fname.lower().endswith(".png"): pixmap = self.grab() pixmap.save(fname, "PNG") else: raise RuntimeError(_("Unknown file extension")) def get_selected_items(self, z_sorted=False, item_type=None): """Return selected items""" return [ item for item in self.get_items(item_type=item_type, z_sorted=z_sorted) if item.selected ] def get_max_z(self): """ Return maximum z-order for all items registered in plot If there is no item, return 0 """ if self.items: return max([_it.z() for _it in self.items]) else: return 0 def add_item(self, item, z=None): """ Add a *plot item* instance to this *plot widget* item: :py:data:`qwt.QwtPlotItem` object implementing the IBasePlotItem interface (guiqwt.interfaces) """ assert hasattr(item, "__implements__") assert IBasePlotItem in item.__implements__ item.attach(self) if z is not None: item.setZ(z) else: item.setZ(self.get_max_z() + 1) if item in self.items: print( "Warning: item %r is already attached to plot" % item, file=sys.stderr ) else: self.items.append(item) self.SIG_ITEMS_CHANGED.emit(self) def add_item_with_z_offset(self, item, zoffset): """ Add a plot *item* instance within a specified z range, over *zmin* """ zlist = sorted( [_it.z() for _it in self.items if _it.z() >= zoffset] + [zoffset - 1] ) dzlist = np.argwhere(np.diff(zlist) > 1) if len(dzlist) == 0: z = max(zlist) + 1 else: z = zlist[int(dzlist[0])] + 1 self.add_item(item, z=z) def __clean_item_references(self, item): """Remove all reference to this item (active, last_selected""" if item is self.active_item: self.active_item = None self._active_xaxis = self.DEFAULT_ACTIVE_XAXIS self._active_yaxis = self.DEFAULT_ACTIVE_YAXIS for key, it in list(self.last_selected.items()): if item is it: del self.last_selected[key] def del_items(self, items): """Remove item from widget""" items = items[:] # copy the list to avoid side effects when we empty it active_item = self.get_active_item() while items: item = items.pop() item.detach() # raises ValueError if item not in list self.items.remove(item) self.__clean_item_references(item) self.SIG_ITEM_REMOVED.emit(item) self.SIG_ITEMS_CHANGED.emit(self) if active_item is not self.get_active_item(): self.SIG_ACTIVE_ITEM_CHANGED.emit(self) def del_item(self, item): """ Remove item from widget Convenience function (see 'del_items') """ try: self.del_items([item]) except ValueError: raise ValueError("item not in plot") def set_item_visible(self, item, state, notify=True, replot=True): """Show/hide *item* and emit a SIG_ITEMS_CHANGED signal""" item.setVisible(state) if item is self.active_item and not state: self.set_active_item(None) # Notify the item list (see baseplot) if notify: self.SIG_ITEMS_CHANGED.emit(self) if replot: self.replot() def __set_items_visible(self, state, items=None, item_type=None): """Show/hide items (if *items* is None, show/hide all items)""" if items is None: items = self.get_items(item_type=item_type) for item in items: self.set_item_visible(item, state, notify=False, replot=False) self.SIG_ITEMS_CHANGED.emit(self) self.replot() def show_items(self, items=None, item_type=None): """Show items (if *items* is None, show all items)""" self.__set_items_visible(True, items, item_type=item_type) def hide_items(self, items=None, item_type=None): """Hide items (if *items* is None, hide all items)""" self.__set_items_visible(False, items, item_type=item_type) def save_items(self, iofile, selected=False): """ Save (serializable) items to file using the :py:mod:`pickle` protocol * iofile: file object or filename * selected=False: if True, will save only selected items See also :py:meth:`guiqwt.baseplot.BasePlot.restore_items` """ if selected: items = self.get_selected_items() else: items = self.items[:] items = [item for item in items if ISerializableType in item.types()] import pickle pickle.dump(items, iofile) def restore_items(self, iofile): """ Restore items from file using the :py:mod:`pickle` protocol * iofile: file object or filename See also :py:meth:`guiqwt.baseplot.BasePlot.save_items` """ import pickle items = pickle.load(iofile) for item in items: self.add_item(item) def serialize(self, writer, selected=False): """ Save (serializable) items to HDF5 file: * writer: :py:class:`guidata.hdf5io.HDF5Writer` object * selected=False: if True, will save only selected items See also :py:meth:`guiqwt.baseplot.BasePlot.restore_items_from_hdf5` """ if selected: items = self.get_selected_items() else: items = self.items[:] items = [item for item in items if ISerializableType in item.types()] io.save_items(writer, items) def deserialize(self, reader): """ Restore items from HDF5 file: * reader: :py:class:`guidata.hdf5io.HDF5Reader` object See also :py:meth:`guiqwt.baseplot.BasePlot.save_items_to_hdf5` """ for item in io.load_items(reader): self.add_item(item) def set_items(self, *args): """Utility function used to quickly setup a plot with a set of items""" self.del_all_items() for item in args: self.add_item(item) def del_all_items(self): """Remove (detach) all attached items""" self.del_items(self.items) def __swap_items_z(self, item1, item2): old_item1_z, old_item2_z = item1.z(), item2.z() item1.setZ(max([_it.z() for _it in self.items]) + 1) item2.setZ(old_item1_z) item1.setZ(old_item2_z) def move_up(self, item_list): """Move item(s) up, i.e. to the foreground (swap item with the next item in z-order) item: plot item *or* list of plot items Return True if items have been moved effectively""" objects = self.get_items(z_sorted=True) items = sorted(list(item_list), reverse=True, key=lambda x: objects.index(x)) changed = False if objects.index(items[-1]) > 0: for item in items: index = objects.index(item) self.__swap_items_z(item, objects[index - 1]) changed = True if changed: self.SIG_ITEMS_CHANGED.emit(self) return changed def move_down(self, item_list): """Move item(s) down, i.e. to the background (swap item with the previous item in z-order) item: plot item *or* list of plot items Return True if items have been moved effectively""" objects = self.get_items(z_sorted=True) items = sorted(list(item_list), reverse=False, key=lambda x: objects.index(x)) changed = False if objects.index(items[-1]) < len(objects) - 1: for item in items: index = objects.index(item) self.__swap_items_z(item, objects[index + 1]) changed = True if changed: self.SIG_ITEMS_CHANGED.emit(self) return changed def set_items_readonly(self, state): """Set all items readonly state to *state* Default item's readonly state: False (items may be deleted)""" for item in self.get_items(): item.set_readonly(state) self.SIG_ITEMS_CHANGED.emit(self) def select_item(self, item): """Select item""" item.select() for itype in item.types(): self.last_selected[itype] = item self.SIG_ITEM_SELECTION_CHANGED.emit(self) def unselect_item(self, item): """Unselect item""" item.unselect() self.SIG_ITEM_SELECTION_CHANGED.emit(self) def get_last_active_item(self, item_type): """Return last active item corresponding to passed `item_type`""" assert issubclass(item_type, IItemType) return self.last_selected.get(item_type) def select_all(self): """Select all selectable items""" last_item = None block = self.blockSignals(True) for item in self.items: if item.can_select(): self.select_item(item) last_item = item self.blockSignals(block) self.SIG_ITEM_SELECTION_CHANGED.emit(self) self.set_active_item(last_item) def unselect_all(self): """Unselect all selected items""" for item in self.items: if item.can_select(): item.unselect() self.set_active_item(None) self.SIG_ITEM_SELECTION_CHANGED.emit(self) def select_some_items(self, items): """Select items""" active = self.active_item block = self.blockSignals(True) self.unselect_all() if items: new_active_item = items[-1] else: new_active_item = None for item in items: self.select_item(item) if active is item: new_active_item = item self.set_active_item(new_active_item) self.blockSignals(block) if new_active_item is not active: # if the new selection doesn't include the # previously active item self.SIG_ACTIVE_ITEM_CHANGED.emit(self) self.SIG_ITEM_SELECTION_CHANGED.emit(self) def set_active_item(self, item): """Set active item, and unselect the old active item""" self.active_item = item if self.active_item is not None: if not item.selected: self.select_item(self.active_item) self._active_xaxis = item.xAxis() self._active_yaxis = item.yAxis() self.SIG_ACTIVE_ITEM_CHANGED.emit(self) def get_active_axes(self): """Return active axes""" item = self.active_item if item is not None: self._active_xaxis = item.xAxis() self._active_yaxis = item.yAxis() return self._active_xaxis, self._active_yaxis def get_active_item(self, force=False): """ Return active item Force item activation if there is no active item """ if force and not self.active_item: for item in self.get_items(): if item.can_select(): self.set_active_item(item) break return self.active_item def get_nearest_object(self, pos, close_dist=0): """ Return nearest item from position 'pos' If close_dist > 0: Return the first found item (higher z) which distance to 'pos' is less than close_dist else: Return the closest item """ selobj, distance, inside, handle = None, sys.maxsize, None, None for obj in self.get_items(z_sorted=True): if not obj.isVisible() or not obj.can_select(): continue d, _handle, _inside, other = obj.hit_test(pos) if d < distance: selobj, distance, handle, inside = obj, d, _handle, _inside if d < close_dist: break if other is not None: # e.g. LegendBoxItem: selecting a curve ('other') instead of # legend box ('obj') return other, 0, None, True return selobj, distance, handle, inside def get_nearest_object_in_z(self, pos): """ Return nearest item for which position 'pos' is inside of it (iterate over items with respect to their 'z' coordinate) """ selobj, distance, inside, handle = None, sys.maxsize, None, None for obj in self.get_items(z_sorted=True): if not obj.isVisible() or not obj.can_select(): continue d, _handle, _inside, _other = obj.hit_test(pos) if _inside: selobj, distance, handle, inside = obj, d, _handle, _inside break return selobj, distance, handle, inside def get_context_menu(self): """Return widget context menu""" return self.manager.get_context_menu(self) def get_plot_parameters_status(self, key): if key == "item": return self.get_active_item() is not None else: return True def get_selected_item_parameters(self, itemparams): for item in self.get_selected_items(): item.get_item_parameters(itemparams) # Retrieving active_item's parameters after every other item: # this way, the common datasets will be based on its parameters active_item = self.get_active_item() active_item.get_item_parameters(itemparams) def get_axesparam_class(self, item): """Return AxesParam dataset class associated to item's type""" return AxesParam def get_plot_parameters(self, key, itemparams): """ Return a list of DataSets for a given parameter key the datasets will be edited and passed back to set_plot_parameters this is a generic interface to help building context menus using the BasePlotMenuTool """ if key == "axes": for i, axeparam in enumerate(self.axes_styles): itemparams.add("AxeStyleParam%d" % i, self, axeparam) elif key == "item": active_item = self.get_active_item() if not active_item: return self.get_selected_item_parameters(itemparams) Param = self.get_axesparam_class(active_item) axesparam = Param( title=_("Axes"), icon="lin_lin.png", comment=_("Axes associated to selected item"), ) axesparam.update_param(active_item) itemparams.add("AxesParam", self, axesparam) def set_item_parameters(self, itemparams): """Set item (plot, here) parameters""" # Axe styles datasets = [itemparams.get("AxeStyleParam%d" % i) for i in range(4)] if datasets[0] is not None: self.axes_styles = datasets self.update_all_axes_styles() # Changing active item's associated axes dataset = itemparams.get("AxesParam") if dataset is not None: active_item = self.get_active_item() dataset.update_axes(active_item) def edit_plot_parameters(self, key): """ Edit plot parameters """ multiselection = len(self.get_selected_items()) > 1 itemparams = ItemParameters(multiselection=multiselection) self.get_plot_parameters(key, itemparams) title, icon = PARAMETERS_TITLE_ICON[key] itemparams.edit(self, title, icon) def edit_axis_parameters(self, axis_id): """Edit axis parameters""" if axis_id in (self.Y_LEFT, self.Y_RIGHT): title = _("Y Axis") else: title = _("X Axis") param = AxisParam(title=title) param.update_param(self, axis_id) if param.edit(parent=self): param.update_axis(self, axis_id) self.replot() def do_autoscale(self, replot=True, axis_id=None): """Do autoscale on all axes""" for axis_id in self.AXIS_IDS if axis_id is None else [axis_id]: self.setAxisAutoScale(axis_id) if replot: self.replot() def disable_autoscale(self): """Re-apply the axis scales so as to disable autoscaling without changing the view""" for axis_id in self.AXIS_IDS: vmin, vmax = self.get_axis_limits(axis_id) self.set_axis_limits(axis_id, vmin, vmax) def invalidate(self): """Invalidate paint cache and schedule redraw use instead of replot when only the content of the canvas needs redrawing (axes, shouldn't change) """ self.canvas().replot() self.update() ## Keep this around to debug too many replots ## def replot(self): ## import traceback ## traceback.print_stack() ## QwtPlot.replot(self) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/builder.py0000666000000000000000000014567000000000000013264 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.builder -------------- The `builder` module provides a builder singleton class used to simplify the creation of plot items. Example ~~~~~~~ Before creating any widget, a `QApplication` must be instantiated (that is a `Qt` internal requirement): >>> import guidata >>> app = guidata.qapplication() that is mostly equivalent to the following (the only difference is that the `guidata` helper function also installs the `Qt` translation corresponding to the system locale): >>> from PyQt5.QtGui import QApplication >>> app = QApplication([]) now that a `QApplication` object exists, we may create the plotting widget: >>> from guiqwt.plot import ImageWidget >>> widget = ImageWidget() create curves, images, histograms, etc. and attach them to the plot: >>> from guiqwt.builder import make >>> curve = make.mcure(x, y, 'r+') >>> image = make.image(data) >>> hist = make.histogram(data, 100) >>> for item in (curve, image, hist): ... widget.plot.add_item() and then show the widget to screen: >>> widget.show() >>> app.exec_() Reference ~~~~~~~~~ .. autoclass:: PlotItemBuilder :members: """ import os.path as osp from numpy import arange, array, zeros, meshgrid, ndarray # Local imports from guiqwt.config import _, CONF, make_title from guiqwt.baseplot import BasePlot from guiqwt.curve import CurveItem, ErrorBarCurveItem, GridItem from guiqwt.histogram import HistogramItem, lut_range_threshold from guiqwt.image import ( ImageItem, QuadGridItem, TrImageItem, XYImageItem, Histogram2DItem, RGBImageItem, MaskedImageItem, ) from guiqwt.shapes import ( XRangeSelection, RectangleShape, EllipseShape, SegmentShape, Marker, ) from guiqwt.annotations import AnnotatedRectangle, AnnotatedEllipse, AnnotatedSegment from guiqwt.styles import ( update_style_attr, CurveParam, ErrorBarParam, style_generator, LabelParam, LegendParam, ImageParam, TrImageParam, HistogramParam, Histogram2DParam, RGBImageParam, MaskedImageParam, XYImageParam, ImageFilterParam, MARKERS, COLORS, GridParam, LineStyleParam, AnnotationParam, QuadGridParam, LabelParamWithContents, MarkerParam, ) from guiqwt.label import ( LabelItem, LegendBoxItem, RangeComputation, RangeComputation2d, DataInfoLabel, RangeInfo, SelectedLegendBoxItem, ) # default offset positions for anchors ANCHOR_OFFSETS = { "TL": (5, 5), "TR": (-5, 5), "BL": (5, -5), "BR": (-5, -5), "L": (5, 0), "R": (-5, 0), "T": (0, 5), "B": (0, -5), } CURVE_COUNT = 0 HISTOGRAM_COUNT = 0 IMAGE_COUNT = 0 LABEL_COUNT = 0 HISTOGRAM2D_COUNT = 0 class PlotItemBuilder(object): """ This is just a bare class used to regroup a set of factory functions in a single object """ def __init__(self): self.style = style_generator() def gridparam( self, background=None, major_enabled=None, minor_enabled=None, major_style=None, minor_style=None, ): """ Make `guiqwt.styles.GridParam` instance * background = canvas background color * major_enabled = tuple (major_xenabled, major_yenabled) * minor_enabled = tuple (minor_xenabled, minor_yenabled) * major_style = tuple (major_xstyle, major_ystyle) * minor_style = tuple (minor_xstyle, minor_ystyle) Style: tuple (style, color, width) """ gridparam = GridParam(title=_("Grid"), icon="lin_lin.png") gridparam.read_config(CONF, "plot", "grid") if background is not None: gridparam.background = background if major_enabled is not None: gridparam.maj_xenabled, gridparam.maj_yenabled = major_enabled if minor_enabled is not None: gridparam.min_xenabled, gridparam.min_yenabled = minor_enabled if major_style is not None: style = LineStyleParam() linestyle, color, style.width = major_style style.set_style_from_matlab(linestyle) style.color = COLORS.get(color, color) # MATLAB-style if minor_style is not None: style = LineStyleParam() linestyle, color, style.width = minor_style style.set_style_from_matlab(linestyle) style.color = COLORS.get(color, color) # MATLAB-style return gridparam def grid( self, background=None, major_enabled=None, minor_enabled=None, major_style=None, minor_style=None, ): """ Make a grid `plot item` (`guiqwt.curve.GridItem` object) * background = canvas background color * major_enabled = tuple (major_xenabled, major_yenabled) * minor_enabled = tuple (minor_xenabled, minor_yenabled) * major_style = tuple (major_xstyle, major_ystyle) * minor_style = tuple (minor_xstyle, minor_ystyle) Style: tuple (style, color, width) """ gridparam = self.gridparam( background, major_enabled, minor_enabled, major_style, minor_style ) return GridItem(gridparam) def __set_curve_axes(self, curve, xaxis, yaxis): """Set curve axes""" for axis in (xaxis, yaxis): if axis not in BasePlot.AXIS_NAMES: raise RuntimeError("Unknown axis %s" % axis) curve.setXAxis(BasePlot.AXIS_NAMES[xaxis]) curve.setYAxis(BasePlot.AXIS_NAMES[yaxis]) def __set_baseparam( self, param, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, ): """Apply parameters to a `guiqwt.styles.CurveParam` or `guiqwt.styles.MarkerParam` instance""" if color is not None: color = COLORS.get(color, color) # MATLAB-style param.line.color = color if linestyle is not None: param.line.set_style_from_matlab(linestyle) if linewidth is not None: param.line.width = linewidth if marker is not None: if marker in MARKERS: param.symbol.update_param(MARKERS[marker]) # MATLAB-style else: param.symbol.marker = marker if markersize is not None: param.symbol.size = markersize if markerfacecolor is not None: markerfacecolor = COLORS.get( markerfacecolor, markerfacecolor ) # MATLAB-style param.symbol.facecolor = markerfacecolor if markeredgecolor is not None: markeredgecolor = COLORS.get( markeredgecolor, markeredgecolor ) # MATLAB-style param.symbol.edgecolor = markeredgecolor def __set_param( self, param, title, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, shade, curvestyle, baseline, ): """Apply parameters to a `guiqwt.styles.CurveParam` instance""" self.__set_baseparam( param, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, ) if title: param.label = title if shade is not None: param.shade = shade if curvestyle is not None: param.curvestyle = curvestyle if baseline is not None: param.baseline = baseline def __get_arg_triple_plot(self, args): """Convert MATLAB-like arguments into x, y, style""" def get_x_y_from_data(data): if isinstance(data, (tuple, list)): data = array(data) if len(data.shape) == 1 or 1 in data.shape: x = arange(data.size) y = data else: x = arange(len(data[:, 0])) y = [data[:, i] for i in range(len(data[0, :]))] return x, y if len(args) == 1: if isinstance(args[0], str): x = array((), float) y = array((), float) style = args[0] else: x, y = get_x_y_from_data(args[0]) y_matrix = not isinstance(y, ndarray) if y_matrix: style = [next(self.style) for yi in y] else: style = next(self.style) elif len(args) == 2: a1, a2 = args if isinstance(a2, str): x, y = get_x_y_from_data(a1) style = a2 else: x = a1 y = a2 style = next(self.style) elif len(args) == 3: x, y, style = args else: raise TypeError("Wrong number of arguments") if isinstance(x, (list, tuple)): x = array(x) if isinstance(y, (list, tuple)) and not y_matrix: y = array(y) return x, y, style def __get_arg_triple_errorbar(self, args): """Convert MATLAB-like arguments into x, y, style""" if len(args) == 2: y, dy = args x = arange(len(y)) dx = zeros(len(y)) style = next(self.style) elif len(args) == 3: a1, a2, a3 = args if isinstance(a3, str): y, dy = a1, a2 x = arange(len(y)) dx = zeros(len(y)) style = a3 else: x, y, dy = args dx = zeros(len(y)) style = next(self.style) elif len(args) == 4: a1, a2, a3, a4 = args if isinstance(a4, str): x, y, dy = a1, a2, a3 dx = zeros(len(y)) style = a4 else: x, y, dx, dy = args style = next(self.style) elif len(args) == 5: x, y, dx, dy, style = args else: raise TypeError("Wrong number of arguments") return x, y, dx, dy, style def mcurve(self, *args, **kwargs): """ Make a curve `plot item` based on MATLAB-like syntax (may returns a list of curves if data contains more than one signal) (:py:class:`guiqwt.curve.CurveItem` object) Example:: mcurve(x, y, 'r+') """ x, y, style = self.__get_arg_triple_plot(args) if isinstance(y, ndarray): y = [y] if not isinstance(style, list): style = [style] if len(y) > len(style): style = [style[0]] * len(y) basename = _("Curve") curves = [] for yi, stylei in zip(y, style): param = CurveParam(title=basename, icon="curve.png") if "label" in kwargs: param.label = kwargs.pop("label") else: global CURVE_COUNT CURVE_COUNT += 1 param.label = make_title(basename, CURVE_COUNT) update_style_attr(stylei, param) curves.append(self.pcurve(x, yi, param, **kwargs)) if len(curves) == 1: return curves[0] else: return curves def pcurve(self, x, y, param, xaxis="bottom", yaxis="left"): """ Make a curve `plot item` based on a `guiqwt.styles.CurveParam` instance (:py:class:`guiqwt.curve.CurveItem` object) Usage:: pcurve(x, y, param) """ curve = CurveItem(param) curve.set_data(x, y) curve.update_params() self.__set_curve_axes(curve, xaxis, yaxis) return curve def curve( self, x, y, title="", color=None, linestyle=None, linewidth=None, marker=None, markersize=None, markerfacecolor=None, markeredgecolor=None, shade=None, curvestyle=None, baseline=None, xaxis="bottom", yaxis="left", ): """ Make a curve `plot item` from x, y, data (:py:class:`guiqwt.curve.CurveItem` object) * x: 1D NumPy array * y: 1D NumPy array * color: curve color name * linestyle: curve line style (MATLAB-like string or "SolidLine", "DashLine", "DotLine", "DashDotLine", "DashDotDotLine", "NoPen") * linewidth: line width (pixels) * marker: marker shape (MATLAB-like string or "Cross", "Ellipse", "Star1", "XCross", "Rect", "Diamond", "UTriangle", "DTriangle", "RTriangle", "LTriangle", "Star2", "NoSymbol") * markersize: marker size (pixels) * markerfacecolor: marker face color name * markeredgecolor: marker edge color name * shade: 0 <= float <= 1 (curve shade) * curvestyle: "Lines", "Sticks", "Steps", "Dots", "NoCurve" * baseline (float: default=0.0): the baseline is needed for filling the curve with a brush or the Sticks drawing style. * xaxis, yaxis: X/Y axes bound to curve Example:: curve(x, y, marker='Ellipse', markerfacecolor='#ffffff') which is equivalent to (MATLAB-style support):: curve(x, y, marker='o', markerfacecolor='w') """ basename = _("Curve") param = CurveParam(title=basename, icon="curve.png") if not title: global CURVE_COUNT CURVE_COUNT += 1 title = make_title(basename, CURVE_COUNT) self.__set_param( param, title, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, shade, curvestyle, baseline, ) return self.pcurve(x, y, param, xaxis, yaxis) def merror(self, *args, **kwargs): """ Make an errorbar curve `plot item` based on MATLAB-like syntax (:py:class:`guiqwt.curve.ErrorBarCurveItem` object) Example:: mcurve(x, y, 'r+') """ x, y, dx, dy, style = self.__get_arg_triple_errorbar(args) basename = _("Curve") curveparam = CurveParam(title=basename, icon="curve.png") errorbarparam = ErrorBarParam(title=_("Error bars"), icon="errorbar.png") if "label" in kwargs: curveparam.label = kwargs["label"] else: global CURVE_COUNT CURVE_COUNT += 1 curveparam.label = make_title(basename, CURVE_COUNT) update_style_attr(style, curveparam) errorbarparam.color = curveparam.line.color return self.perror(x, y, dx, dy, curveparam, errorbarparam) def perror( self, x, y, dx, dy, curveparam, errorbarparam, xaxis="bottom", yaxis="left" ): """ Make an errorbar curve `plot item` based on a `guiqwt.styles.ErrorBarParam` instance (:py:class:`guiqwt.curve.ErrorBarCurveItem` object) * x: 1D NumPy array * y: 1D NumPy array * dx: None, or scalar, or 1D NumPy array * dy: None, or scalar, or 1D NumPy array * curveparam: `guiqwt.styles.CurveParam` object * errorbarparam: `guiqwt.styles.ErrorBarParam` object * xaxis, yaxis: X/Y axes bound to curve Usage:: perror(x, y, dx, dy, curveparam, errorbarparam) """ curve = ErrorBarCurveItem(curveparam, errorbarparam) curve.set_data(x, y, dx, dy) curve.update_params() self.__set_curve_axes(curve, xaxis, yaxis) return curve def error( self, x, y, dx, dy, title="", color=None, linestyle=None, linewidth=None, errorbarwidth=None, errorbarcap=None, errorbarmode=None, errorbaralpha=None, marker=None, markersize=None, markerfacecolor=None, markeredgecolor=None, shade=None, curvestyle=None, baseline=None, xaxis="bottom", yaxis="left", ): """ Make an errorbar curve `plot item` (:py:class:`guiqwt.curve.ErrorBarCurveItem` object) * x: 1D NumPy array * y: 1D NumPy array * dx: None, or scalar, or 1D NumPy array * dy: None, or scalar, or 1D NumPy array * color: curve color name * linestyle: curve line style (MATLAB-like string or attribute name from the :py:class:`PyQt5.QtCore.Qt.PenStyle` enum (i.e. "SolidLine" "DashLine", "DotLine", "DashDotLine", "DashDotDotLine" or "NoPen") * linewidth: line width (pixels) * marker: marker shape (MATLAB-like string or attribute name from the :py:class:`qwt.symbol.QwtSymbol.Style` enum (i.e. "Cross", "Ellipse", "Star1", "XCross", "Rect", "Diamond", "UTriangle", "DTriangle", "RTriangle", "LTriangle", "Star2" or "NoSymbol") * markersize: marker size (pixels) * markerfacecolor: marker face color name * markeredgecolor: marker edge color name * shade: 0 <= float <= 1 (curve shade) * curvestyle: attribute name from the :py:class:`qwt.plot_curve.QwtPlotCurve.CurveStyle` enum (i.e. "Lines", "Sticks", "Steps", "Dots" or "NoCurve") * baseline (float: default=0.0): the baseline is needed for filling the curve with a brush or the Sticks drawing style. * xaxis, yaxis: X/Y axes bound to curve Example:: error(x, y, None, dy, marker='Ellipse', markerfacecolor='#ffffff') which is equivalent to (MATLAB-style support):: error(x, y, None, dy, marker='o', markerfacecolor='w') """ basename = _("Curve") curveparam = CurveParam(title=basename, icon="curve.png") errorbarparam = ErrorBarParam(title=_("Error bars"), icon="errorbar.png") if not title: global CURVE_COUNT CURVE_COUNT += 1 curveparam.label = make_title(basename, CURVE_COUNT) self.__set_param( curveparam, title, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, shade, curvestyle, baseline, ) errorbarparam.color = curveparam.line.color if errorbarwidth is not None: errorbarparam.width = errorbarwidth if errorbarcap is not None: errorbarparam.cap = errorbarcap if errorbarmode is not None: errorbarparam.mode = errorbarmode if errorbaralpha is not None: errorbarparam.alpha = errorbaralpha return self.perror(x, y, dx, dy, curveparam, errorbarparam, xaxis, yaxis) def histogram( self, data, bins=None, logscale=None, title="", color=None, xaxis="bottom", yaxis="left", ): """ Make 1D Histogram `plot item` (:py:class:`guiqwt.histogram.HistogramItem` object) * data (1D NumPy array) * bins: number of bins (int) * logscale: Y-axis scale (bool) """ basename = _("Histogram") histparam = HistogramParam(title=basename, icon="histogram.png") curveparam = CurveParam(_("Curve"), icon="curve.png") curveparam.read_config(CONF, "histogram", "curve") if not title: global HISTOGRAM_COUNT HISTOGRAM_COUNT += 1 title = make_title(basename, HISTOGRAM_COUNT) curveparam.label = title if color is not None: curveparam.line.color = color if bins is not None: histparam.n_bins = bins if logscale is not None: histparam.logscale = logscale return self.phistogram(data, curveparam, histparam, xaxis, yaxis) def phistogram(self, data, curveparam, histparam, xaxis="bottom", yaxis="left"): """ Make 1D histogram `plot item` (:py:class:`guiqwt.histogram.HistogramItem` object) based on a `guiqwt.styles.CurveParam` and `guiqwt.styles.HistogramParam` instances Usage:: phistogram(data, curveparam, histparam) """ hist = HistogramItem(curveparam, histparam) hist.update_params() hist.set_hist_data(data) self.__set_curve_axes(hist, xaxis, yaxis) return hist def __set_image_param( self, param, title, alpha_mask, alpha, interpolation, **kwargs ): if title: param.label = title else: global IMAGE_COUNT IMAGE_COUNT += 1 param.label = make_title(_("Image"), IMAGE_COUNT) if alpha_mask is not None: assert isinstance(alpha_mask, bool) param.alpha_mask = alpha_mask if alpha is not None: assert 0.0 <= alpha <= 1.0 param.alpha = alpha interp_methods = {"nearest": 0, "linear": 1, "antialiasing": 5} param.interpolation = interp_methods[interpolation] for key, val in list(kwargs.items()): if val is not None: setattr(param, key, val) def _get_image_data(self, data, filename, title, to_grayscale): if data is None: assert filename is not None from guiqwt import io data = io.imread(filename, to_grayscale=to_grayscale) if title is None and filename is not None: title = osp.basename(filename) return data, filename, title @staticmethod def compute_bounds(data, pixel_size, center_on): """Return image bounds from *pixel_size* (scalar or tuple)""" if not isinstance(pixel_size, (tuple, list)): pixel_size = [pixel_size, pixel_size] dx, dy = pixel_size xmin, ymin = 0.0, 0.0 xmax, ymax = data.shape[1] * dx, data.shape[0] * dy if center_on is not None: xc, yc = center_on dx, dy = 0.5 * (xmax - xmin) - xc, 0.5 * (ymax - ymin) - yc xmin -= dx xmax -= dx ymin -= dy ymax -= dy return xmin, xmax, ymin, ymax def image( self, data=None, filename=None, title=None, alpha_mask=None, alpha=None, background_color=None, colormap=None, xdata=[None, None], ydata=[None, None], pixel_size=None, center_on=None, interpolation="linear", eliminate_outliers=None, xformat="%.1f", yformat="%.1f", zformat="%.1f", ): """ Make an image `plot item` from data (:py:class:`guiqwt.image.ImageItem` object or :py:class:`guiqwt.image.RGBImageItem` object if data has 3 dimensions) """ assert isinstance(xdata, (tuple, list)) and len(xdata) == 2 assert isinstance(ydata, (tuple, list)) and len(ydata) == 2 param = ImageParam(title=_("Image"), icon="image.png") data, filename, title = self._get_image_data( data, filename, title, to_grayscale=True ) if data.ndim == 3: return self.rgbimage( data=data, filename=filename, title=title, alpha_mask=alpha_mask, alpha=alpha, ) assert data.ndim == 2, "Data must have 2 dimensions" if pixel_size is None: assert center_on is None, ( "Ambiguous parameters: both `center_on`" " and `xdata`/`ydata` were specified" ) xmin, xmax = xdata ymin, ymax = ydata else: xmin, xmax, ymin, ymax = self.compute_bounds(data, pixel_size, center_on) self.__set_image_param( param, title, alpha_mask, alpha, interpolation, background=background_color, colormap=colormap, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, xformat=xformat, yformat=yformat, zformat=zformat, ) image = ImageItem(data, param) image.set_filename(filename) if eliminate_outliers is not None: image.set_lut_range(lut_range_threshold(image, 256, eliminate_outliers)) return image def maskedimage( self, data=None, mask=None, filename=None, title=None, alpha_mask=False, alpha=1.0, xdata=[None, None], ydata=[None, None], pixel_size=None, center_on=None, background_color=None, colormap=None, show_mask=False, fill_value=None, interpolation="linear", eliminate_outliers=None, xformat="%.1f", yformat="%.1f", zformat="%.1f", ): """ Make a masked image `plot item` from data (:py:class:`guiqwt.image.MaskedImageItem` object) """ assert isinstance(xdata, (tuple, list)) and len(xdata) == 2 assert isinstance(ydata, (tuple, list)) and len(ydata) == 2 param = MaskedImageParam(title=_("Image"), icon="image.png") data, filename, title = self._get_image_data( data, filename, title, to_grayscale=True ) assert data.ndim == 2, "Data must have 2 dimensions" if pixel_size is None: assert center_on is None, ( "Ambiguous parameters: both `center_on`" " and `xdata`/`ydata` were specified" ) xmin, xmax = xdata ymin, ymax = ydata else: xmin, xmax, ymin, ymax = self.compute_bounds(data, pixel_size, center_on) self.__set_image_param( param, title, alpha_mask, alpha, interpolation, background=background_color, colormap=colormap, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, show_mask=show_mask, fill_value=fill_value, xformat=xformat, yformat=yformat, zformat=zformat, ) image = MaskedImageItem(data, mask, param) image.set_filename(filename) if eliminate_outliers is not None: image.set_lut_range(lut_range_threshold(image, 256, eliminate_outliers)) return image def rgbimage( self, data=None, filename=None, title=None, alpha_mask=False, alpha=1.0, xdata=[None, None], ydata=[None, None], pixel_size=None, center_on=None, interpolation="linear", ): """ Make a RGB image `plot item` from data (:py:class:`guiqwt.image.RGBImageItem` object) """ assert isinstance(xdata, (tuple, list)) and len(xdata) == 2 assert isinstance(ydata, (tuple, list)) and len(ydata) == 2 param = RGBImageParam(title=_("Image"), icon="image.png") data, filename, title = self._get_image_data( data, filename, title, to_grayscale=False ) assert data.ndim == 3, "RGB data must have 3 dimensions" if pixel_size is None: assert center_on is None, ( "Ambiguous parameters: both `center_on`" " and `xdata`/`ydata` were specified" ) xmin, xmax = xdata ymin, ymax = ydata else: xmin, xmax, ymin, ymax = self.compute_bounds(data, pixel_size, center_on) self.__set_image_param( param, title, alpha_mask, alpha, interpolation, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, ) image = RGBImageItem(data, param) image.set_filename(filename) return image def quadgrid( self, X, Y, Z, filename=None, title=None, alpha_mask=None, alpha=None, background_color=None, colormap=None, interpolation="linear", ): """ Make a pseudocolor `plot item` of a 2D array (:py:class:`guiqwt.image.QuadGridItem` object) """ param = QuadGridParam(title=_("Image"), icon="image.png") self.__set_image_param( param, title, alpha_mask, alpha, interpolation, colormap=colormap ) image = QuadGridItem(X, Y, Z, param) return image def pcolor(self, *args, **kwargs): """ Make a pseudocolor `plot item` of a 2D array based on MATLAB-like syntax (:py:class:`guiqwt.image.QuadGridItem` object) Examples:: pcolor(C) pcolor(X, Y, C) """ if len(args) == 1: (Z,) = args M, N = Z.shape X, Y = meshgrid(arange(N, dtype=Z.dtype), arange(M, dtype=Z.dtype)) elif len(args) == 3: X, Y, Z = args else: raise RuntimeError("1 or 3 non-keyword arguments expected") return self.quadgrid(X, Y, Z, **kwargs) def trimage( self, data=None, filename=None, title=None, alpha_mask=None, alpha=None, background_color=None, colormap=None, x0=0.0, y0=0.0, angle=0.0, dx=1.0, dy=1.0, interpolation="linear", eliminate_outliers=None, xformat="%.1f", yformat="%.1f", zformat="%.1f", ): """ Make a transformable image `plot item` (image with an arbitrary affine transform) (:py:class:`guiqwt.image.TrImageItem` object) * data: 2D NumPy array (image pixel data) * filename: image filename (if data is not specified) * title: image title (optional) * x0, y0: position * angle: angle (radians) * dx, dy: pixel size along X and Y axes * interpolation: 'nearest', 'linear' (default), 'antialiasing' (5x5) """ param = TrImageParam(title=_("Image"), icon="image.png") data, filename, title = self._get_image_data( data, filename, title, to_grayscale=True ) self.__set_image_param( param, title, alpha_mask, alpha, interpolation, background=background_color, colormap=colormap, x0=x0, y0=y0, angle=angle, dx=dx, dy=dy, xformat=xformat, yformat=yformat, zformat=zformat, ) image = TrImageItem(data, param) image.set_filename(filename) if eliminate_outliers is not None: image.set_lut_range(lut_range_threshold(image, 256, eliminate_outliers)) return image def xyimage( self, x, y, data, title=None, alpha_mask=None, alpha=None, background_color=None, colormap=None, interpolation="linear", eliminate_outliers=None, xformat="%.1f", yformat="%.1f", zformat="%.1f", ): """ Make an xyimage `plot item` (image with non-linear X/Y axes) from data (:py:class:`guiqwt.image.XYImageItem` object) * x: 1D NumPy array (or tuple, list: will be converted to array) * y: 1D NumPy array (or tuple, list: will be converted to array * data: 2D NumPy array (image pixel data) * title: image title (optional) * interpolation: 'nearest', 'linear' (default), 'antialiasing' (5x5) """ param = XYImageParam(title=_("Image"), icon="image.png") self.__set_image_param( param, title, alpha_mask, alpha, interpolation, background=background_color, colormap=colormap, xformat=xformat, yformat=yformat, zformat=zformat, ) if isinstance(x, (list, tuple)): x = array(x) if isinstance(y, (list, tuple)): y = array(y) image = XYImageItem(x, y, data, param) if eliminate_outliers is not None: image.set_lut_range(lut_range_threshold(image, 256, eliminate_outliers)) return image def imagefilter(self, xmin, xmax, ymin, ymax, imageitem, filter, title=None): """ Make a rectangular area image filter `plot item` (:py:class:`guiqwt.image.ImageFilterItem` object) * xmin, xmax, ymin, ymax: filter area bounds * imageitem: An imageitem instance * filter: function (x, y, data) --> data """ param = ImageFilterParam(_("Filter"), icon="funct.png") param.xmin, param.xmax, param.ymin, param.ymax = xmin, xmax, ymin, ymax if title is not None: param.label = title filt = imageitem.get_filter(filter, param) _m, _M = imageitem.get_lut_range() filt.set_lut_range([_m, _M]) return filt def histogram2D( self, X, Y, NX=None, NY=None, logscale=None, title=None, transparent=None, Z=None, computation=-1, interpolation=0, ): """ Make a 2D Histogram `plot item` (:py:class:`guiqwt.image.Histogram2DItem` object) * X: data (1D array) * Y: data (1D array) * NX: Number of bins along x-axis (int) * NY: Number of bins along y-axis (int) * logscale: Z-axis scale (bool) * title: item title (string) * transparent: enable transparency (bool) """ basename = _("2D Histogram") param = Histogram2DParam(title=basename, icon="histogram2d.png") if NX is not None: param.nx_bins = NX if NY is not None: param.ny_bins = NY if logscale is not None: param.logscale = int(logscale) if title is not None: param.label = title else: global HISTOGRAM2D_COUNT HISTOGRAM2D_COUNT += 1 param.label = make_title(basename, HISTOGRAM2D_COUNT) if transparent is not None: param.transparent = transparent param.computation = computation param.interpolation = interpolation return Histogram2DItem(X, Y, param, Z=Z) def label(self, text, g, c, anchor, title=""): """ Make a label `plot item` (:py:class:`guiqwt.label.LabelItem` object) * text: label text (string) * g: position in plot coordinates (tuple) or relative position (string) * c: position in canvas coordinates (tuple) * anchor: anchor position in relative position (string) * title: label name (optional) Examples:: make.label("Relative position", (x[0], y[0]), (10, 10), "BR") make.label("Absolute position", "R", (0,0), "R") """ basename = _("Label") param = LabelParamWithContents(basename, icon="label.png") param.read_config(CONF, "plot", "label") if title: param.label = title else: global LABEL_COUNT LABEL_COUNT += 1 param.label = make_title(basename, LABEL_COUNT) if isinstance(g, tuple): param.abspos = False param.xg, param.yg = g else: param.abspos = True param.absg = g if c is None: c = ANCHOR_OFFSETS[anchor] param.xc, param.yc = c param.anchor = anchor return LabelItem(text, param) def legend(self, anchor="TR", c=None, restrict_items=None): """ Make a legend `plot item` (:py:class:`guiqwt.label.LegendBoxItem` or :py:class:`guiqwt.label.SelectedLegendBoxItem` object) * anchor: legend position in relative position (string) * c (optional): position in canvas coordinates (tuple) * restrict_items (optional): - None: all items are shown in legend box - []: no item shown - [item1, item2]: item1, item2 are shown in legend box """ param = LegendParam(_("Legend"), icon="legend.png") param.read_config(CONF, "plot", "legend") param.abspos = True param.absg = anchor param.anchor = anchor if c is None: c = ANCHOR_OFFSETS[anchor] param.xc, param.yc = c if restrict_items is None: return LegendBoxItem(param) else: return SelectedLegendBoxItem(param, restrict_items) def range(self, xmin, xmax): return XRangeSelection(xmin, xmax) def vcursor(self, x, label=None, constraint_cb=None, movable=True, readonly=False): """ Make a vertical cursor `plot item` Convenient function to make a vertical marker (:py:class:`guiqwt.shapes.Marker` object) """ if label is None: label_cb = lambda x, y: "" else: label_cb = lambda x, y: label % x return self.marker( position=(x, 0), markerstyle="|", label_cb=label_cb, constraint_cb=constraint_cb, movable=movable, readonly=readonly, ) def hcursor(self, y, label=None, constraint_cb=None, movable=True, readonly=False): """ Make an horizontal cursor `plot item` Convenient function to make an horizontal marker (:py:class:`guiqwt.shapes.Marker` object) """ if label is None: label_cb = lambda x, y: "" else: label_cb = lambda x, y: label % y return self.marker( position=(0, y), markerstyle="-", label_cb=label_cb, constraint_cb=constraint_cb, movable=movable, readonly=readonly, ) def xcursor( self, x, y, label=None, constraint_cb=None, movable=True, readonly=False ): """ Make an cross cursor `plot item` Convenient function to make an cross marker (:py:class:`guiqwt.shapes.Marker` object) """ if label is None: label_cb = lambda x, y: "" else: label_cb = lambda x, y: label % (x, y) return self.marker( position=(x, y), markerstyle="+", label_cb=label_cb, constraint_cb=constraint_cb, movable=movable, readonly=readonly, ) def marker( self, position=None, label_cb=None, constraint_cb=None, movable=True, readonly=False, markerstyle=None, markerspacing=None, color=None, linestyle=None, linewidth=None, marker=None, markersize=None, markerfacecolor=None, markeredgecolor=None, ): """ Make a marker `plot item` (:py:class:`guiqwt.shapes.Marker` object) * position: tuple (x, y) * label_cb: function with two arguments (x, y) returning a string * constraint_cb: function with two arguments (x, y) returning a tuple (x, y) according to the marker constraint * movable: if True (default), marker will be movable * readonly: if False (default), marker can be deleted * markerstyle: '+', '-', '|' or None * markerspacing: spacing between text and marker line * color: marker color name * linestyle: marker line style (MATLAB-like string or attribute name from the :py:class:`PyQt5.QtCore.Qt.PenStyle` enum (i.e. "SolidLine" "DashLine", "DotLine", "DashDotLine", "DashDotDotLine" or "NoPen") * linewidth: line width (pixels) * marker: marker shape (MATLAB-like string or "Cross", "Ellipse", "Star1", "XCross", "Rect", "Diamond", "UTriangle", "DTriangle", "RTriangle", "LTriangle", "Star2", "NoSymbol") * markersize: marker size (pixels) * markerfacecolor: marker face color name * markeredgecolor: marker edge color name """ param = MarkerParam(_("Marker"), icon="marker.png") param.read_config(CONF, "plot", "marker/cursor") if ( color or linestyle or linewidth or marker or markersize or markerfacecolor or markeredgecolor ): param.line = param.sel_line param.symbol = param.sel_symbol param.text = param.sel_text self.__set_baseparam( param, color, linestyle, linewidth, marker, markersize, markerfacecolor, markeredgecolor, ) param.sel_line = param.line param.sel_symbol = param.symbol param.sel_text = param.text if markerstyle: param.set_markerstyle(markerstyle) if markerspacing: param.spacing = markerspacing if not movable: param.symbol.marker = param.sel_symbol.marker = "NoSymbol" marker = Marker( label_cb=label_cb, constraint_cb=constraint_cb, markerparam=param ) if position is not None: x, y = position marker.set_pos(x, y) marker.set_readonly(readonly) if not movable: marker.set_movable(False) marker.set_resizable(False) return marker def __shape(self, shapeclass, x0, y0, x1, y1, title=None): shape = shapeclass(x0, y0, x1, y1) shape.set_style("plot", "shape/drag") if title is not None: shape.setTitle(title) return shape def rectangle(self, x0, y0, x1, y1, title=None): """ Make a rectangle shape `plot item` (:py:class:`guiqwt.shapes.RectangleShape` object) * x0, y0, x1, y1: rectangle coordinates * title: label name (optional) """ return self.__shape(RectangleShape, x0, y0, x1, y1, title) def ellipse(self, x0, y0, x1, y1, title=None): """ Make an ellipse shape `plot item` (:py:class:`guiqwt.shapes.EllipseShape` object) * x0, y0, x1, y1: ellipse x-axis coordinates * title: label name (optional) """ shape = EllipseShape(x0, y0, x1, y1) shape.set_style("plot", "shape/drag") if title is not None: shape.setTitle(title) return shape def circle(self, x0, y0, x1, y1, title=None): """ Make a circle shape `plot item` (:py:class:`guiqwt.shapes.EllipseShape` object) * x0, y0, x1, y1: circle diameter coordinates * title: label name (optional) """ return self.ellipse(x0, y0, x1, y1, title=title) def segment(self, x0, y0, x1, y1, title=None): """ Make a segment shape `plot item` (:py:class:`guiqwt.shapes.SegmentShape` object) * x0, y0, x1, y1: segment coordinates * title: label name (optional) """ return self.__shape(SegmentShape, x0, y0, x1, y1, title) def __get_annotationparam(self, title, subtitle): param = AnnotationParam(_("Annotation"), icon="annotation.png") if title is not None: param.title = title if subtitle is not None: param.subtitle = subtitle return param def __annotated_shape(self, shapeclass, x0, y0, x1, y1, title, subtitle): param = self.__get_annotationparam(title, subtitle) shape = shapeclass(x0, y0, x1, y1, param) shape.set_style("plot", "shape/drag") return shape def annotated_rectangle(self, x0, y0, x1, y1, title=None, subtitle=None): """ Make an annotated rectangle `plot item` (:py:class:`guiqwt.annotations.AnnotatedRectangle` object) * x0, y0, x1, y1: rectangle coordinates * title, subtitle: strings """ return self.__annotated_shape( AnnotatedRectangle, x0, y0, x1, y1, title, subtitle ) def annotated_ellipse(self, x0, y0, x1, y1, ratio, title=None, subtitle=None): """ Make an annotated ellipse `plot item` (:py:class:`guiqwt.annotations.AnnotatedEllipse` object) * x0, y0, x1, y1: ellipse rectangle coordinates * ratio: ratio between y-axis and x-axis lengths * title, subtitle: strings """ param = self.__get_annotationparam(title, subtitle) shape = AnnotatedEllipse(x0, y0, x1, y1, ratio, param) shape.set_style("plot", "shape/drag") return shape def annotated_circle(self, x0, y0, x1, y1, ratio, title=None, subtitle=None): """ Make an annotated circle `plot item` (:py:class:`guiqwt.annotations.AnnotatedCircle` object) * x0, y0, x1, y1: circle diameter coordinates * title, subtitle: strings """ return self.annotated_ellipse(x0, y0, x1, y1, 1.0, title, subtitle) def annotated_segment(self, x0, y0, x1, y1, title=None, subtitle=None): """ Make an annotated segment `plot item` (:py:class:`guiqwt.annotations.AnnotatedSegment` object) * x0, y0, x1, y1: segment coordinates * title, subtitle: strings """ return self.__annotated_shape(AnnotatedSegment, x0, y0, x1, y1, title, subtitle) def info_label(self, anchor, comps, title=None): """ Make an info label `plot item` (:py:class:`guiqwt.label.DataInfoLabel` object) """ basename = _("Computation") param = LabelParam(basename, icon="label.png") param.read_config(CONF, "plot", "info_label") if title is not None: param.label = title else: global LABEL_COUNT LABEL_COUNT += 1 param.label = make_title(basename, LABEL_COUNT) param.abspos = True param.absg = anchor param.anchor = anchor c = ANCHOR_OFFSETS[anchor] param.xc, param.yc = c return DataInfoLabel(param, comps) def range_info_label(self, range, anchor, label, function=None, title=None): """ Make an info label `plot item` showing an XRangeSelection object infos (:py:class:`guiqwt.label.DataInfoLabel` object) (see example: :py:mod:`guiqwt.tests.computations`) Default function is `lambda x, dx: (x, dx)`. Example:: x = linspace(-10, 10, 10) y = sin(sin(sin(x))) range = make.range(-2, 2) disp = make.range_info_label(range, 'BL', "x = %.1f ± %.1f cm", lambda x, dx: (x, dx)) """ info = RangeInfo(label, range, function) return make.info_label(anchor, info, title=title) def computation(self, range, anchor, label, curve, function, title=None): """ Make a computation label `plot item` (:py:class:`guiqwt.label.DataInfoLabel` object) (see example: :py:mod:`guiqwt.tests.computations`) """ if title is None: title = curve.curveparam.label return self.computations(range, anchor, [(curve, label, function)], title=title) def computations(self, range, anchor, specs, title=None): """ Make computation labels `plot item` (:py:class:`guiqwt.label.DataInfoLabel` object) (see example: :py:mod:`guiqwt.tests.computations`) """ comps = [] same_curve = True curve0 = None for curve, label, function in specs: comp = RangeComputation(label, curve, range, function) comps.append(comp) if curve0 is None: curve0 = curve same_curve = same_curve and curve is curve0 if title is None and same_curve: title = curve.curveparam.label return self.info_label(anchor, comps, title=title) def computation2d(self, rect, anchor, label, image, function, title=None): """ Make a 2D computation label `plot item` (:py:class:`guiqwt.label.RangeComputation2d` object) (see example: :py:mod:`guiqwt.tests.computations`) """ return self.computations2d( rect, anchor, [(image, label, function)], title=title ) def computations2d(self, rect, anchor, specs, title=None): """ Make 2D computation labels `plot item` (:py:class:`guiqwt.label.RangeComputation2d` object) (see example: :py:mod:`guiqwt.tests.computations`) """ comps = [] same_image = True image0 = None for image, label, function in specs: comp = RangeComputation2d(label, image, rect, function) comps.append(comp) if image0 is None: image0 = image same_image = same_image and image is image0 if title is None and same_image: title = image.imageparam.label return self.info_label(anchor, comps, title=title) make = PlotItemBuilder() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615660180.0 guiqwt-4.0.1/guiqwt/colormap.py0000666000000000000000000000732600000000000013445 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.colormap --------------- The `colormap` module contains definition of common colormaps and tools to manipulate and create them """ from qtpy.QtGui import QColor, QIcon, QPixmap from numpy import array, uint8, linspace, zeros, newaxis # Local imports from guiqwt.transitional import QwtLinearColorMap, QwtInterval, toQImage from guiqwt import _cm # Reuse matplotlib data def _interpolate(val, vmin, vmax): """Interpolate a color component between to values as provided by matplotlib colormaps """ interp = (val - vmin[0]) / (vmax[0] - vmin[0]) return (1 - interp) * vmin[1] + interp * vmax[2] def _setup_colormap(cmap, cmdata): """Setup a QwtLinearColorMap according to matplotlib's data """ red = array(cmdata["red"]) green = array(cmdata["green"]) blue = array(cmdata["blue"]) qmin = QColor() qmin.setRgbF(red[0, 2], green[0, 2], blue[0, 2]) qmax = QColor() qmax.setRgbF(red[-1, 2], green[-1, 2], blue[-1, 2]) cmap.setColorInterval(qmin, qmax) indices = sorted(set(red[:, 0]) | set(green[:, 0]) | set(blue[:, 0])) for i in indices[1:-1]: idxr = red[:, 0].searchsorted(i) idxg = green[:, 0].searchsorted(i) idxb = blue[:, 0].searchsorted(i) compr = _interpolate(i, red[idxr - 1], red[idxr]) compg = _interpolate(i, green[idxg - 1], green[idxg]) compb = _interpolate(i, blue[idxb - 1], blue[idxb]) col = QColor() col.setRgbF(compr, compg, compb) cmap.addColorStop(i, col) # usefull to obtain a full color map FULLRANGE = QwtInterval(0.0, 1.0) COLORMAPS = {} EXTRA_COLORMAPS = [] # custom build colormaps def get_cmap(name): """ Return a QwtColormap based on matplotlib's colormap of the same name We avoid rebuilding the cmap by keeping it in cache """ if name in COLORMAPS: return COLORMAPS[name] colormap = QwtLinearColorMap() COLORMAPS[name] = colormap COLORMAPS[colormap] = name data = getattr(_cm, "_" + name + "_data") _setup_colormap(colormap, data) return colormap def get_cmap_name(cmap): """Return colormap's name""" return COLORMAPS.get(cmap, None) def get_colormap_list(): """Builds a list of available colormaps by introspection of the _cm module""" cmlist = [] cmlist += EXTRA_COLORMAPS for name in dir(_cm): if name.endswith("_data"): obj = getattr(_cm, name) if isinstance(obj, dict): cmlist.append(name[1:-5]) return cmlist def build_icon_from_cmap(cmap, width=24, height=24): """ Builds an icon representing the colormap """ data = zeros((width, height), uint8) line = linspace(0, 255, width) data[:, :] = line[:, newaxis] img = toQImage(data) img.setColorTable(cmap.colorTable(FULLRANGE)) return QIcon(QPixmap.fromImage(img)) ICON_CACHE = {} def build_icon_from_cmap_name(cmap_name): if cmap_name in ICON_CACHE: return ICON_CACHE[cmap_name] icon = build_icon_from_cmap(get_cmap(cmap_name)) ICON_CACHE[cmap_name] = icon return icon def register_extra_colormap(name, colormap): """Add a custom colormap to the list of known colormaps must be done early in the import process because datasets will use get_color_map list at import time colormap is a QwtColorMap object """ COLORMAPS[name] = colormap COLORMAPS[colormap] = name EXTRA_COLORMAPS.append(name) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/config.py0000666000000000000000000010133000000000000013064 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.config ------------- The `config` module handles `guiqwt` configuration (options, images and icons). """ import os.path as osp from guidata.configtools import add_image_module_path, get_translation from guidata.external import darkdetect IS_DARK = darkdetect.isDark() MAIN_FG_COLOR = "white" if IS_DARK else "black" MAIN_BG_COLOR = "#222222" if IS_DARK else "white" _ = get_translation("guiqwt") def make_title(basename, count): """Make item title with *basename* and *count* number""" return "%s %s%d" % (basename, _("#"), count) APP_PATH = osp.dirname(__file__) add_image_module_path("guiqwt", "images") DEFAULTS = { "plot": { "selection/distance": 6, "antialiasing": False, "title/font/size": 12, "title/font/bold": False, "selected_curve_symbol/marker": "Rect", "selected_curve_symbol/edgecolor": "gray", "selected_curve_symbol/facecolor": MAIN_FG_COLOR, "selected_curve_symbol/alpha": 0.3, "selected_curve_symbol/size": 7, # Default parameters for plot axes "axis/title": "", "axis/unit": "", "axis/color": MAIN_FG_COLOR, "axis/title_font/size": 8, "axis/title_font/family": "default", "axis/title_font/bold": False, "axis/title_font/italic": False, "axis/ticks_font/size": 8, "axis/ticks_font/family": "default", "axis/ticks_font/bold": False, "axis/ticks_font/italic": False, # Default parameters for X/Y image axes "image_axis/title": "", "image_axis/unit": _("pixels"), "image_axis/color": MAIN_FG_COLOR, "image_axis/title_font/size": 8, "image_axis/title_font/family": "default", "image_axis/title_font/bold": False, "image_axis/title_font/italic": False, "image_axis/ticks_font/size": 8, "image_axis/ticks_font/family": "default", "image_axis/ticks_font/bold": False, "image_axis/ticks_font/italic": False, # Default parameters for color scale "color_axis/title": _("Intensity"), "color_axis/unit": _("lsb"), "color_axis/color": MAIN_FG_COLOR, "color_axis/title_font/size": 8, "color_axis/title_font/family": "default", "color_axis/title_font/bold": False, "color_axis/title_font/italic": False, "color_axis/ticks_font/size": 8, "color_axis/ticks_font/family": "default", "color_axis/ticks_font/bold": False, "color_axis/ticks_font/italic": False, "grid/background": MAIN_BG_COLOR, "grid/maj_xenabled": True, "grid/maj_yenabled": True, "grid/maj_line/color": "darkgray", "grid/maj_line/width": 1, "grid/maj_line/style": "DotLine", "grid/min_xenabled": True, "grid/min_yenabled": True, "grid/min_line/color": "#454545" if IS_DARK else "#eaeaea", "grid/min_line/width": 1, "grid/min_line/style": "DotLine", "marker/curve/symbol/marker": "Rect", "marker/curve/symbol/edgecolor": "blue", "marker/curve/symbol/facecolor": "cyan", "marker/curve/symbol/alpha": 0.8, "marker/curve/symbol/size": 7, "marker/curve/text/font/size": 8, "marker/curve/text/font/family": "default", "marker/curve/text/font/bold": False, "marker/curve/text/font/italic": False, "marker/curve/text/textcolor": MAIN_FG_COLOR, "marker/curve/text/background_color": "#ffffff", "marker/curve/text/background_alpha": 0.8, "marker/curve/line/style": "SolidLine", "marker/curve/line/color": MAIN_FG_COLOR, "marker/curve/line/width": 0, "marker/curve/sel_symbol/marker": "Rect", "marker/curve/sel_symbol/edgecolor": "blue", "marker/curve/sel_symbol/facecolor": "cyan", "marker/curve/sel_symbol/alpha": 0.8, "marker/curve/sel_symbol/size": 7, "marker/curve/sel_text/font/size": 8, "marker/curve/sel_text/font/family": "default", "marker/curve/sel_text/font/bold": False, "marker/curve/sel_text/font/italic": False, "marker/curve/sel_text/textcolor": MAIN_FG_COLOR, "marker/curve/sel_text/background_color": "#ffffff", "marker/curve/sel_text/background_alpha": 0.8, "marker/curve/sel_line/style": "SolidLine", "marker/curve/sel_line/color": MAIN_FG_COLOR, "marker/curve/sel_line/width": 0, "marker/curve/markerstyle": "NoLine", "marker/curve/spacing": 7, "marker/cross/symbol/marker": "Cross", "marker/cross/symbol/edgecolor": MAIN_FG_COLOR, "marker/cross/symbol/facecolor": "red", "marker/cross/symbol/alpha": 1.0, "marker/cross/symbol/size": 8, "marker/cross/text/font/family": "default", "marker/cross/text/font/size": 8, "marker/cross/text/font/bold": False, "marker/cross/text/font/italic": False, "marker/cross/text/textcolor": MAIN_FG_COLOR, "marker/cross/text/background_color": "#ffffff", "marker/cross/text/background_alpha": 0.8, "marker/cross/line/style": "DashLine", "marker/cross/line/color": "yellow", "marker/cross/line/width": 1, "marker/cross/sel_symbol/marker": "Cross", "marker/cross/sel_symbol/edgecolor": MAIN_FG_COLOR, "marker/cross/sel_symbol/facecolor": "red", "marker/cross/sel_symbol/alpha": 1.0, "marker/cross/sel_symbol/size": 8, "marker/cross/sel_text/font/family": "default", "marker/cross/sel_text/font/size": 8, "marker/cross/sel_text/font/bold": False, "marker/cross/sel_text/font/italic": False, "marker/cross/sel_text/textcolor": MAIN_FG_COLOR, "marker/cross/sel_text/background_color": "#ffffff", "marker/cross/sel_text/background_alpha": 0.8, "marker/cross/sel_line/style": "DashLine", "marker/cross/sel_line/color": "yellow", "marker/cross/sel_line/width": 1, "marker/cross/markerstyle": "Cross", "marker/cross/spacing": 7, "marker/selectpoint/symbol/marker": "Rect", "marker/selectpoint/symbol/edgecolor": "blue", "marker/selectpoint/symbol/facecolor": "cyan", "marker/selectpoint/symbol/alpha": 0.8, "marker/selectpoint/symbol/size": 7, "marker/selectpoint/text/font/size": 8, "marker/selectpoint/text/font/family": "default", "marker/selectpoint/text/font/bold": False, "marker/selectpoint/text/font/italic": False, "marker/selectpoint/text/textcolor": MAIN_FG_COLOR, "marker/selectpoint/text/background_color": "#ffffff", "marker/selectpoint/text/background_alpha": 0.8, "marker/selectpoint/line/style": "SolidLine", "marker/selectpoint/line/color": MAIN_FG_COLOR, "marker/selectpoint/line/width": 0, "marker/selectpoint/sel_symbol/marker": "Rect", "marker/selectpoint/sel_symbol/edgecolor": "blue", "marker/selectpoint/sel_symbol/facecolor": "cyan", "marker/selectpoint/sel_symbol/alpha": 0.8, "marker/selectpoint/sel_symbol/size": 7, "marker/selectpoint/sel_text/font/size": 8, "marker/selectpoint/sel_text/font/family": "default", "marker/selectpoint/sel_text/font/bold": False, "marker/selectpoint/sel_text/font/italic": False, "marker/selectpoint/sel_text/textcolor": MAIN_FG_COLOR, "marker/selectpoint/sel_text/background_color": "#ffffff", "marker/selectpoint/sel_text/background_alpha": 0.8, "marker/selectpoint/sel_line/style": "SolidLine", "marker/selectpoint/sel_line/color": MAIN_FG_COLOR, "marker/selectpoint/sel_line/width": 0, "marker/selectpoint/markerstyle": "NoLine", "marker/selectpoint/spacing": 7, "marker/cursor/line/style": "SolidLine", "marker/cursor/line/color": "#ff9393", "marker/cursor/line/width": 1.0, "marker/cursor/symbol/marker": "Ellipse", "marker/cursor/symbol/size": 7, "marker/cursor/symbol/edgecolor": MAIN_BG_COLOR, "marker/cursor/symbol/facecolor": "#ff9393", "marker/cursor/symbol/alpha": 1.0, "marker/cursor/text/font/size": 8, "marker/cursor/text/font/family": "default", "marker/cursor/text/font/bold": False, "marker/cursor/text/font/italic": False, "marker/cursor/text/textcolor": "#ff9393", "marker/cursor/text/background_color": "#ffffff", "marker/cursor/text/background_alpha": 0.8, "marker/cursor/sel_line/style": "SolidLine", "marker/cursor/sel_line/color": "red", "marker/cursor/sel_line/width": 2.0, "marker/cursor/sel_symbol/marker": "Ellipse", "marker/cursor/sel_symbol/size": 9, "marker/cursor/sel_symbol/edgecolor": MAIN_BG_COLOR, "marker/cursor/sel_symbol/facecolor": "red", "marker/cursor/sel_symbol/alpha": 0.9, "marker/cursor/sel_text/font/size": 8, "marker/cursor/sel_text/font/family": "default", "marker/cursor/sel_text/font/bold": True, "marker/cursor/sel_text/font/italic": False, "marker/cursor/sel_text/textcolor": "red", "marker/cursor/sel_text/background_color": "#ffffff", "marker/cursor/sel_text/background_alpha": 0.8, "marker/cursor/markerstyle": "NoLine", "marker/cursor/spacing": 7, "shape/drag/line/style": "SolidLine", "shape/drag/line/color": "#ffff00", "shape/drag/line/width": 1, "shape/drag/fill/style": "SolidPattern", "shape/drag/fill/color": MAIN_BG_COLOR, "shape/drag/fill/alpha": 0.1, "shape/drag/symbol/marker": "Rect", "shape/drag/symbol/size": 3, "shape/drag/symbol/edgecolor": "#ffff00", "shape/drag/symbol/facecolor": "#ffff00", "shape/drag/symbol/alpha": 1.0, "shape/drag/sel_line/style": "SolidLine", "shape/drag/sel_line/color": "#00ff00", "shape/drag/sel_line/width": 1, "shape/drag/sel_fill/style": "SolidPattern", "shape/drag/sel_fill/color": MAIN_BG_COLOR, "shape/drag/sel_fill/alpha": 0.1, "shape/drag/sel_symbol/marker": "Rect", "shape/drag/sel_symbol/size": 9, "shape/drag/sel_symbol/edgecolor": "#00aa00", "shape/drag/sel_symbol/facecolor": "#00ff00", "shape/drag/sel_symbol/alpha": 0.7, "shape/imageborder/line/style": "NoPen", "shape/imageborder/line/color": "gray", "shape/imageborder/line/width": 0, "shape/imageborder/fill/style": "NoBrush", "shape/imageborder/fill/color": "black", "shape/imageborder/fill/alpha": 0.0, "shape/imageborder/fill/angle": 0.0, "shape/imageborder/fill/sx": 1.0, "shape/imageborder/fill/sy": 1.0, "shape/imageborder/symbol/marker": "NoSymbol", "shape/imageborder/symbol/size": 7, "shape/imageborder/symbol/edgecolor": "gray", "shape/imageborder/symbol/facecolor": MAIN_FG_COLOR, "shape/imageborder/symbol/alpha": 0.3, "shape/imageborder/sel_line/style": "SolidLine", "shape/imageborder/sel_line/color": "gray", "shape/imageborder/sel_line/width": 3, "shape/imageborder/sel_symbol/marker": "Rect", "shape/imageborder/sel_symbol/size": 7, "shape/imageborder/sel_symbol/edgecolor": "gray", "shape/imageborder/sel_symbol/facecolor": MAIN_FG_COLOR, "shape/imageborder/sel_symbol/alpha": 0.8, "shape/imageborder/sel_fill/style": "NoBrush", "shape/imageborder/sel_fill/color": "gray", "shape/imageborder/sel_fill/alpha": 0.5, "shape/imageborder/sel_fill/angle": 0.0, "shape/imageborder/sel_fill/sx": 1.0, "shape/imageborder/sel_fill/sy": 1.0, "shape/imagefilter/line/style": "SolidLine", "shape/imagefilter/line/color": "#ffff00", "shape/imagefilter/line/width": 1, "shape/imagefilter/sel_line/style": "SolidLine", "shape/imagefilter/sel_line/color": "#00ffff", "shape/imagefilter/sel_line/width": 2, "shape/imagefilter/fill/style": "NoBrush", "shape/imagefilter/fill/color": MAIN_BG_COLOR, "shape/imagefilter/fill/alpha": 0.0, "shape/imagefilter/sel_fill/style": "SolidPattern", "shape/imagefilter/sel_fill/color": MAIN_BG_COLOR, "shape/imagefilter/sel_fill/alpha": 0.2, "shape/imagefilter/symbol/marker": "Rect", "shape/imagefilter/symbol/size": 3, "shape/imagefilter/symbol/edgecolor": "#ffff00", "shape/imagefilter/symbol/facecolor": "#ffff00", "shape/imagefilter/symbol/alpha": 1.0, "shape/imagefilter/sel_symbol/marker": "Ellipse", "shape/imagefilter/sel_symbol/size": 7, "shape/imagefilter/sel_symbol/edgecolor": "#0000ff", "shape/imagefilter/sel_symbol/facecolor": "#00ffff", "shape/imagefilter/sel_symbol/alpha": 0.8, "shape/rectzoom/line/style": "SolidLine", "shape/rectzoom/line/color": "#bbbbbb", "shape/rectzoom/line/width": 2, # not used -- start "shape/rectzoom/sel_line/style": "SolidLine", "shape/rectzoom/sel_line/color": "green", "shape/rectzoom/sel_line/width": 2, # not used -- end "shape/rectzoom/fill/color": "yellow", "shape/rectzoom/fill/style": "SolidPattern", "shape/rectzoom/fill/alpha": 0.1, # not used -- start "shape/rectzoom/symbol/marker": "NoSymbol", "shape/rectzoom/symbol/size": 0, "shape/rectzoom/symbol/edgecolor": MAIN_FG_COLOR, "shape/rectzoom/symbol/facecolor": "yellow", "shape/rectzoom/symbol/alpha": 1.0, "shape/rectzoom/sel_symbol/marker": "Rect", "shape/rectzoom/sel_symbol/size": 5, "shape/rectzoom/sel_symbol/edgecolor": MAIN_FG_COLOR, "shape/rectzoom/sel_symbol/facecolor": "yellow", "shape/rectzoom/sel_symbol/alpha": 1.0, # not used -- end "shape/axes/border/line/style": "SolidLine", "shape/axes/border/line/color": "magenta", "shape/axes/border/line/width": 1, "shape/axes/border/sel_line/style": "SolidLine", "shape/axes/border/sel_line/color": "magenta", "shape/axes/border/sel_line/width": 2, "shape/axes/border/fill/style": "NoBrush", "shape/axes/border/fill/color": "magenta", "shape/axes/border/fill/alpha": 0.0, "shape/axes/border/sel_fill/style": "SolidPattern", "shape/axes/border/sel_fill/color": "magenta", "shape/axes/border/sel_fill/alpha": 0.3, "shape/axes/border/symbol/marker": "NoSymbol", "shape/axes/border/symbol/size": 0, "shape/axes/border/symbol/edgecolor": MAIN_FG_COLOR, "shape/axes/border/symbol/facecolor": "yellow", "shape/axes/border/symbol/alpha": 1.0, "shape/axes/border/sel_symbol/marker": "NoSymbol", "shape/axes/border/sel_symbol/size": 5, "shape/axes/border/sel_symbol/edgecolor": MAIN_FG_COLOR, "shape/axes/border/sel_symbol/facecolor": "yellow", "shape/axes/border/sel_symbol/alpha": 1.0, "shape/axes/arrow_size": 8, "shape/axes/arrow_angle": 30, "shape/axes/xarrow_pen/style": "SolidLine", "shape/axes/xarrow_pen/color": "red", "shape/axes/xarrow_pen/width": 1, "shape/axes/xarrow_brush/color": "red", "shape/axes/xarrow_brush/alpha": 0.2, "shape/axes/yarrow_pen/style": "SolidLine", "shape/axes/yarrow_pen/color": "green", "shape/axes/yarrow_pen/width": 1, "shape/axes/yarrow_brush/color": "green", "shape/axes/yarrow_brush/alpha": 0.2, "shape/image_stats/line/style": "DashLine", "shape/image_stats/line/color": "#ff88dc", "shape/image_stats/line/width": 1, "shape/image_stats/fill/style": "SolidPattern", "shape/image_stats/fill/color": MAIN_BG_COLOR, "shape/image_stats/fill/alpha": 0.1, "shape/image_stats/symbol/marker": "Rect", "shape/image_stats/symbol/size": 3, "shape/image_stats/symbol/edgecolor": "#ff55dc", "shape/image_stats/symbol/facecolor": "#ff88dc", "shape/image_stats/symbol/alpha": 0.6, "shape/image_stats/sel_line/style": "DashLine", "shape/image_stats/sel_line/color": "#ff00dc", "shape/image_stats/sel_line/width": 1, "shape/image_stats/sel_fill/style": "SolidPattern", "shape/image_stats/sel_fill/color": MAIN_BG_COLOR, "shape/image_stats/sel_fill/alpha": 0.1, "shape/image_stats/sel_symbol/marker": "Rect", "shape/image_stats/sel_symbol/size": 5, "shape/image_stats/sel_symbol/edgecolor": "#ff00dc", "shape/image_stats/sel_symbol/facecolor": "#ff88dc", "shape/image_stats/sel_symbol/alpha": 0.7, "shape/cross_section/line/style": "DotLine", "shape/cross_section/line/color": "#ff5555", "shape/cross_section/line/width": 1, "shape/cross_section/fill/style": "SolidPattern", "shape/cross_section/fill/color": MAIN_BG_COLOR, "shape/cross_section/fill/alpha": 0.1, "shape/cross_section/symbol/marker": "Cross", "shape/cross_section/symbol/size": 100, "shape/cross_section/symbol/edgecolor": "cyan", "shape/cross_section/symbol/facecolor": "cyan", "shape/cross_section/symbol/alpha": 0.6, "shape/cross_section/sel_line/style": "DotLine", "shape/cross_section/sel_line/color": "#ff0000", "shape/cross_section/sel_line/width": 1, "shape/cross_section/sel_fill/style": "SolidPattern", "shape/cross_section/sel_fill/color": MAIN_BG_COLOR, "shape/cross_section/sel_fill/alpha": 0.1, "shape/cross_section/sel_symbol/marker": "Cross", "shape/cross_section/sel_symbol/size": 10000, "shape/cross_section/sel_symbol/edgecolor": "cyan", "shape/cross_section/sel_symbol/facecolor": "cyan", "shape/cross_section/sel_symbol/alpha": 0.7, "shape/average_cross_section/line/style": "DotLine", "shape/average_cross_section/line/color": "#ff5555", "shape/average_cross_section/line/width": 1, "shape/average_cross_section/fill/style": "SolidPattern", "shape/average_cross_section/fill/color": MAIN_BG_COLOR, "shape/average_cross_section/fill/alpha": 0.1, "shape/average_cross_section/symbol/marker": "Diamond", "shape/average_cross_section/symbol/size": 7, "shape/average_cross_section/symbol/edgecolor": "#ff5555", "shape/average_cross_section/symbol/facecolor": "#ff5555", "shape/average_cross_section/symbol/alpha": 0.6, "shape/average_cross_section/sel_line/style": "DotLine", "shape/average_cross_section/sel_line/color": "#ff0000", "shape/average_cross_section/sel_line/width": 1, "shape/average_cross_section/sel_fill/style": "SolidPattern", "shape/average_cross_section/sel_fill/color": MAIN_BG_COLOR, "shape/average_cross_section/sel_fill/alpha": 0.1, "shape/average_cross_section/sel_symbol/marker": "Diamond", "shape/average_cross_section/sel_symbol/size": 9, "shape/average_cross_section/sel_symbol/edgecolor": "#aa0000", "shape/average_cross_section/sel_symbol/facecolor": "#ff0000", "shape/average_cross_section/sel_symbol/alpha": 0.7, "shape/mask/line/style": "DotLine", "shape/mask/line/color": "#5555ff", "shape/mask/line/width": 1, "shape/mask/fill/style": "SolidPattern", "shape/mask/fill/color": MAIN_BG_COLOR, "shape/mask/fill/alpha": 0.1, "shape/mask/symbol/marker": "Rect", "shape/mask/symbol/size": 7, "shape/mask/symbol/edgecolor": "#5555ff", "shape/mask/symbol/facecolor": "#5555ff", "shape/mask/symbol/alpha": 0.6, "shape/mask/sel_line/style": "DotLine", "shape/mask/sel_line/color": "#0000ff", "shape/mask/sel_line/width": 1, "shape/mask/sel_fill/style": "SolidPattern", "shape/mask/sel_fill/color": MAIN_BG_COLOR, "shape/mask/sel_fill/alpha": 0.1, "shape/mask/sel_symbol/marker": "Rect", "shape/mask/sel_symbol/size": 9, "shape/mask/sel_symbol/edgecolor": "#0000aa", "shape/mask/sel_symbol/facecolor": "#0000ff", "shape/mask/sel_symbol/alpha": 0.7, "shape/point/line/style": "SolidLine", "shape/point/line/color": "#ffff00", "shape/point/line/width": 1, "shape/point/sel_line/style": "SolidLine", "shape/point/sel_line/color": "#00ff00", "shape/point/sel_line/width": 1, "shape/point/fill/style": "NoBrush", "shape/point/sel_fill/style": "NoBrush", "shape/point/symbol/marker": "XCross", "shape/point/symbol/size": 9, "shape/point/symbol/edgecolor": "#ffff00", "shape/point/symbol/facecolor": "#ffff00", "shape/point/symbol/alpha": 1.0, "shape/point/sel_symbol/marker": "XCross", "shape/point/sel_symbol/size": 12, "shape/point/sel_symbol/edgecolor": "#00aa00", "shape/point/sel_symbol/facecolor": "#00ff00", "shape/point/sel_symbol/alpha": 0.7, "shape/segment/line/style": "SolidLine", "shape/segment/line/color": "#ffff00", "shape/segment/line/width": 1, "shape/segment/sel_line/style": "SolidLine", "shape/segment/sel_line/color": "#00ff00", "shape/segment/sel_line/width": 1, "shape/segment/fill/style": "NoBrush", "shape/segment/sel_fill/style": "NoBrush", "shape/segment/symbol/marker": "XCross", "shape/segment/symbol/size": 9, "shape/segment/symbol/edgecolor": "#ffff00", "shape/segment/symbol/facecolor": "#ffff00", "shape/segment/symbol/alpha": 1.0, "shape/segment/sel_symbol/marker": "XCross", "shape/segment/sel_symbol/size": 12, "shape/segment/sel_symbol/edgecolor": "#00aa00", "shape/segment/sel_symbol/facecolor": "#00ff00", "shape/segment/sel_symbol/alpha": 0.7, "shape/label/symbol/marker": "NoSymbol", "shape/label/symbol/size": 0, "shape/label/symbol/edgecolor": MAIN_BG_COLOR, "shape/label/symbol/facecolor": MAIN_BG_COLOR, "shape/label/border/style": "SolidLine", "shape/label/border/color": "#cbcbcb", "shape/label/border/width": 0, "shape/label/font/size": 8, "shape/label/font/family": "default", "shape/label/font/bold": False, "shape/label/font/italic": False, "shape/label/color": MAIN_BG_COLOR, "shape/label/bgcolor": MAIN_FG_COLOR, "shape/label/bgalpha": 0.25, "shape/label/abspos": False, "shape/label/move_anchor": True, "label/symbol/marker": "NoSymbol", "label/symbol/size": 0, "label/symbol/edgecolor": MAIN_BG_COLOR, "label/symbol/facecolor": MAIN_BG_COLOR, "label/border/style": "SolidLine", "label/border/color": "#cbcbcb", "label/border/width": 1, "label/font/size": 9, "label/font/family": "default", "label/font/bold": False, "label/font/italic": False, "label/color": MAIN_FG_COLOR, "label/bgcolor": MAIN_BG_COLOR, "label/bgalpha": 0.8, "label/anchor": "TL", "label/xc": 0, "label/yc": 0, "label/abspos": False, "label/absg": "TR", "label/xg": 0.0, "label/yg": 0.0, # info_label: used in builder.make.computation for example "info_label/symbol/marker": "NoSymbol", "info_label/symbol/size": 0, "info_label/symbol/edgecolor": MAIN_BG_COLOR, "info_label/symbol/facecolor": MAIN_BG_COLOR, "info_label/border/style": "SolidLine", "info_label/border/color": "#cbcbcb", "info_label/border/width": 1, "info_label/font/size": 9, "info_label/font/family": "default", "info_label/font/bold": False, "info_label/font/italic": False, "info_label/color": MAIN_FG_COLOR, "info_label/bgcolor": MAIN_BG_COLOR, "info_label/bgalpha": 0.8, "info_label/anchor": "TL", "info_label/xc": 0, "info_label/yc": 0, "info_label/abspos": True, "info_label/absg": "TR", "info_label/xg": 0.0, "info_label/yg": 0.0, "legend/border/style": "SolidLine", "legend/border/color": "#cbcbcb", "legend/border/width": 1, "legend/font/size": 8, "legend/font/family": "default", "legend/font/bold": False, "legend/font/italic": False, "legend/color": MAIN_FG_COLOR, "legend/bgcolor": MAIN_BG_COLOR, "legend/bgalpha": 0.8, "legend/anchor": "TR", "legend/xc": 0, "legend/yc": 0, "legend/abspos": True, "legend/absg": "TR", "legend/xg": 0.0, "legend/yg": 0.0, }, "histogram": { "antialiasing": False, "title/font/size": 11, "title/font/bold": False, "label/font/size": 9, "label/font/bold": False, "curve/line/style": "NoPen", "curve/line/color": "green", "curve/line/width": 1, "curve/symbol/marker": "NoSymbol", "curve/symbol/size": 0, "curve/symbol/edgecolor": MAIN_BG_COLOR, "curve/symbol/facecolor": MAIN_FG_COLOR, "curve/symbol/alpha": 1.0, "curve/shade": 0.85, "curve/curvestyle": "Steps", "curve/label": "", "range/line/style": "SolidLine", "range/line/color": "#ff9393", "range/line/width": 1, "range/sel_line/style": "SolidLine", "range/sel_line/color": "red", "range/sel_line/width": 2, "range/fill": "red", "range/shade": 0.15, "range/symbol/marker": "Ellipse", "range/symbol/size": 7, "range/symbol/edgecolor": MAIN_BG_COLOR, "range/symbol/facecolor": "#ff9393", "range/symbol/alpha": 1.0, "range/sel_symbol/marker": "Ellipse", "range/sel_symbol/size": 9, "range/sel_symbol/edgecolor": MAIN_BG_COLOR, "range/sel_symbol/facecolor": "red", "range/sel_symbol/alpha": 0.9, "range/multi/color": "#806060", # Default parameters for plot axes "axis/title": "", "axis/color": MAIN_FG_COLOR, "axis/title_font/size": 7, "axis/title_font/family": "default", "axis/title_font/bold": False, "axis/title_font/italic": False, "axis/ticks_font/size": 7, "axis/ticks_font/family": "default", "axis/ticks_font/bold": False, "axis/ticks_font/italic": False, "grid/background": MAIN_BG_COLOR, "grid/maj_xenabled": True, "grid/maj_yenabled": True, "grid/maj_line/color": "darkgray", "grid/maj_line/width": 1, "grid/maj_line/style": "DotLine", "grid/min_xenabled": True, "grid/min_yenabled": False, "grid/min_line/color": "#eaeaea", "grid/min_line/width": 1, "grid/min_line/style": "DotLine", "marker/curve/symbol/marker": "Ellipse", "marker/curve/symbol/edgecolor": MAIN_FG_COLOR, "marker/curve/symbol/facecolor": "blue", "marker/curve/symbol/alpha": 0.8, "marker/curve/symbol/size": 8, "marker/curve/text/font/size": 8, "marker/curve/text/font/family": "default", "marker/curve/text/font/bold": False, "marker/curve/text/font/italic": False, "marker/curve/text/textcolor": "darkBlue", "marker/curve/text/background_color": "blue", "marker/curve/text/background_alpha": 0.2, "marker/curve/pen/style": "SolidLine", "marker/curve/pen/color": MAIN_FG_COLOR, "marker/curve/pen/width": 0, "marker/curve/markerstyle": "NoLine", "marker/cross/symbol/marker": "Cross", "marker/cross/symbol/edgecolor": MAIN_FG_COLOR, "marker/cross/symbol/facecolor": "red", "marker/cross/symbol/alpha": 1.0, "marker/cross/symbol/size": 8, "marker/cross/text/font/family": "default", "marker/cross/text/font/size": 8, "marker/cross/text/font/bold": False, "marker/cross/text/font/italic": False, "marker/cross/text/textcolor": "darkBlue", "marker/cross/text/background_color": "blue", "marker/cross/text/background_alpha": 0.2, "marker/cross/pen/style": "SolidLine", "marker/cross/pen/color": MAIN_FG_COLOR, "marker/cross/pen/width": 1, "marker/cross/markerstyle": "Cross", }, "cross_section": { "antialiasing": False, "title/font/size": 11, "title/font/bold": False, "label/font/size": 9, "label/font/bold": False, "curve/line/style": "SolidLine", "curve/line/color": "blue", "curve/line/width": 1, "curve/symbol/marker": "NoSymbol", "curve/symbol/size": 0, "curve/symbol/edgecolor": MAIN_BG_COLOR, "curve/symbol/facecolor": MAIN_FG_COLOR, "curve/symbol/alpha": 1.0, "curve/shade": 0.0, "curve/label": "", "range/line/style": "SolidLine", "range/line/color": "#ff9393", "range/line/width": 1, "range/sel_line/style": "SolidLine", "range/sel_line/color": "red", "range/sel_line/width": 2, "range/fill": "red", "range/shade": 0.15, "range/symbol/marker": "NoSymbol", "range/symbol/size": 5, "range/symbol/edgecolor": MAIN_FG_COLOR, "range/symbol/facecolor": "yellow", "range/symbol/alpha": 1.0, "range/sel_symbol/marker": "Ellipse", "range/sel_symbol/size": 9, "range/sel_symbol/edgecolor": MAIN_BG_COLOR, "range/sel_symbol/facecolor": "red", "range/sel_symbol/alpha": 0.9, "range/multi/color": "#806060", # Default parameters for plot axes "axis/title": "", "axis/color": MAIN_FG_COLOR, "axis/title_font/size": 7, "axis/title_font/family": "default", "axis/title_font/bold": False, "axis/title_font/italic": False, "axis/ticks_font/size": 7, "axis/ticks_font/family": "default", "axis/ticks_font/bold": False, "axis/ticks_font/italic": False, "grid/background": MAIN_BG_COLOR, "grid/maj_xenabled": True, "grid/maj_yenabled": True, "grid/maj_line/color": "darkgray", "grid/maj_line/width": 1, "grid/maj_line/style": "DotLine", "grid/min_xenabled": False, "grid/min_yenabled": False, "grid/min_line/color": "#eaeaea", "grid/min_line/width": 1, "grid/min_line/style": "DotLine", "marker/curve/symbol/marker": "Ellipse", "marker/curve/symbol/edgecolor": MAIN_FG_COLOR, "marker/curve/symbol/facecolor": "blue", "marker/curve/symbol/alpha": 0.8, "marker/curve/symbol/size": 8, "marker/curve/text/font/size": 8, "marker/curve/text/font/family": "default", "marker/curve/text/font/bold": False, "marker/curve/text/font/italic": False, "marker/curve/text/textcolor": "darkBlue", "marker/curve/text/background_color": "blue", "marker/curve/text/background_alpha": 0.2, "marker/curve/pen/style": "SolidLine", "marker/curve/pen/color": MAIN_FG_COLOR, "marker/curve/pen/width": 0, "marker/curve/markerstyle": "NoLine", "marker/cross/symbol/marker": "Cross", "marker/cross/symbol/edgecolor": MAIN_FG_COLOR, "marker/cross/symbol/facecolor": "red", "marker/cross/symbol/alpha": 1.0, "marker/cross/symbol/size": 8, "marker/cross/text/font/family": "default", "marker/cross/text/font/size": 8, "marker/cross/text/font/bold": False, "marker/cross/text/font/italic": False, "marker/cross/text/textcolor": "darkBlue", "marker/cross/text/background_color": "blue", "marker/cross/text/background_alpha": 0.2, "marker/cross/pen/style": "SolidLine", "marker/cross/pen/color": MAIN_FG_COLOR, "marker/cross/pen/width": 1, "marker/cross/markerstyle": "Cross", }, } from guidata.config import CONF CONF.update_defaults(DEFAULTS) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/cross_section.py0000666000000000000000000010665000000000000014506 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.cross_section -------------------- The `cross_section` module provides cross section related objects: * :py:class:`guiqwt.cross_section.XCrossSection`: the X-axis `cross-section panel` * :py:class:`guiqwt.cross_section.YCrossSection`: the Y-axis `cross-section panel` * and other related objects which are exclusively used by the cross-section panels Example ~~~~~~~ Simple cross-section demo: .. literalinclude:: /../guiqwt/tests/cross_section.py Reference ~~~~~~~~~ .. autoclass:: XCrossSection :members: :inherited-members: .. autoclass:: YCrossSection :members: :inherited-members: """ import weakref from qtpy.QtWidgets import QVBoxLayout, QSizePolicy, QHBoxLayout, QToolBar, QSpacerItem from qtpy.QtCore import QSize, QPointF, Qt import numpy as np from guidata.utils import assert_interfaces_valid from guidata.configtools import get_icon from guidata.qthelpers import create_action, add_actions # Local imports from guiqwt.config import CONF, _ from guiqwt.interfaces import ICSImageItemType, IPanel, IBasePlotItem from guiqwt.panels import PanelWidget, ID_XCS, ID_YCS, ID_OCS from guiqwt.curve import CurvePlot, ErrorBarCurveItem from guiqwt.image import ImagePlot, LUT_MAX, get_image_from_qrect from guiqwt.styles import CurveParam from guiqwt.tools import ExportItemDataTool from guiqwt.geometry import translate, rotate, vector_norm, vector_angle from guiqwt.image import _scale_tr, INTERP_LINEAR from guiqwt.plot import PlotManager from guiqwt.builder import make from guiqwt.baseplot import canvas_to_axes, axes_to_canvas class CrossSectionItem(ErrorBarCurveItem): """A Qwt item representing cross section data""" __implements__ = (IBasePlotItem,) ORIENTATION = None def __init__(self, curveparam=None, errorbarparam=None): ErrorBarCurveItem.__init__(self, curveparam, errorbarparam) self.setOrientation(self.ORIENTATION) self.perimage_mode = True self.autoscale_mode = False self.apply_lut = False self.source = None def set_source_image(self, src): """ Set source image (source: object with methods 'get_xsection' and 'get_ysection', e.g. objects derived from guiqwt.image.BaseImageItem) """ self.source = weakref.ref(src) def get_source_image(self): if self.source is not None: return self.source() def get_cross_section(self, obj): """Get cross section data from source image""" raise NotImplementedError def clear_data(self): self.set_data(np.array([]), np.array([]), None, None) self.plot().SIG_CS_CURVE_CHANGED.emit(self) def update_curve_data(self, obj): sectx, secty = self.get_cross_section(obj) if secty.size == 0 or np.all(np.isnan(secty)): sectx, secty = np.array([]), np.array([]) if self.orientation() == Qt.Vertical: self.process_curve_data(secty, sectx) else: self.process_curve_data(sectx, secty) def process_curve_data(self, x, y, dx=None, dy=None): """ Override this method to process data before updating the displayed curve """ self.set_data(x, y, dx, dy) def update_item(self, obj): plot = self.plot() if not plot: return source = self.get_source_image() if source is None or not plot.isVisible(): return self.update_curve_data(obj) self.plot().SIG_CS_CURVE_CHANGED.emit(self) if not self.autoscale_mode: self.update_scale() def update_scale(self): plot = self.plot() if self.orientation() == Qt.Vertical: axis_id = plot.Y_LEFT else: axis_id = plot.X_BOTTOM source = self.get_source_image() sdiv = source.plot().axisScaleDiv(axis_id) plot.setAxisScale(axis_id, sdiv.lowerBound(), sdiv.upperBound()) plot.replot() def get_rectangular_area(obj): """ Return rectangular area covered by object Return None if object does not support this feature (like markers, points, ...) """ if hasattr(obj, "get_rect"): return obj.get_rect() def get_object_coordinates(obj): """Return Marker or PointShape/AnnotatedPoint object coordinates""" if hasattr(obj, "get_pos"): return obj.get_pos() else: return obj.xValue(), obj.yValue() def get_plot_x_section(obj, apply_lut=False): """ Return plot cross section along x-axis, at the y value defined by 'obj', a Marker/AnnotatedPoint object """ _x0, y0 = get_object_coordinates(obj) plot = obj.plot() xmap = plot.canvasMap(plot.X_BOTTOM) xc0, xc1 = xmap.p1(), xmap.p2() _xc0, yc0 = axes_to_canvas(obj, 0, y0) if plot.get_axis_direction("left"): yc1 = yc0 + 1 else: yc1 = yc0 - 3 try: # TODO: eventually add an option to apply interpolation algorithm data = get_image_from_qrect( plot, QPointF(xc0, yc0), QPointF(xc1, yc1), apply_lut=apply_lut, add_images=True, apply_interpolation=False, ) except (ValueError, ZeroDivisionError, TypeError): return np.array([]), np.array([]) y = data.mean(axis=0) x0, _y0 = canvas_to_axes(obj, QPointF(xc0, yc0)) x1, _y1 = canvas_to_axes(obj, QPointF(xc1, yc1)) x = np.linspace(x0, x1, len(y)) return x, y def get_plot_y_section(obj, apply_lut=False): """ Return plot cross section along y-axis, at the x value defined by 'obj', a Marker/AnnotatedPoint object """ x0, _y0 = get_object_coordinates(obj) plot = obj.plot() ymap = plot.canvasMap(plot.Y_LEFT) yc0, yc1 = ymap.p1(), ymap.p2() if plot.get_axis_direction("left"): yc1, yc0 = yc0, yc1 xc0, _yc0 = axes_to_canvas(obj, x0, 0) xc1 = xc0 + 1 try: data = get_image_from_qrect( plot, QPointF(xc0, yc0), QPointF(xc1, yc1), apply_lut=apply_lut, add_images=True, apply_interpolation=False, ) except (ValueError, ZeroDivisionError, TypeError): return np.array([]), np.array([]) y = data.mean(axis=1) _x0, y0 = canvas_to_axes(obj, QPointF(xc0, yc0)) _x1, y1 = canvas_to_axes(obj, QPointF(xc1, yc1)) x = np.linspace(y0, y1, len(y)) return x, y def get_plot_average_x_section(obj, apply_lut=False): """ Return cross section along x-axis, averaged on ROI defined by 'obj' 'obj' is an AbstractShape object supporting the 'get_rect' method (RectangleShape, AnnotatedRectangle, etc.) """ x0, y0, x1, y1 = obj.get_rect() xc0, yc0 = axes_to_canvas(obj, x0, y0) xc1, yc1 = axes_to_canvas(obj, x1, y1) invert = False if xc0 > xc1: invert = True xc1, xc0 = xc0, xc1 ydir = obj.plot().get_axis_direction("left") if (ydir and yc0 > yc1) or (not ydir and yc0 < yc1): yc1, yc0 = yc0, yc1 try: data = get_image_from_qrect( obj.plot(), QPointF(xc0, yc0), QPointF(xc1, yc1), apply_lut=apply_lut, apply_interpolation=False, ) except (ValueError, ZeroDivisionError, TypeError): return np.array([]), np.array([]) y = data.mean(axis=0) if invert: y = y[::-1] x = np.linspace(x0, x1, len(y)) return x, y def get_plot_average_y_section(obj, apply_lut=False): """ Return cross section along y-axis, averaged on ROI defined by 'obj' 'obj' is an AbstractShape object supporting the 'get_rect' method (RectangleShape, AnnotatedRectangle, etc.) """ x0, y0, x1, y1 = obj.get_rect() xc0, yc0 = axes_to_canvas(obj, x0, y0) xc1, yc1 = axes_to_canvas(obj, x1, y1) invert = False ydir = obj.plot().get_axis_direction("left") if (ydir and yc0 > yc1) or (not ydir and yc0 < yc1): invert = True yc1, yc0 = yc0, yc1 if xc0 > xc1: xc1, xc0 = xc0, xc1 try: data = get_image_from_qrect( obj.plot(), QPointF(xc0, yc0), QPointF(xc1, yc1), apply_lut=apply_lut, apply_interpolation=False, ) except (ValueError, ZeroDivisionError, TypeError): return np.array([]), np.array([]) y = data.mean(axis=1) x = np.linspace(y0, y1, len(y)) if invert: x = x[::-1] return x, y class XCrossSectionItem(CrossSectionItem): """A Qwt item representing x-axis cross section data""" ORIENTATION = Qt.Horizontal def get_cross_section(self, obj): """Get x-cross section data from source image""" source = self.get_source_image() rect = get_rectangular_area(obj) if rect is None: # Object is a marker or an annotated point _x0, y0 = get_object_coordinates(obj) if self.perimage_mode: return source.get_xsection(y0, apply_lut=self.apply_lut) else: return get_plot_x_section(obj, apply_lut=self.apply_lut) else: if self.perimage_mode: x0, y0, x1, y1 = rect return source.get_average_xsection( x0, y0, x1, y1, apply_lut=self.apply_lut ) else: return get_plot_average_x_section(obj, apply_lut=self.apply_lut) class YCrossSectionItem(CrossSectionItem): """A Qwt item representing y-axis cross section data""" ORIENTATION = Qt.Vertical def get_cross_section(self, obj): """Get y-cross section data from source image""" source = self.get_source_image() rect = get_rectangular_area(obj) if rect is None: # Object is a marker or an annotated point x0, _y0 = get_object_coordinates(obj) if self.perimage_mode: return source.get_ysection(x0, apply_lut=self.apply_lut) else: return get_plot_y_section(obj, apply_lut=self.apply_lut) else: if self.perimage_mode: x0, y0, x1, y1 = rect return source.get_average_ysection( x0, y0, x1, y1, apply_lut=self.apply_lut ) else: return get_plot_average_y_section(obj, apply_lut=self.apply_lut) LUT_AXIS_TITLE = _("LUT scale") + (" (0-%d)" % LUT_MAX) class CrossSectionPlot(CurvePlot): """Cross section plot""" CURVE_LABEL = _("Cross section") LABEL_TEXT = _("Enable a marker") _height = None _width = None CS_AXIS = None Z_AXIS = None Z_MAX_MAJOR = 5 SHADE = 0.2 def __init__(self, parent=None): super(CrossSectionPlot, self).__init__( parent=parent, title="", section="cross_section" ) self.perimage_mode = True self.autoscale_mode = False self.autorefresh_mode = True self.apply_lut = False self.single_source = False self.lockscales = True self.last_obj = None self.known_items = {} self._shapes = {} self.curveparam = CurveParam(_("Curve"), icon="curve.png") self.set_curve_style("cross_section", "curve") if self._height is not None: self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) elif self._width is not None: self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) self.label = make.label(self.LABEL_TEXT, "C", (0, 0), "C") self.label.set_readonly(True) self.add_item(self.label) self.setAxisMaxMajor(self.Z_AXIS, self.Z_MAX_MAJOR) self.setAxisMaxMinor(self.Z_AXIS, 0) def set_curve_style(self, section, option): self.curveparam.read_config(CONF, section, option) self.curveparam.label = self.CURVE_LABEL def connect_plot(self, plot): if not isinstance(plot, ImagePlot): # Connecting only to image plot widgets (allow mixing image and # curve widgets for the same plot manager -- e.g. in pyplot) return plot.SIG_ITEMS_CHANGED.connect(self.items_changed) plot.SIG_LUT_CHANGED.connect(self.lut_changed) plot.SIG_MASK_CHANGED.connect(lambda item: self.update_plot()) plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.active_item_changed) plot.SIG_MARKER_CHANGED.connect(self.marker_changed) plot.SIG_ANNOTATION_CHANGED.connect(self.shape_changed) plot.SIG_PLOT_LABELS_CHANGED.connect(self.plot_labels_changed) plot.SIG_AXIS_DIRECTION_CHANGED.connect(self.axis_dir_changed) plot.SIG_PLOT_AXIS_CHANGED.connect(self.plot_axis_changed) self.plot_labels_changed(plot) for axis_id in plot.AXIS_IDS: self.axis_dir_changed(plot, axis_id) self.items_changed(plot) def register_shape(self, plot, shape, final, refresh=True): known_shapes = self._shapes.get(plot, []) if shape in known_shapes: return self._shapes[plot] = known_shapes + [shape] self.update_plot(shape, refresh=refresh and self.autorefresh_mode) def unregister_shape(self, shape): for plot in self._shapes: shapes = self._shapes[plot] if shape in shapes: shapes.pop(shapes.index(shape)) if len(shapes) == 0 or shape is self.get_last_obj(): for curve in self.get_cross_section_curves(): curve.clear_data() self.replot() break def create_cross_section_item(self): raise NotImplementedError def add_cross_section_item(self, source): curve = self.create_cross_section_item() curve.set_source_image(source) curve.set_readonly(True) self.add_item(curve, z=0) self.known_items[source] = curve def get_cross_section_curves(self): return list(self.known_items.values()) def items_changed(self, plot): # Del obsolete cross section items new_sources = plot.get_items(item_type=ICSImageItemType) for source in self.known_items.copy(): if source not in new_sources: curve = self.known_items.pop(source) curve.clear_data() # useful to emit SIG_CS_CURVE_CHANGED # (eventually notify other panels that the # cross section curve is now empty) self.del_item(curve) # Update plot only to show/hide cross section curves according to # the associated image item visibility state (hence `refresh=False`) self.update_plot(refresh=False) self.plot_axis_changed(plot) if not new_sources: self.replot() return self.curveparam.shade = self.SHADE / len(new_sources) for source in new_sources: if source not in self.known_items and source.isVisible(): if not self.single_source or not self.known_items: self.add_cross_section_item(source=source) def active_item_changed(self, plot): """Active item has just changed""" self.shape_changed(plot.get_active_item()) def plot_labels_changed(self, plot): """Plot labels have changed""" raise NotImplementedError def axis_dir_changed(self, plot, axis_id): """An axis direction has changed""" raise NotImplementedError def plot_axis_changed(self, plot): """Plot was just zoomed/panned""" if self.lockscales: self.do_autoscale(replot=False, axis_id=self.Z_AXIS) vmin, vmax = plot.get_axis_limits(self.CS_AXIS) self.set_axis_limits(self.CS_AXIS, vmin, vmax) def marker_changed(self, marker): self.update_plot(marker) def is_shape_known(self, shape): for shapes in list(self._shapes.values()): if shape in shapes: return True else: return False def shape_changed(self, shape): if self.autorefresh_mode: if self.is_shape_known(shape): self.update_plot(shape) def get_last_obj(self): if self.last_obj is not None: return self.last_obj() def update_plot(self, obj=None, refresh=True): """ Update cross section curve(s) associated to object *obj* *obj* may be a marker or a rectangular shape (see :py:class:`guiqwt.tools.CrossSectionTool` and :py:class:`guiqwt.tools.AverageCrossSectionTool`) If obj is None, update the cross sections of the last active object """ if obj is None: obj = self.get_last_obj() if obj is None: return else: self.last_obj = weakref.ref(obj) if obj.plot() is None: self.unregister_shape(obj) return if self.label.isVisible(): self.label.hide() items = list(self.known_items.items()) for index, (item, curve) in enumerate(iter(items)): if (not self.perimage_mode and index > 0) or not item.isVisible(): curve.hide() else: curve.show() curve.perimage_mode = self.perimage_mode curve.autoscale_mode = self.autoscale_mode curve.apply_lut = self.apply_lut if refresh: curve.update_item(obj) if self.autoscale_mode: self.do_autoscale(replot=True) elif self.lockscales: self.do_autoscale(replot=True, axis_id=self.Z_AXIS) def toggle_perimage_mode(self, state): self.perimage_mode = state self.update_plot() def toggle_autoscale(self, state): self.autoscale_mode = state self.update_plot() def toggle_autorefresh(self, state): self.autorefresh_mode = state if state: self.update_plot() def toggle_apply_lut(self, state): self.apply_lut = state self.update_plot() if self.apply_lut: self.set_axis_title(self.Z_AXIS, LUT_AXIS_TITLE) self.set_axis_color(self.Z_AXIS, "red") else: obj = self.get_last_obj() if obj is not None and obj.plot() is not None: self.plot_labels_changed(obj.plot()) def toggle_lockscales(self, state): self.lockscales = state obj = self.get_last_obj() if obj is not None and obj.plot() is not None: self.plot_axis_changed(obj.plot()) def lut_changed(self, plot): if self.apply_lut: self.update_plot() class HorizontalCrossSectionPlot(CrossSectionPlot): CS_AXIS = CurvePlot.X_BOTTOM Z_AXIS = CurvePlot.Y_LEFT def plot_labels_changed(self, plot): """Plot labels have changed""" self.set_axis_title("left", plot.get_axis_title("right")) self.set_axis_title("bottom", plot.get_axis_title("bottom")) self.set_axis_color("left", plot.get_axis_color("right")) self.set_axis_color("bottom", plot.get_axis_color("bottom")) def axis_dir_changed(self, plot, axis_id): """An axis direction has changed""" if axis_id == plot.X_BOTTOM: self.set_axis_direction("bottom", plot.get_axis_direction("bottom")) self.replot() class VerticalCrossSectionPlot(CrossSectionPlot): CS_AXIS = CurvePlot.Y_LEFT Z_AXIS = CurvePlot.X_BOTTOM Z_MAX_MAJOR = 3 def plot_labels_changed(self, plot): """Plot labels have changed""" self.set_axis_title("bottom", plot.get_axis_title("right")) self.set_axis_title("left", plot.get_axis_title("left")) self.set_axis_color("bottom", plot.get_axis_color("right")) self.set_axis_color("left", plot.get_axis_color("left")) def axis_dir_changed(self, plot, axis_id): """An axis direction has changed""" if axis_id == plot.Y_LEFT: self.set_axis_direction("left", plot.get_axis_direction("left")) self.replot() class XCrossSectionPlot(HorizontalCrossSectionPlot): """X-axis cross section plot""" _height = 130 def sizeHint(self): return QSize(self.width(), self._height) def create_cross_section_item(self): return XCrossSectionItem(self.curveparam) class YCrossSectionPlot(VerticalCrossSectionPlot): """Y-axis cross section plot""" _width = 140 def sizeHint(self): return QSize(self._width, self.height()) def create_cross_section_item(self): return YCrossSectionItem(self.curveparam) class CrossSectionWidget(PanelWidget): PANEL_ID = None PANEL_TITLE = _("Cross section tool") PANEL_ICON = "csection.png" CrossSectionPlotKlass = None __implements__ = (IPanel,) def __init__(self, parent=None): super(CrossSectionWidget, self).__init__(parent) self.export_ac = None self.autoscale_ac = None self.refresh_ac = None self.autorefresh_ac = None self.lockscales_ac = None self.manager = None # manager for the associated image plot self.local_manager = PlotManager(self) self.cs_plot = self.CrossSectionPlotKlass(parent) self.cs_plot.SIG_CS_CURVE_CHANGED.connect(self.cs_curve_has_changed) self.export_tool = None self.setup_plot() self.toolbar = QToolBar(self) self.toolbar.setOrientation(Qt.Vertical) self.setup_widget() def set_options(self, autoscale=None, autorefresh=None, lockscales=None): assert self.manager is not None, ( "Panel '%s' must be registered to plot manager before changing options" % self.PANEL_ID ) if autoscale is not None: self.autoscale_ac.setChecked(autoscale) if autorefresh is not None: self.autorefresh_ac.setChecked(autorefresh) if lockscales is not None: self.lockscales_ac.setChecked(lockscales) def setup_plot(self): # Configure the local manager lman = self.local_manager lman.add_plot(self.cs_plot) lman.register_all_curve_tools() self.export_tool = lman.get_tool(ExportItemDataTool) def setup_widget(self): layout = QHBoxLayout() layout.addWidget(self.cs_plot) layout.addWidget(self.toolbar) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) def cs_curve_has_changed(self, curve): """Cross section curve has just changed""" # Do something with curve's data for example pass def register_panel(self, manager): """Register panel to plot manager""" self.manager = manager for plot in manager.get_plots(): self.cs_plot.connect_plot(plot) self.setup_actions() self.add_actions_to_toolbar() def configure_panel(self): """Configure panel""" pass def get_plot(self): return self.manager.get_active_plot() def setup_actions(self): self.export_ac = self.export_tool.action self.lockscales_ac = create_action( self, _("Lock scales"), icon=get_icon("axes.png"), toggled=self.cs_plot.toggle_lockscales, tip=_("Lock scales to main plot axes"), ) self.lockscales_ac.setChecked(self.cs_plot.lockscales) self.autoscale_ac = create_action( self, _("Auto-scale"), icon=get_icon("csautoscale.png"), toggled=self.cs_plot.toggle_autoscale, ) self.autoscale_ac.toggled.connect(self.lockscales_ac.setDisabled) self.autoscale_ac.setChecked(self.cs_plot.autoscale_mode) self.refresh_ac = create_action( self, _("Refresh"), icon=get_icon("refresh.png"), triggered=lambda: self.cs_plot.update_plot(), ) self.autorefresh_ac = create_action( self, _("Auto-refresh"), icon=get_icon("autorefresh.png"), toggled=self.cs_plot.toggle_autorefresh, ) self.autorefresh_ac.setChecked(self.cs_plot.autorefresh_mode) def add_actions_to_toolbar(self): add_actions( self.toolbar, ( self.export_ac, None, self.autoscale_ac, self.lockscales_ac, None, self.refresh_ac, self.autorefresh_ac, ), ) def register_shape(self, shape, final, refresh=True): plot = self.get_plot() self.cs_plot.register_shape(plot, shape, final, refresh) def unregister_shape(self, shape): self.cs_plot.unregister_shape(shape) def update_plot(self, obj=None): """ Update cross section curve(s) associated to object *obj* *obj* may be a marker or a rectangular shape (see :py:class:`guiqwt.tools.CrossSectionTool` and :py:class:`guiqwt.tools.AverageCrossSectionTool`) If obj is None, update the cross sections of the last active object """ self.cs_plot.update_plot(obj) assert_interfaces_valid(CrossSectionWidget) # =============================================================================== # X-Y cross sections # =============================================================================== class XCrossSection(CrossSectionWidget): """X-axis cross section widget""" PANEL_ID = ID_XCS OTHER_PANEL_ID = ID_YCS CrossSectionPlotKlass = XCrossSectionPlot def __init__(self, parent=None): super(XCrossSection, self).__init__(parent) self.peritem_ac = None self.applylut_ac = None def set_options( self, autoscale=None, autorefresh=None, peritem=None, applylut=None, lockscales=None, ): assert self.manager is not None, ( "Panel '%s' must be registered to plot manager before changing options" % self.PANEL_ID ) if autoscale is not None: self.autoscale_ac.setChecked(autoscale) if autorefresh is not None: self.autorefresh_ac.setChecked(autorefresh) if lockscales is not None: self.lockscales_ac.setChecked(lockscales) if peritem is not None: self.peritem_ac.setChecked(peritem) if applylut is not None: self.applylut_ac.setChecked(applylut) def add_actions_to_toolbar(self): other = self.manager.get_panel(self.OTHER_PANEL_ID) if other is None: add_actions( self.toolbar, ( self.peritem_ac, self.applylut_ac, None, self.export_ac, None, self.autoscale_ac, self.lockscales_ac, None, self.refresh_ac, self.autorefresh_ac, ), ) else: add_actions( self.toolbar, ( other.peritem_ac, other.applylut_ac, None, self.export_ac, None, other.autoscale_ac, other.lockscales_ac, None, other.refresh_ac, other.autorefresh_ac, ), ) other.peritem_ac.toggled.connect(self.cs_plot.toggle_perimage_mode) other.applylut_ac.toggled.connect(self.cs_plot.toggle_apply_lut) other.autoscale_ac.toggled.connect(self.cs_plot.toggle_autoscale) other.refresh_ac.triggered.connect(lambda: self.cs_plot.update_plot()) other.autorefresh_ac.toggled.connect(self.cs_plot.toggle_autorefresh) other.lockscales_ac.toggled.connect(self.cs_plot.toggle_lockscales) def closeEvent(self, event): self.hide() event.ignore() def setup_actions(self): CrossSectionWidget.setup_actions(self) self.peritem_ac = create_action( self, _("Per image cross-section"), icon=get_icon("csperimage.png"), toggled=self.cs_plot.toggle_perimage_mode, tip=_( "Enable the per-image cross-section mode, " "which works directly on image rows/columns.\n" "That is the fastest method to compute " "cross-section curves but it ignores " "image transformations (e.g. rotation)" ), ) self.applylut_ac = create_action( self, _("Apply LUT\n(contrast settings)"), icon=get_icon("csapplylut.png"), toggled=self.cs_plot.toggle_apply_lut, tip=_( "Apply LUT (Look-Up Table) contrast settings.\n" "This is the easiest way to compare images " "which have slightly different level ranges.\n\n" "Note: LUT is coded over 1024 levels (0...1023)" ), ) self.peritem_ac.setChecked(True) self.applylut_ac.setChecked(False) class YCrossSection(XCrossSection): """ Y-axis cross section widget parent (QWidget): parent widget position (string): "left" or "right" """ PANEL_ID = ID_YCS OTHER_PANEL_ID = ID_XCS CrossSectionPlotKlass = YCrossSectionPlot def __init__(self, parent=None, position="right", xsection_pos="top"): self.xsection_pos = xsection_pos self.spacer = QSpacerItem(0, 0) super(YCrossSection, self).__init__(parent) self.cs_plot.set_axis_direction("bottom", reverse=position == "left") def setup_widget(self): toolbar = self.toolbar toolbar.setOrientation(Qt.Horizontal) layout = QVBoxLayout() if self.xsection_pos == "top": layout.addSpacerItem(self.spacer) layout.addWidget(toolbar) layout.addWidget(self.cs_plot) if self.xsection_pos == "bottom": layout.addSpacerItem(self.spacer) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) def adjust_height(self, height): self.spacer.changeSize(0, height, QSizePolicy.Fixed, QSizePolicy.Fixed) self.layout().invalidate() # =============================================================================== # Oblique cross sections # =============================================================================== DEBUG = False TEMP_ITEM = None def compute_oblique_section(item, obj): """Return oblique averaged cross section""" global TEMP_ITEM xa, ya, xb, yb = obj.get_bounding_rect_coords() x0, y0, x1, y1, x2, y2, x3, y3 = obj.get_rect() getcpi = item.get_closest_pixel_indexes ixa, iya = getcpi(xa, ya) ixb, iyb = getcpi(xb, yb) ix0, iy0 = getcpi(x0, y0) ix1, iy1 = getcpi(x1, y1) ix3, iy3 = getcpi(x3, y3) destw = int(vector_norm(ix0, iy0, ix1, iy1)) desth = int(vector_norm(ix0, iy0, ix3, iy3)) ysign = -1 if obj.plot().get_axis_direction("left") else 1 angle = vector_angle(ix1 - ix0, (iy1 - iy0) * ysign) dst_rect = (0, 0, destw, desth) dst_image = np.empty((desth, destw), dtype=np.float64) if isinstance(item.data, np.ma.MaskedArray): if item.data.dtype in (np.float32, np.float64): item_data = item.data else: item_data = np.ma.array(item.data, dtype=np.float32, copy=True) data = np.ma.filled(item_data, np.nan) else: data = item.data ixr = 0.5 * (ixb + ixa) iyr = 0.5 * (iyb + iya) mat = translate(ixr, iyr) * rotate(-angle) * translate(-0.5 * destw, -0.5 * desth) _scale_tr(data, mat, dst_image, dst_rect, (1.0, 0.0, np.nan), (INTERP_LINEAR,)) if DEBUG: plot = obj.plot() if TEMP_ITEM is None: from guiqwt.builder import make TEMP_ITEM = make.image(dst_image) plot.add_item(TEMP_ITEM) else: TEMP_ITEM.set_data(dst_image) if False: TEMP_ITEM.imageparam.alpha_mask = True xmin, ymin = ixa, iya xmax, ymax = xmin + destw, ymin + desth TEMP_ITEM.imageparam.xmin = xmin TEMP_ITEM.imageparam.xmax = xmax TEMP_ITEM.imageparam.ymin = ymin TEMP_ITEM.imageparam.ymax = ymax TEMP_ITEM.imageparam.update_image(TEMP_ITEM) plot.replot() ydata = np.ma.fix_invalid(dst_image, copy=DEBUG).mean(axis=1) xdata = item.get_x_values(0, ydata.size)[: ydata.size] try: xdata -= xdata[0] except IndexError: print(xdata, ydata) return xdata, ydata # Oblique cross section item class ObliqueCrossSectionItem(CrossSectionItem): """A Qwt item representing radially-averaged cross section data""" def __init__(self, curveparam=None, errorbarparam=None): CrossSectionItem.__init__(self, curveparam, errorbarparam) def update_curve_data(self, obj): source = self.get_source_image() rect = obj.get_bounding_rect_coords() if rect is not None and source.data is not None: # x0, y0, x1, y1 = rect # angle = obj.get_tr_angle() sectx, secty = compute_oblique_section(source, obj) if secty.size == 0 or np.all(np.isnan(secty)): sectx, secty = np.array([]), np.array([]) self.process_curve_data(sectx, secty, None, None) def update_scale(self): pass # Oblique cross section plot class ObliqueCrossSectionPlot(HorizontalCrossSectionPlot): """Oblique averaged cross section plot""" PLOT_TITLE = _("Oblique averaged cross section") CURVE_LABEL = _("Oblique averaged cross section") LABEL_TEXT = _("Activate the oblique cross section tool") def __init__(self, parent=None): super(ObliqueCrossSectionPlot, self).__init__(parent) self.set_title(self.PLOT_TITLE) self.single_source = True def create_cross_section_item(self): return ObliqueCrossSectionItem(self.curveparam) def axis_dir_changed(self, plot, axis_id): """An axis direction has changed""" pass # Oblique cross section panel class ObliqueCrossSection(CrossSectionWidget): """Oblique averaged cross section widget""" PANEL_ID = ID_OCS CrossSectionPlotKlass = ObliqueCrossSectionPlot PANEL_ICON = "csection_oblique.png" def setup_actions(self): super(ObliqueCrossSection, self).setup_actions() self.lockscales_ac.setChecked(False) self.autoscale_ac.setChecked(True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/curve.py0000666000000000000000000020010600000000000012744 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.curve ------------ The `curve` module provides curve-related objects: * :py:class:`guiqwt.curve.CurvePlot`: a 2d curve plotting widget * :py:class:`guiqwt.curve.CurveItem`: a curve plot item * :py:class:`guiqwt.curve.ErrorBarCurveItem`: a curve plot item with error bars * :py:class:`guiqwt.curve.GridItem` * :py:class:`guiqwt.curve.ItemListWidget`: base widget implementing the `plot item list panel` * :py:class:`guiqwt.curve.PlotItemList`: the `plot item list panel` ``CurveItem`` and ``GridItem`` objects are plot items (derived from QwtPlotItem) that may be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`. .. seealso:: Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Examples ~~~~~~~~ Create a basic curve plotting widget: * before creating any widget, a `QApplication` must be instantiated (that is a `Qt` internal requirement): >>> import guidata >>> app = guidata.qapplication() * that is mostly equivalent to the following (the only difference is that the `guidata` helper function also installs the `Qt` translation corresponding to the system locale): >>> from PyQt5.QtGui import QApplication >>> app = QApplication([]) * now that a `QApplication` object exists, we may create the plotting widget: >>> from guiqwt.curve import CurvePlot >>> plot = CurvePlot(title="Example", xlabel="X", ylabel="Y") Create a curve item: * from the associated plot item class (e.g. `ErrorBarCurveItem` to create a curve with error bars): the item properties are then assigned by creating the appropriate style parameters object (e.g. :py:class:`guiqwt.styles.ErrorBarParam`) >>> from guiqwt.curve import CurveItem >>> from guiqwt.styles import CurveParam >>> param = CurveParam() >>> param.label = 'My curve' >>> curve = CurveItem(param) >>> curve.set_data(x, y) * or using the `plot item builder` (see :py:func:`guiqwt.builder.make`): >>> from guiqwt.builder import make >>> curve = make.curve(x, y, title='My curve') Attach the curve to the plotting widget: >>> plot.add_item(curve) Display the plotting widget: >>> plot.show() >>> app.exec_() Reference ~~~~~~~~~ .. autoclass:: CurvePlot :members: :inherited-members: .. autoclass:: CurveItem :members: :inherited-members: .. autoclass:: ErrorBarCurveItem :members: :inherited-members: .. autoclass:: PlotItemList :members: """ import warnings import numpy as np import sys from qtpy.QtWidgets import ( QMenu, QListWidget, QListWidgetItem, QVBoxLayout, QToolBar, QMessageBox, ) from qtpy.QtGui import QBrush, QColor, QPen, QPolygonF from qtpy.QtCore import Qt, QPointF, QLineF, QRectF, Signal from guidata.utils import assert_interfaces_valid, update_dataset from guidata.configtools import get_icon, get_image_layout from guidata.qthelpers import create_action, add_actions # Local imports from guiqwt.transitional import QwtPlotCurve, QwtPlotGrid, QwtPlotItem, QwtScaleMap from guiqwt.config import CONF, _ from guiqwt.interfaces import ( IBasePlotItem, IDecoratorItemType, ISerializableType, ICurveItemType, ITrackableItemType, IPanel, ) from guiqwt.panels import PanelWidget, ID_ITEMLIST from guiqwt.baseplot import BasePlot, canvas_to_axes from guiqwt.styles import GridParam, CurveParam, ErrorBarParam, SymbolParam from guiqwt.shapes import Marker def _simplify_poly(pts, off, scale, bounds): ax, bx, ay, by = scale xm, ym, xM, yM = bounds a = np.array([[ax, ay]]) b = np.array([[bx, by]]) _pts = a * pts + b poly = [] NP = off.shape[0] for i in range(off.shape[0]): i0 = off[i, 1] if i + 1 < NP: i1 = off[i + 1, 1] else: i1 = pts.shape[0] poly.append((_pts[i0:i1], i)) return poly try: from gshhs import simplify_poly except ImportError: simplify_poly = _simplify_poly def seg_dist(P, P0, P1): """ Return distance between point P and segment (P0, P1) If P orthogonal projection on (P0, P1) is outside segment bounds, return either distance to P0 or to P1 (the closest one) P, P0, P1: QPointF instances """ u = QLineF(P0, P).length() if P0 == P1: return u else: angle = QLineF(P0, P).angleTo(QLineF(P0, P1)) * np.pi / 180 projection = u * np.cos(angle) if projection > QLineF(P0, P1).length(): return QLineF(P1, P).length() elif projection < 0: return QLineF(P0, P).length() else: return abs(u * np.sin(angle)) def test_seg_dist(): print(seg_dist(QPointF(200, 100), QPointF(150, 196), QPointF(250, 180))) print(seg_dist(QPointF(200, 100), QPointF(190, 196), QPointF(210, 180))) print(seg_dist(QPointF(201, 105), QPointF(201, 196), QPointF(201, 180))) def norm2(v): return (v ** 2).sum(axis=1) def seg_dist_v(P, X0, Y0, X1, Y1): """Version vectorielle de seg_dist""" V = np.zeros((X0.shape[0], 2), float) PP = np.zeros((X0.shape[0], 2), float) PP[:, 0] = X0 PP[:, 1] = Y0 V[:, 0] = X1 - X0 V[:, 1] = Y1 - Y0 dP = np.array(P).reshape(1, 2) - PP nV = np.sqrt(norm2(V)).clip(1e-12) # clip: avoid division by zero w2 = V / nV[:, np.newaxis] w = np.array([-w2[:, 1], w2[:, 0]]).T distances = np.fabs((dP * w).sum(axis=1)) ix = distances.argmin() return ix, distances[ix] def test_seg_dist_v(): """Test de seg_dist_v""" a = (np.arange(10.0) ** 2).reshape(5, 2) ix, dist = seg_dist_v((2.1, 3.3), a[:-1, 0], a[:-1, 1], a[1:, 0], a[1:, 1]) print(ix, dist) assert ix == 0 if __name__ == "__main__": test_seg_dist_v() test_seg_dist() SELECTED_SYMBOL_PARAM = SymbolParam() SELECTED_SYMBOL_PARAM.read_config(CONF, "plot", "selected_curve_symbol") SELECTED_SYMBOL = SELECTED_SYMBOL_PARAM.build_symbol() class GridItem(QwtPlotGrid): """ Construct a grid `plot item` with the parameters *gridparam* (see :py:class:`guiqwt.styles.GridParam`) """ __implements__ = (IBasePlotItem,) _readonly = True _private = False def __init__(self, gridparam=None): super(GridItem, self).__init__() if gridparam is None: self.gridparam = GridParam(title=_("Grid"), icon="grid.png") else: self.gridparam = gridparam self.selected = False self.immutable = True # set to false to allow moving points around self.update_params() # won't work completely because it's not yet # attached to plot (actually, only canvas background won't be updated) def types(self): return (IDecoratorItemType,) def attach(self, plot): """Reimplemented to update plot canvas background""" QwtPlotGrid.attach(self, plot) self.update_params() def set_readonly(self, state): """Set object read-only state""" self._readonly = state def is_readonly(self): """Return object read-only state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return False def can_resize(self): return False def can_rotate(self): return False def can_move(self): return False def select(self): """Select item""" pass def unselect(self): """Unselect item""" pass def hit_test(self, pos): return sys.maxsize, 0, False, None def move_local_point_to(self, handle, pos, ctrl=None): pass def move_local_shape(self, old_pos, new_pos): pass def move_with_selection(self, delta_x, delta_y): pass def update_params(self): self.gridparam.update_grid(self) def update_item_parameters(self): self.gridparam.update_param(self) def get_item_parameters(self, itemparams): itemparams.add("GridParam", self, self.gridparam) def set_item_parameters(self, itemparams): self.gridparam = itemparams.get("GridParam") self.gridparam.update_grid(self) assert_interfaces_valid(GridItem) class CurveItem(QwtPlotCurve): """ Construct a curve `plot item` with the parameters *curveparam* (see :py:class:`guiqwt.styles.CurveParam`) """ __implements__ = (IBasePlotItem, ISerializableType) _readonly = False _private = False def __init__(self, curveparam=None): super(CurveItem, self).__init__() if curveparam is None: self.curveparam = CurveParam(_("Curve"), icon="curve.png") else: self.curveparam = curveparam self.selected = False self.immutable = True # set to false to allow moving points around self._x = None self._y = None self.update_params() def _get_visible_axis_min(self, axis_id, axis_data): """Return axis minimum excluding zero and negative values when corresponding plot axis scale is logarithmic""" if self.plot().get_axis_scale(axis_id) == "log": return axis_data[axis_data > 0].min() else: return axis_data.min() def boundingRect(self): """Return the bounding rectangle of the data""" plot = self.plot() if plot is not None and "log" in ( plot.get_axis_scale(self.xAxis()), plot.get_axis_scale(self.yAxis()), ): x, y = self._x, self._y xf, yf = x[np.isfinite(x)], y[np.isfinite(y)] xmin = self._get_visible_axis_min(self.xAxis(), xf) ymin = self._get_visible_axis_min(self.yAxis(), yf) return QRectF(xmin, ymin, xf.max() - xmin, yf.max() - ymin) else: return QwtPlotCurve.boundingRect(self) def types(self): return (ICurveItemType, ITrackableItemType, ISerializableType) def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return True def can_resize(self): return False def can_rotate(self): return False def can_move(self): return False def __reduce__(self): state = (self.curveparam, self._x, self._y, self.z()) res = (CurveItem, (), state) return res def __setstate__(self, state): param, x, y, z = state self.curveparam = param self.set_data(x, y) self.setZ(z) self.update_params() def serialize(self, writer): """Serialize object to HDF5 writer""" writer.write(self._x, group_name="Xdata") writer.write(self._y, group_name="Ydata") writer.write(self.z(), group_name="z") self.curveparam.update_param(self) writer.write(self.curveparam, group_name="curveparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.curveparam = CurveParam(_("Curve"), icon="curve.png") reader.read("curveparam", instance=self.curveparam) x = reader.read(group_name="Xdata", func=reader.read_array) y = reader.read(group_name="Ydata", func=reader.read_array) self.set_data(x, y) self.setZ(reader.read("z")) self.update_params() def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def invalidate_plot(self): plot = self.plot() if plot is not None: plot.invalidate() def select(self): """Select item""" self.selected = True plot = self.plot() if plot is not None: plot.blockSignals(True) self.setSymbol(SELECTED_SYMBOL) if plot is not None: plot.blockSignals(False) self.invalidate_plot() def unselect(self): """Unselect item""" self.selected = False # Restoring initial curve parameters: self.curveparam.update_curve(self) self.invalidate_plot() def get_data(self): """Return curve data x, y (NumPy arrays)""" return self._x, self._y def set_data(self, x, y): """ Set curve data: * x: NumPy array * y: NumPy array """ self._x = np.array(x, copy=False) self._y = np.array(y, copy=False) self.setData(self._x, self._y) def is_empty(self): """Return True if item data is empty""" return self._x is None or self._y is None or self._y.size == 0 def hit_test(self, pos): """Calcul de la distance d'un point à une courbe renvoie (dist, handle, inside)""" if self.is_empty(): return sys.maxsize, 0, False, None plot = self.plot() ax = self.xAxis() ay = self.yAxis() px = plot.invTransform(ax, pos.x()) py = plot.invTransform(ay, pos.y()) # On cherche les 4 points qui sont les plus proches en X et en Y # avant et après ie tels que p1x < x < p2x et p3y < y < p4y tmpx = self._x - px tmpy = self._y - py if np.count_nonzero(tmpx) != len(tmpx) or np.count_nonzero(tmpy) != len(tmpy): # Avoid dividing by zero warning when computing dx or dy return sys.maxsize, 0, False, None dx = 1 / tmpx dy = 1 / tmpy i0 = dx.argmin() i1 = dx.argmax() i2 = dy.argmin() i3 = dy.argmax() t = np.array((i0, i1, i2, i3)) t2 = (t + 1).clip(0, self._x.shape[0] - 1) i, _d = seg_dist_v((px, py), self._x[t], self._y[t], self._x[t2], self._y[t2]) i = t[i] # Recalcule la distance dans le répère du widget p0x = plot.transform(ax, self._x[i]) p0y = plot.transform(ay, self._y[i]) if i + 1 >= self._x.shape[0]: p1x = p0x p1y = p0y else: p1x = plot.transform(ax, self._x[i + 1]) p1y = plot.transform(ay, self._y[i + 1]) distance = seg_dist(QPointF(pos), QPointF(p0x, p0y), QPointF(p1x, p1y)) return distance, i, False, None def get_closest_coordinates(self, x, y): """Renvoie les coordonnées (x',y') du point le plus proche de (x,y) Méthode surchargée pour ErrorBarSignalCurve pour renvoyer les coordonnées des pointes des barres d'erreur""" plot = self.plot() ax = self.xAxis() ay = self.yAxis() xc = plot.transform(ax, x) yc = plot.transform(ay, y) _distance, i, _inside, _other = self.hit_test(QPointF(xc, yc)) point = self.sample(i) return point.x(), point.y() def get_coordinates_label(self, xc, yc): title = self.title().text() return "%s:
x = %g
y = %g" % (title, xc, yc) def get_closest_x(self, xc): # We assume X is sorted, otherwise we'd need : # argmin(abs(x-xc)) i = self._x.searchsorted(xc) if i > 0: if np.fabs(self._x[i - 1] - xc) < np.fabs(self._x[i] - xc): return self._x[i - 1], self._y[i - 1] return self._x[i], self._y[i] def move_local_point_to(self, handle, pos, ctrl=None): if self.immutable: return if handle < 0 or handle > self._x.shape[0]: return x, y = canvas_to_axes(self, pos) self._x[handle] = x self._y[handle] = y self.setData(self._x, self._y) self.plot().replot() def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" nx, ny = canvas_to_axes(self, new_pos) ox, oy = canvas_to_axes(self, old_pos) self._x += nx - ox self._y += ny - oy self.setData(self._x, self._y) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ self._x += delta_x self._y += delta_y self.setData(self._x, self._y) def update_params(self): self.curveparam.update_curve(self) if self.selected: self.select() def update_item_parameters(self): self.curveparam.update_param(self) def get_item_parameters(self, itemparams): itemparams.add("CurveParam", self, self.curveparam) def set_item_parameters(self, itemparams): update_dataset(self.curveparam, itemparams.get("CurveParam"), visible_only=True) self.update_params() assert_interfaces_valid(CurveItem) class PolygonMapItem(QwtPlotItem): """ Construct a curve `plot item` with the parameters *curveparam* (see :py:class:`guiqwt.styles.CurveParam`) """ __implements__ = (IBasePlotItem, ISerializableType) _readonly = False _private = False _can_select = False _can_resize = False _can_move = False _can_rotate = False def __init__(self, curveparam=None): super(PolygonMapItem, self).__init__() if curveparam is None: self.curveparam = CurveParam(_("PolygonMap"), icon="curve.png") else: self.curveparam = curveparam self.selected = False self.immutable = True # set to false to allow moving points around self._pts = None # Array of points Mx2 self._n = None # Array of polygon offsets/ends Nx1 (polygon k points are _pts[_n[k-1]:_n[k]]) self._c = None # Color of polygon Nx2 [border,background] as RGBA uint32 self.update_params() def types(self): return (ICurveItemType, ITrackableItemType, ISerializableType) def can_select(self): return self._can_select def can_resize(self): return self._can_resize def can_rotate(self): return self._can_rotate def can_move(self): return self._can_move def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def setPen(self, x): pass def setBrush(self, x): pass def setSymbol(self, x): pass def setCurveAttribute(self, x, y): pass def setStyle(self, x): pass def setCurveType(self, x): pass def setBaseline(self, x): pass def __reduce__(self): state = (self.curveparam, self._pts, self._n, self._c, self.z()) res = (PolygonMapItem, (), state) return res def __setstate__(self, state): param, pts, n, c, z = state self.curveparam = param self.set_data(pts, n, c) self.setZ(z) self.update_params() def serialize(self, writer): """Serialize object to HDF5 writer""" writer.write(self._pts, group_name="Pdata") writer.write(self._n, group_name="Ndata") writer.write(self._c, group_name="Cdata") writer.write(self.z(), group_name="z") self.curveparam.update_param(self) writer.write(self.curveparam, group_name="curveparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" pts = reader.read(group_name="Pdata", func=reader.read_array) n = reader.read(group_name="Ndata", func=reader.read_array) c = reader.read(group_name="Cdata", func=reader.read_array) self.set_data(pts, n, c) self.setZ(reader.read("z")) self.curveparam = CurveParam(_("PolygonMap"), icon="curve.png") reader.read("curveparam", instance=self.curveparam) self.update_params() def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def invalidate_plot(self): plot = self.plot() if plot is not None: plot.invalidate() def select(self): """Select item""" self.selected = True self.setSymbol(SELECTED_SYMBOL) self.invalidate_plot() def unselect(self): """Unselect item""" self.selected = False # Restoring initial curve parameters: self.curveparam.update_curve(self) self.invalidate_plot() def get_data(self): """Return curve data x, y (NumPy arrays)""" return self._pts, self._n, self._c def set_data(self, pts, n, c): """ Set curve data: * x: NumPy array * y: NumPy array """ self._pts = np.array(pts, copy=False) self._n = np.array(n, copy=False) self._c = np.array(c, copy=False) xmin, ymin = self._pts.min(axis=0) xmax, ymax = self._pts.max(axis=0) self.bounds = QRectF(xmin, ymin, xmax - xmin, ymax - ymin) def is_empty(self): """Return True if item data is empty""" return self._pts is None or self._pts.size == 0 def hit_test(self, pos): """Calcul de la distance d'un point à une courbe renvoie (dist, handle, inside)""" if self.is_empty(): return sys.maxsize, 0, False, None plot = self.plot() # TODO return distance, i, False, None def get_closest_coordinates(self, x, y): """Renvoie les coordonnées (x',y') du point le plus proche de (x,y) Méthode surchargée pour ErrorBarSignalCurve pour renvoyer les coordonnées des pointes des barres d'erreur""" # TODO return x, y def get_coordinates_label(self, xc, yc): title = self.title().text() return "%s:
x = %f
y = %f" % (title, xc, yc) def move_local_point_to(self, handle, pos, ctrl=None): return def move_local_shape(self, old_pos, new_pos): pass def move_with_selection(self, delta_x, delta_y): pass def update_params(self): self.curveparam.update_curve(self) if self.selected: self.select() def update_item_parameters(self): self.curveparam.update_param(self) def get_item_parameters(self, itemparams): itemparams.add("CurveParam", self, self.curveparam) def set_item_parameters(self, itemparams): update_dataset(self.curveparam, itemparams.get("CurveParam"), visible_only=True) self.update_params() def draw(self, painter, xMap, yMap, canvasRect): # from time import time p1x = xMap.p1() s1x = xMap.s1() ax = (xMap.p2() - p1x) / (xMap.s2() - s1x) p1y = yMap.p1() s1y = yMap.s1() ay = (yMap.p2() - p1y) / (yMap.s2() - s1y) bx, by = p1x - s1x * ax, p1y - s1y * ay _c = self._c _n = self._n fgcol = QColor() bgcol = QColor() # t0 = time() polygons = simplify_poly( self._pts, _n, (ax, bx, ay, by), canvasRect.getCoords() ) # t1 = time() # print len(polygons), t1-t0 # t2 = time() for poly, num in polygons: points = [] for i in range(poly.shape[0]): points.append(QPointF(poly[i, 0], poly[i, 1])) pg = QPolygonF(points) fgcol.setRgba(int(_c[num, 0])) bgcol.setRgba(int(_c[num, 1])) painter.setPen(QPen(fgcol)) painter.setBrush(QBrush(bgcol)) painter.drawPolygon(pg) # print "poly:", time()-t2 def boundingRect(self): return self.bounds assert_interfaces_valid(PolygonMapItem) def _transform(map, v): return QwtScaleMap.transform(map, v) def vmap(map, v): """Transform coordinates while handling RuntimeWarning that could be raised by NumPy when trying to transform a zero in logarithmic scale for example""" with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) output = np.vectorize(_transform)(map, v) return output class ErrorBarCurveItem(CurveItem): """ Construct an error-bar curve `plot item` with the parameters *errorbarparam* (see :py:class:`guiqwt.styles.ErrorBarParam`) """ def __init__(self, curveparam=None, errorbarparam=None): if errorbarparam is None: self.errorbarparam = ErrorBarParam(_("Error bars"), icon="errorbar.png") else: self.errorbarparam = errorbarparam super(ErrorBarCurveItem, self).__init__(curveparam) self._dx = None self._dy = None self._minmaxarrays = {} def serialize(self, writer): """Serialize object to HDF5 writer""" super(ErrorBarCurveItem, self).serialize(writer) writer.write(self._dx, group_name="dXdata") writer.write(self._dy, group_name="dYdata") self.errorbarparam.update_param(self) writer.write(self.errorbarparam, group_name="errorbarparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.curveparam = CurveParam(_("Curve"), icon="curve.png") reader.read("curveparam", instance=self.curveparam) self.errorbarparam = ErrorBarParam(_("Error bars"), icon="errorbar.png") reader.read("errorbarparam", instance=self.errorbarparam) x = reader.read(group_name="Xdata", func=reader.read_array) y = reader.read(group_name="Ydata", func=reader.read_array) dx = reader.read(group_name="dXdata", func=reader.read_array) dy = reader.read(group_name="dYdata", func=reader.read_array) self.set_data(x, y, dx, dy) self.setZ(reader.read("z")) self.update_params() def unselect(self): """Unselect item""" CurveItem.unselect(self) self.errorbarparam.update_curve(self) def get_data(self): """ Return error-bar curve data: x, y, dx, dy * x: NumPy array * y: NumPy array * dx: float or NumPy array (non-constant error bars) * dy: float or NumPy array (non-constant error bars) """ return self._x, self._y, self._dx, self._dy def set_data(self, x, y, dx=None, dy=None): """ Set error-bar curve data: * x: NumPy array * y: NumPy array * dx: float or NumPy array (non-constant error bars) * dy: float or NumPy array (non-constant error bars) """ CurveItem.set_data(self, x, y) if dx is not None: dx = np.array(dx, copy=False) if dx.size == 0: dx = None if dy is not None: dy = np.array(dy, copy=False) if dy.size == 0: dy = None self._dx = dx self._dy = dy self._minmaxarrays = {} def get_minmax_arrays(self, all_values=True): if self._minmaxarrays.get(all_values) is None: x = self._x y = self._y dx = self._dx dy = self._dy if all_values: if dx is None: xmin = xmax = x else: xmin, xmax = x - dx, x + dx if dy is None: ymin = ymax = y else: ymin, ymax = y - dy, y + dy self._minmaxarrays.setdefault(all_values, (xmin, xmax, ymin, ymax)) else: isf = np.logical_and(np.isfinite(x), np.isfinite(y)) if dx is not None: isf = np.logical_and(isf, np.isfinite(dx)) if dy is not None: isf = np.logical_and(isf, np.isfinite(dy)) if dx is None: xmin = xmax = x[isf] else: xmin, xmax = x[isf] - dx[isf], x[isf] + dx[isf] if dy is None: ymin = ymax = y[isf] else: ymin, ymax = y[isf] - dy[isf], y[isf] + dy[isf] self._minmaxarrays.setdefault( all_values, (x[isf], y[isf], xmin, xmax, ymin, ymax) ) return self._minmaxarrays[all_values] def get_closest_coordinates(self, x, y): # Surcharge d'une méthode de base de CurveItem plot = self.plot() ax = self.xAxis() ay = self.yAxis() xc = plot.transform(ax, x) yc = plot.transform(ay, y) _distance, i, _inside, _other = self.hit_test(QPointF(xc, yc)) x0, y0 = self.plot().canvas2plotitem(self, xc, yc) x = self._x[i] y = self._y[i] xmin, xmax, ymin, ymax = self.get_minmax_arrays() if abs(y0 - y) > abs(y0 - ymin[i]): y = ymin[i] elif abs(y0 - y) > abs(y0 - ymax[i]): y = ymax[i] if abs(x0 - x) > abs(x0 - xmin[i]): x = xmin[i] elif abs(x0 - x) > abs(x0 - xmax[i]): x = xmax[i] return x, y def boundingRect(self): """Return the bounding rectangle of the data, error bars included""" xmin, xmax, ymin, ymax = self.get_minmax_arrays() if xmin is None or xmin.size == 0: return CurveItem.boundingRect(self) plot = self.plot() xminf, yminf = xmin[np.isfinite(xmin)], ymin[np.isfinite(ymin)] xmaxf, ymaxf = xmax[np.isfinite(xmax)], ymax[np.isfinite(ymax)] if plot is not None and "log" in ( plot.get_axis_scale(self.xAxis()), plot.get_axis_scale(self.yAxis()), ): xmin = self._get_visible_axis_min(self.xAxis(), xminf) ymin = self._get_visible_axis_min(self.yAxis(), yminf) else: xmin = xminf.min() ymin = yminf.min() return QRectF(xmin, ymin, xmaxf.max() - xmin, ymaxf.max() - ymin) def draw(self, painter, xMap, yMap, canvasRect): if self._x is None or self._x.size == 0: return x, y, xmin, xmax, ymin, ymax = self.get_minmax_arrays(all_values=False) tx = vmap(xMap, x) ty = vmap(yMap, y) RN = list(range(len(tx))) if self.errorOnTop: QwtPlotCurve.draw(self, painter, xMap, yMap, canvasRect) painter.save() painter.setPen(self.errorPen) cap = self.errorCap / 2.0 if self._dx is not None and self.errorbarparam.mode == 0: txmin = vmap(xMap, xmin) txmax = vmap(xMap, xmax) # Classic error bars lines = [] for i in RN: yi = ty[i] lines.append(QLineF(txmin[i], yi, txmax[i], yi)) painter.drawLines(lines) if cap > 0: lines = [] for i in RN: yi = ty[i] lines.append(QLineF(txmin[i], yi - cap, txmin[i], yi + cap)) lines.append(QLineF(txmax[i], yi - cap, txmax[i], yi + cap)) painter.drawLines(lines) if self._dy is not None: tymin = vmap(yMap, ymin) tymax = vmap(yMap, ymax) if self.errorbarparam.mode == 0: # Classic error bars lines = [] for i in RN: xi = tx[i] lines.append(QLineF(xi, tymin[i], xi, tymax[i])) painter.drawLines(lines) if cap > 0: # Cap lines = [] for i in RN: xi = tx[i] lines.append(QLineF(xi - cap, tymin[i], xi + cap, tymin[i])) lines.append(QLineF(xi - cap, tymax[i], xi + cap, tymax[i])) painter.drawLines(lines) else: # Error area points = [] rpoints = [] for i in RN: xi = tx[i] points.append(QPointF(xi, tymin[i])) rpoints.append(QPointF(xi, tymax[i])) points += reversed(rpoints) painter.setBrush(QBrush(self.errorBrush)) painter.drawPolygon(*points) painter.restore() if not self.errorOnTop: QwtPlotCurve.draw(self, painter, xMap, yMap, canvasRect) def update_params(self): self.errorbarparam.update_curve(self) CurveItem.update_params(self) def update_item_parameters(self): CurveItem.update_item_parameters(self) self.errorbarparam.update_param(self) def get_item_parameters(self, itemparams): CurveItem.get_item_parameters(self, itemparams) itemparams.add("ErrorBarParam", self, self.errorbarparam) def set_item_parameters(self, itemparams): update_dataset( self.errorbarparam, itemparams.get("ErrorBarParam"), visible_only=True ) CurveItem.set_item_parameters(self, itemparams) assert_interfaces_valid(ErrorBarCurveItem) # =============================================================================== # Plot Widget # =============================================================================== class ItemListWidget(QListWidget): """ PlotItemList List of items attached to plot """ def __init__(self, parent): super(ItemListWidget, self).__init__(parent) self.manager = None self.plot = None # the default plot... self.items = [] self.currentRowChanged.connect(self.current_row_changed) self.itemChanged.connect(self.item_changed) self.itemSelectionChanged.connect(self.refresh_actions) self.itemSelectionChanged.connect(self.selection_changed) self.setWordWrap(True) self.setMinimumWidth(140) self.setSelectionMode(QListWidget.ExtendedSelection) # Setup context menu self.menu = QMenu(self) self.menu_actions = self.setup_actions() self.refresh_actions() add_actions(self.menu, self.menu_actions) def register_panel(self, manager): self.manager = manager for plot in self.manager.get_plots(): plot.SIG_ITEMS_CHANGED.connect(self.items_changed) plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.items_changed) self.plot = self.manager.get_plot() def contextMenuEvent(self, event): """Override Qt method""" self.refresh_actions() self.menu.popup(event.globalPos()) def setup_actions(self): self.movedown_ac = create_action( self, _("Move to back"), icon=get_icon("arrow_down.png"), triggered=lambda: self.move_item("down"), ) self.moveup_ac = create_action( self, _("Move to front"), icon=get_icon("arrow_up.png"), triggered=lambda: self.move_item("up"), ) settings_ac = create_action( self, _("Parameters..."), icon=get_icon("settings.png"), triggered=self.edit_plot_parameters, ) self.remove_ac = create_action( self, _("Remove"), icon=get_icon("trash.png"), triggered=self.remove_item ) return [self.moveup_ac, self.movedown_ac, None, settings_ac, self.remove_ac] def edit_plot_parameters(self): self.plot.edit_plot_parameters("item") def __is_selection_contiguous(self): indexes = sorted([self.row(lw_item) for lw_item in self.selectedItems()]) return len(indexes) <= 1 or list(range(indexes[0], indexes[-1] + 1)) == indexes def get_selected_items(self): """Return selected QwtPlot items .. warning:: This is not the same as :py:data:`guiqwt.baseplot.BasePlot.get_selected_items`. Some items could appear in itemlist without being registered in plot widget items (in particular, some items could be selected in itemlist without being selected in plot widget) """ return [self.items[self.row(lw_item)] for lw_item in self.selectedItems()] def refresh_actions(self): is_selection = len(self.selectedItems()) > 0 for action in self.menu_actions: if action is not None: action.setEnabled(is_selection) if is_selection: remove_state = True for item in self.get_selected_items(): remove_state = remove_state and not item.is_readonly() self.remove_ac.setEnabled(remove_state) for action in [self.moveup_ac, self.movedown_ac]: action.setEnabled(self.__is_selection_contiguous()) def __get_item_icon(self, item): from guiqwt.label import LegendBoxItem, LabelItem from guiqwt.annotations import ( AnnotatedShape, AnnotatedRectangle, AnnotatedCircle, AnnotatedEllipse, AnnotatedPoint, AnnotatedSegment, ) from guiqwt.shapes import ( SegmentShape, RectangleShape, EllipseShape, PointShape, PolygonShape, Axes, XRangeSelection, ) from guiqwt.image import BaseImageItem, Histogram2DItem, ImageFilterItem from guiqwt.histogram import HistogramItem icon_name = "item.png" for klass, icon in ( (HistogramItem, "histogram.png"), (ErrorBarCurveItem, "errorbar.png"), (CurveItem, "curve.png"), (GridItem, "grid.png"), (LegendBoxItem, "legend.png"), (LabelItem, "label.png"), (AnnotatedSegment, "segment.png"), (AnnotatedPoint, "point_shape.png"), (AnnotatedCircle, "circle.png"), (AnnotatedEllipse, "ellipse_shape.png"), (AnnotatedRectangle, "rectangle.png"), (AnnotatedShape, "annotation.png"), (SegmentShape, "segment.png"), (RectangleShape, "rectangle.png"), (PointShape, "point_shape.png"), (EllipseShape, "ellipse_shape.png"), (Axes, "gtaxes.png"), (Marker, "marker.png"), (XRangeSelection, "xrange.png"), (PolygonShape, "freeform.png"), (Histogram2DItem, "histogram2d.png"), (ImageFilterItem, "funct.png"), (BaseImageItem, "image.png"), ): if isinstance(item, klass): icon_name = icon break return get_icon(icon_name) def items_changed(self, plot): """Plot items have changed""" active_plot = self.manager.get_active_plot() if active_plot is not plot: return self.plot = plot _block = self.blockSignals(True) active = plot.get_active_item() self.items = plot.get_public_items(z_sorted=True) self.clear() for item in self.items: title = item.title().text() lw_item = QListWidgetItem(self.__get_item_icon(item), title, self) lw_item.setCheckState(Qt.Checked if item.isVisible() else Qt.Unchecked) lw_item.setSelected(item.selected) font = lw_item.font() if item is active: font.setItalic(True) else: font.setItalic(False) lw_item.setFont(font) self.addItem(lw_item) self.refresh_actions() self.blockSignals(_block) def current_row_changed(self, index): """QListWidget current row has changed""" if index == -1: return item = self.items[index] if not item.can_select(): item = None if item is None: self.plot.replot() def selection_changed(self): items = self.get_selected_items() self.plot.select_some_items(items) self.plot.replot() def item_changed(self, listwidgetitem): """QListWidget item has changed""" item = self.items[self.row(listwidgetitem)] visible = listwidgetitem.checkState() == Qt.Checked if visible != item.isVisible(): self.plot.set_item_visible(item, visible) def move_item(self, direction): """Move item to the background/foreground Works only for contiguous selection -> 'refresh_actions' method should guarantee that""" items = self.get_selected_items() if direction == "up": self.plot.move_up(items) else: self.plot.move_down(items) # Re-select items which can't be selected in plot widget but can be # selected in ItemListWidget: for item in items: lw_item = self.item(self.items.index(item)) if not lw_item.isSelected(): lw_item.setSelected(True) self.plot.replot() def remove_item(self): if len(self.selectedItems()) == 1: message = _("Do you really want to remove this item?") else: message = _("Do you really want to remove selected items?") answer = QMessageBox.warning( self, _("Remove"), message, QMessageBox.Yes | QMessageBox.No ) if answer == QMessageBox.Yes: items = self.get_selected_items() self.plot.del_items(items) self.plot.replot() class PlotItemList(PanelWidget): """Construct the `plot item list panel`""" __implements__ = (IPanel,) PANEL_ID = ID_ITEMLIST PANEL_TITLE = _("Item list") PANEL_ICON = "item_list.png" def __init__(self, parent): super(PlotItemList, self).__init__(parent) self.manager = None vlayout = QVBoxLayout() self.setLayout(vlayout) style = "%s" layout, _label = get_image_layout( self.PANEL_ICON, style % self.PANEL_TITLE, alignment=Qt.AlignCenter ) vlayout.addLayout(layout) self.listwidget = ItemListWidget(self) vlayout.addWidget(self.listwidget) toolbar = QToolBar(self) vlayout.addWidget(toolbar) add_actions(toolbar, self.listwidget.menu_actions) def register_panel(self, manager): """Register panel to plot manager""" self.manager = manager self.listwidget.register_panel(manager) def configure_panel(self): """Configure panel""" pass assert_interfaces_valid(PlotItemList) class CurvePlot(BasePlot): """ Construct a 2D curve plotting widget (this class inherits :py:class:`guiqwt.baseplot.BasePlot`) * parent: parent widget * title: plot title * xlabel: (bottom axis title, top axis title) or bottom axis title only * ylabel: (left axis title, right axis title) or left axis title only * xunit: (bottom axis unit, top axis unit) or bottom axis unit only * yunit: (left axis unit, right axis unit) or left axis unit only * gridparam: GridParam instance * axes_synchronised: keep all x and y axes synchronised when zomming or panning """ DEFAULT_ITEM_TYPE = ICurveItemType AUTOSCALE_TYPES = (CurveItem, PolygonMapItem) #: Signal emitted by plot when plot axis has changed, e.g. when panning/zooming (arg: plot)) SIG_PLOT_AXIS_CHANGED = Signal(object) def __init__( self, parent=None, title=None, xlabel=None, ylabel=None, xunit=None, yunit=None, gridparam=None, section="plot", axes_synchronised=False, ): super(CurvePlot, self).__init__(parent, section) self.axes_reverse = [False] * 4 self.set_titles( title=title, xlabel=xlabel, ylabel=ylabel, xunit=xunit, yunit=yunit ) self.antialiased = False self.set_antialiasing(CONF.get(section, "antialiasing")) self.axes_synchronised = axes_synchronised # Installing our own event filter: # (qwt's event filter does not fit our needs) self.canvas().installEventFilter(self.filter) self.canvas().setMouseTracking(True) self.cross_marker = Marker() self.curve_marker = Marker( label_cb=self.get_coordinates_str, constraint_cb=self.on_active_curve ) self.cross_marker.set_style(section, "marker/cross") self.curve_marker.set_style(section, "marker/curve") self.cross_marker.setVisible(False) self.curve_marker.setVisible(False) self.cross_marker.attach(self) self.curve_marker.attach(self) self.curve_pointer = False self.canvas_pointer = False # Setting up grid if gridparam is None: gridparam = GridParam(title=_("Grid"), icon="grid.png") gridparam.read_config(CONF, section, "grid") self.grid = GridItem(gridparam) self.add_item(self.grid, z=-1) # ---- Private API ---------------------------------------------------------- def __del__(self): # Sometimes, an obscure exception happens when we quit an application # because if we don't remove the eventFilter it can still be called # after the filter object has been destroyed by Python. canvas = self.canvas() if canvas: try: canvas.removeEventFilter(self.filter) except RuntimeError: # PySide2 pass # generic helper methods def canvas2plotitem(self, plot_item, x_canvas, y_canvas): return ( self.invTransform(plot_item.xAxis(), x_canvas), self.invTransform(plot_item.yAxis(), y_canvas), ) def plotitem2canvas(self, plot_item, x, y): return ( self.transform(plot_item.xAxis(), x), self.transform(plot_item.yAxis(), y), ) def on_active_curve(self, x, y): curve = self.get_last_active_item(ITrackableItemType) if curve: x, y = curve.get_closest_coordinates(x, y) return x, y def get_coordinates_str(self, x, y): title = _("Grid") item = self.get_last_active_item(ITrackableItemType) if item: return item.get_coordinates_label(x, y) return "%s
x = %g
y = %g" % (title, x, y) def set_marker_axes(self): curve = self.get_last_active_item(ITrackableItemType) if curve: self.cross_marker.setAxes(curve.xAxis(), curve.yAxis()) self.curve_marker.setAxes(curve.xAxis(), curve.yAxis()) def do_move_marker(self, event): pos = event.pos() self.set_marker_axes() if event.modifiers() & Qt.ShiftModifier or self.curve_pointer: self.curve_marker.setZ(self.get_max_z() + 1) self.cross_marker.setVisible(False) self.curve_marker.setVisible(True) self.curve_marker.move_local_point_to(0, pos) self.replot() # self.move_curve_marker(self.curve_marker, xc, yc) elif event.modifiers() & Qt.AltModifier or self.canvas_pointer: self.cross_marker.setZ(self.get_max_z() + 1) self.cross_marker.setVisible(True) self.curve_marker.setVisible(False) self.cross_marker.move_local_point_to(0, pos) self.replot() # self.move_canvas_marker(self.cross_marker, xc, yc) else: vis_cross = self.cross_marker.isVisible() vis_curve = self.curve_marker.isVisible() self.cross_marker.setVisible(False) self.curve_marker.setVisible(False) if vis_cross or vis_curve: self.replot() def get_axes_to_update(self, dx, dy): if self.axes_synchronised: axes = [] for axis_name in self.AXIS_NAMES: if axis_name in ("left", "right"): d = dy else: d = dx axes.append((d, self.get_axis_id(axis_name))) return axes else: xaxis, yaxis = self.get_active_axes() return [(dx, xaxis), (dy, yaxis)] def do_pan_view(self, dx, dy): """ Translate the active axes by dx, dy dx, dy are tuples composed of (initial pos, dest pos) """ auto = self.autoReplot() self.setAutoReplot(False) axes_to_update = self.get_axes_to_update(dx, dy) for (x1, x0, _start, _width), axis_id in axes_to_update: lbound, hbound = self.get_axis_limits(axis_id) i_lbound = self.transform(axis_id, lbound) i_hbound = self.transform(axis_id, hbound) delta = x1 - x0 vmin = self.invTransform(axis_id, i_lbound - delta) vmax = self.invTransform(axis_id, i_hbound - delta) self.set_axis_limits(axis_id, vmin, vmax) self.setAutoReplot(auto) self.replot() # the signal MUST be emitted after replot, otherwise # we receiver won't see the new bounds (don't know why?) self.SIG_PLOT_AXIS_CHANGED.emit(self) def do_zoom_view(self, dx, dy, lock_aspect_ratio=False): """ Change the scale of the active axes (zoom/dezoom) according to dx, dy dx, dy are tuples composed of (initial pos, dest pos) We try to keep initial pos fixed on the canvas as the scale changes """ # See guiqwt/events.py where dx and dy are defined like this: # dx = (pos.x(), self.last.x(), self.start.x(), rct.width()) # dy = (pos.y(), self.last.y(), self.start.y(), rct.height()) # where: # * self.last is the mouse position seen during last event # * self.start is the first mouse position (here, this is the # coordinate of the point which is at the center of the zoomed area) # * rct is the plot rect contents # * pos is the current mouse cursor position auto = self.autoReplot() self.setAutoReplot(False) dx = (-1,) + dx # adding direction to tuple dx dy = (1,) + dy # adding direction to tuple dy if lock_aspect_ratio: direction, x1, x0, start, width = dx F = 1 + 3 * direction * float(x1 - x0) / width axes_to_update = self.get_axes_to_update(dx, dy) for (direction, x1, x0, start, width), axis_id in axes_to_update: lbound, hbound = self.get_axis_limits(axis_id) if not lock_aspect_ratio: F = 1 + 3 * direction * float(x1 - x0) / width if F * (hbound - lbound) == 0: continue if self.get_axis_scale(axis_id) == "lin": orig = self.invTransform(axis_id, start) vmin = orig - F * (orig - lbound) vmax = orig + F * (hbound - orig) else: # log scale i_lbound = self.transform(axis_id, lbound) i_hbound = self.transform(axis_id, hbound) imin = start - F * (start - i_lbound) imax = start + F * (i_hbound - start) vmin = self.invTransform(axis_id, imin) vmax = self.invTransform(axis_id, imax) self.set_axis_limits(axis_id, vmin, vmax) self.setAutoReplot(auto) self.replot() # the signal MUST be emitted after replot, otherwise # we receiver won't see the new bounds (don't know why?) self.SIG_PLOT_AXIS_CHANGED.emit(self) def do_zoom_rect_view(self, start, end): # XXX implement the case when axes are synchronised x1, y1 = start.x(), start.y() x2, y2 = end.x(), end.y() xaxis, yaxis = self.get_active_axes() active_axes = [(x1, x2, xaxis), (y1, y2, yaxis)] for h1, h2, k in active_axes: o1 = self.invTransform(k, h1) o2 = self.invTransform(k, h2) if o1 > o2: o1, o2 = o2, o1 if o1 == o2: continue if self.get_axis_direction(k): o1, o2 = o2, o1 self.setAxisScale(k, o1, o2) self.replot() self.SIG_PLOT_AXIS_CHANGED.emit(self) def get_default_item(self): """Return default item, depending on plot's default item type (e.g. for a curve plot, this is a curve item type). Return nothing if there is more than one item matching the default item type.""" items = self.get_items(item_type=self.DEFAULT_ITEM_TYPE) if len(items) == 1: return items[0] # ---- BasePlot API --------------------------------------------------------- def add_item(self, item, z=None): """ Add a *plot item* instance to this *plot widget* * item: :py:data:`qwt.QwtPlotItem` object implementing the :py:data:`guiqwt.interfaces.IBasePlotItem` interface * z: item's z order (None -> z = max(self.get_items())+1) """ if isinstance(item, QwtPlotCurve): item.setRenderHint(QwtPlotItem.RenderAntialiased, self.antialiased) BasePlot.add_item(self, item, z) def del_all_items(self, except_grid=True): """Del all items, eventually (default) except grid""" items = [ item for item in self.items if not except_grid or item is not self.grid ] self.del_items(items) def set_active_item(self, item): """Override base set_active_item to change the grid's axes according to the selected item""" old_active = self.active_item BasePlot.set_active_item(self, item) if item is not None and old_active is not item: self.grid.setAxes(item.xAxis(), item.yAxis()) def get_plot_parameters(self, key, itemparams): if key == "grid": self.grid.gridparam.update_param(self.grid) itemparams.add("GridParam", self, self.grid.gridparam) else: BasePlot.get_plot_parameters(self, key, itemparams) def set_item_parameters(self, itemparams): # Grid style dataset = itemparams.get("GridParam") if dataset is not None: dataset.update_grid(self.grid) self.grid.gridparam = dataset BasePlot.set_item_parameters(self, itemparams) def do_autoscale(self, replot=True, axis_id=None): """Do autoscale on all axes""" auto = self.autoReplot() self.setAutoReplot(False) # XXX implement the case when axes are synchronised for axis_id in self.AXIS_IDS if axis_id is None else [axis_id]: vmin, vmax = None, None if not self.axisEnabled(axis_id): continue for item in self.get_items(): if ( isinstance(item, self.AUTOSCALE_TYPES) and not item.is_empty() and item.isVisible() ): bounds = item.boundingRect() if axis_id == item.xAxis(): xmin, xmax = bounds.left(), bounds.right() if vmin is None or xmin < vmin: vmin = xmin if vmax is None or xmax > vmax: vmax = xmax elif axis_id == item.yAxis(): ymin, ymax = bounds.top(), bounds.bottom() if vmin is None or ymin < vmin: vmin = ymin if vmax is None or ymax > vmax: vmax = ymax if vmin is None or vmax is None: continue if vmin == vmax: # same behavior as MATLAB vmin -= 1 vmax += 1 elif self.get_axis_scale(axis_id) == "lin": dv = vmax - vmin vmin -= 0.002 * dv vmax += 0.002 * dv elif vmin > 0 and vmax > 0: # log scale dv = np.log10(vmax) - np.log10(vmin) vmin = 10 ** (np.log10(vmin) - 0.002 * dv) vmax = 10 ** (np.log10(vmax) + 0.002 * dv) self.set_axis_limits(axis_id, vmin, vmax) self.setAutoReplot(auto) if replot: self.replot() self.SIG_PLOT_AXIS_CHANGED.emit(self) def set_axis_limits(self, axis_id, vmin, vmax, stepsize=0): """Set axis limits (minimum and maximum values)""" axis_id = self.get_axis_id(axis_id) vmin, vmax = sorted([vmin, vmax]) if self.get_axis_direction(axis_id): BasePlot.set_axis_limits(self, axis_id, vmax, vmin, stepsize) else: BasePlot.set_axis_limits(self, axis_id, vmin, vmax, stepsize) # ---- Public API ----------------------------------------------------------- def get_axis_direction(self, axis_id): """ Return axis direction of increasing values * axis_id: axis id (BasePlot.Y_LEFT, BasePlot.X_BOTTOM, ...) or string: 'bottom', 'left', 'top' or 'right' """ axis_id = self.get_axis_id(axis_id) return self.axes_reverse[axis_id] def set_axis_direction(self, axis_id, reverse=False): """ Set axis direction of increasing values * axis_id: axis id (BasePlot.Y_LEFT, BasePlot.X_BOTTOM, ...) or string: 'bottom', 'left', 'top' or 'right' * reverse: False (default) - x-axis values increase from left to right - y-axis values increase from bottom to top * reverse: True - x-axis values increase from right to left - y-axis values increase from top to bottom """ axis_id = self.get_axis_id(axis_id) if reverse != self.axes_reverse[axis_id]: self.replot() self.axes_reverse[axis_id] = reverse axis_map = self.canvasMap(axis_id) self.setAxisScale(axis_id, axis_map.s2(), axis_map.s1()) self.updateAxes() self.SIG_AXIS_DIRECTION_CHANGED.emit(self, axis_id) def set_titles(self, title=None, xlabel=None, ylabel=None, xunit=None, yunit=None): """ Set plot and axes titles at once * title: plot title * xlabel: (bottom axis title, top axis title) or bottom axis title only * ylabel: (left axis title, right axis title) or left axis title only * xunit: (bottom axis unit, top axis unit) or bottom axis unit only * yunit: (left axis unit, right axis unit) or left axis unit only """ if title is not None: self.set_title(title) if xlabel is not None: if isinstance(xlabel, str): xlabel = (xlabel, "") for label, axis in zip(xlabel, ("bottom", "top")): if label is not None: self.set_axis_title(axis, label) if ylabel is not None: if isinstance(ylabel, str): ylabel = (ylabel, "") for label, axis in zip(ylabel, ("left", "right")): if label is not None: self.set_axis_title(axis, label) if xunit is not None: if isinstance(xunit, str): xunit = (xunit, "") for unit, axis in zip(xunit, ("bottom", "top")): if unit is not None: self.set_axis_unit(axis, unit) if yunit is not None: if isinstance(yunit, str): yunit = (yunit, "") for unit, axis in zip(yunit, ("left", "right")): if unit is not None: self.set_axis_unit(axis, unit) def set_pointer(self, pointer_type): """ Set pointer. Valid values of `pointer_type`: * None: disable pointer * "canvas": enable canvas pointer * "curve": enable on-curve pointer """ self.canvas_pointer = False self.curve_pointer = False if pointer_type == "canvas": self.canvas_pointer = True elif pointer_type == "curve": self.curve_pointer = True def set_antialiasing(self, checked): """Toggle curve antialiasing""" self.antialiased = checked for curve in self.itemList(): if isinstance(curve, QwtPlotCurve): curve.setRenderHint(QwtPlotItem.RenderAntialiased, self.antialiased) def set_plot_limits(self, x0, x1, y0, y1, xaxis="bottom", yaxis="left"): """Set plot scale limits""" self.set_axis_limits(yaxis, y0, y1) self.set_axis_limits(xaxis, x0, x1) self.updateAxes() self.SIG_AXIS_DIRECTION_CHANGED.emit(self, self.get_axis_id(yaxis)) self.SIG_AXIS_DIRECTION_CHANGED.emit(self, self.get_axis_id(xaxis)) def set_plot_limits_synchronised(self, x0, x1, y0, y1): for yaxis, xaxis in (("left", "bottom"), ("right", "top")): self.set_plot_limits(x0, x1, y0, y1, xaxis=xaxis, yaxis=yaxis) def get_plot_limits(self, xaxis="bottom", yaxis="left"): """Return plot scale limits""" x0, x1 = self.get_axis_limits(xaxis) y0, y1 = self.get_axis_limits(yaxis) return x0, x1, y0, y1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/debug.py0000666000000000000000000000421500000000000012711 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.debug ------------ The `debug` module contains some debugging functions (mostly dumping attributes of Qt Objects). """ import io from qtpy.QtGui import QImage, QInputEvent from qtpy.QtCore import Qt, QEvent def buttons_to_str(buttons): """Conversion des flags Qt en chaine""" string = "" if buttons & Qt.LeftButton: string += "L" if buttons & Qt.MidButton: string += "M" if buttons & Qt.RightButton: string += "R" return string def evt_type_to_str(type): """Représentation textuelle d'un type d'événement (debug)""" if type == QEvent.MouseButtonPress: return "Mpress" elif type == QEvent.MouseButtonRelease: return "Mrelease" elif type == QEvent.MouseMove: return "Mmove" elif type == QEvent.ContextMenu: return "Context" else: return "%d" % type def print_event(evt): """Représentation textuelle d'un événement (debug)""" string = "" if isinstance(evt, QInputEvent): string += evt_type_to_str(evt.type()) string += "%08x:" % evt.modifiers() if hasattr(evt, "buttons"): buttons = evt.buttons() elif hasattr(evt, "buttons"): buttons = evt.button() else: buttons = 0 string += buttons_to_str(buttons) if string: print(string) else: print(evt) def qimage_format(fmt): for attr in dir(QImage): if attr.startswith("Format"): val = getattr(QImage, attr) if val == fmt: return attr[len("Format_") :] return str(fmt) def qimage_to_str(img, indent=""): fd = io.StringIO() print(indent, img, file=fd) indent += " " print(indent, "Size:", img.width(), "x", img.height(), file=fd) print(indent, "Depth:", img.depth(), file=fd) print(indent, "Format", qimage_format(img.format()), file=fd) return fd.getvalue() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/events.py0000666000000000000000000006133200000000000013132 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable-msg=W0622,R0903 # W0622: complains about filter being a builtin # R0903: complains about too few public methods which is the purpose here """ guiqwt.events ------------- The `event` module handles event management (states, event filter, ...). """ import weakref from qtpy.QtCore import QEvent, Qt, QObject, QPointF, Signal from qtpy.QtGui import QKeySequence CursorShape = type(Qt.ArrowCursor) from guiqwt.config import CONF from guiqwt.debug import evt_type_to_str, buttons_to_str # Sélection d'événements --------- class EventMatch(object): """A callable returning true if it matches an event""" def __call__(self, event): raise NotImplementedError def get_event_types(self): """Returns a set of event types handled by this EventMatch. This is used to quickly optimize events not handled by any event matchers """ return frozenset() class KeyEventMatch(EventMatch): """ A callable returning True if it matches a key event keys: list of keys or couples (key, modifier) """ def __init__(self, keys): super(KeyEventMatch, self).__init__() key_list, mod_list = [], [] for item in keys: if isinstance(item, (tuple, list)): k, m = item else: k = item # Avoid bad arguments: modifier instead of key assert k not in ( Qt.ControlModifier, Qt.ShiftModifier, Qt.AltModifier, Qt.NoModifier, ) m = Qt.NoModifier key_list.append(k) mod_list.append(m) self.keys = key_list self.mods = mod_list def get_event_types(self): return frozenset((QEvent.KeyPress,)) def __call__(self, event): if event.type() == QEvent.KeyPress: my_key = event.key() my_mod = event.modifiers() if my_key in self.keys: mod = self.mods[self.keys.index(my_key)] if mod == Qt.NoModifier or my_mod & mod: return True return False class StandardKeyMatch(EventMatch): """ A callable returning True if it matches a key event keysequence: QKeySequence.StandardKey integer """ def __init__(self, keysequence): super(StandardKeyMatch, self).__init__() assert isinstance(keysequence, (int, QKeySequence.StandardKey)) self.keyseq = keysequence def get_event_types(self): return frozenset((QEvent.KeyPress,)) def __call__(self, event): return event.type() == QEvent.KeyPress and event.matches(self.keyseq) class MouseEventMatch(EventMatch): """Base class for matching mouse events""" def __init__(self, evt_type, btn, modifiers=Qt.NoModifier): super(MouseEventMatch, self).__init__() assert isinstance(modifiers, (int, Qt.KeyboardModifiers, Qt.KeyboardModifier)) self.evt_type = evt_type self.button = btn self.modifiers = modifiers def get_event_types(self): return frozenset((self.evt_type,)) def __call__(self, event): if event.type() == self.evt_type: if event.button() == self.button: if self.modifiers != Qt.NoModifier: if (event.modifiers() & self.modifiers) == self.modifiers: return True elif event.modifiers() == Qt.NoModifier: return True return False def __repr__(self): return "" % ( evt_type_to_str(self.evt_type), self.modifiers, buttons_to_str(self.button), ) class MouseMoveMatch(MouseEventMatch): def __call__(self, event): if event.type() == self.evt_type: if ( self.button != Qt.NoButton and (event.buttons() & self.button == self.button) ) or event.buttons() == Qt.NoButton: if self.modifiers != Qt.NoModifier: if (event.modifiers() & self.modifiers) == self.modifiers: return True elif event.modifiers() == Qt.NoModifier: return True return False # Machine d'état ---------- class StatefulEventFilter(QObject): """Gestion d'une machine d'état pour les événements d'un canvas """ def __init__(self, parent): super(StatefulEventFilter, self).__init__() self.states = {0: {}} # 0 : cursor 1: panning, 2: zooming self.cursors = {} self.state = 0 self.max_state = 0 self.events = {} self.plot = parent self.all_event_types = frozenset() def eventFilter(self, _obj, event): """Le callback 'eventfilter' pour Qt""" if not hasattr(self, "all_event_types"): print(repr(self), self) if event.type() not in self.all_event_types: return False state = self.states[self.state] # from pprint import pprint # print self.state # pprint(state.keys()) for match, (call_list, next_state) in list(state.items()): if match(event): self.set_state(next_state, event) for call in call_list: call(self, event) # might change state return False def set_state(self, state, event): """Change l'état courant. Peut être appelé par les handlers pour annuler un changement d'état""" assert state in self.states if state == self.state: return self.state = state cursor = self.get_cursor(event) if cursor is not None: self.plot.canvas().setCursor(cursor) def new_state(self): """Création (réservation) d'un nouveau numéro d'état""" self.max_state += 1 self.states[self.max_state] = {} return self.max_state def add_event(self, state, match, call, next_state=None): """Ajoute une transition sur la machine d'état si next_state est fourni, il doit correspondre à un état existant sinon un nouvel état d'arrivée est créé """ assert isinstance(state, int) assert isinstance(match, EventMatch) self.all_event_types = self.all_event_types.union(match.get_event_types()) entry = self.states[state].setdefault(match, [[], None]) entry[0].append(call) if entry[1] is None: if next_state is None: next_state = self.new_state() else: pass else: if next_state is not None: assert next_state == entry[1] else: next_state = entry[1] entry[1] = next_state return next_state # gestion du curseur def set_cursor(self, cursor, *states): """Associe un curseur à un ou plusieurs états""" assert isinstance(cursor, CursorShape) for s in states: self.cursors[s] = cursor def get_cursor(self, _event): """Récupère le curseur associé à un état / événement donné""" # on passe event pour eventuellement pouvoir choisir # le curseur en fonction des touches de modification cursor = self.cursors.get(self.state, None) if cursor is None: # no cursor specified : should keep previous one return None return cursor # Fonction utilitaires def mouse_press(self, btn, modifiers=Qt.NoModifier): """Création d'un filtre pour l'événement MousePress""" return self.events.setdefault( ("mousepress", btn, modifiers), MouseEventMatch(QEvent.MouseButtonPress, btn, modifiers), ) def mouse_move(self, btn, modifiers=Qt.NoModifier): """Création d'un filtre pour l'événement MouseMove""" return self.events.setdefault( ("mousemove", btn, modifiers), MouseMoveMatch(QEvent.MouseMove, btn, modifiers), ) def mouse_release(self, btn, modifiers=Qt.NoModifier): """Création d'un filtre pour l'événement MouseRelease""" return self.events.setdefault( ("mouserelease", btn, modifiers), MouseEventMatch(QEvent.MouseButtonRelease, btn, modifiers), ) def nothing(self, filter, event): """A nothing filter, provided to help removing duplicate handlers""" pass class DragHandler(QObject): """Classe de base pour les gestionnaires d'événements du type click - drag - release """ cursor = None def __init__(self, filter, btn, mods=Qt.NoModifier, start_state=0): super(DragHandler, self).__init__() self.state0 = filter.add_event( start_state, filter.mouse_press(btn, mods), self.start_tracking ) self.state1 = filter.add_event( self.state0, filter.mouse_move(btn, mods), self.start_moving ) filter.add_event( self.state1, filter.mouse_move(btn, mods), self.move, self.state1 ) filter.add_event( self.state0, filter.mouse_release(btn, mods), self.stop_notmoving, start_state, ) filter.add_event( self.state1, filter.mouse_release(btn, mods), self.stop_moving, start_state ) if self.cursor is not None: filter.set_cursor(self.cursor, self.state0, self.state1) self.start = None # first mouse position self.last = None # mouse position seen during last event self.parent_tracking = None def get_move_state(self, filter, pos): rct = filter.plot.contentsRect() dx = (pos.x(), self.last.x(), self.start.x(), rct.width()) dy = (pos.y(), self.last.y(), self.start.y(), rct.height()) self.last = QPointF(pos) return dx, dy def start_tracking(self, _filter, event): self.start = self.last = QPointF(event.pos()) def start_moving(self, filter, event): return self.move(filter, event) def stop_tracking(self, _filter, _event): pass # filter.plot.canvas().setMouseTracking(self.parent_tracking) def stop_notmoving(self, filter, event): self.stop_tracking(filter, event) def stop_moving(self, filter, event): self.stop_tracking(filter, event) def move(self, filter, event): raise NotImplementedError() class ClickHandler(QObject): """Classe de base pour les gestionnaires d'événements du type click - release """ #: Signal emitted by ClickHandler on mouse click SIG_CLICK_EVENT = Signal(object, "QEvent") def __init__(self, filter, btn, mods=Qt.NoModifier, start_state=0): super(ClickHandler, self).__init__() self.state0 = filter.add_event( start_state, filter.mouse_press(btn, mods), filter.nothing ) filter.add_event( self.state0, filter.mouse_release(btn, mods), self.click, start_state ) def click(self, filter, event): self.SIG_CLICK_EVENT.emit(filter, event) class PanHandler(DragHandler): cursor = Qt.ClosedHandCursor def move(self, filter, event): x_state, y_state = self.get_move_state(filter, event.pos()) filter.plot.do_pan_view(x_state, y_state) class ZoomHandler(DragHandler): cursor = Qt.SizeAllCursor def move(self, filter, event): x_state, y_state = self.get_move_state(filter, event.pos()) filter.plot.do_zoom_view(x_state, y_state) class MenuHandler(ClickHandler): def click(self, filter, event): menu = filter.plot.get_context_menu() if menu: menu.popup(event.globalPos()) class QtDragHandler(DragHandler): #: Signal emitted by QtDragHandler when starting tracking SIG_START_TRACKING = Signal(object, "QEvent") #: Signal emitted by QtDragHandler when stopping tracking and not moving SIG_STOP_NOT_MOVING = Signal(object, "QEvent") #: Signal emitted by QtDragHandler when stopping tracking and moving SIG_STOP_MOVING = Signal(object, "QEvent") #: Signal emitted by QtDragHandler when moving SIG_MOVE = Signal(object, "QEvent") def start_tracking(self, filter, event): DragHandler.start_tracking(self, filter, event) self.SIG_START_TRACKING.emit(filter, event) def stop_notmoving(self, filter, event): self.SIG_STOP_NOT_MOVING.emit(filter, event) def stop_moving(self, filter, event): self.SIG_STOP_MOVING.emit(filter, event) def move(self, filter, event): self.SIG_MOVE.emit(filter, event) class AutoZoomHandler(ClickHandler): def click(self, filter, _event): filter.plot.do_autoscale() class MoveHandler(object): def __init__(self, filter, btn=Qt.NoButton, mods=Qt.NoModifier, start_state=0): filter.add_event( start_state, filter.mouse_move(btn, mods), self.move, start_state ) def move(self, filter, event): filter.plot.do_move_marker(event) class UndoMoveObject(object): def __init__(self, obj, pos1, pos2): self.obj = obj from guiqwt.baseplot import canvas_to_axes self.coords1 = canvas_to_axes(obj, pos1) self.coords2 = canvas_to_axes(obj, pos2) def is_valid(self): return self.obj.plot() is not None def compute_positions(self): from guiqwt.baseplot import axes_to_canvas pos1 = QPointF(*axes_to_canvas(self.obj, *self.coords1)) pos2 = QPointF(*axes_to_canvas(self.obj, *self.coords2)) return pos1, pos2 def undo(self): pos1, pos2 = self.compute_positions() self.obj.plot().unselect_all() self.obj.move_local_shape(pos1, pos2) def redo(self): pos1, pos2 = self.compute_positions() self.obj.plot().unselect_all() self.obj.move_local_shape(pos2, pos1) class UndoMovePoint(UndoMoveObject): def __init__(self, obj, pos1, pos2, handle, ctrl): super(UndoMovePoint, self).__init__(obj, pos1, pos2) self.handle = handle self.ctrl = ctrl def undo(self): pos1, pos2 = self.compute_positions() self.obj.move_local_point_to(self.handle, pos1, self.ctrl) def redo(self): pos1, pos2 = self.compute_positions() self.obj.move_local_point_to(self.handle, pos2, self.ctrl) class ObjectHandler(object): def __init__( self, filter, btn, mods=Qt.NoModifier, start_state=0, multiselection=False ): self.multiselection = multiselection self.start_state = start_state self.state0 = filter.add_event( start_state, filter.mouse_press(btn, mods), self.start_tracking ) filter.add_event( self.state0, filter.mouse_move(btn, mods), self.move, self.state0 ) filter.add_event( self.state0, filter.mouse_release(btn, mods), self.stop_tracking, start_state, ) filter.add_event( start_state, StandardKeyMatch(QKeySequence.Undo), self.undo, start_state ) filter.add_event( start_state, StandardKeyMatch(QKeySequence.Redo), self.redo, start_state ) self.handle = None # first mouse position self.inside = False self._active = None # mouse position seen during last event self.last_pos = None self.unselection_pending = None self.undo_stack = [None] self.undo_index = 0 self.first_pos = None self.undo_action = None @property def active(self): if self._active is not None: return self._active() @active.setter def active(self, value): if value is None: self._active = None else: self._active = weakref.ref(value) def add_undo_move_action(self, undo_action): self.undo_stack = self.undo_stack[: self.undo_index + 1] self.undo_stack.append(undo_action) self.undo_index = len(self.undo_stack) - 1 def undo(self, filter, event): action = self.undo_stack[self.undo_index] if action is not None: if action.is_valid(): action.undo() filter.plot.replot() else: self.undo_stack.remove(action) self.undo_index -= 1 def redo(self, filter, event): if self.undo_index < len(self.undo_stack) - 1: action = self.undo_stack[self.undo_index + 1] if action.is_valid(): action.redo() filter.plot.replot() self.undo_index += 1 else: self.undo_stack.remove(action) def start_tracking(self, filter, event): plot = filter.plot self.inside = False self.active = None self.handle = None self.first_pos = pos = event.pos() self.last_pos = QPointF(pos) selected = plot.get_active_item() distance = CONF.get("plot", "selection/distance", 6) ( nearest, nearest_dist, nearest_handle, nearest_inside, ) = plot.get_nearest_object(pos, distance) if nearest is not None: # Is the nearest object the real deal? if not nearest.can_select() or nearest_dist >= distance: # Looking for the nearest object in z containing cursor position ( nearest, nearest_dist, nearest_handle, nearest_inside, ) = plot.get_nearest_object_in_z(pos) # This will unselect active item only if it's not moved afterwards: self.unselection_pending = selected is nearest if selected and not self.multiselection: # An item is selected self.active = selected (dist, self.handle, self.inside, other_object) = self.active.hit_test(pos) if other_object is not None: # e.g. LegendBoxItem: 'other_object' is the selected curve plot.set_active_item(other_object) return if dist >= distance and not self.inside: # The following allows to move together selected items by # clicking inside any of them (instead of active item only) other_selitems = [ _it for _it in plot.get_selected_items() if _it is not self.active and _it.can_move() ] for selitem in other_selitems: dist, handle, inside, _other = selitem.hit_test(pos) if dist < distance or inside: self.inside = inside break else: self.__unselect_objects(filter) filter.set_state(self.start_state, event) return else: # No item is selected self.active = nearest self.handle = nearest_handle self.inside = nearest_inside dist = nearest_dist if nearest is not None: plot.set_active_item(nearest) if not nearest.selected: if not self.multiselection: plot.unselect_all() plot.select_item(nearest) # Eventually move or resize selected object: self.__move_or_resize_object(dist, distance, event, filter) plot.replot() def __unselect_objects(self, filter): """Unselect selected object*s*""" plot = filter.plot plot.unselect_all() plot.replot() def __move_or_resize_object(self, dist, distance, event, filter): if ( dist < distance and self.handle is not None and (self.active.can_resize() or self.active.can_rotate()) ): # Resize / move handle self.inside = False return if self.inside and self.active.can_move(): # Move object return # can't move, can't resize filter.set_state(self.start_state, event) if self.unselection_pending: self.__unselect_objects(filter) def move(self, filter, event): if self.active is None: return self.unselection_pending = False if self.inside: self.active.move_local_shape(self.last_pos, event.pos()) self.undo_action = UndoMoveObject(self.active, event.pos(), self.first_pos) else: ctrl = event.modifiers() & Qt.ControlModifier == Qt.ControlModifier self.active.move_local_point_to(self.handle, event.pos(), ctrl) self.undo_action = UndoMovePoint( self.active, self.first_pos, event.pos(), self.handle, ctrl ) self.last_pos = QPointF(event.pos()) filter.plot.replot() def stop_tracking(self, filter, event): self.add_undo_move_action(self.undo_action) if self.unselection_pending: self.__unselect_objects(filter) self.handle = None self.active = None class RectangularSelectionHandler(DragHandler): #: Signal emitted by RectangularSelectionHandler when ending selection SIG_END_RECT = Signal(object, "QPointF", "QPointF") def __init__(self, filter, btn, mods=Qt.NoModifier, start_state=0): super(RectangularSelectionHandler, self).__init__( filter, btn, mods, start_state ) self.avoid_null_shape = False def set_shape(self, shape, h0, h1, setup_shape_cb=None, avoid_null_shape=False): self.shape = shape self.shape_h0 = h0 self.shape_h1 = h1 self.setup_shape_cb = setup_shape_cb self.avoid_null_shape = avoid_null_shape def start_tracking(self, filter, event): self.start = self.last = QPointF(event.pos()) def start_moving(self, filter, event): self.shape.attach(filter.plot) self.shape.setZ(filter.plot.get_max_z() + 1) if self.avoid_null_shape: self.start -= QPointF(1, 1) self.shape.move_local_point_to(self.shape_h0, self.start) self.shape.move_local_point_to(self.shape_h1, event.pos()) self.start_moving_action(filter, event) if self.setup_shape_cb is not None: self.setup_shape_cb(self.shape) self.shape.show() filter.plot.replot() def start_moving_action(self, filter, event): """Les classes derivees peuvent surcharger cette methode""" pass def move(self, filter, event): self.shape.move_local_point_to(self.shape_h1, event.pos()) self.move_action(filter, event) filter.plot.replot() def move_action(self, filter, event): """Les classes derivees peuvent surcharger cette methode""" pass def stop_moving(self, filter, event): self.shape.detach() self.stop_moving_action(filter, event) filter.plot.replot() def stop_moving_action(self, filter, event): """Les classes derivees peuvent surcharger cette methode""" self.SIG_END_RECT.emit(filter, self.start, event.pos()) class ZoomRectHandler(RectangularSelectionHandler): def stop_moving_action(self, filter, event): filter.plot.do_zoom_rect_view(self.start, event.pos()) def setup_standard_tool_filter(filter, start_state): """Création des filtres standard (pan/zoom) sur boutons milieu/droit""" # Bouton du milieu PanHandler(filter, Qt.MidButton, start_state=start_state) AutoZoomHandler(filter, Qt.MidButton, start_state=start_state) # Bouton droit ZoomHandler(filter, Qt.RightButton, start_state=start_state) MenuHandler(filter, Qt.RightButton, start_state=start_state) # Autres (touches, move) MoveHandler(filter, start_state=start_state) MoveHandler(filter, start_state=start_state, mods=Qt.ShiftModifier) MoveHandler(filter, start_state=start_state, mods=Qt.AltModifier) return start_state ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/geometry.py0000666000000000000000000000567300000000000013467 0ustar00# -*- coding: utf-8 -*- """ Basic geometry functions """ # pylint: disable=C0103 from numpy import ( matrix, array, arccos, sign, cos, sin, linalg, vdot, pi, sqrt, fabs, arctan, ) # =============================================================================== # Transform matrix functions # =============================================================================== def translate(tx, ty): """Return translation matrix (NumPy matrix object)""" return matrix([[1, 0, tx], [0, 1, ty], [0, 0, 1]], float) def scale(sx, sy): """Return scale matrix (NumPy matrix object)""" return matrix([[sx, 0, 0], [0, sy, 0], [0, 0, 1]], float) def rotate(alpha): """Return rotation matrix (NumPy matrix object)""" return matrix( [[cos(alpha), -sin(alpha), 0], [sin(alpha), cos(alpha), 0], [0, 0, 1]], float ) def colvector(x, y): """Return vector (NumPy matrix object) from coordinates""" return matrix([x, y, 1]).T # =============================================================================== # Operations on vectors (from coordinates) # =============================================================================== def vector_norm(xa, ya, xb, yb): """Return vector norm: (xa, xb)-->(ya, yb)""" return linalg.norm(array((xb - xa, yb - ya))) def vector_projection(dv, xa, ya, xb, yb): """Return vector projection on *dv*: (xa, xb)-->(ya, yb)""" assert dv.shape == (2,) v_ab = array((xb - xa, yb - ya)) u_ab = v_ab / linalg.norm(v_ab) return vdot(u_ab, dv) * u_ab + array((xb, yb)) def vector_rotation(theta, dx, dy): """Compute theta-rotation on vector *v*, returns vector coordinates""" return array(rotate(theta) * colvector(dx, dy)).ravel()[:2] def vector_angle(dx, dy): """Return vector angle with X-axis""" # sign(dy) == 1 --> return Arccos() # sign(dy) == 0 --> return 0 if sign(dx) == 1 # sign(dy) == 0 --> return pi if sign(dx) == -1 # sign(dy) == -1 --> return 2pi-Arccos() if dx == 0 and dy == 0: return 0.0 else: sx, sy = sign(dx), sign(dy) acos = arccos(dx / sqrt(dx ** 2 + dy ** 2)) return sy * (pi * (sy - 1) + acos) + pi * (1 - sy ** 2) * (1 - sx) * 0.5 # =============================================================================== # Misc. # =============================================================================== def compute_center(x1, y1, x2, y2): return 0.5 * (x1 + x2), 0.5 * (y1 + y2) def compute_rect_size(x1, y1, x2, y2): return x2 - x1, fabs(y2 - y1) def compute_distance(x1, y1, x2, y2): return sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) def compute_angle(x1, y1, x2, y2, reverse=False): sign = -1 if reverse else 1 if x2 == x1: return 0.0 else: return arctan(-sign * (y2 - y1) / (x2 - x1)) * 180 / pi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/histogram.py0000666000000000000000000004653100000000000013627 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.histogram ---------------- The `histogram` module provides histogram related objects: * :py:class:`guiqwt.histogram.HistogramItem`: an histogram plot item * :py:class:`guiqwt.histogram.ContrastAdjustment`: the `contrast adjustment panel` * :py:class:`guiqwt.histogram.LevelsHistogram`: a curve plotting widget used by the `contrast adjustment panel` to compute, manipulate and display the image levels histogram ``HistogramItem`` objects are plot items (derived from QwtPlotItem) that may be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`. Example ~~~~~~~ Simple histogram plotting example: .. literalinclude:: /../guiqwt/tests/histogram.py Reference ~~~~~~~~~ .. autoclass:: HistogramItem :members: :inherited-members: .. autoclass:: ContrastAdjustment :members: :inherited-members: .. autoclass:: LevelsHistogram :members: :inherited-members: """ import weakref import numpy as np from qtpy.QtCore import Qt, Signal from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QToolBar from guidata.dataset.datatypes import DataSet from guidata.dataset.dataitems import FloatItem from guidata.utils import assert_interfaces_valid, update_dataset from guidata.configtools import get_icon, get_image_layout from guidata.qthelpers import add_actions, create_action # Local imports from guiqwt.transitional import QwtPlotCurve from guiqwt.config import CONF, _ from guiqwt.interfaces import IBasePlotItem, IHistDataSource, IVoiImageItemType, IPanel from guiqwt.panels import PanelWidget, ID_CONTRAST from guiqwt.curve import CurveItem, CurvePlot from guiqwt.image import ImagePlot from guiqwt.styles import HistogramParam, CurveParam from guiqwt.shapes import XRangeSelection from guiqwt.tools import SelectTool, BasePlotMenuTool, SelectPointTool, AntiAliasingTool from guiqwt.plot import PlotManager class HistDataSource(object): """ An objects that provides an Histogram data source interface to a simple numpy array of data """ __implements__ = (IHistDataSource,) def __init__(self, data): self.data = data def get_histogram(self, nbins): """Returns the histogram computed for nbins bins""" return np.histogram(self.data, nbins) assert_interfaces_valid(HistDataSource) def hist_range_threshold(hist, bin_edges, percent): hist = np.concatenate((hist, [0])) threshold = 0.5 * percent / 100 * hist.sum() i_bin_min = np.cumsum(hist).searchsorted(threshold) i_bin_max = -1 - np.cumsum(np.flipud(hist)).searchsorted(threshold) return bin_edges[i_bin_min], bin_edges[i_bin_max] def lut_range_threshold(item, bins, percent): hist, bin_edges = item.get_histogram(bins) return hist_range_threshold(hist, bin_edges, percent) class HistogramItem(CurveItem): """A Qwt item representing histogram data""" __implements__ = (IBasePlotItem,) def __init__(self, curveparam=None, histparam=None): self.hist_count = None self.hist_bins = None self.bins = None self.old_bins = None self.source = None self.logscale = None self.old_logscale = None if curveparam is None: curveparam = CurveParam(_("Curve"), icon="curve.png") curveparam.curvestyle = "Steps" if histparam is None: self.histparam = HistogramParam(title=_("Histogram"), icon="histogram.png") else: self.histparam = histparam CurveItem.__init__(self, curveparam) self.setCurveAttribute(QwtPlotCurve.Inverted) def set_hist_source(self, src): """ Set histogram source *source*: Object with method `get_histogram`, e.g. objects derived from :py:data:`guiqwt.image.ImageItem` """ self.source = weakref.ref(src) self.update_histogram() def get_hist_source(self): """ Return histogram source *source*: Object with method `get_histogram`, e.g. objects derived from :py:data:`guiqwt.image.ImageItem` """ if self.source is not None: return self.source() def set_hist_data(self, data): """Set histogram data""" self.set_hist_source(HistDataSource(data)) def set_logscale(self, state): """Sets whether we use a logarithm or linear scale for the histogram counts""" self.logscale = state self.update_histogram() def get_logscale(self): """Returns the status of the scale""" return self.logscale def set_bins(self, n_bins): self.bins = n_bins self.update_histogram() def get_bins(self): return self.bins def compute_histogram(self): return self.get_hist_source().get_histogram(self.bins) def update_histogram(self): if self.get_hist_source() is None: return hist, bin_edges = self.compute_histogram() hist = np.concatenate((hist, [0])) if self.logscale: hist = np.log(hist + 1) self.set_data(bin_edges, hist) # Autoscale only if logscale/bins have changed if self.bins != self.old_bins or self.logscale != self.old_logscale: if self.plot(): self.plot().do_autoscale() self.old_bins = self.bins self.old_logscale = self.logscale plot = self.plot() if plot is not None: plot.do_autoscale(replot=True) def update_params(self): self.histparam.update_hist(self) CurveItem.update_params(self) def get_item_parameters(self, itemparams): CurveItem.get_item_parameters(self, itemparams) itemparams.add("HistogramParam", self, self.histparam) def set_item_parameters(self, itemparams): update_dataset( self.histparam, itemparams.get("HistogramParam"), visible_only=True ) self.histparam.update_hist(self) CurveItem.set_item_parameters(self, itemparams) assert_interfaces_valid(HistogramItem) class LevelsHistogram(CurvePlot): """Image levels histogram widget""" #: Signal emitted by LevelsHistogram when LUT range was changed SIG_VOI_CHANGED = Signal() def __init__(self, parent=None): super(LevelsHistogram, self).__init__( parent=parent, title="", section="histogram" ) self.antialiased = False # a dict of dict : plot -> selected items -> HistogramItem self._tracked_items = {} self.curveparam = CurveParam(_("Curve"), icon="curve.png") self.curveparam.read_config(CONF, "histogram", "curve") self.histparam = HistogramParam(_("Histogram"), icon="histogram.png") self.histparam.logscale = False self.histparam.n_bins = 256 self.range = XRangeSelection(0, 1) self.range_mono_color = self.range.shapeparam.sel_line.color self.range_multi_color = CONF.get("histogram", "range/multi/color", "red") self.add_item(self.range, z=5) self.SIG_RANGE_CHANGED.connect(self.range_changed) self.set_active_item(self.range) self.setMinimumHeight(80) self.setAxisMaxMajor(self.Y_LEFT, 5) self.setAxisMaxMinor(self.Y_LEFT, 0) if parent is None: self.set_axis_title("bottom", "Levels") def connect_plot(self, plot): if not isinstance(plot, ImagePlot): # Connecting only to image plot widgets (allow mixing image and # curve widgets for the same plot manager -- e.g. in pyplot) return self.SIG_VOI_CHANGED.connect(plot.notify_colormap_changed) plot.SIG_ITEM_SELECTION_CHANGED.connect(self.selection_changed) plot.SIG_ITEM_REMOVED.connect(self.item_removed) plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.active_item_changed) def tracked_items_gen(self): for plot, items in list(self._tracked_items.items()): for item in list(items.items()): yield item # tuple item,curve def __del_known_items(self, known_items, items): del_curves = [] for item in list(known_items.keys()): if item not in items: curve = known_items.pop(item) del_curves.append(curve) self.del_items(del_curves) def selection_changed(self, plot): items = plot.get_selected_items(item_type=IVoiImageItemType) known_items = self._tracked_items.setdefault(plot, {}) if items: self.__del_known_items(known_items, items) if len(items) == 1: # Removing any cached item for other plots for other_plot, _items in list(self._tracked_items.items()): if other_plot is not plot: if not other_plot.get_selected_items( item_type=IVoiImageItemType ): other_known_items = self._tracked_items[other_plot] self.__del_known_items(other_known_items, []) else: # if all items are deselected we keep the last known # selection (for one plot only) for other_plot, _items in list(self._tracked_items.items()): if other_plot.get_selected_items(item_type=IVoiImageItemType): self.__del_known_items(known_items, []) break for item in items: if item not in known_items: curve = HistogramItem(self.curveparam, self.histparam) curve.set_hist_source(item) self.add_item(curve, z=0) known_items[item] = curve nb_selected = len(list(self.tracked_items_gen())) if not nb_selected: self.replot() return self.curveparam.shade = 1.0 / nb_selected for item, curve in self.tracked_items_gen(): self.curveparam.update_curve(curve) self.histparam.update_hist(curve) self.active_item_changed(plot) # Rescaling histogram plot axes for better visibility ymax = None for item in known_items: curve = known_items[item] _x, y = curve.get_data() ymax0 = y.mean() + 3 * y.std() if ymax is None or ymax0 > ymax: ymax = ymax0 ymin, _ymax = self.get_axis_limits("left") if ymax is not None: self.set_axis_limits("left", ymin, ymax) self.replot() def item_removed(self, item): for plot, items in list(self._tracked_items.items()): if item in items: curve = items.pop(item) self.del_items([curve]) self.replot() break def active_item_changed(self, plot): items = plot.get_selected_items(item_type=IVoiImageItemType) if not items: # XXX: workaround return active = plot.get_last_active_item(IVoiImageItemType) if active: active_range = active.get_lut_range() else: active_range = None multiple_ranges = False for item, curve in self.tracked_items_gen(): if active_range != item.get_lut_range(): multiple_ranges = True if active_range is not None: _m, _M = active_range self.set_range_style(multiple_ranges) self.range.set_range(_m, _M, dosignal=False) self.replot() def set_range_style(self, multiple_ranges): if multiple_ranges: self.range.shapeparam.sel_line.color = self.range_multi_color else: self.range.shapeparam.sel_line.color = self.range_mono_color self.range.shapeparam.update_range(self.range) def set_range(self, _min, _max): if _min < _max: self.set_range_style(False) self.range.set_range(_min, _max) self.replot() return True else: # Range was not changed return False def range_changed(self, _rangesel, _min, _max): for item, curve in self.tracked_items_gen(): item.set_lut_range([_min, _max]) self.SIG_VOI_CHANGED.emit() def set_full_range(self): """Set range bounds to image min/max levels""" _min = _max = None for item, curve in self.tracked_items_gen(): imin, imax = item.get_lut_range_full() if _min is None or _min > imin: _min = imin if _max is None or _max < imax: _max = imax if _min is not None: self.set_range(_min, _max) def apply_min_func(self, item, curve, min): _min, _max = item.get_lut_range() return min, _max def apply_max_func(self, item, curve, max): _min, _max = item.get_lut_range() return _min, max def reduce_range_func(self, item, curve, percent): return lut_range_threshold(item, curve.bins, percent) def apply_range_function(self, func, *args, **kwargs): item = None for item, curve in self.tracked_items_gen(): _min, _max = func(item, curve, *args, **kwargs) item.set_lut_range([_min, _max]) self.SIG_VOI_CHANGED.emit() if item is not None: self.active_item_changed(item.plot()) def eliminate_outliers(self, percent): """ Eliminate outliers: eliminate percent/2*N counts on each side of the histogram (where N is the total count number) """ self.apply_range_function(self.reduce_range_func, percent) def set_min(self, _min): self.apply_range_function(self.apply_min_func, _min) def set_max(self, _max): self.apply_range_function(self.apply_max_func, _max) class EliminateOutliersParam(DataSet): percent = FloatItem( _("Eliminate outliers") + " (%)", default=2.0, min=0.0, max=100.0 - 1e-6 ) class ContrastAdjustment(PanelWidget): """Contrast adjustment tool""" __implements__ = (IPanel,) PANEL_ID = ID_CONTRAST PANEL_TITLE = _("Contrast adjustment tool") PANEL_ICON = "contrast.png" def __init__(self, parent=None): super(ContrastAdjustment, self).__init__(parent) self.local_manager = None # local manager for the histogram plot self.manager = None # manager for the associated image plot # Storing min/max markers for each active image self.min_markers = {} self.max_markers = {} # Select point tools self.min_select_tool = None self.max_select_tool = None style = "%s" layout, _label = get_image_layout( self.PANEL_ICON, style % self.PANEL_TITLE, alignment=Qt.AlignCenter ) layout.setAlignment(Qt.AlignCenter) vlayout = QVBoxLayout() vlayout.addLayout(layout) self.local_manager = PlotManager(self) self.histogram = LevelsHistogram(parent) vlayout.addWidget(self.histogram) self.local_manager.add_plot(self.histogram) hlayout = QHBoxLayout() self.setLayout(hlayout) hlayout.addLayout(vlayout) self.toolbar = toolbar = QToolBar(self) toolbar.setOrientation(Qt.Vertical) # toolbar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) hlayout.addWidget(toolbar) # Add standard plot-related tools to the local manager lman = self.local_manager lman.add_tool(SelectTool) lman.add_tool(BasePlotMenuTool, "item") lman.add_tool(BasePlotMenuTool, "axes") lman.add_tool(BasePlotMenuTool, "grid") lman.add_tool(AntiAliasingTool) lman.get_default_tool().activate() self.outliers_param = EliminateOutliersParam(self.PANEL_TITLE) def register_panel(self, manager): """Register panel to plot manager""" self.manager = manager default_toolbar = self.manager.get_default_toolbar() self.manager.add_toolbar(self.toolbar, "contrast") self.manager.set_default_toolbar(default_toolbar) self.setup_actions() for plot in manager.get_plots(): self.histogram.connect_plot(plot) def configure_panel(self): """Configure panel""" self.min_select_tool = self.manager.add_tool( SelectPointTool, title=_("Minimum level"), on_active_item=True, mode="create", tip=_("Select minimum level on image"), toolbar_id="contrast", end_callback=self.apply_min_selection, ) self.max_select_tool = self.manager.add_tool( SelectPointTool, title=_("Maximum level"), on_active_item=True, mode="create", tip=_("Select maximum level on image"), toolbar_id="contrast", end_callback=self.apply_max_selection, ) def get_plot(self): return self.manager.get_active_plot() def closeEvent(self, event): self.hide() event.ignore() def setup_actions(self): fullrange_ac = create_action( self, _("Full range"), icon=get_icon("full_range.png"), triggered=self.histogram.set_full_range, tip=_("Scale the image's display range " "according to data range"), ) autorange_ac = create_action( self, _("Eliminate outliers"), icon=get_icon("eliminate_outliers.png"), triggered=self.eliminate_outliers, tip=_( "Eliminate levels histogram " "outliers and scale the image's " "display range accordingly" ), ) add_actions(self.toolbar, [fullrange_ac, autorange_ac]) def eliminate_outliers(self): def apply(param): self.histogram.eliminate_outliers(param.percent) if self.outliers_param.edit(self, apply=apply): apply(self.outliers_param) def apply_min_selection(self, tool): item = self.get_plot().get_last_active_item(IVoiImageItemType) point = self.min_select_tool.get_coordinates() z = item.get_data(*point) self.histogram.set_min(z) def apply_max_selection(self, tool): item = self.get_plot().get_last_active_item(IVoiImageItemType) point = self.max_select_tool.get_coordinates() z = item.get_data(*point) self.histogram.set_max(z) def set_range(self, _min, _max): """Set contrast panel's histogram range""" self.histogram.set_range(_min, _max) # Update the levels histogram in case active item data has changed: self.histogram.selection_changed(self.get_plot()) assert_interfaces_valid(ContrastAdjustment) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/image.py0000666000000000000000000031141600000000000012711 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.image ------------ The `image` module provides image-related objects and functions: * :py:class:`guiqwt.image.ImagePlot`: a 2D curve and image plotting widget, derived from :py:class:`guiqwt.curve.CurvePlot` * :py:class:`guiqwt.image.ImageItem`: simple images * :py:class:`guiqwt.image.TrImageItem`: images supporting arbitrary affine transform * :py:class:`guiqwt.image.XYImageItem`: images with non-linear X/Y axes * :py:class:`guiqwt.image.Histogram2DItem`: 2D histogram * :py:class:`guiqwt.image.ImageFilterItem`: rectangular filtering area that may be resized and moved onto the processed image * :py:func:`guiqwt.image.assemble_imageitems` * :py:func:`guiqwt.image.get_plot_source_rect` * :py:func:`guiqwt.image.get_image_from_plot` ``ImageItem``, ``TrImageItem``, ``XYImageItem``, ``Histogram2DItem`` and ``ImageFilterItem`` objects are plot items (derived from QwtPlotItem) that may be displayed on a :py:class:`guiqwt.image.ImagePlot` plotting widget. .. seealso:: Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Examples ~~~~~~~~ Create a basic image plotting widget: * before creating any widget, a `QApplication` must be instantiated (that is a `Qt` internal requirement): >>> import guidata >>> app = guidata.qapplication() * that is mostly equivalent to the following (the only difference is that the `guidata` helper function also installs the `Qt` translation corresponding to the system locale): >>> from PyQt5.QtGui import QApplication >>> app = QApplication([]) * now that a `QApplication` object exists, we may create the plotting widget: >>> from guiqwt.image import ImagePlot >>> plot = ImagePlot(title="Example") Generate random data for testing purpose: >>> import numpy as np >>> data = np.random.rand(100, 100) Create a simple image item: * from the associated plot item class (e.g. `XYImageItem` to create an image with non-linear X/Y axes): the item properties are then assigned by creating the appropriate style parameters object (e.g. :py:class:`guiqwt.styles.ImageParam`) >>> from guiqwt.curve import ImageItem >>> from guiqwt.styles import ImageParam >>> param = ImageParam() >>> param.label = 'My image' >>> image = ImageItem(param) >>> image.set_data(data) * or using the `plot item builder` (see :py:func:`guiqwt.builder.make`): >>> from guiqwt.builder import make >>> image = make.image(data, title='My image') Attach the image to the plotting widget: >>> plot.add_item(image) Display the plotting widget: >>> plot.show() >>> app.exec_() Reference ~~~~~~~~~ .. autoclass:: ImagePlot :members: :inherited-members: .. autoclass:: BaseImageItem :members: :inherited-members: .. autoclass:: RawImageItem :members: :inherited-members: .. autoclass:: ImageItem :members: :inherited-members: .. autoclass:: TrImageItem :members: :inherited-members: .. autoclass:: XYImageItem :members: :inherited-members: .. autoclass:: RGBImageItem :members: :inherited-members: .. autoclass:: MaskedImageItem :members: :inherited-members: .. autoclass:: ImageFilterItem :members: :inherited-members: .. autoclass:: XYImageFilterItem :members: :inherited-members: .. autoclass:: Histogram2DItem :members: :inherited-members: .. autofunction:: assemble_imageitems .. autofunction:: get_plot_qrect .. autofunction:: get_image_from_plot """ import sys import os import os.path as osp from math import fabs import numpy as np from qtpy.QtGui import QColor, QImage from qtpy.QtCore import QRectF, QPointF, QRect from guidata.utils import assert_interfaces_valid, update_dataset # Local imports from guiqwt.transitional import QwtPlotItem, QwtInterval from guiqwt.config import _ from guiqwt.interfaces import ( IBasePlotItem, IBaseImageItem, IHistDataSource, IImageItemType, ITrackableItemType, IColormapImageItemType, IVoiImageItemType, ISerializableType, ICSImageItemType, IExportROIImageItemType, IStatsImageItemType, ) from guiqwt.curve import CurvePlot, CurveItem, PolygonMapItem from guiqwt.colormap import FULLRANGE, get_cmap, get_cmap_name from guiqwt.styles import ( ImageParam, ImageAxesParam, TrImageParam, RGBImageParam, MaskedImageParam, XYImageParam, RawImageParam, ) from guiqwt.shapes import RectangleShape from guiqwt import io from guiqwt.geometry import translate, scale, rotate, colvector from guiqwt.baseplot import canvas_to_axes, axes_to_canvas stderr = sys.stderr try: from guiqwt.histogram2d import histogram2d, histogram2d_func from guiqwt._scaler import ( _histogram, _scale_tr, _scale_xy, _scale_rect, _scale_quads, INTERP_NEAREST, INTERP_LINEAR, INTERP_AA, ) except ImportError: print(("Module 'guiqwt.image': missing C extension"), file=sys.stderr) print( ("try running :" "python setup.py build_ext --inplace -c mingw32"), file=sys.stderr, ) raise LUT_SIZE = 1024 LUT_MAX = float(LUT_SIZE - 1) def _nanmin(data): if isinstance(data, np.ma.MaskedArray): data = data.data if data.dtype.name in ("float32", "float64", "float128"): return np.nanmin(data) else: return data.min() def _nanmax(data): if isinstance(data, np.ma.MaskedArray): data = data.data if data.dtype.name in ("float32", "float64", "float128"): return np.nanmax(data) else: return data.max() def pixelround(x, corner=None): """ Return pixel index (int) from pixel coordinate (float) corner: None (not a corner), 'TL' (top-left corner), 'BR' (bottom-right corner) """ assert corner is None or corner in ("TL", "BR") if corner is None: return np.floor(x) elif corner == "BR": return np.ceil(x) elif corner == "TL": return np.floor(x) # ============================================================================== # Base image item class # ============================================================================== class BaseImageItem(QwtPlotItem): __implements__ = ( IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType, ICSImageItemType, IStatsImageItemType, IExportROIImageItemType, ) _can_select = True _can_resize = False _can_move = False _can_rotate = False _readonly = False _private = False def __init__(self, data=None, param=None): super(BaseImageItem, self).__init__() self.bg_qcolor = QColor() self.bounds = QRectF() # BaseImageItem needs: # param.background # param.alpha_mask # param.alpha # param.colormap if param is None: param = self.get_default_param() self.imageparam = param self.selected = False self.data = None self.min = 0.0 self.max = 1.0 self.cmap_table = None self.cmap = None self.colormap_axis = None self._offscreen = np.array((1, 1), np.uint32) # Linear interpolation is the default interpolation algorithm: # it's almost as fast as 'nearest pixel' method but far smoother self.interpolate = None self.set_interpolation(INTERP_LINEAR) x1, y1 = self.bounds.left(), self.bounds.top() x2, y2 = self.bounds.right(), self.bounds.bottom() self.border_rect = RectangleShape(x1, y1, x2, y2) self.border_rect.set_style("plot", "shape/imageborder") # A, B, Background, Colormap self.lut = (1.0, 0.0, None, np.zeros((LUT_SIZE,), np.uint32)) self.set_lut_range([0.0, 255.0]) self.setItemAttribute(QwtPlotItem.AutoScale) self.setItemAttribute(QwtPlotItem.Legend, True) self._filename = None # The file this image comes from self.histogram_cache = None if data is not None: self.set_data(data) self.imageparam.update_image(self) # ---- Public API ---------------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" raise NotImplementedError def set_filename(self, fname): self._filename = fname def get_filename(self): fname = self._filename if fname is not None and not osp.isfile(fname): other_try = osp.join(os.getcwd(), osp.basename(fname)) if osp.isfile(other_try): self.set_filename(other_try) fname = other_try return fname def get_filter(self, filterobj, filterparam): """Provides a filter object over this image's content""" raise NotImplementedError def get_pixel_coordinates(self, xplot, yplot): """ Return (image) pixel coordinates Transform the plot coordinates (arbitrary plot Z-axis unit) into the image coordinates (pixel unit) Rounding is necessary to obtain array indexes from these coordinates """ return xplot, yplot def get_plot_coordinates(self, xpixel, ypixel): """ Return plot coordinates Transform the image coordinates (pixel unit) into the plot coordinates (arbitrary plot Z-axis unit) """ return xpixel, ypixel def get_closest_indexes(self, x, y, corner=None): """ Return closest image pixel indexes corner: None (not a corner), 'TL' (top-left corner), 'BR' (bottom-right corner) """ x, y = self.get_pixel_coordinates(x, y) i_max = self.data.shape[1] - 1 j_max = self.data.shape[0] - 1 if corner == "BR": i_max += 1 j_max += 1 i = max([0, min([i_max, int(pixelround(x, corner))])]) j = max([0, min([j_max, int(pixelround(y, corner))])]) return i, j def get_closest_index_rect(self, x0, y0, x1, y1): """ Return closest image rectangular pixel area index bounds Avoid returning empty rectangular area (return 1x1 pixel area instead) Handle reversed/not-reversed Y-axis orientation """ ix0, iy0 = self.get_closest_indexes(x0, y0, corner="TL") ix1, iy1 = self.get_closest_indexes(x1, y1, corner="BR") if ix0 > ix1: ix1, ix0 = ix0, ix1 if iy0 > iy1: iy1, iy0 = iy0, iy1 if ix0 == ix1: ix1 += 1 if iy0 == iy1: iy1 += 1 return ix0, iy0, ix1, iy1 def align_rectangular_shape(self, shape): """Align rectangular shape to image pixels""" ix0, iy0, ix1, iy1 = self.get_closest_index_rect(*shape.get_rect()) x0, y0 = self.get_plot_coordinates(ix0, iy0) x1, y1 = self.get_plot_coordinates(ix1, iy1) shape.set_rect(x0, y0, x1, y1) def get_closest_pixel_indexes(self, x, y): """ Return closest pixel indexes Instead of returning indexes of an image pixel like the method 'get_closest_indexes', this method returns the indexes of the closest pixel which is not necessarily on the image itself (i.e. indexes may be outside image index bounds: negative or superior than the image dimension) .. note:: This is *not* the same as retrieving the canvas pixel coordinates (which depends on the zoom level) """ x, y = self.get_pixel_coordinates(x, y) i = int(pixelround(x)) j = int(pixelround(y)) return i, j def get_x_values(self, i0, i1): return np.arange(i0, i1) def get_y_values(self, j0, j1): return np.arange(j0, j1) def get_data(self, x0, y0, x1=None, y1=None): """ Return image data Arguments: x0, y0 [, x1, y1] Return image level at coordinates (x0,y0) If x1,y1 are specified: Return image levels (np.ndarray) in rectangular area (x0,y0,x1,y1) """ i0, j0 = self.get_closest_indexes(x0, y0) if x1 is None or y1 is None: return self.data[j0, i0] else: i1, j1 = self.get_closest_indexes(x1, y1) i1 += 1 j1 += 1 return ( self.get_x_values(i0, i1), self.get_y_values(j0, j1), self.data[j0:j1, i0:i1], ) def get_closest_coordinates(self, x, y): """Return closest image pixel coordinates""" return self.get_closest_indexes(x, y) def get_coordinates_label(self, xc, yc): title = self.title().text() z = self.get_data(xc, yc) return "%s:
x = %d
y = %d
z = %g" % (title, xc, yc, z) def set_background_color(self, qcolor): # mask = np.uint32(255*self.imageparam.alpha+0.5).clip(0,255) << 24 self.bg_qcolor = qcolor a, b, _bg, cmap = self.lut if qcolor is None: self.lut = (a, b, None, cmap) else: self.lut = (a, b, np.uint32(QColor(qcolor).rgb() & 0xFFFFFF), cmap) def set_color_map(self, name_or_table): if name_or_table is self.cmap_table: # This avoids rebuilding the LUT all the time return if isinstance(name_or_table, str): table = get_cmap(name_or_table) else: table = name_or_table self.cmap_table = table self.cmap = table.colorTable(FULLRANGE) cmap_a = self.lut[3] alpha = self.imageparam.alpha alpha_mask = self.imageparam.alpha_mask for i in range(LUT_SIZE): if alpha_mask: pix_alpha = alpha * (i / float(LUT_SIZE - 1)) else: pix_alpha = alpha alpha_channel = max(min(np.uint32(255 * pix_alpha + 0.5), 255), 0) << 24 cmap_a[i] = ( np.uint32((table.rgb(FULLRANGE, i / LUT_MAX)) & 0xFFFFFF) | alpha_channel ) plot = self.plot() if plot: plot.update_colormap_axis(self) def get_color_map(self): return self.cmap_table def get_color_map_name(self): return get_cmap_name(self.get_color_map()) def set_interpolation(self, interp_mode, size=None): """ Set image interpolation mode interp_mode: INTERP_NEAREST, INTERP_LINEAR, INTERP_AA size (integer): (for anti-aliasing only) AA matrix size """ if interp_mode in (INTERP_NEAREST, INTERP_LINEAR): self.interpolate = (interp_mode,) if interp_mode == INTERP_AA: aa = np.ones((size, size), self.data.dtype) self.interpolate = (interp_mode, aa) def get_interpolation(self): """Get interpolation mode""" return self.interpolate def set_lut_range(self, lut_range): """ Set LUT transform range *lut_range* is a tuple: (min, max) """ self.min, self.max = lut_range _a, _b, bg, cmap = self.lut if self.max == self.min: self.lut = (LUT_MAX, self.min, bg, cmap) else: fmin, fmax = float(self.min), float(self.max) # avoid overflows self.lut = ( LUT_MAX / (fmax - fmin), -LUT_MAX * fmin / (fmax - fmin), bg, cmap, ) def get_lut_range(self): """Return the LUT transform range tuple: (min, max)""" return self.min, self.max def get_lut_range_full(self): """Return full dynamic range""" return _nanmin(self.data), _nanmax(self.data) def get_lut_range_max(self): """Get maximum range for this dataset""" kind = self.data.dtype.kind if kind in np.typecodes["AllFloat"]: info = np.finfo(self.data.dtype) else: info = np.iinfo(self.data.dtype) return info.min, info.max def update_border(self): """Update image border rectangle to fit image shape""" bounds = self.boundingRect().getCoords() self.border_rect.set_rect(*bounds) def draw_border(self, painter, xMap, yMap, canvasRect): """Draw image border rectangle""" self.border_rect.draw(painter, xMap, yMap, canvasRect) def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): """ Draw image with painter on canvasRect .. warning:: `src_rect` and `dst_rect` are coordinates tuples (xleft, ytop, xright, ybottom) """ dest = _scale_rect( self.data, src_rect, self._offscreen, dst_rect, self.lut, self.interpolate ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) def export_roi( self, src_rect, dst_rect, dst_image, apply_lut=False, apply_interpolation=False, original_resolution=False, ): """Export Region Of Interest to array""" if apply_lut: a, b, _bg, _cmap = self.lut else: a, b = 1.0, 0.0 interp = self.interpolate if apply_interpolation else (INTERP_NEAREST,) _scale_rect(self.data, src_rect, dst_image, dst_rect, (a, b, None), interp) # ---- QwtPlotItem API ----------------------------------------------------- def draw(self, painter, xMap, yMap, canvasRect): x1, y1, x2, y2 = canvasRect.getCoords() i1, i2 = xMap.invTransform(x1), xMap.invTransform(x2) j1, j2 = yMap.invTransform(y1), yMap.invTransform(y2) xl, yt, xr, yb = self.boundingRect().getCoords() dest = ( xMap.transform(xl), yMap.transform(yt), xMap.transform(xr) + 1, yMap.transform(yb) + 1, ) W = canvasRect.right() H = canvasRect.bottom() if self._offscreen.shape != (H, W): self._offscreen = np.empty((H, W), np.uint32) self._image = QImage(self._offscreen, W, H, QImage.Format_ARGB32) self._image.ndarray = self._offscreen self.notify_new_offscreen() self.draw_image(painter, canvasRect, (i1, j1, i2, j2), dest, xMap, yMap) self.draw_border(painter, xMap, yMap, canvasRect) def boundingRect(self): return self.bounds def notify_new_offscreen(self): # callback for those derived classes who need it pass def setVisible(self, enable): if not enable: self.unselect() # when hiding item, unselect it if enable: self.border_rect.show() else: self.border_rect.hide() QwtPlotItem.setVisible(self, enable) # ---- IBasePlotItem API ---------------------------------------------------- def types(self): return ( IImageItemType, IVoiImageItemType, IColormapImageItemType, ITrackableItemType, ICSImageItemType, IExportROIImageItemType, IStatsImageItemType, IStatsImageItemType, ) def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def select(self): """Select item""" self.selected = True self.border_rect.select() def unselect(self): """Unselect item""" self.selected = False self.border_rect.unselect() def is_empty(self): """Return True if item data is empty""" return self.data is None or self.data.size == 0 def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return self._can_select def can_resize(self): return self._can_resize def can_move(self): return self._can_move def can_rotate(self): return self._can_rotate def hit_test(self, pos): plot = self.plot() ax = self.xAxis() ay = self.yAxis() return self.border_rect.poly_hit_test(plot, ax, ay, pos) def update_item_parameters(self): pass def get_item_parameters(self, itemparams): itemparams.add("ShapeParam", self, self.border_rect.shapeparam) def set_item_parameters(self, itemparams): self.border_rect.set_item_parameters(itemparams) def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" pass def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" pass def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ pass # ---- IBaseImageItem API -------------------------------------------------- def can_setfullscale(self): return True def can_sethistogram(self): return False def get_histogram(self, nbins): """interface de IHistDataSource""" if self.data is None: return [ 0, ], [0, 1] if self.histogram_cache is None or nbins != self.histogram_cache[0].shape[0]: # from guidata.utils import tic, toc if True: # tic("histo1") res = np.histogram(self.data, nbins) # toc("histo1") else: # TODO: _histogram is faster, but caching is buggy # in this version # tic("histo2") _min = _nanmin(self.data) _max = _nanmax(self.data) if self.data.dtype in (np.float64, np.float32): bins = np.unique( np.array( np.linspace(_min, _max, nbins + 1), dtype=self.data.dtype ) ) else: bins = np.arange(_min, _max + 2, dtype=self.data.dtype) res2 = np.zeros((bins.size + 1,), np.uint32) _histogram(self.data.flatten(), bins, res2) # toc("histo2") res = res2[1:-1], bins self.histogram_cache = res else: res = self.histogram_cache return res def __process_cross_section(self, ydata, apply_lut): if apply_lut: a, b, bg, cmap = self.lut return (ydata * a + b).clip(0, LUT_MAX) else: return ydata def get_stats(self, x0, y0, x1, y1): """Return formatted string with stats on image rectangular area (output should be compatible with AnnotatedShape.get_infos)""" ix0, iy0, ix1, iy1 = self.get_closest_index_rect(x0, y0, x1, y1) data = self.data[iy0:iy1, ix0:ix1] xfmt = self.imageparam.xformat yfmt = self.imageparam.yformat zfmt = self.imageparam.zformat return "
".join( [ "%s" % self.imageparam.label, "%sx%s %s" % (self.data.shape[1], self.data.shape[0], str(self.data.dtype)), "", "%s ≤ x ≤ %s" % (xfmt % x0, xfmt % x1), "%s ≤ y ≤ %s" % (yfmt % y0, yfmt % y1), "%s ≤ z ≤ %s" % (zfmt % data.min(), zfmt % data.max()), "‹z› = " + zfmt % data.mean(), "σ(z) = " + zfmt % data.std(), ] ) def get_xsection(self, y0, apply_lut=False): """Return cross section along x-axis at y=y0""" _ix, iy = self.get_closest_indexes(0, y0) return ( self.get_x_values(0, self.data.shape[1]), self.__process_cross_section(self.data[iy, :], apply_lut), ) def get_ysection(self, x0, apply_lut=False): """Return cross section along y-axis at x=x0""" ix, _iy = self.get_closest_indexes(x0, 0) return ( self.get_y_values(0, self.data.shape[0]), self.__process_cross_section(self.data[:, ix], apply_lut), ) def get_average_xsection(self, x0, y0, x1, y1, apply_lut=False): """Return average cross section along x-axis""" ix0, iy0, ix1, iy1 = self.get_closest_index_rect(x0, y0, x1, y1) ydata = self.data[iy0:iy1, ix0:ix1].mean(axis=0) return ( self.get_x_values(ix0, ix1), self.__process_cross_section(ydata, apply_lut), ) def get_average_ysection(self, x0, y0, x1, y1, apply_lut=False): """Return average cross section along y-axis""" ix0, iy0, ix1, iy1 = self.get_closest_index_rect(x0, y0, x1, y1) ydata = self.data[iy0:iy1, ix0:ix1].mean(axis=1) return ( self.get_y_values(iy0, iy1), self.__process_cross_section(ydata, apply_lut), ) assert_interfaces_valid(BaseImageItem) # ============================================================================== # Raw Image item (image item without scale) # ============================================================================== class RawImageItem(BaseImageItem): """ Construct a simple image item * data: 2D NumPy array * param (optional): image parameters (:py:class:`guiqwt.styles.RawImageParam` instance) """ __implements__ = ( IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType, ISerializableType, ) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return RawImageParam(_("Image")) # ---- Serialization methods ----------------------------------------------- def __reduce__(self): fname = self.get_filename() if fname is None: fn_or_data = self.data else: fn_or_data = fname state = self.imageparam, self.get_lut_range(), fn_or_data, self.z() res = (self.__class__, (), state) return res def __setstate__(self, state): param, lut_range, fn_or_data, z = state self.imageparam = param if isinstance(fn_or_data, str): self.set_filename(fn_or_data) self.load_data() elif fn_or_data is not None: # should happen only with previous API self.set_data(fn_or_data) self.set_lut_range(lut_range) self.setZ(z) self.imageparam.update_image(self) def serialize(self, writer): """Serialize object to HDF5 writer""" fname = self.get_filename() load_from_fname = fname is not None data = None if load_from_fname else self.data writer.write(load_from_fname, group_name="load_from_fname") writer.write(fname, group_name="fname") writer.write(data, group_name="Zdata") writer.write(self.get_lut_range(), group_name="lut_range") writer.write(self.z(), group_name="z") self.imageparam.update_param(self) writer.write(self.imageparam, group_name="imageparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" lut_range = reader.read(group_name="lut_range") if reader.read(group_name="load_from_fname"): self.set_filename(reader.read(group_name="fname", func=reader.read_unicode)) self.load_data() else: data = reader.read(group_name="Zdata", func=reader.read_array) self.set_data(data) self.set_lut_range(lut_range) self.setZ(reader.read("z")) self.imageparam = self.get_default_param() reader.read("imageparam", instance=self.imageparam) self.imageparam.update_image(self) # ---- Public API ---------------------------------------------------------- def load_data(self, lut_range=None): """ Load data from *filename* and eventually apply specified lut_range *filename* has been set using method 'set_filename' """ data = io.imread(self.get_filename(), to_grayscale=True) self.set_data(data, lut_range=lut_range) def set_data(self, data, lut_range=None): """ Set Image item data * data: 2D NumPy array * lut_range: LUT range -- tuple (levelmin, levelmax) """ if lut_range is not None: _min, _max = lut_range else: _min, _max = _nanmin(data), _nanmax(data) self.data = data self.histogram_cache = None self.update_bounds() self.update_border() self.set_lut_range([_min, _max]) def update_bounds(self): if self.data is None: return self.bounds = QRectF(0, 0, self.data.shape[1], self.data.shape[0]) # ---- IBasePlotItem API --------------------------------------------------- def types(self): return ( IImageItemType, IVoiImageItemType, IColormapImageItemType, ITrackableItemType, ICSImageItemType, ISerializableType, IExportROIImageItemType, IStatsImageItemType, ) def update_item_parameters(self): self.imageparam.update_param(self) def get_item_parameters(self, itemparams): BaseImageItem.get_item_parameters(self, itemparams) self.update_item_parameters() itemparams.add("ImageParam", self, self.imageparam) def set_item_parameters(self, itemparams): update_dataset(self.imageparam, itemparams.get("ImageParam"), visible_only=True) self.imageparam.update_image(self) BaseImageItem.set_item_parameters(self, itemparams) # ---- IBaseImageItem API -------------------------------------------------- def can_setfullscale(self): return True def can_sethistogram(self): return True assert_interfaces_valid(RawImageItem) # ============================================================================== # Image item # ============================================================================== class ImageItem(RawImageItem): """ Construct a simple image item * data: 2D NumPy array * param (optional): image parameters (:py:class:`guiqwt.styles.ImageParam` instance) """ __implements__ = ( IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType, IExportROIImageItemType, ) def __init__(self, data=None, param=None): self.xmin = None self.xmax = None self.ymin = None self.ymax = None super(ImageItem, self).__init__(data=data, param=param) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return ImageParam(_("Image")) # ---- Serialization methods ----------------------------------------------- def __reduce__(self): fname = self.get_filename() if fname is None: fn_or_data = self.data else: fn_or_data = fname (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() state = ( self.imageparam, self.get_lut_range(), fn_or_data, self.z(), xmin, xmax, ymin, ymax, ) res = (self.__class__, (), state) return res def __setstate__(self, state): param, lut_range, fn_or_data, z, xmin, xmax, ymin, ymax = state self.set_xdata(xmin, xmax) self.set_ydata(ymin, ymax) self.imageparam = param if isinstance(fn_or_data, str): self.set_filename(fn_or_data) self.load_data() elif fn_or_data is not None: # should happen only with previous API self.set_data(fn_or_data) self.set_lut_range(lut_range) self.setZ(z) self.imageparam.update_image(self) def serialize(self, writer): """Serialize object to HDF5 writer""" super(ImageItem, self).serialize(writer) (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() writer.write(xmin, group_name="xmin") writer.write(xmax, group_name="xmax") writer.write(ymin, group_name="ymin") writer.write(ymax, group_name="ymax") def deserialize(self, reader): """Deserialize object from HDF5 reader""" super(ImageItem, self).deserialize(reader) for attr in ("xmin", "xmax", "ymin", "ymax"): # Note: do not be tempted to write the symetric code in `serialize` # because calling `get_xdata` and `get_ydata` is necessary setattr(self, attr, reader.read(attr, func=reader.read_float)) # ---- Public API ---------------------------------------------------------- def get_xdata(self): """Return (xmin, xmax)""" xmin, xmax = self.xmin, self.xmax if xmin is None: xmin = 0.0 if xmax is None: xmax = self.data.shape[1] return xmin, xmax def get_ydata(self): """Return (ymin, ymax)""" ymin, ymax = self.ymin, self.ymax if ymin is None: ymin = 0.0 if ymax is None: ymax = self.data.shape[0] return ymin, ymax def set_xdata(self, xmin=None, xmax=None): self.xmin, self.xmax = xmin, xmax def set_ydata(self, ymin=None, ymax=None): self.ymin, self.ymax = ymin, ymax def update_bounds(self): if self.data is None: return (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() self.bounds = QRectF(QPointF(xmin, ymin), QPointF(xmax, ymax)) # ---- BaseImageItem API --------------------------------------------------- def get_pixel_coordinates(self, xplot, yplot): """Return (image) pixel coordinates (from plot coordinates)""" (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() xpix = self.data.shape[1] * (xplot - xmin) / float(xmax - xmin) ypix = self.data.shape[0] * (yplot - ymin) / float(ymax - ymin) return xpix, ypix def get_plot_coordinates(self, xpixel, ypixel): """Return plot coordinates (from image pixel coordinates)""" (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() xplot = xmin + (xmax - xmin) * xpixel / float(self.data.shape[1]) yplot = ymin + (ymax - ymin) * ypixel / float(self.data.shape[0]) return xplot, yplot def get_x_values(self, i0, i1): xmin, xmax = self.get_xdata() xfunc = lambda index: xmin + (xmax - xmin) * index / float(self.data.shape[1]) return np.linspace(xfunc(i0), xfunc(i1), i1 - i0) def get_y_values(self, j0, j1): ymin, ymax = self.get_ydata() yfunc = lambda index: ymin + (ymax - ymin) * index / float(self.data.shape[0]) return np.linspace(yfunc(j0), yfunc(j1), j1 - j0) def get_closest_coordinates(self, x, y): """Return closest image pixel coordinates""" (xmin, xmax), (ymin, ymax) = self.get_xdata(), self.get_ydata() i, j = self.get_closest_indexes(x, y) xpix = np.linspace(xmin, xmax, self.data.shape[1] + 1) ypix = np.linspace(ymin, ymax, self.data.shape[0] + 1) return xpix[i], ypix[j] def _rescale_src_rect(self, src_rect): sxl, syt, sxr, syb = src_rect xl, yt, xr, yb = self.boundingRect().getCoords() H, W = self.data.shape[:2] x0 = W * (sxl - xl) / (xr - xl) x1 = W * (sxr - xl) / (xr - xl) y0 = H * (syt - yt) / (yb - yt) y1 = H * (syb - yt) / (yb - yt) return x0, y0, x1, y1 def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): if self.data is None: return src2 = self._rescale_src_rect(src_rect) dst_rect = tuple([int(i) for i in dst_rect]) dest = _scale_rect( self.data, src2, self._offscreen, dst_rect, self.lut, self.interpolate ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) def export_roi( self, src_rect, dst_rect, dst_image, apply_lut=False, apply_interpolation=False, original_resolution=False, ): """Export Region Of Interest to array""" if apply_lut: a, b, _bg, _cmap = self.lut else: a, b = 1.0, 0.0 interp = self.interpolate if apply_interpolation else (INTERP_NEAREST,) _scale_rect( self.data, self._rescale_src_rect(src_rect), dst_image, dst_rect, (a, b, None), interp, ) assert_interfaces_valid(ImageItem) # ============================================================================== # QuadGrid item # ============================================================================== class QuadGridItem(RawImageItem): """ Construct a QuadGrid image * X, Y, Z: A structured grid of quadrilaterals each quad is defined by (X[i], Y[i]), (X[i], Y[i+1]), (X[i+1], Y[i+1]), (X[i+1], Y[i]) * param (optional): image parameters (ImageParam instance) """ __implements__ = (IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType) def __init__(self, X, Y, Z, param=None): assert X is not None assert Y is not None assert Z is not None self.X = X self.Y = Y assert X.shape == Y.shape assert Z.shape == X.shape super(QuadGridItem, self).__init__(Z, param) self.set_data(Z) self.grid = 1 self.interpolate = (0, 0.5, 0.5) self.imageparam.update_image(self) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return QuadGridParam(_("Quadrilaterals")) def types(self): return ( IImageItemType, IVoiImageItemType, IColormapImageItemType, ITrackableItemType, ) def update_bounds(self): xmin = self.X.min() xmax = self.X.max() ymin = self.Y.min() ymax = self.Y.max() self.bounds = QRectF(xmin, ymin, xmax - xmin, ymax - ymin) def set_data(self, data, X=None, Y=None, lut_range=None): """ Set Image item data * data: 2D NumPy array * lut_range: LUT range -- tuple (levelmin, levelmax) """ if lut_range is not None: _min, _max = lut_range else: _min, _max = _nanmin(data), _nanmax(data) self.data = data self.histogram_cache = None if X is not None: assert Y is not None self.X = X self.Y = Y self.update_bounds() self.update_border() self.set_lut_range([_min, _max]) def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): self._offscreen[...] = np.uint32(0) dest = _scale_quads( self.X, self.Y, self.data, src_rect, self._offscreen, dst_rect, self.lut, self.interpolate, self.grid, ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) xl, yt, xr, yb = dest self._offscreen[yt:yb, xl:xr] = 0 def notify_new_offscreen(self): # we always ensure the offscreen is clean before drawing self._offscreen[...] = 0 assert_interfaces_valid(QuadGridItem) # ============================================================================== # Image with a custom linear transform # ============================================================================== class TrImageItem(RawImageItem): """ Construct a transformable image item * data: 2D NumPy array * param (optional): image parameters (:py:class:`guiqwt.styles.TrImageParam` instance) """ __implements__ = (IBasePlotItem, IBaseImageItem, IExportROIImageItemType) _can_select = True _can_resize = True _can_rotate = True _can_move = True def __init__(self, data=None, param=None): self.tr = np.eye(3, dtype=float) self.itr = np.eye(3, dtype=float) self.points = np.array([[0, 0, 2, 2], [0, 2, 2, 0], [1, 1, 1, 1]], float) super(TrImageItem, self).__init__(data, param) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return TrImageParam(_("Image")) # ---- Public API ---------------------------------------------------------- def set_transform(self, x0, y0, angle, dx=1.0, dy=1.0, hflip=False, vflip=False): self.imageparam.set_transform(x0, y0, angle, dx, dy, hflip, vflip) if self.data is None: return ni, nj = self.data.shape rot = rotate(-angle) tr1 = translate(nj / 2.0 + 0.5, ni / 2.0 + 0.5) xflip = -1.0 if hflip else 1.0 yflip = -1.0 if vflip else 1.0 sc = scale(xflip / dx, yflip / dy) tr2 = translate(-x0, -y0) self.tr = tr1 * sc * rot * tr2 self.itr = self.tr.I self.compute_bounds() def get_transform(self): return self.imageparam.get_transform() def debug_transform(self, pt): x0, y0, angle, dx, dy, _hflip, _vflip = self.get_transform() ni, nj = self.data.shape rot = rotate(-angle) tr1 = translate(ni / 2.0 + 0.5, nj / 2.0 + 0.5) sc = scale(dx, dy) tr2 = translate(-x0, -y0) p1 = tr1.I * pt p2 = rot.I * pt p3 = sc.I * pt p4 = tr2.I * pt print("src=", pt.T) print("tr1:", p1.T) print("tr1+rot:", p2.T) print("tr1+rot+sc:", p3.T) print("tr1+rot+tr2:", p4.T) def set_crop(self, left, top, right, bottom): self.imageparam.set_crop(left, top, right, bottom) def get_crop(self): return self.imageparam.get_crop() def get_crop_coordinates(self): """Return crop rectangle coordinates""" tpos = np.array(np.dot(self.itr, self.points)) xmin, ymin, _ = tpos.min(axis=1).flatten() xmax, ymax, _ = tpos.max(axis=1).flatten() left, top, right, bottom = self.imageparam.get_crop() return (xmin + left, ymin + top, xmax - right, ymax - bottom) def compute_bounds(self): x0, y0, x1, y1 = self.get_crop_coordinates() self.bounds = QRectF(QPointF(x0, y0), QPointF(x1, y1)) self.update_border() # --- RawImageItem API ----------------------------------------------------- def set_data(self, data, lut_range=None): RawImageItem.set_data(self, data, lut_range) ni, nj = self.data.shape self.points = np.array([[0, 0, nj, nj], [0, ni, ni, 0], [1, 1, 1, 1]], float) self.compute_bounds() # --- BaseImageItem API ---------------------------------------------------- def get_filter(self, filterobj, filterparam): """Provides a filter object over this image's content""" raise NotImplementedError # TODO: Implement TrImageFilterItem # return TrImageFilterItem(self, filterobj, filterparam) def get_pixel_coordinates(self, xplot, yplot): """Return (image) pixel coordinates (from plot coordinates)""" v = self.tr * colvector(xplot, yplot) xpixel, ypixel, _ = v[:, 0] return xpixel, ypixel def get_plot_coordinates(self, xpixel, ypixel): """Return plot coordinates (from image pixel coordinates)""" v0 = self.itr * colvector(xpixel, ypixel) xplot, yplot, _ = v0[:, 0].A.ravel() return xplot, yplot def get_x_values(self, i0, i1): v0 = self.itr * colvector(i0, 0) x0, _y0, _ = v0[:, 0].A.ravel() v1 = self.itr * colvector(i1, 0) x1, _y1, _ = v1[:, 0].A.ravel() return np.linspace(x0, x1, i1 - i0) def get_y_values(self, j0, j1): v0 = self.itr * colvector(0, j0) _x0, y0, _ = v0[:, 0].A.ravel() v1 = self.itr * colvector(0, j1) _x1, y1, _ = v1[:, 0].A.ravel() return np.linspace(y0, y1, j1 - j0) def get_closest_coordinates(self, x, y): """Return closest image pixel coordinates""" xi, yi = self.get_closest_indexes(x, y) v = self.itr * colvector(xi, yi) x, y, _ = v[:, 0].A.ravel() return x, y def update_border(self): tpos = np.dot(self.itr, self.points) self.border_rect.set_points(tpos.T[:, :2]) def draw_border(self, painter, xMap, yMap, canvasRect): self.border_rect.draw(painter, xMap, yMap, canvasRect) def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): W = canvasRect.width() H = canvasRect.height() if W <= 1 or H <= 1: return x0, y0, x1, y1 = src_rect cx = canvasRect.left() cy = canvasRect.top() sx = (x1 - x0) / (W - 1) sy = (y1 - y0) / (H - 1) # tr1 = tr(x0,y0)*scale(sx,sy)*tr(-cx,-cy) tr = np.matrix([[sx, 0, x0 - cx * sx], [0, sy, y0 - cy * sy], [0, 0, 1]], float) mat = self.tr * tr dst_rect = tuple([int(i) for i in dst_rect]) dest = _scale_tr( self.data, mat, self._offscreen, dst_rect, self.lut, self.interpolate ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) def export_roi( self, src_rect, dst_rect, dst_image, apply_lut=False, apply_interpolation=False, original_resolution=False, ): """Export Region Of Interest to array""" if apply_lut: a, b, _bg, _cmap = self.lut else: a, b = 1.0, 0.0 xs0, ys0, xs1, ys1 = src_rect xd0, yd0, xd1, yd1 = dst_rect if original_resolution: _t1, _t2, _t3, xscale, yscale, _t4, _t5 = self.get_transform() else: xscale, yscale = ( (xs1 - xs0) / float(xd1 - xd0), (ys1 - ys0) / float(yd1 - yd0), ) mat = self.tr * (translate(xs0, ys0) * scale(xscale, yscale)) x0, y0, x1, y1 = self.get_crop_coordinates() xd0 = max([xd0, xd0 + int((x0 - xs0) / xscale)]) yd0 = max([yd0, yd0 + int((y0 - ys0) / xscale)]) xd1 = min([xd1, xd1 + int((x1 - xs1) / xscale)]) yd1 = min([yd1, yd1 + int((y1 - ys1) / xscale)]) dst_rect = xd0, yd0, xd1, yd1 interp = self.interpolate if apply_interpolation else (INTERP_NEAREST,) _scale_tr(self.data, mat, dst_image, dst_rect, (a, b, None), interp) # ---- IBasePlotItem API --------------------------------------------------- def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" x0, y0, angle, dx, dy, hflip, vflip = self.get_transform() nx, ny = canvas_to_axes(self, pos) handles = self.itr * self.points p0 = colvector(nx, ny) # self.debug_transform(p0) center = handles.sum(axis=1) / 4 vec0 = handles[:, handle] - center vec1 = p0 - center a0 = np.arctan2(vec0[1, 0], vec0[0, 0]) a1 = np.arctan2(vec1[1, 0], vec1[0, 0]) if self.can_rotate(): # compute angles angle += a1 - a0 if self.can_resize(): # compute pixel size zoom = np.linalg.norm(vec1) / np.linalg.norm(vec0) dx = zoom * dx dy = zoom * dy self.set_transform(x0, y0, angle, dx, dy, hflip, vflip) def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" x0, y0, angle, dx, dy, hflip, vflip = self.get_transform() nx, ny = canvas_to_axes(self, new_pos) ox, oy = canvas_to_axes(self, old_pos) self.set_transform(x0 + nx - ox, y0 + ny - oy, angle, dx, dy, hflip, vflip) if self.plot(): self.plot().SIG_ITEM_MOVED.emit(self, ox, oy, nx, ny) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ x0, y0, angle, dx, dy, hflip, vflip = self.get_transform() self.set_transform(x0 + delta_x, y0 + delta_y, angle, dx, dy, hflip, vflip) assert_interfaces_valid(TrImageItem) def assemble_imageitems( items, src_qrect, destw, desth, align=None, add_images=False, apply_lut=False, apply_interpolation=False, original_resolution=False, ): """ Assemble together image items in qrect (`QRectF` object) and return resulting pixel data .. warning:: Does not support `XYImageItem` objects """ # align width to 'align' bytes if align is not None: print( "guiqwt.image.assemble_imageitems: since v2.2, " "the `align` option is ignored", file=sys.stderr, ) align = 1 # XXX: byte alignment is disabled until further notice! aligned_destw = int(align * ((int(destw) + align - 1) / align)) aligned_desth = int(desth * aligned_destw / destw) try: output = np.zeros((aligned_desth, aligned_destw), np.float32) except ValueError: raise MemoryError if not add_images: dst_image = output dst_rect = (0, 0, aligned_destw, aligned_desth) src_rect = list(src_qrect.getCoords()) # The source QRect is generally coming from a rectangle shape which is # adjusted to fit a given ROI on the image. So the rectangular area is # aligned with image pixel edges: to avoid any rounding error, we reduce # the rectangle area size by one half of a pixel, so that the area is now # aligned with the center of image pixels. pixel_width = src_qrect.width() / float(destw) pixel_height = src_qrect.height() / float(desth) src_rect[0] += 0.5 * pixel_width src_rect[1] += 0.5 * pixel_height src_rect[2] -= 0.5 * pixel_width src_rect[3] -= 0.5 * pixel_height for it in sorted(items, key=lambda obj: -obj.z()): if it.isVisible() and src_qrect.intersects(it.boundingRect()): if add_images: dst_image = np.zeros_like(output) it.export_roi( src_rect=src_rect, dst_rect=dst_rect, dst_image=dst_image, apply_lut=apply_lut, apply_interpolation=apply_interpolation, original_resolution=original_resolution, ) if add_images: output += dst_image return output def get_plot_qrect(plot, p0, p1): """ Return `QRectF` rectangle object in plot coordinates from top-left and bottom-right `QPointF` objects in canvas coordinates """ ax, ay = plot.X_BOTTOM, plot.Y_LEFT p0x, p0y = plot.invTransform(ax, p0.x()), plot.invTransform(ay, p0.y()) p1x, p1y = plot.invTransform(ax, p1.x() + 1), plot.invTransform(ay, p1.y() + 1) return QRectF(p0x, p0y, p1x - p0x, p1y - p0y) def get_items_in_rectangle(plot, p0, p1, item_type=None): """Return items which bounding rectangle intersects (p0, p1) item_type: default is `IExportROIImageItemType`""" if item_type is None: item_type = IExportROIImageItemType items = plot.get_items(item_type=item_type) src_qrect = get_plot_qrect(plot, p0, p1) return [it for it in items if src_qrect.intersects(it.boundingRect())] def compute_trimageitems_original_size(items, src_w, src_h): """Compute `TrImageItem` original size from max dx and dy""" trparams = [item.get_transform() for item in items if isinstance(item, TrImageItem)] if trparams: dx_max = max([dx for _x, _y, _angle, dx, _dy, _hf, _vf in trparams]) dy_max = max([dy for _x, _y, _angle, _dx, dy, _hf, _vf in trparams]) return src_w / dx_max, src_h / dy_max else: return src_w, src_h def get_image_from_qrect( plot, p0, p1, src_size=None, adjust_range=None, item_type=None, apply_lut=False, apply_interpolation=False, original_resolution=False, add_images=False, ): """Return image array from `QRect` area (p0 and p1 are respectively the top-left and bottom-right `QPointF` objects) adjust_range: None (return raw data, dtype=np.float32), 'original' (return data with original data type), 'normalize' (normalize range with original data type)""" assert adjust_range in (None, "normalize", "original") items = get_items_in_rectangle(plot, p0, p1, item_type=item_type) if not items: raise TypeError(_("There is no supported image item in current plot.")) if src_size is None: _src_x, _src_y, src_w, src_h = get_plot_qrect(plot, p0, p1).getRect() else: # The only benefit to pass the src_size list is to avoid any # rounding error in the transformation computed in `get_plot_qrect` src_w, src_h = src_size destw, desth = compute_trimageitems_original_size(items, src_w, src_h) data = get_image_from_plot( plot, p0, p1, destw=destw, desth=desth, apply_lut=apply_lut, add_images=add_images, apply_interpolation=apply_interpolation, original_resolution=original_resolution, ) if adjust_range is None: return data dtype = None for item in items: if dtype is None or item.data.dtype.itemsize > dtype.itemsize: dtype = item.data.dtype if adjust_range == "normalize": from guiqwt import io data = io.scale_data_to_dtype(data, dtype=dtype) else: data = np.array(data, dtype=dtype) return data def get_image_in_shape( obj, norm_range=False, item_type=None, apply_lut=False, apply_interpolation=False ): """Return image array from rectangle shape""" x0, y0, x1, y1 = obj.get_rect() (x0, x1), (y0, y1) = sorted([x0, x1]), sorted([y0, y1]) xc0, yc0 = axes_to_canvas(obj, x0, y0) xc1, yc1 = axes_to_canvas(obj, x1, y1) adjust_range = "normalize" if norm_range else "original" return get_image_from_qrect( obj.plot(), QPointF(xc0, yc0), QPointF(xc1, yc1), src_size=(x1 - x0, y1 - y0), adjust_range=adjust_range, item_type=item_type, apply_lut=apply_lut, apply_interpolation=apply_interpolation, original_resolution=True, ) def get_image_from_plot( plot, p0, p1, destw=None, desth=None, add_images=False, apply_lut=False, apply_interpolation=False, original_resolution=False, ): """ Return pixel data of a rectangular plot area (image items only) p0, p1: resp. top-left and bottom-right points (`QPointF` objects) apply_lut: apply contrast settings add_images: add superimposed images (instead of replace by the foreground) .. warning:: Support only the image items implementing the `IExportROIImageItemType` interface, i.e. this does *not* support `XYImageItem` objects """ if destw is None: destw = p1.x() - p0.x() + 1 if desth is None: desth = p1.y() - p0.y() + 1 items = plot.get_items(item_type=IExportROIImageItemType) qrect = get_plot_qrect(plot, p0, p1) return assemble_imageitems( items, qrect, destw, desth, # align=4, add_images=add_images, apply_lut=apply_lut, apply_interpolation=apply_interpolation, original_resolution=original_resolution, ) # ============================================================================== # Image with custom X, Y axes # ============================================================================== def to_bins(x): """Convert point center to point bounds""" bx = np.zeros((x.shape[0] + 1,), float) bx[1:-1] = (x[:-1] + x[1:]) / 2 bx[0] = x[0] - (x[1] - x[0]) / 2 bx[-1] = x[-1] + (x[-1] - x[-2]) / 2 return bx class XYImageItem(RawImageItem): """ Construct an image item with non-linear X/Y axes * x: 1D NumPy array, must be increasing * y: 1D NumPy array, must be increasing * data: 2D NumPy array * param (optional): image parameters (:py:class:`guiqwt.styles.XYImageParam` instance) """ __implements__ = (IBasePlotItem, IBaseImageItem, ISerializableType) def __init__(self, x=None, y=None, data=None, param=None): # if x and y are not increasing arrays, sort them and data accordingly if not np.all(np.diff(x) >= 0): x_idx = np.argsort(x) x = x[x_idx] data = data[:, x_idx] if not np.all(np.diff(y) >= 0): y_idx = np.argsort(y) y = y[y_idx] data = data[y_idx, :] super(XYImageItem, self).__init__(data, param) self.x = None self.y = None if x is not None and y is not None: self.set_xy(x, y) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return XYImageParam(_("Image")) # ---- Pickle methods ------------------------------------------------------ def __reduce__(self): fname = self.get_filename() if fname is None: fn_or_data = self.data else: fn_or_data = fname state = ( self.imageparam, self.get_lut_range(), self.x, self.y, fn_or_data, self.z(), ) res = (self.__class__, (), state) return res def __setstate__(self, state): param, lut_range, x, y, fn_or_data, z = state self.imageparam = param if isinstance(fn_or_data, str): self.set_filename(fn_or_data) self.load_data(lut_range) elif fn_or_data is not None: # should happen only with previous API self.set_data(fn_or_data, lut_range=lut_range) self.set_xy(x, y) self.setZ(z) self.imageparam.update_image(self) def serialize(self, writer): """Serialize object to HDF5 writer""" super(XYImageItem, self).serialize(writer) writer.write(self.x, group_name="Xdata") writer.write(self.y, group_name="Ydata") def deserialize(self, reader): """Deserialize object from HDF5 reader""" super(XYImageItem, self).deserialize(reader) x = reader.read(group_name="Xdata", func=reader.read_array) y = reader.read(group_name="Ydata", func=reader.read_array) self.set_xy(x, y) # ---- Public API ---------------------------------------------------------- def set_xy(self, x, y): ni, nj = self.data.shape x = np.array(x, float) y = np.array(y, float) if not np.all(np.diff(x) >= 0): raise ValueError("x must be an increasing 1D array") if not np.all(np.diff(y) >= 0): raise ValueError("y must be an increasing 1D array") if x.shape[0] == nj: self.x = to_bins(x) elif x.shape[0] == nj + 1: self.x = x else: raise IndexError("x must be a 1D array of length %d or %d" % (nj, nj + 1)) if y.shape[0] == ni: self.y = to_bins(y) elif y.shape[0] == ni + 1: self.y = y else: raise IndexError("y must be a 1D array of length %d or %d" % (ni, ni + 1)) self.bounds = QRectF( QPointF(self.x[0], self.y[0]), QPointF(self.x[-1], self.y[-1]) ) self.update_border() # --- BaseImageItem API ---------------------------------------------------- def get_filter(self, filterobj, filterparam): """Provides a filter object over this image's content""" return XYImageFilterItem(self, filterobj, filterparam) def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): xytr = (self.x, self.y, src_rect) dst_rect = tuple([int(i) for i in dst_rect]) dest = _scale_xy( self.data, xytr, self._offscreen, dst_rect, self.lut, self.interpolate ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) def get_pixel_coordinates(self, xplot, yplot): """Return (image) pixel coordinates (from plot coordinates)""" return self.x.searchsorted(xplot), self.y.searchsorted(yplot) def get_plot_coordinates(self, xpixel, ypixel): """Return plot coordinates (from image pixel coordinates)""" return self.x[int(pixelround(xpixel))], self.y[int(pixelround(ypixel))] def get_x_values(self, i0, i1): return self.x[i0:i1] def get_y_values(self, j0, j1): return self.y[j0:j1] def get_closest_coordinates(self, x, y): """Return closest image pixel coordinates""" i, j = self.get_closest_indexes(x, y) return self.x[i], self.y[j] # ---- IBasePlotItem API --------------------------------------------------- def types(self): return ( IImageItemType, IVoiImageItemType, IColormapImageItemType, ITrackableItemType, ISerializableType, ICSImageItemType, ) # ---- IBaseImageItem API -------------------------------------------------- def can_setfullscale(self): return True def can_sethistogram(self): return True assert_interfaces_valid(XYImageItem) # ============================================================================== # RGB Image with alpha channel # ============================================================================== class RGBImageItem(ImageItem): """ Construct a RGB/RGBA image item * data: NumPy array of uint8 (shape: NxMx[34] -- 3: RGB, 4: RGBA) (last dimension: 0: Red, 1: Green, 2: Blue {, 3:Alpha}) * param (optional): image parameters (:py:class:`guiqwt.styles.RGBImageParam` instance) """ __implements__ = (IBasePlotItem, IBaseImageItem, ISerializableType) def __init__(self, data=None, param=None): self.orig_data = None super(RGBImageItem, self).__init__(data, param) self.lut = None # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return RGBImageParam(_("Image")) # ---- Public API ---------------------------------------------------------- def recompute_alpha_channel(self): data = self.orig_data if self.orig_data is None: return H, W, NC = data.shape R = data[..., 0].astype(np.uint32) G = data[..., 1].astype(np.uint32) B = data[..., 2].astype(np.uint32) use_alpha = self.imageparam.alpha_mask alpha = self.imageparam.alpha if NC > 3 and use_alpha: A = data[..., 3].astype(np.uint32) else: A = np.zeros((H, W), np.uint32) A[:, :] = int(255 * alpha) self.data[:, :] = (A << 24) + (R << 16) + (G << 8) + B # --- BaseImageItem API ---------------------------------------------------- # Override lut/bg handling def set_lut_range(self, range): pass def set_background_color(self, qcolor): self.lut = None def set_color_map(self, name_or_table): self.lut = None # ---- RawImageItem API ---------------------------------------------------- def load_data(self): """ Load data from *filename* *filename* has been set using method 'set_filename' """ data = io.imread(self.get_filename(), to_grayscale=False) self.set_data(data) def set_data(self, data): H, W, NC = data.shape self.orig_data = data self.data = np.empty((H, W), np.uint32) self.recompute_alpha_channel() self.update_bounds() self.update_border() self.lut = None # ---- IBasePlotItem API --------------------------------------------------- def types(self): return (IImageItemType, ITrackableItemType, ISerializableType) # ---- IBaseImageItem API -------------------------------------------------- def can_setfullscale(self): return True def can_sethistogram(self): return False assert_interfaces_valid(RGBImageItem) # ============================================================================== # Masked Image # ============================================================================== class MaskedArea(object): """Defines masked areas for a masked image item""" def __init__(self, geometry=None, x0=None, y0=None, x1=None, y1=None, inside=None): self.geometry = geometry self.x0 = x0 self.y0 = y0 self.x1 = x1 self.y1 = y1 self.inside = inside def __eq__(self, other): return ( self.geometry == other.geometry and self.x0 == other.x0 and self.y0 == other.y0 and self.x1 == other.x1 and self.y1 == other.y1 and self.inside == other.inside ) def serialize(self, writer): """Serialize object to HDF5 writer""" for name in ("geometry", "inside", "x0", "y0", "x1", "y1"): writer.write(getattr(self, name), name) def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.geometry = reader.read("geometry") self.inside = reader.read("inside") for name in ("x0", "y0", "x1", "y1"): setattr(self, name, reader.read(name, func=reader.read_float)) class MaskedImageItem(ImageItem): """ Construct a masked image item * data: 2D NumPy array * mask (optional): 2D NumPy array * param (optional): image parameters (:py:class:`guiqwt.styles.MaskedImageParam` instance) """ __implements__ = (IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType) def __init__(self, data=None, mask=None, param=None): self.orig_data = None self._mask = mask self._mask_filename = None self._masked_areas = [] super(MaskedImageItem, self).__init__(data, param) # ---- BaseImageItem API --------------------------------------------------- def get_default_param(self): """Return instance of the default imageparam DataSet""" return MaskedImageParam(_("Image")) # ---- Pickle methods ------------------------------------------------------- def __reduce__(self): fname = self.get_filename() if fname is None: fn_or_data = self.data else: fn_or_data = fname state = ( self.imageparam, self.get_lut_range(), fn_or_data, self.z(), self.get_mask_filename(), self.get_masked_areas(), ) res = (self.__class__, (), state) return res def __setstate__(self, state): param, lut_range, fn_or_data, z, mask_fname, old_masked_areas = state if old_masked_areas and isinstance(old_masked_areas[0], MaskedArea): masked_areas = old_masked_areas else: # Compatibility with old format masked_areas = [] for geometry, x0, y0, x1, y1, inside in old_masked_areas: area = MaskedArea( geometry=geometry, x0=x0, y0=y0, x1=x1, y1=y1, inside=inside ) masked_areas.append(area) self.imageparam = param if isinstance(fn_or_data, str): self.set_filename(fn_or_data) self.load_data(lut_range) elif fn_or_data is not None: # should happen only with previous API self.set_data(fn_or_data, lut_range=lut_range) self.setZ(z) self.imageparam.update_image(self) if mask_fname is not None: self.set_mask_filename(mask_fname) self.load_mask_data() elif masked_areas and self.data is not None: self.set_masked_areas(masked_areas) self.apply_masked_areas() def serialize(self, writer): """Serialize object to HDF5 writer""" super(MaskedImageItem, self).serialize(writer) writer.write(self.get_mask_filename(), group_name="mask_fname") writer.write_object_list(self._masked_areas, "masked_areas") def deserialize(self, reader): """Deserialize object from HDF5 reader""" super(MaskedImageItem, self).deserialize(reader) mask_fname = reader.read(group_name="mask_fname", func=reader.read_unicode) masked_areas = reader.read_object_list("masked_areas", MaskedArea) if mask_fname: self.set_mask_filename(mask_fname) self.load_mask_data() elif masked_areas and self.data is not None: self.set_masked_areas(masked_areas) self.apply_masked_areas() # ---- Public API ----------------------------------------------------------- def update_mask(self): if isinstance(self.data, np.ma.MaskedArray): self.data.set_fill_value(self.imageparam.filling_value) def set_mask(self, mask): """Set image mask""" self.data.mask = mask def get_mask(self): """Return image mask""" return self.data.mask def set_mask_filename(self, fname): """ Set mask filename There are two ways for pickling mask data of `MaskedImageItem` objects: 1. using the mask filename (as for data itself) 2. using the mask areas (`MaskedAreas` instance, see set_mask_areas) When saving objects, the first method is tried and then, if no filename has been defined for mask data, the second method is used. """ self._mask_filename = fname def get_mask_filename(self): return self._mask_filename def load_mask_data(self): data = io.imread(self.get_mask_filename(), to_grayscale=True) self.set_mask(data) self._mask_changed() def set_masked_areas(self, areas): """Set masked areas (see set_mask_filename)""" self._masked_areas = areas def get_masked_areas(self): return self._masked_areas def add_masked_area(self, geometry, x0, y0, x1, y1, inside): area = MaskedArea(geometry=geometry, x0=x0, y0=y0, x1=x1, y1=y1, inside=inside) for _area in self._masked_areas: if area == _area: return self._masked_areas.append(area) def _mask_changed(self): """Emit the :py:data:`guiqwt.baseplot.BasePlot.SIG_MASK_CHANGED` signal""" plot = self.plot() if plot is not None: plot.SIG_MASK_CHANGED.emit(self) def apply_masked_areas(self): """Apply masked areas""" for area in self._masked_areas: if area.geometry == "rectangular": self.mask_rectangular_area( area.x0, area.y0, area.x1, area.y1, area.inside, trace=False, do_signal=False, ) else: self.mask_circular_area( area.x0, area.y0, area.x1, area.y1, area.inside, trace=False, do_signal=False, ) self._mask_changed() def mask_all(self): """Mask all pixels""" self.data.mask = True self._mask_changed() def unmask_all(self): """Unmask all pixels""" self.data.mask = np.ma.nomask self.set_masked_areas([]) self._mask_changed() def mask_rectangular_area( self, x0, y0, x1, y1, inside=True, trace=True, do_signal=True ): """ Mask rectangular area If inside is True (default), mask the inside of the area Otherwise, mask the outside """ ix0, iy0, ix1, iy1 = self.get_closest_index_rect(x0, y0, x1, y1) if inside: self.data[iy0:iy1, ix0:ix1] = np.ma.masked else: indexes = np.ones(self.data.shape, dtype=np.bool) indexes[iy0:iy1, ix0:ix1] = False self.data[indexes] = np.ma.masked if trace: self.add_masked_area("rectangular", x0, y0, x1, y1, inside) if do_signal: self._mask_changed() def mask_circular_area( self, x0, y0, x1, y1, inside=True, trace=True, do_signal=True ): """ Mask circular area, inside the rectangle (x0, y0, x1, y1), i.e. circle with a radius of ``.5\*(x1-x0)`` If inside is True (default), mask the inside of the area Otherwise, mask the outside """ ix0, iy0, ix1, iy1 = self.get_closest_index_rect(x0, y0, x1, y1) xc, yc = 0.5 * (x0 + x1), 0.5 * (y0 + y1) radius = 0.5 * (x1 - x0) xdata, ydata = self.get_x_values(ix0, ix1), self.get_y_values(iy0, iy1) for ix in range(ix0, ix1): for iy in range(iy0, iy1): distance = np.sqrt( (xdata[ix - ix0] - xc) ** 2 + (ydata[iy - iy0] - yc) ** 2 ) if inside: if distance <= radius: self.data[iy, ix] = np.ma.masked elif distance > radius: self.data[iy, ix] = np.ma.masked if not inside: self.mask_rectangular_area(x0, y0, x1, y1, inside, trace=False) if trace: self.add_masked_area("circular", x0, y0, x1, y1, inside) if do_signal: self._mask_changed() def is_mask_visible(self): """Return mask visibility""" return self.imageparam.show_mask def set_mask_visible(self, state): """Set mask visibility""" self.imageparam.show_mask = state plot = self.plot() if plot is not None: plot.replot() # ---- BaseImageItem API ---------------------------------------------------- def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): ImageItem.draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap) if self.data is None: return if self.is_mask_visible(): _a, _b, bg, _cmap = self.lut alpha_masked = ( np.uint32(255 * self.imageparam.alpha_masked + 0.5).clip(0, 255) << 24 ) alpha_unmasked = ( np.uint32(255 * self.imageparam.alpha_unmasked + 0.5).clip(0, 255) << 24 ) cmap = np.array( [ np.uint32(0x000000 & 0xFFFFFF) | alpha_unmasked, np.uint32(0xFFFFFF & 0xFFFFFF) | alpha_masked, ], dtype=np.uint32, ) lut = (1, 0, bg, cmap) shown_data = np.ma.getmaskarray(self.data) src2 = self._rescale_src_rect(src_rect) dst_rect = tuple([int(i) for i in dst_rect]) dest = _scale_rect( shown_data, src2, self._offscreen, dst_rect, lut, (INTERP_NEAREST,) ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) # ---- RawImageItem API ----------------------------------------------------- def set_data(self, data, lut_range=None): """ Set Image item data * data: 2D NumPy array * lut_range: LUT range -- tuple (levelmin, levelmax) """ ImageItem.set_data(self, data, lut_range) self.orig_data = data self.data = data.view(np.ma.MaskedArray) self.set_mask(self._mask) self._mask = None # removing reference to this temporary array if self.imageparam.filling_value is None: self.imageparam.filling_value = self.data.get_fill_value() # self.data.harden_mask() self.update_mask() # ============================================================================== # Image filter # ============================================================================== # TODO: Implement get_filter methods for image items other than XYImageItem! class ImageFilterItem(BaseImageItem): """ Construct a rectangular area image filter item * image: :py:class:`guiqwt.image.RawImageItem` instance * filter: function (x, y, data) --> data * param: image filter parameters (:py:class:`guiqwt.styles.ImageFilterParam` instance) """ __implements__ = (IBasePlotItem, IBaseImageItem) _can_select = True _can_resize = True _can_move = True def __init__(self, image, filter, param): self.use_source_cmap = None self.image = None # BaseImageItem constructor will try to set this # item's color map using the method 'set_color_map' super(ImageFilterItem, self).__init__(param=param) self.border_rect.set_style("plot", "shape/imagefilter") self.image = image self.filter = filter self.imagefilterparam = param self.imagefilterparam.update_imagefilter(self) # ---- Public API ----------------------------------------------------------- def set_image(self, image): """ Set the image item on which the filter will be applied * image: :py:class:`guiqwt.image.RawImageItem` instance """ self.image = image def set_filter(self, filter): """ Set the filter function * filter: function (x, y, data) --> data """ self.filter = filter # ---- QwtPlotItem API ------------------------------------------------------ def boundingRect(self): x0, y0, x1, y1 = self.border_rect.get_rect() return QRectF(x0, y0, x1 - x0, y1 - y0) # ---- IBasePlotItem API ---------------------------------------------------- def update_item_parameters(self): BaseImageItem.update_item_parameters(self) self.imagefilterparam.update_param(self) def get_item_parameters(self, itemparams): BaseImageItem.get_item_parameters(self, itemparams) self.update_item_parameters() itemparams.add("ImageFilterParam", self, self.imagefilterparam) def set_item_parameters(self, itemparams): update_dataset( self.imagefilterparam, itemparams.get("ImageFilterParam"), visible_only=True ) self.imagefilterparam.update_imagefilter(self) BaseImageItem.set_item_parameters(self, itemparams) def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" npos = canvas_to_axes(self, pos) self.border_rect.move_point_to(handle, npos) def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" old_pt = canvas_to_axes(self, old_pos) new_pt = canvas_to_axes(self, new_pos) self.border_rect.move_shape(old_pt, new_pt) if self.plot(): self.plot().SIG_ITEM_MOVED.emit(self, *(old_pt + new_pt)) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ self.border_rect.move_with_selection(delta_x, delta_y) def set_color_map(self, name_or_table): if self.use_source_cmap: if self.image is not None: self.image.set_color_map(name_or_table) else: BaseImageItem.set_color_map(self, name_or_table) def get_color_map(self): if self.use_source_cmap: return self.image.get_color_map() else: return BaseImageItem.get_color_map(self) def get_lut_range(self): if self.use_source_cmap: return self.image.get_lut_range() else: return BaseImageItem.get_lut_range(self) def set_lut_range(self, lut_range): if self.use_source_cmap: self.image.set_lut_range(lut_range) else: BaseImageItem.set_lut_range(self, lut_range) # ---- IBaseImageItem API --------------------------------------------------- def types(self): return ( IImageItemType, IVoiImageItemType, IColormapImageItemType, ITrackableItemType, ) def can_setfullscale(self): return False def can_sethistogram(self): return True class XYImageFilterItem(ImageFilterItem): """ Construct a rectangular area image filter item * image: :py:class:`guiqwt.image.XYImageItem` instance * filter: function (x, y, data) --> data * param: image filter parameters (:py:class:`guiqwt.styles.ImageFilterParam` instance) """ def __init__(self, image, filter, param): ImageFilterItem.__init__(self, image, filter, param) def set_image(self, image): """ Set the image item on which the filter will be applied * image: :py:class:`guiqwt.image.XYImageItem` instance """ ImageFilterItem.set_image(self, image) def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): bounds = self.boundingRect() filt_qrect = bounds & self.image.boundingRect() x0, y0, x1, y1 = filt_qrect.getCoords() i0, i1 = xMap.transform(x0), xMap.transform(x1) j0, j1 = yMap.transform(y0), yMap.transform(y1) dstRect = QRect(i0, j0, i1 - i0, j1 - j0) if not dstRect.intersects(canvasRect): return x, y, data = self.image.get_data(x0, y0, x1, y1) new_data = self.filter(x, y, data) self.data = new_data if self.use_source_cmap: lut = self.image.lut else: lut = self.lut dest = _scale_xy( new_data, (x, y, src_rect), self._offscreen, dstRect.getCoords(), lut, self.interpolate, ) qrect = QRectF(QPointF(dest[0], dest[1]), QPointF(dest[2], dest[3])) painter.drawImage(qrect, self._image, qrect) assert_interfaces_valid(ImageFilterItem) # ============================================================================== # 2-D Histogram # ============================================================================== class Histogram2DItem(BaseImageItem): """ Construct a 2D histogram item * X: data (1-D array) * Y: data (1-D array) * param (optional): style parameters (:py:class:`guiqwt.styles.Histogram2DParam` instance) """ __implements__ = ( IBasePlotItem, IBaseImageItem, IHistDataSource, IVoiImageItemType, ) def __init__(self, X, Y, param=None, Z=None): if param is None: param = ImageParam(_("Image")) self._z = Z # allows set_bins to super(Histogram2DItem, self).__init__(param=param) # Set by parameters self.nx_bins = 0 self.ny_bins = 0 self.logscale = None # internal use self._x = None self._y = None # Histogram parameters self.histparam = param self.histparam.update_histogram(self) self.set_lut_range([0, 10.0]) self.set_data(X, Y, Z) # ---- Public API ----------------------------------------------------------- def set_bins(self, NX, NY): """Set histogram bins""" self.nx_bins = NX self.ny_bins = NY self.data = np.zeros((self.ny_bins, self.nx_bins), float) if self._z is not None: self.data_tmp = np.zeros((self.ny_bins, self.nx_bins), float) def set_data(self, X, Y, Z=None): """Set histogram data""" self._x = X self._y = Y self._z = Z self.bounds = QRectF(QPointF(X.min(), Y.min()), QPointF(X.max(), Y.max())) self.update_border() # ---- QwtPlotItem API ------------------------------------------------------ fill_canvas = True def draw_image(self, painter, canvasRect, src_rect, dst_rect, xMap, yMap): computation = self.histparam.computation i1, j1, i2, j2 = src_rect if computation == -1 or self._z is None: self.data[:, :] = 0.0 nmax = histogram2d( self._x, self._y, i1, i2, j1, j2, self.data, self.logscale ) else: self.data_tmp[:, :] = 0.0 if computation in (2, 4): # sum, avg self.data[:, :] = 0.0 elif computation in (1, 5): # min, argmin val = np.inf self.data[:, :] = val elif computation in (0, 6): # max, argmax val = -np.inf self.data[:, :] = val elif computation == 3: self.data[:, :] = 1.0 histogram2d_func( self._x, self._y, self._z, i1, i2, j1, j2, self.data_tmp, self.data, computation, ) if computation in (0, 1, 5, 6): self.data[self.data == val] = np.nan else: self.data[self.data_tmp == 0.0] = np.nan if self.histparam.auto_lut: nmin = _nanmin(self.data) nmax = _nanmax(self.data) self.set_lut_range([nmin, nmax]) self.plot().update_colormap_axis(self) src_rect = (0, 0, self.nx_bins, self.ny_bins) drawfunc = lambda *args: BaseImageItem.draw_image(self, *args) if self.fill_canvas: x1, y1, x2, y2 = canvasRect.getCoords() drawfunc(painter, canvasRect, src_rect, (x1, y1, x2, y2), xMap, yMap) else: drawfunc(painter, canvasRect, src_rect, dst_rect, xMap, yMap) # ---- IBasePlotItem API --------------------------------------------------- def types(self): return ( IColormapImageItemType, IImageItemType, ITrackableItemType, IVoiImageItemType, IColormapImageItemType, ICSImageItemType, ) def update_item_parameters(self): BaseImageItem.update_item_parameters(self) self.histparam.update_param(self) def get_item_parameters(self, itemparams): BaseImageItem.get_item_parameters(self, itemparams) itemparams.add("Histogram2DParam", self, self.histparam) def set_item_parameters(self, itemparams): update_dataset( self.histparam, itemparams.get("Histogram2DParam"), visible_only=True ) self.histparam = itemparams.get("Histogram2DParam") self.histparam.update_histogram(self) BaseImageItem.set_item_parameters(self, itemparams) # ---- IBaseImageItem API -------------------------------------------------- def can_setfullscale(self): return True def can_sethistogram(self): return True def get_histogram(self, nbins): """interface de IHistDataSource""" if self.data is None: return [ 0, ], [0, 1] _min = _nanmin(self.data) _max = _nanmax(self.data) if self.data.dtype in (np.float64, np.float32): bins = np.unique( np.array(np.linspace(_min, _max, nbins + 1), dtype=self.data.dtype) ) else: bins = np.arange(_min, _max + 2, dtype=self.data.dtype) res2 = np.zeros((bins.size + 1,), np.uint32) _histogram(self.data.flatten(), bins, res2) # toc("histo2") res = res2[1:-1], bins return res assert_interfaces_valid(Histogram2DItem) # ============================================================================== # Image Plot Widget # ============================================================================== class ImagePlot(CurvePlot): """ Construct a 2D curve and image plotting widget (this class inherits :py:class:`guiqwt.curve.CurvePlot`) * parent: parent widget * title: plot title (string) * xlabel, ylabel, zlabel: resp. bottom, left and right axis titles (strings) * xunit, yunit, zunit: resp. bottom, left and right axis units (strings) * yreverse: reversing y-axis direction of increasing values (bool) * aspect_ratio: height to width ratio (float) * lock_aspect_ratio: locking aspect ratio (bool) """ DEFAULT_ITEM_TYPE = IImageItemType AUTOSCALE_TYPES = (CurveItem, BaseImageItem, PolygonMapItem) AXIS_CONF_OPTIONS = ("image_axis", "color_axis", "image_axis", None) def __init__( self, parent=None, title=None, xlabel=None, ylabel=None, zlabel=None, xunit=None, yunit=None, zunit=None, yreverse=True, aspect_ratio=1.0, lock_aspect_ratio=True, gridparam=None, section="plot", ): self.lock_aspect_ratio = lock_aspect_ratio if zlabel is not None: if ylabel is not None and not isinstance(ylabel, str): ylabel = ylabel[0] ylabel = (ylabel, zlabel) if zunit is not None: if yunit is not None and not isinstance(yunit, str): yunit = yunit[0] yunit = (yunit, zunit) super(ImagePlot, self).__init__( parent=parent, title=title, xlabel=xlabel, ylabel=ylabel, xunit=xunit, yunit=yunit, gridparam=gridparam, section=section, ) self.colormap_axis = self.Y_RIGHT axiswidget = self.axisWidget(self.colormap_axis) axiswidget.setColorBarEnabled(True) self.enableAxis(self.colormap_axis) self.__aspect_ratio = None self.set_axis_direction("left", yreverse) self.set_aspect_ratio(aspect_ratio, lock_aspect_ratio) self.replot() # Workaround for the empty image widget bug # ---- QwtPlot API --------------------------------------------------------- def showEvent(self, event): """Override BasePlot method""" if self.lock_aspect_ratio: self._start_autoscaled = True CurvePlot.showEvent(self, event) # ---- CurvePlot API ------------------------------------------------------- def do_zoom_view(self, dx, dy): """Reimplement CurvePlot method""" CurvePlot.do_zoom_view(self, dx, dy, lock_aspect_ratio=self.lock_aspect_ratio) def do_zoom_rect_view(self, start, end): """Reimplement CurvePlot method""" CurvePlot.do_zoom_rect_view(self, start, end) if self.lock_aspect_ratio: self.apply_aspect_ratio() # ---- Levels histogram-related API ---------------------------------------- def update_lut_range(self, _min, _max): """update the LUT scale""" # self.set_items_lut_range(_min, _max, replot=False) self.updateAxes() # ---- Image scale/aspect ratio -related API ------------------------------- def set_full_scale(self, item): if item.can_setfullscale(): bounds = item.boundingRect() self.set_plot_limits( bounds.left(), bounds.right(), bounds.top(), bounds.bottom() ) def get_current_aspect_ratio(self): """Return current aspect ratio""" dx = self.axisScaleDiv(self.X_BOTTOM).range() dy = self.axisScaleDiv(self.Y_LEFT).range() h = self.canvasMap(self.Y_LEFT).pDist() w = self.canvasMap(self.X_BOTTOM).pDist() return fabs((h * dx) / (w * dy)) def get_aspect_ratio(self): """Return aspect ratio""" return self.__aspect_ratio def set_aspect_ratio(self, ratio=None, lock=None): """Set aspect ratio""" if ratio is not None: self.__aspect_ratio = ratio if lock is not None: self.lock_aspect_ratio = lock self.apply_aspect_ratio() def apply_aspect_ratio(self, full_scale=False): if not self.isVisible(): return ymap = self.canvasMap(self.Y_LEFT) xmap = self.canvasMap(self.X_BOTTOM) h = ymap.pDist() w = xmap.pDist() dx1, dy1 = xmap.sDist(), fabs(ymap.sDist()) x0, y0 = xmap.s1(), ymap.s1() x1, y1 = xmap.s2(), ymap.s2() if y0 > y1: y0, y1 = y1, y0 if full_scale: if w == 0: return # avoid division by zero dy2 = (h * dx1) / (w * self.__aspect_ratio) fix_yaxis = dy2 > dy1 else: fix_yaxis = True if fix_yaxis: if w == 0: return # avoid division by zero dy2 = (h * dx1) / (w * self.__aspect_ratio) delta_y = 0.5 * (dy2 - dy1) y0 -= delta_y y1 += delta_y else: if h == 0: return # avoid division by zero dx2 = (w * dy1 * self.__aspect_ratio) / h delta_x = 0.5 * (dx2 - dx1) x0 -= delta_x x1 += delta_x self.set_plot_limits(x0, x1, y0, y1) # ---- LUT/colormap-related API -------------------------------------------- def notify_colormap_changed(self): """Levels histogram range has changed""" item = self.get_last_active_item(IColormapImageItemType) if item is not None: self.update_colormap_axis(item) self.replot() self.SIG_LUT_CHANGED.emit(self) def update_colormap_axis(self, item): if IColormapImageItemType not in item.types(): return zaxis = self.colormap_axis axiswidget = self.axisWidget(zaxis) self.setAxisScale(zaxis, item.min, item.max) # XXX: the colormap can't be displayed if min>max, to fix this # we should pass an inverted colormap along with _max, _min values axiswidget.setColorMap(QwtInterval(item.min, item.max), item.get_color_map()) self.updateAxes() # ---- QwtPlot API --------------------------------------------------------- def resizeEvent(self, event): """Reimplement Qt method to resize widget""" CurvePlot.resizeEvent(self, event) if self.lock_aspect_ratio: self.apply_aspect_ratio() self.replot() # ---- BasePlot API -------------------------------------------------------- def add_item(self, item, z=None, autoscale=True): """ Add a *plot item* instance to this *plot widget* * item: :py:data:`qwt.QwtPlotItem` object implementing the :py:data:`guiqwt.interfaces.IBasePlotItem` interface * z: item's z order (None -> z = max(self.get_items())+1) autoscale: True -> rescale plot to fit image bounds """ CurvePlot.add_item(self, item, z) if isinstance(item, BaseImageItem): parent = self.parent() if parent is not None: parent.setUpdatesEnabled(False) self.update_colormap_axis(item) if autoscale: self.do_autoscale() if parent is not None: parent.setUpdatesEnabled(True) def set_active_item(self, item): """Override base set_active_item to change the grid's axes according to the selected item""" old_active = self.active_item CurvePlot.set_active_item(self, item) if item is not None and old_active is not item: self.update_colormap_axis(item) def disable_unused_axes(self): """Disable unused axes""" CurvePlot.disable_unused_axes(self) self.enableAxis(self.colormap_axis) def do_autoscale(self, replot=True, axis_id=None): """Do autoscale on all axes""" CurvePlot.do_autoscale(self, replot=False, axis_id=axis_id) self.updateAxes() if self.lock_aspect_ratio: self.replot() self.apply_aspect_ratio(full_scale=True) if replot: self.replot() self.SIG_PLOT_AXIS_CHANGED.emit(self) def get_axesparam_class(self, item): """Return AxesParam dataset class associated to item's type""" if isinstance(item, BaseImageItem): return ImageAxesParam else: return CurvePlot.get_axesparam_class(self, item) def edit_axis_parameters(self, axis_id): """Edit axis parameters""" # XXX: removed the following workaround as the associated bug can't be # reproduced anymore with guiqwt 3. However, keeping the workaround # here (commented) as it could become useful eventually. # ----- # #FIXME: without the following workaround, aspect ratio is changed # # when applying axis parameters # # (see also guiqwt.styles.ItemParameters.update) # ratio = self.get_current_aspect_ratio() # ----- if axis_id != self.colormap_axis: CurvePlot.edit_axis_parameters(self, axis_id) # ----- # self.set_aspect_ratio(ratio=ratio) # self.replot() # ----- ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.0798793 guiqwt-4.0.1/guiqwt/images/0000777000000000000000000000000000000000000012514 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/arrow_down.png0000666000000000000000000000147300000000000015410 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<_PLTE g e g e c ` ^ \ Y V SQMKJCv wBvvdRwoX]O f Y dH{f e]# h g Z l br+~&l u n iLY!$$#!|&(*+)7T!}w o n.I{sr';?ut"(H1wv+N#'J!s<>#TJqi2tRNSê8EBdI@HGxbKGDHtIME!InpIDATc` 021sprq 0[XZY 188:9{xzy10KJJL +"'PPLMsNPRYpz^~A4ttQ}``oeCJ%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/arrow_up.png0000666000000000000000000000147400000000000015066 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<bPLTE i n u/z*~rrm h, et cf ]W ~*Q)w<W!y`nAujntz B}Wm.iU !,FS'x#N+vw1H("tu?;'rs{IN$ n ow}(sR+)'&!|#$$?32tRNSH@wI=qE8~QbKGDHtIME!InpIDATc` 02YXِFƜ\&f> //`kg$( 8ڻ{xBļ}\}A| ɠа()iظĤ49y̬ܼ¢E%eU5u M-m]=}C¾ ׳%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/autorefresh.png0000666000000000000000000000210700000000000015551 0ustar00PNG  IHDR(-SgAMA7 cHRMz&u0`:pQ<PLTEןqןqןqןqןqןqN{?p/f!]W ןqW ֣z]ᔥ߲̯odʃ`mlai^dZzbuIBA:副ˠޯGV3r5*j%SqʧqљiȐ\f!]W W W љiȐ\෇ƕϝӡѠʛ–⺏ݱԣyĐax>͛͜Ǚ۸ڰקϛsŒ]ܷզ}ʕcO{?@9ck,SĨؤӢŋ}yͰБԜҙјЗuonաwcZkcskïɶՅia[S?:PI|[ZȬleÂ||syoc^huƥӻ_Yc^r}ܭ{ԹϿ~߀tqȌbƘٻฎݰp/Vb8tRNSnݳn**589=_˹**ݳnʾ^bKGD+tIME!InpIDATc``dbfaeda``൲wptrvq [Y{xzy CB#" 1q I)" ` *-3HHHIC 2rE J \\UU+-+PЄ+kju |݆ƦֶN=_IL5e3g͞3w ss_xR_@@,36153a%9%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/axes.png0000666000000000000000000000134300000000000014163 0ustar00PNG  IHDR(-SgAMAOX2 cHRMz&u0`:pQ<PLTEyoe y]rVnR69?DJP\D̸DFFͺEHMQIHL®]JPTű^DͿHKT>BʼFOɰHdb_κZȳS¬KC<63tBQXQ@6#ҵ бư;KPA:˶)ؿêҳ7JIE?70(!~q y tRNS%qzTbKGD[t4tIME!InpIDATc`||(B("b*%THJI ɣ((*)hhji321tt ML9,,,ml]8\,=<}|\CB#"ѼBkF+%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/center.png0000666000000000000000000000112100000000000014475 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<sldHu%rrb+' trMpF@7%)f=f5ـ4UVQ= +Wn]%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/contrast.png0000666000000000000000000000106200000000000015056 0ustar00PNG  IHDR7gAMA|Q cHRMR@}y<s<:rghB9bUyQmFRBΌl~y'R 'bP`gn>-.rw1fŮŇG4z?d64M-Vp-Uan^LW%]ZX\4S,o^F1 |zL,%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/copytoclipboard.png0000666000000000000000000000231300000000000016416 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<sq;n7f;kHkCͣ{gueQ!X%W&Ӈ͝trr_jm_uVșp_t`tfQrLlSt]exUrCsEgUp{vKwMݎaQɐ\vEm:b-s`磝ZtCsBf.xZvPh=e~0X@$0(8$4,<"2J, ".!) .++'_PXT\QZVRQYU]S[Zѩ?A[gSNe`Л6}Yf6a`03w -^tef W\zu7lذтr-[m߱sb`wس <^vrvW7T?cW%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csapplylut.png0000666000000000000000000000167100000000000015427 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<sM ֩KAfʠd_ȍ !UƁXL$c7G6򝾛rkڛyr}y$W!ung\;-knnnMG_Tzs{rgPCu'('ٺϹ;4WHx}q^Q" ƨçLEk]pc3,(((xwLFPJ;R;kkjU tRNS(@8` p0ghHy𯲺ybKGD&Z pHYs  #utIME!InpIDATc`F&&f`aUPTRfcp98UT54YZjj uumn5/P[. `0426d`т [1[YYۨ;8:09{xzy1KGDFE320'$&%Kg/({H@RJ.:IydLJ"(Sp %tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csautoscale.png0000666000000000000000000000065200000000000015533 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTE&j{]?ɢ@@@TtRNSa.qbKGD L pHYsAtIME!Inp@IDATcac001\\ gT) dU2B\ ecgg c&0aYB%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csection.png0000666000000000000000000000112200000000000015025 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<~PLTE@@@~~ ~ } ~~| ~~~~~~~~~r~~tRNS)bKGD- pHYs$"tIME!InpIDATU D!uz}!aԝag<#"/be&>T_0\:·!b\+2~4n0iB"aZk@vcv%)I5v|y^Kߡ6%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csection_a.png0000666000000000000000000000105600000000000015333 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<lPLTE@@@|yjur_tRNS@fbKGD#*bl: pHYsAtIME!InpxIDAT]  D"UJZRm''< 7~ 9F>FN@hXΟ4E)i%2D]?D04sJu b۞_;>q|'a@%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csection_oblique.png0000666000000000000000000000167700000000000016564 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<zPLTE ir?AB=BE@@@'_?AB-XvFy8IU>k @@@uTb@@@  +Z|3Pe{w(^+Z}#4hJ;~}?uwd"G^ 2.DtRNS p: ݦ *#5,,f=L2;g^q$P}^}bKGD} pHYs$"tIME!InpIDATc`F&$pp2ppC]=|Q1q I)i D@GM]MS_"o5(4,<"22*`l 1KIJMKψ4 XXfeXAE KJm`򵳇ΤٿN "_W5|%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/csperimage.png0000666000000000000000000000063000000000000015340 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTE&@@@{ftRNSa.qbKGD L pHYsAtIME!Inp4IDATcac001L\` 040Ebf$2TCM]LʡnaR%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.0798793 guiqwt-4.0.1/guiqwt/images/curvestyles/0000777000000000000000000000000000000000000015104 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvestyles/dots.png0000666000000000000000000000056100000000000016565 0ustar00PNG  IHDRbgAMA a cHRMz&u0`:pQ< PLTEyptRNS@fbKGDf |d pHYsےِtIME!InpIDATc````dlbAS戡( !j%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvestyles/lines.png0000666000000000000000000000063400000000000016727 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTEUtRNSFyubKGDhQ pHYsv+tIME!InpAIDATc`Fc ,eBiF(Y` ,!T=X  D(h 1Vf vyO(.a%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvestyles/steps.png0000666000000000000000000000060000000000000016744 0ustar00PNG  IHDRbgAMA a cHRMz&u0`:pQ< PLTE&YtRNS@fbKGDf |d pHYsےِtIME!Inp-IDATc````b f  (``, 1Q' ~B%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvestyles/sticks.png0000666000000000000000000000066300000000000017117 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTEJeC_C_RlFbuoqtRNSbKGDo pHYsےِtIME!InpKIDATe @XF@OWtIxF9z.M cx4oG7f4m4 Og%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1640626339.095502 guiqwt-4.0.1/guiqwt/images/curvetypes/0000777000000000000000000000000000000000000014725 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvetypes/xfy.png0000666000000000000000000000107200000000000016241 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<`PLTEY77''@@@@@@tRNS 0Ph`@8LJHbKGD  pHYsےِtIME!InptIDAT] Պ Rk޲B p&dV' ̗FV:- :V 7N w -0s1y2s^y oJ9>>Xy*+Z:15Y%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/curvetypes/yfx.png0000666000000000000000000000107200000000000016241 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<]PLTE@@@@@@atRNS8h p0P`@LJHfB^bKGDr + pHYsےِtIME!InpxIDAT]0 D)ZM86ɜDiOt  у[O\*1 lSѶD&3yeB[mP,!trw,~  Ti%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/eliminate_outliers.png0000666000000000000000000000065600000000000017126 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTEWj&tRNS@fbKGDa pHYsv+tIME!InpMIDATc`dPb``d`d3@l CaR0)cq(X Ip)!PJU*!,"$ JcHJ4J%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/eraser.png0000666000000000000000000000156200000000000014507 0ustar00PNG  IHDR(-SgAMA|Q cHRMz%u0`:o_FMPLTE˽SS!%% I@=A?>6!<@@9䑑E??{{@@^^㎎||^^^^65뙑88훑[[22~~}} MMDL":tRNS~ۂ|IH|F~DGEIHFMǃbKGDn"Q pHYs  d_tIME!InpIDATc`F&fV~A!6(\UQ&.akd% 2.NNnr`NyO/oE-\J>~v*l аp596zDpdTpt&HO+"6222.^[ ,HNIMJ7` efe'˱LLsr *p>["]~%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/export.png0000666000000000000000000000212400000000000014542 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<s image/svg+xml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/hcursor.png0000666000000000000000000000061700000000000014713 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTE__ZtRNSPbKGDo pHYsltIME!Inp2IDATc`@ PI PRR@2 FG$5X# (\?7%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/hflip.png0000666000000000000000000000122400000000000014323 0ustar00PNG  IHDR(-SgAMA7 cHRMz&u0`:pQ<PLTE}|yvtߜpݛjٚfcՖ_ӕ\ZБWϞ{yurޜ䁨nܑቫjڈ߅|ܷg׀|یc`^[YC tRNS ~~!!KK ~~!!a&D9bKGDHtIME!InppIDATc` 0210 J3Ȱ!9d8 J

*/͠'(704b0615E -,ml%@ڶv N.Rzb tp %tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwareAdobe ImageReadyqe<IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/imagestats.png0000666000000000000000000000202100000000000015356 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<PLTEccccdddhfpguh}gthxfodfddccccccdffnh}kpsrmjfmdgccdefroywrhwfotxfripskzЬܝؚ؝ڟژТ~mn{~{|{|pymyeofrk{jxhtnl؄clcidocmlz{msqdndsfx͋u粽΂ÖӘ~؈ddjrtwkfrdfddfpinppnideccccdgfmhzfpemddccf,^bKGD:N pHYs[YtIME!InpIDATc``D L,l\<| B"bR2@Y9yE%eU5u1P( be  GFEZY'$&%R"S32sr@[YWoPK 455wtvuzS&L4ki@3fwϚ=uvIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/item_list.png0000666000000000000000000000125400000000000015215 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<s>>`_`)))aaa"""TTT===mmm888aaa ???XXX...---www,,,XXX~~~qqq,,,&&&jjjZZZccc---DDD HHHXXXfee___ eeeVVV~~~1f5itRNS)  uX }P , 3830nP>(>Ш()/m2%;8n;2t (lbKGDHtIME!InpIDATc`F&fV`cy/,"*&. )% +(*)A54ut!@@,HXXZAL0nkgpN.;`}@~P7 P@Xx":&6.>!1 Դ pܿi%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/curve.png0000666000000000000000000000104700000000000015471 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<ZPLTE +tRNS8h p0P`@LJH/眠bKGDq pHYs ;ttIME!InpiIDAT}OI ,+.;n@.m3i5щFNH(6k.`90JbEI8bҎLԵY,='eq8jsUK?D^&%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/errorbar.png0000666000000000000000000000064300000000000016164 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTE'%&%&*tRNS@);UbKGDaf} pHYsےِtIME!InpAIDATc```TvVd 0Q%"1Jj(( Dj2V ,;Y h伾Q%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/grid.png0000666000000000000000000000056000000000000015271 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs[YtIME!Inp?IDAT(c?( Ƈ L3T8 & g"0 FQ7P C3)%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/histogram.png0000666000000000000000000000060300000000000016337 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTEj&9V<tRNS@fbKGDaf} pHYsےِtIME!Inp%IDATc```d, %\ cA%L V *#!'D %tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/histogram2d.png0000666000000000000000000000212000000000000016561 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<%PLTE,$-LY>Jt!E|{vMxJ6} \G% Ue D FMhm SM^nL?sI7^2YzSDE0D=blU3Ĕcf5PC W5U_,#Ui! w^x7p~UVT-~]Lq첰}|Yr IZNqjL?LBLDLELJLFLKLLLL2 #;SLHLLLL,D\s5Md|LK LLVm*BYqqhtRNS% ^bKGDH pHYs  ~tIME!InpIDATc`gbF@FfV6vN.n^>~4X@$++' QQWS 5,,mlN.n^>`_I?аp@DdTtLl\|BbR2#M,v%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/items/legend.png0000666000000000000000000000106400000000000015602 0ustar00PNG  IHDR(-SgAMA|Q cHRMR@}y<s}8$#8b?x0!NXB91LJG\x&~VUQIGc{Klgѵ9ZQGr A>l*w"v9%(ll*?%C8{?'?!߁Xj*^.XC%ݣ|Th`"X "8ê\WhmN2范(+N.>a7|Nc9EpKX4o˔k ^aގ|xGJT(:5a \5;ʐ䰦-UUuhgm3 O ?S8nՒ#),&ju #7w8Vn\}n}A?G ݽ~,ٮɧ/2-7 `o &"!Zc$20YScG';DrCD8& .\ҼPW~BLxyE> ɤJʀrBLI kpfҮ䈵/Su~<1l5`/SH&KNmw>VUcMH퍺/76E:9Ԗѳ[o6^zj5;3⍵A>|ٰ~K``IˤZ8be'svcFs'85 \6V^(tbys|D_t[\(<EpDjs*)ޚS?_Y ̬?RHƞMGڱ58vvk-{˪(Mכ8dqN,Bk^>ˀyG7{G#>Xl^9MthgfTLh,XmXq6+y9 =7*wU54x*8\W*1=h@ Bm5L 2^! H}zItkґqTO"JeT?۹K[Kg7nwPcnSPLTEyyy݄wwwѣ٫yyy䥤;::bbb}}} ȼոƴwwwvvvbbbKRtRNSg\e$:(ȷS 58vF` '-/2D  bKGDaLtIME!InpIDATc`YX\60gX87OD/) ($,%  +(*E*PIPUKTOJր hjŦFkDt22 62Z*'Y6?'̲wpg0? 0߁ q Ej%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+2tEXticc:copyrightCopyright Apple Computer, Inc., 2003ٙtEXticc:descriptioniMac Calibrated4_? tEXticc:manufactureriMac Calibrated\tEXticc:modeliMac CalibratedtEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.1579995 guiqwt-4.0.1/guiqwt/images/markers/0000777000000000000000000000000000000000000014160 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/markers/cross.png0000666000000000000000000000052100000000000016015 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<tRNSv8bKGD̿tIME!Inp'IDATc` 6%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096240.0 guiqwt-4.0.1/guiqwt/images/markers/star.png0000666000000000000000000000054500000000000015643 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<tRNSv8bKGD̿tIME!Inp;IDATc` vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/markerstyles/horiz_marker.png0000666000000000000000000000051300000000000020442 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c`?>yv *<,2%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/markerstyles/vert_marker.png0000666000000000000000000000051500000000000020271 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c` g*DHǨ Qm&>%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1640626339.173625 guiqwt-4.0.1/guiqwt/images/mask/0000777000000000000000000000000000000000000013447 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/mask/mask_circle.png0000666000000000000000000000115300000000000016431 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs$"tIME!Inp9IDAT(c` 78 RufP!{Va&v2L EYJWLT[J?a]V&\8.r/؟jp6$?/J`)yyߧ[gJ l|tX^sp0C21? l~Ǐ ν2Rdf` g^Wֿ00000|ͬ1Ӆ~AaS_>!&xf̫8߉#J\ @1 _% `G(daWr%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/mask/mask_circle_outside.png0000666000000000000000000000115700000000000020171 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsAtIME!Inp=IDAT(}MNPO-V1!n=0d0 &@.Ac"DcD>;opjM;";>.oXP[ڈq =m<2]`DiUÜrl;Rr|Ե_ڲ/N/t%59Č`<2eFμ(:LO dzjj@z:]ZblP#xT߻+%I6Ņw i_0<%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/mask/mask_rectangle.png0000666000000000000000000000067500000000000017144 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c` 7 )`a`X ,p]YT?; )Umi 8r$B?Գ7)W]/M800Lg``M 7q) x8}v#(Mj%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/mask/mask_rectangle_outside.png0000666000000000000000000000067600000000000020701 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs$"tIME!InpIDAT(cĀ\3+``X(sUgOH 80FUz a3b``s]701+`.;ǵ800Lg``M Գ9P U x݀ 1 y!샘%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/mask/mask_tool.png0000666000000000000000000000063300000000000016147 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTEݺUU&ltRNS0yBbKGDo pHYs[YtIME!Inp=IDATc` 3E !%%T8rA ,, UJJ&@8 5``Lc ue%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/move.png0000666000000000000000000000052300000000000014170 0ustar00PNG  IHDR7gAMA|Q cHRMz%u0`:o_FbKGD̿ pHYs  d_tIME!InpFIDAT(c`@ 0Ic2bԈ & p4+pJC0& .`336Á`P,nӘO%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/on_curve.png0000666000000000000000000000120400000000000015037 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<PLTEGGNNtthh|x8DAw0% *tRNS8h p@XHmP0(X@ǺxϏrbKGD/#  pHYs ;ttIME!InpIDAT}@ " (! *xl"%7LJ4;b9+c0\xk3HeEE|ESN8 \oN9EGFnT`M!C/'mu1yzN !%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.2204976 guiqwt-4.0.1/guiqwt/images/patterns/0000777000000000000000000000000000000000000014354 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/bdiagpattern.png0000666000000000000000000000050500000000000017526 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!Inp)IDATc0@IT?4>&̀.΀]9 A'{X%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/crosspattern.png0000666000000000000000000000046700000000000017620 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc h205 wlyb%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense1pattern.png0000666000000000000000000000045700000000000017645 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc`09`ȚhὋ%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense2pattern.png0000666000000000000000000000046100000000000017641 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATcBj0@%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense3pattern.png0000666000000000000000000000046500000000000017646 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATcǀ A T񏀚!l_A%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense4pattern.png0000666000000000000000000000045400000000000017645 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc`G2(|'s%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense5pattern.png0000666000000000000000000000046300000000000017646 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc` !c@ >-v\%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense6pattern.png0000666000000000000000000000046700000000000017653 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc 3`@E5 AND%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/dense7pattern.png0000666000000000000000000000046400000000000017651 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc 3`QAX` r!vK%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/diagcrosspattern.png0000666000000000000000000000050400000000000020435 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!Inp(IDATch0Ђ́1Qa@28:d%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/fdiagpattern.png0000666000000000000000000000051200000000000017530 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!Inp.IDATc?`@%4?4h"(A44[lXwAw%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/horpattern.png0000666000000000000000000000046200000000000017252 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc0t`'Ar%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/nobrush.png0000666000000000000000000000045300000000000016544 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATcFn%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/solidpattern.png0000666000000000000000000000045000000000000017571 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD݊tIME!Inp IDATc` 0Ǫ%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/patterns/verpattern.png0000666000000000000000000000046000000000000017254 0ustar00PNG  IHDR:gAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATc )AuMX%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/point_selection.png0000666000000000000000000000067200000000000016425 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<0PLTE^^^UUUfL2_??? @@@.tRNS@UbKGD tIME!InpPIDATc`@B1}:z9~2Twy .ߞx{V{7`޽߽̈?+Cr#`2%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/print.png0000666000000000000000000000162100000000000014356 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<PLTEYYYccceeetttbbbppqbbbppqhhhpppÐ||}qqqtttsstttuqqqqqqYYXBCBCCCVVV\\\```VVVWWW'('nnniihQPQVUV}zzursmjkebc\YYSQQIFF/..212KHJIFHFDEEBDCAAA?@=:;(&'߽AAAlklnlnnmnomoonoCBC6tRNS]bϽ?Cz|mhx+" bKGDHtIME!InpIDATc````dbffaaec`N3( pT& @-,Jw`tttrvquswtb  aOHLJNIcOK/(,R`P,.)-+/.)VbPVQQ:5uu ŚZ^vs`C#c0061e`3&\%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/refresh.png0000666000000000000000000000170700000000000014665 0ustar00PNG  IHDR(-SgAMA7 cHRMz&u0`:pQ<PLTEWNQIOGIAncj_e[_V:~4mbh^,m'l`g\%e"e[$c ^TD=>7'f##aUMOGIAB;<5!_[^TWNQIKCD=MEF?@9:~43v.sgpdUMOGB;<5ncj_SKME3v.mb,m'l`*k&%e"e[)h$$c WN2t,,m''f##aB;@9:~4ZPSKMEh`b[yʉДѕϐˌɇĀTNɅԛΏϒ̍ʈƃ~yLG~uҘϔdže^@9:~43v.OIJEÀăƆɈvo{w^TWNQIkcÃƂVPyמҗzc]|sі͏ʊDžzleQKnfhaD=>77{2'CtRNSxҜp9pҟ{aaaaaaaaaa{ҍᷓp9px~~bKGDHtIME!InpIDATc`F&Tcs8sB\^>~< >/_`PpHhXxDd?H@ :&6.>!1)9EC(54MX!.!)% b+(*1(kh%ut!􁄁azFo_WXdm.(73 XTTVU[ZAnhljnyͧNp&i4%\%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwareAdobe ImageReadyqe<IENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1640626339.236122 guiqwt-4.0.1/guiqwt/images/scales/0000777000000000000000000000000000000000000013766 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/scales/lin_lin.png0000666000000000000000000000061300000000000016120 0ustar00PNG  IHDR00ri[gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpZIDATHcF"` Cd||L ǧ ~ \ pzi8^Ӳ746xh~0Afb]J%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/scales/lin_log.png0000666000000000000000000000062200000000000016117 0ustar00PNG  IHDR00ri[gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpaIDATHcF"` C<|,NM;O !0((|3a((|rm !F080phZj0[3t~D$%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/scales/log_lin.png0000666000000000000000000000062300000000000016120 0ustar00PNG  IHDR00ri[gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpbIDATHcF"` Cd8 c#L 06^ $@a0f_}N s/n^ al&׆~~#F0(@ n G%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/scales/log_log.png0000666000000000000000000000062700000000000016123 0ustar00PNG  IHDR00ri[gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpfIDATHcF"` Cd8 c#L 06^ $@@4Li`ͫ4@Cr ?@ߟ>'@3%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/shapes/freeform.png0000666000000000000000000000105000000000000016306 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<WPLTE'%%%%&%%&%&%&*%&#%'%&&&%Z6tRNS pD7XPJ`]@=x bKGDA pHYs4tIME!InpnIDATUK C@ L&mx}kT<o7V΂X)9B$,up[19r勘T).Bof_i :%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/shapes/gtaxes.png0000666000000000000000000000107000000000000015776 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<iPLTEٿر[tRNSp0]L&(ȱR`@vv`bKGD"]e\ pHYsv+tIME!InphIDATӕ +ZTQ͹4o2$ B pdc Aj<Z9Y+#~i^8h`t?3}J72P T%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/shapes/marker.png0000666000000000000000000000065200000000000015771 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<0PLTE-3  5tRNS@fbKGD pHYs$"tIME!Inp1IDATc`@!dfUL272W!"r^De`^ "%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096242.0 guiqwt-4.0.1/guiqwt/images/shapes/oblique_rectangle.png0000666000000000000000000000160200000000000020170 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<8PLTE/ng*_F+V5qv>E% jftRNS # M1I5tߤuشN1Զ7/f~֓5Lr ^QŶw*q},;$R!7K2bKGDg[ pHYs4tIME!InpIDATc` 021Ø,@ qq  %$edAJi*jr  1rV6 Fv`G'gW7.w! $(/::&6.H'$BJH0̽%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096246.0 guiqwt-4.0.1/guiqwt/images/shapes/point_shape.png0000666000000000000000000000055600000000000017024 0ustar00PNG  IHDRbgAMA a cHRMz&u0`:pQ< PLTEDp׮tRNSSbKGD L pHYs4tIME!InpIDATc`XC,c c%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096246.0 guiqwt-4.0.1/guiqwt/images/shapes/polyline.png0000666000000000000000000000073700000000000016347 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<9PLTE&%*%&%%&'&%%&&GjtRNSXp(@HϙbbKGD{l pHYsltIME!InpMIDATc`@ *Q,l|N.TylT˅0_ Qu%ܵH*H: %tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096246.0 guiqwt-4.0.1/guiqwt/images/shapes/rectangle.png0000666000000000000000000000065200000000000016454 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<PLTE/zZtRNSbKGDޕz pHYsltIME!Inp@IDATc`AACP66661ҒjT 4APFy!3<# AA+tR%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096248.0 guiqwt-4.0.1/guiqwt/images/shapes/segment.png0000666000000000000000000000072300000000000016151 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<9PLTE)tRNS (ȿ0pY1bKGD{l pHYs4tIME!InpCIDATc`0???3 +; ' A\@.$A6Vdypۅ1J~%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/sift.svg0000666000000000000000000003366200000000000014214 0ustar00 image/svg+xml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/snapshot.png0000666000000000000000000000247400000000000015070 0ustar00PNG  IHDR(-SgAMA a cHRMz&u0`:pQ<PLTEsdglplb___][YXA =er2Xm/V l*Qn1ZR)N3n)O+V,Y4czp:dyz{dddyxxWVVJII?>>;::766656434444766><=TTTXXXNNNrsu㚚ppp;<GKLH@4%#-bKGD-tIME!InpIDAT NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~w !"#$źǡ˵%&'()*طް+,-./0123456789:;<=>?@ABCDEFGHIJKLMwbqT%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.2829976 guiqwt-4.0.1/guiqwt/images/styles/0000777000000000000000000000000000000000000014037 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/styles/dash.png0000666000000000000000000000051500000000000015465 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsltIME!InpIDAT(c`? Ui]8H=SW%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/styles/dashdot.png0000666000000000000000000000052200000000000016172 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYsltIME!Inp!IDAT(c`??4.$UWp%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/styles/dashdotdot.png0000666000000000000000000000051400000000000016702 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c`?fhPdP%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/styles/dot.png0000666000000000000000000000051000000000000015327 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c`!?A3  :%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/styles/solid.png0000666000000000000000000000051000000000000015653 0ustar00PNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs4tIME!InpIDAT(c`?~LA+1(Z%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.30@GIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/images/trash.png0000666000000000000000000000062100000000000014342 0ustar00PNG  IHDRasRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.6cIDAT8OKD@E{=X{`LHـb̘[II݉ন/v1 r}9.i"eFaiS,miXy_%k$F;mF_'C;e0 q}8#e3s=m<@} m[̀&`QAQyi#H83H?##dY(s*(g@ jix sfvIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096250.0 guiqwt-4.0.1/guiqwt/images/vflip.png0000666000000000000000000000122200000000000014337 0ustar00PNG  IHDR(-SgAMA7 cHRMz&u0`:pQ<PLTE}}}{xuqjeb^[XVΐ}{xuqnjeי榿睸䖳⎭bՄያ߃^||[X_tRNS! ~K! ~K ~!K ~!]VbKGDHtIME!InpmIDATc`P,2|6vY9ySAQIYQUSԂ jȫh᲎_ &" (dnaiemP$,bkgOT$q IW4åv M.%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwareAdobe ImageReadyqe<IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096252.0 guiqwt-4.0.1/guiqwt/images/xcursor.png0000666000000000000000000000056700000000000014737 0ustar00PNG  IHDRbgAMA a cHRMz&u0`:pQ< PLTEܶtRNSPbKGD L pHYs4tIME!Inp IDATc`$r``ZjCS:yC%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096252.0 guiqwt-4.0.1/guiqwt/images/xrange.png0000666000000000000000000000064100000000000014507 0ustar00PNG  IHDRRgAMA a cHRMz&u0`:pQ<!PLTEoo__WtRNSPhpbKGD hV pHYsv+tIME!Inp5IDATc` ]\\C\\ @ 0@܍@" Ɩ dc\ s0_ac%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.36%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/interfaces.py0000666000000000000000000002247100000000000013752 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.interfaces ----------------- The `interfaces` module provides object interface classes for `guiqwt`. """ class IItemType(object): """Item types are used to categorized items in a broader way than objects obeying IBasePlotItem. The necessity arises from the fact that GuiQwt Items can inherit from different base classes and still provide functionalities akin to a given ItemType the types() method of an item returns a list of interfaces this item supports """ pass class ITrackableItemType(IItemType): def get_closest_coordinates(self, xc, yc): pass def get_coordinates_label(self, x, y): pass class IDecoratorItemType(IItemType): """represents a decorative item (usually not active) such as grid, or axes markers""" pass class ICurveItemType(IItemType): """A curve""" pass class IImageItemType(IItemType): """An image""" pass class IVoiImageItemType(IItemType): """An image with set_lut_range, get_lut_range""" def set_lut_range(self, lut_range): pass def get_lut_range(self): """Get the current active lut range""" return 0.0, 1.0 def get_lut_range_full(self): """Return full dynamic range""" return 10.0, 20.0 def get_lut_range_max(self): """Get maximum range for this dataset""" return 0.0, 255.0 class IColormapImageItemType(IItemType): """An image with an associated colormap""" pass class IExportROIImageItemType(IItemType): """An image with export_roi""" def export_roi( self, src_rect, dst_rect, dst_image, apply_lut=False, apply_interpolation=False, original_resolution=False, ): pass class IStatsImageItemType(IItemType): """An image supporting stats computations""" def get_stats(self, x0, y0, x1, y1): """Return formatted string with stats on image rectangular area (output should be compatible with AnnotatedShape.get_infos)""" return dict() class ICSImageItemType(IItemType): """An image supporting X/Y cross sections""" def get_xsection(self, y0, apply_lut=False): """Return cross section along x-axis at y=y0""" assert isinstance(y0, (float, int)) return np.array([]) def get_ysection(self, x0, apply_lut=False): """Return cross section along y-axis at x=x0""" assert isinstance(x0, (float, int)) return np.array([]) def get_average_xsection(self, x0, y0, x1, y1, apply_lut=False): """Return average cross section along x-axis""" return np.array([]) def get_average_ysection(self, x0, y0, x1, y1, apply_lut=False): """Return average cross section along y-axis""" return np.array([]) class IShapeItemType(IItemType): """A shape (annotation)""" pass class ISerializableType(IItemType): """An item that can be serialized""" def serialize(self, writer): """Serialize object to HDF5 writer""" pass def deserialize(self, reader): """Deserialize object from HDF5 reader""" pass # XXX: we should differentiate shapes and annotation : # an annotation is a shape but is supposed to stay on the canvas # while a shape only could be the rectangle used to select the zoom # area class IBasePlotItem(object): """ This is the interface that QwtPlotItem objects must implement to be handled by *BasePlot* widgets """ selected = False # True if this item is selected _readonly = False _private = False _can_select = True # Indicate this item can be selected _can_move = True _can_resize = True _can_rotate = True def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return self._can_select def can_resize(self): return self._can_resize def can_move(self): return self._can_move def can_rotate(self): return self._can_rotate def types(self): """Returns a group or category for this item this should be a class object inheriting from IItemType """ return (IItemType,) def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def select(self): """ Select the object and eventually change its appearance to highlight the fact that it's selected """ # should call plot.invalidate() or replot to force redraw pass def unselect(self): """ Unselect the object and eventually restore its original appearance to highlight the fact that it's not selected anymore """ # should call plot.invalidate() or replot to force redraw pass def hit_test(self, pos): """ Return a tuple with four elements: (distance, attach point, inside, other_object) distance : distance in pixels (canvas coordinates) to the closest attach point attach point: handle of the attach point inside: True if the mouse button has been clicked inside the object other_object: if not None, reference of the object which will be considered as hit instead of self """ pass def update_item_parameters(self): """ Update item parameters (dataset) from object properties """ pass def get_item_parameters(self, itemparams): """ Appends datasets to the list of DataSets describing the parameters used to customize apearance of this item """ pass def set_item_parameters(self, itemparams): """ Change the appearance of this item according to the parameter set provided params is a list of Datasets of the same types as those returned by get_item_parameters """ pass def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" pass def move_local_shape(self, old_pos, new_pos): """ Translate the shape such that old_pos becomes new_pos in canvas coordinates """ pass def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ pass class IBaseImageItem(object): """ QwtPlotItem objects handled by *ImagePlot* widgets must implement _both_ the IBasePlotItem interface and this one """ _can_setfullscale = True # Image will be set full scale when added to plot _can_sethistogram = False # A levels histogram will be bound to image def can_setfullscale(self): return self._can_setfullscale def can_sethistogram(self): return self._can_sethistogram class IHistDataSource(object): def get_histogram(self, nbins): # this raises NameError but it's here to show what this method # should return return numpy.histogram(data, nbins) class IPlotManager(object): """A 'controller' that organizes relations between plots (BasePlot), panels, tools (GuiTool) and toolbar """ def add_plot(self, plot, plot_id="default"): assert id not in self.plots assert isinstance(plot, BasePlot) def add_panel(self, panel): assert id not in self.panels def add_toolbar(self, toolbar, toolbar_id="default"): assert id not in self.toolbars def get_active_plot(self): """The active plot is the plot whose canvas has the focus otherwise it's the "default" plot """ pass class IPanel(object): """Interface for panels controlled by PlotManager""" @staticmethod def __inherits__(): from guiqwt.panels import PanelWidget return PanelWidget def register_panel(self, manager): """Register panel to plot manager""" pass def configure_panel(self): """Configure panel""" pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625310.0 guiqwt-4.0.1/guiqwt/io.py0000666000000000000000000005306100000000000012235 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.io --------- The `io` module provides input/output helper functions: * :py:func:`guiqwt.io.imread`: load an image (.png, .tiff, .dicom, etc.) and return its data as a NumPy array * :py:func:`guiqwt.io.imwrite`: save an array to an image file * :py:func:`guiqwt.io.load_items`: load plot items from HDF5 * :py:func:`guiqwt.io.save_items`: save plot items to HDF5 Reference ~~~~~~~~~ .. autofunction:: imread .. autofunction:: imwrite .. autofunction:: load_items .. autofunction:: save_items """ import sys import re import os.path as osp import numpy as np # Local imports from guiqwt.config import _ def scale_data_to_dtype(data, dtype): """Scale array `data` to fit datatype `dtype` dynamic range WARNING: modifies data in place""" info = np.iinfo(dtype) dmin = data.min() dmax = data.max() data -= dmin data *= float(info.max - info.min) / (dmax - dmin) data += float(info.min) return np.array(data, dtype) def eliminate_outliers(data, percent=2.0, bins=256): """Eliminate data histogram outliers""" hist, bin_edges = np.histogram(data, bins) from guiqwt.histogram import hist_range_threshold vmin, vmax = hist_range_threshold(hist, bin_edges, percent) return data.clip(vmin, vmax) # =============================================================================== # I/O File type definitions # =============================================================================== class FileType(object): """Filetype object: * `name` : description of filetype, * `read_func`, `write_func` : I/O callbacks, * `extensions`: filename extensions (with a dot!) or filenames, (list, tuple or space-separated string) * `data_types`: supported data types""" def __init__( self, name, extensions, read_func=None, write_func=None, data_types=None, requires_template=False, ): self.name = name if isinstance(extensions, str): extensions = extensions.split() self.extensions = [osp.splitext(" " + ext)[1] for ext in extensions] self.read_func = read_func self.write_func = write_func self.data_types = data_types self.requires_template = requires_template def matches(self, action, dtype, template): """Return True if file type matches passed data type and template (or if dtype is None)""" assert action in ("load", "save") matches = dtype is None or self.data_types is None or dtype in self.data_types if action == "save" and self.requires_template: matches = matches and template is not None return matches @property def wcards(self): return "*" + (" *".join(self.extensions)) def filters(self, action, dtype, template): assert action in ("load", "save") if self.matches(action, dtype, template): return "\n%s (%s)" % (self.name, self.wcards) else: return "" class ImageIOHandler(object): """I/O handler: regroup all FileType objects""" def __init__(self): self.filetypes = [] def allfilters(self, action, dtype, template): wcards = " ".join( [ ftype.wcards for ftype in self.filetypes if ftype.matches(action, dtype, template) ] ) return "%s (%s)" % (_("All supported files"), wcards) def get_filters(self, action, dtype=None, template=None): """Return file type filters for `action` (string: 'save' or 'load'), `dtype` data type (None: all data types), and `template` (True if save function requires a template (e.g. DICOM files), False otherwise)""" filters = self.allfilters(action, dtype, template) for ftype in self.filetypes: filters += ftype.filters(action, dtype, template) return filters def add( self, name, extensions, read_func=None, write_func=None, import_func=None, data_types=None, requires_template=None, ): if import_func is not None: try: import_func() except ImportError: return assert read_func is not None or write_func is not None ftype = FileType( name, extensions, read_func=read_func, write_func=write_func, data_types=data_types, requires_template=requires_template, ) self.filetypes.append(ftype) def _get_filetype(self, ext): """Return FileType object associated to file extension `ext`""" for ftype in self.filetypes: if ext.lower() in ftype.extensions: return ftype else: raise RuntimeError("Unsupported file type: '%s'" % ext) def get_readfunc(self, ext): """Return read function associated to file extension `ext`""" ftype = self._get_filetype(ext) if ftype.read_func is None: raise RuntimeError("Unsupported file type (read): '%s'" % ext) else: return ftype.read_func def get_writefunc(self, ext): """Return read function associated to file extension `ext`""" ftype = self._get_filetype(ext) if ftype.write_func is None: raise RuntimeError("Unsupported file type (write): '%s'" % ext) else: return ftype.write_func iohandler = ImageIOHandler() # ============================================================================== # tifffile-based Private I/O functions # ============================================================================== def _imread_tiff(filename): """Open a TIFF image and return a NumPy array""" try: import tifffile return tifffile.imread(filename) except ImportError: return _imread_pil(filename) def _imwrite_tiff(filename, arr): """Save a NumPy array to a TIFF file""" try: import tifffile return tifffile.imwrite(filename, arr) except ImportError: return _imwrite_pil(filename, arr) # ============================================================================== # PIL-based Private I/O functions # ============================================================================== if sys.byteorder == "little": _ENDIAN = "<" else: _ENDIAN = ">" DTYPES = { "1": ("|b1", None), "L": ("|u1", None), "I": ("%si4" % _ENDIAN, None), "F": ("%sf4" % _ENDIAN, None), "I;16": ("%su2" % _ENDIAN, None), "I;16B": ("%su2" % _ENDIAN, None), "I;16S": ("%si2" % _ENDIAN, None), "P": ("|u1", None), "RGB": ("|u1", 3), "RGBX": ("|u1", 4), "RGBA": ("|u1", 4), "CMYK": ("|u1", 4), "YCbCr": ("|u1", 4), } def _imread_pil(filename, to_grayscale=False): """Open image with PIL and return a NumPy array""" import PIL.Image import PIL.TiffImagePlugin # py2exe PIL.TiffImagePlugin.OPEN_INFO[(PIL.TiffImagePlugin.II, 0, 1, 1, (16,), ())] = ( "I;16", "I;16", ) img = PIL.Image.open(filename) if img.mode in ("CMYK", "YCbCr"): # Converting to RGB img = img.convert("RGB") if to_grayscale and img.mode in ("RGB", "RGBA", "RGBX"): # Converting to grayscale img = img.convert("L") elif "A" in img.mode or (img.mode == "P" and "transparency" in img.info): img = img.convert("RGBA") elif img.mode == "P": img = img.convert("RGB") try: dtype, extra = DTYPES[img.mode] except KeyError: raise RuntimeError("%s mode is not supported" % img.mode) shape = (img.size[1], img.size[0]) if extra is not None: shape += (extra,) try: return np.array(img, dtype=np.dtype(dtype)).reshape(shape) except SystemError: return np.array(img.getdata(), dtype=np.dtype(dtype)).reshape(shape) def _imwrite_pil(filename, arr): """Write `arr` NumPy array to `filename` using PIL""" import PIL.Image import PIL.TiffImagePlugin # py2exe for mode, (dtype_str, extra) in list(DTYPES.items()): if dtype_str == arr.dtype.str: if extra is None: # mode for grayscale images if len(arr.shape[2:]) > 0: continue # not suitable for RGB(A) images else: break # this is it! else: # mode for RGB(A) images if len(arr.shape[2:]) == 0: continue # not suitable for grayscale images elif arr.shape[-1] == extra: break # this is it! else: raise RuntimeError("Cannot determine PIL data type") img = PIL.Image.fromarray(arr, mode) img.save(filename) # ============================================================================== # DICOM Private I/O functions # ============================================================================== def _import_dcm(): """DICOM Import function (checking for required libraries): DICOM support requires library `pydicom`""" import logging logger = logging.getLogger("pydicom") logger.setLevel(logging.CRITICAL) try: # pydicom 1.0 from pydicom import dicomio # analysis:ignore except ImportError: # pydicom 0.9 import dicom as dicomio # analysis:ignore logger.setLevel(logging.WARNING) def _imread_dcm(filename): """Open DICOM image with pydicom and return a NumPy array""" try: # pydicom 1.0 from pydicom import dicomio except ImportError: # pydicom 0.9 import dicom as dicomio dcm = dicomio.read_file(filename, force=True) # ********************************************************************** # The following is necessary until pydicom numpy support is improved: # (after that, a simple: 'arr = dcm.PixelArray' will work the same) format_str = "%sint%s" % (("u", "")[dcm.PixelRepresentation], dcm.BitsAllocated) try: dtype = np.dtype(format_str) except TypeError: raise TypeError( "Data type not understood by NumPy: " "PixelRepresentation=%d, BitsAllocated=%d" % (dcm.PixelRepresentation, dcm.BitsAllocated) ) arr = np.fromstring(dcm.PixelData, dtype) try: # pydicom 0.9.3: dcm_is_little_endian = dcm.isLittleEndian except AttributeError: # pydicom 0.9.4: dcm_is_little_endian = dcm.is_little_endian if dcm_is_little_endian != (sys.byteorder == "little"): arr.byteswap(True) if hasattr(dcm, "NumberofFrames") and dcm.NumberofFrames > 1: if dcm.SamplesperPixel > 1: arr = arr.reshape( dcm.SamplesperPixel, dcm.NumberofFrames, dcm.Rows, dcm.Columns ) else: arr = arr.reshape(dcm.NumberofFrames, dcm.Rows, dcm.Columns) else: if dcm.SamplesperPixel > 1: if dcm.BitsAllocated == 8: arr = arr.reshape(dcm.SamplesperPixel, dcm.Rows, dcm.Columns) else: raise NotImplementedError( "This code only handles " "SamplesPerPixel > 1 if Bits Allocated = 8" ) else: arr = arr.reshape(dcm.Rows, dcm.Columns) # ********************************************************************** return arr def _imwrite_dcm(filename, arr, template=None): """Save a numpy array `arr` into a DICOM image file `filename` based on DICOM structure `template`""" # Note: due to IOHandler formalism, `template` has to be a keyword argument assert template is not None, ( "The `template` keyword argument is required to save DICOM files\n" "(that is the template DICOM structure object)" ) infos = np.iinfo(arr.dtype) template.BitsAllocated = infos.bits template.BitsStored = infos.bits template.HighBit = infos.bits - 1 template.PixelRepresentation = ("u", "i").index(infos.kind) data_vr = ("US", "SS")[template.PixelRepresentation] template.Rows = arr.shape[0] template.Columns = arr.shape[1] template.SmallestImagePixelValue = int(arr.min()) template[0x00280106].VR = data_vr template.LargestImagePixelValue = int(arr.max()) template[0x00280107].VR = data_vr if not template.PhotometricInterpretation.startswith("MONOCHROME"): template.PhotometricInterpretation = "MONOCHROME1" template.PixelData = arr.tostring() template[0x7FE00010].VR = "OB" template.save_as(filename) # ============================================================================== # Text files Private I/O functions # ============================================================================== def _imread_txt(filename): """Open text file image and return a NumPy array""" for delimiter in ("\t", ",", " ", ";"): try: return np.loadtxt(filename, delimiter=delimiter) except ValueError: continue else: raise def _imwrite_txt(filename, arr): """Write `arr` NumPy array to text file `filename`""" if arr.dtype in (np.int8, np.uint8, np.int16, np.uint16, np.int32, np.uint32): fmt = "%d" else: fmt = "%.18e" ext = osp.splitext(filename)[1] if ext.lower() in (".txt", ".asc", ""): np.savetxt(filename, arr, fmt=fmt) elif ext.lower() == ".csv": np.savetxt(filename, arr, fmt=fmt, delimiter=",") # ============================================================================== # Registering I/O functions # ============================================================================== iohandler.add( _("PNG files"), "*.png", read_func=_imread_pil, write_func=_imwrite_pil, data_types=(np.uint8, np.uint16), ) iohandler.add( _("TIFF files"), "*.tif *.tiff", read_func=_imread_tiff, write_func=_imwrite_tiff ) iohandler.add( _("8-bit images"), "*.jpg *.gif", read_func=_imread_pil, write_func=_imwrite_pil, data_types=(np.uint8,), ) iohandler.add(_("NumPy arrays"), "*.npy", read_func=np.load, write_func=np.save) iohandler.add( _("Text files"), "*.txt *.csv *.asc", read_func=_imread_txt, write_func=_imwrite_txt ) iohandler.add( _("DICOM files"), "*.dcm", read_func=_imread_dcm, write_func=_imwrite_dcm, import_func=_import_dcm, data_types=(np.int8, np.uint8, np.int16, np.uint16), requires_template=True, ) # ============================================================================== # Generic image read/write functions # ============================================================================== def imread(fname, ext=None, to_grayscale=False): """Return a NumPy array from an image filename `fname`. If `to_grayscale` is True, convert RGB images to grayscale The `ext` (optional) argument is a string that specifies the file extension which defines the input format: when not specified, the input format is guessed from filename.""" if ext is None: _base, ext = osp.splitext(fname) arr = iohandler.get_readfunc(ext)(fname) if to_grayscale and arr.ndim == 3: # Converting to grayscale return arr[..., :4].mean(axis=2) else: return arr def imwrite(fname, arr, ext=None, dtype=None, max_range=None, **kwargs): """Save a NumPy array to an image filename `fname`. If `to_grayscale` is True, convert RGB images to grayscale The `ext` (optional) argument is a string that specifies the file extension which defines the input format: when not specified, the input format is guessed from filename. If `max_range` is True, array data is scaled to fit the `dtype` (or data type itself if `dtype` is None) dynamic range Warning: option `max_range` changes data in place""" if ext is None: _base, ext = osp.splitext(fname) if max_range: arr = scale_data_to_dtype(arr, arr.dtype if dtype is None else dtype) iohandler.get_writefunc(ext)(fname, arr, **kwargs) # ============================================================================== # Deprecated functions # ============================================================================== def imagefile_to_array(filename, to_grayscale=False): """ Return a NumPy array from an image file `filename` If `to_grayscale` is True, convert RGB images to grayscale """ print("io.imagefile_to_array is deprecated: use io.imread instead", file=sys.stderr) return imread(filename, to_grayscale=to_grayscale) def array_to_imagefile(arr, filename, mode=None, max_range=False): """ Save a numpy array `arr` into an image file `filename` Warning: option 'max_range' changes data in place """ print( "io.array_to_imagefile is deprecated: use io.imwrite instead", file=sys.stderr ) return imwrite(filename, arr, mode=mode, max_range=max_range) # ============================================================================== # guiqwt plot items I/O # ============================================================================== SERIALIZABLE_ITEMS = [] ITEM_MODULES = {} def register_serializable_items(modname, classnames): """Register serializable item from module name and class name""" global SERIALIZABLE_ITEMS, ITEM_MODULES SERIALIZABLE_ITEMS += classnames ITEM_MODULES[modname] = ITEM_MODULES.setdefault(modname, []) + classnames # Curves register_serializable_items( "guiqwt.curve", ["CurveItem", "PolygonMapItem", "ErrorBarCurveItem"] ) # Images register_serializable_items( "guiqwt.image", [ "RawImageItem", "ImageItem", "TrImageItem", "XYImageItem", "RGBImageItem", "MaskedImageItem", ], ) # Shapes register_serializable_items( "guiqwt.shapes", [ "PolygonShape", "PointShape", "SegmentShape", "RectangleShape", "ObliqueRectangleShape", "EllipseShape", "Axes", ], ) # Annotations register_serializable_items( "guiqwt.annotations", [ "AnnotatedPoint", "AnnotatedSegment", "AnnotatedRectangle", "AnnotatedObliqueRectangle", "AnnotatedEllipse", "AnnotatedCircle", ], ) # Labels register_serializable_items( "guiqwt.label", ["LabelItem", "LegendBoxItem", "SelectedLegendBoxItem"] ) def item_class_from_name(name): """Return plot item class from class name""" global SERIALIZABLE_ITEMS, ITEM_MODULES assert name in SERIALIZABLE_ITEMS, "Unknown class %r" % name for modname, names in list(ITEM_MODULES.items()): if name in names: return getattr(__import__(modname, fromlist=[name]), name) def item_name_from_object(obj): """Return plot item class name from instance""" return obj.__class__.__name__ def save_item(writer, group_name, item): """Save plot item to HDF5 group""" with writer.group(group_name): if item is None: writer.write_none() else: item.serialize(writer) with writer.group("item_class_name"): writer.write_str(item_name_from_object(item)) def load_item(reader, group_name): """Load plot item from HDF5 group""" with reader.group(group_name): with reader.group("item_class_name"): try: klass_name = reader.read_str() except ValueError: # None was saved instead of a real item return klass = item_class_from_name(klass_name) item = klass() item.deserialize(reader) return item def save_items(writer, items): """Save items to HDF5 file: * writer: :py:class:`guidata.hdf5io.HDF5Writer` object * items: serializable plot items""" counts = {} names = [] def _get_name(item): basename = item_name_from_object(item) count = counts[basename] = counts.setdefault(basename, 0) + 1 name = "%s_%03d" % (basename, count) names.append(name.encode("utf-8")) return name for item in items: with writer.group(_get_name(item)): item.serialize(writer) with writer.group("plot_items"): writer.write_sequence(names) def load_items(reader): """Load items from HDF5 file: * reader: :py:class:`guidata.hdf5io.HDF5Reader` object""" with reader.group("plot_items"): names = reader.read_sequence() items = [] for name in names: try: name_str = name.decode() except AttributeError: name_str = name klass_name = re.match(r"([A-Z]+[A-Za-z0-9\_]*)\_([0-9]*)", name_str).groups()[0] klass = item_class_from_name(klass_name) item = klass() with reader.group(name): item.deserialize(reader) items.append(item) return items if __name__ == "__main__": # Test if items can all be constructed from their Python module for name in SERIALIZABLE_ITEMS: print(name, "-->", item_class_from_name(name)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/label.py0000666000000000000000000004712300000000000012707 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.label ------------ The `labels` module provides plot items related to labels and legends: * :py:class:`guiqwt.shapes.LabelItem` * :py:class:`guiqwt.shapes.LegendBoxItem` * :py:class:`guiqwt.shapes.SelectedLegendBoxItem` * :py:class:`guiqwt.shapes.RangeComputation` * :py:class:`guiqwt.shapes.RangeComputation2d` * :py:class:`guiqwt.shapes.DataInfoLabel` A label or a legend is a plot item (derived from QwtPlotItem) that may be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`. Reference ~~~~~~~~~ .. autoclass:: LabelItem :members: :inherited-members: .. autoclass:: LegendBoxItem :members: :inherited-members: .. autoclass:: SelectedLegendBoxItem :members: :inherited-members: .. autoclass:: RangeComputation :members: :inherited-members: .. autoclass:: RangeComputation2d :members: :inherited-members: .. autoclass:: DataInfoLabel :members: :inherited-members: """ from qtpy.QtGui import QPen, QColor, QTextDocument from qtpy.QtCore import QRectF, QPointF from guidata.utils import assert_interfaces_valid, update_dataset # Local imports from guiqwt.transitional import QwtPlotItem from guiqwt.config import CONF, _ from guiqwt.curve import CurveItem from guiqwt.interfaces import IBasePlotItem, IShapeItemType, ISerializableType from guiqwt.styles import LabelParam ANCHORS = { "TL": lambda r: (r.left(), r.top()), "TR": lambda r: (r.right(), r.top()), "BL": lambda r: (r.left(), r.bottom()), "BR": lambda r: (r.right(), r.bottom()), "L": lambda r: (r.left(), (r.top() + r.bottom()) / 2.0), "R": lambda r: (r.right(), (r.top() + r.bottom()) / 2.0), "T": lambda r: ((r.left() + r.right()) / 2.0, r.top()), "B": lambda r: ((r.left() + r.right()) / 2.0, r.bottom()), "C": lambda r: ((r.left() + r.right()) / 2.0, (r.top() + r.bottom()) / 2.0), } class AbstractLabelItem(QwtPlotItem): """Draws a label on the canvas at position : G+C where G is a point in plot coordinates and C a point in canvas coordinates. G can also be an anchor string as in ANCHORS in which case the label will keep a fixed position wrt the canvas rect """ _readonly = False _private = False def __init__(self, labelparam=None): super(AbstractLabelItem, self).__init__() self.selected = False self.anchor = None self.G = None self.C = None self.border_pen = None self.bg_brush = None if labelparam is None: self.labelparam = LabelParam(_("Label"), icon="label.png") else: self.labelparam = labelparam self.labelparam.update_label(self) def set_style(self, section, option): self.labelparam.read_config(CONF, section, option) self.labelparam.update_label(self) def __reduce__(self): return (self.__class__, (self.labelparam,)) def serialize(self, writer): """Serialize object to HDF5 writer""" self.labelparam.update_param(self) writer.write(self.labelparam, group_name="labelparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.labelparam = LabelParam(_("Label"), icon="label.png") reader.read("labelparam", instance=self.labelparam) self.labelparam.update_label(self) def get_text_rect(self): return QRectF(0.0, 0.0, 10.0, 10.0) def types(self): return (IShapeItemType,) def set_text_style(self, font=None, color=None): raise NotImplementedError def get_top_left(self, xMap, yMap, canvasRect): x0, y0 = self.get_origin(xMap, yMap, canvasRect) x0 += self.C[0] y0 += self.C[1] rect = self.get_text_rect() pos = ANCHORS[self.anchor](rect) x0 -= pos[0] y0 -= pos[1] return x0, y0 def get_origin(self, xMap, yMap, canvasRect): if self.G in ANCHORS: return ANCHORS[self.G](canvasRect) else: x0 = xMap.transform(self.G[0]) y0 = yMap.transform(self.G[1]) return x0, y0 def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return True def can_resize(self): return False def can_move(self): return True def can_rotate(self): return False # TODO: Implement labels rotation? def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def invalidate_plot(self): plot = self.plot() if plot: plot.invalidate() def select(self): """Select item""" if self.selected: # Already selected return self.selected = True w = self.border_pen.width() self.border_pen.setWidth(w + 1) self.invalidate_plot() def unselect(self): """Unselect item""" self.selected = False self.labelparam.update_label(self) self.invalidate_plot() def hit_test(self, pos): plot = self.plot() if plot is None: return rect = self.get_text_rect() canvasRect = plot.canvas().contentsRect() xMap = plot.canvasMap(self.xAxis()) yMap = plot.canvasMap(self.yAxis()) x, y = self.get_top_left(xMap, yMap, canvasRect) rct = QRectF(x, y, rect.width(), rect.height()) inside = rct.contains(pos.x(), pos.y()) if inside: return self.click_inside(pos.x() - x, pos.y() - y) else: return 1000.0, None, False, None def click_inside(self, locx, locy): return 2.0, 1, True, None def update_item_parameters(self): self.labelparam.update_param(self) def get_item_parameters(self, itemparams): self.update_item_parameters() itemparams.add("LabelParam", self, self.labelparam) def set_item_parameters(self, itemparams): update_dataset(self.labelparam, itemparams.get("LabelParam"), visible_only=True) self.labelparam.update_label(self) if self.selected: self.select() def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" if handle != -1: return def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" if self.G in ANCHORS or not self.labelparam.move_anchor: # Move canvas offset lx, ly = self.C lx += new_pos.x() - old_pos.x() ly += new_pos.y() - old_pos.y() self.C = lx, ly self.labelparam.xc, self.labelparam.yc = lx, ly else: # Move anchor plot = self.plot() if plot is None: return lx0, ly0 = self.G cx = plot.transform(self.xAxis(), lx0) cy = plot.transform(self.yAxis(), ly0) cx += new_pos.x() - old_pos.x() cy += new_pos.y() - old_pos.y() lx1 = plot.invTransform(self.xAxis(), cx) ly1 = plot.invTransform(self.yAxis(), cy) self.G = lx1, ly1 self.labelparam.xg, self.labelparam.yg = lx1, ly1 plot.SIG_ITEM_MOVED.emit(self, lx0, ly0, lx1, ly1) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ if self.G in ANCHORS or not self.labelparam.move_anchor: return lx0, ly0 = self.G lx1, ly1 = lx0 + delta_x, ly0 + delta_y self.G = lx1, ly1 self.labelparam.xg, self.labelparam.yg = lx1, ly1 def draw_frame(self, painter, x, y, w, h): if self.labelparam.bgalpha > 0.0: painter.fillRect(x, y, w, h, self.bg_brush) if self.border_pen.width() > 0: painter.setPen(self.border_pen) painter.drawRect(x, y, w, h) class LabelItem(AbstractLabelItem): __implements__ = (IBasePlotItem, ISerializableType) def __init__(self, text=None, labelparam=None): self.text_string = "" if text is None else text self.text = QTextDocument() super(LabelItem, self).__init__(labelparam) def __reduce__(self): return (self.__class__, (self.text_string, self.labelparam)) def serialize(self, writer): """Serialize object to HDF5 writer""" super(LabelItem, self).serialize(writer) writer.write(self.text_string, group_name="text") def deserialize(self, reader): """Deserialize object from HDF5 reader""" super(LabelItem, self).deserialize(reader) self.set_text(reader.read("text", func=reader.read_unicode)) def types(self): return (IShapeItemType, ISerializableType) def set_pos(self, x, y): self.G = x, y self.labelparam.xg, self.labelparam.yg = x, y def get_plain_text(self): return self.text.toPlainText() def set_text(self, text=None): if text is not None: self.text_string = text self.text.setHtml("

" % self.text_string) def set_text_style(self, font=None, color=None): if font is not None: self.text.setDefaultFont(font) if color is not None: self.text.setDefaultStyleSheet("div { color: %s; }" % color) self.set_text() def get_text_rect(self): sz = self.text.size() return QRectF(0, 0, sz.width(), sz.height()) def update_text(self): pass def draw(self, painter, xMap, yMap, canvasRect): self.update_text() x, y = self.get_top_left(xMap, yMap, canvasRect) x0, y0 = self.get_origin(xMap, yMap, canvasRect) painter.save() self.marker.drawSymbols(painter, [QPointF(x0, y0)]) painter.restore() sz = self.text.size() self.draw_frame(painter, x, y, sz.width(), sz.height()) painter.setPen(QPen(QColor(self.labelparam.color))) painter.translate(x, y) self.text.drawContents(painter) assert_interfaces_valid(LabelItem) LEGEND_WIDTH = 30 # Length of the sample line LEGEND_SPACEH = 5 # Spacing between border, sample, text, border LEGEND_SPACEV = 3 # Vertical space between items class LegendBoxItem(AbstractLabelItem): __implements__ = (IBasePlotItem, ISerializableType) def __init__(self, labelparam=None): self.font = None self.color = None super(LegendBoxItem, self).__init__(labelparam) # saves the last computed sizes self.sizes = 0.0, 0.0, 0.0, 0.0 def types(self): return (IShapeItemType, ISerializableType) def get_legend_items(self): plot = self.plot() if plot is None: return [] text_items = [] for item in plot.get_items(): if not isinstance(item, CurveItem) or not self.include_item(item): continue text = QTextDocument() text.setDefaultFont(self.font) text.setDefaultStyleSheet("div { color: %s; }" % self.color) text.setHtml("
%s
" % item.curveparam.label) text_items.append((text, item.pen(), item.brush(), item.symbol())) return text_items def include_item(self, item): return item.isVisible() def get_legend_size(self, items): width = 0 height = 0 for text, _, _, _ in items: sz = text.size() if sz.width() > width: width = sz.width() if sz.height() > height: height = sz.height() TW = LEGEND_SPACEH * 3 + LEGEND_WIDTH + width TH = len(items) * (height + LEGEND_SPACEV) + LEGEND_SPACEV self.sizes = TW, TH, width, height return self.sizes def set_text_style(self, font=None, color=None): if font is not None: self.font = font if color is not None: self.color = color def get_text_rect(self): items = self.get_legend_items() TW, TH, _width, _height = self.get_legend_size(items) return QRectF(0.0, 0.0, TW, TH) def draw(self, painter, xMap, yMap, canvasRect): items = self.get_legend_items() TW, TH, _width, height = self.get_legend_size(items) x, y = self.get_top_left(xMap, yMap, canvasRect) self.draw_frame(painter, x, y, TW, TH) y0 = y + LEGEND_SPACEV x0 = x + LEGEND_SPACEH for text, ipen, ibrush, isymbol in items: isymbol.drawSymbols( painter, [QPointF(x0 + LEGEND_WIDTH / 2, y0 + height / 2)] ) painter.save() painter.setPen(ipen) painter.setBrush(ibrush) painter.drawLine(x0, y0 + height / 2, x0 + LEGEND_WIDTH, y0 + height / 2) x1 = x0 + LEGEND_SPACEH + LEGEND_WIDTH painter.translate(x1, y0) text.drawContents(painter) painter.restore() y0 += height + LEGEND_SPACEV def click_inside(self, lx, ly): # hit_test already called get_text_rect for us... _TW, _TH, _width, height = self.sizes line = (ly - LEGEND_SPACEV) / (height + LEGEND_SPACEV) line = int(line) if LEGEND_SPACEH <= lx <= (LEGEND_WIDTH + LEGEND_SPACEH): # We hit a legend line, select the corresponding curve # and do as if we weren't hit... items = [ item for item in self.plot().get_items() if self.include_item(item) and isinstance(item, CurveItem) ] if line < len(items): return 1000.0, None, False, items[line] return 2.0, 1, True, None def update_item_parameters(self): self.labelparam.update_param(self) def get_item_parameters(self, itemparams): self.update_item_parameters() itemparams.add("LegendParam", self, self.labelparam) def set_item_parameters(self, itemparams): update_dataset( self.labelparam, itemparams.get("LegendParam"), visible_only=True ) self.labelparam.update_label(self) if self.selected: self.select() assert_interfaces_valid(LegendBoxItem) class SelectedLegendBoxItem(LegendBoxItem): def __init__(self, dataset=None, itemlist=None): super(SelectedLegendBoxItem, self).__init__(dataset) self.itemlist = [] if itemlist is None else itemlist def __reduce__(self): # XXX filter itemlist for picklabel items return (self.__class__, (self.labelparam, [])) def include_item(self, item): return LegendBoxItem.include_item(self, item) and item in self.itemlist def add_item(self, item): self.itemlist.append(item) class ObjectInfo(object): def get_text(self): return "" class RangeInfo(ObjectInfo): """ObjectInfo handling XRangeSelection shape informations: x, dx label: formatted string xrangeselection: XRangeSelection object function: input arguments are x, dx ; returns objects used to format the label. Default function is `lambda x, dx: (x, dx)`. Example: ------- x = linspace(-10, 10, 10) y = sin(sin(sin(x))) xrangeselection = make.range(-2, 2) RangeInfo(u"x = %.1f ± %.1f cm", xrangeselection, lambda x, dx: (x, dx)) disp = make.info_label('BL', comp, title="titre") """ def __init__(self, label, xrangeselection, function=None): self.label = str(label) self.range = xrangeselection if function is None: function = lambda x, dx: (x, dx) self.func = function def get_text(self): x0, x1 = self.range.get_range() x = 0.5 * (x0 + x1) dx = 0.5 * (x1 - x0) return self.label % self.func(x, dx) class RangeComputation(ObjectInfo): """ObjectInfo showing curve computations relative to a XRangeSelection shape. label: formatted string curve: CurveItem object xrangeselection: XRangeSelection object function: input arguments are x, y arrays (extraction of arrays corresponding to the xrangeselection X-axis range)""" def __init__(self, label, curve, xrangeselection, function=None): self.label = str(label) self.curve = curve self.range = xrangeselection if function is None: function = lambda x, dx: (x, dx) self.func = function def set_curve(self, curve): self.curve = curve def get_text(self): x0, x1 = self.range.get_range() data = self.curve.get_data() X = data[0] i0 = X.searchsorted(x0) i1 = X.searchsorted(x1) if i0 > i1: i0, i1 = i1, i0 vectors = [] for vector in data: if vector is None: vectors.append(None) elif i0 == i1: import numpy as np vectors.append(np.array([np.NaN])) else: vectors.append(vector[i0:i1]) return self.label % self.func(*vectors) class RangeComputation2d(ObjectInfo): def __init__(self, label, image, rect, function): self.label = str(label) self.image = image self.rect = rect self.func = function def get_text(self): x0, y0, x1, y1 = self.rect.get_rect() x, y, z = self.image.get_data(x0, y0, x1, y1) res = self.func(x, y, z) return self.label % res class DataInfoLabel(LabelItem): __implements__ = (IBasePlotItem,) def __init__(self, labelparam=None, infos=None): super(DataInfoLabel, self).__init__(None, labelparam) if isinstance(infos, ObjectInfo): infos = [infos] self.infos = infos def __reduce__(self): return (self.__class__, (self.labelparam, self.infos)) def types(self): return (IShapeItemType,) def update_text(self): title = self.labelparam.label if title: text = ["%s" % title] else: text = [] for info in self.infos: text.append(info.get_text()) self.set_text("
".join(text)) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.2829976 guiqwt-4.0.1/guiqwt/locale/0000777000000000000000000000000000000000000012506 5ustar00././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.6423938 guiqwt-4.0.1/guiqwt/locale/fr/0000777000000000000000000000000000000000000013115 5ustar00././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.2829976 guiqwt-4.0.1/guiqwt/locale/fr/LC_MESSAGES/0000777000000000000000000000000000000000000014702 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1445764095.0 guiqwt-4.0.1/guiqwt/locale/fr/LC_MESSAGES/guiqwt.mo0000666000000000000000000007141000000000000016562 0ustar00T          ! %!2!9!B!'^!!! !!!! !! !!!""7""# #+#<# K#X# i# v## ##5###$ $ 7$E$V$(g$$$$ $$$$$ $ $%% % *%4%8% ?%L% T%`% g%r%{%% %% % %%%%%% &&$&7&K&P&Y&l& r& &&&&& &&& ''0' E' Q' ]'k' }'' '' ' '' '' ''%'0(,G('t(( ( ("( ((S(C)V)^)n)3*9* P*[*j*q********* * *++0+L+ d+r+y+++++++++ ,,,,3, 8, B,?M,, ,,,,,,, ,--- $- .-9-K-3\--5----.#,.P.i..... ../%/?/ F/P/ Y/ g/s/ z/R/ 00'0 11,1 ;1I1N1U1 Z1 h1v11 1111 111 12 2 *262G2Z2m22 2 2222222 3,3L3^3 b3 p3 ~3 3333 3 3 33 3 34 4 "4 /4=4D4U4^4 f4p4u4 44i4 5%545P5l555 5 5 5 555 55 5 6 6 )6 36 =6K6 c6n6t666666 636 7"7 *757D7I7Z7i7o7:7 77777788V.8888 88888899 9 9 &9 19?9S9h9w9}9799(9 :%:C:(a: ::::::: ::/:";6;;;$U;z;;; ; ;; ;;;< <$<+<0<M<S<Z<l<r<{<< <<<< <<<< = = = $=1.=6`=X= = => >>>"> +>5>F>a>j>o> > >>>>>>>??(?E?^?Od? ????1?@3@ M@"X@{@&@@ @@ @@@@@@ @ AA%/AUAWA^AeA lAxAA%A AAA AA A ABBBB B/BKBTB dBqBvB }BBBB BB%B$B CCCC#C5COCSCVCYC]ClCuCCCCCCCCCCCGC$E(EDE `E jEuEEEEE E E F F'-F UFvF |FFFF FF FFF F) G3G$H&:HaHuHHHHHH I'I >IA_IIII'IIJJ(!JJJ[J zJJJJJJJJJJ J JKKK)K2KEKLK ^KiK}KKKKKKKKKKL;L@LZLsL{LLL LLLL!L MM%#MIM_MwMMM MMMMMMN !N-N 5N BN LNWN+`NAN=N- O:O AO MO9WOO OqO(PUCU LU XUcUvU<UUBU!V$'V#LVpV%VV#VV0W03WdW|WWW'WW W X X X&X/X@X Y Z7ZFZ\Z{ZZZZZZZZZ[[5[M[T[ n[&z[[/[[ [ \(%\)N\x\\\\\\ \\*]*0]-[]-]]]]]]^ %^3^<^@^O^_^v^{^^^^^^ ^_ _ *_ 6_D_J_ e_p_H___0_2%`X`m``````` ` ```a !a .a ;aEaTahazaa aa7a,a b bN,b {bb bbbbb b bYb McWcmc c c'cc%cecYdhddddddddeee3eJe"he!e#eee2eA&fhf9pf5f)f) g74g lgwggggg ggg7g&hFh&Khrhhhhhhh hhh i' iHiOi$Wi|i iii iiiiiii jj!j9jLj ]jkjzj7j;jjk kkkkkkkk"kll<!l ^ljllll ll(l)mBm)`mmmsm%n8nAnRn:dnnnn5no2oKo So`oqoo o oo o o oo#op p 'p 1p ;p!Hp jp$p pp p ppp ppqq qq(q @qKq [qiq pq zqqqqqq,q5q$r)r 0r;rBr[r urrrrr rrrrrrr rrrrs#%s could not be opened:%s could not be written:&Edit&View1:12D Histogram2x2 antialiasing filter3x3 antialiasing filter5x5 antialiasing filter8-bit imagesAbout About...Absolute position on canvasActivate the oblique cross section toolAll supported filesAlphaAlpha channelAnchorAnchor positionAngleAngle (°):Angle:AnnotationAntialiasing (curves)Application exampleApplyApply LUT (contrast settings)Apply LUT (Look-Up Table) contrast settings. This is the easiest way to compare images which have slightly different level ranges. Note: LUT is coded over 1024 levels (0...1023)Apply contrast settingsApply interpolation algorithmApply maskArrow angle (°)Arrow size (%)Aspect ratioAttach to canvasAuto-refreshAuto-scaleAutomatic LUT rangeAutomatic fitAutomatic fitting optionsAutomatically adapt color scale when panning, zoomingAverageAverage cross sectionAxesAxes associated to selected itemAxes style...Background alphaBackground colorBackground color when no data is presentBackground transparencyBackward diagonal linesBaselineBin countBinsBoldBorderBottomBottom leftBottom rightBound to active itemBoundsCSV filesCalibrateCapCenterCenter itemsCenter:Choose fontCircleClear maskClippingClipping valueColorColor mapColormapComputationComputing:Conjugate GradientConsoleContentsContrast adjustmentContrast adjustment toolCopy to clipboardCornerCreate a new imageCreate a new signalCropCroppingCropping rectangleCrossCross cursorCross sectionCross section toolCrossing diagonal linesCrossing horizontal and vertical linesCurrent valueCurveCurve Plotting ToolbarCurve fittingCurve fitting parameterCurve plotting panelCurve styleDICOM filesDash-dot lineDash-dot-dot lineDashed lineDataData typeDestination size:Developped byDiameter:DiamondDifferenceDisplayDistance:DivisionDo you really want to clear the mask?Do you really want to remove all masking shapes?Do you really want to remove selected items?Do you really want to remove this item?DotsDotted lineDuplicateEdit '%s' fit parameter propertiesEdit data...Edit...Eliminate levels histogram outliers and scale the image's display range accordinglyEliminate outliersEllipseEnable a markerEnable the per-image cross-section mode, which works directly on image rows/columns. That is the fastest method to compute cross-section curves but it ignores image transformations (e.g. rotation)ErrorError bar transparencyError barsError message:Error:Example dialog boxExportExport data...Extremely dense brush patternExtremely sparse brush patternFFTFamilyFileFillFill colorFill patternFill pattern (X-Axis)Fill pattern (Y-Axis)Fill pattern (not selected)Fill pattern (selected)Filling valueFilterFilter algorithmFilter parametersFirst column indexFirst row indexFitFit parametersFlat-field correctionFlip horizontallyFlip verticallyFlip:FontFormatForward diagonal linesFreeFree formFull rangeFunction 'savefig' currently supports the following formats: %sGaussian filterGlobal alphaGlobal alpha valueGridGrid lines colorGrid...Half dense brush patternHeightHeight (dy)Height (pixels)HelpHexagonHistogramHorizontalHorizontal cursorHorizontal linesHorizontal offset (pixels) relative to anchor pointHorizontal selectionIf image B is behind image A, replace intersection byImageImage Processing ToolbarImage Visualization ToolbarImage height (pixels)Image height (total number of rows)Image interpolation typeImage levels adjustmentsImage parametersImage placement along X-axisImage placement along Y-axisImage statisticsImage titleImage visualization panelImage width (pixels)Image width (total number of columns)ImagesIntensityInteractInterpolationInverse FFTItalicItem listKeyboard/mouse shortcuts: - single left-click: item (curve, image, ...) selection - single right-click: context-menu relative to selected item - shift: on-active-curve (or image) cursor - alt: free cursor - left-click + mouse move: move item (when available) - middle-click + mouse move: pan - right-click + mouse move: zoomLUT scaleLabelLabel position relative to anchor pointLabel textLast column indexLast row indexLeast squaresLeftLegendLineLine (X-Axis)Line (Y-Axis)Line (not selected)Line (selected)Line styleLinear calibrationLinear interpolationLinesLoad itemsLockLock aspect ratioLock scalesLock scales to main plot axesLock valueLogarithmicLower axis limitLower x-axis limitLower y-axis limitLower z-axis limitMAX resolutionMain panelMajor gridManage image masking areasMarkerMarkersMaskMask circular area (inside)Mask circular area (outside)Mask rectangular area (inside)Mask rectangular area (outside)Masked area alphaMaxMaximum levelMaximum valueMeasurement relative uncertaintyMemory errorMetadataMethodMinMinimum levelMininum valueMinor gridModeMove to backMove to frontNameNew gaussian functionNew image...New signal...New...No brush patternNo curveNo lineNo symbolNoneNone (nearest pixel)NormalizeNormalize with respect toNote: only y-axis error bars are shown in error area mode (width and cap parameters will also be ignored)NumPy arraysNumber of binsNumber of bins along x-axisNumber of bins along y-axisOblique averaged cross sectionOblique rectangleOpenOpen a signalOpen an imageOpen imageOpen image...Open signal...Open...OperationsOrderOriginal sizeOriginal size:PDF documentPNG filesPNG imageParameters...Per image cross-sectionPixel sizePointPoint selectionPolylinePositionPosition relative to anchorPrefilter the input imagePrint...Private shapePrivate shapes are not shown in the item list panelProcessingProductPropertiesQuadrilateralsQuitQuit applicationROI extractionRangeRead-only shapeRead-only shapes can't be removed from the item list panelRectangleRectangle snapshotRectangle zoomRefreshRemoveRemove all masking shapesResetReshape the output arrayReshape the output array so that the input array is contained completely in the outputResizeReverse Y axisRightRotate & CropRotate 90° leftRotate 90° rightRotate and cropRotate arbitrarily...RotationRunSave asSave as...Save image...Save itemsSave items asSave selected imageSave selected signalSave signal...ScaleScale levels to maximum rangeScale the image's display range according to data rangeSegmentSelect a segment then press OK to acceptSelect colormap for active imageSelect maximum level on imageSelect minimum level on imageSelect one point then press OK to acceptSelectionSettingsShadeShadowShapeShow annotationShow cropping rectangleShow gridShow image maskShow informations on area covered by this shapeShow masking shapesSiftSignal Processing ToolbarSignal size (total number of points)Signal statisticsSignalsSizeSize in pointSize or sigmaSize:Solid lineSomewhat dense brush patternSomewhat sparse brush patternSpacingSpline interpolation orderSquareStarStatistics string formattingStepsSticksString formattingStyleSubtitleSumSuperimposed imagesSwap X/Y axesSymbolSymbol (not selected)Symbol (selected)TIFF filesTextText (not selected)Text (selected)Text colorText fileText filesText fontThere is no supported image item in current plot.There is no supported image item in current selection.There is not enough memory left to process this %d x %d image (%d MB would be required).ThresholdThresholdingTitleTitle fontToolsTopTop leftTop rightTransform matrixTranslate, rotate and flipTriangleTypeUnable to export item data.UncertaintyUniform colorUnitUnknown file extensionUnmasked area alphaUntitledUpper axis limitUpper x-axis limitUpper y-axis limitUpper z-axis limitUse image colormap and levelUse image level as alphaValueValue used for points outside the boundaries of the input if mode is 'constant'Values fontVerticalVertical cursorVertical linesVertical offset (pixels) relative to anchor pointVery dense brush patternVery sparse brush patternVisibilityWarning: only real part is plottedWelcome to %s!Welcome to guiqwt application example!WidthWidth (dx)Width (pixels)Wiener filterXX AxisX-AxisX-CrossX-axisX-axis binsX-axis cross sectionX-axis positionX-axis position in canvas coordinatesYY AxisY-AxisY-axisY-axis binsY-axis cross sectionY-axis positionY-axis position in canvas coordinatesY-axis scaleZ AxisZ-AxisZ-axis scaleZoomZoom factor:amplitudebottomcvalemptyenergyerror area (y)error bars with caps (x, y)gaussiangaussian filterguiqwt itemsleftlinearlogarithmiclsbmaximummaximum filtermedian filterminimum filtermoving object changes anchor positionmoving object changes label positiononpixelsrandomrightset to foregroundset width to 0 to disablesumsxsytopuniform filteruntitledxCENTERx|maxx|minyCENTERy|maxy|minz-axis scale labelzerosΔXΔYθ (°)Project-Id-Version: PACKAGE VERSION POT-Creation-Date: 2015-10-25 10:07+Paris, Madrid PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: utf-8 Generated-By: pygettext.py 1.5 n°%s n'a pas pu être ouvert:%s n'a pas pu être écrit:&Édition&AffichageRapport unitéHistogramme 2DFiltre anti-repliement 2x2Filtre anti-repliement 3x3Filtre anti-repliement 5x5Images 8 bitsÀ propos de À propos...Position absolue sur le canevasActiver l'outil de profil oblique moyenTous les fichiers pris en chargeAlphaCanal alphaAncrePosition du point d'ancrageAngleAngle (°) :Angle :AnnotationAnticrénelage (courbes)Exemple d'applicationAppliquerAppliquer la LUT (réglages de contraste)Applique les réglages de contraste de la LUT (Look-Up Table). C'est le moyen le plus facile pour comparer (en relatif) des images ayant des dynamiques très différentes. Note : la LUT est codée sur 1024 niveaux (0...1023)Appliquer les réglages de contrasteAppliquer l'algorithme d'interpolationAppliquer le masqueAngle de la flèche (°)Taille de la flèche (%)Rapport hauteur/largeurAttacher au canevasRafraîchissement automatiqueÉchelle automatiqueAjustement automatique de la LUTAjustement automatiqueOptions d'ajustement automatiqueAjuste automatiquement l'échelle de couleur (déplacement, zoom)MoyenneProfil rectiligne moyenAxesAxes associés à l'objet sélectionnéStyle des axes...Opacité du fondCouleur du fondCouleur de fond en l'absence de donnéesOpacité du fondLignes diagonales descendantesLigne de baseEffectif totalClassesGrasBordureBasEn bas à gaucheEn bas à droiteLié à l'objet actifBornesFichiers CSVÉtalonnerBordureCentreCentrer des objetsCentre :Choisir une policeCercleEffacer le masqueÉcrêtageValeur d'écrêtageCouleurÉchelle de couleurÉchelle de couleurCalculCalcul en cours :Gradient conjuguéConsoleContenuRéglage du contrasteOutil de réglage du contrasteCopier dans le presse-papierCoinCréer une nouvelle imageCréer un nouveau signalRognageRognageRectangle de rognagePlusCurseur croixProfil rectiligneProfils d'imagesLignes diagonales croiséesLignes horizontales et verticalesValeur actuelleCourbeBarre d'outils d'affichage de courbesAjustement de courbesParamètre d'ajustementPanneau d'affichage de courbesStyle de courbeFichiers DICOMTirets-pointsTirets-points-pointsTiretsDonnéesType de donnéesTaille de destination :Développé parDiamètre :LosangeSoustractionAffichageDistance :DivisionSouhaitez-vous vraiment effacer le masque ?Souhaitez-vous vraiment supprimer toutes les formes de masquage ?Souhaitez-vous vraiment supprimer les objets sélectionnés ?Souhaitez-vous vraiment supprimer cet objet ?PointsPointillésDupliquerModifier les propriétés du paramètre d'ajustement '%s'Modifier les données...Modifier...Supprime les bords (pourcentage choisi) de l'histogramme des niveaux de l'image, puis affiche l'image résultanteÉliminer les bordsEllipseActiver un marqueurActive l'affichage d'un profil par image : ce mode d'affichage extrait les profils directement depuis les lignes ou les colonnes des images. C'est la méthode la plus rapide, mais cela ne fonctionne pas sur des images ayant subies une transformation (rotation, par exemple).ErreurTransparence de la barre d'erreurBarres d'erreurMessage d'erreur :Erreur:Exemple de boîte de dialogueExporterExporter les données...Motif extrêmement denseMotif extrêmement clairseméFFTFamilleFichierRemplissageCouleur de remplissageMotif de remplissageMotif de remplissage (axes des x)Motif de remplissage (axes des y)Motif de remplissage (hors sélection)Motif de remplissage (sélection)Valeur de remplissageFiltreAlgorithme de filtrageParamètres du filtreIndice de la première colonneIndice de la première ligneAjustementParamètres d'ajustementCorrection de champ platSymétrie horizontaleSymétrie verticaleRetournement :PoliceFormatLignes diagonales montantesLibreForme librePleine échelleLa fonction 'savefig' ne prend en charge que les formats suivants: %sFiltre gaussienAlpha globalValeur globale du canal alphaGrilleCouleur de la grilleGrille...Motif de densité moyenneHauteurHauteur (dy)Hauteur (pixels)AideHexagoneHistogrammeHorizontalCurseur horizontalLignes horizontalesDécalage horizontal (pixels) par rapport au point d'ancrageSélection horizontaleSi l'image B est derrière l'image A, remplacer l'intersection parImageBarre d'outils de traitement d'imageBarre d'outils d'affichage d'imagesHauteur de l'image (pixels)Hauteur de l'image (nombre de lignes)Type d'interpolationModification des niveaux de l'imageParamètres de l'imagePositionnement de l'image le long de l'axe des XPositionnement de l'image le long de l'axe des YStatistiques de l'imageTitre de l'imagePanneau d'affichage d'imagesLargeur de l'image (pixels)Largeur de l'image (nombre de colonnes)ImagesIntensitéInteractionInterpolationFFT inverseItaliqueListe des objetsRaccourcis clavier et souris : - clique gauche : sélection d'une courbe - clique droit : menu contextuel - shift : affichage d'un curseur sur la courbe ou l'image sélectionnée - alt : curseur libre - clique gauche + déplacement souris : déplacement de l'objet actif (si possible) - clique du milieu + déplacement souris : translation dans le plan ('pan') - clique droit + déplacement souris : agrandissement ('zoom')Échelle LUTÉtiquettePosition de l'étiquette par rapport au point d'ancrageTexte de l'étiquetteIndice de la dernière colonneIndice de la dernière ligneMoindres carrésGaucheLégendeTraitTrait (axes des x)Trait (axes des y)Trait (hors sélection)Trait (sélection)Style de traitÉtalonnage linéaireInterpolation linéaireLignesCharger les objets guiqwtVerrouillerVerrouiller le rapport hauteur/largeurSynchroniser les échellesSynchroniser les échelles à celles du canevasValeur imposéelogarithmiqueBorne inférieure de l'axeBorne inférieure de l'axe des abscissesBorne inférieure de l'axe des ordonnéesBorne inférieure des niveauxRésolution MAXPanneau principalQuadrillage primaireGestion des zones de masquageMarqueurMarqueursMasqueMasquer l'intérieur d'une zone circulaireMasquer l'extérieur d'une zone circulaireMasquer l'intérieur d'une zone rectangulaireMasquer l'extérieur d'une zone rectangulaireZone masquée (alpha)MaxNiveau maximumValeur maximaleIncertitude relative de mesureMémoire insuffisanteMétadonnéesMéthodeMinNiveau minimumValeur minimaleQuadrillage secondaireModeDéplacer vers l'arrière-planDéplacer vers le premier planNomNouvelle gaussienneNouvelle image...Nouveau signal...Nouveau...Pas de motif de remplissagePas de courbeAucun traitAucun symboleAucunNéant (plus proche pixel)NormaliserNormaliser par rapport àNote: seules les erreurs en y sont indiquées dans le mode zone d'erreurTableaux NumPyNombre de classesNombre de classes le long de l'axe des abscissesNombre de classes le long de l'axes des ordonnéesProfil oblique moyenRectangle obliqueOuvrirOuvrir un signalOuvrir une imageOuvrir une imageOuvrir une image...Ouvrir un signal...Ouvrir...OpérationsOrdreTaille d'origineTaille d'origine :Document PDFFichiers PNGImage PNGParamètres...Un profil par imageTaille des pixelsPointSélection d'un pointLigne briséePositionPosition de l'étiquette par rapport au point d'ancragePrétraitement de l'image d'origine (spline)Imprimer...Forme privéeLes formes privées ne sont pas affichées dans le panneau de liste des objetsTraitementProduitPropriétésQuadrilatèresQuitterQuitter l'applicationExtraction de ROIIntervalleLecture seuleLes formes en lecture seule ne peuvent pas être supprimer du panneau de liste des objetsRectangleCapture rectangulaireZoom rectangulaireRafraîchirSupprimerSupprimer toutes les formes de masquageRéinitialiserRedimensionner l'image de destinationRedimensionner l'image de destination de sorte qu'elle puisse contenir la totalité de l'image sourceRedimensionnerInverser l'axe des ordonnéesDroiteRotation & rognageRotation directe de 90°Rotation inverse de 90°Rotation et rognageRotation arbitraire...RotationAjusterEnregistrer sousEnregistrer sous...Enregistrer l'image...Enregistrer les objets guiqwtEnregistrer les objets guiqwt sousEnregistre l'image sélectionnéeEnregistrer le signal sélectionnéEnregistrer le signal...ÉchelleNormaliser (utiliser la totalité de la dynamique)Adapte l'échelle d'affichage des niveaux de l'image aux donnéesSegmentSélectionnez un segment puis appuyer sur OK pour validerSélectionne l'échelle de couleurs de l'image activeSélectionne le niveau maximum de l'imageSélectionne le niveau minimum de l'imageSélectionnez un point puis appuyer sur OK pour validerSélectionOptionsOmbreOmbreFormeAfficher l'annotationAfficher le rectangle de rognageAfficher la grilleAfficher le masqueAfficher les informations sur cette région d'intérêtAfficher les formes de masquageSiftBarre d'outils de traitement du signalNombre de pointsStatistiques du signalSignauxTailleTaille en pointTaille ou sigmaTaille :Trait continuMotif quelque peu denseMotif quelque peu clairseméEspacementOrdre de l'interpolation de type splineCarréÉtoileFormats d'affichage des statistiquesPasBâtonnetsFormatStyleSous-titreAdditionImages superposéesPermuter les axes X/YSymboleSymbole (hors sélection)Symbole (sélection)Fichiers TIFFTexteTexte (hors sélection)Texte (sélection)Couleur du texteFichier texteFichiers textePolice du texteLa figure ne contient aucun objet image pris en charge.La sélection ne contient aucun objet image pris en charge.La quantité de mémoire disponible n'est pas suffisante pour traiter cette image de %d x %d pixels (%d Mo seraient nécessaires)SeuilSeuillageTitrePolice du titreOutilsHautEn haut à gaucheEn haut à droiteMatrice de transformationTranslation, rotation et symétrieTriangleTypeImpossible d'exporter les données de l'objet sélectionné.IncertitudeCouleur de remplissage uniformeUnitéExtension de fichier inconnueZone non masquée (alpha)Sans titreBorne supérieure de l'axeBorne supérieure de l'axe des abscissesBorne supérieure de l'axe des ordonnéesBorne supérieure des niveauxUtiliser l'échelle de couleur de l'imageUtiliser les niveaux de l'imageValeurValeur utilisée pour les points situés en dehors des frontières de l'image d'origine (si le mode est 'constant')Police des valeursVerticalCurseur verticalLignes verticalesDécalage vertical (pixels) par rapport au point d'ancrageMotif très denseMotif très clairseméOrdreAttention : seulement la partie réelles sera tracéeBienvenue dans %s !Bienvenue dans l'exemple d'application de guiqwt !LargeurLargeur (dx)Largeur (pixels)Filtre de WienerXAbscissesAxe des XCroixAxe des XClasses en xProfil selon l'axe des abscissesPosition de l'axe des abscissesAbscisse en coordonnées du canevasYOrdonnéesAxe des YAxe des YClasses en yProfil selon l'axe des ordonnéesPosition de l'axe des ordonnéesOrdonnée en coordonnées du canevasÉchelle en yNiveauxAxe des ZÉchelle en zZoomFacteur de zoom :amplitudebascvalvideénergiezone d'erreur (y)barres d'erreurs (x, y)gaussiennefiltre gaussienObjets guiqwtgauchelinéairelogarithmiquelsbmaximumfiltre maximumfiltre médianfiltre minimumdéplacer l'objet modifie le point d'ancragedéplacer l'objet modifie la position de l'étiquettesouspixelsaléatoiredroiteafficher en premier planentrer 0 pour désactiverintégralesxsyhautfiltre uniformesanstitrexCENTREx|maxx|minyCENTREy|maxy|minÉchelle en zzérosΔXΔYθ (°)././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1445764084.0 guiqwt-4.0.1/guiqwt/locale/fr/LC_MESSAGES/guiqwt.po0000666000000000000000000015673200000000000016600 0ustar00# -*- coding: utf-8 -*- # guiqwt module translation file # Copyright (C) 2009 CEA/DAM # Pierre Raybaut , 2009. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2015-10-25 10:07+Paris, Madrid\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: utf-8\n" "Generated-By: pygettext.py 1.5\n" #: guiqwt\annotations.py:104 guiqwt\annotations.py:133 guiqwt\builder.py:1073 msgid "Annotation" msgstr "Annotation" #: guiqwt\annotations.py:157 guiqwt\builder.py:863 guiqwt\label.py:95 #: guiqwt\label.py:114 guiqwt\tools.py:684 guiqwt\tools.py:717 msgid "Label" msgstr "Étiquette" #: guiqwt\annotations.py:407 msgid "Distance:" msgstr "Distance :" #: guiqwt\annotations.py:459 guiqwt\annotations.py:536 #: guiqwt\annotations.py:615 guiqwt\annotations.py:638 msgid "Center:" msgstr "Centre :" #: guiqwt\annotations.py:460 guiqwt\annotations.py:537 #: guiqwt\annotations.py:616 msgid "Size:" msgstr "Taille :" #: guiqwt\annotations.py:538 guiqwt\annotations.py:617 msgid "Angle:" msgstr "Angle :" #: guiqwt\annotations.py:639 msgid "Diameter:" msgstr "Diamètre :" #: guiqwt\baseplot.py:91 msgid "Grid..." msgstr "Grille..." #: guiqwt\baseplot.py:92 msgid "Axes style..." msgstr "Style des axes..." #: guiqwt\baseplot.py:93 guiqwt\curve.py:1126 msgid "Parameters..." msgstr "Paramètres..." #: guiqwt\baseplot.py:172 guiqwt\styles.py:736 guiqwt\styles.py:781 #: guiqwt\styles.py:1232 msgid "Left" msgstr "Gauche" #: guiqwt\baseplot.py:173 guiqwt\styles.py:737 guiqwt\styles.py:782 #: guiqwt\styles.py:1233 msgid "Right" msgstr "Droite" #: guiqwt\baseplot.py:174 guiqwt\styles.py:739 guiqwt\styles.py:784 #: guiqwt\styles.py:1235 msgid "Bottom" msgstr "Bas" #: guiqwt\baseplot.py:175 guiqwt\styles.py:738 guiqwt\styles.py:783 #: guiqwt\styles.py:1234 msgid "Top" msgstr "Haut" #: guiqwt\baseplot.py:452 msgid "Unknown file extension" msgstr "Extension de fichier inconnue" #: guiqwt\baseplot.py:853 guiqwt\shapes.py:1183 guiqwt\shapes.py:1211 #: guiqwt\tools.py:898 msgid "Axes" msgstr "Axes" #: guiqwt\baseplot.py:854 msgid "Axes associated to selected item" msgstr "Axes associés à l'objet sélectionné" #: guiqwt\baseplot.py:884 guiqwt\styles.py:557 guiqwt\styles.py:563 #: guiqwt\styles.py:646 guiqwt\styles.py:668 msgid "Y Axis" msgstr "Ordonnées" #: guiqwt\baseplot.py:886 guiqwt\styles.py:556 guiqwt\styles.py:562 #: guiqwt\styles.py:641 guiqwt\styles.py:664 msgid "X Axis" msgstr "Abscisses" #: guiqwt\builder.py:125 guiqwt\curve.py:227 guiqwt\curve.py:1387 #: guiqwt\curve.py:1416 msgid "Grid" msgstr "Grille" #: guiqwt\builder.py:306 guiqwt\builder.py:373 guiqwt\builder.py:394 #: guiqwt\builder.py:476 guiqwt\builder.py:511 guiqwt\cross_section.py:349 #: guiqwt\curve.py:334 guiqwt\curve.py:415 guiqwt\curve.py:864 #: guiqwt\histogram.py:114 guiqwt\histogram.py:222 msgid "Curve" msgstr "Courbe" #: guiqwt\builder.py:396 guiqwt\builder.py:478 guiqwt\curve.py:845 #: guiqwt\curve.py:866 msgid "Error bars" msgstr "Barres d'erreur" #: guiqwt\builder.py:509 guiqwt\histogram.py:117 guiqwt\histogram.py:225 #: guiqwt\styles.py:1325 msgid "Histogram" msgstr "Histogramme" #: guiqwt\builder.py:551 guiqwt\builder.py:603 guiqwt\builder.py:645 #: guiqwt\builder.py:682 guiqwt\builder.py:707 guiqwt\builder.py:752 #: guiqwt\builder.py:781 guiqwt\image.py:786 guiqwt\image.py:924 #: guiqwt\image.py:1180 guiqwt\image.py:1595 guiqwt\image.py:1728 #: guiqwt\image.py:1842 guiqwt\image.py:2269 guiqwt\styles.py:961 #: guiqwt\styles.py:1021 msgid "Image" msgstr "Image" #: guiqwt\builder.py:802 guiqwt\styles.py:1201 msgid "Filter" msgstr "Filtre" #: guiqwt\builder.py:826 msgid "2D Histogram" msgstr "Histogramme 2D" #: guiqwt\builder.py:897 msgid "Legend" msgstr "Légende" #: guiqwt\builder.py:992 guiqwt\shapes.py:280 msgid "Marker" msgstr "Marqueur" #: guiqwt\builder.py:1139 guiqwt\styles.py:1333 msgid "Computation" msgstr "Calcul" #: guiqwt\config.py:25 msgid "#" msgstr "n°" #: guiqwt\config.py:61 msgid "pixels" msgstr "pixels" #: guiqwt\config.py:73 msgid "Intensity" msgstr "Intensité" #: guiqwt\config.py:74 msgid "lsb" msgstr "lsb" #: guiqwt\cross_section.py:323 msgid "LUT scale" msgstr "Échelle LUT" #: guiqwt\cross_section.py:327 guiqwt\tools.py:1021 msgid "Cross section" msgstr "Profil rectiligne" #: guiqwt\cross_section.py:328 msgid "Enable a marker" msgstr "Activer un marqueur" #: guiqwt\cross_section.py:605 msgid "Cross section tool" msgstr "Profils d'images" #: guiqwt\cross_section.py:678 msgid "Auto-scale" msgstr "Échelle automatique" #: guiqwt\cross_section.py:682 msgid "Refresh" msgstr "Rafraîchir" #: guiqwt\cross_section.py:685 msgid "Auto-refresh" msgstr "Rafraîchissement automatique" #: guiqwt\cross_section.py:689 msgid "Lock scales" msgstr "Synchroniser les échelles" #: guiqwt\cross_section.py:692 msgid "Lock scales to main plot axes" msgstr "Synchroniser les échelles à celles du canevas" #: guiqwt\cross_section.py:776 msgid "Per image cross-section" msgstr "Un profil par image" #: guiqwt\cross_section.py:779 msgid "" "Enable the per-image cross-section mode, which works directly on image rows/" "columns.\n" "That is the fastest method to compute cross-section curves but it ignores " "image transformations (e.g. rotation)" msgstr "" "Active l'affichage d'un profil par image : ce mode d'affichage extrait les " "profils directement depuis les lignes ou les colonnes des images.\n" "C'est la méthode la plus rapide, mais cela ne fonctionne pas sur des images " "ayant subies une transformation (rotation, par exemple)." #: guiqwt\cross_section.py:785 msgid "" "Apply LUT\n" "(contrast settings)" msgstr "" "Appliquer la LUT\n" "(réglages de contraste)" #: guiqwt\cross_section.py:788 msgid "" "Apply LUT (Look-Up Table) contrast settings.\n" "This is the easiest way to compare images which have slightly different " "level ranges.\n" "\n" "Note: LUT is coded over 1024 levels (0...1023)" msgstr "" "Applique les réglages de contraste de la LUT (Look-Up Table).\n" "C'est le moyen le plus facile pour comparer (en relatif) des images ayant " "des dynamiques très différentes.\n" "\n" "Note : la LUT est codée sur 1024 niveaux (0...1023)" #: guiqwt\cross_section.py:922 guiqwt\cross_section.py:923 #: guiqwt\tools.py:1076 guiqwt\tools.py:1493 msgid "Oblique averaged cross section" msgstr "Profil oblique moyen" #: guiqwt\cross_section.py:924 msgid "Activate the oblique cross section tool" msgstr "Activer l'outil de profil oblique moyen" #: guiqwt\curve.py:607 guiqwt\curve.py:685 msgid "PolygonMap" msgstr "" #: guiqwt\curve.py:1120 msgid "Move to back" msgstr "Déplacer vers l'arrière-plan" #: guiqwt\curve.py:1123 msgid "Move to front" msgstr "Déplacer vers le premier plan" #: guiqwt\curve.py:1129 guiqwt\curve.py:1281 guiqwt\tests\sift.py:245 #: guiqwt\tools.py:1992 guiqwt\tools.py:2009 msgid "Remove" msgstr "Supprimer" #: guiqwt\curve.py:1278 guiqwt\tools.py:2006 msgid "Do you really want to remove this item?" msgstr "Souhaitez-vous vraiment supprimer cet objet ?" #: guiqwt\curve.py:1280 guiqwt\tools.py:2008 msgid "Do you really want to remove selected items?" msgstr "Souhaitez-vous vraiment supprimer les objets sélectionnés ?" #: guiqwt\curve.py:1293 guiqwt\tools.py:1497 msgid "Item list" msgstr "Liste des objets" #: guiqwt\histogram.py:419 guiqwt\histogram.py:513 msgid "Eliminate outliers" msgstr "Éliminer les bords" #: guiqwt\histogram.py:427 msgid "Contrast adjustment tool" msgstr "Outil de réglage du contraste" #: guiqwt\histogram.py:488 msgid "Minimum level" msgstr "Niveau minimum" #: guiqwt\histogram.py:490 msgid "Select minimum level on image" msgstr "Sélectionne le niveau minimum de l'image" #: guiqwt\histogram.py:494 msgid "Maximum level" msgstr "Niveau maximum" #: guiqwt\histogram.py:496 msgid "Select maximum level on image" msgstr "Sélectionne le niveau maximum de l'image" #: guiqwt\histogram.py:508 msgid "Full range" msgstr "Pleine échelle" #: guiqwt\histogram.py:511 msgid "Scale the image's display range according to data range" msgstr "Adapte l'échelle d'affichage des niveaux de l'image aux données" #: guiqwt\histogram.py:516 msgid "" "Eliminate levels histogram outliers and scale the image's display range " "accordingly" msgstr "" "Supprime les bords (pourcentage choisi) de l'histogramme des niveaux de " "l'image, puis affiche l'image résultante" #: guiqwt\image.py:1100 msgid "Quadrilaterals" msgstr "Quadrilatères" #: guiqwt\image.py:1488 msgid "There is no supported image item in current plot." msgstr "La figure ne contient aucun objet image pris en charge." #: guiqwt\io.py:113 msgid "All supported files" msgstr "Tous les fichiers pris en charge" #: guiqwt\io.py:342 msgid "PNG files" msgstr "Fichiers PNG" #: guiqwt\io.py:345 msgid "TIFF files" msgstr "Fichiers TIFF" #: guiqwt\io.py:347 msgid "8-bit images" msgstr "Images 8 bits" #: guiqwt\io.py:350 guiqwt\tests\sift.py:702 msgid "NumPy arrays" msgstr "Tableaux NumPy" #: guiqwt\io.py:352 guiqwt\tests\sift.py:702 msgid "Text files" msgstr "Fichiers texte" #: guiqwt\io.py:354 msgid "DICOM files" msgstr "Fichiers DICOM" #: guiqwt\plot.py:792 guiqwt\pyplot.py:143 msgid "Tools" msgstr "Outils" #: guiqwt\pyplot.py:775 msgid "" "Function 'savefig' currently supports the following formats:\n" "%s" msgstr "" "La fonction 'savefig' ne prend en charge que les formats suivants:\n" "%s" #: guiqwt\qthelpers.py:62 guiqwt\tests\sift.py:752 guiqwt\tools.py:1518 #: guiqwt\tools.py:1615 msgid "Save as" msgstr "Enregistrer sous" #: guiqwt\qthelpers.py:77 guiqwt\qthelpers.py:106 guiqwt\qthelpers.py:137 msgid "Error" msgstr "Erreur" #: guiqwt\qthelpers.py:78 guiqwt\tests\sift.py:765 msgid "%s could not be written:" msgstr "%s n'a pas pu être écrit:" #: guiqwt\qthelpers.py:96 guiqwt\qthelpers.py:126 guiqwt\tests\sift.py:703 #: guiqwt\tests\simple_window.py:227 guiqwt\tools.py:1717 msgid "Open" msgstr "Ouvrir" #: guiqwt\qthelpers.py:107 guiqwt\qthelpers.py:138 guiqwt\tests\sift.py:729 msgid "%s could not be opened:" msgstr "%s n'a pas pu être ouvert:" #: guiqwt\shapes.py:554 guiqwt\shapes.py:593 msgid "Shape" msgstr "Forme" #: guiqwt\shapes.py:1337 msgid "Range" msgstr "Intervalle" #: guiqwt\styles.py:284 msgid "Solid line" msgstr "Trait continu" #: guiqwt\styles.py:285 msgid "Dashed line" msgstr "Tirets" #: guiqwt\styles.py:286 msgid "Dotted line" msgstr "Pointillés" #: guiqwt\styles.py:287 msgid "Dash-dot line" msgstr "Tirets-points" #: guiqwt\styles.py:288 msgid "Dash-dot-dot line" msgstr "Tirets-points-points" #: guiqwt\styles.py:289 msgid "No line" msgstr "Aucun trait" #: guiqwt\styles.py:291 guiqwt\styles.py:337 msgid "Cross" msgstr "Plus" #: guiqwt\styles.py:292 guiqwt\tools.py:886 msgid "Ellipse" msgstr "Ellipse" #: guiqwt\styles.py:293 msgid "Star" msgstr "Étoile" #: guiqwt\styles.py:294 msgid "X-Cross" msgstr "Croix" #: guiqwt\styles.py:295 msgid "Square" msgstr "Carré" #: guiqwt\styles.py:296 msgid "Diamond" msgstr "Losange" #: guiqwt\styles.py:297 guiqwt\styles.py:298 guiqwt\styles.py:299 #: guiqwt\styles.py:300 msgid "Triangle" msgstr "Triangle" #: guiqwt\styles.py:301 msgid "Hexagon" msgstr "Hexagone" #: guiqwt\styles.py:302 msgid "No symbol" msgstr "Aucun symbole" #: guiqwt\styles.py:304 msgid "Lines" msgstr "Lignes" #: guiqwt\styles.py:305 msgid "Sticks" msgstr "Bâtonnets" #: guiqwt\styles.py:306 guiqwt\widgets\fit.py:94 msgid "Steps" msgstr "Pas" #: guiqwt\styles.py:307 msgid "Dots" msgstr "Points" #: guiqwt\styles.py:308 msgid "No curve" msgstr "Pas de courbe" #: guiqwt\styles.py:312 msgid "No brush pattern" msgstr "Pas de motif de remplissage" #: guiqwt\styles.py:313 msgid "Uniform color" msgstr "Couleur de remplissage uniforme" #: guiqwt\styles.py:314 msgid "Extremely dense brush pattern" msgstr "Motif extrêmement dense" #: guiqwt\styles.py:315 msgid "Very dense brush pattern" msgstr "Motif très dense" #: guiqwt\styles.py:316 msgid "Somewhat dense brush pattern" msgstr "Motif quelque peu dense" #: guiqwt\styles.py:317 msgid "Half dense brush pattern" msgstr "Motif de densité moyenne" #: guiqwt\styles.py:318 msgid "Somewhat sparse brush pattern" msgstr "Motif quelque peu clairsemé" #: guiqwt\styles.py:319 msgid "Very sparse brush pattern" msgstr "Motif très clairsemé" #: guiqwt\styles.py:320 msgid "Extremely sparse brush pattern" msgstr "Motif extrêmement clairsemé" #: guiqwt\styles.py:321 msgid "Horizontal lines" msgstr "Lignes horizontales" #: guiqwt\styles.py:322 msgid "Vertical lines" msgstr "Lignes verticales" #: guiqwt\styles.py:323 msgid "Crossing horizontal and vertical lines" msgstr "Lignes horizontales et verticales" #: guiqwt\styles.py:325 msgid "Backward diagonal lines" msgstr "Lignes diagonales descendantes" #: guiqwt\styles.py:326 msgid "Forward diagonal lines" msgstr "Lignes diagonales montantes" #: guiqwt\styles.py:327 msgid "Crossing diagonal lines" msgstr "Lignes diagonales croisées" #: guiqwt\styles.py:334 msgid "None" msgstr "Aucun" #: guiqwt\styles.py:335 msgid "Horizontal" msgstr "Horizontal" #: guiqwt\styles.py:336 msgid "Vertical" msgstr "Vertical" #: guiqwt\styles.py:357 msgid "Family" msgstr "Famille" #: guiqwt\styles.py:358 msgid "Choose font" msgstr "Choisir une police" #: guiqwt\styles.py:360 msgid "Size in point" msgstr "Taille en point" #: guiqwt\styles.py:361 msgid "Bold" msgstr "Gras" #: guiqwt\styles.py:362 msgid "Italic" msgstr "Italique" #: guiqwt\styles.py:391 guiqwt\styles.py:436 guiqwt\styles.py:471 msgid "Style" msgstr "Style" #: guiqwt\styles.py:393 guiqwt\tests\sift.py:117 msgid "Size" msgstr "Taille" #: guiqwt\styles.py:394 guiqwt\styles.py:716 msgid "Border" msgstr "Bordure" #: guiqwt\styles.py:395 guiqwt\styles.py:519 guiqwt\styles.py:554 #: guiqwt\styles.py:723 guiqwt\styles.py:1071 guiqwt\styles.py:1348 msgid "Background color" msgstr "Couleur du fond" #: guiqwt\styles.py:396 guiqwt\styles.py:520 msgid "Background alpha" msgstr "Opacité du fond" #: guiqwt\styles.py:437 guiqwt\styles.py:473 guiqwt\styles.py:601 #: guiqwt\styles.py:926 msgid "Color" msgstr "Couleur" #: guiqwt\styles.py:438 guiqwt\styles.py:929 guiqwt\tests\sift.py:176 #: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42 msgid "Width" msgstr "Largeur" #: guiqwt\styles.py:474 guiqwt\styles.py:927 msgid "Alpha" msgstr "Alpha" #: guiqwt\styles.py:475 guiqwt\tests\sift.py:869 msgid "Angle" msgstr "Angle" #: guiqwt\styles.py:476 msgid "sx" msgstr "sx" #: guiqwt\styles.py:477 msgid "sy" msgstr "sy" #: guiqwt\styles.py:517 msgid "Font" msgstr "Police" #: guiqwt\styles.py:518 guiqwt\styles.py:722 msgid "Text color" msgstr "Couleur du texte" #: guiqwt\styles.py:555 msgid "Major grid" msgstr "Quadrillage primaire" #: guiqwt\styles.py:558 guiqwt\styles.py:564 guiqwt\styles.py:872 #: guiqwt\styles.py:1374 guiqwt\styles.py:1377 guiqwt\styles.py:1434 #: guiqwt\styles.py:1437 guiqwt\styles.py:1491 guiqwt\styles.py:1494 #: guiqwt\styles.py:1567 guiqwt\styles.py:1570 msgid "Line" msgstr "Trait" #: guiqwt\styles.py:561 msgid "Minor grid" msgstr "Quadrillage secondaire" #: guiqwt\styles.py:599 guiqwt\styles.py:701 guiqwt\styles.py:830 #: guiqwt\styles.py:870 guiqwt\styles.py:1201 guiqwt\styles.py:1325 #: guiqwt\styles.py:1431 guiqwt\styles.py:1524 guiqwt\tests\sift.py:100 #: guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163 guiqwt\tests\sift.py:173 #: guiqwt\tests\simple_dialog.py:27 guiqwt\tests\simple_window.py:39 msgid "Title" msgstr "Titre" #: guiqwt\styles.py:600 guiqwt\widgets\fit.py:97 msgid "Unit" msgstr "Unité" #: guiqwt\styles.py:602 msgid "Title font" msgstr "Police du titre" #: guiqwt\styles.py:603 msgid "Values font" msgstr "Police des valeurs" #: guiqwt\styles.py:610 guiqwt\tools.py:1770 guiqwt\widgets\fit.py:96 msgid "Scale" msgstr "Échelle" #: guiqwt\styles.py:611 msgid "linear" msgstr "linéaire" #: guiqwt\styles.py:611 guiqwt\styles.py:1308 guiqwt\styles.py:1331 msgid "logarithmic" msgstr "logarithmique" #: guiqwt\styles.py:613 msgid "Lower axis limit" msgstr "Borne inférieure de l'axe" #: guiqwt\styles.py:614 msgid "Upper axis limit" msgstr "Borne supérieure de l'axe" #: guiqwt\styles.py:637 msgid "X-axis position" msgstr "Position de l'axe des abscisses" #: guiqwt\styles.py:638 msgid "bottom" msgstr "bas" #: guiqwt\styles.py:639 msgid "top" msgstr "haut" #: guiqwt\styles.py:642 msgid "Y-axis position" msgstr "Position de l'axe des ordonnées" #: guiqwt\styles.py:643 msgid "left" msgstr "gauche" #: guiqwt\styles.py:644 msgid "right" msgstr "droite" #: guiqwt\styles.py:665 msgid "Lower x-axis limit" msgstr "Borne inférieure de l'axe des abscisses" #: guiqwt\styles.py:666 msgid "Upper x-axis limit" msgstr "Borne supérieure de l'axe des abscisses" #: guiqwt\styles.py:669 msgid "Lower y-axis limit" msgstr "Borne inférieure de l'axe des ordonnées" #: guiqwt\styles.py:670 msgid "Upper y-axis limit" msgstr "Borne supérieure de l'axe des ordonnées" #: guiqwt\styles.py:672 msgid "Z Axis" msgstr "Niveaux" #: guiqwt\styles.py:673 msgid "Lower z-axis limit" msgstr "Borne inférieure des niveaux" #: guiqwt\styles.py:674 msgid "Upper z-axis limit" msgstr "Borne supérieure des niveaux" #: guiqwt\styles.py:706 guiqwt\styles.py:710 msgid "Contents" msgstr "Contenu" #: guiqwt\styles.py:713 guiqwt\styles.py:873 guiqwt\styles.py:1379 #: guiqwt\styles.py:1382 guiqwt\styles.py:1439 guiqwt\styles.py:1442 #: guiqwt\styles.py:1572 guiqwt\styles.py:1575 guiqwt\tests\styles.py:28 #: guiqwt\tests\styles.py:34 guiqwt\tests\styles.py:42 #: guiqwt\tests\styles.py:44 guiqwt\tests\styles.py:50 #: guiqwt\tests\styles.py:53 msgid "Symbol" msgstr "Symbole" #: guiqwt\styles.py:717 msgid "set width to 0 to disable" msgstr "entrer 0 pour désactiver" #: guiqwt\styles.py:720 guiqwt\styles.py:726 guiqwt\styles.py:1384 #: guiqwt\styles.py:1387 msgid "Text" msgstr "Texte" #: guiqwt\styles.py:721 msgid "Text font" msgstr "Police du texte" #: guiqwt\styles.py:724 msgid "Background transparency" msgstr "Opacité du fond" #: guiqwt\styles.py:728 guiqwt\styles.py:776 guiqwt\styles.py:792 msgid "Position" msgstr "Position" #: guiqwt\styles.py:729 msgid "Position relative to anchor" msgstr "Position de l'étiquette par rapport au point d'ancrage" #: guiqwt\styles.py:731 msgid "Corner" msgstr "Coin" #: guiqwt\styles.py:732 guiqwt\styles.py:777 msgid "Top left" msgstr "En haut à gauche" #: guiqwt\styles.py:733 guiqwt\styles.py:778 msgid "Top right" msgstr "En haut à droite" #: guiqwt\styles.py:734 guiqwt\styles.py:779 msgid "Bottom left" msgstr "En bas à gauche" #: guiqwt\styles.py:735 guiqwt\styles.py:780 msgid "Bottom right" msgstr "En bas à droite" #: guiqwt\styles.py:740 guiqwt\styles.py:785 msgid "Center" msgstr "Centre" #: guiqwt\styles.py:741 msgid "Label position relative to anchor point" msgstr "Position de l'étiquette par rapport au point d'ancrage" #: guiqwt\styles.py:744 msgid "ΔX" msgstr "ΔX" #: guiqwt\styles.py:745 msgid "Horizontal offset (pixels) relative to anchor point" msgstr "Décalage horizontal (pixels) par rapport au point d'ancrage" #: guiqwt\styles.py:747 msgid "ΔY" msgstr "ΔY" #: guiqwt\styles.py:748 msgid "Vertical offset (pixels) relative to anchor point" msgstr "Décalage vertical (pixels) par rapport au point d'ancrage" #: guiqwt\styles.py:751 guiqwt\styles.py:756 msgid "Anchor" msgstr "Ancre" #: guiqwt\styles.py:753 guiqwt\styles.py:790 msgid "Anchor position" msgstr "Position du point d'ancrage" #: guiqwt\styles.py:756 msgid "Attach to canvas" msgstr "Attacher au canevas" #: guiqwt\styles.py:760 msgid "X" msgstr "X" #: guiqwt\styles.py:761 msgid "X-axis position in canvas coordinates" msgstr "Abscisse en coordonnées du canevas" #: guiqwt\styles.py:764 msgid "Y" msgstr "Y" #: guiqwt\styles.py:765 msgid "Y-axis position in canvas coordinates" msgstr "Ordonnée en coordonnées du canevas" #: guiqwt\styles.py:769 msgid "Interact" msgstr "Interaction" #: guiqwt\styles.py:770 msgid "moving object changes anchor position" msgstr "déplacer l'objet modifie le point d'ancrage" #: guiqwt\styles.py:771 msgid "moving object changes label position" msgstr "déplacer l'objet modifie la position de l'étiquette" #: guiqwt\styles.py:786 msgid "Absolute position on canvas" msgstr "Position absolue sur le canevas" #: guiqwt\styles.py:874 msgid "Shadow" msgstr "Ombre" #: guiqwt\styles.py:875 msgid "Curve style" msgstr "Style de courbe" #: guiqwt\styles.py:877 msgid "Baseline" msgstr "Ligne de base" #: guiqwt\styles.py:920 msgid "Display" msgstr "Affichage" #: guiqwt\styles.py:921 msgid "error bars with caps (x, y)" msgstr "barres d'erreurs (x, y)" #: guiqwt\styles.py:922 msgid "error area (y)" msgstr "zone d'erreur (y)" #: guiqwt\styles.py:923 msgid "" "Note: only y-axis error bars are shown in error area mode\n" "(width and cap parameters will also be ignored)" msgstr "" "Note: seules les erreurs en y sont indiquées dans le mode zone d'erreur" #: guiqwt\styles.py:928 msgid "Error bar transparency" msgstr "Transparence de la barre d'erreur" #: guiqwt\styles.py:930 msgid "Cap" msgstr "Bordure" #: guiqwt\styles.py:931 msgid "Visibility" msgstr "Ordre" #: guiqwt\styles.py:931 msgid "set to foreground" msgstr "afficher en premier plan" #: guiqwt\styles.py:961 guiqwt\styles.py:1021 guiqwt\tests\simple_dialog.py:70 msgid "Image title" msgstr "Titre de l'image" #: guiqwt\styles.py:963 guiqwt\styles.py:1023 msgid "Alpha channel" msgstr "Canal alpha" #: guiqwt\styles.py:963 guiqwt\styles.py:1023 msgid "Use image level as alpha" msgstr "Utiliser les niveaux de l'image" #: guiqwt\styles.py:965 guiqwt\styles.py:1025 msgid "Global alpha" msgstr "Alpha global" #: guiqwt\styles.py:966 guiqwt\styles.py:1026 msgid "Global alpha value" msgstr "Valeur globale du canal alpha" #: guiqwt\styles.py:968 guiqwt\styles.py:1028 guiqwt\tools.py:2032 msgid "Colormap" msgstr "Échelle de couleur" #: guiqwt\styles.py:972 guiqwt\styles.py:1032 msgid "Interpolation" msgstr "Interpolation" #: guiqwt\styles.py:973 msgid "None (nearest pixel)" msgstr "Néant (plus proche pixel)" #: guiqwt\styles.py:974 msgid "Linear interpolation" msgstr "Interpolation linéaire" #: guiqwt\styles.py:975 msgid "2x2 antialiasing filter" msgstr "Filtre anti-repliement 2x2" #: guiqwt\styles.py:976 msgid "3x3 antialiasing filter" msgstr "Filtre anti-repliement 3x3" #: guiqwt\styles.py:977 msgid "5x5 antialiasing filter" msgstr "Filtre anti-repliement 5x5" #: guiqwt\styles.py:978 msgid "Image interpolation type" msgstr "Type d'interpolation" #: guiqwt\styles.py:980 guiqwt\styles.py:984 msgid "Statistics string formatting" msgstr "Formats d'affichage des statistiques" #: guiqwt\styles.py:981 msgid "X-Axis" msgstr "Axe des X" #: guiqwt\styles.py:982 msgid "Y-Axis" msgstr "Axe des Y" #: guiqwt\styles.py:983 msgid "Z-Axis" msgstr "Axe des Z" #: guiqwt\styles.py:1033 #, fuzzy msgid "Quadrangle interpolation" msgstr "Interpolation linéaire" #: guiqwt\styles.py:1034 #, fuzzy msgid "Flat" msgstr "Format" #: guiqwt\styles.py:1037 msgid "" "Image interpolation type, Flat mode use fixed u,v interpolation parameters" msgstr "" #: guiqwt\styles.py:1040 #, fuzzy msgid "Fixed U interpolation parameter" msgstr "Ordre de l'interpolation de type spline" #: guiqwt\styles.py:1041 guiqwt\styles.py:1043 msgid "For flat mode only" msgstr "" #: guiqwt\styles.py:1042 #, fuzzy msgid "Fixed V interpolation parameter" msgstr "Ordre de l'interpolation de type spline" #: guiqwt\styles.py:1044 msgid "Show grid" msgstr "Afficher la grille" #: guiqwt\styles.py:1045 msgid "Grid lines color" msgstr "Couleur de la grille" #: guiqwt\styles.py:1105 guiqwt\styles.py:1108 msgid "Image placement along X-axis" msgstr "Positionnement de l'image le long de l'axe des X" #: guiqwt\styles.py:1106 guiqwt\styles.py:1203 msgid "x|min" msgstr "x|min" #: guiqwt\styles.py:1107 guiqwt\styles.py:1204 msgid "x|max" msgstr "x|max" #: guiqwt\styles.py:1109 guiqwt\styles.py:1112 msgid "Image placement along Y-axis" msgstr "Positionnement de l'image le long de l'axe des Y" #: guiqwt\styles.py:1110 guiqwt\styles.py:1205 msgid "y|min" msgstr "y|min" #: guiqwt\styles.py:1111 guiqwt\styles.py:1206 msgid "y|max" msgstr "y|max" #: guiqwt\styles.py:1175 guiqwt\styles.py:1182 guiqwt\tools.py:2100 msgid "Mask" msgstr "Masque" #: guiqwt\styles.py:1176 msgid "Filling value" msgstr "Valeur de remplissage" #: guiqwt\styles.py:1177 guiqwt\tools.py:2130 msgid "Show image mask" msgstr "Afficher le masque" #: guiqwt\styles.py:1178 msgid "Masked area alpha" msgstr "Zone masquée (alpha)" #: guiqwt\styles.py:1180 msgid "Unmasked area alpha" msgstr "Zone non masquée (alpha)" #: guiqwt\styles.py:1202 guiqwt\widgets\fit.py:364 msgid "Bounds" msgstr "Bornes" #: guiqwt\styles.py:1208 msgid "Use image colormap and level" msgstr "Utiliser l'échelle de couleur de l'image" #: guiqwt\styles.py:1209 msgid "Color map" msgstr "Échelle de couleur" #: guiqwt\styles.py:1230 msgid "Crop" msgstr "Rognage" #: guiqwt\styles.py:1236 msgid "Cropping" msgstr "Rognage" #: guiqwt\styles.py:1238 guiqwt\styles.py:1242 msgid "Pixel size" msgstr "Taille des pixels" #: guiqwt\styles.py:1240 msgid "Width (dx)" msgstr "Largeur (dx)" #: guiqwt\styles.py:1241 msgid "Height (dy)" msgstr "Hauteur (dy)" #: guiqwt\styles.py:1244 guiqwt\styles.py:1254 msgid "Translate, rotate and flip" msgstr "Translation, rotation et symétrie" #: guiqwt\styles.py:1245 msgid "xCENTER" msgstr "xCENTRE" #: guiqwt\styles.py:1247 guiqwt\tests\sift.py:794 msgid "Flip horizontally" msgstr "Symétrie horizontale" #: guiqwt\styles.py:1249 msgid "yCENTER" msgstr "yCENTRE" #: guiqwt\styles.py:1251 guiqwt\tests\sift.py:796 msgid "Flip vertically" msgstr "Symétrie verticale" #: guiqwt\styles.py:1253 msgid "θ (°)" msgstr "θ (°)" #: guiqwt\styles.py:1307 msgid "Bins" msgstr "Classes" #: guiqwt\styles.py:1307 msgid "Number of bins" msgstr "Nombre de classes" #: guiqwt\styles.py:1308 msgid "Y-axis scale" msgstr "Échelle en y" #: guiqwt\styles.py:1327 msgid "X-axis bins" msgstr "Classes en x" #: guiqwt\styles.py:1328 msgid "Number of bins along x-axis" msgstr "Nombre de classes le long de l'axe des abscisses" #: guiqwt\styles.py:1329 msgid "Y-axis bins" msgstr "Classes en y" #: guiqwt\styles.py:1330 msgid "Number of bins along y-axis" msgstr "Nombre de classes le long de l'axes des ordonnées" #: guiqwt\styles.py:1331 msgid "Z-axis scale" msgstr "Échelle en z" #: guiqwt\styles.py:1334 msgid "Bin count" msgstr "Effectif total" #: guiqwt\styles.py:1335 msgid "Maximum value" msgstr "Valeur maximale" #: guiqwt\styles.py:1336 msgid "Mininum value" msgstr "Valeur minimale" #: guiqwt\styles.py:1337 guiqwt\tests\sift.py:252 msgid "Sum" msgstr "Addition" #: guiqwt\styles.py:1338 guiqwt\tests\sift.py:257 msgid "Product" msgstr "Produit" #: guiqwt\styles.py:1339 guiqwt\tests\sift.py:253 guiqwt\tests\sift.py:389 msgid "Average" msgstr "Moyenne" #: guiqwt\styles.py:1342 msgid "" "Bin count : counts the number of points per bin,\n" "For max, min, sum, product, average, compute the function of a third " "parameter (one by default)" msgstr "" #: guiqwt\styles.py:1345 msgid "Automatic LUT range" msgstr "Ajustement automatique de la LUT" #: guiqwt\styles.py:1346 msgid "Automatically adapt color scale when panning, zooming" msgstr "Ajuste automatiquement l'échelle de couleur (déplacement, zoom)" #: guiqwt\styles.py:1349 msgid "Background color when no data is present" msgstr "Couleur de fond en l'absence de données" #: guiqwt\styles.py:1375 guiqwt\styles.py:1435 guiqwt\styles.py:1568 msgid "Line (not selected)" msgstr "Trait (hors sélection)" #: guiqwt\styles.py:1376 guiqwt\styles.py:1436 guiqwt\styles.py:1569 msgid "Line (selected)" msgstr "Trait (sélection)" #: guiqwt\styles.py:1380 guiqwt\styles.py:1440 guiqwt\styles.py:1573 msgid "Symbol (not selected)" msgstr "Symbole (hors sélection)" #: guiqwt\styles.py:1381 guiqwt\styles.py:1441 guiqwt\styles.py:1574 msgid "Symbol (selected)" msgstr "Symbole (sélection)" #: guiqwt\styles.py:1385 msgid "Text (not selected)" msgstr "Texte (hors sélection)" #: guiqwt\styles.py:1386 msgid "Text (selected)" msgstr "Texte (sélection)" #: guiqwt\styles.py:1390 guiqwt\tests\styles.py:63 guiqwt\tests\styles.py:68 #: guiqwt\tests\styles.py:75 guiqwt\tests\styles.py:77 #: guiqwt\tests\styles.py:82 guiqwt\tests\styles.py:85 msgid "Line style" msgstr "Style de trait" #: guiqwt\styles.py:1392 msgid "Spacing" msgstr "Espacement" #: guiqwt\styles.py:1444 guiqwt\styles.py:1448 guiqwt\styles.py:1496 #: guiqwt\styles.py:1500 msgid "Fill pattern" msgstr "Motif de remplissage" #: guiqwt\styles.py:1446 msgid "Fill pattern (not selected)" msgstr "Motif de remplissage (hors sélection)" #: guiqwt\styles.py:1447 msgid "Fill pattern (selected)" msgstr "Motif de remplissage (sélection)" #: guiqwt\styles.py:1451 guiqwt\styles.py:1532 msgid "Read-only shape" msgstr "Lecture seule" #: guiqwt\styles.py:1452 guiqwt\styles.py:1533 msgid "Read-only shapes can't be removed from the item list panel" msgstr "" "Les formes en lecture seule ne peuvent pas être supprimer du panneau de " "liste des objets" #: guiqwt\styles.py:1454 guiqwt\styles.py:1535 msgid "Private shape" msgstr "Forme privée" #: guiqwt\styles.py:1455 guiqwt\styles.py:1536 msgid "Private shapes are not shown in the item list panel" msgstr "" "Les formes privées ne sont pas affichées dans le panneau de liste des objets" #: guiqwt\styles.py:1487 msgid "Arrow angle (°)" msgstr "Angle de la flèche (°)" #: guiqwt\styles.py:1488 msgid "Arrow size (%)" msgstr "Taille de la flèche (%)" #: guiqwt\styles.py:1492 msgid "Line (X-Axis)" msgstr "Trait (axes des x)" #: guiqwt\styles.py:1493 msgid "Line (Y-Axis)" msgstr "Trait (axes des y)" #: guiqwt\styles.py:1498 msgid "Fill pattern (X-Axis)" msgstr "Motif de remplissage (axes des x)" #: guiqwt\styles.py:1499 msgid "Fill pattern (Y-Axis)" msgstr "Motif de remplissage (axes des y)" #: guiqwt\styles.py:1521 msgid "Show annotation" msgstr "Afficher l'annotation" #: guiqwt\styles.py:1522 msgid "Show informations on area covered by this shape" msgstr "Afficher les informations sur cette région d'intérêt" #: guiqwt\styles.py:1525 msgid "Subtitle" msgstr "Sous-titre" #: guiqwt\styles.py:1526 msgid "String formatting" msgstr "Format" #: guiqwt\styles.py:1527 msgid "Uncertainty" msgstr "Incertitude" #: guiqwt\styles.py:1528 msgid "Measurement relative uncertainty" msgstr "Incertitude relative de mesure" #: guiqwt\styles.py:1530 msgid "Transform matrix" msgstr "Matrice de transformation" #: guiqwt\styles.py:1577 guiqwt\styles.py:1581 msgid "Fill" msgstr "Remplissage" #: guiqwt\styles.py:1579 msgid "Fill color" msgstr "Couleur de remplissage" #: guiqwt\styles.py:1580 msgid "Shade" msgstr "Ombre" #: guiqwt\tests\get_point.py:31 msgid "Select one point then press OK to accept" msgstr "Sélectionnez un point puis appuyer sur OK pour valider" #: guiqwt\tests\get_segment.py:29 msgid "Select a segment then press OK to accept" msgstr "Sélectionnez un segment puis appuyer sur OK pour valider" #: guiqwt\tests\hist2d.py:23 guiqwt\tests\hist2d_func.py:24 #: guiqwt\tools.py:1337 msgid "Markers" msgstr "Marqueurs" #: guiqwt\tests\mandelbrot.py:25 msgid "MAX resolution" msgstr "Résolution MAX" #: guiqwt\tests\sift.py:45 msgid "Sift" msgstr "Sift" #: guiqwt\tests\sift.py:46 msgid "" "Signal and Image Filtering Tool
\n" "Simple signal and image processing application based on guiqwt and guidata" msgstr "" #: guiqwt\tests\sift.py:100 guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163 #: guiqwt\tests\sift.py:173 guiqwt\tests\simple_window.py:39 msgid "Untitled" msgstr "Sans titre" #: guiqwt\tests\sift.py:101 guiqwt\tests\sift.py:164 #: guiqwt\tests\simple_window.py:40 guiqwt\widgets\fit.py:416 msgid "Data" msgstr "Données" #: guiqwt\tests\sift.py:117 msgid "Signal size (total number of points)" msgstr "Nombre de points" #: guiqwt\tests\sift.py:119 guiqwt\tests\sift.py:182 #: guiqwt\tests\simple_window.py:52 msgid "Type" msgstr "Type" #: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:183 #: guiqwt\tests\simple_window.py:53 msgid "zeros" msgstr "zéros" #: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:184 #: guiqwt\tests\simple_window.py:53 msgid "random" msgstr "aléatoire" #: guiqwt\tests\sift.py:121 msgid "gaussian" msgstr "gaussienne" #: guiqwt\tests\sift.py:165 msgid "Metadata" msgstr "Métadonnées" #: guiqwt\tests\sift.py:174 msgid "Image height (total number of rows)" msgstr "Hauteur de l'image (nombre de lignes)" #: guiqwt\tests\sift.py:174 guiqwt\tests\simple_dialog.py:29 #: guiqwt\tests\simple_window.py:45 msgid "Height" msgstr "Hauteur" #: guiqwt\tests\sift.py:176 msgid "Image width (total number of columns)" msgstr "Largeur de l'image (nombre de colonnes)" #: guiqwt\tests\sift.py:178 msgid "Data type" msgstr "Type de données" #: guiqwt\tests\sift.py:183 msgid "empty" msgstr "vide" #: guiqwt\tests\sift.py:221 guiqwt\tests\simple_window.py:60 msgid "Properties" msgstr "Propriétés" #: guiqwt\tests\sift.py:241 msgid "Duplicate" msgstr "Dupliquer" #: guiqwt\tests\sift.py:255 msgid "Difference" msgstr "Soustraction" #: guiqwt\tests\sift.py:259 msgid "Division" msgstr "Division" #: guiqwt\tests\sift.py:381 guiqwt\tests\sift.py:402 guiqwt\tests\sift.py:423 #: guiqwt\tests\sift.py:440 guiqwt\tests\sift.py:457 guiqwt\tests\sift.py:495 #: guiqwt\tests\sift.py:978 msgid "Error:" msgstr "Erreur:" #: guiqwt\tests\sift.py:484 msgid "Computing:" msgstr "Calcul en cours :" #: guiqwt\tests\sift.py:510 msgid "New signal..." msgstr "Nouveau signal..." #: guiqwt\tests\sift.py:512 guiqwt\tests\sift.py:670 msgid "Create a new signal" msgstr "Créer un nouveau signal" #: guiqwt\tests\sift.py:514 msgid "Open signal..." msgstr "Ouvrir un signal..." #: guiqwt\tests\sift.py:516 msgid "Open a signal" msgstr "Ouvrir un signal" #: guiqwt\tests\sift.py:518 msgid "Save signal..." msgstr "Enregistrer le signal..." #: guiqwt\tests\sift.py:520 msgid "Save selected signal" msgstr "Enregistrer le signal sélectionné" #: guiqwt\tests\sift.py:526 guiqwt\tests\sift.py:588 guiqwt\tests\sift.py:806 #: guiqwt\tests\sift.py:957 msgid "ROI extraction" msgstr "Extraction de ROI" #: guiqwt\tests\sift.py:528 guiqwt\tests\sift.py:808 msgid "Swap X/Y axes" msgstr "Permuter les axes X/Y" #: guiqwt\tests\sift.py:534 guiqwt\tests\sift.py:623 msgid "Normalize" msgstr "Normaliser" #: guiqwt\tests\sift.py:536 guiqwt\tests\sift.py:635 guiqwt\tests\sift.py:823 #: guiqwt\tests\sift.py:987 msgid "Linear calibration" msgstr "Étalonnage linéaire" #: guiqwt\tests\sift.py:538 guiqwt\tests\sift.py:654 guiqwt\tests\sift.py:829 #: guiqwt\tests\sift.py:1012 msgid "Gaussian filter" msgstr "Filtre gaussien" #: guiqwt\tests\sift.py:540 guiqwt\tests\sift.py:831 msgid "Wiener filter" msgstr "Filtre de Wiener" #: guiqwt\tests\sift.py:542 guiqwt\tests\sift.py:833 msgid "FFT" msgstr "FFT" #: guiqwt\tests\sift.py:543 guiqwt\tests\sift.py:546 guiqwt\tests\sift.py:834 #: guiqwt\tests\sift.py:837 msgid "Warning: only real part is plotted" msgstr "Attention : seulement la partie réelles sera tracée" #: guiqwt\tests\sift.py:545 guiqwt\tests\sift.py:836 msgid "Inverse FFT" msgstr "FFT inverse" #: guiqwt\tests\sift.py:586 guiqwt\tests\sift.py:953 msgid "First row index" msgstr "Indice de la première ligne" #: guiqwt\tests\sift.py:587 guiqwt\tests\sift.py:954 msgid "Last row index" msgstr "Indice de la dernière ligne" #: guiqwt\tests\sift.py:617 msgid "maximum" msgstr "maximum" #: guiqwt\tests\sift.py:618 msgid "amplitude" msgstr "amplitude" #: guiqwt\tests\sift.py:619 msgid "sum" msgstr "intégrale" #: guiqwt\tests\sift.py:620 msgid "energy" msgstr "énergie" #: guiqwt\tests\sift.py:622 msgid "Normalize with respect to" msgstr "Normaliser par rapport à" #: guiqwt\tests\sift.py:630 msgid "X-axis" msgstr "Axe des X" #: guiqwt\tests\sift.py:630 msgid "Y-axis" msgstr "Axe des Y" #: guiqwt\tests\sift.py:632 msgid "Calibrate" msgstr "Étalonner" #: guiqwt\tests\sift.py:690 msgid "New gaussian function" msgstr "Nouvelle gaussienne" #: guiqwt\tests\sift.py:753 msgid "CSV files" msgstr "Fichiers CSV" #: guiqwt\tests\sift.py:777 msgid "New image..." msgstr "Nouvelle image..." #: guiqwt\tests\sift.py:779 guiqwt\tests\sift.py:1027 #: guiqwt\tests\simple_window.py:171 guiqwt\tests\simple_window.py:212 msgid "Create a new image" msgstr "Créer une nouvelle image" #: guiqwt\tests\sift.py:781 msgid "Open image..." msgstr "Ouvrir une image..." #: guiqwt\tests\sift.py:783 guiqwt\tests\simple_window.py:176 msgid "Open an image" msgstr "Ouvrir une image" #: guiqwt\tests\sift.py:785 msgid "Save image..." msgstr "Enregistrer l'image..." #: guiqwt\tests\sift.py:787 msgid "Save selected image" msgstr "Enregistre l'image sélectionnée" #: guiqwt\tests\sift.py:793 guiqwt\tests\sift.py:885 msgid "Rotation" msgstr "Rotation" #: guiqwt\tests\sift.py:798 msgid "Rotate 90° right" msgstr "Rotation inverse de 90°" #: guiqwt\tests\sift.py:800 msgid "Rotate 90° left" msgstr "Rotation directe de 90°" #: guiqwt\tests\sift.py:802 msgid "Rotate arbitrarily..." msgstr "Rotation arbitraire..." #: guiqwt\tests\sift.py:804 guiqwt\tests\sift.py:937 #: guiqwt\widgets\resizedialog.py:98 msgid "Resize" msgstr "Redimensionner" #: guiqwt\tests\sift.py:810 msgid "Flat-field correction" msgstr "Correction de champ plat" #: guiqwt\tests\sift.py:825 guiqwt\tests\sift.py:995 msgid "Thresholding" msgstr "Seuillage" #: guiqwt\tests\sift.py:827 guiqwt\tests\sift.py:1002 msgid "Clipping" msgstr "Écrêtage" #: guiqwt\tests\sift.py:870 guiqwt\tests\sift.py:926 msgid "Mode" msgstr "Mode" #: guiqwt\tests\sift.py:872 guiqwt\tests\sift.py:928 msgid "cval" msgstr "cval" #: guiqwt\tests\sift.py:873 guiqwt\tests\sift.py:929 msgid "" "Value used for points outside the boundaries of the input if mode is " "'constant'" msgstr "" "Valeur utilisée pour les points situés en dehors des frontières de l'image " "d'origine (si le mode est 'constant')" #: guiqwt\tests\sift.py:876 msgid "Reshape the output array" msgstr "Redimensionner l'image de destination" #: guiqwt\tests\sift.py:877 msgid "" "Reshape the output array so that the input array is contained completely in " "the output" msgstr "" "Redimensionner l'image de destination de sorte qu'elle puisse contenir la " "totalité de l'image source" #: guiqwt\tests\sift.py:880 guiqwt\tests\sift.py:932 msgid "Prefilter the input image" msgstr "Prétraitement de l'image d'origine (spline)" #: guiqwt\tests\sift.py:882 guiqwt\tests\sift.py:934 msgid "Order" msgstr "Ordre" #: guiqwt\tests\sift.py:883 guiqwt\tests\sift.py:935 msgid "Spline interpolation order" msgstr "Ordre de l'interpolation de type spline" #: guiqwt\tests\sift.py:913 msgid "Warning:" msgstr "" #: guiqwt\tests\sift.py:919 guiqwt\tools.py:1556 msgid "Destination size:" msgstr "Taille de destination :" #: guiqwt\tests\sift.py:925 msgid "Zoom" msgstr "Zoom" #: guiqwt\tests\sift.py:955 msgid "First column index" msgstr "Indice de la première colonne" #: guiqwt\tests\sift.py:956 msgid "Last column index" msgstr "Indice de la dernière colonne" #: guiqwt\tests\sift.py:993 msgid "Threshold" msgstr "Seuil" #: guiqwt\tests\sift.py:1000 msgid "Clipping value" msgstr "Valeur d'écrêtage" #: guiqwt\tests\sift.py:1162 msgid "Welcome to %s!" msgstr "Bienvenue dans %s !" #: guiqwt\tests\sift.py:1164 msgid "Signal Processing Toolbar" msgstr "Barre d'outils de traitement du signal" #: guiqwt\tests\sift.py:1165 msgid "Image Processing Toolbar" msgstr "Barre d'outils de traitement d'image" #: guiqwt\tests\sift.py:1168 msgid "Curve Plotting Toolbar" msgstr "Barre d'outils d'affichage de courbes" #: guiqwt\tests\sift.py:1177 msgid "Image Visualization Toolbar" msgstr "Barre d'outils d'affichage d'images" #: guiqwt\tests\sift.py:1190 msgid "Signals" msgstr "Signaux" #: guiqwt\tests\sift.py:1192 msgid "Images" msgstr "Images" #: guiqwt\tests\sift.py:1193 msgid "Main panel" msgstr "Panneau principal" #: guiqwt\tests\sift.py:1196 msgid "Curve plotting panel" msgstr "Panneau d'affichage de courbes" #: guiqwt\tests\sift.py:1198 msgid "Image visualization panel" msgstr "Panneau d'affichage d'images" #: guiqwt\tests\sift.py:1207 guiqwt\tests\simple_window.py:178 msgid "Quit" msgstr "Quitter" #: guiqwt\tests\sift.py:1209 guiqwt\tests\simple_window.py:181 msgid "Quit application" msgstr "Quitter l'application" #: guiqwt\tests\sift.py:1211 guiqwt\tests\simple_window.py:167 msgid "File" msgstr "Fichier" #: guiqwt\tests\sift.py:1215 msgid "&Edit" msgstr "&Édition" #: guiqwt\tests\sift.py:1219 msgid "Operations" msgstr "Opérations" #: guiqwt\tests\sift.py:1223 msgid "Processing" msgstr "Traitement" #: guiqwt\tests\sift.py:1240 msgid "Console" msgstr "Console" #: guiqwt\tests\sift.py:1249 msgid "&View" msgstr "&Affichage" #: guiqwt\tests\sift.py:1254 guiqwt\tests\simple_window.py:187 msgid "About..." msgstr "À propos..." #: guiqwt\tests\sift.py:1313 guiqwt\tests\simple_window.py:202 msgid "About " msgstr "À propos de " #: guiqwt\tests\sift.py:1317 guiqwt\tests\simple_window.py:206 msgid "Developped by" msgstr "Développé par" #: guiqwt\tests\sift.py:1319 guiqwt\tests\simple_window.py:207 msgid "on" msgstr "sous" #: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42 msgid "Image width (pixels)" msgstr "Largeur de l'image (pixels)" #: guiqwt\tests\simple_dialog.py:29 guiqwt\tests\simple_window.py:45 msgid "Image height (pixels)" msgstr "Hauteur de l'image (pixels)" #: guiqwt\tests\simple_dialog.py:33 msgid "Filter algorithm" msgstr "Algorithme de filtrage" #: guiqwt\tests\simple_dialog.py:35 msgid "gaussian filter" msgstr "filtre gaussien" #: guiqwt\tests\simple_dialog.py:36 msgid "uniform filter" msgstr "filtre uniforme" #: guiqwt\tests\simple_dialog.py:37 msgid "minimum filter" msgstr "filtre minimum" #: guiqwt\tests\simple_dialog.py:38 msgid "median filter" msgstr "filtre médian" #: guiqwt\tests\simple_dialog.py:39 msgid "maximum filter" msgstr "filtre maximum" #: guiqwt\tests\simple_dialog.py:41 msgid "Size or sigma" msgstr "Taille ou sigma" #: guiqwt\tests\simple_dialog.py:44 msgid "Example dialog box" msgstr "Exemple de boîte de dialogue" #: guiqwt\tests\simple_dialog.py:62 msgid "Filter parameters" msgstr "Paramètres du filtre" #: guiqwt\tests\simple_dialog.py:67 msgid "Image parameters" msgstr "Paramètres de l'image" #: guiqwt\tests\simple_dialog.py:70 msgid "z-axis scale label" msgstr "Échelle en z" #: guiqwt\tests\simple_window.py:33 msgid "Application example" msgstr "Exemple d'application" #: guiqwt\tests\simple_window.py:164 msgid "Welcome to guiqwt application example!" msgstr "Bienvenue dans l'exemple d'application de guiqwt !" #: guiqwt\tests\simple_window.py:168 msgid "New..." msgstr "Nouveau..." #: guiqwt\tests\simple_window.py:173 guiqwt\tools.py:1707 msgid "Open..." msgstr "Ouvrir..." #: guiqwt\tools.py:450 msgid "Selection" msgstr "Sélection" #: guiqwt\tools.py:476 msgid "Point selection" msgstr "Sélection d'un point" #: guiqwt\tools.py:559 msgid "Polyline" msgstr "Ligne brisée" #: guiqwt\tools.py:669 msgid "Free form" msgstr "Forme libre" #: guiqwt\tools.py:718 msgid "Label text" msgstr "Texte de l'étiquette" #: guiqwt\tools.py:847 msgid "Rectangle" msgstr "Rectangle" #: guiqwt\tools.py:851 msgid "Oblique rectangle" msgstr "Rectangle oblique" #: guiqwt\tools.py:860 msgid "Point" msgstr "Point" #: guiqwt\tools.py:869 msgid "Segment" msgstr "Segment" #: guiqwt\tools.py:878 msgid "Circle" msgstr "Cercle" #: guiqwt\tools.py:972 msgid "Image statistics" msgstr "Statistiques de l'image" #: guiqwt\tools.py:1067 msgid "Average cross section" msgstr "Profil rectiligne moyen" #: guiqwt\tools.py:1088 msgid "Rectangle zoom" msgstr "Zoom rectangulaire" #: guiqwt\tools.py:1151 msgid "Horizontal selection" msgstr "Sélection horizontale" #: guiqwt\tools.py:1158 msgid "Vertical cursor" msgstr "Curseur vertical" #: guiqwt\tools.py:1167 msgid "Horizontal cursor" msgstr "Curseur horizontal" #: guiqwt\tools.py:1176 msgid "Cross cursor" msgstr "Curseur croix" #: guiqwt\tools.py:1186 msgid "Signal statistics" msgstr "Statistiques du signal" #: guiqwt\tools.py:1324 msgid "Antialiasing (curves)" msgstr "Anticrénelage (courbes)" #: guiqwt\tools.py:1345 msgid "Free" msgstr "Libre" #: guiqwt\tools.py:1347 msgid "Bound to active item" msgstr "Lié à l'objet actif" #: guiqwt\tools.py:1369 msgid "Reverse Y axis" msgstr "Inverser l'axe des ordonnées" #: guiqwt\tools.py:1382 msgid "Lock aspect ratio" msgstr "Verrouiller le rapport hauteur/largeur" #: guiqwt\tools.py:1383 msgid "Current value" msgstr "Valeur actuelle" #: guiqwt\tools.py:1384 msgid "Lock value" msgstr "Valeur imposée" #: guiqwt\tools.py:1388 guiqwt\tools.py:1394 msgid "Aspect ratio" msgstr "Rapport hauteur/largeur" #: guiqwt\tools.py:1396 msgid "Lock" msgstr "Verrouiller" #: guiqwt\tools.py:1398 msgid "1:1" msgstr "Rapport unité" #: guiqwt\tools.py:1400 msgid "Edit..." msgstr "Modifier..." #: guiqwt\tools.py:1472 msgid "Contrast adjustment" msgstr "Réglage du contraste" #: guiqwt\tools.py:1485 msgid "X-axis cross section" msgstr "Profil selon l'axe des abscisses" #: guiqwt\tools.py:1489 msgid "Y-axis cross section" msgstr "Profil selon l'axe des ordonnées" #: guiqwt\tools.py:1503 msgid "Save as..." msgstr "Enregistrer sous..." #: guiqwt\tools.py:1511 msgid "PNG image" msgstr "Image PNG" #: guiqwt\tools.py:1517 msgid "PDF document" msgstr "Document PDF" #: guiqwt\tools.py:1518 guiqwt\tools.py:1615 guiqwt\tools.py:1739 msgid "untitled" msgstr "sanstitre" #: guiqwt\tools.py:1525 msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" #: guiqwt\tools.py:1545 guiqwt\tools.py:1578 guiqwt\tools.py:1645 msgid "Rectangle snapshot" msgstr "Capture rectangulaire" #: guiqwt\tools.py:1546 msgid "There is no supported image item in current selection." msgstr "La sélection ne contient aucun objet image pris en charge." #: guiqwt\tools.py:1563 guiqwt\tools.py:1570 msgid "Image levels adjustments" msgstr "Modification des niveaux de l'image" #: guiqwt\tools.py:1564 msgid "Apply contrast settings" msgstr "Appliquer les réglages de contraste" #: guiqwt\tools.py:1566 msgid "Apply interpolation algorithm" msgstr "Appliquer l'algorithme d'interpolation" #: guiqwt\tools.py:1568 msgid "Scale levels to maximum range" msgstr "Normaliser (utiliser la totalité de la dynamique)" #: guiqwt\tools.py:1571 guiqwt\tools.py:1576 msgid "Superimposed images" msgstr "Images superposées" #: guiqwt\tools.py:1572 msgid "If image B is behind image A, replace intersection by" msgstr "Si l'image B est derrière l'image A, remplacer l'intersection par" #: guiqwt\tools.py:1604 msgid "Memory error" msgstr "Mémoire insuffisante" #: guiqwt\tools.py:1605 msgid "" "There is not enough memory left to process this %d x %d image (%d MB would " "be required)." msgstr "" "La quantité de mémoire disponible n'est pas suffisante pour traiter cette " "image de %d x %d pixels (%d Mo seraient nécessaires)" #: guiqwt\tools.py:1659 msgid "Rotate and crop" msgstr "Rotation et rognage" #: guiqwt\tools.py:1687 msgid "Print..." msgstr "Imprimer..." #: guiqwt\tools.py:1734 msgid "Save items" msgstr "Enregistrer les objets guiqwt" #: guiqwt\tools.py:1739 msgid "Save items as" msgstr "Enregistrer les objets guiqwt sous" #: guiqwt\tools.py:1740 msgid "guiqwt items" msgstr "Objets guiqwt" #: guiqwt\tools.py:1748 msgid "Load items" msgstr "Charger les objets guiqwt" #: guiqwt\tools.py:1764 msgid "Open image" msgstr "Ouvrir une image" #: guiqwt\tools.py:1826 guiqwt\tools.py:1832 msgid "Help" msgstr "Aide" #: guiqwt\tools.py:1833 msgid "" "Keyboard/mouse shortcuts:\n" " - single left-click: item (curve, image, ...) selection\n" " - single right-click: context-menu relative to selected item\n" " - shift: on-active-curve (or image) cursor\n" " - alt: free cursor\n" " - left-click + mouse move: move item (when available)\n" " - middle-click + mouse move: pan\n" " - right-click + mouse move: zoom" msgstr "" "Raccourcis clavier et souris :\n" " - clique gauche : sélection d'une courbe\n" " - clique droit : menu contextuel\n" " - shift : affichage d'un curseur sur la courbe ou l'image sélectionnée\n" " - alt : curseur libre\n" " - clique gauche + déplacement souris : déplacement de l'objet actif (si " "possible)\n" " - clique du milieu + déplacement souris : translation dans le plan " "('pan')\n" " - clique droit + déplacement souris : agrandissement ('zoom')" #: guiqwt\tools.py:1892 guiqwt\tools.py:1900 msgid "Export" msgstr "Exporter" #: guiqwt\tools.py:1895 msgid "Text file" msgstr "Fichier texte" #: guiqwt\tools.py:1901 msgid "Unable to export item data." msgstr "Impossible d'exporter les données de l'objet sélectionné." #: guiqwt\tools.py:1902 msgid "Error message:" msgstr "Message d'erreur :" #: guiqwt\tools.py:1911 msgid "Export data..." msgstr "Exporter les données..." #: guiqwt\tools.py:1954 msgid "Edit data..." msgstr "Modifier les données..." #: guiqwt\tools.py:1963 msgid "Center items" msgstr "Centrer des objets" #: guiqwt\tools.py:2033 msgid "Select colormap for active image" msgstr "Sélectionne l'échelle de couleurs de l'image active" #: guiqwt\tools.py:2102 msgid "Manage image masking areas" msgstr "Gestion des zones de masquage" #: guiqwt\tools.py:2111 msgid "Mask rectangular area (inside)" msgstr "Masquer l'intérieur d'une zone rectangulaire" #: guiqwt\tools.py:2116 msgid "Mask rectangular area (outside)" msgstr "Masquer l'extérieur d'une zone rectangulaire" #: guiqwt\tools.py:2121 msgid "Mask circular area (inside)" msgstr "Masquer l'intérieur d'une zone circulaire" #: guiqwt\tools.py:2126 msgid "Mask circular area (outside)" msgstr "Masquer l'extérieur d'une zone circulaire" #: guiqwt\tools.py:2132 msgid "Show masking shapes" msgstr "Afficher les formes de masquage" #: guiqwt\tools.py:2135 msgid "Apply mask" msgstr "Appliquer le masque" #: guiqwt\tools.py:2138 guiqwt\tools.py:2262 msgid "Clear mask" msgstr "Effacer le masque" #: guiqwt\tools.py:2141 guiqwt\tools.py:2186 msgid "Remove all masking shapes" msgstr "Supprimer toutes les formes de masquage" #: guiqwt\tools.py:2184 msgid "Do you really want to remove all masking shapes?" msgstr "Souhaitez-vous vraiment supprimer toutes les formes de masquage ?" #: guiqwt\tools.py:2260 msgid "Do you really want to clear the mask?" msgstr "Souhaitez-vous vraiment effacer le masque ?" #: guiqwt\widgets\base.py:44 msgid "Reset" msgstr "Réinitialiser" #: guiqwt\widgets\base.py:53 msgid "Apply" msgstr "Appliquer" #: guiqwt\widgets\base.py:149 msgid "Rotate & Crop" msgstr "Rotation & rognage" #: guiqwt\widgets\fit.py:71 msgid "Method" msgstr "Méthode" #: guiqwt\widgets\fit.py:74 msgid "Conjugate Gradient" msgstr "Gradient conjugué" #: guiqwt\widgets\fit.py:75 msgid "Least squares" msgstr "Moindres carrés" #: guiqwt\widgets\fit.py:78 msgid "for simplex, powel, cg and bfgs norm used by the error function" msgstr "" #: guiqwt\widgets\fit.py:81 guiqwt\widgets\fit.py:83 msgid "for simplex, powel, least squares" msgstr "" #: guiqwt\widgets\fit.py:84 msgid "for cg, bfgs" msgstr "" #: guiqwt\widgets\fit.py:86 msgid "for cg, bfgs. inf is max, -inf is min" msgstr "" #: guiqwt\widgets\fit.py:90 msgid "Name" msgstr "Nom" #: guiqwt\widgets\fit.py:91 msgid "Value" msgstr "Valeur" #: guiqwt\widgets\fit.py:92 msgid "Min" msgstr "Min" #: guiqwt\widgets\fit.py:93 msgid "Max" msgstr "Max" #: guiqwt\widgets\fit.py:95 msgid "Format" msgstr "Format" #: guiqwt\widgets\fit.py:96 msgid "Logarithmic" msgstr "logarithmique" #: guiqwt\widgets\fit.py:118 msgid "Curve fitting parameter" msgstr "Paramètre d'ajustement" #: guiqwt\widgets\fit.py:135 msgid "Edit '%s' fit parameter properties" msgstr "Modifier les propriétés du paramètre d'ajustement '%s'" #: guiqwt\widgets\fit.py:257 msgid "Curve fitting" msgstr "Ajustement de courbes" #: guiqwt\widgets\fit.py:296 msgid "Fit parameters" msgstr "Paramètres d'ajustement" #: guiqwt\widgets\fit.py:329 msgid "Automatic fitting options" msgstr "Options d'ajustement automatique" #: guiqwt\widgets\fit.py:359 msgid "Run" msgstr "Ajuster" #: guiqwt\widgets\fit.py:361 msgid "Settings" msgstr "Options" #: guiqwt\widgets\fit.py:372 msgid "Automatic fit" msgstr "Ajustement automatique" #: guiqwt\widgets\fit.py:422 msgid "Fit" msgstr "Ajustement" #: guiqwt\widgets\fliprotate.py:50 msgid "Angle (°):" msgstr "Angle (°) :" #: guiqwt\widgets\fliprotate.py:61 msgid "Flip:" msgstr "Retournement :" #: guiqwt\widgets\resizedialog.py:77 msgid "Original size" msgstr "Taille d'origine" #: guiqwt\widgets\resizedialog.py:79 msgid "Width (pixels)" msgstr "Largeur (pixels)" #: guiqwt\widgets\resizedialog.py:80 msgid "Height (pixels)" msgstr "Hauteur (pixels)" #: guiqwt\widgets\resizedialog.py:83 msgid "Original size:" msgstr "Taille d'origine :" #: guiqwt\widgets\resizedialog.py:85 msgid "Zoom factor:" msgstr "Facteur de zoom :" #: guiqwt\widgets\rotatecrop.py:49 msgid "Show cropping rectangle" msgstr "Afficher le rectangle de rognage" #: guiqwt\widgets\rotatecrop.py:59 msgid "Cropping rectangle" msgstr "Rectangle de rognage" #~ msgid "Draws y as a function of x" #~ msgstr "Tracé de y en fonction de x" #~ msgid "Draws x as a function of y" #~ msgstr "Tracé de x en fonction de y" #~ msgid "Fit curve to data" #~ msgstr "Ajuster la courbe aux données" #~ msgid "Fitting" #~ msgstr "Ajustement" #~ msgid "Curve type" #~ msgstr "Type de courbe" #~ msgid "A" #~ msgstr "A" #~ msgid "A+B" #~ msgstr "A+B" #~ msgid "16-bits DICOM image" #~ msgstr "Image DICOM 16 bits" #~ msgid "16-bits TIFF image" #~ msgstr "Image TIFF 16 bits" #~ msgid "Keep the original size" #~ msgstr "Conserver la taille d'origine" #~ msgid "Both" #~ msgstr "Les deux" #~ msgid "There is no cross section plot to export." #~ msgstr "Aucun profil n'est actuellement affiché." #~ msgid "Please select a cross section plot." #~ msgstr "Merci de sélectionner le profil à exporter." #~ msgid "Unable to export cross section data." #~ msgstr "Impossible d'exporter les données du profil." #~ msgid "Export cross section data" #~ msgstr "Exporter les données d'un profil" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1445764046.0 guiqwt-4.0.1/guiqwt/locale/guiqwt.pot0000666000000000000000000012611300000000000014556 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2015-10-25 10:07+Paris, Madrid\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" "Generated-By: pygettext.py 1.5\n" #: guiqwt\annotations.py:104 guiqwt\annotations.py:133 guiqwt\builder.py:1073 msgid "Annotation" msgstr "" #: guiqwt\annotations.py:157 guiqwt\builder.py:863 guiqwt\label.py:95 #: guiqwt\label.py:114 guiqwt\tools.py:684 guiqwt\tools.py:717 msgid "Label" msgstr "" #: guiqwt\annotations.py:407 msgid "Distance:" msgstr "" #: guiqwt\annotations.py:459 guiqwt\annotations.py:536 #: guiqwt\annotations.py:615 guiqwt\annotations.py:638 msgid "Center:" msgstr "" #: guiqwt\annotations.py:460 guiqwt\annotations.py:537 #: guiqwt\annotations.py:616 msgid "Size:" msgstr "" #: guiqwt\annotations.py:538 guiqwt\annotations.py:617 msgid "Angle:" msgstr "" #: guiqwt\annotations.py:639 msgid "Diameter:" msgstr "" #: guiqwt\baseplot.py:91 msgid "Grid..." msgstr "" #: guiqwt\baseplot.py:92 msgid "Axes style..." msgstr "" #: guiqwt\baseplot.py:93 guiqwt\curve.py:1126 msgid "Parameters..." msgstr "" #: guiqwt\baseplot.py:172 guiqwt\styles.py:736 guiqwt\styles.py:781 #: guiqwt\styles.py:1232 msgid "Left" msgstr "" #: guiqwt\baseplot.py:173 guiqwt\styles.py:737 guiqwt\styles.py:782 #: guiqwt\styles.py:1233 msgid "Right" msgstr "" #: guiqwt\baseplot.py:174 guiqwt\styles.py:739 guiqwt\styles.py:784 #: guiqwt\styles.py:1235 msgid "Bottom" msgstr "" #: guiqwt\baseplot.py:175 guiqwt\styles.py:738 guiqwt\styles.py:783 #: guiqwt\styles.py:1234 msgid "Top" msgstr "" #: guiqwt\baseplot.py:452 msgid "Unknown file extension" msgstr "" #: guiqwt\baseplot.py:853 guiqwt\shapes.py:1183 guiqwt\shapes.py:1211 #: guiqwt\tools.py:898 msgid "Axes" msgstr "" #: guiqwt\baseplot.py:854 msgid "Axes associated to selected item" msgstr "" #: guiqwt\baseplot.py:884 guiqwt\styles.py:557 guiqwt\styles.py:563 #: guiqwt\styles.py:646 guiqwt\styles.py:668 msgid "Y Axis" msgstr "" #: guiqwt\baseplot.py:886 guiqwt\styles.py:556 guiqwt\styles.py:562 #: guiqwt\styles.py:641 guiqwt\styles.py:664 msgid "X Axis" msgstr "" #: guiqwt\builder.py:125 guiqwt\curve.py:227 guiqwt\curve.py:1387 #: guiqwt\curve.py:1416 msgid "Grid" msgstr "" #: guiqwt\builder.py:306 guiqwt\builder.py:373 guiqwt\builder.py:394 #: guiqwt\builder.py:476 guiqwt\builder.py:511 guiqwt\cross_section.py:349 #: guiqwt\curve.py:334 guiqwt\curve.py:415 guiqwt\curve.py:864 #: guiqwt\histogram.py:114 guiqwt\histogram.py:222 msgid "Curve" msgstr "" #: guiqwt\builder.py:396 guiqwt\builder.py:478 guiqwt\curve.py:845 #: guiqwt\curve.py:866 msgid "Error bars" msgstr "" #: guiqwt\builder.py:509 guiqwt\histogram.py:117 guiqwt\histogram.py:225 #: guiqwt\styles.py:1325 msgid "Histogram" msgstr "" #: guiqwt\builder.py:551 guiqwt\builder.py:603 guiqwt\builder.py:645 #: guiqwt\builder.py:682 guiqwt\builder.py:707 guiqwt\builder.py:752 #: guiqwt\builder.py:781 guiqwt\image.py:786 guiqwt\image.py:924 #: guiqwt\image.py:1180 guiqwt\image.py:1595 guiqwt\image.py:1728 #: guiqwt\image.py:1842 guiqwt\image.py:2269 guiqwt\styles.py:961 #: guiqwt\styles.py:1021 msgid "Image" msgstr "" #: guiqwt\builder.py:802 guiqwt\styles.py:1201 msgid "Filter" msgstr "" #: guiqwt\builder.py:826 msgid "2D Histogram" msgstr "" #: guiqwt\builder.py:897 msgid "Legend" msgstr "" #: guiqwt\builder.py:992 guiqwt\shapes.py:280 msgid "Marker" msgstr "" #: guiqwt\builder.py:1139 guiqwt\styles.py:1333 msgid "Computation" msgstr "" #: guiqwt\config.py:25 msgid "#" msgstr "" #: guiqwt\config.py:61 msgid "pixels" msgstr "" #: guiqwt\config.py:73 msgid "Intensity" msgstr "" #: guiqwt\config.py:74 msgid "lsb" msgstr "" #: guiqwt\cross_section.py:323 msgid "LUT scale" msgstr "" #: guiqwt\cross_section.py:327 guiqwt\tools.py:1021 msgid "Cross section" msgstr "" #: guiqwt\cross_section.py:328 msgid "Enable a marker" msgstr "" #: guiqwt\cross_section.py:605 msgid "Cross section tool" msgstr "" #: guiqwt\cross_section.py:678 msgid "Auto-scale" msgstr "" #: guiqwt\cross_section.py:682 msgid "Refresh" msgstr "" #: guiqwt\cross_section.py:685 msgid "Auto-refresh" msgstr "" #: guiqwt\cross_section.py:689 msgid "Lock scales" msgstr "" #: guiqwt\cross_section.py:692 msgid "Lock scales to main plot axes" msgstr "" #: guiqwt\cross_section.py:776 msgid "Per image cross-section" msgstr "" #: guiqwt\cross_section.py:779 msgid "" "Enable the per-image cross-section mode, which works directly on image rows/columns.\n" "That is the fastest method to compute cross-section curves but it ignores image transformations (e.g. rotation)" msgstr "" #: guiqwt\cross_section.py:785 msgid "" "Apply LUT\n" "(contrast settings)" msgstr "" #: guiqwt\cross_section.py:788 msgid "" "Apply LUT (Look-Up Table) contrast settings.\n" "This is the easiest way to compare images which have slightly different level ranges.\n" "\n" "Note: LUT is coded over 1024 levels (0...1023)" msgstr "" #: guiqwt\cross_section.py:922 guiqwt\cross_section.py:923 #: guiqwt\tools.py:1076 guiqwt\tools.py:1493 msgid "Oblique averaged cross section" msgstr "" #: guiqwt\cross_section.py:924 msgid "Activate the oblique cross section tool" msgstr "" #: guiqwt\curve.py:607 guiqwt\curve.py:685 msgid "PolygonMap" msgstr "" #: guiqwt\curve.py:1120 msgid "Move to back" msgstr "" #: guiqwt\curve.py:1123 msgid "Move to front" msgstr "" #: guiqwt\curve.py:1129 guiqwt\curve.py:1281 guiqwt\tests\sift.py:245 #: guiqwt\tools.py:1992 guiqwt\tools.py:2009 msgid "Remove" msgstr "" #: guiqwt\curve.py:1278 guiqwt\tools.py:2006 msgid "Do you really want to remove this item?" msgstr "" #: guiqwt\curve.py:1280 guiqwt\tools.py:2008 msgid "Do you really want to remove selected items?" msgstr "" #: guiqwt\curve.py:1293 guiqwt\tools.py:1497 msgid "Item list" msgstr "" #: guiqwt\histogram.py:419 guiqwt\histogram.py:513 msgid "Eliminate outliers" msgstr "" #: guiqwt\histogram.py:427 msgid "Contrast adjustment tool" msgstr "" #: guiqwt\histogram.py:488 msgid "Minimum level" msgstr "" #: guiqwt\histogram.py:490 msgid "Select minimum level on image" msgstr "" #: guiqwt\histogram.py:494 msgid "Maximum level" msgstr "" #: guiqwt\histogram.py:496 msgid "Select maximum level on image" msgstr "" #: guiqwt\histogram.py:508 msgid "Full range" msgstr "" #: guiqwt\histogram.py:511 msgid "Scale the image's display range according to data range" msgstr "" #: guiqwt\histogram.py:516 msgid "Eliminate levels histogram outliers and scale the image's display range accordingly" msgstr "" #: guiqwt\image.py:1100 msgid "Quadrilaterals" msgstr "" #: guiqwt\image.py:1488 msgid "There is no supported image item in current plot." msgstr "" #: guiqwt\io.py:113 msgid "All supported files" msgstr "" #: guiqwt\io.py:342 msgid "PNG files" msgstr "" #: guiqwt\io.py:345 msgid "TIFF files" msgstr "" #: guiqwt\io.py:347 msgid "8-bit images" msgstr "" #: guiqwt\io.py:350 guiqwt\tests\sift.py:702 msgid "NumPy arrays" msgstr "" #: guiqwt\io.py:352 guiqwt\tests\sift.py:702 msgid "Text files" msgstr "" #: guiqwt\io.py:354 msgid "DICOM files" msgstr "" #: guiqwt\plot.py:792 guiqwt\pyplot.py:143 msgid "Tools" msgstr "" #: guiqwt\pyplot.py:775 msgid "" "Function 'savefig' currently supports the following formats:\n" "%s" msgstr "" #: guiqwt\qthelpers.py:62 guiqwt\tests\sift.py:752 guiqwt\tools.py:1518 #: guiqwt\tools.py:1615 msgid "Save as" msgstr "" #: guiqwt\qthelpers.py:77 guiqwt\qthelpers.py:106 guiqwt\qthelpers.py:137 msgid "Error" msgstr "" #: guiqwt\qthelpers.py:78 guiqwt\tests\sift.py:765 msgid "%s could not be written:" msgstr "" #: guiqwt\qthelpers.py:96 guiqwt\qthelpers.py:126 guiqwt\tests\sift.py:703 #: guiqwt\tests\simple_window.py:227 guiqwt\tools.py:1717 msgid "Open" msgstr "" #: guiqwt\qthelpers.py:107 guiqwt\qthelpers.py:138 guiqwt\tests\sift.py:729 msgid "%s could not be opened:" msgstr "" #: guiqwt\shapes.py:554 guiqwt\shapes.py:593 msgid "Shape" msgstr "" #: guiqwt\shapes.py:1337 msgid "Range" msgstr "" #: guiqwt\styles.py:284 msgid "Solid line" msgstr "" #: guiqwt\styles.py:285 msgid "Dashed line" msgstr "" #: guiqwt\styles.py:286 msgid "Dotted line" msgstr "" #: guiqwt\styles.py:287 msgid "Dash-dot line" msgstr "" #: guiqwt\styles.py:288 msgid "Dash-dot-dot line" msgstr "" #: guiqwt\styles.py:289 msgid "No line" msgstr "" #: guiqwt\styles.py:291 guiqwt\styles.py:337 msgid "Cross" msgstr "" #: guiqwt\styles.py:292 guiqwt\tools.py:886 msgid "Ellipse" msgstr "" #: guiqwt\styles.py:293 msgid "Star" msgstr "" #: guiqwt\styles.py:294 msgid "X-Cross" msgstr "" #: guiqwt\styles.py:295 msgid "Square" msgstr "" #: guiqwt\styles.py:296 msgid "Diamond" msgstr "" #: guiqwt\styles.py:297 guiqwt\styles.py:298 guiqwt\styles.py:299 #: guiqwt\styles.py:300 msgid "Triangle" msgstr "" #: guiqwt\styles.py:301 msgid "Hexagon" msgstr "" #: guiqwt\styles.py:302 msgid "No symbol" msgstr "" #: guiqwt\styles.py:304 msgid "Lines" msgstr "" #: guiqwt\styles.py:305 msgid "Sticks" msgstr "" #: guiqwt\styles.py:306 guiqwt\widgets\fit.py:94 msgid "Steps" msgstr "" #: guiqwt\styles.py:307 msgid "Dots" msgstr "" #: guiqwt\styles.py:308 msgid "No curve" msgstr "" #: guiqwt\styles.py:312 msgid "No brush pattern" msgstr "" #: guiqwt\styles.py:313 msgid "Uniform color" msgstr "" #: guiqwt\styles.py:314 msgid "Extremely dense brush pattern" msgstr "" #: guiqwt\styles.py:315 msgid "Very dense brush pattern" msgstr "" #: guiqwt\styles.py:316 msgid "Somewhat dense brush pattern" msgstr "" #: guiqwt\styles.py:317 msgid "Half dense brush pattern" msgstr "" #: guiqwt\styles.py:318 msgid "Somewhat sparse brush pattern" msgstr "" #: guiqwt\styles.py:319 msgid "Very sparse brush pattern" msgstr "" #: guiqwt\styles.py:320 msgid "Extremely sparse brush pattern" msgstr "" #: guiqwt\styles.py:321 msgid "Horizontal lines" msgstr "" #: guiqwt\styles.py:322 msgid "Vertical lines" msgstr "" #: guiqwt\styles.py:323 msgid "Crossing horizontal and vertical lines" msgstr "" #: guiqwt\styles.py:325 msgid "Backward diagonal lines" msgstr "" #: guiqwt\styles.py:326 msgid "Forward diagonal lines" msgstr "" #: guiqwt\styles.py:327 msgid "Crossing diagonal lines" msgstr "" #: guiqwt\styles.py:334 msgid "None" msgstr "" #: guiqwt\styles.py:335 msgid "Horizontal" msgstr "" #: guiqwt\styles.py:336 msgid "Vertical" msgstr "" #: guiqwt\styles.py:357 msgid "Family" msgstr "" #: guiqwt\styles.py:358 msgid "Choose font" msgstr "" #: guiqwt\styles.py:360 msgid "Size in point" msgstr "" #: guiqwt\styles.py:361 msgid "Bold" msgstr "" #: guiqwt\styles.py:362 msgid "Italic" msgstr "" #: guiqwt\styles.py:391 guiqwt\styles.py:436 guiqwt\styles.py:471 msgid "Style" msgstr "" #: guiqwt\styles.py:393 guiqwt\tests\sift.py:117 msgid "Size" msgstr "" #: guiqwt\styles.py:394 guiqwt\styles.py:716 msgid "Border" msgstr "" #: guiqwt\styles.py:395 guiqwt\styles.py:519 guiqwt\styles.py:554 #: guiqwt\styles.py:723 guiqwt\styles.py:1071 guiqwt\styles.py:1348 msgid "Background color" msgstr "" #: guiqwt\styles.py:396 guiqwt\styles.py:520 msgid "Background alpha" msgstr "" #: guiqwt\styles.py:437 guiqwt\styles.py:473 guiqwt\styles.py:601 #: guiqwt\styles.py:926 msgid "Color" msgstr "" #: guiqwt\styles.py:438 guiqwt\styles.py:929 guiqwt\tests\sift.py:176 #: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42 msgid "Width" msgstr "" #: guiqwt\styles.py:474 guiqwt\styles.py:927 msgid "Alpha" msgstr "" #: guiqwt\styles.py:475 guiqwt\tests\sift.py:869 msgid "Angle" msgstr "" #: guiqwt\styles.py:476 msgid "sx" msgstr "" #: guiqwt\styles.py:477 msgid "sy" msgstr "" #: guiqwt\styles.py:517 msgid "Font" msgstr "" #: guiqwt\styles.py:518 guiqwt\styles.py:722 msgid "Text color" msgstr "" #: guiqwt\styles.py:555 msgid "Major grid" msgstr "" #: guiqwt\styles.py:558 guiqwt\styles.py:564 guiqwt\styles.py:872 #: guiqwt\styles.py:1374 guiqwt\styles.py:1377 guiqwt\styles.py:1434 #: guiqwt\styles.py:1437 guiqwt\styles.py:1491 guiqwt\styles.py:1494 #: guiqwt\styles.py:1567 guiqwt\styles.py:1570 msgid "Line" msgstr "" #: guiqwt\styles.py:561 msgid "Minor grid" msgstr "" #: guiqwt\styles.py:599 guiqwt\styles.py:701 guiqwt\styles.py:830 #: guiqwt\styles.py:870 guiqwt\styles.py:1201 guiqwt\styles.py:1325 #: guiqwt\styles.py:1431 guiqwt\styles.py:1524 guiqwt\tests\sift.py:100 #: guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163 guiqwt\tests\sift.py:173 #: guiqwt\tests\simple_dialog.py:27 guiqwt\tests\simple_window.py:39 msgid "Title" msgstr "" #: guiqwt\styles.py:600 guiqwt\widgets\fit.py:97 msgid "Unit" msgstr "" #: guiqwt\styles.py:602 msgid "Title font" msgstr "" #: guiqwt\styles.py:603 msgid "Values font" msgstr "" #: guiqwt\styles.py:610 guiqwt\tools.py:1770 guiqwt\widgets\fit.py:96 msgid "Scale" msgstr "" #: guiqwt\styles.py:611 msgid "linear" msgstr "" #: guiqwt\styles.py:611 guiqwt\styles.py:1308 guiqwt\styles.py:1331 msgid "logarithmic" msgstr "" #: guiqwt\styles.py:613 msgid "Lower axis limit" msgstr "" #: guiqwt\styles.py:614 msgid "Upper axis limit" msgstr "" #: guiqwt\styles.py:637 msgid "X-axis position" msgstr "" #: guiqwt\styles.py:638 msgid "bottom" msgstr "" #: guiqwt\styles.py:639 msgid "top" msgstr "" #: guiqwt\styles.py:642 msgid "Y-axis position" msgstr "" #: guiqwt\styles.py:643 msgid "left" msgstr "" #: guiqwt\styles.py:644 msgid "right" msgstr "" #: guiqwt\styles.py:665 msgid "Lower x-axis limit" msgstr "" #: guiqwt\styles.py:666 msgid "Upper x-axis limit" msgstr "" #: guiqwt\styles.py:669 msgid "Lower y-axis limit" msgstr "" #: guiqwt\styles.py:670 msgid "Upper y-axis limit" msgstr "" #: guiqwt\styles.py:672 msgid "Z Axis" msgstr "" #: guiqwt\styles.py:673 msgid "Lower z-axis limit" msgstr "" #: guiqwt\styles.py:674 msgid "Upper z-axis limit" msgstr "" #: guiqwt\styles.py:706 guiqwt\styles.py:710 msgid "Contents" msgstr "" #: guiqwt\styles.py:713 guiqwt\styles.py:873 guiqwt\styles.py:1379 #: guiqwt\styles.py:1382 guiqwt\styles.py:1439 guiqwt\styles.py:1442 #: guiqwt\styles.py:1572 guiqwt\styles.py:1575 guiqwt\tests\styles.py:28 #: guiqwt\tests\styles.py:34 guiqwt\tests\styles.py:42 #: guiqwt\tests\styles.py:44 guiqwt\tests\styles.py:50 #: guiqwt\tests\styles.py:53 msgid "Symbol" msgstr "" #: guiqwt\styles.py:717 msgid "set width to 0 to disable" msgstr "" #: guiqwt\styles.py:720 guiqwt\styles.py:726 guiqwt\styles.py:1384 #: guiqwt\styles.py:1387 msgid "Text" msgstr "" #: guiqwt\styles.py:721 msgid "Text font" msgstr "" #: guiqwt\styles.py:724 msgid "Background transparency" msgstr "" #: guiqwt\styles.py:728 guiqwt\styles.py:776 guiqwt\styles.py:792 msgid "Position" msgstr "" #: guiqwt\styles.py:729 msgid "Position relative to anchor" msgstr "" #: guiqwt\styles.py:731 msgid "Corner" msgstr "" #: guiqwt\styles.py:732 guiqwt\styles.py:777 msgid "Top left" msgstr "" #: guiqwt\styles.py:733 guiqwt\styles.py:778 msgid "Top right" msgstr "" #: guiqwt\styles.py:734 guiqwt\styles.py:779 msgid "Bottom left" msgstr "" #: guiqwt\styles.py:735 guiqwt\styles.py:780 msgid "Bottom right" msgstr "" #: guiqwt\styles.py:740 guiqwt\styles.py:785 msgid "Center" msgstr "" #: guiqwt\styles.py:741 msgid "Label position relative to anchor point" msgstr "" #: guiqwt\styles.py:744 msgid "ΔX" msgstr "" #: guiqwt\styles.py:745 msgid "Horizontal offset (pixels) relative to anchor point" msgstr "" #: guiqwt\styles.py:747 msgid "ΔY" msgstr "" #: guiqwt\styles.py:748 msgid "Vertical offset (pixels) relative to anchor point" msgstr "" #: guiqwt\styles.py:751 guiqwt\styles.py:756 msgid "Anchor" msgstr "" #: guiqwt\styles.py:753 guiqwt\styles.py:790 msgid "Anchor position" msgstr "" #: guiqwt\styles.py:756 msgid "Attach to canvas" msgstr "" #: guiqwt\styles.py:760 msgid "X" msgstr "" #: guiqwt\styles.py:761 msgid "X-axis position in canvas coordinates" msgstr "" #: guiqwt\styles.py:764 msgid "Y" msgstr "" #: guiqwt\styles.py:765 msgid "Y-axis position in canvas coordinates" msgstr "" #: guiqwt\styles.py:769 msgid "Interact" msgstr "" #: guiqwt\styles.py:770 msgid "moving object changes anchor position" msgstr "" #: guiqwt\styles.py:771 msgid "moving object changes label position" msgstr "" #: guiqwt\styles.py:786 msgid "Absolute position on canvas" msgstr "" #: guiqwt\styles.py:874 msgid "Shadow" msgstr "" #: guiqwt\styles.py:875 msgid "Curve style" msgstr "" #: guiqwt\styles.py:877 msgid "Baseline" msgstr "" #: guiqwt\styles.py:920 msgid "Display" msgstr "" #: guiqwt\styles.py:921 msgid "error bars with caps (x, y)" msgstr "" #: guiqwt\styles.py:922 msgid "error area (y)" msgstr "" #: guiqwt\styles.py:923 msgid "" "Note: only y-axis error bars are shown in error area mode\n" "(width and cap parameters will also be ignored)" msgstr "" #: guiqwt\styles.py:928 msgid "Error bar transparency" msgstr "" #: guiqwt\styles.py:930 msgid "Cap" msgstr "" #: guiqwt\styles.py:931 msgid "Visibility" msgstr "" #: guiqwt\styles.py:931 msgid "set to foreground" msgstr "" #: guiqwt\styles.py:961 guiqwt\styles.py:1021 guiqwt\tests\simple_dialog.py:70 msgid "Image title" msgstr "" #: guiqwt\styles.py:963 guiqwt\styles.py:1023 msgid "Alpha channel" msgstr "" #: guiqwt\styles.py:963 guiqwt\styles.py:1023 msgid "Use image level as alpha" msgstr "" #: guiqwt\styles.py:965 guiqwt\styles.py:1025 msgid "Global alpha" msgstr "" #: guiqwt\styles.py:966 guiqwt\styles.py:1026 msgid "Global alpha value" msgstr "" #: guiqwt\styles.py:968 guiqwt\styles.py:1028 guiqwt\tools.py:2032 msgid "Colormap" msgstr "" #: guiqwt\styles.py:972 guiqwt\styles.py:1032 msgid "Interpolation" msgstr "" #: guiqwt\styles.py:973 msgid "None (nearest pixel)" msgstr "" #: guiqwt\styles.py:974 msgid "Linear interpolation" msgstr "" #: guiqwt\styles.py:975 msgid "2x2 antialiasing filter" msgstr "" #: guiqwt\styles.py:976 msgid "3x3 antialiasing filter" msgstr "" #: guiqwt\styles.py:977 msgid "5x5 antialiasing filter" msgstr "" #: guiqwt\styles.py:978 msgid "Image interpolation type" msgstr "" #: guiqwt\styles.py:980 guiqwt\styles.py:984 msgid "Statistics string formatting" msgstr "" #: guiqwt\styles.py:981 msgid "X-Axis" msgstr "" #: guiqwt\styles.py:982 msgid "Y-Axis" msgstr "" #: guiqwt\styles.py:983 msgid "Z-Axis" msgstr "" #: guiqwt\styles.py:1033 msgid "Quadrangle interpolation" msgstr "" #: guiqwt\styles.py:1034 msgid "Flat" msgstr "" #: guiqwt\styles.py:1037 msgid "Image interpolation type, Flat mode use fixed u,v interpolation parameters" msgstr "" #: guiqwt\styles.py:1040 msgid "Fixed U interpolation parameter" msgstr "" #: guiqwt\styles.py:1041 guiqwt\styles.py:1043 msgid "For flat mode only" msgstr "" #: guiqwt\styles.py:1042 msgid "Fixed V interpolation parameter" msgstr "" #: guiqwt\styles.py:1044 msgid "Show grid" msgstr "" #: guiqwt\styles.py:1045 msgid "Grid lines color" msgstr "" #: guiqwt\styles.py:1105 guiqwt\styles.py:1108 msgid "Image placement along X-axis" msgstr "" #: guiqwt\styles.py:1106 guiqwt\styles.py:1203 msgid "x|min" msgstr "" #: guiqwt\styles.py:1107 guiqwt\styles.py:1204 msgid "x|max" msgstr "" #: guiqwt\styles.py:1109 guiqwt\styles.py:1112 msgid "Image placement along Y-axis" msgstr "" #: guiqwt\styles.py:1110 guiqwt\styles.py:1205 msgid "y|min" msgstr "" #: guiqwt\styles.py:1111 guiqwt\styles.py:1206 msgid "y|max" msgstr "" #: guiqwt\styles.py:1175 guiqwt\styles.py:1182 guiqwt\tools.py:2100 msgid "Mask" msgstr "" #: guiqwt\styles.py:1176 msgid "Filling value" msgstr "" #: guiqwt\styles.py:1177 guiqwt\tools.py:2130 msgid "Show image mask" msgstr "" #: guiqwt\styles.py:1178 msgid "Masked area alpha" msgstr "" #: guiqwt\styles.py:1180 msgid "Unmasked area alpha" msgstr "" #: guiqwt\styles.py:1202 guiqwt\widgets\fit.py:364 msgid "Bounds" msgstr "" #: guiqwt\styles.py:1208 msgid "Use image colormap and level" msgstr "" #: guiqwt\styles.py:1209 msgid "Color map" msgstr "" #: guiqwt\styles.py:1230 msgid "Crop" msgstr "" #: guiqwt\styles.py:1236 msgid "Cropping" msgstr "" #: guiqwt\styles.py:1238 guiqwt\styles.py:1242 msgid "Pixel size" msgstr "" #: guiqwt\styles.py:1240 msgid "Width (dx)" msgstr "" #: guiqwt\styles.py:1241 msgid "Height (dy)" msgstr "" #: guiqwt\styles.py:1244 guiqwt\styles.py:1254 msgid "Translate, rotate and flip" msgstr "" #: guiqwt\styles.py:1245 msgid "xCENTER" msgstr "" #: guiqwt\styles.py:1247 guiqwt\tests\sift.py:794 msgid "Flip horizontally" msgstr "" #: guiqwt\styles.py:1249 msgid "yCENTER" msgstr "" #: guiqwt\styles.py:1251 guiqwt\tests\sift.py:796 msgid "Flip vertically" msgstr "" #: guiqwt\styles.py:1253 msgid "θ (°)" msgstr "" #: guiqwt\styles.py:1307 msgid "Bins" msgstr "" #: guiqwt\styles.py:1307 msgid "Number of bins" msgstr "" #: guiqwt\styles.py:1308 msgid "Y-axis scale" msgstr "" #: guiqwt\styles.py:1327 msgid "X-axis bins" msgstr "" #: guiqwt\styles.py:1328 msgid "Number of bins along x-axis" msgstr "" #: guiqwt\styles.py:1329 msgid "Y-axis bins" msgstr "" #: guiqwt\styles.py:1330 msgid "Number of bins along y-axis" msgstr "" #: guiqwt\styles.py:1331 msgid "Z-axis scale" msgstr "" #: guiqwt\styles.py:1334 msgid "Bin count" msgstr "" #: guiqwt\styles.py:1335 msgid "Maximum value" msgstr "" #: guiqwt\styles.py:1336 msgid "Mininum value" msgstr "" #: guiqwt\styles.py:1337 guiqwt\tests\sift.py:252 msgid "Sum" msgstr "" #: guiqwt\styles.py:1338 guiqwt\tests\sift.py:257 msgid "Product" msgstr "" #: guiqwt\styles.py:1339 guiqwt\tests\sift.py:253 guiqwt\tests\sift.py:389 msgid "Average" msgstr "" #: guiqwt\styles.py:1342 msgid "" "Bin count : counts the number of points per bin,\n" "For max, min, sum, product, average, compute the function of a third parameter (one by default)" msgstr "" #: guiqwt\styles.py:1345 msgid "Automatic LUT range" msgstr "" #: guiqwt\styles.py:1346 msgid "Automatically adapt color scale when panning, zooming" msgstr "" #: guiqwt\styles.py:1349 msgid "Background color when no data is present" msgstr "" #: guiqwt\styles.py:1375 guiqwt\styles.py:1435 guiqwt\styles.py:1568 msgid "Line (not selected)" msgstr "" #: guiqwt\styles.py:1376 guiqwt\styles.py:1436 guiqwt\styles.py:1569 msgid "Line (selected)" msgstr "" #: guiqwt\styles.py:1380 guiqwt\styles.py:1440 guiqwt\styles.py:1573 msgid "Symbol (not selected)" msgstr "" #: guiqwt\styles.py:1381 guiqwt\styles.py:1441 guiqwt\styles.py:1574 msgid "Symbol (selected)" msgstr "" #: guiqwt\styles.py:1385 msgid "Text (not selected)" msgstr "" #: guiqwt\styles.py:1386 msgid "Text (selected)" msgstr "" #: guiqwt\styles.py:1390 guiqwt\tests\styles.py:63 guiqwt\tests\styles.py:68 #: guiqwt\tests\styles.py:75 guiqwt\tests\styles.py:77 #: guiqwt\tests\styles.py:82 guiqwt\tests\styles.py:85 msgid "Line style" msgstr "" #: guiqwt\styles.py:1392 msgid "Spacing" msgstr "" #: guiqwt\styles.py:1444 guiqwt\styles.py:1448 guiqwt\styles.py:1496 #: guiqwt\styles.py:1500 msgid "Fill pattern" msgstr "" #: guiqwt\styles.py:1446 msgid "Fill pattern (not selected)" msgstr "" #: guiqwt\styles.py:1447 msgid "Fill pattern (selected)" msgstr "" #: guiqwt\styles.py:1451 guiqwt\styles.py:1532 msgid "Read-only shape" msgstr "" #: guiqwt\styles.py:1452 guiqwt\styles.py:1533 msgid "Read-only shapes can't be removed from the item list panel" msgstr "" #: guiqwt\styles.py:1454 guiqwt\styles.py:1535 msgid "Private shape" msgstr "" #: guiqwt\styles.py:1455 guiqwt\styles.py:1536 msgid "Private shapes are not shown in the item list panel" msgstr "" #: guiqwt\styles.py:1487 msgid "Arrow angle (°)" msgstr "" #: guiqwt\styles.py:1488 msgid "Arrow size (%)" msgstr "" #: guiqwt\styles.py:1492 msgid "Line (X-Axis)" msgstr "" #: guiqwt\styles.py:1493 msgid "Line (Y-Axis)" msgstr "" #: guiqwt\styles.py:1498 msgid "Fill pattern (X-Axis)" msgstr "" #: guiqwt\styles.py:1499 msgid "Fill pattern (Y-Axis)" msgstr "" #: guiqwt\styles.py:1521 msgid "Show annotation" msgstr "" #: guiqwt\styles.py:1522 msgid "Show informations on area covered by this shape" msgstr "" #: guiqwt\styles.py:1525 msgid "Subtitle" msgstr "" #: guiqwt\styles.py:1526 msgid "String formatting" msgstr "" #: guiqwt\styles.py:1527 msgid "Uncertainty" msgstr "" #: guiqwt\styles.py:1528 msgid "Measurement relative uncertainty" msgstr "" #: guiqwt\styles.py:1530 msgid "Transform matrix" msgstr "" #: guiqwt\styles.py:1577 guiqwt\styles.py:1581 msgid "Fill" msgstr "" #: guiqwt\styles.py:1579 msgid "Fill color" msgstr "" #: guiqwt\styles.py:1580 msgid "Shade" msgstr "" #: guiqwt\tests\get_point.py:31 msgid "Select one point then press OK to accept" msgstr "" #: guiqwt\tests\get_segment.py:29 msgid "Select a segment then press OK to accept" msgstr "" #: guiqwt\tests\hist2d.py:23 guiqwt\tests\hist2d_func.py:24 #: guiqwt\tools.py:1337 msgid "Markers" msgstr "" #: guiqwt\tests\mandelbrot.py:25 msgid "MAX resolution" msgstr "" #: guiqwt\tests\sift.py:45 msgid "Sift" msgstr "" #: guiqwt\tests\sift.py:46 msgid "" "Signal and Image Filtering Tool
\n" "Simple signal and image processing application based on guiqwt and guidata" msgstr "" #: guiqwt\tests\sift.py:100 guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163 #: guiqwt\tests\sift.py:173 guiqwt\tests\simple_window.py:39 msgid "Untitled" msgstr "" #: guiqwt\tests\sift.py:101 guiqwt\tests\sift.py:164 #: guiqwt\tests\simple_window.py:40 guiqwt\widgets\fit.py:416 msgid "Data" msgstr "" #: guiqwt\tests\sift.py:117 msgid "Signal size (total number of points)" msgstr "" #: guiqwt\tests\sift.py:119 guiqwt\tests\sift.py:182 #: guiqwt\tests\simple_window.py:52 msgid "Type" msgstr "" #: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:183 #: guiqwt\tests\simple_window.py:53 msgid "zeros" msgstr "" #: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:184 #: guiqwt\tests\simple_window.py:53 msgid "random" msgstr "" #: guiqwt\tests\sift.py:121 msgid "gaussian" msgstr "" #: guiqwt\tests\sift.py:165 msgid "Metadata" msgstr "" #: guiqwt\tests\sift.py:174 msgid "Image height (total number of rows)" msgstr "" #: guiqwt\tests\sift.py:174 guiqwt\tests\simple_dialog.py:29 #: guiqwt\tests\simple_window.py:45 msgid "Height" msgstr "" #: guiqwt\tests\sift.py:176 msgid "Image width (total number of columns)" msgstr "" #: guiqwt\tests\sift.py:178 msgid "Data type" msgstr "" #: guiqwt\tests\sift.py:183 msgid "empty" msgstr "" #: guiqwt\tests\sift.py:221 guiqwt\tests\simple_window.py:60 msgid "Properties" msgstr "" #: guiqwt\tests\sift.py:241 msgid "Duplicate" msgstr "" #: guiqwt\tests\sift.py:255 msgid "Difference" msgstr "" #: guiqwt\tests\sift.py:259 msgid "Division" msgstr "" #: guiqwt\tests\sift.py:381 guiqwt\tests\sift.py:402 guiqwt\tests\sift.py:423 #: guiqwt\tests\sift.py:440 guiqwt\tests\sift.py:457 guiqwt\tests\sift.py:495 #: guiqwt\tests\sift.py:978 msgid "Error:" msgstr "" #: guiqwt\tests\sift.py:484 msgid "Computing:" msgstr "" #: guiqwt\tests\sift.py:510 msgid "New signal..." msgstr "" #: guiqwt\tests\sift.py:512 guiqwt\tests\sift.py:670 msgid "Create a new signal" msgstr "" #: guiqwt\tests\sift.py:514 msgid "Open signal..." msgstr "" #: guiqwt\tests\sift.py:516 msgid "Open a signal" msgstr "" #: guiqwt\tests\sift.py:518 msgid "Save signal..." msgstr "" #: guiqwt\tests\sift.py:520 msgid "Save selected signal" msgstr "" #: guiqwt\tests\sift.py:526 guiqwt\tests\sift.py:588 guiqwt\tests\sift.py:806 #: guiqwt\tests\sift.py:957 msgid "ROI extraction" msgstr "" #: guiqwt\tests\sift.py:528 guiqwt\tests\sift.py:808 msgid "Swap X/Y axes" msgstr "" #: guiqwt\tests\sift.py:534 guiqwt\tests\sift.py:623 msgid "Normalize" msgstr "" #: guiqwt\tests\sift.py:536 guiqwt\tests\sift.py:635 guiqwt\tests\sift.py:823 #: guiqwt\tests\sift.py:987 msgid "Linear calibration" msgstr "" #: guiqwt\tests\sift.py:538 guiqwt\tests\sift.py:654 guiqwt\tests\sift.py:829 #: guiqwt\tests\sift.py:1012 msgid "Gaussian filter" msgstr "" #: guiqwt\tests\sift.py:540 guiqwt\tests\sift.py:831 msgid "Wiener filter" msgstr "" #: guiqwt\tests\sift.py:542 guiqwt\tests\sift.py:833 msgid "FFT" msgstr "" #: guiqwt\tests\sift.py:543 guiqwt\tests\sift.py:546 guiqwt\tests\sift.py:834 #: guiqwt\tests\sift.py:837 msgid "Warning: only real part is plotted" msgstr "" #: guiqwt\tests\sift.py:545 guiqwt\tests\sift.py:836 msgid "Inverse FFT" msgstr "" #: guiqwt\tests\sift.py:586 guiqwt\tests\sift.py:953 msgid "First row index" msgstr "" #: guiqwt\tests\sift.py:587 guiqwt\tests\sift.py:954 msgid "Last row index" msgstr "" #: guiqwt\tests\sift.py:617 msgid "maximum" msgstr "" #: guiqwt\tests\sift.py:618 msgid "amplitude" msgstr "" #: guiqwt\tests\sift.py:619 msgid "sum" msgstr "" #: guiqwt\tests\sift.py:620 msgid "energy" msgstr "" #: guiqwt\tests\sift.py:622 msgid "Normalize with respect to" msgstr "" #: guiqwt\tests\sift.py:630 msgid "X-axis" msgstr "" #: guiqwt\tests\sift.py:630 msgid "Y-axis" msgstr "" #: guiqwt\tests\sift.py:632 msgid "Calibrate" msgstr "" #: guiqwt\tests\sift.py:690 msgid "New gaussian function" msgstr "" #: guiqwt\tests\sift.py:753 msgid "CSV files" msgstr "" #: guiqwt\tests\sift.py:777 msgid "New image..." msgstr "" #: guiqwt\tests\sift.py:779 guiqwt\tests\sift.py:1027 #: guiqwt\tests\simple_window.py:171 guiqwt\tests\simple_window.py:212 msgid "Create a new image" msgstr "" #: guiqwt\tests\sift.py:781 msgid "Open image..." msgstr "" #: guiqwt\tests\sift.py:783 guiqwt\tests\simple_window.py:176 msgid "Open an image" msgstr "" #: guiqwt\tests\sift.py:785 msgid "Save image..." msgstr "" #: guiqwt\tests\sift.py:787 msgid "Save selected image" msgstr "" #: guiqwt\tests\sift.py:793 guiqwt\tests\sift.py:885 msgid "Rotation" msgstr "" #: guiqwt\tests\sift.py:798 msgid "Rotate 90° right" msgstr "" #: guiqwt\tests\sift.py:800 msgid "Rotate 90° left" msgstr "" #: guiqwt\tests\sift.py:802 msgid "Rotate arbitrarily..." msgstr "" #: guiqwt\tests\sift.py:804 guiqwt\tests\sift.py:937 #: guiqwt\widgets\resizedialog.py:98 msgid "Resize" msgstr "" #: guiqwt\tests\sift.py:810 msgid "Flat-field correction" msgstr "" #: guiqwt\tests\sift.py:825 guiqwt\tests\sift.py:995 msgid "Thresholding" msgstr "" #: guiqwt\tests\sift.py:827 guiqwt\tests\sift.py:1002 msgid "Clipping" msgstr "" #: guiqwt\tests\sift.py:870 guiqwt\tests\sift.py:926 msgid "Mode" msgstr "" #: guiqwt\tests\sift.py:872 guiqwt\tests\sift.py:928 msgid "cval" msgstr "" #: guiqwt\tests\sift.py:873 guiqwt\tests\sift.py:929 msgid "Value used for points outside the boundaries of the input if mode is 'constant'" msgstr "" #: guiqwt\tests\sift.py:876 msgid "Reshape the output array" msgstr "" #: guiqwt\tests\sift.py:877 msgid "Reshape the output array so that the input array is contained completely in the output" msgstr "" #: guiqwt\tests\sift.py:880 guiqwt\tests\sift.py:932 msgid "Prefilter the input image" msgstr "" #: guiqwt\tests\sift.py:882 guiqwt\tests\sift.py:934 msgid "Order" msgstr "" #: guiqwt\tests\sift.py:883 guiqwt\tests\sift.py:935 msgid "Spline interpolation order" msgstr "" #: guiqwt\tests\sift.py:913 msgid "Warning:" msgstr "" #: guiqwt\tests\sift.py:919 guiqwt\tools.py:1556 msgid "Destination size:" msgstr "" #: guiqwt\tests\sift.py:925 msgid "Zoom" msgstr "" #: guiqwt\tests\sift.py:955 msgid "First column index" msgstr "" #: guiqwt\tests\sift.py:956 msgid "Last column index" msgstr "" #: guiqwt\tests\sift.py:993 msgid "Threshold" msgstr "" #: guiqwt\tests\sift.py:1000 msgid "Clipping value" msgstr "" #: guiqwt\tests\sift.py:1162 msgid "Welcome to %s!" msgstr "" #: guiqwt\tests\sift.py:1164 msgid "Signal Processing Toolbar" msgstr "" #: guiqwt\tests\sift.py:1165 msgid "Image Processing Toolbar" msgstr "" #: guiqwt\tests\sift.py:1168 msgid "Curve Plotting Toolbar" msgstr "" #: guiqwt\tests\sift.py:1177 msgid "Image Visualization Toolbar" msgstr "" #: guiqwt\tests\sift.py:1190 msgid "Signals" msgstr "" #: guiqwt\tests\sift.py:1192 msgid "Images" msgstr "" #: guiqwt\tests\sift.py:1193 msgid "Main panel" msgstr "" #: guiqwt\tests\sift.py:1196 msgid "Curve plotting panel" msgstr "" #: guiqwt\tests\sift.py:1198 msgid "Image visualization panel" msgstr "" #: guiqwt\tests\sift.py:1207 guiqwt\tests\simple_window.py:178 msgid "Quit" msgstr "" #: guiqwt\tests\sift.py:1209 guiqwt\tests\simple_window.py:181 msgid "Quit application" msgstr "" #: guiqwt\tests\sift.py:1211 guiqwt\tests\simple_window.py:167 msgid "File" msgstr "" #: guiqwt\tests\sift.py:1215 msgid "&Edit" msgstr "" #: guiqwt\tests\sift.py:1219 msgid "Operations" msgstr "" #: guiqwt\tests\sift.py:1223 msgid "Processing" msgstr "" #: guiqwt\tests\sift.py:1240 msgid "Console" msgstr "" #: guiqwt\tests\sift.py:1249 msgid "&View" msgstr "" #: guiqwt\tests\sift.py:1254 guiqwt\tests\simple_window.py:187 msgid "About..." msgstr "" #: guiqwt\tests\sift.py:1313 guiqwt\tests\simple_window.py:202 msgid "About " msgstr "" #: guiqwt\tests\sift.py:1317 guiqwt\tests\simple_window.py:206 msgid "Developped by" msgstr "" #: guiqwt\tests\sift.py:1319 guiqwt\tests\simple_window.py:207 msgid "on" msgstr "" #: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42 msgid "Image width (pixels)" msgstr "" #: guiqwt\tests\simple_dialog.py:29 guiqwt\tests\simple_window.py:45 msgid "Image height (pixels)" msgstr "" #: guiqwt\tests\simple_dialog.py:33 msgid "Filter algorithm" msgstr "" #: guiqwt\tests\simple_dialog.py:35 msgid "gaussian filter" msgstr "" #: guiqwt\tests\simple_dialog.py:36 msgid "uniform filter" msgstr "" #: guiqwt\tests\simple_dialog.py:37 msgid "minimum filter" msgstr "" #: guiqwt\tests\simple_dialog.py:38 msgid "median filter" msgstr "" #: guiqwt\tests\simple_dialog.py:39 msgid "maximum filter" msgstr "" #: guiqwt\tests\simple_dialog.py:41 msgid "Size or sigma" msgstr "" #: guiqwt\tests\simple_dialog.py:44 msgid "Example dialog box" msgstr "" #: guiqwt\tests\simple_dialog.py:62 msgid "Filter parameters" msgstr "" #: guiqwt\tests\simple_dialog.py:67 msgid "Image parameters" msgstr "" #: guiqwt\tests\simple_dialog.py:70 msgid "z-axis scale label" msgstr "" #: guiqwt\tests\simple_window.py:33 msgid "Application example" msgstr "" #: guiqwt\tests\simple_window.py:164 msgid "Welcome to guiqwt application example!" msgstr "" #: guiqwt\tests\simple_window.py:168 msgid "New..." msgstr "" #: guiqwt\tests\simple_window.py:173 guiqwt\tools.py:1707 msgid "Open..." msgstr "" #: guiqwt\tools.py:450 msgid "Selection" msgstr "" #: guiqwt\tools.py:476 msgid "Point selection" msgstr "" #: guiqwt\tools.py:559 msgid "Polyline" msgstr "" #: guiqwt\tools.py:669 msgid "Free form" msgstr "" #: guiqwt\tools.py:718 msgid "Label text" msgstr "" #: guiqwt\tools.py:847 msgid "Rectangle" msgstr "" #: guiqwt\tools.py:851 msgid "Oblique rectangle" msgstr "" #: guiqwt\tools.py:860 msgid "Point" msgstr "" #: guiqwt\tools.py:869 msgid "Segment" msgstr "" #: guiqwt\tools.py:878 msgid "Circle" msgstr "" #: guiqwt\tools.py:972 msgid "Image statistics" msgstr "" #: guiqwt\tools.py:1067 msgid "Average cross section" msgstr "" #: guiqwt\tools.py:1088 msgid "Rectangle zoom" msgstr "" #: guiqwt\tools.py:1151 msgid "Horizontal selection" msgstr "" #: guiqwt\tools.py:1158 msgid "Vertical cursor" msgstr "" #: guiqwt\tools.py:1167 msgid "Horizontal cursor" msgstr "" #: guiqwt\tools.py:1176 msgid "Cross cursor" msgstr "" #: guiqwt\tools.py:1186 msgid "Signal statistics" msgstr "" #: guiqwt\tools.py:1324 msgid "Antialiasing (curves)" msgstr "" #: guiqwt\tools.py:1345 msgid "Free" msgstr "" #: guiqwt\tools.py:1347 msgid "Bound to active item" msgstr "" #: guiqwt\tools.py:1369 msgid "Reverse Y axis" msgstr "" #: guiqwt\tools.py:1382 msgid "Lock aspect ratio" msgstr "" #: guiqwt\tools.py:1383 msgid "Current value" msgstr "" #: guiqwt\tools.py:1384 msgid "Lock value" msgstr "" #: guiqwt\tools.py:1388 guiqwt\tools.py:1394 msgid "Aspect ratio" msgstr "" #: guiqwt\tools.py:1396 msgid "Lock" msgstr "" #: guiqwt\tools.py:1398 msgid "1:1" msgstr "" #: guiqwt\tools.py:1400 msgid "Edit..." msgstr "" #: guiqwt\tools.py:1472 msgid "Contrast adjustment" msgstr "" #: guiqwt\tools.py:1485 msgid "X-axis cross section" msgstr "" #: guiqwt\tools.py:1489 msgid "Y-axis cross section" msgstr "" #: guiqwt\tools.py:1503 msgid "Save as..." msgstr "" #: guiqwt\tools.py:1511 msgid "PNG image" msgstr "" #: guiqwt\tools.py:1517 msgid "PDF document" msgstr "" #: guiqwt\tools.py:1518 guiqwt\tools.py:1615 guiqwt\tools.py:1739 msgid "untitled" msgstr "" #: guiqwt\tools.py:1525 msgid "Copy to clipboard" msgstr "" #: guiqwt\tools.py:1545 guiqwt\tools.py:1578 guiqwt\tools.py:1645 msgid "Rectangle snapshot" msgstr "" #: guiqwt\tools.py:1546 msgid "There is no supported image item in current selection." msgstr "" #: guiqwt\tools.py:1563 guiqwt\tools.py:1570 msgid "Image levels adjustments" msgstr "" #: guiqwt\tools.py:1564 msgid "Apply contrast settings" msgstr "" #: guiqwt\tools.py:1566 msgid "Apply interpolation algorithm" msgstr "" #: guiqwt\tools.py:1568 msgid "Scale levels to maximum range" msgstr "" #: guiqwt\tools.py:1571 guiqwt\tools.py:1576 msgid "Superimposed images" msgstr "" #: guiqwt\tools.py:1572 msgid "If image B is behind image A, replace intersection by" msgstr "" #: guiqwt\tools.py:1604 msgid "Memory error" msgstr "" #: guiqwt\tools.py:1605 msgid "There is not enough memory left to process this %d x %d image (%d MB would be required)." msgstr "" #: guiqwt\tools.py:1659 msgid "Rotate and crop" msgstr "" #: guiqwt\tools.py:1687 msgid "Print..." msgstr "" #: guiqwt\tools.py:1734 msgid "Save items" msgstr "" #: guiqwt\tools.py:1739 msgid "Save items as" msgstr "" #: guiqwt\tools.py:1740 msgid "guiqwt items" msgstr "" #: guiqwt\tools.py:1748 msgid "Load items" msgstr "" #: guiqwt\tools.py:1764 msgid "Open image" msgstr "" #: guiqwt\tools.py:1826 guiqwt\tools.py:1832 msgid "Help" msgstr "" #: guiqwt\tools.py:1833 msgid "" "Keyboard/mouse shortcuts:\n" " - single left-click: item (curve, image, ...) selection\n" " - single right-click: context-menu relative to selected item\n" " - shift: on-active-curve (or image) cursor\n" " - alt: free cursor\n" " - left-click + mouse move: move item (when available)\n" " - middle-click + mouse move: pan\n" " - right-click + mouse move: zoom" msgstr "" #: guiqwt\tools.py:1892 guiqwt\tools.py:1900 msgid "Export" msgstr "" #: guiqwt\tools.py:1895 msgid "Text file" msgstr "" #: guiqwt\tools.py:1901 msgid "Unable to export item data." msgstr "" #: guiqwt\tools.py:1902 msgid "Error message:" msgstr "" #: guiqwt\tools.py:1911 msgid "Export data..." msgstr "" #: guiqwt\tools.py:1954 msgid "Edit data..." msgstr "" #: guiqwt\tools.py:1963 msgid "Center items" msgstr "" #: guiqwt\tools.py:2033 msgid "Select colormap for active image" msgstr "" #: guiqwt\tools.py:2102 msgid "Manage image masking areas" msgstr "" #: guiqwt\tools.py:2111 msgid "Mask rectangular area (inside)" msgstr "" #: guiqwt\tools.py:2116 msgid "Mask rectangular area (outside)" msgstr "" #: guiqwt\tools.py:2121 msgid "Mask circular area (inside)" msgstr "" #: guiqwt\tools.py:2126 msgid "Mask circular area (outside)" msgstr "" #: guiqwt\tools.py:2132 msgid "Show masking shapes" msgstr "" #: guiqwt\tools.py:2135 msgid "Apply mask" msgstr "" #: guiqwt\tools.py:2138 guiqwt\tools.py:2262 msgid "Clear mask" msgstr "" #: guiqwt\tools.py:2141 guiqwt\tools.py:2186 msgid "Remove all masking shapes" msgstr "" #: guiqwt\tools.py:2184 msgid "Do you really want to remove all masking shapes?" msgstr "" #: guiqwt\tools.py:2260 msgid "Do you really want to clear the mask?" msgstr "" #: guiqwt\widgets\base.py:44 msgid "Reset" msgstr "" #: guiqwt\widgets\base.py:53 msgid "Apply" msgstr "" #: guiqwt\widgets\base.py:149 msgid "Rotate & Crop" msgstr "" #: guiqwt\widgets\fit.py:71 msgid "Method" msgstr "" #: guiqwt\widgets\fit.py:74 msgid "Conjugate Gradient" msgstr "" #: guiqwt\widgets\fit.py:75 msgid "Least squares" msgstr "" #: guiqwt\widgets\fit.py:78 msgid "for simplex, powel, cg and bfgs norm used by the error function" msgstr "" #: guiqwt\widgets\fit.py:81 guiqwt\widgets\fit.py:83 msgid "for simplex, powel, least squares" msgstr "" #: guiqwt\widgets\fit.py:84 msgid "for cg, bfgs" msgstr "" #: guiqwt\widgets\fit.py:86 msgid "for cg, bfgs. inf is max, -inf is min" msgstr "" #: guiqwt\widgets\fit.py:90 msgid "Name" msgstr "" #: guiqwt\widgets\fit.py:91 msgid "Value" msgstr "" #: guiqwt\widgets\fit.py:92 msgid "Min" msgstr "" #: guiqwt\widgets\fit.py:93 msgid "Max" msgstr "" #: guiqwt\widgets\fit.py:95 msgid "Format" msgstr "" #: guiqwt\widgets\fit.py:96 msgid "Logarithmic" msgstr "" #: guiqwt\widgets\fit.py:118 msgid "Curve fitting parameter" msgstr "" #: guiqwt\widgets\fit.py:135 msgid "Edit '%s' fit parameter properties" msgstr "" #: guiqwt\widgets\fit.py:257 msgid "Curve fitting" msgstr "" #: guiqwt\widgets\fit.py:296 msgid "Fit parameters" msgstr "" #: guiqwt\widgets\fit.py:329 msgid "Automatic fitting options" msgstr "" #: guiqwt\widgets\fit.py:359 msgid "Run" msgstr "" #: guiqwt\widgets\fit.py:361 msgid "Settings" msgstr "" #: guiqwt\widgets\fit.py:372 msgid "Automatic fit" msgstr "" #: guiqwt\widgets\fit.py:422 msgid "Fit" msgstr "" #: guiqwt\widgets\fliprotate.py:50 msgid "Angle (°):" msgstr "" #: guiqwt\widgets\fliprotate.py:61 msgid "Flip:" msgstr "" #: guiqwt\widgets\resizedialog.py:77 msgid "Original size" msgstr "" #: guiqwt\widgets\resizedialog.py:79 msgid "Width (pixels)" msgstr "" #: guiqwt\widgets\resizedialog.py:80 msgid "Height (pixels)" msgstr "" #: guiqwt\widgets\resizedialog.py:83 msgid "Original size:" msgstr "" #: guiqwt\widgets\resizedialog.py:85 msgid "Zoom factor:" msgstr "" #: guiqwt\widgets\rotatecrop.py:49 msgid "Show cropping rectangle" msgstr "" #: guiqwt\widgets\rotatecrop.py:59 msgid "Cropping rectangle" msgstr "" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/panels.py0000666000000000000000000000630500000000000013107 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.panels ------------- The `panels` module provides :py:class:`guiqwt.panels.PanelWidget` (the `panel` widget class from which all panels must derived from) and identifiers for each kind of panel: * :py:data:`guiqwt.panels.ID_ITEMLIST`: ID of the `item list` panel * :py:data:`guiqwt.panels.ID_CONTRAST`: ID of the `contrast adjustment` panel * :py:data:`guiqwt.panels.ID_XCS`: ID of the `X-axis cross section` panel * :py:data:`guiqwt.panels.ID_YCS`: ID of the `Y-axis cross section` panel .. seealso:: Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.tools` Module providing the `plot tools` """ from qtpy.QtCore import Signal from guidata.qtwidgets import DockableWidget # =============================================================================== # Panel IDs # =============================================================================== #: Item list panel ID_ITEMLIST = "itemlist" #: Contrast adjustment panel ID_CONTRAST = "contrast" #: X-cross section panel ID_XCS = "x_cross_section" #: Y-cross section panel ID_YCS = "y_cross_section" #: Oblique averaged cross section panel ID_OCS = "oblique_cross_section" # =============================================================================== # Base Panel Widget class # =============================================================================== class PanelWidget(DockableWidget): """Panel Widget base class""" PANEL_ID = None # string PANEL_TITLE = None # string PANEL_ICON = None # string #: Signal emitted by PanelWidget when its visibility has changed (arg: bool) SIG_VISIBILITY_CHANGED = Signal(bool) def __init__(self, parent=None): super(PanelWidget, self).__init__(parent) assert self.PANEL_ID is not None if self.PANEL_TITLE is not None: self.setWindowTitle(self.PANEL_TITLE) if self.PANEL_ICON is not None: from guidata.configtools import get_icon self.setWindowIcon(get_icon(self.PANEL_ICON)) def showEvent(self, event): DockableWidget.showEvent(self, event) if self.dockwidget is None: self.SIG_VISIBILITY_CHANGED.emit(True) def hideEvent(self, event): DockableWidget.hideEvent(self, event) if self.dockwidget is None: self.SIG_VISIBILITY_CHANGED.emit(False) def visibility_changed(self, enable): """DockWidget visibility has changed""" DockableWidget.visibility_changed(self, enable) # For compatibility with the guiqwt.panels.PanelWidget interface: self.SIG_VISIBILITY_CHANGED.emit(self._isvisible) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/plot.py0000666000000000000000000013052500000000000012605 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.plot ----------- The `plot` module provides the following features: * :py:class:`guiqwt.plot.PlotManager`: the `plot manager` is an object to link `plots`, `panels` and `tools` together for designing highly versatile graphical user interfaces * :py:class:`guiqwt.plot.CurveWidget`: a ready-to-use widget for curve displaying with an integrated and preconfigured `plot manager` providing the `item list panel` and curve-related `tools` * :py:class:`guiqwt.plot.CurveDialog`: a ready-to-use dialog box for curve displaying with an integrated and preconfigured `plot manager` providing the `item list panel` and curve-related `tools` * :py:class:`guiqwt.plot.ImageWidget`: a ready-to-use widget for curve and image displaying with an integrated and preconfigured `plot manager` providing the `item list panel`, the `contrast adjustment` panel, the `cross section panels` (along X and Y axes) and image-related `tools` (e.g. colormap selection tool) * :py:class:`guiqwt.plot.ImageDialog`: a ready-to-use dialog box for curve and image displaying with an integrated and preconfigured `plot manager` providing the `item list panel`, the `contrast adjustment` panel, the `cross section panels` (along X and Y axes) and image-related `tools` (e.g. colormap selection tool) .. seealso:: Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.tools` Module providing the `plot tools` Module :py:mod:`guiqwt.panels` Module providing the `plot panels` IDs Module :py:mod:`guiqwt.baseplot` Module providing the `guiqwt` plotting widget base class Class diagrams ~~~~~~~~~~~~~~ Curve-related widgets with integrated plot manager: .. image:: /images/curve_widgets.png Image-related widgets with integrated plot manager: .. image:: /images/image_widgets.png Building your own plot manager: .. image:: /images/my_plot_manager.png Examples ~~~~~~~~ Simple example *without* the `plot manager`: .. literalinclude:: /../guiqwt/tests/filtertest1.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive Simple example *with* the `plot manager`: even if this simple example does not justify the use of the `plot manager` (this is an unnecessary complication here), it shows how to use it. In more complex applications, using the `plot manager` allows to design highly versatile graphical user interfaces. .. literalinclude:: /../guiqwt/tests/filtertest2.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive Reference ~~~~~~~~~ .. autoclass:: PlotManager :members: :inherited-members: .. autoclass:: CurveWidget :members: .. autoclass:: CurveDialog :members: .. autoclass:: ImageWidget :members: .. autoclass:: ImageDialog :members: """ import weakref from numpy.lib.arraysetops import isin from qtpy.QtWidgets import ( QDialogButtonBox, QVBoxLayout, QGridLayout, QToolBar, QDialog, QHBoxLayout, QMenu, QActionGroup, QSplitter, QSizePolicy, QApplication, QWidget, QMainWindow, ) from qtpy.QtCore import Qt from qtpy import PYQT5 from guidata.configtools import get_icon from guidata.utils import assert_interfaces_valid from guidata.qthelpers import create_action, win32_fix_title_bar_background # Local imports from guiqwt.config import _ from guiqwt.baseplot import BasePlot from guiqwt.curve import CurvePlot, PlotItemList from guiqwt.image import ImagePlot from guiqwt.tools import ( SelectTool, RectZoomTool, ColormapTool, HelpTool, ReverseYAxisTool, BasePlotMenuTool, DeleteItemTool, ItemListPanelTool, AntiAliasingTool, PrintTool, DisplayCoordsTool, AxisScaleTool, SaveAsTool, AspectRatioTool, ContrastPanelTool, XCSPanelTool, YCSPanelTool, SnapshotTool, DummySeparatorTool, CrossSectionTool, AverageCrossSectionTool, AboutTool, ImageStatsTool, ExportItemDataTool, EditItemDataTool, ItemCenterTool, SignalStatsTool, CopyToClipboardTool, ) from guiqwt.interfaces import IPlotManager class DefaultPlotID(object): pass class PlotManager(object): """ Construct a PlotManager object, a 'controller' that organizes relations between plots (i.e. :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot` objects), panels, tools (see :py:mod:`guiqwt.tools`) and toolbars """ __implements__ = (IPlotManager,) def __init__(self, main): self.main = main # The main parent widget self.plots = {} # maps ids to instances of BasePlot self.panels = {} # Qt widgets that need to know about the plots self.tools = [] self.toolbars = {} self.active_tool = None self.default_tool = None self.default_plot = None self.default_toolbar = None self.synchronized_plots = {} self.groups = {} # Action groups for grouping QActions # Keep track of the registration sequence (plots, panels, tools): self._first_tool_flag = True def add_plot(self, plot, plot_id=DefaultPlotID): """ Register a plot to the plot manager: * plot: :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot` object * plot_id (default id is the plot object's id: ``id(plot)``): unique ID identifying the plot (any Python object), this ID will be asked by the manager to access this plot later. Plot manager's registration sequence is the following: 1. add plots 2. add panels 3. add tools """ if plot_id is DefaultPlotID: plot_id = id(plot) assert plot_id not in self.plots assert isinstance(plot, BasePlot) assert not self.tools, "tools must be added after plots" assert not self.panels, "panels must be added after plots" self.plots[plot_id] = plot if len(self.plots) == 1: self.default_plot = plot plot.set_manager(self, plot_id) # Connecting signals plot.SIG_ITEMS_CHANGED.connect(self.update_tools_status) plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.update_tools_status) plot.SIG_PLOT_AXIS_CHANGED.connect(self.plot_axis_changed) def set_default_plot(self, plot): """ Set default plot The default plot is the plot on which tools and panels will act. """ self.default_plot = plot def get_default_plot(self): """ Return default plot The default plot is the plot on which tools and panels will act. """ return self.default_plot def add_panel(self, panel): """ Register a panel to the plot manager Plot manager's registration sequence is the following: 1. add plots 2. add panels 3. add tools """ assert panel.PANEL_ID not in self.panels assert not self.tools, "tools must be added after panels" self.panels[panel.PANEL_ID] = panel panel.register_panel(self) def configure_panels(self): """ Call all the registred panels 'configure_panel' methods to finalize the object construction (this allows to use tools registered to the same plot manager as the panel itself with breaking the registration sequence: "add plots, then panels, then tools") """ for panel_id in self.panels: panel = self.get_panel(panel_id) panel.configure_panel() def add_toolbar(self, toolbar, toolbar_id="default"): """ Add toolbar to the plot manager toolbar: a QToolBar object toolbar_id: toolbar's id (default id is string "default") """ assert toolbar_id not in self.toolbars self.toolbars[toolbar_id] = toolbar if self.default_toolbar is None: self.default_toolbar = toolbar def set_default_toolbar(self, toolbar): """ Set default toolbar """ self.default_toolbar = toolbar def get_default_toolbar(self): """ Return default toolbar """ return self.default_toolbar def add_tool(self, ToolKlass, *args, **kwargs): """ Register a tool to the manager * ToolKlass: tool's class (`guiqwt` builtin tools are defined in module :py:mod:`guiqwt.tools`) * args: arguments sent to the tool's class * kwargs: keyword arguments sent to the tool's class Plot manager's registration sequence is the following: 1. add plots 2. add panels 3. add tools """ if self._first_tool_flag: # This is the very first tool to be added to this manager self._first_tool_flag = False self.configure_panels() tool = ToolKlass(self, *args, **kwargs) self.tools.append(tool) for plot in list(self.plots.values()): tool.register_plot(plot) if len(self.tools) == 1: self.default_tool = tool return tool def get_tool(self, ToolKlass): """Return tool instance from its class""" for tool in self.tools: if isinstance(tool, ToolKlass): return tool def add_separator_tool(self, toolbar_id=None): """ Register a separator tool to the plot manager: the separator tool is just a tool which insert a separator in the plot context menu """ if toolbar_id is None: for _id, toolbar in list(self.toolbars.items()): if toolbar is self.get_default_toolbar(): toolbar_id = _id break self.add_tool(DummySeparatorTool, toolbar_id) def set_default_tool(self, tool): """ Set default tool """ self.default_tool = tool def get_default_tool(self): """ Get default tool """ return self.default_tool def activate_default_tool(self): """ Activate default tool """ self.get_default_tool().activate() def get_active_tool(self): """ Return active tool """ return self.active_tool def set_active_tool(self, tool=None): """ Set active tool (if tool argument is None, the active tool will be the default tool) """ self.active_tool = tool def get_plot(self, plot_id=DefaultPlotID): """ Return plot associated to `plot_id` (if method is called without specifying the `plot_id` parameter, return the default plot) """ if plot_id is DefaultPlotID: return self.default_plot return self.plots[plot_id] def get_plots(self): """ Return all registered plots """ return list(self.plots.values()) def get_active_plot(self): """ Return the active plot The active plot is the plot whose canvas has the focus otherwise it's the "default" plot """ for plot in list(self.plots.values()): canvas = plot.canvas() if canvas.hasFocus(): return plot return self.default_plot def get_tool_group(self, groupname): group = self.groups.get(groupname, None) if group is None: group = QActionGroup(self.main) self.groups[groupname] = weakref.ref(group) return group else: return group() def get_main(self): """ Return the main (parent) widget Note that for py:class:`guiqwt.plot.CurveWidget` or :py:class:`guiqwt.plot.ImageWidget` objects, this method will return the widget itself because the plot manager is integrated to it. """ return self.main def set_main(self, main): self.main = main def get_panel(self, panel_id): """ Return panel from its ID Panel IDs are listed in module guiqwt.panels """ return self.panels.get(panel_id, None) def get_itemlist_panel(self): """ Convenience function to get the `item list panel` Return None if the item list panel has not been added to this manager """ from guiqwt import panels return self.get_panel(panels.ID_ITEMLIST) def get_contrast_panel(self): """ Convenience function to get the `contrast adjustment panel` Return None if the contrast adjustment panel has not been added to this manager """ from guiqwt import panels return self.get_panel(panels.ID_CONTRAST) def set_contrast_range(self, zmin, zmax): """ Convenience function to set the `contrast adjustment panel` range This is strictly equivalent to the following:: # Here, *widget* is for example a CurveWidget instance # (the same apply for CurvePlot, ImageWidget, ImagePlot or any # class deriving from PlotManager) widget.get_contrast_panel().set_range(zmin, zmax) """ self.get_contrast_panel().set_range(zmin, zmax) def get_xcs_panel(self): """ Convenience function to get the `X-axis cross section panel` Return None if the X-axis cross section panel has not been added to this manager """ from guiqwt import panels return self.get_panel(panels.ID_XCS) def get_ycs_panel(self): """ Convenience function to get the `Y-axis cross section panel` Return None if the Y-axis cross section panel has not been added to this manager """ from guiqwt import panels return self.get_panel(panels.ID_YCS) def update_cross_sections(self): """ Convenience function to update the `cross section panels` at once This is strictly equivalent to the following:: # Here, *widget* is for example a CurveWidget instance # (the same apply for CurvePlot, ImageWidget, ImagePlot or any # class deriving from PlotManager) widget.get_xcs_panel().update_plot() widget.get_ycs_panel().update_plot() """ self.get_xcs_panel().update_plot() self.get_ycs_panel().update_plot() def get_toolbar(self, toolbar_id="default"): """ Return toolbar from its ID toolbar_id: toolbar's id (default id is string "default") """ return self.toolbars.get(toolbar_id, None) def get_context_menu(self, plot=None): """ Return widget context menu -- built using active tools """ if plot is None: plot = self.get_plot() menu = QMenu(plot) self.update_tools_status(plot) for tool in self.tools: tool.setup_context_menu(menu, plot) return menu def update_tools_status(self, plot=None): """ Update tools for current plot """ if plot is None: plot = self.get_plot() for tool in self.tools: tool.update_status(plot) def create_action( self, title, triggered=None, toggled=None, shortcut=None, icon=None, tip=None, checkable=None, context=Qt.WindowShortcut, enabled=None, ): """ Create a new QAction """ return create_action( self.main, title, triggered=triggered, toggled=toggled, shortcut=shortcut, icon=icon, tip=tip, checkable=checkable, context=context, enabled=enabled, ) # The following methods provide some sets of tools that # are often registered together def register_standard_tools(self): """ Registering basic tools for standard plot dialog --> top of the context-menu """ t = self.add_tool(SelectTool) self.set_default_tool(t) self.add_tool(RectZoomTool) self.add_tool(BasePlotMenuTool, "item") self.add_tool(ExportItemDataTool) self.add_tool(EditItemDataTool) self.add_tool(ItemCenterTool) self.add_tool(DeleteItemTool) self.add_separator_tool() self.add_tool(BasePlotMenuTool, "grid") self.add_tool(BasePlotMenuTool, "axes") self.add_tool(DisplayCoordsTool) if self.get_itemlist_panel(): self.add_tool(ItemListPanelTool) def register_curve_tools(self): """ Register only curve-related tools .. seealso:: :py:meth:`guiqwt.plot.PlotManager.add_tool` :py:meth:`guiqwt.plot.PlotManager.register_standard_tools` :py:meth:`guiqwt.plot.PlotManager.register_other_tools` :py:meth:`guiqwt.plot.PlotManager.register_image_tools` """ self.add_tool(SignalStatsTool) self.add_tool(AntiAliasingTool) self.add_tool(AxisScaleTool) def register_image_tools(self): """ Register only image-related tools .. seealso:: :py:meth:`guiqwt.plot.PlotManager.add_tool` :py:meth:`guiqwt.plot.PlotManager.register_standard_tools` :py:meth:`guiqwt.plot.PlotManager.register_other_tools` :py:meth:`guiqwt.plot.PlotManager.register_curve_tools` """ self.add_tool(ColormapTool) self.add_tool(ReverseYAxisTool) self.add_tool(AspectRatioTool) if self.get_contrast_panel(): self.add_tool(ContrastPanelTool) self.add_tool(SnapshotTool) self.add_tool(ImageStatsTool) if self.get_xcs_panel() and self.get_ycs_panel(): self.add_tool(XCSPanelTool) self.add_tool(YCSPanelTool) self.add_tool(CrossSectionTool) self.add_tool(AverageCrossSectionTool) def register_other_tools(self): """ Register other common tools .. seealso:: :py:meth:`guiqwt.plot.PlotManager.add_tool` :py:meth:`guiqwt.plot.PlotManager.register_standard_tools` :py:meth:`guiqwt.plot.PlotManager.register_curve_tools` :py:meth:`guiqwt.plot.PlotManager.register_image_tools` """ self.add_tool(SaveAsTool) self.add_tool(CopyToClipboardTool) self.add_tool(PrintTool) self.add_tool(HelpTool) self.add_tool(AboutTool) def register_all_curve_tools(self): """ Register standard, curve-related and other tools .. seealso:: :py:meth:`guiqwt.plot.PlotManager.add_tool` :py:meth:`guiqwt.plot.PlotManager.register_standard_tools` :py:meth:`guiqwt.plot.PlotManager.register_other_tools` :py:meth:`guiqwt.plot.PlotManager.register_curve_tools` :py:meth:`guiqwt.plot.PlotManager.register_image_tools` :py:meth:`guiqwt.plot.PlotManager.register_all_image_tools` """ self.register_standard_tools() self.add_separator_tool() self.register_curve_tools() self.add_separator_tool() self.register_other_tools() self.add_separator_tool() self.update_tools_status() self.get_default_tool().activate() def register_all_image_tools(self): """ Register standard, image-related and other tools .. seealso:: :py:meth:`guiqwt.plot.PlotManager.add_tool` :py:meth:`guiqwt.plot.PlotManager.register_standard_tools` :py:meth:`guiqwt.plot.PlotManager.register_other_tools` :py:meth:`guiqwt.plot.PlotManager.register_curve_tools` :py:meth:`guiqwt.plot.PlotManager.register_image_tools` :py:meth:`guiqwt.plot.PlotManager.register_all_curve_tools` """ self.register_standard_tools() self.add_separator_tool() self.register_image_tools() self.add_separator_tool() self.register_other_tools() self.add_separator_tool() self.update_tools_status() self.get_default_tool().activate() def synchronize_axis(self, axis, plots): for plot_id in plots: synclist = self.synchronized_plots.setdefault(plot_id, []) for plot2_id in plots: if plot_id == plot2_id: continue item = (axis, plot2_id) if item not in synclist: synclist.append(item) def plot_axis_changed(self, plot): plot_id = plot.plot_id if plot_id not in self.synchronized_plots: return for (axis, other_plot_id) in self.synchronized_plots[plot_id]: scalediv = plot.axisScaleDiv(axis) map = plot.canvasMap(axis) other = self.get_plot(other_plot_id) lb = scalediv.lowerBound() ub = scalediv.upperBound() other.setAxisScale(axis, lb, ub) other.replot() assert_interfaces_valid(PlotManager) # =============================================================================== # Curve Plot Widget/Dialog with integrated Item list widget # =============================================================================== def configure_plot_splitter(qsplit, decreasing_size=True): qsplit.setChildrenCollapsible(False) qsplit.setHandleWidth(4) if decreasing_size: qsplit.setStretchFactor(0, 1) qsplit.setStretchFactor(1, 0) qsplit.setSizes([2, 1]) else: qsplit.setStretchFactor(0, 0) qsplit.setStretchFactor(1, 1) qsplit.setSizes([1, 2]) class SubplotWidget(QSplitter): """Construct a Widget that helps managing several plots together handled by the same manager Since the plots must be added to the manager before the panels the add_itemlist method can be called after having declared all the subplots """ def __init__(self, manager, parent=None, **kwargs): super(SubplotWidget, self).__init__(parent, **kwargs) self.setOrientation(Qt.Horizontal) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.manager = manager self.plots = [] self.itemlist = None main = QWidget() self.plotlayout = QGridLayout() main.setLayout(self.plotlayout) self.addWidget(main) def add_itemlist(self, show_itemlist=False): self.itemlist = PlotItemList(self) self.itemlist.setVisible(show_itemlist) self.addWidget(self.itemlist) configure_plot_splitter(self) self.manager.add_panel(self.itemlist) def add_subplot(self, plot, i=0, j=0, plot_id=None): """Add a plot to the grid of plots""" self.plotlayout.addWidget(plot, i, j) self.plots.append(plot) if plot_id is None: plot_id = id(plot) self.manager.add_plot(plot, plot_id) class BaseCurveWidget(QSplitter): """ Construct a BaseCurveWidget object, which includes: * A plot (:py:class:`guiqwt.curve.CurvePlot`) * An `item list` panel (:py:class:`guiqwt.curve.PlotItemList`) This object does nothing in itself because plot and panels are not connected to each other. See children class :py:class:`guiqwt.plot.CurveWidget` """ def __init__( self, parent=None, title=None, xlabel=None, ylabel=None, xunit=None, yunit=None, section="plot", show_itemlist=False, gridparam=None, curve_antialiasing=None, **kwargs ): if PYQT5: super(BaseCurveWidget, self).__init__(parent, **kwargs) self.setOrientation(Qt.Horizontal) else: QSplitter.__init__(self, Qt.Horizontal, parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.plot = CurvePlot( parent=self, title=title, xlabel=xlabel, ylabel=ylabel, xunit=xunit, yunit=yunit, section=section, gridparam=gridparam, ) if curve_antialiasing is not None: self.plot.set_antialiasing(curve_antialiasing) self.addWidget(self.plot) self.itemlist = PlotItemList(self) self.itemlist.setVisible(show_itemlist) self.addWidget(self.itemlist) configure_plot_splitter(self) class CurveWidget(BaseCurveWidget, PlotManager): """ Construct a CurveWidget object: plotting widget with integrated plot manager * parent: parent widget * title: plot title * xlabel: (bottom axis title, top axis title) or bottom axis title only * ylabel: (left axis title, right axis title) or left axis title only * xunit: (bottom axis unit, top axis unit) or bottom axis unit only * yunit: (left axis unit, right axis unit) or left axis unit only * panels (optional): additionnal panels (list, tuple) """ def __init__( self, parent=None, title=None, xlabel=None, ylabel=None, xunit=None, yunit=None, section="plot", show_itemlist=False, gridparam=None, panels=None, ): if PYQT5: super(CurveWidget, self).__init__( parent=parent, title=title, xlabel=xlabel, ylabel=ylabel, xunit=xunit, yunit=yunit, section=section, show_itemlist=show_itemlist, gridparam=gridparam, main=self, ) else: BaseCurveWidget.__init__( self, parent, title, xlabel, ylabel, xunit, yunit, section, show_itemlist, gridparam, ) PlotManager.__init__(self, main=self) # Configuring plot manager self.add_plot(self.plot) self.add_panel(self.itemlist) if panels is not None: for panel in panels: self.add_panel(panel) class CurveWidgetMixin(PlotManager): def __init__( self, wintitle="guiqwt plot", icon="guiqwt.svg", toolbar=False, options=None, panels=None, ): PlotManager.__init__(self, main=self) self.plot_layout = QGridLayout() if options is None: options = {} self.plot_widget = None self.create_plot(options) if panels is not None: for panel in panels: self.add_panel(panel) self.toolbar = QToolBar(_("Tools")) if not toolbar: self.toolbar.hide() # Configuring widget layout self.setup_widget_properties(wintitle=wintitle, icon=icon) self.setup_widget_layout() # Configuring plot manager self.add_toolbar(self.toolbar, "default") self.register_tools() def setup_widget_layout(self): raise NotImplementedError def setup_widget_properties(self, wintitle, icon): self.setWindowTitle(wintitle) if isinstance(icon, str): icon = get_icon(icon) if icon is not None: self.setWindowIcon(icon) self.setMinimumSize(320, 240) self.resize(640, 480) def register_tools(self): """ Register the plotting dialog box tools: the base implementation provides standard, curve-related and other tools - i.e. calling this method is exactly the same as calling :py:meth:`guiqwt.plot.CurveDialog.register_all_curve_tools` This method may be overriden to provide a fully customized set of tools """ self.register_all_curve_tools() def create_plot(self, options, row=0, column=0, rowspan=1, columnspan=1): """ Create the plotting widget (which is an instance of class :py:class:`guiqwt.plot.BaseCurveWidget`), add it to the dialog box main layout (:py:attr:`guiqwt.plot.CurveDialog.plot_layout`) and then add the `item list` panel May be overriden to customize the plot layout (:py:attr:`guiqwt.plot.CurveDialog.plot_layout`) """ self.plot_widget = BaseCurveWidget(self, **options) self.plot_layout.addWidget(self.plot_widget, row, column, rowspan, columnspan) # Configuring plot manager self.add_plot(self.plot_widget.plot) self.add_panel(self.plot_widget.itemlist) class CurveDialog(QDialog, CurveWidgetMixin): """ Construct a CurveDialog object: plotting dialog box with integrated plot manager * wintitle: window title * icon: window icon * edit: editable state * toolbar: show/hide toolbar * options: options sent to the :py:class:`guiqwt.curve.CurvePlot` object (dictionary) * parent: parent widget * panels (optional): additionnal panels (list, tuple) """ def __init__( self, wintitle="guiqwt plot", icon="guiqwt.svg", edit=False, toolbar=False, options=None, parent=None, panels=None, ): if not PYQT5: QDialog.__init__(self, parent) self.edit = edit self.button_box = None self.button_layout = None if PYQT5: super(CurveDialog, self).__init__( parent, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, ) else: CurveWidgetMixin.__init__( self, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, ) self.setWindowFlags(Qt.Window) win32_fix_title_bar_background(self) def setup_widget_layout(self): vlayout = QVBoxLayout(self) vlayout.addWidget(self.toolbar) vlayout.addLayout(self.plot_layout) self.setLayout(vlayout) if self.edit: self.button_layout = QHBoxLayout() self.install_button_layout() vlayout.addLayout(self.button_layout) def install_button_layout(self): """ Install standard buttons (OK, Cancel) in dialog button box layout (:py:attr:`guiqwt.plot.CurveDialog.button_layout`) This method may be overriden to customize the button box """ bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) self.button_layout.addWidget(bbox) self.button_box = bbox class CurveWindow(QMainWindow, CurveWidgetMixin): """ Construct a CurveWindow object: plotting window with integrated plot manager * wintitle: window title * icon: window icon * toolbar: show/hide toolbar * options: options sent to the :py:class:`guiqwt.curve.CurvePlot` object (dictionary) * parent: parent widget * panels (optional): additionnal panels (list, tuple) """ def __init__( self, wintitle="guiqwt plot", icon="guiqwt.svg", toolbar=False, options=None, parent=None, panels=None, ): if PYQT5: super(CurveWindow, self).__init__( parent, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, ) else: QMainWindow.__init__(self, parent) CurveWidgetMixin.__init__( self, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, ) win32_fix_title_bar_background(self) def setup_widget_layout(self): self.addToolBar(self.toolbar) widget = QWidget() widget.setLayout(self.plot_layout) self.setCentralWidget(widget) def closeEvent(self, event): # Closing panels (necessary if at least one of these panels has no # parent widget: otherwise, this panel will stay open after the main # window has been closed which is not the expected behavior) for panel in self.panels: self.get_panel(panel).close() QMainWindow.closeEvent(self, event) # =============================================================================== # Image Plot Widget/Dialog with integrated Levels Histogram and other widgets # =============================================================================== class BaseImageWidget(QSplitter): """ Construct a BaseImageWidget object, which includes: * A plot (:py:class:`guiqwt.curve.CurvePlot`) * An `item list` panel (:py:class:`guiqwt.curve.PlotItemList`) * A `contrast adjustment` panel (:py:class:`guiqwt.histogram.ContrastAdjustment`) * An `X-axis cross section` panel (:py:class:`guiqwt.histogram.XCrossSection`) * An `Y-axis cross section` panel (:py:class:`guiqwt.histogram.YCrossSection`) This object does nothing in itself because plot and panels are not connected to each other. See children class :py:class:`guiqwt.plot.ImageWidget` """ def __init__( self, parent=None, title="", xlabel=("", ""), ylabel=("", ""), zlabel=None, xunit=("", ""), yunit=("", ""), zunit=None, yreverse=True, colormap="jet", aspect_ratio=1.0, lock_aspect_ratio=True, show_contrast=False, show_itemlist=False, show_xsection=False, show_ysection=False, xsection_pos="top", ysection_pos="right", gridparam=None, curve_antialiasing=None, **kwargs ): if PYQT5: super(BaseImageWidget, self).__init__(parent, **kwargs) self.setOrientation(Qt.Vertical) else: QSplitter.__init__(self, Qt.Vertical, parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.sub_splitter = QSplitter(Qt.Horizontal, self) self.plot = ImagePlot( parent=self, title=title, xlabel=xlabel, ylabel=ylabel, zlabel=zlabel, xunit=xunit, yunit=yunit, zunit=zunit, yreverse=yreverse, aspect_ratio=aspect_ratio, lock_aspect_ratio=lock_aspect_ratio, gridparam=gridparam, ) if curve_antialiasing is not None: self.plot.set_antialiasing(curve_antialiasing) from guiqwt.cross_section import YCrossSection self.ycsw = YCrossSection( self, position=ysection_pos, xsection_pos=xsection_pos ) self.ycsw.setVisible(show_ysection) from guiqwt.cross_section import XCrossSection self.xcsw = XCrossSection(self) self.xcsw.setVisible(show_xsection) self.xcsw.SIG_VISIBILITY_CHANGED.connect(self.xcsw_is_visible) self.xcsw_splitter = QSplitter(Qt.Vertical, self) if xsection_pos == "top": self.xcsw_splitter.addWidget(self.xcsw) self.xcsw_splitter.addWidget(self.plot) else: self.xcsw_splitter.addWidget(self.plot) self.xcsw_splitter.addWidget(self.xcsw) self.xcsw_splitter.splitterMoved.connect( lambda pos, index: self.adjust_ycsw_height() ) self.ycsw_splitter = QSplitter(Qt.Horizontal, self) if ysection_pos == "left": self.ycsw_splitter.addWidget(self.ycsw) self.ycsw_splitter.addWidget(self.xcsw_splitter) else: self.ycsw_splitter.addWidget(self.xcsw_splitter) self.ycsw_splitter.addWidget(self.ycsw) configure_plot_splitter( self.xcsw_splitter, decreasing_size=xsection_pos == "bottom" ) configure_plot_splitter( self.ycsw_splitter, decreasing_size=ysection_pos == "right" ) self.sub_splitter.addWidget(self.ycsw_splitter) self.itemlist = PlotItemList(self) self.itemlist.setVisible(show_itemlist) self.sub_splitter.addWidget(self.itemlist) # Contrast adjustment (Levels histogram) from guiqwt.histogram import ContrastAdjustment self.contrast = ContrastAdjustment(self) self.contrast.setVisible(show_contrast) self.addWidget(self.contrast) configure_plot_splitter(self) configure_plot_splitter(self.sub_splitter) def adjust_ycsw_height(self, height=None): if height is None: height = self.xcsw.height() - self.ycsw.toolbar.height() self.ycsw.adjust_height(height) if height: QApplication.processEvents() def xcsw_is_visible(self, state): if state: QApplication.processEvents() self.adjust_ycsw_height() else: self.adjust_ycsw_height(0) class ImageWidget(BaseImageWidget, PlotManager): """ Construct a ImageWidget object: plotting widget with integrated plot manager * parent: parent widget * title: plot title (string) * xlabel, ylabel, zlabel: resp. bottom, left and right axis titles (strings) * xunit, yunit, zunit: resp. bottom, left and right axis units (strings) * yreverse: reversing Y-axis (bool) * aspect_ratio: height to width ratio (float) * lock_aspect_ratio: locking aspect ratio (bool) * show_contrast: showing contrast adjustment tool (bool) * show_xsection: showing x-axis cross section plot (bool) * show_ysection: showing y-axis cross section plot (bool) * xsection_pos: x-axis cross section plot position (string: "top", "bottom") * ysection_pos: y-axis cross section plot position (string: "left", "right") * panels (optional): additionnal panels (list, tuple) """ def __init__( self, parent=None, title="", xlabel=("", ""), ylabel=("", ""), zlabel=None, xunit=("", ""), yunit=("", ""), zunit=None, yreverse=True, colormap="jet", aspect_ratio=1.0, lock_aspect_ratio=True, show_contrast=False, show_itemlist=False, show_xsection=False, show_ysection=False, xsection_pos="top", ysection_pos="right", gridparam=None, panels=None, ): if PYQT5: super(ImageWidget, self).__init__( parent=parent, title=title, xlabel=xlabel, ylabel=ylabel, zlabel=zlabel, xunit=xunit, yunit=yunit, zunit=zunit, yreverse=yreverse, colormap=colormap, aspect_ratio=aspect_ratio, lock_aspect_ratio=lock_aspect_ratio, show_contrast=show_contrast, show_itemlist=show_itemlist, show_xsection=show_xsection, show_ysection=show_ysection, xsection_pos=xsection_pos, ysection_pos=ysection_pos, gridparam=gridparam, main=self, ) else: BaseImageWidget.__init__( self, parent, title, xlabel, ylabel, zlabel, xunit, yunit, zunit, yreverse, colormap, aspect_ratio, lock_aspect_ratio, show_contrast, show_itemlist, show_xsection, show_ysection, xsection_pos, ysection_pos, gridparam, ) PlotManager.__init__(self, main=self) # Configuring plot manager self.add_plot(self.plot) self.add_panel(self.itemlist) self.add_panel(self.xcsw) self.add_panel(self.ycsw) self.add_panel(self.contrast) if panels is not None: for panel in panels: self.add_panel(panel) class ImageWidgetMixin(CurveWidgetMixin): def register_tools(self): """ Register the plotting dialog box tools: the base implementation provides standard, image-related and other tools - i.e. calling this method is exactly the same as calling :py:meth:`guiqwt.plot.CurveDialog.register_all_image_tools` This method may be overriden to provide a fully customized set of tools """ self.register_all_image_tools() def create_plot(self, options, row=0, column=0, rowspan=1, columnspan=1): """ Create the plotting widget (which is an instance of class :py:class:`guiqwt.plot.BaseImageWidget`), add it to the dialog box main layout (:py:attr:`guiqwt.plot.CurveDialog.plot_layout`) and then add the `item list`, `contrast adjustment` and X/Y axes cross section panels. May be overriden to customize the plot layout (:py:attr:`guiqwt.plot.CurveDialog.plot_layout`) """ self.plot_widget = BaseImageWidget(self, **options) self.plot_layout.addWidget(self.plot_widget, row, column, rowspan, columnspan) # Configuring plot manager self.add_plot(self.plot_widget.plot) self.add_panel(self.plot_widget.itemlist) self.add_panel(self.plot_widget.xcsw) self.add_panel(self.plot_widget.ycsw) self.add_panel(self.plot_widget.contrast) class ImageDialog(CurveDialog, ImageWidgetMixin): """ Construct a ImageDialog object: plotting dialog box with integrated plot manager * wintitle: window title * icon: window icon * edit: editable state * toolbar: show/hide toolbar * options: options sent to the :py:class:`guiqwt.image.ImagePlot` object (dictionary) * parent: parent widget * panels (optional): additionnal panels (list, tuple) """ pass class ImageWindow(CurveWindow, ImageWidgetMixin): """ Construct a ImageWindow object: plotting window with integrated plot manager * wintitle: window title * icon: window icon * toolbar: show/hide toolbar * options: options sent to the :py:class:`guiqwt.image.ImagePlot` object (dictionary) * parent: parent widget * panels (optional): additionnal panels (list, tuple) """ pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/pyplot.py0000666000000000000000000005310200000000000013151 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.pyplot ------------- The `pyplot` module provides an interactive plotting interface similar to `Matplotlib`'s, i.e. with MATLAB-like syntax. The :py:mod:`guiqwt.pyplot` module was designed to be as close as possible to the :py:mod:`matplotlib.pyplot` module, so that one could easily switch between these two modules by simply changing the import statement. Basically, if `guiqwt` does support the plotting commands called in your script, replacing ``import matplotlib.pyplot`` by ``import guiqwt.pyplot`` should suffice, as shown in the following example: * Simple example using `matplotlib`:: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10) plt.plot(x, x**2, 'r+') plt.show() * Switching from `matplotlib` to `guiqwt` is trivial:: import guiqwt.pyplot as plt # only this line has changed! import numpy as np x = np.linspace(-10, 10) plt.plot(x, x**2, 'r+') plt.show() Examples ~~~~~~~~ >>> import numpy as np >>> from guiqwt.pyplot import * # ugly but acceptable in an interactive session >>> ion() # switching to interactive mode >>> x = np.linspace(-5, 5, 1000) >>> figure(1) >>> subplot(2, 1, 1) >>> plot(x, np.sin(x), "r+") >>> plot(x, np.cos(x), "g-") >>> errorbar(x, -1+x**2/20+.2*np.random.rand(len(x)), x/20) >>> xlabel("Axe x") >>> ylabel("Axe y") >>> subplot(2, 1, 2) >>> img = np.fromfunction(lambda x, y: np.sin((x/200.)*(y/200.)**2), (1000, 1000)) >>> xlabel("pixels") >>> ylabel("pixels") >>> zlabel("intensity") >>> gray() >>> imshow(img) >>> figure("plotyy") >>> plotyy(x, np.sin(x), x, np.cos(x)) >>> ylabel("sinus", "cosinus") >>> show() Reference ~~~~~~~~~ .. autofunction:: interactive .. autofunction:: ion .. autofunction:: ioff .. autofunction:: figure .. autofunction:: gcf .. autofunction:: gca .. autofunction:: show .. autofunction:: subplot .. autofunction:: close .. autofunction:: title .. autofunction:: xlabel .. autofunction:: ylabel .. autofunction:: zlabel .. autofunction:: yreverse .. autofunction:: grid .. autofunction:: legend .. autofunction:: colormap .. autofunction:: savefig .. autofunction:: plot .. autofunction:: plotyy .. autofunction:: semilogx .. autofunction:: semilogy .. autofunction:: loglog .. autofunction:: errorbar .. autofunction:: hist .. autofunction:: imshow .. autofunction:: pcolor """ import sys from qtpy.QtWidgets import ( QMainWindow, QFrame, QVBoxLayout, QGridLayout, QToolBar, ) from qtpy.QtGui import QPixmap, QPainter, QImageWriter from qtpy.QtPrintSupport import QPrinter from qtpy.QtCore import QRect, Qt, QBuffer, QIODevice from qtpy import PYQT5 import guidata from guidata.configtools import get_icon from guidata.qthelpers import win32_fix_title_bar_background # Local imports from guiqwt.config import _ from guiqwt.plot import PlotManager from guiqwt.image import ImagePlot, INTERP_NEAREST, INTERP_LINEAR, INTERP_AA from guiqwt.curve import CurvePlot, PlotItemList from guiqwt.histogram import ContrastAdjustment from guiqwt.cross_section import XCrossSection, YCrossSection from guiqwt.builder import make _interactive = False _figures = {} _current_fig = None _current_axes = None class Window(QMainWindow): def __init__(self, wintitle): super(Window, self).__init__() win32_fix_title_bar_background(self) self.default_tool = None self.plots = [] self.itemlist = PlotItemList(None) self.contrast = ContrastAdjustment(None) self.xcsw = XCrossSection(None) self.ycsw = YCrossSection(None) self.manager = PlotManager(self) self.toolbar = QToolBar(_("Tools"), self) self.manager.add_toolbar(self.toolbar, "default") self.toolbar.setMovable(True) self.toolbar.setFloatable(True) self.addToolBar(Qt.TopToolBarArea, self.toolbar) frame = QFrame(self) self.setCentralWidget(frame) self.layout = QGridLayout() layout = QVBoxLayout(frame) frame.setLayout(layout) layout.addLayout(self.layout) self.frame = frame self.setWindowTitle(wintitle) self.setWindowIcon(get_icon("guiqwt.svg")) def closeEvent(self, event): global _figures, _current_fig, _current_axes figure_title = str(self.windowTitle()) if _figures.pop(figure_title) == _current_fig: _current_fig = None _current_axes = None self.itemlist.close() self.contrast.close() self.xcsw.close() self.ycsw.close() event.accept() def add_plot(self, i, j, plot): self.layout.addWidget(plot, i, j) self.manager.add_plot(plot) self.plots.append(plot) def replot(self): for plot in self.plots: plot.replot() item = plot.get_default_item() if item is not None: plot.set_active_item(item) item.unselect() def add_panels(self, images=False): self.manager.add_panel(self.itemlist) if images: for panel in (self.ycsw, self.xcsw, self.contrast): panel.hide() self.manager.add_panel(panel) def register_tools(self, images=False): if images: self.manager.register_all_image_tools() else: self.manager.register_all_curve_tools() def display(self): self.show() self.replot() self.manager.get_default_tool().activate() self.manager.update_tools_status() class Figure(object): def __init__(self, title): self.axes = {} self.title = title self.win = None self.app = None def get_axes(self, i, j): if (i, j) in self.axes: return self.axes[(i, j)] ax = Axes() self.axes[(i, j)] = ax return ax def build_window(self): self.app = guidata.qapplication() self.win = Window(wintitle=self.title) images = False for (i, j), ax in list(self.axes.items()): ax.setup_window(i, j, self.win) if ax.images: images = True self.win.add_panels(images=images) self.win.register_tools(images=images) def show(self): if not self.win: self.build_window() self.win.display() def save(self, fname, format, draft): if isinstance(fname, str): if format == "pdf": self.app = guidata.qapplication() if draft: mode = QPrinter.ScreenResolution else: mode = QPrinter.HighResolution printer = QPrinter(mode) printer.setOutputFormat(QPrinter.PdfFormat) printer.setOrientation(QPrinter.Landscape) printer.setOutputFileName(fname) printer.setCreator("guiqwt.pyplot") self.print_(printer) else: if self.win is None: self.show() if PYQT5: pixmap = self.win.centralWidget().grab() else: pixmap = QPixmap.grabWidget(self.win.centralWidget()) pixmap.save(fname, format.upper()) else: # Buffer fd = fname assert hasattr(fd, "write"), "object is not file-like as expected" if self.win is None: self.show() pixmap = QPixmap.grabWidget(self.win.centralWidget()) buff = QBuffer() buff.open(QIODevice.ReadWrite) pixmap.save(buff, format.upper()) fd.write(buff.data()) buff.close() fd.seek(0) def print_(self, device): if not self.win: self.build_window() W = device.width() H = device.height() from numpy import array coords = array(list(self.axes.keys())) imin = coords[:, 0].min() imax = coords[:, 0].max() jmin = coords[:, 1].min() jmax = coords[:, 1].max() w = W / (jmax - jmin + 1) h = H / (imax - imin + 1) paint = QPainter(device) for (i, j), ax in list(self.axes.items()): oy = (i - imin) * h ox = (j - jmin) * w ax.widget.print_(paint, QRect(ox, oy, w, h)) def do_mainloop(mainloop): global _current_fig if not _current_fig: print("Warning: must create a figure before showing it", file=sys.stderr) elif mainloop: app = guidata.qapplication() app.exec_() class Axes(object): def __init__(self): self.plots = [] self.images = [] self.last = None self.legend_position = None self.grid = False self.xlabel = ("", "") self.ylabel = ("", "") self.xcolor = ("black", "black") # axis label colors self.ycolor = ("black", "black") # axis label colors self.zlabel = None self.yreverse = False self.colormap = "jet" self.xscale = "lin" self.yscale = "lin" self.xlimits = None self.ylimits = None self.widget = None self.main_widget = None def add_legend(self, position): self.legend_position = position def set_grid(self, grid): self.grid = grid def set_xlim(self, xmin, xmax): self.xlimits = xmin, xmax self._update_plotwidget() def set_ylim(self, ymin, ymax): self.ylimits = ymin, ymax self._update_plotwidget() def add_plot(self, item): self.plots.append(item) self.last = item def add_image(self, item): self.images.append(item) self.last = item def setup_window(self, i, j, win): if self.images: plot = self.setup_image(i, j, win) else: plot = self.setup_plot(i, j, win) self.widget = plot plot.do_autoscale() self._update_plotwidget() def _update_plotwidget(self): p = self.main_widget if p is None: return if self.grid: p.gridparam.maj_xenabled = True p.gridparam.maj_yenabled = True p.gridparam.update_grid(p) p.set_axis_color("bottom", self.xcolor[0]) p.set_axis_color("top", self.xcolor[1]) p.set_axis_color("left", self.ycolor[0]) p.set_axis_color("right", self.ycolor[1]) if self.xlimits is not None: p.set_axis_limits("bottom", *self.xlimits) if self.ylimits is not None: p.set_axis_limits("left", *self.ylimits) def setup_image(self, i, j, win): p = ImagePlot( win, xlabel=self.xlabel, ylabel=self.ylabel, zlabel=self.zlabel, yreverse=self.yreverse, ) self.main_widget = p win.add_plot(i, j, p) for item in self.images + self.plots: if item in self.images: item.set_color_map(self.colormap) p.add_item(item) if self.legend_position is not None: p.add_item(make.legend(self.legend_position)) return p def setup_plot(self, i, j, win): p = CurvePlot(win, xlabel=self.xlabel, ylabel=self.ylabel) self.main_widget = p win.add_plot(i, j, p) for item in self.plots: p.add_item(item) p.enable_used_axes() active_item = p.get_active_item(force=True) p.set_scales(self.xscale, self.yscale) active_item.unselect() if self.legend_position is not None: p.add_item(make.legend(self.legend_position)) return p def _make_figure_title(N=None): global _figures if N is None: N = len(_figures) + 1 if isinstance(N, str): return N else: return "Figure %d" % N def figure(N=None): """Create a new figure""" global _figures, _current_fig, _current_axes title = _make_figure_title(N) if title in _figures: f = _figures[title] else: f = Figure(title) _figures[title] = f _current_fig = f _current_axes = None return f def gcf(): """Get current figure""" global _current_fig if _current_fig: return _current_fig else: return figure() def gca(): """Get current axes""" global _current_axes if not _current_axes: axes = gcf().get_axes(1, 1) _current_axes = axes return _current_axes def show(mainloop=True): """ Show all figures and enter Qt event loop This should be the last line of your script """ global _figures, _interactive for fig in list(_figures.values()): fig.show() if not _interactive: do_mainloop(mainloop) def _show_if_interactive(): global _interactive if _interactive: show() def subplot(n, m, k): """ Create a subplot command Example:: import numpy as np x = np.linspace(-5, 5, 1000) figure(1) subplot(2, 1, 1) plot(x, np.sin(x), "r+") subplot(2, 1, 2) plot(x, np.cos(x), "g-") show() """ global _current_axes lig = (k - 1) / m col = (k - 1) % m fig = gcf() axe = fig.get_axes(lig, col) _current_axes = axe return axe def plot(*args, **kwargs): """ Plot curves Example:: import numpy as np x = np.linspace(-5, 5, 1000) plot(x, np.sin(x), "r+") plot(x, np.cos(x), "g-") show() """ axe = gca() curves = make.mcurve(*args, **kwargs) if not isinstance(curves, list): curves = [curves] for curve in curves: axe.add_plot(curve) _show_if_interactive() return curves def plotyy(x1, y1, x2, y2): """ Plot curves with two different y axes Example:: import numpy as np x = np.linspace(-5, 5, 1000) plotyy(x, np.sin(x), x, np.cos(x)) ylabel("sinus", "cosinus") show() """ axe = gca() curve1 = make.mcurve(x1, y1, yaxis="left") curve2 = make.mcurve(x2, y2, yaxis="right") axe.ycolor = (curve1.curveparam.line.color, curve2.curveparam.line.color) axe.add_plot(curve1) axe.add_plot(curve2) _show_if_interactive() return [curve1, curve2] def hist(data, bins=None, logscale=None, title=None, color=None): """ Plot 1-D histogram Example:: from numpy.random import normal data = normal(0, 1, (2000, )) hist(data) show() """ axe = gca() curve = make.histogram( data, bins=bins, logscale=logscale, title=title, color=color, yaxis="left" ) axe.add_plot(curve) _show_if_interactive() return [curve] def semilogx(*args, **kwargs): """ Plot curves with logarithmic x-axis scale Example:: import numpy as np x = np.linspace(-5, 5, 1000) semilogx(x, np.sin(12*x), "g-") show() """ axe = gca() axe.xscale = "log" curve = make.mcurve(*args, **kwargs) axe.add_plot(curve) _show_if_interactive() return [curve] def semilogy(*args, **kwargs): """ Plot curves with logarithmic y-axis scale Example:: import numpy as np x = np.linspace(-5, 5, 1000) semilogy(x, np.sin(12*x), "g-") show() """ axe = gca() axe.yscale = "log" curve = make.mcurve(*args, **kwargs) axe.add_plot(curve) _show_if_interactive() return [curve] def loglog(*args, **kwargs): """ Plot curves with logarithmic x-axis and y-axis scales Example:: import numpy as np x = np.linspace(-5, 5, 1000) loglog(x, np.sin(12*x), "g-") show() """ axe = gca() axe.xscale = "log" axe.yscale = "log" curve = make.mcurve(*args, **kwargs) axe.add_plot(curve) _show_if_interactive() return [curve] def errorbar(*args, **kwargs): """ Plot curves with error bars Example:: import numpy as np x = np.linspace(-5, 5, 1000) errorbar(x, -1+x**2/20+.2*np.random.rand(len(x)), x/20) show() """ axe = gca() curve = make.merror(*args, **kwargs) axe.add_plot(curve) _show_if_interactive() return [curve] def imread(fname, to_grayscale=False): """Read data from *fname*""" from guiqwt import io return io.imread(fname, to_grayscale=to_grayscale) def imshow(data, interpolation=None, mask=None): """ Display the image in *data* to current axes interpolation: 'nearest', 'linear' (default), 'antialiasing' Example:: import numpy as np x = np.linspace(-5, 5, 1000) img = np.fromfunction(lambda x, y: np.sin((x/200.)*(y/200.)**2), (1000, 1000)) gray() imshow(img) show() """ axe = gca() import numpy as np if isinstance(data, np.ma.MaskedArray) and mask is None: mask = data.mask data = data.data if mask is None: img = make.image(data) else: img = make.maskedimage(data, mask, show_mask=True) if interpolation is not None: interp_dict = { "nearest": INTERP_NEAREST, "linear": INTERP_LINEAR, "antialiasing": INTERP_AA, } assert interpolation in interp_dict, "invalid interpolation option" img.set_interpolation(interp_dict[interpolation], size=5) axe.add_image(img) axe.yreverse = True _show_if_interactive() return [img] def pcolor(*args): """ Create a pseudocolor plot of a 2-D array Example:: import numpy as np r = np.linspace(1., 16, 100) th = np.linspace(0., np.pi, 100) R, TH = np.meshgrid(r, th) X = R*np.cos(TH) Y = R*np.sin(TH) Z = 4*TH+R pcolor(X, Y, Z) show() """ axe = gca() img = make.pcolor(*args) axe.add_image(img) axe.yreverse = len(args) == 1 _show_if_interactive() return [img] def interactive(state): """Toggle interactive mode""" global _interactive _interactive = state def ion(): """Turn interactive mode on""" interactive(True) def ioff(): """Turn interactive mode off""" interactive(False) # TODO: The following functions (title, xlabel, ...) should update an already # shown figure to be compatible with interactive mode -- for now it just # works if these functions are called before showing the figure def title(text): """Set current figure title""" global _figures fig = gcf() _figures.pop(fig.title) fig.title = text _figures[text] = fig def xlabel(bottom="", top=""): """Set current x-axis label""" assert isinstance(bottom, str) and isinstance(top, str) axe = gca() axe.xlabel = (bottom, top) def ylabel(left="", right=""): """Set current y-axis label""" assert isinstance(left, str) and isinstance(right, str) axe = gca() axe.ylabel = (left, right) def zlabel(label): """Set current z-axis label""" assert isinstance(label, str) axe = gca() axe.zlabel = label def yreverse(reverse): """ Set y-axis direction of increasing values reverse = False (default) y-axis values increase from bottom to top reverse = True y-axis values increase from top to bottom """ assert isinstance(reverse, bool) axe = gca() axe.yreverse = reverse def grid(act): """Toggle grid visibility""" axe = gca() axe.set_grid(act) def legend(pos="TR"): """Add legend to current axes (pos='TR', 'TL', 'BR', ...)""" axe = gca() axe.add_legend(pos) def colormap(name): """Set color map to *name*""" axe = gca() axe.colormap = name def _add_colormaps(glbs): from guiqwt.colormap import get_colormap_list for cmap_name in get_colormap_list(): glbs[cmap_name] = lambda name=cmap_name: colormap(name) glbs[cmap_name].__doc__ = "Set color map to '%s'" % cmap_name _add_colormaps(globals()) def close(N=None, all=False): """Close figure""" global _figures, _current_fig, _current_axes if all: _figures = {} _current_fig = None _current_axes = None return if N is None: fig = gcf() else: fig = figure(N) fig.close() def savefig(fname, format=None, draft=False): """ Save figure Currently supports PDF and PNG formats only """ if not isinstance(fname, str) and format is None: # Buffer/fd format = "png" if format is None: format = fname.rsplit(".", 1)[-1].lower() fmts = [str(fmt).lower() for fmt in QImageWriter.supportedImageFormats()] assert format in fmts, _( "Function 'savefig' currently supports the " "following formats:\n%s" ) % ",".join(fmts) else: format = format.lower() fig = gcf() fig.save(fname, format, draft) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/qtdesigner.py0000666000000000000000000000644100000000000013773 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.qtdesigner ----------------- The `qtdesigner` module provides QtDesigner helper functions for `guiqwt`: * :py:func:`guiqwt.qtdesigner.loadui` * :py:func:`guiqwt.qtdesigner.compileui` * :py:func:`guiqwt.qtdesigner.create_qtdesigner_plugins` Reference ~~~~~~~~~ .. autofunction:: loadui .. autofunction:: compileui .. autofunction:: create_qtdesigner_plugin """ import io from qtpy import uic from qtpy.QtDesigner import QPyDesignerCustomWidgetPlugin from qtpy.QtGui import QIcon from guidata.configtools import get_icon def loadui(fname, replace_class="QwtPlot"): """ Return Widget or Window class from QtDesigner ui file 'fname' The loadUiType function (PyQt5.uic) doesn't work correctly with guiqwt QtDesigner plugins because they don't inheritate from a PyQt5.QtGui object. """ uifile_text = open(fname).read().replace(replace_class, "QFrame") ui, base_class = uic.loadUiType(io.StringIO(uifile_text)) class Form(base_class, ui): def __init__(self, parent=None): super(Form, self).__init__(parent) self.setupUi(self) return Form def compileui(fname, replace_class="QwtPlot"): uifile_text = open(fname).read().replace("QwtPlot", "QFrame") uic.compileUi( io.StringIO(uifile_text), open(fname.replace(".ui", "_ui.py"), "w"), pyqt3_wrapper=True, ) def create_qtdesigner_plugin( group, module_name, class_name, widget_options={}, icon=None, tooltip="", whatsthis="", ): """Return a custom QtDesigner plugin class Example: create_qtdesigner_plugin(group = "guiqwt", module_name = "guiqwt.image", class_name = "ImageWidget", icon = "image.png", tooltip = "", whatsthis = ""): """ Widget = getattr(__import__(module_name, fromlist=[class_name]), class_name) class CustomWidgetPlugin(QPyDesignerCustomWidgetPlugin): def __init__(self, parent=None): QPyDesignerCustomWidgetPlugin.__init__(self) self.initialized = False def initialize(self, core): if self.initialized: return self.initialized = True def isInitialized(self): return self.initialized def createWidget(self, parent): return Widget(parent, **widget_options) def name(self): return class_name def group(self): return group def icon(self): if icon is not None: return get_icon(icon) else: return QIcon() def toolTip(self): return tooltip def whatsThis(self): return whatsthis def isContainer(self): return False def domXml(self): return '\n' % ( class_name, class_name.lower(), ) def includeFile(self): return module_name return CustomWidgetPlugin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/qthelpers.py0000666000000000000000000001330000000000000013625 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guidata/__init__.py for details) """ qthelpers --------- The ``guiqwt.qthelpers`` module provides helper functions for developing easily Qt-based graphical user interfaces with guiqwt. Ready-to-use open/save dialogs: :py:data:`guiqwt.qthelpers.exec_image_save_dialog` Executes an image save dialog box (QFileDialog.getSaveFileName) :py:data:`guiqwt.qthelpers.exec_image_open_dialog` Executes an image open dialog box (QFileDialog.getOpenFileName) :py:data:`guiqwt.qthelpers.exec_images_open_dialog` Executes an image*s* open dialog box (QFileDialog.getOpenFileNames) Reference ~~~~~~~~~ .. autofunction:: exec_image_save_dialog .. autofunction:: exec_image_open_dialog .. autofunction:: exec_images_open_dialog """ import sys import os.path as osp from qtpy.QtWidgets import QMessageBox from qtpy.compat import getsavefilename, getopenfilename, getopenfilenames # Local imports from guiqwt.config import _ from guiqwt import io # =============================================================================== # Ready-to-use open/save dialogs # =============================================================================== def exec_image_save_dialog(parent, data, template=None, basedir="", app_name=None): """ Executes an image save dialog box (QFileDialog.getSaveFileName) * parent: parent widget (None means no parent) * data: image pixel array data * template: image template (pydicom dataset) for DICOM files * basedir: base directory ('' means current directory) * app_name (opt.): application name (used as a title for an eventual error message box in case something goes wrong when saving image) Returns filename if dialog is accepted, None otherwise """ saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filename, _filter = getsavefilename( parent, _("Save as"), basedir, io.iohandler.get_filters("save", dtype=data.dtype, template=template), ) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err if filename: filename = str(filename) kwargs = {} if osp.splitext(filename)[1].lower() == ".dcm": kwargs["template"] = template try: io.imwrite(filename, data, **kwargs) return filename except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( parent, _("Error") if app_name is None else app_name, (_("%s could not be written:") % osp.basename(filename)) + "\n" + str(msg), ) return def exec_image_open_dialog( parent, basedir="", app_name=None, to_grayscale=True, dtype=None ): """ Executes an image open dialog box (QFileDialog.getOpenFileName) * parent: parent widget (None means no parent) * basedir: base directory ('' means current directory) * app_name (opt.): application name (used as a title for an eventual error message box in case something goes wrong when saving image) * to_grayscale (default=True): convert image to grayscale Returns (filename, data) tuple if dialog is accepted, None otherwise """ saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filename, _filter = getopenfilename( parent, _("Open"), basedir, io.iohandler.get_filters("load", dtype=dtype) ) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err filename = str(filename) try: data = io.imread(filename, to_grayscale=to_grayscale) except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( parent, _("Error") if app_name is None else app_name, (_("%s could not be opened:") % osp.basename(filename)) + "\n" + str(msg), ) return return filename, data def exec_images_open_dialog( parent, basedir="", app_name=None, to_grayscale=True, dtype=None ): """ Executes an image*s* open dialog box (QFileDialog.getOpenFileNames) * parent: parent widget (None means no parent) * basedir: base directory ('' means current directory) * app_name (opt.): application name (used as a title for an eventual error message box in case something goes wrong when saving image) * to_grayscale (default=True): convert image to grayscale Yields (filename, data) tuples if dialog is accepted, None otherwise """ saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filenames, _filter = getopenfilenames( parent, _("Open"), basedir, io.iohandler.get_filters("load", dtype=dtype) ) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err filenames = [str(fname) for fname in list(filenames)] for filename in filenames: try: data = io.imread(filename, to_grayscale=to_grayscale) except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( parent, _("Error") if app_name is None else app_name, (_("%s could not be opened:") % osp.basename(filename)) + "\n" + str(msg), ) return yield filename, data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/scaler.py0000666000000000000000000000347400000000000013102 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.scaler ------------- The `scaler` module wraps features provided by the C++ scaler engine (`_scaler` extension): * :py:func:`guiqwt.scaler.resize`: resize an image using the scaler engine Reference ~~~~~~~~~ .. autofunction:: resize """ # TODO: Move all _scaler imports in this module and do something to avoid # the need to import INTERP_LINEAR, INTERP_AA, ... in all modules using the # scaler (code refactoring between pyplot.imshow, # styles.BaseImageParam.update_image) # TODO: Other functions like resize could be written in the future import numpy as np from guiqwt._scaler import _scale_rect, INTERP_NEAREST, INTERP_LINEAR, INTERP_AA def resize(data, shape, interpolation=None): """Resize array *data* to *shape* (tuple) interpolation: 'nearest', 'linear' (default), 'antialiasing'""" interpolate = (INTERP_NEAREST,) if interpolation is not None: interp_dict = { "nearest": INTERP_NEAREST, "linear": INTERP_LINEAR, "antialiasing": INTERP_AA, } assert interpolation in interp_dict, "invalid interpolation option" interp_mode = interp_dict[interpolation] if interp_mode in (INTERP_NEAREST, INTERP_LINEAR): interpolate = (interp_mode,) if interp_mode == INTERP_AA: aa = np.ones((5, 5), data.dtype) interpolate = (interp_mode, aa) out = np.empty(shape) src_rect = (0, 0, data.shape[1], data.shape[0]) dst_rect = (0, 0, out.shape[1], out.shape[0]) _scale_rect(data, src_rect, out, dst_rect, (1.0, 0.0, None), interpolate) return out ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625900.0 guiqwt-4.0.1/guiqwt/shapes.py0000666000000000000000000014674100000000000013121 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.shapes ------------- The `shapes` module provides geometrical shapes: * :py:class:`guiqwt.shapes.PolygonShape` * :py:class:`guiqwt.shapes.RectangleShape` * :py:class:`guiqwt.shapes.ObliqueRectangleShape` * :py:class:`guiqwt.shapes.PointShape` * :py:class:`guiqwt.shapes.SegmentShape` * :py:class:`guiqwt.shapes.EllipseShape` * :py:class:`guiqwt.shapes.Axes` * :py:class:`guiqwt.shapes.XRangeSelection` A shape is a plot item (derived from QwtPlotItem) that may be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`. .. seealso:: module :py:mod:`guiqwt.annotations` Examples ~~~~~~~~ A shape may be created: * from the associated plot item class (e.g. `RectangleShape` to create a rectangle): the item properties are then assigned by creating the appropriate style parameters object (:py:class:`guiqwt.styles.ShapeParam`) >>> from guiqwt.shapes import RectangleShape >>> from guiqwt.styles import ShapeParam >>> param = ShapeParam() >>> param.title = 'My rectangle' >>> rect_item = RectangleShape(0., 2., 4., 0., param) * or using the `plot item builder` (see :py:func:`guiqwt.builder.make`): >>> from guiqwt.builder import make >>> rect_item = make.rectangle(0., 2., 4., 0., title='My rectangle') Reference ~~~~~~~~~ .. autoclass:: PolygonShape :members: :inherited-members: .. autoclass:: RectangleShape :members: :inherited-members: .. autoclass:: ObliqueRectangleShape :members: :inherited-members: .. autoclass:: PointShape :members: :inherited-members: .. autoclass:: SegmentShape :members: :inherited-members: .. autoclass:: EllipseShape :members: :inherited-members: .. autoclass:: Axes :members: :inherited-members: .. autoclass:: XRangeSelection :members: :inherited-members: """ import os import sys import numpy as np from math import fabs, sqrt, sin, cos, pi from qtpy.QtGui import QPen, QBrush, QPolygonF, QTransform, QPainter from qtpy.QtCore import Qt, QRectF, QPointF, QLineF from guidata.utils import assert_interfaces_valid, update_dataset # Local imports from guiqwt.transitional import QwtPlotItem, QwtSymbol, QwtPlotMarker from guiqwt.config import CONF, _ from guiqwt.interfaces import IBasePlotItem, IShapeItemType, ISerializableType from guiqwt.styles import ( MarkerParam, ShapeParam, RangeShapeParam, AxesShapeParam, MARKERSTYLES, ) from guiqwt.geometry import ( vector_norm, vector_projection, vector_rotation, compute_center, ) from guiqwt.baseplot import canvas_to_axes QT_API = os.environ["QT_API"] class AbstractShape(QwtPlotItem): """Interface pour les objets manipulables il n'est pas nécessaire de dériver de QwtShape si on réutilise une autre classe dérivée de QwtPlotItem La classe de base """ __implements__ = (IBasePlotItem,) _readonly = False _private = False _can_select = True _can_resize = True _can_rotate = False # TODO: implement shape rotation? _can_move = True def __init__(self): super(AbstractShape, self).__init__() self.selected = False # ------IBasePlotItem API---------------------------------------------------- def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return self._can_select def can_resize(self): return self._can_resize def can_rotate(self): return self._can_rotate def can_move(self): return self._can_move def types(self): """Returns a group or category for this item this should be a class object inheriting from IItemType """ return (IShapeItemType,) def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def select(self): """Select item""" self.selected = True self.invalidate_plot() def unselect(self): """Unselect item""" self.selected = False self.invalidate_plot() def hit_test(self, pos): """ Return a tuple with four elements: (distance, attach point, inside, other_object) distance : distance in pixels (canvas coordinates) to the closest attach point attach point: handle of the attach point inside: True if the mouse button has been clicked inside the object other_object: if not None, reference of the object which will be considered as hit instead of self """ pass def update_item_parameters(self): """ Update item parameters (dataset) from object properties """ pass def get_item_parameters(self, itemparams): """ Appends datasets to the list of DataSets describing the parameters used to customize apearance of this item """ pass def set_item_parameters(self, itemparams): """ Change the appearance of this item according to the parameter set provided params is a list of Datasets of the same types as those returned by get_item_parameters """ pass def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" pt = canvas_to_axes(self, pos) self.move_point_to(handle, pt, ctrl) def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" old_pt = canvas_to_axes(self, old_pos) new_pt = canvas_to_axes(self, new_pos) self.move_shape(old_pt, new_pt) if self.plot(): self.plot().SIG_ITEM_MOVED.emit(self, *(old_pt + new_pt)) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ self.move_shape([0, 0], [delta_x, delta_y]) # ------Public API----------------------------------------------------------- def move_point_to(self, handle, pos, ctrl=None): pass def move_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in axis coordinates""" pass def invalidate_plot(self): plot = self.plot() if plot is not None: plot.invalidate() assert_interfaces_valid(AbstractShape) class Marker(QwtPlotMarker): """ A marker that has two callbacks for restraining it's coordinates and displaying it's label we want to derive from QwtPlotMarker so we have to reimplement some of AbstractShape's methods (and PyQt doesn't really like multiple inheritance...) """ __implements__ = (IBasePlotItem,) _readonly = True _private = False _can_select = True _can_resize = True _can_rotate = False _can_move = True def __init__(self, label_cb=None, constraint_cb=None, markerparam=None): super(Marker, self).__init__() self._pending_center_handle = None self.selected = False self.label_cb = label_cb if constraint_cb is None: constraint_cb = self.center_handle self.constraint_cb = constraint_cb if markerparam is None: self.markerparam = MarkerParam(_("Marker")) self.markerparam.read_config(CONF, "plot", "marker/cursor") else: self.markerparam = markerparam self.markerparam.update_marker(self) # ------QwtPlotItem API------------------------------------------------------ def draw(self, painter, xmap, ymap, canvasrect): """Reimplemented to update label and (eventually) center handle""" if self._pending_center_handle: x, y = self.center_handle(self.xValue(), self.yValue()) self.setValue(x, y) self.update_label() QwtPlotMarker.draw(self, painter, xmap, ymap, canvasrect) # ------IBasePlotItem API---------------------------------------------------- def set_selectable(self, state): """Set item selectable state""" self._can_select = state def set_resizable(self, state): """Set item resizable state (or any action triggered when moving an handle, e.g. rotation)""" self._can_resize = state def set_movable(self, state): """Set item movable state""" self._can_move = state def set_rotatable(self, state): """Set item rotatable state""" self._can_rotate = state def can_select(self): return self._can_select def can_resize(self): return self._can_resize def can_rotate(self): return self._can_rotate def can_move(self): return self._can_move def types(self): """Returns a group or category for this item this should be a class object inheriting from IItemType """ return (IShapeItemType,) def set_readonly(self, state): """Set object readonly state""" self._readonly = state def is_readonly(self): """Return object readonly state""" return self._readonly def set_private(self, state): """Set object as private""" self._private = state def is_private(self): """Return True if object is private""" return self._private def select(self): """ Select the object and eventually change its appearance to highlight the fact that it's selected """ if self.selected: # Already selected return self.selected = True self.markerparam.update_marker(self) self.invalidate_plot() def unselect(self): """ Unselect the object and eventually restore its original appearance to highlight the fact that it's not selected anymore """ self.selected = False self.markerparam.update_marker(self) self.invalidate_plot() def hit_test(self, pos): """ Return a tuple with four elements: (distance, attach point, inside, other_object) distance : distance in pixels (canvas coordinates) to the closest attach point attach point: handle of the attach point inside: True if the mouse button has been clicked inside the object other_object: if not None, reference of the object which will be considered as hit instead of self """ plot = self.plot() xc, yc = pos.x(), pos.y() x = plot.transform(self.xAxis(), self.xValue()) y = plot.transform(self.yAxis(), self.yValue()) ms = self.markerparam.markerstyle # The following assert has no purpose except reminding that the # markerstyle is one of the MARKERSTYLES dictionary values, in case # this dictionary evolves in the future (this should not fail): assert ms in list(MARKERSTYLES.values()) if ms == "NoLine": return sqrt((x - xc) ** 2 + (y - yc) ** 2), 0, False, None elif ms == "HLine": return sqrt((y - yc) ** 2), 0, False, None elif ms == "VLine": return sqrt((x - xc) ** 2), 0, False, None elif ms == "Cross": return sqrt(min((x - xc) ** 2, (y - yc) ** 2)), 0, False, None def update_item_parameters(self): self.markerparam.update_param(self) def get_item_parameters(self, itemparams): """ Appends datasets to the list of DataSets describing the parameters used to customize apearance of this item """ self.update_item_parameters() itemparams.add("MarkerParam", self, self.markerparam) def set_item_parameters(self, itemparams): """ Change the appearance of this item according to the parameter set provided params is a list of Datasets of the same types as those returned by get_item_parameters """ update_dataset( self.markerparam, itemparams.get("MarkerParam"), visible_only=True ) self.markerparam.update_marker(self) if self.selected: self.select() def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" x, y = canvas_to_axes(self, pos) self.set_pos(x, y) def move_local_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" old_pt = canvas_to_axes(self, old_pos) new_pt = canvas_to_axes(self, new_pos) self.move_shape(old_pt, new_pt) def move_with_selection(self, delta_x, delta_y): """ Translate the shape together with other selected items delta_x, delta_y: translation in plot coordinates """ self.move_shape([0, 0], [delta_x, delta_y]) # ------Public API----------------------------------------------------------- def set_style(self, section, option): self.markerparam.read_config(CONF, section, option) self.markerparam.update_marker(self) def set_pos(self, x=None, y=None): if x is None: x = self.xValue() if y is None: y = self.yValue() if self.constraint_cb: x, y = self.constraint_cb(x, y) self.setValue(x, y) if self.plot(): self.plot().SIG_MARKER_CHANGED.emit(self) def get_pos(self): return self.xValue(), self.yValue() def set_markerstyle(self, style): param = self.markerparam param.set_markerstyle(style) param.update_marker(self) def is_vertical(self): """Return True if this is a vertical cursor""" return self.lineStyle() == QwtPlotMarker.VLine def is_horizontal(self): """Return True if this is an horizontal cursor""" return self.lineStyle() == QwtPlotMarker.HLine def center_handle(self, x, y): """Center cursor handle depending on marker style (|, -)""" plot = self.plot() if plot is None: self._pending_center_handle = True else: self._pending_center_handle = False if self.is_vertical(): ymap = plot.canvasMap(self.yAxis()) y_top, y_bottom = ymap.s1(), ymap.s2() y = 0.5 * (y_top + y_bottom) elif self.is_horizontal(): xmap = plot.canvasMap(self.xAxis()) x_left, x_right = xmap.s1(), xmap.s2() x = 0.5 * (x_left + x_right) return x, y def move_shape(self, old_pos, new_pos): """Translate the shape such that old_pos becomes new_pos in canvas coordinates""" dx = new_pos[0] - old_pos[0] dy = new_pos[1] - old_pos[1] x, y = self.xValue(), self.yValue() return self.move_point_to(0, (x + dx, y + dy)) def invalidate_plot(self): plot = self.plot() if plot is not None: plot.invalidate() def update_label(self): x, y = self.xValue(), self.yValue() if self.label_cb: label = self.label_cb(x, y) if label is None: return elif self.is_vertical(): label = "x = %g" % x elif self.is_horizontal(): label = "y = %g" % y else: label = "x = %g
y = %g" % (x, y) text = self.label() text.setText(label) self.setLabel(text) plot = self.plot() if plot is not None: xaxis = plot.axisScaleDiv(self.xAxis()) if x < (xaxis.upperBound() + xaxis.lowerBound()) / 2: hor_alignment = Qt.AlignRight else: hor_alignment = Qt.AlignLeft yaxis = plot.axisScaleDiv(self.yAxis()) ymap = plot.canvasMap(self.yAxis()) y_top, y_bottom = ymap.s1(), ymap.s2() if y < 0.5 * (yaxis.upperBound() + yaxis.lowerBound()): if y_top > y_bottom: ver_alignment = Qt.AlignBottom else: ver_alignment = Qt.AlignTop else: if y_top > y_bottom: ver_alignment = Qt.AlignTop else: ver_alignment = Qt.AlignBottom self.setLabelAlignment(hor_alignment | ver_alignment) assert_interfaces_valid(Marker) class PolygonShape(AbstractShape): __implements__ = (IBasePlotItem, ISerializableType) ADDITIONNAL_POINTS = 0 # Number of points which are not part of the shape LINK_ADDITIONNAL_POINTS = False # Link additionnal points with dotted lines CLOSED = True def __init__(self, points=None, closed=None, shapeparam=None): super(PolygonShape, self).__init__() self.closed = self.CLOSED if closed is None else closed self.selected = False if shapeparam is None: self.shapeparam = ShapeParam(_("Shape"), icon="rectangle.png") else: self.shapeparam = shapeparam self.shapeparam.update_shape(self) self.pen = QPen() self.brush = QBrush() self.symbol = QwtSymbol.NoSymbol self.sel_pen = QPen() self.sel_brush = QBrush() self.sel_symbol = QwtSymbol.NoSymbol self.points = np.zeros((0, 2), float) if points is not None: self.set_points(points) def types(self): return (IShapeItemType, ISerializableType) def __reduce__(self): self.shapeparam.update_param(self) state = (self.shapeparam, self.points, self.closed, self.z()) return (PolygonShape, (), state) def __setstate__(self, state): self.shapeparam, self.points, self.closed, z = state self.setZ(z) self.shapeparam.update_shape(self) def serialize(self, writer): """Serialize object to HDF5 writer""" self.shapeparam.update_param(self) writer.write(self.shapeparam, group_name="shapeparam") writer.write(self.points, group_name="points") writer.write(self.closed, group_name="closed") writer.write(self.z(), group_name="z") def deserialize(self, reader): """Deserialize object from HDF5 reader""" self.closed = reader.read("closed") self.shapeparam = ShapeParam(_("Shape"), icon="rectangle.png") reader.read("shapeparam", instance=self.shapeparam) self.shapeparam.update_shape(self) self.points = reader.read(group_name="points", func=reader.read_array) self.setZ(reader.read("z")) # ----Public API------------------------------------------------------------- def set_style(self, section, option): self.shapeparam.read_config(CONF, section, option) self.shapeparam.update_shape(self) def set_points(self, points): self.points = np.array(points, float) assert self.points.shape[1] == 2 def get_points(self): """Return polygon points""" return self.points def get_bounding_rect_coords(self): """Return bounding rectangle coordinates (in plot coordinates)""" poly = QPolygonF() shape_points = self.points[: -self.ADDITIONNAL_POINTS] for i in range(shape_points.shape[0]): poly.append(QPointF(shape_points[i, 0], shape_points[i, 1])) return poly.boundingRect().getCoords() def transform_points(self, xMap, yMap): points = QPolygonF() for i in range(self.points.shape[0]): points.append( QPointF( xMap.transform(self.points[i, 0]), yMap.transform(self.points[i, 1]) ) ) return points def get_reference_point(self): if self.points.size: return self.points.mean(axis=0) def get_pen_brush(self, xMap, yMap): if self.selected: pen = self.sel_pen brush = self.sel_brush sym = self.sel_symbol else: pen = self.pen brush = self.brush sym = self.symbol if self.points.size > 0: x0, y0 = self.get_reference_point() xx0 = xMap.transform(x0) yy0 = yMap.transform(y0) try: # Optimized version in PyQt >= v4.5 t0 = QTransform.fromTranslate(xx0, yy0) except AttributeError: # Fallback for PyQt <= v4.4 t0 = QTransform().translate(xx0, yy0) tr = brush.transform() tr = tr * t0 brush = QBrush(brush) brush.setTransform(tr) return pen, brush, sym def draw(self, painter, xMap, yMap, canvasRect): pen, brush, symbol = self.get_pen_brush(xMap, yMap) painter.setRenderHint(QPainter.Antialiasing) painter.setPen(pen) painter.setBrush(brush) points = self.transform_points(xMap, yMap) if QT_API.startswith("pyside"): points = list(points) if self.ADDITIONNAL_POINTS: shape_points = points[: -self.ADDITIONNAL_POINTS] other_points = points[-self.ADDITIONNAL_POINTS :] else: shape_points = points other_points = [] if self.closed: painter.drawPolygon(shape_points) else: painter.drawPolyline(shape_points) if symbol != QwtSymbol.NoSymbol: symbol.drawSymbols(painter, points) if self.LINK_ADDITIONNAL_POINTS and other_points: pen2 = painter.pen() pen2.setStyle(Qt.DotLine) painter.setPen(pen2) painter.drawPolyline(other_points) def poly_hit_test(self, plot, ax, ay, pos): pos = QPointF(pos) dist = sys.maxsize handle = -1 Cx, Cy = pos.x(), pos.y() poly = QPolygonF() pts = self.points for i in range(pts.shape[0]): # On calcule la distance dans le repère du canvas px = plot.transform(ax, pts[i, 0]) py = plot.transform(ay, pts[i, 1]) if i < pts.shape[0] - self.ADDITIONNAL_POINTS: poly.append(QPointF(px, py)) d = (Cx - px) ** 2 + (Cy - py) ** 2 if d < dist: dist = d handle = i inside = poly.containsPoint(QPointF(Cx, Cy), Qt.OddEvenFill) return sqrt(dist), handle, inside, None def hit_test(self, pos): """return (dist, handle, inside)""" if not self.plot(): return sys.maxsize, 0, False, None return self.poly_hit_test(self.plot(), self.xAxis(), self.yAxis(), pos) def add_local_point(self, pos): pt = canvas_to_axes(self, pos) return self.add_point(pt) def add_point(self, pt): N, _ = self.points.shape self.points = np.resize(self.points, (N + 1, 2)) self.points[N, :] = pt return N def del_point(self, handle): self.points = np.delete(self.points, handle, 0) if handle < len(self.points): return handle else: return self.points.shape[0] - 1 def move_point_to(self, handle, pos, ctrl=None): self.points[handle, :] = pos def move_shape(self, old_pos, new_pos): dx = new_pos[0] - old_pos[0] dy = new_pos[1] - old_pos[1] self.points += np.array([[dx, dy]]) def update_item_parameters(self): self.shapeparam.update_param(self) def get_item_parameters(self, itemparams): self.update_item_parameters() itemparams.add("ShapeParam", self, self.shapeparam) def set_item_parameters(self, itemparams): update_dataset(self.shapeparam, itemparams.get("ShapeParam"), visible_only=True) self.shapeparam.update_shape(self) assert_interfaces_valid(PolygonShape) class PointShape(PolygonShape): CLOSED = False def __init__(self, x=0, y=0, shapeparam=None): super(PointShape, self).__init__(shapeparam=shapeparam) self.set_pos(x, y) def set_pos(self, x, y): """Set the point coordinates to (x, y)""" self.set_points([(x, y)]) def get_pos(self): """Return the point coordinates""" return tuple(self.points[0]) def move_point_to(self, handle, pos, ctrl=None): nx, ny = pos self.points[0] = (nx, ny) def __reduce__(self): state = (self.shapeparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): self.shapeparam, self.points, z = state self.setZ(z) self.shapeparam.update_shape(self) assert_interfaces_valid(PointShape) class SegmentShape(PolygonShape): CLOSED = False ADDITIONNAL_POINTS = 1 # Number of points which are not part of the shape def __init__(self, x1=0, y1=0, x2=0, y2=0, shapeparam=None): super(SegmentShape, self).__init__(shapeparam=shapeparam) self.set_rect(x1, y1, x2, y2) def set_rect(self, x1, y1, x2, y2): """ Set the start point of this segment to (x1, y1) and the end point of this line to (x2, y2) """ self.set_points([(x1, y1), (x2, y2), (0.5 * (x1 + x2), 0.5 * (y1 + y2))]) def get_rect(self): return tuple(self.points[0]) + tuple(self.points[1]) def move_point_to(self, handle, pos, ctrl=None): nx, ny = pos x1, y1, x2, y2 = self.get_rect() if handle == 0: self.set_rect(nx, ny, x2, y2) elif handle == 1: self.set_rect(x1, y1, nx, ny) elif handle in (2, -1): delta = (nx, ny) - self.points.mean(axis=0) self.points += delta def __reduce__(self): state = (self.shapeparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): param, points, z = state # ---------------------------------------------------------------------- # compatibility with previous version of SegmentShape: x1, y1, x2, y2, x3, y3 = points.ravel() v12 = np.array((x2 - x1, y2 - y1)) v13 = np.array((x3 - x1, y3 - y1)) if np.linalg.norm(v12) < np.linalg.norm(v13): # old pickle format points = np.flipud(np.roll(points, -1, axis=0)) # ---------------------------------------------------------------------- self.points = points self.setZ(z) self.shapeparam = param self.shapeparam.update_shape(self) assert_interfaces_valid(SegmentShape) class RectangleShape(PolygonShape): CLOSED = True def __init__(self, x1=0, y1=0, x2=0, y2=0, shapeparam=None): super(RectangleShape, self).__init__(shapeparam=shapeparam) self.set_rect(x1, y1, x2, y2) def set_rect(self, x1, y1, x2, y2): """ Set the coordinates of the rectangle's top-left corner to (x1, y1), and of its bottom-right corner to (x2, y2). """ self.set_points([(x1, y1), (x2, y1), (x2, y2), (x1, y2)]) def get_rect(self): return tuple(self.points[0]) + tuple(self.points[2]) def get_center(self): """Return center coordinates: (xc, yc)""" return compute_center(*self.get_rect()) def move_point_to(self, handle, pos, ctrl=None): nx, ny = pos x1, y1, x2, y2 = self.get_rect() if handle == 0: self.set_rect(nx, ny, x2, y2) elif handle == 1: self.set_rect(x1, ny, nx, y2) elif handle == 2: self.set_rect(x1, y1, nx, ny) elif handle == 3: self.set_rect(nx, y1, x2, ny) elif handle == -1: delta = (nx, ny) - self.points.mean(axis=0) self.points += delta def __reduce__(self): state = (self.shapeparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): self.shapeparam, self.points, z = state self.setZ(z) self.shapeparam.update_shape(self) assert_interfaces_valid(RectangleShape) def _no_null_vector(x0, y0, x1, y1, x2, y2, x3, y3): return ( vector_norm(x0, y0, x1, y1) and vector_norm(x0, y0, x2, y2) and vector_norm(x0, y0, x3, y3) and vector_norm(x1, y1, x2, y2) and vector_norm(x1, y1, x3, y3) and vector_norm(x2, y2, x3, y3) ) class ObliqueRectangleShape(PolygonShape): CLOSED = True ADDITIONNAL_POINTS = 2 # Number of points which are not part of the shape LINK_ADDITIONNAL_POINTS = True # Link additionnal points with dotted lines def __init__(self, x0=0, y0=0, x1=0, y1=0, x2=0, y2=0, x3=0, y3=0, shapeparam=None): super(ObliqueRectangleShape, self).__init__(shapeparam=shapeparam) self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) def set_rect(self, x0, y0, x1, y1, x2, y2, x3, y3): """ Set the rectangle corners coordinates: (x0, y0): top-left corner (x1, y1): top-right corner (x2, y2): bottom-right corner (x3, y3): bottom-left corner :: x: additionnal points (handles used for rotation -- other handles being used for rectangle resizing) (x0, y0)------>(x1, y1) ↑ | | | x x | | | ↓ (x3, y3)<------(x2, y2) """ self.set_points( [ (x0, y0), (x1, y1), (x2, y2), (x3, y3), (0.5 * (x0 + x3), 0.5 * (y0 + y3)), (0.5 * (x1 + x2), 0.5 * (y1 + y2)), ] ) def get_rect(self): return self.points.ravel()[: -self.ADDITIONNAL_POINTS * 2] def get_center(self): """Return center coordinates: (xc, yc)""" rect = tuple(self.points[0]) + tuple(self.points[2]) return compute_center(*rect) def move_point_to(self, handle, pos, ctrl=None): nx, ny = pos x0, y0, x1, y1, x2, y2, x3, y3 = self.get_rect() if handle == 0: if vector_norm(x2, y2, x3, y3) and vector_norm(x2, y2, x1, y1): v0n = np.array((nx - x0, ny - y0)) x3, y3 = vector_projection(v0n, x2, y2, x3, y3) x1, y1 = vector_projection(v0n, x2, y2, x1, y1) x0, y0 = nx, ny if _no_null_vector(x0, y0, x1, y1, x2, y2, x3, y3): self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == 1: if vector_norm(x3, y3, x0, y0) and vector_norm(x3, y3, x2, y2): v1n = np.array((nx - x1, ny - y1)) x0, y0 = vector_projection(v1n, x3, y3, x0, y0) x2, y2 = vector_projection(v1n, x3, y3, x2, y2) x1, y1 = nx, ny if _no_null_vector(x0, y0, x1, y1, x2, y2, x3, y3): self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == 2: if vector_norm(x0, y0, x1, y1) and vector_norm(x0, y0, x3, y3): v2n = np.array((nx - x2, ny - y2)) x1, y1 = vector_projection(v2n, x0, y0, x1, y1) x3, y3 = vector_projection(v2n, x0, y0, x3, y3) x2, y2 = nx, ny if _no_null_vector(x0, y0, x1, y1, x2, y2, x3, y3): self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == 3: if vector_norm(x1, y1, x0, y0) and vector_norm(x1, y1, x2, y2): v3n = np.array((nx - x3, ny - y3)) x0, y0 = vector_projection(v3n, x1, y1, x0, y0) x2, y2 = vector_projection(v3n, x1, y1, x2, y2) x3, y3 = nx, ny if _no_null_vector(x0, y0, x1, y1, x2, y2, x3, y3): self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == 4: x4, y4 = 0.5 * (x0 + x3), 0.5 * (y0 + y3) x5, y5 = 0.5 * (x1 + x2), 0.5 * (y1 + y2) nx, ny = x0 + nx - x4, y0 + ny - y4 # moving handle #4 to handle #0 v10 = np.array((x0 - x1, y0 - y1)) v12 = np.array((x2 - x1, y2 - y1)) v10n = np.array((nx - x1, ny - y1)) k = np.linalg.norm(v12) / np.linalg.norm(v10) v12n = vector_rotation(-np.pi / 2, *v10n) * k x2, y2 = v12n + np.array([x1, y1]) x3, y3 = v12n + v10n + np.array([x1, y1]) x0, y0 = nx, ny dx = x5 - 0.5 * (x1 + x2) dy = y5 - 0.5 * (y1 + y2) x0, y0 = x0 + dx, y0 + dy x1, y1 = x1 + dx, y1 + dy x2, y2 = x2 + dx, y2 + dy x3, y3 = x3 + dx, y3 + dy self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == 5: x4, y4 = 0.5 * (x0 + x3), 0.5 * (y0 + y3) x5, y5 = 0.5 * (x1 + x2), 0.5 * (y1 + y2) nx, ny = x1 + nx - x5, y1 + ny - y5 # moving handle #5 to handle #1 v01 = np.array((x1 - x0, y1 - y0)) v03 = np.array((x3 - x0, y3 - y0)) v01n = np.array((nx - x0, ny - y0)) k = np.linalg.norm(v03) / np.linalg.norm(v01) v03n = vector_rotation(np.pi / 2, *v01n) * k x3, y3 = v03n + np.array([x0, y0]) x2, y2 = v03n + v01n + np.array([x0, y0]) x1, y1 = nx, ny dx = x4 - 0.5 * (x0 + x3) dy = y4 - 0.5 * (y0 + y3) x0, y0 = x0 + dx, y0 + dy x1, y1 = x1 + dx, y1 + dy x2, y2 = x2 + dx, y2 + dy x3, y3 = x3 + dx, y3 + dy self.set_rect(x0, y0, x1, y1, x2, y2, x3, y3) elif handle == -1: delta = (nx, ny) - self.points.mean(axis=0) self.points += delta def __reduce__(self): state = (self.shapeparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): self.shapeparam, self.points, z = state self.setZ(z) self.shapeparam.update_shape(self) assert_interfaces_valid(ObliqueRectangleShape) # FIXME: EllipseShape's ellipse drawing is invalid when aspect_ratio != 1 class EllipseShape(PolygonShape): CLOSED = True def __init__(self, x1=0, y1=0, x2=0, y2=0, shapeparam=None): super(EllipseShape, self).__init__(shapeparam=shapeparam) self.is_ellipse = False self.set_xdiameter(x1, y1, x2, y2) def switch_to_ellipse(self): self.is_ellipse = True def set_xdiameter(self, x0, y0, x1, y1): """Set the coordinates of the ellipse's X-axis diameter""" xline = QLineF(x0, y0, x1, y1) yline = xline.normalVector() yline.translate(xline.pointAt(0.5) - xline.p1()) if self.is_ellipse: yline.setLength(self.get_yline().length()) else: yline.setLength(xline.length()) yline.translate(yline.pointAt(0.5) - yline.p2()) self.set_points( [(x0, y0), (x1, y1), (yline.x1(), yline.y1()), (yline.x2(), yline.y2())] ) def get_xdiameter(self): """Return the coordinates of the ellipse's X-axis diameter""" return tuple(self.points[0]) + tuple(self.points[1]) def set_ydiameter(self, x2, y2, x3, y3): """Set the coordinates of the ellipse's Y-axis diameter""" yline = QLineF(x2, y2, x3, y3) xline = yline.normalVector() xline.translate(yline.pointAt(0.5) - yline.p1()) if self.is_ellipse: xline.setLength(self.get_xline().length()) xline.translate(xline.pointAt(0.5) - xline.p2()) self.set_points( [(xline.x1(), xline.y1()), (xline.x2(), xline.y2()), (x2, y2), (x3, y3)] ) def get_ydiameter(self): """Return the coordinates of the ellipse's Y-axis diameter""" return tuple(self.points[2]) + tuple(self.points[3]) def get_rect(self): """Circle only!""" (x0, y0), (x1, y1) = self.points[0], self.points[1] xc, yc = 0.5 * (x0 + x1), 0.5 * (y0 + y1) radius = 0.5 * np.sqrt((x1 - x0) ** 2 + (y1 - y0) ** 2) return xc - radius, yc - radius, xc + radius, yc + radius def get_center(self): """Return center coordinates: (xc, yc)""" return compute_center(*self.get_xdiameter()) def set_rect(self, x0, y0, x1, y1): """Circle only!""" self.set_xdiameter(x0, 0.5 * (y0 + y1), x1, 0.5 * (y0 + y1)) def compute_elements(self, xMap, yMap): """Return points, lines and ellipse rect""" points = self.transform_points(xMap, yMap) line0 = QLineF(points[0], points[1]) line1 = QLineF(points[2], points[3]) rect = QRectF() rect.setWidth(line0.length()) rect.setHeight(line1.length()) rect.moveCenter(line0.pointAt(0.5)) return points, line0, line1, rect def hit_test(self, pos): """return (dist, handle, inside)""" if not self.plot(): return sys.maxsize, 0, False, None dist, handle, inside, other = self.poly_hit_test( self.plot(), self.xAxis(), self.yAxis(), pos ) if not inside: xMap = self.plot().canvasMap(self.xAxis()) yMap = self.plot().canvasMap(self.yAxis()) _points, _line0, _line1, rect = self.compute_elements(xMap, yMap) inside = rect.contains(QPointF(pos)) return dist, handle, inside, other def draw(self, painter, xMap, yMap, canvasRect): points, line0, line1, rect = self.compute_elements(xMap, yMap) pen, brush, symbol = self.get_pen_brush(xMap, yMap) painter.setRenderHint(QPainter.Antialiasing) painter.setPen(pen) painter.setBrush(brush) painter.drawLine(line0) painter.drawLine(line1) painter.save() painter.translate(rect.center()) painter.rotate(-line0.angle()) painter.translate(-rect.center()) painter.drawEllipse(rect.toRect()) painter.restore() if symbol != QwtSymbol.NoSymbol: for i in range(points.size()): symbol.drawSymbol(painter, points[i].toPoint()) def get_xline(self): return QLineF(*(tuple(self.points[0]) + tuple(self.points[1]))) def get_yline(self): return QLineF(*(tuple(self.points[2]) + tuple(self.points[3]))) def move_point_to(self, handle, pos, ctrl=None): nx, ny = pos if handle == 0: x1, y1 = self.points[1] if ctrl: # When is pressed, the center position is unchanged x0, y0 = self.points[0] x1, y1 = x1 + x0 - nx, y1 + y0 - ny self.set_xdiameter(nx, ny, x1, y1) elif handle == 1: x0, y0 = self.points[0] if ctrl: # When is pressed, the center position is unchanged x1, y1 = self.points[1] x0, y0 = x0 + x1 - nx, y0 + y1 - ny self.set_xdiameter(x0, y0, nx, ny) elif handle == 2: x3, y3 = self.points[3] if ctrl: # When is pressed, the center position is unchanged x2, y2 = self.points[2] x3, y3 = x3 + x2 - nx, y3 + y2 - ny self.set_ydiameter(nx, ny, x3, y3) elif handle == 3: x2, y2 = self.points[2] if ctrl: # When is pressed, the center position is unchanged x3, y3 = self.points[3] x2, y2 = x2 + x3 - nx, y2 + y3 - ny self.set_ydiameter(x2, y2, nx, ny) elif handle == -1: delta = (nx, ny) - self.points.mean(axis=0) self.points += delta def __reduce__(self): state = (self.shapeparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): self.shapeparam, self.points, z = state self.setZ(z) self.shapeparam.update_shape(self) assert_interfaces_valid(EllipseShape) class Axes(PolygonShape): """Axes( (0,1), (1,1), (0,0) )""" CLOSED = True def __init__( self, p0=(0, 0), p1=(0, 0), p2=(0, 0), axesparam=None, shapeparam=None ): super(Axes, self).__init__(shapeparam=shapeparam) self.set_rect(p0, p1, p2) self.arrow_angle = 15 # degrees self.arrow_size = 0.05 # % of axe length self.x_pen = self.pen self.x_brush = self.brush self.y_pen = self.pen self.y_brush = self.brush if axesparam is None: self.axesparam = AxesShapeParam(_("Axes"), icon="gtaxes.png") else: self.axesparam = axesparam self.axesparam.update_param(self) def __reduce__(self): self.axesparam.update_param(self) state = (self.shapeparam, self.axesparam, self.points, self.z()) return (self.__class__, (), state) def __setstate__(self, state): shapeparam, axesparam, points, z = state self.points = points self.setZ(z) self.shapeparam = shapeparam self.shapeparam.update_shape(self) self.axesparam = axesparam self.axesparam.update_axes(self) def serialize(self, writer): """Serialize object to HDF5 writer""" super(Axes, self).serialize(writer) self.axesparam.update_param(self) writer.write(self.axesparam, group_name="axesparam") def deserialize(self, reader): """Deserialize object from HDF5 reader""" super(Axes, self).deserialize(reader) self.axesparam = AxesShapeParam(_("Axes"), icon="gtaxes.png") reader.read("axesparam", instance=self.axesparam) self.axesparam.update_axes(self) def get_transform_matrix(self, dx=1.0, dy=1.0): p0, p1, _p3, p2 = [np.array([p[0], p[1], 1.0]) for p in self.points] matrix = np.array([(p1 - p0) / dx, (p2 - p0) / dy, p0]) if abs(np.linalg.det(matrix)) > 1e-12: return np.linalg.inv(matrix) def set_rect(self, p0, p1, p2): p3x = p1[0] + p2[0] - p0[0] p3y = p1[1] + p2[1] - p0[1] self.set_points([p0, p1, (p3x, p3y), p2]) def set_style(self, section, option): PolygonShape.set_style(self, section, option + "/border") self.axesparam.read_config(CONF, section, option) self.axesparam.update_axes(self) def move_point_to(self, handle, pos, ctrl=None): _nx, _ny = pos p0, p1, _p3, p2 = list(self.points) d1x = p1[0] - p0[0] d1y = p1[1] - p0[1] d2x = p2[0] - p0[0] d2y = p2[1] - p0[1] if handle == 0: pp0 = pos pp1 = pos[0] + d1x, pos[1] + d1y pp2 = pos[0] + d2x, pos[1] + d2y elif handle == 1: pp0 = p0 pp1 = pos pp2 = p2 elif handle == 3: pp0 = p0 pp1 = p1 pp2 = pos elif handle == 2: # find (a,b) such that p3 = a*d1 + b*d2 + p0 d3x = pos[0] - p0[0] d3y = pos[1] - p0[1] det = d1x * d2y - d2x * d1y if abs(det) < 1e-6: # reset d1x = d2y = 1.0 d1y = d2x = 0.0 det = 1.0 a = (d2y * d3x - d2x * d3y) / det b = (-d1y * d3x + d1x * d3y) / det _pp3 = pos pp1 = p0[0] + a * d1x, p0[1] + a * d1y pp2 = p0[0] + b * d2x, p0[1] + b * d2y pp0 = p0 self.set_rect(pp0, pp1, pp2) if self.plot(): self.plot().SIG_AXES_CHANGED.emit(self) def move_shape(self, old_pos, new_pos): """Overriden to emit the axes_changed signal""" PolygonShape.move_shape(self, old_pos, new_pos) if self.plot(): self.plot().SIG_AXES_CHANGED.emit(self) def draw(self, painter, xMap, yMap, canvasRect): PolygonShape.draw(self, painter, xMap, yMap, canvasRect) p0, p1, _, p2 = list(self.points) painter.setPen(self.x_pen) painter.setBrush(self.x_brush) self.draw_arrow(painter, xMap, yMap, p0, p1) painter.setPen(self.y_pen) painter.setBrush(self.y_brush) self.draw_arrow(painter, xMap, yMap, p0, p2) def draw_arrow(self, painter, xMap, yMap, p0, p1): sz = self.arrow_size angle = pi * self.arrow_angle / 180.0 ca, sa = cos(angle), sin(angle) d1x = xMap.transform(p1[0]) - xMap.transform(p0[0]) d1y = yMap.transform(p1[1]) - yMap.transform(p0[1]) norm = sqrt(d1x ** 2 + d1y ** 2) if abs(norm) < 1e-6: return d1x *= sz / norm d1y *= sz / norm n1x = -d1y n1y = d1x # arrow : a0 - a1 == p1 - a2 a1x = xMap.transform(p1[0]) a1y = yMap.transform(p1[1]) a0x = a1x - ca * d1x + sa * n1x a0y = a1y - ca * d1y + sa * n1y a2x = a1x - ca * d1x - sa * n1x a2y = a1y - ca * d1y - sa * n1y poly = QPolygonF() poly.append(QPointF(a0x, a0y)) poly.append(QPointF(a1x, a1y)) poly.append(QPointF(a2x, a2y)) painter.drawPolygon(poly) def update_item_parameters(self): self.axesparam.update_param(self) def get_item_parameters(self, itemparams): PolygonShape.get_item_parameters(self, itemparams) self.update_item_parameters() itemparams.add("AxesShapeParam", self, self.axesparam) def set_item_parameters(self, itemparams): PolygonShape.set_item_parameters(self, itemparams) update_dataset( self.axesparam, itemparams.get("AxesShapeParam"), visible_only=True ) self.axesparam.update_axes(self) assert_interfaces_valid(Axes) class XRangeSelection(AbstractShape): def __init__(self, _min, _max, shapeparam=None): super(XRangeSelection, self).__init__() self._min = _min self._max = _max if shapeparam is None: self.shapeparam = RangeShapeParam(_("Range"), icon="xrange.png") self.shapeparam.read_config(CONF, "histogram", "range") else: self.shapeparam = shapeparam self.pen = None self.sel_pen = None self.brush = None self.handle = None self.symbol = None self.sel_symbol = None self.shapeparam.update_range(self) # creates all the above QObjects def get_handles_pos(self): plot = self.plot() rct = plot.canvas().contentsRect() y = rct.center().y() x0 = plot.transform(self.xAxis(), self._min) x1 = plot.transform(self.xAxis(), self._max) return x0, x1, y def draw(self, painter, xMap, yMap, canvasRect): plot = self.plot() if not plot: return if self.selected: pen = self.sel_pen sym = self.sel_symbol else: pen = self.pen sym = self.symbol rct = plot.canvas().contentsRect() rct2 = QRectF(rct) rct2.setLeft(xMap.transform(self._min)) rct2.setRight(xMap.transform(self._max)) painter.fillRect(rct2, self.brush) painter.setPen(pen) painter.drawLine(rct2.topLeft(), rct2.bottomLeft()) painter.drawLine(rct2.topRight(), rct2.bottomRight()) dash = QPen(pen) dash.setStyle(Qt.DashLine) dash.setWidth(1) painter.setPen(dash) painter.drawLine( rct2.center().x(), rct2.top(), rct2.center().x(), rct2.bottom() ) painter.setPen(pen) x0, x1, y = self.get_handles_pos() sym.drawSymbol(painter, QPointF(x0, y)) sym.drawSymbol(painter, QPointF(x1, y)) def hit_test(self, pos): x, _y = pos.x(), pos.y() x0, x1, _yp = self.get_handles_pos() d0 = fabs(x0 - x) d1 = fabs(x1 - x) d2 = fabs((x0 + x1) / 2 - x) z = np.array([d0, d1, d2]) dist = z.min() handle = z.argmin() inside = bool(x0 < x < x1) return dist, handle, inside, None def move_local_point_to(self, handle, pos, ctrl=None): """Move a handle as returned by hit_test to the new position pos ctrl: True if button is being pressed, False otherwise""" x, _y = canvas_to_axes(self, pos) self.move_point_to(handle, (x, 0)) def move_point_to(self, hnd, pos, ctrl=None): val, _ = pos if hnd == 0: self._min = val elif hnd == 1: self._max = val elif hnd == 2: move = val - (self._max + self._min) / 2 self._min += move self._max += move self.plot().SIG_RANGE_CHANGED.emit(self, self._min, self._max) # self.plot().replot() def get_range(self): return self._min, self._max def set_range(self, _min, _max, dosignal=True): self._min = _min self._max = _max if dosignal: self.plot().SIG_RANGE_CHANGED.emit(self, self._min, self._max) def move_shape(self, old_pos, new_pos): dx = new_pos[0] - old_pos[0] self._min += dx self._max += dx self.plot().SIG_RANGE_CHANGED.emit(self, self._min, self._max) self.plot().replot() def update_item_parameters(self): self.shapeparam.update_param(self) def get_item_parameters(self, itemparams): self.update_item_parameters() itemparams.add("ShapeParam", self, self.shapeparam) def set_item_parameters(self, itemparams): update_dataset(self.shapeparam, itemparams.get("ShapeParam"), visible_only=True) self.shapeparam.update_range(self) self.sel_brush = QBrush(self.brush) assert_interfaces_valid(XRangeSelection) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1442750726.0 guiqwt-4.0.1/guiqwt/signals.py0000666000000000000000000001054400000000000013265 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.signals -------------- In `guiqwt` version 2, the `signals` module used to contain constants defining the custom Qt SIGNAL objects used by `guiqwt`: the signals definition were gathered here to avoid misspelling signals at connect and emit sites (with old-style signals, any misspelled signal string would have lead to a silent failure of signal emission or connection). Since version 3, to ensure PyQt5 compatibility, `guiqwt` is using only new-style signals and slots. However, all signals are summarized below, in order to facilitate migration from `guiqwt` v2 to `guiqwt` v3. Signals available: :py:data:`guiqwt.baseplot.BasePlot.SIG_ITEM_MOVED` Emitted by plot when an IBasePlotItem-like object was moved from (x0, y0) to (x1, y1) Arguments: item object, x0, y0, x1, y1 :py:data:`guiqwt.baseplot.BasePlot.SIG_MARKER_CHANGED` Emitted by plot when a `guiqwt.shapes.Marker` position changes Arguments: `guiqwt.shapes.Marker` object :py:data:`guiqwt.baseplot.BasePlot.SIG_AXES_CHANGED` Emitted by plot when a `guiqwt.shapes.Axes` position (or angle) changes Arguments: `guiqwt.shapes.Axes` object :py:data:`guiqwt.baseplot.BasePlot.SIG_ANNOTATION_CHANGED` Emitted by plot when an annotations.AnnotatedShape position changes Arguments: annotation item :py:data:`guiqwt.baseplot.BasePlot.SIG_RANGE_CHANGED` Emitted by plot when a shapes.XRangeSelection range changes Arguments: range object, lower_bound, upper_bound :py:data:`guiqwt.baseplot.BasePlot.SIG_ITEMS_CHANGED` Emitted by plot when item list has changed (item removed, added, ...) Arguments: plot :py:data:`guiqwt.baseplot.BasePlot.SIG_ACTIVE_ITEM_CHANGED` Emitted by plot when selected item has changed Arguments: plot :py:data:`guiqwt.baseplot.BasePlot.SIG_ITEM_REMOVED` Emitted by plot when an item was deleted from the itemlist or using the delete item tool Arguments: removed item :py:data:`guiqwt.baseplot.BasePlot.SIG_ITEM_SELECTION_CHANGED` Emitted by plot when an item is selected Arguments: plot :py:data:`guiqwt.baseplot.BasePlot.SIG_PLOT_LABELS_CHANGED` Emitted (by plot) when plot's title or any axis label has changed Arguments: plot :py:data:`guiqwt.baseplot.BasePlot.SIG_AXIS_DIRECTION_CHANGED` Emitted (by plot) when any plot axis direction has changed Arguments: plot :py:data:`guiqwt.histogram.LevelsHistogram.SIG_VOI_CHANGED` Emitted by "contrast" panel's histogram when the lut range of some items changed (for now, this signal is for guiqwt.histogram module's internal use only - the 'public' counterpart of this signal is SIG_LUT_CHANGED, see below) :py:data:`guiqwt.baseplot.BasePlot.SIG_LUT_CHANGED` Emitted by plot when LUT has been changed by the user Arguments: plot :py:data:`guiqwt.baseplot.BasePlot.SIG_MASK_CHANGED` Emitted by plot when image mask has changed Arguments: MaskedImageItem object :py:data:`guiqwt.baseplot.BasePlot.SIG_CS_CURVE_CHANGED` Emitted by cross section plot when cross section curve data has changed Arguments: plot :py:data:`guiqwt.panels.PanelWidget.SIG_VISIBILITY_CHANGED` Emitted for example by panels when their visibility has changed Arguments: state (boolean) :py:data:`guiqwt.tools.InteractiveTool.SIG_VALIDATE_TOOL` Emitted by an interactive tool to notify that the tool has just been "validated", i.e. , or was pressed Arguments: filter :py:data:`guiqwt.tools.InteractiveTool.SIG_TOOL_JOB_FINISHED` Emitted by an interactive tool to notify that it is finished doing its job :py:data:`guiqwt.tools.OpenFileTool.SIG_OPEN_FILE` Emitted by an open file tool :py:data:`guiqwt.tools.ImageMaskTool.SIG_APPLIED_MASK_TOOL` Emitted by the ImageMaskTool when applying the shape-defined mask """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/styles.py0000666000000000000000000017232500000000000013156 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.styles ------------- The `styles` module provides set of parameters (DataSet classes) to configure `plot items` and `plot tools`. .. seealso:: Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Module :py:mod:`guiqwt.tools` Module providing the `plot tools` Reference ~~~~~~~~~ .. autoclass:: CurveParam :members: :inherited-members: .. autoclass:: ErrorBarParam :members: :inherited-members: .. autoclass:: GridParam :members: :inherited-members: .. autoclass:: ImageParam :members: :inherited-members: .. autoclass:: TrImageParam :members: :inherited-members: .. autoclass:: ImageFilterParam :members: :inherited-members: .. autoclass:: HistogramParam :members: :inherited-members: .. autoclass:: Histogram2DParam :members: :inherited-members: .. autoclass:: AxesParam :members: :inherited-members: .. autoclass:: ImageAxesParam :members: :inherited-members: .. autoclass:: LabelParam :members: :inherited-members: .. autoclass:: LegendParam :members: :inherited-members: .. autoclass:: ShapeParam :members: :inherited-members: .. autoclass:: AnnotationParam :members: :inherited-members: .. autoclass:: AxesShapeParam :members: :inherited-members: .. autoclass:: RangeShapeParam :members: :inherited-members: .. autoclass:: MarkerParam :members: :inherited-members: .. autoclass:: FontParam :members: :inherited-members: .. autoclass:: SymbolParam :members: :inherited-members: .. autoclass:: LineStyleParam :members: :inherited-members: .. autoclass:: BrushStyleParam :members: :inherited-members: .. autoclass:: TextStyleParam :members: :inherited-members: """ import numpy as np from qtpy.QtWidgets import QFontDialog from qtpy.QtGui import QPen, QBrush, QColor, QFont, QTransform from qtpy.QtCore import Qt, QSizeF, QPointF from guidata.dataset.datatypes import ( DataSet, ObjectItem, BeginGroup, EndGroup, Obj, DataSetGroup, BeginTabGroup, EndTabGroup, GetAttrProp, NotProp, ) from guidata.dataset.dataitems import ( ChoiceItem, BoolItem, FloatItem, IntItem, ImageChoiceItem, ColorItem, StringItem, ButtonItem, FloatArrayItem, TextItem, ) from guidata.dataset.qtwidgets import DataSetEditLayout from guidata.dataset.qtitemwidgets import DataSetWidget from guidata.utils import update_dataset # Local imports from guiqwt.transitional import QwtPlot, QwtPlotCurve, QwtSymbol, QwtPlotMarker from guiqwt.config import _ from guiqwt.colormap import get_colormap_list, build_icon_from_cmap_name class ItemParameters(object): """Class handling QwtPlotItem-like parameters""" MULTISEL_DATASETS = [] # Customizing tab display order: ENDING_PARAMETERS = ( "CurveParam", "ErrorBarParam", "ShapeParam", "LabelParam", "LegendParam", "GridParam", "AxesParam", ) def __init__(self, multiselection=False): self.multiselection = multiselection self.paramdict = {} self.items = set() @classmethod def register_multiselection(cls, klass, klass_ms): """Register a DataSet couple: (DataSet, DataSet_for_MultiSelection)""" # Inserting element backwards because classes have to be registered # from children to parent (see 'add' method to fully understand why) cls.MULTISEL_DATASETS.insert(0, (klass, klass_ms)) def __add(self, key, item, param): self.paramdict[key] = param self.items.add(item) def add(self, key, item, param): if self.multiselection: for klass, klass_ms in self.MULTISEL_DATASETS: if isinstance(param, klass): title = param.get_title() if key in self.paramdict and not title.endswith("s"): title += "s" param_ms = klass_ms( title=title, comment=param.get_comment(), icon=param.get_icon() ) update_dataset(param_ms, param) self.__add(key, item, param_ms) return self.__add(key, item, param) def get(self, key): from copy import deepcopy return deepcopy(self.paramdict.get(key)) def update(self, plot): # XXX: removed the following workaround as the associated bug can't be # reproduced anymore with guiqwt 3. However, keeping the workaround # here (commented) as it could become useful eventually. # ----- # FIXME: without the following workaround, ImagePlot object aspect ratio # is changed when pressing button "Apply" # (see also guiqwt.image.ImagePlot.edit_axis_parameters) # from guiqwt.image import ImagePlot # if isinstance(plot, ImagePlot): # ratio = plot.get_current_aspect_ratio() # ----- for item in self.items: item.set_item_parameters(self) plot.replot() # ----- # if isinstance(plot, ImagePlot): # plot.set_aspect_ratio(ratio=ratio) # plot.replot() # ----- plot.SIG_ITEMS_CHANGED.emit(plot) def edit(self, plot, title, icon): paramdict = self.paramdict.copy() ending_parameters = [] for key in self.ENDING_PARAMETERS: if key in paramdict: ending_parameters.append(paramdict.pop(key)) parameters = list(paramdict.values()) + ending_parameters dset = DataSetGroup(parameters, title=title.rstrip("."), icon=icon) if dset.edit(parent=plot, apply=lambda dset: self.update(plot)): self.update(plot) LINESTYLES = { "-": "SolidLine", "--": "DashLine", ":": "DotLine", "-.": "DashDotLine", } COLORS = { "r": "red", "g": "green", "b": "blue", "c": "cyan", "m": "magenta", "y": "yellow", "k": "black", "w": "white", "G": "gray", } MARKERS = { "+": QwtSymbol.Cross, "o": QwtSymbol.Ellipse, "*": QwtSymbol.Star1, ".": QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.black), QPen(Qt.black), QSizeF(3, 3)), "x": QwtSymbol.XCross, "s": QwtSymbol.Rect, "d": QwtSymbol.Diamond, "^": QwtSymbol.UTriangle, "v": QwtSymbol.DTriangle, ">": QwtSymbol.RTriangle, "<": QwtSymbol.LTriangle, "h": QwtSymbol.Star2, } MARKERSTYLES = { None: "NoLine", "-": "HLine", "|": "VLine", "+": "Cross", } def style_generator(color_keys="bgrcmykG"): """Cycling through curve styles""" while True: for linestyle in sorted(LINESTYLES.keys()): for color in color_keys: yield color + linestyle def update_style_attr(style, param): """Parse a MATLAB-like style string and update the color, linestyle, marker attributes of the param object """ for marker in list(MARKERS.keys()): if marker in style: param.symbol.update_param(MARKERS[marker]) break else: param.symbol.update_param(QwtSymbol.NoSymbol) for linestyle in list(LINESTYLES.keys()): if linestyle in style: param.line.style = LINESTYLES[linestyle] break else: param.line.style = "NoPen" for color in list(COLORS.keys()): if color in style: param.line.color = COLORS[color] param.symbol.facecolor = COLORS[color] param.symbol.edgecolor = COLORS[color] break def build_reverse_map(lst, obj): dict = {} for idx, _name, _icon in lst: val = getattr(obj, idx) dict[val] = idx return dict LINESTYLE_CHOICES = [ ("SolidLine", _("Solid line"), "solid.png"), ("DashLine", _("Dashed line"), "dash.png"), ("DotLine", _("Dotted line"), "dot.png"), ("DashDotLine", _("Dash-dot line"), "dashdot.png"), ("DashDotDotLine", _("Dash-dot-dot line"), "dashdotdot.png"), ("NoPen", _("No line"), "none.png"), ] MARKER_CHOICES = [ ("Cross", _("Cross"), "cross.png"), ("Ellipse", _("Ellipse"), "ellipse.png"), ("Star1", _("Star"), "star.png"), ("XCross", _("X-Cross"), "xcross.png"), ("Rect", _("Square"), "square.png"), ("Diamond", _("Diamond"), "diamond.png"), ("UTriangle", _("Triangle"), "triangle_u.png"), ("DTriangle", _("Triangle"), "triangle_d.png"), ("RTriangle", _("Triangle"), "triangle_r.png"), ("LTriangle", _("Triangle"), "triangle_l.png"), ("Star2", _("Hexagon"), "hexagon.png"), ("NoSymbol", _("No symbol"), "none.png"), ] CURVESTYLE_CHOICES = [ ("Lines", _("Lines"), "lines.png"), ("Sticks", _("Sticks"), "sticks.png"), ("Steps", _("Steps"), "steps.png"), ("Dots", _("Dots"), "dots.png"), ("NoCurve", _("No curve"), "none.png"), ] BRUSHSTYLE_CHOICES = [ ("NoBrush", _("No brush pattern"), "nobrush.png"), ("SolidPattern", _("Uniform color"), "solidpattern.png"), ("Dense1Pattern", _("Extremely dense brush pattern"), "dense1pattern.png"), ("Dense2Pattern", _("Very dense brush pattern"), "dense2pattern.png"), ("Dense3Pattern", _("Somewhat dense brush pattern"), "dense3pattern.png"), ("Dense4Pattern", _("Half dense brush pattern"), "dense4pattern.png"), ("Dense5Pattern", _("Somewhat sparse brush pattern"), "dense5pattern.png"), ("Dense6Pattern", _("Very sparse brush pattern"), "dense6pattern.png"), ("Dense7Pattern", _("Extremely sparse brush pattern"), "dense7pattern.png"), ("HorPattern", _("Horizontal lines"), "horpattern.png"), ("VerPattern", _("Vertical lines"), "verpattern.png"), ("CrossPattern", _("Crossing horizontal and vertical lines"), "crosspattern.png"), ("BDiagPattern", _("Backward diagonal lines"), "bdiagpattern.png"), ("FDiagPattern", _("Forward diagonal lines"), "fdiagpattern.png"), ("DiagCrossPattern", _("Crossing diagonal lines"), "diagcrosspattern.png"), # ("LinearGradientPattern", _("Linear gradient (set using a dedicated QBrush constructor)"), "none.png"), # ("ConicalGradientPattern", _("Conical gradient (set using a dedicated QBrush constructor)"), "none.png"), # ("RadialGradientPattern", _("Radial gradient (set using a dedicated QBrush constructor)"), "none.png"), # ("TexturePattern", _("Custom pattern (see QBrush::setTexture())"), "none.png"), ] MARKERSTYLE_CHOICES = [ ("NoLine", _("None"), "none.png"), ("HLine", _("Horizontal"), "horiz_marker.png"), ("VLine", _("Vertical"), "vert_marker.png"), ("Cross", _("Cross"), "cross_marker.png"), ] MARKER_NAME = build_reverse_map(MARKER_CHOICES, QwtSymbol) CURVESTYLE_NAME = build_reverse_map(CURVESTYLE_CHOICES, QwtPlotCurve) LINESTYLE_NAME = build_reverse_map(LINESTYLE_CHOICES, Qt) BRUSHSTYLE_NAME = build_reverse_map(BRUSHSTYLE_CHOICES, Qt) MARKERSTYLE_NAME = build_reverse_map(MARKERSTYLE_CHOICES, QwtPlotMarker) # =================================================== # Common font parameters # =================================================== def _font_selection(param, item, value, parent): font = param.build_font() result, valid = QFontDialog.getFont(font, parent) if valid: param.update_param(result) class FontParam(DataSet): family = StringItem(_("Family"), default="default") _choose = ButtonItem(_("Choose font"), _font_selection, default=None).set_pos(col=1) size = IntItem(_("Size in point"), default=12) bold = BoolItem(_("Bold"), default=False).set_pos(col=1) italic = BoolItem(_("Italic"), default=False).set_pos(col=2) def update_param(self, font): self.family = str(font.family()) self.size = font.pointSize() self.bold = bool(font.bold()) self.italic = bool(font.italic()) def build_font(self): font = QFont(self.family) font.setPointSize(self.size) font.setBold(self.bold) font.setItalic(self.italic) return font class FontItemWidget(DataSetWidget): klass = FontParam class FontItem(ObjectItem): """Item holding a LineStyleParam""" klass = FontParam DataSetEditLayout.register(FontItem, FontItemWidget) # =================================================== # Common Qwt symbol parameters # =================================================== class SymbolParam(DataSet): marker = ImageChoiceItem(_("Style"), MARKER_CHOICES, default="NoSymbol") size = IntItem(_("Size"), default=9) edgecolor = ColorItem(_("Border"), default="gray") facecolor = ColorItem(_("Background color"), default="yellow") alpha = FloatItem(_("Background alpha"), default=1.0, min=0, max=1) def update_param(self, symb): if not isinstance(symb, QwtSymbol): # check if this is still needed # raise RuntimeError assert isinstance(symb, QwtSymbol.Style) self.marker = MARKER_NAME[symb] return self.marker = MARKER_NAME[symb.style()] self.size = symb.size().width() self.edgecolor = str(symb.pen().color().name()) self.facecolor = str(symb.brush().color().name()) def build_symbol(self): marker_type = getattr(QwtSymbol, self.marker) color = QColor(self.facecolor) color.setAlphaF(self.alpha) marker = QwtSymbol( marker_type, QBrush(color), QPen(QColor(self.edgecolor)), QSizeF(self.size, self.size), ) return marker def update_symbol(self, obj): obj.setSymbol(self.build_symbol()) class SymbolItemWidget(DataSetWidget): klass = SymbolParam class SymbolItem(ObjectItem): """Item holding a SymbolParam""" klass = SymbolParam DataSetEditLayout.register(SymbolItem, SymbolItemWidget) # =================================================== # Common line style parameters # =================================================== class LineStyleParam(DataSet): style = ImageChoiceItem(_("Style"), LINESTYLE_CHOICES, default="SolidLine") color = ColorItem(_("Color"), default="black") width = FloatItem(_("Width"), default=1.0, min=0) def update_param(self, pen): self.width = pen.widthF() self.color = str(pen.color().name()) self.style = LINESTYLE_NAME[pen.style()] def build_pen(self): linecolor = QColor(self.color) style = getattr(Qt, self.style) pen = QPen(linecolor, self.width, style) return pen def set_style_from_matlab(self, linestyle): """Eventually convert MATLAB-like linestyle into Qt linestyle""" linestyle = LINESTYLES.get(linestyle, linestyle) # MATLAB-style if linestyle == "": # MATLAB-style linestyle = "NoPen" self.style = linestyle class LineStyleItemWidget(DataSetWidget): klass = LineStyleParam class LineStyleItem(ObjectItem): """Item holding a LineStyleParam""" klass = LineStyleParam DataSetEditLayout.register(LineStyleItem, LineStyleItemWidget) # =================================================== # Common brush style parameters # =================================================== class BrushStyleParam(DataSet): style = ImageChoiceItem(_("Style"), BRUSHSTYLE_CHOICES, default="SolidPattern") color = ColorItem(_("Color"), default="black") alpha = FloatItem(_("Alpha"), default=1.0) angle = FloatItem(_("Angle"), default=0.0, min=0) sx = FloatItem(_("sx"), default=1.0, min=0) sy = FloatItem(_("sy"), default=1.0, min=0) def update_param(self, brush): from math import pi, sqrt, atan2 tr = brush.transform() pt = tr.map(QPointF(1.0, 0.0)) self.sx = sqrt(pt.x() ** 2 + pt.y() ** 2) self.angle = 180 * atan2(pt.y(), pt.x()) / pi pt = tr.map(QPointF(0.0, 1.0)) self.sy = sqrt(pt.x() ** 2 + pt.y() ** 2) col = brush.color() self.color = str(col.name()) self.alpha = col.alphaF() self.style = BRUSHSTYLE_NAME[brush.style()] def build_brush(self): color = QColor(self.color) color.setAlphaF(self.alpha) brush = QBrush(color, getattr(Qt, self.style)) tr = QTransform() tr = tr.scale(self.sx, self.sy) tr = tr.rotate(self.angle) brush.setTransform(tr) return brush class BrushStyleItemWidget(DataSetWidget): klass = BrushStyleParam class BrushStyleItem(ObjectItem): """Item holding a LineStyleParam""" klass = BrushStyleParam DataSetEditLayout.register(BrushStyleItem, BrushStyleItemWidget) # =================================================== # QwtText parameters # =================================================== class TextStyleParam(DataSet): font = FontItem(_("Font")) textcolor = ColorItem(_("Text color"), default="blue") background_color = ColorItem(_("Background color"), default="white") background_alpha = FloatItem(_("Background alpha"), default=0.5, min=0, max=1) def update_param(self, obj): """obj: QwtText instance""" self.font.update_param(obj.font()) self.textcolor = obj.color().name() color = obj.backgroundBrush().color() self.background_color = color.name() self.background_alpha = color.alphaF() def update_text(self, obj): """obj: QwtText instance""" obj.setColor(QColor(self.textcolor)) color = QColor(self.background_color) color.setAlphaF(self.background_alpha) obj.setBackgroundBrush(QBrush(color)) font = self.font.build_font() obj.setFont(font) class TextStyleItemWidget(DataSetWidget): klass = TextStyleParam class TextStyleItem(ObjectItem): """Item holding a TextStyleParam""" klass = TextStyleParam DataSetEditLayout.register(TextStyleItem, TextStyleItemWidget) # =================================================== # Grid parameters # =================================================== class GridParam(DataSet): background = ColorItem(_("Background color"), default="white") maj = BeginGroup(_("Major grid")) maj_xenabled = BoolItem(_("X Axis"), default=True) maj_yenabled = BoolItem(_("Y Axis"), default=True).set_pos(col=1) maj_line = LineStyleItem(_("Line")) _maj = EndGroup("end group") min = BeginGroup(_("Minor grid")) min_xenabled = BoolItem(_("X Axis"), default=False) min_yenabled = BoolItem(_("Y Axis"), default=False).set_pos(col=1) min_line = LineStyleItem(_("Line")) _min = EndGroup("fin groupe") def update_param(self, grid): plot = grid.plot() if plot is not None: self.background = str(plot.canvasBackground().color().name()) self.maj_xenabled = grid.xEnabled() self.maj_yenabled = grid.yEnabled() self.maj_line.update_param(grid.majorPen()) self.min_xenabled = grid.xMinEnabled() self.min_yenabled = grid.yMinEnabled() self.min_line.update_param(grid.minorPen()) def update_grid(self, grid): plot = grid.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below plot.setCanvasBackground(QColor(self.background)) grid.enableX(self.maj_xenabled) grid.enableY(self.maj_yenabled) grid.setPen(self.maj_line.build_pen()) grid.enableXMin(self.min_xenabled) grid.enableYMin(self.min_yenabled) grid.setMinorPen(self.min_line.build_pen()) grid.setTitle(self.get_title()) if plot is not None: plot.blockSignals(False) # =================================================== # Axes style parameters # =================================================== class AxeStyleParam(DataSet): title = StringItem(_("Title"), default="") unit = StringItem(_("Unit"), default="") color = ColorItem(_("Color"), default="black").set_pos(col=1) title_font = FontItem(_("Title font")) ticks_font = FontItem(_("Values font")) # =================================================== # Axes parameters # =================================================== class AxisParam(DataSet): scale = ChoiceItem( _("Scale"), [("lin", _("linear")), ("log", _("logarithmic"))], default="lin" ) vmin = FloatItem("Min", help=_("Lower axis limit")) vmax = FloatItem("Max", help=_("Upper axis limit")) def update_param(self, plot, axis_id): self.scale = plot.get_axis_scale(axis_id) axis = plot.axisScaleDiv(axis_id) self.vmin = axis.lowerBound() self.vmax = axis.upperBound() def update_axis(self, plot, axis_id): plot.enableAxis(axis_id, True) plot.set_axis_scale(axis_id, self.scale, autoscale=False) plot.setAxisScale(axis_id, self.vmin, self.vmax) plot.disable_unused_axes() class AxisItemWidget(DataSetWidget): klass = AxisParam class AxisItem(ObjectItem): klass = AxisParam DataSetEditLayout.register(AxisItem, AxisItemWidget) class AxesParam(DataSet): xaxis_id = ChoiceItem( _("X-axis position"), [(QwtPlot.xBottom, _("bottom")), (QwtPlot.xTop, _("top"))], default=QwtPlot.xBottom, ) xaxis = AxisItem(_("X Axis")) yaxis_id = ChoiceItem( _("Y-axis position"), [(QwtPlot.yLeft, _("left")), (QwtPlot.yRight, _("right"))], default=QwtPlot.yLeft, ) yaxis = AxisItem(_("Y Axis")) def update_param(self, item): plot = item.plot() self.xaxis_id = item.xAxis() self.xaxis.update_param(plot, self.xaxis_id) self.yaxis_id = item.yAxis() self.yaxis.update_param(plot, self.yaxis_id) def update_axes(self, item): plot = item.plot() plot.grid.setAxes(self.xaxis_id, self.yaxis_id) item.setXAxis(self.xaxis_id) self.xaxis.update_axis(plot, self.xaxis_id) item.setYAxis(self.yaxis_id) self.yaxis.update_axis(plot, self.yaxis_id) class ImageAxesParam(DataSet): xparams = BeginGroup(_("X Axis")) xmin = FloatItem("x|min", help=_("Lower x-axis limit")) xmax = FloatItem("x|max", help=_("Upper x-axis limit")) _xparams = EndGroup("end X") yparams = BeginGroup(_("Y Axis")) ymin = FloatItem("y|min", help=_("Lower y-axis limit")) ymax = FloatItem("y|max", help=_("Upper y-axis limit")) _yparams = EndGroup("end Y") zparams = BeginGroup(_("Z Axis")) zmin = FloatItem("z|min", help=_("Lower z-axis limit")) zmax = FloatItem("z|max", help=_("Upper z-axis limit")) _zparams = EndGroup("end Z") def update_param(self, item): plot = item.plot() xaxis = plot.axisScaleDiv(item.xAxis()) self.xmin = xaxis.lowerBound() self.xmax = xaxis.upperBound() yaxis = plot.axisScaleDiv(item.yAxis()) self.ymin = yaxis.lowerBound() self.ymax = yaxis.upperBound() self.zmin, self.zmax = item.min, item.max def update_axes(self, item): plot = item.plot() plot.set_plot_limits(self.xmin, self.xmax, self.ymin, self.ymax) item.set_lut_range([self.zmin, self.zmax]) plot.update_colormap_axis(item) # =================================================== # Label parameters # =================================================== class LabelParam(DataSet): _multiselection = False _legend = False _no_contents = True label = StringItem(_("Title"), default="").set_prop( "display", hide=GetAttrProp("_multiselection") ) _styles = BeginTabGroup("Styles") # -------------------------------------------------------------- Contents tab ___cont = BeginGroup(_("Contents")).set_prop( "display", icon="label.png", hide=GetAttrProp("_no_contents") ) contents = TextItem("").set_prop("display", hide=GetAttrProp("_no_contents")) ___econt = EndGroup(_("Contents")).set_prop( "display", hide=GetAttrProp("_no_contents") ) # ---------------------------------------------------------------- Symbol tab symbol = SymbolItem(_("Symbol")).set_prop( "display", icon="diamond.png", hide=GetAttrProp("_legend") ) # ---------------------------------------------------------------- Border tab border = LineStyleItem( _("Border"), default=Obj(color="#cbcbcb"), help=_("set width to 0 to disable") ).set_prop("display", icon="dashdot.png") # ------------------------------------------------------------------ Text tab ___text = BeginGroup(_("Text")).set_prop("display", icon="font.png") font = FontItem(_("Text font")) color = ColorItem(_("Text color"), default="#000000") bgcolor = ColorItem(_("Background color"), default="#ffffff") bgalpha = FloatItem(_("Background transparency"), min=0.0, max=1.0, default=0.8) ___etext = EndGroup(_("Text")) # -------------------------------------------------------------- Position tab ___position = BeginGroup(_("Position")).set_prop("display", icon="move.png") _begin_anchor = BeginGroup(_("Position relative to anchor")).set_prop( "display", hide=GetAttrProp("_multiselection") ) anchor = ChoiceItem( _("Corner"), [ ("TL", _("Top left")), ("TR", _("Top right")), ("BL", _("Bottom left")), ("BR", _("Bottom right")), ("L", _("Left")), ("R", _("Right")), ("T", _("Top")), ("B", _("Bottom")), ("C", _("Center")), ], default="TL", help=_("Label position relative to anchor point"), ).set_prop("display", hide=GetAttrProp("_multiselection")) xc = IntItem( _("ΔX"), default=5, help=_("Horizontal offset (pixels) relative to anchor point"), ).set_prop("display", hide=GetAttrProp("_multiselection")) yc = ( IntItem( _("ΔY"), default=5, help=_("Vertical offset (pixels) relative to anchor point"), ) .set_pos(col=1) .set_prop("display", hide=GetAttrProp("_multiselection")) ) _end_anchor = EndGroup(_("Anchor")).set_prop( "display", hide=GetAttrProp("_multiselection") ) _begin_anchorpos = BeginGroup(_("Anchor position")).set_prop( "display", hide=GetAttrProp("_multiselection") ) _abspos_prop = GetAttrProp("abspos") abspos = ( BoolItem(text=_("Attach to canvas"), label=_("Anchor"), default=True) .set_prop("display", store=_abspos_prop) .set_prop("display", hide=GetAttrProp("_multiselection")) ) xg = ( FloatItem(_("X"), default=0.0, help=_("X-axis position in canvas coordinates")) .set_prop("display", active=NotProp(_abspos_prop)) .set_prop("display", hide=GetAttrProp("_multiselection")) ) yg = ( FloatItem(_("Y"), default=0.0, help=_("Y-axis position in canvas coordinates")) .set_pos(col=1) .set_prop("display", active=NotProp(_abspos_prop)) .set_prop("display", hide=GetAttrProp("_multiselection")) ) move_anchor = ( ChoiceItem( _("Interact"), ( (True, _("moving object changes anchor position")), (False, _("moving object changes label position")), ), default=True, ) .set_prop("display", active=NotProp(_abspos_prop)) .set_prop("display", hide=GetAttrProp("_multiselection")) ) absg = ( ChoiceItem( _("Position"), [ ("TL", _("Top left")), ("TR", _("Top right")), ("BL", _("Bottom left")), ("BR", _("Bottom right")), ("L", _("Left")), ("R", _("Right")), ("T", _("Top")), ("B", _("Bottom")), ("C", _("Center")), ], default="TL", help=_("Absolute position on canvas"), ) .set_prop("display", active=_abspos_prop) .set_prop("display", hide=GetAttrProp("_multiselection")) ) _end_anchorpos = EndGroup(_("Anchor position")).set_prop( "display", hide=GetAttrProp("_multiselection") ) ___eposition = EndGroup(_("Position")) # ----------------------------------------------------------------------- End _endstyles = EndTabGroup("Styles") def update_param(self, obj): # The following is necessary only for shape labels: # when shape is just created (and not yet moved), we need to update # these attributes if self.abspos: self.absg = obj.G else: self.xg, self.yg = obj.G self.xc, self.yc = obj.C def update_label(self, obj): if not self._multiselection: if self.abspos: obj.G = self.absg else: obj.G = (self.xg, self.yg) obj.C = self.xc, self.yc obj.anchor = self.anchor obj.move_anchor = self.move_anchor obj.setTitle(self.label) obj.marker = self.symbol.build_symbol() obj.border_pen = self.border.build_pen() obj.set_text_style(self.font.build_font(), self.color) color = QColor(self.bgcolor) color.setAlphaF(self.bgalpha) obj.bg_brush = QBrush(color) class LabelParam_MS(LabelParam): _multiselection = True ItemParameters.register_multiselection(LabelParam, LabelParam_MS) class LegendParam(LabelParam): _legend = True label = StringItem(_("Title"), default="").set_prop("display", hide=True) def update_label(self, obj): super(LegendParam, self).update_label(obj) if not self._multiselection: obj.setTitle(self.get_title()) class LegendParam_MS(LegendParam): _multiselection = True ItemParameters.register_multiselection(LegendParam, LegendParam_MS) class LabelParamWithContents(LabelParam): _no_contents = False def __init__(self, title=None, comment=None, icon=""): self.plain_text = None super(LabelParamWithContents, self).__init__(title, comment, icon) def update_param(self, obj): super(LabelParamWithContents, self).update_param(obj) self.contents = self.plain_text = obj.get_plain_text() def update_label(self, obj): super(LabelParamWithContents, self).update_label(obj) if self.plain_text is not None and self.contents != self.plain_text: text = self.contents.replace("\n", "
") obj.set_text(text) class LabelParamWithContents_MS(LabelParamWithContents): _multiselection = True ItemParameters.register_multiselection( LabelParamWithContents, LabelParamWithContents_MS ) # =================================================== # Curve parameters # =================================================== class CurveParam(DataSet): _multiselection = False label = StringItem(_("Title"), default="").set_prop( "display", hide=GetAttrProp("_multiselection") ) line = LineStyleItem(_("Line")) symbol = SymbolItem(_("Symbol")) shade = FloatItem(_("Shadow"), default=0, min=0, max=1) curvestyle = ImageChoiceItem(_("Curve style"), CURVESTYLE_CHOICES, default="Lines") baseline = FloatItem(_("Baseline"), default=0.0) def update_param(self, curve): self.label = str(curve.title().text()) self.symbol.update_param(curve.symbol()) self.line.update_param(curve.pen()) self.curvestyle = CURVESTYLE_NAME[curve.style()] self.baseline = curve.baseline() def update_curve(self, curve): plot = curve.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below if not self._multiselection: # Non common parameters curve.setTitle(self.label) curve.setPen(self.line.build_pen()) # Brush linecolor = QColor(self.line.color) linecolor.setAlphaF(self.shade) brush = QBrush(linecolor) if not self.shade: brush.setStyle(Qt.NoBrush) curve.setBrush(brush) # Symbol self.symbol.update_symbol(curve) # Curve style, type and baseline curve.setStyle(getattr(QwtPlotCurve, self.curvestyle)) curve.setBaseline(self.baseline) if plot is not None: plot.blockSignals(False) class CurveParam_MS(CurveParam): _multiselection = True ItemParameters.register_multiselection(CurveParam, CurveParam_MS) # =================================================== # ErrorBar Curve parameters # =================================================== class ErrorBarParam(DataSet): mode = ChoiceItem( _("Display"), default=0, choices=[_("error bars with caps (x, y)"), _("error area (y)")], help=_( "Note: only y-axis error bars are shown in " "error area mode\n(width and cap parameters " "will also be ignored)" ), ) color = ColorItem(_("Color"), default="darkred") alpha = FloatItem( _("Alpha"), default=0.9, min=0, max=1, help=_("Error bar transparency") ) width = FloatItem(_("Width"), default=1.0, min=1) cap = IntItem(_("Cap"), default=4, min=0) ontop = BoolItem(_("set to foreground"), _("Visibility"), default=False) def update_param(self, curve): color = curve.errorPen.color() self.color = str(color.name()) self.alpha = color.alphaF() self.width = curve.errorPen.widthF() self.cap = curve.errorCap self.ontop = curve.errorOnTop def update_curve(self, curve): color = QColor(self.color) color.setAlphaF(self.alpha) curve.errorPen = QPen(color, self.width) curve.errorBrush = QBrush(color) curve.errorCap = self.cap curve.errorOnTop = self.ontop # =================================================== # Image parameters # =================================================== def _create_choices(): choices = [] for cmap_name in get_colormap_list(): choices.append((cmap_name, cmap_name, build_icon_from_cmap_name)) return choices class BaseImageParam(DataSet): _multiselection = False label = StringItem(_("Image title"), default=_("Image")).set_prop( "display", hide=GetAttrProp("_multiselection") ) alpha_mask = BoolItem( _("Use image level as alpha"), _("Alpha channel"), default=False ) alpha = FloatItem( _("Global alpha"), default=1.0, min=0, max=1, help=_("Global alpha value") ) _hide_colormap = False colormap = ImageChoiceItem( _("Colormap"), _create_choices(), default="jet" ).set_prop("display", hide=GetAttrProp("_hide_colormap")) interpolation = ChoiceItem( _("Interpolation"), [ (0, _("None (nearest pixel)")), (1, _("Linear interpolation")), (2, _("2x2 antialiasing filter")), (3, _("3x3 antialiasing filter")), (5, _("5x5 antialiasing filter")), ], default=0, help=_("Image interpolation type"), ) _formats = BeginGroup(_("Statistics string formatting")) xformat = StringItem(_("X-Axis"), default=r"%.1f") yformat = StringItem(_("Y-Axis"), default=r"%.1f") zformat = StringItem(_("Z-Axis"), default=r"%.1f") _end_formats = EndGroup(_("Statistics string formatting")) def update_param(self, image): self.label = str(image.title().text()) self.colormap = image.get_color_map_name() interpolation = image.get_interpolation() mode = interpolation[0] from guiqwt.image import INTERP_NEAREST, INTERP_LINEAR if mode == INTERP_NEAREST: self.interpolation = 0 elif mode == INTERP_LINEAR: self.interpolation = 1 else: size = interpolation[1].shape[0] self.interpolation = size def update_image(self, image): plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.setTitle(self.label) image.set_color_map(self.colormap) size = self.interpolation from guiqwt.image import INTERP_NEAREST, INTERP_LINEAR, INTERP_AA if size == 0: mode = INTERP_NEAREST elif size == 1: mode = INTERP_LINEAR else: mode = INTERP_AA image.set_interpolation(mode, size) if plot is not None: plot.blockSignals(False) class QuadGridParam(DataSet): _multiselection = False label = StringItem(_("Image title"), default=_("Image")).set_prop( "display", hide=GetAttrProp("_multiselection") ) alpha_mask = BoolItem( _("Use image level as alpha"), _("Alpha channel"), default=False ) alpha = FloatItem( _("Global alpha"), default=1.0, min=0, max=1, help=_("Global alpha value") ) _hide_colormap = False colormap = ImageChoiceItem( _("Colormap"), _create_choices(), default="jet" ).set_prop("display", hide=GetAttrProp("_hide_colormap")) interpolation = ChoiceItem( _("Interpolation"), [ (0, _("Quadrangle interpolation")), (1, _("Flat")), ], default=0, help=_( "Image interpolation type, " "Flat mode use fixed u,v " "interpolation parameters" ), ) uflat = FloatItem( _("Fixed U interpolation parameter"), default=0.5, min=0.0, max=1.0, help=_("For flat mode only"), ) vflat = FloatItem( _("Fixed V interpolation parameter"), default=0.5, min=0.0, max=1.0, help=_("For flat mode only"), ) grid = BoolItem(_("Show grid"), default=False) gridcolor = ColorItem(_("Grid lines color"), default="black") def update_param(self, image): self.label = str(image.title().text()) self.colormap = image.get_color_map_name() interp, uflat, vflat = image.interpolate self.interpolation = interp self.uflat = uflat self.vflat = vflat self.grid = image.grid def update_image(self, image): plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.setTitle(self.label) image.set_color_map(self.colormap) image.interpolate = (self.interpolation, self.uflat, self.vflat) image.grid = self.grid # TODO : gridcolor if plot is not None: plot.blockSignals(False) class RawImageParam(BaseImageParam): _hide_background = False background = ColorItem(_("Background color"), default="#000000").set_prop( "display", hide=GetAttrProp("_hide_background") ) def update_param(self, image): super(RawImageParam, self).update_param(image) self.background = str(QColor(image.bg_qcolor).name()) def update_image(self, image): super(RawImageParam, self).update_image(image) plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.set_background_color(self.background) if plot is not None: plot.blockSignals(False) class RawImageParam_MS(RawImageParam): _multiselection = True ItemParameters.register_multiselection(RawImageParam, RawImageParam_MS) class XYImageParam(RawImageParam): pass class XYImageParam_MS(XYImageParam): _multiselection = True ItemParameters.register_multiselection(XYImageParam, XYImageParam_MS) class ImageParam(RawImageParam): _xdata = BeginGroup(_("Image placement along X-axis")) xmin = FloatItem(_("x|min"), default=None) xmax = FloatItem(_("x|max"), default=None) _end_xdata = EndGroup(_("Image placement along X-axis")) _ydata = BeginGroup(_("Image placement along Y-axis")) ymin = FloatItem(_("y|min"), default=None) ymax = FloatItem(_("y|max"), default=None) _end_ydata = EndGroup(_("Image placement along Y-axis")) def update_param(self, image): super(ImageParam, self).update_param(image) self.xmin = image.xmin if self.xmin is None: self.xmin = 0.0 self.ymin = image.ymin if self.ymin is None: self.ymin = 0.0 if image.is_empty(): shape = (0, 0) else: shape = image.data.shape self.xmax = image.xmax if self.xmax is None: self.xmax = float(shape[1]) self.ymax = image.ymax if self.ymax is None: self.ymax = float(shape[0]) def update_image(self, image): super(ImageParam, self).update_image(image) plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.xmin = self.xmin image.xmax = self.xmax image.ymin = self.ymin image.ymax = self.ymax image.update_bounds() image.update_border() if plot is not None: plot.blockSignals(False) class ImageParam_MS(ImageParam): _multiselection = True ItemParameters.register_multiselection(ImageParam, ImageParam_MS) class RGBImageParam(ImageParam): _hide_background = True _hide_colormap = True def update_image(self, image): super(RGBImageParam, self).update_image(image) plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.recompute_alpha_channel() if plot is not None: plot.blockSignals(False) class RGBImageParam_MS(RGBImageParam): _multiselection = True ItemParameters.register_multiselection(RGBImageParam, RGBImageParam_MS) class MaskedImageParam(ImageParam): g_mask = BeginGroup(_("Mask")) filling_value = FloatItem(_("Filling value")) show_mask = BoolItem(_("Show image mask"), default=False) alpha_masked = FloatItem(_("Masked area alpha"), default=0.7, min=0, max=1) alpha_unmasked = FloatItem(_("Unmasked area alpha"), default=0.0, min=0, max=1) _g_mask = EndGroup(_("Mask")) def update_image(self, image): super(MaskedImageParam, self).update_image(image) plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.update_mask() if plot is not None: plot.blockSignals(False) class MaskedImageParam_MS(MaskedImageParam): _multiselection = True ItemParameters.register_multiselection(MaskedImageParam, MaskedImageParam_MS) class ImageFilterParam(BaseImageParam): label = StringItem(_("Title"), default=_("Filter")) g1 = BeginGroup(_("Bounds")) xmin = FloatItem(_("x|min")) xmax = FloatItem(_("x|max")) ymin = FloatItem(_("y|min")) ymax = FloatItem(_("y|max")) _g1 = EndGroup("sub-group") use_source_cmap = BoolItem( _("Use image colormap and level"), _("Color map"), default=True ) def update_param(self, obj): self.xmin, self.ymin, self.xmax, self.ymax = obj.border_rect.get_rect() self.use_source_cmap = obj.use_source_cmap super(ImageFilterParam, self).update_param(obj) def update_imagefilter(self, imagefilter): m, M = imagefilter.get_lut_range() set_range = False if not self.use_source_cmap and imagefilter.use_source_cmap: set_range = True imagefilter.use_source_cmap = self.use_source_cmap if set_range: imagefilter.set_lut_range([m, M]) self.update_image(imagefilter) imagefilter.border_rect.set_rect(self.xmin, self.ymin, self.xmax, self.ymax) class TrImageParam(RawImageParam): _crop = BeginGroup(_("Crop")).set_prop( "display", hide=GetAttrProp("_multiselection") ) crop_left = IntItem(_("Left"), default=0) crop_right = IntItem(_("Right"), default=0) crop_top = IntItem(_("Top"), default=0) crop_bottom = IntItem(_("Bottom"), default=0) _end_crop = EndGroup(_("Cropping")).set_prop( "display", hide=GetAttrProp("_multiselection") ) _ps = BeginGroup(_("Pixel size")).set_prop( "display", hide=GetAttrProp("_multiselection") ) dx = FloatItem(_("Width (dx)"), default=1.0) dy = FloatItem(_("Height (dy)"), default=1.0) _end_ps = EndGroup(_("Pixel size")).set_prop( "display", hide=GetAttrProp("_multiselection") ) _pos = BeginGroup(_("Translate, rotate and flip")) pos_x0 = FloatItem(_("xCENTER"), default=0.0).set_prop( "display", hide=GetAttrProp("_multiselection") ) hflip = BoolItem(_("Flip horizontally"), default=False).set_prop("display", col=1) pos_y0 = FloatItem(_("yCENTER"), default=0.0).set_prop( "display", hide=GetAttrProp("_multiselection") ) vflip = BoolItem(_("Flip vertically"), default=False).set_prop("display", col=1) pos_angle = FloatItem(_("θ (°)"), default=0.0).set_prop("display", col=0) _end_pos = EndGroup(_("Translate, rotate and flip")) def update_param(self, image): super(TrImageParam, self).update_param(image) # we don't get crop info from the image because # its not easy to extract from the transform # and TrImageItem keeps it's crop information # directly in this DataSet def update_image(self, image): RawImageParam.update_image(self, image) plot = image.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below image.set_transform(*self.get_transform()) if plot is not None: plot.blockSignals(False) def get_transform(self): return ( self.pos_x0, self.pos_y0, self.pos_angle * np.pi / 180, self.dx, self.dy, self.hflip, self.vflip, ) def set_transform(self, x0, y0, angle, dx=1.0, dy=1.0, hflip=False, vflip=False): self.pos_x0 = x0 self.pos_y0 = y0 self.pos_angle = angle * 180 / np.pi self.dx = dx self.dy = dy self.hflip = hflip self.vflip = vflip def set_crop(self, left, top, right, bottom): self.crop_left = left self.crop_right = right self.crop_top = top self.crop_bottom = bottom def get_crop(self): return (self.crop_left, self.crop_top, self.crop_right, self.crop_bottom) class TrImageParam_MS(TrImageParam): _multiselection = True ItemParameters.register_multiselection(TrImageParam, TrImageParam_MS) # =================================================== # Histogram parameters # =================================================== class HistogramParam(DataSet): n_bins = IntItem(_("Bins"), default=100, min=1, help=_("Number of bins")) logscale = BoolItem(_("logarithmic"), _("Y-axis scale"), default=False) def update_param(self, obj): self.n_bins = obj.get_bins() self.logscale = obj.get_logscale() def update_hist(self, hist): hist.set_bins(self.n_bins) hist.set_logscale(self.logscale) # =================================================== # Histogram 2D parameters # =================================================== class Histogram2DParam(BaseImageParam): """Histogram""" _multiselection = False label = StringItem(_("Title"), default=_("Histogram")).set_prop( "display", hide=GetAttrProp("_multiselection") ) nx_bins = IntItem( _("X-axis bins"), default=100, min=1, help=_("Number of bins along x-axis") ) ny_bins = IntItem( _("Y-axis bins"), default=100, min=1, help=_("Number of bins along y-axis") ) logscale = BoolItem(_("logarithmic"), _("Z-axis scale"), default=False) computation = ChoiceItem( _("Computation"), [ (-1, _("Bin count")), (0, _("Maximum value")), (1, _("Mininum value")), (2, _("Sum")), (3, _("Product")), (4, _("Average")), ], default=-1, help=_( "Bin count : counts the number of points per bin,\n" "For max, min, sum, product, average, compute the " "function of a third parameter (one by default)" ), ) auto_lut = BoolItem( _("Automatic LUT range"), default=True, help=_("Automatically adapt color scale " "when panning, zooming"), ) background = ColorItem( _("Background color"), default="transparent", help=_("Background color when no data is present"), ) def update_param(self, obj): super(Histogram2DParam, self).update_param(obj) self.logscale = obj.logscale self.nx_bins, self.ny_bins = obj.nx_bins, obj.ny_bins def update_histogram(self, histogram): histogram.logscale = int(self.logscale) histogram.set_background_color(self.background) histogram.set_bins(self.nx_bins, self.ny_bins) self.update_image(histogram) class Histogram2DParam_MS(Histogram2DParam): _multiselection = True ItemParameters.register_multiselection(Histogram2DParam, Histogram2DParam_MS) # =================================================== # Shape parameters # =================================================== class MarkerParam(DataSet): _styles = BeginTabGroup("Styles") # ------------------------------------------------------------------ Line tab ___line = BeginGroup(_("Line")).set_prop("display", icon="dashdot.png") line = LineStyleItem(_("Line (not selected)")) sel_line = LineStyleItem(_("Line (selected)")) ___eline = EndGroup(_("Line")) # ---------------------------------------------------------------- Symbol tab ___sym = BeginGroup(_("Symbol")).set_prop("display", icon="diamond.png") symbol = SymbolItem(_("Symbol (not selected)")) sel_symbol = SymbolItem(_("Symbol (selected)")) ___esym = EndGroup(_("Symbol")) # ------------------------------------------------------------------ Text tab ___text = BeginGroup(_("Text")).set_prop("display", icon="font.png") text = TextStyleItem(_("Text (not selected)")) sel_text = TextStyleItem(_("Text (selected)")) ___etext = EndGroup(_("Text")) # ----------------------------------------------------------------------- End _endstyles = EndTabGroup("Styles") markerstyle = ImageChoiceItem( _("Line style"), MARKERSTYLE_CHOICES, default="NoLine" ) spacing = IntItem(_("Spacing"), default=10, min=0) def update_param(self, obj): self.symbol.update_param(obj.symbol()) self.text.update_param(obj.label()) self.line.update_param(obj.linePen()) self.markerstyle = MARKERSTYLE_NAME[obj.lineStyle()] self.spacing = obj.spacing() def update_marker(self, obj): if obj.selected: line = self.sel_line symb = self.sel_symbol text = self.sel_text else: line = self.line symb = self.symbol text = self.text symb.update_symbol(obj) label = obj.label() text.update_text(label) obj.setLabel(label) obj.setLinePen(line.build_pen()) obj.setLineStyle(getattr(QwtPlotMarker, self.markerstyle)) obj.setSpacing(self.spacing) obj.update_label() def set_markerstyle(self, style): """ Set marker line style style: * convenient values: '+', '-', '|' or None * `QwtPlotMarker.NoLine`, `QwtPlotMarker.Vertical`, ... """ self.markerstyle = MARKERSTYLES.get(style, style) class ShapeParam(DataSet): label = StringItem(_("Title"), default="") _styles = BeginTabGroup("Styles") # ------------------------------------------------------------------ Line tab ___line = BeginGroup(_("Line")).set_prop("display", icon="dashdot.png") line = LineStyleItem(_("Line (not selected)")) sel_line = LineStyleItem(_("Line (selected)")) ___eline = EndGroup(_("Line")) # ---------------------------------------------------------------- Symbol tab ___sym = BeginGroup(_("Symbol")).set_prop("display", icon="diamond.png") symbol = SymbolItem(_("Symbol (not selected)")) sel_symbol = SymbolItem(_("Symbol (selected)")) ___esym = EndGroup(_("Symbol")) # ------------------------------------------------------------------ Fill tab ___fill = BeginGroup(_("Fill pattern")).set_prop( "display", icon="dense6pattern.png" ) fill = BrushStyleItem(_("Fill pattern (not selected)")) sel_fill = BrushStyleItem(_("Fill pattern (selected)")) ___efill = EndGroup(_("Fill pattern")) # ----------------------------------------------------------------------- End _endstyles = EndTabGroup("Styles") readonly = BoolItem( _("Read-only shape"), default=False, help=_("Read-only shapes can't be removed from " "the item list panel"), ) private = BoolItem( _("Private shape"), default=False, help=_("Private shapes are not shown in " "the item list panel"), ).set_pos(col=1) def update_param(self, obj): self.label = str(obj.title().text()) self.line.update_param(obj.pen) self.symbol.update_param(obj.symbol) self.fill.update_param(obj.brush) self.sel_line.update_param(obj.sel_pen) self.sel_symbol.update_param(obj.sel_symbol) self.sel_fill.update_param(obj.sel_brush) self.readonly = obj.is_readonly() self.private = obj.is_private() def update_shape(self, obj): plot = obj.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below obj.setTitle(self.label) obj.pen = self.line.build_pen() obj.symbol = self.symbol.build_symbol() obj.brush = self.fill.build_brush() obj.sel_pen = self.sel_line.build_pen() obj.sel_symbol = self.sel_symbol.build_symbol() obj.sel_brush = self.sel_fill.build_brush() obj.set_readonly(self.readonly) obj.set_private(self.private) if plot is not None: plot.blockSignals(False) class AxesShapeParam(DataSet): arrow_angle = FloatItem(_("Arrow angle (°)"), min=0, max=90, nonzero=True) arrow_size = FloatItem(_("Arrow size (%)"), min=0, max=100, nonzero=True) _styles = BeginTabGroup("Styles") # ------------------------------------------------------------------ Line tab ___line = BeginGroup(_("Line")).set_prop("display", icon="dashdot.png") xarrow_pen = LineStyleItem(_("Line (X-Axis)")) yarrow_pen = LineStyleItem(_("Line (Y-Axis)")) ___eline = EndGroup(_("Line")) # ------------------------------------------------------------------ Fill tab ___fill = BeginGroup(_("Fill pattern")).set_prop( "display", icon="dense6pattern.png" ) xarrow_brush = BrushStyleItem(_("Fill pattern (X-Axis)")) yarrow_brush = BrushStyleItem(_("Fill pattern (Y-Axis)")) ___efill = EndGroup(_("Fill pattern")) # ----------------------------------------------------------------------- End _endstyles = EndTabGroup("Styles") def update_param(self, obj): self.arrow_angle = obj.arrow_angle self.arrow_size = obj.arrow_size self.xarrow_pen.update_param(obj.x_pen) self.yarrow_pen.update_param(obj.y_pen) self.xarrow_brush.update_param(obj.x_brush) self.yarrow_brush.update_param(obj.y_brush) def update_axes(self, obj): obj.arrow_angle = self.arrow_angle obj.arrow_size = self.arrow_size obj.x_pen = self.xarrow_pen.build_pen() obj.x_brush = self.xarrow_brush.build_brush() obj.y_pen = self.yarrow_pen.build_pen() obj.y_brush = self.yarrow_brush.build_brush() class AnnotationParam(DataSet): show_label = BoolItem(_("Show annotation"), default=True) show_computations = BoolItem( _("Show informations on area " "covered by this shape"), default=True ) title = StringItem(_("Title"), default="") subtitle = StringItem(_("Subtitle"), default="") format = StringItem(_("String formatting"), default="%.1f") uncertainty = FloatItem( _("Uncertainty"), default=0.0, min=0.0, max=1.0, help=_("Measurement relative uncertainty"), ).set_pos(col=1) transform_matrix = FloatArrayItem( _("Transform matrix"), default=np.eye(3, dtype=float) ) readonly = BoolItem( _("Read-only shape"), default=False, help=_("Read-only shapes can't be removed from " "the item list panel"), ) private = BoolItem( _("Private shape"), default=False, help=_("Private shapes are not shown in " "the item list panel"), ).set_pos(col=1) def update_param(self, obj): self.show_label = obj.is_label_visible() self.show_computations = obj.area_computations_visible self.title = str(obj.title().text()) self.readonly = obj.is_readonly() self.private = obj.is_private() def update_annotation(self, obj): plot = obj.plot() if plot is not None: plot.blockSignals(True) # Avoid unwanted calls of update_param # triggered by the setter methods below obj.setTitle(self.title) obj.set_label_visible(self.show_label) obj.area_computations_visible = self.show_computations obj.update_label() obj.set_readonly(self.readonly) obj.set_private(self.private) if plot is not None: plot.blockSignals(False) # =================================================== # Range selection parameters # =================================================== class RangeShapeParam(DataSet): _styles = BeginTabGroup("Styles") # ------------------------------------------------------------------ Line tab ___line = BeginGroup(_("Line")).set_prop("display", icon="dashdot.png") line = LineStyleItem(_("Line (not selected)")) sel_line = LineStyleItem(_("Line (selected)")) ___eline = EndGroup(_("Line")) # ---------------------------------------------------------------- Symbol tab ___symbol = BeginGroup(_("Symbol")).set_prop("display", icon="diamond.png") symbol = SymbolItem(_("Symbol (not selected)")) sel_symbol = SymbolItem(_("Symbol (selected)")) ___esymbol = EndGroup(_("Symbol")) # ------------------------------------------------------------------ Fill tab ___fill = BeginGroup(_("Fill")).set_prop("display", icon="dense6pattern.png") fill = ColorItem(_("Fill color")) shade = FloatItem(_("Shade"), default=0.05, min=0, max=1) ___efill = EndGroup(_("Fill")) # ----------------------------------------------------------------------- End _endstyles = EndTabGroup("Styles") def update_param(self, range): self.line.update_param(range.pen) self.sel_line.update_param(range.sel_pen) self.fill = range.brush.color().name() self.shade = range.brush.color().alphaF() self.symbol.update_param(range.symbol) self.sel_symbol.update_param(range.sel_symbol) def update_range(self, range): range.pen = self.line.build_pen() range.sel_pen = self.sel_line.build_pen() col = QColor(self.fill) col.setAlphaF(self.shade) range.brush = QBrush(col) range.symbol = self.symbol.build_symbol() range.sel_symbol = self.sel_symbol.build_symbol() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.4392397 guiqwt-4.0.1/guiqwt/tests/0000777000000000000000000000000000000000000012411 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/__init__.py0000666000000000000000000000067000000000000014525 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt test package =================== """ def run(): """Run guiqwt test launcher""" import guiqwt.config # Loading icons from guidata.guitest import run_testlauncher run_testlauncher(guiqwt) if __name__ == "__main__": run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/benchmarks.py0000666000000000000000000001041500000000000015101 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """guiqwt plot benchmarking""" SHOW = False # Show test in GUI-based test launcher import time import numpy as np from qtpy.QtWidgets import QApplication from guiqwt.plot import CurveWindow, ImageWindow from guiqwt.builder import make class BaseBM(object): """Benchmark object""" MAKE_FUNC = None WIN_CLASS = None def __init__(self, name, nsamples, **options): self.name = name self.nsamples = int(nsamples) self.options = options self._item = None def compute_data(self): raise NotImplementedError def make_item(self): data = self.compute_data() self._item = self.MAKE_FUNC(*data, **self.options) def add_to_plot(self, plot): assert self._item is not None plot.add_item(self._item) def start(self, close=False): # Create plot window win = self.WIN_CLASS(toolbar=True, wintitle=self.name) win.show() QApplication.processEvents() plot = win.get_plot() # Create item (ignore this step in benchmark result!) self.make_item() # Benchmarking t0 = time.time() self.add_to_plot(plot) print(self.name + ":") print(" N = %d" % self.nsamples) plot.replot() # Force replot print(" dt = %d ms" % ((time.time() - t0) * 1e3)) if close: win.close() class CurveBM(BaseBM): MAKE_FUNC = make.curve WIN_CLASS = CurveWindow def compute_data(self): x = np.linspace(-10, 10, self.nsamples) y = np.sin(np.sin(np.sin(x))) return x, y class HistogramBM(CurveBM): MAKE_FUNC = make.histogram def compute_data(self): data = np.random.normal(size=self.nsamples) return (data,) class ErrorBarBM(CurveBM): MAKE_FUNC = make.merror def __init__(self, name, nsamples, dx=False, **options): super(ErrorBarBM, self).__init__(name, nsamples, **options) self.dx = dx def compute_data(self): x, y = super(ErrorBarBM, self).compute_data() if not self.dx: return x, y, x / 100.0 else: return x, y, x / 100.0, x / 20.0 class ImageBM(BaseBM): MAKE_FUNC = make.image WIN_CLASS = ImageWindow def compute_data(self): data = np.zeros((self.nsamples, self.nsamples), dtype=np.float32) m = 10 step = int(self.nsamples / m) for i in range(m): for j in range(m): data[i * step : (i + 1) * step, j * step : (j + 1) * step] = i * m + j return (data,) class PColorBM(BaseBM): MAKE_FUNC = make.pcolor WIN_CLASS = ImageWindow def compute_data(self): N = self.nsamples r, th = np.meshgrid(np.linspace(1.0, 16, N), np.linspace(0.0, np.pi, N)) x = r * np.cos(th) y = r * np.sin(th) z = 4 * th + r return x, y, z def run(): """Run benchmark""" # Print informations banner from qtpy.QtCore import __version__ from qtpy import API import guiqwt qt_lib = {"pyqt5": "PyQt5", "pyside": "PySide"}[API] title = "guiqwt plot benchmark [%s (Qt v%s), guiqwt v%s]" % ( qt_lib, __version__, guiqwt.__version__, ) print(title) print("-" * len(title)) print() import guidata app = guidata.qapplication() # Run benchmarks close = True for benchmark in ( CurveBM("Simple curve", 5e6), CurveBM("Curve with markers", 2e5, marker="Ellipse", markersize=10), CurveBM("Curve with sticks", 1e6, curvestyle="Sticks"), ErrorBarBM("Error bar curve (vertical bars only)", 1e4), ErrorBarBM("Error bar curve (horizontal and vertical bars)", 1e4, dx=True), HistogramBM("Simple histogram", 1e6, bins=int(1e5)), PColorBM("Polar pcolor", 1e3), ImageBM("Simple image", 7e3, interpolation="antialiasing"), ): benchmark.start(close=close) if not close: app.exec_() if __name__ == "__main__": run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096264.0 guiqwt-4.0.1/guiqwt/tests/brain.png0000666000000000000000000011536200000000000014222 0ustar00PNG  IHDRygAMA abKGD̿tIME!InpIDATxڬW#Y.A:d(Z h5pZ#TfVUwW>;364fG4Qg/|HTeddk}^{oK>7LF`4ޤ[ |k@~.n3\Ҥ? _0k[MQ꿽oFz}ܫAo6jOd[4 m;B7ngM%lԾ}Ō!ѯMp%Nѕu F܌}|MoDAoԙ ]3(Fk`/d5× i!kb2 fp:Fވkw5у744iono><ĈCd5"5hB_5qӡ_F`@bdndpsp[]>kBWGYf k+څ14L3\ܨݭQь!#hA!ݧd3d: #f6YGk^ Zؘttz3e4"Ȩ40wѠjo^ 5fF`Ø 0pu4F`Lax{b7;xTf`_0C¯½bz0':v]p.4F9j'CÅPv3рvn3f5/H7P[3 ._;!@g01z3 jd2}<z*$dw06ޤy 3dkdְ hE9zV26x^_\ r<4Ղ 7kGAšun@ |=DCPOk3}<8,2zZh1 c2#tZ$!%E!V%5_X(&?l`<R&;%" 6SQb - E*84<ֈ ,`0΢+id% -Ċm4h?Voc E~`#­ xGE^jG?d!78v-u(k!GaiFjBOF/ Lv-QTw>: ̉a0[,-u|4Ȉ.K3yxZ3rS-ZmXQo v|{-p z?h^E4|@d5FF<0A Ť%D-횴Zb푌&(=yJ3q)LUNI1ߏoT4<ڤIo1(&0bqm,fC iiYߤY˂ɴ 1Gn>ޠ: ?F(kYXcXLi\% V#6;\\K~ȑ4E 0!hTo4rbn^?J߿ 'ƏBӄ<0˂Rx"ިKx,hTOgq`&4Z!u&E Dl& 52;I z r3cB Zµ7f#$$8F Τ!DPCl"- [5g6L[/łY4^8 m rL( ,CFFB[?~~:VPCQ74!x!>c+Q"v]Xu0!4Pk|xքfk/ZD`zAԘ53 Fcҡ0`oD͈c XG$ԬA=nYNx<Aٵ?]{NNLO\6T %QlsP&6&ߘZ%F+i?c7 ZA.E#bbuf P =$Ns<$ 8-uLno$}:޾f%*[qVFfΣjAj?%"ʷFaդ3Z E' %h(QZ @@/%,jԔUyw6+>>OK边:9&Zpg *p q$4"qxP+f I~/lfVGVal3) YLe}tkZ@!J:|@k*NgwgYۿ˃jfXpommn^nb9U&˳(ILcYV 7CVh-Epvb6|ԿQBG]c!`A5lxvb8JudAY~? #@荘l&<\[_q,VҒP˺Y];'SyUtXNOOBj{~jC# BjLny5w26|R fhpbfMxEG)N-ă'@Oѫネ+ `cyemt8lMVv{p`F<8 պͱY|FjB,ࣲ ʢGͨUo> Q~iWwͨo3D͆2 rMLH9OGh&ZH?^\K]\Nk^u iE&}hF(HL1 {kep>g&@ƴ4V"e{#Gh"I?cɊ?8\Qj&T!†*;/q>˷Fbgeyumummyya:%պkѝ[-kN~T =bi (RlNT~P˘c*ۘFH~HYB.6AGF3kiB3haՕOܢu{>ބcާ'sߝl91δJ4@՞6֗d8VT!H{Y/tfSE+4g!79f4n?դ!74!phuD# rL\YNkE\<8?gJ.WekTl]yUp;fߗ*cUƃ+h bfB%/GjQA_"Caڔz 5&Q hP@jQФdD%{A fS\]o[MNeswNR,E}8:=Xsl[W7ld:SL<>e7@[i%@MVF# EMc 'ly|D(b3j*1A%_&mHlJٰbfm~}u"Ӕ d`nڏ<㝵uf]wx#L[iCবFMq"p Z(> h`mJJD1 Ag=P`9 ,%Ám택@}q~w{>OfVsL='[mt\ Qn}y2=Y.h&Wjhf֠10Afh g0ckͿ Z7a:Fp4$~#\^rXmNS&d`Z-VىX+FC닫eǒ ҹܞD!~}eG插64FhHČ1TMPrg<ŢNmɤ9lcH+|cfW I%3<}ium{g6s߆v[Q}PL6/oPss yφ-/<,^zBdcxa2L!8&aѪVYQ;*Z!Ń,L٣pU §_v(!w[ν=\oYmTkKt4)}fôr6j'@ v Z,`@zZMPjAC d]> 6[w۫ۧ1A,^I2l>K"vjٓ6 -*ă,W}:@ґՊp`j&Z)i'Mmi)9 LPV@nn\FYCi b!_Lal- ](YsZ9Nܠ@Z/6=c&' [õxKhmbo3VgV sbݻ`VɆ..UU:nT6 NRS*ѧ_4Kvc Ppt!>R 8ްQۅV8Xie^%mmD L| nBb @lf/~tխ㫛8%oce*s9|JR)^gJaPjb`( l-Y QȪpفfl&m&hvXLHX6cjokPuhĿN+4t86.no}eQ3Pz<;9Nӂmv2k,A -gZ)~pw! HZCp*<LJ۫˘~Ӯoe>B`ݎ4c=5kowڴ[U#2cNgeޢ,2 RLlMWgk<ׅF7HNmT*F6r*/p(vu<~rsr?nnP;ݸ-U3O7QhfhfZ#ApXϯ3A*ҡLu, DVtńuk=4jȪo#&d`e[yZ,+k{[K+׏TXG=%iM:79;"DUJ)xq~)6 ퟞ:Leŕ+QߍEN0 fdj" X۴0GM|&]4Dlfyd QX5.G['WbN!5#$JEJjm@U0i^cڣA)ȆRgL !0EmTc'aѾeչR.x ٶ D?f V_@d|M;k hjצ驣:hL#&}$Kf \KbQl,td lgGnƃNGUR<gB\!zeO5Ƴ}vpl[ʰDB0޳C;0h@ 3SS+ ,T44I,|0l2^oLq}hrňΛpXh@-@09= ^mx̦*uzpnήr[" C&l=]?KRKIn/}]myC+QY_s ׷|,8@T*}: $,/pS*}]W-My:΋pY8NjqLި 'Njh4j7 3("[1D 0φ`oL|P0^$^ ?Ӧҹte[v xå֦ -05f?ܡ|2.Loѧ{yj޸;R*bYVINQ$ߚNTIh8MG VlX(Dj Q:z d)pOx^RTx¦SQ*/‘rdkywk h5?֯ms/#fCJ -v(-β-V2ޮkucS亽frHz USp\5 ͩ/l8n#r|yNVHevݝQw0C.x UgX~HN-:+į76Qv^Ou m;_:մm@JUgBF֋u~cikw!CRʍ- veslQũzs2TS@:[d?t=Ɠv% I 뭶(F6\KjJUE~ɖd_'"w{I nfڌ}VU[Ga@cm' -ZQ/aDl8ܗWӜǧgw#]f<ɱk'" Jo-N#h6S$P7jotƯI)3Mf 4NӃ+:??[M/gnlHmv/ePOBf*(Mu!N[oA=6-d:zswuoX:F6^׻{6Xּi>mg`VTiNOQюbYHfBXYi MRx4P{o/s}۴-1 xA xt:ÿJA"C8H (ʒmJђZ:߾ wt+| -e-g4&BI1 ?MGdmdDjV8hʲˊRluXB5'!ٮźimU<@a7.9z e40mo挥ܥ6{0,+w{$$TFS5VNo?&/הXU/&‰*[WP&h<@$emHg@QWmJuP}U \|~s{dz5f 5Xn4;zL_gVH"WǂIDXQx1(&x;Peu6{]U[? N3`vr~<7vD`ʅo&KVT`@%qsp f^^92uAm)XXˤX/Xqo6l>_f-ZL.]t T*8渏X1dTsY#OUnǣ`uIW xR.ZMRj( I֗"Es5PQ<+U.IF-Mx<ѺF-|*+uMNE.OK(55}xj{|g$&MT "HB$-t!iNS^SuY+5Z/ +L8][nOQH*{eFk Q 3yuڔqJ<5FxxxxB:mw&Bh8, y? ׃mI`*8Б**x zlC @aٴͻKŲقYlwR2O|_&1AW%b2Oa . >=GVuirb[o"Jw@8>d`ƒQenJM@5*DIKb+zB1źs@?N[y+,YV0@px<_"XE%~^4{<@///cտFż'E~};О??j{th:P;q74Ux}|ܧK\&2j|G[@jXۻvBXsN K,2T<(8n7[ '_^l:M&39ޗdL%|:{{sjw:dh4{p4AT\̧eNӜҩBxdhRا{M,X8UJsF9^&Ht`ph> v8~}MhB EԄV2M{x<' w6` y1+S-Fh0gg'W77+~ķD&m7ZdiF-gR^5;V/)Z($uGM!2K{h:'UeYiHd) ĮxaMow ŊtԟYВ*jjvo褯6n4Q \s2 rEJ !e_|@! (Q4 D eg;9p1P)"Zg /st>ȠI?& ް_In#8( 1,?rb^1,IEbaBZb]ljl6SJ`F7Y%b$~8`;@-i2%0 ))\Q,VSiyq ϋp:鏐 ~fm&Vr:[F#E|odeI#t<̖\FZQݲӾ@ulΣ]U!ou[$ 7NXi4ϳW~*_!K$^,j y6hN'==;ٰCӇoQC0JWIeX^f7%A}><@k?/H Y2-$A<# Zf 3 c7y_<?p27FpL7}iNi9p g9z@T )Nj^Z[8͵;q>k@_uaݰ"JmHs)<"C-/,^__ј"A f>@_z e*Ae ?bd$gn)X#}>E@ @3\ȗF5J*KĮKVV(Up,|~ٜNg-je>ãlع8j@kB|"ӗdoo˗/H.FA˗9*3ћBjg +TxF$/-ȕ sYLJÁHɊ:8{cpĕy˹7D DwkBՁGL <$e :袤6R[6Nj_0fFc`*r4üe:}{_/ooې*-^߾~}b<z~}xi\>ngܯ(f9DN8wZ /$Ӷ}(y tT[KhӠae+OPl.(T&AJbLv;{Pӷ7^s>iGv>K>Ng6fO}`*,AP8 VIHzzmi4ҬJr1OCwS”xSIvw\-SiXs87w}U+p((dXL(NgŦڟbh8DpZc_^cx3j&g<4קG[ΤzqW"~VL5{V42]#H ]^޺2%lie+JS3w8 n`{U/EE*_i5;-ێ;OpP&n/,+IV`hW:jUjxyWntgcSZc _6C"Pp_+ۇa>r!~1u^n]NԮWwZ9]8|']p9uCpOi-jsӱ)Ҭ6tF\YQKr=Mu/3 5qX0g3HW>?\6Zh T< W LRT1FRl&WUA"Svm;LԦi7}>b_)nYVw88>ׁNd$ x&}GGgg7^;<1 c$NSIJܠ /W+E1 ɉsxLHg…b|,סld&z.^U;ڒ48hr8|vG gJחǷwg8|a0{:^&۸ql&ECPݦHHY-rL\& !xn4dZMѤ 6=MlAYAbE9"6Ӈ5UKۨ8YvQg*$+J%F:^o'u CRY,4eޟs c91AkC"z@s+"_+ $~ՔZ]r!\l+.J/Tchw@u~s ?LdA p4`h4^X (J@n; H<_|sl8'_bퟟ.ܠQΊцa l*Mh-Ϩ6^_ݸ']yJh6_s@穪(B)pHEw]EA 84DQ]cAhh npCM>}} EOvšt:|<\>$>EN< ͡F~c:A5OQ3b.։LxlEobߡ?`i3\nCQwJnk,ppPԮP lLIߟLQۼxury.bfJ H01`I+v#bs'H^@` XEvSv߭V7әd*% M;h!ޱq&˞h)Sygu֨q@TJb?Aj57=v.NnRp8,&}m+,HrSn$s )O']\%6}0ZG8t%F.AU&~-߻J2#. !Hh> M am-?FЗ޿|y]Q/=Xy<;K}9|:}qM$JD"Oz|cɥIx=:SI$geReWc'U}L@ R) AF='./W?ӿF`<{'?>~ 1֮Qx}Q@<&sPmM~/d<] (Pm22IA9%aZ3[Sbd<{6;q{āuIo? 䒱T:HK"([!Q (a?Ulh*% WǓD@Vs٤}puz'ivP?R)jC}r2σi]F$vv <[ #wX14Y{(X U,cCOl4N Q+3 7+Rg8wl(PQdfBr2Kc|]\^yί/=Y/՘UUUO?0i5 6@PfQ7/ WDɰn1n!qZĤZCv̆iw-K(h[Z6]gTR™*E8^)hwwOtΦZ.hJq@92?;?{n΃rsMzuGl0~LCUP~/W TNft q&>7Rg ۲MׁL1WH4%5}x~bA佾̆MX,d-TÓw;wGHgT4#$]G!Ƥ~456ٛ̀ FזiN)0ag`j]70;` y"_d>: \ EJ5AQ̸ןϟ|ob؛A+3ujݓ- R4Eݔ[=H )hۖv9n%u+;{0clxV1:I;/ @6ECŒssK41lnڽ -y}}G篋No1@ f780ElpuzF4U!XE.m;vnznw>M]It[ 5֑L6S|OtZ -юr&ϿV !ۅ?rm/Y $PY w6]LQko8nKr y !-ZI\^<ޞ{b1K$Si|[w.KABk296?[Di4 h{f_w99e'vtl@PCj|1V-k'R.)͞%R8' W%^ebTmjt PEPz*_|8d3D&\La()ȧsIe(S.I} O&!I|Ebx:v[YE&ӇFbY]]TSQEACnOZMGKي,Jc?V |[l4Yk2B:KP|# YF%K":ոV="֨ԫ{w}h]e3ʟ~(WN4%cfr M&{RX1:\fWst-_*$)ϭ/tQ8IX!3$+Y' (bjɍVjPŢVeՖyAb U&%IesP@ʾ Ʋɾw g7f'm2DؒR1 U"H?]cq-sL1ORB=^$AUF@,MCL,Php 'bBEOut(:XR4A-P칿Za0nW7RCbGxb[XğDCDh_9l w1ɬϗp C$ ]CiA%W"W#pZ,NMJ]{ZrY|^[j)sYCjxh\6L̈ԡu й6^yҀżV@c N0$T~J:q<H྄ʧc@E m%IAtMAfG`E[4HVsc٨V.XjCѻ[&}T~xhAǬ7*[mвwчMi4lSTl!I2<^x^RKV 8pS`YD"5dnrtFMFVEY`lO+6Ϸ^?p|~MBCp|Ӷ]܆~W%w[mx))*R;h;u{tT0)S|R< D(м$(j4d0F ov]VirnR:iI0 LcCI@,P Iwi,k0on:-\Ia4U&_AH =tz]I!GV6rߟuy" Y+bm p"H|)&ϣQ$ nP+-DS-kOTO /J1D0[-hR`1~#Ft)Td\tyQY=9L ˆY:gʼXoH]o$m+"y^y xpWT&Mz=`(KȌ<ds!%dQ k0X9\vlZC3-~Yc+:Dۑwj. bFM& &~Kƥcsٮny5RVbd8 }<:|I^al9-|9 fג+M$H(pPU=lr6ZrmЮm|kiQ}K G|=lFbU``u[uq۶lԙmf E4{!|K+, J͆1C D 6= $"!!ToY) v[.WJNpi[WhVmiK #ͰC|D&ф鬏|_y1߲ȌCO+k2Y͗J%~ *8^vUU#8A9tWDIaIv OmddDKbn3E2~iir6t(ygףsK(ytdm1k:ۅ7YDc̺| &I|vuyF3jP%)x$^lC:PR>IE2]S`8GmE=6)jN&Z>;WWWd͍hW\\&mY. N\6`#֍-$t vtd;$]9eNdYnhjuQai*Sܝ,^yVDQbnf(Il];[1acaEy{αC") 6َ^Ȁ}ct [fh1|=S"lLmyj_Os\M`dE<5' ahG{4^8 &^ol0#5hjhaeP~@YmSlQLl`Ռn9+N 4zA,,VͬGG8z ANS<YOWq!u{;Ry©\) yAb؇ 6(dɷ}qTDoC"lC`*U jBj$-* Й[8vmy{-6| rQ =cvpAjmgLDo摒:ں]֯9B68Vihyh dYAf[A|8I(q4-AnS;H"Pº Mdd&S/dD]@ Ypdz#ai6@pw/.# v=\6 -1h)4=ҠVjJ 4!l,۝V݊E$@}6 4TYl(IK p{qW vCP*D.7:'$LX6-k[smJL@,`N+PA#f5$Kx~f\%zsy~0]8]&y>Nq^%YdQP@*2e|L]嵥5nXƊ#N$ )*x2va/[MqA[ߣ$;gNcøMyҐ paKMvLڋ9@cNcFON etAo-c9&4$C(M5k8?>9Z}nt}z&M ޹4I_?8/?ҬcЖQVIk{YC7Ǯh#d%j0m=zn?X:[tVkee ӯ8.'+d1_! AD5jM:?.bm[]wVvfX o0f4o޺cz?¡K'7&JuފZ)\Gyj{0S`ܙ(dr}Q,"a`ASme[?El9UVR d_w=<\4T_.;A;lU̸%j)O;<< r1+Tu$ϿRټׁ2h.pM;  VE"YbRgF͕Á+7\ڗ:a 5/έ:\g7d&Yβluz"Ans͵a[^lNڒcunWYwUs3ϥNL`d+Zф On"5B|=l$ǂa}@ hmGt!>:pcuisɹdCf4;N~yo6mt-?熠Ғʆ7g/lژ?Wó2qkwXu;;dg)k&Ʀsym$p2|{kh͓ux@\ãD.{{RП}5z4I6H}Ac͈?3rk)Rɽk/1*fslm9k@`]G[KbY,g˛H]gxuts`}2.#y-dfzN2Q:\:6߿{&cDfۂZUeLF;ʪHbgP Cʡ7~KoTmi}e/+{+}cŴ `= ?,;+Yp>\:-.` X@Tq.bMU6tyzXY*F?fm1Y> @e=N,̤uќ;x|s_{"D7q8ްm؝cwo]]m=7vwӅ69?=0;eÊ)Rd,'.-djI<$Nee̕se/| jF,@nnZﬠ Z߈,]Pn1Y<u߭,0tB+vX[VW .MgXI0ӲQ[Hf/:HFzsy&giXoD%TWUCbq6f1h \Z[hVn<y)y/}.Ȧj'f';|pey}gXX]u@sXvL:ڟqVˋgo!T+N :0>v^1~O0tmN`/ożǧQApmfAݘ"]0p+t9ftv2/ęb8FA $eXO:(38$BaVY 1?& M_Gɫbi<02$boƻ !˿~ZOoh=Z7 7 `C{ f72QIpܩ70fss/2xqe?RJ@"س/Y{L"#_|>^(o[?o?_~foR_sGg $_;+>j,.BCtf#t!*K_5%JӵB*-4ߍV. O]o ?~F9xjj BI 5Yisw4QG-C x ί`@F;TyyCJ9ꖯ  ~O2ID67=g@jr9_(JqJ2QDCy>ںǒi/&?u\;@T5 jJÀS!ѠZFoٞbz3?Pd0}E5޴:jQyJd1HTΕJEdxr](/ x/iZʦbOǛhO&)bgAPoz/y㳱-{G<* #*碘4`z#+FmZͰ$lx_n|HLUa_r$2b>#7d&TݞLZ.f<"EQgѧH}^wG_ƯjY}՘~T[APLEVxm*jEPy @gwj pPUbðlBIf%_ǎ?O#ZTb^_?;[Yg\&B(TB"T.+eq>h4-si_?}ϭ4s%m!̂ޮI[lET|=3L6 F,0m/Vhi߽3":f_*9*"^b۹bdVYJW YP~jKdR\$QƉ?>z r!:ݽ(F߽qD=+ tfoTԖ 6$]twJ;ZGjTDt؀2jV~?xTn17J~XyZZ3˓Rđ* Fsb2V|*]$snmϧZuwHb5O?2/U[DƽfPO -<NnjzMc VtޢÃ0+:ƺz~?d9 ey:kJ~gy$zoMgW)Ql.>+B8 ,y3fȫOB.J(Lv O{PZ[ hۑǚCUXou:1TuF ) 4G7h vYuۿo${d姗:h-:QXž;EVG||1߅t2v[N8^߹/ C"]c7zYMTnac hrZe nF Z@Y puF3DUQ$Qb PQ˜[~n(7K=umP5yN/éTܟ^\'uaܕ=9X]uK/ǿuLJן^~èyNAYQD=èm%6֣8 #q7Nt0 j^sK_&갅6V狗_td֒~˷p񙯜ՕΚ}}:cQZo:i6~=ׅ~,PSO)kh[Ԭ-Q0R/ft;!O <5*2Qn6?fZsI۠lk" BpcYԲ}P)\=$mz]z􅣏wbƟ\q_~/Dp ;;GވGƩW.dooNOֽܼ6?<{"WB_voO⯿Ƴo{ ь 3Y#!H&AN[o:Xk0BVZI Ȳ rN57.DâwǺn OEuYڲazΰc]'76<=/ƍŷKsOCҟ&ĸhk:2ۇJ?]{L] 2$% W ),$ 3*F± +Ȟ<"{.Ń8a>;vR1a[xўH=}_m(9+;pqY6g/cV捾m_pۢ#p=eY\YAz^U+ռ$f%A"ЮamF! J`gVPۇ-(T:-Nl^o} x> wr.-݇?r_/Uo]3.l{3B-izqfX?=17>5c0}uiR?9+Kp912lu|%Tzr L A4@nBl6lp(6<X2"P:ʖB;ba5t*"Uۅivv|tuȴmص9\Pv ['$k^olaSŢ҇b0^2{]?Z<`XJ VK2a]_ @kx|#I)64 58tpdıR*yy摊x!Hm6[R{Ҏb1:Ξwݯ V7‘2mMVqD{{-Bg>ēOTD,K-MZ9| ,J$H9h,PB$U Zk8'B9iXEsȪKb!-=l>S$rK1Xy׿;:zVڻFfs'8K/.Ib"|> -x^ۄ_ |wF[T8C ?RUT U ,[nM.9"ؐ5@1|c)LD#RFLb؂ummw[k0i?:h[GP])ẈEل alM=dB7hފh϶c\m w %A"hxxr;o~ `U-4jĞ*48uCRt JFn|z_(V)p"E,Hdooor_w_?DwPdʻk_\•MILx$dSXlN P1]è4JԽ L$,dmU5 ,h궾Yö#(B΢drF1ҁ}|׹mcm_*f#|F$ڧS_ry9?˵$pɣOÃd!gQ/@&a53@H!,+:(jm<['Ou2 ī7l..| vAt}B|*g2P'r~g(W΅b)|^bg 2qQM|rM3 a~ J veIi(ʐ=FU*g9Ay6$u`nɔR), `|)ջMk |4W.&b Wiޅn)6 YHNݮ:} /wr:1N>#HNMCYPIQ"TuAHD#FA' )PCcjprnz E+WY4+GE,XEŐ׷I{l@|" FcR,KP.lM| Qqx0B --@PyάL٠DaܑL1b)-3@~ sɦiΩ<'HDܞH:%ījE|.d;UA"T8w KnnL>Ա:1<#OE~T ZHe&ЀSt^9MMj$JHeJdK ȫC';Ϟ[sy@Ex/y2D򷯷߿Ώda>pq~! L4Y8<`ﻮ& ǨIBÉPbSXaR^+cŦ#I ''gVe8V}pCb! NR,XD*l LHT<]‘xRLdJ"Exe4?݊ (9A+K !N,u.t祛 H0iDa%Ƨnxwtjuehr xx]'/7TJ(%xϋduluOl_g do Żetܱmu S޷^5# de2Wwu?PTiĈ44Q3Vʔc3+= R w(+End(5.ӟH{5,_>r$ƹoZ9p{I$"^IjnW 1uBя@=` ym (`嚞 fʦyȟdEDf "@[П&K7bD,~W.˩d18sX&F{zz^X*WD7 IQYjx%xQ ^J dI+uGFdLQkq>g!'B֡x?cX?GE>JR^\O:| ESÇ++xnzobfrf^`w\2-;C?Fi9Cg>i,#uwr0;3Y׈ִL~N-i [i  eu 4ΕA' L$H'QXs 87]߽Y> 8v77Ol6hb?:Z,l4nom7 ks#C#dwlR5{hF%^덣p2(Y긁 ԻyTtb NRCvVr|񲵣wdjfѰ4nX5 +-ɴigfMz7/6?njѩH'` RO,GC: Zaj@9=[8$)H{ą gp=%va+tؒJZjutuu"|vqvzzvnjlL?׏ WfƇFFG{:;ߴ@&5J({!&B} #L}cpR=O%.UPn ,$OpmW/ڻ;;twnoklkjm}gT?1?իW "r_fhp63֬qM4E()P2tt(,R@ND{@&*H% HS0ZDLFӧ͍juQM{YƆǏ>Z^xg-͏uZMcIhh- c As?E ?;T@ U!_Џ:)!ֵR )G&1=Cg9=hЁϗ P M^P@qN-c)v3QRMlBAUXɟCCng99'P~PGn2w]W?%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096264.0 guiqwt-4.0.1/guiqwt/tests/brain_cylinder.png0000666000000000000000000010503200000000000016104 0ustar00PNG  IHDRygAMA a cHRMz&u0`:pQ<bKGD̿tIME!InpIDATxڵ`lq&pQRZ-53m͌Z,=yL&N쐝Ɇ7q!ɉ8fؓw7#yOO}ONs!O("\$ "K$"D-gX_‹|]" /I?Q{?u_ >'O}Q7ŤX(x]g I1?"cc ,_ bB51?)_A TkB1) I~D/o-_{e|:;*>I}xF3/F]E?{0xCBg[a(]޴0XOug $Λ ¡G}.,R@t@ _HL4Hxq1bbCo&1dh 1E4?!)ÆBHAbA; qR8^ Kq>p)A !D5L>:μXHD)ݷhw T$/:$*<+%D/'!\8bD O( PF;(#&)^">P7/_~ B Ġ3Atǀ"`l0<{:A?J'F>[h*Bc7Մˊx /N桁zaITxOUpDBђ:;8p,G+\,SB!HHG ӨC4y_i*d"*&x6S|AĩaC@ c~`0q Hy"1Mt+~[,? ~+)bQ07XGAxGE/k5 B78F;ƹaz8=O8Chq1xa^@HZ(|qr4 ߂G&8D"1z. %3%M1Z0`0p d胯^.^G4N遐o`tF4 ?y`$M OOɃ.%$~ Ч RL%bȣ0̀CvRII)c@I`Ob1&D=db7|_&bb0,.? m'>[ o2>@!b :ww"(>N]ɳxX A*?9)x ΋܇aBf`֦]< sIL@p0Hy2;$o!q03 fh{Ac"#v16#$ID" "!ڊ+O(~n_"h#٦Y(>W` y,SOFΌpȃ;{+3B0xx7o(@"Y,mx-!-`{`*]V.Pr !T§I៑јiX"Ɔ\8L^J?-yty{ 2_adwF'(^솪`~LG-)k{`b}L:ωx?)&.3nF;aNWȱPw7 ;XMֆFU%SHuQe?G3/x[#|`BAwkLdfCRW11>C[ tD S$p @&BN衙MOآͩgg}33++3+%/C V@S"^T"t*t]yEXO; c ZN6ځϷ׷ff.g0.żU ̒Xz%%2H]GLBK1oHE3g<^~0]ʃbmeqF0h0`+ PS}zS0:6=>+Z}fx6JF]ƨlM/i\A#W3 Of1HF KE̷xyĺ?-3DD] y:VIɊؚ]6mmaqvrW,zTJ'$#dpD6.Htl:u+VF=ԣn@2Ư qA#Ш#c4§*6 %qx][kp`_t(<)qɹeo_o_R1^p\ڧ0B!'g^9=0>"Ι!6o)uk(e)=]L1%K_oS<S2_ AKPYB.`_QH&$?"Q4jK=?@fO*3KK+fkKfJJ24 f@ː'2X Ej/ NAKWG^zoc sd(KC\7$ f F;/VRRbK%]g(t}nWBd*L*^p)%>f(mĴ"|] _ݒ ~ACQ ^$OpqkbR2$V ! #iX岖-zع8t.Y|Aֵ1=017L入L *MQo[!).ݒ?5bHdV(\,Q(mhb$1 \ڙ܅[A"ɤ޾љ卍UYVbܸXbeivWa{eR*H0M6jW5mf@ ALD^ 1?-L} RFFUS& ޱJ#ʡ$%{\g~UpP5 K1QBe :Kr-4jW!i\3B9n1Όͬn,1ZMan{޵qL"r Jv pY EL.`r ԕ% A%XFRNyEc/VE%J.eksSKK[Mk4+Vʅd8hq&=kh6"vܖz` @Ӵ@d8-mښ@ Jt0蝀K" _3K騝H (!Jr ߭nLBp.b2tg=@Kuܖ^Ӭ/-\<å qϱqlM R2[ZZY1&rfkifnqqzb"d@ݮ_ډeB#}r):!/!&^*~yF/Y\E Zn o)Q4Ư iZ8v2@Sª [k P"Yej5杝@"/rJ&hZ[YZqpadݝ N0̚{"vx2O1i ' #%}$Vq]R  (>7$XʇvHގ$B/J%"D&׆ [t@&!aFջkkXejj4dTWF)[*EFWV+%H lu`ZcscjbrB՛$15k,B2bR0]]BlTJr%&,Wp{(摕_F|QmpD=ʾ!E)T`hǓrWUR㎤2rYp .ԨAesa~OVa~7ޓRL<Ί&1`!I dj k t7q(N;Hhln{_v<"ش}x*TRD sZ!Wj壬˕jRŒ;Hת2hJN_ #,dQlԳS*œֵl<#BJJ@L Z] 1W|2!ʐnS;Akrdz4af"j`X70:?7u Z=hg'+ʩH4`1v\2 WKV_kR86`4y(}:+˕Z;8@D fx._) i7VpʨA`ᅻݖnmkuTϬ1|hjthtjuw[c.vhvD*`IU+LvTTݿ8(V:g{o~pYt,&pPmu;@ dR|笳j4ׂ[w=~J4ԮYJ ]n8u* u~+_; gF쎕aߡHnirٓF68.W"Nk8_l9lupooZP&#(gk@֝{>z^|7$Jx-w5{ihP.H)qE[kjz\w%$%ikd%V&t N-LfQX9 A%r̓^gԚ wH[r\5wރ<~ /򶷿z!(`\C w1C WI}_zڇ($Xjb$BZJҢ8KQU7J%e{X,bLTh/saݪ§R\2>`cgF(DX1w^O_ ?VȴOOϭ#L^VK5g M ~Ufヽf9tnԘ\6'e:E z _y[w=8//_sP*bSHJ MX(O˶W5$ JSl1ή۲ψ23fҩ\nlT۫j̓j+7<l|N=:m ׀Kzz{%__ 3=bBI R:vq/J$6J sì pmlefmW/Hs@0zX,{0fwv_u:_RD$BЃ{K˿׾? fyX#N<̆vJBb vSW ܻ"Z$)A!u*]RzT[Xk֙2^>4jǝÓN,qz%H4ZW~|}CQF1$ahڢn@1$h$bB1\"-{Y5B/ g@E3J^<^upp|:vl1#jkYnGt[p[hAjRDQRRs,>X.^w@x{xz?@?GW ;3$rZ֭!JA" *msJ' m]_82)>u^zai38ۿې~isguJ6-{qf#g']a6yVj/j(Z2j<,> A>/O_l;!Z1Q^}Y@WTP!Ү/Q x],S /?ӧ7YR Kc&2FcW6Y?_d#>z:İwO'/O?fG= mYFkPٕ5w ǽ "'>\A}Gg?oƯ-ͯTF5-)o+*Gϛp xaza'8__YZY\Yie߸ޟ&N6 m߸bDvi,~K)y } A ~G+0ՕUD{F4ZoU]ɊHl??t|O(03:L[(K>ÔY)Jg@//O}G}/)RFvVcTauD Hc3yKi@H9,@F?ƮqG<#Rp)f}IZfu @oV- oq_GЃi{|~w}G[?W&4-ߞZ]zwO+-tlg}D1(xUEЃo8з|7b8 ̌$+]a\-W_(IنiuS&D"7P}1O#A||۷~蛿>H>i[ Rútv6 {&ebOHLNnc B;o<[=m77|5嫾osYO˦H,i^YgqW6%_ؤqTt_ xx-Boo____sIּ$WL0!3^o \}ۜ@@ H`;|6%rEoߠ;@Ya0՗vcg*-m~3R1 ӠgHoƒn  }{@:?a-z_a%o+YqĴnT\O< qGv`}2N@9=}ѻozǏ˖S=C&vgӾ;6hm!P4%0Iߤ>2beöiժ0 RX/zVwmx6sG"ul|(y\5W_~<~{wn߼q񵉀m\G~Fx]iBʯĚqy|TleRzr b =y{wnݼ8;9'rɰj ']R 3 ޸m5Ctop7Pbw 轂,. o۩d`(]]h\TYQXH|0ކoݸzFR.r4G#l<[)icn X dJhu?HHr4]A9>!fwO5wAA=}GG@#s^̜2EnKf !_CUX0OTBa{DR\ E?| zgzzEEhԪ -`]uiHZDW_\0;6ho@sg0_ze=D,rd4U\+JB^k鷍x ka 2٣+4( cFTk*'Ojv)%g>oĴ;eİ{XvCQoveZa`\kx:_zgGӋg*d&2= skjYO0HHkhƬ6cY N")V \@/ŃQ}thGճj6Ln MO*;rLz',.'`^ц3)R.*lQ/a @}mw:zܷ~UΗI0KPT8Pu} I^CbMjC(^Ɇ]=r7P? ٽZW^?+VR.Ʀ2dL'R:6~YA<]J~ ZH mpyrO5uEbΝOW5~n#L\Ts\΀cH9+W:ێ`*pux胘,0 nk,` %,sxb|]s~qHk9<~}&MJ<~'#)ˀB%jDcCݛHg`ߢ/!'d({z#o27P}Cך{D8Kv=p2Rw %ö5eݤus0} hV9?oo=|!pfPkTq!(#:=l y~@ׂWgSg7 Qw1 T`2-R\ص4i'WWW6Ԧ@RLq\h X-ˍN?89kRsͥ34\:(gD&չ݉+:{)_x~EOL]˂BO$81Wo6 \*woeK 3 `$ZM6v>A~tsV\dӑp"$APhu⡐_ D9nxTDѻdͪWk\H bUBYoнoٙm糙6VQ=xGq_`}Pu׹8, |]e)HU$H!7[)ǂ~NX^G6lW>8CBnҌ3 ʅtN]ʕZw߅s+iu"NDBnN4!\>t{bc촕ŢXZUR .]lDV2@,~n/ta,"Gʬ۬[J$`2 *"WiO&LA˦r7dReLWN#mHG8vLQmVHh"Wm)$њGy6kUx v %H(1wt+C̠B1:q"X\7?8_mͬ3ua_(VtcpoB1ԛBWx|9qH!C2 6 3I6E 307$ur"6: }&۱kdr|[ Dd,rCT{H! yPAn_f XnuADا.׃>vǪWx?iBB׉SQ:[EB(b6Hj/} zC Hc v eN4#F/0JqX}px d%/9N|@u1'#zv3%zÄTؽzZq t'kG9oGz./V_%g{_CVs< cx4E~.n4r]O,rraV P8^lv<㒱״;)mcɘϢZB)?5ϕ˔>CRkӒ(x:/bDg~cYUkxNj%ںx:ȦBPئ.ӨZSM%X&+RBMu.KB*.u@"Wœjvfx,M|f O*n\#"U/7cNߧ> zXHFÁ[JqxqԨ d<E.lmb%`g.gwZ=0bA%,~gX0OT:wnQnVS"EHU#}JrPHY &Ru?L (# 7/< h8Jd%.'RNT?:Trb-3h0|.˖IF5tb@tl"i )_%jYN^2_:jwj\`ZD)zHջS~lV/ǽ&Wl=l9 ]IIO\9+T` xjPx]$ 9jVY rUH&#tܦњ\.OU#L:QhMldyn/T tKˍL:˵V1f>Wb\-:HbR! jIj/b) ^@N&Ywj6\cCB]+0z]h2UrpTqtOrWAglKD|dyPJddf:wSL^H݈bW_fIMJks,GĢAbU eNeQX扦c gWR&jF^/D"p"̅qDQ"pbLq9ZOʸ s{BTxhK:ԛ4#WĬYf(Y)sc B*Xc{i Ҿ^J6sjCF dx4;Gb6 H$Jeםf CZ6z-`gx2nAe B&|'IdDVڪfGH Urوzf=hֺS"#/Uȥ!L|5RJ%#UëX*'/0x T'˧S\6O&l41ar2Ng!g:{J:WJt.IL89.Ukup"TKD8Ls\^,^Pk\ҺdԿG3"JcIoȸt&ӐO?Dc^%d:%Rj-`-r9^fe;J ES 7x 1 F ud1CRK9y;7A ~wc` n?6Jh^bzA6|ͧ E B*[oTA l6K[hbQOwlifI*)H, f;굯%1uhǣ%"hL}LtS!K3 B6;7675y\^emIS r t>KKX)<(3Q㮃@O*J!_RH6ny $$([[ k(lx/DDSn% t(ࡌ S%qM/#-W .AdbnqdEBJ)¡8@._(nnY8۞lYO2\<>Pg+I7WD.AZqQ¶a*74I|u~jAHgA_@H (B)aM.O2i u}BJDHF*FS0_:mk(0:D8w?yd"N{g3q9^ "_MPHVEH+Lz6W+ڬL@Շd-=Kr\k8L "RO@rR}0\i=!BX"e"fSkٷWw,`ɱ3B>MfSL:ʆbZB\j;+6ڹpYsj>%D0 r|1nuF-*333!)V( 7ss$帞q mw)iR0j!o11+MO-hͩYaM.Dcbls-d86ڕbBO%qdZ$X8Y-,/lT2B*JCH~5-F3l/)A(D`Xq[vfR~! Ā[!q4VI j /s,6Ύ '0ͬu&Χ,f  &`ophP!=p<רfS\W _$ԳnWOV;R!PA%iHj:PPbjPG^ A\(l[s-mL0"uy0kQk 6P,at*B:HsA+q6MҩJl:]eY.o`q1S,e mT2dJP(y\\̬["zZM87m[')vJ :*X-2ȶ}m왺Ǵ8(Ţ]:뵺=3 %H&fʅT>c2jTiUנ~Tm7t2UjV\$R):wᲥ@hؗj%(E)ft3aӤq^5v X«)"fmܓg}e"hxΒ9#R—U9~6nBD$e~`hj+{B(lXchlT+By48$spΣ/8rAZ=* !xXM5ie*8&N)H^cS&gN;KR}MYnzmV`* sy2,[D>67O ܉̦J{|!22j |&BK*t(dl5 vΏڭ2X9G2+HJ M:)OxˆZkE%C:=5F;Ǚ!3mvb/ ]t:8~p,dZ:ܹ֬j3n ZP&ҥJ![ٯ%X2 ƪ4C$f #2h+/Ec>-nqJ[w.39$%&dlF,n.  c@u3 .'jH,*h|.Vb^NV! bP|8 Y-N.QȰBjRH,I$[vyw{B@LxǏE2JLrښ5)L;9鰨7,xTb9w8X"L<!˧cd&s0x+[|ڨK^IO'f{sX+VZPWϮ$~BKfFTKGi_hWNb"%DM[@ Q7:眐s#3 [$~ <6Kd) ZbmWx< YA%]lVrh4Zz XJ~&KXĮW OrMɨoܹFѭQJPAjT,fiz 5ѤwD !#\ '+b,L:Ng lr % FQ5*vUkfkWl" F̶w{X@8prcA  /J3-2x}]Ga\lݣB Ʉù-DHkT*撩L7 K|.WkJ*•rj6 @z) '2\YV\*e-Fg0QXG$C4^LdܑmU>V#S^/F. :tbpiifhn_2ftU/x 㪇GzMR+v RDPl{|V+$JhQ\)!R)L<k|MΦәEB-iTJ(M8(<10 Du('K $b cij3̚M"qࠜΥXe:L)Iv֨G{rY)i z:шrhdP童t7DE^;$3z9krA3龭X˜5> ^@24.h5\1"˦RQ$A3xՀjLVtJ.Pؒ%‘TfqT!JWWYl01\S1eltzW<[(j|":j哉ҁ0붙\ Dc$-&Rlp&TRFJJT>9g/si;:_{ 5-J̬8E&R 9AX15-+Bfh; _ -,Ri[.AoV9.WJlfP+粅dӮUs\plXaTueqi5U+J֯))@Fy<. 1/#D&/U |'k?xP]8=ÒQX@JHr%Neq"_ZI{`2 YN1̕ Fp.KĽ&k8;!.[-ƒv#֗D t)UStU炡CΨ&䤐S{ꓖm׾@ΊAb\͐B\ UB &(i4}zMiddbr`r;?k@40Y,@Tpb^TH0\n6p1+&ZRJW)`2Md\2[>/j胴Xk?:5+0yBJ@@uK1^',hlìf<65P4FprT"Igx ]-ÕE.=v#:"LZHprmhZ @ )*R}pPD'iooCA0>tns  m{{eB`HElҿbz{dj_![7T򹀇+rorcxuj-Pobz bZi6k !G9ޯ@3eb'ݖLXAɧ;f=΀w\$RW~!u 3x!3n ]j/ŮvXnRLq`x$YT[buo\\Jeȝ, C"ier`&֖7vr䴓ڶ*fC1 G_ 3yUȳ,OvlPoX/A!.%A%x<۪J\' U/[B\C6.U(%HTlV|_IJR&(mtڎEUMQ4q0HA A "D hBY3T#cCJoa { 2m)VRL>/x%_" ţ~b1˺A%S䯄Sʕz^be#2;MӲ^1Z_$y6}|VAJB1)xU55&cAP"Q 5bܾd`~k\9<34R Kyo5 '\.[7ڭD2Pƀ!$"SAb—HrBW,+j5̤\mʥB-, J'ZkU^Ew E"Q!a lLߦN̓#s+##JYo #3vx<Rs8ʣl(a* -5pNȷaæ2J @W@b(W(r1.N D 9IHH K HuQM9-J(O$9R<| i8 OJ*[u:EI>-ӆyyY62GA-!$x{$Y(#B%lؐ1*@jDfa-NA T YHS X,F~ #C2%AÚ坱dʜ=ʄsj:`w JJE5& PA1Őd !әgbieq~f_F-MUCή[b\,&cd&)-@=_W1>EOHXyuf-Z$I4[ +R0!Hڌk/, [=)K!KCFB^ÑB9f3%^#%5NYl(h8Arj|s@VMSk+SJIozgw{kyvJE4^׵"Q?%Ūe-{S{\$;,f~H,]Z^ u*1 !~ bZ eDJEt?7lhF飄=2֚ɨd;gVO(D,$)SMϛZfoiWI)ŽIHYT$yCѽ %&Wf[V{}w϶./2pp! ѕy͐ w B Qaib0PL8sg/0Ջ€ƥTذD('wV+P2K ` ijjc+P̛seqW/9 2gHJ'%MN|dӕc]a>~psy42X4Xx-' @6\E@⢻ A62ƫu %u82H@(Z<½&B\L59m^vZFW'V:zuvemO5 Q1\ߧJ )p3<2i  }l&jSg<չ<ۜ .y긖A5x Y_d@%5{^U~!Žv3JxK@bP!WH0q7c$bR.WBygqz\Q <]P#»K]כ,fVa͔1` /o|b %!v-!Xw-]Z熠kπVO.N$Q-LUdLE.+HZ ٙaPO^#$reԌv]T;c}|~#^/:LG]ˊs MN"~M5x-EȌGvj^NjBnsK=Jc&z{dbeXԐb ;Y49չ0:TsÜjje\"Qc FO8鷇^f>0z;9>sq$jf4 3ҊA8JK1"P3&{/tjԴ>"$gKPA{{Fz(@3$cĢ^PT< X5, zdS;$ۋrZ%q4l(9zU{Jgϕ>#㽜˥+6b- #N9!,P+ΛUllӆferޒfg$-R9-7)%0A=BYP؆z`btr!7d[ ̪k{~v~bG.>a} z4qFZy}N'^<*߸eK_)&odW6 \·1paΘ?{kB1nR\԰^ѐ0re\[ɔRwwb ^A%D=6"boZ }=AԊٴvM:p/U0MrN M6CJqF*v^۔b=$c4zVvYaþd3X]HxRMgFFw=ƵeȀD70+ 'ŐF^XuK_˲ ] IzjY>] ޹,lgH+xx '}<[ 7"H[(H"PNjBVIî5yK$0~-Y KZQ;&UM{K~fWO=y{Vw %_77=s8(W.S^=q̗ދ8|ٷF򫸈xgYn/pXCaÆfwW37z}o# HD6K*Pc1a )8l30ma#N֕D6^2F"k TBH$)px F-O*/.9eYb|=^ȵk6c96N&#NkulZMl8 բ\vpyyfd!D`V4 +8 .BXa"$c(u03۽/8fc?=i=Wj!:I/-mjlPhqF7Cǝ*YYAf|p$e[""w{/?ɚ'/=y  *@$ k}A iPY(LUkVQVk拭\ᰕvvݪն8LGSlYo-Z4\:mAD|lVN|.x7̆L~e1}m2<[yb;y$B)Ih 9j݉MW6v+bJ"oO IsӮZ^fdUXу˽Z*{J$_N:6fsk FVa53@8ȇ$AÞ@<ȗD2Mh*뚚2{B85 ۯ6փ{;AkC.$z`` :dW L$ƕW`w_B7|qV9;H:vCF\Mvs8F<\gw~W8 {{iqiCc pšb/}_~HT/%}A!:4>EK6iZ-bUV@ c.KDx E6uzwP+?|E"޸sY&Ŭhzn7[ }">+;B^(?O(7ۢQn5fmZTƛ/%X@n\E 7POb\"}W?MMk d@ P ^b6DPi?|0lYo t~vX]#ʾkτrnwu]{~6lW6yurz {Mjt>w0$K#˾;Ӓ=h3O.^x}!fKRXBF. * \# Mi5dgw g;] n,Hi E-dTF&qU- dAVIJUQ؄tZeEf|A9cK/G)q{J*:7,zCEnUo.,،[[kkKz袑l/H:KѰ?xʛ>8Lx/d3o(A17Jp3QRp!㼋L!A0dz_wTr޻l rn=X!vuc3]lͯTyٷ F uY*o{$9mA.{淿xQ䅷>W٭}x-6kDsFBk8CFIF6,3 <2o:gG=xfY>x')woc],-4unfZ7{EB1izWۙFs~|ffϖϼ=wSoW}+F\^:,ˁrPo5ljfyueYw 5.݉^<Η_zgW|;[ruTV BE @,4` lX#w\TZw_^ܹ [w#l(7OMrlW񭋬345鱱`bqjqfGV g?ev}iB;?/ڈ 0^}}W6k :[^fʐxx3o^U7$D/W $),v+NXs#RBn֭<  G0>K_~ܭ{;ŨjQPx> Q 0]a≪ W]"(܅ `,M"7 :{99<~凷.OoܾyNR.[o׃F_=9V[T>{ۋNO.7w*nr{˯ԽvON4n/M; )=\~1$RQ+3 τhX7SB|^HeGgg{_zfPϗK(ߨl D{s?z?䅓V}Sd7PvuVxr}O7Gl]'29x% Kbf$B|\J($*qeDʆy7ؖ"Z$_1G'{bŭO^xr\-N^-^oz{>{_{2_zxqzv79~e].5KOO&!ycxwAO®ND%X*`0uЬZ _9R?+VJGGo{rɆvژ ,TBBv z4s $|T1(9KC؞-rl4o?uK'o{pܭǝ8?m,..nBڸ`Q*\g:=~:&JNH ?a4. |G'1DHgcVrĖcč1+Pbrt}K<~˳jrr>}/zGOORrr_oDFewغq9>9=u>tD5;~5 |#AOL ' I\UYq_ ݭIDAT7@}o@qӤb`VfK靳s`Dɍw޼qBZrgǝNA}/ûypAg9y{tgUJhKyӹ9ۯ!Q!9Q2) /$Vw!N] ~B غ- ' $@{!2D(_޺<ҝZҩk}vvݾy|xwa-{tZ{G'g/~+V٨]4?;/gn`a 𞈺qOȀ\p5h<H0Š jbasOjGϿB@֍FƃG9h6_}×_sxrYK]\~xٹ3]/U:M.4o. MHАxhQQeP!ΕB!:/~E@GUr~՗5ܩvy^tozp,N1N47 ^Dx[ăϱJRk2L=;b/⑂+0"24^p͘L~gs`t[=8q|e3..oߌZG (J .[n_<⓻wݹq,MN@YF`d%1%hoą11W2; .7Eq1r o|;|@yw:{7DqZwy3Ѽyr+/<;v/>z͋Z|*V/..+d$߮ţD%_ 7\1x.VH"/XK"!"LkFڲI4{{Ͻ|ƽOzك͛_yrwٻgrl$4h6F@j)X&ynO{ f%\#$p8Fk!R0BǟO ~O܈b +W4"JrvaRZů iT.ߗJIghdxdlziKg^u9=n?vـ?[=1jfֺZ<;9+Jq"r EAa:V%ax"VDCt]HAp7q }^G] $ؒKß>HURbhl|zvva~a۠lnzIk5a24 {qXr?.{@C34D9? Zg :R~ÈƐb-D)mCPAY^}i8DP O-/.LOLΌO-̎MN.;k+3SS}2<Dķb4~ ޢ_M?t d"#@!Q"_"hX잨U!,>BXB>~w JBO02l{TcCrY_oOR902<<<448׫J24Z z4yZ5 k?qDOwQTz bIH(u+C|Y_)G%B,g 'wR b$J%CJ`J$ ,2._C\$ϯ[ 1vCtt)Ix@(|=I(zZvI tO^c9)!$]& K|Bw/,FK>rBr9q}\—>+B/Y=tb%tEXtdate:create2015-08-31T15:01:33+02:00/1%tEXtdate:modify2015-08-31T15:01:33+02:00r+tEXtSoftwarePaint.NET v3.5.4>vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/computations.py0000666000000000000000000000260200000000000015510 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Plot computations test""" SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.builder import make def plot(*items): win = CurveDialog(edit=False, toolbar=True) plot = win.get_plot() for item in items: plot.add_item(item) win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from numpy import linspace, sin, trapz x = linspace(-10, 10, 1000) y = sin(sin(sin(x))) curve = make.curve(x, y, "ab", "b") range = make.range(-2, 2) disp0 = make.range_info_label( range, "BR", "x = %.1f ± %.1f cm", title="Range infos" ) disp1 = make.computation(range, "BL", "trapz=%g", curve, lambda x, y: trapz(y, x)) disp2 = make.computations( range, "TL", [ (curve, "min=%.5f", lambda x, y: y.min()), (curve, "max=%.5f", lambda x, y: y.max()), (curve, "avg=%.5f", lambda x, y: y.mean()), ], ) legend = make.legend("TR") plot(curve, range, disp0, disp1, disp2, legend) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598164307.0 guiqwt-4.0.1/guiqwt/tests/contrast.png0000666000000000000000000041465200000000000014770 0ustar00PNG  IHDRBxnsBIT|d pHYs+ IDATxiodu5Ț'V8gԚ,[eH I?z?xH~ sȖ˲"$%P$kY6ݼHm]3ݳY{8z~OQJGo{{sssOQwW\&}eW\&}eW]^{"Ld"D&rzEԁ%o?>*5Ld"D&IH\ҏ~n?zv}?FI_}pI_}pI_; !Lc/GϾk&2Ld"d<5vW^ |I>#}6Oի"{}c8sg-joo>ҽb1.' c xm^Lޯ}6~u{ߗ}ppxug3Y쏑?&tӺW~IRԉ   255eePQYSSSSFŕeR)#4닃$@X.T<  +U,8ɤ}sbwN1bjjꬿiYSWNji{ ;F2s=(J$wb|u~(灖CQJ$H$@5==mL&HRH$9ǝ}uzyAk1L; FE>Q@)<ŗ xʧ&.f\UE+a?2JNhO("p;`ݭ*[`oYg8EJ$[=888VƏ vS@z1# OaLǡFѱvs=; 'R^~8Fxwkoʬzq>p ?^a²NO''z8z:hɇb>g};| ?aQm]\9G%LArǪ=$ u*tu> }].@) )85D֓WctY.L9N)ߕ}E23)@mUt 8:vʠ8Y}t~r6* `{ƾXwX}5.0(ȇB,.\mT}fUF9z=MA^>waf2((P Fov^v^z&՛Cޫ9&:w8]&0/1m Hhtyp;R% (r ؜ĠMd"'YSN ITLcdE; s3Դ JE.''-Wİal*/mF{LN>߱|5U*@S\( >@gT9Q)tpmwW$:?|Yo:< X :ĬuZg0(DZӹQ I$p$0F}E]79`D4?^QU >tU愋6.jPE|"r)uQvH ~r4LlЬ58,eaНm'(hPj+ >d @p l&L&`px gb1R)L&cF =\k*@kIRٳn|_7:~(Mq,XF}p&QeS,/x?]4ؐWHI<23 H<>)WQeTZy@@4xguж2A|ԞWHG":{k]a`Kͬj=}YIOߞ,M}[֧[y'1pʜh<|x6.)P@N:u. `(K`|Zo2?:ucƀE?~LLcQ2) a{}­˛%IzpHy0'PoF8wi5NI}<9~ GGt=Gy0E ;;{€_#_To7i^+aö OFo70zm}cAg_Z_oL2u%~3EEJBE5do lT9{r 0aN\S%BdƓ>W@eu|g;dSNC1\K7~$Id2cyob2<><)d鴁(Uv}y&, sUD"3er$9s>\U&Iyr9@L=xg+pYoȗgj`00e tãlZ!弌b(hωӢT?DQMLcŃ .BڨyR9w*:9 y0üY?ޡ֟Dvm~p$[5n,9g)SީTOWjj':f~Fb0)~b^q``>h:Աg<HYM? &Bߵ_u>;{/z콗-6oP\Z.ʘD:`D4s|g5" [PUPhޯL~VӞ.HJ1WZg*;*ՓDwafbnpdZL@A8 r}ɒ#.eqgþױ~+t2NJA!39ǨHi]=^{;8@Cg;60ח7Æ10W6ðUtFQ&S"Qb9@*Kp 1 t7LQ[{0{iZcy@)KTp,ћ(ij O&oT`0@(å@wʠu]+Kώv UTxg^30 Cz*0I#t}Co cz@=~sm"2]~$ɝ3uK~V&;MszIXߩ:a!zIa=GiU E]v>s?"(Hx<6 \:Eb;Q~o/T4Q @8?UY ]sQra{S,2 H3 HW+F ,peŀ7)]<}}X?>g09gʤ)YU[8 *G{QZT|h4:v.JfXbhV uWu%S o>yqްO5 0$5)Pʳzvpl1ğ-S>MJR6n69 :F(V?\z=JG{{#O>RyԧTbTyEQ osxx/ c~8Q}<; |Lߪ8*{JD"\a_E ϊ<3h;PUo_Լ5|tDÎj6Ngh|h?g(cIgqxS7LAn4:mI&V7jߔ crf=MqZkT(zo|k |ZM.Ѥb7W ;g*qwŕNU_2p;&U^ܥRTAW~*(-O}hxD1"~ng7S1UqYYvxޗS!ُnfŬslFx&`o~?dO:^T2X3AghޫoLyǀNܥRc'LQ}RFt:y̹N *.pȂq\N;z/.Lcu0bݍiJݰk8 7\K%t8uɲ\ЩTX^*5]AG&p8w+d U4)pnD|l~#>l A٬% P @>70\ʶSv&  3l#-fK@-Hysا#Y 4O\@*q5Q0:5 ʄx_"~O 6y M#0"u`wɍgY|ԅ')$EZy{h4J;L~ffH*eb掙1@ݶ2 H$<>SF1^g&I CSf䝒Ux M!0E^w?PUA{a좲3Zo]:oGZ(0fz319{y ǞZo2SfX۫NQB|FӔ:KDRa5  ԉZxezFwRБRGNz - sPCUZj>qu e647s(@ #)'? 蛤J\g_©37Ǔz'b i=cB3+@Ǘf&Q'cee0?O<eQ%~KYF(`LcPq*hUhF}jP_AL=`6zm/+.>&cdDT8pL!|9+}B7fmhz~T$~z1Ԛʑ,I*Ϻ +N%eT9聜j:R_&N&oFQELPȺ_v٬ vm@@ca%H\.T*!N#Nc}},jK* TgrVF`L&l6B`٩iegN`9Y5MR-7~OH5#t+!Ww.oCjzoFTqMzfs;J|e_zfO,6>"z=2#t?ia|O" N|D42:}:{pœjxtJM Z'.kQ@Ld zGx>Tij_*Cu *S{9d_~ri`00P( ]hT2`PT\̖F.]•+WI+J@fu<"Bd?f2/o͞g(cU3#e(V2x<=5 ~Od(éﲂ4&0ݤp >Q(겉il"p%#@6$b0آ" > sa'PSDe@S^g?g2Sh>P1d,IuHB zSupuyf"(-}{0bX]]*@榁j=uܺu ~^l a<#ϛingge>iCjctͳhaQgw 8,:`D4#*[aPȞ63K3=G/O S承 E|sC6E6Ύ_լϘy4nbO)G5;z=csX.Y[[3F <ml/_ƣ>x<\v.\@^7`QD^蕶τz#;gqq G4cgccz{{{HRd2v&zn']~#l~V l\t0 P,籴\pl^cssnn@`0@ /V 97Q^粚h 7 IDATԜIM3O>DaPz)R)jpjxy8?fo>(7AjwVߩ(ۓ$lbUY~>GAt\lDC\6_M%J,c ,hk|Y7E~=6G3Pd*&IrRҔ^.^{ _~oɽ^FX__G>7!}jՔcF&䔪ɤkG㝝_P0:/9… hjvww۷onlY(Jaww7OFG{^xdġ~xFnj{yr,C>ʲ]j@ML,o~kh(Ŭd2{QӠ>QzիxP*> >R<>>C``xlM€>W 6+#DGՀ@e*{@_* VGbݽz*ͦ>E\*MOOcffKKKX]]‚hd4wm4OF& 0!v6gfb?} 5Tk~BB|>o;s?88vwwPַ  Z^+#y,U͉*cO.^]>=^2[3k@zS:7:)iE]A|kOK&OިPrPi uV2' ~(AB|cht*i>C`ӹ\~ms&!c,fLd:bh`!vw1EGhZ*666lIqssӔyTBb0} xy{WS+)7 43gL짖sΛԜeG(>*iz?Eaas[)˪r{ (Ku7 0/\Lcʎ 2Bimܢ2d2#(;IJTT@Vi]h4poRSi jh H!{%ѣ. Dc {W?9\xJwQ(,uo4jvm477gcNqy\pΝ30Ȥ4ƍ/~P$L.㘧R)$IEX,NffFa RZ>zFvwwQՐL&qi,..\.ʕ+5u,--6acc+++s)_e`bHHF,>}s YibSfKn(4*SiAv+ .N oLE^FopX?E&rz$*cY t)0b ~.K`1#xs飸4YcT9qשl:qv[ίcl6k󘛛2b{vZd,BܹsxG177@Nu4 ܹsخ`` f*ޣh4l06M3ϥic֐JJfmO,0?ࡇ2 D$755]t]3333iZ]XX0%KK9N~( meQ@nyZe{.3N3(˨,֕k|~nBjTnDQE$@Sa5Ә \fY}Iz8bvv֔>KÐ*u҄깿o&ݰOHMޙe)cJ_R)y̙38<2jvwwD_23LQ2d2YKXT=\v Z vێ ᎞f5̌pL9vVYk{Vp~:4Dys[>ݮEy d2cZ:t:dYeTUlmmass6.jy@8:)zf=VC熖F4z 9q~V7I8} m;O2 㝢9t~sjVfI,}fT%lbgF^}t1,sB](LyrIM֤ ay dlWBD"9$oԑS멾=逳q۵ȳFa <X]]5H$PTh4o )|JfoowK/=3{nJRNv&ŋofgg h%l8Z&i j5EJ%ڙiͳxq%?ﰱwbgg.jlɰE̠T*afffx뭷H$̇sDLNEϨ32)F9OR hyI5AvR*_\?q|}d29|hg5MqR)E34{6) 1K)DY".\{a /8P0>6Z?)vC]'|m7S9oj9qzzKKKt:v(S*7dg5,=Va{{;;;vf#gc}ܹsnהݮjt:k.!ܚdnM}4 ܾ}۸}6.vwwQh4055qtfGZOVȓ<;8{ PY#~\ՈE7埧g~w!]U! k? <$ &f61Q(겉ii$j1 #@a b pG΅]saKRTUs1bp looccc>33rnk G;jZJb }cx*Ci61n7obvv> ::ݮ٬f&!TU*e3=nnnbkk XGy~9YS(P A)0P ~l Ox?!e\3}^jG]&|fԽhbΐ\͈0b"x7)Aj :rGM @$nm{3:P*vz* 5 0 ,w糹i~/dBT*!7 ZfCFT*E\F*2d8ƍhZkDMTZtpfF c٬9rcd0o\{91"snݺ۷o㗿Ë/xt]=~Jbqg x ah>8nll L^[t>dժ/W%IyT[hh>~m;yflG0f26`fi$:=fk61m"0:JLƉBaZFU*oč7p TUTU΢P({GTXz;}o>`hZ 7a}a[z'A~Bd 7 ׈.}2[oBfnu;E]61M3%tڜwuf{.j&狑Ѡ EJP( I2u>jEuMqQ锨UdP)NQMDB΅Zwƺ[ GMb>,Vwf1EVM?ɪk OPw~s}dN*BTC=ddggMh\.g&42!PױVnNcұ\, O}LxHvmSEʾ&DȈ!%W:t\#9xZ=@lxϞ=ksݻxb\t:`ѼFin$.//ݻ;w)ZZZBZ*ylooc}}Y_"uxۨj/~a}(s!ƍǨj1xdϝHղ9\*> h"3gOM( [}@ݐht$$b]p>RvMΧ҈I~ OW^s=g+Q1B\@<7 ʗ wetx<6S1 ^YQuaU^ix>I2j8Wi)1spcs8YZZΜ9cf~#*uV'3~ jrE*c}AFHP(XԚ]e Ȥz=K P( p~({%kaB\6@X,fkLB;C+++X^^pd"fVYy,..b~~|>X:O!V'w%12|j*V(9Ѵ2PYpʂ*S>Hx~5:ttYЯ? :O >7nxk*OK&O(ƀOG;=FЗ ~:UG"PRYJ KX.Z.T@'à$]q:F4>9XZ͔$M^R gϞc%.:n޼۷o[4.&֬"0!Q:@&MH.5nj\|2ZPXuDF#;cqqdD^FrSRřd,e H$F0VՐ1P(팞ݻwq}\|9`2"`'Iew<r1Ex$\SЧG?9?ivFDTA H   ) 5A SAQ(겉il")#3#e!{ ]\`uIY:F. ќ6yM'_$,~aY t)0i샏 (Ӣ(BX>KuK6IA +Hb<R.>\@,_2/aii [[[vf{Z3nQp-ܺu n*sFqW?BøyTeGDG~w5pik6rH$T*\766>\>KUllZ"y*fVHGtufHv^Z zkkkGhuuXGun9c]+JX\\.-adpٟOMMI\.kf_+++(XZZ޽p\.gF#'Ӧ>E'w݄72{s|Ge c׬d|>M^ M:Hsa[5l & IDATFQNDEi 8Z| wTFJs}r KEJA{|Y'oh_4\'Z5ih鹹9<#(ǭ[p^Gy3acckkkf: 7>2Fy!Cs&w6ŋ˗/ܹsv >5I }>t,D&F##`',S}h$#Bc\4a )V o̹b?p,ͦrD€~XX7- Ek3狂KhdԱR3*KݬDjv 3EU&S" (ƀŎwoA7\@5E6oVJw}TZ=Y|{*(c}O*ZD}Q[۷oxWjܮy&&|M;DueĐ*'5y0!Fb1ys8gF2m:^vϞ=kFنbh lU@{9'hiZ0:3⏬![.*4fggg47YH2C?Aɞy]c7ͦb1vR8wQ(VD"Hg@ |/UҍS0vFCh6n}'2?F" H F4vDM]9[r a"f,,2o>g*bhf~B_W//^~ڵkh6懤jc0_ 22jBSZ'Ylw.CX0 Ȏyxh* r9J%BY63387PT" h4̙,h.#XOd٬-Hd蛤j7@^GPPxl6'4"<`I;F37sKZ-ܽ{VLTgr4\%b>AMTlŽ=7x}+`yy?0Ο?ocAVs "VWWY::6+ `T09 'A g@LL΃[O-'DvJ0LhݘvlCKEGj0?w\`rw4;1Y*`gt,C<CZ/7-z=J߷lpQVM\.#PŤQFd h"Ө'1Ȩ@#!pqRAP0?phyτs)3GY5SE4i?(>0@GSX wK7n^\.cnn"46>D.]2@jNl[Ө=uφz+ǒlp\GڿnxSE7I̞&ihQ(겉ii$1h.Tz c2ʓ;܃ ǧ%:w03Pap7jx-C/_K.ٳrhZ * cnngΜ+_|a6Y/&[Ϝ9cLHJPTC 0p3ǁf&28tJVDPI#25&j$#S,Q,Y-K TQ=b~~sss(h6h4 ãȺ$ TU+@h4K;xfnkGtcaajV#2FaycyEw 2?l3^3|ݤ)`̩n2x0N&$ӣ7|Ң,QeGW~9]_TT{ErfrUU`=33c}@d>677Ln"# ^4Ӹϳq'X^(>2ZFj=9jT_CA kjN>$0Ii7ʦ1[WႩI rJB0%ģQgJoh!TTRX&pzܽ{X^^O?m,smPd2===B`:Z{GApQ2jvH/&x(}?LȣrRL&c2?BNF *dY}C^g `tggvJ333XXX@A1&3!L\.)˹ny\FRɎBIRy&|M<v#/{{{۳ȱrzƘ{ϪycLa ZŢ+#'41!5Ө)-꼯`qzz:n4![jjeR~q-&Q4* 3z̝$wLMl^<*j H&`F/Z o6á}ϳ_wyn +5y[̩ `Yd{RK3JfMɨL@qlyIdҀwb'٥&J,IY85$"&KA3ΎBK nd@X>L#5_"̗&NR Fg.eNsd_~h+WQ\UFvG\iek9w?Iu$ji$1hw`CM*= &LA*3_$ڰ}:/--'ŋq-ܼy*VVV0??o4 7o;wxy;C shgha:Y1(4u F'W1 R`BF_cZ-;X,ZbE5ez=31ZJM g J1 [V T8h#cC.ݻw䵽mmSҥRLf&A qZ-={ΝҒGb?mˣĤV&TAFViB٧I׼Fb%5Dzd 2 V5j0Nj8F$lbgR1ժ펹c_R~Wxxxh~#=NM›f-\\})#.ؼ^ùuL$0;/| r Ξ={_~7|'^x'\.1 0 ,,,,X]h6`g^1l0)JX^^6G^{ j5Lƀ *# ' B;pй&rl,}T8FK(iv~\4uUTʲ(kCi~Ɍtzz;;;@V3sPcٴdmoo/`㽚Zy4KP6^u?yD"aaҝNsss?s<#/_~׮]p9~a(:ۙd,[ӑVM?`A">[AM'̿)O`4z=2deXOOFBy}8$t:&Ujhd$+-}KƂǯ|&\%cܹcy-K2l׵=|>R``Gwc}rxeQYHL)7c}S?> |EXWH\g.NvJ0LhS_9z B Z.R!dHG ]}%bO"rϟŋh4_WXYYʔ~3/lΦ<5NHF2 O$s@!nHQA+8"#jf=vC#xLƌ^M[xMeL&륀G.]fE$dd|x= M*{Y[͌rxlrγ9N:2SOajj9Trβ4"K&RB&`?SNR"5Oٚ+wG˧(#H$Z;KwZ"QeD>}(aT +Tek GjnŎJX D^Q"OgӅ_y,..bzzoƋ/Ns&׿5~__l_XXLLZAI3-zn;|U3*@ʄRFeVz,0hR3y >2*@02]Gs0,]1;QF̈DX,2P:oO 94u:!|ppf0il[[[O?'|ΝښCb7o޴L?Hn&`M9z*51jR{aQ4AR9y_'4|`kPD&Hdi$1¤&*]&. x=w|;H+C& ʏ-,,ҥKX\\D,CݻwQבQ,/~xq5:oR!'ElhΘ̌5t:cJ̧xY7^#gu`Ob4l #F(95A\8RSz>73(hښ}bL@gollظqb鞇.jdLWK ѹɌj&Q-~Z>Ĺ9/Pu4vJSaEX讓FPCPPZ^HrHeIw|(177˗/ʕ+8s vvvP7M!N^;#ׯ[=q!ftw. rEmnnT*X,bnnΘMzd,٠8xwJuc?`ߪRPIX?^OMfTt70:=EƈfGxdP(3ߢ_M>)P)g\6`̜HglF[G1ְYTUAŹI`X7#%3uM 7|~i[1ߜwde -G͹* E]1=C>zE~O9 &5*vޡJ88@Z3x}2B` }icEe``ױMKTH`Ʊ%`Vl `00*䁧w޵L8:Ν;MV.Q,獭gRx`uuvf3`l4r8sEE1I"ǫI, v7<3W+W^^Ylbmm ^|24.\`gmooVU#ߕ{OFE=cn}=CPM lkd'M^+N9#t?1~K?(t)0i w(CQh)Z& clFƈBSN1 pulll^̙3xQ.z01*!s( IDAT~oۦhG$lsh.!D41pX4!;TK:N4.z 'qىu 1߷;S*ۣ~4ES~hj! C Rv$1a4!TsX>qss׮] l4S6==V3\nۼ;>Z^yv]ap|nzw|du. ^‹?Vοu+K[N;%&Q6qq@։z*X,yDsI먬߯ncwwLj.]Ғs?^css籸ܽ{Z ;;;AH$, 33WNTB&1`v!xz, RdVecB}c;j s٘#3S&shf2gRE6 9j`e,3gcI@eMCELӑaAٽYg gE}|ƨjQX4?~&ut:u,..ZژLMMٙtxFÀ)u'8hd̼[[s:H65guFss?Huf{d ?}>,'^Ywo#NeI> &jv%+d!CdmuBe9\ s"]A(nܸms4;*x3&vOȚ) EF?Ⱥ0#qCH.rFX#@zFnuOw\sX\0[5pDUa]߻Z}wJVrj4ы/|M?ժ|MUU C5bxŅ3={,*džz=nc; LTRX ٬T*iyyY|^ё=ؗ *_㑩T*( L~Za l'dXz= 0,!9rFI lu!^lgYltիo~Y]]V,-- {ァǏT*n}O?яtvv9-//kmm-ju]j5n̑"v7I ]ۋx,/q@ә L{8i:Ġxɖi6@Ϳн-C.@Mkg|;*˿?%xUeI$%9:"{`\IPt:CuyyY`o7\~ᇱg @V.TQ}yj" i h|>R L9|Lߒ~E< ($:2ڳLLPeh(۝dz^x^!^S}MfDCg-`Og4ҀF1::: !3yp},mf:fff(x||X÷icc# S_xdAY`gg\ZsK=xf{|^9̓&1|ٶsiߥȧ8_ >so/iƿ_m_oݶ|Sz=U*L! @ <03z<=M9;;,FeX;Ç:>>˗/tt U*mnnpog?O~SSSZ]] YnG`8J"I!?Atמ.xR,)3bONNaGrȴtB^_eZ:|^ˑ 4ɤfᕂ"p?7 )Rp8L_5ЀSu`qCT*?\ЫW|^q} A0Eggg^jfZFVYpj4 #3ղp|O`K_#`Mrb.XbHS^'~|ι!#LڌE H9יb> oTjsrYz~WWd2_``#/..b;KVҸszn +9`&AdƲ5߼ԟaϛ! ?)Iۼ߰M"%8X&sY n\+D*'u =;)ͥ67q0h>.Wrv;d.rБ&1<#o1` qA<==ՏcQ1\ iP($+>ʎ<,R,`O/^ ؓ#~ҚKlWy&Mb,,1OJOrAoҷ4_rDH&/`WHdk_GZ) F#J%}K_Ǐ#k?ζ>c}ǽS"[7ߌ^. \|>ӐKCd2jjXpߒ`nZ:0sss;b'GTun KUrfV+gqq11svjd2T*rLIVӫWgT*!h4rHr.MMM?^z~[?iwwW{{{QOOOU,絸ggg*JvїdirB?]9Y < ܛ &_yv=ۧ,_<@SWIt经 IϸL7YQPr׾j~OF~_\\D>HF#vfxIzx2`QJR⺽YcҘIVrPI ^ i,K⁞)5`6Kq.Z=Ck␎>=q ̓0c3G90C0bL&td ¤c@$KDcT,dńGRl؊a&X,Sp-@v;_@!-Xx(}<~t%s7Y&1]ki78O,DJp1IxFA= iSSS 懖N"b }k_ ?M4/SSh4h4_Ƨ`zYzr d4p.J##I33sHh~Z\\>qlVR)E3Ϟ=կ~5[.}})P,xReG81x_v;3xI^ {$Ʋk5&鏾?x'ݶ%H 'pX҃^o# E߿>H/3}_O橯^uxx5Z__ޞ bENmZ666t=ݿ_J%IGj4ɉn<b_.RJŰh4JFIk.arV `L&ggg3 Z89;;K=2iV غ$>ha˜ q~~d¨>5 yt0iOvwwU(t|, ~gjeeEfSz]gggzz- Yt~~f(ɓ X9E5K482Ř"3 ?'<+n"(i?S}= ;%xUdi,s)rIM?tVKi cɓ'zUJ%?ד'O\ϟ?W^-VVVTTPWR‚J|Kzri~$pϤgڥ1ᬆ~} ʸ^5&UM:yv@ u%S?$cK"_ЀCGu4]V@ x =\%۵iU*\ϧ:88;w[ g~,Kh}ޤ6ZKcAX 4KcParOSx*/xOe&`kiiIZ__COSumoowښ?...t] k?@J—BA`Emnn^{btѴ 33`-X)~$ e'qť2>^=sl'q|9g_ {Oҕ /9Cɽ @ ]F:K5"CMd2$~&酅5| r! h4ҋ/W>W.SX$5ĂǛqfLBH8m&g4zsFcagτt6Y7Mb,.oM,m:O(uhe IxsZVd8E^K zٳg/ſt~]]\\SSSwT{pZ- v)J>??WHl\R*t||)T'&PzN[p,6gȸ ^*B"K]DD|0\TFl Bps6+7Yc ~n,.|Z73Fٞdt٣:95Ibї˗Qƽ'>y-.˗:::WU}_TXTPKlV\.zK|^|^O>k^__"c$q(ҭ?3T?O }Q?- 40tSۤN ^&Y&;6`|_!=Hd7VC DنVΝ;PիWEa~~>b!FDD&̀"h{ Eƶӗ[[95``T|SZل I˒^t::::nʽplg<#"WcxyjpwR2۳؝d, <ރW!}m4`0zCQcW2n04+ӧ1g1s-ZXXʊt||Vt|rKc|;21?̟Kp7Mb,ƮIDJpҥ1|<<]5q@0%% H*6AOX㝝m=x@+++QO~={,l6[LO_MD)o$y꼟`3xe&Ւ=`03D2Zvg?0a=԰8p5,̹ȡ0YHJ$Q/E1D`PtF ? :>>NpZZJR0jUNG @u]I ojIr |^ZM_WU(TV#el‚;)zWcWƼB.<1y_Mb,~F:<>ͽR+++!&i\dž677"j6 s{=} _ sssfxCՊE---Eh4gc+Yd*7Rar)#!inzP@ZV= ;:v){1IU5}:3 Zb|^/6Qzoo/6Q9?T+++˗/h4cEl6[`f7#)!0?~ h";,^"/C@Lw`< u}qt?nfnм.}n_?[ԃg^#QcL Ng8>.6 d(QF{oVjւٙ:N+++Z__CIs vK,>U߻Io)NʘJc.̎D:.+;O&X|8cmllhvvVvvvt~~UݻwOtrrV٫C۳s9?K#&psr\2T}w>]t/{kY{su:`ϼ0cTJHQή:o4OL/`0ǂ@,3|>xV;_L܀rߍˏ*5&Qb#z~~-5Mz7Cݹs'իW9ؔk/1gȂr? {1#䙃.Mޤ6(B7dT}ct>i&УGTVh4XZ-cĨ=zH/^ЫW&jTyJ y %)67`*]J!;d2UK^dQ՚`͎7 .+m9/I*aAz^6 a(dFFxOC30%J8vN???W㵛`$5Դɳǜ A;??OlQVH*rwoFɁw=<<{b~J%=}TrYkkkz IDATI֛oymZ-={,6//~NV+"Qz~~>c^oNo>˸JJTTinϸ]wUmҥ1Vf 겈x1>O &YR.`ܹ;z=u---ݻQذRn^koo/auB&E`K ͋("SLIt~ui>Qa|YXXMTn@$iKKKS\^=}TZ[[ܜhcQA0syOY4;BΑnX?MXv5vM$R.! #H`t/}b% O8>>VX0 v5=zH_Ajl6A5kǏDȐr96ӄ"p@CJa3( 5iq }K*gFe換>%jPV^V@`ܰ͵ThHT|qL>pHcݫt=L&V7ISɠdQ)fp 0g2Ht:ƦmɛƆvvvh4||Ã`{ݫ2GHL~#g@|&bdƲ[i}n:99 nH%HAFu:;;wÇ\dVK_Wտҷ-mllG?+IcovvV_{Ν;Z\\Lԉ9lxZ;ꝠP(h6a2 jl;V 1O':Cǂ3/Hw:0|\.hWUT"% J5J`!!M.V@¼7|>ڋ|˜ EVR8["(AcyjݹsGz]v;|_KU*mnnK_VVVP u:e-..}8F6-qn~`<16mRjbuj.2Lt [,u({٬޽wyG=}vHR1 $J%VٜI \sI`0KJF {:~w3*lK=Z~?}poVYY#ͫn*27C;sH&} ~r|0},#` 1_xs3Hq~U%xo/ץRaSH #g?p8{~AF<,ݽ{W_#u`1^.1q#4ߛG2Mlnk&ti%@@.`0&VyX}_F=Tմ ;OOOkyy9̨333Q X.#=a%v#`!HJ)2`f6Ln7Hc@Mp _r;zt/KA^/nvw 岴Ds> i2-8`PCϲHa=d95/$.Op3 |JH{/y5\;;;zz޽Ǐ뗿exG[\\^zD-sE@{!kRmnmNqZt 3cg=<[\~EfS?ᡖ;hssSJ+ɨh($=\KKK .4zv:>>0V.n.&8_ejՈgYB[^^N3 Ӭ%90@2Xv VlD}_3<3ΚqmH ^r5[^/pg2Ƒqq r:%n`ܼJp8 />9*}HDI13LH㏃Y[[ 4u}_jz뭨JHBA[[[zQ|a:<|# (e0^/5^Kc&em3V ;%xUti,m;GM!Fvˏ + Z~>cmooB!FXPP.@7:s Ī6-HcFW>#%ӧ㏵n'> *r rǞLh4;AS~lƒ4 T( [@`+kk`qHw iB Ÿy O;B8ó|7s.wmX0e דKi@8>`0H)I"kz=n ox̽wjiwwWP_\z=Hl/ ʜe0Es`?<AxYo&Ieg? #B7_qS4KpP ft:Q/hkkK_Wd>@{{{:88(H&W6KUR VS ^OB! J_P|J7y"U a9|T2H#wvO+LK3sL0N읝 s~irHx )qw4A8ݧϊ3`lq9g` u7`Y8`]Jkkk!><؜w}7=ضlIRd磚Ņj:oz/Y>$ٙrf40TxΓX; 5"SټliV$R.Ic#ؙ 7Nl o8[oi}}=ԔVWWuh{{;&m0Z*du^.o !{M95 0^\;ҙSC}%7u_zrƅ#/gzk4iEz6=Qr{8s%6;I1>g X !.,,hD]l6il|fZz'WVVtqqva &2)Z,c~e="Ȱk6{}`G^3|gYخC zTKF>ip1 tiÊϳCXC rjZfiWJR<}Q|AFcm>Gm?Y3,\`]@B= =鋴.XqEnNJrG2#ˆif 9K`nw㱃:aaȣ0#-0n9ԽXd7.iELuݐ) wGq~}aa!xzzya|sREjƪj#Ǟ ~*3NbNu|vRڭ4?;ҘgÊU=+D6tB҃t||iB!Rݥ Th4l6T**JK3c/[!ytu?3K4R^gF+Bsf4n}JR٧JR`F`L۩ޤOax͏xZi0N0f.qŌ hxPO,.霹崿}|2c\4gI @9NO:bB!ڧOFō u`yXuUըڎQ`zÓ_{po0|6VmYG>||>㐱o\.sz=&T~Csrr^alPT(r2g2< .Ǧїjb02Ȫذ_Ԕ ˍђN.< EbXlmf]q @T̐38c@@:5uU }}@ fҸ 30nF';(17] 3WR)΍9իWj6 _ `8775`kqRdzjK_0`gcP\N)=??vgg'z^\9p}⟹m׻ϸM[~ҥ1i{ptOg~JmܹMeYjM^F`UhY"r9ݹs'6; Q=3-|q.4Dg\;A Mg]%,=sCxo3k`b]K 3Ό/}}ż9[)cÜs?<}a΁uࡪjjZ*T*T*1ѿv[fSlߛ9ExԔϟW*`,T`)1=2x݄6^i ;%xU Ҙ.4`0rUo5^PLurrF0x&nTښ1&jgp_ܷ4~` R%zH6%6i " (z D)~@~MH8/4)S&)}k\Wvp8LR(+ ԙgܸ_i6)<$)):Nb @x(c서8>{LfSf3E\Ő ]?a,&N`dqlj?JR3ٙ%)@Ŝ2==0xܶng& ҘB<<)Y&Xz,)AVK״t7T"-bTvYê=tlIq^t鹹9UUz;1B0w"%7` 7{p{!- 대o PDWnZ{$sER4\V2zeP[Y"oE3lng1|xƙ R[~q`"{ %h(bp8 ߿%E?zjjJBADYYY`0g16oul ;%xUtiLDVio ]`8=dYEݻw/[jOJ%enl4Hל.By$Ʋ[i}g|ݿ?aF.吕ݿ_ϟ?~.<)`h@yhS /$ B!E`2ɨ SA&h Ȁ+ MêS,4Ά d2Q2xJ2r`3)5` `:Eb^/mRA;2h4~HѤurrfG'ׂ# Ha.<g$E 7Yl.GT*qmWV 6S4I0;8hss3,ǺsVWWs\yt=5`7t||W^izzZQ(gF|en|;s{XDr?iv]v >6MYS^m͛`\]]  $( T89]q"JڋX30A@*t6}*PA/CP&z`qy׸7,aݸϴ[ՏI`ar9p^2ܗ#.b1qg'?07OpupLMMMVF^6r!c)EyCvaaAV+.s\.k4E~Y0%y%yEe%ҟ77Mb,ƮIU&HcR2tש)mllo&( S .<W7| X,#`FxXcu9A>ᘼFȹpUj1\Ɋg~ Wv[ң]c<]ZPjŦGe0z=A" ~=P=}1riIWR0|eCN/b,?55Jc퀎Qгj\fU`j(hw|p߃@^/5 (6M7` xS$Ʋ[i}disN%Ep׾*z]o׵AV% ﱯɉXbT&CFLI IDAT ?yHjyёnYv;{is8.} w0nG,a0v遝> t]z=I o'O3o4jjd| @Gf>V=͜r:<LA);<<5ҸVRZXWƻwj~~> haa!@Kd5Hp2Oð5 b޻OO) OGmv >6Kc oHIa5tz`B͐deINL ⛅Ցa,IQ;/PI{q/v :0 ݤ&7%F\.%1f 0Ҹ2W/'2HZLf\ORH5#lfsK^rMJi>{}Ϗ#[06,> /r4ޏ"6$6533>l6 d@+I%li`ڀuŘߙ{<т~u >O&1Jcפ]wJvS1$!xL=PJvl655uW<̞ ALJ$Z-.`nn.vPO )Y&cS (II ӦbLEd{##L(9P(b{7Ӈ,\Jf̥L7{* pZ-[oǏ%IzoVkkkH ȵ55M5 ;zwU,cZ%UyH\`oZ0P)}x?|Q+q~Rӛ$x/ȼ><< 0ǞBA{m|2QB#+9rnnNw 4QعF48g)oɛvbӌc|;~q>ip1 tiLH-/4D333at:*Z[[֖r\Y.߿,:::]r/~PS4|rqqiiE _ +`~Bx-7ԋ2:8pu0M 3l\YuR0Nl_;`쌋g%xK[n|`XPݍ4a1/V.1/GQ `e#?8;;b[>SSSZ\\ Ƒ2OoP̖ ZMN'@:I0<^dX0޷,&]x:>i?nIGݻMܜf ꭷRTRV ÃjӲRҒrVWW# ӡa(Usi (O+Y|^/"BpFȯQJVI˄iTlw'wo5Ug2cw_R{B^iIBZm ǃk~=T+~]ZcLΦ1@X%X }57~-Z0+#;Lx~a4vϸ&\H\a2M#z^"sn~L76sAg CMknoL&Ju\&ܜ}]e25I;ikkKZ?/_LxҮvR⢖D6WPH]"h9+RJUF#i~~^JEP8 `F?jn2Ix8Vq$!_^>$;Fl%D 9dΐ%CNuI?g]&{  ՙal+ jZjZQa;`ff&ag4vd%@..՝|ΕJ8F.z?GGG #|&Il%jgg'$A t9V. v6ݶVX 4nIƮ#` -@GRœ͵g[(R[n.Yiڷp <6*q-nzq.y" h4Rwٍ1#=x L~ _"V٤/..Fo׋=*?~«Ã W%KZ4(ҏ|_ 0rϬ@RHZV8@l)χǍ:$ d7R&bXF2J9O333V(RzGpLHwj6>F;99QT ihȜ,$K---}"9sng&]wJ6Ҙ7X CRTokyyY+++ S,X(ڄ ݻw577`0ffftؔnSMEc>= 9V\z!V{_RϤ?Oмy?\pS<Ƚ#42qkc_2ƇL1)m Wq-ZlL0sXTu== %8P\g6 yd2Y EK ~#O{:s^3G}wNƃ~MjnkҮ;%xU)pxF#ÐjZjxK%^/驚ͦժ677533#jmm-vצxq)=Şk`sa~\)`΂HB3K@gEBT̹m0Dr sMMMEv؅B! w:8_T6u 4XXTRQ^p8T%? Bo%<D D想sU|pb,//qZzu|>?gLOOGOO Ӑ1~ CJx:ժuxxxV;T.c=$Я{noM,UHc/}4ž[v;2D|6r9Am& 0RҸ*. Aoy6~)߯KxҸ,o~387V VuyPl66K@@eȴw G 9s VNj{`\rP˵Faڦ\eup1t3u!kzjU iq岦Tף9sS;ٵke0gi镅 w%mmnkҮ;%xU)`(Ia$x"2x0U2rZ\\ 'cF]lKi`$0>q&`A:4n ,g h +\s#HfiZJ:['J6cc 2)&2{x V`vD c@I+kcc#jT*jv^6滤 e٨s577JL%Lҳ3>J 37Mb,~n$7NGL&UU-//ߎ`KRÇp܌@;;;(8??Fb` xR?E3T8/ig!j/ ~_sQduR2ˀ4Q1*Msń=: Af/s32YVhcθ>q? wcRhx~P3Ǘ} g2p="#<`%E24%iuu51s^T=>U.CuvjY"c0(px?&]t>^w?;IMƤUښT*$]>b5ʖnR\@8S1aOWmS,:h亼VgAl9wƂB&:??j-8{̒3GxK_nFҜ6C|?$xJ"IeAdJLw9l1),U:ţI[i5~HcRr?/(,--L\.k}}]|^nWGGG  D'KKK+_.V"<tP)&)<7?433\.AY YL+i5O!ս7~^/~w04r=-^IRs1Yr!kGtМ`wg Ys{k~R i#}Cٻ<a>WϢ* f!e6 E%Fvj qL2 vV{{{1^x&&Kc1l!7Mb,n羱PR&^z@g8,x=/e~~^{{{^ lr9ymmm L7UʘEُJRҼd*EC!0x6mnn.e$j\߯m8?I=Dr2w :Φ ޘӹLn/8Hw @@r30s}̸Nϻ#7 i6q_C>% ]E9??n} @uV@{{{OǢ98(bnCbsv+BnLQXL333WzzjssSlVf3;??-mmmutt]?ERYi`q =om,i,D90V*Un4(zHY7y@NMM aiHo'%xa凇1;{+Ct W.]taϰlz&K>xF4 F9G?.&jJ37rlsXqnF޳HϜc^{ c!f }f=6s* d,M`0PZpxh4^5:==^z:N ͟;|{n|gaIoRXv5vMuj.B}=U*a gd{{;< ~!(95v"@~?;;>Dՙ": `Et@咴`% ]7,Lpk#HE08gV+N~ <^|F~8?ӁP:PyY*ce|WN֕mCJrZqc;RoܻseNoFn2|y(2FFX2emm-XffCɉ;`,jzz:vvjaMjnnlV+++zUNNN zY<Իn >pxaKbu:6HKKK m6  M~*ZNbvCrYZZ )A!aPŸv&Ygr0xAIj60Qi4iHQLu(h|>aŁB&̵vEj~~>%k^`$%L\}LJcP455H'{9Oߑ9txx^% ǃb#TdPfU*Bjnv,\@) IDATF%]}VVVR\.G}"ŋqJEeYu:NqϺM,U&Hc8m RU.! h၆c4E&n %X#J'6XuxxM^24.w7D\E)Iר! x3ER.k+ Ȯ`N |v` |ܷAplrqqn 1 ̂_/㍼B
?/mcg!nmbuj.IL"DJ%V*=} 8;rzz@@CSRH~_nWggg%K[ ~&|'^R4'7gHhT&qÃ# 016CR@1gӌ>|>Y0uu:mooDZ+\i\~8+ԈܳllpxxAP(L$]2M:es}rr4o9xxo .z %`)1Xd!!7^?o6Q0P+++wZAN'LܓoyCU*!J 6(a }X8&l^.eqxanHg0;ɏF(Gʺ:rO:7nnn.0"bP2t:P]Vu9n0\.kaa!FC>Ce..//_E<<x oÕ၍.c,,>ӋAqVG Zd7Q]- ȁL򉛀 rCZs"qyj5.sp)S< WqmxFrYvtFޡ2\{^h#aP.tõw>`8xsI{|mr}ȀK[|///c 4L,9Kd|\.-x"aJ7ss>BWm,c,[m}_X)~gWI׻7e38ίtrrۿ[UU5 }'r~4aw4}`nڃGxEJo.|Beqd4[CsFR10P|wڳBt#";eh'Oı'vD/g }5]?f{4.)dN^Ty73H 6lôܙ70p;ѻ>zRIJ%dͨ>bcY>\s`0V1V*}FSonntqqh4RfD ⌣؀P}9:8XF_~[G_~˟I?@+OPo4 17%Z"OOOmtF. w.fj]^7ƃ<P*v u(ӫ9߭DCX$! h4`\u0r :Y3wY?}0Z^$-q R"m w^'U{^ )̌?k ᒨ/9qc6s cTlD$8dnooo#mkkk4n8'<>>VT~ŘNjZqo}UO^rS-Kp]2ƲƞOPKo۱ z2R.yjښvww#3Apz*Z...ttD5ivӊ&)Xؚt^ ^;ү L@ə*Jq!=/VIAɁ@Z5r)b1Py1tgxH2_<(=Mڽ&.+!#:3agG#ֳ?`KU0+CǴorpubn94bB~Wlƞ 8ABd25fN`aq'@gxv^@3l^$Wk-)[\jcc٪IcO[/ߌ_YoWeiBl<(FSN*7 5 $zK;;;!cM- T*:88|2{oٳgVkgggOgH8t op{EL`ltɓ'*Jfy7l \\\< V 3(aa?I¸{.//uvvX|B:==f0WiF zssR \VSVΎٻj̱\t:DÑx}|4*.Q@4'"吋ʧj6v".DŢ={]U*(Q@CbZ_|z rTVh#w~~?XgnGrȦ׋dm<:&/ycu|ߟHO~ޯ/W?Я/~an}CԌK>R)j_uhb9at||Xz+.\\TZAd2L"Rl<]#J+-d8߭{vó6wy, 8¨JgN_'Ij4g裏GT>?Lz9́N:@֋˅̉`H wA0^]?X@~?yrYϞ=ᡞ{qE/ɼewAMoOLfSN'~Wףyb+i{ss>Y{Ɨee{|]gokH .4pCR8AN U ___h4 S|>WۍIQ96٥wD.A#gVl6a D^$ g:3v H.=.yqBz/_:goF՛`*n]`wLPyP:gs1RGJJye2DˍRr xA,4@Zш .ׯd9t[ʵLaNK޹H](QTyn&sW f(NJi0DX'''zE(Qk~q^YW_^`2ƲUB?~z]Ӌoo=?oX_k :|>,V7x#(ˠ֢OsE}*J*<0lR/ͪ^kwwWN'̲tF^ +8櫫+U*|yCz^'q0 )^- h@:} u]koo/D!Hk/#LhGEFbҠ2LTb1*Z-5M% izH ?Fb8~oxf8^vf`ɓ'Jn C$\.RH ;c fگ'h40Eξ eKw6N 9>RT׳gTXr\@2gϞűs=Emc5&'_ޓt&'~%:CL&RYD( r95u w@ie;;A5$$%贔A6̓9pd$Ɵ!*LxUcB@֍(s/lԋ0a]ގ޿o_ ^΀mnnR$Lќ3z@wSg=-%L&>(>7p{M$7ܸudBZ\\QϪcM nMӘ~$ ϓ`k$)jccjf(wW^ec)eڙLFr9XL&gss3ZihےA/^y.0.)`D&.mllh4EU[OwkK&ץ ɅvHZ.3),Ӳ\M& E%֥@ .5^k)̏gN)G- @;E&a`qȟ06dyvgxy>]>r/^08N?/`2i׋(pҧ74L\.F{ {RFx`ۊb併 %pQX =qpëkfZV˗/#HbxYoR)!!jp 99pl6#%rnv;{  MnZR`0YOr", iORTNjnv0ƺUKhp^FL&I!``qndĽ+N:::ɉad=kh`*IN'>II8}z9Xw_ZT|= 9g]3wtb}S>@+דc=RV5q,Xິ@SUƤE@#RDCU%EUh@z.Ay8RM9}둘@Fd~N(~V#5 $ `T|SG𼺺VH:>>Yr0㵖`tqlFw)2n`MWvߐg 39ߏDlYHٻ&ԟJ|GR<;:߽\ Zڥ"l"- sfYl:={ Fr%E$20YWXQ{ޘ-=}4R1WjIR`ŃD'sdssSz]v:??6C@vq~x'-dx` @EX  AY1k64BI &Ӑ {dYmllE֞`|8x@0h#Q l8&0 S0IHhPf3WjkooOB!Qɽ]ȴ `Ajø sfc-Lwq< gFQ0 -.sy!>0֗t Zձ,jiC"#ذ#]" L̂{l(y+Ըi|Nc}}='$d&loo{h΁4~ 8&IqEd^qp|2h^r3Oq8e97R{0@wd,=`"%+{Iz%zƩ1wYKRf}E:l6K-/kŒ}} %9 ]t_VnB, u~y2zY:1=Jcd,#%Xz@w:0ff1Tb ?M< BE n8tj7B|7t^ 71UZ@.)8#VTIh6aF MsJ{>8`QJRmk+s(:ԙ/ yzkPXGAY_H| ?/ Y[; 1r.iǗ^R{\s>i*- YyA^ry3 b朱\,Vݎ'V{C>6R&eYXXUHczuW^Z 8Չyhf=JRm`T666B>"h<~}|>Zƻ&z@%EFMH z?uZz~<Gq R)0d^OZ5`zA /^ji8T*L=7rkkkܑȚ"8nj(@vuż{3\7r-FS* M')t~+D&3Ys\x,"d2QL0ɴȶ]}- {q1,` Y\~?r9@ВV.UVcA0ZL&hy1D_3l<\_q,}bぎN 7VAs.~^X*|^n7!gxzISM$Hq<^}hZoڰ˜Q6s8q t v|^~?"_ӽ0K{F{jWƼFUwz= ff~SHI$47S \̙|Ȼ#A 33Yvq@l6]E (}R|gU*(qMQX|Mxfg6xyfxh`, \cIE_<ַgV9q dߙpXofBJr>w N-'|=tG~d=P;@h_\.#w6˖tXXn IDAT5|8&}!O"ӄb}V* I>OdvK  GHȢ},ZG\^^&*_{{HΒ5MO?Y$4P]{`Vhb1RH( tI(ALFq\NrYB!e}}= \ uqq #{Zl6SPxlx0_@4 9^v>w E)qo2 MuW1.;fj4ڹ ^=}鶷>f Xb##i`{\,{WAvgvU.Wݱyˉv佫`0Ht'PQn np5޵<ˊ]8c @"5qlYPܸ\LZ6p\+ţ̞׍q 6πKӥd?Lt M(.^0:a:K\?k˳|]ygll?g?a@l@Pt b·bsgfYQX=^`_\).˵z^{]suun`jU pǥ*QqZp̰m'''Ῡj@쀋D I&鴷  ͥb`$-˪f(NOOQX  ]c3%m,y2HiCɌDBb-HLe`p1@;@lG6:N^'I![r9 OSأ# Ch>Bv;:k E==xRۍ]w+5Z{R%%vn"!hPQZdjy}r=TҒ|΀gsة|!Ey`qRNGf3v!pk.qsj4j4ىy!!q9kp\k} Tr4loo &7ȥ>؆h@`Mc+$Ϡ#P=LAg9}e@#36y/tgnj ͛"AÏXd2yHӵ}8([űlU|BH 4>$f 5Mh Y)PXn7>` .Cc5 F6h4ٙf|-<(z]{{{6cq3S/@%6$IP@g!8oooɓ' TN09R l8g!=>Ś ֳ`$%}k0>k#al"ƽR}% \Bb|?0l@(yssVhL[[[Qk 3e>U~.ZZ 8Az뭷3su:ǵzuzzW2&={-5 {9t:`0*j[L !HwI>~RbQbQ\.̹z/;0N{W[2:|kqd3*J"@vH:wy'@'|ŢjZ`5Ξ1q"\.Nv"777Vq)tI`jH~_VKgggϕUVvpS,c ;#%RoK" JLff.@~Vdd5JNZ 9Y鮸 CswwW :??WP^O01V+?@ kXⱌHc<$0<dvgIab(1J:O"*Z<޻rax8ȊBhyB-̙昝7@ ?v|+? |>>,vTt0}(7׊:?oa*ѠĀgI}`aMg WMjU8XNsIJd1>_W bw3 %Hi~px<4{<[W___J:w8#)e0@ă`,TpfB-<8ߞmELf3 \rX=9Jsng8%,=amȲer_~x6x?`Cv]{6窍eexZ"kccCR)d u]JHND&$MXVOkdhu:0xyu=urr KAr78G"?.^?\N'x<ϙrtpZAr0Si :@ !=>lsW^-dUU =2`*B~uu`^^d2d- |/{O"1߻{sz`휟Df3@\VSx<MYQ{ytuzz!h42^Ozs<x,#%*Ҙ@\\\7VEQoHCPA>ߎ)o!I]8PivMt:l~ j|ý~;CLHBxaQ⁊%L v.M:x#(3`'^ D"8C3-A05d2r2󉑸X,1 JI;<0ypvZ|whtฺnB*"ZrP 1 ݄yd2r\KB ӭ4VƁgN<;rv DX(C:88H4uYɺR)L @{lU2Ʋ"OBz~3wP^z@nU\7(^/Ap8j^4m-`T*jeDF Vxkh@aǍ x^\\ȡNٕJ%១  > |A2/Kt4TVmh4R 8WO{&sGj4l,`.Ӏ:6)ga6Lۈh`stzN^{`T 2o7 _%n<pb==Va&).@C c\Ea6`'I>}ZMb1[n< N[-x1uBOs}'|_/o:KOЏĿF~2w1 k܌JPٰU`2l2<T8CUk}󉟋nI9Z!{6ɞk o˅~~|^9񵌜G2"mշ^Jǿ^kB)ƪHckkkַP"KX,ɕ/l~xp 0VO&p @C<)<8[ɥp7$+iHi Dv# @S,{x. "6K6x>bpm~-\Kkɓ'5Mm$ml6~ SD|y6#P)-dBYcYÀm/ @v?t+-V>38~^i.r ku6igg'z9K_8֫21} vcizyVK/Ϟ=)v dC,Bݎ]ZF vwwS:2uvxz[6 w.% N3<=nZ^r 2rsqȚEpGo3a2\.ٕ+ R=-˩\.'$~޷@k8j:1Z8BFϙφ`zWR3v:8(3 766Ok^VH|2K]r9?J!hfg63 ."YGx8G$q~e:0zXתVQ;{T*}}}ٛV+5ـ:9Ox5vXFK -J{4%X߽QxwUTHdsa+9L7t:ޞzd}F0jۋY+da({yR8~@%K)@wwvv{~~M9)?PVUV r,h dW"} `"[a.Y3\s2{^Ƞz={ ./ı.}I^W7dHnw< 7{^H;;;Q XRzFr`{` x=b9^K؏ҿ}W_%BH 4~׫)ͪGBZBF!+0D".O|Tss:fי g|$[.ݫ{{:AS9âFQ~`0 l 옔d|Fp"x-Y Gzl6SM2\.K|6X8,n]fC.zGF b@hss3X#vuh4@'2[S9p80Ҟ%4U|= 1-%K*Hl6L'IgIyIJ0[xnކ TT¿Tudi!I V6|'N@*)*ID IDAT=)=-J*!ydWWW"`X@?Ax$% X ̳Xq YKdʸ礻~?!rbڮ|K}j^MrIЇ3G:1=i5=oT*22}uvv&IÍ@C˃ `;^hB]7Y#(.<.<=!K 6]1b g8EO(ikkkK;;;!vLҞ SH w> #r9zK; q}}nA MD=:: ; 8Rc20٬v|/E=^]]PrH\\ :xn2]шN]bspgL9j^l($- \N˿TZD~T*R>˗/fuxxZ=ŦgޘC֞!%>VK \%iA]3Lvkh2h{{[ϟ?7Ӎa{0L}@5Zz ~1~7 ҌN^YǥO' 9¥l6Rnd\.ƍў*18&oeCgxg< )2M>o^cqxEOX6>}fI|7EBx30g ׌,y; ,4 _'OǴ/ݕ;H|I>/~ RINRdK}ӉiQ.W3761=Jcd}Ba@4&|LHnuA&ϝWTݗY&j/ ix'|~5qL&j }<GK&(ZKɖ9z)UR48M/[={J"iE5M|R'''aL=[rssMV@4_L&Qk@3Oto2ШEwȁ~|>5ti@Qa{cc#摩r9>TNG~?.RZF XAcfgNR~b1p8LƜfY4N:99 ogg' B!|> 5o 例n^SiźPt:Q^nzfW0[o<ݟP pЛ2C~?+?^ܣ D_W׋f.Y:8XZ *Ic y vkkk!dwA)g*`K6n4ӧ  6"mIAZH5tX|W']wPRPz Q>ZF" .IIa>G<=7ӽ 0Mȅ@!k#m vCӦcUT}/*lHpdLM׊um8|-]__'29<^{'{3FIZa瘜BL&d2!j8~7o 2`z5 >1]@SU|0"H #mu:e2`IH\_%__:88u#+-l6q %q }jZz'w/p^ `{c/$)C'gnupFn7~g|>X&عk̦}ZoQpL=#]e x11޽:^Jw>OO2w1]V x ̤#vJjZx>ZVP,]Npti&fTpMt!wpwűv]11P1˖,t!r[L̑U' vσgqۋZb~G'7 {r mMҾ.#d2n0vxz^—7Z-r6%jHȁ@( 9_֮"FH LH"ʺ|Ck# k@p~%}}=osuuuvl)ɵdeeYcdIqlbQkkk! 9kᒕO?V#vx'qߐ`| w1X`mmm%Zf{moo'2}~ސjcc٣48]3 k?|-H0 C+˩R$ . J%X`m)|~Sٌ阂} /Jfy;|=TZHfO)F m&ѶFx\c` T*E 2Xj5^/|~W׉-c {v\2 ):3OȨ|>*Jx~ޜ50jE4Cs|9㌍L`afk 01.WFz&#ëF4`0_|Yz]1OT.J!5b-c E g |~Wɚρ3fq|ciC$y pVS>櫀F xHfgm#BK._fg@?@̓gIldBF ]yXT\V\ةLdO%EK2+` ,sYTJ5E ]b.8G&7Hr]K v 2`^9/ sb2g-ԭbFi=Ïcw0HnwO1φ rG%f⹇=9yZFUkY r(9q]9Nz,@hcW!ytW==tJJ~00&sPH~i4cZ(n8ƿCп %&-Xߑ<`|AR i9CR_a98X佽BtEd2ߏDrqI , ;xo'i;zx0{]+ y/R a?sTfh4T" 6eOM.q>rX 8ăU׫$˽RVvuqqu {ykkKj5^^<7gA HUŤe_4B<|>H{蟝E//Ep0YdN'R FB|HTcFB:N:OsFt`")7D쀤񴶶j'13W̽W 82FQ8)1|4(2A^R0DN' =ȼ׈nHnZv5͖p]#x7ʽ7ʳl"BҜE{@V+MN;֯gW͋rqZMz]ϟ?n(G޳gOOBzf 6U(@5t34\.'ڲN~cBo4$y7)KzH}:/,-(Ry{P&HR{&\xT//$igg'׈L]}gfFv0(͠8wϙ^Y^/yX4*(#~ s!·J^4$sqxXI;3jtttO?4H, fɂI8^*;s9kGڇ@hcco4kIgxx"=KCAȁSz>t:wZc0j;L&p.!y8Ŀ{H / - |ɬ1w #=/Br/Q75p?kkBt p>tu_|`<M7*ggG_*nPf}u}pla~89xK3XX(=)ƪHc2">PkkkaގT[@j%*'Q}0tnnR~Ҟ/ r`(LtW} ?ydǥ<; h2upp\.JPf||'Lj힦7Px¹VԯTPuN^9i{j0ה_uY6JJA_O^o =3g!A0R*e2Lwqry e XX(kpdM 7rhnnnt~~2ZVdU1ukkKO>̢h6Փ'O4j]*,6>LTbw|qqUs}7Kq BMlVT XhgN(䈤g.[0_FQs`F4nZN^O'''qLJEJEr9QTqggGj5*pHndQNd2QV X,F{$RYI]2ݮݮ>x Y\#@DZ Fm+{rδP~5c7D߀n&|]KJ|>0mئ3no&...tppFϟDqO^P>ah&"$Ug }}m<^ k|~'{޻JҘ'dK0[$E6 l6?Qx+Ұ++v_,cTD`*~~;Tkx03\Z Iw&X6τeNX׬MDWadD% Yod-sssYD PLnBL6ٶJsF{ ̼s;po k}ss~9ɯ{8N9wP&v!k pbZ' sD0$c)S5>5>B(?dl kNR԰rs`m2ƲGiq||>Oc $;9P^/T'^.m|}}=vzݮͦ$ɓL3f VHJN6V^cC_xIF @aJ~`G:AIb1QXF IDATXV t%hKU^Ȑ8/..)L&WVohSkx #N v:::cۋ=#Z&2"\C@( @RZFF2][ZF Y`rRT fʁ!٘ iqzЭ* 0cz 2X-"` /M8s,-znƪHc|"r9#9`L&  uss3$bNL&f3zⷷj6!YJ$*ԋ!0u"/c:$R woy{q0XCRސf,-;8g44QDg~vM<wWוCf]~ARyABVt6W~Yw0mb_#X+?T̫_[gJ2x. {y ΑFz}j5Mj۬o>iY"-c,{{ SUƠ=8AE0 Q@T*CF(%nR%? T*{NX6.L3Αl" F`.Xy 0 LrA^-ϗӁg(p|=:B]Bx}+i|C!뵳 ͍vȢ\_ #QCQ@/"1Dݛ&f/zX^Y] P8p3.m9cxڽ3=^8BO+80/N2y[lпm,-z_avPTZM777vf:88PXu"2 (&i  v`Ce:D&!ÐFq`0y ;iOv0A@DƂUC 8 ƊϽJxs6:3;rkZdr|2j F{JKwld磘! F0kF64,_%|p77/#nllvy!0UDz7x<$矇 }r~7}}f#|8g<2B_x}cU1)ZP^2}677#; 瑭I=NSZ-mllO ũt `<  O^!Ywʀ87E>XH&ɋ ?7a.),߅?P#&nFf6t"[Dր7?`w"N*0Y4 rf" P|pd9^*2noo##v4_׋ {kHq6~q:^űQ{ c)UxL<i9rYF#<|6))s@` wNӻH/$gS8O &ׂ@R Ax`%h"{9r*Ҥnq'''!5Қϟ=7kkkQ:z0p9aLvݐQi_ <2#<# &?zTƖ0{`;V,C OgntH|pPө~Huy\ }OXX(=ǡ]J +~5yw$<؈:CN͓ HmHO '!MA̱p'x#<{}}=֐x"xnM7|S  (hooO*J zƟn0T6`; {\VE}tm|i777UVh4b05š;8[2# r9 \vD`ڐǜ  Bm5Mm}Ѭn9R:ٳg.Zz왞>}c(aP缼,o&\jƀ7 Vy<2B_x}cpL"|I0)#EC@H2d0F91O60ԑ\fHKT^5(>*E0].e8v" zp.K!(LD.7~`B|x[`Ţvvv42B^VT*w0/^ ]Y]zieJCk|(Q۸BAvZ[y|H#E4b>fjljk}!gJI}>@hU2Ʋ>/r3k-S׻2R$dљfiS///! ZC\NޓU!Xglmm%LMFTt"p9+i@ Dp8iOu Py"2;t"{rOI'RDn(tHѽd s=m,\ F8gv\#%1R=f?{g#[vUg]qڪS H(G@2 !a@I/djN]DFF}|3GJrF8T<;^{Şc1 aâ90&{:/10sN:\zϚq_Vja1O"Aq<Czp,w&1l椱o/';OHc}~^P~<늼v{ !E3Uϔz5=x <9tz]ҍLp9u:h4"lnn*ϫT*üe wMX]]z$$Pǣ--ΔB8G#]^^j44|677\Q|d&$˘[2ر# !my6H ܌<LLF>TPDzp8,9L*峹ǀa_R3[gI hOچ)E2+TSwF() /--M`U.UVBanFݿ\;{MѰyxzz^3 "U,|se3J7}^Sa0Slܓ3{̪Ghcg!}O+"ؓ? '\ыo܀4R$CϥR[[[dYŎ 1wz`ntT :BT^U}Ύݏ~L 'X@>ͼ$< r$kzxo ^%򈯋Yp/G iFv0 p`\=E:L,cVlV[[[.`DsEM~|LqAcS_''~^vFoϻ^<&^{HL&,(D@XFna)A\qQQJ>Ze&]ƽⵞfp`.ɜel93|a^t::88PiY5TJj5~qqQBAގ{w,E:XO>lج=1l֤1I__ݯjk_WE~k软_gݏ`>\dj(#8^xH< Z+++ёvd[X" Vjt lF6p8T>jӒmoo\.2ϟ8)jg `&k`(ߏwEi:k,i>Kzs86:%xۘEg|wVBRH40^εbZ7Ҏl`8"&iZ^]]U>(i D  lAsD7fzK'@`6\2nsgguqw v||d)dIpuuĮq<$0hbIHxnw9FI!Fx#X YKrdiy`p&ys\rVFc6~>ّQ;gW{ITX7L\1S.1la ams:ccٌT1,eI7Ox4ACxV11&)vդɬ0Qx^+j!z}<~mmsֳ1͜4>1G&LIۖjO&HRJ1Gi~K9R4\P@qvvRM6 E3 d zp`nzRǣHp "ޠFylnnCQNj  eY+ϫjjKF%$OB=?? /4 ЀG6 D :h*܍F#Aj5Z-hL p9gT*E<ĠŅxH8HRjje0>"k_"|EYEC:xuJ1KҘ{P\[Z1#+4]ưSxz$̷wXLf(lboUT4 qnn. ku\X߷J,:[̘%O1^C7vI///(W>cUUmllV6HzL{Hh4T*T,#x1<"Vaʥ6RE "Y] [^^V> \z=%=9.;XBBrO`i4E^7Qҍ, @"g2U`˘I jxCՊuWF~ׂ0E]#29cE#9 {ϣQ?]j*q)wjyy9yftST07TczǴéBwm̚4YFɿniwvݽ.WN`jb{> :JEh'Hw1*!! > ^+Ek~s l}q1T:ruu,l3s|O'OaG\jt㴤NIY0I*cMx&#照'JEJ8PI,t: xpṒkن"ǃU.uuuL=m\#k@?P:88HU*rZ]] ItaaA*"8מ_w̽vI9؟1i/4Ʋ{i쎌igI 2\'dt-B)'4mtXd|>mع@//[VP/`\ q/zy1)ݳjC IDATMK$\E sssq $ḁ$[Gz: u|(! yaF>)%xQTRWdq--..F;IђȔ^AI2(l$DJ záQω rvnnNj5JyzF.|}vH|q`?ccٽ4v?nWXyS oI"0MFzuGh(F}'O\.ZCPCh񪜝E>k @vuxx#ִbi '14^>:f};;src<nj8´ FPOg5,)^l%RD exU=⦢7#%RZ-d܏>(@Ç(E*njYu:}zqONNl60}D.ѳ**u?~824_xmQav||\.R4/D?PO>jZ8 Iyb8c q}SYܓFe3+?ODmjj<=H- e@`'˹8O+ IlaI~_z="きinn.*Q|0%UV%Tݍ #ITanȆ)(y! cݬy: `x`#5~WH}̇וၹfP$5 (3=L@!kdgg's?6L::M<==UT50\*q:"# pեׯ_^@z=<Crk֊^$&qy="ie1@h)YƤ4y+)vnijNkt¿1)d1K58'g(ć@"@Bq 憀9`F@Iis>99EZRB]BHxHtI @L$jx5y62 L BH&X˥֜{NH8l6v!v 2@%spP.UT*txxzY~m1_ rCF{vvvbC}L1l6j` oE?a?ϓkKE61W;-sB7n#_ge yQH ,S"Cќ^ZZё# hrIRzAPxɍ J0b}emFtqd_0tmuxRQR* J˳T*EG 6,`мa?77n&YN֛Fr\!`Tr`rYJEχ1X>9YX,aB4_]Mlf KgXye0Rth/*IdJ\]]EcJ%J%` Bu?!PTݎI{A:JE-)$l >T?яLgKVNxie4Q8:??\b,FNۍ"NX,4hZ ?Z,tZR)h4a0T=Ɔ~[??Ro"uA=FFуll^LwmmM[[[*IzuKRx&d%ErƉk$c^塔4;sY;IӬg bs0$r4ϥuR```r\~:M[~1^$ 2HIHJ ~`Jr9̟"b%M~~~^^O{{{ǪjMjo'''8>Y<0EÛiJMlgV^K#ixboñ{P :@gKRX~?y/̌ˋ`00%c T6^&E EZW8 è~vvj5E:5 [4yų3 Xsaȡ'''NcPWɋ:+2dfqLc,5N 6fII. ̢^u1>dv܃ ؓL&DX IHR鲻ēcI74;YS8`fOji!FVJ%d#DjJ k0(#sׂsr/L\SCCW$)-.!űhI&K`27 xpawOt-W|Se y`5h}a< ch4nKR|n d+X̕KO6Ёx<svvW^Quƽ@6sѬieYc~HAv0L%34<'꧂Q +Dj#cx<oru/..kk_xH*R۝lNC$p.d@x. aЋ/ }ѳ쭷D'vπe$ ^1Ź żq0A38+:q-E@A5 wFcZ5sl/^#<)D? i}n~#l .fՊ^V1c1OVKv܌v\/3vsZƐFdYƑu#=zHz]FC{{{d2*ڊknsYݳo `9g<%i&9uY}VY ;2:%xۘ%i xty==;e HVN'5#%-J_ $?Xv/ݏ Nqw}d^5K.//j"|mm-^.U.zdT{2ógB^#/4t:=_T5 mookaaAv[GGG$M3A&T. QZ\]Z4In#%* mI\{yyCn"ہS",P.TvV @b `& 5=Z:N \R4!ud8 {nqnt:J :S2 B"\]] ^x1Q B^%C `mm~wvss32(RDQg$ݿPPmxL#%8KҘtCP\utt4QA@@EW0i  MXT d2SJRT*10 dI-%7r$~ OV;2:py&NrB˝J9>Z_/鲝T*`̽Ui2KKKQc $YiiiIt:d;ߌjlyrT*KO=;;^edQVuuYnWnWWWWQ8:S6@֓?rguLc,ȸmc1ѽ!^ƟU@ 6^;zmooG#󅅅 Ft",z\V#+lF\d.g^Oj5R9 q!0z $;Hc^T7|S+++aeGeRZ^=TgOzhIQgM2u0[Ÿ.K 077 l<# kc{u4G%ƏC+@\xm#[Ӷ}::?E  <Q@M.Qzx9쓤׻g4M(xss3أHJERIr9~ttϖ:Y7AWM4QP1ޏ@3H Ί4F#FiKm29z2Fabu_zCJ np ɾ[,)f`t\.Ope.Fptz\@~$%. y?`pkz080Ub=0#D^ћ!?g*Dlׁt+)8w::zYb\ҍq3zh\/]S6c<z뭷"S"C6' =s9`M *Xv/ݑq),Ic09>K D&}ee%L{{{яP(Ljod2>'d~u< n_d~5U(u"DZq?.He$M Fe\g2=٥I_#@M̫3nYmX='r#? ){p8Ʉ u?-?ٰMdyv|kL'cs?9>)) Fn>}\.L&p8#W~] s)!b-IJ21Kc |8EyV_'C@gn.Ick(0~RjBe=<~`w\.0RhZMfSgggj6YN„,Erc(A0$:pSxungw{=+sA^-{ܳDIHx* != ;fjG΅k`wd9*.%~|.͂!  2J)`>r ֆǏ_ժ^zzv>(XǏtzpp2]rýU )̟iw!}?O=܀Ps\L{gE|@%)8,siZF*8I:V\]+^gs"m$YZa&ՒOOO#]jBe2`:h8@q˙a S8p A}g|4)Ksf38?&3͙g aVx\3khse9YrClj°ޙ-?G>{~O`0`t:`|00/(?e}_VX ?l6T@i sw4}-&%۾TҸKxﴌ{is|,Ic}wP@o, T*aTrAT恋az4i}}=)fn2\2` puuL&]C:!O. F;T;xr|3_ @&@Lyq#i0"X"t=%Iu8dup=󟪉L˅87;xA8 d!·g~q$( `q7Q rZ^^Vݎfy[ohٔ hZ\\AL:Ǚ$|VR,ie҄ᙀŃQr=S{PɉzdUU={,A?Jw!k.{_\\ԋ/aZFE`rBm@gABAV ̄9>' Y s"ɍ9{lX!F( nݤf#ë!}^5y!49w^` IxLY'wvvXC3x|Wa:FϟիWjZz䉞>}^բ#ĩv#+:Y<Jf?od;̹n1~M-F,Ic.1{MKPY4ƲYN-mc1|F$e/7 9=ͣ IDAT^fO:Ee^ vxwtmwv;v IJ\.Ο8Z#J%e2eY)Mx6}Hoq$\"ڽ--<[<ށA`|]]]M{FtjpXWnMzC\rOYLܼz;sss zN餷+7kJo% 0 !{y =|0jjQ9d[sNOO` /ѣGZ[[S &eOX+^/T\5XO `fYXv/ݏ@* ASt05!E]- ̓xW^iccCu:<^xK:DW*Çc7Nn6 _%_bݗ/_Fzb4:::=L@Rh%$|8n~~^|>@>61(.tK@`;== bx`HV ss/t"qhKKKȸ}!H{X~ hqwDo B& zT׃u{!F2JR/^z\SPlWWWZ[[:[FCtZ[[[իWvT*r))߀kMk6{mؙq?>1@h)YY硖d(I?$p{ZŅjZd2T*VݧSdE3T!#T("}aa!&9K;^!X,FML?{*7yONγtè=q{A_a30lltu<9^5f{V_KRw8<.tyXOBrGv7~ys]^/QjJq+6{{{j4!QUlr9ye=}TѾT|^rYf|= `a];RmLme 4ioS :%xۘ%i <̩* N*w U?cmmm45)FݍpPh4 Kxv{@{{{QպZjaa!x]L-42!񜜜t:t:j*Z[[SX/ِAl"# / L nB!XJB2\.L,5`eFQ V*`:22JRM:,Аb}qq犿O}]δ0 Q ʊrM>ˋ#v:Xd1ܭv43ttt}=77H@"~nn.gϞ)3Žg10S g'b<Gy >ǃryS :%xۘ%iSLo &ҧZb<UTMD%ޭ-]^^Fl6Ǐk{{[~NOOupp G&+g @RH0 7C i-MA x&h؛fMR]^tى yN` 'd 醩qC4@3p\Mr}p|Pȉ^٘` 6_wy8W`ۜer9l-+Xx}x=x}sKа.s#7_ʼ6jn'>2Ϟ=xVvA4Ʋ{i쎌N 6fIh2oήpd=q0g'^DO*6of6 #r&r g...F@|4ҍgggqBab`8F]R9tY XXH6 Ŀ>ɨnGwyl<3m5 _{X<1gݏ 9Ul=)oqq1j k@^~7|3H>'|cu=}T *!{{٬677vtd1 g͹EsqqկWVV"mχC@qfo L\ v0|>9;܏d05d@m25REB0a Qb>U.C t&>" p\|qqS}|eeE*q}ۂ6LNi0V$hV!ӵZ-^l% P !`~~>s\|uppFNmI׬˗/FTz]QK>ɚM=y:8bPtBwm̒4FTkx0LE0Pds$@zJZYYHy#+ٳgj:??nuiiIZ- ֥RBv!h{ 4t)n(Nc4#(yA>M^ PlrS/ طeayf+̄3$I< %Czhʼs`l/8Fr~92t:2`X^G!~ D*غ1y],/ؘL\`MZ]] VTV!gR ~}}]oF0QQnbuu5uӉ˩&Y/>;3r-kkH5dPI8Yol$R\Wߏŧd< Fb|)\ Y$7pG Zr2A%]F҇)nu/NPt>~Ҡf\.aHgȹl\ r5>)H/;2JjZT^^^փ3mnnAݙ !/OpuHsȐ @Xܸ 1>}z|n@(0 Y~NN4w1m<xHT75&xVtToJR>::á$]?p?c/2a~ ~RfVF]R7͉䒍7tİlz&eJykn9,󶴴r 眔ɒsA 6qȥ 4~' 9 xwNM590xpMxH%GsP!:H֣9st, T*цyFC_V 0)> Ȅ!$z Z#k/ |Iw+}{v/}%i ww*\~gBxuxBxánz=yD :f/--iggG_u|*3BR0nuuNOOL&0#_\\ًyy>ϊ»e3O~BN`s0.Ԝb X&g`0 ^~ 8odgHyB<3k۸ץC<=?e5Ko4%7¼uĩ)4Vn+IϢ𵼼`Jը}ȼǪ!y>Jz u1`Gskb-NK iey`H#<4}'yqqׯ_,#]WrnZѾX,jqqQ^O{{{᭩T*Z\\˗/Hz뭷җ==\^OjU+35 X,|*_Eoj)܌j( LY028/_ ׽ϼ捗 ཰)Q c{ , (Г2tS e "?lZVRN`8okkkdU/P B0.,,ǃz~~^àGPk*8Rx" 9p_I <(Cͳ Ph4jҰ0:.7C|s\:h`Ԙ7/2gY8xyӽRχˋ!% Xahɒ _T4Mkoo/dS,L+*P(hssS?Zu:(u33#݀S9 {0S#4Xv5vG]o$)z]<K6htRscSY-^ \. U٬jZ|;ӧaBC=Bj`^6U^éR*!ӇI#9@ 2|L!|8N) Fȸ7G ̵1HK"!7) l`0 z >!ꪪժ:N677N#EW׋t||~fT"l6p8𻐶|>r (t𩸑 E@Hqn7/H`˨}|MI(/ 4Hs\ܷx^~YZ|>2a. K]Db6lT(K JXkdLWcݰ}>l> r4kccٽ4vG]o$y?]> p $R]JPjZQ6JN'>'J\.G睝5Mn+ϫP(ɉ^xZBm}zJdƀ~ H뚟1` =Sz^+%i`4e!OwG?!A/GPݮ% F00kńor .)] 2g1ð`jM49em:r;R_dZv:jiiIR)"k=dir[p9B0ccٽ4v?~C^0i^'"{aguIf@dYEggga<][[S6ooool6uyyx6RҵÇ.|'FQrD$QMW𒜟OZtY<%G >i̞fNp8Q7 Fb~L&_7(S7ƻ IT X,q`Vi9 0es]Tf:(n0^2˩ji_/ tuu|>Љ_P=677ZH裏u(񰼼f_ 4'ҩk_}H&[LKp@ʟOg]}O9N 6fE#7HK0I }w-'aU*Brv!Ji}}=BwC+%6_7ގ g9s8t/u ,)neh̼\2#cl溑L' cI򅧊Frs߅m~|X./ҘJu30з]{v+5@~|wM"AҍA =$Obnv;^ )4ܜjͦNNN'ɓ' fh4R&2t`uוNuzzY?;>>z,fa-y\x9='Uh4Rݎ曛bL=  ^v"s=5h, s`rK <>iYt:2uJ1K;Ag xK77G---Ζtݷƫ5|r9ϖ-,,h0?:6n*&s,@BX`ƽ+afw&*\ c0s n$0e{k0{'%{XC[05d@q.%&spOi]Jv9"A#C>N0NnͽF}:=<<岲l7_d%bz2̻od{䀓{\ێ5Kccg]v_5=|r˯wwCߟ 8iI Ғ#<<,BvT*j[e\Tb\.` (j=bϫXjU-Dc$(x0a_ϣ4>ZXXǏU(TV dى"~&+3(b.g"k!w+$KH~N.K [t5><$ Z-R|Т8?9 T?2[g:|a w)$ v~~'p8Ņͦ[7Ii 5 s}J%/GAn;-Y}[0Ґ};D+,2y)s~~>@; 7.]ZfV.Ġ^}M}Sw$~xH_ڻoyGW,&}@(F~b;ҘCK%ҍ='-& <#M6LlEo:N{l6~[ωĜ/uRLz. X&D@Dw=wַI sssEb$ϝ|r9 h<Tnի0%-MBWx쀳 .1?;=뒔b}>UtwIpAW̓K^`<qqjZuH fL.Hns @s=sO盼}ܥxy3Bz+wu{_׷iY!{Z<#5gx=Aw 7 b1@ A-jEޕ} _Ņ>cG? dB.& yzqSPd<G_1IiFR6ـ<̛.#8ዋq_&9tyyZP 𓮃>@*}8`uR'̟{Y\$p{(zMd%7#+:<< \ahIú*܏Bl6"0KommF:HT**}Zg}y1N.k98eܻs_x ͓YQ}Iw4B;V>! 0um_?nuuUGۿO4@/}Kz뭷:>> ŋ9l_zeYX,FcQ5..{qe=}TofH2p"{PŽOvf0"]>4`s`OE_*h4h4tpp^7q|*gZVy>88PۍǏѣGm5XO*,8AƠ2zҩTJz]z]|IīFiR~d^)\4 &2Uմ&|zQIӧPP:N|>5kȸN> LH$Y"NY{H/gSÙYC:^M-nƴKc xEP{yyt̓zYRntsx\.} B4ҥz4 !)8AHMI:I鍬`t:jZ$\nsýT*aLB%z+|>~su]ervv` Y7MgV0`YNA1@h)YƒX LCX&X1n=-{h JfU,RNNNjT׵މ/}K*ˑQe@7Q]ZZRP2ՕT4rhY(& cA:3ۘ$3qҍ?%}JJ38F0AgA=kvZ[[z--//Gd__"Ify:DԴrIʥCϜs'ݔ,` ~R0?Sʫ8Hz>irʊj*$u|וcoD D/ vxΦ3\>{ݙ;IK7? Yc޻8ݏpO/拏5!k>"/V.zؑX,ƃvvvtppT*}}twj}Ow|>5};߉@ɓ`fz^d  i pޛFv^WëŚyfVdK-`8 8_. N |~C/^  h%*GZ.K|)BrxDzXZZB,&0jd D,'ЀG!m6k>ͦ}u=f}AJ[ X&FeN|>a}DQ$ b1suz=~R)CZn##uzzb(D# |a ky |NAk bkF3h\p(+4uBk-#ECt:QՐH$$m2Nh4nb  +_w}fY˅l6+l6I wp8~//,fK.d:tjnQTD~\ǡwt|#hu`ZXe_Z ´6Ԇ@@t<Ɖzf ,T`ZŮǜ5"H@s6-<I7ߘӽWi,b,N]UI)03]9E^?غ:\Zl" B(2F!:T*=4MX p`.K<`0dYr9t:a|>"V~_ \/899/JE߷f]QhO1ЂE ձ:5v=Λ'ŋi!P̀K7MU|pgJwٳg37/^~ǏW^6>|(RaNrX tZF ?91y\^^r]̀+ b>|l6X,&JFSwd|6tY! 3UjΣ@t_, еpi!:ea޽+Z&H$J$ I_g6>@&A&A(2h\㱱2"poH7j S% s:Bbd2$өvz]O6---!H ॗ^BP@>dzg|;Z}޶풶֌ "Pd#ANAiu=g,ZX t)UIi83;@.\Lͻ@$8q"ZPtl_*׋d2)p͛xr,l4DVYVgϞ%HګJ%0aP f8Y3]~p4 fR!4'4g(:f/%Z,mIKZEZETn\.x^oҝNGR@ԙXVaCzFX[[땎z]4HZsY^;h^3Wx~xn"¹e=iE+` :2u/-1XNbt6ѱ@j XZZgh6. t:H&h6h4t: Y$v<>F^8!iaL{zxX7#d r?!5A|ԞP|>LP,dnZiR,]*~z]#8(&󓃁Ba]N8Fʉ:5"|fJP Lbd2d2 gvzZ-T*yz=[PHXF-6a^z-@HnXySW𙯅N^ʥVMU{?՛xU%oś_/Nzƴd2} Tk.ZEbJ``0P(m\.\.d2A8ߗ|>L&#zFd2)fΎ5瓶S`Mذ8m6ͦG)zt&d,#+1#.IT-}%< i3-kfSsjMGLD"D"wlu:s:Ӫ fS6Mز2puq:FrvXYYA(nG^x'NI߯]|-pnavցQ$9.J EeW.5&O:"+2c3ܑ;@h)hU$9])ED֚\TYqvzQT$ŐdjpzzB =ǖ$PS2d2!BY+IYh?%ڠߝߍh @cM>G[,!`d [ZZBGC^7TNqM#4'Ŵ^O@ߏ0*lȶ4uF#3W0`yM>-6xJO| TUe `n% K}6666f%v%J``PQ+2Nve> $,34.Zhے &L[D<ϋy~3{x뭷oowƣGG!ϣf! "`kk X]]E @4E*ƒl6k'T nnj||x*jx<2Sa\"td2AD{~4$T*\^Tl61ɴ )㱤D~o^}U׾7x_W ǃn+#@t۷oKRŰ[np\(JxⅤsٴBt`Fah.=ȼ^h]Y-pUh@i*>\eVa+ikB_ 2?>_O?7hG?ZhFH.:E"(`L#󎐩Ӊ WP?C;tZR ?Or`~W:Rnd$eVV ْRh4H$H@\.  %O5F󮅧| W)༯9iVה6DN4@Hkj*d|ժ0xf3 x džfu"frV"iEjf,ic|Buk6l6u4 J%&{2 9-JR= :99pq=y;;;8::&666m`l:J%'1qP@TNW~_U15W.^{?}?? m _~Gx]@׾7xWwO}3*1HJoܸ!;es{NOJy@*@(\fe[ ՊZZ&lynQ?F 1R03vHC~we 8aZlD^WR=Mp IDAT41N|b@@z=$IassS XT*#HE%_k`N {\WiMf{P5L,XXvRcϾOWx{ɟ)_kh3[55Y mZ ]9B˅B@P+wQ- Q//f@$jۇ~3p,n4RIu}ˈbbxa>V˒`0@"g Qbڐ%&B! 榠Q\x.d &Ƒ6 :;99{F"V+o ń9yRoZŇl rcT*Rॗ^5i4)]YYF05N4%i(ZL!tAF7ջvu?K{ݸnd$\3Ty&^/rvww%(n ^OgJd5BL]SVK$YH$ ܼy@@.zL&3:|>hzR9-EhGpmt]]WWWѱ6~KLq@m8l?wC>B}3᜻ccgQ5[M>9J12%\Դ+:]bj^\`:.t:404zfe~irW+pVWWf\FKW ѐ. d`aZt *,8bi= wxS5i:\{ ^ #6R nLRI:}EJ%d2ԝ 5Vl#Amx}*ڮ[nWjE$V h#I2 d2uppp dg^<G*e=.'"rb%ߗ9uk<8"~XXvRc7H,]M[QsM1(?L&WOSIu:aj.#H\ND Luݿ_؇wyGtD@@>_WőH$gL>B0D . c8bbY#ADݖd tSQXsH\.b7a"A-Ӊh4p8h4fr,jلL&rr@:3t xl7oޔfS\.'Lq25ԖfCݖJ{ +H]@q2.Vr9TU=>Eƒyݎ}mL&aAS%KFQZ-9_DlV|"j8"Y~Z/CP Z. 8e0Qv=c,ʵZX t)Ƣ Lx0h.G)0 w52W05 $]Rd|@YQ(GarY{:F1GX ~_b1x^I 葁n6acc+++lҽk~gk57٠|z.@ `ҮL+;uFk"A~r,b97~VrL+ur9l6ܼyxR rY@-3يǰX,X]]E$AZ3ō B!a#5 ~_RZd*YZM@`4`0G}$d7g[o^'fÍ7/PH㱀|6v[0RR, J@ATAI%ƺ\*(}hN}^Z낮^*21w2BH ^ԘK'lhZ?я>ⷣws'===5qPwbfɤxPpj'OP:S K 2z=ّȎlZu 1& <>|WfE'M<V+鴤۴"d2)&Ea,]3.AWQK͏X[[C<GӑhT+&~ ]ViO*c[&bPapXދةz888 s5 I^7d"@\.lAօ& L"sljZ@@Ul’Z6^]ȠC3;ESzZ*Ee.ZX t=>p8 5 LKnP]! I g22áE @Bt:1Z S(=qݒaZA^##֭[zh75EhT*RIA"͛7E??XV??|Аl.bMc٬ׁ3p}}L&xGGGEv Gnz.:Nxd3nkkM=?uAW괙^#~eWi,b,N]q)UI0-RZۣP ALR oqCy.5KmR)yfr']ONNnښhH7D.vh|_Jvh4X,D"!fNG@91ljcFbS\Lg"&{ڷm d;==H$"nȱX wlyyJrYRbÇ@X#׋5^J&lݻ' ! bVFiqzz۷o4f+++7^vbhh@@(S cq^__v;nܸ۷ovgy^V|>VhTݒaYh4s@%vR)lmmITP0vom-snZ9|zXX X[[#OnN%dYtPqttd0#X:3Z, TU( QgimYΠ ۷o;99A@>zE1D-j] Hy~@NKCDP6% ) X''KөV%sǪ;3ML#E-sc 3&48C z.ˮScš衑"c,'9bN]"Oڜl'E3y0`nlv;<t gtlGdC R#a<=z$0$(>}'O x嗱 ݎj*t4k\__7TPs® 4E\^^+ulllZZZB&*ńt:IyA\F.A\NX-lmm>Y_d~0X1Ź7pxx(A: L1^xa0H<::B>R~V#sʸnRj*YD1 FT74{djE=ʃnǃ`0T*% Cy(];|p@ZR76ֲj` ac@9εs|k2c6d]qbxQ}D4@M"4cfrŐWę{i ?< m8f)?Whvg }>LqMx<^Zn^`dۑdp a,,R @+O>'g ZTfJ1.@\.c:=cj4"=LbiiI6 ;3M&flhHI8"ZZZB(h4-j:>iaQyMXbOsLPuQzԦt΄Lj2=L/QMt:vEv\_P($+$--d(`JEA{i/y;%1'tFà|p8>>4i8F(δ\Lfnxl/PkmYjRRsEY] r"sSZL76B j;]jfӱccujz|a.^v]v4Oe*MivGFk=4wԐ0-N#@4 hx<"r"Y dbNbooO $*T$I㥗^BFӑfC(“'O?7Mt:t:;rք9+ @dΪ1/H N֭[}n1EPL2-d).ժsٔf|iSp8,nT* #wIF#r9DOEvf!fE }"Y}uh (|N!<$sٔ^~tۈBvT*RG D16=nd2bH7669dj54r<Rݚ-#h^x|LZ a&Gp848tXq >㱈jEO顅:X贖f{twy嬗9E[s5.zIfYL|>nQpW̝/8SdP#[AwBi23Z oN"LR&9N|ߐzxx(M4ʻqㆁ`d2)L/^T1` d210ZHN,Y`f))`0(7 p:. /|Z/^ Ę\Wq!%C:!'k$LI#Z)']n ۍx;>>sXXv_RWuNOE7[laAIjݤ>:nERz0 |:]€T*888hZq-t:TUf3ܾ} ?0ܽ{Wg|>vI_1@G4ְ#9Y uSH2x vxr>}/^j͛D6ty\KH$uiw@s1R0r0DR^ Pgn 0ROFDɂ!HХ6 VK$TV%@#|.Zan4>djtZe d8Zgҿnc_NnW/{#t^GDō7"q\b2* Z4% @@HƊ^'e>Z* zj `g:[e>ϹsvC<|sٓ0 XXv_)b z7 7aԋ5i hjŏt.M 23& ܾ}zFCvT>|($!X13^z`ҊFvmܽ{ַ}h6*={&<P.tR>Fvj*L!"JUL4f#Q˅`o| A#5_*J( b>dP, ՊxJrJp]t]vZMށ@@@*( &$u,KWMSJ"Ek='zc9;)GnGV YlkBrP`Ia5 0x:kG@]*b"ө=s}}]Od0()vvv%fxLDbJK 5cm('` NMPdN}S|N'$ ١1}豰@SEOi-s_snH7"ů:5 |"i;zI2-Z03 4YQ l61ppp <Vb_곻8S2d~?/snǏO^>jbJcJ:)(eZH0Z,AZhۆ*:wRLwlb1fz fs<TZ- !&Kj=>V Fh0T0rPv,R)@( \ ȹ}_]:uWrqit MTc{Q7$|DHi0;sEeשzgI= \͚ sY={$]D3F^@ fb}}H)fj)I)l}h0ܹ#%\N(g0 PwA dR7"& D$hrpwNTh4B@4`0h9׻~2ClTȈo y<[!(#Sp(tHhrYf yl:HAl~W;HӥmNNN8Q"H;ǃd2^S]Iloo Kl6 -6{S_>wLþ+@6nGP@RTd2ё|~ʄv=KRjus, _uXZ{jMs:p=g\x,"%1@/Z:%[ch5߇0j]6ةz٭V 8bp8DXb"NH$$@W*:69,SrL th4BXj. CjW(H]YYJfCɺ \vy"0lR =nD WôE] Si2|#N2” m8WYU@L z2x-23 ʴo-aR LFL ~(2L&x|T*06778 h <:vwwD !bzB~_Dl&Sy?p g0H/q= u`f/'}/J`M"Ʋ몱K2.;%xѸ 1bOi[&u9 fUv #jEATpp+B @!C6~F,vTBT1*p8B!'kMXL‹i+]®@uy:"^SO Y KDu0Ԍ#+t 6#{ycKŽAV?s:X__s`0(],S?99A4td  p 1c, \xfŢg:|>mA k!lxZ Y+fN{q>P-z^]U"ƲqhEY~/;?aO` 2xp$]ĭV+ժ!0, ֭[b/9á cER׈`ayyY<ر\kZ؅!#Ncuu|\B@yDa.SnL^!S N#@mHz#0nOh4 $Ok&cjrooOνfi70j|}># JR7ۍh4H$P($pV%ӟT?aV?ϰL&[n ;HijcV! L^C.]ҙo^z%dY[666RnZC+ccI ǼڴR%f! yg9o6MϢ'̊p#}~擽1 .FdL w}]~" pk3?~a2)=%bH "4 3B/ZRG$S@ `2<~vjn ,f!KE@jI3U㱔kĠSLO9NiӴuDFׅP<ҩO5hdE#3N% rBkZVjUd2AۅnG26,4BEf Hh12Af>q)UIEmҕ8Zp]!9zAcs90S@D4\hb ' 9 xmp\6' 0ENPjab1>F`)*ժ"18b9>b`8 dWtfixpHoz.O&%Zx^'2"$F+o*^L@f6j*@uݎ#E c6 xbF i2M2m$p8NQTG޽{*ѩEBn>ޫLQߛuLim*Eeש:\ )dz^H;+%~_@`0nG4E0͛r{ B{tɓ'2|>!D.bH/1ߓe6sh9vQ-mj5~am%jVXk 6Az A2S r̢hsU[X\Bh\ԘL̔NI1+|:WД9``0Z#z=N8Aҝ X~?^) ߳\.'t87cJtJi3ϟ5Q*PVH$L&l6ˆ7n@4&NqٺBN#߅a52|8{ dڈsG!-fPԬ5Xf5A'Sxd(Z Е#bZ&CIJu%_gPTT$EX#4N][[p Eƈs6kJ1rEμ7&,j֛n|DuJ4N׀Hccujz|w"3gL(Bە2*CYp'l¦l\xyy| >OD0hrQ?KSY__jY*4xaq2 yF#amm X _җT*awwPd2cjn# @#{$_[OC-bgYhv\.wa9ɉ|ee\^H$kGrʇ!"Jm<^z%lll`eeEyI7@ p8, GCٔcb>~MX 4C^c6!͊9gZ5OZM kͬѕ7u,Oa#Ydcae/W!5@@ pn*|0zpel \8SBV&]-?SF!L ?:0@(kCEy&:޽{rQcfv-}8nG:PvFQ.%GdžjU@DA0D^pn.e~f,&P.RtM`ZL("~o`x(쥞E3i>Hvl֤ZQIJ|>/s1O (H$`Г"LJ:ªZZ2p x0h:(=88@RAP&٬0 ,fz,6VWWqD"Z-J%pK&-}rYJ *;KՙL&!#HS;LF.XAb1aNOO p8 h`0 ˡ8n#75`˙g+|;|Dk|pX\<"ŢTѲ "J5q|mv9KRqx6 ˼)P&w!:n.^z3z!#ݣ/|f{ .;%xXԘ^$^t! y'L3}E >߃L5K @t J<7T0VVK'[D jhxE>7].׿ut]caj乍D"?j5nB!8QCFW~R)cb1 3ǿ4x7ohbH8S\kD%BVU*ʬV0zv[pˢw{{fD"8>>|<6"rf)\d3W^A(B89߃3u(ݪժ@h21{rAE~~OtuK&۬ +ZXv$S3ôBd pqI."wMkFwܭjd2)n4(,fV0D$gh~fA"lr,OvKJf!H^'e5TL׈l q3VrNGJyn{N3Fl'zޓ&y qUˮSc ?z?Ud@ȼ$iIZ8g5e|ⶼ-AP(pXLaf(hKva.JӧO0H$Lbcc[[[ x뭷{a8WA` ̕vwwӟЯONN$AT;880 fDpg6!L"Hy bco]~?!*vvv* hD"!S F! C*­[p-ܿT T DógP.plexNiVp Ja}}e^7S IDAT da@GTQ:YFl2ogl%BVZJu!?E@mxo屘>M Sf=.`&C{H$ z,,EcSczd\Դx8g)f$ON >M3X,Zr tVWWe bJD u-CRx\u,lǑL&t: ;nd2|>|K_)h4l6kj5aZt6I, !hssBM66(tjp&rtj/LΎDN#:L t8*4e>rŢyi긴$F!t:'lV\.'2?9Ev"N^O.=Z?nvx_jDtX2jtQخ.0 y'檲Ea~:5vIe/#-wr,CpG:}.Z  jE:BcfQ.tf, ]ǃh4*# <{eyyU"V%w, J6#"3uZT` CdYݻºP (˨T*gb8SL*,yp8F#a9XrxNժmdȖ\ƎF#idYR)CʌU9eT" ̞Y@l^~r·á~xLi]fnB1=%OSt: €]Nօ <.!6f nNӣ^XXY؈dz|n@HI=4"<^r># 8`,0 MIMi l<,.:]47oJb9k#50l6ya<0DKKK*vww{{^rzq]lmmgn7n7J# u:x7Ž Bb(Z'/`K.˒v|p8r^i:>>4qwwFfSYƾZZoi)-â:<<44 REߡV%L,^ɤX*_^_ǃX,SL 9}X[[6s>v:W6Mwx||lr]MN]j5MkZff^nliwwFJ%vmllޞmnn7եRvwwV&l^Rrm}}?~cj90("phPCŢ*ux g`, އ .%Bquӈ|>oZۮybM9 3dsw@ˎoz=A0Z\6rЧP7*߿ofhw'u[pZjϛeq-Qc^Y##,Xab BF][P=[ Pah&gGGGeoVS[>w1"á5 3n Czc׼2,jv; FPQ8|ժGr]p^{5+JC{FaW\K.90/á \H0OW\Ν;v=[]]u)NJ" yHl2QB(@eŢE}𡋱1(mt:Z\\taRqG^6T*6;;k_o.]Hw0MYaa1 C!K I} YTh66+T#ͥ0UMn xgC;u磽|,:`טI:]6ЈF|99/ǚ%4D?- m+ǥ]MLLxFc qB mĂjl!{k66 jښf, `rh4laaۢ}`ЈȏP(HP ̕JsZ-gE$dAxzB - nVew[V̓39#|< T8jyD)  HI -;qEgUỦ4ޣ46VUL%5u9xGՈЭv-kYt;`e5.RwLwçaht7@Q- Aϥ:eW"`dZDD n0vӡi49!^Zȓ/ … [ݻw٬R!4,..zDW.K0xHHn%X#j^^[RZ%Lݐ Lγ¥2lz-k=6rqDsQONN&"4k4YݮJ%}DiY\9He\̘%7bczT`E'=EN[9B/^j.LM"XT<⊾\:,PY׳wݻwO;w-,,؛oH .:GJ%T*~ONNZR(qt5̌U*D) ΍X,ZVsWOFlM)]Ύ3Gu`cˊwcacBѳwPEҸ94}`B@6Z]cgIJH f5xQ]d:qfaeNa}M.u3JDpFLMM9@zJd pX> +TWeK\.[Z=!i_uV.X-J 0{/ FAo=33oVWW޽{{XQ|MM Tё03HhkQ_͡u(/*9Dgzy"; ͐& P,j)གQJsk)P! B7WalUԅg ϳf(kYtE{eM#=p NUjZ-bJ+xA?@3Sxn;vʺ [q,*DѶRdȫ)/`%6h^J$n(.X\kqqJ Eg?( }mJŪժh4rDbnmqřݔ~}w^13lV?=|lssjjK7/^Dn~#~"*-t*K<'H.JbW^h\n?%|avttuFkʅv(1O%X 7>,ϊw]]YЄ9B姁!sK{ 'ٵ<N Y]c!U'c 83U" Y$$@Fs %"ڋ 6܉HCu& ;fv!feX4QJ]iV*8 A W]QU(~׾UF&ȨMc+̆#qBY\ˢkX)ASwN항 E*(bg 9Eh * N,*Qś,àXVF8 8!3-@$GiF73= 5D1EA_v5obb,J%+˞c>cQe^h)kuƢ Dd"ψ pMǬaP|Sm}wE?:>>v"hKRblWOevnY5{{HvkCiM!m;),kYtD|h,_lLD,}b Siy&h䵗Py]d<(tQ`'lf.}YD1 Ϗku:mS=IC^3ΚA/ !B̿F ݻD\O@-i l6mkk˾;w/e/B:^皛{E8ѷTA7{JRQ!f 4PeQ\KpԵ5Nk{ײ{,gしe5ͺkLMZVCb:)htcb @vit7+#nXw23=FŨcT*N۵VժChV\.5o C7GZuѸ4l8Wbk׮k :Jzww?~}KM3ƚ&r A@~S=Eda4 )?w]k p9Q cp8OHp!kV(x=ݬ4Zv<jB^F#+.e]bgRW׃uG$ .\PI9uN"LQ ˲o[[[.==rЩ9/^hzݳ rV.]IYy_TaO+\iephbZ'%vFFVˉxBũ#f6..g}}ݪժ2Y2|>ov{~c911aff3!\?2aHH_nZO0%<e20;܏ O+;׿}\osssLMMYr}1Q.=!!ςh,$^̜u!ɞ Yі-P>V]/&RZ.vff.6;NNNz b#2iYp`HrXTliiɅ yq.*p73D|޵J+@_?G9>sezcgv:i`0pㇱ۔ϸ Y^&*bL++ Ӥz~ +" ]wUQ9S@ø'L~>VeZ*Y?BϏWD ^w$IԴ 8 nwwךͦu]wA܋DqI6xBge,hnC!xFKΣ.RƷt%N'!xPnG>нjN1T@NysaY\bXWeevx49TM5 0ay3& h\-4Ք(cRM ya}gaaǂ[RWOb?;;Ǐ˗]ۣ;Ţj5J?]t{2!cNze(nk.]v `yxxn&\wj`pMNNZ-wZPD^BqƖjͦ?/fe1BxF(R١' dfƄ*w &B껆qm>SvTMږ47 pN1Gp6IRYa^us,:`e5h |U([t !,QEJ wuNO`Ņb,e;88VOD~@[[[577t&ګn{T 9!H+`pG}/rJs^})blp?T*9KRd49sGIyĴkx҇& lg^ XJIM S |Gc3; x黦K7FI{Pײsɲݺn6?/߲fi@gf,u/?o͗hSC?3(HnX"d1n:-.(Y4drHFu;W>g- 611.Ji#*0_@F{tQ z= Cet A3b]k$1oZ:BrO& %2B{eVú:n>>#V?gL/"ӌ:@2ոܨPH'v810dun]wǕJ'np0ٖJ%!}seQ5!K6ۏv&q,/pJ%q>WGSp?r٣B]),&[]'JNJ%pFqQ)#Ăe…+ cCIڷ'(Ql|^(~/&?vn6v^׭M~lmk[Kqe̲kL'8Ĥ.*:ɔ,F%G] wRx}uEsE]=YxmQAX],"}ZӞX0g˜'TdT7`0H0 ~]U C޵N3B-2qNKGUTfǼMJMdRn3~g=)TT=9eɲcT'WmV?axۭW7Ɠdyľ'1b켛N*eovTIXQW?#0N:ц. ei,袯;ݼ^tP]Y2 .Mb2Yp{kY\[A?YõLDڅ~'D1ԍB,xn5%x}F*36H!SPϊռB&1h:ea } !7V;`eY+,W(COLĽT1(*!P-Fuvwz` \ýs섑r.6F<"EHkr'zhI ܑ Z k7O\6{{{nQ]Qe4bX~<@'M|c\"5t#Icezzڟ~BԔ DcqNgπm#`(#s)`;9 Bf-,Z{-:%fYv1ц./!dqssO3-l" 'Y. n@cY| ȴ^ō~|7,,|,!# u XYȵ~,Y 'XD^T4ϝvq XC],}ʳQP>/o DXO8dJC&V_;5~ޕkixM\N]pAKy,e5l[=& w! A'‰ZiymB3in n\$!Wz X[4-~F[=4~zz)eC"7D˪݁Gv>)y!T3zSiYM 3.z-L u3d\`Ugf6Kmkf!y[u^]_Aϣn7Նi|=Lt2u8 ^; )w$P mҿs/dN[[ZӮu9jY\΂kYtYF-ZgY\ؿI'q[?tS,PVb-*Zhg^ؼVxi@裏>Jd-ZhѢkZ?;Kg~ '(xl<6Ǿc?>ښ_jϬF(ZhѢE*u_7+ƕ.?KgE-Zh_tkQee˒ž[o~žʶEXhѢE핵E-ZhE -ZhѢE{e-jE-ZhEF(ZhѢEZBѢE-ZW"-ZhѢPhѢE핵E-ZhVO+3i?=y43%[^#[Vk{RO2c־?>u{ *~T_q]@9O>Yfk_~l^HӓE[cfKxuUﷴ[c [{`>Y[ 뷬q\=e{ 8·EswOށwlFeb5޻e˟`Ki:^~N]]2K頻ZB/ OWv ˔މl;b1v]oq=Wq\h/ٮeif'/MΗ1vw>e [yٍ9}eH[[KW-xENc=No)؉_ѻǕؿ82m=Wn}+Fkmk[ֈ/mFtmž^fFgi-{־ZJԾ8ΑŢb(3-M}'oGB=q04KFcdFXZWWW:'PhѢE핵-ZhѢk,ю!IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/contrast.py0000666000000000000000000000214400000000000014621 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Contrast tool test""" SHOW = True # Show test in GUI-based test launcher import os.path as osp from guiqwt.plot import ImageDialog from guiqwt.builder import make def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") image = make.image(filename=filename, title="Original", colormap="gray") win = ImageDialog( edit=False, toolbar=True, wintitle="Contrast test", options=dict(show_contrast=True), ) plot = win.get_plot() plot.add_item(image) win.resize(600, 600) win.show() try: plot.save_widget("contrast.png") except IOError: # Skipping this part of the test # because user has no write permission on current directory pass win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/cross_section.py0000666000000000000000000000226000000000000015640 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Renders a cross section chosen by a cross marker""" SHOW = True # Show test in GUI-based test launcher import os.path as osp, numpy as np from guiqwt.plot import ImageDialog from guiqwt.builder import make def create_window(): win = ImageDialog( edit=False, toolbar=True, wintitle="Cross sections test", options=dict(show_xsection=True, show_ysection=True, show_itemlist=True), ) win.resize(800, 600) return win def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") win = create_window() image = make.image(filename=filename, colormap="bone") data2 = np.array(image.data.T[200:], copy=True) image2 = make.image(data2, title="Modified", alpha_mask=True) plot = win.get_plot() plot.add_item(image) plot.add_item(image2, z=1) win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/cross_section_oblique.py0000666000000000000000000000401100000000000017354 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Oblique averaged cross section test""" SHOW = True # Show test in GUI-based test launcher import os.path as osp import guiqwt.cross_section # debug mode shows the ROI in the top-left corner of the image plot: guiqwt.cross_section.DEBUG = True from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt.tools import ImageMaskTool from guiqwt.cross_section import ObliqueCrossSection from guiqwt.tools import ObliqueCrossSectionTool, OCSPanelTool class OCSImageDialog(ImageDialog): def register_image_tools(self): ImageDialog.register_image_tools(self) for tool in (ObliqueCrossSectionTool, OCSPanelTool, ImageMaskTool): self.add_tool(tool) def create_plot(self, options, row=0, column=0, rowspan=1, columnspan=1): ImageDialog.create_plot(self, options, row, column, rowspan, columnspan) ra_panel = ObliqueCrossSection(self) splitter = self.plot_widget.xcsw_splitter splitter.addWidget(ra_panel) splitter.setStretchFactor(splitter.count() - 1, 1) splitter.setSizes(list(splitter.sizes()) + [2]) self.add_panel(ra_panel) def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- win = OCSImageDialog(toolbar=True, wintitle="Oblique averaged cross section test") win.resize(600, 600) # from guiqwt.tests.image import compute_image # data = np.array((compute_image(4000, grid=False)+1)*32e3, dtype=np.uint16) # image = make.maskedimage(data, colormap="bone", show_mask=True) filename = osp.join(osp.dirname(__file__), "brain_cylinder.png") image = make.maskedimage(filename=filename, colormap="bone") plot = win.get_plot() plot.add_item(image) win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/cursors.py0000666000000000000000000000223400000000000014464 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Horizontal/vertical cursors test""" SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.builder import make def plot(*items): win = CurveDialog(edit=False, toolbar=True) plot = win.get_plot() for item in items: plot.add_item(item) win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from numpy import linspace, sin x = linspace(-10, 10, 1000) + 1 y = sin(sin(sin(x))) + 3 curve = make.curve(x, y, "ab", "b") hcursor = make.hcursor(3.2, label="y = %.2f") vcursor = make.vcursor(7, label="x = %.2f") vcursor2 = make.vcursor(-1, label="NOT MOVABLE = %.2f", movable=False) xcursor = make.xcursor(-4, 2.5, label="x = %.2f
y = %.2f") legend = make.legend("TR") plot(curve, hcursor, vcursor, vcursor2, xcursor, legend) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/customize_shape_tool.py0000666000000000000000000000336200000000000017226 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Shows how to customize a shape created with a tool like RectangleTool""" SHOW = True # Show test in GUI-based test launcher import os.path as osp from guiqwt.plot import ImageDialog from guiqwt.tools import ( RectangleTool, EllipseTool, SegmentTool, MultiLineTool, FreeFormTool, ) from guiqwt.builder import make from guiqwt.styles import style_generator, update_style_attr STYLE = style_generator() def customize_shape(shape): global STYLE param = shape.shapeparam style = next(STYLE) update_style_attr(style, param) param.update_shape(shape) shape.plot().replot() def create_window(): gridparam = make.gridparam( background="black", minor_enabled=(False, False), major_style=(".", "gray", 1) ) win = ImageDialog( edit=False, toolbar=True, wintitle="All image and plot tools test", options=dict(gridparam=gridparam), ) for toolklass in ( RectangleTool, EllipseTool, SegmentTool, MultiLineTool, FreeFormTool, ): win.add_tool(toolklass, handle_final_shape_cb=customize_shape) return win def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") win = create_window() image = make.image(filename=filename, colormap="bone", alpha_mask=True) plot = win.get_plot() plot.add_item(image) win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/dicom_image.py0000666000000000000000000000176500000000000015231 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2015 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """DICOM image test Requires pydicom (>=0.9.3)""" SHOW = True # Show test in GUI-based test launcher import os.path as osp import guidata from guiqwt.plot import ImageDialog from guiqwt.builder import make def test(): filename = osp.join(osp.dirname(__file__), "mr-brain.dcm") image = make.image(filename=filename, title="DICOM img", colormap="gray") win = ImageDialog( edit=False, toolbar=True, wintitle="DICOM I/O test", options=dict(show_contrast=True), ) plot = win.get_plot() plot.add_item(image) plot.select_item(image) contrast = win.get_contrast_panel() contrast.histogram.eliminate_outliers(54.0) win.resize(600, 700) return win if __name__ == "__main__": _app = guidata.qapplication() win = test() win.exec_() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/dotarraydemo.py0000666000000000000000000001373500000000000015466 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2016 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ Dot array example ================= Example showing how to create a custom item (drawing dots of variable size) and integrate the associated `guidata` dataset (GUI-based form) to edit its parameters (directly into the same window as the plot itself, *and* within the custom item parameters: right-click on the selectable item to open the associated dialog box). """ SHOW = True # Show test in GUI-based test launcher import numpy as np import qtpy.QtCore as QC import qtpy.QtWidgets as QW import qtpy.QtGui as QG import guidata.dataset.datatypes as gdt import guidata.dataset.dataitems as gdi import guidata.dataset.qtwidgets as gdq import guidata.configtools as configtools import guiqwt.plot as gqp import guiqwt.curve as gqc import guiqwt.image as gqi import guiqwt.tools as gqt class DotArrayParam(gdt.DataSet): """Dot array""" g1 = gdt.BeginGroup("Size of the area") dim_h = gdi.FloatItem("Width", default=20, min=0, unit="mm") dim_v = gdi.FloatItem("Height", default=20, min=0, unit="mm") _g1 = gdt.EndGroup("Size of the area") g2 = gdt.BeginGroup("Grid pattern properties") step_x = gdi.FloatItem("Step in X-axis", default=1, min=1, unit="mm") step_y = gdi.FloatItem("Step in Y-axis", default=1, min=1, unit="mm") size = gdi.FloatItem("Dot size", default=0.2, min=0, max=2, slider=True, unit="mm") color = gdi.ColorItem("Dot color", default="red") _g2 = gdt.EndGroup("Grid pattern properties") def update_image(self, obj): self._update_cb() def update_param(self, obj): pass class DotArrayItem(gqi.RawImageItem): def __init__(self, imageparam=None): super(DotArrayItem, self).__init__(np.zeros((1, 1)), imageparam) self.update_border() def boundingRect(self): param = self.imageparam if param is not None: return QC.QRectF( QC.QPointF(-0.5 * param.size, -0.5 * param.size), QC.QPointF( param.dim_h + 0.5 * param.size, param.dim_v + 0.5 * param.size ), ) def types(self): return (gqi.IImageItemType,) def draw_image(self, painter, canvasRect, srcRect, dstRect, xMap, yMap): painter.setRenderHint(QG.QPainter.Antialiasing, True) param = self.imageparam xcoords = gqc.vmap(xMap, np.arange(0, param.dim_h + 1, param.step_x)) ycoords = gqc.vmap(yMap, np.arange(0, param.dim_v + 1, param.step_y)) rx = 0.5 * param.size * xMap.pDist() / xMap.sDist() ry = 0.5 * param.size * yMap.pDist() / yMap.sDist() color = QG.QColor(param.color) painter.setPen(QG.QPen(color)) painter.setBrush(QG.QBrush(color)) for xc in xcoords: for yc in ycoords: painter.drawEllipse(QC.QPointF(xc, yc), rx, ry) class CustomHelpTool(gqt.HelpTool): def activate_command(self, plot, checked): QtGui.QMessageBox.information( plot, "Help", """**to be customized** Keyboard/mouse shortcuts: - single left-click: item (curve, image, ...) selection - single right-click: context-menu relative to selected item - shift: on-active-curve (or image) cursor - alt: free cursor - left-click + mouse move: move item (when available) - middle-click + mouse move: pan - right-click + mouse move: zoom""", ) class DotArrayDialog(gqp.ImageDialog): def __init__(self): self.item = None self.stamp_gbox = None super(DotArrayDialog, self).__init__( wintitle="Dot array example", # icon="path/to/your_icon.png", toolbar=True, edit=True, ) self.resize(900, 600) def register_tools(self): self.register_standard_tools() self.add_separator_tool() self.add_tool(gqt.SaveAsTool) self.add_tool(gqt.CopyToClipboardTool) self.add_tool(gqt.PrintTool) self.add_tool(CustomHelpTool) self.activate_default_tool() plot = self.get_plot() plot.enableAxis(plot.yRight, False) plot.set_aspect_ratio(lock=True) def create_plot(self, options): logo_path = configtools.get_image_file_path("guiqwt.svg") logo = QW.QLabel() logo.setPixmap(QG.QPixmap(logo_path)) logo.setAlignment(QC.Qt.AlignCenter) self.plot_layout.addWidget(logo, 1, 1) logo_txt = QW.QLabel("Powered by guiqwt") logo_txt.setAlignment(QC.Qt.AlignHCenter | QC.Qt.AlignTop) self.plot_layout.addWidget(logo_txt, 2, 1) self.stamp_gbox = gdq.DataSetEditGroupBox("Dots", DotArrayParam) try: # guiqwt v3: self.stamp_gbox.SIG_APPLY_BUTTON_CLICKED.connect(self.apply_params) except AttributeError: # guiqwt v2: from qtpy.QtCore import SIGNAL self.connect( self.stamp_gbox, SIGNAL("apply_button_clicked()"), self.apply_params ) self.plot_layout.addWidget(self.stamp_gbox, 0, 1) options = dict(title="Main plot") gqp.ImageDialog.create_plot(self, options, 0, 0, 3, 1) def show_data(self, param): plot = self.get_plot() if self.item is None: param._update_cb = lambda: self.stamp_gbox.get() self.item = DotArrayItem(param) plot.add_item(self.item) else: self.item.update_border() plot.do_autoscale() def apply_params(self): param = self.stamp_gbox.dataset self.show_data(param) if __name__ == "__main__": # -- Create QApplication import guidata _app = guidata.qapplication() dlg = DotArrayDialog() dlg.apply_params() dlg.exec_() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/filtertest1.py0000666000000000000000000000547300000000000015242 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Simple filter testing application based on PyQt and guiqwt""" SHOW = True # Show test in GUI-based test launcher from qtpy.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton # ---Import plot widget base class from guiqwt.plot import CurveWidget from guiqwt.builder import make from guidata.configtools import get_icon # --- class FilterTestWidget(QWidget): """ Filter testing widget parent: parent widget (QWidget) x, y: NumPy arrays func: function object (the signal filter to be tested) """ def __init__(self, parent, x, y, func): QWidget.__init__(self, parent) self.setMinimumSize(320, 200) self.x = x self.y = y self.func = func # ---guiqwt curve item attribute: self.curve_item = None # --- def setup_widget(self, title): # ---Create the plot widget: curvewidget = CurveWidget(self) curvewidget.register_all_curve_tools() self.curve_item = make.curve([], [], color="b") curvewidget.plot.add_item(self.curve_item) curvewidget.plot.set_antialiasing(True) # --- button = QPushButton("Test filter: %s" % title) button.clicked.connect(self.process_data) vlayout = QVBoxLayout() vlayout.addWidget(curvewidget) vlayout.addWidget(button) self.setLayout(vlayout) self.update_curve() def process_data(self): self.y = self.func(self.y) self.update_curve() def update_curve(self): # ---Update curve self.curve_item.set_data(self.x, self.y) self.curve_item.plot().replot() # --- class TestWindow(QWidget): def __init__(self): QWidget.__init__(self) self.setWindowTitle("Signal filtering (guiqwt)") self.setWindowIcon(get_icon("guiqwt.svg")) hlayout = QHBoxLayout() self.setLayout(hlayout) def add_plot(self, x, y, func, title): widget = FilterTestWidget(self, x, y, func) widget.setup_widget(title) self.layout().addWidget(widget) def test(): """Testing this simple Qt/guiqwt example""" from qtpy.QtWidgets import QApplication import numpy as np import scipy.signal as sps, scipy.ndimage as spi app = QApplication([]) win = TestWindow() x = np.linspace(-10, 10, 500) y = np.random.rand(len(x)) + 5 * np.sin(2 * x ** 2) / x win.add_plot(x, y, lambda x: spi.gaussian_filter1d(x, 1.0), "Gaussian") win.add_plot(x, y, sps.wiener, "Wiener") win.show() app.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/filtertest2.py0000666000000000000000000000705200000000000015236 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Simple filter testing application based on PyQt and guiqwt filtertest1.py + plot manager""" SHOW = True # Show test in GUI-based test launcher from qtpy.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QMainWindow from guidata.qthelpers import win32_fix_title_bar_background # ---Import plot widget base class from guiqwt.curve import CurvePlot from guiqwt.plot import PlotManager from guiqwt.builder import make from guidata.configtools import get_icon # --- class FilterTestWidget(QWidget): """ Filter testing widget parent: parent widget (QWidget) x, y: NumPy arrays func: function object (the signal filter to be tested) """ def __init__(self, parent, x, y, func): QWidget.__init__(self, parent) self.setMinimumSize(320, 200) self.x = x self.y = y self.func = func # ---guiqwt related attributes: self.plot = None self.curve_item = None # --- def setup_widget(self, title): # ---Create the plot widget: self.plot = CurvePlot(self) self.curve_item = make.curve([], [], color="b") self.plot.add_item(self.curve_item) self.plot.set_antialiasing(True) # --- button = QPushButton("Test filter: %s" % title) button.clicked.connect(self.process_data) vlayout = QVBoxLayout() vlayout.addWidget(self.plot) vlayout.addWidget(button) self.setLayout(vlayout) self.update_curve() def process_data(self): self.y = self.func(self.y) self.update_curve() def update_curve(self): # ---Update curve self.curve_item.set_data(self.x, self.y) self.plot.replot() # --- class TestWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) win32_fix_title_bar_background(self) self.setWindowTitle("Signal filtering 2 (guiqwt)") self.setWindowIcon(get_icon("guiqwt.svg")) hlayout = QHBoxLayout() central_widget = QWidget(self) central_widget.setLayout(hlayout) self.setCentralWidget(central_widget) # ---guiqwt plot manager self.manager = PlotManager(self) # --- def add_plot(self, x, y, func, title): widget = FilterTestWidget(self, x, y, func) widget.setup_widget(title) self.centralWidget().layout().addWidget(widget) # ---Register plot to manager self.manager.add_plot(widget.plot) # --- def setup_window(self): # ---Add toolbar and register manager tools toolbar = self.addToolBar("tools") self.manager.add_toolbar(toolbar, id(toolbar)) self.manager.register_all_curve_tools() # --- def test(): """Testing this simple Qt/guiqwt example""" from qtpy.QtWidgets import QApplication import numpy as np import scipy.signal as sps, scipy.ndimage as spi app = QApplication([]) win = TestWindow() x = np.linspace(-10, 10, 500) y = np.random.rand(len(x)) + 5 * np.sin(2 * x ** 2) / x win.add_plot(x, y, lambda x: spi.gaussian_filter1d(x, 1.0), "Gaussian") win.add_plot(x, y, sps.wiener, "Wiener") # ---Setup window win.setup_window() # --- win.show() app.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/fit.py0000666000000000000000000000151300000000000013545 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Curve fitting tools""" SHOW = True # Show test in GUI-based test launcher import numpy as np from guiqwt.widgets.fit import FitParam, guifit def test(): x = np.linspace(-10, 10, 1000) y = np.cos(1.5 * x) + np.random.rand(x.shape[0]) * 0.2 def fit(x, params): a, b = params return np.cos(b * x) + a a = FitParam("Offset", 1.0, 0.0, 2.0) b = FitParam("Frequency", 2.0, 1.0, 10.0, logscale=True) params = [a, b] values = guifit(x, y, fit, params, xlabel="Time (s)", ylabel="Power (a.u.)") print(values) print([param.value for param in params]) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/fliprotate.py0000666000000000000000000000224500000000000015137 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Flip/rotate test""" SHOW = True # Show test in GUI-based test launcher from guiqwt.widgets.fliprotate import FlipRotateDialog, FlipRotateWidget from guiqwt.tests.rotatecrop import imshow, create_test_data def widget_test(fname, qapp): """Test the rotate/crop widget""" array0, item = create_test_data(fname) widget = FlipRotateWidget(None) widget.set_item(item) widget.set_parameters(-90, True, False) widget.show() qapp.exec_() def dialog_test(fname, interactive=True): """Test the rotate/crop dialog""" array0, item = create_test_data(fname) dlg = FlipRotateDialog(None) dlg.set_item(item) if dlg.exec_(): array1 = dlg.output_array imshow(array0, title="array0", hold=True) imshow(array1, title="array1") if __name__ == "__main__": from guidata import qapplication qapp = qapplication() # analysis:ignore widget_test("brain.png", qapp) dialog_test(fname="brain.png", interactive=True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/fontparam.py0000666000000000000000000000071600000000000014756 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """FontParam test""" SHOW = False # Do not show test in GUI-based test launcher from guiqwt.styles import FontParam def test(): fp = FontParam() fp.edit() fp.edit() if __name__ == "__main__": import guidata _app = guidata.qapplication() test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/get_point.py0000666000000000000000000000301600000000000014753 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ SelectPointTool test This guiqwt tool provide a MATLAB-like "ginput" feature. """ SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.tools import SelectPointTool from guiqwt.builder import make from guiqwt.config import _ def test_function(tool): print("Current coordinates:", tool.get_coordinates()) def get_point(*args): """ Plot curves and return selected point(s) coordinates """ win = CurveDialog(_("Select one point then press OK to accept"), edit=True) default = win.add_tool( SelectPointTool, title="Test", on_active_item=True, mode="create", end_callback=test_function, ) default.activate() plot = win.get_plot() for cx, cy in args: item = make.mcurve(cx, cy) plot.add_item(item) plot.set_active_item(item) win.show() if win.exec_(): return default.get_coordinates() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from numpy import linspace, sin x = linspace(-10, 10, 1000) y = sin(sin(sin(x))) x2 = linspace(-10, 10, 20) y2 = sin(sin(sin(x2))) print(get_point((x, y), (x2, y2), (x, sin(2 * y)))) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/get_segment.py0000666000000000000000000000302100000000000015260 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ AnnotatedSegmentTool test This guiqwt tool provide a MATLAB-like "ginput" feature. """ SHOW = True # Show test in GUI-based test launcher import os.path as osp import numpy as np from guiqwt.plot import ImageDialog from guiqwt.tools import SelectTool, AnnotatedSegmentTool from guiqwt.builder import make from guiqwt.config import _ def get_segment(item): """Show image and return selected segment coordinates""" win = ImageDialog(_("Select a segment then press OK to accept"), edit=True) default = win.add_tool(SelectTool) win.set_default_tool(default) segtool = win.add_tool( AnnotatedSegmentTool, title="Test", switch_to_default_tool=True ) segtool.activate() plot = win.get_plot() plot.add_item(item) plot.set_active_item(item) win.show() if win.exec_(): shape = segtool.get_last_final_shape() return shape.get_rect() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") image = make.image(filename=filename, colormap="bone") rect = get_segment(image) print("Coordinates:", rect) print("Distance:", np.sqrt((rect[2] - rect[0]) ** 2 + (rect[3] - rect[1]) ** 2)) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/highprecisionxy.py0000666000000000000000000000153100000000000016177 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2011-2012 CEA # Ludovic Aubry # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Plot computations test""" SHOW = False # Show test in GUI-based test launcher def xyimagebug(offset): from guiqwt.plot import ImageDialog from guiqwt.builder import make import numpy import guidata app = guidata.qapplication() data = numpy.random.rand(100, 100) x = numpy.arange(100) + offset y = numpy.arange(100) image = make.xyimage(x, y, data=data) win = ImageDialog() plot = win.get_plot() plot.add_item(image) plot.select_item(image) # this helps in seeing where the image should be win.exec_() if __name__ == "__main__": xyimagebug(1e9) # offset=1e9 makes it fail, but offset=1e4 is ok ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/hist2d.py0000666000000000000000000000233400000000000014162 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """2-D Histogram test""" SHOW = True # Show test in GUI-based test launcher from numpy import random, array, dot, concatenate from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt.config import _ def hist2d(X, Y): win = ImageDialog( edit=True, toolbar=True, wintitle="2-D Histogram X0=(0,1), X1=(-1,-1)" ) hist2d = make.histogram2D(X, Y, 200, 200, computation=2) curve = make.curve(X[::50], Y[::50], linestyle="", marker="+", title=_("Markers")) plot = win.get_plot() plot.set_aspect_ratio(lock=False) plot.set_antialiasing(False) plot.add_item(hist2d) plot.add_item(curve) plot.set_item_visible(curve, False) win.show() win.exec_() if __name__ == "__main__": import guidata _app = guidata.qapplication() N = 150000 m = array([[1.0, 0.2], [-0.2, 3.0]]) X1 = random.normal(0, 0.3, size=(N, 2)) X2 = random.normal(0, 0.3, size=(N, 2)) X = concatenate((X1 + [0, 1.0], dot(X2, m) + [-1, -1.0])) hist2d(X[:, 0], X[:, 1]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/hist2d_func.py0000666000000000000000000000251500000000000015176 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """2-D Histogram (with function) test""" # SHOW = True # Show test in GUI-based test launcher # TODO: change this test so that shown data means something... from numpy import random, array, dot, concatenate from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt.config import _ def hist2d_func(X, Y, Z): win = ImageDialog( edit=True, toolbar=True, wintitle="2-D Histogram X0=(0,1), X1=(-1,-1)" ) hist2d = make.histogram2D(X, Y, 200, 200, Z=Z, computation=2) curve = make.curve(X[::50], Y[::50], linestyle="", marker="+", title=_("Markers")) plot = win.get_plot() plot.set_aspect_ratio(lock=False) plot.set_antialiasing(False) plot.add_item(hist2d) plot.add_item(curve) plot.set_item_visible(curve, False) win.show() win.exec_() if __name__ == "__main__": import guidata _app = guidata.qapplication() N = 150000 m = array([[1.0, 0.2], [-0.2, 3.0]]) X1 = random.normal(0, 0.3, size=(N, 2)) X2 = random.normal(0, 0.3, size=(N, 2)) X = concatenate((X1 + [0, 1.0], dot(X2, m) + [-1, -1.0])) hist2d_func(X[:, 0], X[:, 1], X[:, 0] + X[:, 1]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/histogram.py0000666000000000000000000000133200000000000014757 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Histogram test""" SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.builder import make def test(): """Test""" from numpy.random import normal data = normal(0, 1, (2000,)) win = CurveDialog(edit=False, toolbar=True, wintitle="Histogram test") plot = win.get_plot() plot.add_item(make.histogram(data)) win.show() win.exec_() if __name__ == "__main__": # Create QApplication import guidata _app = guidata.qapplication() test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/image.py0000666000000000000000000000601200000000000014044 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ImageDialog test""" # FIXME: unexpected behavior when changing the xmin/xmax/ymin/ymax values in # the image parameters (2nd tab: "Axes") SHOW = True # Show test in GUI-based test launcher import numpy as np from guiqwt.plot import ImageDialog from guiqwt.builder import make def imshow(data): win = ImageDialog( edit=False, toolbar=True, wintitle="ImageDialog test", options=dict(xlabel="Concentration", xunit="ppm"), ) item = make.image(data) plot = win.get_plot() plot.add_item(item) win.show() win.exec_() def compute_image(N=2000, grid=True): T = np.float32 x = np.array(np.linspace(-5, 5, N), T) img = np.zeros((N, N), T) x.shape = (1, N) img += x ** 2 x.shape = (N, 1) img += x ** 2 np.cos(img, img) # inplace cosine if not grid: return img x.shape = (N,) for k in range(-5, 5): i = x.searchsorted(k) if k < 0: v = -1.1 else: v = 1.1 img[i, :] = v img[:, i] = v m1, m2, m3, m4 = -1.1, -0.3, 0.3, 1.1 K = 100 img[:K, :K] = m1 # (0,0) img[:K, -K:] = m2 # (0,N) img[-K:, -K:] = m3 # (N,N) img[-K:, :K] = m4 # (N,0) # img = array( 30000*(img+1.1), uint16 ) return img def compute_image_2(): N = 1000 T = np.uint16 TMAX = 32000 TMIN = 32000 S = 5.0 x = np.array(np.linspace(-5 * S, 5 * S, N), float) img = np.zeros((N, N), T) x.shape = (1, N) img += np.array(x ** 2, T) x.shape = (N, 1) img += np.array(x ** 2, T) img = TMAX * np.cos(img / S) + TMIN x.shape = (N,) # dx = dy = x[1]-x[0] for k in range(-5, 5): i = x.searchsorted(k) if k < 0: v = -1.1 else: v = 1.1 img[i, :] = v img[:, i] = v m1, m2, m3, m4 = -1.1, -0.3, 0.3, 1.1 K = 100 img[:K, :K] = TMAX * m1 + TMIN # (0,0) img[:K, -K:] = TMAX * m2 + TMIN # (0,N) img[-K:, -K:] = TMAX * m3 + TMIN # (N,N) img[-K:, :K] = TMAX * m4 + TMIN # (N,0) # img = array( 30000*(img+1.1), uint16 ) return img def compute_image_3(): """Produces horizontal and vertical ramps""" N = 1000 NK = 20 T = float img = np.zeros((N, N), T) x = np.arange(N, dtype=float) x.shape = (1, N) DK = N / NK for i in range(NK): S = i + 1 y = S * (x // S) img[int(DK * i) : int(DK * (i + 1)), :] = y return img def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- for func in (compute_image, compute_image_2, compute_image_3): img = func() print(img.dtype) imshow(img) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/image_masked.py0000666000000000000000000000272000000000000015372 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guidata/__init__.py for details) """ Masked Image test, creating the MaskedImageItem object via make.maskedimage Masked image items are constructed using a masked array item. Masked data is ignored in computations, like the average cross sections. """ SHOW = True # Show test in GUI-based test launcher import os, os.path as osp, pickle from guiqwt.plot import ImageDialog from guiqwt.tools import ImageMaskTool from guiqwt.builder import make SHOW = True # Show test in GUI-based test launcher FNAME = "image_masked.pickle" if __name__ == "__main__": import guidata _app = guidata.qapplication() win = ImageDialog(toolbar=True, wintitle="Masked image item test") win.add_tool(ImageMaskTool) if os.access(FNAME, os.R_OK): print("Restoring mask...", end=" ") iofile = open(FNAME, "rb") image = pickle.load(iofile) iofile.close() print("OK") else: fname = osp.join(osp.abspath(osp.dirname(__file__)), "brain.png") image = make.maskedimage( filename=fname, colormap="gray", show_mask=True, xdata=[0, 20], ydata=[0, 25], ) win.get_plot().add_item(image) win.show() win.exec_() iofile = open(FNAME, "wb") pickle.dump(image, iofile) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/image_plot_tools.py0000666000000000000000000000355600000000000016334 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """All image and plot tools test""" SHOW = True # Show test in GUI-based test launcher import os.path as osp from guiqwt.plot import ImageDialog from guiqwt.tools import ( RectangleTool, EllipseTool, HRangeTool, PlaceAxesTool, MultiLineTool, FreeFormTool, SegmentTool, CircleTool, AnnotatedRectangleTool, AnnotatedEllipseTool, AnnotatedSegmentTool, AnnotatedCircleTool, LabelTool, AnnotatedPointTool, VCursorTool, HCursorTool, XCursorTool, ObliqueRectangleTool, AnnotatedObliqueRectangleTool, ) from guiqwt.builder import make def create_window(): win = ImageDialog( edit=False, toolbar=True, wintitle="All image and plot tools test" ) for toolklass in ( LabelTool, HRangeTool, VCursorTool, HCursorTool, XCursorTool, SegmentTool, RectangleTool, ObliqueRectangleTool, CircleTool, EllipseTool, MultiLineTool, FreeFormTool, PlaceAxesTool, AnnotatedRectangleTool, AnnotatedObliqueRectangleTool, AnnotatedCircleTool, AnnotatedEllipseTool, AnnotatedSegmentTool, AnnotatedPointTool, ): win.add_tool(toolklass) return win def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") win = create_window() image = make.image(filename=filename, colormap="bone") plot = win.get_plot() plot.add_item(image) win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/image_rgb.py0000666000000000000000000000200200000000000014671 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guidata/__init__.py for details) """RGB Image test, creating the RGBImageItem object via make.rgbimage""" SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import ImageDialog from guiqwt.builder import make import os.path as osp SHOW = True # Show test in GUI-based test launcher TESTDIR = osp.abspath(osp.dirname(__file__)) IMGFILE = osp.join(TESTDIR, "..", "images", "items", "image.png") def imshow(filename): win = ImageDialog(edit=False, toolbar=True, wintitle="RGB image item test") item = make.rgbimage(filename=filename, xdata=[-1, 1], ydata=[-1, 1]) plot = win.get_plot() plot.add_item(item) win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- imshow(IMGFILE) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/imagefilter.py0000666000000000000000000000320700000000000015255 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Image filter demo""" SHOW = True # Show test in GUI-based test launcher from scipy.ndimage import gaussian_filter from guiqwt.plot import ImageDialog from guiqwt.builder import make def imshow(x, y, data, filter_area, yreverse=True): win = ImageDialog( edit=False, toolbar=True, wintitle="Image filter demo", options=dict(xlabel="x (cm)", ylabel="y (cm)", yreverse=yreverse), ) image = make.xyimage(x, y, data) plot = win.get_plot() plot.add_item(image) xmin, xmax, ymin, ymax = filter_area flt = make.imagefilter( xmin, xmax, ymin, ymax, image, filter=lambda x, y, data: gaussian_filter(data, 5), ) plot.add_item(flt, z=1) plot.replot() win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from guiqwt.tests.imagexy import compute_image x, y, data = compute_image() imshow(x, y, data, filter_area=(-3.0, -1.0, 0.0, 2.0), yreverse=False) # -- import os.path as osp, numpy as np from guiqwt import io filename = osp.join(osp.dirname(__file__), "brain.png") data = io.imread(filename, to_grayscale=True) x = np.linspace(0, 30.0, data.shape[1]) y = np.linspace(0, 30.0, data.shape[0]) imshow(x, y, data, filter_area=(10, 20, 5, 15)) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/imagesuperp.py0000666000000000000000000000315100000000000015304 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Image superposition test""" SHOW = True # Show test in GUI-based test launcher import os.path as osp from guiqwt.plot import ImageDialog from guiqwt.tools import RectangleTool, EllipseTool, PlaceAxesTool, FreeFormTool from guiqwt.builder import make import numpy as np def create_window(): gridparam = make.gridparam( background="black", minor_enabled=(False, False), major_style=(".", "gray", 1) ) win = ImageDialog( edit=False, toolbar=True, wintitle="Region of interest (ROI) test", options=dict(gridparam=gridparam), ) for toolklass in (RectangleTool, EllipseTool, FreeFormTool, PlaceAxesTool): win.add_tool(toolklass) return win def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- filename = osp.join(osp.dirname(__file__), "brain.png") win = create_window() image1 = make.image( filename=filename, title="Original", alpha_mask=False, colormap="gray" ) data2 = np.array(image1.data.T[200:], copy=True) image2 = make.image(data2, title="Modified") # , alpha_mask=True) plot = win.get_plot() plot.add_item(image1, z=0) plot.add_item(image2, z=1) plot.set_items_readonly(False) image2.set_readonly(True) win.get_itemlist_panel().show() win.show() win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/imagexy.py0000666000000000000000000000326400000000000014433 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Image with custom X/Y axes linear scales""" SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import ImageDialog from guiqwt.builder import make import numpy as np def imshow(x, y, data): win = ImageDialog( edit=False, toolbar=True, wintitle="Image with custom X/Y axes scales", options=dict(xlabel="x (a.u.)", ylabel="y (a.u.)", yreverse=False), ) item = make.xyimage(x, y, data) plot = win.get_plot() plot.add_item(item) win.show() win.exec_() def compute_image(): N = 2000 T = np.float32 x = np.array(np.linspace(-5, 5, N), T) img = np.zeros((N, N), T) x.shape = (1, N) img += x ** 2 x.shape = (N, 1) img += x ** 2 img = np.cos(img) x.shape = (N,) for k in range(-5, 5): i = x.searchsorted(k) if k < 0: v = -1.1 else: v = 1.1 img[i, :] = v img[:, i] = v m1, m2, m3, m4 = -1.1, -0.3, 0.3, 1.1 K = 100 img[:K, :K] = m1 # (0,0) img[:K, -K:] = m2 # (0,N) img[-K:, -K:] = m3 # (N,N) img[-K:, :K] = m4 # (N,0) # img = array( 30000*(img+1.1), uint16 ) img = img + np.random.normal(0.0, 0.05, size=(N, N)) print(img.dtype) return x, (x + 5) ** 0.6, img def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- imshow(*compute_image()) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/loadsaveitems_hdf5.py0000666000000000000000000000161300000000000016532 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Load/save items from/to HDF5 file""" SHOW = True # Show test in GUI-based test launcher # WARNING: # This script requires read/write permissions on current directory from guidata.hdf5io import HDF5Reader, HDF5Writer from guiqwt.tests.loadsaveitems_pickle import IOTest class HDF5Test(IOTest): FNAME = "loadsavecanvas.h5" def restore_items(self): reader = HDF5Reader(self.FNAME) self.plot.deserialize(reader) reader.close() def save_items(self): writer = HDF5Writer(self.FNAME) self.plot.serialize(writer) writer.close() if __name__ == "__main__": import guidata _app = guidata.qapplication() test = HDF5Test() test.run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/loadsaveitems_pickle.py0000666000000000000000000000751500000000000017162 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Load/save items using Python's pickle protocol""" SHOW = True # Show test in GUI-based test launcher # WARNING: # This script requires read/write permissions on current directory from qtpy.QtGui import QFont import os import os.path as osp import numpy as np from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt.shapes import PolygonShape, Axes from guiqwt.tools import LoadItemsTool, SaveItemsTool, ImageMaskTool def build_items(): x = np.linspace(-10, 10, 200) y = np.sin(np.sin(np.sin(x))) filename = osp.join(osp.dirname(__file__), "brain.png") items = [ make.curve(x, y, color="b"), make.image(filename=filename), make.trimage(filename=filename), make.maskedimage( filename=filename, colormap="gray", show_mask=True, xdata=[0, 40], ydata=[0, 50], ), make.label("Relative position outside", (x[0], y[0]), (-10, -10), "BR"), make.label("Relative position inside", (x[0], y[0]), (10, 10), "TL"), make.label("Absolute position", "R", (0, 0), "R"), make.legend("TR"), make.rectangle(-3, -0.8, -0.5, -1.0, "rc1"), make.segment(-3, -0.8, -0.5, -1.0, "se1"), make.ellipse(-10, 0.0, 0, 0, "el1"), make.annotated_rectangle(0.5, 0.8, 3, 1.0, "rc1", "tutu"), make.annotated_segment(-1, -1, 1, 1.0, "rc1", "tutu"), Axes((0, 0), (1, 0), (0, 1)), PolygonShape( np.array( [ [150.0, 330.0], [270.0, 520.0], [470.0, 480.0], [520.0, 360.0], [460.0, 200.0], [250.0, 240.0], ] ) ), ] return items class IOTest(object): FNAME = None def __init__(self): self.dlg = None @property def plot(self): if self.dlg is not None: return self.dlg.get_plot() def run(self): """Run test""" self.create_dialog() self.add_items() self.dlg.exec_() print("Saving items...", end=" ") self.save_items() print("OK") def create_dialog(self): self.dlg = dlg = ImageDialog( edit=False, toolbar=True, wintitle="Load/save test", options=dict(title="Title", xlabel="xlabel", ylabel="ylabel"), ) dlg.add_separator_tool() dlg.add_tool(LoadItemsTool) dlg.add_tool(SaveItemsTool) dlg.add_tool(ImageMaskTool) def add_items(self): if os.access(self.FNAME, os.R_OK): print("Restoring items...", end=" ") self.restore_items() print("OK") else: for item in build_items(): self.plot.add_item(item) print("Building items and add them to plotting canvas", end=" ") self.plot.set_axis_font("left", QFont("Courier")) self.dlg.get_itemlist_panel().show() self.plot.set_items_readonly(False) def restore_items(self): raise NotImplementedError def save_items(self): raise NotImplementedError class PickleTest(IOTest): FNAME = "loadsavecanvas.pickle" def restore_items(self): f = open(self.FNAME, "rb") self.plot.restore_items(f) def save_items(self): f = open(self.FNAME, "wb") self.plot.save_items(f) if __name__ == "__main__": import guidata _app = guidata.qapplication() test = PickleTest() test.run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/loadtest.py0000666000000000000000000000527200000000000014610 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2021 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Load test: instantiating a large number of image widgets""" SHOW = True # Show test in GUI-based test launcher # import cProfile # from pstats import Stats from qtpy.QtWidgets import QApplication, QMainWindow, QWidget, QTabWidget, QGridLayout import numpy as np from guidata.qthelpers import win32_fix_title_bar_background from guiqwt.plot import ImageWidget from guiqwt.builder import make class PlotTab(QWidget): def __init__(self): super().__init__() layout = QGridLayout() self.setLayout(layout) def add_plot(self, iplt, irow, icol): widget = ImageWidget(self, "Plot #%d" % (iplt + 1)) widget.setMinimumSize(200, 150) xdata = np.linspace(-10, 10) ydata = np.sin(xdata + np.random.randint(0, 100) * 0.01 * np.pi) curve_item = make.curve(xdata, ydata, color="b") widget.plot.add_item(curve_item) self.layout().addWidget(widget, irow, icol, 1, 1) class LoadTest(QMainWindow): def __init__(self, nplots=150, ncols=6, nrows=5): super().__init__() win32_fix_title_bar_background(self) self.tabw = QTabWidget() self.setCentralWidget(self.tabw) irow, icol, itab = 0, 0, 0 add_tab_at_next_step = True for iplt in range(nplots): if add_tab_at_next_step: plottab = self.add_tab(itab) add_tab_at_next_step = False plottab.add_plot(iplt, irow, icol) icol += 1 if icol == ncols: icol = 0 irow += 1 if irow == nrows: irow = 0 itab += 1 add_tab_at_next_step = True self.refresh() def add_tab(self, itab): plottab = PlotTab() self.tabw.addTab(plottab, "Tab #%d" % (itab + 1)) return plottab def refresh(self): """Force window to show up and refresh (for test purpose only)""" self.show() QApplication.processEvents() if __name__ == "__main__": app = QApplication([]) # import time # t0 = time.time() # with cProfile.Profile() as pr: win = LoadTest(nplots=60, ncols=6, nrows=5) app.exec_() # print((time.time() - t0)) # with open('profiling_stats.txt', 'w') as stream: # stats = Stats(pr, stream=stream) # stats.strip_dirs() # stats.sort_stats('cumulative') # stats.dump_stats('.prof_stats') # stats.print_stats() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/manager.py0000666000000000000000000000460600000000000014403 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """PlotManager test""" SHOW = True # Show test in GUI-based test launcher import os.path as osp from qtpy.QtWidgets import QMainWindow, QWidget, QGridLayout from guidata.qthelpers import win32_fix_title_bar_background from guiqwt.image import ImagePlot from guiqwt.curve import PlotItemList from guiqwt.histogram import ContrastAdjustment from guiqwt.plot import PlotManager from guiqwt.builder import make class CentralWidget(QWidget): def __init__(self, parent): QWidget.__init__(self, parent) layout = QGridLayout() self.setLayout(layout) self.plot1 = ImagePlot(self) layout.addWidget(self.plot1, 0, 0, 1, 1) self.plot2 = ImagePlot(self) layout.addWidget(self.plot2, 1, 0, 1, 1) self.contrast = ContrastAdjustment(self) layout.addWidget(self.contrast, 2, 0, 1, 2) self.itemlist = PlotItemList(self) layout.addWidget(self.itemlist, 0, 1, 2, 1) self.manager = PlotManager(self) for plot in (self.plot1, self.plot2): self.manager.add_plot(plot) for panel in (self.itemlist, self.contrast): self.manager.add_panel(panel) def register_tools(self): self.manager.register_all_image_tools() class Window(QMainWindow): def __init__(self): QMainWindow.__init__(self) win32_fix_title_bar_background(self) filename = osp.join(osp.dirname(__file__), "brain.png") image1 = make.image(filename=filename, title="Original", colormap="gray") from guiqwt.tests.image import compute_image image2 = make.image(compute_image()) widget = CentralWidget(self) self.setCentralWidget(widget) widget.plot1.add_item(image1) widget.plot2.add_item(image2) toolbar = self.addToolBar("tools") widget.manager.add_toolbar(toolbar, id(toolbar)) # widget.manager.set_default_toolbar(toolbar) widget.register_tools() def test(): """Test""" # -- Create QApplication import guidata app = guidata.qapplication() # -- win = Window() win.show() app.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/mandelbrot.py0000666000000000000000000000513500000000000015116 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Mandelbrot demo""" SHOW = True # Show test in GUI-based test launcher import numpy as np from qtpy.QtCore import QRectF, QPointF from guiqwt.config import _ from guiqwt.plot import ImageDialog from guiqwt.image import RawImageItem from guiqwt.tools import ToggleTool from guiqwt.mandelbrot import mandelbrot class FullScale(ToggleTool): def __init__(self, parent, image): super(FullScale, self).__init__(parent, _("MAX resolution"), None) self.image = image self.minprec = image.IMAX self.maxprec = 5 * image.IMAX def activate_command(self, plot, checked): if self.image.IMAX == self.minprec: self.image.IMAX = self.maxprec else: self.image.IMAX = self.minprec self.image.set_lut_range([0, self.image.IMAX]) plot.replot() def update_status(self, plot): self.action.setChecked(self.image.IMAX == self.maxprec) class MandelItem(RawImageItem): def __init__(self, xmin, xmax, ymin, ymax): super(MandelItem, self).__init__(np.zeros((1, 1), np.uint8)) self.bounds = QRectF(QPointF(xmin, ymin), QPointF(xmax, ymax)) self.update_border() self.IMAX = 80 self.set_lut_range([0, self.IMAX]) # ---- QwtPlotItem API ------------------------------------------------------ def draw_image(self, painter, canvasRect, srcRect, dstRect, xMap, yMap): x1, y1 = canvasRect.left(), canvasRect.top() x2, y2 = canvasRect.right(), canvasRect.bottom() i1, j1, i2, j2 = srcRect NX = x2 - x1 NY = y2 - y1 if self.data.shape != (NX, NY): self.data = np.zeros((NY, NX), np.uint8) mandelbrot(i1, j1, i2, j2, self.data, self.IMAX) srcRect = (0, 0, NX, NY) x1, y1, x2, y2 = canvasRect.getCoords() RawImageItem.draw_image( self, painter, canvasRect, srcRect, (x1, y1, x2, y2), xMap, yMap ) def mandel(): win = ImageDialog( edit=True, toolbar=True, wintitle="Mandelbrot", options=dict(yreverse=False) ) mandel = MandelItem(-1.5, 0.5, -1.0, 1.0) win.add_tool(FullScale, mandel) plot = win.get_plot() plot.set_aspect_ratio(lock=False) plot.add_item(mandel) plot.set_full_scale(mandel) win.show() win.exec_() if __name__ == "__main__": import guidata _app = guidata.qapplication() mandel() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1448792179.0 guiqwt-4.0.1/guiqwt/tests/mr-brain.dcm0000666000000000000000000200246400000000000014615 0ustar00 ISO_IR 100ORIGINAL\PRIMARY\OTHER\R\IR 199602161144591.3.46.670589.11.0.51.2.840.10008.5.1.4.1.1.4&1.3.46.670589.11.0.4.1996021610440014 19950330!199503300 150829.0000 1 155614.6300 P`MRpPhilips Medical Systems  OTM4 R4.5 0BRAIN > Gyroscan NT MR/BRAIN/GRASE/1024  7 019010101@M 090 IR!OTHER "#2DP6.000000 4414.826172  64.000000  140.0000002  42.593601 1H1 1.0000007.5000000  75.000000  75.000000 0  RTNC1 0 0 102 0 60PH QB ROW  90.000000 QHFS &1.3.46.670589.11.0.1.1996021610440014 &1.3.46.670589.11.0.2.1996021610440014  191 1 13 1 2"-125.000992\-122.842384\32.496708 781.000000\-0.000005\-0.000000\0.000005\0.959915\-0.280292 R&1.3.46.670589.11.0.3.1996021610440014 @ @(( MONOCHROME2 (((00.488281\0.488281 (( ( ((P-927(Q2265(R-19595.000000 (S9.570207(TUS8Z7                                                                                                       /XE9Y4                                                                                                    /YBAR-                                                                                                                        2Y=!CR-                                                                                                                                  2W?$!BV0                                                                                  ,XG#?[1                                                                                                         .TH%C^)                                                                                                  6UC##FY'                                                                                                    5XC!$DR+                                                                                                 8UC$&FQ*                                                                                                          7YA" $BQ+                                                                                       /ZA &BP+                                                                                                                      ,TE! (>Q.                                                                                                         /UC"#"@U.                                                                                  3[<"&"?V.                                                                                      3[>#%#?X.                                                                                 /]A!(DM1                                                                                                        3W:#!,EK5                                                                                                 5T8( +BT7                                                                                         /XA""-AR6                                                                                  /UB$+EQ1                                                                                                         -[D !*DN0                                                                                                *ZD$'DQ+                                                                                               'W@!%%DT)                                                                                                   '\A #"CX-                                                                                                -X<"# >]5                                                                                                        +S?!#";Y;                                                                                              .W?!$:R;                                                                                         2V< !>S1                                                                                                           ,T=! AW,                                                                                              ,W??]/                                                                                                      0V@ ;[3                                                                                                       .RD 8[4                                                                                                      -SE 6^3                                                                                                      %UG#5[4                                                                                                       UI  5V:                                                                                                          $RK"5W6                                                                                +UG!$5J4                                                                                                     0XD%9F4                                                                                    6X?;V/                                                                                                     2Z=#=S3                                                                                           +SA$>P4                                                                            *S> !=S0                                                                                             #OD";O2                                                                              %LB! ";P.                                                                                                  ,V>  ":S)                                                                                                 .U>##?R%                                                                                                   )Q@&"@U%                                                                                                !QF'! !;T*                                                                                                                 'PE( ! 9U+                                                                                               -SB%!"!5T2                                                                                                     )UF#"!8P-                                                                                                        .VD# =N,                                                                                                 8\=!!">K-                                                                                9Z<!?S+                                                                                       6X:#?R,                                                                                                                    6S: %?P.                                                                                          6O:"#;R5                                                                            1S8!! #=S3                                                                               /Q5"!!8Y6                                                                                         -O::Z5                                                                                            (T<AV*                                                                                              *T:"?R+                                                                                                 ,Q9'?O3                                                                                          .R<!&@P/                                                                                          +SC!#@S'                                                                                 (UE ES%                                                                            -S>%DS!                                                                                    +T>$! AS'                                                                                &VC!$@P+                                                                                   *QD$ =T,                                                                   .W@ ":U0                                      ~                          +`D!"6T5                                    }x                              1\B" 4W6                                      tq                              2\@ 9T5                                     jm                          -W?"  >O3                                 ^t                                     3T;#!?U/                                    |^w                                    0S9#&%<\)                                was                                  -^;'!<W)                          v^}                               0_?#=U,                             }g                     1TA#!DV&                     vjjssnmkny    t~  |mhZKOTNOW_t                         0R@%C[&                  ~vk\[cig_WX_gs  xiYGDJGA>;AMYn                      +RC%"!=U$                    vmdk|zjgnpjebabr paVZce_XZc^RNNSi                              0P@!"CS                    ~vtor}~{rgnvhgnz{iWWgz                          5S9  "!AW                                   tsz |ldphak|                    4T:! &BM"                               wwyt}xlaWW_qi_k                    0P>$'CL&                      |pjuvxvomefq dRHCFNXk}q\h                        *PA')BL)                  xgV]kfk{{bZWVdzwrUDCCGOZ\aiyjYc{                        %UE" (<N-                       xk\LP]cbegs{qma]ZNIUg{uzaK<:>@AJRLLWfyrmf[U\q                   #WE$#9T1                         mZNHKOU^TV^[au|umbaffb[PJKS]u o{}eR@9<;6;HOTQNTXb~~pcZVQRXn                +U;"">V+               z\MLHA@KVLAAIMW`cjsvoili[XVPQNB?83;EQg mqi\D8>=41<@CEGKNKITftworfQPNDGITs                   -U6 %":Y(                     ~\GKMECFLFEF@<:=A@@EIPVTLLNNRNAAA579=G[m hk g\L57<324676459EKFBEKR[ff`cc\\^IC;9==?Sq                     *[:!#:S-              ~bLKMG@?CLB99>B?69C@:>GKIDIONE?EJ=03<>:Ieu}chdXD9;97=A<30476;EC<CHEGIGNPIGIMNC42:;8BYs                         )SA#?S+                      oWJJIB?JMA=BDA=BC>BLLECDDHI>8?B:67424>B;Lp  |dvt^I;735=?=?<621333:=9<B@;@A?DB:9A@956;>CQb                                      -T?BS(                     zaLGKONCGMJEEHI?9BFDFIHDDGB:>D=1187593.>E@_pnkR?>:9DC66?<54735>====@A;9;<98843>;5689=IWn                            1X<  ?R)                         lULNPNH@@FC=AGC<=FI>9BF?97<B?;7873//16608@Rss~vpdJAB9>H=5:;:957<=;65889BD:1/17845;7/6;::@Nd                 -RA!<R*                   hTONMD=GOGACD?78=CEE@;<BE@BI@686/+*07:A<27Lbxt|vr]IB?9;;8=1'<B26A<;?;:76;EFB=83-,4>7,2769<@Vx                  .Q?!>T%                      bPOLGBGPJADCAGB<GI>;GE>88A?9=<7:;2-5859>85DYlzyhYJ??><99=<:;<71.:A74;:66968=83983;8*/>86=>Ig                           2V;!"?T!                     |]QOEBGKKD>?FIC=CIB?A@A<8AC:;?9:?8378447<;;ANh|}saRIA@<8>B=:98;8389/-7:558873354331460/7<:9>H[~                                 1U> "!=R%                 v^QHDEGLKCDD@EC<GHB>=@DCCA9:>3.8:6:<9736=;:>Hd{dRIGA=?94:919>40=<5::69:79<:45<6/54286/5@=8DXp                 *[B =Z(                 r\MIHBDOLAB?:CE@>>9:=GICFD;<?=A@97/0;5/:@<;;C^}hQJF?>>>@<745A=1;B59A7;?@?:46766/0971367<?:>Ph                  #\F?],                     jWQKFBDOL?>DC=:@G@?EDAC>9:>;6;?705715;64==9>HUuzhOLF=?@935>;49;7:3'0B@<;<<;3-022562./17AC>=BG^                 $UH!B[,                    jSRMEDFML@;>96?FA?B@<>EE?<<939B7-7=56?82=B::GVwjSMB;@C:159>@93:<9846>;7924>4/9747/.:83=>5<DGZ                       ([EFU)                   jVOKFGIJG?7:?<>GB7CPF<AFB<<;;CA20@=259:88=?;E[w~nXOB:>B?967>B=7=?<:8:<32>:6@<7<4*01/4/*5:5<EGT|                 *XDCU-                fWPFEMD@D?6;><@CFK>9B@<FI>88858626@?63788=D?C^~zvyXOI<5=D<37AE>:::<:8:61;B9375132494/8@:349=AHVr                 /WA>X3                  pTLFCLJ?A@99;;@DFF>;><>DCDE84@@2199=?429:=GBDdv}aOIB76=B<7<?7567<@<:1)03/;A66<54;619:1-3=?>IZp                    4YB CV+                  VIIAEHBA?77<7<HI?=GB:AF82==6753=?9=B51:;@HCJko kXI?9::7>C829=726;97:759;=7//42..16813<@?>=FZv                     3XD!CS(                 aGIIEKE:58::<;BHB?BB?>?><9>>77==;CG>559>BDFTr  ~mr} r`OB=89=<<FB67;89957439>7010/6801<?6.5;89=>H]|               /\B#@P'                lNAJLHB:<>:<BCEHC><9?>9AB<@EB>;:>FF<48>@CGN\|myzbUEA>7679A:4AK>48>8499..87374//496230.;A;?L^                   3W=! !@L#               tXGEHFDD96;>?FIHA>B@;@HB;@@68@<=BCC>6?FBBIRldp}i fYIA?>=74;=>==?A<628>933378--2((3.0;5,4::APg              5T=#$ @M                      dKGD@>52:<;;<FKB@IIABC93=C<854=A>DD:=?;?L` {W] y\NGA;>>5:B@@?=A:07?:633179/19557027549??@Ty             /W@"$@M"                     yXEJF47@=AH=:HJ?>?>><AG?6>>;EE;>EG?7;>>FZuel]  iRHBA?:58?AA@>>85;=;7328:1)0<92468:65:>>Gf          /SA'# >M)                    mM@JG@@?EKB=HKA>GD8<E@97:<<@@?FF?>@ABBQpjg aLB=>;339=BC=9;97=>73442/3:94:7,0=53;ACRt                1PC,!;S)                hK>BB?DE??DIGCEH@@G<2731>;3@E?:>?;>ESl~|XE??>:66;DH@;=;==;:4398984:?615886;BDLh                  6TD("?N"                  eL?=CMM?BPI<DJCCB:8<<6.4;:BA<BEADOWdvvUBDCA>52?GDB>;=::A=1/8936<:36944:?DNa~                 2YD'""CJ!                  {]NF?FUTKKLFGJC<99<;9;63>FCBABDJPV^ooPFB=B?27DCBD@<?@=<;;747604:6458?ELZo              2^@"%#>Q-             wWKE?BNRNLKLMDBFC;;==?FFEIHBDKMUdtgSH<;A;4:CGID=<:68;75=?78946>=>FMWn                     8Y>#"AY+          aQLECGIMOLGGHCAEFFEA@BDE@@JRYfvsaNB;778:AKQNDDC?<:>>55<<=A<7<I[t                  /SC%AY,                oZSQRNHIIJNKILJB<?DCAA>?N]hv `NKF@<89CQMCB:58?B@@DC@?87BOc                 #WI"!=U/              kWTZSKNNKLNNOQRUZWKBIU^hzoTKHEA?;@NRJHJIIE>?<568<N]l            (YJ#!:[3            redbab]VVZ]bhcQHVjmoiVLB?@84BQSOJB=>=<CGK\lx                (XH#<^3              {qppqwvpoojfk{{{iPEHBBR[VTSNINVW[l                 ,RF% @[.                    wnl_PUclprtvw                 /U?#!%@T.                wuz                   )X? ""%?V/                                &QG$"">Y2                 r               +SB#!%<[4                p                  .W?!"@\0             x              2U= "!AZ3         x            ,Z? $BV7                y           (XB !BZ8                p~           .P=%B[6           |}z               /O;%AW/          zz             ,Q<"# AY*             y~          /T8"'BZ)         y        -S>! =[(                      ~         (VC>W0                          (Y@!&=Q7                      -U@!'=R1                    -WB DT,                   (WC!FV,                   'SC!$HO,                  "QC&KS(                     )S<&$!DV+                       -Q@'#FW'                   4T>%!HZ                    ;Z: #AU*                   2[C  $<V.                  +\E"?X+                .XB!$:W.                 0U=""#8X2                 -TA"&;R0                   +WF!'>P'                  +\E$BP'                         +\F'>M-                         2[C #?S'        qmv     /YE#CR(        d          /WC$>P,       go      3X?DW%             y                  2X?EU&          v           2Y? BV'                  -TA!@V(                   (UC#7T5         x             #UD!$8R3          ~mlrv~            #WB #  <P/          nt^?BSX^r|z             %WE >V,         _eteQ^ifotlrsds  xjjy              )XF#;T-          kzzw}x{T]wzslXCHa{          (^E "8W6           r]Nhss      -UE%! =Z,          u~fVUf~         3MB)!FX%       le_`m  zrkv         ,OD)"BY*         ui`ely|tuz             -RB(##=R1         ~rblor    zt|        4U@# ">R2       {ko{y  {~      1SB% =W,           {}wp           1WE ;Y.          z~             1WG!!@Y*                    /NE%@Y&                            ,SC@W(                         1_>">Q'                               8[;";Q*     ~            2Y;"=S)        r               (U<"$AO.              {n            -O=%'>O3       ~qm                      1R="!=U3    lr|                  6Z6DU)       hyvzx{x                8W8 @V*       &^jrw|zp`          x           4Y;%:\1            ny~r`f          pr             2]<")!7[3           quzd[h    |f          +ZC $$=Y2            rkse\s     jw             0Y>! $EU,            wn{_      kq        2[; # D]+          }|yk        uq|         /a@ !?^.          s        x          7^< !&>X2      y              8W=!#";Z7             z    |        9X>! "#<W5            t            8[> !"@U0       q    ~|z            2Y?!!%C\(        o    ws        *\>&!I\!       uv  wvqr           2W7 &!D])       zp }{s\V             4P8$#$ =]0             fpg           1T<"%;\3       _z       -X>"$;^3    by            (W?!=`5     %oo          *L?$@]5                !my              *K<& F[1           lxy~m}         +O9&! FZ1             rlqxzfgs|         *R> %CS4        vsgtvo|yXcf|           -Y;)FM4      }vnsmrufZ\[        .V:"%CS6        prru\VQc        ,R?$CY4       kMLTp          +X9! !AV2     qtEN`        '[8$#;Z4       rb@To          (X;##<Y/        pRCXuy            +[:$#@L-       yKE[n        ,Z< %DJ,           ~ CMpyzb        1[:  &ER+         k>`u[             4Y8!"!'EW*       XG|{b           4\=!$I[%      U^i    1^A #JZ%    |}\n~      2]@ $GV'        wfy|                5[>"$EQ-       zl     :^8##FT.     |p            @^5"'JV)      wu        9U?#&DX-       pr~       5VB$!BZ0      |`oy         6W?(CZ1     y}sVsy        .\D" @`0          |z]T{~       .[@"& @a0            }|qSZt        1Y>$%B[,     xp{}yd[_|m       0^>  "BT-            xnqzwuc_em          3W>#%AS.            x|}mewtq_grp        -SD$#!BX.       xv}gSlkcuwuw             *ZA!$"CV3             stkaz|mlzu}e         1Y@$!!AW/           plw}sr{{e        .VC#D[*   {m}u{z|u           +\BCZ(  xyu~              ,[B=^-   {~y{y||~}zzz        -T><Z4        zt}{}wl_WTT\fwtlrod`bjv{        &L?$>T,   |pt~k\YZ[amx||}~}na[XUZiyx           $JA!?T" tq~tcXZbhjmrwyj^\UNQZfvr        $P?AN xoga\_cdbekrut~{nmfXTX]gxx      $S==J z|ga_\Z\cglwzuyyiijdbbcdfm       #U>8I& se_WTPQakgksv~gXY``bmd^w   %N>6M$  wlrkaea]iidu}ymTTal^OXy|{     "NB :U,  xyyxm_hwvty~a_swntrid\^XXtu      )SA#@X,  zxpefdZ[_^jw~rdwwil}vm^[YZow            3W=#"(?_+}}wlYVl{nYURLOXan~vw~jfec]Wh|      1_?(,@b+  ~xttZVnxwvl^SRUW`qsj^QW^TVpz      2a?,"G`(  rp{ytw|yzYSo{ibffkpoosuspy{xsjbZ\UGTtu    /YA!&I\.       rv}tmjszp_Wp}fT^p|}}txqlnrw|~zwxcL[l      (QD&C^1      ywncdjqb[v}xrpov~wtxkeuvvv]cxb        &SA&! !DY,       ~cimd`g~|~wonqsx}i`o~vpp]         &SA#!"&BR.      rjtkZd[YumW|          &N?" #)BT.    quv`^y^iwp\i             0P8 ! +FQ-        y}oa}gcvyrse^     4V7 +EL,   {kshcv{{u}xVx   2Q:!#*AN-   {rd^szj[-R? #(@R1       y_W~z^    ,T<"%AX/      xVck      +U<'"=Z-       het   +X=%$BY*     vnp      -Z= $FV)      nwx        *X>$ET+    pn       /Z9 @X/     y{      -[<!?[,   w          )V@%A])     t      *T< #'@^,     {y|          %TA$%@\(    {w}           )T?#"@W)        .W<" #?Y,    y      +WB#&AW'    ~x   -S@$*?Q)      |~t    ,RB%&<Q.    |s         .SA!">U-  {v        6[9$BW-   ~y      4_<""CU-  wy|~         3Z@ DW*   uv       3]D?Y'    vy|      /`D"8T/  ~|x}|y    4^@9U/   }~ztx~td}|s|       5b@;T,     z}~wlp{lWxol      2YE?P,      ~skbls\upjt       3UC#! <S,      pl`Xkz~gqugouz      -VA  #9S/     n}xqeTZmumpuhhpwx     .W? !#<Q-    zzytiWQY`tmklljsz      -Z@"#"<M,   ysynUOVQemqmskbm     +ZD "!8O.     {z{^GRJQuvvtpc_s     /TC!7O1    spnQUE9upzyeaz       3R=" ;N0     zngxsQ\V8a~upsih~      6S:"<R-   bbXTXC^yctuns      4R:!:S/   v\xmTVIZ|feywx    1X>$:M/     tronyzdm~YWRUo^os{    2X@!@N,   ohuy}rtj\TS~`Zw}p          .V@DT,     ||~pf[WtpQe~tw        ,Q>"=S2{{ynprf[l[\o{s{           3T8 !=T2   ~jfosiksYboy{o    0Z;" #=U5     ~mfktsq||`Sel{rn}    *T@#%>X8     ymYc{vivkynmeMZfg~sot      -N@"#AY7   y~eTdkdmplw|h_vhWZ^^gkfy    .Q?'@V9  |dZ_ULd||en|zwuwrabr^YZ^^Ubicz    -R@%@Y5    |ncaR>Lm|uagyzllx~r`rykb]]__XPai`u     0W@!%<V5    o{pbkgMHbqobejkolbgh_csmeYW[XMISfx^`{         2X=""8Y5 bfr[Wdam~zvrdUX_YY^`_b]ieb_SRXSMVH@VuyUV     /Q? ?d/ WXnwjWbjbg|{sodbcXX\_gpf_fkjbd]X[UJKSWRfrsNR  ,PA"@[0tHQz|kgWN]m|wbdeY[bhhehg\W`cioncVUSIFGCEM[zzbM[x        -ZD!@U.e;O|jPO^TVaYTTLFJQUUW^e`_bWJLTRU[U]p_J^   .[D>[,\7Nz~sTSgeVKEEMSQMIJUcrfY_YQ[]`mfo|_Mb 3YD #?R+  X.Myz|r]aXQPYgkowwvywuugcd`fnnz}pt\Sn    <\@$=N+  K1Qu{zwaFOdqz{k_n}pvt`^t}z   8^>$ :T. B:Vzz~}}zZZ{w}{gdse  1VC !;U3qBJaqr}zp}~lex|cb1RD#"?R3   lGS[mzisnhq] 8UB$!@R-   jHW`~gi~ptr4UC!8U1   mM`m|xtnz}{u} 1PB 9T3  xZixtp{xvmr}  1K?"!8Q9 go|xq}}y~{    0O=# 5]>  tpsry~-U?9f;  spt~x     *[E>^8  zmsrxy~  4[?B[1 }tr}~jts     4_?!!=[4    {pyqoun  1]@%&8R9kllvvy   1Z= &>P4 {dswt      3V=$@R6 kf{|{~  4U;%$9Q9 hk~v    0\;#'=N1  |xgpi    ._<(AN. xvg}ept   1Z?"&<S/ |uuuwh_}ro       -VD!##=V,  }~oxtQls`     &XG'?L2}uV]ch     0TA#%@N-     {y`VsZx    3T?&! AS$        z~cVye_     2V>%## ;S,      }nWu{at         .T?"">W-    y}akoc       -T<! &EO&      }sy||d}ih     /P=(&DO'      nrz}y}nr|by     *Q>"!GX$     kvyvsmjrlkxzzjp]     /W; EY)        odr{a~_]^acn~xtsen       ,V= #BU,           f_ekfXdhBIaqvr~z|d     &WB!EY(          tid^W_}IDdv|ywthpf     -XA#DX,        zogZTh]AWq|zp|pgvu{     1Y@&FV,     qf\Sgj@T~zppw{uuxy}        1X@%IY,      lYNZ{v^dukoxypsut{m     )\B"$F^5         eQYfktpxtmjsv}rrmn~tf    #VD$Ac8  dar{~ss{ynicgw{k     )V> #?_:      otywzk\W`lwk{         +Z>  B[4     lSU^ftqh}      ,Y?!A^+        }`UZYdwqn}  *_?! AZ*           ~|dTQOQbrsfy       /^> !<\1          |n`SHKVaur`j       -XB  !9\5      }qcZIDNQ]yf[             *SB!D`,        ~vxgYOHMROYrvZg        +RC# EY/       {qmxkXQJHQSQWle_~       'RF!!AW5           ~qomlh\QMMLKSSRdo_i        (XA@]1              wpuo^NIPRHGOQSaqrZ\{          '_C!@Y2          zpkdRHJLMJHLSWUarPPvox         *]I BZ.             }wo^MNOJJJEEPSLa{\Npko       1_E $#@W,       to\MLOKDFIHKMOf~zsiRXjk      2bC $'AR.        ~xrncQJRREBJJLOJNVV[SIqhj        0TC%"%*?O1      ywrmjcVLNRIDHNUSNHNLFkg\t           3T?&$&'@O/        }{ztigeWOOO]q]MS]XSwi\sox         2T@'&#$CR)       ufycaopigjgXSYV]ibz}eX|       2V>'%&ER+                  y}k]jqeOMPW^rjk}{fSc     1XA%$AR+           zhjpdfiwvneo          .VD!%8X0    ywwrt            /^C#:]1            nw           0^D#<_+             }p|           .YD !>Y0          yr            /Y@!DV/         nw               5Z; B\-       un         4]<=]2             z              0^C$?T5                      3^G*CM2                     ;\A$'DN*                        7U@& !AT(                    3RA%!#>W%                       .ZC"!$>Q%                                ,YF&@P&                          .VD# #>Q(                          ._A !<Q-                               *[C =W-                       .Y? "! <V0                      5Y; $!!;U6                  }             3W> "" =W7               y                2`=$  BW0              zz            /\?"!!EX%                      h|            'XB" 'DO+              `wu               $XA (FK(         \qtyz                )R?$  ?V*                  wyYndm~}vqx                )V> !@U-          zfajZe|k_gy             )V>!"@T(           ZrkYc`Sc               *T<"%:[,                 \vZNc}             -T=#";Q4               inl                 +WB <O0            vy                   -[?@S)           r                  .^;$<P/                             .];&8S1                             ,VB"!#;M5                                  /QD%;T9          {                   -RD&@X2             vq                     &VD$ ;U4             yup           'PE' 7W4                mojz                     +NE&!9W2           quhgu                   1Y;$?V,              v|uxWwk                  -X=  !CS&                   oz\k               /\=#BQ/         rw~eZmz              1_<$CS2                   viwSid               .]CCY-         pt}~|Idypjjly                    %_F =Z/                sgkQxpxkdenx                          "]I! :[3                hkZbh|mfsyu                    /]A !:Y5                    nwKg~uww{j               3Y?%"6X6             zkGwv}ukj                   .T?!   =W3                    ~R^ovorjx                    *S?$"AU1                              s}Bpxkkp                        1S8($%CP+                  xq|_x=V{iby                   1P;("'BR*                         ~bsQikTGjtZk                  +RB%!$=T,                  ma|SN}wei                     .Q>#  #>R-                     }}s]cb:\ryjh~                          1T;""DW)                    rryn]ScE7dqxfaj~                                  -X<#!?V,                          njfRMdqD:i|vn}                          +N='! >Y-                          ^`YH\~kC?f                       ,O;#%!AR&                            ~T[``d}fJCXj~                       -Q6!(CQ#                   z{`{|iVFI^k|                ,T=  $@P(                    ZpzpbYXq                       +TC!">R,                  t]yl{                        .X? @T2                          ~                              0[:AW3                                            0S;$CW.                          b                        3O=&!DU.                                |l                7T9!"FW-                                                   3V;!$GT1                         ry                          3R=$#DV0                       mu                      6T:"#>X2                          tmt                          6Y<""<V3                             pop~s                         6Z=(!:Y1                           ruakdV                          6Y;%$ =X/                        lmrzbKs                                 4V;$"AT+                           prjbXj                                 5X=" #?X*                                {t~`Eq!                                 0VD$!BW(                                     sj_Upy}jd                             +XF" #>P-                        t\Kn{kr                        .YB!##;P3                       L^~cz                             0Y@ "#!>T3                    jL{j|rv                                 1_=%!AS0                         wnc]w                         3\<!# !>T/                        zqk~                                   3Z;"#@Y.                             eqob`h                                        .X=#!%AP.                                     zpdR[                          0T?&'9O5                                                         ,RD$""8R7                                                    -WA <T4                                                       8X8!!AU/                                                         8X8 !?V.                                                                          4Z< !!!=Y0                                                                         3W="!"<T4                                                                     4W>!$;R7                                                            /YA=Z.                                                           *]AA_*                                                                                *\?"=Y0                                                               *XA  <W3                                                                    +Y?!@X1                                                            .Y> AW/                                                       +TC& >V.                                                                /S?%=W-                                                                3N;'"  @W+                                                                    1P;#$!BW(                                                                      -S=#"=X0                                                                   ,Q?  ;X3                                                                     +S= ?W0                                                                                 .U9AU.                                                                                               /Z:<X4                                                                                                     .\= =U3                                                                          .Z@<T2                                                                                                      'XC  ;S1                                                                                                                       %VD!?V)                                                                                  "TD !B\$                                                                                                   &QB"!!CT)                                                                                                           *QA%!@Q)                                                                                                          'QA& #@P$                                                                                           *TB!!!?R'                                                                                 (XC =Y0                                                                                                           '[C<Z5                                                                                                )[C <Y5                                                                                                 -WB#>S1                                                                                                             .W>!?S.                                                                                                              0U= ?V-                                                                                                 (TC!BX+                                                                                  )VA"!B^*                                                                                                .S@!@^1                                                                                                .U? E`.                                                                                         4R:""Cb/                                                                                          5T9#Bb2                                                                                                         0X:!=_6                                                                                             *Z?;]8                                                                                         /\B?W3                                                                                 :`<>X1                                                                                                          7`=B]0                                                                                              3Y@ Ba1                                                                                          1T@"@`/                                                                                                   3U?A].                                                                                             5\?C_0                                                                                                 2[C D\/                                                                                                          0YB"#?^3                                                                                       /TC$"$"=Y3                                                                                          .TC&"#$?U0                                                                                                     +]C "!#>W2                                                                                                      -[A AY.                                                                                               3V:#"?W/                                                                                                      6U8!"!";W4                                                                                                   7S:! :\4                                                                                                    4S< :Y8                                                                                                  3S> ">V1                                                                                          4V: (>P0                                                                                                      3Z='=Q3                                                                                                  0VC././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/pcolor.py0000666000000000000000000000521000000000000014257 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Ludovic Aubry # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ImageDialog / Pcolor test""" SHOW = True # Show test in GUI-based test launcher import numpy as np from guiqwt.plot import ImageDialog from guiqwt.builder import make def imshow(items): win = ImageDialog( edit=False, toolbar=True, options={"yreverse": False}, wintitle="Pcolor test" ) plot = win.get_plot() for item in items: plot.add_item(item) win.show() win.exec_() def polar_demo(N=300): r = np.linspace(1.0, 16, N) th = np.linspace(0.0, np.pi, N) R, TH = np.meshgrid(r, th) X = R * np.cos(TH) Y = R * np.sin(TH) Z = 4 * TH + R + np.random.randint(-8, 8, size=(N, N)) ix = np.random.randint(N, size=(int(N / 20),)) iy = np.random.randint(N, size=(int(N / 20),)) Z[ix, iy] = np.nan return X, Y, Z def compute_quads(N=300): X, Y, Z = polar_demo(N) item = make.pcolor(X, Y, Z) return [item] def compute_quads2(N=4): x = np.linspace(0, N - 1, N) X, Y = np.meshgrid(x, x) Z = X ** 2 + Y ** 2 Z = Z.reshape((8, 2)) item = make.pcolor(Z) # checks if X, Y are properly generated in make.pcolor return [item] def compute_quads3(): pi = np.pi cos = np.cos sin = np.sin items = [] for i, t in enumerate(np.linspace(0, 2 * pi, 16)): X = np.array([[0.0, cos(t)], [-sin(t), cos(t) - sin(t)]]) Y = np.array([[0.0, sin(t)], [cos(t), sin(t) + cos(t)]]) Z = np.array([[1.0, 2.0], [3.0, 4.0]]) item = make.pcolor(X - 16 + 2 * i, Y - 3, Z) items.append(item) return items def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- items = compute_quads() + compute_quads3() imshow(items) def valgrind_test(K=200): from guiqwt._scaler import _scale_quads from time import time X, Y, Z = polar_demo() lut = (1.0, 0.0, None, np.zeros((1024,), np.uint32)) offscreen = np.zeros((1200, 1920), np.uint32) border = 1 flat = 0 uflat = 0.5 vflat = 0.5 interpolate = (flat, uflat, vflat) src_rect = (X.min(), Y.min(), X.max(), Y.max()) dst_rect = (0, 0, 1920, 1200) t0 = time() for count in range(K): dest = _scale_quads( X, Y, Z, src_rect, offscreen, dst_rect, lut, interpolate, border ) print((time() - t0) / K, " secs per loop") if __name__ == "__main__": test() # valgrind_test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/plot.py0000666000000000000000000000345600000000000013751 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """CurveDialog test""" SHOW = True # Show test in GUI-based test launcher from qtpy.QtGui import QFont from guiqwt.plot import CurveDialog from guiqwt.builder import make def plot(*items): win = CurveDialog( edit=False, toolbar=True, wintitle="CurveDialog test", options=dict(title="Title", xlabel="xlabel", ylabel="ylabel"), ) plot = win.get_plot() for item in items: plot.add_item(item) # plot.set_axis_font("left", QFont("Courier")) win.get_itemlist_panel().show() plot.set_items_readonly(False) win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from numpy import linspace, sin x = linspace(-10, 10, 200) dy = x / 100.0 y = sin(sin(sin(x))) x2 = linspace(-10, 10, 20) y2 = sin(sin(sin(x2))) curve2 = make.curve(x2, y2, color="g", curvestyle="Sticks") curve2.setTitle("toto") plot( make.curve(x, y, color="b"), curve2, make.curve(x, sin(2 * y), color="r"), make.merror(x, y / 2, dy), make.label("Relative position outside", (x[0], y[0]), (-10, -10), "BR"), make.label("Relative position inside", (x[0], y[0]), (10, 10), "TL"), make.label("Absolute position", "R", (0, 0), "R"), make.legend("TR"), make.marker( position=(5.0, 0.8), label_cb=lambda x, y: "A = %.2f" % x, markerstyle="|", movable=False, ), ) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/plot_log.py0000666000000000000000000000171300000000000014604 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Logarithmic scale test for curve plotting""" SHOW = False # Do not show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.builder import make def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- import numpy as np x = np.linspace(1, 10, 200) y = np.exp(-x) y[0] = 0 item = make.curve(x, y, color="b") item = make.error(x, y, None, y * 0.23) win = CurveDialog() plot = win.get_plot() plot.set_axis_scale("left", "log") plot.set_axis_scale("bottom", "log") # plot.set_axis_limits("left", 4.53999297625e-05, 22026.4657948) plot.add_item(item) win.show() win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/plot_yreverse.py0000666000000000000000000000152000000000000015663 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Reverse y-axis test for curve plotting""" SHOW = False # Do not show test in GUI-based test launcher from guiqwt.plot import CurveDialog from guiqwt.builder import make def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- import numpy as np x = np.linspace(-10, 10, 200) y = x * np.exp(-x) item = make.curve(x, y, color="b") win = CurveDialog() plot = win.get_plot() plot.add_item(item) plot.set_axis_direction("left", True) plot.set_axis_direction("bottom", True) win.show() win.exec_() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/png_test.py0000666000000000000000000000121200000000000014602 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2020 Pierre Raybaut """PNG icons test (finding unsupported ICC profile Qt warnings)""" SHOW = False # Do not show test in GUI-based test launcher import sys import os import os.path as osp import guiqwt.config # Loading guiqwt icon paths from guidata.configtools import get_icon, IMG_PATH from guidata import qapplication app = qapplication() # get_icon("expander_down.png") # get_icon("trash.png") for path in IMG_PATH: for name in os.listdir(path): full_path = osp.abspath(osp.join(path, name)) # print(full_path, file=sys.stderr) get_icon(name) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/polygons.py0000666000000000000000000000426700000000000014646 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2011 CEA # Ludovic Aubry # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """PolygonMapItem test PolygonMapItem is intended to display maps ie items containing several hundreds of independent polygons. """ SHOW = True # Show test in GUI-based test launcher from guiqwt.plot import ImageDialog from guiqwt.curve import PolygonMapItem from numpy.random import rand, randint from numpy import concatenate, linspace, int32, uint32, zeros, empty, pi, cos, sin # Create a sample dataset consisting of tesselated circles randomly placed # in a box RMAX = 0.5 XMAX = YMAX = 10.0 NSEGMIN = 4 NSEGMAX = 300 def create_circle(): x, y, rmax = rand(3) rmax *= RMAX x *= XMAX y *= YMAX nseg = randint(NSEGMIN, NSEGMAX) th = linspace(0, 2 * pi, nseg) PTS = empty((nseg, 2), float) PTS[:, 0] = x + rmax * cos(th) PTS[:, 1] = y + rmax * sin(th) return PTS NCIRC = 1000 COLORS = [ (0xFF000000, 0x8000FF00), (0xFF0000FF, 0x800000FF), (0xFF000000, 0x80FF0000), (0xFF00FF00, 0x80000000), ] def test(): win = ImageDialog(edit=True, toolbar=True, wintitle="Sample multi-polygon item") plot = win.get_plot() plot.set_aspect_ratio(lock=True) plot.set_antialiasing(False) plot.set_axis_direction("left", False) plot.set_axis_title("bottom", "Lon") plot.set_axis_title("left", "Lat") points = [] offsets = zeros((NCIRC, 2), int32) colors = zeros((NCIRC, 2), uint32) npts = 0 for k in range(NCIRC): pts = create_circle() offsets[k, 0] = k offsets[k, 1] = npts npts += pts.shape[0] points.append(pts) colors[k, 0] = COLORS[k % len(COLORS)][0] colors[k, 1] = COLORS[(3 * k) % len(COLORS)][1] points = concatenate(points) print(NCIRC, "Polygons") print(points.shape[0], "Points") crv = PolygonMapItem() crv.set_data(points, offsets, colors) plot.add_item(crv, z=0) win.show() win.exec_() if __name__ == "__main__": import guidata app = guidata.qapplication() test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/pyplot.py0000666000000000000000000000356100000000000014317 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ pyplot test Interactive plotting interface with MATLAB-like syntax """ SHOW = True # Show test in GUI-based test launcher import numpy as np from guiqwt.pyplot import * def main(): x = np.linspace(-5, 5, 1000) figure(1) subplot(2, 1, 1) plot(x, np.sin(x), "r+") plot(x, np.cos(x), "g-") errorbar(x, -1 + x ** 2 / 20 + 0.2 * np.random.rand(len(x)), x / 20) xlabel("Axe x") ylabel("Axe y") subplot(2, 1, 2) img = np.fromfunction( lambda x, y: np.sin((x / 200.0) * (y / 200.0) ** 2), (1000, 1000) ) xlabel("pixels") ylabel("pixels") zlabel("intensity") gray() imshow(img) # savefig("D:\\test1.pdf", draft=True) figure("table plot") data = np.array([x, np.sin(x), np.cos(x)]).T plot(data) figure("simple plot") subplot(1, 2, 1) plot(x, np.tanh(x + np.sin(12 * x)), "g-", label="Tanh") legend() subplot(1, 2, 2) plot(x, np.sinh(x), "r:", label="SinH") # savefig("D:\\test2.pdf") # savefig("D:\\test2.png") show() figure("semilogx") semilogx(x, np.sin(12 * x), "g-") show() figure("plotyy") plotyy(x, np.sin(x), x, np.cos(x)) ylabel("sinus", "cosinus") show() figure("hist") from numpy.random import normal data = normal(0, 1, (2000,)) hist(data) show() figure("pcolor 1") r = np.linspace(1.0, 16, 100) th = np.linspace(0.0, np.pi, 100) R, TH = np.meshgrid(r, th) X = R * np.cos(TH) Y = R * np.sin(TH) Z = 4 * TH + R pcolor(X, Y, Z) figure("pcolor 2") pcolor(Z) hot() show() if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/qtdesigner.py0000666000000000000000000000205500000000000015132 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # -*- coding: utf-8 -*- """ Testing guiqwt QtDesigner plugins These plugins provide CurveWidget and ImageWidget objects embedding in GUI layouts directly from QtDesigner. """ SHOW = True # Show test in GUI-based test launcher import sys, os.path as osp from qtpy.QtWidgets import QApplication from guiqwt.qtdesigner import loadui from guiqwt.builder import make FormClass = loadui(osp.splitext(__file__)[0] + ".ui") class TestWindow(FormClass): def __init__(self, image_data): super(TestWindow, self).__init__() plot = self.imagewidget.plot plot.add_item(make.image(image_data)) self.setWindowTitle("QtDesigner plugins example") if __name__ == "__main__": app = QApplication(sys.argv) from guiqwt.tests.image import compute_image form = TestWindow(compute_image()) form.show() sys.exit(app.exec_()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1442242734.0 guiqwt-4.0.1/guiqwt/tests/qtdesigner.ui0000666000000000000000000000174100000000000015120 0ustar00 Dialog 0 0 500 800 Dialog Qt::Vertical ImageWidget CurveWidget
guiqwt.plot
CurveWidget QwtPlot
guiqwt.plot
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/resize.py0000666000000000000000000000121500000000000014263 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Resize test: using the scaler C++ engine to resize images""" SHOW = True # Show test in GUI-based test launcher def test(): """Test""" import os.path as osp from guiqwt import io, scaler, pyplot as plt filename = osp.join(osp.dirname(__file__), "brain.png") data = io.imread(filename) dst_image = scaler.resize(data, (2000, 3000)) plt.imshow(dst_image, interpolation="nearest") plt.show() if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/rotatecrop.py0000666000000000000000000000543600000000000015155 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Rotate/crop test: using the scaler C++ engine to rotate/crop images""" SHOW = True # Show test in GUI-based test launcher import os.path as osp import numpy as np from guiqwt.builder import make from guiqwt.plot import ImageDialog from guiqwt.widgets.rotatecrop import ( RotateCropDialog, RotateCropWidget, MultipleRotateCropWidget, ) from guiqwt import io def imshow(data, title=None, hold=False): dlg = ImageDialog(wintitle=title) dlg.get_plot().add_item(make.image(data)) if hold: dlg.show() else: dlg.exec_() def create_test_data(fname, func=None): array0 = io.imread(osp.join(osp.dirname(__file__), fname), to_grayscale=True) if func is not None: array0 = func(array0) item0 = make.trimage(array0, dx=0.1, dy=0.1) return array0, item0 def widget_test(fname, qapp): """Test the rotate/crop widget""" array0, item = create_test_data(fname) widget = RotateCropWidget(None) widget.set_item(item) widget.show() qapp.exec_() widget.accept_changes() def multiple_widget_test(fname, qapp): """Test the multiple rotate/crop widget""" array0, item0 = create_test_data(fname) array1, item1 = create_test_data(fname, func=lambda arr: np.rot90(arr, 1)) array2, item2 = create_test_data(fname, func=lambda arr: np.rot90(arr, 2)) widget = MultipleRotateCropWidget(None) widget.set_items(item0, item1, item2) widget.show() qapp.exec_() widget.accept_changes() def dialog_test(fname, interactive=True): """Test the rotate/crop dialog""" array0, item = create_test_data(fname) dlg = RotateCropDialog(None) dlg.set_item(item) if interactive: ok = dlg.exec_() else: dlg.show() dlg.accept() ok = True if ok: array1 = dlg.output_array if array0.shape == array1.shape: if (array1 == array0).all() and not interactive: print("Test passed successfully.") return imshow(array1 - array0, title="array1-array0") else: print(array0.shape, "-->", array1.shape) imshow(array0, title="array0", hold=True) imshow(array1, title="array1") if __name__ == "__main__": from guidata import qapplication qapp = qapplication() # analysis:ignore multiple_widget_test("brain.png", qapp) widget_test("brain.png", qapp) dialog_test(fname="brain.png", interactive=False) # dialog_test(fname="contrast.png", interactive=False) dialog_test(fname="brain.png", interactive=True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625903.0 guiqwt-4.0.1/guiqwt/tests/sift.py0000666000000000000000000015257200000000000013744 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2010-2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ SIFT, the Signal and Image Filtering Tool Simple signal and image processing application based on guiqwt and guidata """ SHOW = True # Show test in GUI-based test launcher from qtpy.QtWidgets import ( QMainWindow, QMessageBox, QSplitter, QListWidget, QVBoxLayout, QHBoxLayout, QWidget, QTabWidget, QMenu, QApplication, ) from qtpy.QtGui import QCursor from qtpy.QtCore import Qt, __version__, Signal from qtpy import PYQT5 from qtpy.compat import getopenfilenames, getsavefilename import sys import platform import os.path as osp import os import numpy as np from guidata.dataset.datatypes import DataSet, ValueProp from guidata.dataset.dataitems import ( IntItem, FloatArrayItem, StringItem, ChoiceItem, FloatItem, DictItem, BoolItem, ) from guidata.dataset.qtwidgets import DataSetEditGroupBox from guidata.configtools import get_icon from guidata.qthelpers import ( create_action, add_actions, get_std_icon, win32_fix_title_bar_background, ) from guidata.widgets.console import DockableConsole from guidata.qtwidgets import DockableWidget, DockableWidgetMixin from guidata.utils import update_dataset from guiqwt.config import _ from guiqwt.plot import CurveWidget, ImageWidget from guiqwt.builder import make APP_NAME = _("Sift") APP_DESC = _( """Signal and Image Filtering Tool
Simple signal and image processing application based on guiqwt and guidata""" ) VERSION = "0.2.8" def normalize(yin, parameter="maximum"): """ Normalize input array *yin* with respect to parameter *parameter* Support values for *parameter*: 'maximum' (default), 'amplitude', 'sum', 'energy' """ axis = len(yin.shape) - 1 if parameter == "maximum": maximum = np.max(yin, axis) if axis == 1: maximum = maximum.reshape((len(maximum), 1)) maxarray = np.tile(maximum, yin.shape[axis]).reshape(yin.shape) return yin / maxarray elif parameter == "amplitude": ytemp = np.array(yin, copy=True) minimum = np.min(yin, axis) if axis == 1: minimum = minimum.reshape((len(minimum), 1)) ytemp -= minimum return normalize(ytemp, parameter="maximum") elif parameter == "sum": return yin / yin.sum() elif parameter == "energy": return yin / (yin * yin.conjugate()).sum() else: raise RuntimeError("Unsupported parameter %s" % parameter) def xy_fft(x, y): """Compute FFT on X,Y data""" y1 = np.fft.fft(y) x1 = np.fft.fftshift(np.fft.fftfreq(x.shape[-1], d=x[1] - x[0])) return x1, y1 def xy_ifft(x, y): """Compute iFFT on X,Y data""" y1 = np.fft.ifft(y) x1 = np.fft.fftshift(np.fft.fftfreq(x.shape[-1], d=x[1] - x[0])) return x1, y1 def flatfield(rawdata, flatdata): """Compute flat-field correction""" dtemp = np.array(rawdata, dtype=np.float64, copy=True) * flatdata.mean() dunif = np.array(flatdata, dtype=np.float64, copy=True) dunif[dunif == 0] = 1.0 return np.array(dtemp / dunif, dtype=rawdata.dtype) class SignalParam(DataSet): title = StringItem(_("Title"), default=_("Untitled")) xydata = FloatArrayItem(_("Data"), transpose=True, minmax="rows") def copy_data_from(self, other, dtype=None): self.xydata = np.array(other.xydata, copy=True, dtype=dtype) def change_data_type(self, dtype): self.xydata = np.array(self.xydata, dtype=dtype) def get_data(self): if self.xydata is not None: return self.xydata[1] def set_data(self, data): self.xydata[1] = data data = property(get_data, set_data) class SignalParamNew(DataSet): title = StringItem(_("Title"), default=_("Untitled")) xmin = FloatItem("Xmin", default=-10.0) xmax = FloatItem("Xmax", default=10.0) size = IntItem( _("Size"), help=_("Signal size (total number of points)"), min=1, default=500 ) type = ChoiceItem( _("Type"), (("rand", _("random")), ("zeros", _("zeros")), ("gauss", _("gaussian"))), ) class ImageParam(DataSet): def __init__(self, title=None, comment=None, icon=""): DataSet.__init__(self, title, comment, icon) self._template = None @property def size(self): """Returns (width, height)""" return self.data.shape[1], self.data.shape[0] def update_metadata(self, value): self.metadata = {} for attr_str in dir(value): if attr_str != "GroupLength": self.metadata[attr_str] = getattr(value, attr_str) @property def template(self): return self._template @template.setter def template(self, value): self.update_metadata(value) self._template = value @property def pixel_spacing(self): if self.template is not None: return self.template.PixelSpacing else: return None, None @pixel_spacing.setter def pixel_spacing(self, value): if self.template is not None: dx, dy = value self.template.PixelSpacing = [dx, dy] self.update_metadata(self.template) title = StringItem(_("Title"), default=_("Untitled")) data = FloatArrayItem(_("Data")) metadata = DictItem(_("Metadata"), default=None) def copy_data_from(self, other, dtype=None): self.data = np.array(other.data, copy=True, dtype=dtype) self.template = other.template def change_data_type(self, dtype): self.data = np.array(self.data, dtype=dtype) class ImageParamNew(DataSet): title = StringItem(_("Title"), default=_("Untitled")) height = IntItem( _("Height"), help=_("Image height (total number of rows)"), min=1, default=500 ) width = IntItem( _("Width"), help=_("Image width (total number of columns)"), min=1, default=500 ) dtype = ChoiceItem( _("Data type"), ( (np.uint8, "uint8"), (np.int16, "uint16"), (np.float32, "float32"), (np.float64, "float64"), ), ) type = ChoiceItem( _("Type"), ( ("zeros", _("zeros")), ("empty", _("empty")), ("rand", _("random")), ), ) class ObjectFT(QSplitter): """Object handling the item list, the selected item properties and plot""" PARAMCLASS = None PREFIX = None SIG_OBJECT_ADDED = Signal() SIG_STATUS_MESSAGE = Signal(str) def __init__(self, parent, plot): super(ObjectFT, self).__init__(Qt.Vertical, parent) self.plot = plot self.objects = [] # signals or images self.items = [] # associated plot items self.listwidget = None self.properties = None self._hsplitter = None self.file_actions = None self.edit_actions = None self.operation_actions = None self.processing_actions = None self.number = 0 # Object selection dependent actions self.actlist_1more = [] self.actlist_2more = [] self.actlist_1 = [] self.actlist_2 = [] # ------Setup widget, menus, actions def setup(self, toolbar): self.listwidget = QListWidget() self.listwidget.setAlternatingRowColors(True) self.listwidget.setSelectionMode(QListWidget.ExtendedSelection) self.properties = DataSetEditGroupBox(_("Properties"), self.PARAMCLASS) self.properties.setEnabled(False) self.listwidget.currentRowChanged.connect(self.current_item_changed) self.listwidget.itemSelectionChanged.connect(self.selection_changed) self.properties.SIG_APPLY_BUTTON_CLICKED.connect(self.properties_changed) properties_stretched = QWidget() hlayout = QHBoxLayout() hlayout.addWidget(self.properties) # hlayout.addStretch() vlayout = QVBoxLayout() vlayout.addLayout(hlayout) vlayout.addStretch() properties_stretched.setLayout(vlayout) self.addWidget(self.listwidget) self.addWidget(properties_stretched) # Edit actions duplicate_action = create_action( self, _("Duplicate"), icon=get_icon("copy.png"), triggered=self.duplicate_object, ) self.actlist_1 += [duplicate_action] remove_action = create_action( self, _("Remove"), icon=get_icon("delete.png"), triggered=self.remove_object ) self.actlist_1more += [remove_action] self.edit_actions = [duplicate_action, remove_action] # Operation actions sum_action = create_action(self, _("Sum"), triggered=self.compute_sum) average_action = create_action( self, _("Average"), triggered=self.compute_average ) diff_action = create_action( self, _("Difference"), triggered=self.compute_difference ) prod_action = create_action(self, _("Product"), triggered=self.compute_product) div_action = create_action(self, _("Division"), triggered=self.compute_division) self.actlist_2more += [sum_action, average_action, prod_action] self.actlist_2 += [diff_action, div_action] self.operation_actions = [ sum_action, average_action, diff_action, prod_action, div_action, ] # ------GUI refresh/setup def current_item_changed(self, row): if row != -1: update_dataset(self.properties.dataset, self.objects[row]) self.properties.get() def _get_selected_rows(self): return [ index.row() for index in self.listwidget.selectionModel().selectedRows() ] def selection_changed(self): """Signal list: selection changed""" row = self.listwidget.currentRow() self.properties.setDisabled(row == -1) self.refresh_plot() nbrows = len(self._get_selected_rows()) for act in self.actlist_1more: act.setEnabled(nbrows >= 1) for act in self.actlist_2more: act.setEnabled(nbrows >= 2) for act in self.actlist_1: act.setEnabled(nbrows == 1) for act in self.actlist_2: act.setEnabled(nbrows == 2) def make_item(self, row): raise NotImplementedError def update_item(self, row): raise NotImplementedError def refresh_plot(self): for item in self.items: if item is not None: item.hide() for row in self._get_selected_rows(): item = self.items[row] if item is None: item = self.make_item(row) self.plot.add_item(item) else: self.update_item(row) self.plot.set_item_visible(item, True) self.plot.set_active_item(item) self.plot.do_autoscale() def refresh_list(self, new_current_row="current"): """new_current_row: integer, 'first', 'last', 'current'""" row = self.listwidget.currentRow() self.listwidget.clear() self.listwidget.addItems( [ "%s%03d: %s" % (self.PREFIX, i, obj.title) for i, obj in enumerate(self.objects) ] ) if new_current_row == "first": row = 0 elif new_current_row == "last": row = self.listwidget.count() - 1 elif isinstance(new_current_row, int): row = new_current_row else: assert new_current_row == "current" if row < self.listwidget.count(): self.listwidget.setCurrentRow(row) def properties_changed(self): """The properties 'Apply' button was clicked: updating signal""" row = self.listwidget.currentRow() update_dataset(self.objects[row], self.properties.dataset) self.refresh_list(new_current_row="current") self.listwidget.setCurrentRow(row) self.refresh_plot() def add_object(self, obj): self.objects.append(obj) self.items.append(None) self.refresh_list(new_current_row="last") self.listwidget.setCurrentRow(len(self.objects) - 1) self.SIG_OBJECT_ADDED.emit() # ------Edit operations def duplicate_object(self): row = self._get_selected_rows()[0] obj = self.objects[row] objcopy = self.PARAMCLASS() objcopy.title = obj.title objcopy.copy_data_from(obj) self.objects.insert(row + 1, objcopy) self.items.insert(row + 1, None) self.refresh_list(new_current_row=row + 1) self.refresh_plot() def remove_object(self): rows = sorted(self._get_selected_rows(), reverse=True) for row in rows: self.objects.pop(row) item = self.items.pop(row) self.plot.del_item(item) self.refresh_list(new_current_row="first") self.refresh_plot() # ------Operations def compute_sum(self): rows = self._get_selected_rows() sumobj = self.PARAMCLASS() sumobj.title = "+".join(["%s%03d" % (self.PREFIX, row) for row in rows]) try: for row in rows: obj = self.objects[row] if sumobj.data is None: sumobj.copy_data_from(obj) else: sumobj.data += obj.data except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return self.add_object(sumobj) def compute_average(self): rows = self._get_selected_rows() sumobj = self.PARAMCLASS() title = ", ".join(["%s%03d" % (self.PREFIX, row) for row in rows]) sumobj.title = _("Average") + ("(%s)" % title) original_dtype = self.objects[rows[0]].data.dtype try: for row in rows: obj = self.objects[row] if sumobj.data is None: sumobj.copy_data_from(obj, dtype=np.float64) else: sumobj.data += obj.data except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return sumobj.data /= float(len(rows)) sumobj.change_data_type(dtype=original_dtype) self.add_object(sumobj) def compute_product(self): rows = self._get_selected_rows() sumobj = self.PARAMCLASS() sumobj.title = "*".join(["%s%03d" % (self.PREFIX, row) for row in rows]) try: for row in rows: obj = self.objects[row] if sumobj.data is None: sumobj.copy_data_from(obj) else: sumobj.data *= obj.data except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return self.add_object(sumobj) def compute_difference(self): rows = self._get_selected_rows() diffobj = self.PARAMCLASS() diffobj.title = "-".join(["%s%03d" % (self.PREFIX, row) for row in rows]) try: obj0, obj1 = self.objects[rows[0]], self.objects[rows[1]] diffobj.copy_data_from(obj0) diffobj.data = obj0.data - obj1.data except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return self.add_object(diffobj) def compute_division(self): rows = self._get_selected_rows() diffobj = self.PARAMCLASS() diffobj.title = "/".join(["%s%03d" % (self.PREFIX, row) for row in rows]) try: obj0, obj1 = self.objects[rows[0]], self.objects[rows[1]] diffobj.copy_data_from(obj0) diffobj.data = obj0.data / obj1.data except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return self.add_object(diffobj) # ------Data Processing def apply_11_func(self, obj, orig, func, param): if param is None: obj.data = func(orig.data) else: obj.data = func(orig.data, param) def compute_11( self, name, func, param=None, one_param_for_all=True, suffix=None, func_obj=None ): if param is not None and one_param_for_all: if not param.edit(parent=self.parent()): return rows = self._get_selected_rows() for row in rows: if param is not None and not one_param_for_all: if not param.edit(parent=self.parent()): return orig = self.objects[row] obj = self.PARAMCLASS() obj.title = "%s(%s%03d)" % (name, self.PREFIX, row) if suffix is not None: obj.title += "|" + suffix(param) obj.copy_data_from(orig) self.SIG_STATUS_MESSAGE.emit(_("Computing:") + " " + obj.title) QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) self.repaint() try: self.apply_11_func(obj, orig, func, param) if func_obj is not None: func_obj(obj) except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return finally: self.SIG_STATUS_MESSAGE.emit("") QApplication.restoreOverrideCursor() self.add_object(obj) class SignalFT(ObjectFT): PARAMCLASS = SignalParam PREFIX = "s" # ------ObjectFT API def setup(self, toolbar): ObjectFT.setup(self, toolbar) # File actions new_action = create_action( self, _("New signal..."), icon=get_icon("filenew.png"), tip=_("Create a new signal"), triggered=self.new_signal, ) open_action = create_action( self, _("Open signal..."), icon=get_icon("fileopen.png"), tip=_("Open a signal"), triggered=self.open_signal, ) save_action = create_action( self, _("Save signal..."), icon=get_icon("filesave.png"), tip=_("Save selected signal"), triggered=self.save_signal, ) self.actlist_1more += [save_action] self.file_actions = [new_action, open_action, save_action] # Operation actions roi_action = create_action( self, _("ROI extraction"), triggered=self.extract_roi ) swapaxes_action = create_action( self, _("Swap X/Y axes"), triggered=self.swap_axes ) self.actlist_1more += [roi_action, swapaxes_action] self.operation_actions += [None, roi_action, swapaxes_action] # Processing actions normalize_action = create_action(self, _("Normalize"), triggered=self.normalize) lincal_action = create_action( self, _("Linear calibration"), triggered=self.calibrate ) gaussian_action = create_action( self, _("Gaussian filter"), triggered=self.compute_gaussian ) wiener_action = create_action( self, _("Wiener filter"), triggered=self.compute_wiener ) fft_action = create_action( self, _("FFT"), tip=_("Warning: only real part is plotted"), triggered=self.compute_fft, ) ifft_action = create_action( self, _("Inverse FFT"), tip=_("Warning: only real part is plotted"), triggered=self.compute_ifft, ) self.actlist_1more += [ normalize_action, lincal_action, gaussian_action, wiener_action, fft_action, ifft_action, ] self.processing_actions = [ normalize_action, lincal_action, None, gaussian_action, wiener_action, fft_action, ifft_action, ] add_actions(toolbar, [new_action, open_action, save_action]) def make_item(self, row): signal = self.objects[row] data = signal.xydata if len(data) == 2: # x, y signal x, y = data item = make.mcurve(x, y.real, label=signal.title) elif len(data) == 4: # x, y, dx, dy error bar signal x, y, dx, dy = data item = make.merror(x, y.real, dx, dy, label=signal.title) else: raise RuntimeError("data not supported") self.items[row] = item return item def update_item(self, row): signal = self.objects[row] item = self.items[row] data = signal.xydata if len(data) == 2: # x, y signal x, y = data item.set_data(x, y.real) elif len(data) == 4: # x, y, dx, dy error bar signal x, y, dx, dy = data item.set_data(x, y.real, dx, dy) item.curveparam.label = signal.title # ------Signal operations def extract_roi(self): class ROIParam(DataSet): row1 = IntItem(_("First row index"), default=0, min=-1) row2 = IntItem(_("Last row index"), default=-1, min=-1) param = ROIParam(_("ROI extraction")) self.compute_11( "ROI", lambda x, y, p: (x.copy()[p.row1 : p.row2], y.copy()[p.row1 : p.row2]), param, suffix=lambda p: "rows=%d:%d" % (p.row1, p.row2), ) def swap_axes(self): self.compute_11("SwapAxes", lambda x, y: (y, x)) # ------Signal Processing def apply_11_func(self, obj, signal, func, param): data = signal.xydata if len(data) == 2: # x, y signal x, y = data if param is None: obj.xydata = func(x, y) else: obj.xydata = func(x, y, param) elif len(data) == 4: # x, y, dx, dy error bar signal x, y, dx, dy = data if param is None: x2, y2 = func(x, y) _x3, dy2 = func(x, dy) else: x2, y2 = func(x, y, param) dx2, dy2 = func(dx, dy, param) obj.xydata = x2, y2, dx, dy2 def normalize(self): methods = ( (_("maximum"), "maximum"), (_("amplitude"), "amplitude"), (_("sum"), "sum"), (_("energy"), "energy"), ) class NormalizeParam(DataSet): method = ChoiceItem(_("Normalize with respect to"), methods) param = NormalizeParam(_("Normalize")) def func(x, y, p): return x, normalize(y, p.method) self.compute_11("Normalize", func, param, suffix=lambda p: "ref=%s" % p.method) def calibrate(self): axes = (("x", _("X-axis")), ("y", _("Y-axis"))) class CalibrateParam(DataSet): axis = ChoiceItem(_("Calibrate"), axes, default="y") a = FloatItem("a", default=1.0) b = FloatItem("b", default=0.0) param = CalibrateParam(_("Linear calibration"), "y = a.x + b") def func(x, y, p): if p.axis == "x": return p.a * x + p.b, y else: return x, p.a * y + p.b self.compute_11( "LinearCal", func, param, suffix=lambda p: "%s=%s*%s+%s" % (p.axis, p.a, p.axis, p.b), ) def compute_wiener(self): import scipy.signal as sps def func(x, y): return x, sps.wiener(y) self.compute_11("WienerFilter", func) def compute_gaussian(self): class GaussianParam(DataSet): sigma = FloatItem("σ", default=1.0) param = GaussianParam(_("Gaussian filter")) import scipy.ndimage as spi def func(x, y, p): return x, spi.gaussian_filter1d(y, p.sigma) self.compute_11( "GaussianFilter", func, param, suffix=lambda p: "σ=%.3f pixels" % p.sigma ) def compute_fft(self): self.compute_11("FFT", xy_fft) def compute_ifft(self): self.compute_11("iFFT", xy_ifft) # ------I/O def new_signal(self): """Create a new signal""" signalnew = SignalParamNew(title=_("Create a new signal")) rows = self._get_selected_rows() if rows: signalnew.size = len(self.objects[rows[-1]].data) signalnew.title = "%s %d" % (signalnew.title, self.number + 1) if not signalnew.edit(parent=self.parent()): return self.number += 1 signal = SignalParam() signal.title = signalnew.title xarr = np.linspace(signalnew.xmin, signalnew.xmax, signalnew.size) if signalnew.type == "zeros": signal.xydata = np.vstack((xarr, np.zeros(signalnew.size))) elif signalnew.type == "rand": signal.xydata = np.vstack((xarr, np.random.rand(signalnew.size) - 0.5)) elif signalnew.type == "gauss": class GaussParam(DataSet): a = FloatItem("Norm", default=1.0) x0 = FloatItem("X0", default=0.0) sigma = FloatItem("σ", default=5.0) param = GaussParam(_("New gaussian function")) if not param.edit(parent=self.parent()): return ygauss = param.a * np.exp(-0.5 * ((xarr - param.x0) / param.sigma) ** 2) signal.xydata = np.vstack((xarr, ygauss)) self.add_object(signal) def open_signal(self): """Open signal file""" saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filters = "%s (*.txt *.csv)\n%s (*.npy)" % (_("Text files"), _("NumPy arrays")) filenames, _filter = getopenfilenames(self.parent(), _("Open"), "", filters) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err filenames = list(filenames) for filename in filenames: filename = str(filename) os.chdir(osp.dirname(filename)) signal = SignalParam() signal.title = filename try: if osp.splitext(filename)[1] == ".npy": xydata = np.load(filename) else: for delimiter in ("\t", ",", " ", ";"): try: xydata = np.loadtxt(filename, delimiter=delimiter) break except ValueError: continue else: raise assert len(xydata.shape) in (1, 2), "Data not supported" except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, (_("%s could not be opened:") % osp.basename(filename)) + "\n" + str(msg), ) return if len(xydata.shape) == 1: xydata = np.vstack((np.arange(xydata.size), xydata)) else: rows, cols = xydata.shape for colnb in (2, 3, 4): if cols == colnb and rows > colnb: xydata = xydata.T break if cols == 3: # x, y, dy xarr, yarr, dyarr = xydata dxarr = np.zeros_like(dyarr) xydata = np.vstack((xarr, yarr, dxarr, dyarr)) signal.xydata = xydata self.add_object(signal) def save_signal(self): """Save selected signal""" rows = self._get_selected_rows() for row in rows: filename, _filter = getsavefilename( self, _("Save as"), "", _("CSV files") + " (*.csv)" ) if not filename: return filename = str(filename) os.chdir(osp.dirname(filename)) obj = self.objects[row] try: np.savetxt(filename, obj.xydata, delimiter=",") except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, (_("%s could not be written:") % osp.basename(filename)) + "\n" + str(msg), ) return class ImageFT(ObjectFT): PARAMCLASS = ImageParam PREFIX = "i" # ------ObjectFT API def setup(self, toolbar): ObjectFT.setup(self, toolbar) # File actions new_action = create_action( self, _("New image..."), icon=get_icon("filenew.png"), tip=_("Create a new image"), triggered=self.new_image, ) open_action = create_action( self, _("Open image..."), icon=get_icon("fileopen.png"), tip=_("Open an image"), triggered=self.open_image, ) save_action = create_action( self, _("Save image..."), icon=get_icon("filesave.png"), tip=_("Save selected image"), triggered=self.save_image, ) self.actlist_1more += [save_action] self.file_actions = [new_action, open_action, save_action] # Operation actions rotate_menu = QMenu(_("Rotation"), self) hflip_action = create_action( self, _("Flip horizontally"), triggered=self.flip_horizontally ) vflip_action = create_action( self, _("Flip vertically"), triggered=self.flip_vertically ) rot90_action = create_action( self, _("Rotate 90° right"), triggered=self.rotate_270 ) rot270_action = create_action( self, _("Rotate 90° left"), triggered=self.rotate_90 ) rotate_action = create_action( self, _("Rotate arbitrarily..."), triggered=self.rotate_arbitrarily ) resize_action = create_action(self, _("Resize"), triggered=self.resize_image) roi_action = create_action( self, _("ROI extraction"), triggered=self.extract_roi ) swapaxes_action = create_action( self, _("Swap X/Y axes"), triggered=self.swap_axes ) flatfield_action = create_action( self, _("Flat-field correction"), triggered=self.flat_field_correction ) self.actlist_2 += [flatfield_action] self.actlist_1more += [ roi_action, swapaxes_action, resize_action, hflip_action, vflip_action, rot90_action, rot270_action, rotate_action, ] add_actions( rotate_menu, [hflip_action, vflip_action, rot90_action, rot270_action, rotate_action], ) self.operation_actions += [ None, rotate_menu, None, resize_action, roi_action, swapaxes_action, None, flatfield_action, ] # Processing actions lincal_action = create_action( self, _("Linear calibration"), triggered=self.calibrate ) threshold_action = create_action( self, _("Thresholding"), triggered=self.compute_threshold ) clip_action = create_action(self, _("Clipping"), triggered=self.compute_clip) gaussian_action = create_action( self, _("Gaussian filter"), triggered=self.compute_gaussian ) wiener_action = create_action( self, _("Wiener filter"), triggered=self.compute_wiener ) fft_action = create_action( self, _("FFT"), tip=_("Warning: only real part is plotted"), triggered=self.compute_fft, ) ifft_action = create_action( self, _("Inverse FFT"), tip=_("Warning: only real part is plotted"), triggered=self.compute_ifft, ) self.actlist_1more += [ lincal_action, threshold_action, clip_action, gaussian_action, wiener_action, fft_action, ifft_action, ] self.processing_actions = [ lincal_action, threshold_action, clip_action, None, gaussian_action, wiener_action, fft_action, ifft_action, ] add_actions(toolbar, [new_action, open_action, save_action]) def make_item(self, row): image = self.objects[row] item = make.image( image.data.real, title=image.title, colormap="gray", eliminate_outliers=2.0 ) self.items[row] = item return item def update_item(self, row): image = self.objects[row] item = self.items[row] lut_range = [item.min, item.max] item.set_data(image.data.real, lut_range=lut_range) item.imageparam.label = image.title item.plot().update_colormap_axis(item) # ------Image operations def rotate_arbitrarily(self): boundaries = ("constant", "nearest", "reflect", "wrap") prop = ValueProp(False) class RotateParam(DataSet): angle = FloatItem("%s (°)" % _("Angle")) mode = ChoiceItem( _("Mode"), list(zip(boundaries, boundaries)), default=boundaries[0] ) cval = FloatItem( _("cval"), default=0.0, help=_( "Value used for points outside the " "boundaries of the input if mode is " "'constant'" ), ) reshape = BoolItem( _("Reshape the output array"), default=True, help=_( "Reshape the output array " "so that the input array is " "contained completely in the output" ), ) prefilter = BoolItem(_("Prefilter the input image"), default=True).set_prop( "display", store=prop ) order = IntItem( _("Order"), default=3, min=0, max=5, help=_("Spline interpolation order"), ).set_prop("display", active=prop) param = RotateParam(_("Rotation")) import scipy.ndimage as spi self.compute_11( "Rotate", lambda x, p: spi.rotate( x, p.angle, reshape=p.reshape, order=p.order, mode=p.mode, cval=p.cval, prefilter=p.prefilter, ), param, suffix=lambda p: "α=%.3f°, mode='%s'" % (p.angle, p.mode), ) def rotate_90(self): self.compute_11("Rotate90", lambda x: np.rot90(x)) def rotate_270(self): self.compute_11("Rotate270", lambda x: np.rot90(x, 3)) def flip_horizontally(self): self.compute_11("HFlip", lambda x: np.fliplr(x)) def flip_vertically(self): self.compute_11("VFlip", lambda x: np.flipud(x)) def resize_image(self): rows = self._get_selected_rows() objs = self.objects for row in rows: if objs[row].size != objs[rows[0]].size: QMessageBox.warning( self.parent(), APP_NAME, _("Warning:") + "\n%s" % "Selected images do not have the same size", ) original_size = objs[rows[0]].size from guiqwt.widgets.resizedialog import ResizeDialog dlg = ResizeDialog( self.plot, new_size=original_size, old_size=original_size, text=_("Destination size:"), ) if not dlg.exec_(): return boundaries = ("constant", "nearest", "reflect", "wrap") prop = ValueProp(False) class ResizeParam(DataSet): zoom = FloatItem(_("Zoom"), default=dlg.get_zoom()) mode = ChoiceItem( _("Mode"), list(zip(boundaries, boundaries)), default=boundaries[0] ) cval = FloatItem( _("cval"), default=0.0, help=_( "Value used for points outside the " "boundaries of the input if mode is " "'constant'" ), ) prefilter = BoolItem(_("Prefilter the input image"), default=True).set_prop( "display", store=prop ) order = IntItem( _("Order"), default=3, min=0, max=5, help=_("Spline interpolation order"), ).set_prop("display", active=prop) param = ResizeParam(_("Resize")) import scipy.ndimage as spi def func_obj(obj): dx, dy = obj.pixel_spacing if dx is not None and dy is not None: obj.pixel_spacing = dx / param.zoom, dy / param.zoom self.compute_11( "Zoom", lambda x, p: spi.interpolation.zoom( x, p.zoom, order=p.order, mode=p.mode, cval=p.cval, prefilter=p.prefilter, ), param, suffix=lambda p: "zoom=%.3f" % p.zoom, func_obj=func_obj, ) def extract_roi(self): class ROIParam(DataSet): row1 = IntItem(_("First row index"), default=0, min=-1) row2 = IntItem(_("Last row index"), default=-1, min=-1) col1 = IntItem(_("First column index"), default=0, min=-1) col2 = IntItem(_("Last column index"), default=-1, min=-1) param = ROIParam(_("ROI extraction")) self.compute_11( "ROI", lambda x, p: x.copy()[p.row1 : p.row2, p.col1 : p.col2], param, suffix=lambda p: "rows=%d:%d,cols=%d:%d" % (p.row1, p.row2, p.col1, p.col2), ) def swap_axes(self): self.compute_11("SwapAxes", lambda z: z.T) def flat_field_correction(self): rows = self._get_selected_rows() robj = self.PARAMCLASS() robj.title = ( "FlatField(" + (",".join(["%s%03d" % (self.PREFIX, row) for row in rows])) + ")" ) try: robj.data = flatfield( self.objects[rows[0]].data, self.objects[rows[1]].data ) except Exception as msg: import traceback traceback.print_exc() QMessageBox.critical( self.parent(), APP_NAME, _("Error:") + "\n%s" % str(msg) ) return self.add_object(robj) # ------Image Processing def calibrate(self): class CalibrateParam(DataSet): a = FloatItem("a", default=1.0) b = FloatItem("b", default=0.0) param = CalibrateParam(_("Linear calibration"), "y = a.x + b") self.compute_11( "LinearCal", lambda x, p: p.a * x + p.b, param, suffix=lambda p: "z=%s*z+%s" % (p.a, p.b), ) def compute_threshold(self): class ThresholdParam(DataSet): value = FloatItem(_("Threshold")) self.compute_11( "Threshold", lambda x, p: np.clip(x, p.value, x.max()), ThresholdParam(_("Thresholding")), suffix=lambda p: "min=%s lsb" % p.value, ) def compute_clip(self): class ClipParam(DataSet): value = FloatItem(_("Clipping value")) self.compute_11( "Clip", lambda x, p: np.clip(x, x.min(), p.value), ClipParam(_("Clipping")), suffix=lambda p: "max=%s lsb" % p.value, ) def compute_wiener(self): import scipy.signal as sps self.compute_11("WienerFilter", sps.wiener) def compute_gaussian(self): class GaussianParam(DataSet): sigma = FloatItem("σ", default=1.0) param = GaussianParam(_("Gaussian filter")) import scipy.ndimage as spi self.compute_11( "GaussianFilter", lambda x, p: spi.gaussian_filter(x, p.sigma), param, suffix=lambda p: "σ=%.3f pixels" % p.sigma, ) def compute_fft(self): self.compute_11("FFT", np.fft.fft2) def compute_ifft(self): self.compute_11("iFFT", np.fft.ifft2) # ------I/O def new_image(self): """Create a new image""" imagenew = ImageParamNew(title=_("Create a new image")) rows = self._get_selected_rows() if rows: imagenew.width, imagenew.height = self.objects[rows[-1]].size imagenew.title = "%s %d" % (imagenew.title, self.number + 1) if not imagenew.edit(parent=self.parent()): return self.number += 1 image = ImageParam() image.title = imagenew.title shape = (imagenew.height, imagenew.width) dtype = imagenew.dtype if imagenew.type == "zeros": image.data = np.zeros(shape, dtype=dtype) elif imagenew.type == "empty": image.data = np.empty(shape, dtype=dtype) elif imagenew.type == "rand": data = np.random.rand(*shape) from guiqwt import io image.data = io.scale_data_to_dtype(data, dtype) self.add_object(image) def open_image(self): """Open image file""" from guiqwt.qthelpers import exec_images_open_dialog for filename, data in exec_images_open_dialog( self, basedir="", app_name=APP_NAME, to_grayscale=True ): os.chdir(osp.dirname(filename)) image = ImageParam() image.title = filename image.data = data if osp.splitext(filename)[1].lower() == ".dcm": try: # pydicom 1.0 from pydicom import dicomio except ImportError: # pydicom 0.9 import dicom as dicomio image.template = dicomio.read_file(filename, stop_before_pixels=True) self.add_object(image) def save_image(self): """Save selected image""" rows = self._get_selected_rows() for row in rows: obj = self.objects[row] from guiqwt.qthelpers import exec_image_save_dialog filename = exec_image_save_dialog( self, obj.data, template=obj.template, basedir="", app_name=APP_NAME ) if filename: os.chdir(osp.dirname(filename)) class DockablePlotWidget(DockableWidget): LOCATION = Qt.RightDockWidgetArea def __init__(self, parent, plotwidgetclass, toolbar): super(DockablePlotWidget, self).__init__(parent) self.toolbar = toolbar layout = QVBoxLayout() self.plotwidget = plotwidgetclass() layout.addWidget(self.plotwidget) self.setLayout(layout) self.setup() def get_plot(self): return self.plotwidget.plot def setup(self): title = str(self.toolbar.windowTitle()) self.plotwidget.add_toolbar(self.toolbar, title) if isinstance(self.plotwidget, ImageWidget): self.plotwidget.register_all_image_tools() else: self.plotwidget.register_all_curve_tools() # ------DockableWidget API def visibility_changed(self, enable): """DockWidget visibility has changed""" DockableWidget.visibility_changed(self, enable) self.toolbar.setVisible(enable) class DockableTabWidget(QTabWidget, DockableWidgetMixin): LOCATION = Qt.LeftDockWidgetArea def __init__(self, parent): QTabWidget.__init__(self, parent) DockableWidgetMixin.__init__(self) class SiftProxy(object): def __init__(self, win): self.win = win self.s = self.win.signalft.objects self.i = self.win.imageft.objects class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) win32_fix_title_bar_background(self) self.setWindowIcon(get_icon("sift.svg")) self.setWindowTitle(APP_NAME) # Welcome message in statusbar: status = self.statusBar() status.showMessage(_("Welcome to %s!") % APP_NAME, 5000) self.signal_toolbar = self.addToolBar(_("Signal Processing Toolbar")) self.image_toolbar = self.addToolBar(_("Image Processing Toolbar")) # Signals curveplot_toolbar = self.addToolBar(_("Curve Plotting Toolbar")) self.curvewidget = DockablePlotWidget(self, CurveWidget, curveplot_toolbar) curveplot = self.curvewidget.get_plot() curveplot.add_item(make.legend("TR")) self.signalft = SignalFT(self, plot=curveplot) self.signalft.setup(self.signal_toolbar) # Images imagevis_toolbar = self.addToolBar(_("Image Visualization Toolbar")) self.imagewidget = DockablePlotWidget(self, ImageWidget, imagevis_toolbar) self.imageft = ImageFT(self, self.imagewidget.get_plot()) self.imageft.setup(self.image_toolbar) for objectft in (self.signalft, self.imageft): objectft.SIG_STATUS_MESSAGE.connect(status.showMessage) # Main window widgets self.tabwidget = DockableTabWidget(self) self.tabwidget.setMaximumWidth(500) self.tabwidget.addTab(self.signalft, get_icon("curve.png"), _("Signals")) self.tabwidget.addTab(self.imageft, get_icon("image.png"), _("Images")) self.add_dockwidget(self.tabwidget, _("Main panel")) # self.setCentralWidget(self.tabwidget) self.curve_dock = self.add_dockwidget( self.curvewidget, title=_("Curve plotting panel") ) self.image_dock = self.add_dockwidget( self.imagewidget, title=_("Image visualization panel") ) self.tabifyDockWidget(self.curve_dock, self.image_dock) self.tabwidget.currentChanged.connect(self.tab_index_changed) self.signalft.SIG_OBJECT_ADDED.connect( lambda: self.tabwidget.setCurrentIndex(0) ) self.imageft.SIG_OBJECT_ADDED.connect(lambda: self.tabwidget.setCurrentIndex(1)) # File menu self.quit_action = create_action( self, _("Quit"), shortcut="Ctrl+Q", icon=get_std_icon("DialogCloseButton"), tip=_("Quit application"), triggered=self.close, ) self.file_menu = self.menuBar().addMenu(_("File")) self.file_menu.aboutToShow.connect(self.update_file_menu) # Edit menu self.edit_menu = self.menuBar().addMenu(_("&Edit")) self.edit_menu.aboutToShow.connect(self.update_edit_menu) # Operation menu self.operation_menu = self.menuBar().addMenu(_("Operations")) self.operation_menu.aboutToShow.connect(self.update_operation_menu) # Processing menu self.proc_menu = self.menuBar().addMenu(_("Processing")) self.proc_menu.aboutToShow.connect(self.update_proc_menu) # Add an internal console self.sift_proxy = SiftProxy(self) import time, scipy.signal as sps, scipy.ndimage as spi ns = { "sift": self.sift_proxy, "np": np, "sps": sps, "spi": spi, "os": os, "sys": sys, "osp": osp, "time": time, } msg = ( "Example: sift.s[0] returns signal object #0\n" "Modules imported at startup: " "os, sys, os.path as osp, time, " "numpy as np, scipy.signal as sps, scipy.ndimage as spi" ) self.console = DockableConsole( self, namespace=ns, message=msg, multithreaded=False ) self.add_dockwidget(self.console, _("Console")) self.console.interpreter.widget_proxy.sig_new_prompt.connect( lambda txt: self.refresh_lists() ) # View menu self.view_menu = view_menu = self.createPopupMenu() view_menu.setTitle(_("&View")) self.menuBar().addMenu(view_menu) # Help menu help_menu = self.menuBar().addMenu("?") about_action = create_action( self, _("About..."), icon=get_std_icon("MessageBoxInformation"), triggered=self.about, ) add_actions(help_menu, (about_action,)) # Update selection dependent actions self.update_actions() # Show main window and raise the signal plot panel self.show() self.curve_dock.raise_() # ------GUI refresh/setup def add_dockwidget(self, child, title): """Add QDockWidget and toggleViewAction""" dockwidget, location = child.create_dockwidget(title) self.addDockWidget(location, dockwidget) return dockwidget def refresh_lists(self): self.signalft.refresh_list() self.imageft.refresh_list() def update_actions(self): self.signalft.selection_changed() self.imageft.selection_changed() is_signal = self.tabwidget.currentWidget() is self.signalft self.signal_toolbar.setVisible(is_signal) self.image_toolbar.setVisible(not is_signal) def tab_index_changed(self, index): dock = (self.curve_dock, self.image_dock)[index] dock.raise_() self.update_actions() def update_file_menu(self): self.file_menu.clear() objectft = self.tabwidget.currentWidget() actions = objectft.file_actions + [None, self.quit_action] add_actions(self.file_menu, actions) def update_edit_menu(self): self.edit_menu.clear() objectft = self.tabwidget.currentWidget() add_actions(self.edit_menu, objectft.edit_actions) def update_operation_menu(self): self.operation_menu.clear() objectft = self.tabwidget.currentWidget() add_actions(self.operation_menu, objectft.operation_actions) def update_proc_menu(self): self.proc_menu.clear() objectft = self.tabwidget.currentWidget() add_actions(self.proc_menu, objectft.processing_actions) # ------? def about(self): from guiqwt import about QMessageBox.about( self, _("About ") + APP_NAME, "%s v%s : %s" "

%s Pierre Raybaut

%s" % ( APP_NAME, VERSION, APP_DESC, _("Developped by"), about(html=True, copyright_only=True), ), ) def closeEvent(self, event): # TODO: Find out why this method is never called when closing main window # with PySide6 (and potentially PyQt6 -- not tested), and then reenable the # console 'multithreaded' option self.console.close() event.accept() def run(): from guidata import qapplication app = qapplication() window = MainWindow() window.show() try: app.exec() except AttributeError: app.exec_() if __name__ == "__main__": run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/simple_dialog.py0000666000000000000000000000732100000000000015576 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Simple dialog box based on guiqwt and guidata""" SHOW = True # Show test in GUI-based test launcher import scipy.ndimage from guidata.dataset.datatypes import DataSet from guidata.dataset.dataitems import StringItem, IntItem, ChoiceItem from guidata.dataset.qtwidgets import DataSetShowGroupBox, DataSetEditGroupBox from guidata.utils import update_dataset from guiqwt.config import _ from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt.tools import OpenImageTool from guiqwt import io class ImageParam(DataSet): title = StringItem(_("Title")) width = IntItem(_("Width"), help=_("Image width (pixels)")) height = IntItem(_("Height"), help=_("Image height (pixels)")) class FilterParam(DataSet): name = ChoiceItem( _("Filter algorithm"), ( ("gaussian_filter", _("gaussian filter")), ("uniform_filter", _("uniform filter")), ("minimum_filter", _("minimum filter")), ("median_filter", _("median filter")), ("maximum_filter", _("maximum filter")), ), ) size = IntItem(_("Size or sigma"), min=1, default=5) class ExampleDialog(ImageDialog): def __init__( self, wintitle=_("Example dialog box"), icon="guidata.svg", options=dict(show_contrast=True), edit=False, ): self.filter_gbox = None self.data = None self.item = None super(ExampleDialog, self).__init__( wintitle=wintitle, icon=icon, toolbar=True, edit=edit, options=options ) self.resize(600, 600) def register_tools(self): opentool = self.add_tool(OpenImageTool) opentool.SIG_OPEN_FILE.connect(self.open_image) self.register_all_image_tools() self.activate_default_tool() def create_plot(self, options): self.filter_gbox = DataSetEditGroupBox(_("Filter parameters"), FilterParam) self.filter_gbox.setEnabled(False) self.filter_gbox.SIG_APPLY_BUTTON_CLICKED.connect(self.apply_filter) self.plot_layout.addWidget(self.filter_gbox, 0, 0) self.param_gbox = DataSetShowGroupBox(_("Image parameters"), ImageParam) self.plot_layout.addWidget(self.param_gbox, 0, 1) options = dict(title=_("Image title"), zlabel=_("z-axis scale label")) ImageDialog.create_plot(self, options, 1, 0, 1, 0) def open_image(self, filename): """Opening image *filename*""" self.data = io.imread(filename, to_grayscale=True) self.show_data(self.data) param = ImageParam() param.title = filename param.height, param.width = self.data.shape update_dataset(self.param_gbox.dataset, param) self.param_gbox.get() self.filter_gbox.setEnabled(True) def show_data(self, data): plot = self.get_plot() if self.item is not None: self.item.set_data(data) else: self.item = make.image(data, colormap="gray") plot.add_item(self.item, z=0) plot.set_active_item(self.item) plot.replot() def apply_filter(self): param = self.filter_gbox.dataset filterfunc = getattr(scipy.ndimage, param.name) data = filterfunc(self.data, param.size) self.show_data(data) if __name__ == "__main__": from guidata import qapplication _app = qapplication() dlg = ExampleDialog() dlg.exec_() # No need to call app.exec_: a dialog box has its own event loop ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/simple_window.py0000666000000000000000000002207000000000000015644 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Simple application based on guiqwt and guidata""" SHOW = True # Show test in GUI-based test launcher from qtpy.QtWidgets import QMainWindow, QMessageBox, QSplitter, QListWidget from qtpy.QtCore import QSize, __version__, Qt from qtpy.compat import getopenfilename import sys, platform import numpy as np from guidata.dataset.datatypes import DataSet, GetAttrProp from guidata.dataset.dataitems import IntItem, FloatArrayItem, StringItem, ChoiceItem from guidata.dataset.qtwidgets import DataSetEditGroupBox from guidata.configtools import get_icon from guidata.qthelpers import ( create_action, add_actions, get_std_icon, win32_fix_title_bar_background, ) from guidata.utils import update_dataset from guiqwt.config import _ from guiqwt.plot import ImageWidget from guiqwt.builder import make from guiqwt import io APP_NAME = _("Application example") VERSION = "1.0.0" class ImageParam(DataSet): _hide_data = False _hide_size = True title = StringItem(_("Title"), default=_("Untitled")) data = FloatArrayItem(_("Data")).set_prop("display", hide=GetAttrProp("_hide_data")) width = IntItem( _("Width"), help=_("Image width (pixels)"), min=1, default=100 ).set_prop("display", hide=GetAttrProp("_hide_size")) height = IntItem( _("Height"), help=_("Image height (pixels)"), min=1, default=100 ).set_prop("display", hide=GetAttrProp("_hide_size")) class ImageParamNew(ImageParam): _hide_data = True _hide_size = False type = ChoiceItem(_("Type"), (("rand", _("random")), ("zeros", _("zeros")))) class ImageListWithProperties(QSplitter): def __init__(self, parent): QSplitter.__init__(self, parent) self.imagelist = QListWidget(self) self.addWidget(self.imagelist) self.properties = DataSetEditGroupBox(_("Properties"), ImageParam) self.properties.setEnabled(False) self.addWidget(self.properties) class CentralWidget(QSplitter): def __init__(self, parent, toolbar): QSplitter.__init__(self, parent) self.setContentsMargins(10, 10, 10, 10) self.setOrientation(Qt.Vertical) imagelistwithproperties = ImageListWithProperties(self) self.addWidget(imagelistwithproperties) self.imagelist = imagelistwithproperties.imagelist self.imagelist.currentRowChanged.connect(self.current_item_changed) self.imagelist.itemSelectionChanged.connect(self.selection_changed) self.properties = imagelistwithproperties.properties self.properties.SIG_APPLY_BUTTON_CLICKED.connect(self.properties_changed) self.imagewidget = ImageWidget(self) self.imagewidget.plot.SIG_LUT_CHANGED.connect(self.lut_range_changed) self.item = None # image item self.imagewidget.add_toolbar(toolbar, "default") self.imagewidget.register_all_image_tools() self.addWidget(self.imagewidget) self.images = [] # List of ImageParam instances self.lut_ranges = [] # List of LUT ranges self.setStretchFactor(0, 0) self.setStretchFactor(1, 1) self.setHandleWidth(10) self.setSizes([1, 2]) def refresh_list(self): self.imagelist.clear() self.imagelist.addItems([image.title for image in self.images]) def selection_changed(self): """Image list: selection changed""" row = self.imagelist.currentRow() self.properties.setDisabled(row == -1) def current_item_changed(self, row): """Image list: current image changed""" image, lut_range = self.images[row], self.lut_ranges[row] self.show_data(image.data, lut_range) update_dataset(self.properties.dataset, image) self.properties.get() def lut_range_changed(self): row = self.imagelist.currentRow() self.lut_ranges[row] = self.item.get_lut_range() def show_data(self, data, lut_range=None): plot = self.imagewidget.plot if self.item is not None: self.item.set_data(data) if lut_range is None: lut_range = self.item.get_lut_range() self.imagewidget.set_contrast_range(*lut_range) self.imagewidget.update_cross_sections() else: self.item = make.image(data) plot.add_item(self.item, z=0) plot.replot() def properties_changed(self): """The properties 'Apply' button was clicked: updating image""" row = self.imagelist.currentRow() image = self.images[row] update_dataset(image, self.properties.dataset) self.refresh_list() self.show_data(image.data) def add_image(self, image): self.images.append(image) self.lut_ranges.append(None) self.refresh_list() self.imagelist.setCurrentRow(len(self.images) - 1) plot = self.imagewidget.plot plot.do_autoscale() def add_image_from_file(self, filename): image = ImageParam() image.title = str(filename) image.data = io.imread(filename, to_grayscale=True) image.height, image.width = image.data.shape self.add_image(image) class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) win32_fix_title_bar_background(self) self.setup() def setup(self): """Setup window parameters""" self.setWindowIcon(get_icon("python.png")) self.setWindowTitle(APP_NAME) self.resize(QSize(600, 800)) # Welcome message in statusbar: status = self.statusBar() status.showMessage(_("Welcome to guiqwt application example!"), 5000) # File menu file_menu = self.menuBar().addMenu(_("File")) new_action = create_action( self, _("New..."), shortcut="Ctrl+N", icon=get_icon("filenew.png"), tip=_("Create a new image"), triggered=self.new_image, ) open_action = create_action( self, _("Open..."), shortcut="Ctrl+O", icon=get_icon("fileopen.png"), tip=_("Open an image"), triggered=self.open_image, ) quit_action = create_action( self, _("Quit"), shortcut="Ctrl+Q", icon=get_std_icon("DialogCloseButton"), tip=_("Quit application"), triggered=self.close, ) add_actions(file_menu, (new_action, open_action, None, quit_action)) # Help menu help_menu = self.menuBar().addMenu("?") about_action = create_action( self, _("About..."), icon=get_std_icon("MessageBoxInformation"), triggered=self.about, ) add_actions(help_menu, (about_action,)) main_toolbar = self.addToolBar("Main") add_actions( main_toolbar, ( new_action, open_action, ), ) # Set central widget: toolbar = self.addToolBar("Image") self.mainwidget = CentralWidget(self, toolbar) self.setCentralWidget(self.mainwidget) # ------? def about(self): QMessageBox.about( self, _("About ") + APP_NAME, """%s v%s

%s Pierre Raybaut
Copyright © 2009-2010 CEA

Python %s, Qt %s %s %s""" % ( APP_NAME, VERSION, _("Developped by"), platform.python_version(), __version__, _("on"), platform.system(), ), ) # ------I/O def new_image(self): """Create a new image""" imagenew = ImageParamNew(title=_("Create a new image")) if not imagenew.edit(self): return image = ImageParam() image.title = imagenew.title if imagenew.type == "zeros": image.data = np.zeros((imagenew.width, imagenew.height)) elif imagenew.type == "rand": image.data = np.random.randn(imagenew.width, imagenew.height) self.mainwidget.add_image(image) def open_image(self): """Open image file""" saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filename, _filter = getopenfilename( self, _("Open"), "", io.iohandler.get_filters("load") ) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err if filename: self.mainwidget.add_image_from_file(filename) if __name__ == "__main__": from guidata import qapplication app = qapplication() window = MainWindow() window.show() app.exec_() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598171834.0 guiqwt-4.0.1/guiqwt/tests/styles.py0000666000000000000000000000561600000000000014316 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Styles unit tests""" SHOW = False # Do not show test in GUI-based test launcher import unittest from qtpy.QtCore import Qt, QSize from qtpy.QtGui import QPen, QBrush from guiqwt.transitional import QwtSymbol from guidata.config import UserConfig, _ from guiqwt.styles import SymbolParam, LineStyleParam CONF = UserConfig({}) CONF.set_application("guidata", version="0.0.0", load=False) class TestSymbol(unittest.TestCase): def test_default(self): sym = SymbolParam(_("Symbol")) _obj = sym.build_symbol() def test_update(self): obj = QwtSymbol(QwtSymbol.Rect, QBrush(Qt.black), QPen(Qt.yellow), QSize(3, 3)) sym = SymbolParam(_("Symbol")) sym.update_param(obj) self.assertEqual(sym.marker, "Rect") self.assertEqual(sym.size, 3) self.assertEqual(sym.edgecolor, "#ffff00") self.assertEqual(sym.facecolor, "#000000") def test_saveconfig(self): sym = SymbolParam(_("Symbol")) sym.write_config(CONF, "sym", "") sym = SymbolParam(_("Symbol")) sym.read_config(CONF, "sym", "") def test_changeconfig(self): obj = QwtSymbol(QwtSymbol.Rect, QBrush(Qt.black), QPen(Qt.yellow), QSize(3, 3)) sym = SymbolParam(_("Symbol")) sym.update_param(obj) sym.write_config(CONF, "sym", "") sym = SymbolParam(_("Symbol")) sym.read_config(CONF, "sym", "") self.assertEqual(sym.marker, "Rect") self.assertEqual(sym.size, 3) self.assertEqual(sym.edgecolor, "#ffff00") self.assertEqual(sym.facecolor, "#000000") sym.build_symbol() class TestLineStyle(unittest.TestCase): def test_default(self): ls = LineStyleParam(_("Line style")) _obj = ls.build_pen() def test_update(self): obj = QPen(Qt.red, 2, Qt.SolidLine) ls = LineStyleParam(_("Line style")) ls.update_param(obj) self.assertEqual(ls.width, 2) self.assertEqual(ls.style, "SolidLine") self.assertEqual(ls.color, "#ff0000") def test_saveconfig(self): ls = LineStyleParam(_("Line style")) ls.write_config(CONF, "ls", "") ls = LineStyleParam(_("Line style")) ls.read_config(CONF, "ls", "") def test_changeconfig(self): obj = QPen(Qt.red, 2, Qt.SolidLine) ls = LineStyleParam(_("Line style")) ls.update_param(obj) ls.write_config(CONF, "ls", "") ls = LineStyleParam(_("Line style")) ls.read_config(CONF, "ls", "") self.assertEqual(ls.width, 2) self.assertEqual(ls.style, "SolidLine") self.assertEqual(ls.color, "#ff0000") if __name__ == "__main__": unittest.main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/tests/syncplot.py0000666000000000000000000000604400000000000014642 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2010 CEA # Ludovic Aubry # Licensed under the terms of the CECILL License # (see guidata/__init__.py for details) """CurvePlotDialog test""" # =============================================================================== # TODO: Make this test work!! # =============================================================================== SHOW = False # Show test in GUI-based test launcher from qtpy.QtGui import QFont from guiqwt.baseplot import BasePlot from guiqwt.plot import CurveDialog, CurveWidget, PlotManager from guiqwt.builder import make from guiqwt.curve import CurvePlot class MyPlotDialog(CurveDialog): def create_plot(self, options): manager = PlotManager(None) self.plotwidget = CurveWidget(self, manager=manager, **options) manager.set_main(self.plotwidget) plot1 = CurvePlot(title="TL") plot2 = CurvePlot(title="TR") plot3 = CurvePlot(title="BL") plot4 = CurvePlot(title="BR") self.plotwidget.add_plot(plot1, 0, 0, "1") self.plotwidget.add_plot(plot2, 0, 1, "2") self.plotwidget.add_plot(plot3, 1, 0, "3") self.plotwidget.add_plot(plot4, 1, 1, "4") self.plotwidget.finalize() manager.synchronize_axis(BasePlot.X_BOTTOM, ["1", "3"]) manager.synchronize_axis(BasePlot.X_BOTTOM, ["2", "4"]) manager.synchronize_axis(BasePlot.Y_LEFT, ["1", "2"]) manager.synchronize_axis(BasePlot.Y_LEFT, ["3", "4"]) self.layout.addWidget(self.plotwidget, 0, 0) def plot(items1, items2, items3, items4): win = MyPlotDialog( edit=False, toolbar=True, wintitle="CurvePlotDialog test", options=dict(title="Title", xlabel="xlabel", ylabel="ylabel"), ) items = [items1, items2, items3, items4] for i, plot in enumerate(win.plotwidget.plots): for item in items[i]: plot.add_item(item) plot.set_axis_font("left", QFont("Courier")) plot.set_items_readonly(False) win.get_panel("itemlist").show() win.show() win.exec_() def test(): """Test""" # -- Create QApplication import guidata _app = guidata.qapplication() # -- from numpy import linspace, sin x = linspace(-10, 10, 200) dy = x / 100.0 y = sin(sin(sin(x))) x2 = linspace(-10, 10, 20) y2 = sin(sin(sin(x2))) plot( [ make.curve(x, y, color="b"), make.label( "Relative position outside", (x[0], y[0]), (-10, -10), "BR" ), ], [ make.curve(x2, y2, color="g"), ], [ make.curve(x, sin(2 * y), color="r"), make.label("Relative position inside", (x[0], y[0]), (10, 10), "TL"), ], [ make.merror(x, y / 2, dy), make.label("Absolute position", "R", (0, 0), "R"), make.legend("TR"), ], ) if __name__ == "__main__": test() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1544279686.0 guiqwt-4.0.1/guiqwt/tests/test.png0000666000000000000000000002146200000000000014103 0ustar00PNG  IHDRIw"IDATxI$YӽwŔ]]h4ĂĞKAHr7A.5#lO\U=f@A!aDe^q(pC\fP}$nhB'>n)}g9 =%|*HfD2n@o/yo:;_ Z?>KbhH??<`OR":`-_fA>$K@vb$7'y qd7>+`"@I܉ئ^̩) /po-P۶uJ L<)F H62b"\, ite'dvõaC/2[Yŷ0t8˧%25VEB~hC#,`dSFe(/Oc^l8ޫ @#5~?82d5si"'&o]5ʚ  ʓ312gCp׽/9`t{HPvBw#q7ȀCGr{+ؒF7 n='Fڍ;S"M׌9)tR`425~5e޿A~y^~[d<:Oc3*ՁL)AiҒ@2- DX0wKLR8'liPG}dξTp@ we>Q2A,Mod=}E ,,R!QjhJA1ǰ`CP #!d$zbz²$@D}e>$!#sIZ5gݓ3ȓ^8ލ+vR&CTKF6]~!"eKD p 0pT2inx"3as֡}ȳ@$҈\r pa4CyG 0/_AW|3կǗ }aygOz1 J̷pG)B83 7Kņ єb:fN1R&~ N Q-3 lW?cw`[{#"~I1ҽKlS׼!U-J m\X=gu1 $N 6bf߉v[=yq. Dn} hb "I\ r}آ ^z%7ߣ)|)?upG0#޽@`}(k+i@_ (YZ##BkDіׂvICP䜦UwMb]LϷNS/iMMpNuѐPN^H!1EaI HHG:< K21s؀Izn0;dyXǵ4WVr@aӟ[z^{4owG=P 1BE$C AZ<&0Ā }s~y['o=Exr OmZ+}cߙTYco٘a.MzN X}:-4Ud ZGjF,i'dn8$ ic=KGmΜ[}XFAAQoq7?N޶_sˬ z@eM D1M{7ea`c)QB2ƀ S:ۿTC(E^_y8Kz7&=*âPo}dG"ٽoyj/UT2}CQ?̞l.c=X'Za @^ Kd!OQq\}q^T;y=ھ{\1"-X)vmIP2: ~ۗ[ɼh=oGT A$5kMpSN9eTK-<(33B"݋V\DZmP?fc{}0Z]!z|I"NSio?R.r/c_is2^6eJD͖tH*;ѧK3>O%ԬA̠uDݻ1,kAۯpЄGWD<"Ab5>x#LΫ2g}LPC,R/aH+ 9>ҡ/$.h! hֈT:pR`40ee%#).39[H=坥{r`yv)%Q^(0 Hz(zpI:8@P?2imfQ^s>jo}ՈBqiqw( 11! , fS,y4*dZr:*ML)!w\keyL _:p9QqN2@d$"}$9 dAnDJъ&>/bWtI4‘GP":%WK㴌pO0*ytR\i Sxʩh~ߩ$4hD8vMz\AHt%iJo)w".[qS :(1ȳ)NX%MnYT inӻ`NiMX`tz\6oIacQIA3 Lq $8ެIY}SYrTrT4E;. ٔCA׿SHN#xZ8Q#h;r#0Gm9x2z CXkT{\͎(׷"z P,j)/RKXF+<#vQC@Hr6L@HgS6DFfOoĒdzKO bt 5K8HV):ߺleNjhӛ㻜U/1a~zRa Q#zXi*N~(հdAD]s<FCI`cJtĜ|+c-0MPN 4 \G߸scqtIyDC f6B2ۗg I<.18!1d# xGF_8.th-J"ef vdpC h2x&jl݇!owA>o|.rmHq`Cq™` ),x8P\Dzj%c4{[}euz|Up'Jd-ʬ>z P$i}Wvt۷,=qr6i {@aǸiiD tJyձ9iGÄX ܎Yx}ZOOs;1JJK(h C==)m"?q=uubaD?}9iS|Nlr# c=x4N1`27?*oceW@ "5Z{VK|?) &yuyvmN%]gx9kkeb2y Q292]!$sN󲺔 w!dJtN7k zƏ?}4`ض;]~ea>q&׷t ׭^l;(ӌ)mq"VO演Op}8P}S3߶jj=z|%$3""!SyH%~}k/G}*֏'RAe^~KP?6=4v,z,"s ɘHܓPJh—9rџ~|z*]`o>>~3 %:ڸK DbGΠ4_1A"enHZ=i:0|i;-g+ϬwX3;S: Ήք?7czk498q\e)~aASK#"l1yPӤ9vSքUB PƍN!L%m2&4]GYϧ7ق™^쩜- /'**; 2|Dew91Ώ Z,Zi5x;(QKa¿40g:'TljSiE4KmI;LVg^e>m{(ԩw8peN\aӶg$w,N4u YDԷe˞Dܖ.'-^3BmRw9ǀ@ߖ#4Z.ꏵu;2#A7KfI1D wp_~C,ja4O|lyƒS? 8AĿLy DXe)>cҰamy!wd.}@ԇa0+.'!Cw)l$#GL3a70*ġF8ڲ L֪_q}ϟ)rOaQ4Dq)FX×7Ge~W>j>+3)ݱqNECF1cnϒp1 HDmdHȈe5:qEp|ls1LQ yæ>-8 a2|2}M/}]bal[pO*&+?t^r%>ʥ]yN`Q͢ʼ|".NHg8ȋ88z0~|AABx(jt{b::&Y S p9;FoӴS_p`ˈ)zUf2b@O^SzDT= D!Hv:Y+QJܑA;L:YzQ/%1f43*>*cOqwfXxNな*Pf"Dizuq8$|)9zġF&}~ҫvHrׂdxP ˖,9in֚rR':gI(gcTbQO{+9>'kO%ԐAbѴm2.X~z_ BSOlG#11M~;1O,ǡZ^FO֚[8'Pu5w\h76Ew%+&n{#PB]`|BT1+R4ҜQ3ԣW5| @{e{XNc)4c*4ɴ@ W*уUWq#]'?<,5 "Fg4>)!|/y%2]li{SErNQ+ Gjf]Kg. nTg@0ߚ5\(y#i=VZuьJˆߩQ eϤc ^7؜#8٦hmnxB[+g+fmmLr9 }{MOI,1pTv->r;Ge}S"$/zlm4dèYKw89_ Ci=) 6Rr17h{0AIji^Q8cO]./?9l2 !Hp>ad K=YAsV QG o!_iNxگ>;; E ԃ0b8,osHG#FSw8]L]pZ&>0S^⼄tab5t 9-\"Rvbm@'br;-ό@(;)_<-s~)'$ tdm1{Ddƅ61܃܌\c~,=ftIϿX:^%s'NN}L鹨 ֯ '; ߖ6sZm dR1 0 4FWѭ NըQxmRS8V"̍= +2+uDĤgN„0%go[!B +S^ MOĉ'F{x ̔)#Lf"f77qQDG8p+3M"a#x'Z`5D$b6:&}{>l""L`DGWDBw#B <(nw f.t栓9qĿ=.W矟}v&fap#W~9SD"N&%D `q!fDA☯F}r5`08LYGI˜8qo~<Ϳ |[|o~ dЫ3! "L=h@D ܴJaBs]"9 X IsJ08B8qws|/?ѿJA;K""_/  FIA)#p֧bcZ 9M̓D#OZĉF+◿~ ??W+Q*=MmQ) wg{̵V!bhp ba#$qbܒqPG G2@ĉ7M0^qUởs-Dp d7CO:Q*i枑GH\"}K G0 ͭSKw30Op ,'NA||V>?}Թo}?g̗ 8Ͽ#w~$>!{W?s>{!b8&nNKRH333ɦGn:q &Aٺ̾%)$ D,"̘R%HgO88c[6K,'N=||6W Ϳ?<’|Eo~|?ַ|_i̯OO|=p C/w>(x'" LUZPvNAÜJ)0,BӢc[~.,"RDd?J :1>j=q-⻿W?|Ϗ ~_qo矿x~+^^ՏW?| w?Q {;Yyp"0-Ed'3 ;XwO+_𵿈_3'?~K/,}O~/\H)|o|/wL #]RJ̬ Dɔc6혬G\wawD GS81g>RNeNx38,~3MOW?|헁 C^/gǁᗒOo}շ?~$~ ן?_ș1=HH)ն՚66{YSZ3*3fqz^.Ry?j1m˒ʔ1CgmoRĉ7JL|㛟5o$_~Gm|.k?/揺r?k>{r+@`* bh)]JR0#t)ܔB  m2UUe{h9L+Kw*j-r8F?I?C?|o 4OkA+Gy&Mx8ӯ)%Rv/,,0SK W䮫4y@ d]asg50Z[YOx _? MO}lh}/{U/~ϯU೫ھD]Dq1)03SjT0M V3„1DT AnTZOx_;|+l¿y~? [Z9cI} 5Y)LCr<]/2\~;eLc}ۇr^)1}{H&?o<5;}n"ܩ:]!Ox#~?_?9;Z b1nV"t kҪ0G:5&R39u0#;tc6݄#}#9(שp<9q'O}Y}|_~{/??~ǀHOcfF$LhVRj[* 7LV(&Rj1m({ %b= Wp8~#?1_5~5U>O8N~3}n90>Z[[p!Ҫ#L`ZPzͤؽw6c<[>ti9?OxK1O?m tW/_{x:F,L\k3rرRjB̲e][arSf 3 0iMbQ} t{yV30L2S ΰ'~@y% 﫚m|O}oJ·_ӅU"&{|J|/ JtO wYlCdV. m,;XJ1w&HJjgGy!˜~7=o Gy> _h:?9?wU? w;_QW{|//?~_d>/|U|i/`=S3Zsw3YsP9>$FZnm)FWJ p\k?_c+Iz''oRgt'_)_:7?< /|k=>z|?돷 _D^5' "EpU ,LLM4r)R*&>N{!)YNMu=Y)@nԹ8)/q}_H/ϲ_j/u=Z/ȟW{|//go[_|)*Us4Cca!2P#^}eIiݻweiEI{5c 5ϻ g~g3[ӓ~W~?ǡH?73O|UQ7_JwUg[2~o?6?H1T"!'  cػh aLu D::\E2 X@{lPH{_N8G|L⅙Ӊ'^?} ߏ?$W5,cVkI^31 e.0 1UG 9\*Ge(690uOV 3᎘QLSVS\'yMaLP$t /Rj)B&wKGeȩpX?EH l],Ҟjͧܞp'N} ߏ?,WeMEf \"ffQo%&k`i9~p:Fwu0@$uSt%f>4ו0Q*"W@v7 IL'N8rJmL)U Fja8"VtZpS%M5H{I-mhƾ>X2/#cKyͩC >'N nݗuY["ODҕ*nn~OgSmKE(l~'{M2b~;{xRkՖudKy\֖ߝU3-ECzLt"p7cB4WEUG[T{,ӔXJ"Ç'OO}TkiK)zw[Z#T>ʒǂk&mnD3#mk4n#9rd8& `"`"c> =3AnĜ坦Q84=,3R۲uBr;]aeٴca0',ZsK?F/?\]/kLps1IT@>f@SXGZK),3{T)wZ"Tȍ]{Ftp &6b6ɧ뒍Nu=tF˺.M8LwI°ZdonZ L") D廇#_ 1gq?q @ۆp*s 4k˯󿣸`)aG-+,Zӂ< <+h%4 2u~{umU(,\G &ZE}h tɂw^Zka>9ĥaAR0ɕA:j. %XrYP Oɻ%ǩaSf)L(m]Z(|s[k:,K 3mcTa9$c_"x$DL"@t'X3]aݻu}jsI[wa&9=>Œ"xfMO'XJpӵ8}y駟ӭ͌• R۲4!W/mY/Ru"0R!l8B@Ox fD>f@zQ2r) ]u),{wѹ(\R\Cr^.K젝@RMÊaFBa,EsZ޽w0\Uhx΍(*F-U-U0K7'"zAIÐa*1Tgq?q⍀%*@ڵT#tsYG[-Hm0E,//t,E}̆0Ad{`Y~7{wKpva"9*ᑚ~][e|d#ne\% p1sR(UHMRJj(iPi ÍplNNiLٔjǮ)s)jHaZ%,784mOnGYOx " bV*;1Egj:ݲ̶X$8Jۚ>}{<}CZ (;j7:E(|~?J GnZ+A\jmCܴ e$CpeB0vns3:l@pR+>Hs7c-r^ n6o_y j"TChsGDPwPr,R”9H9q-`f9LbёxJrnR4c)@"&!+a !7z]V8mm۱S(onI0.E=8vo5gv{Z>4<PR<Ͷj6DA@#Qm*ױԪ0# ?]ʡNē% H #0Rk[*0ŷGzv #{\JD, {}P)E$nc{6Ym, R꽧G%AI2`X|tt<<oL(9Y̶ME ܙEd#0 73KiˇTA}N 6!b!w:u&ʔ 3\#l췗K!fRih焀3R)Y}`"La m}r"oV`t>t-gm}1FZFacG9 ŜLxQsBjD?2 A ɼϚWyu'|-Hl;{s f093}, c?ӧRbrY[+LӁyr z]FmZP~nV)RKЃCi.YǾ 4mte wJ$RVL ڷ{+䣐!I~{~m>,P%d^ s_83!{:L a",[r6 t&180^D -wPk_:<=6>~u] voR)0#':thܱRO~^V؝("|8?ˆff&o8EG~Zwe\" t5#P~/T~ߺzoR,'N(|.xf1n)W95AL;Cp@:&,~ݻe)N&˺"aI\w3j#m Er[T:/uYL4Sgnj^̏_ηh:ӒWdnj39=dbvSSTw Km[P ﷗_(|RhÇGShGj ]u,= )mY)ocСfӤՂ$-s4ȧiĉ7a>=hnJ8Qf&f"̠0͚h$llN_nLO, JH=wg`(w]%pP50vP0>@Ȓty,ub}=faL&xg 1. t ur*xTp1,wG cT~q6tHH}tչ5GN6vDjHD(o΁ocAhzc2w8$`cR3A) W0];{Ahn7{^Z8K-PDI p?LhRc~tKVfɠ #NDpG/p r3sF3t˲^k+}ۄLjIIi`م#\# }kx7&R9o/?TΛ49s"]USI,z&{鼯`SbLN)D˶G9qM@-hnŌZ&}:-2ᘫHCYM;c߶>=]/Kj4:DDju]y|hFO#Zےq9 <)p#&6̑3R1%Uu0ڊ0^?$8 0 s[+06R6<==]ZWπkw/AR8gu2LUb vR0R8I b LNc&7FXںe2R',$z:H:iȴT#H^UP6D( s\(TΗemdsnKg Z "ɼ:,uiy3T/krn3@K.i Yu0,K-!ZH/P Rjer#$cI8eR#G`܃?wS!ƕ|ZU"`9G!T\.=jCs>]l}\ϴ;9HB3ڮSNHԄ u 5'RR(ѽ'#\lДKH)cFEcoK-бmc]/ZҔ#VÇ06%DŬfp{pp.n=M4"!359qMd6Δc!LG6$w|Lt^Eu)0 Eڡ@u0 sIؙCg@+za8˥:M #,N8pe [W5'fʔ>OGrIb*fbp3}gI `p|ڙ29[gmE=L8\{׺^׵ Ba*"r&{l*Y4/LAAYOx rG =v(K;0*>4HrCx TZ[Z%K)Tfni>qvV~8^Hz~Og,U3 3Lx EԓOS3}R0`C͏8 1)3{0§X";W&|Y'τȨms7m][1c(p`3sg03pmŽSCc}b̙RaR`nsLXk2<f{yBu>F $@&0OV6[F$ ĥ*wUUHyR}oNW"R^=)w)Z f?BT@պ*ZJ!P&{ĉ7YUBN౫[ffrX]RJڗH^'^x D@RM,RAiYsK C4˰B3eя3Oxȍm'yLx&"ŕ q480t# %%+k_W߷HR3{=&LBq.#, R%/v1imY#|$(|f}KI@V!]=@)>V2 ̪dU 2<8.P#l}T-8qHU0YNhPp:9ɔ`{6kJ]T,2B c}.<̃R>ITDji+K֩7ak G{RߎC=OS4l בFx r+Wɕ6vh ro1&}&׸Qa`9>&5>S0""%LaZ /:]=Tc)Ԓ I鼛*R([Ƨ&me]ץ*t4 ?;"sb:Z-Lj13`.E\8gbT!|Z{FW-GmPF8C~uJ$RfcA, bdeP9"9<,'N$AqrGm{ dGi/J 9YN)E.40ƌh"gY}:v~ـ$Dm2wÓ8-וZ"\ e{:yLqk[eYZ&ANaeܘ:Fϣez>e<X3}J)i} HMьj.S08p̤g䕳I-5cm`l7I3t0sr27xA&&A{)5\DZ2>Cm}\.eUu(pog1Ht5뻕:XEv Z TRj15-m7 .D(tRן6Elc%pp^7el,!x৾9oz7IL{ZZ'eF"UKmΡ"LyV9rr>ӥ8ZS"N1A#f.7"dN~ۢ9UO.u]t1T)RR~?\\J0Խ/¦/e)%HBZj͞-N5Mo4JzUD #t멳}$3As8OZEjm>z)r'sAȉL_sHZ;JZklL.c>ilKKy!"anD!ҏ>C> rG6z,Ksn I-3"Of(LK5"<"P8ܒei+/"Sp>SAgxm|ǫϰ}ksv0poKㄡs?q-&-\g sx[qajdzd85YX-2o SZb>NCͦw.j4e("}nH71#ldBrYZar 1}pCccw=2K7\$Ό*Wա686V2#͕GLD,EНsI`)C"Rk9Lh%cSݍp/"3+#-yu32U[P j & t6aH̬SbLGTyqXX$jfU$)'b*!CF})iIŘ4X""1VN˴m+#aͻ{~sTj(aaڇR5W '\R>M #{,rb;AKD3"HYF&k۾aAbtr)yR=,0cxNajpU\32mTiVᙈa)(6)ī,Tb1!>{ÏpA̛3UӦZrC,9ffiC b"$GuaC P*inp]ubrv'N5)ŒgGEF@Nd4QDr8kD4H]f^CPON",,ʒ:9Qr4|F<£-Kr׾m XC8,h c9RnAnfqhg xy~ɚ:FMa>.))f;n:JbA .ncFQ\KveYj)ٹ8k[ץU4"HH$7VQkC{}`ӏ=)>H\D>P-Sa:gq?q D0v|8CdKږF/I$Sni8{G.Qp 7*9,ơ&Zjk2!:reYgma}{y~Tv}&Ŧj$0B;np|t %хeiKK.<~V11 \#% 6 B q!L{߶mrjSxG]LANpy:`i .z]#t@8x7c1YĐzzn `Z˽B\ ;̃ZIwu&iT˜8 7HYS!"F w߅Y&/3CK\Lu=̌9!@9_$672!w(ږ*0"Ga#BYiJJa:}v:̅\byJz&F>\B::3J5lx(H)={Dx~J-9#1w!{xn]Np#xħ ) *p:7f֖eiU( v{y^>wE>wk**ZGwb2 Sf`) u^Okr<" i*S!C0} G'#rUȱt-nnS_ĉ7 EX20}ʡB46vhC݁G?ojD'xJfhͥ#baHBR ʼ 7Z 1<*epXՋwk0]4 L}A%MBՆ2sJRI4tdraʸDZԺ ה;eS^Z CbV#vP 8q""d(rDJG }3ĉp\XHY2.>N+eګ?V"qDrhELUR eN]nx b,3v =+1!#8]JTmd(3Zx}n r??i}}P4Ϡ2Z[%jH3D8a:ncK%f4 "q!aD2cfyeΠ#6TVKlPՌoe"pUn!^ZnVP0̎1 yX"Le'hSRO%Q(rB0+KNZk; $'|Bo5%e; c>Qa|b$-kQ(tpZ :C.NrVrdQguY_DQ'}m{En s`3VPGzTRv,EÈ2R*65ϛeM^` $l߶mw"ޮ1w_j-~|4̪pnR0&pimYjPr% &B0Dt sĉuiBaz* # /!))tI%e]Ph'.OLOlG)ed~QCm{@,U<T̂c4$مa#K8RPs}59\{j"L=q !lX)BNaӍKe|/A6 Jnn#ܴ}.P͙'~ s&NnJRP !`[r̳ʑ3"DJmủo  4xEUI4d;ܼHmYkA LHpSk`P(;Mr}4 H{لµ ($1m{D#tT=](n'"a aF N_9< ZR#uCoޘ +Ǿ۾a r^wƄ!M1Yܕ B3Ri?5sJ G/gq?q 6!0sYԃs 1& J͊yRZmE}>+tfvs*Ln€C L)8*ӡLaJ`F86ALZK)9r W{2‡?^Ɉ@E]DKɺ8+yXR͙+j:it\ |&uv3| b r>>Gϩ7)HG٦Nq<# GGxR8ċU-V4$YV b1%SGvzzorosaCӡ\}0k!rS܆Gv~}LGnki$coz.KGiN4c/f*"hM#G:H>"BxQ Q>P11-XyMt_J.}󬴠In[%WT>T"~R۲LwZԋ"si;t4t`)!G*Oקe9o >5ϏЬCA BxLPwpS(Pl]~R1<]}SHL)0MF՞Z>} f83+j:M22:"F+KIpĬmi?22b*#O0 owwwսZ˲J}R&+}3)LutĢi)#BRgۘI^U>ȼỤLvBX \q` guAB(QT,2\{L#@Rr,E5}oUNY3[O}0݃25x^J Lg s.'N}wVar r}xaSg{ b)m" }۶} eEzM]I}۶Gq_dN-P(ɓ9BH0RL<Җ\P=fmΓ1m(1FSW{'ċJBPRSg멧8|V*peuI2"+ɺs}{WZP w%M1LpaKuJJ@2IÜ۲.uY[+§+o)QokÕط}JGt4ID5syٯ|uۺҊSR0ӊ N^K[20A‘ĈǎQTFdkUuxqŔGdd󝝼=Ē1ٺd6Hy"Kӗ`b* baa^ӅNKu q %m8G///45LG[9M0 83*RT)#aVrLa+o}^^eY*SXʔԎGRHpf)RJe۾+3iC:zw^k &a=OC!S֚ tS .N2.W0MtJI"TM 9LU=&;QD"S2mT/Z2f 1c uGē&7PM}nK b 1}Om^jᩫjh-?A%/>K c4CKj2# 39X n뻧˥5!X8p{yyyK:,祹f)$'cyԃ_H-{2pxjr沺I)Vؕ²-L ݙ{rV&SZoƊw(P᚞CPh;j0)y*mV4lU\3b3UUUF n6?p% ˇ??Or* Bt$`Jd ᘆ,Jp|ffUJ)V N[)u2X*m}xUdjR'pĴWUEhgѧ7O|Kr>=Xk0i-Uua0 5jG28m0b٤Bmd$ҝu&ν`'{uƲ^ \vĉ7fPO2ږZ @|HIIj`&ye̡CXlf:}ZJaF01$8rARXzB(dP1vf arj*D3#IӑV(]4UOj\fhZKF$3Mgf1^V1$ V\ɵoݔ*[3!x3!9ĒA~LmJArfSݞ?ĉ7r]Lt3S?/3Z92 ]1 a*fIA3d:<%`*<_]J\"JzchQj]86!"vŒ5hvG)fFHKa9.n"H c B 35O0,tgERdR<\Gc۫Pƅ<p'޷5!] fr;t:z!ieIO3=RNc:Q@\+[n/{*fr"Yf gʩCҫ"nƥ11ѤBRKawX5KZ8TD"P:,{ߘJq B,5;w̭ne][ ǴM 7FNqIE=YӒ8c۶wfYOx\.ꪪpIHČ>ZDdhhj7@5K{xV?FuE"L^ES s4 6V%+Y۩i-nlgj7L4UwS3Gv:&E:|e0w03(Ԫl̏ԃKgi+mo]. {  vGȼ vɥ`0վ^>|Ox x.ER8\̟9i;>&*,¤Ĥ:³$>:7G 7-Wﱶr@ QL70sa;Snڒ7 WC]Z>_QGZ̞-$)¦Z錭΂>Qo*cln!Xmv:iPjP2}ylӎT D1sipuקe]kX/><8FDr@dۓ`ٹOqI826"\L#og:)'G0x(rJ0{9Q@sږ:nV֥uBTD8"XXFGnYMweBa0T>O?a̷똮 HKV)vbz\ra9;,ҤsysT'9̩@2JAG>JקZ||Oֳ8pN?pp4/)s&|CRgT|nRTմp`uhYeIÝkaslJFFa6M݌8j H~7*%9(̭o]֧eSvZ3}HNRF?<<"R:nV ;S[.Tuez8Pއe1H(Q:taτ"FK;{\.*D&)W&97ݽm9"Bu܆%c_?;2zYڴud>cFD(1¼ Ig&Ex kFNo۶ZiduYDXX 9pCRV,~-z~'NzF+Lp S1wik8!YZk3=YmGG8ւMρ "BHjIg^nmy8X견R8F*k ,}P9cϱUmb#g61de0Fhn,Y="FAޙ3J 1 8\y%Qs@X|Waptڲ.ynO׵8{9ihӟDty9SSu_ZA2dYLxv숈(RjkKNCxKM+F t*¡Fe]*&uu ֒II/쉇%S3րYZ]+a9̌m[-0hZ1GX^9WXaYm+r#O""KKL^F!7ˇ~>gq?q ƾoTM֏cx[nmXX)jm )2U lZqXיȔ慹*FaBA,E)gJSa:F߶Ou]䧼 %mgg,3W7+q}zlRv oMYڙEqigP(Ռx%v8sĴˬיL7Uf^"@"71$u)W?黧ĉ7o4Gˆdz?:~vEzdiw*ZM)0鈥amR=]ץ \>ywi\,'Nl{wz!4J,lQgc/Ȏx219nZ ]q;?lwZ(f0Ӿo9a GQR16OUj~d*+Ə;dV!] u|\%0xe҈!3}<-bnAr_)-V p˺R(oK{.so_a2'2nfR&"!h^aPv{ٰ|v'hyaO1˸^ܠaN[o®ve"}۰.K-0SmIY>argE #=og2351)}-/1QsKj..93#^8w !-p 1if\5t+Z /-˺.HF//o=]/kʬ8ɻRE/5d}UM'B$$,A$)lq pvn9wKqi}Μ "VR[=(,Z}ڬ~ӾBбhIpf2j|44ׄs6 ffȰpOy>0DLputh'5GzR<(c%0,KG^­Zp¨Z-Ӆa^^nҷYOxxڄB#RvdŤlU;#`5GFY j}߷ޗ˺rwzHJ}̼DjZx6a`2t7}Su9JtL~J~Ho@g+aC"Ȝ =˜FzAŏ{p wա`JRkRxEwt vאp+\hBEef|+l$F)@Y>*Ka Hn>caffjjNfL}oKMa4!Ç,'N\/Kᵚ\ji܈t a)rFUС9L3IV%#G:yR8|lYOxhi5-4iѹ-f@\Z)/^R$~߶{˚^Z1R_ņSa̽d>Hț @܉Lwpp2eknf1Iݗ3஀;"1K EdR 9ᥓc4G&Fyз}ɱ,mG_F xU>c'ĮS:ń[n/>{Tݞq[@~\,ISx XJ0]*|\zNYcҥV \7R-Hd]1ROO4L}zs뺯}.OsPQZ7wȪkp!y-'h$祍d>)Cy_ﯯ__#[Wu+Ģ E`n V_@0S.þsgy@XMTcA- 9Z/pcsfy};QTU]((|Uī;XHTirjpp||фS?7\߭F,L{1FYaf|I3J2Ff%P4| v ]8]PŚZtw&Lg#1q#iZ-חbcZ޺T޿AKUb3__9ܧp[C ֤P9֚s&d~a.0ZrX%XvXѺ~o+&q1~9{ "qv]-ޗc@v?$ٱ)Iр8]J(I>$iSoa-Qi]Z(x;nkޣR j8x9 MwAoLAAC?#R=Hu1y2Tz'?GSϾBh2Q3i9P4rK]o&B)̖ε*bf^.{9ZAu?ל!p݄ϻ1s}]vucqw:t )=pZ+!15CхsL)GC"͜G7U A, #RPISƆNh=51^_hja)J.q75{SOJ;vݶ ׺7KaqT;Fp ?Yܝrԁ:&)o}B!(hqMuF,{8!Ζy~ /bS.1N`%5P ejcMR't{1S8E΍j[]rfy OrVP=#]bpO_u4v뺯#9nTS?7s??3T Z2隍BM܆S[ h]k'`ƈo0C@L!H'ODpSM59Pk݋u begYYHy.!3UASsfQBI!/qlMASL4 6 ׯۺ|]8\uNS?nJ"Yfu-ڸp'?E&`s8TE}@0K7m%܂ )rIU SP‰ܼuϩ/J R mMp7s.-M.MzCHkژJ*yEBlJ \'65j !K??u:(\\|幹?O3,ꨫmlLd:P M?=nQ,wH:s/DĿS$gtM8PXFcC(2F .rΛTtxQh b u6fN;ӕްF c7tJŷVS]goA~^}#I|5Åw~\ˬyњ0)R1}]߿+{v#LqÖy꩟PGBYVAnVެnE?3PԓKuR9ؔ  "Hh9"D!RAD!2|KS3ӈ}Y #A|;NRM0WoT9ߦtFav!C+6a: an{&|ؼkM(49?9{~8\,kq=ϨL-QLv?>'}-5&_ MZ#n,SXC| pf-{Go W! %L|2p2X̌i'Z<  7i6-58{a1lrGqQ!o 2U:k}Ϲ$J{2"5q8c4 ?:u^߿<:8st᧹?Ofil'ܚλs(}^:=[`pk"0[yy63 ` y{8{xYr9yM!Rp=zi:mi٨ H^!0Ϲ p! <陉.@Bnօcf#ߤ!"gV9Kksϩjބ`D-pSm>C߿Wv߽7GOR?s^VO=ˋ,}Njy)GI#`rE7ixl>y*LocޘsN^ؒA}HlOhex9ּ\kΛC_jtdlB*EƜ0ȡTr ֜sN8FބX rw3JfʌZK۱D­ ͓o+"”}k;< +zTuS>F>{꩟PaOs$f=!!@M5c*Vݩ[c [?'Azɵ"zM"嗭5[cblxC]9w)0A% /I\ogjesOau V6w] 'byhք("9`5QUx="\M-D&̨C%끙s *[Pi(_9nۿeӥRa<~J%ewɜIuL}9L,"!}a›g#)6P7 gWEUk?>@26̺WHT!L7C9ߍ9u Epxn73\n><Ґn=W]kR"-f56V*1jmr[0 SE?s(c_s4 Pzhך*SO؆#pEjV5>n)xb4om- fݘy8E]һZ 3QVV$ęX[Ȥ3yf\BVDn ԙ0S@\$2#ܔ)l׷^y9R pؤp͈nnüOgב_"Vr{8ctAi^9]W*xnO=&,7!!pk7>FBp0]M>qM;vE2C#ji[%789Qc+RJF…5M] f&]ƢF\:U8lM(?HL.mj2#ʑ9K< Sާej;N'SX*8==hmZ(RJḟWMH8ct!wW.JϏ&S?<H#"n)֚9"S]^іAA]z!^rԑdeS[ 3ocű/ s&Қ09#r!NbIkn[i;Z &}{7+ #2ɕӵz]((;av{6B'nr}ǀQ4X";(6c_D*VغCP%p8=3/\$d+܍M6ѣza9K72.&<ri ;;oFyV61W$ZZF\o #-ӖҚ}<-=3St^7 uicx$FzO*™H!z'Tړ@@~7fVU7ɕҾz _ fS]m"nl$dv3g Al^(dL\E@M2&Tˁԯນ `J+{JI,'0P!ɳLGm 78_,;Ee`"@Z?83 CZK;ya +%N4{*1r7Tby7#|QF*tȡh-wDŽԉ3Rg3*⃙9^LUɹ̉apHB1NxnO=J e~(Kk](}SWI5T R)\[9G@>qbPp˘XќWERpxԓ,@) 03>Gai n"5 @xV\LjـUޞQGff^jQek%JŞek} b8̭ʰ51]bDf=~@PDp֤M2X@ LH踛yPNB\-0-URQN#&ZKj Qk%I3U3BJy6tHE51"GYm[Qn➏}1FR*3PPsl߹+**2YssޅaV NҒѶ1Mh?('X*73W}0 A;̈07peI3[psW5GHaF޴rf \QS'fG-;n4[{ZKiqp NQXw l`+6mB=‰A=HeNex>{εZS7]pP^#?'u 1EJGX) 'O sQKu3H @bm,%0m2( X A55­iRϑGYP7||q(ƚ/?m#kʼnʀ|nMmIL;"9i%7Wm9\A5)|50]}ݫc[cJ3jۮ[tK;IB 0}[k)tܗi- p3s_d,X*ϴR `N [~g] n+tnPJ1\s@NԱ$1xιREs5hy^-e9xESO=1vdo pJ᪊>z3˭1qM͂Z ֚PKPͽ{(dߗR#%AoEmCN9B _^PE(%(=ٱZx砪+i_S}9IGf2N1(yPQ!\לHh/7m3"Ko-b}hS(8_ uY>ڤSO"MU#>([t867#H^t$9>iL`ԝ8{`e~59G'4$nܭ=<%+|Dqsp=>X$T}gK:\ Y^{9罌v0iھ__[I9&_N*ޘ\S㰜+I˰i+mQBbGour2O=3J"aFEqR!̨ע2uTw{I(j0* tTԕ8ns,J%H#5ꭧs͹9뾗3Fvrk#A;e\S)=FťrMytYkix$ _W9VW\k.$ZLzc!>䫠ZFKS˜UלW뾗qn- #um+c~Uj(>< `{0} ,QyD[OGh %MQMB -]ki#Cuy$PnHp\H>pEz*@x4IRZsEތE> 7Dž%s76#|ߴ ͬG9)A|rz#ܸ81\woBakIZG7x r6?)>Z4~ȠWF Ǧ*"b#ߋgiR eJdiM#e" FM)'{,1:PݘBZ}w[R J.1:ANܟzGǜZ$5#[fԢ`1qaW0}(z@]\f"bdw}8__+W \:G Sre-@ђmcx`:u8 ӕ{AZ hSEie^ !ʛH+Ƚ098mAZ0k&1q0Q [sGLxսͷJ~H17]I(:QBj\ZpLIr\:7D[RG0J::B. ׯ_h;4cSkދ_5y<1DB(XYꃰ= .XZ[ԁ0'7 J HaNAgEZ .u]LAH0`غn󞋏s }꩟QyUpU8KDә̲ӹ2 jO#+^4gn:[yl9'q(0]Jy u~Bgd!׼o?#w0w>ʑp u\r[ `$ՄX)S]S< #/'#]IckMkQ_S"bnL p@ RK{h(乹?Om<̭٘a>iھ>.-9хUU}uvᆣ H)۲5{tM8u}FB)7" o0{F&QqǑ| *|ҖH|e?WP!|I}"|۟Qn*([/!j{z{`B%CL2/ܝ$4l$.P 2ƱQ zkiO=3֣D7<,]9qB%d4quӤ \g~ׯ-#_^Tގ!{Q L&:4f!PT){n53l, yOGU*iLQ` g0ΩIL>z&Ss1m `,9XyxZṕ@Da׹dcolW3LS'c@xؚ${=W$~JitLL[[zG$[J6[Eq믿5$4uׯu6 h}4rйnf"ﯿ~( 5gu7sgwl&'6HA'/1AVL1q!lV٬xw3ju#e2 bp뭉6R=GeB#eOs꩟P` ޑC;-yAI~}}GcW5z5B}] T_zu2pؚ믿19\+/c]D[ WX?,0wԑblw2QʁPc@p>wjǖI HrTݰTUE1IOD3̍@)SQS_µh5 ޤfcXc{R{GS D͐XKչRGS?j̒y:_~}t"L|]z-h=ϯBJ*/!aǚoha ~^@2ӵ&8~뺅Y!,P%-%='b 8ɟlnZ t&R33UNɆXajf&L4S3}|Swpaa{%p uCO8RgߚpmZV S?)oŷ5e,L(x6WBZkf~o%"8T뫳b5Bd udwX'+k_ׯܺݡޅABXUSbٕ7u scv 0q"[k͚f!0,Y9e/BD4 b$CrU9׶;}4Ԏ姘-0v mܟzT^+^(G@S{xggh&"mC}-j[f&akw;_yd9jA$ZJb(Lk4x&bW'm^p1E{{ytA]T%܋,ĞLV$1`@Hkʹ;3.."AHpdklgKSDgoq y05 W<>-:TiO=ƷeZaAw)I #${ub{z}T {Jgo,m9!hΪ_Uw'l߿<{7O“Gok̐llflD"2Tz~ҡ(^EDWjݧ$1 %|"=C+Tɴj`3[Am@sk} B"*B$OsP^m}F$Rw0Xu%MRG,p[p [v|F뽷|ҧi`ED4q~ׯ9y1f_a뾮+^q$8J-KeyNۗV(JI֬Sʹ%,͝}G;#NQ[Ο0p3yp-= !v7iȟK[e;qǹ):B֗(3Vjgˀux`w(sTMܟzT=҇d{ՉLu[.jN$WaK[pe' t <%ng8=7 %Nr{zִTT4?6<{8*Lۋ-v9(Ie6ER޵mwN89qхv~HlAF~@5^5:6љ\'-p>Zؔ Lq ffp/SONɈ>8X(똁p) Fj5 P#rngDfFE1X='Ja~jj)ew}-e%MNG DX˽DEGχ"fJ2F.s|qBX˘Bޞ^[iDLb n4Nܟz'QDt*; w$?6 i#rDϱP;2q,t"u}եjr 7漑״y)Y(~^@iۯ9%3C֗IE_ 22eݍ@Jy,Ո]SWN岶&)%ںz6ZcM1αDnv+B2#ܚml5K?p @ rSOFJpl5c<xpSa1P^34"o$&Urܫ !j\z0șYD4lmDWɼ#܉3ZKAziKf(׾uFŏq&{c8\:#NݛGT,[  ʨ)Gfc7(<@Ҥ5i3*SOJ99%\<,Op[ݕR)b>1qkT(xy$<"HDGRZ#`q40XX1vC~¼Lfu-=ᚊ䜝SKOhZdE DvkH0aƽ|}^GX2 Hé(\sWA,LB& EZ w{}HjfXPdd@e~ׇWb?ԏOREq4b٪T'B3Qhdt8zƃRg fejPX[4Acܢt5Sf+:g:a59Q!)q*$܂>$#[t3Gc e" QyإdEFՄ0 $6Fl[xbeo"0MyfOkA;8|^9Tv]Rx3DZ uast!>ZjNڇH ȱLn}dsc+)ltεSfN}s9( c"}1L{~3|ssrbbQ8q0GZ wR/]uE"uVZ橧~B AĭFa6I?00ݳ13]+Ճ);DDArt{5UjC1`FDH:\q|zcѻ0-LicC62O8:7zH/~Axah}ߗ s&~_sQ[YZ8hڄovyf|4RIZ 3\J#lIMB>ԏ0Dxhu& 6ѐ(H{ EN&TǕ40*֜M%vz^;nqdfimC 4WLj>ń UI̢[wSx |Ɏ(.ʌGk AnJF^M8|1L}][ d'KNZ״y;u?$Lt6mN{nt:`]eX0[Χ?Op ʢ pXDqtU+(3B(l9 Q:ii˜{Ǹ?d֚u)A˂D=\c#+gCarV!Gw5K%3ŽO\bq4 [){ 쉘lgt4:%]a}5o+ ~@֛ I7Œ ÕZ͞S?zSy  q VeNDNѵB:3_4bSy6s0\knG84IAE2EA}tsʩca2'h` 7P`3Zjl/KcBcRsSj.;t-T Y?gGDfnIlᎩ.K(Kk/[)O3Ug CzܟzTsc$f%N"!3X8Jf- aJp!.C:"6W Nw]a-}C>WHJ:!m),|EĭMRԔ<*l)3 ):%J3UDzva\sK{(Z "X$nfjLҳۚFE,7͘$ , TIB>O7!gZWk ouGC݈ pҤjUQT!rUh.Uߩ~ggf Sh \yy' tݔ3^,6Ei䤼SW"9KPgo5o5}]20;ɿ۲Ԋ M]-a7f&;8aSBop;_h2CuIa9 3~HE3҄ulo9#4Q "͝l"LSlֲDE}@lŇC`=s7< 뾗zij%4_Z+="r8o~׽buLk.|"B Jp`IVqFx}}ppGE(Bj̵J"4#ѹ?ԏdx.Ԅ 3 b߹AR\QKuMZ4'&K"JtQ=ރrnX 4Y:o{kEs['q7-:B'q)QʨN>4xSZy}u#)n ljH9 6a50gD:܈&+eb :;N S9Yo.0\2X~9&SUUSO2s`iQ4߿(\;:clj8"0Po:UgȦ6}ܽVC>ȟ}(*uRO|pĿ4tpCl}, tVcrMLp|k,B#8u˯[*L3ps=9(f-;Hv*:L3R6#AviO=j-U#ֺDc­KXV Ka+J f Fk!cWti^b$Nt%@P&lښeUuk&W]y$ٯj'vMQ'ȅ.p t81(L}߅,!~}^W!1qvvC.useMȗVVƚb g,S?5UG6wp;Z^eGotlV@7i.rEz$T>cF:ui+^LL?ͦ1s3 &xg#mtC~ML.p+ "t^ƫ3YH |2#5ֽ NWw|֬xRgo;; Nb$}&pƵIi.yO=tMҳlj$qƈM@ޞ(̍얾sI߿s.[BSBĚ[(]csW!mC*,.Y!Ww7S{.x> غuq !SD֚mM:gEU8:1L׼9#,}>a뾮V2lqQ6y:}h glwmQ\ܟz'? 9!Rnzb#m);4P"hU݃ Be&6&BP Dz5fF:S͌Ma|ZDϾ5jJu}gXP}?T(sO{u # 4`[1y!B{7Rz_K85ܧ.T))l L~߯KhOGm5{ۺunvޚ 3{^B~B}еzcx輒Ho| RcD>tk*[KaRj{}psScef dCUT&Ҟ9^{=<<@jpͦ\ۼF6^ O>q9P~g)k. i- FE&oI $LaMٶ 12M}:EZ=>~@`n?a"uikw!qE5켺?G{EPd1JwN){q>Zp3]y*q\4"ը>-)'{ݟ 1f7+l{Y+#ޛ(G)`}蜈`ڎTBLG4b !l:p]0SuwBL"B*Dnܛ2{k=~@G#0&!Hzyg`U-go4#"d,Nƞ33yGxXRE=; @  <ѐyZppŽ3~B[XqѽTNKĞt61GiXXRY'J+eZb&aR7"N|"‹Uwe 78 Z9S QHUܖgRJʦs(iXk} MXŃSM"#G;q8lP^܏'̗#D5pƜ5S?K<̍3"w0B®xp)EXL! 8I^α)V!͞gTGEZ·cGJ ܔ)&'^ SŒS<줔ړd_n\Iwp w#6p77#"ޏ̈́= 5?dJWS:z1Bl{icEbrF}gI#i7ܟzԯ6o[6EfF72a *^xY]l'%#hbub'tR'}5/ 4 (<%7D,-y] wVrzy[b)lHZTc o `En7[vZ7SJ80Xz{(ْEjύ7j鱽*{e7 3INpwza:S? ].!II՜pnBHL LwjOs#g.*po)e WTsDl[M"L֤1S6=#sZF"r8E>=Lr!1Ix7 F"r \ :c$nIFKʍ7͏LC;ӾIcr[iO=H Ώ'(1T56uaD&}Rʕ'2(gD_ʌ(>T#tħTլF#7S&Ejf$)Ό0s18F !KGEQ.񜫷R*>V(5bc, DGGTg|Iz03x  &tKUIB~|1\ap+qbiƔb(jX ~nO=*:o:1`fAa@ؚMsu3bZfnf_8c<55ES,U'I>{=lfƣmL{+Z"%-RVjoD7$SY_qMM̈́ij3|>p|GeV @b{m b2)(SONk4y҃']#,l1'ͪ EҙҊ"umd&d1'7DRqj!,9v@I]qț{eZ^#KӌZ x]i{Oo)@D"D`<~B9Zvqt!]M[LnI<"`@h%H7 H6@80}upC^G~sSY{D&{T4U8q.41wD,0/EcE܍  p)^+dG[-*f+r咊ﳻ20#!TL1!DDڼCK'.ټp[<O=#{^ +j摆4jf)02%00K~0x3o %IcM n_mqG5&X>}lnp;vGuIc7wkOSIJD?|`&]BBsaAnLp"ɑjtz/ZJ f悛Σ3s꩟P3#RQTm r&7KAX9 Xi p[ju Fg=׍ 78ő, xd_&SuqcsC= `Q 7C2N9tw i+A̮2|I.]ir3Uc (Xr2,s1c{4OMím:?1{O=#꿺kڑ`&Q {$4u-x- my}.TJ~w_ئD)#%1ƨWT<ywǀ8C@ĉĩ졾EkG0o|.ƿ5\T8 K'R[.":MDak)qN LPU]KZk-"uS?WLkc wj(;|5n[AF EI")w̹7M6VD,Tp#aT̉TF8ApS T"=D)ۢI?^1j mk+\c&_{~2툉gK@Bu&'fffbp9r>5bnũ..5}}#6;{0<,(5:AJ3|Akiwc"b0*KcV}PaFppmyXx[SX֚k.Av8H~SO?aʉ>)6<ј#tUN2c4&wp՚䨄X=u,aiw{"=X,Z|K2oP$`9gwއQE꺟̕pә 'gWBEdt7X@WwD 4 v6f\A̟Ldԏn@i a1fk1F+fy\j,7)IMíh!{D=6`9 !}IsLNaz_{|}kڽLpK褩*z130\D3㈲kf}$fS1#g8^љ\gt#T jܘ\{p3VDXr!^S?rmVqq1zCu]~$00[(JՑڥP2xČԢ595V`ozgݺ:)%mUW?NBƄ"210ۢ0$BnB|4k1z(#]`RtFD3Yk,aܑ7b&҄o~B5Kw uLZkMa V=7ͅn5{pSӤ^5"{&#ˤVxUR /y_5y6[}u?L׼뾗sT 5t5V[6Uy[9  ]ʍ6,`uev&3[+oM>B`8*tܪZx(&p[ѹ?ԏJټ\ ΄0 \u{+dKDkd)%K~_nC{"OSqus( 0t]K^_]>J)lJfp[9pi0itR=+JxRh]xtۜӐDf^ ˥gurzkӌAyOr8"ñj A\$D/;(œ2W<SOzߓzO"Rr;^_!s ֜~ѓYq֞AjDGpi*\ |\pTsǿ8_,a !~z5&5D^q9~qܲvL7m d1E oi}t! rm|XPS(͵8F94iT~wV#n!^^# Z=GR11=ԏS*x(r9s.Kj5qKak:I{S JK iGJ?w{x nml.-^~W)Ϳ7Ҕ@1Rpqks&Xf%%~h]a5k4v+KOmz?u3}ڴ,(KHNeeQm9SO0 %3PDAp=p;asr.%|ZyoPhnN[b 󞹉 q*8MzcENuׯy.E#{.GPrn6{nl9ػ"f)# ,͘7#<Ϟݯ>rLp*s1C8*EZSc z|pn>"(?n3cebܟz_ɸE   /fFjFekuc_=^d!͉bk6~P\ C5HTO?4K?c&+33rr/%HռLp q`/b&5!bi̮D9!ɸmʨFPD&pE?SMqa7C͸73]J}GCʔ˜ᶖڧg 8c &13Rjf/Œc<~@ }dRswoFp_k:8z/u#L.KP:IMD+mcɯt<\""'Rc">q!Qa_9W0\--!K@韛Aȳ.]BԌ k>;qkQc$P%r=87a%-LRs$jF{nRZDd܍5ffjnn0@2aZqѠt{Nye譥W)4KL]۫K9q<ʲu#{HnI3%uMdg/`>gݒ~@&F DmѰ\e.DRGC@:}9&d[k*fڌnEzqHƺ$b +ZcܵM#ӑ5MB/oMC,ĬQ>1=d|!2cN&)be[/S4XG̲&V{yN'C(s;x a`_`((7RhdMv2I1j[~[FQE[<9K$zk7~஻~Bf̀9GZ8;˹ڷ䂕/M*jk}wf`-$3Koq]j 8L32*izXLkt"4(PJ&.3S@!21]T!(n@jgaFhqd0s\cv >G %bRU,K%m>;V8۝z]?Z>^?c5;Z9= `Z)z9$Yi ~֭Zh3"W0_3[&"g2B^kLÚrq\(O΢+cU.1}tG Id7gzIf{$i%蔲~Dr?>~8f))h*>7s"Q5 efjU}Cߓя8*mfklX̐wo^ϯ3~@l8yM3wB3Zö(CgF24UHҏ9|1Umnj` YDMJ |]7TU=bsXMc{(o"ZQu q\f$!O \ò$)>ղz޺]wpǯ_>njWޜgk4HQkL+ %IBP+4՞Cl͆$!Iueq?q4qgA ORYSpХ/Ȉ"(~})ۦ͔zHY_`w,db^ٶ{D֛ր|7}.;[+ L =[_ljϜ^1{o7IɤY}F&y#GԨdqb&1q4}aC&ވ0>*<:Wc[eRQӭhM$ .Jfz~yh\Q=㬄 I9]SU05k6[˕ak$}qAF=N<+m#ڎ1ĴF‹ۙQztwo2걨6#^JPhdf)~]?u^~0fݛGpPը L9\K;2<XdU{lC 9ل3+ZAhq>fBGT)#*QU6+F3"ɔn|V= xY$ I#}f{O;r,W/ɹwg}G&!Ssm42Lnw+|P1G4IxAQ Qۼ xHTJ>u|zكT{KSBQslIf0 ^wXXy& ;ڻ$˜s)Po.CVU'K_#Y2zy8 a X#\,ddJ ksQRIk_Zd}J4HT}s뮟Pc<)j~>) 4$}%Rg 3@V[.TXq].SRL^Cdp# ~]?Ci;X^T)\pU5&Fk&Hz啮Pijto.R8dXQ1u1;%m$xs{ǹƫGטN@ ͌HB()#J,#kȖwsQ2qjʼ]8f% 4d̡*|q-Fo؂"n z 9?A$Xjq۠ su z=_y]{ȝ}L$KdzDU(n5!Wqd{ Qmj+k?PN}\gS!!3V+>ʤT(C 7 xM%CYsH6GDU2EjDZ4Fr7lɢk)y>\טL],A[ot E̼\ViJE7Yc^qV\D.گmfduYUXyK 5Uy3VҜfId$ "fDA׬"&)U*EYuM`{+!&VX_*"%N,wKSzém?-:i&X3,z]w-P3GS E*Zc=ΐLA 7`b e9Y`tךN21$ Tu2R]ފ4f5EMi^dt+3[b3E4Ştkrb}}khRJ-M:ige/E}qZUXvo{"[F+R%]w]Y  B:fH]@j566"=H"~p| oC&#Q}!GpC3nj@k>@_F)XS 2dq"ҬY높-I-"βUU lYKbh *&fo 0NM5ߚs"U@7EюTreɒnf@2Sl9Nkn DmA~3v3~TLgM8fIX?yM%X]3Mִ=: +y(2~ۗG*?a ^5\R]5kTK$ޚ 3D1kuQV3MkYx/M%xPAiN %cv/d=x$[S-"~{z]?5ʨ:ϳ7=?tSЛKL…Y &Dfܽ}qT=ץ42\{" 8,t{^>#!s\6Ȭ`cZkM]_L2iKQ3sW!RnI*oT#O}xgi'Yy#u H@:2@n* k-DDqnw3 G2"S0#OS`EI("BU L.CR\ö )xa] x@pDP f*>/X]lDHbcNVs͐nkzD\||AF82b1ףͬ?YHߡ'JA) cj "7\U9q@eZkGAWG=z4PƄB&j8gTtwfid8"Sq~%h 1S&PdBncO!R]t~d) pg Ed2T2C@`HUDʄHr*w#6,"j3RY<2bկAaͤ,[ =Qz˹u@ C!X|d$ kWag k\.~[MLw3JEt+fv7&Zk!I )-!84ac$KRoXlW\|b1uij!@2J9+>zﭵM' zdʷz'w=rKS)!3+Yi_\,n1! Yk͆9g4dE;1?HXwku<Σ8M^uZl>J*78쮻~BUk\8ϣ?qt2bd+n{tRenrW.#E)tB.M83k5i>vdmp)U.l*qT5$&eK掊?;{@ZQ%&3FlQZ$|5_ǀaqdW뺮1Y,Sl@{(2ԴNOO=ikn_qY~]?"*G3 [τ^O_W,Rm P@UwnXZo iD=r]K*~x//Z k|ۚטFkZh5YS$Yv,n=C0"9BDT [mLJױs\2V`+Ԛͫd nz=_*԰> ' #gyM1GxBwGƞ~@1u~$c8XDWWh1f_ϾB\WYUU * [kPlnf*bdI辑bTQ=E,X1oM$%<\)*`H ]QRzsdR@J[X3|Pۡke :>2VWq2fP]` 3dCt>C~Hn5b"j jƜsN_(tmV1!)~7gc#_7}.ܠU\TX)q)zוPU "䎘՟'ZSZYK[I)svK_fRq\ꛢŀ@v6k1ǜwN7da$-t_gJX/2@T[;lˆyXFo@B @|)ѽ5LiӖ$f1E4y7G?nȺqX)daP2V@ffeQʿC_e'iYDKr*7\QdfLj"RPކQAr5whMˮI9L( +B7 ֋..Y-`%ћ!)DB=Z!S[~?l"#5+*l14pp 2tcL$=#減]w:8V5 T^Ufaw!",m.jǫ6lH$*TT֜ZҊEy+RAH.DO2J6v"VMF0c$ܙZoG7Cb6V& Y0&D8.=jB 4riHs}L8UBdզ1~<@qK!'ԯx/Х|RwyF84C>=3U"KThcFB[3p](P6j-V-tvx͝b PJ>{^~[FʢΨ0ԉ`V6#֛iVOE H09,Y2܀%io29 s2y]czD#` kYGV4Fx7"7OÇ [^VM3Fӌyj7I[!B"lHNYk T2+Nڱu@1j>e*8ǸkL'P%ug_L^F=0۱p+RR* ,bùxCJ2JVҦ TIFF\.s0AIuM1)$i+53nuL0EF$TjXy ]W~~m:S̺f Ebb+^ ]aG򞒾RBWܝK׉wwOS$}6%Z)zנJ%LYR)HPk{Zi,vnSs@9^ 1Ղkov,~9EȃL5I|)ЙZ))skDW`nX`nw<{A5猂€Z[3zm.]DTLgX݄yt?2Se]Ϻ> \IXߚ%kdS<,9 %yN1)%3.~,n/ W;!֙MT$I,+0Ȓd+o D#k/` KKXvTYL$tQZGԽJFH*. VkBo C+-5(Pk?+#1|8&]%/AbmUEO[~.R!J_iPsғz=|5\ .|s>\6TΞ1&FT\&Q/h$kyMүuO8$ÝIgrg<^֚1k %)ɘ\}b;[\QwX8XQ%ת2PVJ$#dmIPqPrkYd^$]WX~$X-:M=NĪB#Z矯?h N&x|^3"me2iⶍ%_1{ ^Y'mB3B -ge`>>>CS3Ě*H |X?I{,A%޼}g1<z~il9q~|GP%\ %9|s¹)a ƞWV.mqp[o]w JQU)Ydׇ7h+ZBe|ˈD[Z5+$bLhÒeB@kaбm5R܊=$!a!T*#Hnvu踕Q]%$LYa*rR$K9ۯW&p0>q >ysl KNc9<}"0Uns s94"y~'+dL̄%z\A{$obm %9~] 9I Dj[q]Ⱥ0;TW 3|i*iTRxq֚0S{o,T>bk*fk:_?U-q=^ׯ_ !8zwA!^uvtCpSkPAu2HdkzoByy͖뮟P[ +t 1k HZE)\L5Q2IˣZ=TءxԵXC#8qM ^(biU)tJv5{+aR;ڈ8z뎉*A)$U%cEANjM}\~qtIPI8hB6} 2q}=_G LUx5S^lLN"Q3%xyq7 UWiUT2j;G:43"D1jA/kLd>np/SIDAT1e nj۹dԓ8<$e=$P  u]QZq1wkOqCUr3L S/)?R3ɘ߿~<1h`D5 Vcg& *"|]Qk]IAfeJX@z ly 뮟P94IF^5M-:JȖT^24#}kD"h 2y_5C8ϲotk.M y7\%M~=W/Sz1?L@pq42 2>,{+S+w*,F*7 5l.ӃR:IGn-ZI"*HBf-?QR5íma kGߚs=\l}c,W2l2c\u]q>0 ,1Z3EX4o]wZ1D"w"+^gӕ,2%?D"Jlk Y:c仧WE&>uq.VWqk̙Ђudu~M˚|.x Rq.72#|Q" Rv8G}WM +/}^(fТBEG5]zz=_W& åD UI>6}5M&Qgv]wd6BHfr>UzmJ5)[GB\-;7ntc[/t+˚v0>8^s1t)\ vXu!Ph=au٭c\~<ћU^at1ד kDUtE2Yzر сW@v3^)Eg5 X}>zLkǿ^ӎw9|F0U 6@~]?JfHZkER#,I2Ax7A:3"$}K] "}Vhu,JIYvwcy>Σ4/kNs1 =y]K~G3uoynv\ެ*HFsS!P)<#RR[jdLOן BmqO̓* #ZMeXݤ䦓gmQLWs7G ~]?dIټjPbˆ S G6&DIb);H'D}]k)}kqѻ$WkfhT-AYoG+mx=qDz,Bd=ِIRrӒ BaKz߯M3fs_(HvGWUxk\LQU#&$CmwsPi*I5i$DpF m/XB]!׼E^4xIsZkZ2ȶ=R縮gN jG5nI:<}Qzvү?׎v-i=hVT 3\5yͽM Y.׋HG7aY!yC1>ޛ ӏG2*PTCdSpNv]?*CTREED#I\&Qa_uhVf )J2ՏqE%q_w̞"ef243漮ry̔M0Q~IG_agLxtuLMEEJ9Zp_fyUZfzv5ΨdmQQѿ[ڸIQ2cg}m#tqKerY‰[]SRe9i\c̏_gWDي{%'C{[ZK%],T'+B,!{޻}|~~MgGo%9i~h 1"T$VBW,>1Tp`֚դun;UK&)5y@Bfͬ (C ~@+;v\)VU{\Lky`54Ҫ%kH~~J@ 3|^s?~IUZx #>IH(ǵ5c T*} `QCZ3Th/SEB*گ:jZ@ ج2 WJcf98&L$ f Jɛrm_wsPk&VZiPXom;/ k;T2dxV5_7Y4]K)`}Tx3G) !HeD#s {<PV5ZU^nY<@й$QFU`َ5Rpg?QO^%wų"ɘ,0r1YZAkZ'$z]w:Vsg௞ό6im5y^`ir2"/N+ DEMVQk=l&Ko8fP +FckY"ʹo)23*ifEZhҿT DLh* ZgZh9gZ[*̔z~+_9 7G@\v2A 1ڹsNGK:Q?)S7ezq7uef3VMEBUh#RC%L*|M %T-Jѯq2KZÌPQ0z=<ϣ5]ÖxG%N,z!ՐMWȾ#~57q.^n#kUJ6 cWrM8SͶ .+ 3tg[dܲ.Xv=I֐̘sxT/_19L@c^%~]?Xiͱ1BD BzSiBu2 BP)~,wi̩`$)-271TդXw9U!#21%&i>^ua=$ç9[__[,JPH&P15kpfh- לx:Ŭxd A:+dD+ cz"`DƔ~09|wsQ}k35)0jf,}1ihy䌺vJ )(m){31E0AR Z)/?1#eǎo%I`Mye}!;X>Q=>}_G8(6S[A23`KY9!hVG@6Tbq27 ̕]MstB{L2rpu׏VRpKPƙbb"Tɘ֤*uîƪj4P@qnn̦.V:0iFS0HZ`L04Zh"cΚ4¬@p6C|-C)KQdMZI5M_y@9l=#(3Ղ Qmr td?q4S•m̈́\]¬^ĄSIT9$c\qLFQuXq-뮟Pu},A: Hs>"= r,NS`E7yfLMf5SJuqBČ9,""tyvyaob0PSf"9^ZS!Cz`KJ^UL^X~czF0"<%aRYG rYQȺϏ>>G22<܏ד>Eik AJRyGˮ X>jy5Z-bٍRIcTC=\q !pL.o NQQS*bݳEM٨\8_o) B24h{HMLb Fzc|&=ɀ;L +ޚ,~ad@W6HAhR2|O<>>>g7Aii.Xp={ fAÊ\%=γw!""7~Bl>טNyJ eu b^טzp X ,m +MhҌ˾ QI>uP>Qnࡽy5uIY/U-vkMHәZ_ e*Ô1YE"7!3–f]}*bbG1a֢g7 )֎Z.c՜ orl9"kg,mOwsPtc5]~Z2}b6z]Фρz5wѺfn礪%֡%fW57Rcaf8SXb#K/jI-Y&ʤrCTev wwbif^!dT&_8P$_^ ,e fr25*q?~]@JZ=^Q>fbk*Jfl2kWlQ 's{RQ|ώ59g]0c*1k4EQLbdk__>Σ-T2!LM1 Ĭ@D@rRɨSQ}Oc6׉ʈ;鮻~B]1rXmHČ O=>*9fڒ뾬!6p=k_J%T'Zw3V^zSBmTEՔu5SO#T$j}K>ƕgM$_ew⿈@)"ëqM`ߥ%"Xb7SBZWa!z+eu\:ucX9Vs%huO_lմv U &ɐ~MAza!gh؃DnXb Q߼( } Lri%"Zl@ 03#"z +pX+=d.Bt>MEP X,5 /Lub,5թZN&;SZ}}Pf${SI}13ڃNJKIGx}߿=$mj-|k8Q/E(`a2":S<]2Yx} 'p=#%Kf*kP~B=:\ |J-&ޢj *P~/<Ñs|a|]cI@Y\1MAdp2`Ѽz?ʓץf J${oY?<917=!UXBJɌx}~z53t~B -).ya [r*{|Z&Ș zE, z k#!*.czIwk pÙPnnH0{ƽѬ^HGM ̎4&#b8iK(0 :s=1Q)|AXi?YKjh:\AAj52pjNT:!j<ńW]wZzMP)7v03Z~՚;F*Ճ)h\uͥȈ!pIz5X3I.DX9 zJrƢY<EeLdn̏&YmW0X}.@NAD @4ERJY|=?|&ւk>n_J){h$nE9%V#ޜx+C.o)2@S q/T'gnc&mߡxFFYDz\Kn w A2,͸Z Ɉ /a à l2 "8{=juսw|%52RS"zS/eջ ͖`2ӽV|\oQ >$cstƴt9ݽ dM< ۮ pajG +/XϲyGM~TC2]Az!5k9)ŚBuF #`zIFr?|t-@HuӌM*Iâ٘KBdR^֥({db-LP1n]wؑCDV^ݽ3Yu/XvVi2E&ֱ "E0hHa菏f6r ld v9yGqXJÅ 6k5c}Q*L Vsd)$XQ N`7ɥ9T2lEH2jpΨ[eaOTo]wP י,芈 e=p%c+!dpVN7 =ڇXQ ZͿ;8eL͘w$)I&C1cˌ*,BZ R3M@T&ଭJ2 foBϏϏX?3"5 lԆW]f_gto~M2s)5/w*6wROΡGd O*fUA h*b֚IT8G!^jם,r)R>_OBw&慌jҪ֏8aN>J' "!Î~;1fԹ`E͚m!5(S>lɬY Y}3V;Q!Kޛ5S?d$uustUw* IszoH*L)Vd14ffV:{^DqfCHF}hGDisp)ѶF)Y,[y2#M[3%ndǹns4YB& 8m"J7yWC`mJwY,4JKg},CY&;ԘwsPXQ49[%oeb AZ pj3.}u͈҈[]A*R4lP㣦Q1_׈֖)PQ;O*6m~@e2ǜs67պʕ}QtC3! ")""bJ*LsϘ1^W[rgB='*~+Q WxǒRC6+weqv׵sMjf_"IƘq]Ad$)Q,9^D+DD4ۈ!EZfL13yړdz>z43óp -Lqgaf~]?H4vM݁ʩPke6""B$%boc ކedFĜHI:kZk`Df)و7B9`+B]R8TeTiMsH&u/7z i("{ޚWMs@AGMs9jåIFIK51sE$Pɘ=}"1^_￯^NWQ:2kd!q7 V{? ʤ*E{DD@BfgL)j(nIIIMhjLe3Lk5X뺮ϊM 똳]X`V=Tt'$Ze7%IEqGTD]AFBlާ1< -QZ:mֳpҴ--O9hP?x] G[vF"cι'd}ĢwsP(.jz9akE5DPI,W}ئ/YFakZ_L MZʤQ}/ +9cޗ^0*ccGffMRݛg &d@sPwWLF+:][qG/L8 /㫚)Pcrҽh`%ql#}w߁o@Q#U5E%*tct0 yGWaD2Wȝ4ǘ%%C+F~Ffۛ{d+Vy3#{\%EjIj+?]%c J^Ȯ.d95KT$Y^s1g<tɈ1^5&1Y@țqW@߄`+ ]#Bt5T/Lѹ2Efp$DSqM>_^s:fc6X X<Ef]s1L1+yz{z{ee,%!`缛]wHSZtAPDdORA[#"VD2LPA$:TH]k[,Lxǜӵ8dYs]5Z'*1[3lN18R"3HɌ]#<i0Au(li&4l@&15hxӂ%;ښN`-f` G-攬d1f%c&N ]w .2E5FH2ʺFn#S!XYlI= \ͽ$R*"dϡ_cNT^@טzo~4hPkGzbˠBT;5YA"=63Qd~G)ZM<ϳ`\sz\@1 ,,{ffei98 }p"{(߯e9kQܞ0減]w-"AX&3=W3tk60V3SHe] TSd1,e t]c"Y8cɣ-{W Sg7}ߵvLʊ,]jdQ@lo:Zdc4ۤx@w5KFKAfn(V`=2Idnk<0^2;=)XB$ Ē1 sLCufE}IJF'56P腨_\dEVHůBW^(kڱHd08R!&[GD$k!~?~=Φ ~ VŻ]%bdw 鮻~B] *"e5hgmeZ= "83Rgy%3X(>M2L>Ce,VZF43bae@+Hoܰ.߬:gzY}Ih{ 3dydtS3x= 2Q0&(YrȌ$ahe dQTGM8$FXv[)G̬Mq7ɑu;_Cd`=ŗK.5&++ZD5 ɐ[)$h-e*z  >@Ak{LMc'sl IZLIn0p躹{IXXJcd뺆G"K`|ymU;ExGouZ%=ﵫMi6%@&BE6!!菏__gW7z?x }H}E~B/߫{{[٥TI}N.!;;QuQ̧L$}jV\3EiU ΧvUU$',Ygawq Ču]3bPzq sŁ{jq>?"gh(7 Hf @_~q6HB뒏BH:RW鎌GT<#wʬ\Ծ%)oBv^.C4!cks 5@H G֠]RFIUUwsL蛴]+`, "Ž,A0z>yd>Y~8>11f=4kmꀑbg<ÄnDc:Ws *wf8}Njlϱb3騱u3*0;Q|:b;VhhhH8bJ.L.!fJvok읢t+>="j_4 J]uUo1!^Y4|}쀻c\%I2p|???@gWz^gQC,vd5UkEz~hOzüF ~>R+`6Ond߶'5D{kY3kܜd*fwsPof\;K"('h5ſ)}T%"k)3Tْ,JfȒ'+hOgBi59f,t ( ` (z^籦Zy]y9$@uOZD9$uw^2 |)u̵K#2 Qn* L2Vށ0VlJ.B;lz:h22sqd0tB[?pw*2RmK]@Mt08ϣi tϳf*\Qgo&LL2fI[Nh,#d".llXZQOhDU 0nŧE.zjz(fhda#sd fF;ż Bvo"cN$fK>r7 $R]e)d\b]WXe d*#U{kFRnur|oDr˒"LI8Iwgqx¶-L3"<)$?Z6-LB2^"]E%쇈*k)lDZb ?z8X/ vPǫÇ&|ZS5 ,Tn>FjV/)IՖ7x[h"[[e0yéJq @=x2J1 #%e]})`LA2j^3mh9J()3&MAb7PQ12 G&چ0"bJjt|N9]u;f﮻~B]u WtQP5]Q{-vXV~E*\J]k?dVosGݰeR %{\CdLSZch80%}V!sLEg_z֏9j=(a>U$ EHS4[VQ&ТOfLCLd#CuRGbGFV>qoD 3uO+@FZ,:,'~݁BBEH3=5򾞙lZ`Oed-N*FTfv.ֲ08Ԭ @9ZsSq8$$cU٢KFddl/6fcjlIrc"}BIbcfruDWIL*{\s~OnCVk5 !(H?T$I֚ILƼ]wZD\lyobI'APGmUBdqW햷`X[S,[gW5lq7u+nF+Vrlx^FS@KJz~s k,51I[^~dp5 fl{*IH;ǔC;UE֏< ! ֏$3ƻf̘sN;xPk8˜-#wsPU2$#r-+ ,$K7_j͚aP!s1E%i{_2:-ZHyQ$%h&/ V*7LF(szfI6S·u}f2Dimqaլwz)VtE"},_/j̤Y{fkn'1AeH˪ۚiH5mMф &7>wsPQ%sYhZmJ{2cՊ~5 }֚*4[3B Lr~r +:#7lV,zJk]55PN_H${ZG-|AB2"V~6ZvFR7/|kxhknB}xpo RL•" iMuKԚRҏ9]uOޚf f.&TTM% ,^iTcfP㈄m `ݘ$djxG15Lrł ff(|@XF&#M铛?-ͮjLf:8-95~V̢1_ m)>G#B|i>E6 $sH[7 ^5J?[.HȾ뮟PdوVEeM){>Q"%2aMxbe֏L}sg0;VJ55ϮHk-On[eKNNzSdB~tX SD@MSPن*$ӫDf%YzIYFӶ09n"\*HsDޛ /w/:$ "fۼ2L8~]?ZI^}:C$C %ެUШ&OSb:SWWEZ w[ ӒL k*B6Fqk7Q}MY]{޸*/k$UY’Ƙsn\+9u _pO|;3U)4HTz\[ETzqGkēDTs/|^QjmwJUޛ %D2.^1)jH$[y0&s1!EZ|I."Iz H15+douwPEzt_wQ}9 Y~ f |Y>1fm1 Svɭc1 kSȄ\ d-T./}BtJI"T~UV6tWф.Z$ZŦ"q7U Gq4E:2 IA? 8ƜA.3J@ԲQ܀\Ø=M~_lskz7oں r:mMqIbu0X#fZAB-PY.b&;,κcNm*ĞՠDAfYfTV%1BQyf5,ç)9zS(bлw+ܩqWM[rLaZ(_yZ?=45hQD]":]Qޖo}n轷V &G2jnPDDHVPIք%73AcX}VA4Ei,q2 S %>}1D ݄EGKiƸ H4>#`cpWQ51n 1_>޻uO(fMDyxs?(QkW DLO$$j.o k! ))H}e'b,V[5;[D=~gsSd,,UAE&-jJЋY"1dԬhQYޓLXWӥADg"!CM2Ƒ{Bi˚d-jfs^)jMhfzduO58)تLimy)xW4`?mYvދ}c9Zܪ2GA ̌0u`+Pd9"F# LP 4:" z GY2Y}k98ssba5@=sgco>[ˠR+N`4AZp))ЃL>{{kR3"fRTX >g.R)81 )ϘkP1 abaLg*3S#~)2ylzyS|~h ܂",3QgdMeK1g$F$S:-EZ+5QP12۝"*DeKy<͒%><ŬF$$xӇ|"<xRA kNQ0=9ĀzNtVgkɞ Baq4-nƵj\epSQkc)\}!u@\H,!qf#OMJD7w` )gi@Bimܹe3[#0\Gb)$Z?śB\VsG["iD% Kb=RZv7-RUUǭZktl:;s20Y$"9zePEm  %eYB._$S0`2kU0ɐ/Bpp Rդ OL+51E.uQkDy)H'rYfr\u[(K ZvR8,U"bXVQpHuHE^3Cxr˦[B9юHH1^..նez e/kKT!σ3"J)L^­sHZ`?"b(PjZF.|?EDgFk9Yj۶V sވ\Ys-=܆j݉BA$RyΉOS˪BL5a6rmARd,R{zL~b߯MAU]vn&UL,;]S=Kܯ e?kC $aefaBXCn㥫D>Rk3H2 gsˑ=^Cp I)d8Tݕo.L\ VhE)#3ύɖG> "ICU5si 2YK̜V-mִ:FernM"LӶfZ̔"3tdsK-_u(紞RB8Vgd {ڟZs)Ղ ,u۶0=_ΙՇ%$r8Z-~އ?awg,W:=50559@Rj2OHqUX{y 䲵%SjܩEN᪦:mV•)LSDW*3I>8~ޓL`2Q3KWp01ԑr T- ÅqH0mc.Xza.D%-8r;m߷iuyKYT/Sj-O]mLF>_k(ùX`JpZMϯ0GDO&lvd-Ⱥ8Z+3Al(:DT-:UWr"m(l2N$v_@Ȝz3 %IJ۾d#<kU!^& sZRxBveD`f)50)LUMUf#X{+NQzٳN,8*H<nTy ;Z*$ pM坆&#Jڊ s{#K&Rm<;pKcgQXtVa*uUW piIm6,@R$.Li#ZDY N m߷}kEFF f*A{[Tn 1:eJFwTu2<ƯDѦL|<fRC (\^j ȹF6w)E{ŦfQ:z"X4Ø-DZ<~v+B` =݊0A+mȯ=jW]*KU۶UT-(RK}h Rw^nM'\ZLFaڷSug 48XKP6ai4@n:n#PLN K.qeHxAA >”r *Gfdj%kJG>NuU[7kOMu"nLcTI(}`Ҙzޏ1' ڴD~UoHJm }Ν~w1\:HJ^ m }0-Ϭ"`ѲCŘ-߷ORi0•p2DKNcԊ4p͇"DҤ;.),O<9HjZɠMf`2¯1S:z.mEpt,=HS.mp=4]19A<컑W]&Xj+B[+ʙ6t *pgDUpimB`m9ܴ0AIR͜\g75yr+1gCGU&Yt*E egsמɦV"0L="Rp#wJ"w,c8bB%:?:}?tŤqm l"톫!byl[pDFxZs.3ղ[~CzSz~\7( UW")CM}8Gr=R!K2)3q^P3w\}W |H/!U5, 6Ĺ 2j2[ Õa)ltg!)!,hBbBn8UFwL]drmDрKSM` ~AOK(V@vMb~Uo&6%_ҖIqq®E=$8K 8›/nx w䙛Y % rTBN"iq.1އ!qsBJ!"ȇ*i1SidwD" 2LM -1^9Ǩ#*͔wf;mo&ڇE !G dU K8>'B^u)T ]`q}FtJ}@C DDae22@4yU89D@k->GN͵H#wE|\gf<Ҽ %=IL9ģ"Rcf9:Bc䮃`ɵ///~=& әX#\"` jaP^r-쉜dH:_u[s>B/$T(LNp"D{3><2ܔrhA `^J:w32^Lft}DR(Y,.\jTNbyffc(1}X{F RJ׮Wf%rON5Ș !jay<===Z(lP+ҹ@{)}&}5iLL@]F-ZjоUq<'۶mM/3U{ִVՒCG \} Qo9<5K?s2(<a!#$T,a5W̩lDܟRr3g"$ # Dn[^x;Íi1"W׆UWZvo"Ys<}kV PD(l).s7-)1s7W@s?hbò:~A\w\ZG@ 4: SZILLA,1fWZ`s*ܭd'L&$8@,l~{c >]-9d .i Jm gX5EmS}ڄ/Զ2t #sׇB\nj[eX?o& ] /kk?轩Jf1=4mb"89D{X,"Ǿm[40-K%})6wW5y6fadOb dQi=)$XA`IK OUډ<p%M~$ * afC3^Т=J۶maBnĘIif^UJ) \%Z3:, >,,33#~j{D鄙}^(l+~?s`\j+$eoV+#fcX+_{ȗ_E֏[/m-A! Tç1?bmkڷ`)cH Õ<٥1.'<&$QjtFY42~Ԛ9UW0cQ#XL UoZ`8)CK'-*S tAmM8_چO?Ptמ-OO/02HJԿ0$l۞-1,urGې-ِqTLpH.DE̋ZfwPD,p`<6n塑K|ds;k"U Bmj Y9@C!^3ԁCUftxP]DVrG!GePtR FazR$Ã,FLF#_yK R5 a}<{׏3144,=RLEJmهV۾ 2~2m3kUWp:Z=eۑIZ2ykCDJ)CU6ɭ<4桚e-V8`9 !nuᠰZGn1 ĒG2;OOLΈ0M{n:{jԡYv>(S7N2Kabק@ R<h19{b)By y<[kTa4G$Rjnه9° A( Ws7PZ=3TcnRkE(,Rjypv U3s$jpa)yru8 "搌.<2T3EwcI Z;SioC%6i:Ll<a|RF)R8YE&}XEWsHlͿpW]&*"rf:JyGZG"5'|]@}*Ξs(2;yh*ֳQUh#K=;R)P<yb۷DxFJ )i(#Ǯ*Y~a xwuܔ\afZLqN'6q٥Nq"Oڜ CH}FSkB "bs_@E\kzOmZ.%v=uRe $.RtĜ>,"yDU3\J-VcEś5ޏstym{kf:ivwl 8%IFxb)t9(~& +"f(E=JL= i0:cY"n:Fσ; fq)JQD\Vȫz#'̙mZKaHK8ڶ<0"!AcZW.JRsj2-¦1U.7)H KNVm ۣ !`Ҳ/pW/&Ym:hS'„)$;S"vGS8ix^k<@l: ^81}薷?n1t9WA]WHOxp/˄y5zk/"tyLm}Z+E2"-ȪFZͪ0\5O_"3HJ̅Iw 71r< #(É}POo1y~~gBsk͜lG=O35$7Ӓ .p\S qEx*Ģ6$]x8~~n8@XJy0Ky&;\Pͫ8i.nESWvUW+u*x+-C! sI`̝$Kgv襁)Tp'd"m{~YXN م Snw3z pf"ی,gl^d["ƽ2ٗ\buԖΛm& RgLYxT>z}'lfKZ76=Lܯdjʹ:5mOXLrl<9Rz)fֿM}3RmoS g "WKm@R⓼ VIoK""LT3Y+,I<kN,",Du=YkI"8Fa Η{@,%o:qc߇Bɩ0{OclXKq? De $!#~5zVkdQx<}UҒggdڏC(LÆqiM7ϥlc 9QQe.<0M䁙ELdc9e3&[\)0Ѻ?&9` w):ܤ0 I<}ed.;TUatCgЇcU~9hp7W58uayUW""̊Lbaݶmϵ%ι&%$^>>N M-& 3Af$]`3ZZP RZJRAbV&KK_iiL"|(H8.6M2δ({gOHXJ)EJt0e"1sDzU )ҊX 4eDRi=CJU:z8n پ/oULuUp wU1|5zV[E(lIy\[wc8B*V(X/ڭv]~gS+[R&+*ʌtۗۄ"> y^{}x0ӫK!RDV"ixA$79TgpR9clJTFzO(a4I#&9jʎ~ xm߷S{ g("5P7Qw"b"$m"jF!"(u1őB5\i'$ey!z`g|Mt@ZЍKj[8:&J~Ҹ,?KpiY 令s)ֶ^or<'SGw3/ieVa ,F01F&u'08C0n!KS7C w% 1qŞj-XH)u^,Wz9Xvk :dG̍´`fY|s.LfRk-V[b4j!nfLq2W]eIunk?8GWJconOOև:H1S1Ǚ=h:;f)Y&ަh4dWmz }J’I{h{0SSRV B03()i#ODϸ"N}vRd1XJm Oua̿"ߦ%]ఫz ΙiCͽ`py8m۶7vqo0avw?0,[*Z?n!S/wSiT( 2 sI{facFĤઙjme ?'wLBrm02&/)O>g0J-MY 1rIZZXIP X2L T1q\idmv 83!xA=@kzUo-gP)y% ޓME43ph!;_޿mkַ}>M9pϮM8X͔ A9SkKwPr,~B8>jAK}1nnVg+ afuѡ[m"Ga.!y1#K?G$$ZɝGdIq]~v fvue$Z_uUc RrWf  0ޏʰ~|5bRj۶8* R7@2T'@~X, Ami= 7Ui!#|j1cxoOn[ CLc7@9µQݒʅXUPD?d:YyCCɟY +q鵿p-3d0מ1}YY|gq5z%RV,*"gO`鄶sj?>MҮ]-$T"ڧ@>41`dQ*ڶ"Lk2#,,?2^~==*pxswngoQy5,>_BD9$yw4-+>^QDu̵2,;̷)3K0Ui9y6f` +ૹ_uyrwϲo[Z p xPɡGa踿&0Iav܋\,uN4PCyPfy8Қ xnIwItd>HmU0QK|Fxz=mԶm۶}߫ }7~v߷rݟwI~/l KRqFyezo S% J$`y1fsۀ~l *fj l q?jA$o`,_u[<f@Qr ~t"YBӆ>zA8/g G,Hj>{)B" " tivW6Oر֊P"k931ca:|omfuTڶ ;0 H6@jᚩ99Ln]A,EU8\[Jpw3"yby#RApNMk-%xq[!I>)Eo:`_u(n4?nϖ־ٛP gr͵=ZԘ[m¹g D2)\!Gd|Sx<[8նֲg^a5ˆE<DdkRzXrKkv8|E2ȡ qNA[jee# [)yo#h&)<8cF-und ­TU+R{%hm+6E.qi)D22h1w#G3#G[ < ٜi`jA¼2s5N*Dp(2Z])ܨn`F:T{, Yơ I{;j|XE˹L x̩Yjm6Z+Bpyq1 NRkϰUWbf43 33s) Qy! RJ$//ٸ Kq+7si8%bs SQ ww( fLX`3}4곤<R8C1:y恒hϖ'{xNb؀g"Lgj :xurw >!i1O>Z^AvͅTR[6r=~?ϛ)Y 3DG pܯMto۶9NDBM%p Ys ,LAEVs4+", an3 .ǵBLc %.وiA))rsX R29{zVXٗ4&+bۧ9viHMK3m<{̟C+uv"".>zt~hp<Km[.k1r5z 7Uڶm3nbv ᇻ:#Hxn@84qOAYI(̔Hѹl@RVjXD tc@Rf9$"Yy1y)l1IE7k3DŽ#5jAR<>b,1u#ww;> )H}l=#мAF7H\'Rir2W]6*fJ-CXqCC3,LZOwOR-O1%u,#jj.i %]ɏRs))mg 7$RLN@2%#"V K>5^y,ƃ#˃>Al )`'p0IͭںgI}y$3cCu3qncyCC5)<7KUW0S>Zr8' gb=T\f?fgbBpLMZu8QpV \nD ULMs"h2`mx Z$滊YyGX tX2F2UޭZظ[+i W`WsꪷPᦆ[4RBP+$\9<6KAU矔4~Vn٥Cm{kEJARZk[arc2|UȠR#Q1BnF22I'd% j7s#4‰ 1FH#}8%N)1G8j`1yO>6f?f&:"EuE~P˴ UW0U1B4ITd>i$lw# w%ų0+itV `)m2B*4wp" IKO:PRm'|%f-uA'&H!E<@"R@ \MeʉK }xuyz;3!R"D'Mϥ4=agf)6J]!:V sX?8>yÈP7Q1VFDjQXof)<%qZHϵ {twUnNa>!E(`ɬp2e!>۳A8M a֩:,acSvZ܄3^Z-_42D=)sdE )VL֮aJ#f$uoҮϒj>KZg.6a:VDf JHL.BWsꪷP #:l>yAfba)Gcj̽0|mVgDZ۶ sݨZJ-a>+Q ɫpS:K MѪd R)-;ٽM8e|!Ia) , (L D,<# Ki̔ dVTiB3yi-|R$x-MXYw1,#vB< "LWXUWr3BWxQ5SSe2 J Aa0}4lfՋ %&+@=@Ep3U`A\M)Au[fRSp 3" PIjWWUW23ay,U f8Qs3V#Oaݕ(LUQkUܙw$hyO%=Zb:snA=Wт#r0,anämۼX(\mO=mMȵUȟ0SL0!Rkqc!D1]3[JdGa088oU\jk[mҽDvV73w' Wr+c&^BREnyd܈a>EsBRj+U8-<,StK@x7xnNMGmMp &YfRڶm~(\o>z׳LS\jӹ:y܏쪱s""Ҥ#m((L `/p0N+ Rj^d"a3HHwsټ ois7"jW]n ~w$LP:e!'8"կ]M 6mnZ Cu yB(MNFu|=8Ñ#)[[ZBHwVCȭZT>9Zk°*#a*ar=D=-3n0%DŽTg5o6| n03' XJm۞$aS3rpOvc EC_u՛(XR2 f[JL(/R{ g$BDd${8[<2ʵ>PJ"l"m5arw]rџRimkIGZm[2j-]6ض Q[m ~(1`.%Ǚ!"G7ž&0Sfpk!\J[ϳw+Pn̒ nml\ۖ 1R$UWJEJ=[vDp:w^Ss(2TqU(L(l"at۷*dܐQu3 oHa~?RKu Wdyr OgpՒ/*ʰ~ޟ_=&a:#L9,00&QIQm+j! iU<ϮȠ&%MBg[Ba$\~ۓ6~:_uۨ5t\CLqáp͝fP½ybChWkv =u>ԩfƠfoo>q;d33sEG(BuS`6LHZ'Na1,< 2lqv5{0qmZ+%"ɕ²Z pHi|(q[t+Z7KaZ8ت,dq̳wz裏n{尳8\ڶo^{ܯmi?ـ.}I(|$9\H, MαxE4gO k?v[-D!MXJX E:'}Ş&wR]Xj?zя80'JR)($RBaHמC؉m*3 B._7XڶVk_8} " 3uǑ0χ uw^vZ9,.pUW"Ҷ"6@7q90LMͬp41F  0S@ fY0ܔKK'&;~lB0qǠ"7!y2k pLrdlb ff3d& K*sݶ}Z-t}ۄUtl[x9{{k5BF}_^Oފ i BHm[+Wܼي 3(1ڊt/,ofQƏϔQ \By?np0 bm^Z)l۾m, D%WU-$\tkgi0­qiP3:xy3# bf=9j=s*d6ʾo[(ٻ>{-NDvY6飏?w{Uң^^IC\DM6+dhr1}'̙qr՘Ea<[,0ejC=6ie4.8kaVZzbWݵt$ o-W!%N9[^E>ig~xU`$2p1§(a N nr}=uyS3}?U8~۶r l{sr8GMb Sk۶ք†O>w{ e;Z)ʘJl|~UoZDE旀fc)0q!F@D[#< ؚ0ӠvZlq}+ڞIM1/:ڏ>zj"s!fLD𻪪"5[$v)RZk)@ӞG{UudBSJdQ =: p.iX goqvi>+ZU:wm{UD:t(qu\u՛(Z+s;b S)=RMWB]3 $5Ƌsrusd*n*Hݠv3}ߛp(Ç&%|>SF8R1EVUUa֓zTHMh\[)U\.%k4#B$%5a?B8:YRJ#8>aM??2=2{dvoHSSđ5#UWbLˡ1q"Qr7& E0#;#%y6MIQ'L̹mVHm۪9´m߄B6LA>|'|m᪌p'xKL(J3*9_Z MY$FռWhKx1iČ W[ ``[g0l۶՜>4:?S"\xmvK\X984]uU? WΈԤ\U0_" D*&LG!U=iz w a!@[K;1Z#fۭA~ǿ'm:(̘g\6[LD aO||)c0ļf w`Yp"3!3"\4B|Lt᷵Tx-"{^F1l1(-f,6zť_u՛2B33yA1t@KQAXQ}8Db6N{T"َ{ZGYSRyu w~O>O>zڛP(13c0MT#msyFT^<A\2MfiHs{Ex#l94c{skȤ}e Tn rdG~Tu$BQ`ABJĬÖ- "2\0bf& .y3)k;c`2"~nmBa>ӻw{4w~@9"q;n{5qt3(vɄq .Bpky>5} W{f"Zdf]}%'{][}}LU͌SZW(J2|g:@6zz? {%_u)Qdq|IX(msK)'Ԡ(V'+݌.5'qp)gf!M y"WtjM2WZ:InD0I:ns#H)5KDa#":i"ԶP߹DRJVʺb~ nS-[)ȵ'2/ HnCaTp=\S:_u՛( J.In.,Ln\j( ڻ,1]Ipa䀎އdHQaL[v1FsD+Bnd4i-Ɋ:z Kɤd5=~rk0\9;ug)N|g!Zu/" tyqs0`us(BǙ n+sꊙdA2k4P7orI͌쫮zBi(|7 )^Bij9%B1iɈL NBtsgDЖC}F@uhu'R[2tM2$#֚Pm 0Sy7iB|""SJNoc?BD)RDI 2{}l Lnza)WE8#!#S8YI pI'^u[0JfQ"a8B^u՛(exQGM $ZT:CLuS Is1ǂNa݇0SI;㴖ʆ!<33T`Z .UHj۶ZLy:c)Zi?DAM\`0q:V&>?)RjgDGnj{4Yׇ7\}pG͜4{(L3)5dzA&LRj-'$5wU#29ur7Qεkz9ڹ"R)HnOVa6iC5]*DVL},$Ynv&8]2󻟽QCA,LaM;k *aq==:=]O;Lvn v`m˖|)-c(<ff&33AGFL|(rܯMT.$o|7 3F)&pr!dVѹH|)9gDySI˩LB7$6^<*SZc(]sψяs{w 1nc܋0E39H#?#L͝2Ba2H}(t۸٘1!CRY}:t`clqĄ)G '-U5ǁ\եܯML [Lr7 9я[h%`"Wgo }?mZInj&7b 3w*u2uS+9aܯ-UU- ?WBއ1~ cߞn[!O Ӿ7 Ͼ9 hQR1UI" 2ۼ"15R“z dkw^"ӲקOgb%w|Tj}K h2HO~3aGeHSJnyAUW*m U8}=lTЮ< 8bm+䜽U."QMص=O{}$sn9u{nߪ fmV9z?^޿wOW;[g:x2{4u2̔sT sv ˡ0~_) uXZGxj#D'\J)Rku.ΚFdûv[w"9?" wS_ufu*C"8Z!~?-3>ǩJkQF7eڟџ/Ps05<[kO񻧭Jho~F0,Dq%q[?}{M62KAفS@23ԭ, ߪ3E4Ǐ蔿F,$1JiKde' '%?kl~ZsJ90ϥ`a0eBUW]ӫA_tVE@Xdh 7C(lB~ĶLεT$ 9.u*8o[+OGobn|~_Ae1>O>~/f!Hwcɥ֎㹲e6xz[rU09kt|ݔ LS>mЧ _;\> ϙ1V꒹M,#"5v3 H|N"<1\te)m#ƽaHpU`_UW )GZy ];1S87X(#LSuR8>wrWARvkvniS-]C--2x̺@[ǟ|8Q:3ɗu\JǽJMB=[a%Sv3Ξ.2ՒbDEa"'yn]J:(3HimnOMbph?բtIv}szioz$]r~}"%wO"SZb^ǒ)"UWLl$Oea"wMֿ(bS˭f$xR .US#i~~yykk$t 5 "|e-TA:0XD-Ăb罖psʴzH;11Gx' էM xu Ef-ل綧p36m[&Y0\{UvsZUGO[P݋l`G?qj-3,ǧ9(|b>hxZefvl ,ڦ+ƴ cSqj.S_m?;9[K}oµehF1׬̉%%z La""HzQL({zw}> rlg PZ@հ.X<[q eޤw-R[ZW4r[ޮIH?h*~|]C|;:QP-YW$-5?=ݶfS3kƠDJ2Oܞ=~~~~~yڷVx:FtD2Rkmo~uE?~pi(sL2rS$ÜQ#&r#"9>hr/h5~=yԔ}>/ ?ܟ|JXn _sEI5c8-"VwOF "\-c @vwBxB. bĚF,>0Q35&1Ab^kY~^ʟiyy<|gW@ Pxn0tj!sU==T%y'4:HNb+>"_#z]W@aL+( wo~N߬R)_qF<8.T@H@ 1Kq R&=DֈO$kZ 'r]V慆WW|/^su_/|}û__zU:tcn&uv@`Rc0.>\k+ 0~u?"tqG= U~7_kߨL=Ds1۟dod_mc7uugLF1T!G6C:i枑GH\"䙺v?+Xg`Dq~Ռt"Z*oU?W%~ 懿ǝ__?yϤ7kѧ}_?_d'O^G~o|2G_?/u|{?}1I"2B洕iL#X95Z  w<'h< B +' ;VW'4-̥v57X?_sHzsGO~{>\x]W'_~C}knߝ?+o&~ ǧjݯ~C_|k\|a~zU?P>?@y.~+/_hqt<]c?Ox@2=DJ-"pj1#y=̩Rpg&03hp /ՅED$%T})кw5Zk~Ϋ~q 9 Зve~M/zÏ|}DG_5Ѻ %wO׼8?{/S{/}U_|r?bؔ,<}=={v۷1zCC$q2(ֶdS×[kJlP=jTjk۶?ݸ>wrjY%>8Zx=(_P{7L\ʌ !3"7׋Hmm[ۮ[;} uЇ>K<˾ E?+>Gek(l9ܿF{bkTfw?~o?2_lF/ݿ[_W5_kۿ+y^<(@w$}T QXjBfu}zzMuW. pITwg^sɁpw*_,k~>?S}AG[A_߂8_R?I~O哿 )~1/Y~3)Ͽ?>^՟9ǟO?g|۷Vk]u `dꪪ90RZm[Z1F?{֚1T1KoEYՕ1e eJC볷jy]/\y0A޿R+{O|˟_u_ozI|G_xί{U?} |o_^};?n[0#lJޑP<=ZEM\JR0#t)ܔB  m2UUe{xٗm@y}A݃JmyUAk ~MXA?U_Ww__) S|GWg<Ƨ/qc53~#:W&^C,Ugfjlt'` Զ,UmdmUEhb@$RJ 8HNL@J(= CJ x2n?m' jQIډtz??M_Ds#&WK?Ύ;z"$ƙ!"e[EsӆO֖gg.*Sf`)ĢɚI{>ݚlaB6?~f'!ARKsCO IR;џL~"_ѿ9':9ꪾ8-~ Q/噦F]2M0K:K-ZAe˺"n60$R 6avԉE{wOhDGV @^(7K7Yn2]g'!ϽNة?&?__9ѿsa%_e^_t9{U ^?""[ADĢUs (UY3܎d "#8,K+SR3$ZGh6TkL % L1om}޿kcyGj䏎-oOGGO<_> 51gOEBD$LD?#'og D?O?SUd|}/F?}o bVUL.G `j#cdϥCx8:jUb[n a\k inL%Iwf%W?XKA|35_#?|^Go)2g{DDKt4C#?w?Ow~?fZ='';/h\ ^_ZU `X'RDE#D)JiُG -%o &[dfc;5YGNDtē1+"܈>>zQ|b-FAT^K?ܗ=ۏ]53BD߁q@W bb?WTW}^Ow_߿qg 3"Rjk1`-I]ץiZws Oc N.dG}e'ݻwݝOҊ~s:[G߹5ki˺R0mm1|2JAuYj 6PkuiE 1ƾe]Ih'#}1</з',3,9(p_O psh^Xw!<=>?̳^o[3]SzRL~bƤv|w:Zb<`iJn%! E>ƞO䉡0nDDĢiڇ s]*:6u%W?}~ kGК|e\)|Dz.k3AdIA8&,+R,բ v|ͷk4خr^.ew=]8nRjڲox(wOgLj2m'yKRZje*\5}h̪nއfBPF-uZPlׇ7ݝ8[3lJ[j-p}}YjU>ʒǂk&}fCJmD5@Rj)/-~g4m_mO*a&ڶd 2A o&wGPxB(@Z۲uap\;`^ű04'XDK>oׇNΧUa 1:ea}3RF.E @pzExZ-}':NԪ-@u&mtV\>}ߜ֢Twf"RkkU!Le]qXUXEX4JSzGGi{Hӣ_nʾI!_c̹qRj2|RmㅙE˼9QM;BHdنpӔU\Sd}[Mܿ0/YY[IT 02!djəA Tagjxi)Jpчe1 gfٳ)+/_/ߝNҪƾ]BNȞ{U>ymU)']BxYNii6!L73"#{)t7JM"(Y׉swwwwVBLfybbgQ.A^ke7;vMEJ1(13*8҈  MG۞'NOӎ~rq?t_x`9wRΝ㛀d!kLw,*tQŸmMDen9uHEЖ#9f*!j=Q(#F^ݺ.poQkC`Rk&+Qpe=OkU&BpjWni{CL- /&z:Χ!L>o@d"S(bBkV8vn5gDc߷OkUaj2Ȳ3^K33e$ESj8"a}Ccѹw%F{t}ΉXg{B!R2GL,’KQJ>0p<F|j|Q|A*?ğۿ `N=QC7{COfF EGĥm?|(M>Ͷ]jmܘGL^.F/}}o*SدWkU)yCw ,2[ґ#5EDpRk[އdbefQ"W}):T 0!|u{7[`X Xz)QoAX,壻 6O:_/44?{þI.'!S1Li}o*.@>7L3pw?(`ׇ޿T%}ۮN609r)w:m&*ڊ>ޝ֥pSiQUhBs&P0rS3`gp ȞG-r ya۶Sytrއ1"pa1g>:6Rl3ML,:on^%WO_@V{~Ow%?9_KDDcۑܳFa+>trsfr<s누~7oNK-ݮim#& "dN(7m47{kEa~^.|:UɍRK\蹍QfS;&h]ULcNĢ m wN$&abڷk+!NMrpٶ} 3.0`rWex\`j}ꗈ=,T$ݘ*"@xlr8fS$ߨ~j"ޅxE Dx2YҡDQA'=c|xͻ󺔔۵NkKŻ\$Gz϶ٰaHhidnt>-HA2ÌQM$|O;~ݢV!D=Lr4۱$]w°r-ӻm^??\n q$x0FW[U&Z$^YO|D@*^:&1oRy>io$;?97~I_1.bJXLx-Ft4N}p%0 !ׇ_߽;"I:7=ֵeQp;W$BX0Ң-j vٗӺ,UZ&>7a*pnGf>:_wK^3<"RFvbpkqeD_mxZnU` ۯ6So]xH` w3Yc2⸙{q9N|aAa~3-?[ 1/(Du h湪 ydgd ; ۮ>lwܝתt`eiM7.fN!$7gr"UFؑ8ݝZĠ0AuD=vݵ 7SInj)B)d#[b'X8\XD&S*/&~27/\CӨZC Ω!&**Ň*E.ǠPtw>p~>.d/N"u Qk=5WGK]Z@E բ<) < N FXW 1Psi)Ba]ɀE>l_$ZJעB׵zy9{GJ t]"&ʹaC8ϤeYj4bB `ڥ*acɷxM;N$fT>OspGqwSf,\u<&YPe)lG11$Mr:{gب{::gZJyWo;s>C|(YbJP"YX=" 6=ӓrD:wn)݅ 5>(6v7w@υL"l&".,Lppܞ1c QZU% wp"4Ֆs[[+B6mEE -Z*yz't8jmmYE%jUոMx1=Urwwj*u>so[xGߏ_)Q-c1"MM(Gp\dei+qz'eQp&0c64Sb#u̮PZ2SOh{n<s9tL{'G$=0Q)MSi%hنGK*S;Rk7#umRբEF>v~RJ0*q3Q98a96w3RK)L0-^W%Ooְ5e3f 9%ᏫsW5[zP$XA*"R d_'^ks '@s C\g"\4?c&=\K9AD)%HplUe=YhmKvM1SqᦚY0\c U@?GIV'rKT!Ƕ*FByi-^O%_t-|3\ej a<=V rtBD$!8*pF̒XIJ'`Y#^K.Ib܉f(Ҫ@ڼV'X1;"0D"Lamxb rc8jUAXvđkُRJm 3N'wHG>"̹ettN! iƔPJqgg[*-XE{𓹱+?2"o?IMtAS|(q&Wa"h'PHhd83Bo-a)Yo;KQD]D"eLZŹPOp8J:(mY0imY2f>FLo-6MdU-@L6:C(FK2=YPv*zin27=ˉ%",ZKQfD0|Pbe TmuKa|ZJnJ)iq>/Egn6z˺"\kt,^6Jhu @{!ȉt]ei͙-)"Na7XZ)3]|99Nna8Z1BQ"9,t_ o۾QֿxK1y1<\@nqs)it81} ncQHHV(mʈK°Rb*o :Do"м5{YNJ9>a K[u b;fJ4,"jH-Y(m 3sb:e)x;Tyk2GU6 !Wc(MĈf.ȷO -$vF<-PdK*?~Thʴކ _rw 'V~[2s*MLu9-KkE((Ͱo2e*ݻ5.fA:`twL O2ZZm& Zku*nv`)68qyꒆo <,4Pʭ\0!un>-^FE43?ڍMSG rjVZKa"p&C -ZR]>()7)TFebj=1m뺴Z:[r'O\FE01Dc\Jt#VFrh>E3fL9&}> oKItyPV}I=&8M{EASM"gIH.tn$+W0^U r2Wkh?(I%i:c߯t:-KzCE xy2qZ'լ^cUᐉTERя0e"ږV*Ofr7%y*#(;Oͳ+i$nWXj+O}_a|qrVJ1Rq1wnOn5kR徾Y~pP6PQorDK3)5DGi, sdG^x? 0}YTU й^:%8E*7.٤FR $Ufsa*4D"JktKYJ0+tuj֬zc(9B1W92Myz}6Gs8OZ6 ,}R?eoeHH>!OLsA(XN"D;jZ=r4ؘێ}i?.=1Gq^$48,Dp,$8eq' '17iY*Ģ<χa(  bF0P`w+#JyTn(ueg}%V^U|aЭE,cAƣ1O}#j|sv0Ho'8aؠV[ ㋒,X|ų(=ԙwG̵leiigX ^͜) VUf< A{ &>0F$0="#>8!HR2c\{Dncw鴤Qa ZZ aiT4DDE? Eq82M1BcߑD% 4:m`8 ]vON,B,B Ep#ӡ1:]ŗ$2|;9dwQOL-p9r.g]Pdbqq9M(ٹ 'mr$ 1VNdZ61ʘU]5˄.Ns80.›+gVl. 1{{+9*U4url9Pr1Rt:u)A1Af˛s /KźE-OE 5'{koevG?FRnS6RKmb`!ELۘQck *9ްn,KM*W_?ߙcᱶu]ZUNAN&#D,`aNG>y`a0=r d"£L|: |j?v:f"8XmU`ApnS[3XTj[S^ַrݺ31K {"*mØ˔f)1Ƹ) 1 T| Zk0CĢIHE۩6̽\Ns|jQM5mYZ_CR~siroev={-k+sW'y2KL# sط9|ff`5GU[ (.{:MSEcۣ}aOֶӚTvy\;a?),zv2WUpذ1B5 f.c?0FqX>7X6s}L>P4M^&ԉe2I2 oW_sme@"+\, )qۄ>)c߷u\|Ͻ#]R>Lqܖwǧ{p$dBp"8{ b0ncԶ,`њe~>-M F1eGa\/WYQA ?FuGdi%d[dZne6HÂ#Km7s3g !,IuC&bG2ҝ;sWx^1r w?3(a)a~@2I Vlt-r=ImdX1wgk;}-$oR%psi" FeatkmI$Zۅ`ַ>VN.yorP3%H.\bIF7APf(7VKfm]!mְ|ևy E1YSc<-'~&+vz@NXǘh[B@HS8{9_<8(\"ZYPZ2NZjk 2; HeYgn}{T?aozu}'͜ 4ncUx(K[487dV[=&,.JCJ2ōs0:f}!GoÇGr.|9oe"JRS( &b.w(6L*,0&nDt0G2SD˷R`RuiE(Ô ZjUF&-R2"{k˲KX/oyJ>"o,ғO(|u*Ԕq㾆Ee ~`muurui0o0Ǹl->Z"4$g`@-ϛucXsu Ԕ2{_aˣۂ渍f&Lrprqb xG"p+G/ {rfBeOR0(YK]V|P*h)* baUe fXJmSַۻS+FWr[۶m}YZ._TdsSL½ڃD[+bt>aw:ddpc1y*,99kͮ\UR<έ$=rB8b)zojWRDt翐  7F D=5k$wٗiIP7}IawI0$31GY')„ YږJ1 M?=R<  0kimYr?|RƔ=`po;[vtcٰ$_1TSplSbLF NppX(uYSSa)q΢SXQaf"~Ln k'N@I$T:&ف=ͬ繿UUB4}^)~[A" f="nfF)ӧ.7<} p&iJLrԬ,RHD,I(=]Q_¤DѪRmrI6R8t5\yf[Zm-0$@e ;LtjOkBf%*쌹G y23ȴ g|D尔"f8쳓slOόϠA RJE+I7]TEs =6Xʼn\LKs{,En_1 "B!yPET7 bRJҮHh658֥բt\΁w9-Ng.Npn%25mEZjrzoU3az$faM(E&]00÷hmR b*'orE([EmeNDuc~2O`pEí"R[-nzxpP*`єfc/Bᕵ>vƈl[ G}1M&hzB9XYΫpNJmnҦ1H;p]ˋS-U!/E4]\KS&cH1rdzZ$@GnG?gc`h)Q"$6Kx(=RmJa֥pFXhD[ W0{c˼- }!EŰ" A`-#Ҍ)P-Љb.>Qz֞$G l.=m 3{(*fSiV-:zェĪ 3wPJ̙a4/U}߯u2wQaK}0o$E%*phv^Z/[r?V(~  +O˜|d;z`J@a \h0Q!BJNZ!ck_R?i O_*9֪}cuhe w]|wN|-b -kJQ6,f3 C(1PP 3Tڬ/}ߪ2 uجYYa; E?Wn۶WN|DL.fC=)<֥)Ë\{ B!^*BR4fK|bSR]\NbRuʰa]%[>UtOlAZ6zI"|{0Vh0ewK1hlG089뾏=R }c# @"8yd+E9n{m=i4RXN ,>*YU.݁p+a} Ts&U?83FKIDATCXRpé eJ/֔~V9r&@j8+]De={ ϖ]쉿;wZZa$ ELg!'|UkmZ apCjw7ob$bq'z:A Vm2š ,:zob4Ç[‰ =( 7">`pJCAC<~c$@ZRu.h$_ cU(ƾ]۾0-R 9Xs;mBrK_WJL`-H:}Z 'Q0~?RoS;YSv?uZKzv?M9nAG7<沺[@rOӑ) kGRZmE}>+lڦw3rYUt p"чy!16!"n )1ƨ*\J&aeoA>v 0 SP1OK|Q`뤞ivŠIc[RxuDDH4˲zZ0i7!ˆ=L!i$cMm~Nzߗ ǒPazq-/}JEr{3,`=L$Ū}lTjjU T=NRkU5c19c6LnL" ) u k-u'6#rܞ#gNgD%;v!ORJ 5}0Ki;.U ޷&T~w/" ڲ=L47(MW:x= Dis }߮|>[ar]P<~~"\Vz =QISw2wrQ*G)9Rk>Zˬ{gV""}뺴VlǀJw%QLw"֢L=,tK>z0mۇ 1==bfiO-e>[Lcp0MyKUamR[[9f6+ch,:՛d/(|Ij)LRPQ͋h:`3EG$ѯ߽%_"gKJtPdcdr߆dfr 3[{_kGl+y6I$BD2۹MX 6dVFZȉ¾݂b/&Js!!5M)sy6Prf4uCLWeVwQ5A QNGxx4"%s$"yzt 3Fk@,, 72x߯{w_a|:f㼙D_Ea#V&Tz8 a2bN;\[7]ZYRRgFص鴶4wX<bb=&hq QuR2/tl%՜"kaΜ+A2Zg>ͧ%qC܊xI :7U5!,z[zMo`G R7*:<yKhV,QO~Rl!]buc9Qqwww~빿Teύ'-J{Hrh:L0"03 smx=ηy`-A1e#qbr?PΦSfYlt4-rX2v f> 1F@fW22K(e>ć<3-l_rK(\2k}D im2 9tfM]Jѹ˄F("A6z|D 92A|w:-Oz?Le斩&Oݦͯbj׹Xa\<0 QThKX=qJr0,~R1"LgHGV E9헆4P9dm 5lU%GP-WT9ѓ$=➘as ["| =facn,,e9NҚJ;VS1R͆P0Xb@A ea|Z7+OTNy\BuР{ts[!{0EQ3pQ˺.9ȝ˽#0 ~ݖԒvp{Y87R|'0)Q!$6޺[^FV$)b$ƌ3SmKK@E$(?Db(X5!U3WO1}YVS)Szuæ)a=#Vb}CKD \wۍ9OR8%z^Ӻ!_a|̓eGK?<e&}}pNBnÒa\oAn}އ #a}ۗ"4Ym <& $8}(iFUAXi#ZgmL@zA*Ƙh*ͣL^;a`D'—9+wbe*<mmU('pgp@uYOR ַ{X5TKه0"vO_TDGX/%`eI֖u]ץ)y_)?aH'yy/a"}߮W?W}>PH0>,ܳYA̢%&*c߶mÄ}[ωl}v%\dׁ)"ԥI윐H3瑵$pC=?ALBD8`SAcKV{'"(EUc AUe.=]z~%?ٽ* wf#V^z݂X%q(܍ >Ũ GBD+q^$X7<-rZF|u#~]طA#ط}Ƈu2 tfF6E#amnQaco.K+*MK(%=PZ\tE;FBH3Zوʏ{ B5 Y4mZtMoyѢNhIN -2}۷waܺLZ *B* Zk:MqOKKxs~'g.~W7#v}x\账es f뙕w[8tLL!bmƳ}2'-Ppz5j2}&"4-ә.9SDdiQf}KUùXcȸv#|^jj]h-RK_?|x cK7C:…0HOB1wwwSkoClb~r;]pJQ4P$;M!93ˣ݉%N= e}{h6E_/kDRkkEhV"bwv{OC*>zJoXH{ aɤwo,Ǣ"Lb ҙfZuP4nͷ aq<|x}&*N̄DѨn6QBA,*3T1` wFz?_oܟ,~4yv㼮mmذ !r4\UEk.c cXCwPH:)("Bpw7ZJ2$q[^0qDeT錾o[#ZS1*4עAx3#f>KG>#;$Dߒ=0\ȭZʖ|l.p},jp܎N1}[OW!l=!*)"י$ݒOvu"ܰ|>"a}^-^`R&? ӵ DԹdGS!8pŢ%%fEQL[h21l "nC.}TK)"a Ne@a{U" JQf.B#SZb2r%i2(DD/2>xP[Me'XzB>' {r!!ViiKkE8LvyM1>D 1͢ycj+M#}ms*Mu?ao%'6W'"|^eDDZT'f7u5M Mv 0 -Es 9 hQj]%6n!f L"Bs/j:q M45ENZͨS?3DKS"8v e1܇0iFp]rwuS$e/":)Qy6nir[r _};ZSYOj`I霫u2.&ldylO0)qݹ!hRxn/{?ժ7f:#gqd*è%BK)B"ǝSlARK惻{g[8TU9t0D"RoRr:\XfNsz}xzZV4isM0oHebL$g (ƶmuM%'Vt:jjٍ,;דѐ(3zxXQanρjDf?!u#ot^Eٙ|תCyb.8!CV[dnZ'Zᩀw5D'kB=(+dMEC|peGx`DZj]|̷- ,iڊc.K׻Ӻ"L~=!SCC$  :,l;yD Kp]>| %'zwR4ecI$L}QN83Qe'&q`Fm}lunH!ɭX[M9<fIZpƤy0""1m\Kke' 0|(^_7yDD"J-VUFz٢Ns7 y2>q4nF ]`>~bSؾwӺT0x߮>܏7+˯?w J@&g@Df>)NMÝ%}^ZmT`fV ptZhSI#nz[R:mFp[NTp0i}㹿)=<>žDë[6iB(:[0ܟA$_FK;;2WvkUKH(ⱓ˛Qֶ1f6T.Ytf ֶNiiLns[|ڌ{щ*&A(",ALд0\B9z7s>tm߶mZ}Pl^pS߽*mhOK|4ss$ڨ?fYukeqBe}Z,p:t))g  caI*"0!}kUA-aZvRE1k٩+=g0FLp+cry B<cUq3+Gw?nqkĴ0ټE'BQUNݍ'DVml޿~ͻsr8C/%*^H;nqhR$NNG\^-/,cTR2`Ѣ YTXѷu])obIL"p>ozu2>7cs}^..3@ r38)YZ2u `2yzf0ysQ( 2Ec.uIRoݭp[r[9x;O<طø8N#uPv!,g\ESOػWSB +FSJ)L4@+sX-p,#|{ZGZ˫ Fj=9ABmە֖w>̴Ts) DD5#M`u߮XSr`BrDal`FR䨊DebMsEH rFߗ^=a[˜U)̄()۰f)jr9nY`U0{eI;2ȗ-Vk)IN(0# ]v59Xkk"bQ*Hr:߽;Ka ׇ?y-O{Oܟ"~zOđ~wę3:@Z#b{8hJer5SRZ=l?A?@vږ y/-ϽV]۶e^g}ۮ,f-&1I&u!wRi,LǓ +71c80VQkK%JM#H8h+ Oᵚ>BV$o} ^sk`6!3X.w~Z}ɒӤube0Çy4[AZJP${)כDX 1-5S+sPmzݱ|xkq+z@J)A0@H.oD\wU-1aĬvJN%EɌy0Ԓ9W\n#VgOpDZkg 9tnn6zhҀ6%赪 ZTo\& oR S-j[R4{Yg#ԀJLZMAfbBUc #Æ ܒKyfNr&p%KD!f!̵^&j EmYuEA>~}x|Zrzu#`&,%D\ѢDv^rZn,86GY̊LNeSaTHTfn&֧rtӢ t~J>73(U@Pb!5B ey2gH 1zZo/D KVZK"-*$IX3y*FDw!SC-!c,[Ga)p,}L)"J{OEQuwY#?^>'Rn.LeK*$̢c{U>ͳVΗ3֣;&L9]%|aKpL^ZچMA %އyh4),emog"Fv#h{p.ϾrJ a`0S8`m /޿p) /?|(~G-~_L3c~>-Ut&Ĉȍph982X$2x1.mI/V91/y<‹0XKnVK꽗\Gnj,6Q R&io0ӘR~K"z-="=rh*BY?3\9-Y7NpJ#"bjP81R w)N0/)K|73fu {OQᠰ]u'ˇ۟ry?wof0ޒ??;)jƢttLdhē2=Q{߶}KayY}ϖ ,Q~ oʬXj6FE4kb) -mh>y̧^Y>3 }c̶8"Br ɷaYCc߇V<Eܾ mWWĴkJ䌙aÌC$:OIsck9l>|x7=-E`c>|ܝ?xK@KLD XxiQ+J,"Ja}i@p ѯvźM׊(6ܠº{D?Hț \×Vpe:b111(#mFCUXAFAQE,@:0A4/->نs{Kfrvxu례i]Y=;O! FX0†(}<T ;`vRROouڪƾ]q>{__TN} N 0mV|UɁ8fYdHKiE3e_E ]i5b1(aX:Vٽ6{*BtoDa%!O}O֎F ܼ8DP)+ ZP(o.ԞgN݋-&',y6L@dWVZRo̪;v\J)E׽\b˺&ͼ3KZӤ%:6lIUKBD[j#܊ #F)e]Z&Ln1"%MK!Ӗc\k:>4'Ҫ"7.Ru9OKeuH';fA dO{"݅"(D9:֪E(Fl .mun2E2h}yDAQcNu] ضwӺR"u2fx+_e䎯>z:rh>0BM,aZjO֖Wem{F10=lc'1BpqEkQJKO#RNmL龮 r;MJ !뺔Q8fSoFĪ gB mdeM?0|4Q[ZsG@Aٗo;܇fb-$$Ess(-umUn~}xXNkp}QZ)xŷzйig,+>_Lî N^d!fTG)RDYMV޷'-q ~"zsӫ)foaf QVFÑf(bLaﻴ֖V80.u9ݝvZz \KB\=Hv%V0J'ygI]N)^ZٵYY-l޻u@,ԓJ Iv׺|ׇ7ݭK]ʝo+__L'cN^Zv?O?u=LUvtG?&7¡A- ^#Y0]|fwYu)Q3(D>I =Tu?V1YKmKka EF̌m+yvlmR^u=ݝ'MO:by% -.{6MA]"< 谴*<)A$` J }oӕp!rRCOpa`]P0Lp˲]j sV%yDP>@^*FnE0-=ZMMrnmH%noƯ&8*x'. M"DTB|XE= dŨcE8sorql#<͗Va[YD02g+>lEP4Y.`M(ӁXtwMk˲MC<-ﻶ=iN؎4mmIQسu#7]_V?I}7lM{V~~xXg*jȨk6 m 7upNm{XFP']Q=73!$фayFa<vrxcغ(W}{<S%N7j^D5sA^Ɉpimuix08L&1K4}$%LXE}W={y~]:ּn] s=meHx|W4ylυVs0!v=cC`nnztp9}N~5wU//h؟nJ&Dz6?#Jc1[qNܹL.$qzUE=~ ԥ3m%܂ irIW SP‰ܼuΩW)A^OŠ$y\[&0Ypa;1Ug3\ĭ; !# Dn*kB.p3g Z;X@n0]sd@~2[rF]N^GsO]/q 7:h<<"1Z),mouu4-~Xq*DEl䶹o;vYj3 %A=].eM9/ zߑXp!B{:ޘ#Nk!tHCd}b+S׹9=3ؗhOq"OJM% |8L_4}y3ե7 #|D0)6a:~ϙ f&>zkq ȇv9F `?~yt=>||#G"qGzi_sz;3ELwJ1_}OZjM$ѿ@ MZ#n,p[ˇ9|  @_#q x~\7ѫ! eL|2p"\fƴQ4bܳ6-58{06NGqQ!@ev0tyι$/"eD)+Fzol>|1Ç wSr\FTzWS^Lgg5Y<­h)9BGq iMf+f{cF2!,>%gBʅ0rMsȜ:{n0͕>U]A€Iy2]ILtm~]ȵ7ܺ05~l4D$ y*Lo>1N^ؖA};Ip[6粠P]s"MZcNJZ@P(58(7珹F,HSfOʥ`3mFka"ZoɧaAa<]zz>?߿u}ÇLU7c[o-;3a07/Y<#\& qP9#-&nĭ1-+Azɵ"zM"헭59[cblx}copSfalͻ0zW L* }?k/-{s'Qles`x"v]25!J^6U])BhŒ1d=0sNskZ;c]3{^lTy#oFWYߠ~L"@e0^9#nPX|2t4栦5xQ]X7v2#<ঋanrBnc y;mqXc( p3~}/V*1jmr[0 SE(c?e4 (|hטGy|o]E׳7SJf/$"ޖ) OX薆 f8aI3+1am>*ߍS%wWE F*+=`g usLLΩedљ<3@y\BsA3gaHkIeG)S:r^.c49\jn W q(cv^Gzi_/>rU K3;MH(}{D˴7sjc.ӥ܄d]ef1Ġ:Zs4DN)2$0=(W&Ldj2<*Zn$&?&L@rdҼz9 Sާej;N'SX:8==h#۴PߥB7˭_i6 8х???'(wU?>$T҄ع`o40' pD>"j0֘"lZEf 6T wOX2 RolQ65<AξmLH*0^8=cnDZ&gSdޚiX im`+׎Vb5gIfaDf73`V^e.`d0;|e9}ǀQ;iDwPbmh ?ߞXaߞow=-y$נ^[}Wp(" pg%[nlԛ0LWO",^,떙]'w1ES R[ySSS QHk]nnjgjrI&>O! 9ʭz>d+7ˑ=EF2S]zQ}U@Dt^ј`@XHM|[1{fnt9Ph5vߵ1<{#A៬+W-|G^֞,u-1I$u^r1j)Cmmp(M3@d# "JF\d$c9H '3LɐuV 9< L, cw2T`,s6sq\Dԁ&E$NO@xD0 \.y] xUn* sk--wiwPyS2˻!mU[sZohxnI$Rn_[k3Viqe2^&;b\]ċ`?}~'lWzI HQq5\Mm- iZ~R~6^]B'mǑ-gr<<=9 qd4QgT3sP#k$Sx1}O\0$ pHzuo/e"ֺQxq kt%2T'SpbGCL8XƄ\pY$E O=I  t3sFjM &Bۓ b kŅˤ PN.udfOQ,X+T.W,\fnWyq aW+~n$k䫻A[~^o7t3N/e@Z'`!fBB̃# r!´\wLTYKVR! bDԹDbBZ/=hL ĹlގrI"/7!ۧ,IIy8j%*ݦ5MU5 y8]#Wy E!+w Rn NVVGIz,{€u~aV NҒѶ1ٛ~']7)'X*73W}0 A3̈07TE2T-)~m z$lMה0PRe"AL._q9{S5;/|=MVj!D }ieN}kG& nZP#r3N "iqâ\Rp3þ. X"j̃$HZ!sE!99WAh(M4fhLHM=} /V.]dO֚)dlG0Jpf `zrK &.,$D E ܻNV}ZNqA"(ɛ4\sȵԉ _󜔻)PE?Q%(w1c(-T!+iӎy9ɍ\7]kd''Ե+@P!\לHh/7i3"Ko-b}\P8q.p eyk~_a}?Gr7U z6DoހgD {ҡ|Ҙ=4k;q C6kr;r)OhHn<[{T-{xx$9E_Bť4վsˈJ0mW|/k{:Yk9}撞6®$->ק\S="h}RTé?o6,7uUiNI?َM4%*e-&d_ca֚s. nf4-`"x`/5>H[.'%<9 Śb FQD# 1two:l&R֚kι:\dWHI=)zw6UTLBhhW4ۘ{ /#˚0NwOO.02c!+v^'P|o]XooV5MUUaDXIt3^\f34@LJ0尥[Hv?ϥ$͢-¨(;SupØfQ.A0Rz`9קJ~?L<利ܚ\i=ea#~j7'k9TuR(c^CZkix$ _W9VW\k.$ZLz}^2Bxzɗhۺ 6ڿVW)dlq#`Dm}R/Hj߹rWvsI//fߊ u38FA ivi2lճ5y?es;A a{󕊱`S(5nN ךs!mKT7{4Z_u$ɨ}!ޛpҵ6z*@x4IR[sEE> 7ۅ<%sly^'`3ayk`aw e=p60vq7M9l-U3pr]K}&9ϔASj/io+o:_\S lZaXCsZs[^=^mn)VϷs:1`j2fG+!q9Fg1 U4cdoO)_=9eI*`NF|ߴe~BL 6jZ^C1ZK5sZɿ=*0#̹}#DpaO }GX:pܻ_zq3So3<828\}VolS}Oq$\PGӵ||r->yVU͔=bcɩ9]Y >ކG5zp!lq^FvlEkK1)LpҼr#[uЍ#d+#EɄcSrų4]ZJdӎc6vi#M)'{,1:P٘B^}w[^.R Jy߭_ѩ.Do'WXo5c9V֌MF32S'ShZgD8.' n8.DۭG0JztM]zrwקwghj/F<_Kyrc \PZ¶8#@^ǃKm;a N6o6w3-CU0^Й"uU. 0`غs)91oy+V^sno%vJSds-\=O!t$la:GT@1k{k&Y=(^g+-#uFR¯h:$cyq9[q^!lQcp Tw̞\ ުTE' pQ=:|G[%h\C~E6ֱt0biE2T|t-8Fnt7~;eZ0[w]0 /Kp0q1m$,[&:8R00^qtҗ]e7ݔa6%qy_O]l>ucذ;q} +ME*]a瓦e']7ܬz=Fcr0sjn!؞ubM~ޅș|d2M[;f+&0>y+G*-,\ys ] `N]Սb pjVdn^;gV+J['pz7`؋Hy Lx<#sܦqM(t4<8nIE\"溼]O1lzF^z#WXޅ $A, &wVWPյ=Uzuo|^;)AZr2S F\= \.1)xe]榹IŻ';=I FGRh(( >#̄\'{)-u礱5ia17&8 rJc%=4bdH~T vr2_TQ}Iv#7Ug\'Dfi|Fk~Bq+O [ڞ?]:CWpÑ>B -[7AZބsߟOOFBi7"o0{F&Qq9#< *|ҖWhi2M{ `}" |F<ޫlVdI󅻓F8]86Boul0/`G8(otyXnQisr\!*XBNy4iwt4ek/NHBhXtl.sJc[ߞ?߽{tԅ+6U S [5BƑwy*ՊiLQ`g0IL>z&Ss1m}7ʒzw"+ε%{ba%8s0 =@ÖmcToq_i-Ͽ?|_S?̥KcbT4r4M5luEq/_u}/. zbZL3 8t&sHg=`ﮃzQQk*eu7<+OA\@ @7~ ")ok4!˴W:fnZ]ͬO]/rF.]|ջ{L\W2"G n5bFsL_h$^a^hʿ}"cE+HxG̷9$z}zt9JћzoB5wN[޽!HSPk5%2u'5Z!:?/tdzfM$ le%'d@pޢwjۖH$ՆnXk"$#" nfFFõh5 ޤfcXc{RsGyS D͐XKY橯Pso?YALA, 8OQ9qyze4ZC)v;:<==]/-h9/O߿7Ļ0F*!aǚ7ha {{__zekMpvg Y؂q(ҒxrN[?IHpk}*dËA,053G& ]Ѿ|]*nAz@̺&Su=.SHzt>քkֲZ {{#o׷ oT?Pys Δۚ2&P\u[ijѬI[jfuf MdM^`33_}F1iHn>)lUεeNfx%x\]%^U>2޵_^ypdv\'QZOr D5-bZos3zγ] KS h} +[^/]GGk"-y懶|ݟ?~xetA8"ܽ]rtA]T%$f!{3;"cDZkइ0C[Ժft"vpvE 7X*l%=(cs􄩩P22cNu0 ^YV?pF|KujK HP88F! knSQ@& |WՑ=#)H*`iC1 Dܬ>%4{Nv6:?>қ >>z}l?Cfd#gC0Sg{'BE*,"LU<OZ‡,3$ij`3⚫AmYMV)P(zm{gѷ?UWm}z H6-`JXMzOm"plۍGHƎ/K+b\޽{z{~%s֦|qy /NF{2a y aus.<ɕ_k-5+m6䲥x{lKq\޽{wa,zo4]B*-3oj5$c+岓ftBboL28}H3=7g"HK+O< )-L,x]i/!-8ǮM{k.0[kMY z[_6'm0X{;T\W)4a:OLβc+ӳk3E8-b,=56.\ UFav_\{M sNu1 brnQwO'Qy`O$2iƄLpcCd nŁI&yI"葒2rQ Z]B!_TWZ8f+KjokP1,˵WߵP$mD0cץBG !\'l2_N>Ϸ\j'05UPz,<@q\tlµjaCU DǛd&3u}ʻф(cbXJG Ko^& b{L%<"<<W3 tS6e)W׵~{KvVɄZkwuT.Mr=˛_@F/ݝK$kXpdtMsnpХC`|6?+E.l`I򀤸yI?E0˚<&a~=ޘ`&\-8LXY،0xq}}K1ػ ybD9&y(5'QXM0uXy/zmk߼ҿZ=}G'ۣN@fkp0Us"a&7D [ Fh-C.u>~Zؔ Lq ff9p7?&|r?󓼫_.zğm|G>-ñ%s>8X(똁pi Fz5 P#rnguʹ$,Vb^Xm=%{*Jahծ-)ew. <6(S{ʋ7/D̔d]s-dH7ytt^Slx|,}!aSa-c y"܊H#RdKq{b8?ɏ[}z|u??ibvwu(":M3m{RvDXn812:H"Bx_u9\Ɯ'R/QdwbP~sڑKfHk/u]')!]GXU ȅSP欀X\GoM@&L -@Ȁ>?[7iE_:I"FlV7Bc7[՚jP.}4eݠ6uYbhxM25(K5Acܢ ruk909#̀Wu^;1J>y}R!)q\+$܂>$#[tKJ1|w۟|>XZs}NegN>l6ct+\" 't9FcށF,$0P}I5vlQ0"q|ˆfZ1\]^L x$EP8Q[piz9p A},fF=]^l0ɖ5ROf9OKsMXjYIn2؃lR[']_@g`^[50x\ )dLxCiZcap%Ca \љMOgLxvӥl}[OV=E͞F̔0#z!)7]7W2BdYor$՛kwKrWo"fQja=Sc./|!偯|Y!x8'*VkwE hʄᴯP~)Vى9a''xUo闧r aGJ*DrZ\~)iRrݜDj*H*. i̮NؖIq\VR({]R5OT͂Is$nĦ CL$;]MP1ZR´&|AmW=$dHKa̞}/1y~A;8r^sP1:ϥfj[:&!Zх`lk9qk"Bb"R·­lsl'<-ι`̩y\J˜Hzc&.·<:Z'= k.'iUcH9JD!ƒ%Mӭs|5aq d>PDdqZjH]ńω$fQ )jD69U1hM6#Mu /2:۩׼3'KNZiqSfNz;兄M{>.˃2z6L_aU_ug泯E ޅ:8WP 3B(l9 H)x4\˜{Ƹ/߫xP̊U K˂D=\c#lӳڡ0y2-r$+L}_t/91(T5+G圜Ap,$AD$Zo&ypxfL(D6^]k8P/ 锽<ɄXڸ VeNDZ!/)< ) 9Z{Q餠"y٢ ؾtsʩcaZob~|B{g{l6NxcCp0Fx]"oC#LTctɧk)5 :9E:) &S] ^Q{KkjcDLՙ; P/ўg~ 5[/v 9W2kANS tr(bsp5ro({"V˪+5UiYRɣ–:P%ݦJ3UDzva\sK{(Z`rX֛PP0S2t[sw#meO?tFzVlcAJIj/Ȃ".I"[@G۔k-U7ߋ{A+e vȍ%y. x_+#ILE:sݔ6$)VfYWwt*qi'Ϲ,`W&^u-5}wH^ ",735]&mMMj#p"fLvJy}Hr[ͷCe":K}i)'nBδT6&cI2 8TD BU\SE\@i2u:ZyWމAMY Qu?ϵ2a.\@N;u,Fj(Ba^z+׼n\F/]3Jw[RWzKK ld'B9lJ ne4u MG-CuM~S*뷛vݿ죿{_PƺIf8a)[ pD!5J D:MiUZw&QQqPom!Pf&>&j`8p^ y. M#$5_Z+="R7Kn~nb8Z#. i](1D"Jp`IVqF>=ppGE(BJڗJ"4K5i0_z_b7^, 5۝ )yBÓVQEsb"[ẒfKz-;znX 4ې[+#BE3ݴk:aIFu;yOi}=hNFR:[a }ct0hFڄMaj+Ck׍aR8, }\OΡ”fN L5 TU72ӻ^6oy-g>*3w Ecµ96} ,w9zGD jfF54@^ tX{y)쬕7xo4k*<8SMK7(IKGn՘\1::k0\1P߽׾n211VS^fӘY<ؿjtMDq\`m[B"iG N3uKF/oC T<n-Fccޞ=6{0 `kf?͘xKRL^yΥDp#2=䄢3ښ^֚Y)DLru\P1zU B!&wn8VOrMKGuD_uwճ<~fQh`ޏ7Ft4]d߉⓹gNdYbfi"ZǩL536JJx&yk|B-޾?$oa>[wav!jnsٻ0y8vsT,6y}WoSO%=#t_a1]G0$ $?[8@uZk $˷ 달ȍQe9ʱs0|l== z61%x4w[,,i,+a+?fBZZb&aR"N|"‹UwerFx ՜kS QHԺ -h>M==u(iXk=ߘ MX]M"#c95vr\GBsW^߶Ruxo"8cךo֗'8~s%܍3"w:0B®xp)EXL! ylc}H(wH=ms|r%T3;N"I-`{bE0Ta8Hcl<[{ ˍ+naZ~4fDDݘ}Q-k>o0GBt51C+(:&=&d!' ݨs4{s7[KL6i^ʧ&Ļ6O[6EfF72a *^xY]EچX;a:G\!ئ>y(9,u1YMH=6URNԵt m10L(b4[vZ7SJ80Xzm(ْEj9ύx7j鱽\u5T8<nNh-e-w L[s/ o=1<9\C.9;݄x@ʶ;ՙVsҘ 2H}x]6rR+DlM"L֤1S6=#sZF"R"{{z8 C`CU?>zcnf7mA,pETpk&z#DpK2ZRn4Pli4t[S?g iLnuW_x?iFGu>V{bLU#ep.Ȅ#3Sgj+ R8n 3wI=M"<A (ʙC,G ORM}?g"ZrZLjJ_9wbIwɝ(\6Zf=3nVnPk,7F0B)|fƷAk{jSL >rk n.__**umL5O s()jG2zZRUU!yDDt/#Q3?֋E /EPƚ!Da)kXIs`ޓ.)J2ړ;|)i70؋+jJTʌpIFZzTHu7bA0Ef5IX(( hr}#?]j=,@b6"QvS1zoO.=ђ.‹"J/e\anYu>T|n=3OmYI#7S&Ajf,)Ό0s.cq.BF3\9Woi=xB)_Z!F]b̂CP3Hl iCU" t-ohDƒ9I%*$!q^zc)V^b)!8QpX ~zk^n:O !7c""K-€5 yh4F++L:e.u0|1m-US37Pxf_~/qcdu/„="]ugxiqz֟?býZ䊔[%?M>tW\GSS3a{HK?AphC8 | Zg] Bz)OLAvrwi/&W}]sRuw+už1ls7L=sBWUm`S)RGDz{k^39{ȿ:pw{ f} þ~jX0~Z _d bʿs]Y(,~)l$VtX94m)xk 7Qοkr\#5w8{>.9䁚i{EcLPxI8pg}&,*X|&L4䷦ !nYI6n3ky }ks鞓S QDsn6oysBLNI<"`@h%mbm8qa$E( yeS榲DE-Ud{%Mi{:.q.941gD,הoG~K\AR6l5HBKP֖.FזTD}M樘&bBy- # f$gN:-C5ַlm76ByBL.jf)g*mSE5sYZ0!/1< a0Z?nd?iZ q裷 UbǎH?5ipMd8Ș P/kN{ew3[o0bwc I$7U <%7cesA׺bAy1Izipyt V?P}NU{;A3ϙ(nSu6Bm'o,\.d 4R Xh(/>DTs0890=n>Zx3kPɒGe_n.czNHN*0(͆}@/,i'@cJ{+ _R BWu*,99c{4OMíf:ϣ ޚo܃*%?߄ߧ)-4!]=7=!e`a7ޭL\2ײ鑾m6#@(Q> }a/ ʱ .<ўoqSi!آEkG0o/I}8b jnVJ ҉ԖKn@CJqS8QZJ5Ahiz#9Ͽ\uH29(xߩ᫧pS޺2Z(Ic@6=qlbR]AL\ޛ4z=XNR+yrAF30T(R!(Ξ!c\O5N'Zv! C _pDVeN 6rr:הq1 l$bVgmom!E${hYvh-(~"k9|,ReL߀ D~AzEv0 SU2pFVEٳb4" D-5wNC!0 I1 t::z 5[4y3#P=zшb(3;#%2pTk|rt-])iHlub.9.؋V-O6ANEAQk:L2_!}GqHy 4h-Y3Y|Hyxp͈",9|_aoM,>ǛfWV/%Go" S3h<ƗQU]b3*m ShQET0_MuEM cb:>1@:v{?]]yA܂XbN!{:G+>۪&͔Ȁ aVcbyؚyΥ2z4l1z-W e&p1kxb1k =0Q8y=ߞoIosr{9ݙ(ISUcfNa:ϹT g$J .%fMO%>quM'=H `p ƍY ȱ7>7cE5ݜ96P}'Oz{NXћK{pSӤ'" F@=<ϗI˥N^8l>0]s8j }kO:fSGoT9'sCdZO . WFp}d n2?aE8-d;E!fRŗ@syaMD4Zo>X_w\?rS)w2!ۙyssv,5ENpJW "4"qn鲜S)\R2yy%Œ@PMA,s0J,"l)i}t! !~J`iBLRkqژ"{^/IkM#py4u ;EK=O)I%XJ?ts ڇxșsX'kv2z-մ_j޽)K{F%Dk%"lĭͅIu yٻӚy.o")p-b019MoeyIK#s>o%ZrXڏhL.af8rLp*c+>pU60U"ԠZS{(E &Pf""Ĉjƣ_\q2>"5/fFjGekc=^d!͉bc6>P\ C5HT֞i~MWffvz]/ EXs.ˤEܤ&D,ٽ5BgD*$W2!\OT$c~ఓyC͸of)S cZj9F`Ky[%(CRHK|9{߮\S_wN*7ecTGKݽ}yrGve JG"i1tҿ-/+:"[qX1Fw?+d <\؊mXZ?ߛ<[%LK(B !r6 )#-11Fo Í(la#^;fI)H,<<D("3 %jɐ[5mA-_A?(2%쿴[/u\w( njyP'3TZ/ꄻ>=9p7'N$$1B{l|xzakss9Q; A,)&ŒtN cr[sEY+hr4h0]ބS^ֲ֏crWi4Kʗ)pm]׉xT!Rh2V%@8qw<ҝ .EB=Z5& imtnIflVDdFkȝ[m0K^6I,Rڍ%Wf@"$ rRk:r AX"eZ Jw0 'A<$ז"] AXIe=bÍ1h0yÒrCTv Oe']uKbVnۄOF~%eԁ,Hﭷx57͊yDX\]֚69p4UUެF `Eeܤ$h1 1ím7Ꮍ NiFRL<9Ynraaȴ$v3E‰\,AdL| 6K)ܨ(MGnkc1F2uyΩG9~0rz1ꚉoH|< =ݙsU@wDJ2yK{ooTsgT~<\UxZ8JΨ!i2av,R+bmG,y4ܩP5nlmg3לNAܲ1%kMz#r>]1,Ҭ!ܹa`A8==M1Ix\:Zp0jB[o{cCG4:Mu-U3ǃSU~kN)͈M$\7fDwzw??}}M%5Gvwv:I8ּ]CZKdnF(IJ$cEvAࣔggQ+*4i6Go5>>?sr\/`@.yDi M]gY:̢H03[Q#~BI^3^b^\.tR[ dg[;9^7N&% ywV~.Y?S2u6/ws:Fc 3յi&BJH&0Pf1c4f[)l`Ԇa>>NJq\c4-/ r v+#:-F ױ"m,3J?(_0͔5ouArަ8=hGjlcqd#U SR_f !9k l6!&$d( lԣ^g i#{j@@w!:wiiU/[(y;u+bMYK3f/BA."b{#Hշ_7oj=5jfr> !: \ל2iaM5 KveTRIbc|gfGDSds' Bx^ayޞ?ezmf[G&,QhqFNUXRUm-*.)&]k %v?C 6̃ۘΛ\~tUu9!o2PrA yF&,b"ě*Wq~_ ?Fo?P8(K(toK ,}<7,k[lҳQ)@.0Ss(wd99hePd'+~ Ȇh+2.ݧZ8. 2KXiJ+Jcdҷ{VT| B׼ϕpwPK_+D̔l!.59zmɃNF>4)Zwj84ڻ{}"LބXҖmTZ_a>~(AkbzQ6n ,m)9sX6/`@A?{q3{$~ɽc8/eI6\ǕؖjT%Q*4A5Z+1m.|Pqo/a 0d9a "a,|w Go7˜s)P/\ح^5>!3sHZ ¤D ʚt>'*>~:˘u}eFhIͬ@HpϵP%W-GWszRX*vtL3.i+–c(3r# ~]>|xJO 2q!w䚆>Z3U+t͇JS{sYvү$=&3ΘT m^Ouxι=܏\{գk_' T[aL%1`Y[Dl"돨B3?g<Քy!q<JLCUEXl1z׀pS຿ŠYjq۠ su uoO<{Mt<;AtQX2^y&Y}/v!MMrvEZS>gS!$j%XJeUSDcp\(9$#*dNSEZ 'zco?=[կh߅ْE R$}1=Y[ot E$JS*ɺ~쏵ե6&r~m31+d-%TXIs**45kMB]&^<6WbTT, n F"C1QZ=PPE%C)KSm??X=L1fϰףwh>Dߥ~If&HM E*T)XS̐%ljY %[KzhGu[RX;+ic5 R'Ҹ[s.5UP(tw%iµ@߽&` ѽ1bd ^ #ܣ΢%imV1X`^LP:tT}Z쀓Xݧ|/z.I9鑄j /YTL׭R{tþ(׮<" g]K)$"$ERIx&Hf)rc_ƅRYwKi\{" x3꯭z Bs\l k(#X20sZGd̮n&dxR/&BTdƜպG0wSוHR-'TZ=I:#O}xdi3F(Q @pS6V98{s _b?,NZg8n?a j;ȊPD@T{ 1kIHq Ҟ'{%jK {;%%uX0܃ bFBeh*L_R̘c̙{3m-\93W&__dF8fcG4R7[COlE]Te/]ZH55EݛJq;R 3nWMWG=z͔NZKB!&j8{sfu;?9!Ȝq4)8?߅hJBԧ $6"Ew 923az%e/ V!`AAz7E 0E]YAIHB!\1F뽵`݆EDm%l,c\ {>Gd删fR-_aԴrnl: X¡s~,>2L5${Ǯq]bKuo&6w=_{y/"LkzRm{3ȟf7׸\m6aa\uClsN@;}y ['׋$T[s -VKKM!핈7,a`IE(j>2EU# Sb}z[SSҚ"ZMqI3DF1"G"5+|[ma>q$AtujT/hjX?JbOA>Ͼj{1sA ]wՌ*xNK ICGs$}Š Tѯi,:k꭪aTL&wO7%v[3Gd4@Jf&`qۼՊ~QsJHU)1-}N;3$g:\H"kF/~ ;nG7AuUsfm5}GoZ4SS"Ya>|$3İ&H~kId6 hPQɺ3:Ȝ{<X]г '`#ޞ EZXn—U-41kY 0m-$ZT2缮{ΥqWF3ً4R,Q&4S-ÕAe77Xoގߵ&\ka8ye[Ww Zg?zv6QA}c9Ů)$gQcs^rIhnED*"sVwTIh3}LwXR {ɽ#b1j/pjdDjuKO7)K=mLW>Gk ?w,^3]S6 K ߛl[2VWq2⪒c='uWG% 3!//V *ID׈)6He9RO6a3NawwcisE"+*I%>%.E]U5 ) ,%wrXkb* ݬeԛ,u;XJ53h7Eŀ@vv."טc9n̄>[ T_]jkqW^1KY>ڈ  AJʗ [꼆{rY"gk@0}~{}_CYn`ݸEn 6Fjz -M L0Ԭ%dz(L߁y4}[6-hINV^&? FlfL-Q<]UDU@_saT\]Z+3>G$"Vn;6 8״^6]˒x-Y_z#)ꭵ(Hn|}:Lb/0"|MCA1M茘~ԏ_~?jo_L+?;88VufG WD*V*Z3a9{]H6\DF |#E)[=,D0{?JdYt hk]~iۢB tAe \ ӧ{L;tۿLΌH2=sgRk~u"`4IDV4ÞvHJҠ*KCQ19GEW,[@fR7Xߤ9V?Hخe\^K4 oe p)C>/=3U"KT2ф9 B[3/h4VJBJ.QknBwjG"w0AS,Vw_"j[)$skWKRHYT3*)p,u"2+QuZ̔Փfδ0>,Y2|n@Ò2e QE1 `zu3AF57wo~t1+#<|OHS6a 2FSƼƌj7ᎎO,–DV֩5kٔR+;iv$ѭ},QT㺮1=Rڬ(;bb7o@kz_tR e k[[$r]JST2a0 -ryu_FF <%9u]S `5g|{7h/uU귾~8eM]d0}"Ia F$ naufb]8!!:ue E؊Wz@WfA@WWJ芻u:Q2i Ϧ a$c^/k=J%,bs ڞVک0HwAr9 bb]zX0sE#7 S-b5UZ _FfSBgj9]cL#;ܿ};s-~x `sFAa D =LuJ`&$z7IC"[ 尗ʋju))Z&҄;?2'o]_|e q4[LH(^>һf"^ D6ID]K )Zz,;OBK򀒋kM}'+"d,NWfb@ޛo21/LJ[LFjkYl~"̄]rdlh}^/ZȘd5)&]fX^>vB'Eԩgf8 z4ҽOOnє1%Bx‰CřFRfMFYb十hļe6%DTYL[x-H#^BY<2B3|!sMHe(sF Z%*QG`b9OO)ӵ^%%~eRد4p9t/?ϧiv2\cϊ˦9LXT\G:L b^Lw}@>GŸ=swoڦ$~ߠCu]a’LOxܭ531YV(0cz)@VR3!9r U5<c# Ċ.\ ǰXS$b ԺoV8.iÇaBD+/. ^wm"#ZD."MwϟhS5#Lmc\$MR !QLh[qޞꝦ h^Bw:!kX|֚ښ1}\&ҢfXכK%jme1 bBe_,@iI$S鶈 ).泻{T.q<Ys |(!L{,A޼fe8?fIotM(zPo 3us^~-<T~p++Gv;Mr"7:X}_g _O0gҿ||`(jJC-}He1"G4cZ5+$bIhÒ⅑Ϭ@kG> cDkV{6LCBو*gU Gܶč<[q+-գ,+J̤̑"#durRۯgMx:oy d\uD)9}98 #QEAm tr94IE뛌e7r\AJ]wz=W[GSaLLBN{c@nDecE"@ svEu OH,]-D3A }b6:YfG*+W@%>4*4Ms8zkM2>,T>bkfhiBK\@ǏOI˅!8Y Wp`yu])sjc$b2 &)q}e`}/Z؄k=eVtQS'Ĭ7\r# R\I5L LˣZݝj 6;☺k|Dy;ik)VQEAI}^*슜Jh,Ќћ;&NIg0AQFI45OG yGR_Ц0gLѕ9~wL j@z-3N"Q3Mqq[-TS}oEz_eko0j;G:Qk;)cQ^l$ 2@q0$~}!vjfԓ8<0eq3*hrVVO}k[;rqVUnD ϛ݈DzI!w8^%Bj23Ǐ>~|:E4dD5 Vݯcg2 *H7E~UG$HfPj2%,Z[q{Go&elGMQfMhXJZM!%+Gק@5͈q`AMꎼ?,`kc 9<˾ҭ+KCjeZw U$~ݯk'd~yFk)3P(D"5M3 ࢎY)աO>},#P9|ZgeD,N1;z3[QXx  P )[ ן~msCگu+؃kT֎LW\.Ԋn%'ԤT QApW~vAS҇F @Ǎ=3 rpҶԱ"R2&Ӈ ï%>Myy_Ř[1_KV!7lbȘӧO?}t6&3jwẅ́ `h///ʹL{L}R˩_ָ(nG:n?l.#uZn-ZI"* YOTpksX'҇W4r u]ya GQKrfBBK?܎HƸܯM3AKnU\FWѵIPsAOO?}t늈xǗrt͐BVɌVtf\Hf uQ& |ݑIdƜsf\ןޛU?Loך3"Y^>X )Mv|@]WksWD›gLY> zv/Hؽ5A.O*!kPY0"vٕs/G7a`2yn}N}JخN `DXq{,h&` uyy}k #y$bng1Ael"c\u]q>0 ,1Z3 Y4ا꽹AſM_wJe"Evnj E`ŋl媗nh ~D4sgeCDҩ۔$=`-Vpv;z5d! {07.w֏޺ /wuC3|\ץOl#\óz]Jqޞ*3|u]Xq~~驘m0C^ Gt%~_яޚ >\J*ئLB;[-֯Ck>^a7}S>Pe6kO(D.9l&5yUResK\Gi^֜c:X{ٻ |ٻqyvtMmT,A}ȴjrƹZr?09>k %Em dFtd^^8MJn:m"z؛G '?c'V5 #2L%}\H8(ڒL,E"_s "}bN$g{uO2缆nyskNi&WU{t@1hqzuG+Qf= g;YyO6dfb3 x%+фLVSr^/~uS 9 R5g,^Z>&O\(R*qՈ lb{zoLFD?M6#3"rFZN0)慺׼E\44+pZ^byhRcyҗ:u]p=k5Ut?(~ոpO[3燵]KZww4j``kv&d&YA|!g>nKLM ɳjoDƸ^//{3IDVqF(P!unfS7X_4?=껽)? P5zdiIv򫵾LHHQOdtjjf"(5idy]r+%@TxRI#Oa€gLt`Ag朞Z֬0ˌҳDSU+v+ phNeQN$oMS1Yن y{ jf+,d59"}/{?*>>t@P<|I,cNwܿ|;ٚTY)G ,oJ#]5qF%k# ;ݍ\FT88;sqY[])&A]v֛21|([qy#iL#)S(<TnQ]Ç!u/W3Dz /Ѯ޾tJsyTs<$ P13A0|~]/=Y~:zk.&vJi*uncg?<Ŭ-۩9^yϊGEECiHRa{oŀ,}fhkK _[I UfɊ,!{Kݞ>|x:ӅgGo%94y˰5~HdjZH4IJ+/爧a Pc +J_C"XT P- *𻩊 N9SM (a>VDm36+[_Q!`0318&If&̚)TJMkk|~^[V`nn*j ֶ=} y c YKzY4]K)`}Tv+c'G) !eD#s nPHl9'j ZU^nY<QfB="ʨnڜs)1ܳ'[civkų<"̘,0Lm-L3c"fj)@d~ww9)}3blʜP0Qp< F`k@Y]qM.Œn2$VHFͯ<ϳ,8?(5bBc\#β)i_(lHX M]JdX[B5k}X1g5pRz~+_99)˞I@(#fQ;VsΩI;;hF"|wݾ콾suo?hʏRiG^+Z2Âk<mP aLM51VWDD$2%W95.@F`Ik*y/>Ǻ90 .d"%&4:`ְsED4 ?+=hg j-L*fM==<fh-$5'PbT<2+dDw&2AJdLG*k/*@2#o{su>gylEJ_s=IeHxVo&*ٛыcnMv%Ia挺vJPS䌤hMATKm*JQ~ sďL`bF;YulmgTeϾ=Omql\R6S[{zl : 2bkH?N:K@j\ؕ$ sJY,{\ _#g|뗪$g)%񤘘H0f5鲳 seݰP@qnn̦ WQ+bݔT"B Zt1u]gZ@¬3! y @.]f 5j$74=Dݷd(3Ղ u_8oLIGmC4l& ad"aJC/b2X g=aƸ/wٻJQGAI)C8ޥoޛa>Az19G볻-c+ "?;Qt;ST4g +ra'DKh-s5]dư1 3rÛdqКJfH"z..^UL^@`Ezy4)Ie-șYV`KYRnZ]6lX9/8L{Ԋ3iN|³Q S澘 $T^ ڿ쭒bW~E22D&Wf Xd^^vQjof߷XxwV\Τ1+S0QȈlp>p+լe1ME{)њm7ݷ+LϨV,Cӈ(ĤeDFzc|&R{$Rcgt){{[eޯ3,3+|]0 {w)tܞ>nii.X2:D  aŁH.ٻI"#+C_d[,5uP>Qn"C{[%et[J֚ "9=);!`?Ydɘ`x@En@aKM>e=ZmkSaX;jӇVs*<.El9eB3\7X[7Xz1XW.$ƤAfHߔs $hiYYw+Û )10SVE,X %̭2UEc]= {D}x# 3!V3(K.#0CKZh675'CdDIɜJ_AVY*{oJmoKq,ր0|uA>q44IXwQ*1{kih^^P"{EaTP.8cj4EQ$XYǧhKR5k&̦`f1%5dM)*"&bR LșpE\'jFe`ޔroHq>Ɯ7+)5цDG7OJ3ژ u_{X~ 5/B)Չ,amTm[2Uu5BU7u*ffpKM f\#eZtvP?".J0zOΣ);QK-kU!ٛiBZWIuTfRVWNS8(sΕt^#_~0~>sݛٿ0V TZ$!8"] 9bMbN(nC`WP!/ߧNkmDDhB!jgT$#"zΆ͍X+@?@R! ,OSQ)a5%F&+jL dhxyˇ>}ʄ-c/T}(nBTM~ތ\8v0{F%~t:g BPB9-Oop_s.[)jedm7E:bbbfl HdJ6&2܇&ȢgIx`d)RSv֜{h*R6KS,{#4&x7cY1UTƘ pRKH#|ܟ?租>~ +/)Zz^((Ha dT)\Bf{!2(,.TX`K!`}m쿪XK5S3-e\oQ5kT Xxs|ar feqe4E1WGrZ0Wkˬ,YG`zDV {ooj91+1YA֪VG,!AIӧ[70˹K8礈 BZ$D2Rkv@e* T7R9']ɨ͙`ez_oz\Lu \ %wb WWE)S^tE!/k2<5N@݃p.cz>1OBX7 0{ƽѬ^H ,%iIGp,0 y~?o?}:s=bR$ 03P f%\Q:#VXé9Q鄨T>\?ܳiw^zMP)>6vpU_jMTUYj4~Rw0bz.Lk&"̅9?TNaX4Kj- PTK_$uc-wfzoMPg}2Vs SQb-FD JJ4kŜoO?#eJg知e4USp@C7'8"ʐHF d+)(a{zo`-n#m2BˌPf{iҳ*Fۖ2U6"3Ñu]C+1="%lHҟvV #=^^Zf{Xgyt‚ľ^ޢtHU@5h!RHF?o租> Vr>AɌZ+ ck- 5{x!Ç0f9L1kLMsjh *uv;¶"Kg8ϧ[S0|7 X[;ɏjP- Z{aSy[I)dD Fhi& 漿O?ík1ݧGTP_7en5Ua6,%R˺td^d$2`2jHzcBv?ȡ+fqs^x֓~Ff|*u"]cxAnrc_;BD#`TAIoOO)/e7re vs1qH,Sdm֚ Еc}T^&I D9b2>O>~t4!+J kX'SSd7R* [(w02c_3*~o֟ޢ,YYwWo?xR!O ddItE&#=FfX|• Z j:"]9{kWd E&Y-Yu_h>TĊJj]Ӈc*cNߑ&&d1cˌ* !l-R&LJ@%lUPaF̴e^S$}OytC\%Tk8!? )bzR!ȶ3Eլ~,'C0lTEϢAĬB WnxoW7.ML_]U5wP%|!WGkH.>X͟V lԆW]fO>|x: Ww(3C1ǜR"{؁JK=9JRoe#Wlx=NATZk&~9Gy;oG!^j,r)LsFWI$F5iUUhq0'%]A$aG?F`LO?BZOoY~m,H?g|n!XwQf[H2p6Hd&-j!ޛ5-LV]Ogv T\uYҔ{fjO fnB7/j*rbuOI)VjILFnfYk%޳D 5+3K"Z?m|j}\5S===ݞVR=$V#vdi>źBBZkMjGVK惟f#LDf@28j̑*+23E! )tjyfbZ#puv;^9m+ jbggrNu,^MHY]֩3 #ͬzY?WFN8zsՀ>6 ? (-T2TZkV'"뺭lFFN}kf n{Ӵ0 Dk`AtvUFKdM%}zT)rkl$a|;7g!lĊs ȈZ0>e j;O* zVCMXΟW%/_~ksZw5|)jt,EAV)! ".Z/j0TR(Lġ)s-9@Z:'*~+Qe j䱤Ԑ]{,gvty5݄1f6zW 3U)QghwT2:6"dHAQ#cL *gf$b^//ϟ?? ݔd8 PdwfV_|^Y_y,rW%~n_I@-{ڦ@e* My`FDDPȊ9B)x-BFĜ0=kZkHSDfMB9 $c!e^)fbMsb\[iy{*"{ޚsMs͐hMLMsyD'ZREt9i351^"0twp?{/+2ud,Tf2J:ך|+QCoZ~/#~9AIU *E{5dJԢdTddp#T e)L֖1 HS)ڭTvikp]"Bk:luVy[\]QLj*(bVvt%uqV7{WYoYSId+ؼO1< -QZ:m6%;miy§>G3"xѵP quk Jg0d֏XTwOW_}t_z~c󿼐:[Q\Ԭ\=SW2mf0#T@F>lݗ,[ߜʴjCI'*P)^V6+r1/`T5ƈf̚Pݛg YXk{(c_Gk8EuWIe|U3jL^4߸a>@Y ۉl1IB~?U2+Pp01G @3C+f77Y 5/?u"|VOۚ7o)`"VyɈE.WHm43]1cDDIDJ^Ȯ.$%*aY^s1gܶˆ15& ,jqW>ǑvH Ӆ9"Ta{xz`E̠p$DSqMAw9ypgPٱ`f4Vo}dDv90ɦY?_qTo=Ƃpz0# R|VW_~iWC)Zi_LW"33ܧG)713LPAZ]*- wp&cZtfYs]5Z'*RɘYlN1x[22qx]EF8i$PҚMhh 21>CEF2VtkᡪFs܅V_p;!c8SXGcƌɬ;=E3MLQ]ZF3ʺFn#S!+4ﱲ<2} W%Ws/ "b8kfϡT_cNv: Ɯ{)RA?F3Z;sU.%RL`DpSb* U`\,9u繀b@CYYw,Xs4-GԼ?~O?<$}SP__˘s8Eq{ɘ}kzj+bKdXX&w* б򮳙 c1=lTQjw)PM$ey(>G7T,u> fJsc}p;0P0{j` +|b #7ߚTo $gk;-QCI>Ȍrd ԽDyV y +~@TJ)Rlф>=X!eEq/l,Y7}.ʋ!gPN ib]W~$(_3"@eedA~^+< fDpgLefJf F&E$g9O?y4N5J}14ۤ_xbX?tsUw:>o\7,.GB)X[BH&L)&RCD`1pNkB(@,9L > D2ҴYr8nBazYkCJz!:WXL5Jꨕ'RЕj'(ר7}Gd~\///i#@ SnVXP"PQfVb`BP=ERO?lq/Sk]u~[ ( wNs?&3% "RVSr=kl;.kd13wFTXLJb L4a0}D1Yt-if :h "7KpȨvVS xY1#{⩌9///z%e$#haIdSJ2ˌVV,hT2U#KґO~[7!1/({d%l-I<_Ǡ)2v %]u1wf -]H䚘df]V +"Q "P gSғFxf5`P5PUWidMY̴zR78tֽܽ2X~Aԛqݟ_qGk["Lf==}xGouZ1=ﵫi6%Il>!跧ӧOgWdo>Y<=V`GދW{7C}~9Wü^ .- Lk2D pL ̵D;De cO=-YR @`f:SU ɝOUUM@93ŒuF2.(1~]׌-‘q?q sŁ;?| Ϣdk`$I @?~4==d"x^<==rA^Mw0/Uܷ?Pk_lXߥ2+<3B )@Z.CdfU0F%HBDŃ5h m|lQUu9$}Vux^ྸ>b)(*Hy_^yd>뚬Fo?}v4Ey1뙥Yk$V0>m8><=ǘc"]QQ  7Xrt} Wߗs69V6;7sʧ%1_ΔBCKG%.f.LnBD).2"t3՚quEs1ck!F_4u.:Ԫܯ1!B/l,rw1ǸKZfx駟>}x5C:15z0hؑ%\_T}O?}x:pzy~O8`c f ֏~"]BmFr?~05!Ĭ(Uy4?M}'z13G>dZߢՈ <ۂdO9=] 8,Ͻ0 rPsT~5/RЙGgSrF!g1*ʪ`M֞w]+{}ڦ_^hqn5AV$r?P8 s$y$@Y23[FF ;^Zڞ<\pZf$95!UPQ{?Yca졢i*kgEg8`2(@>F j_)`\"=xpsU*[E_)uլYduEҧ'PzoZ wKhY:J4%Pr=ǚ^juY Lc 0َӇ>|p6 *3o]s|,ѶHKM^_jm*Egӻ> } __f~Zk݀G.dxS}L 0/-cǎ-Q-p퉋 ژT{{9sOmHf!*Ts#&2׽cwMm-ZZŨ,:mJf;hh!*`BVnjkTlCbO7RDHjY^~AԈ`uû,etuh b1#2 @T5*ˮ+d&ºGqfO>]~2zۻy%\rî_}^*Qk1SAJc䬌p0#^obǯ!/oZEjW`Z]Xq_u6Ot=skL-cC l\5G"F+fÄ1Kڒ mb= ?+ٯ [."Xzhk);oZdj 4Ht~c=8M%_̭% 0m ML8b|ϟ轙 AtzC@1!JqmYi*bK$QSБhÓ!8C^oޛ_p=93|@g*.B.*k.뱘5dPҥMy̆MygX2#2ˆJ8sP )d/"O"Mbj_v/2J Pɰb?&SkZ/iC00~<矟_Nh sd0U-\4C" aa݃  -)f|[{sȰO\rN!#kZ; IQtv]H%bԎ=PG1w\E"|I(jxYwӵ+PQfMe8"0D8W1:&ԒխOLw*T0!ޭ#ۣF\,M,1Y{Ia:=\\{fJ,Te3'b鐔(jwkQu;uv$)8l&ͪlWw)fAHj*o'CK f^AL֘E+ӽ)l}4/NE_Yը:GR+k2s틋^Y VWT).?L S[qn&&9݃j̬N^I?kX\} &뽹q:``w $u!TUh2g-\8_ Gӵ|6`2j]ZZlVTHJC켥fg"CLס.%f*8odPA/d 3"t !!cXD!HntNs'Sd 끑 @j9ߏ7u/MQGw:׷k"GHWRPK+QT&d[ߒ&"Uˆ)7L5(:{(PbFfЀi8oOG/d\AA0f;PE>چVY3":ks~솘 #D ^| 2cT:>T.ֺ y7Uoy\G_}EE r{W^֖oGx,+p Rd=G Wo-R(af>f%<1`9լ:v@֏v;PaY[91/UYsNw5ݞZTJ&QE`(B˜rݲ5}1 1Cus6,O V>qD{_i ˼z{]:W@Zk-Jh踲uΐLhiGjy/d6 N2u| fcJFwbgkY2r qYS 4kMEޏ5T@\[k5^? =QH-!^G"2zфLK判 ʋ򺦳|e"h<^WD?L̥NЖZS ]&ak4.K_IZ UX? ^w c7Xo- ⫹pffYEku3k&FK 2>.ԯl'+1&$ =D%\SP*Z >,/j̤Y|={7H'1AeH˪ۚi2ִ5EGTdg">^?JAй,wЋiqe4k6̘)G#B|i8E6 '֍i{a #{ P%}= n[^\5hgQ J)c>Q" nXA  Vf ͽ֞%ܱΤ[IyvEZn1>ss`L}FΜMU|WúPG&E/T*1PM>J95E_5jSNۊ֏ޛ"%s&K@O>Z~.{3AtrBC"bZ͋a1{sUn =3ZM`0 Y̰k@U5`ۄn* f'epu%\ԸQqL0-$(X t.&b/ԣ*r #*"fd&T"`m%1<:7"Vs༏yufRΩi$ Aڭ"c֏5YɜDTR̗ f(ߟ`}??Ow[*L{o*)4٪pٖzwIQ>ϪleF Ib!MPBKBEZ|S ~Pdc1#(fH+D(vSmwtq f |Y>1&Ϙ)Ipic2KdejJEpPRRL{?*+;#]E 1]<!ZǕME㽹JcJ1<t0Kfψ?c >0!)_1E jh73M~_lskf0⛵upzښTsbuUFx@(YSLoVâ>|Bj>Go !Ԩ'= n?Ork[E IEWY@\#Z2Ȥ0-/MM,%?,)̌5hQD]"n^fY V}xꚍУZ5L,T]5Pyg5 (""TDJք bj#cX"ęR %>}f7k=c\\ʬ&,:=b^ʦq]3 (3|G,,Y#Șǘᮢ"jc\&#b|_s^Zk_G w_)p.@?z1J^)rGR |U &$j.L 2B(Prz?RN(G+ [5ͺEGlsa*)uD@Afj-k,#H @fPdf QQ%Lº.-~(2|*!h˜ce7wBi˚P>{#f6՚ @CTd' ^RqEXqM\^AimyBJ;n^bI<: I VY8S`@Zܸr ibA& 3qVPjVHnEEgSXIHUquJf8IU۬&<^) SLQ3|`"7p-DSw=M>}=byR*JZk5eDLiBB%4к۫pso?~ v_[Z@_B\!VqJm'5^TAf7o$D~0XM:VW@ĎBQU/e<ϳOe  ]{A[kTdlF&\12TFB mfT! K5eJ#ܳؼ5vb*ȠQ+oÖZL*fD, MA@Ati* t۩2៯Y^R5{7ak+3-QPb9+Alċn"uEK|%E-+ >-3ߺH}9nmjOv;)2qDJ}nRJkmr!Sdde%EQxJqޮJ-RúgFxi|Bu"en%5&9_*֪k- A,ĺhDR̬i )ʅfB!̨M[4TEK6럛2>?0oz'Qj@}XcL؇v&D%sj]{DVˈhK6B8B+5ah~nVK뽒7X4XSE=`{I@E5ދ=Iu9fV87++S0óVF@EADfFKZnʌ`eg*=d%ڔm~E̯0|~aK]ʼ@T51Ev7M1#">Ǐ̀1^XJ+f=J8z/pfPm4>ZhM_X,u1Jƨ Y6#`6 JVfYWUd^"&}X!2BC /[[EȔ_T;ݵ\C.O5ʏ ?̐uAԬ{kA"Yߔ(^?HߥfKEQ=CzpZMn=aMٛ^M,Y.k~h"`Wˢ[?qV<43Y ff n"`~)y_+Q $uj̺M`j DŰh~N+_I̔^'B78Z{6e[3nU e> {lʌKHPEd]L8g/ۢ@f暷" f:-VKj MMH՞⩵sxU>Pt7oRbdsc<8"zNTYci,؄@DB` ֺ4 ַBs0NffK^L:,{}ַ7!J"W}EzRIwJ=}m, !"ǜ/i`,12Ur䥭pI[, BTm[jA_6w3/](ywW繝[oB>0Hڑ5ճD|[} ̧wz&MUVq> 7Z3#Pa_>HZ74@ƔGzhEkgw$,yLMykEZ@ ռZ(F6hD+4D>hTd0HSfn<\`fA,rZU{kiuaPQDbbBD jX."0?}[dm43S Й=/!3g][[?s9N u@ b0q&3$keDmޅ$ +K Q]ZM=ǘj~e=`)aQ% *!*G=>KOrڒSjWS"pUS{oJG";2ܟGND?8qޒ@`JLC LTfo뿚o?#)']˴dg 0uHP @Gf5xvw}۷. .6v>c"1, Wh fsU,hf@:cdzFcwȘiL$+"e}#v53RBT'Ap7L>WS<19"|/659" MDmqmօQ&MzcpgD5 }7A nT)T"e3GfT'w0z9LtlJH`fnf8]VudݵD 0>N&,mS5DʝRC5sGŨHW~O"M\UODD 칍_8LZA9+o? H0(a:e4SpƛyBJ`:0l'FSD08cP߷fcŵ@J ܶ3LasG wY no8Ztr.?(0}zw/lJ*'s\Ӗqqq]v!W m"[78@gnD"F7sOnk'bL:P: 0694H5!yC0ԙuj?ez*#C$$i-m2^Ww\{k N8F5ltN&gpzv]8]`Z;REngj3:2G+ +X/T13k5ߨ-}zOGz€EŪ>~B;q}; A L}̓ W.S] w=*P0rzڄg˂ဵVis pF<38uٙjwKzs nn aF3Lap.[,;EN"Bq\W\.{g X#@Ć0 JƘkH$QFZʟsoq{oTÏ+{kc9B`cq{n۾{P0=(aLlfyd)A<*uWw3M *Ѝr3E0Y,$M O$:9 "Yc9 !ES>ww%RDwR HhMtB5!pi><<<\&61W:Zb! !mY B߃1(&k"0U7'k?tؼG'Pd$jn}sBq}۶mCmA-X ښ@Q#̘\}% c\ sdnGF,,3e̬ 5)lmb Cp=!) Pݗ2uƜE4kƶ_Pd*$f6neo „Xo /_8߃k})jbm}/P;Íp1"W̦^a} kj/W |Z{?.7"rT%79O}zkfkjм`"kJJ>GMj4/Q=mjW[#qxzK A^:FW#kHhMw>ग="-!nsDZo֘Y:4Mbhw o}Zk}BU͢LĚ uOb 3ga䲞` %n@D:քe\Ƭg6ww!0pҁ bn M?(TBTSm/Cf)x>XoC/ /Y}Mg2TGN=e@]O!9hZX/࡭oE|TK^ %*I]KJDdK<$ @ifC3EWϳ{Hk۶mB`nClDfն={ci1(LsA7ht@D:n S9Cz&!S"_.w@%&qIX" ◔lvcm[tIg7K9~3@y_^`|Q^on:(9=~ Zo0y^D|9",n,nF1Z9 s)_ d3;n뭉yzsX=3mAQS I(! O!{#קﶭ;JF]<s2UU׉Pk=9sU B1ڞQsh.ZR ЭW7"ff>8ǩ>H%J'ay03Ó.qd˾mF9KWa")'"a{x> o1{^.չ}2Z8DE-O I[kaZQ+ ]ny . r IrIȵw9uNP2!;5s9@> h*KqwLNdJAsDi- uq܎dy̳]o[k"Dxds;ch<3v z^}m[o})Y0i5/\-2 f5L΢f609Ͷ-bn>{k7L\FȍΩQx k n[F)K`.&lgnޞ nf21U!ɍXKVH!̌Vc| 9S70>IS ֎x ӳQ8ǖˀqu!W|I"gtSc3d0ޘɳ!$$okƿ mik@@"%WWy(@ȸ &uSU*p:x[umg& 7\waf6I<48֡p+`Iq˭N6{MRDB;.;=D1&=7K0%%Zͅ9g"t 1bhQ)z:-\ uf|F*TE0=<1{oKEAGYv^Qa >jEܷ֚ sQܒ}[H]\ WExX szw0?aU D80ax>x3Ly/[Eq,MnfPu- 7%@6O&oL—aO+#8c)uT)GY! qk9)$_Myp "v)JaDY!_e}bs ֫g#^E3g.۶[שּ&JŸm$ \H靈+Ίrj2-Kuw IP/d<j'ҙ=cc ;=I5aK3 ˩a ƪ!x°}:/:)yⰚi4aܳM6o?cm y0I/IbtΛm@UwdT&nk 311& R+&,]<(cV{5q1lU Sz#SlDoG4߷ߪ@n֩oۥ{xb!7@8#f-[7IZF6jgҶm"F54 TՀnfVfJk/03A*ғ@ ^"y8j;3#fgkEyڈ]KtGߧ2Bdr'2Üsq>̹%c-=!,cL8& EY[s{ho7ipQx\}/iiɳ3 r'` Ӱi$]} DZχxa l~I7#Ly`f vXN" ?*9S)0⺊?;&9` wJ&]u!2lv*ơD+ WG=+UU0% Wف4e vsn 7qs"dw9%aojK"2'em۶=ז(瞚< @N/iA}SCt!}o.`-sbJI<7ws1+@PKK_Z F& ?@$L fg+L3gpv FL,"’17Ą(ݗ~W Y\KxaVHSHJ1o[cpcymlnM1a. @4;ۯkOr'MWV[1dIyi\[ws:Pnһ``C0tXrCp_dB,"0_TQ"Knp@+Ã]¼I@ SOq8'g7I.X jflNv;Nu6M9zx7S0oXpΧ0E2m,Hv\6D"iZ rNL"qZPE@@ hӮgTdETw ׊VepWvYf@) |en$yj8|߉)sk7&tӾm~;ΛoEFŬ]H"V_>ُG8gD1$LcUT2`Q͝$!Lᡡuc:UOƠ02Op4m L D2.#Dlv*aP`7'M$Vʽ rG[# WVق08Xs ۥF2&F9tӺl8.f/K9&DZkBnmc5,3a`?[}^]s/x|.~y.Ç3=%EX,8DŽ<C9TUELc\:Y#eLu@n:紁`>3#8hD,a,n p @V#zNsDHcZ d+13bx1 ・8%%E A,}R Zd@rX9M+c $`@pz:H9m^K@ߞ?M\5Gÿ 0e1lٲyqiNA|o99]ASK1HK`ctc$ 3](Tvn[5q]$ׁa Zl 8L !*:gyjN1e WOG /ZRtNLJ˥7׳ _)r]t:3Cy!CZgƌF$ͰjR "8L=wQۘ0΀ "WXGψS9ǩǿ`UsN'ܕcsCg}T86t5"Fַm?1<`hd@~A_Pa#H2/MU [\p%ZuN5F]91c{hV#\K%-9ꀹjy 3ӇLG3a?0&;8["ോ\GEfe!$(??@x5X?8Cn4~W{gK7ǀ{cPs$r3iA)Eu >_Ҧinmn" 7DQz{#1Ut T3au /Sy=mطm۶}3c no?BLc=u9-Ix2M#,$A_t嵇Bն.X *f !EX*\8goysg(5WXW_g?V E[5Hc pe 0|") a]϶ E"Y rFa DX<q%-duuww.am f*1c+1xxo۴B LB9 tofj:Μ4BĢzJfNBG.dkMDu8[]I>)7`ğy{hsi}~wk 3S*o˾oM+ρli+ lMcC':kԅEmi,'j9˭PB$HdZAd|cx<[8mgEϼ@=N i-LE4q%n:Op-=@Hm%Hz#rP8_2 mS @Kjvk&+6b"yo#hB;gNp/ܿL}-?#cehrي-nTu@dJE 1`XAn8 MtfSm{qn ~_I  sPJa&" eRL20twTF7Bm= TcM#(xb[mdGzEba2:P˹DQSSu"no]myqDAA(J &D[smm>3"p+SOD\!-FaȍE',#_ٸX$&K ' Da@L0V膻; `bE0a 4ӨOD^%lӘ2 B4$ij ]G{<[EDrQ AIfm-Ui{p)RR5=1- Rd1pJ|9'=/@B u/̈́+ poVxIA/?C *(8Malݳ<=s:x9WN`T-_g>w3u:sE R,S [&p0U"y^Lhbx^up iք!\ By_J)xe98cXq̰UBܥyJf"$pB.(cF̴`sG+4`1&,Qnc%1ߕb1w`:T1LZ26&t u%M k|*w9+RB`+ r**JᑰY pC܄<[Tضwap @&nDHT )2 1[SՑB! ́,^!A:ޭ.YycQ.HE/p3չ!" gi'9<Lls̸7i@`u0VN5+.: 5@o[s WW:D'77^e0Ð]YK'0H:x*}߶&A(2a$U ZBXRiwU/JTEņo",HH$H5 eTsƀOd.OBN!D'|ki)M9mDX"'"(>35i+ DtM‚)_ 9oYo}Y_VQPTl#"Ŏ9T51oD,"3ϰQqhˑ4&᮳14 W0/0BgV8"fz0^ـ)MLLkSUuZJvZԙ2&T/f@,R.C3$J A@ܛpv%Jԡbv}T:Pwpp sx-nA=3ޚۿOZhHa6瘉< FS7cԌYZM`<ǞCWf.B$p>j2{߶1Q&D y-TsAS<*Z nespy4y\w@'bb@0!HHTL@$vrBH0KoR)ɔ Xs3yq-|gp@Xw9U_MAիt3sAW0xQ5pD扰FmbA14lfͅhyzfkX,ȆnX q28 b)>)lr6sշ%YҤ NXc:(̩}۷.`a:}z# 7i^Msy֓S"Qo>o}k>#\oܿ@wJ:mg$B7˖M(-7s= ?,*M 1ffswWyF%F2E=D.%v^~ԣأW/L:18k6870yn}zI:32VfWZ p`|(yξ[t++Wo?3 5Au޽{w ۾ =4/w{<J{Ol޻>$ޓ\NxšD):/}knnIoZ(]unGDr$*ح=MoQ]8 98JR10>8]C6RncJIV~[;\noo۾mes~ٷF`ঐĄJ{qdoz$*4p σ\:,~M.RkKYmwnBb~ٻ0Ͱ=TN^nF>#`QgF3%P0=m\:q񚖂[0aEE1cvO}=H9 7%yiQmrfyqLH$`w@nv:0"LHDDfnLXS K*ڶ֛`Xy|mct WmۖUtunz{-la=~~d]xg}|ae^~Zօ\+7Z1B%R&7R[q+W}yN2ƙ2`؜jdGQstK Bhh :VgL@dh%\U›G K'11`c@ bx I5 yj@@HDF]KT\$)md"z-Nv)6Bû~]х֭W{o5ֽ?oV[_^>M74y:BN 2gcfF\q P@t'D6uae4.u0s\=+:}OB ܯa%N)+ј>'28<3bx7dK1\ G4D̻!jԏ X˧[c _mnasʶ'>-s$(@aj;ScO?=Jvt_er%6_CV}q_ͷIkI"R (_sdTI 5uNH\!Fl ͭ3<ϡ`6?<<\.[ g}7ap0pžgRWz}CIaKNlF~SU5SVp$z% ǝ&BHrw#^UHyx5q+8iX ݫ8ޙ+ZunwRCeTY?zs^-W_wO&v+j; c S1)&Mơ ZCuwJuvj,nyu Qr1n0&oޅ þ)&%q}m?]>jD E3ƔȦa %,僇piZk@đ^"DBZ"0\!t)1퀑5iBtrXa:'m̹:Lj̞ 1X{d]r/FDXT'R`{?V?Z#!?7#fe9T (,gTF!b?,)>ΖN:1ޅQ&^ XK :ƘD2#8ur;_aF.,TihU &$HIt2[03K kZonbWpHWjx 0Srvm,cLJ!BD0#+3F^W6WWFٷH0#gծ;a&}s[PchoQC I1PC9&TN@S=! a@H6Q}k?1zn\e4uxN &N!&M͓ǕK͑)u dffp<*sL}snT/˶Ƙz#F4?]IM;qN!p= dKKTkT l#VXx 6Tf7QCTUՌ3\-qS#0=ϡ@8UHo{o9E~ h7m2"L.mN8=z&tН%,yŸ/7@n9tTn: 1Cw1>pW%Oܷ 1[:bfI\L_ Ͻ c$YMNe cLͼ'9 )Ȕ(nj:PsQ#ZftCKqIV9TఔL$1_˭A*,\᚝Kk<3bdi܅Vwsܜ3 .sN p y 7B!tR(PKz2<{F a.[@?i_DX!^晇;c @Ҁ…1ָ1WɈL e0rsgj!sjϡbPXQ+$H('C1C2m3ita 35 MN*4il7*")[~Jwͪ'㿩ICn*L(}xze5u55S{};L(W/2"e5lsd"peNa8gip2Tt$\ $[߶&࠙tp1< 19`IF wy2KK 3N>76ZSfO´ SJJl`aKj7B0W/oGd>[/.*ף[*-Bm<\zc6:Uӥ$)Bv?r0" : 0"E09 X&Mw j[t)̥znÔa6 $ ֆurwc@ e O堙‰Ag0 xRI9@XM)6LWaOÓ2ú %3]!N0woE(m愅us\s:Ku $0;уMc"7'#0AiA9hSƘ1]>!ӑqQv㥡p_B`k>g75 6u]Q̤R.0)Sx:Հ)9s"S P -%E5 Xe/8}9%&2#Of6uw52/mu췋_ 4F9m?{c"Y N 8Sɰmt뤔;J۶irq==3 so[sU_LJYTUU۶zk>Q_oo-i800$==<<>>>\2W|ipUXѬ*&{y?6\.丝iq`2P -+ne+ 9`Fڸ#sK)ZK%M !27[Gp7U+ńoQ{oX_-r-y]1=H6+Po|9c><\6$)_aFҤ'z;KƥNd0/_bVcSxyfN`p?><>]GZqUUv?z}zw.]ʥm6*WUөf>0관 Ie wp7LN}> ݟkK+Wa9W#@j1?_˜܌ǟN `HwcYZO{O.fXMc.o|?a3٧w }^1%s+,qn!"њZz/P߇DXKcEWf{v10  U My ky~)}O굟 yٷSHЁDH1 v$tT_GpQ]dۥ ع?[#p!"LP xʺp=<ϏN1F`SM|YYZ;ncnz3`}\.cR879NaAdv5 =s{|ػ@vh$8o0RrD+f@šx%&8\/_t9ݴE+[ꚑ )];ܷϽv^o{ИΩT,5!xV_#wP+ ަ0\nKTAbS=oM$IY=l& "OB'"Ҷ:y1rs"lsۓ)ǏNz m[&Yk(pܚ&`xztsa088IEtM w⥇-(UcXzk/ -P^B|*V Rbjˑ&}wAqnuhQkV!i|WVtsz 0~0$r] ;o޷D61ǘ96E-Ϧ桚ZmjC V ] 3,3iIN|L$[`ۇZP yrk:l]*̼WKz^Ǻ \3wZKB1sO{ Lͻy)?S J/&nRއ ޷ZyܮOsT]6l C]4vGIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1598164213.0 guiqwt-4.0.1/guiqwt/tests/test2.u8.png0000666000000000000000000006266300000000000014530 0ustar00PNG  IHDRwXezIDATxI$ɖ%ɤh={?bg̪,v5 0ܑ*U \֦k ` عa@ffUcL>٨$31G{{xTxg"ȵ+W\9xUWWwt=%3T'ppΎHȈɫ댜JJ1[SN" o .dU<0k4YtgX ~nvF sD9Po %iH;_ro-_~W}߃w>+q;wAhr- )eIPڳu0LJ.&j9l{Οww<xW+;YFCWg =<.Ɲ FQ &پg߿+n_/(vr;ǂ[wb$x4U+5rLU4{_gx8eO/i38Rx3;Ԕք33;;xjx>x'>`>':2 GM3J.$ЋYI% ,,wx Z}ty!&VelP}8X`oU1ݤ7 ?e]mfe*vH|4\EZʖMZڟ%1,ςٳeZ5VЇޚpMvLn Lnj3 ^Zc+} Z/3΂QB:iM'ykYqsO3Yjr !Lǔk XA}{ߝs6s _eNǖ1>fI^y>9x-L `FnoVUݠcLYڗU0eL64gAl끇ӳ2Y^$Q`6]i|+t͗$W.7j٬ י[I) 5BODY⧄R!#0v~ bw5v 1R\M[- eOֶig7S[U0ML m{HΞ< d츇'oF:/N%&aw؇|n @ŽIx\:{-YZDEiznJ5} 2\]~&/L^Ȥši'틏3]U0],U^YpovÈ]՗EeΘ*admvr.VFDG}蝗#Wy *1 7FK:] 26 REfdlWBv=8ۓ$'+h듘UUٱ+O!ܟ,?rzwomΗD 7NYL_zu}N] i6-srddD[mtkJJ{w븸wZc؍"A HR8 0vbNAZ>I7 X_gޏD@XiM ͊ZH4=#޻tBd1 ",ךw Iq;w"2zvA& CmrڥTNeDCmST [6JVaH(LBTKͭ: 6+9ΓP.k^=dLn  zzY);Ut,ֵ B;XI`[#Qj$f',([U~u_`)Ex7μKó̦BZ4God;Ug[W pc֊b4u.*:1,Jً[G6Нӵ DyCY d۟mvƐrPg3Gs.hOnG.1hg/Rv5lKٖ !UcL0m=>a->o_583kj+pBL=ܺμSb(٧=ܖz#2+jNNƌ%̰Y04U!LOKj.JZSI^3JX߄= >uy?7#__{XTպtV=!h!VC+f6mA2pIi(IPwڶTQ:7삀͝BJ \xuM['7G?{^0A%ϰ8pUsV{[ي |,RJ#j[˳6ԡEѨ7]" :μ-B~%Dv:-ak `0$s0,xܴw2YSu#W ٦2G$YH>ts3< ;n69{ؼJsm~4+aҶHGd C6q#ks6$2蕉0ccQ6؏@Tō ˍu>$0o}]JY [65nm!aZHWmi] ndx|mvYiS"S%.༞,m WK lR-Mq9zo_Dle=zUXh`4`8צ W_uij?S6Vco0FZJ8w5F c3u I+k z~BON̲ƆYC˥iRCc1[j4n/}YM$t/{*?1ڞ B&}\ O͌+Իμ/&'ioYty)7v$ˬjm!:&kښq }_ J*XV 50(J۾E/ZQ\ Z?3?7!*ra:rMFɊۺj(1VcL5YQ&ap3!{6ؒlZov=o=q:NW'? ҬULB X@.o ~d9&"QYw:;b_-flmk,8Hjmlxp =k}狳>8;z+wЦ|GSc[gtahDQ<#CÌf+Uby'Q֜!`VWKb?7`jyU'ˢycCfv{~|yǺWcKX0帪Ԑ݆0# FUZw&KQnJ1cŃ {)wV.eGW,31'(7kB~f[w681@t)nVBNqQa ˮ.|>jbJaCi@K|K.4liG#@η)GRk=Tʵr((}|!pَBt'E|* 4ypS=>ջ^AU.6m+?YpєMAX9.Pd h_޵w mE֡3(FHj4وb9;{p6^v]jĥU?:X L of֕۫'Vf%hkajQ +/'cShe7:*iܼ~ 6sm(hQua҆KطV%^LܺKu54P\ =r$i_嚇TN=ҋbҥ5Vp%Mb4PurֳMY5 =E4uU;ur0T+3Pv0Rw;LVbnS V,b%c^}J_*kD 1K+TGFDc,.n.ݮ-p3d s$9&mzm Y))],^ Et'E3#=q7aUEZr%/?}bs9^ŦcpT?V~\z5;QH&u$wיw`58r`kwvCWy6 mKbyBZ냐57bwNVtYg6bKů}e>1ftf]Y*}S^ʡsc5̚bul~yX[&M.kjҢ/Y4=x\otg)3Z4 hC L{k=\^bIPFYQTW n{Y5et:A֒wk$;趣琑ѽdu \-zfsyham{Xtr< Tqel__Y(|Y { M]aDu;%(}TVGzbqpkQ5iE+A"1M:+O.}]#JǃiUx\ZSOw5ePA뇏N[ bSzwKA8 >]1fVhT-CW(׶νppך8< gX.sw(ד!yjѮ6;ȯ((e/vTnQ8F0Amr7rD4:"wY.Uz5?9ۂm7_n Szo$י[F,iR%QK;Oo*̴IId\?Ѕ׷wNtChEZW"ەr:nVPE%>˜&N`jѕ3W d㹎mMfـs1rXJo6 YrVTF+*ڑ_xUuB "[&=/&!X C`2ixti.N4]jۆu$a'7LQSv5UCK)k.LD!mcTN4?h(Rx4<-6`k]dT"wxN+TC次+lWW>qHھwPl?,F ) )wOja[NtV*E >?y.}@,= zΦ2b[㲕th W&#/mc솳-PnücɢaTCzwg:j M5*"?G5?8q/^67!yQEǗ<`z·u4شV"g=[QteSiʙz_D|a?yPK.CsxwT-%9K>_;[2pB!AznGhwe4-f ;a0 -Vē1ܜwBaIl_WR:G4wgv'YW_86lЛ Y%Z)+kƀP1 ޝ[*  56wc4u,#ךwzu<+n+sn<$!7K0WFV(P\~+M 2KEVaQz싺p,Ys}@rs^'' Wk]snβLJQ$S-LPS"th(Ee sf؊s Mu)Cj6xckoШ  .qP` Aa~9YƾsT@J~y]y-h<+v9Srm\ivz"-wUZaEo"1o:Iӳ]p:FI>zm'QLA D=2#Q@a%X骋yz;+rŢvYTql?kkB5䥹?hO4+Gasqؚ 骂*,MZ@uJs5Nf 6=0q#ڤ+raΎ&\"rbOh'[~8 2nVkEaܕx4]`H<#{_ k?p5($],㴉-gǷͅ [j`h,.'B-ZKi[ۻ׳8EZF_,cS~?#˙]Vיw/5 c*FdTc%HUځꮻPjybWl<䴱,U<3J2D"c wYeqO|ٽMdz\n^Ka ._ٴl[ML}B;hBf׳PM Cl6{}pMЖJݵlttm=߱2} 9bpcŅdŎjfI9Wiqwe;ګ7Wӎ3A7Yd|?U\'pry1|deHݿS]S44F^ #g&]D[ }]k !iUt2UDr"!77Oʋǰaȶj/sqcL W/NߟF{yc*DLK^`!˔U3AәUTn~y<'=+5!jړ6IGL>(PC5h,q7>֠.[cܞL5fN|}6D@"MY2 }L#G $HL-’ xh}~>-̆Yן_w}n;޻w{ox/ܿxw{]/UaH>2eӹB}BaD~Un`I{@1?_ B@C?k_{OAx ;}^={k ޽]x/4y#;䋢֝O\P37 -  trje9۟2t|͈*#߼:{ijA%AJ|܈Q"6$,W/~F⳩B?J⽿|-YwO. ge_~z}|^ԛܹWM6g^r=Z)Հ=gi Յ_b&/_/wW?Z.xɬطtV6֎M ^Ev`T鸖^9_12nŧF _{$IxgƒQ*;^T혢4 s0b !j䟾#"SK5:di6G}Xiڴ0lҵ 7݃{ۑo.\?}z`rBKv]֓n7+OWNZURDM1֫XeX fkUFOS/4^}~?;i(*t A3p`ˊFchǘ7 s͆<ۮo=D@q_ x:eE],?dA]m̨_J"jVз YD9N3 R: '̚V.΃QuIS gz RSnv y'wrfO$뚱0_TYHB:[yO k"3l.mr .fp{MF5.%LIrVx~odmo8"1&傆Fcz1y_-^}1yIB!ҧk) NʆjH3ȓAR8 ;M?uٮy$cP]HV;%FM3Nm)eӁ?+c#16Aı^hA%]sꑀQM0TwP\YIt!2Ft:eG{YI`soY}CVeR]wxM\ wWI*pr:b4'Q@Ug he!x< #xx3ԭsp`>Mm&cm iQ61,tܲ3zQ(|]?O}"e_|Zټ>O ޶a0OoJ y}quvpwKG]¬eI7RXDލКot/44jगӘA_*SCc;ly2\W<8lVRv53Uz79AOm/zG2. !-Fb;'Y,V-my@ U}wOg|3Lg!&_*cY7F9Etmt-NsE,=6xcXU)1~t[т+v?y{x运ԯOW9y:P/mw,v(Y ZǽH./6fjOʊvA@(hͫK:f!P3–NE=@2;#́Ӌ/Z$gЮ}Ukd凮 h@Y7V[fQ@ /_MĞuQ3û;!> BƁS|~\&B&Ȟ+QeuxA'2f1 0(\Ա0gV+Jl*AV7aU ,2obk艒Y=ʊL64 ˉO6Lz=Ⴣ[zKAizPJگPxn>݌?oyOי9p`Mby]p2-'`[lӽU];ĝGj*0_ԧp[bNhul{cEEWۃ7$xe/yCԃ⳦˯dKoۛ+=.44+)W$S1,U9Ft;|# mc^0F"g!,V]%]OB 0k[.1;zX~φۗe^64չO?y]cԐ,[hx̫,  E{2?䡿u>lc)=Ŧ-ۘ[T ZrU66!r586y;q7~/o'/)ǫSy!^7с],*Rw_ Zxk4]?aQn,GVkEvH% P$ :'UۊQmQ#m.g+dޟEA|;`jnөi_5aoD0 mbAǑz7=sO6Dq;s˒=ٲ cYQ ^ul:Ix4>n%7}1Vyv+hmP nЬ^Շ^47e}@F#jc_^Oa+˖MK91KGrS͟෵nW )?&q4~=bu:p,v{N~W:ڝ>W$ߎEF]Xr;MH$c^-x0o ln{{oZWSV}9tK?u Ȉl΀[qWV`Z+D~pVC]^;̷RUdhCgVVma `3?ϫ^?( ~jOAJl*uvkE'Y/QoGx6vےR(C 1 ča_8%rY|9/-7vRI*yC6`|Rû?/|<+ |y{ uÅ2O)*Y,z檦`~do> -\) G-.A"řvyw=:s ݣFӴ;iQ݈2_{̘v#~yLVV /&7¬Mep8EU@ߍraa5=U $Bh~[阝o[:׸jWF^z]=b2x~1_9~Fnc!Q06tN/R;$oZ% :8 -J X2`oĠ6BOxn>ڞ'h=|?7;|jwϺ#m9E XYvFn]]k"L0B4oLsHhnJQ$^m*BkӃŕ)W8H#g;ƫ?)Z v<gH&L`lfS"͜Aqj44@8; `$s+&`˱J2~ݹ A'8^ :FU<kV#)VJ;A<*e\ peHfeQ24i- "0P2%t߈:'E^ͤx1ޟ'Vv_YЗjVM}R#k!1G#~=bN͉^T]wnˁa,u V%Ӈ&*+%ΑQx5x!;/O+$}L5jr'ȐH/z/?L:v7V-`÷,6͡j!tWAa]2e8 2͠SaeJYl054xgǗ@~=tm>4H{o]^>,'-71?˽\c=<G^V Al[VYP*+,v kycuZz{?(a+?aYa}t[;t7>.#u+5g/i XgkJ@lJBV!$BfEwI[E^^oexF E6ڄҒr`a/+veam}R" a",ϳGd0|k5'PuHqa҈BE|.!& 4fLZg(9j~a*ҝa!4mYa6 E-R4 >BKo 7-p@m6ٳ68CBJC .7xUۭ:[9M;o\swFF\sˡӡ,WF"&TlwжDk),@NmںJI):cDFByat=!֏91y{<_y>M_~+3;e* 6eS)=RaǴ̈y@,,{|yEz7 Q]?*swWdx`}yi7-}j}H0Tкa3 @+A`"P]^6t=]CSn< 0kX-k7x'a{aeHWֱ?ڞ_/v.!xlu= !=7 ( c8UU_8$-]lȋ4l sU'zJѣq;'oKЅ# i?^?gHܗS#_5|[ FG4}ZEA讴݈̪rWSi&SEY*kMۍ޳Mjk""34i^F9 Ca nNYݖx@J|Ꮩ Kq 4X&Ӄ?v3JBXdzyl9Ki&l`OYUblBĹڱ l)2Ӝ ޴|8N!.1W2G!/#B oci8idɍ^]<}!PNh* zK[5lBAgNY7PMW(/Ɯxڑaϟ|#2_ zON[aֽ+lHde!'@niW2 4[ma^ƨOP"`/c;;,헚k/E%i yi1 ^yNMndc s8DrJH'MZ(\",Ched;H-E9Xˍ+`vlC 2jol.8a 4 +5/ra:'U4LP ku܊{nh7\cSGjHMLUY9뽰nżW`ᛓ⥂,M;6LcgV_|Qo wdg9kW _A8|Лa1( etu"%هBe4LhGf=W7-P+BM_$?k>3ho;?w_z4jGC7 ]\V@2#hW޾7DEfKp 6AlTf%FŦmp'C[7Gy=ç_?eo76,- LQ GFQC'z.G{V;JBx. %ucĐv56}n7]3Ex`d/챝_aߟ$]䒇5mmDX h_0tS1c0)JwZvLz5zUݦĺBU&w]kbgU;>!x sVD)p"pf<,:2]. 7 $ ^1eH:Su04L_6x]AKk9ƜmZDx$}]ʒiREPݥJ=7hG%K9ץEXv!D+uōHe=|fسO`e񼿑J:k{8نDO"^uq>GvWmt<u]2!0ݏQrӰ'n>V5$ºl`)/ٿjszg16(G'/go ! V,uu6v79ұ 53xkځ^7NO-HU WzO؟py6w!NTNM % nGQd8A}v:T 0v3Ykf E~w7"ņ')HûlD};?]M'i _Z~1ٮUuhn0R *DZAJC(.y@}C0 :,Ҭ;!m~k>d H ˁO3FyŸuѢ5$p #kX1e$2wv6O 6M7n"f̩z{G:ASf\]FǀY4q]F<[/k_Ǝ(yv@N򋓑HSNDvfh^-.ڎUpVru~+H_ǎ?5x%EmYـ_A,cb2'8)\$BR }9 eNNy0OIroysIΚj+ %ѶT(0;]/_/74묥% K8,Խ6➲vӽǫ tsȋ}^S3l@HiLX- ~~ZQ,2/[eGznfu,,SV`\)V؛X'M?o.@7ghn~p$ O4:Ym̽?嫴 HxڄHrdr[xY^s sϕ-oo(@2Yжai-OZ0"(bps#u ]]n:s,1Q?g}j~%w;!`[1Zix{KLmW7ͩ64Ƈڕk7¡q_ìw:M4'2ٞE j_}.=>46Ϙߺ1@TD+RBY=R3](]ejmFWDVC1l*.Lեa$**SR:LMIF՛#W <_pqZԖ8Nf6d jucWh%^u>P؉#G :b fll"=)}䵹r~ ƕ/ǘp+]K3놿uۊ3'~\ f5 g@pI¬2mwGf-'[;z[{đeLOG+0yo>@[KrwQۃͺы2~5X8FPb0WS?܏U"QL4kN5p 4$lmKVxU͡[nzlzxFe 4M%ZltLRҴ2L~>,)(Ǐ|'/ަρgA䧧'"r@cRp ɒtV "niu#D enӌzx{nUtJ<<</40<9 wK30ퟁ-vKW=.Nfdl4~94UR8(RCŌhT D3Y9F;dsF &mm+8p..&SZڋ{NEvk~lR ?p?o0`B,@MYԳXPMĜ4>o7LnZ p @WeL!mׁ^iEenpf&ckLG~%PISۧxB܍Uu>_ݰGd7fw]ݶI"{d ⑛1c!h]L:^P;l(yw퇿ճ،! t?]F7 ;BWyύc-E5K5nd1lfAwAMXcZGF((9 Ϊv9+8Yʺby*>&f&O:zl5 >dOk4鏫?;ʴGu><w<Ӝ)cXKYe-EsL, 06nw8Ǹw<8#bR>[b/ lbk{NMѯMVVԔ#;"$nXFBOb^#\ %v!Y^:F~D?};4_,lzA?mo CyE7Glr WȨm;"Z ְ x*>#W ۠ ?2n%o m:E3!T҈h|+ȋP5@|ȧyP?7/6|fm@Pꏦqo5M%z8%0h4^7Dpm~~z-\ Db)vzRc .YHzOj髙gx9uӫxQ1}qppO2EmĒ2 CcfB=3=p !2 j6*)–b2Th8Fe=MO*;C .V^WT1l?l^4~B&cfV2cOo0ܶ`]H֦X1bp훅ahҤ|1_-^pM|wk;}Tܱ9, ѕdcoBd n{ߘ81XقZiWΩdx,pT\z“޿sMxyO1 ~~k]f ehm N`KP^81rݩN`Uu Jͨ]CHk$n !;v.o)ޜ }q?;l]U=0xQ1omP5_ hYBS Z/!`"W&dpm7‹O$a.K;.=@@̶µtQ(벟EFNJ"VЏݯ>+/<%!l{&Nz[hQ2iavy -e7z0<QYc˘g( }hŢj؅fl4l`ǎ=QfE6OH}/jz}1%ynh mnlP;`}ptꮹX= ]1`|~1^S5 y6YUlMy74x???ow8t/d{9 ||Yg\reN,eGzITovWu&sZ)d106mɊkUb? <\iYѸZC|=3Ʉ@?*K ؜vU@ 5`ySuAm|x}sxt/n-^J5;``VvtpbP*h={ZH~%櫲i?9@r/~"ϫzZ?6NZ? 2Pi~+OYHA{Q2tYI jJpTj}޹ e imax[i]: print(".", end=" ") else: print("*", end=" ") print() def test_line(x0, y0, x1, y1): print(x0, ",", y0, "->", x1, ",", y1) imin[:] = N imax[:] = 0 line(x0, y0, x1, y1, N, imin, imax) print_tri(imin, imax) if __name__ == "__main__": test_line(0, 0, 9, 9) test_line(9, 9, 0, 0) test_line(0, 5, 0, 9) test_line(2, 5, 7, 5) test_line(0, 1, 2, 9) def test_tri(x0, y0, x1, y1, x2, y2): print(x0, ",", y0, "->", x1, ",", y1) imin[:] = N + 1 imax[:] = -1 line(x0, y0, x1, y1, N, imin, imax) line(x0, y0, x2, y2, N, imin, imax) line(x1, y1, x2, y2, N, imin, imax) print_tri(imin, imax) if __name__ == "__main__": test_tri(0, 1, 2, 9, 8, 7) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640625030.0 guiqwt-4.0.1/guiqwt/tests/transform.py0000666000000000000000000001241400000000000015000 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Tests around image transforms: rotation, translation, ...""" SHOW = True # Show test in GUI-based test launcher import os from qtpy.QtCore import QRectF from qtpy.QtGui import QImage from qtpy import API print("Qt API: " + API) import os import numpy as np from guiqwt.image import assemble_imageitems from guiqwt.plot import ImageDialog from guiqwt.builder import make from guiqwt import io DEFAULT_CHARS = "".join([chr(c) for c in range(32, 256)]) def get_font_array(sz, chars=DEFAULT_CHARS): from qtpy.QtGui import QFont, QPainter, QColor font = QFont() font.setFixedPitch(True) font.setPixelSize(int(sz)) font.setStyleStrategy(QFont.NoAntialias) dummy = QImage(10, 10, QImage.Format_ARGB32) pnt = QPainter(dummy) pnt.setFont(font) metric = pnt.fontMetrics() rct = metric.boundingRect(chars) pnt.end() h = rct.height() w = rct.width() img = QImage(w, h, QImage.Format_ARGB32) paint = QPainter() paint.begin(img) paint.setFont(font) paint.setBrush(QColor(255, 255, 255)) paint.setPen(QColor(255, 255, 255)) paint.drawRect(0, 0, w + 1, h + 1) paint.setPen(QColor(0, 0, 0)) paint.setBrush(QColor(0, 0, 0)) paint.drawText(0, paint.fontMetrics().ascent(), chars) paint.end() try: if API.startswith("pyside"): # PySide data = bytes(img.bits()) else: # PyQt5 data = img.bits().asstring(img.byteCount()) except SystemError: # PyQt5 (5.3.2) on Python 3 return npy = np.frombuffer(data, np.uint8) npy.shape = img.height(), int(img.bytesPerLine() / 4), 4 return npy[:, :, 0] def txtwrite(data, x, y, sz, txt, range=None): arr = get_font_array(sz, txt) if arr is None: return if range is None: m, M = data.min(), data.max() else: m, M = range z = (float(M) - float(m)) * np.array(arr, float) / 255.0 + m arr = np.array(z, data.dtype) dy, dx = arr.shape data[y : y + dy, x : x + dx] = arr def imshow(items, title=""): gridparam = make.gridparam( background="black", minor_enabled=(False, False), major_style=(".", "gray", 1) ) win = ImageDialog( edit=False, toolbar=True, wintitle=title, options=dict(gridparam=gridparam) ) nc = int(np.sqrt(len(items)) + 1.0) maxy = 0 y = 0 x = 0 w = None plot = win.get_plot() print("-" * 80) for i, item in enumerate(items): h = item.boundingRect().height() if i % nc == 0: x = 0 y += maxy maxy = h else: x += w maxy = max(maxy, h) w = item.boundingRect().width() item.set_transform(x, y, 0.0) print("Adding item #%d..." % i, end=" ") plot.add_item(item) print("Done") win.show() win.exec_() def compute_image(NX, NY): BX, BY = 40, 40 img = np.random.normal(0, 100, size=(BX, BY)) timg = np.fft.fftshift(np.fft.fft2(img)) print(timg.shape) cx = NX / 2 cy = NY / 2 bx2 = BX / 2 by2 = BY / 2 z = np.zeros((NX, NY), np.complex64) z[int(cx - bx2) : int(cx - bx2 + BX), int(cy - by2) : int(cy - by2 + BY)] = timg z = np.fft.ifftshift(z) rev = np.fft.ifft2(z) return np.abs(rev) def get_bbox(items): r = QRectF() for it in items: r = r.united(it.boundingRect()) return r def save_image(name, data): for fname in (name + ".u16.tif", name + ".u8.png"): if os.path.exists(fname): os.remove(fname) print( "Saving image: %d x %d (%d KB):" % (data.shape[0], data.shape[1], data.nbytes / 1024.0) ) print(" --> uint16") io.imwrite(name + ".u16.tif", data, dtype=np.uint16, max_range=True) print(" --> uint8") io.imwrite(name + ".u8.png", data, dtype=np.uint8, max_range=True) def build_image(items): r = get_bbox(items) x, y, w, h = r.getRect() print("-" * 80) print("Assemble test1:", w, "x", h) dest = assemble_imageitems(items, r, w, h) save_image("test1", dest) print("-" * 80) print("Assemble test2:", w / 4, "x", h / 4) dest = assemble_imageitems(items, r, w / 4, h / 4) save_image("test2", dest) print("-" * 80) def test(): """Test""" N = 500 data = compute_image(N, N) m = data.min() M = data.max() items = [make.trimage(data, alpha_mask=True, colormap="jet")] for type in (np.uint8, np.uint16, np.int8, np.int16): info = np.iinfo(type().dtype) s = float((info.max - info.min)) a1 = s * (data - m) / (M - m) img = np.array(a1 + info.min, type) txtwrite(img, 0, 0, N / 15.0, str(type)) items.append(make.trimage(img, colormap="jet")) imshow(items, title="Transform test (%dx%d images)" % (N, N)) return items if __name__ == "__main__": # -- Create QApplication import guidata _app = guidata.qapplication() # -- items = test() build_image(items) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640624420.0 guiqwt-4.0.1/guiqwt/tools.py0000666000000000000000000025312400000000000012770 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.tools ------------ The `tools` module provides a collection of `plot tools` : * :py:class:`guiqwt.tools.RectZoomTool` * :py:class:`guiqwt.tools.SelectTool` * :py:class:`guiqwt.tools.SelectPointTool` * :py:class:`guiqwt.tools.MultiLineTool` * :py:class:`guiqwt.tools.FreeFormTool` * :py:class:`guiqwt.tools.LabelTool` * :py:class:`guiqwt.tools.RectangleTool` * :py:class:`guiqwt.tools.PointTool` * :py:class:`guiqwt.tools.SegmentTool` * :py:class:`guiqwt.tools.CircleTool` * :py:class:`guiqwt.tools.EllipseTool` * :py:class:`guiqwt.tools.PlaceAxesTool` * :py:class:`guiqwt.tools.AnnotatedRectangleTool` * :py:class:`guiqwt.tools.AnnotatedCircleTool` * :py:class:`guiqwt.tools.AnnotatedEllipseTool` * :py:class:`guiqwt.tools.AnnotatedPointTool` * :py:class:`guiqwt.tools.AnnotatedSegmentTool` * :py:class:`guiqwt.tools.HRangeTool` * :py:class:`guiqwt.tools.DummySeparatorTool` * :py:class:`guiqwt.tools.AntiAliasingTool` * :py:class:`guiqwt.tools.DisplayCoordsTool` * :py:class:`guiqwt.tools.ReverseYAxisTool` * :py:class:`guiqwt.tools.AspectRatioTool` * :py:class:`guiqwt.tools.PanelTool` * :py:class:`guiqwt.tools.ItemListPanelTool` * :py:class:`guiqwt.tools.ContrastPanelTool` * :py:class:`guiqwt.tools.ColormapTool` * :py:class:`guiqwt.tools.XCSPanelTool` * :py:class:`guiqwt.tools.YCSPanelTool` * :py:class:`guiqwt.tools.CrossSectionTool` * :py:class:`guiqwt.tools.AverageCrossSectionTool` * :py:class:`guiqwt.tools.SaveAsTool` * :py:class:`guiqwt.tools.CopyToClipboardTool` * :py:class:`guiqwt.tools.OpenFileTool` * :py:class:`guiqwt.tools.OpenImageTool` * :py:class:`guiqwt.tools.SnapshotTool` * :py:class:`guiqwt.tools.PrintTool` * :py:class:`guiqwt.tools.SaveItemsTool` * :py:class:`guiqwt.tools.LoadItemsTool` * :py:class:`guiqwt.tools.AxisScaleTool` * :py:class:`guiqwt.tools.HelpTool` * :py:class:`guiqwt.tools.ExportItemDataTool` * :py:class:`guiqwt.tools.EditItemDataTool` * :py:class:`guiqwt.tools.ItemCenterTool` * :py:class:`guiqwt.tools.DeleteItemTool` A `plot tool` is an object providing various features to a plotting widget (:py:class:`guiqwt.curve.CurvePlot` or :py:class:`guiqwt.image.ImagePlot`): buttons, menus, selection tools, image I/O tools, etc. To make it work, a tool has to be registered to the plotting widget's manager, i.e. an instance of the :py:class:`guiqwt.plot.PlotManager` class (see the :py:mod:`guiqwt.plot` module for more details on the procedure). The `CurvePlot` and `ImagePlot` widgets do not provide any `PlotManager`: the manager has to be created separately. On the contrary, the ready-to-use widgets :py:class:`guiqwt.plot.CurveWidget` and :py:class:`guiqwt.plot.ImageWidget` are higher-level plotting widgets with integrated manager, tools and panels. .. seealso:: Module :py:mod:`guiqwt.plot` Module providing ready-to-use curve and image plotting widgets and dialog boxes Module :py:mod:`guiqwt.curve` Module providing curve-related plot items and plotting widgets Module :py:mod:`guiqwt.image` Module providing image-related plot items and plotting widgets Example ~~~~~~~ The following example add all the existing tools to an `ImageWidget` object for testing purpose: .. literalinclude:: /../guiqwt/tests/image_plot_tools.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: /images/screenshots/image_plot_tools.png Reference ~~~~~~~~~ .. autoclass:: RectZoomTool :members: :inherited-members: .. autoclass:: SelectTool :members: :inherited-members: .. autoclass:: SelectPointTool :members: :inherited-members: .. autoclass:: MultiLineTool :members: :inherited-members: .. autoclass:: FreeFormTool :members: :inherited-members: .. autoclass:: LabelTool :members: :inherited-members: .. autoclass:: RectangleTool :members: :inherited-members: .. autoclass:: PointTool :members: :inherited-members: .. autoclass:: SegmentTool :members: :inherited-members: .. autoclass:: CircleTool :members: :inherited-members: .. autoclass:: EllipseTool :members: :inherited-members: .. autoclass:: PlaceAxesTool :members: :inherited-members: .. autoclass:: AnnotatedRectangleTool :members: :inherited-members: .. autoclass:: AnnotatedCircleTool :members: :inherited-members: .. autoclass:: AnnotatedEllipseTool :members: :inherited-members: .. autoclass:: AnnotatedPointTool :members: :inherited-members: .. autoclass:: AnnotatedSegmentTool :members: :inherited-members: .. autoclass:: HRangeTool :members: :inherited-members: .. autoclass:: DummySeparatorTool :members: :inherited-members: .. autoclass:: AntiAliasingTool :members: :inherited-members: .. autoclass:: DisplayCoordsTool :members: :inherited-members: .. autoclass:: ReverseYAxisTool :members: :inherited-members: .. autoclass:: AspectRatioTool :members: :inherited-members: .. autoclass:: PanelTool :members: :inherited-members: .. autoclass:: ItemListPanelTool :members: :inherited-members: .. autoclass:: ContrastPanelTool :members: :inherited-members: .. autoclass:: ColormapTool :members: :inherited-members: .. autoclass:: XCSPanelTool :members: :inherited-members: .. autoclass:: YCSPanelTool :members: :inherited-members: .. autoclass:: CrossSectionTool :members: :inherited-members: .. autoclass:: AverageCrossSectionTool :members: :inherited-members: .. autoclass:: SaveAsTool :members: :inherited-members: .. autoclass:: CopyToClipboardTool :members: :inherited-members: .. autoclass:: OpenFileTool :members: :inherited-members: .. autoclass:: OpenImageTool :members: :inherited-members: .. autoclass:: SnapshotTool :members: :inherited-members: .. autoclass:: PrintTool :members: :inherited-members: .. autoclass:: SaveItemsTool :members: :inherited-members: .. autoclass:: LoadItemsTool :members: :inherited-members: .. autoclass:: AxisScaleTool :members: :inherited-members: .. autoclass:: HelpTool :members: :inherited-members: .. autoclass:: ExportItemDataTool :members: :inherited-members: .. autoclass:: EditItemDataTool :members: :inherited-members: .. autoclass:: ItemCenterTool :members: :inherited-members: .. autoclass:: DeleteItemTool :members: :inherited-members: """ # TODO: z(long-terme) à partir d'une sélection rectangulaire sur une image # afficher un ArrayEditor montrant les valeurs de la zone sélectionnée import sys import numpy as np import weakref import os.path as osp from qtpy.QtCore import Qt, QObject, QPointF, Signal from qtpy.QtGui import QKeySequence from qtpy.QtPrintSupport import QPrinter, QPrintDialog from qtpy.QtWidgets import ( QMenu, QActionGroup, QMessageBox, QAction, QToolButton, ) from qtpy.compat import getsavefilename, getopenfilename from guidata.qthelpers import get_std_icon, add_actions, add_separator from guidata.widgets.objecteditor import oedit from guidata.configtools import get_icon from guidata.dataset.datatypes import DataSet from guidata.dataset.dataitems import BoolItem, FloatItem # Local imports from guiqwt.config import _ from guiqwt.events import ( setup_standard_tool_filter, ObjectHandler, KeyEventMatch, StandardKeyMatch, QtDragHandler, ZoomRectHandler, RectangularSelectionHandler, ClickHandler, ) from guiqwt.shapes import ( Axes, RectangleShape, Marker, PolygonShape, EllipseShape, SegmentShape, PointShape, ObliqueRectangleShape, ) from guiqwt.annotations import ( AnnotatedRectangle, AnnotatedCircle, AnnotatedEllipse, AnnotatedSegment, AnnotatedPoint, AnnotatedObliqueRectangle, ) from guiqwt.colormap import get_colormap_list, build_icon_from_cmap_name from guiqwt.interfaces import ( IColormapImageItemType, IPlotManager, IVoiImageItemType, IStatsImageItemType, ICurveItemType, ) from guiqwt.panels import ID_XCS, ID_YCS, ID_OCS, ID_ITEMLIST, ID_CONTRAST from guiqwt.interfaces import IImageItemType class DefaultToolbarID: pass class GuiTool(QObject): """Base class for interactive tool applying on a plot""" def __init__(self, manager, toolbar_id=DefaultToolbarID): """Constructor""" super(GuiTool, self).__init__() assert IPlotManager in manager.__implements__ self.manager = manager self.parent_tool = None self.plots = set() self.action = self.create_action(manager) self.menu = self.create_action_menu(manager) if toolbar_id is DefaultToolbarID: toolbar = manager.get_default_toolbar() else: toolbar = manager.get_toolbar(toolbar_id) if toolbar is not None: self.setup_toolbar(toolbar) def create_action(self, manager): """Create and return tool's action""" pass def setup_toolbar(self, toolbar): """Setup tool's toolbar""" toolbar.addAction(self.action) if self.menu is not None: widget = toolbar.widgetForAction(self.action) widget.setMenu(self.menu) widget.setPopupMode(QToolButton.InstantPopup) def create_action_menu(self, manager): """Create and return menu for the tool's action""" pass def set_parent_tool(self, tool): """Used to organize tools automatically in menu items""" self.parent_tool = tool def register_plot(self, baseplot): """Every BasePlot using this tool should call register_plot to notify the tool about this widget using it """ self.plots.add(baseplot) def get_active_plot(self): for plot in self.plots: canvas = plot.canvas() if canvas.hasFocus(): return plot if len(self.plots) == 1: return list(self.plots)[0] return None def update_status(self, plot): """called by to allow derived classes to update the states of actions based on the currently active BasePlot can also be called after an action modifying the BasePlot (e.g. in order to update action states when an item is deselected) """ pass def setup_context_menu(self, menu, plot): """If the tool supports it, this method should install an action in the context menu""" pass class InteractiveTool(GuiTool): """Interactive tool base class""" TITLE = None ICON = None TIP = None CURSOR = Qt.CrossCursor SWITCH_TO_DEFAULT_TOOL = False # switch to default tool when finished #: Signal emitted by InteractiveTool when validating tool action SIG_VALIDATE_TOOL = Signal(object) #: Signal emitted by InteractiveTool when tool job is finished SIG_TOOL_JOB_FINISHED = Signal() def __init__( self, manager, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, switch_to_default_tool=None, ): if title is not None: self.TITLE = title if icon is not None: self.ICON = icon if tip is not None: self.TIP = tip super(InteractiveTool, self).__init__(manager, toolbar_id) # Starting state for every plotwidget we can act upon self.start_state = {} if switch_to_default_tool is None: switch_to_default_tool = self.SWITCH_TO_DEFAULT_TOOL if switch_to_default_tool: self.SIG_TOOL_JOB_FINISHED.connect(self.manager.activate_default_tool) def create_action(self, manager): """Create and return tool's action""" action = manager.create_action( self.TITLE, icon=get_icon(self.ICON), tip=self.TIP, triggered=self.activate ) action.setCheckable(True) group = self.manager.get_tool_group("interactive") group.addAction(action) group.triggered.connect(self.interactive_triggered) return action def cursor(self): """Return tool mouse cursor""" return self.CURSOR def register_plot(self, baseplot): # TODO: with the introduction of PlotManager it should # be possible to remove the per tool dictionary start_state # since all plots from a manager share the same set of tools # the State Machine generated by the calls to tool.setup_filter # should be the same for all plots. Thus it should be done only once # and not once per plot managed by the plot manager super(InteractiveTool, self).register_plot(baseplot) filter = baseplot.filter start_state = self.setup_filter(baseplot) self.start_state[baseplot] = start_state curs = self.cursor() if curs is not None: filter.set_cursor(curs, start_state) def interactive_triggered(self, action): if action is self.action: self.activate() else: self.deactivate() def activate(self): """Activate tool""" for baseplot, start_state in list(self.start_state.items()): baseplot.filter.set_state(start_state, None) self.action.setChecked(True) self.manager.set_active_tool(self) def deactivate(self): """Deactivate tool""" self.action.setChecked(False) def validate(self, filter, event): self.SIG_VALIDATE_TOOL.emit(filter) self.SIG_TOOL_JOB_FINISHED.emit() class SelectTool(InteractiveTool): """ Graphical Object Selection Tool """ TITLE = _("Selection") ICON = "selection.png" CURSOR = Qt.ArrowCursor def setup_filter(self, baseplot): filter = baseplot.filter # Initialisation du filtre start_state = filter.new_state() # Bouton gauche : ObjectHandler(filter, Qt.LeftButton, start_state=start_state) ObjectHandler( filter, Qt.LeftButton, mods=Qt.ControlModifier, start_state=start_state, multiselection=True, ) filter.add_event( start_state, KeyEventMatch((Qt.Key_Enter, Qt.Key_Return, Qt.Key_Space)), self.validate, start_state, ) filter.add_event( start_state, StandardKeyMatch(QKeySequence.SelectAll), self.select_all_items, start_state, ) return setup_standard_tool_filter(filter, start_state) def select_all_items(self, filter, event): filter.plot.select_all() filter.plot.replot() class SelectPointTool(InteractiveTool): TITLE = _("Point selection") ICON = "point_selection.png" MARKER_STYLE_SECT = "plot" MARKER_STYLE_KEY = "marker/curve" CURSOR = Qt.PointingHandCursor def __init__( self, manager, mode="reuse", on_active_item=False, title=None, icon=None, tip=None, end_callback=None, toolbar_id=DefaultToolbarID, marker_style=None, switch_to_default_tool=None, ): super(SelectPointTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) assert mode in ("reuse", "create") self.mode = mode self.end_callback = end_callback self.marker = None self.last_pos = None self.on_active_item = on_active_item if marker_style is not None: self.marker_style_sect = marker_style[0] self.marker_style_key = marker_style[1] else: self.marker_style_sect = self.MARKER_STYLE_SECT self.marker_style_key = self.MARKER_STYLE_KEY def set_marker_style(self, marker): marker.set_style(self.marker_style_sect, self.marker_style_key) def setup_filter(self, baseplot): filter = baseplot.filter # Initialisation du filtre start_state = filter.new_state() # Bouton gauche : handler = QtDragHandler(filter, Qt.LeftButton, start_state=start_state) handler.SIG_START_TRACKING.connect(self.start) handler.SIG_MOVE.connect(self.move) handler.SIG_STOP_NOT_MOVING.connect(self.stop) handler.SIG_STOP_MOVING.connect(self.stop) return setup_standard_tool_filter(filter, start_state) def start(self, filter, event): if self.marker is None: title = "" if self.TITLE: title = "%s
" % self.TITLE if self.on_active_item: constraint_cb = filter.plot.on_active_curve label_cb = lambda x, y: title + filter.plot.get_coordinates_str(x, y) else: constraint_cb = None label_cb = lambda x, y: "%sx = %g
y = %g" % (title, x, y) self.marker = Marker(label_cb=label_cb, constraint_cb=constraint_cb) self.set_marker_style(self.marker) self.marker.attach(filter.plot) self.marker.setZ(filter.plot.get_max_z() + 1) self.marker.setVisible(True) def stop(self, filter, event): self.move(filter, event) if self.mode != "reuse": self.marker.detach() self.marker = None if self.end_callback: self.end_callback(self) def move(self, filter, event): if self.marker is None: return # something is wrong ... self.marker.move_local_point_to(0, event.pos()) filter.plot.replot() self.last_pos = self.marker.xValue(), self.marker.yValue() def get_coordinates(self): return self.last_pos SHAPE_Z_OFFSET = 1000 class MultiLineTool(InteractiveTool): TITLE = _("Polyline") ICON = "polyline.png" CURSOR = Qt.ArrowCursor def __init__( self, manager, handle_final_shape_cb=None, shape_style=None, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, switch_to_default_tool=None, ): super(MultiLineTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) self.handle_final_shape_cb = handle_final_shape_cb self.shape = None self.current_handle = None self.init_pos = None if shape_style is not None: self.shape_style_sect = shape_style[0] self.shape_style_key = shape_style[1] else: self.shape_style_sect = "plot" self.shape_style_key = "shape/drag" def reset(self): self.shape = None self.current_handle = None def create_shape(self, filter, pt): self.shape = PolygonShape(closed=False) filter.plot.add_item_with_z_offset(self.shape, SHAPE_Z_OFFSET) self.shape.setVisible(True) self.shape.set_style(self.shape_style_sect, self.shape_style_key) self.shape.add_local_point(pt) return self.shape.add_local_point(pt) def setup_filter(self, baseplot): filter = baseplot.filter # Initialisation du filtre start_state = filter.new_state() # Bouton gauche : handler = QtDragHandler(filter, Qt.LeftButton, start_state=start_state) filter.add_event( start_state, KeyEventMatch((Qt.Key_Enter, Qt.Key_Return, Qt.Key_Space)), self.validate, start_state, ) filter.add_event( start_state, KeyEventMatch( ( Qt.Key_Backspace, Qt.Key_Escape, ) ), self.cancel_point, start_state, ) handler.SIG_START_TRACKING.connect(self.mouse_press) handler.SIG_MOVE.connect(self.move) handler.SIG_STOP_NOT_MOVING.connect(self.mouse_release) handler.SIG_STOP_MOVING.connect(self.mouse_release) return setup_standard_tool_filter(filter, start_state) def validate(self, filter, event): super(MultiLineTool, self).validate(filter, event) if self.handle_final_shape_cb is not None: self.handle_final_shape_cb(self.shape) self.reset() def cancel_point(self, filter, event): if self.shape is None: return points = self.shape.get_points() if points is None: return elif len(points) <= 2: filter.plot.del_item(self.shape) self.reset() else: if self.current_handle: newh = self.shape.del_point(self.current_handle) else: newh = self.shape.del_point(-1) self.current_handle = newh filter.plot.replot() def mouse_press(self, filter, event): """We create a new shape if it's the first point otherwise we add a new point """ if self.shape is None: self.init_pos = event.pos() self.current_handle = self.create_shape(filter, event.pos()) filter.plot.replot() else: self.current_handle = self.shape.add_local_point(event.pos()) def move(self, filter, event): """moving while holding the button down lets the user position the last created point """ if self.shape is None or self.current_handle is None: # Error ?? return self.shape.move_local_point_to(self.current_handle, event.pos()) filter.plot.replot() def mouse_release(self, filter, event): """Releasing the mouse button validate the last point position""" if self.current_handle is None: return if self.init_pos is not None and self.init_pos == event.pos(): self.shape.del_point(-1) else: self.shape.move_local_point_to(self.current_handle, event.pos()) self.init_pos = None self.current_handle = None filter.plot.replot() class FreeFormTool(MultiLineTool): TITLE = _("Free form") ICON = "freeform.png" def cancel_point(self, filter, event): """Reimplement base class method""" super(FreeFormTool, self).cancel_point(filter, event) self.shape.closed = len(self.shape.points) > 2 def mouse_press(self, filter, event): """Reimplement base class method""" super(FreeFormTool, self).mouse_press(filter, event) self.shape.closed = len(self.shape.points) > 2 class LabelTool(InteractiveTool): TITLE = _("Label") ICON = "label.png" LABEL_STYLE_SECT = "plot" LABEL_STYLE_KEY = "label" SWITCH_TO_DEFAULT_TOOL = True def __init__( self, manager, handle_label_cb=None, label_style=None, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, switch_to_default_tool=None, ): self.handle_label_cb = handle_label_cb super(LabelTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) if label_style is not None: self.label_style_sect = label_style[0] self.label_style_key = label_style[1] else: self.label_style_sect = self.LABEL_STYLE_SECT self.label_style_key = self.LABEL_STYLE_KEY def set_label_style(self, label): label.set_style(self.label_style_sect, self.label_style_key) def setup_filter(self, baseplot): filter = baseplot.filter start_state = filter.new_state() handler = ClickHandler(filter, Qt.LeftButton, start_state=start_state) handler.SIG_CLICK_EVENT.connect(self.add_label_to_plot) return setup_standard_tool_filter(filter, start_state) def add_label_to_plot(self, filter, event): plot = filter.plot import guidata.dataset as ds class TextParam(ds.datatypes.DataSet): text = ds.dataitems.TextItem("", _("Label")) textparam = TextParam(_("Label text")) if textparam.edit(plot): text = textparam.text.replace("\n", "
") from guiqwt.builder import make label = make.label(text, (0, 0), (10, 10), "TL") self.set_label_style(label) label.setTitle(self.TITLE) x = plot.invTransform(label.xAxis(), event.pos().x()) y = plot.invTransform(label.yAxis(), event.pos().y()) label.set_pos(x, y) plot.add_item_with_z_offset(label, SHAPE_Z_OFFSET) if self.handle_label_cb is not None: self.handle_label_cb(label) plot.replot() self.SIG_TOOL_JOB_FINISHED.emit() class RectangularActionTool(InteractiveTool): SHAPE_STYLE_SECT = "plot" SHAPE_STYLE_KEY = "shape/drag" AVOID_NULL_SHAPE = False def __init__( self, manager, func, shape_style=None, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, fix_orientation=False, switch_to_default_tool=None, ): self.action_func = func self.fix_orientation = fix_orientation super(RectangularActionTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) if shape_style is not None: self.shape_style_sect = shape_style[0] self.shape_style_key = shape_style[1] else: self.shape_style_sect = self.SHAPE_STYLE_SECT self.shape_style_key = self.SHAPE_STYLE_KEY self.last_final_shape = None self.switch_to_default_tool = switch_to_default_tool def get_last_final_shape(self): if self.last_final_shape is not None: return self.last_final_shape() def set_shape_style(self, shape): shape.set_style(self.shape_style_sect, self.shape_style_key) def create_shape(self): shape = RectangleShape(0, 0, 1, 1) self.set_shape_style(shape) return shape, 0, 2 def setup_shape(self, shape): pass def get_shape(self): """Reimplemented RectangularActionTool method""" shape, h0, h1 = self.create_shape() self.setup_shape(shape) return shape, h0, h1 def get_final_shape(self, plot, p0, p1): shape, h0, h1 = self.create_shape() self.setup_shape(shape) plot.add_item_with_z_offset(shape, SHAPE_Z_OFFSET) shape.move_local_point_to(h0, p0) shape.move_local_point_to(h1, p1) self.last_final_shape = weakref.ref(shape) return shape def setup_filter(self, baseplot): filter = baseplot.filter start_state = filter.new_state() handler = RectangularSelectionHandler( filter, Qt.LeftButton, start_state=start_state ) shape, h0, h1 = self.get_shape() handler.set_shape( shape, h0, h1, self.setup_shape, avoid_null_shape=self.AVOID_NULL_SHAPE ) handler.SIG_END_RECT.connect(self.end_rect) return setup_standard_tool_filter(filter, start_state) def end_rect(self, filter, p0, p1): plot = filter.plot if self.fix_orientation: left, right = min(p0.x(), p1.x()), max(p0.x(), p1.x()) top, bottom = min(p0.y(), p1.y()), max(p0.y(), p1.y()) self.action_func(plot, QPointF(left, top), QPointF(right, bottom)) else: self.action_func(plot, p0, p1) self.SIG_TOOL_JOB_FINISHED.emit() if self.switch_to_default_tool: shape = self.get_last_final_shape() plot.set_active_item(shape) class RectangularShapeTool(RectangularActionTool): TITLE = None ICON = None def __init__( self, manager, setup_shape_cb=None, handle_final_shape_cb=None, shape_style=None, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, switch_to_default_tool=None, ): super(RectangularShapeTool, self).__init__( manager, self.add_shape_to_plot, shape_style, toolbar_id=toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) self.setup_shape_cb = setup_shape_cb self.handle_final_shape_cb = handle_final_shape_cb def add_shape_to_plot(self, plot, p0, p1): """ Method called when shape's rectangular area has just been drawn on screen. Adding the final shape to plot and returning it. """ shape = self.get_final_shape(plot, p0, p1) self.handle_final_shape(shape) plot.replot() def setup_shape(self, shape): """To be reimplemented""" shape.setTitle(self.TITLE) if self.setup_shape_cb is not None: self.setup_shape_cb(shape) def handle_final_shape(self, shape): """To be reimplemented""" if self.handle_final_shape_cb is not None: self.handle_final_shape_cb(shape) class RectangleTool(RectangularShapeTool): TITLE = _("Rectangle") ICON = "rectangle.png" class ObliqueRectangleTool(RectangularShapeTool): TITLE = _("Oblique rectangle") ICON = "oblique_rectangle.png" AVOID_NULL_SHAPE = True def create_shape(self): shape = ObliqueRectangleShape(1, 1, 2, 1, 2, 2, 1, 2) self.set_shape_style(shape) return shape, 0, 2 class PointTool(RectangularShapeTool): TITLE = _("Point") ICON = "point_shape.png" SHAPE_STYLE_KEY = "shape/point" def create_shape(self): shape = PointShape(0, 0) self.set_shape_style(shape) return shape, 0, 0 class SegmentTool(RectangularShapeTool): TITLE = _("Segment") ICON = "segment.png" SHAPE_STYLE_KEY = "shape/segment" def create_shape(self): shape = SegmentShape(0, 0, 1, 1) self.set_shape_style(shape) return shape, 0, 1 class CircleTool(RectangularShapeTool): TITLE = _("Circle") ICON = "circle.png" def create_shape(self): shape = EllipseShape(0, 0, 1, 1) self.set_shape_style(shape) return shape, 0, 1 class EllipseTool(RectangularShapeTool): TITLE = _("Ellipse") ICON = "ellipse_shape.png" def create_shape(self): shape = EllipseShape(0, 0, 1, 1) self.set_shape_style(shape) return shape, 0, 1 def handle_final_shape(self, shape): shape.switch_to_ellipse() super(EllipseTool, self).handle_final_shape(shape) class PlaceAxesTool(RectangularShapeTool): TITLE = _("Axes") ICON = "gtaxes.png" SHAPE_STYLE_KEY = "shape/axes" def create_shape(self): shape = Axes((0, 1), (1, 1), (0, 0)) self.set_shape_style(shape) return shape, 0, 2 class AnnotatedRectangleTool(RectangleTool): def create_shape(self): annotation = AnnotatedRectangle(0, 0, 1, 1) self.set_shape_style(annotation) return annotation, 0, 2 class AnnotatedObliqueRectangleTool(ObliqueRectangleTool): AVOID_NULL_SHAPE = True def create_shape(self): annotation = AnnotatedObliqueRectangle(0, 0, 1, 0, 1, 1, 0, 1) self.set_shape_style(annotation) return annotation, 0, 2 class AnnotatedCircleTool(CircleTool): def create_shape(self): annotation = AnnotatedCircle(0, 0, 1, 1) self.set_shape_style(annotation) return annotation, 0, 1 class AnnotatedEllipseTool(EllipseTool): def create_shape(self): annotation = AnnotatedEllipse(0, 0, 1, 1) self.set_shape_style(annotation) return annotation, 0, 1 def handle_final_shape(self, shape): shape.shape.switch_to_ellipse() super(EllipseTool, self).handle_final_shape(shape) class AnnotatedPointTool(PointTool): def create_shape(self): annotation = AnnotatedPoint(0, 0) self.set_shape_style(annotation) return annotation, 0, 0 class AnnotatedSegmentTool(SegmentTool): def create_shape(self): annotation = AnnotatedSegment(0, 0, 1, 1) self.set_shape_style(annotation) return annotation, 0, 1 class ImageStatsRectangle(AnnotatedRectangle): def __init__(self, x1=0, y1=0, x2=0, y2=0, annotationparam=None): super(ImageStatsRectangle, self).__init__(x1, y1, x2, y2, annotationparam) self.image_item = None def set_image_item(self, image_item): self.image_item = image_item # ----AnnotatedShape API----------------------------------------------------- def get_infos(self): """Return formatted string with informations on current shape""" if self.image_item is not None: return self.image_item.get_stats(*self.get_rect()) def update_image_tool_status(tool, plot): from guiqwt.image import ImagePlot enabled = isinstance(plot, ImagePlot) tool.action.setEnabled(enabled) return enabled class ImageStatsTool(RectangularShapeTool): SWITCH_TO_DEFAULT_TOOL = True TITLE = _("Image statistics") ICON = "imagestats.png" SHAPE_STYLE_KEY = "shape/image_stats" def __init__( self, manager, setup_shape_cb=None, handle_final_shape_cb=None, shape_style=None, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, ): super(ImageStatsTool, self).__init__( manager, setup_shape_cb, handle_final_shape_cb, shape_style, toolbar_id, title, icon, tip, ) self._last_item = None def get_last_item(self): if self._last_item is not None: return self._last_item() def create_shape(self): return ImageStatsRectangle(0, 0, 1, 1), 0, 2 def setup_shape(self, shape): super(ImageStatsTool, self).setup_shape(shape) shape.setTitle("") self.set_shape_style(shape) self.register_shape(shape, final=False) def register_shape(self, shape, final=False): plot = shape.plot() if plot is not None: plot.unselect_all() plot.set_active_item(shape) shape.set_image_item(self.get_last_item()) def handle_final_shape(self, shape): super(ImageStatsTool, self).handle_final_shape(shape) self.register_shape(shape, final=True) def get_associated_item(self, plot): items = plot.get_selected_items(item_type=IStatsImageItemType) if len(items) == 1: self._last_item = weakref.ref(items[0]) return self.get_last_item() def update_status(self, plot): if update_image_tool_status(self, plot): item = self.get_associated_item(plot) self.action.setEnabled(item is not None) class CrossSectionTool(RectangularShapeTool): SWITCH_TO_DEFAULT_TOOL = True TITLE = _("Cross section") ICON = "csection.png" SHAPE_STYLE_KEY = "shape/cross_section" SHAPE_TITLE = TITLE PANEL_IDS = (ID_XCS, ID_YCS) def create_shape(self): return AnnotatedPoint(0, 0), 0, 0 def setup_shape(self, shape): self.setup_shape_appearance(shape) super(CrossSectionTool, self).setup_shape(shape) self.register_shape(shape, final=False) def setup_shape_appearance(self, shape): self.set_shape_style(shape) param = shape.annotationparam param.title = self.SHAPE_TITLE # param.show_computations = False param.update_annotation(shape) def register_shape(self, shape, final=False): plot = shape.plot() if plot is not None: plot.unselect_all() plot.set_active_item(shape) for panel_id in self.PANEL_IDS: panel = self.manager.get_panel(panel_id) if panel is not None: panel.register_shape(shape, final=final) def activate(self): """Activate tool""" super(CrossSectionTool, self).activate() for panel_id in self.PANEL_IDS: panel = self.manager.get_panel(panel_id) panel.setVisible(True) shape = self.get_last_final_shape() if shape is not None: panel.update_plot(shape) def handle_final_shape(self, shape): super(CrossSectionTool, self).handle_final_shape(shape) self.register_shape(shape, final=True) def update_status(self, plot): if update_image_tool_status(self, plot): item = plot.get_selected_items(item_type=IImageItemType) self.action.setEnabled(len(item) > 0) class AverageCrossSectionTool(CrossSectionTool): SWITCH_TO_DEFAULT_TOOL = True TITLE = _("Average cross section") ICON = "csection_a.png" SHAPE_STYLE_KEY = "shape/average_cross_section" SHAPE_TITLE = TITLE def create_shape(self): return AnnotatedRectangle(0, 0, 1, 1), 0, 2 class ObliqueCrossSectionTool(CrossSectionTool): SWITCH_TO_DEFAULT_TOOL = True TITLE = _("Oblique averaged cross section") ICON = "csection_oblique.png" SHAPE_STYLE_KEY = "shape/average_cross_section" SHAPE_TITLE = TITLE PANEL_IDS = (ID_OCS,) def create_shape(self): annotation = AnnotatedObliqueRectangle(0, 0, 1, 0, 1, 1, 0, 1) self.set_shape_style(annotation) return annotation, 0, 2 class RectZoomTool(InteractiveTool): TITLE = _("Rectangle zoom") ICON = "magnifier.png" def setup_filter(self, baseplot): filter = baseplot.filter start_state = filter.new_state() handler = ZoomRectHandler(filter, Qt.LeftButton, start_state=start_state) shape, h0, h1 = self.get_shape() handler.set_shape(shape, h0, h1) return setup_standard_tool_filter(filter, start_state) def get_shape(self): shape = RectangleShape(0, 0, 1, 1) shape.set_style("plot", "shape/rectzoom") return shape, 0, 2 class BaseCursorTool(InteractiveTool): TITLE = None ICON = None def __init__( self, manager, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None, switch_to_default_tool=None, ): super(BaseCursorTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip, switch_to_default_tool=switch_to_default_tool, ) self.shape = None def create_shape(self): """Create and return the cursor/range shape""" raise NotImplementedError def setup_filter(self, baseplot): filter = baseplot.filter # Initialisation du filtre start_state = filter.new_state() # Bouton gauche : self.handler = QtDragHandler(filter, Qt.LeftButton, start_state=start_state) self.handler.SIG_MOVE.connect(self.move) self.handler.SIG_STOP_NOT_MOVING.connect(self.end_move) self.handler.SIG_STOP_MOVING.connect(self.end_move) return setup_standard_tool_filter(filter, start_state) def move(self, filter, event): plot = filter.plot if not self.shape: self.shape = self.create_shape() self.shape.attach(plot) self.shape.setZ(plot.get_max_z() + 1) self.shape.move_local_point_to(0, event.pos()) self.shape.setVisible(True) self.shape.move_local_point_to(1, event.pos()) plot.replot() def end_move(self, filter, event): if self.shape is not None: assert self.shape.plot() == filter.plot filter.plot.add_item_with_z_offset(self.shape, SHAPE_Z_OFFSET) self.shape = None self.SIG_TOOL_JOB_FINISHED.emit() class HRangeTool(BaseCursorTool): TITLE = _("Horizontal selection") ICON = "xrange.png" def create_shape(self): from guiqwt.shapes import XRangeSelection return XRangeSelection(0, 0) class VCursorTool(BaseCursorTool): TITLE = _("Vertical cursor") ICON = "vcursor.png" def create_shape(self): from guiqwt.shapes import Marker marker = Marker() marker.set_markerstyle("|") return marker class HCursorTool(BaseCursorTool): TITLE = _("Horizontal cursor") ICON = "hcursor.png" def create_shape(self): from guiqwt.shapes import Marker marker = Marker() marker.set_markerstyle("-") return marker class XCursorTool(BaseCursorTool): TITLE = _("Cross cursor") ICON = "xcursor.png" def create_shape(self): from guiqwt.shapes import Marker marker = Marker() marker.set_markerstyle("+") return marker class SignalStatsTool(BaseCursorTool): TITLE = _("Signal statistics") ICON = "xrange.png" SWITCH_TO_DEFAULT_TOOL = True def __init__( self, manager, toolbar_id=DefaultToolbarID, title=None, icon=None, tip=None ): super(SignalStatsTool, self).__init__( manager, toolbar_id, title=title, icon=icon, tip=tip ) self._last_item = None self.label = None def get_last_item(self): if self._last_item is not None: return self._last_item() def create_shape(self): from guiqwt.shapes import XRangeSelection return XRangeSelection(0, 0) def move(self, filter, event): super(SignalStatsTool, self).move(filter, event) if self.label is None: plot = filter.plot curve = self.get_associated_item(plot) from guiqwt.builder import make self.label = make.computations( self.shape, "TL", [ ( curve, "%g < x < %g", lambda *args: (args[0].min(), args[0].max()), ), ( curve, "%g < y < %g", lambda *args: (args[1].min(), args[1].max()), ), (curve, "<y>=%g", lambda *args: args[1].mean()), (curve, "σ(y)=%g", lambda *args: args[1].std()), (curve, "∑(y)=%g", lambda *args: np.trapz(args[1])), (curve, "∫ydx=%g", lambda *args: np.trapz(args[1], args[0])), ], ) self.label.attach(plot) self.label.setZ(plot.get_max_z() + 1) self.label.setVisible(True) def end_move(self, filter, event): super(SignalStatsTool, self).end_move(filter, event) if self.label is not None: filter.plot.add_item_with_z_offset(self.label, SHAPE_Z_OFFSET) self.label = None def get_associated_item(self, plot): items = plot.get_selected_items(item_type=ICurveItemType) if len(items) == 1: self._last_item = weakref.ref(items[0]) return self.get_last_item() def update_status(self, plot): item = self.get_associated_item(plot) self.action.setEnabled(item is not None) class DummySeparatorTool(GuiTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(DummySeparatorTool, self).__init__(manager, toolbar_id) def setup_toolbar(self, toolbar): """Setup tool's toolbar""" add_separator(toolbar) def setup_context_menu(self, menu, plot): add_separator(menu) class CommandTool(GuiTool): """Base class for command tools: action, context menu entry""" CHECKABLE = False def __init__( self, manager, title, icon=None, tip=None, toolbar_id=DefaultToolbarID ): self.title = title if icon and isinstance(icon, str): self.icon = get_icon(icon) else: self.icon = icon self.tip = tip super(CommandTool, self).__init__(manager, toolbar_id) def create_action(self, manager): """Create and return tool's action""" return manager.create_action( self.title, icon=self.icon, tip=self.tip, triggered=self.activate, checkable=self.CHECKABLE, ) def setup_context_menu(self, menu, plot): if self.menu is not None: self.menu.setTitle(self.action.text()) menu.addMenu(self.menu) else: menu.addAction(self.action) def activate(self, checked=True): plot = self.get_active_plot() if plot is not None: self.activate_command(plot, checked) def set_status_active_item(self, plot): item = plot.get_active_item() if item: self.action.setEnabled(True) else: self.action.setEnabled(False) class ToggleTool(CommandTool): CHECKABLE = True def __init__(self, manager, title, icon=None, tip=None, toolbar_id=None): super(ToggleTool, self).__init__(manager, title, icon, tip, toolbar_id) class BasePlotMenuTool(CommandTool): """ A tool that gather parameter panels from the BasePlot and proposes to edit them and set them back """ def __init__( self, manager, key, title=None, icon=None, tip=None, toolbar_id=DefaultToolbarID ): from guiqwt.baseplot import PARAMETERS_TITLE_ICON default_title, default_icon = PARAMETERS_TITLE_ICON[key] if title is None: title = default_title if icon is None: icon = default_icon super(BasePlotMenuTool, self).__init__(manager, title, icon, tip, toolbar_id) # Warning: icon (str) --(Base class constructor)--> self.icon (QIcon) self.key = key def activate_command(self, plot, checked): """Activate tool""" plot.edit_plot_parameters(self.key) def update_status(self, plot): status = plot.get_plot_parameters_status(self.key) self.action.setEnabled(status) class AntiAliasingTool(ToggleTool): def __init__(self, manager): super(AntiAliasingTool, self).__init__(manager, _("Antialiasing (curves)")) def activate_command(self, plot, checked): """Activate tool""" plot.set_antialiasing(checked) plot.replot() def update_status(self, plot): self.action.setChecked(plot.antialiased) class DisplayCoordsTool(CommandTool): def __init__(self, manager): super(DisplayCoordsTool, self).__init__( manager, _("Markers"), icon=get_icon("on_curve.png"), tip=None, toolbar_id=None, ) self.action.setEnabled(True) def create_action_menu(self, manager): """Create and return menu for the tool's action""" menu = QMenu() self.canvas_act = manager.create_action( _("Free"), toggled=self.activate_canvas_pointer ) self.curve_act = manager.create_action( _("Bound to active item"), toggled=self.activate_curve_pointer ) add_actions(menu, (self.canvas_act, self.curve_act)) return menu def activate_canvas_pointer(self, enable): plot = self.get_active_plot() if plot is not None: plot.set_pointer("canvas" if enable else None) def activate_curve_pointer(self, enable): plot = self.get_active_plot() if plot is not None: plot.set_pointer("curve" if enable else None) def update_status(self, plot): self.canvas_act.setChecked(plot.canvas_pointer) self.curve_act.setChecked(plot.curve_pointer) class ReverseYAxisTool(ToggleTool): def __init__(self, manager): super(ReverseYAxisTool, self).__init__(manager, _("Reverse Y axis")) def activate_command(self, plot, checked): """Activate tool""" plot.set_axis_direction("left", checked) plot.replot() def update_status(self, plot): if update_image_tool_status(self, plot): self.action.setChecked(plot.get_axis_direction("left")) class AspectRatioParam(DataSet): lock = BoolItem(_("Lock aspect ratio")) current = FloatItem(_("Current value")).set_prop("display", active=False) ratio = FloatItem(_("Lock value"), min=1e-3) class AspectRatioTool(CommandTool): def __init__(self, manager): super(AspectRatioTool, self).__init__( manager, _("Aspect ratio"), tip=None, toolbar_id=None ) self.action.setEnabled(True) def create_action_menu(self, manager): """Create and return menu for the tool's action""" self.ar_param = AspectRatioParam(_("Aspect ratio")) menu = QMenu() self.lock_action = manager.create_action( _("Lock"), toggled=self.lock_aspect_ratio ) self.ratio1_action = manager.create_action( _("1:1"), triggered=self.set_aspect_ratio_1_1 ) self.set_action = manager.create_action( _("Edit..."), triggered=self.edit_aspect_ratio ) add_actions(menu, (self.lock_action, None, self.ratio1_action, self.set_action)) return menu def set_aspect_ratio_1_1(self): plot = self.get_active_plot() if plot is not None: plot.set_aspect_ratio(ratio=1) plot.replot() def activate_command(self, plot, checked): """Activate tool""" pass def __update_actions(self, checked): self.ar_param.lock = checked # self.lock_action.blockSignals(True) self.lock_action.setChecked(checked) # self.lock_action.blockSignals(False) plot = self.get_active_plot() if plot is not None: ratio = plot.get_aspect_ratio() self.ratio1_action.setEnabled(checked and ratio != 1.0) def lock_aspect_ratio(self, checked): """Lock aspect ratio""" plot = self.get_active_plot() if plot is not None: plot.set_aspect_ratio(lock=checked) self.__update_actions(checked) plot.replot() def edit_aspect_ratio(self): plot = self.get_active_plot() if plot is not None: self.ar_param.lock = plot.lock_aspect_ratio self.ar_param.ratio = plot.get_aspect_ratio() self.ar_param.current = plot.get_current_aspect_ratio() if self.ar_param.edit(parent=plot): lock, ratio = self.ar_param.lock, self.ar_param.ratio plot.set_aspect_ratio(ratio=ratio, lock=lock) self.__update_actions(lock) plot.replot() def update_status(self, plot): if update_image_tool_status(self, plot): ratio = plot.get_aspect_ratio() lock = plot.lock_aspect_ratio self.ar_param.ratio, self.ar_param.lock = ratio, lock self.__update_actions(lock) class PanelTool(ToggleTool): panel_id = None panel_name = None def __init__(self, manager): super(PanelTool, self).__init__(manager, self.panel_name) manager.get_panel(self.panel_id).SIG_VISIBILITY_CHANGED.connect( self.action.setChecked ) def activate_command(self, plot, checked): """Activate tool""" panel = self.manager.get_panel(self.panel_id) panel.setVisible(checked) def update_status(self, plot): panel = self.manager.get_panel(self.panel_id) self.action.setChecked(panel.isVisible()) class ContrastPanelTool(PanelTool): panel_name = _("Contrast adjustment") panel_id = ID_CONTRAST def update_status(self, plot): super(ContrastPanelTool, self).update_status(plot) update_image_tool_status(self, plot) item = plot.get_last_active_item(IVoiImageItemType) panel = self.manager.get_panel(self.panel_id) for action in panel.toolbar.actions(): if isinstance(action, QAction): action.setEnabled(item is not None) class XCSPanelTool(PanelTool): panel_name = _("X-axis cross section") panel_id = ID_XCS class YCSPanelTool(PanelTool): panel_name = _("Y-axis cross section") panel_id = ID_YCS class OCSPanelTool(PanelTool): panel_name = _("Oblique averaged cross section") panel_id = ID_OCS class ItemListPanelTool(PanelTool): panel_name = _("Item list") panel_id = ID_ITEMLIST class SaveAsTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(SaveAsTool, self).__init__( manager, _("Save as..."), get_std_icon("DialogSaveButton", 16), toolbar_id=toolbar_id, ) def activate_command(self, plot, checked): """Activate tool""" # FIXME: Qt's PDF printer is unable to print plots including images # --> until this bug is fixed internally, disabling PDF output format # when plot has image items. formats = "%s (*.png)" % _("PNG image") for item in plot.get_items(): if IImageItemType in item.types(): break else: formats += "\n%s (*.pdf)" % _("PDF document") fname, _f = getsavefilename(plot, _("Save as"), _("untitled"), formats) if fname: plot.save_widget(fname) class CopyToClipboardTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(CopyToClipboardTool, self).__init__( manager, _("Copy to clipboard"), get_icon("copytoclipboard.png"), toolbar_id=toolbar_id, ) def activate_command(self, plot, checked): """Activate tool""" plot.copy_to_clipboard() def save_snapshot(plot, p0, p1, new_size=None): """ Save rectangular plot area p0, p1: resp. top left and bottom right points (`QPointF` objects) new_size: destination image size (tuple: (width, height)) """ from guiqwt.image import ( get_image_from_plot, get_plot_qrect, get_items_in_rectangle, compute_trimageitems_original_size, ) from guiqwt import io items = get_items_in_rectangle(plot, p0, p1) if not items: QMessageBox.critical( plot, _("Rectangle snapshot"), _("There is no supported image item in current selection."), ) return src_x, src_y, src_w, src_h = get_plot_qrect(plot, p0, p1).getRect() original_size = compute_trimageitems_original_size(items, src_w, src_h) if new_size is None: new_size = (p1.x() - p0.x() + 1, p1.y() - p0.y() + 1) # Screen size from guiqwt.widgets.resizedialog import ResizeDialog dlg = ResizeDialog( plot, new_size=new_size, old_size=original_size, text=_("Destination size:") ) if not dlg.exec_(): return from guidata.dataset.datatypes import DataSet, BeginGroup, EndGroup from guidata.dataset.dataitems import BoolItem, ChoiceItem class SnapshotParam(DataSet): _levels = BeginGroup(_("Image levels adjustments")) apply_contrast = BoolItem(_("Apply contrast settings"), default=False) apply_interpolation = BoolItem(_("Apply interpolation algorithm"), default=True) norm_range = BoolItem(_("Scale levels to maximum range"), default=False) _end_levels = EndGroup(_("Image levels adjustments")) _multiple = BeginGroup(_("Superimposed images")) add_images = ChoiceItem( _("If image B is behind image A, " "replace intersection by"), [(False, "A"), (True, "A+B")], default=None, ) _end_multiple = EndGroup(_("Superimposed images")) param = SnapshotParam(_("Rectangle snapshot")) if not param.edit(parent=plot): return if dlg.keep_original_size: destw, desth = original_size else: destw, desth = dlg.width, dlg.height try: data = get_image_from_plot( plot, p0, p1, destw=destw, desth=desth, add_images=param.add_images, apply_lut=param.apply_contrast, apply_interpolation=param.apply_interpolation, original_resolution=dlg.keep_original_size, ) dtype = None for item in items: if dtype is None or item.data.dtype.itemsize > dtype.itemsize: dtype = item.data.dtype if param.norm_range: data = io.scale_data_to_dtype(data, dtype=dtype) else: data = np.array(data, dtype=dtype) except MemoryError: mbytes = int(destw * desth * 32.0 / (8 * 1024 ** 2)) QMessageBox.critical( plot, _("Memory error"), _( "There is not enough memory left to process " "this %d x %d image (%d MB would be required)." ) % (destw, desth, mbytes), ) return for model_item in items: model_fname = model_item.get_filename() if model_fname is not None and model_fname.lower().endswith(".dcm"): break else: model_fname = None fname, _f = getsavefilename( plot, _("Save as"), _("untitled"), io.iohandler.get_filters("save", data.dtype, template=True), ) _base, ext = osp.splitext(fname) options = {} if not fname: return elif ext.lower() == ".png": options.update(dict(dtype=np.uint8, max_range=True)) elif ext.lower() == ".dcm": try: # pydicom 1.0 from pydicom import dicomio except ImportError: # pydicom 0.9 import dicom as dicomio model_dcm = dicomio.read_file(model_fname) try: ps_attr = "ImagerPixelSpacing" ps_x, ps_y = getattr(model_dcm, ps_attr) except AttributeError: ps_attr = "PixelSpacing" ps_x, ps_y = getattr(model_dcm, ps_attr) model_dcm.Rows, model_dcm.Columns = data.shape dest_height, dest_width = data.shape ( _x, _y, _angle, model_dx, model_dy, _hflip, _vflip, ) = model_item.get_transform() new_ps_x = ps_x * src_w / (model_dx * dest_width) new_ps_y = ps_y * src_h / (model_dy * dest_height) setattr(model_dcm, ps_attr, [new_ps_x, new_ps_y]) options.update(dict(template=model_dcm)) io.imwrite(fname, data, **options) class SnapshotTool(RectangularActionTool): SWITCH_TO_DEFAULT_TOOL = True TITLE = _("Rectangle snapshot") ICON = "snapshot.png" def __init__(self, manager, toolbar_id=DefaultToolbarID): super(SnapshotTool, self).__init__( manager, save_snapshot, toolbar_id=toolbar_id, fix_orientation=True ) class RotateCropTool(CommandTool): """Rotate & Crop tool See :py:class:`guiqwt.rotatecrop.RotateCropDialog` dialog.""" def __init__(self, manager, toolbar_id=DefaultToolbarID, options=None): super(RotateCropTool, self).__init__( manager, title=_("Rotate and crop"), icon=get_icon("rotate.png"), toolbar_id=toolbar_id, ) self.options = options def activate_command(self, plot, checked): """Activate tool""" from guiqwt.image import TrImageItem from guiqwt.widgets.rotatecrop import RotateCropDialog for item in plot.get_selected_items(): if isinstance(item, TrImageItem): z = item.z() plot.del_item(item) dlg = RotateCropDialog(plot.parent(), options=self.options) dlg.set_item(item) ok = dlg.exec_() plot.add_item(item, z=z) if not ok: break def update_status(self, plot): from guiqwt.image import TrImageItem status = any( [isinstance(item, TrImageItem) for item in plot.get_selected_items()] ) self.action.setEnabled(status) class PrintTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(PrintTool, self).__init__( manager, _("Print..."), get_icon("print.png"), toolbar_id=toolbar_id ) def activate_command(self, plot, checked): """Activate tool""" printer = QPrinter() dialog = QPrintDialog(printer, plot) saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None ok = dialog.exec_() sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err if ok: plot.print_(printer) class OpenFileTool(CommandTool): #: Signal emitted by OpenFileTool when a file was opened (arg: filename) SIG_OPEN_FILE = Signal(str) def __init__( self, manager, title=_("Open..."), formats="*.*", toolbar_id=DefaultToolbarID ): super(OpenFileTool, self).__init__( manager, title, get_std_icon("DialogOpenButton", 16), toolbar_id=toolbar_id ) self.formats = formats self.directory = "" def get_filename(self, plot): saved_in, saved_out, saved_err = sys.stdin, sys.stdout, sys.stderr sys.stdout = None filename, _f = getopenfilename(plot, _("Open"), self.directory, self.formats) sys.stdin, sys.stdout, sys.stderr = saved_in, saved_out, saved_err filename = str(filename) if filename: self.directory = osp.dirname(filename) return filename def activate_command(self, plot, checked): """Activate tool""" filename = self.get_filename(plot) if filename: self.SIG_OPEN_FILE.emit(filename) class SaveItemsTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(SaveItemsTool, self).__init__( manager, _("Save items"), get_std_icon("DialogSaveButton", 16), toolbar_id=toolbar_id, ) def activate_command(self, plot, checked): """Activate tool""" fname, _f = getsavefilename( plot, _("Save items as"), _("untitled"), "%s (*.gui)" % _("guiqwt items") ) if not fname: return itemfile = open(fname, "wb") plot.save_items(itemfile, selected=True) class LoadItemsTool(OpenFileTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(LoadItemsTool, self).__init__( manager, title=_("Load items"), formats="*.gui", toolbar_id=toolbar_id ) def activate_command(self, plot, checked): """Activate tool""" filename = self.get_filename(plot) if not filename: return itemfile = open(filename, "rb") plot.restore_items(itemfile) plot.replot() class OpenImageTool(OpenFileTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): from guiqwt import io super(OpenImageTool, self).__init__( manager, title=_("Open image"), formats=io.iohandler.get_filters("load"), toolbar_id=toolbar_id, ) class AxisScaleTool(CommandTool): def __init__(self, manager): super(AxisScaleTool, self).__init__( manager, _("Scale"), icon=get_icon("log_log.png"), tip=None, toolbar_id=None ) self.action.setEnabled(True) def create_action_menu(self, manager): """Create and return menu for the tool's action""" menu = QMenu() group = QActionGroup(manager.get_main()) lin_lin = manager.create_action( "Lin Lin", icon=get_icon("lin_lin.png"), toggled=lambda state, x="lin", y="lin": self.set_scale(state, x, y), ) lin_log = manager.create_action( "Lin Log", icon=get_icon("lin_log.png"), toggled=lambda state, x="lin", y="log": self.set_scale(state, x, y), ) log_lin = manager.create_action( "Log Lin", icon=get_icon("log_lin.png"), toggled=lambda state, x="log", y="lin": self.set_scale(state, x, y), ) log_log = manager.create_action( "Log Log", icon=get_icon("log_log.png"), toggled=lambda state, x="log", y="log": self.set_scale(state, x, y), ) self.scale_menu = { ("lin", "lin"): lin_lin, ("lin", "log"): lin_log, ("log", "lin"): log_lin, ("log", "log"): log_log, } for obj in (group, menu): add_actions(obj, (lin_lin, lin_log, log_lin, log_log)) return menu def update_status(self, plot): item = plot.get_active_item() active_scale = ("lin", "lin") if item is not None: xscale = plot.get_axis_scale(item.xAxis()) yscale = plot.get_axis_scale(item.yAxis()) active_scale = xscale, yscale for scale_type, scale_action in list(self.scale_menu.items()): if item is None: scale_action.setEnabled(False) else: scale_action.setEnabled(True) if active_scale == scale_type: scale_action.setChecked(True) else: scale_action.setChecked(False) def set_scale(self, checked, xscale, yscale): if not checked: return plot = self.get_active_plot() if plot is not None: cur_xscale, cur_yscale = plot.get_scales() if cur_xscale != xscale or cur_yscale != yscale: plot.set_scales(xscale, yscale) class HelpTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(HelpTool, self).__init__( manager, _("Help"), get_std_icon("DialogHelpButton", 16), toolbar_id=toolbar_id, ) def activate_command(self, plot, checked): """Activate tool""" QMessageBox.information( plot, _("Help"), _( """Keyboard/mouse shortcuts: - single left-click: item (curve, image, ...) selection - single right-click: context-menu relative to selected item - shift: on-active-curve (or image) cursor - alt: free cursor - left-click + mouse move: move item (when available) - middle-click + mouse move: pan - right-click + mouse move: zoom""" ), ) class AboutTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(AboutTool, self).__init__( manager, _("About") + " guiqwt", get_icon("guiqwt.svg"), toolbar_id=None ) def activate_command(self, plot, checked): """Activate tool""" from guiqwt import about QMessageBox.about(plot, _("About") + " guiqwt", about(html=True)) class ItemManipulationBaseTool(CommandTool): TITLE = None ICON = None TIP = None def __init__(self, manager, toolbar_id, curve_func, image_func): super(ItemManipulationBaseTool, self).__init__( manager, self.TITLE, icon=self.ICON, tip=self.TIP, toolbar_id=toolbar_id ) self.curve_func = curve_func self.image_func = image_func def get_supported_items(self, plot): all_items = [ item for item in plot.get_items(item_type=ICurveItemType) if not item.is_empty() ] from guiqwt.image import ImageItem all_items += [ item for item in plot.get_items() if isinstance(item, ImageItem) and not item.is_empty() ] if len(all_items) == 1: return all_items else: return [item for item in all_items if item in plot.get_selected_items()] def update_status(self, plot): self.action.setEnabled(len(self.get_supported_items(plot)) > 0) def activate_command(self, plot, checked): """Activate tool""" for item in self.get_supported_items(plot): if ICurveItemType in item.types(): self.curve_func(item) else: self.image_func(item) plot.replot() def export_curve_data(item): """Export curve item data to text file""" item_data = item.get_data() if len(item_data) > 2: x, y, dx, dy = item_data array_list = [x, y] if dx is not None: array_list.append(dx) if dy is not None: array_list.append(dy) data = np.array(array_list).T else: x, y = item_data data = np.array([x, y]).T plot = item.plot() title = _("Export") if item.curveparam.label: title += " (%s)" % item.curveparam.label fname, _f = getsavefilename(plot, title, "", _("Text file") + " (*.txt)") if fname: try: np.savetxt(str(fname), data, delimiter=",") except RuntimeError as error: QMessageBox.critical( plot, _("Export"), _("Unable to export item data.") + "

" + _("Error message:") + "
" + str(error), ) def export_image_data(item): """Export image item data to file""" from guiqwt.qthelpers import exec_image_save_dialog exec_image_save_dialog(item.plot(), item.data) class ExportItemDataTool(ItemManipulationBaseTool): TITLE = _("Export data...") ICON = "export.png" def __init__(self, manager, toolbar_id=None): super(ExportItemDataTool, self).__init__( manager, toolbar_id, curve_func=export_curve_data, image_func=export_image_data, ) def edit_curve_data(item): """Edit curve item data to text file""" item_data = item.get_data() if len(item_data) > 2: x, y, dx, dy = item_data array_list = [x, y] if dx is not None: array_list.append(dx) if dy is not None: array_list.append(dy) data = np.array(array_list).T else: x, y = item_data data = np.array([x, y]).T if oedit(data) is not None: if data.shape[1] > 2: if data.shape[1] == 3: x, y, tmp = data.T if dx is not None: dx = tmp else: dy = tmp else: x, y, dx, dy = data.T item.set_data(x, y, dx, dy) else: x, y = data.T item.set_data(x, y) class EditItemDataTool(ItemManipulationBaseTool): """Edit item data""" TITLE = _("Edit data...") ICON = "arredit.png" def __init__(self, manager, toolbar_id=None): super(EditItemDataTool, self).__init__( manager, toolbar_id, curve_func=edit_curve_data, image_func=lambda item: oedit(item.data), ) class ItemCenterTool(CommandTool): def __init__(self, manager, toolbar_id=None): super(ItemCenterTool, self).__init__( manager, _("Center items"), "center.png", toolbar_id=toolbar_id ) def get_supported_items(self, plot): from guiqwt.shapes import RectangleShape, EllipseShape, ObliqueRectangleShape from guiqwt.annotations import ( AnnotatedRectangle, AnnotatedEllipse, AnnotatedObliqueRectangle, ) item_types = ( RectangleShape, EllipseShape, ObliqueRectangleShape, AnnotatedRectangle, AnnotatedEllipse, AnnotatedObliqueRectangle, ) return [ item for item in plot.get_selected_items(z_sorted=True) if isinstance(item, item_types) ] def update_status(self, plot): self.action.setEnabled(len(self.get_supported_items(plot)) > 1) def activate_command(self, plot, checked): """Activate tool""" items = self.get_supported_items(plot) xc0, yc0 = items.pop(-1).get_center() for item in items: xc, yc = item.get_center() item.move_with_selection(xc0 - xc, yc0 - yc) plot.replot() class DeleteItemTool(CommandTool): def __init__(self, manager, toolbar_id=None): super(DeleteItemTool, self).__init__( manager, _("Remove"), "trash.png", toolbar_id=toolbar_id ) def get_removable_items(self, plot): return [item for item in plot.get_selected_items() if not item.is_readonly()] def update_status(self, plot): self.action.setEnabled(len(self.get_removable_items(plot)) > 0) def activate_command(self, plot, checked): """Activate tool""" items = self.get_removable_items(plot) if len(items) == 1: message = _("Do you really want to remove this item?") else: message = _("Do you really want to remove selected items?") answer = QMessageBox.warning( plot, _("Remove"), message, QMessageBox.Yes | QMessageBox.No ) if answer == QMessageBox.Yes: plot.del_items(items) plot.replot() class FilterTool(CommandTool): def __init__(self, manager, filter, toolbar_id=None): super(FilterTool, self).__init__( manager, str(filter.name), toolbar_id=toolbar_id ) self.filter = filter def update_status(self, plot): self.set_status_active_item() def activate_command(self, plot, checked): """Activate tool""" plot.apply_filter(self.filter) class ColormapTool(CommandTool): def __init__(self, manager, toolbar_id=DefaultToolbarID): super(ColormapTool, self).__init__( manager, _("Colormap"), tip=_("Select colormap for active " "image"), toolbar_id=toolbar_id, ) self.action.setEnabled(False) self.action.setIconText("") self.default_icon = build_icon_from_cmap_name("jet") self.action.setIcon(self.default_icon) def create_action_menu(self, manager): """Create and return menu for the tool's action""" menu = QMenu() for cmap_name in get_colormap_list(): icon = build_icon_from_cmap_name(cmap_name) action = menu.addAction(icon, cmap_name) action.setEnabled(True) menu.triggered.connect(self.activate_cmap) return menu def activate_command(self, plot, checked): """Activate tool""" pass def get_selected_images(self, plot): items = [it for it in plot.get_selected_items(item_type=IColormapImageItemType)] if not items: active_image = plot.get_last_active_item(IColormapImageItemType) if active_image: items = [active_image] return items def activate_cmap(self, action): plot = self.get_active_plot() if plot is not None: items = self.get_selected_images(plot) cmap_name = str(action.text()) for item in items: item.imageparam.colormap = cmap_name item.imageparam.update_image(item) self.action.setText(cmap_name) plot.invalidate() self.update_status(plot) def update_status(self, plot): if update_image_tool_status(self, plot): item = plot.get_last_active_item(IColormapImageItemType) icon = self.default_icon if item: self.action.setEnabled(True) cmap_name = item.get_color_map_name() if cmap_name: icon = build_icon_from_cmap_name(cmap_name) else: self.action.setEnabled(False) self.action.setIcon(icon) class ImageMaskTool(CommandTool): #: Signal emitted by ImageMaskTool when mask was applied SIG_APPLIED_MASK_TOOL = Signal() def __init__(self, manager, toolbar_id=DefaultToolbarID): self._mask_shapes = {} self._mask_already_restored = {} super(ImageMaskTool, self).__init__( manager, _("Mask"), icon="mask_tool.png", tip=_("Manage image masking areas"), toolbar_id=toolbar_id, ) self.masked_image = None # associated masked image item def create_action_menu(self, manager): """Create and return menu for the tool's action""" rect_tool = manager.add_tool( RectangleTool, toolbar_id=None, handle_final_shape_cb=lambda shape: self.handle_shape(shape, inside=True), title=_("Mask rectangular area (inside)"), icon="mask_rectangle.png", ) rect_out_tool = manager.add_tool( RectangleTool, toolbar_id=None, handle_final_shape_cb=lambda shape: self.handle_shape(shape, inside=False), title=_("Mask rectangular area (outside)"), icon="mask_rectangle_outside.png", ) ellipse_tool = manager.add_tool( CircleTool, toolbar_id=None, handle_final_shape_cb=lambda shape: self.handle_shape(shape, inside=True), title=_("Mask circular area (inside)"), icon="mask_circle.png", ) ellipse_out_tool = manager.add_tool( CircleTool, toolbar_id=None, handle_final_shape_cb=lambda shape: self.handle_shape(shape, inside=False), title=_("Mask circular area (outside)"), icon="mask_circle_outside.png", ) menu = QMenu() self.showmask_action = manager.create_action( _("Show image mask"), toggled=self.show_mask ) showshapes_action = manager.create_action( _("Show masking shapes"), toggled=self.show_shapes ) showshapes_action.setChecked(True) applymask_a = manager.create_action( _("Apply mask"), icon=get_icon("apply.png"), triggered=self.apply_mask ) clearmask_a = manager.create_action( _("Clear mask"), icon=get_icon("delete.png"), triggered=self.clear_mask ) removeshapes_a = manager.create_action( _("Remove all masking shapes"), icon=get_icon("delete.png"), triggered=self.remove_all_shapes, ) add_actions( menu, ( self.showmask_action, None, showshapes_action, rect_tool.action, ellipse_tool.action, rect_out_tool.action, ellipse_out_tool.action, applymask_a, None, clearmask_a, removeshapes_a, ), ) return menu def update_status(self, plot): self.action.setEnabled(self.masked_image is not None) def register_plot(self, baseplot): super(ImageMaskTool, self).register_plot(baseplot) self._mask_shapes.setdefault(baseplot, []) baseplot.SIG_ITEMS_CHANGED.connect(self.items_changed) baseplot.SIG_ITEM_SELECTION_CHANGED.connect(self.item_selection_changed) def show_mask(self, state): if self.masked_image is not None: self.masked_image.set_mask_visible(state) def apply_mask(self): mask = self.masked_image.get_mask() plot = self.get_active_plot() for shape, inside in self._mask_shapes[plot]: if isinstance(shape, RectangleShape): self.masked_image.align_rectangular_shape(shape) x0, y0, x1, y1 = shape.get_rect() self.masked_image.mask_rectangular_area(x0, y0, x1, y1, inside=inside) else: x0, y0, x1, y1 = shape.get_rect() self.masked_image.mask_circular_area(x0, y0, x1, y1, inside=inside) self.masked_image.set_mask(mask) plot.replot() self.SIG_APPLIED_MASK_TOOL.emit() def remove_all_shapes(self): message = _("Do you really want to remove all masking shapes?") plot = self.get_active_plot() answer = QMessageBox.warning( plot, _("Remove all masking shapes"), message, QMessageBox.Yes | QMessageBox.No, ) if answer == QMessageBox.Yes: self.remove_shapes() def remove_shapes(self): plot = self.get_active_plot() plot.del_items( [shape for shape, _inside in self._mask_shapes[plot]] ) # remove shapes self._mask_shapes[plot] = [] plot.replot() def show_shapes(self, state): plot = self.get_active_plot() if plot is not None: for shape, _inside in self._mask_shapes[plot]: shape.setVisible(state) plot.replot() def handle_shape(self, shape, inside): shape.set_style("plot", "shape/mask") shape.set_private(True) plot = self.get_active_plot() plot.set_active_item(shape) self._mask_shapes[plot] += [(shape, inside)] def find_masked_image(self, plot): item = plot.get_active_item() from guiqwt.image import MaskedImageItem if isinstance(item, MaskedImageItem): return item else: items = [ item for item in plot.get_items() if isinstance(item, MaskedImageItem) ] if items: return items[-1] def create_shapes_from_masked_areas(self): plot = self.get_active_plot() self._mask_shapes[plot] = [] for area in self.masked_image.get_masked_areas(): if area.geometry == "rectangular": shape = RectangleShape(area.x0, area.y0, area.x1, area.y1) self.masked_image.align_rectangular_shape(shape) else: shape = EllipseShape( area.x0, 0.5 * (area.y0 + area.y1), area.x1, 0.5 * (area.y0 + area.y1), ) shape.set_style("plot", "shape/mask") shape.set_private(True) self._mask_shapes[plot] += [(shape, area.inside)] plot.blockSignals(True) plot.add_item(shape) plot.blockSignals(False) def set_masked_image(self, plot): self.masked_image = item = self.find_masked_image(plot) if self.masked_image is not None and not self._mask_already_restored: self.create_shapes_from_masked_areas() self._mask_already_restored = True enable = False if item is None else item.is_mask_visible() self.showmask_action.setChecked(enable) def items_changed(self, plot): self.set_masked_image(plot) self._mask_shapes[plot] = [ (shape, inside) for shape, inside in self._mask_shapes[plot] if shape.plot() is plot ] self.update_status(plot) def item_selection_changed(self, plot): self.set_masked_image(plot) self.update_status(plot) def clear_mask(self): message = _("Do you really want to clear the mask?") plot = self.get_active_plot() answer = QMessageBox.warning( plot, _("Clear mask"), message, QMessageBox.Yes | QMessageBox.No ) if answer == QMessageBox.Yes: self.masked_image.unmask_all() plot.replot() def activate_command(self, plot, checked): """Activate tool""" pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/transitional.py0000666000000000000000000000135500000000000014334 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2011 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt.transitional ------------------- The purpose of this transitional package is to regroup all the references to the ``PythonQwt`` library (`qwt` package). No other ``guiqwt`` module should import ``qwt`` or use any of its interfaces directly. """ from qwt import ( QwtPlot, QwtSymbol, QwtLinearScaleEngine, QwtLogScaleEngine, QwtText, QwtPlotCanvas, QwtLinearColorMap, QwtInterval, toQImage, QwtPlotGrid, QwtPlotItem, QwtScaleMap, QwtPlotCurve, QwtPlotMarker, QwtPlotRenderer, ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.4548633 guiqwt-4.0.1/guiqwt/widgets/0000777000000000000000000000000000000000000012715 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096268.0 guiqwt-4.0.1/guiqwt/widgets/__init__.py0000666000000000000000000000110200000000000015020 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guidata/__init__.py for details) """ guiqwt.widgets ============== The ``guiqwt.widgets`` package provides ready-to-use widgets for creating signal/image processing GUI applications. .. automodule:: guiqwt.widgets.fit :members: :inherited-members: .. automodule:: guiqwt.widgets.resizedialog :members: :inherited-members: .. automodule:: guiqwt.widgets.rotatecrop :members: :inherited-members: """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/widgets/base.py0000666000000000000000000002032600000000000014204 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ base ---- The `base` module provides base objects for internal use of the `guiqwt.widgets` package. """ from qtpy.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QTabWidget from guidata.qthelpers import create_toolbutton from guidata.configtools import get_icon # Local imports from guiqwt.config import _ from guiqwt.histogram import lut_range_threshold from guiqwt.image import INTERP_LINEAR, TrImageItem from guiqwt.plot import ImageWidget, ImageDialog class BaseTransformMixin(object): """Base transform widget mixin class (for manipulating TrImageItem objects) This is to be mixed with a class providing the get_plot method, like ImageDialog, or BaseTransformWidget (see below)""" def __init__(self): self.item = None self.item_original_state = None self.item_original_crop = None self.item_original_transform = None self.output_array = None # ------Public API---------------------------------------------------------- def add_reset_button(self, layout): """Add the standard reset button""" edit_options_btn = create_toolbutton( self, text=_("Reset"), icon=get_icon("eraser.png"), triggered=self.reset, autoraise=False, ) layout.addWidget(edit_options_btn) layout.addStretch() def add_apply_button(self, layout): """Add the standard apply button""" apply_btn = create_toolbutton( self, text=_("Apply"), icon=get_icon("apply.png"), triggered=self.apply_transformation, autoraise=False, ) layout.addWidget(apply_btn) layout.addStretch() def add_buttons_to_layout(self, layout): """Add tool buttons to layout""" self.add_reset_button(layout) self.add_apply_button(layout) def set_item(self, item): """Set associated item -- must be a TrImageItem object""" assert isinstance(item, TrImageItem) self.item = item self.item_original_state = ( item.can_select(), item.can_move(), item.can_resize(), item.can_rotate(), ) self.item_original_crop = item.get_crop() self.item_original_transform = item.get_transform() self.item.set_selectable(True) self.item.set_movable(True) self.item.set_resizable(False) self.item.set_rotatable(True) item.set_lut_range(lut_range_threshold(item, 256, 2.0)) item.set_interpolation(INTERP_LINEAR) plot = self.get_plot() plot.add_item(self.item) # Setting the item as active item (even if the cropping rectangle item # will also be set as active item just below), for the image tools to # register this item (contrast, ...): plot.set_active_item(self.item) self.item.unselect() def unset_item(self): """Unset the associated item, freeing memory""" plot = self.get_plot() plot.del_item(self.item) self.item = None def reset(self): """Reset crop/transform image settings""" self.item.set_crop(*self.item_original_crop) self.item.set_transform(*self.item_original_transform) self.reset_transformation() self.apply_transformation() def reset_transformation(self): """Reset transformation""" raise NotImplementedError def apply_transformation(self): """Apply transformation, e.g. crop or rotate""" raise NotImplementedError def compute_transformation(self): """Compute transformation, return compute output array""" raise NotImplementedError # ------Private API--------------------------------------------------------- def restore_original_state(self): """Restore item original state""" select, move, resize, rotate = self.item_original_state self.item.set_selectable(select) self.item.set_movable(move) self.item.set_resizable(resize) self.item.set_rotatable(rotate) def accept_changes(self): """Computed rotated/cropped array and apply changes to item""" self.restore_original_state() self.apply_transformation() self.output_array = self.compute_transformation() # Ignoring image position changes pos_x0, pos_y0, _angle, sx, sy, hf, vf = self.item_original_transform _pos_x0, _pos_y0, angle, _sx, _sy, hf, vf = self.item.get_transform() self.item.set_transform(pos_x0, pos_y0, angle, sx, sy, hf, vf) def reject_changes(self): """Restore item original transform settings""" self.restore_original_state() self.item.set_crop(*self.item_original_crop) self.item.set_transform(*self.item_original_transform) class BaseTransformDialog(ImageDialog): """Rotate & Crop Dialog Rotate and crop a :py:class:`guiqwt.image.TrImageItem` plot item""" def __init__(self, parent, wintitle=None, options=None, resize_to=None): if wintitle is None: wintitle = _("Rotate & Crop") ImageDialog.__init__( self, wintitle=wintitle, edit=True, toolbar=False, options=options, parent=parent, ) if resize_to is not None: width, height = resize_to self.resize(width, height) self.accepted.connect(self.accept_changes) self.rejected.connect(self.reject_changes) def install_button_layout(self): """Reimplemented ImageDialog method""" self.add_buttons_to_layout(self.button_layout) super(BaseTransformDialog, self).install_button_layout() class BaseTransformWidget(QWidget): """Base transform widget: see for example rotatecrop.py""" def __init__(self, parent, options=None): QWidget.__init__(self, parent=parent) if options is None: options = {} self.imagewidget = ImageWidget(self, **options) self.imagewidget.register_all_image_tools() hlayout = QHBoxLayout() self.add_buttons_to_layout(hlayout) vlayout = QVBoxLayout() vlayout.addWidget(self.imagewidget) vlayout.addLayout(hlayout) self.setLayout(vlayout) def get_plot(self): """Required for BaseTransformMixin""" return self.imagewidget.get_plot() class BaseMultipleTransformWidget(QTabWidget): """Base Multiple Transform Widget Transform several :py:class:`guiqwt.image.TrImageItem` plot items""" TRANSFORM_WIDGET_CLASS = None def __init__(self, parent, options=None): QTabWidget.__init__(self, parent) self.options = options self.output_arrays = None def set_items(self, *items): """Set the associated items -- must be a TrImageItem objects""" for item in items: self.add_item(item) def add_item(self, item): """Add item to widget""" widget = self.TRANSFORM_WIDGET_CLASS(self, options=self.options) widget.set_item(item) self.addTab(widget, item.title().text()) return widget def clear_items(self): """Clear all items, freeing memory""" self.items = None for index in range(self.count()): self.widget(index).unset_item() self.clear() def reset(self): """Reset transform image settings""" for index in range(self.count()): self.widget(index).reset() def accept_changes(self): """Accept all changes""" self.output_arrays = [] for index in range(self.count()): widget = self.widget(index) widget.accept_changes() self.output_arrays.append(widget.output_array) def reject_changes(self): """Reject all changes""" for index in range(self.count()): self.widget(index).reject_changes() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/widgets/fit.py0000666000000000000000000005677100000000000014071 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) # pylint: disable=C0103 """ guiqwt.widgets.fit ------------------ The `fit` module provides an interactive curve fitting widget/dialog allowing: * to fit data manually (by moving sliders) * or automatically (with standard optimization algorithms provided by :py:mod:`scipy`). Example ~~~~~~~ .. literalinclude:: /../guiqwt/tests/fit.py :start-after: SHOW :end-before: Workaround for Sphinx v0.6 bug: empty 'end-before' directive .. image:: /images/screenshots/fit.png Reference ~~~~~~~~~ .. autofunction:: guifit .. autoclass:: FitDialog :members: :inherited-members: .. autoclass:: FitParam :members: :inherited-members: .. autoclass:: AutoFitParam :members: :inherited-members: """ from qtpy.QtWidgets import ( QGridLayout, QLabel, QSlider, QPushButton, QLineEdit, QDialog, QVBoxLayout, QHBoxLayout, QWidget, QDialogButtonBox, ) from qtpy.QtCore import Qt from qtpy import PYQT5 import numpy as np from numpy import inf # Do not remove this import (used by optimization funcs) import guidata from guidata.utils import update_dataset, restore_dataset from guidata.qthelpers import create_groupbox, win32_fix_title_bar_background from guidata.configtools import get_icon from guidata.dataset.datatypes import DataSet from guidata.dataset.dataitems import ( StringItem, FloatItem, IntItem, ChoiceItem, BoolItem, ) # Local imports from guiqwt.config import _ from guiqwt.builder import make from guiqwt.plot import CurveWidgetMixin class AutoFitParam(DataSet): xmin = FloatItem("xmin") xmax = FloatItem("xmax") method = ChoiceItem( _("Method"), [ ("simplex", "Simplex"), ("powel", "Powel"), ("bfgs", "BFGS"), ("l_bfgs_b", "L-BFGS-B"), ("cg", _("Conjugate Gradient")), ("lq", _("Least squares")), ], default="lq", ) err_norm = StringItem( "enorm", default=2.0, help=_("for simplex, powel, cg and bfgs norm used " "by the error function"), ) xtol = FloatItem( "xtol", default=0.0001, help=_("for simplex, powel, least squares") ) ftol = FloatItem( "ftol", default=0.0001, help=_("for simplex, powel, least squares") ) gtol = FloatItem("gtol", default=0.0001, help=_("for cg, bfgs")) norm = StringItem( "norm", default="inf", help=_("for cg, bfgs. inf is max, -inf is min") ) class FitParamDataSet(DataSet): name = StringItem(_("Name")) value = FloatItem(_("Value"), default=0.0) min = FloatItem(_("Min"), default=-1.0) max = FloatItem(_("Max"), default=1.0).set_pos(col=1) steps = IntItem(_("Steps"), default=5000) format = StringItem(_("Format"), default="%.3f").set_pos(col=1) logscale = BoolItem(_("Logarithmic"), _("Scale")) unit = StringItem(_("Unit"), default="").set_pos(col=1) class FitParam(object): def __init__( self, name, value, min, max, logscale=False, steps=5000, format="%.3f", size_offset=0, unit="", ): self.name = name self.value = value self.min = min self.max = max self.logscale = logscale self.steps = steps self.format = format self.unit = unit self.prefix_label = None self.lineedit = None self.unit_label = None self.slider = None self.button = None self._widgets = [] self._size_offset = size_offset self._refresh_callback = None self.dataset = FitParamDataSet(title=_("Curve fitting parameter")) def copy(self): """Return a copy of this fitparam""" return self.__class__( self.name, self.value, self.min, self.max, self.logscale, self.steps, self.format, self._size_offset, self.unit, ) def create_widgets(self, parent, refresh_callback): self._refresh_callback = refresh_callback self.prefix_label = QLabel() font = self.prefix_label.font() font.setPointSize(font.pointSize() + self._size_offset) self.prefix_label.setFont(font) self.button = QPushButton() self.button.setIcon(get_icon("settings.png")) self.button.setToolTip(_("Edit '%s' fit parameter properties") % self.name) self.button.clicked.connect(lambda: self.edit_param(parent)) self.lineedit = QLineEdit() self.lineedit.editingFinished.connect(self.line_editing_finished) self.unit_label = QLabel(self.unit) self.slider = QSlider() self.slider.setOrientation(Qt.Horizontal) self.slider.setRange(0, self.steps - 1) self.slider.valueChanged.connect(self.slider_value_changed) self.update(refresh=False) self.add_widgets( [ self.prefix_label, self.lineedit, self.unit_label, self.slider, self.button, ] ) def add_widgets(self, widgets): self._widgets += widgets def get_widgets(self): return self._widgets def set_scale(self, state): self.logscale = state > 0 self.update_slider_value() def set_text(self, fmt=None): style = "%s" self.prefix_label.setText(style % self.name) if self.value is None: value_str = "" else: if fmt is None: fmt = self.format value_str = fmt % self.value self.lineedit.setText(value_str) self.lineedit.setDisabled(self.value == self.min and self.max == self.min) def line_editing_finished(self): try: self.value = float(self.lineedit.text()) except ValueError: self.set_text() self.update_slider_value() self._refresh_callback() def slider_value_changed(self, int_value): if self.logscale: total_delta = np.log10(1 + self.max - self.min) self.value = ( self.min + 10 ** (total_delta * int_value / (self.steps - 1)) - 1 ) else: total_delta = self.max - self.min self.value = self.min + total_delta * int_value / (self.steps - 1) self.set_text() self._refresh_callback() def update_slider_value(self): if self.value is None or self.min is None or self.max is None: self.slider.setEnabled(False) if self.slider.parent() and self.slider.parent().isVisible(): self.slider.show() elif self.value == self.min and self.max == self.min: self.slider.hide() else: self.slider.setEnabled(True) if self.slider.parent() and self.slider.parent().isVisible(): self.slider.show() if self.logscale: value_delta = max([np.log10(1 + self.value - self.min), 0.0]) total_delta = np.log10(1 + self.max - self.min) else: value_delta = self.value - self.min total_delta = self.max - self.min intval = int(self.steps * value_delta / total_delta) self.slider.blockSignals(True) self.slider.setValue(intval) self.slider.blockSignals(False) def edit_param(self, parent): update_dataset(self.dataset, self) if self.dataset.edit(parent=parent): restore_dataset(self.dataset, self) if self.value > self.max: self.max = self.value if self.value < self.min: self.min = self.value self.update() def update(self, refresh=True): self.unit_label.setText(self.unit) self.slider.setRange(0, self.steps - 1) self.update_slider_value() self.set_text() if refresh: self._refresh_callback() def add_fitparam_widgets_to(layout, fitparams, refresh_callback, param_cols=1): row_contents = [] row_nb = 0 col_nb = 0 for i, param in enumerate(fitparams): param.create_widgets(layout.parent(), refresh_callback) widgets = param.get_widgets() w_colums = len(widgets) + 1 row_contents += [ (widget, row_nb, j + col_nb * w_colums) for j, widget in enumerate(widgets) ] col_nb += 1 if col_nb == param_cols: row_nb += 1 col_nb = 0 for widget, row, col in row_contents: layout.addWidget(widget, row, col) if fitparams: for col_nb in range(param_cols): layout.setColumnStretch(1 + col_nb * w_colums, 5) if col_nb > 0: layout.setColumnStretch(col_nb * w_colums - 1, 1) class FitWidgetMixin(CurveWidgetMixin): def __init__( self, wintitle="guiqwt plot", icon="guiqwt.svg", toolbar=False, options=None, panels=None, param_cols=1, legend_anchor="TR", auto_fit=True, ): if wintitle is None: wintitle = _("Curve fitting") self.x = None self.y = None self.fitfunc = None self.fitargs = None self.fitkwargs = None self.fitparams = None self.autofit_prm = None self.data_curve = None self.fit_curve = None self.legend = None self.legend_anchor = legend_anchor self.xrange = None self.show_xrange = False self.param_cols = param_cols self.auto_fit_enabled = auto_fit self.button_list = [] # list of buttons to be disabled at startup self.fit_layout = None self.params_layout = None CurveWidgetMixin.__init__( self, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, ) self.refresh() # QWidget API -------------------------------------------------------------- def resizeEvent(self, event): QWidget.resizeEvent(self, event) self.get_plot().replot() # CurveWidgetMixin API ----------------------------------------------------- def setup_widget_layout(self): self.fit_layout = QHBoxLayout() self.params_layout = QGridLayout() params_group = create_groupbox( self, _("Fit parameters"), layout=self.params_layout ) if self.auto_fit_enabled: auto_group = self.create_autofit_group() self.fit_layout.addWidget(auto_group) self.fit_layout.addWidget(params_group) self.plot_layout.addLayout(self.fit_layout, 1, 0) vlayout = QVBoxLayout(self) vlayout.addWidget(self.toolbar) vlayout.addLayout(self.plot_layout) self.setLayout(vlayout) def create_plot(self, options): CurveWidgetMixin.create_plot(self, options) for plot in self.get_plots(): plot.SIG_RANGE_CHANGED.connect(self.range_changed) # Public API --------------------------------------------------------------- def set_data( self, x, y, fitfunc=None, fitparams=None, fitargs=None, fitkwargs=None ): if self.fitparams is not None and fitparams is not None: self.clear_params_layout() self.x = x self.y = y if fitfunc is not None: self.fitfunc = fitfunc if fitparams is not None: self.fitparams = fitparams if fitargs is not None: self.fitargs = fitargs if fitkwargs is not None: self.fitkwargs = fitkwargs self.autofit_prm = AutoFitParam(title=_("Automatic fitting options")) self.autofit_prm.xmin = x.min() self.autofit_prm.xmax = x.max() self.compute_imin_imax() if self.fitparams is not None and fitparams is not None: self.populate_params_layout() self.refresh() def set_fit_data(self, fitfunc, fitparams, fitargs=None, fitkwargs=None): if self.fitparams is not None: self.clear_params_layout() self.fitfunc = fitfunc self.fitparams = fitparams self.fitargs = fitargs self.fitkwargs = fitkwargs self.populate_params_layout() self.refresh() def clear_params_layout(self): for i, param in enumerate(self.fitparams): for widget in param.get_widgets(): if widget is not None: self.params_layout.removeWidget(widget) widget.hide() def populate_params_layout(self): add_fitparam_widgets_to( self.params_layout, self.fitparams, self.refresh, param_cols=self.param_cols ) def create_autofit_group(self): auto_button = QPushButton(get_icon("apply.png"), _("Run"), self) auto_button.clicked.connect(self.autofit) autoprm_button = QPushButton(get_icon("settings.png"), _("Settings"), self) autoprm_button.clicked.connect(self.edit_parameters) xrange_button = QPushButton(get_icon("xrange.png"), _("Bounds"), self) xrange_button.setCheckable(True) xrange_button.toggled.connect(self.toggle_xrange) auto_layout = QVBoxLayout() auto_layout.addWidget(auto_button) auto_layout.addWidget(autoprm_button) auto_layout.addWidget(xrange_button) self.button_list += [auto_button, autoprm_button, xrange_button] return create_groupbox(self, _("Automatic fit"), layout=auto_layout) def get_fitfunc_arguments(self): """Return fitargs and fitkwargs""" fitargs = self.fitargs if self.fitargs is None: fitargs = [] fitkwargs = self.fitkwargs if self.fitkwargs is None: fitkwargs = {} return fitargs, fitkwargs def refresh(self, slider_value=None): """Refresh Fit Tool dialog box""" # Update button states enable = ( self.x is not None and self.y is not None and self.x.size > 0 and self.y.size > 0 and self.fitfunc is not None and self.fitparams is not None and len(self.fitparams) > 0 ) for btn in self.button_list: btn.setEnabled(enable) if not enable: # Fit widget is not yet configured return fitargs, fitkwargs = self.get_fitfunc_arguments() yfit = self.fitfunc( self.x, [p.value for p in self.fitparams], *fitargs, **fitkwargs ) plot = self.get_plot() if self.legend is None: self.legend = make.legend(anchor=self.legend_anchor) plot.add_item(self.legend) if self.xrange is None: self.xrange = make.range(0.0, 1.0) plot.add_item(self.xrange) self.xrange.set_range(self.autofit_prm.xmin, self.autofit_prm.xmax) self.xrange.setVisible(self.show_xrange) if self.data_curve is None: self.data_curve = make.curve([], [], _("Data"), color="b", linewidth=2) plot.add_item(self.data_curve) self.data_curve.set_data(self.x, self.y) if self.fit_curve is None: self.fit_curve = make.curve([], [], _("Fit"), color="r", linewidth=2) plot.add_item(self.fit_curve) self.fit_curve.set_data(self.x, yfit) plot.replot() plot.disable_autoscale() def range_changed(self, xrange_obj, xmin, xmax): self.autofit_prm.xmin, self.autofit_prm.xmax = xmin, xmax self.compute_imin_imax() def toggle_xrange(self, state): self.xrange.setVisible(state) plot = self.get_plot() plot.replot() if state: plot.set_active_item(self.xrange) self.show_xrange = state def edit_parameters(self): if self.autofit_prm.edit(parent=self): self.xrange.set_range(self.autofit_prm.xmin, self.autofit_prm.xmax) plot = self.get_plot() plot.replot() self.compute_imin_imax() def compute_imin_imax(self): self.i_min = self.x.searchsorted(self.autofit_prm.xmin) self.i_max = self.x.searchsorted(self.autofit_prm.xmax, side="right") def errorfunc(self, params): x = self.x[self.i_min : self.i_max] y = self.y[self.i_min : self.i_max] fitargs, fitkwargs = self.get_fitfunc_arguments() return y - self.fitfunc(x, params, *fitargs, **fitkwargs) def autofit(self): meth = self.autofit_prm.method x0 = np.array([p.value for p in self.fitparams]) if meth == "lq": x = self.autofit_lq(x0) elif meth == "simplex": x = self.autofit_simplex(x0) elif meth == "powel": x = self.autofit_powel(x0) elif meth == "bfgs": x = self.autofit_bfgs(x0) elif meth == "l_bfgs_b": x = self.autofit_l_bfgs(x0) elif meth == "cg": x = self.autofit_cg(x0) else: return for v, p in zip(x, self.fitparams): p.value = v self.refresh() for prm in self.fitparams: prm.update() def get_norm_func(self): prm = self.autofit_prm err_norm = eval(prm.err_norm) def func(params): err = np.linalg.norm(self.errorfunc(params), err_norm) return err return func def autofit_simplex(self, x0): prm = self.autofit_prm from scipy.optimize import fmin x = fmin(self.get_norm_func(), x0, xtol=prm.xtol, ftol=prm.ftol) return x def autofit_powel(self, x0): prm = self.autofit_prm from scipy.optimize import fmin_powell x = fmin_powell(self.get_norm_func(), x0, xtol=prm.xtol, ftol=prm.ftol) return x def autofit_bfgs(self, x0): prm = self.autofit_prm from scipy.optimize import fmin_bfgs x = fmin_bfgs(self.get_norm_func(), x0, gtol=prm.gtol, norm=eval(prm.norm)) return x def autofit_l_bfgs(self, x0): prm = self.autofit_prm bounds = [(p.min, p.max) for p in self.fitparams] from scipy.optimize import fmin_l_bfgs_b x, _f, _d = fmin_l_bfgs_b( self.get_norm_func(), x0, pgtol=prm.gtol, approx_grad=1, bounds=bounds ) return x def autofit_cg(self, x0): prm = self.autofit_prm from scipy.optimize import fmin_cg x = fmin_cg(self.get_norm_func(), x0, gtol=prm.gtol, norm=eval(prm.norm)) return x def autofit_lq(self, x0): prm = self.autofit_prm def func(params): err = self.errorfunc(params) return err from scipy.optimize import leastsq x, _ier = leastsq(func, x0, xtol=prm.xtol, ftol=prm.ftol) return x def get_values(self): """Convenience method to get fit parameter values""" return [param.value for param in self.fitparams] class FitWidget(QWidget, FitWidgetMixin): def __init__( self, wintitle=None, icon="guiqwt.svg", toolbar=False, options=None, parent=None, panels=None, param_cols=1, legend_anchor="TR", auto_fit=False, ): QWidget.__init__(self, parent) FitWidgetMixin.__init__( self, wintitle, icon, toolbar, options, panels, param_cols, legend_anchor, auto_fit, ) class FitDialog(QDialog, FitWidgetMixin): def __init__( self, wintitle=None, icon="guiqwt.svg", edit=True, toolbar=False, options=None, parent=None, panels=None, param_cols=1, legend_anchor="TR", auto_fit=False, ): if not PYQT5: QDialog.__init__(self, parent) self.edit = edit self.button_layout = None if PYQT5: super(FitDialog, self).__init__( parent, wintitle=wintitle, icon=icon, toolbar=toolbar, options=options, panels=panels, param_cols=param_cols, legend_anchor=legend_anchor, auto_fit=auto_fit, ) else: FitWidgetMixin.__init__( self, wintitle, icon, toolbar, options, panels, param_cols, legend_anchor, auto_fit, ) self.setWindowFlags(Qt.Window) win32_fix_title_bar_background(self) def setup_widget_layout(self): FitWidgetMixin.setup_widget_layout(self) if self.edit: self.install_button_layout() def install_button_layout(self): bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) self.button_list += [bbox.button(QDialogButtonBox.Ok)] self.button_layout = QHBoxLayout() self.button_layout.addStretch() self.button_layout.addWidget(bbox) vlayout = self.layout() vlayout.addSpacing(10) vlayout.addLayout(self.button_layout) def guifit( x, y, fitfunc, fitparams, fitargs=None, fitkwargs=None, wintitle=None, title=None, xlabel=None, ylabel=None, param_cols=1, auto_fit=True, winsize=None, winpos=None, ): """GUI-based curve fitting tool""" _app = guidata.qapplication() # win = FitWidget(wintitle=wintitle, toolbar=True, # param_cols=param_cols, auto_fit=auto_fit, # options=dict(title=title, xlabel=xlabel, ylabel=ylabel)) win = FitDialog( edit=True, wintitle=wintitle, toolbar=True, param_cols=param_cols, auto_fit=auto_fit, options=dict(title=title, xlabel=xlabel, ylabel=ylabel), ) win.set_data(x, y, fitfunc, fitparams, fitargs, fitkwargs) if winsize is not None: win.resize(*winsize) if winpos is not None: win.move(*winpos) if win.exec_(): return win.get_values() # win.show() # _app.exec_() # return win.get_values() if __name__ == "__main__": x = np.linspace(-10, 10, 1000) y = np.cos(1.5 * x) + np.random.rand(x.shape[0]) * 0.2 def fit(x, params): a, b = params return np.cos(b * x) + a a = FitParam("Offset", 1.0, 0.0, 2.0) b = FitParam("Frequency", 1.05, 0.0, 10.0, logscale=True) params = [a, b] values = guifit(x, y, fit, params, auto_fit=True) print(values) print([param.value for param in params]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/widgets/fliprotate.py0000666000000000000000000001205700000000000015445 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ fliprotate ---------- The `FlipRotate` module provides a dialog box providing essential GUI elements for rotating (arbitrary angle) and cropping an image: * :py:class:`guiqwt.widgets.fliprotate.FlipRotateDialog`: dialog box * :py:class:`guiqwt.widgets.fliprotate.FlipRotateWidget`: equivalent widget Reference ~~~~~~~~~ .. autoclass:: FlipRotateDialog :members: :inherited-members: .. autoclass:: FlipRotateWidget :members: :inherited-members: """ from qtpy.QtWidgets import QLabel, QComboBox import numpy as np from guidata.qthelpers import create_toolbutton from guidata.configtools import get_icon # Local imports from guiqwt.config import _ from guiqwt.widgets import base class FlipRotateMixin(base.BaseTransformMixin): """Rotate & Crop mixin class, to be mixed with a class providing the get_plot method, like ImageDialog or FlipRotateWidget (see below)""" ROTATION_ANGLES = [str((i - 1) * 90) for i in range(4)] # ------BaseTransformMixin API---------------------------------------------- def add_buttons_to_layout(self, layout): """Add tool buttons to layout""" # Image orientation angle_label = QLabel(_("Angle (°):")) layout.addWidget(angle_label) self.angle_combo = QComboBox(self) self.angle_combo.addItems(self.ROTATION_ANGLES) self.angle_combo.setCurrentIndex(1) self.angle_combo.currentIndexChanged.connect( lambda index: self.apply_transformation() ) layout.addWidget(self.angle_combo) layout.addSpacing(10) # Image flipping flip_label = QLabel(_("Flip:")) layout.addWidget(flip_label) hflip = create_toolbutton( self, text="", icon=get_icon("hflip.png"), toggled=lambda state: self.apply_transformation(), autoraise=False, ) self.hflip_btn = hflip layout.addWidget(hflip) vflip = create_toolbutton( self, text="", icon=get_icon("vflip.png"), toggled=lambda state: self.apply_transformation(), autoraise=False, ) self.vflip_btn = vflip layout.addWidget(vflip) layout.addSpacing(15) self.add_reset_button(layout) def reset_transformation(self): """Reset transformation""" self.angle_combo.setCurrentIndex(1) self.hflip_btn.setChecked(False) self.vflip_btn.setChecked(False) def apply_transformation(self): """Apply transformation, e.g. crop or rotate""" angle, hflip, vflip = self.get_parameters() x, y, _a, px, py, _hf, _vf = self.item.get_transform() self.item.set_transform(x, y, angle * np.pi / 180, px, py, hflip, vflip) self.get_plot().replot() def compute_transformation(self): """Compute transformation, return compute output array""" angle, hflip, vflip = self.get_parameters() data = self.item.data.copy() if hflip: data = np.fliplr(data) if vflip: data = np.flipud(data) if angle: k = int((-angle % 360) / 90) data = np.rot90(data, k) return data # ------Public API---------------------------------------------------------- def get_parameters(self): """Return transform parameters""" angle = int(str(self.angle_combo.currentText())) hflip = self.hflip_btn.isChecked() vflip = self.vflip_btn.isChecked() return angle, hflip, vflip def set_parameters(self, angle, hflip, vflip): """Set transform parameters""" angle_index = self.ROTATION_ANGLES.index(str(angle)) self.angle_combo.setCurrentIndex(angle_index) self.hflip_btn.setChecked(hflip) self.vflip_btn.setChecked(vflip) class FlipRotateDialog(base.BaseTransformDialog, FlipRotateMixin): """Flip & Rotate Dialog Flip and rotate a :py:class:`guiqwt.image.TrImageItem` plot item""" def __init__(self, parent, wintitle=None, options=None, resize_to=None): FlipRotateMixin.__init__(self) base.BaseTransformDialog.__init__( self, parent, wintitle=wintitle, options=options, resize_to=resize_to ) class FlipRotateWidget(base.BaseTransformWidget, FlipRotateMixin): """Flip & Rotate Widget Flip and rotate a :py:class:`guiqwt.image.TrImageItem` plot item""" def __init__(self, parent, options=None): base.BaseTransformWidget.__init__(self, parent, options=options) FlipRotateMixin.__init__(self) class MultipleFlipRotateWidget(base.BaseMultipleTransformWidget): """Multiple Flip & Rotate Widget Flip and rotate several :py:class:`guiqwt.image.TrImageItem` plot items""" TRANSFORM_WIDGET_CLASS = FlipRotateWidget ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/widgets/resizedialog.py0000666000000000000000000001171000000000000015750 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ resizedialog ------------ The `resizedialog` module provides a dialog box providing essential GUI for entering parameters needed to resize an image: :py:class:`guiqwt.widgets.resizedialog.ResizeDialog`. Reference ~~~~~~~~~ .. autoclass:: ResizeDialog :members: :inherited-members: """ from qtpy.QtWidgets import ( QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QFormLayout, QLineEdit, QCheckBox, ) from qtpy.QtGui import QIntValidator from qtpy.QtCore import Qt from guidata.qthelpers import win32_fix_title_bar_background from guiqwt.config import _ def is_edit_valid(edit): text = edit.text() state = edit.validator().validate(text, 0) if isinstance(state, (tuple, list)): state = state[0] return state == QIntValidator.Acceptable class ResizeDialog(QDialog): def __init__(self, parent, new_size, old_size, text="", keep_original_size=False): QDialog.__init__(self, parent) win32_fix_title_bar_background(self) intfunc = lambda tup: [int(val) for val in tup] if intfunc(new_size) == intfunc(old_size): self.keep_original_size = True else: self.keep_original_size = keep_original_size self.width, self.height = new_size self.old_width, self.old_height = old_size self.ratio = self.width / self.height layout = QVBoxLayout() self.setLayout(layout) formlayout = QFormLayout() layout.addLayout(formlayout) if text: label = QLabel(text) label.setAlignment(Qt.AlignHCenter) formlayout.addRow(label) self.w_edit = w_edit = QLineEdit(self) w_valid = QIntValidator(w_edit) w_valid.setBottom(1) w_edit.setValidator(w_valid) self.h_edit = h_edit = QLineEdit(self) h_valid = QIntValidator(h_edit) h_valid.setBottom(1) h_edit.setValidator(h_valid) zbox = QCheckBox(_("Original size"), self) formlayout.addRow(_("Width (pixels)"), w_edit) formlayout.addRow(_("Height (pixels)"), h_edit) formlayout.addRow("", zbox) formlayout.addRow(_("Original size:"), QLabel("%d x %d" % old_size)) self.z_label = QLabel() formlayout.addRow(_("Zoom factor:"), self.z_label) # Button box self.bbox = bbox = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel ) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) layout.addWidget(bbox) self.w_edit.setText(str(self.width)) self.h_edit.setText(str(self.height)) self.update_widgets() self.setWindowTitle(_("Resize")) w_edit.textChanged.connect(self.width_changed) h_edit.textChanged.connect(self.height_changed) zbox.toggled.connect(self.toggled_no_zoom) zbox.setChecked(self.keep_original_size) def update_widgets(self): valid = True for edit in (self.w_edit, self.h_edit): if not is_edit_valid(edit): valid = False self.bbox.button(QDialogButtonBox.Ok).setEnabled(valid) self.z_label.setText("%d %s" % (100 * self.width / self.old_width, "%")) def width_changed(self, text): if is_edit_valid(self.sender()): self.width = int(text) self.height = int(self.width / self.ratio) self.h_edit.blockSignals(True) self.h_edit.setText(str(self.height)) self.h_edit.blockSignals(False) self.update_widgets() def height_changed(self, text): if is_edit_valid(self.sender()): self.height = int(text) self.width = int(self.ratio * self.height) self.w_edit.blockSignals(True) self.w_edit.setText(str(self.width)) self.w_edit.blockSignals(False) self.update_widgets() def toggled_no_zoom(self, state): self.keep_original_size = state if state: self.z_label.setText("100 %") self.bbox.button(QDialogButtonBox.Ok).setEnabled(True) else: self.update_widgets() for widget in (self.w_edit, self.h_edit): widget.setDisabled(state) def get_zoom(self): if self.keep_original_size: return 1 elif self.width > self.height: return self.width / self.old_width else: return self.height / self.old_height if __name__ == "__main__": import guidata qapp = guidata.qapplication() test = ResizeDialog(None, (150, 100), (300, 200), "Enter the new size:") if test.exec_(): print(test.width) print(test.get_zoom()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/guiqwt/widgets/rotatecrop.py0000666000000000000000000001070600000000000015455 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ rotatecrop ---------- The `rotatecrop` module provides a dialog box providing essential GUI elements for rotating (arbitrary angle) and cropping an image: * :py:class:`guiqwt.widgets.rotatecrop.RotateCropDialog`: dialog box * :py:class:`guiqwt.widgets.rotatecrop.RotateCropWidget`: equivalent widget Reference ~~~~~~~~~ .. autoclass:: RotateCropDialog :members: :inherited-members: .. autoclass:: RotateCropWidget :members: :inherited-members: """ from qtpy.QtWidgets import QCheckBox # Local imports from guiqwt.config import _ from guiqwt.builder import make from guiqwt.image import get_image_in_shape from guiqwt.widgets import base class RotateCropMixin(base.BaseTransformMixin): """Rotate & Crop mixin class, to be mixed with a class providing the get_plot method, like ImageDialog or RotateCropWidget (see below)""" def __init__(self): base.BaseTransformMixin.__init__(self) self.crop_rect = None # ------BaseTransformMixin API---------------------------------------------- def add_buttons_to_layout(self, layout): """Add tool buttons to layout""" # Show crop rectangle checkbox show_crop = QCheckBox(_("Show cropping rectangle"), self) show_crop.setChecked(True) show_crop.toggled.connect(self.show_crop_rect) layout.addWidget(show_crop) layout.addSpacing(15) base.BaseTransformMixin.add_buttons_to_layout(self, layout) def set_item(self, item): """Set associated item -- must be a TrImageItem object""" base.BaseTransformMixin.set_item(self, item) crect = make.annotated_rectangle(0, 0, 1, 1, _("Cropping rectangle")) self.crop_rect = crect crect.annotationparam.format = "%.1f cm" plot = self.get_plot() plot.add_item(crect) plot.set_active_item(crect) x0, y0, x1, y1 = self.item.get_crop_coordinates() crect.set_rect(x0, y0, x1, y1) plot.replot() def reset_transformation(self): """Reset transformation""" x0, y0, x1, y1 = self.item.border_rect.get_rect() self.crop_rect.set_rect(x0, y0, x1, y1) def apply_transformation(self): """Apply transformation, e.g. crop or rotate""" # Let's crop! i_points = self.item.border_rect.get_points() xmin, ymin = i_points.min(axis=0) xmax, ymax = i_points.max(axis=0) xc0, yc0, xc1, yc1 = self.crop_rect.shape.get_rect() left = max([0, xc0 - xmin]) right = max([0, xmax - xc1]) top = max([0, yc0 - ymin]) bottom = max([0, ymax - yc1]) self.item.set_crop(left, top, right, bottom) # print "set_crop:", left, top, right, bottom self.item.compute_bounds() self.get_plot().replot() def compute_transformation(self): """Compute transformation, return compute output array""" return get_image_in_shape(self.crop_rect, apply_interpolation=False) # ------Private API--------------------------------------------------------- def show_crop_rect(self, state): """Show/hide cropping rectangle shape""" self.crop_rect.setVisible(state) self.crop_rect.label.setVisible(state) self.get_plot().replot() class RotateCropDialog(base.BaseTransformDialog, RotateCropMixin): """Rotate & Crop Dialog Rotate and crop a :py:class:`guiqwt.image.TrImageItem` plot item""" def __init__(self, parent, wintitle=None, options=None, resize_to=None): RotateCropMixin.__init__(self) base.BaseTransformDialog.__init__( self, parent, wintitle=wintitle, options=options, resize_to=resize_to ) class RotateCropWidget(base.BaseTransformWidget, RotateCropMixin): """Rotate & Crop Widget Rotate and crop a :py:class:`guiqwt.image.TrImageItem` plot item""" def __init__(self, parent, options=None): base.BaseTransformWidget.__init__(self, parent, options=options) RotateCropMixin.__init__(self) class MultipleRotateCropWidget(base.BaseMultipleTransformWidget): """Multiple Rotate & Crop Widget Rotate and crop several :py:class:`guiqwt.image.TrImageItem` plot items""" TRANSFORM_WIDGET_CLASS = RotateCropWidget ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626338.9705067 guiqwt-4.0.1/guiqwt.egg-info/0000777000000000000000000000000000000000000012741 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626336.0 guiqwt-4.0.1/guiqwt.egg-info/PKG-INFO0000666000000000000000000000524000000000000014037 0ustar00Metadata-Version: 2.1 Name: guiqwt Version: 4.0.1 Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt) Home-page: https://github.com/PierreRaybaut/guiqwt Author: Pierre Raybaut Author-email: pierre.raybaut@gmail.com License: CeCILL V2 Platform: UNKNOWN Classifier: Topic :: Scientific/Engineering Classifier: Development Status :: 5 - Production/Stable Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: Unix Classifier: Programming Language :: Python :: 3 Provides-Extra: Doc Provides-Extra: DICOM License-File: Licence_CeCILL_V2-en.txt guiqwt: Python tools for curve and image plotting ================================================= .. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png See `documentation`_ for more details on the library and `changelog`_ for recent history of changes. Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the `CECILL License`_. .. _documentation: https://guiqwt.readthedocs.io/en/latest/ .. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md .. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt Overview -------- Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve plotting Qwt C++ library, included in guiqwt base source code) and on the scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. It is based on Qt graphical user interfaces library, and currently supports both ``PyQt5`` and ``PySide2``. Extension to `PythonQwt`_: * set of tools for curve and image plotting * GUI-based application development helpers .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt Building, installation, ... --------------------------- The following packages are **required**: `PyQt5`_, `PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_. .. _PyQt5: https://pypi.python.org/pypi/PyQt5 .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt .. _guidata: https://pypi.python.org/pypi/guidata .. _NumPy: https://pypi.python.org/pypi/NumPy .. _SciPy: https://pypi.python.org/pypi/SciPy .. _Pillow: https://pypi.python.org/pypi/Pillow See the `README`_ and `documentation`_ for more details. .. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626338.0 guiqwt-4.0.1/guiqwt.egg-info/SOURCES.txt0000666000000000000000000001764300000000000014640 0ustar00CHANGELOG.md Licence_CeCILL_V2-en.txt MANIFEST.in README.md setup.py C:/Python/guiqwt/build/doctmp/guiqwt.chm doc/conf.py doc/development.rst doc/disthelpers.rst doc/examples.rst doc/index.rst doc/installation.rst doc/migrating_from_v2_to_v3.rst doc/overview.rst doc/sift.rst doc/_static/favicon.ico doc/images/curve_widgets.png doc/images/guiqwt.png doc/images/image_widgets.png doc/images/my_plot_manager.png doc/images/panorama.png doc/images/screenshots/__init__.png doc/images/screenshots/computations.png doc/images/screenshots/contrast.png doc/images/screenshots/cross_section.png doc/images/screenshots/cross_section2.png doc/images/screenshots/dotarraydemo.png doc/images/screenshots/fit.png doc/images/screenshots/get_point.png doc/images/screenshots/hist2d.png doc/images/screenshots/image_plot_tools.png doc/images/screenshots/imagefilter.png doc/images/screenshots/imagesuperp.png doc/images/screenshots/imagexy.png doc/images/screenshots/manager.png doc/images/screenshots/mandelbrot.png doc/images/screenshots/pcolor.png doc/images/screenshots/plot.png doc/images/screenshots/sift1.png doc/images/screenshots/sift2.png doc/images/screenshots/sift3.png doc/images/screenshots/simple_dialog.png doc/images/screenshots/simple_window.png doc/images/screenshots/transform.png doc/reference/annotations.rst doc/reference/baseplot.rst doc/reference/builder.rst doc/reference/cross_section.rst doc/reference/curve.rst doc/reference/histogram.rst doc/reference/image.rst doc/reference/index.rst doc/reference/io.rst doc/reference/label.rst doc/reference/panels.rst doc/reference/plot.rst doc/reference/pyplot.rst doc/reference/shapes.rst doc/reference/signals.rst doc/reference/styles.rst doc/reference/tools.rst doc/reference/widgets_fit.rst doc/reference/widgets_resizedialog.rst doc/reference/widgets_rotatecrop.rst guiqwt/__init__.py guiqwt/_cm.py guiqwt/annotations.py guiqwt/baseplot.py guiqwt/builder.py guiqwt/colormap.py guiqwt/config.py guiqwt/cross_section.py guiqwt/curve.py guiqwt/debug.py guiqwt/events.py guiqwt/geometry.py guiqwt/histogram.py guiqwt/image.py guiqwt/interfaces.py guiqwt/io.py guiqwt/label.py guiqwt/panels.py guiqwt/plot.py guiqwt/pyplot.py guiqwt/qtdesigner.py guiqwt/qthelpers.py guiqwt/scaler.py guiqwt/shapes.py guiqwt/signals.py guiqwt/styles.py guiqwt/tools.py guiqwt/transitional.py guiqwt.egg-info/PKG-INFO guiqwt.egg-info/SOURCES.txt guiqwt.egg-info/dependency_links.txt guiqwt.egg-info/entry_points.txt guiqwt.egg-info/requires.txt guiqwt.egg-info/top_level.txt guiqwt/images/arrow_down.png guiqwt/images/arrow_up.png guiqwt/images/autorefresh.png guiqwt/images/axes.png guiqwt/images/center.png guiqwt/images/contrast.png guiqwt/images/copytoclipboard.png guiqwt/images/csapplylut.png guiqwt/images/csautoscale.png guiqwt/images/csection.png guiqwt/images/csection_a.png guiqwt/images/csection_oblique.png guiqwt/images/csperimage.png guiqwt/images/eliminate_outliers.png guiqwt/images/eraser.png guiqwt/images/export.png guiqwt/images/font.png guiqwt/images/full_range.png guiqwt/images/funct.png guiqwt/images/guiqwt.svg guiqwt/images/hcursor.png guiqwt/images/hflip.png guiqwt/images/imagestats.png guiqwt/images/item_list.png guiqwt/images/magnifier.png guiqwt/images/move.png guiqwt/images/on_curve.png guiqwt/images/point_selection.png guiqwt/images/print.png guiqwt/images/refresh.png guiqwt/images/sift.svg guiqwt/images/snapshot.png guiqwt/images/trash.png guiqwt/images/vcursor.png guiqwt/images/vflip.png guiqwt/images/xcursor.png guiqwt/images/xrange.png guiqwt/images/curvestyles/dots.png guiqwt/images/curvestyles/lines.png guiqwt/images/curvestyles/steps.png guiqwt/images/curvestyles/sticks.png guiqwt/images/curvetypes/xfy.png guiqwt/images/curvetypes/yfx.png guiqwt/images/items/annotation.png guiqwt/images/items/curve.png guiqwt/images/items/errorbar.png guiqwt/images/items/grid.png guiqwt/images/items/histogram.png guiqwt/images/items/histogram2d.png guiqwt/images/items/image.png guiqwt/images/items/label.png guiqwt/images/items/legend.png guiqwt/images/markers/cross.png guiqwt/images/markers/diamond.png guiqwt/images/markers/ellipse.png guiqwt/images/markers/hexagon.png guiqwt/images/markers/point.png guiqwt/images/markers/square.png guiqwt/images/markers/star.png guiqwt/images/markers/triangle_d.png guiqwt/images/markers/triangle_l.png guiqwt/images/markers/triangle_r.png guiqwt/images/markers/triangle_u.png guiqwt/images/markers/xcross.png guiqwt/images/markerstyles/cross_marker.png guiqwt/images/markerstyles/horiz_marker.png guiqwt/images/markerstyles/vert_marker.png guiqwt/images/mask/mask_circle.png guiqwt/images/mask/mask_circle_outside.png guiqwt/images/mask/mask_rectangle.png guiqwt/images/mask/mask_rectangle_outside.png guiqwt/images/mask/mask_tool.png guiqwt/images/patterns/bdiagpattern.png guiqwt/images/patterns/crosspattern.png guiqwt/images/patterns/dense1pattern.png guiqwt/images/patterns/dense2pattern.png guiqwt/images/patterns/dense3pattern.png guiqwt/images/patterns/dense4pattern.png guiqwt/images/patterns/dense5pattern.png guiqwt/images/patterns/dense6pattern.png guiqwt/images/patterns/dense7pattern.png guiqwt/images/patterns/diagcrosspattern.png guiqwt/images/patterns/fdiagpattern.png guiqwt/images/patterns/horpattern.png guiqwt/images/patterns/nobrush.png guiqwt/images/patterns/solidpattern.png guiqwt/images/patterns/verpattern.png guiqwt/images/scales/lin_lin.png guiqwt/images/scales/lin_log.png guiqwt/images/scales/log_lin.png guiqwt/images/scales/log_log.png guiqwt/images/shapes/circle.png guiqwt/images/shapes/ellipse_shape.png guiqwt/images/shapes/freeform.png guiqwt/images/shapes/gtaxes.png guiqwt/images/shapes/marker.png guiqwt/images/shapes/oblique_rectangle.png guiqwt/images/shapes/point_shape.png guiqwt/images/shapes/polyline.png guiqwt/images/shapes/rectangle.png guiqwt/images/shapes/segment.png guiqwt/images/styles/dash.png guiqwt/images/styles/dashdot.png guiqwt/images/styles/dashdotdot.png guiqwt/images/styles/dot.png guiqwt/images/styles/solid.png guiqwt/locale/guiqwt.pot guiqwt/locale/fr/LC_MESSAGES/guiqwt.mo guiqwt/locale/fr/LC_MESSAGES/guiqwt.po guiqwt/tests/__init__.py guiqwt/tests/benchmarks.py guiqwt/tests/brain.png guiqwt/tests/brain_cylinder.png guiqwt/tests/computations.py guiqwt/tests/contrast.png guiqwt/tests/contrast.py guiqwt/tests/cross_section.py guiqwt/tests/cross_section_oblique.py guiqwt/tests/cursors.py guiqwt/tests/customize_shape_tool.py guiqwt/tests/dicom_image.py guiqwt/tests/dotarraydemo.py guiqwt/tests/filtertest1.py guiqwt/tests/filtertest2.py guiqwt/tests/fit.py guiqwt/tests/fliprotate.py guiqwt/tests/fontparam.py guiqwt/tests/get_point.py guiqwt/tests/get_segment.py guiqwt/tests/highprecisionxy.py guiqwt/tests/hist2d.py guiqwt/tests/hist2d_func.py guiqwt/tests/histogram.py guiqwt/tests/image.py guiqwt/tests/image_masked.py guiqwt/tests/image_plot_tools.py guiqwt/tests/image_rgb.py guiqwt/tests/imagefilter.py guiqwt/tests/imagesuperp.py guiqwt/tests/imagexy.py guiqwt/tests/loadsaveitems_hdf5.py guiqwt/tests/loadsaveitems_pickle.py guiqwt/tests/loadtest.py guiqwt/tests/manager.py guiqwt/tests/mandelbrot.py guiqwt/tests/mr-brain.dcm guiqwt/tests/pcolor.py guiqwt/tests/plot.py guiqwt/tests/plot_log.py guiqwt/tests/plot_yreverse.py guiqwt/tests/png_test.py guiqwt/tests/polygons.py guiqwt/tests/pyplot.py guiqwt/tests/qtdesigner.py guiqwt/tests/qtdesigner.ui guiqwt/tests/resize.py guiqwt/tests/rotatecrop.py guiqwt/tests/sift.py guiqwt/tests/simple_dialog.py guiqwt/tests/simple_window.py guiqwt/tests/styles.py guiqwt/tests/syncplot.py guiqwt/tests/test.png guiqwt/tests/test1.u8.png guiqwt/tests/test2.u8.png guiqwt/tests/test_line.py guiqwt/tests/transform.py guiqwt/widgets/__init__.py guiqwt/widgets/base.py guiqwt/widgets/fit.py guiqwt/widgets/fliprotate.py guiqwt/widgets/resizedialog.py guiqwt/widgets/rotatecrop.py qtdesigner/imageplotplugin.py qtdesigner/plotplugin.py sift/create_exe.py sift/sift.ico sift/sift.pyw src/arrays.hpp src/debug.hpp src/histogram2d.c src/histogram2d.pyx src/mandelbrot.c src/mandelbrot.pyx src/pcolor.cpp src/points.hpp src/scaler.cpp src/scaler.hpp src/traits.hpp././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626336.0 guiqwt-4.0.1/guiqwt.egg-info/dependency_links.txt0000666000000000000000000000000100000000000017007 0ustar00 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626336.0 guiqwt-4.0.1/guiqwt.egg-info/entry_points.txt0000666000000000000000000000011400000000000016233 0ustar00[gui_scripts] guiqwt-tests = guiqwt.tests:run sift = guiqwt.tests.sift:run ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626336.0 guiqwt-4.0.1/guiqwt.egg-info/requires.txt0000666000000000000000000000016200000000000015340 0ustar00NumPy>=1.3 SciPy>=0.7 guidata>=2.0.0 PythonQwt>=0.5.0 Pillow QtPy>=1.3 [DICOM] pydicom>=0.9.3 [Doc] Sphinx>=1.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626336.0 guiqwt-4.0.1/guiqwt.egg-info/top_level.txt0000666000000000000000000000000700000000000015470 0ustar00guiqwt ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.4704885 guiqwt-4.0.1/qtdesigner/0000777000000000000000000000000000000000000012074 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/qtdesigner/imageplotplugin.py0000666000000000000000000000067600000000000015657 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ imageplotplugin =============== A guiqwt image widget plugin for Qt Designer """ from guiqwt.qtdesigner import create_qtdesigner_plugin Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget", icon="image.png") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/qtdesigner/plotplugin.py0000666000000000000000000000066300000000000014650 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2010 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ plotplugin ========== A guiqwt plot widget plugin for Qt Designer """ from guiqwt.qtdesigner import create_qtdesigner_plugin Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget", icon="curve.png") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.5017366 guiqwt-4.0.1/setup.cfg0000666000000000000000000000005200000000000011545 0ustar00[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/setup.py0000666000000000000000000002060200000000000011441 0ustar00# -*- coding: utf-8 -*- # # Copyright © 2009-2015 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """ guiqwt ====== Copyright © 2009-2015 CEA Pierre Raybaut Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) """ # Building extensions: # python setup.py build_ext -c mingw32 --inplace import setuptools # analysis:ignore import numpy import sys import os import os.path as osp import subprocess from numpy.distutils.core import setup, Extension from guidata.utils import get_subpackages, get_package_data, cythonize_all LIBNAME = "guiqwt" from guiqwt import __version__ from guiqwt import __description__ # Remove module from list to allow building doc from build dir del sys.modules["guiqwt"] LONG_DESCRIPTION = """\ guiqwt: Python tools for curve and image plotting ================================================= .. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png See `documentation`_ for more details on the library and `changelog`_ for recent history of changes. Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the `CECILL License`_. .. _documentation: https://guiqwt.readthedocs.io/en/latest/ .. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md .. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt Overview -------- Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve plotting Qwt C++ library, included in guiqwt base source code) and on the scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing efficient 2D data-plotting features (curve/image visualization and related tools) for interactive computing and signal/image processing application development. It is based on Qt graphical user interfaces library, and currently supports both ``PyQt5`` and ``PySide2``. Extension to `PythonQwt`_: * set of tools for curve and image plotting * GUI-based application development helpers .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt Building, installation, ... --------------------------- The following packages are **required**: `PyQt5`_, `PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_. .. _PyQt5: https://pypi.python.org/pypi/PyQt5 .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt .. _guidata: https://pypi.python.org/pypi/guidata .. _NumPy: https://pypi.python.org/pypi/NumPy .. _SciPy: https://pypi.python.org/pypi/SciPy .. _Pillow: https://pypi.python.org/pypi/Pillow See the `README`_ and `documentation`_ for more details. .. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md """ KEYWORDS = "" CLASSIFIERS = ["Topic :: Scientific/Engineering"] if "beta" in __version__ or "b" in __version__: CLASSIFIERS += ["Development Status :: 4 - Beta"] elif "alpha" in __version__ or "a" in __version__: CLASSIFIERS += ["Development Status :: 3 - Alpha"] else: CLASSIFIERS += ["Development Status :: 5 - Production/Stable"] def build_chm_doc(libname): """Return CHM documentation file (on Windows only), which is copied under {PythonInstallDir}\Doc, hence allowing Spyder to add an entry for opening package documentation in "Help" menu. This has no effect on a source distribution.""" args = "".join(sys.argv) if "--no-doc" in sys.argv: sys.argv.remove("--no-doc") return if ( os.name == "nt" and ("bdist" in args or "build" in args) and "--inplace" not in args ): try: import sphinx # analysis:ignore except ImportError: print( "Warning: `sphinx` is required to build documentation", file=sys.stderr ) return hhc_base = r"C:\Program Files%s\HTML Help Workshop\hhc.exe" for hhc_exe in (hhc_base % "", hhc_base % " (x86)"): if osp.isfile(hhc_exe): break else: print( "Warning: `HTML Help Workshop` is required to build CHM " "documentation file", file=sys.stderr, ) return doctmp_dir = osp.join("build", "doctmp") if not osp.isdir(doctmp_dir): os.makedirs(doctmp_dir) fname = osp.abspath(osp.join(doctmp_dir, "%s.chm" % libname)) if osp.isfile(fname): # doc has already been built return fname subprocess.call("sphinx-build -b htmlhelp doc %s" % doctmp_dir, shell=True) subprocess.call('"%s" %s' % (hhc_exe, fname), shell=True) if osp.isfile(fname): return fname else: print("Warning: CHM building process failed", file=sys.stderr) CHM_DOC = build_chm_doc(LIBNAME) def _create_script_list(basename): scripts = ["%s-py%d" % (basename, sys.version_info.major)] if os.name == "nt": scripts.append("%s.bat" % scripts[0]) return [osp.join("scripts", name) for name in scripts] SCRIPTS = _create_script_list("guiqwt-tests") + _create_script_list("sift") try: import sphinx except ImportError: sphinx = None # analysis:ignore def is_msvc(): """Detect if Microsoft Visual C++ compiler was chosen to build package""" # checking if mingw is the compiler # mingw32 compiler configured in %USERPROFILE%\pydistutils.cfg # or distutils\distutils.cfg from distutils.dist import Distribution dist = Distribution() dist.parse_config_files() bld = dist.get_option_dict("build") if bld: comp = bld.get("compiler") if comp is not None and "mingw32" in comp: return False # mingw is the compiler return os.name == "nt" and "mingw" not in "".join(sys.argv) CFLAGS = ["-Wall"] if is_msvc(): CFLAGS.insert(0, "/EHsc") for arg, compile_arg in ( ("--sse2", "-msse2"), ("--sse3", "-msse3"), ): if arg in sys.argv: sys.argv.pop(sys.argv.index(arg)) CFLAGS.insert(0, compile_arg) # Compiling Cython modules to C source code: this is the only way I found to # be able to build both Fortran and Cython extensions together # (this could be changed now as there is no longer Fortran extensions here...) cythonize_all("src") setup( name=LIBNAME, version=__version__, description=__description__, long_description=LONG_DESCRIPTION, packages=get_subpackages(LIBNAME), package_data={ LIBNAME: get_package_data(LIBNAME, (".png", ".svg", ".mo", ".dcm", ".ui")) }, data_files=[(r"Doc", [CHM_DOC])] if CHM_DOC else [], install_requires=[ "NumPy>=1.3", "SciPy>=0.7", "guidata>=2.0.0", "PythonQwt>=0.5.0", "Pillow", "QtPy>=1.3", ], extras_require={ "Doc": ["Sphinx>=1.1"], "DICOM": ["pydicom>=0.9.3"], }, entry_points={ "gui_scripts": [ "guiqwt-tests = guiqwt.tests:run", "sift = guiqwt.tests.sift:run", ] }, ext_modules=[ Extension( LIBNAME + ".histogram2d", [osp.join("src", "histogram2d.c")], include_dirs=[numpy.get_include()], ), Extension( LIBNAME + ".mandelbrot", [osp.join("src", "mandelbrot.c")], include_dirs=[numpy.get_include()], ), Extension( LIBNAME + "._scaler", [osp.join("src", "scaler.cpp"), osp.join("src", "pcolor.cpp")], extra_compile_args=CFLAGS, depends=[ osp.join("src", "traits.hpp"), osp.join("src", "points.hpp"), osp.join("src", "arrays.hpp"), osp.join("src", "scaler.hpp"), osp.join("src", "debug.hpp"), ], ), ], author="Pierre Raybaut", author_email="pierre.raybaut@gmail.com", url="https://github.com/PierreRaybaut/%s" % LIBNAME, license="CeCILL V2", classifiers=CLASSIFIERS + [ "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python :: 3", ], ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1640626339.4704885 guiqwt-4.0.1/sift/0000777000000000000000000000000000000000000010674 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640594362.0 guiqwt-4.0.1/sift/create_exe.py0000666000000000000000000000214400000000000013353 0ustar00#!/usr/bin/env python # -*- coding: utf-8 -*- # # Setup script for distributing SIFT as a stand-alone executable # SIFT is the Signal and Image Filtering Tool # Simple signal and image processing application based on guiqwt and guidata # (see guiqwt/tests/sift.py) """Create a stand-alone executable""" try: from guidata.disthelpers import Distribution except ImportError: raise ImportError("This script requires guidata 1.4+") # Importing modules to be bundled from guiqwt.tests import sift def create_executable(): """Build executable using ``guidata.disthelpers``""" dist = Distribution() dist.setup( name="Sift", version=sift.VERSION, description="Signal and Image Filtering Tool", script="sift.pyw", target_name="sift.exe", target_dir="%s-%s" % ("Sift", sift.VERSION), icon="sift.ico", ) dist.add_modules("guidata", "guiqwt") dist.excludes += ["IPython"] # Building executable dist.build("cx_Freeze", create_archive="move") if __name__ == "__main__": create_executable() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/sift/sift.ico0000666000000000000000000030513000000000000012337 0ustar00 =f (=00 %F  k h| hPNG  IHDR\rf=QIDATx`րOz#JB!B$(C}*>}>i,X*EB zKHeseʝs {={3s (HE///B.Ӵ0}<~ -i߄AO``|7@%mHT!F}9#V;*EhGF5hCҒbDZXlnձ쯯踯P碾3@;bRQ.BCsjЄ ?//}X>ORB 09Y&$mzFGGg^)b땡\{Qzy?H#z^&$mQX;'qՃ Qzq?oB -d9> "L^\9KenIK!7VCG5X DZH\^٩b$KShmtkx>]Y;`+dzN>QM^Tj .kUitZ7q6Ae]Y7;_K_;_ h0TlTr%^P?\POz./%4T_>Tu.V(UG{}j|+vt%Kʥ.P%yCu4Moj%8^m\X(B@QWr?: =0Pھ}'>rI'`=Gl_ Z*/}>}%8ޝo=DȽxN,| )BKC[ n%MTixX5]zB7d A<Vzcnb#'`d.k{Elb Sj0/ס3B rgQNk;@`;/ qLۨ&/Z$Kpب79GeMZE_ Nj`]6\pYUG^0`A}7l {_-+ST]5X%8*s&kbIWjpZǰ' #p T<0 ұN|bಎ ס@j/$P 0ju _}%9X`u@@8~qr0k뿶gOOnhiOuչȰ8?k@#<׿gOP;Yq2/lsl|Ў`- 5Me#,)u-NMtTp!kzb{7toã\0$LёS Ffd)% :cm|OuX)@'Yw$Oa~e`%%TCNuk@.)l@&C|C_==Kĉ096b6؆J@v<y _LjUv'oa$5 V)>ydgb94JHjUL7 !pQ E5Fa0_ d*|ŤuTݓ_` 1mo ׅvԲ{H0mp msA`a c믨\5íO\ f B2(Lp P}Q>|H!,'p: ba`(nU6Q"~@ިGA5̛x٫/9|W?'|oA a2O*e19W]̄ uGu{|o43Ӂղ\@w VԿzŬ½ۘxrw?ip˭AJ PBի2]7c]Rc|[<h]]×u,Nc#޾G[x &8O](ڭ2OſK(-] ,fk>Qɥ12`c +N($c1!pUڕ<ƛ\}f qVZ=nf&v͙ե{XFzmӰ_r 8EA1B)d 0*ujc VP;֧pR|XDZm8B_i-S\<$N-hLshd zϦ.mcW}^WD@I dqվ5x&j :@]W ^ F hK<ȴQ ]46_<71B83|_S͡ߚ߉z;"mO/ /Q`ʵ1r@ezjw,ti4ߟ˙m? }@TD$Gq 4ވkc!0pevX>P.o*8ȗ)Q@#BpOΔ# 198Cwn2t\(YIJX::r@ *!Umf)]1;D@ $͟ ,&N אԸ45 prY!\) :HMGRc ƪ1c@- >R6ݫc v4HrG#ewю<OL̻Z޴zuU(`%G/o@);ή.¿b>`GdX 0hYv|4xD!I}VNXK?a yBj]7 #>JrS a0t`"P,P^X ve40!-p" 4,օnv1,Sa i >ӫ0Pݣ`)vC)] 9f:c% ^P]aT`S嶷3 rΗ ?H) +@8PS,Ҷ$ !1/XYZ J~XQ}T Ain S'Kaٮ+-S@v8hQTDnޫ"hfe>]U@{$͙s%&)-8{wG:~p? rQ@o0xCHE1T,hVr= #~;1Y<,6~6mUq)jp]Jh8 .TwkuF퍎%Ppf x `'&T \3Bޫ,}``i03M`wT_]3w t:oàܓZU*o~@7jDғbNA7j46R 9-Kn~PͣL@HlWz-DOår6nre` x(Ls:ƷE+1 UdtShF;Yt9/a(/`U~l6\okoP x`S ? ݊2'KJV{{cyoZ h Xu(w|rJA64mF`>hN}g 0"X @(̣9@%!!K8n0x"88^ 'j4M\m !Ue@Xnʫ4hIۓ7ƂE+8xp~cp?0 ~h>*|60u2a\m ǿ01@\y  !B``m\g܅; @<˛'Z` ^-eC@kj!pN@,NtwǦ.mWWɷ-=CءnO0[U SsAͪ""?+b& ҃㟶'<k җ΂azM&RtZ05@˶.%|x18\#A Z=w:, Zg^O@fP$,k^ ?tcr(`3`cgqi_ARg8(.o*i&}tD 8^K"؝ ?k@&cqG4XeO2v\ۀ-v YgmoیJ^gBm?qk RO=[_&NskAHG7S&߆brXuaV!LhR  GP@!b y6wBq^nlzDa\w t,3yV%Y9"Apx@ DÀ/=]}6ubM@|j6A4xM||O/h;ބ䢳J?`A [F@ػ?K>VBz=>e4l'9}9A sA]s^X=8`#Fh9RuC| FmcXHpP@ 4U k.y-/݅ "`y1^K[9#h״< (<}BE` A Zh O6c/ k.F <`4='jmEP u[>Jx-op@(B?qA@ t+R9ƂEK4g $Ʋ'`mp%M!hDqyJ Z!p`'.H9@P}sr\ W‘/rSÿ/;=e>~.פ,&4Hŗ\% pAW@ X35 1w KrB>ܩV eu ^R3QEJxOqA@ m( 4wпbg= mh10|[2UvJnr t})X7 29 <۠5ֻv^6L\6,t(}L_#q47eMuK+i輼.ߟeĖzNSHeǔ0".hJs /o/H988b5#xh 왕?}"ǁt3`srx%{q1eB$ B'w%;XhA(y'hU=lo`tl#/T#37qA4A 4"`aN1@]} >\Vb\hbt5i'0siĢcФ"GEpDB 8:lco;;sܣT( 0y1 ^^@6\e7J~9X9@hPjs$9gS?q*t pX s ƣ P $(B0A 4[[na\`  ʱKs ц@T<0;n+qr7"'T>P˼},T9C@YE5wZL,t5?t!xM26L\ڰb^>/dc! CCk ]U_w5Jdce2cBJ c0.jBNb]]s1R`+wD8ؠ+k؍U^-!]% XGsz2bxpr v۾^w5`cp))!ؼ" b^> .c1A 4 O}s:,0}yn}f,om/ ,XNsoƏ48/` k>Q#VtzD'x;ZֆK[Ê/@-@>?/@ b'6Qwe ڶB9@8hl ٹ={:ͼS ?u;H H(@G0 ?b f\ C{ tk@<j5[%~rm}%л* JX  B:(QO{sb˩ S= W_i NX8Hs.5=6?Yn)O'jbX9xڰ3K@_q?  i1\/ VA(y8s]'jOݦ@NP9\RJ/^5 BGs/_ogQJLW'j@|kz \RJ.*1 pG_ZS_I A@pt8l2n@m'Ӏ{2Ղ]&<Tr:)B&Qu_52[9,Âʲ*X?׏y{s[VC2N_ |eNj4t|=4Lj cP7b)rO}1H.Trr!SвI]uyQRZLÿTw͝P^-O?'`CM Wxb+;m/  S&F@~;hs?ggL%*Ӡ :R A5J9Z T 08cP{Mxm<KOQ`MxJ Jo\@iW_ o W)׃N(1tA]fj7` OZ46l` ,]ppÓE*z *'T!ul 2-82)%~Nӫ6zϦm_60UT)v ;R <6L'R^Օb@STfO@-Ac}[9D-Xq,܈hH% |%o*_\l4P |h 1:z|wi;[^P']d<z/V `jR϶[;dKA &=÷ `m+ 29D (9x 'ڰ>lU̼ kli 1@t]V(p3?ϰ;pk1g7"P <kWôCX &b nJ3hLs`b0ګ,ƉWO'iٰZȆm}WزL[t8Xa wq{4!Avu[{`r׎J%ة +9},D\A 6aiל>\vx=^Xu"ܩM%0 7_O },Y Nc "'sϦ.ߞ U *oX% $JH `5< ::a*(oc8DȪ^VO:8!(4a?>ݭ JwHt: Q |Xߑ߀gLP9x6,0`ܽ+a?>"|}/;@(>_q) >:NS:vwC*t5=O XjA "B]s`n;'<z4@ E@9;_7u@=fz (76J[@UP KLjn[[ֻBE@;D%͞`ѨVR? IK@|upXp,8,1|ddֆUݧ7 $)8DEԶ9wH ۾1c -j`88 hԞ-N%ah9% =ɪd€{@`Mq7&WHu( : RCkJ@AlGd] }yXޝC_7SEX?ES <6,0cacBhTDBv+DwCݳ&<OUW2!8D W~;B=m`s {;*u)`!`#LFX  xpWp⛻pqM @_B̆:6LօU9) ǎ@&?y .^QMpdpχS*4;ZZ'ޅG GS$w*+sm@N2܁?D!y!O R08E&3i{] c @{!i:&,/g@YAy,ux OK |,/@}oPTAtr`2 o@ qoOo@inmP"*|`W[uu269xY7("@6F B͌螑wן.]vx̷@mP"nh>>P ,:~)?H_J{6F0Z]" M!qG"3+݁G oSp(7i֋Z tT&eY0>Rp |yq>^zD'D@gUUp3=.eBbN%`}DшZ%_ +=Ep"~E5\0iS1!T" @YN*ePxT?mPȅ?K NN0rI֥ Ep"QM; a]Tϵ [[LmpHL* E0N 4cOi8,6cXN9/|6rx9sSTD_' al@{Jo]Q\K*0.AEo ҵA ȌBގ+v* [ *%{m&_ eu@6T5H%pWl 9x6ֹQ,&ftRa@'6x4H% t $/e*0!<$染tRM P A J\F΂Cq-dT^0@3@n"#4cO& *"ː7yvQ{0/ww0"WP_Wp=j8#^BͷLܹ-] !{jƞL6?Gdݸq}9D m(Gj-2A,='rMD.5) ~9e ?yX:Ohz#j/z@ , P /7(Vș0@> Z:w9P/Y#TY7vP}oPs~A@! 99P/|m?@e ݵ_H/q= @n(i?V^ s|00ǝQ-j 1_ )l"%A͝?*P"AEOLa ( =@;? "0vNx6%=]ugQ-vSA1w2i޼6L 8 /G T$ic`b1FXbκE7 I('m_HZ&DRW'G//5ǂDpo*_$ca@!&~YR9Pc[ @nT|%?b{G\jU=yI,6S1>F'HjX1Wi"x%A2My<-d SWe#&6j@`Q#!Hꍨy. kYӸq_ .쌺+ L0L5cǴz*\ȚMpbK#+aJdf]ß\: K/L'n&?DHIENDB`( !!D""{##$$%%&&&&''(())**++,,--f..% !!""##$$%%&&&&''(())**++,,--..////00D11k !!""##$$%%&&&&''(())**++,,--..////001122~33 ` !!""##$$%%&&&&''(())**++,,--..////0011223344q55E !!""##$$%%&&&&''(())**++,,--..////00112233445566[ !!""##$$%%&&&&''(())**++,,--..////001122334455667788TT UUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmm % !!""##$$%%&&&&''(())**++,,--..////00112233445566778888TTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmJ !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899(TTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnn(T !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::'TTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnp^ !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;TTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnc !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<TTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoo D !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<TT UUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooI& !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==XUUjVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoo !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>UUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoo !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>VVSWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoopp!g !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>??/WWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppi  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>??WW;XXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoopp   !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????WXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq k  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@XX'YYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq,   !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@_YYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq^  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@YYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AA:ZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AAI(I]H|GFE׵EδDCaB+AZZ]ZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr 1  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBLKPJIIHGFEDDCBA~@}@ZZ ZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr)  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBMMxLᾌKJIHHGFEDDCBA~@}?|?fZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr[   !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBCCÐNAMLLKJIHGGFEDCCBA~@}?|>q`[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBCCCŒPđOÐNŽMLLKJIHGGFEDCBBA~@}?{>z>e_\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBCCƓPőOĐOÏNMLKKJIHGFFEDCBB~A}@|?{>z=jy\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrrssc  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBCCDDǓQ9ƒPőOĐONMLKJJIHGFFEDCBA~A}@|?{>z=uL\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrrss&  !!""##$$%%&&&&''(())**++,,--..////0011223344556677888899::;;<<==>>????@@AABBCCzeYǓQƒPőOÐNNMLKJIIHGFEEDCBA~@}@|?{>z=y>????@@AABBCChǓQƒPđOÐNMMLKJIIHGFEDDCBA~@}@|?{>z=y>????@@AABBCCYQǓQƒPđOÐNMMLKJIHHGFEDDCBA~@}?|?{>z=y>????@@AABBCCDD`ŒPđOÐNMLLKJIHHGFEDCCBA~@}?|>{>z=x>????@@AABBCCDDo}ŒPđOÐNŽMLLKJIHGGFEDCBBA~@}?{>z>y=x>????@@AABBCCDDk\őOĐOÏNMLKKJIHGFFEDCBBA}@|?{>z=y=x>????@@AABBCCDDOKőOĐOÏNMLKJJIHGFFEDCBA~A}@|?{>z=y=x>????@@AABBCCDDEE^ĐNNMLKJJIHGFEEDCBA~A}@|?{>z=y>????@@AABBCCDDEEutÐNNMLKJIIHGFEDDCBA~@}@|?{>z=y>????@@AABBCCDDEEydÐNMMLKJIHHGFEDDCBA~@}?|?{>z=y>????@@AABBCCDDEE\SÐNMLLKJIHHGFEDCCBA~@}?|?{>z=y>????@@AABBCCDDEEGGSMLLKJIHGGFEDCCBA~@}?|>z>y=x>????@@AABBCCDDEEFF|iŽMLKKJIHGFFEDCBBA}@|?{>z=y=x>????@@AABBCCDDEEFFkMLKJJIHGFFEDCBA~A}@|?{>z=y=x>????@@AABBCCDDEEFFj[MLKJJIHGFEEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFOLMLKJIIHGFEEDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGG]LKJIIHGFEDDCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGstLKJIHHGFEDCCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGwcLKJIHGGFEDCCBA~@}?|>z>y=x>????@@AABBCCDDEEFFGG\SKKJIHGGFEDCBBA~@|?{>z>y=x>????@@AABBCCDDEEFFGGHHQKJIHGFFEDCBA~A}@|?{>z=y=x>????@@AABBCCDDEEFFGGHH{eJJIHGFEEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFGGHHowJIIHGFEEDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHxcJIIHGFEDDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHcXJIHHGFEDDCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHOLJIHGGFEDCCBA~@}?|>{>y=x>????@@AABBCCDDEEFFGGHHHHUIHGGFEDCBBA~@|?{>z>y=x>????@@AABBCCDDEEFFGGHHHHxgIHGFFEDCBA~A}@|?{>z=y=x>????@@AABBCCDDEEFFGGHHHHlyIHGFFEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHtaIHGFEEDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHHH`VIHGFEDDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHMKIHGFEDDCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIWHGFEDCCBA~@}?|>{>z=x>????@@AABBCCDDEEFFGGHHHHIIuiGGFEDCBBA~@}?{>z>y=x>????@@AABBCCDDEEFFGGHHHHIIj|GFFEDCBB~A}@|?{>z=y=x>????@@AABBCCDDEEFFGGHHHHIIp_GFFEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHII\TGFEEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIKJLFEDDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJwbFEDDCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJjyFEDCCBA~@}?|>{>z=x>????@@AABBCCDDEEFFGGHHHHIIJJm^FEDCBBA~@}?{>z>y=x>????@@AABBCCDDEEFFGGHHHHIIJJVQFEDCBBA}@|?{>z=y=x//0011223344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKREDCBA~A}@|?{>z=y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKriEDCBA~A}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKK|eDDCBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKKeYDDCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKKPNFCCBA~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKKLLv^CCBA~@}?|>z>y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLubCBBA}@|?{>z=y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLRPHBA~A}@|?{>z=y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMnmBA~A}@|?{>z=y`___``aabbccccddeeffgghhiijjkkllllmmnnooppqqrrssttv 3_gfedcba_^]\[ZYXWVUSRQPONMLK4K11223344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMfZBA~@}@|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNyRA~@}?|?{>z=y11223344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNN}f}A~@}?|?{>z=y>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNRQwT~@}?|>{>y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOaX|D|?{>z>y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPdZwL{>z=y=x>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQYUhuwFy>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRUTcZm_n`]YXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrrss Xfedcba`^]\[ZYXWVUTRQPONMLKH233344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr Gfedcba`_^\[ZYXWVUTSQPONMLKJ6P3344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr 6efedcba`_^]\ZYXWVUTSRQONMLKJ>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr5 %9gfdcba`_^]\[YXWVUTSRQPOMLKJA3344556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqrr bfedba`_^]\[ZYWVUTSRQPONMKJH3744556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqu Rfedca`_^]\[ZYXVUTSRQPONMLJI9b44556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqqOS Afedcb`_^]\[ZYXWVTSRQPONMLKJ@44556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppqq 1 0Tfedcba`^]\[ZYXWVUTRQPONMLKJG45556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoopp (fedcba`_^\[ZYXWVUTSQPONMLKJI8Y556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooppj Wedcba`_^][ZYXWVUTSRQONMLKJI?556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoopp ?zedcba`_^]\[YXWVUTSRQPNMLKJIE556677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnoo &9fecba`_^]\[ZYWVUTSRQPONLKJIH8O6677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnooO Yedca`_^]\[ZYXVUTSRQPONMLJIH>6677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnnood Aedcb`_^]\[ZYXWVTSRQPONMLKJHE6677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnn[8 )@edcba`^]\[ZYXWVUSRQPONMLKJIG*6677888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmnn [dcba`_]\[ZYXWVUTSQPONMLKJI166:77888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmmg 0QĪdcba`_^][ZYXWVUTSRQONMLKJ977888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllmm ^&cba`_^]\[YXWVUTSRQPNMLKB77`888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllllrN Ncba`_^]\[ZXWVUTSRQPONL)77888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkllll  a `_^]\[ZYXVUTSRQPON888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkll~ "_ ^g]\[ZYXWUTSRQsP888899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkll \[:ZWYtXWVeU/S88d99::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijjkkXd 8899::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijj) c995::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiijj  ::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhiih  b::;;<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghhz  !!;;M<<==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgghh =  !!a<>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffgg"  !!""==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeffF  !!""a==>>????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddeeOW  !!""##>> ????@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccddQ  !!""##?? ??@@AABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbccccS  !!""##$$0@@vAABBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabbcc6 o  !!""##$$%%AADBBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``aabb "  !!""##$$%%aBBCCDDEEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__``qaa  !!""##$$%%&& DD3EEFFGGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]^^__  !!""##$$%%&&(FF5GGHHHHIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZ[[\\]]- 9  !!""##$$%%&&(HH!HHgIIJJKKLLMMNNOOPPQQQQRRSSTTUUVVWWXXYYZZZZk[[   !!""##$$%%&&(JJKK8LL}MMNNOOPPQQQQRRSSTTUUVVWWXXLYY  !!""##$$%%&&(QQRRSS??????|p`?????????(0` H!!""%%''**++--q11?a ""%%''**,,..113355  ""%%''**,,..11335588dUUWWYY\\^^aacceeiijjmm ""%%''**,,..11335588::|UUWWYY\\^^aacceehhjjmmoo. ""%%''**,,..11335588::::0VVbWWYY\\^^aacceehhjjmmool ""%%''**,,..11335588::==++WWYY\\^^aacceehhjjmmpp S ""%%''**,,..11335588::==@@WWIYY\\^^aacceehhjjmmoo  ""%%''**,,..11335588::==??@@YY\\^^aacceehhjjmmooqq$ o  ""%%''**,,..11335588::==??BBmՀUI^HFB@PZZ]\\^^aacceehhjjmmooqqa  ""%%''**,,..11335588::==??CCMSL罊JGECA{E]\^^aacceehhjjmmoopph  ""%%''**,,..11335588::==??BBCC*ƑQkNKIGEC~A{>wf^^aacceehhjjmmoopp  ""%%''**,,..11335588::==??BBm]ŒPMKIGEB~@{>qZ^^aacceehhjjmmooqqoo   ""%%''**,,..11335588::==??BBRMőOMKIFDB}@{>x[XURG*+,,..11335588::==??BBDD]TLJGECA|?y=v:r>bacceehhjjmmooqqttE ([[XURP3W,,..11335588::==??BBDDGGQIGEC~A{>y_\YVSP@,,..11335588::==??BBDDFF{fIGEB~@{>xxyxxx;u9r7mCaacceehhjjmmooqqtt )Ffc`]ZWTQNH11335588::==??BBDDFFIIKKlqB}?z=w;t9r7i_aacceehhjjmmooqqtt #7fc`]ZWTQOL4E335588::==??BBDDFFIIKKm]A|?z=w;t9q6scaacceehhjjmmooqqtty )fc`^[XUROL9h335588::==??BBDDFFIIKKRP~C|?y=v:t8lS^^aacceehhjjmmooqqttO ada^[XUROL>335588::==??BBDDFFIIKKMM}e}|?y  ""&&UUHH'LLTOOQQUU~VVYYY(?? |?( @  r!!##((++//11CN!!$$((++//3366@@ RRVVZZ^^bbeeggkkr!!$$((++//3366::SS"VVZZ^^aaeehhlloo.G!!$$((++//3366::>>tUUZZ^^aaeehhllqqj !!$$((++//3366::==AA'WWIZZ^^aaeehhllpp w!!$$((++//3366::==@@J4FcEZZ^^aaeehhllpp !!$$((++//3366::==AA@@NiKHEAlv^^aaeehhllppww < !!$$((++//3366::==AAp{ÐNKGDAyAc`aaeehhllppssY !!$$((++//3366::==AAtaNJGD~@z=|haaeehhllppssx  !"$$((++//3366::==AAUNŽMJFC}@y=meaaeehhllppttM 9uQM/J++//3366::==AADDVIFC}?yw;s8ndeehhllppss  0b^YUQE//3366::==AADDUPGDA{>v:r7reeehhllppss 'Bc^ZVQL/03366::==AADDHHMD~@z=v:q7qdeehhllppss +Kc_[VRM3H3366::==AADDHHxaC~@y=u9q6ndeehhllppss +Jd`[WRN8f3366::==AADDHHh}C}@yw;r0~????(0 a!!&&++00337!!&&++004499xVV[[^^ddiinny !!&&++004499>>BWW[[__ddiioo!!&&++004499==33SS([[__ddiinn?!!&&++004499>>BBMŗQK}FBa^__ddiinnqq? !!&&++004499>>JGĐO۽JFAr]__ddiinnss| !!&&++004499>>FEQJEAy>CC~eIE~@x>CCm{HD}@w;wfddiinnss 0Y]WR8r004499>>CCn^HC|?w;htddiinnss ?^XRD004499>>CCYRGC|>v:j`ddiinnss J_YSK014499>>CCHHJB{>u9kXddiinnss N`ZTN3F4499>>CCGGy\Bz=t9i`ddiinnss Ia[UO8d4499>>CCGGizAy=t8~fuddiinnss >za\VP=4499>>CCGGeY~@x>CCGGMMsYx;lX__ddiinnss '>c]WQJ4499>>CCGGLLQQi^\[__ddiinnrrg  d^XRL7R99>>CCGGLLQQVV[[__ddiinnxx V_YSM>99>>CCGGLLQQVV[[__ddiimmh )@`ZTNDD99>>CCGGLLQQVV[[__ddiiooG% ?y9\dVhU::>>CCGGLLQQVV[[__ddiiĀ "";; >>CCGGLLQQVV[[__ddcc !! >>-CCGGLLQQVV[[__ff Y!!''U@@GGdMMQQVV\\HmmAAAAAAAAAAAAAAAAAAAA AAAA(   ""**2299(WW&\\@dd@ii?""**118833 VVw\\ccjjrr&""**1188??uĉN rm1\\ccjjqqc ""**1188??빉Y{ICtfccjjqqk ""**1188??utHBp\ccjjqq 8qO1O1188??wcGAsIccjjqq YVA1188??\SG~@u:ecjjqq &`WM1188??HGH|?t8idjjqq 0aYP4D88??FFy[{>s8fdjjqq bZQ8d88??FFhyz=oFccjjqq [[R>88??FF[TqWqbccjjpp P\TE88??FFMMUU\\ccjjrri 8h]UL8 class PixelIterator { public: typedef typename Image::value_type value_type; PixelIterator(Image& _img): img(_img), cur(_img.base) { } value_type& operator()() { check_img_ptr("pixeliter:",cur,out,img); return *cur; } value_type& operator()(int dx, int dy) { return *(cur+dy*img.si + dx*img.sj); } void move(int dx, int dy) { cur += dy*img.si + dx*img.sj; } void moveto(int x, int y) { cur = img.base + y*img.si + x*img.sj; } protected: Image& img; value_type* cur; value_type out; }; template class Array1D { public: typedef T value_type; // The type of pixel data from the image class iterator : public std::iterator { public: iterator():pos(0L),stride(0) {} iterator(const Array1D& arr):pos(arr.base),stride(arr.si) {} iterator(const iterator& it, int n=0):pos(it.pos),stride(it.stride) {*this+=n;} T& operator*() { return *pos; } const T& operator*() const { return *pos; } T& operator[](int n) { return *(pos+n*stride); } const T& operator[](int n) const { return *(pos+n*stride); } iterator& operator+=(int n) { pos+=stride*n;return *this; } int operator-(const iterator& it) { return (pos-it.pos)/stride; } iterator operator+(int n) { return iterator(*this,n); } iterator operator-(int n) { return iterator(*this,-n); } iterator& operator=(const iterator& it) { pos=it.pos;stride=it.stride;return *this; } iterator& operator++() { pos+=stride; return *this; } iterator& operator--() { pos+=stride; return *this; } iterator operator++(int) { iterator it(*this);pos+=stride; return it; } iterator operator--(int) { iterator it(*this);pos+=stride; return it; } bool operator<(const iterator& it) { return pos class Array2D { public: typedef T value_type; // The type of pixel data from the image Array2D() {} Array2D(PyArrayObject* arr) { base = (value_type*)PyArray_DATA(arr); ni = PyArray_DIM(arr, 0); nj = PyArray_DIM(arr, 1); si = PyArray_STRIDE(arr, 0)/sizeof(value_type); sj = PyArray_STRIDE(arr, 1)/sizeof(value_type); } Array2D( value_type* _base, int _ni, int _nj, int _si, int _sj): base(_base), ni(_ni), nj(_nj), si(_si/sizeof(value_type)), sj(_sj/sizeof(value_type)) { } void init( value_type* _base, int _ni, int _nj, int _si, int _sj) { base = _base; ni = _ni; nj = _nj; si = _si; sj = _sj; } // Pixel accessors value_type& value(int x, int y) { check("array2d x:",x,nj,outside); check("array2d y:",y,ni,outside); return *(base+x*sj+y*si); } const value_type& value(int x, int y) const { check("array2d x:",x,nj,outside); check("array2d y:",y,ni,outside); return *(base+x*sj+y*si); } public: value_type outside; value_type* base; int ni, nj; // dimensions int si, sj; // strides in sizeof(value_type) }; template void set_array(Image& img, PyArrayObject* arr) { img.init( (typename Image::value_type*)PyArray_DATA(arr), PyArray_DIM(arr, 0), PyArray_DIM(arr,1), PyArray_STRIDE(arr,0)/sizeof(typename Image::value_type), PyArray_STRIDE(arr,1)/sizeof(typename Image::value_type) ); } #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/src/debug.hpp0000666000000000000000000000125100000000000012314 0ustar00/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */ /* Copyright © 2009-2010 CEA Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) */ #ifndef __DEBUG_HPP__ #define __DEBUG_HPP__ #define DEBUG 0 #if DEBUG #define check(msg,x,n,r) if (x<0||x>=n) { printf(msg "%d out of bound (%d)\n", x, n); return r;} #define check_img_ptr(msg,p,r,img) if (p(img.base+(img.ni-1)*img.si+(img.nj-1)*img.sj)) \ { printf(msg "%p out of bound (%p,%dx%d, %dx%d\n", p,img.base,img.ni,img.si,img.nj,img.sj); return r;} #else #define check(msg,x,n,r) ; #define check_img_ptr(msg,p,r,img) ; #endif #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626332.0 guiqwt-4.0.1/src/histogram2d.c0000666000000000000000000106675500000000000013131 0ustar00/* Generated by Cython 0.29.23 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_23" #define CYTHON_HEX_VERSION 0x001D17F0 #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__histogram2d #define __PYX_HAVE_API__histogram2d /* Early includes */ #include #include #include "numpy/arrayobject.h" #include "numpy/ndarrayobject.h" #include "numpy/ndarraytypes.h" #include "numpy/arrayscalars.h" #include "numpy/ufuncobject.h" /* NumPy API declarations from "numpy/__init__.pxd" */ #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; /* Header.proto */ #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "src\\histogram2d.pyx", "__init__.pxd", "type.pxd", }; /* BufferFormatStructs.proto */ #define IS_UNSIGNED(type) (((type) -1) > 0) struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) typedef struct { const char* name; struct __Pyx_StructField_* fields; size_t size; size_t arraysize[8]; int ndim; char typegroup; char is_unsigned; int flags; } __Pyx_TypeInfo; typedef struct __Pyx_StructField_ { __Pyx_TypeInfo* type; const char* name; size_t offset; } __Pyx_StructField; typedef struct { __Pyx_StructField* field; size_t parent_offset; } __Pyx_BufFmt_StackElem; typedef struct { __Pyx_StructField root; __Pyx_BufFmt_StackElem* head; size_t fmt_offset; size_t new_count, enc_count; size_t struct_alignment; int is_complex; char enc_type; char new_packmode; char enc_packmode; char is_valid_array; } __Pyx_BufFmt_Context; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":690 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":691 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":692 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":693 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":697 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":698 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":699 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":700 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":704 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":705 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":714 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":715 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":716 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":718 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":719 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":720 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":722 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":723 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":725 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":726 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":727 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); /*--- Type declarations ---*/ /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":729 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":730 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":731 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":733 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* ArgTypeTest.proto */ #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ __Pyx__ArgTypeTest(obj, type, name, exact)) static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /* IsLittleEndian.proto */ static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); /* BufferFormatCheck.proto */ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type); /* BufferGetAndValidate.proto */ #define __Pyx_GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)\ ((obj == Py_None || obj == NULL) ?\ (__Pyx_ZeroBuffer(buf), 0) :\ __Pyx__GetBufferAndValidate(buf, obj, dtype, flags, nd, cast, stack)) static int __Pyx__GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static void __Pyx_ZeroBuffer(Py_buffer* buf); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); static Py_ssize_t __Pyx_minusones[] = { -1, -1, -1, -1, -1, -1, -1, -1 }; static Py_ssize_t __Pyx_zeros[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) #define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* BufferStructDeclare.proto */ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; typedef struct { size_t refcount; Py_buffer pybuffer; } __Pyx_Buffer; typedef struct { __Pyx_Buffer *rcbuffer; char *data; __Pyx_Buf_DimInfo diminfo[8]; } __Pyx_LocalBuf_ND; #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* RealImag.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(__cplusplus) && CYTHON_CCOMPLEX\ && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_float(a, b) ((a)==(b)) #define __Pyx_c_sum_float(a, b) ((a)+(b)) #define __Pyx_c_diff_float(a, b) ((a)-(b)) #define __Pyx_c_prod_float(a, b) ((a)*(b)) #define __Pyx_c_quot_float(a, b) ((a)/(b)) #define __Pyx_c_neg_float(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_float(z) ((z)==(float)0) #define __Pyx_c_conj_float(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_float(z) (::std::abs(z)) #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_float(z) ((z)==0) #define __Pyx_c_conj_float(z) (conjf(z)) #if 1 #define __Pyx_c_abs_float(z) (cabsf(z)) #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_double(a, b) ((a)==(b)) #define __Pyx_c_sum_double(a, b) ((a)+(b)) #define __Pyx_c_diff_double(a, b) ((a)-(b)) #define __Pyx_c_prod_double(a, b) ((a)*(b)) #define __Pyx_c_quot_double(a, b) ((a)/(b)) #define __Pyx_c_neg_double(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_double(z) ((z)==(double)0) #define __Pyx_c_conj_double(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_double(z) (::std::abs(z)) #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_double(z) ((z)==0) #define __Pyx_c_conj_double(z) (conj(z)) #if 1 #define __Pyx_c_abs_double(z) (cabs(z)) #define __Pyx_c_pow_double(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); /* CIntFromPy.proto */ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'cython' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'cpython' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_generic = 0; static PyTypeObject *__pyx_ptype_5numpy_number = 0; static PyTypeObject *__pyx_ptype_5numpy_integer = 0; static PyTypeObject *__pyx_ptype_5numpy_signedinteger = 0; static PyTypeObject *__pyx_ptype_5numpy_unsignedinteger = 0; static PyTypeObject *__pyx_ptype_5numpy_inexact = 0; static PyTypeObject *__pyx_ptype_5numpy_floating = 0; static PyTypeObject *__pyx_ptype_5numpy_complexfloating = 0; static PyTypeObject *__pyx_ptype_5numpy_flexible = 0; static PyTypeObject *__pyx_ptype_5numpy_character = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; /* Module declarations from 'libc.math' */ /* Module declarations from 'histogram2d' */ static CYTHON_INLINE double __pyx_f_11histogram2d_double_max(double, double); /*proto*/ static CYTHON_INLINE double __pyx_f_11histogram2d_double_min(double, double); /*proto*/ static __Pyx_TypeInfo __Pyx_TypeInfo_double = { "double", NULL, sizeof(double), { 0 }, 0, 'R', 0, 0 }; #define __Pyx_MODULE_NAME "histogram2d" extern int __pyx_module_is_main_histogram2d; int __pyx_module_is_main_histogram2d = 0; /* Implementation of 'histogram2d' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_ImportError; static const char __pyx_k_X[] = "X"; static const char __pyx_k_Y[] = "Y"; static const char __pyx_k_Z[] = "Z"; static const char __pyx_k_i[] = "i"; static const char __pyx_k_j[] = "j"; static const char __pyx_k_n[] = "n"; static const char __pyx_k_u[] = "u"; static const char __pyx_k_v[] = "v"; static const char __pyx_k_cx[] = "cx"; static const char __pyx_k_cy[] = "cy"; static const char __pyx_k_i0[] = "i0"; static const char __pyx_k_i1[] = "i1"; static const char __pyx_k_ix[] = "ix"; static const char __pyx_k_iy[] = "iy"; static const char __pyx_k_j0[] = "j0"; static const char __pyx_k_j1[] = "j1"; static const char __pyx_k_nx[] = "nx"; static const char __pyx_k_ny[] = "ny"; static const char __pyx_k_data[] = "data"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_nmax[] = "nmax"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_data_tmp[] = "data_tmp"; static const char __pyx_k_logscale[] = "logscale"; static const char __pyx_k_ImportError[] = "ImportError"; static const char __pyx_k_computation[] = "computation"; static const char __pyx_k_histogram2d[] = "histogram2d"; static const char __pyx_k_histogram2d_func[] = "histogram2d_func"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_src_histogram2d_pyx[] = "src\\histogram2d.pyx"; static const char __pyx_k_2D_Histogram_algorithm[] = "2D-Histogram algorithm"; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static PyObject *__pyx_n_s_ImportError; static PyObject *__pyx_n_s_X; static PyObject *__pyx_n_s_Y; static PyObject *__pyx_n_s_Z; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_computation; static PyObject *__pyx_n_s_cx; static PyObject *__pyx_n_s_cy; static PyObject *__pyx_n_s_data; static PyObject *__pyx_n_s_data_tmp; static PyObject *__pyx_n_s_histogram2d; static PyObject *__pyx_n_s_histogram2d_func; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_i0; static PyObject *__pyx_n_s_i1; static PyObject *__pyx_n_s_ix; static PyObject *__pyx_n_s_iy; static PyObject *__pyx_n_s_j; static PyObject *__pyx_n_s_j0; static PyObject *__pyx_n_s_j1; static PyObject *__pyx_n_s_logscale; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_n; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_nmax; static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; static PyObject *__pyx_n_s_nx; static PyObject *__pyx_n_s_ny; static PyObject *__pyx_n_s_range; static PyObject *__pyx_kp_s_src_histogram2d_pyx; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_u; static PyObject *__pyx_n_s_v; static PyObject *__pyx_pf_11histogram2d_histogram2d(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data, PyObject *__pyx_v_logscale); /* proto */ static PyObject *__pyx_pf_11histogram2d_2histogram2d_func(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, PyArrayObject *__pyx_v_Z, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data_tmp, PyArrayObject *__pyx_v_data, int __pyx_v_computation); /* proto */ static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; static PyObject *__pyx_tuple__5; static PyObject *__pyx_codeobj__4; static PyObject *__pyx_codeobj__6; /* Late includes */ /* "histogram2d.pyx":14 * from libc.math cimport log * * cdef inline double double_max(double a, double b): return a if a >= b else b # <<<<<<<<<<<<<< * cdef inline double double_min(double a, double b): return a if a <= b else b * */ static CYTHON_INLINE double __pyx_f_11histogram2d_double_max(double __pyx_v_a, double __pyx_v_b) { double __pyx_r; __Pyx_RefNannyDeclarations double __pyx_t_1; __Pyx_RefNannySetupContext("double_max", 0); if (((__pyx_v_a >= __pyx_v_b) != 0)) { __pyx_t_1 = __pyx_v_a; } else { __pyx_t_1 = __pyx_v_b; } __pyx_r = __pyx_t_1; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "histogram2d.pyx":15 * * cdef inline double double_max(double a, double b): return a if a >= b else b * cdef inline double double_min(double a, double b): return a if a <= b else b # <<<<<<<<<<<<<< * * @cython.profile(False) */ static CYTHON_INLINE double __pyx_f_11histogram2d_double_min(double __pyx_v_a, double __pyx_v_b) { double __pyx_r; __Pyx_RefNannyDeclarations double __pyx_t_1; __Pyx_RefNannySetupContext("double_min", 0); if (((__pyx_v_a <= __pyx_v_b) != 0)) { __pyx_t_1 = __pyx_v_a; } else { __pyx_t_1 = __pyx_v_b; } __pyx_r = __pyx_t_1; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "histogram2d.pyx":19 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, # <<<<<<<<<<<<<< * double i0, double i1, double j0, double j1, * np.ndarray[double, ndim=2] data, logscale): */ /* Python wrapper */ static PyObject *__pyx_pw_11histogram2d_1histogram2d(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_11histogram2d_histogram2d[] = "Compute 2-D Histogram from data X, Y"; static PyMethodDef __pyx_mdef_11histogram2d_1histogram2d = {"histogram2d", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11histogram2d_1histogram2d, METH_VARARGS|METH_KEYWORDS, __pyx_doc_11histogram2d_histogram2d}; static PyObject *__pyx_pw_11histogram2d_1histogram2d(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_X = 0; PyArrayObject *__pyx_v_Y = 0; double __pyx_v_i0; double __pyx_v_i1; double __pyx_v_j0; double __pyx_v_j1; PyArrayObject *__pyx_v_data = 0; PyObject *__pyx_v_logscale = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("histogram2d (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_Y,&__pyx_n_s_i0,&__pyx_n_s_i1,&__pyx_n_s_j0,&__pyx_n_s_j1,&__pyx_n_s_data,&__pyx_n_s_logscale,0}; PyObject* values[8] = {0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_Y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 1); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_i0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 2); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_i1)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 3); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_j0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 4); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_j1)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 5); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 6); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_logscale)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, 7); __PYX_ERR(0, 19, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "histogram2d") < 0)) __PYX_ERR(0, 19, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 8) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); } __pyx_v_X = ((PyArrayObject *)values[0]); __pyx_v_Y = ((PyArrayObject *)values[1]); __pyx_v_i0 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_i0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) __pyx_v_i1 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_i1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) __pyx_v_j0 = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_j0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) __pyx_v_j1 = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_j1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 20, __pyx_L3_error) __pyx_v_data = ((PyArrayObject *)values[6]); __pyx_v_logscale = values[7]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("histogram2d", 1, 8, 8, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 19, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("histogram2d.histogram2d", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 19, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) __PYX_ERR(0, 19, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, "data", 0))) __PYX_ERR(0, 21, __pyx_L1_error) __pyx_r = __pyx_pf_11histogram2d_histogram2d(__pyx_self, __pyx_v_X, __pyx_v_Y, __pyx_v_i0, __pyx_v_i1, __pyx_v_j0, __pyx_v_j1, __pyx_v_data, __pyx_v_logscale); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_11histogram2d_histogram2d(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data, PyObject *__pyx_v_logscale) { double __pyx_v_cx; double __pyx_v_cy; double __pyx_v_nmax; double __pyx_v_ix; double __pyx_v_iy; unsigned int __pyx_v_i; unsigned int __pyx_v_n; unsigned int __pyx_v_nx; unsigned int __pyx_v_ny; unsigned int __pyx_v_j; __Pyx_LocalBuf_ND __pyx_pybuffernd_X; __Pyx_Buffer __pyx_pybuffer_X; __Pyx_LocalBuf_ND __pyx_pybuffernd_Y; __Pyx_Buffer __pyx_pybuffer_Y; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; unsigned int __pyx_t_2; unsigned int __pyx_t_3; unsigned int __pyx_t_4; size_t __pyx_t_5; int __pyx_t_6; int __pyx_t_7; Py_ssize_t __pyx_t_8; Py_ssize_t __pyx_t_9; unsigned int __pyx_t_10; unsigned int __pyx_t_11; unsigned int __pyx_t_12; size_t __pyx_t_13; size_t __pyx_t_14; size_t __pyx_t_15; PyObject *__pyx_t_16 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("histogram2d", 0); __pyx_pybuffer_X.pybuffer.buf = NULL; __pyx_pybuffer_X.refcount = 0; __pyx_pybuffernd_X.data = NULL; __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; __pyx_pybuffer_Y.pybuffer.buf = NULL; __pyx_pybuffer_Y.refcount = 0; __pyx_pybuffernd_Y.data = NULL; __pyx_pybuffernd_Y.rcbuffer = &__pyx_pybuffer_Y; __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Y.rcbuffer->pybuffer, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_Y.diminfo[0].strides = __pyx_pybuffernd_Y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Y.diminfo[0].shape = __pyx_pybuffernd_Y.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_data, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[1]; /* "histogram2d.pyx":25 * cdef double cx, cy, nmax, ix, iy * cdef unsigned int i * cdef unsigned int n = X.shape[0] # <<<<<<<<<<<<<< * cdef unsigned int nx = data.shape[1] * cdef unsigned int ny = data.shape[0] */ __pyx_v_n = (__pyx_v_X->dimensions[0]); /* "histogram2d.pyx":26 * cdef unsigned int i * cdef unsigned int n = X.shape[0] * cdef unsigned int nx = data.shape[1] # <<<<<<<<<<<<<< * cdef unsigned int ny = data.shape[0] * */ __pyx_v_nx = (__pyx_v_data->dimensions[1]); /* "histogram2d.pyx":27 * cdef unsigned int n = X.shape[0] * cdef unsigned int nx = data.shape[1] * cdef unsigned int ny = data.shape[0] # <<<<<<<<<<<<<< * * cx = nx/(i1-i0) */ __pyx_v_ny = (__pyx_v_data->dimensions[0]); /* "histogram2d.pyx":29 * cdef unsigned int ny = data.shape[0] * * cx = nx/(i1-i0) # <<<<<<<<<<<<<< * cy = ny/(j1-j0) * */ __pyx_t_1 = (__pyx_v_i1 - __pyx_v_i0); if (unlikely(__pyx_t_1 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 29, __pyx_L1_error) } __pyx_v_cx = (__pyx_v_nx / __pyx_t_1); /* "histogram2d.pyx":30 * * cx = nx/(i1-i0) * cy = ny/(j1-j0) # <<<<<<<<<<<<<< * * for i in range(n): */ __pyx_t_1 = (__pyx_v_j1 - __pyx_v_j0); if (unlikely(__pyx_t_1 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 30, __pyx_L1_error) } __pyx_v_cy = (__pyx_v_ny / __pyx_t_1); /* "histogram2d.pyx":32 * cy = ny/(j1-j0) * * for i in range(n): # <<<<<<<<<<<<<< * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 */ __pyx_t_2 = __pyx_v_n; __pyx_t_3 = __pyx_t_2; for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; /* "histogram2d.pyx":34 * for i in range(n): * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 # <<<<<<<<<<<<<< * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: */ __pyx_t_5 = __pyx_v_i; __pyx_v_ix = ((((*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_X.diminfo[0].strides)) - __pyx_v_i0) * __pyx_v_cx) - .5); /* "histogram2d.pyx":35 * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 # <<<<<<<<<<<<<< * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * data[ iy, ix] += 1 */ __pyx_t_5 = __pyx_v_i; __pyx_v_iy = ((((*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Y.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_Y.diminfo[0].strides)) - __pyx_v_j0) * __pyx_v_cy) - .5); /* "histogram2d.pyx":36 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: # <<<<<<<<<<<<<< * data[ iy, ix] += 1 * */ __pyx_t_7 = ((__pyx_v_ix >= 0.0) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_ix <= (__pyx_v_nx - 1)) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_iy >= 0.0) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_iy <= (__pyx_v_ny - 1)) != 0); __pyx_t_6 = __pyx_t_7; __pyx_L6_bool_binop_done:; if (__pyx_t_6) { /* "histogram2d.pyx":37 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * data[ iy, ix] += 1 # <<<<<<<<<<<<<< * * nmax = 0. */ __pyx_t_8 = ((int)__pyx_v_iy); __pyx_t_9 = ((int)__pyx_v_ix); if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_pybuffernd_data.diminfo[0].shape; if (__pyx_t_9 < 0) __pyx_t_9 += __pyx_pybuffernd_data.diminfo[1].shape; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_data.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":36 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: # <<<<<<<<<<<<<< * data[ iy, ix] += 1 * */ } } /* "histogram2d.pyx":39 * data[ iy, ix] += 1 * * nmax = 0. # <<<<<<<<<<<<<< * if logscale: * for j in range(ny): */ __pyx_v_nmax = 0.; /* "histogram2d.pyx":40 * * nmax = 0. * if logscale: # <<<<<<<<<<<<<< * for j in range(ny): * for i in range(nx): */ __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_logscale); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 40, __pyx_L1_error) if (__pyx_t_6) { /* "histogram2d.pyx":41 * nmax = 0. * if logscale: * for j in range(ny): # <<<<<<<<<<<<<< * for i in range(nx): * data[j, i] = log(1+data[j, i]) */ __pyx_t_2 = __pyx_v_ny; __pyx_t_3 = __pyx_t_2; for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_j = __pyx_t_4; /* "histogram2d.pyx":42 * if logscale: * for j in range(ny): * for i in range(nx): # <<<<<<<<<<<<<< * data[j, i] = log(1+data[j, i]) * nmax = double_max(nmax, data[j, i]) */ __pyx_t_10 = __pyx_v_nx; __pyx_t_11 = __pyx_t_10; for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_i = __pyx_t_12; /* "histogram2d.pyx":43 * for j in range(ny): * for i in range(nx): * data[j, i] = log(1+data[j, i]) # <<<<<<<<<<<<<< * nmax = double_max(nmax, data[j, i]) * else: */ __pyx_t_5 = __pyx_v_j; __pyx_t_13 = __pyx_v_i; __pyx_t_14 = __pyx_v_j; __pyx_t_15 = __pyx_v_i; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_data.diminfo[1].strides) = log((1.0 + (*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_data.diminfo[1].strides)))); /* "histogram2d.pyx":44 * for i in range(nx): * data[j, i] = log(1+data[j, i]) * nmax = double_max(nmax, data[j, i]) # <<<<<<<<<<<<<< * else: * for j in range(ny): */ __pyx_t_13 = __pyx_v_j; __pyx_t_5 = __pyx_v_i; __pyx_v_nmax = __pyx_f_11histogram2d_double_max(__pyx_v_nmax, (*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data.diminfo[1].strides))); } } /* "histogram2d.pyx":40 * * nmax = 0. * if logscale: # <<<<<<<<<<<<<< * for j in range(ny): * for i in range(nx): */ goto __pyx_L10; } /* "histogram2d.pyx":46 * nmax = double_max(nmax, data[j, i]) * else: * for j in range(ny): # <<<<<<<<<<<<<< * for i in range(nx): * nmax = double_max(nmax, data[j, i]) */ /*else*/ { __pyx_t_2 = __pyx_v_ny; __pyx_t_3 = __pyx_t_2; for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_j = __pyx_t_4; /* "histogram2d.pyx":47 * else: * for j in range(ny): * for i in range(nx): # <<<<<<<<<<<<<< * nmax = double_max(nmax, data[j, i]) * return nmax */ __pyx_t_10 = __pyx_v_nx; __pyx_t_11 = __pyx_t_10; for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_i = __pyx_t_12; /* "histogram2d.pyx":48 * for j in range(ny): * for i in range(nx): * nmax = double_max(nmax, data[j, i]) # <<<<<<<<<<<<<< * return nmax * */ __pyx_t_5 = __pyx_v_j; __pyx_t_13 = __pyx_v_i; __pyx_v_nmax = __pyx_f_11histogram2d_double_max(__pyx_v_nmax, (*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_data.diminfo[1].strides))); } } } __pyx_L10:; /* "histogram2d.pyx":49 * for i in range(nx): * nmax = double_max(nmax, data[j, i]) * return nmax # <<<<<<<<<<<<<< * * @cython.profile(False) */ __Pyx_XDECREF(__pyx_r); __pyx_t_16 = PyFloat_FromDouble(__pyx_v_nmax); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_16); __pyx_r = __pyx_t_16; __pyx_t_16 = 0; goto __pyx_L0; /* "histogram2d.pyx":19 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, # <<<<<<<<<<<<<< * double i0, double i1, double j0, double j1, * np.ndarray[double, ndim=2] data, logscale): */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_16); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("histogram2d.histogram2d", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "histogram2d.pyx":53 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d_func(np.ndarray[double, ndim=1] X, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=1] Y, * np.ndarray[double, ndim=1] Z, */ /* Python wrapper */ static PyObject *__pyx_pw_11histogram2d_3histogram2d_func(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_11histogram2d_2histogram2d_func[] = "Compute 2-D Histogram from data X, Y"; static PyMethodDef __pyx_mdef_11histogram2d_3histogram2d_func = {"histogram2d_func", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_11histogram2d_3histogram2d_func, METH_VARARGS|METH_KEYWORDS, __pyx_doc_11histogram2d_2histogram2d_func}; static PyObject *__pyx_pw_11histogram2d_3histogram2d_func(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_X = 0; PyArrayObject *__pyx_v_Y = 0; PyArrayObject *__pyx_v_Z = 0; double __pyx_v_i0; double __pyx_v_i1; double __pyx_v_j0; double __pyx_v_j1; PyArrayObject *__pyx_v_data_tmp = 0; PyArrayObject *__pyx_v_data = 0; int __pyx_v_computation; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("histogram2d_func (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_Y,&__pyx_n_s_Z,&__pyx_n_s_i0,&__pyx_n_s_i1,&__pyx_n_s_j0,&__pyx_n_s_j1,&__pyx_n_s_data_tmp,&__pyx_n_s_data,&__pyx_n_s_computation,0}; PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_Y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 1); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_Z)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 2); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_i0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 3); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_i1)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 4); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_j0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 5); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_j1)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 6); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data_tmp)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 7); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 8); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_computation)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, 9); __PYX_ERR(0, 53, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "histogram2d_func") < 0)) __PYX_ERR(0, 53, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 10) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); values[8] = PyTuple_GET_ITEM(__pyx_args, 8); values[9] = PyTuple_GET_ITEM(__pyx_args, 9); } __pyx_v_X = ((PyArrayObject *)values[0]); __pyx_v_Y = ((PyArrayObject *)values[1]); __pyx_v_Z = ((PyArrayObject *)values[2]); __pyx_v_i0 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_i0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error) __pyx_v_i1 = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_i1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error) __pyx_v_j0 = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_j0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error) __pyx_v_j1 = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_j1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error) __pyx_v_data_tmp = ((PyArrayObject *)values[7]); __pyx_v_data = ((PyArrayObject *)values[8]); __pyx_v_computation = __Pyx_PyInt_As_int(values[9]); if (unlikely((__pyx_v_computation == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("histogram2d_func", 1, 10, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 53, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("histogram2d.histogram2d_func", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) __PYX_ERR(0, 53, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) __PYX_ERR(0, 54, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Z), __pyx_ptype_5numpy_ndarray, 1, "Z", 0))) __PYX_ERR(0, 55, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data_tmp), __pyx_ptype_5numpy_ndarray, 1, "data_tmp", 0))) __PYX_ERR(0, 57, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data), __pyx_ptype_5numpy_ndarray, 1, "data", 0))) __PYX_ERR(0, 58, __pyx_L1_error) __pyx_r = __pyx_pf_11histogram2d_2histogram2d_func(__pyx_self, __pyx_v_X, __pyx_v_Y, __pyx_v_Z, __pyx_v_i0, __pyx_v_i1, __pyx_v_j0, __pyx_v_j1, __pyx_v_data_tmp, __pyx_v_data, __pyx_v_computation); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_11histogram2d_2histogram2d_func(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, PyArrayObject *__pyx_v_Z, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data_tmp, PyArrayObject *__pyx_v_data, int __pyx_v_computation) { double __pyx_v_cx; double __pyx_v_cy; double __pyx_v_ix; double __pyx_v_iy; unsigned int __pyx_v_i; unsigned int __pyx_v_u; unsigned int __pyx_v_v; unsigned int __pyx_v_n; unsigned int __pyx_v_nx; unsigned int __pyx_v_ny; __Pyx_LocalBuf_ND __pyx_pybuffernd_X; __Pyx_Buffer __pyx_pybuffer_X; __Pyx_LocalBuf_ND __pyx_pybuffernd_Y; __Pyx_Buffer __pyx_pybuffer_Y; __Pyx_LocalBuf_ND __pyx_pybuffernd_Z; __Pyx_Buffer __pyx_pybuffer_Z; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; __Pyx_LocalBuf_ND __pyx_pybuffernd_data_tmp; __Pyx_Buffer __pyx_pybuffer_data_tmp; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; unsigned int __pyx_t_2; unsigned int __pyx_t_3; unsigned int __pyx_t_4; size_t __pyx_t_5; int __pyx_t_6; int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; size_t __pyx_t_10; size_t __pyx_t_11; size_t __pyx_t_12; size_t __pyx_t_13; double __pyx_t_14; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("histogram2d_func", 0); __pyx_pybuffer_X.pybuffer.buf = NULL; __pyx_pybuffer_X.refcount = 0; __pyx_pybuffernd_X.data = NULL; __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X; __pyx_pybuffer_Y.pybuffer.buf = NULL; __pyx_pybuffer_Y.refcount = 0; __pyx_pybuffernd_Y.data = NULL; __pyx_pybuffernd_Y.rcbuffer = &__pyx_pybuffer_Y; __pyx_pybuffer_Z.pybuffer.buf = NULL; __pyx_pybuffer_Z.refcount = 0; __pyx_pybuffernd_Z.data = NULL; __pyx_pybuffernd_Z.rcbuffer = &__pyx_pybuffer_Z; __pyx_pybuffer_data_tmp.pybuffer.buf = NULL; __pyx_pybuffer_data_tmp.refcount = 0; __pyx_pybuffernd_data_tmp.data = NULL; __pyx_pybuffernd_data_tmp.rcbuffer = &__pyx_pybuffer_data_tmp; __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 53, __pyx_L1_error) } __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Y.rcbuffer->pybuffer, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 53, __pyx_L1_error) } __pyx_pybuffernd_Y.diminfo[0].strides = __pyx_pybuffernd_Y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Y.diminfo[0].shape = __pyx_pybuffernd_Y.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Z.rcbuffer->pybuffer, (PyObject*)__pyx_v_Z, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 53, __pyx_L1_error) } __pyx_pybuffernd_Z.diminfo[0].strides = __pyx_pybuffernd_Z.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Z.diminfo[0].shape = __pyx_pybuffernd_Z.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data_tmp.rcbuffer->pybuffer, (PyObject*)__pyx_v_data_tmp, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 53, __pyx_L1_error) } __pyx_pybuffernd_data_tmp.diminfo[0].strides = __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data_tmp.diminfo[0].shape = __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data_tmp.diminfo[1].strides = __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data_tmp.diminfo[1].shape = __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_data, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 53, __pyx_L1_error) } __pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[1]; /* "histogram2d.pyx":62 * cdef double cx, cy, nmax, ix, iy * cdef unsigned int i, u, v * cdef unsigned int n = X.shape[0] # <<<<<<<<<<<<<< * cdef unsigned int nx = data.shape[1] * cdef unsigned int ny = data.shape[0] */ __pyx_v_n = (__pyx_v_X->dimensions[0]); /* "histogram2d.pyx":63 * cdef unsigned int i, u, v * cdef unsigned int n = X.shape[0] * cdef unsigned int nx = data.shape[1] # <<<<<<<<<<<<<< * cdef unsigned int ny = data.shape[0] * */ __pyx_v_nx = (__pyx_v_data->dimensions[1]); /* "histogram2d.pyx":64 * cdef unsigned int n = X.shape[0] * cdef unsigned int nx = data.shape[1] * cdef unsigned int ny = data.shape[0] # <<<<<<<<<<<<<< * * cx = nx/(i1-i0) */ __pyx_v_ny = (__pyx_v_data->dimensions[0]); /* "histogram2d.pyx":66 * cdef unsigned int ny = data.shape[0] * * cx = nx/(i1-i0) # <<<<<<<<<<<<<< * cy = ny/(j1-j0) * */ __pyx_t_1 = (__pyx_v_i1 - __pyx_v_i0); if (unlikely(__pyx_t_1 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 66, __pyx_L1_error) } __pyx_v_cx = (__pyx_v_nx / __pyx_t_1); /* "histogram2d.pyx":67 * * cx = nx/(i1-i0) * cy = ny/(j1-j0) # <<<<<<<<<<<<<< * * for i in range(n): */ __pyx_t_1 = (__pyx_v_j1 - __pyx_v_j0); if (unlikely(__pyx_t_1 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 67, __pyx_L1_error) } __pyx_v_cy = (__pyx_v_ny / __pyx_t_1); /* "histogram2d.pyx":69 * cy = ny/(j1-j0) * * for i in range(n): # <<<<<<<<<<<<<< * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 */ __pyx_t_2 = __pyx_v_n; __pyx_t_3 = __pyx_t_2; for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; /* "histogram2d.pyx":71 * for i in range(n): * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 # <<<<<<<<<<<<<< * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: */ __pyx_t_5 = __pyx_v_i; __pyx_v_ix = ((((*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_X.diminfo[0].strides)) - __pyx_v_i0) * __pyx_v_cx) - .5); /* "histogram2d.pyx":72 * # Centered bins => - .5 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 # <<<<<<<<<<<<<< * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * u, v = iy, ix */ __pyx_t_5 = __pyx_v_i; __pyx_v_iy = ((((*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Y.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_Y.diminfo[0].strides)) - __pyx_v_j0) * __pyx_v_cy) - .5); /* "histogram2d.pyx":73 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: # <<<<<<<<<<<<<< * u, v = iy, ix * if computation == 0: # max */ __pyx_t_7 = ((__pyx_v_ix >= 0.0) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_ix <= (__pyx_v_nx - 1)) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_iy >= 0.0) != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } __pyx_t_7 = ((__pyx_v_iy <= (__pyx_v_ny - 1)) != 0); __pyx_t_6 = __pyx_t_7; __pyx_L6_bool_binop_done:; if (__pyx_t_6) { /* "histogram2d.pyx":74 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * u, v = iy, ix # <<<<<<<<<<<<<< * if computation == 0: # max * data_tmp[u, v] += 1 */ __pyx_t_8 = ((int)__pyx_v_iy); __pyx_t_9 = ((int)__pyx_v_ix); __pyx_v_u = __pyx_t_8; __pyx_v_v = __pyx_t_9; /* "histogram2d.pyx":75 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * u, v = iy, ix * if computation == 0: # max # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] = double_max(data[u, v], Z[i]) */ switch (__pyx_v_computation) { case 0: /* "histogram2d.pyx":76 * u, v = iy, ix * if computation == 0: # max * data_tmp[u, v] += 1 # <<<<<<<<<<<<<< * data[u, v] = double_max(data[u, v], Z[i]) * elif computation == 1: # min */ __pyx_t_5 = __pyx_v_u; __pyx_t_10 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_data_tmp.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":77 * if computation == 0: # max * data_tmp[u, v] += 1 * data[u, v] = double_max(data[u, v], Z[i]) # <<<<<<<<<<<<<< * elif computation == 1: # min * data_tmp[u, v] += 1 */ __pyx_t_10 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; __pyx_t_11 = __pyx_v_i; __pyx_t_12 = __pyx_v_u; __pyx_t_13 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_data.diminfo[1].strides) = __pyx_f_11histogram2d_double_max((*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data.diminfo[1].strides)), (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_Z.diminfo[0].strides))); /* "histogram2d.pyx":75 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: * u, v = iy, ix * if computation == 0: # max # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] = double_max(data[u, v], Z[i]) */ break; case 1: /* "histogram2d.pyx":79 * data[u, v] = double_max(data[u, v], Z[i]) * elif computation == 1: # min * data_tmp[u, v] += 1 # <<<<<<<<<<<<<< * data[u, v] = double_min(data[u, v], Z[i]) * elif computation == 2: # sum */ __pyx_t_11 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":80 * elif computation == 1: # min * data_tmp[u, v] += 1 * data[u, v] = double_min(data[u, v], Z[i]) # <<<<<<<<<<<<<< * elif computation == 2: # sum * data_tmp[u, v] += 1 */ __pyx_t_5 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; __pyx_t_10 = __pyx_v_i; __pyx_t_13 = __pyx_v_u; __pyx_t_12 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_data.diminfo[1].strides) = __pyx_f_11histogram2d_double_min((*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data.diminfo[1].strides)), (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Z.diminfo[0].strides))); /* "histogram2d.pyx":78 * data_tmp[u, v] += 1 * data[u, v] = double_max(data[u, v], Z[i]) * elif computation == 1: # min # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] = double_min(data[u, v], Z[i]) */ break; case 2: /* "histogram2d.pyx":82 * data[u, v] = double_min(data[u, v], Z[i]) * elif computation == 2: # sum * data_tmp[u, v] += 1 # <<<<<<<<<<<<<< * data[u, v] += Z[i] * elif computation == 3: # prod */ __pyx_t_10 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data_tmp.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":83 * elif computation == 2: # sum * data_tmp[u, v] += 1 * data[u, v] += Z[i] # <<<<<<<<<<<<<< * elif computation == 3: # prod * data_tmp[u, v] += 1 */ __pyx_t_11 = __pyx_v_i; __pyx_t_10 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data.diminfo[1].strides) += (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_Z.diminfo[0].strides)); /* "histogram2d.pyx":81 * data_tmp[u, v] += 1 * data[u, v] = double_min(data[u, v], Z[i]) * elif computation == 2: # sum # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] += Z[i] */ break; case 3: /* "histogram2d.pyx":85 * data[u, v] += Z[i] * elif computation == 3: # prod * data_tmp[u, v] += 1 # <<<<<<<<<<<<<< * data[u, v] *= Z[i] * elif computation == 4: # avg */ __pyx_t_11 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":86 * elif computation == 3: # prod * data_tmp[u, v] += 1 * data[u, v] *= Z[i] # <<<<<<<<<<<<<< * elif computation == 4: # avg * data_tmp[u, v] += 1 */ __pyx_t_5 = __pyx_v_i; __pyx_t_11 = __pyx_v_u; __pyx_t_10 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_data.diminfo[1].strides) *= (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_Z.diminfo[0].strides)); /* "histogram2d.pyx":84 * data_tmp[u, v] += 1 * data[u, v] += Z[i] * elif computation == 3: # prod # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] *= Z[i] */ break; case 4: /* "histogram2d.pyx":88 * data[u, v] *= Z[i] * elif computation == 4: # avg * data_tmp[u, v] += 1 # <<<<<<<<<<<<<< * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] * elif computation == 5: # argmin */ __pyx_t_5 = __pyx_v_u; __pyx_t_10 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_10, __pyx_pybuffernd_data_tmp.diminfo[1].strides) += 1.0; /* "histogram2d.pyx":89 * elif computation == 4: # avg * data_tmp[u, v] += 1 * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] # <<<<<<<<<<<<<< * elif computation == 5: # argmin * if data[u, v] > Z[i]: */ __pyx_t_10 = __pyx_v_i; __pyx_t_5 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; __pyx_t_1 = ((*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Z.diminfo[0].strides)) - (*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data.diminfo[1].strides))); __pyx_t_11 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; __pyx_t_14 = (*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[1].strides)); if (unlikely(__pyx_t_14 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 89, __pyx_L1_error) } __pyx_t_5 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data.diminfo[1].strides) += (__pyx_t_1 / __pyx_t_14); /* "histogram2d.pyx":87 * data_tmp[u, v] += 1 * data[u, v] *= Z[i] * elif computation == 4: # avg # <<<<<<<<<<<<<< * data_tmp[u, v] += 1 * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] */ break; case 5: /* "histogram2d.pyx":91 * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] * elif computation == 5: # argmin * if data[u, v] > Z[i]: # <<<<<<<<<<<<<< * data_tmp[u, v] = i * data[u, v] = Z[i] */ __pyx_t_11 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; __pyx_t_10 = __pyx_v_i; __pyx_t_6 = (((*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data.diminfo[1].strides)) > (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Z.diminfo[0].strides))) != 0); if (__pyx_t_6) { /* "histogram2d.pyx":92 * elif computation == 5: # argmin * if data[u, v] > Z[i]: * data_tmp[u, v] = i # <<<<<<<<<<<<<< * data[u, v] = Z[i] * elif computation == 6: # argmax */ __pyx_t_10 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data_tmp.diminfo[1].strides) = __pyx_v_i; /* "histogram2d.pyx":93 * if data[u, v] > Z[i]: * data_tmp[u, v] = i * data[u, v] = Z[i] # <<<<<<<<<<<<<< * elif computation == 6: # argmax * if data[u, v] < Z[i]: */ __pyx_t_5 = __pyx_v_i; __pyx_t_10 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data.diminfo[1].strides) = (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_Z.diminfo[0].strides)); /* "histogram2d.pyx":91 * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] * elif computation == 5: # argmin * if data[u, v] > Z[i]: # <<<<<<<<<<<<<< * data_tmp[u, v] = i * data[u, v] = Z[i] */ } /* "histogram2d.pyx":90 * data_tmp[u, v] += 1 * data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] * elif computation == 5: # argmin # <<<<<<<<<<<<<< * if data[u, v] > Z[i]: * data_tmp[u, v] = i */ break; case 6: /* "histogram2d.pyx":95 * data[u, v] = Z[i] * elif computation == 6: # argmax * if data[u, v] < Z[i]: # <<<<<<<<<<<<<< * data_tmp[u, v] = i * data[u, v] = Z[i] */ __pyx_t_5 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; __pyx_t_10 = __pyx_v_i; __pyx_t_6 = (((*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data.diminfo[1].strides)) < (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Z.diminfo[0].strides))) != 0); if (__pyx_t_6) { /* "histogram2d.pyx":96 * elif computation == 6: # argmax * if data[u, v] < Z[i]: * data_tmp[u, v] = i # <<<<<<<<<<<<<< * data[u, v] = Z[i] */ __pyx_t_10 = __pyx_v_u; __pyx_t_11 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data_tmp.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data_tmp.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_data_tmp.diminfo[1].strides) = __pyx_v_i; /* "histogram2d.pyx":97 * if data[u, v] < Z[i]: * data_tmp[u, v] = i * data[u, v] = Z[i] # <<<<<<<<<<<<<< */ __pyx_t_11 = __pyx_v_i; __pyx_t_10 = __pyx_v_u; __pyx_t_5 = __pyx_v_v; *__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_data.diminfo[1].strides) = (*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_Z.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_Z.diminfo[0].strides)); /* "histogram2d.pyx":95 * data[u, v] = Z[i] * elif computation == 6: # argmax * if data[u, v] < Z[i]: # <<<<<<<<<<<<<< * data_tmp[u, v] = i * data[u, v] = Z[i] */ } /* "histogram2d.pyx":94 * data_tmp[u, v] = i * data[u, v] = Z[i] * elif computation == 6: # argmax # <<<<<<<<<<<<<< * if data[u, v] < Z[i]: * data_tmp[u, v] = i */ break; default: break; } /* "histogram2d.pyx":73 * ix = (X[i]-i0)*cx - .5 * iy = (Y[i]-j0)*cy - .5 * if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: # <<<<<<<<<<<<<< * u, v = iy, ix * if computation == 0: # max */ } } /* "histogram2d.pyx":53 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d_func(np.ndarray[double, ndim=1] X, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=1] Y, * np.ndarray[double, ndim=1] Z, */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Z.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data_tmp.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("histogram2d.histogram2d_func", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Z.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data_tmp.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":735 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":736 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 736, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":735 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":738 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":739 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 739, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":738 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":741 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":742 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 742, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":741 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":744 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":745 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 745, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":744 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":747 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":748 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline tuple PyDataType_SHAPE(dtype d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":747 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":750 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":751 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< * return d.subarray.shape * else: */ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":752 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< * else: * return () */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":751 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< * return d.subarray.shape * else: */ } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":754 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_empty_tuple); __pyx_r = __pyx_empty_tuple; goto __pyx_L0; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":750 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape */ /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":929 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_array_base", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":930 * * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< * PyArray_SetBaseObject(arr, base) * */ Py_INCREF(__pyx_v_base); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":931 * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base)); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":929 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":933 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * base = PyArray_BASE(arr) * if base is NULL: */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_v_base; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":934 * * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< * if base is NULL: * return None */ __pyx_v_base = PyArray_BASE(__pyx_v_arr); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":935 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< * return None * return base */ __pyx_t_1 = ((__pyx_v_base == NULL) != 0); if (__pyx_t_1) { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":936 * base = PyArray_BASE(arr) * if base is NULL: * return None # <<<<<<<<<<<<<< * return base * */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":935 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< * return None * return base */ } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":937 * if base is NULL: * return None * return base # <<<<<<<<<<<<<< * * # Versions of the import_* functions which are more suitable for */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_base)); __pyx_r = ((PyObject *)__pyx_v_base); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":933 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * base = PyArray_BASE(arr) * if base is NULL: */ /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":941 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * __pyx_import_array() */ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_array", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":943 * cdef inline int import_array() except -1: * try: * __pyx_import_array() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.multiarray failed to import") */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":944 * try: * __pyx_import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 944, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":945 * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 945, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 945, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":941 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * __pyx_import_array() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":947 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_umath", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":949 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 949, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":950 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 950, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":951 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 951, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 951, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":947 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":953 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_ufunc", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":955 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 955, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":956 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 956, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":957 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef extern from *: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 957, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 957, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":953 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":967 * * * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.timedelta64)` */ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("is_timedelta64_object", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":979 * bool * """ * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< * * */ __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":967 * * * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.timedelta64)` */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":982 * * * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.datetime64)` */ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("is_datetime64_object", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":994 * bool * """ * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< * * */ __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":982 * * * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.datetime64)` */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":997 * * * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy datetime64 object */ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { npy_datetime __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1004 * also needed. That can be found using `get_datetime64_unit`. * """ * return (obj).obval # <<<<<<<<<<<<<< * * */ __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":997 * * * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy datetime64 object */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1007 * * * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy timedelta64 object */ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { npy_timedelta __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1011 * returns the int64 value underlying scalar numpy timedelta64 object * """ * return (obj).obval # <<<<<<<<<<<<<< * * */ __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1007 * * * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy timedelta64 object */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { NPY_DATETIMEUNIT __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1018 * returns the unit part of the dtype for a numpy datetime64 object. * """ * return (obj).obmeta.base # <<<<<<<<<<<<<< */ __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ /* function exit code */ __pyx_L0:; return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec_histogram2d(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec_histogram2d}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "histogram2d", __pyx_k_2D_Histogram_algorithm, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1}, {&__pyx_n_s_Y, __pyx_k_Y, sizeof(__pyx_k_Y), 0, 0, 1, 1}, {&__pyx_n_s_Z, __pyx_k_Z, sizeof(__pyx_k_Z), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_computation, __pyx_k_computation, sizeof(__pyx_k_computation), 0, 0, 1, 1}, {&__pyx_n_s_cx, __pyx_k_cx, sizeof(__pyx_k_cx), 0, 0, 1, 1}, {&__pyx_n_s_cy, __pyx_k_cy, sizeof(__pyx_k_cy), 0, 0, 1, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_data_tmp, __pyx_k_data_tmp, sizeof(__pyx_k_data_tmp), 0, 0, 1, 1}, {&__pyx_n_s_histogram2d, __pyx_k_histogram2d, sizeof(__pyx_k_histogram2d), 0, 0, 1, 1}, {&__pyx_n_s_histogram2d_func, __pyx_k_histogram2d_func, sizeof(__pyx_k_histogram2d_func), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_i0, __pyx_k_i0, sizeof(__pyx_k_i0), 0, 0, 1, 1}, {&__pyx_n_s_i1, __pyx_k_i1, sizeof(__pyx_k_i1), 0, 0, 1, 1}, {&__pyx_n_s_ix, __pyx_k_ix, sizeof(__pyx_k_ix), 0, 0, 1, 1}, {&__pyx_n_s_iy, __pyx_k_iy, sizeof(__pyx_k_iy), 0, 0, 1, 1}, {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, {&__pyx_n_s_j0, __pyx_k_j0, sizeof(__pyx_k_j0), 0, 0, 1, 1}, {&__pyx_n_s_j1, __pyx_k_j1, sizeof(__pyx_k_j1), 0, 0, 1, 1}, {&__pyx_n_s_logscale, __pyx_k_logscale, sizeof(__pyx_k_logscale), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_nmax, __pyx_k_nmax, sizeof(__pyx_k_nmax), 0, 0, 1, 1}, {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, {&__pyx_n_s_nx, __pyx_k_nx, sizeof(__pyx_k_nx), 0, 0, 1, 1}, {&__pyx_n_s_ny, __pyx_k_ny, sizeof(__pyx_k_ny), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_kp_s_src_histogram2d_pyx, __pyx_k_src_histogram2d_pyx, sizeof(__pyx_k_src_histogram2d_pyx), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_u, __pyx_k_u, sizeof(__pyx_k_u), 0, 0, 1, 1}, {&__pyx_n_s_v, __pyx_k_v, sizeof(__pyx_k_v), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 32, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 945, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":945 * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 945, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":951 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 951, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "histogram2d.pyx":19 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, # <<<<<<<<<<<<<< * double i0, double i1, double j0, double j1, * np.ndarray[double, ndim=2] data, logscale): */ __pyx_tuple__3 = PyTuple_Pack(18, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data, __pyx_n_s_logscale, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny, __pyx_n_s_j); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(8, 0, 18, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 19, __pyx_L1_error) /* "histogram2d.pyx":53 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d_func(np.ndarray[double, ndim=1] X, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=1] Y, * np.ndarray[double, ndim=1] Z, */ __pyx_tuple__5 = PyTuple_Pack(21, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_Z, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data_tmp, __pyx_n_s_data, __pyx_n_s_computation, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_u, __pyx_n_s_v, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(10, 0, 21, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d_func, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 200, __pyx_L1_error) __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 223, __pyx_L1_error) __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 227, __pyx_L1_error) __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 239, __pyx_L1_error) __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 771, __pyx_L1_error) __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 773, __pyx_L1_error) __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 775, __pyx_L1_error) __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 777, __pyx_L1_error) __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 779, __pyx_L1_error) __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 781, __pyx_L1_error) __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 783, __pyx_L1_error) __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 785, __pyx_L1_error) __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 787, __pyx_L1_error) __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 789, __pyx_L1_error) __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 827, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC inithistogram2d(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC inithistogram2d(void) #else __Pyx_PyMODINIT_FUNC PyInit_histogram2d(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit_histogram2d(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec_histogram2d(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module 'histogram2d' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_histogram2d(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("histogram2d", __pyx_methods, __pyx_k_2D_Histogram_algorithm, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_histogram2d) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "histogram2d")) { if (unlikely(PyDict_SetItemString(modules, "histogram2d", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "histogram2d.pyx":19 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, # <<<<<<<<<<<<<< * double i0, double i1, double j0, double j1, * np.ndarray[double, ndim=2] data, logscale): */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_11histogram2d_1histogram2d, NULL, __pyx_n_s_histogram2d); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_histogram2d, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "histogram2d.pyx":53 * @cython.profile(False) * @cython.boundscheck(False) * def histogram2d_func(np.ndarray[double, ndim=1] X, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=1] Y, * np.ndarray[double, ndim=1] Z, */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_11histogram2d_3histogram2d_func, NULL, __pyx_n_s_histogram2d); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_histogram2d_func, __pyx_t_1) < 0) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "histogram2d.pyx":1 * # -*- coding: utf-8 -*- # <<<<<<<<<<<<<< * # * # Copyright (C) 2012 CEA */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init histogram2d", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init histogram2d"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } else if (exact) { #if PY_MAJOR_VERSION == 2 if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(__Pyx_TypeCheck(obj, type))) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } /* IsLittleEndian */ static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) { union { uint32_t u32; uint8_t u8[4]; } S; S.u32 = 0x01020304; return S.u8[0] == 4; } /* BufferFormatCheck */ static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type) { stack[0].field = &ctx->root; stack[0].parent_offset = 0; ctx->root.type = type; ctx->root.name = "buffer dtype"; ctx->root.offset = 0; ctx->head = stack; ctx->head->field = &ctx->root; ctx->fmt_offset = 0; ctx->head->parent_offset = 0; ctx->new_packmode = '@'; ctx->enc_packmode = '@'; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->is_complex = 0; ctx->is_valid_array = 0; ctx->struct_alignment = 0; while (type->typegroup == 'S') { ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = 0; type = type->fields->type; } } static int __Pyx_BufFmt_ParseNumber(const char** ts) { int count; const char* t = *ts; if (*t < '0' || *t > '9') { return -1; } else { count = *t++ - '0'; while (*t >= '0' && *t <= '9') { count *= 10; count += *t++ - '0'; } } *ts = t; return count; } static int __Pyx_BufFmt_ExpectNumber(const char **ts) { int number = __Pyx_BufFmt_ParseNumber(ts); if (number == -1) PyErr_Format(PyExc_ValueError,\ "Does not understand character buffer dtype format string ('%c')", **ts); return number; } static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%c'", ch); } static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { switch (ch) { case '?': return "'bool'"; case 'c': return "'char'"; case 'b': return "'signed char'"; case 'B': return "'unsigned char'"; case 'h': return "'short'"; case 'H': return "'unsigned short'"; case 'i': return "'int'"; case 'I': return "'unsigned int'"; case 'l': return "'long'"; case 'L': return "'unsigned long'"; case 'q': return "'long long'"; case 'Q': return "'unsigned long long'"; case 'f': return (is_complex ? "'complex float'" : "'float'"); case 'd': return (is_complex ? "'complex double'" : "'double'"); case 'g': return (is_complex ? "'complex long double'" : "'long double'"); case 'T': return "a struct"; case 'O': return "Python object"; case 'P': return "a pointer"; case 's': case 'p': return "a string"; case 0: return "end"; default: return "unparseable format string"; } } static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return 2; case 'i': case 'I': case 'l': case 'L': return 4; case 'q': case 'Q': return 8; case 'f': return (is_complex ? 8 : 4); case 'd': return (is_complex ? 16 : 8); case 'g': { PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); return 0; } case 'O': case 'P': return sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(short); case 'i': case 'I': return sizeof(int); case 'l': case 'L': return sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(float) * (is_complex ? 2 : 1); case 'd': return sizeof(double) * (is_complex ? 2 : 1); case 'g': return sizeof(long double) * (is_complex ? 2 : 1); case 'O': case 'P': return sizeof(void*); default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } typedef struct { char c; short x; } __Pyx_st_short; typedef struct { char c; int x; } __Pyx_st_int; typedef struct { char c; long x; } __Pyx_st_long; typedef struct { char c; float x; } __Pyx_st_float; typedef struct { char c; double x; } __Pyx_st_double; typedef struct { char c; long double x; } __Pyx_st_longdouble; typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_st_float) - sizeof(float); case 'd': return sizeof(__Pyx_st_double) - sizeof(double); case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } /* These are for computing the padding at the end of the struct to align on the first member of the struct. This will probably the same as above, but we don't have any guarantees. */ typedef struct { short x; char c; } __Pyx_pad_short; typedef struct { int x; char c; } __Pyx_pad_int; typedef struct { long x; char c; } __Pyx_pad_long; typedef struct { float x; char c; } __Pyx_pad_float; typedef struct { double x; char c; } __Pyx_pad_double; typedef struct { long double x; char c; } __Pyx_pad_longdouble; typedef struct { void *x; char c; } __Pyx_pad_void_p; #ifdef HAVE_LONG_LONG typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { switch (ch) { case 'c': return 'H'; case 'b': case 'h': case 'i': case 'l': case 'q': case 's': case 'p': return 'I'; case '?': case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); case 'O': return 'O'; case 'P': return 'P'; default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { if (ctx->head == NULL || ctx->head->field == &ctx->root) { const char* expected; const char* quote; if (ctx->head == NULL) { expected = "end"; quote = ""; } else { expected = ctx->head->field->type->name; quote = "'"; } PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected %s%s%s but got %s", quote, expected, quote, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); } else { __Pyx_StructField* field = ctx->head->field; __Pyx_StructField* parent = (ctx->head - 1)->field; PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), parent->type->name, field->name); } } static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { char group; size_t size, offset, arraysize = 1; if (ctx->enc_type == 0) return 0; if (ctx->head->field->type->arraysize[0]) { int i, ndim = 0; if (ctx->enc_type == 's' || ctx->enc_type == 'p') { ctx->is_valid_array = ctx->head->field->type->ndim == 1; ndim = 1; if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %zu", ctx->head->field->type->arraysize[0], ctx->enc_count); return -1; } } if (!ctx->is_valid_array) { PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", ctx->head->field->type->ndim, ndim); return -1; } for (i = 0; i < ctx->head->field->type->ndim; i++) { arraysize *= ctx->head->field->type->arraysize[i]; } ctx->is_valid_array = 0; ctx->enc_count = 1; } group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); do { __Pyx_StructField* field = ctx->head->field; __Pyx_TypeInfo* type = field->type; if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); } else { size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } if (ctx->enc_packmode == '@') { size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); size_t align_mod_offset; if (align_at == 0) return -1; align_mod_offset = ctx->fmt_offset % align_at; if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; if (ctx->struct_alignment == 0) ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, ctx->is_complex); } if (type->size != size || type->typegroup != group) { if (type->typegroup == 'C' && type->fields != NULL) { size_t parent_offset = ctx->head->parent_offset + field->offset; ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = parent_offset; continue; } if ((type->typegroup == 'H' || group == 'H') && type->size == size) { } else { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } } offset = ctx->head->parent_offset + field->offset; if (ctx->fmt_offset != offset) { PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); return -1; } ctx->fmt_offset += size; if (arraysize) ctx->fmt_offset += (arraysize - 1) * size; --ctx->enc_count; while (1) { if (field == &ctx->root) { ctx->head = NULL; if (ctx->enc_count != 0) { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } break; } ctx->head->field = ++field; if (field->type == NULL) { --ctx->head; field = ctx->head->field; continue; } else if (field->type->typegroup == 'S') { size_t parent_offset = ctx->head->parent_offset + field->offset; if (field->type->fields->type == NULL) continue; field = field->type->fields; ++ctx->head; ctx->head->field = field; ctx->head->parent_offset = parent_offset; break; } else { break; } } } while (ctx->enc_count); ctx->enc_type = 0; ctx->is_complex = 0; return 0; } static PyObject * __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) { const char *ts = *tsp; int i = 0, number, ndim; ++ts; if (ctx->new_count != 1) { PyErr_SetString(PyExc_ValueError, "Cannot handle repeated arrays in format string"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ndim = ctx->head->field->type->ndim; while (*ts && *ts != ')') { switch (*ts) { case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; default: break; } number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) return PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %d", ctx->head->field->type->arraysize[i], number); if (*ts != ',' && *ts != ')') return PyErr_Format(PyExc_ValueError, "Expected a comma in format string, got '%c'", *ts); if (*ts == ',') ts++; i++; } if (i != ndim) return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", ctx->head->field->type->ndim, i); if (!*ts) { PyErr_SetString(PyExc_ValueError, "Unexpected end of format string, expected ')'"); return NULL; } ctx->is_valid_array = 1; ctx->new_count = 1; *tsp = ++ts; return Py_None; } static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { int got_Z = 0; while (1) { switch(*ts) { case 0: if (ctx->enc_type != 0 && ctx->head == NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; if (ctx->head != NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } return ts; case ' ': case '\r': case '\n': ++ts; break; case '<': if (!__Pyx_Is_Little_Endian()) { PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '>': case '!': if (__Pyx_Is_Little_Endian()) { PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '=': case '@': case '^': ctx->new_packmode = *ts++; break; case 'T': { const char* ts_after_sub; size_t i, struct_count = ctx->new_count; size_t struct_alignment = ctx->struct_alignment; ctx->new_count = 1; ++ts; if (*ts != '{') { PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; ctx->enc_count = 0; ctx->struct_alignment = 0; ++ts; ts_after_sub = ts; for (i = 0; i != struct_count; ++i) { ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); if (!ts_after_sub) return NULL; } ts = ts_after_sub; if (struct_alignment) ctx->struct_alignment = struct_alignment; } break; case '}': { size_t alignment = ctx->struct_alignment; ++ts; if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; if (alignment && ctx->fmt_offset % alignment) { ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); } } return ts; case 'x': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->fmt_offset += ctx->new_count; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->enc_packmode = ctx->new_packmode; ++ts; break; case 'Z': got_Z = 1; ++ts; if (*ts != 'f' && *ts != 'd' && *ts != 'g') { __Pyx_BufFmt_RaiseUnexpectedChar('Z'); return NULL; } CYTHON_FALLTHROUGH; case '?': case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': case 'p': if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { ctx->enc_count += ctx->new_count; ctx->new_count = 1; got_Z = 0; ++ts; break; } CYTHON_FALLTHROUGH; case 's': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_count = ctx->new_count; ctx->enc_packmode = ctx->new_packmode; ctx->enc_type = *ts; ctx->is_complex = got_Z; ++ts; ctx->new_count = 1; got_Z = 0; break; case ':': ++ts; while(*ts != ':') ++ts; ++ts; break; case '(': if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; break; default: { int number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; ctx->new_count = (size_t)number; } } } } /* BufferGetAndValidate */ static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { if (unlikely(info->buf == NULL)) return; if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; __Pyx_ReleaseBuffer(info); } static void __Pyx_ZeroBuffer(Py_buffer* buf) { buf->buf = NULL; buf->obj = NULL; buf->strides = __Pyx_zeros; buf->shape = __Pyx_zeros; buf->suboffsets = __Pyx_minusones; } static int __Pyx__GetBufferAndValidate( Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { buf->buf = NULL; if (unlikely(__Pyx_GetBuffer(obj, buf, flags) == -1)) { __Pyx_ZeroBuffer(buf); return -1; } if (unlikely(buf->ndim != nd)) { PyErr_Format(PyExc_ValueError, "Buffer has wrong number of dimensions (expected %d, got %d)", nd, buf->ndim); goto fail; } if (!cast) { __Pyx_BufFmt_Context ctx; __Pyx_BufFmt_Init(&ctx, stack, dtype); if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; } if (unlikely((size_t)buf->itemsize != dtype->size)) { PyErr_Format(PyExc_ValueError, "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", buf->itemsize, (buf->itemsize > 1) ? "s" : "", dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); goto fail; } if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; return 0; fail:; __Pyx_SafeReleaseBuffer(buf); return -1; } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; icurexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; if (unlikely(PyTuple_Check(err))) return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); return -1; } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject *obj = view->obj; if (!obj) return; if (PyObject_CheckBuffer(obj)) { PyBuffer_Release(view); return; } if ((0)) {} view->obj = NULL; Py_DECREF(obj); } #endif /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabsf(b.real) >= fabsf(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { float r = b.imag / b.real; float s = (float)(1.0) / (b.real + b.imag * r); return __pyx_t_float_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { float r = b.real / b.imag; float s = (float)(1.0) / (b.imag + b.real * r); return __pyx_t_float_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else { float denom = b.real * b.real + b.imag * b.imag; return __pyx_t_float_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: return __Pyx_c_prod_float(a, a); case 3: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, a); case 4: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = powf(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2f(0.0, -1.0); } } else { r = __Pyx_c_abs_float(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabs(b.real) >= fabs(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { double r = b.imag / b.real; double s = (double)(1.0) / (b.real + b.imag * r); return __pyx_t_double_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { double r = b.real / b.imag; double s = (double)(1.0) / (b.imag + b.real * r); return __pyx_t_double_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else { double denom = b.real * b.real + b.imag * b.imag; return __pyx_t_double_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: return __Pyx_c_prod_double(a, a); case 3: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, a); case 4: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = pow(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2(0.0, -1.0); } } else { r = __Pyx_c_abs_double(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(unsigned int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(unsigned int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(unsigned int), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(unsigned int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (unsigned int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (unsigned int) 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, digits[0]) case 2: if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT) { return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; case 3: if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT) { return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; case 4: if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 4 * PyLong_SHIFT) { return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (unsigned int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(unsigned int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (unsigned int) 0; case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +digits[0]) case -2: if (8 * sizeof(unsigned int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 2: if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case -3: if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 3: if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case -4: if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 4: if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; } #endif if (sizeof(unsigned int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else unsigned int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (unsigned int) -1; } } else { unsigned int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (unsigned int) -1; val = __Pyx_PyInt_As_unsigned_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned int"); return (unsigned int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? (Py_ssize_t)(digits[0]) : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/src/histogram2d.pyx0000666000000000000000000000655200000000000013513 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """2D-Histogram algorithm""" cimport cython cimport numpy as np from libc.math cimport log cdef inline double double_max(double a, double b): return a if a >= b else b cdef inline double double_min(double a, double b): return a if a <= b else b @cython.profile(False) @cython.boundscheck(False) def histogram2d(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, double i0, double i1, double j0, double j1, np.ndarray[double, ndim=2] data, logscale): """Compute 2-D Histogram from data X, Y""" cdef double cx, cy, nmax, ix, iy cdef unsigned int i cdef unsigned int n = X.shape[0] cdef unsigned int nx = data.shape[1] cdef unsigned int ny = data.shape[0] cx = nx/(i1-i0) cy = ny/(j1-j0) for i in range(n): # Centered bins => - .5 ix = (X[i]-i0)*cx - .5 iy = (Y[i]-j0)*cy - .5 if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: data[ iy, ix] += 1 nmax = 0. if logscale: for j in range(ny): for i in range(nx): data[j, i] = log(1+data[j, i]) nmax = double_max(nmax, data[j, i]) else: for j in range(ny): for i in range(nx): nmax = double_max(nmax, data[j, i]) return nmax @cython.profile(False) @cython.boundscheck(False) def histogram2d_func(np.ndarray[double, ndim=1] X, np.ndarray[double, ndim=1] Y, np.ndarray[double, ndim=1] Z, double i0, double i1, double j0, double j1, np.ndarray[double, ndim=2] data_tmp, np.ndarray[double, ndim=2] data, int computation): """Compute 2-D Histogram from data X, Y""" cdef double cx, cy, nmax, ix, iy cdef unsigned int i, u, v cdef unsigned int n = X.shape[0] cdef unsigned int nx = data.shape[1] cdef unsigned int ny = data.shape[0] cx = nx/(i1-i0) cy = ny/(j1-j0) for i in range(n): # Centered bins => - .5 ix = (X[i]-i0)*cx - .5 iy = (Y[i]-j0)*cy - .5 if ix >= 0 and ix <= nx-1 and iy >= 0 and iy <= ny-1: u, v = iy, ix if computation == 0: # max data_tmp[u, v] += 1 data[u, v] = double_max(data[u, v], Z[i]) elif computation == 1: # min data_tmp[u, v] += 1 data[u, v] = double_min(data[u, v], Z[i]) elif computation == 2: # sum data_tmp[u, v] += 1 data[u, v] += Z[i] elif computation == 3: # prod data_tmp[u, v] += 1 data[u, v] *= Z[i] elif computation == 4: # avg data_tmp[u, v] += 1 data[u, v] += (Z[i]-data[u, v])/data_tmp[u, v] elif computation == 5: # argmin if data[u, v] > Z[i]: data_tmp[u, v] = i data[u, v] = Z[i] elif computation == 6: # argmax if data[u, v] < Z[i]: data_tmp[u, v] = i data[u, v] = Z[i] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1640626332.0 guiqwt-4.0.1/src/mandelbrot.c0000666000000000000000000067462300000000000013033 0ustar00/* Generated by Cython 0.29.23 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_23" #define CYTHON_HEX_VERSION 0x001D17F0 #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__mandelbrot #define __PYX_HAVE_API__mandelbrot /* Early includes */ #include #include #include "numpy/arrayobject.h" #include "numpy/ndarrayobject.h" #include "numpy/ndarraytypes.h" #include "numpy/arrayscalars.h" #include "numpy/ufuncobject.h" /* NumPy API declarations from "numpy/__init__.pxd" */ #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; /* Header.proto */ #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "src\\mandelbrot.pyx", "__init__.pxd", "type.pxd", }; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":690 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":691 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":692 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":693 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":697 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":698 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":699 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":700 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":704 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":705 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":714 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":715 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":716 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":718 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":719 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":720 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":722 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":723 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":725 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":726 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":727 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); /*--- Type declarations ---*/ /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":729 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":730 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":731 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":733 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* RealImag.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(__cplusplus) && CYTHON_CCOMPLEX\ && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_float(a, b) ((a)==(b)) #define __Pyx_c_sum_float(a, b) ((a)+(b)) #define __Pyx_c_diff_float(a, b) ((a)-(b)) #define __Pyx_c_prod_float(a, b) ((a)*(b)) #define __Pyx_c_quot_float(a, b) ((a)/(b)) #define __Pyx_c_neg_float(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_float(z) ((z)==(float)0) #define __Pyx_c_conj_float(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_float(z) (::std::abs(z)) #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_float(z) ((z)==0) #define __Pyx_c_conj_float(z) (conjf(z)) #if 1 #define __Pyx_c_abs_float(z) (cabsf(z)) #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_double(a, b) ((a)==(b)) #define __Pyx_c_sum_double(a, b) ((a)+(b)) #define __Pyx_c_diff_double(a, b) ((a)-(b)) #define __Pyx_c_prod_double(a, b) ((a)*(b)) #define __Pyx_c_quot_double(a, b) ((a)/(b)) #define __Pyx_c_neg_double(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_double(z) ((z)==(double)0) #define __Pyx_c_conj_double(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_double(z) (::std::abs(z)) #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_double(z) ((z)==0) #define __Pyx_c_conj_double(z) (conj(z)) #if 1 #define __Pyx_c_abs_double(z) (cabs(z)) #define __Pyx_c_pow_double(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif /* CIntFromPy.proto */ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'cython' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'cpython' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_generic = 0; static PyTypeObject *__pyx_ptype_5numpy_number = 0; static PyTypeObject *__pyx_ptype_5numpy_integer = 0; static PyTypeObject *__pyx_ptype_5numpy_signedinteger = 0; static PyTypeObject *__pyx_ptype_5numpy_unsignedinteger = 0; static PyTypeObject *__pyx_ptype_5numpy_inexact = 0; static PyTypeObject *__pyx_ptype_5numpy_floating = 0; static PyTypeObject *__pyx_ptype_5numpy_complexfloating = 0; static PyTypeObject *__pyx_ptype_5numpy_flexible = 0; static PyTypeObject *__pyx_ptype_5numpy_character = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; /* Module declarations from 'mandelbrot' */ static CYTHON_INLINE int __pyx_f_10mandelbrot_mandel(double, double, int); /*proto*/ #define __Pyx_MODULE_NAME "mandelbrot" extern int __pyx_module_is_main_mandelbrot; int __pyx_module_is_main_mandelbrot = 0; /* Implementation of 'mandelbrot' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_ImportError; static const char __pyx_k_dx[] = "dx"; static const char __pyx_k_dy[] = "dy"; static const char __pyx_k_x1[] = "x1"; static const char __pyx_k_x2[] = "x2"; static const char __pyx_k_y1[] = "y1"; static const char __pyx_k_y2[] = "y2"; static const char __pyx_k_col[] = "col"; static const char __pyx_k_row[] = "row"; static const char __pyx_k_cols[] = "cols"; static const char __pyx_k_data[] = "data"; static const char __pyx_k_imag[] = "imag"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_nmax[] = "nmax"; static const char __pyx_k_real[] = "real"; static const char __pyx_k_rows[] = "rows"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_shape[] = "shape"; static const char __pyx_k_mandelbrot[] = "mandelbrot"; static const char __pyx_k_ImportError[] = "ImportError"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_src_mandelbrot_pyx[] = "src\\mandelbrot.pyx"; static const char __pyx_k_Mandelbrot_algorithm[] = "Mandelbrot algorithm"; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static PyObject *__pyx_n_s_ImportError; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_col; static PyObject *__pyx_n_s_cols; static PyObject *__pyx_n_s_data; static PyObject *__pyx_n_s_dx; static PyObject *__pyx_n_s_dy; static PyObject *__pyx_n_s_imag; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_mandelbrot; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_nmax; static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_real; static PyObject *__pyx_n_s_row; static PyObject *__pyx_n_s_rows; static PyObject *__pyx_n_s_shape; static PyObject *__pyx_kp_s_src_mandelbrot_pyx; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_x1; static PyObject *__pyx_n_s_x2; static PyObject *__pyx_n_s_y1; static PyObject *__pyx_n_s_y2; static PyObject *__pyx_pf_10mandelbrot_mandelbrot(CYTHON_UNUSED PyObject *__pyx_self, double __pyx_v_x1, double __pyx_v_y1, double __pyx_v_x2, double __pyx_v_y2, PyObject *__pyx_v_data, unsigned int __pyx_v_nmax); /* proto */ static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; static PyObject *__pyx_codeobj__4; /* Late includes */ /* "mandelbrot.pyx":14 * * @cython.profile(False) * cdef inline int mandel(double real, double imag, int nmax): # <<<<<<<<<<<<<< * cdef double z_real=0., z_imag=0. * cdef int i */ static CYTHON_INLINE int __pyx_f_10mandelbrot_mandel(double __pyx_v_real, double __pyx_v_imag, int __pyx_v_nmax) { double __pyx_v_z_real; double __pyx_v_z_imag; int __pyx_v_i; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; double __pyx_t_4; double __pyx_t_5; int __pyx_t_6; __Pyx_RefNannySetupContext("mandel", 0); /* "mandelbrot.pyx":15 * @cython.profile(False) * cdef inline int mandel(double real, double imag, int nmax): * cdef double z_real=0., z_imag=0. # <<<<<<<<<<<<<< * cdef int i * for i in range(nmax): */ __pyx_v_z_real = 0.; __pyx_v_z_imag = 0.; /* "mandelbrot.pyx":17 * cdef double z_real=0., z_imag=0. * cdef int i * for i in range(nmax): # <<<<<<<<<<<<<< * z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, * 2*z_real*z_imag + imag) */ __pyx_t_1 = __pyx_v_nmax; __pyx_t_2 = __pyx_t_1; for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; /* "mandelbrot.pyx":18 * cdef int i * for i in range(nmax): * z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, # <<<<<<<<<<<<<< * 2*z_real*z_imag + imag) * if z_real*z_real + z_imag*z_imag > 4: */ __pyx_t_4 = (((__pyx_v_z_real * __pyx_v_z_real) - (__pyx_v_z_imag * __pyx_v_z_imag)) + __pyx_v_real); /* "mandelbrot.pyx":19 * for i in range(nmax): * z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, * 2*z_real*z_imag + imag) # <<<<<<<<<<<<<< * if z_real*z_real + z_imag*z_imag > 4: * return i */ __pyx_t_5 = (((2.0 * __pyx_v_z_real) * __pyx_v_z_imag) + __pyx_v_imag); __pyx_v_z_real = __pyx_t_4; __pyx_v_z_imag = __pyx_t_5; /* "mandelbrot.pyx":20 * z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, * 2*z_real*z_imag + imag) * if z_real*z_real + z_imag*z_imag > 4: # <<<<<<<<<<<<<< * return i * return -1 */ __pyx_t_6 = ((((__pyx_v_z_real * __pyx_v_z_real) + (__pyx_v_z_imag * __pyx_v_z_imag)) > 4.0) != 0); if (__pyx_t_6) { /* "mandelbrot.pyx":21 * 2*z_real*z_imag + imag) * if z_real*z_real + z_imag*z_imag > 4: * return i # <<<<<<<<<<<<<< * return -1 * */ __pyx_r = __pyx_v_i; goto __pyx_L0; /* "mandelbrot.pyx":20 * z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, * 2*z_real*z_imag + imag) * if z_real*z_real + z_imag*z_imag > 4: # <<<<<<<<<<<<<< * return i * return -1 */ } } /* "mandelbrot.pyx":22 * if z_real*z_real + z_imag*z_imag > 4: * return i * return -1 # <<<<<<<<<<<<<< * * @cython.boundscheck(False) */ __pyx_r = -1; goto __pyx_L0; /* "mandelbrot.pyx":14 * * @cython.profile(False) * cdef inline int mandel(double real, double imag, int nmax): # <<<<<<<<<<<<<< * cdef double z_real=0., z_imag=0. * cdef int i */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "mandelbrot.pyx":25 * * @cython.boundscheck(False) * def mandelbrot(double x1, double y1, double x2, double y2, # <<<<<<<<<<<<<< * data, unsigned int nmax): * """Compute Mandelbrot fractal""" */ /* Python wrapper */ static PyObject *__pyx_pw_10mandelbrot_1mandelbrot(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_10mandelbrot_mandelbrot[] = "Compute Mandelbrot fractal"; static PyMethodDef __pyx_mdef_10mandelbrot_1mandelbrot = {"mandelbrot", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10mandelbrot_1mandelbrot, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10mandelbrot_mandelbrot}; static PyObject *__pyx_pw_10mandelbrot_1mandelbrot(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_x1; double __pyx_v_y1; double __pyx_v_x2; double __pyx_v_y2; PyObject *__pyx_v_data = 0; unsigned int __pyx_v_nmax; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("mandelbrot (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x1,&__pyx_n_s_y1,&__pyx_n_s_x2,&__pyx_n_s_y2,&__pyx_n_s_data,&__pyx_n_s_nmax,0}; PyObject* values[6] = {0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_x1)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_y1)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, 1); __PYX_ERR(0, 25, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_x2)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, 2); __PYX_ERR(0, 25, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_y2)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, 3); __PYX_ERR(0, 25, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, 4); __PYX_ERR(0, 25, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nmax)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, 5); __PYX_ERR(0, 25, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "mandelbrot") < 0)) __PYX_ERR(0, 25, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } __pyx_v_x1 = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_x1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L3_error) __pyx_v_y1 = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L3_error) __pyx_v_x2 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_x2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L3_error) __pyx_v_y2 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_y2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 25, __pyx_L3_error) __pyx_v_data = values[4]; __pyx_v_nmax = __Pyx_PyInt_As_unsigned_int(values[5]); if (unlikely((__pyx_v_nmax == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("mandelbrot", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 25, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("mandelbrot.mandelbrot", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_10mandelbrot_mandelbrot(__pyx_self, __pyx_v_x1, __pyx_v_y1, __pyx_v_x2, __pyx_v_y2, __pyx_v_data, __pyx_v_nmax); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_10mandelbrot_mandelbrot(CYTHON_UNUSED PyObject *__pyx_self, double __pyx_v_x1, double __pyx_v_y1, double __pyx_v_x2, double __pyx_v_y2, PyObject *__pyx_v_data, unsigned int __pyx_v_nmax) { double __pyx_v_dx; double __pyx_v_dy; double __pyx_v_real; double __pyx_v_imag; unsigned int __pyx_v_row; unsigned int __pyx_v_col; unsigned int __pyx_v_rows; unsigned int __pyx_v_cols; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; unsigned int __pyx_t_3; double __pyx_t_4; long __pyx_t_5; unsigned int __pyx_t_6; unsigned int __pyx_t_7; unsigned int __pyx_t_8; unsigned int __pyx_t_9; unsigned int __pyx_t_10; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("mandelbrot", 0); /* "mandelbrot.pyx":30 * cdef double dx, dy, real, imag * cdef unsigned int row, col * cdef unsigned int rows = data.shape[0] # <<<<<<<<<<<<<< * cdef unsigned int cols = data.shape[1] * */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = __Pyx_PyInt_As_unsigned_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_rows = __pyx_t_3; /* "mandelbrot.pyx":31 * cdef unsigned int row, col * cdef unsigned int rows = data.shape[0] * cdef unsigned int cols = data.shape[1] # <<<<<<<<<<<<<< * * dx = (x2-x1)/(cols-1) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_3 = __Pyx_PyInt_As_unsigned_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_cols = __pyx_t_3; /* "mandelbrot.pyx":33 * cdef unsigned int cols = data.shape[1] * * dx = (x2-x1)/(cols-1) # <<<<<<<<<<<<<< * dy = (y2-y1)/(rows-1) * */ __pyx_t_4 = (__pyx_v_x2 - __pyx_v_x1); __pyx_t_5 = (__pyx_v_cols - 1); if (unlikely(__pyx_t_5 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 33, __pyx_L1_error) } __pyx_v_dx = (__pyx_t_4 / __pyx_t_5); /* "mandelbrot.pyx":34 * * dx = (x2-x1)/(cols-1) * dy = (y2-y1)/(rows-1) # <<<<<<<<<<<<<< * * for col in range(cols): */ __pyx_t_4 = (__pyx_v_y2 - __pyx_v_y1); __pyx_t_5 = (__pyx_v_rows - 1); if (unlikely(__pyx_t_5 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 34, __pyx_L1_error) } __pyx_v_dy = (__pyx_t_4 / __pyx_t_5); /* "mandelbrot.pyx":36 * dy = (y2-y1)/(rows-1) * * for col in range(cols): # <<<<<<<<<<<<<< * real = x1 + col*dx * for row in range(rows): */ __pyx_t_3 = __pyx_v_cols; __pyx_t_6 = __pyx_t_3; for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { __pyx_v_col = __pyx_t_7; /* "mandelbrot.pyx":37 * * for col in range(cols): * real = x1 + col*dx # <<<<<<<<<<<<<< * for row in range(rows): * imag = y1 + row*dy */ __pyx_v_real = (__pyx_v_x1 + (__pyx_v_col * __pyx_v_dx)); /* "mandelbrot.pyx":38 * for col in range(cols): * real = x1 + col*dx * for row in range(rows): # <<<<<<<<<<<<<< * imag = y1 + row*dy * data[row, col] = mandel(real, imag, nmax) */ __pyx_t_8 = __pyx_v_rows; __pyx_t_9 = __pyx_t_8; for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_row = __pyx_t_10; /* "mandelbrot.pyx":39 * real = x1 + col*dx * for row in range(rows): * imag = y1 + row*dy # <<<<<<<<<<<<<< * data[row, col] = mandel(real, imag, nmax) */ __pyx_v_imag = (__pyx_v_y1 + (__pyx_v_row * __pyx_v_dy)); /* "mandelbrot.pyx":40 * for row in range(rows): * imag = y1 + row*dy * data[row, col] = mandel(real, imag, nmax) # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_10mandelbrot_mandel(__pyx_v_real, __pyx_v_imag, __pyx_v_nmax)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_row); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_11 = __Pyx_PyInt_From_unsigned_int(__pyx_v_col); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11); __pyx_t_2 = 0; __pyx_t_11 = 0; if (unlikely(PyObject_SetItem(__pyx_v_data, __pyx_t_12, __pyx_t_1) < 0)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } } /* "mandelbrot.pyx":25 * * @cython.boundscheck(False) * def mandelbrot(double x1, double y1, double x2, double y2, # <<<<<<<<<<<<<< * data, unsigned int nmax): * """Compute Mandelbrot fractal""" */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("mandelbrot.mandelbrot", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":735 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":736 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 736, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":735 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":738 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":739 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 739, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":738 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":741 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":742 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 742, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":741 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":744 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":745 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 745, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":744 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":747 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":748 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline tuple PyDataType_SHAPE(dtype d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":747 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":750 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":751 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< * return d.subarray.shape * else: */ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":752 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< * else: * return () */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":751 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< * return d.subarray.shape * else: */ } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":754 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_empty_tuple); __pyx_r = __pyx_empty_tuple; goto __pyx_L0; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":750 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape */ /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":929 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_array_base", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":930 * * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< * PyArray_SetBaseObject(arr, base) * */ Py_INCREF(__pyx_v_base); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":931 * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base)); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":929 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":933 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * base = PyArray_BASE(arr) * if base is NULL: */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_v_base; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":934 * * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< * if base is NULL: * return None */ __pyx_v_base = PyArray_BASE(__pyx_v_arr); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":935 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< * return None * return base */ __pyx_t_1 = ((__pyx_v_base == NULL) != 0); if (__pyx_t_1) { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":936 * base = PyArray_BASE(arr) * if base is NULL: * return None # <<<<<<<<<<<<<< * return base * */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":935 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< * return None * return base */ } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":937 * if base is NULL: * return None * return base # <<<<<<<<<<<<<< * * # Versions of the import_* functions which are more suitable for */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_base)); __pyx_r = ((PyObject *)__pyx_v_base); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":933 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * base = PyArray_BASE(arr) * if base is NULL: */ /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":941 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * __pyx_import_array() */ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_array", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":943 * cdef inline int import_array() except -1: * try: * __pyx_import_array() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.multiarray failed to import") */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":944 * try: * __pyx_import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 944, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":945 * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 945, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 945, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":942 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * __pyx_import_array() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":941 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * __pyx_import_array() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":947 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_umath", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":949 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 949, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":950 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 950, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":951 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 951, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 951, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":948 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":947 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":953 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_ufunc", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":955 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 955, __pyx_L3_error) /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":956 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 956, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":957 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef extern from *: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 957, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 957, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":954 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":953 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":967 * * * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.timedelta64)` */ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("is_timedelta64_object", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":979 * bool * """ * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< * * */ __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":967 * * * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.timedelta64)` */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":982 * * * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.datetime64)` */ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("is_datetime64_object", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":994 * bool * """ * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< * * */ __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":982 * * * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< * """ * Cython equivalent of `isinstance(obj, np.datetime64)` */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":997 * * * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy datetime64 object */ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { npy_datetime __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1004 * also needed. That can be found using `get_datetime64_unit`. * """ * return (obj).obval # <<<<<<<<<<<<<< * * */ __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":997 * * * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy datetime64 object */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1007 * * * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy timedelta64 object */ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { npy_timedelta __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1011 * returns the int64 value underlying scalar numpy timedelta64 object * """ * return (obj).obval # <<<<<<<<<<<<<< * * */ __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1007 * * * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the int64 value underlying scalar numpy timedelta64 object */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { NPY_DATETIMEUNIT __pyx_r; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1018 * returns the unit part of the dtype for a numpy datetime64 object. * """ * return (obj).obmeta.base # <<<<<<<<<<<<<< */ __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); goto __pyx_L0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ /* function exit code */ __pyx_L0:; return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec_mandelbrot(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec_mandelbrot}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "mandelbrot", __pyx_k_Mandelbrot_algorithm, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_col, __pyx_k_col, sizeof(__pyx_k_col), 0, 0, 1, 1}, {&__pyx_n_s_cols, __pyx_k_cols, sizeof(__pyx_k_cols), 0, 0, 1, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_dx, __pyx_k_dx, sizeof(__pyx_k_dx), 0, 0, 1, 1}, {&__pyx_n_s_dy, __pyx_k_dy, sizeof(__pyx_k_dy), 0, 0, 1, 1}, {&__pyx_n_s_imag, __pyx_k_imag, sizeof(__pyx_k_imag), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_mandelbrot, __pyx_k_mandelbrot, sizeof(__pyx_k_mandelbrot), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_nmax, __pyx_k_nmax, sizeof(__pyx_k_nmax), 0, 0, 1, 1}, {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_real, __pyx_k_real, sizeof(__pyx_k_real), 0, 0, 1, 1}, {&__pyx_n_s_row, __pyx_k_row, sizeof(__pyx_k_row), 0, 0, 1, 1}, {&__pyx_n_s_rows, __pyx_k_rows, sizeof(__pyx_k_rows), 0, 0, 1, 1}, {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, {&__pyx_kp_s_src_mandelbrot_pyx, __pyx_k_src_mandelbrot_pyx, sizeof(__pyx_k_src_mandelbrot_pyx), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_x1, __pyx_k_x1, sizeof(__pyx_k_x1), 0, 0, 1, 1}, {&__pyx_n_s_x2, __pyx_k_x2, sizeof(__pyx_k_x2), 0, 0, 1, 1}, {&__pyx_n_s_y1, __pyx_k_y1, sizeof(__pyx_k_y1), 0, 0, 1, 1}, {&__pyx_n_s_y2, __pyx_k_y2, sizeof(__pyx_k_y2), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 17, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 945, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":945 * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 945, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":951 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 951, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "mandelbrot.pyx":25 * * @cython.boundscheck(False) * def mandelbrot(double x1, double y1, double x2, double y2, # <<<<<<<<<<<<<< * data, unsigned int nmax): * """Compute Mandelbrot fractal""" */ __pyx_tuple__3 = PyTuple_Pack(14, __pyx_n_s_x1, __pyx_n_s_y1, __pyx_n_s_x2, __pyx_n_s_y2, __pyx_n_s_data, __pyx_n_s_nmax, __pyx_n_s_dx, __pyx_n_s_dy, __pyx_n_s_real, __pyx_n_s_imag, __pyx_n_s_row, __pyx_n_s_col, __pyx_n_s_rows, __pyx_n_s_cols); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(6, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_mandelbrot_pyx, __pyx_n_s_mandelbrot, 25, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 200, __pyx_L1_error) __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 223, __pyx_L1_error) __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 227, __pyx_L1_error) __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 239, __pyx_L1_error) __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 771, __pyx_L1_error) __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 773, __pyx_L1_error) __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 775, __pyx_L1_error) __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 777, __pyx_L1_error) __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 779, __pyx_L1_error) __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 781, __pyx_L1_error) __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 783, __pyx_L1_error) __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 785, __pyx_L1_error) __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 787, __pyx_L1_error) __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 789, __pyx_L1_error) __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 827, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC initmandelbrot(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC initmandelbrot(void) #else __Pyx_PyMODINIT_FUNC PyInit_mandelbrot(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit_mandelbrot(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec_mandelbrot(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module 'mandelbrot' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_mandelbrot(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("mandelbrot", __pyx_methods, __pyx_k_Mandelbrot_algorithm, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_mandelbrot) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "mandelbrot")) { if (unlikely(PyDict_SetItemString(modules, "mandelbrot", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "mandelbrot.pyx":25 * * @cython.boundscheck(False) * def mandelbrot(double x1, double y1, double x2, double y2, # <<<<<<<<<<<<<< * data, unsigned int nmax): * """Compute Mandelbrot fractal""" */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10mandelbrot_1mandelbrot, NULL, __pyx_n_s_mandelbrot); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_mandelbrot, __pyx_t_1) < 0) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "mandelbrot.pyx":1 * # -*- coding: utf-8 -*- # <<<<<<<<<<<<<< * # * # Copyright (C) 2012 CEA */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "../../Apps/WPy64-3950/python-3.9.5.amd64/lib/site-packages/numpy/__init__.pxd":1014 * * * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< * """ * returns the unit part of the dtype for a numpy datetime64 object. */ /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init mandelbrot", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init mandelbrot"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; icurexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; if (unlikely(PyTuple_Check(err))) return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabsf(b.real) >= fabsf(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { float r = b.imag / b.real; float s = (float)(1.0) / (b.real + b.imag * r); return __pyx_t_float_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { float r = b.real / b.imag; float s = (float)(1.0) / (b.imag + b.real * r); return __pyx_t_float_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else { float denom = b.real * b.real + b.imag * b.imag; return __pyx_t_float_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: return __Pyx_c_prod_float(a, a); case 3: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, a); case 4: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = powf(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2f(0.0, -1.0); } } else { r = __Pyx_c_abs_float(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabs(b.real) >= fabs(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { double r = b.imag / b.real; double s = (double)(1.0) / (b.real + b.imag * r); return __pyx_t_double_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { double r = b.real / b.imag; double s = (double)(1.0) / (b.imag + b.real * r); return __pyx_t_double_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else { double denom = b.real * b.real + b.imag * b.imag; return __pyx_t_double_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: return __Pyx_c_prod_double(a, a); case 3: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, a); case 4: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = pow(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2(0.0, -1.0); } } else { r = __Pyx_c_abs_double(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif /* CIntFromPy */ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(unsigned int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (unsigned int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (unsigned int) 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, digits[0]) case 2: if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT) { return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; case 3: if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT) { return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; case 4: if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) >= 4 * PyLong_SHIFT) { return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (unsigned int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(unsigned int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (unsigned int) 0; case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +digits[0]) case -2: if (8 * sizeof(unsigned int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 2: if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case -3: if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 3: if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case -4: if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; case 4: if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); } } break; } #endif if (sizeof(unsigned int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else unsigned int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (unsigned int) -1; } } else { unsigned int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (unsigned int) -1; val = __Pyx_PyInt_As_unsigned_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned int"); return (unsigned int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(unsigned int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(unsigned int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(unsigned int), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? (Py_ssize_t)(digits[0]) : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/src/mandelbrot.pyx0000666000000000000000000000222000000000000013403 0ustar00# -*- coding: utf-8 -*- # # Copyright (C) 2012 CEA # Pierre Raybaut # Licensed under the terms of the CECILL License # (see guiqwt/__init__.py for details) """Mandelbrot algorithm""" cimport cython cimport numpy as np @cython.profile(False) cdef inline int mandel(double real, double imag, int nmax): cdef double z_real=0., z_imag=0. cdef int i for i in range(nmax): z_real, z_imag = (z_real*z_real - z_imag*z_imag + real, 2*z_real*z_imag + imag) if z_real*z_real + z_imag*z_imag > 4: return i return -1 @cython.boundscheck(False) def mandelbrot(double x1, double y1, double x2, double y2, data, unsigned int nmax): """Compute Mandelbrot fractal""" cdef double dx, dy, real, imag cdef unsigned int row, col cdef unsigned int rows = data.shape[0] cdef unsigned int cols = data.shape[1] dx = (x2-x1)/(cols-1) dy = (y2-y1)/(rows-1) for col in range(cols): real = x1 + col*dx for row in range(rows): imag = y1 + row*dy data[row, col] = mandel(real, imag, nmax) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1442646572.0 guiqwt-4.0.1/src/pcolor.cpp0000666000000000000000000002647500000000000012536 0ustar00/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */ /* Copyright © 2010-2011 CEA Ludovic Aubry Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) */ #include #define NO_IMPORT_ARRAY #define PY_ARRAY_UNIQUE_SYMBOL PyScalerArray #include #ifdef _MSC_VER #include #pragma fenv_access (on) #else #include #endif #include #if defined(_MSC_VER) || defined(__MINGW32__) #define isnan(x) _isnan(x) #endif #include #include #include #include "arrays.hpp" #include "scaler.hpp" using std::vector; using std::min; using std::max; using std::swap; #if 0 /** return min(max(a,b,c,d),bound) */ static int max4(int a, int b, int c, int d, int bound) { int x, y, z; x = (a>b ? a : b); y = (c>d ? c : d); z = (x>y ? x : y); return (z>bound ? bound : z); } /** return max(min(a,b,c,d),bound) */ static int min4(int a, int b, int c, int d, int bound) { int x, y, z; x = (a& imin, vector& imax, bool draw, npy_uint32 col, Array2D& D) { int x0 = lrint(_x0); int y0 = lrint(_y0); int x1 = lrint(_x1); int y1 = lrint(_y1); int dx = abs(x1-x0); int dy = abs(y1-y0); int sx, sy; int NY=imin.size()-1; int err, e2; bool visible=false; NX = NX-1; if (x0 < x1) sx = 1; else sx = -1; if (y0 < y1) sy = 1; else sy = -1; err = dx-dy; do { if (y0>=0 && y0<=NY) { int _min = min(imin[y0],x0); int _max = max(imax[y0],x0); if (draw) { if (x0>=0 && x0<=NX) { D.value(x0,y0) = col; } } imin[y0] = max( 0,_min); imax[y0] = min(NX,_max); if (_min<=NX && _max>=0) { visible=true; } } if ((x0 == x1) && (y0 == y1)) break; e2 = 2*err; if (e2 > -dy) { err = err - dy; x0 = x0 + sx; } if (e2 < dx) { err = err + dx; y0 = y0 + sy; } } while(true); return visible; } template struct QuadHelper { const Array2D& X; const Array2D& Y; const Array2D& Z; Array2D& D; LutScale& scale; double x1, x2, y1, y2, m_dx, m_dy; npy_uint32 bgcolor; bool border; bool flat; double uflat, vflat; int ixmin, ixmax, iymin, iymax; QuadHelper( const Array2D& X_, const Array2D& Y_, const Array2D& Z_, Array2D& D_, LutScale& scale_, double x1_, double x2_, double y1_, double y2_, bool _border, bool _flat, double _uflat, double _vflat ):X(X_), Y(Y_), Z(Z_), D(D_), scale(scale_), x1(x1_), x2(x2_), y1(y1_), y2(y2_), bgcolor(0xff000000), border(_border), flat(_flat),uflat(_uflat),vflat(_vflat) { m_dx = D.nj/(x2-x1); m_dy = D.ni/(y2-y1); } void draw_triangles() { int i, j; vector imin, imax; imin.resize(D.ni); imax.resize(D.ni); ixmin = D.nj; iymin = D.ni; ixmax = -1; iymax = -1; for(i=0;i& imin, vector& imax ) { int i,j; double u, v; double v0, v1, v2, v3, v4; // Coordonnees du quad dans l'offscreen double ax = (X.value(qj+0,qi+0)-x1)*m_dx, ay=(Y.value(qj+0,qi+0)-y1)*m_dy; double bx = (X.value(qj+0,qi+1)-x1)*m_dx, by=(Y.value(qj+0,qi+1)-y1)*m_dy; double cx = (X.value(qj+1,qi+1)-x1)*m_dx, cy=(Y.value(qj+1,qi+1)-y1)*m_dy; double dx = (X.value(qj+1,qi+0)-x1)*m_dx, dy=(Y.value(qj+1,qi+0)-y1)*m_dy; // indice des sommets (A,B,C,D)<->0,1,2,3<->(qi,qj),(qi+1,qj),(qi+1,qj+1),(qi,qj+1) // trie par ordre x croissant ou y croissant (selon xarg, yarg) double ymin = min(ay,min(by,min(cy,dy))); double ymax = max(ay,max(by,max(cy,dy))); int i0 = int(ymin+.5); int i1 = int(ymax+.5); // printf("Quads: i=%d->%d\n", i0, i1); if (i0<0) i0=0; if (i1>=D.ni) i1=D.ni-1; if (i11e2) n = 1.0; // Normalize vectors with ||AC|| ax *= n; ay *= n; bx = bx*n-ax; by = by*n-ay; cx = cx*n-ax; cy = cy*n-ay; dx = dx*n-ax; dy = dy*n-ay; ex *= n; ey *= n; v1 = Z.value(qj,qi); v2 = Z.value(qj+1,qi); v3 = Z.value(qj+1,qi+1); v4 = Z.value(qj,qi+1); if (isnan(v1) || isnan(v2) || isnan(v3) || isnan(v4)) { // XXX Color = Alpha return ; } int dm=0, dM=0; if (border) { dm=1;dM=-1; } npy_uint32 col = scale.eval( v1*(1-vflat)*(1-uflat) + v2* vflat *(1-uflat) + v3* vflat * uflat + v4*(1-vflat)* uflat ); for(i=i0+dm;i<=i1+dM;++i) { ixmin = min(ixmin,imin[i]); ixmax = max(ixmax,imax[i]); int jmin=max(0,imin[i])+dm; int jmax=min(imax[i],D.nj-1)+dM; for(j=jmin;j<=jmax;++j) { if (!flat) { params(j*n,i*n, ax,ay, bx,by, cx,cy, dx,dy, ex,ey, u,v); if (u<0) u=0.; else if (u>1.) u=1.; if (v<0) v=0.; else if (v>1.) v=1.; /* v0 = v1*(1-v)*(1-u) + v2*v*(1-u) + v3*v*u + v4*(1-v)*u; */ v0 = u*( v*(v1-v2+v3-v4)+v4-v1 ) + v*(v2-v1) + v1; col = scale.eval(v0); } D.value(j,i) = col; } } } void params(double x, double y, double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy, double ex, double ey, double& u, double&v) { /* solves AM=u.AB+v.AD+uv.AE with A,B,C,D quad, AE=DC+BA M = (x,y) with u^2.(AB^AE) +u.(AB^AD+AE^AM)+AD^AM=0 v = (AM-u.AB)/(AD+u.AE) */ double mx = x-ax, my = y-ay; double a1, a2, b, c, delta; if (false && (ex*ex+ey*ey)<1e-8) { // fast case : parallelogram if (fabs(dy)>1e-16) { double a=dx/dy; u = (mx-a*y)/(bx-a*by); v = (my-u*by)/dy; return ; } else { double a=dy/dx; u = (my-a*x)/(by-a*bx); v = (mx-u*bx)/dx; return ; } } a1 = bx*ey-ex*by; a2 = dx*ey-ex*dy; if (a1>a2) { b = bx*dy-dx*by + ex*my-mx*ey; c = dx*my-mx*dy; if (fabs(a1)>1e-8) { delta = b*b-4*a1*c; u = (-b+sqrt(delta))/(2*a1); } else { u = -c/b; } double den = (dx+u*ex); if (fabs(den)>1e-8) { v = (mx - u*bx)/den; } else { den = (dy+u*ey); v = (my - u*by)/den; } } else { b = dx*by-bx*dy + ex*my-mx*ey; c = bx*my-mx*by; if (fabs(a2)>1e-8) { delta = b*b-4*a2*c; v = (-b+sqrt(delta))/(2*a2); } else { v = -c/b; } double den = (bx+v*ex); if (fabs(den)>1e-8) { u = (mx - v*dx)/den; } else { den = (by+v*ey); u = (my - v*dy)/den; } } #if 0 if (isnan(u)) { printf("AM=(%g,%g)\n", mx, my); printf("AB=(%g,%g)\n", bx, by); printf("AC=(%g,%g)\n", cx, cy); printf("AD=(%g,%g)\n", dx, dy); printf("AE=(%g,%g)\n", ex, ey); printf("a1=%g, a2=%g, b=%g, c=%g\n", a1, a2, b, c); printf("u=%g v=%g\n", u, v); } #endif } }; /** Draw a structured grid composed of quads (xy[i,j],xy[i+1,j],xy[i+1,j+1],xy[i,j+1] ) */ PyObject *py_scale_quads(PyObject *self, PyObject *args) { PyArrayObject *p_src_x=0, *p_src_y=0, *p_src_z=0, *p_dst=0; PyObject *p_lut_data, *p_dst_data, *p_interp_data, *p_src_data; double x1,x2,y1,y2; int border=0, flat=0; double uflat=0.5; double vflat=0.5; if (!PyArg_ParseTuple(args, "OOOOOOOO|i:_scale_quads", &p_src_x, &p_src_y, &p_src_z, &p_src_data, &p_dst, &p_dst_data, &p_lut_data, &p_interp_data, &border)) { return NULL; } if (!PyArg_ParseTuple(p_interp_data, "i|dd", &flat,&uflat,&vflat)) { PyErr_SetString(PyExc_ValueError, "Interpolation should be a tuple (type[,uflat,vflat])"); return NULL; } if (!check_arrays(p_src_x, p_dst)) { return NULL; } if (!PyArg_ParseTuple(p_src_data, "dddd:_scale_quads", &x1, &y1, &x2, &y2)) { return NULL; } if (PyArray_TYPE(p_src_x)!=NPY_FLOAT64 || PyArray_TYPE(p_src_y)!=NPY_FLOAT64 || PyArray_TYPE(p_src_z)!=NPY_FLOAT64) { PyErr_SetString(PyExc_TypeError, "Only support float X,Y,Z"); return NULL; } if (PyArray_TYPE(p_dst)!=NPY_UINT32) { PyErr_SetString(PyExc_TypeError, "Only support RGB dest for now"); return NULL; } double a=1.0, b=0.0; PyObject* p_bg; PyArrayObject* p_cmap; bool apply_bg=true; if (!PyArg_ParseTuple(p_lut_data, "ddO|O", &a, &b, &p_bg, &p_cmap)) { PyErr_SetString(PyExc_ValueError, "Can't interpret pixel transformation tuple"); return NULL; } if (p_bg==Py_None) apply_bg=false; Array2D X(p_src_x), Y(p_src_y), Z(p_src_z); /* Destination is RGB */ unsigned long bg=0; Array2D dest(p_dst); if (apply_bg) { #if PY_MAJOR_VERSION >= 3 bg=PyLong_AsUnsignedLongMask(p_bg); #else bg=PyInt_AsUnsignedLongMask(p_bg); #endif if (PyErr_Occurred()) return NULL; } if (!check_lut(p_cmap)) { return NULL; } Array1D cmap(p_cmap); LutScale scale(a, b, cmap, bg, apply_bg); QuadHelper quad(X,Y,Z,dest,scale, x1, x2, y1, y2, border, flat, uflat, vflat); quad.draw_triangles(); // examine source type return Py_BuildValue("iiii", quad.ixmin, quad.iymin, quad.ixmax, quad.iymax); } PyObject *py_vert_line(PyObject *self, PyObject *args) { double x0,y0,x1,y1; int xmax; PyArrayObject *p_min, *p_max; if (!PyArg_ParseTuple(args, "ddddiOO:_vert_line", &x0,&y0,&x1,&y1,&xmax,&p_min,&p_max)) { return NULL; } if (!PyArray_Check(p_min) || !PyArray_Check(p_max)) { PyErr_SetString(PyExc_TypeError, "imin, imax must be ndarray"); return NULL; } if (PyArray_TYPE(p_min) != NPY_INT || PyArray_TYPE(p_max) != NPY_INT) { PyErr_SetString(PyExc_TypeError, "imin, imax must be int ndarray"); return NULL; } Array1D pmin(p_min), pmax(p_max); vector imin, imax; int nx = int(max(y0,y1))+1; if (pmin.ni dummy; vert_line(x0, y0, x1, y1, xmax, imin, imax, false, 0, dummy); for(int i=0;i trait; Point():_ix(0),_iy(0),_x(0.0),_y(0.0) {} real x() const { return _x; } real y() const { return _y; } int ix() const { return _ix; } int iy() const { return _iy; } void setx(real x) { _x = x; _ix = trait::toint(x); } void sety(real y) { _y = y; _iy = trait::toint(y); } void set(real x, real y) { setx(x); sety(y); } void copy(const Point& p) { _ix = p._ix; _iy = p._iy; _x = p._x; _y = p._y; } Point& operator=(const Point& p) { copy(p);return *this;} protected: int _ix, _iy; real _x, _y; }; /* A point that keep track of it's coordinates as double and integers */ class Point2DRectilinear : public Point { public: Point2DRectilinear():_insidex(true),_insidey(true) {} bool inside() const { return _insidex&&_insidey; } void testx(int _m, int _M) { if (_ix<_m || _ix>=_M) { _insidex=false; } else { _insidex=true; } } void testy(int _m, int _M) { if (_iy<_m || _iy>=_M) { _insidey=false; } else { _insidey=true; } } void copy(const Point2DRectilinear& p) { Point::copy(p); _insidex = p._insidex;_insidey=p._insidey; } Point2DRectilinear& operator=(const Point2DRectilinear& p) { copy(p);return *this; } protected: bool _insidex, _insidey; }; /* A special transformation operation that transforms i,j (int) coordinates with a translation and scale */ class ScaleTransform { public: typedef Point2DRectilinear point; typedef point::real real; ScaleTransform(int _nx, int _ny, real _x0, real _y0, real _dx, real _dy): nx(_nx), ny(_ny), x0(_x0), y0(_y0), dx(_dx), dy(_dy) {} void set(point& p, int x, int y) const { p.set(x0 + x*dx, y0 + y*dy); p.testx(0,nx); p.testy(0,ny); } void incx(point& p, real k=1) const { p.setx( p.x() + k*dx ); p.testx(0,nx); } void incy(point& p, real k=1) const { p.sety( p.y() + k*dy ); p.testy(0,ny); } public: int nx, ny; real x0, y0; real dx, dy; }; class Point2D : public Point { public: Point2D():_inside(true) {} bool inside() const { return _inside; } void copy(const Point2D& p) { Point::copy(p); _inside = p._inside; } Point2D& operator=(const Point2D& p) { copy(p);return *this; } void test(int _xm, int _xM, int _ym, int _yM) { if ( (_ix<_xm) || (_ix>=_xM) || (_iy<_ym) || (_iy>=_yM)) { _inside=false; } else { _inside=true; } } bool _inside; }; class LinearTransform { public: typedef Point2D point; typedef point::real real; LinearTransform(int _nx, int _ny, real _x0, real _y0, real _xx, real _xy, real _yx, real _yy):nx(_nx), ny(_ny), x0(_x0), y0(_y0), xx(_xx), xy(_xy), yx(_yx), yy(_yy) { } void set(point& p, int x, int y) const { p.set(x0 + x*xx + y*xy, y0 + x*yx + y*yy); p.test(0, nx, 0, ny); } void incx(point& p, real k=1) const { p.set( p.x()+k*xx, p.y()+k*yx ); p.test(0, nx, 0, ny); } void incy(point& p, real k=1) const { p.set( p.x()+k*xy, p.y()+k*yy ); p.test(0, nx, 0, ny); } public: int nx, ny; real x0, y0; real xx, xy, yx, yy; }; template class Point2DAxis : public Point { public: Point2DAxis():_insidex(true),_insidey(true) {} bool inside() const { return _insidex&&_insidey; } void set(const axis_type& ax, real x, const axis_type& ay, real y) { setx(ax, x); sety(ay, y); } void setx(const axis_type& ax, real x) { _ix = -1; _x = x; while(_ix=0 && ax.value(_ix)>=_x) { --_ix; } } else { while(_ix=0 && ay.value(_iy)>=_y) { --_iy; } } else { while(_iy& p) { Point::copy(p); _insidex = p._insidex; _insidey=p._insidey; } Point2DAxis& operator=(const Point2DAxis& p) { copy(p);return *this; } bool _insidex, _insidey; }; template class XYTransform { public: static const int toto=1; typedef Point2DAxis point; typedef typename point::real real; XYTransform(int _nx, int _ny, real _x0, real _y0, real _dx, real _dy, const axis_type& _ax, const axis_type& _ay):nx(_nx), ny(_ny), x0(_x0), y0(_y0), dx(_dx), dy(_dy), ax(_ax), ay(_ay) {} void testx(point& p) const { if (p.ix()<0 || p.ix()>=nx) { p._insidex=false; } else { p._insidex=true; } } void testy(point& p) const { if (p.iy()<0 || p.iy()>=ny) { p._insidey=false; } else { p._insidey=true; } } void set(point& p, int x, int y) const { p.set(ax, x0 + x*dx, ay, y0 + y*dy); testx(p); testy(p); } void incx(point& p, real k=1) const { p.incx( ax, k*dx ); testx(p); } void incy(point& p, real k=1) const { p.incy( ay, k*dy ); testy(p); } public: int nx, ny; real x0, y0; real dx, dy; const axis_type& ax; const axis_type& ay; }; #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1463303859.0 guiqwt-4.0.1/src/scaler.cpp0000666000000000000000000005456100000000000012506 0ustar00/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */ /* Copyright © 2009-2010 CEA Ludovic Aubry Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) */ #include #undef NO_IMPORT_ARRAY #define PY_ARRAY_UNIQUE_SYMBOL PyScalerArray #include #ifdef _MSC_VER #include #pragma fenv_access (on) #define FE_TOWARDZERO _RC_CHOP #define fegetround() (_controlfp(0,0) & _MCW_RC) int fesetround(int r) { if((r & _MCW_RC) == r) { /* check the supplied value is one of those allowed */ int result = _controlfp(r, _MCW_RC) & _MCW_RC; return !(r == result); } return !0; } #else #include #endif #include #if defined(_MSC_VER) || defined(__MINGW32__) #define isnan(x) _isnan(x) #endif #include #include #include #include #include "points.hpp" #include "arrays.hpp" #include "scaler.hpp" using std::vector; using std::min; using std::max; using std::swap; enum { INTERP_NEAREST=0, INTERP_LINEAR=1, INTERP_AA=2 }; typedef union { npy_uint32 v; npy_uint8 c[4]; } rgba_t; typedef XYTransform > XYScale; template struct params { typedef Transform transform_type; params(PyArrayObject* _src, PyArrayObject* _dst, PyObject* _dst_data, PyObject* _lut, PyObject* _interp, Transform& _trans):p_dst(_dst),p_dst_data(_dst_data), p_src(_src), p_lut(_lut), p_interpolation(_interp), trans(_trans) { } // Source, dest, coordinate transformation PyArrayObject *p_dst; PyObject *p_dst_data; PyArrayObject *p_src; PyObject* p_lut; // Pixel value transformation tuple PyObject* p_interpolation; Transform& trans; int dx1, dx2, dy1, dy2; }; template struct NearestInterpolation { T operator()(const Array2D& src, const TR& tr, const typename TR::point& p) { int nx = p.ix(); int ny = p.iy(); return src.value(nx, ny); } }; template struct LinearInterpolation { T operator()(const Array2D& src, const TR& tr, const typename TR::point& p) { int nx = p.ix(); int ny = p.iy(); double v = src.value(nx, ny); double a=0; // The following couple of lines were commented out to avoid disabling // the linear interpolation on image edges. Demonstrating the effect of // this change is quite easy: just try to show a very small image // (e.g. 10x10) with guiqwt.pyplot.imshow for example. // if (nx==0||nx==src.nj-1) return (T)v; // if (ny==0||ny==src.ni-1) return (T)v; if (nx=src.ni-1) return (T)v; double v2 = src.value(nx,ny+1); double b = p.y()-ny; if (nx struct LinearInterpolation { npy_uint32 operator()(const Array2D& src, const TR& tr, const typename TR::point& p) { int k; int nx = p.ix(); int ny = p.iy(); rgba_t p1, p2, p3, p4, r; p1.v = src.value(nx, ny); float v[4], v2[4]; double a=0; if (nx=src.ni-1) { for(k=0;k<4;++k) { r.c[k] = (npy_uint8)(v[k]); } return r.v; } p3.v = src.value(nx,ny+1); double b = p.y()-ny; if (nx255.0) px = 255.0; r.c[k] = (npy_uint8)px; } return r.v; } }; #if 0 template struct QuadInterpolation { T operator()(const Array2D& src, const TR& tr, const typename TR::point& p) { int nx = p.ix(); int ny = p.iy(); double v = src.value(nx, ny); double a=0; if (nx==0||nx==src.nj-1) return src.value(nx,ny); if (ny==0||ny==src.ni-1) return src.value(nx,ny); v0 = interp(src.value(nx-1,ny-1)); if (nx=src.ni-1) return v; double v2 = src.value(nx,ny+1); double b = p.y()-ny; if (nx struct LinearInterpolation { T operator()(const Array2D& src, const XYScale& tr, const typename XYScale::point& p) { int nx = p.ix(); int ny = p.iy(); double v = src.value(nx, ny); double a=0; if (nx==0||nx==src.nj-1) return (T)v; if (ny==0||ny==src.ni-1) return (T)v; if (nx=src.ni-1) return (T)v; double v2 = src.value(nx,ny+1); double y0 = tr.ay.value(ny); double y1 = tr.ay.value(ny+1); double b = (p.y()-y0)/(y1-y0); if (nx struct LinearInterpolation { npy_uint32 operator()(const Array2D& src, const XYScale& tr, const XYScale::point& p) { return 0; } }; template struct SubSampleInterpolation { SubSampleInterpolation(const Array2D& _mask):mask(_mask) { ki = 1./(mask.ni-1); kj = 1./(mask.nj-1); } T operator()(const Array2D& src, const TR& tr, const typename TR::point& p0) { int i,j; typename TR::point p, p1; typename num_trait::large_type value = 0; typename num_trait::large_type count=0, msk, val; p1.copy(p0); tr.incy(p1,-0.5); tr.incx(p1,-0.5); for(i=0;i& mask; }; template void _scale_rgb(DEST& dest, Array2D& src, const Scale& scale, const Trans& tr, int dx1, int dy1, int dx2, int dy2, Interpolation& interpolate) { int i, j; ST val; int round = fegetround(); PixelIterator it(dest); typename Trans::point p, p0; fesetround(FE_TOWARDZERO); /* printf("SRC: ni=%d nj=%d\n", src.ni, src.nj); printf("TR: dx=%lf dy=%lf\n", tr.dx, tr.dy); printf("DST: ni=%d nj=%d si=%d sj=%d\n", dest.ni, dest.nj, dest.si, dest.sj); */ tr.set(p0, dx1, dy1); for(i=dy1;ind!=2) { PyErr_Format(PyExc_TypeError,"%s must be 2-D array", name); return false; } if (dtype>=0 && PyArray_TYPE(arr) != dtype) { PyErr_Format(PyExc_TypeError,"%s data type must be %d", name, dtype); return false; } return true; } bool check_arrays(PyArrayObject* p_src, PyArrayObject *p_dest) { if (!PyArray_Check(p_src) || !PyArray_Check(p_dest)) { PyErr_SetString(PyExc_TypeError,"src and dst must be ndarrays"); return false; } if (PyArray_TYPE(p_dest) != NPY_UINT32 && PyArray_TYPE(p_dest) != NPY_FLOAT32 && PyArray_TYPE(p_dest) != NPY_FLOAT64) { PyErr_SetString(PyExc_TypeError,"dst data type must be uint32 or float"); return false; } if (p_src->nd!=2 || p_dest->nd!=2) { PyErr_SetString(PyExc_TypeError,"dst and src must be 2-D arrays"); return false; } return check_dispatch_type("src", p_src); } bool check_lut(PyArrayObject *p_lut) { if (!PyArray_Check(p_lut)) { PyErr_SetString(PyExc_TypeError,"lut must be an ndarray"); return false; } if (p_lut->nd!=1) { PyErr_SetString(PyExc_TypeError,"lut must be a 1D array"); return false; } if (PyArray_TYPE(p_lut) != NPY_UINT32) { PyErr_SetString(PyExc_TypeError,"lut data type must be uint32"); return false; } return true; } static bool check_transform(PyArrayObject* p_tr) { if (!PyArray_Check(p_tr)) { PyErr_SetString(PyExc_TypeError,"transform must be an ndarray"); return false; } if (PyArray_TYPE(p_tr) != NPY_DOUBLE) { PyErr_SetString(PyExc_TypeError,"transform data type must be float"); return false; } int ni = PyArray_DIM(p_tr, 0); int nj = PyArray_DIM(p_tr, 1); if (ni!=3||nj!=3) { PyErr_SetString(PyExc_TypeError,"transform must be 3x3"); return false; } return true; } static void check_image_bounds(int ni, int nj, int& dx, int &dy) { if (dx<0) dx=0; if (dy<0) dy=0; if (dx>nj) dx=nj; if (dy>ni) dy=ni; } template static bool scale_src_dst_interp(Params& p, PixelScale& pixel_scale, Interp& interp) { typedef typename PixelScale::source_type ST; typedef typename PixelScale::dest_type DT; typedef typename Params::transform_type Transform; Array2D src(p.p_src); Array2D
dst(p.p_dst); _scale_rgb(dst, src, pixel_scale, p.trans, p.dx1, p.dy1, p.dx2, p.dy2, interp); return true; } template static bool scale_src_dst(Params& p, PixelScale& pixel_scale) { typedef typename PixelScale::source_type ST; typedef typename Params::transform_type TR; typedef NearestInterpolation Nearest; typedef SubSampleInterpolation SubAA; typedef LinearInterpolation Linear; int interpolation; PyArrayObject *p_mask=0; if (!PyArg_ParseTuple(p.p_interpolation, "i|O", &interpolation, &p_mask)) { PyErr_SetString(PyExc_ValueError, "Can't interpret interpolation"); return false; } switch(interpolation) { case INTERP_NEAREST: { Nearest interp; return scale_src_dst_interp(p, pixel_scale, interp); } case INTERP_AA: { if (!check_array_2d("AA Mask", p_mask, PyArray_TYPE(p.p_src))) return false; Array2D mask(p_mask); SubAA interp(mask); return scale_src_dst_interp(p, pixel_scale, interp); } case INTERP_LINEAR: { Linear interp; return scale_src_dst_interp(p, pixel_scale, interp); } default: PyErr_SetString(PyExc_ValueError, "Unknown interpolation type"); return false; }; } /* we know the transformation and source type, now we dispatch on the destination type, which determines the LUT transformation */ template static bool scale_src_bw(Params& p) { typedef LutScale color_scale; typedef LinearScale bw32_scale; typedef LinearScale bw64_scale; double a, b; PyObject* p_bg; PyArrayObject *p_cmap=0; bool apply_bg=true; if (!PyArg_ParseTuple(p.p_lut, "ddO|O", &a, &b, &p_bg, &p_cmap)) { PyErr_SetString(PyExc_ValueError, "Can't interpret pixel transformation tuple"); return false; } if (p_bg==Py_None) apply_bg=false; switch(PyArray_TYPE(p.p_dst)) { case NPY_UINT32: { /* Destination is RGB */ unsigned long bg=0; if (apply_bg) { #if PY_MAJOR_VERSION >= 3 bg=PyLong_AsUnsignedLongMask(p_bg); #else bg=PyInt_AsUnsignedLongMask(p_bg); #endif if (PyErr_Occurred()) return false; } if (!check_lut(p_cmap)) { return false; } Array1D cmap(p_cmap); color_scale scale(a, b, cmap, bg, apply_bg); return scale_src_dst(p, scale); } case NPY_FLOAT32: { double bg=0.0; if (apply_bg) { bg=PyFloat_AsDouble(p_bg); if (PyErr_Occurred()) return false; } bw32_scale scale(a, b, bg, apply_bg); return scale_src_dst(p, scale); } case NPY_FLOAT64: { double bg=0.0; if (apply_bg) { bg=PyFloat_AsDouble(p_bg); if (PyErr_Occurred()) return false; } bw64_scale scale(a, b, bg, apply_bg); return scale_src_dst(p, scale); } default: PyErr_SetString(PyExc_TypeError,"Destination array must be uint32 (rgb) or float (BW)"); return false; } } template static bool scale_src_rgb(Params& p) { // Special case p_lut = None NoScale scale(0, false); return scale_src_dst >(p, scale); } template static PyObject* dispatch_source(Params& p) { bool ok; int dni = PyArray_DIM(p.p_dst, 0); int dnj = PyArray_DIM(p.p_dst, 1); if (!PyArg_ParseTuple(p.p_dst_data,"iiii", &p.dx1, &p.dy1, &p.dx2, &p.dy2)) { PyErr_SetString(PyExc_ValueError, "Invalid destination rectangle (expected tuple of 4 integers)"); return NULL; } if (p.dx2(p); break; case NPY_FLOAT64: ok = scale_src_bw(p); break; case NPY_UINT64: ok = scale_src_bw(p); break; case NPY_INT64: ok = scale_src_bw(p); break; case NPY_INT32: ok = scale_src_bw(p); break; case NPY_UINT32: // RGBA ok = scale_src_rgb(p); break; case NPY_UINT16: ok = scale_src_bw(p); break; case NPY_INT16: ok = scale_src_bw(p); break; case NPY_UINT8: ok = scale_src_bw(p); break; case NPY_INT8: ok = scale_src_bw(p); break; case NPY_BOOL: ok = scale_src_bw(p); break; default: PyErr_SetString(PyExc_TypeError,"Unknown source data type"); return NULL; } if (!ok) return NULL; return Py_BuildValue("iiii", p.dx1, p.dy1, p.dx2, p.dy2); } /* Input data : SRC, SRC_DATA, DST, DST_DATA, LUT_DATA SRC : PyArrayObject (i8,u8,i16,u16,float32,float64) DST : PyArrayObject : u32 -> rgb, float32 : bw SRC_DATA : varies : Scale : source rect (x1,y1,x2,y2) Transform : transformation matrix XY : source rect, X array, Y array DST_DATA : dest rect (dx1,dy1,dx2,dy2) LUT_DATA : (a,b,bg) if DST is bw or (a,b,bg,cmap) if DST is rgb */ static PyObject *py_scale_xy(PyObject *self, PyObject *args) { typedef params Params; PyArrayObject *p_src=0, *p_dst=0, *p_ax=0, *p_ay=0; PyObject *p_lut_data, *p_src_data, *p_dst_data, *p_interp_data; double x1, y1, x2, y2; if (!PyArg_ParseTuple(args, "OOOOOO:_scale_xy", &p_src, &p_src_data, &p_dst, &p_dst_data, &p_lut_data, &p_interp_data)) { return NULL; } if (!check_arrays(p_src, p_dst)) { return NULL; } if (!PyArg_ParseTuple(p_src_data, "OO(dddd):_scale_xy", &p_ax, &p_ay, &x1, &y1, &x2, &y2)) { return NULL; } int ni = PyArray_DIM(p_src, 0); int nj = PyArray_DIM(p_src, 1); int dni = PyArray_DIM(p_dst, 0); int dnj = PyArray_DIM(p_dst, 1); double dx = (x2-x1)/dnj; double dy = (y2-y1)/dni; Array1D ax(p_ax), ay(p_ay); XYScale trans(nj, ni, x1, y1, dx, dy, ax, ay); Params scale_params(p_src, p_dst, p_dst_data, p_lut_data, p_interp_data, trans); // examine source type return dispatch_source(scale_params); } static PyObject *py_scale_tr(PyObject *self, PyObject *args) { typedef params Params; PyArrayObject *p_src=0, *p_dst=0, *p_tr; PyObject *p_lut_data, *p_dst_data, *p_interp_data; if (!PyArg_ParseTuple(args, "OOOOOO:_scale_tr", &p_src, &p_tr, &p_dst, &p_dst_data, &p_lut_data, &p_interp_data)) { return NULL; } if (!check_arrays(p_src, p_dst)) { return NULL; } if (!check_transform(p_tr)) { return NULL; } int ni = PyArray_DIM(p_src, 0); int nj = PyArray_DIM(p_src, 1); Array2D tr(p_tr); LinearTransform trans(nj, ni, tr.value(2,0), tr.value(2,1), // x0, y0 tr.value(0,0), tr.value(1,0), // xx, xy tr.value(0,1), tr.value(1,1) // yx, yy ); Params scale_params(p_src, p_dst, p_dst_data, p_lut_data, p_interp_data, trans); // examine source type return dispatch_source(scale_params); } static PyObject *py_scale_rect(PyObject *self, PyObject *args) { typedef params Params; PyArrayObject *p_src=0, *p_dst=0; PyObject *p_lut_data, *p_dst_data, *p_interp_data, *p_src_data; double x1,x2,y1,y2; if (!PyArg_ParseTuple(args, "OOOOOO:_scale_rect", &p_src, &p_src_data, &p_dst, &p_dst_data, &p_lut_data, &p_interp_data)) { return NULL; } if (!check_arrays(p_src, p_dst)) { return NULL; } if (!PyArg_ParseTuple(p_src_data, "dddd:_scale_rect", &x1, &y1, &x2, &y2)) { return NULL; } int ni = PyArray_DIM(p_src, 0); int nj = PyArray_DIM(p_src, 1); int dni = PyArray_DIM(p_dst,0); int dnj = PyArray_DIM(p_dst,1); double dx = (x2-x1)/dnj; double dy = (y2-y1)/dni; ScaleTransform trans(nj, ni, x1, y1, dx, dy ); Params scale_params(p_src, p_dst, p_dst_data, p_lut_data, p_interp_data, trans); // examine source type return dispatch_source(scale_params); } class Histogram { public: Histogram(PyArrayObject *_data, PyArrayObject *_bins, PyArrayObject *_res, int ignore_bounds):p_data(_data), p_bins(_bins), p_res(_res), mode(ignore_bounds) { } template void run() { Array1D res(p_res); Array1D data(p_data); Array1D bins(p_bins); typename Array1D::iterator it, end, bin, bin0, bin1; end = data.end(); bin0 = bins.begin(); bin1 = bins.end(); for(it=data.begin();it= 3 static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_scaler", /* m_name */ "Scaler module", /* m_doc */ -1, /* m_size */ _meths, /* m_methods */ NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL, /* m_free */ }; #endif PyMODINIT_FUNC #if PY_MAJOR_VERSION >= 3 PyInit__scaler(void) #else init_scaler() #endif { PyObject* m; #if PY_MAJOR_VERSION >= 3 m = PyModule_Create(&moduledef); #else m = Py_InitModule("_scaler", _meths); #endif import_array(); PyModule_AddIntConstant(m,"INTERP_NEAREST", INTERP_NEAREST); PyModule_AddIntConstant(m,"INTERP_LINEAR", INTERP_LINEAR); PyModule_AddIntConstant(m,"INTERP_AA", INTERP_AA); #if PY_MAJOR_VERSION >= 3 return m; #endif } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441096270.0 guiqwt-4.0.1/src/scaler.hpp0000666000000000000000000000451000000000000012500 0ustar00/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */ /* Copyright 2010-2011 CEA Ludovic Aubry Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) */ #ifndef _SCALER_HPP #define _SCALER_HPP #include "points.hpp" #include "arrays.hpp" /* Scaler evaluates int(a*x+b) */ template::is_integer> struct Scaler { typedef num_trait trait; Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {} int scale(T x) const { return trait::toint(a*x+b); } typename trait::value_type a,b; }; template struct Scaler { typedef num_trait trait; Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {} int scale(T x) const { return trait::toint(a*x+b); } typename trait::value_type a,b; }; template class LinearScale { public: typedef T source_type; typedef D dest_type; LinearScale(double _a, double _b, D _bg, bool apply_bg):a(_a), b(_b), bg(_bg), has_bg(apply_bg) {} D eval(T x) const { return a*x+b; } void set_bg(D& dest) const { if (has_bg) dest = bg; } protected: D a, b; D bg; bool has_bg; }; template class LutScale { public: typedef T source_type; typedef D dest_type; LutScale(double _a, double _b, Array1D& _lut, D _bg, bool apply_bg):s(_a, _b),lut(_lut), bg(_bg), has_bg(apply_bg) {} D eval(T x) const { int val = s.scale(x); if (val<0) { return lut.value(0); } else if (val>=lut.ni) { return lut.value(lut.ni-1); } return lut.value(val); } void set_bg(D& dest) const { if (has_bg) dest = bg; } protected: Scaler s; Array1D& lut; D bg; bool has_bg; }; template class NoScale { public: typedef T source_type; typedef D dest_type; NoScale(dest_type _bg, bool apply_bg):bg(_bg), has_bg(apply_bg) {} dest_type eval(source_type x) const { return x; } void set_bg(dest_type& dest) const { if (has_bg) dest = bg; } protected: dest_type bg; bool has_bg; }; bool check_arrays(PyArrayObject* p_src, PyArrayObject *p_dest); bool check_lut(PyArrayObject *p_lut); #endif // _SCALER_HPP ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1446905503.0 guiqwt-4.0.1/src/traits.hpp0000666000000000000000000000762700000000000012551 0ustar00/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */ /* Copyright © 2009-2010 CEA Licensed under the terms of the CECILL License (see guiqwt/__init__.py for details) Two lines of the following code are distributed under LGPL license terms and with a different copyright. These two lines are the Visual Studio x86_64 (_M_X64) inline versions of lrint() and lrintf() functions, and were adapted from fast_convert.h (SpanDSP), which is: Copyright © 2009 Steve Underwood All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ #ifndef __TRAITS_HPP__ #define __TRAITS_HPP__ #include /* this class (real_trait) is used to make the code somewhat independent of the real type used (float or double). we don't provide a template parameter on the Point* class to avoid clutter but changing a simple typedef is all it takes to switch from float to double type */ /* MSVC does not have lrint/lrintf */ #ifdef _MSC_VER #include __inline long int lrint (double f) { #ifdef _M_X64 return (long int)_mm_cvtsd_si64x(_mm_loadu_pd((const double*)&f)); #else int i; _asm { fld f fistp i } return i; #endif } __inline long int lrintf (float f) { #ifdef _M_X64 return _mm_cvt_ss2si(_mm_load_ss((const float*)&f)); #else int i; _asm { fld f fistp i } return i; #endif } #endif typedef int fixed; template struct num_trait { typedef T value_type; typedef long large_type; static int toint(value_type v) { return (int)v; } static value_type fromdouble(double v) { return (value_type)v; } static const bool is_integer = true; }; template<> struct num_trait { typedef float value_type; typedef float large_type; static int toint(value_type v) { return lrintf(v); } static value_type fromdouble(double v) { return (value_type)v; } static const bool is_integer = false; }; template<> struct num_trait { typedef double value_type; typedef double large_type; static int toint(value_type v) { return lrint(v); } static value_type fromdouble(double v) { return (value_type)v; } static const bool is_integer = false; }; template<> struct num_trait { typedef fixed value_type; typedef fixed large_type; static int toint(value_type v) { return (v>>15); } static value_type fromdouble(double v) { return lrint(v*32768.); } static const bool is_integer = false; }; template static void dispatch_array(int npy_type, A& algo) { switch(npy_type) { case NPY_FLOAT32: algo.template run(); break; case NPY_FLOAT64: algo.template run(); break; case NPY_UINT64: algo.template run(); break; case NPY_INT64: algo.template run(); break; case NPY_UINT32: algo.template run(); break; case NPY_INT32: algo.template run(); break; case NPY_UINT16: algo.template run(); break; case NPY_INT16: algo.template run(); break; case NPY_UINT8: algo.template run(); break; case NPY_INT8: algo.template run(); break; case NPY_BOOL: algo.template run(); break; } } #endif

HXO9058q@q6f(َByGɡ0% `@;_(k,(^ B5(a\` nI~ Ôo۩v1f (1;a V 2놴hpƫ`%A)X=Na}CX%0/Aúb kq!ٱR]1KZrr(QH:IW15@ ,`|,9[mHxhP7= }Ph EDXP`(N=J7Ѓ2& PhBĪ iH7EqpoX"@^X , n]`uKnXt Rpv=ˑ]/ &=k+X*,@u"\X:COP&rJ}s p*9gk uuvڅXn*#2Ӿ-0=FE^`źdm6p T3  37`DF5 7>X9+H`(p6R,ѱX`}^=̬Taf砄YX+.:p}c?]Ģ[ n8!` \Dళe p"]vC,P8 ;ycaAIGZTPw6X "PƮ@ Ĭ+ %5Jq򐆵E V}͓Xȋ2Yఫ?SVʈ  bm)p@rX.㚴x]U,@Xh_kP!_b;h݀Q谻# `H ioĨCLCN yjb eע,%,8PdGy0_L{Y74tTe,Cr3`0r䨈5J@}[tuH2۶/>>vlףT0.4v@aAcgG[te)?  !BqD(HP׀j$\ @ dٟy$kp_t)XeHAGZX4G~XZpaAn/eF2HPnѺ .,9iCyr ( HˎX]@q-$0:Q5VH(2" 3@ayCZ^6i_ ctc"\ngE~(LBDȁn/ы.`(E-f[mZ"எŧ^z!en8Wu>qLÁu7s׮х7,koIo mYM {}sBQL"kls7| rG}Aq."9~[`M ʋ}]W7 %e[ Pr@%Ve-"F?P9> K=d`@y>jeX-`B{!MInܑ><Av=HCJB1'_1nV##/9& . ,@ p *4ybtF[\=@V&.Hx;`Q~LdW.YrRO} kF+R SÕHyn,ݵn~  ECo ̼Wx.0,C~? [t!eG CNI.lrm0; 0۷v v916.8c%l:<܁,#;p8@ eFIRQn,08reE_2Dbapʰ0\G<-.(h{@"#ЄqKX^MO,<,P V 2BXKOހu5!+夽F8d Kr XcL 9x#@slȋ:2uїl K m !m (ukʄ+oDT:CzGl7ܙƢbxLp(cF]qZBP`ޱ;׽wa5CPEyi 6]D K$lECy7aPːOC@ D i M2d-S(= C(`P~sޞC]|q٠P(*Ae %-(q6 Zi(A MGSy1"n(dD{ٵtDdPL*3 Aѣ\QvP1 ca` `ؐ + ᒣՎz'>~d+yrXE//BVg1{ Pep% euHF|!+uI ΖjcaAnՁi&0 pJCU7 ʔ}0#oڄzj"3D^څ:7uEyx ~}%zEf Dl۪MX,n&f=!k?袃"P]XǛ+ 8qSHl7kEivGɡPtPR@3P\`@4Q -o %% 6PKO(_\Du) PAZP\5ĺpB@$P6܄Ȅ0>P(t` eـF @b)0 n1a$?:$~8W+C9_@bQwjŘWH/21"31pBiExN/mh-IȓfrU/8G;RK6K1Wh,; G6> {/Y7Y8yIe40 w`9(W`Ϣ@3<*c AF0O]t0 RT#YW!d-2jJqi~A1a% TXiW`FdQhk@/HjgU a  EC,7SͻyivqW8 E~M9rߜP3k [+(́`w#"d@s-Jņ""xEDcb]b pzC {c3~B%}/v5k JVD@ V  x .,W (P> xC>!M%򢮀Ik !o`8r}@ -PGI u#Z(4ڕi7r38@ mC; L΂-rR9⊣WT zf  7yRHho[@^Ozݑ)ܘx-/|A`(e<>``qEӭ"X =D0"lD@yfUq~πX roJSQn ;|f؇9[̺8q(ktO0 v7 -o@ʛdPƴX}&Ņ; Ň %ic&_Ī@7? +.ȉ1Ȃ"$XbV%8Xfα6(/JJ48\Vvvk|vAXm̵XBP cn@B8,C1}\ -hnc'rN]tc PPǣp$TmQ(=C j-$lp.X[P`G%C\h .nn8)Cyڽp_a5o(n.Vr$\mmFrbB20j5A=PQڔq.ģ(z`bcpgȑ XM|X|P\O(},(\ P|YD;ވc.)Jh/>@f\åBQoܗ YweS`%^ەmt/:@(ߴ)nC@rKlQ,'JcUۯF鲦X ﻻ+x b)-1Ca'?X56 WXbPN(>T:9: [7eN@qbu6Yv-`Yc8pGP(- E[0J5$pk삆ۄvu%H~v[ʛ20O<=<b n-µ̐&rd(`ʃ\ ɰyaaiټ.Ҧ||\ZXK"ML\$j tlȎXJ|axXaSA|J62e   EYmL^#qlKz`Eue4L QMpZ F>ҧo)\( 7({Ď+ M,ܢ Nj鯵ݍ53o{_cfv60 +ՠ,Pvd^1:q3R!Ui ~m¬5ڙc (\-qƜ-G}!y mCQG }f4 ;N…ٱ dv\`(}@0d^;ѓgTVzJ9F9V 󜋕%'~XXM߁uor lanG󌒁m~VCFvZ "<7"Q_yMG9"F<23v>.3=ٌ_)= e#Rݾ}s9@>0EQ(DƮRBjA+(4(  cm7Db!.o@iC8a X7(/+W eJ\,8J! 0VH䵠"ر9(}A"_u$ " :DN,j H`-̀q$`q 4`c4/eDPXj(ybM­hڙz# 央iGΑ6呕8#DYk\SN)uF%3LnJ=2mKnIKG} rx!2W]dͧ`!R*=yX=vChÂ^j_C'i1:v^o|Wy滶R/ט_R7[t`$Ҫ:3h.zJv HgV00m|` cs6;QqrS+{l+A?߃&@ꃡje4lX/WJ̺PAVЌu Roz^Tژ$:~^μ{!I5o3Ia JW6n^R<΃NYju Jפ)^טq x㊈aXOG2vX" (8ց&(y1 ;@Ib9%ЂuZ]hO,7R*иYPr7>²EP(i,Hk6p X4,0JvM"ri2$(^14Ŏhj3XsYb"'(s# @42 HC:ǽC`֒ ~"M M@7'r`=z][rQ"nr'㦀˷Hv0#ʄȥ,z?]zhGzz,M-CnxMg>`xd]Kд`qxD/V揟+6Ruc&h 1wIs2:`dV+C !a^J}zKߩ Wc[tQszΚtLS皐eLR=9wdF;v7ҙ6Y^әݮx.dpG ։x(-ozc˽ë],< Q|PsMrNLdbDzegE%ʁRB.(ddBr+ J%vJ;SƱNE $ ӮEâ+@DfY1t QLSQvX+נȱ?%BS1m>l`²|#B\`|X;'d3&Xp}#-,Jʼn(z _ yRL3,)䏫q=n76@‚g7SF[$a^ ]P/ġgL^`L~-0E7vȵ@J$30-ra CyaI"uF?ǢχKǎ  Xj-keh]EU;6,|(`(b9nYetZ!' CqP0h{9}ZvMwo=FhkI*~W3T^[Uwtyvz}\g;tJ/\;oil{xG3T`-L: Cv67~dcy]cڛd,OڢE6i/={a˅tKZeb]AyǺ}#8cPP? sv< TX@}E:kASQv(]ڝY]LV2{lq% "2I>!r>P΀.)d@f6@`߮L2! a=e`" Rfo@ anf@X!V,b! A{ˉQv[ߎY F}g(SX.)`tXmHHȂ !e'`_@qk(7! NoZdDԿ]gn'J 7]:ójކ䙞# -C~ ڙ>% mbgtPX 3"-XPmނV 2poX .x`ņu9Ʋ2ŒC @hkD4ft`@Wl8, X~?Ȇ50@e-1v4Q:p57OXX+ 'Er 'r%$,@`(#,t9xP ZLڔ:즪nz]%cQnu 9S% C ?uH?Q'ujP=ba U ֡j2 1cy\+JY"gޠLcV4PLOO7u ˒9Ps`< 0` a0~:wCʵ|pP.O}KcQNAڵK,n!r"/J;a%Bcg<k_f? |)UtIҠuyN8Xh\`'bV$du0ȇK7K~K'X7Y0E?O*X8;F*k48"^8 ާ/~]L2c^ДŢ u֮=Yvpw{]7βe^}}}̙s1Κل2}y!y_ Uwz oC_r0@jy`UUqx`N_hCLiij:p4_;ׯ1t&L3ނK7YC]bf5dރjˢ8r0$,Q'o~M⃏,)J[юSyRx9/XaAZ]1 X/p塄`aF"Ī̀JZD(W?ac%Dby^*(Wƪ|_YH@XPPQXر. My ʍEr18(sĀ"K (7rX֊(Rف,oa]+zM*@XddExI 'M~ b!OK @DyEچxXBYPH1.ì k-6(m9a%"%2QWI_^8 igs;fOO,4e7Yq^[[ڻ?W(?07Y<]4jyDq0`ISy82;o ]qݵvZ`9@I E`P`(xEIP좈*<CQT(Da}.7( IaVf=m8p ?Gs sXhؙ[@e]@Z;(*rƵP . EN}% a-@ޤ8X%ұ7up` F@ g&.I@TQ? 2~قI~H0t.$!B=KEyqR>@2v$]nL nܮj9𾰳ű/m C`)PC-T [t1,hV0sB,h^h&CrŅxsݛ,.q %H(E J `7 JHZčU ʒr`%@3??ɓpbZp1MEY;Xp0 ֛!eWV6XtZ>nŸN䑺Scauol?}X`oEz&fPh]2? PXOF@%w..f$1(6:"]$,H h$"m,SXvcV# 7uXXQ(Nh@ٰ.QN,vO52  <$V^">c`RwX,3,jבz8  boethK/z4r=ymB2ʎL.Kd#O zbL2Q|œC^rD.9X~QA>9g|mc-C,8 BY z..eQ7Q>2,C2 ,(>,o(\\PXX``"(*)!vP,$(Eܚ(OR|a <,౦ŎK`l(b@ 0ZWLx `qܰTE<)a&+DV:F.)@T.D* @<A\||1R+dYP?mhsJcK.ț=uG}^Ȉ aE(X.p},du-C08ӷev0K܎eYZ4۸!c%0k#`|ܓlТ]d֗aQ'ܠz/,CZqUԽHsZ[MdFqa(WɭM4{o.҄$Ϣf:^Si鴑P,]dJ7."7Y1d@*({/X`2O@\CPkuB|퇛Yv ]ʄe+"@~Bĉ>я - h/'bC]4]`0cYz6n`)z`˿KPo(^ `v)[o Nc1{=I$-|+Ϸ]^kgXyq0a"{N_Փ̃ek޾6+*c^?_E}{5m\73Qoם{'<"QaKUU!̴ߌҡ*-0m3s %YL9S'ގB;t,>b6`FāC̚6_җoJX~\pu} I\y BR{Z`$8 ) p.;ư@3}wc?{\9jDTXeh=r^;^zlLp|&p1ݽyJ{,ҹZ"Ƌ+n~\1 _Q6I{yq_uMGڛWSۧۨ-=LÍfACaV&rިE^6M`:avO4+\z𻠥-K4cݣJ/+W6/?})MFbA9K "w>pωH Fv%EV-BZ`j`a~m̓0t6M)`hY?sL10V&wY(-CKO:fBbĖUTN%TYU%)-l0 ;Ok1oE^nkp2Zpr*Gu. 6rD?Pen/qmv7͢l]xC^k xD'``И}Ь_JvjΊM^=AR tzV-_sT%;uzX&Ն'42iv١*w2uь!+ZJuWhuSP97bwWS3 !!XM&Cv00Y=3~wMkyP_ю͌zÌ9_9gMF-y;ˏjѲbCn޽ +̹:Z~Ł mMXl .:p} 1} 4bC D]`(BwT׺EojT7Y-Cuvr] `%p(!XYoe( ,KmQ?h4&=n./t VL0!>ׅAB\ќ Whҋn=-o"/E[Hj3LX!ŋa=e|2l iY&"UtPiJeiInp4;n`ckC]ÚF\*D*v\MF+{4ykpMd^hM^ w-6`Xd0|HWnIвlUY%4 ghh~o r!?eihܦPM6.o♶-CgR ~%eol*&9?up0tT>Ǎ=ϴ E Cѹ11kvmi~/I!q!Wyu@eٳg*s|ꢩn<%i;3 g6T}?9Y7GasSE*((Ѕk*6 NRQ]T\w ;[nꌉs䜷KU:y.]_Rxw@>O`gb0f(Eow:wH#2ӣk䈍*JS;Sti-oET詳uf5 ݸxR3vא=^UݓԽk?m.5@0zI\`(RhJD<벬{1CN9̺zx`(`ĹB=yoofYycw5}PC*oZj3P3碖 jOAY ؔܪSBYWkl~щ=5gJ%Hnɽ&,y K}eOygP[1_Q P,+ 4miNlZ^󳋴{pU+=x喔O;գm[3EWP!Msbgd03r+uZeW_ҳ*avg={|OHOj3o~/e iI`(Kgk&˭8H޺~N&hsE]\}[jZ* k۶%Y%W-CgoިM mU`ߤ93i|e|P"%j@/SGQ:5BKk΄hNN֢Uk:_: с*;L{ E?UCjoh{?9gkܘ*?]=VqTҤ>yj@5׵JS5aў go sRԽ$ͨ=a~ࠊZdƱMZwe EC~m]tZfkw_z[Ml3uN](e9*-Ԕ+tL_Ijjߡ**Q)LBTdM쁰GC[ԩSj$Xd֏Nъ9F#Pkd<vLk6jl@)FLJwڑ][jH=eZ@Eul^qxiW^ُ3=$Գ['%ϘQ+_~?+cAH9[}v@'шտ^)߼ Ҋ|gPտcն&l"e9Eyzk;zP۶mx ݹ|Lgڝ3kڶ'tb2`\VyEs7 k*)DϏ\z Өudph_{@cFu־ѹMs?mݧtrvֈSLNOV+с VgM37ɟx^0VW${gh}q\:ړC׵@v|K֫OR붃Yd\zƖX|OR*-H'qxuJTk`\'7+yrLԃe2TsNEOin U9]4r6|IsД(} %bM1CP_#&soN>@C}:$Ԕ4.Zf0d,9C] Ӹڴc`([6toD@JSD70H 5w6赧k&)m=uofF-٩Ҵm?m=H 4wqn:jlC`ʾnDD4E 6^4yDsMr9q7\fӆ umiQn*WGO̹ɢ d!!Z^I#K/A u䀖)SzLCzUS1{{^]4,Ү^LҼ9r0K7=FЩSڼhO]-#-MEeݹMӞ5e9t#fɅsghtx8ͥSG_~oZ6)+1CnDm~";ϻy8je"ܹcVnF3&nxӵkWtt@lrC]j=m7uz YShȘY0h֭Z/CKm`hao&'MVNKW*DBy->D9GiʸzNtd E{Y)6uhV2Cհf̘gfGjqu9;B-bRe9q TO͛oyrׅ-袳EPu0K9pRoق5tA=VC(ku~l' 4qƏPƎT~}|>Pn&ك4uL_f)KB/3dH;WҼt-gV'>m*}WM,^L`(B PQX]+!589C$&v1@ -c5s u^Ptɓ0uZdƎ>/PVk&զ$_xNgzT^Cf/s OG55dvU황kƤafωa@hdȌ;i/m`(0O,ҌtV0kJ,U~,CNYYÇ~\vR+;3SEf}udgnSjj6:C&}Zݱ2Y8XSSuXU>ͬcY:C7yG#xL9ڸ.U OѦ:]vZsik~u0Ԃa(V08zN ׁ](Ӳyp0`({֭[}v=v/~8!M@Ё 9 CO&Mj5jy 9r0 m۶iǎq㆙uCN Cfuw} 9 C7nT^^> Dsm4 ':P|P9 9 C999o+|plZ7u_2K_>`PX:p}݈;ᆪ-'6i!zvIZמ+تvV=iܻZ 8_ hv׺Ҝ>؜rm~!Caah޽P3 8T]}MݾsK 4r`Ӛ9[j]jpQo#ڱ~7HE0Y1_kQ6[GћfR񞃪|FCNgr???\}0k.[AO9wZ#v=ҴCj <u[]{4"Yش<3@c/Cq|ܼY:u5kAMMj:CUfAȇ܃-ʭRUVV9g64Xӥ.\tQKD {0,ׯڵkW~~'nO ]*~K7ի9wpܓ?;N=~_J #ԷPX4~DLZTB>t0|Bw֭[u1?~oˆɥxK.],#N0i&Μ94\u<3-߳kvvZ븎+mko&^;+iu:Hf9駵|2 r:r"L?C-Ч>)*))yA{mXJLؼH[Usѽ,mټWg".;5Im{'))m߰JGX[WmБSg?|}?ۥN;kٮc /╖!ti>Y?n,=SN[U3"==[q1!mJn;-ܵ@ {2}G4q AI͘4zujC5}pv;+ԡ3{܄{A]QQ 6x@|EK70ʲ|MCΝ;/PgLyG>KVo~)+(:s!NPn^ OT6qxS_?Hg j{N~^i**ȯWyifs >vѣ*.-,,95PGՌ*,:iUqU瘼 9TtLU&KK cʖgdo,HӾ:y޴TӷMX=kx~a蓟Ǝ[ R/jK)[$kP$CK:N4a@u6[KGQ~݊zU3y`UՓ.&+6uVֲM{tz5ynȫTYJ3Իc;MZW[Snl-FΚFfmu}hMviÂQz5%u鯝szƮU˻i\=ױ&]Uv:vjQIԾSGeq0q0a(HTUtFU<-36p‡[!j@>t0`(V}Jc= C'4lذZ0tbJ{KoUT*ky \W%c =h'4s6?Cgu$3M{tU}+s:<+ZiX/ֱ{n%4o:WZ?5U򬚼ثמ{Fߠc4tQGӊ*ܦguqMZ_T%Y=5 6Tgkazc3csO˻rK0j*w P{C6LGjX_kE24V}ө`}괮n_W\ &c ^HNN˵dɒ&9׭@(uf1pЃ>zE`^gr56uU'ia iARg2vC/^Q(;O_d{ҧP_}zhmYb/Ҏi:9I{VNK/ q9/Bc<=7ꝲMVCfiܢQ%-TA.-7U2g78{04c}JSS)ke.KңtrsMVp~y.NғF*s,u6[ \Ik 9ki4]&wqB D' h !C!`LPyy0}LZR~QV%Z1o晐cYoOyEe:cw({VoөSڔY]{kM*Ūt/ŋi:fLμK'HeEyZt9MVUmb-[Xq=yƝZ:z(C@>Mj7unOZsH0Wa7EHi2UV;7C0)4>n6ٹs+X ~d^R}Cu{^7:F, /}S' "\M12ՍehdQe{=5빔[s>ЍYK?ZC%i}z{t&յ RUҹsk7)^QO.9mM* 1NE.q@lg C7 gHG~ e{so8J$ P#)7>qO~ҿ0j vr?FdjyH06A~38C7Y͎!׬TX~6[a3};~ aCA#MXj x*HucM[){iN0čh$ׅ;qaϞWxZ00Oy6۶{o5ڽ+~ 5dP[g' E2,ҏnh~!%~6?E*SStnj7Yr|BM4q?|N1 =v`ݻ:{sփ䕓j`Ϲv՜8;1X:ܝ>|Z@ Aۦ:F`ǃY.'BV`yaB:gm)cൡɵ2+o9cZ.{0} AwOn}qke;'{xDmKBN~6E2?\! {؛­ "n x!:IDATuGtm_-t~|Y`e ϪH?2Ԅ@(v~/WUh u Sۿ ЀqF}*͵m۶-Coz~eW4`:.[x!fiz~58 ۳YyktO`:Lҽޱ]~ iZiޟֈ~6 B|?>kZvgg띂zrV!c>iC^$<'^|1͛RtHuڤ}38̹ۼt#޵VO&SJQ+y-|ɓk j?֤9:l:X/yu'?B6[v)kA6!P#&?V?ۢpZ/hHӖ'lٺez[S/͛u!m d!>uB6'-!eG~ʓkSCcF`y7L17#2 O878}}~c{]r偕޽g9O:w4UoUӆN}jAgeJ3/--d%Lx&9A _;Ë|*sÓ̶eOHQ3!-dk&c?ı8ja0E\l0\ 3TʎWZNI~uFZeؙ3gj@w/L^Z/Pۺߋ-k~o?~!n?3Oϴk׻fw5uI}㵏]._>ZӖvY@űm|+]>Zs8~9Ӻck_~;q"MVfYY׺~&@y8W,&-ҡ\ķ2ȈծF:okӱJG-0ݺW\G: nlP"nm=I`\gv Nݶۦ-luŝkmXP}K1?/O'cQ <ѡdž}昽mkG^5!okGKg V&dO4tPg!{xJY8G9G6#CCmRvy=V 5 p"#O6|̐EoCSjV~EcCgev-zd%~f}2z$і!0o(hH͹,S:sDಊ]CHb/sMM3bg3kָɀ~_txTd8 5EejDHʹꇡ]Kî]wpC H;h,ѥ*G}Q!0DY*Ez =bVOnМ.T_`(0WQG|WoEZ~g Cim^1L7c#'?=iE _씼rYc?P'ћZ{s(@:yDs>!nXPd*/^*Us@f]E*)Qƞ:UZY&c=]>R Cn^3T?C]# jI -!߆P*70$ g7^=Mo %zP49CG4M51c5 :Toՠ=ԳK~fCeY e/'b 19u__C7<]kŖ%UPi1Z؋!ao<`]`(pG&Ӯ]w\* ܄57 L BlW oݺ(:8~ۦr W_̯9* SO:Jd;hdŭ֭Ue=Ӎ-%߃g6>3ӀN|H7u?u0`6UycCeۓ1v7j~Zsn߾]k׮aFPlPcgJEs5 Sÿh\c7lcci<"9y| uy)]>d.kڱߵVǶv0`Ppk*/ׄ!]tV*]cm\f5hn2`t.6B 5Nݻue&kn;d'P*UvlxV,/ ;nQtDW_qui]2!C>Dw0`!o}E,!'Ҵ 9j9t$ h!nPC|"Dˉ`PC&:j\E ^E"n YC0?!ځM؏jXۺp0{0;9jPX 9u!i9rde(`g!S:kg,Vn7>4u!yE D&zXeqSj E<80 ki8r0rgI 9' Ѐq]V+j`_~jӦM&4k'ݛof1Ǩ^37ogƉ$̾~VKV/jΒ^zuf &Ʒ0=}***=|B! 8Q;x~߽;'񃖷KuOy6ɷ!兼}[v(_S^C !8\dn6YC>b}-0tQ?,ҍ.:x8)\55`(@Ӑ$ C#ZKRVp%2d=~zO(Kݵ{S.\y6Fׯ_ $DP":e %QģΚ* ս>;vu/|K<71CP&|M$eo.0j*?qpוgM,xL l0rTAo9iٛ a}}&.~xפD>Kl^2C6)C-kuՒaG੩~iJ+M(b٘ICL k0ŋlגaȏ)@b0a*k4V]?)ƍ} jM*QMro9'1dESy:`(Zu!@@|?J>QӲʔ("Cn4\y#W"Nڶ-!N>Ǐ{œznjOPj,""U!߲G?zhN0q״l׵oK͛}Ok֬CC>Y E5BD`<&x]`)L\Y\n} bd}K_,CO_H.^i]5 8 hz߄pAzgڙ6Q/&leɜ5u Kwe Ruh2n}FC͞Fݺu`(0WQ7U /iOˣRTg\Sߜah9q~ںk^I|VVMWȑyiMA/֢^nX8Lӷ׸1iWg2ϼ_ Z|y׬}#|};\e 8J E*DNj,C%y;4 yr׫Uzo C;S_R˔2%9VCSZh 4:t}3u ѝ, b9%,蔡|sv]Y˳bJ2\/o$0DWTTx2\fCMDO~(<"`T94jzoMJ_9G]FI5m4I\œzM'ڿ}G5ֿgOkZ65GǏfk۶m7A3Wj.h1olu7Qkʸ`޸_ނ#n_6>w1pӟTַ!ZN&)4d0t4eiJr5Pe1a [+8˧jĘm>tB'mVʄM࢓͸RjĈJ:о-4͔uTenZ{<fk΄?lzeo.9ˌ`MflXu 7X,É?? kj >?rE~syP{ط>`0 hgl#|?^L܃)C\p}>`0WQG T/;rA]p}C=5MPTI~eT.C!>`( ELA~oq#'C!>`Y"U6^ 'r#C)B\p}P ,C@G:`MY^ь4C!>``/@JC@0< S>CBA4yEGc S>Cтr!t\p0`H +g03gRff\۷yb\%%%^_ccI\>>0a7[gvP(W<-el٢\r>Cb\NRaaaٟY[u*DA"[? رC((={ ,X:rࡥ`(0ܡa? ޽;[z}ںu;8qJ]t@%*/֑b)9E˷Ne6~NAas ݽu]Wod,X`PKVCv5w C߸|rPFmшqԻh9_7~hР*)].ޠGlPQtrEO};OPqx Эұ\뱶vnާ[[|pڠ;OP4^жmGu7´qzl: 9jnu0`PYY-k c߯7okYƍc7nh)yno303E]ZWגb-8U;կ*8AڴQגuwꉃԹCyG<=M-5mohR}Ջ]ljo} &N^|J:^'-WgZͳ?U1tٌ<~ڿ`n,Jշ{G׳K==9ɶUm~F\'< V ?rDSg++6,?TL#lmu\o_y\ I5w$ݨ:*}LNZ|ffHk HT^AeI۶Wܗ"undȰjmn4%=|\KVhfI{2Vȳ?cQu\דP!-Ma 5pnygb6GqZ7mnީ9f4.ԝ Cԯ4߸35`z^9U9oO /W-kOguAʌɫwtx,_+5{J%6`fOT`\7izyM5ޯ]:녧~6#f=9WΜ9SG?^hJmڎP_S* umZ4[T}nBi?Li}Q3P6oLu3D[vҰJUqc΍2DK2x0tFYwhȴ;|Ϛ!c)mAfWe}xeUe@,"s~xnU>);TVt_j?>ICG,VjR]|Ju/ڹILts\j0^zTE M?C{i4e5坻U3;S=ky8l} 9PPvvᎎ~rt?9))vRЙk5ww:.MWJ`Ziw;C;Ѐs5:NZ/.V^땷/M uC'6mvAL''iR;N74$DrKbrߗɓÐ+oԘ1k2:Us +=5exMRBwx7}O_`,KI^܉󕑱^++,ܯ'5/?ǜz|F>B_ТmVNdɷxr%]tC~Wޠ&)~8al=˯LLiCMX:K,.ͥn 9r0>?yվ}{OI 5.beӦ}ڴ-_ܻraed]*P3N'/mG BTtlMZg߸yejYI3H9T\\L9}^IVidJ6Pn=itٓg+svn`V\[Vg<Ȧ s49yFshPRLꮗ ըiVcu~MaɳZݷ&Ö0 mSC)@t陵3D!a(e cMmЮ 9r& 9r0rD>7Jae{=i`e_b75wyoX\]/ ގ?7.9ƅtSgЍkH3GQY۽8\73+ˮ߾ &*t+(}C}]sU`@+ ]2Tʼnc^&K2z=}LG>g+MVz̿7P$1*N(׌#:u漗i~x;7.(e:zR'\uk2\,(-UNCA`{{Ýk9(==]eA`رcuVqy'ɘHgZ{6v!\dݱܓz; 9j\`(ژ?k׮u!@h޽x`6Yyy7zC.TKukWv!Vu?u8kW5awDsQN· P PN<+ OBLw|:/EWV?++BտGW, Ձ /((bp}\p} N}!wsr \h}!C\p}>`C}ɵģB 9ro>e(/ou0dX}sq#o.Mׯ\p}&*TaAI}ECPuof囙St}D@d^j:K/;r0nDބ./\p}ޖTn̐s9kH>> 6cpaN.5 s0,CO-ɵ>@,!\cXw}0gyF ,pՁ>Qݻ~ӟ;/}iO<{̫ \>>p_\>>o|hDVkIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/sift3.png0000666000000000000000000027022400000000000016046 0ustar00PNG  IHDR-g-JsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.36%jIDATx^\[.o޼~y3};^7_s9bbYsD9(JRP P@rNAg7EU:U h}<޻VUZWJHHݰa??z5k@׀])S|kf]Ç 6nܸ9sՋ]t L k8iӦOwܵqw}v M> 2d_uV)#G4x^{tE/t 5PS4Э[7,L0A+_pfӣG\p  π`K;}ְ; 2ƥ,xrqK8N^4)icnu1|~[9n.]Noʻ_?çNgE׀]v PcZC"C,QQǃqCee1wd]؄ %;ڥ5g9ïβC:[b([r_K./mt>ڢũv|ng7bP:Y/t 5P5ХK $N"gΜAtݻ DkBF3wnrz=spA=sgmBm֌AWfٳ' c!BYPB˯E (I듰ɦMCmyr#` J'2g +G 9~ 0pI:t 5k5йsg,èK0w?,A~Hɓ'Q g 3ۦ7w2/ޛ=my/9xc( ˵g )I6)C]g&?~Сtrӎۼm#fX8ƺǀ=c.zmpZtN65k@׀*@N0X1[*! KJ:8tĉe˥K#jqZ߾}a6OԾwu3Ww1Gv 6Ueb?]>F(9|%KRc8Ծlf3vj„VSߍ֝ڵKvZu0nB_zkdt^t 5k5ЬY30qTGi׮ײeK emmc!xxxt@WkCԻ}z:Yg.?٩B'< =}8_x]qܰn'Եbf=VC'7owb\Ϯy6ڏYzrUQ ZBok5k@׀*@4-@ հaCo";vbQ ?bCM e]צmLkY/ׯByqVGiЇ |נF{}gքCl_bdž1'ǏjmM'4nRA7BVڍXvrE%\ҹV#a7 mmFt@׀]T?3f |e nݺXoܸѦM,itjxS}F/^.',8g]@l]>Fҷv?|M'Z1jneve7qcwh :u~}Cݛ< unŞءv5k@׀*?{$,,즠 x06 1@e];}}ş};@('^o_nv*)*z}_Pu_o.H@# <Yݺıj5i26ws:2|!dnЁNn`5'/R+ [\&kg׮!-[ђa!YwgO׀]T~-(pSPP d!p @pP` !>H',7nF4h7 NԩaV5klawSÇ6C3w~w}uӷ~:?}÷թS?P ~)Џt 5k47 u fw*)@Ȱ-Xpڵk"x٨UG?6&t}d7'w?]{cݷkЮ+7SPhTkc!hTUk?w/ҨN͛o~P۶5k@@ @ZzYF(0 f +D0nPrᨧqy87oyC9z8?utސ3 :26bӏ?ҟ^t 5kjl"rAR(R8s3H0n ժ9v-xm muzmm_?ߺ-xު }8 Ԑ^t 5kc,zWByq68dER!En~㇭ ]ƏSzvFER@#-tҋ]t ||]6sf ,'ᵛ='DO5R^> ֋]t Z }>x`/D5k@׀q[^t 5k@@Ui@ǡҴޏ]t i@!5k@׀Kp(%d2k[W9Z!5k@@ӀyJkHE{yV;0ךt~%oYcOi璩P7n.k6!6AXzvPh:9Y)G\Xu42x״hk_~b̈́ڇ%s1vXp0J b.8ZjRftr+W6NKm9hݭ O5kրZՅNBĉg<\ڱb̵NF&W!p[5sqGnmέNqsjm Wyǘk. ]F`];O;ڳ~쇱tɗOmko0}n{/X#egrq u۸Y[M[񏍾e|{{ vYmbNlsZW׽'d,;}1F7׍})tܻkՀ1| {ruV{Fc,;b^ey=}WM4s2}͙`k*ޅxMuF8 Utk@GU8Tꗋh!+M^!er O?0!o€.Tb٭1|ۯOf@}~ްwk3ƛ̄蠹&`4w%7d#+Ǎwr 8L3`ƶ1lVnBul1~d¡CKǶjVUfu{!njwjJ]lTY)N-*š~3Mߢ~&/lšԔ` 5hڶ븣avڼ(5 &c}tVm6mԤE8IJ-~lشQoZRSVwo=76а5ǖvlܒ 8+=7=r'XYmJ&v^M9t |0C)I|NJINNNad%&\LfJJ2 b7S+C dj AMrZ ^)7.! Ep9xړ#CS8zD16^t//3QzET]9|СݳvS/Ό6C{MO5k@@ G]7j՘drBޥQػ0n^t 5Pc5Pu 5k@bk@׀]J28Wq>ר_]dpѧQwP*)]5anB@IOOIˈODLT\cXV<5SuCXqM@sP㗽:dwq~+Rġ՞GEO7r-G_JoW^k׃_,Y"((իwobb^mi"#uRG3u 뗣E "!nŠ0HπCw">) KpRAzM|.&݉OKLxZO:~9P@+WÎzzV3ηo޾s+hzɨB lCkHCmJB_x'ª p(,g6{h{Jp蕏Jǝ9?iA^bŊn=z~_`O̴4TS?M@yr@ LVVQyuf)nϿ~;'$mM 3?n%dĘx9w:PNp(e\fXx!wM:#C>|!J'@Df70;`Qࣳ_h~9~1-[Ph}7FuH},w޹s{=;$7Dիׯ>{ӧoÊ\ɚ;…/d5#OYa0`p4!L$ |YC^ʹ\ʫגE 8Ïuk˰QcW@K֯X ڽ?73ξ~9 }Co9q}ٵ")f+OpPTTԭS'Oj!̪X%h@?BLͪ헋MVkz>$2=;f;6ܸysm^'NxlҋcQ.㐀CP|]oWPs#}S#[_T~vE8dׇ`] 0 i!MDQCK &}X1mrq'.t{gq"qhu=v&ԂLXvɬ ӧ?xt\qm۶9;;#Rfá Ǐ'qȬt h!8V,cZxQTCiAA4~VZ@O^~+jӷ?6u7kݺ]V{aeݝúuj}[ 9Τ_.KU+]Ltg]t=S8V8|}}.\|G/Pr! /G|9|N%,h YLB.AZ~-G.8c[Ghƍpss؍5cIF<`uv&N7ݶmͶ[NFFO6lCg';; xu2F]q(+ LƱbJaCS?DoBgϞ5uӅ P?|]us׮y u\t P1Sc^޻o4֏_|ࡣM8Vs0OOx*Tl1XwYbE=,XqF g@ "`Q_c և*/{n{N':d{Dư.9_Z{oUtK\r8bB9z rF^zެٳ7""Uρ 7m~}˪1cD7Nv:ŀ\\e˽_ؼؽvtCfըk@3)DZ 0LAEKK>%JDK&D;wn_sz,>%šk}ŗz۹kwƭ~y `02PBAM8VЙII)6<xqH8ҬYڶm;{l|F/ҩS?('O.;SN9\~iaVOS܍Ɏ,7Qmퟯ\,ߏ_2-:tsТ㳗ӟ8~/Y@!7] l۾ CVb;vٳǬ#nM6i/:w~`۷_?}n^tto+2(':On>q /w R(QޣC #!a?G rW3WM!š//]{[K&XZt~,Acㆭ[}Y맿|^ سZm;vܴyc'?CJV/`!ʀ6l8h #Z wp{L:t3,@+M5>2\BѰ3R{]{c쥦׽|OWsv߯Onǐ`/ٱ)υeC,tZc豳/Yk]޾}O+a=n999Q3 k3 G@đ`IaJU!,Ó #`$!c/_\qen|5p%EAOCbxnփ6?qq]us*6ռ ~]PB˖͙z& ,|[˗_7/]γ|(_S!Ce;| ,$2`!}P&^Ž}8$G+ݟ~}oC]ڴiL?wnջ~9dx9}q\bE^#W%,DF0xƔMrr'`P!lʖgBnyk38oT~&&_{dJh(,/*s/) qrX=>T+yͶny!:-]& 8 ֳg1cL8a2P &tֽ^]O,H_N7"f%UAAV+L]M*V^lx-H5;6.qF GTQBRS)CJ?SǧrU { 7"ۂD|;wZ)8G\/mڴIp(od㖈@W_W2#9ҥq[OWSuݎ~D"PRyǬـKwf~skEb5:;p-:52UE'>C!:%t T 4mڔOoC@46mlذ~Ħ_ k1~sz6k{4jԨ z.>cǎ-Xwk/Jgmfl߮qV5m~͉3!熶+=LѮK67mPUeG~Rb{xxԫWI=E87oޟ'ݻwݺua?PVFe欿BS*5&`1ہ1a!;u䈥WӮ-;mG靳hԨYk| dw1lѴAӶ=de5|TN 5w\aǯۏwӫ>;lӪ5zwԺEmvFGonaOxYݶZ7j\i{n\gաy {8l<繸m^=:7j\Ǚoj۱uMzOpIˤC׀j fȑ#WhܸH_ʕ+qjTPK,ק`sov#uܹs6o0pܩ[7o>TDv.:nȴmiY'W 3a}xdsSn3%<18j ~+>=z4Xo~D8Dw-NkҤ bi{(3}+$qb} 1s/9pϩsY٦VqsN٥jzFҡF/pMI:8Qtuذqq{Sdo~O8r}Z*y!Yص['ut8uys'nSwu#9t>{M1:n^z:~u T ZIqc=|0Qk{[_+wt|KCV w&ΣujɼL ;,?>gHí{M^iV6owXq,)+$Pg}׶Qc('8h"?,aC<ѯ LPVmcgT ơ1n t@=6Z$oI㷰VCk7zd>m^-;دYc?wjFۂQc&ClIH<vGC~Km.FרQCGmYloX]2`AC8o6hQǡ25Z!+++ܬ_o?ǡȬԔD^һ>jC& O_bȝ>G\xDZاUHpSOĎ4Hx϶S`(F=pĮ]nmt}}z68eg_caW`lR!m/ !K:jǽ-0ln=fa#Sٮ;q=^G῞_ݵBڸnF9}|\4h.saN#O_0~Šn;whkQCvK8`t18}q/O5Pm42e @#V"wst"_.wVD:1-ġCчE|ņ \@ pNN6r[1j+<2L?g:|JZvV %{ko9 UW? c n(phĈ/R#xwaVS8/xs45,28r֭;t1K Z#>f_:'jOZ:M[c',^VƦDoZWJ7zt r qdTH l b[[5k@Հ a5vB[AU¢+,Y5k@Ӏ ݉8xחuߓc\ݨCч{~u 5P^ J5+ <~j\YmC)u 5i@N,STˢGw^>,#on^IKM)%''Mu^t  _%;xbWW D#Ò]^x:U7k@Gá׋b 8ٳ?z>x@ܿUeݻ>G ]*@C?]̱ôDXXo~:W̼J۲hlU'˕gOf?} ƃ9arB 71^#RV2~qV ]>F TOXOE&1a4۩Ag)9dݻwOvy_x}1ͥ73ߜI{eJL0Je޸jYgͭA8Uʦwk@ǯ?޽{Wлw rhQPPŶE/ƴ[TX(1*CWǟY;k׮ݺ;:t-Nܳ^;{؝Ka8vڙbe""ܹǗwϳ_ƣ%}v6N`BVlB{{NYxlC͛75E׀]c&8TXXtVq%ſ]qEW09{7)Z=nmx^LLs@sۓ/EnqB.L>oTY:8}yN'Vh4;1mp(++ '-ޘ;=nIp.`񃛃M9#]vFhȃ[+=z=iZwhߨv΃Z~}ݤKtmެy>|ĜpjVy?lZdUj޼[?{TPS``Sq8s2j(ˏO w8p۷oI_ o)VCp*)BίRIƯKC[YS>qʼ8]c9ƃHOwv]Nnyߏpfoܹt#Ww^9 3l]'sȢcfpus2tqM͎zޱeq`#'#o^9}r˚};qH ɓ'5``y/ )uOk_8?//*X` =~.i^G6T$aib)!aqd=Ew(7o{/W-[jDlf^h׬E|l֭+z}xi횶hٲl߲e{-1KN3"PZZH҂#c{ =w<`OSaa!E݉zp/w+vҞ0q#Ngos6#ڶnF]^7oq;<~6}Dsg|,C5bRCaÆ={pRaZ?h0z]8o|Mi[t0f`ىDRS! {8<)9wL_޴LfKV*0Ц0Sҝ$X x f2-r4/lWc pRXG̜ B6{QAhRb"رlx ,d*#TŮ=Jcw-8- 51߆Tʼ\_',̫uXXy`{8P5R61HdqH$ժ-2$-?^ܔtjpuɎ*0X]۶:W!5`|(װ-s ^Er S;0?Cj߾͟)<@-œ V/S8DUAJ!5R6CJ1IG(R\ RSqJ|¡-+N }+/+WRR{4˔By_=ī!B>^Jh /.C5.YjPaKU;wm(}!Mz*ڈ*.ʰ*)`Tq¨,oѣ7V!aJ={|rbv@o.4UI?-1Xj6Ք_N6"p_n\pHFDR*NǪ/G}1vjrZ[#\NJYm C^,= gfXͮq+ C/^a!n޷ rpp?5r/0 h=4TQ:HW!BF3+CkUs#CHVh!up!p>6գ r/+^hZR!,!`d8DNE8D"^W* P^J+]wn4oTD2KT>[WYTsf2A>GSMھKtUU,~.;]9ܿSJ^Q7o$d&i,b`v>Pi^W! *J$3론d2cκ>/[UQWv,¡H,Xvj2nq1ipT!N%߿?jp: "myi8e3g4zLCdg[Cf#7C@E$ƱQ_CS_  GjCĄRpl,Gx M 2MA۶JTHC 4I0sJM0c.F88r}qotZNCSί>eı\wN~lOCb 4}&ess 0Tu|N۰aL`a  ˦`S~MYIġıj!YmPJc5CxNboNݻGK9$sn`;,<|- A3xzh?:u;Ѳ~gsAQ_*p(VR^xkN.g1+#}fBf…[>p6̹+Q1{C .?z+-3+ֵ@Sp(o{?4/L%8tcݨ Χe%\3z녛4̌v:89طzf7 ġMl-փY&=58n$_8D;_,O/OVP=Ն%CNJևDO8VS8ć!]>l]Jnɒ{mgBB͙pi&Ie< !!'9vQpǎ/2p{ű63r vr{(9t>]G}Ćӫ4y֎>]&ϛ2uٱ5S]NڔUeFmuqH&C[Nm}cGZvժ;x}&׫Nfݦ̷AG:>!ta3jDߖʢN=ubs1%  2ϽFΘif#aeK9_.>>.-wu |!RSRy;*SUy]Jq8!#m"lU(UZ ׽Kj05W5nѣGOKI^8TXqBmӦDs$~IW ΆaDUHa/ea ZrԠBFš5q\W I ť`q)K*bQFEe")<*FoU$r*h"#۸.Ia*Ǔ@}xq%$EU""7'yT륾UP5{#qql}M#[/w֬GNMeďIFgtF8īp#:,vA0HF) E]=kشV͙6ѭ;9X#8 1vxZc4Xn֒ KGH0pu~!ߏx TYM׈CC J8eԥK8yFNn!=jy慄%pp-;d?}grӧs4E;zt)_Nǡ=%=e{fznMNur4~6mpBX8ٺu+~<{{wVqVУQ /'!^D5j|\\ U/aII23 ~'Jkko77x|Sl„I_4 VL!T%jBU}88īA 08QkhBBmh6U}"7!ꋤ7(!QUpcd5/G 9UUv,T2ꋪD8DSHj^(1iT ^8fCd SP |*GǗ! aq#p@{2v ό $|q^KpTЍ踔H}ź^?}*#/| @գSN28œ玓/.2#0P4.YoۈCq׮<-g{k=?%;.5u[`f\;}wص%]n_{\vv)NnٙNsCOvvFv8ǡ #^?d\\BeC3 r{_@a^mFN {}͐9W3˪/W%<?< xev9/MLqH73YZri \7riҾD&뗓#?C̢/G[B F_gO|R@x_WO2qݺeZ=L m/'f5ڵc$F*bm"e(UT[m6%xO1e9cF[yy &[uxFN3yb1ތ/r-eg8ss̙6uEA'KvtNv]׺dKݶM3Vl ݽ˰ fu咮C^(P`E.)l._kVzjr:+*qC{Ȓ8*!_:!~և@F&e"p˖!8$ةhmì=xgKX/8$!!yd8>_|,.d_- _!ݵk=diOT |8|g}pRNJrR~95qChhJ!0!_l8V58Vic!QJ2 ,EDťlY"#ܦNW_.44M>DfFaJdj!qb򗿔Bp|->UCd7o0UUTǪTƱpFSy%Spԩ+W:ToՆ,q)8}Jo,Do&FCK`W*:? .\P>3ۦM`7pHB={98iQUZzX޷o9oU`U*ϥS+ΡpQ^_"/UEH U_|TL q!7"܈cl%l8y3cWm':q{5 #*hrapjذh̷mu !nĎA*C"RƏG U\ҿ rĂCUaan.(x*_TxtNFBFp]]YIA!,˿ˆ_ rR>D;80vK-[ݽˆh*__#_Ksq_;80 ^4H/o U`6TU%wG;w*5)٠[~?ҼEUd6E \jTdM5sPָqO0B: Nx~MSWĤKTzUC3'czu>x!Lѥ-7+!.V!pH {7c)s)h@d0Y@J/CJ;T*XEqõC8LiCz~9.%wg7W/ثEd LM~9nq/OĘ*rrtx6 ͯ:UW11jC.* 9)bǙm@2V!, IP_y [ɟ\@RUCC\JCIqH;|~AWN/Кe8A pH ̾jC0trRqJql)[фOXᐴ/ѓ-C|3㐚8VZIU58$~AdXa!3(c5C 8)o$I+=̘M5!!,a ZX!?+rg"W B7D!tD0DX 'M/_epHzкuj} UP==$!2Yf!iwȄ Q`O#=ևdKu! 70=8dv^'Tw%![$T8V qHǺu_ (=t':S84jT ؽk!|c ; ](5#Q(ȭ :,)U'!e#L[`! ~a^5qRV ҆{ eh=O3CT]٪>P3/!>%J>BR`P®gG/G3)a{po% YGx8ڵ)[r 8q)X#Raǡc՝;l_c!aax@6ΗKN.H aaabEo0-8DpܹB k8D <x RTWWc\,&5)Wuqmy)=Fm/G}Q KN0(0F 0=XEsN//|9sť/'ĥS9cb?*Ё2:|CA3e"qs9 >OAAKVІCfguBx#v(>y7nM@ӳ+*!V-N qĘ F{Kuuep(* 8t떱m#o0j,0׏ Pl/%11p(99 d2~9Ua`( 95 ^CB)ݹh 8¤Ez};X?CiiR"B_{cc7o/x8d橊Fq(+/\cEnnRCaHqjR9/p޶60s+^ X7/Zpd)qմHphF8DUb}r;3){{88DR/phڴv 9+)N : #((8DMߍU<I^293#8ć)!t(dWff&Pe\mUܾ@[ P%!~Qq!̘RQ~9뇯 K>\q PJx?V~9K}NE8$L,ږr~9J8$-<em;yQQll!S尝6pHRZr8V5~9@#\"ėI7Q -^¢ٙzPMp߆w1'<<CEQ~"], I֊8D4~HCXUДqwc%qքP VDE>DN*٧YRqV_=W̛Z8dJDEC\J+M58D~C8D:U/h4jC8tq3H¶urB x cU&UCVipBȑlwU!cK~9n%&Հ_JFSW/(>aɡPX8d2:RqDZjWϞ{k!*LidT8d*U2NJLEZÊcu!8VY=z9:\Mp!6_=$ġ~b!}!尊`4N-!A0UH`!W1f4Iy*qH&_\ y!$J58\T j bccti?nԘz2n)q)n~`똊q 58DR aoe)Z4)#" m[qrhG=$Ft\u1Uq!$OXC4TǗُpɩq2=uZqHǪdX+ XCt8*Z&7c5e! ~ԊXiYqT+ᐕv!i+2QVtfqu/DJ!()S@eSC?^ևН8Vn =ԲZPG:*áG.2 p-0dAC?x`ts"wѣ ~~9bEH ~9n8y+ _Bhm#oPE rF?Ix&hC02C{H5wˑ/w;x#|^+W56 o_x{%'D=V:xRck!¡wQDPJdƦ=cBv`H5 ۷TK8EῇJ`ATHqťBCqxĂn@<)Z*`Y=DM/yR1Vesnn0d2BNCiݺ5ǡbR+g8aChpƦή0>GpL x8p'~4bc !&!=E8$"{hǎ=XF8th)!dwjLn]CTEm.H/c!tq(- CC|} +>I0C'6)eeC(r7Ip#^ߺŦf77&%}uaxTpݻ#$6!( 'Q# _BK/8D}q|CK ФIݻ=^fMp(448D@m4z5'Y{R A 84ujall,rep"g#8DU_  D88]>C"FSD }kpg%*C!>pԩ8V:\|q)=H 8_`/V!'ۆ(UC6*k尶Aq! [QA C=|9!ı ~"<h_؎!\G׎K `Rfׇ>xև(<*"ܮ]nnR~`LAe!~9zxXJz#"*!1+ ,)hrC޾-z~3t>8V3ǪCg=4y|T26nYU(U+]L.8* DZ*8EǡœGLt NpԔ]A"I~n LjcdsXc èׇ XY8$c v2ic>x (@e8Ȅ(O"ioYrxOJI1!T,͝t`8D@8il8O~9"/=XCطp" C>Xqdxua#v{=e9T\]3l"д?^ss\%,8 m'Ā VS4_sڶ}ܫ}p8_Ux@ ~/GRu()Cx!EP& 瓃UmC{jPȗU|}'Mz׹s2Zؼ98pO!mp6>P76n@0$TAsIIs1dMMF;Bw/a_lQˑ~9{Z#e/ RzJ@VCo!: eJX5~9u{HqZCٱgرc_$cgNIKva({y^9UCDhqnH ^!dA/1n p㳝JcUCǪ~?VPC9 9EJ%![ˍgYU+a ݧdjph2"Cp\NJ^F!,a!QJBLPD7ׇxp}X vԯ`qRNJdpY'!; )(x`8 (VCh1IJSC ZLC"z=-UCД)DZ=Vɗ#Vҥ_Ђp!8Y !q, pҞR{68D>-2:28dc/kIq:(msƱ!l"aQ!J3&\PCjXTCPydq>mmΎCC bnǡı@-*qDZjʉCBHQzS)_NcM8>qXkH[N{pˌ۷?QC+bűV*Q&B+eSX2C4uZ!DI~EZq)k+Eo%̣ıZCRЇ!B!"PǪZ$Zpa#C8_DXh*|&Ʊ } wsNψd,a%Z {1"dQP8oU`]o8%5x+΁_")ZU/gg7d*RhOe(űR||^&c r/PQQˇ.8"޶ +[[cfO墣_c Uh35dzs6TYq[%p]pD~;Y_jAXP&u ˳aE|?Cy"h mZ[cUh 4Jq4ob: KOgUIC@իsʪH U5(QRMRƌE BKO /o;85x4Bs*!wwV]8aBx5VI!xzUl>ϟ o_nE,#&?3ה)6kVpa.bAxwm2!AB{HCRܺ5r[*_.0)rtS8O8ԬYҥXmz({h\hGV~LcjUi+Gt {S60 rc$H{ۨ)X旣X5CjXe!c`Q> W߾"{?;C!lH:5h΁;Rr8$ ".Pa!a+}r(8ķD_! Cnx R:EVә3w·/8rUoQSOJcaxcj0<9N* RaZ4S !L;G?$!licI!FA'C8+=UCK/Hg"CQpQ)`` X49z),o,r!"t"aTMp$k0ԑ!p46=0 x^M8!8 /=FnЗZy%:F{t$ 8D2 NjYR1^2HCu `Xä,opCMrxbdCjy  X-!kذd۶R1R8V=p8V!7XPEdƍqHNJ!q6MXL6e!pa=x?/?5"J8Vx=Tpw fy ZqX0:>#[)!ݡ5k+BGxnCo<\ŮYCzCq(##㜠XYYq. e?|8xۄCхpmmĶ|F;XST}SuA2yg8|ʃ \cNJ:UX%zI/F>8~x dN+EU;r1pРR""]_ʤCFE4hPaLqX1CMCiipQėCٳᨡ*qo y؄ O # ^ȗCȝ;`%%cLJė*_c_m/TY>cOqS}x 40=mp-ƾ\ps(]"EvCɹ Z6nd<h1 On U3 Rxr0HCPڵpEodUDT8DR qdq.8D Mߵz58D#m{x;wfRC/qh{/葑n::@(=;IA~E:8dB21s+09`~C(T~9m* Ro с)cUˡ5F6"U TE~9˜y^Q+!a_NdAQ_/8V!A,q"/Gq ~9)_R{,m*RÆLS8/gc8͟_O**rђ%L8:V=$%Sxzf߾""C!&P@L!e54X1urLI/Sx~/Ȁ>CT{7Jq9" p W/U! HLn~N5!ڏU+O/Co?,a pʕ|9}?V̯!Ck) Pۆ7%]=uC(CӄCNJFsxD8@U!U`1&eqX+8QCo5}XEOXB2__aqH=OCUC]cqbpz$6M1*q'똌!;L~9zsCT8ߍj|}Ȕ_xdyەC fGC_~YnG!V~fy۲~9j{yەCDG>h?V(,o[XNN7KcDPMr%Ӿ|}qHˡTF5 YJ 㤕ˁh\k~U]К5 <3v>ᐽ=/4ةSQzbx¨8Tq;84}zaF2)¡3X_|!!__vNxq84kVa۶az8 م(C2ܹ111buq6f c{Sb.Y{85k6ˡݽ4NOAS] rC=D~9SNJ׉ 쪅|9\'!_r{8B~9I(~eHۦ_*(L (]<D] Tm)qp,M/dЯq =ċz<Ğ9clp|9 B9Sq,&M*f}H#D 2{H9>6mbr/g "_6=DJ)O+aVB+^$Yr"BpH䗓 PpOB8X6>~pH䗣 旣>!YlqCbNCۋ`+#{TQ!lRև;CiWq8~xnm/*ZDXmcqfq$48fL] ?,wĜE*X`0]0r졔x,eq"7% 2Jzˈq@EB_¼>~{vQGA#8V<؄C[cATƱZlyIi-SơKKΞ-}-!<]\Q µs2뗣\CXE88Vlj6B9qBnM~ӧ/ I !:YXt\ C¡}#;;ggoMFq &%M;p{q.{=% !8V­))fLiqϞbb-J_}ab֬4X!ėk$ca5j= =;H*|q{#afTiн?/׹nbTR6v}H|9i).]PyRaa!TmrO,x B">Q񗜜Qa}iX8:!4K~9 Ѓ:txLR P Ca VE8UC]'^*Y< "_{ {QGzy=t>CPZv)>ż!e(~x۴+-@Z_ULAy!qB#ACk/P6\]o}xehy[q^z6 m<N!Emjޜ*!ۖcy!\2N۵+yclj'B#QH4i˦tw8|E > E|9,PԪp}Hdav*/'Ǭ_.DȗC;'OAGۖ}ñB^(uLɿ jˡC:$#bNʗ+_]pB`_uYe3aT>56p`j|!!_c9A5%my2PD7qr!~8rP6T'3C߲e.[rd[ű*pĹԙ#*z3 RRRrLj~|9ڑ@5fG5>w"(]!ZqhES⡵/5pEJ03qRcC,vU ʸ=(Cϟ3akCan!9<{/T Y(-!lR:&PQ+,嬬5CD']TӦM S!!qpHa2K؅bE=8V=J Rۦp#e"_8%ı!P\cUCS 8t%85I.qH!U4űrUh!)8VCXc(|qV/qhW8 eq/{ {wgA4G & ]XŠ`QZ#Z/()!C&Q8_Q*jpq 8D/RXCzk Cp=d& UCXˉCXNJ3Qhh>!2j qF)Zb2phXqFk,MAݺ$rZqh߾Gފ!r qi!ıZCx,!X?Mj2U-\Q>3Ηo > ]]Y+]IEΑ#߁o5/8V!3rd[sNQޖ/9xb=ׯEmHJzwc _ d\U7Ԉy!pRh 5hPޟl"ܦMoע~dT"oq  vU ΝaU8:?Nly ֭l _ڲܣɡM FJ17# ޤװo O&|rt]qNu8eԆMޗ_1ݻB"F2 Y[XHRdPkbU@8gH.92mPBmy!w|Y&1s&Ktq+~y d!t{X A BıYƱ HOcƱ ( A&r3<) X=XT^?@dѯ ;q䷿Y߭c`e/҅MZuRBC_p;Nh!qS~1뗓C^^9C8V)p9, ЁmvSXkH[erS L+o!m9R zp_p)Dm`rXV^UG=qvl"7OGCKۮn~9MmCXGъCHCH+ A[C]8&.^,SVCt9ZqH:P CjC8VMPl,ۏUKvBx?d!~2C+8B0k!JPP.݅mCbB&fy`miγe!Hfq~諢x ۡ/UAc䗣!_< }'FbN*B옔V;eKd`IqnΝ%qUCo4A>N/pHJ/"Y." m4E7G]t/U=nqt/YHRRCi !YPdqe H f.p[ 'Pr~RX"WaMV(8$||JA-?̶/ r8[`fjrR{H  !woYwmPCX1qh:w. <3i6~CNJ"U8XUűrh!Ӹ;d!8VCQbv}X5B),ٰw=l׮Bp6E=$cC YMrcưR{W~==c!ևpu`~U ?{HǪ`!<2y`H:"ڼYc0Ta>(AH}APzrHPQ{(ƍ+bat# BxR+((9Ldw_NCmō|[ѳΪŘ߼> ʿkXLadgqLۓY8%&/c;6|9$ĕui!=Z Æ#8G8cC(Qqcx=E /|1p? qc @Xڿ" kda!rX?`@` K/z/xz"B_Yµ9rSDP!)aTR Zjq"?aܹĿ$3Ra2^?# X8,==GCB6lx޶M}V/[ڧO*%%8ڰaHΪ0Sߺڼ9>Pt4cCTϧ d!*#B_N*! !s,brR| ZXBW!YwDCHM2޶4M)hc~9, ~9nmj5ᒩrъC<گ|*)f}x&z3mD T""ˆpy'){i!8JT>ñᓬ=T8d*!qĉ̵rBD(~H>Oݙ/ר.9xACC zQWO mDʉCcE r'"̷-c<_b~  kq+!__}?֚ @qW3{i!Z%8T&8()oo"yD#tǩ!~4ġAi)և:Ҿ4 n!uǎ|!' a֓WZy$/ޅKrEQ+jBRC␈5$$*83 19b=j*8VD!tD#!8VP!8VChDC۶>65N+)ıbA+^ׇyN_^!pNj8RSzu 3Ch 8\ HqpAa a+W*!| w_? XU\av (㐈!e8V!baSC?/:ȟMEa}~9̤(B!B"om!RRX17)(wg}PMp~a@dXf9q|/¢C8V58?E ar!d`I/G8D]pp "pWDwXV ,XUű}!A$82EmCa!0DqC>tfׇdqqfqP=|Y> ͇֮_UX:r }Q3_<DG|99u #&%!!8ʯK!r~~~ Erx@p p{b`xCephhChC(S88pHN o bՅ DQ@0M!@ޔR7dfqh@1pmۈCPF*8ZhjPhCl<~6P``?'!aanUAyUYbR!mJE8tH>mCjClʪɓbgg6>|pQT-,^@ yz2)opյ+8 .]1^2ЉLƌm!Hu$!KCH7.!ır{`f`:85!qx0??ƅڶ5CD8t4R!ı8TÀG4*RVߏrd@T_/)\B/؇MX8 /!"ˑ%!ZF22*/ ƃ?&*|!:jOqNQ84xnjǡ2Jy &p(%SPOGKq{ /r"v9qq9xs8D~B8DZlPߺV e;|r@hrғN_'d 6""m'3+SY{X5Xӹ_x#D/TEX;]L !t~j!Tyr:u1"YǪcP҄CxJ!dpˊ)Ӵ>DıJׇ(ќVpZqHc?%5q(6``~ck3Pv؁\[7j[H\\\z-_|]3;׻6?K7N|9$[QӦK&߲%NdI2&=Ԯݓ^DGrfai *PQٳq!8lȀǫCN H*4q/|zEbG. >iN/=P)T18gRmH%$QΏY m'b Tz9OEUsq{R=a-Z+nYÆ5"pTAHQ㸹CBUݺc聡jر8Cx0PO/xEUB>4x/܊IPM_U)\g[|z[{ >j"6NZH dffիw^啉!/0PլٳDQERM>]M!,Օ=k&˜ \گQ%Am9mAR=bRk߼YZԯ]4d]mܸlGFƁaC<",zjXVDHH۠ Y6 A!A_M/G_|yېt{!zLI~#"hq+}fƞ>jʡiI7oed&Şs:iw@rF)2/[+2d8%<~G `IX8@C,a0ll@.R9$zz1bDAb*=p(!?)ԱLJ$qD&Hoِ=*޵]U8 nLL 8*<C_8-m ,p!mqo1R!~蝈* qB} EC< 8?!֑bh{́0;GBmpU`t횅ɗ7㐩=} u^sFnZ58[DbiM_N6!}R~ׇ夽HׇpMS>Tdׇ/z&6~9L o~!.ke|sPT夞L~9ټ>jrD 3 Eė/rBmY ͔_0"~~9C(Zr&`'|˭]VXKV=Ro $wwt`帙..ߵPsvK[8ds*ޏe>ևLh?Vgb*ׇqG.o^cPD8$܏U3!`}b2k!i!ׯ/Bm,;$ pܾ}l)) m Z ڻCw7qUcP/4%#)\]LrO!(]0{v(|9ׇ/j|KGȫ/n֭EK0S j Lr4Bjx8&?JC& X :v92/[ 46سgӧ *gUR..E8)B>/Rm98al~_~1x »̯K(Tk{{]򶉼SqH4N&_*c l{zqpQ*jRV!5o dI/EXxr !ıjU!vC9q@0:zt>m>Xa̮xox\Rhz[n]_]0bD>xۨ8gϊla r) U_~YԧOmS))oC8&6bu(Qh ڕ  o[/H`v])AiiE۷r,d4)!m+qȐKEi"ڹ3m)PPiS.!:/C{B -UC8NJυsC\Qxېkc1=hXx8Q_!U"?JCcGf;rsAmcEW 8tkOiaժw!T~fUCZ^eϡ;.A#8ty3t'"=I"Eu q?UcǘP:LJC9xh o_5!zEqa0)#?Ct^06[)iw"B9̟88D;pH8xжm,|zT㐎Cf֌~9|)ft}/-CPF;<TS<1/׆cmaS_.2`AÞR'6f>.o[)' eCXݏլ_NM_-CtZׇf\c:iUf)OWSQWxvߛAıv;U!*LERfHqUGڏ^!d[8n(IS8c!ڏD9~>: q2i `3/|*9T2YB,áh!CC={ѣoBC Io U"6'EC%$Oty~eMMG5!Rl!Oq&{H R!> *_*#ΰQzSoYCEMmi?Mq!2;&f!0*$ԩ2HEᐨi!); ǡKC@qvXW`oD$!ǡڵKAG'm!\2PB5!NJpa2§_EFI!&=d/tj6 P!|Oh}N!X) z%Rj 8Vc␩8ֿ}!(g*$qrj W8|k=]!&zeY:yR&UCq C[qG}5!Z=krĜE d‹ALM8IJc5ddqpH}kqP*!qB"6p1}G~9iݏUo[䗳:s )a$!_R*88Vl^ń=) Pq9D#ׇ8$yNKGȫ>xܗw7m_PėVR_Q+o022D':t+U"Ņi/7~QO߼F(sZ!T _)Pq#R*yN@ř!!y!. ޽{mR!TxOU={B*C8VQ:}NJag",^\_ʣ<-bU_<~%/\XqϏIAb:91)!_С{8T݀xzAi޼ رC6]C Uȑb[76UCx!<8t*蒥8ph^KXC28SǪ(B,QepWp )=aR*׀C<pUCkp"!9SSR_CB)ʫ"!F$zp(pHʿ);vBtRq׷޼\:|C5 xDíM,_mrx#V) 2 Xh)_NC\U_L̛|B{Wȷm_pBHzk'BN|9؋KVm+DQ&!_Y~9"pD~9ahPa?Vg/'+oL=D"dIi{=*E5jC"X5c#T_(S<DM|9лiq?֪!ORqXy}~Y` M-.ġ޽YzBu\*p,>$ġcd醈x ^} qfxۢX-!XߏpT>$;z{#1qhV(28CBB.] -[UD9U)6, .CyxdQj)<p 阔1)*#˗lxەC,oYdS8~!ԣGb!DצıJqqp.WcERY.y)PGX${Q |OXtqȒ| ڕu{ȵ/ C*b*石,Ű͡ B&o9uTEGDsQS=DׅaPS4c:)˶IR<)J>i()YT*`>ĵ^甂U~9i~9tY"Mo1MSSc/lOL,sq魔s l[ iRΗ._~k6)EAXD1@+8$ RwHNu RSGG8Ϗ9%YN,|0E2U_CT\7>}}xC!8IVڗh}IE}G/ ZfTaU=A}e! )#EB3/?Eׯ > }Jׇla[IU@c僗C\Q4 =݆ ( A4Bs-/F:~]} R 5?/G*/ B|9> CpCytl|[RPC#ʲe~NJKC7Dm"`^ŋY}tT5`޲2qT bc_x|9XW bor })S<ڵ j~dS)c5/"6~GW/ر n~CW闣/h.e/fx*l;yJ)<`LCdm8|9$b@JñM88VSSoqRUJyN!)Iy^jL ~G5Vja'lΏ?VݏU*!mse~9 pٙpo,&z{!̳dO2!6^Ԛ))n!!|"MB}aqHު9Pj)nkc5:=SHKMerƚ&Uvo~þӕy  =ɿki&{m U q;vӄCaeMCY_¤J0{>"XG\)Sc0Ʊ2Sz_N:Dq#e_ԣ5U؎BB'=q&Y3J/M%P55CюCIvO 91lSW9ņo_4a~}Gn-UH8Yi,O:\Be#C8s8VM8UcurJׄCGЫzB|a+W, 1Lű CǪp!Q+ ^S /Ʊ!Z2BPS0lcU!ʊ^L8D |ۚpECj&jtv s1% $;ґ %LKv_xK,!҈z:9ȚqfqHA 8yۚpHN+?\QCH҃?B<,͉C88$l !)ƪСfX␬9!^qcƱ!WC+eTQ!Y޶YI5 I,TC;hݻU 21qCu¡Ԅ c[|Sh4-jT|g/l2ϟNd$ۘ?F|ėSuΝ&M,_c8֌ Uӑ B@r=ΤPt^WUj۶mtv7&x!ıB +h§<Ԩ"9JHHd E8lx:9kR;?9rU'~$ r\*gtg)/)5)М9qq QEߕ jD BB)HUVVo RmQ?dL {E17o[[߆*R`{޸2b}HX1XC.Ǐ*""[3ԩ`$*X]))ԭ U8ϞH(FΓ'Oc*R˂Wxխ[ E8)TpJ$+VOc}H  >x2 }AT/8/^/4HHEFA3ׯ{(3!5rdևh5gϞ ևU$5bD:ɑ )BV6U:8gn1rdlx1 :!̲*amHh2,)G`I| t 8ȯ>!:n7$BCNp2`^旣>(Sy}8I8`q/\9! FFT)J!X3X"\ p_St*>vʎ>G_lք%&m;bIh|pHi J#Uy}4ԯalM}~bJ +kj}Hd)Q*?Y%ևRPtqVJj!f#"(Uq6~")e*!؅*ׇ*,]ُUOևhG_N!_XtRjq8s#,$$V|rfZţe2n$aѕ*aRtp _K_XyLCMq2?~92~MBxzUk  6M%ˡeC8ݏn2;K/JLpCc)޶P 8wXD CTXM_SC/_QLJQk8̗M>Ҏt:u|-¡R`= IeqX!*4J&PSqt,8V C}SqBu% pHǪ_QtJ2NJNpH?dv;v]h"=d*QmaqUa+ H8NqeXygp'N AD8DR!v84>EqH[\]N+'i!ٙ!,z[cХK *]`8Bpk+ae 8f`j2<+kg8DT! f)Re8UCݻ(%ylTrXvw7旃H ߡARHJql6*Y)Q+Q~94K~9 -8P_NCLؔپ!\P 8$()jQ E#͎RZ$/'!0x$U!!ب4NWe7erA~9,489T& <i?"E*cYC{旓}iYTp{4U#L58t(^@ 篘-eNrr`q)SÀl_!![5,`KЇ 2ڰa2|嗲(MYM8?UmJ1SK3g#I3pRs)QRm(s6Ǧ8V{\SEI})aL,D cKs{VA*!*9Ka6D픔bamaPT4/| ۦZ>8$"h4`Z60ԍE1B"mP!6x035 2RA^_\1⦾R QC<| mK&CscSWg (l>~{ܘo8ĥLۖͥ͜o8$M^VimHU:YRpH9ϩ) GUmUPyt*]v_R0U>djb)QU`WdB\Uɗ=IpgqeaՋZR8r m.K!lȰ/1~f}HڵVyCZ>(USW}4*u*! RC}!Xn]UY!R*q}I9^Uh?V8i6CZʉCX qȰ%GES+4aYSxacE!)8cSWaqH-'W(E!}!SFH=)UKTP @%i<ݩpLB* ҙB*DZjHX.HHYQcک&8DqZFKB)58$R/xbLEFZJIρ[.98V5#9ҪRCև!Sqj8I7U*(iݙc)kJXSAOr)Y=U;VMp,, ) }}}J!^шIA49H IUU11yXWS_-7hz6,?l|ZV_(ĕ}' gѬA^eJۻ 4#0+.8J!yHQPu1U=qN!&yZc!!eXb8TPG:CΥ!Y*@ͫ,FUz/_N卫Ve_ qbTc=e}~9VMpx j]~^8USP )2@)(kqUjV־*L֪jw!V;e5k&h@_ wI0C([k@׀ h>̟m ~v~~~X_aG7C$Et 5`tUMph}k@׀4~#N0㐎Cf>b[nMC/>>>m۶U>ݮ];R'OСV)//;j:~xΝJs:::j={J͚5IԌ3-ZUj/*5mڴKj:ue˴JM2eŊZ&Mj*R8I&HZUqAAAZ6lxRp}]xQTzJխ[73Sa h㐎Cfp(**k׮Z-ݻkqF=J!gϞZ_nmmU*$$Fwvvvqq*zjkqFR7oެU uVRK,ٶmV);JwڥUj{*VA|hUUVȹUEiiiZ5kU P5#&~9CH!Bt*D!5S}>F>`iz(Yb7c**2uYW\\eR)7oYGˤu/Hi}6pCc FljY0HpȂjePM:qHT_qHC_8T!~*S t\&8eF `y>+k|e=վJoΗӊUw~55h@ǡ=8􉼄e5VtE'bn_b><}23o"d^Ro]~#6)S~$MHg#ƭ DR#Jnĥ+\CU+Z{8:kY[uӣ}>3HѼsQ!}s'kg|4eɅDw`ӽu[ i ^]z]OX|6~2)]wNqFFD-NJCZѡί8~\619vnW?Ƃ 6f5 $?6ȍ:zm? 1s|l`8f:Kl>.] ee&܂zDl2{;n췶zB3CV 9(zq_Mj.GG^7k3헻qٙ |BWw _容t dGfVvFfÏ82S,kS7+O~!qqa,d$Z:7E] o{J kܡ놗jNjjv<-|Ym=Gǡ+ZApHCsFp||} # {\ΎrOgB'o%^p Yϟvs-o5'#ni-{͊7@崢C՝q(MNC쏟?1Kuح:.JGXмNFl=ޢU:'mL/\ųÔa{f.^Si+&CU+Z{8O,t  8| 5kCk@ǡ=8]B:iE;_ǡx>t qpEkO:}C_׀Ѐ<!uq|P xzz;w\tU8}5k5 Cϟ?hѣG:O]tWCqqqIII"@pp55Pc5P !oSN8qE/i'E/>q/D~9|[zHCLܧyj~NR/hӘq!|x|PPi'zMb2/YVz|tdxXxTLb$LZ{aiӯe%ŧde_¼/: װk@t2uԔ*F-8$ էU:oUfنr'^ -*b72rܾr9ut&ăGO?Dq,r<{M^u$Vҟfp㮊"yk{Բ?}s}o=S9}v+bt#Ҥ{GH%PzB Yk"Ed;ߙy2kwz:yk~mjOYBB^>YK]B%QZ℉P̲Crf絓nW\9}2r԰/8?䍏OUU$+Pٻ`uL޵K.щ3}|^|;ٹ%=wspMS9}W;ƒ֥F^o޵ݎ~~m{XP;uL`E|~5ú³.YWcj!sg kB@msڙW=ݶqqI;v.}IqáRHEٹx, kn{'?t6>MJ >*$ 5Gqǃ -QIɛT˔:ECK#ltHt m ܐsg=L ȡ5ؔ]})iygMMغwiӣ 4.)vۖN\Qz}s08M/#iyRll5Ijm00زnu2‡|-G̍ vl~^ݲ>`N|jmGKo{ ;v\KĴ/[w{צu=n  t)!W%4!FwMYIݣk/]L,}DRω f; .!|5ゥ<^]g̳GͮMK@H]v`tUH|84>FSLjHʽ{W8ބC#-II ﷈ɹw=>kLp->=g=4R`ku5.@4'fqM0$nC.8^N{-O? w(=*0Kt9u9=.GCSck^!#IFx}&R٣KSk+=Yc{򉣁ryyWpw+LR6Fz枋k{w?/*^ƹc}UIn'.杵=vNnnU}#̶G]sC;ǎXlltQcgE{#V+Ǎ"X}nF.'x>u P9wv匹?b{ >.M w6ݻ܋[y=OuJKKW4 G`Y<\Ѥ g;xH?6}Wh.*aÄ;eC;\S.tYYkQɹqQCQא$?0ArPK,B3\^;o rKy(lF (_xQԖ% =>?%{ETО_H{HäEx:x䶎z<=8b%Rק?q6:ppC1't ?Ɍȸva5u$hyhcׇjvydg#{nu?{^"}yϣgK|BHp1<(3E?3/F@6z5F:VFY8bsTYt u2+\EZEoEws]C $pX%_-E=%и^u*jn(>s2gC3<4nN?f;J`0FFȶ4CWã.PxŦEY=y֕tbiXO4teY]N%o.JO\Y;R}"_V&}Y<.2EwrvT/w\*qWq9j]]M<% &ܲ.TSw=yr*`;գ(! ~~֮mx nsr͓x J::f0h4,}X6rb`xoN<=կ/Icp릍f:ӯwq3`N6.9c4'6E{a ߔ4seP/t!9z -M]$ܸ;z?/%G:=ƥ_4MvSTbkv^+G) F@n8}sՃx'ɇGXdd_>\*+7bK6Wj-'Y [;EQK,F lZqy.ph$Rg>MX'=! }}n@7ɓO%L&=BrP==Aw#Y>3JdltN]=x*c#uGZd0smbq{04CK zizﵴ!7KiftF'aOF;"I 43K*GE)/'HU|0LTIƵ31gӱCgϲ^}4lʮ S󧊏2$I8P_vl*͙aߗa}yYh#QPPC`Y<ϊC>Cr+\`ܜ߯ZQ+OEyh8gsjVlk<=K~fzCE6EE`ExwZRg\qF=}?3=C &w_-f ܽ 8Ǖ<ں2k⡾uʴ""#D=z=ߑsIzrn^Rˎ%ז;\ -"""yyytѧC'dP/&.4ٳ>-z~PZ2dhEشiLuͱy&y-'~i<&٫Ob˗yhA׉3]좑$Yy֚?r;LLrپf-Cq8wMk74=Tܼ~cEa*C@@X"`H\f X=z踯_~{nNNxLo硷_2`){``LGx燦rC=|ϨTv7eO]pw,zZzk[SQRt)#WfK{Wyh̩}-=ҼHyJ]CQPP,h_W|ҥOߴs\βٳg`VЗliiEyhYIrJeg-)Mqf+j[]n_\;s9\̗(ގϟu:l {gV4..z |ھ};4=Nr۷o@\nxHׂϟ?_T>%7+Ct}~3riFs׊LO;9圍P\[V%UnfgR zClHl%wq/}BA"C kweeeV&.( CP[WoQ y7vT܍>pt-Z岖N:e]dt+ʉ1=`qQs 瘀-\aW0"((_($cccgq @7ܳK驧ھ/ṭF@X]OԤV`X|mݼ޴uAWW{C[酭uwOGfU_4MиZ,ՆN!+__yh2B3|w/TvXȇGU=YCd9^Whut7+F-QPPV'+O^jgFDԴNZƥ&u?ra94uh2vе6.w' ~tz :JSio7$K ~Xia/f>kq -$/dtY~Ю|]>踸SYwȈ:v:u"ZR,|p!#F [NZp+7շ&Z os>̭ /hrR}LˑMvyhb\YjnrC}}} )VzƺSN?@q(?u֍?ǣyh*.7g=d}m. O)^19$L!3s#jrUT@OT;tڭ$7Ǩg]-!^[*I{SâW+(0?P/PPP># Q P|Sc{DgIi_筃H\NBv9YqG#j!KBpܜnFO=py\M(((YCnA#"\} $[srSb<#Hr`bBCiJ)PZ|Z'e̼VF;dzL7F=b<. ҵЎ!~^Qhmkt<지?ʏ ^ƣyV~+A9V4N8Dٸvgnx. 'U T> v3)7I'NJc]"`^|\/{4ڮ@>O1f1E.9uwF({VNtJ%RTh;RJ͖.:m-gWRCPjP' ZQj.q=40|>Jj=} '~*޳3;mMo iG&'?CXPyq EToA WkT6>.9kp^z.CBe3 WHt˨@S%ת)cIʨ{=Q/|5ldI7.ʪZ5),QS1B,T= KٍqcNeect60*ؾUQ=gѺ;s<=,d&|cX/STZyg.5R] 6gs*IyĴ1˹~W]1)7;E;cS r;]ρ{\JŠ. SZ*/+ȳr?d!neN-tߝ\htn[ZLۤ@6;-x9\W7+l7.U&2S~ua0G:C 9|'2{vY4z{6)LN6fǷ9h "կAn:L9ۢ:s` 6H&'Ȧ6Mcu{2G{Tm&39YPAɑRY\*(ulL~w{H@'^O:f5#rSּߒOPxkR=zR0&e ~"hC͉,*M*M{`7`ښ%,>CŁs#L;~_ΰn_w. [7fM5R5 Ӫ%үhGf~H9N^n|xP"~9pR T3c5gQK~@%&Fi{ O!:3n=OV#0;3a?FeHȏrldA6,Eg9ֻQ\R WUk2jٵW<4(3y S Hp !CNk ~2-HjOZc5;"a q v+zD]G2:5`kFe=?a_иuxϕ9~U>&9{e/ah:ZuH&D6ͽpdU=F998stwjBfVdp];W97;i_Matj&q !t蛪d@%c%"3S]Zd lu1WjvzPT_3I]%:jeBGt8ҾUpT)bV<'&;>h*дl֔oNH3ʍ׋%*n6k mn@ C~@+nZIFr]iUS{SJƯ#lv@*I'l=߰2֢gzCSBp\FaYϑUkta|i}w/Wn4yC/5V|r׳%իO=z}HҰ%m&_U>xȨ,5{~cIVPcϛUcl`z. S\V/^a}{wzٸ%MuCճWAjVC;xk*;=:Jrl_hzyO릢]dF#Ǫ@ZzhslA¶~iиTls8~MlCwyht#u/sq|Aǡ bBNti6J><$c^}+gړ& ocMŅb[/iW [2u$C4fF0 k CkF4gNԮIsp4xMH hss4y&/ׇmыv GˀǞn5T->r&:KʭSss^q3=Y|iT!=;/_'#W*Wkz{3&M {ҶPDآʼD:L0l &ḿI; O^`ǒU(‘qM o:X8QMDE;J~m+?B5iӇ?nU]vu/?g1T@s03xhMsgwC|n);<}""$WF.DuſqC n$s⡺5)7rcj_`9(¶`Rvn00>zN'ndFC~}핝V8#6Pƫ9ʶ7py6-CsJ-CѫXڅTY҅S>К6=X@%{-n=RO|W荝N]м9<4ϖ~;J.y$vȖr}R;\dZ q9 o['sLω#=-_,D^MY+ȝ%m𥓐d& 4ѻ\4ZmbrkP#M\sBmv>%݇ Z-C] %y]YHC9*ݶz˧nyCjeܮ! (4-K'F!M(1-2GF^Y`1붆s~8˕4WTFvl]UyDE&# & 2.e8ZYK[bEVU_ryaֱE<,#lÜxKw߮a%6ltV o*0%\(XK o~Sн dJq[=`{֮w.uw'!M-E24c͌uXWtD El I7Y؂c3ㄢ|2RXzZЋK̘͛Y9TB3 :5䗁PT3mqEAXǫv6R׸%4'.'Kfl^Au4vO_=h@fӆ .6+.7Y dֻѪq.&t;}g7+PwKjWi>)ƺHT;'m{Yx(*v2wnҨ::BZeH>lpTE|=FzBYP ~UI5p 'aO?E[< K22)wox\~c3⿶=) ƪ`{j*nE~RFF7  SLCtyj$vͻĸܪ!=x`~} R"o^ACMScBU`њ2Y'hi>h N* 3'8L0?JUھȏ]s2_Ul/&7tBEVr ݼXT\NG i;:uqaHK&IGGd~-v~ˁ=/; #;,HtX*CVʏcKCѦŠvYwt]ӱJ(.ԖHkצ7w*`8]⚁sg)/&n31>BJ|<+D<Zp=å"\7퉲.֫܁Rff"cG*pv癞[Qi"SS96*Ep &Sp]nvF 9N(("u5365m$Dv `3] Fr3q9P0\]2GH`FʋxoN L4WVxoA6|Fڛ~4]۽ѝѶxs'RGď570RYc.e^tF9> tFtH0P^.r*ⴡCE˥VnqǓq1uK3&?$=1؝8qop2,OJ:~>w ]>t#䷅g軓L-O4@6 P.D߼ %G }Tᢏ޷08UֶET )o%NvO-~p5}!-1}f cc|%dRotHODŽn Ii,#&-/>[ܚ 495`Xls E)s鑂 u՜K5|d^*ީ.ez% %fnvƵ9ΥSؒF,IA[0f՛V#&笛@NPrʵ""V?o=Fm^ {Eyhbxo}xG2,;)->ebQL`ŹH87_8U}uϥ@ J{xHx{u8Dn/!W l#}&$ _hnۯ[>M:s` ?6 J^Zaw#|!$~ʾW]i^c 4N:Ncvdsg} ;j"X<}p*?&롙CZ9ν 3#6MNiKW59Hg (ͬ;Km MV;WˡxPToo!MMplxMX5JK ,GS,nFUN Oؠ=q0GŻ߿6r^r]PKxDۄ"% x}̧sCbImՎ ᫇@niF|b-Zw7 D *1&Ux>իgCk+\I̳*2r= !IY{M)/<2E+s[5r!9R{88%\hQ>!Pt<4 a ˸R+lى=R'kS&GJ=+t´6$zS sֹͫՍG"BsD (۱GA!tPҬw5ggѿt^5C}MT Heh%7vW&οf{_yzS`]17.RΈVrgL|.uUR,(^ K EE`u!C@ ,(1Û/&WuΌwpږS)iic8:] ҠFrcy Hw4=[B }}IǮ9Vm5#{εʮ NĶXn<\OƄ-m r f˽!?gd>o-PNZl~5gq5A@yIu{Yu?dPSڂ'>t_hQP>CPLx<6Ė޳ڕVf?0)" 8V@Z>K !ВyH_z?Bu"""@y<$@<F:Z%jE`~ c,srr×Y,CuB@Xr+'٬1==}```t)J&&&vvv_ U_>y ۙQjCҞJN{N SkǺӎZX8s)*" ^mP{jMҮ N=S6+ݵaigE`u ^*qڱqEiX$)T<"]Q>3\QkeHGql3G\ .Y9u'ӎZkS6R%6"%6 Y0I}5lxsL*<{NÒ6u =0#VBzgkW:,lP͔4x|e/(c\zRFOY|b\Jh@|nhhF{h}Pf /_LP/ o)֝ \i}BI HPet(2򕣷EZcIŋhǍ fWiXM{o>?SUmf6ؽ~%0<4 %6{t&Y>{k{-n+~6ob\s֪}9]u8\;*^:OɽĊ*/X`\ `6n1ZpK"E+vBRVa;.=xeNMX. 1<̍#?j\g`zZƘsBx{2y/X cc˱{R)`rw 4qL l>7krA-gf'd'{j֥֚Ih8.i_Ѷ!ycZ$S&#ǪNAxuh?=wSzÉP@^hPcfWeKn:H&ą{$_0Z. hU]qk0ѭkّ/t^_sGWNs.o¿!B?yZD5c-)Zj5bF= { 1ΫLЉJ ?NcB€ +Km{91AJRc;ք-ы;_5Os'tQ7w ҵ!;Pܵzd{vs$YnvpR\+k{T)])E;jz:5jÄ7n jMj/f@로d9|IOY|}6V'LS/L؀W[@B1966`.\k&` ̲z<@P\5pӎ8-.Xd뉊(hIH:"Ν]ܳg#n[턨I*|dBLVέzusͱjQՑ-aL^d-ѧk.:ZиÑ(ӱS7Aq}M)eB@=؅wQ@*9{<CU5{pFbi59<{= q&r{zJru_PdT)]u> 7^[w* b"z撯\{ /cOe|PzhrpkJtH56{=@5_yv8*åIڽRI]r0 5MJrÁz1IUO!7Iy"HTHG^8" u+kAb 6Y)j7kC$IN>2t~oY#A]p`O(5"egrl'|Jfk3-Fƨ`OQ4&XP^(X%q,%X`N4^*ٞ6:QvlM}cFww }>p7mML<#mτN%43LXpKw`"NWV#^k38LM۲uPS5p8i?ָVrXIIT4spϩЅ3&i8?zh{)϶ƷIM[/)6%(JdNޛ{!(Gquܗ*R^5<1{z)|R2>e\>rkPU8T3:$z17n^9pg(iS|C**;PdD;uui /ŏzC"qYFYzgR/&k.r֤:{ )WDbچ~Wl4+!}a 49㋊3:<~(*1*6]j\69<4cUeX`| 6f,~,G5 / !CB/aƿYPݦK\gfz(ghn<ny_Ȑ9<;^~6U Pk)+ٿV>b&%!7ɠEI_&E;k %+Ed`]oÆޟ bqK8(W]tUɯP%ySz} 2xkD˧w]j+> eV Gd">otL˄ %"D"I8u@ <}0k׮vկRX iA9O%$NZۊjTu[73kaRtǮM!Μ6]kcMH;N#{nQҘ@ Y;&T]@MC+Ɂ $̑Y}Dk@tSĒZF˫ǣ^i?gݏKkO"Wݔl"uٓ}N M=ذTIͮk4/t݄yaօ" |j #du6, 'c҂n6ҘtѾ=U 5o"fO+,2BVTPGRaݩrA`#k@\vù|SC$~Q !&Iۏtsu؆ @$\*ki8t^Ez<\- 9+Dni0,#P6E|=9@іm?hu~9~S^%.$qll)#\T4OVos✉!:] ZOJy(I} ^>fW-Hcȥuc"SP1v%{0^nieݯRl_W\x< oޜxr'Sһ}|&*## \.7%%EZ!C&8A/Mj-Z oրoݨ=q&V@,{ɅL@)u4Рo0盧J!t*- 9t M;N3!uM"OZG3)]ƙMݤ1pΑX䴝 |6)JqGLO!EY cOmA ekS~/Eõ{ R8&ʴݗ=M\ڣ=L{N9]; ,IVGIs l&XL2%OO~\R> ˋr ω[MMs#ለs݃ZU<4_PټpL*5.$t O=!Es)d)͈Bq^Wפ;u\l`;VzŋW@ee]Sqr̟JRcnؿ!.m@@LYY!ʳ!bEBV\̏񭭭@_!..]0E|Ǹmrrq 8tț9' 'Z@]`=WW˓ϟ> O`S+44ԩ DZ~xx]C@Xz q9IeRU bs' $(p*---^ozuT'.w؈KI@5,,k~> @<'IWf###&p?3((( e_o'rz+,C~uA@7=WNJ1Z7 x蓦w#7pCosu"""Xuqω CkB>z蝗/'+C>Ux٠MB@XAC`@>7O˧A _n4 EEC`<4۞fƫ[NTgЛXg'w٠ F@XA>&9D2 a $Pc F.Ob%<Ȇ+^MIQ63&õ|.jd#l6On,o)C+8QW((n’xH0Q<\>Мzx]z)lrV݁]7 6w+춬Sv#(M{gjwёT.tLbZR7tڞ}laÍin byZ%崣Rb)+?^{pFP咖rۜN}>Wc wTIὢ!~vΪVf8~!QS!"J  Ywl|\I /zb63-OVϧ=a4ڕIoOŽbNrmjpKTFN!lʻky"i9F`ƨk6{!ϲ+YǍL2JōK4Q[')M#їzyn17'?>(ih178;&%%xY$_|,'z_m^3hiֳDmr<x;o*55iZyʍGEOuryE<阒ڇLH7=M(BQyH7Y7fwoGȞ $DXK~ s8LxIyD?Թ)qRM?մwpӟ.c5r=K6='Zޏ:NHaɏצ?L3TH 0o)}1P`LVxb ǪyaNӆI 'FИhzoD$4- Сr1CM[ˠۼks)r@8C!?KqQH۽S"b(g0_' XpF/gQ+'C`:+w-!]u>&xz6v/D;\)ϐVqsC= aIٶet,S'FX*_oXHw9㺭0쭑Lvm8CrW͎jBjw%{dZ { ni1`2೵zBFuiB3M?Z oٲWAxcFhwxe^6t!#a&ds.o¿tlI PЬN=>RocxJ tEa]X_ hфfP|FgK}PɖrO^o  B?@y. zzH/1L:h9j{d%}3C@ӇoۀꞺRZ񁃩%C {bfKE>/#b>Lx>uXtƇv&fF~iN^v"KD 3~/3N ,y5[Lw@E>_€VrUW4n>D K q>kD8O5-y{ްn Ԭ>]xErR!4,_ZD5AC- C\ hVNNoZ0#?o >fakβY=~>MyM1"JL1C&!ctGo:r#u uT ݏwU}lnEepDgcn{)SO+N kOwT?~X2s85^#Iܝ:hy1XlrwѤ_%C٥h Yh/"SѦGxhc#x'CU?Ds ]w}/Ek}A ~]zڣ_F.LX[*YJ*R;ח)5"#7V~<;҆ahgTPOL͔F\MǾ&\$.Imc[%Bds?Clb%"ri(IC>G mWs.VF,Ӟ5 rz,5-'jL~ě*][.. uQ1!G' (OcQ;SgtfYO0&6fFhFfmX,PG&F)Gu̦{qZMv/cbeei&4 L_ɹ2(5/ik+ ÆAo&fui-vV5;  Oďec d@$eYL]kP]V1S17ݐk\jjuGJY3<~z umJN7<DzjMP#ȑ)MT@:`sXh3 C%E'.blLlHg 2Yu #ͧ 5+:"~4G 6esӖx[vsh4?7HɑfƙN:Q'ƞoMO<ZhӜXIuЁxO{6+ Y6;wwV[ȓ@۝C89r&2_˙;(NZϧv: L& `ΤKeTzfzrfs~]f)5q*AcL}P_,[(xҰk_n_17Iqtɓm6lY[ߡMȓC=Awp@hs I26/2?)K=dzZD2qO;|HQG"JU^ ^eR/!}ĕ!T"}:<olb!xhKQP>?P<4\C{""VPBy譃5@@@x<)N*dۓ4@bN8X`-<4ZNFзBm[ܸ@с,Sofs}b^s*NN88ĄWL\RЗtLu.x{?S.Q[3/m*fJG?[U:SDȘ4li+F85y|(}ďeՏOIОTFK;KK6C-Yɢ;b ΑR:SK띄(J!_J|}=4L@8x-?DKƵ{gg蛀^*8ߴᇆN^u)G9|$6${ÍV;zÍg9^ɍ8e9[v#3T:_/ ʻ=C3ϱgLyuI]*<18-E]4v%ĹAL"8gWB|O$\(aY&,nʕ>jM=IlJ}t20shК"v֞'o,wWTԢF5a@#zPh59~e>V*9Jqg9υD+1/EޖT@⦓,U:W@T~Ǣr;N=0C?S]N(E܇ujg9EV9XOU'& ^ Ie2 D;n~+[ŃVI-hX}ld](\zDp!E7Qd_ _+*'^mp^ Т%S)RUǠ63EmpuR$WA6lD3`zj`]4 >з5gGOYƛ|°xLΈ{!!Vxyz2)rP&e6 +`ft܃:*0+tRme1! jc<ҋ+S ̐'/JCD{Xgt~Ī;{3s犱fR6/'nyc^! PkK8 >J+C:s]@#:1 J ;ǷI^Xl̗J76=1%n3mq{=΄V$LN=?TsalkjrjsSyd[Ĥ6zgҎNז; P3vټʼPQ{4tp$| dΥj }ߞƤIp>IRfFϑ.0)R`9Q:? 3z{#sfuCmlH΍TZ?Wœ-+PFD<ht(9aV5!D5=P\.hѸHAp @#mہɂ,ݣ@ ՐjoM\.`=PJKjZ8Dn{ ls"qw}"jrz+h-&'w_bQ[m&u;ҥEX oYhu(%xlkұX! Pm4sh)=D\*S"wYwsuƿz7-pEҩ_kw]Ǯ)$>E! FH[[ݠO>겻^m=dxts8]Zic۞.54C .x AUzDᔳdb|BM8&tјT26ƙa0+?l=;BiC8?:|CJ֩F!^tdZwVˁSwd{Qiů:pdȅZߕv?sxgO5v')a7=Đi׍cO><W;݌1ۯ[Zl1ƾ U_b1xorɤ0 .i6i4㦀r#(zt\j@$k1}YA@ktzM^mii˘t'es @sp I|!D:W@)cr~T]r :=s,a$4W).hm\.אR3r9}9#"4LTKN gD*iNMۙ4qsh%/ C堤p.¥U:G6'haբztgƩ7ITXȏ]KfZpJ;3msܨvSSKzRG`qQ!ӜrC8}naq74`GZΎi=.R6E-t ^sG?G[bZhܻ^-2N{uն%ye"'D%c`73!cm2E.yj?ln3iKig9E')ĸ%QeǎO\|9. :YR\+T cWwg1ӊ䀤!"" DHza1B-fJxÞ[I d8SӮ4ȏv']19d2`V7E$fHƍ9}aP@+ o~Bh.Nx`J ؟9ʹbYoG-ؑhtyf]O/pk&?dHNĂs2} <4s!:( !ySd҆fW2C7ȧΊKgŹ8DyH)4 !/so,x3;鷗bQ+o_`}ϱCk_۶Ƹc Ѝ $?aYad% W࿁N6MőuWsOkȳ,MvZUɄtXҎyD# [9"ҭOZ#L5!Pa `jť%sXoLObvV ;yXwںN]!.$F4Tdy=dHO2=zTml}#=#2dzy+[Ku"""X[m#[zpW3Ɋ9<4mHhEEE`X'.{yGrs! ľ^PZыA@X.[ٙ<۬|y<:|+΁:|EN@S,$!UXț>s>hyr NЧ~O0 v9ADhir2xOu}/E3*k =B֮]7?sQQq9o?[=ٗ7/\8qxz?]ԌaDy+Sy7zHT$_pה-Q৤Ճ\fry >6d~A=V'Φ%ֿ} g\n;xx+W1ΰFnB2PBa%-5ۂT[!049]n;kw7뫈)΅Lյ#d<19!Q͖i.՛ Bsw:]wa-ꞛ.[+7mH`2=\@Ej9U+|>{>KW!OX.(sΫp5n )֯ȸgZ_%i{wM"s60ćFx92n;}e'Yxxy!C -؏o4 GnhŹᡆJH%o~ї֎J+0[`C Mr6Seݍ5?K˶7 ou{)CO]",!^Yaٗj@L^/alVEZh&I/ֺ&'[ʿ6v7Ajr ?BX@qzu;nk/$=ƾ&:ӭ@2/GN@rνMn} @{m@]Ys rwӔ_@qnOGiQA&kl ^:޸ozzRXU:`8b}釬qsS#|ô +G:h'[ p~ J j!Ik?~~U1 JRn:| @> psu3ޗ9uPjm!dC!>I1qXzATұ;i|8KȀR̴?ºV}?c_܀:`,O;eo+᝷+R7#?a+U_*%6{R_/)&~GBXO˕wUDvc]7NX:1t5#OuQYOg}/fY<~9=?zֻ$7rm_Nsbqw)UI>K~J\e-xM, 3''m0$_C4&W7f=\R,WZT ?]QK5l9<4W_N n?s pI*.Kj\WO ya6Ź}{y. Ӻֶ0h3;sxZ_&+=(\X;-|IC< F| T 8 O dG{*fu #]†]G.. 5bt9N=U9p ϖE2Ąѧ7޲ɠV1俭tJ~Ƃsź!<8yѾϬo\k_BrwoQP&%b~ђ7v2ἇ"%P\i%gft( n\msP!z}Gs׀Ԓ;K7E2@/@u %J ?~(.9ўu;\e$SJPjv;\6|uaI˯ZYKǮ50~sOCa%ZCC Dy\O2Xq&XR)dvƻVȨ52?_{A9#oO9=,=͉5o]{R ~RܛfMhE50}H] H),1šFgC4'aiU:*/wU$P0'R c)^W.@DN=G(;rHgB1:K5h!hT Z!?TQө2!&(sЫ˂J\*.hi\!TRRiŹWrR#xTս; EJSlBt1,p_gTs )e5A'QL!ou>偯(mN݀r]W'.z ^yv#ǛJ^m8lwa?`EJul!RiaF#-#B_.J']89A yR}0VFOl6Km15jHxL O;Am\KYD.+OBjQs$N261::A7bG#RKٶ!G%N|Kx*A@ P*ԤCL -RG>hy4J{B^:;%NCǩ[Wo Oh,+lF6,QEyӫj 9(lgPQؾ^~WH,<E8qf n| ?>f8;mc)]骾Nx8:зt/O|7.}r<!T7?ZN7DBт.ϔP0&>iU^SW"mP%Rse=-PNS&Ś2I+XeiBΐ#}RQ;RV[;2<7Ti|t#J &C SQ}V@ 0h:PPP^C`+&`KZ3}n6m=^(((ss{2Dy]h(( e=r'>ڷFZ1 C+M" _ lXp;ZAzA@)Bp$U"""Ο?ֆ'uE@x|n<\O$95gffY8Q((ύƢjCjV_b0`V EEC#Pdd$K[DyCs>UgC .s``h5 N7](ċ-/琈T钋*ׇ*"Ц|h>C rUgC!!!CCC|܋3rh7K #k"{lʟT?`3ct3Oڞ[p, /2=`-J=nd8吨 B)RYsK!QI?nC:u j]z$e \{FܪqLrF_ۯ~ $1o.ǨS3YRF:z0IuVDW+7v ?z>dk^lCoJbq)=50&=S" m@[w n J|b)lJMI+>WOƁi輶ml#aKUVՐ95m ysd?7?wnr oj:C̞t-|QJyPijйOҩ".[ :E@rg>EyО^C{$*//_I\NJ$Y)wje9p@kvtΜQ,1,4rkzSqgQG~zp6'KדWW] žنOCuEo bb1.Ң+яpiAo(OFͶNy~@2BB!6(Y mxh>g?m|`BHrVp[b%rUZTڈ!9yo˙3Պ Vu\[R!5jn蟃Y}KI(^{RοT;A[rQ Bҁxq;V2֙zrV'C !gCDoU#𩮇#6! ޽ :l/_fee9P!!hS F DrGPÂrHOcKiURt;_ N'v2jnB;x'.Czѱe SGSzk}:)ꚜ)/O⁙Fm^ryg<Úx*fQWf,lC>} QTl9y /X롁ČQQezT]ݡf(+xh _c̕xFcWk$sA٧n%:]`ts.3'gq$8o^pEr1>q)hioz1> Ep>2]s9O0;RK/L# PVGE=#S:"̏&LwszH.llJg@yh'!|> $=Μ' o:(_ʚi Aogn:y9 }-V`U\tP(!xh%ٻBf6Rzxh\ 5S>J'PMM-;]#fQ͇ؠ !6EC r ҟ f?dzm1$:PP0VzHY{[.?vuE@,m=Z9WEV1$:PP0C@,[|ĪAۄB>Jȏ{H)w %S9ႂznimV2Qө] eN_8irRmH7ش6-76O1L!;I#4Fp4*ͳǝ@K2г/^Z7%oYizS^ӎ[$F kI_"?0^-WbI)ݮ!eF|M}B/XR,Õ5,Jpv3W_ 65vA; K.Z5>yqFhs|!gzX m$+ŶIUS:ܳ=0Œ<_c{ th)C`dGi~[ګoZۏeO_ѺiOgh-<4.q.]sC9srrBI)G rVG39l=4K_N~֗39wbϱ : AgJf Cꔭ[!dzc Md"|\RK]@N6Ye_n(9orĈrx210ZOnbf 0qJ!-4ZzzCý%g͐d~o~n'THO4BmxP|`,~a}eFh*8t/&!HO<*qT6:|޽З`6A@x7C_OK%+T7{s5/%J"N91+M1=OO:qh˭^^֗t~doc0ɸ/.g@$k R050oV s3P,Tog[SF[BSfvХ*^XCמu!ܜ$6 IY0YϮfBU\w * dr. *+6Yaq`;GoA`y*ZoѦڪ;Vyϋ[:XFLkZ'?|߅ȽI}i:f|LC+Nx׿RrXVz_Kr֗sq9SsS9D`IjEx(Ÿ&$CnXKvÇQOAOXmYO"#6[!ioPJrЗDO+}//!}05_t0E,|F(C#yap -Ca)țj" N! ~XXs7#9>y~ȸ" օH]Pk]SsBF,v֟`~D孇ƻ6T`x(QFrgr /lbF [&Br:f\t""kDՎO0N $mӺ> O2LF]?o|ͳR [NLLJx69鞱!UMͻqLAR!: .WDZGBZ}0 P6CJRIF&$ 8ۨq~2>tлYgcfPdjɾ瞳' }j!{6e6ӸN'un䤂XptK >#jbE4G =(͎M?DllI&]ʸ.&&Ƶ>׽rnТPh=g|BB+H=.1D@sMsrN#\wy,|˦7koH_. 㕾.CP $am&b?0+Xt? 3o[ҚK *9H+/t艳wu?Ѡ[Md $2qw!.RԶъd80ĽG 3lmN@<dY؞G'/[4T{$唤L]0'#6- fQlS{FxXCS6VS6|xVH"l6LI"| ZՆS燀܃0|=*_bRIE P/|]}os]iY~Bqb@{""Q@ysCe裕C -XU Cb@""Q@<>hEϪWm?Q. R'EK= Z#򐞜CUryHg ( m #x%9Њz!B` =z_jڵ?)M$.U&xЄ"""""@yV""""((EEEEc"DEEEE!t |:C`C}J@Brbtt!t0|JУU|̄иܗ< о|4fqh\}h(((_2384.%(((84.>/( ' A}c;DGB$缙o-BAΫs|}}hB@@@@ꫯ֠ EEEEEc 82/zIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/simple_dialog.png0000666000000000000000000013461400000000000017630 0ustar00PNG  IHDR`zDizSIDATx `E¶+;$GW/Q9 9DqEEQPjk=vu]6Ñ$3TLdf0 ϷVzꮮ0HNNBGNN R{guVdd`w: !d*++[~޽{5M rС'O*))wj !D```HHH۶m?M6 %HwKҟN$!7"##GZ9ql4*B!ࢢ3p@PUUzid29,4p˖-IIIMU]/ig.  4L5k] 2["1MI̵m_gϞuNu0 66600P tݿ}}R!KMTWW{aHH֭[uքw"a1EY:2(d0Vڱ6 h2+Aʕ/|D!X/۷.e$ƍ?~|ddԘ&ٲ<((Hy+VB99xt<#""ۺt҄8D0I jfCT K a 0KU_RC`TY_"Qץ gΜyyFFهpcG AJjY#ϙp9Λwyꭲ:b !:e_nv)Hi`Ç_qRott]~{ֹS#>666t ^}UiP B!!//Oćo֩S'Ho+Ɋ  ȫ˿Ulali?k6BvgQNJJ۔g'}Y9_ۗhsEѻ-g^z@~lh!U/=RZZmڴ͍s7pW_qɅGfK*pTtx9*СC믿j?92)7Av7 c5}k?L]'t={X!>bCmD{o[d?sB}?~ Jog}vEu3c9X8{*"AR"Q O>~eQ5RR( o!u-/lJ?C|Mhhh?كɏW5NGn#OɟCa*ozO#WoW,aw_o x{•YIc&?o=_2̰OF'vm Wg[R㺥o!k%=59|ZwdȮ&-js$3wBi<؇]teͲ_=n8WIIIڑn,hsiD1eʔzA+?jԨ Ȯ4_UUVTTtIzQv"=˥=nXibD Vuݵ1]Hou{_WMt܄%缱韕$W56kؗKXF-?%u dYx+߷՜ݰ善yDv8Ǻmz^/9honhfS7TȾoԎ1]歎T!s!CBHs!4tPi&mWH~:ÑMjW}w¦]V?;A^|RtW=Zm#%XQQ:7n|n*{j,k=غS_.^4z΂ۓn|`pS\^:驟Dۄ3j3_XxgwV|yw¥sSr{=]gL:Vrc$S^?qsit)%?PXX8j(m_~:\pB鶵kjP"WHLNieZ'oj2noʭ8N.cmm9sմjUq0.aƃe>D1q1Pv5'ûD(]C,딅X/9oo]TuKµMԐp_˯Ֆ"aNe K2-9&#Z/ZVoXxͣbKǞ7kJp$\TːfxBٳGg9;&))iDC$[g]gbm;3=yKXAɫOZ0&OR RdDޗ$S /PsH}&d)'&#DP#6j)(@}:;Wv/[fͪn/9!;5>a̯8QaJxKH!iӦĞ={~G&dmK64ocX^|`܆2e>h ٦}|A:]vY -[L&(++;vl||ݤ1 ѦM5kDFF6a$^8jv؊9:c@˳I92:GJn~wW"Q\~|wɄBZ%!!!gqN yyy6l@6U$tyh0DݽTW&{ dl1?:˲gfOQO[o&0Xn`***\u͎DDDmk7I$2oizbΜ9L&BZW]uI!8R'.],\P I"BLTT?_/HB)̹KAB!PB$!I!@AB!:PB$!I!@AB!:PB [nN|X&wM0;;;!!$ӖV/e˖]yRfMtoy7k+JK*ڴ ?UwGizAfff>ޛ֬' !~t G(HBߡ ]BA w(HP~$ 2o;jkD eW@Azʕ+ZԩJjJLL*}5fw-z<(@kͯ|\v jkM2`Y O>ܗܼyϿU~N7xQh2 CvO? )鮻 [ 9 k}., 08, A!GKLŶA`k 7hPWͻMdWYӠ srrkjj"##{Ոfؾl6GV2s}P R9oݺu#GԖZX[s}҄N2w4do44С56mԘIrgX\B~^# /£#Fu{[oUW^yeĉ>Ĺyܞޫב7$&V%$ȋ944TǫvNIعsףZԷrOA*62@ I)Kٛ  *../1F*OYVV6nyӧMj۶YFRT7nڵɊVP``AakǮ2F(1%" Kjkͽ{vq6 躑gĶ ٴMխoXƍ*¯1宠N'Y9tDנQ+V+GDI.!_.O?-\5fLp޲% l~OfsQǎb '%S 7Z)M)Z R˫wtsysAξlFYgGFN>]tYF[ni׮Tcdcرc[lƟiG~#supHAzR6 gΜU~cv'<͋V=9x.Ї8fd˥nйdC/l6˰| <ĉ}K%3G2iS򥦦x~~AA)AȺl۶mFn))//]֚ߗؽ`˥ݻw'"» ݃5{~׮昨Ѓ۽pѢEٝ@7= > R^`Bg0*-4P̏>P>|7e,'''))cǎoݻ=z1҄zU7[i<&\yFa ָ$ґKXߡ/r<ҍ e[;gаmO0՚]Fy{NʣSs1cFk~/pvgxss?MXz" @z뭷pΜ9n~\wnk2LfԚy^mŊ\{maa{_S jcyyX^(,,5y]tkv%xAJAv!,,cU֗,nݻHSJAA O t|T[c6՘jjCTywGԍgʎ5V O|v13Oq5{R$lnUVU6~;f̘=zx;~ۚ߾}8 R/U?ֿO{m .sP=F19Р>S"L5';sΕ{}hWUUE]$%vPC6dEwߑrb O-O^onApCL 55/U]UU]Ui_X ܳVȂ&}v 2 *_rt6}lU(/߸$zoUTT]sQ?ov0`ld:ќ4.6o|}葔-y_A$$%%Ε꥗,.V7'N93$Ć?JGD;] bfRR7Z7,jڟbcc5m.˗~O>tM^v}\i֥{"*,yv}KᗹZAΜ>_;zxRR͌{Cdd>lؠ UW,ZgrrrKueeyE6G7տ=\r7k7\svCs l"cؘؘcG#&ۆ //4Jq5;AcFΡ'|m:~SnrlEBЁoGI=䙣LYoŷ\z}5jTvt#G6n8boUSվF5k#C;tXm5k*|R7^y%# ~|e.vwsUk]M[j:$ĻI$9s\(KײeƏ.Z.!!.dn.֚ŋVNVN~Y=*C5,ۼEݵsG z]:wHŗZڳn6+v"k$H{^֦GyR [CQY^, hݻNd ܕ<(a}: K-v NCɆ:v5P9vSb]w-[i/>܇!sWҭP9Y@!ΜvL޻O<-3Q繛d+L&NCA&7LAB ]BA0H;6! %i&cIG:۱vGiմzA.]T'&&i-,,G;wfM<7?.,kvXu}DMuԛf%r>*K$\lG׺RoLȒkv6extfus c׶/HUB NHÿXk*jGUuaEhLUݝ.d}i ~pHnnJW6d8$YRUn5 q)qeC _aWIwdEEEkS SsJNΐz^,T6j|A9S*Q{|sIrnZ JEEE A6a+ӂӳ|߱%/)i ъ5WAdTM%yoH^皯y* r„ _}-i&A&&&s㚰划VucJ떖U/?MHK֭D >%o)%#89=/;AߢuM#g>e勉PGjђdjLNv+]XL퓑/3"[ Vl?_`5Pudq֚m>r>"++G|-k%LQKQ]8ߚl_anj:VK˰.Cd܏_}d- %ȣGɓO?TpIf)rRRsN}Mp^sRr2UBKKC w&2-Yc1)@O[-֬ĕS}4dq!$knZHϱƐ(Ϫu8XDnYSP9#9ےTiܴĴt> fJ/}5}uGAJ{z{kzH\ßԭ֯eԹŪb>[*J{U^r%*{aX۽{!ȺcK˾Ŧk>^"ήcug TNM.+,jEScHlhL $F}vḦcJ:7G* JPw!l!α5 Rw CPU| K}lN|[j2N[ O}SHq3Zi.NA'v} kk];b{~QY)wQIN:FD k{I}JU$ni6E<c0WLPܾ}dΜ9[o}=t.$}fM:۟Q(HÌvAe,%GiW=z=H놹Pס:)iCv ;*k !힚eU5=H֕r}.i8mpVBAZW:˓^Z6ծ=htD\RddPQw֌U\%fEO-/ ]m"Z.J7oƅ\s ASv }B7UW 2[qN3VL] K;X.%rWn\N\tReEKLβţV`ߑۺkϰRnOGE^.KfVݳ1dwY=ii=)IʺdfH7Xu5&͐N٤O{vfx|d vD\ w^{kKgA6ɓHX .W[XRm8geE׌M H4RUE}2"ࣄ5bXJK}A%m1ZʛG.#H¦OGAZY wTŨ-A:ёh W5emAرbo-QX z1iqgRq%Hg H<o ΃tn1=Q. pf uPէ+n [nnU`^޲ҠϮҨӤ-ʛeGz}lL [֛ҎXP֨nܮ[ 9i`HSrrVxgñ6rZp6HI{.8aHILqԌQo[7BxMgYmVjefÇ0FGKg v@Qe#Kf{S6rק F :-eKdi݌Z}e<)QO- MI9=Ɨ?>-_ZD(#44K#S{:/rjihNڎvY)jTΟ]Syr4iRmmmkZ$!qP?|r(**Ztilllk8L&lv IqI$!$D BAI с$P@AB(HBt !db]Nv$mJ!R3e:~]ׯjY1Cj,k U9}DVV+;9šmߓlYw2N B{),iȬ:Yv Σ5%9,'}_zTYteaDF[m]R)Y2tHʩ麺)^]9kYRwGdVNO '*%%:G35_fȊKLӍtt\n3埚kiRZ II7Ъ< 5 EYйXVG:/ѭe iʇR,'=\fD5R"8#~h-Tv_-@ZsSkx*Hm*B#e RY&x̅ <4rM.Ȭ4KrbȰaY @sll?PH;Wg}@`35[ʅEɪvBZdJZV6\)JQ}T'n: ,'#-+5S]YRXmlP8y Ϟ-޵<~>M.H[ae+GtcFE,.8ukjߧtJSdFJݍKQ_=+ц޸é7H-VZ[~@mTܨŋn/{z'M?HGi5us¢?R]wu{wPhSJFzaBZ:-_ipI3bLʒԜ;,H{9=TQ<*Lq+H@z{(ȖIs摕+RHݝw/)PѾh%"-1.˺$uW' e{J5ex^-St5jڜgupR xP-ΤCqP-  ّw>$! $!:P (HBI$!$D BAI с$PDӒ1~ !$Auegg߿d2;9M`СCjjȑ#]FAB(H<>`߾}Όh|l-o߾] IqIt;--mq$>|iJB积̤ !n |x㍯g _4%,E[?y)HB(HEO=AkIqItP\؀sa&òPytr=k(HB{(HK l65첗fDWǽ};>2Q}Ғ\GABCA _Рv1AmLT;.~E%+^ocg^-oZZ͉›$$:(A>[rp92ceLw_qvՇ Z?}xRzx§s)HB{(H,.Wghڒ򚲙K.oغY7O"n[;P<,B|$:(AƮ! ]\U7..xFş/זYwOgޥߕ|mE??坫 !.7nH~0eyVZbY!.vWZt4AjH³APD%'9؅nnn4d[seK2Qtm!EAA yF[Wѳerۜ_AB25z$EBA Y=hW')Wҟwݟ3 !- wZZCI=2&!Z-So)+>XIAB@A{./iizE\cQ7PDy׭[_噐 zF R:. 3!|`BZEE J,3!Q:V*,τ4Xh4VB) I!@AB!:PB$!I!@AB!:PB$!I!@AB!:PB$!I!@AB!:PB$!I!@AB!:Pd%f$gg';!F(HB|#'#%%#G`!KRvlMM}9$1PZR4 I իLU9T>M9}~ę눰>.YHˈ+.u\%ET}(HB|AYuQ?Xl#k]wra>$z;Zg15KgarFQBt 愫U-icAʮlQBt t~PM}o֭ fo *B$! s-waSoudFҊ OdjwBʛxIx%Ht՚hBXFGby + iEn"@Au\<$9=OFp|n1vFF"8AAҒ(HBI%{#(HBu!$Bt !(HB!D Bс$Bt !NAoN!VRSSTl(HB!vR ͛'Ж'&&jḸ8-\ZZwءNll>'tݳg.))Z8((H haѨM&L C kN j] wUwb-?hCj޽{cbbtUb[7Xi+-{jalK cEI5 nDP7J1z|y11~(0xq[Q۶mZ/dl|879. u@A )(HAZSA§ޒgPӲl9g]-çNAAa(H iTAYii"*=i: "4'$+$ mPAA*|$>uF=B Omom$$i )Ha+T83>^~X7Xs˓%;C_( ||1-Ȝ9s02|0^Kxmc^(Q,OQl(/B cD3`5-^{º X_`*nx^F!a;–fba`X b'ƑXW聒ÙeP<(`<)20tWTu)!./S 6h+L= `뮻EpJJ=z?K/Q*XǐQ6 _Lju'=>X`DZX~jk~̙yLjBqjLzP p\;x‘Y(Z,H8h+hVR8bՠwzLA6+?! i RAA k.ұsAʃprZGu;ZxԩZ51nEAby:az.z'k!C%*#/ ܯZ c}#f6mk8G 9rF aADgjf +w1q#>c0^x\81߰Ղj1^8^x0auV- [c؈‰"G1i,YYYZGTSod~:xN"Ջ?$Qyr:HNIi@>"$ itCAbΨ O*qX)H RAA A]nWPIVZȴ6&G4  TPAA:FxʜQP͉E4y<¾~rϮl%&nņzW0μ3x`-[vv~nBplac4rss0>x7nٳXq~ 'cqIAazϟqlk˖-scsK(3PBL#-<\UƊO:^8XgASB駟YV:iϼ`pB-'W,`݈-~ialhPذACx%bЄy >ddAA )(Hsz(Hጺ*9Yy뀂 RP6(Hn:r ?Ν;kٳgka=q@"(UVia|_z'Rk:%xcb\/3~a;gZU#?ڎvN11x(lUNejƉ@AL\`iLj'[r>>¼r-J O"8ӌLoxAaྰx\-^($|a+ӌF@,%F ZJ@x!`qmqΨf4: iqQ  @A Ro} RAAjbΨ{d뀂 RPzEA*<$>:uF u@A )(H  |92l8+׌AXnL53ȸ|A+V8\n;p~H$x5*{X? k l|r[\ՈNZDAa' GQb厵OhImbMuuӉc]/@X  ݃~kaӁufœp`EV0(=zha8Vx8hJ+Y<8ӏqDI`++}O] -6*üc陰@b+/:pܗY\5p:*\ 6h,?8[؂ (Xq R+Jx9lPAA AxC : i RAA -PAA*(H 82l8r~ljl/(|ގ?$w3fgqz>M'S@p718 ?>a|y=^(EWlba`9O0[(H 62"r5|'Vb8; 3!WkZgԎ()(H mP rFxNV: i 9=$>gT: i 9)HgN/Az¾rkg|n5pncX <ƃ`:]=c:c zUӃ ǿ`_'LЎ_FxDbfbKw595VJ -8 3[87$ 8;h"Fac]}, \@իWe]E3i+ZkӦM(rq"la޺8J + ccx09ZJpF8rq$IA:  9r$^kΨl)(H mP tFfd뀂 RP6(HcPUh))(H mPHA:sz ;޽[[gZAQu:%&*x (`a8ֳX1~D':^ƉFj[*0P>R?9p@-u#cO4 7V.XxR im1N,pL8N XOa p<JElPB:(Z\ ^(Eq_8^1`"#n:=))I c}uNu7ֹڹ RA%X#`@' EBa0=?' '`/.,05PxQf+:K cAZGx>xq9P6^#F2j^XVQ}vo$8 p=uWӓBNfi-V TPAA*<$Nz)˛fG4XdhA:$ iTx(H?Q#Ś]/=!9mM., :GSRRO?,5c\=k_ ;ƉxGWכ30Aɩ8)t,nErJgO0qTƃRxK X`p[\3' 4`KO60<^QrF0V8 ejV ,T>ï`eiƋ/X,X0N<(T,ؠb8ƃ2F~Q} 4 - T|AA Rx)HAAAA*?*(u@A Rx)HAAAA*ҽTS RPzKA R RF^Tچl8n:`]Jw~8]Mz |NPq@;۷ox;18Wp0#(6QҘÇXq5`F2V f>ήA`ӆ+`k+A<ٺؿ-q|?;8ON zUf7,T'NL.B0^,x~1m_~Fc[ohaf^<>]t,5ͤ3T3t3  :"whEWŝDN,5r.bb`Y~ђ* iU gCd %@V ?@  }qva@s K9(fY@319 K9(,j?iMiUC gC4πnfdR'ݿ51kmЦ`6whAk W`[_m2I2}T72Q3]˿[ Kjt08p V~1z8].wk/x̰u aIZ;E7bhlCdOyv𰜖 j<׹`?c*\ioIfOȕ dUYAdU9UHo%@rlȪEӪ @Ά@ K96d"-i,r64K/̿;xnSꪫZ[n h}sF/J_}edϛ;DqYx}ѭmI@-ynk/s1mˆI4?%N |o0rI߻;#G /^j6qFrp7=f”hs΃͹{@@\}0(֘{綶믿($c>FLݩ8BTszR~_@:3F'WLEu1  k\t:71pοsf~:I'wtY6sN8at>C79s}OKPjҴ^r%k rdUY@Ngڴk:7@ K9rsKM:EAΆ@ K9rsȪ+SJASTkkڥg}vkk]wD/lQo}I 0{ycPfŘh^/֮wGKUN7󰐴 278 @=$$򲗽ltbǃ>Vx7jvAHVpM1g < imTg2qS5qQ?&vtg֟ͤ5x`l1u}n P14 Ocp7zO? H#; ?`;A] W%G,M\ Ks9m&;T ]vaqՉyO})nQ٪Pm gC *,jiuQ%%@rld"i\V> %@rldU9+/amq^yȻ5cqHycg5C}ۃ=mØnۃ s& -"Dm_7+zC{ZZ0i &/ʝAĒI1Nnp=5^cpjp7SNi; mZ[cvU*^ׯom tMEoݺаhrQ@Lrn:J3gㅾ:?Ρ>eReR 1auAbꆺ@)T7 S&z  {.Qce+t.m71B5Я>f֐L1 Ht ,΃cwz}SU[6Lpx}Ma1Z W i32P@@V%kU Ң<Ӫ?\u~b Ȫcj@4ӪXq!aN@V%kU UOo 8}(n_<>ϔ6j|ΌSdMb/~m=k;C=sا뽦rո:>Kx}cyqDb‹CJ9 &hh`bJ;NZ/`hlqS6N@ ~ o e)f`hJ~1tX6ZC5$ڛ0`qnܔƄIL\st}jUr6@rl@ i@ A,6Z1 %ȪEcSu'rV4ȏ}ce?bB3huZ؃yiS{Y^qY 'c-An,06O?67}q泘++,' h2:p'zE40 p0ھj^Ǭ.`҇sbΥL~)4lN9o]:lBJo.[ ,5WJ@t'kK9q\_7C߳\/ \s`?J_ȕL ȉ @NgYHo%ȪEҊ}ӪS|6@rln@  Ȼᄏuꩧ9SVt1 ɱ%@Ve0;vjeuڲ吭EIFk {J(d2&L*1w`}m]4M 3&doFy3SԿ5ѿu,ΉdIy cr}m94! 45fu H';`,]䤙&ݫ ]^ӓ+U8{RFy\S{8.~jkWvrǬhBX?mƩzZ駟>O|gyfk?~iVqW͇l@@@ fs+) '6,5Ȫ5;SU?(YcȪEra4//Kjm.+ゐb}g%\2s=,L1n 0^x_HS_u,ʼ c>),͕0OySOP|<3V-Nd v v^hc攋e4Xql? XZ i0pLx1qɄ#!Εs55DuvwTι _kd֓asu-䕯|ekk{&px㍭mrV&N1+W   ȪȪEo/}կܼYvpw?RArd U3kvA ÀDd99_iuYe_AB7?罍};&xke}> GZ[U}>Knqs ,a~ rqGimlΈGQ:.i?z׫͕ ) [[Gx\\?Wyzm~% S&`쿛 ;T%l \'`sh&cԨseF- ^ ?WB'=F Ly+^&8:Ѯ_' @'*ӿh7l!3S@),uq@n۶q2F9p~[ؼs}{pMe֒J:c@rPYoȱ =c@rPYH@z뭥><@֯J) %{._-@o-L+cqꢋ.jxU>};h^ǜ~h c2@ ɱ$Xwn|k"[T=ʇUX)'hmwN&8@ ^&墘e058 N;$n?CBc 1 E~Jȹ|)<4<{}3ar] _^52XI?[ V& & Vu_8cZ۸`L4}j\cJLZ",ͭpa6@==ڤh<稣jmcGL4@# P]P+ݻ[R+KxM&h&&.ws'1F#P1Ec✘d!ڃ D^Y^bTztӑܺvb֨rM7?r~b́@ ܙ\Prլ(,Ȫ 7P K9+ K9(,j?yחj62ĺi~ [q@s K9( V0 V! x//L_ Y1y0 *+;wy/Q8Zm*9Paf,6Yd<7́|y߭ڵbʮ3̈́tN0t5BR.*b+i0ZswrEt]P3lMe[:Gy踜7S;&k k73]}6E+}ݣ73Yh碑uuו.|lO>*O0Z&x?\5 O}xրw#1(=``ܴ϶MґZxz~f9guVk0Y>=6&@d005*0wg&Dp̼1ZI<&ј⢻+zwfB뛁%Lq^>(׮nX쭣I:&I֮tj7U^S8*uw fp3iz_$}R%m?.@ K9(y@6U@2%8 K9(,j?yUW7e+V^:?L%@rPYWzX=uљL9 K9(,j?~7 wk6ANP}!?LK.ԧ|-_ ,UhP61D8>޴^Uo0Ob?qcm^BEjn^~}k{c7&g!c {+j/RI|k(~_u5* >@AMp™nkVG47ߌ_.0NjdI] ݤ:M~Yu-9?Ar_s/tk9ܣ 9 2 @EY כI: *Yj9 '@V%[j@~;)}̅6lTFf1ZXaĪ@ K9(@~.}]ve $lߴlRsOyN06J0/}ik{{M0y}" }~ʸo1\c>c.=d5<ml:ꨣZXl|n>s庴9ιmyvq^wj1,עw6_,Oԟܧ%P!`X @rl]@%@N7 2SYAdUY5o}[%Ye-@rl]@%Z7K_o{8<Ź9 <Yo ;}kdބo Ў0>Zۄ&/hmok689Be4u]-'Jxέōl\2 .hEbtw'."89f3@<}`YM1z&_׭ i2I:E/OXok܋w?ftk@ Y|ͭm?[[1p {xwG:}{8] cg2&f„6OeXz2>ˬ^TmePԇYA^67ݠl@EEt&9wEPqoAY8ݩh#8ߎ*j7tSkkΡme Mq#P+ZÄ czmCOmpX9ywnt 7y&a~?__K_~K@2{Y@VU K_R=yO gEYAd sH@nٲyRs@ jy@s K9( &/~,' y^['3f9C/0z6@HG3T?A=,>b?Ρcbk oC佾Ɂw}p\DOx衇F;)0dX`4n@^;Mb:b܅Ynnֶ2K^r\.F+Hh55{hRYiW)+^ǿ?~蜻{G;FB| _(}}+9 S(`@rl>@  +,[-VIg)7)5 K96d UduT2Z:n^WnKO K96d U3,%5 szkoC&t,o3~ykAி ɛ`bk>cRadz6ENxW\XP*b|9#^GO0Ɂ;̜2@BH[FM=N0,-'M4@ E7j)^# F ,zcŽ!9GPgq4s=9.wfVr3=B ؍rrgƍG?~]w]k}ѣ}ӖjѱV:s\`Ihd@V%NY ?ϖ><9+ K9vc g>ׇ?YcZ@ Ȫ @~ӟ.}]Y { Yk@hp~~2`΅ZeS}F[_5ipgXiyvs }^wm吏zjk#N x^wWIz']h`^P-&`BL1wo@ 5s<\ѹu}U5{}a);l9Wγk1;zիZMv|=nSNwڧvZk'?vdE.>nYY:+;+RYAd _$ _|,k! $aGy@rPYAt .}}- i^oGKHG+?:?@ K9("O}U]/j{qwOoKJd!p\>b^xa\ K㦶|PO޸{̭0ÜVhX# 5BE'FiL;c19o_eL2|65$%X4#evk?qq{(w.k`uEug9tGuô;:kt,70%kο;Bi>oanp[ۢv[m@Ɋq߅(3h![ߤJ+mSQkDq@@rl,d'?Y?^?N;wrb]&b!d 3,XȪOO/2OK;is_$oر$dUYȱU f'>rP~bNiErp1Z¸j[+٠,Dis7o|>C{ǚaAhL>-,7m \]wΡygO8vC |֖mnDlk pQN {;Bd ac㽪>H;I*cY:?.0СP̈́\ i5 k`n{ nJtFwowMqFiЭ:^䨣jWs`"t K9(,rz&Oy3SYAd ]$ 돨=`sl(,.5 @Ά@ K9("Y>@\-p`UW]UFMJ? 7|sk?ܹ=޸[IǢӗ86^[mu{]kumz׻Z[tgQsa̕12A7nښgP0Ecpl OKcPTA;>/Lwi^C9glX,Ur-\/;C@qm%4o7L:LwιcqG[om3T]k7رf7Amk;p-S-#@Ά&AdUYAdU92SYȱI 2p-GS-e@Ά@ K9(@za @~ _(o;@d,.=[֦M~{[xa1.b>`km .xaG?A⡇j]7:^7V9dΈqdBp팰ys.V1)xwB;iu 5 '7U RΉka⒉3Vdw: \9 :FkЀd-74K]ig)Wq ^ֱVЩi:%0=\Lqnz.NFe2Q;`s\ gE rBdUY@V-|%%[* Ȫ2sYAdUY@/}]q%MrӦMe~2~Y[v_Y>qVx;`>[CP}ۘ}~>{ב=nOou { 47Dc7и^wu| M&\8N#Y$;DIoH: Ѱ]_Wc?G($t z^!uױΡݠ8L=:F^N-v\U!PYAd U/~%%@rPYܼysk˖-%%@rPY@.2SYAdU91W5:=)}}K_*Jj L^wںIk&YtC9mWEXZo|ckկ歷d.ֶ.z>Xē@7,aU#OMٱcGkϾ_? }. LS YUG#tx!b9ik:Q#kiʝ"S [腓cr:FGۮ 'x 7;ם5:u ]uHY/rV4 2 @  HWZ@KYH@^~奯~% gEd %[*^UV`μ7nUp morܬ y3;gika #,*ﱤs op4ID@2p|ֶ\љgڂɹGǢ;oeǥ yw g[^Ƌcۄ|ND V4IE/zQk̢{V`0 <ãuKrxZH[CH8WsQ ~׾F͓6Ϳeݦ-ȓOz;xǥ4tC<[rV4 2 @ ǵ orV@rPYAd~o}k[V gEd %@V 򖷔_@7߹yuMiW @֐m҇vWBwo_?gyc& d䍃M餓NjmgY/XuCq,uq\͸];׽]Wtz~5^!lz7ݠn]>Oa`۝D*k1YWA^we1 /+bo&5:k+ $;.B:k+xMVg+<8ܹe-;˺;vr m;7jM+%@rPYJ_KڅoѰn+-d %@V /wbKQ@io6bB%@rPY|\+KA. '6,J@Ay /\m{^o߄^b*?eXvǎ~V.ݔלO[㣛 K0ѐ .e'@pr{ @}nk5l5 Cqiؽӿufb뜻γ /:7w V]tvAC[ Ԇk׬|ӛTw[ȥײ@Ud 6 V `N@V%j@z޴ri'uv?q Ȫc@V-H{V}: %@rPYȴrV4ȏ~e~>ߚ0&0{_Gi_mu!ooNx臂/|ak{?xk_tE}QG_sr`㠉?Ac ysch!'݌m 3z̛X(LN1  q BjStwk+#qH*3sNpt:_w>^(mÿ5@shqt Ԁ憯9luK.u5הrV4 2 @ i@3^5׼5%gEd 6,j|_]я~T rV4 /p npj(0&w}wk#Vab%\ySO=wPks7oSUjoߌJQ ݒx( M wew7f];0]ĞAݍx{:q]/*PMxݼsM"6A>9im;p׌~rV@rLd U+_׵^[YQY1%@V =5:Ȫ5W'%\Z9O|e~pWOhۋ_p7z衭mEy䑭mfs̕xZۜ s9#^\!g|?ΛqS7t/pĖS/r` v `vQ\tc0ຠI" `3,?\hڅzPt#"^5:jnPܱyv8vW^ȵ+mFλk/.}]wu%M| ȉ >U4k}Z_} gEd ',`K6رy~{@s K96dUY@Ngrn m;_sAGd BK NcwZث;Z ]^+?3[ۇm<m _cU, N7puགྷ| 7NAl-m\+-Y܄_w?F>k<.}v.E~k cz Hk\ 7:C@g?٣ߚ Vp~ |*O͊|͵Qy*Ms!^+"r@s K96dUY@nO`} ^N~<( 9%*, ;W}ģ]8ܲneTYAd UZQu@rPYAd~s-}?-M999%I:Z  ^ g?km.{Ok8pY@{l2 6;hDAM_w,]#ץY] 48Aݘw2ar4ZOw(ؼ[@,?˵|~ٹΏ靂bE!B#r3s^6\ cciƂ s9u-r[ᩎ<汌@Ud Yg}v[o-)0+ K9.d Y7n,}SoPYȱu K9(OYYKرA'%m8z vD'c-a0&Ψd2?;^#K[q,ιKOsӠDAh9/`kq .u'j0Pa4<'nެ@x{o5Ou!$`s(Y]vBE'rnMjrRy07XnK^ ]@g*+ >/x Zj6,tgpl(,ȪYgUJ9+ K9(,j?bӺK9+ K9(,*\X <Y&"W]}խmqDt RH1Ayap,8}n4 ]/oP;ctcAM |{@! BQ`(]C2hkw&e&Yy]in\\#{gx]O9+hlοm\{A m\;yk3(}q%M| ȪȪE/y髂# %@rl]ȪEO/}y睥3,* @rPY@VMN+}u]% oZs&Y~_ɫoZY5a\~3S@=y`^7X&׍ϡW~]o~@@;dށqD7p .&˨^F mn'紶dfB4'" ^۝\/Q`ZjI%w}wk{Ӱ5` yf?7)DwnDL1Qȹr>gAjyo6ȃ=kwn[=,yX$ ׯ__@.O 'g!ad %@N"yꩧKEr K9(,rz H=Sȥ3DҔ ȪyX$ >zCZXkj~+/olm\oocG1N 1۔~cm#8k2w\18b ӿ5R@C*d؉'Xfz0z`{'Zh0j`2k,Dْq .>L￿ :;$A#B^kNshmߣz"Go+o%zj(hc:i^\s@L@.YN@V%@V-'|r.\ړ[1W12 K9(Z$ O:W}R<  @  ;YlhE0s9,$j\R8+nbc`,+XĘhЉ y<)"4X|B&X$~皇b0~~ߏׄ)Ŝcq0kCMΖ -l(;줹Q-߀DК$(|4f R,?[L qcBs;9 ,8Ʊoذ7/ޝi8 :s<^mb{oc1|${Ѵz@Ί&AdUYAdU92SYAdU9uw1U+ %@N(  HV gC>nfs=[,_  s9k?WhkgqfCޅ3wGm.7X_5:I>Po@7XAPw{ĄdR1qs9q7f dg>_򗷶 AdhHw^kTe ׃Fi^k!{t>[MooڧoW/b裏rV@rln@  Hc{@Ί@mYAdU92SYȱUd5zxdrs]w]'ڜmܽ |Y^8s im<5IG?uwkUqIAeL TyHk~5ku2wNjC$ɷ&MpQ Vl7pk_dR@Ы̠acvC~飯[_UKL%\2Yl;\RpGh;r-PYinntpyv]k$ޚ_ԋV5r64 2 '0 ȪiOl(,Ȫ^PYAd U8 9%@NO.;LzbAΆ&e˖2T_1hͶm־&@?ט&h|U1V@zM}$@dr@m]n-7CٵIK4K?xUNLݾ}Mt@4Zyǁ; @ظ3aK96 Mhrn!i5<35<|=Nt;E]кq-w:7r79q#ƀl HU@ ƓiՁ@ ȅ sdY@rPYH@z补i7O~e~0Dy_?޻{ok[@ M0 S{ȃ1Ȝgϯ\#<⬳jm 0οj̵M21+.E1릛njmZoG" LUa8 _ܒ0=1( ~å}:LHbA_ 9VqMMICL Mnҡ7 94C@d!\QO@ 5@Ά@ K9(@CU=: %@rPY@.Oe~l袋Z۠|-qk+;$;L^}߶kоn|)M9ZxX<<>[ Bp6ƋF3w&bQ# mpsM6q ʶ{'8)Lm3X n,4Z {kZ=Ç'r Yk'|ooZD$wn5NsO2q#sm+ZcZl(,i-Wr6@rPYA H6 IjΆ@ K9("O>Do+W  +Z ܮy >=Ab >ʸW{2nGsM1Cutב s.aywygk4[w`J\cEu;aKcps7l҅hB}=f ^U &:7.ҩCu~ȅc3:Z0/qG5^[j@Ud \&N@Ά@1,r ǽU gCd @rP9}cӪ7%Mwnޱy-oI6Mڴںa>20Og}Kֺ¾ 0p6C8װoPRܼ ㈟3;hބIXοbٸ(#))قRPiHi״I'4:Xwo7xckr)eL6CʊΉP>Ư Eפ!5"MDWԡܡD7vhpdzm۶6WC2;f!jH'xbkkNYf䚉_z饭mjwڏ?*3h33wrV{" !;~%f9[2X#alִv%,{4/5 ?/V$ 7G%I Ȫy[VV5}>;[6@XOћwgSr@rPY@V-g<= WvYAdUY NuŨK.)}C1~' jxq| as綶'`̢M+՛bL7'|rk+ayֶ21}۾~m9=krLyvQ99.F5[Ȍ0?dBNUiL 1)~zlvJ<37 )xu"c*;9yuavamoBsaO, M2ƣrn>Z f`q\imIY1 ȪZ@1 VDQ̀ W C(VjQEѾ*\(}REQE#Z\q(5q3d39% ;s^k;s^kjZ~gkogkogkoV9{v:v:6ogkogkogkoVyЬ'Z?t}ܵr͙55؃kjksײ5gvkjkjkmkjkp+A35555ص65558ޕ2(F@FQEш((QEQE# (hDk 7߹yu;_eWmޱ훞i i놃%ޗ:U6&w1]5]wMD5=fFT6]ֶeݎW`9̿QnI;˫Vx-܏P1auv!ve~wx3`+TkZnU( WRm F*ǻ:K^euF5 ȹ ;r^(cj{0[&Rޓƻ?]U;55V q?c[7OȽ` j7U2~}uG5((Z((QEQE# (hDdEQ(<E[d0?Y$(: IMWGYFQt0@Fd=mw۲:p(gR?_mEѲ(q\;cf}\=EѲ(&AܲsڰSQ,(:`鷷Z^@.=F(ZVQtY퐿DeOhy@FB8ld=vׂ(ZNQEQ42(F@FQEш((QEQE# (hDdEQ((QEQ42(F@FQEш((QEQE# (hDdEQ((QEQ42(F@FQEш((QEQE# (hDdEQh?s;EQEY ((ȃݙ((ZAȃݍ((Zq<&[tIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/simple_window.png0000666000000000000000000022470700000000000017703 0ustar00PNG  IHDRuTsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5.4>viIDATx^ߛܛM$ H,Dh]=*v=vH;#`/8vRE &A>gvv}vvs3vv"2jiҤp8ā/L 4,zgWbp8P|;(?Xp k'ȏ}8('6mz#Ȕ٬YSQ/k 08;y3b" H9:KG8(g8y?P+Á2w}.8׿f.?wt`p8hRXSɁ}D;arvK"8@\xX  >͛s9מ_N-SLٶmi˖-&L8Scp.\¥UT2w@ e@/Z2y!洼ţotM8r;/p`41< &ӅKqY׫©=e.?w|_=֭[E_㯺Uo޼2v8(+ 8∿gp).zU8/PC;/ٝn|vwun=,'.8s hYh6\OR7i%˴#8K~u^}]ϥ,o>å˗cğp8PV0_y|R\WI_/9M%SʓVi?DRa|fnyNOݡk=\<[꾹V\H^>ߒ4lNvqϮ\WsQ-|Hh%\s.%sM8 0p ܙ2ӅKqY}ccO»t%/~V|]\tG<_Å^WТhKсhR\5٣:>|l۾j1.gҜS矆-ZH371b˾nq2[dGҍNi.npLd[#ǕU{xEiyFk+>sp74R]l |:9pa֭=p.\J&U?.)j{ST"5~&k֕/sd Q.,pVݟ>]㮾k QZSEk.wbZz6mIIr;._#yz;/gcdq#ntG:+n)ପJksUFUw\u=vNlj+W'W\9V+K<'8P 0~'ep)ۥۇRW¿){STkJ_@DgMnG'^w WDz[ \CZCi&Mv]/~𑋏>Q7%7I7Jyg%R1~q6G^)= )E#*_p W;)Ŧ87p`4<3[fp).^IQޛ3X=elp ʗ'ʹ;uTMFq3[fqK˓O>d.}4Fu޺tSG/=HMN',E-3&^;B&u;s"xבb6ʹKa:h/n=U_%s>7E%n %U+q| <9:K=;:Fa먣^,'>fُ_nvs56^lJycFg{_*ķ;XEޥDDwt6Ǯ09sNb8 FCJ-Id^RqwE܍|ٛ7]O3q|#[8,,k/gз3鳣xt9}/G/ݱ?2G$"Fw+GTE@Ӎ;Kr#S6eQTm^EN:ccE"t9HZoSMvLv8@8hxy-IVe^R\ֽJq7!doJܓU%g|#8Q'|@[ޢeܓiFKZ3;|Œn̸")PV[$ N`4lӦ qIWp).란M%f'E%G"IyoJ_(|=).^xiܾSN_;n<3H gӄp w ?32_uOp*q| <9:#_rR+| J8@i:hxL.e]S |9Á(_ 8FCn~.\}m=%@/3Y%p:C\:tR\up*q|#[8% p,p0ӅKcN%|VKeRpRv|#[8_#Y80{opp1W@/5 p2v|YTke?Gqp82(@=eW8QeNE_ p|W88S8Tt 9mi3Pp8P*}s#mKn5aP |!\q@ ;O!-7%K>;ŋ~Ւݳ) #rʕ߲֭eˮ۷m߹vί7ZfI͗WC)R!_ȇ+pqzp_z@|'koZo߾#ܹs׮]}oto۶)pƍDCgڴi| Wh;ܸsU6}vjL:eJ B>\3E2Oj́zroi-cd3r֭+;R|fe~ۅwF+:ZieՁ/gCgbea7Oόӓn S&3 .Ʌ/uu-3j˶-Zae|ib_simK3L{8.>rmga?Qt0>민 /zš: o_w|Y#F8ך6ܱ9s&Moɓ']al2Oj́_|1%負K!||eukyϗo~FZ;&~/[?͛3EҎ7nGŃƏ~YxEdw,KK/kʺ>xCY}i '{s-LFjΏMyarW?]LsƍtG/̓Θ1/ӧ}>@;7p z[#)YLs׳KN$ \\94wVQ//8ٗ6nܔ͔/ϟ/sҩSN2ߟ6mȑ>a/^'|3g,̝;䍼+/_9~ᴊsNٝJ˗Φ;_>o˶}G]gC/fϗ[t˖o}⍏ >d{7z-_˖}ύ/6… ?#|.2y #&pXbo^{1w%OٕE+Z__^s߈ _~/sWWVkfÅnie~+w-U_6\z.[ ((% @0/ELSKׯ_S?vׇ_|i˾}ٷ߫K̮%%o<3OAϠ>5kQƌa_~]n4!yJN2J2_h ^qs„ :pXw'Nx /kFK|y=Ϻ}X.|ٵkW(g/ӏۍA<Çp_ |nH˹ }}|y'NxlRp |6ki KSf}mY/_}UFXfJIǗs1eI6x79e3Bhgs2ZB+i_yagc̝+zg|)^qӼdkj^{u/Ȩ~snYnݎ ,>d]\/fT9@8L 6Q۩y .kJ4W^yE܅֬^5f3弍8iƗ4̮%g1}O߁6%)G /tU]Lګqfɉ0JrS87u2(🼑wq@}=͗^hzҫC=C %(>x|}|jϘ/ X:txwO8j4/cFzgqoͻ = *}`r )@C9A9۩S n1υ/6bSrԔ?[ec1k੫Ye˲%?%ZSLzWA|ԨSߝ=/5gO>EP! s$'/݀'vL9vhŗ3O߲w߸8sŧK_^;)Iw>>&xt }Gi 73vvݺ ^{5|#og~%K seT?r~1gy/kz3:Á9L 6aSY%̿^̔._ ĭzŰ}t3[ĴU&~=d'2.\(_E=0QzKn~9m<6_{;ǝ .y#HLiK^9"t{?[M|L-S[FK |yk=9=GSTqГo|='v|CdΗM\h9o׵ ۴93Zxkzy/9wZmwٜ9۶1o_f-  : u ._&"=Hrrί]r%.^۟MwΗRev/?dKW_} 1N;:*>s8l&_uv҅)3'y+'s9/Ւnˡ|c?w!-^4h!kYs%Dhɝ/y~^yj׮9ׇ|GKogF.5+.[lŲ/}Ͼ3vc\ _~g|h9UVr_xE<^~+=^{;w⋳q^x9Ud/yl_+Wle ?arϻ>4/ϧo߾L.btI=~yhy >/FޕyrcsƎU}uώ^?_L~;}O0Kƛ59w?hp\OK3Nj~7w?8ghf~lK)~g;Y<(w夸oٯ=#OG qFK~^wsa t |z+]ts;u=\wU=_j+8~Wg'i<7f?#>zθq|~֮^13ҝ붢O7YE@!8L 6R%y/}a}ari)f˽e SSL>Oӽ%pyr8e?v(2 ݅0bugʬoɽe <#f"\ep h  e?v(Ğ)i_u]<>)K"/sz8U8P/D@{9/y/xpQk.J`Fդݻ72KpX:,g$µ08(}*g8([D(eW9; 0PU9;i pT_3t|Y*E\p2@@U2*pRq|YHke<qp8 U˜F8Je9#=@Pu8@/$ TU/s~8(D_C9; 0PU9;i pT_3t 2sTl_HȌ/)\;(7mJe=pyr c,gT|[ _6Pm9,'.w 36ɉ3MTs>>ĥq9Yɼi_z@帎Mtt~0R,61ip C2Kxyu *X~y T[nd˗>KA+ {8P`dϗK:qvIH:3tnK)VF.>3hҫaqG/bh4t鸚j>> N_z@|)D_Ij@d͗1E`1 qFםFP2 Nag*jPDfh 种>[3Q_6Pm9(_Fc+. GZEEcQƤmC/GN)r̹>hn{Mo oA2ǧ%u(6.U&'->,7 Ɂ2KjaQG-&y""@}|颉h#K_vZL23fLIr&\2Oj́RrңIt)I29\J8:L>Vȗҕ)$UHY5Gḱ3Mr \o( /{"8eR/]ճ%Hot_g(9f&6ʻHL4v+aҶ/DȖ/cfm=;):I+ˑ-5"BY8, p|i(/# p^9e1~j8sLqEp Zu|8Hw/ulҤ8ѼyM nw|YN,_njY8)_GiR2;a_ ])VR.)"LpF?u\3q StI 2|KMg_1bpt>K\ ց\2f\FV_{y}R\PQ:,ʏ ' Bp Htz*'o碝$7q'>/[-5<`r4_pc<ပK+ЁrRqK=5/ԓwtGD8KbUnL?Gfvbp4?W\݁lntWP$/iqyp kY[ ǡ8@r3e1~j8s|Yz)2QK/G_΀pKt>K\I1;,O@/,H1l̹z衭[c=Bp_˃Y;а|i31p SY?Pd2# ew|YF0\j:lPqp8P/ p:,GN_lj:̔]_/|D*8%n8;,|Zf;8p|Q@9̔]_/I3.N@_>- 3u|'@xbu|e8>(p@X ]{ጋeq~n8k8i8xjj?yq#87rp߁ R1š"&2o\]xp@2q8P|/ރq5x⎗FӜMj' _ߓg\/sYÁ;/\ՉsiTxuِ4){ TQ/q8t8~@_~nĽ^f!>>->/̃8e8>(p"R7ޗttmWX)Ie3fLIi=֭[WVVÁq|Y0Nerzs22GARnyҽ Ozfx75A/ 1)Y%@d n~"/gthseZ"w#I׆0Sn%_X@q8`(s 0,se˂XpRp_E8Z0/ Sx88q| p_ / S9Bt|.h8,ħ Ω_g+v/K7@~__e\x98Rr|YJ&2A-: )@/u@; p`_ W/sY_;%\?+pD8w_E8Z0/D>(Dj e!>MpN>s\1s|.h8~# e~Epx_;%\R4q-p HrQm]f/| .8lC98P/K½0fѣG|w99,\C\W,_G yr|.oA-Ydq J*e2@3Q()%K|^`6mVZs]9,\+%Ŕ`qYp gʗ?&)Է=\"тtqs]|w}=pSL4i2i{LMƍ;v1F5sm۶8WU/sr8wyE@!2|ɭۜdFeԩK1Ԧ7uٶ֭U[׬Y\ H'8rs|Yn8:?dA/|pBi̥ 'ˉ;oˎ_rۨŹqpA_688(`ʗ |9oApdM^3@Y %y3Y,cƌ}-aM۷o7Η_Nn׮ܹsR\+A2/1b@9l0q`8P<_&͓r|[aG(fy)._N,8D]w-8W,N/q'8܁e5p'r"U9\G5g}5RKgJ xy=7`ˉ5\{﹥8W ˢpp_\tKӳbŊ#K/dɗW]u-Źe< pH8=C 8P˗Y:UNWѣ/_΍ݼ;4y@}|RW\o8W,_G yr X lr"ҸV/Gɗ3%+MpN>s\1s|_}2v8P/C#.R4q-p Hė:vL@  d2[Prve?p}8>'%߁<ӟjòFAP޽Ύ&9$W~PhqA'R";e $:]@r /!Az26i u"U]G&(oNZ*׫CS[bt덜ygK<@!8,O с|󥛼0" _RrhT)&UBYF¹EaVoIz ._T~/3;ʗ.3AL7ߗu\e{cؖȗ>BMuI0f뒟TIK'Re,b1(8_Áu |E&dhQvIߑɏi b=/k6v{xvĻ;"/Áz_րpH_* m Ģ|dcܔeqmZE K<@!8,O сB_z$+T\}#u3*(ZWs㝎5: 49qp΁B4AҺ.E1K2Ӑn햙ⓎO$GOH/FWp@Q,+_}2v8P_%-3u|Yy)9,Ot|) _@]p [:rp/ Gp%ԟLp|YL.|G/qW8eY]&O48P/ S9Bt|YbU&,ħ Ω_g+v/J2voD:̯2e>sp>M\ eY]&2ȧ:9L.|YO&\_q8, g w|Y&@Vb Y#D+HL.|'()@!:_TVp.349qpe8<(8_ÁurP+-(NP.ױ;+NUzKQf][ݐ$FKj+,wKm}Ke)}8͗ZyT蘜ǘ֚j Lsc1n|##?.'r|Sul_fRw2!!:N&8 LvhIݤv)*zZ!k\rR2eq|N8K8ϗnw_OR5#XbYԓqk֍Hc8"Ht|/ݑZiBPS"hΖޕўsp>M\ ҁ<冎S y  d2[P`ԟLp|Y@2Qe $:]@rehE}K<@!8,O eQcVٞ<&8s|Y~99,[D+ _}2v8P/R4q-p HehE}  d2[PˢƬ=ye?p}8>'%e"ZQ_82g_⮀p ˢƬ=?S'p !\1@18,dN¹e=8Rp|Y "evR2 _⮀p B$[v/8 g e=p8?75ȿB$[v/hώUիחW_yq|8 (>,V~Lw̖G;sJekС__78s|Yr).2~&naРAK,Y\* _ __299>%X1y3ifժU;wU* _ __J"r|YDN2~&s=w}RYZ>&p08PKp$w|Y]e]2l߹=)W  pp_b… so߰mu}g6x3;_ _#8ru|Y<s|Y]7oaYc8c.zV=*rI}k+_Zc?eHF0p_bٳm۶5囍_g83y_g<زuu>e_ccp⽚ZE Rdq]p Wʏ˙3g2mX[6udzêݞo>n350nS$p|@@/2s|ӊu˗ӧOo7[^tcN~ _\֥S*?u^zebMwk֬Oa^3hf匧 pX)N|Yr!\P:,O X1y|G1Kr9`_ =l-jY>7==WU^צMnݓ ѵFsIpNTZ~,~8`(s|ӊu=_yWYxwS_>i޵-zĤꯒ1mqi%ʕvx|YvO(\pa;,gecvrԩk֬Yn9qg_~/nՓ|ձWgլS_/ɝF#״ռ?wyTL-q;IWe=0pd87_bɓ ,o>7^ukcwWͫΞ?ңol*?Xa_?m6[:r縀|(A4@9,V~Lw._?~ʕ~|E"ksϫj-j=Ǜ=_ _38Ru|Y, 2~/G0%eһ2,R8_ _2ׯ=Á_d$%X1y|9lذ%KpXZ%bpp /qZglӦ ؜9sƔWW⃙5snCmݺuee{%?\\ecfzji-|Em۶_Ga8ˀD5p_bCa:u>nP.λ%(ˢpp ʏΛvV _Cx>p K!p$w|Ӱ@K<@8/G ge=p8?75ȿt2O8/q8$qv/8 g_fG0(U/I3.N@_2'ܲs|'>{_fG0(U|x=8_`2ҁ|6Sls+sfx7 C ']x/ 3p /N9/tC .01cͭ ,΢Ȍ/ @RPp@ږqn_= Á 0Ip8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E; ꡄzp_= e? qp8€E;P|9 p es .0_Z%Uh\/ NpE@V]Z >?CZj6VwB!i~W +{;Y=28ʗL.W$;¬/8@*fu  //#٤Kp9S8J/wϠr0/ OhO}HlMאC5q +>{ b@+_F;g&?B] Y--vՓ:-~uZC-:ɈNΡE7ZwERѵtia)t7+ԧ/DuK׉V/E@G":oatLzN\C#iBcD}4V$4,%jE/k'DZӈN״.I; s;ND-cbڐYD\IE!IØrc9AnC 2P[:P|a<_/7 | t|) e}.4&ep8P|kt|KK/,&9/Se/cR| Ȁe@R0(-_ү۩h1Vk {ZtӹLZJtVwUDmM򤛱ZԈ)"ݐ s|NZǢ5?Z߯5itjHnb6HK UjSn3b֕d<{ -SG"_20iiLЧ;uz7MDn!mG`>&Zt+ݮu ՊKVϴo[%h cEtno.0ZE[Hk*>At=iHlR4t ^f5iN]/̇$KcR|Yl ˗Y_/]h_ /1f/{BK@([NK/,&_YL/cYz~]vkL /˖-pp| Dx| _f>1)du4ѕ\zJt={H^DG|/5IyNEm $@LZzn/t5^tOiiY~a tϩ;WhgI'}cDq>&͌&?HDÌFnwEwn4p,0 t`_/]̅/arwڵgϞ8(G ]_/0߿K.$/؍7x=8eO! /A\5F p2v5E/D2%?ڮpDY,;4O+ Q]a""h}MOd^ kQ/Qˬ*k! QKzUK?]}w [t 2ג!١ݕEH5^gFC̻EwѝtHݛ=>.F˴P~4+:uTp:AE' K %k'ʕXpd|\pe}T%sN'r??KU_J3;䶀*G p\py'v|9s1]1|KiK71jy/p$s).+% "| t2/T|7t妛^S7vm߱Kڷ׵m{u]{WXprs:tM,zu 'dC%_Gywz̻:rc8㹔{>ȗ҇RϔyE}:-s+"yr]/ZAԢcw@K׌XEo;VjhI̙$FrzH{mLwjHoRd%4Xd~HZz{kD"ZhzS;/v|w$jBky9pK"]&K=씛S6&e6ZVO?eeg%|R\*J6{*֢[w5snvmmgޡ3huy/Ǹ\J=e}<~$:O=T]6w*^$+w;Ϯ8tiRZQ:"ȵ-x}vo򵎺3iNXp Qp XxltR\=_%TMQdmW-ל,!5'u x.%gO_Faews,%'2 <yZo˾?/9C9D_"zgpsi-ζESȹ߹-.N$,Dx 5.pvT6GL8 M%x.%gp./2yZ.IײOľ}|䣏>ѩ/5vKƽ7>VNϾvGq/||>'O<(Rt#/.Nei7©oԕ5wD#+NƑ'R|He |D3tvkƮ4z9Nmwuas8ρۏ!.쫄){u%\+'υo/s)9|ʑ/ix?@0],XBd8JMCD-6"si."_3ZG-+ƈ:jEzq^ڈ<,2AdDKw/W"=D0at8hȓ9O_ERl&h>"zhig{8 )>)>,8D{rHv{ p63in"Fʼy/7 ?'c h}v~w4(V;'y9S9nuy)/= eDO+F:Ϳ}Z?wn;@sn5/8@9мy˺$#ԕlP;4&5w6RR{>(b/.ef͗P ?)4_N?Xrq|ttG4q.9-#Ӂqޣ%dܯE$<_}OO:#aֹS.}gg7ּuz#|4'[9tؤ3?b9*v黊ܣ;M~pwiӦ%~}"2{}X/}lGaѿw%'b s)9|K'06*Hˣ:ǗwQts)M×G7nvqr/֌1魛S}י]\J|ǥ|;_r3,w~@Lk?.y䑇x,[x[cwoσ5s_[&N\ױ4OO^6ѩYvYq9JBDT6F@z\:hpw쪫8I2`.eݫD,*Y} ]y!oy>vx\J=r_]oD=%jՋn'Zf8n:stYt 椔WktG~oKhxzKk뷦>CODG׈~F훍4O!ZAz&Ƶt@J-mD`$2M4,Gy$9?_v(tg}8]6vfy֤~Up P{o~NE UλYNY}C7Z}C[/ԥ14.%g2KKY%!Cjp`uƜ >A։p Pk;¥{.AUnkobUknQKUwT}}_~%y ow8㹔{>Ke/e"))̬fp S..]\pɥ{*r{߰贾8Qׯu:o׉y3s)9|Ke0㜉p xrrf[3Y8KcU3]GwwkD߾ط?'n U9Jw{y?WoAc5#z.Ңߗe&&׏"`Df.}MF1@i_aZClCtn2?\KiȼCZԈFZ::t-aD/Y-ZaD*Ңیgs__XpdٳS$NX)tH%\יx 93q|__5_6pD_/D&_p GKe{+Xp_&_D8dznoR,p8M,S[tHvV":^7G"ߨ =kޥۨ4Zz!pfDњ"n!OzDpf4"=[Tљ%t1-=7pG0FKOj~%򝭎lGE2~p %26|)ē8@/Kŕ_fAA8>K%F8A:P|iڐ+=߸C/ZwM$)Џ"t0M K  S$zNхF}_D-3DP҇"yBZ4ψN7ASt-:^x-=9}jv~N2Z"}Q)Gӑ"q͹$3ӼO2'pbvD$[eXdYjEY_2e/¹8@:P"|.K._"Y%pK;-hGx?pp8P@/_N]~V)$yQP.y-jN+o2"?vhFe^֢7Y<_-ȈЕZisH% hwZePLאQjF|3YCI4{.h}ΈfޢEieHO}(4",N8%2KALe>pp8(nK𥓴Fd8{8($K%I88(~K%d8($ʗ/et=4QDo8 3Iugi,M2Zq?lHIWfҞZw "ߴ#DՉz!#MަZznt(:J?hFrG||l&uZz:H;5Zы"=0 { Ɇspt| &R|ِ%8%2_/Ӈpp| _:oGxAժgDf0i]JD4h]L@_hJCERmMk#:FnZ鮄ޙEk抆ӱZM;s>Vt=]2fdiQLQ3w ]&t_#8_F/2<]PpK%bNr 8@.l _/ /ap8ׯ_p!SرcԿ=t#I0Ƹ[EJX\}C %"h_i鞅zM^?Fnt/ZȗcF|_ޢzF^J&Zs)hFk7Z&kVkHi:GK:'FcW42(xՠ=]nNCMLTKJHAep81_>O$"Her_ b/ˍ//^G(WHWyeZtnh &M`y$w>Uh^ _~n__/[e6^+{#q_j:|.Px^?P D⾲w>2JW܅ҕlqW9tjE"=>fG-=4>5ZP?rC/Z\zLύKL"2 =FhC׋hFljJ-]Dz@ϣߋjJO4GDu&N yAh)߿Z=hwZ$B|F䳽+D g|O ] D+^+{#q_"p鮸|Kn׋?j*˪/2Kg\ZF-d^8% m@F3ѡ/4 Ϋy4UXV`7V^ _.^XҷDrOIa"CϠ#M ~Lh-Qj*6>Bo򫀽 ^sxq˖fUAK_/oEGxfaN3]DU|*8yݜA*@SV>/O@Ջ̉//tnth*:F|}sES ch ТQFdn%jaD+Z64FKMޮ7cH+?dhi!-(g^%N ;GɠD#p*a^/qi"Gx^hϠ,dli"39BJ.о#:#(8"/4 [on_ė2myb:'h_̧E[t1@-uN):֢i& )-E-3DQs-ZmDfv-yP>%=K tVwUD-]>IDVJԓ:i鮟(6 X:\0"ݙׯ"3t4OwM"0?Q 3Aq!Hм*re Z?r\\l; Qc?d_/3}X|s#+^+{#sw 0tKW^=p\~si֬Y^ UVV,X e_/jdR%u+^+{#s.A1Eou`er_}m%Gë #s|^cW+}| S,q{]0Ru,/`y$w>Uh^m۶mk׮u_8d>3g }0eN_ʜ>4"3OtzN-i$CGhͦ?|CnniUj+A]̿)Wh'jz@k&kOgZ-h`,#2JqcnzRSW$4M U|C=#2%畟nYՏk/=O+D8@8ȗk֬:/3ۙ}|ɔ _Ƀ (sYLK/f1/ 8:} ҍ_//sG6լu`„ jqo ث/jqZ[CZK[L/R#}f)h D^ҚGC#LkDkh5OODmS 2 7M#K~HFI_v׍Y"zN]G}fҞ"_/tJ^ߝ̗۴"ݩtEK~VV.ݏЕ훌_p v]_ڐ!K7|iCn ҆,ݘR_Ar\&iq\ nh5(_/],C KKK{j_/>| b(!L?wC&|Y|uK/K{D.K/s˸̗̓R6_/˙/m 1q{D1>n_(M*2m2'2ʎQt}<8 11 %s>s&p6#Xfzexud+SyZlAS]COs&M6ZXttIHu-jD]7YmZKwvF?VT+ndqctsj"T4_D4D1Zeo([tX]yDSW-Ј]d+&6\l'àuʴ͓zPw,=-6ǎ8wx,dY|qƃ{2}1lvK$b3.?!m ZQذ8 ,~\~=ƏgKeIeQ<=/7Q2q~"6m[4F:4j]@YOk%.RA?Q'eX4' )] Q>—~< L.!2C3/=_}M3\!\˰nÂmڵk0W '_F)|Y|i1b<>$a ,V_S&ҞJ |!,e6|+:e/h l@q/3R%2ED.b~bm28ǹ}|VJ(|Y|Y|\%e0򗅓+L˗ubH:Z:eD$w "ӕ0 hKDzpfyDkDsDfI\h]@Z>"zh3ZohȼLZ%nS3utmDzՌ>aUF-=廙Kɦ}KE.K/- _/p22|)Y>|iCWi/3B F111AG3_/&@2#~_/>|Y8|VrK9u#=b/h _ZQ]_l*W"ZbDgѳZf<4ү[.J}Z)2J HON}-T-jASfޢiQ;ꭵՉ}#ҕ];ҿti#thRKsZzvt.'}NO>oujQdDKD....4~ܝ_I W>\j*wY_2e/1K/\S;=b"ii_#fq$)_FEc pq'|G9Ѷm6^w!R/˗HPl'l`d+;ʍad{U e-/-[6;19pK>c͚5ի֑% lZ4iHLk>M2˶|}U#jJj?{95]G}ЕGBٴF4ZE?~2&B=t-3bJƓo!thoeh6Y6Kh֩4T4ڇ>sF2 THZ:E7zWTP/m 18 #A+İ2l 1@|qg h t{dCp@Y |>ɫǜvU[Ǿu?9F>^s顄IgF^ @{F^")]sUrʐ$fUn[E~Jʦ0U.J%[ԦHrOHҭaq jC}eW[}[Tˆx9Fiaάr}X/3_VϦMh~Ҷ#YL/"9CcW|cKNdImj#V "~«{x…V{o^nISbCy񥗼|g6@xhp_bQKMRwZ4L2Ƌ 䗆/%A/Sq\/LKeCdykݎJ5 2nwz˝UJkfeG/yn o / + He]u#%r0JXK/K'ҭ32'ia lt1~|{iĽVTzhVW-۸s /?eX2g5evKzxUNdWa%%Jx53I|U;BhKbz8C;>q@d.LQhJwPVlnߣ;PDf;a~"oL $zZ#h sL((9I6=lq+wo( /U\Jr—VFN 2ИAit'W'#=Dk5zn^32eQLQ "g,<7M1u#h.4ZQ{я٨L!ni:G̠FQÀV/vl4"Ӟt1_\tҊGԐV!OCT-z͈ScQ~X>e ȈRUFUZ1|?.[Ȳj*/2qpɠ ,Ĥ%b2R UFU1^32(h̩/%%򗖰Ua8 p+ q_et_5A9qaPKeH ȈJ.WWňz rˠ1zOv/2&Q5ݢERKwGhI'ҢIFx1"0Z/S+ѣt֑4Z4z.0^LL- )-߈֐h!5yRnBZWQt3~* .Zktn4ZH2_S]D29T+}} V_ąA_/]_2R UFU1^32(D̩%|Y#6dƀ/kI˗f.E<Ozsy31+Gi#EыZ 6ԁC@_NF u;6"=V/Q 7CJ`ۤg/O7Ϸ\3-ݴzR'^^yF,%y]Fk&)nк[3Ǐ95_>|ۻ _{a_/],C供UK= G/3<˰Q2Ke/$d ȫ2F_/cMhVr[~1x^{!K7| '!HeF^VG/-F>9LDz zE4.LYHkO""sZz[Zk%\gMz.=CZzVbGt]LkLDz"w^׳yE:Mԉzj͡?*NSEki+m1Z5T%ծ/E| FH0SFd\ieK𥋘K{*H/;K%J| ,C^K{_f=`y$K%2S*x%Ҟ#yUhMW":TcHI,h͢m]EGi.gZf֘f;ZKo|DK4oR&;w=theQL2(/v|%]:FkwZ$u J-D5"_?3VSTt B1L%YΨM꠪3+>P(cxQ|Y{jԥi-ic/[طZ{4 $!:6ɫd/Bh#[-DU}޾P趺[$nx)w$/ γ[>u|OLJ!ee=aeժUYd|ɠ ,ѡwK70fhy{j[**xQ@x:Íz4j֣z%Ƅ0*E8+GӴEe_&tkX]S׹Qա2|fW+*O^G}{T$.I41&r*xرiP:>R|PxJC#!eew:p%\>-*_Ľ}8|Y-[pr@KcE%'#=|޼Qx4m!-2&S^ڲK"sgӊѽްޟ:3q̓ۚhdme&'HU[n;_@bRcudtˇ[xYLd6urkԑl>pKeqe,cə̂KD9M[KiO/&da.i(&u\oZi O!iNDἜj w4!!<%bJX]&|Yt2>i g|DK/^/煓t£]*VL/Uv3 }rv3>Z_'<7L2;Ocbȣ4ǣMNWފ)Sgy/R|ϣnLIe^E82v)v/k#%g.NCyMοgn96i2"t#!4^4.҃NՋyD4h]OnZb^iAShi!OYZ?ٸV9\YlVH%t2It* OoiQw#2S O>u􂖞6tVꮥ'o.u亂EzU6s3Tݩ5qz-)Fإzǣ)CXTDNG@<'2k|d|$ޛ*7<]H oo*]$ݻk OFyxu,a G(h/KuyِfCe)._ǂh4of// /;~"2ӆ?mh?W:EyS#:Fk}Id-_|| }33ZG~9]AjѽFm+EIƓg>\Ik%\d}ZG(ѯv}e?}<%[H_MOt3ݩ%Jd"Si{L-3bz6Bd&B?6yHLx]xm|πB-̳Xd|O]i˗'q'oˬ5_2TV9,蠤<"G6x8Q -uxy 5 V=5QŶ0zFD#ݼT*MKY¸{q<-ѽ,2r_9éhΪ3V6Qb[>(%W\/sf *_/],zң70"=`6_:s˔5 _rK[Vw^LH{HI4}/%'&SѡG6urij/cǺS^ڒӜ>&nx4kC_2#zȉFѰE ^LIU[|\|Y"|INdZ%0 /9oFc%RŚ 8((\r@9eM"AJ滑s&p6jR2 *e2K'k"W &&xYzZÚ˜0 K\me9bz:fq(~Kp_Jb|K^ Shi v}_˗.eƵ?9s/. dp7;]*%Y|4G﫻S&K݌Gq<nWs92<̹|)A4]t=:$Fi DZzjD=L1$Zm4YK:+#DL#-=*O]-!FKբFt ]I"=9ϧ=D90KD?ٸV4"}&'|NZ"SI&/}\||DR5[랗圿L} 5|~lMd|.#Cv>O%nĩ[HBLelDK𥋘%ė,_&eOIU^1qK;#u{TWK&}Jy3.?!m 8/a=q X|\:[.-8˥${Ѵe_w2l<) oL\5k֫W/k#Ku/#:tRФKgݛ"%[jQM2QQI((q6WPȥ]@Y:[c(*]třHe$.'ҕxC=PҦpc%/QuC?|'&Dl`t__:IKo``3\.N/C4_<ۦi;CbAY#/#`߮^E MCN7EFuzĈӯzR'gҞ"bD?ݲZKIٟ 2IDA4Et.=UEzzN^ߝ,GôNE/ϤD+92~soih1Z "z݈~rt7;e4P]TDQ_ȍ_c(L _KnmKels &1p@['| FH%Ҟ#'Qh~Ҷ#YL/GD|iO_/>|_p|)MhGxIa _S}$|iOKKo|vD@8T+_/>| FHe~1Ez_Z"ȕL+f΢gEsZ%,tM23Iwf6oHOHDzCd&-ZaDJg"h]KLkڍKõ~Foo[)D=DߤD_L'GΡ*a4NKZDjWECl#/h _S}$R8m|ɔ _#xK=5G/h _R_J K/F/^ vUK=5G/h ohw˰}-*m( K{j_/>|_p=-_&t8ѐuZȈ̽d|iI _ b/1/y~ ap8 ^zÆ #˦M6o޼e˖[n߾}Gdٹs.o` qΥYfz2VYY:Rc_/f/(UC58^m!ƁHNn d{2@_/@̴/mҍ_ڐ!K7|iCn Rq\& YIqE-iz̕JH%- ڹh*]C2#zתDCZ#thSkFJZgwUABԋn2]IӘ ">0q̐h!% |b3ݡu=( tHd;\򺞽,ۮ5u۴!ZBN;İK=5G/h {Za!K𥋘eȗwh|iOK=5G/|\\r3 &| dr_/>| FHJ>2Z: //rGk_/>| FHe_/-K{j_/>|MZF2% eI˗2E1HԆ:Fwc$ͯ kE/iZgp:V9h(&S]k*ѳdd`9uE_7Ɍ$Q')DjIS~'7L^^}^4WdƓHO 4Ȉ|#2o^E3/| FH%Ҟ#c/.b/a #K{j_/>|OOL IG_/eȋ^2|iOK=5G/ΈAq=5~hGx4Vh_ĩ7ooi^1#ZIUDtKҘ|Y{Ջ:F=GJ1-j#8hSC/% w~ږK4(qlq\r@Gck\QgD˗gz^ IҠ=EWW/!CzP̯^}z" zV6.B-q7jK^>LWfn Xk%2cILiA' ~/uQOՕn)(#]yݴ'QW;Wc:L-j[/%d"-9 dLjo^wcxY|ɩG 91EĽ/c*,צ7_Ʋ}@ K&C/ò@ƌ/uh,L_KKe/Gte 0P&k"wQ2JҘ<ԦGi5^6$_C?_:9K*̗ͼeOK5%{zB{.3FDLLWZÓ7:HdCe :Tp6Gzy5k֫W/k#Kz|+%&boQeYWUL/q͠NKͣ0G֗ /M[7̀/]ȒYAgbxj[h4j!bΉLj<#2zfhǣ Jr3}s:=y=Eόr#Y왖/?}]]CDVڐשE'Ai_j4}5PZ612~#k +EZP3goEoZ"} f!O?߶R Uhi|]3+#ڏ>ТyFD_үΧEf6iͤ=E{Z#֕%Ce͢<65!_>Nw332E {#'цd{f<잗n;~Mx\j+6'n{_˸TBg\ֳv_{/{ޘyYGYVZEEVL˂K^`KL2G'&NOyw %Ĕh#8HS˅ WTze : r /)g=Ii]A $ F~eh8?8ߝp=+Sg|5T@=/h _S}$ϛX?&K𥋘K{*H%Ҟ#K{j_"{!!2O_fD2I/h _S}$23{qOx9K%_a>2K_/>| FHe.\ꨞa˵WdQ%hMkD0۩\zJ+h77f_|W-"zrxatǍ~# ]5cD_akƈZt^CJWQ?i6"}Jf$iD7-=g{R'w/3eB_/>| FHtia|) _9/h _S}$|Ka"))L/CxbB>%Ҟ#K{j_|t /&_Me>C}  K{j_/>|io| ,(+̓_/>| FHe~Ѳ|)3ֈni_-YCJmhSko!zҢML )uEYԺ=Bi1$Mf2ɐAFi:G{'::ҿzэ"N*jt-̦?k-߉̉GHֽAD(sj" p|O!,p8āիWoذacdٴi͛lٲu۷,;w-̓YWҰ<`DGhsiѮ FfSt]7tNbt!OgsZ%"d;E>s1i鞋w#ӟHge>%}6DtSTF˴n"=ɥ2g".q7t,BbU%Ҟ#K{j_Y{%[ðȲj*,d_/ unޢr2K*u8uz^PYuj>hh,ez~| ,!65L&US g2 eM%&pNSxdi^;/]Ȓ!2fg4]ԎakKR37 _\NjnH#xXSgLeAȘ")9mg`"\ | ,on(/iǥu92Ɨe,ZntG6 ×'KAh/€K/.b=_hxi7'qfDŽ(mFf k4qNx|v0a!ŗ qo$Ე_)Πr8MEěnwLWB}K{CC31LܢẒd|%5/&5_o.6ljE2/4Zz_\A;*2sI1@ۨL#;Qj5COk1$zVnѢ]tԒ֋tEZX#t>=҈ZE6%϶Ҫ%M%Ҟ#K{j_/&)_ 2D|iO_/>ˆJQKeb _S}$|iOKe҂q/mC=e/h _S}$g4a_"=fm$|iOK=5G/sAܹXt۴IrDEf&i)Hsn"`!Q{CJzjn;\=tHϵf*~FioPG4FljCZ:ޢ3iO#hh:5jK}D!8qx.2ԑ-CGs&-=|;ꭥaJ-,")FH_/>| FHe&u`2#yM2"L%E2ŋ#59/h _S}$2{ZFog/e˗-AX _S}$|iOˬRHRezC/b| FH%Ҟ#ᯞlCRַeXd:t(EY\#2Ik%\dF֟iHϚ/|h:Rt׺MD_/\#ғ%ᕽi>ۇb-z͈̲Z6y"*IGkyF~tu:I߮HLDi֗+6ZVJyE9.p@Xz 6FM6m޼y˖-[nݾ}Ȳs]yuzm«|x㿧+u=?bί^cL4F=wVnݪ}[L:{4 $!:fG}xW˜F91ȈW!qϫj]ݹyaԴGu܉E\+xeܟy e.XXY%tr@Kq׸1ßU)jqV_&w2ȑ/#`]ESxңUiwZs(q|p+J˗m7 t :QnyyX.OyDсZ#ܢEs,ڼZ6ߧEM h/e|/z**oVD+"jktWE_Z_$@jѯ '-MV?pi=lD'Zzu3De6\ńΗ{FS-֤2kѼ&2CKN^zhXݭNIrWC L/%'&%I.ŗIޒKNFzhX}K>cl^E&mozyK6t䥗T_L+/>I"&Abbu/.e;_hihCk"p_4LJdrmHQP.hZ1ƗҼh6 _:zPRR)5ozROCFᒡ3/\WfCebM>K_fd_"Ka"))̂_zMe3+VL/Uvӡ2eh|_K_3/U4ĆBK=S&=ǹQ>t£ݚ{+Lz-zitI1u3!6×l xX2_z{[#+qym_M%|LT̗U؎0Kl}\=qn!'/CKյѪ}ܟ/kE )0|i>[.CKf}<\oRK2ex2r7%6/[hZPL(oLL+ )ecƘVR2H~ёFq׏hKjJou!=*:z*yv*Kaw?Dy}-k, ~#hH4ЊLkxV!aFcWDoLDrU[y|9xQ1Г Ij$5K3II8#cX4GGHNRL2^Q21 L|O#ƓLz]3Coqƌ2&&2tc7 d_<_cBe/7DqiKyI$gĄ6l\\cDq)INzҢHK'3%`C_E Q|?p2a~"yNQ>_&o(%_&HK^6(DF5'nݽ4;ˣdNy([B |Y KpedJ^ry/#´Se._S /cWf"s1iHZ=1M҃ZZzr:KKU9=Mh$ڴ?Jy:o#i)}5]CR 14BDo-s`u0M*y+w4ɈhҺ~+YKzԧ||Eԛډ3&GK{j_/>|iyJ_RR|Y2)Ɍ.| FH%Ҟ#y&G_)L/3r _/>| FH9 | _,fqK=5G/h 39U/\JEvNZI"zEChe^v] 2}IKݗ,5~/2=Hk?@.~eHy]Wke"՚@ъTz&%= i֛t%ju6 DSDCTՎzN%"3_fw ^| FH%Ҟ#v(%E2ŋ58 /h _S}$2hW=|Y|c΋|iy_/ NoK=5G/h 39U/e2ō~$d!Kh?Vb F zP~!UDKTp:Vd> t7dgCdyjASEx/WHϦfnZwrV5"ҝYy]_o/Q+:iN?ۺJKwZ}N2I4._!,p8āիWoذacdٴi͛lٲu۷,;w-2{RLQ&+ )A'ыZ$njh.QO˝+ mN7EcZMSo_OHzZq:_$ovW$:hY޵P-=gwȼIZ4LjΥDC<=KgߓcK%\r|iOK=5G/s$`/1K{*H%Ҟ#K{j_9_YL/ 3^%Ҟ#K{j_H_/Vy/h _S}$2@̱|q\s&<~gM@WjIԉzjΎLs?gǏQҴ~Ү n+DFGlE!i5Ҳ@B0B aI-!~oթzu>ު>s<߳=eD5ZE{.@n%DӍf~t_D>ZzF]/"};\DFk[z@4v3bEotK^'چ.Z+:~U dJPC0r,*|NK;5G/$d._ b/cg%ҝ#Kwjt_& _&ـ*g:. ʶ}ΔC_Rz$o_}2 l`QD{еmztߗc^'ytP*Gr#ˡ.]PArsþ jBϰ*tח铇_}hO*Jg'xȐx~a"0|ܩ"6.Gݽ) lgE8T]%GR':w/0# bdpnW8%[ -[-<8|BG }=2K|#;|ނ=q>;FG+-MrPM,?!{z¹*|ezl¦8:6Lkj8ma_֬YC~ jŅȜFZr|t1Z"hŦ*Y{%oZ炙EU${RAi$#:N-\Ak_h}FIK-$Ҏq Q*ݩ)t6hD~em[Wi+2Jo29}3nKհАqdV_Rz$m̞/dd ӖMJ&)-Y*f$hI m׿}GfY!_*4dG{^ !q _rDy0”ggteMdVK%&r,t^.[֔h|>)(Hpb|)Cފ#e\Sc4$s@g 5MF!}2D9 _5 D stL^rv3 čX/e%'2yޯ*_;8~_JD%Ŏ./k\s23,qDž ,R$)RfRhrhL$ǙDlR-qFϫǓlp-9>N2S5 e<]ԓD× {p.fF L kj| _'/[/eeBoM,ɶK/gY:ҨzV0ř69_FDa,G],)kz>s1ZF)wxQo0`d|a'Dqp&ո$tvv  ]Rɵf|!_z/7޽"DE+un#F-/.#)AE^}:_^joЯEޢ%ԩw@j22JчD[_0ZѩOMZ/tkZaЉZDsi' >u }DYAkOT\#HO[<4E_6ZKi)t$Qly3Dhvy"c::CE)ο0Kwjt_/ݩ=| Lm| t68ҝ#1>tFH /6Z _S{$|NKGL7 | _ [m_S{$|NtѱQ>ogѣFgz֛7<+Lf 5s/De"ɐGѫo5ӭZ\=a>h]5%ݴI&|--7=LzsDNAh"ƗNKoϛKiI3B]J{jt/"/ _S{$ґ _ b/ۍ/WX9Q) _S{$|Ntѱu%f10͛jcEKwjt_/ݩ=|H醁/˱|3|NK;5G/G˱˗ePp###k׮]oذaƍ6mڼy+~ٲe˫a`~#q 5 kBaW4b\;*_h'4CZV_hэ&҈!6Nբ:YjENzT;/ tE\DZ}a܎RIzuZ/F4Y|"aEtSzA鶢n>׻h.4Z;Evo;A\oއ rqzj ث8䞂\X*R|) tA_____& _,f/yx[1b#_/ݩ=| tFHedKe%lZ%ҝ#Kwjt_&uLma_֬YC~ -B#z Z^2"8Ez?p)2 Qc"y WDڑE˴f"t=CuD-~:NO~P௤IO~n"dH(MDzb&-~ԈN#D3|K;5G/ d%_ b/ݙ,OK;5G/ Lh|Ma"'L/K;5G/ | _&Nck| tFH%ҝ#b-ʗZ+=MDzDm2'нZf~EzYtuh]/2v7Z;Zo}iQlj"h驨zGGj-9i_$(Inz7-=s:}GZ\LZD9MH?&%>gnK0r,'|NK;5G//_/-b/"evK;5G/ Lh| _fBiC6yhPپq.zN6nOʖ/&^YAszvԼ.t5\Ag$PpVx>\>_A__/N lԹޣG-YOPK,ʹ CCD;<#8-;lAFϮ}s,q݅qK‰ރpoW|yvwŌ*_S3_25%'&;﬈:|\/*× %hʩ|Y &ɨ|j])2D=Z?KK{"1Z?Et2sHt;}Pd΢"mC&lyDtG%I\׋iJ hh :Ezt>=:CtE[0vwW{ riօ\Nt(T)eʈ&gH\rF} #]YF\Ä gKRAFh.AʳPYv2FSuRC/*7'Y/mRJ,J^zc1"oNcwJoeqSǃ/ #t9 PF`@ R2 #ɧ-e|Y & |de:S? ӯZ×ճEgf^FS6'Y=X|VϼzOr@>/pb%KcKflQL@ٖ2_3)aW,(:Yh:YD-=sToׯ ڼҙ YK/̒/eඨ>RemQw|ȢUyԻ/Քpp\WJ^qh;v0<\E }B[q߽Ȧ/e/lpnw6. ϲ<EKE1Ηւ/S_ߝοL}}NEf82# t/l2Ql M̈0xK&|ueI@˱Kw_S&F _FC!r;a̜9v,|_/ݩ=| tFHha/V?EJB1Yd tt"]dDzHkI;>>E?2ӀŨw2zhޢeVmŦH~nѠu1-ڰZ^ѥ2Gk)m#]2ni!w29u-}3-oD7'D̿5KwjtD|N_/G&ю?r=6kRpdҬZn| t6D|N_/ݩ=Z0(2JJk#Z| _!/e%ҝ#Kwjt_&j ^)9MW_/Vƃ/ _S{$ҁ*heIŗE_| _!/e%ҝ#Kwjt_"Baz96V2/W\qE*􄱚M_ݼS0Z[DځziP^WcG"֧ҢOQ.Һ&B"hhEiL#FK}%X [Eɗ8\Ѷ^q-LE{%-*}gEf{ZH;SĕY߳bZ1mKwjt_/ݩ=|Y/_8>d_ b/5c{[| tFH%ҝ#T*_~nkkYUKo*n۪E7kffL:@K/OF^|Ad'1ZoEzoGbuFt)uFfh2]^I颽b:ٟt ѹdѻD;"-JHl>t>@w t=eD/Fv_S{$|NdVKK!З;WAeΞmLpЗNCWžWAr֘!*};Ԍg&}tPd{NJGuef;/+Рz>'OR} bt@Fjꗆ*?:h:ax# }ĸ3b#0˼]]J˻ |Y,݅mK^i^dPj\Yy+ރpn{Og:?[`{-Pzn_w#N=;>RsAR{L{>Q9χde/(^eFė Ӗ}'.ҳ|$bLR_6H\>*_N+NEŶC7{RidffH_JۈNCoFt'}@7O-:шl*ndBiFKlbur91TȄډwh(&kd>MEz$׿KgP3ngh͠~M陣\zD_ߋҙP)iK]/k.#$U|9P5il_x1r&PKbfmȗe0Q|۴%\Gazqc,g8Y/u=SȘX—^O^VI/y'C_Z|)IKe:%0[/I'% @3$KȪ01Ko(SGVK5RϿT|9m>a/I$2qC(Y/,p NZ"eAe.їEhi󢋨Eˍ(~Cdn"Ƚu_X2jFKwjt_/ݩ=|.8:_ZlC@퀆| tFH%ҝ#n| L|NK;5G/G˱˗PPp###k׮]oذaƍ6mڼy+~ٲe˫a`đʆoZGEHnQ/ jOf"c(Tlys=hߑHx=}N-2 h_-=Ooڕ~+:?ߢhEzL(qVLKZ^N#2I:Yt*&=o]oϹ ]'2"]BFt=P3ip‟8{u?{ A.W/7n/QKL &҅t!Kt!Kt!Kt!KLl|ba׏S|NK;5G/$d._/ۖ/yfJ4fKwjt_/ݩ=| 6 | &#%ҝ#Kwjt_6H\>*_M&]D3JЉmhU#LkFC"=Pu}hP"s3i}nNW=NoئoۺJnN_Ak}R4>-[s\HvZzgo,򴈾nd!Wwh5L/mz}OhO&ԅV </1| tFH%ҝ#b/1KwjH%ҝ#Kwjt_6H\_,&mBu| tFH%ҝ#b/_/ݩ=| tFHedXL64/k֬!HEHE .Oi}j'8v-t~I11=CT:~(zuһ2'itP_k+|"ҝ􀨇ڰkht:XKO$ݙvպ&bNNsi?_E0_/ݩ=| tFHe=5/LKe2Pw`Wz.-isy>XL|IL& j_^PGYc/wo_W}ޑBC_BAeЙk<;(t}JdlrhRUUР=u74=hHdzui-z}ϰ;& Li|b%9}qS2}+riޝ +z:Pg{cxA 2g|'=G)ٻ=Kw&8𩎓zeSrއ,_zpOyYn3{>y:%GZ| S2l>H|yi٫{߫-{UMx%L%27|9w8'6KK˕rpI1ƗL*mgGb2TjF] Eȗ6X3a1Th?JM2&S*2Kppܛd}gNd3G4r|K^2Aʀf>P>Re@3(_&Ί4_/MZY32ˎW/irmtUWcy2T7*_yZ]×J|98|dGc:uFs`׀/.#VYS X{ }ʭ@O 13Z&e. K/^-0op<(Wo3Twd6Q2LUd zC@y#Y%[|IeN,JͿ xIF7ݵwDt'X?-[oz6:_'6/^]w> L8;,YI㵲L$_&Ί4_Z_ڱl|7 tL;/I|鎡zp0kKeƬ6_| tFH%ҝ#b= /˱|3|NK;5G/į/o& C z7j~\]@,4 Wu=POmNх$Rtu0.G4Edoz-0>}[GΟK/Ik<'һs,#םQHϩۊD#ih]Oͣψқ| tFH%ҝ#b= /1YZ_/ݩ=| tFHe=85K%2vKwjt_/ݩ=|8+ | Lr>|NK;5G/į/߶uƷMsEZ-=QO}_dfV7!1u,Ht"@DWk מ7Zf"CFi 2Hh]K&uVцͯ}n }Ed~HZ'"s:~)M-O_hHOi%GzqMk'EzIzDt:Ygt|=*8]%O"$M4D|B6|B6|B6|B6|B6| 6 |i ׏VG/ _S{$A2Lr%mn95w| tFH%ҝ#b/KwjH%ҝ#Kwjt_6H\>*_sj)m#2NtNԒ9\1>]:SD h:Y(ҝFzLWr6cZS҈tXvH3hv#5}C:/te%ҝ#Kwjt_& _Z_VF/ _S{$A2Lr%|نXkKwjt_/ݩ=| 6 | 0| tFH%ҝ# a2rM@\FAhi|ӻïcNsieHoiNE-PzGUFW/-ɈkEi qCtY/:̃aE1+wңZŮObX{Dz2+=j u8Lbr0:Ud.#_E<_/ݩ=| tFHe2`+KELe7[Ȭ9e$g9>z[ {Vz$Çe˗C+*9t2Ht={h`L<ԼO-t|oA=-T^h{}df5T蠾ʇ*_Qpv=BfW|hwgK;e!edKer.'DHp. CzPP 2_sgo?3ȧ|,=Sdv t1uRwgxuozpcϗ KM6]=gwXI_4%1W ̞/w^q8ާx`X@GOw-nGwCiA:%>GB ddVܩ㼯<ŗG4xfȗ 9 8e0|tϗՎ zPۣC߫AZ SUiKJVK/mš+#,$%Sc!H[r 2Y2_x8k@Ge&ŗ/Vզz"%PfD/C2s5̓2G2퀒KZS:2Ko[#+xxjX…-!oJRo0cPzEKK'c-8|}O_Hx@~4\py zbk3\Xv/KJ%.C̎\#Y `YwnҬGVʗO[lGDtZH;EEwlA^ԢiްD4Do>@Fh:YzPkgND->uRTAd uk"#*EZcHN6h(2C [D;SǷ-:݈Lқ4vΰG~<7f| 1hld&^ LݷL)2[t;:fXV$%Ď/9 rwܯq'_FkP!bQhp8rl#cM tV;b/14)\be X2KI0G|8/h K 鎘K;5G/"i+-ˀ,_jtL/9-_ӨK;5G" tFȤES -e)t_ *0!OBz/ &,cM/ _S{d|(Ɉ˼e|鸡(@/ӣZ_/ݩ=| tF4.sɗeVԽgTDf耊ɗ^u|NK;5G6Ηӧ_2Z93GFFfΜ9:cU΁õB_iծlH/c/$W;8Z߁Qb5n/kr p -˗78j7oތ38]wM]cZ)j_d@$ȗbz8Ƃ_*?D͵V`;{M3>$Ÿ/WESKe=V*ei$_#p p(T_Pk(\ec/ ;bp׿U*\=|Px˗: p13q%hR_=󗥣5McRKQ%5م`8M r,4h˕+Wp(fñK+o~|s8pk˚B0HсR>}%3 :W [n 8Z߁Z)k*I#?900`V(vK#-Z8О$ȗWp4kކ|9k/ʤY87F]pf N! Y_On88v|a6$YNU! &A+bp8`h; 0זav4$Ө˶;Bpm̗Q-?PfD"!+mN8'eT 1a>xcQQ>M e?5!p9,fʶ5n_p8@ek8mm0/mW4 *H*iw>m[wׁ6ߎ'6*.n _6H/,͛w1_WM:{},jێ@e1@|yG̚5wxBX qw=;>?y8@Y`dH/Lf͚-[g$Žėd>h8J/[e}gժU[nݜ=~q*e{v|,qp/ɀ8,_P2TGܯ|نn%O*Zp2} @||\sevcaa^rO>3t{ӽ֭KB/ȃ\/WkC@S_6vhH/|Afˍ}v3Ӡyq-T;7 U/츽;kՒ|Y ./.<-ÒjO>I;LQ׮$˗?SϺ5s]]p#WunܹTws4)s.n %O-/O' ʤo{N.1⽗r6 TjKczp-@GZCش=z=O /*dKс 6S\7{˒{/:Pu*—vAJ^K^5xs_?8=Rm0:^)WbT]ߌ,n}n%> p ŋ3PkYtpdcx'#~}^ŠQSr}T=~U_q{'C.#+.<}ȿ;ëw/jqJdm\#-8b1w .15"JǓKE+pd2 @|yw4#[0[UŎx9+Z*qe/u0,>v*UE?\UoGFweaq (|iӕ'%) g8>hu+me;|p%>p rŗ]UV|)(qd >yHp[~U=wKW˜KK"}e1Yn|U+WO8tE@|y뭷rBZ w EW1gwOz5#XExW6k({Etע~GVn8'0ɿ\Uqۭ 2`,?iRGG{dO_sxz;AeG6{)LYlTh}VS80f_ٷ7b$˗ .\z5oY[m=5|0Ex1R/11fۉM{o{ΗuvAq~79`HWE z}UpY/W'*Zp=_^'@|`z|:_a-_?v8mО=M82)zyZSp_ ;ޜ+^84E@|y׳yp_ ;N%+]i3m9sy2b U/۰i2>p {{W̧ )Sz*#J~`{v<>9˃>O:u!TxrAhN>ƺ %q99Cy*νė8J_Sq )0~pKMoێ'C+pVr|Je,;_epp8<d_&#Zpr쿇Ak8lww|wx 8he898u|OHe2>8/{xpp8|pp|p_6!ZK|pX$d_&#Zpr쿇Ak8lww|wx 8he898u|OHe2>8/{xpp8|pp|p FFF^{>zնYL̿g89l9o޼c9f}j hԩ;c[޶_؊F0fqfŽė?|Q/_*_[p ;Lb{'Nq*%Zf͖-[^Wq*u|_^_ۍ8Pf}Ǣ|)]%SVNoWq*u|8TlEpM,_nXun.U/y(s#rlEǬ1H˗%~{Η˗/8 |_ ZU_,_] +y%_{Η˖-| |?s8LƋ8Xe=)_{ΗK.}['=q_eRt|ܢ-1ӄo |(mx|rϋSxG-::_> rAIڟ{_W+@/0 8W,_KXtkZvW=/>jNqFU/^zn1;xQğz[qyEZe1-8@|@ѥK俱TRC-~iL~ CHtMtIl_^_G89`ru{S_H,:~„yd3 &~.ָG\wPŋyiʕ~__8>u:vuo %@/3/@k;`’$[n=v„co-jq3cwMGGO_u;{z^Lfޅ;l=vi |y9[8P)d1(GVW۹]._.˰˥4Y/c4 +@_6{2-'/Oy4r̸oc`_⽫/oV~Tw}ݽ^dFu!TKXt| 8pf/^ rGsGTTw?{W/۳Te,;8jr:},m;T_ۃ`8ȱ j6t|/Jt 8jr|ن .8@_h _]p_!˩8p8cmC9Dp&mBr*/kA0pe*Fe(58e˚z 9v| j6t|/Jt 8jr|ن .8@_h  p6ws``!p AtPp1M/Qpq(shIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1444167161.0 guiqwt-4.0.1/doc/images/screenshots/transform.png0000666000000000000000000137465600000000000017050 0ustar00PNG  IHDR?IDATx @Tـ}DAE1KӲgfV쵼^oI[_YZzj暦垘"*lʾ30?9sowx& ӧ   ]Nff]^ =NAA F!999//};` &8::* Vk0{  \.߻w >}<$  t 133Zرc{`  ҕ:t޽{O>]+  t%D(n۶ZܹsKJJt:]w AAND"Q]]]iiiGwtqq|:h'nnnfKYv-yP AAT*+**;#I@:!ƹn76F>z,^fiSNjZ'''$((o5[k׺{AAn&77_~|>_(Wh4ްE$/_d]ɜ>;Evz@O7hK=\cWhMFHn MNc-B&ʺyLnnndXs}}ϟ?O  j&=== ;ryPͥkL&"(08% &Ȱ>$$>>>!!`0zh2Bm6t  r/QTTDE$ V??.d0L<_@ (Mt$  |N8ZiӦ 6Lnrr{˗~vAAf߾};'W\iVNV^O=T0&R4y^u~pmm\9֪n| &&'{C'ÆUwoPfHO  G7wB}ɶ5"5ROpm7lי.]:ለh^n6_|Q&Y/JL|W +(+=,= +`#K7o~[_}.y]#C_Yë?Xe3զli.WrG ^=  H穪"rX__RiVV͝[}?}jl-RF S[ۢ\<9u1`&=|K,&+,+ $;vwD˭]rd-˛' 7OO>{KnG[kN?9n{?k'}5̈́u91vɽ_~5 ޒΕWRro{2o9wK?{ޛb.8 \jjjBCC EGwtpp抎gϞڎ֏{Ֆ@Uq~_n=7vc-8{z?r"#&&zeP(>}T*['KGOO|¶|}lyhHnqZH\}ŝSNݼ6aF{uxDļgG썽_y5͎b!{ؽxʓ[8~>4w!7N5kGbҴ =h7kEy}mUmsiOڅ+RXոyYE7{ogm>3|M^rqiܸ~]׭o0fUߠl/ ;ǶCJ`437RzGNU͗oٟھn$I/iCؿH[Mݚ-O  =  ^pQX;Zwr>ϲ W ¦ơ'ʛ=̇m_{ @^9zLd? #d?#}٪Tj.ěW_bNodg>$ֻJ/&vƍ{GevL?7ji֬1yTnWN8D6 2uˆv 9 ۻkLӎt c'|`y}3.0,9}+-4[55;۠#&lpy1ZyuςCɩݿ+qZ7lL؟8S;2΄[l)ڶ [9Khsg'æ-1g~rY{#>swsg/rSz p/ AA\.tqz_9K͟%K4>hԹT7?  =Ç7 on3f̘7a=~xc:iq˓#2[{W&צtrowoWu fֻ}ֆb2 ìYrkR3UEMVg V^`x +h X_9XTEra{^xs,n G شy mUnr>E мwuܴul QAS'G?GGQ{`SΛN, ]AsɊzwr #T.ґb^ܼ9 `5o ,rssMdC999;GT^VɿϽ=מRڡXcB":6mZn۶F[[[Z-葄U oMHG}h녤BN. ކ<ؽ=np`AxQX_~19K:Tbmq L|Лzr/B0 yZl0ץ̧?㟝Ic5Y {AAnO*\In2k$ `0tU'tT*[۷=p̚5zdAAz̙֋  㘭'+˻{H  ҕ8::dЎ  rp}"  8h  ȽZ/  r֋  "  >h  ȽZ/  r֋  "  >h  ȽO7    {涬AAszɿ)))]5nWW谰@AA.ތKhhhWt  ܒz7o<{lb];t"ׯ9sfNzJ W  =a_~|p'F[o=s4utzA@E: Z/  whH'AEA.$h E,vա'ORCPop׫W yU ΒΝuJJ`j6ǣx? EB &&33ǚR }\F>opsv.ʽ{meo!l2 . ^Q5 zșt&X^U7%?nH pz?{ R{֛h^իWNDjFdޛ!HԹr"{̙wo76n?Ƕ6#fsoVt|9a;7wb?/; vt =87ߌ;}͝{*۾!7[[[5 jڶR㔘ɹ{k׶MYrPiTFoZ:)=$OLֹAANOކQzpoz}DAuMM~jd_+xv &Q ,N[ڸ:\H7cQg_{wkBWڲVO7l n۶mѢEJxUǏDx`޽ IIUUBH3r(4|p"/ZJYTQQ)& w|VCDM $C.htUJk:-hՀÉ^  HXOν(*̊["USw:{>iQ{z^;n ?S2i%w}`0ܰgLމ>v~swWk7('۶9\"h>[*;s&Uz 9-m@jh(Mݿ͚8s3  =dt\ݺ-N!Y/Q[rbvvQUUU5j.fj[muPCܚ/rsv񪮪v;m?)r^;.C/pA;wF>8\֡)U4`x|Vgz?/Blgsrr<<<;˾ZkrP(Vreg孨;Pm뙬>e~qIk0|5+@Sy#zA{gZF^ٳg%bIXxL5MvvNaaJ{;SFFonnAeUʺQF9.vРtU?06CiM?񬏏^_"}vIs8XouIƷ`;1^uhld>@sv>4u*/hTMF֖x?Ľ233e2D"VnL [D"R,//PgMoΞ % K+z=k^͆ ܛ,%Bi`]Ok#Ƿ h0WUUumܼ{ &mȑ4BvIz^YqѨz||z3N- ngnա's;f]/u 饄&H\Q}hDpƶm۶'ͫ||Ȳ>uvro~wCήBÊ[V*lllZEoI҉sO>6UP(on{yrrb?$8H,gLyמ8k" &=z )QSS}.NSZU;t针 5xر#Gfeeeee_Lrw4Lvޚנ }{Kp;=6W(J ?Vt{A[/vZ/+.`4 _[OjuA_{7QjJ֨*Q64}˲e<Gmj~Ac& yJe͊ BBJ%!xTi&=5j]^n&}?7~vDAIOysۨNW^^y}&YA$~w'|sFܽW4@\]]@WU+JjMF`RiÝSxRae8bR иvBaJRCD[.vl 2=%ڄ(i]mP$#w2]~<ԑ!ۗ_~E^/>7:!DMF1kyVTVZ&0 ૯\pa;/++#F+WG]D顇Kc֮urIϪPö]^^$y)ΉjI'}/~ao_]qpDЈ=k rSw E}]Q|kZyfLo:"cΝKSUUUZZxE84՛$u&_޲@O&b?yeEYn.چz̶#E[oI3.tޠVf?NX Z}ӷ纍nm':hûzy'e5Ay{|c̚JLVpzE<1./\N~|-"fĐv9#8X}饗߹h{>瓎S'%Os͵˹\ رiΛ7F^ JFM^Y`#')3xbNꥋQQeA䞣Xǧd7l-9?~n~W_}>"p…+Wvbz=oW;jUHd'iLAGyyNnU'(/q+˪+NuBp6~A}v9 u?7Ͽ>4mӧ7\@.+L?YCzzzЀ5'O>ٹg,55u[ذnÑ#D|mWQ;rDG~]ʕ%drE}C=>dkk.HKtz}agFAa|b_?E~xGO^mضQ`3x4 {aÆqkL 2;;~1-d4ECz&&;޳;qpnM&@5g8"DQP{B]RC+;fkU5 j `K'OKL"J%pزy_~e֬Y%͛7'$tV!mܐCܫWҥ>>CB"&)W+,*'{E]+**_(/'th2<2 R\]]1֋ "hX) z况߮hcd8X{h_"b ,-4u+8 JHk3AGýDd;ԾNI+CF[j7g9-..&F,O}#<l///ggNK^^˗o֚N,MRǚR ȻKk0,p +42s6zi=D%R)yz/  B/O5Nxamܹ^KhO=  =zZo7<6<֋  ֋t;SZ/  Z/Io)AA޵kג]\\\v555d@s y E{ҥ*KhhhW$))-** Z/  wߔktttXXXwO  r;Y/  t#wzI}  B֋   w h  ȽZ/  r֋  "  >h  ȽZ/  r֋  "  >h  ȽZ/  r֋  "  >h  ȽZ/  rی/vAAŤI {w h@EA䮀(/6ɓ'w@l޼y̙= Nq_oo4{ ?~ \6V@:/8Tz @ P PiPΚ}Wv$u7?LĚf#k s^ qgI%E=~9y`akaxrNLy՗.&W ǝdz"6(T d?\+RN:NٕMIA۱]*٣&Rv5צ <@~% !5xu1I8qν= z;Zo3z.E(FDD <8 Z-\PVUZ /zmȿQ -q\ *mQS9bL=fyWqzZLS2փm/d? kf~rN@xߠeʶ^@o*ߓo'`4S@4N ! O.\6l?A8 riEЁ *= B! zײ. .B0k53ͬ r_ߩ4>O.ggeeukAގ ޞ~voU/ݻ7P/.Kzp1XhIW)xD8Srg%/jǙm&uf!Ogvl{mK n fmtJu˚pdRW  G* `Ԡ3a$x6 vLY Oy" ~0r)e,F+1ƌζLHsY֋ԟ Dyy/ 'cJdi oB:AQ@+!Lm̺*_!F6ża')96,"-2226nx'_H3sRARiLL ]''fR=n۽[_[jfxD.\рmxejԝVw2_t|ϥP1AÙ;rɲĘgX$5fSeQ$G th" " Yw$H#{Y@fzK1fKᕳzTf; sB6,i4wFÂKAE#oW 4=@~ged0!θeR7lЂ qm/W (/F"s&ѯ&**2DLؗ";jWС,L{T0@ h-"N°S %j3?Ef&]ƜR65{'If ܑ7;t*76KAqP"9z\q`^ ,bOVp Yf;|I `ėZMɹ?L9m!;;vDnzmz2z)h= ަϯbcc====))p*ך,oc|L>jM~{ET|ǚC$$nW.T]wZʌM|߷ ȎD*NVfh@x_j2WYBp%w,nZ (ǂ>EkdTWP*\E%CgBEw:$]rL4J6 :<:X0aO|x zO ij+> B!9qyKo8q^[:dx E~b,Xj$Z*`W \X&*hO b{ֻM띋@률"HϤ2dyy4eZ ސb-hPIS~)c:;s١= 7LB")aO nCHڸe>'",Lp9-tfqPg>&ZRji,0kd4ꍴI5 ,C7=fB";;!S`"x'Aן#  ; ׾ *hI$wJp^bW/D~wIw+fN3'\"a%p|NN4%c֭iiijEk]ߦFeRzGUean z[czM~/M4Wx1 !^Fx6?(т S#aZ6(1L(P.[ouwJ&W&KM\z-n4.|\0P,͈e"ðB;mF^- RKDjρ^a\gazA6ރ#Xd8^.`=>.4s* +Kk.>T-KwLѣ5myyyk֬-X[6q^Z/Gߠ۴vmU#[)%*\bj0Wȃ9 }2Z ̀0 ܅_E2Ԣg*,K *q(]w0j/m K44, x(3IJ4a+B:ЁiP߁Tiןņ.ɹD2&ICdlh!brJ$}G'qg3GK[[e= 217R7MϥJ>'KðmZL^Z/A {Չ2d- -h ox^X0QljMj_&%iXpm,Y֐7oзdfҥZ #HwamڴeRz{ ڽ vm2MMыnJ­+ zA/jgCtZYzVښ,bJ$[z}n) aoIU|5-B3w*6PLcULZ14:*c_2%&IW<߱P3ρ{qR628OH4EJ1Ƨ}6qZ|vKoj[)3om.sv+ulYA{֨ f^<_ n׮]ɿ~QX[6w*Z/֋ _E# X.>m%lF8j @&j5` } qi׮2V;eJYsl0 D=mA:D?·Wu];Br`i9@9T> q6GP;=\E{jJitUd];}R37xy1^;A|kmjZXf $wR YRWFhz(҇ fZL:RYr2V+4!c) >wV ]s^s!WT3[2pK3'&&\8 @s˾+S3aznzDeRzw{QQQ.C7i㖷#{P;6Wb<-eU% jLZe*͢Yx2+pOaĸDH9*_;`jG& ${@S`g 3f8kb!ٗ0 ^[ACY4C lBD%jiP1sPV).'#]b#,"$-wJh7P6|)[=FeX rftZ[KBaYo";~,`'UOӞY5{m=3ͭ\D/zX꯱W떊LDaո:+zwizh~v! {eڠ֦5m"ʹ~8Yɯ;uV_R= elyzn]/-WAږAOe'/U*X\ z}ס4j}9ԍhc9XI4Y1/gx\j0\׀-ٷ;D2Wd? /s~wYM|c<*Z% Y쿡_/ͅ#Zp&ֻrAShPK!{ ڬW_Kc0r|j $vͣAд]B\s592rau_zEVKR4JW2٪lUوF+d4I8wUVq?6dn0w< wb\ 7ҋڒ04]vSDýИ>--]5КK*.y]!Hzizh^Bn q7 v}o/ϻq[X΀NND|#rCg$N [QfG/;[Wsıٰ>θAU_L#:ES%D&fY3 gS>/7fBF!$v¹EԒe ar~ӓs#L^Fϻe{(dͅhEsYYfǤר5wT,ןE\\!|Lz}prYRasn-g=')zk>g"~ᕏ ݋jzz\c9?x`f^i!v;ýVڧL>MrVBT`_msnΪ{ >ϥiP&Ioz"#u"x F^ʐ:*/]P;$-lWklIT塀ΐ&֛9f'_dYÙ_ g[b؈n@Kle ձ6\jÀ~,\K G%/(Ӏm"3v<=ְ@o&} mۉnP^iJI;T 9P}o:ǎ;xz HzOi:` |n7wsҗ_NbRƇڳ@률"-quu4h-C֢p74io{x6"ڬ3Kv;y4uWIuAq&j8BJN7- k%#} BB@*S;N(% =;@dp&GX@^B]=NI4D7DSp6J6<;jgW 4[5p SmZ[瞃/f.K|gYTWWŕ gK7Z/Gߠ(ː6{eO+Qid:SKE[ie"2,;!' b!Azgg)IWh(T0$҈&@ȣb7\' 2@AL4B+v&D !Ie8=q4Gc0^5 p6 ΁q4ZL qLy)zUV3ٕLP+HK`Zrk}*1ZnY"K[=Ž]G?-\4W#1NTO PF4+4;?Ey h1iS ؁QdTHeGC*7|{9׻uִ~C= k=ۦL竓wQ_ӬAƖݻ^ Z/Lejjej.C~8=5\dJ-Lr0]JǎLS:;Tr߶_;®^&s藱&\zUxHd.LtL#Vna-.!P&D4;TDv=uG\E\顓qÙNރ.S$nטY2ރ0PjY(z 5B6Pt*Tz=wHz=W$|(z,'!rim.x? @b+%G' Gӕ@,=2fd~Ly:.;U= NB=^TW=Ń.̕4~ O+y9d2U .ҌFh^ M l7@ qکBf֬Yo 1X[or1ae\B6}ݛ-E률"H#e"""|~eȲo?ۡ$[hhc{H4 3q .Q$+SXtmS^$+n}R<&![Oaȭ`2+> F@P !h9tE*Vשq3\X2WÁ`2N ھfŠ*TÕphF[3-d!z6Re]u~ؗh(-O2Qf\C V/D΂ ;#I>$1NMޓ.q`"!I/#$ٚýeF(S'vofyH7lG+?l]h =k=ߦX-0e}^LD뽷_@CRoxj@K~@4zPj׉uu's| ߑ3T:(E%dlA(-q׃N 9K&ߕ3A꠲ 쯍 c`GT{Xh zHEP[C  MB_F2,@ . ek*P_Z{#{Bl`T1qv"5KOJ7IUArv q48d$[tQSB0AO@F7̟ `+VB}!m`#q+CA hsm}Ajz(jXDBM?v0,Z˵NPgԞU•<Ҥ Q=xl ,!9 C*ѐujۢRL9^&ė8K@kPҧ5 ˼CuNbR+,)`c/a>7;gg_Wa'†=_*3\@lv%9ktZkg{|ŎTB~5YΚʐATE7MQkSPVN|&ܙ%;Fs{= B\aZ*Q0gf9 e^^-YzY,'9lBa1%XoN|C{Aمq˭KDXJ'z#7@ÒBGͦÙٰhDdw{T.0]J(x*^2WipLh7.- t0E`G#W\a.˂@,L<~$>itP#‡>PBα\J:gSBsvo2r:z yp[ Я{,U/Zۡ5o,S>5q8IyC^?GG a~2~L aoΝ/y:%w(d/X2{O n@0LKEwgoKDt5.cr׼goRhC~``{MЩR0ޢ#kO_7`Tl &zJ+P =*jTL&d(W/oXCrN@DD6"%QѪT7/6 Ȯ:![!js1+k`d|puogpfZ_ԁZ|كHB+RVփE3fRՃQ, G +x!X yw\I;y4:Pb} -= JqMOǖv-=Y@ Nrj(3/ q[( TKOZ=TT5^Xw'g&qU}QjI-Y,y$N x1Xf`B$d!{8cnKd-s,'l O.uV֩s~'DpѰweCuNqp*B Y@F=b5/ea7 ǐ xW Ӆh2F7U!du\ "lK-ąBTpFJu<1(4Heh62DlֳɐI2duTP ºxr6Y79zSpd>LQMw[.6jbFX _&J)&WRbねbKK3qlY+vKL } */%/iv7Bc*:6ڐAۯ)Ր!*ԷV򺢖"P-b^|SD\*=UڊKu,~Z<5=(ߊK=O^BP+"cC~=埓NfF:}h嘶C'2PB*oƶroc2ls RwK/ 2#zq&,^Y=i'Bmlo)Z1ހ&q5gh>A*=nMG-[^c3ho&3dUMi[*ȎF ܋\(臁vb\t=U vNVL=8+63<LB4|mo!P,4tL&$tTgQ !CMǜ2b.d4 OئvFp Bu8IG%'!9etBpGh-YFhKr? vp:1f)XO(4F8/ѭH'L'H`4Ck QZ_彨fpu^jDFR :1qj)B%B*/* JFJEcӋAUo Uc`=T{Fۍɱ)vETeDALu>z౓oSG.åsWx Lkx>7^GL`Eչk,=id8t*V MD~Ɠ%X䭪VƝh$ewv'tA& l!']crMiB).XL- KL-"@ܙw)KTeODXW-tIP4W`+&9$l[쬹sJd8g|%Lh4>JF[ĔD?HGKvDE֥5 2 Yq_ R3A5?*R{b./l-;('&h[A~|7X[]bB+&zeWաd}kD?V^w{Wr-yMYĉUyu$U{xgyvCb8l@fi5Vz*:1Afi<EF/}og7 ~M.oot FRG6~zSXPsRi{Fl%r~/{1'}xgs걝PkMw/آ}צm;pxDz=,x0Z4;ӑa8׆˱7?X4RbLf'& 7OyK6UW\y|Zaq$00>1$zUJJKC jIU 9H';r׃tfG*<ʐP^Ɍ\[ L!V_#)juPk+;ۂJw`xܵw\%u~#g]&jtb0iڬgQjWWKX1z". ˹`knѰ7+}l^J'޶YB .P/mAEE u*|W,KtxR=ٯC0fR*1Mq!afYu88D.)EP&^bN4+EƈBrYf~^=Vj ՄbfLHAGEPA8S|(ΗjsaKqłE'yzᲝ[ظ jE-jyHmá1`4RTzrnV27yL`(o5>V:T) cs~D#6ˮh63Y_4Dh^APީ],Uc߷ P41GMw6Ti =p .X -DSUeTs#+g3@!,51&8`UMM͔% ]#Qt@WZ.[-e|0]̽B[r|ģJ?q/GW,(-p21/? z=y}i_XZ6˴bțn +P$f "5 [$jL( ňblAm O/o-:c21ᄖƻo!)kb:d)9#ڄy̥{u+Gw\D#쨙J8xK_BRʗ_ʑj_!r2{P:l$}C^KR Х1w!a.b.>D|w>w!Z?%6&k˦4tcx6v7-$t%,&'t$S0O;oߍ]M2I.,}&Hw;K=n6+Sڮ%gx2|9o8uz\Ǟ b(~(7-:惏/G>^*:VrO.>)vp \|QYwvZNί $~Ԗ)Sc >#nttZj+)U:FUJ!@p1C 獈'+H&AcWW:kJN.zN2Y(\L/d qmqqW.sKbVY YPR*w+Z8|!5)P\3,"m3#Ajz cCI8>{gwccҳ8vA[]h`^;Z W|VZ=bG]e:qs9Ŋ-b,FX ͮwpC8GG7{_ad/pe' <*&t\1Y wUVΉ &,d= qp#HyǛUkh49)Qa}romr۠81 aWU"AC<%٪a1y Fތ^*eK_c LWup[d[x~ՒrT8.C&-W/Lb{6FեX!&R(>| 4:Z(;n"qA3''[a\iyoh]rm3a=vLi,hFi[8% !I'V21T etbb&.$uIR H7f5SU 0] ^OqK\!k 3}ĄԻse\C 5V6t!v]hўǴrQ1.KR]+&?_|%7;~{Y`:Kg_9kss)ҋ4AϥH3^J6Nx 7>͈lV} N7 e@7ikQW)]ihN6_C5}!€fvMĿ~ S,[y9v3+F؞z\ ?}6> ݸM"CQLގYvzi;-\N6b4()An cQ#IhA]bfSIuj0EME!AV>H rI fq4[kDhk1]uQfnFQaiZ7D4ī'Ikz2g3 ēCpcL,%Ogj+PS_VPYɸ7`FPkP:1IF/c5J<0C =˴>g$QG_Xw6U0Exjp, -]qnZ=ʐ-/ݖ_zg;-Xu;v8b֗_Be=t_+X۵F31tI[fL#,9|&},DЙѨ&-̗V jJE4.Ό8oY1!iҕaҫ&߸ Cvw> Bw>s>V!Qi&aP*ji yobm|ڳ72vgi^uQg^ J__i2e  bL2擉Ѽ%5#/$:%[-1,jB0Ms/W|՞7?Oe2wٟpβXQ-D5x5H.6˗VWx#ReG4}YbU WG:`NT |U{ZCp#zi0]5<\< ʋ^hđ1>)vgG|^ 7.9G˭?g?f!Kb7 5?%s~9+V_^.P/mA%0S'Ƒ%X1IBdё¼~f$`Pun؊uB:FhPtEu1x rյ:DR#..6L& qcx!%DK.F z@m&͋KE16#L1 KIvT6nO>xJPAQF02\#pE.w;[2תNjV-}#֣T{# a3&#qގ-꽣qĝ]]o豻bM0xJp5;o)gE%9[?l |9; 9).OJ@htbpRUf$229pm'2Q9&'!a:M~"C=&f4Vqmfh.Ō@nH75 ph}ڒwGچD;/~EaD|lY{zJ~dZ×il{7Of!MD_ݯ.Ps_"Re=[.'BdqpN:(% hs j ees䓧HM61pX06aÈ64 um糱 _{l=Ȗ2[aQE(!´h~\jRhMdOدx;i (DHA#E`OfEC}>EW; 9v5¤|.:%EŮUWڶCd]-E}8P_&^ߵl T 0\F^֗I)8n(XѳYq6vXs-Jbݗ߱?kx^'*BNZOq?z?ͳ蟈wSY³w>< nu,(Auy>s9M.@]WW|([e d-v>Hvk^KHRp -K GZogQ/4aO=k#GyqG̰?2D^o%ܼM4={oEasr;Un'{VX(bZ\@ϥwh5+d"#ng)t!Z͉Eݜ2חhULVW=qF ޽l*cgZ:vFZ>kX\3(yU={PNpdc3JhRĆ5!}jZ(kMz;XNL$Q`͚(Mmy r)fHBܾ a2 '=N5fԬHl}?xR Z ;>@0¹%[,ZW8kN2Yt4/R~ZfGr;TOB*)QkQL/6ASYˇE_/ա=@ק~`Ïa(]BfRvW|=u˨XG*?-S@kxrlĭ< ě ._ԮF g~x;5gKGwc ݕeR<[ZhӬqkq"gT.뙕z/P/oswv^M\kٲw4?]43:9l\GǗwTIPB)s;UU>A\q?e>\β1Z[HzSCIlq0(Fq ؍U`a(˭:{@=6N;c$],3ST:ڌ< ;$jJ&ZMJZqr +х}bz0L0j-6!|HQj*zg.7xPnh?-%(Iuu7@2\=S:&5.LFR(~xN/KOZL'+77/߫bLG[;Pl?Ou-;Twr7,WyYipF_wXL{^mEPmJv<$GMW i)[KoG^?ZY {~gҺ W.j(Ov_K==bDʣɥ5;ʥ-5^ARi5`2 ޝb,#4ƣ$Cp#4μD%TjlNhK'C\euK.m\T5N52d8v[H-90}_@uK-_P5}8jVH';p'eecF<Ȭ|7H^j=aq*J@F)~7sup\ u008T-{^hVHtblk cPeMy-ri%fPev q2/݂ %W{{yĎ)^[е*:Uq$. -K* nފ2R[-o ubht FͰJA &F|lwJfnMܻVt!Ѕůnw㨦凙w~SQos껧=,}\vf3u9;c6 ka>3HIwu-_=*7.j*EF\7r 'n,ywR|Q~\O/bKf&zV\2΅Ζε n'ƽ= w-#ot;6,1}~LɟJaIzG]j\o}cb&ZuoR@h?㳘]**Zf=YP$ͤށYvzi;Xo -d7bD3ǃ"3#Дio[ޔl `҇Dz \6{e#Fm}Z9cVfdRȅDOF%kgwqA aXJ{_P>Әʈ\:E&192$6 Poɒ_|t7zH.ZL[lcAdœuQkȥbX̽a ‹_kєv,b `t"(HtXR=yBkqdW+DY\MX)-H0b 4{)7[&ILΧRԸ5 `'F10i Ņp[)[<0ƐcbwrI,%:E!eߢ~˙shbWzeӟ΋|o㪡9c<*X 3 YcRA&!#6]KnW(܌E9{>p1$lILQvp9L0jČ[SM(z[A%ԤHtROqΩcP({+w2 Ԯ#T7l;Ltf$V$6I,ԭ _.)HZfB$FUɡCh)֫hVHTjF ^^]"5J2W!+6{y؅&^G×J4OC+n\й?CZwtXpD͈y@aqi57̟9;t5 Γ=[-/@hԋs`[,EoeC?3׵DUg^ : 1z9Nm5>.5xIBGFJpڧɎ[N4/hY5t<:M(ܰ7f\`f,(ʛEfՓߐ\ڗQ =I/5yŕBf$G)#na;b݃Bv2hzm&J KPJm(w4G;I̼Jg4kn]v逽Q7PEˍf}zT ::FkY'UyQXD·$/2#TJt9fG%{cMP9H,9娯2,[MQmn Gy}ULFƑH܀u޹>56ގfeEdZ9v .k[dqj{$CV^U>S?%|?e]gqYk9EKLuאq a^f։vL;VkMrK_1M2"M@D!Sm4*t *'k U r5jej p9بuDC;nR_v:YBUФ":ZrEn .dmyoe ()3|y-r1ܻH;qT Kq\EP޹§\1U0Є0m]bzN%3]E!גOf,xO.iKJC.wtq=RGBtIyHx'j7?3QﻱLJşzOpt]K;ݟoj׵tUpєzz{Q[qѪM`k1 3=Xr~O!{dz$}SztG)uGeGme|5Y]Sd~uwX??Zc:.~ʌs9hn |c<e!v]L9!|B],Lz.P/o^5ʃb 1zEfTǩx̫ahkqerM&Go$c<8U';: }5*K)h)@vSr2IvĵJI oiB΍ ,eDȋF"la {2|"/Gʛ]>^oz*nx9´zT֠c2Ae$RapcKV^=*6iR_;_0bT4[/{1Q)H06aL5>zQ65C:SE4$:1/JH FVMNeN"%q)ӏ>p+UfAgýc !*-rS1B~o! ~k|G./>5" VN4d /Ů'x'3AH /8oҮ-f ɴ-(kWNK+?Ls cd:4Ӹ?2B̠3o ;U׭S38 =b/KT7X0xB7.ohASeۇ2y Jy8q4'ql t[؇ߤb6$w7wk>=z:=S5BocWP^b{2/&{'"UW]xx2ZXMҧL3k}BOz"!+@=+o)}DLPݹ)<ߎ݀猈o%~`Wg[ෙ\kcs &褮a.Ɗvm378+.P/o^ᬹ(wx蝤 N*ԊO'=.!sFt𔵳˜ڇ<sZ5:o:ZI㡵  MHd=O*Ay0*Fo iN 2ϫ04Ml22 @!䙌xfX K9 ke+#BAVcZt<c!TڃlMK"U [}e+s txA:lKŋ.Kp蝩jCvJ{|d@#9J2S4ȝ֭.)JJKcS M1wka5޸F{x)3ϟ98hj+F͸kS=2QE bF"0V4舢*zAfE oY\CL)*@X!R5'=b.D@ېOV|H^'瘶&EDl~,nP}̨w@#L{8 6^Q=Z#ўgIe^ fu.q1J1g35$0I9/0\uv{1(%_{?U w͏/=MbkJmЬx Ϯb_q>>|b= ǓogT߃)3+@MB;nf'cN->E.EA!굴/.-!jk*}"X[Re6qKn}_1l.ըoVݪVd)^HCxγu3t3ssYBsv;zkՁ0􎱩ApF;?EKJ]C:N^ܠ|nduAТM-cv3diҗ7x-A]}'x58f*x{f@ioI 3`v; p)Ahp M`"T5TT IpXSg9c\8!vsKL>bڇP;*JDwF{d`WlB{(C:кPkGY&xe}@֘ PFSZ 4(1[Ilk#'P[Īd9OX [|K'pK3MMFy"pkӊ)i٦NƘfmJ Zy%M˭e:GZbֵ+Gɻ s>d]굊 |Od1E;SI7qYfS){Z]sq?5%`1wOȌr^3liȿ7%@䦨8Џl{EyjıO5?[L 3"6Ȭ*&djw+NƔZM)DZ??Q8Uݰ2+ woNi WOlbgTߜ*uLf)E=U~Eʾ036,%9S3SizgvsZ6h.F%^c:ظSq2_Tz QyŠW7(&~'Nq5!iGEwX0-(]}kbYTԻ(ei0fw3%XVݖEMQt#գV+lPR9Ma΍՘[i_b. ZC]2Si"n$tф6$Gr7 Ӗ%ʬY>-e,иinRv)Iu`ar$Gv4K,\Xm6NizS>Ifv,rsjʔ[Ѳ~fgl1E  bhygSe=Z:wa!Vn24`8x}udyZډ,Ğ+K%m/c65y!EZAIV;jg>Z妧3O[3W3S\'?.l2o+w ,pqeݵsRuy .@Bd'd?}^Mdze8(OՏҽXg%D?78ob2.wz>xL,5*jQpl-*=h~.Rl?Nq# 0D|뭿7ʳc^xa>YgWZz}uX@_׿$Dž"ꀓr*XxҴ:-X&fq}`FF?;H_l1mwGߕ_PieI-^k'zЧ M9_C_cS?z[tq7<b=4=w1R*s]*aЊ+," nzM KyRoF1gjqSoxJ4P{Wb&ÈP}*iHs`ncJHTK o8M*͜>ݰ;IELJ"8IJ/۬bi@m%jq8e= JVyONr0Q,YJc E#L|&Qo( T(*F`zB0'2}KK7?Oim%?* yЅlct3a(D\"X/p IVTL!t: --ikىk‘cpiUE5!{В:4>+ɩCJTN^iS7$DcFKKFHU g!\vf Qjlٲ5Nl/:~O>5Fy[{*7~4RR9P*۫nվ7zZWBɲ?-.P5Ҿ0.:z֠p9K1v9T.LxN7;)3l{n ^.n$/7q+~w)(7qKhxfyjY+d&&f^v>Tue(Geu qR6NJX79jpv.c; U.8t$3aD`#eY =.ʆjՓnXǑ,FBDlQaJql%hQ"ZY6L#L$n0GcY6ʓiq%V@,;UQJ7Xgln5s*ⅅ Ga3,dũ vs[j5ZM.4SK ra*F~j {5_tx~a412|xi(le.a5&ZQ" ng>$ jX(#~jz.f7:HN<r(W`yWk/_dqj{$C&ںTd8GDkL6ݻreO-}q} ?[Gj>DeJܘpĭL K K)B`yiw;&[|AcE##xtcD<5 g_-q}.QK.aU S%9Fa%WY1ŧH `h3Qg>K,Ť >.pקYOQŌݡhЂ@LA<y$^2hsO b.oU=z-)RP$j!s7rUWx[B)3^o|XSj#'U9Z*`?D4h@eOY@)B]N㲐DTlWaxZ*SYesVM=!\ZgK{ױi9%5y16O֗V6k.Y/x g׽ h.Yɥ"-n/J;ۿhQy}#-G<ۿ֌GO+tO,Dϼu%o9Dx +'5 LJGEIaix\sӂddᷪ۾o]]W:q[5͇vhGh[^LUW㒸=!U/J1+2~=*Ȩ;Fkq?ף` MF^kȔP{|x^}3.{mb*⡈)^VRe;bMž;q~q&u=3#kdž˩}\ŕsOwOA$" h2cൽ:m 09@HBBY#$M43=sWZޙիWխ~fZ >E3^9K9ԋY^yɖk#h2Sږ2In"*l@M= 9|1 nz¢eAYX!#AO9a!AH C8.phxOpFP"7Ҫ`4E[dqyb4/E%)%^$'!!<`"#EjolPl3 T6=DHJ)s2q*8HA[i_=ơAga r4g赪بpm\ͷiy1Ȼ؂Rx0@ 2PBcw²L6o8P~(T^7X8EdYQײgSFh氂\EYzQOods:g󇫭FU/d=XԹM ;A_kol>ғgԞֻ>=2F3co >[3#*P9(;xX[m_$W ŬQpiln۽nu 0e䉓Z򇒱"Xqi a>+ I9a!ᕥ{0\Hp7xBӮY%Nfyw98$lN8s*xZndUt`rDʴ7cy.0aS$9j/j2P+qqou>I#[L+ 6_Bxs쬄.#zxLgLxǭ<=.t-J)XCZ^Hh,d&nhgAqW>G]"̊ajSBӣVf]^ i3DGuk-FX#cuX9'|}nxM|$qWؿReh\F*WSX&4TV{!GR費NA2CG|Q*ly4_Zsg6Բ\%z=P"` =zpʧI ӓ^;5t;Es{j> '7L^g^rP у]_} .aZt[;e^ {z'vz0 ݻ·_Í=P=  _ k\cAevM(jvgݩ ;!Zʌ#+Oވ˰t5tاa *-z,l,3Lfmpu>68S~ քq{7ۍ}H?(WTGy:23og~|UǪͰ}Cqi96rv7sF+;z8z8 ԫ&%ߤH0MG \0n3;f5$`<8 - ȕjז/ GÃ4 @nG[vn6P@-]PeDZQ!JOj5ZMBR+3(QƇb3Fd9#g qZ>;0`g8֩HPf8J NUC1'h$bg6#h6P9Y )l:6C u%Cp<1M^8ERv,xR>-%x0 @_ g+6 FR]w^AGI{ s@~AQ^ Łg E 5-bCu{ząLJ {4OwL|!9:2B~Zd"׿u?~-&DCwK(vFϨ@16@gHG;ego4,v#;E>ꊶv`SN{a|m&6 چ!DFy%bJ+ q=~ՉL2քThwτ=Mp6,AoV;cVw8%BSsݝT9 yX#}% \.=#Xn-TET7O7Te%@ @DI_%Znb_$+ 1xI0ˠNBLAOdA3Fj|E1$L'UuD6M 4Bbf#@*~K&BAYGpɾfΙ3ho}y:ķn V6*^J` 1WFUˢeoI\n; (ƥVag# BAh(}91Qhg@ |؎M=\iɷ:0FJ_J)q8N7zv'K0۶uNr@wˡ;+@ =ATjإJ$6χ/~ zLWܯP`~>pVO!kNtUjo>w4ŃR:fr2xdmFT"[J)'^,k}AKP ށ+3`}[8T1o] 5, Fy?ږ#esb_XcН%~;AyQHG4ĨXs6|P)Qco.߬;F4H9;+?#MCtCx$$F.Y DNB&@e 5}R8,\8>6"wfXMx*κ1 RϸA$HntIZ`kC)j(b8*1ˮSZ}JȤӲhT%|<Ӓx$;G0iz ߎr8Lt#˫WR :P\ugnchl JN8L7B sJ[a" >KS`Dabg: }v[AQH`XaH#~3?t!°9x>z bt'`Y /4YH\1u8 Cy&OieXW)?RUjsxԍ-00G-kCƢiɐΞUW[W!pUݢ:7 ёW2#{:݄iֻYIn*)O0g|aN9e;"q\B4I誐2H o)ϫ3tg?]l.F[;SЊ/ |1C=-ܛ)Ҷ˱LHؚ[o1|܌$(wb_-+0ηX zDvk'fˏpc&;'X33Xti#^Q>{0H~\]P?2-av;Jr`g.-B 56r+Wyfa GdtqJ{XK -}iS(ԣjFyN'nQɰhE)PIRشA߷?P&PFrAS"D/5jȫ T1œ4!V6֟{^vԺt6֋RdvNEe/K~SS$H:1j"~\ O4"ae!͸UG1Q,?[o(itNxÍ6ImwWÃ#aY+n4B.pC]X"IKg@)*>$ed2S)'c3"L@"Dh5p< bΫX2 랰t1.JR!VK`ل䇁d̨8HZҰy߹y՜1ķ‰P$CZ1RU4%SLZVҔvTЀ==y^[|hY'/uEsUqFS=i '{F'وzܗ\ء0Swwc Hn~- / [aUXγ1Κ%X hE| 'I/Kw~{ +U 1-(KN:ή|QPXTP]/2pxgG9U1NشExyxpr*E{D,Ҳ+HڜLD)]τf9>ATHOwNuPsN̂b׹{\̉Iݕ)P& lƥӁ@ٽ oEJ`.87TLj K7cs^9 $2H SJq>,=\nJ/bŴd1Ctz#@ kc߶XT*:µ8q |dF^>'6>/kp4 Pz]w,Ʋ ]A *D z:8E(A e_f Y~9zIs;4T?!$OV VDLfY㴦wN3[0J+ gbj١^L7}qqybQ A ,ob2#>HP| y QtFZscqmE}= Lt$dpҕ[Og-WCst 9F ό"YbĴ *1Lye BI»A.׊hFǨ0"+8ax׺q\2dIxJ18|#\^$Ņ l2b$X@ڇoL9deŦ")uwyd̍pzQU)DT6$ٸ@ f#UEfˌ )]hw$Q8># ^Xp̩ t6V Aa[]V^G vL6jU3j Zf괞Ȑ=2I/}owD||o͆"s%r3I"{5|1Cm@Ԩ05{38 6(:œqamBm7cL`쇍{*h?@AӽDHEN8{Ѷ͚9vHY sȩ]Umep„;;MNIQ/({NI:l%bzLswJW jl)lr!?.{-;mN|{䬒ݘjjK5ý;czH eu5m'f%xCM ?rU):e7buX qހ_DUJ;Ðyk)or>.#*O.*@&W\S7}_+^'שּׁD < Cu"XE8{ gxa,hR0W?}#\@q1\9eL}~~qkK/s׸Km 0NO vlC }Rz 5}VeF$+Ow5qC3ss@.F `F4k3"4Q?eNFImzŬOp[ں!ڎo-Q2jc`>J!AvFX "(JhYѳp ! Adr3PMm5˔o{El2K r ~E`g"dQn`D^Yҝ`;ʠڣAc7[lH JzEa#:\eMᠨrCSEY3XFfJ?e>ȋ *%J*Hci81Nf#"<(uʌZs:g: N!ߊ%!)+h4vO(d飓=ž٭V5,n8ÀQsrPI—ת2Ӑ!*bmY' Aig~Zj 9_B׀r̪NκjBεjnvC#Pz-ѹmgN-@]),A&YdN֍`H&٭t_~g_\COtgc „jRhsҧ"A ^gl:<v/9Gv : F9Cy W_΃wY1\P7Nƨ 56yOm;#JOY\V%ArVE!{#֪wVaoA챕tyJډО;* 鞤=R9>>i j晱ݹp5e\K alL@'LZjPP-9AdƫxHV6ʏyp#gaޤjzKIzx2#7!lR9\ΟxW֎ om]1;3T,.${cvnG`P< lը5t'fpo<`OmeSG-=U;gzMgBcP/P/gzz a?im 2hb'hWK:ŒSǴÖa=hP,^&0M /WRT6CƀRvN$BEꉙD-azx9Ʃ7ȀLx 5h؆f7ӄNQ&bBV^PЮ4N3{ѩ!cJL- 8&9*$')mޠ5C8 17ɖ-jZ[4,<(ҝ#ÎCi8Ҭ*b 3i㩴l"Pq!II)SPiDb%@I ژ*ݧ&qCsg5ЅqMA- nl5sGQ|3i&ɐT{yg}u_ `̜B1nª:j֚,`d"l':)mDYH'=V$݂ -F Q8}D!@H SK9b.]+|:|tP5lV%+ ,3"(s:^ĖŀQlsQLm%\,l>* Ijoca7ڮ'W|42'nDv"rՅ/Z" WN9o6BmƭǗ2)ҋ$p pS rP6g͢[suBV"0G#û7U C\-noN*aA{ܷP3>\MYo.Ow0/AꫩG;v#&Adw[֌” "0~ X&5%znNmm7OI= sXYBFbz1ϥDL^oYU_G7Z=L @$}T'+ԁ+4C:Hcz"z~ +g67z7Š-o^w&%_;)Po5ӣ0Uy[i晞Q^@#V? \^&Z1Am~':˻:57l+(s.=TMI@J(߼'.Zj\K8=,fq%"7Q~~vRu&;yqqe5Z<Wp( 5n嘹R=`h3MM ]԰($}9Պ$IRŦ7Y89 심'Ւ Is++:kH+wCa[ 8jQd2RzMJ!r_<`0P@efIea)9º%DZA+t&@zǞ*Jˏ,_lU|0m%ci)#:U2TãTGzǐ2,cC9^W4 `a:E2[ĭh廢],Z_h> O69L5BMdO[~YS# Ga9Mc uߟqeQ+#͒jQ".բ@}7} wb.%ֹ4MfDlҌ6 T(UR.KTpIYqoPaV*+Y[!Yq$} {t_l%eq-l~jϭ8S Uw] p)^>>rubҼ;a--c-ʊtrO8O^@#&QD|ן#$N3 "R&*6#*EYWȉd)xF<əG2vJs%[Anx(2ًp٦WPfl U2VߡJA].%_3Gѯ*E8kH(O}(;!-ɣE(=J[eu ey08;}UɍF׮g(+ǨkQ;YƐꛞ&h]X~^3zּ.C[7ý\haJb ^{5YK^KUEg'^zkZe0{)iFë}X;EHٵ[.gknEM7S1hk 7Q*i9s/(utsP=6ְP\-}åtvVd[(q7k:\K281 y}FM釫 ᙳC3މss@ulFK*|rY<$//llrlXng|C/zaD̘Ž9՚PLrK&2#fh<é2s\5t5DͤHl$c7rՑ4e*cIuh_QL1 .|䯋S0>1*!=<o7dTDYfpu͆01nF]UT>e"NE TrLQ* < 3Tkld>½Gf|뇰ᬂ$ jGh F\+>7~NJX@q TnrN )+gwq60y+lGnmBv@H"b-kP oPQ.셏tP }i>7t=^uRŦjУc={Exc{@sD^tL$p-[DSFz ="O^%6urV0dC_x dR< wduͺ)趔BBuhqg0@ [HI]{-kԆ#o+?Slg !5TE 8! ;H;I]3BT&Rf)j$ טM|r12tլ7'^1!^rJIQrR<>+ T)j2=7HODF[|"k ?+}a6NX++\#pt*N>i[KrӶ r7АњeY Ox[I_ԤP6_Z g }]>'DH93xEMQ6lrŹ wq閱7N7˵ê^{}w!`wlqak;[X1_Ya١^GPss@%0UU2g`dRMą[ gneœ*y*P!5c05Ir.$gSFZ֒J) j' шcl`//m_uz'!3Ui@O/:pٗ3c/3 k6Л٠F,Po*_ߎ(tCh9}E\aF ѿfFq#,:p*3,(7`OuRޠ+eDYS[:C-k\ac2RLuv)ܳz Y/gK(*aF4aRڕP5(M3C tW._j- {33|כajt'HQ*FaR4zf*HR1j}䋦Ŋ*89oCNH?q|ez ZjxR LXۿPɓbź$6REShvZx-;f@uXi*,+܎.nK)-'8l| PLwйX/P/gzMӡޠpjESM""5Cvס f#fw5`TR F`` "<`X)tLYoAZ, 4%p_IlɩI Q૩2^ B(8IfzڡJQJȪe6CR!qJ;| Z[>T qٛ@c_N0=D5G ;,A|, *(.;ǰ~떱l{· mB‘Mhy֘P}|X}f'A=~lZ `\ฉ:v>bsw"wT?dMAuReK&3;4qUl(!2;Ǩ{ ΄=y(d-<ĹVPa|E7}Hx.-h:8xqqWY %YBgĨGvh$$g MʕրA":ڷ$Pq,p g):4JVa426ƪ SK{$^yi݄+iR >ka&B`)GRR΂OmibP`Eo^OspƳ^ܖGUs'+ΗJ*"m6DHx/ҍҤ=; Ox 5q1JY J-WѲB LKh oH(TYp4 |9-_Bn:$ k~WGjz?"\/eq=eeZ5u?zݵhn{ 84q! 8c1LW0{8Ԉ_¯Q#MO`ؼ‹QYt\pUbd 'b%t8U/ح`פ;Emb(}:3`$  |{) CuP.l3+@u>Ew p 3 h?? E\ ,H1{5+n10~_RgQ;LV 0*sV íej|v&̓oj twZA܉fN {/c$S kKMT=<:Z̑zτzCxCxe 5r>&Bjg:FHkv3M$`f`¸(}kPb!jL(YQo2Au߳Wf$~6W1"GoLP,ďw0JQ<ɓ5'?W7O֥%U7 *:|@# 8ۖJ#yA3a|IP2p UR0x.^(3 CN$_-Y1^I}"+s'D/zWJjyE LRw]_. c*QlR/#̶U\HUe}C0^b#9`qy!ӵdTBVD[rSk$rt*@4*bFf"NaHv rzn:2ɬ%fgĤ;cqu{`3]] SYwA8︴2+pE7WTT}Oʯ1|+5NJ=m W{^5Î9!乸 } {&[Oii )#8XmVEqV-,JzSP= p[3'"Xˎ z)Tj$Pߗk7Unn;n0 ~Q zНje;!3\tبQT`#ėE;4MOAW(rI0b yd4Y2C댡tZBaV^ _ Lhy_&c)ޫb~n&TLS|hGy#[bѫ,lpj6x۹h1|J??VA-;3,ob|rW-o`B X/l:Hn%R>z%mN=նQ"~VSoc\[,5ߜEOt ՂJ iL(Ha𒁿hPJ8Sh 0}ƉvD췰&P{ ux GIl0ۑ$%@QA4 ӇDHKCr9'\p0K]()$+roNhc)fE*ɈӠ@1@/SAf, 0(=HL}ȕ2zӬ.W̠I M|tB| j՜h_  e̠(L`*e8-r]&= 89ykq 6%Y+AP#9un}SuJ!??ȐAR"ZݺO*kJ lT;cj)8"l.ڔh 9JUpʽL$S% qRp%{U/J=ϼLiyGᯎl!áA9빨 Zqb=MC/yo >^hI@ͯ[%{ ` z"okycQvDZ֘@J!@e͓$5nŝj01 -zV4/"5Ү1YU^Ň(5q3L@`Ҕ>s#׽S$kA(w**Qvi%S)|. ވ,Wxy8'E(M=z=аkAS[}v ̆g5ئ[JkT"j)b2/F/C;_Ot)!3^Zlk 7ȓ#)W/ڝj uu$oP7k wW?P?p&.v ⴺqR(n=jжF,oE&> p}+nQey3p~YJ ۱6)Iᦊ*MX{Qr5%ӮC#Tc[cK`+ە-C`|6T5#Q+1DD &!-H62؉Q"5z\{L(ud ή42~3i;Ip'gz$m]% @'p GTCJBZFc1 mҐ OKD!5)dIpNdE: RIH I!m(b\SiBj8%Bf0q4øNb2h-/nJ٧T@qҜ:݄kyYL0Ʃ%P\ sFmCQE#F`t+b,wb<4h1 p$0 z ЁV@uZk6&Td"œxHg`" A, T`Հ $@OLQ޸ly.`\xJs@9Jմi5f(**;m8?_H%OARDgr(2js0([BY'>wsIǕ2 \0A@zm D\ ">4߳c*ʛ18R\&J.V/F8FnA;ʙbh)b%QXa FXq9NWU}%)9g>%&w n.B$_]لZB+8NQB@C'욇 [CG!LeSл9+6GC#N,iwY]I.[&Dfol@斓MJyӋχQmS*]0ESpuf>uiӋ!THcppն{{t=N>X]aݓFv6l8V`ZP5atw_8 :#u@PofZ}h=#A@ DGZ,\O\Y0V`U@\sr۟P/zM) D!P tJO($FUI(Bh.tTD oKNAA6^ztt*g2#[/q0D6@sNa ^昊!:' R`8 fmjS+naXH;!=0q_Z]V0^e98B~ihJ?uRʻÓ$@6F"U =1ᥢTEt[ÎnlmҬןNfn[?.C/;aw-ȞʞVA(eݶJ aIbu+n]8 y]8E ˠWz84] yщ^TBvk"rug< }^243%iD u#JYP?&xt?j9F;iS:>tEzd"sմ A_r[˝zF03Q7g(Ǘj$?nMY'x{Ƃ KDj E~+8 𮇾9nOk{^&`ڔ#GH+c,c"3z3\.KR[^ond+Iwco^B4G% >6~tp,kFr~;?;;bUwG>{a+W.L`[)PO-#faBN{ua֑3]m=h1LZe>NqT@gطoj{V MzΐX<8i3-Q $$Uy1QSaNڰ Yo^k}FyVpob"^Oxh!lqI K#y&nYmF?sg0˂{>ic.Po>/̍At—JMb ?ŒӺՎ 938'-Ԇ5:?[-V:JcZ-&Ma~˸f/%nCӒ7H",,ڑ=֪v2L( `xK=klQAE%3}fo^ÈgsΞ jy v&':^2!]2 5c#9qw.;#܊6 .al6hCFPҳߺo$xa#ݍ I"8},T?"ʳ񱨴&$WB_N/Xr .Z쫱pǶY]/59Jixor̲Q|$Wzn=zGakkG8/o~0?GDwzy;W/n]ω>9ȇ[w~>_#F^UW&ƈ'x']?rǰOX??/f]zh_M/xtEc?poo8 _c?rˍx_ݱeqg_|=ot;lޔgսq#ҊW!#/_y.^"%3bsC?zT_{G~rOE=uݰym[oG.5VfOś//GTԃ6`֍y_8\֔p{Whl{/v(/>բ//k>啢z#{w?x3oK fgϞyOj>2y l~}`}Gy,e~Kzry- BHzWQc3`Ef9P4?Zs*}zTԖ͊u't|㔿@m~@IJCTNsJK4dv4Ի)D>W`+.Pu`9/1i]jSnC`Jӹ1̹#w|*aœoQ=O}o }WV.v6u0wRi{i3pȨ`ZÔ]CF9]Xf ?Iֿ)kn4+]+MD6⾾NXĨjNBJ>1SG3j`YCæXO~=J]K3ᓘp#JǬ<׌5<%toWC7C556eOr\*[E7\F `sn?X LB3f)\WKE/!1SߓR wJX3w"ӓMu M.bGExWL{2:-:kg۶gUW/Le֨bAn&FscEd vc;-8FH h]SDM Lv8yKMO|o6yHY#}6XPLWh~DUUqnL3ulJkԙoC8`9C1/cxy𦤧K^LjVgl;ʾR(Ik#cr<~E4Z[ղGBBEЗ`&#r!]g{tX+ 㒛-fm~+5cv7zPF!҂A31g41u ,*.)& IUp8N4oupjNA-|+0$pILU4|4lQ9^LEC&.|%n:X;BU(]#*Upsr*~'`/L" ?O SI n ou}+gm}fj1d dc,bk0ȩ@eT,j7<'{yPRs4.I I,P gm\cK? s3F;–izCM>:X~SO~C~C*: w0D SHY'*nu"~],b] ,m/MTnWmRa2c."zjzd k!BENmNh&.thfT}Xt];NQS{#H{;?>Ҍ(/3WV.*~7<ٯ i `"żG_I2hȿ`̷#`(P(^)S(3Hn҈ަ%Y7t-QoY&I.w0pspp290m{֥?m=Hs.~{ "$I6 HM)nWǦ]15'[Պ]WRkbm6B4  SV?[MM?-=HWTWˊ4*6ރs$_2H<w K!F;$;wiK+K6[Kk[mdDX99VDE#;)j%/3Wa37a)WN"} "YLheF }}A&~E~Ήp1O8NPhbMoFN#v*qPQc9c:G=  KHD% h6zLv*4#Mpʨy6%oXvjhЕa<2 %14N_@Ob's,6_) n)w_|h@'",b٥3I5!Qӽ:艶BXI ]:-R CdF%+%#.ŒX܆I]dvN_ݬv4 d<Ӣ\T(f+tt' fTylC |CyC:Ehg>r!HkE "P. %d?}=M|*>K T'$4JMaҪLbr!]'eC"B`qߎܟ! K;ny wT?J!6vlӮcGǮ _q{@=~f D_ 8R#jp4#pI)>M?f\$i|aѤ~;n7`ܯcm .?g$>z^ȥ7h?hV]i/<d$D[ weϪ!PZh G_F^-[Ee%Qs4yP-  b+~;}3w%cTIPS㤻VE(_=Ⲣ03ȴ׸VEY/ZVz( wZ'Ay Ñ FQx~ e fgH/NrmhedJԢ#GJC=a9?>eY*}e"tJ",dşS(W"&WQX8SV٘PA(n٣IPGb|{[eoI4w'# :~]yQ\j_ar&0hů@]D®5zj<,?KmjWqZ((($RSlO+d#07Nux ݱP})T~X=ax8F`a͢V[L9&"01 W~@\ 6)UDJNf2 €+z>q:>aH>GJx?cE>'P?DT,i-]'/)dn4~l6뫯^VQM;VZ[d&C٘'EH}ԍYDyX}/s{}U >cqVy L<fBiQT}LU89\WHe6V*#@E zd 03FhMǩϏ=Js Tp&O YF($i=3!xX 8CLBԗKqCΧn%|љȚ `ٖ/SQ X=y ZKcQ6ާNjKu6;pKJq+ E#uaF@A^R];; 2B~7וeQ'Y[J}: Pf3gUl\)g>[V:zKNzןFtC#wGpG#ώ 6$nC_?dcd R0K&aRIǰM`Y7[gŚdDWZ\_m@ܶ~kCu jK:==[ C1Do}=ܯ!қfA_1 t!PSGOwuަv+5)嫃(2KFgNrX,펖hm=,q]ZXw!TeS^k'z !Vv5𢑣2 T$%Pb@hcjX9p?9 _2%M[uE'''Po {Ogj| ?Œ7_ꔥzF Ha/ XӈFR'0qgpLAޭNry.31' !V'%< ̝tp 0`$_$gj ~4dlS2T qBƿ%J̷i,ý$#VIEOH)p%0M6E16-Y3ly 3t%c\@e;"$R"Z}'^/{S! ¥bĎڝBUwx NdףȾR}|)_QWzB8kϡbKJS \(2E@j Y8z|u_Ъٚd(Kqm?Aib;% $eYez 6?Ã#^mܣ>&Ny׼|E)|43hu.3.I2TDp90c:y&܈*cs2%{k(WƵYjďH%gq3+S D?F٢_xB@-20oذ'!驶9Z&$$Ftvz#^^׎c<4J=2fnD#%܀z nG/M\@ze3-`xdh9@r#I輵<)E;@\Yzջ ]͜=cEQb2MߎcԤp`F XR@ۆ 1 l6O> W O7~pHL:qݴQmO{UGNmfB _[o["(ĭz]B n;fc44ez+Y^d4FEZW{+{ d,4:ոR_̨~*$.EKw"*TyS(酇e^6ҕJo(ެPCor.A84x_$jix %d]]y)¨N)`]7"T< '6ӊrӞ%^B7\56Q}WoOOb^^$11wAJb4z_l=f<绮$2@&``Ƃ M*l|سQmMNsw{_LߖXHds4)@K qi ự$zmCcsMӚjZv'׮ġ2Ŭ) ։`+ c%/+ؿv0֘NJoƦ y13#Z}M?8dh>FPwޢlYq?1VFxvHŎdZM>ݽ#8ڄ&5ZڊḨ Cx: )Yi'F[jbԎl["ށ!.'RԄTx[\az;atGm*i)!R ( ׯhN;7{u|>ݯ߆qOP3HSnS3caI#9d}ȀRkLi@m^x_ !:QEm;.-.UI]79!)['șR6;M@LHԻvTӻc1t,ȐJEI=<SfA,+iQĉƝEՔe>*%jVOp4MR)8({$2]e)/,ޝxRH85L.}OZnHAZ4 |W|s޼/ӹZ[>bwFܨ Kklui=b`ە9aՏ51=f/l>H Eq'6$b5TEuAU]FD+|ҽxhW2 A $9CDZ3i1)[ٓ=Q4EWy|iI+ f$`}}Xr"ubdZQzb345nr?02{Eڊ/5\E=t |N1r qi8, pP J'(›L fs6W*= N+<ŕZGTp%-}ϮxĐqWbGn'?3,5c'dq'nx[O+pz 0Fa m"2tK6K҈IIf-[m?@r48R{wJG1r( 1UrZޝ撞忤Ye6bєSʞጮOR$\b֋uGnӌR•R á20BhQ- (.~6lͽ,’KIAHeIF̖Fg>X#e*ڎL푝ZzKQbsLu3O;0Oze5s'mݠI*;.ye4!v_;/^'W;;p~QuH\BQn)8-f;q+_"F[+bZZB,TSLʣ+Ճ٩pmϦP2,K.kFQyueOvV4wy*1RmڗI@Wo?n%mr!~ŎR1v>&1㫨4 uBL7xǫUp%g~o#NB OzWk7"Өzo>?>3h=d&mC¨t$EueSF޹sG%{;#75cfCM/H8;fIΡyQa>86ff6c÷ыnD^e#3bc% {K?E~"=+o;>_N $ Θ<&lO6Tגͧ5D~SA8 ARHS_IeBB4%BC=cmeˮXe/N^[{p;bPoO7|\RM\٘l _@%fGa\-:ߢFT(O3{{1LlRv؋Juo tO_wTDe?ddj**SQ*%6+D0psέQmrM&~3t]W9m*~ @ ֺfYU-{D|ɾA .@ܦBAH !/zYgX`'V@6FP8ɈĮ;]CZhk\|^X(ro0GD~)h\6ԗ Km R9zǏ~**J/LX)Ͷ޻ ]يet gW W}4.|8%7߹ii܉K}tY+Ze}`vtùvh N$zR=^''򾾙'Qu-Z4 (jx.1[GmX_GN3f+у-­>zX8H1&&s QNH/W2DfX/~Iy9{B -dT ˗#D].:79v7`ΗK|*" _1q{樳x b0邯fHAxq ԂNjfKϖ^LQD~7ϜC.ӥb)Q'ctFt|ީK-^r=@#inG!p<ҊGF@W1pM<hOJԔ6۵>v`m3!KN=H#݃%׷t ^p8i#?l}#{"z1)PC5U3k< OƬb ћYL:ixFzCä6#,x)Yϟ JFN("9d6,G ^0qFomko]<9kD n=Ћ@+_ңE@`JEjMy#$ph5u\e7[\O,R`敏%z=S@էLIE$R6( *^֮ 2EuؠҔ'RH)/de CҚR-v&yZѩZo8Ϲr!VO<8۬SVc{8|uz=|T/'12mH^qU:6GC,BTӿQGcTCҳ\X|AHfiV1]@]kYܑVCs#zո!Vvf@al5l *)6rh{1~[KoW74;WMqWHzy+Sh)2mJ?&c&y)Ť7aIKU»Th<!ٕZCO>@ 5:\TReFRv*b/T-.MU$\;D)CQˆ4x\ɔq̞u<Ӯ B'Ve|gQxvqM:1EYD`&g_"svjU8wC)!L4O𫩿}ki|d@)W,!sgdM!0͓ K me)u0ͻ 1Bj囹H#@@)ݰt -+C7$sߍhQ2^G.| f9jsˊpfq" ]A9\J 5g6ܔ%ܺzm HMANnAG7IЛHO7& p𣵟dZhTIxD6ETm]qĽ> YQFxLG8P4+GӫMH'#5VcK? 671 ,ޮ~UΑ8*֪FFT#Q7߇:\R+ Pq$LHNDn-M' zi@gqq}- QItmgsM(=5.cJŬ:6-DJ-91htQɐ^(Ο< C%a !+OH0ˣ.ˆu'1_iUf\@1iWK)(8NM=ҼS?QPJ%i~ H-T ?g~(mFXGYHvWҵ0^e^Z0dj&&pc c- PL8U}< _ɖlM%8ւ^+bưP4dX]YR2Q(P꽰C8yEwkP7l0jI~&%IcZ0u$R#`?xWp/}KxX [pi琘tvZDA` k2ҘmVyq;w`G4kC5,ڕO-c X9H 5i2f\\JYgOɍ䢛 T, Βf lP(v)&WT𢌱8O}F~xNVpt~+)8ܙ7F!C۸'Đ?`fZK h{.2Ec |MExy [Vt+w02MXBo CHYJK"$q7HtBJ6H k?2@N&EA@|;z{f=ׅTt(n:2D/ßQtÎ.9 V]D(;:ٷ^18Mt/Eſ8 .9%44{^M p8B["6 IѰ[7N4xE}D%YRaAL@5ޭ1)I9ӳ)b؁ӫGnؔu{?S6AX%1#A1rhi0OI}CFG F-@5MM#ڛ&&bkJ&% ;Wts1;eS 4Ç M`i'e1ro_|HQ=VB$z椕@FK{؀G'oJS\MEaLXI\2#srHR;jn$34{dP'HvB 9w8U@=]C!G$顮'e^.h]Ek+ǰ ,5"kK/z&`+y8YiisN-柂;w᤮=vD .1Jn 4<=Anժ|f["盄k5cnAH. Ԟ88O%V tG*HsLldl`*#iŕ ODm"CƽMQȘ$ԫ*'`8_T5s5(> fy0D9ȡ$&NȗEUʭ8YcŌfMF/ZG{*W#)B/wꥪu7w0sc&,.m<|vcmTッܐt!H 2$.1Z&xc6L$安kP ęiKXapZJ>ۂGRi OB >Fyi7v.hKJ_9KȤRb9E\d{[PSN^:N^:FQX"h'ACjCƶ$ Fa]ZH%W.l sS7&dzݚLKv,#1"mȈ͏mΉj ] iذ(zqu}sњ@id CF$"3Y?jo5v,G& 'z גwNj* ATwy (!Œ*ڸ+N+y zxoϴ(/\dd8|_E -z̩N 3zHvM#,!Zϐ7Vފˑ"ѭ` 'BI& يFf"JN4i ƶqz$~B򉨔)lRNezepTLbMv*TB4d'}O4@E|ArQ-= kãPGe`391B"=^#ϭlmñ]5O56}OHQ `F)v[Z cEF,UC˒i *ٽS7rtl*Yo򏋉B6t95Ҳ}ڨfc{ihMź=6 ߭Q. cC,dX! +~nU֕p;1QPl0Zv* [+uߠ9~msW}KM49&MwE2W-jC>k8`zM""Q*!9 q{4!LzRDtΛI_ gظ gPvocyHײlS,e xDG\+Eh{L@1S6;;,w#czQjⳅZ'ӫMT9U52oJF><ȋa*ȫG6TK7!]bL\Lqgw1ӷ%br#cY2p?;л02zKm#5bK\jQGEb&+mT3_=Kg*q$ cUS sR1{yP.Z,{ece:|t(os ]C.m} FSps} NzWFtFt|k)PJ=xȾںhRXc}MIHv#-\;m`d B{ټ$ aˁ;y=g𭀭GZt23ڣ̃}>юMFdAk̼+7Y =2T"CZG@~0"2c̀ g10 qWhJFTq̯bu 0O\MCEA0 ijI:*vH]o4 RFpdt@U '2@_bxJGЭU J(Q (^! *PɊe-ozep}1?Zi*J.=a3UP6Ũ1w%InܪXQӨG*/QU! M*XzL&7v6bu x\8$,OT 40eTmecp2aܶP2`OR bJ 31 kG@ őÑh8"yBmS$õӇcوo J/}&Czpް[fΐߞd|< -e 2kye?F3rsbju1 CY(c6&$n}vQEPKogWĢ1cZcÙ]'qg%g(KޜWܔqU*y}M#f V0]kS׾\k.hNjS>ArAc{-pPd^5 ˠ(j˧dk[w8O֟O\ոb!s wN["@2! Ix/p8ɴÉė:V'QOLyWcHN{aoV [%+1jDvB>εnZ|,}( Z˯|$ejH(Q|O{)QﻧQ/Q/"ndW 3 & 岘z+J{ܯ7:͌zw>]7+2'=mVFuFe:;ǖkL5-v{PJ'&v7RԒ['1ykoXD!-n;,zq\틃'uHI(wd JU~GW%Iti.cxlՀzH"Hh!$j44'|CY]!dfH{`0>yy "HtҚan4bH67l.Ds =4^eޜC /!޷[Ɨדھbf"2yV>ljJhDNjªƁn3V8mw +ˀ4g`Ic%]&u:1(Ӷ:SNLl|.D^9/_U cC?%9H#deYr|g5yˬ L޲TB(D˝bFəS&Plif{RP.^<B"\^0234]Tޯ\4˷ Uc29_k(\!^ ;!Z^ۮⵡ#aO[<# /1uX֝\j vawֳ◘3|$Y.LX_)xvF}0An,Z m&Cn< SJxɓpOS0-\gbJ?/1ϯ~6J~R7.?](d\#AG.^?t'@賳3Rlz}* O_D M`s7!`薷Va+.}bCi\%H~|Oy =Ֆ}3e#+O8f| (f݂~^`Hu)f$5D 7H%/++kJXy\xR WIC@4a8@sO8yIϋG)F'x[ {R y~oem̈́N9|bݽ2N2K Id$kHЩafi&zv*V*`&~jV[[ ؖ8O5Q d*]~iCU`QWqN:& ='2-J\9C&p5f<2Yy@VVbտEíBm愪ʈEkpƝY௄-zo'[ΤR;i$,P_R#$s7]jmToґ^-RJI]/{52щ1@ŏ@BF2Y>]fgdٽQdBMXٳ F[w]o4I.xj;(ʥ:"~G3߸5xkXxD9f-NƐ"GO=e?Xh|sv>s/~^5WAwrL-ʩ0L鱈.ޕDGÈLjcMT O+qԚMtAXN`h>B [[b7z ~^w` 򱰮xgȨOvshHF#!o* MxQHu8iw)s+aμg:Lc@lGO¡]QzVrgbYg033E:sȏ-q}z"%ܗ1 Yüpr=Q1]7xCW7MpDp_G71q6Xͻ)CTbC?˕ǁEwd0^P4lJvg9Z@|vğ!*eV.h`i^rl*x9Own#(ɿ}^Z@]ME*Al4YoW_zt:V׉Ҿ崯<-͚ ,QdʕB=WD`4B[%d!UYPWű`D$D@d0o{&˔fu#EtH0ך*`2i1v+[<ѧ7U+.jqBtaP@ [+-N`yKi"+@*HKo:Rh^ UWvCe^M')h~5ϛ0nmv&%lskyoR {ڸ1^/5p{5k41mNF[)g|iyeB{IZfQnr>cAAũWjYD=zA7bq ǵ?a4rBlWOgrq\֩j6#,pbvx XB?Oui .y ;~;"@i3rXA!7\-Y+4]`a{g4Hs-( U4B.R|ܙM|Y5pCwnó9߾w't7.,~{b b>[\127aGP:+ bs4;zN?;ܡ %X`%x 'o"r 5cey>=l1Jt8maϸ8Ztqc7a56E/`/"GǰNWl]m <5;2q~XvAL$Ʋz&z:zuG믎 v b6yZbqZz="1cp@nP>5D J5f^eX2y @}V|834([Ta$_ei Gr:Ot,Q嚞gKuC!Z0CT:fP5i`@xVc0[Q(P&q ~Os_TeIɊ1JvYm*wvN:~…e;*o.9%|2 5w=D+T'ZGHGU#PA{'9,sLu#Ū[sUt{#^\y^TKvj-$\PN 0 I(?:ыuF~SXiʚƍfAd,Znǩ-C~w YпRl/)^F뮏۩\.8eH}{w}fnM2%R\[0̓ D7 C% ¢/J *-Q". #sr= ޠ2G(R]Ԭ1xVrmH2zqS0oFKT7NR7۫W.`:;!R`1a(c/ O N%j2sQ+I-1a= ++F?jJ٨*_W҂j{ ^Gt$GYȂXt, vRZPʙAߤe| U{byظom7i;(Nb>Jmu$LX"3 r!u8MT3)0QE"FP3\[^h{7S a]Et4$59_?6;){YLG゙.%Z5Q㣜E4+(MȨܴGL6x/a*Kv~j_[~*mK5?w +m  3syU%y823ʑ". T#|Eh'8q!&;(f3AqO7LںwG^ a~绡ѿq/~WnGxW85԰_o YJHv8 ûbtytJr{S,حA|*4I30HC *ѱRv-Høe۰p{ 6^ꤛv/mxK% swm[JXhQ?T@HGE0!5>t뙀z@YK^>_uuc ¨L`W*SRȘHA(#<)O 33D{r3s,.Njy +أ+` i$[aIeoI -B($%ocJ^'6 q(M\@`.$OC_SJu4uzrBi`_vw| ںVT'GIPJ0L\RLͷ 5%X:CI(,i-GQ>F"=C/FցT7&t}solu?mnANB!c/e$77B|KŚ{ӿludS;nD (0*Vj'^r%}R;ӻwo|2A9g;eO h >^' 7oٰ8"*ٌD!,>B'.8߳CaB>:72. 2??@^eפq5@߮e2,v6y;6*K\ qMQ/+Ɋ;`I6K+E[]*--?'#N8ƨ,f+kA8;K+#̦T2(߲7@ CuHR/I p&~$aG{f ڈu'Ojip{gOjqKkD~^L8ӻB6n0dGW$ܞIV|{qFh^ %ᆢqTV?| UrwV⌸=1JQ| t>t뙀zo@^gQ/>B5pfqGK /y\ȷi&3D  GCtTaWV|nV^~RfȠWR;L疡`wLdhfān%QO`NFFE8\qpN1eQA -'y1g̜jWZ%I Z{A"8 ,z^3dVBVrk}zӚMxR ɰ#>4yueTf2ud%l, ^/$ r3RȩDY)v%-Uhܲ(uo~@5"-A1%vLA2k5 %*(ր_UMM=$>E>4TE뵚C^Jd4PMg2|\8(*QJR'^g:uŞ(ny{=\tm/܍/hL0O;U=e%EؗfFG%Lf.LksIw%:$&Fr'((Hb b:^FEP< پz)?5@|so7uҚw26e"r~mF"DeJuݛ边*W^ iM1gz'塢,]S΁4=hi J%Zfg2I I?%2=!FǕ,sPoA{Ԅϔ+pҒOʕ(t&Wt3>ڿ\҃^OoƟVmXR}S"= /4bd^ DR"Y`~2mP4,o huB:˭MN%u?v*K6s*6yxseK݆e{.p'%jT`)4!07K!; IjiVCDϗfѤONIq,-@V:F#Du^6jIܭ8-΂!pFPokAL*thMYdqĀJelY7Ěe/@uKXziLݰb@frh ,}wbkTxmB-L-̸ *J9ȝSbJbh;0IPH^J .8xq?'N=R^<ɵ¯$ PN-s[E̐9菼G)wX2brU8!w45Dq[XEg_ TΓ3=)U=כBnh;,_QxtyLKffug2ba^[Φa)c,u>e=mY;}DqrC%nuǧHuϐq f1*WYLgoDD:]z -%u-\aK 0:(λ+vm#Žgp5տ=,>V,~q)h 1W4%1Gf;Bu%O>8h~oevIb?NAk 9nz5)i#7 L~y&{ ۷,Y&ޛ>>v,G@ŋH(1̰UTrK+w vS\f0ҏN)z‚P f[Kz5#~/,^xP+qq.;=.$ZiYtPQJ i4Iد rVjK mì",E |"pF58!f˜ 6Jd;ק FSr6NC\?[q;ƒi}O9m,㧔xiTFףN(HNB0 ^%[z0zS|gN"x{߀Ә)#:L(^^-EƦeD am|TQtʳLM}L*bldUk)0-M@ܾMIpRo7-29)$o>:̝y(jDB:mqX^zo\X{QbxgF"bC־PLz>0qMˢTYrlM*bQ ` Kd0XPѦA|+ 3-4XyԔh\5h52I$ ?Gqh]D%Ӈa60biض=7u6ls0&Z~7漀u}?*'\(6Ƚgy%7)8;3I:J^JF׸*7oPMSq7~ƒ7ܜ%)"I?h&{;n(}C5&^r-Q@&-P/VabB<a]Pe^[NGK)IKF5u)mQQD=-i⡆,5+i^y8%sשz=vzj44OCceTZ~RxzAx9_ ӖE7lV[Os$$ /ʵ9 _~^8o)! +vR݌P|IǭPGq-޿_'9'?MS 8w PbĎWuD8|u4jÛ\^겧cuPK;}=xIŬ}'J4'!"%;Fv2%Ka*D#] W2E(b>3ÑKRY%RTG.^n;\;"@gv8r4usj$l{~p$6Tnt;ض $,\H5C_srHݏSk7Up]syыPh^j/?QQ5hB:[&~At::uZv Gh贃Z,G gjYFqޝU%i ݀$wnbH2J[ƐZmFM ĄѤQ0ՖQZLtѣ t:^C@TlJi| l( s8[0Vv)}BrޛU9qM jbR4'YT,@ޑHcMkԮ"FA=f٘1 4a~;Q*ZGЎ G|m1e[?eO< hVbݹ܀ /)JrWq#ܫN% iTo7kɚaZ9I%0n)3 Nzn%;Nnd*^]R)^8i '$I2(UvYvO =%U<+ĕ5ru`K5 SnPr9yOs }FXŴRh% Rܵ݁|D9T';z)Xotyn/% AՍk] 20.v Ooi/96?%ڲFF^%jG!O-Ķ\ &V~n8K}8Vk;3#k1 ʨP4mL}-ͭ^E<%i $- Q f!>zP/MS;tVե%$լYu"zZn >#ɝ bqBdM25 軒 =H5 8!y.Ea) -SGL4#c_W -$/I*0w]Cѧ\3)*s"//<6So=,ãFRBRL怞1qzwOBC4تþ6gXx Tw-Q:2F@؛jP3 nC;6D@_I#rsW,B|ovN"}kK1G9!hb^%[Ӵ"mmJkRn}6PrfJՋq]m,a  6vɬK\wj&4 N6+ePәZ(/ fW mHǕW\4T814MӬM:Gt(b.,H猖 5hZ!(U: / _֣~@cNHN_QZE2V@Z1U4r[K8n"M |W4@M%zHrRخ8!_K*6iB9v)BkLW+Ͳl_9ro$]%r:P.WsL "+iŖl@oT{_\SU>͜JTNNSׯhN9ʸΟp4cq1'l>2mF< 8N%) z#)0:V]Qi*3gW aLТ-c A>L\yu_AH>'M*E`&I7~>\uTjol$M>6 pd!3o"ƂKq%Sq#^7[r{z.}poaK}G89NۜvXB³}R gH<&J y55s>L@@^zEW?ԣM& jivp 4f3)/6!שY 0"xpX01lVz=e|a*Ut98̈-F~͇全s٘Lti݀chmC #c&}-H$ٰ-H >dҼțTcnݱ$z0NFU9xt,Ǚ4_-1U9 Dy*3K\xB9ӈ^Y#)c4q#gY1"C_ t'h%Y%ǒh DU}Wtoc˖,Z $+7d=i&Đ-"$*t /=ϰGf't CvXb9nvrMLҎ&1ǧ=KԻ0 |_V$~H)뢾=MH Kn\֨ay#Sgx*