pax_global_header00006660000000000000000000000064143652634740014530gustar00rootroot0000000000000052 comment=be19ddbdfb6e76f1e703f0d54a2b26c124c881e1 enlighten-1.11.2/000077500000000000000000000000001436526347400135675ustar00rootroot00000000000000enlighten-1.11.2/.github/000077500000000000000000000000001436526347400151275ustar00rootroot00000000000000enlighten-1.11.2/.github/ISSUE_TEMPLATE/000077500000000000000000000000001436526347400173125ustar00rootroot00000000000000enlighten-1.11.2/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000011511436526347400220020ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** It's best to provide a generic code sample that illustrates the problem. Examples from the documentation are a good starting point. **Environment (please complete the following information):** - Enlighten Version: - OS and version: - Console application: [e.g. xterm, cmd, VS Code Terminal] - Special Conditions: [e.g. Running under pyinstaller] **Additional context** Add any other context about the problem here. enlighten-1.11.2/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011401436526347400230330ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: Feature Request assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. enlighten-1.11.2/.github/workflows/000077500000000000000000000000001436526347400171645ustar00rootroot00000000000000enlighten-1.11.2/.github/workflows/tests.yml000066400000000000000000000036271436526347400210610ustar00rootroot00000000000000name: Tests on: push: pull_request: release: schedule: # Every Thursday at 1 AM - cron: '0 1 * * 4' jobs: Tests: runs-on: ${{ matrix.os || 'ubuntu-latest' }} name: ${{ startsWith(matrix.toxenv, 'py') && matrix.python-version || format('{0} ({1})', matrix.toxenv, matrix.python-version) }} ${{ matrix.optional && '[OPTIONAL]' }} continue-on-error: ${{ matrix.optional || false }} strategy: fail-fast: false matrix: python-version: ['3.11'] toxenv: [lint, docs, codecov] include: - python-version: '3.10' toxenv: py310 - python-version: '3.9' toxenv: py39 - python-version: '3.8' toxenv: py38 - python-version: '3.7' toxenv: py37 - python-version: '3.6' toxenv: py36 os: ubuntu-20.04 - python-version: '3.5' toxenv: py35 os: ubuntu-20.04 - python-version: '3.4' optional: true os: ubuntu-18.04 toxenv: py34 - python-version: '2.7' toxenv: py27 os: ubuntu-20.04 - python-version: '2.7' toxenv: el7 os: ubuntu-20.04 - python-version: pypy-2.7 toxenv: pypy27 - python-version: pypy-3.9 toxenv: pypy39 - python-version: '3.12-dev' optional: true toxenv: py312 toxpython: '3.12' env: TOXENV: ${{ matrix.toxenv }} TOXPYTHON: python${{ matrix.toxpython || matrix.python-version }} steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install tox run: pip install tox - name: Run tox run: tox enlighten-1.11.2/.sourcery.yaml000066400000000000000000000004161436526347400164050ustar00rootroot00000000000000refactor: skip: - replace-interpolation-with-fstring # Python 3.6+ - use-contextlib-suppress # Python 3.4+ (Possibly less efficient) - use-fstring-for-concatenation # Python 3.6+ - use-named-expression # Python 3.8+ clone_detection: min_lines: 4enlighten-1.11.2/LICENSE000066400000000000000000000405261436526347400146030ustar00rootroot00000000000000Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. enlighten-1.11.2/MANIFEST.in000066400000000000000000000002051436526347400153220ustar00rootroot00000000000000include LICENSE setup_helpers.py README.* graft tests prune tests/.ipynb_checkpoints graft examples global-exclude *.pyc __pycache__ enlighten-1.11.2/README.rst000066400000000000000000000210371436526347400152610ustar00rootroot00000000000000.. start-badges | |docs| |gh_actions| |codecov| | |linux| |windows| |mac| |bsd| | |pypi| |supported-versions| |supported-implementations| | |Fedora| |EPEL| |Arch| |Debian| |Ubuntu| |Anaconda| .. |docs| image:: https://img.shields.io/readthedocs/python-enlighten.svg?style=plastic&logo=read-the-docs :target: https://python-enlighten.readthedocs.org :alt: Documentation Status .. |gh_actions| image:: https://img.shields.io/github/actions/workflow/status/Rockhopper-Technologies/enlighten/tests.yml?event=push&logo=github-actions&style=plastic :target: https://github.com/Rockhopper-Technologies/enlighten/actions/workflows/tests.yml :alt: GitHub Actions Status .. |travis| image:: https://img.shields.io/travis/com/Rockhopper-Technologies/enlighten.svg?style=plastic&logo=travis :target: https://travis-ci.com/Rockhopper-Technologies/enlighten :alt: Travis-CI Build Status .. |codecov| image:: https://img.shields.io/codecov/c/github/Rockhopper-Technologies/enlighten.svg?style=plastic&logo=codecov :target: https://codecov.io/gh/Rockhopper-Technologies/enlighten :alt: Coverage Status .. |pypi| image:: https://img.shields.io/pypi/v/enlighten.svg?style=plastic&logo=pypi :alt: PyPI Package latest release :target: https://pypi.python.org/pypi/enlighten .. |supported-versions| image:: https://img.shields.io/pypi/pyversions/enlighten.svg?style=plastic&logo=pypi :alt: Supported versions :target: https://pypi.python.org/pypi/enlighten .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/enlighten.svg?style=plastic&logo=pypi :alt: Supported implementations :target: https://pypi.python.org/pypi/enlighten .. |linux| image:: https://img.shields.io/badge/Linux-yes-success?style=plastic&logo=linux :alt: Linux supported :target: https://pypi.python.org/pypi/enlighten .. |windows| image:: https://img.shields.io/badge/Windows-yes-success?style=plastic&logo=windows :alt: Windows supported :target: https://pypi.python.org/pypi/enlighten .. |mac| image:: https://img.shields.io/badge/MacOS-yes-success?style=plastic&logo=apple :alt: MacOS supported :target: https://pypi.python.org/pypi/enlighten .. |bsd| image:: https://img.shields.io/badge/BSD-yes-success?style=plastic&logo=freebsd :alt: BSD supported :target: https://pypi.python.org/pypi/enlighten .. |Fedora| image:: https://img.shields.io/fedora/v/python3-enlighten?color=lightgray&logo=Fedora&style=plastic&label=Fedora :alt: Latest Fedora Version :target: https://src.fedoraproject.org/rpms/python-enlighten .. |EPEL| image:: https://img.shields.io/fedora/v/python3-enlighten/epel8?color=lightgray&label=EPEL&logo=EPEL :alt: Latest EPEL Version :target: https://src.fedoraproject.org/rpms/python-enlighten .. |Arch| image:: https://img.shields.io/aur/version/python-enlighten?color=lightgray&logo=Arch%20Linux&style=plastic&label=Arch :alt: Latest Arch Linux Version :target: https://aur.archlinux.org/packages/python-enlighten .. |Debian| image:: https://img.shields.io/debian/v/enlighten/sid?color=lightgray&logo=Debian&style=plastic&label=Debian :alt: Latest Debian Version :target: https://packages.debian.org/source/sid/enlighten .. |Ubuntu| image:: https://img.shields.io/ubuntu/v/enlighten?color=lightgray&logo=Ubuntu&style=plastic&label=Ubuntu :alt: Latest Ubuntu Version :target: https://launchpad.net/ubuntu/+source/enlighten .. |Anaconda| image:: https://img.shields.io/conda/vn/conda-forge/enlighten?color=lightgrey&label=Anaconda&logo=Conda%20Forge&style=plastic :alt: Latest Conda Forge Version :target: https://anaconda.org/conda-forge/enlighten .. end-badges Overview ======== Enlighten Progress Bar is a console progress bar library for Python. The main advantage of Enlighten is it allows writing to stdout and stderr without any redirection or additional code. Just print or log as you normally would. Enlighten also includes experimental support for Jupyter Notebooks. | .. image:: https://raw.githubusercontent.com/Rockhopper-Technologies/enlighten/master/doc/_static/demo.gif :target: http://python-enlighten.readthedocs.io/en/stable/examples.html The code for this animation can be found in `demo.py `__ in `examples `__. Documentation ============= https://python-enlighten.readthedocs.io Installation ============ PIP --- .. code-block:: console $ pip install enlighten RPM --- Fedora and EL8 (RHEL/CentOS) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (EPEL_ repositories must be configured_ for EL8) .. code-block:: console $ dnf install python3-enlighten EL7 (RHEL/CentOS) ^^^^^^^^^^^^^^^^^ (EPEL_ repositories must be configured_) .. code-block:: console $ yum install python2-enlighten $ yum install python36-enlighten PKG --- Arch Linux ^^^^^^^^^^ .. code-block:: console $ pacman -S python-enlighten DEB --- Debian and Ubuntu ^^^^^^^^^^^^^^^^^ .. code-block:: console $ apt-get install python3-enlighten .. _EPEL: https://fedoraproject.org/wiki/EPEL .. _configured: https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F Conda ----- .. code-block:: console $ conda install -c conda-forge enlighten Examples ======== Basic ----- For a basic status bar, invoke the Counter_ class directly. .. code-block:: python import time import enlighten pbar = enlighten.Counter(total=100, desc='Basic', unit='ticks') for num in range(100): time.sleep(0.1) # Simulate work pbar.update() Advanced -------- To maintain multiple progress bars simultaneously or write to the console, a manager is required. Advanced output will only work when the output stream, ``sys.__stdout__`` by default, is attached to a TTY. get_manager_ can be used to get a manager instance. It will return a disabled Manager_ instance if the stream is not attached to a TTY and an enabled instance if it is. .. code-block:: python import time import enlighten manager = enlighten.get_manager() ticks = manager.counter(total=100, desc='Ticks', unit='ticks') tocks = manager.counter(total=20, desc='Tocks', unit='tocks') for num in range(100): time.sleep(0.1) # Simulate work print(num) ticks.update() if not num % 5: tocks.update() manager.stop() Counters -------- The Counter_ class has two output formats, progress bar and counter. The progress bar format is used when a total is not ``None`` and the count is less than the total. If neither of these conditions are met, the counter format is used: .. code-block:: python import time import enlighten counter = enlighten.Counter(desc='Basic', unit='ticks') for num in range(100): time.sleep(0.1) # Simulate work counter.update() Additional Examples ------------------- * `basic `__ - Basic progress bar * `context manager `__ - Managers and counters as context managers * `floats `__ - Support totals and counts that are ``floats`` * `multicolored `__ - Multicolored progress bars * `multiple with logging `__ - Nested progress bars and logging * `FTP downloader `__ - Show progress downloading files from FTP Customization ------------- Enlighten is highly configurable. For information on modifying the output, see the Series_ and Format_ sections of the Counter_ documentation. .. _Counter: http://python-enlighten.readthedocs.io/en/stable/api.html#enlighten.Counter .. _Manager: http://python-enlighten.readthedocs.io/en/stable/api.html#enlighten.Manager .. _get_manager: http://python-enlighten.readthedocs.io/en/stable/api.html#enlighten.get_manager .. _Format: http://python-enlighten.readthedocs.io/en/stable/api.html#counter-format .. _Series: http://python-enlighten.readthedocs.io/en/stable/api.html#series .. _EPEL: https://fedoraproject.org/wiki/EPEL .. _configured: https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F enlighten-1.11.2/doc/000077500000000000000000000000001436526347400143345ustar00rootroot00000000000000enlighten-1.11.2/doc/Makefile000066400000000000000000000011541436526347400157750ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = -Ea SPHINXBUILD = python -msphinx SPHINXPROJ = Enlighten SOURCEDIR = . BUILDDIR = ../build/doc # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) enlighten-1.11.2/doc/_static/000077500000000000000000000000001436526347400157625ustar00rootroot00000000000000enlighten-1.11.2/doc/_static/demo.gif000066400000000000000000036141131436526347400174060ustar00rootroot00000000000000GIF89aL000:::DDDNNNbbblllvvvXXX&&&____________! NETSCAPE2.0!Optimized using ezgif.com!,L@pH,Ȥrl:ШtJZجvzxL.zn|N~ H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L WBR (8̡w03 i! QD&:|(C lF|d(z` ,FЌ "#pH>x|hE6걁[9@BNA( 8h|b h@0Ĥ5*^\`(IR҆@VHrhU#%ۘFt0!L2HJj`$hIbf.5"P2IrZ :-R\gF% s @$B37K/*26 SͨF7A*J3< TbIEJ*N]4/!mlfC7r5`JߩNZR@'J9Ԧ2<l3N7 UEY%R;HSbeeNZBe-*VNqb[K u|gPyUB:U!:?)o.7B0 &zS#)g) ,`O))Rr6mW[4i&Kղծ&1Z.uknc\0Rp?׋U΍f ނV /i{ײ .+]ʰyzrTE/$Aɒ"ԹhJm_򗿐@R⍰]y_>i"R6-`Wee.dU:M] wثfm/6_ [W[gwHNz,B찉(;Rb=Yj׳l3mz#ls5UJslKE {L6C9xu`)F8iFt&|hzm#ifoȑKˋ^~=JYԦe3hZiAѶk MZ80Z~ٰs<9Aw֯]4C[&WǐV mH ٱ?MnҲ2)n!3{n7n#fVlG3f r\T1&,WW͠ bjڣd[-탛|ULûVW}k|^i|2ΰ}o'E\'q}l;ϭИۮ.՛2{} W-Ǯr›='gWg<!ݝF fߋhWV(J5a't+{i^]7c1]ؕgz995rG>&sgJ]y~.AJt+2jsZc H.hEKɚK꺮j*JjBOXɕڗ 麮 Ujڧ>yH`;zꬮښFjϺzPūJ;j1j EP6˳ʩ@B?k7;C˗E۳OG S+IKWkK[MKQKU+YK]k_ec˶k m ovZ/{:*k{0MhڷoI0I˚yi {4LʩJB)j ˝+JИ+˝e깺BPH:j{nrǛa˴˵kۋ ߻˼+᛽ܫYI9 kKKii+ +k ,̾ Ll\ vŻkI2\H3,E0/ \1\ 0Pi7U/))٥9Kɷ~z0ĞڤY\2{ŵJ|ø*S\ŸM P|#,}!~Ȓȓɔ|ɖɊ\ɯQ$;pU4\F7RXKF`NPkʾƤɷRYDz0{üƶLS̾ɻwZRGL颟ܰJ,㚲} lܝ# EGf,H ,| .ܝl˼e<,O0%f\ʧ;P9KЧJ OW Lć)8(MGl+%m-,"M6MJK],X,M.FOM%Z>J9u{ :VJL +ʣ3=Һ痮,:\m6{}Jr:i̿1z L i QJ'o^~?A!, 3'dihlp,4<\x<_pH,Ȥrl:ШtJZج6yyxL.znӐ:N-$]`:P@ 9(|43.x9zT 9 ^2$+,~^ "(#όF+$=2 "&12%/邌{A &NC]0rGcY-`mġA4jE̙1RqFfZ9_vJ)PVDPJ*V,t1z( VWZuIUi>t`@-Ǫ p0# ?1<1E;l0-aTS#E00T5ߪN7` eO Ÿ|^\qY iw?h_8 Y5t]p 8 80YE'gBmC &8 Łgy0[m n@n'eW' iX\$Q[P TF9WV:I$r)•Oj bw \s4xbhg 0%d!d%xh9Zl&*it100tAh:4U@ hn5Iꝭ@*#2ĄƔULds@h`yCƣAVkTd v&U@Bt%LR4G,$[B [5/xV47n@t`@0k闤ځ`Nl[ h Z2'9p^D=l⑌#,&R]@/acR&gmN Ƶl[Fl{B)ȍ]kjZsKl{8۬C,M޸1; C1,pM(IsM3.r FLM7@A. + 8ۘ@ n`!hVxy0B@ )R\P1ZeNU˖7;1 zhÀ.iE G6K1IBij_Ĉ/xe:$ZA숍m:y9Ͱ;BeQ\>}f0dn&FΠ\? R2"OfcLt@cW+(r!խǵ2;mS'dW smN0F2._ Bs3쌪TN!sw#=6ʽ9 a< X ǁk(1լD[!/𦻾 ^3?)Cڷڨe(mJU/=1) Ca(Sa~Ӛ]M+$`e@Ƨom:vZUOi4/' [}ie\6x!"B1/vA}bgLj6]%-Nn[]bR[=6tKCUԼ iSPpƗrkeK iHڪhYtBs|/;)qBN<'x' ^d_iq5%p$a &(!#°-/}y^/+@Z@Z`tU+b2VQ4fp(  #68wH69uy dz=T [Ҙmi &t̙(TROlcYمq1/US.89̾sɂz48Է|P߭Gk+`(fTハEnkL3 ڪՔ#@n0WUC#&lhE ^=]/l۰$f;G!,'dihp, kx|pH,Ȥrl:PlJuբجvzxL.hyn|&h$/|biWtZ(} .S y| .zh"..r}/ |V y.Ta}`}@a%BFN ҩNŋ > ,'$ h 5 8'q8sLΟC#Y2 QN(7,p3 PcЫX-9!W8lsh,X%0D7Ω` S׻x1嘷 {mɗYVtl(TK-S4,2BAMPSrEͰcC@v^{ IA&ܶ-ڻu׶+B{rU{DzISlxUË_xPӷJ`gYyRp0 <#gB 5qӠ"H`6CDƟv8IPC ^dOz h`7oV `hAh!x%S;'F"*6 <)TVēZ\vyQz)dee&p)g!! ,+pH,Ȥrl:ШtJZجvzxL.4X,zN~jnop rt mj nqMNuɭxா (AC# ȰÇ0Dˆ3jobEC9Iɓ(S\ɲ˗0cʜI͛8sɳ@ Jh H*]ʔPJuִդOjʕկN{@.Tx@۷"PػH`Vh{to&@ᭃR mQx/gc dBagHθ;_o'[6-"@:2o0װqH];qb8#u!s3Lˌ=9 \qԆ_^{V5F |o]gXvDy]Y M9 C}5 e[p…FPY+/4[R }J ~ya<&u `z@X5 mXyUf8&\uwaVaakI%sވ89^\.߁%.耊 sUR(Cw$RLB0 s1@ P\'➅Iz5:l7^JYn gyaܭRil e,6p&iNb[%@UH]vۮkibAup / o!l2Y#{0Gr4׌J!,'dihlW,tM o|pH,Ȥrl:ШmJجvzxL.ên|N'9:4Ϳe VYH6  I}iB2E1džȘ Bh徖~.G !ΝpU\p 5{ 4C `% E(<ɲItЃL")hK/!2u@AIsD)+JJÆB$˵'W[j`3|^ӌԧ6jKC}6%} 6JvR$Cu֐re e|N@0jlP !RcMDٵfd T:oB_<9抆gqYRJPq)Cx HZ>c}C"w<a"sx^kAИjpauV!U`^Gp d2 a<+/J4X#2IwUWYc/c L<`5X lNAǣxCf\qe`)a|Ihffpfti' !!,`'dihl0|tm7|pH,Ȥrl:GtҬvzxL.ynXH*~?si3XF8G|x~3k3 )%aibyԧàҁ۠[hI3OVȣ*$( "Q"JUcxNĉ2@(M4& t`g p Ћ>Ȝ)m,xsJIĩujUKmJ68ʪmj+7Za lQE Aܹ>ŐVTd !&>!!,'dihlp,Wmx|pH,Ȥrl:hSGڤجvzxLZϻznC'j:X$rDh5t 5C~z{t6yu5 ~)Y# Ɲt$h? ⊗šu Чzެg$FAHQPów V?+3Z!h) s pm^U @䚋Ulӏ|;:caQ9tIj'T N*Uqj~2h[hPE.PԃS(P@,:t  qSQsB`,x<E(k^Q2+Fx38LNO V92sob潧2\۬;fm؃ "ï\*|ɇ .>HC@VlZ/ë=zg&?Y{kVRHC/>` (1|H(ء*⋲4֘6樣"!!,`&dihlp,ex pH,Ȥrl:Ш4ZmvzxL.4n|.z\u;wI O|j~4(?i  )WyqƱVfc ͱ ~ *I<WHHHG)}&'Bd(:ܹK4s0i ZJ@0]JC_ьLhĊε')\Î(ըذ }z58^o}+ժJtGn\ϭy.,n G=iMCU=SF&=۸sfQzNÏ+_ΜdУ !,'dihlp,t}xSpH,Ȥrl:ШtY8uzxL.Jn|!޹(ZT@V'1Vgb ^?p$RG&DS1#2Asrlb ڃFṝ *裐F Jj饘fv駠ijHꪬ!,+pH,Ȥrl:ШtJZجvzxL.+zN~iu j rQT y}B  r7!C )HŋN!:Ǐ CӸ1D(S\ɲ˗0cʜI͛8sɳ@ JѣH*]jӧPJ*իXMiլ`Êյ,ձh>`0K ! Ԓ1׬7w ̝8`(\&7h`@0} ` \&͝F" } .;) d 8Ƀ3g{<+4Ͻ]۹]/}zÄw{OL:nwR|WǕzJu!e [D`Sx`Hh[1}5bz@(c~2rT͸"RTus-[gdA(R{,A0R@AIR9MfUȔjbQavyg`rEgPyVli15ꀘFJ *8)BQAUjaHD'^:WIdy.QSk,:ƪzLt0g,zwb7vbl&`ٖ–ڷflQiF@ Ef枽V]{^'xDf,k!wG<1:1>UAp@- pWM sۿmв-%b^M{&͛/}\ax3 c^ <_}a.Cd}JZk"c'!/={yk"JӀwa EM(xWB nA@`fT[BCdt p@A4b@I2kړB De,$ ݻ2FZod[tWc~<'ޭ=Y2T3 h&'[O 0`ܤ= U hmy'ӀۼCKFĺ`%xyK;vN_e7v!^c_VʜuSP(֛Ag`=ߗ2 0-7U'X4)B `YtHN,( !<@HGnk?*vx#Smj픮ק{殠1q)G2CH1 "1 IRqπIS4p C5'E&+!~e ,Hjez:RJu (T(|a@ճh0{"d @\d:(9[Y+m LMUL 8YҰF@ʨSa&% $= .$M @Yh*!7ލ k.y09oȠ2(_h_n+%$Zp&C]sG` () haeM9^XTC(GW+ Pm8Wʍё\6~:4hdq8L6F9:)TVdXfeWn`ned! , 8FpH,Ȥrl:ШtJZجvzxL.zn ~s~rItPrBENLrO  eāЈEבD M IQHo ǫǒ7]|*sN" =n9tMc9& ^u!h“(S/ DPH8s,YQXI9G`C @!; em!$ XY:gE$s۷81j,ƌmn\HRq;EJb74j[`˹KEh!PK ,W5ibzɽ$*UT3ߖ{d~C*\N ۑoǞ3;7Fӫ2dnD_dؑ#=e~cQzj4@8zvE }`V bׄvTYN(p'L`R6آ&$b:M673 k^c1YUI_2%y' tyh%mUL ?B™~.`_A~1f)O Ba$?'H%h;e})&ش&c+2y$baR↫H"ȹI}m(>(m}L6+n+t-^6fx*^Մ'>xV0f W~Gp˘Q(3[aR+%Wi %D:Ρ\2al*ٷc8 M.7Y՚V!bQ HuL _’*Ib5I̤&7NzRc (GIRL*WV򕰌,gIZ̥.w^ 0ILa~L298Ќ4IjZ̦6nz.@rL:v~ғ @JЂMBІ:D'JQӟͨF7юz FZђ(MJWҖz@8a*Sn"$&MgSмHJԢHMRәSէU@9ժZ)8MjlDCBHSxiO)kz58~"hwU)4iB_'guS)ԥ:d'Ѧ.{k4Ӊk$ΊvS @]ˈd\liX؊ӷ%B-E `…rͼjӹms׹^,f;3UJR 075p]k|/TKF%+hC_9wDMyRNTR r;aҊWJƦT{^/Yŝ9Mд1kؠ U3M^jsįwINwB0wXa&*_yeYe>nr p kXĢ1c]g^1[f:SI\0iқ>6KmN9ծ(LNVsnUVyLZi `SZ)r?I=lr>Zd4-jHgmgϴ <!)3B Mag7Є~o˙ fL t8}VHcdx.Պc4ݍ]xbky FwS"G]h;݈ZmtN{@?̅xX-W>jAvryv 霠~HlzP~m wÀ{ryס %yr5%NnZ?ޕk;l3w@ @T{=?N; 8HˣP\s5z^Є<+x'uu> ?y]͈}=p*y^n3`^nvק?#o/W 45_WbhQuKfisL&Mw%onWvw~ hlji@Nhjws6uwff_(j%qd7;yy&z8:'l{4g$uIgsNBxZ9-ׄ/hs'VP4NtegU8R(ԅgF?N((aMf]iVvԁh Xh6%kL huCjLХ4]i%ڵa%0vgn؂M$MP z'xbSr`r 06H;x|փ{VfPtqF(}xqHNr0@(75r(ڸEȊ٘'PS!SwՎh5]wjo؀(E%HntSp@hlXI`xז`N׈:ŏftoHP-,/ xf<ٓ հkeC͈c2 L`8ՔrP'- N9\Y{/Ɏ^9un%Q9(ԑ)UtP{a}7u0YEæZsr#)9oy^șe(Ez瓦yQhcWrJyɂ"'LFdxqǛ9YIPcMh#)vi$y9D$uY\Gxval?É)?ᗛhVX'r6W}y]vsɀ9Y `Gyy|mw䢼'%jf`IM4ZM$%aXF쥗x_0zKj%uԞIFɍ)ij$WX I*Ps*,&E:)tZtܤƛ_*voŹ y$u+p*=%]e# 0 U0 #Z\;#/V & 2*q[tv&5 zK)#Y d&0&':~dXnOr, ;#C%E4\8쓈6(^4 jUG{4!g#+@ *\`;, N"fx1#Ts Gʚ~%H.Y0񑗌c|LϠT"JKc#r" %`V ~&X(!J*cS-8 ?V Pؐv0V:x 4t0KG ԈS<_G5ؗ3okiOӮ]l"@, |ݡx{`A_T&vuDP~}TTwv69D?& 'asP(x35 6xX{J%5ݦ ٖ=v6>;m2/n#Ŧpt=~q˽1;PC)% /rJFD[w 뭯Am  MBw߳\-XDmUK$} ‡P&&AwdjRPd{5nKl4l^fnPh#'vڒX=XQP_ [)QbFNx;™*@@ Um,bLL.,  Cd9t6uHTbb(S؈ =SWL R"9 <` A1&(ċoƷ,tr3oFTFT0KRl`|S(d"khf '(R $I9lb8N/'$#) }q=IPFΓP{Ci?'"+ =ЅHMRԦ:6JժZX* BZ XJֲ҃, ݢYֶp\J׺xͫ^׾ `K)Hx,Xd ١)#6Q(c Lcc.# +BHվ n(gr:9t "%Lض!ih%/|!V~pn[ W"Xa5a4}1'k[ZzcSN8N݀LjS~jD([iUqթR(HKLanW∻lcOՈ0.F eZV~`ۻzԚƊU7tqo1b5+߁ ɛso:YNm~w%iQTYK.^΍y|l2-ϱT ]tEI@}dŃu7W 45 K\д rJoؿ'`jp4x$}Ar.g/*.d5 @$IEByC "X7ulԁHEHhJD"mOuPXdhyl$v^O4m^Fcd"3C GWGZd-*c' |4d$ e&hSDM'8&dIMIGIǂL 2X"FFc ̕m@fGKD FKgćARpRKԇF_f1MqMK4DžMW"f8NA A rYSNN\8bOa` Qe4$$w?h'U@B\W"C99/| 1 5:i|5zoZkU>Ib,W.N) P酀zs)yY{UE@aDZP kYxy u<Wp^0Z^ITwrdcb7_Yabby$p`f-& ˻kayic♡~Θ.F)ٸ2S'Óv JChe٘܄R̝|ƞ੟՜aօvgfRI ڟs-qe͈~;lvh Hɠ&vnƗZJ=:l j[3O[(0J26ncl8Eal&yq&QZHHsK\?ڲg0i)<[oè' ;Bxd*p|#lkCjqBIK&kAM-O=Z{c|M. Tre0[{rmb sr:Z,Y>zB7*`t'Uǻb˧x\gRGu:L@jj?Bvv2K*F~ܴ,k8蚪wGti yʮX :+KhhAN:˭Ahyשm ˄z۬}@)[}m޲˱k>===&}}b \PC>KB@[ Tk 'Jq4Skb7rHxՖciAx+T,ݶ&(F ^;fv;KT];~sfDanm#cw$}+NX{ %-rH9$I"qMf JdǺiq3H.88+K]+ (Ήuf]8 Ъ N˚Ok9{Se~֌l%Q \^ξ.+5=U:vNێ8^!<Q Uɧ?E I "?$_DUK f|- NP[3 Wݛř^\OX%hPHP42n<:ǟ+ @<Ʌ+`|UXV_ -j>E-t,;=^@_UDP+!K-lٚ\)HmvD8‰˨hD b7il=K6uE]^^Q>l v.yXL nuGi.3/YB[h ~tn$ν~{܍0ӻ.޿޼,=F뜦H/(NΎ4xL3ڞ~!phn; R,9kSci/3lo&W &op,l&OWo;! , 3@pH,Ȥr4". A Dzx\^z4|N~uQVBPg[CPD{SIn^Z\K aK}v{| P P C[CO } RJU EI~b}  Hb[{Ӫ:B+(!#PLY% R!0 ]x貦͛8s a .\IM'$O K.UNnˁ"(q 87@H(VsDHW1NF%T27mܳt<HJ rwkB[ -ضWnkɸr)PtD).JLA H^ogWRBd3L"umFفhNљu9vE ;-=K @ Usz?y:6,I ׊Nm/mS^g4uDSGj]@G&?FNDzvgx[''}B"l?\Ұ wD@)d @@,j1 Ap`ѦNZ]rQH<(OXE%qihF# IBrWLOI+MEE Qp"(d]%wg7iPB;E%-b*dJi}:F\IFmbra.[Ƒ %ѐB4܈t"i:61}Ksv:ׄ FKt$YH | 3“6@u(->LɎnCFɠ8QޱӠeΉ #zRb]GcSRl4(bJ;E>ۄ! {DB?VnHfQH9UD 8J<X ^B+]uhURE&RU+Vĕ7^Yd[J^[`r/ k-*tבEU_".fUTJҚHE6Qֺ-O223ͭnw0A)'oKG U:ЍtKZͮvz xKMzچ^鹶|/|_,"љ!~AB2($SG1 TlIhLp>z!'yE 4IAv }M*4mVbHE$۷V13cMH#[w(0UN,`8Lvh*HΗx;0a׼WQ9iMX^#qW^MI8IW" 4Pm堩5ķ_!ª=Mq ]BngYUkw.Cc%,8>Z09ƝIS@د@vax~^cV*{lSLYGas vv㵔f.mMt>p} WSXӄkGڄ)s;/. ?u5[<lǷFz+{뫿i0eg|8Ho,kv{1}=-j~8Dt~DF37uh/rJDžF{j}xyW h9_40aoX0xt+zwׇa T d)H$8etJEJTQ}?8:$7_4@nhU198s0K׀%s)^itHpj(ׅ4$K(z%bPb1NHoblN@R;ORu+و0nrkPmﶀ(uQ@S|pV 5o$&Տ|'iŸ?S8RS iMH6U(kWYj5`gcaV@WkŒq&WVWƊ+1"uCr~XAhXX6UJ`lI XFW,% leזprZ5vyxM\~?y٘9Yyٙ9Yyٚ9Yyٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞ٞ9Yyٟ 01jz ڠi#=Zzi| ":$ZG`M%*,ڢ.:G/:4Z6zJ 胣<ڣ>@pAZFzHMNPRj"SzXZ ;[`bϰCczhjskpr,&0xzIl1|:Zzڨ:Zzک:ZzڪqEIh: zPʺ ('^zغcߐ eZ zխ溮کP:_4zڥ5cRЯ;j!h= @ =Bٰ;[{۱ ";$[&{(*,۲.02;4[rg`:9˳@K:*V B{HK_!ᒴN9.ҴP[V Bq\۵^;dۘ"b[j}ip۵q[PS9bj|)}B;[^~ >^~ ">$^&~(*,.02>4^6~8:<>@B>D^F~HJLNPR>T^V~XZ\^`b>d^f~hjl_.'r>')pxz|~*>~`t~v犾茮^ͥ֎}p~s~k% +~1 0;'dq Z'IU[A쟼 >վl_"v`J@;.d1T&%g[2r^dw+cmEDe  缧Bi@N]L~uqrv C pyΫn2>f&/7D9;;N2'pwHG"8@CK?q"Jsc+~$2HGDr#T6`PPx%' #d˝^q5 #ԠEg<`.'!Fl!Q 5a52tgC)21TM9SB`ShD][.V9Y $<[M 9*X iPd9ncP*r -s@̗48sEjTGTJRO .NBu_KS؆e)-؂4 u8F~#.n@U3d7="z}ٛ.:Y^e`/agDŽO{[pUw T%ٶP TNk y1;`fTPVi9CWf0Q 'Xo5ԙ[nz/ͼo4d,N,\t9=unƂ X,gLDv}VU흁/k!vF#r{ bm&x) g\S 3$iG?A t'P/}bViǿ ڮt`O֍'^jJ! Bq@(Hy&f~X_(x?D"W6 !ՒS)-e4( ,!rEŰYUA,BN9 b '4!98Is D9Y7= - R(AN4ט xgZi)aCV> 0R/LR41Yg}1Re|LiNhV5M!, ld@pH,Ȥr4". A Dzx\^z4ѸU耞=0"RoL|SIn^Z\K_ DKJ]E|D P tP Cy{[COu F RJzGU kIϷܠx FPFἾGZwDb܂-nL JFY:yEޕႡt0Bfɺ$L$,8(puD9H>䄬R˘3SIӁ,OF Qe"`>QoF)*.!-VҤg|eZ7ǹ:Mn 8Iv)M HՎXR(lPy56>iAŐ+iM]+=e}%!Ym.i=۸ja7P:vwP侉pγSerA^^p{TM[ϩG80MAނ7z @7aFx}XA#/#C霸uE))&Cb酜uOsjaz?}/l)ئBMbygCK1 %=1TPA`&nDAGCzSJ+'iIܫqJxz(jnFɣGșkbbZJNhhDa;jm~ֶL|e@Rh4L2z`]HA*{d.En!q:LDrGlQrH Hx o,p˪+fRum> sKPo ? $884ڍ TTdd6*8ͶN٭l\"Y4n{s kWNJ8&n;@/=a^JL{󍩕dDjisZq;&_l | Md8-/W͌dNEn~Q@򺸄a,;w}YTcsGZ#&+oF W.YZAH0g Jo t1b"`d((eCdh>`3-œ2ZGp($'%ȁ,^閨*(2o r|E5Q aV]b}р^ f&#[q>%lu$JQ))<OpBG"M#jM 8+ #Jl /,MMHDJS/;5 A ;=! ] 61!T&)yj $Or@4#MKЌyv}d^#Ҡ Ze"LR4MQ<`Ep6V` h0͵iVJFN6}AszKPQ 2G$zSEUFP2ԉXU XUծz` +*A1hMZj 0 ![J׺B׾ `KMb:d'KZͬfK+bL߀fqђ'.#6{F"Jz=Ԇw^8AW!mIAx?%s9_D%R6SKhu(afcj 9W vytSA* "BZտ3/THkSXTO\ <F&< P$ܕ!2VB/W2)˄G,5‹YT+Έ:*vqh zK`,#ka1 cߘ2P @4d E=$2tʇlep86 g>=K$Gsv:,f03ӡṳJɜmssnЃ:K 0cn6`&]<Q 0*Ռ["V1KL4W6bgҥZ҂FjarLhRv{)* ;J;Ju.AJTHEoRjڽTIU V ak}gD#?bkRR,0]˲Vĩedc+"'oO*a^(r qdž 6r!z8)Ll[l Hwڝxi;dMϾgK6Sn4ͨJhɤoח=*)D]}'<-r7V&N;<[[؃'W]JOZ7;Yn|x׽OuF:emtOrx^_#uc)7C~䶯+xw2Fy~~z j;{A+t*+Y%˨*$Ek  XJfJkH]c W,ht#؃ *lڰEªDbevkt/ ap{O(}+#{1GHl48sNFxGuyegHij8Ć"Nt9QGRt"%dh4MVׄxLjkbbh; ۞ 8c)kv(q@Q٫hR<%"'TQZRF{8[H?ƈQܸiKfx%(y[L8YՑ \nbw ޻W<\| |Xk[@j89),"Zv[]p§[1h5% piW+, pʵZPꀔ%WX{gVSɟu5Ũ`6QR>XʐU67E2[p_u,0jO~Y\Y%֙VG/YR1\bsDHYclF1dd2hev+#zgyjf8z/Bcv̶;h̑h8!ݙ9MČff̨ḰB2 V>ᬑܬjw*Q30~z)j6 ]*uc1Y\֡'/lpz:Vk$I2(N-3*G5 o8ny]Q@§s/qE+ gS*U@qK;륷I!ͱeʗV->jZsZ drns7,G?קG*:j2.kz&<^xW"ݱ=i-S?J!0ytݷ m}**7R z;=jyzO2" SQphHͬ `06j;;]v5ć{̓~i|{fwգmΚԆ 'j>7~m ;5dj?]Շ@J>G-Rgu5WҊ6{Cala~>jpiL@\۸$ȱm I'Ɩ 15<ȺP;;dH25<kKGvq%qF9DWY|2]+;XK jX\LBL;Eˠۖ\2NSx#(OϐcC@'Q[܉aK~KQy.q)Gk̘Ȭ.ek,ʛU UTN IO12̏ޞΏ WT9Y8>^~?_ ?_ "?$_&(*,.02?4_68:<>??D_F.aGLC' N?T_.PV\O*^?d_os"fl~-án?t_*"v|@z?KJO>^ʥ7Z/WO?_?_? / п(QX^ܨ ?P(ȍO܌QYگ﯂\dÚRYTR&ʙ Pp "C8Jt$E3y~/UT+(( qXqy 5.048.,& <.0 .:œ#J=&br;>+v+HԖ8E[%)ry-|NNOYumo26,- \o@H5d3}qG!,bAabNT @褙N7t?c:hQ|=2P !7a!Lrv0S(Po}BX+f>R%rAsm)FhԌM"=V:XQÇ'٣q`PH;gIV-V# ^jP NzsV-қTNV~Nqq,U G6Yj\zttn%=NO0`Ekg}zuvE:UN+ VP09,A-$- Qz :J4h|5A8BįN q,PA>٢`Bzn%bob92mL1*E!cDhL0$ dkE (;HN:*sJ)#">!CK?@KCI\L UTxjțƊ(,f8B\Vjve-g1`-k" !]kc SG W@d"a* ҋ6Be- (TtL,sXbku #ewR Ae܏AYI.QNYYnaYiqYy矁Z衉.裑NZ饙n駡Zꩩ= >h@loyΚSnm^ |\pQf"\sH\r9`1ʭ3sC`IY/][ `iy߁^/O^o硏^Osώ^uP*B  Et o{h " W/)!o3 ${xp\r@ 1HO/h)!BHPR (fX^! BcApK-s L|(L*'LFq g4+%F#n&~'K@VVpҖ-l K2b)c\\ul`CF\pi ,f ,Ax^Ct!RM:^( I`eBAR$;FYH"_ _.Ҥ*Wv!ƺ@Ut,"#U *J3v_4d0Iإ6 %&8@ Ts)L Ѣ8:X-8A]Jzy`r3Ї)Չu.Ib>eShs,FࣱQdT:TCR %ltH?3bR(|$P*lR~uBGzS*_jm B+2qs2ͩ_fW *`B+^zlқ):kxJJH}ttBss2#\yNrU:KKhOx/;%UETµ,ee'V2d*mhɆX\*V ]6㐣IQ-^mWV8r鲘ÆE^z/ƚCf<<S:aʼn#ܽ쪈AxN1a oAb%6[vŮŃ>)S*Zܿ '&ok:c0=Fk%*9{42bݚoT I pV'(X@İ QCCd6? L,)ndG(s|a/KQbY,bq7FWcc{654 %QF7FHDo9I'&5u}e?%Z%Ӯ?X`kUYl+,UmOɤ,jS!/|0w6P&"pv0&3 {w3[G zva>Y5ANmoceA8FmCDi Oz@/K"JOcf:UpzZqCǧ@{Zfp}+'8_b;+Qڠd\ 8``yjp.p\[/C$=P#W|Db;InXnl ;ɖ4ٖ]AştL-H[(qCv6۪ ^0.1n`o-\ʕ@[ 7-^;O1XW->x%^ٗW[2Fz&ӗ:QH^! [.w@O|/`}J,ƜL`l 0p!0%p)}l4>aaonL_gj`MPb0g4}Pabꋆ(6sqAΤP 2\HƇa f0 (0`R.K a.,!L-JmPmVbՎk$m/ю :m]dP,m.,(5Y񏢮I|8i$rbf$ll#NK:H&$)]?¯n-n v0 .IQPW.n)Ѝ) Kp91")JĮ؈҆F!!7 I׈E-2z΋n "oq#RNl Θ rU*k q㥢h #>@""Ď##P!x+jTP'j' /? b+o;/# J&/6Mfx/:_&%-OrX E D3m$++OQZ(e\s fBt Ȳ2D'Z lq8E@1n8y,9s ;SZ!VpΈ /:3,SP(%$a:\Tn EA(@Fgl+G='G;lH1>.H; I1چII*J),JmK_pۍK4LtLɴLL4MtMٴMM4NtNNN4OtOOO5PuP P P5QuQQQ!5R%uR)R-R15S5uS9S=SA5TEuTITMTQ5UUuUYU]Ua5VeuViVmVq5WuuWyW}W5XuXXX5YuYYYuZUZQ 5[u[[[ZZ\5]յ[UʵZu]u^ٵ]]5^u_^__V^6`6a``Ua!^vV_#6b'*b962bb;v`?V6vd!ddQ6aUXee fev_ilffwg5ghUhChqgi{eihVd6\vjv]pk{!, _'dih\E%pAxpX݈Ȥr22M=("QHŲ\p®kG{ǂ)A7r %_>XW !Q#'h#;m%L aUU!rV|!*.!&B1&B?i⍞ IbB#|%h#ĸOF?($ #胔UM bxsJ*Yy7'Lפ:-&` ˘Y)_#TI)$50zTPAXdf$(A?#zK`JJ)HڣIppZz&bEǛ'Hi`bZHgf<:bf kvd͚,d@2дJz` nU(}Azb=dt!ob2J~}Dp?ʢL[sbDha_XQ;|kϿV z g-6 l1bF%flwP@ :Y O|/Y4q? l]Eu;<& B`ū.I#ƪJks `/_RT'aC$h %[ 1< U :UQ% <Gڠ`TB'!="fL?߸*"{:X-^MIHfDHC/-L H=ɵ`9M)D%qȷi ˈ"?1r<,#K)+ЋqTvycVҜYUn"KJ|I1<_=06tV`g(|i6I>}sFmvAoZC{POeT 'yQEQ&O V2yT yXMwӞ@ *"A/HMRj0 SJժZ:ծz` XJֲhMZֶp\J׺xͫ^JK^yq& [E z;sӚV@U!e A37ODR.CGԻ`5(QbJ 1@W nis~39*:ԻB1I/PGcX/T;%~Hۓ .cNrBDW. |,4kQ+x vp(v ZJX"[a-j [B _.0ʋ@0c;Ν2lJLdh5f:5 $yGon6{,d2yӟBɚ]"soon{;,ٵ#^\g&\ReO&AQ&RhrWa%օONcD,%ňQ,Q)QRtbhMcQbX dw،J@T8X`PDָ!׍8Xx蘎긎؎8XTWeGl+`]>8Z`mX = 5tY\x^]~ bpZXV -A u;Dž[4Ux`X7\((i]UBF-k@?eՎ4\wt4~agJW@P⣥@r]מH8Mrdu rRx*626zXb7qǞenj {3x3!78WڛDcz}Z:yZ.ِ f#+v9WȚ@''U7~xJ<#sc'7A|Ķ*vu}2DY||Чx j}:[? ~T* Y~˦ $CK W誕񗣼JFJjF[C 7 hr؁)jڮ%BBeVKt`Py/(]*{'FL48q.}Dnvp'swwEGHgJ8ĄLT91'Qt%df4K|Vixdžnvk`_Bh{9ϔ| ۜm a iu(Q@Oe٩khPq: qROX2F{8ZHƆOg+dX#(y[|,89Տ [NBw۾U;[{ۿ|Vi[>j9 , Xt[=pYH5PiU , pᐵXPʀ%U8[gT3ɝU5È`4O듡RXU7EYP]U,.h/۷|9\Y՗6G_Y2\s`qq$FYawla&cbbgcu+}!xGy׉hdzBCv9fqfh9KdnfwsʈKa@1 V*'-2fUW {AALA|jnIL <۶ȯM G'nƔ0:0;xD(24KKEVo%Q&yB79\2[`+;kXgKi J8\L"Jz;Cɀ۔\2L3oX!{(Mbpa}# 'O[i_+~I1Y.wqr)'缽kƌ.Ekh,{5 5RN yIϛM1̍΍U49ȞW8>^~؞ھ>^~>^~?_ ?_|?$_&a',#%.?4_06?D_nq"FL~+N?T_(!V\@Zb?+*Ohl\p~:/v7Ox|z?_?_p? /|нv&1V>ܦ?0mNl1Wb\bØkP9R2&y`ll[qƕ 4Pn2\O&" 8p!te:W,q7*2]](\8ry⑄i"A)6YnBcvbqzn= dmy $$xd4h-8NʑpYT$=v~^‚J0|2ovRW{bgkosw{5Z@^`2m\r@p^堧漢Z V‘sTrzo_@9\HԇA/m$ɒ&O z^R0с13ɲK^1U1#Xo8aӾ weq?sϞ?rfϢME!Za( w.a7DA/œҝKUT!$ 0d= \7qw.ko dOMz0ѫ;)8t՗du SN/S h+ɊVu-0<`S`m%̅V FNƦY-7[*k_.x\.sB7ҝ.ukb7.wb+/yɒ8vq{:vkNrKG8t2:Ցa/Fd x:xs6/GGF`ޅ`hڕS!ƅcmHk{ǸO{hW+߯*1?P'_9.R6q h6֤"p(4 9e-p zlC5Tpta-G&ɈHE;P^ިtEw1FAXQq.4$e䒹1ڹ?n~u' q#JB!`Lrr e(IJ!+0@nJ@xʶ YP8/3m`ѰQrW&f4#fYO 8ЩW Cnjs4.>n(u5zR* OC2Pn RhSss8N7 93D˫nU>\l0]U)/I@t+n6jzJ`C,]!jD%Ťp謬um "#% poe@\-׎ۮJ X?4?oB[Xp۝t2WAٓ^YCy',pgU܈TjQzђBldkJ$[^MJ1q'uo_>C?ҟ>oc?> :F8Ԡw^O7acy_D nkUսYN ״^-π_ +A8Lϋ͘XJ XO UC JHl9@φ5JxxXUO B=ׂA' 9!Y Q5&1Pa]]UUq Yb0ВnBdB( dpсp<16 E*b">bT-8Y_ĥi-bi"8\X՚Lݚ}B#NT,:~W}SϽ@<UL2[*! Y?-bMuz.X'C6^Tɍcĕ#?Hxc119y-\a?ٵW Hc| q% 5-lu@E1 9 Q8"/ Ij#JH=ȹ8 FɑE5 1$Lf !B1:1U4*#5>I"ߍU8$$&$%AXC8]Vƛԕb`*#b_a5TUd]`r "e$T֖1SeQ=ӝ]u4RfYHM9^Dd} jɠm0Y!gl H ͊;:gciލXv5ygzzg{{g||g}}g~g!@o,~b0 LbWPA(uQZW$.%QVU]s6m(tۇJWXsMh9whhhh@ލI [c") (1MLZjT`&n  h+Jé֌^5n)Lc)A Pj LXFX+BtE+ z܏:RkZbkjrkz뷂kiLB =l@ʘd$khLɫ@aĽdV }#TcL8x 8*KP켐Zҁ;0]ƾK@K,ɲl˺llYPj@DΊ ml8Y^ T d*9-8,BBnK&b8@r *ږ#֙ZpĮmx9bX! , pH,Ȥrl:ШtJZlr\xL.Ŭ'|N9ISWj z|rYKY{g wOmmɭ  ՙj~ؕn㐾 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S*Gz Z~Dp8\SG4` z5d%PwB܈ZcI,~dp;ljm L-HHl\t:] =n6^6uxM漜@aMgeaZKgqIƦi j=jkR ynYiTm%_PmcN<;Is {+0\ f~`]w w9wgQ^ ^y}!| <xFaf5(|5TBc_`(䨅 >(]U NE]B"g75u:fD!9=%;8VcCΆ*bgN^ )ԏU^[HgG HƋ a]M%Qh1#9p5YvM:)1jz֍ša+I_Mk9zB`:U)8V#`:܍ "7*f6*A*݊wT^Ыɥ]K1ZiY.~m⻎ة:FG w&6I`07O3@#͘z!\0ږĴr:HEtIKEH.,BׄBv՛"ÌEÌH1=zLcavuG>W:Y']\O-;9g!rZ x}M$GշsExWA [7:g@1ӣlVeՊfO`&!1F^9w/o觯/o篿<A@Ё֡^Zr: %`Z z Ka  W8,|02JPf!); b2@<8XDO<>4H*ZX̢.z` H2hLƑLj%ECAR% G{+46i0ўDrє5Ҍ^ofH*w+ '2qx큀(Cc]ғ -ÚּmLNcpDQ`sB:CTw> ysY3;br 675|Z2&# 0( SP Z!6` ]P%gsGe;xtOD#);p$)mk3t J.ҸdVu p:9]APs$&Э.tfxi8,ײ/F-?e©ڰu-+3UJtpU`j0AzZ_%EL$eSuLmb5k*vqշU'rQN5ɺubC Q%{I7Yeټ~y|5mjE8{1.RG;+Zy5 WV$4ﶿZuaUbj>30hDhZz4qtCKAf6jaħ>Z5"`mE~Qeڨ$"mcCS[i&tNr("kQ|3q.<t.i4ǹ8݅-R:$s;;ή5{퐸n@wuV4lJ륒\8pL:xγ>πA\|B\$=A.唅A| >NҾlC`H$39pȼ]pӅH%`SfZl!_0[Yb36mG87$dy8|NZ;OXdPs<$=Ϸ뜖z(ti5E zPy j(@34&D-N7RE!He`(K!RQ8`1划hݠjI_V2kU-gs.ZS{VW/;B8k%Tpy۩/WQuUUxF{+ӊn%6Y$6v\Q+fߖ/[·blVݹlwb[MQe7:0=,V$oӟu%P=N.O\߷zwB/~^w\|N_ylJaz..q! ?g)~Of0Lΐ o8n ˌxsPbL`cgWsD)O xrC7 (Ic6CD dQd:ɖfJF{dB;3fDOQeAl7ck$Hftc_SkFmghFxHJL؄NPR8TXVxGQphBK1u .zIBdwq;G4O@dܗuHg,ua {']F<-56Olgƈ5舓f]k"JdI˖ϦlPs3N!oDooNP_w871o?'oᡋʧ "HOFsTDmZ'a1즍Bs1|43$qp2["h#DZR?:Ă( #SR4+WTQTutAtoU9hk;[$9\cuB{7Ir!zp%%kTUj4 8:P?)eH}آ1K!:ꆢU6L(/|8#dIKLڤNPR:TZVzXZ\ڥ^*)_@@@_c@jǦCqD0x @w{j?Ww ?'>Y ?w>ezک:Z`j;`$:mc=f=耦=@*@^R%* b!̡:"U$e!Q@Z *Zz蚮꺮ڮI*iX y{xpP 1D ꨈ qxh9(ɱМ e+$):-2;4[6{8:<۳#uD!> ,Q4fpr`Jk]WsOK,T'FWZ[ tb'@a0E2j 1]_Fjt{[@CPo2 з1Th۸;;rZ$A nH!& 1bFB EVKPNLNG+i+Np>pWs6;{؛ڻ۽ frrQ~:u" #kIɿp7ZGe{ "kCĻc *l6e~ki‘ J‰ ]+ê5 <>@B-M5:]F}@J B=pP zf MY  D __M~x HAUR#ȰÇ#"`߅ %jȱGjaɓ(S>VʜIM6"<@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pK]˷߿ 曗UÈy a' #KK'W̹ž;F^ӨdA=Cnf۹}=Р  ^\]P@u5_νn &Y% {hs t3}!A`Oz`{ʷ f@c_s}`@Ep Řz Hc ih-rA0Aڏ`IiѐDtGQ1@$x >"bH*RB%\_vIKLGsN &yeZ^2Z ˜.5)(Pe`d}%Iמ.%^&3&H)jjc_a*[~ah5*mJ@v v 0d{ nɺ }^ZXnǢ.ݻ:^[ׯ%rP׫VK 3,h}@bdm՝lnʬ^Z|:ri RP|Ih`}lu1B %rrz`M#֘l ׻oʗ $}!fd}$յ:ún`G_-9\8Es攰 16π^y9E̓towLnֲsgۘKx}x/";x?hw]p9_*VҦO EG]Jk.09i򰷱=oWQ XY#]^g; .ZӪ㖽ϔD~(L̲$4y VKeȨ,Gxx͇J$aui}!0zk)LKd! Qp qt)(S3L78-sH-y+JЂbXŸaᷠi9 WpԊF7Ȏ$`4L*WV򕰌,gIZ̥.w^ 0IbȬf:.J47TcI=sa`NL`kLLnh_r_)D1Y rJrh.$JI팛P(3xtS4N~OtU U` P7%jb($Vaj$/ y":0h4j̞u ā)pzeEW9Ac7Q+H_@2!S_S=i)C,g3t j!F?8u K^.腤s1l0[NY_@>͸o;E` @*z(ޏp74zS,'tm ]te;ˢ.T 1蒁 q]G5 Kzh/ 5<6 fށ&aaIpvl|DřGdJb.0apĵs`&Ӣ.z+.ɽy|'8./7RI;D,F-l[,ȄLWq;Y-⚄4U'2.'B-gF]g zPգ>3|&%ب/\kץz#ri)tR~ OK?q@) f"s!H:.i(*"M,ۍUON;GDEP%1N@&SB%VTcUS4^E{f%h7.`'K2TE٣7(oFb#pxy5xy58R}h`T?H; taXE#OGhxsnPNӍȉGfC cg6cD<p~ aPwh=hͣkIy= #80VTX6(vfV:T{Fj[@?(xAx6=쳄dGAGiČg* i[hȑҴBD,k8GJdl>Dmj%DIwf.Hh Vf0Ll3Z$Ff5l3j^8Hton+|Xo$~z)egږo8bISk~}J'2^It9Yyٚ9YiP{eٛ '9 3jX ݐi M) / p +Н) %:㙞~p9$ihvx92ezr" ڠ:Zzڡj 7|" NTMznAPu#:UN&LL#01(;uq@lB {uM*DjkFHzeGI.7+z~bS9H6k7[*~k~/u"8UvpSfzA)'$TBB((IV U5&A*:*ȕ[k]%&Bxw"lpckE",Xp%WUz yWIYWd,ef(#Y8+pԨ⃚-<9udz,WCi ؇46[';y:z(f 9i(ϸ^Zfyڬm]} H8#⅊ ȭ*򧎷84T H^u`d lA`C`yKaf!ZXɱhXӨcQ2-f2)*j;(;ʯu>;l3$+7 k8 [1J|]8;.ɳQ@@pڐ Z[1qdc O l1gwRgEhe H:ZH*$_ CcO7iil$l6hDTcil &jCI7zvТ;)$jfmq5}m)FDrL&Dnot~[n5;[{蛾껾۾;!5T9kŁ EYTu)7 ,[9< 9l; ;bĉx+°Y,c*,.02<4\6|85x #:,F>L=SÙL.!\QA<BJP=jOu^Կ9T 9?)|IMm4OJsbя*R},}'57iG=|ȁQ~R~QQ#\)h6! \VXbeMSY%C0(YL\|gSkʬx4#X>=`Vg/,5),HHͶbJŋI|\7sՇe ,`%\4iıƪzxZ!.QxjH$LNҪÐRFxZ,f][bc4dK=Wf̍XtSͳ5Hk_"ңwY_Is8IEG10RHigs9 qԆ)G{s5bk؊FƲ)3DcD@Q;'0sm!_|m ~UP|}.JM7gKՉ=~c|}wkV=b}Cݼk$2IfmB/9hɎg\g=A.{\v$=F-d\5QOƹ^%ݬ˼K]QTkޛ,g D]=ǼK~[>4Is$=ʋGKn]DF2H4.*JGnYnv R&~(*,.02>4^6.M yv=sr<1CNm5EwPU.wWTf'g\budmf~Uf[ qN BnZߤKUޖ>^~舞芾ˢ7#B MN(n%-zc^ Ǜ^ 9ڂށ0}12?^ JʤpW׊.N YJ|o*Q%("Bɂ{ 'ޫSw\ ́TS:'%l D׭ꕖI *`/1uVcEou\ﮐ[ X_0RplVRґb6Dio Ѫ0*KOJBZ+]E]N_J|8?'Ej̸4Aϯ(LQg:b ( Ya 0D4$8x<E,Ȑ\ 9F @=0CDЎR-%J+% `z,L$T2 .S΀䪌SD;Iˠo%$o9MTQxbG F"@DF"":7;qQI-:Ś`E)W)'PBr#4,M_ Va-cMVemgVikVmo Wq-F sP33s'r]0yW&]WI}S8`|#x.!$$gV4fx_A" ;望- O].`i!495@c 棑h]F,5OPM(t:6`:uqjN[mx hIy֤nEdCl&*E[%I?16o6e\5vt}v@J/8ouAK߶ T9=;ׁ^ ej&p\gࡏ^驯^_/O_o+XkyIbXu~w eP 0x 99qGI0`C@ TaAA0o@ WH%", '5:`Lmmb bdd/* ]07!(re0D<Z8C6qȄ)J7z3g/K'6U C=>"pu8!4HkE@B S]:s\;H*Dዃ@@.XjIe)HrR,#G@G<쑘p20X&XB3IIF8X!JB@3 xce1: Ppt$dj|9$w ۴8I !2&VL1rw2q_22 WKQ܄k?34xț $eh@g8nWT\:vs%؂DtG@9MF w t,-U(QtQs3l5ct&O ԉQ;41S! H*=pSbC&S/?Cn?eOHsKO!~uQÑPAP>,Fl~8KP/K+D0lSYU]Ua5Vc(! ,x 9pH,Ȥrl:CEZجvzxL7.zn|N~eYRTUgxR ca bGVڎė\^X 2 pʬ* xb ={yUC$B aI$H:w*!jʇ-#^Q@%r<JѣHi WZo! Pw[F,NQ93 fCA _K SV`a{ [lڂo94)hCMdH ;S ζVq5l2mVP@gzoB4"Xt7&MYzgw,/ɚ^Ͼ+4P"A,DB[ z鴕vzU-NHW}ssi߉(H`@& R/ĦQG &T2X#p "6XŁKiE[}UYӐ!x=Hch\U(dITx%&r]ĚoYQaH[NדV4dfpE^(Yff馜EI'7Vy= 7Z$ a&AIh*'AWj}ykȮ)a E}ZtpM:Ͷ'FVN:rX8nkw notrb ݒ-$sDwޯyl5v9,(bU럼hdiU-;}AO,-5Ѐ`(Ƙ\mrA)sn56Wa$I/hlx&@ wa-A //P.8j9hŭRL}(\qACUړ+=^8O>uiް.n/o'7G/Wogw/䯓H'Q|_59Ϊ \ ĔS a;G $5&?eקXH0,)caӴru…Ц0g9.-&JGO& XR Uʗԕ,2vjBҲ( V3[sFk`Rƛp; T0AX] dCTh+Mt:)7z%ŀɅAb";Tr.v- 1:uY$JԲe $)>F/hJUge$"fVsn k.XʛV(5 !+faw%s("%PAϲ> 9U"0 uR=Tna pCo([gNoT$?<*egVuLh*hTO)\'݉ўRoY 1?jHֈvW*yz!ts 5j*kj(8|J.Q P2c# &uyZt=T҂_ *Uz"~a .aLr0[eI0aUgGfN̞I*c.f4 ,ZI6 m@:fi lW{m>yEۚy{߰ЭN]D'Ɓ+10tL"u SlνXX7Wt KhZΰ7{ GL(NW0gL*GBc1$ @YH'u! \1`x [y nsK Ԓ\cr @r]ͫjH"2y3(!fЭG?L$'PY E.$lu,Y`ǽH^ CvhthF=h0Iչ\ FZ>CQk4m}XW f:l#Z>2By~ԗo![o,\(fKRaBinKt&bܫ7aOX~T,ܝdFjQ&M9V^F4my 8RC3מ| KmR%S _Fłj /?YݥVъ'wtJ`[PRtr5W*X'~rFgUKUp~07}Q9pGDq X}PZ0'YOZY{fhБ4xNT@f4mU2|3=]>7f4l6j[l}R4qweͶ6ƅ]r$nU8s\465'nVlFCY_`A_3bJhzD& 8xw`^EO``M(9sЀm؉8Xx؊8Xcg{c؋E q{sz We#^Q8dYfnga&Lj[fLfxc c8,ȍgSrhAi!i<iDYsi0`@ZBsVjQj0$&8ef{hc'VmvmG}tVHamF}#)]Gsܕ]֘lP ngGf-eo@@|6x0S(p1KzqxpTdX'(qqKIQU"}4ǂzu PYc`G*W!tUsqRMЕ_~YD'w7'WM7|OXTǑ[@)c9wGg+hǘvǧd0BnGUxw/vB}~;}Iw T9cR zi8(>{{o⚞k'n_0R ')Un'g*ΉSf~Y1̗$#||ȷY)jahTHPU'fFk cwhtԹ% טi .mnES_.vK(ӵ$2$V g1c/JJقᒂlw4.({I*b7e:)]=8WB]Ox \X4_G=ڄDX:(`pEs@x]ޙ|0]k\'5g3f5S+iQȃhB88~h{c਄h؉f8_|Xk'é -(n}(ڪ:Zzګzo;e Z ʆS 8p0QЬ]&aZ&oAA8R3c0ƞM2Hj? ȬjBޙj9w7F9Nc ud3adj;ԱU$Va[t86a4Xnn uC0TXmaWi*W@"FA7KY17$[t%IzyII 0rNٳU[V1UELNPa x嶙Lv+Y8 IN.c۴N&OA3xBjFL$;J$s¢;o;X&{?C0V[)fyɩJ `\@{9e)G:źouVI[|Tļh&*k~$aպ^Ǜ W<[%DRq&YXk]XXCZӻhHZ|µ_kvMhV5D!h+Z\[ch7t5YJJCf;;c?+]@ "^Lmڿq3%l"'X:qapX0[{`x":wةahjlnprIPjc˪⃰O/AT ;jBl+"e/i:哲߶621k79;2#"D[Fh|>RGqqtiN3;22Ͷ$I3AɫHзŘ\뿝.1O{g9"HdTQE7D}N-4>ۜ z5;SDRY9mb};˻ʬ5BU}*LX^9ܿ[A +$أK׶侞p{mw[s%[m؈=<|lqMش= J\;هL?1&3(cy͍=)bXĦ[H\24l:{3 Yphj*YJ;^p HGL^4c̈*;危cݸo 6_;qߩ>^~ YȻ$T x?Z@lǠ᭸@ e`H0Wm .޿#0 ʸ{?A[2ό4iKڠ1.+6hUlb F ZΊJ2FZL%xT,ʒH!{``wekIxAfFq'.pKhXzWm䙻INؗa3{#N@h݉ -ȷAќ} p#]A|Ϭʞd좸ٕ6TVR5 >^~Y*X!yS5L 7z|̕ǰoYGu# `u0,2?4_68:<>@Bz4+ʤH0MZ@QoR*+\!_c/e?gϫ?koǚ Ps߫Vy~?_;[EhP g!\t>QZU~Y~a\6ivq^ ".<2. .>30-**J"6([C=:"1[jYEi-> /0g= s`,8&S%D 8I 5;iP@ LVEj](8"i1fԸcGb`I>QE%v9QI߀re%K \hHm"DL&JHF8WfպkWXL;CgkL,UYB\)i <ZUclwPSydn]Z/:21gּ'pX8;3)-UUP< o]xǑ'W%-bZ|+Lk~սCB%47x׿GEK` ڜh$r[2P2ȦMDEPQBn+-@%AJė싑hqN(j }q`;JJ%Z2r"0l X X64OXER`IR#~Ht!QO`r?EN"В[q@K H i1cEwlԊ8b @OsrksxԼU&01QGa5=y"_ Va-cMVemgVikVmo Wq-sMWumwWy{W}?454NXa}bJZX)6w$89iI.bCNYnƔ5i8GYy{Z衑YfNZi7^駡騩ziTZy&̤( .e_Pzn[[\ /O\_'ɓC!ϼ {\Cυ*l G9JrY׹W: :iɶ1; D@2,L(Ek@#b]O{~-x,0{eyo^uP!OQ]!ω#[23֞'t l .N|xr/9,\4;AwP@|~ ]-0Lcpb13CdozȲ<0 g&{ME^ӅU\ 8Qv굾ݛ(qypm#c#a}9d;mw=FNlfPǿ;*\/ݜR4pj()>cbGG =@" zOμ`GТ-Ȯ$w,cb Sl"@/|Z#/8eĎ P" Rb}ba@9jO x #Pu 4Hc";Ԍ//ON0D 9m TЀKo p.C )"EABF,@8%`AP|(.bFQNJH 0L S`,O͊Uphq$q LNHaF-l6V1 )SC&& Q Q1UP +9f6meQ$, 0!2"%r")"-"12#5r#9#=#A2$Er$I$k m$U,%W%o0B`&ߠ>$lr'{`cJh' 8 r(R !2) y)8)%)+,F--2.r...2/r///30s0 0 031s111!32%s2)2-21335s393=3A34Es4I4M4Q35Us5Y5]5a36es6i6m6q37us7y7}738s88839s9993:s:::3;s;;;3s>>>Q-s???N`@ @ @AQ AA!4B%tB)3^4C54C4A=CBEtDItB-BeCUtE;D]CDetFMEmDXBȌaE}C_4H4FiHD/ `Uq2(n(ŌG?[THH͔D+4+BȤx &2aBϧܔK 5tLLtQ%4MKO&M5U*a>>QؤK KQ]TQ5UQ'#Ua@lp22Utg6{tTTMFUuXU'bL=K`N "RW}XuHu\2Rak[55o"n䀀kj,WUE5\UL˕ܖ])F_ϺEb Ą b/EE ``g-*g,]fcMtf&C' `pw檺5d54`G@KdieW*eƽzV7v UG@OWDhthhiU+na55i=ijkShhD6’Ȥ,aTcGjA(<ږO_Bnk6otogMa)Due3(B L v`^q!w?vhrErQ -Ra*q$Kv {m@uƒu[P%CcWvk4mղy KY-EvOƆQB"&c^ axn&=oNꗳӭ jB[KVڤW V1 7-WI*\Z|Xqf23di@/Hrn5[V| 3GVX%+z;+Alo7a+$&-!fY$~jݶ‰r9ê3_}6טSc$h>r~6x2m=6$f߬VW_=WyFD]my̋9koǎv_Gte jvf+3C~`jc_oP[f=bBc= ,`ȂR (S AwыeQ MИ+!,<䮞׫FL!8=΢u_#XN@+4[[y-Nj>K$I2Ԫ=yi)feT Kf}$>~ E^hTM nH+Ud@['BV܀ҍ&\c-&`!K/DKR ] !SۚEŅG! ]Q5!X"'K I,*NcFBa~)E Lc )A(g˪ 2iҍ5PWR_-dHG^ ack b+x\#sd糌G})C$G屇 ʦcvMzη~μvGϲ:cp,f='\87?P5ri|KȉIQŜ3`N^VҸ,?y`f>LjЦ)PX!%$"¶Y!y@gy"E wտTs 4D柽{U;Oz⓲AAwe(cN[C=W]G֋Z볧;$aPkIzxCl»Ţ `>pV}lV_ok9y`"3mnv6]œeݽ2x\ewyngoP}1nu1vs{aw=Ʃҿz63` Bzb|;&ac6_`arnK&;=oz.x;^4\6l9&1B5OeA3y0⸎!g]iŎoK(cA35;L(Er"N" ) 1u%2"8vv-ҁ%+F #E&B$F4e(|8d2(S҄yxtW)]uu-6-#;aV"dD@3u)oXh71IՏ|#RRR R}xfڸ/Bfa<*9-VH"6353~IX#ƅ95qƖecHy)43Sjid@;"6RcTsRQ@Pt3[P}[!Udӓ)AFٓWc8 SNVu )U+CÒkD0XPDadWfy !7"$$CJID ny9Yyٟ:Zx7 s)"J Z okrEfEry6 :w'6cIW.B~{Õ\)rG3itP^>-,Ř ,?s'ٙi*C6|XO褕%_~Yʬƚo?rjB:鵨 ʚ|5+zot|Ñf^A9 3 hҦ֪YrZZos֡3֜Rڰ]B6کl\ڄAهƉn[BJFIw7@z銲t#<۳>@B;D[F{HJL۟Qq,NrڴPu&Rm1P+![{GFUJZ@#~q!jrյvr3hy`? Q97ԡYa<ꐏ'[uO0uH娣aI Ty m3 /LGӪ%D&Ҟ[~T9y9'%%m/)%SR%_9UjcPRESb&Pj3oU{Rc"(I1zgWg;[^[¾Cy+}j-is/d|Zך,>jZRyyJ7$s c՗YaC[2` 0b縿E|GDIwu7zj!@鬦t ؖ#\뺭"ǃ?ܤee8{z7/6A . ;;͒l"8G`c`S1)z8VC@[60=+7åz4C  /T{HΓi…L@PX%})>iq>'DjH|?sƍzƱ4vzqt쯘#DtYqPCuC+D 4EGTFDlIL{Yiiۉl PR7FMp$Wyp hm ҲQ?DTJgAҠ[lj6;nh'm3b B=D]F}HJLNPRO+8+avlkX`Va˒FZ hώ׶={rMtK6k |Svps-P}ՉQ{ҡ} [7UِK }ҕ$dKPHRK uSi|@ظ ƫ&ۛBۭTMBkʋ\DK IZ[j[Q\w,߻x4ض ]q**ޯWK+3Yō0zy˧yֹ"H S} :W֨/*ȫ",l-&\V'+\G`t  ެo ʺ'3Ēd^o]'xLUl4W|Y/ ]7n/;ls_=V ǭǓ%s^YS c\7~H,ċ M*;lЪa/{ʍ]SDi[Q[TIuqU9eϢWQ ,5N@oiFWdH7+Rl1umQSuGvhyRe']v[n+wUv8|&q bt-EP) 4gO7\z/hG\ބєūuHYqp{E`%ZN {P7b*,}s?Oؗ]uOlI ֪ GsQ $BP21Hå18,64߁5_(dPtq^G~y !#%')+-28.:68 BE8."X?1FER턘H t=2:Bo>_W=Ai =w. |LZ/\p SדSCT!r6l71RcGA9;bȑ 3[\ @!4]ȀdS(H*萤c2F:dUWfպy*Ο0b3BPNE<W=0ai\s$XT˖fּsgϙMYKdZ,`0ʉv ^6=J@޳N)e̻5Acsf`h\?gѧWZ`<` Tsf vgP3dfC]`j:DIP@& 0;QCDg?$:,C;`n G4#BKAibLH뙴 LI-Tq]"̂JcYo9/ԢֹRUp=Kem6Y':Jc`,:uр{ 4D]ւN%$ 5 @;{wT ŝ:^] ©zqW`+zJ,|(W㍗*D򗔒fD4$-nJ8YgDW4ТChme]'4K4OvS> 8hh`[60#:읊"Cm$|N\2 ,nX towA`bl;qfSc],y]Ik(<(0pr]_~F\v!F[3BͫW'yw| %ϗ Q?M>@4@. t!A N1A n >©(%\ :>=p"ABЀ6( ې! @hO1 g 7fr@ XZ+|!X"@(CKlǚ V)긚=,\ֶĕ SjG6: .:pdP9Ď9P_  )^&.V4$ 9wY 2]\.K,!iԸZ!'+33] =2a3Lh5 A6鷈SFtCΚ-WMLĐe'NBCz( i&sAOms^_=NbM/ Nntg 3Г`s>4g'IMT_'R;P %I/,8 @e&wMڬ '9UmǹP5)*iOHl_4HXOaw꥿S WWTBe8ذ'>I@"#"c;=et2UZ[i{kB ڪ0^[1~ V$8@e$0HC>oK':;  LoNҏm$!u=P 8u=# mP!L! 8 l/{7Ap^n~nEXxP*s(>1X+6!:]XD~l N*7+vly*d ư<@lzl&̘,Lv6!|)~/82K `[j` @(.( <0je(oҢY'FfY2LٯP *d@0Pa 2 jaPgFls,( { At uX0 jBÖ1gڎ4 0P)Ep #8a2zjCR #1%\ܺn@T&DiQ%TEa?&KuOL*2+r+++2,r,ɲ,,2-r-ٲ-;XcBr.ѡ N. r/S4"0 sVs1#` 1)X*s3 !UP834 D4As5Y<%5e3H)R,es,, ,T,/ +|AA!4B%tB)B-B14C5tC9C=CA4DEtDIDMDQ4EUtEYE]Ea4FetFiFmFq4GutGyG}G4HtHHH4ItIII4JtJJJ4KtKKK4LtLɴLL4MtMٴMM4NtNNN4OtOOO5PuP P P5QuQGBQ!5RNR-R15S5uS9RQ @5TEuTITMTQK$UCR;5VeuV?UmVqTUuUU%Vg5XRk5WXuW7"X3|5RuX5VYYw5&.*q唈`m~n^%%ŪY!5Z]3Zu^o5[?02xc";B);; `pd3uRa^%^E/Tnlu*#6ḥa_bMS'6eS 0,uccfEAddU^UVes1u%n.;2Vrvgc0iahUhvb &Si7L.C !j5k6Xkk723.iK`map[ȑpcvdnnZV<&_B}.Yq6rvr344Ep1 /PtEQttKtSu1N5vg0xG guWZ!ww/5a?M.bu3b{yWXWzqz-6vJB qF7wnWb" #`_38@A$@U0=e5}8UWOOg3qA]1S5xWVY[xS_IueIh#ugxt}؆8JzU8!, .pH,Ȥrl:tJZzxLfѧzn|N~ eW^gZcU oY ]]bƊ\ T RS +m80E:0-s!B:(N) 1D_@r•c r,T\҂DQ!$EI$q22ׯ`ÊuA0pAj (54m_:PV-[7 `++v.d0.pPAv-n.9nB5 b 1Q&^V[6keȱȓ+_竁.ZetOg| bUNb^GB%`ge2=N\I$>|FqɊ LE"vfqLE3 lL[R9PJ."VgYp}dLmϯB鬞)*ŵ1̪R@,Fv]6smjF6Ko,0W6FA,@a?F9axϜi>m/θ=bga"AԜ52WUQM*]YNZ cB޳~h٦@V$+};T(bY̠7z GH(L W0 gH8̡w@ H"HL&:P4Ǹ*Z_R32.zaƇ0hS4pLqF2xc8P: $ ? 򐈼q cD:_nDEHZOTHg,d '?=@LP)z<'Izn8zc~LIlV[Y% PijdjD"Uhm&΀Ez4Y>Jb\kDKR`.iL}龟r8ͩNwӞ@ PJԢHMRԦ:P}ͮ|pVzXx{6<%NEDmU a(~]> Mo( hQ$G (|a=̻W _Ó4 5X]k1ta+@upd%hB$b',ڐl" ): Vh?`x%Gݴ6/ 2;lu6N3gf2;P/;g@ Ҙδ7N{ӠGMRԨNW!{Ჭ>*'<(ZXǺxFCcjWl5|k -dCc`vZ[-3rw[&ڰFdk!<)[w7+m_cԑGΨ g[DžZLaF+<8ksf{](,\\|B] ɬjs+ ]V/*J+23Q|W勽EV4Jtyq޵ F2m/dQ4e`%xnz*Z Lt-m= D0>Lc}h~Y2QFy]v)Ǯ#dffctd*\I|ߗ.E8 G`r2g2l-{/8E*h7AjwYk:qaIz".CyeRp2>6Y a#X[9A0;*|Q;æ9WqPVО SF0C(##({ yEt93iKFf u9sx:85SeCZEss'\Z6I%veʳÛB7KyC zv%fR;x )y~ʇuJc[mkܗ@q~nxQ۱ ";$[&KK%P{p?T$.{pp`+;zy=E: A ,kCk >JovPM˳;LoSEYfBU5@:D]6dPhhqKqek8t#$c` Y+)T]dv@x{C(HwQ[b !tw봒7Ԃ%uxsK8w4$.>&u75t:wϡr[F1Tm{)dqxjr+ԛ CAˀjrP۳+C[ls}b}p[ke1dTiIVoP_+<\| )XASķ\P7b;&j*." $Fp_ė"FWBQn2\ LK4Gi]+m3q`f[É@G;d;eƉrpSKDHg~ 6Gk@VtA{h+P[L@7Ń|A{}ū"jBj &eĻlR ļ\E8 ɰ\=K }.׆¿L=JK\| C,9̊͛ \6B<\|IiK0 =K Uд0ШwrЦJW}=ўԡI ҟ41$I7 'H'2=4]6}8:<۔@;,wnmb(`x sp U.IUg|P RFza} Ю0ALՋH)'i/_Vb6"&RUOXO%Z;nT1}N,׊@ x㟬љ j$YeaD uY p٘NZ=)qWx~i5nHPr(('g#7Kq10/ ^z%-^#o0Yv޽<>{;;#% 2ۚ4IwJer`{[W']Wc ,MRPv&ֲnrw+JZbcTǓ51J'K@0W@sqN-vywbw*5W 1'V`ʡ$ _N> k^8b'IBn3C &*8388xv9jGYMz7a[%+҇}-ꬁqIЭԗ̳~ִZoҙgӖ;ge3(燯M0 \ ,kv3~W~hoy.΂^~~i^`{hV$իDeiUdEs _E&@O2TMIRtD<D2K$qzG(=B.D^:<>@B?D_MFF_hŃ:]YPCU_CYv]OCR`!`5tlqW2de.f> -f)?_?_?_?_ȟʿ?_؟ڿ?/&p)P_o//_!p//Nh!_///OoIiMDkIRo//T0W1aRo//TMشF3!_///OoIe-MF3XQo//TMNRo//T]mRo//TBT8iB#S!_///OoI=MFS!_///OoIe=MF> Ro//Tl$d4%mRo//TbMlRo//T;EQo//TvՔM!_///OoKYk[M/>&_///Oo_///Oo_///Oo_///Oo_///Oo! ,w pH,Ȥrl:DEZجvzxL.stn|N~}fWRTYhqR ca WӤctXUe֢H*ùQKh~YC2}UUQp*O@HLe]*!2ZX'PL*2"Wl`@. jʵׯ4\/J@^\HJHA(h9Kb] 0 䳔(wF ڊY)ySXʞM_ <͐d>c>L%<+_;: i2Әf,q^~pT{#͗!L#V8!*Ht[N\"D^G 5tL4h8fd%R%Q [_eKbIa_l j)V}]مio-Xp)g-Yd@Ji`P|`iZ̷̵D}YFa[aW~=MeVʂ$z2Xiꩨ*Zp~ TSh6*(ffiiÆOjZF+5zI:&c5C((J kŗ'aC1G:KBl / :n1cRV+#i `:qO1ZgW ,tP24l3,Y߂܅S{ iwr.+s2A?Ԁ/S7u]]{(}$@M;xhLfyx7G'eSMI{ ]Vw#8 _hfe[*.5=uӰjr>&%㑿+xUu߷.n/o'7G/Wogw/oƬr_DUTa9#}djUFEj4 \S*dIuz6=.?xH xFH av gua%ñF4|9A$1 $RNDta(ppEOnF\b({TRd:"SaݚdD2 bZtf-en\&ԳG /zPF''N=8};Ė@ &HsF5h asNz2x߼^9ҁKL|uBaѶKą99yr%2  ettc4m9DuZ.LdAًfE6A[z ..aL <5+d̎ YONNmŎ#ʼnɍڢ*$&8I)PMX .ǃkJEҤjϝ@'O-PdZ(' ʥQBfDe/k >zɳ1 )UR:sVh5^ 9iGZbX0hS(]\ZxT 4ټCAx%"tCqu"WUF'W,r@+=gӯ.U*`zFHfM @@^Z@bz]K8k1dul=3Mgs&Ai@{)Hw48R2 9==/jYDx4F#8ǧ+H.1E9siHhr'lD@_Ȱ?5Y#wF0 !B ~qJ<ۋKZ&%IE9*϶*}[ƅ#L-ÇC`sT=m$N[C^|'q)*ULQ;1tÚU"EWbdMSd uzآ]HNg"{B|,V [ri6$EpM_Ί5puaA+/gMџM@MK,Kq„ҀN[0؉[\гdZ2b =oR0q37+"7;mM:yi劶`j"a!=]}>Zu-@ ~@8?ma`@&`Eb d2Tskq B`)g`p) = B=^t6,2b|*=I 3!q!IDp{[ q{1*2*ĵ }&8-Ffo&GkIn8=4,=_7pZ:]ݸ$An`nb4Jeq rK+k`ԶLܖ m_ 3&ǯ .@TZCiCLN~$aQi$iXaHaP–C]%&4[jap,myx \8t>RYcXp;KX)@Z iS\̭xB8.!#(+-/13579;=?ACEGIKMOQSUWY[]_a/ 2(7=.h<2؜.2rw{% *.4%r޲uc8`A&ThI!h ""E{pe,8zȤ`bEyiI#Of*8Qp?ʋ<}tR= ,,B(Ѿ)BQi ^0ҸЉn,H}`#okaLX=008aRx|^L5l7k;x#op!+O?@21<'Sh FE"}Â0KO7tD"A<@D\L8i[q}@^%HBzCa5f,j!W5J$ԯX_IUUڽu\W}X .NXn!X)1X9AYI.QNYYnaYiq矁^.hTW , ,$f%kCޫ!9;ʁJcz\שh%͎Zn([̻. N:VnWm5X xT GjMxr˯!ȥ)2wh*c'M*U`hvͅB5;O^`Ge)c'=X[7wV7c{[]dz<0_@-n*LS/ut[ض#J@RXp[[;8(Xc:$7ΐp$T"` 嫏d$%RZPo( hR}I80 rȈiB̡EՐeUހfYKXՠexMVj!=m%G tKZ숸Èift#d3 ͐8QiEE6~B'.D&'Wes TF"`e$2̓Dr@^)> QE8aw5\V+E"4 qRԗ& n.v(GņP?Jj&=Rn cNM+VXʼnR< ]w([ta=(Z<4kmD0/auc!YNe1YngAZю5iQZծuka[قjdb}g  H2G0Q 뺥rxA= zIr#{! (ae aH{DrAjFQǁ,`c$SOIR@ Ph]{l&ܓ +֧LJC'lc:Ov7idQ"?MH( y;bCݸ#!!BXɍwJW(fbbsXf%2_XxaBFsᴆŠ(vobn'U {gl#]1X"WE#iZq^K&K_[ Ǒ1"HQWf*#wk uzM78$j{3 ǟW1oI ϽapF/DDW(Iwb;ec8#.=21Fw'M!Fۻ{QG^Ma0~1 (@ ?VPzX~ڦ6mxs'aTFU4jը?OIxUTwާ~ʂJjȈf kb]˜Z/ì 0 ,]]teN'XHᅼmq0upy}0p0 p 0 p |.p Ʒ/n+ f%k"0Tź !p b"5t Uk"'&Q-Me@BP{PTRIFGSFTUTa5F.NTus^{x>bgRa$V@$mU?JT&(u[tAB/d̤Z^`T5^ 3H#T>)(2_u`)"Ҏf5U\e+靶b[_P/4Dd)`bQ1;!S;yLR .$eqV*$L&5'0`mv?rvib7=qAHZuҬgkbK5V@;ťOUu~Zl6!5H#s,aeJXuUen p7qwqqq!7r%wr)r-r17s5ws PSj v<8t?@ e(2Q!hB7^fMws18d[5`cWigWs)1\[w9Uw7)z7s361n4RWvhpwts)W?YMtvZObrWcW{\7(] ]uA_|-7}vcUUQhx~1xoWV-Bf%F?r X\M8?cH6'5)wb Gmn=rAX~ZOch_u!WC*͸w `Zckx~I*Mp8ilm@BGV|i˷RqHIU\!%oz1؆cٸ8x鸎8x&$qghyjR4hiPWn_aWo-'n1njס \LW;#4TLYu|À0an?WYY@p thSeibAu9,/bwƊqU}YFlzq Sp!ƹYrXQ}¬ɪQ~jgR1y [~ `!IN8\Mڹfm3/RdtJ$kɠ 9mZv0APxNPx:n".&(7(l-a /L &KoDnܐp^*c+עO+Gp6!9ra jPE2$IH32ר3/gN<[WLڣ5;ڣzz=DLZ:TXJϸQ F}MŧlD9_, nBjܻʷۤ LR%;I5H^L1#`$jH5{\lW)&|U|Y]aʷH8vK9K׸U ̻\^%ʹ` ߼gb1\`\:K = 6Jm:v&xz&X֐1A=E}IMQ=U}Y]a=e}imq=u}y}ׁ=؅}؉؍ؑ=ٕ}ٙٝ١=ڥ}کڭڱ=۵}۹K O=mۗQЀO@`[@]dGg}j=e@=+ #Od-QUv@)>%[)/[͝}㷵C Q>U~Y]a>e~imq>u~y}>~艾>~陾>~ꩾg=~빾~M~ɾ>~R>~y~>? >^!?#-?1|Wŋ\8E?_Mў/-(] ö-[8&ɗOx?~FFKU] =s G{Ϋ c.=Fȿ%_ٟ);Wݖy4?Kl?e@ȿ%_ٟ߾ 0.oEQ0.4c4L՟ 00?`'c>fKs^ٟBjCn/<c4w[՟mpf`Wa`c4w_՟ @rG (wd1&%#%|@ȿ%_ٟ߾*G`G*"ghp7F C;400@՟ zR_dz-%ڋ_՟3qȿ%_ٟ>_՟3qȿ%_ٟ>_՟31! , .pH,Ȥrl:Ш4X/vz`O.kz|N~r\ Vld]h\eH[W ZM[YkͰ۝ ɱ\]ƨ E(qHzpp}V pP[ R^-4-%I#0›8s3 Z BcE-$v!^zp-U<-BfD=ÊKY8N UFB ᑫy0 g"uÈ+^̍Ơ"Ҽ[BT"XΏ hLAg. d̺װq(TY֢rp>'R +N8Lª3ŞNBFv:[ Pww䦣KN9-hT6{y\Z&艑 d'y1($Uh #a$T)QaSQT|FP"tz8# ] F+yE+a`o+&g NAIt$Ǝ\veHJ9c^*-I@!L3O=.3 8G"FШ`*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰ƺKW'@)뮼>H#~m6&:S-F+-ج4XS٩̉rjݶ.} z.GS`2DLXķ1JN$<,g ,EQsU@`x p>l-lN"i6zX8l, q}ϭ[H'mQx˟y&3FXgRs`!'D#Oh'zT+21wW|oY8J.8ƕ3 O&^sߐGfֽ '\ n>.褗n騧ꬷ.nhzit@8''K{AY [v͗oh8@Kg`y;=6%M|J)ڗد (o|/#oʔ9D?Z@ǐ4tan$+s@JO0 8ʐ[ GhG[ 5:YoHaOF&Z@:p'#A9p51I B" 2R_"Dy< l4ZcТ<|DA @p@Q_굍 Fa$ 9^[y8%hM)'?0IG-EtWHR% g2JBb:`.6a/}$UJvx J@DIIV hO&6gaJ3dz)<0ACvhH,~ I '&s4d5YH +\ DTLˠdS4:v,8 4L=Mͣu56P5h$#dPaap`Ptsͨ3l 8'RRG~O]H-pƔ<3C24,΂qQ$Jd* zl'L!PӍILk8JN+7P;L (Z/I]Iɪ*m^ɅR&)ch_]yħ]liz7+쒗ݝ! Q% RHÀ*"ל jрU-.tE]Z*`e\'1@ J3 s;<#{w )󶺔 ,h| ѫf$^0nfLyBp[W\}טȡEnE|į!زĘ*&,,5 $=d\S)}˵ V,rU[VBw%Ѵ0흞.3^4i3\:s)!ם cb±Nx!k 8B@-UEC]^Z+]ianTԩG9cT9H K.9)5&V oз|hOX&s' ){a]@婚^_WF=:ҍut<[^yN}-.aCQeo% V':vg!d%;۰]hMy ,8("ѶִH#_{%ܵϒl"(- }v+?l;ba-R׺V_]lttKp^֤^~"om~c_bl_gMWE` s`q_@]c;ak}Gy^afL-8Kv'jyZDXFxHJL؄NPR8TXVxXZ\؅GHS ^8d17Ql1rx ~xuqPhboqw1Ԉ)j2$m@XpLqeX p ӊ ǀB؋8XxȘʸ،8'Ngafgx X#P=҂2((eՁff h=dB8ȱ2q6ThCfwWUR _G7Zi5CmiEi85?BipmwCh0(Amhbhf'A@h%;"gI`NlG0Gm)hLy$q4Gw&S7wЁTIk1EUVq$Z)QhXkm~]R!B!IJo XOl8"z{XyUX1,ɃƕTSdMKMX|%'z()wM.wNҘEN2B2 }֛2O{D{'xwz[y{WL*њ;`2f}IaC"Ӎ$WXYj@ pA:wOOʗgWxyQ?ک#~i ƞQi r'SA_vGpNS;[hV8'y)war}PH%zLVqIQuUt8Bdh6ʞ2Y@:>D3Z eVWRGm ?dUיoo]|OqOwb G ɞ)~{k|<9~j|y|Ydw*7%z8B4X^eBppe_bIYD4ȪE{kezjz[i32=hSh}x&1ݚU$9j42wB,*Ӯ CtbD`޺ ۰;[{۱ B&:خՅH(_*[W$/닪3ۋt(X(XXĴ؉`5P z8U[&;Qi" d[f{hjl۶npr;tuCfx u;BVj!ҷS-"){{+~Ѹ-.:F4k;8x_H/a/!X/#aC 1010 szc1` ta}HN㻭À-sPVS5;̻<J{2K>:٫cUf0Ka]346K$I\`k7 rpwgV $ !FKB?eۺfLd9OhoV<+\&|(*,.02<4\r2y'Y`ÿ#@EÝAdPBwsGpdKķ8] 3G'BHl`qŝ'5\uZ Gf.bj;V? O ?=&r|xz|~ǀȂ<Ȅ\Ȇ̳sf .4(K,A^QDzQyK} )ʢ!NT4;X>GK D˺DcpXJZ,JQt4hUʢ`p,C+յ @]{̲6ϡ5qFPK`^vmKTұ;p<#Zp Y '=qgڜr:EpGЧHѹr1~Ft}9Oam"Ղ'][?m77]ܭj]]g*j"Ud+*$la+?]Z3n^ɝ͉D'*zԝ)֪I2vK5*ޘpϬJWuZ йE5\ܨ.2,-_pL)ѝ|>Aq K!Z|d~*m ]Lɕ\-'[YFl8i%N>nǬ(gN6%=X?JM \(qԥ"cN<^~舞芾#^+ҕ~!n!ף{~1GYC7^j 9tFvG&o.ҚGG|$BN\+ЩJ)^^Zum] QCؕy&M |9>n ^baw]er %^6x9Qw EPeKWwjgw9n]fPW t ;!?Sru[l~zwXu0x}3tw>4@[B0` 7"&b8U_F: K&~i'Axxz|~?.pmԆӇO Lɜ('ё/XFo ~(09!Rzo6W U:>tv쬟ZuSΖƯ>k}an/ s:KtS?> Ty$o>`ˉ.(~U:r &P,^$cTV.ϔZ^Y~a\6ivq^zߤP  /,4.  9.2!??="HRUWY[]_acegikms .2/&$!=) ,637 Pocs t 1#*yȞjzuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl^O 1PC{(|An`-$Kt`!( EM{ѩ2!CF Sˀ @5-҉պKO}CRJgP9cxd2IXsP7@Z>uh(*vA=b/gkU5wq@W@mtX7$ۖ[]4=b-iW *V+PC@][I^4]`B8om/6WDEy" Bj]lRƐb-⩩":; Xꛙ̩^@b7'|zNx 0 TaFHmb#;M_ZqdK%<ɝZL)8f [`(;MH< %`=2kPhC;h,C)^13^񮁧l[ FX{xH/D{ai3&*Ge.s8x'CG16IO`3^^=F9@nN[ؗ˼O~v䀕 ֮|!KV%on[|&+9fFрC pWTF= hXBi%psab *fb!-9ACHya G)PWs?$@?,e(z'n, qL M8 $Be1yLΤA* g_3I[i:L_, >DcB,b]H[Ga6Q)DE]1NÔpj`+2 2)1B<# 5d) 5%SĦl8g"G9x)P#v?P5AP. uC!QNE1QnGARud\UR:HaHR4tB7iS%5Oze E5*; RM<NiU:|MZW ="e@hVu S[ֶ-)]zLa}_X5aX.uc!YNe1YngAZю5iQZծuka[Ζmq[o\5q\.us]Nյu]nw^񎗼5yћ^u{_Η}_`6`/ v!a O1a oAb%6Qb-vϘ5Mp=d!)0򑑜d%/Mn27zc)O9C ";]򒡬)U-msANa=ds̜f=ynsJm.RVm Q2hq 2<0=w&sj,ϥW%BDՐX(qCȌ]RI,Z`O8k[mA-je>WUwEڥV #KJ{bw}l)'{&f}o]Z4\/C_̄R[M{6IoxQv|+FGq݅,#S@Č+Pt7f3|w˟H_;~ m;M)WyY^*|jPľOPygr旾ye ѹBoˆy6ރ~٭ww:~"]f|w=M8bҚVz[2K`:S"-1 EaDqnzNO-4 wmK o 4 hQ>< BpFJNRV[^bgq0upw}"!, pH,Ȥrl:tJZجvfsL.zn|N'A#\U{}^VU`by TQRYp€Wև SH~E~TQQ… M[ȰÇ# KC@1XT(2nJZ8i8Ǝ;t0SL0ǃa$*]ʴӧ7ˁ  Ο ap+#"dRf 2*%N(ФP L`)$k>Uخh^۷Qk;?y4 ɰװcrjC^u. (~(Hɍ)`1ukν{ފn8QJO/ ' |?.@sk(OWb]0GJZKq^ч0REXT7Eu($.c UwcD_aęR>WvT܈n(D9 'ZV\_:`eP_{D@NNA@$u[TYcl< @3tRMVs#N)c,RυK$9(MQع駠ft.\^smpNYt=\XHqqG)8+P6F+Vkfv+k覫+ka̿lLXt p+%Gܔsֺň4w1Ca,r#c4(KȈMNȼ5Ptk=D7P@AqHDzj}|J(K@QO= AP25j%ڗDZxIWI+#a `b0hQeKTePve8၎^g-YDQE Z E*!aXE!<*{^M0;j%LKj~_w^F7^VqZM8Z꺴IXJ46qx@l@C,d#-Y"VvUfndX̢.z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WVD#tYe"XD8L{]mEA pU(f:s@&#Gaf}\9,B<4 =jQ`g) *,NK>F?lvXfB<ք! ?u* ^ph?rpC23 HI"V DKZˆ1LH̩N8V$6Aɠ5jbZL,=!vu#I'Ƌ 0uNi4(NT}BRa z*ZӗV"@h,%8X-3PEP V┿7+~rxpRv•R*eNW0gN8Ϲw@ЇNHOҗ;] eNUrzyǨ̘!gY1}vIv-rݎ7Maf iZo&SIaջO\-pff" d4p&~4OpqIO>/zu"LAکc^y?aWjo֒o:wT0էZ5$Y{OB,kPoiu![V PߵlS6vlW vâj7\TmեYVzYu7X8f{aD& 0_w[b'(ZVxQfpb7Е2cԵ!Z?U:]SqxB}!3nq^ΣD`/ #&p6Hz (aX/`pFhQe`$gu``)„tqz'Z{籇'e87)+=:u(&T?+ Pf P @v8^}xHFe_TQ\`eoeeShjv35e˜jVa|[gpT[D(*؅~"^'3(J8YhFF~affQ%ȅ\هk&;ukU\ZcbkS丐G5i@||Hjlƣmlv}} $muTmրK@Xnn}qU)'Uwrs)PBW ٓoyV>|8p"+'qq5WQY+zNȔp r!W,Tm%R2jlٖnpr9tYvyxz|ٗ~9Y0Gx])25hiI L9#v)4ws5Zyv?EqEsWyw\ /@bTxnxdoZ@#[V`yBz7z),_9X}Y A4#D,dC,ɜgVlKu\gjhm|=c#.H?F#p&MOPn%XGaY 69XAIElZ"5z8 c%u$ z` A'sÙ8Zł[6@ӥ~]@B;D[F{HJL۴NP0iG iɉQ떓):ES0ǧx:Z˦8nEEY+zkk^mk9qHZО|sYS %zzfyc<٭biy+Oir7Y穸Ks%eUWYzٺDІl;pmq6 ;#YAZ%zAu,5g}aN㛼qyA:-BMPkkzOj͊) cJfkHp(҄ݫpjt*ڷz =j1F\jc!z"zq,Z4T8QKO3<9<*@=lvhki6<Ⱥ> $EijPi[ z˻O+d BLPp(eZSTƯ8d49Mpvbɘlz즌᝘s;$ܓ+F$ƈҕ"%K'Mi, ȁ1+gV4rCʼ<\|؜ڼ<\|Lqd4n pzx|)hDϤHZf{GE!bBgPD;s3 ^6 %0":}FUC%67۠ 63M[٥DyCPN:$ȧ|N] : tE=!b@;b(Sk9#+`L ?c=ײQ]LcDjM+i#h9t=دauy="v-zOԄ= ќdx?=5M٤= I K=D pdTԮ}LQb(0%֞nT!JwhU:C?}Y'HuBҋe%B/ӊ[6I#إЈ\WiWȥY]M=.,`R^hWՉp=gꨴmdlf _cH B0(ZgZMBǴ]./JI ֪l--CJ"pmkHg|nJRlsR1 So6o1~>ݝo\?Ĭ`_; W/=Eq*?_ȟʿ?_S Ȍ`jO~wa`܋ ?H[ ϐX4IO2P>L'Z~Y~a\6ivq^Pt:6,,60((.& (5$)-GLOQSUWY[]_ace$.#/H6*p**4;8m1.,4"()mIf/t30:@e5<0^7EE8bE1Bp! Ud" @%.ܻaeMQ`z'Č?:h:8JNA4`*4Pu_q%"gOgѦUUPP`j]G(=w `BvSa88uؖre˗1gBd#FCE\z#UKvm۷q#(_zD){ #LR%l'R)+R-/ S1,3LS5l7S9;S=? TA -CMTEmG!TI)K1TM9OA UQI-uL4UmW@F.) GMJ6Va-Qr 5(Y*$&)V2b[L Pmwu$2ADu\*G{]$"2,C]y wZy883ԫ%\, 8H52ޕYFԴ'QpI|U*ˆ C=!@@d+l: c x/Z_깃I|yܘ)z\lFl Syn#tz%i+#/`\|h|\"c;gfLK㣦׀=#).'@x ( vu +ّ)|O{{Ww  h8>ց= 22h6H 8|`b4Vb8Ac/3X ' PQ?D&5B@aG=!kp8_K7y@P@ސ]RÜo= . B񘸿6y{.z^dR#[pLPi`HD"}Sw@. K'SHX}+aY kUY<+3zO #T gQC@dj@̈6"jSˋP9 դZ(b $%jD-ƒLde#[ ܵBus-rl08yLa<ى堳LvD@QԡYWgI7y$6BaXKtVIE!ڈM>hڊAFl&8xSym~$b`;Zqќf6L N\[u[-\gqx#_5^`s+gR w[b-9 9$I ҩ]pShQ: q392aT-B}2"LZg_˩k i6Zmv< ,;kMRFS 5FQ w6ѝnuvoyϛo}p7p/UU W7mlLer,'?zrBYJ2YYRr)խF^rO)Gs+ ]S|MNBAIBڲ':&f2ld X$gWR*@qq}}I_X.ZF< }HIz/ 6klU 0.zʦ\-)[esШ:BhnfN|W( Y:/ Ko a ={ )Ba=>GP= 6#(IJC!hF|? ,Bj0$,nf" ިόGhvdv~(aj "1,G HjĬPpO  3fs*ƙ$N'+.B4S3+Ԏ PweY=S6 H2(X/?3 O ND)vF4BBr2Gk7ot}Nuu~"0C7 .Ѳ7PL~Ud7@'0gWn{bbB_ rtCV-ȈdžS 6h(5h^^ȠO}7MIa%#P !HV.^@yȗeX bw g8c5 t8(XwXo -0>%H`苑wR!_ɐ<- ^X/P;vw2mIXO_\mj^iBU%y5caKVE/ih@dӏb;s щ˘"lۈ$Ji)9VxBw9 L#=ԟu\՞ڌ0_=c]ֱ@Bu/%=}|؉ȍpl%xzb$ӥǩm|ԯ X5]+\.r(˽i\}!x=}`Ns#Q ~~ 2 O ziGb;îy*%~⋽@B;@ w@g!^ Mze@ # Ckos葾ƕ~鍭UI>~Ԩ>ŭ~> mQ !, _'dih ]B+tm|?ve6eCޔΨTԜqP.8AuM2c6-{<ٚD B# #zStIKo~$y`B;(@B$[B\f$B`áĤ-`ֿ2Z߽ aF}#Bɹ 3#P(ÀA DR`f> 0, GpT &t{#}ĘW85q&8ph G㄃;;y>2HR!pH4re8Xka:N |)Xaϒ]eVu~v@ YH%O/a-SB:Ne\*TB.cWUG5kF%Z(Uu83 6&;PmݒJ$-[3 S)et 1icY=ֲ&rTv0& s\q'd&c{-Ym ]_z"0ބ]c7N( &2aS!؂p v|Ƣ8R|! `b @4@R ܇ p_ g\iy%ҀcA>Ո[Smhsv]@Z`$i%UX lqe#`K d\ ] iHՕv 5hҪڨʢz>έ Zky9:{+ظ5(+iBee6BUYiJl9+rC N$Щ'|DwR44+/iȪʺ霨1>N)9-hPA-s6EZ*2.f*RB8ʬʡ6<+ AH͖I93"s ZT{̋`-dmhlp-tmx|߀.n'7G.Wnrs2l2j 34dp0:A 6n촏Ezk* 3J ;-3`/{ϼ_^&^PV~V -)F{7,X߀ N`< JnpA.G0CE05Lxp/(xa  r;@L9 8,ቑkahׂj8 #±k7BcmQ 4kbũ􅁞H 3HZCslƅ P`>D wGhRiu7hE;jS `aAU▸̥.w^ 0IbL2f:Ќ4IjZ̦6nz&k5w gDIJSXЂ:hnu^t](m~ %n !*|8(itڤR:`1uxsB4ŦO@j<Jc51e՚@p siHǚRHP,Po)$a_*RG[ MA &ĸ냆G!(2kAYLc@8fuzWՍn ,AeVAv&X?#*L:ɫ8*ػ8T0d@lu@8ѓj61c=X=G5-1d{5Nd*rb>{qI( dАbJ.MхDDE.Nė4i34;jYUЪ )|\^vENqS(A ܃VfQ86#V W%$,ZRE_v=Y0hpGv66g8ӐE] {#g)+kSʓ=ր&D %`I|2Y/a ARF&do2x(ʸJSS6nQ܆,e<.Ռh*AW1@W_[Ht % WTCWqDoQw%w޸q^''i9'EM)Ha*QUiw<&BAuAFY|>x{%VHSI&% B1 }C+ .Hyl{B*B#G2I]ߕ2'#ж3~钂x3In#6u*$c*oy˶qtYZd=D3Ǖyn6D'iyx}x~hIك`nz>Hy O4^`dGagy~8F++ -Ȳ}+,hq4%ʂ'tPAؔ>> ʠ&D)SrH&.C)+J4>A,ʉ%Т Fx d23F3ϨR!u5Ćhgi2&:XF I4ZvƅoedxJHJxz|ڧ~:ZzڨZNZ8` :'CjJjj  M]U8(CEk]4;fKJ &Bk8A&[Nӑ8:e;h+Q|գ c_sseX,@Cn{GrPWZ%,h_:8Jeag:\5C #ΚG9)# E4^LDE"|˱"k ِa\'!9{0[8fYffl{?7N Dc&b*3Ʀ͘+J:O 8!32H)eh6r0]IIr'z fN;|j}Vj5htX {x۸;[{۹֩\q4sF+䊓&Ϻ)#:T7ֻ ;{ @|@ 𼎺K:k:;[{蛾껾۾7xzJv0VpܑhU lDF4K9(u?}ؘ$5 qm'ERë2i,b$=ndeb:UvoVoJ̊h+uj T5[dLq]sTuWpq wh#'ʭirkV?V -qk f?W<)x ,ɮ-W|\YjuRK4XLCY)۞|܇֠u Ywwᘻe㷦z(Kp3yA+ }BTf{WL_wzS8)z̿w,@{gȃśq@^NIL!d(ӹ|_ܪW{eſR&~y}dzyŔ F[@'yw~>$u"L*LuR漴Ůa"$%-q̃bS){ǟ<52/}z+􁗒K"HJd>zd2CG#W@(rCȭEt_v;l|UfT(5X( !u7Јdև7#gJ؂=؄]؆}؈؊،؎ؐ]i;-LDh+L zkL(ϜMٔ۩ *8YLM iGl2 d ^n8l? 1nڃ{= Jh*6-;@+^NR:1q/я7v yR-]"鰏AfGTBqpN/MA8d˜WɕB\; $y+7thU^ဉ QmY7gWՅ<,=gN[]Xy^hiv2)f-Χ aGɥSYL,'@>L+ٌ%dp2@pLв"`tnl]9q%{ؙЅj:ȉN# ԵzH뙾WRb_z#TVќl {kPA)u}A}Q^V~ei"y** n8Q)GVKBWЍx"zٵݯҎGlzG.x@W1ڶN\d>ЉFmBLN}I*4n$3._jvv{] Z: \J?q27q4YgVymvPpg[LNPR?T_VXZ_M=j]dG'j'-fvXI>Lti.VzR =̽D mb ` !6H 2f§.-fpj}+m\SQXbM޴-]I[cIl /-b_GF``A^*Y-%pW6Ysl-T7|:PWBpU5a噮ram_ҷ}r.rp`0"aHfe9kpF$18jk)3 \4@՝h䉌%.]DJy֜2a]TQ,ؘ$,q)`\P'; Ц7/}k7/8RA9B;xOhbܧp OO3p"ӉtP<'UrR}#N]pe h1C!,w :pH,Ȥrl:DEZجvv-=YU|N~wp[RTVadkjkmvR k i [XW`hp llYQKezIaxU]3%*2g{e A X:L0L iltGH*] ӥ!0r]X`e@=20AUcDHU`+ 0J 40`$}{ՊaƆ\˘3k@l&Wp,8J3 Kkpwe(K$E =x]C״7﫼sɔk̽Y]G D?-xZV,za|,`uWcqUؗzTQ_ig!}erh`Gf`4iD.#fF1a1\o'^(UA1vK^5F)T"E(tJ)EMlo`SRD;>veCWkjI䡲U袌6p(o%IGd(>s[(8ݏO(M)J^謴jk Y_X"T@uPL1ŭViVdy,V kjzLBU0fㄒ2z,Ͱs'p hj.u=wEv6ƖWCT9i-bT͒mgu}LJ# S|Tū;%qLbEE 3tdF\PG-e$#741$P\rI[WRt̻pD$Fhd֋H@ NiB5t>S'7G.Wngw砇.褗n騧ꬷ.n{fs{ XdwG/0@?.}*އ\X08r.mԏO4F*x'cu@Ԓ^ Ӂ z$< pLZJ<C4#tS`c2B0/kn#_3:S_F Q8D!"K.ЂD&Qi hL#6"jB~N9HeB C$UW IFi0kIv苎c5P)&7١- zERq-EDrJ,7ӣY#|䋪C⤣lgLR iɡMˍr CHaP2!S8  !w *8]6gA '(㘏Ci @Q^-IG:l.Tk^\P7Ўz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ|OO=t{\OtB%T}G0 l-[xl@2h_Ojij)$lzD#q2)\Q?jFs,9kw3PZ$ EaY-JT="cõ{+MY)gMZ?32Qu baFs=< *<X۵kNlh"Ĵ[ 罏]J^enPmuxfNesBB\T#噱xzix0hn^X̴dg YJ+E2%ƥRzzm4z\ g-EFDDu]Ėԩc9&֥^xgH_$b-W65|yK[P}pxg鷋d&\"(ܙ`נv { ֩Xp(IyJ:izO'w)7"I`xWch_ueMՅ`bXuҜg-݄Q0ꩣ` ZeVNtf8C?/脯AfkDc4BO)s$Xqp7fʸeQvh5pzڨ:Zz*;vw4jJ;\n5k٩GT:pIylUl@l$<`V>$mÇ僗¬: DwzdBm7HpRH0gJ.`p!j*Θ Cqu5Y u`S`\P*A))tQ1%D79gZh|Jˡ+$8?8 Y+0K+4ȩɃ0gYKv"*ׄΛY |cc z;z[XxX wػoADW$MSqB(X襖hg4xtgfh2YbQ\qwrxēE)SXUBê p?ĿNj9ȌiA(mRh񺘈&Ob16vh:r 1Gƒ<ɔ\ɖ|ɘɚɜɞɠʢWv0&`e ʣ`8%փ=ؘl żˁn<0'l܀aP5k8h[@X< lR)zGSAIڌM1Zq"=A4|${AL+Ιse[нՠE ET*" 8Gp!U[F$l`3@ b -RWT+ʾC ''Ii'S8-Q]wXMP* ''F%Kg,sL RPUd[=D0NlC` a-TIs 5va 3Ҧ4Q=רȍ7Sk?{-ܙBTҼˈٜٞ٠ڢ=ڤ]ڦ}ڨ/Ԫ%V滩I U+M j1m ֐Vuz$í 6fE0z=lӍ f):LPVo|"Ypo>—q,=NYu&t/$s ]{3-lu.װ#GI7BZ/+tφ-1^ lvӝfI͒le\М[N|"oݲ Kc]h}w!f_Dp[\3fik|LN DAF"Tpn3܇8hytW&-k> WL%L\j&Nq:F e H]RƋmϗξΛG_"J'\*~ꯐ+5stk4zoLзiI!i v9MœJt2CL@.0d0סٱ11~lħIīsej:.".fOhFχP5hn$HKXb OE)$`A}A/HL. A=tiӧQVukׯaǖ=vm۷qֽwo߿>xqǑ'WysϡG>zuױg]]gv"g1qɯaXo~Z?M+Oʲt`@@2A,a>+ʢ &Xb A@8 QL1 .!Ā8*?`ъPǝT R3Hʂ +S <$0'ƨI dgF`([` rL*؄xM+iRXC(@g&f\:83/c,0FP4jCW:KFzY!ˬ2\];N?Tڏg5B Ƞ &([jLB`['Ж/HDC]q 6{K|*)1zw s?L?2h!FC0Qs 0.aNE?3ؤ ch1\ƄH_1"Mz8⡅2 =UY'a? ?%!˔'9$`35iLdNu6#fnvd6  |4BF|뤝`e {e /o#Vձ;â1.p@t9$e#, ;c*j\a.[/`m 29-(!Y:/H@ E )7۳ȹx)?5ZfC_GHHFVXBW}!f \ G9HdjZ2g3lv7l Kè@6GEgJ|j`N%aSCRP~a\&v 2+X~K+ 'H%$0Yq`4C96GDQ `U`mWchh*jsJ5$C$InBy[Lzr,9Ac 4NY΋1{*ԡ rD< 8VDdMvǝ <]}827[ɩAoʒa lG"#+@äO@hqJjuVY")% F +6lZ5+zMNPV:BB0D`p;擅y(;UF 9IExIy][ Y5hm[OX57-Փp'n![7=bix /+BgXB ᘇrkhJNznkSY.63qlX秶zX jUW;-;>).L]Gr1BZLp]ˆQlP)ˍ_suԗԌh4ѵڵt&5$eO4A:Ǣ7~$FI2ܖ{_ O1a oAb%6Qb-ƃO$Ɓp4AiƩa!f(5a6da"B *È0 =_<ՠ,;lLϚ~Te.l*G}Uܧ q t&Ĵfn6&5HPAV[(zу򸎠v.,׮0B"UlRQCL; a%AH@kڿ"{ ((eHuSYQm+LW &b{]@wTK80iG)1 H"O N-đv[4J]} ;n4&ݨ&[>R$68]!VVK AT8UpJ;-⳦vՒUD pRݶʹ҆}U== mR c/bҖT/}[}WuK'GZtT12z bazvwu$`jm;0cps]OX;S .u TXyn3W': P/g_.lWxʼn;gI%6ެ)<țzH59k_~w.ޤ>,`}oȫ# j1Ϯ$ $ۆxL 䉢آHٴŠ(h L.Έيh[FP]楽ħR`'h!\mK(la H82P6j&2OjkS 0 t?0p'/& )L D i0rZ1q!1%q)-115q9=A1y#PQ90R,iq8j1}{@(Aq7ԧ˾c;;3@ē< T5ӗ+4d>+hA_X%ӊ@Β?@tD@DK3A{ cyJCsC]!Cd,?A6ED6MEQTE" 4G6moxG#GJÓH4Q0,B*N/cTc7Kec0J#bc/V0 D_wffo658U_giio6jv\jk7VkVTklVlǖ7j86]-! , _'dih ]B+tm|?ve6eCޔΨTԜKA(-Zneq4 UekV;NuA+q(/#a~# #ySsIK)x"{;""B'@B$B"BŲȆ ɨ?Ǵ3$@-`[p^F$B(C Z<&H g 6|0dqЭ:d ؀MLp,e $ ]ٷA4?0j!Dz,PPP8ဧAdtHF;#'hpTDꐩJ֫ =[l$p[e56 hD 7 ,7+?U.J :`b޲7N}& .NZ3ͯ* 'E 7/8n-Hm 98G CM4dFĞma.40gGF6Z7_9%B~GYao +ŧnrPՉ& vP>2!p: )$ UU!1Ww 1ɀx@ C y}Hcb@@v)] ՈRBBE6$PǙ;.9ݠ ]7& cܚ6قQiCuݙ|^73}ܞO^ O`Tʶ}rzJ *H#<:JEY)%vm*ʂ&Kc$*(( nS ChģUKnV,vE&IJtA8A-㮰Wr+b7l_!lȿ!ԓXilV pTEA 4ud=4(0vbhk=*la>} Y6UvR=2-A塐NY*Wngw砇.褗n騧ꬷ.n/o'ˮ2ZgppQ)O߇䷿_jo.dR?26`t%ר?[Ҥāearz8 Q 3H1^@'V ;B"M\Xނ"J P..yKSB`8D#N.YbTʼnU@ZQrdњ@N(.,?r= rF%r…0_ ?( ¢^ņN`J)a2f |TBDHY/̥.w^ 0IbL2f:Ќ4u,̦<ч?`@ܜ&@pr'6p)g+KBD#@yF3 o~JFgݔP~> F3\юz HGJҒ(MJWҖ0uߗSd55_ Ϝ"©O)M|ewa2`Lm*0J՗hzzU_M]eBZ?YwY©m#&J׺xͫ^׾ `KMb:d'KZͬf72Ay  f^$<[ǁ²=(2evyas6T/BAnКmtR &gYGaA\tW? >~q` TW|ˌUe,GyeB\,+"6/#,`4M(b86'(FHhğ+n /H=SRf!,-fI40 bE}P3]`l 58(Z8r+DahOnU&Udl5Pz6L07އ,ʆVi4R.R18F3E30G1Y<U< ,jH,%&xƍiR뫠FrdOIfs !vRy&jR0J. ,.JzmUM%:ZX 5`xb*AgqhXH@1h@_trCe!fr#ɘHVC Ǥ"2jDž"nTP`iqԤvXR 8yOjģ< ُ-TgyWlĵB_j Tm }ԧN[XϺַ{`a5VA<~ځGso_=E>%_B2'yA^ h뼯To +{3+kmDrԠ Ӏ xfP @8_GVg`4`p-c Tata+BH"4WI0q4svdD3 g7bzb.F TV35c'sceƱc#h{j2!r!powP8Hd/d$xdee[zbea|F )Rgr_(xWfggRg`"u|g3h&("\CMw]("X%jbn6-nOiC>nR'6 f.#)xijctl(Bk,G05 WD Ǩh#UlH"6qJl࣎Ae6ݢ&F0DwmDnV/p/|n ]Ҧ4/!(ӏg)fvIjhWGNofph# 3 +4L q4ACw[sd1.y4W.W7eGOw80iassW82Q .s5@‘@hi^^s3t~xz|ٗ~9Yy٘XsreXgu5j|bBW7Wr|}YQb &XiWg4a j_v sG "Tc y f㜨x|a^rHD3̂za.qсB=Xa2P!ga+3V?ᝨH* `QiiH %xdng1kQ1"z2_8l\8_#%c!YcсeAa2)!,*XC q}Je\&(c+Ɩ % zi7zžM~^(RPqw]5HQ*~vb]w 2zD+!Хdnȣ# G _V.BPdAJR\MB]36"ǖר^~zX^] h(dkqҦ#DYkY)r5r*ǡUVea-"yZDl72X4'vzb8 -~!-.-EI$(j ҅DY,(P"J]#CXrup#*1z6+2䴟$&I2AHSKG)3)AjƱOFQMC4 Wq6kYxc8@b#C +m6) v9I,KkWy3 QZIjl۶npr;t[v{xz|۷>j %YX+ *bK} E7U{ X J@vZ Y+(@zr-Ƞ [ Ťaoy2i)385jY$31$aRQ;)k0 ` [zr ~ࡦ!$G8zb ܢ %(AހA/T΁S8B`hEZgLz2N A)\#l!3JUKTV`jq80 1BF'Cxjj6rNL»zA(eJ@ũi,2A#iP(0JvjjgX ފjRª^%Ь!'`Lpazll:a(c,as,3vd=LjHHH4ɿ겙`,˦hlsg>Bq.Xlj/AɊ2`/b n-x@PtmOKC˺'C!14˔,0 G 7AYp#Y_+tjfk8OD67wQ[ t|7\MK9Ys9~:<>@B=D]F}H|ex|ȟjZdZt՝3=37wf9Ö0O#=^ݤ}9?|@ EQ|IV мc*aam4tc_טwj*0%:[,,!&A 8+Ec"u*r6v=.Dc&ŪP lh!e!h M d]+IFw=Cf6Qޛ pJxghq:t_kbo=jX4x̌ay$<0l˽&tdž!jAbyƄ>$Ā LH݄o.: D짃)N>:[ՇE(.:?X(6OܬӬRMP9~vXsU9P\3Q _QFdbD ?_4%_P7b쇁Ps\^-s V${E+6CS(@1;OC( AOCh8s p oh:Kbgfuoh@TjlnprR r8z|/ h m7- jZ/RbsOr/_rI@26?_?TU" .q_,]nbGo&L*8kDao؟ڿ/uc /x(wq_w"=/w,Q`3x$ yqyu"r8 аo1 b!,w :pH,Ȥrl:DEZجvzB Yи|N~vo]RTW[ bgjomkuR eď X\ļWnYR Yɧ |*\(K/(!0 &!O,`̔*ODXfV2y YE 8ɤ-H0\ʴӧPyi˺_؅q" x(1;tpeWd@dˋP[@O*HZ+-H mƋMJYK˘3kh d"ٰ5>-ypdl6ՊiHw9hCȢϤ͊qy+Kӹسǂoy-u,ŭp~/*۟fgbyHB51zMv 6a[abIbPpEW[qra[L\WDp%a( [%U^'  !F0qط清:*1IW:JZR3B&QH(5dF0yߥPKK+D=AN e"X.LT0aIbCT*vh y nܥ=(\:!3/cz6րcT&5@gA  K Q5,8JXx~?g.W>O\Zφ5m HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ ݒ"EPT<*zPɅJǑREU";ؙL k EL,XaR`~'a}`^$d\pU"ZXBo`h+&:PDԲEāPȣ٤IġUR(JQ&b'3hg@Jju@p'y$xJkZi^1hOR| #j^tZ0NIgs (5vdO , X,iiwyO %I]t,P`j i( RBR /XB1KPl0#X#˪tp)DHP`YLNcC &t!K0L"K&S X=yڞL黽\#&$Gq׌3Oe#$`[[*ù5rTP; ^)uV0G$ƌ*,!L%GpKJԳq*4 -oq׭nXҏ:HTN?ۊ%50UOXqNd/@J4[4 2DlNGOi myVW`60@嶻h׊f~-.cP7IqM0q_7H!LvMKt\ i7FúΖ XE$Z lIfmE~Fڍi0fnd:W,zUfKʼ쪊LR o>3`T妏~`yMf('eYtx=&O[LZcez!s?G28ə7lQ$w@x5]eEdv IA\Y\hB654cjt4s I6{Mfc4i)Nb"v k4e@EKUUE¤!zeim.DrD禎kGiJ! oXv&07rY8VbXaGV'%(FVju&G(SNH:ZejHQ:yajHVd٦Gx-hjrdܤn  r LɞEy>zr^Obt0aI "OUM<uQel:Zzګ:'yYڬ@WvwZpXRXڭ>G:@&䚮|edJuHZwi%q@tK{D@ ڰzNTN114e15&;$[&{(*,۲.02;4DE#G59N,WњHUҰ'={3dtfeE]A ]Fu;j(^zL _Bg]gATera/rra3b :0Ғk+aػ8%5,jH) :3GKnѻ,n&eTd\(r6Gier!e , iJpwfn@뿵(EF,{mCh` hᖣ"/Jl]M#,fԣv%.,{B6Zbkk\%ojLPğf\]Fo֧ԋ0 kz:pLߦ[f)<~Wfƞ2@ @B=ԅөMԱJ\@ "ԯԛbR=P՛чZ%J_ sie]im"&qmv.QIw{m|ׂ=؄]؆}؈؊،؎ؐmH{= ~Cg6c}1߰5jǜ} 퇱G 4ҫ] j5bD۪ۿ-*'xQa"r̚n"95a޽ͳM< M_~EẌ́+K9w8>&^V"[bIws띓 bIp[bˍgh@u(fd\xDox@dBpZ4t̞<ĺxٌfDp\I 4^mK!ZħêHX^ cǫ1+lh=TV(Ej4Zk¦Ux5&e$ݘD$62~n^ n;78( ~\6ڋɍ.ΐbv4d|+o +P&^P>dYCt^s=w)P, СC˼2 /+Ḫr޾n[Cȵk 'tnN@뤈+JL@  Sl>S|A>0-0 q< YC>D'L&H)a)' ѫj+Cz `!2E/QZ(KI S=a` _$r/dѓ"(ٚpG!π=(6Uo:8!=4 $Y#OXYf|dqH 9L=."0IS.Z뭵dR)->Cl{2[ /O\o!\)1\9<ڼ`JI/t$5/7O7]MORPq_=10Xh.WŚ g z4倓OVc0_ݏt{O#?PS2}uM_V5G9c03 ]\)1M7 XEnq' NuQ`c8Ó = 0P$tL "L  P7pEט!MWD7HTJǫ (@Sc[@s#f=q1c 99%7Um=Cctά&B9e>JdLGvJ }Ia%V =P|DKKNI|C2n4f9UJR~JC:U'HLttjgUe*P>o0) EM?EG0|]\֩BI==R\nɟY=MeOF$bHNo*5*H= ?!@򉩧/ H4LUUb97* $G Д\g Xz !PY$~?m`She42(z9ګ3|ѡ@'":B1O"2l7{xnBѼ儣l5_g%160b%t} * 5Q^t0PP±I4 [.{yć[]b%8 (AE6򑑜d%/Mve)OU򕱜e-oWnp\e1Jр6f5U\3 7J}ΈL υ0\C/!ꊦip} 4A#a~YjU#Κbd~jY&Zqk]׽la6le/K_,V= 'fS8s6@A$dmG6r a#3ŕ$PJ V`2‡]~c_Kv+m1AE:P-‰=ۣUxQ<QJ^ohb^ fܿ_2߾VbZkԊj,Ho L(Mp.vAA$k瀫"ԾJ'@N"bdp n:w>0+ Æk$֪R˂" npU wyz+@40L*Π6Rk`E }x(VB ` N>  Z֠8Yq y b"n#raܥyn/EWl\xjbn[Jh@1x 2$ q1uqy}1q1q1q1q1qɱ1qٱ1q1q2 r 2!r!!!!2"%r")"-"12#5r#9#=#A2$Er$I$M$Q2%Ur%Y%]%a2&er&i&m&q2'ur'y'}'2(,((2)N))2*r***)Q ++2,r,r 2-2-2+-2.r+ɲ..,R ֲ/-20s0.03/P|C>r2ْ0-2 0s3R/Db"ᜐF2C1d02e(3m6 3u.=3Np f"~"Z^'y8]Gfs:C6q:4s7S1J.bأi>gSjD;^ vFs63;2;7H"bXv= I\L3@oP>)>Bs?S7KbX݂L'tP`g@A0$0B%/-tFC3t37J .AbLnVԒ4M<@!X4I:Fbt2)F47o;sJHDiIG{P3|LJДIc3JrJtNF04GC, b #nyԴ*9 vXF2tRN.G,QR`%5 qEK4R%RaU+/u73FT=jh%P5U#xEEtM URNcJ-uVɲVmI9O% .XM#T0IX(uYiYU,Cc~:u@DLT=٤@ J\Ǖ(\-],Bkaf<ɞlASu@H5_B5)V`` +B9`(\:hbcdaUdG+Kv/Afif)fo6gu6x\}vRvdvhߡhc7`ii6jtjӵj1!, _'dihl뾬'tmx|7lH,ȤpX,GZ:{ x,\( 䲙rL+y~/"Zu;tuw|. 4 VO .O3/22[4gĎ3ZUgig ՠ.瀐ԪQAyCܧTiF@L cC-B,ꖆ^> ASIAdICj((h*@E;0&`ql+P, (mpm]mmd@N/'@Agp,l' 7G,Wlgw ,$l(̰%-o!nܙ ,#|s9/" FQa4d LyZt {k$@s64q.l%YOF7D9jBؠw --t_hx*@8XfƃQV`OȆ8.{=>C^5`6_õ`:C(ciԮ;0|:VV]=JU;m83C;z&K A KB G.2+ym0_"#7P(f[͛ d'p,` X"%1XlF#3rσ>aAƬۄ^C+ 8%P nx0z=g %p5 $A4=ʥ(0DL6+ *<<`cGi4$Tu]~XQ'IK`S"=@@D -C+Q> @dm +yd>Z)!35걙 +a`zqX@$ͳ*T^ͭnw pKް܅ A{/y46j.0Vq'Xb}q =s[sVny'9_*|Q@g'nA$0 ,TCAyNT`(A1 }J/V!~ԬWt *bD#5!Hl0We|/vxø @Bִ0Y~&y R,&"T&PVbMhW%݊o38N2 _U*J_e!t5Xacʑx Hf1_'2LZa'D%S_=y}IケBl|d@AZݶNwUoVrY>P] .?Qn}*$@*D pz`MvMz[Ƿ EZLx׸md_ q-I 7 p?/Z~+USB&fhJ'w[ނQo o\?P$Gxq9/}Ǜ]@k`_B#s<Ӏ 9q/oSrFeCZ3.N=*bI`Δ׸!Z\> }po vQ3"ZaOC~-ěZGeܝZ3]xn+Uj3>kVVon`&mw;f0̝O;ЏO[Ͼ{/'=sR= <=Xtl<~|p  > ˧qqa70d7p`h!:qd:DHdk%Q%0})|7J s M!rk/,=>%C<%<`x4M+Ѐ; 0v>0Wճ>Ibs\06VaAcˑg*HTBCbzv5s(0fJvBj#0/ Ad_tTxEFdt(`At~GCMA+C Cr*`EFd%4y_`P ExraFsx:T\Q"J[(BhvgVJxKV!~w4xi-ČRuOxTgDw*%1Fx4S%{HLjt1RThQhX0mh:w}K~gBFQX$/eJёe c4 PIY'XբƑjuW(Ȏ0 v@560 FtsWD7qUV&}u+BkR S3"شxRȅtqXyl7b UNUInTNu)5ngNf`EX*x' *wmZ-|7~yٚ9Yyy0췛Ss~Wcқ~A㍗r 0_Tb80g~73Pz| 9xCiǧmĝP8uq:8;mH:Ld%!9y (8d7Z9 2I57H| uG@.CRxRFO׃KX3BՖ@X(W;Z80=_i 6;rikBm4#%:9cz9~?pIyhEh7N 3駕@GUYs#14,rL'eh3ldR1P-@avٔoqN!yΘhp5GWZ!yKhAKhʘFqD8H1ة{ŞfJN'XT x>PCp$x Sɫ2=Cp*RzpxWd*8/.y0)r 8ic%zMVBH[#B' QDDp?(b/4Q ԣ,@/E7 vZ"gpXw;{B;6gxʊ4BOKVO@ueJ3l ^$dXC֧x×%kTVʕstTMChO05D:9!9tJΎc:T [ȼϻWQL7S>tCaQ%~|{[tڳpCM̡+NWyCƨ RʅH8OR1cj TH82@K| A]笔|H+ P1lO+|ix= E@lTgH<\>ܟل\@L2"gpG ެAFKhJEVFaf|LLhguɐfD뇲$7uJd (L$UUՙ*E lZ8>ݎ^.!1O] nXPYN&\`y1Q,('ER yr45n#ԒS;\Rg>eTI T%,bmXEAk,m MVܵФVM,M;X+M3UҔI)M~HVY%Z@ZZX LDc[?)̵J]20B c ./Yrz*/s:_ &F'q"&?j6s~?z_MtKgMu"c*Ο˸LGGhēFe* V2eHJaFx7u)cO^jF>N r#gsw*s((vOp~zk`;i嚯5gƒ^QjV#@2k\Ҿ BnƗxU4*&ry{-JmfBY`]_?_ o%ۢOmUP]ׅ.{RY` /epqWz꙯ROyˢ3tR79ld({HOy2wwQor1tBWokPy] =2QW,4v`!gjGzUPyr/qpfjgdžf/Pv_wOFw4n/?˄y- 7ݞ'<kpïz)zz{'!QHjwg)QQQQQQQQ/s |Iaj0^M``vw/4pw _|mX 8C~ ` _| g t=6:OorrRܟ|Q pY]^r-{aguEFcND2q'T5 D !}2.1lTtslW,O->UF JEPaMgi!GA%iR*QaH)ooԁCM2%LfqD+bk@Pi`eWNmm;=(Ҋ%?-hAt@DODSl>iT9tF2yxÃ]*B6ʔ{2qF2s%gy@ LnasOF <=SgUZ>)pAN[Z|FN,U@%ոy/E$*=P ب. 6׬DxlWxVrQ0j>Lp/oXCd!,–(+ELs&g'tudzp> hn&<D#ЧOj ,1D$er`Y ~'ASP$Jea(G<2DH@1> <@B I*$M:$QJ9%UZy%Yj%]z%a9&ey&i&m&q9gyGR90iD[R@L0A[2'@(v@}ߝ( q#P9s9M1zZiA@yh[M9Z pS k 6Vc +Vp{FnmjZ# bʶ,D$K*EB#@0_ X,^F)SQGl>pvpDA:` :%m+`)|O 6Pj+W!8·%4"<C ;^tcFjLlTЩOyzLuj 8UCv jȌS+pTHό/=cdpxb83i!?W3Ɋ<:g^)#]z@fzX\c]uld| уC4AZo([p7 Wv˝2ի罄3^4\[W \:wCVa\HyeE{o7Yˏ2c'8|b6+<&okt` m]uz3{uS^e]x0M @~`=GEO<:/i%4BA]h"5k丫>F0£fQNzJ:V)/^ G${-8ΦµS&TutުP;%AE'(a@G{%HB*00V~קȤNMEnȾXqDw#["}RpEewW!, _'dihl,rx|55 Hrl:+@BTܴz"=!yų.nCyJW{j emmlfsq|V}_^F_.89H9x~; \5/VGɭ>Τ-W 9 U/V2~$Մb}WdGӫ_Ͼ˟OϿ(h&, wX,(~P.La}Џl("}8(wz 6/x^mبcr Ҏ@&MA%`&P.c@>啪s! t嗎M.hlp)tix%nY矀*JqTP@tgZPa,аyjuv ,M8XZC#q**jTIGZe"3t@7U,c,ȚK3E. @n͞ B-°ɃWjKf9WLPi@F:A&W }Ck~sN}ǘpnpUL<&̫9'PP%.U*`UqbʚPf!&XѮ{.wӲ\P}֚k&GmXC^Nf޼!U@,V4  wYaJ;Z)ISS[S%I p> A}["{7ZɪkR,7{y+!L\+&{N$ia %7Ed% P2kF NeF9qDc]x*jb/X%@(Y`jYQ k׍P5iBܨORB0K8lTe7dt\/eNs<'-%"f+  db0@UXlB ^ern}T+vr{f~NВ5"hHJ-rWT!ڗ4 !Ac]h1Q¡h[/{*d̿.~$Ifj3pAW.PBl=\׺*9,|e!f;'\)B| }UdtVuSiGF;װG`z c}ɖ!Q|)+Ÿ5*Z6,PH6Iy:8*7X^`b:dZfzhjlڦnpr:tZv*`u0e"J t}:HXjFuX(:[*Pv)t)W|OGT꒮ZTxwJT3,;ܒ[;y%-JHZive5{NTY./`UZ3|ƕy+kc V85 CH/@^9s088XUQIT2^׵^2*3U363308:?4'7j47V07FBFC`axQ7*Faib-@,;.dt+ts'l0o6n2?my+8lf&>@vFj~ZheiSnzAv;J@B*p t^3a-R;>P'VElry55iqh+'sswvo ;agжy.gLՐo,Ȳ'.koc4d tg) QjRkT5[׈ 07 9JnbtFې$ sZu꙾ET4cE) rEHs7*f2GKGbrsuAME xHxtxKHIEI+F'PJPK:JRz!K/`ѴELmk  \渌Ҥ<{ y "<|U7#\ 2'2*g -vP3 (uPî</Zʐ*OdF|ļv̀R 6U `m)ũޑ^ ejlnpǼE31gX:lx>М+\ٙ(|)߻,G4*,lh'x% |Ǹ(p \LYU  U 1Ņ#~YFf(XǹLn*T8$yH<;k!k?hf0>f|͕7U8>9uJ*&H$BX0( ЙL1xI@KL$d*7y]J,Z\^`bj'OU,NCwT{z)NAL? N:&.%+.zY6GUZ AXu;Y<] Dn]gNNK9]p`)&P. Nn# 1D4cX3V{XKZ[h U@mv-Ne 7t[$leH2pq]Y3ڽ{Q %,=srބ j`c`#Cm{IrԾ'Y"|ٌ)><>@B>DexXz-Hn'HLN/S$}TMpWQJJZ؄Zɂv4n|,N9N'`,HH|SحQ{w+ X4/‽ 3{yzz "?$_&(*-R4VT~8 B* VRb7ER![{ We.eq5U QYzb;+$|/O|JC7)zG@[;ѢzV9LQHIu"3^\(v^Xf_j #ns`pY(bCesak.Ud fc T齳uh+ h}: 1hȼ> *Z&1I>rɘHpE^]`P1b@>FE\ 4%Fy!=ЬNT*7SHR^dolx'bϢYiu%hF>&h(hhhz(Lt+YF@Obd3,z2/sz[+ʔ>%AOLW! L*Ą(QÃ4Vg&?Μ:CC@JTfH=V=$m aUcNF ;ֈ4qaHm^6qڽ,p<%\*  a 1n2Ӽ\V 2?gQ-Fw(=ګ |[shP#<8 gTLg7њMV@HS'eS# WN_C؍[> |wyTV0p}+}Q#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb[r٥_:[k) @]x7m♧  ÌXzZh 2t׃w(Ťh#8Zi0 I:f %!(%qTꢩzT|i6I@N("G˼ FEHz>>jJj4LPĭO?L5RDN1H h\M $@Rڵ2&f(eFPp>cL &qNRHzH!/` vd[;m#khYGnUWtvy0֛}Hޝ7M~ϒ`̴U`lx:[2!^:a{D*nXR@wEmAυ69W܅yc}1<{Yߵ W,_y@C}{ @_^E_h8)T#k ƣ{ ]ERUd !*?bwxa.ܼ N*rz [֋Ɨt\}Gjl] j|yWP"^n|l| B>),C@ iA l!>$8)&S/[?T!B)<;{MpeVo׏OϿ8Xx RDqmðob@1Ā2>0Dd$vl -f (9E.EPmK+ /h6 Z`0GPpe{dw0~WLHkk[S4~E68Vs# ̓D-O0o~-o'xhY8[jwI|MMpEy]Nppϗ: 7q'H}}x jP)w-P D\Ө4/5l \V' )-/j1i,6%S1SI$:"bAyb~KMj91bB `s50\aKqCËDוS>fMj0z{bxdPt>tePd3{:&szs [A>;s:)s|Y"} JŘf8(!>i~{Z}fYh`ph)q5%x:D~6GoLJIڹٝ9Yy虞깞ٞy ({aXSi " tkƐfqHFP.-^ėU(, $ 2 j y HՅ^E*VJEn:J[Ѣ5[N@bvIF`94:6Wy4qۤ5L8;L rx׏ GhUzW ]8 *֊BL0*G ȋ,U0rR(Mp^ЧIuaF>CN`KE'$RsQlsbRNPک ]Ў#w%vبo&d(@TRyE9/w(ګe '"w&g,^)⑘;#vb+Yw/ZܪZO9ia@UYZx`yڰʫW:5^UzDZ,1`'8 XkmYpifEǺrR[`wzz!WPF" P ve78!R6MieI9k |Қ谚mjٶhɴQek~g©?Z`Qi<:~)yPdI[{۹;[{;Krk -< G[tH:!a!NqyJq|Z|hS6B r1t~eOqoԻtTT`Oɡ ^ev'9R!+% z)#`8b$+Ucȕm[-](?L2\gu9:VX9a ^Ez,K^Xu] PcpbZBLfVX<\ebJeHJ,hF\cD2dtKw qQ{TYb9LQdP!`Z$\T԰1ZJ?O> S%*Xu`O}.9 \nPquٙLbx+{?sŠ!S1,]«ZBSnCFUqJR0=0Sm_Eax`2f&4'=v+W,h\ĵQ QƝ?%E+Y_^l,T %5s+J,SlTY<* x2yƝ]}knQJeD.Mg&6뺾>^~ȞʾY-̞Ó=F;ѻh9ڞ{Ud5K.~nt쮻Ak~7` |^ ?_ != cZPϭm!ߧu +%URWJ  *U)6O2;*?CakvpD T_VXZ\^`bߞfc$ e l@{@ W3u?Yyͼ]G]1h̼v|]I=}!r`"Ԇq&"HN:zV0cшxNQ}ҟ_9UAp G0Êi)Ħ0>C׷ڧ%y@Ws|嫣 h.@b$dI'QT50t C7y)=ODH] hxVAA NPH' l8%Ug="js&PE֒m[oƕ+7II쁢)ZHeChaꜪW{ApWE2aL=tiӧjuXo3xT!+xG ͖VXsw`$ gϧG>z< L9R\w6>qnu. |G; JJ9(V2" Գ-9k!-K!Ɓerۋ`BHD@Ё '8)*l@ {ll|a`;O"l+/ de p$/ 3#X"abL<<À-3XX7XN:d4C@ 5#8C% TO_$prKi UQI-SQMUUYmWaUYi[qU]y_ Va-cMVemgVikVmoE1|spmYC儁M3rͪ+}~7]ͬ(MXaqC{#X.θ F *DĀQN%`=բfYdԑҜ<@埁'Dd2NA F'2q @19 PG* R8jE$M%;HB^%xEJK@Cͩ8{$!KgX;d,'F,(GH ҌF/)W9F(-]SiRIΣ?'Vɐ5i>ɗGC:Qk-Ҵ^{?B cnxP@3)+cuLo/_hfCQ*4/E<>a[t (۳렋a ހ³xx|Λ!1\N'k84!~tL ;v)J60,cc=5f_ ?HK!]8y 6 tq.;3PƱ qJC!?fP_ L9 dx"ܹ q@ꩉb@"HVNϰ0rd7c qP:u;Q1F*m?D .owQV71s@ej2Mኲ@!^8ЇhRȔrJ]WJCzT!"Ü,K;R0hCSWծuka[Ζmq[o\5q\.uhM_Ms,xѕ""3&vwK6/6d{5_#_M׾ɀ~OdDP.nO0oJpY*fx 6A`lR[ZFHaOa&tĄן 6s3X7okPk53CEְ. ۜ딠9Jqs |ծtg@TףUuZGGg031jf;Nx șJ` eE%!=EG/'|㛟>F3~0h*=/Ximzr<|[&kD{GvقƍwыC SSWZ5/D<}*W? R4L+ YCm- 2:z!ĂvEs֯n `͢Y~p?Lsd, N Ao0p!0%p)-105p9=A0EpF>`M-RP_Hked,jL*\N_V(nA\cLjjaRSv0$]0 [2 m2 E ŰUl.j DƼR&SPe 0U߾/pz*G|ڀG$K(* Ie#꒐8(6BgEQL$<x$?~99FqdA "9:B#Ӆ1Bl t*R)(2MZq à=Ң{,(q81 1:|ݎ @bB":\Iɐ#18F!<5zyQ r">!;Kq_QRR)%٢o ɀi0*_`((2)r)))2*r***2+r+м(+r U+..df+d9+:2, P%,gk McKPL D,K..s./_k0ǥ Kq 2 TP11Y"p|M'n wTLDA$ PLQFk\sR 53a!/ ,x@xxRרb΀P4O-M l˰ vΘ s/m[H2 @'h-V-M4o?PlZf,`' 5s @ >]K&!ܺ+,@ <52]gA7" GS NL@ơԍNj@IFB J"z> L(1,N8b9t^i:)l +iNK"*<)nQ*#j't\Mn8l<3.׆F !@ՠ2Ns_6c6ұ3&RU+5bg,A.95ǖQ-qE5 HHUn2S\5o }NK+.:࡬];/wTHPA !;TAlfYB42&}f/y*_m.OFpd)@,ʊ\\qtZ S^oL8MOJNK֡堯J rjaki.7GS87R~2YCc}g6hvhhh6iviii6jvjgPp`vkC# %dk- bl-gGӶmQB m$6tn$"vo٠o7"p ppw#qq!7`dF82r-Z .ws9s=sA7tEwtItMtQ7uUwuYu]ua7vewvivmvq7wuwwyw}w7xwxxx7ywyyy7zwzzz7{w{{{7|w|ɷ||7}w}ٷ}}7~w~~~7w8x 8x!8%x)-185x9=A8ExI|CQ8UxY]Mdximq8uxkR8xUk兙cx}8XXg8aɸxx3kԍ?ŸTCOĸ88نӘ yU5k1bZS5#[`5OM~Lo{/.hS99N0PF\rACyGZ 1xOdēwˏuمy}9 وY/gdMD8! HyHƙERrNfNk0Λ59 E(ך aXچkY{ڊy٘9elOug m8!r jʜg,lU }+y{ z3^ G6ZTT{N:W!b($OPe#ͬJEB֒4mZw8z^,#&(dcW[Cq;N `_™ r%N[i ]`[=lU[Y۵ae{ůc&/b<<·3u3#@>/zjyD(SWm"fSA}+՛U\8{\i-6`QȦ5o@|V/=I1 d^;a5kgy^a&P uB9C?]/qF \_8ei?oiFGlXf溆[_?U5yyokv&! , #pH,Ȥrl:CZجvv-{cs=Pc|N~un\QSVdWnjlHQ faU h i\ɽTцp\XÇ#JHQ6l\<%! ߾+(#*3utUa۴V`Tͥ @c^̈́ ç +JJի4\0 \)+Q1paA:< #hBK[+Mس 40붊w {"9rP3ʹϠ' C $)!R'dWQMi@< asVA@ p_隳_ ͽOl'F䆷[7URbI;B$ t UYQtM$mAބVh!x-qTR6X` u׈Wg~#Xp(%؇ќ\RM!.tH&CXdLT AT("Zlt9!eTˆqrqV_1|3*WK| 4 YQiI~'EQ *fc" V&Y[ax)w稤j$peI0fTc4Rjܜ.iZC&PGHbΡ‰voi{Ƙ(m1\WhuY'.l1£;Nچ hն*%Vq +q5 2WFMy;yEӌh Kv+8Dͽ@Mul5{=1$`4d1kL&8=ܲ&Ql(EtS6lp-tmx|߀.n'7G.Wngwlv1`< 謷^!1rYb&~o2WZ7nVT;3Aq^Le`OtE:WE$\Eט|JYh: \ڡ}G?iC :U#$kAil'Y =e3ڋWEljuZĒM!F\#9dj,y:O /.֤'E`R{-)T—sM0{TF{`Mܥ8@y ˣgF]Z@KJSBfJpra[99n VI\isK<2E7醀zn'El+l[1%ҤqF=d(GѢM`ۈ0zX=cNW8F=Rht`&LS*s\vmm+J׶hW] idhVRV0A bkauUl>R0+T hGKҚMjWֺlgKͭnw pYmȝ$lG di2-&G3.p51t'AY\sbr@uݚ. d 09,H}j ?RŸJ4sU!J>"d90|E!аTR,.^8 @` 6P7,#|p*_Uf& =La<:2?F6I?qP2oDzxoAQn*kѫHa.#|ďn4jB[n6Ͱh+$8v"(mR l{(4h^[LRG*הj?sͳ64^7nFUVjR ҵ¤alK/?@}^_[{o 6C7G*ҮwS- <xukp^ rX-K-{Gq6xrz[U|35!%0l=7%c 3:Hp*59ߪ4jE_o H5VWרM# cYRՖԧN[XϺַ{`NhOv@v-";۞5=0TAi'o ԑ{N[~ ͋vGg,dg< fpJ~|[/8 m|U(p"Diހ Ȓ` 7@k& W2 N#+9nXŬ4]CS@Im~+G/N%4fCB&BBsn%GL:c4$(~ d"hSvK] :KFdn5lt-*OD1EC;1Jf2#2([krvg0gv4&-}wtcRnVJuPւ AG ivn{>cXpDŽM[OOIlC7$'ԇqԅ]恆V"$mVl"JTy[ jW~BpKV%hy25Bg;}7uI0xr@gHpŶLPk@4 (ZLJv@pm]x&lhndxnPQ2{thUć8eZWQxj(nިnH+uq g!WY F1#R?Mvq(lZaHUf1We֍Rd&SW|Q7C^ ^ЏG?\R7$6P$Ip1yB(> MdT ːr+WeSUlq""Ur]P-G5ɐ&UYycDrSoSq{EZqw4%BWWVKK!gwɔ-KYd DXJ3XI'4X5חٚ9YyٛzIyuUٜp3S'b&9omykcعl9iyR蹞}KxY!Xxcnz ڠ:Zzt>|_h)(N蒢,ZԢ2Gp %3 Af:XT@Zvg hJz+eF:Em)?zG=$V :b[:@_:dZfzhjlڦnpr:t9pzxV;eaPq AxGyyj/|'yڱy܅fN ʨ$ϸ/AgYѩIR?X ap?F\h#S_ {|vt;'~hHAZ3eq)$* QWm²5psq&gEi(JccU0=6Dqe3z$JdHEa0PTeMIGZT~aNtdw&H(HȺrM9ʼ3{N0\,:}9{դ+vM+" q-۴osp@ِhFҮ MtVƹ׾o,i&,b]rآ.H-;0U=_IH ʓ-9NE 0U\1\{.=e-=0Z*/RUTy9&ӕ'-,581h] mc5?mbJ ~ȝš4^6~8:<>@B.{OsFnCFI,!qsɅ K^WEH !%ƚAf Y ˩['wNKd~Pw6m@o}Ʌ̔b:|0ݷ`1BP=XVxM?( |_y}x hʅDlqJ| ZBڇ bqYa^}"ĝ䌱LRܹmomۡ6H#ރP.ae {ӀМ` R-aS#hkg6vG8ZJ(]NeὴլjȶFfxgCm_eGIؙ4LU(W}- qj(gimøaŸ(״9~z^#R}c1j b6YH=??- / ]g|߯!Rt_8 1?Y.-T^v܈^ нefP*t)wYۅM[am9[I]~OO)U߁2nr fƗǟO*nX|b5WtxO #\&3pTY%v.a1ivq^y !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}?.4ȬPN"P](D_Ey`f?&HpMQ%K 1Ɣ9Zw<1|yRKCT2AIP90<dm7װGkm]O* 5d$ 0'0`$tӪuqcUp @UyC6!0Hq6o5Vzt.LN4rxF| kǑ/rno˱u<SRH˱d;qgyv|Ӯ 3 ;ܻ 0 Ҡbnణ+8 @JxA8J@* Q); NA m40.0ELHr,bQP2vd'L мESN|xݦä,sRر,(& ?8=kTI)K1TM9OA UQI-SQMUUYmWaUYiVoƬ]yWzU|͂'u?] 6dBȲkт8YƬc"kMCˍ }omv{n7'0GW^mO|F%s%(>@E nwŨ莠@ рd{C20bff{O&".diJTnnzܤDg*㽎u`:(bh8K'`(eX$0/B;Y 0 .9(6 =2hC4.trq>+ru &'^>vIXԍwbڻj79\Mmz!O:T]o~B/B?} >z%* #wp玙+`9oვ#}=JqƹWJ|+O}N{ҎЄ@ `;r>ulQnZ><*986:2`H +d@ C$0 ]E0c] p>A@Z C"xq$D! &yŐ5dU!!9bE1 eoBL(p% GG 0*!qF}@X:D#O3Ar^CΪG*^K#l΁It菓B+a5&$iZodG~C.Σ6P 0  A $cӆȰ ] GM@`Prd ԐЪNmlHl 1ko.zb$q(1q4qY JpJ S1VQIDJ8צûV0 ms FHj1po;1waqQsQo1qς!, /pH,Ȥrl:Шt*Xجvz0qPzn|N~ ,&b^[df|FXVO ͓ NWOVVށWW  HJ .:CB1X 0eʶy@ĊV tjJW0HLW)b,s@ x<JA$&^@$ꁩxPTaY>2E+%ƛ=ʶ۷p㲱@@e -`Eʶ Xy g{Ţ@jb=0pla3k̹e%  ^/ъiwyx[۹K`DϤlӮU,;k'O# x_]0޲(o^Z {A'|1~\\Ec8BG (-XWe~z5(YjѧՊG`RsٔZ#)DR!EpHI'Y`Q1#s$̈́EQ%!u;%]Vh%SS6PBU5sj< eHwꏙk6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼g0+?kh ,0BV+i RvJLkjF8b+PpSsqPq8kHZy, Pߟ(L W0 gH8̡w@ HTc$P1QO+>ˉW\`;YC8ИOş2PFv(B2oQ|bl5LfRN6!e-q Elgy0se/)8($dTBĄyTi<2l3iG,hЎv9$@uJ(˂@cC?#!G.\`^̠$8M? 钁Q(AZ 9+]E@Ch9"- ^Nӥ5Zs\4V`2;f*څaa,E G6qWpCyr>Uyk5LzW-ƨMWP`~T,Cڅ4r=ρ.;LJU"* rEnv;) Gb7!uEm+=d*C,nXeᵴ+*y4A%~;V>/n.DV85u wFEQZÿƬYXG5@ij X-Ic$C.4Rֽ. K_d'oFcc ⦐qlfB2ξxxJ#`@.D.Y:/|9`KJNd.|e!f5@B8DXFxHJLG4a]^Є2EPjR8W6Q2I[T.bD(%V(glF_faȅ\GwD`@WodQ7]džBHexWh_h%'A!a^lFhJp0D8@K`?ak$0TddP qLɔI(LhDU0qY@y~OdNANʈl.NeONXD&fZ5iPPPP ^h?0#.6@[GRXcOR R{4.\]fُe{8= Te"qe5T%1'f@X\aV%]E6BV`\],Uoa$6`$lYdSA- vZ6'P1z(9*<*Ynva0uY쨕)_a`!wdZoIQ[`i[s7 U!\[fu\6i2\kZ0]Γ2ThWu\}Ċ}{}xO"^fAKsr_IY#xai_IC`gW`D V=a+V-ian!L&akf?ٓYSZ+[ EG)AcaR҉9d܉ JF!OLuEmie ee>bt͵I>qfoih6g4hh*g}%ȸ%_ph&lE]agH$%gT?2Hu$|· pIjhxjiAA&WƆAfAAL lOY` &KȆ؂ lmףhjlڦnpr:tZvzD2=ЙﲔaA.z-}' e*p{z nGEzD@ ]* jЩPp)Pڪ ^D 0~Ey`^E{'JAiY0w(1?1Zz%#eWPްَN'FeEYܺMPpAe=B3# E`T_9a0fPe(</딹;SwJ =!Tk7K9 1Ayӕqrc`b$e`rT?- %eBXwsh;X#z:SIlMw:K0X gP^cMp|+~ iY*:ODQP9 JP;Lp{˷˵Z\ fb&縭srAJ`ZuKk{ @mRdPJe`շHe[?ǐaykP@P=;@8wTlw=g+F`3_#/ D $F@а  x&"hLGmKFlMTn… bBSf$E,r%\'PRD2Z;!] tC7aj'\ř1=k0<úd{-]dO{dUԕ#% 8n`~Dt]׿)%{T'OijMl*SMt ipҽEe]Q=4:٘]ᰧI%޺4/KCxLiJ\;:`Լ\AM\PYgLe7; ~kžl!TYztlPpͪ'ވ _­0ZB~ ">9LWd$ ^:ތȚz4YRVF6^ +nf&biG1%Jć C 82~EQ򈲃p#Nvĉy<uK9)SjtL ʶX"^fm&2ƌI484 kEQW討Lr|Fe#eKYMEidΗLFց+%#e]^WY:pۚ^YVj$ߘ i6޻\n65=99JꦻぺHAݞ]ɽwO+L+?H#O_VMN%Gfx`w fdM'zܟ+ݘ\i=7rlUԤ_+LB]I4k ?hI߳ >夫vO ?)  'Iep\JZ=6V-v~?a\6ivq^y< .(4&.6 )*.17 ;=?ACEGIKMOQSU8. 0%675oso!W}1.$;h'<0(6'x)a/m<**h`hA6„"bE1f(σ+җd9$ƴrtplT>jy*qԹgOhXt!oX$q4͛?fպkO/h p`HJxpPK G45M$vjo_*#Dd CXz؀ ]4!9(7A=z$.@@ ǣئµ|&\ΝֽwouMLuϐ$VH2dHtWg׾N06u!ffSsY:׏1 P6[FC,&@̀PBnσ8 `F$J*ogpCy R!,#LR%l'R)+R-/ S1,3LS5lSC2QN/hk9̑]0q?UA`!O%5h"ng)8եdW3,vڽՈo k糓OBm຺PT5~;n^&ch;uλ:^ ɋLe4k- .O:RjDM޻.ͅܨI>k{XK`(6j-r)=H LjwlnbZ]_ ݣ5s4Jf7}Nq ԘM xqI_CV :-ϳvndžAN|(yt>́~U`Z.~k /pA+Hs8Nr* A.a A$`>ap0EFl>lCQ^&%+coh..c ƐӆxVB!1A { J, fR] *C^U $Yaڈԥ $M 颡Nd+|ExQ0 2"G yD/La41Le.t3MiNմ5Mmn7Ӷ.F41!,t/G$=Eg Rt 5Y }C< 85C:ZB# IQZ)+-ŧZj:δM!?xTE5QT.MuSUNUUUn]MfTH W&YV]V q!C]cL*/ ^KЫ`{%Ym*%,$)I5Z'li9R& ֺ<"iH"ZNqGޑ5.JyG D Fɝsz\Nյu]nw^񎗼5yћ^hn]{3bY—aΫS_V0Ytc#Y >Fa`O8h)aUp@u˯AlQ6%EP,e0&vq'Fx1q=d!E6򑑜d%/Mve)OU򕱜e-o]f1e6ќf5mvg9ϙug=}hAЅ6hE/эv!iIOҕ1iMoӝAjQԥ6QjUխvakYϚֵqk]׽la6],^ NmiOնmmS)nq $g;oywt7v7xMBnq_0J_xX'UvGrcpfC|-x/qg<;zh߹ZUV#g/gd-v'^ ?_ZAo}H:z9KGH Bg9m=4i_X >ל#ǝӞ;-nat!EoڇG{j!"l zwgMN1'Y\1 0W}} oOO7/~B QTnpGLi `1E+04P4j0딬PVp.S Htp[G[1 G %  C   s,!,w pH,Ȥrl:ШT P.3zxL.zn|N"s0yJXoy[  c k{}YzV.0G#JH"dȱǏ mƠ(S\ ^в͛8s!'u JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKW.ƻxbpA޿ LW| ˸7<}2pe|&|93Ϡn=x }F B ˞}_ R@^y38㇅gB@j.` Ykaq#7.2Vɹsigb7rP8&YOńC! 4B@` &!X0M\XtfIfCL[^y')]c.Q:PA1Pt%_ٞ9RfYv&,䨤6IXji)+(૚Z%|9y F Jy~آ p%F *|4 !~*" "`Cb.^NeZx@m] {WS<dPLx ]]/F-a`!;W@@rU:9MoηV̍68GĀɚ$k(6o>\,J* h+y*Yzs;g$x e-6uxҝK!|`!AMJ,FEJiǚxWO䍷e 욓5I-^Dl΃ ɩ< :ܧLV_J8@E~m[c0gS{z5dĐ.=m:G4]{ k7J~}"9t8)8YgJ&r,KI(u-Gi⃺:AbmC`DsL/5rX/n➨X8-@P*(XD&>EGh4)p^tKjWT@AƐT$aII/j*=}14C&JZHa$))0 qZe`^ 0IbL2f:Ќ4IjZ̦6nz 89[bL:1(D댧<1υ̧>Q4|E?MЂEAPG$"*ъZF7ʆr GCJҒBAu4JW[&JIdLgJ8ͩNwӞ@ PJԢHMRԦ:P*:(XbB; (hZF`5$Jά0Qd8  QoMU9x-I,@G)IVs׮jkQM'BdAoFQlzb8%j# `M.* VbS8"[Z/5,pA]dW@q.ENjz*ϲ:jXEJ.]"_D+%Ts|g8- v|[ = .=y~D$ݳV 7+oNM+t3ƿԔMp?`ƿAlu&7eAK&!d3y9{9E_W[q4qP TKRqgYٮG5YmqBH4e6+ FRfsD4+7L)F2 EeNsA%^"GU+twy@MXyt%ǹw aY?H;^8 //4YJp+Kc#ˌac}0P ~Nxi][eMeC5Bp14gjJ((4Myu+2\FۆF(i^‡kL[GA UCt:/T@LHa@ܾFg E xh9$z ˙Gj]׾  /M n}xn[XϺַ{`NhOLOo!:!da}oL0<7"ޛ#GD8X">/OOy_eOС  KD=m8WuEַSLȥ; r#u5^;pFV' Ƃ!+`@ B[aC_,~5,~X R_ ӕz|fҶ~7exB:FDYpIɓ^'ejjH0J i| `@|y|cw98^0 5Bd2+B\f4X1 n D$|I+]2dOhXq`[d}2XH+gcAnU3GbY11J?W{{fbxG| p{DNT3'#acr|pTy6~4J"?\H2Gs3Jň8Xx؊8Xxg~XP H;}Syhƈ1J-n_m<syYȘwUwTXpX|D}$@C׍ިdA`UXS=ƨyzkeB$!]0Px\z5Bt1Zr#XssdQ,ɏCYO%@T%%D^bRo&k^F-%V{yR|iR)_qM`(a]t~T|s|4f^v#`( @k`D,"*}RߗHAU qA&9,f91J8g#-P`s] -c7Z/p֕9h[߃0b"s {3>6X>Rޣw471$cH(cW9nRog~Ewfw6n:aXeB閭6P陽k ƒieFU>9]e$6`8B8{879xv(>y ;)Kc8K%<ngya=ւy9ZdhԉC*yD[ygxxje埔(;#j)<<<Ɩ8T㘻k`':XKG>f]cI{v%.ĎA /D0hAguAC42B)n)+ijX"*<ڣW=]=9pc$EF7FX'^Ė`_o-eDtgą'fB7|rOzG %e.ZʉHz3IHAI[E`rsڐ#=aNЩ3pZzȚʺڬ:ZZ*8*AZoMcFZm\ϨWXXӶ^WQ#uqaXV0aUj[|)\o DpmٖB#:w%?Pŕ\NLJxz7{;4Ӕ^Ric7*t Оb6\N^ whl|(׳t`\I~b`X &4J*B8ګ'/ʭコ-c9bbCbbdK*,rKX9*}k +yACf_H8yQ:*O%9!Љ2zˉ0l!!g @Ff6!6z; K!uh5DXpN[ulRKfh6i1(iY㗢[y+Y(cB3jc&v8 >;piNp55*l8PlR ls|vdܾȿsm PjB5'{Fzny{c1ڡRo熀Kc<&'٨8-lFG\àTgqU q p@,MpakrD_®k6tdCDUKH'[tP\^ǀȂ<Ȅ\Ȇ|ȈȊȌȎȐ } :u#:Rg)6,Z$rɢܸ,S *2ʯ#yGS5gzUʯSDb.\J)vb&qT&j&ѵ̧̐&}G,BG~v҆+<)d9kuř8%Y(\Rbz| YX5[ MR"(;Ѭ,9 9hM3=ћ|-f2SH&@LH x9Ьl!*E9Q{DFDbL3e|Z}:T| p wQfSIˠس93qê܉e |׊،؎ْؐ=ٔ]ٖ}٘ٚЫm<y*hU0͘:q/u+;}> _vW٤Q[#Tzܵ1˻ "Y)^G!87[e!  {?<)1Y͕4N|GhC&KrLaQDF9)RL9])^~5a¤d} ]ܤ0~+*s>u,)"-mL8^9>y4J.1'Jy=+Tf!+-cY3ih].zQ2Ggil:8ɖ_ -vra.œU!X5o9ʳb{V+ʚUlG OF̎ #+#}[ 𣷲OX3r1]C!$ϋ FN:pX84eqz"J Ym*>a\6evq^y  .,26<2.  .6$(3 <4* ^D6J#YW;u<,-r.0eUǂݝ,8HM=ߥ-11=hp« P%ZGÅ9dI'QTrFJ8J9p3̾'rd4G0.v|WG ;'q|SMKĤmJ&P]1gsgϟAvL U=K!5k0 {iZB l2njVutsϡG>Mx뚘Y]rmFB"28_?u P15B+$@1NY9O?aYi ygru*1裑։`|b1FrIZꩩ. =ˮH7.쳛 ;KD>Kmޘ&in1 Xp\ihg!\.=F"hG9A]I/QO]Yoa]iq]y߁^x'8O>ZZ1v^zc)`N*^{}/^`E&_ ^؏_w:4kyL*@%LÀ.ciE!%f9 !p*T4 0 (t aCΐ5 qC=D!E4įъYxL ZD:ʼnde5*hcH. m\ք*8iTD71Z,r)!NxptBEBRR !/ʋ|t( \B,S%+9*S.P;TDVOX$D6c& I!0ِ eoD.R8h N "h1Y{NXg;H;F =)?"NIAB!3gZs#~RN @+ORN"wNyҐt'2͕o m*V)Tzy'QyYJOS6X3 OԢ\'?ɐSymg4T*Bk)9@s EQMga /Ģ'58PΘ%;[JE"cui $;e(<9,90V}+VIէ 1 GEYe^%N5q\.us]Nյu]nWu‹KGmp^h45/j"{ջjDOY^@& V j|Zp1J;_azNkO +J0p c0t #G4R0 3TR:H7pXe1 !tXM#%%p t:|ܮƙX'% eɈ.D :B+_7UG-s! *^\"6rίegm E4El8MhQJд4|ّPZc.h6Xy4b͛mk4lM/ճ5ޖ$s2^Y͙!q1L}j= vR^"^F+Y5K݀bpXhLew3i:~mmke yUcAA ᫹᧡5Ņ}z߻-Pq(۩*q^>fIgbS¥2D‹s?nTWxlyQe|e˽7!ՔHH9\;q+Dzv5.^Gg8PK˼=Em'Fjtg$+IȘ*P~ v+R ]~L!#`0'LAVP(Z' CLE*^ f4 0 p 0 p 0 Q'>CV:B C c ҈ ` BN _ʴHN Fl u!fe# u6q9BƳ CJLWO90S1YJFEJzB6#Oz_/TxxKHoVcSDj&*-x"Iv9kt< giDSdt/śc4C@8E*lMOB$$R Col^Q҇4N#-r *7S)srd5g HIt O 'tp.!L.(NiStR,+$B+n.=SJ>;sTJ$V\V+AtA]Ea4FetFiFmFq4GutGyG}G4HtHHH4ItIII4JtJJJ4KtKKK4LtLɴLL4MtMٴMM4NtNN1NNttO)cɕyVyfyzmRza%x*nPda[6!#n|7f|V}g}kܡTcc%Bj,5wt./\q8rӗuրM og`&<ש3dxI=xeAFjl ¢(P&t\X{Y7eֆo8esFa<"!s~1`va83vedbjav XZb,)4ǘ6r(j_CUB*uDsEܬ( nx`}y}DM !$GhI(^n[ll^rCxՌ;9a)xK XLH(Ӗsyry_f`9wySsde%'5syrǹdݙR! , @pH,ȤrTB.tJZgzxL.zv$˄i9^B{ pEIO p M~JcD rL CCɿ[BqGoqqBDqj Eσ㆔]XER ŏ\ ς:3 )>}])-"@ *C$+0`P‚px 0=^ԩ t@ai$ҦO^-5Zc䀡*(kQ , ;A!jB9jЕ5+IӨjxhMw9) m)a~8Ld6lkDq\ūRPZA%|*oSD@n{˧{$q 9]{YCW ccsC a`xPA rrPl`M@ A|4haw4Y` EQ~`xB"CE_1av zD7h&"h%p)EeZgLTz[%T5jrAZ2ڡ fDGk1";޽I竰JQ|"ZD)jh&O)ČVᤔVQlJخf &F&O*m _N Adf9,٦[g2ǬVס"~Y)E|OF,ĀF1᫬WOƜ٪ \U ;ůD,D,}ðJ~Q%?*Gi\@-JL7m&x"$Wp.A L Rpw[Sى5U%62QUkx3}WڌVex -x'`@= tW;m'qLth5"CʫYCT$@ juN:U.K thrNe`j"gw/o觯/o HJ~$ BH JRp5Do+ G `sJB iZ'XUT)_LZl ZH"H>g֘BܴC&1b.z]JMBNDS)" `qj(cFeQ As0s4%"clH#~TvxFBNCbCo-|[B@:g$VQ;A~wZ+!;'L [ΰ7{ GL(NWp,0(Ii 5 L5MeLof p᡻q|LijXVh1Z/Jðb](3AFt(Q 4 ٨O1EM& ΞJACdZLT9EHL3է\q$ #IvPz]9M:uh ؝ 34,k%KL|ԥ:,kJ G dZ'QSϞVX&&SKr*ѿx$c6;O&_Mo%Ae۶(n;7O|j6uNƜTblq*4&UF5QT F2re:yr&YxDsn e*2*=f;Nt*TL;i?u1.Ryt:Pu k팄XV MJz= W7Yقkf<ݜODzAs9SNz~v)l7yvUs'ŗpJcJGdȉ%"YߤedřfO!fXZR7H.߲QGpaoʻR'm6%nzoo7\-;=p^]X*Q1(Yt,#w_oE`%~#1qr&h~hL?CKf~[CDŽG$ W U( gx9 ~~]$D;dh +1QuzVqh3H6fgjT!(~=h E(PeH6U#&;V1i^ba}g0SbvyaB~Ј1Iܲ~<'yȉq!Fnd,{$3C-A2ר/",)KUnVDWlC:9dBWQqF2p R2 /"SHO,$G_RpNu&YqYpHPTӘNe aj3{rIQpeR{O[271Eer(C*osvm3''䌁W'w"v()dx*9x~"=2g5DpQ7vXYIFPWi%VpTnٔSL|=Gp(َ@b-yjBxLW{ח(ng|I/{tx?jBF&i٘Id1q 4##3sYYnGJ@37taF!FɚIQy85`#7W68S9HRvy rÕJf8ƅ\ ߷]Ӑ@(5{YH:jrmtx * _u#@B:DZFzHJLڤNPR:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:tZvzxz|ڧ~:Zzڨ:Z[@Bk`M;K):R`B(^0dxU:;ԅB=PelTPZGEf ^pZ*II}RH&]p蚮*+p EJbJ쩚J^5lB o1yo:z(MW`[{2(xf +TZ2OģXq*,k@Jd! RӘVkSm%Sв>g~CF5(IEv uOųRR;*(cxE3xăV;PT[f;V[=5F!RсUo{(gziaca^\E2od\ ,DW O 0ܥ޵Kl) }ڢHji_s6`(qjۻ;[{țʻۼƦd{H4v[oc=e5f92[ANFJap^[9L`DlD(< k{fFge0p6M85v$ viJր旇鐇R$f᪻k/tihIiK&)s& /csAkCm( nfV\F ųN0N"lo[|y|)t12$5d`1ydiqOGGLjqCH%7&GYm*-vK@sgs\{}itjUG)P*B" t5KeY(TZrl7ti~yI2eŻ\Pi\-ZU\wk"iSwʿun,|tRVx&xUwo7^.@ޖ{,CHΟ*=6n1N: ~DgNMٙ&=3ή%3mIi$EÔr?J~\i;6GVy وfi߁ĻW¶.52P/ȠlZ Γ| !VV))ԣcӣR?T_VXZ\^`b?d_fhjlnpr?t_vOx{~5tB9*cpœ[` czW_Qr+z/垿YLFѶL [jZ;`uq-`oLQޯ:i0¶Jo?RWQPRz4- ߰a@Ey6VO$ wzkrϐX4‡t>rZ1È@o{4vq^y .0.4̒2: .<6.BGJ%Y[ _acegikmoqsuw<I= [(4>Ljʌx׆~ˋ! 38*8`A!b]HC$o r!bLJ.@*aK/aƔ9S l 0߽ s)uPnRYm1_;,.W<86ԐH"M$H@ :]m/`]'VqcǏ!GxqǑ'WysϡG>zuױg׾{w?|yѧW}{OSF׿j,,.O 9) )@2`p3,y1);&qQǕ-:P΀6l2R%F&wR)A*(p0 aGF#t~1~И''MSh  sA 24Q~kEZ:@΋8((J3B:5ʢ!Z*|u~ UW>@ &"B/_YN! j Ag9դ*iwu5ş0,@ZT9QHz*`*%+^A؃*='lWE`<Jʌdu+([R :-g攞X衫` Ad7 "׌v# ^WѨo`*M:R֠nmi`:OދmvRVe8gV?#:i+蚉a.+jLl:uňxVWK̐^j`-k 2_Od|8/~o.>; 0 > 4Ma, p.B<Gt0FRڼ)/ Y٦ |;GLMfifFd fI0GʦʛьD,Yb{+􈡘` AX ZЅ6hE/эv!iIOҕ1iMoӝAjQԥ6Q?Vσ9FwLjBg8֬a|(Dr lp}i&ٽ)ј.TRwE(i6у^A06ѽ*pzUFR̚6 MG 5 zY! uRZ1)rha7 :;1,rt2=b!1{5V+Gl)ì05?vCB)']X[SeG.^1{|m2JdIIv(a@|2ZL%H۩!xC;vcu0Fc 2^*ղhǁۂ]앏L'Ws5ܷK/L8*KpXjz%?h1+[Sf,x(Pzb Y>:y+~lܪ/B)5ޕd TP,Kj^.g g\O#-/Bl+,k8P/[Π$ȼKLocR )ej t e#pS=?2S)#>QӠ08[ဒ⬚).2 2'jdAYKj (-ć9E]Ea4FetFiFmFq4GutGyG}G4HtHHH4t-Ѧ2Io4 +cIǎҳ:܌IFMD33mQ$CKK}7b9M)CM27TF)f $Kn ׎ߚO;+y2.lNF4X4O0;EHQde ^6B%BK ˰XN.F頱.VT9B%TwW~%XH/Ypn4Uݠk o_&W{GLYK `ȸMжU%2Ys]@vK/n5Bt6B35g/?XO9r4GR-<0|mTfjF^clr KN]di 4cehSi %Px&f7[^1Oz]1.q|GZ Ul5*W6lv^, plI;kׁ C / I.o 6a$kpAFiGn'wh6x1U$wnX\MI\U@]=b t%F@`rct|K.GsI11hG^?v8wuie1Lg1ɬ"Cm7F1(L'wqnԱN(|R"5uoR7}S{{8x 8x!8%x)-eJC18d9NokJe3y %aLo-C5LV+H֪_;C#N/lg1R1aޠXmS 0-!3-J}b;cXaM_t΋ر5뎮 2ZqQ.{Yn"UǤ5lz8Vѳ`F鼏c"iҡ\WXnNZy0~) tZnu5WA[@s^_Mv0/=?a``O o0_fysO .0)8a X! ఢ9v5ecǜ iMPn*yOzgįwRf[HVn5cSyPPyn Pqz QfY\p2'"h-1/fVk &h4Ǝc0z!yWDW˹v#n0 mVn'zhjuK ]ɺ:Z25~zحq!71D8FP6Uoy7v%!ks!Ֆ3w?A x.[cɋTmI'wek~s1+eiX$Kmɓw[J{IǑ}0}GۋțQ1Ϸv-xM޷͆!ʀX6<|!<%|)-1<5|9=Aء1Rہu5=<q>6}mws ^|t:̥ }~)mi=!/2U~!YQ<! , /pH,Ȥrl:CZجvzxL6.zn|N~eVQS[ hgeqQ b_Xʞ`VTVe͜Z u!` \0 ƃ\%!ZU%$#&L7RY.Wl?x `睼"z%hd\NЉdye8Uf8`h}ET:(/~آo*ꨤE4->*X^9iPWL`'g OF+9a![cg$ZYt/YaidXTn@28*ETbvYhiG\@- TJ~gA{N'uL;lF~ |I(x{|il8øb5V Y #zN@ n\5`u˲єYfXBejLVYaWBA 4ʝ1mOxS"OB  E4jqۑ1Xc-taTK%K6M$G_ &?HI-n/o'7G/Wogw/o{&G/FK(B ~L`^fQcL BxW<^w(<G>HE@(`Ap0 dCG$0a-4$;۴A<]Bl6s%33! 6Fdhmo51F!S0CMji +Zc]ӆ2i h&x_+ p^@~jVͫӷ jc[&ɶua њ9IHزTzSIVn3f6]Bd:8 w5yWb}N0 VHQ&7dV C(IĈkqu` bQ厬رL:xγ>πMBЈNF;ѐ'M7Qm`J`׈J{:>6R9zPVV'VLD$:U'"b2\k >rR{kۺN6jR*<˚R"D>&u +VR\(Te:"l5"JSl'96MoyB*@Ps}jܝ=6u~G 㞷t^HENx65%tU-*S.1xk:&./;p/)`N|{Ԙ3n\MxV V,#`. &h^Dm\_0CLG1 12`"BJJQF7I,] o7Ny`ab-(qDQћ= OWֻgOϽw_<v.tw/bbx?H ]Z`~yG_ d>]A#phEhg/hXPZ3TwlGG4fFFGIK$G!QG4frm7ۆm 8thWQO4KdfJ?H(H U?JF6MnOnbngwPoׂFC @H Q$$S Nt\X҅ nN28~e_4GHbpRUBkRb GNJt'U"'RqeE0x zh72 FSTE\̔W>H&2jJU5!&׈SW*u͒v2([}ZCuWf.ye+sG7PP=7_h*(G<R+glȘ؊th!u(Xx{h-PSYT\m>O`\ ^^50p/whLC15Gh1IZ_/6l=&fx7puX𐊶3dQsFbIHvnW5W 3c`cc 9xyOhE1.0 h}KJ&b3X4Qdu/2wofy׍@mouY@,XVy9Yy٘9Yy30F07guys2i;X!=7,ba9b7*y#0lyB\عovĝY#!9#8qٞ!doT9Yyٟ:ZzzFzG@$ k0b@c$!3d#^n@nȒ"zHKZK(ڢzN?QO0.Z7Ԉ68mţ6*ҎB-$v'zAsUxL 8PaSZEYcMƹf`dfpblڦnpr:tZvzxz|ڧ~9*q׵}a{A!rڟTZ+Z.3.,J\:ZzȚʺڬ|ژBYQr)'Z桨ꭔ)vjEHʮ8x)A^1NrC:(lw[\ ۘ ;, 9Ts5CY۱I9=bbJ*,۲.02;4[6{8n:p*S 'zDȳiEC`ɭEk`BJC*BP \EU;B$* nQHB.wTf2&gyGT棢5qIeH-Kē1kxk>džq&rd1D?hNF,g)IKB܊O+yX) $>+\"/'RqC/_+XqE%ꝷe$MD K>ӛ)jǻE[c8QyUtU#RCȻ`d:5HP b5m+[ߛ||$#sqw؃ujg G6zY$R,D.cӥG} KqsqA_k659bMxas}dK:.[0E9N&Eukz%PR+ď^,?GܺXbWi9A}V0&Pơ~~#FǩV4Ci%*~l0=45TTmE̶|![Pu%d|D09Ew*癡SFqF^gSD:˝@QP'tL;TaI=t˜fLâ$fJ@J5"@YiS"%I`U:^ TMR4Sl4>]S#rKo5T_Nt]NxNF %F`R2s 5lɀ+\XҲ+ %E%^EhZұ^v?E$rҸ YN G06ԛ8}+NuYȈOet[ՋxBCq]2^Vg^r^eme V|*CuژsXHnlMQ ΄_0\w jYǎ-I:쏢M3{حٵm۾W`L b5,=i]]n]Ѝ]ܷm5 M01;M_-_W9}4}cyL/aMgA:Tf3+&zfIv5ڟ(``f:,38<j"77]=cAV$ۻ}^dY&c2e| - Jee*XY*dfLImᔡNPR>T^V~X}i}従w1'#席nj&.6 {Z2 `\pr>`0 XbSJz&\DǙxĘޗn|B+NxSIDSVsnpˤphm;!ػjw^rprح,+'n~̞;ή#ǽ8g'8As%^o%;@], %~ﲳF2)v rGg;3C7d~V340]J MYH7Qt^xÇ1e Wˠ8+X̗*>@B?D_FHr}|B?}P}0b˄N_H[.x\QM']/_?OZ6_wʉtOU*xjdʯ{b@M!{ e9hʝ9q>DDMp&[,9RJBE̾(o,5!SH(Irmb\KXE.]"[m\ԖrkޚMq|H C H- B\* X$ .ӸH%I0^'v &P._$KƘ[قqy 0. .031).<0>..539NM,^aҘ4~gxX[#ޖt 2: ݡ .n >h |,+QLq$ \b%H0@sf>f|ƎX/@>A{R\. -]FDQQ5l7S9;S=? TA -CMTEmG!TI)K1TM9OA UQI-SQMUUYWa ViVX K I/+xX*YUe9 "p ˼4@co 0w#€e*m[Wy/9'JApQ?0 J9~Gr xa.53z1X0!ע`[@ \ {_PR+#yyOh\"$fXo͵='}< #]ne#N<`n{F5MJ4H**c0CƘ7 '+֍A_ʒ K7o@>lpA`i,챊q}Qk#uȗh]c7tb=+/g4@'AWVtúH嚃桏tS5 F?ُ3o) 1$H2 %BIy84h4 KDGOQ + j0-K_n X E4D%.MtE)NUE-n]F1e4.Bmt#HX 41zQވwَHocns %15."0Ge q; Z-;<w_@CYs#0Ľ5(Vh}w\~6=%웸mn[+ؚC@ p)L j{<|@6 b†8c\W0CmrY}*ҬgnI7{&Ggzfi>EZd_ "]p+u1aࡰrK\Ly:UC}D`࢑-/ZٓbhT타oVaQҁIt589#X9O9|neqAWUzI˘$dt Fod-Kf3ʻQk̄Ij8HHm5 #&_6=!UCCLcp7p/ w!qO1q|G ǭx 7yMfGkU=?sŧsU#`umKXcֻve7ўvmwwϝuw}x7x/w!yO1yoAzя7Qzկwa{Ϟq{|7|/w}Oշ}o~7џ~wϟ0O/ W@0P7|DvO D I`U|'`J49N,XJ哮3NE]exIJ2Nr # U%Cԅ8|P0"/T14~_MJhQ|* KcFl 5 ۄ h {d  dJ+NPDREv5PpMP;0Tt+tQM 0&N s&ulNVpPQNL/$]]CٞB 6;QE5MP Gn'TtC O[ho;PP0arPg B~q5BLP #`3NH^n.Q!,w pH,Ȥrl:ШtD\gzధyͦ|N~Pelbi_[H Zk̿]N_ YObc  ][ 0ۀ' +n#JH"<4xPelp`DZb!0cʜI9 H@F:t0IС ]~ɴӧP*kgX`ˆ#עLvLԳhӪ]˖UO2hcС@2[=l \%{rҶ+^̸[Q~v{W,N,-llϠC]σM(&KҸsͻHr@*IF{KNu!/4P@0>  .G5P=g˟O~ڍ66 \`^9D#{F(Vhfv ($h(,0(4h8<@xgH&FB6Se `]> fgppRl24\d Q xb)Xhf&j4ҠH8)f *jAjEUSrq~T6hj0fi#$p9q*z 9@(ޯeuE*8 n+pb0 p`i Lɧ'w\ɊYKD%|; )w缛uV A?E@ByP (d+QP@ID[6{DrAο,W4ܑ"+ĶĴ@ԯXO5_O'U{"J7sAJt+U매i6E S(6#Ŵ ?g7BZ[unz`ozr<{4KDR g PvDzqE͎ՉT@5×y_Åi&ό!]ۥwh ]_Ef&`c/SL }cOFaV${|PKPl #z8yP+ͪ~kǼYqy^ϝRX ]O0Dv߉!a 4 54L*3шbNo C<'lN(ԛ '5nS1 # `%F$!@`g%/ga,5i,IjJG*$.Qa8M9C')0m +Yx8C*USɸ*6A9# '3l;,0&" )Ss# š@v2-@A{EfIQ"ʲLU@ ( shE&6 hCh#R>xb!N_y# 89t @JЂMBІ:D'JъZͨF7юz HG %f(5 HReW `gJO(X^ 3UMmyɍC@K)N!bNw;-qL8]KJ<|WKz5*@`G!9EYZNo:_Z rSJeA<LEV뫼?>["F`eC `ճ`% vB9)T"\Z0*y6MXR/d2GkȖc6-0我ud&dL_v'XN3~pĥ]/%w S{4`ֺ&?],Pu5Y6骳_n-g] hr"a|(Cro;S#N.% qLvJ U6-mULEUnKĀV, zEϽM͊VL)BbHt_ uQ Y/9Ke-㲬 9 8%mӾa}yzrʀG|lG0$ '@0Ravh.KS;aCYbIb{tAV㵄ޭ}f3'Zo^38+QPpj.R`bSIUS vF&瀩f_K?@I`CYn$; o1 jlnQy/TwDI.-cC 0{M.2fO s6|^oK,znYȄ932Lev\m^w'M,5+cn s|+9f_69S8kGOқOWֻgOϽwFTVAYO>G㏾goQ֮Kt#j(jegT7OQq5ODCw\?(YHŹ8I+|_p`3 =a6E  ؀f (.4Tb"*w/64*,؂.0284X6x8:<؃>@V$BxITD2F R 6^7M脑 F8^ yI€q_(YF wA1U-cE-WkA"XO ҅j80VSj1˕1Pu\u2U0?A+dfas5@5o$G5FV:vZWml9R h(h]Gfo]`Ag TXgw+! HhDR©\Բ"[=k! xV1_ul IFaH&>koSA5h!֣߶#K}9;8i0<4dj Cx !^Z'Gqj[֒ю#˒WqK{qJ E+}r˺dcur޴B屺{p4J婰J6syfD7Jt:׻}:+~MyJZGJLddK2v׋l}GJ&t.#tbJXBdVv@e"恥Y:}Px%DVXRA0Tc|gR_Ԯ!IƬq׀Osd$uRko-EIiȇQi*<f0yɐgP+)N g!d=KYG-CtaXC>4aIآ B.Q-tͨlp=NEwl$QEfWMlʥ UYw@ۡL AYcvHiL ]Q:R/N0}6YE  #}8:<>@B=D] ezX e1 F!d/W$HS>UaR}.d$NmI Q GŁBUdR}X, H+5Me\wB*Wp0ZɃ]Aߑ@~sEnGIlV:bv)]rDJ$c҈N]~_.dd)fFD#pԳp(˨rSW5-Py{TLۍ+\6vHvo-uQGى Ɲ6դe$N\\^~)M#M*_mwZ$xraN2@W%tXtʡL·&\1&%nuG[ gz[2^2aMNh`yq)Ycl#<(CGW`=jcHw,S(;~@#hB$BޘΖ.Lu/g͎ck֜~F{m'^&oADr%~Qb_{aVF}4Gϋ_`iēD-@J;.}&v ;3޾=;>mPjx옇X9.Zw ܕ4_artz.U&)(aZ}z F#r QZ^Y~a\6ivq^y}44( 8!#%')+-/13A,.4MOQSUWY[]_acQA<dwy{}W>o@.  l 3/*y=)Dxp\ @΃?!F8" ZP*4WdI'QTeK/aƔ9fM7qԹgO?:hQG&UiSOF:jUWfպkW_;lY$=5al[oJi0BpqՋU <)O'VsG<%  SּCO2w=BV/d Zǖ=hֽy>|N W$j>:@@U׾{w?|yѧW}{Ǘ?~}׿ `G8 Р'q,% @Qf8t,a|  bQY<0l-Bv RHIf$b%*ئ)?p*RIB-,L0@ L7"BB8!-= TA -CMTEmG!TI)K1TM9te(@<-;`Q0U `C[eW$ e~-V9]c.V%isCՉUpmgOwV\ٔ0 qU C2H]9wlzUT߁ .NXn!X)1X9AYI.QNYYnaYiqYy矁Z衉.裑NZ饙n駡Zꩩ꫱Z뭹[.N[n[[\ /O\o!\)1\9A]I/Q4YoY7iq]yQHA/w!u`oy^=x>s{ס^zޅu__@;c @1 _ZԂ,A#)0𕏃B㭏C_"[@ zv5auĀaGxH?!._Aq#^FRn /a*8@1c Gȁ;]ꂜ,!RAzÄCF@0Fr¬[Dk#p(,^W^"'w!ˋ\XDu$Qj/TbPё.DUB̘ьH"1lѨ2*{z5@p) rlQ u%9Ϩu5_INB$a iI[u!~->0Ȓ -R8 QoTg9 v5MTD_7'EL-RLPDIAIHtrԣ@MV'ɠz8CmOaCKGmURWiӦbfjGZT=}zcjB'PCy4IЩNQUn-'0,_pLK1>UB0#)u ͳJ1K4{0){BKi?ڛKQ*dEPKsd,j ,`!mIU9I0m-~^<. ӴGRiCHTJ)5P^p@-jXhu_@"6R[='}=s-w ?g#|JV.jqIvAG!ǨG '˞k3ĉzH9qxuֻɱM`-a %sLp[^DM}/~ b~}QTdG"F6ҲJ PȮ@fmkn!T@p ?(Ȏ݊0 I F!, L$^NAݼ Ұ# QN'ԬRadPhp~|悇F7nrBΩ4T 6u F1)kFq;b.k.f9kXD+2m+TBb`!X~1n . vH D21L1,q3䧣JO~Z1COx+01ȆǵȓQ hߎ Wi b!N4r#jD`/  2 !`p"#{.ZZ$%E% K (rcQZP1q\䤲**r+r()q)'2X*J2.5.R}%), -;K-r)804b11rNn/0)]){/133{ 4Q35Us5Y.!, "pH,Ȥrl:CH,gu\BJ.zn|N~0Y\[ |}[hZ y\CnTލ^[u  HP'P TÇ#ڲ>3jȑE (:ֱɓ(3R1!c͛8 HJѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝK]K:@H X8$pGt A")0haĘ35ˁ"fril@rO԰c(Ö4N&opO +_.u`rhu &~ @_OgsQ/u_P~tg?ph!(b!6Jq|9H bOH,0(4h8<@)DiH!B4PF)TVi啡7@\ځ`8X.I \ᒆpiecrj)'](҅ ϝRf&NFAHbH裐J4gvz&٦(fJpRPZw)m )*٭WVjTNAXв^(Β2-x+=K. t VhP89ڷTtЁ0Sr@IEm@`B251_D1qt@| ,0"ܒ\x![˻:f$ag sLdpKtL-I"ܔI@[6!">ICX@o;Mas(8X*.cE?p0+ 7F1MX'dg#<1rrܢmg#'1iԐ-;ډUndx4A,h-A߬d@ cD9`?~5g9&Xft6Jg ŚhBAl EEY*/ 7.vEBxl,"H @`Qd"`@ICT4>a腨,ż'sP $,I)yx hfD#a$/%[)/wB=AԴfШqD$#RsdJ&c j^3X̂MBІ:D'JъZͨF7ю*GUfHm$֐ϊHWUE͐+}TH&> 80``OcĖ)Q$(_P[Rś=q,k-*ֲ*8Q,O^`iL-k4t.!=a\dKJ<ٖdz:`52_vESXg `Sr3zLRֱm'OkѲ] @6FݾBOk?&v`5d*.. eZ@Na\&yJ@'򰽆$,|5ƨ{Mڱ w ]@&CԈ Ѽ9)%:CRpi kzθ'Zj :Gwe \NjTkՀ,gŃDe3R8N Hq0Jt"ÓR/jmw?-oasJ%펬mOcZ<ICgMFu< 0GJe*ME j-A+.zԧ ~ڏauʾXqGߺJ|Ψ|2n,]Ç @i,Io}R /u(;FJ4c/{*^W#}k^DBH#òOWjj 0\_ZܭGڮSJ.g/&Ov s%/T>` n:qB8V(\mgw610_q",=|.{MB7;ď{YOm9r\TO;񐏼'O[ϼ7{3 EYGmK}?Y7&I/8ѧ;gbIzYjkRS_J{jxX 5@5=Pz1žY>9Z>uZ~+ҟW; f6J 1@+59XdYuB&# %~aQj@s%gs2Z]Ǖ2*[[(\C\gXE2pO\T $]/5٥ZJW[/}wP{s_54NȄ6KE^wctSm>BF4 p v-ȐAPpaUGKF;mbDh=6:PaÇ"|3&fCcbdXf:sn7X B]osuX ghkmT&gFe~XT$dff5{m/ †{c%a}щ_Gh'7es@Xfh`H DiWtifz6?W"C"_!Ou臬FmΈ}nxsk?W&pn6< ^lmΖnf8@AᎰxՂǍDzxEXbD0 C}Eoo]op$`6ׄ%5d\ S\qny$w֗M7A")T!'$g1rKgJ-"/I+xtXYsH80sCJ5w{EtetH]6J>Ǔtb0p8Tv.uS\7ewUeM2vKwD[旘l'% wTwO@wӓwԘf5Ax'9Yyٛ9ma!u*B% )ĉPy&`^{Qp)9{<(yP"SC|GkOx'tU)iP8p9&%ꉜ9%P$)H uj<%ՠ(P6cI_BИfig2|ѝw2Vg%4E0FsdX_`̉tcMIe?$꩑%FM}MpJ(4[ڦK_@aZ[Heɣv!*E1':S'Y\ozcc]*Z7 jf, 8̧(o)6r:*.bW\r"cL$(LZN[kz۸=ƌSvikR4i1gK{1wkZ.fF{O֓ >԰C K9\j;l{ 7[پvxnph4]C2*'uN, _*-!FC`qpj_w(,GOI:Q;&ƫ9|d !,"4IrLwx:t1gdĦ䞇w0 %4%ZIzhLvp$UrjxO2x0jK0* PD+CƈȊȌȎȐɒ<ɔ\ɖ|ɘØJ=ƺ̅ɾA=k3+Uzvz1˼PykHh2| ̺p +"R'BP,՜,,8w~Rot~-q~^ ͱ`=$KL]N{X]]{U0uɐ%@1'ZUg[+ϺHvӆ24]Hsȟ|9LA5IY4>%=LP  7jHL@b[+=sTG\TCBb_$]0Eԯ=CJRrf[%#l*4P;u}=kLְ=λ8,}J@uv$}mG.=`c>Trح닞*l" 笘<ț֪ llqMn-G2|oKN9Z4ܮ07fB  FcZ,7H׻?-HJSHKIQݮI @x),T^V~XZ\\mge #. ǽb>Fd=k~kMFp_zр|^F\gX-wK Kv^\ 0$Iдt >A,~cii4&^dOӦCQ6THFS6p3QZI}.P֕ciߜ=^튤ؼ}3&thśN|'@8֋@->(ab?d_fhjlnp}n%A_!1M&uo]|z_j~?6gVxbX{tw~MEY;QώJ  (O0uɂT63K *__eQZ^Y~a\6ivC X9G!W0'j. <..=.:*8;=?ACEGIKMOQS )]Z=j a%X,=/8~=:.6UI].*;rcw-0`)0piHfI붐aC!Fq$p:Hp0@:wn(3(,*HH L gMԹgO?:hQG&UiSOF:jUWfպkW_;lYgѦUm[oƕ;n]wջo_788'VqcJ<2]'03<#w^Ytiw F$؀9ʷqʂވ4 .!0.0ps!ʢ _z_ =݂1j6 -,;k7r!x3 :bAX0(A6,35"KL` t1&q ßlAǿ%RMąr< {f(V:L'83=d*KD5b0|yI%: "䨲M=@@#1sDlhܔ kRQ$),Lͬ$HM,DXn$)I3bT5R!hMl=]]-4Xт̳!9Z_ز\EߢG `?Rm "] a!w-/BtuĐvx9b0e8lul02~I> C -.Ē~IimQF$v$U% egLB'|w9O$^[Ku#gà!z`v0f.<у]#ݎmǔhyw r˟֎}z>WF`[g(R5yh+gb_LQ_4MZr./kS/kQ["r҅Pq5r-mvsFW͒-$Hww {0VyGc$CW땀51/1v!ozs#+`"| 1 Rrfd~- s5 KU &d `?g@MyG#' # >dQP<.+(M{B´5$K*k8dlNst+ e21BDi &2UX#"*n@F@EA&! :3! Cnn )QJUt+aKYΒ-qK]/La41Le.A\|MJ|evivnf7g50y )#7kS7 pwќg,ݰ.nZ|ڪ ({l^[g;][>0,w{yfE I<~tƐţ`.sֱX @ƒX?OS Yd3;+dȄ#,AE 0|:6O;,(AыI YAѭ$Tgg>b&E{ۓ՘4䏼v:[5;.[Y&yǏw5+adI>$!͢ԏ %u'"SAr%7Qr-wasϜ5q\dWc~,>~Qύs9A_әCtj88,t@=1\q8b:sN&mˮn=;7YGkŒ$:Ӂ -+) \[Tׄ+q \Ww_ikmMߧpg_R^3&hUaAO@8rG2+r<?hJqm_30SW- r٨W}(aǐ?џ/cOlgNp"JnB \Eto=!(:m14 8$Benj/nNp 0 p 0 p cN=# A0͙j,=)PSЮP4ذ7J Οh:#}&Q V.1=$* ` %;121 %`BrG~(O347'^jV/ pװOiI+ QK&Q$Ą9bm"@o`Mz(V #1Q]> @!j%jh4[϶:(د FL"Q COgsr d9\m0d  J_r #K#V.xfLl 두2vnr"@ Q/''[2Vqg="cƏ,r| rR oBCRT+;+Ƹll DM4^R.i Qu6/]0R(0P319BnM?Tdzx'R33 D,#@$`PrԦ .P59k6IdEO:a67YDgH=4L N rD0֨hHO0 OVpdgiP;;"&8(% 8]Tb“x"&8AA:?CJѧr:3@AetFiFmFq4GutGyG}G4HtHH F)0;UEH ED#IjN2`1@4< )c>S4L761>1S)K t)16^3-D/ xjWn1arvQ{1氶4FypEk3QrQb2%f(1QЧQ(DRR qL11 ob8*AU ܱB@ TUUQ S Y-)#5!G1g"രs.\SYu2@7J:$XQS %}ռF& :& ѕ vY/](G(,8&* O+M+EVa)a,rWn$be116.)HfUUQ/escH8KS v5sv \5z22U;/4a2LR31XS1S6A`whdokB77}39#sՒq֮9`2S4EKOnOo;*Vs<_jm3 ::C?s!w?@cpvrsBAA52B74XC# 3HSL4BPvTT-&TIuw{{{7|w|ɷ||7}w}ٷ}}7~w~~~7w8x 8x!8%x)-185x9=A8ExIMQ8UxY]a8eximq8uxy}8x8x8x8x8xɸ[1xٸxMI鸎XE︁q9x.&1%@FNTNt3Nsy Y.ܴV'9 NHh.i&VW /Y39.ƎB`CFnwv!aP9Wp/jЫD|E#d>S }[.~5 3&2(=fl#ٕo\Amr EU/^R>fҹؙ$ bJ(S(C`X/g 0 X8]!YL@ uW*QbŢy3?"~ ZQZۢ#Rc4pm'o"(uڔ,  ZAv5Z7%yNboxײZ:An !, #pH,Ȥrl:Шt*Xجvz0qPzn|N>@(Z b^[df{X VVLΓ_WeV X ~ N@OIwϊ #RBÀMǏ CIݮuPKwA#쐏A >N<k:JYT4LɫXjuŤPZS D<+=_g?E_+.,JIVl*^̸RN8b& "E_RL3I Z5TQ)$@3A>!=U 椔Vj TQ+g-]mHrVΈ]ψjOpQp8 k v+k&6F+Vkfv+k覫+F*Af@^,O 7EI3NQg,ċ[ ӫj(ko9X),HĠάPY4Dl`EL7M, NWm$gWw$A(5_wC mݶ"Dn'7G.Wngw砇^6\+騧:u!뛴Pn. ɺ^zK ̹w+P-MRo=|?<3F]=ϟ>M Hw?ηV)̨&"D NB` QÀ%@Y8#6 P%pTxQ ϵ#UK:㗛d'ռ29)JaS0Lѡz(DyKa BJQZ&LF5I&"b4J #!T!!IT#ب#sKb$2+n9dݝ% N2hL{04y^` f6hl#Ty f4f 0_4/Z^ѹ#&10D/LŽb'TcYMĬ腚m:pY9]v7X0;D%TI7@25yJQg=]tj! Ÿ·~}Щ@gHXFvN]I^'+}~!w4J*8y*Q0/0&%74{k)OzTr7|RUUզ]B煠4UoZМ6EOӘS7h0gRdORY 8GW=UMOXB!+Ԛe*$Š䱡WO"6P@.5r;ߪR6ul!&&Hfw|^+;]x,"Ц\ P%}@azlpi[$v'Z pPxF$%LPH_ߴÝʦg z+˄0üOQ:Q0I6J m{)dW . PWV$[JrP/ `_0ٚyTŚbq_E*[* opg c aR1Mw,l`Ru14?HtKymXg sWQzZyr WǢ &dTBj"Vuzǥ:#?׹;m-+6@G-\~mMQ6:88-FV1v^X^_<([&w6=T 0GMX* 7d)|H)Yx[8-d@F&2 cW8ikx,GQ!tCt؊8Xx؋f/R`A4|Hg8+Y]E(easW^ ي6a!J7~I "9$Y&y(*,ْ.01h=B`p3>P69*g&< v oDYH8d3~J,*Rb@UA4s"ADRC+(Gδ+HQy8XZwB'y|<,FEtĸ`q46NMvj3QrAKA*\#H3x ticaqz&oP/xh[PzĘ318dSR[+X\ˇXu|SeF|c%zE~:8mA?!Zr! HR( ^82yUGɞwZ`q^`uv]_1&Vx&8AIpRx(zROzT(I^`j:icrR*rPbdy+x:+i<ڣ>@B:DZFzHJLڤL8褾&7q"tiXj~Zj\Z 0G ƥfjkƵDx%rZhrwj {jEVf\j{8Fih%+DA:Zzک:w}!gfvvgngmJ=(jffkvW::W:hVWqJ^vHYcTXdVK bV#FcKˊڭ:Zz蚮;֔׮F$s*z`:r+?:ˣ {JA:(aPZ ?3R%{կ??W%ZI@ѕE@71XT@+]5Gz0B%d7k$s5*"P_UNCs9DDw)GtMEJLdu9$KH%dDۗZ\ bF~upFYumԧxYWHD R3'HTH4~*HeKPY`8IZ{GAb7(ZO7K@KPN\XФM%N!uK)kDP!ZMg׺`z)츗kۧ`P[g.3T%3jkLZ|xVhWtY"ū*eT,: &yb9S-V]T:y\{Z{zV(Y˾YS f%he;Z쿨1T꺲-,I`~U|âMᦿښ UiʱSLFH[s/Wqр^\D~Υ)A]+P]]^w|!z^_*f_Ua@[vcA[t_("|67,!EF ڲгL)A*D's@VB&L̑u*j:AH^l!15GbJ{ <<\|+}/ :(+ПPaОYМ9Uњ9nј8b&}҂җS.m9!-ӕ#VdӔD@B=D]F}HJL O)}jbgmnԪ`m%6ra#o> k= ukMո[Hm|eݓ~ݼ۬R[Y^ "F!=.M̵Yw[,$ akK`v{MIꪃ'ăEpqS#_TE` ~̈́Y~0]ݎy]趱Kb譌CDaxqfsuDy؇ Н>x+6Z3~EAR&v$*|ږu+맋>^~/W CLcqic4X3w5o47 oB 1J<53[0S2n87?s$*,.02?4_jl3pB B0_Eo.;O#L/{O?.b4?HV//(j\.֪_._chjlnp{rBt3mwu,|o~k KiܽR?k_1CF$S@yt{:5!`k?z̡tϭ롟'ZOl{I;n(."D ᔽY44 ӟkp/{꩜_[iF}1=\Ţ2ACEGIKMOQSUWY .:`1#'i = ok3)j.:*ZO7&1xqǑ'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl!P ) 1P 9A QI,QLQYlaQiqQy R!,#LR%l'R)+R-/ S1,3LS5l7S9;S=? TA -C AEUԄ TI)K1tRųOCxTQI-TN;FE5W_EN8@Um_TVlX,ؤ @[}$?2' & $P^5o6$sn )?6p6Tp wpy\t8ۥ~ M jw~1vUju翎N=5:ȶZ+yȮiTVm=daehצxpV pޙ \^9t%F|U3wU:ꤒrqG"nVT[uUbov/4jJ" |s=:-Y l3)YU!@"Mno~] $aoX@¾^fKApAPl䂳-[$Uc*U stR u0 !,w /pH,Ȥrl:DtJZXEzxL.S\1tn|N~ fX_h[d g nZ ^^cƊ]S  SdiRX HUB"As"rNoUB! "6nFN t@Djٴ߽x9鬃 |b-;b88\0͔FɤRT۸sޭ[hI,f")*w|@XLwCM/><ޭrdx+*Kxn[ s$,<ۀh4M%JypQT((̄fqpx8$T4H/Q8e4F'O]F\A"mwhz^b@iL6E( p(4\RJ8ox`KM(*UXj|\IMlaؑS.W9$VU8(H4  ڔVx壐F*Vcu'viaAړdR9bbA/qgt!"yoڞxov!."f6F+*bzr0Rؚi%t~*BQFZ繁f2$u)iEr,*S8Xonf bJ&r!`}E&]tea?.XI|yN4l C!q42*Km:\ƷT腜"UUlG_sF0 ppvg[r쩺rn!pt$y7bCKMe.r`L8bP\轉8֨BwbL T1ܴnW+IeՕ,RG71jێ(PoKL g \bla8}B݋ Zd%0ڮym9 N3NY=AYCU&1t;3)q -f,)YB;Y eRDžN9 Oj2`E[ '$N\>n!L|nґN-#NNlaZ 0xFsO;񐏼'O[ϼ7{GRzUpIrI>`65RݸʹZz~-Q5|<-,e EDWv_a`t24OTZ%]g)4Q;4HkW+wa1abaJuT%6eboFN jwu%: :1WzuͷU W@&dewdwCt.P7$AMR+r&c@6\'h%%ZxwN`eB)7]=Xjv lvgf`4pmP lg&mT%g!O2K2gpp;IkW+iPlr愚q6nK@2c@(|#<`" c8idm(]Wfk!l)56F\3F&3;U<(78&'blt^wmKfoqyߖ!"xtW֨d$=~Xn8}5oBV}vt=*GhEKGtPlV^ǔh~EqeqE6wo!ru4#G.t}`'h{7BN!ar=%{us s5c$9`:A7:DsX/Ig 0Yt75aKȓhp.h0(CFETc¥}ucIb>PvR逩5>%тz>3~0{fHhzV_dr`orٙ9Yyٚ9}IZbFReC)|;miT}Ni!d؜y )Ɉ׹998Xug'pŝ K|$峂m+}T6ٚ9e Rp?KD 8$&1d!Fj{|A!d2{c؈!q "CI2Wx|q)&`;_sJsJ9w،TZy-YYMd٤ڨ&/) ZY ٍs#[J4nJ}mLvؕnTT5YQWuzS=DnӒP1rzJp=%79ɥJz:H9ÖX(oISzZ5l]_`*xګZzؚںڭ:ZzJ0YD*C5A֮zzPT39vYhRЄ)Ȫ11:ᩞV9 ~vLc'؟*:714Hb7c]s+"J|ճ]ذFPL)ʳ6ytJ+|l3{iqڣpJeP}*9˪V#H n^bZ f<6grt <_~ z(f*"\W>u+#ԙdMdU@q8"26|l;Rbo 31 CFy!B_L1 8#h[sRs5;ݦ@ @O#Ȏɪ [c'pd]m5C7e7^9s{9j9Q{87Dg$I=n_?:/ <_f 6[ĩU}a|}3stQ2<LB2ΰ,^~e~"$ Ƈ!&([šm=Kfqga,d>f=aaZ ڄS\Ve3vMN A aֈ\CՏĶXm qIFdH +dCd E4}%{ 0B"Q( , ]|~E=Ln,Uvhz8i~ ݜ.K=ͽ_A"-$]#Εf|i<ꌶi!pRr$ǒkNV)B$L 5/۾6x;޴ۣj^ O^<-.VM~ ܵ|*+5H~"MB⦮Ӳ-9=?#X#.,Oz9ڋ<..-6ѷ,O=S֎\u*!'`QOmd4{l=#&58ךT/rap_.T%S3R RO~# 8!)\?~o9_/9m-;8MOitB_Mpq\3rHy?l>]~Y X<㼽]=9[=썇&%M>|aq,ʿ?_؟JY| \]C[h? ^&I`hJ\E^ S4I2E Z~Y~a\6ivq^yùd<0(,,6' /$7 `DqF kW_2!h:2BCM#0ɸcXwVPYN ΞyǦSE"sMKFŲ;dT g,< ˂hq HX L9=*QWXA[`2#1!=+ @c0w2nA1ןL 4`n"3760 9f1՝Z!TyDU0OW a(ͬqzUG+Sf-Ú = N}~%Piyzؚen[2d!TJ-tJhWzyCp}5&uF0/茅mc]g<Kcddnle|A@v$M)k*RBuCdbUmby0hc^XGΛқ֐ X\!cWͶkas8.AmLnڣne5Ko;Yl٬lE85 wK*Q ss̵n֯&e)M]VGX25V1hK``.[&y G2N5ew I-4-\ZU'^b7>˒ෘϾHd`q+׫c.L, :B)\b#,!XeCNN2KH G20|vb5'^M_R&x,`1ZE6 59xc" @l ,fE/эv!iIOҕ1iMoӝAjQ!>ZjUۥ2㩭zյJJm쏌fla/[#{L|vjXTJڢu4T |n ߻*dt~ "vU{s笕8j0Vp)")KZ u/#M[=\8h*W 8R5k|-R&&: P{C'%]eQrWc0 VlwQ+B_RCc)= ;jkАl\7Mmn.!؊ݮeq6ARC{ՎP(X=$&xhtڬ] b~{ZXmsJAU-xW~uw;)Rqq1]}7& S ;aex@8IQ/)ztzU,@Һwϟ0p %:I5#N>!0/.Hꄏ^-5, `nIp+ƬFU'' DV0;\a,e0u=bmP#N  P Ө P `  0 0ZihFL Pe.0p0p1q  ?<`l% &a.0;:0%q00" MQ1(l4#Zek?1rg1*81kj!( }1q1q1qâMeQ Hp&pB jQ QQq  1! %P"5F0#=#A2$Er$I$M$Q2%Ur%Y%]%a2&er&i&m&q2'ur'y'}'2(r(((2)r)))2*r***2+r+++2,r,ɲ,,2-r-ٲ--2.r...2/r///30s0 0 031s111!32%s2)2-21335s3]&<3A34E3ML4Q35Us5Y5]5Q33d4i6K5q37u5cS6/634os78[7o~̬E 0838:ۂ4 V_8hEzAg&]B 38:S7 o :=6@3lt֎/ޭ"s @tCxP?4o36ߓC]L4KD+@~CRT:b DJ ˘3kޜP I6|3+SA(kNV8R;9 {l\ONੲ+KNzbnd1t/sK*NFr31M Rzph'4sYg&HYRE$Ai pR9[F0QOZUG}rdXfNh:8cAXd;aPDypp5Ei LXbof{ t0$-ZbX@;l E4@Edqx$qЩWTxH^Y6T;Q sJy;mVj饘&f#!ŝY0y(LS~ j"XqH!LA*Z*o5 MTkTEG~T:y!Y,]lu^) UZֈ[QJ(nstY'@ 8Z[nMVNKXfD(,%_MFN1g:2 gg@JkGv5l! h&m:?"U?ܦq9* (ER#0V"W7o=J˸TTb$} i(Q^P{#Y$2鶿vՅ)5f~^yeQl|pG6mj* 7vr&JU^mHK.xe+[8s@ܙ~䅝43 3vA=)[.X%F0&dV|B";r y+Jx"%meLBЈNF;ѐ'MJ[Ҙδ7N{Ӡ6Š(j?ײvH+l܎/MnbNܾ)uMzη~ , @p.6gqN^L/}bz2> ! صtݥ-9:}q0 O--䇍A lU,^n|h @cւPLEF\,:_= y9EˠVZ^o9<㤂$D@-KR1?!_lCdeq)*2 E6(}(+PR |ơAǩ]1} v~gd!6eW_c[WB(y]ʹ^$Y` ^Ws #4)tgd"( W%`T7cf 8+*1nuaG_ + M 874l(OIr'_* XlMh/b5Mew%-V()?0ֲ`E2%p)I8DŽݖaegqp%-Xq/'ZtՅM;bxIXT F/?c[nWT%`AP{}<5R?Bak)*`Gs_%xdkjHRq֗C؇kݷvNvˆ B-JF.R ZL,H8ercl%zWf昃%f`30A+QѨ!C1ppDyxfT4C1T;n1wy(8g=T`¨ag40U!pgn0?av\T qhѓ-!/p-XJ44Њ %PR9TYVyXZ\ٕ^`bT%FrcuFdXw ev"ٚvbR3Ku<6vX}'S%qUDk3x)yGGZgy[Zǎ xɝey0w{1Ozc{2{9ayA{{D!ҩ6KXDp|4|5(k u|x]އ )'凌锒:~~ pi# ("^VXq<&exB){D+466:a$((x_臻(xrP;8x<~i鈍!Vrw%E Zf^azxdL&3xH _~r ,fD†s7x4Z6Yu8(NXww:Ua#LwTJXrɘ0tZeeȉsڨڀڦ)\yO*.7*`a3c9$IN]ۢznP&x7^xՍﴞH 2 43ُa1QZi0 # wxB% $!!7w-XP(wI: ) ґo9X3'3p-+{yHk4y) 9y;Y=y?)5AICRG "% pr;t[v{xz|۷~+ʙBº [ 97/[j+zuR )^˸&%wEi5KK#.Y{ Z๻{#`&wMb>!՜`mScB ?CQpɫڝkџL vxI'½M KP2{#qG}x;AQV.z0K|"1\WLO , ر54:Oث[pD6lWyQP`M+ft– cXd{t:/+jFЧk\%[2j;dbFH# 橚t0`fzpd+Gq%m0N`gi| Bxc6 }BVZ^zld"l |0ȧ0 ;pȬPhm: ^=Px☍m{r/ b+0 "˗̜7p,ۈN, p2d9.2ጳa|dFVسVf12\2 2m w^ F =\@p?Y5B`S_t>^~뺾뼮6kj^i2!Ǯk?~j{@njU6j.,qj]F>^~< -|XMcPHMeC)ه tQ?p7m =uvv[g}vg s$Y7zEUŐžTAl07ac+J[\W~~GriOGE9*\_[8ra*&*%\m CxuzbvdK7;dW(O8~^gEc0N5|[>vDƍEKٹvIo`qxnf+l/7)r?HwOzRW>Ys5_/m4VcXUrxFqrq$?QZ^Y~a\6ivq^:x  !#%+.<&;=?ACEGIKMOE=204QcegikmoqsQ1.&Z]u'17,e=.ӭħo_@&TKI;F8bEC4и#҈bI'QH˖G̨fM7qԹgO?:hQG&UiSOF:jUWfպkW_;lS-;Tݟھ l] L;pC #&|qc23Rx`k*|ycϟQx恀/=s+shAǖ rL&v͉ !@ m fGLC$EU4Ɏ-y)ޗǗ~4HFn`ْA! Rlvt"QnGAR%5IQR-uKa:9g1))p4 4!@7'F͍[\ǵ.>DlH.2TYj:!}pӒPdj?!V!P+\k{_"5,uc!YNe1YngAZю5iQZծuka[Ζmq[o\5q\.us]Nյu]nw^񎗼5yћ^u{_Η}_`6`/ v!a O&n0a c'Ab%6qcfal!ac8*M7&.=p=z:qL:i<ԘQژx@Ep%-sX@zVNS=oÜg %IY%TGEn"`b=O|vCuGJO|3hy&d#}dJÖfC/rA1$h=EUUz r | J"jaoFCuܲ s=SBO¦Z [lKl&GFj۬z1q .ѹν@bm廵4.{9zk&I*@ 1 v v!N\& 375ON锏Amjg{Ov Enx{s1C(.{}7T}i:K^BXpb)5 Jy̚⴫}sef-Ow9+=hSy7?{+}GOzf!, pH,Ȥrl:Шt*Xجvz0qPzn|N~b^[df XVzΠ NWOV߃VV  H-],d@bm1`\FsAbuoJW0`^Iȳ@ %/ڡFd+8=Ilz`dXm"x@]˶۷p  e[,._bQp8q`ovR˘3k9{ "% LmMu5h Vg >Yy:`ScLxv hN O͌{9Em8vWjwn(R#_Os}E  Ae (d_`U">έ1၊giaAjfNZ#iHG@P aJ\ċňkLdX EA7$7 d[p) @?;8es%s4B:7RӧOJxU6?oi饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6,2ٶVkfBJe5^5 k"X |箼Yѽ,jd!j'„ " G,*7Ke( lAd,j4\<@-DmH'L7PG-TWmXg\ -d6]}dYvVH`CiR~abgMjiD{W7~ߝA{RD %^DY#ENeV{zоx7CS=}>OQ0/#< a@E!/0NO6* aV12͸c' Ix.!א '`%-q\ 8,2H @4% D%g IS@;rpe@j. C9Ne1 &,W`c7/GXDDgxA> k2 Ś~4C:!Ѐxɂt@ > wXќ3E0C$cZnLv ++&/*HF'l3[ 'E>&XC0 "~%-م pHKt(؆(`K,R M hΪ1n cLlTh(THp01GkRƝ ];/A@ox|nY'1PO휢?7™QN1&2xo\&'n3.$)JLft&Lj/zǛ`2[aMɸM*&C.L2ՒR] PTHI]W0xGN*U&-hRD&3 %(SQ`pAoDV~i:.o+%J%rUPv'Ql dzž1ml ؙ.Q>ıfd| {D{]@"Mw[8&kgýc%lfz5o(NW0gL8αw@G7w32چ7E dARʪ2> t _a,c׸+kT!F\ sOg<Ѿu-ELh53C*g3ހ=Q'(K'lo567KGb|Cƚ>Aͪ=)4Wh+'PE@_8.CDVȼm1c |3&}J<ÒJ̶O;XjDf6 1#:q5Jb @1ܰ-/·6`˖Y$1+930юDҩj%oCZ!=#sJEJ2]u"i*P0<g+=BU9o$ŰJAHs,EQrɜIˢT[1M)_4EXTle<PÙq'd^~{M%d'?]ue+Sw{smD]5K tbhj"@JA_#s7Lo%p߇j7qQAI5ihZ#+gVZ_TwWutĆm{^'B[%\um@vaЂ^`I[6\1CVC*(% V^w'M")nI^#dv_O(Y_eaVjh]jش``YUa6aiaaab`8Xx؈8Xx}yv|bsI~FP=dF7\&)CL]vpYo 5#7T9q&9s9ƈ_ 5E86cJf_xHx5kQT>pPÀX<^TecNzTA~0)XxU'RͶ"֔BXVն8(FCP:X/V%"H.)  Y5ڨI.'qqP#8ur;tDRI5y7Y5%JStMt}JnR'#VˈR!N0VybT!(cvVqwf)=/)oYnҖ)u|~ PEO׎ Y7xTz Rb0\vSPI;B6q7a.E| 'ؔK7Xq4[ ynHrHtB qR%Kp-d0i9POc 5Ev\ 9DiZ(QxoOgBs&Y)\@NSF ab1jŸІ_&GeB)A*Inpr:tZvzxz|ڧ~b(c!W ڏkZB6:;83 0ʦK-#33SM9:G Jʦ2ոݸw蘵~j*j2x} k7kC"d* WR(6eڣ(ڬnhf4B6zszCwU'Kx@2ɣ 29GГrqq %7H靵z:O[*j  1[f^yJ$,ttN`9uaPu*zIq#Yڲ×=9}gPQ+SkSnkrfMjf ʴÙ9z ]gdYQUHi dBh{6[mˤTI¹LɧV|{ C۠vi{𹊛;1YםyZ{ )t홴H:XPc+r;8I`eY { hQM U )[{/JGU/w$rCAG苄0j^5- [0 ` ]/&wۻ1FǤOv(T/Vʇa]JIb:nI*,.02<4\6|8:<>>-E1-@\o--FlP>T2FU OZM/NR,$}e3s\`yR`hn.!R5#~K[S_C5S#x&M8Sg >N3j$!'^ViX^~ȞʾN$=Bb}+;h⪄P$jG23[fYO3|6ڪ<^.",mbAfpZ T"A)o7>Bb+J'J$6,L|F|,>Bn H<>]P]+.w]0 BYc\dMkbh ԒJpK]xSZzM?įߓm(f!QT/vz͏դ@h6Z`wQؿmvs,wΟɏuQ/+xTObzQ?tuD/K@!4 ,H(LUn]eVmu0aoh!2Rr3Ss4Tt5Uu6Vv7Ww8Xx9Yy:Zz;[{<\|=]}>^~ޞЂ#`@ HÄ tbz(9v àBdxeJTxAJ3i\! m(%4, ziRkJ?KVZ5dB .(lX 2,0HlZk>PHlֵ.% +0`@b`ŋC @a")W|sf͛9wthѣI6}ujիYvvlٳi׶}wnݻy GAP 7Hщ .D{۹|jE/~ ~|wKZl_AA  NJnz &AI*@B =D]FK:tJ00D Tz J]\bXSGZu,M,#`HZ@jh<ڼ<`OK.ZY-:S۝z|ݗ~ >^~%-5ޘ=EM>U^]~emuޙ}蠅袍>餕^馝~ꨥꪭ묵ޚ뮽>^~垛ޛ ?_%-5ߜ=DtM8U_]շmuߝgKϽ⍇ܽ(m:魿ߞR7m$ E'?y&X#U Tbze)O^&DH :@1fJ x hNA^,O?>h` /(=bh>ݰ<á =t'8 Őot{WpK}CG*i $"h*= ч"7Qz@b4~YP F::O [@;a6He]xœ!tLdGDtOb%p qb$qŌ`@&YVTN!(Jɒut%fJJS$d2Al8B`Č6!Gv%$ ISI%ns"zf XG țrTeF<$@< gHmQ>L>Ri%zp,:(R@+<(&( nG3XRH=mdv+&4g:ںu.3<~XS Q5P# \Pp`nu^f=G$jjYxVXɕw\g5t lm^T T* ЏU~HKM3q:Kjry,Qb֚ ubI"MMSg`d " WEx,enG{ae€8C)n@ _rݺZ,mxkjI^t+0!G_ w y2>[Z PRFJd߶w C7@}Ky{-"P](-=X> nS wI3˒$"yȎc 3:qGByՃʈ]>#_Vw"Ѽj;"zbྤα%ɇrv$Q!GDoiՈJ'n%ғ>i[*i*ҝ~f%}v՞[&M)3kЃ|-2n|fI?>ßaUintI++N$@P-+,xiL0XPm 6hLx&#$Zmد,ue%@0N|q޽̛9:X}'xpYC'aqE~ `])YA{A|<UQ xT2I D__v4 t`ގ|cspQ%-lx 2YFAb)@)2 `$GiizT Bgt͂hp]tHP&2-PR^&\Ey̥.w^ 0IbL2f:Ќ4IjZ̦6nz/'r3S^.vv*Fw󞻀_o ~sxI&ςt`І:")C'JQBRD+юA_\!,8@e. Űv%[ 0*ImrDF7j Z 0ZMhˑQMFƝaY!lk ϪV:m"b/G la":ҋ-<:Թh:㨮geG-S15R"AHqM١0%S-«wL АjNZZGKݎ2NYrmŸg,ŷ (ZkZm4fل`?D\:5VjI6Y¥p1S#`-敊2YPݒjN2l|c8zV&-|Ek4Rj`ZŲb)dW>&]헏d&Lm݃Mt5.gmPp2X@rj@#fЄH-RڢS`$ֱ{3=SԢMcT+`^=2$,wZbjZ qxV>R6ccIiaAWW}4H lգn(Z"N (zn)wPV> l,{#F%\B8Ĵ*7qCޖ>З"D b;pf5sF@Ub*CC)LR@,ijy)#rr.wK[`NhOpNxϻ;p%U@I81xɖ#OmϼJ{~$wGpu駛dw~gY]0I0O;ЏO[Ͼ*4M ?(x>d\WL{Z&p7ۿɾA\7v<x$QÀH w-XhPB:`lŁ "8$X&x(*,؂.02y^^2ou#tDI5VQ^U&~I=x?7(aGPsNU+K fh 2#4d]Mx]8f$hNRZW([2QB_`$VY1ydU,B Y$_bKb'q 0BU=cЅ fgKVO>`#/4eW[S.=g":t~df.5Mcfæ'؋B3j1Qp=Gf#igѨUS7֘i]GtH\w9PR9TYVyXZ\ٕ^gVV]_ `IR|IpbH15liufyp5xPxu#eeYxYzQ,F0ǒUHviՑ+%nke]OMEl8^f%edi_ 4q msOP7YYQg^k7-%4fpW1fhy'9y3,T.)nQW>ٚN&wy6i%Dٝe{5Jii@j۩sva{MoFjyP}Q ڨy"sYu ZP?s pIMV֡{7:4-&&* 3s6Ɉ $|b;1& HfB/euÔY׆G\ڥ^`b:dZfzhjlڦ[zՖ[U禌7Y~i BP~g7ezZF_䧐0+D,g_Qè(65D#zdcI5۱6xrfBOw|vйzfC3jw`m**w)T7R wGYZ|N wo9KnαZzؚںڭRZX:ԬYA4R ɮ᮵j#FK>r)6aXTSwSuG-y(>ڇLb*: h&#( ƈ+Lې裚w H,&b4C@{_(A{SI;2*8EAnj,ШgO b&dk:hijk.S;),.BJϱmAhQ*Szu}Ȥ>^~#nN{g!w ".}`,| M"2.ccXb 2e{>cnY=KHfXm\HsRӘ]=Aw} AD)HdOXT՚ Bi2[crxܓ'-D@iI;Ut<mS']^q> `Da ݼ?_ȟʿPNq砮9N$ ;ņ^ ܯB_? ;,.>  Ӹ ?QZ^Y~a\6ivq^K+<**4&.$#47'gP% ~vɤgO#-y`c._8@ tМ^u d`FƢ.`E,&+DI38֨j$$T:#cRA5bwCxp(@p$ Ąk_?.^d*$0M8g<`>%q^ԈP 0HЅ$J2;2h@ $v]tFpC%%priFH[V5 WIJ+hftV @ІmG HhL&oGQLxΓ.=bO|*?}O#!, .pH,Ȥrl:tJZzxLfzn|N~ eW^gZc U nY ]]bNJ\f  RchQ H @Aa@BE@"FR<(!REJR #ʌbPL$NX$ / !).UŒH~#]-Q 00ٳhӪbU`b# (y7(mqia:MȀ]K׮` Vl%`T[ࠂt E%)*̒ѥ;L`0d)5ȓ+_\$ѨNȫiJu,_F^/nY)u2p{y'i}b0KJ5܄Vhᅪ4pAW|WTqTÈHbK֥@MH!(sA`}Uu7UdV}JRIViXfIZ1k2v";I>Rӗ%&dE){EPm!f)qN$2m]ኢ%夔VjAՅuGXfcFA PM֩3*l@#))cv^1j^B\W3:zڥVkE)KgYkOB[Ӷv㎹Q@.2$곩zC 7íסl4+*i LN1z}ZQ`h;QlX~DW@@Wh SLG[S@y)dT'^-[S!ڿ(qHra@Ԟrb&|]a,解Qq3X &>09_'Ob5>)jluӆyE.鏂;420-+DU)FLvT3 z])Q󷊁JzsU KEln}k5ŢKP}EHRe;6RL:'H Z̠7z GH(L W0 gH8̡wԺFB"VH54d7$:PDw"EX"8tFi` asLKhLep0ʼnqx̣%z (jlL"E:6q IJ0? %7IY|:IRn"3*WV򕰌,gIZ̥.w^ 0IbL&Tv|G%C1ME(U)zH(lSq!EQDĦ1φ"A[MB'|PoK:ۡPm uH.$[aR|*<ER{Njx0U^| @O/0E)3F:R} h]c8s7!sӺm}BQ#nWOUdH $@Q#-^1טP Lw ʝX"Tj ہ GgאuM‚$M!#'(iIM“<[ݲƝr}Ê:%L0VZx1_DhpjcUzr8eXd zm@\]9˻%ms\ԒrBղ8(릵m©kP0m` EĀarH׹Ŧih-w7׍lMeTo/L _s{y 56d.ċjIN]&N N/ak ћc)qle 0c3ʏ]anq"-j/t,hR)X u^G|*_>x?v8ljZǙ4]@{FPR s `d! -Ӑ!&Z3ʡŇ/9%Qo*Wx? 1‚oB[`ZHYՑ`n{MrNvMz;Qo8YuF4Ob;.'ng0Ѩs4,NQr|- A^ۼlw~NHOҗ;PԧN[XϺַ }w]vsI$+ \m{1J}9Y/ C›OO|Bl;~ <{] Mx0yW(GOқOWֻgO{c8}o4 hSro@O ᫸BauEa+!8THɻŸUec:UhJh~UwHT Fnѯ@zHhw:A@W&%^b6 DЁ^% F#&%Z%ۖ d^$l`#DV"uA3`}(6Q,a#1h"Sj9ㄜK >hc]0bVr"9Xf=Pq,=(Iʲ_&\g:0D#gis;E:Gw("Sj<sH=sXyzsdq-rJY r#rZ:0+u:a-::rv!!?j{'EEqk0eBxKp DSp?MJ&[:dZfzhjlڦnp[G} rDtz 7vzHH ~ЧWbnCKWH~Q7Q~q~/q?~ 9HT^9}|3vVBөNĪ# y4n-"*6E`v)hg c@k`y#5\{AZD u؈RXXԥXZqت;ɌzxQȯJɢ_҆z@tcf!xyՊ5蔵خ3X!Jj=҉8ʬ$X4U)$CyO:)4h (9XhX=+n=9? ,:1%=^`b;d[f{hjUx9o;ɞl B"&DI!NY + uk I2j|{ -s[ AMRGq븛+KBh.frKSG{Vm;4dt*|ؓm AXbuuFI3F**P9)뛫fORWjhbI&#C8{JpG ;a@{4d=7f`1)&`XŋRZZ82& A L<*)QfW$ٖK6re[rk Ûy3K4Ǚl_i МKP[c<,AմDȰi:gf dlڗh9چڰ])=Uټج?5\`ښ"ۦܔ,VD64 M}-j̫BN0WY})}"p[/Dv[ |ޓh^4d^f~HYThyzTm|G+Q)Yȁ zt}QB( п`@7O͇-K`^~Q`!TQqI-#V.yӍjH~+ӊN@d|W+kY[kWPR?T_VXZ?]N4͠璠"{c peh}lǨk]x #} ݒ\0|ܓVҝh|08YV;]Ɍ7ߪ/-}v{` `|qN.ϟ-Oϸ!_}/w@0\F`5^z69\ީ~pKU *p\ e<! YmtZ\a\6{ivq^y /$<$.*0&;?COQWY[]_acegikmoqsuwy{}8`A&TaC`)1fn &HdI'&/aƔ 1 \ԹgO?V>i)gQG # F:%EPպkB8`B֮gѦW+ ƕ;\b 0ok4 oaÇe[ď!G d"%gּP!2xqǑ'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl!P ) 1P 9A QI,QLQYlaQiqQy R!,#LR%l'R)+R-/ S1,3LS5l7S9;3?ӄ-CMT 1G!TI)]!OI+ ĘTH-SOU@PmWaUYi=.C_CaQS vEY"#0ZUxm-q=ZcϠr=]rͭ\# Uɗ ~}brh)^VSamv=\)"(8n@= 0"@#5UՔ(Ju9 FZNۍCfmi:y6i @1A3ea!\ycd9TV &ue1B_JJ'N[(Si{~cnѦժfT  'DH:k_ *2- $v"<&RҝOwo6À o'P=]VxSo=c?#wcGP1o *c]PsUY71T݃x? ƗFf-ǵ~$V7 `ݢ2ehYoR{ѴuA%8 fvfgpp! 6%"P e*0bUfPt*pC& qxbBH<b1xVl" uA fpS$xT5x+R6(<*Pvv]縿#X]J,!@ rmIY-n_T&E&DN X؋1-TGHʔ s0# Xtcs &ery (,mH*Y)4J[rC&$XX^˥ 0bg*rl#M BsHYLya(jћ,:'ʹs *Z'IO $pj[fj?_~0]D ,$lCNkj4҂,OSkЇfH0R>:O2t8YqFTySfh=4&,N6Կ·k JjRꫩ()NnmY_ &9"K03Q72pjQ1@l.6K\lc c!UvB 09l *rCͭW]Ζv[,|CEWx"YXV|:KR`|z0!-iue-b+wիJ8AeQx+I\_s=E&:x ӷ`Iwt,P beE򑑜Ehpc%Fr#T+o2^c(]6s*2pmv)0鼜51 b8|hAZVA!,, .pH,Ȥrl:ШtJZlSCX"vL.zn|NB2a4,bxpC^ea  U Ԓz|~_j\  HAPRpÇ#k3jQ* T#`PǓ(SLa>LI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`sBP2ٳhӪ]$/Ug\u& ˷.-Ġ0ڱe +@Hv9 r Dxn^ş;֯ic-8h,fK\ z/ʞ0taēw><%kKCm 9F<7^Tr1ZB  ,')PZz'LK`@_gQ8 Ph]ux^z BAnj=q* "mb@/uВ5၉ z ZFقOTP0V^脕X򱠇`]CHl"@YvA*Vޱ^~QԉKզ&*x1vaVJ 7#1-jgb8A#azW6^x 1G 0Hn!(*Vl6RrLQ n ܛDja dDP fл{Y /ZбmbL{r 'E6 t *I:zEOsRim&v Xu"g<(R(a5R, R\r(7-HZ0g&XRwh}HaJE (l #6./=t{ci'PbfQ"a2||hqը/\u2(j-z5-kr@#;^Bɺ\VFL 6R7c}dYlk =L=4G0``oU֍.:_ TRnbe3!@ Cʳ:'H Z̠7z GH(L W0:8NJc0@" : Pv*2^m}7mE2P0ψ4&YHx#Gb} IBL"F:򑐌$'IJZ̤&7Nn]Z'GI~b?g /`k8WRB!/! ]XxF0Yt4(/Ѵd@6 ~4l}{(@i("$e`@:=@ ZS#|,K @;VtؕTRrlS H-pʶh+>*;=)sbY/i`RhkK.N{d T۞)VOr&AV&[Y"[<`zVhNƖ4q-kSii F[鶜nv"Apײe[>F1-(hSzﯸK^֜j͛_jSܪfWO󽫀3~9j;,bI Q.HUj0U*\ĕlZ\-uXݔg=/•,@kx"֔@]7ӓ,%0N&;PL*[Xβȷ)J+f1YTZbh/tG$$&F 3EŭR~Zzfಭ(GfZZ)i^ζ[oX8< "k٘(ЮVw7 l0Ѭm#`;݋Q]^er^Rq9X礒ol@d' qs97X՛5j &E΅d.LQo|P୏{`NhOҌU]nJ<bwߧc.;hf'~Itx}2&PC[|Sɸ(y˓ 觠_|^Voyr^k xǓqSdzw]Tw_4 Ͼ{OOBGk~_E P__~- w1wuh'n=iqRcW0R+c7SCcu(Ӏ$Xa'Q5*-5bUU""+%BGucxV=Ws'p#KPMEG}e*-'#^PX#M125g *ZrX,Z^v`O`]gB-UpkH7mxFmbM ʵ\Y}|G``v~vx*Rsp48\.c#;iY_X3lQcee4 8˧"8&4 slAT+8rh3X$Fr|`b8;*zbLj2LNGÅ(d1Bdfx؏9Ye c[gVakFPwf iftIDgC|?!Fx`Xcv# Vz Ԅij8C)2968 FbrJL-HkcUt5Q1e'=96l*WlLpl,p^9`Y*ؠ|cF)mNQ䰕A&Y"n҈j֗~+31S4ŘpRf'b4YCpVИ] M! lp7qj׆Ihx+bPIB0rcrijlY֛JS5ws!?rs<> bAǕIXMGaSQl4@V7I)yٟ:*N4Y*wDfB@QJ p yY36'T8Qv81x5a!ډ $Mc9qwXsI(SES\;Sxu1#ķ"i)M/ȂOęx0UV2[Izׁ87"z(IWȒM`EW g*7abd袟+Vzhzzk *HZx]ܵ yX-9^3:ǩe >b\w\o {ak]xc:^1Z2Cªv(YOE69"cJqO8`JizJWa()j)|3,F!0[ڮӈ> 5(;&Vi:^wc0A(~@ ds :,۲.02;4[6{8{g^#%99Ìjʳປ:zk$N@R!J{]qWY{4ًSwaKN֨oZ&YNÉf:teZ.JR~g9Whlٖ q&RN5P mr鶎;LJp14ǹ^ 8la1po1ƙ@ۺ$D Ym\ɚɻˉ6{6 q|ٚʫj46Z+!%w9crr+ӼmAsCt{K뷥!cT6+WfUwdkKkj<\|ʲ GI<"j i52£Q «'< q½,1j1 Y7R7.9Ew4SH ; N]Ռ֨5UXZT]ÃO\ =<-5 6Jre o Qx}F{0sy֊pȽX6YzY:3|L i9jsXڄ>Ç< 9#X tɻSRi;ʴ 騭L pժyƩ̫|ꋔj ,!!`[R ظ');dNLή@S_6|*Y#%dD*F=]}E;;  - FfҊ1gW 0 ֱhL\K.m9 If~h[X׶;3yH@x{ zj,/\U}BKD^- EMц믪Y8֟1f欪EA]vM `]󦙹kp>ԃ ;6j؋(ؤkAPEl3כ؜ - nc9JhJw閩 Xks˝ix{ۏ>x,u: ZW]}؝ڽޯ0CET&ELAM6|H]K8&KqqXdH*5 *Ga jM>ꤽED1?f*,.02>4^iH6%Q\㾺Qs3ARgA31TEHgM>%1aQ%WFy[(_,(0{Ch@?+c"v~xz|~>^~舞芾>^~阞难>^~ꨞꪾ>^~뺾>^~Ȟʾ0>.&oP׎mҔb.(&F2C%Bs!}>+BޒsZ;~nBB)+um!Ma_e!L~ !)m HkKz" 9tP[z/ࢂW$4qQ*o%#2Z\z# M|BHBv[ʒW@ 7$4#΃]s۞ Z?B^/AT}t G ckg_LA! , pH,Ȥrl:CZجvv-{cs=Pc|N~vn\QSV dfinljJQ faUӓ [MVTVSÍY>*$%< #JHEZ t! $a1 mBTHix9D\Q[{WTG㨵?WH!b"Pbٙ*ꨣL=zi!p@qaJ1\p#JSrtr:HłNdrRE6,;WE* RAA5fۅWrnrPޥ=n>\Hd8Ak-!ڮ+uXvu-lFeD<1p@QHl`u.<,"8rk@Du"Apnbyp PtG`[cb<16( K'mߌs9>mx|߀.n'7G.Wngw砇.褗n騧ꬷ^!@PT v$.m{LlG/Nos_wV8 o:qv췟 /4 C@I!ZZ̠7z GH(L W0 gH8̡wh< "6+P"V~#*Z1"+t<ǸɼhLc""5P HGoj2tNa6> w"dԗH5ﷴV+L~BS֚u-b^:ёtk*7flLWlꭨt!zvW-_]yY|H[ta`1<3L"JzYw 4'OEҲ jci F/L۴L>^nFW0gN8Ϲw@:" #FЗ~ ktic`# B=*bエ}l#0qM@8 #6zM@nt?4} (O@+boOoHQo{^7,Nd|C@ǓeE⽦[mwOO:<ӕ%o&glȼ'!?`ͼOZ]]M"Mg7YߜO:YN7)(}H7 Pz F4q5E1v1e6T(`mERB$_[dW5iI8TZx_d KGM7[q(qn5I7xW,{IZugՄ0,VՖ6xUeYatOB+eXŖ"e Y`(\4S\%>m膀xqu(@[Cyb[臆TW}(Z{Ă'zXu 6GXPU\e{/^gpq1q"N j]p+V n?00U7o]624盚 -bK3i˼3lO)SrjS K;[{ۿ2'A:1dj}rjM @=8/[9] ˹ }֔C2t(ʏmf-מCױk+q׎K[&qJ+؝3g0+.ז9Oep6Ulҙ {*E{ڶ}۸ۺۼ۾=H;`ĝCO]Cd3K04MCO0-C-C@  C0`/x*.ue- BGa >^NlKALnT@!~A%~AOQ1SA!U!9nt2@@  PG; LCYNN@_(3XZ\^`b>dc;HQ]#dDPZn.=SֲM^Cz}C-+ch1.=A)b=f) S=ܖ^~Ȟʾ>^~؞ھ>^~:IZ6>9T0v 3 D.Cn py8 MC}2 B08p#OSFA*_b/8/)?8:<>@B?D_FHJLNPR?T_VXZ^`&yfcOwrag-`0At{pFxG_o F08ѽGb 9ŦGu>oqBv8^lO_ 4$Q޲'h_Fy$waSy@w8~zt8 W5o8=o*9#|dc8-دtOk4 CBm!gtOk$2 ZDu wќ{} r L- ҵv< k޼0gK!M-?^-Хc˞$$Xд D &g‰b) - 85X i/ :l~_8 ̒[ڒ!Ǎ%te%Tp,|Tyf8]u(1HpID%8၈$ `kiG"+xvi$YY/BZ].\P'҄xnሉ)gpGfWI~[SF)߈Y+ "cmyYu[l G䚈&]1x\|JAf|yl)]** `\F1if7LZʖTPq6$^ibi[vXZ@"lKUp`qꜷZ 2;֐jsC1`'Khpf:JA ,`_jtA,FN71r9Go27n+cK @ Ht7x lH'L7PG-TWmXg\w`-dmhlyg*'x O~9plɣzn8;X̠py݇G.y8ަg95m.`2Gvx. =^ lO|G/}8g+Jhoa(/o HL@5kYLb$0S!t$PdVSPp  RDPX{(\B5Jr! UpH,J #@%s^%[H$z(ٺbsTXt&ā Zhl/'8Ce ¾ڇE_[ȝX"@*SmEs8a#GyQ` }S64D!B< ,>6 @8TI5s̎N`k*)*J ]1cE6I&&\'8On<3J-BjU ;ɾnM*dEBp h|Ԡ]գ1 ӛ C4F8ՑQrBTqhɕоx8ͩNwӞ@ PJԢHMRԦ:5sʌjcԪ"  ը0TX?m jWQ tpu%eZ k\ډ-Aeaى3^iȒ`8@,IhKiNZMgcg"@BPH %-BG/K[2)URECpљڨzD{+Pe*$@ vFn%o3R$rӳDֳd 5T6ePm;Xъa1; JT<':% ue'N?4 x( 6҂ͩz.[oBKyy tU`2|a\^6$I[ q4`)6a-K ɎB34 eo@x(VÌVzVrg>L8F;ѐ'MJ[Ҙδ7N{ӠGM6Ѝf "@RzoEW:>rܥď׺أ: bBؾ鸡Zh}U OP ֲMnJ|w4˶Df@ԉms.˹t.~G 9-P^2I?'!u@sJ+/uB :m?Q…|8Xx ؀ȠF*iv[/|h\SҁfvM$}gF!m,Xiv 5n1(iHv'n<8ij#AiWEi&v 36qHXZ\؅^`b8dXfxhPgaj8V#knV8ֶmtH[ɒ|xY2TxT{t|W؈cTF`T[yTq8Xx؊uB5G_BS2nA8#T]\ LGsBLϸƸ5?4:7IQn1ZsnIXF6S'VZWވ5EG"4G2rFi GnQux5GwDhsHDeePXUH^0hJhIvc Y9dVsMW ِVFlL`b(&I5\bK4L;@FB7)5t41_3YBTGG 5.la]2-`YqRvc&"O0#9dL0Rf4r7s'Qv5XQ>ՖpF6yOw53(3*A-yWYtYٙ9YyI2yԚ:4q#+4u@cB.!"ƙ@I$ɜ)+d=cFy@&$0D.r.i@Y&O9Yyٟ7z?$?# ?JGc:]ǡ؃;<$z>sc=#Q$.Z;=3ѣ> 8ڣ>@B:DZFzHJAcL::9BQ::3h)W2+楙å&sffZ8Skz8>XLo iAuʦGyJ6Ko-ڧap'Z8Vxڨ:Z&hWک:Zzڪ:Zzګ:ZzȚʺڬ:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ;[{ ۰;[{۱ ";$[&{(*,۲.02;4[6{8:<۳>@B;D[F{HJ{ӴNPR;T[V{XZ\۵^`b;d[f{hjl۶npr;t[v{x+ y۷~;[a۸w6tYe۹U[;[{X$2V+|K{ AFMk P ɛۼΛRP;gTN{ŻFW  E@[;Ry A[K۴ Q;\m 콗[fLksg˾[ Zk2ǻp̽P;+4\6ܾf2+X>  F 뗽 *J̷I7M3ث U7bO{TRfS žkd ho|ƫN '- -ભp$O+ BN`nG}¾ 9f -1.==^a> .fdJC|-\&}NxZ~1~{Jb._^KhjF~לx.~+S[֌~u^s>ކ꺛ÖM}/@,3柼|i ϱ-ό꬞kk^ ,̮=™ϼk.Β~^ P{=~XӟmԌ ߋ,+Ǔn?,é  k Um >_[K~\ߊ&?&/l4:?`VN;(зL?oB9PN?ʑ?_??_X0Ȕ2]`ԊJ؟ڿ}d &sʟ_\CPj+/bOpUlH\Et6 X"TIArʅCxN(vq^y ̆О4. ".:ղ,JO;IVLXic/Sks[q; *FW1]`}|8.q3(-c :(3ٻ.cc-L@F@:tnM(IKsPE1fԸcG)zP&"āɁCPS"-[0ApD(:uUCPS?"9tKD _J99˞>_,U'i6iok2 y ,0;Ij"G˗1gּsg9!'؀`d1vk.Yq{km8v7]X۴m׀d;.why^v@5aD@ZjQH8WAKzrþ} <>"@Ln W)hBhz,n @ QI,#ЬpVm>^; )d~rF s xvу#*I.1X  @!D2L^TXdZ뭹C~2&茐:U޶GVm3շ449FYi5n֘ ÏFg!xٓ ayfX=]Q^E&!me!WVR(9Y1Wh!Dv|x6w2v P^{^: ?7y~o|qfO~啄YgIIZ`_w!yE(@)JX;r4wשEvs\vd>-"OdC4uN\_s]A>ov#6di%(>! ΑE)N3;XI*f(G$B1a 8D6 ph_hG#ͱf+Ya@:4 n!Ghe$%c:ל` ÝQ!s k:"Bq<Ǟ1/BdJY7{~e`VEaŔ0ȸ KGlZ|1T3KPHq-KjJM|69qҘ\ *Rj$(D=Ќ([37O + P?a.'V-! BC.KV"tr .Q1QR$4.z 舩oTU;4 `HU ~AGO4U.(P VSɬɄֳQ~QiӧaZ 'S0WX.3-K|؜0"ɀ%<{Mzb+agZL&DMjuʜe1U'VjONCyfkzRn@dKQ55L085A qz]̔1lXqO,G i%+H9w7c  8 0w#_,Xp/[-=?l{Rtj.VKYYlVoSXlK Ed^!itJE%#P`)p)zV)SKq{B>sU = pNTIj 3i{g9{q!a!UA ڽpg |&f3K-4dvUw(:'2bብHW)ZX,~p#4G)ia[x'(rS$W;MV@pJ4&ۤ-㓼'uMP1hUpv1Tȧok7`RUj\LvܼY{q--ћ*n@J-9Bh8OxOe!qq3[ꮘUqF@W7ʋ n օM!ȑVsSD 4ё>Ѥ/jӡ}LgBM`guo}Xv'yǞjowsFB֭%Ⱥ}y h *P?ys;GKo-A 7KwYZϞq{ݻOb~7|/w}Oշ}o~07џ~wϟ0Ư p!0%p)05pŮA>A0EpEQ0UpY]S0Hpimq0upy}0ppuP  <G d$k  0 pd%tvpZа {0I4`M̀ 9P 鞐 + 8M*ݲ0%q)-Pw0eqG2Q|EM&/ ygN:LC9&&*dr.1_00]x1 *iQQ_qFBT񟲯qP||mKCednA0"6k4d0vF RQ6Ex!qpQ""5C! RCJc?kEQ_fAr#?-bb.bF!8cZerOL%Ph˂2CEWxWT**2g@&)eR)A&p,-($%Z.Ə€K!)؀H- c.-Ӳ+'%ڲ&!eY >'(݄#'B0U lipI4 &AJ 1+Y5]5!p+}+ v6ns1P77i#ϲ(sgD0,-৒J.1A$1d1m<駞~2oЂP; 5޳463?s?O6#6%>G?At~'3 t7T#q G|8Z#nW3\r4C;[g\ˮ.^r_Nd3X 8SFKi`V1avj62`adsdIl0sItD@q $$ G>-@K(!EɒBU4'Ahˍq Ǭ̖2h͢jA7tEZQulk_uW 1pzVBrW` fh vG?! %Bfw Mt .mxޢRG|aKu+':O eaw ]rU xΛnbhRJZ2N X~f>1HW9=A8?X?7Q8sE]a8GPVςU8u8!YX}8Fpx88Xx8xɸ8xٸ8鸎8x9y 9y!9%y)-195y9=A9EyIMQ9UyY]a9eyimq9uyy}9yH9y9y9y9yɹ9yٹ9y鹞;9!, 4pH,Ȥrl:ШtJZئgzxL.ˍ n|N~U\ gc`ikY][K ͏U N\O[[q!@XM Ç#JHbPa#,!݅IEJ<YA$-:t`S'.Bjhg#OȴӧPJ:%́r 8**LLeRd)9ի#м@ΓF;$K߿ UhҀ-RUre"K8& ^ͺ {{2(hPrWCږDK2(c̥_УKN4Ƭ=Ky]dwŽlX{sܺ߯䳂.Wp߅\o[yZ 'Fg1s]8߅f} ^ 4\wZbQZq(4h.i&֏̎]HƤ `QuXfxuLhyIƈ;/dr-mExH_<22iQAh?z&ŊGā$d[ ^M3I2zDLM]F]|ok^8MnZ4)G#EOHˀ!#K zr1a[77LxXtUEz^3/îG[Ή^G~zWo=/2$1EALs1 #*4F8c^FvhvE7[L0Pj34( X#P$`2AHI)#B>5E(L,W.-CH6-h=3 H"HL&:PH*ZX̢.z` H2hLTG?$5Rn#) i%eFR'EIJfPX򓠌JnNY(Wʉ|Å3@xXʩe.Ii49ӎfb6d; ~HN&;PL*[Xβ.{˭^>:`N1$i SZu2ȳs-bDjad$>x6CFJ cX]dpдX44 G{:+V" CCf Yĥҳ{Ӳ{q~Ԩf5Dk`0*Yw!1"ٝچpBe[,iPu6(Mb2Лv G`՞6gONHIC;=AsX zbߙxw;Hɠ Lޅ Nq@ up a|ݸW5 'oKe~fluh*=Xp }]k8O:TDp>0 z7 Z+W< Ǟj%.A堣=CqB[y$OO;uP'o|NjPgs5"lv둏D | JwCd8SG ʾJHp7{f`EfQJu$v2dlzDDdJ@w\;vZE_5'>8$Z}mK#pҁb]OaD([);[!cwL;'M\e[ %]0'Fx[MA^((:(d A`aP[sq?zA)Ofci(Z'5?Ԃ6NA%×9؀ƃQr`JB2 6ƈfNNW zcgՇ!a'Vb|p& 4pPUcʧ:8=胔v>v2dBwW8Xxؘڸ؍8c!g%w>8kէqb@g$/&. (kv@Gf(bj{Rx2y&FX|jɘwwAĎ gY PAkSb_uNngeln#17fYJ`tDPr/ f P(1zCnBsN@s]&:riwo: \o#wi_h. p4pK{_Rq p [閴q ]f#/1GKIMɗWV!(>w̳?CƓfe#@AWu A1B]gMĦe)5јv:7$w=jɛ9Yyșʹٜ{ԩ/c)U8TD.o 1gfbf9gИFl`TVp՗UUIFPsk|m~~kWd2W:1>Qz,ySy#x胖YA(Y}B/T~Yvnu)aHۡ8^ƣ^70فc'|\ s |]ڦ}ڨڪڧmLT3K}jBl 헰W@0f %Z@ڬc0I ۨd֫yRs_ʸjQuL}2IB83Wٟuŝc83uShҽ Ԯ!s֝Y䄎y%/~g:(K3!%ʞV^0Kݑ#ǡ#>IIW`ueK;^T^V~Xf`#M淉dn 3S'Xso嚾鞞Y Σ>)A65rfZ+WB*gm^TtSi7uZH$7Z=y##K( T뢑fھ^S~=Q[NxmrU璨X:< @÷L`珎oȱOpmPI~*!usU^i\o(M+ #8ﰕoOp=Mey=BPW.FHTof`0^TVu[_uXR=Cs;ogn@u7Jr?tL0xOYyL88FNgN_o_F`Oo*[^>*lT3>u_wGn>R3 ~j>$Syl+]t#O?D.Vd6OU'LՏn딩S 食ڿ ~tO}n6yrUA&=1 sb;\(' 5QH(Q%*< 8Z*mzPo634iC)^0:9 ><&4.8;=?ACEGIKMOQSUWY[]_acegikmoitu7: .z{*$$t= vw9 03(™ݷLisZk< PP6"BCRv䉰@@naI6|@&\/aƔ9fM7qԹgO?=hQG&UiSOFRWfպkW_ s IUm[oƕ;W Իo_xqǑ'WysϡG>zuױg׾{w?|yѧW}{Ǘ?~}׿ P ,LPl!P ) 1P 9A QI,QLQYlaQiqQy R!,#LR%l'R)+R-/ S1,3LS5l7S9;S=? TA -CMTEmG!TI)K1TM9OA UQI-SQMUUYmWaUYi[qU]y_ Va-cMVemgVikVmo Wq-sMWumwWy{W}X .NXn!X)1X9AYI.QNYYnaYiqYy .zhJZ饙n駡&NiZ뭹k@ (jZo!mŁn 'iZ1{ :fӮII|6qEHaQ6 lV^`aXE;Zɀj!R6p{Bțܻ e"{Q~(&xݏ`jnW+J`(_V>e?x$ Xj@7>)u,; ɇX!@΁ЀT#AJPs,0ҥ`K(>V5 jpى"n1q!aZJ2҉ưy7*A Rxt.8#!JTEWh!9*ĂW9CI;G&ܷ @! A(6ySev E  ' R8$ K ;II$(LIq Ȥ+ 827F2 8.F! Ń"q!t!A#3"PJ s#Nѱ b!PЂtE!? o4` Tw#eA[΁LPw& 5C,Љ] vj,6`(3 s.i8 _LwS0JEDVFqlB!AGb#! 0s7kqd737r tɉ$q +(֓'yH!528 @BĆQKlB6!aAzx7@ M@SliW Nֳha4l=yQT.ozV(me+2,\V%+Cu"htgGvT$0yH`\V-tэΡ( F;X0 :4@Z 5pnȈQbQ^H1JZ"DI c% D+ ANBPijjSǔߪj%pr YQh6^z>&9aF\[f1wnC[kffsԵ^6p7(.9 /n3/X)C' 5As%) Ҟ`7-. }]>\e*b=nqmyMqGԉ*MLYW,d֚P]fǽm2AНtVB0kή[wޞonw r{= nlU$4_a ÂعM-i?zֲ߬ŊEˢ/rzNgJ̒οۮkD镪n2؆N(IϘޞ&S!ȋ*t 'm3A>A8ҜA)T'"B14C ! , pH,Ȥrl:ШtJZX&½Pp!S%J@@5Bn4eD@adihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f{@U驨JTD0P !%j뭸%aӂk.!zAjFRjI`7IܞidilO覫n0VLEˮk5@L(f@Pk DqnG̭X.Azw1\KpljUy[',35 a9@:DdTIA7PG-TWmXg\w`-dmhlva-nzmӑD|W]-x }'=>1ÖDCyb8"b%P@^ &PBPD.qyN -;15j4B=[%b# 2@oHi&~LJ,A!u/{?H7p CzzCzQ7("X|%؉ZTM!x2HvTюe4˃XkCE4,BVxI"mfbφP=((!QZ`q-$ÌL"r`'hÂgN$%GcPK0v'džjtpP3s8(xcÑa=Uks4 irFmYL(LK!#^U.svL9Ӣ@RVZ ;d.LoFͪh79mFG<2NdW Q0\ePB\?w[+ H'PzE2P :%fbXOESJwԦFi`vfnE1,ЯK% m.{%ˀp"<z]#p1ndj)*!sZ+;^ պȨH4ZvDX%h{4Z-ڄ^un p=DA-2ϓ* Jje?`M u"ΰ7{ GL(NW𬜌I2azEV4c32}Wy fh">R26"sy*;Eg[a3(G9+lb~L&\tbW3;*3!3k;܍AT&QK` e@Jaʤhͣ+<@+wX{*.M&6\KvKr~ߒ')|udygJvaz'C&fDjX^tcMA`_\t *=<A/n9\Q1[ @R[T7ZJL"UkS8kX\/an3xx{w8uU;M̶b3.R z<ȵ@z)[c'āȅ|r=c${.U\L\tzhFGqx˻x4򕵕h[dZdS.({]lߕ9@ԝ;񐏼'O[ϼ7{X9)/aX[6$qC=x^շ joΔޣNY<|$b@?tE|;B+juX=֧$m/+w_ŲDewyXo00pWmQs&tu[P!Y0S ؀edrGZA Z t'7xb4z/%fuA&#nӕ\RP;EX~۶6bЃl6su/x ]iuE8b<t#-2:12#3_ ~BXW(bLփP:R`EaGh^rM\k؇~8Xx؈heX6Uau8_Fdhee8RHX'0w(7HV^uLg2gӄ&xCǕ4{g}׉O@FJuf<&iu4=s s|!jowZ5VKnCA|7V6%rp,q"h%YF&fJ?l҆B{ m5YU4hvwE`B8ofxN}EEFxqZg\8D $D!XƒbwBqYF,ou,*ǓhtT1gL2@FiN>`L#tDwHEtkmXVGz&nP?:lgo3&qJj%7>:h<7 0NjG6ȫ:ZzȚʺڬ*m Ezb@}Pi*btح\ac AbYDڮ_ j)V;'i- F0La1 {Ez\ ۰g!C,۰.t۱ ";$[&{(*[HkEc3,NP 7s4h5+OKE2YFO)14薫0 ${lc1/T9n\N0FpcNeK촶brgƪnNaZR!! Dc84˷$0Dv1۸;[{+*Hdعdbr3B+HS'%k/ú@䨴K2;ɘEi-_idlǏ?T Hv$jռKJ8CQD1S62f\sb=jSuWM$wp4ۿ<\|!Օ] E׊70r 3z "<$\3]@w#W`.L95!ct8h%Ơ+9lLNPRl¸{ңXʆşU=\9i@d!c"u"i?l;Q0WPƅ[K<|~ǀȁ%*#qR%,ƺy^F q2xÎ ǂɠʢ<ʤpŰ= Î]``qz+˲g0e&;Ig02#;4}J#<̌Y\|C /+/,5ݨiLie#nES< c|3lDg@"iOJ^WUМ=ńws\~O j#02=ӭp<4p$^&~:*qW: LW>r4DY39NqP:^ |-2grDʍPR>}W j߫PE.+v$={tŔ](sj^m`:΃[F_N6J*F +? < `D`T̐ok` 13~Hypf4,ÀNlK.{g;躾^U "w4zGʅVuG-TĪx=P.v[ΗildUڞՌ{t ~_Q:$8Ov-ܽ S^Ȍ~솮3C/=>*^*!åZ˼lhΞ˷, Nͅc ݖ7n\*Zh O4:<“=B?D_3 nJLN?-!;lO_VX^`b?d_fhjlnpr?t_vxz|y}{_;DSABs3Àk<_1PhǞ|_3+8![1*8=IT?Iܔƨo>-XQ?ţoU2a ,Q#P&WR%я7nUيͅL2q*?ène PHx|>M1H*0\Y,.X ? X,*6ih+&.!#%')+-/13579;=?ACEG. (6¬Rdgi48<.8, `::˪mߜv{e]n0ą/;[`H)]P3d^ r=| Ab5D@9dI'QTe'SDP@`2!W"4Щ3-ljRNYD $DY./.DO;k .D/&8ש뺴JU╒?Hf\n!q=lJ$.ض ecǏ!G3ϧEà)#l10T>2J*U̐F8K3B`,$$JDD=/FŶ|,|3g!!TI)" %XZ4n-LGwSͮHBT2\}q c孑b<3>m#Au ^ٚKVTikqu0iX>SVHj(,6 VyUMe ~.3Zd%6V)b0o;7,8M7 (`,30햌qe[O0YmS38F5+J}F"Kݽ59ڂ._[+ ~6=;ɠlځB MXap&Bj&P@a&J  {M1vr%͛sƥpnGhF_$ sotc (ޒ`#^቟`W  )$H@sOG,*R0F77꯯qCz=gc:4oa"@/$@^A,0aAABh{!&xB-tPKP5 qtx`E4:IE)NUE-n]F1e4јF5mtG9ΑuG=}HA4!HE.t#!IIN%1IMn'AJQ4)QJUt+aKYΒ-qK]/La41Le.t3MiNմ5Mmn7Nq49љNut;OyΓ=O}?P5AP. uC!QNE1QnGAR%5IQR-uKaSΔ5MqS=OTE5QT.MuSUNUUUn]WVe5YњVmu[WΕu]W}_X5aX.uc!YNe1YngAZю5iQZծuka[Ζmq[o\5q\.us]Nյu]nw^񎗼5yћ^u{_Η}_B! `o׋UR ;Ym@on.r;&R>jʞf:VHjT@ui2znTFDjkP w(甪A N[lPP6/*4\z*`:ʪ~K~d-pfDvmĂ︫v̈́QZVl0CW'\hI+* !AUo֨]1ҝlr>yӅ##r Ħ =& ' زH'ݍ* \cw\9Haq8H) Jlp-tmx|߀.n'qU| kdBepVn.9+mޝhip=覫1t^J F{No:w./4{o@ q(>O~3: 9VPpO=>;zrJkd+TҀBA !`:zPSYN oŰ!0K-,b}c#Đ@^p [R:9`mD*`S@Gآ* , bX&qDO6FW3х#q9+8װ^% XYn4λN "WdЂ/,'߱",1 $AÅ$eEkQ1iOxHy!e@eihk)P h $`%3[h. 8IrL:vOef?:,*颖 :^ Jљ"-#1("T ND#ЊT&JĊ!!i)1)$0D>Mkbd :kP4e[lӪ+h^/*nD*ȘH(WTĢ Cґ99 J^uWV*.{a˜,55 blMmJ%i0{ͬ?H1dCΉW3RHuҋլl!*xV^5 _ĵriBbg\qI&wK?(lX\d,U s^ b´lJؽnl?.Ƹ3T|_oj{BWfŗ.ta(KgTE?]_`v1nvjr@6JM0VY0,FWC<+B^!|f$ Po|匁/3T^$Q֢]u_ؼy#@p~hZ{#.w"WJȎMu/,[&1e3)$[֟5羚EO*K/zռƼZZؤHggCd`^[=&_D>ĵZq\\$wxQ4E]1U`|~^,5FglvR~~Fv(`9]9Z=`c3's+07_WSbm&h`bnR(g:[:k#_%{H(wce}=FLl14XLigYO0hJe|\C\a6cV6v؉8XxhpGRx:%7h^NƀhH;c(\;8ы5<xuXU6l}wYC#4AF2MttWnDV(QtH1{UnA4GiRuE[T(4+ّ'GnBWI!>'>)ŒrQr3%s Io5=6S?gID7'EoYn9&2lQ7uTSupu\}[dRSFVeggtM$!o7Qvyxz|ٗ~9YyP0zQY7Jf yxG~0UZ l♇Xix!Y[X xGe2^`0`x7!i}灇{9Yyؙڹٝ♙=r9hjPWH 疹InnZm! zn `-/&BԆCvk%ԡ:W)|3(ڢ.02:4Z6z8:<ڣ_O>d$MeGZaTj!lHrXfǔץKff1"g֓LZhd 1od`Yv|_~$C, `8 8ޱV WhoR:Zzڪ6HऐwOUCO)bD`<jR}&5 eSΚO}ի }ժO3;1BHT[ l<$DP!Stk$׃@ta*80g4cTdl(K+th$ ;[{۱ T!xqA3!%܃6ʨ2;4[6{8:VcR!Щ`@CŤxD (k+=z#b @1b;d[f{hiK*CICrRPMR H6Vnv-{lj;[{QjraAH[dih,7s"0FۻǹWP)ie7{#e`c{{T{;TB5pPTJa=%Ma =v $X Uxۿ{[țL$؄UFu5zauVry0}dYV1#0|nE}@R}e%d%˺1¥3l5lWaCRaz$6$Ď̶V ,aHJLLPV@L@ȆmE~`&LgY`,=YzX¼S >hI䃾0v~MȊȌch *Jv벫`?#&W|.-%9[l@s~,)P ]uѸ˙(ECLʼ̜];*7IX![UHe꺈k|=_̴~*2ds6˺o0=-l`^^ =Kcд‚-Ȉ范޼x-מ٠EM[[ǻ`0Cbb}Qmv5WM+ f-bۻaҦbСb7p١ڽH̶Vy:5*sx 'Ǟ凪aK'C ElXb=d|hdXfzER˷q~xzQG|>^~舞芾>^~阞难~C[촴cꪾ7۳"D^$hp̣|*SK[qИȞkM"D'LA^LyovW+Or ;.QBZ-t.k=ս.-Л[r{\F>ecT\EH9|_!'3O\U<_ N9>֗$$l(·P]&pDruuKFo^?VO7!0c@W:zO?_YUe\\p5.̶ݔoX>a)~p/ش, D)bE? h^գ2TBIɪL˦Pʐʙ//1VFNm_[l.Gy<) ?}o*(Fv1*.!HF.#\y ! <,>@CEG6.0 RU 6.<Lo*[!4`qLQWS{O$t??.:RNҫ D=x#8P$5"T2# ³ѡ[뼡׫Cr$ǓyS`g0fd'ʼ$9P"+z`SOF:jU CH"Ffʜy=>TRISJȚm!Nn{X d'9V2CܥWA=tiӧep0NIB%i+ !=( j/PjDԡkRfGtVvoCuj~I+\!,XokRs׿| ,ǃlh$>t\ .@ 搐@X̙@YPCBsFd *qB #- @8(E<G" '5֘ H!J3.NXn!X)1X9AYI.QNYYnaYiqYy矁Z衉.裑NZ饙n駡Zꩩ꫱Z뭹[.N[n}@[{o,j0O\ʼn6I)182A}o#(@QO]գa]]Fq]3Yށ^O7gO^6桏^vy^큶z_KF`&_o?=_@4@. t!A N1A nAB%4 QB-t aCΐ5 qC=D!E4D%.MtE)NUE-n]F1e4јF5mtG9ΑuG=}HA4!HE.t#!IIN%1IMn'AJQ4)QJUt+aKYΒ-qK]/La41Le.t3MiNմ5Mmn7Nq49љNut;OyΓ=O}?P5AP. uC!QNE18GAR@IQR)uiJWX: 0{MU! bJ?h`QY H-4݃椙.okn^Sv4GES~ D`p9U h@rZ*,.V_% Agǟ5HUF7ه8 ,/ϒ^cIR7iCjgo:Z]6_i1rT?+ JLBs:mqR>psT4all[l3P+KK!fsfdLX/Q`p! E|4BP_2&Ng.Ap{ߦ(x9 f "|2Qć 'yLH\6(&)ߛŻ0Ga2;jt`` rYXD+Lk-̢,R˒XL3ɱXQ&+V"PNH}i,k' MlY-&hB3JJ7&HwhJ}tij5 J bW~(h >TZG]lof'9lgoڽv !, pH,Ȥrl:ШtJZXgzxL.ˍ n|N~Mge`ikO B_[Sf~]É N[O[ۇ]\P0òj*\ȰÇwc ;#h;'*VqK„ { ˢJ5 Jѣ$StTb".TB$M4H.$p޽HʝK]JA v ](kۓʽdvQ`]X˘3k9S^FHEÅŖ>2tb}^ GaK9vͻ|^DxȧS/f$a1lZuWu'閣zt"{ϿwbmzĜB7߄!YfZaAeIz&^s!UD}_Ga6mNpO- pjwP]s5~vwKg9iqi1I1r;nz/бoo"tE?tIu <w/Q|2!`zxL(+dY0؀č)zDtpxӞL?ZPVVp 0O,k#I$YJL GJ2tL!-[B#d&Pr2$,h|t44s@&$[V1I -BYIԎ-v`IO-_=0_Xw- IcL=T@L2f0qT3/; >l2HK1.([-)8sd ׀a:uДTl #'Ɣ|ozj:=N &OJ. ^×"HRjNH[q|(Uת/Hs"!21ɛL=UfCYɅkRebqosZ jKf@_MGQB%K[J?lm! \(uAm*='2P!TYMr:ЍtKZͮvz ib%̖4x ڮ VyqۥoF[,io_L \ ={`ʮi` 9vgBEz19νt3RxnRc$NuZ.ŋ>4|H J7ZUֶN`Ӌ; Bl ^z-=g`'}(O!S p?z&bvssyr χI}{r4Ws("\5ax؁ "8$X&x(*GA^".#618h,(p_cf, 5(p oT4҃@/,pG'M%Eגa3gaBcFTZb3c8l6fZTdofHgh}25C k:2Fk6VM#fqe}!n8o(CN;{򆅍$–g{gdPȉEg- FG. ɁHPf3Rn2Kc[l;Raldbg:jtD66Q夀Sv:j+eB)y}jk-%36ɨ<VY2f}G%XyF g7XpeF{zڪ:Y.8~x׫T$G?gtzȚʺڬ˚A`3d󕫌YdG!Z Gd0F˜v`zگ =!O G: 8O:kM:IFf/zxd  bWEqWQq*,۲.0;t7$H65KXc@|o /w$"«NPR;xzyW?i:ˮ3G0Nrh5'`If smbJa;Xr8( *d]D,0g$+j^ uJH[{eg]ki:{ųOK÷ƴ:S|D;$OPqF7-4itLgH+iqr5F3'ctLM;ͪp8kmK%4׻cgN#꺣+`N{j,(#uv|ʳ`Z0IQPcć>K"<$\&NHD!oj@3P Eϑ0h;,4N'`EuFFxVP$K? HIQĀxxd\f|˹Q3pnL?Hyk|[|-ݧARvC4|j b~#MP4Ș~; ϻPޜ4\2+eq4uσζ?`~9-O[jlmk${]`J7 wLYB@3%ӽ~UіR |Zvæ@ M':O_Bkmڰۘ+v46{ۣ=5R΅ՎWmŶnOmB܎}ՐLËKМH `]c =(ab(=]jk->^gG*~ ">$^&~(*,.02>4N*#[5N!>#P{#;r -Ƭ]F* LҒ/۴@^!9ED^!jl9=MJ pS.Z\~{F?FW @B V/q}蘞VVqJ/4=츱 oHt;PRUƍ1Wr ']+(\ҷ=>[_Jv v˳!&1;c챻kD;$w4L^pL%[Xt \tc%J _% %ܫ3M_/%觑hսh=]NlogTfGKEmx.%ЅϜ@l4oL vQIJ^l H<-mwEwZ?wL"9ŒNq_Ye8zG 7v^!|JC{d@Ǵ!}hTԛNȕ r uoW< ϫǝ/;8酟dgnix"ySzQ̾٪. ^Ȭgq,ߋc?赿WN|?b@ʿ΋ϐȹIepq,EV=. *4< e\q^y .. &>8;==.̆4DU*ؤN$6cGKqS,zW(x,0l{EI:j "UO3>;@,G<( B )* Sհjh4JLY@C 6R!HUöh$# D`J$-Hȡ[F:jUWfӀ# 3O?>eu 4:V \8q9&9 8n:iʦZnyPd=)4l53%Yi##ѥA'(Gڴ) <8R2ZG>zu9Ү=YJVtPX#Pw۵RH,K Qfs>0Ȣ͈ZI){ `O о:"O8p#*G$ 0ԐC$bLpF(t' R!,#Įǒ&R)+˪/ S1ɜ-27S9D S? TA -CMTEmG!TI)K1TM9OA UQI-SQMUUYmWaUYi[qU]y_ Va-cMVemgVikVmo Wq-s $wWyw1 $p-X] {NXnFia)&9AF֨I.Q.uIRna9qι矁Z^=裑NZZV駡V꫱ΚSw[tàn[[\ /O\o!\)9֮.LDC"ۼCoamlz]=Qsp5g?#X@P^J O9Nh`=/|wꓨנj?$2$o [ €xXJ=l w> ñ`"eH+6A=CD PTΈCkA xB#`Qw|!@Q|(OF``q<##}8NTz!!NDΈ!$h/`Yc#It#D%$q<8JV$=э$MqЌ(_ 9. PP#d-\IYP4^{1`Rb)K&A 68A *=gH%2Y` IqRR8$q d#rr&…"<\6Qr˃14܅2)|J7+٥J@ &@+*!ωt+r< Z&{t{tKaJi"kMM%DqT(~ҝ &$2?}1Hs+[P:T3՛Hx9EA5I8AC*KZ}!fG9SΕLUu#jQ @iL7^,Z-#" )H Á::@ZtiCl'z!kaUk'Oƅգ! +PEw], ^kPx vHP3bЎ7\ |ώV(^l;6QN%-w]%Ϝ5yΔܜ=ϩRGrE7ёt/MwӡuOUձuo]ve7ўvmwwϝuw}x7x/w!yO1yoAzя7Qzկwa{Ϟq{|7|/w}Oշ}o~7џ~wϟ0p 0p!0%p)-105p9=A0EpIMQ0UpY]a0epimq0upy}0p0 PR 0 B 0 p PP0 Ő O  00 ՐeG E&SS pX`EdB^e_g㺂e.P 1R`X  :I2`r1=Z=q EG]W8 f"\" -xI`RN`q& Ec0c& qn `x,@F 2RQˎ-I& eeCv)ٱ 2RN""168K# ##? C=$MR:,cBƅj:`#9'{#PR22*"Oc )uz&'u#r'"" \R* R*2 Ӓr} $cj'+BSr 2R0S%s+6Gm22p2U`5Ya.lf'214}_ 2`"l*5@gx3}74}59ː:;P;;2<'!, pH,Ȥrl:ШtJZX&½ УKUu_|ӫGU̮ n~] ̵~1zh"!F{Q'a^UWY$V6$hj4'g@@`$'J` (#8؋OG!qL6dHnF24…e$$9FDeV$bOp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠Z˚j* h#Flej(v檼)V1:%w8W&{IdRXY0Cܮ,PF+G[yI.xiA]ˢ>I%3Z9Fks"j%8UMt.TYkE<1N)A|rHȆ G _{PoPMƏ&4^ć/jKR{"B1?9{4b0m:!&j8NjC,}՛]{d! !H"6 QbMϢ'Ó|P!A,J0X08PHLbFqBG63(^L 5g/*J]X[h$`7T6pH:x̣> IBL"Ym+JG sFZ!2!I[.IJ@LE 9(yPڅd),!¥tɎYd!;9 YHC*e<kYhhR)]ʙ̞3$J脣mn6ԄFi,!J>٨7FAE]3sI,#DɆDAzLp@#^{H Vo㻹-9 HgjB.4%M*^#m!i_CAԪ ܦ?w*aQ =Qy kU*6"(08'p#6 яHD G2LJ؃ '.LbzDh́j-f7z hGKҚMjWֺlgK[UFl8M-nqہŐM~-r{c-qoYVz@&N /Z^| D_Ug%FN$j]\HcrŁ':YTƲSM^Dh ^w=l A7Nnng? KP3{TG&OL]湏6!w=8G@G2;'g4 /:/[r `nw-U `Łg2y*>;::Wc(?-T__3aɏc r\hKӎj6%j v` qaKJ;X  ?bB _jE_'̫6bG0~6R0foevMzη~GNMA'JgtpQÙL9xϹB+"WT0 +%T3ȗG&gP|*tsIY%Ч#ƚ%pi&Ns/r1h@$d;.P:3OdF|r|ОM`g'o?'_\ `}RSN<*+?j#Kл> yL!**Wn xםvfA=1k8RufR字OOOodZ#2_ 0p -aC 80 (4`p$x ~T*H`+R0X|p>Eg:t@<@Xv3B aWAxW3QdENPR8TXVxXZ\؅^`b=G 0H(#M0?@086iv8 7{hw5R6f/ `+:$xhE-3/C 3˶8Xx؋g׆p7g8~U:.81Ȍ{CP H׈~!7x~EFc>%(}Ӂ8~M"x%(~@ȳ8P#(}imgX.A z=> Iyh␊?86J0 0#Y @,ْ.0294Y6y8:<ٓs3_,%4,e`7R0s!7NqaʡTWy`ӕ3+C$!V6qCߠ0cy8 ei q)wBzo<6 ]Ug`@C YujoȘFB&B#Aqfx6ȄYyٚ9Jj]ry 5]ٛ`( ?{~yșʹٜ"fRrzx2q4'{[|1kv}0×ĩٟuJT2w3y9`4| Z,dgw[Jll0@*\ŀe0֘ *,ڢ.0,S /O0v]0we`uƛ@**i d01PR:T3Hh)K X'^"F\an@ ӣ^k3un?3pZ B`EFF RbgM7ǴsFSe@W:Zzp7P0Icp>0 1 5ƣB2m3a`Q2D/#L_5 AO\IQ] YTө˶Q& `#2h٥cgwf *9ru; U|6{gDpE?y:=x^x 磢ڻܛ$ᥕ|g0k?Zi{{ suԊ\yCڼ >P{ ;aw멺k>H߱ຝ P+Q K(:v \6|85HZ̻p>vCPkB"FkpkD` &W7Ke@;fk\ h;ܵ<VψO#pr"fk.Ĝ5KgRbx:2C!mW|6=4/ k\̫8Ll7.#-,=W@3'ÕZ0ɶ|Q7Ǵ\˶LӉ,zÛ*l\q8X 3@R}eȦfPF ŗW;F`paܸe(%`R ^[YA :夷|=l} ,*w=]M*p "=$]&}(*,.02=4]6}8:<] WKk`D}H-/a#X̀^@]p-9ܵ/C/jI}h$lԧSB)Tѣjiڑ[RR&fք]@<]pEն⯇պa m)gtO:؆ٞmSu{_kR#Lws@a셊Rzf9j|NT=џ P2ڜumja6X-˳Z9̸J$ޫ:ݺ5fo+S  bi82C{歌<۝:ݽo.ۑ9g1Q5k{;)0ΰ 4՗m <;>n#c:N0/ ՞Dv]9K GhlRwek޷; U x~=!fИ`(&+^fJ躾݌f~t=;Мzv=Ŏg k`X禬<=R܇i6"4ɾ^ؽ>^0r/K~yh p1v0햓yܧOx?N=@^.J2g`Ⱦ3|>C,:2`"?P.*LDT 4l>m.TݣA)4-q@J.Lor>IOx`,` C,3Ē^/+WV{QrkJ>3K9n!lMU9bȫȪW,W \2e"g Pp{%OfNs6dبM;ڪ'gu}Λ'Q 3A\l}?o#`ɏP}OTd\͍eC _/X4It>QZ^Y(c@h,\6vq^y $*.,>!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}BC&TaCt1fԸ#5 h@G'QTBXƔ9fM./dgO? paPG&UK1KF:&.$kW<d:lY .pm[oץn]wɝo_m!؀p'VXӂB[dpIX'qC,SEmG(M9p6+}NL  o CPZ%4U62-p@C%Gl W)ATQy$BB*p`KT T8NW&,Ȃ (`]5Q7{U!(h$DžwW^%ES,ES|5I~s\ @?<" vװ&PaC~M XG< &<.b-0AGb`xD4vuBTN!*hVb{ۥf-`g'[l9LtY}դmS+! 笄[f#* @@oN ) $q! N+_+rqh-©?o#@0)ϼǮqp]3đFO}G:gވUT V}_z9y^6d{h=xA[ O}דO$y)Z:/T|OjA&0򵎖_*+ןxԣ˖⧋ KEs>>>3?s???4@t@ @ @4AtAAA!4B%tB)B-B14C5tC9C=CA4DEtDIDMDQ4EUtEYE]Ea4FetFiFmFq4GutGyG}G4HtHHH4ItIII4JtJJJ4KtKKK4LtLɴLLg4tMCДHtMM4NtN9Mϳ$3 cM_telH1O3T8M"$0^"QKQԞԴ7/o &&n:N=57r n!"BrXB[*9+1Q%`D¸ @gapKӨS!$.Ao؂[7ڛ:}Q P;tI4zУK\k ..opo=p/B ]mϿpa?6g|f[v5 dn_s($h"!UyܠGF{WAJ,z0I}(ƀwDioeI$Fp?q}c ")di&*Gh[$@PaLM^7ޙsW/jv[<v梌6mU ',כfhŕKhzUҸ&ũQ{U"Gl 魸檫<`00"頍詗d-ȓT AEKB*k覫+k,l' 7G,Wl 1wE$lr;"kH"{&3Ǽ83+4φ^6+I(&5ۼL7  s+-T\wԈ3taMz,t^mU@XUPT嬦j%uxG.)g71rDhJxNF=;}I -ezr\0v?NueXMQ\kDټ o{P!:IUg9oKA^M_~ғS3qF#v%0G}U(7Q֔0?WOtRT@tL ە @D"0UW'P Hrڊ1PFBMܴC} &Z&"z` H2hL6pH:x̣> GHaQL$3ZIJa( I/(Gi<*hPd|th!Eˈ<˖GR֝H;$cf[30uUy )aVW’g@ Cgӝ\g'AobT;\MO$'yΐPL(,M)GMIe%QW KaslwTHIˡb'gC|RFg8! ZBkAڐ'ϐ}DR5 OW%` H'Tj%VVժU$xĠ@.xc;pjKjBqC%`5}cV!P}܊:eUO)vR*VURR&Z@05̔(kb/5[/ZֶЧŶMr:ЍtKZͮvz x˾5f\N~1x7N1ږ v\aNr-$_n [p+lkї;PԧN[XϺַ{`-\mh@ èYQL 5~ݠ^*\M#b'I, $'qY<_Fذ7o)L B̋jaȁ#y7]O{jxΊ|wOO;5A6|O>cJU߾0O&`e(Y_? KO>.w7]<Xiq$'w2S%-FrH/y~ 䧀rpB <'?3Dt {*}ҤlU3<؃>@B8DXFxHJL؄N][HoR4{Oz0)@"W{AE`J4"mM熵glSsGGg&Aguxfk'5zAB(TSӄ* @&-;KWV艂')H3@Yٲ hy+*P,؋8Xxg'`6 tPspb؍8XxX46Oi$8> D_jU2˦QYCSf`LU pk PaYr9YyIuJI{ 끝XZ5Q &F[v{xkH"8`J,Q$QkXe@z{o˳Rйe9;Yà? ki[%$c*(뢯0*3}8(*~ZU;2#Q+e67k6>˟ۆG;J{Ű~˷^෽j5*ṚTv [բE 2k2amCIjg{&ml% L\{8:L`,;@Bci %FJʤ\Ƭֲ": V> ]`l|RJGj$)0K{yj2bY #ܠ*᧹%aY [ ?Ŷ =M =L G:QsŝʜTM aINlԩkNv4ҿҽ}I7ݞ$bPy3FZE-զҸB}9V\]]q"!3m&HQP$/:gldkmO0׀x ][!A9\Rq*fCd]}٘ݖ_mȑ)jw2շ^T̆Q# n,\ \V<2><_( ^`- ڂ /dPBМ7ƢK."(\$\bm5|2?7l4:O8=@K8BJH9wR?T_VXZvo)\/v'avwZgx^Rlv_Wrv#]s)]|u\ׁuxt,؂ @ىu52_?z e>o\B/IU\7iHcIxt[ *?Q2;^؏Ƕ3xɥ!i X?_Ưe.êɐȑɯ YXx|/X4It>Qz$ΐpd٭鴘S \ LΥZ2.+-/13579;=?ACEGIKMO$X=؆\;jbf)4 " ܖ+.8 &szѬ-ΐx}5 $+"=ڥޘ_=`p@؁"̚::p( 8AT1fԸcGAR#^B-yJ yY42C}A'h2Ar>+JhQ4kތiϟCe&tCVCd@Q-UsJIx O)~19ӳa-p`EHǏ!G%1IMn'AJQ4)QJUt+aKYΒ-(flNPh.#`P6&.%~™'2pOHGECb4&w[K @-staYkmoJNULQ"jv(v)ifae٪FlX}+2`^tTrx8!-뉉+Ri Fü^#uk7N;:g9:2ga+.M ET!;q}qR1a0η=Hş~rp~ϟ0p Гt mi|mO^煛¤ . anC!"/DaŔg PxMd$L0m00#w@ jA䋒0-rV;tGtG`G`0? EBx 0n< @5@IG @<* q0$ Q%2fPP *!yƠʨb< *rIm^$ 3Kj2ϤHImZDm3=hز6HS(d# u vYC3h335Ml6l: s:G$IrLnS4Ʉ-aP9DSs, =±ro|0iG `|s ʱ?#%1#óʚ!Sߌ:!U, ;b!U*.t7jՔ%=,ˡ '2l`D+O<`T A`B}@l'Em51"4JEAH"_p_4_bp GD HbT p bMF\jN>;?q[@. THD@=-APJ530Tf&@rQմ7KLNnLߍgqu ެE#qGOnRUgSG5xS0Su5KVH5Vy,5N&TX7J4n%5s'r05uFRr*mhRL+p!MFR0[R  a5-/y@/Z7.sTYQŐwUjlZnAܾnŽN ϮSL.qo[ Gcegt H$"tB{6gw4jUw!TMfs-%-4%4zd\pba4(b56`RJر4ffUCT tLjm15mqCnb`B eKH r$7JH*Tom'7tkMWOtYoWueWcwvup;3xwxxx7ywyyy7zwzzz7{w{{{7|w|ɷ||7}w}ٷ}}7~w~~~7w8x 8x!8%x)-185x9=A8ExIMQ8UxY]a8eximq8uxy}8x8x8x8x8xɸ8xٸ8x鸎8x9y 9y!9%y)-195y9=A9EyIMQ9UyY]a9eyi@yw/ }gV+()""kg)SyA 9*1Y+ٹYțݹ홐ml|  8 -:A=8*:MQ:UzY]a:ezimq:uzy}:z:z:z:z:zɺ:zٺ:z麮:z;{ ;{!;%{)-1;5{9=A;E{IMQ;U{Y]a;e{imq;u{y}aZ {;{I ;;{ 8{[`J㊌}C[ 2@h[: W#/ 3hDh f jCPNLhǷ7~u+_[\"}ąGbS |~D "P ;|< |ɍxD7|WCǵE|ĉLj5M|"Ӹ@`1-|λ||<G<g|ۓ@UG|>G&˻'+ӉX9k$!}[=_c3=ٽwU`~IBDx]Gη<{| ּzTs:u7UY[{́{}I(>Tiއ߭݇߻,??c[ ۍ^`ߡ?#T. ʣc`0=p]I{gNf`b@ʼnPw$|&d>'5<ƙ W=\;ɵx%7"1jɗ? w:!, pH,Ȥrl:ШtJZX&½U&@"$LL( &c˚T:F۷pʝkjv9=KL `&DlQ]̸ǐ(1P@6\,Ѥp̛\װc˞҅FM? [ЈV<h+_μsPeʲ`x`6١L|ӫ_@1+T!QH{&1etŐ}NdvCdj} j "k1,g\@{ A4;$a=AS^[.&L6PF)TViXf\v`)dihlp)tix|đZx~jLc('X)5$V(XM@?>i4Z="|jFjꬴC RH7QY؎5 :i;ʔ]`Q@γOv捍z@FDRbEYq>lh`A/$I y_ZZ']V@ƽ:Sl^_~ P 첕J%X#ƃ*_@~W&w/'tΆ &t7bRRpҚ\aKmh @HTC5]:Uqtwg¥gnz@@qmx[;[*%=weTF#76"wy@8YAVgN7Dd`ө G/}ShP{{t/soYbGAF`E_o?Lb:']wfO0uH ^du Z̠7z GH(L W0 gHyB,wiEYH +ZCi,-C 4emQM".0eo0ۮ,P=(1Z |CP>5Qm#Q"_F?'D$/7IHxR絧H)B&IU!xW"N-IJI2^_ڱTl,Qb. nD%W0xGTa5HK&. 8„0a&'s(`s| KWGPgҐ)H+"h~~<R9PU{*a!` ␇@HDFGВr+lBbFvHG`.xr&Ƥ8ͩNwӞ@ PJԢHMRԦ:PTJժZUPpծCFhղPeM3Y:€A, ca\?8a%Gs֋T@z lu WBF/` KY}ͬSǀA@- ִ/ F* V KF5;ͭnw pKMr:;mjbI1z@eJJyK^&eF|-z]#@\|Y^r]@O6Y< 0樎YiiΕ%x~L {1+Kj%e;ZW0gL8αw@²!!٪2|ws ЪƸ lo& \+9r~/YCBI3j+('#p+Dkk+.da 85T=67HAB& y\Ěq ·NHOҗ;Pԧ&89\k݁GhOpEƩ.D u h)*šWUa{?7GT˥zنg3tdf7{G<}izَ\|W[)!XgCMuuI%Skm>ЏO[]㴜u|? 5=e{ T;~Q۬ry-a_Ͽgw#Jwvlx1#TM@Pm ,o-2@ V x,@ fЁ/&#("xg7wRG#S`"(S@B8DXlvqAae)r,FT0r|R߄u/wEi p뒅ⅿ/y0TH0AB{TlQ>/h/v22Z9?@hyOpU*4RFx|+(OۗcXWgBFq1ޱ'xP $@r18g~{q.wx^PaqPWoJRO<8Xg7wӑz "{;B8a9C;8+$G84}Ӱ7nH&A@ƨ584cxr\7gW#xQpX4yx(*yH"А R2!afT<ӏkpy8c8g&A9s[.)-:9>a|c~f0f1h X 8!?fyhגbd}oJ 0x78;@pD@y:ڳӓJ|&9ͨ{>>'G@@ xL"t8YǖRT އ^?DgxGN9>zft!9jv4ud4NK䛬ٝ) YOw{˧SX)>)Sr'ia Yٖ`_T٠Yi$)|bDef8<춞&Q9x5gȓ^ )z.jƩ3C!zVRƠdpOk9H7}ڤNiz0hOU*:@@gz9Շ/X>ю 4G>0^2a}+! ?Ȉ >3Q| @â!i/s*pahPz,6FQ]v TmuJ-+'-Z(.H}ٞ o 4GɊň)EV 0/U#,/^އRPp4vd$ڭz7:Zzݙ<ڮ؆zb),<ʯ;[{ ۰;[{۱ Dxu%D)Z(,vsW,~!8=-F/xwu7w )Fԑg-L*!0~A3{q3j,XD'=k?* xPEBMp(ZYyZ[FIx>hlQFHn0 v+og-a- )9(Rd 8,#,Sj/g.󺾻J{4{`; xڥmX5ph>) /؛2/rZ){\Z+nx2 q2&HHK! xHN ϛ_Z rD "r㷥Ǎ3Rأuhڃk˕xԂ¦ɌW2ƒMBJ,QHadDS<鏁Ij1;̉")ZÐw:jX ?'C`bd*R"nb*zʧ,vZs<}f e3ȿ"3zja'_ڎݻo+{]ҫ" Ԫ 4̲ʹ{y-rĊ\k(5+n0QP tލjF>:ݤ,}'9P z^Tw EdeaNe^bYV& nb">!&^bw!h0a61O6.a jl<^&-F~HJLNPR>T^x`u<{`vg _L / hBwMwSPmnZ3i{$A6C{~  @y0eD gޤR*Q#rG\ܟje6sf }+tɃ~,߇"~𴵠^ g]W^{B~IZO1=K \ƝxP|qaÁ S<ބ6"ʎouLϽ]Х۹{)^En]*{ ܅"/ k(0ﻓMxy#|HBn.$_hXgU ,@eܷFhR/]'H-gJ=,Nt_-~ 'Aǂi:<ԍ'Ag^mhT=iQZ^Y-RI6.B2vq Ps/2" 8. ,$  6"..0Ì+(z}d6ݪ?P25u ca*/ϭǻ8](:LH*V.d WB$իC;E0fԸcGA4jl&[6kpL"ܼeAt1/pҝ8^RSmt$}EB WJ1д|JV*Y ЏHVlӑc>&1JY&|"#l|;8PA붓2f Hl v  QT%3I )$7@GRRQZpGō{ _ hI8elThʸLaГ)", @JdcXٜO4Nm0zX\N_m1ɂp9͡KC Z7T*3avKdo{u.vΧ1P:5q̈́Gȭ.It+W֔@:D"86 CR8aG٥6ڣos֞% vBd s)K c MZ鎁d!2񐑜 Q鬎d)ON'*o]f1e6ќf5mvg9X@ ]+{ F3,9?c*&a(6N hfL6 .aAQ듘;]5y %Ÿn}/݆¶p-PTrpu/dbEbZ;nJA\Ij]!f;SXgG-h; l9T ~f0q\p VM=gwH%Vour?0ؽ2؟B[,ZC;Gkp0ۤ .q8fwy{S/VWƠJ!BC|Dec5P7~w~7NӲ~7w~8xNw  8!8%x)-185x9=A8ExIMQ8UxY]a8eximq8uxy}8x8x8x8x8xɸ8xٸ8x鸎8x9y 9y!9%y)-195y9=A9EyIMQ9UyY]a9eyimq9uyy}9y9y9y9y9yɹ9yٹ9y鹞9y:z :z!:%z)-1:5z9=A:EzIMQ:S`Y]YN`iOB uzy}SښaZmڦq:ڧz]z:90:o:^Fb5!_S,u:zzݺ88Rz:y`X R{Y"BOvI7[A{u#[&𲩄@\gziUV \ ߢ7]b z~cZϺAYz\.x,2{[:k[9T;(J ۳㻱[X 1T;{ kѬ;Rٻ)\-SO[] 055ij[IĝÛ\`d²ӵ:3eGGXWZěP;]Q4i'Si\廙] WY ImHt%||z<\<k{| } =!, pH,Ȥrl:ШtJZXgzxL.ˍ n|N~Mgd`ikN i][R[Ǵc~]ߌN\O[[ʺvx]A#JH;qYpAp,A]AD =wBbIrK ĹC 43'-]\ʴӧP֊Ktɺ T 5 LiSh^mI,ͭ>uʷ߿G%f El85[Uc*1$I_On-qg) MӨ;* xgƌy[42%[ Q+_μ! .p\a w~Vҫx^c˟O~DP޶wWodWqF(& V~'`e q- yV,xlB]kbjmNtb\%L6y< }R%5cnmםL[ԅV$tKl~QKBixٔO\)##_rf`h !y0hU AYViCu駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+m3_T⊶~1BHp\%f'k9MBJ" c̬# bkۅ°9ҰZ4f%7A[,zwȡHR2F3--4/gƋ o?D 9W>z92bCgE  @wuʼnNhX?7p5_kHa`9qm3^]udL"NQ K2笷h(TE$}vG6X.s#U{s8SCͻ+yug}i50T ZAydRu $ΙiooPwJc)@P"d0 CR99'H Z̠7z GH(L W0 gHkvw D:sDLئKKu1$-S̢ERHܢǸjhL&pO&x㊖>~`IHjY< ("  i!X$G ~̤&7Nz (GIRL*WV򕰌,gIZN:nK c&{IL.^(2 Duadvm̦gh#HScGte 0IOH Ũ> s ~tZJqІBGJъZͨF7юz HGJҒ(MJWҖv,V ϑCAϓ"Q"đAPcF,PjA͉ecTcTq8lT|6^ WzYf= l J׿f0BW5[%Jئ` ؉D"KYT |m@FGJ"MjWֺlgKͭnwV)GA beCFr ĐB2C2gfb /;)D{ΝxڗPy;^Wif QIҊ0&;PGj9-],: g%S:U[)ؿ)"ؗ\8αw@L"HNh~y!H3CG*wKo#lZ`L2hNF| *1aκ1uC'SVPuf77@9$G'| ^\/Ҙδ7N{ӘJf7bU6jHCL@kfE kf11f,, f;ЎMXD1DRqx ے c [{V6G},'gHTfWη~5}̴dP4kMGHspk4? ;ΈA!9Gb,kzlѣWԤr:neЇN_xta.X (CY\Py8W&.M@XO>pL_{2U@yeN|M{d %W4@خ'=ّ{}x w~gФ T_Ӡ̲dô&Ngu">4*?f֎&À.Ȍ\jl8"_̾mOqP5x~iFoUg]@nO6}1:N V@( ($W|Oxa@T'sv<66GiO~0284J//G;aZBZX|dSme:!gkA;(ᄹfV_"'kxzv9QЄU:5l؆nt7m c" ~J`th!hP(FhV'&K~ч~2È~x&2&Gn#brO?$Ȁ8'X9QP8^o؊lqnuLd$ge`|((hf lAB|[a`x8G:D8(:!j8Xl&uV":(`LHxWQȈh ȈTX;xk h~g Ba!xȸG5W*)4Y$&)h8vb2Í8?c9TYnHzL'}ޱ@^I5}oHqlS>Z&y @"ॖŗ&k&f '؏vwYNkyh&FU¶ WXH{m8k3x#VfO"^p:/R)%v))… ?Cq"gɒ a)S07 hp=mf%ei9 D29Yoo繞ٞL9YyE :Tfe\ ڠ:Zzڡ ":$Z&z(~i斢d`o0:4imᰊH.'"0|(eX}Vhk}R&5RJfːb?J?Y/z;K*06l{Ijv1zZNoP:tZUvmx ZJPTml 6vڨ xɣGq>qׁY"hQqp2wqڌK:~rZ)r7Gas+y2,{rɨ:^GOigKPy&ǀh qGy%?ĸjx9qÅ-_{wP#wE"x;1֮hw6W3WhBwJ).yyyӬ;ƈp!ߓY(2hrz9Gw|${4%|wLjW~{6 ZkZƕއȳ; &B~P^7zX 6$I 9C, ;1+ص/h[fD ?;sTn覂%Q;ڕcfAH-z(}yd [yPʸ a0Vrf؃+[z `0ƈa뱹x+}ț: ȀȹcHg牓@#_I4ekNd1gc0[bʛaAquGh;:-x8/ɾ<0A} 6c0,aȌCAy6ApY JbBZuA@KIL37' Fvt_xiTii z|} <|rೱY*!C,_{ǼF|%ݚ$ƌ<Ŭ5i@FyIs [$9Mgɜi1x|ϙy ]nyĊ m`JV} =/6LҵS%&][E&ҹ;0[2=Ӷ6}[|7ӳuW@][5A}F[u\I]Y5j%ԕ5ZtR}XZ\^`b=d]fdL8q@ehkM xMmf8Hgr̐cpp6@.{-ΰ؏B)ÐVψ|}ojyTlj&sUvɖnm`Y U(&\Vwֱّٞzge*GPF{p 3m*ލt?\pɭ-rsj4"W}(=rګ,ـCZrk५es5c޸w =ލ8R7O:w &H0s:xo7Z^.Έxb1֓LWwE%GN>XY?zzKzRç,{{`Ż$++-|8L^^`ГۡK}=-ʐY#9h(~gN䂞Wju>w}% ȵe+Qf@̀X@JŜ.6(-vb{c{^8f;Hn  N ϼ/IYKº 2^[|..9ٶsX76·x_>׆Hvk{h_khB;_>\Gn%L ޹b. iLi#b^y:Ϛ>Ϛ:6y]iaTErn+OPƸa|hKIa<`S_DZKx_Y'2P,Мȋ81wyYgl˲q9Ӱ9dˎ '2ͳ?˷p&2}y|*ܜgcTg ȐIZ:S4It>QZ^Y~a\6Pq^y2.$ !#% &4,&9;=?ACEGIKM $*.,Nacegikmoqsuwy{}IXY .'^Iۊ΍܋DNJ"<@P`8c, gdId.(WQ`)5$yP ML2@“q0\ɲGW5dUWJdJn$'|yUW†4 >x+5]G*2:#N!+V++@0O/: >#hC"C?d ,lj`(pjΈV<>䇃)2=#+N MsU`& _iGMD-$24[s-d3"Do"@m/0= NQ,@*Ym+B0#4J.ˤѿz/R#zXMp] 4Zi+zV o'Rq#>EACem'{= ֗).=\e3#  PfT755\N~WAڴ]'h2p p=Ȁ+s|@Hl6?'d!Wwc"6H- Zj7QQ8Ʃ)= j1C#iICVKf6GG{FQ~%dz1Z*Pl~B[+lb9g%V򋋭*Dm X)YbLw % =ZFD1 TNBurseW]4={)Ҷ9)s.*_% ]u}EFyoKh >c 2:D+U)u~,9̀˲WAFgeρƅ2V`S[TC  %?Au tk$VI4X>%a P` @c|ґ:D@ب xb\.~q.aW(uB=jG D$R3 $d"X;1J)Q Ԙh$¢|3 @.ݑ@8s? !)j@dτF*ܥ0!Z方,_ԲDvW$P#5 HjlRZg59Mf'xLJ};IrP P.4 F^82(㊫LGAR%5IQR-uKaSΔ5F9hf$2|J ʦEjMXqT q봶S\v8 Aͪj!ГZ?L)Ē@zݵy^WkB)lz2'еBP?% Du*Wb_͢X7Y` *$Vlvf<iPr R!5JK,ȲAFU[Ӝ0=;QkHS,J'1rf0Qbt]f sKBuUXA]h os]ش@iyPMO]+$3 pe88b4$wSn0]1 Z$ۡ%aÈe ?3vQ,ē1EЇKd RCTHق[F/"H^BULy}|9Izܐ3)O0v):ѯpn 9sDu_c: Syshg_:YӃzB2}* dR]A& -Rm9)^CWr, @$lv%6)`&4$k8֊L¶kkbۼ6Vex{>y[lV[ݯ@b׆r*vllб17ƓlkA ,wXַӱ fg78Kjgڎ׼lwKAAsxgQKE:݇wgccn!E貞O{թ}M[;cϛ[mawk?n)@͘.G3,+A-Yo<0lү"#+7 hn,nZkQNfiPPz)N~)#IDQߠRqI]M Di x `k8*q 6eѝ ̻1ט@,A8é#wxP ҿRl) ű& &Ct'G|Rr(ġ0Ar/)2/2|b#稲**2+r+++2,r,ɲ,,2-r-ٲ--2.r...2/r///30s0 0 031s111!32%s2)2-21335s393=3A34Es4I4M4Q35Us5Y5]5sNji`j 76y7}7382b¨ 3?(5::R{ZBK!*A?AA7@@B,d|@nDbIL 4EUtEY40Or h>h0D , 36d`bS,d2*V$k 0hv*Udu6\& >%rB@>3K( goB &1%dw6k@r QOòRhs^`p(fVkO],le 4F6d ԕƋH672rE6>;n6 Tm'/}8r}uxs [mMW =VVzň"dt; odvO^ʢ58@ ˌNU k a.ě:t:Hɠd%eQyDDytGKhyjYuie<&Leؒoiw>DL]V1ڤx Lf`BNpSlkhMI,G"I÷`fd$*_.X,8v) \T tN gEmav ͥIJ7Ԃ8 _{.Pqdl'PiO!vFgpgȱWx`AÖ jOxo]> lx67fHކƽ(=V{ `p,Oq9uy('0P>ORqPǔ7!Fy];bR@;y`X}@T@gNLm؊}7 2nh}#ՙ 9Sy'WQ肾F9}WR+ axPPhx7 2I)XSd5P+Gy5TgH@7[_Έ?s BQɪ ~i: >e:'qX)WvXKp~wZq_g6ϵh%թ2c"qəNM#  rCל$#٩ICu&8 p*8%x"';)7jA;E{IMQ;U{Y]a;e{imq;u{y};{;{;{;{;{ɻ;{ٻ;{黾;{<| <|!<%|)-1<5|9=Aaќz3(h)4]ۓ =ClxG%8C`kߣ+]DBAX׌A8*&G &f=zF¨RD}7} FD^#3ZzsRT( ]@~-=65*e1 `L0ב%n~ģک2>*5Sdf_C|kƞ W ־59`K#\@#.0H~_J#^u&u`S~g>Kmkg6a6bgCĝ&n79%"=*Fq7̾_W?O5!, 6pH,Ȥrl:ШtJZX&½DdȀyȲ˗0cʜ$"@tB Aq1 ͧPJJj"(2& (vS_dS6c۷pʝ pӛ0~3xʹ+^̸0벚 a'/ :ǿ:^ͺװD0h;[ ܤp_=N4gR Zg1.p lQ&=XËY 8^0Gm$ХEϿ{@P0 Հ9QY$ @t$}I1($W2#\ϊ%Hc#?~X@)DiH&L6PF)TViXf\v`)dihlp)tixg3\RO)蠄6)؂T6ꨈU'ݣVjq'֥vibFt.~jꩨ>꫰]h檫7by*Ķa0@6!V{4v3r%-0P+,` HAͫ,l' 7G,Wlgw klɎ @F(0ʖ8Te@4#_(0A'AAPGM4|H`;`-dҀ딭ک(+Ql-w")ux\z.JU=D/TxP& 1.Wngw砇.褗n騧ꬷ?ggph/^g`{EDJGvv [*iه{D+Ȯ/\=sFG0G@j *϶ bRHA\ 2UƊV aܱ0` Qu3#VH8̡w@ H"HL&:1G `(.D O~B8EԆ@!-I^y[!@Fh'- nqUJR}l)ָεw^uUaGd$/V%sl : }VB]gشFqwguQzBZ gC١^NmR4 9ˉ uXvRbh^7*Lgy[܅Ɓ u } QXɀ .M1?"HOҗQOX(.O4,%HnwfNBMqڈ.tOSi墆tp1zhw8phb田 f4#ܠ;uth ;HOBǯj !Jq8?nt4Tapw6D>S/G!ލ%Ol|=|ns϶m>t[ <}gp\ZRz88A -Ig$D FBzKkvݣh}p74BЀF֗drq{çi*w}CGolF<؃>TV%B6aSDxgU?as<z :Fcaj1f @с'gOwv{,Xh()pXt@yEF3j5I2!솅I(gh !b?O75iD8=qgS1<"}4L.cC]}dEi8Ɔe0wQ#}\Hz"> G124Q@(]#xؘڸd8A嘎긎؎ķaS#Xx8[Ux9Yy ِ9YyّOHqr '*7\yO?cpP+UtjyP6uS `7\ƓZ+JtrJyK%cuUǥ %zcX0eQqWNy Bi~@㕍Kٖnip\A0m1YJW>`e0 ŋve' jXlmuYG ]fq^Fmӧ:يa^UJ6]e)w]B`^Ւj;u^_a^X\Iyʹ`yG]=TyXYYjf/cy&d:Ɉ ;ce4[ bل&idRYdY[bde{. CJV&f@fg֜oE"$5kafh.C-Gz9(^RƀHs碳&v@~x|z8*I'ki[A&NF˅3(ЀnoFnim/ oᆎ`J ƥhjnXzԚ`EjvntZAPjXRZyVxy0gbch!u}!'7qi-gp1g\נiq(Iy0j}x]@t‡T?U$wYv(q6j}ujʚ:ʭ\ww(ժ=yHF xjZVwK7گ@h )ѬdHzE'rȪ ; *8I{x*{:qt'k8z *PŚ J'~Jz}m~z'7 ~Keq0.}zmJzIQ]mzZkѲ,'1{3&XieKY:~7z؊FT&Lik=lK#X3A*?2h.Mkv[1\;KMBP 3BM9CjQR)h\腜zcXG!q8Թ)4s8cy8\R d=VE>"!0PH˻bU؛@8nb;{ޚ;x"XdwrRI{jwHIaٿ ё؏θM9s8+Y׍ر" |%<( x*2<8W(ۃ@B dL XhlϓiƅP?nǬKr\ǂp@vGuzx@ǂL tU^<Ȉ75ʼnȎȐɒ<ɔ\ɖ|ɘɚɜɞ,H#i{}HPF9ð@Q$ URwuיjZS7U*Tdx jl< ![VVlV "fؿ_lW#(8|5YyvgVϤ PWiŜ']卥O Ҍ}vZaGa_]9$m5}}]WZ9 Һppd`8Ȝ] )ЛlXJ}a}=&Zd:<ѝ=:YLv6ɞam iHVK6c -`e'e]yɅeԄ grugj}LHikhl8}Dټ|#@Ʒm?h jښs֤}k c`FqW[Lz W}f[^ mn];j*^!Epmp7qg]qCGguݓV;W2gI ss [ ]SOWGuuT =PK%'!Wf<`E:ikݳ>GD- ngkHސM]=6'=$9q[&= +{} toZU]^J:nnK΄[(4 6ѹ(iq+gp0wVG`~(7w膪o~8X盾l&ȀҮ+n{ّۺZ@%1WDU 侌~{>o,??D/5܏EJLNPR?T_VXZZ/˃@_\_fƽ/Tr!]iΊ.Ì܀kIf vOQIBW9\ |pcUe e~ ֲs*P ?,[@<[p똜+Iĉy+E"']F\^9l{Tg ˹BCvx|[^Sih`e_ih- ʥSs.BdKB~ `XK/aƔ9fM7qe4ItؐZH~0YBbNSzOyibb*uX.WzajWkY:쫧a b1h7b]PDŝ1gּsgϟAՓt #?bg(yMkM.OP‚ krnzfn[qkW}+{=#U$t_2mI[ǎm \t}׿_*Rɹ$`CJ0(թ.;8ߺ4akBoЮO'Q 2D06X8V;KqHGZk2%8R)+K*(&vz+> Ġoά 4CB /T.dv*3U+j=;qQ1 @3>/O,1TM9[LbK"53T*DW VWUXHC@4+](a- Oo ׾PEY N#) .$kpULUVڤa85RXJB^zwB`/0hg G&j݈Z)Gb 棵~yRܕYna^e4acKx@=•'E(¹&PE.Z JkZVyXd=~Y@h3N@,C-4PD5` -H{mF)-QP9o+425Ϟ * |u \:p.$W `88#?%poe1@K=D`γߜxR@u O_!Xg)ߦwE@Bsi~ t!A RyS7A nAB%4 QB-t aCΐ5 qC=a Q݁$F97T$1fAEqYW1JeŢ`QF"MzE<`$+S8d]MKT/޸1ȣHl U$NpT$#5u}DKԫ!z/7ҍjL!!+W0d+d2-qr5gR/'KyeaL(R-`>–1+Kmn&,Hwȯ3V*2TIh2=tNjNx ҙ:IN\ZuFR DCS~ȧz>Q|&ϫ5|oZNzQl 3lgw %?%rE7sq$(RՌUB l :&qOe]ŃR:\ Z06koDY@#.R@dF ie]-LK8խ^q$ZUȄ(():L47f 'sMQau@X0 O@ v@.$@6dư_z#\C@φLw$*b6&4/@S\(2Ϻg "XP"<%@Ww\FcZ.e`Pd?)`Ir]>RL@4-,(F*ӲxnR7 T @ZVLf W *+"㉺W8Vn@6Ļ [f,-=82]/>l]|AJ'>ەS-2ʧjr2 fL3ZʳcՓ[ws3d)5;,r 1T $P|-3#R_tH_^ 80[ D wN[K:E$*8)*$:"sV/d=_(ۚCկi}AEvlOW1Tx:mNbqNkq`[G=v#g9G`{,-nrF3]{i̅f1ٷ;[@zaKV=}}0l9>WmeD~{8;ze}% д9XYy[v[Bk~,˥dNv!kMA9uFx>۸ :}ky51ǂƺo~|_ mRqCTJ3ߖ1//N+a* x3MI[^}M-DoN7W<rPY{8*ݞ5Cߴp)e3fmD tLdfkFF)(|T6¦L|Ezms u:jumy{nGLzvJgxdO v nn|HOB>JٜBU;ФVVr zފBBc* ݐJ 5#0Hqq01?š`$q)-115q9=A1EqIMQ1UqY]a1eqimq1uqy}1q1q1q1q1qɱ1qٱ1q?@c22 r q7a k&)d2d -"12#5r#')`x "2`> (S8r%Y%]%ˑOpNRS`r'y'}'&P(|. JR|Z01f**2+z@[Xrx;!p s4\\:I= 51;qAA}<ԓjooopj*!DMD `:w+J9B vl4*HBRr N 2\ - ]*` *^!.]Y 5*bZQs7 ?D-oy؊ FCeb ,dCpO^,A_$Xk!R&--WewܒeCD4aNW?ub<ֳ8/ epJpM<̮Y9Tl)&C!0 Aa26oKmazU9/U%.6^bĒ+NDHq.l5 rדROFF2pSoQw4VJ7eq 9 ΰNhCV)9vXir[Sx%= xb$2uv@ZudA ~u0\l(9}7逭֌df!gyjzGbHwҍI$z xK^Wsw÷viSv/w6w %Բf+3G$%PSziU8T]|b!>ns3E}?!ήw}ɒs(;P?'3Wxi-ri]`!`m%$+fUdl!)0Z4/H>&dLd0OY(SkFT4Jg\aCh4iHʷ-3lxl8D/ ;oƺf+COAc }r ev rtG%FuoׂpI,iPxgxSFUaU@G{\{apyw"1hX9X' (zuD H~t)-1:5z9=A:EzIMQ:UzY]a:ez#\kq:u˥:v:z:zZ:@Y7v:ç) `z1:za2:ZgN-cZNj  Oz,C!=:-/: =A;E{IMQ;U{Y]a;e{imq;u{y};{;{;{;{;{ɻ;{ٻ;{黾;{<| <|GA`9|.j5yV+6<ķ4@m"@Q\UGmKRř@mIo}\-ylj|OuNj|[ŝƙ}>%~ ^hٝ=A-޳}Tnw!w/pqCmGxH;FE &(AMQo>^s@d^&^Qy^ўCI9K[2M G^ݡ>޲}x~H &+)cG 9>A!tvr/:P;^I_)?@K2?2 sBu?OB\%Mns{@B@7{73G`gޣ߰>H'35#`EǿQ'' 1! F@T %38I:ւOK`Ew%'V NOf?ZIIH9^R~/>/>/>/>/^H! , pH,Ȥrl:ШtJZMacpxL.zn|N Pa{p~X mP~c쑲^ HG5C JHŋV\UD CI]`.$(ɲ˗0kTA8sNeIѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxK5  L8 ~@Cǐ#LCǒ3k*˚8M:I tװ,'B۸schy]2NBS` u4;h>SЪ/a.0߀h& 6F(Vhfv ($hhGh`(㌊&0K2H!4)$ &qIr2PQ rNFhx HC hRJ@4i)gMp83|AJKMeS?ӺmJ,7btdn !f2&يnCݮ'(!|nΎK\rwX@otZ.Upl{7g mu _0Ë^)&#s %H۪NE& 8%4Yp&;ɼ\02Ú ^1|:b//[cw]D-3 s[5K<&k0ߴؒLB2} V\neE3h۶u1 + 9ӛelѹYvbZs=!՜m^״Sc]![aF  -#Pi,f ,Ȟz-݇Awӆ=he;Lwʆ5`SX@ٲ N’ppNTi.sP@NN| \i}D)RܚffY~ |JDs*oɡU]xxA\)ƶk[X?pyc'{^ԏ^^K d1Gq`ţg /shvoRuڹä =+2n2}oGӘ3 vнYGOz^JOW֓3ugO۾rchMO;ЏO[Ͼ{OO-0N]fO1:wc=`sEsc{y5>77RgX5+#t$Wm1R@xD'sA]NcျB RX# #c4:?ywXV0C ?׀XG:e;8TC32C( 4IxxEKI`%INC#aH ŗI.IgAŷePKWxӃbF8Ձ҅L@vbNt$DMGewQ"rT]BMK7lL&NlAeQsPBP#07M 1Z7g1PmD5XB:T@AAVugmGiFhmAmDSJՎmlXVW4ƏFUM)؄ ŋW&I$ZUbiMmBtّw A\0ZuZYۈAa?$_Xe]e']i%29ؐ@&9u=AqVHLDP9^vf/Ykh86^B]bf `3h5^sdM'?X2s^hirvi Еl 1&+oIbiIFrrvi0bjijgIGS4Ut rcG2d3cT HFby$bX ]-ą!ns^6fچ)f͹vpgcwfi˨c{OrvIYef)ٞɘ0> [L(96jIf9YoYs9iٙ'EOj gyIl4}FgEUg2YN9IB&옕PD`vL؟oɟ̩/,zXVZ8lcj3\>)sunED**> ؂sS"qbt*2>t[R55erWee)7Iss)grc#$ ptC6jq{tR$@${@$X%S渔wj?,t.عLy|g3YU{u6SUDQe@DKڃE;KH;͛AʄzIt#uml/x@੪syچ䩄W†$Z: $vw˾MJJqk˽kޛLBa)OHNMENO%1ňB ,9 5UJQF[uqɶ<_@uL|hë0eDTKq>5h蝰mŠ J ٝI4 [CX#ye[4KdooGM<>ȁe7YՒն3 i̒49= seF{B֛Ǵ]||w*)^\hĖ~0Uxom9,^ x\%;/soU՗<̯A\Dklh+a)aOPava)J\hɽa| S*;9\t@Vm*6<M4mSƯƛlkiV F*h чY9{9g\:C3[ۤѕLh6N6YT"9Jf!{\:^Ǩ&j>vI1UT# 1:tk]E=Mdd>MlylU<aIm4D| І?C*+UyMJ}&Z&T e]woWC*w qkj䦃5rxss*% qv×:tZk6wLoVlt# wSuH<½k-R[wphM݃h]p%5v`Hw/,ej44xwQM*ӷϪ#<'~r JѝZ >}>uz| ">$^&~(*,.0%ELFݑ+:;ԕ煻5>Į9k ;t,BR9R;\*^U]XB " cS#&* )zl?;;MRmp^U0IicXs؆ގnˌzȿԇ>uPɺJ]YIn躮ɉZXy]!5!FHrdaܶhĹ.÷&Pztá FᙨΈ%(ޞ~Ļ~qNֆ +ŻڝG\|ә&wƥ1G??+ v~[Eӆi1F,Q=NUQJ#tIn%]J0a6uFblϗY^Cݐ?Fʓm4Y'']?FjimMՐZ }\fޙOdwOEٝz6Zy q7eI]=֔a}mR93[UzbGe1KY QZ^Y~a\6ivq))K? !4.: ..80#4-X=O&+_\aezV&62R'E[Kc?C=.R dTq0H@[-!5P 9,'J262% 8ZpaCrr AKXP!&'S~Ia٧=2vT& 9wL@,jϩ*ZE5AC<;lYgѦUFN۶##,ˁ p0XbsV-' !:na) ȁk]Z&S n? T0'L 32V(rZAڳkp0tzuױg׾{w0yn[|yѧW}{u$N^~}׿ dࡏLPlP ZAt 1P 9A QI,QLQYlaQiqQy 2 J MT2 6+ܐȶ+\-Z,d,8HL 8*@ ¬H 93(1*<2Hs0RE[# h1$eR < I+t OIHԜHPu G1@KrdN 6a3@q`dOaVU 8 p>c;k3uuX*'x@h{ =(`S6{i!d$`3X{x7c!́* c+ @l< &yޤ?1vdg 6 ' 7ϊV8N8.9v{wЗLaw |1;Y5` EzjLN0:S:h/Q殻" [ gIݚVr\%"lOo9@q9(V;.S+pt;#a"w'Á:Vf _ ))y]%\oC}}|G#w #*Wzv&jAQPYc-I`*/㘎FCi $ m\'Pg`8@#@ 6:9!\X.J&B_~3aR1`E*!<. ++uј H^m^l2,]TI-!zAP@%mN*ۖF*Q4D z!$Tp$I4!v$̰@xF%ؚ$)$|pڒ4%kbdMԉ?EIƨ T/ҫ]j9ClE:''),g)gNb4WL&N! .i:8Mfa'+ u"R!A3C[ˠ Q [|%4s&*Q_B HC&Bu8I2gjB.6g5dJپ晩z'JC)4t U4.ꜵWWԪ;!FNbUN*+:-~# ЄSAHT$)L Mh;V%<<{>өł2ъUbin3gHj!kIMݛGR5EV ,VEhkm3j$y;gRO6֎)kGn9+/M] Cl?2ε,\!q%~KOm"v]Bn-`p 2_Ҕ9` iY/`BWaI.# 8vAIGU;8#!@%} %^H"V%% J 7J&ZAT dȩR$.#(iVfJx@^)@=jī&05B(le"y2VgOF?aI?L2t*7]l 3,KlǗ:ʲ*d]R5sXfFff',$cӧTiՁ"o&eq-i5 ՄJR95݌` Ũ-?zě?="{? pۧdc1qoAr%7Qr-wasϜ5qs=ρtE7ёt/MwӡuOUձuo]ve7ўvmwb!&Rl&}qz6I݁V(5'P!yOHq)9G@ j0U7QOrMH 7 ǧS9}QP`7{/:ppX k.B-,.j]+o~@gޅC m%# *!p Mk_ƈRD 05p9`hT, - LM ID:a0ۯ#I1P Fp ǀ&J HD0 YNS0˯Ap #o? ª붶N(  Nh Ig^/// Гgeɾ &B v00A1E`l i~#YMK4o $dCF1uqy1Ы1qk1qq!n1q1qɱ1d Loqq~f3G5bp}@Z@ҀNDz GKҰ<%Z)Ak}&E"`/PѴ΁U) [)h:̸#"'&W)$1#!$  % l=h&\qIzmk&ap '![m)g,f @,R _{/NƅpKM#38Xn..ذ)SDH#u ,vM2‚v${4"@)s8-,3rnܑ&n/Vy㻚 Y: $(`U˒ s >\YEf_&`fre)fܬRcPӚ'۬dw۸/oz \AKFi"\lrm 3=Y^C+mfeŏ241Sl]<Ә.6+1q4+r$51 S8c69XP/q7qK3/B6Ox6u=Ƈ|G}'uh~ >~!>%~)-1>5~9=A>E~IMQ>U~Y]a>e~imq>u~y}>~艾>~陾>~ꩾ>~빾>~ɾ>~پ>~>~? ?!?%)-1?59=A?EIMQ?UY]a?eimq?uy}?????R?N?OB?B!h<"J|B)jb-1l>5~5e;,"&16:>BFJNRVZ^bfjfuz*lj^^ xDXXHxBy灆:?C3OSWKXw{?t@P\THh77X#(/ &p"w"-)%(ˁrp[ ]7 c@9!6̩6,)T]@Ap!]ZRd P4ou,YU/Vڮ,ۈ.|jֶW)hB)]uk"kw18 ]xPx25.d%.PֆmD 1 kڧB &AumTsOd7a6wTʿort;x܃R&N5_(~~hw`!HC/T :_qQ0F6F # ed'x> P^0\`ǟ-1d/RuRxRFTGH/}G Ji cИaiM.Q/~U.o47Yj%^Ӝ⠃z&UrfhUpL8=ç?[ ( K*R#JR [)WTlN7nꧧ*"),Qi b,J)r[n[ ۮz #-!, pH,Ȥrl:ШtJZMO`1X6xL.zn|N)x{q ZWm  ZO ^^c F H0L+ȰÇ#V`S $jȱu ɓ(Sß!8I͛u< @ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻEtD͈ =3Lpl`ˤ @44ӓ*\ ex%Q˞M. @j NLBް3PНl\i4 ν;wKakC[*L?˟_y+ @x-߁_xeB@Vu4ᆬ#Ah$Vv ^L@0(4h8<@)DiH&L6PF)TzQDdV`2ZyA.BXlGhB@E0*|觉imv0uʼn!*UlO FvL#hkh @f} OjO Rj 챆m0qjۊB헄 b 4mlk,'*v؇۝+k,l' Wg P*gw S,1%ʹ!0,4l8<@w4.]= 4I(lq+CcW^LT2` $_mx|߀s؆  \v`#xv2-1k,^WߗAoqAc@ Ǿf_zAwn\ŵ64טy׋-Χ{G*ul콇/ogɃgxwɀҿ=i@`Z}{%̎cx¦@|CcE? !bW{ԥ\1cIX1p-)E!>i  Zˡw?};b9dHٲYsܤKR2{ %*Iz< [&8S˜ T sQg1!-sZ:uT\P8] APh@n,P !91RB8Cmd-눪>JԢv[QtPؠhPx4K7T)pPemSBLԃCں.0 M0'2X9+F2E <:eU("Mb+2fpĊ&&嘄 vhiI XtP[yzc(2;]K;K5Ԝ:ϲJpkkX:Ѝ.)+6yyɱK-ž^u KXզs+{wvdoZџ hQQDKUN0K¯PT<#ߊ7[[QѠ6t-%^ m̂!-o۫:/@"uO07a@QI<Yu3W Bʋrn 8rPNȝ.݄9buSW1W776-_dBMh5NC4htD *5IVëPۮBqUHZ'&Fp鬚x.[l.djx9,T~ocLk WBHO? udB[N>ui~LDfI MC;ch ZL6U_+nuwF۽~w/6 B-dvN .Ppչӽ+ܰGNRV%OW|KvgNۼn>}2PU1TljU[Kވvg;dvñ>;'Oymhp;+2NYYD5Gڈaϙ. 5fزJ}߼_ 8/}6zٛi{ NO~69?03L< E !%~nG }mDAB`pDĀg+RCW}X>s}`E|p pGQrTFW|IKF1EdDGEEڳIQ4f/hFukgJUTiGxf"gPF,@IBPiIIfZ4#tQth5JشKD@?4ZM~6@KdaLkMYfGfiNth*39hb̕HbN6&\8V;!ʳ}ClfdMU]QJ%y(Rw!P QSU i0R}b(V|SuQ1awxP_rtK+˂W#VN}CtUfbeDSj v_3'{^r%C2HlKs.8 cHX؁] 2 YhZEeRYs|$|@G^;2\e?M+4S?6Y gVceo)L3F`9 q_''5/h?hKQG[EY7Z6n0:DyXM"Fx,4b bv2TXP 4|~m)=&IdC ىdK9@lF]FOiJP|晰fᇜK9waD]%Yggʙv!C`gDojL i$lE8 iB{ ~6mِ喑v+Mk(FF){9,j ‚:vvV@A#0<qooon3@"pWotiq' Ǣpl6PQiSqwn$7:W4:!mDP:tr6=RzX:rX^ЕssOr] hGts0pr:tZvzxz|ڧ~zqRj*ڨq9:rznaidfb:cDz_\aW :R Crh PCq"'ZzȚʺڬ:Zzؚ,1‡=g}e?Vڠ/j,x5NzY"W;x_ݤ1ẈO|;*{$eqi*T-#}.Js88!P 9JZ5g5zB:2${/죮{)GdvCKDc<#;<|dc(< e3w4TKh:`CDZ#$~ Twtכ%~c[?44fbK!sA#TV2^įBS Wv,hUv]{dʵ51GG%2IIY:jFm䃘KE&(oFR=F#xjA82F^ lJiEĄ#6*8wDmø+rJ>NA\F䭑s1ִ(<$؆4SĆ{ȃnL O qb:DSq8OjOhk2KuÉPjQ[Zy^(y.U)y90o8_5LrW T,2\:UQT LuCI>6$RkQoieoX[ye,fSĞ뻢m&A1ҞNcxfIʹgLЊEFh&9E[̝A6Ijt|֛g2G *mܿv+H&Ū|춝 @"Ԩm4 !#%')+-/13579;=??%.@KM%NWY[]_acegikmoqsQ/$t}/S'&4'Ƌ8`A&TaC!F8bE1fԸ'HT!P"U:tn I*KRdJ7-y@:#dP!z&CtORKE'!rjN=)meG+X%XcP^-Nweio4s(`H4xP '6@ s a:H6" 92AlA=F3"xqFE P+-.pP$tM {wO؇Ao^wyxKY.D'O}"PЀ0o tz>80@*9OSbJ4Pc?4u$P Vb Psc!SkyDB|afːbn @ Z^XC4 axSSܒA:g ~W=j 빰Ksߥ +Y" % ckʋ1> <%yϚQ dpI'tU@9O_X?¿̼"Qwq;)~(#1FsӛbLJZ"1 X{[Mb_U3tPE@,bDfB: mSD)(㔬TDVV :_,J3}6{3)KpO5A4Q)ŚHu%8YuР 𶶞Sd~jW), PH4R BW'._KV>Af%Xv&@vW -Ka S(֢Hֱ5ڡYim1ݺ.WȂ}l.#\NwlY+-80B::!O)*_$'QvjHJ#-Kv(dXS˖rB">wx|?K4lF {yG$vHƑ0# S‚vgqoV_j5=D#;rL ӣC6!htHGe)DDő n]f1e6ќf5mvg9ϙug=}hAЅ6hE/эv!iIOҕ1iMoӝAjQԥ6QjUխvakYϚֵ0^6kP3I-#(|[6e$,vtĎFB-D rrqa n;qm]`F.c%_G]4]eQ¥6rEe~2O .fJOQ*kБ]tul3RnE˳J sTN%DX5h؏9G.>0"1R"|dʅRb~F%@hdP pj . DjpG(re`) lx:*}$5d&Nrr&yiyTNgpL,]y.eCr@aQ!'5j<i҄g(VR5t $BZVӟgHBs kg7#S <' ߇6v(*K%g5lk24Y:C 6qC 쁸(Xf=:*? 68] j8G 9%ɲ93)+jh(M{8xG״JRILȐ/jȀDK 3/cϰ*$FS@+`<o*|"ل>5L^B!ȗrIqMxY]Ôԥ) L AYsuyRŵKb @'"WSouВ+TCk"9N m8Vg,ko{uBٻkuY |BV ZLZ߫ZZDY_ òuU\51 >z$wT Z1#uA|<\*v=} =}wp|K)TYd8 iNi(җ~ 뻙+#h$}.yquCW[-:#.U,)'k:F%:R[-G2]ɄhZ^…{ZpS5k}4Nt 燆hzs8'X?S:ȩ#?RdΠ;˅򾣠=A=ٳ1#\.áRF*cQ=+6r=j#5! -Cjb2ڝߑ^`XW࣐E&cFh*k+l,m-n.o/p0*!Y+dfݒ [1'a_uP!y:{bGAbWFYC(B@ 2l!Ĉ'R؞3'MA7c[YR m<ÿ 1ыN.&QSe .CP~>=DT^$z*Y&}93ڊ% Yl-ܸrҭk7zmp3 | j5䉠|09.\(PpS@ydF׀4yvvY 8U cz0M.Uv ;zP+;~ù& $wǓ/oǚ)pHp !L<&{Q$lᔱ<vbIVPH@ПZc)ʳQ&ٙay$I*$M:`a5%UZy%%]z%a9&ey&i&m&q#Au9w'}' :(zec `t:eJ:)Zz)j:x$z***:+z+++ ;,{,*,:,J;-Z{-j-z-;.{.骻..;/{/// <0|0 +0 ;0K<1[|1k1{1!<2%|2)2-21<35|393=3A =4E}4I+4M;4QK=5U[}5Yk5]{5a=6e}6i6m6q=7u}7y7}7 >8~8+8;8K>9[~9k9{9衋>:饛~:ꩫ:뭻:>;~;;; ?<<+<;>髿>>?????(< 2| #P` B r C(&$ a oC%-C 2N҄0$\m8F`bb^%Kt"(C(* T$D̕="agY邯ʈA5%dcDTѝF&6B yFCr<B U"[ %EQ&HV ]YvF"0]"ds"c")  耋E"e$-D[")9"@{TL!+ɨIiMS$r76&ʄHDhA|gKm:N$xG$1;(UHC$dЬYsXh7P>sDXӣ6=!HВrEt|ڑt Jh 9zӥڰiIK9PK?$6@YdmK2u9*uq9%{N/&3,0]~`[}yT%>֜ D6""l`{&E9V1SlFgճ]jYT׾6yMi[n!, pH,Ȥrl:ШtJZr\zn|N~i]] fzE]o  xO ^ga< 8tHC*\ȰÇ](AA@ȱǏ ;6C\ɲ˗F. ѱ ɳ@Ȥ)1b:*]ʴS5gM ҇0 jʵ]-4KV+GC8Xʶ۷p, H,˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M ( 4HXcE!BCFcУ `]dh%祿)z`w|0ӫAfUk0h"W ~h "-F(a IqA8 '!"tPET)(㌰D&f!$VݒXfIa"GAZihlp)tix|矀*蠄 W-QT(Q褔Vj饘f8Ly6:HAnjꩨꪬ꫰*무j뭸ji]1`]+A*H {kߢ45iGNjJ^k*}ij $@7*ض+kV Y t`IP7<0@PSJ-om:Xm*,0Ǭ+7D\MM7c6 yι6 v V)fʥs)(ˬ\w`M)4f7)^j@{EA@ndMx+8Wv9-ݛ #c[gx]?SRh|<8S`\Lp1bnm#vQl,·8LX"AM:t h06K!BfE 4_UғP+4MqwbH  Ra6A!3B %u ZCQ*`t"IIRlYs#ENrDK~6(  )IXRY2f:sfRtMՄ5I5B[QkLN֓>U-Na؇ԯA%b/Ņc6 Az",TOm:Z:Ѝ.< Ysxh-mG)"ZN:uR(}7kqNV2,oJFbky(:R8"+;Y(bUXT״jey釿-K`lY)}8#U d/FbÑ1{Z" fq@Rƾr L)sq hD#JdOX/u@ЪiJRѥPn$GxYu'Vv|H'nuNOR~{P).]GN%ccqMp} U&!uZH(N^ MU9GT2p܉HOza-\f*gJDuńULi4il#Ewf8F(tudW)r<-A4:EKTd6%29eWN y ^œBbB _c^yC ] Z &a~G|{{o{5{j@g}|gRaJ|Q~ԗ-߉( A ~{1\rz k*B#{CC(> (DZ DUDuiⴸSYXS$ˬ9 >Y`YLH5HDC{}(D"G[1{:(#y4OAׯ6 dڅY$qJyL 0ٳ[t}GMMJMz}8س쨿-iW*M۪uYjYA^e!5k&e)S_S85Szx68a) BЋfߨK|TUV%¨CC@BV]G]ڵZ%|9_e¸X׏k*.B;(C|eF/9ZPwFUҐU(i#d'-i86E*[%*7Ž6Z&1ƒGElam65^|IKj_el8#˔h @WY @ᵖ@ǵux4~͋`Sʵ<|BZ.maFPv=ic,%ֵye,b]Ԭz`=&F ?GTPqP57fTV}Vx Bm:F}͆VHN-fyO=T]V}XZ\^`b=d]&wZzknm+yp}#ഐ֦(j" o]ر)+,ǍGrc%I.ۊ,*m:8V"-DaAhKkt =76BU>~>}gAy(*@DB׍=}Bʸ0%q(hV9 >sk5.;t2땴F\b4Ÿ 3*X)F~Ie t+Ϝ8HHȼ[Nȯ{OahLknƽD䠉HD\+us4Lk=ߐyz]Xv+ jDKꗈOdl^J8.I+UmTѡ (\ ȳ ŒF;ȃȈjhƶ>OAkg״ڀxŎŽ(2j@ *?Z,GDŚ+g)ߝ۴5YiȌTϿǃK%}sۓZhZ,ȿK kgN߮ ?1ܿ\պ[;?O ;W)83lPL`ieyP¼,Tuxή<|ٚ=TE^ Θi%4NۧKS~@S`qM;e7_g% )[|v  {h87О/Se.sVij4WU@ l_nElԿmJտӦl?_Oh]vtk=RGX4It>QZ^Y~˘TK/AL M%lIWq@JNC ![ D9DԪ6֎𤈃J4;@"3ǨN09$03 +L(P'T/)S4B)]NA@*&BtnNJA TNLn5J}[_ KΩҘ`bXzҙ_2 *خ6 "F16;pH UnÓQV[B}eU.Vm[W]*$vtb͔> DSE`J#̤]JvLA&Vv-#Xeai<56gg B.aF B,VA]g@NEz\<":XF-zj D%(j)Q@?V3\ WÙri.ބ WǞv_ϡuN`&6CXI:%ў#D.yɎDBL=|^>[#-x|s mMtVed4Md-̨3Uo<|AyяgpMzկE}a{q{|7|/w}O׍I=B~?2` tNc!mE6 K~K_K0eA5@oQ"XA.Ϭfb /"tMpI*q"&c hj!O VWHyg"SbX`6<1gӸm++1Bh"Ӓp ׂ MH.c ."ИL촌 .p^pM|((QC^R?>cm9.$tJ<:DP a#j e$ *Zo.=6 ƣ\>tDpMN@RSV@DCXUL82l%ČOmȎj#PSB1$2+čQ\*VĮqm~/e_t&bV)]'f! R x.B ]%$yfq%YJ{ qk+g  b 'jԏ(wq\dKp(m`o2))k(hx'[+r ^RL#` !LG(ۭH] 詯mv-?^@.'t/.z/nrf3}G)r+)2&%,-&>N'f+J:4ѡ"h T"26C7[5238{3-,h`\J4Q3mN5 (o59 ~ Jd(h;i:ȉN8+Ò$9"Y[܃o6i:ڮ30 b# c˕zP1nT. &t9>tS=DwӡJ8dR*jUt(yclt.TF׌4MF16 pD @:tU3TKE+&8%Fq9nT "a0O6k|R(N *Ŷ`S=V=܃hb4 "ʆK%}Y1j9 ;h4 7Gnȉ!WK9neSsKtbwtqv?C{(qSB-ۮDWBCYCQYyZ ]Җn39F=$ᅓ4y#;0{g*;SFR-H#|gȠZԋpTre4a:Ss,O(.&;;A@v.皝ٗy:xs#y2{Ir!wy-=žEz-xffS./0KnM/"y-~eC-tSu:hP٤ `I5=mf\9-RX:QZ+9:yˣiFᔀ;C5n?!:2夿P@=B X(`cC “ -c݀0ҁݾ&]eQ>|IOC#{doJHLD,#ɳw3E+ӐOw$R]]oEM\7mQZv1;>~oWGw= "]24&0>E^&rUeJ5ZIׅ_>!O"1#Wp8ͩ '?l]R)<$1d䝾]bd3&T%:9zQ}3b6hY g* ~p>a,-1}||XZ"Yɧ|#ͧPSx. YK!3R!=Yڏ]1-> j|bɓ`C%~{^1ΰ3DG෍V">ch.b!F#<‘J!Al.jellVgi{8n.!?NY"&*.26:>BFJNRVZ^bfjnrvz~4b6y8%`=V52aAIu.0L\ ]%6(( t%,,5)C#6=n]\ DDnem6ƎC,y2ʖ/cUΞ?-z:kHNz5֮_Î-{6ڶoέ{7޾H-|hď#O|9ΟC.}_ $1J}kܿ/~<ϣ -w,>ϯ?X" 2ؠBRXbrء#X'+آ/3Xh76أ?" iB"K2dqMRYWbi_Q_lIԔckYlsft♧{zhM|癄"Nf(B8:b"](sԪZ⚫ګ["2۬BR[brۭ߂[碛ۮ[⛯ۯ\# 3CS\csܱ#\'+ܲ/3\7㜳;ܳ?C]G#K3ݴOCSS]Wc[sݵ_c]gkݶos]w㝷{ݷ^#3޸CS^cs޹矃裓^駣ꫳ޺^㞻޻_#3߼Cg !P_cs߽߃ӏ߾3_Z6H<4?!0 \%]0CᖼL0!z0KhfA ZB 6X#0rZ%: hDXU 5A(u2Eh!! 0#1"0ҋK P@b~ qXUa եCQFxءj -I $)(d %R|xp9 =@&9i0zXRx8J0#fr!@!"2'寤;ŋKQ&3jhOj)s.{war~('̜lq,>YQ $6%O쓑!3&o4jWG8c( .3m<*!(,ATыt|ըx'T>V:^<$!a5&Jј"25= YjғNp^&5ڛbԧ%)R(gUrYUukװ_Xfa[ !, pH,Ȥrl:ШtJZr 5%B\zn|N~i]b] fzECboxe  OY Ò Wb"(@*\bx 3jȱǍRAAS\ɲKZl;Es8sɳ fŢѣH*Eh@0iիXje!F> ijٳhӪC1jn4aAk˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^]nUbfjllͻ -b!\0УKNسkνË;7y |aoTyhpy `7 tts5@_sv ($ț bH!Bʋ(#.S#AZ> o !uEU_nΙ\v`)&yոȒh |ȥ^7|IwM6T@p4Y袌6裐FzY rhz`H5HD8T_L\p`@ʩ:J&b(v@ kG`L1'G*覫;v5Df`p01[TtPlO5F \a`*PZ] q ,`; 2@bo $kzPAhлjf-;ue\w`]SR3'ikýlS"]H"\Dm,(q''v }ֈUp tʫ)HdzQc4-FQ"wǔm"q

_`05o1# 5GJNrgL(DF:B TR,sZoz/iPP(WiK:Ќ2aCn|+yK5Ab8r{07WJtfZo3\ g$X " ݬ1 (͂59:2ܤ 1!XB71Ό휲QV)D)2}*}W/I]yu-U#n&>y; Va,Lf.lXw!%]\ekõ&YǕ,ꕏWW2Ɔ4ȧFFq6^;9]4d]ص[5uB jؒ.(U`4Y|26x' JQ#q*Oځ*BڥPE$d/YtLR:f%l.:Z3VkfNҦvu:Hш6mmk2ebx h-Uk穥ඒ@꥖P`z)1é2[pHoG= 3Ǝ.A053)"p69Ԍ'R3S3' RV|S `4HK8֣+Xx _z66SSm\8Ag8WtgoT8T抂1;ÐѲCOZ;;V#OTzv{Ev wڰ;h@k9GNG>8|nHSb>Qy瓱xb0̇#z߅tWy&;@UDARAǥ|fׄ{L+SeJԗy$ YY`ЗOF}P BJmBZDEtWhM;JGwG ɂ!دźeHTUյgvĶLn1JQcSK}d;UjYջtMfz ՃܴNm'H8t$W˲ ^jOA@[KI빎Z*QXQQǽRm3&xR눹uvu6^7H;鋨 Lbsh]Udz#\UczaYh`¦sv戎T]:ɄK 8oiu˺o" Z_Z-lʕ[=x-E*ir쥌it\]o9r\mG;vJr[(H.,Ő}1ɔ\ ɚ`?ɠ,`I \ʦ|ʨʪʬʮʰ˲<˴\˶|`G4Hwxd{zv֢tW13,)"s*KiHģ̢1H /$lj,&ÁCU!&F?4rցn74"ۧ*9Rاh%dl&z?#m*]m/+=@4niBm pm|oc0wq(g5T]ěEcr4W=,1͍M4%O4ݫWb5-'A&5,U<+9CG~J8S˄ tۋ94:k=v!~U* T~WLmj@w*˻+:{ڣx#x-{zwxzzg3Nٝ7RNw'k~*)T5Q{?xұq{i܂m|2 PW,`7Cc}اZ7 gԫjSxLtET4π$C+48!/+E8~Jx˜Q[;Y#k呠\{ب]2ȴ p[8+[E>>Ѩ[*ChNqcj|6H1 n ~-V"sH8JT-hTnLX`]  9xD8ݻ3Iټi!("#ž(À錄eǵ^XANFqn}OlY*3@3۾>?+ Kj ԏӑ}'k/%=9M9WXe w? "I<`D9(blK.aLQv/_6ʉZ4o<>@B?D_FHJo˺ `DM䆟2-ݡ?e"1+{Gc"=lO"b/Vb$,3&J3a"!lN .$_ЉpK?bQ&O,ֹFINM/ЎءЕO O"b{ڼgSzڿpEVxڑ)m$mMMȫkvHs-2+]/=*_v (l\:G\* HȅP ryT=)3t88p|\>Cކ<,Т,..** 58 R_=>9%fe`8=+.FK~x=A=;(d-6 t.2qQQ8`Aҍ4NHE09RQbH<ـ 2F$ PE H6r=Ȑ`PH&H9DL(3 1OJUvfjp4Ԉ#7Is趘8'Hag%},[(] dY&bdVIɦOVYpBǏ!GhʘsFwhqsRY3]3 Y /j6K&Tq( YD)O83)eH 7OMz kʭ׊&.^|B9bfE~6(~8ءzh]/j@[u+3}.08 C+bS p@kTQLp9򗌶1 kMhЅhOt 00Aj0D T  AHpypΗE-nx:X70ra~X\5PpB H !HƲF28`]1)] G^ 5I!Q(؉u#;*@٢f~J%icV"x7vDC(Ȫflt$a)A6t3?5!ҴxyMmnNMqz+49љNuރ @@pPNyR=,? K 5AP. uC!QNE1QnGAR%5IQR-uKaSΔ5MqS=OTE5QT.MuSUNUUUn]W*5b@I2{|rp`u[W~>@ì8$^5aX") #$Mb1YnkyÏg3;Zծݜ UfQ<@0I.ҟtq\25N8S74WkA" 0Aaq6rћ^WDZa$cJEKR\0+q`-"_|w,`}=+Qlug1a ox]fۂaVcni!#6ac?C wJ}b*񑑜(qV]Xlcid-oˇ=c@<_>|&]vՔH"e?25oH0mnp!Mc&d!g'*!ijq*ԥ6L0VΎ"$@r),zlbeyja^le/)EvmiOϦmmnq6ѝnuvoyϛo}Obpʱut'l/>mb}IN}_O>@ < ؇!7r{}ӄ78qE`}-$bŨlU%ɖOq71CʡnKAxф GF2C=Uwӥv˓]2o4^ "k[~7+,%^cS {X%_JŏBdpHFc}Kf*22`iy$>5%{{ϡX <# ? ܭx;Xp)^5bFd*8pl Kv)b'uWf֞%E`2/K./hQmtlB>0P)W[:{lDZH[R(beV:؁@a.I8%BVd'1% `J`kH{RyNna!+ZtP$#"1Fk"8?q]Ro ͌#Pб"_!kv:&/>G2#y%]BqHF e$2 s0tGKg$qR&trx2r)nfԑ*-ZcU/%h'$AI*C{@F^,1n}^N Y 0> ^ (, "&.1Xm! $񇉀r>290G~@/ϼ4Q Ddrm"jm3F)6w|s.Rf3- _C#9~o/f͑93;!a6+5s<э䭞3=1s=3>cމ)#3?RO Jt@ @ @4AtAAA!4B%tB)B-B14C5tC9C=CA 0BDQ4EG 4FBEa4Fet gFq4GurcvGG-N+HHa48| *ICN JJ+<ÁKKG LɴLqLtMn MtNP)NtOL- OuP,̏5QuQQQ!5R%uR)R-R15S5uS9S=SA5TEuTITMTQaJWf`MTJQXVq?uUL!P$:D*$WK 0ź»@2@GD. ZtX! ?U1JYvu\g/}VC/]?]! 1ǜ#!C\iu#]!&+W auaS.q%a/8bb^V3ĎZJ` EK^6ea}"r ޵e8{^ `9,b)6@hA)fC?/4C Ghk&]g-iPSe6X؉7$X`aҲRw[fWfx-MgZ;,:}so~2Џ5(%q(S" 8n,zykoLYPF)͒ݥum, udbT)2y[u7(EGAlHv0*G,!Y6)2zq+bŒq|t٧g/b#(|򉾀/3M@20^: :z;{ ;;n5wAc-1U%`59Xⰱ@! ^]y2E˜kW֡m+O&A R}R>jf`-Y B_?fVA H=-2\9*}dwP6[-2A{%c_!l $8ޮ_6 6ZrVj6n`SY6%iM/jsMS/E4# s>׍)!z4?3IXԧ0C@B>+G NtGk8 ?c"7b7kPةuM>v#l9AVdb-!|q;0z?<=:حsA?e'?ٿ??Rh<"%|B)jb-1l>5=e'm= J xy8BFJNRVZ^bfjnr~8:2uR~.6>~ #'ʎ*?CGKOSW2Zkosw{[aϮӓ;so "РA "@(q"Ŋuq㜋? )r$ɒ&OLr%˖._Œ)s&͚6o̩s'Ϟ> *t(ѢF"Mt)ӦNB*u*ժV9 +pЈa,۶no@SY ͫԧ  ,x2NxG2,yrGRάys.$,z4IN-|_vZ`ڶΦ}{7o4. pƃ.qΟC.}:֯cϮ};޿/~<ϣO~=Ï/>ϯ?X" 2ؠBRXbrء#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb[r٥_cYgk٦osYw♧{٧Z"2ڨBRZbrکZڪZ⚫ګ["2۬ϾR[ibRmKiQmk##. #v!H`A#'\ "@B %kt,I#tH,xLV5B%RBox7W@q#_[;R]-n@ȣsU* LܱP@Z-ZՂeD 4(Bwp^2LBF Ȟ]pk`o2ussiFwK " 4v־)8U㑏=97de7\ u6ocl+~UMB u?UW;Xr['y =qj{F!, @pH,Ȥrl腠\Ρzx8**|NoL~R BvDRBtrQwIl_[]K|cb kWěQ jv QCߎn GT\Lב{`"CoL<jlÇ#JHED*$Ï@ .tWU=V, R5kE. JѣH&ɸQ$oL ^lɤ0FX(@C!_Îr \!Z3v}W0nzW h*8`YQa%#ĨQ|OV(NpnG$wɓ/F-tPgk9OfV߮{(7(?{prV,fdymJ/>!\_A,LL>a81vNE?{.yNʷT,*FHE׸RVNGzT'.,;m=Y (5 "s qiܚ q;)r !b Lz ` BjE*Q@IL>t SG#g04$!yHH@Zr QRTI#Ip`YJ1Ag%h\kēNX `(3q-L2Lj}c͌4IjZȘ6nf9b{IraHt~ @JЂMBІ:PB*= ȼF7ZDh;&# $Ej'du-?{{MF9ӞF-ZH(:E 9!v&Fi TG`Rm&ԧ` +49R <@p"Vmʄc%XWEqCk⌰ K/w}xթR-Xr>/%0ŞGtf#2i^[ʅ ~!pjJ3#=IfK#K赯 . 9 IP+:as#hfڱЈe@届scM> 4x(C)K,`9<Ѕ.ןT{!҈"ңp>Dr ܂H-_gz3/" qݩR8`rM4;eu %f`w8pɰHN2ܩG: Z]Y%WJ+n^,9( 㼜+ddo]I6.NLfATT(O.um]+=qh c'AF/`E]9#(vPՓnsAZɅ.DO Vڰ4q?Ah46hjP rmI`s ]Lum3tIpE9( QD7L. /u{s/bhhri([sZlZ Ke('pWNϢ߈#\_<J=ւN#!ܤⱥ0,=ekU!c<޷8E\ K{e/w{(FW2Gc})n X޶/~T6 WRilzg7tO E51 VJcM"/+R庛|ѫOČ1ɏL:^O$I+vkq׀hMX4hwX:TӄX&7u 8\'.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈9 P?x @5ЉXx[h8Xe؋8XhAƘʸ،FV8Xt@#hڸ؍h 8X`긎؎s8XXh؏=QHYys2ِ9Yyّ "9$Y&y(*,ْ.0294Y6yyvaWQLf1+Q=+xJM39 @񔉐Rb<pA[ p&VyܢKٖʄBR((plp/ Te (dHxgsT [Gz[nDAH#7R i'bV@-`9yg34{w7sɖsDB{a?%Xa4UR&J }_5usBg, )g[2GF{i Y$IVaأ~]lu]aD4I!us“WD_ԁWhJ BBG!Çre^a`y`i&j:piZ+>:bB%3v%aQ—,Uxc4&i"E}aԗ^ţaħebc{N`Asim|^w\,v(8 a:'VViX>a7-'[޳)&j*}g6+i cNgf`YT=wgfg.]:-#.ys^i%}L|&8088z4-e4Pz71=60V߃*2#+#;.3"lo8zb?zl57êKsj3 p{p@bC6CɨJZ*J5v77mszoںs'ڙmJ|QJ<W$';Mi 8r̖;pZ_Ast6Rܺvs Dg)0{F6z>*^-xzvc@2;)>Gvgv ?S˛U[eYWnu@'x#A?:T%Ƿ]~ۻH>NDzۇ(ޗml YWo{tIL@:~*!R[~K}0'+۽ ۀۿDN|Mɷ <\|bNd (1acr#\% M2u[7w:U)~(iK~+Ka>ٲTMN LN~>^~뺾"|MzE r΃\MI#T ">@t þ^jyðd)jnh0 ~Q1t "sx)NYmW~pK߾GN h,>PI;ЗY#I +u] ΰE̚FCC>2'IřZJu 8ȯEZ, $x4K>ȌE_0pZrTʡֶ4ΫnVe-? y\:ˍ4 Uμw_̴kZrstϠ%́OK_|`` F< _d^0<~R6TN_` ʴjN)O/ꢆ@Bڣ;B%f>%?&5iߝ;& =m09{ze2IsNAh f?#b%SgfvF(`  \:eCH4"=JeǤ;T\0 JtE /or5ee%8.<䔼 , =$6;A #B-T=FQX.4+k i uy|N5-p0v-10%%ɴ3ӥ;"P`~nXb7C C0:JCHaNÂ[s1TF:x&X1$TQ˔H$4hV=!7Sz7lYgѦUm[zJ 1R«C (W.6 )0;6YQL`:\qLO v41d#G.rSL ["wGfS+f[+Т^~muױg׾{జǥ(/D.9^[<ͫv) `'Z%.JJ&EK@plQ=?{Xʃ1<P1 .Q OItb4j$G#RM!3OU2Zz`Kt8[9%͖W2'/9`4K -D$ GK0d&F}pmq-s[u%sߵQ)ũ7/qu`&@9h@l`B03&&P@3=_<-X:+#͹t葑ְiR_S$ x`E8i>dM[ny(b&p8dp@f  v.$~>80 X#xq6>N,sbܥo<%TLdQq -^|7p u] x"7D. p+;pCd'Gw[/*bow܏_~uU~@(_!A N~UA wAB%4 QB-t aCΐ5 qC=D!E4D%.MtE)NUE-n]F1e4јF5mtG9ΑuG=QÑBCti HE.\< #0K@A씚 b!HQ4).)_BԎ-q!e{=bɎYO41IhH y=o`GIB9Z[!f- _ԛ8ԦW\SŜvp5uQc&sQ1&jɦt'/]Jv;詧ik#k2YhPjs=8Cc60ޒÔX9}f5 GUlx|&$YMesrD_y,QT9N@hp쥈ċ^Z}x/Gs% &KhvzQ~'O}HZ;Gt C&)Xy#;SV41B;Щ`l9xMpORC5,MP[jp OxI FsmpjڮjGbl`XJ p3(nj?/K:NpDPıPAJ2Ja N2$Rj@ 0BpQDԘ2T Xp d>gSnT|PhNn pk5b\0AMZDY$U̐70 +7CfKa],"Ӑem_&c 'ђA~kzƟFy0 'fik8QfF3fŰs>>>3?s??j4l-X0d2)iZ*M)! "& LGC, BƂR!4R"`@)e=8 DA#4GQ  O L%HTЌw2EW>l]xTAAEpTrlK` & OG4@rW<(M O&I"SICA\jM IF4PLqp`F uM 5B۶ `׎@_R$%- lm R35 <.$O /j𙆍Eh2R ׼KPyu5 XH- ~GߔߚE .`^!U)i(.+[a#N; I BGWU?MbC%J0.45X$袮b-cF$cg4p$2Z˄KV#VV PugK nr ~T @Qh! O_,d HFE\!i'J4_lA Vi xm.C)!R$OְO=~ZbU{៮'AaqJfpdmn=~/P#/3o4DO q#:XעFLSidf$(7*m p׬ ?yS,t@tG1Nsbj* wpK21@vDf eVXVUD:zäU55Ft#OhFst!ŐNķ! 7NSJsC y $~9CXWa +VCM#Ti|q?L?@%b5VQBgSJ( T=}E[QUuxt]召ma7U1v1KuaU Xl@sXv8_uKE.ۘ`qFQ=w+|댃kx}uYFoF`nTAx!rv`w /*%+!7dab_6$GӼTAK"Kk9'9BR) y9yɹ9yٹy4?XU).^B>baDc-Lt N5⮋DE9wf(pSeɔt{,l]!lI'BeMI:Tvγ7H,fzgYOj9c;ZKU"UzmՒA1U4oBRz%TZَ7obKC#N+du:8Y㭟Y.s^y7Եl;d,ngЁ u t^N\q:ugM IVbbdB{ &Vd=k:icTKE=h.1j6;v"(!q'/!Ji:i)j/atx-e7K8M_>H%|[1\ ]Ub7k <3KCP|Kk5'O&߹跙ˍ~7ň~ZƠ>~빾>~ɾ>Ş~rsz~o!_5^Cs+?0})/%1?//?9-7A-CCY,q[?eimq?uy}??,*2?J%X?QSߧ6ƻ?"1ߜª9?&>!h<"%|B)jb-1l>uqYx<9n= N&*.26:>BFJNRV!\X4lrX~>.db #'+/37;?CGKOSW[_cgkosw{ cr "'B(q"Ŋ/NB 0 0r%˖._Œ)s&͚6o̩s'OZ1U *O<38BI -.lÅq4&W4Hd TB RZ0Ը+Qz ,x0†#Nx188q jG2f9L+_~Շf\W GY#i T#60x@BҨMn|9ΟC.[n${mP38W3FMXM4h i*em؇vp鏧j8N{%^mbrL9.yg$aˎW&؊IuG`^) Ux?y&Y ?u9lxb_+i~]+'/Ex ۬3\7H创z$!h@L,j%b)d2<ŰIOJ/B%F;?_}kM t *XHn2S`8#3ޓ/YP JD%5Ԁ3w%Ź|Pamt_ڡk5K9-vOt\]_޸C}-|<ͅA_ӰY&Yk~_>{>E)~!@򴻹d}@ €Nc_?M;͓;zU [?>djwFu'f4T Qn$i7C-3Ah+b1a(T:wbDJpokSԪfQfsAJuȕlAQA'qkσ^ >|j!K8KGw >//e 5',Mj2z[>ݵo~^f83$ߧ|!dv򲏾iN?ξfvC?)~:Mb(_PMݞ9`!  LC!Q`4'9% E! فIC0 ^^˼  6 ֵ`! Ġm$@ r *5 & aza!` Π B!Li(B5QPi뭸檫jz , 1g'BAJtEQg*CpZZ+]-#2Jme5aAz?P4k {Y)NK,l'LO{p#߀WgзmW[mEp:%c-_\)@(PHp$dŻ5\a4 yc6?sʑEH G-TWDPğMUxSA%DiKζ,.U%.)b :aWM u#(kcF'(U*bG Z09_z͜G08@Bh(`?(N(0lFV0;'dG 2v b >"LaH1wiz*T^LtQ4~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVխ|JֲhMZ9j ٚ~:^&.t!5ii3/q9F=Ӡ5"uoʲjEaU{0UiV.N- b2k<>c5Md X 8#aNxcKKR$NA-A?:%2 K{b|%v^R~2 0T}Y'ɻ}~wr՞no"ïJuTCTu@75W 8_/bzxM|8OhhD`2H/u?B%p䆳tw>B%!@̑׈Fu@ t9{@BEGv5C@YT}H&QfE*1N>^<.YFMtF#C2dq`CڱEG C(FXHdB(DeTw%ȍM B3jh]0CWCCިFUFY R Z"xǢBSIQHpHHH(ҌmCDfT7V(ybaq84K0JIĒ0khJLLPQ7RYVyN=Xٕ^l dYfyhjlٖnpr9tYvyxz|ɖvaghx}YpIG@%\C.CHqaac:jVh"AٙkfAa@!0 {dve)2 k6 l+!ٛi5ABIɊiem˩G!IXC@\C&KbkڦblR#Yk;,X8F>lm^ LJJ|q!lcYʔ909B|Tqp@ikoq̐ơ搏x 9"GrAQqqBic(;q qHڏj,'`)9&Y!e9=TZD\SNw~u9"F0إ^27Ѧ%?Zv$`(U<`wm%()&cxyyWx7f؅s(r*GxJpv}ٜvwZ}V٧y* zQ)=D O`0Ҍi;i8$ڂn|9|*37A/Q`/њ.݊|~ 䚋0řH8:~>6ҮXnHs3_P.^3423+fJcMCz(=IJ5 T^6w&UX#'|c`cIglD76[ @+wK9IXXFxڌkx8yIjqV::*J}J悆DXXAM"Wꪥ Dd>Wk&ۂJ٬I+Y-g$ID1 }ccJhKDKbK[.IEL4dN<4kL\Ԛ$<$L\*,.02<4\6|8:<I;ę}=o`bb)bX`x@|rB y0NL|ZKԦgPSEh V̜JƌW! jU6vY\hqeF7ȩx0Po5 Lqpƺ~=;shAi;_,<(cp0ʸɧ*kLɩnjnFlY1ۑ{kQ"T1lXl ɖY7~p"Znf.Ԝ|̽Ǫ]V αxrJqٝ|ή°l˿jj#4. p*jr!ջ&(J_3f+|Ѥ**q'.8j69*mW[}%׵wHq6< 恼{ck |֜%Ls6lQM(h6!K͸%{36Wނ(^.˃/>1=z͂Tn}@hBNnmLN8R(d­ȴۗ:QYjho^,(7΂* -~1 A.=篊Ɏ,ኾ hӈ"܂c6x\ZkHPbQ4Ď8WB8,<>^B;D B/(J[q D; H=Wt mx.퇧m0FP؎zgG(ӑ葼ˤ{ ߍgT 0 <  It1SaG?iLo c.KJXqSaՇ!_M`όض4r6:AI[${6N)|</5̕s—O?_?_6aFA^Hl|_SU;dQGf O_Qg? xɐ PU pl Fa(l fX4It>QZ^Y~a\6ib ^[d**4&.8.. 1.,4".88@)&!MOQSUWY[]begikmoqsuwy{},./ ^=. 6 !% 6<8;˃.ū[Qj@? PfP7E6@y`< l@SC q"PYl%{ iqLy ,#LRI$Pl'R)+R-/ S1,3LS5l7S9;S=? TA -CMTEmG!TI)R^: 1T {;׸jY_wbUG[X0P>h>B5T%q gXCSVx .KP:`Whp;ʅhkXXK i!;<MndGae)z{򔱜e-gX9v-elq.mvg9ϙug=}hAЅ6hE/эv!iIOҕAqh u\hGC <x xqO1qoAr%7Qr-wasϜ5TlorJ Wɘg ˋi|I:wE6tn+6kv$W5,beD.^k\!\Z+uԻ5aH XG إ#ȕ}^g)E«X`o^ o2(Wڝ/'zР[[zߪH|CS-Q!f(s7?(Etһdh2x,u\pXAs[()~LXlۊMWc>R ^*^$[N%zfpo0O/ g'zt< rxr2q:@ z4u| XCylwj\^LNAdx gnSBo3Dz Np'Xo W[8F$H*N[ǯԐ"ЃP0 jp BF< ЈxNƣ< ~h )dX$^4 0-j jəFCW:dfҜb+n,o1!r(ac!(a }R$7:+ +V*R| # frR+Y*-?R0XoV!#2@*]`J!zcP[#.93b.*(4"/E34}@u(/0/[ h5@1k-ϱ '_@A@l$-#'pt7IK$1(=:3 nZ.e5 K "ʐ躋xK'%R0{kyp(CP34> C=p4GRtFS,2r1Z B$*,4YEMLhsE#kKþǶiVAe,AA"du".f8,BdDCKOtLɴL4MtMˤ4NtN:4OtOOO5PuP P P5QuQQPut+,hbiVpj-.ԲWSCXʁAReUϊSZ[>-q ^E% `f `cV쀖.fu'j˶.X1$,BYr3 uZ5Ϊ+/dgv&i+JI>4Ѥ_eue&rj/|ĩk0/jNFb]IvI޵[f[J7O8S'` M47evg/ff*yjY3j,Ѽ ypglJkd*|Z|Eg'gWpBVC? 2]RH[b .v'o)1ql+XSm"<[VJ1|qqݰtHF7u7{9w,aB|ovq}H o6{&1=cmR+3iaqU'lԏ||s$xc 5lxԮ'E!y2Iy52vB~izUR#Ýavp) )'}-EWrŸ w&5ג﷥tg+J^’b7 `*a.[$ *"[ ~]@ 0}#-*{ 2$Tgxwe76Awux,8Dè^xuQs`U^30󴮘-8%U7/ Z6x`0x@ & 3xVV7:Xae33G-TS+_DN8Ss@GpĎ`2˖3jZTtv q;25OrGك?/GAdtXj4-lzo{E04EOuHM!aiTӬdvvH=DzԍQ$|O!-JN߈/=D@,IMQ:UzY]a:ezimqXu>1}ǀa`Z \=㨙jI٩z7Ñ:}{Zڦz:rUez ;{!;%{)-1;5{9= :'M[S@0] ? ^'5l;uM|;-mz͸ܚbܚ{-{جqʶ@Ȼ^;{ٻ;{黾;{ 2ʼn_aXIHi4"SK?:%U.ꨮ)NR <xĮpU0DŢ OfWc%M%;B5T :QW?K#>9T$YSDow8W[qQ4'2Đ76E5YM 'qzX"x2kE1֠X/3)?qUMXQ-CX^83C=^XT]>uo^/q +2 5*i %,o?2G/8 zluZ9z LA5 Lb1:!*n@"Rrekosw{Ky5'qe䚃 &PjЩY(xz( 3A <-鐗T`FlB3"geDK|B]v rzp%ƒzcS#F&VHO#d4iIKv-۶n+w.m O͚:x/Xg G]f}'J3XR栳YqhL c&bƎy@$ L7zr WXp5JEH2fBPǸm֥`#.ϣO~=RF~>ϯ?f`X" 2XA @l RXbrX6^#X'+آ/3X7☣;أ?CYG"K2٤OBj!/H,KS'_՝&OpsQ >dpE]yDPlyD=HHS[9dKҝb2ڨ|JE1Dn1NGujy(9E;|eajyN~>W&'^|atv| Ф-۸ L%$j*rm\1ª9o81rv;;Uvofx%Z`~{sijv<b;WYZL%'Dxg%WLČ9,.5Axz;<P`X5i[Ĺn6$ I @R͚n,Hf0}VdEE%/ QQu^'L51}6,D`wpجbo@9yD^/5TS&m7T@|UvlVZܹk3Y`c3fh@G4O\e| @O˻Haθ贻цfE"t#"X(`TUqHhl<8ю&8JcI٠(FP`pyU}Lj֒e#fA_̞jPTͫ6L'._Q8g6;{%U5iN0qR8 1 j+r"SfeMz{Lϝ0+0;ܞ7I1KE!.[geKABv8:1{9B2l##9J^2'C9R2l+c9Z2/9b3l39j^379r3l;9z3?:Ђ4 mC#:ъ^4GC:Ғ4+mKc:Ӛ4;O:Ԣ5KmS:ժ^5[W:ֲ5km[:׺5{_;6mc#;^6gC;Ҟ6mkc;6o;7ms;^7w;7m{;7<8 n#< _8C<8+nc<8;<"9Kn<*_9+< 2&aO6W<+onƷ}n0;nc^J>o[)i S=^A/}{a9#?_>C?ҟ>oc?>??o?_???o??` `"`*2`:B`JR`Zb`jr`z`` ` ` ` ` ``a a"a*2a:BaJRaZbajraza@!aڡ!~ @ᴅ @qÅ;4"ⳑ| Ć;4\>Y$a%6@! "´YTy)V)ơ@R/D"@}"//Ũ&+TJ,"f3B#Jc0/.p!84J*0^cI `1rX <#*6 b *":N#) t]?˹~>bw.N*4MdE˄@ HGJRnU!$s( -YYt eis2*wݺ߸Пo}@sZ /LcBh&D*G%),gqMO)ԬՐd#^M o)JRN6N8Ch}a5dƸ8wTFQeEbgΔytfjMZTyNuAГ"ߛPMB@4,L}.{JLI R`K+=̟S yZ,)`ׅ<o㒴/uUa?.2{_8t `kiU[i抮^@\ IY;[m=$FLQɼsjXZQ -jN#87专)A 8qq-e[87{wLK7C[qU,[*I*P\ iYM -Ѯrގ,@;-t"'*'vՉd]G75ٞ%{s˝snZYym.G^@q[Aፂv˷ϒڶ{%9hٿ{;(1_멹>Vt|B ̞ʟf7? TqQ怩@Pk$8y bv*)#M|*fwN1hjlqK8Mx4 Ѐ6((4OxKio%tLnQ$xpw?igτw҅ 9FhF̓+ւX(N4EBxr HZEC7xw8luCІoq$Le$Qtw!{Ox6tUU P.(#sgWC*8i!74oO|S S>eA5:RTt׬w3vj;ut7c]蓓HlyidJd˚ˎ%ycʤZ>(\ǀ; EzS岿su":G}+I + AD;B|zN TE 8xG7*?M|Ow}'EOs ,V8)K4Zb37_S5ơsrNv\;ACK5FkydZa @+?uXHa;#wwղDJ[",euGwK{dF9eHc(Jk${Kse;x(纲Yk#IHec7?*Ek!DXBNma/kdDO+;6%Tt؃&=D;uPB72;xQxv' [U뿟zU@+aazQKkZWx#7%Q웓&(RR07$duŸWWҊm%TU*L\uᖋ;1P<(U9xFƽ)\TZ\"ioHi~SxlM3 35/*PmucVEO,I].p"j歡ԣ"Ȭ)m԰  > ~ ">$^&~(*{Q,>!*gzV }J֘[= _64[@܉TyM)}}U晎 yqIV"Nkf|'C帍IgH+gtgvplgh (f2Hm?mKi[̡˼\I՜ 6 ԶFX:k^J&hkKlj6/6`,Vr&Wr&mzM^opfVjZoNqqn0pflƃAIqqqjw!GzBs8jsvD{6A@*y CatsLrтW㞡:*Zmκcsʳo5w+<ߤ^hb`Wxsvx_ҩ eтWt蝻? |祧z"$씝{Z:a/v(L?-; Q>Ql?ICBY_}^[qo4wڑaЊ_&ߗ6?/_A/GURۜ|! ^Ct+k(A//Uꮯ/gݻ5HDvQep!/#&zlQq4&{Gs0t Ot ì3\RkpsƒZ ;՚.8!#%')+-/13579;=?AFF=܆Vfii :\&. .P:9~, c(w{/ty}=ϟy!=hRFO}pq/"9zPA0@9dI'QT%*/_X>XƆ҉.)T%:!IKGr0*CQn8x) Mc;w%PoJ0#F 2-` 2*eDVƝ$m&U7jZfּsgϟA=4Q7" ukׯaǖ=vm۠J {n߿>xqڽ (b8͡G>zu|}?|yѧW}{Ǘ?~}׿ P ,LPl!P ) 1P 9A QI,QLQYlaQiqQy R!,#LR$hR)+m4e S1,L17S9ld=?T5CMTES,b^*pI)K D& OA UTY#o:UUYmu;9ee/Wi[Ʊ_ 6!aMVe1lEX$cViֿ| Ao=/|pMWumwWy{W}X .NXn!Xb>LkmKI] :NYYnYhˣ&E"`ΉUKhHZR0A.dNhA[1%`9ι>i,3eQξFS{ @|?1*=g* ?k+&τc4/iOkDSѩ D$I߁$] 7I:dD Z h Xbwn2_:vߒt~J?Vy$/Du&V:xqUǵ-aKJez'< NlĠ<ɬt˻wv@О)6Wq>mD# =ΘdB2 `OH0C$ <𰇷;R)&aU0$!$@# H,G9qph)!v{,DMDd_"GE`@8,/tӄ jPXbhaHB X%pMIfFTv8#v< \ec(['Lae5v!Smܒ$T{Se" ą -2PvtB렂ln0iIas}E{Ğ! jdz q^^󜋥dKk>C:6œ9+n-\=^-ߛۋԑpdy 2`5Ŗg耓6Rlw00LW %`]=6tv7搣WTp7p/ w!qO1qڵ@i'd|xQϒKR:ҖX8BDEQ[L9,"`Qh&7s"pP:`*Li@{BbtJˇ¸8["=s'k7|^R8D̙{?'G>X{[9L@s aث"#4 vJy8jRw}?T= wʂ<.B0.ciHitО;Gz4( 畎?Fb`.b]0]Drq%bJ ɞ4j I攫 501+vK`aothr#=߱rNN1O  QQ1pkR #4hM=`#k\2%d cF6i70:e &a&'-h QfprܔXns>>>3?s???4@t@}4AF`jA!4BOd.$B1C|2C=tB6>tDIAB9K4EU?NAWEa>Z4FiFcFm4GuoG}GuGtH}T ,H4GnůIctfJJJ4KtKKK4LtLɴLL4MtMٴMM4Na: 7SNyL`A(OU x %PE uQCQ!+R)uaR15a)Z2S SEU`@EGTTMUY^TuU[5VbnOVqU]"rW}W5XuXXX5YuYYY5ZuZb0J'!o>F(h+<͵G6xfvg@]{1[hz3pft'~N; SjKk 1\ݚgnf~n8iS)U (QNgn&adq.Mmk!됊raq̝Jȏ z8!G;E_9aKiB.rM+6gVgЛKOyPVg} \-|g|Iڒmq=9-5ҝwݪOqx5 L33ڑ _((WT_n~0SŶ6yؙYΌ*+kM~[џ\r`؁%#Y(̄/uJxű`L.GLj.k$pÖKXtBWK]QD#lP?-Gee 5ipX%B4]`=%p5 i8 2$n)z}8?C?_yi:UH$,&{d1OK w ?p)q RyO_isCWsQ3΀{ٶ]Aw1!j9o\*@ tcA.琋B+ >s'Ϟ> *t(ѢF"9dҦG5:*u*ժVbͪu+WZ$t ; زfϢMv-۶Z0@ş۶dͫw/߾~0'`!Nx1ƎC,y2ʖ/cάy3Ξ?-z4ҦONz5֮_Î-{6ڶoέ{7޾.|8Ə#O|9ΟC.}:֯cϮ};޿/~<ϣO~=Ï/>+J?zQ@" 2e4RX=̅rءJ'UA+3()H5أ?XU\0@G"!KBSפTb[ngG"[pc)\``k٦}2)Y`w♧c!ȞZ"2ڨBRZbrکZڪZ⚫ګ["2۬BR[brۭ߂[碛ۮ[⛯ۯ\# 3CS\csܱ#\'+ܲ/3\7㜳;ܳ?C]G#K3ݴOCSS]Wc[sݵ_c]gkݶos]w㝷{ݷ^#3޸CS^cs޹矃裓^駣хкz ?N{zlp`ID0$ ;3x$[2"F4a%@և1%zυ#0p{0|  /C@=ha ,G@j= 0@^(X=̄@JF.0 ?@}(@@ʮ{D#x!~, x'"A4H+ߍ` º8#Wb7"C|"C1}r!D5 x„CsO@ 9Hp4@@"Q" F!a''g&K",b?P\!\(-D3 l<sJ2M $]ȏoFT_{"Khb%LpeKS" Wiq$@&}UӚ¦.x)̟>l|T4BjV @ :1 0Z%H)DLNiA#9*?41a4S&L#{ ( 8ԩTGժ"XuL!, @pH,Ȥrl腠\Ρzx8*؊%BT1~_R sDtBRuIl_[]Kye hq` kWErtQ jt QCGYLٓx_\܁0\A1ȪIHŋ3j440 q2Ju> Czxb>O Kt~^މѣH*]ʔIdž$ۦrT 4dB5`5@Q" n J,Z]uXLums W5Ё.YղɖQ|H[)o5rدd!q{شװc˞$VMukFqeea@O@gg'R1GIObh摄^O` W%zyPAp;$@rA%Cۈ$h(r,V^m1^.l@  qYgqHI%p q_2Cad9]Q 1Nv`)xvaodF@ CiBUxfueA)*蠄:[^c?Y#;eyNV$i `hG٤~!QuU7&jj*SoGQO ,+!t]ʪL񆆈F+VL-RD6*VEZU@*r9oڛCHZ: w>NI;CNı8$H+,1?h~Gk\':I۝ Mܨ s q.4i=i W+~ @JЂMBІ:D'JъZ4 o"ƨwQ18 Q-I T&bz(_j^P-]QƊ6- '>6RB 9L?CІjMҦ@ XAʒYSC*k:ʡf31,pa X׾pPu dsdv^'MF2YiYB+qK(V1cH;y]OӬ ajZS„GJVSO~,(%‚Ͱk4ġ9V5;rxRZ7Uě]0p~*T@=πxD4:׃h?nGW}a).r'La2(a婃s{}${Hs~LLKb\L0uH:∳ !]+g|&RPHB)In%A1B3r{: 4Z*[)B'lո6p]hޟEyأlefW6V - rW-@bh\Uq=Ym', &PL[Ԯ7JAL/Op˕ ƋI;sм=37OF(.E*OF#V S{mIh0>ae+J% ЁRܝ[gM:Ρ3^*Ymi'HݧvBMwoq ^$jMB}goԇ.1ѽ${ڡe[VCۃRkzt/3Ok˺ m@0cB]aڿ ۞ [:ڎd-vtva$tᅴ滑7Qf'f&ΏU^V$`:*)t3}x 'B=Dk6"s 9B/Y{WϾHY$>:1Lii"!f^RJVFl2ɏJ^V,g(׮Wru_YLJ' HI 8Tc!\ĥ}QM4[ M6N&xsNNM%0k#O p2:<؃>@B8DXFxHJL؄ٗQ?]u4SRu61P؂N؅R-t=b C R`lzGuTHUZ#7uvgbVgvX .xq^8TZH' Y0qd|6UA`Qq(+K%{ bW(W؉qBCr(ø@؊4]a1\YAm#sAYֈYGZAeb[J*PX$0JZG瀹%%JU&f~\0 g(tZ:7Ҍh=+Ee]]STE"{w] 1^SezE_!_ F Et_)f )]H}V/k!28ʵJ=Bb[b8ևj#g*'chw Pc.8EdZpG (fC%,cx0g(uuYbr\f=gEDi!KF$G"No4<(번b%y ?R+Rgo&Iw6#tᅍhtMgb2f/ֹ&g`Mi nNuv|'%Ttt?!yNFpUʉ(.ܢ-ibȝMjR/'RXqm 6X3v)BYxjƖ/DUMs=z ` #wӡ*j II-s7,3ZIofwC1pWRm 5 5TËupfmjzGE5:7 &eV2-2C4GII?C7\ycjF;WQ8)ԥ3\ qzw, s)J&9! 8 xʣ#AqEW;x7Z{VmzT8^D%g"65xAWuRI#BsFt31<Ӫ ڜق^H#Sb&?Qc@!$:iw.{cb p@7y\rxJy%0o &Yby.1Iy"q=v9Esww"KB r204d>سU=D}GD%#{ ǺgT|GY'EE}_ɵO@|yH ۑPN醵_;aQ!:ʧeiHG[ |=FEV{q0不ѩ)T~ kLWL؍iaKLz 7o7*Ȃ;廾CTi;[{ۿ<\| <\| "<$\&|(*,.02<4\6|8:<>@BYQ'7޴<.lʍ 8czRbsck&biGb0r$6cY9FNG@=o>og[,nxtev Ajs*?}zNn2͊FrFΏfΚ^{p qWk}|x#ʕFY>\ 0f~$-WN5 ˞vMnrއEJ3~sB'~c]O\5ro06omOdpr yq}$ G9>V'G*m0ϩfd727WX7׮3 tcPлaH'<M72fOvZ>+qV0Qww;!Nϡ4 Xw水|G91px.Aw;!l7Hfo잇 Ɲ4:}JF[@ɴDOQ;_/X_նGUXkR|3}^z;fưejOzpQ֫*܈mG{yPZ((t|&߀ˀD~ȔX4It>QZ^Y[\]\evq^y~z !&4,."79?ACEGIKMOM $*.,P9?hkmoqsuwy{}8`A&TaC!F8bE1fԸcGA9dɇBl!A/aƔ9fM[ \@Ä :hQGF F:jU0!U_r!NUm[/T[wAV8CŐ"` "u2\RN-cE"F3' %R&pm:[z La"4+XK֕ńvHZCv'n\xlW¬UP!]5FۼV55P,HL`x@W@MQN9L^,hڗY,B#rEwuIg:Oy`C-Ńy7zQ)#֚H3nZרUǒ`ӉujV=4x:cHSi!\Ӂ/S `FsZq-:i->5(*YMJS;P"@O"|D{(SP@6ݓ(LGvIgzPHh0 NӡA--![$4(gEَ)9?iåڐNi ,1Th>Hb%㰌- kBI崧}_g%1.0 H9Ţ`Ù➆Sj3{RۨH5 h\P$84, ŪΫA'MZkZMG5S%T@NrR3hn8+XqY6Lr Xn\"CyX!U3j98V@ SΙf^AL9FbR/+^זȓm^! .# 2%-`ƖU1f}+ߛWI ]<o[cϘ5lc+D%E62TMve)OU򕱜e-o]f1e6ќ2X lc[ 9WZDG*ȍmd(*@kvˇ9OZ5 gY'W!h@] R1\m2@i]`cx/mXYXpaqލM^qWv@P%xl'jnRse\eWUk>k!a - O`v˗+a>ahPEq;KI.X1^mHݷb;e)4ccog8%hZT5wyl$9grO'lys_3uiÁk+i˙o]/'f_`r:)#'̙xTwcUd\zSx?7B;.<!|ңֺ{vbR*.J\]T{}Q   i635k u5h >4P0FmeͷK1ɕݢQwN`#%~#O1ff'D2ZW@|)U(f;k&Mܔ)Jɔh@I گix )B_bjtBPLZ!aH,ޫ#!RE"M@d>k` M.VRI.'ًa 'hWԬ(pl( (),Ak(*,df(+2,r,ɲ,,2-r-ٲ--2.r.2#-N~.r/}20S  ڠf031fE11݁12)2A2O25s3#23A343R4M4q3K5Y5CO5]36eHs6ms6a6u5Nv38E?L8839s9993:s:::3;s;;;33?M?@^s@@tAÐԎA!t>Fc"BcBWB5<04C7CC=DIt;D?KtEn"Ea4FetFiFmFq4GutGyG}G4HtHHD~l$BZPI ŮJ}hLTfK VOp) Dْ.Id+nDвd O L' PZԊ ̈`ՌբN)phtք@ yy PUu~JWVEt^ GtTjSq0izDO0T UW5YUeZ Yw%MF\Ί _/@ZZ_>$+LnqH$BETIc dDfHOu`yYfIf`=}ij[p^q|z mZa{fc;f[.un>VXȦfovGO-Pvqqmd`5s`t>U|'bL=NtwinxGjvM jߎ mQӭkv6}_I>Q`6oc}B~TVF4k*"|jo5Op^q'PLq-KJl-wqMt `6 ڶ"qσjQoewZ|(cDp Hw)3)(Oiwwi~hCLtH$6niOg7|e &7P5OWaG U'~bxe|Ǎ|ɹ ڐb?} I|%x|mUfs 4)4Q+Wǖ  ~fez_Hju!Ovy 6O/7q0ZoY Q HQ6ze؄B{0n{K7}ps'S︪\QnV*ciiA$#\m{MMKLvJʋm,|x hQ kiK$Q2c;g~+ |1=i9Pٶq +vQ'L|>Pdp ٕqnٶ`qy 1Ħ[.\D#%% %G2KRy#2 ={%# &32TB'fØvF̞9`y) 1:':)5=Zv2>zIZYNK:UzY]a:ezimq:uzy͖L)Y}C4t p 4 QהwuMzON:# U ?N]7OƸ+k;~YGuquўMǝU$Yy\E++>Z_%Z\';{% MQwCn_%ߠ.Zƨ(=ƢBZ*줕H?ٿ?(^$>!h<"%|B)jb-l5~9n=_L6 "&*.26:>]T(4hBfjnrvz~]n p\D  X\ ;?CGKOSW!9\Xw{a{4l{CdR @"L  TT`!Ŋ/bVe(r$ɒ&OLr%˖._Œ)s&͚6o̩s'Ϟ> *t(ѢF"Mt)ӦNB*u*ժVbͪu+W~&Hڀ+ٲf ⃳n Bdq;,/~ TNxq#t2x2yHò ?tENZ : ]-{6"6ޕa;x}lfΟ!3cϾF/~<ϣO~=Ï/>ϯ?X" 2ؠBRXbrء#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb[r٥_cYgk٦osYw♧{٧Z"2ڨBRZbrکZڪZ⚫ګ["2۬BR[brۭ߂Kc碛"V. o:Ko,ޛ/> D"؃"HLp,pC]O" |O !@Ȁ`= |Fؕv.0r&p p,$h<5H-p)cs=I%\=K{e.89 s%~nvfm5;(pK.D`q;7u9z2$MxL4&*^uڍc 72K>cwaX-x789ᔷc9Ԫ{x#CqþؗmFꚧ?siO8 =.Iy{=|"G@f@\/9ug:9+6leUʳ5֫~l&+!, @pH,Ȥr4". A DzxL.Rzn|N~BPWB[CPuSIU]Z\K{~ mf |xh| P P C[͎iI^LzʾdQkjPFFXo`xXAHŋ3ƛWD(  $,!NYpIhEDDA  H)ӁˑS -1| Xb@ TOa FކF~ [D[DRtڳm85*^̸ǐ=p$" !!WɐՐ>- 0̀:tS h A=s|ʖ-ҎxfmPh"VZ-  ~a7/{н0ֱ%|{+vD&hoL6DeOR(@Ք& <"?kT7Dt1b Sm>ׄ8,nSBFN3Y$``)昌)( ?3]X~P!UTPl:Riqς6XoCy'2'l t8*oY(ՕbpVT)xtw7BI欴jyAe#Z$ BnjjR(;/YJ`X'6eBln8VvzK1: nHɊ,;ȫ8 ʯ6rMwD,%*[HdR-O j g-"% 0;K#0Ah/r1#2ˏp#PG-ԋ+s D͚hO S&[jG-e'2aU7DR"ν\}g)T7bu4s 3{GTvOqk 22Gl1Gd~SϢkAfJ8ueDrnī7|Tr=l1dJ1n:º(pv_bZ.eJ@|/7zo*s]J`ęE]13G Z7,Qͤ&`8@lL;}ą) s6m!=zX$@ g,B%$H;Zwx&6 6,)G&0G@C"sω8@'AX(E_ƭ!p{ |dzz{Z'0E!@*NѓCse$˥d2~ @JЂt"OBݠE% \_"zgRD?D@hEWaݳ:$k70$9SERtq˨PnJ h0{'*u{T$ CEmhwzڇz^4xҁ͆9ԺQmEv"+T+\P1ҕE\\`435"ٜD+%Uikg4 *EAe嵓!R( T¦Hjg5"'`5 r1|c%bA0-&:wIUq0%vf˔jmŬ|ًqCUYh}WKe:Uo yvH5Mllg63 H,>Nl φךF( ;f1ʓ.\SGqP ܤu #w$NulZ`E%rpyMmC<L1ˈ„bњG]+Rs4liG`dhg>oLӐ`i|) ',W8_!K8}wRR5-;ʰWR83դV~xJI7GR9ϥڥ'6T"Nحj9]2ً\:W2[0Mg!`f%Ža! :0b) ~fNn=X\Ӷ(̩k([M>p[]`S{SR.聋2.svoy"Kr63U2J=Q"g[O~𦓩N,'[kzC 4-%:ItJ*Z]]'y=VAN Ure>v}WGeX3z\b4NJ;eP{.r^[Z\*;s86nlJ.?ąL hia"Os{a60~]ǩ_O[@o钿0oSuuVrw~.i|WnoOb%wkstFnsi66t&Z~I0;w}(&G|"}}z=S v!\pv!sV?D?|> D)|͑iRef|q'‚C::@Dqi7tdj;4>l((h4x[4I(x[UIaHEvwH{4KTvψG[͸IsGP0=`ifZ!@Y]f]^^]ץ8 |m [X(Iϵō[Yy ّni $YH`MMgz0,$)\<'w8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yy٘E){MhFPY 9:i^3Ou,?ř8BYyh!@`XkQ7cY yșʹGYyI yؙy.IJ5Evqw͵=6'Qy+ٞٗb $$'?F'#FFQ/٠:wsa|Dxjj&AGH5:$Z&L1!r*#*Ԅ*.}s:<ڣPo-/.Q;zr`3<>R:VK3?y/9Tzhnj2u;8KZ6O*5jzx]_lgP-"=PD}P[ +t HXLa[8CBxD`8zdY2Щ%!XH I鐉ɞҺ#8zؚXYڭZZ4꺮ڮ:ZzگjQtAx&0ƒ9t d15 ?p@QUx"u!ʐ[orUҰ0] `ap?A"39XHkKhXcrc3B{39ԦWg-B]S[5C]^G b`f҅^Ci7z^\;wF۵H{GH` [Z/v`؉qae!eUcW56e7;iIv! v;c"\-9ci* bCjF!$Hi`'nf &gmj$5R0"r苪6y7% ;$*V>~K\o4{ S!pcp5,FQÉ[fx7:&m3lU);R[n>>3*0ƥ~2n*4%ϻx ,bGVȰz.8pC-&treȧUWtEG:6LlW\GA\^,0709_wnvhlwNzͶ)b2Gso7#E4uVx%XԥG4HS,wJcyM_ȵrX3ƕ{GsͶƪsG}|ttK`k{XrK|~7 GkuȰt\9PGՓI䧂pnGLT|. ԧI0\U<3L\$Dƞڃ>lnLm>[4O!8X 2ڢM <@[@hټB`8 ұs wcʉ7䇭3JD8ÛTĻ Er&Fl*c D +G7ѓ" ٍ(HS@̪xI|> I] T{!<%9#DKexKϠEYԝ|Zt؂}*9M؎ͮ2IMlq]ٖ}ٜ٘ٚٞ٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۲xl`4۸ۺM{=D`ĝʽ c*AWӝڽۢQ=ޱ -Aާ*xߜm}}h*A:z])NpM^ ">$^&~(*,.02>4^6~8:7~ VdR NPbUvkaSqVK.^ 5{b.TbLXUeKV+Ρ_RXX細WOA'깒p2Y8Z],U]l;H[5][^us {+IH=Y{#J*xk~Ͱ~]P逪}~[-ꛞ c`ºѲ1aK+j+vωџ|TkVkkWoj~v(FByr0)tEw?XҰճϡ(L>p"q'zLji<2t_z=q1K(/*ן}LSHZ[<] .. 4 (*"'/-6.D;3,PT(d8.vt10<@ꢥ $% ˑz- [I_ї6\](xB*sR4!`EQbEd} dlLN5Z C?$zP A0sz:hQG&U4̝O&0ӃLL bwkRKtf>t }z&(P ډa_RHPO_d"bx90#0Uܻ]mJ5 !'jH@Ω@(``I/{Id NPS:k4_/5h<`B? =2NYlaQF qQy@" ,#LR%Lb&+R-0@SR1,3LS5l7S9;S=? TA -CMTED 9F: FK1TM9OA UQI-SQMUUYmWauT8dpcpZ)ش 8 M$R,tFZmR#Y2!‚Umo Wq-oç|ͦ\4U% )_.YjNTK_1 s!X)1V$lE]/la6b'vgO6WuX62|o6ѝnuvoyϛo}p7pHpO/ȉo5s 3⎏1`Kr+wqɓ 5aV.ks ρaB7}F_#MҗtO[P:ձU9*uBvP-Yўvmwwϝuw}xK \AIjJ>Md IHɕŀ[)505]SX‚d4]T5aY<LhMKp m' uEjz]gSHօږ|,cSz`[gjȬ0 m=3V{kTl ͐n 7>R`q;Z@eJ+V{fZ`,fL p /4pgdJ9#"O 83 m* pkʪXЇfom%"¦mj n$Y~ fܣ8DNJuoD2 s[cxµ|8(uuPvxc'zmJ5ulGg*|g;t`Nibp "CD.k\u0vpY8J`cfp t, :'j~f Pm"` @T($ ) O4 zqY^%@Z$qD1Y蕚 (1!p*ROHb!AC_I Cq%Y2 'D&Sf2&@̃,!G*$A(RB'mi8!&6rZ2,82sf-9E- ɸR$2ff/2%<'"đ! !0ɣ)235s ^Z!:nqX )/ӬrN.ʱ  2䃨k1PR+#R2(/78A(=n+̰HgR5 $J36ƨ;6syv*ӨHf0%398;SA?!b:ïB>)kB=߳#3Rrb@;J 5J'c.` '6D:=fyKBAQEaTCO3*? * qtnsy^3z*0PFRveLZP@fĦ^09o Ul<iF`fnC,VG6-;.cpv#Qgfvph5s`vie 1?QINg Hg'x2WUF (nswm}n;R{{bȧ)hG=tO1m3 xp%N (q6zSz,H 6H(c8sdWpZ²: q3Pn2yxI 7$~A^#!Q"Mtr]/VKT;"ьQ6"wJR_I}2f7wu}ALɎBx! 7qHx7'# {9Y6oVm' H'h?7{zR8FX3+)5uo9x25 }xq*3|+.ۃQ-Y 鏗i|BU)8)"n)LTy&xVp 8d'ILÂJZ8U:l56IuYv6xlk8 Rж,Eymꔙ6A8{%c;g6kSw`&P9'B WlHH+LYBjE@}1׷C+؟ A#.t'ttM-6k(:KdvRKiR ԚMcM4IyZ I=׼װBKzt4(vm2pYZǫ-WQze]O+$Ya+dP%՛-PSUQx}8o/ծrtgj*ZL,A<.@LjT3J'S-Bj5 ozuA]?[l6MZtlOuYPlhmq;u{y};{#V͸ܐ*x{p9ڦtCV,8d9{ v;uMEջe{FA͏3; hgI{ /FC;|6J $<%|)-1<5|9=A~ >~!>%~)-1>5~9=A>E~IMQ>U~Y]a>e~imq>u~y}>~艾>~陾>~ꩾ>~빾>~ɾ>~پ>~>~. _ ? Q^0 %E%)F@H H@ttm6bE* BbĴ9#wi_D_Gh g -'Q" "ʲxI:uiF |N;4Ee <&vEo`OZi4("7pCM>''r1N֟.N2L& ֟=`_Ca"Kc"Omb_PVk_B`.d 2%(0Q;m֟J m03J 4?iߥJ mFcz5NbuyJ _?c00NY.4|n_ןIJJJ j%FHB$ V?=y_|_R@/c, y%_y%_yу!, @pH,Ȥrl腠\ΡzxLnLV< p/TJ~HR BfDRBQgIi_[]KvbeDko_Q \ QCfىګEu^LĂҌ԰am픰!Y4ȰÇ#JtxB3<ZƍWȑ8dAy*3y:@17ɜ!< Jf/µgS!:GrHT/Xᒩ,8`ħQP_Î: F\ru.JHn m+8hٙ5ɰuD&OHܾtY j LfNfr+p©*_μsITzӌN4={" UzMC5v} f&R/{!|Y2^yM%h\-@ $`u*DnVtbV )`f]U@%;zW tn.|"Hv0`Zxs`)dh.QI)mSpg\\P$ OYH&zlZDAzԢ٥Z~RɂȞYlD旨θB8ju]bjzP+YVi@Φv gVk֕9DaQ#g9tTITZ@UGzS*ĮﲺoNo߰k}0@= mPN ]Ek1A;(P&ZzF*2F]5f:.,zb+DME!;MC̔Du+V5f\>se" gԅ6vv6JY`8JW]ᖣmwQmI:OW2zMA^Kdo](}{};bî)m /Z%Zw1fIm/i.{P=HL5y{|+!#}cƻq Ć#ۅo L:t0V8No.ڛߜ@Qlpnq?zy=[`H"on!< $KB - EƦì13:$5="zRaŤ],U|Foe^,2$l-s#3}{,hF:dBNM<%g:^WúЎ]bl!x;MA$"֥N%R:?N`4 wmVsIsNp9i|y!e)t$8 2*KD`W=z|ա_gq0g4#qHO7qww@zL3a(DM0+37N[ɍE*'QRS@uLӒc0fZ~5FPJ\M:r#X5rS ZS7OO 'ۨ nmѶw1]KܬC\GOwOWg?ϽOO;ЏO[Ͼ}ppݻ?gcjӷGiCAۑnХt]ЁKŌ`ri7h-p& ~ ~pP0pCTm!S!x(&m% V0dpG|@F-H&&@EʒEW0h2uxxbjSj̔f{!pXMqAqjBEjBjUkx\1('X@4D€W2X]wQ#y"*S!Z"UV@7QVq G! #\fdg*UTeRæfTTJ5x=4lh،me)(qyJJ3A'X)UKv,<DC#9()<Box Ј>8 448.߄5[@LG6QZ0/!X)gA6MIc7R3@ 8o ٓ> T󐶓_o6q5Bz3Qsof6Hd9JEF9W ]qm pY89q?ٖnɃT1/( D@B>D^F~HJL'ĕ [~jhӝy QNɋk(h‘anNaaҠj"iR>@,ʭ̢o&,HL{.]- :Om@h^ EN^y,7y̆r!ygI]{W}`q9n^`8Y闢gÞ\lhw*ĝHc,4M<cQܲV tSR/מxрE +Im+Mˍ̍Oݿ RȻ d$Q~,j@336?B@ i8\d33ljT)TE,*:,rxejH i'7? U.w95,*dAѿ9qTZɖY&Bcd$zYI: tJ͔كPi?)?kM&??Z XO]?̘މ"-)f$;.i֗-GfYN]F0͛_"]I0iU^t˚i̭I)} (5CC>It>QZ^Y~a\6iux9=Kah<9S,, 4.:. ..80 ,/ CH!+ m[NEs.Uo}*S=1-<,CM"PE!TI)A+TM9RG; UQI!JMUUYԸZUYi]GkU]y^ VacMvc@Ug],*kvR sJo Wq-sMWumwWy{W}X .NX{)\.r 0㏣5 ְ䓑fbYnYi2pYYkq9T#C .Љ0ZDWzI`ꫫtjZI.p-n[[\ /OH6kb.J$QJ.z|T*]I/tԾŀΊݰ2fs(/L}u.5 Y@$nؽ&_I XO}櫘H}ЀxE|A= 'yֱE D@cѸN"NȗA ne1tBaJ0̡1`yw·%!uF BЃE4["DxL}2@P@K⨓,C 'S/1-5\Rh jj/XPJ* Yg K=M'6'@Kl"2ʴaRx!* |H+v ,˺l'(r:,)*4#(%,$ 2)N,&f"&0')0(I()cNƱ*9෤2i ӌ2h0,3Uo-"@e{P%./ 3R/W #ٔ R٪2uDG+* l7i64Ds-l,M8ms osm m+]2<;k}LJ#7J=5#9::/R?ߒh֠֔R`Sm6" 4Ю ~%kɰ6qcpDm04\)@4GOa4A`,"$ds'%b(<2$F/7-.*n?ՎZ,^R$)E2*lμDJu4O+O R4.0V#bgPUc-dbznQR$SE7"!b~#UR4 tViՆ6(VuuW=8 /Wy5Xt AtsuXuY9$IV_DgZZZ5[u[[[5\u\ɵ\UEm\UjA]&9^gv5_] 8_g5* ` e&`dmabzvbb1v`2cH,wcI_z ]Kve1Xvfifmfq6guvgyg}g6hvhhh6ivii B6vjU 4j6T.A`kvS5lvSL}vm#Eq6nE \6oD&oDkN p M 7q$$qDI! rdhr5WK 7sA7tEwtItMtQ7uUwuYu]ua7vewviv\#ilwwAeywxǂ.x8 y!yw+X z"{7|Ł,5|%w}ՀY} $}~(r{w m8x 8x!8%x)G,sY1 VWT>bH}fR~( &kix}1rs8|MX3wW  7zbz׉7:wvFV8xɸ8xٸ8x鸎8x9y 9y!9%y)-195y9=A9EyIMQ9UyY]a9eyimq9uyy}9y9y9y9y9yɹ9yٹ9y鹞9y:z :%h !Z'h,z?]o7ڣo䋣e SK&bJ K5EIF H[4c$*sJU3viZGtFDdT*FϪL:JlV/zHXjevKMxzJ"4 ګ#zqZw% LT6-;GGYʱ1/WGҵJ ` )zbkFs@2'wJf/;}dCఓEX8jTLbU{3ۂ@B e1Dpikp{{fW;zۦ`^;YS!ʖ܄d;iJ%>*;J{J@|s6u;Y׳} JN6ee;FD D@H[V7Kw'^eanq7s$JD;JFm Vv=<fi\glq&u|fxv!, 3pH,Ȥrl:ШtJZDrtާ }q ^OVοUoaxqkY՞X!|=߅*va89^ygIK5XFH5\w|< D]hɂk-)%D`TUX\v饇`Q!Yyb;(h' @rLVؘ`}i衈& f7tZuLy՞HW$(~説무jhɊ뮼 k챀6F+Vkfv+k覫+k,l' #q5\=g뛩hZX2D^tLGv,g̱\b@-t I|lVEP5q{oLe3b=3r5'<4r~l۩vZD|1]`l\}XМkí7ؚ-xlwa6DYEA*UiM|fzB>pL=%3;0b^&D@;0!PMyd/u@~b5#s%&eR]ŗj@@&G R"t +Ee*C04r%7nDՒĀT`i 8•E  bIVNE@3@ʭify/DX7JB@Nx<&F CΑE#>):/RexB"@Ye9XP&dԤF< @R=3uD#,2 }d2J v8'zo<у,$!0xLܖͬ}3t;(ayX%Vӹ2 -mGO9f9І:t]%atMi3f}&ze.#} Nt F7zN]!)]iL p1oIz@5HAEib,PT`F$3E`W= "93ʒ]W[ϴf e-S$SItC.&TKMO gط RY_63$iGeҰ18e+b3< czE˸p$(KUN5FVFsbawޢrBFV9Q6K );&-\!03\xf2w\[uU @@v;*U L}L }+,%my]~nBrh&] B %^냥J>g2b8dm > \|$I%nwH&;oj$jΈ0ֽcŠ*I Pq:S`*S;]4 r+W8v^3Q dzf<}yHge/3:5'ʘδթíG]HP;ԤNW 404{PZ^ MbNf;ЎMj[ζn{MHw/NMyD Mz1~󪗛쀿N# .K ;Cy7*[ú{ _2S#(OJNZ07)89/8Y1\@ѓyBCOҗn` N[ Pa{`NhOpNxϻjBÑ-B:xYҸ1_6w!hьz0$Q` 's{j:[Dxww|l@f)y2 |s|f,Z+LtG+Zض/ˆ?,AOߥÖj6|߈Ylj ~(i`~׀X.a)9!#p$85B:VhD:ef:\:S;H;Y!( 8;SF=,hyHy#p1Ta 7wz*R-f$IzP)ELQ[Q0YID%'Wz)=&TR#DaY혔9#e"!UtƎ&XlfniUCgx^(~Eti3u^ VVU!I/c[ps@vZ 7-^Y@؛g"uuךuUx\ ɔᑰ)Y(#OE^At$9]5?VEQiW@Ȟܕ^U_jd_*"]]]."ԝzx{EHLѡK]Jd&6aehtaapf894Fb)EV4ڔ,v8dd b6x ;Wih'k6[xbCcdZӡ  }aegsEfqfˑf'f@*e}g)jhjIg|Dhhz= f)<r\/֩-6z%kǕ59kZzګ:ZzȚʪj瘘x%A:!2Nu'kz~]A3'ݧWzC)2%5ٗ4הWDP)``<1(W?kؕ`$aȆ ttit؋^_ 5ԇya;auGbd;O@CFcTC_۹`b@pMZ4&7tlي]$H]{<_GQT kg5Z:a$acK "_O; !h6UV߹6 sfTsI`K*y;A\4\|Up D٧;z8NY~N%M:*# )P ` SK.kNP5YP!lr<õaF  в w0 A h)SF>,0TS+[ r%G~{R|TiKb6PWT\ ,)9 tVlwyWpbי+PP90ƈe<յXfKLR YY ǫfR{Ze &\WF\۪%DbE k\k]l \ E;^><[%] ,}OCrR Lۛ.@|1f'Oچrb6AL6vV]XA0TOI9E3b'މ'0fS4 l)&~(*,.02>4^6~8:r'x \xۄT? L0zyQCz0zC)s =\{SJK+svM PаΗ#zT._?vu bDx ڕԾhCYr/Lz!\~B>PI3yX)&!nE9g'46?iLdB uV/.ViU锌OR|4RbQjiu}SǴ[WKzꑗA}"u_Y Ys(ƼƏ](Ǟ?lVX4Dő<&. tDj.##\N.{!;#fcz0uq^y .*6< ;>4799-1 (*(M!X&FJOR,V{(1޸20FU#f/$>/$:7)wP !-nMF@~yBqDjj Cb*aQy;̎YBI8Ү|;MWI::r'7=$jUWfպkW+ҷ\j-_ZBb>)"sV=0X!MPE8K0}LE@F=Qgݻ,T0=ɔ7!6 4@v.˗ g93ਥ3K!72^g׾{w9~|fw{mPMN2 Psy"oP` ȭ2 dz @tˏK+4#F#,$m <*$Ф ȥ$ F>ď"`k'R),R-/ S1>2LS5l7.b8S=?3@CMTEmG!TI)K1TM9OA UQI-SQMUUYmWaU oCLYZ_ I#BS|nɾF1< +Khlx2ENK[H.K [w)!~Gu-g"ww}#6{3_`uU>z0@߫596@z7|3p.4]n&k8(`[. Љ( 44Wfe@Ӟ*2LE@!p$r,!لT u?!]ˍ*:{h-I*Q`CB<~V&Z@q!Gd14. x1v P /8*Z*f$Xpq3v-1cMDM$I!3DH Zo!^(]PGuhedS ε5q0d%,b.a'K Yc\eV -NP8 of(,[\m'Fǂ-ptZ_gv+.r!4Il@;22ΧH!iQ7֣(kGg{H(*$M-cNE9R{z\юJhXDJ6d\!Mn{eb Vfکf1㗱ќf5bNu8Ou5ϙuvRyY}hAЅ6hE/эv!iIOҕ1iMoӝAjQԥ6QjUխvakYϚֵqk]׽la6le/vmiOնmmonq6M,voy:^ao}vQp7x~p/ w-81q<Ar[ Fr-JrϜ5=͓E7z/Mw: `bUձ@@vڦRM5ƞvmwwϝuw}x7x/w!yO1yoH2Azwo!Fzկ_HpX{Ͼ|qN [B0|ˏ-}3_ ?xHM w -7~4wf blE[/p 0p!0%p)-105p9=A0EpI:GUpY%,fXpiӄYj0uP꫃v0H0\@p Zh0 -r<` 0 / 0 Űa 0 P+0gp 0p1q  1q!1%q)ѲpȢ564/:nE"wbQ1ɋRS i1)yqje<@ c1#oI'ڧ K/*y}ʱ.'ܱ1q2 r 2!r! ~Z`KUpƳ *N#y[ |Dr@BJ!Z.qH Vʖ 'b>Q% #_R 8en*X&=2)W $')2Hh2*k_` Pf`¢& /L&* #22+R)T#A.$ %sba/ ,JcR `9vV" K+.3 a21/MU?a5u+͂5_Ff4Ƨ4(jpsjsx쀟 GpG8d@I-H"^!;AЦ9'AFn+r\c<CvCcAl 8L=-XFi4SR 1R6+t64xXxvdG0Tx~g0Hfg.A6'<4xyGzK9zl?P:X!vZ4G,Ds$q|tEy,Gkc6 ҉{0#: Pc6,OAK'`L@" 3B t28LH32k6PMH)XbNA"T)*bHrC^ziH>CR ut|=}IO<$D.lnO_ώv9^LeUQrYV+1R+$hIN-rvp (hu(D(@S/El3ˀ,9NEI\ 9/VUd,2h´jXĎ[g5`%@<`#,%AsJ$6 T )bIJiciR,G.\s|'  'F# V_U&iPc> dUc!V`PrL`oP FiSh ʝKb'&6cihj֞I* և' )]qnuv(VqV"'gBBBQhEl]mvrdi"o.`V",c5Qb[d֕Ύ :YeI\b5h_!w,,dpLj dq-uS\)yw\Ӈez` J ɶ$ڪPJv Kw=Uec3b\{-GK^ͷS`&g5T~6y 8Of)-csxZb84)j(4K4k&*E͸7uч+IgI x~J9$4"Y?ٺɤ[@==zY>HtBfĎB|!ALtuV],yb,DFno2Fa|y|uʾ k9*~y?=eW3g9Ǹ3*dM99è:NX7c" :9V*m2%z)-1:5z9=A:EzIMQ:UzY]a:ezimq:uzy}:z:z:z:z:zɺ:zٺ:z麮:z;{ ;{!;%{)-1;5{9=A;E{IMQ;U{Y]a;e{imq;u{y};{;{;{s;[ ;{ɻ;{ٻ;{<黾<{!<n& /j7ס $M\e>pD`į@FE| 6; :m-G,"@,yMe|ݽi:LGUJ Hlj0]xܻGb] V@T]՛T,~bjlݺc ]$ ]r3i#.]}_(Ѹ-XܛKATp*m$a \==c]}\`[ԙR`i rfϭ)!+ie#f5u*^ݵ0k+ S q>u ` zWߙj vg>J d"Oꓠם<>}:&'F5!4{~qnEn {}0k~o~?{~2~ӧ (!߉_4? )( ^+չȧ 3`fKk;~}&lvF̷ԮTs?@E$/둛?Yt2d h|?eJ~hoT?<ɻL:Zh]\U7zZÚ7RR3As: 3U43kcj 5DQCƅI#XI ^\`ՙN` PC1:5Ge-oQC1:5uɊN.3a2Ekx52 i2t|=?I3M=O@B /?`R@:KXh^ QsDr-4:s䌿mDr䌿OFО8erdIdӐId3ImOн_2~@B^X]=fdiPxOLC A 7>i3QrK(txLmcUDɡ~7rн_!u >>@aN@ u?NiilJilyHw!Q-^+ß|OnjQu:oJ>>{woC}C?X]fd@RS?3a‚jF4Ay2ڹ5a x*|m,3`wjo* ^o ԍ@C@:s.ڟՋP]骠`N@ ;y/Fx~i)^)`2jWk/NX#R8LX:9Uw:YmKj =߼_.aL $0i4-EU 'r)sJX& }BލŜf)5|PVZ^~4=9BJM\$vhZyz`fzqF. u(EN@@TlQ!0=PSF % $3u@2^{XT8,l_MSTw{/\h}+ /M? (q"Ŋ/~8q#ǎ7"r$ɒ&OLr%˖._Œ)s&͚L-YরFQFa /V,c4ͫ.ȪBIT7S1z`dC] KaPvhQ"ܩL}!ˎϯ^ۀxQi)ʈ 5y-T 4]5Ga̭{7޾Xvǐ5#O|9ajiy:֯cϮZۿ}ϣ />%9`K锎"NtFeXRX2]'{mס?g'+D/c P29XbiXG"ȢOBL.▤Wb[r٥_fKפg據Y㣛os9g! , 8@pH,Ȥr<". A DzxL.Rzn|N~ˣVBPWB[CPuSIU]Z\K{ ma ~uhL P P C[Ґx iI^Lz`׿cPF5+`dڴjpeΏo@AX3jȱǏ y+BC`*hPR`,8$Ě6" qntPSe)c^4wR GTm9U$A-c"BFƖ=+TD`ʤYD \̸ǐ#IP P2sJHK(caZBA``w3Gtj LZ'g۝=ѾMC꽺DtKڴ8 ɉm[I[&Rls`@;wٷw_}qBh^,h&P6eO"Sg<OVe6D['T oP%:ky Qx_!E@!{$vn95Ty31!ș2ElGAe68dH )di&CN `U@qI5~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:P|D"EXͪVծj3JֲhMUh.p\Jאouͫ^׾PQMlZIVUd'KY>! 4f7zKϚMjyilgڞͭnw[DGBmoK73 Sjy:нivCߜ&ͮvxKMz|Kͯ~LN;eeW,a[hAalB.IO] "34BX9T [dǩ`).jM R2a5%ÈOL*[$3r~ⲗ5bA_&L,fl 1)j jK, cc|Bul?ܕх1rv$Րg%Q6!Λ Ovo I.q-+s,+@r,wsVg7 !Z!ߡ#HQGwst"t-=}D12OJu¶DQ&+; kF dwwn>3grNd1Hhns(u)xw o/?gBboB7Lj*"vIF\B*r;#F0D,B>X37DEȍzN0DYr^D6C]6sׇ9U$)p-DBStB9$Kpy Y#wk "u4K}e(H0HEaHHfdHX~ IH@HiT}HIEfJ'HHxt򑄆HJKٔNMP9TY m܃)8m5PH7v~!jo @!{^0P03+GJ5E$%R,t2юA]4sȹE`DX[Ԣ7fP |. zH4^+^pnoA,9JtYH8䦓+K-yI0ٞ Kbc 44ԙeּLKLRɗt |l=l5l." Uw³Μˆ<" @<͑|΄zYm<\|=]} ]_'pcФaaMf~G{Ah/b+'yGLO!Fϡ[{=dYe@s([&xdxH f@7t& Iy3 >e* gZmAVƈTCG6 ձ0 YHjoì79G`G9WU#xueݔWw=yG*B|v(*2 ˚ !h^Mb!3].wA.M=n;ncZrޱ%{E8~魲..}Hbϝ~4xܖFn'EO+pzsJ7^+hh譨..HezuÉ]x^4-Zx"]0=Mk6B|cEm=2믈0Y ÈgcBe A0ĆiPŌaQiJ*XҪ.>@R< "ȩFI&PtDx!-*.C&\ %%6$@g5L# p?{CMTEmFȊS?2t>S?MA\\<|˷MMOh #=V6]"6USKFVmG#UDJ-1~uمXLFa, i]|YS߸ ]Hz]uZ]pXې֕Y^"B^8J~ aY晇* ׳sTTb&#SU8VLU<"Er5BOJ(j&u[n݌?t2UU!xfb_Nza 7T$ C(L$k8;N$#a]i=&A%K%2.8IzѺ2WL[\gx2xX|/M/s神صfsv8aQ" pc'>8vYL9,1NA P ; @0{B`=HIBZ Ia jظ6CdB8 "䩐˙ k]5PG;¹ش<'H@"Gp<>[MPRʍ֨7Qp8 7䳌]%(D8s!mJSCnd.t3u%4MmnJ,49љNut;OyΓ=O}?P5AP. uC!QNE1QnGAR%5IQR-uKaSΔ5MqS=OTE5QT.MuS9NUUUZ WV_ [ʚVmuIjΕu]jhYy_XGgaX.V@YXN,GngI5iK˺uk>wmZ) oܞ"p\.WfJ\Nյu]nw^񎗼5yћ^u{_Η}_`2%!>/ VM8>#E]0:a:?-dž5&S=q~13)E6r|%@Mv2zWǣ(Ա sBK@ኽ ўvmwwϝuw},h~H!aZpz+4!N*/2#,,Epr-/+x jN>Wcx>)Z ׇ=#|璫@~ ߇1&/1 RC2D]17Ð~f?.H85C5&# iPjDy C4)9D1iz7r12Vl9Y6` 6ȈjiN191E"PEDžjP~=g^8@K@ dMUmT kp9@jϐL"C|q8!"\OI?8_FrqWbC&q:f-$zs~'gLr&NKJpD u&2I( ')r$Pl'Au"*-F"Q=&;D rȄA3GRNt$'YHbr1*V+ r:'0j0rf@sifZ 3nNVk24b8s>I-Ek4Ctx-g"r"}NvRm 4[EZ@31:8gjb9;ٱ <e] Q'5fW`X: j_c LM4G-%) 7i*qpe|1=ɈRsA$9S bN.1ee:GC;A4DA9WPP&De 'ғ>GEI=4ُF5ُ 36B@$ F4wSFT'1k|Dg-$t99:[T lTDKD% ۖ ʨ'IpD*m$C/]TMeM4܄_s6 X4PTXt/ RTU*gJ)*sM#Iq,K5uS?LKq$Lg${~M?3^yhH?( dUG/{GxbWb*Rn-'A#!lj5D5J! RLZ3XU~zP5 ؔS5]Ӡ,8gCF U^tu,46:Ȋ@6IK脂(fh [GJqW։ha5 yLh ~j(TJ8F`{q3Co t( eQkfBUeR9.6ahuirAUTG.6@<[Pj0ZT5 Sv0ڈk=36JH鑐@0쨑2"og//lVJH ip&*rGa n8PqPb"5)m69WضiEwth0taPwuY7u_Duawvi iGk,dww}w{ɛew+zx7ywyyy7zwzzz7{w{{{7|w|ɷ||7}w}ٷ}}7~w~~~7w8x 8x!8%x)-185x9=A8ExIMQ8UxY]a8exi q8uxy}8x8x8x8x8ŘA`8xٸx 㸎88 9ysq8y)-ِ_wXy/Mp̢nX YY@`;X!Q}tc\Y79`TBI59{@@us9Ky㕩َeYّsŹCyØY/=ڙ9 ڠ#99%ZᬸVwxryjyzIù%>U͂usxKs8u zT9uڦ_=V> zMZ3wsبI!( 5sqzaP'6'`9 ஻y:!⦉ڧ5:;) :}:izq1${9yڌ7;ZyKa{ گQ{GۓU6>ۇ:u[;#P8ٸ#{:qo8 }:k38=۫ڸ _ٚl{1bߙٽ'Κۻ 81&࿗ٱ|k{OjyS4y|ۼ z &ܑ9ۧ[ߛǁ @y9|+{u˻۹ū9Iیg;#ܣ1ʃ<́δ]͸ʟûĭU.'ZAb ˥G眺?̛i|(| "'O3{7I]1Yz|s{8IY%›#`ȑ?=]ׇ٧mcӧ;][ڟșܣ){x?a9ԣءرޟzkљɜ}\ 6ZQq=)^9^ZM3ވ<j٧ܸ}͏WQ\Wq}߭_iс> Z kYy^<{}i35[ԯr~O=Ͼž~!@=3ռѷ[{Ľݬ _w.])/~w}5ߜOscǯy~k>[_A7cۙ<#RIÚ_>k_Kwa\?rg]~?3^yZzb$F@,(b7N t6 KJ(gɖ'gu= "&*.2)9́QDUiJ ~Mn:m`94`9̽݁uyRnYNU٥r6#'+/3+W9٢ub )]o)=߲~ ezB_~qv߉= * V=jѓ9=(tЪVbͪ*խ^u*v,ٲf LJ+w.=ju[w/yU ,x0ah(x1ƆtL2Sɖ/c'BQ?s&ϢŒ4֮_Î-{6ڶot7޾.|8Ə#O|9ΟC.}:֯cϮ};޿S-~<ϣO/Ï/>ϯ?pX" 2ؠBRXbJH#X'+آ/(ȡ7☣;أ?CYG"K$!@ILr9cYgWz%1*0oYe__c.4e|m}p@]$HJ|LjEzĨ@T텩Zr{"@k'TZ*m),^ +Ik-dO:-;%|җ)}JJmji"{0e*{1o's{x"^Ϛb_Š3\ʹ ~m{!|prtC'Q#}G=2]-S]L# Tݟ}ս r'X1w8t{ vi 3ʷ裓^9˽xY{j~ ꎳ:N/j?;κ~*N'y#:_[0qLK~!Žn f.{'3Nmg|ڣe=_ u)0Ldq=N 2ensLg0hB.oq`!}_: 9d @j:arpI؟6$O3@~g>V1Bv#80 z:,~̐2!)7E=8JB2C'9i{=2 \iUi`P!`.!)Rb9>6H*1O&1!NJS>xG`ٴ&Qe6o`b̊*@-r}@:Mx,W͘TZi6%#'2Cα+RsJ5zy5M4E5Jsi2Fu4`cc.I5k|#n[?.7r›sWU~QQ絣[f'U]y\bnPW'6;ۯ褷=| 9 :yvK0=u.!?_әg}&*7B=O_|םR(1`=]d^D̯dEkLtOە#'A1Zƙ Iҩ8 a>t ^(@'Ui *1SL  PM |hfyiJW!62Daٍ݅J!YB>a}J _EKa!9a2=C$fYa ! j v'  5QE+~!]ELa/V%c!\HA) ip85Zhԩq$J_7fcc53# } #U@j=5$e!ׁ<# >4#?bcA";aLXM;Hr#d9]KP8Ld18 &dOdPɸbP"%eR$SBܤt OxS 5jeWHUW"+L%t9eTe[ޥWL`\e^j\ʣ^rE]2eeaf_*b2fc:cB| feZdFfrfgzgfhhfiifjjfkkfll&Lmfnnfoogp pgqq"gr*r2gs:sBgtJtDubgvj'PgwzwgxxgyyNunzg{}@||g}ҧ]zN~gh (}"h*2h:BhJRhZZ(`hdžnh娧煊AڣJ}hhhshީR$ 郊N,̐"id@<B vJ(Ȉ~ !V VL5h隲i)thRE!(e`'i6iiY$V`i{ꃚԖ^TO<_LU\b֛jꨒ)*q}]n/pF.ƉыvPNQ~nLn~/T]N4mq-l\y /[mȒ`CԜZop pΞ\/\ݏY௄J]b 0"SdmEL9ɁxTp(%Gq%T$|Zͭm'_Z*q3( +[2f Ϫ/mɁ<`R䛽h%| >Z%K$RMX*Q\,\+r.2*/'02"7(C1 /2KXly9 p}$ 3(`1{J̩61 )+(43cɫmSݫ .s>3~F,L1?){2/(O%B)AlN9|Mn]7+JNɺ* ;-Pr-{-$mfj;_='=OuP'g/i߄3D'3uڎJir5|g5L QNnRYWN8mE( ! ƎȦ3 H#B!")Z!`! b3vc&Y'giFƲ(dv^7,LMg$J2E-rRҁ!M6 D69bHZ Xnri% wkBbl#@>z#8ʱc[u3d#d*go9 xxihmH#5dyt$ I@e9˜ґ!}C5z#2X-c#8k3x;CxI.RxcxKx{xG m(ðx8!lR^8x*xyf֬) 3y;CyKSy[cyksy{y@yy yyy 9c[Wy #z+Ϲ;y/g[%/szyCz?:KzPT~b:SbezJ>T{zz,FD| +; 0~р  : @zG 5=?wKA#ͲMXԓ}܈YI 4Q(#;iz+¿:g[)y~@G;B{ZH c{~H @ @y !]v:_IMe"jmwFw8ɡ$O}P>h _9{ף?Cb+tD&KfFSjzfڀPcrYsA˄˅B"XWGx{/KYyQyq,{Cī9xR00CCX ks\МȀXhL%j$eVTThT3p s},@Pt :8_pP^h`xKHl_?ykEbႯ Veemd|]ĘQF=~HRH%MDRJ#aSLFęSN=}Z 2? d G5%LOUg aIs6kZpBK4/4K\tph&& m6/]Y&`.5{%|VM#+ n)U,#ÀױañkYUio%@ Z͝?αtխOIS"?^) U/*T8Uf)$$J̹ ΅R芒>;؊.i:? )4P!K0`@x 7jO÷8C&4@Eè FeB#40rVHfSBr lc(K(X=,L3ϔ:5ds츃s&ȣN;ē X,!c?H<YPL -L=7Xʠ -S16e$?eRUM45B1м4 @GrF.!0lJ0=eY n7 61@3\qm\s|3Nu3Ow߅7^,DO G9)Y<R8bcdЬT#VP,jgT/D5*N)A6MẄDӲZm%3 zKnw.]Vg_f/-?qsƺtU]y;w9`P`u{ ndhf8bm#2oa!cna]MU`2%poE77Eu@y52=w_wN&x{";R6@{_>J0-/cqttoi#a٢=‡}aRA +嶕ޛh;DЎF 4_`IMw4;o;;^E8($GÁ2d}!mqBCbR#pT S4`L,HY (NTp.%E&K^R&dJU*/O>B@8 VхL`JJ@Xm^lrGU%S2 >yN&p;aUAcD*V?妫eJeK>X&YP*8 ` Leю.({HRTZd@:YJrNIMZvֳj)D;ZҖ6`m9iUڳ8mlq ]eu`ַZ۬>;\)Enr KjE.Z]5g"m[v#oJ4\!E/R׽̀;ߺmz׿Ex\׼Epp\p%t=hBЇFthF7яt%=iJWҗt5iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7φv =mjWڬ! , 3'dihlp,Ϭ8|pH,Ȥrl:ШtJZX-exL.z#. ِ AhM($[\7^{LxzfG qSQup q}NvKuwym s#)#R2p( p1&/%qp 4-//p#> DsɘĠ= E}$ZWqiS@+!%1!֬Zix 0eXH9"KDw.thBxjm``V&2 LNBZa[&i{0 ,vC)BZMa0X{qc8:YЀ/͝kmV=$.qpƏcLЂ( ʤt ': <ls>l&ekҐkqzٜ`.CX۶0f#h;U}k±&R,^x;IѲgIxB.ߑpQyl'\2乭X#s|xd@ci<y=IX9]7N,$F((w*Qf郏$c, =yԤ.Zwv'D HU0*lG3ga5\+{ѕSzW[b$k] W%*f.fx$WeF9) *$zAsNp\DGTp+]hFUjCEZ$C0i7d4;1y@5 'g@PQ6N$OX 7nĺtl *C`׽ExkF#ij׿M4o_^b|r 5&r*S+Aռ#gqYprUH&'@2e9H9ccEp熪tu :4UhZAQ!î>rh5UFwH Sӧ1z>COņ9gXp,KYgwFsA C ۸2} /zkwJ !^xnB; @ՍfУ9,a XLqK*V|=mg}NAZk/coyb96~}]VIş,d=nP ՃRֆ"a䈲ޠ,&p -(5I ui 8R:оβS?8ϻنƀ6f7=i'N=U0}e ^Ya9NO<%* 4oج6%"-pecq_16ӑr:}&Ǹ䤣}6,{A/z!/ͥ p9\}~ŗ3Cy,~a~?W41L '7? 2B !~ PA}c&~b~7U~j4v 3%G"e 6({R Q}G[aD@3:7D)8:&gZ)s{wbUwz)nTl}phߧ@7~OǃV4чR#ⅹ4s<$`jZ|BM(M2H(yN7-gZӇvg"HZ4Vja1Bq6"1anqavc@t(s7Ĵ߸Q7xP0Pv)IW1qVe-> w'SB94JifK0)a(1"`:ő(,ْ.A40Y+P6:M! ,;@pH,Hgl:3ɨtJZجvzxL.znb ~is`ls̪cһ   jr Hz41x5#{]02&bȱ!aa|Aׁ(SV=6kI!%d&=.DYB?t*]ʴS4 CrBiL[?KPׯ!{_QlaMIg+n}hW~5AÈj1F.3kh^A)p`V4s#WOfCV̻oQ99ku6+_ ݷd+{Ή ۯni wnӫ_)x7D}BK^FLPI}t!(]PCMyޅf&a>=`h"sQ7*b%NQӢDR`}@cD؆tؙ>q'F)%Y|#/-0Zu(&VƽT PԐF)RHbd(&攀z͓gv9Fit5#sf)/u^r<^ڈ:vOJ#뤕@Ȭ8brf);P=ʈ6G`qBlym-J$됥`*ƂhЎb"p\U\K@JpyVlqkZBJ* ?|`YRJfe Y.YAB|uV s;9^t+󒮦XgEmVaZ5Z%=H/PetmwsmíwM+r߀Q{δ B7Wnt'ǝ.! ,F@pH,ȤrI8sJZجvzxL.zng\ ~irPtB~Qw  dVúٸ{N[簭 ݛ H rL[?{0 b2 = @[lu2N0aXB%-@ HfgVblH.8=X&JmIeЯ8UB΅N˶-[s} a픴ufkgH|9Vk]H셸*(h!$2(`Ϡ Yo5s82ե*r gEk5ug hԠYKhXkM3lz-ț/Yi"C>MyP@2@sy=Cua% iAFZ@Rᄙ8HqxA`amn4h"r)83/>xˀ4frmaz!dmwmp9fEsTdV!Y>JåSR^K&iS’b)e1lih[AP1rM~/"U1iy\yJIE7x 2g`sx_KJ),K BD iU9+-q",HTd21TX5qt6:ӎn09`~+|kg<9y0[=wY{O)3op ru0(V?U07z2&0pέjH`5٠"*L7. TWm}R_\w-P^-dvhvA! ,:@pH,Ȥr)8ƬZجvzxL.znUJR~Xuuw{Btb G  Թ RGٶͻ B+@. ratÇ H)CkY(A{*E ]0 zPfzd@QH#S̄7ɒ͋S7ɔJQff+FCGȡ8+L0m슔nGҍx&q,'H=JA<@pJ,, DɀS ,;(2%0nj^2l8Cs -~@(`0an!:VH! C-X$g¹ ϋF.u%U#Χ,^i9fQ7%}Cb9XtZl朂C˞j')0₅,H$:h@ [r?m)CB@:|@IңֺMB|jRN)Mª;SH16 SV'O#ik.Ϯi=#G"'[=k`,p'ŽG,qOl! ,:@pH,Ȥrl*?(ZجvzxL.znTJ~HsQuK \SJ  YЬ K ɬmU!2Xm (lu z6C*e^D̤˗0dclㄎݵrv&u8+Zt/_#*4BXfׯL6iFB[e[TN#0 ˷]P!L Vu)|؃`n׬2XȀBzQU̺J$*E۵dgmvid{@lb;N,2Tz%Sq!S3Jnw?n`i9kA=`s&nصM)0 l^ƨJiBjdG+wU8DU[NCy(ؓEY5:YNI2.$p(VD1{K8s3%LYHꉇ+ \41D󐩒U:* maVJZӪ]ۅ؟/+]S @,$ >R+U9$LXpeZ8Jb`dh~ \y?,aLdE mںjߎk/7胮;&e˱Xw .\G{>]}>k-FlPy5$H,%'S>e݃&]0(+%w9T<$"2(ϒ0HVT$H`d~B`5$"XU)LjphK EY|ԩ%mf}X{e ֈ}}YfdMvi81i{ Yd|=nC.5~h~*) WT Oklt6O,̔uͬЉ@'VߕJG6iEdKK[{ \Qn i,1K'pU/GIWlAqw A! !,]spH,Ȥrl:ШtJZجvzxL.+zN~} ~ r]` ՌN  rJ7!C )HŋZ!:Ǐ CRԸ1D(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h"b'ʊ+()08A\558=Y:z@@HP@Pc,&@ 4[TycE8MPu@p̓9#h\I'=$2 ErSdUZZ@A\>zpb$:Abڣ(` Ti_虤*#z $^Xi-LA@n:թl"yJcz+@{ Jeh+.X-b 0)$#pH5,9>Jj=:ˮx & &Yp-px0 lhxs -[G @:`SWMLp4+ybrgG)nwK: <&Po->qk .;۹.۶ 8_vrv>{:uBis譬9]jEjJ3,mo7'9h,{[jaCwڭ T U ,~'NO>;D0`*Qx'O*ۻ' Z z |! ,:@pH,Ȥrl:PgJZvzxL.zn~[~vxs }vn { ̞ ou]  H *p4 :F `7Lx0@3讨;ɒ\X C L @@f'P[ ,X)B'uHj#5] qPJAO&*56BZed{f*Kqd;L.jIӨma׷SՒƒڜ*p {mzE3&5Udic]d)uVwU|-Uc[49(_T@33a"]`ٙX!$I`H.il0$@T \)dB1 փ) vTR~idL^ndЙIj&s-&0yWhtVi褔&ޣSN" RBZwbm0N;X$OE@Z+\50dCO<`*ClY @k<OLؚ ,е iUʒ6'Pt˶hNZhk@͋o$+F' /pG,qA! ,.@pH,Ȥrl:gJجvzxL.znvz~sSuk VxE   a ǤF  Կ4 H !0ă;_ JHqJD?YGv% }f?xY@ g={N&$˨-yШSA'U)x} LAՆ>+Nb%/A0Jf{ұj0 F|y@;ZŘ6Uه5(Q _xa- L^*F{,ؠTM8ZĊze u߈שB&QayD(߈0؉qZ5Q@R(" n$<!> 䖆"< GriK7`bV^>2&}\dgA~砉i'5|DO&D0 y$m馜viW~*ꨤJꪬj*SJ뭸b! ,;@pH,Ȥrl:ШtzXVuzxL.zn\j~kuWwr{YiBC  ĥ eNo å5 Çxp!A<'OԃoE\ipRpI&9z: 4YMT%VGS*xJ'a(F^=} ?[~fwZa BXyI ÷mW߫ٛ۸ tKg … 4ha/<C8$ȱ(8W`U*\ 𱦒l2 9t PL$]mZA{`KL[}.CoI p =?$OɀX--Bָs仞M.h_5lD`nxPa?F9Wa=@rʮ|߀.FR{y)@ EmR_d0R fX՛dae ɷ:sARH|ȣ :ΏD^H^ƎE5 ㋯Li4!!! ^ `PSO=pT&J-8K>)DNdH&qPF)eNNiX2Ye\v9O! !,]spH,Ȥrl:ШtJZجvzxL.4ZBN |N~zl | ]  ]  ցˆ  L %G#(Ç#JlK &jȱ-!ɓ(5:@c7I͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0ƈ4X8b98ʎ6Pp[@hl P<%FV`D)d^Gy$p dcM~pP@lPe)JkI@HPhzH\B4`Ȃ@AU%:Aa3g E ZjbrZf,0&!5I\ HZ!F`2zNV&bJ&D(ֱ*z pdVn(Ѐ†mauA{j+f\j{jjr*;n'mD8B\&c*0q"1M 찬RȄPq*I42@,@7Gɂ,JrMsmmL)8i2)C A[C`enUݎ9XAzUwɧfףPjaM-lK0 U`~\~ j VhTV|_CDo$qS`Bc`_B >Ida l:942"e-TTuEA cwzxbL5QZ5ũ`?]AԩآR=Z%TJ;q8N⭁\渖*_^B4TPsϯc q&To:8H >ݦ@sq'ϼ=d,]Y&?ų 3E^Wړ P`[nxe(t vڥ6N'5xƖj Lg9]{~F5u IOeG]t}8xhܶ9I' pykХHbM= ٘%tFvc2BNXdiw]㵸傦㗍=7]aHA&qMҘN6I%qpgX({|@l5wG]LoM: TZgT[$LF |hj{UR. r_g)t,R0>Uzwܢk<v+ hRCu=0-MpiqS͋fZ-VjO@'' lw q$lݍ,?*,4LH6笳?A! ,:@pH,Ȥrl:ШtJZ6kzxL.zn|n~UvZxe |\hBfo E`W  mη uKg 6[ȐHk g"jxH3WU:>cRP]`h+48W=KKJM&eW%gRJpA-?}sh'Y#.|$uAٷp(Zkv^|.HmFv JcV֤ &kތ/` Teq؛Czu0[ (Th}չ sr\29M|֕jdtdS wԵgT-_7\mN=˲(g="+ޜRނԀyTQ 0hF"{j x& QJQFUv̵PC30>4Fadu}Uب]kBXJ %3DUU Hx^-a(MrRH%@hOYBU X_)gUVg$-~Tj %ഄp!J1' %cc-Rr$AV (RAl,U)r#Ey0h뱀,J^]v#+.\ގk覫2Rnk_̋!!,]spH,Ȥrl:ШtJZجvzxL.:h'dM~wn qrn r pq] ^ Ջs߻ ڿ P H \ȰÇ ŋ3xNǏ CJɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h#,0-㍕Шc66rC iَ:x l Dz`$8tTYe]f bRY^" L@3T@pheeL%6P9d]6 f&lFiƂ qiZ9d(e8(%N*+yj~ɁpdZTɩ{&,\X{&NVk` +{v' X @+ʮ[% ߺ/V@\,^g|AD:m+Y{SPUrmpq$p'"g ͰK y,"j9fC›EwWg-3,tHG4LKr2Шm q5 Dg}狶k*\ vqG;5{ix*1g"r5}橇l4J/I/?AUz17d&PlilîtTj޸wn,'j,X{B& !ȿ_˪:aVvfC*<,"@RO`Zu$ O3hJObOȖ)M@B,: %C{blC !,;@pH,Ȥrl:ШtJZԏvjmذxL.zn|Nۉ<|z| Hz R  Ӂy  пh^؂\0d\88Ç @w[a2cDIr.=R_ ,X͛H*^̈Q`_1g"sGч'ҥUV=JjU{WT"˪YsI2\˝a7zJXn7ܡ\)C#CLaL9[{} .X/nC?2amܼYp1jD˞ݦU}cW h fش`*((p\ aNgCx`= `GcLX݆Ͽ_C̀4\'}EjF$h!@]Hm<[\"MdhȄ@@r|8<F3Q NbF-=6mK7阌XV}ؒHFHh&%fpGrix>Ag|'{)I! ,R@pH,Ȥrl:ШtJZz3ڰxL.zn|NMy_oQ]{VHМ ڥ G 쉰\UѾH  H` sufۦNx0k (ӃN,`ȏJɳg hFCp!LJb"9v0'}jJee<,*N*'Vʶ-WB=vazR¼C {!C\ ypaĘ3åq=`FާN9ÇZoԤvOarN [몾iNy)'+l'  7KWlSpw[l !&, 8@pH,Ȥrl:ШtJ*=b$xL.zn|N~= ~`Xf XX TӼS] xIZ \ȰÇ# i HȱǏ s=p,!S\ɲK6 }͛8sPlv JoӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ <Тa.8l1Ɛ˘3k̹se*ٱas{6Lqװc˞M۸sͻ Nv l"̱8y.z (lzdAvm  ܽva.ο(hwN 6HI@sLXa:a4]dw]@ >⃴5ea~ )DiH&$2X\r0FtO^tΔ9xA'βtix瞐\Eds:HMRJ'mτ&YNR5Uقnh  S@M,>,j[6hTokW ܡ+|V&$|e5n^l[UlY+[@@W6̵{-J8$@ xbŖPKg~͚0Npi 'L C W7{ GL(NW0gL8αwc!&flJc*UnrB|sbٱd ˏ1B,e(WB< 2ȩhX i`` ! T"pE-rjv.[](o`ѐEbI@OйGo,-nYQgm X״VV`L7 QNB0)PJT/ ݕufD][!:UDΜړ2e\ Lam$bE R5ѭzUi,3\0aI0I Țk=JBBLe/6Y”'{P&ۜΗ9\oIEE ҭC&ClXQ!k ҿ>MZl== I嬙UK/<`0J率;/B;Sա.>פ;N4<`2ܣ^{8ީ{<>v˔܈H0#H1'Wz9=@ϵ"K~ Qq/;k>/lȾY&0o6j|ėĉ-!=<){{6|hc_uƟ&3+0PJwr(O}8TJ$~=MJϵ~-~S紁4AK vvZVNFO"}j(hKv:W,DPkiQN{Hxex3=vEyBTdv.vjMf=x)%wRSBE6e uM8DQѵ["R-Etu@%RQ|6KeO&k.MR*hg9f. qv)1ahLJs5XNOb%eVVGpouvlIHtU8u7bXk31_x,+w06)EX֨ۧdd+VL 8^\(-)3\%Ƶ]_o7]4p]\Zou-fhn1n]_)x XFn= >4` "y(K`Q% }*29Hn҈En<ٓ>@B9DYFyHJLٔNPR9T @fRZwqz&`•b9m1Sdj)XU>kpmI6qYvsiw|y!}9yQI٘Y)) BG9 Fٚ9Yyٛ9YyșhnSyiveYI9wٚ9yY}*t nڠi3b:Zzڡ ":$Z&z(*v?F[֑3S8/gax4٣>-_?aOdXDeae܄e#gd8^v*`OyX#:aJYK ?zh:'3;!nc;Ζgd)h "h#ХXI;S3z#rai*$ee% e%Rꨞ1QfziW-QGW:Q ϔ( U(lmtT(_lūywffrgGǎj[+Km0M3v#<$l1Rr/-` ڮ!i50lp%+#rC4Cqwqd*j qC#!2֚v|A3p3fT$41;4'#Z0kmj:d R%7g7Y=~u3uբ7C`K6Akh+?;wt 7K|$GՀ&Ph۪1l;5>p;;v3n;o;ңyT=Dp:?x6>xb"y{y'xK`>}^$ig &xm[۩@txd|HpCہ!dž]Aƻ׹ F8> C »GceNkB.ˋշѸ謻V禮&)b!^B贍>*i:d?%YL :~^폤#bAoj >t볮LQ$Ț,}SAD\7h0~kIܮ[čp yZ޻P=ΖM8'P|vsc(ezGzxbO(:nFo撍\p,aZ3Dz~C,%3(} %\zS> FXCrM=-}u>jrh!ȵcOX?߷\( {O>WsU5dXLI?Fw`,Cl\ںnʅЍ, ,&iݐȺ8_:}?:fğ/m?͒JOѹ},?_/"zP._~rO&X4It>QZ^Y~a\6i&_*y .7#%')+-/13579;/ 8."|yѧW}{Ǘ?~}׿ P ,LPiPBh Jh 9| (PHLQEwJacr{@qљcIF cC#یL'= h+-ZC*,L?l)3l9;S=? TA -CMTEmG!Q;QME@. G8-uHcNLSYݰja`ViUp5 Zy=P(a <ֈM6@Y1 SVkۦlƴݴ ˚\q]O0P5t]/,vW .NXn!X)1X=s18C.*C6JNYYnal@KYygsY衉.裑NZ饙n駡Z]vAlXZS$qP38ҠCU&e_hc&@ p Qgm9dj> ?!\)1ٺ 0̃l$`/Gg&@tӡuqggsX1F jya^^qn;c]o'jُdEiS-k91vTy/+`=,s!A N ~OUpE>2" <=!k Uhi0n7M AuRp1HjtY {Ė/L:XNy0l9r E쟥,Z@1nR\YH71oC }{qH…4"h5)&_n#!IINٻ`׸Aj9L!'ikTGwoA F-:GRA[*KXv"c^,5|󸀟:THA](Sj:LiGUgW{!PA)_@6:7oAg_&B;+[FԁsȠ@AhCO~r\o6 |swcopkR o8&BfhfN0nRPZ cLn:H"ed(V -eJ AP 0Ppqq  1KF!Qzn-1q9=qh iPIQ1UqY]a1eqimq1uqy}1q1q1q1q1qɱ1qٱ1q1q2 r 2!r!!!!2"%r")"-"12#5r#9#=#A2$Er$I$M$Q2%Ur%-R\%a2&er&i&m&q2'ur'y'}'2(r(((2)r)))2*r***2+C++2,r,ɲ,+A,R'T-2.r.r&".R'?0/30s0-_.0011!*G"'3h12ojR3#3A34" -(`%=S.m20r.3/6!s5Es7y7r8 b89+5s5g^BG&5M2A/kx:3R|s;;2-\S`S95)-_:s:6]"3;>w99%tRc&s3R"@ 8or p(S/>!4B 39)Bt4SrQ&G%G5u&Q}4DT_4HHYC2e2Vs=ANYuL24 GAUUOuAgY-5DӢN2XNWEXLUU\eSV[3:w]uWT@GQ[YeR@ET Ck_eGZeVB5wEEsX _ht4ta'Y5cb`94b5`9u6@SS-BcmC=PU`iMtbY'I/Nk/o6GSdUWb/c YF v5-aMvhTcVBBskGVR`=Oqaot?6J_S5[V^l5\;s[vo%4@&ul_3-vp5^}V?]:?3jmS6qm6qW6qr5Jq]cti;\W Uu!LBMa7oVYmo`o=%9Gmer5o/unqx3u; t]Osly=tYA7ryєTKWSVKW6P }!`|A?nwALk˖(@jv[Vtw}a~?4^Ŷ~?U3ՔSzq瀂w}8t]As/5(pkYK[uR:V%5tt<1qYTWyWIx0gGx'NFS7ߔIׁAWaٷ@6bSx#fuN3si~}2xX}s&qLwzx8.UMyqkwtWXpvuV/Yrxm=yI9.T#lCeWy3t&'w-SPMPAWqWj YK-dYWdiRw2cW-9|uNdeՒ6 £X!y+U@[s`-9ng%mw7bL᳜ᓟ&sC8^h5 t~I6?/:bd:D<\۹FןY@Uf 9DіY5e7>[|yMzzyùqrըUlZZ?؇wQU]کeu\z5:r?xweu=׊˚y6tSBպϴOUN/v53Qo8tq_oHZO&:xG8ը{HQ|3{'{A:G!; 8s4zAz|+oضyy{ Y;OԹ)*ۜ{[Q4VR[cK a:ݛ;D)۴;{{| <|!<%|)-1<5|9=A1;]#~`0&9@}DeF݉';ފ>%TFq%Maƴ΍^B Fv1JԭELo`]H}}ꩾg<}\]UNҍ 0Oa^ W^̡_+՞h>K[rMdx>4>|Ţ|wLš6ΗG.[+sR_'~imॄaf>e_f b?9F-x݆1IS-hDױLJe(!d_qB3NӐj!, =Ns$f$gY84ˢa\f% qFxL6u\)u)E!@z<&DB\t$$`tMPD ު%.'e:]T(4hwv("+3;C+>fGU^QN"Ig! U"xLue,T f[&#}Kso>p2JIH gLifW௴2 PkBA+̪-#Siڜ~mƚmÄl\0srst41sKBM*;|_ ,N B \mowq͐Lmk)uޕLuNFmM¢]'ܹ矃,/o u{39nՃi'PR7$L4{㡍\j-C}ZPe\"<;op)5oY;|87<W L(,  hUND˞: <-Nwk]7-yK:x$glTiCR©'B0[6y%g+F@i0 noFanF0~C\7Cp+_CwCyT+H7‘ n G1uS<֕F~ cChk @ Qƭc#A^2̴tȥ2WbDvvyZb'k;^Yz* h.X%BVpBF lC1:8c(C .$L deئ2' 4\\BـJQ`,ʉvIӞ+61@wS: @>Hj@jP!;S=e賂5;'c )b:zn'm)K))H45He҈Ԥo;_ipZmdaV.]i[.ls"nmtn=a͹ܺu-]+WCH\ڵW( Y7yэ/}O7PhA [ lLK^0 FMt0+\N[8~;f +e8cU[^BD{alqo B2i_7 #<o;7l;^7w;7m{;m~4v8h@$@]p.7+nc<<e,g <*_yeX0{ L Ki\d)%ƛC=Ruͫx"*AQ=b{HVzz/tWXI ;1pxqH> ^N*beN=_<O{J_L;;yUw1{1@ 0y3 \w&ˈ W8adUyplWLT&W`͝ ɭTL`n!`Taԃqm8 gC\Ņah m1@IXDE\! <ػ%أH?$@"J`zh؅Y ]'>u0Z"I,Qa--b .+[//VI1 H8Nn+4 !RdpM#Fh-b  (,(%9J*j ++ ,_.>b2*KL% d B2d\=<2{BtB~|E& F|Eu !*N>t"AXȌ?]P_f]aB( T21b"бU>X̥PSdX*5C?!JZ\U~TV8 ̇/%mfn`!4o~Ppb_c*'GXLH  9+AN*a1иj :n!lk"JMPRt&P_f~~on"ԛ/'G,灪`&AҵUR)\wTV`XH@`i8@/V>3MUUŋEiV,T:mg;RBJGՔ<AOg*r-d։ZZ ١ 'HB!X `$FHZ@"™h=E쁗wCZ?b-n%l5VpKO˒:gۓiFVe]r#M"AB DrY L XqHrj9Bk?Jjk"+sQj:볶&RkZ[E2kB뷂J+k^_Y«+k+Ykkl l"l*2l:BlJRlZz_ hrlzǂlȊȒlr, @ʪʲl˺˶2)alNl,ʾl -ʬ`!m*m.:BmRlF*.-XmbY#MؼBpy5mԪBV۲b~Nƙ *fe - e| +m @ JάB]M"eJ)_,Md3M sBؖ)8$TG#,/St2sn1N!I!" Hk/\>:4vqFf*rcFZhEN;@t!k;wJ7\94i:RT7ڽ qZBXeY.PVwq'w,sWs?sndu_w1% _ lIlQNss1ld,ю˷e(M5e0#ЪhdtSxX8kceuW+KAQ5vDkx0ftu{tv/3w bxN 9:ŠNJ:\Gqzaߎ5N9n[XWXO0udDžz ,7>Lzu1HvkO$JlEr &M'#9l"ow AAP;BcD#F\܍Wfy::.κnM'+vO.# Kk/; eR.#:($m4-|# _;GԌ-ŏңdTY~?泮٪*9 ^ =Ss8'."pBM # {Nov ( xK5 xWz ץr{]E߀>N([Q>g62Wo@*A&BLSjzf[n)r|Fkv6Nsz~[!~ $,4QnØQ <r"M 5c 3A5 "TÉ=}4Pŋ(DTRM>UTKm^ N<~VlEVZmݾW\uśW^}X`… FXbƍAdʕ-_ƜYfΝ=ZhҥMj֭]UdԵmƝ[n޽%\pE!N]>O []mխ_Ǟ]m+~~8L^cy9Q\28Ay9P#@z.H #4B (Ln; /0C QN:O:$@ \;$kELES> =1'\ jPLa RAP|b `D0ʴe @ϩo:/9Eу,wLB!HGL.JCtOqQ#':="3 &,h=BT$hw,M gV[/Ob!QK=T=S-:EDLWP𕈊@?QaXRU5r$]rhj׬ML9LpdXr BdBpw!psRВI~)VO@'ux1V\VY8Zp45i x6֝{f`sD[F:iC5YN 瓽jMZԯ' |'H2Q88Qm~΄F{y.K.zBnDWUbp0\kLϚU3YNp#3@j 0MrsLrM_6Pb.Ys =[۝4y}O;Pv?wt5lNp$T{=:V&uG?}ne-uTx~ߏ@40}ߢ?*U/_l &~(*@(p0*L(nbr `!'A_Cӡ-RWY  0F R$b* hЈt`vC~3rw">:SH"b>F6ґa+DBLr^HhNh81$;?zd'ɝ1Cb5h,/r< /#5Y"jj^ILLt!tP@4BKYpdND_%-!MFQT09DPBK@&yµ~w{FIT3}zM@gPfB1ͳd|;2K+/LO$4#UR&`Ҏrli$ sd)t~DL9ʛԣ[OBdԜ23O\m('(QgXfnaeF%+*3. p נZsEh}/XEŒR9."2P%ݏƼ3AIw@PH0s7-8Էe^: El5l\Hj6ʈ54‚Jmh ҥn (jZsk[^=㵭D$ @c6NZKנsG1[RQQHP9n*94|&ǎXδʛĔwGy|N䘱Q-Ysa.I?猓#-X FnIJ,wGLp ˁƪ| n"<&+8dH@RzEYbDM 7bBL00LWݼ& _oނgL(zrD`\$Qft zi416H4i&Uբ"4(/.W C1,EE2kɢ8y(Y%ƓeM܇hmQ@σmYJۘf{|Y y(?BsR 0sW6}Oj-"^@r󝉧ݼbW/8/聣&Zp;۟C=}k y'+)z|Tٲ~߭F9ͮQֵb%V sSЂl+@ɜ&v~$g/v> /ȫIz_ng{=rWr1;PB*~¿Ie?ễg<{ /tVu:4P#k8)@ "S<{9I|,ly@> ( T "29:-Y'ǴaFGs·q٢Xܟ!B|}zL~ĹiAHGVdGiF}k9Plz#a:zEK4RS`!Ma-gzk++ƨԨ{ !A"鯭ƀýQ9Jԇ(E'O@dDʥʤT;"8",J%#4-r[zK kAL(8C}$De$L6ѡ<$KrḰBz輶Ʃͨ?@A%B5CEDUEeFuGHIJK !&, 8@pH,Ȥrl腠\Ρzx8*؊%BT1~R sDtB&RuIl_[]KycQq` kWErtyQ jt QCGYLܕua8  B$ Iŋ3jȱE H JH$Ms7rHa"Ó+f %C ķΏ;?*]ʴӧPF 1!rZV!XxM F0jSD]vk(n]-xV^}dB2"$`XUxNb-eaÁs8yJ۸sj@aY+6 8 \СC+ ҙ`: 莫{wM>yF^ӈQ%-p.{Ct Dw pIBT@-@w~(]xڧn,0(8`|5`(-wq(17& EBvZD _yP҉ TE;$9ĒMr kVjyDDPdTiėNlFIQY@=EfrUvx@fbf9ی6裐F_V@r ;\c$$nPA2\HB,OB wDjjz JLI9DMa6_蹄`#ƕ5E+J+˦#tIn$jF)eJDA-X2Jtѻ.YqkppP)9WEkb!K, 7U 73l-t5Ǧ\kJ 4 ;Ͻ-=dK7q aੱe:ADln/ xށ\W5"h\̳rgaŔ77&]wUy YXhv':"Í9(n{~[/q ξ#}Hh-j^%DpKi-|<'L=+PJll7 ˎ")C{gՌ0rZ&a'QO/muqD]2@^%aP-X-y^ 5"&IMVr8R&.dj[+ .!C?-z P tjQ@DZ@ǹ0V|DAHD,?zcD_N`(%\@F XqmFF7EP'IJZSɂq~ H m0g"6/]U&W!)'sT0yi\SXS^ X]r$x5a#1%@ ꕱqMXƔelrrLv0y̧>)y "ܧ@JЂFІ:D'JъZͨF7юz HGJҒ(MJWҖZ 5\?8ͩNwӞ@ PJԢHMRԦ:Pm(H$ڼ v&bĮUi 6J acjRQ\J׺xͫ^׾UFN(b/J|qqb0:zH"R=-_GKҚMjWn<RuX~ݒp4 b時;k:ЍtT3KSV=[?1b%[:Դ^ ތi554Kf3^tn̄|!#bZ`(n|BF01\|K$Կԍ'L [~mXW ɹD@ :Nxϻw !#,+b'o?B\~AYW'{& Զ#~$}OWzp3ݤ!4TGaDdWF×&d@B9DYFZ \GٔNy*$ sVyhB]^%L dY8fflYsmrɈ5vy)(|ٗG 9zHgƘ YC0a9Yyٚ9Yyٛ$IY3mNf+SVA).Q> c U oEVPԙYVR6K)!W%^՜ҹYyB'#^gZPv3V~Yw% zà_y(j#o :ae z!J| 8ilH$&Ht}r,J>;>߅grq^B8N[^^\Vaa|h]hrjp! y[:㳦^JJ:Z+CQ<4dslg !43M5BvbQb|G0X%peF rcA o|;P!p!p$= >xCIc5Zʺc0X7#B[/#1#ULH&>$VkXggh%*h}֭2:K:}BbqVy8zuMR(2C":[4)WiZjk0E9>1k]'y++l3Al kROvjsԖ7 o:S: /%b8Yl3/AاJ|sGƦo&0 #<IhB1Н4n1SA@$)Ft|]§Zbhk\$wE(E[` H kTj!-0(,y27 gbdñÖWWwbZdœJpi4:ZdM\ʃUK3,Ą 6؄J4iVrqфneMqW޴Kq %[ƞɺ<ʤ\Pʪʹe~˲< `I˸˼˾<\|Ȝʼ,œ9۟GNVXtn&3u}pllz*T|iGQsqh<|tAϫgvNܮЋԥdZwgV*┓ڒ‹l^w悷ESKkb0ǀNh5媛}YKL wmw<묾- n(n>0h[lm=Ǘ|&|ZN.{wg_ hN}f}&C^,bۀ,~+c ƨHR$7H0ZLGv$F﷾-L]=yaP& HqhD Ȫ>1g]qMlJr\t[v xLK2ǰ~,Hd(I?yPb ^դ_aa޴+Mj?Owp?̊~Oov}PNu~n*鴈Y?_xq_owd$?E V?1v?6y-AP#--Yp]Gտ :Ѫ'?_?_is@@ \*aR.MNUn]eVm6v0Pp1QqQ,3Ss43#@#@6Vv68Xx9ꁨAt7Cy;[{yC#=]}],W`}?S!@^_@ 4x0J<.4@bD)R9vd804c0$H+YtrO((gN;yhPC5ziRK6ujTSVzkV[vlXcɖ5{mZkٶun\sWqv@+\(qbC@aqdɓW6`/e͛9<ႀΣIfYv]1}^׶}{Vc"|p{8R6i7~y!pOz6|~{v0||xP<{|zC~|׷~ <\|% -m6I.D<4mB\z&ZFsJjd=4"4FO#|zy*tEULJz~4;R8aFK7)< bL@@]#*0q>]1X4"PJ-L5ݔN=PERM=TU]V]}VH,LJ^p<v`b=Yr2?wU8(KE&jZ{./C`@$EE#1bsE +&q+N1Bۗ|UE:R|0f[c+!.yFtxΘDB1:'E|LS;$ߋ)՘ l"!94m䆚w}$[p;6['7:H`dQ7-P=&[k($mCTJYRz=Zp9.I Tjזf٭jk:A@ ۄJ-oO5V= |^&P宲*mAeTSifjLYg4X-J?uN fJTURpbK)[Y^4;HRbA_D.rdR٘DLm$?ХVw5;s[d{ $RgkUl15l!S!H祸~zE-)dUVry6HX\~[KcV ]هx0zIe!`X}s]KwҮ_n)4V=LGәW6ezǶ#@gY0?09kU 醙XnFpGיzҰ?W/:/_q;;ѳӑcWfsMr9]nsuhxH V-P2&K03;@R>;ޔ5/tJ7j0+7/Ű<ٖ;i=0wU5[FY(E-Zf;55mJ|o qn`:dChd6FG:.tg㨼"{2FFQdƚt]BY)88j Ս-Dg3q 8*@}yH|}G;͓ sG\hUtgCǨ/`e'B>R<豗)khTwu8gKpPGKP"SЂM[_a$b w{%~u P  P  P  P ǐ  P א PPQ Q#Q'+/3Q7;?CQGKOSQW[_cQgkosQw{QQQQQQǑQבQqAC R  1 R!!kb!"#R"'"!ib!""?$CR$GR"7/RbH2MR%[%_&h#%-F#Q;Y2&(2A 6@NR''2hr)'o2#ёD0)'R++Q~j@ egPo&2lx#S2'ղ+/2AbR1+#)20/ϱ*~R12+S+߲1 2Ğ'##4!hh*333-5_S$'S))G4h'WIP68S/RdPO9SJ5kR4C31%fQS7S3!,.23o:19>Q3;s3ݒ(= s<=Cs;3;;'?8ܳ!,s@?@3@ 28EC+D%TAR;DQASFgBgx=F\4?1strEU45*A +eD)EUT߳T=QgFOLUOYUB!HTwtH4U{))4u4U[MU6#sT7$S3OVsgڲP9@UIs12V#@Vە>S0L^`Tt\SZ3Ku=*bXnsQO<]8A@oK :NU X{IͲ0Mca;,45/R>P)_ORa99QL4g-6< /1Ob/_Vb.hXGd5S=954EtCR'}vj30a7VlCaݴ?4kkQv,I,0j-i96LSVQ5۶9Q28 p!`gU]ysmvl' BuZ]R_ivAsn%ly6aor3Or[+rJeR%V0KCT&+Vv5iyNuwH'(nkwif4l nG;7`T]{G>{z93S;!FaݔzHI[AdYUW7t_2f϶d-fp}2Wwgzwz6I*[Uoc:Lz}mjG_q%8KX"wQXti'8oW}wd }Ak=sc~ׄ8"7Azkc+8cksUm;5/%e WDs~V]Ix Wx54T|fYc~wXM5}{*!@3y׌Yk[x؁e5Qr߷|-Xnׁ׎8--Y[הJ9*UU0Wr)~~/Pٗ9g6MW(IS7sSULvyQ9zUA95(j!9[Źx5 ՛ .vHIJ{wyuӗYq_c;-lqm9@L!-O_/z?#C2DzCU'684mSwq7buT\X+ZI73[:S7@YiAnXRCQ6h6o8ؐګiթ:Zu'ayzZTUZG/ ر'+۲/3hۖ;۳?C[GK۴OS[W[۵_c[gk۶os[w{۷5[۸z۹[ۺ[ۻQ_Jۼ[כ۽߻{㐥/;)\ ik%Z[zϏ[Č`EX&\eFg$VnP9kos\;ӫXPAa2jȏh0\ōYpy\X5ՂˑOb|ZaV(0,KyEMXw:@2k Jmgk@O0=`{/3]7{t@ ]I0CfwT\IԩƭܟiI׷mWb} KIPdglפ%&\ӥv.GcjI̩|*==XN*X#ɉ,YZ]sIs,8Xѧ~ܳ߉}W(>H*^ۏ\2 {zAȊ¦]TO҇Y*"@ڤ>g^H3]ޣ^꧞mށMWgV]E}ڷ ͩ*H >?n~JFXv>z>[Og gwEۇ쑚 5*iDj. )}R61퉚܎T)ܬ-AHaMHꇟ>NfpH oh HL&tAit=CԬ=LJmXL_H<:E0\z*1,Cƅ`.QQlK<\aYIn!2ܒՀ U\!fdU%'j$GkEBD"h.q1r2s3t4u5vvuЄp)-FE y֪,(o[1ီ %.lp_` #ńD[Q1}8 ByRo =RM2D;v; PR:v\$g:8g4IFtP1$kH" %,/.l`XZQ{PHruȒ27-n2ZvoY }niќQWȊ[.߶w3pgW*9JPE8SEԗMvH/]WfRd)ifc |j!za2YȘcVXxrx^=:x}!Zt8g sC.7UFWd68qH tGTK'GYPwB+֖hy路l $my HEsTz.hlZ^k8 UɄ>Q?o~c! :*za"FbS1-Eƕ*Y*鍘q`k1c]x ɮڧl*F)H}Y|*"ڕXe C[*Ǻ J-jtޜ}eRX<.{Fy-$2!yY{U*!<2ɢ$FՉ˖ ܚ-R̝g1qz2IDE5clEOLG,6AYv/y*O-~qʦM/zKa͚]XQw%lZIƧSpjU ~qX4%;8K,|6A*Ҷ,KȐ}nHN#ع['k{e]]ܔ=瘸PuM/azkw~va:w.jɱgA8w_l!w8GM?(QU8Kԙ\7,q1GB~sw`ɁhT#.H bh QhrQz -"BO&Kߴ%}*6w&D2vxz1 $&Q# 0  d rq$#YF" 8IRD"s -r-Rt21+&2)6L`c( n#ܤ:j3i$cШ >aR)vGi2MB/r3d`,$Dy| (^BtB,PbtLDFmL.}UC"^)EStL_%fuT%W?Ѣz<*IԎU"T?0/ªT1MXL#EQM{i%Z*UFա$)q] jt'e3,b="S´},6an2C,F ,hC+^U6RS,hS2賫Eb/ҶfGkUڭG>Z2WR(I܏6T.v NM'S=/z;:57\+.~fp/,蝣lW 60#, S03 s0C,&>1S c,Ӹ61s>1,!F>2%39 t1,)cV2-s^2d*f*`5n~'v3=3-AІ>4E3ю~4# iJ[t2fĦYN#B9ZEZ5;>ծ~5c-k#y4KGըa4 jQ!>dr*3fAiLG*6Sp/HĪgu~7kh:"Q5c-L4\p6E-pI/hhđK5Oﵗ0DaӆMqp0U&?9Sr>^>KQ !S&oD>Wv*AHl2 ]q5CZͧguy籇b%nw PfӮ=n{!NH.G\|wX|K R) hu#ywz6aB }ɼs"* eEhuNŌv;/+^{* 6Cy`nOl->jS/N }"tÏ5%~] <sAQ" ,AO'}5dD //en f1AllD- Z>Z@9_U N ~uLbL $ d˄ "-ba!E2[ZhZ%!mb#<}ĉ0 I0'$A{`#&np CAIx;j.KhJhVy`-#@ ;=:$0#2&ZCmbD=Dax}$̈|B"xG8ʁ&NE)(LVL^=!q>| $QQAZ^(e2M$͉NI ~d4,Ӿ08:!r<1D}X;QU WIQ`&%e]bNeUZD2d^e$DK A{΁LO'DNŴY}NѵOd]2mP]__aq&BPݡeM統EEWęorUH@('1k ~!0Co:*$*i⠍Sh~'K" S4ADu#r^(fhT?*uZ3R*ɟK8I`' iFG끁+ |DUUNJ( WtU]UVJ,j(`ryHDޜ! RUKyvNiXi_1ч/MHGT^ʗ7֩T.,^*-)n*v~*!U**j**s!@t9[wj檮ݪƪ*+@͗&6>+FU>زV2fn+v~+++++ƫ ֫+櫾+ ,,"l \+j_+FN^,f, lv*,^ÞɖɞƮ,˶rƬ.l'ZXoMKlz)2ʺ,&m¬6l͎G9@  lv- |->I3"FK @ - W)B:iHtiSCm1Bi V d-JR`Uqeyt@ޤ}6QњҎ.nӞnBmԞ$m}G@@ג-̮p-@H'FJ o- &}۞@ l P=@Y2ʃ&gjlo0ᮙⰋNB!i l>(N2Hr)mm+ӢnӪT{Ʈזq2F @`.A 8N#Mp КD ѕoʰ\G(`GFVpӨJj|yCH0np"p\>Dp)tmFb]pd e^ToJ&e2S&4]~ GCY%q212{A @$/%I@Q1{>H` `aIFP&̘BN.k5"RsQx. {uǓ @]% ^3?g?@%AWOgP @jȁBAR1|Yc@< 1 \ t*t!iG uO-/a/~uabe{!6B[r(n&TbGU $ xi qHPp#7(w'fx$35NNLLxS¸j$SӬk7E0KԤh-#ԑ zy48W%J+Wcwqh6ai8eyHgzfy1 [#s{jJi׿.:_sv4_[r? nE Ъ#[r?wEkz#[r?񁾄kr?aɃ{3$GdRd6OhT:VWl3v_pX<>Zfox\>w|^@2BCDEơ-HIJKLM? Q0 N /BXYZCHUATU^5_=P`deaRЅ/ЊSҁTI c0n w/ Q.[faߚU˧y_&(u\yҬKP(0Fi.|0Ĉ^`V;/<5;T=+:P˝$2<˺`Lo W:  F E^!`."-I.\]xe9"6p͵O\Ys~!iAQ,U/5pķ~շth` 1R7b3FM9  4T CdO ;TcF.H @ 5>(?drbً3c-"̴K!PwVܺw ndM֍ Ѧ;{NhWŠaq: ^5]|siWT&c1itқ;>yh?QN#t4NO ݛN}gq@{\&P$S~n # y(yQP.R "+3B/]v ѫ@u@/ be Yvde=2U.BOWZOy]dOT().cN"! TfU h(U9eTx]H7-qE@w_6 {i I>N+m YD1Ęxa^>f5y A-hِ2Loz_;F6r"G IUOd ܢ N{~fZ*9ӹu$]Nf3odOqe >B4 C{* * #"CQTia%Aŝa^J$HBI-š_DTf#!K7dU]JEVU2sJ!Pehpj`Ȩ__$n @Ƞcqh 4sƳ)߀)Em2ch6pQR4$D*oahPYO~5`-{2 q-%}Ș7`.\_/ɮk(E`_/"qQs/I+MHٚ^3&p< [2Vv/6cq) =HRX2Y&[Fs0tĶ1dr@Yy' Wa*WӦMjcbf6=mCrN"X{ȀHdG yyp&z+/PZ%M8bh1 ܓZ/8]:Ooz|B)߀^[br^hb35fKo,eLm t_|%aYep'ZhIV3Y֩v3G3vJNO\af`\^4Bp]'aqYÁn*bpS|ȵՍZ0m_{ y9 H)@Z.ȆEy@p{=i{(O(Y(eݨ/DȻrrU 5JWb3|eNͮkQlGsw3<Rywݩ83"3v(S"? 4\>θø@||7 뎳  =8 @ဣds=X>ܐKYۓ=U1\4{x1Sږ./n71(# P n)3?;C%@X q+? &?S R:jh{=WW87t4,]25DDPĠ4 8#D0ظE@R,QĭXEj3i Q[Pb(3qT1vĨ I¹eFavClF=FNFn8oG*rt@3@DILE9B9(LlW;j܏TPoj̊ČMdLWKk# A@| <>+j\NA܈椊l*ƚM֚ΣNN2hKW܄+!;=[KKO ;7N4t<,i.\e<ʞ/ ̨yP]`f1NDTB98s[:Ϊ@4y|7 0 85Ù*PPbh%բQN 9;6% s`3 长 HQ3U*+1UZj}pSXN q\^c@S=V׵i':3mUYMNH1PT-魙T%\ͬLJ}K= Px%͍Ku2,!CҩEQ^ZQ/c() HP P'hmӧ몍 HJۻ]3ڨ0 R *K*7xuM>t0QӐ>^h.Pׅ]fZi[\O1ԕ]P]M[ao[]^K,Ẑ"TC]6TcQ `Cƭ^|\mᑥF\|ߝ ?`SX%4{(_ 7L.L`8rY_TyUNfˤd Ov\]a P&E+j#`c̠ n=`0S$6bDK$;|<8F0sϒJ{88K- NaC b/A խ э0>cpX@؛߾u⩅?)+U(M=%Ak ⴆK~k\dXWǶkk˹^kk~JF惻I%L~lȎlVH8 Yl)l6l^`&ȍtG.m>mtP>Ԇ~ml֞mڮm۾mmɆm>Jm஄ ! &, 8@pH,Ȥr<". A DzxL.+Mzn|N~{QVBPWB[CPtfLSIU]Z\K_ BbFCx P P C[I RJ^LK`,LE7>\[ȰÇ#JH""PP9sĊKXĝ<[Z"٤_ ` 裨S^ͺׄjBarqsI v8q CWeMvLŅ!'X9N; CǓBZ @*2x]DVX gMhyP}0~ޗev˸gYw|[4oQ\}$ܤX&"vP(ZmC89ُGpIhNYy`$'YAThEXp)眪8%T[6SYx\E2 Du(XR1h)iy#[~%H@YfvgZ?t뮼+"vC;ATǀDP D^٨oB+;K2D4+jg ξJSJPXWh,pz' ls㟫B0k Τ6mhb1v,z+'! dF cbSir13 lH'C|l|RT $+hs]ncmVQՋJݒfCVQ3l 3GbSHҀ.tN5ɢ ILږETm,5m_ y8-6)<͐@nI>-NQKpز~UHx#c.BY+Q/g<|AJ2b쁤y?E/o6jӑ_H=1NF-#E>x\L: p+–6%&`IOjJBʠdS A M 6ʣ $>l*3BF -,!dX9PO1 g"'1H%@GD?rP"&xw*/&cܓB|xL91@XcUA93  B~L7NzrxBRs;*WV򕰌,gIZ̥.sL΀IbL2f:D A&6nz 8IR+3 v~ @JЂMBІ:D'JъZKb$юz L01(MJY# a0Lgz8ͩNw5@ Pj挨HMRUjԟ.P*CRZX(Uծz*XJֲOfMZ׺4Vp\u^ !P} `KMb:d'KZͬf7z hGKҚMjW+t kgK[BHxjB8|K&F5rUحЍ='ZvIɈ ز#/WLu|K'Ɨ/Dt$Wj N;'L [ΰ7{ GX&z:ԹL|f^Nl.%,αw8ߪ B hCJQš2XY #vTN*d؊MxMe'3n 76ͮL ?&58gu_7E51J։M]G7+! %}Rmr˾yrgk N{Ӡ5cup٩ \9zXAba}Er87v$If4NLRf*y%8]XU8[ϸ]kS[3=~m>)qҢtSO0Xg;s|>+mn\UЄ\ϭց9Tԣe(M%ܒ?>lcCը2E]m C~p"x)js$xm׉،v7XfEw88Qx ~##{H>'ܣB=>?~cC|Q&+|#fphr\mB1W!#D{$4A4t=!7$B[w3{ؑdt BKW!6BٶCWҁ"/#dZr[ &YAj@$ 3C4vyX>-H"x>yx|sHx~iFFFiw~tGbtXvFy9ceIBGppa`uD l Hpm4qj9YfNؚ9YlAMXٛyN`9Yyșʹٜ9YyؙڹٝFcXi}⹞bbE{0B5`fPw3e-d VmI`uMٞݴht|"DJĦHfk * W2vM*Δ1@=ZtdPkU($eIRw &(ڐ,zHZK.j'(pWn}Qo{)fHr6VnnwA_aR:Tja*v`CH@!DPp|pleSq IzKKz'$6,r@"dv!@l86(狀[꺻#čc كtHУ+#[ 9(X:D;F?KsCˠ?AK@4z89O9% # .:GcHx:d9@9냫JYFDXJts\xozE *xG໖f@qfJLn)IHEGDHHP: =ikh엛qn@2p53y<˴LNT˜W˼<҄<ʼl^Db<\|؜ڼ<,8Wl])U\+ZIϬ Z3Q,F=Z$ПpY]эՃmX 2\ҍUI,(}X{cpG)02=4]6}8:<>@B=D]F}H RIJ+5`4HV}RUou\mQ`Q| a}ejh n*tPv1!ue_׀OH].$_B8'ٖO}A }ٜٞ٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۲=˰P^or)hqҺ"!!Fǽܮqܬ$ԍX=' }V܍M 2$+M 9>^~ ,Vx^EUe y\~"zq. /!NcX! ~"\6At^[ACNnu&.AqTZ\^`b>d^f~hj & Y)j+jx^qV6dL#DdM6 ~ܯRƟ7k ZyNd0pndL gt{xfmFꪄq*h٣-Q,Dc~K~0NuJ0d`kT~ȞƤv3HmnZ8_zܥ&toky_6P7ȋeuϱQ"i&LP 4Kn` ciH,t%kuJV)-;>7j쪪PϪtN\MP3pmciqu1fG wMs\߇ja7| EeⲪEt!+54v" ȎW%WiJbk3JR'+Lt[J믰O \9<~Q:,p:{Kءxc0$dn/?KWg΁(+(²;hs!-=\5InO_!ߞXмӸQ\M"^V$>K$kL, z !#%')+-/13579;DBE+LTWY[MLG!Di/(4v{f"~=Isx fknt-l .8/I}\&3G8]!cʜyFY 6 :9dI'QTeKHP3 UOU2iLA`G3T=z6@uK2l4b@z5Li[Wtk$80fpȻ#T{R^ TFlX1B,O%BTkَYJvsgϟA=VT,t|L:pYe'ᄍt'S Vz$V#n,fmP{`!%H  潐C1% ظ"E޸o2]yi P ,P͞$ZikD<";_h-dÐ(?BnaΗ =1-!Z :1CEh"H [l`@'0_jJR-Jl5Q5Y1j" {P +6$0ҠM8㏻7\&؄s*sQTO0TQP ٳO;sM`;Bmp/Q(5RF0S+(,cMVYhgPp94DS``(z P`W\:h eʈ C x\qɵ\DBR w\_hU}MgYg(y5Edxd^ p*NdkK5>s\*;7uCM`Cox٫Z뭓HEZt6m ӂ%H@X&e@6` ʕIVm[Pl`= q"q JB8eoERhoPe NG_ ^5pF] nOrVq**ѻ wnмw^~5*O_$/b4Xe JK2@N1A nAB%4 QB-t aCΐ5 qC=D!E4D%.MtE)NUE-n]F1e4јF5mtG9ΑuG=}HA4!HE.t#!IIN%1IMn'AJQ4%ÕJUt+aKYΒ-qK]/La41Le.t3MiN滋Mmn79kZ@_4'-Yst;qnL-x?yT@ P.X Yt ,h- K6(3AU@/yA4 (E9LEԤGqSm$ISSuqU4\e)9 UgKWyӝn]HYUj+}*+JSѴzuթSJjD*T]10lyTSu%YYSĊRs=-K̙roMdQZVs,ҧmuiDj|V*فUr%xʿ6l䮖&浩sJ\ԩ%ͮ/T2u.9%pXVڀn:A]fCeeHKiI{etA[ֵZ1p- 2W:yqoTvX%*԰V ƩK+cc=nq\[ 8EU,_ ֶ 0r++|b"gx#i&eYZ]v߻^'?U qe2lo}=W8r-ne_Xʮ* AqaRSЂ>q3vhkCmtue z3bz6nkM݀HӒ +tYHoU5SoR5o9ct+)-nV-v%Pl7uo{mM 谇zaC~Ssn;R@ܵJ\^E<ɳz]x|NOVgh)J2ʑ{Cp*ٓh 07[*]lY¶PoK?j=W_s` ž3臟et>vEmwͪOOVO OvGҶﷴ*  Zj2 jO . 㦏8n JRp М*xG׎<2xOњL 4rc^ p n4 ˰, }Mz\0 ֚Bg 0 LCP

Ƅ,|mpq}v8'NX̂q0lYkmN6QnlQѡۺqϷ`' $*H o1J2 q ,q 1+q.PRapy. Q# %BrQp!} ahP%c',퀲|r(&d-ю)y,))r)o*)a1+2r²,/-%,ҫВR2r...2///30s0 0 031s111!32%s2)2-21335s393=3;S/Es4I4MM>b5Y5]5a36es6i6m6q37us7y7}s6㔄sT7839s999m38wSd`0Tc;T.T%@6  Ң$B ,3@3=9C=CA4Ds=AAMCD) 6bE 7(t &TBE nTrB!HG/GbtN |tf>SJ64< @!P:YYs?x%CGF92@MMQBȩGdLsh0Mo^ smDtP P P;DANeIŀfQY&BmhRTNE;S4TDU<^JQSUTAum\FڴLWusW!2&RNRtk` dFz0# !Fd8JtC5\u\ɵ\[SQTZMQa@5ZF$:Ui2ZdZT]i5 pZ$[U_=_^O`uZaaaZ4$AOmPxmOlGb_ㇱ1?ZxHPd,b@78SGX J_{)V8#8sOgyeSEOH w„^SrcN}5j` Hyk{vcybMV| H!?Q eƹ"4aٜ+ak3T1S6}}TFN+r+UUyphcv@t\yC`8[oy]SA)HX ty E:bT"&էzy;:z1kY!`b5Zp4١:X$Z()bnEZ'Jks`P/tYTMTzV`-S{xwfmyz5WMջX`6yt B[Gd۴kng;&:I.f': x :(:/NZ$ ur -@rWF#6q#Y9ZcVw7|H8U'\1{黾_S 9c]7+Stpv*lzfس~w՛w j9D$E`[z:aAFckC:STZ e<8:aܷC_PټZmmw'=Vz;ɕ\b\ܼmLD}zM538ڠt` \nɯ-eeSwc[kG\|t%b7 _*UsܹTt~z5U0ZXzE}+ gwǹZ?%äܒ7k½BC J70}aݬ;Fx5أ?;{ # a:؊`}Y2OJ%eVFjݡeleViԪ;-YV7gW vt}bd6[U{D`*B%~[OacB9^c@6ucUG~~5RgtxmuUo^;3e~8VI8y& ]c}iAE]{ @쟆fSGoos B;n7#voxvsy:Tgym6lS)$;)~)iMG>؟;?h~FH~]7>?zMOIy>raQg:q_e?AJtHTl=dF5 > &+/37;?CGKOSK! kosw{{\W (p "L0ÆB(q"Ŋ/b̨q#ǎ? )r$ɒ&Ol@!˖._r&͚6o̩s'Ϟ(W *tK-L Mt)ӥ )u*ժVb:5@Ӯ^ +v,ٲfϢMv-۶n۶yKֈ\be`]pp@5 !l.p wj/cάy3g\IEŸ%"Jŧ=ԍ/`et` Vzq5tuz޺_l81- )P] vsp`JʝϣO~=CZv H-$ۯ#`SY m"E@Eu5}u' rC$h^0]=`@ƅ+zP$!a^{7☣;bZ8 |ʥxsrǸ蝑t(x`Wy/dJeBXal`XD`dkm1 `mqB^PTu:1] *_'*N p&/4߸'.%QX"V@ztH%|ws+uv ;"$^VHB *F t3XV/^8is2V3ۍ|Jit0 %#FGh!h$T]*J\βb*d6y7XXs c IO|җ4' KjJM4yħ#8mS ctz(,E5X?H.wː‚D|.~DM7].ܔAOX茲ӕP.f!i!* zA/w*ŜM^Ӭ`; c4q-.kS~EraX_9q d(w5jX#5AqB0 "0sNGqv c jtg8a*7K)~&hYXvC߃2i0#k`1;T/ wQó0}[@! A΁>!#Ba$[2!+PIG] j@w;Ru˝ eIb%Rޣ?m8RT:ߚ3PҀt<7 P)hGNن?|x2x F%C X9RB @d4 KlV- SIޕ2It dxA FX\m @tZ-:(؟%AeU' D$ o9u B`vFb[matMf]4A ]̯} RyANu\  `(Ut@$ >AL 1N # ƣ0 AQ~:2a)`U֛>?&c̩QT@4 lYJ @FeY da 01O_AI0A c2*&a6a]-!ܡ@tEe)`f9k8b\xjVe=bob[>jue:}%h)@[:*]d̢&e` F Py9gH`nex.AQxtMfM|ѧBݦn`n&hmbR1-P6(pb pzWg"dce8gΑg 5uN ``M͑ U2rdA*$Q)*ghS""mOt_Ʉ(.=m V>5Tof蛪ᇞq_."Ag 'Ш(wc3r2EQ qY7S{b!rӤ&rFAE"x)FUޑi0))ڪmz(JA>g*(⟌A~RIu ^ɂ!aFk6(ѧ*BARΪդczxEhYf5)ݪ**ze_i"*Fg-.l(ةA_&>+w"jVMĊYuZ"Q,l(Ƭ7)be"g=mZ&m.e,tT1bU+pp,r&j@@jɺsb^[­dsF,Z T,¶` @*-_<(R LG&u.w~Q.AˤlJ2I#I Vp-9YmW֊i.` kkhٍB=ifjؒ-ݘ~"HADX^ P䉀)ޢ.߮$86 v⋹ a0% pF%01FG8raRzTH6lkl!h2#G[+101Ӄ%`Ӧq)/Owb1V1g#r"+"3r#;#Cr$K$Sr%[%cr&k&s~'r((r))r**r++r,,r*cp'r../s0 0s11-23s3S6$*e 5cs6k6s0D0A8S;đ*hUЕuQ(dݱ>r3)O`#Ӈ5w@tAA7SoDAY2An\s}IʉCw?CPaE ԝHgmPfYqL LKtgP ˂7y~rL[mA]|i{gySTPA*M}wHqek禨axPκ]s@vތCG6#ld>$Y: ;#4`j08/6j" hjR Da2E9dzU4G2H8K7R1 &{;G4ܡ@,I!t'C) a%,r:O!/ Pt6t*́`yzà.\Mׁ~?,VBz>cA f;C2Lb_PR؁F.TTg~p]9( Z5YZvܝ` SE6t=Q䀈BIG|#&,c Hwp%Hsp#ٴI @HL@pw=ĩZ%,f%^3klb`09R`,#/I]>t dҲI &MS3o)fP_І,ɴ>dS'oKhznyfWS< )O&m 9Da|ZG٠oҤ07FQ<RJͣXJUR2kiLc@bԦ71eS=jPY ըGMMT65\!TK*n~Y-vի_N:֝bdEN2˴tk\zadr1ym(M:Xblbؕf`.&c%{ 0LֲLcs@ء^dUÖִ]E,gUZֵֶmle;[8mnș>ַnp;\׸Enr\6׹υnt;]V׺nv]v׻ox;^׼Eozջ^wěA;_׽oqٵ+Yh[_$o0lKt\YZ~rp R'oSIJ(ӁHֱ0U-aز|ԙ>9sɂڳ%ܧW4S\Y.ZͯSٜgy q~'BƉ{fr֔, evN @fHJS,in `gGOc7Ze{!I !RY@F近`!퀀 Jii`}kW|EysvQb$rMq22 DXllL@G!1Q97[S>_{J<,Htdd{F"nOP~a4sd$vޕf~->xS s (p2Y `MoSy"$k|L P:ywhD{0.izi ;hջ]dWŰU1zg ۯRfC hMZzQ3j;T~'/QW ǁkd|PCПPQ1kw&6bJVk@ڟI0㓆1V9H@êۑD=Ӝ@7A{$i >s| w5ָq; H A2[#0T=`FSF| BY DbvB,;#y4|~BC8,&jAC;<&'NRpA1<#/˛᫹:|ؓ(À4|*k)EȂ+7< Z9@-i'0\;9$<ƊCx<1,K^gܓ+HS)H/_; cƖBZd [\{R=4Ő`03X0I&adܦCEi od a$H5+}B1ė]35 ZhGS ѕiB~, .sLGڸIx,1Ԉ4#Z∴X88 K⻩ XǘȂT;H;Fr%x Bbב>t T|E8!H0sH8nD832 iKIEZĽ0JԇtxL.!:U&Sv 5i̝ "Z^Fk88v[$ xY )2#( !'ʢhD;0# @2-JNP *d4#t4$rpdDvܼgӤN%c`HͲ0,)VWLl'Ӈ$0z#BPMO͆(Us%ē,y4 %T7l+ϒFC6PO 4QxAt\.5#E$%n*U(m/]2₫z./Eҽ+l301)EҸr0બ29:4Q -'SH>5/R@A%B5CS?UT:EuGHIJKLMNOPQ%R5ZSUUJնCX=CY輖95U'uR6j;V]c5V VJhjJdPKe%jUVV|%YMTY;M+u*-ؙ_ͪOt5VdWJ$;:j0%.!'[2:~EOW/M)}`WXBʒ:㧥֙ה]W=scX$ٿLYsYfL4A*;ٜ'؏ipkisj4rKqZFmTGxa`cWU[cYzВȴ|2,cxӻ۩[˪ ѲځZPC1%3Ѥ9: \ɼtܜ |,82+Т@==XUv?RzCN#*_CD8< &f[bc?+/ 6n[{9tpcKc4)~G÷#i`;8eI(ؒ'dBEZw#4tDC ٱ~#-&eZOAΙSTAX|d5P@y)--(BK,"Seq )+u.5#x&h4}ip`ݘeQ&c~Xfa ɐIT꓌V6^VgnHt&,&.Y[92u%\gYH8Jk-GV\v^-AE⣡uk "t0bK |q]xhm,j+Y!jv̶3d!ӱd4m2IKPeLFf6jrm3IFe$ 4:NY!ꔺYń4' ! ]Yπ D"J]&{cТ4#;6Xpd .N/6nEF< dPskk1O["6lQ^u:^jPwtfѾ$D驕>xV;zqfփcbwr$YTmpD>,iW.w nb-G10r|e:W}1747oUsjST\8U.HI#@;pǢ)#v÷.\U%m&~$H!L*aGF;ֽqfq# b 1c_9YW(ht9I?쎃 uZc%-bY`ht&*rҀ @@!v!m2^8M>%i&=$0d0 !K(Dn2c`+U8% d \@DTS xYFLk"*g"IQ(4PZ:BwU@Ē3#tta!IF.eL)怮ax\/)~b HE` @xg qTx\$5VL_glΩSF4ЉO%@ըcOκȭK\JWv9luA7ҕ׾nXHdM;ꌘlbsp3V B$vgњl xlgK5!,'.emu_,tmx|&:l\@5"tjg#pVʃY05znuȅД6Kgh Te ~*]facqJNQo=sy{yS"rde*r= L "ŷȩɉX L L z#).&~H  |PG+20X!t\dgZS\cF ؊4D⣒QHM 9 0NH"v> 1A%<ТG?UP*.FEXhZݰ |0,j@Ц@-5LX?Fȗ$~:X˜384LUlVvfgaTR9WcnYNj\Ih ~33!Cf+Ltjbd5 RX <Y|wD}W{! , 'dihlp,tmd]gpH,Ȥrl:ШtJZRhxL.zn~B^^t=vIsu_)2cŰkȉ*ҿ⫅y JyH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s IQJIpPJcBI-ʵ4*\ٳQ^Ȁ۷< ݻ+l_\Ha ^jK9ʘ3|YGYШSS\0Sհc˞M۸sͻ Nȓ+_μaX5  ݋LËOӫ@ .uϿ(h& 6`k1EbE%dag(dԅfpǝ|}xM9X$-M#=&W $y(Z""cL6PF)TVi|] A!}cP&8$IvAMbPZ XczpZ/^SNes^t䕔Vj饘f馜7Owq)?L^!橅f)ޟO q Ye【* k&6lrjvN[*h@cFGbq`K;B;[ܽ耉/zT}z%ӱ >"Py,0rW6sԂ?b0Z4 @+A3=q&IO#\<85JS^JcAV ,Оvq< x5TPTsYPoWp7@td+PC砇.Y;ϥj +lh xhx4 %qZ1< >6ݹm~sizs50t{%M PϏڼ!n1ƹ3*z.;Dv"ɽ(gb&uuT |W6ű-q (+})Tw\ k:QS$Ej!HL$7$|`ytn<ډt'Kw'\:W".zqeB!Ep]: /#~f|@{Zv/sZckXFC.񑐌$#D r0>dw@FI c7F3^pHDYQ <(gYK[bEJ9,G^q<ԁQΑ hYKV"r̦69cP!^ V`hAkZ3f+R;ab^㙪πMBЈNF#>BFG'ȖδԿ ƂqB,HbSi 3Aaߌj(`)\;=M " iՆ-X 2<'awK~0y5(9}Lt=9ћg(uL gԩ yIpg?SViF&e2 }WP2٨# ^y 7Ě阯 @%LcH-騙t";29HOz]Zz ~ִ]lZڂ62UѴcEkV:ŵ:ٜW r^Ejɽ;%w\YnvjW/^#{t[Nhplv&4lid4fIX xjI,KTztO 4}F7GPYFQiByD| BqASuI0E-D'Y1aMfo~EPq|U1kF"Tkv,=C4xb}i'Upj!DFRnaVH&K!Hj#XsFptGy$>sRjVn@aG pbd2XG:CF0xNhH2/JdJ~݁`/WTJa(pWtx0&D0>@*5sӑL9m=|! CY8.lQ( &uSd`&<4O+am,URQ7|mP{9?QHO?(,TUp*42X0V]x,xh't#u 6ŊaGgqHwFGu=؄5?Scwv0 Hi'43-C{ݡp4ٷXhO8u&zBWW$PaC?PzVE#p8*`+yuX2$muw?6cX}sWsW)<ׄvfmAlk:ACZa%Z^wx[Ux9'F^\eε[!]dYo>4Dc]@B:DZFzHJ&A¤P:1w(V\p\٥`8h*"@n}oZ- v|Q' p@بZEvzs%ک:Zzڪ:ipZbX& ԁ;Ǻ{K\WY;ڭzP2znPȭ~* Sگ;[{ ۰J}{1W6Azk7ckhI# sAs #K , ]3C@7% R=Ϥ` -)%4Ek[8{L[2[1 `b;d[f{hjl۶npcekoqk~U f*RHU$cR.jg>x9|k1jC47z| {% m]b@e*&MRgy'_+™`(ob1;MTG1+\ xORbr϶+X7q K);+K;kIB%U-!t'01B/g/{/)\<˹8 Ĕ#HD.EǼr\R9#G5/) wvXP"y7o46>;hcͶIaH~@X*zE%ޫYߝ۟% YjՓ?Z35CHHYP щ[g\\G𐕬&ja>S9Aٺ\lL \S]l, x_jInn~.u" f%@di Sl4RC"Wb>T!+?$'`V\9|x0!kpk%~b(.M. 09Ȏ%Z2n&I~i{8ȫKp٫*<؅#:UMO'4͒E4ܶK lB)ۋ$_&ۋXX,r$w'< "D uQZ0 4Dx̅ň2.((L21SbSjuS('L'l!vgQ1Ƶ.Z :ykBIT8ulTz)L\ VffM9\ldrIa6X8DbdD-B9HQ%ru>oB^`PKzꎟ˕PlbX9 4BE <(̀0Dӓ(r=G¢3E !hhP~`A"Xᓆ f2ሟA;T+q2)ũ7&"ZSF CF h,hH֐ajʥNz})bζHz3rQMϚ&H¼ܡfM[:nέ{7oP }q=Ĉ` m33'i\;h30P)8lQ C;OMzFx ,>B&ϵg]TAg[7y^F]׍p ^G-8y4@ |%\_/Nww^7|@vagQ$ eI[9i$iȡ\Bm=Vg;O.$t <'Pyp/+PXm^ƏB"4疑٧Ĉwz~BX~5\t'}é >&#csTf yz3j #f ^,z64*{mZ:b& kv(Q:ӪYC ȟ0zEیk3jU*!G݇8, T@}g0!#$RdJL؀bg*jDPR q+X3wI6{ Ц(m#oR$тm3jw]wv=)pF("Pᆴp$ہQApf ~9)\tt),9 tPx'Vx`tt8w7#@ᤪ1K~NEFq^!P5B-ʛP$ER$GbJ pXk=enr_󯯒{So,[` 3[/wPŕo\0s#Zq/ߙ`4V i CY04KQ{(pƄanpG25^Ob M8Jl ıUdg3QzS+rZ姹y9׍ϔFS!缄)MA+y{|3*$^+t Vb c) %7H }nX@9Pz8[C=Sڲkad:agxh_vRVWgBk28x4@EcxC&/ p('NRoO9:((^MvZ@\Vps!$1OɌ= ab I`Q20R%îebO~ö$%C͓#/N&SZ7d9 Ndǁ/Oe4aAaaL<l# (LypY $TIHVl x/\]@]Kqkx .Ĭ;@kX-9*$R[ B '̾WJ)bI5-˙5+吓7SN&PK\Zq0l^h;ƫqcKT Sk3Y T $fF'[H $LVx-6Ap`E~y% ]{,c 71  *KHTZ0K,bkc0C}+`@@ D3p LՔ:举mvVzۣXKo6^g@C dx'.Ṭ7r3Eg!`z3dO?:Ђ4, υ^teFC:Ғ4!eUt;?$`#4KmS:M0A T7rkm[:׺5{_;6mc#;^6gC;Ҟ6mkc;6o;7ms;^7w;7m{;7<8 n#< _8C<8+nc<8;<"9Kn<*_9[<29kn<:9{=B:ыn#=J_:ӛC=R:իnc=Z:׻=b;n=j_;=r;n=z;>< o#>_<C><+oc><;σ>=Koӣ>_=[>=ko>={?>o#?_>C?ҟ>oc?>??o?_???o??` `"`*2`:B`JR`Zb`jr`z`` ` ` ` ` ``a a"a*2a:BaJRaZbajrazaaaaaaaab b!!"b"*"2b#:#Bb$J$Rb%Z%bb&j&rb'z'b((b))b**b++b,,b--b..b//c0 0c11"c2*22c3:3Bc4J4Rc5Z5"۬Y6rc7z#6S8c99h7c;~#`#;c=^Y:c> y« JV8ͣ=*$;>:C~R?2A ``'9i %GF$;a|$t@}Ox$`1|@.H3aAZB.dQncCBdR*%H$@0s GҎHd%jKi%@Մ YzH}=՗X[2T%Ѐ& ,З Q f7"R>:eJTD%{5j협EǵP&\'>@Xer&x\]<`Bv% De>H]-݁R`fnaC&&kHPEGr0gd<,grFT'DMbl]M&n faf{oecT+U1C Mtf ৮`SдOڌTp@u'mz%{g|2|M%c&҆ (h9`QzJ2脰On<&ϴLhcAG\hJe*$zzTfQ:Mtd LdT)(` O)iVQ~piX:hz)(VRHғBi=J)2Y)%PC&gPidvr)h j"ט>gpgnWī'pD!j6jڣC-ūgL^~LY `ئ2u:f(QhnF^RT 7zjn+U(}f}&'qQPIWkFtn:&iEĞkgb,ɧrU婘FGl+Xif9!Aʚe%A b"nh m,'WJ&}nfj6E5XCUVhb&Jژ%b%x] 4nW eBS8AdUUV]ƗUek$&te,|VnTrT.9n= Bml] %|I0(dINhLba(񆊉UU^^QƙeT F/PoFAncϢI~=ޭ¯ݐe /=ooo=oOM<*3p;C*$|LBEme-gr.%V]jpdl* \X kuڹ |.R.'g|fd&R1kp0[B?p4u2a5,㛑T]Rr W&ry{RA]%K-"$u@: |Ԑ.<@(! ,* AU=l"U&^x~!_pH,Ȥrlc3eXMBi`888Lw #iֻA/8~ap;/9W+ &\l-+dX&/~@X+p*/4)Hh* +/ī8+& ++ߖ/׍ټ1 8,a8 *蹰O9U(9*@!ɓ;ơB,bˉز𱅃 )n( M`'o USA1gQ6/$u `! ,'.em~p,tmx| ЁPLŠhD*ЕD.Trq,Eznk3ǔO* .]R }Ko:*w"+"Qk+OQP { +)˸Եe%ؿQ^" {\TUAܱK*Hlg@*\aB [28XS0F Cޢ(,Fx(9 t"ț8%xوgf% JBD\TƞAz?WʪAӯ`s̄zEjM}B[b"܆K7O%hU$ =[0Һ+ōj"y/1 Ce m !,heE}p,tmx|LDXNd.VШh11m0"eh %,zML IiTy@("bPUdl8%)n&1Rzz QsJ,=o*`RPbRS+ŭ̓ *zP-X " +Y<^RPGL`bфFKʒTij=zIQ.@8ʴӧPJJjTJTςA|6@ٳhӪ]˶۷pʝKݻx dpYx%\p@FMRM4˗e4HTV AT%#mXYsͻ ^>|*eE$0wE`fiWK[q0Ǔ{&oNz~c;x'h&`Z<0zW0['UueO}irHe"^)"!RepArV <:6xԃ<hF$P6cg<)PP=)h%Z6{.F#IZTpRjǓPtE y;w__%Ox)h;L`ޤ@v駠**B礑A聒*`qq_R_@l_tpPLA;.[lBUۀh˜ dφ-R*lBlJEp,'ڰ+섾%.Bm)g>$=(d\aF4(@sUx| m*rg ^񑐌$jnE/ *x09.Y$%.!VBݖ> k{+H"Jd힦EnL2i19IES"4+'y!6)T~G)|hVC68N#؉>Rʳ?ةrK9˃.b8Of:eqG%nOvB6>3JHVYNRlF  }RwFpa.EJGCX,N9E_k$| 9ʡ@_Ӫk Q˥H #ZΚ 1%Ѷ, M mqR!ُjQI뇚 @n4QG+ XoJT4$_SҶn(LUI9_9& Be1M pܒMr^|΍tK^qWGL,z]Mz|Kͯ~L7?ih:08.8z']Ob<ԅ1e BFCU.ڕ[gr'Nި"L.@>apj8fS=Xe?b(}CK C巀xϏdRl)N6eJ9P}EL]γi&a$OJMerm% RL5R4'q8RA!@iEOK*ŭݓ&fkSr$4F͉w0J'tM武b)}T-aNUʷ,^~aZBmY;_}Ẃnz;6Jfv-U]č:Qp_̢U<ִ)Q2{e r>0DdW(3X44E.'HӁi"avvx.x &.C8Z3\y;'8 &ii+g @6l. 1s 6%!_R dל)vun+(V{ 6CPb@p2SRꐷ1)Q`\>Sg{AXP5 zM ~&e>XC7_A׋ G\<1d'#\~R/Q^'7> =/ǷA<Y(Ϩ#&I@O0Uz7zhGhA4Fh=J}|HFNvT[|}}7rfH"2b>8wGȃy8|ݡ"leyMJG>ړFcNCKP!O>>7FTxM1xQk_fQ>Jax4e(:~<OKM.u"Pi5SVٷ!d3wz9Dxr8q7PTDzS'btPY!H)rt69]j8dc/ hR()pD}2V)u+,U /02SxOT9c4W6g0!TFUtSTT!EoB.U U$a(RUmkjuhq`E^e}[k%l/h9E)UǘnbubYxY= |QAZzA[go0k/&!e"9u[6l,ْa\%#4Yt%6@B:DZFzHJLڤNPR:TZVzXʙ ^ڔp5I_Z6!ajJB!4k0qt+u(~E:@a&ڨ1n䨒ꙧ琓za8AK:Zzڪ:Zzx bp e4pj "H: w(ԚS+`z;Ӄz'd:ҤLB3 1 ,r [{۱ ";$[&kOAh4bNfe,+BGYáb<2: &i7.+bkRFLqZfn(M2V@M1eMahC6%d"i&fa'U2ikZVk'[o%|S8ˏ[wk(5¢Zİ(k}[ 3i&^ sIDWL2 p4,mH)V<6nb'6m-#J2 p20»fUa*jpvpjŵ#Lg,.LoQq!p!w٘+m) nE,*<.F6k1"e;+0|#Wf4,'-JmG&r+7sKc=!ONs|Ľr &NÙHsǺ7u{BB>;Cw|y~lP\\rs=kk77ikex>qg>m׎=SCJcɟ|:WvDc|pwrk!(:3YLd-;waa:Ic͆KjZXvL?wq<<HJh6% f5}yI8{!"Gj|}q\@߳+X-Vl>!ح&ٍ; Uف㽓a})`HȄRV00ȮKSX&sE.P5pT`b,= 9=;eHhÄSml8O&IVF҈L5)W/'CWQwUY."UZXLiX z-H`9N!ay=X%۫P:k֧僑XYZ;0@>Ea~\?ێVInDy>^~No >1{e%6.\ًa`|Àq+kݵV}2VI +'PB1'`|.n[/i!θc9c q*Pd4cNSJ d=ZbPq=)ѓ1av~Pe39=Pkhke_dc8l)jd!g5/? 2+ í(B -qQ6HϷ}?/&hmmJKF'쩏h;'L2)8bkk^ weĘ6ŎF^^>[m4.SD@r1lVԳj>PĿT7]'\YzŶēR&v$X4%|B)jbMq)P6"BR*?5]XCD$A)1|) tt t]Lh4,^ -=ݭQ ^ u\0HV.xq,BTT84Nyqz>FZ&. pIHha, -,2V(L)B[Fi2{W;{&p ^,l YS F]<)^0ZkWv"j`L/vgAdo\W [Hq.3Tj *t(ѢF"- ` ݌Sdlꉨ &frW  [`[jw)´)B8P8E8MӪIm"h M1v%A Z]W'|\3b)4WHxzYeyY[4&&XqhZlo)eu!m ]:w%Җ'ͯ?2  _W.F,pcXAYL4W=y+gFXFk 1ƷJ`8G`w @OčHb4a^6 XhΉ&$7NpڇMFH]څF\c&#D%O\ ~bt"Wv=nY9=xv1ڨB!HPg@by` uhZ'Sy gy{>u(jݘI >1xea] +&f)J‡Ϩ9h 肛4'l*V';ƐNį[Zvohx-^hS\RLJ!0*ijEaP'wCv<Ū+$|2o:/b1#+s7QZNOD m-A/[9Tт ?Gz>| ӮJ˄T}6ɉ ]vIxOD92z 9Z}shDQǶ̩gq]/֜u\Ʀ6:s[lz6!dS?2hwV5|~Dtd7=Eq:! ?(GL^  ϙ ʽDG{ ޭ1'A.% >R+^rI(0*t'= H:LCǬLu K Q$G0B!fڤ :I݀#bY^S0:YT$pD)HaxӼ,5h Ӎt#2MFBa>8xpKEEBLE* pJ}fp)޴(FIl1%Q9VRѕ}Mu],b%}*J'L,T@ %6 8{aueYR4E8!9pa0G|!nPn: 8?!ġsE)z)k ` !t'(Knrim*PaWoT;& 7ڱwnTQ6":\,X9e,;g3-Kl,(*^1[8W'&1klp:1{kKc #sHDE'C9R2t^~T~!69b3l39j^379r3l;9z3?:Ђ4 mC#:ъ^4GC:Ғ4+mKc:Ӛ4;O:Ԣ5KmS:ժ^5[W:ֲ5km[:׺5-Ɂ@I ׵)6g|Hi uhbv!7mnM;%()'V0,m{;=pYv n#\eNH8!D$Ѫ8+nq)Rf9(Px_\i 9Knrg^pJ tprC29[-u 49S?S+?:ыd;[`=;bO:ի.Vs=r5n9@@oÝ|+6ym;wB /<, UCoȇy'7;σ>=Koӣ>_=[>=ko>={?>o#?_>C?ҟ>oc?>??o?_???o??` `"`*2`:B`JR`Zb`jr`z`` ` ` ` ` ``a a"a*2a:BaJRaZbajrazaaaaaaaab b!!"b"*"2b#:#Bb$J$Rb%Z%bb&j&rb'z'b((b))b**b++b,,b--b..b//c0 0c11"c2*22c3:3Bc4J4Rc5Z5bc6j6rc7z7c88c99c::c;;c<>c??d@ @dAA"dB*B2dC:CBdDJDRdEZEbdFjFrdGzGdHHdIIdJJdKKdLLdMMdNNdOO%L:PeQP @PQ2eS: (e=TR$eTݱ%.pM YZUT^ejp8$Ay[@!]Q|y \PpX &S%e/)c)[}S $޼ee`&R~fvD¢w& YV _ \gn@a~ϴ& a 0af4n&oN gd"Zq=X=4텒sH@gtt%L]'XҵU2qi|'s\$@y`'\pފCg̖:,}^qG-8 8Xp*P0_@9] `V¦]nfFVhʿ8̉^C=苂fb`hb'5Y2\ &Z iqzzi?+B:;h\Y)޽vi|3Vu@5,ԥai~1^8@[X梊@kL).Ğy8 I頊eJ}&מ%ܔץjbjUꭲ_R*Y+ Sk*2k:BCImjRWF@F+][Dž=&Uԡ6Xɴ1@"旚zۇkvўG}d\nAÎBe l4Cs=`ǁ3B yJl1 5l~ ƍ~,\f,$_kΩuSsҭh(&ZeB`lJ -AdmfC5؝MmK4)]+"T)f ',#ffֺ4A@7! ,6`HE}hl8]ֆ|pH,š'(k%{)Y"H8LوG.,0©YB 2DkuʰcHFVhݙ> x%<#k<K"[)ЫYD;yYwE)NJRD`# +z9`PC,`^Q@&dE߆UE7dhv1R%!x!! , 'dihl["W|*t (\PpHL XhÑ`2ZӘMجvzxL.%U ->^OV)M?;=+hkkmYB<& R@l L7%EUhA1 KT< #U{y1g '9,goX@$D(C H4RT).012@pD ְa鶨L_pvb}WI͛8sB9Utⳡ"  z dAME(P㤄$ ȔJ*QH*55LfAi5:Up*?LMch˅w2y.[#z UϠC-g>$>L@Q̊%v0D С*4 /j3&N< qXٜo i{G`}R_Ci]Oa: dstfz9BڄVhr R9bD!!"zl@ c$"n2xHB/^cnJy#1'y$V䑱I`Dw4'_0ʒXn{xp(BMf(tigih2$'K 1}v)\l%UpCBhD 6>"ej*E6Qy4a@_'#zP)pX(;kdkT 0j8+>˂ hQ IʬId* +Zm*n>5+ ke"D&dv%a 6G,q&(It5hNvA$,&c"Ziol#L(5~\9s}R /].F$G&?XgUb'!% 6Gjk6kjs!B6ipE.l) g[\G.䔗5?"l{іB^-$Igc7'.0F_Em{KŮn_+ WG剿 l&I9EgA(z|ߎ['Fuq3w!E~ y fg^hC9L=F  +wN7FGr#$Lr[ >U&Hy'0Irp 0fD)\h=b<Dž B>#p<:by !F()l`TP>L!)D,@8J2:bYo'4T-@ HȈhMf"0r4dHPڟZ6Ȯ &`p -|Ee!IHH1YPrTxL2L`Š͌4IjZ%粦6nz3baAoL:sRZk~ @JЂMBІ:5 8D.]@&F7X 0 ;~hyL x!NwKc '$a6Hю/ņF[Ule)` ?Xu Fi, MOJֲbEWp J&ִ%*ьլ ,`G,j3[Y``-U&`I9< \0SRӱf#kؕ)x-^—L,]%eV G;߱;;.Nv |[9q]sy:O9m^M hO1{(~U[/u׍a^ /뻾ap=u7nl!\M>+UJzx򛚌b%@47ͦDjRTHsSZvE;rfTv XJu8PJQZJ:Y3S(9oIZd}n+h,@дʷj]gAg3X+'7P1[1!F\] dUwy.o:VBLp N^Ă0쏜QAQU ❹;!DFkq8P )0"Eo(OA71OG*z KmKt-#l`>k9z9G]$K]1; KdL!nmUYDJj'zJlr)Jp}[_3ZK'rJHb֡W74 τOU:#l8(U<BH,4N0r锃CLx'UOUjTXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xq؋xU wXxȘʨ8ьxؘڸ p/8X .b긎؎(jXx0G؏xtYy;΀ ِ8WVYyvX;  ^((*|J+294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^D@KfyTI[JnKitYA9vzٓ9*yk8eyM13X56CGHy۸/pٚ '!fYFe\v9Yyșʹٜ9Yyؙڹَٝ! 0虞p Ipi 9+שFß:? Zѹ.b ʜ":Ùi]Aʛ#/ڡX"Hg#zƒ,ڢ.02:4Z6z8:<ڣ>@B:DZFz;&GNړV7wy\:f1]1!h ai"9Q.t(u| zSʏQaZc9 az 0:Zzڪ:Zzr2HlcO=իMx;cKd?⬵4)e:PCt*rU'Y4mdPHRD X'rP ׭/q4`QjrhPUBz7 ']8X >S8G ; \p,!"'rk@lf`WWpO>_?_2U;0)m#%Udrqc:/YKd.x?ufkkT4pB1 SV0\.KRm"0`[ +hY$[BsI{gm 9v^E_WCa^ށ^^Aa^J|e__1FoؠlDq~A5!;;&}ŻqFacflρ;pRp ޗ` Aف_V6K(U=)r(%2"?Db5brczA'$rY>&AuSbĔjR&8m5o,3ā Xg'TS2,u+3ڶm?˞<Tm:UXQ·"+0)||0\5~B8`3b9Py tV#rmZ[4ǼDvjЌ w[=k zO l{\s*k;:t㒹2-tݪj[ͅ|\:lZFTj,nܿ|K]yxx=wQ(;;Že,c|E(<1¡Wd#W~~ؤ.(;(!d(#G4SRu|Fv'#C=$ cGD G /L~ϧ'W|'0KVtf"G[Ce헼Jn_t_}з[}p]=CwG5G:G==:ƹ,I4IUIKJ 8$ҍd ނxj;Edu+^Zv!Ϻ J{\ױ<,]֩S'.VO^L^rV+\^M0_`>TԮd>blLO m[t^v~xz|~>^4hs9 GtSjx4ֶ0 {fp&Ê35I_FЀt:!gg'5.I;[ !.z!_GbJh ^* jԞ l@.?{!)̾.X@inf= %T5r۾ΝB¦U.A% ;KkH2 R0^)?"yiDmmmuwAӯGj7ZYNn󏅵%I kE3 Th\K~ܸ 巂2@ &R兴 `]u]< QZf[1;D"H[+muT bẟ("^BM+^}`?l>aE^j޹?8 K@K/a'K!Om E? t6>׿]cݢ.8y±<5z]s5x(2l t| 0Ji rzoĩeۜt\0dxl<%DV5z.1l£u`Bf蒞kf8np@&,gؼ*+<+ F|;@`.=ԧ6G2Zs b$ D"0$Hآ (*d 3jHtlY=jCpQ,A1yPJ={,Z0 na}Z*I;H08 cM$xγ`;!CVw$` )@,%@FIJQ?0H s߉PzfQe"8-M@<9I͵C-U*@UQjyH€hY{n#Ry⴪"W'ϑH.]Ui׻5g)*Q6)` k"6]KKؿ26]@$kb6l 2+t,ie'L]-k[)77B17.qk"7].sB7ҝ.ukb7.w7/yk7]/{7/}k7/80 l#8 ^0C80+l c8.MnFu܆ (U(1[keDdYjW~ #hȎ<2ld 2'aC:w`!l+cYcdytXql3e! # in/:l;[fTc TyNmC#I F—DK4+8sFxMXCKmS796ҡ:IY@km[~ap=Y6k΍1'nu `7;Ҟ8{q&5lhw;7!!xRË-\l2 m[ߒ0zRAB7 n#< _8C<8+nc<8;<"9Kn<*_9[<29!3W9㪞-fodLR:ӛ 3`rrz3tN z;=2-, |tZwO";[P=)/Tڒ=f#h0E_H2@l .0> v@8O<77^G9׹?J+)qq&9*[ x='ΣK Ǹ#n$|_,$oRR3?o?_???o??` `"`*2`:B`JR`Zb`jr`z`` ` ` ` ` ``a a"a*2a:BaJRaZbajrazaaaaaaaab b!!"b"*"2b#:#Bb$J$Rb%Z%bb&j&rb'z'b((b))b**b++b,,b--b..b//c0 0c11"c2*22c3:3Bc4J4Rc5Z5bc6j6rc7z7c88c99c::c;;c<>c??d@ @dAA"dB*B2dC:CBdDJDRdEZEbdFjFrdGzGdHHdIIdJJdKKdLLdMMdNNdOOeP PeQQ"eR*R2eS:SBeTJTReUaeVjVUWeXnxYHeY(ZYZҥX\<\_̶r*ѝ]9C(! 6{'f'ī _+8ጂ}¸fVħă4X^kH)ޞiǂ]Ilʨ⊈Ot,Ω)(Lqn|v,qEF$X+(l)'9_#^bSXGk0MjJ,}SQn_ xLeY%{,Zj'1L0&a&M}ƕR@&_> Hm%@&Yr ` FƂ8"l"K.p0ocGEtLLE5#NPds.Tpk8ve$pW dHd_fi%*5v TP 2HP4w$I=rеLދ@jDB0`dс5PFY_Q9CuiPF7U  b6a &eVԜi f )p'y?0WBIŽbBcCb*sJuI)ꨤjTB-C#tIjj+iTZ5Bک+ j(Ɉ,tŘ. ڊ+:ۢ* WqkIgD,Itb# 0H#E\kVr t0p" pȭPܱ'oDm̘{ؿPÉJ(QB,l'LK˞Ь-PÊ`aދ-:-56 jWvuqn8JRO Y2/ %e;)oZ97.joica3ރe_Ven ̒>JkVy~ޛ.ĽK㲪́e#Y.wapLFxT=e|e=*- nrI!ݳЌ:hF)T]1]c4 j`J5~@f2&Ca“dx9 St<"78a(Ҁ؄B afG$A Փ!EE'46ҧV1I^Ѹ zy9 $` ^c G4ܦ\)Y@5jg# 5&#w u@[ 8C/:[CyR H 8GO挖-1sIb1e:Ќ& 4̦6,j5IrWXGNj~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTOA XͪVծ&U0WJֲh(ֶp\eֹxͫ^u `4 MbXNUid'K*vr2f7ΖphGKwH2jW֮PJplgKJ3l p)V=B)f$ЍtKZͮvz xKMz|Kͯ~^7$p%K*l `'Lajvc(KEli(N1mo/B@*G[ @L3α+4;;, HΫɖԀ$;nP:0`([]P(l.{y`nL2hN6pL:xγ>πMBU\^X)).' hyҘ ZN9ubQԩW aհV%ZTy<XNMl$ M.$ {ЎMj[ζn{MrNm[7wwu u*ԥՐCw@ԛ0'n#8oV@ w㐛ܴ4Nrg-9g@ȗ2dXe:d@5xEHO;PԧN[XϺַ?ng~pvjhZCB8EpBjWʚ% ӿgAtUP#"n0+!Sx{ײ "ojMΧO H`Ipz'^ XSFB-# =6?ydLTh\.@yp>?섇P`3)VG(;l|#<n " = ݏ9F9ط+}'>84;b%AHH,=J,47q X $#cGh 0-,6aKr9?G?ѳ(1(=na=(`*.Zd#XZFEZM+c`H7>DQ!q7#-$3l ǑY*aagh6@5ʴ#pȈri|f->z"rBGݰT4qv'@a"iXs[8Vn}у}}2n6 l&cr !6F 2bGC.axn/=hlA!4GB-2X $48ja RĘT+z?α}H1cR&f'lɘ2(,'6IycI);-G|~ɀE84* @W! 1^xJ$G{k)9Cp?QPi)z9ZVَRzĕS 74&6*,(HXzJ14H!(vQ B>΃>5C@0>Bp?3KT!h깤a _#o#=E>7:dФ{zz$*#6 (#3XFָBB&B(3!BY,B5EZEjyCChD_iD NP0\g#|HުB*zJ08Sݐ1񦘑(DX#TB7KCc*[/"k*' $4Ij(pHHd*r"Ky0KTZJ$f@2XHVk'D®E8RJBHc&nz2CN-ll|Թ% 06=sPy i "mդv| ٬IJ/qy7Stsñ7Ga #$RΘoi!R\y2I4,m-e -!Z2sSڱ9Y-֠]Fbע*sT z(I)5=Oڔ}i0gْS') k܌ʔ49)P)mz #x-yixr+˦Fr`gbKĐ-䕪U,ݠޮI+(1ZIlĝN6Mmۙ۬]+~^+\+ʣIl DM%#?R,}ə(z<6)a+SNZB^ 2|,`ݍ1A-S5-mv1^E*5N[|9䓸֌$ iA%5ʻ>'.1ɟK.LL 4133'+蹜>ٓ5- Š ٹV$rQ:BemslOWY\.2Sӊ(XGn1h~: q24v L+#~-H*,N.N19❋`Iܨ+7^:J1/p73Knk=pZmJHnJ Zzr*`.Iάj;e>on l 0mmJK92[YD/)7=bU2d(>ƛ(onr2pC2t=.!cmO=>ʍ=c)`3%x_>w?EeA>Oþ:l JxY;;Jzw>N@Un^GP ?tl?_9No۸G phO ߌf&ݚ+4i :b0}l}E-Aϟ>'ʯ W|B­#  3]wZ#V\V3^+\] 'Q0#4 |-˵<ʉq e[y3aS =p9)E4@,M,5(b0% %.\8(U0,(utTyFN:Re 5 #'03y"xu@qVH$p H847?p(e[Pk{ۿP!09 ;^0½KH"9AFat}Wؠ*Dhag17X8bĘ>NbG:,G^a(CNᮔ+)8w"u%Kaa),y2ʖ/cάY:5gy4ҦO`z5֮_Î-{6ڥCK],ݾcrhƏ#O|9s# ԯcG& E /~<=45;!+ϯ?X" 2ؠBRXbrء#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb$uE@k٦orCI,aWnh@#$`8F}Z`j/a7@˟|NrjEKti/ڪSPZM vꋐVvB3jxBA .MЬRKpTHQw୸1 wXl[=g0I޻!E \ W8US\€+0`J<#\Ň@&#0\Y<@93 *j G:K# T$_q4d֠Sc[sݵ_c]gkݶos]w㝷{ݷ^nG-Fvc0qק9B7 ΁p壓p:=/t4@s ud3_#7E2C{z`;RB Ăr-$IvhqĬ}E G֟_2z4~d h>ly, Bm(` O`0B9 KJ0`=eq[M A d.ܡГ!|lKVr"1J\"'B1R"h+b1Z"/1b#h31jY ` ;s8 ]:ʎx:k2:2KE,Pv5$'ĈA-&`\NI%b*kI@րX,FЖ @ ;pNmp@GaBGChzUmk iP ئ@|36 ( |iO++渧tu y־ g3Ї]K!tɲ3(G;я4")IKjғ4*])K[җ42)Mkjӛ4:)O{ӟ5B*Qjԣ"5J]*SԧB5R*Ujիb5Z*Wկ5b+Yjֳ5j]+[ַ5r+]j׻5z+_׿6,a k"6],cB6,e+kb6,g;ς6-iKkӢ6]-k[6-mkk6-o{7.qk"7].sB7ҝ.ukb7.w7/yk7]/{7/}k7/80 l#8 ^0C80+l c80;8"1Kl8*^1[821kl8:1{9B2l##9J^2'C9R2l+c9Z2/9b3l39j^379G`l;Ùt 2i f?#z40{XtGXs4ѐ&-UgK4|9m:SxOxf+_]+5 }jH=0iWT "2'~AN]s4PYИ S]]hy=Ĩ=E%»MYIb/&LiN,o5}ھEDs,fL[߽Fw~o.v3G!428E Lqڐ~"H|//cRQPo@aP#dK9KT@loاbG&_ ZKF4bCtP4`]"xp؂A vA@ ``&;؛/,O6 z3M6Eé`hOp ` 2GOR`\apaT!}ay8rD_tH >iaA?:UiA }!B ,B / YU 58\$eA_X]=L PEq)s! ,6w|hl%ytmx|r<RCEʨTJX,´z*Gp,qynpqHF(h\ SJ`~(aIESq4"QsIMPI),J{IQĩDŽJ| g ӈp#PI  Q &Q Jg%1#20m/4Ё ($aD(l*'5pTIH  4stMYϟK9Q RYBLmJjm XBzV 1`(NBp㖡Wp  ޥn){##K.\˧(X^ϟ h4œ Hxe%DX93kѶBn3`gQ0աBBhG,~B` W~=wxpIB! ,pH,Ȥrl:ШtJZجvzxL.di-|N~{lomq~ []o΁ln m뉪 K H/hÇ#&0!k3jȱ#xII(⪰Aɗ0cʜI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸E`Ы\`24PsAG {,VkmK^x >@RU<+M5˭[ޛoB UlExp W- OodpW^{qk1r\JpPEt*([-tDˤ/J[KKcU*6-\c L@FoVՎ\@5xup7m7U T Z@w_P7`x(hP8Yr\^- 9( >y[Kڽn @6>';`z&_-V?ܮWC ZBPTI/Bx+=(`P.>lS52"@1 !X}L V272p~U" Xk e  < IB;!,heElp,tmx)lhta\/GJ2CCoL.40MNQ&ʌ7r)ȱWIje?pqouvGG&}O}EN  ]B[" .NqԨ jM\͗_&D5.HP E9_N̻ǰa=qFQ1Sv@y7O.0pH$2\Bf\!م͛*(g|z6ΣHɈ@!ycˊm Hʵ+ #TaB*$dL K[,ʝGvYp,G"'PvtÐ *i}ɺlƀÊD! , 'dihlp,tm_x~!vpH,Ȥrl:ШtJ>ql`zxL.zp<8{N~nqrI p-:85ap˹p;i ;+ڴ w Tĥ*ʵW= J1j]˶08C)x L,Pc'л_id@-ϠS ШSc `qZQg, MI8 !6μУKNسkνËOӫ_ϾΡ±bh2 JhK8@46`<%V80=v0Ф$v=06(@X8_aU2D0X-@LF)TViXf\v`)dihll0  0xAX0S)hYIv[\&o F(A˄f*$~>"`j*Q_usA:# ,l'\07 +,Wl/1gw ,$l':D Wܴ 12'/ L ph20H0LkGZ}DWT'udmhl# ~vmmN? Mߝ)pvhd@8е}Avqk<20L0&u%OKl鬷.;Ǖ:W|,#8(2ˎ,i%)1o2󳧮0/o>kb'+tpX$;@OGVpV,58OeCZ 짜"n AAHqD(O8 BK,`9h%X9i> 0Qxiq2-i4!` Lj9~4roش@ tt`s3$rCmv<!- a(R!,8qjF`'!䢁1 IWBS%HO"Mi[i/4lQpH]ѓt\ @JFo&Ir逆R|g }9xb-wa#)Ⱐ:Iw45UHEr @ >`BK|iRH3O|_ѨIZ80L0VR !3I 8T DdM>fk"遈PTaw4-oUg-@*pz,'P>hSnufEk,xT}NdBF X*86ptI3Ȳtvق`nEΊ?ԗwJY y5Z¢Sͭnw[:5[ %XXT*Iζh *tR`osM+]ninZ'݁]e:Y-T[H{N}6^Z*)M[k,>Ӡ{emozi ZNΰ7|3ׇg‚X Sx}m({ACmo11>yG+Zk (|Sk%(vc 9ޣ|NE?gsxsT Fay})qK_8Ǖ5\B6Jul l_XIaN^Iq>FcwvG 83]SR(n1z-FYjǦ'MX`.^F4h ݹ:ڕsjK Ӟ-CN &ƒeIMY7|t7N?m>\VX lyݯ,7O©Vfg F.FmP-zhJJ/ \\VƉ]Lsre0c!_)Οh7OMK֣ m7jcv'K{`OyfGGC8^o{ JiF#i?Ml]wsMx^ӏLܙ -œ 8|짷>AHQ2{߁߭9#U` jk~aDi Laջ.a~]fUM,a6w6v=Ci!!U])eD൥Mw$m+P~A~UsO;TDCCa57W0.4tZ~uD@H_1DX6QTHJ`L$sP8TXD FsYV؅#^b8w6E5ȁdsnj؆npr8tXvxxz|؇~8Xx(lj&U6d2x6VjֈW8;@2!% Q3roUyOQ/t7y/T0t,nI TrLT0LӝI0FSwfdD~Iy0͹A5jDy-MM4V5dI3ILĞ’MNՉJ;霬 @qwE}X2%cRDrR:_O$0pT'"G7Z[Q.ЦbsdUC)eF8Ttv,3)A; h5Q9 SQ:mR;ejpd{K)o8eO %ĦTpaʪR:ЙGcUVW#&vWWjouVԺVݺUmO/D fǮڪKKÆ5UZfM7:@ZUR YyW8rbm[uE/4fUxgnyCk^[wWc]]G#^y9N_6\IB:< 9\^Zz=&-Մq,kPە6DުuLp k\\>]@{a`it˲ʋi2PZI^~#3DHCez'"-FKҶZR0q#jKn<NJvC)^[☒5V%`Fy/=P]MS*Cn[~%? t*C a:d Z-ᨵ+eAzg~.*W;opҏwJqDD4H$*⠾>^~븞뺾냾!XZBDGBZR:u.>׌7FAQ^~W0Sq)ݮs<uD2wBaO>}ѷ^O&X5.#BVd+%a]GG3OTEsL۲핅#=Zcڎ\/ ;qKҾ29@oLCPR?T_VXZ\^`bexHc.>F,/QlT,zNNIQ^C?G" U3Z$v_(q]TC(PF p_o FobEb\F)įsj(1~կK/U4?_Y/8y±5~4%x2U9z"&*.2"=h :h5R2 Vjnrvz~zJ\.\(U)4h~<J6l#'+/37]88[ PE\+NbEPce hT\07 "GgG` p"ŊAQpV@*$n )r$I.y"QYS )s&M)@xLȩBF"%V%mT@g \Fͪu+׮^ +v,ٲfϢMv-۶n+w.ݺvͫw/߾~,x0†#Nx1ƎC,y2ʖ/cάy3Ξ?-z4ҦONz5֮_Î-{6ڶoέ{7޾.|8Ə#O|9ΟC.}:֯cϮ};޿/~<ϣO~=Ï/>ϯ?X" 2ؠBRXbrء#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb[r٥_cYgk٦osYw♧{٧Z"2ڨBRZbrکZڪZ⚫ګ["2۬BR[brۭ߂[碛ۮ[⛯ۯ\# 3ܰCS\Jsܱqz \Ĉ+q+H()R\;l I;=PJ@GO%$-LvcQRpC=qm队9uP&@Z!: &ґ* ^~TFhwib" AB(< B/Z ] /Ft2콯,X>~'1TN A1m8U"M"2B1<wbf\8Ǟ]*mdǧa'XJS>L0*ɳǔDxT2VǕ,e+e5Z2%/{KM%a0b<@7Jjݓp d8e%6H (bxF< {oTɈ=nʦE-T9`EuG4E% ȚP{&b+(*9s@O05: /3CDk$_46P("й4l?2:@Pa!Fu)Fq !Tm8vBc(#caftw=N=u(D7@P?V"URJ(J&v 1@A@R'6>6uVA)LۇP©10َDb,|!,6'.emlT]8ɗpH,Ȥrl:+a@@B=*A>^4되+b~K&Vz&mo" i+k8=*~K%{*-uvL b{.3T) |-Uؠ8zƂ Ŋ ӹX"ϒ4& U.N*\$&ջP@_>8ЁFvi-Ȣ9rT&58s@aDoW~L29RiiΧP'UAҍr& Ҫ؀ⲮX=jf2fl#AP`\1aj]p@[u5p̹x(n۶ou4ƉAL;x~! , 'dihlp,tm{2]ֆpH,Ȥrl:ШtJZX{@(xL.zn1~DR  - <<3]evtn t+ v H ]pPÇ#.Q * HȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJ`UfSj @`+\(ٳ~@۷pѨkܻx:C޿Q[+>j#Kǝɘ3MV)#d͠CGM&VgѨS.װڙcu۸o|9/ ȓ+_μУKNسkνËO8b7avl8* ?h 5 B p f(2)TA+( ub͈(( *Ƙ!B!2 *f@K>"UA8PŒQfI^;LZ)dihlp)tix7sU"+}vi)!&袌6裐F*\ @頋V:馜vcy*ꨤjꩨꪬ꫰VvU8bUx`*šZ6z(+jbJJ\@@6Z[췓+kq&Vx 45{HxP0 h;lKmƒ2j3A8ivPd,.F4<Ϧ'-A= DPθ[Ŋ*ZRˑ٬j Cp-tͩЗtMt҂5.^YZ6iU6ŁI  0S4pHl?굠*Wn|='V@$ҰC{EP\t`򗗶2걿>k_𻊷gkߙp+->Bքt(@@!`ӕ8mi'CxW.5 B8kv4@ ks`$Uig nl*&fKU0U^PW/ hh\@t Q6h*=`耄K[HEKЅ+LG:vԗȻIh\~4G=Mb$؏sqR$R{d2fȗՅaL'&b{9Q:߂(Jnw"=KF52j$49I 9.4 Ss!מR|\d@l=x 8INiΚBX(%o|Y Mr7 Y\{y)pK>i \ 7uO핮bY( s0@4ȱ4$?{YI}I@Z2AR|\7ЊHMRz*K*Qsv#k4QME8v(fա.Ú2 %/43iXEV&ʭ:)M )R4 -LleŗU2vehGKʱ{+2 l,Msm+ fzҫ\n1R[֬u\5"ZQEK^*-[2ɪL':hI@(IrdөLvug܈pPk0ͮom[VL_!WVaF-79.3<)y[FHcY>X%l|3WYjeIlaHvߍEZnBnK;bX&X.Ye7 \lƪuʍ[bns{?ܖg].sKN԰{vLr/r&j_b?&{mˊЌ,<Ìw<O}qnXϺJZ`]v=؟gJ7Y/nmnf>2jfN(|Aws(?Kѓ]qF/x_TSyZs o}|W -x=ZϽwF2HOr3?53Џ>DkϾ{J@s?OϿ8Xx*C6Xl6""f'R%ub<5ZV-*byH\*8A )-[2E :.K$&+hq'zp-3|⁞FgsURcr$`4C%NB.5C2`2V+;8dg( 30_DGYGr(z 2;ʂ}r=s*(p.H*~^L9F;sh}"2v9\[%M@`"|6huZ҄]ÉRK(F悅54؉uTU R(zf%:CvKW9s99C>ōXr͘z'C83=U<;V3Fd; DF=)&( ǎ[KnC"Psʃqs2>CvHQ8]#HijHhvqq^M@omJ,D!d@VA5FVG,4k^DhXHbtI'(H4s@ *B/#rgXH@JApFDarH;>G"QEU xb>$!E8_$]X(FI_3Eq;0EPD$gt).i`kD@GoZSFyscQҔ 6CILh8lvhع_GvdljbsHOև%lCP.P&YK~NV'leRhlXsly)'OF(a UM9)DNv-_ZCRlm/Ls7)JUs#gF_9+-QP>B %a'.Yfz 71c5AP$SPEFmS5s6fV.ФAuv6M( VFT^jQYSIu]pW~fBpSh`2r `A2~R#S L l5#Q3Jb9mvDڂ/VaeVYWQ!=?F2R٣ V?,'l,yC:xxugw(H+uU;It';bi*页w+ feǫx"d z*_E_vFYrj5U [sAӚzlP}#.L59({9uy:QhoOJ2p,V!"{ꭆ9gۡvh[vZӱ@j__ ,\ߔắ⩁6i`h+e˪jj]@ faKQ.n}x1re%bBiWY-|vb:QZVY5P䮈^cKj+$"Z.\ v_ +0ڶ_Snf(ef{7>uY h7Kʚ Un͋1ڛB\U Ѫ^*_ ہZKțVºhrKq a{X]ġ=km;DAWcGlSg l:6öW2Mdj&T*lNӇV)ame5+%;(e1( K2gSO8k95<cX)I6$|LHKuKH 7̽Ev*`(_!RS ^{Pug(or% ǻsRtTA6mt BSI/twDWd=0(;fzsj!xLuEtȚP8Wt(n|@yw3\J\h勍#7!_Q|lXd=Y52M$^&~(*,.02>4^6~8:%yL7"QWiG~XD90fMyV>ĭ '! $ Vܮ%H}1n湰 P#SPAPy.ܨ)}x^$í裱C[#Hmn:TL[.hn:</YqfkAɴB9㏴KAѼ,ʾ>^~؞ھގBnR߮Mi J́BUT.ムIQsܨvp((@𿡞ej֎NƭAU|OQe{*N0 E|VCK<)>M1\D~J!@thr rn!VNU?2jlnpr?t_vxz|~m+ rs/6ngeO+ /hқ4o5y`@ _OU] yaf!I&zh6}l9οqr^pϏ<%nQR%:?_8yxxyHE=d!h<"bB`)jb-1CkqHh2n (n "q44Y$RV A8Znrvz~,::r\d f\@悚U(4hFg%\`(tGKOSW[Ӛ\l24Dy\4Xx( tF8{pRt"Lp!ND5ANh? )RL )휆aTŒ)s&+%KG: *a 8ue V6B*u*$À=64P1(aϢMz䁪 n =,jndmm Cǖ/cάy3Ξ?-z4ҦONz5֮_Î-{6ڶoέ{7޾.|8Ə#O|9ΟC.}:֯cϮ};޿/~<ϣO~=Ï/>ϯ?X" 2ؠBRXbrء#X'+آ/3X7☣;أ?CYG"K2٤OBSRYWb[r٥_cYgk٦osYw♧{٧Z"2ڨBRZbrکZڪZ⚫ګ["2۬BR[brۭ߂[碛ۮ[⛯ۯ\# 3ܰCS\csܱ#\'+ܲ/3\7㜳;ܳ?C]G#K3ݴOCSS6Wc[s]CNUصc`Xkg}69A:$#M<؎lͷ۵0P 03C24=0 ރ\\?0򚴦9Hbs>=K9p3W mly3S|ȟ3OwXF3Ak;Q3 dyp w@|z!+.+P2r/P# s})8P}kf( ph Lف&HGfnLBUN!)Y$\ԍ/"ә~}c(.$v5DGeQJ.ԩ ښ*իb5Z*WlM#Xr'8`|"x5/|I\871zn۫DE¤l^aA+m WxC\c,*PYJ4r8HoL ؽFx E<)͙Y^zR29$U! ] v ǾhG>8Sq>tb7H|qftT+]Ʒ:@bnЛͽwbs`N`JP$@ o>Krq!Vo5L.FDݘ.QI"L;xƇP~7;>lm. f#f+d@`XK,԰ct+dM2 ~/Mx . _pոУKNسkνËOӫ_Ͼ{8|xA(h6@|lF(Gfv ($h;@Ë 04D](_`]'W*nHh QGI!-=x'.Y$;X^~ihlf}mE,.lh0p'JxiZcʗA _%b grҩ!EZiVnߢw ꫰*무֪\fdf¯q[$:꟫&" 9Q6ixےmȒyk[bX k{Ǔl(Hjˑ@Y%Z(\oT;/9 \,R{ (}%qg0$ Hm1*I*; %wZQl~,07QFgd@uq`}Z'blHrꦭl&1Kor5s+gEp_S Ќ 2Yhp)߆8͋/>}7wmY G9֧um(`ygu/d. կ s37^9gDno?UV:kWr1G 66)+_rp4LЂh 9\tA!7BLLg:{rPPPRЏsЅIT#=hLc(FAI^n\֧7W:9H U"+*>X8z}N;>Sݫ ˓a:R}d4Tgե;A6:%-`|55lf:Dpi7.Q tYZ3` 2NsN̛$; tw"8 I,S)N HMh6O4 X~|Oeԉ-u lݼ'#%x>(MJ3xYQK4Mv*1t3S2KN{x$M"B a'zL (@rj<2D *HTpaX*O3zvep hd]^AYr?cZcL%1tt#i*Ѝ.[*pB4O #bxHV:Fuv ȴͼvX PprPCE KZnA»KYFJͰ7*V5[Nc"6VNAěx(4- Gq״ئJ:}W_?1Z:KYɕ񐳆Dw 0EBx}˽Ify^xNVbץ#R ( Ny\]qBN㳱yKPzH%` -hϧhRep<ORi@4l,uҞR^6ѭw]us0sj) `sY=/G; uv[sE ܪ]`;%`Jo+ff-gw6uy޽7%><\L͌hMk~3#"YpΡ 'f(C 7ʵ. 9s{Z}ԧNX?ֲ{z(hO; ɰj%&+5DZ[~OO;񐏼'O[ϼ7{_ K7soB:{i;ۊALWM# l)uN#o,# '$HbȞM J ~@& .>u m(/4ۛk WtfON|%\+t}Yv|qu,5V|M||W]E]15xs l6?n)~ҁ<4%1!&G+:/*SgH"8! u3!c+Ҁ[|„ T5fGsrG$D(&8G0>R"҅u8P^{"64C5=Ip 01t{97vw%5uat"p#)<51p6#32}ZH1VWIs>' )47\_!_X2՗]AP4Ws5qm9}bXh;?gAIr(2BC}- Y46Ȇk[@ă-`hhNmT ţU&<S;3B~1=68&8Ȁm83?aH%cR<(?W`Sg*n 0S#'²(^K*A]WBC:TcPdC\sIFڧc~2JFJERW, 3ACE(h}5'B_D0ę8tU1i dOX_P4AW}TߕJe"XQ#A)FFq BYrpWkI1F GȴWHj5?_@i (`Ct['(G٢_"HUXgt֙IԞd˧^`FA%MA*(J$CG 8%&+`IT՟/N1!JFWN0 !"tc{H{86[FeC:Mw1Ix\L7|V3:.ФwNo0raQ7dR O hQK;F:g!xQJi & ZY"x`z["Z&59 j_lbV!D5UTEzYTh2:XX ^*ySW/AEJmSSpҕBbŧ\SpU}%ăsC~3 |`: 9ȪbiEZ~*zl*/-U%zөmȣ[N*3/@pYPZ+INu7ð.եw)J w XHXǘ;ꭤ'!AW\oʑzV:H8HʧX k}4c`9fۭK_KNv閨Tdbfz؛Pi N+pY6]hSlvl8rZijܷ>4em 9lP9iklfkƀd\ijvfI Q"5P[W9k2,Vdw"2 0Ä6kl|SShIԻhDŽ \rnus@aB>h)e_iz1|ko- ~}R}tg!p׈ifl)S:ؔ S;b^ie?1ڨm >a5ڲmdD۳Qkp:1;qx־Ip)A]}؝ڽ=]}]\ߛ4G?&F95⬸ y\>1&ս^TQd8ܻ]2hoYCk˃l:EM۠{rCj[mDYAiJK沭:AY9+++iSH;A#t>^~舞芾>^~J}g} b1|Nߣ҆+]~#=XE5 #᷎!^Y֜gŽiaG5T>(^˞D 7NҌ_m{"HVHޔ?^;.}q+.Z!}655i@ᑝxQE.r 6:/ q( 5\<ӵ}㹾e\%|B)jb-rS"A5H Hn=v5$"B)%BFJNRVZ^b0$e"9] x,V4^p\`#'+/37M@}XlE<6s3y`60P *t(ѢF"MEL^J%ׂVbBjP ۠Y^Ϣ% '^]bv\$ȝ]U,VГ|wN[#  !0 \㊇7OХ;qK mӌLA~t,v+@7ؿ#,!FB Ã#XRov<$@o|h#vw \"D9}(EЦo9ƋYD[@F 0ۺ(/QP,#F<@`?֛;sNHdC"2Ëbި7 V~"#pВ HIرn3K"`G F$$/y_3c$lɉBt`6P8^ALGy -GRH@4l Yne9e+N6XyZ2JzVZ\\o Ӂ`aAnӿTPBRMit[  ylWV]/{[.q Wl~ߌ^G;5}w+NlUC/HTo{;ҽwnFp8ZqW[=n✪u`̻6`eͅ1rJ^B,7%6kLg2 ZmO&cFF̶V1Z}qzR Y5a Y#4L4dh8(  5 zߕ/t9^>P| ҶM0l&QЮ1+FF?d 2 h ͉&gayo$hwb6;| Vg[}fk@,y|k782@qjw8܌}ocn ^&g@s 񉃼?ܿ˅G1Rf=QI3)954K 6f;^Ý9O|ҭ̗uӽĮ]h>wo`EJ5Ḻz0iDAr1O߆2f`m9?esmE.|G_jqk,૷}|s\x.9Mjی[Fr~._f1]a}\H9xXeuTo>kx>=+HUFH?^(:L̝dGƺTb(6QsZf03TG@efO Q7z!hcݼ-va^e$అ*ݍJ "!vԛ 2)VA4藺oaR|Q =Saȴ3J90 ? e;" ]S  ?'uHGF%ҐJhdSG NjZHVeac$I7vM&g⼌ٽez!OIҕT 0*E=̫'E7ha!Gj61=<;ڵNڣJ2\6xLzMBЈN g?; NEJ[җFHWӨRԨNW2ӰgMZָεw^6A=H ֚-l9R vTag (t;Ѐ=@˹`l[Mz7peF#ߵZ $MuCARD·p_;wu .2n"Pg@ʕ@sSvU`n0* B{ 0@^BxO\XϺַu{B.Ca;nNf/]H!.Σ|%ο^wZa9 P;O T(M;y0`C`wgf׼.#w{oƿ6 Ч@" x÷俰x0?A{ 3Յ2֘aÏ@y#?g3~aP~s~'x uWKG}CPN׀D瀡GF{؁^wl'|G|wk#}} g}s,&xNqW|Op`(ciBrE~d~w2(q~{xyp$W^X^!bqEPEЅ_EPuhT`G2 D xu HB wy @$xf{ dq&vU(l8HiHm U'N(ׇ 6ɈyXpHmXhk Bp*y'8kO6nmh:5H`& xy&`vyxPЊBzhc'Rh]6lj(yrvcz ~bkivUu8J{W&#|8k۸m~w}(=}!}&Ճ'H昅WGP|A9qqxN@;hӧ@ Gz|){)0 pyPՔN m,kK"iɂ9pfև<(r8~[95X8((oPyXWxJi> 'f8dHe}UimUiY`9TkyI7o}ٝnXI9Ɋ9YF|I{BdiyiiaIIhY)ɔ֙Q ɛ1Ii )Ǚ̩I(*<|Fl94ZlJ5xʣv9 Aj|)I0St `xKF`&Z jz$wX*k^9ʕyfU:a${wاWd:2jZ{8z8=jS(pGjkzPuw8J;zeZC _smJ9|~RY _)xʉf29[) 0mxɝZֺ♘JjsϧjGrvJk9 0o6kjvܺʒ߈iiXkk] ZsxK zuy7~s*z";*hGp.q`xs +֯ei ~Zw9-wt02'&ex$u>y ^Ӈs T;^hqd/UgRD5tvR@Oy*:xwNK7$˗&Kkx `{˕&x :S98*S׷t"BȱNPqxS۶XF PX%7 @yffXCF(Pf+CXcf&wGf6)TpjXftԫIn;ظk)z6ܛ K!spnˆ;}E rgn{ |`+™I*³g#02<4Li,z+n}:I}nצhs1#jFyޕ Tȭx{\^zΕMrdn.ɐͳ/F=; ]|~|wԻ|(ɊikF4$~TE>d^ũi~ʈGΞ4 崩iD:-ƪD` 뺾,N~Y҉}jq~` ciXyҕ;jaJOwK;k^W mnN9m潁 uMiyJPY ^Hܭ*yǼ^]Lu,ZsM&n/ٙy8Mk+X0M?]s*ofxYy.HC UZf~JXXힴM#Zp s[:tnzn\KP''Ij-.t< ?vwNȹM~?z:ύGf@uooyB#]מwO~Fa}/p,JfЖBIvŋN)eIN#+HkXh F -߾OCSa20It>Q4^Y~a\6ivq5 Ry[.< .". :.< #74 /EH99 U8.1C3KsG?UxQ}]#a!=R1]).=<\.6!.h6 <=2:}"p4GE$Ta*s F8bE1fޝt&C*4Re1O2N'yZr+1sI'Q5ڡ"3TҰ;ϪJUGzyt(ºH52\ u - EGWAy <}(N$Duk 7Ɩ=vm۷qn9[rL/m~:g/&q>}&pRmho)QN4a{ wpΧ^awXΚdKEiń8( 6$PX60DA!qZXd16p ; P0A"&)#^ R!#LR%dc &$B!hi%i.lK0EZtƩ,-2Ҥ3D?5z8%2X@E#$Pox qnlj @$~ԻKr;J+"i[hR]y_x2a/coemYWic';V foUq-sqZpDZZrWyMM?zWvn X-Nx um )1ؕ . AWI.y}RYnaYi qY-jZ衉.裑NZ饙n駡Zꩩ꫱Z뭹[.N[n[Նᄻ[GWK /Obo);\9s;7= /疼){e5o;׳w=e[$t} Ln̳+ {GRԩuY^oaI?C,fHA=OSmۅz}hjLPuZ1LJh7;ƒau@U ' WKSJ;b2 5‡d^d⸐?Sa(,zzE4"ݰ=%r{M<d#% ?\Q>җ\&4J T4/.$# Ԁu[ |#4 A A Q1!#G?+ p@xʧ瑵QSI/"$,E%.֒`f-AYO&Il &rD]rmITbDa+B7Y?-Ԋ ΉF+Hh-hHrD[g;d[c:AY|rZc44JNq@S]0DZRhBkD.>EIBT.!"/QzD_ruKcSLW"VY9zJ4OwlzA)ѣ"h[V~$UR`.J-PUbZBj EZRJ]C{PrR1A -R( 8ʚ - pdBTOA[VEsؑ5X`,eDSZ뭔iu2]Mt%O)r*5F{`:*nDz\@VדɒJgQT;"=T}cEIP)=`ȭܵ k_Xd?WV*h@!F?{!&%&o >?,֎F鉖Ħ#miRԮx"2%j 6%9u ۀ)ZFb=m10r&kX<FQCthʦzQa*;G ? aC-PJJ,ѹPUyϚajb8STo"f#*y$%N⽩ťUUEb+Zj߼@.XOzĠ )@TZM2Kœc>ijuiY1*͢[DMWzΛ@pR_N{O.*bRCzš(pjXj;i-ԢM6ZĶMc _m7~M?ZN,8۪Hw AKH7X<>9ӡ09JBQSMPA.ޯ/`p5 ^v1@87NW4pBgb0tk@HJ#lprO $GrPM|{-X6Ӛ d%=BUVd9ohG >P3}/fX֥ wɝEtϷx;w!v#ڐ~S阯nwGw+KϣC-crϿno)?rc K9'EDROcOL :R P"`6^oYV¡"РZ0:,%^/>"MVJ B9 (iH0$/ ,o2H%FJY^, .pa ! p>?!t,?oTkihH/1(N0ј A1%m*\+z oĦp0 eQ ʧ/aMpB@9!+> =6*|# 0VLW5)#*։s❐+T1l%-(1dО#]!D:DDDg"J"ACBK; <!GCZ^QbqQWKT&+1llާj&(}o)>WXV].#2i2*cl Eĩ)7#QxD<6+s:)>E)!-Ȓ>wK8Ȩ !2 ECd!li/ L /J2NE*(RaSd>#0*5((y:s%GrN2%e`"`8`|1 '06]rSfOz'#donO7b44 H!3ӏҍ.wʇ,e<1 &-E1a1]$UU3MQld8F$GJN5P5qk@%ZZ?ڤi?5?K+@tAvDC^D Y>f@hS,04tC'CKj2c@qGy+4c8&b6GBgjnGCNGJJlĞtTJ}ⲴLL4MtMٴMM4NtNNN4OF>OO5PuP P P5QuQQQ!5R%P3SO-R15SO'S=SA5TEuTITR55UUuUŜX;ofBSMVq5WuuWySH̆TXDYuGgUf.TY2@G+ץxp$\lW[5\uR~X>(PG[Ő%X٤ӡઁU;.C^aBdCgwiVff]6gk@+%%k-fod}adg6$[BVl]\`t^RXi'th17s5wsUh!+Qq;qChtwivt1Iu]!lPfjXj)HtlD m$Ip(zmWpp \׫REFn1$6cp7`|%Q$}C"D eg98{se-@ }B{0c` #8nQBw-`&xB(7̂DkpUʞ .:HT{ἔ=Ww JD0#?E@v^>D%A2aoK,o@W X鸎TXX>veXWAGF8S_V$ kVObؾݤc&ۥ D5W(*ym\7w#.˜R}W% $fBV8o9{?ѕM̼[YQꔗ4o측18 X#ΌL(,`흉cR+bMTjaFសlWC y̾K>8̚%85YxEZYQvE؇Nx?Õx4`huwkxܴ:PÙͩq6`}@Z$f֜vZڣy:Yeńfvf횉 r`,ͬՐ+NNE{Ť=S:lG{-0!A2Nqc3`Yխ:yBC[-ѣIx龭qs1 y,餺b) $.bz~;[;[a۽&hvY'~ĺ[i[32Zrp.DW8¾yj%Uzk5ov2a | $3Zbm TБ|#}]]̩tk> .]c$kKM>Hdxeȱ=BTC>17osUV4c9v'FO6z2~1D|a"HL!%4*2r32+cW!Q[~rmeln_B_2<º8Uw?zʥM?!1pge낧]5,#o]_=yvb3Cޒ_Lo{,58ڮJ (p  ÆO@(q"Ŋ/b&͚y? )r,#OLέ)s$4̩s'Ϟ>5ΠF<̨t)ӦNJܨ ͪVeyyu+Wju +6efϢMv0V !۞Iͫw/_3R=t+x0†H0cBB,y2e% 22û}?-Oz5֮_Î-{dϣoέ{_P.|8Ə#O|9ΟC.}:֯cϮ};޿/~<_@k=w=ϯ?ן" 2X$h>RX6:"FV"PP=Xr@2+AM Cc!w?bCa3h0+e@/ tc63a2>`%/6tг<aI҈I&0(Nj$R ب#T."d<sXJ?z"DB ۴T z嫒9kJ($*͘q@V@+:"1ɨKtGz٧& vʭIrn{Ro$bAn,h$숹i…Xn'z`{Kz ^kbb,)T{\L|<:s3ji~R,H[XƃN2G t[S_{Wo3Gn,ҿZ}]ԵƝfh-/R8_1+9%[v!dC˪4}qM Lh> $"0 Bfd˨1Z2o <trDW;P|2#}*S7b89\`ؼ0 ]|=idej/Z) Ih1;jH’_ pNJEp` ,Yn5y`v0.@`p.c4j6iJ\7;t!XCP6 5ҍ#Htgr9*HD8ЌЬ k`X@ vb ŴUp 9K5b0(m U ÕZk\jx;i.u\9UW $Sk d :;"1pKdJon*&OYz2-`?KNutQYLUdrXkiJPQOӻ2pAXz3n+o?'P_ű`x$@PO\byR6K/f2jf#ń6Mچ϶1A,jj]r<.ysM"_tlGT9W SDaL8$O̞ĪDJ*IZeBQRWvnJN56k1re߼'w*d6_iFCb%WGbr2b:Ȝq<SvW bK̅G#ۍ7 տ%-9G ng.43L`t l|W"v!lpkx+.Xӥ!Mq[BDOCDzP4 z|H5,f R:`8j|7ۻ+AL;Hvǎo;uc<0(3ٸuvݐ_;$@w׀%6zF0mTNoFh[v_qrspӱ~@~5JcMeGȩK smmU.v؝GYywnͯ~TMZd01}()UU?$( 䔌 AŚ\I Blځֈ:iJzW ˶ Qp ` H__:vjJaCd >ftѥY`ᨽ!cᦴafa! &, 8pH,Ȥrl:ШtJZجvzxL.zn ~}OtHrIQrCniLrOpE BƱ]ûƾUEޯBɺK H6 (Z[NzD`W3j"}|a1@erMƛ8QE:L.R8K(2%-]ΧPq$a ZsNpX+KGM$_afR8BJB鴮vJp.PnP bn~%(r\+̼YD<ߑ}S e8'綐{Wȝ =r na 8_G49+\Mξ}Hƻ]P)GHx3OiEj鵂~с[ ^%4%-P~އe"2vu_zt4\ucsKua-^ Xu-!f?^$/.[#<y#|HAWAh"vD(<#2NXKLUcj QKIYd;5Zd8h&X= |(րYXJc20^hga A eҧy*ՄjB%P.r˪)f(iZlbMLdA>t,^9BYJjz*MS ]_"C!g6rP\Pqf+p@)CٰꈯIA[K0lqKD2l+1 ڱZ^| ʓHXpǼKSRkb|'qW|01ŵ\/H +Լ#5.[26Rm]+R:}aƭZB lmh-5TɣNmX3D/;mtltL}A p~wIuXf2ÒUc_~:%qMF-Gf nmݙ/񘔸y h ;jI9ݡҙ#/!f5dX8=bwgϟբ.]*gozgV@D8Jw1&BF7 dJY)T%eie_@#g\gpOA@t(z9֝ ˜RAZiDa#r!6(&eeARg%)qˋ`LH6A+ʴ%cR(4hKO#2 nt"0yى,[:. Lvi,ldEIM^)I-jW e,ґ(T$Nt-PѩRbxLX: ɍf((1̯|W. Ɍ+@ kR2咰]ɔ(YXk6P#S:t` }!"*ъo/,Q`4(>fQR4v-eKcJXf65ͩ@nOyPJԢHƖԦ:PTJժZXͪVծz` XJֲhMZֶI\J׺xͫ^׾ `KMb; 8d'KZͬf7z hGKҚ%bWֺlgKͭnwEpKMr[\ЍtKZ"kw;^^z .s|'^׼Ucx-ov/]ػ.2R6.0_X68NW % W|5%PW@zK81s{_Ǝ,AU$d|X20V1$X8|=0X+Ura,fygn2A"PJL1aLa`" JZg2>l|N5!.񆛙c|,:wnq"=g[t tZc7xkae6=OA8},=ɾqwn-UY70 ]f @li5~ndk\xGOқ'_,}]X'?9XjyISʝۉ&wmX7 ZZdJDxنgr3y Y'Zd%38%ɡS$w铑~J|^ZIHnuqWuh9ڪZM z (pZyopǧvx:w(%8G:z zx lр|嚨hǨp! :',txq ع3ٓ 9}η|鐱ڰEZXjʑb*VH}We|y {eױ7;,ײ*XaǯɊ s .: :utrvZFkaچP@ˤ J&,X0WWpVwAy`%@r;AE2ZΦlꨱ^qRerP8DW`{h˷ c+QWdcv] ʒ:WKe&Gdn֨1* 8eI{ˋb媎ZKeӁۮԻ۵Ehvib qnrnNxtKv XQDd,[[tQl}k eb4IZ` ,nbèꛒ|lj{aKJȽ "XA 5&=w h';dv*7Y'&YQ<~SƃjСw?ţ(YXőuM̭5xy/hb)Abkcq;zǧWD | }[p@B=D]F}HJL6PR=T]V}XZ\^`b=d]f}hjlնpr=׳v}xz|~׀oMׄ]؆={z،؍ Ѫ=ٔ]ٖ}٘ٚM؞٠ڢ=ڤ]ڦ}ڨڪڬڮڮ []|5۳=qM[ۮd@ab,ȝʽ]֝GgfOVfڍ5k޵=ުۼ۶Ԇ\jlL͑>^iݭk$*n=]qxbmjPP~MWmt HQ>*sfO -8yk!k{Kuݮ>|~] x\*kMCn=فx4۽ ňپXFnʀP~RF>&ډ 8{x q=k=cʬ*92)_ HT̤EtPʡWQA^*ZD S4Zz3J*GrM,֡ɳ\U0rZRת=}fXRw0Իo_!Ç-b`m(F1cfDj͟AeHE/kwR"@YEt,5Yn{vuR`ٶ:-!.VNW}{&dZc0t܄X.E(!H #+䰀@d ZB6 |4#Q{чgf.xi(>&"Ĺ&Q%o0FL(f1#JR`8/,3L id|KK9YlH "x@ t=s;ĒJ)+' *p`ISnGJTm(fyn=8I17Eꐱ`J g&Hkp5`7_tlRZAb_-qEHkVmc%:U7gMd׃tdv#!e6( ;W ρX`՚eX嗪X.B4eKs nI.Q[YnaY GAYgL矁̕i.裑NZ3cou9/Z "[>q!굱=[[NLߦ[ O\o!\)1\9A]yKQO]YoauNq]w[(lf[xI/Yoi]y^_/Ooأ^{~lv;W?, fD-U,M0ݏ ɟ m*-# B P$P0lu.WöР=XÎ)V117rǖ{z: 0qh{/ +#Ւt ̉dT%mg*G=;Ȃ|d<U/ O }Q&F@ #Kqj18A hc(آe7IJBr4 :xyKXr,HLa q32pώ;sNS{Քя Bz:$F—)Rg{1`eLY-0PuЁàFs9HS|ECT"S3hcGp&JA HMjv9[@4wI%Q,B&QE0p#˜8 NrS~LQϰmemt+PХs{gGW6 39Uae5#zk\|)FtT+\ 2z} O9rliP-cPlH%mթLK@y-TX&pӲқ$NpuA!f+J3_\ 񦅦E4w% g6t2T@V $=7-GCc/ V`Uf:Z4vhp˕@YQr2fUz%4&ʶiQdux+2 zcbv%5c9?X5mGρv7mC[e͙dM"Ygo/UZGbS=JUv ppe99qrmHVbKjW ;mp5|sgSgu~2r z-x|['x߮z콳 Pcw=#p L ·7 K~ei])QlQ~)oSøN^S84OҕZK Eة8=gF7ǩEfnP7^ԫ [aTPvʆOloqqMCv2 $l{) k;ɱxN\.yHE<: `C> s),E6B1ZlZ Qŭ*RH>2R&h_vLw0zp~-LBehH . 0#VX V _Bdi5j;Zɫ>,Kh)p%C81JN"+s+ `0F.qO4.OQR(B"eRp$`]p, *.fUf`M8!-EqHRZW iD` p1-\ W%U!U/sBvgጫlJ_qzZ:Ui'?&芊(@Rq^ b*[!mf2!!!`#`, /yE"""/2Ҁ2/ڌR/p/rH묣-Tr..s2)%21$3s39B3OO $3Y/3`Z36!6ij@)F3PJ335;h5is78397=4'8~lk::3;s;;;3s>S>>3?s???4@t@ @ @4AtA4@s>!4B%tB)B>4C5tC9C=CA4DA-DMDQt01%&.<<CEFmFq4GutCDʓ'b4E!Hu OHTg}@Ӎd'!|\ |%_t'YoFwL4MtMy4% )%>TmtA""J荴hNPNѐԙΆPB6BJݏ*%(Q N+`JӢSU!U QQc4PdjH,K'K1*g:HᄘQY%8JLtZZM{tŘ_qYNDMm^scI/{q:X#$I5 S\F]r"Ŗ"0a|sb`S5[^ DCJ`ܱd5d(hWa|Ko`? 6;B4ZZhh4[? , uVDjb2T֙`͠6v6l=jj&kC37Jz`]?2]=nPn7lɈkA# }N;ʖ>m,I>h(Vf @V,1{fV*ZUԂ\Vnt7h_AnV!TX5G<L$Z iwxhjJ:?P\aD `XNUv~K Xs9yz""#ᨅSpykj}շ{نWmɖǐdyãmƷzA" {A 7r(e&<Y,at*+1x>+ R8XIH^t7p#̴x8FwjD/": 7?Cly-w5t}o/=0 2XtSxmȘ̘w7؊8lH"V808V CmΌyEif7:k7HL~abX~x99AXg0-jp9 +,oS6nHo}AٖȐzFu29'8ٍ7B"şf'޹,ˊb}+Ys֡^ۡcΑͰM!8;WTT۳Yy@Am{v{s?yej+:͞[K:)μ `(aд癱Vٝz8,ܡO$1\9*,Pi:.PZ^ɷ{yZ{{w,9Z6ɻ8-h[Z/ŇEc]!z'zqEԆ<;KK0f:W#ښ+O6e#؁4{+,f[#sY.VZe{_ck8StK{QL\d|Y\QoGOgАx;:Qlٜm{`kC&%Ʉ}_rȃ:UCc1}ӯQ6}µ={]7ނ6hM9q˕ձro]jb\nHww) $^"xSGW=[K41xKIA9:'>U֝H~cq-S@~%wF282x.Cu)__bd͡#ܚY5Zf@8 4:`[^G-8pSYYa:MiThE0jݾ d}#Ϡd# y6z3~A*}5o]$$vgoK<Κsj+ Q0q8c(?o]'UWUրD!,.{^DF1G^VeDB"KX)橋@J56[wٿM5a!O^6M@@T u,2M IV-uxN9a9niVQB> ]` *t(ѢF" LIkpXU8j5f: *T=:\] դf:%FQ*U0H&/:bLk Yb卩=ˑd`Z+6aƏ#O.k;=7t:֯cϮ}̥B?/~|sϣO/HpA×"!>+>Ur" ^ z'Ņ'G\8~!h8 pj)0X7cuB?y^ XGK78dH ;F2I :r٥_ȣRYgk&[zsYP馞{٧Z"2ڨBRZbjqک*I$fZkZ⚫!B0d"ڬ=2XRJѥb lb9a2dC@r. ,hW;¢յV.'>m2,:bW\Ë`Llceٶ4p`zܒ\ 3!c.3.7)' \< J:1 .ƜRS,0O|@. &PN} c=Ug;Rڙ\wn㝦\ILrEm*{ӌ;17Q|\Ƚcugg"k?Da <3OBX1PA\\z;[i'nvCyS޲w΁sqAO:e Q7곖Aƒs5tTD A.I[7 3EPĻR@@ #`W%f~ Z<db!| /qAfqP/ 2C0 2E&4kgOMzZ<= FuP~`skcO[O1@P#}& 8k 0;ܡ9iCap 7"x$$%gÂp 7 1#8d- '`'"E4偈`q7_d_lj!\ n1Sy7Fĥ*`HШćlFqZQT#2O:2$L/LԶ6-2bFܹ|?,daVv~Q*oŒū>YeV G9grmYy6] ;]UVnxJ1cL2[a M2ޘVHXbB[43B͘N7,ͥ cWJ$8qOZAB*B|̜Q'x(mo;Xy|[Aݨ Mc>F6 PNƿ| *3ï5 crD+Wf,Ii+R DH>,|㹁R 6%3J )|@{ 13\+'.'i6zԦ>=Z;CH@Kq2EE^dRfɘ0-ŜUP.LUoDԙ=V_`=N$ޤ.8%U >8j@Xoa r[8䷙P2ŦR*bSMiZUaeGDIH=ǶIbfҌSP-`\N@dHaZJ^#$$&Rq*#u0@Ң #zѢ(8ZZ32vGV r_` RTJhݒG 9ZjLIّ%G*G{Z~)Ӽb bWƔHl* Zzaýš^U0gAs^t<ӴHK= Fvrg b d[z#sm8@zTՓWhOeOt&rĒ򓓖ؓTy&2hL`&Ĩg5eb[6WdO#[UGYv1c zx'$[6@A@.[1K[ɖF)\M]-@& "i>*ϥ*vY4VUiE(`R(̔{ը1׊yW֛V}AEMAJuZAؤڃJ}$192[9ײ^yt^+ZmDn[u=ĹZj^WVPmKVM T;zmmh(,m<`Y *XmFȑ1)(hȴT+ulhiV)EUsp˭*ά̾Iub'mA* ,*"{:ZQV\DݰBhƍlFɆ ~AΖFg߉+R-%HSzmݾ }:%m! Ҧaټjgdu+ :IK٢\ՈJma܆OikApjrܮHm&Ylx^+5==WB.ݛr)\`=fo}\;EEkwBTJNY*ov*Y@+4T:EB >k$a]6/2mA>P$,&!_:, Gm މޕ$\el_}$χjqb*AyqdIQ? Y!'Kj%/.엖5 W^DR<1K1p-91}x#!$NfE]N r@fL`9)< %%;`3 `Ҟ*!#!2D‡"&r.Co+o/S,D!.#3iQ/r23}"$&o2ks,67G!8D@s`9:;s<>s??t@ @tAA#tB+B3tC;CCtDKDStE[EctFkFstG{GtHHtIItJJtKKtLLtMMtNNtOOuP PuQQ?t! ,;'dihlp| Nu] ]B7lRĤrl:_4N/§\hEEHH-\*["z1a T=$Xk/F "&b1rt~y$WW^"|,w& f2%;#%Sl^; ki, wqOii \P*(ٲ&F'w #`'%}x/Il`9_\4PTuݻx0$ q͉2!ޑ# Cc mDMNB )cU+e1]=dݪgЅdQUm=ݑDK  4fջ" ѧ*2AΞ*Ua$ # Еa%7J4 (y5p!lIvA(Ёe-A|H`0EF8~@V hZTTBj6ܵg=v~k6`LwG AH'Mͪ5,[BX6n+K$$1ixg Q8- "{ё'I֭ xЄ#h (=j[8.)0s83'6 ],N:[W `ѻiOw;lynާK|s('b %i9c (v|BlXh/^΀THh?Сkc&J'd DXeC4HQ&ԜN70JfVLN"fOIs`vUxx l _=8ikd>X>C9R!=dC~KbxC4Lds9"K"MOz+v"<*pD|X(Ȍ5Z )Jɒ$]aαCYDy S'\F!(}h<ȾVdJ1d: rb8l@69MDqɈ?0RT&C诸cs"Dj~tF<UEߒ}a;)JЍ 5<3QҘѝ TLA~ڡ5"f6j]wg{pjys*Bs*ONe1Z)y"Z 邾L mQuya;VUV岘ͬfa2nސgGKkPvPֺO`=Hqa pit$r\7p7ȚKZSB! ,'.em(vU+tmx|/T. FL5!D By&|No`j4*wekzQ*\Z*}~~P _g&uJ{5bKH{=Q"G=l|Qù aX) %Y#WQ_[ h] H&]4N "9rB Hup" (S '_t2F3@6`N!1u+*`0Q*[`q%hh+b¥hQѤ>@kCX)El[QŒ63ʌ#Gw:A_Ƃ3kav/&"bxNJ )BcL;NۭؕN194g?d ؊GM=SBl.0l}~Ҩp2&$aBH9 WJ'8C}.<1]< F! , 'dihlp,t]{YpH,Ȥrl:ШtJZجV\( lzn|No _ s1E 88 }My|,_a~4l=ǍĐ s },А HpWP{.$(ȰÇSAV3jȱIcbHɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJ*vX @ k;/!سhӪ]˶۷p BXs˷/0a] LÈ+^̸ǐm ڭۊ:Cp@׳`ݖOd˓)v  <x,B`y{:2}I8УKN몃5νe ix}&~Ȓg _cྙwε%Ifa`^Cg5Xة^Vv P]L]xkvZFƃb55]Uzd0[Udc9#\IPF)"V0:%vX~5I ]B[: An`d;sV T[0m@` l%XFW'kgy[( w6Yjqih;?8Xij;DZW}:,TVkfڐuef\z;f^ Ɋ5m ^ AvՅ:cU{{ 0cX7f0NSTl0li*,@Zr >YcʱĻ;2LfZnqllV lGAպZk+dmY9n"=FBZ6vb&"eI+DV0|n;^88;}wB|\nc%^yIqM# 4+Pnn䟓>Пmgř圞gwT _89cYVr*' Ս隸_31 1#YN,MՀm8Y8AډEx=ƅ0 0*V CTfZ`4! HDpS[Q_8&JdD75 kG* C0;-cd1p/^KQ+iK8rkծ_-nIIXrm=m]`' 2B={YTp $ryT(fYώZ2dFټXβ=w"d+1]΃$A;rO3[p@(in&& Kt? 8 =.W!Zh1S9ǦP6}><iLEWfWXI|4͏ -NfCΎMn n{[b`qo->O"N|q η~NO;'N[<ܲ_Zԏtfo[#s{m2@ۥ1Wں 9jU,p…I OL[e7'y̖s6XXc mcH/2'X0[_ˡAO9 } <~Pvs$ѣrjă0Us,5ŵ: +}F_{ɝYc&{oC)Y;.?H64HhGί[:69'WHc߂4JVDHh-AYMR$T~ap7k2Vi0+1ς(rh9['H7y )f'k?}b! 8ҁTE+,=@jaVi1* 5F"oh j^-1!Xbbb8l7L'4L}zC|zkUGh+60>jW2h<"cg3u5!^3X0.g8=Te+#$Td28a3 Y3"-c3Xg7lq/!;2A0_dj4491W8U6BPgyC4Q}mahkz1-*4sc4r(2!èH3X"0#HU=x)}\ tNjГZctWfaQ#N[Վ5?x+%0;0M#Z\8R?9 @nÓ|UU)(8c;kEn#,M=\P iP"=a#zb1r<|S57U~UXcSWBi|R~k?[ԓiCĈf@VeH0H.CDY\^<)W)_i~z5B*EXwl!/XA;IlӷR9Ewy3 s{ӕ;yWhTÙQiZ?5eD=f`bP:R 6F_Y{iPʼn*28D's=GNf:sf) D'Vdz>sS9"Gr0%c՞ S`F%' 0EVץHIXFdWE"$ XK jaatFO妊6hKQc%.`Ԡ!N}OLf&d洖U=7`(uVaad)h!uɃ:6Kl43Qd䡦YCZO$^#_l%&u)i{f֜W"yKF]%#@*U,]Ql{I2 Qd`HVSUo0hI9K 'CP1F= uvx7]*ӗ "WM˪*XIJ%T-pXكWj!bU9X b[Jh*&_AZ/e[|0՚WJ *tgq "ºS# Y)ڙ5X[$P'jDCiU!{.ɥD[X |#%]Nz\U,*i2kRB2 -iz}OʲBF}Gڳ׵n)@+j˓JD+}vߴA+_C*O&f66F Ce` Cf'K3^?Vaц-骮Vc_{eaTwcw`zeƬqejk%3RV;[`K7"c`r;b^ kϘ»`6aYKbOs,Flj"l&Bgv*ĢghI[i"t 2@0, j+kYi&1!LWfY֬AVo>@- 4DP;iQL*q̷LŲ'+) , @Z|7PIl Wْnd,GlƑqmڂn 9v|qn b#xR|\ȆlKWPLJLr i<ɔ\ɖ|ɘɚɜɞɠʢ<ʤ\ʦ|ʨʬ|sÓ3܂˺\uGEQx07"%#|pj \ͥSsC ׌:E/pɵlA"#[,bYH@ + -ϼ1d,$(Ga0=SAV -*e' }?4,b-v7a 3.XB]GH+U#28LNPR=T]V}XZ\^`b=d]f}hjln)\!)o`khh<"Ɋ+׆ Z2(f("xؐm jؘ< ٸ /)mv٦ Xa |/=۪`& EڔLCCm 0 h읲̽ (-~sI~} ڐ(W݋pH% 6vUއrrVaH{}߁p1]O[=`̑lª->^~ ">$^&~(*VpV -˵@,>,m%VA_5n*΁zآأ $~{SuR(·12ۊ#T9i @?%pDNCh~v &oN?#s(-v] \._VgްcV']-Nc-OFރ>_x9=oU#rB,ή~븞뺾>^~Ȟʾ׽"K ;^ m-~NΨ>"Y-0q}2~@t.؞ 1σܘɷ<Ξ\4b8 *+Q|VS.<>@B?D_FHJLNPR?jFGjSsxׅ=ɕ=)~]4>E^ДfhVam<5ܼN}oWmNSG3U|±<ӵ}㹾!h<"%yz8%ibڭ P1l>56*,mO% " EU]%B5 DZ^bfjnrvql *t(ѢF"Mt)ӦNB*u*ժVbͪu+׮^ +v,ٲfϢMv-۶n7@ZD(ķ)< !Yt0~2dg Q)L3Sa謺Hfl!J[ zxK۵?U~"S<ޗk2~y0;|BOM@Uk(؉*'d}'s1HTW'@68Ѡ 4 d6ІaJbm/ q$#Vc&V,zPP h#JP:\"'BFGAqaѓh@H#X31j\# 8-8v'0 @v(3yS ?GB怃K"7B"F1tc .QYLcN!83`D,b$#+hF62%(BQ`L%a= 3&T AjHbGx ?,@@Bڜhx Tg:rL 2i&$?MSz#-kgjֳU5M >P\HTFxʫ5GvP{ORy8B JTŦ4!;Pɦ^U])VP/M+iKk5mB#P*+&Q_tB5@FO#-nٿNȋwy2=ttжt/yKԂp){T?9= !NO*\3.Uy`T [NOjyKl+$To}^/̑;,CBjkc @opFpsCj+;I/vKd^@؝lŠo$# ܭüIrI;d׻\lKs\\,͓,aSpvԌMnzq$@LkpT1rh:z΄n<2b:ʾ?^S{D9CrS:UO*U:Z= *wfS=*MJ/;vb5h*XU?gK*I;T8#* qS 1uT2pI3-Ike{9io hRӘlc΅ɩ2\4/1ogy6qA/94Nwހ5=kw`lQ5;9u)>z)?d ,Fs;uDڀP!K?{Kozޜia^D^.==kٻ;a/.>( ѯY?A?tO |G!??oą|$$``8s$a2L1^mE@8}_GECHf=StuCPpH\6UqA/ `aN}F]y lǬp,BoX`TVIVH 0s ( ZZH)b†>}[T[;e6D^_ } ZVi@AwH6(2Uu_88jHXA@[ Xɸ[@٠"8"M d}8p9@}"<6@3I6\`ӛ+A!"`KHa i0 !,6 AU=l"U&וpH,Ȥrl:Y-Ҕ,*l6G&/_޺_ʐϼ~Aqjt+k o-W$8 4+h,q9E*97v *0,k, >G/*,cvͼ>~.=^Z<,GG :b?bD iqIĉ=s$BcB!=!Crz:SLC*x:0ւ܋15ur_ ! R ®0Tc`T^׻xe;F̒j@/<XHe=/ Pwlb[8շc *Z$cF"gvL6 JMC2 wϴ^yRkڔ遗L3.5_Ϝ<Ŕ+:86d6~7`n%B0< "Z!! , 'dihl["W|*t (\PpHd5f&nu( &Iجvzx,/ ֲC\9"H)J?;=+dggiRB<'zVCMI7FbO}@)1 j< h#Gwu1d &9,bkܻA%D%Ncٵ-? rB#<W…7)C8b1\;%.\ pbyPP8i>܍8DF!!kɳϟ?Z87"JLԃQXN,8`f f|pwWn-(׊R VZ tPD`p譏wB D!㲑籨հ AzNMn  Eu)¸T Kbnȓ+_܋Mz~;[ʪ܁M24(rGykj߾wp0^YgDݽFi'@ T_ub礲Pž{6 8Xu_1IhAB4ڸf9,@y%`de\nyK`΃n)&]Lu(vl "uW' rka q 1j JEXgRiBN9p;5 RjV w. [wEEq+fI\(NI'ziJgF+341ٲfPETXnpF;[>ǖz+OH誻.M'Fjk i) ь{/i)*0Ȣ$0"G(2X†)/d7kBn0+@-P .qF9֯J`." r_ GZKTz,<<:2 xygM#-vZ._7씻pŒ:ԍؙ砇^y}SbuMӡ:.Ann3|W&n;ٓ~<'ѡGZ!0dQX@Ӽz2 _B.⻟i\ߖcl^"|0 u0IX`OwAƪǬ-\2nwg@oߺ)ocD ^@19Q}<"?aƊeuNtR`AI0E gE݌{za M;z )Ph@MM c񝠊!ڲ6 ьy2D&}6M$k1rM)ß(C J$CBql3(MD:T\DAEK)rt5J%1[LZCɌP{A*G˴,Q$vF<ܸTShiDdd:`A@H@)D+"G@@a! $4E@'HES'@!P_s(FᢤpG> C;PjŽ/t3V*|$Ũ$$z$2A IIҋ*U(uXJXKUd=T|?!;&T $@T'V(#kOxd18.ٳ+^ZZU/tbOĺͰB[ʚtL_7k:@F&+wB\&V+ r 4t&`dl,fܻMr/7΍tK]S tza|=zޠ%@m| ;ͯ~LN;'LRU#DzZht}+5=pSxNq?#}l\p 鍩ݰ=UF  DԶuI{8Ҁ*c56qMZ &Bβ6 `-j8n $TgBK34Bapc.Cd*i ׉lYDF 7pA-[\6ZȁC{(Ǘ[ S)GhAmziq\q_  B>`/)5OsM QζG2ZȆp#Mc:5/h b;-0Np\W:a+(;1oTCoܛ :atC! ]洢c60mgxhm5N7*mi?Y0AgșQJQ9 ނFͩiCo_y? GmAm O3lq.n/4S79 nLimɕ4>ӅP2Rȅ3Ֆ0z0ܛ?"IT]JrmDA;"$̬|?;̴V'B,yEՈD QZ9}de>8Y"#v1gԼB(jp@QO%%9 #@;VUuCp}r[Ae\d@יyQ:jca4!1bXDtxbvgrɤ:,,{,@{WtCՐ(3vG2+8@t' uBr)wlf(¢r7B, FJlFh+!dB,L!G'md~ntkmqOhw&l01#nu(a>a/ 2F3 lӄM:8/GRVSc4iW32}Ȇ8`s0'6b7iQu[xB#mV d" Q`/4HCX>!ȅ6~FA@jCX*dN4֨N7dxCԄB5xC"h: eccz:Dtc,_ "ɏ7 cd8ok'ד88RU姐Ȑ-0}{c84ԙ%b<) , ٜFTQ!XqxHGPhH7"qPHYP&Nyc-F.Gt)+&I[9 BhO؞1ʀaŒ+9+yv/n@t FQO*a3ɜT.0͖̄nAL&$wL0h(&#LTiu{$0Aȥ: 8d)"c*BQV8zB8KX9N.ICKC@# oǘobȍeO\dPX59S=5EUx%5 GE"TU*/Mf6jVJyzS>`zH eU#䠪>z4Vh!0HFzo:H#-xGSp0@VHk

e$C&#z?sGL-<Ë1C P{X\+#{2p ^,fWhj\&\ya.KƼ+0Gxz,0s#6lF{|G|Ȉ[<ɔ\ɩ{8!ZDm,ɝʢF%܎QRf=IgGg,7 Pv |ͅrytlSjh}}|%yq3J˷؈=ٻk7ۉ{@ٞ٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۲=۴]۶}۸ۺۼ۾ d@yo}-~ ()J-vN1sђƌ͈X`Q];AL&1m+ nr`ցuJoJ٣E~i*{k}(롘=\v,< )6-==^Jl,S:FʻG;7[$Z\^`b>d^f~hjlnpr>t^v,!w|~o~ O}n .3lP.>y,v>߂V+铎hg 'n&!3NP^m\7ӰN,!7v粉c㻞(΍6+G#;~mS3 nZ5$ܖUls>^~>^~!(GKr 迼 V62^oB6of0͸qF^%H&6 ,%^Y͐p?lHm M.SMB_tt@K~'iSܸn@ l#% ׍b_z Zuqmm_?_̆l$`țs|hOO.MޮΗʲ-qG KLoM&W~=:#Mlio))?8.$xmVیzھ3s=N8y±<ӵ}㹾!h<"%|B)jb-1l>5~9n= "&*.26:>BFJNRVZ^bfjnrvz~hP\XDxDXxyhH:*t@V<?Cp\L046`_Dy0N\ӊJ8Pӳ!\DfӾV@=-x0N]A /nynՂ HU3._2ւ hvo)&̡BFШ-Br@4ϩ7Uu+{ =kqMR5m#…;ڵXb7RlEucpE,Z0l|(* rkʤE`}z5 riҩU wn觻FBto` ۷paΛY&ACI}AmJ~>EXݑy>X" 2ؠBRXbrء#X'4 d,s2Ш<`K5 NN@}`AE4QENr9!?Hf-P9v&  tО\C > R^)О*QxkUj46Dg ]Z f g7 l`jzOM֫P/,u|Ցsԍ&񸨠~E[⛯ۯ\# 3ܰCS\csܱ#\'+ܲ/3\7㜳;ܳ?C]G#K3ݴOCSS]Wc[sݵ_c]gkݶos]w㝷{ݷ^#3޸CS^cs޹矃裓^駣ꫳ޺^㞻޻_#3߼CS_cs߽߃_磟߾_㟿߿0  h"0 \ B0 +h b0 ;0"! Kh0*\! [02! kh0:!{1B"h#"1J\"'B1R"h+b1Z"/1ih31U71hdcQ$;t&#f'F+ѤC"r``E0&D0S lKR(tI:$2’Tx8bY԰Fu.oFzVDAʼ#+%`QdIU1 I?QTc QD&>,3olf$CXȦ]"4$ 0< B ME. Ѐu " @Џ*RbX /j dJj ARe;AҢ$#( sS쪈#D%`%)Lg O/Ke՘8"l`~"虴 ŕLDfe K5Jff0e)+uj6AMq 2@c*0̗{L2o5(di2;Jϵgj$+sal(H!2K"} ed[ _UOy{S@bg!,6`HE}hlkx|P@(&X8 rJz6QG sHzm%S"fpN|ꐕ/T& RlT %K|OTyYz8+nOS.s T VQlUvmUS rKsʄ *@G ٢qS2lxgB-kH *M$1ڢ!Adl%fJJȲ+Ъ,KL,R) pI17v )N j45T̖ds`Y+/],ce  nlcXs+vSm%dPDQ畁e783XL3 Xr;$) Ktb!%;9Tx[*;DHJ䎙&! , 'dih\E%pAx@TC,r%pT`SFzfˬvzOӯxL.z͍m"!F7gyX(a>:<+l" U FH%H8rz# O? #Dh)ÛwE[A=Ӹޢ Cq0 #vx;j&-,l"d"Fpӑ[,s;H$ {N TU`xYы!-8SYyϟd`Q;%%_#:yxI&&)B ;20SF0۷$1ӛ_$SL ,]kT!JYx v $i*Pm)(;ꏞST*,3 :a}Cɕi6>9/pRl=A-<{+:м8$HʹG\~XdRw?Ѕ_Qj]$wrGB _tB7zztap a< GlE%%L:0ܣG @q$Gbh0"P %ti\]dQrVYX^@dayJrp@UPbAo)V:s^M1 `B$ 9reMypl h]Yfقp6­:60Î?x݄)V:Cj.ƦX&Z9Z^Nl- g"HKM# ByL e$* ;Aѓ[}W"% RƗdbRQU&E2!P)VvG*<>,dL_jE:]4zwt"iRGi]K5BTE2O[XMѡY\)i[ЅVTdx TYzL L_ȷxALlm+aO|%WI<4%DTR _s5\nO@:*G@X {+HG\J؄N1HT[P(×3Z؅^'Vpwhl؆ǀb?憹A |؇~|0`U߃+H{C(؈iFhU9z>7Yz:jzx53a*$2zhXx@*тVPx'p "{8Xxؘڸ؍8Xx蘎긎؎8Xx؏$bS' ِra2riِzhb8qY ya현&[ u$hs<$Du= @=( p1#Dt2JyHZ&Sj8o{dhKp*Tn_@B5xICؗ)Avi ^F@>,Y`MRٍb'8lY X Qh qnęٚ9Yyٛ9Yyșʩ ) GP]0i\Im2^;y)#i)!#99y~ R8>Xqf<_2^E9/GyS0I}Yg6qQ[S & (xZ (j}`p(x4:}呆cty5ڣ˧˄b~)>טt&3 R|O&$8ӉSڥGl@uiw^jlڦnpr:tZvzxz|ڧ~:ZGdh*^ jب:}8aj)9ve~Ꟃ;'کzjOVIAU" :# ]: d 0zX!~85ت!8&:s*}@uUu(3ʮzگ;[{ ۰1 ЋI:ha9˚ @OӤX&6=Z>@,;@r,ǟgh2I9;):npTp?IC$\ͻ7-HTJ=,}MlՌfY˼W՝U(s-Gdpr=t]v}xz|~׀ ԙ#h c7Ĉg|KЋ}뉓)@")̕mu[c"ِ֒h7ЎSڦ툀ĠMIݙ"ڣ@RYE УۨXVÎa͉ks.%C͉5E5ݛQ35rݕ8D`ȤFޚx2ޙ4}\#F>^~ >^~ ">$^&~(*,.02>4^6~8:<>@B>D^F~HJLNPR>T^V~XZ\^`b>d^f~hjlnpr>t^v~xz|~>^~舞芾>^~阞难>^~ꪾ>^~븞뺾>^~Ȟʾ>^~؞ھ>^~>ﯽ~!4}'>@PƒɚƻLRaPԨbÐO8IkM*ϙ) (HYI&[Mr~Po@0* (BmjԼaQ?z0:D6Lh?z4qL ܆dWFꈽ]Iz5䨴Je}|xo8`Lō=_=43OdժO<-XFv'O6' ?mi]w>͎C 쬡_PȼXfqYc6(ȏV4GpYMhC\ŏ'Om Mu+ٹ=m9[Cq =|O=|O=OOO<.BmM|x9һ xeĬzWF~.-_Wɋ8Ũ\8Amz|O_ܻs?Ǥ-r\w%QIMM{NȠzȠ`z}T{8AmzzF+Ũ\B轍lJ?zlJo^WF̮_WF̮ t%t! , >'dihl0uY1YN+Ȥr, ʃЬZجvn˄x1&&zuI fW3m3a(3un'zh < z_H<  `);ϝg;;j ޵Y;7'd8 8%8Ȱl*((kjRfƏ m`)!\Y0c *aƨ( )"ϟ@a$a?rҧP<a c5@Ћm28knGx9zX54#M :aA]wfPD 3ǭ^!mJ%CN{30t<?UU>Zpwxcp Ql52o觯/oS͋law <@7$gxVh4X)C,Jm' `A\Rz]S"& }B"\ax auY͉f())ΈGcP), .T +StJ2*G.\/T"ĔEE KR0@^5B %=i^2m1D_ ̤&7Nz (GIRZSjh#l-Mve. BzIU)KȀ( KX|)FfB$fk`,#8 )53Htr@c&0N,nOVO82O 펬#= gB+ D'JъZͨF7юz  ND-U~ߑ:'2KbTnHAG2q(9z\Eτ58:o~։&. iȾ L2hN6IM[-pkq˚RUMD, ĄU :i wV"obzî.=8il.vo`' SF2ъz]# =Z'餝h 4+tU.k\)4Ґΰ}j{Y rNv%h P))PNWꙖTܓTu$;>Ȫ]A 3s\|)eңz)iL^w|!oX;Σjh.ZClƜ 3kWabhH,ӽn_X j$t NpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJti6`w6*S`-$6(.^s`v@3K '2pW'Sn^TQq%@AaHhF6[ qT#_"_sqcdHBR!<5M `;qqHnXO˓+F`([cr7'K!_#Darcj}rVB3DQDU`oxjyObt"EDVsdXEL߶ &sI& 3kN&rT(8#gYFXsO8$ sCW(WH]<"lMuu4u(-d K2Pu`B ^7(Sf@5P'cԑb'^rv9e6IJv4Og6!! ,6w|hlp,tmxERʅ PhBY6Mx`pG.z}B`uHF׎2F\^Ql+UNn)OtQ>#?FKOrOJO>K 8 &O فR"%p]~ Aټ>) T֥fP<\y" 3((~ p ! 6E2Ɨ01 6.~Z @ȴj4 ʚOrJ*6FxZVӪ=GOu@ aʈ1k & L#$xجvz_c(hX.|V䒘3I-uB6{}rtXHpJqIttt p "%zJ |Ŧ#ɱrf"na&e;J ʩqwo*g㌎Sw"PB:{ |#:) 7xBcS )pAFSDN x BL[&9 AA3PJ4N1:уO4ի5$C,צ&"8"hӪ$n9Y*; 4Q* ^2aݙԾ" o2Ah@+S!! , 'dihl^Laq'upH,,r ШtJZجvcByr%,A~y g4l[:~ig m+kY<8 kÐ͐ jg`\2 w*5 l1>FijMС_ rp5H'4TJ ]#܀(SHJ1Tle?<ɳg7ukQ0(CMJ 8-<45,qKl )jYbBR%S`9L3>%@G]\W!xA&j։R\̵N~r'xgFWbgt4(u*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*NP\ TZ]i)~&+7i(+-FmО1EVRrkn$3es.0Kb@ )49k 2$#G|B g,CZs憡Z<@ğB3d2ˊnФ}W; ,DmH'L7PG-TWmXg\C,!АXפzP,`E'Lh6Aruzws("(lm,@.$b18w-ň0z1쨎@)|U/{@^Ӊbu仨 ӎ-%1P>o-__+V/c*3"TٳZo>h~T_L:'H Z̠7d9QDvmu! e,&pτ1z[w 8[ EI zЎ '}H0"$!qaԣPߛ"T!^D5ҢvE/z h;T(=F Nw @0D1YOhG?>i`""F:򑐌$'IJZ̤&7Nzh2N܄py4خF5/@ZR4FG/Pu #&KEcf#_Tw^ ,ay8#&fC4p 3(YVfhA4|0%Г. |DQ>#-&/ KYVH S;a$HN0̣MNFDx4, 6%xB y~7+m%[ƾP 7YdΕ#yqp~Й*ʏKt "ɲhMZֶp\J׺xApQ<(hCneh[ S `aG7Q|&563Hr[MN:t%rsB_Ly]n7/T@D(n;s6wdpTvdHcQH똒ΔJ"Ih:70 RPۘYaX.@υMZ޷h,$|SR09 _4V,IvN;'L [db1\nᝠ0+̯ w)) |Pf J'i☎/B"-t jleAga!&ىGv{Y"U2"(bz)$hn )6qfH}ƗьnoG-Q͐Bs{nT@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊hj Wxp Ӆ8XIƘʸpJEG'k^ŒؘxX3L6 Q$|ZȎw40uXx؍8U,~b,S!XfЎ e!Nh T)8i8-u~0y2 9؃vB),9cGvR؃pWw6#=)-By/wwka]b|hՄ 9ZwW~Gn%CB݀%o QS @xh{JǕtY^ x$:0!E xgCܖȥuxHp Pf0v}wzsyY#4S0%mَصvrٌq1htp7p`.6oQ@ 3+ /[<0 ;,N`ZK0,' \FAF ?Ml1/;p2)K4Ggn, 4+>Pg{`hnNOpՑ$p(A\X۴ \2ς3]{ 澭ˋ7~K5ݏlqbona+'G1;ڊfO>{oι#f[ЀxAL{34RsAqKІ-Sqk{$fO PIy~, `ۆ@4{|@G9ƝJ ( a hV &0s[< 01_v\GA)l2g4$B-#Hp5%zh@^zQFPo{6܌@C"'TmaU[܄|2F~S;x6n2 +Wogw/o觯#q?7O_^LmtP%%k *7od2`Ѣ ٯ6# ;s 2; @ {`m D<x qdw@>MXք|, o!n@gCh  b`SpAb1( (!VnSs',⇜EE#QdqHg=v !Ў1!SHk |҇INMr沪sE'Kaq70eȎuiYHztE=7:\jIbL2f:Ќ4IjZL#F_*lF|@@9q+iN0'!Q,0! jnͱҥjXRked*IbLN"Չc+ AVL S FƓAeSRJIX քЄAX}Ңd%P72N lvɵ-&P,禩fd~l -CL=J׺xͫ^׾ `KV*,G@.I*!tAcp"Tl"bȉ> 1Qh AR;1sԂ'n:v_ոX;ܢ|.rlω W67/HHnd=ŷzWu o^pwR{!*J_̃d6E a.34v'L [ΰ7{   h ݍ]b%'d(ISz'31p OPGTա1g&'$}{AZy#VhN|!yWu[MhN3*F26/(ЍlfNfhsr><Uxd%8#Wa (IMD9;PԧN[XϺַuQ6x8K}s^<-U:ש>ʤ|.T%+-iUSެ\u``*̽0IOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8XxՊdXxo؋"X876X8^(+?}uEtttXɑK;e7+zx+$lN oPYR7%RfwUeX*Hpw猣dncKCɋ+4D*18|x@en_8K0(Yb 3)e ]v<<++Rte5lI 3fIf4ѓP:?Y*D'ДG) GufdSI*Td% atp>d&x&BQxihG uiqJ}hDeyr|9fqICK&}'I(d ;prPiD i(DG2hDu tX6bJEpPg,^j%W@tM4G~LkʦJ`Qr>luJnapEUHZQj$mjDwz H^JwKQF.FBFoG<Wx*O`{8eg!#&W v;ei *tIPq‡qȕ3$`]@J(juR.r+ϊS*Um=ĮڊPka$0us0@z(JJutBʮj5}:`Tb%1J1T[LۮF`4t"$-R~>&BKD[/?L۴Nc۹tvJPUxס$*촤bkHOZpo[86PrZ7QP{]ux/uW<zr["9갫q_p.#5}u*p+ڹRɰV::~ 6)𧺫I+zHZYװ桛E.jgЖYh3LPKyyo`V7@˻Y!&, 8@pH,Ȥrl:ШtJZجvzxL.zn|N~ H*\ȰÇ#JHŋ3jȱǏ Cfɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJ] ‚ Sjʵׯ`V̱Xͪ]˶۷,Z%ښF˷߿=)Wo`+^̸qs#Y]ig|ϠCS@)m ynf+ A2ӟUͻwN*G 5o>$ֆ@A&gto}O>nPf˚J Rc6Ͽ\\x(=wIM&S{GJEfAz!V{A M e!4hcTrIU Ɯ(p("Z@t{݋ xIHX!qQ.pdM2(mBJ7O )I_xT `cJN{TbzV\d_ VǕIq$"jf&]`B @ZA/1`tZ)eTZbsd$Z! BZqtBnjVkmJXwU(Yٲ8%j賶%w9\Q;WǶIn VݿFJ ]E.]b{n]HF{/R uVZAnF*sQ^uJj;l2Vj*24pd 6sjf4erLjnLZ|s |݊\(<m*=XB3=j4}by&M/=J{wNzvZzNREN[< G$VѹAԎ@xipC=YJ ٧Hl]wj=X c '#]Z0J]?& &%VIyHF 0JbQA)Ziz~Aʐ#y"G<~T$Z5LqF Gjm.dIZPͨFK+ѭ=F2JIArNa*! ǻ r* f[2|2=5x t.Ρc`,Fb3+bgy!%d(f^@?Kֲqdw5t;'ڕ(F(Š[a*j|[j1h$f536n(SvԘC[OY=r4Z(Th];/O7<=i-_뗜8t SAκ)*Ѧ)hWI5~j]*UүϜ`%^MM_Z$g\E֨կN:Z1ꘜJZNūdg OU0YIk0Ih/Kۦ`~PkǁĠeNl9W5aDQ)WkڥV&4Uzdm;"=cz^ç>5.+,$|9ӏo/ `N~qۨY>upV πMBxֳPzk(v{&ij*Hml *v0g\*5jagz*isi)R@J#Jy2xHwшy;o9&hS?_mg kK ѳ5MP&'wxKkt"G~ۺN`괎yU;zW;R˧r lw`X;~>qG4;_&bv hrGPi譁K껾hԫ~UGkexh[j؋pDknP0[]&'nKn+x |@4ɾ"<«|(*,j!L4\Rg-:<IZ3lHLNP,{`ĊGZ^`bЏh}cnprsX[L溾l^iw9 ƞty9y6*~Ɏ[;_ ^XYZNJPl\F@餧̦m>+HP=ت)QZ^Ж~a\6ivq^߹gB -.< .":. #?=< J;SA? . 8.1WO=P]=;!$9`]).nE]F';u>+oI)<=20\ nMRaC!j3bE1fԸcG;qh=IpBw VG];6 XͦdprjA]d|[4[^c^{1KAB'ASbv-6j蟆 Jja6)O`^ @ܵ ^)]K@\% wQeT o/ȀE:屇xZQD! {3""}9vQ}{Ep-z|l@e,.+' xKb"s 4 X '* Jq=an<8H FOBIm밆}R L: ay7$*aw$bc+F I, U952RfM<w3M,,CڼR!d#(,i8 - njK>)T58`$"BU $!#410"aJTfcKͲu-{‘Ҋ@3Ab*+ 8U3v|( MlXx@@o*ixҦ\6tGB?؉碼>a%S7Ff]VQXăȂ. p MSLH>T03`pȅ|;E!kjum9?S)sILlTP_pFTN}L}AG%gdžtI m錡8j wFHn*j PTT\w O6!N T#HEaJش?8`-J}b 5RVֹm Z׍5bG:Ja CN2;8˙A/%g3Lf~s0h|gPGn)p9XYLӓ< @MZOZC /'}F5#wɣ<&Wi;}Bt }э&'b6 RlHW:YGxPdY\w Vav ?x<><8w;(l!\uoÙ&Juy hdǥ5X=PN(9:Ҁf['XF'cYz榝ς{*jp? ׳9_fsG՛%|?9G]wő?§e. >lw_xfňݗeŗAy1,_1?yLsRa>ovA$zOl~JL͖An,nrϞҢ D t/S@NJЯΠ-Z~ "d|ar X@of<0ۂNd J/  .p/-®zbX\`Pq0@Rj0>{t.^`^MB70 [QPg9~BFQ*2l+0p>iq.1K1|NL 14DF?> +~FBPJD:Ri !G$1 ˀb T&`(B-JlܧD!}8Q ձoXZmJԨ?nhɍf %Ud#*< 8' Ic$8>bmhMXqS׊1CH+u/!GE(QA82qB *)WEM"NN^ Q % $|΋J"[$N9B (+%S. hP:Ā2'w.5.I,RIJUti,Q% 38;ņ_0qP0skMSY;$[l:ޚ:Ѧª:;Sklg>^3Z3Xvp` 22hs=%=)=3?"Ab$Th:&Bͦ|맢@ 4TtAA+DQ4EUl>@qrFD)gnEq4GutGyG}G4HtHHH4ItIi4JtJJJ4KtKKK4LtLɴL.4MtMTjL4NtNNNJѴMOt^r'G-mf`4OuQQQlBGH+uZO3tf&DF%/RxǞ[Ra5VeuViL%UatX5 ^ObPU$;b4AWŪW152niEUh&z+ւ$76usY2(a@"J"J:Z [L((Y]M^h3ehUkaa!6VoU7),ep(QZ q' V !S$ `b%'7vceB$D rf @e ~ZvehJ#Oiԑ4( i/D^&hvD[.D&0^6FO~[^5bm6ntb+`v롛~QZ=sUXSYon&aA*+h/0VoswouoARF7ԉ$VZW̘tŎ!r6J:\?b0BalcE~W,FHP CŸmx1PkPskm{7|n%pv] }eBz10)!)WZ})w,@^<CGwTZQjJ&)jVY*׸A LCt8 R|v4GOb+KB2L0s7Eʅ;NlL 0W|QɗX,؃1& ۠W%j~(SG~8?{} x^&A@vivҌe%i%c yLiA쐡Gа*x -wǎ/B㒪6fUx:v}nBP'SDZvq9uLX,ɪOba1A8W7 ,m@HǞf ՇO95yv,Z!~8+^۴]iwTJ릡f)[RŊϸa oV`8cV|/}1{ئ h{wyY{I- } b֑:6 ^ ȖX2enΨw@V$K:7A! w!L XMڦo [VD:"+yRd^]oxP 6R؄9<5);a夤wgE[-_:m^](#j $nsS*iA,HbOۧbǘ 7f ~߬TD~C{v=%1,ˡ[ɇ7-X&03dZ/^ټ$,b[w2c/ L aVG~vʐ1ΣqXFB _&fBlw)hCtOPPy7A!$}6'~2w5>,0ˣJ@ 3`>FJ A:h^? }YGr>BP9$ʑ.  X-b(#cq^*B.*v{^2a~CYT@JXp3o)dj[D3e!h]F{y5wS?yuKpy{#-͟R՟\[LmER B1|&3qx -w@vJ =#9\'aK8/GP~JQ=YaiM=)\HNRVZ^bfjDQ(41l^5AI]:0y͵Mf@ֶZ& 5d"zu-NSW[_cgk4lO |&MP (p \`pp!Æ> Ê/ZX*(@8H֌e!FHnXqJhЇ Q8(j$qdhsIqp+]vz@X 2j݌5BZЍhT sFNl᧧QBr$D \j5 ( \xG੧yPr3TP.uT- 6Z>jLWl'pd*-CB"ʫo⯫E$O`(daA Ԭ^"JL ʟ$%<"iNEHI,vy#H8_ 0F(+rW[:A")#sUGJoԴ,vĝ $נo{pttD$ppLE!4C;1+QLq2TP(%2 xt&4 SseAIs:PԉT@t2MH_/aOYHs7D Ub˦6%#τ2QiX!-ІECE0jvn)F`3;w嫞\kOkKtB eӬ v@?: ՝`+Y!$ g^$l_#Q**{+q $V0u|5h $qI{VpĎF(Rl@\zO0+ML%F80.uƀ;5s[!חZ0ɖ6.Eyٶ޿ fg{ARJfsكfesrS#ťSTjVoo=CVT&m'h>)Yp^@Sf)Y:lx b HSv{l.vFlxڗUG& 4"c%PSNck ɘp -7+{o.>Cag2Y*G(kuj\ȜQ?a.$TǚV!7$3KOI VEA'K,Vs:B XXqnlD]N[-sd 4; T *"[E.*Ę' _&~HcJ5O16u ^ld,"=%ޚw$0vo:ªR> R<o@MF3$^5c^)d`0gkyٖob 4$Gԑ4Gph`R = I7 p$T8izv:w^vV%Sfϸ$k+êvDfH0\uxc;(?OI&v*?k{x`NmJWt}~-8v/[nKfΣ!Kb!~H YPحׇbhiw?r/!]f=`Gɳlí%Vx>nch +IЉ+pNɜMC#`\`N}}TaȠ 8xCq ?yChDDJ P`B ¡q !`_,P<{!$aZHU\^`abMy,j\af`GzV~ a6b!~ !D! &, 8pH,Ȥrl:ШtJZجvzxL.zn ~}OtHrIQrCniLrOpE BƱ]ûƾUEޯCɢ N H퍴K5Dנ}[{akGGdD!&DX\"B4r0͛"ЂH.J8J(0Hг[:PJmH9 J+o瞺3w[L! ;qmti^Yb;-&nP n%(rH\~u˼Yľ<.0q! 쑴l.nuy`H{$C$ m.W@d7via~RH^o~"t4]j+siw~]9qZ}J[]2N`NuWR2Gz- bXg%'GYtYu13qWUГ2N[5<5U"6yLmdWC2A(K;ܑ8Q0rct% >2 0 8A@A)oyvJ`ЙAy'9fS%f'bfuDL'E ĠaQ)B*M9Z"e4d*.&y~ʄD j$(z={#!+LmPb 89Q{iFuĸ%DJ'Pj̑+EǯZ&Ymjf髏Oyܺoo<$׏Di`ZSu!0wP)5o(׾jhֻ\б,568`O,K] 6>FIthaWBt-Nw'.5-ۉt1àATI$Јmy*iBnJ䒳uo)U-OܶXI>y ovd턛V3}!UQ+;˥Z&iwFQ`=(.'=BX8;ے}MY߽Rk׋-S,۞0-3q@ǢԘN%dIt79 uS yXSdn+H!CO$TG nv e46ů&v!DZ^) >YG? `Vr%U?3JdNa# bl8N/|C>bm$jɫkPee ɇ& ⱌcH>lcUiBq5mB:`!$ve4/H4BJT fhKU PB)Sx͕Lț(#J4"0sw0Sm 8% \ gv~mZuoh0a'..PD/V sKM[goߺ֎߮9h{i/˥\k?xyasV3+u# $r}Z|v$| @^^n:A=P Wǵ_@k W8@FOk_3km;\ux7{~leW`OճVɿ5v= mϕ k.{G;{>'mWV!^w]o w5{h-H97˛zȫv8{yVPu G~<&o(7muP*òxԖouzm^VWpm'kg&s:Gnu@ 9ɑgvn(7Dup5ހf {ǓWsiUHJIj?o٨BrewwQ9W,[i|`|vؒ]}gc{o]f閃ՓauY|;wt9Xؗ}I7&>W&(Vyiy{r$}VOVX4 ɘht~!aY8#wimY|0qY^MV yhɜcި'։yW)U~וعcٚi&Iiхq!n i`(kyoIX)^tt~WxHu!يD֓ )*imY y ZuhE&Qw2:4z[W y3fѩX*(gI}k(09hWN:PV?`Fp ~V ɜZ*~֛% n:Xpcg'Hi.)9%*zX؆`h8vWiVX7WV#h86|eщdiJSؠXڍ Xh(ɟ!Jj3IhPʦ xY~oŪergz>׬]ZXgʙHjX(}(I٩zzPe0g4WJiyY8ڏ9:PkW6ʗGtydƚj~yv몮FhW^sxz{ 'eF!zF hr%u@2-stGZĩqjtݰcb+uxUWtm F9K|xRQrȷ+XTo;q+%Fy+ZyZ#돍`*=@B=D]F}HJLNP]f+T]V}էZ\^`b=d Shj}`znpqMXv}xz|wr؂=؄]؆}؈؊،؎ْؐ٥5وWmwf=Z=Fx~LeuFb0׬ڮڰ۲ԀMm߈pn Q4n}tg ; rqنxB|sKx`g`b>d#ن變&niA^n_s~M8Ig aGFMB\И*=tpxnC 6oxJO>rܴ*2(Le>^ސcoع~p۹0nzYW˨>W݈H['!gt2- —} nVNc쒞w n酭7 :9O 8ixujМY `}ո_JO{L}~pt``(pv(`u̱̜ؒxhp./^ΉN^OlǗvxR?!\^ei{rزO!٣wŬD E ~{ w+xj yp^i OZ._DS:&X4q(rrQZ^e~`L /:\vsyB\" &*. Җ4,,#>26 AV0fj<&=J P&Bɓ%=ni's(D ]p1))0hA{\%$@sQ@B"jsFә<Щ×Hƛ0EKDCm\Či)7jUWfպkWr1;BJ5pe,Yh%]{nb68[o_"Ue Юg5gp `cσ})D0ϞA /88zu dls(W?`+Y0Vb<-bAE s@L~[*`*<(\' R`A" 4p 8BrhNH$ e0b#3TJA k.LR%lIo.< ǹ˛1% ˩ Z,dF,l'W^r(K\Ě> H!:,/Q<% D16SL2yS ?X+u:8X*0_ VpG[cuWu31VX1VqU0 T]1u@$=L8)dҲHTi3^/q =K7Xw>Ǽ.x9 DH $yPcs}'РciV 4e@r:VGЄȪ:zP0(c^/n4[Q; BV~U?-]|5>% c<}> Et)X &KbpЀ@,t dJ) 3DKv$,S)Gd)9Ħ1wRXՐ% ,DdegxE]rrZeEaj* (0"Ȁth,8! (\b0bDH<+XXRSrVs8 0'X99@/ŕ+迨U@_\HK2^0ҪS2 Pa1z'|UJx3E*H)eʢKKIfe0|@nj ЀD K ah 6`*t+_ v~(DX4~$4f/]d[b_3m 믚kvqZ] ElQY2txPHM$^oW&׮݌RBi̒NBE1:1` b 08 *n1ɮu3&ֆ6)8!( 3  Yׂ` K t Wn gxtI̊!>-x%^%/đ&!Dz6@~dϜIv ~Y3 = xK 瞎~a#ЧЂHe04~. Lkg'栉L5/Xvr]YWٛ2ʽ{+YNHY "AR9lg= @|;:Jz&JRGnpYL4TAF#?Q1/9^"#$P"hAʺ O`[6`q6Kݱ {ʵ{7cޜL1K $&ŧ4`ݷuЛJ=%e)tX29(f{y-ǡn9<>3?LBpR6'=@ @4A=UE{n@sn)A"B3BGGD@'_-x2~ wXȅ*<$oMn@Fq4GutG M_R41 m"-:|/^`Kk福xKکsr R? Cd.5}+PUڪB$`z<A l6l,$EUD1V$-%ޜ 8`T;={?_m߰ HGy/ ȹ4fk-M[K3}:ud; m$^"vXT(ԸۤӶǃ%%Y[\YB@lM-{/7b2Oޅ.F6ZLV[GnYTxq#{fD (21<56_v?T@õe9icNήw{U ByBO(5ϪΖw;;twRk*C%V>Λ=`'oE4W V +1VQBMCS6} Sud8 Þ]Aܽ=ś>=)rTݶ^Cg^<ݮ;ɫA?֤06 'm wC^lKG +]71 j=}^|z$0`7.UHBI-Mq֤I6){6ڶoέ{H@].uƏ#5ΟC'!:‹:NvϣO~ÏNZܻ";˷Yj`1{RXorءePZ}Xi!3Q`@;aNCƭq QsA1_}WoqI{rAܖgMWRluUd-p!K>7G'8S_b `"3 c9 M˒l;n^MfFlInM!Hy!.LOw@X軩.-88kSEZG5 ٌ~M3ڐaY 9ρF 9'"L@!Ta:jT`1)4 y@}#4 h{Q\'_HQ{=@!{^Wt#$1!F;DyY@8"VAUlͩ蕦`Gf@놡h4/U.,7wd>E<-0IP& 4ngAMFR;1DO(%63A}&4%Me+J9Pn{3GBΙ.ՆBe@2R9sLM>!s~(DfP-͔Į|28-r#pS;mEM"_Qx@".k&7r\]<㢕~m*7I#y咷cΦPhIt~lu2G1\Y! d# Lo$n: N q>nDJIiⶻUmm'OۧPO2QQ0̃Hg3w5&sO^JY`ZH@Wۺ$Fh^K9E/Is-ĜDJ;vyN7pQJDƣ_ Y^` Oj   ٔq,/! za 8!HI2ͮ ؅Ga0H 6 GH b$J$Ό=Pa!r!"D&(b))b*'b|b(+,b--b..b//c0 0c11"c2*22c3:3@4."^*j /ܠ1s,eŃH <Y#5cxc4ڸ47c@6? A.?li#~V [.ul7<%TcUZ&\%K5 kduS[QOC_9cʤ9&fNcBXHLveC2\i MuqOi %u ~5ΛmEU}R5NxV,\e^z"I-K(~<"_Ix^aIz&R \V^*, -C ɡ|R&M(^pX@yDч61=f]EA%X4^r7 M%{v$%u_Q|fMR7@)K5N4&Q()ŕ.iF.5ٜ HUihq(QUΥTaIZgjg WqTUUC10mBꊸ"Ai7%j*:ujhyVI[ APC~ب~n-u\˽CAl+Є֚A,dqiwr鋢Me",zQ] J ih灋3qkHô-h֧ϒہnV*hb!*&(fpu\lh,r%׮z`ZA[ipdGlVdRm *.\Bf&".:i,hjN&f7/՝FގdUz@ŠP`ҌWrhڄX]@[])iNyGѭ% ɤ~m.^#&ܼ[/ "D,mRf[ZšQ^/P6ZK5i6 1sj_-|%@,mCBgugŏ`.:4qQ8ȪL|&N 1˄q!eѪ/Z!OʨŤP,NT1}Z!P . `ȣWa`*/?f&G?f=srEqQ!.8)P2&nj/Z %ㄻ2+Q`Cbo\ &w11 #p!0S _2#s66Gt`!D Us9Xa6k|0⋜ɯ=::s1s?#GDtHpA#qtB3tC;CCtDKDStE[EctFkFstG{GtHHtIItJJtKKtLLtMMtNNtOOuP PuQQ#uR+R3uS;SCuTKTSuU[UcuVkVsuW{WuXXuYYuZ{J! ,;'dihlp| Nu] ]B7lRĤrl:_4N/§\hEEHH-\*h'Ca T=$Xk/F z#&b2%Osuwy$WW^"|1"70%;#%Sl^; ki, wqOiʷw 0*&ؔE$\05ONaw̗ذBsX$0DcPعb^=Xc[]9ԜD1mg 0;AA3%a' xqTTG\D'O(Qփ{Vq5!VFD[JlKKoR鹔+b,]2ȸĿpEu! WF%!wbrG^ #yav뢸Jܱ\>#6=.!='֐oaSX-]_.(HYav`g\ @0r6FAPi\| c_X`I_# Fzԡx.SR"  7 ,s?2W stVb/AK{G"ZzO)@! H{q]5l"ccy`a; XYN0~80kf_ # $\>')e'R:EĝD`2  qQ)!j8B8f&j+MzD^\dݝ acVSUPA.eKz]4¬*zBv6-h%u!fOXf/08)aۛ@j(+q*춯̡*rNje`n_'@҇#AN6c=&/ӭ`md3^D?i*^3 mY@7$hI]ph'LU x~maz !Er .C$0#/ Z{hQI 䛦">|!AZ>i$JA(?%4P<089H"L -G=ك#"MOF5̋@o.I +9tsTgAt`-Z7#Pt*:A*7.YzȢ. ~:D`4⁦*-Z( 4j`)h`DVS*aHmN+T4PJJB `Uu'Bx#^dsr,!ld'z6 թgњop` N$ >;lgw+=ArޞKq_2U|KMaC!,'.em(ve>tmx|p ,$ &"D,JdӬa.$J$pU vp2|NAqU/ PS RZej Xk&y6S7.1{*JSYYI>oM½+*Z ) %#٠_T ׌*oQ *\H'~k@4*]6PzbU(mİKDJ3GR*'G\&I$Jh(˧PBxd$yY*4HܦU<*z㖉?){lG ÈL6yLj޿h6P4NϠSYFi3gQmWoR|94` ڬ&)"BSACȒGM-KK4RA 0!xZ08'\"\N*ڣhqEf {! , 'dihlQx|F!Ȥrl:ШtJZKehX.xL.htn|N".@,Sn[1V``/J  F 1q mE5$wy{NZ7tY[]69_=3F 0sD;t dÇd  )jqN:S2vDV  F\rJB T"%2/bδƦϟ@uxAbA}BIJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ $Sf$ $Ƃ 00 Ù4 0:`uШZpB~UٸɮnZb| +. %n"tXμUk  |T UX?<mSG ~"Y ߁*oݱ6ԋ % 68f1 ~4Hb@=&CMa :h!ً@SLC( gZܓPbPF! :zTS dihlp)tix|矀*蠄rsL$XW^3QA%!PSp8ZVA *s*Kp:6_&hf;к@ff8(YG*.x]bw#>:jmV#owʴ*,Wlgw ,$l(,F 9_t`9,7\xɍM޲&bv F}31džR~LPeB+PR4-p`\M(1;! ruXz}**4Bcd%>ɑKl-yz};jA8iz`K!Ṛ07zAH;a>|&y۰(5 dž}sKD~@kHc::~hIcIJQ1 #baS4K'H Z̠7z GHq dlA, 1[x3ZUi`r#$U ?R&p,yI _C0BbjûL9RE0-&T/UK3@$ȁ-IbL2f:Ќ4IjZJ[(e1 [\C:ZR_ ;CqGT~JOol -*y*y!M>⌅ت7P5б|WlOH؅鯡A[, M'ĨUŵ$bBgDjn=eHSD,R[&frO7mv7 Ku.aJ )H(*P԰4L$鮪b?ԯ[Xֶp\J׺xͫ^׾la{p6~6Jv.ȅxʩXSzQ O?Ш고]K"VMhjTôvgڏh[m0: j! -Ғ:w#WrE&+ɡ6^)W۷{TM6X~뼨ZFMI+׿N;'L [ΰ1bp= k7(j8 衝\JiN tq(ՁV_T6>%Z$P+dhhXoݻ0TRx2LtjH͒s5L/^{$yh%/Bs,:3z*IiY`]LJ g:"sSumҜ =^xn_H.+ըn,ܾ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8XxPF޵؍ޘV8Xx蘎긎؎8Xx쨍gy ď ِS{!cF`vb$iò(*,i0ؑ9W[Ζ! v03@"$VddᨔC9X3)/l=iE`Wb2P4.N{-%Yy-jlِ/^ >&5jmc4%?ėLKM9c4`َvg[vivDV6$fٖhBci'b}45Z'YNgx6Is6!"p?$D)i#7&Id9ۈyؙIyxE=G7~fa`Y}.prw[(hxT`M& Z܉9#CƠנ($H?ӓJ))*:8:UjH3PM4WsU.0y8:J z JOԳy xT]9u=8ӕ+\N #Ϲze1Z}o|Q"-@5:7pr:=j5ez 7ZV$ԓ3JTM Jt)0^9w+PJJJi$lڦs:uZY{E6S i6p: @i(૫s(Z<6^: yDڦڭڪhRÚJqKꚵc%L1f|,C Ud{j ^E{Op M,PZ ۰ JY:觻wˀ<I&:qRt }iHtnjh :ۖ:"ZFn#=y,HL{ѫ٬]Ȳ 0{gd[)ٳIњ1sD )UvKXp_8jKvtDGQw?UAb k~w#]㇩㈱yI1z)Q-zc1d c#ǗF~9~g]Of7Kۙۼ΋+:l!G[>CO ޛp F+Z*?9`!%:@VaGa ʻxϻˎyYy'ܨ l@hf ,ڐ (=H;l*[4!HdOZADH!:nŷFPq:ÂlFŪ@Q"|U1*^k[@ǐ%f&z5(b mv"^̈́t0-FD-:.*tP3RN|o 3m*yc_ε%7>4 RBp҉f N+KoSNZ,N]_˔-!bE\"  _+!! , 'dihlW,_gT]pH,/b`ШtJZجvzXc<.C;|8W@ICz~ya77h^4|%pa 1  ̏a3 m[ 43* 2CbߣR$ߧ$ \xC.(`HŋPIumƅ4Rɓ(?4X,AJ{ $|IMsfr1xTIQKHugb8 APʵn CB]`5 bԉжݻF QAErFЊk<(̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻos]$! +m(A!#) qp/,PN>vL:GH O'A7R}YLPh$ӂV&7(!Lᆑq@ASXaP2iቌ71j(XW54]P7W Hd?#T!IF$(m@GJ\v`)dihlp)tixAD@'\z@:HmtpGSLP7F*Ȅ=v@ܵa?8ʓ^0On8:?mpé个9t f[[*QbL ܉[LJ;NeC7 PC M 9&A<H.b*L|/]nB.\Y GЅd1@Ȯr!<29yj/ǸpĿ˾秣 /S'qX,YhHTc\C%t*VE!JnWHp-tmx|߀.n'.ф07C]_()Txb~Q+Ao.'4 hjª&*QPqn1.,t7Pc 6(-oo>W hm:TbR }=F"҉-fN&!MVy ] ,B:[QgQZRAs EK. v0 gH8̡w@ H"A8m]Hr<8!%Jg:  :UIQyۡ#i͔`,ʖB<5S5'#%ώwO8U1Yd 6rYʨHL\PT2@>ђR}T$aY-JbTmF)t>ZgI( @Зס!4Le0-b$2w"B^il΢(M 8IrL:vyRH[mB R  _d#"tAt5PPb!%vrP='Tْ8ʪi#tIgn0ӻZ"cYMf)@6ծ `KMb:d';mhݹXhe (-X"$=k1\eV8 e- \P.cHu.s{x֑*-l16&"Eaf¡Hùi Dnavr3C).ܵ eY4mAGG^GyKRl 0 ,@zcLj`0ը,bY*6*K&,@$gL8αw@teˬzn#]D*cC|B D%6 #r]tL.t oăER z8\INd0K4#"wP6R\s ]ZA*~ ʺ(PY h΃eQ0]+*ЎMj[ζn{ඈqb0T+iSdөNSonx9#s;t4L Y>)VI`AO*oZq,LˢH pG˴Z$hYQׯ7'<2Q?k}qBq8^i*и [NUF.-o0s]Dƛ^ H) ч657OO_ :;Ωy9J1~ .Nk[B/BzU $mon,Uq_It3\#CYc/"ǕZhUz15/cu,&zȉX{ď`_/j;;M a•!PwZ(vbAqY1 VJ؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8XxWՏԎYyM OOG6yА۵9d0T g&w*gR6e堑2ɐ8#z fE(e9+9Cyt JFq19LY58k7uGQvPfD\VSGДb-_T ^=$5R0rYeiTW\cqspH}VsY3c=u{Js[`h1hi#>tFA6ԕITge~i[AvfEiqw piD)8v.gaYusy=[q EV$H.τ!,'.emاlp,tmxGDSAD\H*ʃ@l:dPL&Qp< JxL.h^Ah DB2␘|~79I np" OieWZr[",7"IygMyzPD   M z&ɺMЉDӿZ#nA&N@MbA2[Ȱ!Ej }XQ="p6DSl1 6i*ltIZ`+DFkk)HJACz(AϚu5DyY(W)躶L@wq_ջpke)a,qP6%y &w̃2%HY(owYD ,P2ʄh1\FP,͵FvYƫC ׼2JJ`-dmhlp-tmx筷,2ox 5 ]b/Ifxۘ8MN9uM2F*)֞')~-`{ei+o en(s;rkw3wֺ `aSXiLxAn@kwvKCfqcKZ5Gθ;^)k^"EJ{ǼOB`ZB Z̠7z GH(L WC E`@d/q-|\ivu IB\r0-)G";XyDD(D凸.7D":Ena""̚j!2%V|<۹ц Cc%c9V.$YyαBb(|5G"H=:RBL& mi:i4I5P|„51+e_" 6OW,e^ 0IbL2f:Ќf00A\8\)ͬkLwii&W w]BDB%Թ \3:V&"vN̓YO;KmV@ @ o[0T+0%#L.|"4\Dy*Ԁo3"kx)UŚT'ip@{/V {$T&r\hjTT4yfAΫa{23+ԪSNU ib OP)Rxͫ^׾ `KMbGBWeU DE xm1y(-=> blٙp.dam 壐H5R-Q+>K$G }+ner̋7֒xh-J"}5_.ulGaPM^c1[KJVTȔ4RjĽ W#cdE)x>.1jВ.8׆T ZGL(NW02ͯ&`vF4v9'ZU)?qZ4+qRYp?cDxu 1/KL $/+WQw*6 = t+E3@Uo(u9g:9@h^JWZy/ NnЗH=oK+[X_CȮKSi#[a5\2jI[ζn{Mr{B+0 1>,;qȭ(|%`Zޡ`灩-d5F55 {GlDYNB )>D¡|$ΣKwEF}nUa>T ̂虇"p:1V<-]]DUzA&駇x r˟ɋ[ٴs۠Yafᴎ0爯G%29R-^8Y9$i7ј8OK^ξ`^ǵ=٭}`rgtal^0wqQӆa8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8I8Xkh9M0/{ِYI(?v8Xrj?V 9(do*y^:R2i#)(pD+ٓdv52!T1FI#~r,'P< O1yV5y(k9SE<qjQqfIYigD#Q1 Q!$Rgii(}瓂9 Rd yh׷Q]98qy{i=_l9 ()lzD9S1~V-!PUy!>_ dѵ%yƉb tvP0W@6vÃzA]y(V*8)\x&虞8 ɜh̨ɟ Xz߰xu!C<֛_c4t-~C[.>FwoLq-c"dhRNԩ7@!SzU6}N=9{D}$uEOJ7X{~*bd;7~INkJ&EBj =)2oS/7g$u+ pءҗiO*o*yh !~7t7izi3P iutZ R'" 8 K9RIGGBoWAvT{z?0zL9ęhF&4撱0[%fZMnuI9Gj!! ,6'uecHE=_]DapH,Ȥrl:i:]@Ĵ2STk<&at׸|NCcϏ;:*[bd_)f6l&xJ#v c 'c-~N et+'˴#6u%^ )"u# jq#fwmT$`S@)R c,(`DVE BE3S!Cĝ )4@6X#A)0c6sk` AHQy-eI1:oP(cg#M4ʵxA Vc:6赮]$ٔ@[BFGʌ.0Tw#Kq)[ vD`1o5,Do'ɨ.INp2!,'.em}p,tmx|oi]2$q!\(rR (̘°xL.:M"EK8JHhg~|n+oIG"^EW m+w-) nz1zS* _D"؈wx sۤ& ݢ`7k&ЩO)D _Zb zX2 + \T$ CcŇI6Bț8ԬI %=vT'Sź#(Uڬ9J tiӧ>_&z)TJ,= QR0c%Mfꍱb쎈PUC=dAna !, pH,Ȥrl: b<,!b<ϰxL.4CHzNb@2<x ]YlT j TqXTXTXSWtչJ蘿YҨY:ys ˂ "kQHqL *jȱsMA6zSڑ`\ʜI^< |%Q]ʴG&U቎A#8er@xKReK]Ό+W%uK 4#F̸c"dM1h,7SX6;G؀abvέcˆBʹly4qO,hZހmې{AKxZ*_u_t0.yyb9c0periB&*ey)Uk,l' 7G,Wl H$Z(b,rl6O۾0[e'wiU.E<7fR3v fHS6BəeARCH^yMwNeBj%`ia0[ /M&Ҋ{.S&cuPކG$r [q)Ǖؑodٔ$mv 0%9m^oAo'7G/Wogw/8 "vm ;>~3i~'3TžiKx_ 0Aۘ'g)s3i&A N- T6d,qj?6aQV@􁊄DuU8d p|]U8Q|]U9iJO^U,FT3bW;neS‰JFQ|i/|,vz> IBL"F:򑐌$',`]@Ic#%s$( >%,˴ bfXb;k5wnJ"@Ɂ]u!"+Q!9f8eJزVL4դKgK p3t8\AKKL@%)9kiw$us (9`BBb~SJb P3$c{ &1Lv3%&p} !Eˈ$ -@*ՂP@ PJԢHMRԦ:PTJJoG]l9HUmzt!oR:[4FhI'nmXiKyva$jbWNɌ7XNPՀE}簕EjanV?gh QQJW 0an=ЬjN,U~U`[L:)+)`=.x*'\f-,+BB?f2!Mz|Kͯ~ҫ񺩈C7!;lQ[uzDh.'a3"㶗!lÊ L4)W: A4EorC1Dsťȱ^q DuQm#,*y+s5ZBwD6^mZ Jn0K/4gɼQƷ:f洪WVհgMZָεwRY7^qaP)pJZqQZݡY9G4%`u%0ptP23sPEc-DMVt qykț NbRP:y BRB'cȞ_Wy Q: B(<)oPE ⚑KѺiC|>}?rOy;np.}|l[{κa9N%sYkϭFb.Nl~˧M[H <9OOv7i>l͆,h,f(C3w[!n&yyAn@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yy٘9Yyٙ䇙9CY 8`$1f,9yf/fk9bI&}BIyq5d2Y3rٙi xaY["yDى(FR4bck&yMс/{Tdyq0>#Y(dJi!C /gݑ)$?7j*9e6 5zeơ12YuqgE@W*2Z7/(: y7rwAJpF:[,פPiu ۥ ؂R8"^z4 ÷/bUSҦGPbz0ŧ駧j٨Z::PکBz5>Fq.dUy+'35us$Qa\*! ϕsjf T#whmХgwb ʅRZ&̚Y"!lE Hn!xQ:e4b7!< x :8(f!eT갤Yoo"d/%+M*;imׂ(PN!fXG w$k[nIzRvw#=X-frbF;I+Lm7qWYNe誤X 37Q$l8!@oO@IbɅ-!@هiZ} tO`$fB1chi'wx jE! , >'dihlptY6ϋT]!F,ȤrYt IZجv΢#Hۡn߱MV~Ϸz  ;33$});r)^_CF : e72Ɩ 77 jծ@X7 3'nH`dK H)vEh8+ŏDI$^hА@0MM*Ã*݄9УH_` FgFLJXʵҀ(T2Z\--pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k+F9nmCGѨ8GJR֬? c&Hsg](&2ē,7G=96Hu9g/=p L2Јf'nol]X[p?; dhotÂ8Df ?7܅JD AcK+1@ ( B"Ndd7 8?Վ4r( 6&GV&$ea.`=Q\v`)dihlp)tiXiZJ:I,IWmv@10Cp)%dAoQJC5r*wحʪZ (-90V_}2f|UZJ雲˂"|QT(>fzT(.%n'B V;T.5*MI&9XIck;5yV=uR(Wlgw ,$l(x:NpO !,# h`y,Ul6[ }9sS4\t7KK+#Q969X^(@57lB [͍U$}o@D`6X'؄/!31K "*f}=NL2蓗?|FrZ&٫N)pt27fbT`CD!R@ `X+N^|<0w/o觯gRB< X4GlRUƠ=Xj<0x _b0 %MQW5liE-nы (ƦdL&ðw -M087L7ڙQR]uFT(U;Kbq#+sOl@xus]tq 8&4l)F3޸aQqc L"F:򑐌$'IJZ̤dfw9he"Q 2cl4 0Q$Ґń"8A`.4M$ce034HEXQsAycPW./a rԮAa4y8Hn^;3L6"^Mr,b(OԠ)qРŁsGE|̦LpN]l9o) Xs/*"C3֚Ğ(h)1Mq*(:E|I$O5m%v04䩱jbJ驾cVdI8JVzTAO!R$rz xKMz^Ȫ8005wzɔޭXѴ{ҧbe9uE 'tB䶿H̥v[pYB>}DNխ,EOw(m'tl<Г\;c .I͠#AmG%Br'zSlEm bƾS]"Bj)|6pL:xγLHUZp })LSk3U{v@TZY;j>Vj X&Wnff;!+.:L$Mh SWraNByNtG H:d0>{MrNnZ߸Bf"^Y&ʾ̷Jl5ѓ͚-L 6'4Fk+$Šq$Osg!Uw*ѯA\1E[ᒌo7/t xpǨm#U;îVGx&@Tu{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃> x344@_oNNQd0D8_s,oT\"Ff(3he3fd=džU`'7pA !@2G}(pE=qUX %W`8h4>6LqE%vdM#M%#4MxQu#@SJF޴v2>~Cr{#(1"YSCNr=87&6NbpObOi$=s:xRHZR$&0eCݳ[MP7(Lߘo=׎(pi@Ds vr`5ؘCtwhtr$m;F6EVuIRet/tG"GAR tS=3UStSunV]]`H?yHJ!r=!!,6'.emlT]Cfn"_pH,Ȥrla2P0eUai(M$Wk&"nk~{n5qs-9W*V+4 " l+n*4.@*A*%\T]"-I^e\ մ*+U) " "ץ%r0ABt:gŋE>hZ8x$h M4aR-?Lģ2UG0i1#r&I& m .4ֻx4ʁB~tF()+*^K2%JG}."x-JDm(װa=j i,,_S`lbK}|a5{ *ܠGEH!L5}nl92 í$Bx E+MrF2EՁ蝰 ~/l Y"!, 'dihl뾢''וɞSpH,BRPШtJZجvz&;4fng!~z8688X8 de (6^2ʙ2͇qYJ v0Ф:kDb; N2UA*Ѿ^4XxǶ3jQ5c;DM\0-\8 @ eUW &Ef5*-JSjՖ s\͔׵ٳQ$ZY۷x˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨSfvuD4^-:X:v\4.>|$J5j2w6;fY(C2QuMB }mk~,Μ߀yI%# [ATsyr3mؐtfAğxlŠ(T$Q-^SL31@ {aQJ_UO g ,JD]6Xnihlp)tix|矀*蠄j衏L/V"ji98!ϔFHE\jjJ,rV:*'O?A);E.(V@$%Ph\ ~ kP+tnJr"đ FB FKABH][5b$5Xxـ=7PG-TWmXg\w`-dmXXEЁί5lڀԽW:cwωgtvtB~jVR(Z0Z%4uv^~Jl˃y,ZONI ̠g|tzxy~A,2"܈ Nٰs{7~C*6DsܽM"|zFUͩKu^d?h'H Z̠7z GH(L G)Q.ۅhԨm^+ 0$mpQsgb9GUDDh!i$W"\/T=btVZJJnq@FHyhаnymL w2$@2<(jB0D "G^$9'M4Y%S0ܬh%`*X wNR6T#aY=~h`yEe H!i`ew⢍iU4Hr";4v~Ednt$3Α4)UMK&$7aBT3)Aq$>Z52Ef,*/'{`-Ӳ i9[9*R-v2J^+B xQ.KҚMjWֺlgK+h|;7|nWla p QCH^x. oCJ/I%>y/~7/==x9 6-፩)0]VIǐ}Kq/ җaoP7u|`DڭO+\a8s%-b=1o[%I\?ܟҁn$s@HN&;PL*[X A# RYF#a-%%g a^oF0zY;HsB\ G3'r>N5(y^7Z-@'@ t@L.CAV=|={hFW>7U-űg!cqi[y@U^:{LM"w-B{7ZTO:ߩXX1T ~WıedzXLʓ K^엃8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8XxxjlexȘXȌ`Gl_RoxҘh"{\m k|wAtٸw7gV xrp{xN׸6DU4ip$@xf 8yE9(a^pg QgoydI&Ӵgx y.IU0%W'h6zh"r>)q]z͡L)ZKa%qa!}zCPj)J &g<M`*SWs%JjH{Yjs*z#G*9R@p c~Yӫ%< WzNJBWHz7Z lZ|[~ C|ʇpzVm\ $=Xë:: ڰ~U յ\z&+S :Z}kz+&4AY;{}$`=L4#AS+˲IP'wFL@UCgMO1%WQ_Hz')~S~N9n*)JQYmGBķ}۲;I[k~[랠;w8P> ! Ŷ6=/Z~)ЅFpa0D:~ѐF[At&)W7``rJ XTx5PpGw+EIHKBTqSw{\g%߄ e264<{I̮~I~˘S+)!7RL>=1Gk~a~k$,ckĉƩw{P? %uv!!&, 8@pH,Ȥrl:ШtJZجvzxL.zn|N~ H*\ȰÇ#JHŋ3jȱǏ Cfɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJ] ‚ Sjʵׯ`V̱Xͪ]˶۷,Z%ښF˷߿=)Wo`+^̸qs#Y]ig|ϠCS@)m ynf+ A2ӟUͻwN*G 5o>x NBn%gt|O>nPf˚khm>/ϿAs 8sm-0Dar1OٹvWAi4[pwdPq0sxh8f% ^;X1 {*>`MJ(߀t-xQ7J$|4J@dW}lāUD:xRJ /yVҕQY݀e}c2#Z{w&fymq>zI!}hedHթ &i[櫰I|7jhN^~ fs{`Rقƪ(i&kۣbIkzbbi(RhK(Myn خk28p [rp 6]"JIuZ`m,~l*sj9nBft8u*^w] 4cxL<ʲŒDr6 0.%2a9]J|LsF|.|pGY7صX1rVu9s*[q̓ N_Rgۖs ޠV%gyEi耗nzgd--@m컊.ɥjL^>{9iްܯ(ny3޸k_B>ƧnXN>VK+go?K*>t&Fw C1_1wT',wnz7!Ą(2aOUAH6pT|ݽ؈1gւX)ҭiDMfݭ'TL y^gvlmvU&hJfSE4o_(6:ZڰHx{ 5E"r/9_bN1^1eL@ Sҍ\" Ӑ) 53Ecf򘊊"@O.z>)DӛLZ:Vf3,ꘁ)(lsq`"RB$d>*BTDj@ә$ tHBЈNF;рP<Uδ7i9HtDЏNWVհN38MZָεw^MbSw2z dME0vp֎B@ Yn{8Ϸ`!:η~3.fZz1B_ۘINoZK ,M P|} .2!` gjno;2ΟvfV1 p+cfBr$κַ[`|; n}p}o`q;=%} kuLU@|WsC snobډPHA@z0Bpu{gg/:9p]o2@k@]oˁ_h;Y;hK; p9mwhvX;~>qPGxfj{f~8Huffn4PIڻh殱qEТ+U[k7vmЫqYlx T˯ۺ:fqIxꖻ[f|P+˽ \|И,"|`$z5Hċ?NPˇJ|XgL,\^`byKm{rJw#O+ |IF&nd%\3{d!-W~XuQXz)g.[.0čNbi v Pz쫍qZŞ\ r)}} Ff/#>ڨ{*| J\j֙)}Ii=j㛗Yf7̲TNt)cI]ٛN }* MJėk0_p7_XfgHyהސIh6m gƌXA*2-ӗn_fQ-Kp'} ߉p*Nn+My|_kWX. ?Pw^u2^^ !*oOu_f4;_hfԶJ=l6<^O򈔁xn3kίSP>*vK?->aYX>Ԩ &X4ItCQZ^Y~a\6iݖ K@WY?HK҈IRG+ C<8)RYi'qU]yU (uRXJ&غaem|ViVXxFloUq-ڀ6+-UMfy4W}aXW 6܃NXᅽH߇ɠ -9&IQNYe]-aYio^YyY"ܴX衉.裑NZ饙n駡Zꩩ꫱Z뭹[.쳳NAn[鮛mN[o[YsEO\-!qr|A_ģCQOn/o5}WC^VjsW F?],UO}_4ʰW`QUg]=D !@_}5?meci`(BeA>(Ek1OBvs'̓cU_zU&^PD1͋%񈼌P=R$2hQ 1 -}J$k0CbUn BCDD( & 1RKDN)9dɒc<.ij= E"_q,c`TjhbBR}PVX`V#f 'uҐ :jr$ ;@2o.(3e=(E?*I!ުεEBSDѵ2A#R#)FN%U΍PbSıfP4G,'D y:1K!!$("C "`R*@J(1%9\%W`5U`0AFP%A& G47/SLv% '93'FO.Kh+3˰;Ot`0i17-2Mk2)S -Sw`=eN>9B[q8>Ue!dzH]i8o6Md#gf*& fj_hY [AdvHkva!$iAg\]0zu^鏶Eewp pTe92 3oIZA,.ejqϑBC,wF!Asji/#Uq 5L<7Fw=Ha(1t ܖsVu[r@C$7K/bzk${Y?~: JXwD05pw~WpXp>&ηy;0:(#( xuAnƂé,4Zb@d^0a&x;*ym%z+nmO4F4;9@48CNC.d~vq0 0~7xG~8Z  #A+F$tװAGXĆE(XsEO0fx=s=sZxq5JOa!C^'sncv/a㓂6Y%o$ F qC:u.˴[FyNXX9y, }hA186P-qYt9VnuP`L xӛYYA^+Q. Ԝy+@b?9$A$_4 M8kаBc{uJl%]-mܼ㵆b(7`uʕe_E/mkwzzz)@\$z9n@nZhJŚ+x--7[ g9^=9`ɫQ/%KQ/ :!] _1c#Lu{n.A'w(#e<+yX:{|z}Z]}k熌>f;B.%{ØN<xjs*Wx[lx6ı2L;PKT hb. :[BSx~y3~7+S [ҹ?7R]397Zb{U{Sw3<>A6ڶ!\ĥ+6S?\F!Q+7!R"[\_XM#(g<?)@{Rl鞰RiNmb(Ѣ'bt)S^*u*ժVb 'PDs,ٲfϢsHϦn+Nv!͛ ؾ~|*O)6-ƎC A!&άy3Ξ?-:ȦONv2_Î-{6ڶoέ{7޾.|8Ə#O|9ΟC.}:֯G m;޿/~<ϣ/;Ï/_ϯ?XQ`[EנBwg n "r8GHKQ|(PD3Sb7;cvH,`6bѕD(D0`Dc V 1Y$`EJYAGRbS!^wrB 4z!% FŊX裤RZzA6g:I5PjʌBğ &jA*\% tztDjF [iPD-&zF!4-ul7V@~ _"zn2D^AM.Α"Y ۶!A0g0t&r;juP2@1Ja3m˜fB2Pa&TJn2 5[ Drrݵ[e$N C gS:ˋ 7%ܐ,H!p݆b4#<"UN8 C1s!ÌA 2/siZ`$ ^35'̘tX|0/c\r4; Tfn@\"[Zݾz]P}@݁7ADhc`6l{H < E ( (m tX$L`@H/p@xiFL8ңG:H 4<%jf@v ]b6-LoP*83# Ato|xԣx+,[8A|(yx B)EC$H/7eU@v;Ickђw $ ].EO^RoT)5JE!"X2rSl^T0]R0#/.C b.brbnEÛ/'o&WE8whaX36 &e5^4d\9\ [/md5LӢ,;;ъmyG2QsAf ʹ &OM% ӄW2}Sd$b 'h,*m^)][MJSUZδ pA쉀04` (_#+dzŦGRJׇKz=4ٺ.Ձ$ʼnڠҹb6C(,6PQuW4*n5qq5mr10`Ep8s6]< jD1X8:Еu$RLY&+{۠-:2@ނ.mcQM(%+]BY3 %_*} jA:L |2U'|6]ZPw0 30Shc <ֳ>]J*F3L*wźx" d22e/JcH&0@JKv4$Qc^h0gyB+&T;Yl:e[d ĕ%QcvZDmv[yV}AG9ierMROA8sn@ `R2+(4-2utJJ# <[p5kM\h8 ]:RÏ $j0mǽ]@ZP%;goÈpV吾q1K%L3nm%ty`"Ai(ÄΩVd-]ȓ3Q+D>*=WۄgH P3{779u[+O]$C<ʘvRGh5iIjݵq_v P!3mW߉>*ހGT'$8g{=!pCxӈ@[5<.6@Vhgd(V\N$-KU\5#%=y`*QsF$N8ۍC=2 0yEif:\ғI.ʌIR؍N~)=` 2*M9 cYa?1!^DjЛyثfT^Yy*}i&P20quRrasQXfW xrfM4ƫE/Z6[#9cFJWz&gZnwx0EL+Oe/4p;dYpZHΩc!Hz_,FY\\ԆZ)\q6g%qzGuIb6ryj݄[ ݁ʲ+*[~a3׈gBxxN3I8sVW]2k剗 dhQ"z; Mxr/ݓrqvtN"No9㍜.Bz׺#0ϧh#)5Q*Q8FooPNZb!2ю>%TGG: $IgҖ&.?VtLT 5NPoDHMRԦ:5^TJժZXͪVծz` XJֲhMZֶp\JW>xͫ^ `KMb:m.@Zͬf7z hGKҚMjW֒lgKͭnw pK\NֵMr:Ѝra[Zͮv:6,xRlznҍ|Ky=^ WuLu߽@xի`׺Ƞ$x]a <ٯ`9XkI` Ŗp_ 0gͯwo% 8Ea5p0fX361$d9ʂ1-z9Z5͹3ySVƊ5q#9?џ^犝:)VIW,Tz4o% ``vl=/~ ̅,k}kq xpp ^f 68Uw~OP%() gCyvp|FfU^Ń3VpykWG{L؄Ne{{1~?|TsVXXp=8;h5xNu8w`>xe~&bqXf`Ň~hilȂ熄K' Xn +w~؆EсWY؅QAXD(gȉ}{jXtoUgzqEb4Hv,Fwhxyxq67s6{̇ GX؇J{oCzPxؘڨ(X[Ervhvͨ|7sWoft?&ȏ["&YXLF/Xf~ً؊^އHXXkwulWtG(a vh}|ק[׌ȋ\fPxM ; dVyXykRp:4U^&'X3ڇxUIn}-8iߘ7ɶ'~LI|JBY)pi}7[9U^y`a+|62Y)tXdaIk's)rX`YG -tǓw2b'JCYm٘eyc9yi_[:)R WwƖw͹NtXx~3yXFl޷8퉑șk[)IX]6書'9wYY `t~š &y9yڛ*yepZX62ʂ(#9e9׎=:h[4gyHȵם9IEYOZemTjX[X~zw' Y㙉h k֦b8(1#fe`-IhYY0Z'ƙ5wLg 1 X?n'p\uV8j e#@B=D]F}HJLNPվT]V}XZ\^`b=d]f}hjlnp]գ)t]v}׎z|~׀؂=؄ s׈؊؎ؐ ݍ]ٖ}ٜ٘ٚm٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۰m[}ڂU۵Mi['۴e*[&jVj5&u ʽЭ֟=ېpY8^ܽ=- Ivc5޷]ެ۸[F nfr͔>^~l=ݯ¬j]- E`XkM-ˆlĆz%tvP"Gr'>@䜭]tܠ4ndw{,O>me[;MgPxAfړyy:|; ̈|~-z|~Dڙ =V9]]W=XXZ^~qK:"etˇU]V.&Il %13sJJ'DHʾ.ړdrNi)^a|ދwg p uV Z~!HĶ]''gm{9zu$i^ڻXt u}Uʎl Јy~"?$_6曌 𯍫rPY67u:˻$DhR^>&GwGw>w4iu=Z8KɘIO&?t_v(V `;`n x_t)D3kIW ߋ͙OW_}ba:ڤhɰҹ~yڮg?Ϟ0OV l١H ۊ3Y޻u?<z?_<{d aq<΅b>= 4^Y~a\6ivq5`y3}N.2.0 . +-/13/!4ACEGGRUW$=0.4dYY..$6 ^Wy[An1I1+.X 4="3/ !oYSkl=hbmU@2*?QȂf &Gv}]˟xwۺ^OEV}{)r AXy~@1LX\U4)>;ƹB<,8륖䂂tM^ /́`QZ(· k@ 4p5/ x%4̉ӡƝQ³C0 =( S1,7ӏ$֜+Y:#x=A٧ 2&  {mB,l ic*?m~dFp&47>ح$:Ƃ K1J 8SKu01DyeW ӎ5D_[/:SmҬ)Ng%\V?K"&`WJxxdXxI CZ8Thku* N`ލ6@QNYe1aYiY^qQyv-!VZ衉eNZ饙n4eqIζ譹뇎~Z.4@]#Ҳn0F[￙F*.÷o!\)1\9A]I/tRH]Yoa]i_p]y=.O^i硏}߅^0_/O_:]Ꮯv꯯zϿ/fX%"4HB69S%}G?mpw)¿&2 "P YH]a\@x1A H~R3J$PZRZpR%>A^(ȊE6j8X; * Pԩ$}c4AAz^n(J)AHI+ZJGK TP4v$Ԁ] BV7J)fy /C9Ib&.풀4dBrL74z6+*&dY5+GqSu iHuA![MP R=|1TY9CC  ꝁRbCٚ¤.żDbPt;D{ RH6i͝ hKҗX!RC=9Ytnh'ȼԳ',ٽ|S< HY1lcẗru8 Qe2i+5yP<0sgGOYtPYW\K9=|=#bĝާD8w^+gL2W=! *UnNΓO^zӿ:S:s"vݾgre @"N"0!VNPDFT!.jaX-0 >:pDBIT,&0; MoϘP("/Joo4A<> d@Bc|?~O wcAb;İPE~ R`NDZ./5. ZPX+jÔTJ"%U!$r,eh0l),o >ɨ*mEb4foX>m'1Fz"f}QXi˵dJJV*C u1KN$\l@HQH5)9SQ<`){csь\CRaFa &%$q#14`` {Q`J IO*SdqXROe6 WA|ȹh!ȋn Ŗ#aJb(]J]p:|\xRq^(grKr! c /%!4`B,soy"N"E"+.Rr/&/ж/0 3"HbA ]2.)/ 2-25\&70ZMF USs$(3a32b66qs4$5gp'2[^6}39s93Vs!s:3;s;;;3s>>S> ?s???4@t@ @ @4AtAAt@y>%tB)B-B?tC9C=CA4DEtD3B1DQ4EU40 %n(Dsw?:vc†wk8{7H%a+ wYKjި.71Aچ͚90%F;-;F֖$n8cCxtYexYM{& Uɤlh9fo!gDp\#aG6⾍mByx|p2TlM3Dyu1&8,. jbAY= ,uYy_.6DeӮ89..DXvykM;jw*WUk\ZCv؄x-OjЅ]Q:yBV. H7@YUkK;ـBqZUçkly ب_0Q`A4az0ƥ\Z†Z98Srm|4,8C05Ύd :#0#!*uy:  Rn$!"LZE{aE~7PX v!\9gP۞0۵?0b{+ zU{aŮy$u{Uw147Y Tm[."sqCyoXg%qal(Ԉ `5 |2oz& |fvI;5gMwYM'3bAFs<[-{zpDō7[ǽcsm+Aė9{<½h4Ng'v; q\pqN9 &:U nb [2 ܱ\|JJ(wSy=Сgy8+avFyUms=l\ 71X]C+X7Ix)=*H{d=./i <Q'pl-L(`ˆDЗ .tLL;!ꕬ "F؉!݀(fś5rLs$~ *߾~jS~1o1ƎC,y2} cά$?RA$ON ծ_kl)ضoocS.|8ǖN,m|zr7)cwͼ%{QVwM8o|=ag(?~1`rW>g` X|RXrء#Gb+γ$3X7☣;أ?CYG"K2٤ @SRYWb[r٥_igOYg&Q٦os9w♧{YpZ(Wlҙ2ڨ9zF'SM Ӥ@[gs.P-裫ڪyn*R!$iij.,bNSեāNڬR,`+\9%}-^Uk) zozAA(Q EN9DL$G+<1UALky|@"Nk/en2[ 0K1Coί pX0aT?)4?/{0IJxݗN,XXЬ!^ݩO x, $҄:.V)΅iXҌŔJy[4ѧFZ|4u`R~~3Gﻗ˻;L7j<%;r0B̝6O7TW jM}Urxr۩Qh*{[X8b^s$Ϻol݇BV"UZOU9X,cJ^2<Y ($kʈo-\# DƀiU+k<1m@Ky);kc-$AFsz]x14݃!lZc-yKuCm w÷l|?܀i*,XXtX9ϋi,Zcw 0& O0zaَe^ EMli 5 s"]ZաFCϳ lkZkUڊ杯E xBҦ~vc=thEX&6`n6u̙ {kdh,lcS[|Z[&h |̯"QlGGii&Uq)Σ~H ]ۡF)ICVktmF[,xI2]\& ~VnZ쓣$p>6`M Te(nf@UvN]#D Yh*Ć,7$k@sȮX?(D)nqZିcO]Yxj [`E-G42 uă:P+h|'T#f&qϳy,? r/BKi0:7b[HnB>s~ =~袇RGx*OU_ +@_;? GWl|$g_&|{;{;.Lh.]B1)])x΁h@^씞<1!_U@۳!K6785IE^^ F3L$Ddqy.9BE092xsP_ Z.`869FLaFj8 ,[مa!x!!GLiFa"*"^x #Rbgx~!|$b(,p@$ OC ?#ukq`,dLIoMpZ]EI@`LޕPꞮp\YlUeGGB[I؀֜T -Y$L周jL[L]4WZ͢$P\C>yZae[Z, TTZ\G;U  㤓0@J(sd-LGeY$E'DUZaZ(č"Aݜ'hz0Thk7YJB\Q:>i[,%emQRtʐ^[8e)'('"x&YRۘ^Mťs,K%]ҵqB\9C*GHF#A VAWqVmTYM(Z>ivH:$#tdEV5j 2vX`jZ4dNRf` L'`^'wDFQ r׌w Pb(+i^q&vqÚ+f\BejZpְDgvDV֦{ES$%fƞ΂YeFkRTŏۣviA-Yk]_'X6qp:C̫`bD,D&EmV-)fد)"% Kz\\GYmVٝ^ޘؔ݀ǔntlBm#r9&֜x"@A>3464C0JtEE[tFkFstG{GtHHtIItJJtKKtLLtMMtNNtOOuP PuQQ#uR+R3uS;SCuTKTSuU[UcuVkVsuW{WuXXuYYuZZu[[u\\u]]{@! ,;'dihlp| Nu] ]B7lRĤrl:_4N/§\hEEHH-\*["z1a T=$Xk/F "&b1rt~y%sac {w0W@$72%;#%Sl^; ki, wqOii \P*'ؕ'F'#05O~MẅYOX=c<0fH(¢F% l;cIezp Y$#c%j+Z*W&=r #A[&Hi#i~odob"p]2͚,:B@#Kb0<6#_>"jMv\^sD]M|9DA8g`m5 Lp‚dNxSkԡBs͍A0{%DuH5 st:)8T}iT'i$Ĵ#_F y ib,BV!rU(GbѐET8 At{bXaey X$ВuGu՘b"Vޔ0 \f%'JBQ)Q BنST{V2{gxE'.vD9Y&PLNŸ@ky@E| + }߂0t[&J,:`ۖ<|f)xܮ`S>< z *(&+a4>ek\ݯ7LnqUe)1SüApMHĞŧ@Ƌ Qm ":.ة@*V60 БȖYB kl@V?  :M@&yl/ܡ>6 =rΆ[@@4 +?GC̒3aBq5ӣ̘5ӀvA@'?"ЁEQ= J])Y? 6AFE-E`P;Uaws#'3;4F~<Cw8h-E=ԠJЊF"A]9d&QOCm4@@N[B XJձZBM)Ti'Yj.~wBY"2P6AjXGcUe4Vg폄Ld'K# ੕m7z'ctB;Ϛ]trZ5-^ȍFnwYw􋎼=K^r~=$g:Ѝt'!,'.em}p,tmx|@]`!\(5xqFL$pXN h<*x |N5+w^y{h*G %Z|Y*%u3Mh*?a&j,bl;O+* -) hڝיԐGӆ Wk+88`nq ih0tXo"* #&přKȲA5AƊ"^ANM+]*]̗m{E>XSUzɁ+ROLӪ(e5hMŢq٠+N;[KQejٚ0`gO+h +,"O%0m5V]|05UH}ڧp:qPUxoDc.I,FnR%O&-A_D0yC-!! , 'dihl"U^|9pH,Ȥr%.rJZجvzP8$C|mfQ~zMd:o`Mn~QM9@' uPÒϜ1 i@b9Lwx״Fy֩U[[*\bZ&@A7S3jܸړ"r$#S\!lǠM ?ɳOQȟ-O)CʴS:l<Ej`E0]ÊU(05ʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMZ 89ejp-(`Hċ+LfETө@a9k_R6!8S6V)k`է֠B~* 5b ?%hB#@UfHx@Ԡ! #Uw L|7>5p(׈5",=ЏA3G;DF) D|Ցְdp6~/Gp=z/ 4q8 ^OcBMBKgl@!iB֤MzjؠMj!gԠ`XBHL&:PH*ZX̢[&5Қq q ~pӟ " N5zIWVS~c%-͍Fd1zOwPё:p)hhAvL(pL0K DJ,* Oz13&\8ʑkrYFbTp#3=:$܎ԠkAe:1iD]8C6V5R!zx䬓 S쩈k.xςMBІ:D'JъZͨwMzp P%y&09@ kW(dd9A>Rv G*1HC,P=e|sg-s ].G4jMH=fyԘ@~lnC^)2쎼+M-Hz9c"FhrMXL+mGs.qi5x9:]QjSRp\6+/lюf)NseCo a;ЎMj[ζn[{pZrpAI۶L^@ɏC7-g٠݊O<۪%sX2ҵy{3cxgunV`tE52G?!vXXrV鴚B/q$7i,>cR_$Һ Y@phH1V42U6j:ZpNxϻfGD\pX̱rKA\>SsGQT0+OpUo8OA@F xE C=^;Ͼk$q96s8O ID`G3g+uMSM*v4Fg/YɿJ+h&l&?Ma9r8o-)ГxI4BgVz'xMY-J8/>xVw؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xi;엏~Ug9Yy ِ9Yyؑ9O$ɏy(*,ْ9 PPe2y8'Ix8RI0%9&я:yHJ ɓlhyDDk-ٜ։3Dfy yVC y}FpI9Yl1ןuJ}rizԙ0Wdil_) zq9Ibai":$Ji_'1 Jz0}͉3,:jO%05Q;G~WY{))Z @%ZVz*yHʩR8{=ad~@{0+0fʦQsZ?0 |IyUO:TJRTڨڐZJ3:Kh)j| S U;='S|::JAѪf| q)YLE&Zzz|KL-R5}Z;Z0+pЕF&Z}vZgJ}jG:s)V(}/JzJFDpa df٦' ,̦i9zڀyKFBqZxZqZ&; :}IC/bEZg1ILvaY7ڙGگ6 {"[${PGǠǵZ@j;gAD^:fgRC9XѬ峡tۡٴ)|۷Is{n"`N37ϱZɸY;Ref/kjX@cDhKG,k[qYQ~ےgx1 CYິ3.6Jhi {w*K[eࢡ/P.dWW_0xplGL˺[:9@ZAF\5+.f 7CjxcYg{n;_lȲ,59g1DT7 !+j<Jy2쫒˻"LazI6LGP)5\ȰC(ҝJe*A }8Ǐ,QSoħʗ0cr{@ѧ6MzΗ;y JEh`aQp20RpիX0S.+TʺLXhG۷Kb,0S \*4z LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞8 o(< ШCZ1c Ó6ہFzPDPV"#Y~Hӥ::oo5} a r@֭ z>ᇋ}4Y@/$t⋃12F "4T#YPO#"c9AWb|w-pT) Lf9/XLD hiL CI#!8 w М"L"yɟՃD 4aUV"馜v駠*ꨤjꩨꪬ꫰*무j뭸!I ى9mR+Akqۑ+sTGʲЗxp'# _8b)3 I9܀yBJ R20!t@".𿰉C2W:Õ)0lc,2l|(FV ֗_@`" I+ĝHq|;~ @JЂMBІ:} .MivoJm(j pDj)JRҌ{@DDQeHJhzP`: WT 6P*NUphZVΘ^\3/Mޕ>\]׿zuh#j:d'KZͬf7z>q95Geh G3xD`ܦMm-$71Ba #!͊r2zѽm"IDSȮ`&BjmI- ${^pI Y ׄ&P p G`-l9(J nᚐ0FqX 3L(NW0gL Y NoXQ%6S GѺ]wu- ֩L2!c(J^$+Oź>*_VrAl31e֠~0e5/!-cv^Hh5^;B ɫQrhAy)gE7IJD;Τ5y|H*6~HNνTUؠPYz(gMĔo}f;ЎMj[ζ~|)on岷kPR ](lJiȴ].m39;=_³"=沸_S2S{^3<(V&”V#,'n\(Kz4a%H4 ~;Zϝ'\x M3Wo/=+r5xò6AKW΃Z:HnR.ki{OO;񐏼oqhQbwK5p[y>)x-hz=%Mzŕ=$vZHh’Ը!Qr/ff??'Lwb?<7t"؇ATzSOGB韟 ]k0pIo_>wpwk/2aNX8lHt_fa 8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎ WhHs VT?5Z$RZQPyRaiW!KU< Y?Lu?UoՑ)Dl]Fz.Y{zk[9y`@L8T>p-ip\qA'JF\೐@Y$kauR)<$.Q@{WXpXoRQӕ`S\gq\0f|g U][ٖnQQP|@G%r% |ٗj٘[Sh|6rGY^Zeyɑ_ )Ah#Y^P~듛Z3~0X.F7K~ n)}@N5 'wn`0JD ֹQP`ה8D9Ia牏4eT7fj!E`ZE( R Ԡt|]1qwo* G%j(+ʢ&ࢾ4Z6z8$cWJɒC`#)uw4=gD&jY-- zQzqbN*G(WJɕ_$XtSkYjΕ|fz'!ē5IՁΧzzTgR `rכg6Mh^ț)~2vp4ԙ\B_w5Z%jf h=Wң&-S+^y *6CE \:wvaXò("lBTl"x!!,6`HE}hl^mempH,ȤУk-:!mL.X|Vه'J&x %\7UU5T 5zO 6yӰι" O l ND@ޑ6at5AIGGeȱ#@&!ϲ {ޙpBv5&аɣϟ|ݺ3m/\7l撇rӤ*0 իl@BYdŴV۷wA#P7ks1{v^5:rA*È d㽅 {i\ )lHLU੆Bc`y`;Ԗln6Y0W;j?0p:ҩGI ÿ-@ś]D[I! , pH,Ȥrl:r<lT٧xL.贚]L. fM~u_pCpj^]yZ[[pj YZTֺ  Y &37A5 Y#JHqH6Х+Pp0Ǔ(S\iL" 4ɳ@4 8YA}e@[ҧPJ'WKSS ZÊKv4],K]4zme)È´Y\-B6.Չdۦ6- X?Tds8F3:ªVEDE JcFOԡØD.rR˜j/n3c-f*8U]e*0Xh7Xdᡍ#!hTu+:5@B+uu5\ (3:W~,\|U0TX}QUc{X2B\!c Nh6()xkzkrM&sL:~ e,1N$L~Ej2鲞٭ kbCxγ>πMBЈN?s hD[4? 5@S:js妉 ,U/` UF*H ;ʴh0L4a@I@g-܂lFN v`AŢ#xHj3~ ~N<)ڟwϦWۋձ=EnTԔ& ah\ϸY5[j4'p2y RZgytvD^ιw@ЇNHO; av^n{?疮L,/^m5՗bCN[9`'N/;좺8Ҵ^6EwG k1pAsFw6x̻[jƷEஙO)9x<˿Sn-7f]}rB_6-?Ϋ;mTRj3|7ÁJoO[Ͼ{O%>W&\"Sm@f@#geE6AW(F5rBhMl$ycHE99Da,jqGWRsD$h5#36+H- x7eEcdc:HE"g/xR9daA[E8 (W,WGĄc\&WfpX8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8XxLH-@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yy٘9ɇw P㐙5Ǚ^]WPQypiuw)2 })haq*me~*oy&SZ2@@m#f"« ˥I1Z" gץ"؇6"/*\HU);k<,@mgb09 K_C;0c,=y*B>SDbSsjD4+DQII*LOFɁA7+57-M>]DP[x H:ޑ ]SjnǨJՄ#M P+TPЍAd@y Ѥ߁}A8%VKa| nvMk{3gm1A&/Bkrd&LItgl ,ۅ5,;_1MAOZgrgs<`#(eؙ/akH1&WO* |">ЃBf*EVDL4)Ez'uy! , 'dihl%2pH,-Fb8nȨtJ bzxLtR ((;qZ8n }+n8;9 Ԥa2a8 M3yעW 2%81CaFďBhEb\zJC`C?b3ɲ]Х$߀@Yc愲IQG08JKWolP"Ӯ.QY7(M `>*OdW bN}@NKŠ Lđ3{((Y354d1ie fM۸sͻ Nȓ+_μУKNسkνËO*nhX8 F@9q_% h4FZ!2 2ACZ(f7X2E2"8ߌ8B׍$o Fc} 3}`a/r Hm12M8ҡ9% E8q*X$ ((x6ˌfh̔ ,0衸e%H~P|VZGkR [ t褔Z*T0qz)SꨰQ ei~ ׬'&vZF+Vkfv+k覫+v&*K4DXhżhL$ja2_x9BD` (*wGPYƣvH0qo#7*\ 4-(SAxI˦iz 4Ù9qJ.muzX@ D=y&8*ˈXwv52 6٪hԈwퟮ[b=;1lYׁ݁2K³b:I砇.褗n騧ꬷ.nN[2%0/.9>Ók!NpI$uԮb X;N͈և?.g[tr@ɨZUb_43buY'TmXpS3JQ5fP@ j S$=F'@΃*թ+NۚU ]0*0@ H"HL&:PH*ZQ\%T1p\߃,#A&XeD>mC&B<Gi*qܡX>)*D0 Őcc"2H=@$A"(@0"+Ir*%RJ? ,̓R!n,gQKT U*RbqA~Lh&g590F:>7v~׮(!OcYA9j5,S?2}qa(v6UB=ZР(*>j:=ZҁCE'Od/O0i3S,4wd*uHA-uqq+zElSU^O]`E)lo@Dș6Fd ؟$l!WeVƭL2hN6p猭dF:Ɲ wI~ {EoP""Q 2zm0o`#Jw|M-aOSe&BFWԤ:,VJUԴ̵PPRM}v+*ӴrԤ Lj;U Uz/~j77ޝsYJ,~NO1kƒ@p~ۚ2A4GCT|M.Gw7^Q]yHn)\d*],#I{('ʷID@WvcaRI gE<'Q.t 0Zw!eூt`ws$u'?;,5,URVY wMHgڞes2iH;񐏼'O[ϼO ٨>}8yDXTtxl]^$MdUd9%J~6IN{KSg@C!'"%b$wT)T+He aF*>"ĵnFGůx y?UDl? {)*=/'}yȤJņw1EC_BMwf(0gooX&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏)Vi6s ِ>'Uhg$eb2qt2w(9}(W4h?-q#F<ɓt{g0Y2.%|Q3U GғRY\Y|Q0ybiX&vc`_h̗{YɕB_-|$tuIzΡk0w@>*ja~F5 zl.d7I6Y%wg~.璙-ttUIj#AJ)ٙ󒚭 lS[ٓG鐞i. -bu^Vz3Jy'* am:ɪ&xe0!TRʫ %,GF\$z3ȺE_ǹ(cgݺ9hYgXw\j-#M(Z'agee/S!! ,6wxhlHE=Zȧ|pH,ȤrS%FA8ZXFZ:5Bv%AC~)$Q) :Vl,vg1jfpr(2YR#e-D)(Y_'_"X,I -W+&k" (~,',+"7Z ecGA%yBV|ׯzuI\רO؂KW.4)BX,40wh gp(URK8 28ޒSBve Ҍe'=!! , 'dihlpl%@keEkH,ȤrɒAzIZجvz8\( eqΌF0߃Ox_0xgmo1km`z : 1:):^  әܚp  c1,>::I:O|9/Ee]ȱ*4<÷W*~(gʗ0c”cCJrNB aK!=  oCpy?>Jj`7UuQ~Kln0^x˷/ qb v1 Ő#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ GW4H p#yN#psF`Fo8}#,Up4`MͿgմU`BS(rh,-_sQx` D0$^O?{4a$C$%8u!H9(c ` O;ɗ&`+ C3(XKvA'(+X%TEٔ:(,piPdUv(Ag ST;wF@hK>0ZdX ,O @n&馜v駠*ꨤjꩨꪬ꫰*무j뭸(SEFhFHV 0˔xjF-d*`ieeu\"I+/ 5NOr 4&Jg&B @8:г W,BH#i'YC҄$i\Q$h0Š*W[LiR\1Zj]sN0`5mPG-TWmXg\w`-dmhmq-%Si(;x݅ݬ^-S0(s #%tʨn:^J$8Ot7ƀ4 .{FZ?sKd Os|S~|C/7_HfIm=}x)p$v@؛q > HL:'H Z~I`iA" '};J3\z¤JH! #$3l%L4,Q׭t H(YapV0ut eKD؋R ,E EA1 ԣa 9 Ɓd~4>(29!rGb#q?~K,CR^'%tTWZt( 䧌Xpg t69(ᬄ˪0r^o%9'i@LG-EgĖg#3Lhg;JIh;v6h OChr`E~aD{u^sTp~ު0kVHe)bcHF.穓֍z.+G8R/acNhOpK1l ʩݚYk2oc/q"߮7J af:#-'?e@': X.)OEʅC!ȴ4]CnF},~{6𽯃OYX/G*5="tn|7yhAj!Mk [Wj-n =:âkPlx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8csxx؎x긎hhDL#:؏Ǐu]t2EX d jiZ2zw]+-"x9da֓Yx1y5[ɥE f$y1`M9*,y&YpfG: f_@zBEG\$RM.Yn_X(0gqc")IhBbbq]Y]`gH'_Ȗv|D)+g0%J٘v$t3鎖 $3g^ 9H'T*477P︚=]p| )&.}43[ѝcoUk@O9gWu+4DuC% ck]:k XmWLXj*8!*`%s')j#J-U+4Z6zhw rBNwN& "Dm'xtC'ha[)aROCS:4DBoS[:-{# zwyfy\P\y|zHe9,׀j!xz$#Iq8a{/R|a樜ÐCL|qJ|G3w#8Y_|F|Rnr%wyE0' :9ǑVǦ&:9_cE98^H`g!!, 'dihluY7IxpH,d+](ʨtJZجvzIh 8c6KxF|{#O8no\ih8i7?*c[<68  @Ȗ3ҕ7 ĭ8^L 3*3iۯE3hbȘc0 9#JZ2.0fDxI$Eb !Ϥ4 I7Xrn< :C4k GԛGgljJ9PIF |x5Y]5",˶$6 3{Kǘ0KÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞MmZm-b^8dbmJ{ÛK]gˆOIAs`L)SX.Q`t$Vy ePP>EW`H^ŠA݄f[3L] W!02ᰟ4e5@P zx;R)F#m#}%x F.re ri?LAsPip)tix|矀*蠄j衈&袌6裐W9 <0Չ>^@VFdzHwNXaa8*lb*ZD"ALX@Z`WDmH'L7PG-TWmXg\w-$Nl L:A^YyArm|"{\@}b 39`v![|*pf>$^h?c!$ tz#, a*>'t;OX drɐCwaႛTyx1+L|~# w09@s>HI\Vf>gFɀ SypCON`|&0^$q Z̠7z GH(L WB~S$$@1tRMpea!VTxgTs^Z/sɊ)D`jČ]4A{獱qϰFx.gPV 6Έ9x0u@FThNkXmF&2&?250z#)|{mW)gt<)GZ5K SXBQD$,r27Ȗ"dbA٧tLO"hK[Xv~wDᲀfR9$c7 J:CUӝ5&sjE%\m5f(y!l =)hw\. Q'eZAc3݀4@iGT dGjhRɨ49Up#XVVI NU2] *:54Le1e@6D;KZͬf7z hGKҚH蔭rp$ޭ jsVel7fbn3J0fKvdE Ԓ3k9޲NnI׺]@-  H5Se^)/_|2V1(k4i5 o=pM`&%a'I@}74XW0gL8αwcM0Yh"ܟz[v+dths  M1E-Q9ڒL]g~j+ ]t^>s=T(OpO,gҮ>Ϲx[)(quGXrꬵt9tieE}t K 0MIm[KH2K(ó^Nf;ЎMj[C5bt4.fPq-R:;裈+:-jbe~`UhMZQzna1h2,@F[LD@8PHߖΔ["XZIE(bJG+9@4jc9a)E}1Ohmq3BDUB+a۔BƵxϻOFwV']vpe#37k<݊} 2{ܚUgט?L3_BeWw×ﷰ^!Ha|xVF_8_!Cl(?\no&qa+gF9%@"J34R6Pv Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎muV8%hxc)G0($Ak39Vb6i/by[q+@ng( zQy7(Ǒ z0)'g)WW*02<(F[f9bhB J9{ tw~'PCY:Un"~Yp;";ez59(_ayj|'7y䢓Y N 88f}aƗ)iIh'(is:y~wto)(IL 8(',4I9yRs}fٕv2XxharwkD|8 M(Y@@H(YT3ntљ(IlO@A&Sُ)yV $֏:h{xcXaPT—іYz@'yEEv&Q @QLdygN%S@Eɗ^4jG)p1r6ik*Yf@œP}ugVI}ᑚ@"JErQSɔFz{waq|d &T[9{FPcig|&'| zHΩkvIhdgl~ŷrক4 oE)cHAA`ɍXh _z=@fRP9z$gɔ96HD>փhH` tPGQf."Ohj Ni2( 9AѦjjx$t)+#ΞY К&9xd@vƖLm$$3fwf^" .e4A9 )w ,$l(,0,s FqrP@C΅%b`dL-5좤amDDu7haHYgyHE%sm&a\(BtȨ>h 05yyH h4vi9\Z~jny+=slzB[j2𱞸Ƨb .l9}maFb1Z+Mr[{2`a)|-F;/Avo HВ0!pӳR^R$gZp7=IYuEn[@7$ό$4,aBEIFH 4PzRvhv҅,B""sGCȉ|(JR׍b1¢`(㴃\Mz ;Ji \L"HrP7Cq^ G?l1I@!ɦp8$V=̤&7Nz (GIRL*$.v᝜% lp%LhR-xYW3L&5ƒ) 9t(B8ڗ Fu)KG)i՚u<%>U*rP=A~\O!1@):a/GR#{( Hd"X`1O-dAd"$~GrX ,ա8ͩNwӞ@ PJԢSL6#m(9UNQ c$1ڍ *PvB}u$5Tu "~ j (IF+Po+bѳ|\TӇ[]qBi!ɝȸš~ pdT%FnUxuh;T0'Dk/"6{>u)B!9CfZ"ƻ-R:ЍtKZͮv7TkəV$?@=) O=JRWmGio+b.E_q?;%YS8^o]P;q]( dq zXwSKPulo\T7Y} 0pKAX͡RITUi:enMG*>fxW$δۍL:xγ>Ͻj$ՆIg/HÒ'YuJ~(,)3v˨xpJPnE ubF5@Z+Ϋtr'p+9%6c=&$<^ K(ZrA\$E>-.Ql0WܞYU[IlσV@U) 34"nMO;s}KlѬ^"h:~-KOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8T3Vhqtq3Au`EAPhs(GKq&Z?"I5QrB[ThO@A/?5DŽugE1VWLMl'3p/c ^"a \sBP=s E-Ls='t.8<~ul6aȈuD*Vʶ)e^UlTo܈2LWnȊxO׋q6b$Gl㘌,֘w(V! lA !?\׏iCw1q'r BHU;,<&vz"Pv)@tZAs>vo9[#^[0p C9whF-Z<|#$pM`wj 821! ,6eq l"U}pH,Ȥrl:dlV+-`DdRchx""5?Qv6y{/;Z"4t+w6,r",v5.D+C,c0'"l)0. , ="ƴ-M- խ`:+m pVb`b怂V0 D}*AHHI) <\!uYkĎ~h'/)B^RE8ɴiII7]8r .Z= J[-45g5'"^40_ʝ @[u~Ok['L@Y<CpdpKE[bp f3,h-@B.t^Mg]{hv" V>+vMo ԞN`)Sw«+E¡sE$]Oo>teɣb_I{pH*2@~&!vgp?J@#,m,=Qt(de8Rhsq(*ѣ <G5! , 'dihl뒄&YxQWpH,Ȥl^ʨtJZجvzGFoRcnA~xef9=^f7{@%\6= ɒ7ғN,7Ik7O)4*5w Ç\xCw]ȱ . q5,\ɲe'8Dp@3 ɳ t"iu;zaJU)1ypcV6WgxcͰhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k`9FgCGt%SM׌ 􈠆4ـ<|xȶh#( }ڌ녡&ʃ[d|v<{~c*\۹'8FA쇂Ah8Q 5^XrT U?v0dwȡAf8A x"Z8uS̋3F򛗒D2@P Ҕx$~jULE:`tJtE:15ұ&+pS-j+_ H"HL&:PH*ZX̢o2ZԙPTBd,yH6h]C".9C[KAq "BEҐp"nrҁQEͲ2ihj*$cARBDX$֏V'#tc%f[-X6Kp؄|Ctq~Bd4]T|0Y|LFI\8CK~Q1 Y1]U| vnPR c4x$~ɐ8~rO(#bBj2$iGUixHu/K*# Nj<`5i( :m NaI]Cٖ(̥d'KZͬf7z hTK9R=Ѷe{m_6ц]Qš=x5urQy$s!Weū<sY%z4 F9yIn)eVlTy[U(00VYbS/S[`lzGyue]L#IJ_1%pI!3F/X_ۨy#'dfKQ^(]io~~RmHN&;PL*[Xβ'Ӧ3ۦD;B01o"d#VY(x~H HK@EE*}hhE xш9oCP1Sbi 5~AhRc4 UJ'pGH\`BXr әAiʮ]Nwd:H&6)kqV "oF1ƺ˱[䎷Mzη~x؝H ,Eps~qַ[Waz 7))߳}91i/{9"O9Gk{'Y|tsju@nJ_zuN šbW쐨xUuOO ;Y(>kN U'`{1%FD~]wz0>-=./ߨz׾ 7UPI @P-jڥWфi_L}'MinhׂU_x{QN @Ss-l$&Vn~G~1&xnnn؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏i4YyŌ ِ O:x;y(w:q1Ul#58e$  f'ْ7ec6y 0&SA[`f- GiSh:'L[ֆ<דTiGzA-LMiz&{Sz_ٔ4]=g\;Uyta[Hgya&f [b${W{1a"`IhٕRh.z!V|Iә!Auh.1$ fi4iC!|}n9ُ)wy{4_Si xgRTy$}jǛ)`MU2'bijMJǃ}StmyGgu KM)#kJE%7Y7J2_$0~AZXE#Dɖ&")b3W ,%<A!=],%4P }q堇.褗n騧ꬷ.nkbƒh0`^GN$O˱z9$W}"2V&)7h3AMg+JfDb%OI'HHXMn R, ͂u58~PUe_0hXK¤,I,I) @_bJxA^zaAq,)uV*?% *r\^Ɛݨ/# /V&Lo92ј'%*eұ0|F8$Kn0i`e&²HR jNDf ǽʈ RZ4u%Ƕy[F7&Zo1f2T*9Çcyc m*3:D'JъZͨF7юz HG*:A 0v@p6$M<'OCŴB`O)4P CRgG *5Bt8O(VMPS tR> E(<V(zޘ3tKUF|B+ 1ѬzC v*ƺjoȲ8Ba(ɲX 7T2cҒ/a`ޏrjt:p/CX,X| ЍtKZͮvz xRca0^x x_5ByoR'ԙ*J/nKB6No؞~3sN iȻ>%snʱifzO¼"PAR^r/ d ,0 6΀MBЈNF;ѐtNH%]DyxϬ>0Q۔Ӌٞ9!^Lw!M̬c4uٵP'vW_Y>PjC.ɜ^-ށ~s 9nt[%O;`w3E{Ch yU>rNdqp;'N[ϸ7q'5ySoϟCkeԦTtvҶ!o%p+7G' @BTr+yВ"v*%|#z<\L8,qa} 1Gn5g E>JjҺz) +WZq:+xss,ԣV*'|q9 rdzzϽwO|@<8G8意\ŷܐ;̣/ N,*?s_6+91J CXm!M$\SX@aW dKtLJ/Wx'8 rA ͦ}x?6{X ( mZ# AUpQx\w*傜CdRat/oe6 I\Hot[[1]@ir!{Z\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Yy ِ9Yyّ(N"9$Y&i ',ْ,,294i/ŕ/S<ٓ#Y€we ou`sR9RhG/r?/SvP1q!EhIVi s"@&XT$P e,JW:iٗ2\~ ' c)UZ~'yktw )4r!u;:$y7sL2aP>6hedOF)(&14d1 "C t5%H uwS×PNCu wP@0&U|" xɜYل3YdjU iCO֝i%!mgbl)"i !y6$!7N!M8 e0) h k $!Z W&(B/H*Cs81W k٘ fQ%FoEd i|FXEב,/8-UQ<0KMOQ*SڗUWYڥ^K)^_a:aPtBA,KiYhAFr/r|9^Е&+0!\s~}-R ÃEoׇ*SYzZ4bWzA5OUR~CJ֠P'Xj~ZJ?zVx?uEQJ4N9VqV:EGV3^quiMGjYvխ0C&Zf cu fb%/`ƞgV"wqM_񁞔=*AJQ$1-Jmgly ZiZt;!,~Y= aº ʘZʭګE[mzZàCp+DcCa)Sn@z 9Fꢢg0G@pHJ^KpT9 JyQf[JpFй;ˎu| /2{ک(q;%j4}j_~k2TŻ}g0*S[)ʻk*OkH#R۽]Ȭ_(Wa: >RҊ[+ڻ1 %*VFh)&W[Y/'&@\vwIW X曺!o P37 L#X#J*!C$hV䙘{A Y5(XU*U?x(C1NWv# G;W?^[:Xcmǵ.P"OLCD!OGfDeyhP8+ 2gh6Ee-0gR$!&, 8@pH,Ȥrl:ШtJZجvzxL.zn|N~ H*\ȰÇ#JHŋ3jȱǏ Cfɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJ] ‚ Sjʵׯ`V̱Xͪ]˶۷,Z%ښF˷߿=)Wo`+^̸qs#Y]ig|ϠCS@)m ynf+ A2ӟUͻwN*G e }CƇK 6f;^Ý9O|ҭ5͖u&7H<|oEt (( P7ABLmv.߆f lm*Je]:b~nAfiZE%v(s 0L γ07y4hV&ּ,2'/;J64Z&~I|{,&6O ng7l-l5|wkvFg([" dZ{uɏz3+gB){k;y#I2 uLMށnn;L{% .|"ݖ.2"n6s䞧,b©>out~ ߙUF^XΝY|(_ Nd`gtC=BYb5/^&?>6RHDMj'9}+2VK oS &6O/>C:2Z8J;[6HNwHY-Wy;ܱLW0X(b{^0&: )2w*bAje3%)^䙬kMK['xʦcЀ"0lvR"ьȄD&HG4T0,,w4C/P0U)ȅHF"4T6bOiU[)ahOGt|)&T,)Ha˙HJҏGP O!L`zVJ0F6TSJq]l.tXzu XzWϯ/d\JV ~g渿N+S[' ˲^JVճv%+~yawٳƔjlv mz8ԆR9zJ꒓u]*pATtV2J0eeuղ㆕ul2MhY8[+%|ͯ,$2 xNP;F 䃡 [tܕ7 s8*GL(VcV0gL8αw@L"HN&;)L*e$.{`L2hN6pf!2>πMh?ψBmT9ѐtC#aU4*C=ӠGMRWVհgMZָεwkMOaѼ5``|]78>d#0; ׎4`#f0·!=>S-bz.— k|6# JKMp' |yB1 0 ›i_5ƚ RȀ‡l"'WaNWq5 zˏp /Gºnz[XϺM[}BX^Y=DP:S. \2tnȹ|O/rwPs08~ v JshW *%L][gOڗ;/ p=6@v T=_.bԇ/`\.G]rďlGڿ0eg~~~O'x\0|Et@tHptGs zi"8$ogk~ig|ϖ}o,hskw}88:jHIP0W~.iFek[g;(iW~w7oa'wGWifxEpwhQbHC`~o2 p{;(/(nHD'8wV8rv*W 0L&(yȊC((rt8膶؋QvG|8H؅sHsƆ`'B*jPԘX؂phCFrHEpm5ǂe1wwpi^z(~v]ۘ}M7&7|!i9x'yMz0 rti('>HgXڸ[}jH(Џ~xnTYh}@pxMawr=xiY=HuPa)r}zGhX) yPՔN Gy~ehheny~lioYqIlUw٘KI~pyEIX<ɔeȕJ#)zY`f#TYG'uw {|ٝ\kt\xr:gwy6(9gQH Źx2yi\98y>j2+I cYUu͉/s`g+HsYuY6z{旑gn.Ip?: ii@ԧA؁HA)gzʥD{IW Ybj^YZdZ*1 {(اI88u&{z @7JLj9NPR\{`H+zĈ\ńSbI>tuaѧ~ \^,P`Q+y.Yƨ}-9͵-nNs|N} Xa聉+iY4K "~QGN(ä'}UIm]&^~sC 뺾,mmٙ~~jM`X~~7npu ӾΙ>^ "zIlEpe>s^gj^ﴺJ0O>n}?n վzxeoOLiyyNآD;*)j+Ռ/9/ȳeI[-j 0ܩNs9Kr^hj/ubfvN?z) <)*}/ZP|~ =S&xo}&Z&Q'X08vں20ֹeO__rkfߪb6',O꭫Nlz\Vψ彫-O/gO!NhX ӐX4It>!Z^Y~a\6ivOgByƞo4< .". :.< 30 +AD55 2U!P8. 1?/GmC;QrMwQ/!"(.9_.2!.b2*==3; \!P&T!7!F8bE1ftgNs&gP΀ ܡ,侎$=D(h0eGɔ1d74*ggϙLq#Sh'M>=32QDn!+'ɖ\;'5<": )ɾ7Al-\ #xy94GN͋oFuMQ^ukׯaǖ=bѺc630U|wQc5W[Җnnpݝ !x;|DrWIS GŸY`&Ē;@X0#=9 ORq{{&sB^5X)AH\XS1c;#U ?aFu4 \%DV w08KImY&m6r-B٣N2>uDaa˰ 3"q% F`@ [,Y$+rk@ITq$ !JRLEJ`D 9wMRBp aYf,<'K U:&!Iyfb]n%ҝHT rH'^їHEAÀRÇ,A KZ2tIYK&'͢W)H&i㲋/,*H'c'f,EP@eeB5掠=?2N1X5<5$n< ۨ@qCAj^X@@@ hJ0Fc) Ul.qS^R2o$JA[H&\*b>#/l 379MD?9mTNUN(!߮M} %HU* 1{{V5LET^ݾռ@/taW&GƈU0^mAh _!p䔑ʥZl nT7I. G}Y sICbԀ_=* GY4f'b(Ym$s?DMíJH-H!c%( uaB(CcxÕ.\=7-n)2X h;9i<`6}XjX'pf/}˭~u*9aroObOYU `iN@+Ws}ށl=:/ҒLTx[4 C;ڊtPgi ә~ۦ;4|*!0K  K)j GvY5g۹EcHs9x/2ô A!h5R9Hi1%1Y[ L蓅kT<s.z80HFDo[mqcdAQ1*F.ӞvY,H|@&? mZ$ɇq+<=Us<`-9v&BMuny^w [O(oWxi&[ZnBPB 0;P:%Kxo"V[rԒ' .csmKt`. 4bQ0Ob@\pn,RA ,*'\o;av *n.NAB0oS`/@I3DL0ąv)6>"FdP pDh0VZJ0mIO I^ a.  oœP)$ x|P9 p.+/)H< B I#^ /b#p +rb(bM<,xQ*) $cגcn%FA1CLGJoXjmbѺdȋ^#ip2'Ol |qm::c>v2W!(MȐc:824 S,AB#6,3$-1W .EDo%2QpHcR߀l4vҪ+&M -oq$"9"`P8@ l|J@\%W 6U@Vv5A|ʃpSİ.+'!RRMH9P0y  lަ/3PS s%<3-m>=>S?fu$TYԥB/pvOfgy&AtA/B1i `ZX4)FCibjjS^gHD7Dk)EU4XFH4I-3GM2?kHUfNIJ4KtKKK4LtLɴLL4M4hM4NtNNN4OtOOO5PuPFP5Q5iڔPQ!5R%uR)R-M uQ5uS9]DWpe.Q/5UUuUYU]RørVB;C dpSY2eTQCŁZPU5ZuZPc%#Tx[mLalL:"lTttYv@DЕ>R"]dv$P= P3KRa'{N8U8JZH)]e!X[^K YufifmUԲ>^ gH^M`~D2QaF'*KHzִ~ 6vhi`ii"*Qb!im_v``{D&g;h Ya &aŰmbb k뚨4]LXEtwF)~Efor-r17Os# @6"rQhbBzIOR]s+1M tt#KupZ' e֣tkWtQ5HyW<7;Qnwa7:7*{WVpC/%%0jYx|QXd 0 o}1*v4&7s r7WBTp]S2@a+/LD^xWȍq>8фVMa+a djPGH0JlQ #87z!Q|3.85d CN@1WAo ,"B,m 6oU(ٸݸRxWeFqp{)z2X3xk `q\8-D4!b!{)55pc$ !`ij‘!|;'@/ᷞY*Deq$ r$| kcҗm7w^O95oEX!1**ie;I+ěOPGy= aXٝYxL-@yCu7RS)CJTY^ȷCe JxB0.=ٱTux/ߴBX|_7"`㔛dEPm`:!a6uD"@eWAѰ4@-^1˸9Rfx(:- ><}Aٺ{Ov'@_i/Z.3/am rLhX9׎0/a"=\Gv㻽TVݝ m!q 扛-8L)q٭|G`>ym:!}*Qk/`ӐÁ ޟXds2z,Vd'1@K3vA)Dsj,l 5\ړ&jM\Md.ViCkV>2l37_;_-v􏾅]d);S'](r+5:zNw!h<"%|B)j23gBťl.c„2A!H,IA !v\ =luR4q\4JzթqN Xz )2)\lM,DƂm*",sU0<rIE+Prs5 z>?`Ip!ÆB8D /.b̨q#GT 8 )r$Y#r%K.H0(s&͚6o#:(t(ѢF6b˦NAt*UTUͪu)^ +vP Y+w.]J|٪w/߾~'e( Mx1ƹB4gobάy3һL Yy4ҦONz5kƗ9Î-{έ{7޾.|8Ə#O|9ΟC.}:֯cϮ};޿?rϣO~=Ï/>ψϯ?wX"נB!U@"!^,rءg]Շ'^@ S8FuJ̑:ǔ P G"Kn(b^%P]cE*tZ'xtrQ3n,0651c'Lb$BL8]-ˋ0PUN؎Qfn(*X%y H<)݈E3sQF1&ij`Hh?*\d@O,  g3MrV('F~& *,ȯ].:TEk qS0DA(oEoAI<1ob1bdAhF^nXnn%tT8np;Fd;!hR)KId*UUʀKCdFk]v^4KVar$h85-I_[1j1xߵ؀\<̊xw*).l?2ЛPAJ٣$ی34&3RC,e)ڎK/ pه0_}׿4{ÌO8JR͒9+@QbRgFf`zYݶ D.n溡<rv@; 8I#2P&Y BMPrڈ>2"5P 8Ps@6fX{[C3ss7==|d2YQ %C O*^"E P\' 0cS[A1/V*.6#E|6_[$# 0R"83H2K Y%&&OAzr0&{r$#bIJMN#-<88QRw%H3#]v(t1[ L^\{ґH`KA=C-Ԝt>\ [71h ((ȃ"40\^D Ō(p'߈Q6sb\Gi5\ %Ƽ)y H5*S1$ S>S[Et@*-rqTZS/b[t%Ւ c#('od`JǗx;jSNfB.}3.  ,a 6-rc`Uiu ^85s_fa vh0kY=氷BI`"\kg[[Vu 0vn{V>SIU25yZ8f{L &6`2GAs\aZ)X' IjMù6H7d18p}g,2^e@ E`Y|mNCY/2M\-u@0cWEuI K؜]s'A1"֝(;-"˕`T[2XGh{aAI)Hb#ЬcqG6d؄eNGviXS,$DF$Uʄ:P+ M:& mƛ87E:haR8%K(1PT۫PJ% 9 UpB&#)#»t҇&e!(؆qISZz;7N}kÈp(oɆn޺RݧqY EM`PB296ݺ."o"5<ȓGVZ!Yls% hC1k]}Nw!UC+M-weޕ˟?|C }1T LiHDjځD2^2'^pEg"}Yǜ*)B{{UFcMW>GXa3V>NWux ՝(rO=D%9W ݐA֥RL Je`>c\d69(Y^XDؒrQ*AY2攔D]=]u)?9WbIGxoh&AjAeEv*UW]9i|inh'/"K6uVLPa2sfu9BW^k% `½*v9QƾkfGX,:[*pnղp@-xФRHu|,;.mg!2F|(GD|\YzV>' ,Ų.l3/NYHAeQ#Al9<*2ֈx4ԖTsDj+ʫYo,hx`KUZp5plv7w}W^EEy!;zZ}@`f:V -w={V$dz8 JIP% ]<&%cFp/F\j$.+@ 8G &0KDO*D$-FqJ<懃82XrQO4?PR,ņ;Cv gʝ¾tb#$"RTOڰC%Ɇ?:Դ< OK2RH],.ŵB&J"R򐔜IBR N,F,lz#)50}2#|n |2P Ge8PCYQ&Y0MX5oxv]!W !JJ*| GӗV{ ~$?'ɕs_lVհuqbb< m#stk2گ ]GMR/2 b٤` jl7[6E-ne ] {6b)=aJ7Z4;zzGlZL<`M?X !-_KfZ$5GN.p_v>l^רMv^܋S8` qL? J_sG⩥ vwS k{׵*MT }<6bUp cǫl <6rg p7 松@ ?{zu4q=Wֿ7żkUiuyܟ|k^O{SÏE_&`vuwcb8^ NP)۵V h7 HxgBiixw(t(v7mHh7 !悃{te_WWwhgWp fWxFWzFxH{%6W җx0}5V0Ȗ}495HW7Hdupxbi0+{6_8'q0XdHamicht}H|XxxgH~X؀UHdWdx`X pPW?8sȉbpxvwtnx||uVWWwvG~huq'qgyXN ,iht?&{zw>8Mj8؍Lo-vqzc刋{،rNXGqШm8/aɏNxX ِ%q)h9Xavw(w(RurwWWm'uyegD(}6|5mW&(dYq!qpp{Bf 7sIhCrؕ^%Ր pP1hghy}G'tKWevy7X}w}Sp9y|ٗO {ovlgCً,fg)|';;Nj`Xt"W-WYlXAHW$Iu&|Yyni3g }RY.|d8`sEY^bɚ Xwnq}iQm U Xy|X]uYIu9d驟YXIiim=:Y1wNůު5&Yi;G`bTym_Kxiy&?^%p󚛴m`?Hws=ÎxDϋFfši)Oi:t5eO٧&Oo[~rn|X[ɦΊƘΧtovM/;2L:i|:jZkϡG>zuJ9qn3`_@Z|{1[-r–}V*:;$/"d3dBOQD&Jf3SD 1* QQ%ztb DoKR%l')sGJRv2­FJp8Lsc~82# *p`8-@3e9=3n`EXB<: 6X-lP LjQS 8]:'CWu=|`=愄cMVeّrSSW] u 4b vCS%SM |9^q SW!KXa)ه!X≫s1X9-53I.XYnep,YiqP86&ei^.裑>6朙n駡Z\ՐFl謒ji.N᎛ծ[\ /O\o!9)1\9a8AI/OoAՑ 8_\iq]q߁OtO^o硏^驯#y^==W xkO_}2j_(rwݏ"= t#c>@|Q:2 ")H &X0Ȕ OX jB̪#p*^W!60̏ 7^kYaH#:Š9cF8-B$ uL"h @1s$ @5>G ďl`48i2t4@,E A*h18A hI@aÐR$jqt+JIWAOT]X\d'MIEo*Z /"o%œJDȘLeZΌg`Ͱ1aY16 V9!ϐLNj% (Nܔ"ppА*X lS bB "uTHe҇GϪ/ S0k1@(.{&5P𵔱]y) Ua7u&l/8d׀d@W;;Ch۪PfA DZˏ%oY0,Ց5el@biE sWu-} )[]*%@@2]d^xXj/EJ_u<֢PPyơ7h!Vai"H!\&#+%4m um@XRv*pv;OҺ8 l]#nG$*vh/S`d! Kv\! KxhdnYw_1G`9 T@ی5HoWjf^ @äsۣ̔OQ4lګ@ьKlNn4V=7pVDSa<,MqNt-(w08:\vve҅yՆHF$;8nރB 4z|v {{F3 C;)-GVƖ𔋹ins[Je.|NpSѣܼ7PxW'"+Wu9|~2%_'@xPzv}{uF/e;x7>ad"/9"^яͤcm&{zؓcVbo[Ѫ'Q*I<#펏Vޏɞ꼲ABH)ٚˢOxpOڌh-:*$#àzpnB "]d ]ALfpOE]0Ų) : p}wfELFpP1m@8 G, ꈎD"8q,Rnyldu rofHZD*V[Ѕ-ԥH2 SHLR#n%92Zd`VE)#VW3% GI)+ ^P*q*Kv 1PT2~o~,r-A-KF+IFxC`1q,20Sa0cM"s0ub.%/,/s19,3:34E4TQ$3M(ҙ033Yj3Es5m6q3755H61`48839s9993:s:::3;s;;;3<3;<3=s=ٳ==3>s>>>3?s?35?4@t@ yʓ?4AtAAA!<@)B-BߒMQy 1sk4BIDMDQ4E4<·:?C͎} Fm@tyL3Ry2C-G>Dd&)PDUJJ4KW,*{tN(-Lj^TPFt#%D'}z%L-Lהڴ:N&NKEN##7P+Qk┭d>*ZR%D5LO#OAMˊDhvy xdz1^I VLc]CKuXXE"JN*jPIWq G3aVJ Fg$Z%W7LZI3I[b\2% Ն̵(K,PQ_%U\uD^=AF a_?GDK^G{$F'VgV')8xP zf,GXa6fevfY*Gd5, Śs g׵RgoVG d ,g l0՘Z,"d5e6FWab}iV5H6rb!p@eIdҁ pQR7'7]gEdm" GwJXfYu]7fm6h|tӵ)$.QV-j]Nc1Nm7Or62jx!k\O/-1x 7yffh ƗFAo}wDzxSce(+wp X$sBdP7N+ 1x EHg*J_MM4v],XOyy##2*zzyNaX^nz[h4 bx0%ws8iw\(#HXOWCֶzÉ. ^j8h }-Q2x@}ІoT1тV `Nc&B\9.b4Nc pjlzL%=Tsx4rc76vj =nڇ(TTeQA9SKf q5Ҿ.# 71x[`al;”#=l^Fq^b^[P TyfOa.|{R5ŲWaț-"ߚ obm$ Tddx2#ZHw>eo#)&LfU5+tVHX9==I9XШ,Zw NXYe7 ,[jUMF*J:/rz]zZEдe: (ZPQ:.6"#Ӏ'I 'a-kl!+Y]Q#0ٹf4  8wGژZ6Co--#8e X?z)CZanL8;gJIU\ {JgYIn];Ҩ5jOvㄱSQ|uLgh=Ӗ;y2[;~M>;F`Xⶡԝ:0 Uސa*ݛ{5[ Uz'Yep(6|aK>NYZyZ 6bmwluxՏ}LOE.JTjwVY 3!v}b q8ÝÃ"džUAQ¥ʃ$ aZdlC?]/wAq<J/1;yK1< K!kY{\KqZU{U| x}aۚI\8mŀ1ҁ{`.<aKu/Z33Vփ{+%k"EuBp+]? nCt]*Ybu|۹D2@ĻNB$ :E6.cPn_eĢFl1!Gu/7ۓe>u>~$d&1_E<]am^uDxl)lWavߝI߱GQOIAz?Z իw^BF. Ch4" Q$.XFX6,Cb%#xY2+4YT8,0T\$}-T]IYH8ulnTi  \@Z$N` @]~.\e=>>B>&TrUMP< ||ӧ#m''/03JRR$H TcF5ČI.OY <H 43Q4I+6{(L`d&Q>K,Z4'B3x#xT)H/ dV#*<_L|2BVӝBͫw/_ 7_o#Nx1ƎGʖ/]y3&Iy4U04zétb-{vԴSvy7޾_,CK}|9kRP2~@U'ڃ"ջ܆O~=Ë/> W/p_I~NMaA brء"^stC';Ñ(/3X7☣;أ?CYG"K2ASRYWb[r٥_MYgb٦osew♧BPJZMk֙2ڨF#|:g۞LⲤn[Tb1x*$馈Bڪk^,Gt$IT1A$$V]Q15 L?ɨmh tIk#-RF|-ZG*}1'4ʪۯBIk_OIka (khTb@Z$v @sd# ^-,!\2_ͪ\\zY9ۤ/G#q {Ol s iM3Tg"`!e0I7{Gwip״! (X%rAw\^ Űj~v )@-ƌG޼駣:DMyQfuĖqmIx>6};&#y131+O(P,gG~K 䎿}|`wBy8⬀ V@Z %Xār a0BZaxS [BY/OrB *P@36NŇZ) %ľuo8:n0` TƼBy-#ؕ BK28 c#,P [=2vcgt9"H : ;W 0sɠF@E>a/$4RϔnBqAiVe41/ T *|!/{F0\aC!nb#6&DtLF%0 &DXZ* uj>)ೣ0iSpJ$kR< kE@L eU +\t\u w)bpq&)aWxǒ]E J,fj]쮴'2_S`\4}+g`;8bV݁"%6=p 9MfA]/|'KF< 'M,5CIEOQ^%++]*d(@>d)k0EZg1C_4-L9y̺5ʬu5T]ܸnx.j:q@-CgzmfZV=H,S4wc\m4kCTf&]@#pxݔ\Ѥh'T.(I H@ymשVk23DXֺ`Fj#uxnsiLB>ULc*z§}q$k͡'Rá_H> -k^v]!cN!cD =g"*l$/os B.t١y(>Xc%LQy4F~BRX$\u^Qáq ?tĂ/TKL U@$_+ju_` _ J_ꠕ_^iUdB ]"a*a[ .J2CEvFxu|aa ~E1*ERaƇ}aaO( !"b"*"2b#:"!J%bb&j&rb'z'b((b))b**b++b,,b--"V."*~ha(>0v0CGFxGyAߡ/b5"a`M K"X gJ2968E1`\A,u0#i( qHGEԊ5*$)Rɴ <tc Ф^mEY=`\$u㮀d^#sĤg4_w`IEDU:CB.O~bn\NUլܽ>C\VFS’>BSJ&aK>TT\O*i@XNO?TZ A3:0@S$P& %eV$[0!Y%&оd^6[cc:MǙ $c&W:Zj)_/&ة_ɑRN lQnɂ R@UiB~5fu u& .Q >8^s Y-Ke_zy}!条Ɲ=Dg&(U(Ġj@ՂnpzRԔ[AI@Dn5MSjT gi}!u(&b8Bi?%ag偨U3(@OM%^h%Ðf,ƑR YIRvn츒IV!(U[DLJ(ĬaFzԘjT항TPYQSaAT5&ڈv螒Ɋb(fU-ӜG Rl1)F$_8jTi^J6& U}z $Tf#QDinStfj?< Ubw)x kYoqC`O`zɉZl+)Vn*qRjhVcv!jkfkJ+[:֓Hd18 ^G{)jَmgesxY6YpYC10_"2nۛDu(2lDI(flXҜEЗ|IHŗk]jM8` 6Y:Iaw8Ё'd -G|\OrJKwuS|.y* 9ť_zYҭvD l0 1~%-XE)[[ԞH:_Uzjh+rm\L*:Y*en#(^\FŪ٥ߔ[mR iImݳa-*=, GF9e"]I6Hoz-WD֠vIci `/&mmfxLoͯ¯G%]5\]z@LЪ1#P(Cm(\ٍpOmI,^!Q^bFIj48jo=yEiyF-TnRr*1b.' 3qg 0%񥊹n_@W$\/;P%n y` ٟ)} ]-_ Qm7r0#%o<rc9f$_fkAr4 JBS ;pre*&r!rr h),/X*rq]c/H,kaD?8.3B0s44[z.WZ@P67M/K853mI9%; O>s??t@ @tAA#tB+B3tC;CCtDKDStE[EctFkFstG{GtHHtIItJJtKKtLLtMMtNNtOOuP PuQQ#uR+R3uS;SCuTKTSuUt! ,; 'dihlp,ϴ\x/^ERԎȤrlsZlK2ڰxL.r) `4x37Py\9`a\>\mo~U1} >p\mH\ Y]\ ҽׁ,>r~V=8 0y`C],9z&HjRPƏwȓ(x\_(cxL@|pɳ 4 BPrQbeǠ) 0m -:TYZbK[ܻ$zH54sH M i FF";4UYΠCMӨS^ͺװc˞M۸sͻ Nȓ+_μA8:;@TO:dR>—9`I*ὪJ5?tDI߀ SL]=` N{t@}hIP~y("0pȅ1p#^%-ƨB&>\& $㏣-^$@* $"8Wc:8 ԓG \Y9N68Cexa-Y B Zz4Y RP]xP$Up|j,V: (u*ꨤjꩨꪬ꫰*무j뭸뮼믳n [QLAh, rn0ǂCA,{@N2ڗw>qAIh hV_S[-O+cS+6D,Ik#jH,&"U{! SuTKnf } q6}K Laz0%%S+j?3rLvҁkXvzõ{AXK?X@B(t:M=PaGRlp-tmx|߀.Ǜi{.%uwʅv`w=ﵤ3D-C<9:}'{!ۗZyQ t Fۖ%2y›f;RҨ|FQ~V:#2¤ a,[&<,-~o|>#fW` b$q.#2^x$5)-{ lFto33H(L W0 gH8̡rD`-G*ap0~J+9/R:"^`0CG!ŻP^nr-c"n ]6(}WВƷ|< "2%=u 9'/ ȱ$ x] ,d CLFSTJ4ƫnEQ<=.B/rт64'Y{'DPbTMS?TgS߲,3};b&5IrL:vzp"ZuAA9G\g]pbټ>͖o.ְK8՜R!`0I9HܛR=㓡ZMT 9M4AHP5K_eFx+6K"cK\MZf|2uHEpkN~ZVZͬf7z hGKҚPXָ8%8VqiH, ny q*n p:hKr\vYl;ݲ edV-Co D3,NYO6{r X.֣RPmeO*e7UT(byFmP93*H_|FNНjhEo&(G .Y5$?U}kK?͌yG E HػK[W ӭYD^U^S4F [fc'h}n{MrRu-6>KckaK[!C9T>S]Ɣ^rV4a_Zt`趩 4vݨ 3hs{Lw?uy6v} ,eQ47TW/AXOnʨʋ{|gkm#-kUיWÖTkc][\d,IxϻOx@;1l"[GX@2F%-jۇw쨠 ӧmЙpWjVQLiCǵ޷z'B~>r_Uo1zV\t~!2Wn U{H0ϕAɯjJMO?a+cT?oNwK##@C$Uv+DAV*v!#}IW+Bzf#ߔ6Px"8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Yy 9 9nW8uّ Ґl&3"]$ƒ029":BxY[Y 'pԑj<:@?p0ܤM})DY .Xɕ!xaO c'ymoneFJ2(ٔOi<"`ԕ"/9)A;Ye[ŒD[Ǒ2Ң9 }LH&pM FL iygd0IdbdyÙ{2Y\)JYyE#l20` IzÖfi֑ݳDWLbae0,Ie'%Dh6J@e ٝ)9ٓ!Z, =ʓMnFi&DMsIp5cct *5Tg 1 ɹ`e*?g{2)fD:}1M@iI: +]iVz"JGjW0cZzϒQS[KĢ c lf!0U/ ]z.J~5j%ɨ4ʓy.)RY$h`ndwzIy .|*0Q,u$`*{&YvZ4UZSą&Z9I:C!u o$ =~JʫБbrӭ|t[q:ĩ:WzV`g)g,]鬷0`>rJTj eܚugqQ=0`b9`PC7ʑ:-zqS`qZK1"K7Hֳ19=ifD=1e˪J2' ʰ^K6nTb t_fDGκL)I=fCsqIIQI9[VATj0Y;:iZ$Eh h4͚vɲAh[@wK_ۺ& &(i9 J\'ѻ$ˑ*(+ڲʃۻuIJg:؛/9eዼ{iՕiĺ! ɻn Rv+Ws{pp'XFҶۯ{۟~SKk@:,ר,׽d ,p Z{|  ˿:C`;7 y: ̡]I3KA9&S9[g7|Z&U:kApRǾ}/,Ť9)uV;|3i9i[ ?=u$nH] TFڑP-k%jLWdlayJzDB@ʺf&x XɁ,,p?̦yHL:R*G=<kHaʑ () (l1f.Ptq]ɫu٬K@< z( Q}P4fGXv̔ c }lh& !Aɼ)6IpX4p/9 U6)rE9L$6lj&*,B.T+@,v*%)*r4¿oJ- *[,-˝0:+& cջpV&HX[*ץބW19 Cl*M"7(kme@߶C)V{DЀ tf@0pCAIc6K- y|H*7RH)VԯU EʰӾkd^{1<#af@r܊82O Y<2ɻÀ儆5`{dw K`-dmhlp-tmx wnJ02_p]5ô1@7Vwsp=>"ʉ^o_H.0c~!L p |Z..6EnC")0'΅7AZ?iʷTMF tW_=,C=8[T=EEuC[P B+ w.5Nq ϙҔeRЁv@{u8̡w@ H"HLD;|@jeeZkb<`z_iA\/1 tg" he+G<;)\@(Gk~k@쵃>P0#@0=r>&'ieH'y,}K)%2@A! 衘1a$3g>= $2œ14niN E'"0."Fم~ @CB'G)cYP(m@h4om-LP|~ 𠣦eHGRVJ(Je1)VFΝr*nt/ Pw TVca&ԤT@vP"ZU\5lvnծv -넌*V.FEѐښ.έ1FpGfҵ^Z@IA::d'KZͬf7zD)n.J8g@k2>Wz D4oc-^޸˕AK4ۺd[G'%4ŭ yH>JPvJFڃ?Mh.Iۂ&;KbΔ>vۃ`XZE>yIh˜K̡j`ӹ $ s%)rR3if@͊N$ڀBeTZfwGL"HN&;PLe8Չ+Ev25c0dy_6 [ 9&,rĐ2KB %Ȅ`]M׺ZG؃"D{ix!KK 'FLrl}`[;uӣr%&b`Y=4hV}*?P؅WcK'(鿄B[^ǜc58l z:wLb掷Mzη~f7h JMaXF"5]\n- PG9s2H~]ۮqK

tnQҗ!IU_J Nm~;%>VAP5וaW3{wZ<{ (&cS8N#}7Cn 5!*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Y2 ِRyّ "9$Y&y(*,ْ.I 9294Y6bD1y<ٓ>5P/9DYFy-9!!i ĔPR9iu ; ^`IT9dYfJّ7!J{dXđefZ,.'!՗%){uA u7{CIf%tbf)gٙT{-#fSi {ta6. )&q%qf)gA$`7əYy*)|в%>9@CU~eNƧ!nd#he#5<-f])z8 g"9D2vu1Y@vbp *Rywq0 եHPz8J <ʣ{BJ]itUJv`dd7ԤU&YS^ Uz)3iYZ8jv=ڦnz?ڑǰ-;TH+Ha#p.SeӧS9P,䞃j:`l>usǂM&]6:0kD%jAZ{sʛcr8r&zwI0v]m|"m [k.{\rk MZW#0⻛8Kڽ {uxG*6ZnS[AY-@ܒ+亳i -ԯٯy|ByUy ]@ӛ2 &G).¡3mZh,3Þ>@,P̠D0  7;kt;h/0TkʰƩl})3xY $77ȱz,X&ā$B\Ypc43@PX&!!,6`HEuhl^muenpH, D<V5]$D,IF9$Szm+7j&K~wG7: clO& `7(d|:U;+5&lsY\n7jO ª@V6d7]{76 h\5  Ak_(!`j,#%ŋJƁ%V:byր7T \pPcNH ]0yуL 4 P`-b$T#dmڵT ɌׯκdU#EY D>2>jژ_Lبt LbIJJv>1J32Yi=D' NG:FSLmVZYh1QZz zKOU/a8`7 F^Ytv'.}fP"!<`IJya,FrBl,ރ%m7auUb!, 'dihlW,_g{&YcpH,HV`PШtJZجvzX\yImZ3h~yNf8k?[f~>*[N 6l1Ŏ3i^K 1,ˊH3햅|Dzb "684 iqޙb~p%ŠqǬ(2Y 16YV$G;Wp$6 AFЏ#wEH74 QU2$?K&4&F %xFRieS&ou 0 埂 \fIe&T44IjZ̦6nz 8Iro sy= 7Q60Tj=[ ̐E2F;eD|m] <n)QyԗD'sc@+ibFÞ$t " J )d@00kV@  Z*a$ޅlBB* J-b^z  "K!b`@,5qj {y/8x(FK0 KZͬf7z hGKҚVKhTkQi⬩PC8Mn+~v4sd:aNX#JoB@&͸ JŶ\|ZO{#՗4nR#Б^?8^RϚ AT:3Ϫ-Qʇ_N]#k'qT]Vyѱv'V~NB ~krr=d[V\=%K BױʸL"HN&;P|6&GQc&V4zӥlacIlN4/d5>OdY-Sizy]p\>SݡxCD鴪014e X(;7&f' "Ko,=>E1f P5Rm|ֵm\s\k65D̬ix= ) W6LH*{&t1Dm`Mzη~!cΦcer?@r߅=i*ش3+q^;Ul^w.p$DrRFzY" 滘$ .aa4oG9?tQupVT` 4us;#MSii]*Tb`4غv'@69E. ;񐏼'O[ϼ7sL;a0K`"|>G@9~PixR XNȓ؇LA @"Tb\N0#hP yЧ_wT ®4u1'b](vcpx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8x w蘎ꨎeю(xHhp3pB%Jw8#Y&#K7iJIUr<90fl=XY~AY('T);5ɔ9\7 QX W~1#@Xr/I9QaYG"yKIVՐvn@p,GYmɠ!1RZgfrCV@A.6Wrx*j$T~-[HW1$B̉-RQcmsB?&0"laj3&BzhXbx=&%Zr ] uZwyJ{}:ZZzؖoNe,`X<쒀az3O1pFʣ0Y2)QzG.: Q`j"R=a{ Vf)2 VUURf%i4J g^i>9劄0a#B! :64R]Ê1@e8XP2Kݻx˷߿ LÈ+^̸ǐ#KL˘3k̹4t@8 |VvC`SY@Sm35Y 8NJ?K?vQPe_70K&WsCWod5 gUq@lG,`P,lvVK%Tp"8 6h%SDe@St0pxp^!T> Y'fぇ"DbfP;AӓF`a@s20%L '̬YTh6DՅ)蠄j衈&袌6裐F*餔Vj饘f馜vi h\Mz 8]^#f`W" EsMʇMw̷>E|Z{X]L L ,l]dͱi)ֶtJz8 nW" )=;*{BA ]㒵g X>lW9)K.EqS~!;lGK#Ԧ"0C_cR QMUUNYs*GU'mښz$ji] PG-TWmXg\w`-dm h'㿭v6: `x: #jB 9K) Ιo-Q~zƌ.#yO:~ ʳ3qӞ_;,j{/oI+QO=1!n<j::;?"߃Jm~ HL@n-zw(Cqjf06hj@?ït8QPRxL8XKbZV3jIJPeXYQBT;K}k9p‐,jXE w!Jխ`]\`סY T#1 ;˜30)a&Qހe)`#LTTLH^d~'#Ҁ\nfX]gHҼh/F~BlDdF%4Fr2fU̥%DԲȖT.8-." 0Cꦉ@83ʹ7:>8{&8M+!eaG*EY*hMZֶp\J׺Y@`}Ri[YɌl&8MqSŒ2A F9 wH= XğeQ$2EQ{^5XtD k;[^7\jKe2|ϸR*x=t VʥҮ^7x7uکm[&q,%iI/l M}43ܠoaK_J [ΰ7{ GKs+JUm H&5EG68myKAmJO]ʵi-,EAc Hn.j՚iM%YmOR\!ne0i-e8 c}Tz߫ g]nJZ`8&'KY -\Lp’Ҙδ7N{ӠGMRs=OXU3ig09SLZqGjoPPaUy,̿6 ըhP<^$Q*tn9DkRj&8yN]XyP]Rûט6nSi*MMO;UhaQV miw@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXy VM64^rq|ezuAuA,trOlq!%#wOB6&Q-U%);8)%$YQHIh!/c 68Z3Wok"RH,sU?=sLl=LgtQdfZL;ehH|t(cm|f`Aq+p2n(2HU(5ԧ¿-G)-*+1f(l #(  :](zP1u.`suEL`<3a0c$r2%3#CwF8vH׀ƀ}$95%O Tuaի0h*DuzhꀅfO Hw+ ܛn%*e۟t3r(\E⸧RPI j\(d7AQP.FfP06Tt)۸p _Q>$H0ad=sKdrѲWm56VFd;S?ͯa&iRItGJ#U~9 *f6]@40?L՞!b*K]zRQڳơ.1#-[s568̡w@ H"HL&B9 TmO; E:$)j;a Y`qb$,kd#EPR]ClAa; @k=Bˆ#Yֳ̺q>qR6PA)S4 ʏ_KN.Yvߘ0KėIM(K lN~ @JЂMB%hq#vQپ8dH-d:w(R,CR[ ^1M3kMN̦A2E4 xsaWUHIQ?Ȅ8zjS=pxddeCZL' |="^߉27KI 'J1դ ITAWFP,{Qi6G]clgKͭnw 0@]OCC;EvF.BҘ)teuܱt1Z); ^Z d#73J=2NMU7l2`O/f eϻʱA+`TLȐk&e/D% g(egXCoW}&~I\E_Ú6A. h"]s"x|KtsLZρ+Hk,PL*[Xβ.{`'ˊ )(0@qV'/b׮hnv0P1 q$Q %,aGl*CJH9GM@4K(HP㓒n֎ HI57FeӎdD@i$BNe=,T.xm_l'=_Nu'Mj[ζn{Mn:HT9r?x3OP1~*mAp*zI%,3Sw&y[a RȱI5QҦZ04#M#OלySfZ?E]G3idCy|>FEϩ FjϹ &#M{pNxϻv7P4nQ <|G駊CÇj 6r7(W C( La/%z4lápT9j{8flu[KѾV`l`k+S_mdgOOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx{8Xafhʸ،,h8X[ 8/gfb\bx@\L0bmx.89бhp(a؏hȨxay-ޢ-Ovx:4C*ɌI܅uA.TU}'20$3ْ_[bّ4Y^U;)bP0?YTWQ|bHLy @)<Hb _6I&#J6ɔ߰_3Ty0֢}NoPe˗0h*C%Ο@% BtdҧPn+@BE,B UFKuK,'o @a:*`6 `P߿{ epifC0bKL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Np$cJ*ڌƁ`s~1&fHT8= x`h! _ swO~wyD?ɂ Fxہ̹8H(B!ʧᇯQ 6D}XkwU+ֈZceَ69]!ב4 gDXR"䕕5UXI 5]zy@@ 9 TA*3cdYfa/ L"p)蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤЃ.t~ "Z hQG 5(&FBnɬEɃU*o~SE {{!^ X3L1b/0Qۆ7C5݂9#\SF7O=x ),q[-C9v  wccD IjhWJ{VN#xXcO0Lx8KBH섅AZ( !1൏^%S\e{h`C"aOKx|߀.n'7G.9Fs++AC:mX"az3L'3ŽlQG-$EL44V=.*U"_+5 ͦ;œ /)0R:k~G`R<1ZCMCL47DcT&3A YCUhtU!6APi$cZbk(Z]3)[ °p:P!Q2[n"HL&:PH*ZX̢Eh0ti%g9D u$)(r@Jځ1S0bP` X9 R{4*Ǒ04oZwGjJJEV0)+Qp˖ĎD雦び|F0L)p#eSA4 Z'si7&Yț$ĉJr/LܼS,Z$Ӏ)PBSE.mgxAlɼO#8 ͨF7юz HGJҒ(MJWҖ>$TGV`\ˉx-%L'7qit<ͅMe|cZLx&<ZUZBg޺jT-qd0:>kg5::ad-jzPp a5F{HPV#vW%U$gY7# yZeӳ1hNEj}#j{SQF%BṪꜤ pKMr:Ѝt9ӣlVHtY&\7H5{8BcOț%c {EwP|G cqA[f@FS=h`Ѹ ')cZ3ԡnT~x3 Iq0' '̃6p1̌n pDzc2^p萗&;PL*[Xβe(~s"aV]vY*FC G5r<>sL66&3h%Kc9wat^!rfU.OI%jpP0 TNWz8:iZ5.1 σJM 0(9?''!ſƉ;-P'.>êi6Lx r;KMrNvMo XZcQ8)7:xg m}p5;hR縴V#/q:$.BYrg:)Z^'͗a9怦qKKVccGŶַ{`NhOk{ jηԎߩp%AOjkbKv;%-mAR)Ia8Ӑ剁y!ڻ>ܼ@S?P߈%b-U=$Rt2vBC5/HW~Al| / g{U2 J*i7`5 އ?r+[,8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ6b8Vx蘎3PԨEa9[riksȏ4w2Fk4GKP~:C[+Տ|+(uB%HQ2xrl1ْxAL#(dWNt@$$Q3 ;-B0 )6YWu D@v5DNePCYQ/y(M'nce D37bIVhw/JzXlŔշVW?븓Ŗl.{gtW%@>?9y06~Y|"#UKXa OfiLi4|RbnXMIL|%9Q|9B$YU :9wIRYlds3uY>#)/F}}cldUɖI7E8s'/zs ˂a>y*BC4-; J*(NL4ةp i91ѭLD(@bܞ#ڴ }fN.y9G\7iH"ʨ)eRMNWVqͩTieUg-4ҫhMZֶp\J׺xͫ^׾VN*ƬX4 B脬,`1Ʀ%RY -/OzֲdjW-/}U׎9JuKbTEDH\\گ ,K2YwtK][5Z~a]\ǀߖ׏XRͯ~LN(}k$!, g4!çdžîCq sd5q"&(iT̕8>#muܽޓq,Z[Z"oO p շ&;{9TZ+ho%wF3`G28LJ7ςQn{猽6oVD3UN k}P.TcF[Ҙδ7N{ӠGMRԨNa2x9\u𑲆a3כ3Tg|_pAtCeKgҖhNU_^![n)ͯ 0{w5'N[ϸ7{ GN\= |&`؉饚3sx]%h:-\^Bm$iX5ЄF4 E*.eJB&G; q^+_h؆F,IlװϵMHqs :rMmf”}\҉ E,ɍ?|E)iM%^$khtypBo\}{a׉Mc?sZs%OOЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸX {8Xxبh ؍8Xxuꅎ8X8Ȍqي塚(i a0hT A_ 9*,9U0192)4I<븊  ip)ْNPaU M9ȓHiDXy0h+IJcي*WKli@z;4XxjY)va cP{ɗ$9A-ٙѨ I(?]yvFvx8[Qi+I@9 `i&I$yitAh3)@I9 `\0Tɘ1I9V0jIi: m9?H&%9@ljVj )H<:Zj1QɢJ9=Z' H*L:.Zgi(Y3*H-@ sZ)8z8ڥ^l- [rK*o] i|ڠ ^A:בg99CXImz:IJj3!ZI7zRi_:(}C )T`i0YExG -0`IJQz9pZi ٭Xy*蚎`YMj7V کIJʙ ZUj%"⚰(2˥dz੎9zʰj*ڲ,yj0$`,L Ni D{zذ"{?N:AB)+$J럔%ڗ\*=[%ʝSK٠[&ٝĹL{COxD­ڵidڥjn9Mukwk' ٸ|*ٓK8xZk ˱SIቝ:˹K բVzpś ):w詎۽My{⺽k(ٛ똸;ۘz\iRe>ھx |y ܽ kArG+| |) ;3I!*t9k9k KåHG\@ zP,{ ±i\ڡ$[ )LlIʥY% {Q%Y;zav܍jPƜDjj|8Qۋkp\È,jrY¢Zj*ܿ<2wGjʫ*R˳lk˺̸˻lu\[Jͳ J@Ozg[ί̺㪴d¼̌u)LsJ\J̛s[kEˊVzɱm MܟۛʺsȴܪuV19ř\Y h ИY : ӧ+`Bͣ{}!:UP8s㙗rg( ,J)ɒ]GNևסRQWJ#Qf0fҧeh^~}B2PGwr d)֗(.&B}An7@+z'RSc0D-㚾4狀d+PP Hg(r!>N!zݵ"뱞}H?l>}} ?C~~^~$E0$neq Z'$>^q{ ~d4JNN}G6Q}+@o}: __Q2֗d۞?"P2Г0UP}PH>? {0L@}b'PPO>*b3nZ\ط}BpG?7ATyu}mG%SQ=r>lQ?ۧoo+C}C^pf`ʲ`]`r"B܃CEӮOt+22d"M&2{qIM2n1(ؐHC"49)BY ׷X[U4}jӯxЯeJx se  GqI #rH\LNUɭ<grwpLaP.fGФ**4Ɔ.**.:*/37 >* `=Z" y2f]63po^CӧQVukׯS׍HUd$ (P!•\9Ϗ+DV[rgp$YZϙ[ o˽;'N{ks:۝:rV^(E Ȳ+ XL@(Ћ2ĞqB/dΚ۪`,Gc ykeFnB " *؀ R!,#M"[ł&zʼnF+#/ &OF.Mı-t502ϰ" *'p.`Ґ }7D.{.;CZ2`>^ʒJ;ߺI8(%}EcMVeaSV*J b\/?iEZ]Rԩa'o]MfE\6ZnDž֢%l)O8RkBUA{$*/[ت*ɔK3bS*OF[Ik`P$lvRbxHU4SX矁Xgv۰$ݞxIJd,fŝ(/ƠWH9la:}['z%Uܶ/VZ}4[^b-p͸*dmIk|_*y=$hna\8&mcy I?Zy81])kzWZm=mr#dRwm#;MUUJJ^dyw%΀F_B䡉4шؖ uYidA nƢ{BWFI 64Dا{= nx`c$(R,j4p8LRDd٫ܼ9A5S|04815g"3.0  U(Vn Y"dxE5o“F9n# (@pehC2dD),PFRN40з t+a.E '{2@\+jyD%mwR*:&L2!t5:k>IX|4v5NbXΡH?^h'UG nlEڳ@B x1>bB>l)Jࠊ>zEc*:^jѝE OA qg4QԱ*7hK|_#N&P5[N3U֔SX3 kM+8sӰ 0$]{j+i <)=Rz\6]_*WT~@/-!qlfuWm?ڧ0XJ5iQ+Yp]a6Zֳmq[R~Z#v\ -iyZ.DZlsܦvƵliz]n׳ѝ]ZZ6ui^f2|旿Ux8K  vgJO1a o #MO q:1 "H"#2b߂wbQMcłCX>\rMFLJGG8@$l$q9-`{36Mp3wCOKAбQGXE_`*; od%f ǦTp[W૲1$Er$71N2%/q/hqd2CQ#$2j8PDRD)`҂^TEXD""l`hC^*$r-ْLR!#IJ`6-.fZnкNs!/(tr.ykp@Ɋb L0P  AKr12a2"tnx o贱-M4Q32PE X52# 7G'x6k6]}QSw͒AؑH02;6pX03'-aƱZFG!uHsR=3>l5ϳ D3y7-GXS䌧752CSArO,E`O$@Eи@- [>60n22ͥ*) ac:P4G$G4HCB/m:ə(nsI}sklTST(@3N iT20 B -̀G"q*bTF-(oLZr n-Mﮗ \tBo\ٞ*j55SH!5ROH-H ѨŨ6m' KS*Vknk6oel=VE: `DB@p*TNJm9+h8~ `QEn$nݞ85S.t[uMOA6pD,.G2>ΌpbyeVoo5OBq5{EplBE&zR`T}ry(%Nh`_6$VMGF' OXu4H\DߪBT@<.Dmh)w:*+K#Gygn7Ue_z4:=F qmaWF]$XVTȳbkX h IASГV =9++8S$66>eʸzAJxkxϪ `u"r]u8ׅc-g\)n|qXˇYNs>y*Yk0rA6ORBAFx+R*ajJ^9XJ?pD0ivkzl lӪ4• w9mK9g.,jbж4,ٴ-œOkHb qxW 4 i 5-ryA "VfI2iI;~`\|w8}Tz"H/7{A.C) #W lƨ`K%(oThJInФjtAdǞZ,+Mމ=D!J,NqAtLyd JNѸAd' N~ZCI<\/jߓ |K{7~\WU pBj6jt❊U#+ɭ>?U1=P~HU1@WG\ KfɜL!h<"%|Bjb-Za1l>ѭ~9n=x zLP"&*.26:>BFJNRVZ^J*\tb~\H\0 `BJ6&+/37;?CyZ_cgk+j^\8l:\[J\t6x> 4&"LxgZCBH*C$bhBƎ- X C-|&ODo%~43P!͚6oðk) *t(ѢF"MtЖNys̜Vbڇ!= +v,ٲfϢMv-۶n+w.ݺvͫw/߾~,x0|Hx1ƎC,y2ʖ/cάy3Ξ'4,z4ҦO3֮_Î-{6ġSέ{7K b"D6ΟCvtZoٿGܮU]"6\xt4'@)8IנBg)8Igz($x!wqt0%lb!/>$~"JB~H2z"p0"& t@?aUAȔW\e HP]ޗ&9أ$`jpJ#4c4H94`܋Mʗb6%By3G^bA2+)! 2(+t:D)97yةz꨿ϥx(]&" 'p`aثr-i$kr̶8Vz F",8{o#zKO(J-h0" di w"Y6B%$ ZCiG\dÅG"h3 lz*C]tfZb͊;9L3 CB"| 2q6b^& Tҷ ӥF6T?buZ+ˈ` 'OsڏIȯ{F#R?P@=l`@r`I@F0-shFBWaqnzJA=pbiZSHӑdԔT-;`(bebX 8@^vzYPG9&+ًe<$&IA$K[RP$8ҏziռc~ )wRCiMkSTTDTl,Q-AD8!8%͔%VX@*Oᕰ:U;&!Q^i7)݉Zz<5YY+'v13!F .q?SL.C16n1#aE\Reb+ܦc9Fn$DVumsRK-m < aκ]ŋ `-U]=cD,У 7Օ$ =4D*J\j5kTW8xlX$w1!Lق08sk[+cǵD9 *ɷ3MpO׵*Eo2%,=/w^*ӗД17wrFxBrrf(ysIAgF ӣNwxBy.B+"άQ6Yzh(ᓤ%{%=v,IS(ыRljC#6gq?ٕ6NF`!\imnm|ъBD^3 Js^rOnynۛ{9- ",}y,7"qV yI6\Albd4Q6^5u.QӞk8A =vd5YD,Q}cB^=%H7FoX}:$~Tz/ A n:Yfg*fٞ]jWS Em_Ζ"c{vDc:vf]a ۶P;r"w!̟̈́=xXYbHz֋o|l}}@rfs7s|_چD77v#"xz]"O-L? }O3>'FNe`$̡ѥPˊ^AE`h XDE;] թFLlj!K<_ l$rm`LYa-%hJqtY!M%|=MZP,"ߠ!}۾^x]8zHalH"P0Kٹ"B2B i^8'Վ]"I(B& q:uE %ԋ((] |H .>F, c0^F.ݶʨ ]S⼨%)Q*H@ )F *1&cb ˛b44Q5 d#} ?)ģȉx32£LjIot#2=,,_y(dyУ@.9Z:*c-ED˩Ȇu O͍` @~J\"AQP+(AKb ]r  cS:ed#< Dd Q U}TQUdQZe;NVNe#ח?QX*,U!]fexbvi2%K0^pecW4XHzHX!YSSFeik>:%lZ) mi, nmEjp`k&;o2Bwԡrs\rV&EB"xH,pgwqVgxHĥx:FCE',FgYpwҧg{g~~',MpguxT"h*2h:BhJRhZbh&[[rhz臂h舒h艢h芲hhajh~8hhi ʨE{iS0 BiJRiZrTZ0'hF.-ޅ*2œbiijLTRYU䩡A Pf8 #`~=䘋\Q[9gX|8 z`&iꩢji^BxyV !*BWل0#*l pX4- /1cl+vvX*Bn祎PL_:z뷂k+%dιjAθ+M͸JMH"$QAcQ봦67`Md܆LQ=p{i^P-,zN"FkɚɢFk"#"rfKUS%Ѓ"X_),ϖ O4$_J,>4L[rӺCL6\Ǧ{f9l ,!@HP$ظ-ea( U)IqQcj6ɦ2n:nk%ԚMlj3.g*2%&u$UE2bBk#tӢ=ZKm9+Z8Gtm}YQYNڪOzr,H)ޗb&S)dU@<~"(oFnRiX&lnnS&$B@p(1E# Bߒ:v Rhpn/mKު\ ^ 0ہ_ @~o&o+knE@]b)Za}ᙁ!tF%OZsp i[qߖgX}˦%jڝT &ݗ Y33q))__Ś"މqZre&ک%#nY%mk9>B]V/!Wo%Ұ@4H#X_%8ŸsRR'';(2*s=sZUeŴT\Í1iE@;0/B2$sV ɟ^pE38WD4c4G&tH76u24P sM3O"ݒsP PCʎ<NeSpULjB#[YË3GatSsvsMVP\?#*M55'X12Q#vb'v>$ +4!߄\eB0OEBŖ1Fu^3B[J`\Υ51+o >M-YU "pS3u2%Xaa+sC7*36QGuT7n#!*$ɪZ6wU5k1Ūk3foO+wnOmdO8<7LH"dJFF+V ט%s#sGxN95ohb04Ke=l(cc1pB v )ME+@(Ɠ+.?7:0Ю'$kyfKg?ӎ2$ @hfy3NO*%8#ɮMgq0ɵ]֥`Kirkۃ3AtlH/^pMi3-жy9vrZ % ;.i1z;ꢏL ~w\s{CXM{C{{J{cK(ti%[x{;s_'dz;;[P{6żX,a{;ç"S|[c|3s|ȓ|ɛɣ|ʫʳ|˻||||} }#}+3};C}KS}[c}ks}{׃}؋ؓ}ٛ٣}ګڳ}ۻ}}}}~ ~#~+3~;C~KS~[c~ks~{~~~~~~~~ #+3;CKS[cks{$+'~PdF{GdylZ zgC˸ l[]@ڳGZ)#>D 0MƱՅud5U8ȝ̏[CAxD<H28z:esh6 dG T#XL^+pM9^!3%45C& CF'*!(2L* ӯ0H# M3WѦ] NOPDZV\ԣ[W(;3<˳dnopqrstuvwxyzA ,=&H (!&ϖ*i!Q|y,x*8 @鑲!u8"VeQi V<o tӤKpjYj32 8UC:W>)QeJ+҃`H i7lW]y_- 2$+dfOn?/OTB:"g $f JBTQf o~;k4Cvq=`0}& l[Yщ.=iҏn9eMWfcGZgva]{w}=K7td<Ќ &d9 زm=[YC$U6L XͲn]NTU\uzu<6\%q~qHnXQgU|h@FP`q&f*F%:*Sy oqCfJxE,fQ[";0h8F&9I,#pAj> ͨ 5IEBB=Nv*q4>Kf"/oH!αSZr7 "Ql  qI@5b+]JXRҲ6B:CXOX ]4LIE%|uT[ dJIBxKr 9Y6s(ȉ٥01L,y2""(kS\h@&Л%śl@MTAdhCPFt6-!(u13\Š!$&cGEs@K F`*xБR GO k0"q } Im*O'.fqo6N:uyњ:X1Gkek[Vy$k]zWU{WV%la ZVelcX^𯑥le-{YfVlg=YІV%miM{ZԦVemk]ZVmmm{[Vmo}[W%nq{\&Wiens\FWӥnu{]fWnw]W%oy{^Weo{^Wo}{_Wo_X&p |`'X fp`GXp;enlighten-1.11.2/doc/api.rst000066400000000000000000000020621436526347400156370ustar00rootroot00000000000000.. Copyright 2017 - 2021 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten API Reference ============= Classes ------- .. py:module:: enlighten .. autoclass:: Manager(stream=None, counter_class=Counter, **kwargs) :inherited-members: :exclude-members: write, remove .. autoclass:: NotebookManager(stream=None, counter_class=Counter, **kwargs) :inherited-members: :exclude-members: write, remove .. autoclass:: Counter :members: :inherited-members: :exclude-members: elapsed, position .. autoclass:: StatusBar :members: :inherited-members: :exclude-members: elapsed, position .. autoclass:: SubCounter :members: Functions --------- .. autofunction:: enlighten.get_manager(stream=None, counter_class=Counter, **kwargs) Constants --------- .. autoclass:: enlighten.Justifyenlighten-1.11.2/doc/conf.py000066400000000000000000000134071436526347400156400ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Enlighten documentation build configuration file, created by # sphinx-quickstart on Fri Sep 22 12:06:03 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. import os import sys sys.path.insert(0, os.path.abspath('..')) from setup_helpers import get_version # noqa: E402 # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.napoleon'] if os.environ.get('READTHEDOCS') != 'True': extensions.append('sphinxcontrib.spelling') # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General information about the project. project = 'Enlighten' copyright = '2017 - 2022, Avram Lubkin' author = 'Avram Lubkin' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = get_version('../enlighten/__init__.py') # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False autodoc_mock_imports = ["IPython"] # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'sphinx_rtd_theme' # if os.environ.get('READTHEDOCS') == 'True': # html_theme = 'default' # else: # try: # import sphinx_rtd_theme # html_theme = 'sphinx_rtd_theme' # except ImportError: # pass # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # 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'] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars # html_sidebars = { # '**': [ # 'about.html', # 'navigation.html', # 'relations.html', # needs 'show_related': True theme option to display # 'searchbox.html', # 'donate.html', # ] # } # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'Enlightendoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'Enlighten.tex', 'Enlighten Documentation', 'Avram Lubkin', 'manual'), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'enlighten', 'Enlighten Documentation', [author], 1) ] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'Enlighten', 'Enlighten Documentation', author, 'Enlighten', 'One line description of project.', 'Miscellaneous'), ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/3', None), 'prefixed': ('https://prefixed.readthedocs.io/en/stable', None) } enlighten-1.11.2/doc/docutils.conf000066400000000000000000000000321436526347400170240ustar00rootroot00000000000000[parsers] smart_quotes: noenlighten-1.11.2/doc/examples.rst000066400000000000000000000242671436526347400167170ustar00rootroot00000000000000.. Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten Examples ======== Basic ----- For a basic status bar, invoke the :py:class:`~enlighten.Counter` class directly. .. code-block:: python import time import enlighten pbar = enlighten.Counter(total=100, desc='Basic', unit='ticks') for num in range(100): time.sleep(0.1) # Simulate work pbar.update() Advanced -------- To maintain multiple progress bars simultaneously or write to the console, a manager is required. Advanced output will only work when the output stream, :py:data:`sys.__stdout__` by default, is attached to a TTY. :py:func:`~enlighten.get_manager` can be used to get a manager instance. It will return a disabled :py:class:`~enlighten.Manager` instance if the stream is not attached to a TTY and an enabled instance if it is. .. code-block:: python import time import enlighten manager = enlighten.get_manager() ticks = manager.counter(total=100, desc='Ticks', unit='ticks') tocks = manager.counter(total=20, desc='Tocks', unit='tocks') for num in range(100): time.sleep(0.1) # Simulate work print(num) ticks.update() if not num % 5: tocks.update() manager.stop() Counters -------- The :py:class:`~enlighten.Counter` class has two output formats, progress bar and counter. The progress bar format is used when a total is not :py:data:`None` and the count is less than the total. If neither of these conditions are met, the counter format is used: .. code-block:: python import time import enlighten counter = enlighten.Counter(desc='Basic', unit='ticks') for num in range(100): time.sleep(0.1) # Simulate work counter.update() Status Bars ----------- Status bars are bars that work similarly to progress similarly to progress bars and counters, but present relatively static information. Status bars are created with :py:meth:`Manager.status_bar `. .. code-block:: python import enlighten import time manager = enlighten.get_manager() status_bar = manager.status_bar('Static Message', color='white_on_red', justify=enlighten.Justify.CENTER) time.sleep(1) status_bar.update('Updated static message') time.sleep(1) Status bars can also use formatting with dynamic variables. .. code-block:: python import enlighten import time manager = enlighten.get_manager() status_format = '{program}{fill}Stage: {stage}{fill} Status {status}' status_bar = manager.status_bar(status_format=status_format, color='bold_slategray', program='Demo', stage='Loading', status='OKAY') time.sleep(1) status_bar.update(stage='Initializing', status='OKAY') time.sleep(1) status_bar.update(status='FAIL') Status bars, like other bars can be pinned. To pin a status bar to the top of all other bars, initialize it before any other bars. To pin a bar to the bottom of the screen, use ``position=1`` when initializing. See :py:class:`~enlighten.StatusBar` for more details. Color ----- Status bars and the bar component of a progress bar can be colored by setting the ``color`` keyword argument. See :ref:`Series Color ` for more information about valid colors. .. code-block:: python import time import enlighten counter = enlighten.Counter(total=100, desc='Colorized', unit='ticks', color='red') for num in range(100): time.sleep(0.1) # Simulate work counter.update() Additionally, any part of the progress bar can be colored using counter :ref:`formatting ` and the `color capabilities `_ of the underlying `Blessed `_ `Terminal `_. .. code-block:: python import enlighten manager = enlighten.get_manager() # Standard bar format std_bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' + \ u'{count:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' # Red text bar_format = manager.term.red(std_bar_format) # Red on white background bar_format = manager.term.red_on_white(std_bar_format) # X11 colors bar_format = manager.term.peru_on_seagreen(std_bar_format) # RBG text bar_format = manager.term.color_rgb(2, 5, 128)(std_bar_format) # RBG background bar_format = manager.term.on_color_rgb(255, 190, 195)(std_bar_format) # RGB text and background bar_format = manager.term.on_color_rgb(255, 190, 195)(std_bar_format) bar_format = manager.term.color_rgb(2, 5, 128)(bar_format) # Apply color to select parts bar_format = manager.term.red(u'{desc}') + u'{desc_pad}' + \ manager.term.blue(u'{percentage:3.0f}%') + u'|{bar}|' # Apply to counter ticks = manager.counter(total=100, desc='Ticks', unit='ticks', bar_format=bar_format) If the ``color`` option is applied to a :py:class:`~enlighten.Counter`, it will override any foreground color applied. Multicolored ------------ The bar component of a progress bar can be multicolored to track multiple categories in a single progress bar. The colors are drawn from right to left in the order they were added. By default, when multicolored progress bars are used, additional fields are available for ``bar_format``: - count_n (:py:class:`int`) - Current value of ``count`` - count_0(:py:class:`int`) - Remaining count after deducting counts for all subcounters - count_00 (:py:class:`int`) - Sum of counts from all subcounters - percentage_n (:py:class:`float`) - Percentage complete - percentage_0(:py:class:`float`) - Remaining percentage after deducting percentages for all subcounters - percentage_00 (:py:class:`float`) - Total of percentages from all subcounters When :py:meth:`add_subcounter` is called with ``all_fields`` set to :py:data:`True`, the subcounter will have the additional fields: - eta_n (:py:class:`str`) - Estimated time to completion - rate_n (:py:class:`float`) - Average increments per second since parent was created More information about ``bar_format`` can be found in the :ref:`Format ` section of the API. One use case for multicolored progress bars is recording the status of a series of tests. In this example, Failures are red, errors are white, and successes are green. The count of each is listed in the progress bar. .. code-block:: python import random import time import enlighten bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' + \ u'S:{count_0:{len_total}d} ' + \ u'F:{count_2:{len_total}d} ' + \ u'E:{count_1:{len_total}d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' success = enlighten.Counter(total=100, desc='Testing', unit='tests', color='green', bar_format=bar_format) errors = success.add_subcounter('white') failures = success.add_subcounter('red') while success.count < 100: time.sleep(random.uniform(0.1, 0.3)) # Random processing time result = random.randint(0, 10) if result == 7: errors.update() if result in (5, 6): failures.update() else: success.update() A more complicated example is recording process start-up. In this case, all items will start red, transition to yellow, and eventually all will be green. The count, percentage, rate, and eta fields are all derived from the second subcounter added. .. code-block:: python import random import time import enlighten services = 100 bar_format = u'{desc}{desc_pad}{percentage_2:3.0f}%|{bar}|' + \ u' {count_2:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta_2}, {rate_2:.2f}{unit_pad}{unit}/s]' initializing = enlighten.Counter(total=services, desc='Starting', unit='services', color='red', bar_format=bar_format) starting = initializing.add_subcounter('yellow') started = initializing.add_subcounter('green', all_fields=True) while started.count < services: remaining = services - initializing.count if remaining: num = random.randint(0, min(4, remaining)) initializing.update(num) ready = initializing.count - initializing.subcount if ready: num = random.randint(0, min(3, ready)) starting.update_from(initializing, num) if starting.count: num = random.randint(0, min(2, starting.count)) started.update_from(starting, num) time.sleep(random.uniform(0.1, 0.5)) # Random processing time Additional Examples ------------------- * :download:`Basic <../examples/basic.py>` - Basic progress bar * :download:`Binary prefixes <../examples/prefixes.py>` - Automatic binary prefixes * :download:`Context manager <../examples/context_manager.py>` - Managers and counters as context managers * :download:`FTP downloader <../examples/ftp_downloader.py>` - Show progress downloading files from FTP * :download:`Floats <../examples/floats.py>` - Support totals and counts that are :py:class:`floats` * :download:`Multicolored <../examples/multicolored.py>` - Multicolored progress bars * :download:`Multiple with logging <../examples/multiple_logging.py>` - Nested progress bars and logging * :download:`Multiprocessing queues <../examples/multiprocessing_queues.py>` - Progress bars with queues for IPC Customization ------------- Enlighten is highly configurable. For information on modifying the output, see the :ref:`Series ` and :ref:`Format ` sections of the :py:class:`~enlighten.Counter` documentation. enlighten-1.11.2/doc/faq.rst000066400000000000000000000114471436526347400156440ustar00rootroot00000000000000.. Copyright 2017 - 2021 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten Frequently Asked Questions ========================== Why is Enlighten called Enlighten? ---------------------------------- A progress bar's purpose is to inform the user about an ongoing process. Enlighten, meaning "to inform", seems a fitting name. (Plus any names related to progress were already taken) Is Windows supported? --------------------- Enlighten has supported Windows since version 1.3.0. Windows does not currently support resizing. Enlighten also works relatively well in Linux-like subsystems for Windows such as `Cygwin `_ or `Windows Subsystem for Linux `_. Is Jupyter Notebooks Supported? ------------------------------- Experimental support for Jupyter notebooks was added in version 1.10.0. Jupyter Notebook support is provide by the :py:class:`~enlighten.NotebookManager` class. If running inside a Jupyter Notebook, :py:func:`~enlighten.get_manager` will return a :py:class:`~enlighten.NotebookManager` instance. There is currently no support for detecting the width of a Jupyter notebook so output width has been set statically to 100 characters. This can be overridden by passing the ``width`` keyword argument to :py:func:`~enlighten.get_manager`. Is PyCharm supported? --------------------- PyCharm uses multiple consoles and the behavior differs depending on how the code is called. Enlighten works natively in the PyCharm command terminal. To use Enlighten with Run or Debug, terminal emulation must be enabled. Navigate to `Run -> Edit Configurations -> Templates -> Python` and select `Emulate terminal in output console`. The PyCharm Python console is currently not supported because :py:data:`sys.stdout` does not reference a valid TTY. .. spelling:: csr eos eol Can you add support for _______ terminal? ----------------------------------------- We are happy to add support for as many terminals as we can. However, not all terminals can be supported. There a few requirements. 1. The terminal must be detectable programmatically We need to be able to identify the terminal in some reasonable way and differentiate it from other terminals. This could be through environment variables, the :py:mod:`platform` module, or some other method. 2. A subset of terminal codes must be supported While these codes may vary among terminals, the capability must be provided and activated by printing a terminal sequence. The required codes are listed below. * move / CUP - Cursor Position * hide_cursor / DECTCEM - Text Cursor Enable Mode * show_cursor / DECTCEM - Text Cursor Enable Mode * csr / DECSTBM - Set Top and Bottom Margins * clear_eos / ED - Erase in Display * clear_eol / EL - Erase in Line * feed / CUD - Cursor Down (Or scroll with linefeed) 3. Terminal dimensions must be detectable The height and width of the terminal must be available to the running process. Why does ``RuntimeError: reentrant call`` get raised sometimes during a resize? ------------------------------------------------------------------------------- This is caused when another thread or process is writing to a standard stream (STDOUT, STDERR) at the same time the resize signal handler is writing to the stream. Enlighten tries to detect when a program is threaded or running multiple processes and defer resize handling until the next normal write event. However, this condition is evaluated when the scroll area is set, typically when the first counter is added. If no threads or processes are detected at that time, and the value of threaded was not set explicitly, resize events will not be deferred. In order to guarantee resize handling is deferred, it is best to pass ``threaded=True`` when creating a manager instance. Why does the output disappear at the end of a notebook cell in VSCode? ---------------------------------------------------------------------- This is caused by a `bug `_ in the VSCode Jupyter extension that reverts display updates at the end of a cell. This issue has been confirmed by the maintainers, but a fix has not been released yet. As a temporary workaround, ``manager._primed = False`` at the end of the cell before calling :py:meth:`~enlighten.NotebookManager.stop`. Note, this will result in double output in other environments so should only be used if the display is cleared first or the code is limited to running in this extension. enlighten-1.11.2/doc/index.rst000066400000000000000000000020151436526347400161730ustar00rootroot00000000000000.. Copyright 2017 - 2021 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten .. toctree:: :hidden: self install.rst examples.rst patterns.rst faq.rst api.rst Overview ======== Enlighten Progress Bar is a console progress bar library for Python. The main advantage of Enlighten is it allows writing to stdout and stderr without any redirection or additional code. Just print or log as you normally would. Enlighten also includes experimental support for Jupyter Notebooks. .. image:: _static/demo.gif :target: examples.html The code for this animation can be found in `demo.py `__ in `examples `__.enlighten-1.11.2/doc/install.rst000066400000000000000000000022651436526347400165410ustar00rootroot00000000000000.. Copyright 2017 - 2021 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten Installation ============ PIP --- .. code-block:: console $ pip install enlighten RPM --- Fedora and EL8 (RHEL/CentOS) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (EPEL_ repositories must be configured_ for EL8) .. code-block:: console $ dnf install python3-enlighten EL7 (RHEL/CentOS) ^^^^^^^^^^^^^^^^^ (EPEL_ repositories must be configured_) .. code-block:: console $ yum install python2-enlighten $ yum install python36-enlighten PKG --- Arch Linux ^^^^^^^^^^ .. code-block:: console $ pacman -S python-enlighten DEB --- Debian and Ubuntu ^^^^^^^^^^^^^^^^^ .. code-block:: console $ apt-get install python3-enlighten Conda ----- .. code-block:: console $ conda install -c conda-forge enlighten .. _EPEL: https://fedoraproject.org/wiki/EPEL .. _configured: https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F enlighten-1.11.2/doc/patterns.rst000066400000000000000000000124501436526347400167300ustar00rootroot00000000000000.. Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. :github_url: https://github.com/Rockhopper-Technologies/enlighten Common Patterns =============== Enable / Disable ---------------- A program may want to disable progress bars based on a configuration setting as well as if output redirection occurs. .. code-block:: python import sys import enlighten # Example configuration object config = {'stream': sys.stdout, 'useCounter': False} enableCounter = config['useCounter'] and stream.isatty() manager = enlighten.Manager(stream=config['stream'], enabled=enableCounter) The :py:func:`~enlighten.get_manager` function slightly simplifies this .. code-block:: python import enlighten # Example configuration object config = {'stream': None, # Defaults to sys.__stdout__ 'useCounter': False} manager = enlighten.get_manager(stream=config['stream'], enabled=config['useCounter']) Context Managers ---------------- Both :py:class:`~enlighten.Counter` and :py:class:`~enlighten.Manager` can be used as context managers. .. code-block:: python import enlighten SPLINES = 100 with enlighten.Manager() as manager: with manager.counter(total=SPLINES, desc='Reticulating:', unit='splines') as retic: for num in range(SPLINES + 1): retic.update() Automatic Updating ------------------ Both :py:class:`~enlighten.Counter` and :py:class:`~enlighten.SubCounter` instances can be called as functions on one or more iterators. A generator is returned which yields each element of the iterables and then updates the count by 1. .. note:: When a :py:class:`~enlighten.Counter` instance is called as a function, type checking is lazy and won't validate an iterable was passed until iteration begins. .. code-block:: python import time import enlighten flock1 = ['Harry', 'Sally', 'Randy', 'Mandy', 'Danny', 'Joe'] flock2 = ['Punchy', 'Kicky', 'Spotty', 'Touchy', 'Brenda'] total = len(flock1) + len(flock2) manager = enlighten.Manager() pbar = manager.counter(total=total, desc='Counting Sheep', unit='sheep') for sheep in pbar(flock1, flock2): time.sleep(0.2) print('%s: Baaa' % sheep) User-defined fields ------------------- Both :py:class:`~enlighten.Counter` and :py:class:`~enlighten.StatusBar` accept user defined fields as keyword arguments at initialization and during an update. These fields are persistent and only need to be specified when they change. In the following example, ``source`` is a user-defined field that is periodically updated. .. code-block:: python import enlighten import random import time bar_format = u'{desc}{desc_pad}{source} {percentage:3.0f}%|{bar}| ' + \ u'{count:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' manager = enlighten.get_manager(bar_format=bar_format) bar = manager.counter(total=100, desc='Loading', unit='files', source='server.a') for num in range(100): time.sleep(0.1) # Simulate work if not num % 5: bar.update(source=random.choice(['server.a', 'server.b', 'server.c'])) else: bar.update() For more information, see the :ref:`Counter Format ` and :ref:`StatusBar Format ` sections. Human-readable numeric prefixes ------------------------------- Enlighten supports automatic `SI (metric)`_ and `IEC (binary)`_ prefixes using the Prefixed_ library. All ``rate`` and ``interval`` formatting fields are of the type :py:class:`prefixed.Float`. ``total`` and all ``count`` fields default to :py:class:`int`. If :py:attr:`~Counter.total` or or :py:attr:`~Counter.count` are set to a :py:class:`float`, or a :py:class:`float` is provided to :py:meth:`~Counter.update`, these fields will be :py:class:`prefixed.Float` instead. .. code-block:: python import time import random import enlighten size = random.uniform(1.0, 10.0) * 2 ** 20 # 1-10 MiB (float) chunk_size = 64 * 1024 # 64 KiB bar_format = '{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' \ '{count:!.2j}{unit} / {total:!.2j}{unit} ' \ '[{elapsed}<{eta}, {rate:!.2j}{unit}/s]' manager = enlighten.get_manager() pbar = manager.counter(total=size, desc='Downloading', unit='B', bar_format=bar_format) bytes_left = size while bytes_left: time.sleep(random.uniform(0.05, 0.15)) next_chunk = min(chunk_size, bytes_left) pbar.update(next_chunk) bytes_left -= next_chunk .. code-block:: python import enlighten counter_format = 'Trying to get to sleep: {count:.2h} sheep' counter = enlighten.Counter(counter_format=counter_format) counter.count = 0.0 for num in range(10000000): counter.update() For more information, see the :ref:`Counter Format ` and the `Prefixed`_ documentation. .. _SI (metric): https://en.wikipedia.org/wiki/Metric_prefix .. _IEC (binary): https://en.wikipedia.org/wiki/Binary_prefix .. _Prefixed: https://prefixed.readthedocs.io/en/stable/index.htmlenlighten-1.11.2/doc/spelling_wordlist.txt000066400000000000000000000001761436526347400206450ustar00rootroot00000000000000Conda downconverted iterable iterables Jupyter natively programmatically resize resizing stdout stderr subcounter subcounters enlighten-1.11.2/enlighten/000077500000000000000000000000001436526347400155445ustar00rootroot00000000000000enlighten-1.11.2/enlighten/__init__.py000066400000000000000000000015141436526347400176560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten Progress Bar** Provides progress bars and counters which play nice in a TTY console """ from enlighten.counter import Counter, StatusBar, SubCounter from enlighten.manager import Manager, get_manager from enlighten._util import EnlightenWarning, Justify __version__ = '1.11.2' __all__ = ['Counter', 'EnlightenWarning', 'Justify', 'Manager', 'StatusBar', 'SubCounter', 'get_manager', 'NotebookManager'] try: from enlighten.manager import NotebookManager # noqa: F401 except ImportError: __all__.remove('NotebookManager') enlighten-1.11.2/enlighten/_basecounter.py000066400000000000000000000176241436526347400206010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten base counter submodule** Provides BaseCounter and PrintableCounter classes """ import time from enlighten._util import BASESTRING try: from collections.abc import Iterable except ImportError: # pragma: no cover(Python 2) from collections import Iterable # pylint: disable=deprecated-class class BaseCounter(object): """ Args: manager(:py:class:`Manager`): Manager instance. Required. color(str): Color as a string or RGB tuple (Default: None) Base class for counters """ __slots__ = ('_color', 'count', 'manager', 'start_count') _repr_attrs = ('count', 'color') _placeholder_ = u'___ENLIGHTEN_PLACEHOLDER___' _placeholder_len_ = len(_placeholder_) def __repr__(self): params = [] for attr in self._repr_attrs: value = getattr(self, attr) if value is not None: params.append('%s=%r' % (attr, value)) return '%s(%s)' % (self.__class__.__name__, ', '.join(params)) def __init__(self, keywords=None, **kwargs): if keywords is not None: kwargs = keywords self.count = self.start_count = kwargs.pop('count', 0) self._color = None self.manager = kwargs.pop('manager', None) if self.manager is None: raise TypeError('manager must be specified') self.color = kwargs.pop('color', None) @property def color(self): """ Color property Preferred to be a string or iterable of three integers for RGB. Single integer supported for backwards compatibility """ color = self._color return color if color is None else color[0] @color.setter def color(self, value): if value is None: self._color = None elif isinstance(value, int) and 0 <= value <= 255: self._color = (value, self.manager.term.color(value)) elif isinstance(value, BASESTRING): term = self.manager.term color_cap = self.manager.term.formatter(value) if not color_cap and term.does_styling and term.number_of_colors: raise AttributeError('Invalid color specified: %s' % value) self._color = (value, color_cap) elif isinstance(value, Iterable) and \ len(value) == 3 and \ all(isinstance(_, int) and 0 <= _ <= 255 for _ in value): self._color = (value, self.manager.term.color_rgb(*value)) else: raise AttributeError('Invalid color specified: %s' % repr(value)) def _colorize(self, content): """ Args: content(str): Color as a string or number 0 - 255 (Default: None) Returns: :py:class:`str`: content formatted with color Format ``content`` with the color specified for this progress bar If no color is specified for this instance, the content is returned unmodified """ # Used spec cached by color.setter if available return content if self._color is None else self._color[1](content) def update(self, *args, **kwargs): """ Placeholder for update method """ raise NotImplementedError def __call__(self, *args): for iterable in args: if not isinstance(iterable, Iterable): raise TypeError('Argument type %s is not iterable' % type(iterable).__name__) for element in iterable: yield element self.update() class PrintableCounter(BaseCounter): """ Base class for printable counters """ __slots__ = ('enabled', '_fill', 'last_update', 'leave', 'min_delta', '_pinned', 'start') def __init__(self, keywords=None, **kwargs): if keywords is not None: # pragma: no branch kwargs = keywords super(PrintableCounter, self).__init__(keywords=kwargs) self.enabled = kwargs.pop('enabled', True) self._fill = u' ' self.fill = kwargs.pop('fill', u' ') self.leave = kwargs.pop('leave', True) self.min_delta = kwargs.pop('min_delta', 0.1) self._pinned = False self.last_update = self.start = time.time() def __enter__(self): return self def __exit__(self, *args): self.close() @property def elapsed(self): """ Get elapsed time is seconds (float) """ return time.time() - self.start @property def fill(self): """ Fill character used in formatting """ return self._fill @fill.setter def fill(self, value): char_len = self.manager.term.length(value) if char_len != 1: raise ValueError('fill character must be a length of 1 ' 'when printed. Length: %d, Value given: %r' % (char_len, value)) self._fill = value @property def position(self): """ Fetch position from the manager """ return self.manager.counters.get(self, 0) def clear(self, flush=True): """ Args: flush(bool): Flush stream after clearing bar (Default:True) Clear bar """ if self.enabled: self.manager.write(flush=flush, counter=self) self.last_update = 0 def close(self, clear=False): """ Do final refresh and remove from manager If ``leave`` is True, the default, the effect is the same as :py:meth:`refresh`. """ if clear and not self.leave: self.clear() else: self.refresh() self.manager.remove(self) def format(self, width=None, elapsed=None): """ Format counter for printing """ raise NotImplementedError def refresh(self, flush=True, elapsed=None): """ Args: flush(bool): Flush stream after writing bar (Default:True) elapsed(float): Time since started. Automatically determined if :py:data:`None` Redraw bar """ if self.enabled: self.last_update = time.time() self.manager.write(output=self.format, flush=flush, counter=self, elapsed=elapsed) def _fill_text(self, text, width, offset=None): """ Args: text (str): String to modify width (int): Width in columns to make progress bar offset(int): Number of non-printable characters to account for when formatting Returns: :py:class:`str`: String with ``self._placeholder_`` replaced with fill characters Replace ``self._placeholder_`` in string with appropriate number of fill characters """ fill_count = text.count(self._placeholder_) if not fill_count: return text if offset is None: remaining = width - self.manager.term.length(text) + self._placeholder_len_ * fill_count else: remaining = width - len(text) + offset + self._placeholder_len_ * fill_count # If only one substitution is required, make it if fill_count == 1: return text.replace(self._placeholder_, self.fill * remaining) # Determine even fill size and number of extra characters to fill fill_size, extra = divmod(remaining, fill_count) # Add extra fill is needed, add extra fill evenly starting from the end if extra: text = text.replace(self._placeholder_, self.fill * fill_size, fill_count - extra) return text.replace(self._placeholder_, self.fill * (fill_size + 1)) # If fill is even, replace evenly return text.replace(self._placeholder_, self.fill * fill_size) enlighten-1.11.2/enlighten/_basemanager.py000066400000000000000000000271721436526347400205330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten base manager submodule** Provides BaseManager class """ import sys import time from collections import OrderedDict from blessed import Terminal from enlighten._counter import Counter from enlighten._statusbar import StatusBar class BaseManager(object): """ Args: stream(:py:term:`file object`): Output stream. If :py:data:`None`, defaults to :py:data:`sys.__stdout__` status_bar_class(:py:term:`class`): Status bar class (Default: :py:class:`StatusBar`) counter_class(:py:term:`class`): Progress bar class (Default: :py:class:`Counter`) set_scroll(bool): Enable scroll area redefinition (Default: :py:data:`True`) companion_stream(:py:term:`file object`): See :ref:`companion_stream ` below. (Default: :py:data:`None`) enabled(bool): Status (Default: True) no_resize(bool): Disable resizing support term(str): Terminal type passed to Blessed threaded(bool): When True resize handling is deferred until next write (Default: False unless multiple threads or multiple processes are detected) width(int): Static output width. If unset, width is determined dynamically kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` will be used as default values when :py:meth:`counter` is called. Base manager class """ # pylint: disable=too-many-instance-attributes def __init__(self, **kwargs): self.enabled = kwargs.get('enabled', True) # Double duty for counters self.companion_stream = kwargs.pop('companion_stream', None) self.counter_class = kwargs.pop('counter_class', Counter) self.no_resize = kwargs.pop('no_resize', False) self.set_scroll = kwargs.pop('set_scroll', True) self.status_bar_class = kwargs.pop('status_bar_class', StatusBar) self.stream = kwargs.pop('stream', sys.__stdout__) self.threaded = kwargs.pop('threaded', None) self._width = kwargs.pop('width', None) self.counters = OrderedDict() self.autorefresh = [] self._buffer = [] self._companion_buffer = [] self.process_exit = False self.refresh_lock = False self._resize = False self.resize_lock = False self.scroll_offset = 1 # If terminal is kind is given, force styling kind = kwargs.pop('term', None) self.term = Terminal(stream=self.stream, kind=kind, force_styling=bool(kind)) self.height = self.term.height self.width = self._width or self.term.width self.defaults = kwargs # Counter defaults def write(self, output='', flush=True, counter=None, **kwargs): """ Args: output(str): Output string or callable flush(bool): Flush the output stream after writing counter(:py:class:`Counter`): Bar being written (for position and auto-refresh) kwargs(dict): Additional arguments passed when output is callable Write to the stream. The position is determined by the counter or defaults to the bottom of the terminal If ``output`` is callable, it will be called with any additional keyword arguments to produce the output string """ raise NotImplementedError() def stop(self): """ Clean up and reset terminal This method should be called when the manager and counters will no longer be needed. Any progress bars that have ``leave`` set to :py:data:`True` or have not been closed will remain on the console. All others will be cleared. Manager and all counters will be disabled. """ raise NotImplementedError() def _flush_streams(self): """ Flush output buffers """ raise NotImplementedError() def __enter__(self): return self def __exit__(self, *args): self.stop() def counter(self, position=None, **kwargs): """ Args: position(int): Line number counting from the bottom of the screen autorefresh(bool): Refresh this counter when other bars are drawn replace(:py:class:`PrintableCounter`): Replace given counter with new. Position ignored. kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` are passed to :py:class:`Counter` Returns: :py:class:`Counter`: Instance of counter class Get a new progress bar instance If ``position`` is specified, the counter's position will be pinned. A :py:exc:`ValueError` will be raised if ``position`` exceeds the screen height or has already been pinned by another counter. If ``autorefresh`` is :py:data:`True`, this bar will be redrawn whenever another bar is drawn assuming it had been ``min_delta`` seconds since the last update. This is usually unnecessary. .. note:: Counters are not automatically drawn when created because fields may be missing if subcounters are used. To force the counter to draw before updating, call :py:meth:`~Counter.refresh`. """ return self._add_counter(self.counter_class, position=position, **kwargs) def status_bar(self, *args, **kwargs): """ Args: position(int): Line number counting from the bottom of the screen autorefresh(bool): Refresh this counter when other bars are drawn replace(:py:class:`PrintableCounter`): Replace given counter with new. Position ignored. kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` are passed to :py:class:`StatusBar` Returns: :py:class:`StatusBar`: Instance of status bar class Get a new status bar instance If ``position`` is specified, the counter's position can change dynamically if additional counters are called without a ``position`` argument. If ``autorefresh`` is :py:data:`True`, this bar will be redrawn whenever another bar is drawn assuming it had been ``min_delta`` seconds since the last update. Generally, only need when ``elapsed`` is used in :ref:`status_format `. """ position = kwargs.pop('position', None) return self._add_counter(self.status_bar_class, *args, position=position, **kwargs) def _add_counter(self, counter_class, *args, **kwargs): # pylint: disable=too-many-branches """ Args: counter_class(:py:class:`PrintableCounter`): Class to instantiate position(int): Line number counting from the bottom of the screen autorefresh(bool): Refresh this counter when other bars are drawn replace(:py:class:`PrintableCounter`): Replace given counter with new. Position ignored. kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` are passed to :py:class:`Counter` Returns: :py:class:`Counter`: Instance of counter class Get a new instance of the given class and add it to the manager If ``position`` is specified, the counter's position can change dynamically if additional counters are called without a ``position`` argument. """ position = kwargs.pop('position', None) autorefresh = kwargs.pop('autorefresh', False) replace = kwargs.pop('replace', None) # List of counters to refresh due to new position toRefresh = [] # Add default values to kwargs for key, val in self.defaults.items(): if key not in kwargs: kwargs[key] = val kwargs['manager'] = self # Create counter new = counter_class(*args, **kwargs) if autorefresh: self.autorefresh.append(new) # Get pinned counters # pylint: disable=protected-access pinned = {pos: ctr for ctr, pos in self.counters.items() if ctr._pinned} # Manage replacement if replace is not None: if replace not in self.counters: raise ValueError('Counter to replace is not currently managed: %r' % replace) # Remove old counter position = self.counters[replace] replace.leave = False replace.close() # Replace old counter with new counter self.counters[new] = position if replace._pinned: new._pinned = True pinned[position] = new # Position specified elif position is not None: if position < 1: raise ValueError('Counter position %d is less than 1.' % position) if position in pinned: raise ValueError('Counter position %d is already occupied.' % position) if position > self.height: raise ValueError('Counter position %d is greater than terminal height.' % position) new._pinned = True # pylint: disable=protected-access self.counters[new] = position pinned[position] = new # Dynamic placement else: # Set for now, but will change self.counters[new] = 0 # Refresh status bars only, counters may have subcounters if counter_class is self.status_bar_class: toRefresh.append(new) # Iterate through all counters in reverse order pos = 1 for ctr in reversed(self.counters): if ctr in pinned.values(): continue old_pos = self.counters[ctr] while pos in pinned: pos += 1 if pos != old_pos: # Don't refresh new counter, already accounted for if ctr is not new: ctr.clear(flush=False) toRefresh.append(ctr) self.counters[ctr] = pos pos += 1 self._set_scroll_area() for ctr in reversed(toRefresh): ctr.refresh(flush=False) self._flush_streams() return new def _set_scroll_area(self, force=False): """ In the base class this is a no-op It is called when adding counters for managers which manage scrollable regions """ def remove(self, counter): """ Args: counter(:py:class:`Counter`): Progress bar or status bar instance Remove bar instance from manager Does not error if instance is not managed by this manager Generally this method should not be called directly, instead used :py:meth:`Counter.close`. """ if not counter.leave: try: del self.counters[counter] self.autorefresh.remove(counter) except (KeyError, ValueError): pass def _autorefresh(self, exclude): """ Args: exclude(list): Iterable of bars to ignore when auto-refreshing Refresh any bars specified for auto-refresh """ self.refresh_lock = True current_time = time.time() for counter in self.autorefresh: if counter in exclude or counter.min_delta > current_time - counter.last_update: continue counter.refresh() self.refresh_lock = False enlighten-1.11.2/enlighten/_counter.py000066400000000000000000000754111436526347400177440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten counter submodule** Provides Counter and SubConter classes """ import math import os import platform import re import sys import time from prefixed import Float from enlighten._basecounter import BaseCounter, PrintableCounter from enlighten._util import (EnlightenWarning, FORMAT_MAP_SUPPORT, format_time, raise_from_none, warn_best_level) COUNTER_FMT = u'{desc}{desc_pad}{count:d} {unit}{unit_pad}' + \ u'[{elapsed}, {rate:.2f}{unit_pad}{unit}/s]{fill}' BAR_FMT = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| {count:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' STATUS_FMT = u'{message}' # Even with cp65001, Windows doesn't seem to support all unicode characters. Windows Terminal does if platform.system() == 'Windows' and not os.environ.get('WT_SESSION', None): # pragma: no cover SERIES_STD = u' ▌█' else: SERIES_STD = u' ▏▎▍▌▋▊▉█' # Test for non-unicode terminals try: SERIES_STD.encode(sys.__stdout__.encoding) except UnicodeEncodeError: # pragma: no cover(Non-unicode Terminal) SERIES_STD = u' |' except (AttributeError, TypeError): # pragma: no cover(Non-standard Terminal) pass # Reserved fields BAR_SPECIFIC_FIELDS = {'bar', 'eta', 'len_total', 'percentage'} COUNTER_SPECIFIC_FIELDS = {'fill'} RESERVED_FIELDS = {'count', 'desc', 'desc_pad', 'elapsed', 'interval', 'rate', 'unit', 'unit_pad', 'total'} | BAR_SPECIFIC_FIELDS | COUNTER_SPECIFIC_FIELDS RE_SUBCOUNTER_FIELDS = re.compile(r'(count|percentage|eta|interval|rate)_(\d+)') class SubCounter(BaseCounter): """ A child counter for multicolored progress bars. This class tracks a portion of multicolored progress bar and should be initialized through :py:meth:`Counter.add_subcounter` **Instance Attributes** .. py:attribute:: count :py:class:`int` - Current count .. py:attribute:: parent :py:class:`Counter` - Parent counter """ __slots__ = ('all_fields', 'parent') _repr_attrs = ('count', 'color', 'all_fields') def __init__(self, parent, color=None, count=0, all_fields=False): """ Args: color(str): Series color as a string or RGB tuple see :ref:`Series Color ` count(int): Initial count (Default: 0) all_fields(bool): Populate ``rate``, ``interval``, and ``eta`` fields (Default: False) """ if parent.count - parent.subcount - count < 0: raise ValueError('Invalid count: %s' % count) super(SubCounter, self).__init__(manager=parent.manager, color=color, count=count) self.parent = parent self.all_fields = all_fields def update(self, incr=1, force=False): # pylint: disable=arguments-differ """ Args: incr(int): Amount to increment ``count`` (Default: 1) force(bool): Force refresh even if ``min_delta`` has not been reached Increment progress bar and redraw Both this counter and the parent are incremented. Progress bar is only redrawn if min_delta seconds past since the last update on the parent. """ self.count += incr self.parent.update(incr, force) def update_from(self, source, incr=1, force=False): """ Args: source(:py:class:`SubCounter`): :py:class:`SubCounter` or :py:class:`Counter` to increment from incr(int): Amount to increment ``count`` (Default: 1) force(bool): Force refresh even if ``min_delta`` has not been reached Move a value to this counter from another counter. ``source`` must be the parent :py:class:`Counter` instance or a :py:class:`SubCounter` with the same parent """ # Make sure source is a parent or peer if source is not self.parent and getattr(source, 'parent', None) is not self.parent: raise ValueError('source must be parent or peer') # Make sure counts won't go negative if self.count + incr < 0 or source.count - incr < 0: raise ValueError('Invalid increment: %s' % incr) # Make sure parent count won't go negative if source is self.parent: if self.parent.count - self.parent.subcount - incr < 0: raise ValueError('Invalid increment: %s' % incr) # Deduct from peer count else: source.count -= incr # Increment self and update parent self.count += incr self.parent.update(0, force) class Counter(PrintableCounter): """ .. spelling:: desc len seagreen peru .. _Prefixed documentation: https://prefixed.readthedocs.io/en/stable/index.html .. _format specifiers: https://prefixed.readthedocs.io/en/stable/format_spec.html .. _SI (metric): https://en.wikipedia.org/wiki/Metric_prefix .. _IEC (binary): https://en.wikipedia.org/wiki/Binary_prefix Args: all_fields(bool): Populate ``rate``, ``interval``, and ``eta`` formatting fields in subcounters bar_format(str): Progress bar format, see :ref:`Format ` below count(int): Initial count (Default: 0) counter_format(str): Counter format, see :ref:`Format ` below color(str): Series color as a string or RGB tuple see :ref:`Series Color ` desc(str): Description enabled(bool): Status (Default: :py:data:`True`) fill(str): Fill character used for ``counter_format`` (Default: ' ') fields(dict): Additional fields used for :ref:`formatting ` leave(True): Leave progress bar after closing (Default: :py:data:`True`) manager(:py:class:`Manager`): Manager instance. Creates instance if not specified. min_delta(float): Minimum time, in seconds, between refreshes (Default: 0.1) offset(int): Number of non-printable characters to account for when formatting series(:py:term:`sequence`): Progression series, see :ref:`Series ` below stream(:py:term:`file object`): Output stream. Not used when instantiated through a manager total(int): Total count when complete unit(str): Unit label Progress bar and counter class A :py:class:`Counter` instance can be created with the :py:meth:`Manager.counter` method or, when a standalone progress bar for simple applications is required, the :py:class:`Counter` class can be called directly. The output stream will default to :py:data:`sys.__stdout__` unless ``stream`` is set. .. note:: With the default values for ``bar_format`` and ``counter_format``, :py:class:`floats ` can not be used for ``total``, ``count``, or provided to :py:meth:`~Counter.update`. In order to use :py:class:`floats `, provide custom formats to ``bar_format`` and ``counter_format``. See :ref:`Format ` below. .. _series: **Series** The progress bar is constructed from the characters in ``series``. ``series`` must be a :py:term:`sequence` (:py:class:`str`, :py:class:`list`, :py:class:`tuple`) containing single characters. Default progress series (``series``): .. code-block:: python ' ▏▎▍▌▋▊▉█' The first character is the fill character. When the ``count`` is 0, the bar will be made up of only this character. In the example below, characters 5 through 9 are fill characters. The last character is the full character. When the ``count`` is equal to ``total``, the bar will be made up of only this character. In the example below, characters 0 through 3 are full characters. The remaining characters are fractional characters used to more accurately represent the transition between the full and fill characters. In the example below, character 4 is a fractional character. .. code-block:: python '45% |████▋ |' '0123456789' .. _series_color: **Series Color** The characters specified by ``series`` will be displayed in the terminal's current foreground color. This can be overwritten with the ``color`` argument. ``color`` can be specified as :py:data:`None`, a :py:mod:`string` or, an :py:term:`iterable` of three integers, 0 - 255, describing an RGB color. For backward compatibility, a color can be expressed as an integer 0 - 255, but this is deprecated in favor of named or RGB colors. Compound colors, such as 'white_on_seagreen', 'bold_red', or 'underline_on_peru' are also supported. If a terminal is not capable of 24-bit color, and is given a color outside of its range, the color will be downconverted to a supported color. Valid colors for 8 color terminals: - black - blue - cyan - green - magenta - red - white - yellow Additional colors for 16 color terminals: - bright_black - bright_blue - bright_cyan - bright_green - bright_magenta - bright_red - bright_white - bright_yellow See this `chart `_ for a complete list of supported color strings. .. note:: If an invalid color is specified, an :py:exc:`AttributeError` will be raised .. _counter_format: **Format** If ``total`` is :py:data:`None` or ``count`` becomes higher than ``total``, the counter format will be used instead of the progress bar format. Default counter format (``counter_format``): .. code-block:: python '{desc}{desc_pad}{count:d} {unit}{unit_pad}{elapsed}, \ {rate:.2f}{unit_pad}{unit}/s]{fill}' # Example output 'Loaded 30042 Files [00:01, 21446.45 Files/s] ' Default progress bar format (``bar_format``): .. code-block:: python '{desc}{desc_pad}{percentage:3.0f}%|{bar}| \ {count:{len_total}d}/{total:d} [{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' # Example output 'Processing 22%|█████▊ | 23/101 [00:27<01:32, 0.84 Files/s]' Available fields: - count(:py:class:`int`) - Current value of ``count`` - desc(:py:class:`str`) - Value of ``desc`` - desc_pad(:py:class:`str`) - A single space if ``desc`` is set, otherwise empty - elapsed(:py:class:`str`) - Time elapsed since instance was created - interval(:py:class:`prefixed.Float`) - Average seconds per iteration (inverse of rate) - rate(:py:class:`prefixed.Float`) - Average iterations per second since instance was created - total(:py:class:`int`) - Value of ``total`` - unit(:py:class:`str`) - Value of ``unit`` - unit_pad(:py:class:`str`) - A single space if ``unit`` is set, otherwise empty Additional fields for ``bar_format`` only: - bar(:py:class:`str`) - Progress bar draw with characters from ``series`` - eta(:py:class:`str`) - Estimated time to completion - len_total(:py:class:`int`) - Length of ``total`` when converted to a string - percentage(:py:class:`float`) - Percentage complete Additional fields for ``counter_format`` only: - fill(:py:class:`str`) - Filled with :py:attr:`fill` until line is width of terminal. May be used multiple times. Minimum width is 3. Additional fields when subcounters are used: - count_n(:py:class:`int`) - Current value of ``count`` - count_0(:py:class:`int`) - Remaining count after deducting counts for all subcounters - count_00(:py:class:`int`) - Sum of counts from all subcounters - interval_0(:py:class:`prefixed.Float`) - Average seconds per non-subcounter iteration (inverse of rate_0) - interval_00(:py:class:`prefixed.Float`) - Average seconds per iteration for all subcounters (inverse of rate_00) - percentage_n(:py:class:`float`) - Percentage complete (``bar_format`` only) - percentage_0(:py:class:`float`) - Remaining percentage after deducting percentages for all subcounters (``bar_format`` only) - percentage_00(:py:class:`float`) - Total of percentages from all subcounters - rate_0(:py:class:`prefixed.Float`) - Average iterations per second excluding subcounters since instance was created - rate_00(:py:class:`prefixed.Float`) - Average iterations per second of all subcounters since instance was created .. note:: **n** denotes the order the subcounter was added starting at 1. For example, **count_1** is the count for the first subcounter added and **count_2** is the count for the second subcounter added. Additional fields when :py:meth:`add_subcounter` is called with ``all_fields`` set to :py:data:`True`: - eta_n (:py:class:`str`) - Estimated time to completion (``bar_format`` only) - interval_n(:py:class:`prefixed.Float`) - Average seconds per iteration (inverse of rate) - rate_n (:py:class:`prefixed.Float`) - Average iterations per second since parent was created .. note:: ``count`` and ``total`` fields, including ``count_0``, ``count_00``, and ``count_n``, default to :py:class:`int`. If :py:attr:`~Counter.total` or or :py:attr:`~Counter.count` are set to a :py:class:`float`, or a :py:class:`float` is provided to :py:meth:`~Counter.update`, these fields will be :py:class:`prefixed.Float` instead. This allows additional `format specifiers`_ using `SI (metric)`_ and `IEC (binary)`_ prefixes. See the `Prefixed documentation`_ for more details. This will also require a custom format and affect the accuracy of the ``len_total`` field. User-defined fields: Users can define fields in two ways, the ``fields`` parameter and by passing keyword arguments to :py:meth:`Manager.counter` or :py:meth:`Counter.update` The ``fields`` parameter can be used to pass a dictionary of additional user-defined fields. The dictionary values can be updated after initialization to allow for dynamic fields. Any fields that share names with built-in fields are ignored. If fields are passed as keyword arguments to :py:meth:`Manager.counter` or :py:meth:`Counter.update`, they take precedent over the ``fields`` parameter. .. _counter_offset: **Offset** When ``offset`` is :py:data:`None`, the width of the bar portion of the progress bar and the fill size for counter will be automatically determined, taking into account terminal escape sequences that may be included in the string. Under special circumstances, and to permit backward compatibility, ``offset`` may be explicitly set to an :py:class:`int` value. When explicitly set, automatic detection of escape sequences is disabled. **Instance Attributes** .. py:attribute:: count :py:class:`int` - Current count .. py:attribute:: desc :py:class:`str` - Description .. py:attribute:: elapsed :py:class:`float` - Time since start (since last update if :py:attr:`count`equals :py:attr:`total`) .. py:attribute:: enabled :py:class:`bool` - Current status .. py:attribute:: manager :py:class:`Manager` - Manager Instance .. py:attribute:: position :py:class:`int` - Current position .. py:attribute:: total :py:class:`int` - Total count when complete .. py:attribute:: unit :py:class:`str` - Unit label """ # pylint: disable=too-many-instance-attributes __slots__ = ('all_fields', 'bar_format', 'counter_format', 'desc', 'fields', 'offset', 'series', 'total', 'unit', '_fields', '_subcounters') _repr_attrs = ('desc', 'total', 'count', 'unit', 'color') # pylint: disable=too-many-arguments def __init__(self, **kwargs): super(Counter, self).__init__(keywords=kwargs) # Accept additional_fields for backwards compatibility self.fields = kwargs.pop('fields', kwargs.pop('additional_fields', {})) self.all_fields = kwargs.pop('all_fields', False) self.bar_format = kwargs.pop('bar_format', BAR_FMT) self.counter_format = kwargs.pop('counter_format', COUNTER_FMT) self.desc = kwargs.pop('desc', None) self.offset = kwargs.pop('offset', None) self.series = kwargs.pop('series', SERIES_STD) self.total = kwargs.pop('total', None) self.unit = kwargs.pop('unit', None) self._fields = kwargs self._subcounters = [] @property def elapsed(self): """ Get elapsed time is seconds (float) """ # Clock stops running when total is reached if self.count == self.total: return self.last_update - self.start return time.time() - self.start @property def subcount(self): """ Sum of counts from all subcounters """ return sum(subcounter.count for subcounter in self._subcounters) # pylint: disable=too-many-locals def _get_subcounters(self, elapsed, fields, bar_fields=True, force_float=False): """ Args: elapsed(float): Time since started. bar_fields(bool): When False, only set fields for basic counter Returns: :py:class:`tuple`: list of subcounters and dictionary of additional fields Each subcounter in the list will be in a tuple of (subcounter, percentage) Fields in the dictionary are addressed in the Format documentation of this class When `bar_fields` is False, only subcounter count, interval, and rate fields are set. percentage will be set to 0.0 """ subcounters = [] count_00 = 0 start_count_00 = 0 if not self._subcounters: return subcounters for num, subcounter in enumerate(self._subcounters, 1): count = subcounter.count count_00 += count start_count_00 += subcounter.start_count fields['count_%d' % num] = Float(count) if force_float else count subPercentage = count / float(self.total) if self.total and bar_fields else 0.0 if bar_fields: fields['percentage_%d' % num] = subPercentage * 100 # Save in tuple: count, percentage subcounters.append((subcounter, subPercentage)) if not subcounter.all_fields: continue # Explicit conversion to float required for Python 2 interations = float(abs(count - subcounter.start_count)) rate = Float(interations / elapsed) if elapsed else Float(0.0) fields['rate_%d' % num] = rate fields['interval_%d' % num] = rate ** -1 if rate else rate if not bar_fields: continue if self.total == 0: fields['eta_%d' % num] = u'00:00' elif rate: fields['eta_%d' % num] = format_time((self.total - interations) / rate) else: fields['eta_%d' % num] = u'?' # Percentage_0 and percentage_00, bar_format only if bar_fields: fields['percentage_00'] = percentage_00 = sum(sub[1] for sub in subcounters) * 100 fields['percentage_0'] = fields['percentage'] - percentage_00 # count_00 fields (Sum of subcounters) fields['count_00'] = Float(count_00) if force_float else count_00 rate = Float(float(abs(count_00 - start_count_00)) / elapsed) if elapsed else Float(0.0) fields['rate_00'] = rate fields['interval_00'] = rate ** -1 if rate else rate # count_0 fields (Excluding subcounters) count_0 = fields['count_0'] = fields['count'] - count_00 start_count_0 = self.start_count - start_count_00 rate = Float(float(abs(count_0 - start_count_0)) / elapsed) if elapsed else Float(0.0) fields['rate_0'] = rate fields['interval_0'] = rate ** -1 if rate else rate return subcounters # pylint: disable=too-many-locals,too-many-branches,too-many-statements def format(self, width=None, elapsed=None): """ Args: width (int): Width in columns to make progress bar elapsed(float): Time since started. Automatically determined if :py:data:`None` Returns: :py:class:`str`: Formatted progress bar or counter Format progress bar or counter """ width = width or self.manager.width total = self.total iterations = float(abs(self.count - self.start_count)) fields = self.fields.copy() fields.update(self._fields) # Warn on reserved fields reserved_fields = set(fields) & RESERVED_FIELDS | { match.group() for match in (RE_SUBCOUNTER_FIELDS.match(key) for key in fields) if match } if reserved_fields: warn_best_level('Ignoring reserved fields specified as user-defined fields: %s' % ', '.join(reserved_fields), EnlightenWarning) force_float = isinstance(self.count, float) or isinstance(total, float) fields['count'] = Float(self.count) if force_float else self.count fields['desc'] = self.desc or u'' fields['total'] = Float(total) if force_float and total is not None else total fields['unit'] = self.unit or u'' fields['desc_pad'] = u' ' if self.desc else u'' fields['unit_pad'] = u' ' if self.unit else u'' # Get elapsed time if elapsed is None: elapsed = self.elapsed fields['elapsed'] = format_time(elapsed) # Get rate. Elapsed could be 0 if counter was not updated and has a zero total. rate = Float(iterations / elapsed) if elapsed else Float(0.0) fields['rate'] = rate fields['interval'] = rate ** -1 if rate else rate # Only process bar if total was given and n doesn't exceed total if total is not None and self.count <= total: return self._format_bar(fields, iterations, width, elapsed, force_float) # Otherwise return a counter return self._format_counter(fields, width, elapsed, force_float) def _get_format_error(self, field, bar_fields=True): """ Args: field (str): Field unavailable for formatting Returns: :py:class:`str`: Formatted error message Creates an appropriate error message for a missing field in order to best inform user """ match = RE_SUBCOUNTER_FIELDS.match(field) subcounter = 0 reserve_msg = "Reserve field '%s' specified in format, but " % field # Check subcounter fields if match: # Get subcounter number subcounter = int(match.group(2)) # Base counter fields if subcounter == 0: msg = reserve_msg + 'no subcounters are configured' # Subcounter not defined elif subcounter > len(self._subcounters): msg = reserve_msg + 'subcounter %d is not defined' % subcounter # Bar-specific subcounter fields elif match.group(1) in BAR_SPECIFIC_FIELDS and not bar_fields: msg = reserve_msg + 'unavailable for counter_format' # all_fields required for field else: msg = reserve_msg + "'all_fields' not specified for subcounter" # Bar field provided to counter_format elif field in BAR_SPECIFIC_FIELDS and not bar_fields: msg = reserve_msg + 'unavailable for counter_format' # Counter field provided to bar_format elif field in COUNTER_SPECIFIC_FIELDS and bar_fields: msg = reserve_msg + 'unavailable for bar_format' # Not a reserved field else: msg = "'%s' specified in format, but not provided" % field return msg % {'field': field, 'subcounter': subcounter} def _format_bar(self, fields, iterations, width, elapsed, force_float): """ Args: fields (dict): Initial set of formatting fields iterations (float): Absolute value of count change from start width (int): Width in columns to make progress bar elapsed(float): Time since started Returns: :py:class:`str`: Formatted progress bar Format progress bar """ fields['bar'] = self._placeholder_ fields['len_total'] = len(str(self.total)) # Get percentage if self.total == 0: # If total is 0, force to 100 percent percentage = 1 fields['eta'] = u'00:00' else: # Use float to force to float in Python 2 percentage = self.count / float(self.total) rate = fields['rate'] # Get eta. Use iterations so a counter running backwards is accurate fields['eta'] = format_time((self.total - iterations) / rate) if rate else u'?' fields['percentage'] = percentage * 100 # Have to go through subcounters here so the fields are available subcounters = self._get_subcounters(elapsed, fields, force_float=force_float) # Partially format try: if FORMAT_MAP_SUPPORT: rtn = self.bar_format.format_map(fields) else: # pragma: no cover rtn = self.bar_format.format(**fields) except KeyError as e: raise_from_none(ValueError(self._get_format_error(e.args[0]))) # Determine bar width if self.offset is None: barWidth = width - self.manager.term.length(rtn) + self._placeholder_len_ else: # Offset was explicitly given barWidth = width - len(rtn) + self.offset + self._placeholder_len_ complete = barWidth * percentage barLen = int(complete) barText = u'' if subcounters: block_count = [int(barWidth * fields['percentage_0'] / 100)] partial_len = (barLen - 1) if fields['count_0'] else barLen remaining = [] # Get full blocks for subcounters and preserve remainders for idx, entry in enumerate(subcounters, 1): remainder, count = math.modf(barWidth * entry[1]) block_count.append(int(count)) remaining.append((remainder, idx)) # Until blocks are accounted for, add full blocks for highest remainders remaining.sort() while sum(block_count) < partial_len and remaining: block_count[remaining.pop()[1]] += 1 # Format partial bars for idx, subLen in reversed(list(enumerate(block_count))): if idx: subcounter = subcounters[idx - 1][0] # pylint: disable=protected-access barText += subcounter._colorize(self.series[-1] * subLen) else: # Get main partial bar barText += self.series[-1] * subLen partial_len = sum(block_count) else: # Get main partial bar barText += self.series[-1] * barLen partial_len = barLen # If bar isn't complete, add partial block and fill if barLen < barWidth: if fields.get('count_0', self.count): barText += self.series[int(round((complete - barLen) * (len(self.series) - 1)))] partial_len += 1 barText += self.series[0] * (barWidth - partial_len) return rtn.replace(self._placeholder_, self._colorize(barText)) def _format_counter(self, fields, width, elapsed, force_float): """ Args: fields (dict): Initial set of formatting fields width (int): Width in columns to make progress bar elapsed(float): Time since started Returns: :py:class:`str`: Formatted counter Format counter """ fields['fill'] = self._placeholder_ # Update fields from subcounters self._get_subcounters(elapsed, fields, bar_fields=False, force_float=force_float) try: if FORMAT_MAP_SUPPORT: rtn = self.counter_format.format_map(fields) else: # pragma: no cover rtn = self.counter_format.format(**fields) except KeyError as e: raise_from_none(ValueError(self._get_format_error(e.args[0], bar_fields=False))) return self._fill_text(rtn, width, offset=self.offset) def update(self, incr=1, force=False, **fields): # pylint: disable=arguments-differ """ Args: incr(int): Amount to increment ``count`` (Default: 1) force(bool): Force refresh even if ``min_delta`` has not been reached fields(dict): Fields for for :ref:`formatting ` Increment progress bar and redraw Progress bar is only redrawn if ``min_delta`` seconds past since the last update """ self.count += incr self._fields.update(fields) if self.enabled: currentTime = time.time() # Update if force, 100%, or minimum delta has been reached if force or self.count == self.total or \ currentTime - self.last_update >= self.min_delta: self.refresh(elapsed=currentTime - self.start) def add_subcounter(self, color, count=0, all_fields=None): """ Args: color(str): Series color as a string or RGB tuple see :ref:`Series Color ` count(int): Initial count (Default: 0) all_fields(bool): Populate ``rate``, ``interval``, and ``eta`` formatting fields (Default: False unless specified in parent) Returns: :py:class:`SubCounter`: Subcounter instance Add a subcounter for multicolored progress bars """ if all_fields is None: all_fields = self.all_fields subcounter = SubCounter(self, color=color, count=count, all_fields=all_fields) self._subcounters.append(subcounter) return subcounter enlighten-1.11.2/enlighten/_manager.py000066400000000000000000000253551436526347400177010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten manager submodule** Provides Manager class """ import atexit import multiprocessing import signal import sys import threading from blessed import Terminal from enlighten._basemanager import BaseManager RESIZE_SUPPORTED = hasattr(signal, 'SIGWINCH') class Manager(BaseManager): """ Args: stream(:py:term:`file object`): Output stream. If :py:data:`None`, defaults to :py:data:`sys.__stdout__` status_bar_class(:py:term:`class`): Status bar class (Default: :py:class:`StatusBar`) counter_class(:py:term:`class`): Progress bar class (Default: :py:class:`Counter`) set_scroll(bool): Enable scroll area redefinition (Default: :py:data:`True`) companion_stream(:py:term:`file object`): See :ref:`companion_stream ` below. (Default: :py:data:`None`) enabled(bool): Status (Default: True) no_resize(bool): Disable resizing support threaded(bool): When True resize handling is deferred until next write (Default: False unless multiple threads or multiple processes are detected) width(int): Static output width. If unset, terminal width is determined dynamically kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` will be used as default values when :py:meth:`counter` is called. Manager class for outputting progress bars to streams attached to TTYs Progress bars are displayed at the bottom of the screen with standard output displayed above. .. _companion_stream: **companion_stream** A companion stream is a :py:term:`file object` that shares a TTY with the primary output stream. The cursor position in the companion stream will be moved in coordination with the primary stream. If the value is :py:data:`None`, the companion stream will be dynamically determined. Unless explicitly specified, a stream which is not attached to a TTY (the case when redirected to a file), will not be used as a companion stream. """ # pylint: disable=too-many-instance-attributes def __init__(self, **kwargs): super(Manager, self).__init__(**kwargs) # Set up companion stream if self.companion_stream is None: # Account for calls with original output if self.stream is sys.__stdout__ and sys.__stderr__.isatty(): self.companion_stream = sys.__stderr__ elif self.stream is sys.__stderr__ and sys.__stdout__.isatty(): self.companion_stream = sys.__stdout__ # Account for output redirection elif self.stream is sys.stdout and sys.stderr.isatty(): self.companion_stream = sys.stderr elif self.stream is sys.stderr and sys.stdout.isatty(): self.companion_stream = sys.stdout # Set up companion terminal if self.companion_stream: self.companion_term = Terminal(stream=self.companion_stream) else: self.companion_term = None if not self.no_resize and RESIZE_SUPPORTED: self.sigwinch_orig = signal.getsignal(signal.SIGWINCH) def __repr__(self): return '%s(stream=%r)' % (self.__class__.__name__, self.stream) def _stage_resize(self, *args, **kwarg): # pylint: disable=unused-argument """ Called when a window resize signal is detected """ # Set semaphore to trigger resize on next write self._resize = True if self.threaded: # Reset update time to avoid any delay in resize for counter in self.counters: counter.last_update = 0 else: # If not threaded, handle resize now self._resize_handler() def _resize_handler(self): """ Called when a window resize has been detected Resets the scroll window """ # Make sure only one resize handler is running if self.resize_lock: return self.resize_lock = True buffer = self._buffer term = self.term oldHeight = self.height newHeight = self.height = term.height if newHeight < oldHeight: buffer.append(term.move(max(0, newHeight - self.scroll_offset), 0)) buffer.append(u'\n' * (2 * max(self.counters.values()))) elif newHeight > oldHeight and self.threaded: buffer.append(term.move(newHeight, 0)) buffer.append(u'\n' * (self.scroll_offset - 1)) buffer.append(term.move(max(0, newHeight - self.scroll_offset), 0)) buffer.append(term.clear_eos) self.width = self._width or term.width self._set_scroll_area(force=True) for counter in self.counters: counter.refresh(flush=False) self._flush_streams() self.resize_lock = False def _set_scroll_area(self, force=False): """ Args: force(bool): Set the scroll area even if no change in height and position is detected Sets the scroll window based on the counter positions """ # Save scroll offset for resizing oldOffset = self.scroll_offset newOffset = max(self.counters.values()) + 1 if newOffset > oldOffset: self.scroll_offset = newOffset use_new = True else: use_new = False if not self.enabled: return # Set exit handling only once if not self.process_exit: atexit.register(self._at_exit) if not self.no_resize and RESIZE_SUPPORTED: if self.threaded is None: self.threaded = ( threading.active_count() > 1 # Multiple threads or multiprocessing.active_children() # Main process with children or multiprocessing.current_process().name != 'MainProcess' # Child process ) signal.signal(signal.SIGWINCH, self._stage_resize) self.process_exit = True if self.set_scroll: buffer = self._buffer term = self.term scrollPosition = max(0, self.height - self.scroll_offset) if force or use_new: # Add line feeds so we don't overwrite existing output if use_new: buffer.append(term.move(max(0, self.height - oldOffset), 0)) buffer.append(u'\n' * (newOffset - oldOffset)) # Reset scroll area buffer.append(term.hide_cursor) buffer.append(term.csr(0, scrollPosition)) # Always reset position buffer.append(term.move(scrollPosition, 0)) if self.companion_term is not None: self._companion_buffer.append(term.move(scrollPosition, 0)) def _flush_streams(self): """ Flush stream and companion buffers """ buffer = self._buffer companion_buffer = self._companion_buffer if buffer: self.stream.write(u''.join(buffer)) self.stream.flush() if self.companion_stream is not None: if companion_buffer: self.companion_stream.write(u''.join(companion_buffer)) self.companion_stream.flush() del buffer[:] # Python 2.7 does not support list.clear() del companion_buffer[:] def _at_exit(self): """ Resets terminal to normal configuration """ if not self.process_exit: return try: term = self.term buffer = self._buffer if self.set_scroll: buffer.append(self.term.normal_cursor) buffer.append(self.term.csr(0, self.height - 1)) buffer.append(term.move(term.height, 0)) buffer.append(term.cud1 or u'\n') self._flush_streams() except ValueError: # Possibly closed file handles pass def stop(self): # See parent class for docstring if not self.enabled: return buffer = self._buffer term = self.term height = term.height positions = self.counters.values() if not self.no_resize and RESIZE_SUPPORTED: signal.signal(signal.SIGWINCH, self.sigwinch_orig) try: for num in range(self.scroll_offset - 1, 0, -1): if num not in positions: buffer.append(term.move(height - num, 0)) buffer.append(term.clear_eol) finally: # Reset terminal if self.set_scroll: buffer.append(term.normal_cursor) buffer.append(term.csr(0, self.height - 1)) if self.companion_term: self._companion_buffer.extend((term.normal_cursor, term.csr(0, self.height - 1), term.move(height, 0))) # Re-home cursor buffer.append(term.move(height, 0)) self.process_exit = False self.enabled = False for counter in self.counters: counter.enabled = False # Feed terminal if lowest position isn't cleared if 1 in positions: buffer.append(term.cud1 or '\n') self._flush_streams() def write(self, output='', flush=True, counter=None, **kwargs): # See parent class for docstring if not self.enabled: return # If resize signal was caught, handle resize if self._resize and not self.resize_lock: try: self._resize_handler() finally: self._resize = False return position = self.counters[counter] if counter else 0 term = self.term # If output is callable, call it with supplied arguments if callable(output): output = output(**kwargs) try: self._buffer.extend((term.move(self.height - position, 0), u'\r', term.clear_eol, output)) finally: # Reset position and scrolling if not self.refresh_lock: if self.autorefresh: self._autorefresh(exclude=(counter,)) self._set_scroll_area() if flush: self._flush_streams() enlighten-1.11.2/enlighten/_notebook_manager.py000066400000000000000000000067011436526347400215730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2023 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten manager submodule** Provides Manager class """ from IPython.display import DisplayHandle, HTML from enlighten._basemanager import BaseManager from enlighten._util import HTMLConverter class NotebookManager(BaseManager): """ Args: counter_class(:py:term:`class`): Progress bar class (Default: :py:class:`Counter`) status_bar_class(:py:term:`class`): Status bar class (Default: :py:class:`StatusBar`) enabled(bool): Status (Default: True) width(int): Static output width (Default: 100) kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` will be used as default values when :py:meth:`counter` is called. Manager class for outputting progress bars to Jupyter notebooks The following keyword arguments are set if provided, but ignored: * *stream* * *set_scroll* * *companion_stream* * *no_resize* * *threaded* """ def __init__(self, **kwargs): # Force terminal to xterm-256color because it should have broad support kwargs['term'] = 'xterm-256color' super(NotebookManager, self).__init__(**kwargs) # Force 24-bit color self.term.number_of_colors = 1 << 24 self._converter = HTMLConverter(self.term) self._output = [] self._display = DisplayHandle() self._html = HTML('') self._primed = False # Default width to 100 unless specified self.width = self._width or 100 def __repr__(self): return '%s()' % self.__class__.__name__ def _flush_streams(self): """ Display buffered output """ if not self.enabled: return self._html.data = '%s

\n' % ( self._converter.style, '\n'.join(reversed(self._output))) if self._primed: self._display.update(self._html) else: self._primed = True self._display.display(self._html) def stop(self): # See parent class for docstring if not self.enabled: return positions = self.counters.values() if positions: for num in range(max(positions), 0, -1): if num not in positions: self._output[num - 1] = '
' for counter in self.counters: counter.enabled = False self._flush_streams() def write(self, output='', flush=True, counter=None, **kwargs): # See parent class for docstring if not self.enabled: return position = self.counters[counter] if counter else 1 # If output is callable, call it with supplied arguments if callable(output): output = output(**kwargs) # If there is space between this bar and the last, fill with blank lines for _ in range(position - len(self._output)): self._output.append('
') # Set output self._output[position - 1] = ( '
\n %s\n
' % self._converter.to_html(output) ) if flush: self._flush_streams() enlighten-1.11.2/enlighten/_statusbar.py000066400000000000000000000173361436526347400202770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2021 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten status bar submodule** Provides StatusBar class """ import time from enlighten._basecounter import PrintableCounter from enlighten._util import (EnlightenWarning, FORMAT_MAP_SUPPORT, format_time, Justify, raise_from_none, warn_best_level) STATUS_FIELDS = {'elapsed', 'fill'} class StatusBar(PrintableCounter): """ Args: enabled(bool): Status (Default: :py:data:`True`) color(str): Color as a string or RGB tuple see :ref:`Status Color ` fields(dict): Additional fields used for :ref:`formating ` fill(str): Fill character used in formatting and justifying text (Default: ' ') justify(str): One of :py:attr:`Justify.CENTER`, :py:attr:`Justify.LEFT`, :py:attr:`Justify.RIGHT` leave(True): Leave status bar after closing (Default: :py:data:`True`) min_delta(float): Minimum time, in seconds, between refreshes (Default: 0.1) status_format(str): Status bar format, see :ref:`Format ` Status bar class A :py:class:`StatusBar` instance should be created with the :py:meth:`Manager.status_bar` method. .. _status_color: **Status Color** Color works similarly to color on :py:class:`Counter`, except it affects the entire status bar. See :ref:`Series Color ` for more information. .. _status_format: **Format** There are two ways to populate the status bar, direct and formatted. Direct takes precedence over formatted. .. _status_format_direct: **Direct Status** Direct status is used when arguments are passed to :py:meth:`Manager.status_bar` or :py:meth:`StatusBar.update`. Any arguments are coerced to strings and joined with a space. For example: .. code-block:: python status_bar.update('Hello', 'World!') # Example output: Hello World! status_bar.update('Hello World!') # Example output: Hello World! count = [1, 2, 3, 4] status_bar.update(*count) # Example output: 1 2 3 4 .. _status_format_formatted: **Formatted Status** Formatted status uses the format specified in the ``status_format`` parameter to populate the status bar. .. code-block:: python 'Current Stage: {stage}' # Example output 'Current Stage: Testing' Available fields: - elapsed(:py:class:`str`) - Time elapsed since instance was created - fill(:py:class:`str`) - Filled with :py:attr:`fill` until line is width of terminal. May be used multiple times. Minimum width is 3. .. note:: The status bar is only updated when :py:meth:`StatusBar.update` or :py:meth:`StatusBar.refresh` is called, so fields like ``elapsed`` will need additional calls to appear dynamic. User-defined fields: Users can define fields in two ways, the ``fields`` parameter and by passing keyword arguments to :py:meth:`Manager.status_bar` or :py:meth:`StatusBar.update` The ``fields`` parameter can be used to pass a dictionary of additional user-defined fields. The dictionary values can be updated after initialization to allow for dynamic fields. Any fields that share names with available fields are ignored. If fields are passed as keyword arguments to :py:meth:`Manager.status_bar` or :py:meth:`StatusBar.update`, they take precedent over the ``fields`` parameter. **Instance Attributes** .. py:attribute:: elapsed :py:class:`float` - Time since start .. py:attribute:: enabled :py:class:`bool` - Current status .. py:attribute:: manager :py:class:`Manager` - Manager Instance .. py:attribute:: position :py:class:`int` - Current position """ __slots__ = ('fields', '_justify', 'status_format', '_static', '_fields') def __init__(self, *args, **kwargs): super(StatusBar, self).__init__(keywords=kwargs) self.fields = kwargs.pop('fields', {}) self._justify = None self.justify = kwargs.pop('justify', Justify.LEFT) self.status_format = kwargs.pop('status_format', None) self._fields = kwargs self._static = ' '.join(str(arg) for arg in args) if args else None @property def justify(self): """ Maps to justify method determined by ``justify`` parameter """ return self._justify @justify.setter def justify(self, value): if value in (Justify.LEFT, Justify.CENTER, Justify.RIGHT): self._justify = getattr(self.manager.term, value) else: raise ValueError("justify must be one of Justify.LEFT, Justify.CENTER, ", "Justify.RIGHT, not: '%r'" % value) def format(self, width=None, elapsed=None): """ Args: width (int): Width in columns to make progress bar elapsed(float): Time since started. Automatically determined if :py:data:`None` Returns: :py:class:`str`: Formatted status bar Format status bar """ width = width or self.manager.width justify = self.justify # If static message was given, just return it if self._static is not None: rtn = self._static # If there is no format, return empty elif self.status_format is None: rtn = '' # Generate from format else: fields = self.fields.copy() fields.update(self._fields) # Warn on reserved fields reserved_fields = (set(fields) & STATUS_FIELDS) if reserved_fields: warn_best_level('Ignoring reserved fields specified as user-defined fields: %s' % ', '.join(reserved_fields), EnlightenWarning) elapsed = elapsed if elapsed is not None else self.elapsed fields['elapsed'] = format_time(elapsed) fields['fill'] = self._placeholder_ # Format try: if FORMAT_MAP_SUPPORT: rtn = self.status_format.format_map(fields) else: # pragma: no cover rtn = self.status_format.format(**fields) except KeyError as e: raise_from_none(ValueError('%r specified in format, but not provided' % e.args[0])) rtn = self._fill_text(rtn, width) return self._colorize(justify(rtn, width=width, fillchar=self.fill)) def update(self, *objects, **fields): # pylint: disable=arguments-differ """ Args: objects(list): Values for :ref:`Direct Status ` force(bool): Force refresh even if ``min_delta`` has not been reached fields(dict): Fields for for :ref:`Formatted Status ` Update status and redraw Status bar is only redrawn if ``min_delta`` seconds past since the last update """ force = fields.pop('force', False) self._static = ' '.join(str(obj) for obj in objects) if objects else None self._fields.update(fields) if self.enabled: currentTime = time.time() if force or currentTime - self.last_update >= self.min_delta: self.refresh(elapsed=currentTime - self.start) enlighten-1.11.2/enlighten/_util.py000066400000000000000000000301651436526347400172370ustar00rootroot00000000000000 # -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten utility submodule** Provides utility functions and objects """ from collections import OrderedDict import inspect import os import re import sys import warnings from blessed.colorspace import RGB_256TABLE, X11_COLORNAMES_TO_RGB from blessed.sequences import iter_parse try: from functools import lru_cache except ImportError: # pragma: no cover(Python 2) # lru_cache was added in Python 3.2 from backports.functools_lru_cache import lru_cache try: BASESTRING = basestring except NameError: BASESTRING = str BASE_DIR = os.path.basename(os.path.dirname(__file__)) FORMAT_MAP_SUPPORT = sys.version_info[:2] >= (3, 2) RE_COLOR_RGB = re.compile(r'\x1b\[38;2;(\d+);(\d+);(\d+)m') RE_ON_COLOR_RGB = re.compile(r'\x1b\[48;2;(\d+);(\d+);(\d+)m') RE_COLOR_256 = re.compile(r'\x1b\[38;5;(\d+)m') RE_ON_COLOR_256 = re.compile(r'\x1b\[48;5;(\d+)m') RE_SET_A = re.compile(r'\x1b\[(\d+)m') RE_LINK = re.compile(r'\x1b]8;.*;(.*)\x1b\\') CGA_COLORS = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') HTML_ESCAPE = {'&': '&', '<': '<', '>': '>', '?': '?'} class EnlightenWarning(Warning): """ Generic warning class for Enlighten """ def warn_best_level(message, category): """ Helper function to warn at first frame stack outside of library """ level = 5 # Unused default for level, frame in enumerate(inspect.stack(), 1): # pragma: no cover if os.path.basename(os.path.dirname(frame[1])) != BASE_DIR: break warnings.warn(message, category=category, stacklevel=level) def format_time(seconds): """ Args: seconds (float): amount of time Format time string for eta and elapsed """ # Always do minutes and seconds in mm:ss format minutes = seconds // 60 hours = minutes // 60 rtn = u'%02.0f:%02.0f' % (minutes % 60, seconds % 60) # Add hours if there are any if hours: rtn = u'%dh %s' % (int(hours % 24), rtn) # Add days if there are any days = int(hours // 24) if days: rtn = u'%dd %s' % (days, rtn) return rtn def raise_from_none(exc): # pragma: no cover """ Convenience function to raise from None in a Python 2/3 compatible manner """ raise exc if sys.version_info[0] >= 3: # pragma: no branch exec('def raise_from_none(exc):\n raise exc from None') # pylint: disable=exec-used class Justify(object): """ Enumerated type for justification options .. py:attribute:: CENTER Justify center .. py:attribute:: LEFT Justify left .. py:attribute:: RIGHT Justify right """ CENTER = 'center' LEFT = 'ljust' RIGHT = 'rjust' class Lookahead: """ Args: iterator(:py:term:`iterator`): Instance of an iterator Wrapper for an iterator supporting look ahead """ def __init__(self, iterator): self.iterator = iterator self.buffer = [] def __iter__(self): return self def __next__(self): return self.buffer.pop(0) if self.buffer else next(self.iterator) # Python 2 next = __next__ def __getitem__(self, key): if isinstance(key, int): first = last = key elif isinstance(key, slice): first = key.start or 0 last = max(first, (key.stop or 0) - 1) else: raise TypeError('Index or slice notation is required') if first < 0: raise ValueError('Negative indexes are not supported') while last >= len(self.buffer): try: self.buffer.append(next(self.iterator)) except StopIteration: break return self.buffer.__getitem__(key) class Span(list): """ Container for span classes A list is used to preserve order """ def __str__(self): return '' % ' '.join(self) def append_unique(self, item): """ Append only if value is unique """ if item not in self: self.append(item) class HTMLConverter(object): """ Args: term(:py:class:`blessed.Terminal`): Blessed terminal instance Blessed-based ANSI terminal code to HTML converter """ def __init__(self, term): self.term = term self.caps = self.term.caps self.normal = [elem[0] for elem in iter_parse(term, term.normal)] self.normal_rem = len(self.normal) - 1 self._styles = OrderedDict() self._additional_styles = set() @property def style(self): """ Formatted style section for an HTML document Styles are cumulative for the life of the instance """ out = '\n' return out def to_html(self, text): """ Args: text(str): String formatted with ANSI escape codes Convert text to HTML Formatted text is enclosed in an HTML span and classes are available in HTMLConverter.style Supported formatting: - Blink - Bold - Color (8, 16, 256, and RGB) - Italic - Links - Underline """ out = '
'
        open_spans = 0
        to_out = []
        parsed = Lookahead(iter_parse(self.term, text))
        normal = self.normal

        # Iterate through parsed text
        for value, cap in parsed:

            # If there's no capability, it's just regular text
            if cap is None:

                # Add in any previous spans
                out += ''.join(str(item) for item in to_out)
                del to_out[:]  # Python 2 compatible .clear()

                # Append character and continue
                out += HTML_ESCAPE.get(value, value)
                continue

            # Parse links
            if cap is self.caps['link']:
                url = RE_LINK.match(value).group(1).strip()
                out += '' % url if url else ''
                continue

            last_added = to_out[-1] if to_out else None

            # Look for normal to close span
            if value == normal[0] and normal[1:] == [val[0] for val in parsed[: self.normal_rem]]:

                # Clear rest of normal
                for _ in range(self.normal_rem):
                    next(parsed)

                # Ignore empty spans
                if isinstance(last_added, Span):
                    to_out.pop()
                    open_spans -= 1

                # Only add if there are open spans
                elif open_spans:
                    to_out.append('')
                    open_spans -= 1

                continue  # pragma: no cover  # To be fixed in PEP 626 (3.10)

            # Parse styles
            key, value = self._parse_style(value, cap)

            # If not parsed, ignore
            if not key:
                continue

            # Update style sheet
            self._styles[key] = value

            # Update span classes
            if isinstance(last_added, Span):
                last_added.append_unique(key)
            else:
                to_out.append(Span([key]))
                open_spans += 1

        # Process any remaining caps
        out += ''.join(str(item) for item in to_out)

        # Close any spans that didn't get closed
        out += '' * open_spans

        out += '
' return out set_a_codes = { 1: ('enlighten-bold', {'font-weight': 'bold'}), 3: ('enlighten-italic', {'font-style': 'italic'}), 5: ('enlighten-blink', {'animation': 'enlighten-blink-animation 1s steps(5, start) infinite'}), 4: ('enlighten-underline', {'text-decoration': 'underline'}), } @property @lru_cache() def rgb_to_colors(self): """ Dictionary for translating known RGB values into X11 names """ rtn = {} for key, val in sorted(X11_COLORNAMES_TO_RGB.items()): val = '#%02x%02x%02x' % val if val not in rtn: rtn[val] = key return rtn def _color256_lookup(self, idx): """ Look up RGB values and attempt to get names in the 256 color space """ rgb = str(RGB_256TABLE[idx]) # Some terminals use 256 color syntax for basic colors if 0 <= idx <= 7: # pragma: no cover(Non-standard Terminal) name = CGA_COLORS[idx] elif 8 <= idx <= 15: # pragma: no cover(Non-standard Terminal) name = 'bright-%s' % CGA_COLORS[idx - 8] else: name = self.rgb_to_colors.get((rgb[1:3], rgb[3:5], rgb[5:7]), rgb[1:]) return name, rgb @lru_cache(maxsize=256) def _parse_style(self, value, cap): # pylint: disable=too-many-return-statements r""" Args: value (str): VT100 terminal code cap(term(:py:class:`~blessed.sequences.Termcap`): Blessed terminal capability Parse text attributes of the form '\x1b\[\d+m' into CSS styles """ caps = self.caps # Parse RGB color foreground if cap is caps['color_rgb']: rgb = '#%02x%02x%02x' % tuple(int(num) for num in RE_COLOR_RGB.match(value).groups()) name = self.rgb_to_colors.get(rgb, rgb[1:]) return 'enlighten-fg-%s' % name, {'color': rgb} # Parse RGB color background if cap is caps['on_color_rgb']: rgb = '#%02x%02x%02x' % tuple(int(num) for num in RE_ON_COLOR_RGB.match(value).groups()) name = self.rgb_to_colors.get(rgb, rgb[1:]) return 'enlighten-bg-%s' % name, {'background-color': rgb} # Weird and inconsistent bug that seems to affect Python <= 3.5 # Matches set_a_attributes3 instead of more specific color 256 patterns if cap is caps['set_a_attributes3']: # pragma: no cover if caps['color256'].re_compiled.match(value): cap = caps['color256'] elif caps['on_color256'].re_compiled.match(value): cap = caps['on_color256'] # Parse 256 color foreground if cap is caps['color256']: name, rgb = self._color256_lookup(int(RE_COLOR_256.match(value).group(1))) return 'enlighten-fg-%s' % name, {'color': rgb} # Parse 256 color background if cap is caps['on_color256']: name, rgb = self._color256_lookup(int(RE_ON_COLOR_256.match(value).group(1))) return 'enlighten-bg-%s' % name, {'background-color': rgb} # Parse text attributes if cap is caps['set_a_attributes1']: code = int(RE_SET_A.match(value).group(1)) else: return None, None # Blink needs additional styling if code == 5: self._additional_styles.add( '@keyframes enlighten-blink-animation {\n to {\n visibility: hidden;\n }\n}' ) if code in self.set_a_codes: return self.set_a_codes[code] if 30 <= code <= 37: idx = code - 30 return 'enlighten-fg-%s' % CGA_COLORS[idx], {'color': str(RGB_256TABLE[idx])} if 40 <= code <= 47: idx = code - 40 return 'enlighten-bg-%s' % CGA_COLORS[idx], {'background-color': str(RGB_256TABLE[idx])} if 90 <= code <= 97: idx = code - 90 return 'enlighten-fg-bright-%s' % CGA_COLORS[idx], {'color': str(RGB_256TABLE[idx + 8])} if 100 <= code <= 107: idx = code - 100 return ( 'enlighten-bg-bright-%s' % CGA_COLORS[idx], {'background-color': str(RGB_256TABLE[idx + 8])} ) return None, None enlighten-1.11.2/enlighten/counter.py000066400000000000000000000023021436526347400175720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten counter submodule** Provides Counter class """ import sys from enlighten._counter import Counter as _Counter from enlighten._counter import SubCounter # pylint: disable=unused-import # noqa: F401 from enlighten._statusbar import StatusBar # pylint: disable=unused-import # noqa: F401 from enlighten.manager import get_manager # Counter is defined here to avoid circular dependencies class Counter(_Counter): # pylint: disable=missing-docstring # pylint: disable=too-many-instance-attributes __doc__ = _Counter.__doc__ def __init__(self, **kwargs): manager = kwargs.get('manager') stream = kwargs.pop('stream', sys.__stdout__) if manager is None: manager = get_manager(stream=stream, counter_class=self.__class__, set_scroll=False) manager.counters[self] = 1 kwargs['manager'] = manager super(Counter, self).__init__(**kwargs) enlighten-1.11.2/enlighten/manager.py000066400000000000000000000036161436526347400175360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ **Enlighten manager submodule** Provides Manager classes and utilities """ import sys from enlighten._counter import Counter from enlighten._manager import Manager try: from IPython import get_ipython IN_NOTEBOOK = 'IPKernelApp' in get_ipython().config from enlighten._notebook_manager import NotebookManager # pylint: disable=ungrouped-imports except (ImportError, AttributeError): IN_NOTEBOOK = False def get_manager(stream=None, counter_class=Counter, **kwargs): """ Args: stream(:py:term:`file object`): Output stream. If :py:data:`None`, defaults to :py:data:`sys.__stdout__` counter_class(:py:term:`class`): Progress bar class (Default: :py:class:`Counter`) kwargs(Dict[str, Any]): Any additional :py:term:`keyword arguments` will passed to the manager class. Returns: :py:class:`Manager`: Manager instance Convenience function to get a manager instance If running inside a notebook, a :py:class:`NotebookManager` instance is returned. otherwise a standard :py:class:`Manager` instance is returned. If a a standard :py:class:`Manager` instance is used and ``stream`` is not attached to a TTY, the :py:class:`Manager` instance is disabled. """ if IN_NOTEBOOK: return NotebookManager(stream=stream, counter_class=counter_class, **kwargs) stream = sys.__stdout__ if stream is None else stream isatty = hasattr(stream, 'isatty') and stream.isatty() kwargs['enabled'] = isatty and kwargs.get('enabled', True) return Manager(stream=stream, counter_class=counter_class, **kwargs) enlighten-1.11.2/examples/000077500000000000000000000000001436526347400154055ustar00rootroot00000000000000enlighten-1.11.2/examples/__init__.py000066400000000000000000000000001436526347400175040ustar00rootroot00000000000000enlighten-1.11.2/examples/basic.py000066400000000000000000000011541436526347400170410ustar00rootroot00000000000000# Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Basic progress bar example """ import time import enlighten def process_files(): """ Process files with a single progress bar """ with enlighten.Counter(total=100, desc='Simple', unit='ticks') as pbar: for _ in range(100): time.sleep(0.05) pbar.update() if __name__ == '__main__': process_files() enlighten-1.11.2/examples/context_manager.py000066400000000000000000000020051436526347400211320ustar00rootroot00000000000000# Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Progress bar example with context managers """ import random import time import enlighten SPLINES = 15 LLAMAS = 20 def process_files(): """ Use Manager and Counter as context managers """ with enlighten.Manager() as manager: with manager.counter(total=SPLINES, desc='Reticulating:', unit='splines') as retic: for _ in range(SPLINES): time.sleep(random.uniform(0.1, 0.5)) # Random processing time retic.update() with manager.counter(total=LLAMAS, desc='Herding:', unit='llamas') as herd: for _ in range(SPLINES): time.sleep(random.uniform(0.1, 0.5)) # Random processing time herd.update() if __name__ == '__main__': process_files() enlighten-1.11.2/examples/demo.py000066400000000000000000000044461436526347400167130ustar00rootroot00000000000000# Copyright 2019 - 2021 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Demo of Enlighten's features """ import os import platform import random import time import sys import enlighten # Hack so imports work regardless of how this gets called # We do it this way so any enlighten path can be used sys.path.insert(1, os.path.dirname(__file__)) # pylint: disable=wrong-import-order,import-error,wrong-import-position from multicolored import run_tests, load # noqa: E402 from multiple_logging import process_files, win_time_granularity # noqa: E402 from prefixes import download # noqa: E402 def initialize(manager, initials=15): """ Simple progress bar example """ # Simulated preparation pbar = manager.counter(total=initials, desc='Initializing:', unit='initials') for _ in range(initials): time.sleep(random.uniform(0.05, 0.25)) # Random processing time pbar.update() pbar.close() def main(): """ Main function """ with enlighten.get_manager() as manager: status = manager.status_bar(status_format=u'Enlighten{fill}Stage: {demo}{fill}{elapsed}', color='bold_underline_bright_white_on_lightslategray', justify=enlighten.Justify.CENTER, demo='Initializing', autorefresh=True, min_delta=0.5) docs = manager.term.link('https://python-enlighten.readthedocs.io/en/stable/examples.html', 'Read the Docs') manager.status_bar(' More examples on %s! ' % docs, position=1, fill='-', justify=enlighten.Justify.CENTER) initialize(manager, 15) status.update(demo='Loading') load(manager, 40) status.update(demo='Testing') run_tests(manager, 20) status.update(demo='Downloading') download(manager, 2.0 * 2 ** 20) status.update(demo='File Processing') process_files(manager) if __name__ == '__main__': if platform.system() == 'Windows': with win_time_granularity(1): main() else: main() enlighten-1.11.2/examples/floats.py000066400000000000000000000022321436526347400172460ustar00rootroot00000000000000# Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Basic progress bar example """ from __future__ import print_function import time import enlighten # Use float formatting for count and total in bar_format BAR_FMT = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| {count:{len_total}.1f}/{total:.1f} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' COUNTER_FMT = u'{desc}{desc_pad}{count:.1f} {unit}{unit_pad}' + \ u'[{elapsed}, {rate:.2f}{unit_pad}{unit}/s]{fill}' def process_files(count=None): """ Process files with a single progress bar """ pbar = enlighten.Counter(total=count, desc='Simple', unit='ticks', bar_format=BAR_FMT, counter_format=COUNTER_FMT) for _ in range(100): time.sleep(0.05) pbar.update(1.1) if __name__ == '__main__': # Progress bar process_files(110.0) print() # No total, so we just get a counter process_files() enlighten-1.11.2/examples/ftp_downloader.py000066400000000000000000000036471436526347400210000ustar00rootroot00000000000000# Copyright 2018 - 2021 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Example FTP downloader """ import ftplib import os import enlighten SITE = 'test.rebex.net' USER = 'demo' PASSWD = 'password' DIR = 'pub/example' DEST = '/tmp' DEBUG = 0 # 0, 1, 2 are valid MANAGER = enlighten.get_manager() class Writer(object): """ Context manager for handling download writes """ def __init__(self, filename, size, directory=None): self.filename = filename self.size = size self.dest = os.path.join(directory, filename) if directory else filename self.status = self.fileobj = None def __enter__(self): self.status = MANAGER.counter(total=self.size, desc=self.filename, unit='bytes', leave=False) self.fileobj = open(self.dest, 'wb') # pylint: disable=consider-using-with return self def __exit__(self, *args): self.fileobj.close() self.status.close() def write(self, block): """ Write to local file and update progress bar """ self.fileobj.write(block) self.status.update(len(block)) def download(): """ Download all files from an FTP share """ ftp = ftplib.FTP(SITE) ftp.set_debuglevel(DEBUG) ftp.login(USER, PASSWD) ftp.cwd(DIR) filelist = ftp.nlst() filecounter = MANAGER.counter(total=len(filelist), desc='Downloading', unit='files') for filename in filelist: with Writer(filename, ftp.size(filename), DEST) as writer: ftp.retrbinary('RETR %s' % filename, writer.write) print(filename) filecounter.update() ftp.close() if __name__ == '__main__': download() enlighten-1.11.2/examples/multicolored.py000066400000000000000000000110001436526347400204510ustar00rootroot00000000000000# Copyright 2019 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Multicolored progress bar example """ import logging import random import time import enlighten logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger("enlighten") BAR_FMT = u'{desc}{desc_pad}{percentage_2:3.0f}%|{bar}| {count_2:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta_2}, {rate_2:.2f}{unit_pad}{unit}/s]' class Node(object): """ Simulated service node """ def __init__(self, iden): self.iden = iden self._connected = None self._loaded = None def connect(self): """ Connect to node """ self._connected = False def load(self): """ Load service """ self._loaded = False @property def connected(self): """ Connected state """ return self._state('_connected', 3) @property def loaded(self): """ Loaded state """ return self._state('_loaded', 5) def _state(self, variable, num): """ Generic method to randomly determine if state is reached """ value = getattr(self, variable) if value is None: return False if value is True: return True if random.randint(1, num) == num: setattr(self, variable, True) return True return False def run_tests(manager, tests=100): """ Simulate a test program Tests will error (yellow), fail (red), or succeed (green) """ terminal = manager.term bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' + \ u'S:' + terminal.green3(u'{count_0:{len_total}d}') + u' ' + \ u'F:' + terminal.red2(u'{count_2:{len_total}d}') + u' ' + \ u'E:' + terminal.yellow2(u'{count_1:{len_total}d}') + u' ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' with manager.counter(total=tests, desc='Testing', unit='tests', color='green3', bar_format=bar_format) as success: errors = success.add_subcounter('yellow2') failures = success.add_subcounter('red2') for num in range(tests): time.sleep(random.uniform(0.1, 0.3)) # Random processing time result = random.randint(0, 10) if result == 7: LOGGER.error("Test %d did not complete", num) errors.update() elif result in {5, 6}: LOGGER.error("Test %d failed", num) failures.update() else: LOGGER.info("Test %d passed", num) success.update() def load(manager, units=80): """ Simulate loading services from a remote node States are connecting (red), loading (yellow), and loaded (green) """ pb_connecting = manager.counter(total=units, desc='Loading', unit='services', color='red2', bar_format=BAR_FMT) pb_loading = pb_connecting.add_subcounter('yellow2') pb_loaded = pb_connecting.add_subcounter('green3', all_fields=True) connecting = [] loading = [] loaded = [] count = 0 while pb_loaded.count < units: time.sleep(random.uniform(0.05, 0.15)) # Random processing time for idx, node in enumerate(loading): if node.loaded: loading.pop(idx) loaded.append(node) LOGGER.info('Service %d loaded', node.iden) pb_loaded.update_from(pb_loading) for idx, node in enumerate(connecting): if node.connected: connecting.pop(idx) node.load() loading.append(node) LOGGER.info('Service %d connected', node.iden) pb_loading.update_from(pb_connecting) # Connect to up to 5 units at a time for _ in range(min(units - count, 5 - len(connecting))): node = Node(count) node.connect() connecting.append(node) LOGGER.info('Connection to service %d', node.iden) pb_connecting.update() count += 1 def main(): """ Main function """ manager = enlighten.get_manager() run_tests(manager, 100) load(manager, 80) if __name__ == "__main__": main() enlighten-1.11.2/examples/multiple_logging.py000066400000000000000000000055671436526347400213350ustar00rootroot00000000000000# Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Multiple progress bars example """ from contextlib import contextmanager import logging import platform import random import time import enlighten logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger('enlighten') DATACENTERS = 5 SYSTEMS = (5, 10) # Range FILES = (10, 100) # Range @contextmanager def win_time_granularity(milliseconds): """ time.sleep() on Windows may not have high precision with older versions of Python This will temporarily change the timing resolution # https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timebeginperiod """ from ctypes import windll # pylint: disable=import-outside-toplevel try: windll.winmm.timeBeginPeriod(milliseconds) yield finally: windll.winmm.timeEndPeriod(milliseconds) def process_files(manager): """ Process a random number of files on a random number of systems across multiple data centers """ # Get a top level progress bar enterprise = manager.counter(total=DATACENTERS, desc='Processing:', unit='datacenters') # Iterate through data centers for d_num in range(1, DATACENTERS + 1): systems = random.randint(*SYSTEMS) # Random number of systems # Get a child progress bar. leave is False so it can be replaced datacenter = manager.counter(total=systems, desc=' Datacenter %d:' % d_num, unit='systems', leave=False) # Iterate through systems for s_num in range(1, systems + 1): # Has no total, so will act as counter. Leave is False system = manager.counter(desc=' System %d:' % s_num, unit='files', leave=False) files = random.randint(*FILES) # Random file count # Iterate through files for _ in range(files): system.update() # Update count time.sleep(random.uniform(0.001, 0.005)) # Random processing time system.close() # Close counter so it gets removed # Log status LOGGER.info('Updated %d files on System %d in Datacenter %d', files, s_num, d_num) datacenter.update() # Update count datacenter.close() # Close counter so it gets removed enterprise.update() # Update count enterprise.close() # Close counter, won't be removed but does a refresh def main(): """ Main function """ with enlighten.get_manager() as manager: process_files(manager) if __name__ == '__main__': if platform.system() == 'Windows': with win_time_granularity(1): main() else: main() enlighten-1.11.2/examples/multiprocessing_queues.py000066400000000000000000000060051436526347400225760ustar00rootroot00000000000000# Copyright 2019 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Example of using Enlighten with multiprocessing This example uses queues for inter-process communication (IPC) """ from multiprocessing import Process, Queue import random import time import enlighten WORKERS = 4 SYSTEMS = (10, 20) FILES = (100, 200) FILE_TIME = (0.01, 0.05) def process_files(queue, count): """ Simple child processor Sleeps for a random interval and pushes the current count onto the queue """ for num in range(1, count + 1): time.sleep(random.uniform(*FILE_TIME)) # Random processing time queue.put(num) def multiprocess_systems(manager, systems): """ Process a random number of virtual files in subprocesses for the given number of systems """ started = 0 active = {} pb_started = manager.counter(total=systems, desc='Systems:', unit='systems', color='yellow') pb_finished = pb_started.add_subcounter('green', all_fields=True) # Loop until all systems finish while systems > started or active: # If there are free workers and tasks left to run, start them if systems > started and len(active) < WORKERS: queue = Queue() files = random.randint(*FILES) process = Process(target=process_files, args=(queue, files)) started += 1 counter = manager.counter(total=files, desc=' System %d:' % started, unit='files', leave=False) process.start() pb_started.update() active[started] = (process, queue, counter) # Iterate through active subprocesses for system in tuple(active.keys()): process, queue, counter = active[system] alive = process.is_alive() # Latest count is the last one on the queue count = None while not queue.empty(): count = queue.get() # Update counter. We do it manually because we have the number not the increment if count is not None: counter.count = count # If no sleep is used in loop use counter.update(0) instead counter.refresh() # Remove any finished subprocesses and update progress bar # If this was real code you could check for failures if not alive: counter.close() print('Processed %d files on System %d' % (counter.total, system)) del active[system] pb_finished.update_from(pb_started) # Sleep for 1/10 of a second to reduce load time.sleep(0.1) def main(): """ Main function """ with enlighten.get_manager() as manager: multiprocess_systems(manager, random.randint(*SYSTEMS)) if __name__ == '__main__': main() enlighten-1.11.2/examples/prefixes.py000066400000000000000000000021631436526347400176060ustar00rootroot00000000000000# Copyright 2020 - 2021 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Progress bar using binary prefixes """ import time import random import enlighten # 64k chunk size CHUNK_SIZE = 64 * 1024 BAR_FORMAT = '{desc}{desc_pad}{percentage:3.0f}%|{bar}| {count:!.2j}{unit} / {total:!.2j}{unit} ' \ '[{elapsed}<{eta}, {rate:!.2j}{unit}/s]' def download(manager, size): """ Simulate a download """ pbar = manager.counter(total=size, desc='Downloading', unit='B', bar_format=BAR_FORMAT, color='purple') bytes_left = size while bytes_left: time.sleep(random.uniform(0.05, 0.15)) next_chunk = min(CHUNK_SIZE, bytes_left) pbar.update(next_chunk) bytes_left -= next_chunk if __name__ == '__main__': with enlighten.get_manager() as mgr: # 1 - 10 MB file size total = random.uniform(1.0, 10.0) * 2 ** 20 download(mgr, total) enlighten-1.11.2/pylintrc000066400000000000000000000056541436526347400153700ustar00rootroot00000000000000 [MAIN] # Load and enable all available extensions. Use --list-extensions to see a list # all available extensions. enable-all-extensions=yes [REPORTS] # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio). You can also give a reporter class, e.g. # mypackage.mymodule.MyReporterClass. output-format=colorized [FORMAT] # Use max line length of 100 max-line-length=100 # Regexp for a line that is allowed to be longer than the limit. # URLs and pure strings ignore-long-lines=^\s*(# )??$|^\s*[f|r|u]?b?[\"\'\`].+[\"\'\`]$ [DESIGN] # Maximum number of branch for function / method body. max-branches=15 [BASIC] # As far as I can tell, PEP-8 (Nov 1, 2013) does not specify # a specific naming convention for variables and arguments # prefer mixedcase, starting with a lowercase or underscore variable-rgx=[a-z_][A-Za-z0-9_]{1,29}[A-Za-z0-9_]$ # Good variable names which should always be accepted, separated by a comma. good-names=e,_ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=__.*__ [MESSAGES CONTROL] # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to # disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". disable= consider-using-f-string, # Python 2 redundant-u-string-prefix, # Python 2 super-with-arguments, # Python 2 too-few-public-methods, useless-object-inheritance, # Python 2 [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=8 [SPELLING] # Spelling dictionary name. Available dictionaries: en_US (myspell). spelling-dict=en_US # List of comma separated words that should not be checked. spelling-ignore-words= Avram, ansicon, Args, assertRaisesRegexp, assertRegexpMatches, assertNotRegexpMatches, attr, AttributeError, autorefresh, BaseManager, bool, CGA, CSS, desc, docstring, downconverted, downloader, Enlighten's, exc, html, IEC, incr, IPC, isatty, iterable, kwargs, Jupyter, len, lookahead, Lubkin, meth, Mozilla, MPL, noqa, peru, pragma, PrintableCounter, py, redirector, resize, resizing, RGB, seagreen, setscroll, scrollable, sphinxcontrib, ss, StatusBar, stdout, stderr, str, subcounter, subcounters, submodule, subprocesses, sys, Termcap, TestCase, tty, TTY, tuple, unicode, unittest, unmanaged, ValueError, # For nbqa NBQA, SEPenlighten-1.11.2/requirements.txt000066400000000000000000000000201436526347400170430ustar00rootroot00000000000000blessed prefixedenlighten-1.11.2/setup.cfg000066400000000000000000000013221436526347400154060ustar00rootroot00000000000000[bdist_wheel] universal=1 [metadata] description_file = README.rst license_files = LICENSE [tool:pytest] python_files = test_*.py testpaths = tests [flake8] max-line-length = 110 exclude = .svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg,build,notes [pycodestyle] max-line-length = 110 [coverage:run] branch = True source = enlighten omit = enlighten/_win_terminal.py [coverage:report] show_missing: True fail_under: 100 exclude_lines = pragma: no cover raise NotImplementedError if __name__ == "__main__": [build_sphinx] source-dir = doc build-dir = build/doc all_files = True fresh-env = True warning-is-error = True [aliases] spelling=build_sphinx --builder spelling html=build_sphinx --builder html enlighten-1.11.2/setup.py000066400000000000000000000050461436526347400153060ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Enlighten Progress Bar is console progress bar module for Python. (Yes, another one.) The main advantage of Enlighten is it allows writing to stdout and stderr without any redirection. """ import os from setuptools import setup, find_packages from setup_helpers import get_version, readme INSTALL_REQUIRES = [ 'blessed>=1.17.7', 'prefixed>=0.3.2', 'backports.functools-lru-cache; python_version < "3.2"' ] TESTS_REQUIRE = ['mock; python_version < "3.3"'] # Additional requirements # html requires sphinx, sphinx_rtd_theme # spelling requires sphinxcontrib-spelling setup( name='enlighten', version=get_version(os.path.join('enlighten', '__init__.py')), description='Enlighten Progress Bar', long_description=readme('README.rst'), author='Avram Lubkin', author_email='avylove@rockhopper.net', maintainer='Avram Lubkin', maintainer_email='avylove@rockhopper.net', url='https://github.com/Rockhopper-Technologies/enlighten', project_urls={'Documentation': 'https://python-enlighten.readthedocs.io'}, license='MPLv2.0', zip_safe=False, install_requires=INSTALL_REQUIRES, tests_require=TESTS_REQUIRE, packages=find_packages(exclude=['tests', 'tests.*', 'examples']), test_suite='tests', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Intended Audience :: Developers', 'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)', 'Operating System :: POSIX', 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Utilities', ], keywords='progress, bar, progressbar, counter, status, statusbar', ) enlighten-1.11.2/setup_helpers.py000066400000000000000000000156401436526347400170310ustar00rootroot00000000000000# Copyright 2017 - 2023 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Functions to help with build and setup """ import datetime import io import os import re import subprocess import sys RE_VERSION = re.compile(r'__version__\s*=\s*[\'\"](.+)[\'\"]$') DIR_SPELLING = 'build/doc/spelling/' def get_version(filename, encoding='utf8'): """ Get __version__ definition out of a source file """ with io.open(filename, encoding=encoding) as sourcecode: for line in sourcecode: version = RE_VERSION.match(line) if version: return version.group(1) return None def readme(filename, encoding='utf8'): """ Read the contents of a file """ with io.open(filename, encoding=encoding) as source: return source.read() def print_spelling_errors(filename, encoding='utf8'): """ Print misspelled words returned by sphinxcontrib-spelling """ try: filesize = os.stat(filename).st_size except FileNotFoundError: filesize = 0 if filesize: sys.stdout.write('Misspelled Words:\n') with io.open(filename, encoding=encoding) as wordlist: for line in wordlist: sys.stdout.write(' ' + line) return 1 if filesize else 0 def print_all_spelling_errors(path): """ Print all spelling errors in the path """ rtn = 0 for filename in os.listdir(path): if print_spelling_errors(os.path.join(path, filename)): rtn = 1 return rtn def spelling_clean_dir(path): """ Remove spelling files from path """ if not os.path.isdir(path): return for filename in os.listdir(path): os.unlink(os.path.join(path, filename)) def check_rst2html(path): """ Checks for warnings when doing ReST to HTML conversion """ # pylint: disable=import-error,import-outside-toplevel from contextlib import redirect_stderr # Import here because it breaks <= Python 3.4 from docutils.core import publish_file # Import here because only available in doc tests stderr = io.StringIO() # This will exit with status if there is a bad enough error with redirect_stderr(stderr): output = publish_file(source_path=path, writer_name='html', enable_exit_status=True, destination_path='/dev/null') warning_text = stderr.getvalue() if warning_text or not output: print(warning_text) return 1 return 0 def _get_changed_files(): """ Get files in current repository that have been changed Ignore changes to copyright lines """ changed = [] # Get list of changed files process = subprocess.run( ('git', 'status', '--porcelain=1'), stdout=subprocess.PIPE, check=True, text=True ) for entry in process.stdout.splitlines(): # Ignore deleted files if entry[1] == 'D': continue # Construct diff command filename = entry[3:].strip() diff_cmd = ['git', 'diff', filename] if entry[0].strip(): diff_cmd.insert(-1, '--cached') # Find files with changes that aren't only for copyright process = subprocess.run(diff_cmd, stdout=subprocess.PIPE, check=True, text=True) for line in process.stdout.splitlines(): if line[0] != '+' or line[:3] == '+++': # Ignore everything but the new contents continue if re.search(r'copyright.*20\d\d', line, re.IGNORECASE): # Ignore copyright line continue changed.append(filename) break return changed def check_copyrights(): """ Check files recursively to ensure year of last change is in copyright line """ this_year = str(datetime.date.today().year) changed_now = _get_changed_files() # Look for copyright lines process = subprocess.run( ('git', 'grep', '-i', 'copyright'), stdout=subprocess.PIPE, check=True, text=True ) rtn = 0 for entry in process.stdout.splitlines(): modified = None # Get the year in the copyright line filename, text = entry.split(':', 1) match = re.match(r'.*(20\d\d)', text) if match: year = match.group(1) # If file is in current changes, use this year if filename in changed_now: modified = this_year # Otherwise, try to get the year of last commit that wasn't only updating copyright else: git_log = subprocess.run( ('git', '--no-pager', 'log', '-U0', filename), stdout=subprocess.PIPE, check=True, text=True ) for line in git_log.stdout.splitlines(): # Get year if line.startswith('Date: '): modified = line.split()[5] # Skip blank line and lines that aren't changes if not line.strip() or line[0] != '+' or line[:3] == '+++': continue # Stop looking on the first line we hit that isn't a copyright if re.search(r'copyright.*20\d\d', line, re.IGNORECASE) is None: break # Special case for Sphinx configuration if filename == 'doc/conf.py' and modified != this_year: # Get the latest change date for docs process = subprocess.run( ('git', 'log', '-1', '--pretty=format:%cs', 'doc/*.rst'), stdout=subprocess.PIPE, check=True, text=True ) modified = process.stdout[:4] # Compare modified date to copyright year if modified and modified != year: rtn = 1 print('%s: %s [%s]' % (filename, text, modified)) return rtn if __name__ == '__main__': # Do nothing if no arguments were given if len(sys.argv) < 2: sys.exit(0) # Print misspelled word list if sys.argv[1] == 'spelling-clean': spelling_clean_dir(DIR_SPELLING) sys.exit(0) # Print misspelled word list if sys.argv[1] == 'spelling': if len(sys.argv) > 2: sys.exit(print_spelling_errors(sys.argv[2])) else: sys.exit(print_all_spelling_errors(DIR_SPELLING)) # Check file for Rest to HTML conversion if sys.argv[1] == 'rst2html': if len(sys.argv) < 3: sys.exit('Missing filename for ReST to HTML check') sys.exit(check_rst2html(sys.argv[2])) # Print misspelled word list if sys.argv[1] == 'copyright': sys.exit(check_copyrights()) # Unknown option else: sys.stderr.write('Unknown option: %s' % sys.argv[1]) sys.exit(1) enlighten-1.11.2/tests/000077500000000000000000000000001436526347400147315ustar00rootroot00000000000000enlighten-1.11.2/tests/__init__.py000066400000000000000000000121371436526347400170460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for Enlighten """ from contextlib import contextmanager import fcntl import io import os import pty import struct import sys import termios import unittest from enlighten import Manager from enlighten._basecounter import BaseCounter from enlighten._counter import Counter from enlighten._statusbar import StatusBar if sys.version_info[:2] < (3, 3): import mock else: from unittest import mock # noqa: F401 # pylint: disable=no-name-in-module PY2 = sys.version_info[0] < 3 OUTPUT = io.StringIO() os.environ['TERM'] = 'xterm-256color' # Default to xterm-256color # pylint: disable=missing-docstring class TestCase(unittest.TestCase): """ Subclass of :py:class:`unittest.TestCase` for customization """ # Fix deprecated methods for 2.7 def assert_regex(self, text, regex, msg=None): """ Wrapper for assertRegexpMatches """ return self.assertRegexpMatches(text, regex, msg) def assert_not_regex(self, text, regex, msg=None): """ Wrapper for assertNotRegexpMatches """ return self.assertNotRegexpMatches(text, regex, msg) def assert_raises_regex(self, exception, regex, *args, **kwargs): """ Wrapper for assertRaisesRegexp """ return self.assertRaisesRegexp(exception, regex, *args, **kwargs) if not hasattr(TestCase, 'assertRegex'): TestCase.assertRegex = assert_regex if not hasattr(TestCase, 'assertNotRegex'): TestCase.assertNotRegex = assert_not_regex if not hasattr(TestCase, 'assertRaisesRegex'): TestCase.assertRaisesRegex = assert_raises_regex # Some tests fail if "real" stdout is does not have a file descriptor try: sys.__stdout__.fileno() except ValueError: STDOUT_NO_FD = True else: STDOUT_NO_FD = False @contextmanager def redirect_output(stream, target): """ Temporary redirector for stdout and stderr """ original = getattr(sys, stream) try: setattr(sys, stream, target) yield finally: setattr(sys, stream, original) class MockTTY(object): def __init__(self, height=25, width=80): self.master, self.slave = pty.openpty() # pylint: disable=consider-using-with self.stdout = io.open(self.slave, 'w', 1, encoding='UTF-8', newline='') self.stdread = io.open(self.master, 'r', encoding='UTF-8', newline='\n') # Make sure linefeed behavior is consistent between Python 2 and Python 3 termattrs = termios.tcgetattr(self.slave) termattrs[1] = termattrs[1] & ~termios.ONLCR & ~termios.OCRNL termattrs[0] = termattrs[0] & ~termios.ICRNL termios.tcsetattr(self.slave, termios.TCSADRAIN, termattrs) self.resize(height, width) def flush(self): self.stdout.flush() def close(self): self.stdout.flush() self.stdout.close() self.stdread.close() def clear(self): # Using TCIOFLUSH here instead of TCIFLUSH to support MacOS termios.tcflush(self.stdread, termios.TCIOFLUSH) def resize(self, height, width): fcntl.ioctl(self.slave, termios.TIOCSWINSZ, struct.pack('hhhh', height, width, 0, 0)) class MockBaseCounter(BaseCounter): """ Mock version of base counter for testing """ def update(self, *args, **kwargs): """ Simple update that updates the count. We know it's called based on the count. """ self.count += 1 class MockCounter(Counter): __slots__ = ('output', 'calls') def __init__(self, *args, **kwargs): super(MockCounter, self).__init__(*args, **kwargs) self.output = [] self.calls = [] def refresh(self, flush=True, elapsed=None): self.output.append(self.count) self.calls.append('refresh(flush=%s, elapsed=%s)' % (flush, elapsed)) def clear(self, flush=True): self.calls.append('clear(flush=%s)' % flush) class MockStatusBar(StatusBar): __slots__ = ('called', 'calls') def __init__(self, *args, **kwargs): super(MockStatusBar, self).__init__(*args, **kwargs) self.called = 0 self.calls = [] def refresh(self, flush=True, elapsed=None): self.called += 1 self.calls.append('refresh(flush=%s, elapsed=%s)' % (flush, elapsed)) class MockManager(Manager): # pylint: disable=super-init-not-called def __init__(self, counter_class=Counter, **kwargs): super(MockManager, self).__init__(counter_class=counter_class, **kwargs) self.width = 80 self.output = [] self.remove_calls = 0 def write(self, output='', flush=True, counter=None, **kwargs): if callable(output): output = output(**kwargs) self.output.append('write(output=%s, flush=%s, position=%s)' % (output, flush, counter.position)) def remove(self, counter): self.remove_calls += 1 super(MockManager, self).remove(counter) enlighten-1.11.2/tests/test_basecounter.py000066400000000000000000000130741436526347400206610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._counter and enlighten.counter """ from types import GeneratorType from enlighten._basecounter import BaseCounter from tests import TestCase, MockManager, MockTTY, MockBaseCounter # pylint: disable=protected-access class TestBaseCounter(TestCase): """ Test the BaseCounter class """ def setUp(self): self.tty = MockTTY() self.manager = MockManager(stream=self.tty.stdout) def tearDown(self): self.tty.close() def test_init_default(self): """Ensure default values are set""" counter = BaseCounter(manager=self.manager) self.assertIsNone(counter.color) self.assertIsNone(counter.color) self.assertIs(counter.manager, self.manager) self.assertEqual(counter.count, 0) self.assertEqual(counter.start_count, 0) def test_no_manager(self): """Raise an error if there is no manager specified""" with self.assertRaisesRegex(TypeError, 'manager must be specified'): BaseCounter() def test_color_invalid(self): """Color must be a valid string, RGB, or int 0 - 255""" # Unsupported type with self.assertRaisesRegex(AttributeError, 'Invalid color specified: 1.0'): BaseCounter(manager=self.manager, color=1.0) # Invalid String with self.assertRaisesRegex(AttributeError, 'Invalid color specified: buggersnot'): BaseCounter(manager=self.manager, color='buggersnot') # Invalid integer with self.assertRaisesRegex(AttributeError, 'Invalid color specified: -1'): BaseCounter(manager=self.manager, color=-1) with self.assertRaisesRegex(AttributeError, 'Invalid color specified: 256'): BaseCounter(manager=self.manager, color=256) # Invalid iterable with self.assertRaisesRegex(AttributeError, r'Invalid color specified: \[\]'): BaseCounter(manager=self.manager, color=[]) with self.assertRaisesRegex(AttributeError, r'Invalid color specified: \[1\]'): BaseCounter(manager=self.manager, color=[1]) with self.assertRaisesRegex(AttributeError, r'Invalid color specified: \(1, 2\)'): BaseCounter(manager=self.manager, color=(1, 2)) with self.assertRaisesRegex(AttributeError, r'Invalid color specified: \(1, 2, 3, 4\)'): BaseCounter(manager=self.manager, color=(1, 2, 3, 4)) def test_colorize_none(self): """If color is None, return content unchanged""" counter = BaseCounter(manager=self.manager) self.assertEqual(counter._colorize('test'), 'test') def test_colorize_string(self): """Return string formatted with color (string)""" counter = BaseCounter(manager=self.manager, color='red') self.assertEqual(counter.color, 'red') self.assertEqual(counter._color, ('red', self.manager.term.red)) self.assertNotEqual(counter._colorize('test'), 'test') self.assertEqual(counter._colorize('test'), self.manager.term.red('test')) def test_colorize_string_compound(self): """Return string formatted with compound color (string)""" counter = BaseCounter(manager=self.manager, color='bold_red_on_blue') self.assertEqual(counter.color, 'bold_red_on_blue') self.assertEqual(counter._color, ('bold_red_on_blue', self.manager.term.bold_red_on_blue)) self.assertNotEqual(counter._colorize('test'), 'test') self.assertEqual(counter._colorize('test'), self.manager.term.bold_red_on_blue('test')) def test_colorize_int(self): """Return string formatted with color (int)""" counter = BaseCounter(manager=self.manager, color=40) self.assertEqual(counter.color, 40) self.assertEqual(counter._color, (40, self.manager.term.color(40))) self.assertNotEqual(counter._colorize('test'), 'test') self.assertEqual(counter._colorize('test'), self.manager.term.color(40)('test')) def test_colorize_rgb(self): """Return string formatted with color (RGB)""" counter = BaseCounter(manager=self.manager, color=(50, 40, 60)) self.assertEqual(counter.color, (50, 40, 60)) self.assertEqual(counter._color, ((50, 40, 60), self.manager.term.color_rgb(50, 40, 60))) self.assertNotEqual(counter._colorize('test'), 'test') self.assertEqual(counter._colorize('test'), self.manager.term.color_rgb(50, 40, 60)('test')) def test_call(self): """Returns generator when used as a function""" # Bad arguments counter = MockBaseCounter(manager=self.manager) with self.assertRaisesRegex(TypeError, 'Argument type int is not iterable'): list(counter(1)) with self.assertRaisesRegex(TypeError, 'Argument type bool is not iterable'): list(counter([1, 2, 3], True)) # Expected counter = MockBaseCounter(manager=self.manager) rtn = counter([1, 2, 3]) self.assertIsInstance(rtn, GeneratorType) self.assertEqual(list(rtn), [1, 2, 3]) self.assertEqual(counter.count, 3) # Multiple arguments counter = MockBaseCounter(manager=self.manager) rtn = counter([1, 2, 3], (3, 2, 1)) self.assertIsInstance(rtn, GeneratorType) self.assertEqual(tuple(rtn), (1, 2, 3, 3, 2, 1)) self.assertEqual(counter.count, 6) enlighten-1.11.2/tests/test_counter.py000066400000000000000000001145141436526347400200270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2023 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._counter and enlighten.counter """ import time from enlighten import Counter, EnlightenWarning, Manager import enlighten._counter from tests import TestCase, mock, MockManager, MockTTY, MockCounter, PY2, unittest # pylint: disable=missing-docstring, protected-access, too-many-public-methods SERIES_STD = u' ▏▎▍▌▋▊▉█' BLOCK = enlighten._counter.SERIES_STD[-1] class TestSubCounter(TestCase): """ Test the BaseCounter class """ def setUp(self): self.tty = MockTTY() self.manager = MockManager(stream=self.tty.stdout) self.parent = Counter(total=10, desc='Test', unit='ticks', manager=self.manager) def tearDown(self): self.tty.close() def test_init(self): """Ensure initial values are set""" counter = enlighten._counter.SubCounter(self.parent) self.assertIsNone(counter.color) self.assertEqual(counter.count, 0) self.assertFalse(counter.all_fields) self.assertIs(counter.parent, self.parent) self.assertIs(counter.manager, self.manager) self.parent.count = 4 counter = enlighten._counter.SubCounter(self.parent, color='green', count=4, all_fields=True) self.assertEqual(counter.color, 'green') self.assertEqual(counter.count, 4) self.assertTrue(counter.all_fields) with self.assertRaisesRegex(ValueError, 'Invalid count: 6'): counter = enlighten._counter.SubCounter(self.parent, count=6) def test_update(self): """Increment and update parent""" counter = enlighten._counter.SubCounter(self.parent) self.assertEqual(counter.count, 0) self.assertEqual(self.parent.count, 0) counter.update() self.assertEqual(counter.count, 1) self.assertEqual(self.parent.count, 1) self.parent.update(3) self.assertEqual(counter.count, 1) self.assertEqual(self.parent.count, 4) counter.update(2) self.assertEqual(counter.count, 3) self.assertEqual(self.parent.count, 6) def test_update_from_invalid_source(self): """Must be peer or parent""" counter = enlighten._counter.SubCounter(self.parent) notparent = Counter(manager=self.manager) with self.assertRaisesRegex(ValueError, 'source must be parent or peer'): counter.update_from(notparent) notpeer = enlighten._counter.SubCounter(notparent) with self.assertRaisesRegex(ValueError, 'source must be parent or peer'): counter.update_from(notpeer) def test_update_from_invalid_incr(self): """Increment can't make source negative""" counter = enlighten._counter.SubCounter(self.parent) with self.assertRaisesRegex(ValueError, 'Invalid increment: 1'): counter.update_from(self.parent) self.parent.count = 4 peer = enlighten._counter.SubCounter(self.parent, count=3) self.parent._subcounters.append(peer) with self.assertRaisesRegex(ValueError, 'Invalid increment: 4'): counter.update_from(peer, 4) with self.assertRaisesRegex(ValueError, 'Invalid increment: 2'): counter.update_from(self.parent, 2) def test_update_from_parent(self): """ subcounter should gain increment, parent should remain unchanged """ counter = enlighten._counter.SubCounter(self.parent) self.parent.count = 4 with mock.patch.object(self.parent, 'update', wraps=self.parent.update) as update: counter.update_from(self.parent) update.assert_called_with(0, False) self.assertEqual(self.parent.count, 4) self.assertEqual(counter.count, 1) counter.update_from(self.parent, 2) update.assert_called_with(0, False) self.assertEqual(self.parent.count, 4) self.assertEqual(counter.count, 3) def test_update_from_peer(self): """ Peer should lose increment, subcounter should gain increment """ counter = enlighten._counter.SubCounter(self.parent) self.parent.count = 6 peer = enlighten._counter.SubCounter(self.parent, count=4) with mock.patch.object(self.parent, 'update', wraps=self.parent.update) as update: counter.update_from(peer) update.assert_called_with(0, False) self.assertEqual(self.parent.count, 6) self.assertEqual(counter.count, 1) self.assertEqual(peer.count, 3) counter.update_from(peer, 3) update.assert_called_with(0, False) self.assertEqual(self.parent.count, 6) self.assertEqual(counter.count, 4) self.assertEqual(peer.count, 0) class TestCounter(TestCase): """ Test the Counter classes We default to using enlighten.Counter and only use enlighten._counter.Counter when necessary """ def setUp(self): self.tty = MockTTY() self.manager = MockManager(stream=self.tty.stdout) self.ctr = Counter(total=10, desc='Test', unit='ticks', manager=self.manager) self.manager.counters[self.ctr] = 3 self.output = r'Test 0%\|[ ]+ \| 0/10 \[00:0\d<\?, 0.00 ticks/s\]' def tearDown(self): self.tty.close() def test_repr(self): self.assertEqual(repr(self.ctr), "Counter(desc='Test', total=10, count=0, unit='ticks')") def test_repr_subcounter(self): self.ctr.count = 2 subcounter = self.ctr.add_subcounter('green', count=1) self.assertEqual(repr(subcounter), "SubCounter(count=1, color='green', all_fields=False)") def test_no_manager(self): """Raise an error if there is no manager specified""" with self.assertRaisesRegex(TypeError, 'manager must be specified'): enlighten._counter.Counter() enlighten._counter.Counter(manager=self.manager) def test_increment(self): counter = MockCounter(total=100, min_delta=0, manager=self.manager) counter.update() self.assertEqual(counter.count, 1) counter.update(5) self.assertEqual(counter.count, 6) def test_enabled(self): counter = MockCounter(total=100, min_delta=0, manager=self.manager) counter.update() self.assertEqual(counter.output, [1]) counter.update() self.assertEqual(counter.output, [1, 2]) counter.enabled = False counter.update() self.assertEqual(counter.output, [1, 2]) def test_delta(self): counter = MockCounter(total=100, min_delta=0, manager=self.manager) counter.update() self.assertEqual(counter.output, [1]) counter.update() self.assertEqual(counter.output, [1, 2]) counter.min_delta = 500 counter.update() self.assertEqual(counter.output, [1, 2]) counter.min_delta = .01 time.sleep(.01) counter.update() self.assertEqual(counter.output, [1, 2, 4]) def test_force(self): counter = MockCounter(total=100, min_delta=0, manager=self.manager) counter.update() self.assertEqual(counter.output, [1]) counter.min_delta = 500 counter.update() self.assertEqual(counter.output, [1]) counter.update(force=True) self.assertEqual(counter.output, [1, 3]) def test_refresh_total(self): counter = MockCounter(total=100, min_delta=0, manager=self.manager) counter.update() self.assertEqual(counter.output, [1]) counter.min_delta = 500 counter.update() self.assertEqual(counter.output, [1]) counter.update(98) self.assertEqual(counter.output, [1, 100]) def test_position(self): self.assertEqual(self.ctr.position, 3) def test_elapsed(self): ctr = self.ctr ctr.start = time.time() - 5.0 ctr.last_update = ctr.start + 3.0 self.assertEqual(int(ctr.elapsed), 5) # Clock stops running when total is reached ctr.count = ctr.total self.assertEqual(int(ctr.elapsed), 3) def test_refresh(self): self.ctr.last_update = 0 self.ctr.refresh() self.assertRegex(self.manager.output[0], r'write\(output=%s, flush=True, position=3\)' % self.output) self.assertAlmostEqual(self.ctr.last_update, time.time(), delta=0.3) self.manager.output = [] self.ctr.refresh(flush=False) self.assertRegex(self.manager.output[0], r'write\(output=%s, flush=False, position=3\)' % self.output) self.manager.output = [] self.ctr.enabled = False self.ctr.refresh() self.assertEqual(len(self.manager.output), 0) def test_clear(self): self.ctr.last_update = 100 self.ctr.clear() self.assertRegex(self.manager.output[0], r'write\(output=, flush=True, position=3\)') self.assertEqual(self.ctr.last_update, 0) self.manager.output = [] self.ctr.clear(flush=False) self.assertRegex(self.manager.output[0], r'write\(output=, flush=False, position=3\)') self.manager.output = [] self.ctr.enabled = False self.ctr.clear() self.assertEqual(len(self.manager.output), 0) def test_get_subcounter(self): self.ctr.count = 6 subcounter1 = self.ctr.add_subcounter('green') subcounter2 = self.ctr.add_subcounter('red', all_fields=True) subcounter2.count = 4 subcounter3 = self.ctr.add_subcounter('white', count=1, all_fields=True) fields = {'count': self.ctr.count, 'percentage': 60.0} subcounters = self.ctr._get_subcounters(8, fields) self.assertEqual(subcounters, [(subcounter1, 0.0), (subcounter2, 0.4), (subcounter3, 0.1)]) self.assertEqual(fields, {'count': 6, 'count_0': 1, 'count_00': 5, 'percentage': 60.0, 'percentage_0': 10.0, 'percentage_00': 50.0, 'percentage_1': 0.0, 'percentage_2': 40.0, 'percentage_3': 10.0, 'count_1': 0, 'count_2': 4, 'count_3': 1, 'interval_0': 4.0, 'interval_00': 2.0, 'interval_2': 2.0, 'interval_3': 0.0, 'rate_0': 0.25, 'rate_00': 0.5, 'rate_2': 0.5, 'eta_2': '00:12', 'rate_3': 0.0, 'eta_3': '?'}) fields = {'count': self.ctr.count, 'percentage': 60.0} subcounters = self.ctr._get_subcounters(0, fields) self.assertEqual(subcounters, [(subcounter1, 0.0), (subcounter2, 0.4), (subcounter3, 0.1)]) self.assertEqual(fields, {'count': 6, 'count_0': 1, 'count_00': 5, 'percentage': 60.0, 'percentage_0': 10.0, 'percentage_00': 50.0, 'percentage_1': 0.0, 'percentage_2': 40.0, 'percentage_3': 10.0, 'count_1': 0, 'count_2': 4, 'count_3': 1, 'interval_0': 0.0, 'interval_00': 0.0, 'interval_2': 0.0, 'interval_3': 0.0, 'rate_0': 0.0, 'rate_00': 0.0, 'rate_2': 0.0, 'eta_2': '?', 'rate_3': 0.0, 'eta_3': '?'}) self.ctr = Counter(total=0, desc='Test', unit='ticks', manager=self.manager) subcounter1 = self.ctr.add_subcounter('red', all_fields=True) fields = {'count': self.ctr.count, 'percentage': 0.0} subcounters = self.ctr._get_subcounters(8, fields) self.assertEqual(subcounters, [(subcounter1, 0.0)]) self.assertEqual(fields, {'count': 0, 'count_0': 0, 'count_00': 0, 'percentage': 0.0, 'percentage_0': 0.0, 'percentage_00': 0.0, 'percentage_1': 0.0, 'count_1': 0, 'interval_0': 0.0, 'interval_00': 0.0, 'rate_0': 0.0, 'rate_00': 0.0, 'interval_1': 0.0, 'rate_1': 0.0, 'eta_1': '00:00'}) def test_get_subcounter_counter_format(self): self.ctr.count = 12 subcounter1 = self.ctr.add_subcounter('green') subcounter2 = self.ctr.add_subcounter('red', all_fields=True) subcounter2.count = 6 subcounter3 = self.ctr.add_subcounter('white', count=1, all_fields=True) fields = {'count': self.ctr.count} subcounters = self.ctr._get_subcounters(8, fields, bar_fields=False) self.assertEqual(subcounters, [(subcounter1, 0.0), (subcounter2, 0.0), (subcounter3, 0.0)]) self.assertEqual(fields, {'count': 12, 'count_0': 5, 'count_00': 7, 'count_1': 0, 'count_2': 6, 'count_3': 1, 'interval_0': 0.75 ** -1, 'interval_00': 0.75 ** -1, 'interval_2': 0.75 ** -1, 'interval_3': 0.0, 'rate_0': 0.75, 'rate_00': 0.75, 'rate_2': 0.75, 'rate_3': 0.0}) def test_remove(self): self.ctr.leave = False self.assertTrue(self.ctr in self.manager.counters) self.ctr.close() self.assertRegex(self.manager.output[0], r'write\(output=%s, flush=True, position=3\)' % self.output) self.assertFalse(self.ctr in self.manager.counters) # If it runs again, it shouldn't throw an error self.ctr.close() def test_format_no_total(self): # No unit, No desc ctr = Counter(stream=self.tty.stdout, ) self.assertRegex(ctr.format(width=80), r'0 \[00:0\d, 0.00/s\]') ctr.count = 50 ctr.start = time.time() - 50 self.assertRegex(ctr.format(width=80), r'50 \[00:5\d, \d.\d\d/s\]') # With unit and description ctr = Counter(stream=self.tty.stdout, desc='Test', unit='ticks') rtn = ctr.format(width=80) self.assertEqual(len(rtn), 80) self.assertRegex(rtn, r'Test 0 ticks \[00:0\d, 0.00 ticks/s\]') ctr.count = 50 ctr.start = time.time() - 50 rtn = ctr.format(width=80) self.assertEqual(len(rtn), 80) self.assertRegex(rtn, r'Test 50 ticks \[00:5\d, \d.\d\d ticks/s\]') def test_format_count_gt_total(self): """ Counter should fall back to no-total format if count is greater than total """ ctr = Counter(stream=self.tty.stdout, total=10, desc='Test', unit='ticks') ctr.count = 50 ctr.start = time.time() - 50 rtn = ctr.format(width=80) self.assertEqual(len(rtn), 80) self.assertRegex(rtn, r'Test 50 ticks \[00:5\d, \d.\d\d ticks/s\]') def test_no_count(self): """ Test for an empty counter """ ctr = Counter(stream=self.tty.stdout, total=10, desc='Test', unit='ticks') formatted = ctr.format(width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 0%\|[ ]+ \| 0/10 \[00:0\d<\?, 0.00 ticks/s\]') # No unit, no description ctr = Counter(stream=self.tty.stdout, total=10) formatted = ctr.format(width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r' 0%\|[ ]+ \| 0/10 \[00:0\d<\?, 0.00/s\]') def test_full_bar(self): ctr = Counter(stream=self.tty.stdout, total=10, desc='Test', unit='ticks', series=SERIES_STD) ctr.count = 10 ctr.start = time.time() - 10 formatted = ctr.format(width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 100%\|' + u'█+' + r'\| 10/10 \[00:\d\d<00:00, \d.\d\d ticks/s\]') def test_zero_total(self): """ If the total is 0, the bar should be full """ ctr = Counter(stream=self.tty.stdout, total=0, desc='Test', unit='ticks', series=SERIES_STD) formatted = ctr.format(width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 100%\|' u'█+' + r'\| 0/0 \[00:0\d<00:00, 0.00 ticks/s\]') def test_auto_offset(self): """ If offset is not specified, terminal codes should be automatically ignored when calculating bar length """ barFormat = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}|{count:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' blueBarFormat = self.manager.term.blue(barFormat) self.assertNotEqual(len(barFormat), len(blueBarFormat)) ctr = self.manager.counter(total=10, desc='Test', unit='ticks', count=10, bar_format=barFormat) formatted1 = ctr.format(width=80) self.assertEqual(len(formatted1), 80) barLen1 = formatted1.count(BLOCK) offset = len(self.manager.term.blue('')) ctr = self.manager.counter(total=10, desc='Test', unit='ticks', count=10, bar_format=blueBarFormat) formatted2 = ctr.format(width=80) self.assertEqual(len(formatted2), 80 + offset) barLen2 = formatted2.count(BLOCK) self.assertTrue(barLen2 == barLen1) def test_offset(self): """ Offset reduces count of printable characters when formatting """ barFormat = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}|{count:{len_total}d}/{total:d} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' barFormat = self.manager.term.blue(barFormat) ctr = self.manager.counter(total=10, desc='Test', unit='ticks', count=10, bar_format=barFormat, offset=0) formatted1 = ctr.format(width=80) self.assertEqual(len(formatted1), 80) barLen1 = formatted1.count(BLOCK) offset = len(self.manager.term.blue('')) ctr = self.manager.counter(total=10, desc='Test', unit='ticks', count=10, bar_format=barFormat, offset=offset) formatted2 = ctr.format(width=80) self.assertEqual(len(formatted2), 80 + offset) barLen2 = formatted2.count(BLOCK) self.assertTrue(barLen2 == barLen1 + offset) # Test in counter format ctr = self.manager.counter(total=10, count=50, offset=0) formatted = ctr.format(width=80) self.assertEqual(len(formatted), 80) ctr = self.manager.counter(total=10, count=50, offset=10) formatted = ctr.format(width=80) self.assertEqual(len(formatted), 90) def test_partial_bar(self): ctr = Counter(stream=self.tty.stdout, total=100, desc='Test', unit='ticks', series=SERIES_STD) ctr.count = 50 formatted = ctr.format(elapsed=50, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 50%\|' + u'█+[▏▎▍▌▋▊▉]?' + r'[ ]+\| 50/100 \[00:5\d<00:5\d, \d.\d\d ticks/s\]') ctr.count = 13 formatted = ctr.format(elapsed=13, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 13%\|' + u'█+[▏▎▍▌▋▊▉]?' + r'[ ]+\| 13/100 \[00:1\d<01:\d\d, \d.\d\d ticks/s\]') # Explicit test ctr.bar_format = u'{bar}' ctr.count = 50 formatted = ctr.format(width=10) self.assertEqual(formatted, u'█████ ') ctr.count = 13 formatted = ctr.format(width=10) self.assertEqual(formatted, u'█▎ ') def test_custom_series(self): ctr = Counter(stream=self.tty.stdout, total=100, desc='Test', unit='ticks', series=[' ', '>', '-']) ctr.count = 50 formatted = ctr.format(elapsed=50, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 50%\|' + u'-+[>]?' + r'[ ]+\| 50/100 \[00:5\d<00:5\d, \d.\d\d ticks/s\]') ctr.count = 13 formatted = ctr.format(elapsed=13, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 13%\|' + u'---->' + r'[ ]+\| 13/100 \[00:1\d<01:\d\d, \d.\d\d ticks/s\]') ctr = Counter(stream=self.tty.stdout, total=100, desc='Test', unit='ticks', series=[u'⭘', u'⬤']) ctr.count = 50 formatted = ctr.format(elapsed=50, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 50%\|' + u'⬤+⭘+' + r'\| 50/100 \[00:5\d<00:5\d, \d.\d\d ticks/s\]') def test_direct(self): ctr = Counter(stream=self.tty.stdout, total=100, desc='Test', unit='ticks', series=SERIES_STD) self.assertIsInstance(ctr.manager, Manager) ctr.start = time.time() - 50 ctr.update(50, force=True) self.tty.stdout.write(u'X\n') value = self.tty.stdread.readline() self.assertRegex(value, r'Test 50%\|' + u'█+[▏▎▍▌▋▊▉]?' + r'[ ]+\| 50/100 \[00:5\d<00:5\d, \d.\d\d ticks/s\]X\n') with mock.patch.object(self.tty, 'stdout', wraps=self.tty.stdout) as mockstdout: mockstdout.encoding = None ctr = Counter(stream=self.tty.stdout, total=100, desc='Test', unit='ticks') ctr.refresh(flush=False) self.assertFalse(mockstdout.flush.called) ctr.refresh(flush=True) self.assertTrue(mockstdout.flush.called) def test_floats(self): """ Using floats for total and count is supported by the logic, but not by the default format strings """ ctr = Counter(stream=self.tty.stdout, total=100.2, desc='Test', unit='ticks', min_delta=500, series=SERIES_STD) ctr.update(50.1) self.assertEqual(ctr.count, 50.1) # Won't work with default formatting with self.assertRaises(ValueError): formatted = ctr.format(elapsed=50.1) ctr.bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| {count:.1f}/{total:.1f} ' + \ u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]' formatted = ctr.format(elapsed=50.1, width=80) self.assertEqual(len(formatted), 80) self.assertRegex(formatted, r'Test 50%\|' + u'█+' + r'[ ]+\| 50.1/100.2 \[00:5\d<00:5\d, \d.\d\d ticks/s\]') def test_floats_prefixed(self): """ Floats should support prefixed formatting """ bar_format = u'{count:!.2j}B / {total:!.2j}B | {rate:!.2j}B/s | {interval:!.2j}s/B' ctr = Counter(stream=self.tty.stdout, total=3.2 * 2 ** 20, bar_format=bar_format) ctr.count = 2048.0 formatted = ctr.format(elapsed=2, width=80) self.assertEqual(formatted, '2.00 KiB / 3.20 MiB | 1.00 KiB/s | 0.00 s/B') # Counter_format counter_format = u'{count:!.2j}B | {rate:!.2j}B/s | {interval:!.2j}s/B' ctr = Counter(stream=self.tty.stdout, counter_format=counter_format) ctr.count = 2048.0 formatted = ctr.format(elapsed=2, width=80) self.assertEqual(formatted, '2.00 KiB | 1.00 KiB/s | 0.00 s/B') def test_color(self): """ Only bar characters should be colorized """ ctr = Counter(stream=self.tty.stdout, total=100, bar_format=u'|{bar}|', count=50, color='red') terminal = ctr.manager.term formatted = ctr.format(width=80) self.assertEqual(formatted, '|' + terminal.red(BLOCK * 39 + ' ' * 39) + '|') def test_subcounter(self): """ When subcounter is present, bar will be drawn in multiple colors """ ctr = Counter(stream=self.tty.stdout, total=100, bar_format=u'{bar}') terminal = ctr.manager.term ctr.count = 50 subcounter1 = ctr.add_subcounter('yellow', all_fields=True) subcounter1.count = 5 ctr.add_subcounter('blue', count=10) formatted = ctr.format(width=80) bartext = terminal.blue(BLOCK*8) + terminal.yellow(BLOCK*4) + BLOCK*28 + ' ' * 40 self.assertEqual(formatted, bartext) ctr.bar_format = u'{count_0} {percentage_0} | {count_1} {percentage_1} {rate_1} {eta_1}' + \ u' | {count_2} {percentage_2} | {count_00} {percentage_00:.1f}' formatted = ctr.format(elapsed=5, width=80) self.assertEqual(formatted, u'35 35.0 | 5 5.0 1.0 01:35 | 10 10.0 | 15 15.0') def test_subcounter_field_not_populated(self): """ Exception raised when reserved field is invalid """ ctr = Counter(stream=self.tty.stdout, total=100, count=50) ctr.add_subcounter('yellow') ctr.add_subcounter('blue', count=10) ctr.bar_format = u'{count_3}' with self.assertRaisesRegex(ValueError, 'subcounter 3 is not defined'): ctr.format(elapsed=5, width=80) for fmt in (u'{rate_1}', u'{eta_1}', u'{interval_1}'): ctr.bar_format = fmt with self.assertRaisesRegex(ValueError, "'all_fields' not specified for subcounter"): ctr.format(elapsed=5, width=80) ctr = Counter(stream=self.tty.stdout, total=100, count=50,) for fmt in (u'{count_0}', u'{rate_0}', u'{percentage_0}', u'{count_00}', u'{rate_00}', u'{percentage_00}'): ctr.bar_format = fmt with self.assertRaisesRegex(ValueError, 'no subcounters are configured'): ctr.format(elapsed=5, width=80) # Counter fields ctr = Counter(stream=self.tty.stdout, count=50) ctr.add_subcounter('yellow') for field in ('percentage_1', 'eta_1'): ctr.counter_format = u'|{%s}|' % field with self.assertRaisesRegex(ValueError, 'unavailable for counter_format'): ctr.format(elapsed=5, width=80) def test_subcounter_count_gt_total(self): """ When total is exceeded, subcounter fields are still populated """ counter_format = u'{count_0} | {count_1} {rate_1} | {count_2} | {count_00}' ctr = Counter(stream=self.tty.stdout, total=100, counter_format=counter_format) ctr.count = 500 subcounter1 = ctr.add_subcounter('yellow', all_fields=True) subcounter1.count = 50 ctr.add_subcounter('blue', count=100) formatted = ctr.format(elapsed=50, width=80) self.assertEqual(formatted, u'350 | 50 1.0 | 100 | 150') def test_subcounter_count_0(self): """ When all of count is covered by subcounters, nothing should print for main counter """ ctr = Counter(stream=self.tty.stdout, total=100, bar_format=u'{bar}') term = ctr.manager.term ctr.count = 50 ctr.add_subcounter('yellow', count=44) ctr.add_subcounter('blue', count=4) ctr.add_subcounter('red', count=2) formatted = ctr.format(width=80) bartext = term.red(BLOCK*2) + term.blue(BLOCK*3) + term.yellow(BLOCK*35) + ' ' * 40 self.assertEqual(formatted, bartext) def test_subcounter_prefixed(self): """ Subcounter float fields should support prefixed formatting """ bar_format = (u'{count:!.2j}B / {total:!.2j}B | {rate:!.2j}B/s | {interval:!.2j}s/B' u' | {count_0:!.2j}B | {count_00:!.2j}B' u' | {count_1:!.2j}B | {rate_1:!.2j}B/s | {interval_1:!.2j}s/B' u' | {count_2:!.2j}B | {rate_2:!.2j}B/s | {interval_2:!.2j}s/B' u' | {count_3:!.2j}B | {rate_3:!.2j}B/s | {interval_3:!.2j}s/B' ) ctr = Counter(stream=self.tty.stdout, total=3.2 * 2 ** 20, bar_format=bar_format, all_fields=True) ctr.count = 2.0 ** 20 subcounter1 = ctr.add_subcounter('yellow') subcounter2 = ctr.add_subcounter('blue') subcounter3 = ctr.add_subcounter('red') subcounter1.count = 512.0 * 2 ** 10 subcounter2.count = 256.0 * 2 ** 10 subcounter3.count = 128.0 * 2 ** 10 formatted = ctr.format(elapsed=1, width=80) self.assertEqual( formatted, ( '1.00 MiB / 3.20 MiB | 1.00 MiB/s | 0.00 s/B' ' | 128.00 KiB | 896.00 KiB' ' | 512.00 KiB | 512.00 KiB/s | 0.00 s/B' ' | 256.00 KiB | 256.00 KiB/s | 0.00 s/B' ' | 128.00 KiB | 128.00 KiB/s | 0.00 s/B' ) ) def test_close(self): manager = MockManager() # Clear is False ctr = MockCounter(manager=manager) ctr.close() self.assertEqual(ctr.calls, ['refresh(flush=True, elapsed=None)']) self.assertEqual(manager.remove_calls, 1) # Clear is True, leave is True ctr = MockCounter(manager=manager, leave=True) ctr.close(clear=True) self.assertEqual(ctr.calls, ['refresh(flush=True, elapsed=None)']) self.assertEqual(manager.remove_calls, 2) # Clear is True, leave is False ctr = MockCounter(manager=manager, leave=False) ctr.close(clear=True) self.assertEqual(ctr.calls, ['clear(flush=True)']) self.assertEqual(manager.remove_calls, 3) def test_context_manager(self): mgr = Manager(stream=self.tty.stdout, enabled=False) with mgr.counter(total=10, leave=False) as ctr: self.assertTrue(ctr in mgr.counters) ctr.update() self.assertFalse(ctr in mgr.counters) def test_add_subcounter(self): self.assertEqual(self.ctr._subcounters, []) subcounter1 = self.ctr.add_subcounter('blue') self.assertEqual(len(self.ctr._subcounters), 1) self.assertEqual(self.ctr.subcount, 0) self.assertIs(self.ctr._subcounters[0], subcounter1) self.assertEqual(subcounter1.count, 0) self.assertFalse(subcounter1.all_fields) with self.assertRaisesRegex(ValueError, 'Invalid count: 5'): self.ctr.add_subcounter('yellow', count=5, all_fields=True) self.ctr.count = 5 subcounter2 = self.ctr.add_subcounter('yellow', count=5, all_fields=True) self.assertEqual(len(self.ctr._subcounters), 2) self.assertEqual(self.ctr.subcount, 5) self.assertIs(self.ctr._subcounters[1], subcounter2) self.assertEqual(subcounter2.count, 5) self.assertTrue(subcounter2.all_fields) def test_reserve_field_unavailable(self): """ Exception raised when reserved field is invalid """ msg1 = "Reserve field '%s' specified in format, but unavailable for bar_format" msg2 = "Reserve field '%s' specified in format, but unavailable for counter_format" ctr = Counter(stream=self.tty.stdout, total=100, count=50) ctr.bar_format = u'{fill}' with self.assertRaisesRegex(ValueError, msg1 % 'fill'): ctr.format(elapsed=5, width=80) ctr = Counter(stream=self.tty.stdout, count=50) for field in ('bar', 'eta', 'percentage'): ctr.counter_format = u'{%s}' % field with self.assertRaisesRegex(ValueError, msg2 % field): ctr.format(elapsed=5, width=80) def test_fields_curly_braces(self): """ Ensure curly braces work in fields """ ctr_format = u'{desc} {count:d} {unit}{fill}' bar_format = u'{desc} {count:d} {unit}{bar}' ctr = Counter(stream=self.tty.stdout, total=1, desc='open{', unit='dudes', counter_format=ctr_format, bar_format=bar_format) self.assertEqual(ctr.format(width=80), 'open{ 0 dudes' + ' ' * 67) ctr.count = 4 self.assertEqual(ctr.format(width=80), 'open{ 4 dudes' + ' ' * 67) ctr.desc = 'normal' ctr.unit = 'close}' ctr.count = 0 self.assertEqual(ctr.format(width=80), 'normal 0 close}' + ' ' * 65) ctr.count = 4 self.assertEqual(ctr.format(width=80), 'normal 4 close}' + ' ' * 65) def test_additional_fields(self): """ Add additional fields to format """ bar_format = ctr_format = u'{arg1:s} {count:d}' ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format, fields={'arg1': 'hello'}) self.assertEqual(ctr.format(), 'hello 1') ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, fields={'arg1': 'hello'}) self.assertEqual(ctr.format(), 'hello 1') def test_additional_fields_missing(self): """ Raise a ValueError when a keyword is missing """ bar_format = ctr_format = u'{arg1:s} {count:d}' ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format) with self.assertRaisesRegex(ValueError, "'arg1' specified in format, but not provided"): ctr.format() ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format) with self.assertRaisesRegex(ValueError, "'arg1' specified in format, but not provided"): ctr.format() def test_additional_fields_changed(self): """ Change additional fields """ bar_format = ctr_format = u'{arg1:s} {count:d}' additional_fields = {'arg1': 'hello'} ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format, fields=additional_fields) self.assertEqual(ctr.format(), 'hello 1') additional_fields['arg1'] = 'goodbye' self.assertEqual(ctr.format(), 'goodbye 1') ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, fields=additional_fields) self.assertEqual(ctr.format(), 'goodbye 1') additional_fields['arg1'] = 'hello' self.assertEqual(ctr.format(), 'hello 1') def test_additional_fields_no_overwrite(self): """ Additional fields can not overwrite dynamic fields """ bar_format = ctr_format = u'{arg1:s} {count:d}' additional_fields = {'arg1': 'hello'} ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format, fields=additional_fields) self.assertEqual(ctr.format(), 'hello 1') ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, fields=additional_fields) self.assertEqual(ctr.format(), 'hello 1') def test_kwarg_fields(self): """ Additional fields to format via keyword arguments """ bar_format = ctr_format = u'{arg1:s} {count:d}' ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format, arg1='hello') self.assertEqual(ctr.format(), 'hello 1') ctr.update(arg1='goodbye') self.assertEqual(ctr.format(), 'goodbye 2') ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, arg1='hello') self.assertEqual(ctr.format(), 'hello 1') ctr.update(arg1='goodbye') self.assertEqual(ctr.format(), 'goodbye 2') def test_kwarg_fields_precedence(self): """ Keyword arguments take precedence over fields """ bar_format = u'{arg1:s} {count:d}' additional_fields = {'arg1': 'hello'} ctr = Counter(stream=self.tty.stdout, total=10, count=1, bar_format=bar_format, fields=additional_fields) self.assertEqual(ctr.format(), 'hello 1') ctr.update(arg1='goodbye') self.assertEqual(ctr.format(), 'goodbye 2') def test_fill_setter(self): """Fill must be one printable character""" ctr = Counter(stream=self.tty.stdout, fill='a') with self.assertRaisesRegex(ValueError, 'fill character must be a length of 1'): ctr.fill = 'hello' with self.assertRaisesRegex(ValueError, 'fill character must be a length of 1'): ctr.fill = '' def test_fill(self): """ Fill uses remaining space """ ctr_format = u'{fill}HI' ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, fill=u'-') self.assertEqual(ctr.format(), u'-' * 78 + 'HI') ctr_format = u'{fill}HI{fill}' ctr = Counter(stream=self.tty.stdout, count=1, counter_format=ctr_format, fill=u'-') self.assertEqual(ctr.format(), u'-' * 39 + 'HI' + u'-' * 39) @unittest.skipIf(PY2, 'Skip warnings tests in Python 2') def test_reserved_fields(self): """ When reserved fields are used, a warning is raised """ ctr = Counter(stream=self.tty.stdout, total=10, count=1, fields={'elapsed': 'reserved'}) with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn: ctr.format() self.assertRegex(__file__, warn.filename) ctr = Counter(stream=self.tty.stdout, total=10, fields={'elapsed': 'reserved'}) with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn: ctr.format() self.assertRegex(__file__, warn.filename) ctr = Counter(stream=self.tty.stdout, total=10, count=1, elapsed='reserved') with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn: ctr.format() self.assertRegex(__file__, warn.filename) ctr = Counter(stream=self.tty.stdout, total=10, elapsed='reserved') with self.assertWarns(EnlightenWarning) as warn: ctr.format() self.assertRegex(__file__, warn.filename) def test_builtin_bar_fields(self): """ Ensure all built-in fields are populated as expected """ bar_fields = tuple(field for field in enlighten._counter.RESERVED_FIELDS if field != 'fill') bar_format = u', '.join(u'%s: {%s}' % (field, field) for field in sorted(bar_fields)) ctr = Counter(stream=self.tty.stdout, total=100, bar_format=bar_format, unit='parsecs', desc='Kessel runs') ctr.count = 50 fields = 'bar: , count: 50, desc: Kessel runs, desc_pad: , elapsed: 00:50, eta: 00:50, ' \ 'interval: 1.0, len_total: 3, percentage: 50.0, rate: 1.0, total: 100, ' \ 'unit: parsecs, unit_pad: ' self.assertEqual(ctr.format(elapsed=50, width=80), fields) enlighten-1.11.2/tests/test_manager.py000066400000000000000000001152351436526347400177630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._manager """ import signal import sys import time import enlighten from enlighten import _manager from tests import (unittest, TestCase, mock, MockTTY, MockCounter, redirect_output, OUTPUT, STDOUT_NO_FD) TERMINAL = 'blessed.Terminal' # pylint: disable=missing-docstring, protected-access, too-many-statements, too-many-public-methods # pylint: disable=too-many-lines class TestManager(TestCase): def setUp(self): self.tty = MockTTY() self.resize_sig = signal.getsignal(signal.SIGWINCH) def tearDown(self): self.tty.close() signal.signal(signal.SIGWINCH, self.resize_sig) def test_init_safe(self): with redirect_output('stdout', self.tty.stdout): # Companion stream is stderr if stream is stdout manager = enlighten.Manager(stream=sys.stdout) self.assertIs(manager.stream, sys.stdout) self.assertIs(manager.term.stream, sys.stdout) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init(self): # Companion stream is __stderr__ if stream is __stdout__ # Need to mock isatty() for some build and test environments with mock.patch.object(sys, '__stderr__') as mock_stderr: mock_stderr.isatty.return_value = True manager = enlighten.Manager(stream=sys.__stdout__) self.assertIs(manager.stream, sys.__stdout__) self.assertIs(manager.term.stream, sys.__stdout__) self.assertIs(manager.companion_stream, mock_stderr) self.assertIs(manager.companion_term.stream, mock_stderr) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_companion_hc(self): # Hard-coded companion stream always wins manager = enlighten.Manager(companion_stream=OUTPUT) self.assertIs(manager.companion_stream, OUTPUT) self.assertIs(manager.companion_term.stream, OUTPUT) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_stderr(self): # Companion stream is __stdout__ if stream is __stderr__ # Need to mock isatty() for some build and test environments with mock.patch.object(sys, '__stdout__') as mock_stdout: mock_stdout.isatty.return_value = True manager = enlighten.Manager(stream=sys.__stderr__) self.assertIs(manager.stream, sys.__stderr__) self.assertIs(manager.term.stream, sys.__stderr__) self.assertIs(manager.companion_stream, mock_stdout) self.assertIs(manager.companion_term.stream, mock_stdout) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_redirect(self): # If stdout is redirected, but stderr is still a tty, use it for companion with redirect_output('stdout', OUTPUT): # Need to mock isatty() for some build and test environments with mock.patch.object(sys, 'stderr') as mock_stderr: mock_stderr.isatty.return_value = True manager = enlighten.Manager(stream=sys.stdout) self.assertIs(manager.stream, sys.stdout) self.assertIs(manager.term.stream, sys.stdout) self.assertIs(manager.companion_stream, mock_stderr) self.assertIs(manager.companion_term.stream, mock_stderr) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_stderr_redirect(self): # If stderr is redirected, but stdout is still a tty, use it for companion with redirect_output('stderr', OUTPUT): # Need to mock isatty() for some build and test environments with mock.patch.object(sys, 'stdout') as mock_stdout: mock_stdout.isatty.return_value = True manager = enlighten.Manager(stream=sys.stderr) self.assertIs(manager.stream, sys.stderr) self.assertIs(manager.term.stream, sys.stderr) self.assertIs(manager.companion_stream, mock_stdout) self.assertIs(manager.companion_term.stream, mock_stdout) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_stderr_companion_hc(self): # Hard-coded companion stream always wins manager = enlighten.Manager(stream=sys.__stderr__, companion_stream=OUTPUT) self.assertIs(manager.companion_stream, OUTPUT) self.assertIs(manager.companion_term.stream, OUTPUT) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_init_hc(self): # Nonstandard stream doesn't get a companion stream by default manager = enlighten.Manager(stream=OUTPUT) self.assertIs(manager.stream, OUTPUT) self.assertIs(manager.term.stream, OUTPUT) self.assertIsNone(manager.companion_stream) self.assertIsNone(manager.companion_term) def test_width(self): """Width hard-coded""" manager = enlighten.Manager(width=100) ctr = manager.counter(total=100) self.assertEqual(len(ctr.format()), 100) def test_repr(self): manager = enlighten.Manager() self.assertEqual(repr(manager), "Manager(stream=%r)" % sys.__stdout__) def test_counter_and_remove(self): # pylint: disable=no-member,assigning-non-slot manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) self.assertEqual(len(manager.counters), 0) with mock.patch.object(manager, '_set_scroll_area') as ssa: counter1 = manager.counter(leave=True) self.assertTrue(counter1.leave) self.assertEqual(len(manager.counters), 1) self.assertEqual(manager.counters[counter1], 1) self.assertEqual(counter1.calls, []) self.assertEqual(ssa.call_count, 1) with mock.patch.object(manager, '_set_scroll_area') as ssa: counter2 = manager.counter(leave=False) self.assertFalse(counter2.leave) self.assertEqual(len(manager.counters), 2) self.assertEqual(manager.counters[counter1], 2) self.assertEqual(manager.counters[counter2], 1) self.assertEqual(counter1.calls, ['clear(flush=False)', 'refresh(flush=False, elapsed=None)']) self.assertEqual(counter2.calls, []) self.assertEqual(ssa.call_count, 1) counter1.calls = [] with mock.patch.object(manager, '_set_scroll_area') as ssa: counter3 = manager.counter(leave=False) self.assertFalse(counter3.leave) self.assertEqual(len(manager.counters), 3) self.assertEqual(manager.counters[counter1], 3) self.assertEqual(manager.counters[counter2], 2) self.assertEqual(manager.counters[counter3], 1) self.assertEqual(counter1.calls, ['clear(flush=False)', 'refresh(flush=False, elapsed=None)']) self.assertEqual(counter2.calls, ['clear(flush=False)', 'refresh(flush=False, elapsed=None)']) self.assertEqual(counter3.calls, []) self.assertEqual(ssa.call_count, 1) counter1.calls = [] counter2.calls = [] manager.remove(counter3) self.assertEqual(len(manager.counters), 2) self.assertFalse(counter3 in manager.counters) # Remove again, no error manager.remove(counter3) self.assertEqual(len(manager.counters), 2) manager.remove(counter1) self.assertEqual(len(manager.counters), 2) self.assertTrue(counter1 in manager.counters) with mock.patch.object(manager, '_set_scroll_area') as ssa: counter4 = manager.counter(leave=False) self.assertFalse(counter4.leave) self.assertEqual(len(manager.counters), 3) self.assertEqual(manager.counters[counter1], 3) self.assertEqual(manager.counters[counter2], 2) self.assertEqual(manager.counters[counter4], 1) self.assertEqual(counter1.calls, []) self.assertEqual(counter2.calls, []) self.assertEqual(counter4.calls, []) self.assertEqual(ssa.call_count, 1) def test_counter_position(self): manager = enlighten.Manager(stream=self.tty.stdout, set_scroll=False) counter1 = manager.counter(position=4) self.assertEqual(manager.counters[counter1], 4) with self.assertRaisesRegex(ValueError, 'Counter position 0 is less than 1'): manager.counter(position=0) with self.assertRaisesRegex(ValueError, 'Counter position 4 is already occupied'): manager.counter(position=4) with self.assertRaisesRegex(ValueError, 'Counter position 200 is greater than terminal height'): manager.counter(position=200) def test_counter_position_pinned(self): """If a position is taken, use next available""" manager = enlighten.Manager(stream=self.tty.stdout, set_scroll=False) counter1 = manager.counter(position=2) self.assertEqual(manager.counters[counter1], 2) counter2 = manager.counter() self.assertEqual(manager.counters[counter1], 2) self.assertEqual(manager.counters[counter2], 1) counter3 = manager.counter() self.assertEqual(manager.counters[counter1], 2) self.assertEqual(manager.counters[counter2], 3) self.assertEqual(manager.counters[counter3], 1) status1 = manager.status_bar(position=3) self.assertEqual(manager.counters[counter1], 2) self.assertEqual(manager.counters[counter2], 4) self.assertEqual(manager.counters[counter3], 1) self.assertEqual(manager.counters[status1], 3) status2 = manager.status_bar() self.assertEqual(manager.counters[counter1], 2) self.assertEqual(manager.counters[counter2], 5) self.assertEqual(manager.counters[counter3], 4) self.assertEqual(manager.counters[status1], 3) self.assertEqual(manager.counters[status2], 1) def test_counter_replaced(self): """Counter replaces an existing counter""" manager = enlighten.Manager(stream=self.tty.stdout, set_scroll=False) # Pinned replacement counter1 = manager.counter(position=2) self.assertEqual(manager.counters[counter1], 2) counter2 = manager.counter(replace=counter1) self.assertEqual(len(manager.counters), 1) self.assertEqual(manager.counters[counter2], 2) self.assertTrue(counter2._pinned) # Unpinned replacement counter3 = manager.counter() self.assertEqual(len(manager.counters), 2) self.assertEqual(manager.counters[counter3], 1) counter4 = manager.counter(replace=counter3) self.assertEqual(len(manager.counters), 2) self.assertEqual(manager.counters[counter4], 1) self.assertFalse(counter4._pinned) # Unmanaged counter given with self.assertRaisesRegex(ValueError, 'Counter to replace is not currently managed'): manager.counter(replace=counter1) def test_inherit_kwargs(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, unit='knights', not_real=True, desc='Default') self.assertTrue('unit' in manager.defaults) self.assertTrue('desc' in manager.defaults) self.assertTrue('not_real' in manager.defaults) with mock.patch.object(manager, '_set_scroll_area'): ctr = manager.counter(desc='Huzzah') self.assertEqual(ctr.unit, 'knights') self.assertEqual(ctr.desc, 'Huzzah') self.assertFalse(hasattr(ctr, 'not_real')) def test_write(self): msg = 'test message' with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager = enlighten.Manager(stream=self.tty.stdout) counter = manager.counter(position=3) term = manager.term manager.write(msg, counter=counter) self.tty.stdout.write(u'X\n') # Carriage return is getting converted to newline self.assertEqual(self.tty.stdread.readline(), term.move(22, 0) + '\r' + term.clear_eol + msg + 'X\n') self.assertEqual(ssa.call_count, 2) def test_write_no_flush(self): """ Output is stored in buffer, but not flushed to stream """ msg = u'test message' with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager = enlighten.Manager(stream=self.tty.stdout, companion_stream=OUTPUT) counter = manager.counter(position=3) term = manager.term manager.write(msg, counter=counter, flush=False) self.assertEqual(manager._buffer, [term.move(term.height - 3, 0), '\r', term.clear_eol, msg]) self.assertEqual(manager._companion_buffer, []) self.tty.stdout.write(u'X\n') # No output self.assertEqual(self.tty.stdread.readline(), 'X\n') self.assertEqual(ssa.call_count, 2) def test_flush_companion_buffer(self): """ Output is stored in buffer, but only written in companion stream is defined """ manager = enlighten.Manager(stream=self.tty.stdout) msg = u'test message' manager._companion_buffer = [msg] manager._flush_streams() # Companion buffer flushed, but not outputted self.assertEqual(manager._companion_buffer, []) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') # set companion stream and test again manager.companion_stream = OUTPUT manager._companion_buffer = [msg] manager._flush_streams() self.assertEqual(manager._companion_buffer, []) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') self.assertEqual(OUTPUT.getvalue(), msg) def test_autorefresh(self): """ Ensure auto-refreshed counters are updated when others are """ manager = enlighten.Manager(stream=self.tty.stdout) counter1 = manager.counter(count=1, total=0, counter_format=u'counter1', autorefresh=True) counter2 = manager.counter(count=1, total=0, counter_format=u'counter2') self.tty.clear() # Counter 1 in auto-refresh list self.assertIn(counter1, manager.autorefresh) # If auto-refreshed counter hasn't been refreshed recently, refresh counter1.last_update = 0 counter2.refresh() self.tty.stdout.write(u'X\n') output = self.tty.stdread.readline() self.assertRegex(output, 'counter2.+counter1') # If auto-refreshed counter has been refreshed recently, skip counter1.last_update = time.time() + 5 counter2.refresh() self.tty.stdout.write(u'X\n') output = self.tty.stdread.readline() self.assertRegex(output, 'counter2') self.assertNotRegex(output, 'counter1') # If already auto-refreshing, skip manager.refresh_lock = True counter1.last_update = 0 counter2.refresh() # Have to explicitly flush manager._flush_streams() self.tty.stdout.write(u'X\n') output = self.tty.stdread.readline() self.assertRegex(output, 'counter2') self.assertNotRegex(output, 'counter1') def test_set_scroll_area_disabled(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, set_scroll=False) manager.counters['dummy'] = 3 manager._set_scroll_area() self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') def test_set_scroll_area_no_change(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) manager.counters['dummy'] = 3 manager.scroll_offset = 4 manager._set_scroll_area() self.assertEqual(manager._buffer, [manager.term.move(21, 0)]) def test_set_scroll_area_companion(self): """ Ensure when no change is made, a term.move is still called for the companion stream """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, companion_stream=self.tty.stdout) manager.counters['dummy'] = 3 manager.scroll_offset = 4 term = manager.term manager._set_scroll_area() self.assertEqual(manager._buffer, [term.move(21, 0)]) self.assertEqual(manager._companion_buffer, [term.move(21, 0)]) def test_set_scroll_area(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) manager.counters['dummy'] = 3 term = manager.term stdread = self.tty.stdread self.assertEqual(manager.scroll_offset, 1) self.assertFalse(manager.process_exit) self.assertNotEqual(signal.getsignal(signal.SIGWINCH), manager._stage_resize) old_offset = manager.scroll_offset with mock.patch('enlighten._manager.atexit') as atexit: manager._set_scroll_area() self.assertEqual(manager.scroll_offset, 4) self.assertEqual(signal.getsignal(signal.SIGWINCH), manager._stage_resize) self.assertTrue(manager.process_exit) atexit.register.assert_called_with(manager._at_exit) offset = manager.scroll_offset scroll_position = term.height - offset self.assertEqual(manager._buffer, [term.move(term.height - old_offset, 0), '\n' * (offset - old_offset), term.hide_cursor, term.csr(0, scroll_position), term.move(scroll_position, 0)]) # No companion buffer defined self.assertEqual(manager._companion_buffer, []) # Make sure nothing was flushed self.tty.stdout.write(u'X\n') self.assertEqual(stdread.readline(), 'X\n') # Run it again and make sure exit handling isn't reset del manager._buffer[:] del manager._companion_buffer[:] with mock.patch('enlighten._manager.atexit') as atexit: manager._set_scroll_area(force=True) self.assertFalse(atexit.register.called) self.assertEqual(manager._buffer, [term.hide_cursor, term.csr(0, scroll_position), term.move(scroll_position, 0)]) # Set max counter lower and make sure scroll_offset hasn't changed manager.counters['dummy'] = 1 with mock.patch('enlighten._manager.atexit') as atexit: manager._set_scroll_area() self.assertEqual(manager.scroll_offset, 4) def test_set_scroll_area_force(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) manager.counters['dummy'] = 3 manager.scroll_offset = 4 manager.height = 20 scroll_position = manager.height - manager.scroll_offset term = manager.term with mock.patch('enlighten._manager.atexit') as atexit: manager._set_scroll_area(force=True) self.assertEqual(manager.scroll_offset, 4) self.assertTrue(manager.process_exit) self.assertEqual(manager._buffer, [term.hide_cursor, term.csr(0, scroll_position), term.move(scroll_position, 0)]) self.assertEqual(manager._companion_buffer, []) atexit.register.assert_called_with(manager._at_exit) def test_at_exit(self): tty = MockTTY() try: with mock.patch.object(tty, 'stdout', wraps=tty.stdout) as mockstdout: manager = enlighten.Manager(stream=tty.stdout, counter_class=MockCounter) term = manager.term reset = (term.normal_cursor + term.csr(0, term.height - 1) + term.move(term.height, 0)) # process_exit is False manager._at_exit() self.assertFalse(mockstdout.flush.called) # No output tty.stdout.write(u'X\n') self.assertEqual(tty.stdread.readline(), 'X\n') # process_exit is True, set_scroll False manager.process_exit = True manager.set_scroll = False manager._at_exit() self.assertEqual(mockstdout.flush.call_count, 1) self.assertEqual(tty.stdread.readline(), term.move(25, 0) + term.cud1) # process_exit is True, set_scroll True manager.set_scroll = True manager._at_exit() self.assertEqual(mockstdout.flush.call_count, 2) self.assertEqual(tty.stdread.readline(), reset + term.cud1) # Ensure companion stream gets flushed manager.companion_stream = tty.stdout manager._at_exit() self.assertEqual(mockstdout.flush.call_count, 4) self.assertEqual(tty.stdread.readline(), reset + term.cud1) term = manager.term finally: # Ensure no errors if tty closes before _at_exit is called tty.close() manager._at_exit() def test_stop(self): manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 term = manager.term self.assertIsNone(manager.companion_term) with mock.patch('enlighten._manager.atexit'): manager._set_scroll_area() self.assertEqual(manager.scroll_offset, 5) self.assertEqual(signal.getsignal(signal.SIGWINCH), manager._stage_resize) self.assertTrue(manager.process_exit) # Clear buffer del manager._buffer[:] manager.enabled = False manager.stop() # No output, No changes self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') self.assertEqual(signal.getsignal(signal.SIGWINCH), manager._stage_resize) self.assertTrue(manager.process_exit) manager.enabled = True manager.stop() self.assertEqual(signal.getsignal(signal.SIGWINCH), manager.sigwinch_orig) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), term.move(term.height - 2, 0) + term.clear_eol + term.move(term.height - 1, 0) + term.clear_eol + term.normal_cursor + term.csr(0, term.height - 1) + term.move(term.height, 0) + 'X\n') self.assertFalse(manager.process_exit) self.assertFalse(manager.enabled) for counter in manager.counters: self.assertFalse(counter.enabled) def test_stop_no_set_scroll(self): """ set_scroll is False """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, set_scroll=False) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 term = manager.term with mock.patch('enlighten._manager.atexit'): with mock.patch.object(term, 'change_scroll'): manager._set_scroll_area() self.assertEqual(manager.scroll_offset, 5) self.assertEqual(signal.getsignal(signal.SIGWINCH), manager._stage_resize) self.assertTrue(manager.process_exit) # Stream empty self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') manager.stop() self.assertEqual(signal.getsignal(signal.SIGWINCH), manager.sigwinch_orig) self.assertFalse(manager.process_exit) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), term.move(term.height - 2, 0) + term.clear_eol + term.move(term.height - 1, 0) + term.clear_eol + term.move(25, 0) + 'X\n') def test_stop_never_used(self): """ In this case, _set_scroll_area() was never called """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 term = manager.term self.assertFalse(manager.process_exit) manager.stop() self.assertEqual(signal.getsignal(signal.SIGWINCH), manager.sigwinch_orig) # Only reset terminal self.tty.stdout.write(u'X\n') reset = term.normal_cursor + term.csr(0, term.height - 1) + term.move(term.height, 0) self.assertEqual(self.tty.stdread.readline(), reset + 'X\n') def test_stop_companion(self): """ In this case, we have a companion terminal Just make sure we have an extra reset """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, companion_stream=self.tty.stdout) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 term = manager.term with mock.patch('enlighten._manager.atexit'): manager._set_scroll_area() del manager._buffer[:] del manager._companion_buffer[:] with mock.patch.object(manager, '_flush_streams'): manager.stop() self.assertEqual(manager._buffer, [term.move(term.height - 2, 0), term.clear_eol, term.move(term.height - 1, 0), term.clear_eol, term.normal_cursor, term.csr(0, term.height - 1), term.move(term.height, 0)]) self.assertEqual(manager._companion_buffer, [term.normal_cursor, term.csr(0, term.height - 1), term.move(term.height, 0)]) def test_stop_position_1(self): """ Ensure a line feed is given if there is a counter at position 1 """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) term = manager.term manager.counters[MockCounter(manager=manager)] = 3 with mock.patch.object(manager, '_flush_streams'): manager.stop() self.assertEqual(manager._buffer, [term.normal_cursor, term.csr(0, term.height - 1), term.move(term.height, 0)]) del manager._buffer[:] manager.enabled = True manager.counters[MockCounter(manager=manager)] = 1 with mock.patch.object(manager, '_flush_streams'): manager.stop() self.assertEqual(manager._buffer, [term.normal_cursor, term.csr(0, term.height - 1), term.move(term.height, 0), term.cud1 or '\n']) def test_resize(self): """ Resize lock must be False for handler to run Terminal size is cached unless resize handler runs """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) counter3 = MockCounter(manager=manager) manager.counters[counter3] = 3 manager.scroll_offset = 4 term = manager.term with mock.patch('%s.width' % TERMINAL, new_callable=mock.PropertyMock) as mockwidth: mockwidth.return_value = 70 manager.resize_lock = True with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager._stage_resize() self.assertFalse(ssa.called) self.assertEqual(manager.width, 80) self.assertTrue(manager.resize_lock) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') self.assertEqual(counter3.calls, []) manager.resize_lock = False with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager._resize_handler() self.assertEqual(ssa.call_count, 1) self.assertEqual(manager.width, 70) self.assertFalse(manager.resize_lock) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), term.move(21, 0) + term.clear_eos + 'X\n') self.assertEqual(counter3.calls, ['refresh(flush=False, elapsed=None)']) def test_threaded_eval(self): """ Dynamic value for threaded determined when scroll area is first set """ # Not dynamic if explicitly True manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, threaded=True) self.assertTrue(manager.threaded) with mock.patch('threading.active_count', return_value=4): manager.counter() self.assertTrue(manager.threaded) # Not dynamic if explicitly False manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, threaded=False) self.assertFalse(manager.threaded) with mock.patch('threading.active_count', return_value=4): manager.counter() self.assertFalse(manager.threaded) # False by default manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) self.assertIsNone(manager.threaded) manager.counter() self.assertFalse(manager.threaded) # True if threaded manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) self.assertIsNone(manager.threaded) with mock.patch('threading.active_count', return_value=4): manager.counter() self.assertTrue(manager.threaded) # True if has child processes manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) self.assertIsNone(manager.threaded) with mock.patch('multiprocessing.active_children', return_value=[1, 2]): manager.counter() self.assertTrue(manager.threaded) # True if is child processes manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) self.assertIsNone(manager.threaded) with mock.patch('multiprocessing.current_process') as c_process: c_process.name = 'Process1' manager.counter() self.assertTrue(manager.threaded) def test_resize_threaded(self): """ Test a resize event threading behavior """ manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, threaded=True) counter3 = MockCounter(manager=manager) counter3.last_update = time.time() manager.counters[counter3] = 3 manager.scroll_offset = 4 term = manager.term # simulate resize manager._stage_resize() self.assertTrue(manager._resize) self.assertEqual(counter3.last_update, 0) with mock.patch('%s.width' % TERMINAL, new_callable=mock.PropertyMock) as mockwidth: mockwidth.return_value = 70 # resize doesn't happen until a write is called self.assertEqual(manager.width, 80) with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager.write() self.assertEqual(ssa.call_count, 1) self.assertEqual(manager.width, 70) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), term.move(21, 0) + term.clear_eos + 'X\n') self.assertFalse(manager.resize_lock) self.assertFalse(manager._resize) self.assertEqual(counter3.calls, ['refresh(flush=False, elapsed=None)']) def test_resize_handler_height_less(self): with mock.patch('%s.height' % TERMINAL, new_callable=mock.PropertyMock) as mockheight: mockheight.side_effect = [25, 23] manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter) counter3 = MockCounter(manager=manager) manager.counters[counter3] = 3 manager.scroll_offset = 4 with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager._resize_handler() self.assertEqual(ssa.call_count, 1) self.assertEqual(manager.height, 23) self.assertEqual(self.tty.stdread.readline(), manager.term.move(19, 0) + '\n') for _ in range(5): self.assertEqual(self.tty.stdread.readline(), '\n') self.assertEqual(counter3.calls, ['refresh(flush=False, elapsed=None)']) def test_resize_handler_height_greater_threaded(self): with mock.patch('%s.height' % TERMINAL, new_callable=mock.PropertyMock) as mockheight: mockheight.side_effect = [25, 27] manager = enlighten.Manager(stream=self.tty.stdout, counter_class=MockCounter, threaded=True) counter3 = MockCounter(manager=manager) manager.counters[counter3] = 3 manager.scroll_offset = 4 term = manager.term with mock.patch('enlighten._manager.Manager._set_scroll_area') as ssa: manager._resize_handler() self.assertEqual(ssa.call_count, 1) self.assertEqual(manager.height, 27) self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), term.move(27, 0) + '\n') self.assertEqual(self.tty.stdread.readline(), '\n') self.assertEqual(self.tty.stdread.readline(), '\n') self.assertEqual(self.tty.stdread.readline(), term.move(23, 0) + term.clear_eos + 'X\n') self.assertEqual(counter3.calls, ['refresh(flush=False, elapsed=None)']) def test_disable(self): mgr = enlighten.Manager(stream=self.tty.stdout, enabled=False) self.assertFalse(mgr.enabled) ctr = mgr.counter() self.assertIsInstance(ctr, enlighten._counter.Counter) self.assertFalse(ctr.enabled) # Make sure this doesn't error ctr.update() ctr.update(4) ctr.refresh() ctr.close() ctr.leave = False ctr.close() mgr.write() mgr.stop() # No Output self.tty.stdout.write(u'X\n') self.assertEqual(self.tty.stdread.readline(), 'X\n') def test_context_manager(self): mgr = None with enlighten.Manager(stream=self.tty.stdout) as manager: self.assertIsInstance(manager, _manager.Manager) self.assertTrue(manager.enabled) mgr = manager self.assertFalse(mgr.enabled) def test_no_resize_signal(self): # Test normal case initialization stdmgr = enlighten.Manager(stream=self.tty.stdout) self.assertTrue(hasattr(stdmgr, 'sigwinch_orig')) stdmgr.counters[MockCounter(manager=stdmgr)] = 3 stdmgr.counters[MockCounter(manager=stdmgr)] = 4 # Test no resize signal initialization with mock.patch.object(_manager, 'RESIZE_SUPPORTED', False): manager = enlighten.Manager(stream=self.tty.stdout) self.assertFalse(hasattr(manager, 'sigwinch_orig')) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 # Test set_scroll_area() with mock.patch.object(_manager.signal, 'signal', wraps=_manager.signal.signal) as mocksignal: with mock.patch('enlighten._manager.atexit'): # Test no resize signal set_scroll_area with mock.patch.object(_manager, 'RESIZE_SUPPORTED', False): with mock.patch.object(manager.term, 'change_scroll'): manager._set_scroll_area() self.assertFalse(mocksignal.called) # Test normal case set_scroll_area with mock.patch.object(stdmgr.term, 'change_scroll'): stdmgr._set_scroll_area() self.assertTrue(mocksignal.called) # Test stop() with mock.patch.object(_manager.signal, 'signal', wraps=_manager.signal.signal) as mocksignal: # Test no resize signal stop with mock.patch.object(_manager, 'RESIZE_SUPPORTED', False): manager.stop() self.assertFalse(mocksignal.called) # Test normal case stop stdmgr.stop() self.assertTrue(mocksignal.called) def test_no_resize(self): with mock.patch.object(_manager.signal, 'signal', wraps=_manager.signal.signal) as mocksignal: manager = enlighten.Manager(stream=self.tty.stdout, no_resize=True) self.assertFalse(hasattr(manager, 'sigwinch_orig')) self.assertFalse(mocksignal.called) manager.counters[MockCounter(manager=manager)] = 3 manager.counters[MockCounter(manager=manager)] = 4 with mock.patch.object(manager.term, 'change_scroll'): manager._set_scroll_area() self.assertFalse(mocksignal.called) manager.stop() self.assertFalse(mocksignal.called) class TestGetManager(TestCase): def setUp(self): self.tty = MockTTY() def tearDown(self): self.tty.close() def test_get_manager_tty(self): # stdout is attached to a tty with redirect_output('__stdout__', self.tty.stdout): self.assertTrue(sys.__stdout__.isatty()) manager = enlighten.get_manager(unit='knights') self.assertIsInstance(manager, _manager.Manager) self.assertTrue('unit' in manager.defaults) self.assertTrue('enabled' in manager.defaults) self.assertTrue(manager.enabled) self.assertTrue(manager.defaults['enabled']) @unittest.skipIf(STDOUT_NO_FD, 'No file descriptor for stdout') def test_get_manager_no_tty(self): # stdout is not attached to a tty with redirect_output('__stdout__', OUTPUT): self.assertFalse(sys.__stdout__.isatty()) manager = enlighten.get_manager(unit='knights') self.assertIsInstance(manager, _manager.Manager) self.assertTrue('unit' in manager.defaults) self.assertFalse(manager.enabled) self.assertTrue('enabled' in manager.defaults) self.assertFalse(manager.defaults['enabled']) enlighten-1.11.2/tests/test_notebook_manager.ipynb000066400000000000000000000121271436526347400223500ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Notebook for testing NotebookManager\n", "\"\"\"\n", "\n", "# Setup\n", "import sys\n", "import time\n", "import os\n", "\n", "import coverage\n", "\n", "# Set path so this works for running live\n", "cwd = os.getcwd()\n", "if os.path.basename(cwd) == 'tests':\n", " project_dir = os.path.dirname(cwd)\n", " sys.path.insert(1, project_dir)\n", "else:\n", " project_dir = cwd\n", "\n", "# Start coverage, should be before imports\n", "cov = coverage.Coverage(\n", " data_file=os.path.join(project_dir, '.coverage.notebook'),\n", " config_file=os.path.join(project_dir, 'setup.cfg')\n", ")\n", "cov.start()\n", "\n", "# pylint: disable=wrong-import-position\n", "from enlighten import get_manager, NotebookManager # noqa: E402" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_get_manager\n", "# Test we get the right manager when running in a notebook\n", "manager = get_manager()\n", "assert isinstance(manager, NotebookManager)\n", "assert repr(manager) == 'NotebookManager()'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_standard\n", "# Test standard manager\n", "manager = NotebookManager()\n", "ctr = manager.counter(total=100)\n", "ctr.update(force=True)\n", "manager.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_disabled\n", "# Test manager disabled\n", "manager = NotebookManager(enabled=False)\n", "ctr = manager.counter(total=100)\n", "ctr.update(force=True)\n", "manager.write('We should never see this')\n", "manager.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# test_bare_no_flush\n", "# Test write bare message, no flush\n", "\n", "manager = NotebookManager()\n", "manager.write('test message', flush=False)\n", "# pylint: disable=protected-access\n", "assert manager._output[0] == '
\\n
test message
\\n
'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_advanced\n", "# More advanced use case\n", "manager = NotebookManager()\n", "\n", "ticks = manager.counter(total=10, desc='Ticks', unit='ticks', color='red')\n", "tocks = manager.counter(total=5, desc='Tocks', unit='tocks', color='blue', position=3)\n", "\n", "for num in range(10):\n", " time.sleep(0.01) # Simulate work\n", " ticks.update()\n", " if not num % 2:\n", " tocks.update()\n", "manager.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_styles\n", "# Styles converted to HTML\n", "manager = NotebookManager()\n", "term = manager.term\n", "\n", "status = manager.status_bar(' '.join((\n", " 'normal',\n", " term.blue_on_aquamarine('blue_on_aquamarine'),\n", " term.aquamarine_on_blue('aquamarine_on_blue'),\n", " term.color(90)('color_90'),\n", " term.on_color(90)('on_color_90'),\n", " term.italic_bright_red('italics_red'),\n", " term.on_bright_blue('on_bright_blue'),\n", " term.blink('blink'),\n", " term.bold('bold'),\n", " term.bold(''), # Empty span will be ignored\n", " term.underline('underline'),\n", " term.reverse('unsupported_reverse'),\n", " term.move(5, 6) + 'unsupported_move',\n", " term.normal + 'ignore_unmatched_normal',\n", " term.link('https://pypi.org/project/enlighten/', 'enlighten'),\n", ")))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# test_stop_no_counters\n", "# Test stop succeeds when there are no counters\n", "manager = NotebookManager()\n", "manager.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Cleanup\n", "cov.stop()\n", "cov.save()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.1 (main, Jan 6 2023, 00:00:00) [GCC 12.2.1 20221121 (Red Hat 12.2.1-4)]" }, "vscode": { "interpreter": { "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a" } } }, "nbformat": 4, "nbformat_minor": 4 } enlighten-1.11.2/tests/test_notebook_manager.py000066400000000000000000000062101436526347400216530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2021 - 2023 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._notebook_manager """ import unittest try: from nbconvert.preprocessors import ExecutePreprocessor import nbformat RUN_NOTEBOOK = True except ImportError: RUN_NOTEBOOK = False from tests import TestCase def run_notebook(path): """ Run a notebook at the given path The notebook's path is set to the current working directory """ with open(path, encoding='utf-8') as notebook_file: notebook = nbformat.read(notebook_file, as_version=nbformat.NO_CONVERT) process = ExecutePreprocessor(timeout=60, allow_errors=True) process.preprocess(notebook, {}) return notebook def has_html_output(cell): """ Check if cell has HTML output """ for output in cell.get('outputs', []): if output.output_type == 'display_data': return 'text/html' in output['data'] return False @unittest.skipUnless(RUN_NOTEBOOK, 'Notebook testing packages not installed') class TestNotebookManager(TestCase): """ Tests for NotebookManager """ maxDiff = None def test_notebook(self): """ All the tests run in the notebook. This just runs it and checks for errors. """ notebook = run_notebook('tests/test_notebook_manager.ipynb') # Make sure there are no errors for cell in notebook.cells: for output in cell.get('outputs', []): if output.output_type == 'stream' and output.name == 'stderr': errors = ''.join(output.text) print(errors) if output.output_type == 'error': raise AssertionError( '%s: %s\n%s' % (output.ename, output.evalue, '\n'.join(output.traceback)) ) self.assertNotEqual(output.output_type, 'error') # Setup: should have no output self.assertFalse(notebook.cells[0].outputs) # test_get_manager: should have no output self.assertFalse(notebook.cells[1].outputs) # test_standard: should have output self.assertTrue(has_html_output(notebook.cells[2]), 'display_data not found in outputs') # # test_disabled: should have no output self.assertFalse(notebook.cells[3].outputs) # test_bare_no_flush: should have no output self.assertFalse(notebook.cells[4].outputs) # test_advanced: should have output self.assertTrue(has_html_output(notebook.cells[5]), 'display_data not found in outputs') # test_styles: should have output self.assertTrue(has_html_output(notebook.cells[6]), 'display_data not found in outputs') # test_stop_no_counters: should have output self.assertTrue(has_html_output(notebook.cells[7]), 'display_data not found in outputs') # Cleanup: should have no output self.assertFalse(notebook.cells[8].outputs) enlighten-1.11.2/tests/test_statusbar.py000066400000000000000000000140351436526347400203550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2020 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._statusbar """ from enlighten import EnlightenWarning, Justify import tests from tests import TestCase, MockManager, MockTTY, MockStatusBar, PY2, unittest class TestStatusBar(TestCase): """ Test the StatusBar class """ def setUp(self): self.tty = MockTTY() self.manager = MockManager(stream=self.tty.stdout) def tearDown(self): self.tty.close() def test_static(self): """ Basic static status bar """ sbar = self.manager.status_bar('Hello', 'World!') self.assertEqual(sbar.format(), 'Hello World!' + ' ' * 68) sbar.update('Goodbye, World!') self.assertEqual(sbar.format(), 'Goodbye, World!' + ' ' * 65) def test_static_justify(self): """ Justified static status bar """ sbar = self.manager.status_bar('Hello', 'World!', justify=Justify.LEFT) self.assertEqual(sbar.format(), 'Hello World!' + ' ' * 68) sbar = self.manager.status_bar('Hello', 'World!', justify=Justify.RIGHT) self.assertEqual(sbar.format(), ' ' * 68 + 'Hello World!') sbar = self.manager.status_bar('Hello', 'World!', justify=Justify.CENTER) self.assertEqual(sbar.format(), ' ' * 34 + 'Hello World!' + ' ' * 34) def test_formatted(self): """ Basic formatted status bar """ sbar = self.manager.status_bar(status_format=u'Stage: {stage}, Status: {status}', stage=1, fields={'status': 'All good!'}) self.assertEqual(sbar.format(), 'Stage: 1, Status: All good!' + ' ' * 53) sbar.update(stage=2) self.assertEqual(sbar.format(), 'Stage: 2, Status: All good!' + ' ' * 53) sbar.update(stage=3, status='Meh') self.assertEqual(sbar.format(), 'Stage: 3, Status: Meh' + ' ' * 59) def test_formatted_justify(self): """ Justified formatted status bar """ sbar = self.manager.status_bar(status_format=u'Stage: {stage}, Status: {status}', stage=1, fields={'status': 'All good!'}, justify=Justify.LEFT) self.assertEqual(sbar.format(), 'Stage: 1, Status: All good!' + ' ' * 53) sbar = self.manager.status_bar(status_format=u'Stage: {stage}, Status: {status}', stage=1, fields={'status': 'All good!'}, justify=Justify.RIGHT) self.assertEqual(sbar.format(), ' ' * 53 + 'Stage: 1, Status: All good!') sbar = self.manager.status_bar(status_format=u'Stage: {stage}, Status: {status}', stage=1, fields={'status': 'All good'}, justify=Justify.CENTER) self.assertEqual(sbar.format(), ' ' * 27 + 'Stage: 1, Status: All good' + ' ' * 27) def test_formatted_missing_field(self): """ ValueError raised when a field is missing when updating status bar """ fields = {'status': 'All good!'} sbar = self.manager.status_bar(status_format=u'Stage: {stage}, Status: {status}', stage=1, fields=fields) del fields['status'] sbar.last_update = sbar.start - 5.0 with self.assertRaisesRegex(ValueError, "'status' specified in format, but not provided"): sbar.update() def test_bad_justify(self): """ ValueError raised when justify is given an invalid value """ with self.assertRaisesRegex(ValueError, 'justify must be one of Justify.LEFT, '): self.manager.status_bar('Hello', 'World!', justify='justice') def test_update(self): """ update() does not refresh is bar is disabled or min_delta hasn't passed """ self.manager.status_bar_class = MockStatusBar sbar = self.manager.status_bar('Hello', 'World!') self.assertEqual(sbar.called, 1) sbar.last_update = sbar.start - 1.0 sbar.update() self.assertEqual(sbar.called, 2) sbar.last_update = sbar.start + 5.0 sbar.update() self.assertEqual(sbar.called, 2) sbar.last_update = sbar.last_update - 10.0 sbar.enabled = False sbar.update() self.assertEqual(sbar.called, 2) sbar.enabled = True sbar.update() self.assertEqual(sbar.called, 3) def test_fill(self): """ Fill uses remaining space """ sbar = self.manager.status_bar(status_format=u'{fill}HI', fill='-') self.assertEqual(sbar.format(), u'-' * 78 + 'HI') sbar = self.manager.status_bar(status_format=u'{fill}HI{fill}', fill='-') self.assertEqual(sbar.format(), u'-' * 39 + 'HI' + u'-' * 39) def test_fill_uneven(self): """ Extra fill should be equal """ sbar = self.manager.status_bar( status_format=u'{fill}Helloooo!{fill}Woooorld!{fill}', fill='-' ) self.assertEqual(sbar.format(), u'-' * 20 + 'Helloooo!' + u'-' * 21 + 'Woooorld!' + u'-' * 21) @unittest.skipIf(PY2, 'Skip warnings tests in Python 2') def test_reserve_fields(self): """ When reserved fields are used, a warning is raised """ with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn: self.manager.status_bar(status_format=u'Stage: {stage}, Fill: {fill}', stage=1, fields={'fill': 'Reserved field'}) self.assertRegex(tests.__file__, warn.filename) with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn: self.manager.status_bar(status_format=u'Stage: {stage}, elapsed: {elapsed}', stage=1, elapsed='Reserved field') self.assertRegex(tests.__file__, warn.filename) enlighten-1.11.2/tests/test_util.py000066400000000000000000000234451436526347400173270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2017 - 2022 Avram Lubkin, All Rights Reserved # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Test module for enlighten._util """ from textwrap import dedent import blessed from enlighten._util import format_time, Lookahead, HTMLConverter from tests import TestCase, MockTTY class TestFormatTime(TestCase): """ Test cases for :py:func:`_format_time` """ def test_seconds(self): """Verify seconds formatting""" self.assertEqual(format_time(0), '00:00') self.assertEqual(format_time(6), '00:06') self.assertEqual(format_time(42), '00:42') def test_minutes(self): """Verify minutes formatting""" self.assertEqual(format_time(60), '01:00') self.assertEqual(format_time(128), '02:08') self.assertEqual(format_time(1684), '28:04') def test_hours(self): """Verify hours formatting""" self.assertEqual(format_time(3600), '1h 00:00') self.assertEqual(format_time(43980), '12h 13:00') self.assertEqual(format_time(43998), '12h 13:18') def test_days(self): """Verify days formatting""" self.assertEqual(format_time(86400), '1d 0h 00:00') self.assertEqual(format_time(1447597), '16d 18h 06:37') class TestLookahead(TestCase): """ Test cases for Lookahead """ def test_iteration(self): """Verify normal iteration""" wrapped = Lookahead(iter(range(10))) self.assertEqual([next(wrapped) for _ in range(10)], list(range(10))) def test_getitem(self): """Verify __getitem__ behavior""" wrapped = Lookahead(iter(range(10))) self.assertEqual(wrapped[0], 0) self.assertEqual(wrapped[4], 4) self.assertEqual(wrapped[2: 4], [2, 3]) self.assertEqual(wrapped[8: 12], [8, 9]) with self.assertRaisesRegex(TypeError, 'Index or slice notation is required'): wrapped['named_key'] # pylint: disable=pointless-statement with self.assertRaisesRegex(ValueError, 'Negative indexes are not supported'): wrapped[-1] # pylint: disable=pointless-statement def test_buffer(self): """Output changes as iteration proceeds""" wrapped = Lookahead(iter(range(10))) self.assertEqual(next(wrapped), 0) self.assertEqual(wrapped[0], 1) self.assertEqual(next(wrapped), 1) self.assertEqual(wrapped[4], 6) self.assertEqual(next(wrapped), 2) self.assertEqual(wrapped[2: 4], [5, 6]) self.assertEqual(next(wrapped), 3) self.assertEqual(wrapped[8: 12], []) def test_step_notation(self): """Slice notation is supported""" wrapped = Lookahead(iter(range(10))) self.assertEqual(wrapped[: 6: 2], [0, 2, 4]) class TestHTMLConverter(TestCase): """ Test cases for HTMLConverter """ # pylint: disable=protected-access @classmethod def setUpClass(cls): cls.tty = MockTTY() cls.term = blessed.Terminal( stream=cls.tty.stdout, force_styling=True ) cls.term.number_of_colors = 1 << 24 @classmethod def tearDownClass(cls): cls.tty.close() def setUp(self): self.converter = HTMLConverter(term=self.term) def test_color(self): """Verify color conversion""" # CGA color on RGB color out = self.converter.to_html(self.term.blue_on_aquamarine('blue_on_aquam')) self.assertEqual( out, u'
blue_on_aquam
' ) self.assertEqual(self.converter._styles['enlighten-fg-blue'], {'color': '#0000ee'}) self.assertEqual( self.converter._styles['enlighten-bg-aquamarine'], {'background-color': '#7fffd4'} ) # RGB color on CGA color out = self.converter.to_html(self.term.aquamarine_on_blue('aquam_on_blue')) self.assertEqual( out, u'
aquam_on_blue
' ) self.assertEqual(self.converter._styles['enlighten-fg-aquamarine'], {'color': '#7fffd4'}) self.assertEqual( self.converter._styles['enlighten-bg-blue'], {'background-color': '#0000ee'} ) # On RGB color out = self.converter.to_html(self.term.on_color_rgb(80, 4, 13)('on_color_rgb')) self.assertEqual(out, '
on_color_rgb
') self.assertEqual( self.converter._styles['enlighten-bg-50040d'], {'background-color': '#50040d'} ) # 256 Color out = self.converter.to_html(self.term.color(90)('color_90')) self.assertEqual(out, '
color_90
') self.assertEqual(self.converter._styles['enlighten-fg-870087'], {'color': '#870087'}) # On 256 Color out = self.converter.to_html(self.term.on_color(90)('on_color_90')) self.assertEqual(out, '
on_color_90
') self.assertEqual( self.converter._styles['enlighten-bg-870087'], {'background-color': '#870087'} ) # CGA Bright Color out = self.converter.to_html(self.term.bright_red('bright_red')) self.assertEqual(out, '
bright_red
') self.assertEqual(self.converter._styles['enlighten-fg-bright-red'], {'color': '#ff0000'}) # On CGA Bright Color out = self.converter.to_html(self.term.on_bright_red('on_bright_red')) self.assertEqual( out, '
on_bright_red
' ) self.assertEqual( self.converter._styles['enlighten-bg-bright-red'], {'background-color': '#ff0000'} ) def test_style(self): """Verify style conversion""" # Italics out = self.converter.to_html(self.term.italic('italic')) self.assertEqual(out, '
italic
') self.assertEqual(self.converter._styles['enlighten-italic'], {'font-style': 'italic'}) # Bold out = self.converter.to_html(self.term.bold('bold')) self.assertEqual(out, '
bold
') self.assertEqual(self.converter._styles['enlighten-bold'], {'font-weight': 'bold'}) # Underline out = self.converter.to_html(self.term.underline('underline')) self.assertEqual(out, '
underline
') self.assertEqual( self.converter._styles['enlighten-underline'], {'text-decoration': 'underline'} ) def test_unsupported(self): """Verify unsupported does not produce classes""" # Unsupported capability out = self.converter.to_html(self.term.move(5, 6) + 'unsupported_move') self.assertEqual(out, '
unsupported_move
') # Unsupported text attribute out = self.converter.to_html(self.term.reverse('unsupported_reverse')) self.assertEqual(out, '
unsupported_reverse
') def test_link(self): """Verify link creates hyperlink""" out = self.converter.to_html( self.term.link('https://pypi.org/project/enlighten/', 'enlighten') ) self.assertEqual( out, '
enlighten
' ) def test_empty_span(self): """Empty Spans are ignored""" out = self.converter.to_html(self.term.underline('') + 'empty') self.assertEqual(out, '
empty
') def test_class_not_unique(self): """Repeated classes are dropped within the same span""" out = self.converter.to_html(self.term.blue_on_aquamarine(self.term.blue('blue_on_aquam'))) self.assertEqual( out, u'
blue_on_aquam
' ) def test_style_output(self): """Verify style section output""" out = self.converter.to_html(self.term.red_on_slategrey('red_on_slategrey')) self.assertEqual( out, u'
red_on_slategrey
' ) style = '''\ ''' self.assertEqual(self.converter.style, dedent(style)) def test_blink(self): """Blink requires an additional style section""" if not self.term.blink: self.skipTest('blink is not supported by this terminal') out = self.converter.to_html(self.term.blink('blink')) self.assertEqual(out, '
blink
') self.assertEqual( self.converter._additional_styles, {'@keyframes enlighten-blink-animation {\n to {\n visibility: hidden;\n }\n}'} ) self.assertEqual( self.converter._styles['enlighten-blink'], {'animation': 'enlighten-blink-animation 1s steps(5, start) infinite'} ) style = '''\ ''' self.assertEqual(self.converter.style, dedent(style)) enlighten-1.11.2/tox.ini000066400000000000000000000044121436526347400151030ustar00rootroot00000000000000[tox] ignore_basepython_conflict = True envlist = lint copyright coverage docs el7 py{27,36,37,38,39,310,py27,py38} [base] deps = blessed prefixed py{27,py27}: backports.functools-lru-cache [ipython] deps = ipykernel ipython nbconvert nbformat [testenv] basepython = python3.11 usedevelop = True ignore_errors = True deps = {[base]deps} py{27,py27}: mock commands = {envpython} -m unittest discover -s {toxinidir}/tests {posargs} [testenv:el7] basepython = python2.7 deps = blessed == 1.18.1 mock == 1.0.1 prefixed == 0.6.0 # setuptools == 0.9.8 (Doesn't support PEP 508) setuptools == 20.2.2 backports.functools-lru-cache == 1.2.1 # Blessed dependencies six == 1.9.0 wcwidth == 0.2.5 [testenv:flake8] skip_install = True deps = flake8 commands = flake8 [testenv:pylint] skip_install = True ignore_errors = True deps = {[base]deps} {[ipython]deps} pylint pyenchant commands = pylint enlighten setup setup_helpers tests examples [testenv:nbqa] skip_install = True ignore_errors = True deps = {[testenv:flake8]deps} {[testenv:pylint]deps} coverage nbqa commands = nbqa flake8 tests nbqa pylint tests [testenv:copyright] skip_install = True ignore_errors = True commands = {envpython} setup_helpers.py copyright [testenv:lint] skip_install = True ignore_errors = True deps = {[testenv:flake8]deps} {[testenv:pylint]deps} {[testenv:nbqa]deps} commands = {[testenv:flake8]commands} {[testenv:pylint]commands} {[testenv:nbqa]commands} [testenv:coverage] deps = {[base]deps} {[ipython]deps} coverage commands = coverage erase coverage run -p -m unittest discover -s {toxinidir}/tests {posargs} coverage combine coverage report [testenv:codecov] passenv = CI CODECOV_* GITHUB_* deps = {[testenv:coverage]deps} codecov commands = {[testenv:coverage]commands} codecov [testenv:docs] deps = sphinx sphinxcontrib-spelling sphinx_rtd_theme commands= {envpython} setup_helpers.py spelling-clean {envpython} setup.py spelling {envpython} setup_helpers.py spelling {envpython} setup.py html {envpython} setup_helpers.py rst2html README.rst