[
  {
    "path": ".github/workflows/master.yml",
    "content": "\nname: CI\n\non:\n  push:\n    branches: [ master ]\n    tags:\n      - v[0-9]+.[0-9]+.[0-9]+\n  pull_request:\n    branches: [ master ]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\njobs:\n\n  unittests-python:\n    name: Python unit tests\n    runs-on: ubuntu-latest\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Build package\n      - name: Run Python unit tests\n        run: make run-tests-python\n\n\n  unittests-angular:\n    name: Angular unit tests\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Build package\n      - name: Run Angular unit tests\n        run: make run-tests-angular\n\n\n  build-deb:\n    name: Build Deb\n    runs-on: ubuntu-latest\n    needs: [ unittests-python, unittests-angular ]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Sets up build environment\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v1\n      - name: Set up Docker Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@v1\n        with:\n          driver-opts: |\n            image=moby/buildkit:master\n            network=host\n      - name: Show buildx builder instance name\n        run: echo ${{ steps.buildx.outputs.name }}\n      - name: Show buildx available platforms\n        run: echo ${{ steps.buildx.outputs.platforms }}\n\n      # Build package\n      - name: Build deb package\n        run: make deb\n\n      # Upload package\n      - name: Publish artifact\n        uses: actions/upload-artifact@v2\n        with:\n          path: ${{ github.workspace }}/build/*.deb\n          name: deb-${{ github.run_number }}\n\n      # Post build steps\n      - name: List built packages\n        if: ${{ success() }}\n        run: ls -l $GITHUB_WORKSPACE/build/\n\n  build-docker-image:\n    name: Build Docker Image\n    runs-on: ubuntu-latest\n    needs: [ unittests-python, unittests-angular ]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Sets up build environment\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v1\n      - name: Set up Docker Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@v1\n        with:\n          driver-opts: |\n            image=moby/buildkit:master\n            network=host\n      - name: Show buildx builder instance name\n        run: echo ${{ steps.buildx.outputs.name }}\n      - name: Show buildx available platforms\n        run: echo ${{ steps.buildx.outputs.platforms }}\n\n      # Login using a PAT with write:packages scope\n      - name: Log into GitHub Container Registry\n        run: echo \"${{ secrets.CR_PAT }}\" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin\n      # Set staging registry\n      - name: Set staging registry env variable\n        run: echo \"staging_registry=ghcr.io/${{ github.repository }}\" >> $GITHUB_ENV\n\n      # Build docker image\n      - name: Build docker image\n        run: make docker-image STAGING_REGISTRY=${{ env.staging_registry }} STAGING_VERSION=${{ github.run_number }}\n\n  e2etests-deb:\n    name: End-to-end tests on Deb\n    runs-on: ubuntu-latest\n    needs: [ build-deb ]\n    strategy:\n      matrix:\n        oscode: [ ubu1604, ubu1804, ubu2004 ]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Download deb package artifact\n        uses: actions/download-artifact@v2\n        with:\n          name: deb-${{ github.run_number }}\n          path: build/\n\n      # Run e2e test\n      - name: Run e2e test\n        run: make run-tests-e2e SEEDSYNC_DEB=`readlink -f build/*.deb` SEEDSYNC_OS=${{ matrix.oscode }}\n\n  e2etests-docker-image:\n    name: End-to-end tests on Docker Image\n    runs-on: ubuntu-latest\n    needs: [ build-docker-image ]\n    strategy:\n      matrix:\n        arch: [ amd64, arm64, arm/v7 ]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Sets up build environment\n      - name: Enable Docker experimental features\n        run: |\n          echo $'{\\n    \"experimental\": true\\n}' | sudo tee /etc/docker/daemon.json\n          sudo service docker restart\n          docker version\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v1\n      - name: Set up Docker Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@v1\n        with:\n          driver-opts: |\n            image=moby/buildkit:master\n            network=host\n      - name: Show buildx builder instance name\n        run: echo ${{ steps.buildx.outputs.name }}\n      - name: Show buildx available platforms\n        run: echo ${{ steps.buildx.outputs.platforms }}\n\n      # Login using a PAT with write:packages scope\n      - name: Log into GitHub Container Registry\n        run: echo \"${{ secrets.CR_PAT }}\" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin\n      # Set staging registry\n      - name: Set staging registry env variable\n        run: echo \"staging_registry=ghcr.io/${{ github.repository }}\" >> $GITHUB_ENV\n\n      # Run e2e test\n      - name: Run e2e test\n        run: make run-tests-e2e \\\n          STAGING_REGISTRY=${{ env.staging_registry }} \\\n          STAGING_VERSION=${{ github.run_number }} \\\n          SEEDSYNC_ARCH=${{ matrix.arch }}\n\n  publish-docker-image:\n    name: Publish Docker Image\n    if: startsWith(github.ref, 'refs/tags/v')\n    runs-on: ubuntu-latest\n    needs: [ e2etests-deb, e2etests-docker-image ]\n    steps:\n      - name: Set release env variable\n        run: echo \"RELEASE_VERSION=${GITHUB_REF#refs/tags/v}\" >> $GITHUB_ENV\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      # Sets up build environment\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v1\n      - name: Set up Docker Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@v1\n        with:\n          driver-opts: |\n            image=moby/buildkit:master\n            network=host\n      - name: Show buildx builder instance name\n        run: echo ${{ steps.buildx.outputs.name }}\n      - name: Show buildx available platforms\n        run: echo ${{ steps.buildx.outputs.platforms }}\n\n      # Login to GHCR using a PAT with write:packages scope\n      - name: Log into GitHub Container Registry\n        run: echo \"${{ secrets.CR_PAT }}\" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin\n      # Login to Dockerhub\n      - name: Log into Dockerhub registry\n        run: echo \"${{ secrets.DOCKER_PASSWORD }}\" |\n          docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin\n      # Set staging registry\n      - name: Set staging registry env variable\n        run: echo \"staging_registry=ghcr.io/${{ github.repository }}\" >> $GITHUB_ENV\n\n      # Push image to dockerhub\n      - name: Push to Dockerhub (tag vX.X.X)\n        run: make docker-image-release \\\n          STAGING_REGISTRY=${{ env.staging_registry }} \\\n          STAGING_VERSION=${{ github.run_number }} \\\n          RELEASE_REGISTRY=docker.io/ipsingh06 \\\n          RELEASE_VERSION=${{ env.RELEASE_VERSION }}\n      - name: Push to Dockerhub (tag latest)\n        run: make docker-image-release \\\n          STAGING_REGISTRY=${{ env.staging_registry }} \\\n          STAGING_VERSION=${{ github.run_number }} \\\n          RELEASE_REGISTRY=docker.io/ipsingh06 \\\n          RELEASE_VERSION=latest\n\n  publish-deb:\n    name: Publish Deb package\n    if: startsWith(github.ref, 'refs/tags/v')\n    runs-on: ubuntu-latest\n    needs: [ e2etests-deb, e2etests-docker-image ]\n    steps:\n      - name: Set release env variable\n        run: echo \"RELEASE_VERSION=${GITHUB_REF#refs/tags/v}\" >> $GITHUB_ENV\n      - name: Download deb package artifact\n        uses: actions/download-artifact@v2\n        with:\n          name: deb-${{ github.run_number }}\n          path: build/\n      - name: Set deb file path and name env variable\n        run: |\n          echo \"DEB_PATH=$(readlink -f ./build/*.deb)\" >> $GITHUB_ENV\n          echo \"DEB_NAME=$(basename $(readlink -f ./build/*.deb))\" >> $GITHUB_ENV\n      - name: Create Release\n        id: create_release\n        uses: actions/create-release@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          tag_name: ${{ github.ref }}\n          release_name: Release ${{ github.ref }}\n          body: ${{ github.event.head_commit.message }}\n          draft: false\n          prerelease: false\n      - name: Upload Release Asset\n        id: upload-release-asset\n        uses: actions/upload-release-asset@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          upload_url: ${{ steps.create_release.outputs.upload_url }}\n          asset_path: ${{ env.DEB_PATH }}\n          asset_name: ${{ env.DEB_NAME }}\n          asset_content_type: application/x-deb\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n*.pyc\n/build\n.venv\npackage-lock.json\nsrc/python/build\nsrc/python/site"
  },
  {
    "path": "LICENSE.txt",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "Makefile",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n# Catch sigterms\n# See: https://stackoverflow.com/a/52159940\nexport SHELL:=/bin/bash\nexport SHELLOPTS:=$(if $(SHELLOPTS),$(SHELLOPTS):)pipefail:errexit\n.ONESHELL:\n\n# Color outputs\nred=`tput setaf 1`\ngreen=`tput setaf 2`\nreset=`tput sgr0`\n\nROOTDIR:=$(shell realpath .)\nSOURCEDIR:=$(shell realpath ./src)\nBUILDDIR:=$(shell realpath ./build)\nDEFAULT_STAGING_REGISTRY:=localhost:5000\n\n#DOCKER_BUILDKIT_FLAGS=BUILDKIT_PROGRESS=plain\nDOCKER=${DOCKER_BUILDKIT_FLAGS} DOCKER_BUILDKIT=1 docker\nDOCKER_COMPOSE=${DOCKER_BUILDKIT_FLAGS} COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose\n\n.PHONY: builddir deb docker-image clean\n\nall: deb docker-image\n\nbuilddir:\n\tmkdir -p ${BUILDDIR}\n\nscanfs: builddir\n\t$(DOCKER) build \\\n\t\t-f ${SOURCEDIR}/docker/build/deb/Dockerfile \\\n\t\t--target seedsync_build_scanfs_export \\\n\t\t--output ${BUILDDIR} \\\n\t\t${ROOTDIR}\n\ndeb: builddir\n\t$(DOCKER) build \\\n\t\t-f ${SOURCEDIR}/docker/build/deb/Dockerfile \\\n\t\t--target seedsync_build_deb_export \\\n\t\t--output ${BUILDDIR} \\\n\t\t${ROOTDIR}\n\ndocker-buildx:\n\t$(DOCKER) run --rm --privileged multiarch/qemu-user-static --reset -p yes\n\ndocker-image: docker-buildx\n\t@if [[ -z \"${STAGING_REGISTRY}\" ]] ; then \\\n\t\texport STAGING_REGISTRY=\"${DEFAULT_STAGING_REGISTRY}\"; \\\n\tfi;\n\techo \"${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}\";\n\t@if [[ -z \"${STAGING_VERSION}\" ]] ; then \\\n\t\texport STAGING_VERSION=\"latest\"; \\\n\tfi;\n\techo \"${green}STAGING_VERSION=$${STAGING_VERSION}${reset}\";\n\n\t# scanfs image\n\t$(DOCKER) buildx build \\\n\t\t-f ${SOURCEDIR}/docker/build/deb/Dockerfile \\\n\t\t--target seedsync_build_scanfs_export \\\n\t\t--tag $${STAGING_REGISTRY}/seedsync/build/scanfs/export:$${STAGING_VERSION} \\\n\t\t--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/scanfs/export:cache,mode=max \\\n\t\t--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/scanfs/export:cache \\\n\t\t--push \\\n\t\t${ROOTDIR}\n\n\t# angular html export\n\t$(DOCKER) buildx build \\\n\t\t-f ${SOURCEDIR}/docker/build/deb/Dockerfile \\\n\t\t--target seedsync_build_angular_export \\\n\t\t--tag $${STAGING_REGISTRY}/seedsync/build/angular/export:$${STAGING_VERSION} \\\n\t\t--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/angular/export:cache,mode=max \\\n\t\t--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync/build/angular/export:cache \\\n\t\t--push \\\n\t\t${ROOTDIR}\n\n\t# final image\n\t$(DOCKER) buildx build \\\n\t\t-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \\\n\t\t--target seedsync_run \\\n\t\t--build-arg STAGING_VERSION=$${STAGING_VERSION} \\\n\t\t--build-arg STAGING_REGISTRY=$${STAGING_REGISTRY} \\\n\t\t--tag $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION} \\\n\t\t--cache-to=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache,mode=max \\\n\t\t--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache \\\n\t\t--platform linux/amd64,linux/arm64,linux/arm/v7 \\\n\t\t--push \\\n\t\t${ROOTDIR}\n\ndocker-image-release:\n\t@if [[ -z \"${STAGING_REGISTRY}\" ]] ; then \\\n\t\texport STAGING_REGISTRY=\"${DEFAULT_STAGING_REGISTRY}\"; \\\n\tfi;\n\techo \"${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}\";\n\t@if [[ -z \"${STAGING_VERSION}\" ]] ; then \\\n\t\texport STAGING_VERSION=\"latest\"; \\\n\tfi;\n\techo \"${green}STAGING_VERSION=$${STAGING_VERSION}${reset}\";\n\t@if [[ -z \"${RELEASE_REGISTRY}\" ]] ; then \\\n\t\techo \"${red}ERROR: RELEASE_REGISTRY is required${reset}\"; exit 1; \\\n\tfi\n\t@if [[ -z \"${RELEASE_VERSION}\" ]] ; then \\\n\t\techo \"${red}ERROR: RELEASE_VERSION is required${reset}\"; exit 1; \\\n\tfi\n\techo \"${green}RELEASE_REGISTRY=${RELEASE_REGISTRY}${reset}\"\n\techo \"${green}RELEASE_VERSION=${RELEASE_VERSION}${reset}\"\n\n\t# final image\n\t$(DOCKER) buildx build \\\n\t\t-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \\\n\t\t--target seedsync_run \\\n\t\t--build-arg STAGING_VERSION=$${STAGING_VERSION} \\\n\t\t--build-arg STAGING_REGISTRY=$${STAGING_REGISTRY} \\\n\t\t--tag ${RELEASE_REGISTRY}/seedsync:${RELEASE_VERSION} \\\n\t\t--cache-from=type=registry,ref=$${STAGING_REGISTRY}/seedsync:cache \\\n\t\t--platform linux/amd64,linux/arm64,linux/arm/v7 \\\n\t\t--push \\\n\t\t${ROOTDIR}\n\ntests-python:\n\t# python run\n\t$(DOCKER) build \\\n\t\t-f ${SOURCEDIR}/docker/build/docker-image/Dockerfile \\\n\t\t--target seedsync_run_python_devenv \\\n\t\t--tag seedsync/run/python/devenv \\\n\t\t${ROOTDIR}\n\t# python tests\n\t$(DOCKER_COMPOSE) \\\n\t\t-f ${SOURCEDIR}/docker/test/python/compose.yml \\\n\t\tbuild\n\nrun-tests-python: tests-python\n\t$(DOCKER_COMPOSE) \\\n\t\t-f ${SOURCEDIR}/docker/test/python/compose.yml \\\n\t\tup --force-recreate --exit-code-from tests\n\ntests-angular:\n\t# angular build\n\t$(DOCKER) build \\\n\t\t-f ${SOURCEDIR}/docker/build/deb/Dockerfile \\\n\t\t--target seedsync_build_angular_env \\\n\t\t--tag seedsync/build/angular/env \\\n\t\t${ROOTDIR}\n\t# angular tests\n\t$(DOCKER_COMPOSE) \\\n\t\t-f ${SOURCEDIR}/docker/test/angular/compose.yml \\\n\t\tbuild\n\nrun-tests-angular: tests-angular\n\t$(DOCKER_COMPOSE) \\\n\t\t-f ${SOURCEDIR}/docker/test/angular/compose.yml \\\n\t\tup --force-recreate --exit-code-from tests\n\ntests-e2e-deps:\n\t# deb pre-reqs\n\t$(DOCKER) build \\\n\t\t${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd \\\n\t\t-t ubuntu-systemd:16.04\n\t$(DOCKER) build \\\n\t\t${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd \\\n\t\t-t ubuntu-systemd:18.04\n\t$(DOCKER) build \\\n\t\t${SOURCEDIR}/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd \\\n\t\t-t ubuntu-systemd:20.04\n\n\t# Setup docker for the systemd container\n\t# See: https://github.com/solita/docker-systemd\n\t$(DOCKER) run --rm --privileged -v /:/host solita/ubuntu-systemd setup\n\nrun-tests-e2e: tests-e2e-deps\n\t# Check our settings\n\t@if [[ -z \"${STAGING_VERSION}\" ]] && [[ -z \"${SEEDSYNC_DEB}\" ]]; then \\\n\t\techo \"${red}ERROR: One of STAGING_VERSION or SEEDSYNC_DEB must be set${reset}\"; exit 1; \\\n\telif [[ ! -z \"${STAGING_VERSION}\" ]] && [[ ! -z \"${SEEDSYNC_DEB}\" ]]; then \\\n\t  \techo \"${red}ERROR: Only one of STAGING_VERSION or SEEDSYNC_DEB must be set${reset}\"; exit 1; \\\n  \tfi\n\n\t# Set up environment for deb\n\t@if [[ ! -z \"${SEEDSYNC_DEB}\" ]] ; then \\\n\t\tif [[ -z \"${SEEDSYNC_OS}\" ]] ; then \\\n\t\t\techo \"${red}ERROR: SEEDSYNC_OS is required for DEB e2e test${reset}\"; \\\n\t\t\techo \"${red}Options include: ubu1604, ubu1804, ubu2004${reset}\"; exit 1; \\\n\t\tfi\n\tfi\n\n\t# Set up environment for image\n\t@if [[ ! -z \"${STAGING_VERSION}\" ]] ; then \\\n\t\tif [[ -z \"${SEEDSYNC_ARCH}\" ]] ; then \\\n\t\t\techo \"${red}ERROR: SEEDSYNC_ARCH is required for docker image e2e test${reset}\"; \\\n\t\t\techo \"${red}Options include: amd64, arm64, arm/v7${reset}\"; exit 1; \\\n\t\tfi\n\t\tif [[ -z \"${STAGING_REGISTRY}\" ]] ; then \\\n\t\t\texport STAGING_REGISTRY=\"${DEFAULT_STAGING_REGISTRY}\"; \\\n\t\tfi;\n\t\techo \"${green}STAGING_REGISTRY=$${STAGING_REGISTRY}${reset}\";\n\t\t# Removing and pulling is the only way to select the arch from a multi-arch image :(\n\t\t$(DOCKER) rmi -f $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION}\n\t\t$(DOCKER) pull $${STAGING_REGISTRY}/seedsync:$${STAGING_VERSION} --platform linux/$${SEEDSYNC_ARCH}\n\tfi\n\n\t# Set the flags\n\tCOMPOSE_FLAGS=\"-f ${SOURCEDIR}/docker/test/e2e/compose.yml \"\n\tCOMPOSE_RUN_FLAGS=\"\"\n\tif [[ ! -z \"${SEEDSYNC_DEB}\" ]] ; then\n\t\tCOMPOSE_FLAGS+=\"-f ${SOURCEDIR}/docker/stage/deb/compose.yml \"\n\t\tCOMPOSE_FLAGS+=\"-f ${SOURCEDIR}/docker/stage/deb/compose-${SEEDSYNC_OS}.yml \"\n\tfi\n\tif [[ ! -z \"${STAGING_VERSION}\" ]] ; then \\\n\t\tCOMPOSE_FLAGS+=\"-f ${SOURCEDIR}/docker/stage/docker-image/compose.yml \"\n\tfi\n\tif [[ \"${DEV}\" = \"1\" ]] ; then\n\t\tCOMPOSE_FLAGS+=\"-f ${SOURCEDIR}/docker/test/e2e/compose-dev.yml \"\n\telse \\\n  \t\tCOMPOSE_RUN_FLAGS+=\"-d\"\n\tfi\n\techo \"${green}COMPOSE_FLAGS=$${COMPOSE_FLAGS}${reset}\"\n\n\t# Set up Ctrl-C handler\n\tfunction tearDown {\n\t\t$(DOCKER_COMPOSE) \\\n\t\t\t$${COMPOSE_FLAGS} \\\n\t\t\tstop\n\t}\n\ttrap tearDown EXIT\n\n\t# Build the test\n\techo \"${green}Building the tests${reset}\"\n\t$(DOCKER_COMPOSE) \\\n\t\t$${COMPOSE_FLAGS} \\\n\t\tbuild\n\n\t# This suppresses the docker-compose error that image has changed\n\t$(DOCKER_COMPOSE) \\\n\t\t$${COMPOSE_FLAGS} \\\n\t\trm -f myapp\n\n\t# Run the test\n\techo \"${green}Running the tests${reset}\"\n\t$(DOCKER_COMPOSE) \\\n\t\t$${COMPOSE_FLAGS} \\\n\t\tup --force-recreate \\\n\t\t$${COMPOSE_RUN_FLAGS}\n\n\tif [[ \"${DEV}\" != \"1\" ]] ; then\n\t\t$(DOCKER) logs -f seedsync_test_e2e\n\tfi\n\n\tEXITCODE=`$(DOCKER) inspect seedsync_test_e2e | jq '.[].State.ExitCode'`\n\tif [[ \"$${EXITCODE}\" != \"0\" ]] ; then\n\t\tfalse\n\tfi\n\nrun-remote-server:\n\t$(DOCKER) container rm -f seedsync_test_e2e_remote-dev\n\t$(DOCKER) run \\\n\t\t-it --init \\\n\t\t-p 1234:1234 \\\n\t\t--name seedsync_test_e2e_remote-dev \\\n\t\tseedsync/test/e2e/remote\n\nclean:\n\trm -rf ${BUILDDIR}\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n    <img src=\"https://user-images.githubusercontent.com/12875506/85908858-c637a100-b7cb-11ea-8ab3-75c0c0ddf756.png\" alt=\"SeedSync\" />\n</p>\n\n\n<p align=\"center\">\n  <!--<a href=\"https://travis-ci.com/ipsingh06/seedsync\">\n    <img src=\"https://img.shields.io/travis/com/ipsingh06/seedsync\" alt=\"Build\">\n  </a>-->\n  <a href=\"https://github.com/ipsingh06/seedsync\">\n    <img src=\"https://img.shields.io/github/stars/ipsingh06/seedsync\" alt=\"Stars\">\n  </a>\n  <a href=\"https://hub.docker.com/r/ipsingh06/seedsync\">\n    <img src=\"https://img.shields.io/docker/pulls/ipsingh06/seedsync\" alt=\"Downloads\">\n  </a>\n  <a href=\"https://hub.docker.com/r/ipsingh06/seedsync\">\n    <img src=\"https://img.shields.io/docker/v/ipsingh06/seedsync?color=blue\" alt=\"Version\">\n  </a>\n  <a href=\"https://hub.docker.com/r/ipsingh06/seedsync\">\n    <img src=\"https://img.shields.io/docker/image-size/ipsingh06/seedsync/latest?style=flat\" alt=\"Size\">\n  </a>\n  <a href=\"https://github.com/ipsingh06/seedsync/blob/master/LICENSE.txt\">\n    <img src=\"https://img.shields.io/github/license/ipsingh06/seedsync\" alt=\"License\">\n  </a>\n</p>\n\nSeedSync is a tool to sync the files on a remote Linux server (like your seedbox, for example).\nIt uses LFTP to transfer files fast!\n\n## Features\n\n* Built on top of [LFTP](http://lftp.tech/), the fastest file transfer program ever\n* Web UI - track and control your transfers from anywhere\n* Automatically extract your files after sync\n* Auto-Queue - only sync the files you want based on pattern matching\n* Delete local and remote files easily\n* Fully open source!\n\n## How it works\n\nInstall SeedSync on a local machine.\nSeedSync will connect to your remote server and sync files to the local machine as\nthey become available.\n\nYou don't need to install anything on the remote server.\nAll you need are the SSH credentials for the remote server.\n\n## Supported Platforms\n\n* Linux\n* Raspberry Pi (v2, v3 and v4)\n* Windows (via Docker)\n* MacOS (via Docker)\n\n\n## Installation and Usage\n\nPlease refer to the [documentation](https://ipsingh06.github.io/seedsync/).\n\n\n## Report an Issue\n\nPlease report any issues on the [issues](../../issues) page.\nPlease post the logs as well. The logs are available at:\n* Deb install: `<user home directory>/.seedsync/log/seedsync.log`\n* Docker: Run `docker logs <container id>`\n\n\n## Contribute\n\nContributions to SeedSync are welcome!\nPlease take a look at the [Developer Readme](doc/DeveloperReadme.md) for instructions\non environment setup and the build process.\n\n\n## License\n\nSeedSync is distributed under Apache License Version 2.0.\nSee [License.txt](https://github.com/ipsingh06/seedsync/blob/master/LICENSE.txt) for more information.\n\n\n\n![](https://user-images.githubusercontent.com/12875506/37031587-3a5df834-20f4-11e8-98a0-e42ee764f2ea.png)\n"
  },
  {
    "path": "doc/CodingGuidelines.md",
    "content": "# Coding Guidelines\n\n## Python\n1. Try not to throw exceptions in constructors.\nDelay exceptions until after the web service is up and running.\nThis allows us to notify the user about the error.\n\n2. Try to keep constructors short and passive.\nTry not to start any threads or processes in constructors.\n\n3. Do not rely on timing constraints in tests.\nThat is, don't use `time.sleep()` to wait for something to happen.\nActually wait for the condition and use a watchdog timer to check for failure.\n\n## Angular\n1. Keep constructor of Immutable.Record blank.\nAny pre-processing that is needed to convert a JS object to Record should be put in a factory function.\nThis ensures that the Record object can be easily constructed for tests without having to know the JS object translations.\n"
  },
  {
    "path": "doc/DeveloperReadme.md",
    "content": "[TOC]\n\n\n\n# Environment Setup\n\n## Install dependencies\n1. Install [nodejs](https://joshtronic.com/2019/04/29/how-to-install-node-v12-on-debian-and-ubuntu/) (comes with npm)\n\n2. Install [Poetry](https://python-poetry.org/docs/#installation):\n\n3. Install docker and docker-compose:\nhttps://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce\nhttps://docs.docker.com/compose/install/\n\n4. Install docker buildx\n   \n    1. https://github.com/docker/buildx/issues/132#issuecomment-582218096\n    2. https://github.com/docker/buildx/issues/132#issuecomment-636041307\n    \n5. Build dependencies\n\n   ```bash\n   sudo apt-get install -y jq\n   ```\n\n6. Install the rest:\n   ```bash\n   sudo apt-get install -y lftp python3-dev rar\n   ```\n\n## Fetch code\n```bash\ngit clone git@gitlab.com:ipsingh06/seedsync.git\ncd seedsync\n```\n\n## Setup Poetry project\n```bash\ncd src/python\npoetry install\n```\n\n## Setup angular node modules\n```bash\ncd src/angular\nnpm install\n```\n\n## Setup end-to-end tests node modules\n```bash\ncd src/e2e\nnpm install\n```\n\n# Build\n\n1. Set up docker buildx for multi-arch builds\n\n   ```bash\n   docker buildx create --name mybuilder --driver docker-container --driver-opt image=moby/buildkit:master,network=host\n   docker buildx use mybuilder\n   docker run --rm --privileged multiarch/qemu-user-static --reset -p yes\n   docker buildx inspect --bootstrap\n   # Make sure the following architectures are listed: linux/amd64, linux/arm64, linux/arm/v7 \n   ```\n\n2. Multi-arch docker images can only be stored in a registry.\n   Create local docker registry to store multi-arch images\n\n   ```bash\n   docker run -d -p 5000:5000 --restart=always --name registry registry:2\n   ```\n\n3. Run these commands inside the root directory.\n   ```bash\n   make clean\n   make\n   ```\n\n4. The .deb package will be generated inside `build` directory.\n   The docker image will be pushed to the local registry as `seedsync:latest`. See if using:\n\n   ```bash\n   curl -X GET http://localhost:5000/v2/_catalog\n   ```\n   \n   To inspect the architectures of image:\n   \n   ```bash\n   docker buildx imagetools inspect localhost:5000/seedsync:latest\n   ```\n   \n   To use a different registry during the build process, use `STAGING_REGISTRY=`.\n   For example:\n   \n   ```bash\n   make STAGING_REGISTRY=another-registry:5000\n   ```\n   \n   To build a tag other than `latest`, use `STAGING_VERSION=`.\n   For example:\n   \n   ```bash\n   make STAGING_VERSION=0.0.1\n   ```\n   \n   \n\n\n\n## Python Dev Build and Run\n\n### Build scanfs\n\n```bash\nmake scanfs\n```\n\n### Run python\n\n```bash\ncd src/python\nmkdir -p build/config\npoetry run python seedsync.py -c build/config --html ../angular/dist --scanfs build/scanfs\n```\n\n\n\n## Angular Dev Build and Run\n\n```bash\ncd src/angular\nnode_modules/@angular/cli/bin/ng build\nnode_modules/@angular/cli/bin/ng serve\n```\n\nDev build will be served at [http://localhost:4200](http://localhost:4200)\n\n\n\n## Documentation\n\n### Preview documentation in browser\n\n```bash\ncd src/python\npoetry run mkdocs serve\n```\n\nPreview will be served at  [http://localhost:8000](http://localhost:8000)\n\n### Deploy documentation\n\n```bash\npoetry run mkdocs gh-deploy\ngit push github gh-pages\n```\n\n\n\n# Setup dev environment\n\n## PyCharm\n1. Set project root to top-level `seedsync` directory\n\n2. Switch interpreter to virtualenv\n\n3. Mark src/python as 'Sources Root'\n\n4. Add run configuration\n\n   | Config      | Value                                                        |\n   | ----------- | ------------------------------------------------------------ |\n   | Name        | seedsync                                                     |\n   | Script path | seedsync.py                                                  |\n   | Parameters  | -c ./build/config --html ../angular/dist --scanfs ./build/scanfs |\n\n   \n\n# Run tests\n\n## Manual\n\n### Python Unit Tests\n\nCreate a new user account for python tests, and add the current user to its authorized keys.\nAlso add the test account to the current user group so it may access any files created by the current user.\nNote: the current user must have SSH keys already generated.\n\n```bash\nsudo adduser -q --disabled-password --disabled-login --gecos 'seedsynctest' seedsynctest\nsudo bash -c \"echo seedsynctest:seedsyncpass | chpasswd\"\nsudo -u seedsynctest mkdir /home/seedsynctest/.ssh\nsudo -u seedsynctest chmod 700 /home/seedsynctest/.ssh\ncat ~/.ssh/id_rsa.pub | sudo -u seedsynctest tee /home/seedsynctest/.ssh/authorized_keys\nsudo -u seedsynctest chmod 664 /home/seedsynctest/.ssh/authorized_keys\nsudo usermod -a -G $USER seedsynctest\n```\n\nRun from PyCharm\n\nOR\n\nRun from terminal\n\n```bash\ncd src/python\npoetry run pytest\n```\n\n### Angular Unit Tests\n\n```bash\ncd src/angular\nnode_modules/@angular/cli/bin/ng test\n```\n\n### E2E Tests\n\n[See here](../src/e2e/README.md)\n\n## Docker-based Test Suite\n\n```bash\n# Python tests\nmake run-tests-python\n\n# Angular tests\nmake run-tests-angular\n\n# E2E Tests\n# Docker image (arch=amd64,arm64,arm/v7)\nmake run-tests-e2e STAGING_VERSION=latest SEEDSYNC_ARCH=<arch code>\n# Debian package (os=ubu1604,ubu1804,ubu2004)\nmake run-tests-e2e SEEDSYNC_DEB=`readlink -f build/*.deb` SEEDSYNC_OS=<os code>\n```\n\nBy default images are pulled from `localhost:5000`. To test image from a registry other than the local, use `STAGING_REGISTRY=`.\nFor example:\n\n```bash\nmake run-tests-e2e STAGING_VERSION=latest SEEDSYNC_ARCH=arm64 STAGING_REGISTRY=ipsingh06\n```\n\n\n\n# Release\n\n## Continuous Integration\n\nThis method uses Github Action to post releases.\n\n1. Do all of these in one change\n   1. Version update in `src/angular/package.json`\n   2. Version update and changelog in `src/debian/changelog`.\n      Use command `LANG=C date -R` to get the date.\n   3. Update `src/e2e/tests/about.page.spec.ts`\n   4. Update Copyright date in `about-page.component.html`\n2. Tag the commit as vX.X.X\n3. Push tag to Github\n\n\n\n## Manual Method\n\nThis manual method is deprecated in favour of the Github Actions based CI.\n\n### Checklist\n\n1. Do all of these in one change\n    1. Version update in `src/angular/package.json`\n    2. Version update and changelog in `src/debian/changelog`.\n       Use command `LANG=C date -R` to get the date.\n    3. Update `src/e2e/tests/about.page.spec.ts`\n    4. Update Copyright date in `about-page.component.html`\n2. Tag the commit as vX.X.X\n3. Deploy documentation to github\n4. make clean && make\n5. Run all tests\n6. Upload deb file to github\n7. Tag and upload image to Dockerhub (see below)\n\n### Docker image upload to Dockerhub\n\n```bash\nmake docker-image-release RELEASE_VERSION=<version> RELEASE_REGISTRY=ipsingh06\nmake docker-image-release RELEASE_VERSION=latest RELEASE_REGISTRY=ipsingh06\n```\n\n\n\n# Development\n\n## Remote Server\n\nUse the following command to run the docker image for the remote server for development testing.\nThis is the same image used by the end-to-end tests.\n\n```bash\nmake run-remote-server\n```\n\nThe connection parameters for the remote server are:\n\n| Option         | Value                             |\n| -------------- | --------------------------------- |\n| Remote Address | localhost or host.docker.internal |\n| Remote Port    | 1234                              |\n| Username       | remoteuser                        |\n| Pass           | remotepass                        |\n| Remote Path    | /home/remoteuser/files            |\n\n\n\n## Run Docker Image\n\nUse the following command to run the docker image locally:\n\n```bash\ndocker run --rm -p 8800:8800 localhost:5000/seedsync:latest\n```\n\n"
  },
  {
    "path": "doc/assets/logo.ai",
    "content": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 32 0 R 58 0 R 84 0 R 110 0 R 136 0 R 162 0 R 188 0 R 214 0 R 240 0 R]/Order 241 0 R/RBGroups[]>>/OCGs[5 0 R 32 0 R 58 0 R 84 0 R 110 0 R 136 0 R 162 0 R 188 0 R 214 0 R 240 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 53343/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">Print</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\">\n         <xmp:MetadataDate>2017-12-20T16:27:36-08:00</xmp:MetadataDate>\n         <xmp:ModifyDate>2017-12-20T16:27:36-08:00</xmp:ModifyDate>\n         <xmp:CreateDate>2017-12-20T15:03:31-08:00</xmp:CreateDate>\n         <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>240</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FVC9v7GxgNxfXMVrANjNM6xoD/rMQMSUEgc2Faz+eP5a6XyU6qL2ZTT0rNHmr&#xA;8pABF/w+RMw4s9fhj/F8t2Gap/zlFo8bMNL0O4uRT4XuZUg3/wBVBP8AryPiOJPtaA+kEsWv/wDn&#xA;JvzpLyWz0+wtVPRmWWVx9JdV/wCFwcZcaXa0+gASG7/Pr80bgELqqwKRQiK3tx9xZGYffg4i0y7S&#xA;zHrXwSif81fzGnar+Yb0Gtf3cpjH3JxwWWs67Mf4kvn87+c5wBPr+oyhfs87udqV8KvjbV+Yyfzp&#xA;fMoN9e1x2LvqN0zHcsZpCT9JOBHjz/nH5qDX98zFmuZSxNSS7Ekn6caY+LLvLX129/5aJP8Ag2/r&#xA;jS+JLvKk7u7FnYsx6sxqfvOLEknmtxQ7FXYqr/Xbz/f8n/Bt/XGmfiS7yokkmp3J6nFg1ir3f8lf&#xA;yW9b6v5n8zQfuNpdM02Qfb7rNMp/Z7qp69Tt1nGNu70Gg/jn8A+gctdy7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq07qil3IVFBLMTQADqScVec+bfz68i6CXgtZm1i+Wo9GzoYgR/NOfg/4HlkDMODm7QxQ2uz5&#xA;PIPMv/ORHnrVS8emmLRrVqgCAepNQ9jLIDv7oq5AyLq8vamSX0+l5xqWrapqdwbnUrua8uD1lnka&#xA;Rt/dici4E8kpG5G0Jiwdiq+OKWQ0jRnPgoJP4YoJRUei6tJ9mzl+ZQr+umNsTkj3ohPK+uNv9WoP&#xA;d0H/ABtgtgc8e9WXyhrLdVjX5v8A0rjaPzEVRfJerEVMkA9izfwXHiR+ZivHknUqbzQ1+bf8048S&#xA;PzI7nf4J1H/f8P3t/wA048S/mR3Lh5Ivab3EYPsGP8MeJfzI7m/8EXn/AC0x/c2PEv5kdzv8EXn/&#xA;AC0x/c2PEv5kdzv8EXn/AC0x/c2PEv5kdyC1Py1dafbNcSzRsgYKFXlyJPzGILOGYSNJPhbntH5A&#xA;/ldY62z+Z9Zj9aytJvTsLRhVJZUALSOD9pUqKDoT16UM4xt2/ZukEvXL4PpDLXeuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KvNfPv56+VvLRls7EjV9XSqmCFqQxsP8Afku4qD+ytT40yBm4Oo18Me3OT5884/md&#xA;5w82yMuqXpSyJqmn29Y7de4qgNXI8XJOVk26PPrMmXmdu5imBxVSGCaZwkMbSOeioCx+4YoJA5pz&#xA;aeUNUmo03G3Q/wAxq33L/E4LaZaiI5JxbeS9OjoZ5JJ27jZFP0Cp/HBxNJ1EuiZwaLpMA/d2sdR0&#xA;LLyP3tU4LajkkeqMVVUBVAAHQDYYsG8VdirsVRFpY3V0xEKcgOrHYD6cabMeGU+QRUugajGvIKr+&#xA;ynf8aYabpaPIPNL2VlYqwKsNiDsRgcUiua3FXYq7FXYqxrzxKRbWsPZ3Zz/sBT/jbDFydMNyw/JO&#xA;Y+0Pyv0lNK/L7QbRRQmzjnkH/FlwPWf/AIaQ5dHk9bpYcOOI8mUZJvdirsVdirsVdirsVdirsVSr&#xA;zL5p0Ly1pj6jrN0ttbrsoO7yN/JGg3ZvlgJpryZYwFyNB81/mN+eev8Amcy2Gl89K0Q1BjRqTzL0&#xA;/euvQH+RdvEnKjK3Q6rtGU9o+mP2vMMi61EWdheXsnp20TSN3I6D5k7DFjKYjzZPp3kyFKPfyeo3&#xA;++kqF+lup/DI8Tiz1B6Mit7W3to/TgjWJPBQB9+BxzInmqYodirsVdirsVdiqpBE00yRJ9pyFH04&#xA;soRMiAGZW1vHbwrDGKKop8z4nJu+hARFBVwskHqGmW94nxDjKB8Mg6j5+IwENObBGY35sWu7Sa1m&#xA;MUooR0PYjxGQdNkxmBoqOLB2KuxVifnkn1bMdgrkfSVwxcvTcixbJOU+7NGjSPR7GNBREt4lUeAC&#xA;ADrl45PZx5IzCl2KuxV2KuxV2KuxV2KsH/Mr819D8lWhial5rUq1ttOQ0Ir0eY/sJ+J7dyIylTia&#xA;rVxxDfeXc+WPNXm7XvNOqPqWs3JnmO0UY2iiT+SNOir+vvU5US85nzyym5JOqszBVBLHYAbknA0s&#xA;l0jyhJJxm1AmNOogH2j/AKx7fr+WAlxcmo6BldvbwW8QigjWONeiqKDIuKSTzVMUOxV2KuxV2Kux&#xA;V2KuxVNfLsPO+MhG0Skj5nb+uGLmaKFzvuZNk3bOxV2Koa+sYbyExyCjDdHHVTgIasuITFFid3aT&#xA;WsxilFCOh7EeIyDpcmMwNFRxYOxViXnn++tP9V/1jDFy9NyLF8k5T7u0r/jl2f8Axgj/AOIDLxye&#xA;zHJFYUuxV2KuxV2KuxV2KvLfzc/Oe08qpJo+jlbnzE6jkxo0VqG7yeMlPsp9J8DCUnX6zXDF6RvL&#xA;7nzDfX97f3kt7ezvc3c7F5p5WLOzHuScqednMyNncusrG5vZxBboXc7nwA8Sewxa5SERZZvo3l61&#xA;05RI1JbrvKRsK9kHb55ElwcmUy9ybYGp2KuxV2KtgEmg3J6DFUbDouoyjkIuKnu5C/gd8aciGlyS&#xA;6NXOkX9uvN4+SDqy/FT50xpGTTTjuQgsWh2KuxVkHlmOkU8n8zBfuFf45KLs9BHYlO8k57sVdirs&#xA;VYB5t85QvdJaWKrLHA1ZpzvyPQqh8Pf/ADNZLr9VMS2W2l3DdQiWI1U9R3B8DgdcRSthQxTzyo5W&#xA;TdyJAfo44YuVpjzYrknLfc/luYz+XdLmLcjLZwOW8eUSmuXx5PZQNgJjhZOxV2KuxV2KuxV5F+c/&#xA;5yL5dSXy/oMgbXZFpc3I3FqrCu3jKQdv5euQlJ1uu13h+mP1fc+Z5ZZZpXlldpJZCWkkclmZiakk&#xA;nck5U88STuUXpWkXWpT+nEOMa/3kpHwqP6+2JLVkyCIZ7p2m2unwCG3Wnd3P2mPiTkLcCczI2UVi&#xA;xdirsVdirsVZHoGnokAupFrLJ9iv7K/25IB2ujwgDiPMpxknNdiqUapoaTAzWwCS9WToG/ociQ4W&#xA;o0glvHmxxlZWKsKMNiD1ByLqiKaxVk/l1eOn1/mdj+ofwyUXb6IVjTTJOW7FXYq8+85ecvW56bpr&#xA;/ud1uLhT9vxRD/L4nv8ALrAlws+foGE5FxETYX81nN6ke6nZ0PRhixlG2W2l1DdQrNEaqeo7g+Bx&#xA;aCKY/wCeErb2r+DsPvA/pkouRpuZYhknMfbP5f3AuPInl6YHkW0205EbfEIVDf8ADDL48nrtObxx&#xA;PkE/wtzsVdirsVdirzn85PzQj8n6QLOwYNr9+p+rLsRDH0MzD8EHc+wyEpU4Wt1YxR2+ovlGeeae&#xA;aSeeRpZpWLyyuSzMzGpZidyScqeZJJNlG6No0+p3HBTwhTeWXw9h7nAS1ZMgiGfWdnb2dutvbrxj&#xA;X7ye5J8ci6+UiTZVsUOxV2KuxV2Kr4ozJKka9XYKPmTTFMY2QGbIioiouyqAoHsNsm9ABQpdhS7F&#xA;XYqlWsaQLlTNCKXA6j+cf1yJDianTce4+pjRBBodiOoyLqGV6EKaXD78j/wxyQdzpP7sfjqj8k5L&#xA;sVefecvOXrc9N01/3O63Fwp+34oh/l8T3+XWBLhZ8/QMJyLiOxV2Ko3StQazuATvC+0q+3j9GLGU&#xA;bR3nQK+lQyLuBMtCOlCrZKK6f6mF5JzX2P8Ak9OZ/wAs9AckmluY9/8AiuRk/wCNcuhyer0ZvFH3&#xA;MxyTkuxV2KuxVKfNXmTT/LWgXmtX5/cWiFglaNI52SNfd2IGAmmvLkEImR5B8Y+ZfMWpeYtbutY1&#xA;KTndXT8iB9lFGyoo7Kq7DKXlM2U5JGRQ2madNqF2lvFtXd37Ko6k4C485iIt6HY2VvZWyW8C0RO/&#xA;cnuT7nIOulIk2VfFDsVdirsVdirsVRujx89SgHYEt/wIJxDfpReQMuyx3bsVdirsVdiqR67pXIG7&#xA;gHxDeVR3H8w/jkSHX6vT36h8Ufo3/HMg+R/WcIcnTf3YRuFvefecvOXrc9N01/3O63Fwp+34oh/l&#xA;8T3+XWBLhZ8/QMJyLiOxV2KuxV2KppqhaXynGzbmN1AJ8AxUfgcMUYvrYlk3MfW35CXHq/lbpK71&#xA;he5jJO9f9JkYfg1Muhyen7ON4Y/H73oWSc12KuxV2Kvmn/nIvzy2p6/H5atJK2OknldcTs90w6Ht&#xA;+6U8fmWyqZ3dD2pqLlwDkOfvePAEmg3J6DIOpegeXtJXT7Icx/pMtGmPh4L9GQJdflycR8k0xanY&#xA;q7FXYq7FXYq7FU08urXUCf5UY/iB/HDFzNCPX8GT5N2zsVdirsVdirsVWRRRwxiNBxQVoPCprgRG&#xA;IAoMB85ecvW56bpr/ud1uLhT9vxRD/L4nv8ALrElw8+foGE5FxHYq7FXYq7FUZY6ZdXbjgpWL9qU&#xA;jYD28cWMpAJv5gto4fLk0MY+GMJSvX+8WpwhjiPrDA8m576m/wCccJQ/5c8d/wB1ezoa+4Rtv+Cy&#xA;2HJ6Xsw/uR8XqWTc92KuxVJfOnmSHy15W1LWpaE2kJaFG6NM3wxL2+07AYJGg1ZsohAyPR8TXNzP&#xA;dXMtzcOZJ53aSaRtyzueTMfck5Q8jKRJspx5S036zf8A1iQVitqMPdz9n7uuAlx886Fd7OMi4LsV&#xA;dirsVdirsVdirsVTjy0B9blPf0/+Nhhi52g+o+5keTdo7FXYq7FXYq7FXn3nPzl63PTdNf8Ac/Zu&#xA;blT9vxRD/L4nv8usCXCz5+gYfbWz3EgjRlDn7IY0r8si4ZKOHlzUSP2B7Fv7MWPGF6+Wb3vJGPpY&#xA;/wAMUeIFVPK8n7dwB8lJ/iMUHIiI/LNoP7yV3+VFH6jig5EZBpGnQ7rCpPi/xfrxYmZRnTCxS7zG&#xA;obRLsH+UH7mBxDZi+oPO8m7F9Pf84zSM3kC8U9I9TmVfl6EDfxy2HJ6Lso3i+P6nrWTdk7FXYq8K&#xA;/wCcnvMpjtdK8txNQzMb66H+SlY4R8ixcn5DK5l1Ha2WoiHfu+fMrdE9E8vWP1PSoUIpJIPUk/1m&#xA;3/AUGQLrssrkmOLWirDT57yTjGKKPtuegxAbsOCWQ7J0vlqz4/FLIW7kcQPuoclwueNBDvKHuPLT&#xA;gE28ob/JcUP3jBwtU9Af4SlFxbT278JkKN2r0PyOBwp45RNEKWLB2KuxVOvLP9/P/qj9eGLsNBzL&#xA;Icm7J2KuxV2KuxV595y85etz03TX/c7rcXCn7fiiH+XxPf5dYEuFnz9AwnIuI3iqe6TrxHGC8bbo&#xA;kx/42/ri1Sh3J9hanYq7FXYq7FUv8w/8cW7/ANT+IxDZi+oPOsm7F9N/84x/8oFf/wDbVl/6h7fL&#xA;YcnoOyf7o/1v0B67k3aOxV2Kvj/86NcOr/mRrEgasNpILKEVrQW44PT5yBj9OUSO7zHaGTiyny2Y&#xA;npFp9b1K3gIqruOY/wAlfib8BgLr8kqiS9JyDrV8UTyyrGgq7kBR7nFMYmRoMxs7SO1t1hTt9o+J&#xA;7nJgO+xYxCNBXws3YqsmhimQxyoHQ9QcDGURIUWP6joEkVZbWskfUx/tD5eORIdbn0ZG8dwk+BwX&#xA;YqnXln+/n/1R+vDF2Gg5lkOTdk7FXYq7FXn3nLzl63PTdNf9zutxcKft+KIf5fE9/l1gS4WfP0DC&#xA;ci4jsVdirsVTjSNaMFILg1h6K/df7MWuULZICCKjcHocWl2FXYq7FUv8w/8AHFu/9T+IxDZi+oPO&#xA;sm7F9N/84x/8oFf/APbVl/6h7fLYcnoOyf7o/wBb9Aeu5N2jsVUL+8isrG5vZf7q2ieaT/VjUsfw&#xA;GAlBNC3wpd3Mt1dTXUx5TTu0sjeLOSxP3nKHjpS4iSeqeeSrfnqEs5FRDHQHwZz/AEBwScXUnamZ&#xA;5Fwk48t2we5ecjaIUX/Wb+zDFztDC5GXcyPJu0dirsVdirsVSrVNFjuaywUSfqR0DfP3yJDiajSi&#xA;e45sbkjeNyjqVddip6jIuplEg0U28tf71S/6n8Rhi5ug+o+5keTdo7FXYq8+85ecvW56bpr/ALnd&#xA;bi4U/b8UQ/y+J7/LrAlws+foGE5FxHYq7FXYq7FXYqnmg6qVZbSY/AdomPY/y/0xapx6sgwtTsVd&#xA;iqV+ZzTQrr5IPvdcIbMP1B59knYvqP8A5xti4fl5I1APVv5329kjXf8A4HLcfJ6TswfufiXquTdg&#xA;7FWJfmzftYflv5gnU0LWjQV/5iCIf+ZmRlycfVyrFI+T40yl5NmXkiHjZXE3d5Av0Itf+NsjJwtS&#xA;dwyPA47J/LsfGwLd3cn7tv4ZKLt9FGoe9NMk5bsVdirsVdirsVQOp6XFeJUfBOo+F/H2PtgIcfPp&#xA;xkHmlegxSQanJFKpVxGQR/slORDh6OJjkIPcyLJu0dirz7zl5y9bnpumv+53W4uFP2/FEP8AL4nv&#xA;8usCXCz5+gYTkXEdirsVdirsVdirsVb6bjFWZabcNcWMMzfaZaMfcGh/Vi40hRROFDsVSTzjJx0f&#xA;j/vyRV/W3/GuEN+n+pguSc59cfkNafV/yu0ljs1w1xMw273DqP8AhVGXQ5PT9nxrDH8dXoGSc12K&#xA;vNf+chrtoPyzu4gaC6uLeI+4Egl/5l5CfJwe0j+5Pw+98o5U8yz3ylHw0SJv9+M7f8MV/wCNciXA&#xA;zn1JxgaWXaOvHTYB/kk/eScmHd6YVjCNwt7sVdirsVdirsVdiqmYYzMs1P3igqG9j2wMeEXfVUws&#xA;nn3nLzl63PTdNf8Ac7rcXCn7fiiH+XxPf5dYEuFnz9AwnIuI7FXYq7FXYq7FXYq7FW+uwxVmlhAY&#xA;LOGI/aVRy+Z3P44uNI2VfCh2KsY88TUhtYf5mZyP9UAD/iWGLlaYcyxHJOW+1/y7079HeRNBtP2k&#xA;sYGf/XkQO/8AwzHLo8nrtPHhxxHkGQ5JudiryX/nJmRk8gWailJNThU/L0J2/wCNchPk63tU1i+P&#xA;63zDlTzr0Py4vHRLUf5JP3sTkC67L9RTLFrZnpwpYW//ABjQ/eBkw77D9A9yIwtjsVdirsVdirsV&#xA;dirXTFXnvnHzobgvp2mPS33W4uF/b8VQ/wAvie/y6wJcLPnvYMLyLiOxV2KuxV2KuxV2KuxVVgtr&#xA;iduMMbOfYbfScUEp7pegmGRZ7oguu6RjcA+JOLVKfcnWFrdirsVYN5wufV1f0wdoEVPpPxH/AIlk&#xA;g52nFRQWhaZLqut2GmRCsl9cRW6/OVwv8cLl4ocUxHvL7oREjRUQBUQBVUdABsBmQ9g3irsVeM/8&#xA;5Ps3+FNJWp4m/qR2qIXp+vK5ur7W/ux/W/QXzblbz70fQgBo9oB/vpT9++QLrsv1FHYtbNbMAWkA&#xA;HQRr/wARGTDv8X0j3K2Fm7FXYq7FXYq7FWiQBU9MVeeecvORui+naa/+jfZuLhf92eKqf5fE9/l1&#xA;gS4OfPewYZkXFdiqb6bb6Refu5FaK47ANs3+rWv3YsJEhMD5asD0eUfIr/FcWvxCtPlmzrtLIB7l&#xA;f6Yp8Qtf4ZtP9+yf8L/TFfEXDy1YA/blPtVf+acUeIVRPL+mr1Rm+bH+FMV8QoiPS9Pj+zbp82HL&#xA;/iVcUcRRQAUUAoB0AxYuwq7FXYq07qiM7GiqCWPgBirzK8uWubua4brK7NTwBOwybs4ihT0P/nH7&#xA;QTqn5i21y68oNKiku5K9OVPTj+nnIG+jJRG7s+zMfFlv+a+rsuejdirsVeM/85QA/wCFdIPb68f+&#xA;TL5XN1Xa392P636C+bcrdA9I0P8A45Fn/wAYl/VkC63L9RRuLBmtp/vLD/xjX9QyYd/j+ke5Wws3&#xA;Yq7FXYq7FWiQBU9MVeeecvORui+m6a/+jfZuLhf92eKqf5fE9/l1gS4OfPewYZkXFdirsVbBINRs&#xA;R0OKp/pGucuNvdtRuiSnv7N/XFqlDuTzC1OxV2KuxV2KuxV2KuxV2KpL5sv/AKtphiU0luTwH+r+&#xA;2fu2+nCG7BG5e5gmSc99Mf8AONflg2HlW61yZKTavNxhJG/1e3qoI/1pC/3DLIB6HsvDw4+L+c9g&#xA;yx2bsVdiryP/AJybVj5BsSBULqkJb2H1ecfxyE+TrO1R+6H9b9b5jyp556J5dIOi2hH8lPuJGQLr&#xA;sv1FMcWtmtp/vLD/AMY1/UMmHf4/pHuVsLN2KuxV2KtEgCp6Yq8885ecjdF9N01/9G+zcXC/7s8V&#xA;U/y+J7/LrAlwc+e9gwzIuK7FXYq7FXYq7FU+0TWTVbW5bbpFIf8AiJ/hi1Th1CfYWp2KuxV2KuxV&#xA;2KuxV2KvPfMOp/X9Rd0NYI/gh9wOrfSckA7DFDhCzy/ot5rmt2WkWYrc30ywoT0Xkd2Pso3Pthcn&#xA;FjM5CI6vtzRtKtNI0mz0uzXjbWUKQRDvxRQtT7nqffLwHroREQAOQRmFk7FXYq8s/wCckI+f5dBq&#xA;09O+gb5/C6/8bZDJydf2mP3J94fLWVPNvQfK7V0K29uY+52yBdfmHqKaYtTNLEk2VuT1MSV/4EZM&#xA;O+w/QPcFfC2OxV2KtEgCp6Yq8885ecjdF9N01/8ARvs3Fwv+7PFVP8vie/y6wJcHPnvYMMyLiuxV&#xA;2KuxV2KuxV2KuxVk2hambiP6vKazRj4SerL/AFGLTONbptha3Yq7FXYq7FXYqx/zZrItrc2ULfv5&#xA;h+8I/ZQ/xbCA5GDHZssKyTmvoH/nG3yI0UU/m++io0oa30oMP2K0lmFfE/AD/reOWQHV3nZenocZ&#xA;68nu+WO4dirsVdirz38/Lf1fyt1V60ML20lAK1/0mNP+Nq5GfJwu0R+5l8PvfJOUvMM78oPy0ZR/&#xA;JI4/Gv8AHIlwNR9SdYGlmWmmthb/APGNf1ZMO9wfQPcicLa7FWiQBU9MVeeecvORui+m6a/+jfZu&#xA;Lhf92eKqf5fE9/l1gS4OfPewYZkXFdirsVdirsVdirsVdirsVVbad7edJk+0hqPf2+nFBFs1ikWW&#xA;JJF+y6hh8iK4uMQuwq7FXYq7FUv1rWIdNtubUad6iGPxPifYYgNmPGZF59cTzXEzzTMXlkNWY+OT&#xA;dgBQpk/5beRL3zl5lh06MMljFSXUbkdI4QdwD/M/2V99+gOEC3L0mmOWddOr7GsbG0sLKCys4lgt&#xA;LZFighT7KogooH0Ze9TGIAoK+KXYq7FXYqw784oDP+WevoATS3Em3/Fciv3/ANXIz5ONrBeKXufH&#xA;GUvKM18lNXS5V7rMfuKrkZOFqR6mQYHHZfpJrpsB/wAmn3GmTDvNOf3YRmFuaJAFT0xV555y85G6&#xA;L6bpr/6N9m4uF/3Z4qp/l8T3+XWBLg5897BhmRcV2KuxV2KuxV2KuxV2KuxV2KuxVl+iljpcHLrQ&#xA;/dyNMXHnzRuFi7FXYql+s6zb6bb8n+OZv7qLuT4n2xAbMeMyLAr29uL24a4uG5O33AdgB4ZNz4xE&#xA;RQRPl/QNV1/V7fSdLhM95ctxRegAG7Mx7Ko3Jwt2LFLJLhjzfYP5e+RNN8meX49NtaSXL0kvrylG&#xA;mlp19lXoo7D3rlsY09Tp9OMUeEMmyTe7FXYq7FXYqkH5g263PkTzDCRyLabdlRWnxLCxX/hgMEuT&#xA;TqI3jkPIvibKHkWX+R3rb3SeDqfvB/pkZOHqeYZNgcZlmhtXS4fbkP8Ahjkw7rSH92EcSAKnphch&#xA;555y85G6L6bpr/6N9m4uF/3Z4qp/l8T3+XWBLg5897BhmRcV2KuxV2KuxV2KuxV2KuxV2KuxVfFF&#xA;JNKsUY5O5ooxQzW2hEEEcI6RqFr4074uOTZVMKHYqlOt+YLfTkMaUluyPhj7L7t/TEBtx4jL3MFu&#xA;bqe6naedy8r/AGmOTc6MQBQRmgeX9X1/VYdL0m3a5vJz8KLsAB1ZmOyqO5OFuxYpZJcMeb6z/LL8&#xA;stK8k6VwTjc6xcqPr9/Tr39OOu6xqfv6nsBbGNPTaXSxxRoc+pZpknKdirsVdirsVdiqW+ZovV8t&#xA;6tFxL+pZ3C8B1PKJhTbBLkxmNi+GcoeNZX5GP+9q1/32QP8AgsjJxNT0ZVgcVlHl9gdNFeisw3+/&#xA;+OSi7jRn92w7zl5yN0X03TX/ANG+zcXC/wC7PFVP8vie/wAuoJa8+e9gwzIuK7FXYq7FXYq7FXYq&#xA;7FXYq7FVaO0upP7uF2+Sk4oJRtv5f1CUjmoiXxY7/cK4sTMJ5p2k29kKr8cxFGkP6gO2LVKdo3Cx&#xA;cSACSaAdTirGdb82JHyt9OId+jXHVR/qePzwgOTiwdSxJ3d2LuSzMasxNSSfHJOWAnXlDydrvmzV&#xA;00zSIDJIaGaZtooU7vI3Yfie2EC3IwaeWWVRfWH5e/lxofkrTPq9mPXv5gPruoOKSSkb0AqeCDso&#xA;+mp3y2Maek02mjijQ597LMk5LsVdirsVdirsVdiqF1X/AI5d5/xgk/4gcB5IPJ8I5Q8YyjyN/fXf&#xA;+qn6zkZOLqeQZbgcRq8kvZtNbT4J/q8UjFpmC1ZgQBxrUUG2/jjbfDOYx4QkX+Fv+Xr/AIT/AJuw&#xA;MfEXDyuve5JPslP44r4jv8Lx/wDLQf8AgR/XFfEXf4Yg/wB/t9wxXxF3+GLT/fsn/C/0xR4i4eWr&#xA;Cv25T7VX/mnFHiFePLunDrzPzb+gxXxCvXQNLHWIn5s38DiviFUXRtMXpAPpJP6zijjKounWC9Le&#xA;P58Qf14o4irJFEn2EVfkAP1Yra7Ch2KuxVA6lrVhp6n15KyU+GFd3P0dvpxAZwxmXJhur+Yr3USU&#xA;r6Nt2hU9f9Y98kA5mPCI+9KsLczv8t/yk8wec51nANloiNSfUZB9qnVYVP22/Ad/DJCNubpdDLLv&#xA;yj+OT6l8reUtC8r6Wmm6PbCCEUMjneSV6U5yP+03+Yy0Cno8WKOMVEJxhbHYq7FXYq7FXYq7FXYq&#xA;l3mO4+reXtUuK09G0nkqdx8MTHt8sEuTGZoF8MZQ8ayryMu963h6YH/DZGTiak8mV4HFdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdiqXX3mHSrOoeYSSD/AHXH8TfhsPpONNkcUixrUfN9/cVS2H1aI/tD&#xA;dz/su30ZIByYacDnukTMzsWYlmO5YmpJwt6tYaffajdx2dhbyXV3MeMUEKl3Y+yjfFnCBkaAsveP&#xA;y5/5x1SMxan5yId9mj0iNqqD/wAXyL1/1V28T2ywQ73daXswDfJ8nusEEFvDHBBGsUEShIokAVFV&#xA;RQKqjYAZY7gBfirsVdirsVdirsVdirsVdirCPzo1uPSfy31hy3GW8j+pQr3Y3B4MP+RfI/RkZnZx&#xA;dbPhxS91fN8fZS8qzPyVBxsJpiP7ySg+SgfxJyMnC1J3ZFgcd2KuxV2KuxV2KuxV2KuxVbJLFGKy&#xA;OqDxYgfrxSAShJdc0iL7d3F8lYMfuWuNMhjkeiAn846RH/d+pMe3FaD/AIan6sNNg08krufO1021&#xA;tbpH/lOS5/Djh4W2OmHUpPd6zqd3UT3Dsh6oDxX/AIFaDDTdHHEcggsWarb21xczpBbRPNPIeMcU&#xA;al3YnsqipOKYxJNB6t5K/wCcdvM+rmO519/0NYH4vSID3TDw9PpH/szUfy5MQJdng7LnLefpH2vf&#xA;fKPkLyv5StfR0azWKRhxmu3+OeTv8ch3pXsKD2ywRAd1h08MYqIZBhbnYq7FXYq7FXYq7FXYq7FX&#xA;YqoX9/ZafZTXt7MlvaW6GSaaQ0VVHUk4olIAWXyh+b35oy+ddUSC0Uw6FYM31ONtnlc7GZx2qPsj&#xA;sPmcplK3m9drPFND6Q89yLgI621rVLaFYYJzHEteKgL3NT1GNMDjidyFX/Emt/8ALU33L/TBTHwY&#xA;9zv8Sa3/AMtTfcv9MaXwY9za+ZtcU1F0fpVD+tcaXwY9y7/FOu/8tX/CR/8ANONL4EO5Z/iTW/8A&#xA;lqb7l/pjS+DHud/iTW/+WpvuX+mNL4Me5Yde1k1/0uTf3pjSfCj3KZ1jVj1vJvokYfqOGk+HHuUX&#xA;vLuTZ55H/wBZmP6zinhCkSTueuLJrFXYquRHkcIil3Y0VVFST7AYpAJ5Mv0D8ovzD1sq1ro80EDA&#xA;H6xdj6snE9x6nFmH+qDhALlY9Dln0r3vT/LP/OMMKlZfMuqGQ9WtLAcV6d5pBX7kHzyYg7HF2SB9&#xA;Zv3PXfLfknyr5ai9PRdNhtGIo04HKZh/lSvyc/KuTEQHZ4sEMY9IpO8La7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXgX5uWn5t+cb1rCx0K5t/Lts/wC5h5xBp2XpLLR/+BXt88qlZdPrY58p4Yx9Hw3ecf8A&#xA;KmvzO/6sE/8AwcX/ADXkeEuv/k/N/N+53/KmvzO/6sE//Bxf8148JX+T83837nf8qa/M7/qwT/8A&#xA;Bxf8148JX+T83837nf8AKmvzO/6sE/8AwcX/ADXjwlf5Pzfzfud/ypr8zv8AqwT/APBxf8148JX+&#xA;T83837lkv5P/AJlxLyby/ckE0+Dg5+5WJxor+QzfzfuU1/Kb8yGYKPL13UmgqgA38STTGij8hm/m&#xA;q/8Aypr8zv8AqwT/APBxf8148JT/ACfm/m/c7/lTX5nf9WCf/g4v+a8eEr/J+b+b9yJX8ivzVZQw&#xA;0M0IqK3NoDv7GauHhKf5OzfzftH60VH/AM4+/me7UbT4YxTq1zDT/hWbHhLYOy8vkmFt/wA41/mD&#xA;NT1ZtPtxQE+pNITv2/dxPvh4CyHZWXvj+Pgm9p/zi7rrsPrmuWsK/tGGKSUjfsGMWPAW0dkHrL7E&#xA;/wBP/wCcXfL8bA6hrd3cL3EEccFdvF/Xw+G3R7Jh1JZRpf5CflnYbvpz3z7Ue6mkan+xQxp964eA&#xA;OTDs/DHozLSvLnl/SFA0vTbWxoKVt4UjJHuVAJ+nJAByoY4x5ABMcLN2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV//2Q==</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\">\n         <xmpMM:InstanceID>uuid:92c58e1a-0e41-446e-95bc-d00422909d30</xmpMM:InstanceID>\n         <xmpMM:DocumentID>xmp.did:57893048C9E5E7118238DD4578CC24E0</xmpMM:DocumentID>\n         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>xmp.iid:56893048C9E5E7118238DD4578CC24E0</stRef:instanceID>\n            <stRef:documentID>xmp.did:56893048C9E5E7118238DD4578CC24E0</stRef:documentID>\n            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>\n            <stRef:renditionClass>proof:pdf</stRef:renditionClass>\n         </xmpMM:DerivedFrom>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:55893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>\n                  <stEvt:when>2017-12-20T13:03:52-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:56893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>\n                  <stEvt:when>2017-12-20T15:03:24-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:57893048C9E5E7118238DD4578CC24E0</stEvt:instanceID>\n                  <stEvt:when>2017-12-20T15:03:32-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\">\n         <illustrator:Type>Document</illustrator:Type>\n         <illustrator:StartupProfile>Print</illustrator:StartupProfile>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\">\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>500.000000</stDim:w>\n            <stDim:h>500.000000</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n               <rdf:li>Black</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>100.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>14.999998</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>90.000004</xmpG:yellow>\n                           <xmpG:black>10.000002</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>90.000004</xmpG:magenta>\n                           <xmpG:yellow>84.999996</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>80.000001</xmpG:magenta>\n                           <xmpG:yellow>94.999999</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>50.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>35.000002</xmpG:magenta>\n                           <xmpG:yellow>84.999996</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>5.000001</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>90.000004</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>19.999999</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>50.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>75.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>84.999996</xmpG:cyan>\n                           <xmpG:magenta>10.000002</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>10.000002</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>90.000004</xmpG:cyan>\n                           <xmpG:magenta>30.000001</xmpG:magenta>\n                           <xmpG:yellow>94.999999</xmpG:yellow>\n                           <xmpG:black>30.000001</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>75.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>75.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>80.000001</xmpG:cyan>\n                           <xmpG:magenta>10.000002</xmpG:magenta>\n                           <xmpG:yellow>44.999999</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>69.999999</xmpG:cyan>\n                           <xmpG:magenta>14.999998</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>84.999996</xmpG:cyan>\n                           <xmpG:magenta>50.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>94.999999</xmpG:magenta>\n                           <xmpG:yellow>5.000001</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>25.000000</xmpG:yellow>\n                           <xmpG:black>25.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>75.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>50.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>35.000002</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>35.000002</xmpG:yellow>\n                           <xmpG:black>10.000002</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>10.000002</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>50.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>94.999999</xmpG:magenta>\n                           <xmpG:yellow>19.999999</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>25.000000</xmpG:cyan>\n                           <xmpG:magenta>25.000000</xmpG:magenta>\n                           <xmpG:yellow>39.999998</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>39.999998</xmpG:cyan>\n                           <xmpG:magenta>44.999999</xmpG:magenta>\n                           <xmpG:yellow>50.000000</xmpG:yellow>\n                           <xmpG:black>5.000001</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>50.000000</xmpG:cyan>\n                           <xmpG:magenta>50.000000</xmpG:magenta>\n                           <xmpG:yellow>60.000002</xmpG:yellow>\n                           <xmpG:black>25.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>55.000001</xmpG:cyan>\n                           <xmpG:magenta>60.000002</xmpG:magenta>\n                           <xmpG:yellow>64.999998</xmpG:yellow>\n                           <xmpG:black>39.999998</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>25.000000</xmpG:cyan>\n                           <xmpG:magenta>39.999998</xmpG:magenta>\n                           <xmpG:yellow>64.999998</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>30.000001</xmpG:cyan>\n                           <xmpG:magenta>50.000000</xmpG:magenta>\n                           <xmpG:yellow>75.000000</xmpG:yellow>\n                           <xmpG:black>10.000002</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>35.000002</xmpG:cyan>\n                           <xmpG:magenta>60.000002</xmpG:magenta>\n                           <xmpG:yellow>80.000001</xmpG:yellow>\n                           <xmpG:black>25.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>39.999998</xmpG:cyan>\n                           <xmpG:magenta>64.999998</xmpG:magenta>\n                           <xmpG:yellow>90.000004</xmpG:yellow>\n                           <xmpG:black>35.000002</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>39.999998</xmpG:cyan>\n                           <xmpG:magenta>69.999999</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>50.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>50.000000</xmpG:cyan>\n                           <xmpG:magenta>69.999999</xmpG:magenta>\n                           <xmpG:yellow>80.000001</xmpG:yellow>\n                           <xmpG:black>69.999999</xmpG:black>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Grays</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>100.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>89.999402</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>79.998797</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>69.999701</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>59.999102</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>50.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>39.999402</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>29.998803</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>19.999701</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>9.999102</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>0.000000</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>4.998803</xmpG:black>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Brights</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>100.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>75.000000</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>0.000000</xmpG:cyan>\n                           <xmpG:magenta>10.000002</xmpG:magenta>\n                           <xmpG:yellow>94.999999</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>84.999996</xmpG:cyan>\n                           <xmpG:magenta>10.000002</xmpG:magenta>\n                           <xmpG:yellow>100.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>100.000000</xmpG:cyan>\n                           <xmpG:magenta>90.000004</xmpG:magenta>\n                           <xmpG:yellow>0.000000</xmpG:yellow>\n                           <xmpG:black>0.000000</xmpG:black>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>\n                           <xmpG:mode>CMYK</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:cyan>60.000002</xmpG:cyan>\n                           <xmpG:magenta>90.000004</xmpG:magenta>\n                           <xmpG:yellow>0.003099</xmpG:yellow>\n                           <xmpG:black>0.003099</xmpG:black>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n         <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\r\nendstream\rendobj\r3 0 obj\r<</Count 1/Kids[7 0 R]/Type/Pages>>\rendobj\r7 0 obj\r<</ArtBox[47.9487 58.0 456.267 438.254]/BleedBox[0.0 0.0 500.0 500.0]/Contents 242 0 R/LastModified(D:20171220162736-07'00')/MediaBox[0.0 0.0 500.0 500.0]/Parent 3 0 R/PieceInfo<</Illustrator 243 0 R>>/Resources<</ColorSpace<</CS0 244 0 R>>/ExtGState<</GS0 245 0 R>>/Properties<</MC0 240 0 R>>>>/Thumb 246 0 R/TrimBox[0.0 0.0 500.0 500.0]/Type/Page>>\rendobj\r242 0 obj\r<</Filter/FlateDecode/Length 608>>stream\r\nHԔnT1\fy\n@\\q\fUAU\u0017<\b\"J ޞd3ʒE&|nn\u000fBo\u001e(=%*~|N{9\u000b\u001dIW#csz\"\u0019ݨ\r:>p\u001fS<f%>&XZ֬\u001e\u001e)m6.\u001a'Ke~i\u0005l#j\u0016<T\u001c1r$<\u0006r5 \u0007Jn\u0019|sqz.X\u0016}\b\u0010.GaXVv-e\u0012~NgWd\u0007\u0002\u000e919]\u0001ʵ\u0015\b֕]\u0005M=\rnHk!\n2Ӑ~HqM&+gcz\u0017YC\u0010\u0002_SrA&,(\r\u0003U/r1Vp \rT\u0018\u0000%$\u001f,9˴H\u0004hpV\u00166_/\u0001\u00017W\u0012\u0016\u0004+QA/A\u001a\u0005y]P\u0019\u0010\njD:6h\u001e&IS?\u0017jG+\u0017X\u0003!MѣX'Bj(W]H\u00053pH\u0011ɄN\u001cp}!޻#ŇW)X\u001cM\u001a\u0012UԢ\u0014|F*\u0018AQ4\u0014rPp\u0010.G'AЌS\u001ajn\b\u000f\u001fptzBĕ`q\u001ft\u000f\tK\u0004\u0018\u00005w-I\r\nendstream\rendobj\r246 0 obj\r<</BitsPerComponent 8/ColorSpace 247 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 62/Length 635/Width 62>>stream\r\n8;Z]!c#!S,%#$4i1_es`;b9^u_fiQW\"De/uCI;,_-!Dj87`di>5+_Rq5!S)bNhFCQ\n'Ms9mk'OM%n\\4]$N3daW@cAfrmA0/lE2T0\\5AK]b8^(0XN@_UD]l2GYOe^FKKrXTW\nP;kuG\\U5,ck4Z_aghB^K`TJIeK_i/=,J2*h(0M#QD2p+lE,26$TVZ;CE5gaUCPN.3\n9MBkg(63_2GgZXV+i\"8!QfD_^*m]YMDPYuUEQ(WM<CFjRW,(,9VO1S#1G'n-[n)gr\n;;[!%c4:LXgp6ni9Qa`H-C;rAGg;+BS#M7-\\0j-HNu;re=;`QMHVcM<T+O_Ue<<kE\n1[tW2,DP+>[IcD\\50$\\ESD%gSQc3Ir1OAHTCZorm*c%CqCO:K=M%lNZl8'd\\J[)q'\n5KR\\Z%q80'g\\u/Zl^1T`@s\\\"je^i7/Q'l7>:q$p8bY0NJ+4L&VV#;@AEaQ;fr$f5t\nF/A84mL=Ti41.Ks*OjF7[;R!J]@=4+VVf5\\RD!c%e1gfLnJUK3G1GF;`TKh\\h\\pH^\n9:o5XFhKegaDXd(f(JIFdb\"4cN4EL@gt?/NH?\\gRrT^kd(#=;LUTHHiR>8YMgPUIS\n3f*GX-6,3`q<W9GYPm\"BF<`su5N?[Amf<FZ<:`u~>\r\nendstream\rendobj\r247 0 obj\r[/Indexed/DeviceRGB 255 248 0 R]\rendobj\r248 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\r\nendstream\rendobj\r240 0 obj\r<</Intent 249 0 R/Name(Layer 1)/Type/OCG/Usage 250 0 R>>\rendobj\r249 0 obj\r[/View/Design]\rendobj\r250 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r245 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r244 0 obj\r[/ICCBased 251 0 R]\rendobj\r251 0 obj\r<</Filter/FlateDecode/Length 389757/N 4>>stream\r\nHuTK\u001btKKJI,t(݋\b\u00024\u0002K%ҹH4J#Ғ\u0012(H\n\bwqyy~3̙g<3\u0000\u0001\bY\u00059El\n\u0000@ ]!O-@\u0004\u0000\u0001\u0000\u0001\\+BVKK\r:\u0016\u000f\u001dO\u0001X~W\u0011Ca\u0018iHKL\u0012\u00000\u0007\u0012qY\u0018\u0005\t`5\u0000\u0014c\u0018\u000f\u0016\u0004k\u0003\n\u0000X]\u0000x=\u0005\u0001\u001c\f\u00068\u0011\t\u0010X\u0000Ŀ׽\u0016>.\u001f\u0010f\u0001#aP\u0010\u0016\u0017\u001dn\t\tD^{y8\u0006\t\u0002\u000b\b\bdp\u000b\u0018H\u0015\tst\u0005:Y\u0001\u0011\u0018׬\u0006c\u0000xc\r\u0000I\u0002V?S!\u0002:_\u0018\u0018\u001b\u001d9\u0002[YbQP~+rA\nShHht^\f\r'\u00180߅kYXY9\u0014Yqqpl'W\u0011\u0015\u0004z\u0017EE$%\u001d\u001fD>,^|t*K)%/`\u0014\\ҫ\u001a:&D\u000b\u001d[7dplD\u0006a5|mb4,yy{e\u00155\r3\u001b\u0011\u001c⚅,t+whl\u001e\u0019\u001d\u001b\u001fA\r\u0007\f\u0006\u0007\r\t\fm\u000bk\nx\u0015Y\u0016U\u0014\u0013\u001e\u0018\u0017\u0016H&\u0019%Ȥ\nqO'Mz3KT@v[NUnn^\\o]ab\u0010\u001aTrtlmE]e~U+jא\u001aZ:z\u0006aqi5};CS[\\_ۆw\u0003\u000eCa\u0011Q1;>L$Lz}4:%8M7\u0003l̎Χ/}XT^]X>\\Ym[n!ycskkƶʷ;v{p\u0017Is0Xݯ3s󝋒&$WWW*)\u000f!$$%!e$cHNOAKIMEq\u001a\u0001\u0006\f\b\u0014\u0015ƕ;KLw@\u001fYX;ؚ8^+Ds\u0015pfKO\u0014TCPp\bJ\u0014%\u0012\u000f\bD=++O\u0006%\u001b$\u0017*\u001f\u00108I\u001aZ\\Z^UK_wL\"dx]}\u0017\u0000\u0014\u0007\u0005>9=;s\u0005_G8/̹N!Gz[<=2\u0013|B}PQzlH0W\bc(Een|Pds\u0014::5&89yFT\"od䳔i/ZK^&g\u0004d:f\u0019gQ\u001f\u0015l\u0014\u0014\r\u0015kJХe\u0015J*+篍kj5U\u001b\u001a\u0015\u0014\u0015[ZU\u001eh0|em\u00176]B@`PpH\u000f\u0013\u001f?QM1Msψ*iϛ.Z\f[JYZ)X-]R޸Ѻپw?@?\u000f\u000f5 ǖ'vNg\u000e\u000b\nW3g\u0010\bLC\u0002#u!MMMEv\u0013Ams˔FVNA\u0014̝GLwA̬,llؿsݛ\u001cnͽ\u0017+\u0010!B²\"<b4\u0012$݇kRғedk\u0015*\u0015JY*/TS\u001e'<SV҈ԌЊЎԉЍЋЏ042\u001a?M4I~f\u0017s-,󡅰\"+uMm]}CcS\u0005\u0002Q\\RZsv\u0015\u001d\u0013\u000fG\u0006\u0007\u001a\u0007i\u0007H3GFFaGDƬč&$V'\u0015'g$F\u0005LG˰4͂djik\u0016h\u0015\u0014\u0017Cf%VNeA\u0015qYU\u0015ڪG^/\u001c\u0011Ճ\u001a\u001b\u001c[Z{Vڱ:;`=c}nK\f\u000e\u0006\rFv(ރ> 'R&k?3?4+:6o\u001cT\\ұڿ6VʝoF?L\u001bT;:>::>:;eqvx^sawݥʕ\u0016'\u0016\b_\u0000EFO\\DKL\u0016t\u0003AnFF)F|\u001eԭ6\\`@z?\u0006m+F;LwiA\u0000hy\u0015͖\u0001)Mgw~\u001f_\r@\u0017ZH_XA\u0004,\"F)%/*9a\u0014Z:Q,\\B^_AU񡒀2\n*'[j\u000b\u001ao5[uR1uh`fm$\u000f\u00111xJgBdrltlyyEe$\u0013feg-g#`dGbwj0T\u000eOC\u00049;\u0018 ܨݿxz6zx8\u001aIP\u0001=A!.a\u000fA\u0011x\u0011ۑ\u0000\u0003\bϊ}bG-\u0012ޒēx`G/\u0018\u0001Ԝq_O?0\"\u0015\b۬խЮ˯ǰı²µŶȷ͸ӹۺ\u0004\u0011 0@RfzƏǦȾ\f*GcЀџҿ\u0003'Lsٛ\u001aFs\u0002M6+1M\u0004Z:{\u0000\u0000\u0000T?~ò~i~L}~cbA~Da\u0005\u001fd\u001c~ty\u000f~W~O\u0014>~\\/~|~`\u000fC\u0000x\u001d}%\bH}\u001c1X}%z}K\u001e}\r{N}׋<_~7A~-\u001c\u0004ψ\u0011|\u0017|\u0017ǲ|+\u0014E|[s|z\u000e}\f^}wO@}-\u001a~ċ\t{Gu{Dz\u001b{]Ĭ{f\u0010{Zx|[]|ϕM?}R\u0019<}Ǝz]YzHħz|z={LNw{\\|=>|v\u0018\u0017|ېI8z/r\rz\u001b;bz'sMzd6zɬqv{D\u0010[{0>\f|;\u000f\u0017\u001c|\u0007\u001dyyaIy?yazYv\u0006zݮ[\u0006{^=c{Ф\u0016I{R\u0011*y߄yfUy`Vy\u0013yuKz\u0007Zi{\f<{z%\u0015zȎ\u0013~+~\u0000}͇\u0005}W0}3\u001a}HtЄ}Zk}=~\u0018z\u0001ɇ\b\u0000}!~\u0003Єd*s}Y\u000f\u0007<9\u0016w\u0003pSwu\u0010\u0019\u0014\u0013uVrU\u0017W؈|;,뇔\u0015{RsѲ;\u000e:8q)PCV\u001b\u001c:4.\u00148Ȅ\u00182\u0006񡂡?U\u0012p\u000bV\u0002u9S\f\u0013\u0015c\fbփ\u001d\u0003R\u0005.ՁNn\tU\u001f388\u0012\u001fA/ͬδz6߆өn1T\\e7݀tX\u0011T\u0003)$̯̕6;eC\u0003ʷˆ\timw3Sƀ\bV7M\n\\\u0010lGNػځNā\u0013a5t\u0014N\u0012zlߴS<H6\u0010\u0010*<a|kz|CV|\u0010Ǎ\u001a|\u0011|Ik|Ru}26'~\u0001\u00112F-\u0005B*ojQ^@5zI`\u0010\u0004ٳ\u0000$ĝ\"cߘ&Uij|PJˇv4vy\u0005\u000eVG\b.2{\u001e\u0013\u0017萾hS掼O[\u00133\u001d\u000e\u0014(J\u0015ьx&$Ԟs҉h\n~2gK>-N}o2ن\u001c\rN%է\u0000>w֣A}⇤\\fXMݘ2,\fKԐ3g\u0005°[}\n0\be6M\f_1\u000b?\f\u001e1ӣǾ\u0003I\u0016^\u0014I|B̯\u0004dܪwL\u0005e1$:\u000b\u0004rW]\r1S{z|diL\rg0\\\u000bU{[G{!{\tޔ`{&y\u0015E{xbie{Jr|/c5}~\n~\u001f:f#\u0001MKx+Ca|uI~.yW\tώ\bәߎ\u001c%¡唘[w!^T`^H*-\t5GȨ瘎=Π4rv\u0003_ҍRGf,ދ̋\b\u001f|,ƕ{\u000bҘtٕ^1Fő,;'\b<!_Yl~JJt\u0001S#]'FA4+;\u0007ۊLPf&ɔޝ\b\u000eըs@夏]\u00130\u0013E+:\u0012\u0014ևSS\t\u0002\u0006𧠨\u0007jVPp,\u0010<\u0014X\u0015Q)XV\u0005l(Js&\u0002J\u0002!\u0004K{@BE.\u000be\u0017WqQ䆓\u0003~37FHI^\\ӡ\u0018+j&Yb\u0016dML\u001e\u0018{#)FA;q\u0019T0_\r^\u00079IݤxֺƢYFh9ՅhX\u0016;Jln+jġ(m,ּJ(VaV\u0007/\u0016\u0017aؑ@Q~.8_]7]\u001dg|F)\u0002\f-/MH|P\u00138%\u0005oF\u0013xC<Rl\u000bA^\u001aQl\u001czrJAU\u0004U\u001b\u001f\u001ad*\u001dN$i܏\r#v\rb7\u0011F*4ނ\n\r\u000f\u0006pvix֖IoJ۱#\nW\u0016hԉl\"kx\u000bwVj\u0016GDz*ߜxW:ƩdP$\u0014\u0013\u0016j4WM[,]ʫ$W\u0010$I&N}7¨\rs1@9TɎ.Ez\u001fNDf\u001b\u0014*uwr \t\u000b*#\u0013\u0013,h؅\"8=N\r\u0019%=(p\u0002Qu9sLӓ\u0013(&wھ?ER\u0017\fAHi.R~\tԄ6:*tД3*۱x#m?r\u001b~3\u00192+wp6y\u0001\u0007X\u001eaTO#\nU¼<_)\u001eI(}W2SX\u0013 \u0011U\u0014\u0001w\rMf_T)\u0007?kYYF\u0014K8\u000eu;J$þ*1T\u0002\u0000>\u0013\u0004,#h%T,Qۥ{[s:9󅼓&^!Փa@!\"\u000by\u001f\u0000\n\u0011.Jl6mHju,b\u0011U6+s\u000bhܸd\u0016\u0016\u0016-ʥ}\u0006wi\u0000-\u0003\u0001su\u0010n\u0012=0Ľi-_*)U_ˈ\u001db$\u0011\u001cna+;ϧT\u001d;\u0003ppA7\u0013\u001a\u001b\u0016\u0005\u0019C\u00074\u001f.\u000f*Iߥa8M\u0012m\u0013.ACi7\u001f\\j|fi\b\u0006ԫ)]ޭj\u0007ʄU]3\u0010(í\u0016\fw\u0003hJ\u0018ch-\u00114x7h\u0016׿*\u001eP\u001c0H됎\u0019L랇ڡuÂ\u0004\u001f\u0002\u001a,{Bz}8v\u0014\u0015gg\u001cҲd[!XTZ\u001bZ.vlA\u0018\bg\u0001\n{;\u0011S\u001cm`vؿ`~?ga.\n3Ì{L^W\u0001\u0006\u0001Ye4]L<pq޴\u001ak!G\u001e]\u000bl\u0007\u0000v\u0001\b:D\u0019eH\u001a\u001fXqEK4kHoS|XֽO7\u0014o**+\u0000\u00102h`?k6ݤg,M{ST3`b\u00195\u0010XE#*\u0012\u0004і}\u001cz#C//\u000b7}V;9\u0013T\u0015\u0016\u001c)?ވ2[\u0001ُ]n$~\u001d\u0005\u0017\u0003fЌ,dp,\u0016BA\u001fdrH]`\u0019\u0011u\u0016\u0004\u0003PV\u0010kaEVvYNU5/yfD.ݡ\\ 1\u001fQa#KE:|N[k\u001f=&[],\u00061$ξB\u00070Y\u0019(ߊq\u001d\u0004$]\u0013!{Ik5\u001f\u0016U3j=Or)<V\rA\u001c8H\u0019:YjD!L_|OlxE{EY[9#Ev\u0003x2E\u0004as=[R\u0011\u0007Qi*i66`ώ,+#,i\u00061A2\u0000@\u0005\u0001ƪW\u0017\u0017mHXJNP+)\u0011̧+\u0003\u0019\u000e\u0012=l\u0004$z\u0010Ukb]i[:<\u0007旰A\u0010\u0001r)<\u0000\u0003+e.\n\u0019\u0017%ӂBsW\u0011ď[~}F.+\u0007}Wt= \nK\u0011e&\u0018,^\u0018-va(0\u0007\u0015\u000b\f\u0005\u000et\u0016\u0012tzSw0D6jtl.\\lVդ)\u0016-\u001cg\t[ѭ'\u0002x||DDߵvwi8ư=݋bY\nTC7jKIX7\u0000о\u0000s{W|}&饷MR\u001aQrs%5\u001cԯ1G\u001e*=V\u0001DM\u0000鶢l`JYKe\\\u001d+kl=ּ\u0000sr͌\n\u0014_L\u0002\u0000\\E܋ʮܤH)B\"\u0016nĕ)Jۙ3gYi&M{&MʹI\u0016B+!%,O=Y>7o\u001fk!wI~\u0000I\u0002ra^\u001c=C\u0002#\u0006Z\u001fh\u001b`Wu}p)\"z7ff&3\u0001\u0005$\u0002\u001dF\u0016J8Ҷ5\u0004m\n\u001cuR_,^VS&aR~Pf\u0007LL_Dw*`\\\u0015-9]q\u0011\u000b\u001c\f\u0017TI6)>u6\tD`e͢/x\u001fqY%\u000f9ʜ;åO\u001c\u001dd\\˾P&\u0015eRz;\u0002].R<\u0002oΡ]P\u0006{?:\fr̨\\ʻb\tҤ\u00113|m s؟W9oZt]Rn\u001cÅ\\cW#+n\u0005I\u0001&g\u0005\u0016yA\u000fjsN06\u0006HiD'@J+\u001da5V~\u001fcRI̫\u0002vwtUc[3+?F|l(iU\b\u0011^+O?Rs\u00001Hqil$Wþh=(RE\n\u00111Bvџ\u000en\u0003\u0005F/\rBsGMY9\b>ܖ3ȗqI\u0016\rڣ5V\u0015\u0014_\u00041ȣβiJiX0W\u0012V\u0013\u0015H[8g\u0000_/\nn3\f`\t38A.|f|ј\u000f\u00150I6\u0007bv\u001a%& ;Y㿜҄#\u0000dD.).p\u0005'\u00193J12K\u0012[Du\u0005ɥ$s8I<RimJ8}f \u001bDJ\u0016ƀ຃ws!ʫr\u0012\u001fRX\u001c-\\y^*̏Ld'雲9?)\r\u000b\"q^5/\u001b<\u0007\u00044i\n\u0018Q<\n;/ԱJB\"\u00147\u000ft͚,mXdھ^;촞&s`Y\"\u0015Y\u001d{\u001a>Ɗ.z^48e!R6}vc\u001aMioz\u0016\u0006o0\u001b'=~i,3:?-?o\u0015S,9w\u0006#ROa\u001e;\t\u000e?\u001dpB\n֞I\u0015O\u000bݟ\u0004e#}ԯN$\\\u001dl?\u001c],\u000b\u0011y,\u0001>&Р\u0010q]\u0018\u0017yh0A\u0007q\u001fK\u0012)ĝB\u000fFҍcH:-h-ǟc\u001af)K9T127]\u0018qEjL<>h\u0015;|U\n\u0016\u0001\u001f\u0005dpG\nƫ`&!\u00078a\u001el`83>\u0016.qɂn\u0016A9\n;\f`HByg\u000bKB*k㰗2f\u000e\u0017F=#OM\u001d eT?\nmTm\u0016\u001c_\u0017OBۊV\u001f\u0000<ɆF('n3\u0002u\bG~Ȯ#7Њ9\u001f[١`Ns.P..\u000f콤\f\u0019\u0005'K\u001fnp\u0014F\u001c\\?\rB>-`\u0012\u0003N\u0004WO\u0004OWB\u000elfxW^<x==Z/~4/.*gPʲ<\u0005*V-}&ٟw\u0004zWq=g?\u0010:;[\u001f-(\u0007Z6*<\u001bȈ\u0017`p\u0005?\u0017\u00192eQyў>b-_\u001c\u001dx&*\u0017/(\u0011j\u0002_\u0007=߆󑊢zF`\u0019LdE:\u0012SN\u001f\u0016ʔ@S 03|TOKokto\u0012}bF\b\u0013z$\u00114\u0011\u0004-,.\u0018m'j*J\u0006|)J\u001e6\bBP\f\u0006^3ewܫpX.*,07xPڳ:2X\u001eOT21|\"7=<J}|wl\\}\u0016vGic\u0019QS\u0017]<Cjȹ\u0015*\t@8-f\u0013݂={ñ(\r]\bxѨ\u0019n?ϑ]qOˏExyU\u0006\u0018\u0019c0tM]u3\u0014\u000b\u0019j o)(Co~2sЃ\blx\u0007֙\u001d\u001f\r{L\u00037\u0015z<\"\b!s[\u0001Ha\u0019*{1l\u00161,V&I*[v$#1/\u00005Z\u0010p(3\u0014]8\u0004i2\u0001|(2\u001d| zD\u00005 Ns֬\u0016\u0013\u0011viV`D0Û]\u0002\u0017R\u0016)L!\u0019'n\" <v~\u0010x)~if\nwnKܑQVB\"\u001fԽ\u0006p *+ت\u0016ED* \u0017(\u0016\u0005\u0019o\t\u0010B'{pwH؆ʴ*JѪmA-nWj\u0015GE\u0003ޯy~~?rI^\u001cWO\u001d@l)ƶWgiX\u001c\"C#k\u0014nA\f˻r)b!UڲIb=>0ߴy}ĸB)\u001bH\u000f[\u0011F\u0002s\u0006\f\u0014V+\u0019̯+Y(I(x&9JAI'tXmy\u001bG=X[8TK)2\u001d<\u001cTSR\u0019vx\u000flȓGO|g/{>\u000e\u0001\u001c4/gRFȶ&A52\fuЯ*B<i\u0016\u00000gr+O\u0017A,0-bug[\u0019\\~-\u00194:I>幃\u0016AuFǞѧuD)B,\u001e*\u0014?n`\u001e\t'qQIzK֗\b4{\u001cB_g68#ʉ2.A$\u001669!̒\u0019ub1&D3Qx\"\u000b>ɏn\u0011νxVG&TۨÓ)sxd-5KxߣD&1±\u001d\u001ejd\u001a\u0003GjJ\u0015|J\u0003\u001b{Z\u000b޲f6/vTp̄ub\u001e\rPmBU#gBg˷)\u0015-*\u0012\u0016E\n\u0002ar\u001b>>Ƶrn[ɭF\u0000-IByѸP=ĶKUC\rw\u0003\u0007G\u000bD}\u000f\"vN.p]\b]Q8u\u0019Y{#qC\u0006v}sa\u001fx_\u0015oyiNr\u0003\u0015(\rd8a\u0013w2CQ}V8UWO\u0013\\g\u0017\u000b\\\u0011\u0001yk@\u0015\u0018d\u0005cZt9$\u0006u\np\u0002-1\u001dz(=f)\n\u001av\u001e\u0019ě\u00169\u00042\u001d w\u001a\tu煼\u000fת#\u0001\u0010{P6+\u000fDq3HIi\u001a%B\u001fC\u001cb!kc\b5&U\t\u0004):X$܎\u0019[\u0002b2\u001d*@PkcӘdoT\u001aB_L1Uwi\"\u001f\u000e\u0005)\u0013=2#pI\u00179,RO>T@>\b;bn\u0004\u001aD\u001dPuC\u0005\u0003\u001cfk\u0005\b^^\u0013\u0003\u0017\\\u0012G~\r o\u0019LRcHqܮ=-8^5Ońy*9:-\\\u0017g8:T<\u0013?*\u0002C;[y\u001bX\u0017+\u0014I;lRL߭$\b\u001fDv\bYTQ6DyVmfy%\u0006/sIsmXP1Lռȭvo\u0016w)Q\u0005Bb_\u0003\u0000L\u0002VwupeėO*\u0014\u0016|+](uHװ4WU\u000f\u0015.{ \u0007\u00044\u000e\\m.Qw\u001dR~MAiRz+%BKz?\u0005'{\u0000\u0000\u0001\u0013\u000bk҉\u001daa\u0001{\u000fH]\u0012sX}da~3\u0006_au\u0013\u0019Q\u0007z\t\u001eVM\u0013\\ĵv5I0LM)Ǆp\u00071:5\u001d,\b&4\f%!$\u0017\u001d}ocޤA]R^xT◬M&/B:Dw\u0005A\u001824?cd&g]5b4a?i\u0016ǐ  Ĉ\u0004.OA\r6v\u0013f\u0016v\u001esd(\u000e5yT\u0013\u0004H\u001b/P=(a;zUs\u000bbWxDa)Eʼ\u0013\t\u001f$\u0017s\u0004gPJ\u001freY3\u0000w`cFo0|U[j5k\u0005.5J&\u0007eTor\t\u0014È´}I\tlpjC\u00058c5J=g%Uo|L58\u0004E\"\nِ\u001d[A\u001ek]J͆VBM\"{Nr\u0001Q\u0003\u0005ih\u001b\u0000Ц@Y?6^߫ZWٯ]ذc؋hKSǈ\u0017:>O\rɲ.ݰ\u0012\u0004Q\u000e{5mm<ٷ\u0010?^v\"\u0011}ъw9O&vX7\u0016km[\t\u0005,7\b0n\u000fΒ\u001f7\u0016|\u0017eP\\I;\u000f<u^\u0010\u001b\u001f`u\u0015!$PB\nET9\u0003\u000fٲFWc\u000f\u0019m$=\"G\n}Ke6~֔G_MDԿ\u0011s` \u001fg]\u0001\u0017\u001cvp-9\\\u001aNd{::gvH_3fC;}Ɠ\f\u0003\u0000P\u0000N\u0002pH\u001edU9u;9\u001b$8\u0010w\u000b3r#\u001fA\u0018FiD1n\u001b\u0016\u001e-}\u000ft\u000fe\u0000\u0000\u0010DH!5$\u001e,IQ:ȖR13<\u00187\u0019\u0018\fj1[ЊT\u000emWwzUx|\u000fվ+ք{W>p:ʤJRqY^`ǯ<~j!mr.B+'OyY+fN*żt\rW$W\\2\u0000M_c[gjj%WuU{{,_pWn%}PI^W|\u0003n;c!p\u0015u\u0017cʨN!k#)ksd5n6Q{\u0010H10U\r\n\u001c\u001e-\"{⠇TZG R,ɇ\u001ajࣶ\u0001Zw8j\tICF:b\f[\t\u001e\u0017\\+?\noA\rn'a\n\n\u0003\u0016Oj\u00030\u0016`%\u0005|^/si_XǣLqiw]IέD\"J\u001b!y!Զn0R\u0015\tzW\u0011CcchūK_R\r[*)!\rOSou\u0013Oշ܌\u0004WzeWC\u0005aϝ\u000eL/QBo_k/cg&\u0019MV?֫5z !g\u0007\u0014\"?w\u0005P͚IQ\"\u0005PA\u0001d\u0017tE)q4jGsn{\"\u000b}eUMrkzvi89C}\u001dXLB1\u0016W\".ꕝ^M\ft?WKLwDP]tU\u001e\u0014揊1rJոK\u001bVGM;phշm v>\u001a-w\u0001gFN\u0019\f\u0001cI\u0010P#\u0019qWI\u000b\u0017;\u0016NٶA)\b\u0010H~\u0002\u00067i \u000fth\u0004l~\u0004~ǳY\rCx2>*c\u0019&mb{9f\u00051\u000fX*L\u0005\t#>\u001c\u000e\n\r\b\u0007V\u000e@g\u0017蒼]7n249=MK%\r;\u0007,F\\j\u000b1k\u0011l\u0014Zi\u000e؊\u0012ΐ.|Q9а$_.!\u001c\u0017\u000e;\u0001̿lE,ɥDi\u0006\u0015}D\u001e3^a\u001c`Y\u00145\u001dg{J=\u000emɳy3C\u0005M\u0004'jM\u001f-iЦm\u000b\u0019n5?\t\u0019SJE\u0006+U~ \u0004;q.tXd~\u0010~p*QeS%.Ћ\u001a\u0004\"ưB\u0005sZ6-\u00166[\\d;^z4`;64藸\u0015ͱw\u001d;\u0010|+&AfLU3\u0005XTm)l\u0005F'l\rV\u0003ɺgcGObbɜ9;v\u000b\\C\u000fL,\u000b>B?KGC\u0011\u0011e\"z\f-@E\u0017\u000eH</s=/\u0003ᑍY{P\u0001w\\L1A\f|U{\u0010\u000f_\u0000\u0013\"҉w+Gm\r$#no\u0007x\u0002N\u0002+\u0006}M\u00199MbΥ_@Tܲ'1 ,q\u0014$;!헁h\u00061k\u0016b\u0014\u001dBo\n\\wJ\u001c\u0011uY/\u000e|ϕd<wΤc~\u0004\u0010ώ\u000e\u001dx¡#dg3~g \u001fxT2ȵ\u00116s3i75ƻZE\u0013\\1\u0003\\ɺ\u0004WA' ײ\u001d M\t}?\u0001;ʂ8|R0S#❣\u0000Cۿ\u0001Ub\u00050L\u00037ֽ\u0002\u0005`\u0015\u0001hcEk\u0014T\\\u0016m\u001e+\t6&\u001f=\u0002\u000f\u0007B9)\u0000곌\u0011\u001f\r\\@^\u000bjkaƚPh<=T6K^MK͋=݊$\u0006Q\u000e-U\u0014&>ILp<5\u0011'҉\u0010$>8#gL2m\t\u001ec\b\u00181\rc\u000b\u000fFw)P\u0001+rkC\rqp/u8#!*\u001cg\u001d°Pa`vu@oH`\"Ž\u0005:z\u001d_Q<,D>'Ӆ\u0006\bWP .`x\u0016W\u00013\u0016|!6\t\n5\u000f\u000bEl\u0001[\",0\te[Oz0\u0003~lU\u0017O\u001a+\u0004&xk\u0013P\u0014c|u$k.?\u000e{Qp\"\"\u0014kr6isV\u001aa=~@W\b_\n.<7\n\u00122#h?c~m'rE_xs6\u0014\u001aaG+\u001bK\u000b14\u0011\u0019L^kUp\u0003^^_\u0000\u0005mS^dШ'>\u0010}5\u000f$:τ!\u001eE\u0013\u0018[bJx&n t(\bm;ZsF5uq\u0000X.ՂBq\u0007K\u0015P\u0004 *\b\u0003l%{ٓ{'f';,\u001aTT,bh\u001dUq\u00192Z\u001d3;}\u001fT9vwRR;G\u001eD\n\fK*/@hUv\u0006$j!\u001c@\rvyבm,W|-͢\t^\r~D_􆭍\"ĉ\u000e\u0006#c禘*X/Ϝe>|XH;:)d9gƖ\u00134aB\u0002\u001cQ4\u0000\u001cE\u0000w,C\nۯB\u0017U#>SV$L-\u0012\u00125g\u000fV\tϯ*\u0013B#}\u000bnpþtd\u0007U$Db&$^\\^&Z\"/˺+-}%Z\u001d\u0016:}\u00169AYu\trTlP0\"~!\t͚*@5K?߫Z-P\u0019=\u001a\u001cj>܈[\u0003O?)a5\u0017\n\u0018?WUsy5^(ge\u001a${Cm>\t\"\u0014Gգ+$踿ϫ\u001b&\rXw\u0012\u001c8?\u0006g,'ō=\u0003\"/xNM)'\u0019EFqrf\u001b\rCįQ9ZY$r!6m<YZС.<V^z\u0012{US=\u001cP\nkX\u001b%3xfjn%\u0015\u0010^\u001ei𴵻\bs\u0019\u001530qh$\u0013`kܯ\u001c\u000e\u0001\u0019D&\u0000!M1\u0010W}훌1r=2NSdkb\f\\ŀpd\u0016W}^'S^\u0014}+P0iC\f\u00111R 0hDz[P\u0000\u0002&!\u001av@B]P]V< SܒGLO\u001eNgK]\u0010+&\f-A\n2\u0010#\u0001s\u0019L4j\b&D\u000eib&,AMS\u000fUD9y\u001f\n\u0015v\u001598jc\u00067MI~(sL#}3\u0018(\u0015M^\u0000Ni\u0003\u0007EKE\u0004\u00038\u001bmi\tuzI$Nr|}*+'4\u0006w{y%F $\u00118\u001c\u0013@Nz^G.g-1Vfk)\u0011G]u6K\"\u0003K1\u0007pΛ\u0007P8r>)4\rV\u00069kJ$#\u000b\u0003FьX٥C\u0013p[\bģ)CS;rFP#ImKG<h/\u0003U-,C\u001cO\u000bkOKYY;\u0013MH-t%^NξB7\"\nO\u0003ajX_\u000184V(N-{D)F0$\u0013!o\u0005Jdv/_\u001d(ǀUH8B\u0000c1fb5u&*ҽn2\bsG4\f0:\\=Y2߯\t$bi\u00038亵M$ҙ:utN\u0017)EhDhd\u0019j21|*TV˰\u0019T5Ȯ\u0010M7-^\u0004S8\u00044Te\u0001hRҨj\u0004[UG\u0004U1\u000e\u0001K{Nh6vg֨+\u000fG\u0010?`\rlݔ$Rq-.ަ\u00182Se8\u001cp\u000fSՖ\u0002k!XC\\z00\tnlhj<~I\u0011\u0015\u0014,KrL)\bIM\u000e9M\f_c+\"vҜݤL\u0004$>ɺ\u0012zj>>X9,ZL-jIbkȉ8˚?vt\u001fx\u0013PIO}_ay@\u001d:\u0007\u0007|Ve6\u0001ub\u0007d/e3<֭z\u0002t\u001b\u001aea'c\u0004LaM\nlz&,f^_!?l2x\u001f2Xy\u001c\u0002ń3D\u0016\u0013\u001d)\\\u001a\u0000\u0007\u001a\u001b?ye\f\u0019~4O+\u00009\u001b$\r\u0012\nEVD<O0Vbj&mLB2Z܈b9U;n6L0\t\u0014+oˇCr\u0004E.~>T\u001eSؓ7X\u0019?MM!ԼuOt\u000e\u0017P\u001f\u000e\u000bCbt;i\u0014\u0017ްa@gW\u0013#@\u00024c9.\u000eD\u0005o\u000bz2>M\u00175i\u001b~\u0015u0\fq\u001bs\u001dwQ9ǸLt삟Mz)>\u0019\u000fkɝI;\u000fio\"\u000e\u000eU\u0000)]$Y\u0018L\r>\u001e$$T:gUo$UK,C`sCMAJMÄKC(g]\u0014ٮ9sU\u000fG0?L5\u001dQM%0O\u000fl\u00115&\u0012`Ƒ\u001d1,\u0017x'{k+mY}\u0018-Js#\\d:i/N\u000fK\u0000\u0000\\8HstQ#-ND).s*Zymnf\u0019\\1l{(E=VGW9s:?wǟQZsC6A1ƃ6K\u0011@8OU\u0005Y^`7\u0015j6@9?,y\u001ct4&}\"T-\n\\Y&kVx녣391ٵqQ=beMq\\\u001e\b\u0012\u0004`/nņ|2͌JkzDmͫIR4\\~5NlօKɁZ]TC3l̅D3jSS)tWw$IX[\u0010wV\nWT\u0003U\u0015w^PeUhWE^ؓ~\u000fWchs\u000b\u0002s\u0005I\u0006g`wgs\u000e\u000e\r(5\u0006\u0000\u0019m\u0003r\u001d\u0018]\f\u000bB`7JfA\u001e\u001e\u0001aA3Ɠ\u0019G?{O[\u000b?xj/Z*7ex\u0010X\u000ez\rΆ\u0019})C?`KcM\u0010Ռ\u0014&)\u0002Y5\u001f\u0019\u0005J]q':]$؞]Yv\fx(ıH1eU>_0b?*񸨎\u001fb\u001d¤،\u001dD;Wxm]|N7U13*;\u0006.=>SÜj\u001c)CM>.eI1/QvН6T\u001ckk\u001e+Ɯn\\\\F\u001bFV#Xd\u001de&~WE\u0005\u00197\"bj\u001d\u0011u\u0018^I@j@bQ\fW\u0016\u001bk8w_D\u000b^z\rxZKA\f_`\bT}\u0014]\nx}ЁM0S\u0007,rV+\tKO&ƈ`;\u0018E{irf0\u001f\u0000F] w86f\u001e\f\u001bfm_8c\u000f3V<\u0005)\u0016r1p +hs|\u0001p\u0016\u001e\u0000\u001f!QP'Ղ\u001e\u000eʛ\b2r\u0015Ӥej4Y\rr\u001b\u0014,\rr?\u00044\u001e\u0006! U\u001fq]f(*&umM\u000f+\u001c;1\n-\u0012c8C\u001ajL\u0019=L1T\u0003DJ\u00037>)BH*cHY}~\u0012xI,{\u0005\u00177WjW\u0006ާʇhg_YovMKiN\u0011>\u001a\fQ\u0013Rǧ}\u0015AQj^\u0005G\u000bsyJ\u001aG\"?txt,L>֍p_>P\u0004o$^<%}KD\u000f\u0006S4\n\u0014*S<ܖyd;éIJ~JMn>ȸc\u0019I6uɖژ䩊i77_5W2'\t9\u001ct^}/8%wd\u00000k)ͦF9\u001e\u0007k\u0016ih3Sh\u001dPBULz\u0005s\u0011\u000e'0$Y/L\u00183o\u0015\b\u001c\u001bl|f\u000b\u0018ɪ\\AW#si\bS-O^I\u0011+3\u0002\u001f6xas \u001b@M\u000e\n\u0012A\u0015\fhm\u001345\u0000V-\u0013'\u0018\fѵ1\u0000S+\f\f~*\u000f\u001c%\u0014~k\u0000\u0005˝ʉl\r*\nlك=3_2~OgPs\nCcd[aے{\u0012<Х\u0016\u0005jA\t{! ߲ۓ\u001e;O'9+\u0019wEH\u001fE&\u0019JV?fiӺ j\u000205\u001d瀶bhW\u001aZxo=ƺ\f0z\u000fhK5m\u0013o\u000e\u0014v\u001a\u000b(YOut;e=\u0016R*\u0017\u0006\u001d\u0012yMVn,$v:QڳE.\u0017yVl;\u0005\bsvn\u0005,\u0005Wi\u0005.[\u000e@\u000f\u001434SD_!MF>J柣ND @$Y\u0007\u000f~-\u0003C\u0003Mu\u000b\u0011\u0019(+lBpБ\u0003^\u0012#$~\u00172\u0012è\r/@\u0018̣6 3\u0007\u0007\u0005nh\n;۪.\u00153Fq3\u000f\\َvZnZ\"/vNFNJ2V{#ΚVse\u000e_쑮Ta8C¢!Η>FL\\\u001eM{\u0006\u00075\u0018eH~7;F\t\tA\u0002\u001fB?VY=۩Q i9J.sӿc%FVb\u0017\u0017d\u0011եiL`a)kD\u0015=W\u000e\u0017\u001d\u001d \\ne>NX7Ƒ2I\u000eY\u0002\u001e\u001af-to7/~Uas\u0004[`W*\u001ev3_`~:k\u0000\u001ejR(\"\u0002\u0002E\n*\n\u0002\u0005\u0005e\u0011)DDI\u0012\u0012\u0002ss,f_n6\b\u0001\":hmh+]AqñQqSa9{~8|\u000f~bh6G\u0018\u001bZĠםN\\h+(E3\u00070~k\u001eTMGβ1:zka'LG\u00152>\u0016,\u0000gt\f\u0010X&@?e\u001f%\n\u0012=@Ihs\u001c)\u0014H\u0011\u0006\u001dUOeX^m7R7~,,\u000b\\j\u0014\u0014\u0006JԌf\u0012ͬ\u001c\u00168!*]JR:WR]Mɚ\fPZ\u000e;J\u0018N\u0011.8ɦ\u0010,[r*\u0013Α]\u0015MM\"waX)L\u0014bjd\u0002`>:?|:?u\u001f\u0007>^G\u0001$\u0002fa.\n\u001eʥ\u0010_\u0004S%\u0013ED8\fJ=\u0002ĕK\u0003{\u0012\u001c\u00146r\fz\u0007\u0003GG \u000bUi<\u0016Kg\u0006\u001c\"^ q\n\u001a\u0017I6\u0013vPWy^,\u001a\u0001\u0006uc/\u00005\u0001\u0019@:ǹ+\u001d[N+li{\u001fP#^\u001dy\u0002v\u0002,ñ\u0007-N\u001fѳH\u0004⺣\u0005\u0005<֡gxV\u0002<\u001c/\u001enb\u001d6󴳜Ρ\u000b +nhB˾PoT\u000e(W##ĉTwZU\u001d}\u000b w-vT\u0019\u001a-9O᭺HIz) z9R'dI5aZG\u0004S˟a\u0003gW=.P\u00161ٜ y?\u00022\u001eX)r4Va\u0014GX\u0017\u0001\u0018Be`9Q1͚@85\u001e\u001f$W?D\u0006}z2*\u0004\n\u0018\u001ept\f+;Br\\ܕ'>\u000b-v\u001c\u0011CNeʔ\u0019L-ʌqKHr\u000b7\u0015I\u0015\rd<\u0012\u0014B\u001dgNelB^փR\bγF2Aq\u0002CR&t7߄{\"\u000bD9\u0015u)\u0010C\u0003w1t}\u0010?\"'\u0013\u0012[7o\u0012̩~\u00171{\u0015>Ru*\fʖ\bdClutqf2[\u0005l~{S4>J$.\u0013nQnlP#\u0000x])By`r+wLH?VD:|iUG~ժ+\u0015&+R\u000fb gP>}W\u0013Թ\u001bkQǖ]WSk\u0018\u001eqwZ\n\u0012D\u001fQ\u0019dVd2\u00124KGMvU\u001e35KJ~4\u0000&\u0000jwJ*y;X߉˔O\u0015@5\u001ahw)񘴕o-9E:\u0017_\u001d̂o&\u00156\u0011#V(ѽS-te\u0007$\u000bפp}4%4mr\u0013nzhe4KX*KÃ\u001329ʩ~'Ǥl|O\u00045\u0012ÍB\n;^j㛑Q`exH;\u0001J\\*`l\u0013˴Khk\n&tF|(8\u0012V\u0006ǡܷ\u001dR\u0004\u0019\u0012:ϳoG*UjSKk\u0001nR\u001dgl\fޅ-\u001d6\u0007&Nŗ7O\u0010\u001e\u00174\u0006rGmO[du_TvY\u0010{\u000b̏Iy\\aRKy&P7ݪJ)l\"W5{K \u0012S_\u0014j\u0000\u00160WSW;\u0015wixF1^\u0012lО伴^'\u001c1b%OA\u0001\u0002Xhq)L7j}=9PX=n`ɗKX#CùA\r\u0006*7\u0017{ jWܴTBy\u0010\u0002\u001f\u0017ufכd=Af]\u0016F=_u*`q+\u0016_i݋\\^`BaE|S&%\u001d\u000fZ\u000b\u0015a\u00078\u001b+QgQ[IK-jIKr\u00182Tcju=A\u000b\u0001ʧQ\u0017\"7{ٮ\u0017ם*X|,\u0015Y\u0019\u0015\u001dz\u001dѽ\u001a}ƈf:\u0015jCo[>]x^h\u0001lhNrϳED\u000fkc\u0005\u001aCǪ\rת9c\tH\u001c\u0001\u000ft<)}z\u0012!hE~DBӳ2S͆i\u0012{;ouIp\u0018??砃46ٺ^\"\u001b1R<-65sj\u0012pCSjqi6ǳھİ紈\b\u000b41.\u0002$5E\u001dG9:\u001c=ob쾄\u000bv#\u0015[xﯦ\u000e\u0005\u0000AF\u0002+T\u000e\b\u001e\u0007\u0013(C@RQF77\u00062I\u0002$^a$\u0010Eq>\u001e.AE\u0004\u0015b\u001ciO0\u0013]ТK5ΫPÛG\f\rZd\u001fJ\u0014*$d\u000b^}E\u001f*֤>?\u0007\u0019\u001fƄ$dO\t_tl%$^7[KSECqz\"$\u001c]*\u001bB]}W\rzT[R\u0010k\u0019\"\u0015n\u0001]E\u001bUY\u0016\u001dvFUW\\B6-RB^Me2B4<ZRV\u001ajVy~O\nW>/wͺh4E\u0011k5˖<1U[t\u001bD>Q\u0012\u0019!.kR涧7u\u0000Jc>c\u0014\nl/i^3;iڐ\u001d0sĀ\u0007ZnS\u0014\nqW7Np:([568V\u001ciA\bFޜ\u0005\u0019~h\u00069Pldüj\u0005\u00102dO\n\u0016+\u000561--\u000e1Ewv\t=\u0014JCHW34܏&x\u0014\u001b8,&#Rc\u001b3Dvz6\u0001RSyu_N/nm\u000fكvT֥Y˼?R\u0005FװKzn9Q4gC^5l`\u001bP\u001c\\ܲG&\u0011ޫ`\r9PҞٲXr\u00146\u0018\nV4\u001f,{a؄\\tcY`]lǿԾ\u0015ar\u0006鴯؏=b!&Yb\r\r^[\\aYt$w\t\n[R)i\b[{$7f\"o\u000bX\u0019p\n\u0016zBz\u0001'h\u001eO|Ō4ǐ\u0001|-j\u0002\n:}̴a\u0012\u0003\u0000%T\u0017v\u00125Y\u000f9QK \u0016d0\u000b?$ćH|#uD3\f\u0011phr\u0017d@,@\u0017Xm\u0007\u0004VK\u001cY\u0010@o\u0014u(\u0013[8#!OM~.7SoJn%<IdZ=1D3!P#4(|:]S\u0010Yd_kGRh+OtB%/e䱖&]h\u0012\u001fr5\u0011slorQ\u0003\u001f\u001e\"F,bՓ*2~:ʼi\u0005[\bt˦\u001a~M\nU6DUe\u0012\"udPO:]x+\u0019\u0017GB]q:ʥ':\u0017-ML3\\F$7K\u001f3\u001e\u0000C*s\u00172zFs'Ô\u000b\f̼Ks\u0019ӚwER\t!`%aT\u000fH\u0002vRW\u0007SPƅT\u0013}FVArB\u0015[SS &}p\u001c\u0013`\t~_1{,yo\u0015\u001e{30[\u0016b\u0003\f\u0013\u001b\u0002K\u0010:w\u00043\u0010\u0007\u0007Mne6s\u001cz/0<x\u0000&3n\u0001j@\u000f_d\rKBٓ\u0017! t\u0007r\u000f!6<\u001drƕK\u001fjT;ҽ\u0017\u0012.Z\u0001\u000f.,68M\u0013Ul{D\u001e6v\f@\u0019)tmpy_.>OG\"\nÜ3N|\u001e/'O-R_1Vh&׺\u000bNPz8de\r勊ZTH;X\u0011Q6}+'h\u0002_\u0012\u0000|ȋCc\u0006uHjBA,NOS{3\tL\u0000`]\u000e1\u0005\u0005> A\u0013\r\u0000rxӴ*E^.\u0015\u000eؐ`Q5\fv{`=\u0013W6뼟\\9a\u0006vG\u0013OXc&\rv1w~\u00000W:ʎ~\u0006\u001ff\u0018:\r0/˵\u001a%m\fKRKA\u001a\u0004cR%\t\u0005P#CS\u0011\u0001ߥfmD5\u0003\u0016oEx17B0<&\u0006Yd\u00178\"\u00021\u001dw\bܡ5\u0010 TaaJ3p5\u001c7A>+yI\u0007\u001dMcu\rZd\u0001?B\u001ck1x-\brsV9s\u001c\bH6p]DGgO|\u000by5S$aE`$Ls\n[\u0017Y\u000fm\r~\u0002u8p`6*I\u000bߕ`S8\u000f\u00068sn9O3nXOE\u000b/7\u001df\u0011^lbN\b[PB\u0010FO.\u00169\u0013Z\u0005_\u001e.5>F\t\fS̉R'}ΪѬ`_dX|\u0006{d\u0003HXԾ3\u0007QlZ\u0004\u0002e7PRq\bش\u0014\u0004O5OkZrx5u`a\u0000ǂ:\b*`T),\u0001\u0001\n\u0001DPQʮ\u0006dߓJ\u0006Rk\u0005=H+\n*#u)h) )B6\u0001s9߹瞏\u001b\u0011HZGzGT\"93hDͺ\fsr|b4y\t$T\u0011K\t\u0004\"$I~\u001e$v(B#].qi\u001d\u001c\u001a?CN\f\u001a\b~\u0016ޱ|\u000fܷLcO\u0002\u000fn\u0015T~v\u0013x\u0019\u0007j̦5<.f\\K<2p:\u000fCp\u0012S\u0007y,\u0012\u001c6\u00026>|\u0007zC\n\u001f\u0000\u0011E\nT\u0000)f/:X1}J+\u0007>_~\u0000\bQ\u001f\u0014;^ㆪvs&۸>.k7yZS:˩㜍r\u001cݖۜaKa\u0017!l.g57Kv0!;\u0010ڗf\u0012e\u000b%]\"XT\fJ3\baժlwVj=v姠αe=bI/gH&\u000b:g,(y\t\u001327>a\u0016ba88fVV\u001c\u0013qɌT0\u0015N\u0012ɉB`(\f\u0015_\"fo!\ft}W\u0010\u0003g_0}HX\f9,Qx=~Jٹx>\u0011ӱe9M2mFS)Vk\u0019-eZF\u000fF٥btg0\u0015O?Dǐ%\u001f7eyښ6WS\u001eCy\u0012eUS}\u001dl`a8\u0014\u0016i\tg\"\u00161лJ\"|PKڝc,$+&\u000f\u0017PvꖴGBoj_t\u000e4I\u000bv\u0015qf熚(e\u0002C\u000e!\bb׼^S\u000ebYi1¨;\u00022W\u001f`/7\u000euh?4\n\u0017\u001e\b!z@#\b(T\u000b6\u001f\f^\u0004!R\u0015\tS\u0003#>E/Sq9z\u001b_ \u000b/\b\u0001G%ӈ\u00190C\u00129[\u0014ۼ@(٩P\u000b,\u001a}\u0002XT\u0002Okp\u0019\u0004QȫUG6\u0001\u000b\rx2e\u0015,>\u0000\r-?ϭQެYz\u0001/T\u000f5FL\u0003\u0006^`tީ\u0014\u00033\\#\u001a̬D:\u001e,\u0006v\u0000w[mD\u001bW\u0016)TBZ`0Ֆ`3tBQ˟kk\u001as41y\t`\\\u001a޸cV#\u0017\u0012z`XHhwA0چFTyqӵܫ*F˪\u0001%\u000f\u000f*\u0011\u0018/>9\u000b\ng\u0013\u001eS'\"b'zL=N)c\u000e\u0003s*bR)W<\u0015#\u0014S\t癛)K\r\n&\u001fL\\9\bWtW!\u0016Y1\u0007\u00157i*%\b\u0005wJ_\f閥nWJ\u000f!p\u0012\u000f-0T`:K6B+S\bzlL,~J\u001a#ZLHBEe߈\u0007E\u0018q1\nڸTD}\u0006bB;*OT\u0015CnՍl$OYQ0mz\u00157o\u00029NŻ|hDV[Ve֩b7YZÖ\u0004Hl\u0013~I)ܻJ5oOݑ\u000f\u0017%(,hZGҼmRd!/NEWutV57z;jjs\u0014\u0004^^l\u000eDǾ0-a\u0003_a\u0011L؁\u000fw44\u0003簍b^\u001cppi\u0015\u0015&nX\tuƻ-݂\r-cY4\u0003_\u0013\u001eg\t?\u001cjGI\u0019fH\u0019\u000b%\u0004J҂[\u0006%ϩC6Oz\u0000vW\u0015zoZtA$?z\u0011;\u001e\u0001ؼ\u000eFT\u000f2/+\u001a0\u0011@@S<@>0b\u0006Suqw;j4S'/4s\u0014Eթ(P[\u0019V\u0018^5ƊH\u0007kg\u0011/ۄw\u000b0*֭ ajyB\b5TC\u0015\fJ(_\u0017F4!m,\fRN\r?\u0006S9\r:״\u0004OfOV\"\u0002յڇ1\u0005\u0018,V)S@\u000f._\n\u0019#\u0012Q`K|ͨ%cj/&\\:\r[Ft^Z\u0000\"q٤Jm뙊jMarח`VCg\n\bw\"~><\u0007\r8i}XT8ǳ\u0001Q\u001aV\u001eY<<J=E\u0013ۏ7\u001e\u000eG8v6Z:\u001b%hBò9\u00034^ԥm!\u001c1OD>p%HG\u000f\u0018/Û`rq;Nm~Ms\\\u000f/Zh\u0007:(MXа^F.꜋.Ys}5`a\u0000((X0\u0012T+JS\u0003\f4&~|i\u0010B\u0002!\u0001\u0002!\r!\u0004\u0002)$\u0018\u0001)\u0002ʰ\fWFY\u0017]E븎3x,˽}\u001b|\u0000\u001ddc\n|i-0Ws\nQ_GpRjy0׿t\u0005jT̎ԍ\u001a\u001cD1\u0001څ\u000f\u0010ڍN:ka?\f7e\u0014k\u0015_\u000f%]a;ז\u000f\u0006\u0014\u000eF\u0004=\u000f9-b=\f&Mm0-vD\u001b\u0010'^j+/5(er^+EL\rF1$1KWE|fO\u0012FMKm::1`ڥfXЩM*i9\nl?+Lw?\u0017-Nx͈wɳ\\C0瑃f\ts\u001cM;iđ`$\u0017O0z\b*Rٹ\u0018\u0014B9@\"\u001fk5\u0001\u001dv~.lB?u\u0000g\u0013]\u0014ed\u0005\u001c8JAj\u0017͹u\u0011m.DO^^\u0017v:y;s\u0015ke\u001f+,L¶v\u0000ŝҼخ\u000ed\u0015_\u00145Z;\u001cq#k\u000e> MU\\J{l*͟ґ3Doy\"UDcu\u0005#H)BPit\u0014\u001a/\tv`\u0015_\u0015S\u001fʝ{\u0015e\u00115mpPpy=-2[m+v6\u001c*.WۿSǔ]\u001d\n^DMk\u0015,2.\u0013#\u001aɲ\\!{\u001e^\u0002I4Ԉ\u0017.~çlDcBU\u0018\\b\u0016\"c\rjvJG|H`_2r\u001d\u0019Hѥ\u001e\rt\u0002HH\u0001Ba\u0014G\t:Bf{'9\n[\u0006jaЧ\u0011\u001ae\u001c\n\u0007&h\u0016\u0013z\u00126Fdy?>gۑ\u0019x&l$^:^nx-'-\u0010]O 5\u0014@S\u001c \u001b\u0015Uڏy]Tu \u000b_,z\u001dWPT\u0005|BJ,ɕ\u001f}`\u00028ߴy?p7gˢu\\JO(_v\u0011OUue4\b\b+Qbi?A.jCxyR\u0019J\u0016駥Pt㸲r\u0004\u0015T\u0014f\u001add$ֺFR\b>P\u0015aL\u0001'\u0019\u001ev2M\u0013\u001b*׵\u0003\u0005\u0019T]`W*cD*\u000fhAe#\u001a\"ɆKO\u00169JKL2J(\fKgK\u00023\u001fjԉfZ\u0016nL5oM(_>FOӹGi}<\u001b@w#Nd\u0019\u0013h\u001doo4Y\u0003\u000b̾Fٸ2\u0003YAz$W֜5Copli\u001e\\\f\u001032l\u0015;a<;S?\u0000\u001fB><Aa\u0018rL>z\u0016p\u001erj\u0013sm1tZc̥\u001c{\u0010s/J{c*#3ހf\u0004ϡneh->Bc9S\u001bJ\"չO8'8\u0001\u000fހ `yHϤu-*`\t\u0017\u0004\u0012x[c')Oy\\x!Q\u001cS9q<oc\u001bWSR^\u000e\u0010\b\u0003[H{eU\u0006\u0001!.$,\u001a](\u001a1\u0017\noe*\np}%\nK\"\u0012G*\ryE%\u0004S\\#V9\u000bۦ24=ZH\u001c\u001dW}dUU$U\u0004>*\u0010;$;d\u001e'=NY\u000b,|ܶ\u001e34qT=ka%\u0019h\u0002\u0016s䬺\u0013\u0004UX7Fl[\u0011\u000bo1apuxf9QGk4\u0013;e\n˸7荇\u0013\u000f5xB:y\bZdͫ,`2\u001f?_a[0\u0003~9iY\fFs3g\tË9u<,yx87\u0018\u0001 1Ja\u0013\u0005,O@/g\u0001O㔛\u001e94 |.\u0016\u001a]16'^\u0018\u0000@1'p:XtwL,j\u001fVQv@wl\u0011{έ̱\\?R^UV\\G\u0004I\u0010+9D0\u00063o\u0007yd[R<\u000e\u0000\u0011\"\"\"\n.2}\u001b\"!<4tH~(-r2\u00055DH@l\u0018\"K濣,\u0005/S}\u0012\"+\u0001~w\u0017F}V\rdRz,\u0004:w&?C~FqJ}Jݢ\u0005Ji\u0017rjzEgU#p]ZF\u001d%\u0017+[Pj\u0000ewVjlW7wR\u0015/*C%%jGx\u000b@EF\u0019H)&0_\u001b\u0017\u0015Օ\u0001|Xu\nDRNX\u001dA\u0001\\\u00140JS\u0001H307͛73\fC\u0012Wc\u0003+U#r\u0012\u0011\u0015#\u0004\u000baQOL4\u0004E\u0010љ?s~{sI\u0005\u0011y?y>ҒLָKd-ޣJ\u00111v\u0000\u0017*fH\r6\u0002h\u0001z+~BO\u0019:\u0005IQqZUՍ\u001dP\u0014[\u0004UD#BM\t>$\t\u0018z|?^\u0013\u001f!J0W8\u0001\u0001N\t\u000eW\u0003zXfщ\u001b@\u0006'h\u0015\u001c<\n%sdR۔e\u0011[$z\u001f,Z2H5\u0004[&H\u0007t\tL\rU\u0012O\u0002\u000b췯<uɎrE\u0014\u0007ᾀ{\bi,8+ןwM2\u0017O\\7I8\u001eil2ewkv\"\u00079kr6±U\u0005\\R\u0013\u0015*qoGC\u0007xxy;:jYE)\u001da\u0007ΰ!\u0013Xidj\rq(8S=l(P9\u0018Iue\u0014&\u0016\u0006k)W1=kZb;8zBC4\u0015ڕav?suUuP\u001f\\Vf>+52\u001f\u001bj&P\u00116uRɮ!\na+rk!o\u00054\t\u001a`\u001aܗP\u0002)f\u0005%\u001bVQTF\u0011(Z]s,TR|O)O?ho# ]6\u0016yл\u000e)OU,F٠E})g\u0014sٴGyҘ\u0007p/k\u0016w\u0002~˖I'Y;Td\u001egYU'\u0010I8@\u001aF*\t8\u000b$\u0010I+A2((+y8OϋWȗE\r{բbW\"@\u0012}@\u0004C׌teY\u000fgvֈ\u0019H\u0003\u0010ofE`ea<oV\tF\u000bCk2*\u0014 ]v%녦Ly|\u0011KJ3PnW(\u0014<\u0000yiBVOh\u0017P|q'9[\"\u0007<c-\u0007\u0014p!pw5\fϔr\u0013)\u001c\u0013􁢮^.\u000b,8L\u0000o\u0006қr\u001f7\u001d\u0001ȶǫ\u0000.@\u0017\u0015Pp\u0000\u0004\"\u0002XSI3IkTGm\u0012WVbu6G\u0005ބ\u0000\u0003`]OZ\u001bQ&'lTR&\"N!v\u0006G{%^}T1v:Ȉ\\\u0007(IWf\u0012*ڮʃu*\u0016lgw\b\\Wd?'~|S6|ɖ)ݹ\u0013\u0015E< K7b\u0007%\u0016\u0017J\\*\\D)\u000be\n2G\u0013\u00122ћBjx$Z-\u001aa\u0005V#\u001b\u0010\u001es/\u0014h\"K6WZ,\u000fɳL9\u00190~G\"\u0001~4\u001d\u00125\"[\u0011K4hq\u0014ɕFa1U_KĪ)P\u000b\r?Q΢9ޒ\"zܮi$\u00045I0]xo\u001fܬUJ&\u0010]:QS{\u001a%Kz\u0005<\u000b~m댋/7ƣ\u001ai_y\n\u000bI<\u0010Gd\u001ek~xkے1e'w7۲\u001c\u0002Uyʪ\\PxVnL\"\u000bN6tĦ>\u0004\u0012gbN_4!/e%\u001eO;mhtWv6\u0002[iyFy4ʔat\fV]\rau\u0015\r#\u0014QY\u0011m3\u0014r\u000e\u0004M/q\u0017{\u0019~\u001ctjD\r7\u0003f\u0017i\u001e\bɷ\r\u0015\u001f .\f\u0004=[n`4\u001bqShBrx_5wԐ\f%n\u001dQ\u0016~x'G[\t`\u001e+qb]Q\u000f2Ըi=UGn~\u0013ڋJ(Aݪd\u0015\u000b\u0016\u001f\u001d\u0013E7Kz\r+M]\u001b!}\u000bjnh-Cզ_魺\u000ea٭D\u000ffrj6$-\u00044nUZ\u0006F)Zp\u001eux'\u001c@]U/ٳۿ3Ug`iU}ڰ\u0017U\u0004LWu+SU[\u0015;uXJ\u001bP\u0017vOŀ{$KF,q\u001eQruH.}imfZh~atM\u0016\u0017Bb0*iW\u0015\u001dC\u0005䶧jZmn\u001a\u000e[nKfi\u0003\fc+.&oV.\u0006\u0000&\u001cʭ{5_s9dm\u001b\u0017IA\u0001. \u001a*\bs5:\t1\u0018Ů\rm!|fl'6#N\nZ>\\oMk\u0018C\u0005Z8)*\u0011\u0007\u0002\u0001b\u0000EE@\u0018(27{I\"\t$!0\u0002a=+v\u0000UZŁ`-xEJU\u001cǺ\n\u0016\u000f\u001f~~7<NzQT!w\u0001\u001bB,C)kE+\u001f\f+#\u00046\u0005-)\u001dp*㪝A \u0007A\u0016occ~\\_xb5Ӽ\u0003zgQu\u001a}޵zGeX~\t>TS\u001dsV6\u0015i1\u0012=\u00182J眆J\u001fh@ U\u0007u;\u001d\u001f7!0\n߽\u0006\u0011\\醮\u000f\u0013%-;=.\u001d\u0004e/T7D$v{\u001a.ʫ\u001f\b\u0007\u0010|Z\u0013ѮmcDֲ+-Cu_{>1H1]\"D^nR\rٺ:E3\u001d[h9\f7TJOW+3\fv\u0003Limc\r@6'[c\u0007`Ǧ8v!b\u001aR{1_\u000fӵuoPE\u00032\\@\u0007;4\"\u0004mO\u000b\u0016\b\u0006m{\u000b\u0016ߺE\u0012\u00131dA}\u0010C=W\u0003B\u0002}[3']\\PJG5VmnY\u0002G\fXyahd'J\u001a[\u0007U~\tvWۅWo]WnGnR\u001f9H7\u001fѨ\u0011Au\u000b1\bvZ\u0017m]lUr\u001d\u0005TVA\nsj6lhm\u0018,M\u0006y4A*0vJ\u001d\u0004R? Ĵ>\u0002\u00172C\b!\u0010\u001d*#q0MJ\u001d!:ŏCR|dFa?2\u001c݂\u0018c\u001ah3d\u001c\u0017B\u001e\u0002zS\u0006It?\u0007%\u0019\u0010\u0011LmF[AxYGҏ0m;\u0010GY1űh%[s\u0015\u0007ጒ\u0019@\u00179\rq_8G>\u001cr\f\b\u001cW\u0013n\u0011)jodEzC.q\u001aJv\u0005i\u0015N&I\u001c\u0007f8bg\n\rv\u0013|\u001csd%:uTf&L0~p\u000e\u0007.(RU\n\u0017;\u000b_)w%$\b/\u000bt#\n~\u0012#u\u0014`\u0014u[w.qs\u0002\u001bY\u0018_-*'̳ɩk/)\u0005\u00172*\ri9$7fUzflc9}]\u0000,툏WYC\u001eIk\u001dS-\u0002ty7>\u0014T!\u0017<v`tFW\u0011V\u000e\")'U\u0019\u0012\u001a!<\u0017\u001a^DV\"_W퇖6!\u000f{9\u000b\u0004JJji_U(홽c4*j>\u0001\u000b26\u001aKݲ\u001e\tm\u0006&\u0019c<kQ\u0000\u001a\u0002Jl\u0006n\u001d'IyT>\u0005ӣh'\f..+upC\u0006\u00136&@j5t\u0013\u0017dP\u001b0=I˂Ė\n</B\u000fིY%\u0017\u0002V(\u0002q\u0002\u001b/ܦ,Ǘ\t9(B0jtI4\tS:qԙ1\u0014K\u0014h^ChhC\u0014\u0012\u0003\u001aF( \u0005||\u001ay0%o:TA\u001a\u000bBQ\u000fyPI\\;hVʓ2J\nĥ[Qr\u0003_k`9h\u0019 \"?7<18\u001a~Щ\rt]Z*7֡^%Aǌ#7L{Lu7\u00057]ČY\tL\u0005\u000f\u0011\u0014L\u0017\u0003;\n\u0011i\\WkI\u000eSy!KC:3\u00181hZPf:߄\u001f0C>C{\u0018޶$\u0004tR:(ϭuO\u001eR4$=jluq\u00191?פ9Si|c\u0017qF!_z^S\u001dK}`d%D\u0013T\t\u0018w\u001dV>;\u0000<'V\u0006=\u0015(5H%j\u0006WM\u0005V#9YD2֓\u001bp~~J\u001f\f}D]gNSsjJ\u0003mn\u001f->,v\u001fg&SL\bl#\u0017>^i8\u0010ʞ%4'\u0017RJ\u0014Dh\u000f\u0004RN0hBA0(r0K+a\u0005\u0003MY|\"EGE\u0013_R^v4/\u000e?m[˨yN`K\u001f/5[\u001871[\u001aG\u0001ؒ\u000f' '铯R\u001eGhqꭁ\u001a]\u0010>iI\u0019X\n5'\\G\u0013B\tćd^\u0012u\u0002x+\u0002[^%e\t֪p\u001axE\n\u001e 6%!Itި@Ҿ\u0000#%\u0007\f\u0016\u001b\u0006\u0002:*\u0000h$r7שׁ55׈Ց'I+\u0013\u00036*ЮwȰ%U#zD+Jt Ba\u0017Uؕ\t6}\u0016\u001c\u0011uO\u0019r7dP\fCu}FEua\u00007R\u0004\u0019V\u0002\"KST\u0019\b20\fE\u0018N{^\u0019\u0006\u0010\u001alk\u0003ƕ$vW(,F7b\fˢÞ\u0013Oy<\"_).kh[n 9W?gڈ7y\u001bș*ӼuA@ OpIR\u0011rP($e[i<H/\\t/G\u0005inQa@q\u0012Ia{\u0002Yʒ\u0012\u0006]e?D\u001a98ߙyd\u0002x\u0000,8?Pe1NWwAi\u001a\u0000N,\u000f\fB=%PK\u001d~\u0006҈G!OʽR=e\"!]::BI\\MJ1jGK)\u000f\u0013b\f'xL\"W?D\\GԝC{AA\r?u#U\u0015\u001bUJ\u001cǹ\tH{\u000eF\u0004[5h[\u0018N6){((\b\u0011%\u001c>VYR\n\u0007n#\u0012(a\u000e\u0013Fq\u000e\u0015&mq3%\\g?\u0010%ӆM5XD3b$ʁ\u001d\u0014W \u0006ƿ5\u0005&͔D4®K\u001ec\u001dᏊ\u000b.\n\u001f1Z\u0004\u0017\u001ao\n^`~¿`6z\tq\u0013\u000baXǰ)Ӽ܄'84\fn\"Db.\u000e\u0000\u001eyC<\u0014K\fd\u000f},{\u0017*h\u001d\u001d\nڸh\u0017>wMv^\u000bc8Iƻ(~\bj?\neoy\u001cl/Dl5Żרpy\u00151\u001fܣܵ^004{\u0016\f\u0001.\u0005\u001a%C\u0018\u0016A22dWuQ>ok\u000eL<\u001c\u001e\u00115.ſȠiffh7S-|^T\u0013jX[wCY*\u0007sG^1V\u0002e֗+\u0007˃\u0006\u0001\u0019L3\r/2y{\u0007\u001e+.;CtJ }\r-\u0002\u001d>٫\u0019y6q<\u000b\u0016\u0003\u001f<bs\nb\u0016k\u0006*ĉ\u001f_\u001cV\u001dTm\f}D\u0006\b51oU\u0000Qu\f*nҹ\u001cD\u0019U4|>WxA\b_\u0010PZ?\tQ\u0012\ty\u00141>y\u0006\bK\\\u0014.!O\u001fqM\u001e\n\u00140Cl\u0015\u0012];Sk)=R\u000fZ@[ɷ5\u0012\u001dJBeǐ$\u0006\u0005Ni\"0\f-úR4H~9.\u000e☫|Dϸa\u0005h\u0000-)r~\"eo\u0014M\u001cK%4\t_7\"\u0014e\nQD~0T.\u0018\u0017>\"x*\u001cO\u0010\u0011>酧.Ey+HVy55\bRW\u0005s\u0005Ek*\u001dPxEGB;(J\u0011\u0004\u000bX(8hiqmh^\u000b0`}_APW\u001f\u0003DLZ\u0014\u001b\u0007]<\u0001\u00154zG֦\u001b`oy\u001fZR\u001c|u^\u0014gCF#\u0004n\u0015r)Va\u001c5ƪw\u00039\bnjyIt\nxI1bIy>}-Aگ\u0005\u0013\bOShKF\u0004x\u00126xqqQ\u000b\n3SU\\ka\u0011椚̩Di~\f?{>J3\u0013mtߐZt\u0002]YNju]ɒQY\u0018lZZs\u001e\u0012NѴѷW>S\u0014ݥ0Bj\u0014\u000e+7q҄fU7m\t:8^;#eտ+\u0019*,_CY3\u0012\u001d\u0007M\u0003SU*LX.jQȖg\u0014_IW\u000fJ5a\"9R'C\u001b\\y׳qH)VU\u001d-Z\b.\\+Ѥ/a\u0007\u0012en/|F[?SPk\u0000r\"\n\u0016^\u0017Y>VH\u0001\u00139\f&yaIxQ<zU1\\\nٽl\u0007*7}\u0007hu;Twfa^cnYS\rq;)oZuG\u0007!uTUOrlk;HF-x/,u\tsm>fd}+]\nU.o.\u0019=q\u001a-y][\u001av\u001eiR\u0012gk*`/pLBu\u001a\u0018+A\u0006@\u001e[)\u0002&PY\u000eQ?im/K,Y\u0000*gu(i\u00022\u0006`؀V\"fJS\u0014s=\u0013RU@\u0000\u00127+>dْ\u0010smY\u0000)w=U?ο3D\u0012\fqjv8<!z\u001e\u0019g)\u0012\u0010b\u0015^[$zRYjT)Ԭ1c?\u0012M\u00062q=@?\u0007\u001bܣ5ew?SIfqD7\fk\\\u0000\u001eL24\u0015\u0010A<\u0015D\u00101`\u0015\u0007 (T@@\b+7{\u0004\u0002dI؁\b\t3*8\u0012:@-\u0007\u0007\u0011mq*8r\u000e\u0007><uݹ\\idXmmJJ\u0005\"U\u001ej\u0016b'm_\u0013z$b\"uO\u001cbM\u0014q_'\u0011\u0002isͼ\u0007?M#mp_=~m=İ+ȡ:L;\u000548l\u0003m\u0001\u0004b\u0003\u001e3埒-m\u001e$Y|Hn]ckk{>3׽}\u0001\u000b\u00051r@vy:{Eͩԡ.\u0017޸\u000e,珈~CH{k\u0012\u001fsv_\u0003\u001bl毁@\"lOR\u001d.\"0\u000e\u0013Fl]\u0000]C\u0014˧\u000e\u0004Mfi nq\u0015˶Q{56e\u000ff\re\u000bl[IuY_(i&;to\r\u001e\u001d\u00105kZ/\rjj\u001ap~Ch⨿䦿\u0007iRs!G-\u0017֠5\u0015\f\n&\u001fwa7\u001bWAƫXU\b\u0011r8+}E)oVӃIÌ}qZl\u0004\u0003h<\u0019gw\nA\u001f?=$6-ޡ|,)!<\u000f*\u0016ǘ*z!8߀\u001fϸuPp\u000f\u0000D|Ŝ\u0016e=sm4'Ңؽ\u0014Y\u0003aPOZ(vj?\u0004VGgxI=V\u001e\u001d-\u001e̹uMCJH_-C\u0014]\u0007B~2A\\8*E8PTΔTo\r9/whaߣ\u0005by\\'F,Ռo%wU\u0013/\u0003ժnM*T Ƌ{5\u0019ǊԢT9L;y\f_fX\u0011D\\uַA:x\"\u0001)V%V/*]1#\u000b)ԋ@X\"\u001b\u001fSVӅ4u.f?Uչk%Nj;c~?\u0011]Pۺ˄WҌ=V듍1\nE\t\u001dֻqd{q׉;\n\u0011N\u001eYHdfttc\u0018\f#&v\u001aPtQ\u0012jd\u00011o\r­\u0001R)ʽ@}\u0006<7\t&\u00108wyybH\u001c04͂\u001d@>\u0000o`\r~M<a9\u0010(n\u0017\u001c\u0011c9̼4<\u0002o/E1\u0012\u001b\u0010:\u001aɕ\u00197e\u000b.{ՇPi\tWEYxޝr\u0006\n\u0002EJ7\u001cT|4\u001f'r41 ns#?Cśhk6\u001c/ϻ\u001e7\u001e\u0005n\r\fHITc6߱=\u0001z\u001dz!?z_)c\u001b)ueT}nS3&iq4rEUYX\\K\u000e\u000288IX`}7yIi\u0007\nSi\u0011Gr3\u00048Eiօ$f\rl+n.*d}0Qe:FSS퍆֯SȺ8\u0002~%;\u0000[ژ\u0014\u001b\u001fl0~{^\u000bKbV+T\rs\u0000Ix)oeqra5),kx\u0015U\u0001Q\u0018\"YNפܾWu\u00198GQd!\u000fH92\u0006'\u0002\u000431cC\\!Q-;U9\u0014\rdZo8CNT1+hڟl-?63\u0012z,=\u0016]\bA\u000fw7!\u0011z6*\u0007H\u0005H*[|C_\u0012@m\u0007\u0006s2Ur\u000e]^\b\u00079\u0015n\u00040\"PuTt$#:H@бjyb~=噛*kuUQm9]'pu\u000b\u001ddSۖ\u0016Hgi\u0019۬6r-\u0002\u0006>`Oi#T2\"-!NSn\u0013\\ z$\u0005\u0017S\u0019C%Q%;\u0007\u0016OzcT)!M.w\u0003f.Po1\u0011U=Bl1F#F0HD\u0015\u001a\\u̞rڜ*ujQO5u8\u0005E$\u00117:\"І(UuANgulWYE*Z\u000f\"cT\\\u0019kTxlx)$<hT'\u0002,ʷ\ry={V?$N)DPVl\u0018]:|d̏\u001f\"w1*=3*gB'\u0012\u0019|\u0007'\u001b#sBFS^PR8?\u001d\n$\tm:\u0007\u0017@\u0013l\u0016(蕉9\u000bEa,\b_܎iǀ/\u0013O\t\u000eI4a\u0019S8!%UJ8C(&2J:;{\u000fMጫ~JdmrFW\t\u0011j\u000f\u0017gY?;s\u00038Ҁ\u001aZ6\\F\u0014qD\u001c,H\b\tY'{\u001e$a\u0013@Qk^жr\u001dh\"j}+mj\u001fysәMD]_CJQw\u0006)/ʹ5״2s7\u001dv}7\rTV\u0018S\u00146~GoLF\u001d\u001b\fYHKmkv\u0003\u0016~U.+j\u001a\u001b\u001epo8Ɖ$5)\\R(\u0006g\u0013Hm}w5jN)\n+pvO[nHj͌%=h\f4\u0005^\"\u0011\u001a\u0018lq:i%S,P=Ƌ\u0007G\u0015T\u001b\tBULR8LW\u001b$GxL\u000ecL\u0012S},?E;8QE$?\\.e\u0003!&\u0017\u0015K\u0015K\u0007J\u0014\u0013G7|_\u000b\u0010Ҟl8!>8(YBIY`[}\u0013.Bb\f\u0004T$=U8Oŧ\u000f\u000b\u0013yP\u0010-x$\u0018]0_\n\u001aj\u001e(\u0015sOH|/=wKR\u0001`\u0018\u000bptl\b>f\u0004*\u0001\u000eӡuU<=Ts(&zpKA?sLo`N0Mq+~*m-~F7^5惬H]\u0018${|\u0002-Ҷ\u00079Y&=X'Vu+^\u0013ϖEm\nY/0X c\u0016AdP\u001cc_X\u0007\rVRx6\u001ab|C6^FeC]o-F?f7Q3V>͝\u0012yFs\u0019\by]\u0015ݯMF͊\u0003k\u0003^\u001bNնI\u000f#FZ.7ƆQfeϫC\u0011Jn;Aj\u0016B\fJFw\nmԗ6t\u0010(I5be\u0012ElX\u0013Q\u0001\u0004͌\u000f\u001c\u000bi,)6QS 1zJezVBf\r۹ʹ\u0012/\tHQ89\u001fSnE%o-4Ǌ``,\u0018)~ut\u0016yQ\u0017\u0004\u001fN]vح\u0000p+\u0002e\"xN6y*\u0014,7\u0007$'x\\CQL\u0017[8.d@}\bCɏE)\u00101\b\u0001\u0007D?@晹\u0012b$?7\n\tYM\u001a\f\bN\u0019\u0011|\u0005\u0013\r_Td'wa\u0001}\u00170Z<9|3\u0002\u000f\u0005閗3\u0015~o=Y>l0Wb=P1jmE \u0003XR\u001f[louv:.C=;.a.BřS[nWJ\u001b3ǟN1='\\Xr8۲:KXj\u001b6e\t\u0015\u0004g΀a\u0011p\u001a\u0000%z\u0019\"K\b1.c1ɇz\u0001ɭGTRiVBe\u0018\u0000-)K@iͬ!u\u0011@_\u000e`&2q\u000bup%\u0005P\u0000\u001a\nSЧ|NWP !\u0004\u0002o-t_\u000bnyV|ؤ賐e`HʏE=>\\\u0000\u001c\u000eTǀ|cҎkIST!\u0006\u000e%Gu,%[IR'+#T}m3\u0015\\/\u0012df)`n2#\\M\u0007(CQd6fl\u0016qGv첵).Z&\u0004\u0013wI\u0019Te{\u0006JQܕQE\\m`\u0016\u0006p`Ҵ\\z[v7OVo9ݜQ}$SSFMW\u0004d\u0017\u0006nyuя:\u0015\t*o[3 \u0003\u001cO\t\u0015\u001dFRJ0\u0018ոl\u0003+L+\u000f&\u001coE+d-\n@?\u001c^fE\u0016koo\\fyJ8zΰXmi\f\u001b\u000b-\u000eNw}OYp\u001ez&@>gݪHc.\f\b]7M\u0011z#f\u0006e\"g\u0001\u0005\\a@\\qyºJc\\3ܔ\f\u0007r'WQVE\rD|P\u0002L\u001f\u0006\u0010s\\h_h\u001e\u000e#9Z-\u001c\u0012T\u0005\u0013dL>˼!WS/bniA3\u0014\u0004\u001f.1Fx\u000e@Ǡ3UNN^\u0001nPOZd\u000et<jGLys=>v\u0005WO&-8ךshveSȉ\u0015`wPU_cař=շ}m\u0017`<<$+\u0015UV66d\u0004o88{η\u0011zkG}ڻ\u0010<<7\\\u0003jvg\u001a!5M!\u000e\u0018w&GmpfSgO3\u001fx?\u0017\nwZsLRq/~lK]QV\u0010:om<\u001fQ'\u001e\u001e\u000bR]AMXy\u001cu\u0003\f\b\u001c^ȩ\f$}! \u00079LHaH8\u0004\u0004hʡrTtD-*\u0015fY]]wuu[bgg޼ߛ\"ȹ \u0019I\u00057HR\u00167HB\u0006\u001aHudt\u0018\u001a\r\u000f*Ჲ=eJtj|\u0006\t#TI/\u0013W?{\u0005ΝO\u0011^'`v'$^\u001fE=7ITF2˵7-^'Z\"[x\u000b;\u0004[U7,Q\u001dyWr\u001br9E\u001b\u00116c\u0012\u0012y'I \u0017\u0019g\u0019\u0001IR\u0016m2\u0000ZQ\u0016\n{0\b\u0019K\u0018,^H/>>G@l`T\u001f=FZnZH\tѳ$\u0013m¯\u0018鵩KA3D;w\u001a\u00127\u0010\u0014\u0011ŏw^J<`i$M_x8wU-,\u0013/h\u0013!\u0012p\u0003bP1|\u0003\u000e*k\f_U;\u0000\u0004\u0002N45j<?>\bX_:]\u001f$\r%\u001dͫX+\u0004é\u000bMiw\u0000zz{\u00137`\u0013fO\u001bE5F\u0012ohX}\u0006fL}k\u0004%J\u001aq_b_\u0000A54WK\u000e'\u0017h?\u0003\u0014:lTHmm.\tm&\"X7rV7\u0014\u0007l̨b]r+\u000bOpK[{0Euwrfӵ\u0012FajCC\u0013Pk\u0003tMݻVw[FR\u000e(Y-VE\u0018\u00118\tP?)p>\u0007͛5\t#TtF%\u001e3\tqh\u0013k\u000e\r;`LVOp\u0017Zۓ.\r\u0015j\u001b&\\\u001eC<G\u0001\u000fPJqz\u0002Kmd\nA\u0016>\u0018ʡ\t<*\u0019g\u001b!r)J\u0015;ȁ\u0012&xK0N\\\u0016B&\u0016Գ\u000f$bԍ\u00177\bfpt\u001e\u0005(0H\u001c23\u0005ӲG1d?ź\u0003\nbVֆ\u0015|\u001a\u0016\\[w+t\u001ajj?b7h\u000fwJC\u001amm#b.\u001b^V\u0016\u0018B\u0001\u0003DR\u0001b8\b\u0016\u000eE]4J\r7LGc.\u001dX\u001ed\u000e/a&ڎ\f@顢\u001cz\u0004\u0016Qu\u0003ֈ4Tqi˽èb˕ 43~,y\u0007moθ[0 \nl}\t\u0004TCuLBt\f2Z\u000eW>\u0007Eh@+[Řy0\u0007=\nsU\"r];û](̏{\u0018e E=m\u0010a^2'\bF\u0010Kv~.Оm\u00130Oj(e\u0016sߺ\r\u0014Pk\b*!3\u001cIBЦ\u001c\u0019s4{^\u0014|{6k\\\u0005*\r}XY\u0014ǠD=A\f%$hǹWǂORV\rUBꯪr\u0018\u0015+C\u001aa6\u0010 \u0004K\u0019ԣe :Zڿu6&?W&\u0016k)\u0011.\u0015]%],lb\u00107MX][H\"}WL)RIrfr\u0003?AƁY&I\u0011~_\u0017IB${Xl\u0016ZX\u0007E&|w#؆`_v\u0010ߢf\u0013\u0011u3fm\u001389?9\n̟N\u0016Վ`jz1*.@\u0005爎܋`oْJ_+-\u00004α6@\u0003\u001a/\u0011DWE\u0010jE}HR\u0002\u001aDl;Y+\u000bz/\u0006\u00011Dѓ(z)\u000eoι&;.4\u0016aZ\u0015#g\u001csbZ+X\u0018Wi;<~n\"(\t\u0007M'b6!G\flP<^\\nM8-\u001a-\u000eaG+dyXP^s:\u00050q\r\\p3b\u000f\u0011W\u0015u.,R&rm\u0014\u000f#<Heĸ\u0010vQl.ˍJ\u0001>\u0014қs)lej\u0001(^ ,=/\u0014\u0018FV6fj\u0001;e\u001a\u0002x%Dk%!FW@a\u0001o2QTvs\u000f\r5h\u000e0B{UHiGCO\u0011zL'pbIq\u0004+'_1\u0015\u0018Lv\nQA%\u001d$\u0011[H\u001f~}{\u000f1fKٲ:H\u000fmWS\nëd}2w\u001b7\u0006\u0019\fj\b\u0012< \u0005O7i2G\u0003;\u0014S\u0016Wݒ!\u000f@Y\u0003sZ~\u0003\u0006*\u0007PƐ6x\u0002Q\u001aܡ\u0005/9i7cGHVf3R\u0001>\u0010K2\u0001jZxH\"Z\")\u001evHD}\r@\u0013}\u000f\tYJ6\b4T(P_(*C]miSJqOZg\u000fA(\u000fny8}wν37;?߇*x\"D\u00116H\u0013aeZ\n5K\te\ntE=H\u0003\u0015\u0003\u001f\\ƒ\u0011W8\u0001\r72\u0013ym\u0003]L\u0005y\u0018\t\u00031N<8͍@\u0001:>\u000b>6pӹ<AМ*쵮5M\n\u0012N5g\u0014ܿ\u001a]7cD!\\\u0019\u0017\u000fO6N(bH\u0017\u0012ֲ\u0019rt1guN'wߢ\u000eeG\u0018\u0003r\u0006ubJ1a#gi|\u0007Gc\"\u001e\r\u001a'x\u001e&YH;\u00044\u001f\u001c\u0011T\u00031}Ϯ;cV*ܲw\u0013f\u0018\u001a|H2\u0006;Rl\u0018{K*GZPg׸z\u000b*ۿ\u001e?ʗ\nד:N9\u001b\u0007uL7o|jBjE\u001bV\u0001QR!Ū;~;ZZxٲ\n(񆜦q\u0003E蠟V\u00067\u0011\u0017:bg3h\\yg\u0003.:O\u0015\u001007Ң\u001c\u001ab4=NHdto{<WZgH\u001cNR\u001eRZ\\sW*Zx ƻQͮl<ITs|X)c?p\\B \u001bKue\u0012|0|/a\u001bhB\u0003|樕sEGMsMd\u0016?*G,\u0019HR\u001fg[)|\u001f3\u001cCQ{0bIט\u0004%9*XR\u001eMU)+^\fP,\u001bp\u0019y*~uR\u0016Hw,r~L;_v\u001eN\"\u0013\u0005ۿ]/\u0013/S{̑\u0018Ͷ^\u00070X\r74㊈#ޒ{Y\u0006\u0003<\u0015mg\u0018$\u00195`Vs-\u000e*lۻg\u0003ri˕[\fLX#DEhgq\u001e!N-_\u0017c\tYPa\r\u0011!w|Em\"\u0007PD\u0018OU\u0011HSr5a+[\u0012\rm\nW\u0014h*¥{I/1\bYwûJy\u0005׸jk@p[z\u00023\u001a*Re\u0001RXwq\u000230u%B\u0012AŒ%\u0013\\NC)W'5꡵\n&\u001aF+U\u001e,\u0010\u0014d5gR\r\"J\u0010rVD\u000fBSDO]V[EסdyVӃ1,+Iev\"`\u000fWrwKa\u001dG|`\u0016%+TVRC\u001cF{Ys*Z5\u0000߬\u0004Re\u001as Q3\nj\u001fQA4Ӌ<>$.7$C$p\u0018\u0002\u001d\u0014\u001dA)hJewT\u0016*FmK\u0011g-lm*{{v\\ܲsJa>3_*ݑ\bہ>V5|WG_\u001d>RR_YL\u0004!RFjz\tS\u00045fځO\u000e2\u0011< \u001a`}I\\:XiZkR\u0005\u0016\u001dH*\u001f\u00074[(x\u001a\u0010\u0011X$u|I9̺\u000fTk\u001fVz\u0006l_\u001b׼gC%*\u001ew\u0005XR\u000bnY)\u0000N.9+wZ[E9\u0013ľW\u0010J%w\u001a\u0012p`Nj\u0015[\u0018.\u0011b|JOsdW,R~#*\tĽyFdwCp\u0000\u000f*L(8Oe\u0010\u0004lL\u0000˞)A\fvf\u0012Fʹ.\u001bKnd~A򥾺]Di\u000e\u001e(i]YʯJߟ?>w\u0018[侾\u001d7KK6w\"!eD\u0010p\u00005V*\r3V\u0002Ea{:KoEDcɾJ#oOU4\u001e4\u0010\b\u0005lTjFk,>{S?ýSk>Su=\u0007|j}\u0014\u0018\u0001T\nSU.nk.m\u0014cŮ)R\u0018xb\u0000T<\u0001TV*yÙ<\u0010+`RC;\u000eS^0\u000e-itp<\u0003ȗ\u00182\u001aIZ_0ȡVVKHWol9=f\u001ed\f\u001ejb%}D\u0018C\u0005y{sI*{ZL\b1\u001d\u0011r`n}+D\u000e_*\u0012\u0003Uz3}\u0002i7\u000779_kjxL+u\t\u001c;FxL.mmQ`sKz\u0014\bK\u0013#>&\u0006ޗ\u0006xi\u0004BV^\\s\u000e\u00053_XX_رC\u0017+ҭj|S\tkϽ|j|[\u000eX\f\n\bΆBL.?\\\u0013\u0015\u0012\u001fDCqߢ7nO(M&J\u0019O\u0019iݖw0\u0000\u0014\bIJL\u0012M,NCOYPoQRSTUVX\rY#Z:[Q\\f]x^_`abcdf\u0002g\u0012h#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂŃ{pdXL@3&\u0019\f֜ȝ|jWE3 \u000eתū}kYG6$\u0012\u0000ڷȸ~kYG5\"\u0010ŵƣǑ~lYD.\u0018\u0001оѧҐyaI1\u0018\u0000ڲۘ}bG,\u0010{W3\u000eqH\u001dvU3\u000fsI\u001ea)\\\u000bZ\u0000\u0000\u0001\u0003\u0005,\u0006\u0007\b\n\u0004\u000b\u0016\f\u001c\r\u001e\u000e\u001c\u000f\u0019\u0010\u0017\u0011\u0014\u0012\u0010\u0013\u000b\u0014\u0004\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ac\u0000d\u0003e\u0001efghijklmnopqrstuvwxyz{|z}o~dXMA5)\u001c\u0010ۈʉq`N=,\u001b\nٖɗmZH6%\u0014\u0004ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿\u0006\u0012\u001e*7DQ^kyކߔ\u0004\u0012 ,8CNYcjnoldVD/\u0017\u0000\u0000\u0002\u0005\u0003\u0005h\u0006\b\u0006\t2\nR\u000be\fr\rx\u000ez\u000fz\u0010z\u0011y\u0012u\u0013p\u0014h\u0015^\u0016R\u0017E\u00187\u0019)\u001a4\u001b=\u001c@\u001d?\u001e:\u001f4 ,!#\"\u0019#\u000f$\u0004$%&'()*+,-./|0p1d2Y3M4A566+7!8\u00169\u000b:\u0000:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+!\u0017\f\u0002؎͏Ðxpjc^YURPOOPRUY_fnx̰߱\t 8Ql»\u0001!Ceª\u00159^ɂʦ\u00102TtҔӲ\u0006\u001e6Lat݇ޘߧoX\\[VL=*\u0012b/f\u0011Mq\u0000\u0000\u0001\u0003\u0005\t\u0006T\u0007\b\t\n\u000b\f\r\u000ep\u000f_\u0010L\u00117\u0012!\u0013\t\u0013\u0014\u0015\u0016\u0017\u0018\u0019}\u001at\u001bf\u001cU\u001dA\u001e,\u001f\u0017 \u0000 !\"#$%z&d'N(9)%*\u0010*+,-./01y2g3U4D526\"7\u00118\u000189:;<=>?@}AoBbCUDIE<F0G#H\u0017I\u000bIJKLMNOPQRSTzUmV_WQXCY5Z&[\u0018\\\t\\]^_`abcdxeffTgBh0i\u001ej\u000bjklmnopqlrVs@t)u\u0012uvwxyz{n|V}>~%\rہrW; \u0005ϊ}bG-\u0012ޒēx`G/\u0018\u0001Ԝq_O?0\"\u0015\b۬խЮ˯ǰı²µŶȷ͸ӹۺ\u0004\u0011 0@RfzƏǦȾ\f*GcЀџҿ\u0003'Lsٛ\u001aFs\u0002M6+1M\u0004Z:{\u0000\u0000\u0000OX͙~ʹ~y\u0014~eL~j~Qc=9\u0000\u0012\u000f~|4~cl@~]̳~nf~C\u0018~لOiZ/gP8\u0014v}6q}0}>ϲ:}i^},~\u0007\f׉_L\u0003\u0000p\u0014K-~~,*~&E()D\u00079vyowy=TS3wI!\u001dD)J%OBvw\u0005\u001fN<i\u0006_ΝDgA\u001b]3w^|\u001e<~]\nbʀ}S\u0019\u000eW?CN\u0004<\u0016\u0019\b-Y4\u0007\u0010 BYpzS\u0001)j\"{%>64;\u001d>FVWm\nS^Di\u001a*b\u0004Pkp\u0005ة?\u0004%\"1#!ϼK`\u0015L<\u001bn-e2*+)\tX䥂C@v2l\u0010\fQ?(=0q\rMzǃIz7M\u0013EY;\u000bY\u001b@K (-\u0000\\U\u000f\u0003&>rI^2IM\u0017e;Ya\u0017\u0004\"VN\u0014,S;o\b_\u001d%\u001fs\u001eD;f\u0006Ǝ.R?l\u000b;\u001e0Dq>\u001d8zDKG)3o+&<4@n͗0\u0004\u001b\u000fE\u001b\u0016O94\u001f#Ґ\u0014nW9\fb\u000f\u0016_\u0016\u001f\u001d\u0012\u000f7}B2yːv/ąJH삻Ȧp$ȫ\u001bވy;Æǘfo虔F\u0016¨Ls\u0017I\u0012,KhW2!\u000f\u000eAjHE^τ\u0004\u0017 _w\u0019dlX\u000egg\u0007Ωr!\u000fjU)[\u000f%\u001aB\\D\u0015Cfp\r\u0005\u000e<_\\?k,.wȲi\u0000rJRݐ=>0+cvZ{\u0013\u0003Hll\u001cLVAc۠\f^{6\u0015oCҏ\u001dS\u001d\u001d\u0015\u000fمbȏ\u000f:sz\f\r7jP@Q\u0017\u001c;[\u0010wg\u0015|z30Uq`!P\u0007-~|\u0001X3+z\u000e2lIђ:\u0013_<aXS5\\}E^\u0011G\n\u0018XJ4\u0003^Ƭ\u0006w/I!5\nbn#FO\u0000`.ܙ-J\\!gZ0\n)\u000eݥq\u0012\u0004 A\u0004ßOkV\u001e\u001a^Bf8KĈ\u0015z\u0017a>\u0013p-FOJ*\u0013Yr(\".\u0004\u001d\u0013O\u0006'\u0018\u0006q\u0018ä\u0007frCRJ'\u001fdc~h!?`}WzBd;hѲGϲm\u0004T\u000bSAij\u00119< \nߨ%@`\u000f8xLT\u0004qė=\u0012\u001e,Mk\r\u0016$\u0014hJdx\u0013_r̰gʱhtG,K\u0007\u000f\u0013\u001e\u0003ytomVK0X?R<J%mq<UG]IX't9E\n$Vt\u0000\u0016ܛ8i(GT+\bt\u0005ԃ\u0005]\u001e6k\u0013N*\u0016d$m[\u001fw_L-h\u001e\u000ek,Ȭ\u001c&º\u0006\u0014^>=\u0010Џ\f]ٛ\ba`sʠ7\u001cg&\u0007\u0002Gr\u0015ŀ?>\u0004r&z`b>\u0013\u000f&z\u001e%sx\u001eb\u000fw&{~\u001dڅ]\"W\u0003R\u0007%c\"z\u0000D\u000e\u000bzA \u0013\u0018rs!֝=jcf]r\u001fmANJl$\u0000ے#ؑ\u000b>wT\u000ef\u001eGFF699<׵.'\u0015SZ\u0011*˺#-Jl.\u000e\u0010ZZx%m*|\u0004\u0003\r\u0018o\t2ӝ_T\u0011W\u001bK4\u001eeRsu33'jRF\u0002B\u0011\u0001Wl|\u0006\nF\u0011gml0\u0007L1\u001c,\fy+Hu2f;[T0BE{:qn\u0017t\u0010oT]ok\u001fI,\n\fLgV_R:Kϋ0dP?=\tvE̷փ(M4m\\\u000fTk׉o,H=\u0012Z\u0010w\u0017/EI-LQ[\f8F/g֖'$\u0002\u0005?[u\u0015~fghXjݚ-\tVIm\u001cKՀ,%ib\u001aQ\u0002*e97W\u001cK\u0007MYiHtX\u001b\u0018TBUD\u0002w-49#i\u0007ԗ/\u0012r]hGވ/\n\nlD2\u000bh%TTT*Fdw\">GY?\"[f\b\rr5\u0012\u0011ʊ4\u001b`\u0013TAo4H5rW\u0001S8X\u0013y;$Yr'q vUP\u001fV&\u0004\u001a4m/5LJE:\u0003S\u000e7\u0015Hvy.. \u0000kP\u0000\u0000XAl`\u0014\u0001\u0005\n\u0010,e:\u0002\u0014\fE$@BKr.!{A\u0006$A\u0014\u0005,CY[EA;|\u000bTJkU>41\u001baƜdcT\u0005.\u0003Us\fR&Bch\u0004R)\n Pd;ʟHbl\u0005?1;\u0003_:i\u0007^mMh9Ӝ+,x+(j3=P6u>a}&b\f(\u0003\u001f0=.\u0017À<\u001f2&m%u\u00069_~zL\u000f!\u001b\u0006S`(6͟>թV\u001d\u0006lW䨸m5ypg!2\u001e<\tPR%wC>\u0015u\u000f\u001c\u0002bv\u001fbF.0UK$K;؂P,!\u001frA5%\\v\"\u000e\n[2gwdxJ:_'Eښ_+^Cژ\u0016 I!\tv,V72UJLNITU\u0012KɎ\u0001Iy/\u001b\u000eR+=\u0005+(֨v\u001b6\u0015!M\u0011\u0012\t@PB%R-\u0013-3\u0006|4-\u0004\u0003\u0013)#ͯ\u000bw\u0012.ܘ<;\u001eb#;*>$eG\n>3\u001d\"\u001eو~AZ$xO\u0005Ux\f\u0002\u001e\u0015f𜓜x;٥Q\fh\u000bX(\u0007Zx=`d\r8bi\u0013d, ϐ!enZ\u0014\nb\u0001\f/޲І2P0~\u000b+1ba\u001d\u0011k\u0012\u0005\u0012tT\u0000\u0014\t?g)˧9\u0011\u000bС`\u0005.ޓ\u0019\u000f`>\u0017'4\\DRdPaxԗ\u0012\u001c?i|9\u001b\u0016,t\u000bĴq]\u0017\"\u0012m-9OD'E\u001e\u0012x>#B\u000ez6\u0005N\u001ek%tm\u0012\u00066BDzV\u0018Q\u0019G\u001cq,2\u001fO:\u000by{iH\u0000cy\u000f[]va\u0003ZT5 ȨR\u000b345N\u0010@qG!\u001bfYXr{3^\u001d\u0005M\u00167HX1e\u000e\u0016y87ҙ;NP\u00079tn/D=\u0002}*I:2s̋%\u0013\u000f\u001f\u001bG{<IedX\u000fw395Iot=ޓ*\u001d\u001f̸'\u001c(#^s\u0018\u0003{\\\u0015dYdSj\tV΢\u0017T>7\u0019\u001a\u0013a\u0018b\u0011\u0004\u0019\u0000TBm6\u000f\u000eۺ4JZmI\u001e׶Fהz\\FD*rEy\u0011\u001bք\f̣V-8ˉi#7Xm\u0014ZLW:2\n$Iⷱ\u000ed`U+\u0002z3\u0003\u000b8\"}Y\\E^\u0007\\Q\u001fܵ)<&uZ!\u001cFM)V\u0014\u0001\"ڟ}&à/\u0001\rď\u0017\u000f\u0013\u000b5\u000b\u001bO546\u0011PW눤0\u000bfGlEbd\u0017c\r'ƪr\u0004\u0002Ӭ[\u0007{K(\"M/y\u000e%\u00050=\u001bzFBx}\u0010{w6{Y50\u0003%\u0006,40R}ԓvT\u0004p>K@fR$7HU(\t\u0017/10f<,1BS>٨RI3#&&pa5j\u000519#yTH9cI[էj\u0003\u0013U̟~\u001f?\u0004\u000b+\u00147NzM`k|-k\u0001qJ\u0003}(Ҙ2\u0015SaӼGi ; b:`uǤayU}T\t2Ftm̔\u001e%Op\u000fuD\u000fU0m~\u0019L\u0013-_:qWg\u00180~huw-]\fN\u0019VrP\r=<]\u001bx;Y1iw@8,n\u0018\\(z\u0013qb\u000b!$zB&5dn6\u001d1Q\u000e&\f &\r\u0016\u0011CuЎ\u000ey\u001d#c%$7]w'z\\\u0018\u0013\u00120Lk{8<Oz\to%4P\u0002˗\n9hz͊$LmxEFGO$Dcn:0td#*\u0001vT2\u0017.q0\u00186\u0014\u0012vgAԡn3\u0017l'H:<@I˞8!\u0013mRS\u0012s^\u001b\u0018Ug\u0011f\u0000B\u000b\u0002u\u00112L> \u0010;\u001afGS\u000bFx¬P\u000e~Km%t3M\u0019\u0000\u0010ccM(bCB$\u001b\r_ J,@՜ \u0000\u0000\u001f%ӸZ\u001d;.6B)PT~~:_tHNIT\u000eScΤ5\u0011_3bO6-[o\u000b7$cn\b:zNq\u0013\u0018nE2\u0007~7\\NT\u0014\u001a'\f\"[fTT^2F\u001d\u0017&+\u0013\u001bc5\u001fr\u0002~ԕ(j\u0017\u0015l\u000b48mWDC]X#<\u0016n\u0001_\tT\u0003 45\tC0\rV\u0010~\u000bm\u0001\u000e&AGA\u0005\u00047\u0013w\u0005@w;\u0003Q8\u001a\u0000\u0006Q\r?d9#1yʕ\u0013q_eS]y|d\u0010*&6Q\u001430J(WG>\u0005H\u0014\b\u0006N \u001dv\u0011Ag+[o:\u0016y1ډGm\u0005U\u0006V'p\u0013J{\"\u0016M@3X\u0005|\u0015*oƙޞ%sfJ<ߔ[-0R'G\u0018\u000bi+\u0001+qNPF\\&XT~ykPx>\u001f\u0005\u0017\u0001~u2LX'P\rMOW\trة\r\u001bZ?qU\u0014\\+w>-q}y/sRQQ\u0013J\u0007@7\u001337K\u001aa[t̷E8X,Tp\u0005!PV\u0000K$`Κ׵bu~*LlBz-<R&,\u001f+?AP]o\u0003LKِ\f'y\rY?\n~t-\u0016\"Xnv\b&\u0010?\u0018\u0001VAG\u001c+\u001d\u001a7W\u0005hK\u0002DYZ%4\u0005YF\u001dg[\u001d C_M6ЅLJ\u0012!)\u00179\u001c\u0012!6\u0014-l?@\bW\u000b\u0012?t`k;p}\n\u0018P>f\u0005{\u0012i8Db\u0017\b\u0013Mp/ŲF\u001c_<`w[Uq.\u000b\u001aY\u0003!'i7\bL' R\u0013\u0006z$\u0010v\u0011]c-ީ%HY~\u0005ٕ\u0004\u000b鞀ws{)Wa˹ԑ`\u0017{[z\fϡ\u0017Z&\u0004\fz\n\u001e-\f\u0005U@uBP.8jz\fB{G\u000ftϤ1ޕq#\r\u001a\u0006^o2\u0002N\u0013*`D\u0002Z\u0007m\u0007錞c@QY@Oy`ŕ^ )\u0003H??\u0002s\t%J@f-H%\u001a{#}řPK\u0000n@u5w:=Y\u0001X9(5#p\f\u001b9#\u0010\u0012Av(~-\"]Qb'䠡y\u000f\u0005a\n'\u0010£\t+v\u001eO@\u001b%\u00137_*Z-r*~z Ց4\u001c!w\u0007B\u0015pG-q.a+c\"wmqk=WfB\r+\u001ek^0>np\u0010u5\u0000㞃= m]0o\u0010\u0012-1:ǒ~%u\u001di\b;pVO/a3\u001b;0\u001fo\u000eKܼ\u001dL6\u0004Ed@ZU%\u0011{\r^\u000bͰyOVNHLm\u0017u?\u000eu\u001eMBEQ\u001f1\\IُO\u001f\u0002ui@L\u00117Nk\\\u0002d\u0019d[i|lRܰ3\"r\u0015\u001eW^ \u0019\n19~(V\u000eZQjs\u0016\u0019f\u000fb\u000e5~N\u001el,\f$L\u001aAE \\\u0018Yv\u0016\u00193k\"*\u0011Ie.gj\u00074uDk\"*T~~g^\f~\u0018\u0014\u0012<|1\u0006cPx7\u001dkF84K(/A\u001aI\\\u0000%H\u001eG;'\u001f6\u000e\u001f`kK\n\u0019ZJ\b\u0015AFqKq$5GT#.a<C]\u0016szO9\u001a\u0015@yQђ-\u0019DRP\u0015\u0016\u001bGD{\bn\u000fo\u0005^\u001b7PvU\u0014\u0019\u0019vT_F\"Te\r^\u00069^9(Zi\u0011\u0011\u0016*J|1\"].g:ETIFzN%T|k&JlI3ʌ+\u0015r^qfS\u0014NM\u001aXe\u000b$v{\u0017ꢫ?IB--Oi0iXo\r葚T\\.%kR\u0018&-?(\u0013m=?~3Jncu\f\u001b/mS<Ð,LeH:\u001ei_+MSVa\fk@\u0000\u0000\\Ѓ*+w\u0003\bqDS\u0001!he\u001c\n4\u00049\"(h\b\u0019d}+ɗ7\u0019\u0012\u0011\u0010)T\tbǪԪhm`Yջ\u000bs\u001d<\u0004-,@͋\u0005SC\u0011gZwN\tC\u001fU\u0016c\u0019W-JGm\\QA]Q\u0019]h&D0\u0013Zvnw%0z\u0015\u001d\b\u0016MTXI\u0015:l\u0012<\u001a7\u001c\u0004a`\t5P`ݰDhk?\u0013\u001a(b\t\u001c?`Fg\u0016ű\u0016y\u0014=4EJ0\tGvQO4W\u001fd SA\u0012\u0003nMC\u0015\u000e\u0017\nұ|`\u00077ø_vYIo\u0015\u000fRyYqE,D;&Q\\B\u0002xWr\u0013v\u000b\u0016t\f\u001e\u001d[\\\"]\u001aUˋ\r\u0003w\u000f髐\u001a<\u000b|\u0001Mc+\rZ9(W\u001cZʳͰft~X)Ui?m<P\t;G-_k&ڞI&ML<\u0011::͹7\u0002\u0018K\u0001ƒKX\u0015ѪW[5P7Wtt\u001cbE6ռz\u000b~0iWűہi4\r[$\u0004ki\u0017l$\u0004VRc4ӫ\u001fGk~ʿYQ:ٮHbFG\u0013X\f\u000e~Nu.\u0016kf\u001cc`m\rf4걳qVP~:U\u001c#/bE7K*W0]q\u0017=$ܭ \u000eXQM52ymBS<l\u0005U\nZҸLeD׊=\f\f\u0005B\u0004kLBR\u001f\u0013Y^\u001e#zA\u000f%ڥ`r^\u0005\u0004'UIo\bFg>;1\fp't.t-SSUn;QY(sў*\u0015M8=\nBHZ#\rGcD\u0014S\u0004{\u001cd',U\u0005tl=\u0017,}*\u0012vcr\u0015+]\u0013(_\u0014\u00111r\u001bØ@?A[KDlv'o>=ԏ\u001b\u0007[\u0015\u0012?Q\u000b\u0014\u001eô\u0000n!ܘ\u0019eoiB]u3PzP'ߧ%\u001e44Qw \tL7@\u0002\u0012?;gS\u0015\u001dVjg\u001fohop7s\u000fy\u0002\u001eR\\7V%xL|\r3\u0000\u0003n|2Q|\b-\u0012Go\u0018t\u0016\u0017uV֘\u001bGk\u001f}fd'̐yQ/;^+b#&~ي2(\u001a<c 3;n`92\u0012[\u001c\u001eLqzt.\u0014)<lJan\u000b\u001fX>ɚp\u0003Tֆ\u0011)$Dru\u001b:5zj,|~0T\\~>\u0002*,6\u0013\u0005Y\n]7E9!\b\u000f7;au*\u00178Y?Ң#\u0000W\u0013\u001dfi\u001fA\u000f~\\\u000f\u0006mB\\$O\u0006wD\u0019\u0000hE16:_J\u0005qBR\u001b%\u0013*X3\u0012\u000b\u0018\u001c\u000f!\u001aO\u0012:\u0012`I\u001aok\u00142+}\u000eY\u0010'1\u0015%Y\rGPMJ{rK\fw\u001d\u001d\u0018_\f\u0017L&N\u000bNy\u0004\u001fA\u0000'\u0017ճmﺾ\u0002o4gz\"v;L\tje\u0006\f%Ɯ{\u0010NS6U'*\u0006@d\u0001jNc\u0014vo^\u0001=Bi\u000b795l\u001d\u001eAⶫ627ICky\u001cV_}B.I=\u0012YR2U^c\u0014\u0012<z\u0011+\u0003w@\u0013b\n\"\u00168ۺ?pGZ:\u0005Oȿ7\u0018ÝTԐI\rJ\u0005Ax߹rxn?(؁\u0000wh?F\u0011OG\u0010j{D\u001c\"LaWe\u0017}j w\u0006*62y3r3O(1;LSP\u0005\u0002pa\u0001?\u001cU}cqT/+~3Mҫy$=IQRS$@դ@&\\l+\u0010\u001ff\u001fEI\u00161kڸvx}_nϐ\u001aMfB\u0013y\"m\u0006\r\u001b9nQpϼ\u000bϺe\\I2\u0017\u001bGt3y\u0005)w%\u0002u$\u0018w[\u001a\u0005\u001a6\u0007o\u0015\u001e@&zܞY^Zw;<\\bm\"\u0011{3\u0004\u0017\u001e\u0002=\u0013s\fSNӐov(D\u000f\"idM\u0007֬Lใj9Z\u0019K7_<ېø974P6\u000b\u00050,R?\u001fD\u0001\u0000m6.Dt\u000ehe3\n>~o\\Ƙa\u00183\u0018Ƹ2@eU*Tlmcӱ\u0013\u0000~ x\u0018\u0005nNU\u0014)\u0019o`Iχa]P\u001bFŚVTC&ϣ࿋Y=d]/\u0016\u0019\u001c..FBXs+$=}b\u0016uM>\u0011RWm\u00116Ŗ6ᢐFX 5\u0012x{v*\u0003j;zv<_~\u0000AVUJϐ^IjQxｼuQo\u0015\u0006=lK_ՑEkZ\\4sqU7vOa J?\u0011Q)4C\u0014^\u0019\u001a\\\bk[{3y~\u001aM|J'g\u00034Ay,$0( \u0005jHl:Q\"V҉1X&e\rs)M\u0005Z(W\b\f\u0014|Ϲ\u001a\\88&tcpҔ\u0014a\u001c͔\fCC\fGU$^fb|8u̸\u001d&A֍\u001f9ke\u00177;\u000e㥦koAv\u0003Տ0o5\u0011y'\u0001\u001b<!HP\u0012\u001f4\u001d|\u001ayC{_2elTr\u0002s*\u000fIdg_\b'\u001d\u0003V\nFv\u0006z|\"\u0006ƞ\u000eҩn\u00042=3[\"st\t}N8`\u001e\u001f1`Xi\u001f]x(\u0001U2\\o[v1\u001bd%J\u0016OO&rؗ0\u0015ܵ9\u000fYx\u0016ݨ\u0001 \\\u001eD\u001fm]=Hjovfd):t\u0019bdH9\\\u001dϛY\u0012\u0015?8\r<%}dVەhnuӻkV3+(+$\u001e-#Ջ\u0002QҰ\u0017ЖX@h-Nd$\u0015a>M3\u0016q\u0018\"\u0013y\u0002$[Y@SgÓ=ݎ\u0014P1)L<d\"dr\u001bՕsW\t\u0001DJ\nt\u0011b\u0011\fcj\u0016*!Aq\nhG|3j zO\u0000\u0013\u0001\b\b|\u001cN\n\u0019\u0002*π\b%2#\u001eǓH\u00167!\u0006\r;v\u0000';\u001dO~hĥ%,v6BբTxDv\"L\u0013t\u001fï\u0005K\"N#\u0006.\u0017ec}f˺\u0010\u0001d&\u001bT\u0013R\u0014AS;Yq\u0010!\u0004E,\u0014AAm?~\u0010[7\u0010\u001f[\u0000\u0013>\r\\!B\u0005;U!)/\bC$N$A³ueuU},3Y'/Jc\t.8_[\u001cO\u0002\u001f\u0015N-<\"NawG\u0013\u000fm_+yj~P\u000e]ſ^\\y\u000b\u0010\u0015X\u000f\u0018\u0003,r-\u0014|\u001f\u000f㒒ܳ\u0019<\u001aL^T},^eDR,nkqց%|\u0017r,!gJx=~p{\"\\ee\u0012EN;Þ\u0000=${q\u0015@Q_\\?/иLe>u\u0005#Mp'Yn_e<\u0016q\u0013㼅Ra8p\u000f\u0014LB=(YK\u0018\u0001[l`B\u000eK\u0006B#4;c;HS\u0019^OA\u001a<J\u0011~I4,$\",B\\HV'\b&\u0004fಀ/pO_*\u0006__#&l\bWcK\tBZ(\u0014|Zb+|KpT\u0016\nAr3v\u0004*>\u0011>Ʉ\u0013x\\+0lkOԼ`\u0000Fcfup.wl\u0018\u0016CnKJIi\u0018]\u0007&\u001af\u000f\u0018\u0003XPA\u0005\u0001n1\u0019کFTKBo\u0012\u001bI!\u0017ӮZ f\u001d)~X\u0011hy\u00179\fݨOC\u00035\u0015&|T2\u0018Ӳ\u0012nSLB\u00155eD0:\u001eyP;\u001a(w\u001a9mΪnWhKu\u0003{`\u0001\u000ew\u0019k\nkH>*\u0002ڲ\u001e1\u000bwp5Q݌$\u001e;\u0005LvvJ\u00021f3n*\u0007Tg@oO#9\u0011|}?V0M5\u0010.\u000eۀz{\"\u001a\fNK?C_$\rP&B̆e>(\u001cq\u0001Iu`|\u0018o\u0015\u0012b|\u0017_0l2WꂝsC\u001bܴLT\u001dI\u0010a?f(/+\u0003PIwB\u0004\u000bWhgH\f\u0000\u001eEiŮ(G6\u001c\n\b\u001c\u001c\u0002\" \u0012\n\"(\u0010\u0004H2̙dfr\t$\b\u0007xZE\u0014\u000fP>ţ\u001eC\u001f~\u0019\u001bE\u0017F\u0011:}\u0015<\r\\{\n%\frH\u00136N$(߫Nᷘ_%1]2:$\u0002o\u0017-8ȥ \u001fI-\u0014qt;'kTjJW^}k\u0010fQU\u0011r\\u\u001a\u001elN\u001dk\u0017Hn᫂H*\u0006W\u0007\u0007d6\u001cM2\t*{\u0010`\u000eV%VR\u001foJJ`+\"yO|s86Vy\u00128\f:+\u0015;9\u0002ɨ=.qq\u0002ѝ=ɥ\u001f^\u001bӏw\u0002ldG\u0019;<bSh\u001c\t\u001e\u0000\u0007(%]\rN}uAܹ\f`MV\u0012?g\u0012=&o\u001a:R(tWS-{66CS\u0007UfoEIhzE\u0013\u0017'ܜ&\u0005Q8,g\u0001]-2t%F@}S|QJĜh&S콧b\u0003or\r2wq|o/$\r\u0001Ĭ7Aң\u0006\u0002I\u0015MXIc>f\u0011H^\u00072\u0010`zBȳ\f\tŞ\u0003O*{M2MoR0\u0005i:T\u0006~%$9ED\u001e~cj<\u0017}\u001d\u0005${.-+P]c=Vzpwz\\S;!?\u001dC:GFIױ\u0013qY\u0018\u0016Ş\u000b݇>;\u0001\u0003\u0016]mS)yr\u001fEz_n˕\u0015aI\"l|s\bG\u000e\u0001\u000fvmߵ\u0017\u001d_7\be]֭>Г\u0018U)i\u0005:D΂G}V W5*{\u0018f?\u0014\n($p\\)9D$ZYr|(4D܁OH\u0015ʳ\f;ܫv۱jxLr_r\r;Wi\rnV|\u001b\u0013Rudܦ\u0000;@\u0012YN<qIȗscE^M|Kƿ6\u000f#Q쀫Hl6\\\u0006\u0006r\u000b\u0005\u0001\u0006EjJ\u0011K\u001d-β+\u0000x=j1\u0003(\u0003~ǒ)C[\u000fvQn1\u0013\u0018򑾪\u001b\u0014xV\fa\u0012u\u0000I[\u001d8\u0016m\u0005YGe\u000fLV(X/%W}%\u001c\u0013\nM]4\u001fǽAߗnװ\u0002Q\u000fԈXtGdƇD\\wQyR>l-QnJȲc/14\u001eC:'K&̕BOJ\u0003{ߴzfsW\u0012|F-q\u00022\u000b?}Y[pXdY<\\v+\u001eM{i\u001fr8~LJޯ\u0011\u0017\rvlL:\t?@\u001b\u0003\u0007o\u0013\u0006[g`}>?Ur\u0017ǛI2L\u0017k.}Gp\u0019I8QRV%܂L0/\u000fPU\u0013E\r?ɹT\u0016cۼf\u000eHs\u001a^QMC!)\u000f$\f;\fej\ruIy\tW\u001c\u00186#LMi9Ħͱ\u0016P*\u0017HʘF\u0013g]m\u0010ߝn+|X$Z6K\u001b'\u001eOQ\u0013Jq \u0001\u0004\u0007m(B~ljSuZ\u000bť\u0003bhWP\"z@U\u001eV\u0018\u0011J΂\\,<\u0002\\HA\u000b5\u0016\u0000Oaf\b\u001f΍C\u001875O\r<x5\u000bM\u0012KQ\u0006e%Tfʤ6\rS\u000bsFtTOUt(\u0005\u001c2\u0006\u0010[\nES!.?Ӕ#C:[6$ߴR2G[DUcbDx(M<\u0016}|y%\u000f\u0014}ђ\u0018HmzyEy)9Didh(C\bpKo\u0005Y9_\\niQsƚӮkX36R7U&\"cT4Eʈ0X,t\t\u0003:T/>\u0002Uݮx\u00127F>Q\u0017L~:ʥ#][eTS2%\u0018c\rÆ\u0006~EW\u0019\u001bg9\u001b\u001ai%3W4ފ:}޼0_\u0012X|\u0017-ƣµVu\u001a\u00058H{Y\u0016F\"qĔ-F95\u000fE\u0001!\u0019L/\u0005\u000e3zL\u0007w@\u001d\"\u0013FRm\u0010O\u001bQ&[#\u0017\u001dZO/x\u0012ˤr~9T00bܬ\f4P\u0007ߋb>_nMFY%<ip\n;Rx@\u0017|q\u0001j\u001f#lj?Ap\u0002\u000fe\u0000\u0000[ۊx{\nsHt\u0018-bM#t8f5}sc0f0\f\rCcBKRmcEkץJH[ۢŚ<!)NoO\u0013CI}52\r09\u0018tMب\u00167B\u00150؋\u001d0zD\u000bK\u001eYeRUJ\u0012\u0016ѐ:N:\u0015:,#\u0012D\u000e~6ž\u00104o1l`q5XU5G\"Z4tX\u0011 \u0014\u0011\u0013\u000bc\u0004Vu\u0012{\u0003_<9\u0015\u0007SN\u0004}h%{nԾ\"V}V\"Cw}t\u0012)b3zFjoK\u0012\u0007\u001b\bj2'Q9\n]\u000f\\Bȫ\u0015r1\u001b\u0007.8C|\b.x8~pGm\u000e<ϰ\"iS\u0005˨\u0015\u001dڠ\fu\u0017[)Ek+WE8x5\rqg<k~[0\u0002n&\rˊڮcAa\u000bJúg\u0010\":\"].f\u0016f5\r\tRuBTu6\u0012u|;\u00134R\r'hN\u001fp\\@I\u0002!Bq\":*pX'%O$K#(\u001c\u0005}\u0015\bvW&$nx\u0016TeحkU^Ik\u0012Kl\u001c\u001cY+H;\"\u0001^\\#G_KmR2\u001ayfbI\u0014-ب:ݐ$;8$N(Ӊx\u0001a\n \u00041\"*.d8\u001b>MOaN$ʡ˖~\f&($~\u001a>\u0010tBM%^i\u000f\u00153ϐE\u000ef8UB\t\u0000\u0004\u001d'\u0011`-\u0017icIaͨ+\t\u0010دR=ZȾ\u0018Ł\u001b=5\u0006U#5H\u0017\u001bR\u0003>njk\u0002y/\u0012s6\bH؃E\foLy\u0007\u0015CG/?QE%FvMMz)=ZB.\u0015ϡƋ/3O\u00048\u00035\u0017&Y\u0017\u0016\u0011Kլ(\u0017ST\u0002 eҝZV\u001dx'\u0003xaV4Ë\u001c*H]z~h~\ri0d\u0018,K\u00128CZy{jC\u0016F')\u0012b\u001d\u0012|x\u0015NJ>V{0e#|SE1b狛*_\u0017R\"\u001e\u000f37\u000fBoξ(p3\u001b_\u0014<ݥ%\u0013\u0003-tɫ\u0010\u0004\u001bBetƓ\u0018px H\u0017\u000fuRuɵ\u0007)H?m\u001cf\u001b@Iz͂qrgM_\bD|\u0006Ce\u000e\nӯ_\u0015wCՄYK/Ԩ\t佨/Y0y̸\u001d7.\u0001]*ѳa !d\u0001[m9\u000e\u0001#{-;W\u0001[\u0010\t\u001c\u0019U$mb?ci\u00063ؘsq6\u0001ĂT\u0003\rt\u0006\u0000֠}\fdl\u0015v\u0007{\u000eF\u0003yt/ټt̰K\u0012Q8\u000f\u000bN\"4ʻc\u0000'׸Ns6I\u000b<fWϚvЕ*҇T \u000b\u00139\rI#{\tmVx@.\u000b\\EyT}W*fҿSѵ:'hPofħ/\u00057n\fu3֭Fcȶ\u0007T5\u0013yŴѪ\u0001\u000eLiӔ%v\u001cI\u001fG\t\u0014\u0003ɒ3m?PH-k\u000b;\u001a?vbkk\u0005Չy^4o B\u0013\u0011[\u0002*Bo\u000eR\u000b9^FtbIydW\u0002$ګږ\u001cNT3VYzl\f((\u000fm\"Ua.\\vzC5H8H$?sZ\u0007\u00196=:\u0001hhB\u000e!É8\n`,\fg\u00146$cN!Lp<\u001db<\u0014\u0012Nz;\u00050\u001fy%\r)\u0007\u001c\"\rDB@\u0007\u000b;\u0017.a$G=W+vF\u001bv-|d%ݿǁgOŨ\u001e;$\u0011KFlbu#^$(b\t,jdM[skxv͆c?sBflSkMe͈Ly\u0003i\u00143TZugv#\u000eV'{\u000fF,8+5\u0006%\\Y`kY o\u0004C,VQ\u000f\"Bk5Wjؚ\u0011\u001d\r\u001eaxhk\"\t\u000eAƛ/d\u0017X!\u000fxJ\u001d\u0018\u0002(}~&\u0014|\u001d\th?\u000e.\u0013\u0004\u0007XS\u0007\u0002\u0000qX}|\u0013\u0010#Cic\bhK\u0007\bVF @ dw^NH L\u0011\u0007\u0015\njkujVJE)\u0016swm^\u000bVQe^*\u00177cSu\u00135.:5!{3A/u@\u0005v?aDUNCkH2)\f1z%9U鱛\u0001v򹰗!k0>]\u001b[#?wsb\u0006,4U\u0012\u001f\u0015_\tf)\u0010Eď*\tuä6\u001fG\u001ao7\u001b6ɵ\u001d{\u001f'\u001cC\u0013Ga+RUA=@5\u000e_rgs1OUG*\u0016\u0010ʚ\u0003O\u001e&Q͡\u00104%\u0001\u001cnlc=%Z\u0011 v\u0005Y\rZeਝ\b4\u0006?\feC\u0003`\u001c\u000b\u001c_wv\u001fĦ10\u001bKB\u0005\u0003/*\u000fBrv\b4\u0007όw\u0007M\t0\u0001\u0018\u001cr \u000e`$\u001d\u0001CܝGa6;g-\u0018N_\u001b\u0004&ɰ.`\u0018\u0013\t\u000e\u0001\u0016`0M\u0002/s\\\u0014PMf`p3\u0002\u0000\u0019\f\u001c$\u0002\u000eA7\ti\t\u0003c(y\r<N\u000e6\u0000e/\u0002\fcPOjm+YЪ\u001eCz\u001fXa-\u001cT`aot\u0010t._\r,q\u0014gOI]@\u001af\"\u0005\u0016\t\u0013?4|T]T7[\u0018r5+\u001bD4UffN]Ϭ'MddY%A'\u0015-:x>\u001bjӍ\u000b\u001b5!UiMSD-rBFL&\u0002\u0014^\u0004:O\u0014\u0002F\u0017-T\u00174w\rT3c\u000bq]2\u000fR\u0003\u0019d\u0016/3U\\;\u0006?Up=@b\u000f\nTYRJ3O)*\u0012+\u0000\u0003\u0002sWu.\u0007[\u0017L6ǼA. 귒\u0013h\u0010oN_=C|HW\u000f\u0012\tGz}\u000e\u0005w\\2h{\u0019?U\u0016r_ס\u0007,[<\u00174\u000eDmD\u0007〷\u0001\u0014\u0012C/\u001c\u0002Fl\rMr\u0001_򑹾g\"P\\TMIiDw\u0016$=`\fIӐ\u000b}\u001f6.j\u0007Yx^h}]\u001b\"\u0007]l\n\u0019\u000e8\u0001\"ӽ΃ǐ\u001dL\"Hڝk:^֖T\bm\u0017\u000e\u0000.\u0002\u001b^@1\u001b~qxTlU\u000f#U75:LE|4&W25exz*̖̆;M0do^lpmaIS7kD\u000f\u0013#'͊$\"lL\u0015?b\u0003AD\u000eINmEh\u000b8Ԍ*\"vұE\u0011\u001c\u0007݌5\u0004Z5\u001d\u0002\r`z\u0013~\bx[M\u0000N&a\u0000|b\b(\u001fǁ$ch\u0006\u0010\u000b|c\u000fq)M_Ɔw>bSО$\u000b\u001a\tDp\u0017\u001ez!G@\u0019o3\u001e\u000f\u001ca]\u000e\u001bPnN2);K4 U\"p+q\r7b\u0018\u001a\u0014L\u0012ay$\u001f04iCc9(6>E3a{ R䏡0`?s07y9'`Lq\u0002\u001f`Sc\u0007L\u000fr\u0000&MP.ڽ\u0002,_ru\u001e\u0010\u001b/F\u001b=܏=1ltŜ\r9>1lם\nKX_\u0012t+\t\u000b=\u0004#ثL\n\u0014uuW\u0017K̹\u000bu)F@\u001bjR_$\u0013YuBśGbQl+$\u0014,o8ql\u0016g\u001c!\b\u0017)\u000b\u0014n2\u0002Qή\u0005\u0015U>Ytw(^\u001d'\u0019Y\u0015\u0015\u001d! %GU9\u0000, &\u0004>YcwU\u0014\fMj\"\u001cZ\u001bo6VWF9\u0017=al\fm\u001fy\u0012nqA/\u00162AI̐i\u0007\nqAN?!9\u000eNxlbO{eiYQ̶>SZ\t.&s\u0005bj?1\u0019\u0004_\u0010ǡPkٟ\u0017\u001e\u001ax`дY!n6fVJ\u0005?ffon0\u001b6l)7\u0004BuyMAѢ&m>>Nj#4J%&|\u0010\u0014\u001eE]ۊ:i2g0io*6zX\u0013h\u000b+҂\u001f3;1\"2ҍ+O?Kja\u0019\u0000\u0005\bY|nMH\u0004pA/LsI5cu*ΐDx!W\f{|m\u0003pq%qehrYbBt\u000bM7uA-\nw%5,x+\u000b\u001fz!Ί\u0001}\u001f|%wpȩx\u0005e\u001fXx|Y\u001ay$M\u0002}yA\u0012z5\u000f{+=\u001a}5\"6\u0019~{άq~p^Q~Md\u0019~*X~,LU~S@~5\r~+f2T\"P{pUIp\u0000<dG\bX]'LzJ@ς\u001f5)+gI\"ۇ{\u0019~\u0006oec,dX\u0016؈\tL;o@}5^E+\u0011#\u001a\u0016zЩגoycơzWܝ\u001fL\u0004@E5+\u001d#NzOoK/cW\fK՘$B@W|5%+׊\u0005#xAqzt&oMɜ9clW\u0017K×@V\u001f\u00005+@)#\u0000qhf\u0004j[Ű1lmPʪnpEХip;\rs\u000b0Xu'xz\u001fr{qDof\u0012p[ԯ\u0002qP䩪sNE\bt;=%v15\u0006x(\nz WW}\rq(vsfv[wLP̨Ox\u0013E뢳y\n;Nz11c{v(_| ׊b~mq\u0007C|fLo|[y[|P\u0003|Eҡt}\u001f;O}1~/(~!Ep޵\u0014\u0014f&Bp[Q/PtہgES\u0018;P1ƀ(Ā!ހp,Rf\u0013O6[B5\u0011PcE`;U\u00051*)\u0017\b^!Hpy`f\u000b[>f\tP[\u0010AE;Z1ٓ0U)Fj\"0΂op~7f\r![BPY_EE;T\\1撠C)k\u0012\"dj\u0015pmf\u0017r=[M,1P\\ǑES;`Ћ1')}\u0017\"\u001cΡm\u0018fni=pkqr^mt\u0012olVur\u0017X wtD\u001dyw'0|Yz>̾jqźjlr`nt\u0006pu0rnvgkbtgwWIv~y\u0012Ctxz0b{x|bh|~j|l|^n|~pp|j\\s\u0017}AVtu[}Bw}0\u0007z~l;fׇ\ri\u001b\n9kD\u0016mh5})oviNqꂿUtX\u0003BEv=/yVǧeP{qgi卞|l\u001e{nohLp(TsuSAv@Z/ryX\u001b_d\u001cִ2f}\u0003}hƖ\u001aMk\u0010/zmtLgdojT3rxAKuI/8xσ[c&\u00125e[}gܞrQj.xylfoDSr\fd@u\u0012/\bx\\\u001dębp vdܫg%iwy3kyenbS\u001fq\u0013@to.wU\u001aad`R\u0019fWh-xkk\u0007emn)Rq\u0015\\@?t@.wZtf4uhvjxx\u0001m0xy\u000eosekz.qR|{itP?|w\u0014-~zK'rp{sqԜu#s\u001evFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv\u0005|\u0003cwy|Q\u0007y\n}\u0004>z}-R|~H(o\u0017Ypq݃^s=uPt;bvSPPx\u000b<>Ay-\u001d|0\u0018m{o\u001b\u0004pzr\u0000t?s^auQOw+T=y>,{¹luSm\u0000oou{psGrla\u0001tqO\u0010vk?=txj,{\r@k\u000bm\u0016ܖnlp\u001frxqؔM`WsNuȌ=&x\u0015,zj׫4lgm\u001comqq0_s*9N uI_<w6,z@ja観k)m\\|2nq)p _<r`Mtړl<wJ),zy}!eu}Dh,9}j\u001c}lpp~.o\u001f^~qL!t\";w\u0001+\bzU{\foKj{ipϒ\u001b{r>\u0013|2so|u\u001d]}@vLO}xT;\"~z-*|Ly(x*yyr\rz$y\fgWT\u0007\u0002a\u0015ˢĮkTd@D\\dPPp-HG&]30;s\u000fCg(\u0002 1DE*n\u0004\u000f6ܵaz\u000e*&\u0007<//6\u0005\u0004\u0010\r\f\u0006\u0017O\u0003?Q}0$\t8\u000b_{\u000e[w\u0012 \u001a/!f\u0018Umx\u0017rI\u001dWB\u0003\u000e5(\u001f\u0010)\u00032\u0006.$\u001e5Uo\u001b\u0015}Z!OO\u0006qm\f\u0003>\u0004>P\u00013ĸg\u0015|\f\u0017\u001d,X񦁓`S$>BG\fDǕ\u001fu#i#\u0002܌-`\u001dxJ!w\u0002\u001eم:(\u0007`[HWeQ2UFD`|\u001c:Cd\u0005\u0007\u00052\u001a~Tv\u0013\u0014kdEeUb2<o]\u0018^j\u0012\u0005j'{\u0016@sJɻu\u0006iWŷ\u0000oW\u0015s%PFUV\u001d6\u0013[f\u0001\u000b\u0019ru\u001bOCU(5?\"//b;\u0014H-O\n\u0010o_%\u0005{\"b\u0004Hk&9q\\W:r\u001c&\u0019G%2.i6D1%~F+~ZC?\u001d8V\n2#⮪\u000bui^#v\nNL\u000e\u000e\u0005؏SEZLnÖ`\u0015=l\u0015\u001dva\u000e;(>̽\u0002p ʠ\b~[\b@Qd\u001bF!7H\b\u0005$\t\u001b\u0002#dLt\u0013\u0011!BOK*G-iCrB\u001e.Ul\u0011mO\u0002>\r,B2W<\u0010+36\u00137ߛ@\u0013\u000b\u001d)۠&KO\r\u001a0ޏ\u0000O\u000e\r\u0016igm82\u000f=D 4FB\u001b[!AIb\u00014~\u0005Z\u0000\t*\u0010fz\u0017\\\u0004Ot\u0003F&\u0002ӝN&3xF\u0000[Hjz&3n14\u0010\u0002bM\u0007 zB!\r\u0006\u0017|+\u0018\u001e\u000b\n/\u0006hw\u0016{V\\lsTjg?қ\u0012۟u 깮D}û.5ʺ(wM\u0012\tұ=Lj\u0007eo(u\\\u000by\u001fPXƢ8\u0001p2\u0015232\"uh0\r\u0000;(3-y\u0006bݷ3\u001aWd\u0019sF@w\t,8#\u0019!H*\u00159)iF^\n\u0010P7D\u0004g\u000e3I33D_\u0005)\u0013J\u000eQNdOm2ta':=J.۱\n\u0011s`d+\u0014u\u0013u- ǵiȵ\\L\n\u0001kw/i\u0004&G1|91:H^\u001cgW@-\u0000Eif?QF?/Kv\u0005řMkz݈uN0:ӎ3BJ]PU@׊V\u0012V\u001bz\u0002\u001fDPC9>RTl{=\u0016EY^Sc\u0001yjN\u0013\u001896b~mwj\u001c\u001e[\u0013\rZ\u0016l'd}\u0004[YގM:t\u001eU\u000e9\u0015\u0015WI-#d=sѣS\rIKu\u000fƷ6i/JO{s{\u0017c@6o\u0007PU,'9cV~M6I\u0016Q\u001f1WwoT+mlF0\\Od?o\u001ai4M4MC%HfM[r0p[\u001cp\u001a|R\u0004/L\u0010d/_c8\b]\u001e׍\u0012\u000bYpFKM(\u001fE\u0010wo\u001e@\u0004jj\u000eI0/kad[H\u000f>|/ѓL\r\b|00SVRׂV2\u0017Cæ\u0010av\u000e4\u001ax,'L82\u0003'7\u0006&n&\u001d\u0004CĿ\u0016\u0018f]\u000f9-f]i<?h_]ǿ\"a5!\t+CQ\u0005O}D\u0003{p\u0016\u0001՛\u000fx\u001f\u001bէɰiX\u001b\u00061kt́K\u0016Mw:\u0019h\u0004_Id)[`\bm:'1\u0013f%s7^V6,0\u0004|\u001b33~+\u0016䔓*\u001bo؜wPPK\u0014\rW\r{W\u00170.\u001b\f^\u000eMq\u0006'\u0006r>{T\u001aa4EeNٟή\"V_ǔ3\u0004\u0012tf6\u00135\bҷ, jP\u001e6E\u0015x)ͻ\u0019USu@6M6d\u0017F\u0007V\u0016SˬGŦwƠuy@>\u000e.TȆVOdj\u0002?#驺sycA)w,zl<\u0000\u0001\bـB*7\u001aij,\\P#\u0012;}}~r4\u0012fxO\"Zh\u001fNM\u001eBe@(7\u00078,iA#FaN}\u0012qǖ*lf\u000bZ\u0000ۋ\fM2HB-7\u0002߅,yY#p9|\u001dqeےNYƐ*M}\"A튘6؈U\u0015,ۅ#||(qW,esY!MAǊje6Ç\u0017,}#5tPcjOf=_`rhT\u001fk\u001eHm=op2s(Hv \"zbtu5k#j\u0010l_-$nnSjpDHrB=tytn2ݑOv)\u0007\u000eyL |\u0003t\u0015r\u0014iIs\r^ٟt\u001cSuSHt#v=_.x02\u001ay)B{!\n}~s<xi'y?^WLySVzOH-{\u0005=:{2\u0004|)p}!g\u000b~s@|hg]\u0016ORr:GA=\u0014^2\u000e)$!Ur\u001ehn]\u001dRy\u000eGZ<23 )h!\u0004r7h/ۋu]jR\u001cRhGv:<ِA2v)҈ƃ*\"-=rYg<\"]2$R1\u0002GDT<2䆡)?\"Yׂr+0gȖ]/&\u0004R\u001c`G;\f<\u000342^u*\u0004څ\"|/j\tcj_eU᪹h\rK$jA+mX7pM.=tsk%v\u001e\\z`ij@_׭kU֩imKoxAq7ts.\u000fvp&(y(\u001f60{i[p_`qUrK5t7A<u7˙\u0015wz.yQ&c{V\u001f+}di$w\b_OwU_vx\u001aKkxAvy7͗z.ݒ|\u000e&̍\\}[ 'K~hꭢ}9_\u001c}AU-)}TK4}wAd}7Ζ~..~'\u000bv6 hc_\u0000zU\u0017\u0015{K\u001eoAO7ԕL/\u0019\u0013'A ӆhʉ[^񧞈~U\u000e0jK\u0012EACą17ה1/7D'r\tb!\u0014khn/\u001b^U\u000fu\u001bK\rʊEA8\b7͔9/AO7'!H\u0001AhZ^bU\u0017ؐK\u000f'A<g7ۓ$/L͆'\u0014!rh\u000e`JjNcQlyfniMypl\u0013fs\bnSurq@x u</\b{,y\u0002eEkgmE\u0006j*o\u0007lpxnreqdtRt\nv|@Uvx.z={9)bv\u0004\"evh\u0018wlEjx6wm0y\u0010doyR\u0011rz?u|\u0011.ye}Si`Yjc\u000ef6̈hvRkycngQNqY?KtS.JxL^يaɉYqd%vgfu/jObmfPp>t(o.\u001aw\u001c]^`cCcHlVf+;t)i0\u000faldOȯ>tsw[-wnw\\-_AMb0ke#SsShA!a7kO|o\u0014>#r\u000b-v0[Dn^aaShdL%rg{`j哟O\u0007n-=rfv-vm3Zp]­\u000b`܄\u0012cr\rf؝C` jRNn\u0002b=q-vBw~o`^q&cc\u0016rfBt\u0018i\u000bquk_wInN1y\u0011q<{\u0016u8,-}py\u0017\u0018m\u0013jynlp\u0019ptnRr\u0018p/q\u001fsr\u0015_;ut\u0014Mwv2<Tyx,\u0004|~{6jtnlufntvTpEwFor+xF^Jt8yZLvkz;x{+{}6\fh~4lj~F(l~LFn~Qnp~e]er~L:uM~;sw~+z\u0014f\ri\f\u001ak\u0019<~m*Rmo_n\\qǃKtU;\u0017w&+z@ɮoe~giю\u0018}k:lnH[[pʈ~K\u0019s:vw+yQdX\u0001fh}\u001fj\fՇ_S\u0007\u0002\u0000VNu\u00151X\u0004DY\u0000d0\u0005@\u0002/y{e\u0001`\u0019@=P8\n\nx+OpOT+g\u0011xjZ@c}9`k`cTnw?+^5j䤢\u001eT&o\n\u000blE\u0002x\u000f9\u000b{XfPg@C_[G=/5\u0016g4\u0005\u001f\u0014ʥ^E*\u000fz\t5#\u0013p\u001d&\u0003X\u0011sY>>@?n\u0017\u0004C)HKс#Eu$%\u0011\u0002`^>[\n(?`~^x\u00000\u0000_+OËv&\"YD>\u0003s5x']\u0019~-\u0007if~>NF\u0018\"\rP\u0003\u0006\u0000^\u0005OG#\fǖ\u000e0<7ӆ7\r:\u001cs\u0001XL!\u0007kݱ\u0005r\u001dx{\u00166\u0017Rt\"+@q*\u001b7k1U誘Y\u001a}(~\u001e\\H\u0013`\u0017J䞂\\\n52[{F;On\u0012ݦ\u0005\r\u001c*\u0016C\u001a{\u001c2H\u001e<N-S2UruU\u001fKm5\u001dų\u0012Bu\n}3!JH$\u0011\u001c#\u001fh^Qv0q\u001bUY:ʫaZ=V.}V\u0012Zfsy\f\u0010\u0007֧MP\u00168:x\u0016-kն(+\u001brީGSIЭO\u000bw\u001diι9јy\b&z8,k.$x=rm\u0011\u0015RM\u0012R\u0003u\u0005\u0012Mb;dw0y\u000b2֤T\u001b{\u001dWƊ6m|+\u000e8E\u0012C`\u000bGd]\u001bMm\"W\u0002rS禜D\u0001~A\u001aS\u0005\t+\u0012G6\bW\u0010#jnA>p\u0000uw0\u001bD(\u0017MHOB$\u0000v\u0007KѻX\u0000{\u0013'V'\f5c\u000b\n\nsh\u0019\u001d]T4\u0017I\fDGãTD(2BNlz9eB_\u001c ݫ.#JUbG\u0018\u0018\u0017ɰ\u001f\tP\u0010c36߅!3\u0004\u0004?o\u0000/˼\t4Ta1l-vK\u001f\u0003WZ\u001bApɾ\u0005<\u0011>\\Щ\u001bހka8\u0001Z5$G\u0018dW#\u0012{{\u001bߢ!\te8l&V\u001dlu4ʚ\u0001@ԸQ\u0007WJ\"\u0005\u001e쎛\u0017)9\u0016(6g\u001ef\fy'1?J\u000fL)b\u0011쭢l]4L\u0001kۘPpuﲹ)nCA Ŷ+2dEH'Hm&Y3u\u000e\u0019\u0010ѷkѽ\u0005ӭ1n]_Z<ڮRvӛpj\u0000m9G݂#\u0002\u0007j\u0010}d\u001bA\u0015-u\u0000ڠ\u0007\n\u00190\\C\u000e\"\u001f\u001edhK>م\u001a\u0001\u0011\bٸ:IF\u0014q\\BVhF'$[I&3\u0013\u0015BtK\\ D'`;I\f[\"%#N\\\u001eI\n|?a\u001b8+\u001fş3\"-\u0011A\b\u0010ש\u0016\u0002_ZZKO%\u0002u\u00056`X{\u0012\u001fcͯw1\u000b$+O\u0001\u0002\u0003\u0011M{'E],jz6+\u000f~\fQk\t\u0016a=_/E\tqbVk&\u0016S7<R5|m[N\u0016S<\u000bT[＇\u0014\u0017c֝\"16`\b\u0006fi+mԂ\u0012\u001cEh6=2%w\t\\Ww3/VWx\u001bGk\t(\u001e+K6\\Gk6\u0007ygfp86,W\tC\t~8\fyq'\rSk3vI\u0017ժ*/kffԛ]_M5Ɵ$Ϲv3\\2\u001de*^\\?\u0017|_\u0002\u0013cj1\u0012xڶ+\u0005em[8\u001d@Ńr\u001a\u0017\u00011\f346=\u0018\u001f\u001ev׶\u001c+f5R\u0006jW\u0013\u0010uM!\\7c\u0000{1\u001c'a`&y[8#H\b\u00183Ci\\OR<y0mOy\u001b3lN2\u0003'\\N\u000b`́QSL'\u0005}\u0018)R찧R3Iw('gV!pGJeضR.u.jO[GCd5aL!_s\u000ed\u000b݂\u0013F\\nMͳ&ֹj~*A\u0010%y\u0000\u0000\u00002[\\f\u0016-:HLeyby \n }s\b-j5+ڲkEZ5׺ֵޛc[GSJo\u001cŤ\u001a\u0000+\u0003unR\u001aƉoQ'j\n9y<i;MB]\nY5SA\u001e*bPW#\u0013X~$u2ξ\u001a/1a+` cv&L/0̰;t)H\u0011܄|E\u000791ݎjɆ'u/qvC|\\lWja\u0014\u0014\u0014C\u0018m^~nc\u0004==7Em+O\u0014^\u0014\t|\u0004vd,<8\u000eLO\u0016j%=\fY0o}ďvCBW[K\u000e\u0015&I>fg\\\"&]KOÑ:\f\u0005%ijeB>\u0001\u0007%\u0006j:l=T1e~/\u001aߪ\u0016g\rI\u001e0^Y\bV)\u0003<^ϑ%\n\u0001զՏQS-W\u0001\u0015\u0002Gpa\u0001θD8\u0003ߠ9D֑ՃXM'\n\u0005UJ]I\"mteuuE)-\b3`Ҍ SoO\u001e\u00006\u0002Ju@$ZZǚ\u001a;o\u001bam>݄92)@\u001bm{\u0002\u001d>-V\u000f|WU>r$\u0013Ӳ]\u001e\u000eqّ¸\u001fzEYuɔ\u001a>\u000fGT@\u001f蚩\u001e\\\u0001'}њG9\u000emp.d.@L4\u001cc&,r;b\rӂdlt3ݦ]Q<\u001eb-w\r\u001c\u001aN\u001dk\tk\u000b\u0005\u0007b\bK%\u0012\u0003H@\fj\"W4\u0007sf|Aa{8c%J@\u0018bW\u0012\\E':Ehsř=}9fǹTW\f!3ߔ% \fפԘ\u0011]YzĀ&X\u001eI\u001dk\u0019Wd\u0011Pي\u001db]9gbI\u0006i\f$ O\u00141wu_)xS$P\u0019)m/U\u0013I\u000b.m\u001cpsf5Uwl}oy\b\u0010h\u001c 4;=DU\u001bIKSD\u0003S\u0010j\u001bj:?\u001a2*\u001aw0P4\u0004o\u0012+G\u00184O\u00126jeu\u000e\u0010\u000b\u0001HW)ϛ=ݮȆs\u000e51\rok\u0019\ba\u000fIӽ֒Wo0%\u0010>\u0010#\u000e}?V5N_r\u0004}%7\u0014\u001a\nԼ\u001e{!`D}K_4\u0014\n!Q\\HҽzȔ\u0004HN>\u0014uA-\u0011^Ჰbg\u001a%+k58W\t#wi+q0khcuTT[\u0019`5Z[`J\t&\u0011\u001f-\u0010v**\u001ccs0\u0010\u0000:-7\u001fo3\u001cG(\u0018Z!\u0015\u001dd\f\u0014\u001e\u000bz\tQ}vx'E\b\b}aQ#*'vi\u0016Ʒ|'in˵Y;eR{E1vikY\u0018\u0015T2\u0006\u00174o/\u0006;K\u001e\u000b|O\u000f\t\u0010c\n\u0001Rr_T'\u001bU\u0018tKy\u000fγ\u0019zaL\u001e=\fzs#\u0016k)|O\u001eĀ܇:axim&&\u001e^c\u0019o\u0001Iѓ`\n\u001bW82K/ױϬ˽^i\u000f\u0001\u0001pu\u0016\u0019O:\u0001JD:W\u0015t\u0014G<Z2]uyy+0H5W\u0007?16א\t~u[\u00184')BrjX\u0005\u0007G\u0015>\u0019<8YJ]\n\fՄyiZP-|xm\u001c4\u0012rQe`d\u001cZH\f;4SX1̚`\u0011wpu>7<dE,]5J\u0002!\u001dT%\u000e\"\u0014\u001e\u00037%:\t-+\u00126\\wO1=zs\u0006[ITNX\u0019\u0017)bOIUq~JY\u0014鮦t ͆/?\u001aw\u0012U[j\u001b+ϖ\u0015QzUR\u001e'd(_\u000eXqBy\u0014g5mV\u0019e\u000eq}\u0019Jsg[\\[>\tH2\u0000\u001d<?\\`\u0002L\u00138\u0019n/j?*BgKߩd}d\"KK{\tLTka\u0007(\u001d·t=no\u0006\u001f4iH\u0003A-:s0J\u0019\u000bַYa<Sebv]\u0014\n\u001b%;8;2\u0006\u0017/+BMqvs$`ىY4/\\ssi iUcd\u0018U\u0005a\u000ffh6uaP\u0007&>%Cd>zES?+&e\u0006{\\\u0015Q>\u0007+)\u0011\r^T9ZPF\u0001\u0003\u0001\u0000V+@\u0016l@\f\u0005A\tB\u0004\nr3\u001cL2$\u001c$\u0001\u0015\bx *,^-\u0001ڷ[]<**R\u001fI\u001b<E|N\u0000B\u0007j*K=׌A\u001d\u0004\u001fua2%V\u0005/.RC\f\u0007v(ݴܥKp\\\u0003\tt!w-<\u000bar[fA72:%E;),\u0011Aj&%\u000ey\u001aޑ\u0013\u0005$\u0010xPME@\u0013AfW\u001fxxM%|zW6J\u000bi,oV^>npdk\u0015\fŻΫ\u000b\r\u0011:\u0015\u001fC\u0001>\u001dKXi<_TTՖqcs.JmZ\u0010E\u0005\u000f:\u0013^΄hsVIbm8tSX&^ a*Ɋn^\u0002\u0015m=A2\u0015s^\u001emICca|k`K\u0002{\"Y١:nf,ڱW\tx_n~\t\n\u0012!f睥#\r\u0005Aɧ\u0018o\u001e(u\u0006\ngįVg攷E)?n\u0002/ؠbdS\u0011u3Q\u000eQIB`\\\u0010C!\u001bd\b\nP,\u0003\u00192QC[P\u0012һn`\u001eRXYU^',|Y5\u001cG\u00174-\u0011}<kCf\u0014ގo\u0015\u0003ۆ3\u00007%\u0006R/4\u0018!=\u0011\u0014\b\u001ba'm\u0006fUgL\u000f(CfU]@::&\nwo\u001f߿D[D$<H׽k\u0011\u0019U\u0016*I#;He\u00036i*80C\u001d\u0000TN/h\u0005%\fuhv\u0014\u0011L5'ƭs*=%s+:V9˲O%(\u0007LWӖswn0~\u001e~\u000bI`F\u0005\b嵃v&K^U*^6U>,V{:T5zGFd\u0011\u0014x|\u00054Zٲ u'ʦ\"Ww[f^'0X\u0015c\u0011x\u0006\u00162rKJJD\u0005JmB|CÁ=55oc/\u0002h\u001aNL9'0\u0001jI\u0015.\u0000\u0005\u0011 =$!_3s^>\u0002pX0]S\u001fcԹ`gi9\u0005\u0011Q?+,O|ekk\u0015C)6bf!),M\u0001\b\u0018jQ\u001bZ\u0018F_\u0000Y\b[-ۈfiv&\u0006m\u0016H!`5\u0001oIxu\u0016d\u001eP#F\n\u0010P&h_2nnmM\u0010sC\u0011?w\u0000O\u0015t[Pk+jnA\t\u0005ǐ\u0000H\u001aځY\u0001\u0018*zל`\u0000\u001aL﵋T\u001fL0\b\u00191|w:44o\u0012\u000f(%\u000f\u0019j\u0010̨\u00025YJ_|\u001cf\u0018\u001cyl00DO+/.5T\"$8[g\u0017)T`MH?Ɠ\\<f\u001f\\o\u0013-1\u0013\u001cby^QEE\u0005*׺\u0002e\u0014U._3P}7&\u000f^l\u0015XxVM\u0004CG\u0016|\u00000A~\u0013\f\u000b%_\u001ao\u001eÀc`4]~rf\u001c5o{/DRe\u0005)\u0010R'2:(FQKLUDu\u001949%O\u001c'\u0007EG\u0014\u0007tsӺ|U[n\u0004lMӴ\n/8*;,a8sk\r~!!@)\u001c\u0019֧&Ñs<-\u001asZ\u001b2Eb\u0019Tb~AA\u0016}Dʺ0S{{Ga\u001co\u0019qB\u0017͝$F8z\u0016*d\u0001\u001d:ٟЕLza\u000f:Jea\u001eq\u0011\rT*1\"}!\u0016@k\u0005\u001a˳߬B/lEy~eK\u000e\\\u00125$\u0010O=hZ\u0002\u000e͓ނ\u00179\u001a\u000b`_ݎ[9Ĥu2B\\s\r\u0014u5=@Όp@\u001dz\u001b\tt\u001c;*+.Z\ba]1l\u0017RS\u001bo\nКrHY\u0011Kg<\u0013`7/|+4A*K֨81%\f-1w\u0017?Ɩ)r~K0;h\u0003+f\u000f\u0019g:\"\u001b\u0010&6)rp\u0003cyB6 b\u0019#&l:w>fިÕyL/\\Zj@\u0000\u0000Ν(Wڢu\u0015\u0010\u0014\u0010d>\u0005P\u0002\"Y\u0004\bd'$$ʗ\u001eV\u0014J+W>p\u0014G[^\u000eG\u0011ڻ2|M\u000b5\u001bkci{\u001eZJ\u0007bILF<fB>\u0013PC\bR7<]'wKÍQXb\u0015\u0012*\n\u0019$f»\u0004\u001c~\t^̈́:)]\u0003\u0007}\u0014pA(\u001f+RX\u0000zE;b1t\u0017!\u001c9ݠBj`\u000bd>\u000b\u0018!\u0007L7g\u0001h\u001d%\u000f<d:@dAC\u001d<@\u001b\u0005߈\u0003\u000e\u0012@.\u0000\u001eZj\u0003\u0003@p\u0011\u0016C䂻Q\u0007a\u0006b!\u000bMbqq\u0015zbە3\u000e;@A\u000f\u0014\u0013K$˰E\u001cN\u0015T\u001dۢH=jo\u0003n_a|1r(\u0018'mrQ˰lp;Ա{qe\u0000\u0003\u0002\u0013\u001c=\u0019^ՐYcI\u0002$ۖ(o%\u000b\u0000\\-\u000f\u001cKч޻\u0014Α\u0006vKW0dng\u0006XgIF~\u0019XQHl8'KrgJ\u001f\n*XcZ3}EٓDsjd9FK䛉\u0006J \rI1{V!xnK-e>7n\u0004ׅ\u000b_Qg1R2Ǽĸ:\u0012@\u0001n\\\u0013\u0002KX\u0003\u0002\u0011)'W\u001bIC0hݤ!XL}\u0001\u001c4\u0018l5 Vh\u001a2\u0006\u001d,\u0018\u0003?bLb#(sÀytk]\u0003:ibP\u000f_\"2S&F\f ߆*\u0011:/~5\u000el6\u0018fݻ\t\u0014Ӡv\u0013<NE\"AMB\u0007I܆=ӰD!5\u0017oG\u001d]Ml[\u001bUZ~$g\"HU(>(l1u;8q\u0016i7m\u0017L[@\u0014Wxl<Rs\\]1^>\u001fg\tY<#nM\u0015D\u0015yY\u001bZOEX;/C<\u0011_\u001a\u0013IfGu\u0005R\u0013O\u0003M++c7S\n4ƊaZ\u000fԃ\u001du\u0017\tMߊ]>]o\u000f/m^&=Nh̕\u0017\u0014.g*>d_$\u000e\n]koj-]\u0015wz`g`@XR\u0013\u001dSZ^6uV\u001a^\u001fog\u0018\u0011~XQ\u0011\t濮a%{s\rT\u001ap4{HLydW\u0018)YU&R?\u0000FD/'g\u0004H7yO\u0013G\u001e\nS0᪄g\r:po\u000e\u0016\u0006)-.XF:\u001de\u0011\u0000*di\u000fG{.㯙nw\u0011n.tY<\"`7d\u001esSC\b\u0005!\u0015x$g:SX\u00009\u001eY\u0015\u0014%r\u000e_']4K\b\f.\fq cYv.\u000e㏢\u001dM\u001crm*ADbW냊M1Dqby\u001e9mT'buq\u00157Or\f}yXK8`微\u0011.;\u0014~1K}wҭrB;\u0003\u0013ҏޒ\f&6\tRr*?j䆑l\u001fugIC\u0017k\u0016M|\u000evhZYHn8Vz\u0004Q3N??֫zGP\u001c5|No(RGJ[5&Hs)qq}^&2n:zǰ\u0013kFmP\u0013\u0016\u000403;7Ns\u0006i+Z\u0012iӍ\t^\u0012zs7Tm ,\r\u0001\u000fzb@\u0014\u000e\u0002p22{9\u00106ʄ/=\f4)c\b\tx\nt&8\u0002\u001d\u00173\u000eB\u0005-(;^SedSy\u00157\u0019yG^H@Es\b7<\u0007A\u0005Q\u0001|h[\u0015\\je\bZҎy1|i-<C^ow5p\u0001\u0016c\u000bP_\u000f<.&n;ˌpa[\u0016\u0001y\u0015y$۫j!\u000bѫ$E42˚v\u0018?ݴ^\u0007wnYg?G9cK+\u0005%<qWŔz^}NV]QvS{q8ڷu)?\f\u0014WV\u00141l\u001f%\u0005Wyjp0#>M']|k!3h{\u0016&m\u00055&[\u0004KiK%}UEk̀u\u000bhT[\u0012*\u0019Fk\u0000kOZ e\u0001 e\u0010v]\u001cG\b\fؼ;G\u0006\u0013LW\u0002\u0013[\u0014\u0006d;oo\u001d3x\b\u000f\u000e\u0004\u0000Y\u0001{\u0015\u0011OEk[@|l\u00012섐^򒼗F6\u0001\u0002a\t\u00029uUQ[Em'*uW\u0011A\u000ew:^\u0018WfA\u0017w:\u0004Rc$Ǳ9-N7~c\u001b\n\n?\u0005;A34VfO\f\t5*DvUe_Rqr_pM\u0006v]\u0015{қ[;f4(\u000bc5ڑGdxEjO\u0013-n\n|\fg8\rKٶŲ]{r3J\u0010(?ұqlu;S7\u0001qWA}ǰ=o\n\u001bn\u0014xg|GC\u0002TpTaH\u0017͗O0U`ll\u0018ڤC\u0012lt0jh~pڱY_,x',IUjn\\[M\u000bz\u001eDBb<Ô]T7S0Co}2%sF͘MQ\u000f\u0005\u0003\fś\u0003!7f\u0017\u0001Sѕ&.!mFk(+O\fOȏ@\u000bW\u00021fG\f0JZ\u0017-#=qb>@\u0006@\u001egIxFz|\u0003޴\\E=Yg6at\u0012Һ*SY5T9vh\u000b\t%2{}n}I90v zR\u001ff8kOʼ\u001ejVo:*xH3_\t\u000b6WWx4\u0001\\;5juK:\u0007:i\u00077rʶY\u0005\u001dAd\u0013~X:J\u00101<;e\n(;Msr\u0014l\u001fڪU[y5\u0002vw\u0001\u001c(\u0019k\n-\u0016\u0016Ol\u0005\u001cHWeG㐣\u0016݆L9sFp6i&xИp\u0011\u001f0C2}\bTxmCH#ѽZyڇm{\u0002+EAa\u001dWd\u0002\u001dVSy%ې8bש\"SLL\u000314$B\u0000s&\u0014\u0017\u0015Bj&d@Y\u000e?O+\u001082\u0018}\u0013-D^\u0010ݒD\b(PR{\u000f\u0007Ѭ.\u0000s!$4\u0010P\u0017ڣo\u001d\\i(#u\"D8\n\u0000:]C>6ڒ׶\b*\u001dm@1GQm\u000bl\u0005ìO\u0013rusg# tk\u0015-ۤ<v+l\u0004U\u0002w\n]\u0015@V99'3\u0003ի\t\u000bP?#0eDaS#[%\u001f\u0017\u0005LYƉ\u0004\u0004U\u0019U\u0005_n\u0017F\u0017η4\u0005F/V[&+;\u0012k+4\u0019e[D7\u001b\\~YCm[D\u0006\u0011\u0019\u00064M\u001cn/\u000290\u0010:/[o\u0011\u0006\u0017`K\u000f(\u0002\u0004\u0002\nTor\u000bM8FECwLhTl\u0011\u0001\r;=\u0018\u0002\u0007Lt^r%\u0012|TXNd\u0004R3O>\u001d\u000e\u0012^\u001eG)\ry\u001dۂ2b+PgDWB\u0019;T\u0014\u001c\u0003+4Qv{\u00149輵;!f6~/ė|@r~EM$,\u0004<`\u00132+\u0010\u000eoMҿ$ȵk뤆)<$\\nnu|LX\u0000\u0018+z-]\u0002:r\"Xꗺ.KW;\u001a\u0013YFC\t:A\u0017ǔ+IU\u000bu+U>.+͋\u0004;SN@]\rL\u0000U\u0017XKx6\f͑8=*\u0007U4^qݗۥ>S韒\u001d+Ż\feLsf\b\tv?m!'粈\u0006Yv0zْ2G\u001bwT1\u0018e{BH\u0012M,\r&fr(y\u001b)%\rP\u0007\fEhl%\n$\u0018EVD\u001f\u0015Ķ\u0001t\u000bo\u001f\u000b\u0013\\\u0002~6-\u0012s//E\f2\u0011<\u0014뤪t\f\u000f:mbpV\u001an\u001a\u000f(Q7:\u001eziZ\u0005Nl*\u0007\u000f3miИ`\u0010\u001d\u0004\rsnX\nU\\Пbi0^\u0019Kc\u0017=\u0018!!{pwpy\u001cKH&Ș/UD\u0005\u001c\u001dg#\u0007M@\u001f\u001d1\u0006&yf_sI\u0007r\u0017Ŕ\\\u0012\fBc\u001b7He\u000exXltbu!\u0010hI\n&) ֩rbps\u0016;Cu\fGFq\u0003~~c6RbO'l\u0019\"<͖\u0019z\r[T\u00020}5y \u0000\u0000V|\u0014EWrф\u0000\\2a\u0010\u0002A\bA\u00100\u0002\t/ɷW&a\u0013A\n\u0011AK]מ\u000bq\\kPU\"Jѻ?W{j#'rG^$U)~VHD\u0001Tup\u00047\u0006\u0001\u0007eÊ⚊R\"I^w0^+mOX\biMi-T5ȝ'N]~{e\u0000\u000br5Ճ-wA\u0011\u0015-\u0015VYF~\u0007UgBOJt8y0.{\u0012KO\u0019(vlJ\tuS\u00190փyk^?\u000e6Wc+\n\u001fCl]\u001eEko%ݼ脦\u0000g}<p\u0007?j~t7Q|/y\tu\"-Q߽\u001b\u0019{\u001fޥw\u001e\u0001iN1j2Fc߀9uTE\u0004\u001aڵ粎\u0019\u000bt\r;HC;o\u0010\u0004\u0017sTH#d\u001c}[aT*Ч\u0000\u0004ހGX;Ppi\u0014t$V\u0006.xP\nC_\">h0[[tVۃw\u0014,U^|}X?4:a\u0013<\u0013X\rs%\u0019هU)<@ZQ/[6\f.\t\u001d0A=fx\u0012Iҗ\u0007\u0013Ql3\\PB\u001aoJ]Դ\\>[3\u0010?\u0006,\u001cЛMOyIOi>\r'|\u001b2\u0019kxo6\u0015<Jc^|5ܲZz;*,1M;\u0015]\u0007U\u0001\u0005 \u0016DQ$6\u001f*ړ\u001cXz#UfZ,ku)jF\u0012R6:\u0006\u0012\u001a*hyY\u000e\u000epI~KSpMnQjm-+\u0005yɽM4q,\u0004t0L$\u000fth!f\u000b_yb\rqX𖠕@Fb/rhf\u0013Z`;k4<a% KEb}9v_Փ\rUkw3H/usk`Ǚ;3\u0010\u0002$B4\\+;\u0014jKD\u0015 Z\rFFv\u001dEu{\u0018\u001fqcʰST\u0007K\u0011k\nrS4,FS\u0015\u000fQ?D\u0006 \"u%Zi^,\b[U6\u000f\u0005Pw\u000b԰\u001e\u0002S7$\u0018\f!E.\u0012\u0005H\u001c7\u0019^ü\u001eu\u0014\u0006m[E^)@YMSP)'b\u0016^Eq\u0003c?'Fxm\u0016uym\u0019.͇$\u0015|OKb\u001d1cwWln~B\u000bXfOyǲ\u00022MӅ\u001dBQWci2 [\u001eb},1Ew^kb)k,]wHߦ4UmϪKc`C!Zʎ5ICW  fQ9Q|Uά2=-Id\t2_M4 /ڨ\u001fB>o\u0007y\u0000*Zo9XYi\u0016fNP?1k𾠣 *_B\u0002\u0011upֲB[\r\u0011\u001d4\u0006X\u0012\u001d\u0003φ}\u0007P\u000573\b\u000fd\"d\u0006\u001dٮ&\u0006\u0016<ăT\u0017>\u0016\u0006x4\u001eY\u0016\u0010\"G\u001fXF%Ngt2\u0014S\u000b8.hpq܏\u000e#~\u001e2Hl<h\u0013ކ\naG\u0018-?J1pm\u0011\u0018\u0001\"\u001a2\u0014Vz|R\u0018\u0004aw~\u0005l\u00048\r4\u001f\u0005\u001b\u0019\u001dEZKݸUG|B\u00011&T6\u0016\u0004\u0014;wWٝ]8\u0019X\u0012yWG-%r9PvX7ix*L(\u001bu==ϲ͓m\u000b\u0015qq\u001bZ\u0006e&\u001f߰n=jcio@\u001cx/{Y/rpՓ\u0019-kb\u000e(n\u001cJ;7N]Ğ\u001c\t|ט\u0006\f9^R\u0011,qi\u0019-j5I\u000f~Wfǒ;*~xFMuò~7\u0004S.0.rm\u0011\u00044PMX\u0015\n\u001bd6͵\u001aN\u0007|b*\u00014u\u001cvv#3֬ަqV`i\u001c2d%\u001d\u001e50\u0015\b\u00107Ӝ\f\u0006jx\u00049x\u0011!KhF\u0005\t\u000e\u0007bLb4Ezc\u0016lX\u001f\u0016>\u001beҢ(j\f=\u0013~n$\rY\u001f9PKC/q䢘\u0007\u001a&lrS\u00001|\u0017\u001b8+\u0007ۺ\u0010p5q \u0000\u0000Z(\u001eQ\u0010ӸAX\u0006!\\\u0001\u0012$$$CsrL2$L\u0010%,*OQuOł\u0007BuUX뵊]xV~\u001fn,\u0011[\u0001|nC\n-bY@\u0010\u0006X?(e92\"կ)fm\u001f6@>\u0015_|Xȼ\r\u0010L\u000bN\u0019+VJ2v\u0011&ǂga:y*=\u001b>\u001fC,꽅zqw\u0019Σa\u0015VbP$Ԇ3\u0017H*\n|t\u0011c^\u001f7Cv\u001afC\u001aUʆN\u0019\u0018\\A\u000bX)MȊ\u001aQrK{\u0003Fۏe\"\u001fj\u0005\u0002%hC\u0011i24.$Ҳɹ\u0018DӮ?2\u001c\u0003\u0019]HMt\u0011a\u0018PZ+C9J*_r%QNH4r{W)\t|em}^\u0010\u001c\be\u000bٻ\n\u0007.v_\u0013.e'T)V4(F\u000eoUgzf0=rƣ[(h\u000fGjK\u0003Ңy}%]\u0002ʟ%(y\u0002쭬0L\u001d1sR1w^NJO7\u000bنyoxõO`i0)¿6T\u0012@J\u0016\b\u0019JL#״C\u0000[\u0015!)9!\bw+@,&T\u0010Q0GU5a\n5\\1(<U~\u0000ڌxݷ:vRȆq\u0005Vt.\u001a\td7J<L\u000e\u0013US0ݠLwk^Ip\u00182Z\u0003\u000b#*͚i\u000b1.~\u0001xE \\M;.7vD5枤\bBl\u000e4 &\u0013ɷ͉Qsrkd\u0016\n\u0014B2i\u0017N\u001bğ':da9<o\u000e=:\u0015O8\u000e\u0000Zq]\\\u000e(p\u0012/@\u0011ΓH+nind`gAد0iJ\u001a*\u0015eW}o\u001c߶x\"omzrQu\u001c_p==n_%!w~~S]Jѯ5VQz<\u0017\u0015L/8#\f+>-9]\u001bs41y\u001e3yʍ/\tG䇫~IĴ41_35g%@\u0005.1N§\fN̡\u0004Pi'74\u001e\u0012@rz8Z?\r i;f\ncENOri@D\u001du{A6\u0004.ѱ\u0013>1\u0013_:, J\u0014f?/LCNN*E\u0019]٭!mq=p\u0019)\u0018\u001c\u0006ݍ\nc\u0017FMH\u0018?\u001d\u0013b;t%\r7r~\u0010L&3>\u000eﰞ\u001c~6s\u0015lD'9\u0004?\u00016\u001eT­ϙ^\u000b5;\nk[\u001a}\u0010gX0^hq$WKJm3qV/f̔&|}31sO[9\"6ε6\u000b9K+|dj8a&k\u001bɐ=9wUͩ?\u0013\u0006\u0010|\u001d\u00160,lugz\u0000eU\u001d,}*\u000b\u0018e-^uGSo\u0016y7\u00057bC#Q\u0010şn[,(\u000bl^\t6!\u0000\u0011ʌ>\":j<rBa̪ NfE\u001ekI8<*͒\"e[,A\u0015v\u001d:\u0012ksCl.\\șc+5*W\u000b\u0003&ŀ~\\K4\u0005sR^?ӕ\u0012\u001cx0v>biq\u00102$V1\\$\u0003ǕwkGԣ\u0014Q\u0001\u0000%[`ѐJ\u0010\f\u001aΉ\t`]\u0019+Y)\u0007u!*5(HIdaoE\u0012lw1\u00167\u001f\u0012hYxЈrMyA39Sc\u0019LYgBل*d\u0012\u0003lQ\rP/\u0011ǅml)IR`i?ĞA\u0011\u0013Y訌:\u0018et/\rysn\u0005琸M\u000f>dSG&HP\u0002e*p\u001d:v\u000eFӫ\u0012}\u00059|%*Cd\u001dڌ\u0006Tm ؍θSVkq~VQ<\u000bf\nCB'\u0018L\u0005\u0004H\u0002\u001d? 6ǍZWzjxA|+c\u0019shi#a43\fKZr?'\u001bH:m2\u0005AĽ\feЭd\u000fcM^k^Cj#,@DL2\u0000I~tHGǫ\u0014J̀e\f\tW\u0013\u0007\u0002\u0000`_qZb\n\u0004\"\u0001p\u001bp߄CH\u0004\u0010\u0002 \tI&d2L\u0012)xʪ*jXEt\u0017JJ]EZ\u0010_=@X\u0015Y#>\u001a(UT#tgE\tUO4E\u001a]cDix\u0016`Ff\u0003w0b\u0014(U\n\u001eY]sAvjfhw@A,bx#i\u0002\u0005\u0010u+E\u0006_Xx\u0002\u0018˼U-E\u0005W'\u001a_@\u0000ce2b1(\u000bh^EN\u001c\n\u0017`V[@\u0005-kbn_Pe:\u000160\u0016\u0017lu\u0001-'\\\u0005j|Dme;tHGD˪&աD!ߪ@M?\u0003\u000eB\u001c=\u001erΕ\u001dt<GH8J\u0013d\tlM\u001e\u0006ilv>Sw\u000eo2\u0003Y!;DLž]򮆁˶R\u0016f;˷-r\u001e0ۏ\u0006첸R}\"?5#mk+3\u0011(\u001a(.R\u001dxP\u0005{K\b\u0011$\u001f\r\u0011~?\u001eu\bX m\u001e(\u0012U$C[K\u0014Il9vL\"\u0015\u001fF\u0016]C2q.OI61Q\u0003x\t1iQZx\u0005le_)O&uZCj\u001d7$\u0004\u001d6} A~\u00068zXmb|n^i>]fQBchJDj^\fk\u000f\u0012]rou#Ih\n8\bЂTc1)üW+-*kxue\u0006I~PE:LR]\r&t\u0007-¬^*$M4-b\u0001B\u000b\u0012c鎳A9Z\u0014u\u0013KDۄT}\u0002pp\u0001;ǳx0w\n\u000b7\r? r\u001elJU/3B\u0006K3\u001fhf\u0013@jm1RזD*p\u001c֓2O(\u001dVv\nndmMA\u0002O\u001b;1S`M\u001d-a6)N˛,_\nl[c.\u000eHі%Ŗش\u0015+#]lcٶ\u0015$ s~\u0015\u001c&\u0011b\u0017~In^\u001aY6-쪸ʟ/FRa`\tEi|o\u0003$Գh\u0005:)=kZv6g|\u0012\u001fV'E\u0011;R\u0003\u0005^t\u0006\\\"\u0011ZW\nYnN'⢒Li\u0016K[\b!6b\u001djnf$=+\f\u000f*\u0003.Ӄ\u001a\u001cKvIchP*%z\u000fډ,1-pGsD8DC\b7x&X8e!j5kL4Y\r\u0004\u0007&Xq\u0013\u0000Y\bLA)$]s_\u0019g^\u001c.\u0003[fx́{sHq\f\u0014\t\u001f\u0004\u0011\u0007o\u0015݌\u0004 K\u000fFaa)1$P\u0018o\u0013גיDO̐Ń\u0012w\u0019q?0\u0011\u001e$װޮx\u0007YZN8$\u000f8\u0004\f_ُ$`lcZ6ݐ?\u001cȇY+0H5zቔkQ}Ö<i|>!~QQ2&\u001eP{BcH|7gz9^s\u0011\u0010yl\u0003\u0016\u0002u^A\u000b;Rck\u001eU\u0004>)vQ\u001d\f8:oVcsK68#7>^nNk_<\u001fw\u000e*>mڹ3\"Ψ\u0010Ţl`\u000f\u000bD#\u001c\u0017ޣ7W-#h\u0007\u0000\u001d\b<Lqf66@0}\u0011\u0019\u0012\u0011كih\u000f \fӛR$0aps\u0017T9˟\ts\u0017JЫlO\u001eI\u0012w7±A8j^\u001bՏ\u0003orkl\u0004\u00151\u00027x&eoU\u000fd!S\u0012Q\u00042b+(\u0004km\\5\u001e/\u0017>D\u0017:G\"DxA\u00024\u0016\u000b>X(\u0011\u000b \u0013\u0018\u001d\u00156b-X>\u000e*\u001f\u001d'qkxOOX\u0000+{5|\ffP\u0003|\u0000~N\u0015Ez\u0012Ey?|S-2<3}=\u0004`[\u0016~#l\u0014tGP\u000f\u0018j_\u0003\r_߷,\u0017cn$\u001ak\u0002aM\u0007=UlMQ\"gɆ\u000b5iЉ5M%7R\u001b\u0002%\u001eq\u0015vLSG[]]M\tvKsw>q|\b\n\u00067pL=#.[CjϨ^wUOlTvCe\u0015]j20\u0019uuFfձʪ:AƆ\"E*\u0015\u0011S\u0004\u0004'_\n\u0004\u0001\u0000\u0002!\u001e\u0012Z\b\u0010:Qpt\u000547rv윽Ys9{<\u0005Fr\u000e׃d\u0010+G1\t\u001eF~ /bm1&&\u0000x\u0010\u0000,\u000b^\fLtZnD<t\"74\u0010\"\bף.9\u0003\u0003m-6Iq5\u00045.\u00051g)\u000fj\u001a\u0019\u0005!0O\u000eD<%\u000en{\u0019?ns\f\u0017\u001e\u001a8\u0016Y\u0015F<p\u0016\t\u001fr\u0012wPqD!\\ F\u0013\u0004\u0015KA^\u0016Z\u0001Ũˍ\rR\u0018\u0004휃EᏥ\u001cla?aZ\b뵘ltU\u001e\u0010tWz\u0005\bs1\u0016͘iea1M1g͞vw\u000b\u0017xeWmOVum6lǦmavovumw8m^w\u000fO/o}\u000f\u001e?tc\u0003N\u0004\f:\u0015|s/\\\f\t\r\u000b\u0014\u0011\u0019u9:&J\\|B\"\u001cD1X\u001c\u001e \u0010IdJԴk\u0019Yy\u0005Bz\u0011bs<D(\u0012K2T*+RWkjj봺z}CcSsKk[{[}w\u000f>\u001c\u001cz4g?\u001f\u0019\u001d\u001bx7o߽0\u00116m\u00193fB\u001b|=ks\u001dΛ\r4|K5~X\u0000p\u0011%&(*,.0<6\u001a64^\u001e?|X@`Ps\u0017B#b$ PX<1A͹O3l.O \u0014Ir\u0005\u0014OS#?UBP'\u0014\nBP\u0010T;\u0018}\f*~>22\nEOL_~[\u000f\u001f g\u000b\f,v,\u000e\u001acy]\u001ez\u0001Fl\u0003(}FVύPq㫪J6A$*H\u0012\u001a$Ρ\u000e`v0;\u001d\u000ef\u0007×9zL2ٞQC|\u000fQM5\u000fxzAR+Ԕ k*\u0005xGjsH%Ť^Vaݼ\u0002r~Lȡ3h\u001e5$؋#\u00142'$\r\n,FP].\u0005V!f\u0012oDc&2`* _\u000e\u001e'ǹ{#\u001f\tݰw%{2>\u0016aQ*X\fSV*5r1V/\u001c\\\u00052\bdL9x~dE\f]0\n\u001e^z[\u0001AKm<L!\u0015\r|\u0001\u0007t䳁,&p#Ae* aʁ'pBr\t}1zwAj\u0002$\n,\u000f9K\bͅ|-7\\c\u0003L\rS\u0001y\u0003\u000br\u0005\u0010\u000eRꈼ_bl؞ҰU\u000eKTU|YB\u001d[3@S\u0000JӸ!C2)\u0007gO|dgس\u000fu\u000e\u001ezw2PW^Rd\u0012\\=M\u00044\n\f\u0001zOh'\u001d\u00027@nOP\u0014J-yV;Lg]fΓ'\bRj\u001c^[(Ā\nyC\u001e\u0012B\u000bI@l3\u0015o? qMzۨ{6Tև*?]FW^V\u0014|\u0019.G\u00022 T\u0011!YHl\"\tIͦ\u0002\n~]tˑն:6^m5\u000b+)U\n&G͒\u0011ҥ\u0004U\t>IL\u0013Ť\u0006S\u0001K``;\u001d\u001cm\\ojc{.]w{]}A]\u0016[UT5䄚T9\"#֑$-QJ֙\n(R;7n\u001c^\u0019\u0018\u0006\u0018\u0006윆\u0010a:VVTST@e&\u0012\n\u0006PkL\u0005l\u0015v\u000ew6ԷU8{`\u0003>5#8-E\u001fʦhc\u00055\b\u0011I\u0002j\fɱUx\u0005\u0012(EU\u0012\u0002\u001au=XU=\u0010ux}{tjG\n\u0004\u0016\u000f4\u0014a\u001b(=Gr(n\u000eËqZTivU肝\u0015\u000bF7\r:&\u0010\u0007|ؾ\u0014ĮȬ8CLNlG\\nt{Bvx~T\u001b2?\u0015]\u0010ъ?:B':\u000bnA\u0004S+\u0017w.\"nG%PBRBz\u0013^MLp\u0013z&*T@ m\u0017Hh\u0011؇Dc΢&ZT_\u0000Wj\u000b\u00155yI\u001a5LOї5\u0019m\n  һE/`v0;\u001d\u000efˡp;ϙ\u0011־A\u0001}U\u001clK8\u0010SQC#kדt\u0015YFUVErAF̾!\u0017b\u00197\u000eE\u001c|\u0015{\u0019e\f\u0001wY쓌\u0016E8T@V\u0014\u00114U4<7IIi\u0004A(R@:\rj:8vug*t\u0001\b\u0001E@EQ\u001c*r\u0018 럄\u001c\u0004\b\u0004B\u0012; !\u0010r\u0011\u0002I\bC@V@\u0013]_ӇQ\u001f5<n.>UW\u001c/)\u0018aY/-Ry%F2\"\r\u000f\tInK/i\"tY\u0015{\u0011p8d|\u0001Q\\Đx\u0000i'6ĩ\u0005/UUi5gԧy\u0001ebLY(k\u000ee&\\\u00161q(h\u000e-Ev;wΛ6 !5kC(xH@\u001dm՝N&\u001bוy\rUF\u0001e\u0019af5n\\+#$\u0002,۾.w\u0016Aڐ&T%_}ؗY6\"s\f9G\u001c\u0014&j\r\u0001\u0003ơR9aWLt~-\u001a\u0010m\rANv$&!\t2p0t{z$?5Z \u001euTj\u0001]Ġ\u0010`9\u0014\u0010t\u0001&\tf,\u0004h\u0003؈!\u0000\u0010%gS$&T<6\u001dncK /\u0010\u001d\u0013'z&bp`F\u000e*\u00188b(@\u0014H3x!}\u000e': yo8\bIP&\\P\u0013{C@Rt(ɓ\u0019ʌ*\u0013rH\u00121𵐗&dx\u0003'McČ`$f>m|S~䃱\u0003ؕ$x0mq]Pe&\ti#\u0006\u0016\u001aeF6AWB~8QChiT\u0001ɞ\u0018 <|\u0010\u000e\u001f\u0007\u0007]z[u*nz!bg9Ԓr3lq\rX\u0007\u000fr3\"\t>4SP\u0002h\u0005=\u0018m@A8\u000e\f{Ͼ\u0019+\\Ǖ--F\u001b3a@\u001f4M6\u0001;ҩ'Z\b\u001e8JԐpj\u000fj\u00196 \u001d\u0003D\u0011zQ0'չ=\u0005;Qv(X\rN#0\u0010\u001c-z#}\u001e2Ң\u000e\u001c\u0003>\u0016ƾ#Ah\u001bw8Vw5C\u001d/[r\u0016:mU\u0006\u00055fY\u0004\u001bH7\u001bH\u000e)N6S\fP\u0015X'>}<5ӽe~y'N\u0010NdtOݗdjM\rZ̓x3\u0002Y\u0003AdECM&-ڀjG\fož>ْm\\\u0010-u ZT\u0015\u0001S#%\u001axG\u001a;Ѣ8]0^`#\u0018Hƺ\u0003b~\u0018ںn\u001cA-9*ViTR8\u0003\n`'yM>aATm\u0014#GђZ\u000fVZ˪ݐETD\u001b_l\t}mϒdo8zP\u000fc\u0016)VdjGT\r*:YϪ\fz*M\u0000S\u0016qKP}W7K۫Ov*om;C\u0018zzqt}J\u0001eV\u0005l|ery\u001eItV2j)k\u0017b腳h\u000b?\u0006|\u0017lIl\u0003N\u0010^\u001fmzQr}\\E+\u000f\u0015ݫl([Xp1\u0015ٔZ[m@_Xi䮠\u0006\u001ep\u0000v\u0006\u0002fy?q)?GZ\u00163=@W\t\u0019=\u001dT2lv\u0012sd\u0018rڰ\u001cP\u0013챢ށz\u0014E\u001f\r\u001f\r\u001f\r\u001f\r\u001f\r\u0011q5YTp\nyOCŻ\u0019\u0001\u0016Reb\r\u001e&l[Ghm\u001d\u000e\u001bb9M\u0005%\u0019\u001a>]\u0014\u00018!\u0016p\u0011~{gklB42?ȩV\u001anI6\ne%2G-8o\u0000\rQ\u001aP6n\u0019\u0012c\u0001\u0018\u0002N/J/FQ&=\t}-9>#,\r+>nƙ,Π\fz,\u001d>3'Џ\u0011ԍI\u0016\u0010\u0006\u00046\u001eM\u0001o$GWdosfܐT:\u000ejGyhKڻ)\u000ek[Leٓ\u0006\u0014#\u0001ceA>V\u0016l\r\u0002oiE\u0015Ǫ\u001f2p˪lMe.{J~IT\"\u0005Cvnc53}-\"\bÐh\u0003I'ِ,kHM\u0001\"D[YjsUZCM:fD˂\u001c+)\u0012\u0004U\nNa\u0007\u0002a␽Zfk@\f\t0,\"IBLtr\u0001AlĐ\u0010\u000b\u0014 N9Vr:#Q1ha\u0018\u000bx!coDjԀE\u001d\u0011\u001e_dLq\u0018i&]8NLS\u0001NI\u0006S\u001b/)W\u001f\u001b\u001aKlƜ5==\\\u0006[jTv]٨@(WKsm!fwO)iiLڤ?\u0006鑓\u001b#\u0005tɕOL\b=?ٯ\u00049,o9̳t2UA\u0014\u0005\u0011\u0010P\u0004@C6-!d!@ \u0001BB6BĂ\u0005QDk\u0016op94\u0007\u000fMre\u00179*\u000eӍ\u0018RMd0W:\u0016r\u0019B5*G1GRB\u0005d;\r\u0006ib\"P'dh8^`B5\u0011yϕJ\\\u000bL\u0017΄*\u0005nW2\u0002\u001f\u000eb\u0003߭L)3t\u0019*E&'\tsdr\u0016* i\u0001\u0013@s?/=\u001f:Vh,\u0001~ߗ;{u15\u0014k}6EnA;xo\u001cbhS$u,N%ɕ8j\u0006\r'\u0003q\u0005/qO=`S)г\u000b,Tר\bs\u0010=@\u001co5\u0003-z$^˚Fk3(l\u001aUA\u0006?5(\u0013!4\u001cv\u001c(\u0014_uw1ff:w-}hXKv\u001azqAOQ NϜ@:&z$B/\f\u001a\u0001$Gc*8?z0;ߗ]/ZZV#sY\u001c]X&q\u001azl\bKNCd\fP<d\u0013Ջc1ƶ\u0000ؽ\u000f\u0019P\u0000Ҹ\u0018=\u0014\u000fӶ1S\u0007o<X\u00188\u0002/%3Y<IXs\u0019:Hs\u0015oe\u000evn$\u000f\u0001\u001eGH\u0013\u00177\u000fG\u00038`ݗ$\u0010\u00141\u0011]\\?2^OdJt\u0007J\u0014\u001dz}\u0003eb\u00168B\u001a!\u0012v@YN݅4wB\u0006T_D\u0000Ձ}`0KwͮGf\u001eGU\u001dl,&3=m2)\u000b(\u0003ŉ'\u0007qv\u0019c\fF\b+c\u0004>¶GF\u0002\u0011\u0010\u0017ޜ\u001d=;\u001cèj!,z\u001a5ϥ+D`C^\u0016n\u0001\"\u0019NJf9\u00030\u0007\u000b2\u0018?\u001f}ɉ=y\u001aΝ\u0018i*mJn\u0014L6M$_e\rA\u001c\u0016 ($eEU\fȀӏ^9\u0014\u0007,>IoGs\u001e}YEHB\u0010W\u0011h֯յ\u001b\u0010YTwL3r\u0006S1MO\u0004eS-)*d`[\u0007hh\u0018%؝j\u0005ӣ͓\\$|\b[XRK@-_J\u0010oЌ+כŋ8V\"\u0002]?\u001f/&\u0006\u0003{\u000fd\u0011_$]B?,kʯ2xF5x\u001eun#\u000e\u001cs\u000e\u001a\n[\u0016o\u0013yDs?{\u001fhow1,8\tfL?CVAyE%\nK.?)-amU\u000b[5[ڜ\u0007\u0007ȺMtM\u001b0o\u0000?s}*\u000eϜ|-.̩\u0012\u0014 {JZVu\u001d\u000b(l\u001bI\u0011neC6%FQ\u000fnj̍;\\M\u000e{\u0019w\r\u001a564\u001c\u0004\u0019q@p$\u0010{{bKX\u0017\u0014QVx\u001d\u000b&\\\u0007^\u0011fA\u0016{O\u001c򒻭\u0004m\u001c.B\u0018\u00010b\u0010\r@\u000eħ/d?4m/o\n\u0017y0\u001c\u0007\bwA6kl\u001f\u001eoz=v\u0017Vtbd.\u0007R\u001eC{,\bǄ4\u0000]@Г\u001e\u000bzӁ4#L#y\u0016,xK|}]XÿC\u001c>A\u001b𵲇i6\u0017pD1|܎,HψP\u001e(@c\u0016\u000bii@Rq2[e\u000eaU^FR\u00176Jz!\u000e`\r{v'\u001a\u000bf\u0004\u000f\u001aQ\u001am)0}^(6\bRc$5\r(r~P,y9wM\u0016:(^։gDHD\u000fϡ\u000fyl\"0A\u00114t!5F\u00175\u001bbl\u0017\r#@\n)ۚ+Ou`;\\\rmqׂZ4++'8bqu2ǬN Gt$\u0014\u0014\r\u0001\u0001\u0002F\u00027\rG,)\u0015O\r'6bgSo\u0015/\u001a+Wu\u0012Q.mlc`r\u0003j($oQM\n0\u000frIF?\u0014i\u0004#@\u0002I_S>\u00188Z7gW-\u0017[ܫ\u0003\u0001\rJ?&[1C\u0017k\\\u0015\u0004\u0013B\"mф;[\u0016\u001f\n 7qD\n$fØt;Sj͖%\u0003qzfg,;-^\u001e\u001bQ`-}\"ҘGH\u0003v\u0004-\r35Sl.J7\u0004oÉ@\f\u001e\u00055\u001fp\u001cNgmwٱٙmu*ꊸ\u0012\u0004\u0004/#7H NH \u001c\t\u0010@\u000eHB\\$77!\u0010\u0011P\u0017x\u0000E.ov[\u001fO\u00178b\bD>\u0016Π\u0006\u0002)Q6AY-aWjLGU-oF<B84\u00154N\u0016_ \rT%wO_@9{\u0002q/ߔ`PɥXh\b{j\u001b*\u0006hZ;0T\u0012\u000f\u0017J\u001c5R+\u0000\r4x\u0007|_O 9\u000fg.mΦ\t^p܀bFl\u0015Y\\u\u0007\\,RՍRJ\tK\u00055d\u001eA䉆Hl^js\u0005l\u0010x\u00029\u0015\u0002:c6:-\r\u0006?\u0015y{\"\u000138\\n,9\"A\u0007RU\u001b+\u0005\u0012J_ʆ\u0017\u0018Q\u0003$\u001be6W}\u0012HN\u0005SA[\u00112\u0006:7\u0013<v7\u001e=DU٭٭\u001c\u000bڀSt$K\u001b\u0014\u0001\\`˓lV+\u0000\u001bh\u000fO{\u0000/y@6N.\rDO\u0007FN\u0005eئ#2z\rFifD_h$iK8uy\u0017ZEA(9pekoR\u0012 8\u0000\u0010y\u0000\u0013gLWm\u001e\u000f|!S~q\u0007\u0017``l*7aڲ+QR%_E6\u0016\u0012\u0003̌VY:+B+5-\u0000M\u0006@1uqgq\u0007;s'/9\u0016\u0005?l\u0006Rěa$si\u001dhIQ\u0017AAt>7\u0015k1Fj\u0007@3\\=ۉ\u0012 <\u0006'\u0003#Gޙ?<tczЏCC-K\u0005\u001f4\u001ev\"b$Sj\u0011ѭ^\u0004M;ڑR%R1Wi\fu\u0013%\u001b\u0010\u0001\u0003\u0007|ϻ{<k}\u001e)_=\u0005MV\u0015\u0017\f6\u0010(\u0001ƆkF\u0013[\nŹm\u001ezw,Fp\th9\u0006voZͯwxp\u0015o\u000e=3b\n$ʨ!Gl03DhvYv s)F\u0015h)\u0003-\u0000܀nWK\u000e/o>uߎo\rqxeP\u001e\u0007 IÉ\u0019h1nzY\u0014=Wu\u000bM\u0018զg\u0015ԥ\u0015'(e]\u001b-gCGi.\u0001];^ɹ>~o[?)\u0000 oOP^M!=\u000fa\u001eǠ\u000ftRl69m\u0006^r\u000fU4\\\tO%%-,O]T\u0011B*s;?Mw+Pm\u0004v{ւC\u0017)#H\u0001ܥ\u0019O)ih\\LC\u0004.!\u001a\u001f\u0000K'\u0010b1\u000bHQs.w{ϟ\u0014/2\u001eTp\u001c\t\u0006c6#s6\"bI)i+\u0019˰exV\u0012z\u0012:;9\u0016\u0016\u001c\u000f\u000bsYAnSKG?vOW{$\u0006a R*\b\u000f\u0015\u0013\u001eը1o7l\u0012\t˯WC^k\u0004h\u001a+\u0000\u0017qf7\t:\u0006B|\u0001J\u0016+*u}B2#\u0005PCѦˋS%e*\u0018:g\rc\u001bCh܁li)\u0007\n`Fm5{kï\r\r5\u0005!>s^sUXt\u00059UJ厓7YΆ\u0006\u0003-P7 $*gz0W]yl`\\:\u0006XA>s9\u001d7<5'&c\u0005E=ff\u0014\u0011\u0015ӕDdyix\tM8ZH\u0017\u000f\u0013\u000e<Wa\bT6Tچh\u0007\u0001AgE\u001at\u0006\u0017\rL1\u000e\u0001\rA\u001aCc\u001b#VEvr}fNt\r1I#7ܤ\tGۆ\nr;a\u0001t\u001f)ChH^0\u0007\ruΆc\u0013p\u0006.]\u0002\r~x\u000b^Lޓ\u0006(qUv&ro(\u0011JeP\f\u0012\u0001<_ׇ\u0011{Q\nc7Rg4tF\u0015ZgaCCQx\u0006!)(04e)\nT12Υf8E6G\tV\u0011^؃R(E֘\u0018Yՙ\u000b>6.\u001c\u0005\u0017\"\u00044\u0007Fm\tIz\u00129\u0016)d1\u000e\u000bź \tF+)m\u000eju@a7gDf\u0013FiUcԝRڊXxi>6|\u0003XG\u0001\u001b\b/@@+$ka\u0005Qbќ0\u0013/nMҋ\u0003\u0015\u0015]%:c!ר\u0017ZTxY\fjq\u0012\u00104Fּ]\u001f\u001aX\u0006yw?\u0005\u000e=5a'\u0000\u001cv:u]㌵u=,\"\u0019@n9\u0015 $$!+E\u0002@AH\bGBBp\u0004\u0010EA.\"(hA\u000bP뷙ӗ}\u001fЇw\no\bPEi\u000eԑ9\u000fq\u0005ͩ[\r\u0019q)Q<\\Uh.gY\u0015\u0006}WS(35Q\u001b\u0014EJYj)zS\rh/Pk\u0018<\u0003^~'?aS\u001b| A\u000b:8}F/R+|cha\n\r4Y^HjZU7\u000b\n[C1 ?w\u001a<}Aw{_Kyē]Pm\u0003p\\+ؐ-\rTź\u0016\u001eˠRVYĐ[t\u0000X;-i(i\u00067[9GPq\u001a4z\u0000g6@0=\u00134kֈ\\c-M\u0004ANTij\u000b*A+7V\t|ZQ4f\u000e\u0019mld/ 5\u001a\u001e@\nݽ#]w̋Us\u0018ri0\u000e7mN\fwˌ\u001a|!WQRQIc\t\u0004f\u000eWlerU\u0003\u0001:Gg&{ q?\nn.\u000b\u0007|f0\u0014rg$\u0001u͚B869A$Vˊ:bVoi\rL\u0013,EUJ@!Og)Л\u000f@v\u00144>\u00054=A[+g $fy4\"nv,\u000e9r1gJc:5J-AYL\u001a\n:J匞\u0012Y*ϗȭy\u00125Zg!W\u00026\u001c\u0001@\u0001@6,\u001e\u000fGDOMBӆF`\u0006+٘^-+*uj/iuU\u001ccnC9K)7hsz 5]\u0002Nٰ;T\u0000d~><lt&\u0006a\u001eK]\u0014VTUu_;#;stxm-&ls{\u001f^i\r\u0000\ng\u00079y\u0002\u0018NnZϮ^sws\u001b9\u0018\u001cqq.\u001a5\u001d4̨&\u0018J\u0016ld\u001b2zY\u001d.d\u001bؓj0t=\u0002#ۀ{:y\b\u001d?ڈ-w~B=wB(z\u0002?\u00011GE\u0005AR#Rƙ6TPfkG\u00185^C s\u0003\u001d\u000f#?\u000f\u001e9z\t%g\u0015^\u0010t!̛a2Rxc,ip\u0002?T\fЛVN\u000bW#E~\u0006j7 s\u0006\u0006Zo\u000e_\u0019;wf\t.U\u0014/`\nc\u0016(\u000e N`+GD+\u0012:%Z}E2u\u0001>TJ\u001e4&\r*\u0006\u000eo\u0003w}\ru?zXcΑggS+~P2u.3MV&\u0004*\u0018\u00061Z,_e%I#\\iPpYRg/Pp\u001bhms\u001f\u001dY}~'kGs4Tj`\u0006ޅ\u0005X\u0001~>\u00043en\u0010؈24\"y\u000b\u0013'ʸq~\u0015tZh/5kofصOa\u00048s߸F_$\u001f@3q˰<R\u001a\td\u0016%\u0014'\u0012nQq\u00184fM\u0016+Ҩ\u001b|׆n\u0019|qj\u0004\u001cpCh#/\u0003ⳟ_cbQG0l\n\u0002\u000f%=+>>'n9;7^^^=\u00121.5?j\u0014D'_X,D,Qn?t/J\\p\u0014\r&\u0003w!ב\u001b0؋gTStZ\u0013\u001c*j|\u001e\tD=bC\u001f\u0016B\u001e3WYx{\u000eot}\u001f5[,\u0005w\u0007$\t\u0002\u0010\u001f4\b\u000eL\u0001\u0017B\u0013A#oaQQ\\xąʈ\u000f}IH\bN\bK\fȇߠ\u0002\u000b\u0002Ke's}*\u0005_}\u0003;v$p\b\u0001;$p\\,\b\u00021~\u0011 ?\u0014$\u0007\u0006\u0003 \n\n\u0004\u0000\u000b\u0007!\u0010\u0015\n\u00019~\u001f|?}S\u0006\u0007R\u001dw\bp\u0003^@\u0010\u001d\u0010YH{\u0011V\u0019DrqQ\"Ş'VpoTU$VdDױJtzt\n*BM\"{i1a=~o\u001aضR[\u0003 \b\u0004Q!\u0005q/eUV.yVH[(`Iʪ\u001bY\u0019L<SJ0MuV\u0004~\u0002٫@\u000e(\u0014C\u0001\u001c[\u0003=\u0004\u0004着0\u0013\b#?\b/\u00050S.2sC -3)b\u001ag$395\u0004t2C!6+ӵkhC5Iu\u0005?F;;\u0001\u0000?z{w]-ＳUԧU \"\"{*(CF\nDF\u0002\u0004\b$\u0010L\u0002@\u0006\t;/\u0004d:\u0010!\u000e\u0014Z\u001cu]{w\u0019T\f\u000f*\b\u0000ʇ\u000fF\u0000\u00009\u0016\u000exɉY9E\u001bG4\u0004v؊?Ƹ@ֱBJ|\u0002\u0019/7)˜\u0001\u0010b@Ջ<*@\u001c\u0003;\u001f\u0012 \u0018\u0010fe\u0015>\u0014 \u001f1KWiE2c9rg0]\u0002Dg\u001cQ])ܚ\u0011d]ѯWiMU}:o\u0000@\u001c:v\u0000N?\u0010ć\u0002ѱ@Fq\u0019?\u0017.[cT(y\u00121oM70œh~8J\u001ch.#lQDҭWF[\u00033j;E\u0007#@\u0000O\u0015<\u0017~\u0016.;YKhk&qtd=rT}J\u001b\u001a+zPUX}Ψ9gTz\u0005<\u0007\u0015\u001d#8:\u0004<1)y/%O$y\u000fevUm:>Cn^!R$,@P18Q\u0006\u0013r\r.eFҺs&o|<#\u0003A\u001fD\u001e\u00061@q47剜_Ǌ5y\u0011vAT<Phx0,w*\u001d\\^j45\u0016]ͪD;:UqZ\u0004\u0018W\u0000s~\b\u0005,0PD\u0000ugڴlĲ\u0010}8\u001fM\u0019a\u0016)BU,QdRb\u0015n&8\u0002mpZ9.7>\u001e8a@\u0014\u000fÂ*2\nhc^\u00133~1\u00163J\u0016Ei\u0015颸r!:Aj$U\u0016^NMr\u0000s\u001b!&x\u0003t~8\u0003ۀ>\u0013\u001a\u00044@\u001fsWѴm)9PV-kQŸiP8\u001cSYFR4c4Kl]\u0004\rIC4<\u0004Q\t\u000e\u001bzás\u001d\u0006!{2 ЅfNxfKH~JμΟuF^4܊\u000e\u0018p\u001brfJ@г:6BRBd\nAm-\u000e[[ꍏ\u0007m@\u0016\u0007\u000e\u0007\u0002Ch[kd+>~r`vS!\u0019CkBD+Y]d=a&\u0016J\u000fD\u001c\u000e;Dlw؛\u000e7\u0000c_\u0000s\u0010\u0004o\u0005\u001f\u0001`\n\ty툈z\u00176tk4\u000b6֗\u00177Z\f*\u0015-Kآ&%ת#qfB\u0017׆cʡ\u0006\u001e2 \bGMT\u001b\u001f\u000fC?.\u001fX\u000f\u0007\r\u000f[\u001fZH5:Wt\u00156譥dUEF\u0005IҬŋ(\u0006\u0001ZǗkxZ\u0007,z\u00030=\u0007 >=P\u001e\u0005~\u001c\u0002\u000e\u0006?\u0018\u000fY9\u0011=1y~4\u001at\u0004V$a\u0011ix%A!\u001bjLsLdEԶrV!tZQ<\u001bs`\u0005\u0000i\u0016\t,\u0001{߸\u0003?xQ\u0012#/Ne`%zyx+UnGz)xVY'iNCV`k\"|FyT&\u000e`y\u000e\u0003\u0002'_\u0000z>\u0014#n/F\\L\u0018z2\u0005\u0019Cs/\u0014\u0011)Tb%\u001bӋ\u0016\\8yU\tB+\u0014|Ȫ/:\u0000 \u0004\u0014{7\u0003Ӟ\u001f޸ho;A[\u0007,8\u0016N(\u0014V'O7*\u0018\u000b\u0011xUzjޝ;Wd\u000f(aCV%l`P\u001aPy\u0003p<\u0007\u0001}捑\u001d^gՕ\u000fB\u001dkQG5wa\u0013g\u00197pkŭY\u0004l\u0001hd˿L\u0015^b/IİK\u001a\u000f(\u001b9w}\r\fۿy7S[Z\u001eh=(L0~l.}-ZYn@.\"@P\ng\u001a\u0005SDFd{W\u00045d˸\u0019:n8\u0015 \u001c\u0000\\o3K>\u001f^\u0002=ݻ_\u0011\u0018%%4$&8\u0004 j%|\tA\u0012\noմĶ^Ƿî:fԌ\u0019&\f6-Lz\u0005H|\f\fb?ӑu[}U\u0004\n^\u0006^\u0012_b6QYU82\u0012Tݘi-434\u0013o'iͩZRn\nZoH\u0000͟sӹ?\u0019}W>ߪm7\nb#1e\u0015n\u000b\u001f\u0017?#s\u001e\"*aQ{u5k\rixtJK}\n\u0019L\u001ejH\n0}0:[gAM v\u001ctv3tљvZuծ]uC;rCDD @\u0002\t!`\u0012BBHHB\u001c\u0004r;\u001c\u0005\\B\u0010\u0015Z\u0011PXnŋu\f؇}f~/76ذQ\u000b@\u0010\u001bBbh\u0010\\\u001eYuun^R!\u000blQw\u0004Ls\u00126\u0019\u0005H-M{#\u0011RpR\bʒ\u001fKʓ\u0016\u0014\u000f7k׌MrM'?gİk\u0017\u001b\u000eS!\"\u0004\tq8@& \u000bxw3Ksޖ\u001fG!禼:􊑟 %\u0000X\u0012\u0017~H<\u001f齾vmW\u001fkaİu\u0003\u001b~AD\n(\u0006Dh>F,AC~\u0002\u0012I)o|J\"&\u0000\u0019xŭԤǮ03bgF}P\u001fM}3-z\b[6|ǓoK\u0019\u0004@C' 룐\u0014\u000eA\u001d\u0004\tP\u0010\u0000tD\u001c`#c{xʢ\u0014\u001d\u0005H\u0000jl80bÀ\u0015!\u0001s'<\u000ejc\u0002/q/\bӃ@\u001d\u000b|\n8-\fQMxFeU>iHR|\u0000/1{\u0018.K<['-<+AIgPW7\u000bK\fg\u0006\n N\u000b\u0002\u0018\u0010H]iD/X\u0014\"IYEM\u0007\u0004\u001do(\ng]Ytd_6]8|pR~\r=)L}\u0005Uz\u0002{@\f\u0004yf4HsRA:VPRX[CYq\u000fDu\u000f*\u0014ܹr. Y%3Xl\u001asZ~\u0007=*\u001aUN\u0015^i\\U^,t\u000e{gP5y\r- A\u0001Er\u0000(ӣA\u0002eQq\u0012>IY`<<)`?\u00115Y^2]b+0gnϪn\u0017]T_\\Vc/=˚%\u0013>\u0003\u001ax\u0011[@\u0016\u001b\u0012A#I=,-B-\tg\r\u0005Vm<Ǿ_%߭PfZewJ-۸\u000e?{5#\u001b\t%Sry\u001fUC \fݠ>\u000f\bФ'XʂRlF\u0012yCrsT\u0011I<MlQ[Tpo|\u0013s^7\u001b׍\f/\u0010.v\u000e?A\u0018\u0019bw& 4'\u000e\u0000Y4yhs\t1b\b\u0004U\n\u0014II0k&K;tWp}\u0013Qh\u0005 켡E\u001dp\u0006 \u000e\f\u001c\u00070'#@%'\u0016U\u0011\u001f<Ft]\u0003\u0006]\"JQIeV\u000fƟ5\r\u0010L:cmvҘRU\u0003o=HB?\u0003M\u000eh>\u0000\u00100%ŭҐǞ݌!Wi\rKF\u0018MvWZfC?]>jqF-VTyl\u000e?\u001ad^6b\u0007#\u0002Sl0\u0013bYKO̹\u00054KftDuE5spx!DGSvW\u001bLv|j'mm\u001ecUZգ\u0016_\u001a\u001a\u0006E&Ѕm\u0007c~0\u0004\r\u0011֑ܙy<wΆ4\u0010*&ԔZ?ȯ\u000b5LA׵YNZSv}ՐCW=bPG*Ǧy\u001f\rM\u0012\u00055*`\u0019\u001f#\u0019T\u0006r+'{\u001d]x\\Z1\u001dRR=bz\u0013Scna\u0018mZˡ;tS^v\u0018#6)U\u0003kP\u0005o࿂9KpD\u0011\u001b+1v'=~oPK6\u001cm 24Ny&j<dnLCqN!hdؽ|\u0005<5\u000fm\u0004ám`\t\u0003p官z\u0012\"\u001f\r\u001dAN)@2FW\u000bgWeF\u0019[\u00155\u0002YҠ5rN\u001e\f{s;n;~U\r\u0000Ơ\u0016\u001b:\u000e9\u0013\u001d8p8tޝ\u001e55:ї_\u0010{m\u001aL5X\u001a\u0017If;Kc%t6u1\u0005N\u0016mgF|\u0006|A54\u0007n\u0000S_\u0011\u0013B{<\b|p!-'+EKV+P-U\u0018j$nl52*mwVK\u0007\\'%n'M4b\u000bGl\u0002 :\u000et\u0006Vh\u000fÙC{3\u0014\u0018݉${/$8p4R$b\u0013]ՠg0u&Vi[\u0015*sTnG|NylZ5HZ\u0007~\u0002f<m?p3OخW\u0010;oO&\u0006g$\r\u001a*nB,k8N9Ei՞VO\u0004:c\b\u0002w+MX\t$\f\ba\u0005E\u0003\u000e\u0010\u0010О  *EY\u0010dHeJ\u0000q .{1\u0007wRX%*UXʄ3\u0017W7j5W3K]L8\u001b(L6@շPv\u0010j\u000f{\u001c5m;n2I\u001fXKg(Q{8$NQ\u0013#S~-I!\u0014-P%_e^*(֔Tj5\rUږJrJjnm(\u0006\u0017vOnصЮ\u001e\u0007QWGC6{}:#/aǲ\u0015j vB\u0016&ɸR\u00151\f<\fs\u001cx\f{a9nm(1\u0006̷C;\u0007vNwo\u001f\u001c=ce߽1_ơ \bdi7NHQ\u001eƋ化|r\b+FUhueI\u0004\\\u0012yQiGgt\u0002mù[6_My>W\u0013k:nv}þv\fsv$4y4A֏K磻2nuJ\u0015\u000eUaDG222qwQ؃\u0013RpaWPgM/\fuLnmXivu:3_0\u001e\u0018%y\u0019N䍡\u0018I/ɴQ:8ǌ\t%bP,|Tv@<x֍6yPNPl\u0001jLdas\u000b&ۯ-Z^.wv+\u000e\u0005F4\u0011DM\f2g\u0012fhɘ\t\u001e7(-bL\u000f}Q(\b\u0019UFE#\u0001#׵\u0004v\u001b@W\u000f6{ꅿol`btq|ɒMx'\u0014L\\@SߡE\"\u00053OGkYNb )tZ\nR\u0004M\u0016\u0006Lp'ʸ~<xNPm\rzc\u001b\\c\u0015]O\u0016fylş]]H\u0010G$\u0012;\u001a\u0010zO'DM\r{B\u000eYL\u0004\u0016\u0002\u0016y\f\\QFє{V%ܰIe'_eP\u0001[OÏs,\u0013\u001cr1\u001e\u0010\u001e\u0014\bF\u0000\u0019\u0018\u0019\u001d\\!}!C\n\u000f+&w\u000eoF|,earq^T\u0004wgt\\w@~`\u0017\u0017`S6\u0005%#䀣\u0015\u0013mI눁`(@z\u0003;\u0004\b@\u0007F\u0000\u0002\u0012\u0002}\u001d\r`Ox|\fu,\u000bs\bs\fwY9\u0019k:蕏\u0019\u00179\"0.\u00152\u0000\u0011\\-Ps$\u0002\u0002mC >\u0000\u0001\u0007^@q\u0004;$\u0001\u00158\u001eΐ\u0004BOGhO\u0001tP___r:!\u0018͆\u0003i`=\u000eli_(x\u000f\u0000\b\b1\u0006\u0007\u001cr\u0003a\u0017 \u001eq\u0006#Ь\u0003\u0003$\u0003\u000e \r$v@\u0001\u000em\u0006\u0011dx8\u0012$\u0011 F{\u0014\b8\n;\u0015(\"a)\u0013^STS\b\u001c\r7\nӘ>ɟAdL\u001e\u000bb\u0004c!3쨠\u0017bUom`k\u001bRS2\u0005i\u0005@\u0000\u00111\u0000\u0019ȏlr>>^@=͚#K\u0010+ڴW+\u0019lc4`\u001a}_8\u00141C\u0011Q\u0017~u6h\u001bxF 0l?\u000b\t\u0003y;H\u0001 !?)|$Y\"3?iV徊H!fLSI̝Itx\u0012#\u001e\u000e{vM\u0007H!!M@0c\u001b\u0006r?H\u0011+\u0019e.%fNMcH͐/dL\u0013k\t\r\u0004V-\u001d<Iϥ\u001dA\u0003=\u0006j\u00192\u001c\f!\u0004}\u0005APt<\u001fdFd20)䷩B$9KTr_KӔrdlM\u0004N2Y\u0012ے\u0012۝=\u001f$\u000ed>I9wȫ_\u0003G 7\u0004^P\u001c\u0013\u00016P\u0014\u0002\b%Ȩea\u0012-\\`X\u0002L)jY\u0004FX\u001b|\fך3\"紒\u0014jro/&ꀣmj\u001bv;!\u0018NzA1\u001a\u0004\u0007\n1+d\u0007)VasYV.o*X0N?'\u0019Tg<'T\u0013Zs\u0010{ZI=yw)=?S\u00164О\u0016\\\u000e\u0006\u0016\u001d\tp\u0000|*\u0011N{\u0014?(ы\n\u0006Q#eMe\bXqiJѳRSFz9XFR\u0017wOMnUzwOqKqOV\u0005<mC!v\u0007\u00149\u0001~(>\u0004g\u001dKx}E5q\u001cc\u001bu\u0015(:ʢ2\b\u0003 R^P\u0003)\u0004R @\u0012JH\u000e\u0004\u0002\bC\"B\u0010E0\tA\\\u0019\u001f\u000b\u0018g\u0015nև}\u000f99? \r^\u0010\u0005!HyYz@-F*#1K\u0015cH9}\u0004b_Rh2/s/gf\u0011\u0013\u000b97y7\rHP\u0013\u0001a \u0007\u00000WRX3a\u001aA\r*v\u0015\u001e=A)%(j*5ybf?7\u0002\u000b+@\\\u0015\u0018\u0004MH@2\b\u0014\t\u000b\u0000P7\u0003\b]\u0002APe\u0007\u0016\u001aB<*#\u0013\u001eq\nr\u0013|h%x\\N/bz|V\u0007Viè-\u000e\n5(n@\n^$\u001b\u0017\u0006\u0010k\u0010\u0003\n\u0002$ub\u0007\u0010\u0001\nwk<sS߉MAn#6\u0005kHfǸ\u0018\u0010HTAtVU\u0015հ\tb@)ŶeK\u0012\tD\u000bb.n\\\u000bPbju\u0002n\u0007@if\u001f?Z\u0003_\u0002x\u001ew))J_zUB]\u0011;ŔF2]K\u0012DHHhR\u000e~DVMIDIԋq9@>\u0011\u001c\u000ed߁zf0]1>F)\u0003\\d7\u001fKhe\u0017R\u001aUr:[Dx%2Q5I%e\u0016uaY\u0015I+tJ^%\u001b(G-\u0000il\t\u001a\\~\u0000\u0017N\u001dSyU0.FyaM𔋵\bd\u0018CPq\td\u0005&؜\u001a\u001eL,Q\u001adJ)\u0014BJ)dB֋\u0001$SC\u0011\u000bw\u0006\u0014Nyߧ6\u0003Ʈ6/>\u001e\nq\u001aJ\u0018hMIlm\"\u001cY+q\f&WQ%\u0014+ŕm\u001b\nTbs@\u0002\b\u001d\u0013@ӞE\u000foܭ\u000f\u001e-~b0䤶\u001c2\u0017'rą\f>UepKyBBc^3XVVIqUz1\u000b>7\u0001\u0000O;A\u0016\u001et\u001dz\u000eB;\u0013\u0013~ICț\u0011\u0005\u0012F-LZ,\u00168\u0004\u0001GK(^4#J\u001c\u0004]\u0017cz9@Y\u000fA\u000e}O_\\;nzGPLh%\u0018\u001b%lƲ.I*\\Y(ؼ\u001cX%m\u0014K$ik\f^-\u0018\u0017!Bs@i\u000e\u0007\n?lu\u001a?ov9цwD\u0005%HS2{31\u0015|\nn)c!5*!/Q)Hj\u0010&I\r\u0006A \r|s\u0000Psp\u001d3F>M/Gl|tĺκ>mw3ȭU\u0017\u0019\u001e\u001f\u001dN\u0006ӑ98żbt\u000f,Bw2I\u001dj\u0013Vs:L&9Z&9&\u0000^\u000b\u001aMaݕɤv\u000fO\u001ceq'Ey+_hbh'G\u0011D\u001ez\u0018CȺB(kAzE\u0000*f\u00115Ό\u001c0\"4ӌ)ft\u0014\u001cPnj\u001c\u001a\u001cXo\u0017]+o?سB쨅手e36M\u000f\u0002$Po\u0018(u\nv02`R\u0004y=0^G/\u0011z*TN\rk㷩a#3\ns\u0000r%ۿ\nVe\r˴\u001e?si1\u0013ߓAԇ\u0011a\u0007qIw3S\u0011Y\u0002*v\u00175(\bY51讆\u0018to\u001040xQ9rl|Wӆu\u0010s\u0006^Y~m\u0001Kw\u0007|NQ^\u0004#Bqsғ\u0013i1s̈9Zn\u001c\u0017\u00190/GϷ`{|{\bc\u000en[\u0006:6-\u00062vk-oV\u001bZ\u001bm-FC\fq\u0014\u00184F\u0004\u0019c\u0013qƴ(c\u000e\fj&\u0018R\u0002ߕ}L{#}9,Wϼ\u001e3\u000b, S!VCﬁ}ؼþM\u000fGNK?z8O.\u0005{`b\u0002c?\u000f\u0004\u000f\u000f[BD\u0006/b\u0003>\u0010bS\u001aPo93){J<#}Yw:W@F4 \u0017WAZY\u0000۾[hΪ\u00048\u001f,\u0000v\b\n\u0002]\u0013\u0000#\u001axA\u00017\u0004\u0007̀\u0000\u0019\u0007}@a\u0017 z\u0002Z\u0007`C?\tO-\"ܖ\u001a#>65ڷ\u0002;\u00022\u0012\"{+\u000evM%\\\f-y\u0016pI\u0006^vq2_gQMg\u00009=ǥ=Gg>(*(Ȏ;\u0014H\u0002d%|\t\u000b,심\b@EERV\u0018OU\u00020l*wo{_\u000f;Ci z\u0004Cg н\u0007|_\u001fH\u0002)O\u0000m;\u0002ݠ0\u0015ʃ]ʬ_Y4(\u001f\"\u000f65\u0019p`\u001063q'\tܭc\u001d\u0001~3!>\u0000\bG \u000fP\u001c~\u0013؎\u001ewr\u0003+ ..:\u0011rN@\u0003\u0014uᎅEc\u000b\u000b*lظ\nz\u001a\u001cH\u0004MQ\fx\b\u0006\u0010\u0017zAԾ\u000eDkW \u001fpN8t\u00028\u001c@`s\u001c$@fk\u000fa;P\u001f\u0003Yl\u001an\t\"\u001d\u0016b\rHQƺ\u0007<v\bR# 9\u0013\u001f;PN@<G{\u001fw>\u001doc.᮳\u0017cً9\u000bܹ11\u0017\u0019?\u001a`\rv뀍5}w\u0000\u0012\u001f\u0011G\u0001!Bj/YD\u0002\u0003}鈿S\n+5wq\u0016\u0012Y.棇xcy/q14o(v7\u0014\u0001\u0003kH\u001ax \u000e\u0019AA\u0011n\u000f\u00198x|A\u001c\n<A$5\u001fy\u001f\u0012Ki\u0012\u0019Fb\\\u000bg]nyyʟM\b\tSḗi9\u001a\u0018X\u0003\u0012d^\u0001\r\u0007gA\u0019\u0002\u0019F\u000b\u0001\u0001/\u0012\b\u0013SB3QSJ*bB\u0003gx7\u001fۖ)\u0015\u001e\n_ឋ&\b\u0013\u0011QKQO\u001c`}\u001avAl\t\u0019!\u001fOہ*\u00052| \u001a\u0002\u0012v$S\tؙd}һ\"Rb%{Tϛȟk\u0017\u0014\u0007%S1(q7a2\u000e\u001c`c\r,A\r(=\u000f\u000b=\u0002H'P\u0013AI\u000e\u0006\u0019#\u0002DB§\f\u00076i^\\suYbMׄ^\faT8.}\"4!OnQe]f|i`\u001fY\u000fi'lm\u0017`\fw\u0004=\u0013\tADx\"S޲L7R+jp$yt23mx\u000f\u0019#>e=1ı.${5p\u0006נq\n&\u001f+\u000f0\u0007ȋ9\t\u001555l\teԄJtJ\u000e{U\u001fK\u0010?Mj>\"k>G>EOsE7\u0019ڙ\u0014+2<b\r)׃א\u001d{\u000fA\u00071(r\u001fhH<=fDϠ\u0017H:X\u001eN\u0015KS\u001f2jdК2SBQw)봑6HV+c$i\u001e\u0006:F-P\u001b\u0002,SYr\tg\u00142mGkq#(BC8\u000fzB]NEz7\u001eܒIN\u000f/3au#kX]y2\u0007xV:ȶ\byΛk\u0017\u0007?T9>k\u00191`0)쉑KxP{\u0014\n]D#؄t\nJ2:xՙ&\u0015V\"_8Cj71\u0007R\u0006uӲ\u0001\n6Y\u001dPsMҹ\u001f>\u0017jY,BOz;[Rd:\u0010MRh\u0015g75V]={__\u001bЗ\u0007s\u0004b\u001cc\r\u0003kAENB\u0005v?k|?0\u0010j7\u00188H89PE\n-aoPoꤜYB#k\r5*a\\pP&k,\u0011\u001b\nE\u0003|>O<3K\u0003b\u0016XC㟡m+y~oߛ`\u0017b<\u001e&Uȥ\\59颦lYVɋTg*uũ\r\u00056cdJ3\u0019Ft@6c\u000e\bv\u0006`^GKq\u0002\u001e;}^]\nh;c;\u001aH\fN]/eS\u000b\u0017\fVUfRe $7eMZYWF0W-3\u0006|@oΗ\fl1a\r\u0015؜um%]V;B\u000f=\u0012vB\\pW-%\\gKE\u0006\u0005RSy*ʐU(\u0019\u0016\u0012E_0}&\u00147\u00019 \u001a\u001f@͟\nS߮\\tncuO:\u000e>hp{+!Z#9RM2Ǫ*\u0016\u000bKH)\u001b\u001bT*mN6M2յ4\\DgB\u00019_\u001a2\u0002?B\rp%Mumw\u0003\u0016u\u0005\u001fL@#pBA^\tST::8iQi\u0012mlY\"Y\u001cY9}^Pd9(R6 D)LI3\t%8)|\u0019'r2$\u0005E9)y\u0012W\u000bro\u001d\u001e?(}S\u0010ӑ)\r֩ CO\u0003ǥ]%c7M\u000e5Y,iY!iFy-_RM-ϻR?{9,Rl|RRF$5t\u0013YqE\u00117\u000b\u000b\u001f)ɏ<ޑ\u0017)\r\u0015\rY\u001b4PS\u0015F5;\u0017\u0018/\u001cxWg-\u0006^f72.ԊU!AyW2*\u0012\u0012R/}8Bfzc\u0011%9gʥAgjĥ\u000f\u0014:NwJCrg\u0004ECzu6\u0007Wzsmsw~a\u001e5\u0003e\u001cJmN qȈԪkRb\u001cWH\u0006:&*_V/+w_rDgf\u0006IkU[4Pe1vGO}MO@ٛK_omϕ\u0016\u000fY'\tYw\u0003FHN\bM?\u0014x=G_s\bb\u0006:Uݔɬyɮ|ɭ\u001d\u000eRAb/+զtU|J\nWmR}mNW\u0017)6'|\u001e\u0005\u001ecǄ6%ň\u001b\u0005w\u001a\u000e3\\Heܩ\u001b\u001a%w_J{\u00181\fGV(d2*uTnVyxիE5.vmyN5ҏ.b<\u000b>\u0016\u0007\u0018oDrZc}[-\u0017\u0012U$rD$j {\u0012.TB2\u0011/^#\u001e\u000f.Sj\u0018ПS3gi{\u001bݒ>'\u001eO\u001dqb_B\u0001]\\~gݑ&ft\u0004{w\ft\\\fꨎltz\u00159\u0014)z68D\tW\u0010o\u001b\u0012Z\u0010?u#ꇗT\r\u001b,iCzҏNF\u001f<,\u0006iQ\u0003L\u0001?Л\u001fO`S,W}ueyUL+vS;3$~S' j\u0010#*eߩ]o^T,7Y+O;\u0019'=#e4@\u0019ӑ/rdbO,B\u001d&\u000fxȏY\u0012huX#wvݗ\nC3깢L<F{FxA\\\u0019T:\u001a۴|O\u0018'\u0018w7\u0015Sx\f[\u0004ׁ>!rL:{NFN&&%\u0007S\u0014T˴}P<4Mt\n/fVwWkS%*4ҩǡ;\u0018\fRa:\u000e6\u001bp`\bF~ 0cF\u0005\u0013n\buF#\u000e#\u0016G\u001c!\nE$Ks@9]0\u0007D\u000b\u0015T\u001ae\u00198\u0010v,`X\u0013`\u001e\u000b\u0005N70I>\u0000~\u0004 r>ę[\"\u001cfȱ2E>\u0013ރ\u001fwf6uw\t r3W)\u001d˕\u0013\u001e\u000b0b\n\u0006WS\u0006\r$x9[\u000eL\u0003kpXB\u0002A\u0010\u0014{c7$;\u0015C#\u001b@!MO/\tX/AbAh)\u0007c\u000052\nE0\"Z\u001e\u000e+l\u0015<Wz/\u0018kL^\u001bu\u0010\u0018!Xw\u0007\"u\r\u0011~\u001bR6lE8\u0000\u0005z\u0001o*XF[h\"n9\"\\t\u0010Eق\b.\b- \u000e0\t#nyYL\u0005<\u001d>\u0015\fx\u0004\u0005j=\u001bir$5w«\u0013\u000b/\bU\u001dr\u0007c3\\\u0013\u0011嬃h\u0016D1w!\u0002av\u0010%8\u000e?)\u0019b\u001a|\u0017J\u0016ؠs~S6$\ro=OQ\b3M\u001b\u0019\u0011\u0006Adp\u001bm:f2\u0011ɷ@H\u001dq$KˡS\rY\u0006\u0018eLT~Sz\u00147I}\u001ft\t\u0007\u0004_(Âh#\u000ft!\u0017\u0018\t\u0004\u0006NuM5\u0011exuH،x1b\u0016\b\u000fCp\f\t\u0001= Ȣ{\u000ev)\u0013Ki5)Zޤw=@0A}N7PF,\u001c\b`Ȅݾr\u001b<`&\u0010O\u0010lX+m$9C\u0001iFg#Zd\b\u0012\u0002= ̠W\u00005o*oQ+\u001f~(F{.\u00130F\u00180L\u001cw$\u001dsD%\u000blgg\u0004E\u0003w:v/@2\u001cڿ\u0016.b\u0014ϰ=l.R-:{R\u0015Up#V$\u0010BB\tY$9Y\u0004\b$0Baod(PW+^!,E^y>9/yw}\u000fq\u0007\u0001z\u001cP!\b\u0003qO(\u000bCT\u0019=\u0016gd\u000bW\to#\u0006o\u0012_F M\"#Q/IѯȷP(7b\u00035.\u0000\r0w~\u0006\u0012B~`9PX\u0007T?\u00029; \u001c\u0000<q\n'jp\u00191Ƙ0oEר*F\u001c< ~L!f(#QQP/i1sk99= \u001enmq\u0003\u0001b\u00145\u001c_\u000b4!ۀ?P(\u001f}cyJ\fMKB$gsf\u00162dL\u001de\u001cNEF\u001f\u0007c~cDϲ1\u000e\u000bvK}\u0000\u000f7\u00106\u0001'P^\u00044cA-Bǔ}7bj\u001c\u001f6Ö#qr&)D\u001c\u0015Q\u001eacn .{\u0000=p3VsnCsn\u001d>@X\u0002\u001b\\\bV\u0002?,\u0005 \u001f\u0011!tǻ4\u001a̡Y%Դ\u001bj\u0013H#\u001cu\u0003z:~CCoX}:No\\{5MU\b\u0003\u0018?ͯO+r3nw\u0005fB`\r9HY}LpuD\u001c\u0012(09ZMF\u0006\u001a5M.t\u0012+y&A\u000b\t?,'L2򤨈2%\u001f\u000b`u\u0005M\u001e\u0002\u0015%;Ěsy~QC|\u0003\r\u001d%\u000f'bz\u0004jb\u001772zjRXMI\\I-)'K\u0013b\u000bmB\\@ḨO\u0005H8\u0003\u001aW\u0001w~\u000er\u0002Csk\r3s63Q64r\u00146[!¶K\u0014&~˙\u0012F\"D\u0001]?L\f49.5%Y\t=7pH\u000f`1\u001f]\u0004,\u0014\u001eY1W|rTMOw\u000f\u000fe\u0012C/0\u0011m|L\u0002\"H\nQ\u001ao\u0014\\JhKٍ\u001cU}_\u0019\u00196HϵIӹ\u0012{\u0000\u0019n\r \u000bO\u001eO?|{e/ʏU\u0006{P\u001c\u0019u''L\u0016٠KT2^\bfq Oh\u0012gK\f^\\R\u0006\u0015Q?&\nl\u0010Lj\u000fw\u0006\u0002xѬw\u0007݂\u000f{\u0017\"YMв֞\\;T\u001ew\u001a}˄\u000bnʦD֤ctB5YN7)S92 C'N\u0013E\u001aEC,\u001aP\u0013G\u0015I1YR\r\u0007P\u0006J\u0017[\u0006r\u0007Y¹}'\u001b\u000e}K5\u0003Uv \u000fY/Ηg1c|I'\u001bS\u001cCR(NYd*R!Z2_\u0005ɞ*!hT\u000eAc2\u0006\u0003px3H]\u0006}=@]_Y0\u001a^}gwt#\u0002\u001b\u000bcOU\t\u0011EttAV\u0002\u0017JN\u0013SrY&U+\u0012UJJ\u0014E1Ha\u0001U@5i\u001ekwxN|ҹk5zC'K\u0017Ԙ<\u000e^-j3$/K5\u0013u&-Qp5\rJ暒\u001dQr4rn,Am\u0001@\u00067dK[>Tluٰ}së\u000botxՕ`ߦ\u0011*P'B2p\u00155\t(\\\u0005\u0019<af(+et}VR\f\u000f\u0015Q9#uL {\u0000\u000b>\u0007R'\rG&w5\u001b\\gZ׻^<|}\u0007WwV\u001c\u0016Pr9꘩\u001a{.\u0014+a%\u0015R!(Pq9\u0017<c952|N<>g\u00198\u0006\u00113mRa.\t$\u0004rt\r>SWV:rk>W\u001fX}rKEG\u001eK\u000b2؀9ZG@$Ub\u0015\\TDc\u0017+شB-h\u0012.Y\u0018K\u0014}\u00036(E[%XӸ$.wBl\u000f\u0010y;\u0002\nOU+ڼ\u001dG\u001cr꽳ݳҚ\u001b7\u0016\u0015y(\u001d\u001dn\u001a)(A=\u001bǮ\u001352:ZVf$+̂J\u0011]#\u0012E\u0015OP)=@\u0013/q\u0004֯\u001c/qxpoӡrΟ}=\u0007\u0003K\u0007+\u000f3F\u0004NȺ\t:\bV\u0007\u0013Mi\u0010\tӒLC5\u001b\u0002vDS\u00057\u001b<\u0000]~\u0010Qm\u001fP.r\u0004F/\u0007Pm`C߽y\u000eݏ:6Žў%GVg\r\u0007\u001b\u0016 \u001duDЏ\rfB)7\u0018^^Lu)6Z2>\u0017u\u0016䝆\u0001c\tЪh](VED$\u000e\n*d/F\u0002I\b\u0004\u0004\n\u0015\u000bb#ngT\u001c-.u\u0001Gܷ\u00020n\nB\u000039+r?\u0017%RC]9˻RzU.y;w;\u0016l`\u0007Wq\u0017y\u0017-g?cS_\u001diy\u0012=*\u001f|\u001f\tBKZ\u0005JO6>b)MSXT*4V\u0004Uj^cu:\u001fZvctWn`>ӳ~˴\u0005[\u0011\u000f9\u0012\u000fN;\u0011W/9\u0011\u0010'%j:f8\u001b#m\u0004ϲL\u0017viTv:^֚ۖǔ.[W\u0005d\u00161uV#eߴj%?\u001dPbv$k\u001d4\u001amv!\u000e&2yҶ]7tG۝8\u000b\u0012/t)\u0015]8IWN0׵^bvWrRsLyc?\u001a=\u000e*˷\u0007\t/\u000e\u0006\u0007m\u001a\u000b$\u0003\u0015\u0003KQ\tTL\r\u0002eP`F80+c_Ĵ\u0014ŦXJ\u0017\u000fU$&\fU%\rJ\u0019>\u0012=r25j\"#C##Kn\u0012D]=q=ɑgDGw>ѝW!p|!ݲ\u00117=\u0003^Jp|\u0010Rq^>(\u00059!Q\u0010\u001a(\u000bH\u0010\u0015aY\u00141!\u0018\u0013;B\u0010G.\u0010;\u0004QȞX?2n\r\u0017)\u000f~c3\u0011:Q/H&\u0000Ã\u000br\u0016\u0013\"d(|\u0012!/1B\b?\u0004\u001b\u0003\u0002\u0002T\u0007`\u001f\u0007GMG\tb\r ֶ\u0011j+}\u0016<\u001cAw#`\u0010\u000b'p\u00113nI`ǃ\u001a\u0003Ѵ(ȦG@=#\f:\u0010d\fR\u0000\u0014\u001ay=\u0017[9\u0007}Ʀ߷ V|a\u0012S\u001dt\u0000D}\u001eHp\rGP'\u0004\u0002'C>i>ԓ}<\u00179S|P6\u001b%_z\u0013\u001b=P5u\u0006v\u00041\u0011 \u001aġP/r.\rܙIH\b@Z^(%Q|\u0017\u000bDJ\u0006/\u0015\u001a&8X`a\u0001:\u0017\u0007$\u0018I!a\rxa;{K\u0019!Ȉra\u001b93a\u0010ӡ\u0004@\u0013\neq\u0014q\u0010u1\u0004S\u0000y\u0005n-\u0007\\\u001bHnlf裆XT?go\"a\u0006H\u000e\u0002i\u00079C\u0017\nc\u001brY3a\u0014aH\u000b@FV\u0018ҖECm<$ 1\u0015n&x\u0007 k&i}\u000fV3\u0005\u000b\u0004#~\u0000{P\u0007i\u0011\r\tکaa\u001b5,\u001a\r>\u000e\u0010.A\u0015\fC+Ĺ!<\u000e2\u00000\u0017DC:\u001e\u0010oe@X\u0006u\u000bQ\u001eS|pS\\\u0017(n\u0013D\u0016{;rPo\u0011,'!6@f A\u0013\fc8\u0014Lש\u001e( _\u000f6\fhLj]\n䛙āh\u001f\u000f'#NwY<L\u0015[ȧ\u0001򍤏염̒v\"k\u0016[6A>\u00063a)X<\u0003\u001c,a&\u0014Fc42\u0012Q)m\u0013kD\u001c,\u0003Bg_ \u0013ܒZTO.\u001cP&6+\u001b%_e\u0016-\u001b \u0000/\r\u0006_'\u0014\u0006E}4\u001dpR4\u001fBo`,L\u0018\\jV[x\u001e~IvX%=!+9x-\u00147+__)[T-\u0001=YsSn\\V/*G\u00075f.\r9sPl8P\u0015Y^X#*EP.r`i^|onI)k-筮\u001fE\u001dҗvElSec\u0003M셦Y֓~G>A^W֯;\u001e\u001d\u000e8\"߇U\u0001cP\u001e\u0005wG\u0005\u0013s-\u0005}5bc)pڳS2$kw[4U\u000fՇ5\u0019wtO7T]Kzuᔦp<p,ctPY3dz;/J?G\t\u0014ʔ\u0019C9}~kUa\u0015\u0005O^i[+h2VJ\u0019n57^KYEspI}%낺)3=\u0019=ƣ\u001ec'ݨ6\u0001^(aS+6LX4}\u00157oFyP:}oKV\u0014q.[#B~5wsڥ\u001d\u0019\r{\u0013S]_QMi\u0000P\u0014\u0004\u001d\u001bXP2*:\n қR\u0003\tɗ\u0002 Ih\u0001\u0000%t!Q\u0014\"ʂh\u0018x\u0001w\u0004#IY\u000b\u001dfo:^O\u0010ERS\"\u0011HN\n8\u001aLAȲ5,2_*\\7{|Ž%a?<ˏ=? \r\u001dJI\rEޢ\u0015Ĩȥ\u001e\u0014ۅow:\u001bf0E4\u0016(7*\u001bH\u0012w #jc\u0002\u001e\\\t[YX-Tylf\"n(<=\u001eŷ?\u001d|#jd7+'\u001aTJ5k\u0016r\u001dZCK&<K:Z%IO\u0015\u00167\u0014\u0004\u00108\u0016+69(8\u0002.?b\\̺:M/꼷,\rՔ]r\u0018\u0012`\\sH3\u0019A]iȶ+&vAB\u0003,IF\"Irj%^N\u0019(P)5TLх4=M@[\u0016~\u0005\u001c̦#\u0018\u00163+\u000f}\u001dXlp\\J~Z#ʈ\u0013꒸sB<+\u001eԚ\u0012)\u001eSMJ)WŤ2f=\u0018\u0004P\u001f\u0000zgd1P.SGai\b!p\u00022\u001eo;:\u001fڭX?fk:a1vz͓f7~\u0007V\u001d+9,\u0016P\u0002\u001bsX\u00112^Z$=+A\u0015S+ȅ)V(b#,^\u000b&/YLAzX\u001eHf}g\u0004!mG͞whs:6^IK([^L\n\u00150\"Ĺ1eY\u0004af\u0001>?VM63rz\\?Y\u001c\fBr\u0010s9z!p\u00122;\u0005i\u001ck#|r\u0001[a[!g=,Ʈlׂw1XWef\tƫVD\b\u0014\u0004)tL^Nn\u0012?Γ8rFJF7qxg3Pr|UO3\u0004& S5`їƽ}/\u001f0~_5t<᳷9h[C䙆xO$_TN\r\u0013r0<AvRZt%OLc4@Pv'fQr\u001e9Z\u0006-K\u000b::\fI=mB(j;jykNm\u001bx\u0011gSzl\u000f8h8]\u0010Q.\tȡbrN<K..$2ʩTA\u001dT\u00173\u0004\u0010Z\u0006@\u00074Ra0\u00159\f+\u0014\\!ۊznzyc\u0013Y\rɪVua\u000byL\u0019\u0014ɭ\u0012˖d$+22^$% LY\u001f\u0014/\u001aC'i\"=\u0015+4\f\u0001\u00056?\u001b^\u001er\u0012߳F\rݵ[٧>󖻍\\g'\u000e9Y\u0019ߎAZ\u001c\u0005-՘\u001cM\u001aOd%\u0004LM59\u001aU}v!\u00155J@XĖ1\bfGyPd\u001dв\u0006<S\u0002\u0013V#AӞ!u̓ne\u0005K8/NWE5J\b\u0015Ih$dc⚋QMR|\u0018PBF\u0011/EbD-Bf\u0018Yk'j0u\u001ca3pG\u00114L\u001f\u001c~źrg`0h:{;<\u000fCIǫ\u0018!\t91=K¸nIBR\u0018\u0006tGa\u0002Z\r3\u0000Xd\tf\u0014+`%P\u0004ɵcrqQKE\u001a=\u000f\u000fs`\rG\f%'#`B\u0017\u0007S\"BՂ <o7W=F\u000f1ap\u00056\u0006m`De\n\u0007M@Ϙ\u0019hZ\r\u001ai$:d^ic\u0013\u001di\u000e&C)\u0013Q'q㘳?\u0011ܢ~\"ƮC4<\u0000 O#\u000e(B|4c#^c!^\u000f߆y\u00119\u001ca\u0012\u0013\bv۷r\u00144Oڹ@<gc\\4{<{q=5W=\u0005b_<Cp\f\r\u001a0;aZ\u0016{{M+|<gz\u001eχEO/ݦ:lЌ\u0014\u0000M\u00115\u0002J1P<4\u0005UÓH\u0011Uބ=ju\biݬ\tZ]Qv1\u001f\u0003)\u000e~lG|i\u001eZ9]~\u001cYy!\u0000;Q@ه\u0002a# 4\u0005Es@޻wM[R;nHz%K\u001f.\u000e\u0010/C߇\u0004;\u0012\u0012dﾔzuę?O9~R:<t˄g-Am\u0000t\u0002 \u001f\u0004@A)\u0013c\r,[\u001b1\u0012<*OQu\ncK_ࠝ>p.O80v9\u0019f\u001e<\rsmOv\u000ecb8fZp(%-$T,,5K34HDu\u0013QP\"K\u0007ٗdZN<9\\vupdi}{>Q\u001f\u0010\u001c\f`\u0005\u0007>7ZNHM\u0017$RC\u0012Æ\u0002Gda\u0019\u0004+\u00112ZB'pĂp2\u001dS\u0014\u0019Hr]\nj \u001d\u001ayhC\u001c_K^hyb5b=\u0012\u0019lО#\fpQ,\u001c[\u00018X\u0010\bG*c\u0014\u000eE\u0010_\u0000O\u0010\u0004D\u0018NC\u000fVN)i8\u001dGU;ۈ&_HfPHZ!I\b!q\u0016\u001c\"Em\u0018B\u0016\"~>\"\u0003p\u0007g\u001f\u0004#!\u001e\u0005(Oh\u001dg3a\u0019NQ4\u0015N\u000eB8k\u0010C\u0006{-!v,t\u00045\u0019J\u000bd\t\u001e@T\u0010\u0000~|p7c1?#H\u0004\u0018KAo\u0004*V\u0014\"t@'\f@\fP{}dY\u00077\u0019`\nb \u000bu:\tZ34b\u0017(\u001e@,\u0000i!\u001b\u0001֡%`D(0~N\u0003\u0001\u0005\u001d\b}\f\u0005G6\u00189?CL \u0005 [(B\u001c[\u0004=\u0019\tq.Ш=4B\u0017\bqq\b\u0015\u0016\u000e%\u001e\u0004x\u0014g`]y\u000e=\u0006;\b{5\u0004\u0013x\u00055\u000f,k  2\b)B\u0013lp'0\\Wx@c2;\u0010U\u000b ._\fQM\u0004\u0004;#\u0017\u0005\u0011\u001atp[\u0019\\\u00066scc~\u0007\u0018p\u0007\u001a\b\u0011G\u0016\u0000{ÜʘT\fe\u001e0}\b \u00145alZ(~\b\u0018\u0005'gYb.\u0007cny8=לOO\u000f11v\n{*D̿D[\u0003\u0011!އ\u0002-L쑾h\fh\u0013śH 1%\b:K谺8|H!rP6 \u0013c\u001da=,(\u0016^%\u0012~w\b\b\u001eBx/\u000e[b\u0010E܋\u0002=!\u000e9a\u0000\u000bg\u001arܑ\u001eN6\u0006\u000eC=ڵQTUnE\u001d/\u001e?%'bW\u0004/w\u0005\u000es\u0007ᓸ\u0007ے\u001f\u001bRȬC\u001cAIɃL\u001f;8bXɜ\u0002!|n>sZz\u0007s~Ē7\t\u0015ѯ4[؝\u000e>sQSYr_\u001e?\u0013ߓ\u0017ߑǷKWҋayu\u0010!CNF\n;ڢ0x\u0014ǡ<T\u0014[({\u001c*#7UMkO\fUG:\u0003n=uS]\t-yM5YGqI98\u001aR6k'4C\nk %\u0019D+\u000et@1\u0013rwƺwVt\u0016\u0018\f{z?u7iC̯\u001a?\f\tWmӊK˪\u000b[V\u001f곚fnPs8aPݤ\u000er\fLd\u0010So\r_+XɜzkglA\u000f\nRڳVR6^J\u001awc\\~\u0019qusBd\r'#C\u0001ݾ\u0001^n\u001af {\u0016\u0017&c𦐑=N\u0013_lN{Z!F\u0013x\u001cv f)`_)\u0011\\\u001fגYz*eyExŰxh21\u0019v&\tuA3\u0006lQfJo`MEo\"=ƚ*zU5ŗҩ+,e\u0004'sG*e\u000735h\u001bS\u000f$N>ؐ|Ѹ#i{KcmJqkjobMZ:Oo\rtg\u0010w%;\u0012y}w,p\u0015>zݭB\u001b\u0017/M6\u0017小\\!8D߲^7ZՐUPq̸%5:=iszGRUg\u001ecefobEf\u001a\nb,g\u001b\":z\u0011\u000e_Jמ 獡#\u001fNvF:unrsԱLvSQpxWZy}&6K&w*簩2yCgu9Ir\u0018r{\u0013A\"\u001frYLtފ\u0019#oser\u001fɁ`{&^ɛu6LfJSdSy:qM\u001eP\\Tee`KBE~Cb2isjrqؤϷ&,\u0000%!\u0004T ; (]@{\u0012:!\u0004PRB(\u000bR'DD H*\b\" \rqw\u0019Pag\u001c\u000fȇ99ߒs9\u001bI$(BV\u0002K\tS%> ~\"^=7y^as`&ETSYAʨcGq'\u0013y3좂s\u0014nÔ\u0002/\u001c.w-XO\u0016lDde1%PD _*s:bh\u0007qИvN~Vqt`~xv>ǵ6Ç_\u001bTSq4Һ\"މDnW49z)p}8EGדrlD\u0014@`VFExߡ\b³JdT=bH2`#7>\"\b\u001ea\u001ak{?~л>;0y&6)!3)l09l:`\u001d9e̒\r(FP\u0005y\u0016yX햅#`\\\u0005\u0016/X˜\u001fpQ\u001b\u0012<\u001dcr9Ut(P\u0010Z=/2*PmC|zu;+lrJ\u0014'&I̩ZgTn$VlDt_$\u000bX'\u000b\u001fڤE\u0014mۓJper7ujRzdYgg穾P3Qֵ]\u0015S<xm~y-E\u0011YM\u0015Q\u0007\u001aqmID$;DXb?Q\u0014̒%T\u0006\u0016x)\t+pwB\u0012nL+\u000ee|j\tm\u001d缴Z\u0007\"-+\u0019d7 '3'0дHv[}tָ֞,fuDfĨ\u0013b\u001aE\u001ci-k\u000b\u001d#tX99\u0012\u001bd*%a(Nyh'\u0002EFcmCl\u0003\u001e\u0019g\u000fqzKFFwDEvwǆ\u000b\u0004WB\u0019\u0017*x\u001b\u0017!6]4n5\u0014\u0015\u0018\rfp4\f_$z\u0016l\u0015ϻWLp\u000eO\u0018S]8Y\u0002ђ@HuHHsxȰ`9f\u0015H5'f`hȓ\u001a\bxE!q<\u00057AϭDM\u0003Z㲵LJu_-\u0010\u000bL\u0013R\u0013.e:Gf\u0002\u0002|GC|\u0017Bgx_\\\r\u00185-LOb\u0015V/\u0005Q`bkT\u0010ܣC\u0003%hxZ\u0005w4\u000e\t9p;Ґ}+4&2j96b)\u0011T\u001cX8}qG_k'+>NA\u0002&&\u0018t.C#I.\u000f^hz-\u001f\u0001;XO#v>c>N6\u000en\u0016k\u0011Rlrk}xg\u000e.+98=7\u0017Q\u001e;\u000bpa\u0014``\u001a\u00184ݣARP.F\u001c}CycJO\u0017$\u000b]\u0015ㅾjQPpav\u001b:MaC/\u0011\u0013\u000fao,lfʹ%?wHo,\u0019\r\u000bןDY\u0012\u0000\\\u001c\u0002\u0018$\u0001\u001ao4(^U5\"kUfJglYsVXV\u000e^\u000bR\rx_md-\u0019;]:fֳ{l`^`h>jd~r\u0001gc\u001b\"\u0003\f\u0001t^\u0002hX\u0002x@@!\u001c\u001c`CӘ\u0016J*䣃t'w9O~[=>*~fnsK;jZ|[\u001e=8\u0004\u0017t\u0007\u001d#\u001442B/kd\u001e@su:pP\u000eQD-J\bSь6t7t䌞[\u001c_\u000eCe!S\n\u0015\"g\u0019f(`\u0011*\u001b`\u001eTݍ=.ne\u0004\u001f4.\u0000O\u0001\u000e\u0006H\"\u0001Q(\u0003D'P\\ЈhCFG\t\u000bt\u000f}\u000f\u0006J\u001aa\u0001FK!k.<y'lba&6j`\u0017鬜:<GW\u0000\r\u0010\n\u0010\u00143\u0010)fhH1E3\u0011ZQN|\u0017:렻6о@&1FB\r$T0tE,+`\u0002HcHdHA'S*z|,hgK\u0000wi\f\bRDXUNہ\u001eyZNzx\u0000\u0019]F7FQ\u0013\u0007Lvt\fm^~1G\rgsEo/vh\u0007\u0003.\u0002:\u001bPń^$?s\u001a\u0006c4\u0006\u0005*b`*hw6zvk>:7\u001bict5A=Ș0EƬ_lWXi\u0016\u0006?M12q\u0001\u0005\u0014\u0010\u0010J\b$ވ\u0016:&\b\u0001$\u0012\u0006\u0018*e\u0011\u0011QyPE\u001dY+:긺\f(#\f\u0010~|\u000b\u0001G E\u0015\t\b3N:\u00028ͺ;8Oz\u0000\u0002\u001b@5\u0000!\u00048\u0018\u0001\u0018&c\u0001G\u0011\u0002́\u0000\n|5;Gk\u000b:{nq\u0000#x9\u0015g\f8\u0011fӸ/\u001e<.ou[@1\u0000?\u0007s!p@3\u0006\tif o\u0004^9-j\ry;Rf\u000f5\u000e@nr\u0004v' t\u0006R/2}e_^S\\?zqfLxÞ7$\u0017\u0000>h\u0007\u0001p\fA\bNAF\\\u00012\u001ar6h\u001fjіI,[\u0017t;RZq3~.Ӿg\\^3E\u001e&$ߑN_%\u0019\b|\u000f\n\u0010,\u0000\u0006\f@`i\u0000RkC\bٽ\u0018V@8y5\u0006l 9H:ff\u0017\n(wĬMқ\\?\u0013'?z\ru:L\u0018\u001fw\u001b~v\u001f{\fS?xJ\u0003;o\u0001e;\u0001\u00125C\u001bB\"/\u0018oS\u000f\u0017lK\u0016lY\u001ak3)N\u0010d;\u00159u\u0005\u0005t\u00123{ܟ1N|ʸI/W\u001e\u0018\u001eIs\t>\u0003\u0001@e\u0001@\u0007>A\u0006\u0010n\u0011gk\u0004JXO]%i2Bӟ֯e\u0007Ǥ鎣\u00022Մ!n\u0013\t1!\u0001kt\u000ek\u0016k:K7\u0002J?\u0007(}\\[\u00000G}\bEb=\u0012l\fAd<L0R׼?8\u001e/\":<n($_A{\u001e\u0006\u0016\u0012\u001ew^f-q\r^5^?e{z;B#\u0000Z\u0010h]\u000b\u0000>HQ@\u0014[!\u0019Mڮ{W{zn4yX)(6~\u0001;aj<ⵠ\u0012*+6EI>9?\u0018ǌ3qf\u000bK\u0004\u000e10$H 0\u0006<_^\fꝉh4\u000b\u0003]\\ܒ\\w,_!5{omwr\u001bqq\u0003Q{/3=.iH}!徽\u001ajϾ&)i\u0007d`Oˬc6'v\u0014MU\u001f\u0004\u0005\u0000\u000fE]sz=H٤\u0007[\r<E!~鰆d[6AZr\u0018܅\u0003ngc<{r}Ŕ\u0013a\u0015:߂XnN\u0002Iv {ƫ\u000b=\u0012V\u0000*\u00148\u001aP~\u001e$=\u001bQ4XhpybUw\nh\u001be-/#{\u000e(ܺ\u0015ɞq\u0018\r5~4&A~]\u001bɭ\t;˯\n&\f\u001b\u0012h'ey^|[\u0012-ӃH7P\\lқ(ݢJ]wr>ע/Kj{F\u001dܕ\u0012XRgkܴ?Z\u001fWLdUE7pQ=_DőEQoQ3C:~AW\u0010=\r1%ޙ\u0016h\u0003FIiV\u0019\rV\\-[SOxgWVS{zTg*|$1ZpqXqU\u001a_-k\u0013hbOc/sc\u001fs^r⦅sx\u001d!\u0010!n\u0015꽫QZM}y\u001d6T\u0003vnj\nҀ'\u000b;\u001c#\u0019=T>\u0015)2U>(I*\u0005ي.Q$]qWV\u0014S4\u0010)u߀`_vP@cMjM給`:IkOk\u0019[\nlZ\nϗΉ#j3\u0013I%iCibVvr\u0015/]$8)NI</Q%\u000eJTIc\u0012H4+T%\t\u0010 \u0014CJ\f2D\t6Ҹ\u0002{в\u0016lep\u0011imZuCԡ(U!%49,zfF!+M]MNk\u0010$\u001e\u0010'(Ro\"\u0012\"Y2uN\u0010\u001b$~A\tt\u00056td)y\u0019v\f\u001bhfpyFOcVsTHvUDk\n\u00159d\fZj& )07!N\u0010.Dg\\Dg YaL v\u0001\u0010\u0012G\u0013\fcZcq\u0012^\u0012f)vBqɉ\u0016&ʏuum5\"*\u0019Np.J/MM)V'\u00161\u0015RNl\u0011~T~PwF\u001c7\f#EyByΜ\u0000\rb˱CK߫\u0016a\u001b\u0013+'t0n?F0ml?u\u0016\u0006pJP\u0016aTd\u0011@B\u0016 \u0006\u0012\u0013BB\u0012\"$@Xª(.\nUQ\u001cPȠ(\nn \rP\r#Z*KM\u0010yONz;պTxl6yo\u0013qBi~W5+y;)-4,^\u001ch[E|fI)xҜ9?[bؔQ4u,̱\u0002,%4xPɄ۵LRτ6p\u001b\u000f{zS\u0011\u0003{\u0004aam_{swfUn\\茝S\u001b\u0013/Tޓݧұ0\u00126Q\u0019\rAޞ\f8H&+hhq\u001ch\u00162N\u00058r(jr+lקV\u001f\u0017Pt\u001c5\u0005\u0011smLa0UW&m0=\u001fg{6\u001a\f\u001av1nX\t϶\u0002ܫ{@4h:AV\u0016\u001cl\u0002{x(&njM]\u0014ds}\u001e[$^ؘ-װ24h*~6Lg\u001b\u0015sPfu\u001aG\fQ\u0007\fQР?8P\u0001m\u0000(p\u0010\u0015\u001bI\u0005\u0012\u001d.O\u001ev?֦K2\u0017+GOi3q㵠u3\u0002SO\b17i.U#굺ڈ\u000emDSV{?B{\u0002u\u0000\u001d\u0000Wj\u0000N\u00034$6\nT^e@\tPtˍRxˇzō΋%LC\u001a7j R˹~\u0002\r훂#۷KuU2M{\\\u001a\u001a~x%W]W(/`<*\u0012U\u0000\u0000\u001a\u0001Ԟ\u0006DL(?\u001e\n\u001e8\u0007|Z ֲa\u000bϞqڙ29\u001dבōXΏKQ(vl\r\u000b\bh\rTt\rPt\n\b\u0017$3\u001a,cܮ\u00008_\u000bp(&'ϒ4i\u0001k~\u001e\u000fy)mP\u0017\u0018̲qifm9zb\u0010c7/r$Mk^V7x(\\'7\u001f˞gr?s\u0002a#_j\u0007p\b\u0013FW\u00016ܥª\u0016\u0016^9SRӻ|\u0019.\t+Keex\u001di\u001bh\u001f:e<\u0007U\u0012GEw{Tifא27qO7\b|s\u001d\u0005ۿ\u0018\u001cF]gH2\u0000\u0002YϘ\u000e?Pz9Ը^\u0011'f\u000bei5Tz+@| V:0.dp_\u0006&\u0006\fOa)>C5Cǝ/:\t;\u0005/1\u001en&K\u000b`ŏ\u0000\u0000\u001fX4j\u0007FtM@\u0001-\u001c\n\faPBzV\u0000YaL\u0018Yㅘk|kOb\u001eX3\u001dٱ~\u0006&\u00146r\u00066\u0000ȻOO\u0000\u0003\u0018G\u00106ɠDW\u001c9\u0010\u0006\u001f\u000fi\"ӽQE\u0017h\u0006\u0017\u0013Ɯ\u000b,0b*e9,'aՖS\u00013c3\u001a{\u0018DQ\u00014H0\u0002)ځ\u0018Pq\u001aE\u001e\u0014!\n<\u0014Q=0\u0010\u001bi`\u0004\u0011\r4\u0007LOt=.a.\u0016ʰ\"aD\u0018\u0018CE4TQ\u0015DU8\u000bcPf([\r.\u0018R\u0015n(A\u0018S\u0018x\u0003\u0003X9\u0018xG\fr0\u00109\u000e\u0005ACڗZ1\u0013J\u0016j\r֨IGբ\u00188h\u001aJ*\u0004\u0018\\'8(>M\\\u0006'\u0013o<G\u0003Q`\u000eG\u0004\u0019\u0014B't>t\fb`8dL\u0007T;YR6*q~\u000fuF.J=Qr\u001fNި\u0017?(KGyR\u0004$%zQQţGC1\f0Vg\u0018်Qf\u001a\u0017@e;b/\u0017C\u000fxbQި$D*,,\u0018\u0011\f\u001f\u000b]彂w\u0011\u001b9zЧ[0OE-z\u000e\rc\u001c\t\fLZ`\nc16\u0001\\0j\u001b\n#ڭaMz\u0017o0|?@uDЧj\u0014*[>*/x}P~|ݣ|ݥBY0<\f}c%\t\\*fS1wM\\\u001aH\u000bt\u0015dr\u0018t\u0019q\u001bƽ7j\u0013Cd\tn]\u001e7\u0011\u0007{G}^kNtiD/5D/4\u000fDj\u0013=|f\u001a\u0003~Rc\u00035\u0006\u001fu\u001aԙqI\u0010\u0014D\u0005Q⊈\bȾCHrs\u0013\u0016\u0001\u0003\u0004H \u0004\u0002\u0010\u0010\u0012\b\u0000};\n\n\b#x\u000eZʴiZ\u0019ԱuZ>s\u0016x9||񐊵n.<o\u0000{\u001c`Z$\bkT\":-~\u0019*?\"Xu9\"Z{JSķ\u0005䱓\u000f3\u000e_:'/:._;}N<G0d6,\u0007I{0t'\u001eFY!\u0013\"\tG2v\u0014w\u000f\ro\u0012iv`w/FFJ\u000f?\tW<\f\u001c*^\u000bZ\u0002\u001dty\u001e2~z\u000b}zm\u001a1Bk(BQrbm\u0003\u0007c1I\u001eؿ]7<_ӗMNm\"s7bDG\u0016r~~.Bx+lXˍ.A!c!z]\u000bk<H;!g(\u0014\\\f-\u0007i8Hǚ3a\u001b֝;ڇSxK3\u0001a#^=.c\u001dvҁ9\u0016lnp\u001e]rj^:qjdhDaIK\u0006ß\u000f\u001bO\u0004+q0\u0006=V\u001c<m!ڍ{}\u0000Jfk(s^(\u0017BgV\u0003ӜTI8+q4^r9V~)B|T_\u001f}0~5MB\u0007\t3%\u000fBS\u0014$a`\nil8;2-\u0000̶Ľ8r՗roو\rQ\u0014?z<cs˷\u001fH\u0006y\t*\u001eλ+ί=5Ghb\\!cfH\r1\u000fHujc'BbU\u001c\f`9\u000eK\u0004\u001c|\u0006^\u0015\u0004\u0017=(5/XO9qˤ4t(zXh3KK\u0013Ns-lϹj\u00069B\u001dXͼDB\u0017\u0010\u001d\u0005eF.cA&\u0001\u0012+8z\u0011`\u0013x\u0005(\u0000Ֆ`AmcpSfr]I|U\u001el9$\u001f\u00103dg8$n<zʷ&<\u0010c4A4qJGѢwHQ\u0012$\u0017r YɁ`4v\u0007\u000eּ;rB3\b\u001e,m\u0011xB鲒ɀ<r_,h[\u0016D \u0010s*yڴ\u0000ujmJ.L\u0014$[Լg</\u000b\u0011\fy%5/\u0017kNz1o\u001dQ\u000e<ԙJsp ~JfT񂊲W\u0019=q\\N]]vcX\u0013J=5|_U:l\u00151ׄ{ќ\u00114m\u001dM{JxQ$<`K8lu\u0000JLO\u0005kC1Wa\u0002k6\u001akx!YC\u0015I\u0019}N:^⨕]J<|\u000bD\u0000(\u0013\u0011IF7*ʸL\u0013f|J\u0013d<e\n^S3\u0005R2\u0005\u0010Y\tdb\u001b`\u0004<)2\u0002kjcp~#߇\u001b7\u001a]N֢\t]_B?TU\u0014o-8(x.r\"''GZ\u0014-\u0011EY\r@܉C4h.\u001a35]\u0007.\u0014\u0018\"K\u0004l\f\u0013:\b|2\u0004\u000b\\\u001a07\u0003=F;:m\u0004\nڮȃZu\u0012\u0015(9O!͗d)\u00032eA:r\u001d.RS4>\u00155Y\u0011MAJ\u0014\"KA\t5\u0002\u000f\r*#p\bL6\u0007#-p\u0003Ͷz7Ӧ\u0000\u001aJW\u0015n]R\u001ec&S٥\u0019\";H+,%p\u000bjHVJb\u0000e)Qa^b\u001f(,\u0005D\u0012 y)\u0006|Z\u0005\u001e)qn\u00153\u0004כ\fX)a\tzmVoRG,K)kȫvٕɎ|3LV\u0005&V\u0012%XU?@Uw\u0018(1ſ!1Ő(Z\u000e\u0019\u001fe\u0000W\u00010Wi\u0000\u001b\rx\u0001\u00186\u0006}=A{a.'\u000eM6\u000eeKȞ&!>6!$.ݙ[+tOfU\u0015U\u0007FW#ȑWy\u000f\b{R\u0016\"\u0014wy\u0000\u0000p\u0016\u000fь\u0007Ý\u0000\u001b\u0001s\u001f8>Zﵡ7\"f\u0019i-hg\u001cMoKKiIuHl\u00167I\u0019z7Q\u0017\u0018\u0010C\bi\u0018\r\nn\u000b\n\u001e\u0014\\+\u0006\u0012k{'\u0006B\u0000>\u0000\u001e\u0007\u0003p\u00176?\u001b7{qevC\u0017\u0003d]@?\u0018\bߓv> eЛb\u0017w8Gv廝x\u0006w{S;|)\u001dW[E?r/~V迒g9\u0006j\u0000fj\u0001\u0018k\u0001`\u001bs\u0004@=aSN\u001c3\u0019w1\u0016_3\"\u0016ܑН]QM^i\u001c\u0010@A\u0004H ,!!\t\t\u0004\u0012\t\u0010 aȢ\u0014\u000bѶNjkkGfܵ\"hE\r.\bq\u0012j3/s\u000f{{\u0013s\u0003fW/\b=4rl4:&e\u001fUԉU'b\u0012\u001a\u000er(PV\u0013_\u0001}P#>\u0003N\u000eW8,9u\f>K~i]ԅ\u0017܋/a坟ÝyDUD^Rj<h\u0018h.2A>\fNOD{Z\u0019\\\u0011\b\u001d\u0019oO#\"V7Њ\u0016w\u001aX\u0012N)iQOͿjr˹jʺZ\\25/$7'6}&o 7}\u001f\u0018״Gm:\u001ei=\u0016i\u001a\u0007c\u001b l\u0010:;\u0019wP^\u001a\u0001Ս\u0014\u0006\rͿ㌊|QMD\u0014\u001c[}fpN\u001aۊ<\u0012\u0016zǷ1tmk|cm_blԶݜǸv\r?6Ov\u0006wP;\u0011;y\u0005e\u0014\u001d\u001a*pA\u001dLd\u0010\u0012\u0019Rԩ3vΰOJuvuO*vt/v^^\u0019ٳK޳[s.=͐^cHz\u0018ak=U\u001d>GhùwK[\u0011w@9\u000f(+JcԾ\u0000\"_L+)q\u0003Z;@\u0002U=h\u001a̦E\u000e;ȇ\u001d#J$ëp\u000e\u001dKi\nנZV7n7ˁp;\u001b8]~Q\u001bB\bi8\fc>H7'\"\"zBJ*'T\"}kC]\u0018dR!\u001a\u0004EBXd/4\u00078pܑ\u0003\u0015~p֑\r͎,x\u001f\u001dx\u00165quoC(\u001b'u\"4c\u000b)d  $\u0010L\u0010.9\u001dt?$\\0Q \u0002\u000f̷C\u0017|n\t\u001e\u0013\u001d\u000ePݠ\u001a}f\u0006>g#Ѕf\u0000!\u0015\u00108w\n\n\u0007W\u0014\u0002(\b\u0011\u0000|\u0007!\u0010g\u0005\u0005\u00005\u0005q\u0007\r̤+$a.9\u0015\u0016N\t\b)\u000eBr=\u000fH$$(H\u0012\u0010-@\u000eTPiw\u0002\u0002gp\u0005Zwl!_t\u0010\u000e1 \u000fb\r\u0010v\u0003{\rcb\u0019\u0013h\u001801d\u0010U!$Ą\tVa\u00078*Ĥ@=\t>r\u0001e\u001b(>\u0000\u0006/}K\u001d\f\u0003\u0003\u0011_2AR]\u001e`O\u0013!tZ\nWR`HR\u0002~\u001cE$bP\nev0CK\u0005\u0006q\u0016'\u0016@\u00127'\r-\f\u0003r\\>&\u000f@~\fa\u0002\u001eأ\u001e+\u0000{X>\u001e߀\u001c8rɀ7\u0019(qVH\u001e \u0012p\u001fIj*$&9\u0005f̙\u0006!v\u0017h7z+\u0013bMDbG\u001dd*FU'9oTת+\u0011-Πӧ<\u001a\u0002S\u0015@\u0007?IH䓐0)IO\u0014\u00140M\u0012\u000f_=_3[|\u001d5\u0012略3\u001d\u001c\u000eh5gx/4x57xk}\u000e\u001b10=\u0006\u000fc \u0007֟\u0004.\u0001)~\u0004\u000bH\u000eEn\u0007Z{4:ML\u001b5\u0015y$҇V'c0l{\u0016ǌ\u001d]^An}SwQDMЮ$M|\u001d[:\u0010A8\bn@,\u0002Ҙ\u0004\u0011\u0017HB>#/~|qĒ2U<}\u0001̷;u\r3+\u0013\u0016ޣ\u001f&\u0014O\u001bp/Bh3\bP\u001bx\u0014tp_t=ᙨ*рK\u0006\u0010_걺I& (NBQ(e(:\\\u0018 Ź77ǽ#g\u001e={\tU\u001c[Zm\u00057S\u0011H!zʿE-\u0007!ƚ+ƛ\u001e9j\u0004i&\u0019\"N}\u0000\u0018}\t{o7\u0001sY\u000b\u0005Rʳj)s\\ΞMoBVkN\u0019ŲZД!cR֐\u001da\u0017̻̇$Vq\u0019SmD\u0017cYi@~<4\bV\u0001J' \u001bs<\u00110\u0010,b\u0013K\u0005%!dW\"fŹbR~]ʀs>\u000b*\u001fSINf패';Q̨<Ѡ<qOy0jjo&`@9\u0019=\ty\b>s,Ae\u001cԽ\"xBBZuh)MְBXRȶ[ȯ)\\.<9q]QMi\u0018$\u0006((H*\"@V,f\u00025@\u0002\t!\u0010L\bK\u0002@\u0002(h5x92\u001c\u001dNGǶs\u000fȇ߹~z}<gS*}.1UGf5\u0005L%w\u0006]H҇%M\u0010F\u0012Æ\u0012o\u0013\u0010\u0013_\u0010{\u0010{\u0010bw2\u0012Nf\u0019t\u0006)hcQh\u0007o;;\u0013<57h~8fq|^BÓ\u0019Rq$M\u001d4\u001a2Kcw3.Gt2\";\u0018\u000fImoI-\u001f#uL$9\u0005@\u0011@\u0012\u0000a}/\u001f}\u000e\r(\u0000r\u000e9#'v<lY\u001ces$aL\tNXk];]\u0019ЛY\u0017ܕ\u0014ڑ\u0015\u001aХM\u0016ɍi)\rJ\u0003\u0007r=\u000b!է#w\"6Cl\u0001\u0003R7%xxQ\n<<rU\u001e`E)zLi\u000b,a>c)̓\u0006*u9\u001a6\u001aϜ e^*3WuZM?YP\u00112\u0015r\u000e}mob\u000bZf\u0001kVPa\u000f\u0006~RM|%\u0019Qz|Ǹ$~(ŵO%\u001en\u0017\n%\u0001ZnUSOP\u0010j8=G`ߡ_ҥhܟ)<\u001bf\b\u0013A%\u0016z)U#%ܫe\u001bfeE䶉ò3\u0019.\fҼMBZ \u000eP+ڰ¦\b9$P%+2-\u0016%&D\u0015q\u0011\u0000lZ`\u000eߗ+\t\u0018ks9\u0018\u001al\u00053k2\"Z*?﯊\"you@+a{6\u000b}jKKKb\u0005A*h\u0014uE!j\t\u0012iT\u0011o5\u001d&#\u0014\u0014YP>e~\u0013L`C\u0004&ZSXQr5\\k\u0003޸qM>ʮSkM\u001emeCJ)׻_V&\t*\u0017W\u0013\"5QXN\u0012<\f@\u0014\u0015>Bsoh\\!B-\u0010\"\u0014\u0014y3$\u00140T\u0002`½z\u00135\u001b:<̶ɖøPFm[ÉZUGJ>EMʪ|oHY8T*\u000f\u0015W\u0011y-$W6Ec-s\u001eF\u0015F\u0011*\"od\u0000R\u0007J,\u001848X`\u0012f:` -ؼbt̡Bpק{\u0012+y~@~,6<_\u001cɮdUL2d\u000btt[Z?t\u0019Bɐ!䭐\\oJ\u0000ީr\u0013\u0016\u00161p\f{\u001c@\u000e0u\u001dָ]r]Ky\u0013뀨1ǳX]k\u0010sTu\nBV&*)LU*CqP|Ce¬Aȿ!mp\u0000\u0000\u0001L\u0003p\u0003~Wy\u001f\u000bz{ô\u000e\u001c1\u0013){˻O9w&)HWԖu㕧\u00134K\u00023!i03\"Y3JJTϑ+\rr|\u000f\u0012ȭ^\u0001:Ou\u0000W)\r{\u0003h\u001dshF}p\u0011|f+\u0019<X?pe\u001c`\u001d{~䎆v+\u0011m\u00063bl뿈-\u0010b}Fqջ\u0019,v\u0000\\DG\u0000<e\rݠVL\u0005MR\u00131\u0017N;';g\\G\u0007R\u000b\u000f\u001b*J\u001c=;շ\u0006\u000f\u001c\u001f\u001czlNhИ\u001c\u001aӋ\u0010\f>i\u0001\u0001\u0018\u001f\u0004\u001b\u0007\u0000Z@՜#H1\u0000\u0013\\%wc\u001b홗\u0013.:3.f$p\b㦥NNz\u001dj\u001d\u001f5y˟>?}?O\u0001q$6\u0004nfDgpG\u000bp\r=I=\u0018@+B;\u0006\u0016D7x\u0015xK>ؼ04+\u00136\u001bg\u0016\u0019\u0019\u001f|`r\u0005Łf\u000fڵCk3eO\u001f=IW_zFοC#fw\u001ev~Qir\u0003\nos\u0017\u000f+ k \u0012cLV-&۞˲?f`;D\u001bx;\fejgA'зhv\t7|\u001afkg/]\t\u0016z\u000bٿկ{x\u0017`\u0014)\u0000,@\r[\u0000ߙ@C\u000b8\u001e`6\u00124\u0013f1Ƴ\u0016Gm4c5ȵ4\u0011W+jv8\u0006N\fZ]\u0019 _;\u0005<Bvm5ߍ\u0000=\u0000Z4h=/p\u0010f\u0001'ZñN\u0010\u000eG1gD,Y\u0014I\u0004fl|ˠrZ6k?:jJ\u00038I%@Xe\u000b\t\t\u0010\bA\u0018\nAvd\u0005qڣcRBQ,r \u0003V+]Zƥ֭\u000e+&g.gA8;~p+Y',YUGG\u0007;}-mhCc3X\r$\u0006r+ϓ~\u000b\u0000CA!\u0015\u001b^\t`Z\u000b;e0RuM]Z;.N{`x֓\u0013\u0017l1\u0010\u0018V3]ޞf:me:{tc:?p\u0002`#q\u0013`=\u0000m\u001b@`\u001e\u0004\f\u0012@1(\u0002\u0017ȆdXM?\u0004Sn\u001fi#q4Tڤ?̣~\\C\u0019\u0010~ǰC\fKld\u001ax:NqM\u0000\u0005\u0003}\u0000\u0010\u000e0) \u001d\u0004dh\u000e\u0012\u0006\u0011:\u0010\u0019=`\u0012*\u001e)[\f\u0004\u0018BYb\u0014e\u0014\u0017(\u000ḛBf\u0007i&xh\".S\u0000ߢM\u000f\u0001>{\fz\u0006\u000b\u000bLpA\u00168\"4\u0005```\"p\u001bP\u0005,\f\u0004\u0013RF\u0018C\u0019`\nl¥\u0014zb'&jA'^R\n4TxPQ\fHG<\u0003\u0014/ch\u0011m6F&Vjr\u0007\u0016\n\u0010l\u0014&\u0016\u001ee\n#n\u001e\u001e#D\ne\u0010SNC\u0007CC@:*\"\u0018=S\u001f\u001a,\u0010kP\u0004%;LQRBlt$j\u0019\u001bs\u001c\u0014_%nsF\u001d\u0011\u001eΐـ\u0004޻9sG^x<RH?1YL)ބ/A\u001f}u\u0006\u0010WW赍Elk\u0003\u001cU\u0011GɷԛΘ]2\u001f\u000ek/69h72!K\u0013XߙB51UHC'O\u0010\u0006cqJ:\u0013\u0017\u00182STeoG?}?(s\u0015!E\roPq7hW4\u0014^#^5π\u000b\u0005Z>WSo\u0014<Uux\u001aOP@a\bY\b%3H}$31pŬf\u0003S6pO//\u000eXQUU]SN9+U\u000b!ÿXoզB~h\u000f\u0011wS8eoK\u0014Fuhr\u001fQ\u0001\f\f\u000f0=92~\u0017\tZҬvN+\fa|j12\u000eu\u0013a:vYA]+vգ\u000e\u00018\u0000tl\u001b\u00188ַ$}\"֎x\u0017\n\u0013l\u0007g\u0004齍bvE\u001a\ff?$t5=+~[V?>-\u001fTj}'润\rMuyVMg\u000e\u001c/hF5DӠD\u0018dEa\u0018\u00170\u0007$\u0000L!g*\u0006Si=j0DG3t\u00079G.ߌzF\u0012Zd-t\u0015m%mӅZ!?9\u001crNGؠ\u001dq;EQ=QGNZ\u000b(M4\u0007L\u0003fΙIJz{zX[3ح\tټkqyVcW\\Yg\u001cCS\u000eǟ\"8(s9\u001d~P\u0010~Tx>좸6xx!IM8J\u000eEo`\u0018iǒ7g\u0019`\u0016Yûl;x\nʩg\u0007[\u0017at5#}!UgєPp6i\u000e\r6\u0012-\u0011\u001d)\u0017\u001f>$VG7yTE_UF?UcP=Lx\u0018I\t\u0019d\u001fs0<\u0003\u0017Z@{-ΑR.¸\u001dj8\u0019]ECF.-D\nǣ_:\u001fN N&!Ƚ2~\"RV\u001ews܏^ZqO%(ߓo\u0013k\"!dc@13E4\u0005wкXD]c[\u0014lظ ]lq|,úՙ\u00073\n\\+ֹ\u0016M.}7מEIRN+g^3?*I1ބS8Ä́!9\u0003&1<&_b\u00047r2Wi\u000f1_ì͍d\u001dIU\u0014Tfg\u001fT6k^\u001aQI\u0006ɷ\u0019<^3{{j϶:-畅w_u+7nJG騘\b=C<\u0006R}\u0010ZVry\u0013^).jpdI\u0018*/Wy`vs-q-[ 5gdBV.YMY\u001b2O(g6yK.om\u0007Z\u001d\u0012>\u0013a\"\u0003\u0003^.\u0004#NzK\u0001\\\rg8@\u0017\u0005\u0001\u0006U+\u0015beV%y:E\u001dwn_Bu.Ϩ<\u000ePD H\u0007)#\u0003L\u0001QA\u0005\u000e,\"tІ\u0001FpF  RD *1\u0016X\u0018Qp]f%'nf=G}\u0006s=WR*\u0012x-^nAIܐ84wQSQQ;aQ\u0002\u0011P_B61x\u000eCT\u0011\u0007T0^,p̕_-]Q\u0018ך\u0017nܔ\u001bm^`UfWH+v)OmR\u0004\u0005I\u0003ޒ)ܤ޹oEDB\u0004\u0014LH$\u000bo\u0012A\u0002\u0006\u001326.98]\u0013\u0015\u0018pfn\u0017t.*[;hQ]&8+e6lǲB\u0017Y[Q+Hou\bSEg|2R>H{-H#BK&E20\u0003\\\u0002ߖpQ\u001c\f)qXt)*+4W֕\u0019V\"\u0014ҭ\u000b\u0017&ۖg:J\u000b$\\IN^vNWFv -h[i\tQ^R\"\u0012\u0012\u0003<L\u0005ny\u00043:dpR\r\u0006讶gګ<9;ΩWҩ.\u000f1P7b,e%6E\u000eyRsN-PVP_wH \u0019\\DM\u0014/!BKH,S\u0006C!pY\u000eW\u0002#4{\rԲѻK\u001f\u001duL.wvCzMu2X_`,۱٢\"Z=>K0T꺭bQ#U+\u000e,\u001d-}).$)\"\u0002\n&\u0013{d1pq\u00075\u001fk7٨&+46r5\rj\u0015:^q:(X̝),dEK\u000e9wkE5/snAph\u000e}O\u0018QQ\u0010QF_,\u0003Õ2ڃJ\u0014wf\u0016m4Յl\u0011ț5{V5\u001ad7DbRd+>6)uSu墈&ކ.uCq~hН)\nSxgz7.^܃Z\u0018\u0005Zi\u0006>\u00175Pt:2e\u001d^\u001ciRuI*K\u0017n\u001am\u00167rKs=M2\rJ\u0006nHC{p OpCpC\u001e\u000f\u001e:\u0013=z\u000fW?\n\u0018-4\u0001\r]@e*{磤ϖ)sg.VY97[pp֮(\u0003f):v!;\u001c\u0017ikw۪\u0002n\u0005{\u0016\u001bB.^R\u001e=\u001fl\u0007RM\u001fPzA]H\u0006-u̕I\u001d\u0014r\u0012\u0007b\u0007Vύ>\u001a\u0013u4Bc\u0016uGLBd\u0007\u001d.XPWv\u0005\u001cﰢqy7N}7\u001c{;s&\u000b\u000e\u001a9:\u0013t}\u0007C@\u0000\u0012H\u001fĶQc$:2%@`u#\u001bBF6\u0006_s*ppqp5\u0016~'[-<l{\f底V\u0019\"6>ǈL.\u0004\u001c7\u001c\u0006\u0014h\u001b\u00062h\u000e1=D[!b܍Y?.b/\u0004Q\u0015\u001e\b\u001cߪr<E,g޲\u0012}߱*\u0003>#icؤ\u0013#7&s,17\u0006\u0007\u0001]Կ+_6\u0002d\u0005ǁ\u001c\\DU#c$\u000f&\u00173\u0001+Y+&lU}'\u0013|2爦4\u0004SJM&-\u001em)\u001d\u0013:S\u0017]{ýq\u001ewx+}\u0000\u0010P2\nd\u0007\u0012.\u0001W)6\u0002ncmm,m\n\u001d<x\u0018\u0000F0\u001dYwbX;)l\u0012\u000e\\nNՅT_xj\u000e\u001d~4g&}t\u0007˨?\u0002-_\u0003\ngZ\u0015Z|h\bC+?r\u0006'\u001eJ8?\u00113NO3O\u0019g,g\u0012rF\u0017l\u0017LP\u001e͞d={?6u@\u0018GS&\u001b\u0010\u0003\u0016=`\u0016\\^Ws8j\u0007\\`\u0003֯?,^ٛPb&2\u0006r\u0019Mއ\u001eּ\u000f#,߯PSb PNP\u0012}$}-o\u001a\b\f8\u0004>ib\u0001191\t\u0011q\u0001BG|KV@E1a\u000eɂ:3jQ!\u0007\u0019\u000e9N,vP>'Sߨ־\u0000X\b\u0005\b\u0012\u0015ԤN]O}&gI}D]\\wa%\u0000\tR)i\u0014\u0019~\u0000\b=>B\u0007O͂82ٙ!.\u0014g.C\u001cX~\u0019خe\u0013\b6J\u0010l\u000eQ*\\iTS\u0016\u0007@H.!\u0018y\u000e`b\r\u0011F\u0005dA@A\r4\faJ\"c\u001aD\u0010'(\n( P\u0013ϱ+\u0015\u0003\u0000߱}`:{u\u0012I\u000b,\u000ec`#ց]\u000f{I\u001f|OdE\u0015?X\u0002c\u0012{<\n8b¯3\u001e7*5\u0017\u000135.C\u0013lU4-\u0001B\u000b8۰::paQ\u0006pڱX'v1e|\f2F9\u0018#\u0013a[ lA{\u0003̷S\u0000ɥ,s0\\;\n\"_\r\u0010h@\t|9\rfрW\u00052:pb5\fa|'&Gq\tb{̽D|^'F\u000fa\u00007BMh\u0002\u0005\u0017X\u0000\u0017t'\u0003\u0011=\u001bo) <<yb* \rph¬$\u001a8*\b\u000bu&#@\u001e\u0015~'8=\"he\u000e\u000bN2\u0004\u001d7n{\u0017ssr79zJ´'$\u001fc}$M\u00066\u00023\noqy-\u000bp1qևo3g\u0017\u0013o7jq|\\|T©Ig΀S\u001b93~\u001eV3^i\u000f;N0\t\f~.\b܍\u0010,+w{>u[c}[k\u0014\u000b\u0002k*tΫf=\u0016b\u001bt\u0012\u001fS|lùdߟ{#׻-\u001e~C<fx]\fFb0Y\f&]Sc:\u0002\u001f\u0004\u0012\u001bO\u001c82x!o#\u0017%0<ӵ{=t\u001ef_aon=nֿ4\u0011\u001b.\u0006]:\f\\7ٵר%O\u001d`v\u0015ag\u0006\b\b\u0002\u0010\u0004z9\u001a\u000bCC˅yK}4z\u0003~a%3*uo׽K\u0017m44èӳ\u0001\u001e\u0017<Nǯ<\u0007\u001cl\u00041u\n½X.P\\G\u0018H\u000b4\u00101\u0003=\u000ew\u0011N\u001bvcY$\u001d\u0014ϺD\u0012_mر_\u0019|kO6X\u001cli:suO!\u0011N/pm\u0013>\u0002\u001f;\u0010P\u001d\u0004,IF/\rP\u0002ݓ\b-\u000b;j13\"\u0010\u0016:\u0017wjY<㶠UǗ3k]Ra\u0012Xmu8`~\u0001Vg\u001a\u001b\u0002\u001e\txk;`bƮ@j\u0014\u0018\u000eƹ7G\u0013hPXCt3bR/I\u0017F\u0007\u0011?mo\r\u001b)M\u000e̚C-oڷfopm}P]]\u0019;Nrk~\b-\u0015*x5\u0018x[\u0001w\u0014\u0010@;\u0012M4V\u0003;A\u000bݓ\u0011L\u001fu%١\u000bI2\u000fZ{| *\r=\u001c~stQt\u001c\bU]xΰmwUo\u000bͭ\nim\tio\u000e)\u0017C\u0007\u001dC?1\ffN\u0005Kh\u000e(h\u0010?/2*I[tԝF\u0017\u00156\\DiKulI#eY\u0012=FuRimbGtUd5g\rv*gTD#\u001b\u001b\"\tG'F\"K#k\"?\bJA0\u0015M@i\u001cBSpUht\u001adXLҒ>_Yؗ\u001aڝ\u001cW(5ܞdZ\u0015nQ\u0019cU!-[j!.z5{\u001d%-dp_jI:P\u001d\u0003w1 d_h\u001ewWеL*D:臕fJ>Y)hץ\u0007(Sc\f+e&\u0015Ir2j}S\u001a_l_\u0012W-\u0017\u000bTC|)<i(WD\u001b;\u001b\u000bdn\u001c\bP\u0006\b=wp3\u0003+)#N\u0010X1:ǣ4؝NߡgVe70(WęfZ\u0015'qՉ\u0005[y:AvBPpR%Lx$ʔ\r;fʾ\b3e@b \u001cgx\u000eqR\"t\u0019g3\u0005\u0014V@GU;{TriU17e\u0007O+SFN_%5.H4+JOT\u0014(vZ2#ecZrH9K,y[<eB(O\u0001R\u0002ɾD!DsgW\u000e|*7\b\u001dUk\u0003h*[sZvmRho,X6/\\8'ƨ0;L[e)m3UvY\u0019k\u0019\u0015|Ez 519(Qqy,\u0001F6.LL\u0003aR\u001aûW2C\u0016BW\u001d߮\u00138{\u001d\\MA\rl\u001am+\u0011R7\u0017ϧ\u0015-\"\u0016\u0006VC*Q~AiN^27:#'V]M]Y>3I]':&ͺ(f^zL\u0018\u0005d\u0014/.<s?=\u001e|\u0003\fƸĽ3bf0F\u0015QPI.\u001c]))B[(%]ەnvDmv\u001dT[UJ:꼴5|{y\u0000L\u000e2,9l#(J@r=,u!\u0006\u0019SMӣW\u0011/I[`\u001fI\u000bR\u001dbW8[]9'yjsɭIO\\g&\rD'\u0011g\u001a|\u001dI\u000e\u0003PQ\u0001\u0014\r<'*;o$.gn A҆0efYsDYg.en\r7'];<zm\"*L5=9\"Kx55[TL%ʡ:\u00173a9E<\u0003'q9&5x\u0016>\u0014XBVJ/)\u0005y+\u0004nd)˼h\u0017Yh=w2٬\r)vQ,yvi%)YaYYWCoadbτd\u0007`\u0001Π\u00006Af\u0010Ҋ`u\u000b؋M,\u001ah\u0004SbE\tnU\u0018/*H,X%%.ls>\u0017abAǐSN7=p\fw\n%!9kųx\u0001)-vb\u0007E8{\u001c\u0004`u\u0011,=\n*̃/Ŗ\u0006Ŕ\tfL7=[\u0018+\"|WhW+BwK'\u0014\u0004\u0015\u0017\u000b,:\u0005\u0014}mD\u001ess\u0003\u0012^R\u001d(shR\u0005\u0003\u0002X\\)\u000e\u0010wPCTffU\u0006*'E\u001e\b\u0017L;\u0010m\u0018V1$bل-\u0003m\u001aWC_^!\u001dS~\\[~\tuI}\u0011\u001bq-v\u000bP߻\u0013`G)@N9@\u001aΡK\u0000հ\u0010Sk\nkm N\u00053<:fjm0orm\u0019ڹ55K֤Uk|YxW\u001bWENѨQ?\u000e<D:{P__a~~C8\u001c8,\u0018~\u0000֋ ^\u000e\rn0\nn\b7Ld\u0002\u001bc\u001bu\u001abu}\u001b\u0012\r\u0002\u0006\u0005F#\u00185v`o7֜~av\t\"Df\u001c/\u00008`~\u0001vkO\u0005Xt\u0002`n=\u0003\b:σF\u0013\u0018h\r\u0017\u001d;i\u0001@ʻ)j=0\u001eMeyyKs;tGOLOt#'G0\u000fo|m\u0015@\n=\u0014@\ffG|\u000f\u0010r\u0011G\u0016<a5Spo\u0011ܮk@}\u001b\\[\u0003u\u0012\"A\u0016C9XD9XE9EC/gP\u001bm{1mi%P_9z\f \u0001`w!?\u0000\u0019:\u0005.]\u0001ۅK_\u000e`\n\u001d\u001fd\u0013@pt\u0005`u/\u0005r)Qw\tey2;e2\u001aN4_r\u0006`y̿\u0004\u0010|\u0019\u0005`\r\u0000\u00004\u001e\tX`X\rzE\u000b?\u0000g`l<<\u0002Bbb\u0011\u0018L\u0001W@W\u0006}u݈~\u0005c~q\u0007\u00026\u0002D\r`t\u001b6\u0004\u0018\u0010\u000e\u000f\u0018\u0010Lދ\u0014\f?p`A\u0001\u001f@x\u000e\u0019\u000b\f\u0004@\u000f!Y\u0010\u0016N\u0013d\u0001209aӱV\u0000[\u0000jvlI7\u001f\u0000\u0000Ƅ\u0002C\u0007\u00011<\u00133<1\fqHܑ\u000f\nB\u0011\b_\f\b\u0014\r\b\u001f|\u0004ozr3^A\u0011\u0011kDC\u0011+_C(b9&41[B\u0013a\nBh;ڍJTFѷ\u0007t \u0007~\u0000gFWf\u001c4^M\u0011xpXD&drQ!ډ~t\u0018բ\u0013G9惨\u0019\u00102{+Sx~*&LzĄ7\u0014q(9w\u0013.\u0014q\u001cE\u0011\u0000&&vhb\u0013O\u0013r\u0010\u0016mf>Jw0%wrf@Rɼ\u001ce%ǘג3Ly)<v2O\u001fC\u0019ݗ\u0011?\u000eET6@\\$\u001a+^ZFRُ\"ʉ4qA\u0007Df@ye2\\+d^r\u000b}grG^NG\u0015\u0001v{\u000e[v9MN\t_\u0010Wֈ(Y\u0002kt@\u001f#q?4wit\u001cBj\u0005ӫLc(#e>P@w_wOqץu*N:ڕyw[\u001e6\u001b~_U\u0012\u0015%1/;{\bxb ؅\u0012>\u0018K=\f\u001fc\u0013.Ul&׮VsǭX[-uMu^uY~%U4u\u0007yq\u0000x\"\u0017*ʡvlC\u000e5ިx\u0000\u001e\b\u0007x\u0012Ń\u0018J\u0012s`Vm\\\u001dclTf3iwNl׶ݴMnc3w<>\u001b]لmq\u0002\u0001\u0007N\n`TRiyFxs\u0007\u0004.q|\u0001\u001dr۵yyo띭}w8>9|nr\u0010olʖ\u0005ҵ-ˤe=UΧ䋜o)\u001c\u0005`\u0004\"&#3<#\u0002QZ2\\b$D+\tmk\tݾKvx\u0007r~Kq\u0013f(\u0017/]\u000e\u0015p6Q\u00184\u001b\u0005\u00173`\t(;\u000be\u0000\u000b/r\u001c*<Eyûq[Ljf\u0001a9\nW})j&-Z)=gG\u0002N%\u001d\f<4IK:\u001e4t!x&i5XÐ䧡G\bH\\ȑ5)XKX7`\\wr\u0019\u0013>\u0015x\u0013>\t\u0007]\u0006.\u0004K<\u000b^9e>gx:,fٌ\f\u001bM`\u0014\u0019tWDL+\u001cp\u0012`\u0003_+ǐ5\u0019|\u001e\u000e\u0016U\"wxP\rw\u0002`EĄ+͸EQ\"\\!dAל8#P\f܆V\u001ck=!㼽ay4gTh֩ȑtG]\u0010\u0013 ;z6&\n,\u001d}sQD%I\u0003V%~pYJ\u0005Fii\u001c~Nu?V,\u0014\u0010'\u0005ZBsS`\t\u0019\u00159}\u0011\u0003y\u0013t{\\T_b޼1zDw5Q]_Z|#\u0004x~sK\u0001n)$U9\t\u001648U\u001a*婄\\C\"⁒RX?\"\u0007\u000e\u0007ZB\u000b=\u0011\u0011zOᨮ\u0019FgyfG*˒\u0017V{3f{OBlMz\u0018\u000f\u000b4\u000feεFO\u000b>pZ\u001d\u0002\u0015\u001b`J\u0006UD\u0018/y:\u0015Ľr\ty̿_\r#\rC{-4k-C<LƣD\u0016YV\u001a,m\u0012\u0003e*Ƙ\bcA\f@\u0001p\u0013/Uޫ\u00058[\tZ*LnƍW&\u0010*2<\u001djπJL+Sz\u0015\u0015rCpgiC&l\u000eD\u0019IV4N\u0014c\u001fS+}U+Ř`\u0004\u0003\u0015*ʿG\u0000p\u0000\u0000p\u0019\u00180n\u001dnLmXaz4E\n\u0019S\ntA*chsY3ͤlPأ1F( ?\u0019_ߏɿRR`,?\u0001>F\u000e(\u0006^Խfjpp\u0002\u0007Q0f|\u001d7\\^a3d{wUҕi\u0001M\u001a\rդ\t0ь]}Q\u0011NbWT.ŪUV^+1\u0016\\\"\u000fh\u001d:еg\u0012=\u000fՓ\u0010\u0001p\u0006\u000e>j\n-b oЫ*CH׵Gh(M<Rifc\n;JͿJ\rZS/}\u0003tZE3rϠ7.g&)\f7x9nz67\u0011ME:\nԅijZ#ʫe!BU\u0017c%g{\ncɪ0zO\u00002F\u000fZ\u0000\u0000\u000e\b`mg}\u0013-ԚВcl. \u0019$\u0014,Ҥ\rV7ֆ54뭑hI\u0001f\u0018[d\\)2D>Acj1\u0016\u0014\b:\u000e\u0000Q\u0000Lt\u0000\u0002wxBOg tZ\u0019f݈kVߙ^\u0012\u0012b]jP\u0015!\u0016SXIsGN/l7O3y|-0?a\tLYB\u0013\u00146b>@p\u001a-3(.\u0001\u0006\u001e7RF\u0007vsնD7ó\u0016\u00142?YWyĪ\u000f\u0012w6\u0016vXh\b]ٖ\feɳ<fdnâ_'t\u001e\fΣϡ6\u0000g\u001f]H\u001d<@A\u001a\fm8`[`r K_#闐2J\u001em.\u001aƳDdڎFrmo#=_ӻwar\u001b\u0012ZV4h\u0006\u0000Ã\u0000!ƽ{n,\b4N&;7mx3P2!\u001a\u0013x\u0015}r߼\u0011_Hf*\u001dp\fO\u0012hh\u0003?'c6:\u000bhP\u0000\u000eQ\u0000qC\u0004P\u001e@H~\u0003Ů7pEr]AQg\u001cw/v]]@VPX\u0010Y\u0010a\u00019\u0017[\u0014\u001111dZjh5DQ\u001bpX\u0010a=c\u0004*\u0016Q^[Q1z\u0000ib|fvyz\u0016M\u0014MΖ̓'|LY^i\u0017~b6]TVCdaǈZr1\")b\u000b|DxƯ\u001cP\u000b3i(,`e.(\u000fGmo\nm1h\u0004fZ<f\t4K8jeɖ)Be82W\u0012kIN*Zd\u0013]\\\u0011YN\u0019^E\u0015ZzBAjr.x\u0003}5A~J\u0003\u0007(?w\u0017\u0005j6\u0000󁥅\u0007ԋ)\u0006RJ%\\Ab+\u0012ʽ\u0011W\u001eX\u0019,ښYBu(̺@\u001cb]&\t\u0006Z7\u0002w[l[~s6~eqCq%\\{WGh(?#\u0013ƾ\u0003#@j%\u0010W\u0005+\u0010^CXh`Bm\u0010k\bM@`4\u0004au_\"[\u0007S~hl>јJg\u0019g]ȳfPQ%L^`\u0003}a`a\u0019Q \u0018P\u0003D\u001d0\u0010÷Q\t)\u001dFal7L\u0018s:\u0002q&\u00053sޜ\u000e0e\r\\[%\u0007%I8ù\ts>p\u0017ٴ\u001bi\u0011\u0001\u001a\n]ʞQK\r@\t?\u0005\u0018\u0019IoU\u0006Wp\u0001㠻6DC{=\u00197ff:47BsP\tu~ڪ`v\u0001? lo>m\u0017n\u0001V\u0000GA\t'&\u0005:\u000fn\u00051ߒBӡC\u000bU\u001e\u0006(|\u000e\fYO\"$=3!\u000fQ2\r@ׄBz=\u0017H\u0017f\u0014X\u001d0\u000eI\u001dF)_u@w\u001bP\u0003l\u001f\bP\f( \u001bPC2h\u0019\u001fM?\t\u0003\u0006tB\u001f\u0005\u0003\"\u001a\u0000\u001dA\n\u001bk\u001fSRsӚEs@a=2`\u00018\u0001\u0001Ȩl3q\u0011}\b\u0010\u0015JC\u001cHb >$L$)^>8\u0007qZt^\u001aw\u001dK-u\u0006\u0007D'3Ÿ2q\u0012'vA\u0019BpaRNH\u0003^ɛB~\u000bC\u001e\u0007XHPCnn\u0006DOZu\tT\f52^HF\"$\u0014W\u0003셺=W\u001f3u\u001dЯGn<PWY\u001dgk\u0018\u0006JH܉\u000f\u0004\u0018g\u001as\u0019wq2m`/t_glHj؀6k\u0013m1{`\u000f5F\nu\u001fu݁\u000e\\?mp/\u0017#8{Q\u001dciMƘ&3Փ\f>j6{ΆF.f#W'~#{;\u0003\u001e֫e=\u0002֥?:CןdNvå_VW.D.ra\u000fh+i\t8\u001f\u0018Jc=a}\u001e\u000bXa\u00192b\u001da\u0013k7lcwݿfwܳm<vn\u0018J5Cpj(\u0010Z<N{r)O.iQ\u001dICفм\u0004yɄGQ\u000e9o:kYn,g׌keBKqp޸[Oc謱@l<,:m\u00105\u0019čfI\u0006߇:W\u001a_nsg|\u0017DAJP\u0015x8\u0011ሡ\u000b1#8\u0004mAq\u001ewع\u0005BipƴRdZ+j\fL|2`DN\u0001{$\r\u0001{\u0001EڀRiM1FYjz(3qeώ\fÃm)_\n\u001e%#m\u001aE9=\r#Bd\u0014Z\"S\u0011ىBCBQ}ĵaT\u001e\u000b(.tې]6!Y|yy!EiH$AY\u001crIy0۶(0NP\u0018W{\u0003\u000f\u0005\u0018\u0011\u001eI\u0015'Ij\\脳1h\r\t66M8\u0016I\u001f+'.G^V\u001a'MCmʃ\f[9WUh.R\u0015Dk-v{?j7$\r<Q>ЗH=_2p5YIr4'jqb\u0007j\u0003Q<UL*%\u0016\u0017''9@fȦ0n n2?\u0013ۼ/T{cvdjb3c{b\u00191t\u0019aG,wlx\u00140\u0000O~\u001eg\u00044JC\u001dSG(\u001e\u000e&\tii)sS߷;e<'y2kJUfZCu\u00075}qKo\u0002\\\u001eZ\u0016\u0010H\u0002!\u0010 @+\u0010\u00039T]\u0015īu{t\u000f\u001dm׵ٱ?>3o7>xDx\u000fG\u0006#G퍼\u0013y\u001d13K~{Է\u0004ofÆ_\u0017$T\u0001T.nTwR7\\v43\u0012g7p$I42w\u001b7y\fY<=\u001dAߎ~m1[b~(h-hHh\\\u0010`\u000f%l\u0004i<\u0011?\"ﻝAt\u0006Wΰ)8\u00163Aq^a\u0001QYpZӀ4ۥWsN)LjK$4%Y\u0013\u0013g\u0004u\t煵Dğ\u0013\t\u0017\b\b|\u0013\u00051\u0019S\u0005Pk_y\u0003d`Z\u001aT[0\u0019\u0019VFr\u00072\u0012\u001czeN\nK<׭EhJ3y5Yx\u0007S\u001b}k]|tDP%\u0012VHEfuIcQؘo1}\u0010\u0018\u0007c%殺9Us0c\u0015\u0018lƐf\u0007ӧ\u000eveٷ͙\u0019.J[}FG]z%WPt!A|BT*\u0015\u0017˗$\u0006\u0000S^X`Eаt\u000f\u0003\u001fP7)r>0O\u0003c\u0012\fm@o6S\u001bm9`ߨIvV8ת\\+U\u0006rg̬-l/V\u000e\bʣBYN\u0018xBKdń\u00103_\fܣگ逋\"`~Ǹ\u001dC\u0005B\u0016GGA\u0010ӢñG%8XrӜ+\u001cwcNg3d\u0016e7\u000b}|aQ$G}%@~HJQbB'R\u0007y\"es8Ba+z|t\u0018ٰ֠i\u0016EU\u00159\u0017H\u0005\u0019.%:!_YW˫mks{\u0004\u001aH=%Qi/\u0005dj\u0013 )Բb\u0015-i\u000en\u0015\u0000({HWFG\u0012'5ԗ\u000525e;8a\\sI}iqp)2t|b\n\u0006~VA `T;!V.J亻\u0001r'?$\n\u001dK߱!u=\"!<J\fйd&7\u000e|#*ʷ1Pn9^oJt,0ɜ*WmYGv+S\u001cK/i\u0017\u001f\u0012\u0015O\u000b\u0014ER=\u0002K>{KsH_[\u0005p\u001a\u0018\"$bP[*\u0018(\tb\fݜB~x\u0007muSv%2MYY^aS̃$0(8\u001bqKQ[Q\u0015&'\u001a]%3\u000e\u0018\u0005ZZ:W\u001ctCY?\u001b֠ȺYwrpnvC}V}^8v\u001dw֕z&V\u0012k}j15\u0013\u0007,(-aW¨/\u0004U\tV\u0010]\u0011uTz>+C4\u0010\u0005-(lA~*h7#};j\u000fdEq\u0015mim2Gi9%5\u001e\\y\u001d볿_x,?:_/aa\rճ\u000e`>GSʹ\u000b-]=m]]@^7\u0017^/dٿ\u001eA0\u0011Xnb>/!W\u0014[\u0012cv\u000b幷%ޮB:B:㦉fz~t.t\u0002V.\u0005\u0007=\u000f\u0001Q7!\u001d[@$oGx(\u00133\u001e͉\u001eOF\"Ʋ\u001d9\u001eu5ctmim#\u001e#?r\u000f>\u0017o<\u0007Y,\fQ}\u000fh\u001ePv\te\u0003c@¤\u0003b\u0010=%F:ފ]\b\tgBgb=3)\fΙ\u001c\u0006mU?nqxkzq\t7/\u0013ޜS\u0003'Xc@\nv\u001e>ʵ\u0016\u000f\u0003\t s\u001aH:\u0005D&u9_[s\u001bc>\boχ`|\u0004mq\b2oT\u0016\u0013h3q6٬܍~\u001bIvl?ᮝn9~Wc\u0003\b\u00112\t\u0018N\u0000g9\u0000ឋ@e.,x p\u000biq\u00036.\u0006a]xj\u0004_Ǻ%\u0019,e%\u0003V/YUKʥ#LyFr6#Y,\u0011/<爯1E#T{'trcIIC\u0017m׀759`\u001dw\u0004\nﮃ\u0016\b^\u0018ł_\u00069}P\u0006\u0007V\u001e\f)x=\u0006χ\u001f_u\u00191>FH}oM\u0007\u0017+@\u0012\u0006\u000blz\u001fx> \u001f\u0001\u0014չ\u0001\u0016l\u0001\u0017e\u0011\u000bD\u0001\u0002((`\u0016W%\t1`A,H@Dņ(<\tC-O1\u0016D!ODQDĂg\u001b0;=;{9F\f\u00059PY0s C \u001f\u000eY\u0011ҿ#DHNb:D\u0017 X\nAC\u0015Fr<(g3J,Z=X=OZ\u00158\u0017\f`]\u000bh\u0001%\u000e+\"\u001b\u0015\u00106!j\u0005\u001a&;@:5ͣ1\u0000n@hm\u0007\n}k7\u0005jGK(]48Zw }\u00040\u0014`W\u0003.\u0000\u0017\u0001e@~\u0015\u00105Gn+jM\u000b\t\u0005:\u0002k\u001fRs\u000eG?\u0002:=@ON}DoG\u0000=b{\u0000}\u001d\u0012`\b]\u0007$7\u0001b\u0007u\b)bѽ5t?+\u0019\u0003\u0000f\r5\u0007(\u000fF?\u0000C?b>`hU\u0013ŗ`RwŮ`\u0002\u001f0o4H\u0016%$\"H>)k\u0014\u000b\u0012\u0015xCxjt\u000eh\u0003(m0k\u001b0\u0007QLɼL\u0002DcOW\u0012I%KrW߀|\u0001ExN\u001cyn@\u001b߅BV\u0011\u0011\u0013\u001d5ջ<RM)\u001fOHDɿ#3Z>\u000b]x)[,<\u0013:t6ᑬ\u0010\u001dt7J+&B\u001cZ7pC\u0010]h2ehTsE\u000f\u00129塡|(T\u001b7\u0010Tj\n:U3P\u0007Ÿ@7QMVe\u0001n)wr\u0017{q]y\u0004M\u001aWՌ\u0006Ckp^øZsƝ{=fKm`\u0005\u0001f\u00079\b/\u000fc\u0000<Bw\u0016m\"nh6\rMehԮ\u0015Z\\n%6\\Ԗ^\u0007\u0017,\u000f4jp\u0001WE\u0017w\u000b\u001fϰ~f`}`v`*j\r|\u0015vC\u000fu!^+\u001e9[Z\u0012貸iz;U۔qmٜz_\u000e۶\u0007l_\b*m`_\u001f&ۇ\t+>)\bQ\u0002Dy\fP+Kz?'\\z?#qn\u0002U듸c\u0014>;\u000fsC\r\u0001V\u000f}ҮBܾUXfLXD%\u000eL3l\u0000w`\u001eφ1H6G\u0015\u001a[\u000eg\\q\u0007ǜqy,wy\"y\u0006_sW8-\u0016q\u0010;-\u0017v\\#,s\u0017:\u0016Jvv:\u001d\u0014\u0015;\u0011\u00179\u0010\u0017:wlqfLm|N:h{u\u0007\f\u0015A!8bn\u0003qm\u0004*\n\b[u\u0012_epKؐ**2,\u0015m7\u0010\u0017\u001a֛l1l5)0.7TJ6\u0019\u001b\fW\\:dk\\^V2Yg`(v\bF\u0002#9\u001e.\t\u000f%\u000e\r}#c\bwJF\u0004sc\u0013\u0004S[ŋ6\u000f-X f%YZ=_ڽX\u001eU9\u001e\r\r\u001a֥\u001ct'+m\u0014Z#PM88\u0014\u0015>(c\u0001EV\u0000~O8qT oDѺk6+Y\"ʐ-ʑg{fzmS,maeye\u001d//L:}\u0007\u001d?>4s\u0006Ь\u0013D}>͟Po\r;\u0002`k@\u0007xry`A1Zѓ٣L2\u0012e\u0019it,E\u001aT-\u0014RB\u0003\u0005g}[~=\u0007\u000f\u0006h(1:ӑ \u0011(\b\u0001X\u001b2\r\u001e\u0004\u0011d\u0007\u000b3\u0003ǉ2|/N\u000f&I\u000bI?Wbиlqr1_5׸S3Xe<e<&\u0013\u0002R}p˴S\u0014h`o\f[t\u0011ơ \\\u001eX\u001da\u0015\u0011\u0006d{q¿\r\u000b\u0011F\u0016\u0017/\n$Y\u0010\u001c'M\u000eN'\u0005-P\tJ7\u0015J\bܠ\u0019<>jf<.iSGC\bp\"\n80\u000e(ٯ[u^\u0002ȉ̘AȈҢ}Q\u0011XqR9Ӥ'S\fE\u0019\u001f\u000b]\u001e|j\u001e)ǻM\u000ek\"-&1sT?pjPEq\u001a췍\u001bҼ3NZ,\u000fҿqBj;(v\u0014<.@0wlpvL8!f)xy\\\u001c\u0014ԨLȵ\u001f\"\u000buyGEuqwg\u0006fd`\u0016.誈\u0005\u001b\u001a\u0005i*e60\fU\u0006\u0002RUZb\u00012XYK(nQ@M\\\u001b)GO-hknQ\u001c999s{}\u0018b<31=\u0013uO\\\u0012u]D1D[~\b\u0001:\u0018s[<ס='ˍy\u001ekP0\u0010e\tP0I(H\u0001Ҝy2s&3.N\u001e#56CiuX\u0014ShvNޠGG\u001fp>36o\u0011_kE\rQ\u001aY|7jdYc\u001d?4b\u0019IQ4\u0012I\u0013\\tl-4\r\u00116)1D\")!ΐc/T+b۵\u000b\\z/NFŋ\u001a~\u0015>\\\u00033T`'ٔ\u0002uy\u0004%&G,5E^\u001brR!+ea򗤚a6IѶE\t\n\u0014$}LR¤r'V\u001daܦ\t7w\t3\u001ewY`%R\u001bf\u00105\u0006Q|\u000e'\u0013&`_\u0006ԥ<JҀt\u0007f9c(23=9Y0eJ2J\r\u0019e(۸xyLZri\u000e+\u001c\u0017ubQӆ|\rNN\u001bl\r1ԄDuh;Zle\u0007鵚\u0017.fI?9YJ,6k=\bQX%\u0018rf\bْ\u0010itvMTvm٨\b7ʵ\u000f*U\u0005/^\u0014x=̣9ߐ{_\u0001\u0019: ]t~Y]\u001f%9@!yF\u001c%H\u0002w\u000b#v\u0010]/\u0015\u0004I#\nda6\u0013KR\u0015AKr\u0015P5+w/on\u0007w/~9;N1\u0007\u0019\\,k\u0000+x\\BҖ\u0002I\u0012U+ҡ*@dd!G_\u0016 \t-'\r.\u0002Km\u0002Jmgd)\u0016W)/0hʻ09.^\\Tfzor\r63eB\u0005RL/c߱\u0012P\"R\u0005U\u00031j$B' [\b)\u0004T\u0007IfWKfVH2L\u0019i)&WTzU\u001c\"g^?)VZ!{-\u0011w\u0007}u\u000b<\u0016,3[_\rD=\n]c\u001a'\u0004ŜaU灙uW\u00039uu:ɴ\u0004ɔT\\6kkl=k4=j\"\u001ek)<V\nUxAJ\nGRR\u001cНLwL\r{MV{ت\u0001V\u0016OLL$\u001f,h\t\u0013[b\u0004O\"b\u0014IFYVIGZ,\u0011&̭mS6nطӻmX\u0005k2\u0007\u001b-\\>;I\r2ۭ^\u00188\bc\u001aGbt8Nş\u0018i\r\bk\u0004ܭz\fa5_\u0018b\u0014\u0006[7\u000b\u0003W\u0018`=.Z\n\u0004׆\u0012]4T\u0001[]Mo:`+@.\nL\u000b\u0004p? f'\fiA̓0\b\f8\t׃S\u001f\u001d\n{t{Ȁ>-fn)Eϖ:4@r\u0004o9t\u001f\u0017\u001c\u0010Xr\u001d0\u0015y\tT\u001c\u001bO&`\u001aR\u00163`Q19*hZ]nusp2\u0006Nm\u000bU{0C{2OAy\nvP7A%PJ^uqW}@w&cN\u000f7\u0003s\u000e\u0003G80\u001du\np>-\u0002*ka{\u001fl\u000f(H/xAr\u001fA\u0016$\u001d\bupup}DwPA;6yDt\u00173=S\u0003-iw8O\u0003.ձ\u0003\u0016]#Zr_`H\u0016D\u0013)PY\u001c^K:_K\b\u001fF\u0006\u0003n )kp\u001f9}5O\u0002\u001e\u000e=\u000bG;\u0012 \u0002\u0016\u0014\u0007pKŦ@\r؋+p\rBy:xy<K\u001bId;B$gcM|\u000b\u0000W\r\"sO^\u001b-/r#mPAaN\u001ekɳ!1\u000b\u0016/Y$\u0005^b]LzWs7\u0000\u00100\u0010\"DKBI\fI&Y\u000bUx5xx-\u0005\u001c\r\u0019{?|3<E\u001b<\u001e\u001a:q\u001f\u000f\u0007>\u0007DM?} :\u0010[KWO2\u0004\u0012\u001d1\fF.~E\u0011G+#<C-]\u001bc젫Ojǘ370uw\u0013͑n\u0001ѥ7硅m\u001e\u0010\u0015!ʦ0/\u00053n\u00134YJdLZGf\u000evѵf}\u00147\u0015\"\u001dٹ(.KD|\u0006;\u001a\tLyTSg\u001aƟ{$$7n#V\u0011j\u0005FzXl$&\u0000\t@\u0012v(nR\u0005(.ԵxlqL;\u0019TtZy\u0013Ow{?=#\u0013\u0013\u0015r\nO4~%<JLRj|%cI=\u001er\r\u0017ׂ\u0007&|\u0017\\\u0007\u001d]8p%\u001b'.\u0001W\u0015\u0002.+\u0005\\E\u00180TI\u0000\bC\u0017Qm@0\u001f\u0017x|ͧ\tG|>ɗK\u0012\u000bq_po-~#n\u001dT]:˪^nb\u001d\u0012\u0006\n8K!N\u000f\u0014\b\u0001>\u0010\u0012C\b\u0011\u0018\u0019<\u0016O}'iǠd\u001d[\u001c[k;\u000f\u0016ϯ\u000eEf\\\u0018\twN\u001dr\u0018gũ!p/3\u001194L`\u001c\"\"}*/\u0018\u0016@%S\u001epk6\\KÍ8\u0011N\u001fQ\u0001p:\n\u0002jp2`9N\u0004ű\t\u001c\u0019\u001c\u001ey\u001ey9\u0010t\u0005>`:G}vm(/\bcH?5'\u0004Ip?P;2z4.c:\t'i8ڍ\u0019VW0\u0007.bfz\u0005Wt[\u000e\u000e=h/\u0016\n\fn{h˸_E\t\u000fzyɓTb5\fO7?O\u0018EOH\u0018\u000ehq`t\u000bDg\b)`Cʘ!]Zv{*vkphs\u0016Ѧ\u000fŭ!\u001bCΉׇ\u00147OZ4gI{Y\u0006\u0004*w}?\fA/zP\u0016g&2\u0014S\u0017:\u0005\u001dQh\u000bMP3}:5<@SnT6h\u0016Z4uu\u0006qUҠ%YVkNq+5WSHOQZ\u0017*HyYITꩤމ&8biޡ'H\u001c}\u00111\n\"'b{d86Gj\u001ai`6D3-\u0011vv]m\f/\u0011\r%^\u001d^%^\u0019DR\u001f[\u001e-\u000b&\r+[\u0012v\\^\u0013'_\u0014H {BWG\b7&3ҿ\u0016\u000f|\b )\u0017-F{\u0000l\u0019M16\u0014ͱhIbƤ2l}C<@,L\\\u001b5G$j\u0001W3NpZzfyմ\u000eyQG}*.*D=P̎NQ\u0011-x\u0019yO\u000b|JOi\u0003:D'mx\u0015Z\u0013ѬSQ7\u0019uOg\u0012\fx\u000b$>[Tu\u0017jZ*\u001bW+\u0013F^\u0011kS\u001dRΌUighUjP\u000by\u0013j9n/L\u0007\u0002]ns!I!X2\u001a)!K\tCmJ,S,HNe'e%9ĕ\u0005ىeܬJiybLR^[(T\u0016\u000eĻ\u0017|~$A&\u000f\f\\9 4{IF ǪXn\u001cZ㻨1b12\u0006h![\\npI%\\BZ_ +/7+)ەN}\u0017?&\u0013zAI(^s?\u0001d\u0004N~7_mS\u0004J<\u0000ñ \u001dTMAeZ$Sa2\u001es\n[jfKS\\q7K]*Ӵ'Ԥ1n},)F??2\tJ/W<hH]S۳5i禋P\u001f\u00191\u00163߃'#\fe\u00191LIF\"[nd\u000b3D\u001cӒ/ɵIs,sevKOAaMgu-\u001fK\\'Q\u000bn\u00114A۴\u000f\u001e\u0001؁&W\u001f)6\u001es`Vۘ\u0015ҬP\u0014eE1Y\tf`l\u0016Ö-\\l[)gΑeZ\u0017[(Ҭxs\u001eUddʔ3)Bu\u0001̙K\u001eP\\K|gv\u00129~(uDc<\nr5pF2y\u000e-pvY尉9ybΒS!3,\u0014F{`ۏR엉*'^-(_ar<?E>袙h!kS.s(N9]\u0003Q\u001a\u000e;\byIq#\u001dIlĦ3Ein8U(1<RZ\\ܠHt)uΣ|\u0012\u0015Q\u0013\\A\u00138/H4\u0010Kis>}\n$p\u0015Gn?cU\u0012\u0002k(b,%\tJ,v-I..\u0012\tEu\u0016݊#ʘOʘ\u0002A\u0011'\u001f\u0007GHo\u000f\u0001t\u0017E,9g0\u001c@X<ah`D2\u0006O\n1I\u001eHqK%q\\LRi.(+\u000eلaf\u0007\u0004\u0005\u0006\u0001aQA\u0010\u001e׺<T\u001b5ڨ\u0018\u0005\u0001E\u0001\u0002A\tEEqA\u0005&.TD0j]S4VmXZc4DM'>\u001f3}9ݓT84ɬOOZqIP/y_,*\u0017ʷ8\u001co{\u0012PzN\u0016\u000f-gߑ\u0015n\u0013\u00161\u0018>\u001cc\tӧ\b#\u0012%\tiJ-,KRĦwIp^4;D\u0010!:gk\u001a{Re܋$$ӻ0\u0019\nLg6)C8cl7Fg\u0005aTV?\u001ex\f\u001e\u0013B\\,Il|ଥҨղY\u001beY\u0011&rM\u0011\"<'\"*WB\u001d[+XI\u000eYIoR\u001a\u0007\u0013٢M^s=\\wD\\\u001eC5\u000e`0D\u001b\"8\u0019\u00033\u0001ƹBq\u0010fL7J\u0019HCvKCviH#iȆ\u001fe!Ԧ.e.\u0002I\n^\ț{\u0006~F`8[֘B9\u0006\u00159c@\u0017\"u(\u000eAxI$\f%_2\u001cJF_Tf!ش\u0000zS۴Ne*\u0011\u0002Kv\n\u0012\u0010PrQ\u0015?\u0014\u0002\n_H\u0002\n\\\rla\u000b\u0005d5i\u001d!݉tOR r+\u0010ZJWޕe\u000eE9\u0012X\t\b0e\u0006,sò\u0004b 3КB[\u0001m(xuQ!b\u000e#IY}X\u0000La[8\f\u0000\u0006l\u0007\u0000\u001e5N\r/\u000e\u0010xF6\u0006#n\b7LŖ\u0002-lڶ\u0007*\tjoAe}\u0002u͏Dt##s*g\b16\u0005\u0018Jҿ\u000f\u0003<\u000e\tpnPB\u0002U\u0016NP6\u0018\u0006\u0018t>\u00192 \u000fkgBCfQttR@Z\u0013|\u000b01O'06 z? \r'Q@\u000486!=Õx\u0001-~\u000f\t\u00030\u0006h兠\u000fV>xڸ\u0018\\[\r9/G0+\"<5`#\u000fHa 8\u0002\u0000iAu#y㼖\u0017➼\fŜ\u0006\u0003G;/\"WX_B_-'{9\u0017\u0017ȍN2I{\u000eF(;޾^S\u0019@y\u000e\\|N u'^5Mw6'݁t$jV; .\u000b=\u001e{\\\\\f\u0011r\u000fy\f=f\n\u00040^-\u001az~I8m|E&\u0010\u0013w\u0004͜<P\u0001\u000f]Gc;==\u000e\u0007>\u0018\u0018>ɤDtح;D\u0007M\"P2$yd\u0011IOK\u000b\u0007\u0003\u001eexJ<E\u0015\u0015ߢ\u000e'xxx7w3\u0011\u000fQ\rQ\tQ;@b C\u00182ӹtqL<z<\u0002LtmB.z8Sv'n79\u001cF\u0017Btqvp(\\GBH\u0014I{\u0012-cG\">Vғ;؀DW!-tUU񭸆\u00032Gq\u0005\u0019?\u0012\"G@ο\\!/\"o89iͦ=zГQ3p\u001dkMrp\u0015\u001fq\u0016UFjF\u000fg\u001eъSm\u001c$3O\b\"%Cpb.\u0014đh8\u001f\u000f\u0014!x \u0004ܒNuY\"o$[\u000bTY:Sf*/G|\u0007\u00156Eр&E\u000b:=؝~@JD\u0010d\u0007 j|<\\5x]\u000e7\u0006\\u\u001aK18\rΨ)<Gz\u0019i8^&͇8و#\"\u001cَ֔F\u00158|\u0002\u0007\\ڱ\u0001ln/`u\u0013Q.b\u001b>ؐ\u0007<޷=\u0014||E>86\u0010pc<yLaٰ{\u0011\rP\f\u0007=q@\rا\b{&ؼ*`n:T{7aET܁ŧ\u0003PEy\u0017\"r\u0007]\u001bYt\u0002.:ଗ+Z|\u0002pG{(M^Dޅ=/F2v\u000elTb{@\u0001,\u0001e\fBy\u001eaP;+\u0006~#\tAPD\n@\fd!\u001bXjY?e=)P \u001f\u000eƞ>\u0003Qg\u0018vǡJ?\u0015\n\u0002`>\u0005e\fTNXI(ћ`P\u0018l\u00156\u00077HCNI6ܒ\u0018CHrCEIίx\u001a̲\u0017\u0001\\fimc?p}\u001da2lEa$&4l\u0006LY(6COBao/\u001a\u0014}\\\u0012)A\u001a5\u00185J\u0014\u000b\u0002.{]8\u0001\u000e..]n\u000br[ۊ(\u001a%*XԱ\u0019mSӦi3δv!mӴt2M3Mil/2f9ߞ>f&mJ`OfO-'_Ʌɍˍ\r\"ܱj}6p/\u001f{V\u001ep\\qz܊\u00175)hF\u001a+\"\u001a\tӚjLjIM\u0003s\"\u0019fÙ!v43\u000egNsCܠ\"\u001f\\\u00074w\u0015YSe}~@DPC\u001c\u0000ܦ\u001a+;t\u0004/\u0005m\"h\u0011Uc*7\u0017'sM\u0018\u0015\u0011έdFNfXa젶\ri{~0ק=hgnK.UEg\u000f_\t\u001f\ty\u0015yB\u0019\u0016r\u0001p\u0005\u001deC\u0010mn\u0007NS\u0011gcDǐނA}\u0019\u0013ۘ~#\u0000ۥ悺\\noӝQ\t~+BY_٤+Ш>B\u001fIN1@QD,60aL@ش\ræ\u00184g\"dGٌ\u001et*t<lm5vr~c?l\u001cS4\u0019#BEk7~A|3GYg*=1a\u000fV4\u0007(Pg|(1Z\u0018c\u0018$ך#V-V\u0003:V\"1\u0001i&K\u0003hi|^pD)\u0012ܖ\u0005rYUcE\u001dE*ߘ7tY.\u001e\u0015,B~&\u001fE\f\u0016ǡO܄nq':Td! \"\u0016I,a\u001aJ+:z\u0013[kc\nxJpsjqYe\u0013oğT\u0013sTM\nܧ9:ި@WYL1Q[\u0016`\u0006K\u0011R,eQʃO2^*br%ZuJ͜C\nQE4!ҬB*\u0017#Io\u0011\"IQeyCUQj\u0004y9FzK\"\u0006\thQ~\u000e^Y\r|\u0010n0je\u000b\u0018lce\u0017k\u001b9Y+\u0001E<.g\u0005( ތ)\u0018#ʟʨrʨϨH\u0013Xt<S\u000fO?\bM@Su<՛˞\u001aG6\u001c\u000e\u001d\u001d\u00059J\u0018!3\u001acm\\\u0017aE`د\n?&#>U\u0015VG5U~B$Zʜ5!M^Z{&\u000eMpݵ\u000f6W&dw\u001e*&\u0019]\u001dg]\u0001\u000b]\n+\"\\F5uWep2CiJi\n\u0011zE{R\u001dpqbS#uEuSnCw\u000f}j\u000ew\u0018ςb_\u0019c٘B5Y3xwZ.\t\nוyw\b\u0013\u000ey_sjJ\u0011`&F\u001eOy\u0001\u0007]\u00187Gif-PO՟\u0005\u0010\n\u0002f\u0003\"\u00011\u0004j\u0019=d\\?_T䴼n\"[\u001an~i~-J#0GLQ\u001a;\u0006;Z\u0000P\u00110wn)\u0017\u0001\u001c\u000ej2@eE~W9\u001ctY\u0001V\u00132s܁wyu6\u001e5\u001bWGyu\u001a7H\u0003\u0011JxZ)st~\u0017P@1л\u000e\u0004oA^nh\u0007Rqp@P>CfdJ\tU!#:¤zq65<o`M\u0019>qMMKr)=kJu.ӞF D5-\u0002\u0001ʞ\u0014[\nd!st#2ƶ\u001ec8\u0007ia=R\u0016|+,a_؉p\u0003H\u000e0ç]\u000bM&)|I\u001aI\u001a74\u001ceָLZqh\u001ecq\u0014=\u000edL\u0000O ej=N'$$O`\u001af\u000eb\u0001I\"\u001eqH+FB\u00123sH\\3o\u0011FH28O1p#Mύ!Z\u0007-v87\tdRLL=\u0003e\\,'`f<\u000b)H\\8\u0017شh\u0012lX\u0006|s\b/#~qx\u0005qo n=<9)\u001e Ch_$\u0001u\u0018\u0003h\nП\u0006fI\u0001H^\u0002\u00076]p)\u0016\tD\"\\ށ\u001aX\"vŌu+\u0012XEJ\u0000ʕA\b\u0006|\u0011-p~I|\u0000gė\u000fPG@\u0017p\u0012S%gi\u000e\u00039i%ҿL/\u0003\u0002וP\u00011M}SQQB_CRJSN\u001ahHER\r!|dB29>\u001aeȲZfǚ550żmw\\]繟њ@ҚC\u000eeSeS\u001bE؈xx\u0000u`\u001dE\fD99\u00054|Cݬ`\u0019@\u001cc\\\t0^_\u0005o\r!(`\u0005$\u0001'\f\u0005NRp>ٜ69mV\u001e<\u0004Z[9ɭ\fu;\u001dyr)\u0019ɘ+\u001aƫf0jRӢ\tP6\u0003\u0019\u000776\n\u001c}@\u0015R;Nl\u0014_lL:X\u0004;:8\u001d\fu\u001c'F7yۀ܋\u000f\u0018o\u0000uQ\u0004`\u0002=\rPSy\n*\u0002_\u00026\u0006\u0002XAEl<\u0005sDw'\fL7\u0019;\u00000\u0010x\u00190ZSלV/\u0002R\u0007\"ȭ\u001eN'w97?=\u0013G3\u0001s\u0017ǼB\u001fOٌ<\u0005\u0017݋*%_꺑aу\u0015\u0019BFqd\u0002$$\u0015o+\u0014%9V\u0019)6\t*\u00185\u0019\u0010\tGp\u001f-'.\u001eo\b\u001c\rY\u000f]>\u000b\u0019C+\"/\u0005NyYG(2ꬢ:lΧq\u000e&9[<`\u001a_\u001aGz\u000f)s\t1'\u0003#`\u0014u\u001b\bQ/Z)ʤN\u000e`\u0011uSJY\u001b1ks4r\u0012.\u0005f\u001e\u0018~/Ȣ!ӝ7\b:WGP3ٌV\"u\u0018C\u0016\u0005\u0002.b,\u001alN%3\u0017_\u000egp\u000eqoZ躙Y<8I\u0013 + \u0006᧾\u0011d\u001e\u001bJQϟ0ԊhI>\u0019K\\\u0014P\u0004\u0002\\\u001b͜E\u0013140\u0013M\\\u0019ts\u000b:\u0011k42\u000eJC斒e.F\u0012\u0018\u0018`\u001b\rJ.$A\"\bg\u0015\u0013ѦV84%^:e^.\u001a\u0016R\u001c/N\u0002Z*\u001c4؉zzu\fuawc3v\u0019E= 2\u001b\u0007,wwȍ>\u00126^X\u0006㴱;MI(\u001aM\"pX\u0019\u00052\u0001\rʏqPze6>WN\u0004bOr\u0005۱t?63/Qmv\u0013U揱-xN,+?\rbIaJ.l?=*q|\u0010\u001d\u000e]?o\u001c\u0018\u0016\u001a쵘ݖѨ)n\u001ayf\u0010Q%*W`U56Y\u0001Q1\r\u0007^GXm\u0016nzxj\u00123%Gyg{G\u0001Fh\u0018h:!m3\u0012;m}Pc\u001bjQe\u001bvlMv`7\u0007\u0015v9Xg\u0018ka}9VoE{X^\u0003\u000fnA+'C\u000b%\u000eb\u0007Y(z\u0007Կ=}\u001cbi}\u000ez5\f5\u000e6t38zc?*\u001cð1\u0002ӱ#9JYXR<,u*BSP<ldXP8^(\u0018$,\u001a'!JuYЅ,t`\u0002\u0002GH7PK/W\u0012\\~\u0003]ݱ\u0007+\\P\u001aQ!-\u0019n(p/,t+\u0010J\\uBja:1{\u0017\\\u000bb{B!\u001fx_P\u0003\u000e\u001c>ۓ\r\u000fC\u0015\u0005%(Cg(\n<'bg$<c뙈\u001cTaW'dy\b^k\fJq\u001eq\u0011):2\u0019wNo\f\u0004\u0006\u0000/y̔3'+G\u001b`\u00183\u0014NX4\u0003y*\u001f,P\u0005bJl$UE!S\u0015\fUJ\u0017fr4\u00121EU&&6KI>LCR\u0019imE/R\u001f.\u0002\u000ba\u000e\u0019\u0010ǜ|+W㬰@=\u0004ծ\u001eL?2ԡHWO,TcN\u0014iB:[H+\u0010\u0013~\u001bvHZE\u001bN\u0011һ\\b͡\\l{\u0005Jza|7\u0018[ +\u001e\u0019\u0001Θ\u001d\u0000_\u0004\u0006!90\u001cI\u0001\u0018\u0010\u0019B|B\\`\u0018\u001b/\u0004.>\f\\/E\u0005(\u0007\u001dTL\u000b:\f<&JAig\u000eV29Rz)d>rIv!\u0004cv\rRC\u001c⎙!c1#\u001f\t!a\u000bؐHĄ\nѡIBTh0=4W\f-mSL\n'-kz\u0011aR\u0017YA#[]dK\u00113\u001f\u0011f\tH0\u0010\u001a\u0007$h\\\u0011FFhM04ᘮiBdx0%|09<G\b/>\b_#M273(Bj+7&\n\"\u00000#2\u001eL*\u00078\u0018y2T2E$\\Ct2_ۮfFmo^R=\u0007|yߔ-}\u0013ԋRR-)>Ϝ\"\u0007\u00073\u001d\u0019\u0001*\u0017{$\u001eefE\u0005im4%\u0011wW^z\u001cQM\u001f\t\tʶ&fPndX\u0018VL#1Z[W,2Z2\u0005cI\b>&6j!<@\u0019<MsL).gf2˞U9Y\u0011\u001a,[2m#e%)ݖ\u001cd;ӍbSRה<&{ytv%!\u000e>ۖ\u0004\u0003h!Y>q4M\u0016`\u0005,e,x\u0012\u0000\t9*#f\u001fT{RclO8MI<ceq1\u0012\u001cQJ\b\u0006sc9q\u00128o20~(\u001aP8P\n0=\u0007}\u000e6Oּ@uRʤJΏԸ(%\u000fXg85ڙQNF:\u0019YFsi\u0014\\oq2\u000fu\u001e1G;ϙ4\u000f<t\u001cH|\u0010\u001dyZƀ2X\u0000`*˝D&<5@Sk촮\u001a]S\nkdAFF(ޕ8Wr\u0014뚬\u0018W\u0011o\fq\u0019]U(N !8c\u001aTp4hw3EM}~Z-謄%P\u00023 2OEQ)aF\fR\\a\u0017)b4=L\u0004\rqn\u0006'i{\u0006K~5F_v\u0011~ψ,nD\u0016g\u0017j\u0019\t7U\u000eOl\u00173C\u001aW(%\rLmxI\u0007\r.骨y=5p^\r7D=IT_OxLSo\u001cExY\u001ej#ܳ\u001fN\u001b\u0019%\rFx\b\t\u0004@!'=o4hk\u0006)z/Žs@\u001b\u001eQ\n&+kSwo\u001e\u0016ے겤Rz_PwB'BJ+tO\n}g4\tg\u0014怋p\"\u0019h'2\u00163\u000eYR)̬g\u0002XyKy\u001eTh TĪshuL#XRyj_Y\nܣ7\u0014X񱂞\u000f\u0014i̧\u001ci>E,\u001e%e\u0000\bF+amڭku!\u0010u\nj[5Vm8\u0002պʭVU_Z-mߺC[[\u000f7䷦A-V\bsy\u0018\\۾HJ1eRl4\u0010^kЯBnfs\u000bnԢ:D~aj^\u001d)K`eổf+\u0005]M\"ˁ\u0007샓4(-wZ^\u0004;ir)\t㞓nwF[\u001dZi&sMk.:\u0006\u001a⽏B8jijpkxj\u0014u-HN~s\u0004\u0017p\u0017Rb]05g\u00059#\u0006э܆AV\nxE{M\\0p\u000f\u0010v\u001cƎ4Gh\u0018\r1.:\u000e:6z\u001dIù:bQG,\u0005\u001f\rr/ֱ\u0017>\u0006[#>AVG%h8ٜ\u0006\u0015h[mӝihml҉GccPϡ_ONIt=.\u001d\u00059\u0013_\u000e9%\u0001t\u0007\u001cz\u0010uR \u0011\u0003gl\u0013f1\u0010\u00183] &\u0017;J\u001fw>%}\u001diBP\u001bWf2PWIU\u0012̫8rf`Db405n\u000ft;\u001bxZj~yl\t\u0002ҧp\u0005>HK\u0019\u001co\u0012[ȝ\bkrf>\u00177\u001cvߐ\u0006@a5쇃L \u000e\rB,$B&'f\u0007ѿHi5\\Buz}M=żtC:~5V)\u0010@\u0000\u0004C(M44sћ\f\u001c4棱XׯuS\u0015Dg-:\u001bXsE]>\u000f\u0013c}X\u0011+]`F>/\u001ej\u0004h\u000b\u001d\r\u0003\u001d \u000b<t\n\bb4\u0016o񉖑\nR\n*ߨ\u000f9z\u001d˓\u0010x6*&|\u001aޚX\u0007o\u0017C1\u001a\u0012Hw*>M@'\u001f_\\h(Ac\u0001{)ezO<z߬M7tT~\fka\u0000G)3͉s\u0000v0X\\ \u0016穋cgh<\u001b\u0012\u0002<Sot8DN\u000e\u0012\u0003*\u000e\u0015~D\u0006F4cQl/\u001b[~\u001bn(10\u0002dtŁSXy:\u001an]W\u0010%,W-5ZCNv\u0013]zI;b\u0007fV\rU[\u001af\u000f\u0004>=\u0017lK\u001c59cnE鄩zj>\u0000^\u0016\u0004TPn\u0001\u0003\u0001B\u0004Hȅ\u0004\u0012@B.@\u0002!\u0001B-\t\u0017!\b\"BAQDT\u0014Ruκεgzvvnݥ]9o|=y\u00132|k\u00161\u001a;nmm\u0013W׆p%f\u0007.Ōb^\u0017pe^w\u0019qbpGX}qQ,<s<N\u0000>MB!R}[\u0017;q+6\u001b7D\u0016ĕ8\u001d.n0\u0006\u0007np̆vr|\u0018'p\"~\u0017b!\u001cMX8p\u0013\u0012\u000f1Sl\u0012ӛ+,\u0005e\u0016\u001c\u001djwѽW6\u0004\\ڔs\u0005xi\u0004XJ$+\u0016\u001a܂d\u001f\u000e'wc.\u000f\u0007#2-޺[b_77\rI}O0\u0005vG1\u001eQݟP{WH{1jm\b<OYΤd\u0016\u001cKBF\u00113\u0000׈\u0019n\u001dNLq=$\u0017{2\u000719ؕ5Ѭel{\u0019mc}\f~a ;_Q\u000fDHB`,uml.^\u0011`*\u0014*08ߎ1~\u0013F\u0018w\"\u001bPn\u0004;r`  \u0010λPm\u0016\n~\u0005(zBEtI2St,RCہ\u00035ΏǤ \u0005\u0013\u00059UPQ\f#J\f\u000bCh\u0001B7> }\u0010=]8c,Pxu\u0014b\u0007'\u0019k\u0017&j~GIF\u001c(}Ls\u00141.è(\t\u0011Q\u0016v\u000b0 .E\u001c!q\u0015b\u0013z]Bg\u0017Nt\u0014W2)ZXKM於C~ʚ%X$|@5敏)\u0015pS=e\u0018勔Ǡd#$\bJr#\u0015K*C@Z\u0001\u0000Ԃv\u0003enx:)\u000b-f$sS\u0012k48\u0014?&\"f\u000eE9OO5_{Hcq2Kc^2F9)_<\u0006Ay\u0002)\b(ѡ\u0010]QVE9*(Mp+Фtl\u001b\r;|Us^l\u001c\u001ecQQfU=\u001e|ƌsdL3NY)G\u001fQF@\u0015\u0007:\u0019,xphRRW\n\u000b\u001c\u0015WzPW\t[\u0000jƙEsjN1\u001aǨ}|H@1jO'\u001ePݛz49D&N7@9z_ЦG\tt|4j\u000bJQU\u0016*;,:7:?L>fԏ\u001a\f/1*Go6Gg!=G\u0007rO4\\Q|̒մoѽ =\u000f?eiѬ_\u000f>\u0011\rT\u001bx\u0019\n`5\\@m\u0006j#5uiBu\u000f\u0006c\b:NVefZq1^T\u001ar*L\u000f#NK\u001eT֬`o\u001a+&\u0018&uh<͔\u0018zS<l-0`͇VZ\u0019\f\n\u0006VTYZڠ\u0012aj~,r%(? (-I)QVNZ/#dDHSfZ\u0011\u001ase58\u0018mQmˀƇ\u0010:\t4u*TPQ_\u000bu\u0003*\u0007.(C'̾\u0017~IO\u0017LZ\u001feҺ(+#h!sd7\u0019$]CA\u0003]m4\f\u0006\u000bjH!\u0015<\u001b\u000br\u0016ܩҩiU\u000f\r\u000fk\u0000\tVgb9&rJG~Dο33čOݰ\u0003'ɋdI\u0007irP}\u001aɍN@ݳ9\u0006*w<d[2!kE\bR\u0014\u0012\u001a\u001e\u0003JV.>\u0014y(CC\f\u0013xIe_3L\u001fV\u0012e\u0005(\b\u001c%dtSV@uʹ[hUIѶ\nX6#\r\u000e\u001eD\u001d\u0005(\u0017Яv\u0016B\t\u0003\u0001/\u0002\r\u0004?02\u0003\u0017xm\u001cY/\u001csd\u0013?q\u001d\u00005iݧg\u001d\u0010&#?E^`!!\trB*d\fl\u0016nFf\u0013\u00102SH\u000f/!-|\u001dH\t}\u0015z+NRi2Bz\u0011'6\u0000@m\u000f \u0003\u0006W7\u0014Dd\u000e;<GDHȐ\u001aDJĄ\u0006$#i\u001fGb\"6F\\yT\u0015d\u001a\"\\\u000b\\\u0004\u0005\u0004\u0012T\u0010.j:ZS:*\b\u0006\u000b +\\\u0010\u0004\u0005\\R\u0012EG'rIsL:Fs\u001bq<\u0016z:\u0000p{-{\\-2=3\u0000L\u0004VáhG5֢]2PŀYO~+y\u00168u<\ne*\f{a\n#Z\u0013~/c`\u0014˹hfɱL\u000e52\u0014}'2\u0014|#ÜL\u000eyV-J\u0016!\rwdbR,)r\u0014'\u0005\u0016?WX\u000eXb''\u001c-&%P\u0006KG[̲ZZF%Y6\f5'Rv\u0006\u0002v̒+4Ļ\u001fxB\u0001MJ\u001d̐&\u0007l.@\u001f藢\u0004cl+\u001deS0\u001dw/\u0004q\u0018ƪxhU4j:qj\u0019\u0004\u0018>灼\u0005\u0011i06@0{]1\u0013K%\u00155edX+a\u0011Xo/m` ƣP\u0011;612@\u0012:\u0002X\u0006vp\r{KO\"ޣbrϯ.˥*4q~d%d\u0007Գ\u001cճ\u0018|$$\u001e;G\u000f\u0003\u0019؍\u001d=g\u000f\u0017~\u000fIރs{Ec\u001dp\u0003nk*>'͓\u0003|]%5!qw4V\r\u0001BB%}\b\u0007lN:PBp$\u001daI\u0018v\u001cg\b9s~DD$<Ɂ'\u000f\u0019\u0014\u000b=\u0011\u0006Q\u0003%_BfjDd{\u0000=Yp\u0012N')|FLN3,19%]`a\u001d\u0018B.(}INPWʤ8x\u0015\u001ed8Du:1>J;돟\u001eЧ[\u001co\f\u0017pp\tp\u0006&t\u0017;1({@}>\u001fn\u0000p/\u001b\u0011p\u0003_\b\u0007b?'v\u001f5Q5M+[4[R\u001ejcr}Ǯ{Gﱷ\u0016EsS{^\r\u000f=9\u0005כ\t\f`\u000f.\u0005AF\u001bh\u000eC+\u001eqrCH_i!\u001aeWk\u00152[EB ;ɳtUv\u001cZ+~\u001f~v\u0003uGM\u0006\u001bD]쟀F\u001a\u001a3A#\u000fbÎZ̙\u0015m\re\u0014|\u0018??[\u001f\u0011#(\u001cFXI\u000b\u00155\u0012h\u0006\u0013HKS?(4\u0012H\u001cИ9h\u0011b4\u0016qR<_\u0003Zق\u0005\u00115b.@d\u001bP+^?jF\u001cؤsbguC\r\u001d\u0000|\u0019h4)ڏ\u001d$/{\u0011;vk.rrk\u0013mOqR-Yۤk#ވ\u000b?;@_e.hza}\u0010D\u0013\fBc>\u001dرlÎر\u0019;ꔏ<-zU\u0012\u001a\u0013v5\u0011ZVJ*\u0012T\u0013\u001d\u0007)W\fx+>hv@Iy\u000b_b\u0018h4\u0005\u0013ICgV)\u0017B^fUll\u0012F-n~TTj{OĎ\u0007\\봷\u001eh\u001ah{NC-U'5vk}?U\u000fV\b0īܐe\u0014-5LbC\u001cfaJ\u001ch*w\\*v:\"*p~9.ϔbU\u0017nܜoGEچ\u0004{\u001b[EhsVDh\u0018_wTb\u001c\u0004-pM<I*v\"\u001c\u0015\u0016j[VjFtoPG6]T}e~\u0006֟\u0001h<w{a\u000bm~\u001d-\u001a*eAKM&Y<u6kg/\u0015{U\u0000\u001c<X\u001a^땪l\feSF\u0005Jo[mk4ջ^S|\u000e)\u000bv?U8\u001fB\f=@e\u0007v\r)\r`|o|jo|5]7{MR@e\rU_%j_OS&*%`\u0007q\u001f*9\u0006݆J\n4c\bi3T\u0012Bl)Ɩ\u0002\u0000'\u0006z(+_\u0019AJ\u000fҴ\u0012Gi498F\u0013G(%8^\u0013B5.$U!Jz@\u000e\u0010E\u0014\u001fvZþU\\؏`}ɩHL\u001c\u0016E1cll\u000e\u0006wpӔPo\u0006kRXgu\u001a\u0017Wc\u0006(\u0010%v\u001c1\u001d\u0013iFwJW\\<\\*\bE܄\u001fc\u0018I`\r,b%\u000bұeJ&w6jBƅ؈0%FDjLD\u000f%D\u0011o+.\"F\fWl\u0004\u001cS5,jF-;\n\r6oRQ1ѧ\r\u001a\u001ekP\u0017V\u001db\nUP\u0002s Qlz4>D(9IQ&1S9DqpŚjdt/\ra\u000344ztc\u0015-Mh`y\u001aн\\g̣:0+*\"\u0012EP\u0014E\u0014\u0006a\u0019\u0006eX\u0006\u0005T\u00167(\n.\u0015ǚ\u001c\u0015b\u0014&Zq_\u0012c\u00185֥1xXҨZMD?\t\\{0t^>|\u0006߂\u0017\u000e\u0018\u00183s\u00181T\u0010G9y\u0002%41W1~\u001a\u001f\u0013PŌV1V$ٍ6e\u0019s\u0019[2͔-WJ3-WAMJ`?fr\u000f1\r6\u000b\u0018k`\u0019T\u001c78bEq\u001e\u001agO9+\u0014h`U9Kq&(%a,pFIJHc0'\u001d+\r\r\t?:cx#%S\u0007\u000f3=|\u0014\u0013K!1'tTN쉽/[P%5)J)Iq$[d\u0012-`.s\\ŧ<+SJM2Z\u0018\u001c\u0019bS\u001e\u0016I\u0018\tQ\b\u000eg[)#Si)Zd\u000eQ5DJH5ʜ4LiK+Rm9-QtzƦoԘТK\u001cj\u00010;1Ue\f\n\u0001v~ۘ7m]Č~2g\fV|F2\u0014\u0019-cY1YVEg56@c\u0015ehKoPxve\u001f\u000b\nG\u0007\nr+\u0002^eti)̇\u0019\u001c\u000b߶L<G\u00163L^魘\u001cE\u0006ilnr4:/Ny\u0016Ee*ܑ0GF9HGB\u001d+\u0014FoC\u001aN#\u001cw4\"'\u0015V3\u001au\u0004JE\u0004\u000eHg$Oɕإv\u001a;SQ}\u00159\"\n\u0002\u0014V0\\\n50F4NHaF\u0014jxD\u0005\u0017kX\u0002\r-QP\u000b\n,ڬ!E\u0007,V`\n,`rȡ\u000e0\u000b&2F75C\u00101A\n\u001e\n)%\n.\tҰP\r-RPi\u0002KS4ԮB\r.AeUzl~ej@~~\u000175\u0007\r,v)̃r4!\u001fRr\u0011\u000b:\u0018W^A<5d\u0002Ӡz<Xa\u001ad3A~N;\u001d,U_g8^|[~]=^ܭԡ\u0018K8\u001b\"E;\rms\u0014=&(\u0002UtV9^7TwezU\boE>UvyWMP*սj\u00154ʳrU\u001eS99~\u0015nբ\u0000f@\tp<dvt)\u0012\u001a2K\n.ϕ.|\\`\u0002\nQ7We+_]5W\u001d\\\f0\u000eP}Anw)\u0017a\u001a\b9S\u0003sl)\n}tF?\u0007\\I]j<ձGk]\f5|krRKS?`L5`?u]\t\u001f<τ2\u0018G3ND;z4j4t1].<Jɣ3\u0000{AO\u000e<j\u00065\fDk6o@5<l\u001e}\u001fr\u001dNUY\u0004M-\\n\\34l\u0019+>WKXN/`\u0000^\r\f\u001b\u0018@\u001c\u001b8)a3/f\u0019f\u0016l^˹-\u000e~\u0004**\u0001uv4\u0017\u0001{Wnuٕ-thFt2K\u0019\u0013\u0003\u0018`\u000bP\u0001y;N\u0000n\u001e\u0014{7M.v77\\ĵ7TN(WRjgp\u0007G˽_&\u0019h'\u0006?mM^!A918P~!0q\u0000G\u0007B\u001fA\blp\u0002.|\u0011\u001a7\u0000ݾ\\\u0003G\u0000\u001c\u0016x\u0017`K:9:A$'1\n\u001f\u0012G\ff\u001f\u0001:GMhI\rކ* \u0019]{\u001c\u000f.CvyH8\u0002ZZg8\u000bU\u0013\u0007|J}'|/F\u0006\u001fk~\u0006Eo#v{\u001fn;tk\u001b`\u0018\u00063\u000e?MNñ=]\u001d|m--M<\rW8/t?\u001búB9sI\u0013m|y=C\u001b魇\nЏ\u001a\u001dF\u0017{\u0017o\u0015k:KkOB\u001c<\u001au:=K\u0003[Dp\\\u0014џD\u0013lAOЕp@\u0017F\u0013\u0019=\u001b+1\u0001ɤI\t*!q|@\u001c#q8մǋB)\u0016\u001dod\u0000JOX\u0001WGta\u001f\u0015(\u0013V2:h䳣:F\u001cG\bqK]\u000ek!*W\u0003m\u0001Wxvj\u000fgv\u001dBm1<{/H.ΐ\u0018}\"1\u000f++Y\u001cO䱜LYv\u0013NA\u001cTúuLM&آMG2ӤO<\u0010\u0012JpW0`\u00036``\u00036`\u0010\u0004\n$&!Is\u001cM4I&kf]zd=Uuӎv6դQҺN:mkUv޷dz{\u001e>I}\u0003R/xW%^սŋ\u00177Zʥc:\u0006\u0003\\G\u0011&\u001fdQ\u001aqX<pz}^\u0005ݐs:D\u0014v)^VY\r=HӨ5KH:\u0015ҩ\t.f\u001fƨ4&$\u001f\u0017^\u0005KcEi;\u001d:p\\'zL}L5i\u001f\u0015Tx{Y<򔞯+=\u0012\u0015'$eKDY5\u001eί g\u00068\u001350wk\u00178v\u000fǢ\u000f\u0012}'GuW9IX\u0002c~ξ[c_,oS)z(]Qx!˷\u0018'&sy\u0015[Ʃ\r՜-\u001c\u001e\rp8nCqS\u00117ρE\u0019l8\u001eyn7<R\u0013_ga4~\u000ec+Th)\u001b_4\u001d3\t17r|S\u0006+\"\u000e\u001b-\u001c4:8bB\u001b\t~&;a\u0013YLfWN\u0016\u0012#(ۓ2tיItLǶOJ|k\u0005z\u0014JA.=\u0013yJ-爼\u001cJ6p 9\\vXJb1RYH#-\u0010si#̦M2>t\u0012S\u0007\tgb\"\u0012㙏5;e2|+\nO\u0017\t=\u001f.V%?{ewV,Y\t,de#l33a*pN79\u0003nek4y\u000bg(\u0004\u0017\u0019(Fs\u0015P;.\"7)R\u0019.JŎ].%Y\u001d\u0005ˏg m\u0005\u000bK(dXѢV\f\u00152X4Lq턶GIP\u0002ݦ2=Ke6ҿ7Q\u0001׾H\u001c\u0017\u0007_Ny5K\u0018/Ib$\u0011S\u0011Cr\u0006M6MNJ)&X:@w8]eo\b\u001ds[<\u00077C_\u0011kҝ6\u0003\u001bG\u001eYyҾLh_Fͱ\f\f3k6\u0011Tmqeioi⧣\"D{(\u0019Uh:D,\u001e\u0003xlO}fۯ_\\DVyFWf\u0016\u0007\u0012/\u0013k\\2,\u0006\u0013'XL5\u001b\u000ev\rIM\u0016[\u000faS4,d\u0003\f+48\u0014/QxKEDd'{VwQi> f<aQS@M\u001c5\u0019x\u0005K+q\u001d4;\\49pvX;HC$u;p:S<Emq\u001c^?pF\u0015LWu\u000eJ\u001a뗏\u001b_\u0006ڜF<T49P_C}}\u0003Ά\u0016\u001a6h\u001cǮ\u0002ƵL$M5}\u000bkwůğĿ\"\\F\u001fŢKy\u0018\u0017z\u000eKq䊧ѕL}S\u0016ΦBjp4[7Q݁݋=FgJ\u001e*ZciO<\u0005[~\u0003/,*\u000fJR\u0003:\u0007M%Ҩ>ѩ6n5zq\u0018mIޚNuk>V\u0013ֶJ\u001cTzx#f(-Q[仗G~C\u0016\u001f(\u00137_eJ\u0014\"(YRZ\rX;TvPљN3eՔ1[(\u0007\u0012\u001880EQ`\u0017#\u0014\u0004.x\u000bO~S\nU..HgI*1'k*j;\u0016\u0018ʃ\u0006(`KO>=&z(쭥\u000ez\rM\u0013Iv Y\f=DFۤ~&~OF'dD\u0012wK렴\u0016ĔDPKINA?\u0014\f\u001a\u001bL!w(\"d\rU9@p\u001bA҆GI\u001d#yd\u001fGΈ$\r?KŻ$\r}*wJkYE\bHM%Zc\u000fUV\u000e\u001aQ[cȘ06HD:)y$OyZ\u0012'$b\u0010cxMćOb\b_\u0011O\u00137x\u001bG\u0018?#~<\u0016i1\"\u001eѡ5UIJQ٘U!}z\rI$m8Ms\u0017`/\u00156\u001b8e|/\u0013Hu^d\u001bD~@cL<0\"\"\u00032\b\n*\f\u001c5\b\"(Ȧ\b((\t(8*\n+˩₩\u001e1n&DQc%i[5ǦMjԨI44>99=Ǚg}T:++\u001cHϖ\u0012s<r0K5\u0017}ŀyoԣM\u001e\u0016Yj%H.rDCf\u0010\\\u000b\u000b2`]x\u0000\u0018\u001ck\u0018ت頫g\u0010\u0012ȇ,\u001eIF;\u000e\u00119X2n@5\u0016kE\u001erA1x-Xޟfʋ\u0001gȭ\u0004Ԋ!+\u000fZ\u001bp^9\u0014\n\"\u000e\u0005҄9a\t9\u0006\u0017H\u0003x<\u0016:W0\\\u001aht6|6҈)m4\u001c\u001byx8l\u00140fa[\u0013o\u0016=oUf\u0001d\u0011I;}Ț\u0019M\rQ'f\u0010Rg\u000exmvh\u001d\u0013?vpM᳇BC,1̬nsZsItJk\u00079r9k_/\u00197K\u00064v\u001b\b'\r>''\u001e-\f\u0005\u0007<h\u0006i\u000fHi\u0015?:^m䤍\u0002k#\u0016m\u0000#HG\u0005&4xO!މK\u0007yp\u0014z\u00035$/\u0012\u001d#\u0006\u00020\\!K:NL^'&'I;M4oi\u001a3tΰϒ賋X%\u0016g۹O]\u001cJ6e%9X'nL\f%x\r^\u0007B@\u000eH+\u0018\u0018P༫t\\\"7eP\u0010?.Ӕ}ċ\nyd_\u0002Az\u0014Nye\u0004r\u0002r\u0006^_j`}\u000es\u000eà\u0018_2|\u0004W\u001a܀N'\u001dr1|\u0016 G\u0005|`\u000f\u0000y\u0004;\u001bx\u001f\u0004`\u0018<g̘)WߨٴD_3=a{Ĝ%s\u0003&Ltt\u0019S]???'ܽou\u0013wp\u001d.]N ǧ\u0001|\u001ai\u0018q衦2)s˻̗V>ŏ;q\u001b?>Əq)\u001aS\u0015&\u000fժ\u000ft\u0002\u000f\"_u\u001e\u000e~\u0003uyzYW\bz+T\u0013XG\u001aO~>/~\u0019\u0010طb-v7R\u001e(=zB>C,N)V|\u0012^\u001d)<R\u0017\"f v'\fBk(:hL~Q6OI\u0016aToS~-]vف>P+[]G\b9DF\u000fx!\u000f\u001d\u000fNgu%y\u0016ab\rQh@#\u001e`52yi>ZU\u001a\u001dƏq@Vf*%cD\u001cuX;\u0003;\u0001\u001d\u000fM,$\u0016ǩW\u00155Ġ1\n㱟LV<Hf؅\u001f;I+\u0005o[m${\u001d\n_v'\u000e\u000blS#8\u001eia\u0000t\u0018\u0018Nr\n3l4\u0019?6ᇍl>\u001aUG$oV*V[rcգ_Ks4g\u000b[{/^g\u0002\tA'\nhEc\u0002\u001a)hd\u001bc)E\nZV,\"\u001f\u0016\"[.v._iswr#\fk\u001bG>>wpel\u0006wUSVw\tJhYG%Vu.ZꚢZL-q\"|Y܊TVj\u001aZ֤y-*s?RwTcx<Q9;đz㽅WM\u0013ظn\u0015\nVziew/wRZ1H\u0016C\u0016\u001aF\u0010\u0005$LU\u0014Uxjg<KT5_^K5ǫAE^Tc\n_,w5\u001f}y\u0005J'm|^-,]dtBo\u0016x\u0007ۤy\b\u001b8Z%x\u0015\u001b'jO|T蓧\u0002\"PbJ{nUNSMe\n~\u0004{''y\u001c0\n@C\bm\r\u0016\u0005S/]TK%~4ׯ*\u001b5XNPg(?G\u0005\u0016P\u001aMcUfM%\u0016ئJ\rA\u0007smױ\u0004Ā6lE\u0018泊r)Ɨ92;C(?f\u0004\u001b\u0018\u0018e\u0007TV8M\rJԔTeRz<+e@\u0007lФJ2\u001dJ4]Qbȗ\u001c\\Ն.ڍ\bi\u0019TC\u0019s_/2#r{hZ\u0006Sfp2LQJ7\rSi&+4I!\u0019\u00188R\u0013BjQ杊\u000b;\u00024.\rz\bn]Ff\u0018*`n\u0014ˣ5!.Yf\u0017ez*=W>J1l\u000eD\u0010%G(1,V\ta\u001a\u001fAي\u000b/иrF,؈\u0006lC\u001a\u0015uR#~\u0007=;iAo\u000bm\n1\u0000\nǽl09C\"J\t\u0011\u0010\u0011(E\u000eӸъ\u001cQ)\u001a\u00135U\u0007kTtFF[4b\u001a0dǼa1\u001a\u001a\u0001|`!v\u001dS\u001b\\7y\u000fa&po\nK#.\u0014M\ṭ>0\u001adQv\u0019MvD}\u0006\u0018\u001c}GEepcĠ`Ԉ\u0010\u001b\\\u0000Ƹ5qiFkUظ/MjzbNs\u001a5MSTk7\u0001IOsf`f{{K9\u0006Y\u0013eIPfRIIHJWzrҒR%SJMJM]\u0014j%\u001b7)\u0012MG`\u0000A,W\u000e\u0013}́z@\u0005\u0014y>9JTq\u0000\u001bd2јTI)&\n`ҧ)1ݮEX\u0019\u001b\u0015gޭX\u001b`>\u0007x7e8\u0006نV7m\\30\u0015*\u0004ǔ.SR3(<NI(%'*!3U񙙚IePX\u001cM,TS+:k\u000e+2,=E[\u001cl\"*3\u0001k\u000465C!X!Y\u001d\u00167%ey)jP5PqpZ'hBvb5>;[9%ʩVdLE(<wrWhpH!yBsC8\u001ehEc\u000eh\u001aTB\t*\u0016'cW\u0012\u0015|_/WTA\"\u000b\u0015Q\u0010B\n-\n-,THQ\u00155(YAE\u001d\n,zN\u0001;u\u0017E_\u0002\nQ`CE\u001dĪB9\u0014\u0015<\\*1\u0014U2R\n+3(,H\"\u0014\\\u0016d\u0005\u0015P'\n1\u0015M\u001a]&C3xQ*IV|QwW@2z\u0012hKUP\u0002y0\t\"_:FbUB*]\u00144Sվ\u001a[=VcC4:Zx1ȣj)Z4ʻvjY\u0015~ \u0013<kC,d\u000e\n(bjP*%;&KQS\u001a)N2L\u001f!z/ @޶0yqyڒ!S\u001e\u0002۪46Cn\u0016:b땳m\\%ܕ\u0007jGqـ^5B\u001ekvj%\u0013{\u0014]+a\u0019\u0003m\u0019l\u0017y=4\u0011r\u0007\u001e)gD\rdj v~d\u0007VjĨ6b\u001a3|9w\u001fZV#5\u0006Yo\u0011X\u0007h'\u0018QX\u0003э7I]N\u000b\u0001\u000fP\u0006\u0003J[)^lX\f=m|!3]\frȣzf`\u0014>\u0007}t\r\u0001jK4l)\u001ew)\u001eW\u001be\f7\u000fv\u001e2\u001cl\f{\u0007Emg\u0011\u00136k|m~s\u0015n\u00130\u0005(z8\u0014E\rBװH~Rr_&,K8p\u0001.+*.]tq\u0002\u0003íAaa=\u0014\rG\u001ew1]_5\u000bͩPFs([\\!k\\>\u0006Z\u001diJɩ\u001bm*\u0017si-\u0017䱎<S\r\u0003\u0017Q\rzt!aGO\u0018>jb`;\u001f6\u0001{[\rVf\u00016SD\u001cE\u001aVFr{\u000e\t6x\u0001h$2\u0012\u0017.c\u000f}c\u001fc}\u001d\u0017\u000fǹ}\u00007TGKH1Ia1y\u001c5빑o\u0019z\tv^x\u0015\b2\n\u0000 3#jrK\u0000\f\u0003y3\u001b\u001c6\fY+0\u0004;g6~K8N[\fu?E\\v\u000ei\u000eh\u001d\u00182@o!ނ18\u0001I\u001e59͌#\u000b\u000b<\u0004/W/RK\fե\re\u0002_&*F;\u0013Dj\u001dǒ7\u001f\u000epjY`\u0002\\\rU\n\\eN>aFї2gl\u001b\fMV\u0016żu\u0018ؠu\t<\u000f\u0004=\u0011w'-]U'm\u001fu}r\u000bu\u0003\u0017v\u001d\u0007xa}k}Ӹ_C<ω\u0010\u0017\f<\u001674}t\u001fWE/JD3\u0013|t*Ш-6\u0010\u0013KANw}e\u001cE|y\\Y\u001d\"qyW(\u001f\u001e29?9<{\u001a\u001a=;\u0019B\u001bǲQDJ^G\u001bt<ΐ))y|<NBi~\u0006NCُ<8$\f\u0003S%^\n^\u00128=\u0004t2a$J\u0018*\"\byI_\u000ek\u001e[X\u0001\u0003k\u0018\rz\r*CoBݺ](Dux8}hșy\u000e\u0003k\b\u001b!~2f\u0005]ʶ$v\u001dmĞ=j\"\u0002.f\u000bkVj;\u0007ًd\u001b*[j3\u00117ѥ^}'\u0019:\u0006\b<\u001eZG\u0006H|?É\u001fG|#-t9إĮV棏9ݬYĞK\u0005]B'bBY\fzZ7DfV-7м8\u000f\u000e\u001d=vj=E\u001fE\u0004⛈ja_BJRz\"~\u00131[R:ҩr|.t\u0010}\u0019lc+78\u0006vce+ڼ\u001cQ蹡MEǠ\u0011F\f\u0013JB!_I4&QK\u0007ј<v\u0013TC\t\"R\u0016iOǛf\u00078͑vu\u0017>X5<\\i0w|G'\u001cX4HG#\u000b|4J\u001f=ͫ\fO\u0013[;i$Nb'\u0013'sqbױsqiRM6Z\u0017:umU\u001d]K+T(L\\Mh\u0013\t\u0010B6&\u0010B\fĆ\u0010\fm0ډ\u00013??~:w}~{\u0007c\u001fc/\u001eV0]b\r-|Q_75O op}\u001a\u0002$1s4WG\n\f:kѡ\\i5ϫ~\u000fj%?L\u000bFX0i*\\ъv\u0016if/hGɋ*ɒ5Q&>d\u001f\neE\u001ci׸?-Ye,\u0002-5jԪJ-ЬyC\f=ij\u0010׌!\u001dƔiM\u001a5a<\u001bNjĮ1]ר鞒ה0\u0011F,Yڬ^FzЧ}c~,lZ\u0005sLf1;5mnДE\u000eami21˘F-Jn\\U\rc>nzRqU\rZju~?\u0003>./8\u0003l\u0011>Xz\u001e{f,3qږ)Q)&\u001c\u001aiU֦-\u0006,x\u0006wnm~LъksxUa\u000f\u000f\nWާyEit-<3M2\u0014s36{\u0015f\r5dw*nנݧ\u0001G\u001d=9bV\u000er\\Ym(TO5wU:k\u000foÇg\u001f\u0012ZI\u001b\u0003\"r=I8c\u0019e^F\u0018ːH\u001b_mUPY^g8[\u0015R&Au׎*X;Eu\u001dT\u0002o͉[=\u001f?kh=\u0011R\u001ei\u0018oޡy\u0019d,}<E]\u0006E\\\u0016]VU.W:p^ߧ@}BI5RgZ\u001aOxQ͍o;|BVW9\u001a\u00164c\u000f@\nF\u001fjg{\u0014xr)QcRǦvC\u0001O<jmlS7\u0016oT!57<'o\u001a}']P[\"ww\\\u0000i4\u000f`?\u0017[0\u0006\u000f\u001fe,a\bBGs\u0002F6W!ϩ&_->TckDָ\u001aTߖۿG.Ljj\u00037T\u00132|[/iW?ճ@su~NB\u0012\u0010/\f]\u000em|\u00065j\f\u0013RC%w{\u0013\u0004j\u000fc@\u001d霑sE՝GT*^eٻހ_p7ά濏\u0004\u001eY\u000ejN\u0018~#\u0010\u0004?\u001cyJ\u000e\nZU\u001bVnT\u001dTeOL\u0011CS\b-isCO,|\r$[[&[=>Vy\u000f\u001354ИVA\b:R#Շ}rn1*bQe\\HnUCe\u0011٢CFS\u0014]C\u0018;'Ḵ{Mb?9WY73hzϣ3N\u0002\u0006 \u0002Aۄ%n໣RU_*KT>`RـUA6\rj`#e\u0019\f\u001c\u001f)>\u0006s2\u0019\u0019/]_SIǴ0\u0000:\u001etf|0^\fB\u0001-'F)ՃR\u0005uPAED6$dLeHKɘJ\t\u0015'w([*H^T^r*7C%~\u000f\u001f(c\u001dFg\u0018J D H~h\u000fObl3ɘ*QIʤ&\u0015*Lժ ըT@\u0013aتu\u0013\u0013L.\u0004\u0004EL%*Pl܎3%\fC\u001fe{ˇvLJm\u0012<I\r6b\u001a3KO$\u0001f\u00134/\txi4ETi\u00168+\u0012{@+\u000eA\u001c\u0010$Vb\u0010s8cF\u001a,ڵ^ԖK\u0018%\f2~Ppg3,l?\nEm$Pf>ϳ\u0014?ݿ}\"\t\u0012\u0003\u0010JH\u0001%:bv̠RѰ$\u0015H@p\u001ch\u001cĈ\u001c`ּ>5&ym\fxyX{g(b\u000f\u000f\u0005\u000f5\u0018\f\u0013s/w)\u00001WΣ0JWA\u000fJ\u000ec6\u001fԔG1\u0018\t#uơK?C\"<˚eße.o\u001f-q3<{>Mzmx_ShB?ʹ\u0003\u000b|\u00195[B\by=\u0005g®r'oϳ.0gK2{9\u000e\t2{2r{\u0006\t8|oa\u0003<!j\r]q8zlk\f=?4\u0018\u001f\u0002WӘ녘r\f\r\u001bD\u001d\u001d\u000e6B\u000f4-qEUswJ21s\u000fg\u0011\u001ct@5yq_\u0011\u0011!1\u0001\u0002&@\u0004\b\u0000p\u000b7\u0005\"  \u0016\u0015V}ZV[;SnUu^ZYٺ^9gtksZ5a\u001d\u000fw/>ׄnZr1\u0003x\u001cv\u0013\u0010\u0000fK04&{CYi\u001f>>椏 \b~q\u0000>\u000eJ%?A۹B>z\u0007Ƹ%9\u0007j]\b\u001ccF\u00042ur9ACa?/~곟B;i\u0006\u001a8\u0007'U9@m\u0000cAg|FW(ćW$\f^~Ea{3ظ!'}q\u001a=/\u000fX\u001fRl\u001f\u000b$\u0002Ip.G\u0011\u000e&&\rҝjKt>oKOlH1\u0005\u000fӝS{7$\u001d\u001dۘ~S\u0015\b \u0015M̫2ґZv>\u001eϪ@V\u001fOS;tF=ğI\u0016\r|ݞpOѩy\u001ee\u001d\t\\0]׹\u000b\u0018<w2\\R@w^62\u001cR[(ד\u0016b\f=z\t\u001f/\u0005|\u001cQ|\u001ca\u0011x\u000ei\u000eRr_GKVL\u001e\u0004v,t\u0007r\bSk\u0017\u0016Ɛ\u00182\u0018C\u001eK@\u0016b\u0000~M!t(ޣl\"?ZI;ηq2n\u0010?Wѽ\bg@Yk\u0010@ǌ\u0015\u000ec\u0019i\u0017}ɼl>i\"'\u0013k\u001eL>\u001eR\u0007X\u001b\u0016f)'Z:%t\u001d,e\u001fv+-H\u0018|'\u0012;!.'v5LqTa'&3iB/\u0015mt9.h\u0015XI\u0015dn9L?Ev(\f,\u0011r5^qOCr\u00111/$v9u\u0015&\u0011\u0002q'\u001c-[|c!.\u0017yds.3:\nO\u001a\u0004n1\u000f.̓ي\u000e\nU2\u0011E|\u001b\u001d$E/\"|,||\\q7˺LOgT\u0018T2CeO\u001f8[S\u001c\u00056[\u0007.R^\u0001/\u0016i8:\u00164\u0012D#\u000b<4(GJ31yJ}P\\M曓Tp$:\u000e`v [6\rjV\u0012\u001c^?!=8\u0002-\u0013:qHCh(fSwԫ\u0016M\u0018ԡAS4>.\u000bY2a\rݩЃj\n=!\u0018v\u0019A@{ql5[=0\u0017fO53\\6;ܠICtgUaɚ\u0010R{X\u000fi\u0012\rTkh79|uq\f5D,P}JEn\u001d<jI\u001d\\\u0010\u0013hn\u00188z`\u001cfB7]<K\u0007^:Cn0j!Fx58lP!G\u00021X:cj\u001amUeTiڨ\n\u000e\u000fI߇4k#[c#\u0007\u001c;zy\\s,k\u00164G\u001cFI\r8ՙ5j9Kf\u001a\u0015UQU\u0011լ\u000eE\u001f3G%1Tl,T\u0010{\u0000^/=\r\bh\u0013ZWL\u001dZ1yހ:ƆbT%Z#-6UZUaq̒X*Rq\u0018\u0015ƍSYg+JUmr);%8\u000b:\u00040Z+МQt*Nh1\u0005my\u0015>GBTaT,5VŶD\u0015ٜ*e/Hy&)7U9]N%}Ik2*#\\gsó֣\u0014T=\fW|$^h)Ub{\nFʳ'+מle'I.;FY)LTc\u001d|Pr:#\u0005x\u0007>3\u001a\u0003z\bhL\u000e9eHc_\u0003#yV\u0012R\b!:\fqq)ˑLS\u0019,yJO-QZZR\u001aL#}R\\\u000bz@IGe\u0003Ǖ6|W<\u000fh5\u000bћ<XuPu9~\u0000/^N\u000f\u0015\fI.W\\6Rpɑ\"%gV*)AJt(=OUy/G\u001a\t\u0005}U6w@+јfyP\u0007P\u0003ϼLC\u0018D)3BI\u001eiJ(!ۧrrjemӈ)˝X}x\u001fQw7\u001cU\r\u0006ؽhN%i\u0000UP\u0006E<\u0003\u000fr{ \u001bH%\u0014o-?A|Fg*ΗX_\u0016_b\n*KQ\u00052\u0017.T\u000b\u001a^pQC@KПDڑP\u000bP\u0002>ȅL|}^d+\nW\\QhŔX\u0015]tȑ_$\u00144(c,\u0019J*t=TO\\K%7ME\u001dF4\f gR]AQg\u0018\u0017]wEЪ(*\u0002\n-,\u000b \nB\u0004\u0010\u0002\u001em\u0013ăD\u00133iFUi;1&ͤN\u001dk\u001eNc̴L56i֣c,d?Y罾}FL+\u001f`WJQ\u0016\u0005dv|\u0003dȕQ\fJv\\*C\t~;+ιOcqX\u0014\u000e^8V±\u0007`>(\u0001 \u001c\u0001*i\u001dd_\u0010+;IFYIJdT'[\u0002y*\u0014u)ڋ\u0004'/\u0002ыp|\u001f \u0010<<_h&\u0004q\u0003;(\u0007@\u001e1τ;\u001a~$J\u000b~d\u0017ŉJ\u0014\u001b**@\u000f0\u0003\u001c\u0000\u001b \u0000:3\b\"$\b *\b \u0002!y\u0005URx\u0016\u001aP\tJ\u0000lL_qÿ\u0010~Llu1JXbPt\u0003\u0017|\u0003\u0017R.F\u0006z#ìCH\u001b\t\u000bNjų#\u0000aKgpK-\u0001/p\nPH9ĜE̓}O?/Q_µEg\u0005KO\u000bF+k+:w%K\u001bF.(\\\u001b/Qu`;ϰ-D\u0002MT\u0013\\~\u0002vPBsy&1O\t_\u000f?f4`\u00149\u0016\u0019\u001aVAZM.\u001b?P\u0007\u0017pxs{E\u000fz\u00013\u001c\u0002r\r[d\u0011\u001f!m\\@̳p}jΫ)$C\u0014\u00057X\u0018laX\u001f\u001f?\u0006X6N`\u0011LM6s6U|RMySpw+\b\u0017TQ\"\u001e͡|ի\u0014^3uK\ta·A?\f\u000bXWY<e0\":\u001f\u000e1%7\u001f\tp\u0018;q|'q\u0011L~xԹ|Ӊ9c5=\u0012mp>\nq/O=\u0019r,\u000bw}qK\u0000C\u0000M~'q~\u001fg<>,\u000fO\u000bڙzb/ku\u0014?#|ag\u0000D:a\u0007\u001c\u0000/Caq0&Xk\u000f\u0018u\u00197F\u00194(8\u001e!8G\u000f䠿&M\u0007\u0014\u0013\u0013\fs\u0018\u0011A\u0001\f\"\u0010;`4\"hu\u0004&x`x\u0017?NsfO\u001b\u00198)w\t\u0014/:r΄;M6\bHhD\b9p\u001d\u001a\u0016ɈH#\u00198\u00038r\u0010pu\\,b%\u000e%\n~O\ny.\b!\u000eMwAQj@|ν:\b+OQ8|\u0002H❧I~E\u0002?\"s\u0004p\u0016h\u001aBp;C->Un3o>$}|Q\u0015X5=:7\u0011j\u000b\u001f~\u0017{\u001e=Hj=k?\nUx3z]W]R\u001at+pk>\u0013\\\u0003P\u0002\\fFi3\u0013\u001c[\u0004GP'^uz|:z\u0003\u0015:~\u0018C\u0018E\u001e0-\u0017{\b/J'i\u000b:\f\bA \u0007ƸE+Zd$\u0014,%ض㷋\\D\u0015Kè\u0011!\u0006A6\u001c]Ty\u0014xscu\u000e9\u0019/p\u0003ޏ#N[f|a\nGb\u0016]m;V]a;\u0006l/nvS<\u0010\u001b7v\u001f#dr\u000b\u001dEA+|2\u0016\u001b\u0019;17bۊtf.v\u0019#ʎ\u0005^\u0000D\u0005Z\u000e=B]\u0001F yB\u001bz\u001d}d%\b,ã%2vb\\lQ*'a{:s\u0018υ.#U\u001a{~=7QBy\u001e5df'ީ\u0018~\u0012.=\u0014\u0019$\u0017\u001b8#`;\rۓ=\u0003b\u0010eد~\u000b?:CZEK\u001bo\u0016\n\u0006rzSL9q,\u0018Ǭ\u0003`#v\u001dpFHo~:b&'2\u000fB\".\n\u001a8p\u0004@wtұk\u0019uԣj\u0007 .3HxU3\u0000\u001e2_\tVq\rG-*\u0011\u001e3VÑ\u0001G&\u001cȃc\u001eeT\u0000\u001e\u001f<xk1Q舅Kyt7͉w3\t\u001b\u001fùs\u001cW;#k#\u0012w3p\u00135&Ū1>Y\r1\u0016GT\u00175Ii\nDe\u001f=G(\\jycm+U5qr\r\u0011?'\u0013L8\u00074^z\u0012JKX\u0011k'/\u0001SIF-6X3k,!K.l-HWMbHQuOzU&.U\u0018Uf\u001cRqJL/tBE\u000f\u0015p\u000b|'6\\\u000fp-\u0003^~w[6\u001b2UcJӔjTM3Te|S**7WUV㖫hjͳUk}Eso*!\u0006=pm`c\u001dmzk\u0000\u0001.|q⛃SbUeMRŢ\nMI*NS5[ֹ*\u0016Z\u0014S\u0002;IyW)7urR٩O+fL9p\u0015{HC\nU\u000b|w*\u0002_ԖTRST:A\u0005575Kslʳ\u0015*V\u001cDEʞT5#}2.\u00195-cD\u001955,\u0013\u0002!\r¿\u00164`\u0003$\u001c|\u001fe\u0003}oJx\u000b\u0010 \u0004b\u0002\tI\u00125AI*\u0006\u0014;VYKfnVbUQyUۺuն]ﶹ]n9\td\u001d'y^z|*|̍W%Yety-Y*R OGrjU(E\u000ek\n&-V_v\u0016l4~PVg\u0004~<mYm\u0002j8\u0017!\u000b:h\u001d0\rL\u0001ܫJ)JA (ͤB[\u001c6\u001bpUJ\u0006kRAsR~Y;|Vf)e;\u0006ו%?\u0004\nzX]\u001cp\r\u001aU[\u0019(\u001f\u000fp9&HQ#]vGlNN\u0007(V^OSkr\\m2{^,&ezvyF\u0019=V2h\u0003o\u0016h*ցS\u000eJ\u0003|wIcTnI\"re.r+\\Yŵ,\tTҪ)ݻQio\u001d\u0006'}\u0013\u0012ܔ\u000bR\u0016S\u0007p\u000f \u0006@)>\u0015\u0001߬8Ki̥*PfYI(/Tz\u0017T)\rjhQjE'Uo@ɾA%;Ċs2T\\*>W?\u0017a;R\u0011ԃ|ǤJ\u000b\u0014pϊ|THپx&')ʨL\u0019iԪ\u0002P*JnRbuDŚXFwlU|^U\tկ+|DU\u0002ݬmo\u0002\r\u0006W\n<w\u000fLFjV\u0014\u0019Je۔wiL\u001a\u0010@\u0005أ\u0003+\u0001,X#\u0010,~\u0016o?c-bf\u00116WBQ9(\u0001.ÝW\r-RZ N)S\f24`⢇X$H\u0006)Z\u0007Bh\u0010B6\u000b)B\u0000&Ȗ\u0014D$4\u0003>\u0006\b\bTP\u000b*1Q\n<|.\u0006HF3\u0012ńٴF4P(Ni\u0006O\u0005;\u0017J\u0017N3X3\u001c\u001d.\u0002kᡖ&lAĵ)\u001f\u0005\b0(4\u000f1\u0000{\u0005$f[3\u0015\u0010\u000fK\u00147E\u0017,^mfv\u000e\b\u001e)\u001e\u000f\u001d##ψv\u0004l/\f\u001bdx:\u00054z0\u0019^o\u001a\u0010\u001d\u0013\u0016Q&R1&J\tȵ\t\u000e\u0016Ny\u0017=/亭M\u000fԃ\u001e>!\u0014\u0010g}6bl\u0002S\u0005|\u0010s>imd7y\u000e\u001ap.]6\u0002\u0016E,`c\t5Y\u001f\u0005Q>\u0006\u00059f\u0003q/r9br9c/[\u000fyf\u0010g\b\u00060% <RIFxK\u0000-Ƃ\u0001\u001f+j'\u001fkcmt\u0019eg\u0017\u0003\u00043~i 'җ_c6QaR\u0015k\f̫WFx\rK(\u000b&ρu`= ,k\t,\u0016AR0/A\u000eAn>.mm,\u0017\u000eo:HCYk7f-\u0018Pl\u0001\u001f\u001c\u0013\u0001,`\u0007\u0019'&'ߡOQ!zt\u0003~\u001e\"'(~\u0002\u0006sbϫ\u00155*]M\u000f\u0012sv\u001f,!{_3hl<&Bh-TlǄ0 ň2\u0010=r\u0004?F\u0011\u000e\u0011\u0006(8\na\u001e:t\u0012PuV\u0006r\u00184%-\u001b|\u0001\b\u00034.F\u0000\u0015&1BJg蓳q\\\u0002E?OAr3!pFpv\u0003R#<+;\u001c<\u0014au:\u0011\u0015Q\u001ax\u001d\\\u0000(.\u0001A]6\u0007}f\u001aJ#+\u0010{^8i\u001c=s\u001byS~}=*:\u0003+G\f/\u0018\u000fP]Wiԟ%.~J~B.i\\:\u0014ops0\u000e^\u0001/c_>Q\u001a\\f\n\u001b4G5t̻jL\u0018?~ʹy\u000b-\u0006J<Cs\u000e?DP@LÜ:\u0005\tt\fk#Dw\u0014Q}\u0005\u000e;1?\u001aR1\u0011\u0015\u001e\u0017<eد%Su\u0006e2~ƏS(\u001cX'P84F\b~\u001f6f\u0017\u001e\u001cs0>Cx\u0007ЙOE\u0015\u000f\u0018\u0016\u0015\u0019h47jvP}\u001fhũ߄3,ji0)\u0014('\n\u0003L5{ #u̼M`pEWhT՟W<~`;\u0003۹v0Ŵi%\u0016mx\u001c}\u000b%\u0018rǘ\u000b\u0016as9jj=7{L\u000f`e\u000b\u0019R\u001f5:%.Z;}Q`O#6\u0015Zm/\u0019u؞{݌VlEݥ\fTe\u0013 е/iVқbX\u00181\\G.t욱k\u0003.l{]Z\u0006쇰\u001fV+#\u001c]Lb\n\u0019Y<H0\u001dg\u0004?>:1~6\u001c\u0013\u001fkt\u0017v\r5bׄE\u000bg\u0002\u0017?RX \u001ca2)snM?ӳٮ\u000e:e\u000e05\u0011&9(Fd\u0003\u0007}\u000e{\\,XH.&=F\u000fڍ\u001fc\u001e~t\u0006\u0000\u001c!셱ۦv\u0011,n/f\u0016:z43Ua\u0011\u0016K\u001aH}$A+o\u0015X\u0006\u0016&fp:9/:\u001cj\u0012Q6LC\u0001\u001c\u001e8JdRruaĉc;ǗN8NvlǱs:M$m״\tK֭bBJAV\u0004S\u001dV1D\u0019m0؀A\th*h6&.ZQPG\u0007'e=:3Hì1V*f\u0006젗\fc%X\u001fz\u000f>A4lsG\u0006X\r㰔gKH\t\u0016\u0014\u001d;;Ѩ$\u0000:u4\u00072to>.&\tzg=;6%ʯc³x/U\u0007|8fw\u001e\u0018cn\u001c\b\u0017\u0010\u0010\u0015iL\"\u0006.|5ը\\nsL]:Yu\u0014v0\u0011\u0016-WxZ(m٣fA,ǔVr\t\u001a\u0001vM{Ra\u0018\u0000G^\u001f{\u001c\u0005\u0017jSW\u0012KVZliDҸZJJ[;lWʺPɲ1%(n۬mj\u001fS\"\nۧ\u001a\u0014:\\G\u001a8N\n6\nCC7]'\u0013caVDY]-vJ~%uJأj\u0014w)UԱ@\r1E(llVG!~\u001a*h<\u001aG\n\u0018W^k\u000f[K\u0017B\u000ezN<Y޵\u0010K3J\u001aV%\fK1çF#\u0006#Ѥ3zgC\n(Z\u001a\u0014pV>Uy9-粼u7\u000b;\\MZL3\u0014v@gi%r1O\u001a\u00165m\n\rջ+\u0014rW]'\u001aO\u0002\u0015\u001dWT]HU+ީJ.Uq}\\Kryr{oj'\u001a荓@.\u0018pm4$x\u0017#FE[תסץjWU DJ[զ~UT㟐ۿA\f|EF\u001bpJ偋r\u0004POt\u0017\u001ak\u001b#Z\b!k\u0006R\u0013]\u0003'D\u001a~\u0002vy\u0003*\u0003\u0015\b婩&.W0#gGڅ2j<4)Gh/òRY\u001c\u0001cm݆]\u001d\u001eh44\u0011O#\u0010\"\u001aYePP\\u\u000e9rWɨUy}\u001c4t\u001e'[d\"kdlUidJ%#DN\u000b*\\\u000fd\tԿ\u0002EسA,$!=\u000eP\r<wGr6.G){RhʢaY\tT\u0012\u001b%Hű*oRa^d?\u0019**vt#\t\u000eihY#ԣY\u000b~}<`1%%m&\r$=$USQ2&sET\nR\u0014^\u0019Ҽ{\u00127;IƔ|\u000ffR(\u0000\u0018\"P\u00075Pų\nl3A4lQiM\u0019\u0019\n\u000b\u0012h6\u0005xVLk+yt+^\u0015oJf%b\u00022\u0000cfF{1u簆\u0002\tGc\u0003\br_ͳʤ¶c\u0013\u0019m\u0016\u0015fF\u0002c\u001boՍƸv\u0001\fD\u0001=\u0002d\f/û,\u0019Ӯa6h&5@{?M\u0003\u0019\u0007 &\u0015\u0014\u0003\u0003|nc\u0017 }1Gxa\u000e)r\u0018\u001cem\u00003\u000eh)m\u001bx7d!\u0018s_C}Y5:%\u001bUIE4O8؇9\\\u0017\u00100}1B_2yGQ>\u001c\u0007ˀ91B4B6Lֺ\"og4\u0000t@\u000bmM@\u0003m\u0001ݍ>T𚱮\u001cib\u00108d6\u0018cL\u001el\u0013l&\u0013\u0004qc|-0'3/\u001d<~w4\\|tzFaɪ{Y\u0003נ\u00196t-#Hb\u00033ı8V\u0012jXC\u001cc1dO\u0017T\n3\u001e\u0002\u001eoce}~z.hE75L\u0001\\=5-Ch,I5$s\u0001o%{sI\u001dF\u0012Mı817v0&;X\u0019TV\u0016f\u000fH3׆A\u0000!s\u0013++z\f))\"ö[/:@\u0017ndwt/\u000bıv?~\u0016ޗ}\u0015S)\nkyR{꣯s\"!\u0006Rt{^sk^n\u0007h\nƂz8K\u000e\u001b!Lt?I!\u0012q8\u001ef\u001ce\u001dep\u001f#Tx\u0018pl\u0001CN.a\u001d0UXR|\u001ce>oH\u001e\u0002])a0K$\u0019SgX'0ٟq%=y2ղ1@ۏk#VR+{ @^y3xޔ\u001a\u0003T'Y{.o\u001a\u000f?$\u000b%\u000eKE&\u0005<{ŋsgW\u001c \u001eml}y`}\u0014ò\u0012{ސ͚:Lm`VKs%O,\u0004~\u0006cc\u0003l:W \u0016{ś4썓dŧp\u0013\u0004O/yC\b/s\f/d\"o\u0017GG\u0016,~~ͤyIK\u001cLWW\u0018\u001f^/\u0004}\u0010_%Կ,jg\u0014'ހ\fUfy\u0007w\u0015?6\u001esZ)\n:\u000e2qӺ\u0003{Es\u000e\u0017x\u0002q~\u001d&̳gcۼ8m~v|\u0011;\u001d׉8i\u0012M鑶뵵)F\u0006=Cݠ$@c\u001a\u0010\u0006\u0012L\f\tILHC\u0002C􏩈C$PP}~{<$\u0004%<t~n+k\u0015|\u0011>\u001d\rݜ73\r0(_f\u0013\u0015ѯ=\u0018MgP^ <?QR$gHGHX\u0017x<\tr\u0003/0{\r>\u0007O߰y\u000bކ!\u000f\u0010$=~7V!Rd\fc\u0017se\te:#h$>+xyK+Dgt*sB?Lm*\fу_u]S\u001e25t,\u0013v#Wȑq\u0011?>\u00152S{R\u0017\u0018#a\u0012CdC\u0004/6k*<\t3\u0017\u0017ϋJ\\;-[Cw6Н@w\u001aY4\u0017:\u000f0\u000bGt7\u000f)T\u001f 2\u0013\u0013d\t\u0003V9\u000e\u001c-hm[=c0\u0017g\u0019!\u0003\u0005X=G\u001fG\fxl\u001c'[p<Sx<\u0019\u0012:Gϟ#~)|{6\u0004o\u001c\r'h\u0019Vt\u0013aE\u0016.U\u0007\u001fF\f&1KT0\u0019{l9O.:\u001eH\u0006\u0006:7Ŏv9V \u0005]7\u0006&Dn,\u0005n_G\u0018qɐ9ߏG5,N\u0012\t2ix\u001111v1vq|Xc\u001c3g9򎳥-s]yl.G;\bQgY\u0019\u0005lQ\u0000z\rt']Có\u0007YI\u0017Ƞ\u0017o\u001bp\u000bͳU=\u001cs\u000fp\u001fQZyֲQM:,6rc\u001c\u001de4ԁ\u00026ب76f~fHՈjx2{\u0005?]>3=Ѳ\u0004ЄqQϰǦ![[\u0006-&v؉c'\u001cvة`\u001f;\u0016fL$G\u0015S\\VY<:\u0010ށ(Na <e4\b[)3,y\u001d[Tu\u001au\u0004Uj--n[^%{\u001c*8ةsI91uVu]Ru]i׋RηR\u000fu\u001e\u001b'kc\u0012\u001a0}\u001f{/eMeånW%_EOP\u0005wTr.ux*ʶԕi\u0019U;w}GwIquUE}o{z?\n6`oRc\u0007%\u0018\fA\u001f=R]\t_L:M~O9_@Y_X\u0019_\\i#WQVWZ1c\u0004)l^Q|NA\u001b#__\u0014\fKq\b{sQrr\u0001\u0003P後/EuK\u000e!ARGdT(n&\u00153;\u00145K\u0004kj\r(\u001cl*\u0014ZT0tDfhEfgᦌk2Bo\u0017z?u\n\u001b\u00077K3A)<\u0004}Pᾄ/\fZ\u0016+\u0011r*\u0016*\u00125\u0014R8\u001cW(Q0ܥ`k֭\nD\u001f=$#zZcƮ%Uyߓ;&ܒ'rW\u0017{;i\u0015`Rʵ\f\u0005|.\u0003Z\u0014\u0014\u0015z\u0014\u001a2cA\u0005bQc2e\u0012u&o\u001b;K~yNʕ g\u00199_;\\ğdO1\u0017פ5j@\u001d*P<dy6-ĭ\n%2.>\u0019|ay\u0013jiȓ*ʝʕ\u001e3ݔ=$[愬ep\u001af(H\u0014i\u001f\u000ecc\u000e{SP2\u0014(:x$!(*n?/UK/w6$gGL\u001d*)r\fF%O9s*\fr\u0000g}-ckl<K\u001c\u0017JY\u0016_Ro(\u000ffg2r.tz,\u0018\u0017LYH.\u0006E\u001d_\u0006\"SDsVY( \u00149/wo\u0000K}\u000e>\u001b@%!4\u0012\nA\u0005hߌM-]N9K-uma\u0003*$M\u0005G+],lj\u001ej@iCePPo)C\u0016Н$\u000ePnN\u0007S\b!\u00076J@e\u0015\u001c4U6\u001a\u001b]?\u001bMS'hu>[w4qu:@zJʱ\u000f{-\u0010\u0007\u0007hAz<2Lrr\u001f®Y~\u0005ΚE~\u000e\u0001\u000eA\u000e!\u000eah66\u0006@A<\u001a0\u000fǀfq&m&А\f\u0003ឦ\t]\u0003`\u000bta/)q\fĮQ<Hr\u001c2ā?B;ꐶq3\u0017\u0013dh\u0017M5I<4ɉ\u001b\u001aI\tw&\u0018VB\u0019{\u0005ƛ!\u0007\b]\u0003a6)h\u000e8w7\u000e\u00056\u0005b,\fxe\u0001\u0013sn\u001aYݙw]w4Ս\u0014*a75I{\u001aS\u001au5@Q4\u0003L\u0016)t\u0010e?~,abr\u001f\u001ba0sq\b\u000fq8S\u001d$'\u0003}jN\u001c\u0018k\u0005\u0005)\u001ceA>aE{HYaNaV\u00036\u000b3]Qg\u00186{9d7l\u001b\u0010\u0012[\rPb\u000b\u0014F\n*\u0005e(P*SS\u0007\n\u0003\u0002J\u0006/Pʥj-2 ʴ:ڱj\u0001\u000b3Hm-ɞt;oel\u0014?V\u0018~YpYKbr5\u0018\u001a\u000bc̉ջc,N\b\u000fY{&Μ&38]p~ᣴX,k:g\u0019HL6}\u0003?ѯ\u000f'\u000f\tv\f?mI[-~x;g\u0003r!\u0016q68wsΕΒm\u0007\u001c\u0003QQ]·˨#\b\u001ers[  7c?}&{vdVĻH\"8sIKi\u001b&x\u0011A;.G\u0014d#\u000e#h^e~WN0?H\u001dH3\u0004(q\u0014e3~VpN\u001dEj'[ٜ;nG<\u0018$\u0001H9X<\rWU~H<^W^ef\\\u0001.\u0012\u000b\u0004e\u000euqDI\u0015N\u001dۿ\u000e^p᳹\u001fϏU\u00156K<`\u0011,D$+\u000e5>\u0001>\u0003\u001aɿJKb&\u0016>f-\u000b|\n\u0001\u001fOl\u0013.>IQAaM2z\u0013\u000b\u0002\u0006\u0001\u0019\u001a2z\u000eQ{\u0001u΢k~8\u0005\tp\u000b޿\u001b\u0002z\u000f]u\u0005\u001dq\u0005-\u000el$.%~\u0001u9Ge\u0011m\u0002~<GHOQ0'Hq\u0006oqt\u0011x\u000f=;xyWV\u0017w3v/!^D-<8~89:ΰzA4\n)w&>~|\u000f?D~bz\":'~BiUh\n^VXe]SNڟ&\u0016hq48Z\u0007j%v؝ǉ~>\u0006^\u0006\u001en.\u0006NC)u}v\u0001!~D_v\u0015<\u0015m\u0004v\\pǝ;v\u001ed`\u0004IЈ\"v;;\u0005eZu&v;\u0017#bl/\"Vc(p<\r4z\"%kЙcp\u0002_\u0005/;muiG:ў؊\u0000\u000b@\u001eENA{;\u0015ӱ;ar\u0001\u0011XeQÛ\u0013 r\u0004\u0015W+b f8\u001c\u0018S\u001e\fa\u000e@\u001a䩾\";=\u0019}\u001ell\u000e>B~\t*YoaT1v\u0010|\u0006*\u00138=ط\u0002{Lcz\\c\u0000Q\u0010\u0007\u0019lz+۱ݍ>l\u000f`o6\u001e\f\u0013;s:>GNU\rQuCt\u001c\b~\u001b1lEоkپ\u0016\u0010\u000bT\u0002\bc\u0004\t~\u001eo~\u0017;@V\u0006d\u001e\u0015jY\u0019dg:Y\u001cG-e:5c_\t;~\u0017σaWuMC,\u0006lr2ژ\u001fT\u000f2c\u0015^y;u£\u0011\u0012)TE\u000f\fG7Y.\u0016w\u0015mkUh9WJ4\u0004f<iS&\u0016Tr2ژJG\u001ah\u0015vMnYm' dv\u0012QnKt\\iUd\u0014~E&q\t\u001f6qݏr-e/`5\u001d\u00023\fznzWn\u000fAA\u0014\u0018\u001cI8p4Q^'t\u0002UR \u001fTx\u0013'y&@#5ThG<\u0005BVa֟Y\f\u0005:l\u0012\u0005<*jUTtGꊂ\n]9x\nLf\u001a]e\\suu2U`Ү\u001dt\u0011<x\u0003\u0011}Fu\u0005\u001ca\u0018\u001fVB\u0017/\u0016|)\u0018n5|j\n\u0004\u001bjE5&(̓N}J\u001a|T\t7+T,\u0019Y˲<e{X\u0002|xgqɠ\u0003xW\u0000M|(\u001b*\u0013+\u0013\n*\u001d\f+\u0015*\u0019T\u001fH*\u0011*\u001e((\u001elW,8EVp<%\u001aL\u0018c\"ƣ¡3UZE\r5\u0017\u0006xn}\u001ed#\u0013QΣ_H@pH1#,ˈL##3ܤ(B\u000e1\u0012T82\u001f,Q7P&\u0005뾭@ݓj#U#7\u0002/7\u00044I\u000fh\u0007E̻\u001ce@ҬQ*\u0016ˊ\u0006d\u0005\u0015\u0018pE\u0014\u0014@h\u0011t)d\u00154oW\\Zn\rYߒ:(uRn\u0015pE5\r-\b|9H.\u0006\n<7\u0001%a\u0015Lf@ufPa3$Ê(d\nZ\t\u0005b\rX>y$;B5ur%X|\u0013\f\tEΊ}ṗs&o/\u0004E̻,HK}ܥx#+iժ\u000eDb\u0001\u0019񠂉jO˓˝lSMG\u0014;l\u001aqf܆i\t\u000fI|HbxSGdQ\u000fh\u0007- ϻ\u0006|Iy\"QX+3S\u0014D\u0012~\u0019\n&\ry2\u00114Xr5\r9gϢ)\u001cK{\u000ecaq+X³Yφ$/\"\\Cedj\u0017(fs\u0006I>'ݲ=&=\u0000#U0?\u001b;ӼMv\u0003ū_nF5#\\\u0011O\u0005&~\u001bmXfl\u0003ؒ!\r|\u0005|e6\u000f;A+h9/)>O\u0014\u0003&d\\25\nr73D\u000b\fV:HJ\u0014W\txmǶAlcoC\u001c%K\"K+>|pN+=`\u0012hi\u0016y׀\u001f)\u0004\u0011ޅ~F5}faX5\tZZ\"\nnUƱ3h:\u0001Z+neJ;=HYB6B\bIH@P\u0013 !\u0001\u0001Ѻ/NT;նK2x:ɇ0p=!?}\u001af^LRpφ`\u0011@\u000eVr\u0002@G\u0010 A\u0018\u0002w\"0<\u0004A!\u0000\\Ŝ\u0007ԪX\u0007<7\u00101\u000b1\r'#\u0004hGw_C0\"\f\u000b5\u0000\u0017m ṫ`\u001c\u000b\"\u0004,B\"\u0014,BPGb\u0004P\f!\u0018BpS/ \u0010\u0002t\u000f\u00153\u0016Ϟߧ\"$\u001c\u0018/0\u0018`\r\u0017%\b\u0018:BrX\u0001\u0016a`\u0011F6;XAp\u0002\u0004ٕ\u0018Vb\\r\u0012>\u0001i\u0019:_PK\f\u0002-:\u0006G/Ґ9\u0017c+.q|\u000f\u0001h\"|X\u000b~5.5uб\u0011\u0007Fl\r0a\u001e\u001a\u0012|x=u\u0018\u001e04.zE4)\u0010x\tC$Hl-\u001c\u0014\ry\u0013ױ;'jn\u0017\r\u0015i\\\rW8tl\u0006-б\u001dk\u0003\u0007\u000e؎n\u000fA\u000bpNlEMlaY\u00136{ר`\nY;\u0005y\u001480\u001d\u0012_w97\u001b=Ecg\u001b@Ҁ\u0002=\u0011\t\u001dб\u0017\u0017\u0005\u0015\u0007\u0001\u0003QR$Ή\b\f{P\u00131j`\t<z\t\u0000aXB5n&s;\u001fJ\u001cM\u0001BD\u001bq\u001c~A\u0003v\u0014{%\u0016\u0011|\u0017{\u001c,wQ\u0011G\f\\:hEx5\u001e\u0003~<t;Vw]|()\f\u001241#<=J DQgP\u001c\u00106X\u0013\u001e@s\u0000\u0005#LtЧG?\u0012zj\u000ee*\u001a{\u0010\u0011;\r~\u001fv؝;O{(8C#\u001c\u0018\\\n\u0019\u0018\u0012Fس٨\r)S\u0002\"\u0018̌t\bNTf`#H\u0011800\u0011;Iw>\u000eB΃Vݕ\fYk`Õ(,7U\n\u001eU+\u0015'F\u0014|\u0019`\u001e\t\n ^EMB@n/+iQ'\u0019B/ paT/D;\u001aC\u0014!XB\"0cr>Q\u001b8\u001c8/l0݊\u0002M?xy\u000f~n0\u001a7|cǎ0q)SMs\u0006\u0004\u0006\u000f^(d^^2l/WYn_zWl۾ܵ{\"ވ־o\u001f|#G\u001b?\u0007>3L6\u0013ğ=w>1)B\u0019Y\"D-U5ڂ¢\u0012CiTSźƦffpvv]|nܼu}ŗ_o\u001f~O\u0006\u001aD\u001c\u000f%}y\u00041<\\'_ gK<b}\u0001\u0012ˉ_+\u0006\u0000\b'\u0004\u0012\u0004\u0001\tHBM`8@8\u0010\u0010A\u0004Aq\u0012,>\"0X\u0006\u001f8\u0012\bd\u0002$\rD\u00040Q\u0000P\u0001p)#`@L\u00136-F8\bn#mO\u0003@zH(=&c̾\u0005dݽ\u0007z\u0018~x\fF\u0013Eyy\r\u001a=\u0018\f\f%\u0014\u000b\u0012G\u0018\t\u0018\u0000X\u0000'\u0002$`\u0002(\u0002,K?\u0018W-=C\u001f\fo\"[\t;=\u0011Qo;p0ȱ\u00134Ï?!\u0014Idr\u0005\u000b-bXwAWM\u0017\u00051\t\t0\nz\u000e޻\u000f}\u000e_>x\u0015\u000fo\u001f=z;xɓO\u0018kMuDT__ba~Cٖ\u0012sJ:C\u001eR\u000bZ\tG#e&\\WfHKi\fh\u00180a@À\u0001\r\u0003\u001a\u00064\u0003\rw|kfdKeUh_ݯAųs\u000294HASe\t*g)AxӀ\tn_ToO*HSoTb.W]ޠZA\u0007\rР\u0006%4(ײ3\u0013n膆>nE$YL!`*_mԝ/QsР\u0006\r4y\u0015\"\u0015ySIfuaƹ\u001b\u0006gc,i0,5\u0001pCu~S9Ѡriȇ\u0006۝+]xWY\"Z:ӸdM3^Dv\u0011\r9\u00187V\u0015\u001f0N6\u0014CC\u00014N۝#>1tdBG*@C'ie$5hͥ\u0015o\u0018t\u001aРUrS!\\ʖrz$\u0012N\u0010:Ҡ#\u0005{脆\u000eƒn\u0007#Hi\tКʷ\u0019\u0007kJ\u001a\nA˱)sNy6K\"cwgI=q\u0001:\u0012E+6\u000b\u001a\bZg\nUo-/\u001f4\u0017C\u000e\u001aTРa;rV(Օ\u0001\u001dБu9'_4\u001cq\u000eb\u0011f՚\u000b*ʶ\u001b̅ڸ|5ǢT۳\u0015,8Ȅ#Eƾt^鎗{<6X\u0011jwУ-VZzQQYkF}QLV\u001bנ<VDɲ\t\u0015̎\u001c#Er&ٝg9]|\u0019ak۝%m\u000e[\r-\fjtgpZ\u0017נ԰e*5+ٖd2\nVG\u0010p\u001c\\9iϷ9[\u001c\u00032CeXְRUt6 Ne54̖t5Ӓb&I.ps6v.iXmq-NzX\u001eS^\u0019\u0018JYV\u0018wQcgh\u0017Y͉\u001aVKm\u0011 x*2\u001eG6A?^TRaX*+\u0014\u0017\u001f5j\u0005$\u001d!An\u0014h9|N\u0013'h\u0004\u001eG]ǰ.چr'=Uti.4'$\u0011l'Nb;ni\bP\u0000\rq[\f\u0003RN\f\u0004RJK9\u0000IӬ\u0010\"Oli{%Z6[mْ\u0017yKҙqL\u00128=\\8F\\\u0019\u001fwߐLTe$\u001e(!aS\u000bIc.4\f3l'u߻x=ن7ӚVTRLz\"\b_E>\bϋI\u000fh4X\u0012$&}49߻w\u0013?cW{YE˫}\u001f?\u001dQ\r\n˱lp\b\u0007WDL|rV\\`Ɖ\u001cм\u001dVmӰi4l\u001a6\r\u000fm\u001b{Pǆg0|ǐ0aV]\u0004ց灡F!ʺ[Kn۹l\u001b{\u0014\u0018`\u0015?\u0002)`\u000fo\u0018h@\u0016\u0012lǧ\"sf\u001d\\޼\u0010-RtɌ)\u0016Nm-në=\n5e'#1=0htH\u0015h#EAg\u001d\"F\tVhIbm\u00180;;6\f\u0002\u000f7`2>A\r:S\u001cvI\u0019\u0004Q\u0003ĢU]1W\fB%\rOXoL[n`\t`\u0003\u0006Q/c\u0002\u0006×\u0001\u0004hޫF'Jcs\u0014_\u000e+!\u0015DtU3(\u0010˗\u0016vjYy\u0001`x\u0017\u0018N\u0000\u0003+\u001e1\u001e-x[V\u001dJf\u0003\fAƻ\u001eC)\u001b,ȗfjkۭTkë\u001fK\u001d/ck$f\u0018L\u0016<zҢ3\u001aAAh%{E\"\u0013_(v}ÐnѡՑǀE{vX|!\u001e3\u00013Z\u0018Ѳ]X4A-jؒB/KC,_\u0012)%o2-o1\u000f\u0001ã\u0005{z\u001b\u0018c\u0011[O\u000fvˈNـ\b6VԔ*tAD@])Kz3c7\u001f\u001eZf\u0015\u001c۳{\u0019p~.\u001eqte<`7\"e\u001eUi9\u0006\r\u0005!8\u0013\\$Uijݱf\u0007V\u0013X\u0005ׯY!\u000fC}\u0014Oł\u001b)\t)\u001b\fZ\u000fU:hF\u001ax\u000fT\u00135Lͭ\\϶|Up?G\\\u0007=)\u0007D93}\u0005[WaP\u001fX\u0004:xEfq-6jɺ[5|=홯G޺ng\u0015T~N\u0004\u0003ɤѝڐ\u001el]=!5\u0003F\u0010Xx\u0006B\nǪhC˵};޼ka\u0015\u0003OF#\u0011\u0017}\u0001\u001a\u001bTYإA\u000b{\\\u0004,|\u001341e\u001c\u0013\u0014W؈XÎRϾ*m;BRq\u000b\u0013}Z鳌ٝ9bIl\u0006\u0015\u0004VȵB%\u00020\u000b2qȌO[uaDӵ7&(-k~\u0011\u0003iRNPF\n\u001cvhT@Ac<\nʓ6;B?\u0003[\"ۊTa[ddcW(i\t\u001d\fi}\u001fEUq%ݝ p\bPs\u001dvd\u0014c\bA\u0014>G\u0011z(6lj;^i<)7m}\u0016Uɰw>&t%4\u0014aS\u001c\u0017&H\u0006s\u0019ĉe!\u0007e;l[԰0ݸ/Wi<kQ\r%ߤ\u0006C\u001f\u0007\u0007X\u0017\u000b<pC#IF\u0019̍2\u001bc`7bTL8uxp{lh=W-\rrɓ\u0014w\u0002͉\u0010;\u00040\u0014@\"l?:ǢH\u0018./\u0003#3\u000f>oƮOW}/\u001d\u0011>{cI_ᜲks,p!m,g9@O\u0019v.Rg\u0018u6A$Ⱥ[\u000f5\u001eX=ښWǖͯs\u000flw\u0013rl$&\u0013\u0001\"\u0015\u0011\u0010;\u001a$\u0000&,aq\u001eJ'=ʲ[_vw\u0019MæaӰi7X?ښc˖\u00059_\f0tJddD'%x:,&rA>'>\\0EE\u001eh`NӽGWpkz^`x \u0006\u0005+\u0012W\u0002c\"R,\u0013\u001a\u0002Bq&<$Lci7_uA\u0019\u0017[=kV};\u0006Ǘ/\t\u0019\u0003b$fǢ*\t˱\\PW@i.wE\bfx΁Hmj\bi\u0006HW#-]\u001d\u000e`\u00050(̩\f\f\u0002IHL\u0017\u001f`\u0002\u001d\rHw\u0010EĴϙqrxsvB@E\u0013\u0010͌\u0006:yn8~\u000b^\u0003I3\u0010mfځ6M\u0002mҔK\u0019\fI\u0019J\fqCwI֣yGﻭѾobKl˖%[^ p(t4uU}\\?ɩ\u0007\u000ek3\u001a\u000eXb?<1{B1\r)\u001e\u0012ʠ)\u0018u\ne;\u0017\u00185+jK״4Œ^S5x{\u001cz\u001e~q_=a8\u0019\f\u001fie/\u000eŴxX\u0007j(Q@Ө\u0014ʨV\u0018f\u000e\u000b=[rSPԤtuEhx{\u001c~\f{\u000f/ͩ0/\u001e!=k[\u00058P&\u0017\u0012ڪY V\t$7\u001cyMRULM\u0019og\bn\u0018\u000e`##4n%ubD@tPf\u001d*haTIȚ^ʸ,oe>OUq\u000bx\f-\"8g\u0013\u001a3h.Pԗ\b\bMЬ]\u000bU,*WPW2M~K(\u0012d+\\\u0011+x{\u0018\u0010ڍ\u0019^o_\u001e=\u0019Ni\u0005o\u0011Yz\u0012!pg'ئb\u0006\nZ(e\u0002^\u0015ik\u001c\u0019{dEDUۆa}B{_k_ӜB3sޔJ(6y<d#d؞\u0019I\u000b.h5`U\u0002JUPW\n\n]_ft\u0007--\u000f}\u0014\f\u001fl?mhtƛ]\bk1m(@SV#8SZʂDC\"\u000b\tBj]*QTv?r?mc\u001f\u001coG#'=c3#\rF-DQ\u001bL\u000f\u000bu@Y\u0018\u001aBPQ\u00054\n\u0015-^uֽ/\u001f[\u000f|<\u001f7Ƒsp%\u0003'\u0003\u001eZf#,՚D\u0011\u0019ɳ\\S\u0010\u001d8\u000f2C:vDo\u0012s/{롽Kmx8dGR\u0016\u001b!k\u0018LBE\t\u001b)3T}@\u0002\u0006Zd`\u0006\u0016&7+ܞ}\u0013}}}TUK8=\u001b1%\rvBFc\u0003rQpX\u0002\u0002L\"\u0016\u0014l\u0006\u0019*\"D&\u0018[K76ٲm~~y5L\u001eu\u0004?\u0019=Z\t8\u0003\u0019\r0\u000bk\u0014\u0018cwy\bbd+@\"\u0005LCӝ]\u001bg^)5Ah\u0010]@\u0014Q28\u0014\u0001\u001d4N`\u0016Y\u0006e)68GQs$\u001b#⯜mh\\ltrB3lHaO\u0005$+aFT&\u0004.JRL,\tN(\u0005;1\tQ\u001c1\u001ev iҷ4ްin|b-dY\u0012~FN좃\u001da\u0007\u001c/\u0010a\u0018\u0005i.(\u0001\u0004I\nJM\u0002(-9\"I\u0012JO\u0011E|3٦J/\u001ci=#\u0018)}ȧ\u0016l\u000e\u001e1S\u0012\u0003#8N\b\u0019\u001d\u00000\u000fC\u0010\rQ=A\u0004DR.Z;[Oj;r\r`aR4B\u0019\u0014NuK\u000b}Ae\u0004A9N\\ˑ(,$\u000bfh\u0019\u0004w&}\u0007G\u001d'\u0018\u000f\u0006E\u0013_yعr\u0015Xꂯ,@.W\u0018\u0017\u0017\u0017Da\u0001ι99*l\t-qWG_hw퇎-?k׽ҏD.gF0\u001d\u0013Q\u0002I\u0011\u0012\u0018Y0\u000eL,\u0006I\\(\u001b\u000f\f)'ڼ[pjxڅ\u0019\u000ebmwu\u001fVe9A\u0017\u0011{@RB\u000b\u0005H,ʡ'LX\u0004!n.\u0000\b&⼏(+Aݤ{4\u00180\u0017Twm\u0018^Qw\u001c8RvW~_UvJ\u0015v\u001eoJB\n&dp$&#|$\u0015b32A:39\u0013>\n%<$iCPMAcqd<k[cݍ\u0019G\fۤYѧۗ\u0011\t9\u0014J6\u0016\"Y?1ᣱ&=\u0010\u00063.tET\u0004]J0L\u001b\t)<\u001bup}\u000b\u001b\u0006'/%\u001f\f\u0015hT\u000e'bj&HCg\u00160g\u0016\bdsX]sFaFG2MP`\u0006\u00143\u001enc8޿ ?)J._J\u001fȱ\u0012Np/\\ڔIAi9\u0007_S\u0011b$kdlSݳax\u00193`<_V夗]i5_Jov+À\r5\u001c\u0014R\b!ڃBҦn\u0012\u0002u\\\u0018#.@\u00103\u0010\u00133lp1%YKִ_[\u0016l6$4\u000b_1}Eo}O(E\u0014\b\u001a\"9_72NƘɞx%+,C\u001aT\u0015堶 \u0005#y{hX`{a4'ĝ7PeK(\"*$\u0015}\u001ex-B\nN\u001ehJ\u0016&.F%9*J`mA\fG*Z\u0006]\u0006i;8EU͡\u0014\u000fkt@\t{dKم)\u000b9k~aə\u001e(k\u000bB~gxl؂kN(?d'ii/i\nŴxX\u000bjxW\u0001:epC1u3D\u001br~ϜK6-(',e\u001eS$̻챡lo~lP\u0019u\u0017՝\u000fxXOu`\u001a.8YNJ\u0018db\u0017=\u00125P:)'4c\u001c]\u001e\u0019|kˆ\u001f\u001b\bE+؋\u001a1SK<l}FdХ\u000b\u00165<S 3r\u0019rETvp%9T:VL\u00051\u0016O;ZI5x\u0006Ǜ;ƭ=iNse<T0nkĴ\f\u000ftPJ%4%V@3\\\u0019\nKƾw0)Fz.\u0016*\t-ה\r\u001bk0&\u001dĢ]i\u0003g|78O섌\u0004\u000fШF\u000bK@\u0005Nq\u00144]\u0015iD%D\u0014qX-Tc굘wC\u0006w\t\u000eIq#\u0004\u000exqA\u0001+@[\u000bq5@&\u0011\u0015}\u0012T'j\u0004U\u0003jM05o}\rz\rw\u001bҤ\u0001\u000e[\u001d{4p vKX\u0002\u000eL@\u000bQ\u000eLBc\u0006\u0019j\u0014M8Y+\u001e#UJ\u0002Vak0\u001a\u001awVC*yCMhmgpjL\u001a줌\n,\u0001:5\u0002#,\u0003\u0019QPv\u0019?v\u0012\r=JKЊ5X5Uܟzx?\u00137c\u001eM\tRځJ[~\u0019\u0018`A\u0004\r&dH\u001f&\u001bY#$c0$\u0007U\u000f\"W;[e7u\u0017\u0016C+fspO뭍(\u0017rW;*q\u0000)\u001dtـ,\u0006V\u000f\u0005\u0007\u0016\u0000\u0019 X\u0015\u001fދ-]u?z˃z͑eu}4[u*/ օ%1=\u0002<'r\u001c`4;p\u0006#Y\u0018v\u001b;GuV\\bKV\u001d}~\u0019]t;\u0004QoV9EAb!@\r&X.(I/`\u0014r\"(डT'=Eq2Rd\u0007+Erp*Vͻ[}n*L/|'t{q\u000b\u001d݅-*\u000eZkb>\"mnf\u0005:p\u0000\b~0HA\u000e\u001f\\^0K\u000b\bÌ\u0010<h%\u0018\\|l|5Zس5\u00102\u0013\u001f\u0013\u0001CRj=wIM̶i\u00195M6(Ƌ(Ԍ\u0002\u000bIҔ-&h8VIlG\u0017,M\u0016%;%_<3m\u0017ɟ!\u001c\u0005J-\u0006΅&nc~\u0014/l\u0013E#\u0014aj!Prj\b\rd\f0+joU7\u0016*Öo6\u001c|$?6:x\u0016_\u0019󔺫K`L\u001b|b\u001c>*QJ \u001482Eg\u001e`*)=P\u00033\u0015؏6r[h/w`}o羣=\\[\u001fu᣻\u001anj:|Ͷ\u0007oZp7ȗ\u000e|ImK\u0010u\u0004:m\u0017lB%a50\u0015as5ޱ\u000fwDGI\u0006^{Ivx\\/\u000e$ٝ\u0004\u001bh\f\u0010c\u001dD,IFIdB#mZ47\"TՁ>m\u00193\u0019V?1Yi\u001e\u001aޯ-:B\u0016}Ky/e\u0005\u001cN(\u0011^,\u0006\nюd,A#$9Z6mt\u0018oJZmio=a\u0015qS5ݾ|OӂSa\u0005cO\u0005\u000f\u00150.v8hx\u0014'#TQ*LIHLʆt ޜY\u0017ޖ~0˪a\nаm=ć!A)# xB\u001f\u00151B\t\u001e3\u0012QFg2\u0002R!@\tR`,\u0017 \u0002\u0004}\u0017owYr6[iì+auc71'R\t9#lD\u0014\u0016\u000f\u001e}qNܱqZӝNUzuuk@zWEAAP I\\\u0005Bx $F$@Bȅp\u0011AEV\u0016Ժ9;m-ʶ?\u001e\u0001*\b9M\u000e8bɢv:jh\"(V\u001bV@ߠTe\bi4\u0012EJt\u0001Lp\u0007avwk}n\u000e䅜4~\u0014\u00111+=n*(N\u001dU\n<\u001aL\u0006;s\u0006YIN\u0010iBx\u00026\u0015\n_sZfFG\u0006ܰ\u001dZ)HB\u0014':\b!\u0014\u0018TU\u0003r_JD\u0006o\u0019t\u001f$\r\u0019\u0007H\u0013\\$\\\u0006V\u0015Q\"F\u001ba]|VaG\f^\u0003j\u001c2#(Q6\"*\u0012r*&!i\"$]0\fk\fA]0ݺ4!>DZр/rz[IV-9\u0005~\u001b\u0015`qL45\u0003z]ECmdULDD\u0014](Հ\u0005OICVt^DA$\"C\u0003\u000bV[+{$SL\u000f:Q\u000b1hG\t5M|CF^kʇZx3U\u0013AP\u0001\u001bi/\r\r\u0019n҄d\u001f\u0012i=\u0006ۊ~i+zd%C6\u0011\u001c@\u0006>k\\OX[\"d>Еq\u0001]\u0013iB6gx;iذ\u0001%\r\ngd9\t\u001e$*M\u001eM//ux\u0015U\u001ea\u0004kf\u0002R2ȕ\\o`*\u0007X(\u000b\u001a0,O\u0003ƤAq\u0013\u0019.<1*;\u000bO[T\u000e{j8lQ\f.\u00173&B\u0002a:A8/\u001b\u0014\t\u000eW=hS\r\u0018g\u00004IC΢\u0019\u0017\u001b/\u0004\u0003}ڐ:\u000f=k\u0019J]*\u001d\r*8l]\u0013Kh\u0013-nH6j\u001a\t&_\u0015ciS\r\u00183Ҁir`xaؚDy]\u000eMݧ\r1M&o\nZr-s.j)kjTA\u001c\u001aAd\u0018G\u0002O۸7`p\u001cHG\u0016\u0010ܤ\u0002M$Հ!\u0003\u0018o\u0000?f*w\u0014m2~\\?h2b۩\u000fz2l\u0005nʯK @1'\u001d\u001eTY\u0018Y0FG)2\u0010U\u0019h\u0001Ӳ4`^\u00012nK֬f{}Vm&pҁ-Zw\u0001Zܥ5UUz(ԦMjJ\u0012\f\u0005m\u00183Gr\bA\f\u0013\u0004A\u0013%h\u00014\f`Z\tЭ\u000fl\u001fVy1>g<X.t+L52\u0003\u0014hA)\u0006-\u0014h\u0001\u0016\u0018D\u0015{\u0010\u000fb8V#aUh%i2\u0003\u00044!_]+.\u0018\u001exkqn-1c|Fȏ\u0018`\u001d\nju~X\u000bG(ZF\u001dix\u0003X Z\u0015Eu\u0003i2`y/\u0013\u00187eZ{~dUbk\"UWYse]-\u001d\u001e\u00195 ?H\r0\r M\u000f((#DDYa<\tc0\u0006EP\u0001ۯ\u0003ez`]Q`%y$4)l\t\u000eVnb\u0004\u001d:36z\u0019&O3\u0014#dd\u0011\f\u0000\u000b`\f\r\u001acs_\u0001Ǣ|)p^g՟oM,w9ԛ$Ib\u0000\ti{e:'ɳ\u001c+e;`/L\u001f\u0011l\u001fŚ{1f/\u001ew.{ɒ}x}c뻬2\ndw\u001a6M\u0012f_=8=M4<d3\rYpn\u0015\tj\\\f[ebۯ8\n'?nulֻh?Do.̴.V{\u0019df]%{j\u001b\t\u001eâ'\u000f^@\b-Uquj\u0018'\f\u0011/\u0007\u0000\u0014).ѕ}LU:S7}k#pr\u0012djz^.\"*\b`Nn\u0015R+n0.J*\u0017UqG1\u0011|]\b0?Lm8;\u00047I0\u0005y\tNc\rϋEƫ+\u0017}\fV~\u0001\u001bR}sߟXr+\u0005ߖVS9+;S_c\t''\"OQȹic\f$jѾWCj-\u0004Kr[\u001dx#\u001a=Pác\u001c?8lޣ\u000fK±\u0007%G\u001fT]<=CH\u0007A\u0007eVT+^\u0013˹`;Tv=\u001el\\\u0005>~\t|y\u0011؟\u0007~uG<w\u000f\u001dxzيSgM\u0007\u0000'9tL&)A@\nmBS )`B\u0002\u0001mh!1\u0016RcӒeYu߷dIֹz%!v]iu \u0019\u0003pd0!L̐$̯ۚ>? \u000fӷm\u001cH\u001cozޯ\u0005'|%:WS\r8#^\u001887Ѐ\u001b`SӏT\u0018\u000f]\u0003\u0015=\u001br{L&\u0012u\u0014\u0012~C*gN{i\u0018%8\fdp?3 \u0014\u000fx\u0006\u000f\u001f\f\u0019\\ah\u0015e\u001deh\f\u0007jOy`~RM\u0015\u0002OU!KrUh\u0005>\u0017Du38ǉ,\u000fJ\u00190\u0011pz\u0004T\u001b~\u0018ޡ\u0001{&`jm\u001dյk˦t˸(\u0007\"R(HɼX&\u0004QoAq\u001dq\u001c˓2\u0003,\u001dah6EeX=\u00017eN\u0019ަ\f;6\u00013e0uOɧ4]jn\u0016H\"QRĀv\u0014\u0017\u001a\u001cߌ帶la,/1 \u001cG\u0014#\u0019\u001ca\u0004\u0019ܔ>ehi3~1k<ʞ1tȧiPQ\u001f'5D^L\u0013RM\u0006\u0017l)l8q\u0012(˛G\u0019|\f0#x\u0015\u0013eX\u0000+)z\u001a\u0018\f9Ys\u001b{xJ1?o\u0018\u001f'ud^H2\u0015\u0013k<k>q\u00162,\u001f9ʄq00|\u0015\u0003hah\u001de>o\u001c옵\u001efϘ+&\u001f;jpQǋ\u0017$\n%\u001dh>鵐if\u0005qfb5\\\u0011É\u0006ߊys&``1k\u0003{ڦ4vTᢁ\u001d/\u0018AɩYL\"2B\u001d5=+\tv:̂*\u0010;\\q`r\u0007!=\\=\u0001\r\u0017\u0001ycʚq\u001cOZO:ᢉ\u0011/),du\u001cP\u0014bM97Fz\\W\u0011j\u0013z{Be7\u0017&\u0007H΋\t(\run̬uyP>8Z?\u000e\u0017]'[E(fjY1)QU\u0002\u0018oh\"^\u001b\u0005jN^l^$oGs4o-\u0002Ҁ28>u9Ƚyhlu^sKO\u0005\u00073;\u0004(j\u0015zIyD.\u001f\b\rAs\\\u00035K\u001fT1E\u0000\u001b\u0004\u00117\u0000\u0006w>u>\u00013\u001emu\f*].NQ!i\u0011WcZDX\u0014\r޲\b=7B^\bUtpQ+\u001a.hD\u00112\u0004-\u0002hM\u0019;[l'Apd:d;\u001c,{OH\u0004gpj]<5jT:hC\u0013jJ\n]QI%d@\r[\u001a[ߎA;.}\u000e\u0010߆w[|p\u001bRB\\G;\u0018\u0007A-٤\u0016\u001d}SKUT\u0011*K0)!D=\u0000e\bR\u0006oh`2xo.cxk{wt\u0013#;]ds=\u0002c?b\u0011v>\b\tk6`B\u0014\u0012:E\u000eM{M\u000fDZ\"VE\nӼgw\u001bo2oM{\rireӇ\u001fŢ#3PS\u0018\n\t\u0018}\u0012fj;8wym>3tE`\buÅz\u0002A\u0000Q\u001a\u001aln\u0000wG6\u001e{x\u0017ϫkE7]HH ~\u0001\u001b\u00045_8ɯs뜀g\u0013q\u0007+<kkz\u0002\u0012ʰ2I\u0003ކ\u0006\u0010ڰ\u0017\rꚮO'6ǈ!D\u0015D\u001dQ.aB\u00042, Q\u00171&d1B*\u000fUPz\u0002\u0016/\u0016i\u0001D~?>>~?>].Lm\u0006`=a\u001dcܜ>\"ˑ~R\bJai\u0013VUXaS\u0001\u000f/%(\\bxa@\u000b@Յ e n\u0003H\\tzK?Y)ƶX\u0007\u000b\u0007f#fHvuq\u001eҨ\u0010Fą^DJ\f+a]XH:$\u0010?y\u0011\u001e.\u0013\bd\u0001_Y\b«\u001bѶ</\u001f\"|gvtȣLeU'\u0004\u0010돉sF\u0015\u0004;3\u0006\u0011\u0012\u000b\u0018\u0013\u0004\u0002@^~\u0011\f\\\u0006R|Q{i\u0007K|\r;ywpQ~\u0017zD74 (/\u001f\tvj HRtwB;ڕ0^LG;t=\u0017@\u0017A\u0013rɊəūK\u001a~\u00065\u0001\u001c\u001d\u001dl;ζЙtwfevuV@\u0005D@\u000e\u00019\\\"\u0004\u0002\bIH\"$!\t\"\tI\b\u0010\u0012r\u001b\b\u001b\u0004Tģ]ԭ.㮀:}\u001b^E_|^<<~$go\u001aX7XMsSR8JI\u001aj\b\u0001\u0016'C=\u0003\f\u0003r[k1^\t\u0017}bcO7_my~{`aaGO?d8V9Г×;-%Pȷr\u0018\u001b\u001c|%jMk\fV\"H+&Im\u0013Tyxd,\u001ec\u0017T\n1*S\u0017]\u001bS\u0002wB?6o?\u0006>Oo~~ZJ^]r\u0011\u0019rj[E\u001cۛ\u0004\u0016b.A\\Ԓwͽ\u000bxYbN\u001d8ww`{-\u000fCp\b\u001cl\u0006InF'LǬ/F>-/\u0001,zTB^\u001a\u001d\u001aO\u001c>{.\u0001V~\u00131\u001evtnYHI׽{B\u0002c{C:\f\u0002\u0007>gώP:\u0010}\u0006$%_z^US~nˢ\u0017e\u0015\u0019Ϫq%kҔ\u001fIe?R˒6^L|,Oxri'\f\tޥ^y/\u0014\u0002\t>9\u0000\u000e}\u0003Ǿ\u0002+\u0005\b\u0012\u000322AnB:@$dP\u0006\u001aɈğ?Ǐ۠d~u9;\u00153'ܝd\u001b}/Ds;d\u0017\u0004~\u0001>O\u0006\u0007\u000f`?T.\u0006\u0011\u0017@WY4v,\u0019dG$xPt2\u000e\\\u000511\u0000\u0015\u001b\rЧO\u0002|\t@<\u0013\u0005(1>\u00020\u0013\u0003nN\u0002\\x?\b?\u0007G\u0000\u0017\u0011\t\u0011)e\u0005\u0018UMuƥ\u0006\u00066\u0003-\u0010\u0004k8b\u000e#S͢\u0015\u001av\u001a횮馐J~Ү*\u0007\u0001`wo\u001f2`\u0003i(`!\u0002\u001b8\u0005)\u001b\u0012:\u0011\u0013W@K\u0016\u001bD|Ъj){g\u00023W\u001bzǫqdq\f1>\u0018,\rA\u0004\u001b\u0011\u0005y\u001b-\"8\u000fYhf\u0012NS\u0006%o_%B)X7o\u0019Ƕ;L\u001ay\u0004eT;-\u001a\u0003\r\u001e\u0010\u0005DA\f\u001b \r\r\u001ep[ZT\tͷ4z\u0013S>KkL7\bt\u0013Da 3fY`l^{j\u001f{~8\u000b&x@\b\u001b\f\u0000?=\n\bR7\u0004\u0017\nEUne2\u0007^dQDLr9I[M#D%@P؆~?VN\u001d\u000e8\u000bo\u0007\r@A\u0002\u001b$o\r@\u001a\u0005\r(pM@/6,qkً\u001cxդfu㍼\u0011*d\t%vk\\Cn\u0010\\\u0018ӂ9X\u0007g\u000f\u0016h\r?\u0002)l\u0010ń\u0003(9\nR7Dk\u0017PPq\u0012Kf9T$Y?\u0005.\u000b\u0014c(w\r5A3x\u001c\u0018ی{6\u001egsv` ;\u001fl\u0014lH\u0011klԪa\t*,ђY.I38aO\u0015\u0006r\u0000791f\u0019k\u001ap\u0016\u000eoui6\b\u0016\u0010\u0006ٶ0 \u000e\u0007( KJlK-Xo;_*%/K8\u000bP*cK3\\iaY<\u0010\rr\u000f|^|ǐ\u001bk\u001c2L=>_\u0017U\u0004SI;\u0005İ\r6m\u001bN\u0003H OHT$\u0015+U=Td\u0010웒rl+Z3! \u001b\u00186?9(zI!73`\u0019\u0002zѯ\u001bP\u0013^e-'ڜ2\u0011\u0006a@\u0002\u001bd#LҖ*1:\u0019HFמӼ(/\u0012J\t\u0011pEHy,\u001bpWt:;7\r\u0011^)\u0016m.\u0011\b\u00163ȷ\r'\u0004\b=Zs&6qg\n6q[\u000fͷOG$$_py\u001c\"!hgT6! !\u0006E\rf_+\u0011Rl.\u0001\b[bu\u0018\u0006ũ@\u001336.\u0007}\"~'>]W6\u001cSL\n\r1\u0003f񌒢\u0013Su\u0013\u0010<*\u0002qOh\u0016\u000ffuqi6gAm8%h?w=\u0000Oe4Ĕ=1a$P[k\u0012匭sH_g7)hv!oFVϷ0&9\u00116g\u0006tdul`5(\r_\u0001YT8PG\u001e\u0003]\u0010s߉5{4;~elH&{aL0Ejm\u0016<,P2|s\u001fszl e1-\u001e\u0006\n\u0016?N٭\u0013<T3TTNؔfWZi[y噡rx ((\bxJ !x$)ef55M>s\u0003׏oP\u0018ʝ~\u0006\u0011w8\tJ\u0007W\u001d14Gu'C0\u0010VЮ#ԫ\u0013%JFWV]\u0000R-fE`%la\u0017*2\n\u001d&\r7Ym((C\fU5XB~dg\u0007r[7h~\u000b}\u0014hč87w*A?\u000e:Lڞ\u001264\u0006^or]҆\u001eXѝ&jL/RiYvCA\u001f\u0006)T\u0004u6Ae}\n{4\u00188=?pk\u0012bPVg(3\u0002]BGiK{hnzicgXeT\u001aCP\tT!\u0006١} փN\u001ft[\u001a>59w#;vމ)/\u001d\b)+F\f\u0005$ev+Ӥ(󻒔.R\u0015PtSj\u0015]Τ\neGrJc(D\f5f&P}\u0014j-~&sw\u001dl\u001d&n.Yh)\u001cYQtв\u001eE~\u0007Nkbr[iWr\u0016a;=VCjRic.TڄjP E\f&P)4\u00036_.K{OkV\u000eW<>D:Ewa>r\u0015:lHd(\u0013qm6\u0015r[uKT[\u0015|ks+AutpP\u0018.0\u0001Vhaf'\r,լR:\u0010!]: sep1\"@L)FK%t\u0015ەY\u001fݑ@\u0010\t29\u001c!kZ\u001b\u0006\u0003\u0019b\u0018.zۖ7\u000f.nޭY[\"B>ߝ1cEGC\t\u0001z)?\"\u0006WWc{\u00055\u0011:\fDUՄ/\u001a\njDA?iW7l\u001cZ7ʷ\u0014;[\u0010%NJ\u000fd&Dr'IY\\hR\u000160r-ʺ\u00106W\u001c\u0017C`}UI$P,1\u0014oDAÖ/V:\u001b\u000feņ-`,\u0003oY/ݱ)|!\t1\u000fiTܽشD\u0014ιt^\u001473h\u001d0!-\u001b/\u001d]6\u0018(֣5~c#턉ӗR05\u0017nl:C\u0011Ly!\fa1Q_sOq!)%\u001a5\u0011#03g!0̃T2^6\u001b:ע4C_\u0018XW\tL\u001f:\rip=\u000e<U_\u000fA\u0001ޝ\u000f\u000e\u001d\u001b\u001a[TX+jJrK&\u0016x?<pjxrY\u001c\nF֠uF51xn]!L03cy\u00128Z\u0011,v\u000e\u0003cAp\u001fB\u0003\u001e^Gu\u001abϜ\u0004>\u0018'>\u001fsCa@Ci4kP\rz#T=\u0000\u001bsaTؽ\u0002;`\u0007\u0003f\u0007\u001eVg\u0006\r\u0001 ;`\u001c\u0000x\u001cN@vvG!\tR\\\u001d!\u0003p\u0003\u001d\u0014\u0019JCPy8Otغ.\u0006̾߄?m?\u0003.N8Bp\u0013D\u001ct\u0000=~8+[Z\u001f\u0006!\u001bH\u0006\u0015\u000f\u0002\u0002[C\u0001k#`X\u000b\u0019\u0005\u00190- -\t\"<A\n|GF1<SJ^R0!Y@*'Ve\u0013.a\u0015\u0005\u0011\nf»\u00043a\u0005C\u001f\u00066b@\f\u001cF\fL\u000erp\u000f`E\u0005eR+)1h\u001c\"0Alq<T;K?C\u0017L\u0014ES\u0016TZ8\u0015q]4\u00151(\u001a\u0012\rn\too>\u0017dl2\u0002.b\"\f>c\t@gaЫ\\BXK&=ה%\u001a?}*_Ŗ͐iŢIbh\u0012X<\" JFA0(&~> \u0006C\f\u001ce\t\u0001\u000fCfpc/شLVbJ\u0016\u0001-?k.A7\u0013_\"\u0014NDˊǣ%cƒ1;;AͲ^bYgT\u00182\u0011C\u0016b!,OK=\fyЫ7D\u0013vZC&3O&\u0015\u0015L%H\u0013q\u00151\u000e|4JYqZy-\u0013>i':OJ|C>\u000b1d#LĐ\u00043\bѫorٔT\u0002ÛcM'\u0017\u0016M$cؚ\u0011r]0IU=\u001cuf# ȮZT!΢<0ZOsjӞqkuQ\u000fj-\"e\u0011\u0001A`\b\t\u0004@XB\u0002$d%!@V\bI %$lj@AA\u0006\u000bV\u001dG;ߙuzݼ</W-D\r4P\u000b\u0006Ƒ-\u000b\u0013a\u001fXkSҞdh\u0015[djZ\r\"Ox \u001aɤ+\u00073\r-\u0003:\u0014\u0015]VlW1UV[\u0005TP\u001aQ\u0003-h%B\u00007<\u0000xG?p_1g0\u000f;U$x\u00059ZB_/4\r\t9ҖXJQr]N\u0005l8xZw\u0014N\u001ă\u001aP\u001d\u0012!?\u0007\u0004\u0011G@\u0010\u0013ﺄԧ)f\u0016\u000e=:N+eyʫ\u0004?X|AUDُSVM'Ρ8ZC\"84\u000e<&n\u001a@G\r}+/ԇ솆Ph:F\u0018L-ʡI,\u000f~!\u001d(k˓_i\u0010\u0005o3hrm\u0006e\u001ebh&\"zi]'wh.t{\u000bP\u0003\u001d50P\u0003s\n\u0010\u0004o\u0014\u001a\u0002𘷢ϛNb\u001f\n\u000beRYD^Z?D^).u\u0017Z\u0013B5y\u0016h5K/X\u000b6Cc\u0001\u0017\u0016u\u000ewC-j`]\u000eA@\u0014=H\u000e\u001d\u0002w\bKYL#IbdSjOl?9\u001a-\u0010\u0019;r6M֜o\u000b,Bf\u0017!:\u0012:o\u000bX\u000e\r{7$p\u0017ȃ\u000fpZ\u0012QOZ\b\u000f\u0014Iwd\u00194Oc\u001e\n,մ\u0002s{.`p4\u0016\u0010\u0001b+6#\u00041K\u0010=Į\u0016ԠZD\r=ˠi\u0006\u0005\u0004E~P\u001f\b\u001e\u001a?\rOyN\u001a\u00129Wz\u0019\u0014\u0016JLJ{+m\u0011:%:'lJVf\\[j32Jm\u0006F)\f`\u0006\u0016j\u0010/\u0005zhٽ\u0003\u0001\r:p(XҔxD\u0007\u0006;lN/UgRX'72\u0019\u0016vusUU\u001a\u001cU&[\u0015bXMU\u00156cU\u0005b@{ų\u001a\u0001w@\u000f4\u00034r +,vRLS}b>٦$DbR\u001bfw9\u001aWiQ^cUT-\u0015U\u00163f5URmJ*\u00160P\u0003\u000b5ṗƝK@\u001fޱ\u0015\fC\u0002?\n\u000e\u000b;61|3$-!x\u0002\u0015UF1\u0015x&(\u0018bJfX,tf(FނOg\u0000\u001b5p}o1(\u0006f<?\u0004znFE_\u001eO1ʮ\u001a!\u0015\u0018ѿLWV\u0004+GOd#͖\u0002\\Ȳ\u0019j\u0011=ay\u000b\u001axAu\u0011|Wqˆm[w\u0013wvHDdk46U;t*_ܗBcd˜\u0004Y.Bn;ge\u0019R\nsjlV\u0013^h3\u0011\u0003ks\u001cZo\u0001\u000b5p\u0017\u0002\u0017 wl\\\u001eٰ٥\\빽{Ǖ;\u001anEGu?&S\u0019>|Sv/%V})$;͚F.MeםuE\u000emvC\u0006'h\u0016QCݢYаsh]\u0015\u0018,^trx77n97Lw@,Dd\u0001u,B\u001d \b%\u0017k{\u0015=\u000eeե:uS.uܥʐt*\u0005\u001c\u0014\u0006ڿB۷/\u00057&V,tOmx}\b \fo*<^DAxbyލ\u001a0>P,8OkĸDT6.HO:{\u001e9F#OV{\u000fxA\u001aW~\u0002%=3ϭ/?ulmWۂ%/=\u000fJ=:U|?HdeP2<EL\u0010pY\u0017?\u001dh\u0015\u0018\u000f\u00051\u0017\u001d}\r־Fo/>дp\u0016\u0017y7g3w{j<Umv?6\u001dTX\u0006q*6\u0007;ϸAJS\u0019+$<\u001bu\u0011\t#j6r\u001c\u0019`D\u000e\f3,op\u000fH\u0017\u0004\u001eOm\\ekİ~'\u0007\u000e  \u0017gg=`O?H'\u0011O޽P\u0010{\\\u00143A+E%,a\\^~l\\f/\u000f\u001bZvllk \u0007\u0018sip9*XU\u0013,_Æ۩#\u0018\u0010߇EcDǧM'%HNIx\u0016+\\̣$l/\u0015ptl%\u001c17~K^}\r1dN<<yk g:ӧwG3/?\b_͂UVV\u0012Y\u0010\u0016\nQ:j8\u001e@ϙΔZtV[p\n\nJ\u001a,ʒ,$@\u0016D\u0010L\u0002\u0001\u0002$\u0010 QU\"{A(\" \"Z3ynt;b7i\\B+11쥂txNE%\u001a!fZs\u001b=ycȑv\u001bi@~Zj^\b\u000e֬̆M\u001b$k\u000b\u0017ە\u0002A>d8⇃ȀX\r\u0006<&\u0002(G\u0014dl1?\u001a\u0002Ƞ\u000fʨ1\u0007\u00173\u001c?\u001c\u00163vjjqBn8J:j`G'`21|\r;7`&\u0002oPh\b\u001d\u00011G a\u001f\u0006\u0012}C \t\u001d\b)ȁe\u001d\u0007\u001fd\u001cD#O/6\u0007\u0014\rP{]䈪F\f(\u001a䠀Kc\u0006.#K<x\u0006\u0010z\b0\u001bC |s\u0000l~wG\u0003y~4\u0007;@k\u0017dy\u0004n\u000f#\u0019֊B\u0015B匣P2\u0003\u000b>qgKhpu\u001e?ŀ׊@ؿ\u0000\u001ctAC}\u0010\u001b\"c_zAW;\u0013(\u001bv@ہ;\\B\u0016Pn\f\f:\u0001w#-\u0001y\u0005a~\u0003\t\u0005C\u001a'\u0002\u0018\u0005z6\rUC\u0014_\n\u000bB\r9t\f;{p?\u001d*\u0011N\u0016N\u0013&\tn\u001e\nn\u0012lw\u0006\u000bp\u0001?\u0003\u00048_QC<\nLq;FVk)+>eRƜ%Y8ωgz4Q0k\u0012Ma\u0012?M47q1콌!}\rXu;\u0001\u000f1p\u0010C:b`\u0002!7\u0010Ey\u0018\u0006!%\u0014x\u001fL\u0005i\u0017RK3\u00143oT-\"֋\u0012\u001a2$+Ill2_\u0000;$'I\u0018$ʻ\u0007厐\u0018\u0018\u00187Fz,\u001e\r\u0012\u0012\u0006\u000f\\\u001e\rGN-M\"Eǚ\u001bT`R%~BL&6\u001e\u0013.dN(&p\u001dG\u0001\b~H988l'\r+\u0004\u000e]\u0004mE\fP7Ȍ\u0004E\u001c\u001a2\u0018&G\u0017rpI/9i\u001aγ\"Szx2*}L|DjP'^81Nh~ʾ}8K\u001a ii\u0013\b\u0011\u0003\u001f1\b\u0010\u0003U \u000fvp\u000f9l\u0002\u0006\u0014\u0005\t\u0013Z$N0gy4x2L6AT'f=$7< \u001aKl\u001d#&\u000e\u0007s)'\r/S\u0007՗\u0004\u001c@\tA\nN\u0004*\u00031hb \u0012d|\u000bQ&\u0019O%xΗL(Ɠ+\u001fjU)\rQS4w75}\u0001M{Ҁ6D\u001f6%\u000fh'\u000fh\u0016\u000bĈA\u0018DA\u0015\fp\u0005\u001d\u0005m|(\"F-lT\u0016e\u000b'Z88kaVmF\u001awI\u0005I7\ni~~~}\u0003FY;A2\u0007\u0010\tΠq@P\u0018\u001fB \u001f\u0017^Wf\u0002ΔT!\u0010\u0015\u000f\u000bsF\u0014.\u0007\u001dJsѯ\u000ezJr\u0002Иk8W\\+e^_4 \u00061b ,o\u0017\u001d\u001aB!\u0007\fAP\u0014w}A\"NUqSJxBrR9\u001da\u001bC۴s%Ime]+nnYfSV))\u001a\u0016\u000b!c\u0013H\u0011ɽ_o\u0003\u0004C\u0019\u001b\u0001P\u0016\u0013\u000e%\u000bI/\f֔J zP*5aniԚ>Z*|a98fkz.7q{ʹ=\u0005O\u001d@\u0018dA\u000b(F\u0007\u00160\u0007\u0001aD\u001eY0\u001eH \u0014R'u\u001cJP\n\u000b;-ִ\u0015WSXmzNf+\u001d2~D]n\u0010t\u001b\u0017\u000f\u00141\u0011k%~\u0005fo2\u000b0~P\u0015y]\u0015\u0013܊?K\n\u001eՉLMeQkj\\rU[k\u0005תKmVHaыLzqWb\u001c1\u0010CO@s0\n&\u0010߷uasQO\u001eԑLe-Zy\u001cUqR+\nYg\u0012ԕ[j2ZkkU6NQt.bA&b#\u0006Vg\u001cL{BP\u0003\u0004z7\u001cCF\u000e7}V3GvHwVeU+mŲ.5[4my6kR-4UN\u0019<We\u001aqhw\u0007wϝ\u000f}򯈀+\u001fN\u0000LRbЦ\u001c)skк8r͘a\u00183$gR\"\fFB0MUD)M*W˦ҡ\u0003=?0\u001f^??ߞ\t8&6\u001c\u0012U}|kY\u001c jNve~fI-[4\r\u000b}u\u001a^6$䥉+P\u0002I UA\nR\u0006\u00019(1\u0006BN7׆\u0016K/vou\u001bQ{87\u001a#\u0012Ng&\u0016\u0015eTd\u0015֦T7&t6%e6$gեdפf\fRyC4\u0002%\u0004ІT!KO\u000eJѿ\u00175h:.qƳ#^؉a`o \u0015t=\\Eˢ\u0005\u000bIW㊅\r1ŷ\u001ac\u000b&W\u001eJ\u000fU\u0014\u000b\u001fHG\u001bІ7X\u0011jMv@o\u001f\\ԙ\u001fsy(`;0Q\u0013\\~S\\~r]Ji(*J(\r\u0013V\u0017!諍.9U0 \u001b\u00124\\\u0019Q,x\\\u00126\\MPi\u0015\u001a\rPSϯF,~î)\u0017Ӂ\to[#d^ΙK\u0011ii7Oĵ%\u0015Gd\u000b˪m\"Vàp*lH\u0018U2\\\u0019](\u0016+;_\"n\u0002.P-\u000b\u0003ТKWX_iz\u0012hV_F\u001cZ\u001e\u0012+ǨbV\fo ,)7&D.~\tҲ唎{kb\u0001F,\bW\u001eZv,Ո\u0012ɀ6d\rW6@ݾMЮ)a`cmYms͸;<'z<\u0004'\u0018IǌL\u000bE\u0017s\u0003ĥ\u0005~$Bђ\u0012fX\tG8V̩\u0018+\u00042HA:\u0010hk{dv̍+I?U\u001d\\4P|eۺ`o.z+'?C'~\u0016|*l*\u001cc215`#Me\u0011f\u0013&>#rH\u0013|jx>A2\r91PRo<݂\u0019x.NW\u0012@Ʋ5΅ʃ\u000fvz!0$l\u0015Ŝ\rKHH\"N\u0017_Ԥy=Hzg\u001a\u001404Ay,Ey\u0004٬,G\u0016\u0019} \"}bg}OXe\u001beK'!vD\t_0Yǩo\"ȋąs^kJ86׍z99`t2~@2ȓCB\u001eyvK\u0006߿\u0001靐E?)ԯ&X׺5\\L^sv:\u0019F\"\u0007\u0006e\u0007d\u0011?\tƿK\t\\⇻)t{]ue5yn4nq2ueI\u000b1@&d\ttGeɍRR؞\u0007\u0006Z\u0019`n\u0004vb\u0017\u000e, S!\u0010O\"\nHu\rrK}*e:.װ~vxcOѥ\u0005$Z\u0012\"o\u0018\u001dieL\u001a\u0011Mo\u0002ʲ@[\u000bF{\u0012^\fؙ\u0002Μ\u0001\u0014\u0005\u0013\u001e.\u0010z\u0018D{@\u0013\u0010\u001c,D۵rZ\r?\u001e8rD\u0013\b݁A\rb\u0018fL6lL\u0003\u001d\u00040V;\u0001f`Kdp3%\u0000\u001e\td\u000b7\fl+G\bq@#[8ko\rG-x\u0004\n,\u001c=j]\u000b\u0016bO\u001b\br\u000eT!H4dT2\u0005-pSbj\u0000'tC\u0017\u0007>\u0007\u001c\u001d\u0004\u0019Z\u0003\u0012MISs?Ç \u000bk\nL\u0018D\u0016Fr\b$j@\u000f#H$C\u0004!\u0012\u0014ױAU&\u001046\u0011Aw'(vGU\u0003Nkp+o\u000f\u0016\u00025\u000e\u0001S\u0014B!J\u0010b\u001eD\u001d}ӃP\u001f*CD}q\u0004IE3 aQ\u0006\u0018\u0012\u0001*qG\u001et7Z#`&g\u0006V[\u000eV\u0013pV0\u0002wE\u0003\u000fJz@٦\u000b\f}\u0010}/DІ\u001d.ݐ\u001br%`U\f0j(\u00036\npU\u0003\u000ea/\u0004S\f1\u0007f-u\u0007%o/&\u0002\u000f|E@j R|iA\u0001\n~9_y\u0007\"\r-c>Czϐ\u0004BT0B\u001bh\u00062@E\u001bjp\u001c\u0017B\u0003 e\u0001(;`u\u0006z\u0007P/\u0012R\u000be@SWI-A+vw>\u0003o\u0007/\u0017e<{g@|˚]b={ǖ\u0004\rlMi\b2\u00004k\u0005\bp/\u001d70\u0005D\u0003'\u0015^\u0010'\u0002\fRʚBka~mg}#|%\u000e\u0006#3a&ϰ&5\u0007==-:+ZQԣuTD+ʅuBf\b!\fH\u0002\u0019,'$!\bҠ(\"e\u0005(U\u001c(\u0012Lx@e(λO}\u0017\u0017s7i /l\u0015>BG<sg\u0003\u00115Ġ\u0006f\u000fm\u0004>/`X/Ш[\rD\u0001Մ\u0002.3#6'=0]\t3ĉjқ:kc\u000fi!i\u000f{J\u0018F\u000eӚ0#N\u0003I@Z\n݀\u0001\u0005xr 9{\"=\u0004qH{\\v[l\u0001a\u0002SBz\u001dYF\u0019\u000f\nH\u0015z1\u0016|\u0016\u001c\b\u001b`D>e1̦X\u0001\r5Q\u0003\u00015P7y\u00007\u0013@\u0014\u0016\u0018?H\u000b@O<\f\u000fqzܻ,\u001b\\>5F})b_d\b\u001e\r<\ty\u0019`ۣpnapE?\u0007tݦ,p8\u0001\u00029 ٹ\u0004\u000e\u0005i\u001f$\u0001\u0016\u0004,~'<=E3ch/qǘcӬ*h䥄g\u0011x\u0011=?1x~M\\!_;_[\u001a\r8>\u001e y\u000eȷ/\u00015\f\u0005Yt Ac|bIo\u0014#e\\\u000e\u0005=;0\u0016\fcÑ͢GV\\_͘>؇:Cɹ>q%y\u0010?\u0005h]\u001a \u0016\u0002\u0017zjP\u0005o4L \tA f~\t'J8=le\u0015C5Q\rQI^M|or=\u0002񁬊@vܛ|ܛ,`\u0006:jp\u001f!ul\u0006,\u0002Ap#\u0003@\u0015\u0007\u0014䐏bv\u0004/f<#|`l\t\\\u0000QރR܎V^N9OJtQ'i=\n\u001bG,`Ow\u0001& iנ8\u000b\u0010`ڹ\u0012} 3\u001f\fѻkJ&DD\u001c0\u001f\rG\u001c\u0003MIT:\rwc;\u001drjޑnct\u00153:S\u000b])lG\ren G\f`2\u001fw, o\u0006o~g1Ag[$\u0019K\u0016i\u0013PyRT'5kk\u000e\u0019CWl\u0016ǷiY<V*ݙ,m\n\t^S uẀ- wR۽C\u0001Wa#A\u0003&RXo\u0006\u0007H0\u0004\u0004HeNNZ-D[CW\u001aӌ\u0016xPnr\u001cln6ۮ$t\u0005i.B\rS@޽ w'\u0014\u0004,_V)޷aB<V33N\"\u0017&iB<0]nMfS.kA,|w6-\"hW;\u000b\u0012P\u0003{+$w\nh\tVo \u001f7\u0017m؉=\u0006O\u001e;\u0019~1#+\t4R)i$D},1pTPj:«dZLf\u0013\"gԋ\fQ^'r财\u001ag}6pP\u0004q2\u000br=Y`<MVggv8<\t܁?\nȸZ+Q'5\nEaNsDfEL\u0016ƪ4eiwjisZڂvJХK4\u0002\u001ez[pQC\u0002\u000b8\u001dme\u001d.[Zuxˍ2ߏ\u00132Y|A!,֪5H\u0019(,_\u0015[VEh6)-FnPZ3mZg\u0001o+ȿ\fS{ڻ3\u001bgV4wnKW޹p\u0015}J\tزc4Zq\u001em\u0015ːTJoD|D]n\u0015i[Ū;\u0016IzIbLJ\u001b\u0019Ɋ6@\u001a\u0012PCɐ\u0006ūSk<+\u000fnװuaǊƋ\u0007[q\u0016R(X<c(YuDY2\f\\3x:ej w-f@ӂ\bv(ݑ֦ug\u0003\u000f5\u001dY2\u0005l+T/.zએ{O;ۗ_߷.lwi\r.\",d>jl|(9Uѱrfr%\u000b503\u0016o'\u001c:M,\u0010\u0005\u0004s&[W8nR)\u0013UK\u000e]^6a\u001a֖\r\u001b\u00026\u0006X~%dgEl|\u001cAWIg)\u0013\u0012E\n\tb\tK1F|q\u000bB̳\u001b(V=1mxCY\u001a0\u0015;̂c&εk\\\u0007,č\r`rlLj\u001dxcWʴ\u0014|Y\u001du6N\u0017QaK\u001c:|a6.ݮX:ҝ\u0005b\u000f\u0017M\u0004f*7CIC<\\:W{}w/<ص\u0000SS~Ս\u0018\u001a\u0017u\u001aq\u0006\u0004\u0014\u0001uDPQ\u0004T(\u0002\u0001\u0010bIl$$,\u0006D\u0002*0:Z;NZ:nǵZP*2)\bUd\u0011\u0010K9}m^|^K.\u0017\u00177VzaZjBK5}F_\\c<\\mzGiafӛ\u00040ܻ=|j|\u001e4쳨Ǟ$MW\u001b?l{\u0017I]voqf\"k[եm+\u000eUnzZh|:^Eh[m[?\u0010<Y<\u001e\fidkMnsΠ1G_F}\r7^gĪ'\u0014AQЖn-h-ϥ\u001fU+\u001em+\u001e*\u0016/\u0013?)\u0016(^{\\|g`\u001dsv\u0014}Ε\\J\u001e\u0013}\u0013\u000f\u0006y*!dCOZDU[MtY]\u0016Ug(֙][\u0017ujxi\u0015ڝ'S ](U\bN:HӉQ\u000b9{Õ|F\u000e\f\u001a\f`䔿ڸ!m28nM0˦M7\"-_&R*:6վK^<`L\u001aj7x^\u001b[^g\u000fX\u001c\u0019F\btƙit&Gﺐ\u001d\u001d\u001f\\\u001cUɫ\u0014T4N>Q\u0016\u0017IT\"b\u0010ŋx\u0010FR.\u0013p\\\u0019T\u0013*m?;1te\u001f!W\u0013rΉ\u001cDy\u0014jx,k#]!Գ\u001cQ>ň\u000fX&gk *Y>cȎcd%rQ\u001c)#5\u0016\u0007Ңq\u0017+QhG\u001f3bwF-!?&H#!\u0012EjZ\u0005Q\bq_qY\u0007_iR\b\u0004H\u0003\u001d\f#ܰ8\u0014΋Ŋh\u0017M\\\u001c\r\u0005sp1n\u000e\u001eq\u001d9f\u0006G\u0013\u0006!~%d͠3Y\t/RLtFk\u0006ӡ\\O\u0019b\u000bICo2\u0013 \u000f: \u001aƩ:\u000fKay\u0010\u0007U4c&ϜBp,4\u0018?\u000e\r#G2_%d\u0003BR\u0010+>a\u0019\u0014\u0001.|\u0004\fs\u0012\u0011\u001e\u0004\u0018xF=\u0017qs@\r݄Y0)\u0004։AX\u0013ISQ\u001b-~bOqp?;\"s;T\u0011R4HH6\b%\u0007t0\u001d\t\b\u0018\u0015`Hp\\\"b4\u0007G\u0002\u001d\u0014v\u0010n\u0010M-\u00001\u001c3\u0019Vw_,\u0007\u001e\u0013Q1\u0001_@?\t`g]!gC\u0005\u0017zz\u001atPh\ná.r=3'CM*${y\u0010\u001fC\u0000B\bEXtY\fm\tRw2\u00066MV/z/钼vH?\u0006i3\r\u0005lhS`\u0014¨\u000eDFf(\u0005\u0011Ь\\\u0000_\u0012ܜ\u0002v\u001eCrH\u00001\u0011D%\u00103O\f;r,jߥh@a\u0017\u0014Evy7;S0\t\u001aA1\u0015l\u0018\u0016z,\n8\u001bHA6\tMPnK|\u0000bH-\fz9DW\u0014\u0010UB𘂠z'\u001c~\u0017٨\u001e]BfoU\u0014\u001f\fA\u001b\f%@ǰl\u001fr\u00142p`^\u001c\u0005cI<\u0017B\u0007W\u0002(w8 V\u000e)%$u\u0014WT\u00105!zJ\u000f\u000b_6\u0000+\u001d_(ltrH\u000be<p\u0000Fc\u001aG<\u001fear\u0015\rKQ\u0002)\"z\u0014~\u0005\u0014G)O!@zU\u000b}ݰ.y\r:ڨAT6\u001dzp\u0001\u0006tg\\`\ng#/\u000bH\u001cB5\u0007]eE*L\u0004o@C\u0001^\u0015Ti<N?\"1,Va\u001c\u001a;V>&f|U7h\u00002}`\bt06\ncP2A J\u001c\u0014\u001b$7\u0011?OCj!L\u001b0lSAG\u0003~DuAYg\u001aV\\7?QtR6?I:?K\u000b\u0019\u00039\u000e4d0\r\u0019\\`Q\u0012r$TOCl6Vh%\u0011\u0005\u0005<XȪV´a=}NUm3|ۣm׾mY\u0019~2h;ٗw\u0001X&94\u0019\u0010\u0017,5\u001a+bu\u000f֦MZI(VQ0qQj塰D>o\reLpq__ӫڣI7?k\u0000~\u0002\"-ցjWu\u0005\u0011D\u0004d \u0004\b!\u0004I\f2\b\th\b\u001b\u0004\u0003\bQ\u0017P\u0001(Th\u0018I \fǭ\u0003{{̋yy~y$A\u0014'b*3\u0015\u00157EmJO%\\OŚx4C\u0014<H2\u001f\n\u0001ezvA;\u0004{ೀMyK\u0007Pa,\u0004`\u001fBхߠ>\u000b\u001f\rb'iݑ/\u0017f\u000bF}KF-%:v22vf\u000eAi\u001c:Oǡs=\u0007_H`\u00150Z:\u0019*\u0003J?,m:\t20%\tqqChmݨ6foT?'j݆4\u00129u\tNU\u0004<*А^\u0005\t_b`40\u000f6YAP2\u001a\u001e4]f2e\\\u001ew|D\fx\b\u0007~j&TxXp%=6s@4j\rr\u0011ѐǓ\n)\u000b\u0014\u0013[`b\u0003c1\u0010`\ti,p\u0015<\u0006f;/_\n|\u001cA;sT\u0004!\u00055஘I\t7X\u0012\u0012-\teI$->CX\u0017?\\I\u001e\u0015j(c\u0002O3 4#76N0\u000b\u0012\u0012Zd{\u0001߽\b\u0016\u001f\\ml׷\u0012m#šC\u0019.9\u000b!\u0016ƶ\u0014˜LV\u001d\b]\u0014Q[\u001aj6,K\u001c\u0011eǄ\f=<Àd0\fx9h@\u0002Z\u0003jK\u0012f{p?pjw˓S?+<ڕ\u001dߡcSX8Z-PKj~!Bl0{R2Y:=,VGr\u0004\u001c=/mDP\\s`\u001cz[k\tsBf\u001ajv,t^<{\tj]7\u000f\u0003wZu@E\rמVET$\u0016\bxb%Rν)S \u0011$\u0015\u0019\u0011\"B\u0019˸\u0006D5ŕh\u0006\u0012ڷxHGz\u0015,߾ோ;^5YovYcS%]7+Îj~jrXU\u0016P\u0014P\u0014l,S.)Du2qrgH\\&\u0012餢aH8,\u0012\tD\u0002\u0003O7\"@\u0012@\u0002*,XSiy}\u0007-\u001bz.h\rum\u0014ǟѨ1yHJ%e+f%\u000bb~jږʑ!K餈tXHFy1\u0001_d\r9\u0002\u0003i9%FWa`F\u001cN֏oU\u001f6>\\w1ҧ\"6TU\u0005\u001c\"O\u0012e!<\u001132%Q*f<%I\u0019i#b|TȖ\t8)\u0006\u001eGjD́dtm\u0005-\u001c,_tmkŃ]_t_w]|`e\u0003DAmLpf\u0015\u0005V\"tnK\u0011R%q)yI㲇%dՈznLHK\n\u0003B\u001b@\n6\u001bX\u0000֬6c7WG0}wv]:֋5-a9AZRNV\n\u0019T#$Jđ%\"\\hrLǟ7J#rn<\u001c[%\u0000\u0016/\u0001sڥY-xg\u000b~5=?\u001dXt,S~gZx\u0006B/sI$4\u0011IŎ gj/C5z\u001e*4 F.!gCȚ0\u000b\u0017-Em-xl\u0003\u0006ۀl@З}pƁ}U7\u0017ܭ>\"\u0015Ϳ\u001e{IŒ81k\u0012\u00125\u0016R\bji`\u0005\u0002MK\u0013\tvX\u0015QdbF\u00160\u000b\fv\u0006<\u0006[_o\u00077\u0007l@陣U\u0013eEmz]~?hn\u0007/$\u000e%8vC2]$\u0006ow/4WԀWKկh!\u0015Ab;,\u0000å\u0016`\ntY\u001ek2\u00104c\u001cGf\u000fMcݬ?\u000eQ\u001e\f}#\u0006ف!\u0019'\u001f\u0016Gz\u000f6⼆p\u0007q^o\t7\u0010}:Y0y!\u0003`\u001a\u0003XNKg\rj,\u0004eU\u0016\u0017L9or^!p]/\u0018?4$\u0019BQ.X=㴞\u00150&+\u0003A\u0006m;2]>0\u000fGzb\u001eL\u0003\u0006;Z\fhk\u0000\r,A}kPd\u0003k-[me{Vg]1f=Ϝt\u0004\u000e{jx&{9:jo|\u000e}{\u0007\u001f׉ϾGt~;߁\u0002p\u001aF\u0000\u001a:0\u0002\u001fY\u001f\u0017c>:̓|ޖy9ӡ7Fy\u0017:\u0017-p.\u0007]gQMy\u0018?\t\tq\u0005\n.,*  l\u0001\u0002!!\u001b!{\u0002\tI\b\t\u0010\b\u0004\u00047k\u001dKG\u0019wKU#-X+:\u000euA\u001c=zL[8\b\nB|潚|w]=hil*5{.]0wp3G\u001fN\u000bRqU\"֘[>\u0000as\u0007bOn\u001e\")\u0007{>G6bڸ\b-Gx\u0017\u0012}HY\b|HC4ЄaX(AQ\u0010<f`u|\u001a$$c_R\"mJ\u001cnƢ/-\u0006H'\u0012<<IQϒ(jO\u0017Em־V\u000eUM+E(݂\t\u0006|LC4S\u0002,\u0001rpa\n@qH*tA<ֆE<\"\u0012\\q+:\f}ѡ@9FQ_^$W)jmHQ`Re\u001dg\f|2\u000b\r2\u0005$\u000eS cA3-\u0001qΈ&\"Q\u001f5\u0001\u000buv\b\u0004en .\u0004EW\\\u0004AG\u001d%wA}\u001c(\u001bh\u0011\u0013i0u\u0014^B\u0004Ӹ\bf#B\u0012#\u0001lX fF@>>\fa\u0010\u0002@TNq\f\bGq2͓\u001d$ߡ(\u00132)*\u000f\u0014%\u0003\u0012`8\u000ez\u001e\td\u001e\bE!;\fqL\u000f\u0006\u001e\b.}6D\u0000\u00183e|\u00044|E\u001ds262'a\u0007qh\b\u0010/Ȣh\u0010f3 2*\u001f (\\GAi,;\u0012 <\u0004As\nRu\rt:3ALd>\u0004\r1\u0005y\u0003\u000f\u0005\f\nJ\f' JCʀÄF\u000b\u001f\u001aK\u0010T\u0015aP-!\u000eDX\u0010\u001eK/ldAV'ɺ\u0005.\u000fg Ivg|\u000f[\u0011xbd=x\u0006M\u00174d'ѡ`1IgB'^\u001d\u00009\u0018pGCI<ے!ٟ\ntNf@x&\u0013v.\u0004Ywg!>\u001fY\u0002\b\u0000\u0019\u0016/y\u000eB\tt&xCȀ.\t\u000f&E\u0000\u0010\u000b[\u001b\u0003D(@/8nBܖ\u0005\u0005>B\bE\u0010<\u0010\u0013C\u0016!ρ\fُQx /(#hPy#o1\u0003&\u0016\u0013\u0016\u001f\u0001BPP\u0014\u0001CU\u001cꓠ4\rʝ\u001c\u000f =GBH\u0015#3\u001b\u0012\u001e\rKGR<U@@\tUx@/\u0017Ҡ1\u000ek\u0002\u0013\f?8\u0003`׆\u001c0`A!\u001d\\\u0004P4 o@z>\u00079 &'}HNJ1&\u0019Q\u000e\u0014On=[}KAݝ\u000b<Ϡ#\u001d4>\u001b(:qLT}\u0012å\nA1\u0002(Iy\r\u0007-|v{8\u0007\u0016\u0019Tg\u0014P^R\u0015W\u0015hʟk\u0006\u00144Owy\u001bw:?.\u001b<C>)4½a#*}P2\u00053L\u001e\u001a}\u0004*\u0016Q\u000f\u0006hAd$?\u001aҵj}jzo\u0018W\f˦QӅQ9g0\"7\u0006\u0002\u001a\u0016x&XśU@|\u001be渱jGʰs)wtuV+neEc88ᑾx_~aKyrpf\u0019.l=tГ|\u001b{]Ċ\b:&N'ؐ=\u0007ա#1+mWU]GF&\u001dK_\nn\u0017[nZ\u001e\u0014d\u001a(0\u000f[\u0006mmECSC-_z\u0002l/\u0018yA\u001ao\"ؔ-Y#\u0014\u0006\u001azY[|%+p2\\+9TcqK?gK:-;,J/Y_8Z4h\r8N\u0007J\u001f)\u001d,9\u0018y\u0002L~#d\u001e+ȷ.ͱLlK2ȟ9(\rv\u0005mpo\u0011]_JSMk{As_%Q\u0005{k7%γfGpYeM\u0001>\u001b'( dȾWOz4̣a[4\u0003;Y\u0013p؛=n[m\r.ѕ+\u001d+ۗn)ztAGd9׉+eU|Yy+׾ʾݮ~.\u001d\u0001'0\u001dFfQC5&2\u001d%?1A\u0007\u0007d袻[~\u0014mC?h9|{ɉǪ]]mK\u000e:j\\]Etm_Wly8y\u001bƟ8H%CESf_˖\u001c889v!5d\u0017l!\u0015Ҵ\u0010eFiK4L^\u0017XYA@\u001f\u0003\u00113AZ6]MDj+.;\u001f\u0014\u001cfw9&G7%ƞgTF\u0015.8\u0017M<m^\u000e\u0005?7Ogg99v:>$\u0010,\n%tI\u0018Il\u0014b樒I^֥N\u0017{:+vxo\u0014\u0004f:4\u000bkRe\ti\"anH^lYXVt\u0003/#\\Ԉ 5=/%z*\"9z&,9j649j>$)j%=֓0{\"_B4{YS.uEp@\n\u000fk%\u001aY5_qOf\u0016Kf|\u001dP\u0012\u0012w .\u0013\u000eF\n&B\u0014WLxYN\\\u001c;.v%\n#<{+\u0002\u0016\u001aUͤHߴzrLN\u0006M\u0015~jK\nO\u0014Ddg%222YI)x䇑\t~d\u00147*a:<:~\u0013\u00137ǎ\u0011.DD\u000faD\u0006rxY\u0011~nSћjᮽ\u0012\u0003&ʷmZ\u001b_s2P\"wZ~ܙ\u0002 \u001b*d\f\b8ᇧOq#Rgy)\u001c~\u001c[\u0012\u0005&<pH,\u000b'\u000b+2Ui\u0018!\r{Tanޮ#;ڭ5\u001b]\u001a\u0002T8<\u0013.)Je\nsC9\u0015ᬼ&\u001e3\u001f#/8g:\"$s&,4c66\u000eK]`\u0002\u0003\u0010)K\u0005\u0019\u001a\u0018W[\n(ݾ\u001b=\u0015oZmbܦӖ\r\tu\u0011151$\u0006<,+)\u0012W\u0017[.ܿx&, ̙c\u0007e͇/\u0004\u0002\u001eb\u00013]\u0019\u0015^6H\u0004<}_v.WgA7;=4i\u001bq^b7&\u0007g2J\u001a؞uC=ٞ5sSe!~\u000b\u0005\u0001LQ !^\u0012\u00160ZE&\u001a<A\u0018t\u000fA6J#\u0003ʯM7\u0016޳ɼ?)[\fK\r\u0003\u0011~Zmm=Lko\u0002]'./1=^ˁJ\u0019\b\u0019T*-\u0006xVG\u0007mTEbT\u001a\u001am&W=Փ*\u001a6V\u001aL~^t{!V~\u001dg_[oSoCo}\u001b\u001f۞~\u000e\u001dM'.!0\r\u001c\u00152v\fMiPR\n*GUIEWSc~\u001bGm3\u000ftp\u0013\u0013PPPPqW'æOO?\u001cZ?\u0004\u0013\u0000\u000b\u0001\u0002~WQz\u0006ck ww\u0007ec7S澵\u001c2~R'\u001eA\u0006\u001ecCc_\u001a;eڎ\u0015[\u001c\u001fk|}ś7V}6}Chq\u001fzE\u0014e\u0002<'2\b\u000e\u000bP\u0002/h5%\u000b&5hQtٰcJ\t\u001bu\t\u0017M\t'&\u0018&8zv\u00131\u0006\u0013tCf5FGw\u001aL\r\u001b\u001bO\u001b\u001f\rM&ߢgh)Q\"\u0007u\u0000]-M\u0001\u00112 qI\u0001b4ܥ%Ce\u0013\u0005e+\u0015eGue-\u001fY`X~0]ehTh`2\u001fAÃ\"]\u0014U\u00007\u0012w\u0012w\u0000r\u0007\u0001R^\u0001N\u0003/\u0005\u0012:Y߇e\\L\fUł8a1j\u001cƨ-\u00070YS\u001fa^lٍw\u000e]hz\u001a\u0000ڈ{\u0000r\u001e\u0002$\u0000\u001eI\u0012\u0002Q䋪dwԤ\u001d\u001fG#)346A;Y#t\u0001\u0006ۇJ{0ZY\u0017S7lBUmU.m8I\u0013g7m\u001a[\u0011E\fPIt{\u001f \u0019\u0000\u001c =\u001f\u0003e\u0019דlQl_P.\u0011\u001aшzh-\u001b$w\u000eIi!KZ\u0013\u00052_\u001d\u000bnZ9U߀\n*2~Z'Dw\t\u0011\u0000k\u0000/\u0000\u001e+@h\u0006׀9ʑQt\u00107Q\u0017u)t\u0016\u001amEs1\r\u0011SCg*zҔ1@|\u001d+PB\u000e%b,Hb\f\u0014I~\u001f\u0010ݦ\u0001l\u0011\bm#H\u0003(\rz\u000f]T\"\u001ai\u001bn%oFm\u001a7\u001eE\t\r)hDGSZʠ3u\rzQ%I!_Ibq(Fخ<\n V\u0005渶(.\u0010@\b\u0010 \u0004B\u0000\tdO\b\t D\b\u0002\u0001%\u0014A\u0005FT8\u0015+xvpk:V;zU{J\u001dF`YM&<|GtN\n\bQb؁ʹ\u0003'\u001e\u001c\u00038\t3VCX|\u0016#⌀\u001d.`]\u0001OW+N~n5|\u0011w<\u0013>\u0013\u000b`\u001d\u0013A\r\u0005O\u0004_\u001dB\b'=q\u0000/n&yd,@؆%`mY`Yn`\u001cu\u0007\u0003g=w\u00064{@\u001f7|I\u0003:H\u0017\u00025\u001a\f?BHI t`{R\"n\u0007>\u001e|\u0003bf/s\u0004/m!?\u0002삐OV\"x\u001b\u000eF`'!,ɹ\r\u001d\u001f0z}OX\t҂A\u0004g,\u00047{Ɇ_\u001fg\"D.\u0005ǃ\n\u0017\u0015QvGl\u0003YMtBt\"s+]*W5Fh+\r!:\u0003i_\u0004_#;?\u0004=G+b\u001f `>7\u0011\u001aҁO\b=3\u0005@\u0007$fA\u0004b\b\"h%[WWG\u0003\u001bmtp:f}6\u0000aי\b\u000bD @+\u001b5\bz\u0003q$X?\u0011r'j\"Du\"֕\n\u001dS g8@\u0015>\u000bJ\u0013dHJ[\u0006Q+<\u0011\u001b\u0006:\fD3\u0011q,\u0010]b\u0003k,d;\u00102{!\u000f\u0003\u00018?Ds3\u0016듀\u0016UHXAPAK\n},\u0004N&-*\u0005unH2 \u0011_x+l\u000eƴ\u0005Ew\bÆ\u0005؃Q7Q9/\u00059}\u0002pŀw3\u000e\u0011W\u0011q>\u0001\u0011&\u0018!?{ԯZ\u001f{d>@V#֊\u0016ArArUU=,7\u000fJ\u0005\u000e$6^Z^%s^\u001f[\u0017%*7!q+C;\u000eQ\u0012 8/D\bN&A-\bd_Ɠ|Ň\u0011-֑{\u0005@\u001ew.\flٲt[R[\"WQ\u0017T;KRg\u0003IO{[\u00177c\u0013! \u0014qe\u0010\u001e#C1\u0011$WLh\u0016b-\n#G4\u0014g\u0016\t\u000f\u0018\u0013_\u00184egy?YH_κs[+▲%\u001bkҞ+o\u0013.J{\u0013IEe\u0010\u001fW@ܩ\u001aj$\u0011>đ|)֑\u0016\u00056UTN\u001d-g7G8/yZ\\ИNn}%7,ܫQ=\u001fV!Jy2\u0017\u00177ңv[\u0001V-\u0012@g\u0012_B\u0006idg'=6M%sz_e_-\u000b~6K]nt^7\nr\r9戞;O?O9$\u001ew&8|[ٮ]ٖ2h[ͩ㲦ԷƴwI\rdgQ@zlZh\u0003RjwZOkCf>VEuv$ٳ!}*$\\KlWv#Ir8}`Zj\u0019Mk귚}#ꆵ\u0019VE}Ƹ|{[)!y\u001fDmH@6o<\u001bl&}\fԭmݣF\u001fyN$,P}U.\u001c+*w\u0014W\u000fdS6g\u001d4e6d\\Kٙ٫\u001aN\u001eQdsqYUDH$[G\rdΥ2VrG6O]m5\u001dn6;^\u0017.{vW\u00026g?h䷙6\n[\n+\u0012eyU;\fjks?լ}0Ri\u0018N0-1VU0.{\u001f$mJ l޲\u0014T͡\fp<߽Vԫ{58xth\u0003\u000eWf\u000flYWf\u00126nIY\\#-lTW\u0017O0vZn|Z^03\u0017\fi\u0011MqTU?(˷\u0007\u0019y{)L|28k\u001c݃(7\u000ex_h\r{YGՌ\u001fF6Z\nĚ*yeNfSkʦԒ4Sb\u001f:ST41\u0015L\u001b\u0014\r\t a&.&\u0001\u0019{S͠|>rǔmݭ%\"J};\u0011uʍbBf\\.1M),,ոLZ^ُĀ>ӐX:)(\u0019U\u0015Ɣ\u001bLV&B\u000eٜ3(CU沧iFuh:\u000e'ʿ۝j\u000f[W[Ģx=rzSS\nnW&./fkIiViqUX٬5X9SY׺-Cu\u001ayTe4\\Ѫ\u001fu\u001a\u0001MBX\u0004E\u0010A\b\u0000aIX\u0012\u0004E@0\u0010\u0004\u0004\u0005qW\u001czZ\u0015D\nR\u0014E\u0001APAܵEܗ#n=3v\ncNUԞ\u001e,gg|~zy}?ѐf͂1=ŧo\u000f\bA4\u001aӵV+ok\u000e2?\u0010mW{$QRYk+;.b}˶S\"{qIyy%w,>{I@m\u0019˶\u000e\\6E~\u001bу*!ݮ3Ftm\u0002uM原Tյh'\u001fly}OqOj#\u000bǬ;&a\u0017)*>K_X?+w᜜}md}=@V^`O2w\f\u0019\r\u000bY\u001f٧DN6\b\t\u0001u1ֳ.3&\u0011sՒ\"/jT\u00166慮;TnuÛf=,=sӪo2/\fU\u0019\u0019YeCsw\u000f\u000e\u001bFRևD\"_IUǧ\u000bM\u001c%S,\\R\u0018U\\\b,=\u0017㰽CQ>wݩy\u0005'\u0016G,iY5-yc\\vSѬc{S\u001bkR\u001bN\u0018\u001ao\u0018\r/\fÆ/?\u0018R>\u0019*FGRGCo#zTFtb=tG_]\u0015ҡkT%\u0013^\r1MmDd+/d/>08g6;>'^:1U\u001f>>\u0014f6#9(TѰ臝Dw\u000e\u0010]\u0018۽j/qTyÈM{\\]ۑ\u0013ފ_q3m,k\u000b|V\u0004\u001aS\\\u001a1s6zڌ1י\u0017ӣ vyŴ#>\u00053D\u000f\u0012]!h`?\u0011Utr뮈ӖO}[8:>\u001c\u001e˼&<ت};hVFB\u001dyCx]DFvA\u001bu\u0019:yDgD7\u001c#jnfʯ\u0010Ӗ\"kNkzżr =Z\u0004kCO]JOxV\u0012cz>Fȵ=U\u0011͊t2T8\u0017w(C@u75\u00102ω.\u00124\u0012\u001d>/\u0012N\u0003͈V/\u001dy/eTFW\u0011fɯfOxd\u0015חa3/N׷!oc.܂M\r|{FD7\u0015$/!\u00195Z!Dul\u000e+X\u000fvv\u0011\u0015'_\u0016=7-)_3{p~j\u0019\u0003Zx\u0016Y\u00134C\u0013\nUClw~d5\u001cĲAl\u0010bY?\u001c\u0018h\u0007GX\u000f\u000eaD\u0012\u0015|K#Q;#J\u0004Î\u0017\u000f7n:Z(\u0005\b\u00153\nBH\u0014c?d`\u001c\u0005l.AT\u001cVK\u0017\\_0l\b_ǈ*P5˿C)<?gD\b(\u0016\u00165E@SÝ\u000b\u0017\u0000\u0002j\u001cQ\u0002)f\b1K\n\u0019X.\"[\u0014\u001b$X\nϘ\fLGb3Prh-\u0015Orz\u0013ż#\u0002Q(L(?&|X\u001d2$B9A9@A˷A,\nI|Kdc\u001ck\u0004f.0E\u0004Bc\u0017<\u001b\u0002M|=HU\u0002\u001c`J\u0012'W\u001e\u0002'\r\nR\u0004x,\u0010\u001b\u0010\u0014Q\b\u001c[\u001a9B6'2qc\f=/JGp \u0011 P'D@\b~&P,6:KȋYf\u0003σ\u001ee\n\u001d\u0000[\u00131<~b8c!e\u001bNÊf5(8\u0004auhB\u0004PG\t\u0011\u0014/*\u0014\u0001\u0016h\"\u0014['{dxW=\u001c ocg_t\u0013N:C3pf\u0004/F\u0001a?\u0007\u0005/\u0007C8#\"P0!BgI5CHx\u0004\u0015XAU8\u0019\u0001v/_\u0018\r=\u0004߳P|\u0002]6\"3/ܠxǌ0|r\u001b\n;\u0015\u0006A2\u001aBY\r!\u001c\"8\u0017@\u0017\"n\bd3DL@IlEv{\u0004uDP3\u0002\\jv\rKS\u000e\u0013\u0004_!\tX\n@H\u000b+5<B6\u001a9XC'\u001f\u0002\u0005\n\u0011\u0017+a\u001cb2,1m\rk r\u0018Ờ\u0011VКKi\u0014N'Խ#מC\u0001~\r<WCV\u00037\u0002>EpVCԿ.4\u0010YEjE\u0003( \u0002\b\"A\b%\u0001\u0003\u0004\u0012\t\u0010#@\u0012#r\r\u0002\u0011A(\"H\u0015M׫XVG+VWZ]gߝ/g|g]ך\u0001$i\tVc\u0002\u0019j\u000fD\u00030!D\nhzG\b[\u0007Cq\u0003\u0004\fn@=_\u0017\\r}As}F}\nns[\u0000x\n\u0004ϫAy9\u0001*Φ9|f\u00109DY@\u0015D\u0004B(\u001eK\u001cD*׌F!.mz\u001e<vli'k\u001f?\b~1KwZ\blD\u0007i&xb6S \u0002\u0014a\u000b[n\u0006b<\u001c$^@\u0012`\u00031\u001f\tx!JsC)W<GnznO\u00011y5euz믬+[o\u001ez|}\t>?2a4\u0001;Na1\u0012vk\nZC\u0001\u0002狰oR \u001e#\u001c\u001e ~H{\u0011/px*ٽ_\nǇjٰb׻ͷ\u0005=o:~y_#!|\\qw|\u001c\t$\u0004|ÃQ>P\u0005@\u001d\u0014)\u0010w\u0011usW`Qn2#5h\u0003yR/ף5n3Q-߇\u001b/5\u0017uM\u000b\u0007\n\u0003N\t:!\u0011x\\$hB6&\u0004P(\u0004APo8\u0004.S3\u0005)\u0010mOE\u0014Hd`\\iXf6iK\u0019'E\u000fd\u000bRtv阽';'\u0002\r:\u001a>\u0012|$l*\u001f\u0018\u0011@\u0004zg\u0014!U\f4S\f\u0000V,\f=vS^jR\n\\g\u000b[\u0004ͨ\u0005.Ǭ=\"w99)xOHKU\u0007|%i\rt\fD\u000f0\u0013^y(ewE&:bh\rF\t0\u001a$@@)=Į%Ωs?A\u000b\u001cşS~+[ovlLq\u0017ɥgr\"\u001d2.GR<G>IZ\u0001YEࡄ\u0010c|;+\u0010#vl6Kns\u001bc$\u001bS\u001b\u000fA\nj)0@7\u0005\u000eb-ǮȳCc\u0003SSfz3%쥓\u0005a㹱.#-\u0003\u0019\u0019>J\r;,3*o&\u001ae=d}06\u0004ߐp]PW%\u0003n\f8r r`d0\u0005\u0003q\u0006\u0016-\b=-@Ѝ}M\u0016>*g.\u0019/\u0015\u0019.q<Jά\u001cjkF\u0011QQI>L\u001a\u0014'\u001d\u0017꒮\b\u0014O\u0005+I\u0006X\u0001\"\u0005\u0010\u0018) ]E7!\u001a=*nFgf\u001a\u001c\u001bONT\u001dF*=ERώ\u0014\\\u0015>fP陕\u0019\u001c}z;D/*'D\u0005ˡ9a~\u001a5i(akRe\n-D\u0010}/\n=˷Duz|o.5-Bg7\u001f߿f6x@\rwqo\u000e]GSI:mu~\u001e<YSѪ[x\u001aU0'k,Tu!THR}\u0010\u0004R\u0001lu:\u0010@\u0004B\u0015L\u000btOKA7*,Еy8>nG߶a6޲z1hQo\u001dge!̩R^[.*Kח\u0004\u0015k\u0019\u0005\u0005U\u001cM\u0013/+(L\u001d\rU~\u0017P^\u0005^Z6j`0\u0005p\u0017XWwT\rhu\u001e:y\u000eMt5\u001b2-&bEKh}]m[UM6]e_Q*P+K+\u0006njQ@\u001d\u0011ɵgCe\"y;B\u0003\u0000;9\u0017\bS \u0006w!\u001e!tC}fh\u0002@ǌ\u000bՔ\u0001UO\u000eguUMbW]CVm7ϐ\u0019\u000fNԱ\u0014\u0015u/\u000f\tD{X[~|\u0019p\u0013L\u0002[V\b)\u0010DB\bwNc=fh\u0006\r\u001erͲ]5\bgm[Gn˞YʆܠRzBN\u0018\u0006Q\u0013H\u001d~T\u001b\nȘ\nHt@Ė\u0002\u0014ZY\bpـp\u0007{\u001eC\b\r|i\u000e\u000e/C\u001dC.\u0016_\u001c-+aNn݉[S\u000e;mŴݭՌV\"0G<E\nosM8\u000e\u0005\"\u0006XQ4\u0005\b=Ej9Ba7j\u0003O3>)j\u001cs23\u001c^;B|3$t\u0018\u0014oL>,u'{\u001dRFj\u0011\u0007+\u0003E\u0010^O?dr7\u0019\fN\u001707\u0001]X\u000f!@*Bw\b]Ad\u000bBc\b\r_ݤ\u001dt{+<sA\u0004!(sX亄#qΒѤQaN:8?&l\nC \u0004\b\u0004D\u0016\u0002aI)TeZ=zSm:g\\j\u001cj=\u001d.\u000eZ7\u0016w:V2ֱ. VD\u000bױ ·߹?>k/7ZT_ks7\u00146m\u0005\u000fDna-r[;~\u0016\u0011cx|\u0003D_|J\u0016>KˎEћԂEG->\u001c\u001cv8T)\u0017\u000eNв@]n|;)T{s%35q0Ͷ\u000f\u0019m@yW\u0012\u001e\u00105;dd&GyS\u0017-<\u001dD6z<m\u001d5򩊐ꈲW\u0014ζ7V%}0֨jf\u001ce|\u0003Cq\u0018\u000f\bH߱\u001e\u001cH'D\u000ejdV\u001c&ZrR@𢙝~4\u001dEj~\"tK\\\u0017/v.dwf7DǤkr{\u001d<sHL\u000eISPԺh\u001f`S={l\u0006V\u001c\"ZvЗ;x~&u+*\u0012.;ˣ]>vc_֍Yco,\b\u0015dY\u0013b\u0014jm\bt\"\\\u00178\\ۅHM\u0017k\u001eD\f\u000f\u0013Ds;^ ,4\u001c㹼~\u001doc\u0011d\u0011\r8=\rTxV{\u001b\r.\u001c\u0019\\;vhH5mL¯.Cw\u0003\u0010C\u001c׏\u0012ma3>\u0007^gsX~G[B\u001b\u0016Q(e>*\f\u0003\u0002\u000bMCra\u0002xa\u001cyFc\f\u001fxGaw$\u000exKp'\u0002\u0019\u001f\fl`3vog&_$*BM#\u000b|Ʉ@CBZ((\t*.\u0001\\,\\\fx\u0019H\u0014\u0012` \u0010\u0005\u0001X&\u0014c\u001f\tࠇ\bW!\u0006fpU3+l?\u0007D\u001e\"\u0000\\\"\rH\u0005\u0011ų:\u0014 \u0019Ix\nC\u0012\u0017\f=\u0017q?\b\u0005/8\u001fT\u000b籎簝'c\b\b??g5\u0007|M\u0013˾Erb(xS\u0004(\u0004b\nD\bZDhĒ\u000fT\t\u001d/j!8K\"f5SdZ\u0003m\u0012$=\u000fm2\u000f]\n{\n-H\bE\u0007bfy\"z\u0017} ];\u001aҏ|!\u0007i\bү 9ꏨ\u000fbD2wa1xd]\u0000 \u0010\u0011Ԡky\u0018X\u001dz\u0000LVG\u0007\u0012'zB9\u000bq\u000b\u0011h(\u000bF\u0011\u001f|?b2\u0007\u0003 ?ɜgfn3\u000f~_r\nB,\u001f#dX,T\u001c<Ii\u000bb\u0011@o\u0013i^\u0018;o\u0014To\"q\b\tP#F¶\u0000(w\u0006B+\b&x0\u001dU&s/\u0018\t]\b\b\u001dNDP\u0012}\u0016\u001390\t<T<5<,\u00176\u000f]0Nah$.n?\r h>\u000ezG\bP\u000fA}1a4\b{W#\u001c\"f2ς友\u0011\u001a#; @v\u0007\u001cȨAKH?\u0006\u00010\u000eq}\b5H\u0016p\u0018vE,UO\u0003\rɯ)\u0003\u0001cI\nn\u001b e@t\t1W͈<Y0*Y-C\u001eSph\u0005(\b\t{\u000fr!{\u0018Y<q\u0011\u000f6GOg\u000eYI\u0007-Gd\u0003n[/<a˂;\u001dg3\u0010&YHeϖrȗpp2.VO)R\u0010lO\u0014shpVWC\u0006K\u0007rޑGbf蟳b_{\u0007=S\u001f\u0015Wd\u001dVH<\u0005U\u00156@ud\u0004\feD\u0019*%d\u0001*='\u0014\fU\u0018xx^h_\u0012IcpM+c/]khoR'\u0012/%vR?T١iC{$\u000f\u0002h\u0016Bg\u0004X8\u0014$\u0007\u0011^LUp60,\u001cyߜ멚\u0012xmF^,]\u001a}*\\{ʳ?J<S%鴳Nح98mu\u001ds\u000e:\u001d04:a]\u0004Cx\u0018v\u0016C_7\u0002rX\u000f\u0002\t\u0015lי\u0012@x10S=J\u0016>1Ҵʀ﫧4OmbEۄ?+[+M:VHiPv}>dj3q]3r57`\u0017g0o/iK9<r]QMgy\u0018%D\n*2\u00032XP\u0004HT\u0002A\u0011\u0011\u001b\u0002D\u0012 @(\u0012J\u0002ޔ\u0000A\u0001B\u00196\u0012=\u000esfκ޽\u001c\u001f\u001f{\u0011b\u000bO\u0016MbCx-'I?&s>\u0012\u0005\u0017XߎM9\u001b#sdkQ\u00115\u0013nBN\fy\\8\u001a\t\f<;\u000b?\u0014QB\u0011+\fy#p!\u0004\u000fu\u0012N\u0002\u000e\u0006x\u0019ʶ\f[]\f\u0016X&wg\u0012<%ݫ:0/<8\u001aS6|n:\u001b9@틼H뉸Axh|KD~F!ZS4\u0011.\u001ay}\n\n\u001f|\u0006&\u0012t3I\tl\u0005}#fr+Ȧ0k4f,9nD$s&\f\bJ{j<b1=V\b7j=`~fYGj>Uw\u0005\u001fQ1\u001ek\t\u0010n\b$o\u001d<.\u0005\u0019\u0005x:rVȖQ\u0019F\"\u001bvIv$\u00165\nJs\u0016t0k울\tNe\u001dNEO\u001cU{JX\u0002(\u0011 Z\u00000\u0002D]\t\n\u0000(\b\u0000ަ\u0010i\u00010E&p\u0002JהF\u0002ߍyǷ\fʣl2\u0004v2&%ݵI ť3ɵD\rK%\u001a)\u0015^U\n\n/\nEs\n\u0012\u0011\u001b\u0017!Bh\u0018`\u0005\u0001/\t\f{o.\u0011\u0016\n\u0012c2{\bWT\u0017K\u001bEV}\u001d9{[I\u000e\r\u0019\u001crU:]M/6\u000b%}\u001c_\u00167[͖7[|\u0012Ē\u0011C_dD[\t:\u0007U\u00027\bJHu!ܪ\b5*5\u0015L\u0000Ne莖=jС&K<\\YH)ʨ+d\rnQnz\r\u001f1!\u001fY*bR\u0010Sv\u001a10x\u0000\u0011{J\u0002.7[$5;\tלvU\u001d<\u000buS\u0007Tbt<\u0005%7GEϒ׳dYa$8\u0007̯~Lđd\"4\u001d12D\u0014\u0014\u0000\nX\u0001p\u0014;O\u0015\u0011눠kX\u000fMaщԭq-5ǷUWFRW%\u001dT\u0014\u001dVze\u0014RkY\u0012E;')O'̝{/!\u000f\bs\u0011[Y)(\u0004J\"\u0015j\u0001&\u001a\tp\u0004\u001ak\u001c0hkZ1i8f\u000b\f.ZU*+{H˔Ԥj\u001d<\u001b\u0017|/_|b\u000b\u0011+.\u001f1\u0010]\u001a\u0014\u0003$[=gp\u0006{W#vV\u000e\u0012vYB{>bc'ٸQ9jU\u0012#'!@jYR.:S%񫚙'+\u0007|*'8\u0011\u000f8\u0011\u0015|\"*\u0010;R%S\"\u001ah5[K\u001a\u0019L\u0001q\u0003\u001bf`34\u000e&w3T1Lz\u000e\u0015-#6-.Y(l5+ȼ&WdC#-\u0011\fn\nVa\u0006#Fp\u001dV#ZX\u0005+*_ͿE\u001f{W\u0002p\f\u0019`\u0018\u0002`\u001b\u0000#6ფ!ly +@\u0017N{S\u001ds\\»JC:՞A=q;\u0001\u001d\u0001m\u001aAԣ͈zL(Auy{\u001eoq\u0012`\u0012w0\u0007\u001c@-vвu\u0015\u0014q\u000f1Q\u000b-q/x\u0013l#GN\r\u001d\u001f\u001f*v:s9>Վiq\u001d\\r@\f o/\"s;\u0011ٿ}52\u0000G\u0000p\u0007\u001as\u0000\u001dg\u0001\u0003N k\u0002dӻ\tiWR\u0014X0o\u00163\u00199jUmW;\u0003'2w\u001d(\u000et\u0017\u001dێLݒ\u0003c\u0013}\f9. \u0017\u0010ra\u000e\u000f\f\u0000\u0000\fu\u0001t\r\u00004\u0000|$@M\u0003H3\u0003v\u0010;\u0010b=IQ>as7\u001e[\u001cMΦ[sf\nfjvg:`Kږ:du\u001eȎ\u00151{\\E+WwA'@?@\u0013ίXΟ\u0002H\t m\u0000\u000f!f\b[\u0005\u0017B\u0002ਞ_\u001fl쫏^'1)\u001bi\u0014}g6Ky+wVn\u000f\u0001|\u001f8x\u000f8]M\u0006\u001dh\u0019\u0006\u001a\u0007_ο\u000e-\u00113\u0002'\u0015p\u0005C\u0004\"HvY(9yѡY&/J9hZru3W/\u001c~\u0011,=A}ny\u0003\u000e;P\u000bg\u0000\u0012\u0002D.\u0000\u0004~\u000fg\u0012ЗL{\u0012(m# a\u0011\u001e!:\u000b5px7?\u0019\u0015ՙ\u0001Sa20\u0000\f\ff\u0018`F\u001aP\u0005\"JQ,X\"q%Uc\tjt\u001eE=.Y{u\u0012ƵG\u0017\"\u0018%(\n!\u001c;O}}'~$~0Ofh\u0007#v^R+uBW\u000be{;\fF;\u0019m_ \u001ax(6Q}اD\u001c֍\"j)]\u00105GPps`|(\u0004|H\u0013?\u0013-\u0005\"\")bϏ߈5X/v~\u001bnH>6J-\u0010߳*\f.C4'DD\u001e\u00108?(\f\n\n\fА\u001e:H>0\u0013\u000fZA\u0017rCO\u0015Y\ny\u0013J\u0004\u0007L\u0012X R`\u001e\u0007Ev%,M4/q-T{cDAD\u0001 3\u001d8Ӆ<Ajt\"\u0017\u0013\u0011@4э$H%Ί\u0005B\u0019+gl\u001fjٛ\u000e?-\u000eQ\n=\u00199ߧȓkpg.\\3D\\\f$71#\u000bg1,e|/Ab|}~\u0000\u0016\u0001\u0006\u0016̂\"\u0005\u0004FM\u0004414b\u000f\u0017C=A\u0002\u0019l\u0001[*pªdpϾg?Ƞ\"\u0001cM\fmdpk7\u001da߁!\\@Y@][E\bL\u0010A,o1:\rT\u00024V.f)ACS\u000eAs\u000e\u0017=5V;xOL\u0001O(?o\n\u0011\u0010\u001e,\u0012*l\u0011!$F\u001eb\u0004f/o\u0014Il\fErhWvngG\u0015Оc73\u0002\u0016G\u001d\u0014:([tphW\u001d!s-F\u0001Q\u0002\u0006^wM\u0004'b3\b͓ x\u0014\t2\u0018ao\u00072_\u0002MJ\u0018v(\u0011X#\u000e0bW\u001caxbhpl6wh2w#\u001b\rP1F\f\bo\u000b\u0013\u0010/ ^\"u\u0014Ce#|=s\u00140/ri#LlSʹts_&}\u001b\rw/p3\u0004\f\u001d!*s}\u0005t$\u001bKzxg[w1˗!v]ktC\u000e:szk[mmk\u000eWj\u0006kzV]gIV\r[\u0015M\u001bt\b:\\\u000fBO\u0015\u0016$ 5JbL+oJ,ICC)/VvY\"ay:g\t[ܟv\u001cai\u0007\t?zMx\u0019}-\u001e>㡽.Cw&\u0001]m\u000fqm{w'♯E^d֬\u0018QSz\u000fɫly]jyh'P=9]}GK4wV{Ju#qg|&\u001exBSFӉПHD1\u000fv(\t\u0001C\u001ejxm<oe\u0015RkQx\u0013)*~/] {n0\u0019k'{\\NbNSKНI:J\u0006\u001esW\bǪ\u001em\nS;B\u001b!󳔄\u001c^|\u000fj,Qm~xpd鏟W^)T?L\t^\u001c3Gw4s&seJA}\"Cv󓛁\u0019\bݐL\u001e^; Бn\u0007=*őI\u0016e)O\u001c\u001b4\\S3p\\C\u0013us\u001b[\u001cН7mϮ2oScec/\u0011a}a^\u000f\u0015\u0010\u001eY)},QCPӑNtċ.2\u000bgKJO譬\u0019z`HpOU_w\u000e\u001a-oV߄m]aސSiY#b\u0001\u0001g\u0006<-i.A\\D.EĢ\\/\u0014+\u001e\bTϳƃ\u00121\u0019#[c\u0015ty;-\r\u0011\u001c\u001e;K|\u001dGn)\u001e4K!k\u000b6_lY9hM-%y;\u00190^̂7\u00076o0\u0011`D\u001d\fK{\u0007~y1ϝw\ntTJѹ\tt(\u001c.\u001dS˶yF\u000f,\u0019_3bBЪaSC\u0017\u000e_2da䢢\u0005\u001b\u000bw-8\u001a7fܬW_\u0015!zf\u0011l:\bӋ\u0010\u001e2\u0003QPux9/\u0013/etrL\u000e]\u0013췖e6լ--]Y~σ\u0016\u0014deyQs/<kXeoZ\\\u0013?j\u0010ˢ\fEM)Fd{#@p>#TFtfNLPɮ+\u000e( \u0003\u0004\u0010}߆}f\u0018\u0010\u0012\u0017DTD\u0014DYa\u001f\u0004\u0006\u0018Ve\u0013P\u0016YM*X\u0002&FM0.59Ѵ1ihKs\u0003\u001f\u001f޼[ą3r\u000b\u0018{\u0017\u0005\rʏ2hnڒ۪1Sb_ǯ*Ҫ=RDna_Y9sMF\u0014\"\",MB0R߯\u001a\u000fi\u0002PQ\u0011t\t\u000b&VX)\fwj+\\ټwIl徼Tʜl~Yv<sQq;Gr/+}_~?#_\u0017\f\t\u0012\u0014IQ(MC0\n`~'4\u001bT?PL)<\u0000j0Rm\u0004\u0003|Vwﲶ\u0010nsz5;-\u000bmK\n2d\u0005<gnn(3[=蛚u?%k?9_r>)(NBQj&\nS(Xla\u0016ᮔ^\u0012;4>#80Pk\u0000=uL{Ӽ/xE}ZhB\u0011g./c$18%#p0U$MK]O=O>d(NGQb.\nw`1JD}\u0006P\u0003:}\u0000'i\u001bh`A\u0001=hcZ\u000e\bU\u001b4u\u0014\fkbMeՉV9iҊ\u001c~-FX\u0015_r'N>\u001b+\u0017+D\u001f\u00178\u0018E;\nQ\u0000\u0005B`\u000f4\u0007ԃs5ԃz{\u000e\u0002vH\u0007[C\u001e\u0001je-ZEM+\u001bc\u001b-$u))Y\u0015$TzU7\tUxm\u001c\u0013];xs\u00056pk\u0019\nbJs\u0000S\u001f\u000b5\u001aPH3@/*Ʌ.3rev.+\bk_ٶ0\u000eӤ{,wdh9\u001e(w辩K\u0010pB\u0003r_\u0007:\u0014lE\u001aX\u000bz.,^.\u001a\u0007\u0018Vô\u00036\u0000T\u0007~GK5=\u0011Z)Gv\u0013Mw[n̳>\\\u0018Q缮kD{x\u0005v\u000f;a\u0007=\u0019\"\u001azNϤB\u000b4\u0013M\u0000C\tr\u0004f\u0000h\ra]\u001d\u0001';m$gxF\u0006[b\u001bF\u000fl\u001c6_7 o\u0017\u00107䴺\u001f)\u0015\u0011AU輺\u0003ɡQA5h\u00008Az\u0014v\u0010V,\u0003Ns!e\u0014L83\t\u0013Gx*Ng\u001eLбB㐱\u001aUm\u0016\u001e\n\u001c\u000e\u0018k\u0015poo\u0018ȱ>^\u0003A\u0001wP~1?O\u0000\u0002H\u00041Łi=3\u001eLL\u0000{\u001aյ3\u001bOǨޥzZtnT!\u0003ACӷyFsh\"D3\\p\u0006-\u0016Ds8I?D\u0004M\u0000\u0003y\u0001`%6U\u0013\" l\u0001BgE\u0010\fb eJ2L^U\u0017+\u0015+fMOe?Y-k7g]ew+\u001fb\u001b\u0007\u001d\u0000G)F\u0001)O+a5\u0016\u0004X\u0006s\\3\u0006\u000e )\u0002ς@x+\u0011܊f<nǳnK.wTwU\u001eQu\u0004\r\u001cPv\u000e5l>\u0015֟btRk(j/˔?\u000b\u0010'O\u0000DT\u000bup~\u000b\t\u001c\u001e`$\u001clF\u0004򙔱xV2e\u0018\u0005ы,?xO{*PuAo_t?_\u0001#?\u0003\u0004\u0007%7j`\u000eX~\u0003|0^\b@0\u000f\u0005W\u001bANx絔Ahieޞ`og?\u0018hΓ|9g|Ht7\u0000B\u0000|\u0002\u0007{\b`\u0002'\u000e\u000b\u0006\u000bzh\u0004%h\u0003p\u001d4\u000740\u0018p\u001dpX\u0005%B\u00050H1Bo\tF\u0012ʗRQ>=\u000e\u000b\u0003X=\u0005Q[LɅ\u0015Cy+)\u0004hEˉ\bH\u0000\t#[\b\u0014!\u0000`\u001b|E~\\BAYpS\u001f\u00008RB7\u0006(\u0017\u0000ˉ\nro\t\u0010}bL\tx`B/\u0006H\u000fb\u0007\u0000͇C<\u0012hƠ3̕A#\u0001z\fjAM,H`Z&)&5t>2L$U)}~D^\fK\u0003K0hȠ\r]̝ACo\u001e\fl`\u000e\u0016rI\u0001$\u001c!\t2A%r|IN\u0010\u0016eJ\u0005\u0013vv\f:2hOZ\u0018\u00071[XB\\RJj٨B:\tBw,\\'u}GEugq\u0000S\u001dF\u0010A\u0010\"3\u0000\u0001u\f\nD\u0006PA\u0005d230\f \"\u0006,\u0004B\u0014K\u00045Z\u0012WcM\u0011=hbY-b\u000e'su߻}9(zy'V&q_ Nq\u0019\u001b\u001a%]ev^Hi\u001ehde\u0012\u001b-r8hQA:'hE\u0000\u0019\"[|}mqBLb?\u0011ǖ( zŨ\u0018-\u0001,\u0012\u001brw\u0016(\u000be}\u001c\u0007\u0019\u001cow\u0015?$kxo%\u001d7W\u001d\u0017C\u0013gҋ_w?=߷{'+E\u001d;\u001c\u000eoKQܒ(['e\u00068s21\u0001E3fNPxpz\u0010\u001b]8oW.Z\u000b?Y̬\u001b\u000bY\u0011\t\u001e0\u0007\u0005/2]\u00057\\\ng\u0005'\\e\n\u0013/p\u0014@w\u0011$@/#@oZP/^z~>+]}A&\u0002ݙ\u0015;\u0006U'Eb\u0019;w>3\u000e_q\u0005\u0013)0JƧ\u0015(:@38]z\u0014~@Iw\u0001}҆\u0001<\u00014\u0000{~ެ\u0007>;ܛs\u0015\\Z&Uٳg7\u001e\u001b'dY>=\u0006x5qχ&G<ޚ~f<p \u0019\u0003h\f=#)ͥ\u0019D\u0013l\u0002/|'3ϝ\u0000K\u0001\u0019~?&3:z\u000f\u000e3ȔA\u0007}\u0014E>\u0017#z}b\u0018!\u001b\u0003\\ \u0000\f\u0019\u000fC\ra\tZd\u0003C\u0010_E\u000by\u0016\u001d\u000fN68\u001a=qh~y\u0015&\u0003s\u001bL\u000f\u0006?ݢ?`xOn>A]gw\u0004d-Mw\u0000N\u00126]\u0014V\u001b@\u001fA\u0000`Wal-\u0000\u0006pM9\u0005G2p:ҋ},b>H\u0014\u000e.p ,ݨ?$Ev/6߹r{Z6A[K:K7\u0005]\u0010`'Q\u0016k\u0016ԱO/&\u000ef~e%<\u0012\u0007疈J\u0006GT؃q\u0001=ѱ{#4=\u0002]7n\bmtۯ\u000f6lM%YK#٪w\u000e͡hOP\u0018\u0015c8\u0003\u0000O\u00007c\u0001q>\u0003_'d$8,d\u0005_۝P=>Ұ;.AԵ$lSlEGtmMֈ6\u0016eY˩1sC9z\u0003:N\u0011(#\u000e5\u0011hW\u001dұ0\u0003\b\u001ee7\u0000gRYp\"\u000bS'g\u001967c\u001a{g7'upKJFu=1Ŭ-![ܪYĕ6/Yn\"UV\u001fѩ6̥2+yy]7Li\f:Ƣ8н}I\fڍ\u001a0۔)oS1ņ,\u0003؛m\t;s䬞l/^g\\Pu1$U)&uMCR.־:acE|sejkQ)Wjvţ3q$2\n\u001aÍxA\u001ae\r\r\u0000\u0003\u0000Z!3|gVglnG^[΢\tDY\tf\r\u0019itMuZ<ʾ$ɱHѩII'ܴI7r/Z52ĉȴI0\u0016.\u0000x82\u0007LcT\u0010e}\u0005\u0000\nAO)t\u0015X\u001d6ei<q}nYuN\"[c])\u0014g\u0017d48楯erҺ䚴O2Ӿ[F\u000byF\u001a2)3\r\u001d3SQF\u001cFa\b텑\np:z@\u000f\u0016\u0001QV́\u0012\u0011tڱJ\u0015\u0012q\r\n\u0017\u001bUbM˖&Y\u0014gZmڜzGMv+,OvK\u001c|<wUk%YY蘒m\u0005:ȣ\u001ePR\u001d9HG$hi9eJK'\u0017-K0_Zn-̝\u0015e\u0014R87\u0013vgrU\u001e2\\tE\u0004-\u0012rtd/$Q\u00068\u001eP>ʟPj=\u001aVٵuZaIBC]U(ReS*,˶I+-K\u001c\u00125;\u0015w01E]#.BdS\u000e\u001dc\nPF\u001cF\u0012\r9P\u000fg?\u0003\\N\u001b\u0000\u001aay\u00054;ʛfq\u001b\u0004\u0005+\r\rFuj,ĚqҘFYdNʊmLXŠKh\u0005LX9:RXU\u0000[<^H}\u0000ݍ\u0000\u0000\u0003kW\u000b\u0014J8\n(8g\u001a6NZ`jNmzN\u0000?f`af\u0000\u001dn\u0002M\u0018P\u0011\bEESkٺn]6eyZ(*X\n\u001a)JYY\u0012\u0018ػ\u000fہΞ;0\u001c\u000e}'MZB׋ǽ2-c$)nJ\u0018jG%W?ō'=v\u000f\u0017\u000ep\u0006UB`\u0001\u001fJ56<ցYk\u0007i3d\u001e^S`gꪉ~E+߷bz\t+\u001e\u000b\u001e|NX\u0011c.\u001atsȥձ\u0005K\u0016,i)X,1\u0005$f\u001b\u0012=baoy-~\u001eKU^\u0012\u001e\u0005\u001f)5cFi(\u001eޔmJצJG\u001bxiqoM\u0015nx$p̆;\u000b.X$lhIix^IUDnIcDܵ\u0012Z\"sVIdގ\u00075^u+7r\u0006~v\u0013'\u000fl3`Jy\u0000*qEX[Qsl$S}Fna\u001e)kֹ\u00019[\u0017V̭\u001f3ʮ؇-%$}0=5P-gť\u0001ʁi\\&T\u0001wWQX\u001d\u0018J(W\u001a\u001a\rwݣw\u0015y\u001e2df\u00193]/\u0016ӪKR\\;-]\flI6h\u0004\f)\u0003wH\u000ep\u00068_\u0005\\ɞ\u001e:\u0012\u000fP;`\u001eyVCNd\u001bQ7F׍j)3u\u0007\u0017{&կro7$\u001c<dH\u0015_{ؿF|o>1T\b(c1f`6ɝ.`2Wû\u000e\u0000ùf6h\u0018\u0001\u0003Xt$\fG<\u0006gS\u001e\u0012Fc\u0013\u0011wA\u001eUQ˴2-Z-\u0016~ˣQ;\"ĳro`R?\u001ePTY\u0007@Ƈ& c\u001dO\u0019\u0011\u0005!g\u0011|&\u0016_$#%\u001b;`?;\u0001}MCO\"\bh-ݰ}\f`;+BgDi#3~\u0005n`\u0006k/b݅\rF I\u001f\u0003'3@9=\u0002.a\u0012\u0000k[\u0018,m03\bLv^\u0018NOй\u0000^6Am?t\u0017uނvU*\u00173N5?\u0004ev\u001eSO\u0000\tHf\u0007\u0007l\u0017\u0001o\u0015|o\u001aa1\u0014:w4;\u0011pP\u0007A\u0016\u001c7 -`s̟ɹ\u00172;ك?e[V\u0015`'`\u0004\f\u0000x@7\u001fBd\u0014NqL9ć\u0002ᇡ\u001c7\\.,P.W/{rg̎\u0000\u0004\rX\u0000>\u001d̽\u0006o,v$'ehB| \u0010C\u000fG\u0012{\"$(C\u0002\u0010 i\u0012J0~O\u001cz\u0016Jclr}jO\u0012][B\u001f\u0016\u000b\t9 <9Sb(T/yf(ў:-TDA\u000e@'/R'\u001ayN[ߛ3?;nD$_\u0014}\u000e<Z$%?(1΢i>-&¸P9U^x<~4^\u000f.0#;ߟi%\u000eG\u0011\\\u0007\f)P\u0012\u001baI\u00176Re١\u0016Ԫ֏\rk괶\u000eMM6ѮAbN} :F\u0014\u00119U\u0012rꧠǕiE`_PKuf\u0019T\r:kA+i_\u0007\u000b!7!q6Tt-? \tA$b@k\"q\u0000$>\u0019ǫ\u001eP\u001cZ%vٱDX}ب]ti\u0017\u001c;֨ڹ\u000fS+\u001eD7ǈ\u0018:\u001a##ݢ{\u0001\u0001-T3$88t%|t$\u0015ˉWӵ\u000bki-Η=>wqڹ\\wYss\u001fsy6%6{6&]jH`\u0018T$>5\u0012@\u000f| q4Ay@+#\u001cWӝt[\u0006ZF⋴d\u0003ډ\u001eS5?gcb)+\r\r)\u001b\u000fy\u001fLeKgMi4\u001dHm5M'UvSUX*i\u0017IX\u0010gk<OH\t]~h/\u001dd|Ɯ\u001e\r??xc^u\u0018j_2z׬%>{YjveVc<dݕu{U۶,/˒wm\u000b\u0010#v\u000f(\u0000\u001e\u000b_\u000eaAh*HQZ͈\t}\u0005S=\u001d>5\tSհ|w\rc\u0002e\u0012my\u0004U\u0006Wo5+\ro\u0012\"\u000e\u0002\tJ\u0012bZE(\u0012 K\u0010\u0002!@k\u0013\u0000@\u0000E(\u0010޸junkn۱vvt;ad?=s9s\u001e߰NJbMH\tk\u0017\u000e)\t^\u000bك{\u0006x\u001e\u000b\f\u001fs%'\t\u001e0!\bn%\u0004&,%\u001f^JR/5|ϹR\u001a3\u0001qS\u0011։ةPG2{4!xW!s΀e$\u0014\t\u0002k\u0015\u0017g\u0010\u0013\u0002|¾Ct\u001a\u0000+J\u0011\\V卵WI*9}V8=0MT\u0004L$[ƒۘI=!CC\u0013Y=2/.H\u001f]r³\tזDظT\u001euY\u001ac繥ΕAt_\u0007f\u001bMM\u0014tf<TDz#DmZLU\u001d<lb\u000fuRܞT\u0007K1#T\u001d֡)*\b[S\bkI%\u0002p\u0011\u000e^u\u001d^oOq\u001f\u001d<╻l/Xвn38uԓ\u0007\u000ec8;{0Ko\u0014\u0005e=\u0019\u0010[s8\bϚ6,hUO\tD\rz\u00164\u0012\b\u0010\u001eE8\u0010ᷘ?d`A{.\u0015>v<\u0006gTF0즎\u0016Ї\u0018yj^]w!S[lϩ\tmn6gu\u001b4Ca\u0016ͤ&s>*\u001dIe#YBCDHYC\b\u000fB\u0000>9Ήװ{^.\u0002p!g\u000b0e\fb\t\u0014GP\u0007\u001d5&0z\nޝ,\u0002}`k~\tI_\u0015Zȭusf털\\;')Yh?P[xJ$\f\u0011 |s×jߢ7\rA\tR7\u0012\n\u0002`L\u0004RʢܺKeM\n\f\"]`Ȭ3VV\u0017s͆v~YQaIH?+)/n(|+)\u00131\"4\u0000#Uc\u0016p\u000e\u000fу.\f{F\u001f\u0006\u0004[UQyнŜX[W]_]j\b6BJj9%m|cqP4*\u001bHt+\u001brޠ5~#\u001a\u0016\u001a0\bt`\u0016\u0001\u0007aB\u000f\t8Y\u00030O0{\u000f\u001cͲny\\\u0017VQS\n(\u000f2UXEj/\u000e-\u001b\u0016唞\u000eה^dޗd\u00053MD1\u0011AJ^W%fA\u0011=X\u001c\u00014\u0007\u0002\u0005By#45Zѫ\u001b\u0019\u0015\rޥ~E@C]\u0011S_k\u000eͭif\u0004!azSz;\\Yu\u0017:\\YHUITf\"P\t_]Ax<K\u0007\u0010\r\u0012\tsЊ3hA}\u000e`o\u000fڎ\u001d(2k{5ų-'U\u001bk)\fi.gi,\u000eq@0)Li8/Jn-J&JGl!:O%<9<338߈g\n0\u0001ЏX\u000fF\u0000\t򞭔7\u0018z~Rzز|5\u0001靦 ZVjn&Ƿ\u0004q֛a2\u0002Yۿq\u001fBẍ́XEna\u0003̣\rs\rЃ4\u001d\u00010\u0003E\u0003l(\u001cx\u0019(\u0003Ѵ8zf֟ᥴ|\u0015GV\u0005&0z{C\u000ecz9{H{đ<H\bGj#6\u000f_]@v\u0007\u0001v`-\u001d}4o\u0001ZG\u0010d;Ġ\u0019\u0006c\u0014\u0001!P\u001d\u001e\u0006oh\u0000HO`#8jxg:\u0019y_A\u001c@\"f`\u001e\u000f=\u0018@\u000f\u0007]\u0000П\u0000H?\u0005p\u000bN\u000eLo\bHKQe\nځ\f<h#it|^w\u000e\u001f|\u00171Γd\td\u0004:f\u0002}\u0006ǆ,\u0000\u0003TD\u000f\u0006H&{\u0001\u0007C̼\u0000\u000banvI!ʕ@RRpevn\\\u001du]C[]3W\\\u001e[\\_0s\u001c4K7%>k\u0019C?4\n`Cz'f,@\u001c\u0005\u0010w\u0001 \n;kW j0\\\u0014-nؾ$mˉuY\r[uMeW/ة)Z\u0015x\u0011M*\u000bu]x\u0005pN\u001fA{&q\u000638\u0003;\u0007\bp\u0005;\u0012@57h\u0010~\u001bD@t[\u0000ۛ N\u0004\bD\u0003n\u0002\u0001^>pW\u0003\rBCȃz\u001b`\u0007uP\ty2cc\u0000}8\u0016ܻy\u00013itu\u001f`\u001d\u0000\u0003\u000f cO\bx\u0014\u0000\u0004>\u000e\u0015\u0012\u0007>\b\u0000ޏ\u0011;x}~\u0006<?\u0001\u001e_|\u0005\u0006\u0011^\u001fPQ]i\u001co\u0019\u0007\u0006\u001e\f0P,$\u00145\u000e1q\u0015T\b\n\"* \u0005D\u0006\u001b\u0012(\u0016Į\u000bŵ`Y#Q\u0012\tQcC\u001d\r֛\"9sp~;̼~߽\u00023Hu\u00161~\u001e}\u0002|8s\u001fȼ{\u0006¾g\u000f\u0002\u001c\u0001\u0003O\u0000Ӏ\u001c`}^\u0005oZ/頺\u0002P\\t-\u0017@n*\u0019\u000bw\u0003j\u001d\u0017g&p!pS|ƟT\u0002d'3! \u00071$v\u0016p\u0000䋀\u0015@q\u001d-5ِ\u000emf\u001d\r\u001e\bGܔ<f;p{\u001d\u0014xv\n\twN\u0001֟5\u001f\u0007'sv/3k\u0006cߦT\"-mK@MC\u001cn*)\u0010\\DZD\u001c؂I{OY2pmfl_\u0000wtW\u0001q3!!DX\u001d&Z\u00127\"^;\u000b\u0016\\0O[\u0007/\b\u001d|\u0014Dݨ\u000f\rMi6-%Q)2:N.sbl'q\u001dݙ'\u0015ۄ\u0014Hԛ\u0006R\u0006)4\"ZNŴ^QF\u0005^\u0016^\u0019oI}\u0011.҈%lz*\u0007\u0010\u0016!F4%Q:eEb\u0015+\u0005vw\u001c9'c\u000eGCzPzD#n\ff0\u0018kۡc-d\u0013a\u0015B\u00136\u0011k7\\R\u000bu!jL]jF<VoCU\u0019;J>lFຕ@\u001dCq\u001d  \\\u0016\u0017֥)\u0005\u0013bJr:ɣP-g<\r\u000f<ܗ\\;Jܖᦼ\u0005Up8^E'\t霽:\b'\u00078\u0001^v\u0010Mm <erf-\u001a7g{ܹ\u0003\u0010\u00142d0\u001ajˆ|\\2,E27¸\u0019{pGr\"\u001dw}\"\t\u0011:&,\u000e\u000f\u00197B4SCxހ\u001fy\u000fwͨj\u0012Mb[$Ꞇs#8\u0014L\\GTJ:Aqsa\u0015[z%TiP#|\nOhk+-^#o#n4¥fK`[7CwPOOg~<}>-,U)Q٬jifM~/\u001b\u0013-߿\u0012-4˩S\u001d۟*p\u0006-lQ犓|P:\u0000Ma(UOUϰfRn1MPm6MWf7\n\u001bl0Ԭ7m\\keYb\u001f׭Vh\u000b%? Z+js\u000el\u0012gXgz\u001cj\u0011\u0005~:J[EJ\u0003,6\u0005\u000ePn\bLW\r\u0018.\t\u0018)\u000elڜk\\]n^bԼfy\\d\\h,7W\u0016\u0004\b9\u0000aSs\u001f\u0004\\\f\u0001Nq+H\neu\u0015-\u001d??;w\nWtX1QcJe\u001djtȴ*\n\u0016\u0006OY\u00104K\u0017Th;7h.?~vP}^P}n#\u0019~zБ]N-:3.mK\u0019v\u0005ʺ\u0000{:+=TFiXC\u000fEqYZ\u0019\u0011X\u001a\u001e,\nS\u0017v\u001ffU\u00106z\u0017Y_L.4W\u001b:~Frǜ\r!{v\u0014ziBЏ\u000f\u0015dO\u0019%\u0002\u001f⹷\u0007\u001a7ubM7gjHwP,,ΏL떢u͌lsdvq\u0014\u0010);|a\\N\u0013\u0011wY\u0011o\f_G\b=9\u0003\u0011\u001c\u00037Y#Y.{{3~,K\u001b`E\u000f=\u0016^&W{^V\u001b\u0013ocvJ4yRp\t}ب<Bcfdm.#\"]EtɈzë\u0012\u0006ғHP)`e8p\u001f\u0003v$p\u0016(x\u000fJ\u0013O2'>R=9$A_ٍCf\t=s\rc;\u0015eH~kZL\u0015tN\u0011\u0006r\"}zpp\u001bpc-<w\u000fL\u0002x\u000ehI1\u001fkI91:oO˱\tڬd9ϗv#tȈF?4n!=yp\nAnɱ\u0006^\u0017.\u0003c\fɱBOu\u001e\u001d;yfd8\u0005X2y?܁nI6`q\u0003Y\u00035\u0006kG/gK\u001b4!=i>4CJbe\u00126%%\u001cppj\\&\b#\u0019\u0012\u0013}\u001bYI\u000b%\u0019)֘ꌉ!;_\u001a3\u0016T#R4\u0019b\fJIO\u0019d\u0007e\u001e7\t1P,,.V:,U\u0001\u0015\bH\u0005A@\u0017*`-k1X\u0005b]QQD\b#UѱrԊ:k+ڙs@wŤ,F/(GFWύ8;jSxT\u0007QWc(a\u001f>_#\u000b\u001d}xk+$|dm\u00028\u0002IZ%\u000fBN(If4-yYrR\"!1ba\\eLBUt|M,9\"\u0016V\u00186:p\fkv\n<r\b\u0015X\u000f\u0011\u0018\u001a`\u001bA\u0013'uH\u0003^4?Ut[df8#=U1Fc(}Z`\bh՜\u0004눔ŚBmHIF\u0019I\u001c\u0002\u001c']p> A\u0018>0^舶K\u001eg\u000fų\u000ef]\u001c\f޹>-\u001a)9;\u001cr=$eѹ~Ȝ\u00199a\u0016\u0011ّʰ4<M\u0015\u0017W3\u001a2\u000eO//M触\tTO\u0015v=~le\u000es۲\u0016s\u000er\u0012)y@|\nq\u0005XP8\u0018QE$󊼤&\u000bg\u0015(\u000bX\u0004(\u0003Srmj&/Y]RYrH{:\\\u0011v>$Khz:\rw=}lIV\u0003|\u0017(fYb\u001a.sFx\u000b<%!e\u00133˦\u0002˂K\u0015Q\u0016~\u0013-'-Vy\u0014[M(Yc^IW\u0001ؒSڎ]*lH!)\u00106=\u001cg\u000e\u000e\u0006;ؖm^\u0006!I.I}*$\bBP#\u0002 `hKWjlҪP3yU\u000b\u0015UeXxU\u0016YRzVnQyTWW+>\u0016j\na^c\u0003{s\u00132|\u0005s@鎭\u0000W\u0003U[`\u0006\r|7q8P3\u001ekH̐\tY I\u0019{6+1n2w55w1lmxk:VXX\\s;\u0002}FZ:K+* <\u001am\u0002o\u0001ԪYG]׏[\u0007\\?\u0001Mx\u0014,\u0019i+q1K6HVȆjdCL\u0006N\u00062\u001bT+䃶^\u00037τ={\u001dtW\u0005\nM\u0000Do\u0004fm\u0006\u0002\u0013\u0002\u0001]2\fkPO\r\u0006\f3\u0000C\u001e\u0018w\u0002\u0006ǀPosc\u001a6.C}$NK\u001cE%q\\[H\u001dv\tl#z\u001d\u0002,z\u0017\u001ba\u0002\u0002\r˞u?0 \u001c&5M:0h`<\u001ec=\u0016F`Ӓ\u0003rXBz\\U3X\u001d\u0015>\"$d382;s\u000b`. \u001100(л\u0005в]:!e\n\u0016mv0o\rE\u00102\nN?!k\u0000vN}'5\u0001) i{M'܋\u000eH\u0001DrA..\u000e\u0004i\u0003T\u001d\u0005\u000f\u001a5/\u001eZ\\\u001f\u0010\u0002/\u0017_\\Jy\u0019C2h/`\u0004pB/뭐yO33OW:\u0003\u0018赦;X_\u0012*8kx!v\u0004\u0006\u00027\\[cی@77,]N)\u0015KOgͣ\u000fp\u000f4\u0003\u0006x0mځ=jz\u0015/ȏ\u0006I~\"r\u0004~T\u000f<\u0007<\u0019\u000e<EW\u001ey \u000b~\u0001\nn:-ZU\u0015\u001bC@(4nOyi<s\tP+p%\u0003<!_\u0015\u001cOEl\ts\"\u00126,q\u0017q \u0010U/`ŷ\u0010Vo!,!d|\r\u0018EƑi\u0003\u0012CRɇ5H6\u0013\u0013I#89C\u0003\"?\u001faC5{\\Uo\bE_f\u0000\u0019AƐ)$'$\u00142RI֓s\u0005k8\u0015Ё,\u0013&1x\u0006n\u0003g.\bz̅;&d6#i99J`5=l\u001e3\u001d|n\u00166?yy\r\b\u0003:-а&Ē(X\u0013ȗ'H\u0014eU@rzYK-li`\u0005\u000eq\u0015q\nG\u0006#\u000e֌C\u0002cŚ(CXxB3\f<=i,)A\b?p]Vk*\u0014Wpl'.}VwL.t??\u0012h\u00148|kD_X2\u000e\u0005=\u0006\u001b\u000e/#q_=\u000eݪ\f\u000feU\u0006.\u0018T+qV\u001aUFtz;:qR݂6NlE#Ь\u0011%\u0012\fZ8\u0019\u0013;\t?i\u0007;z&\u0000gѩ]\u000e]\u0012N2>\u001f/qC.נ(++7&F\u0005\b,(,ȲܖEv\u0005vrY˂+\u000b\u0002\u000b\"\b.\u0004\u0014!xC\u0011Eh&Fmc6If:i:MSM[\u001bvڴ}z\u001c<_9y\u001f>|e\f>X6\u0005e\u00177\u0007pmŕOK\b\\@\u001f$\u000bd\u001dXqu,xF\bVe\u0015\n*\u0015U-]\u000f)[kkݵMp=\u0003\u0004{aj1d\u0014r\u0018r\u0010r_w~ko7CfC\t$r\"CkK\u0002Gm\u0014o\u001cWk\u0005qKp/4\fn\u001b\u001bRZ\u001e.GRZpP\u00159E;}VC)g\u0014~֬(b}Bq}Lq==\u0015WΑHH둄CH\u0004\u0010W\fׇG1\u00007r}\u0014G͛`!:\u0011)3aNi(-)>)wf\u001di^Q\u0010g2z{88w<z7\u001fU~\u001fQ~?\u0018_\u0018\u001f\\_\u00026\u001a\u0002|f~FdܳpύJ\f\u0003\u000bV\b8\ti0`\u0013dB\u0005pB\r{\\\u0019Srn!7\u001c\u000fO\u0007\f\t\u0006\n}\u001f\tT{TDгD\u0000\u000eق@\u001czN\r?\u001d\u0016\u0006\u00171D\u0001Nz\u0019N$\u001b\u001a%L$S\u0013)YXJ>}Hca\rkl!M\u001dw07ߟWЧ>(U\u001f\tQϊ귙.=C\u0015ӞOQ[2\t$\u0013\b<%b޿{?@ωls\u000ec9ʅ49Lf\u0004øv33\u0013\f@f\u000ekזs5ތF~OF-L/jO\u0010J[>})iNؕN\u0018D\u0004\"BW\u0012O_z\u0005p\u0013}b\u001e0L\n&tR\u0018ݱ\u001ap@\u001fGt>ի/`wg[]6^\u000eg@ێ֬@wV?Ӓ\u0017t3Fݼ^wKZVw#\u0011ơ#\"$9\u0013p\u001c7\u0000\\G߷`=\u0000`\nci`@J\u00180C1\u0016\u0018)Q0󊸞<+ߝ[\u001bВ\u0012rE\r9{NÈa\u0018ޒW\u0019ޕ\rm'2H\u00101D\u0004>\u001bO1\u0007w\u0000W9K\u0000(D}7\u001f\b\nA)\fiN3X&\u0003{m.,5\u0016V\u0005\u00174\b\nZE5=!8)\u001aAe_\u0006\u001a\u001aH\bSGD\u0003瘃[xqz\u0013\u0014~\\\u0007\u0007__\u0000z_Β\u0010hlViI]lvcI>Yb9Jl\u00015N-,+̃RaYLPZIXn6\u0011iH\u0010;\u0003\r\\>b\u000e<aN<]&\u0007O\u001ap[#ٺjjhgTW\u0014րrETZ)..\u001d-Bˬ<r%h\u0018h!\u0012\"Ab\u0014\u0014\u00133:_Cy\u001b~\u000bρJXڬ,pۤl\u00114V:rT'UZ*mrV-(5\u0005+w3\u0005$F,zRn.֟\"+\u0014\u0018\t=g|}w\u0007뿈swj\u0000 m\u0018O\u000b\f8\u001d+n=T;L4.m+\u00149,<\u001ePP ̫rjk2]%'ȟd*\"ɬ\"L;atv\"ٖx}w\u0013W΋u\u001eDQ9@ZzW\u0010\b\nrW\u0014\u00126tBW\u001e;d\u0019\u0002\u001bB]\u001eaX0#ImX4ܗj(Iq\u0012qJ\u001daR(\u0007w1\u0007}\u001c\t\u0011\u001dio{\u000b\u001e7\u000f,dP*=P艁|v*ϓAx,}k!;Z\u0012+Ը\u0002if<$\u001f1-\u0011%6\u0013Q\u0004nF\u0012w1\u0007\u0006s?FߋV\u001bq#\u0001:(0v2۵\u001crn\u001dխ2utHyK\u001a6qwuU]\u0003&\u0005ۺ\tc\bc;\u00160\bcۈ`\u00057\u0016γ\u001eqGv#M\u0000\u000e\u00060\u0002\u0004/\bWC/\u001cR|J\u0012A=N%\rDV*Xq>';(}-ügyQۼxQ}z\t?j\u000fXxc^.=.vv)j\u0003d\u000e\u0002\u000fҐ0@+\u0010w(\u0018\u001dRV, Ư\\2ZBm\u001a6\u0015^V\u001e{\u000e\u0012N\u0010r\u0005\u00171糨{\u000f{\u0011i'҈ߕ>\u0001j@k\u0019\u0005\u0000<Ƀȣ\u0012P\u001c]\u000e\u0011S!\u0010>\u0015\t\u001bkjX?7vy@E}eaO\u001f\u0006p}P\u0004,\u0004\t\n(q]ՠƂ\u0006\bADET,\u0018NPX\u001d\u0018h\u0004\u001d{,G$1qu]\u0013{X\u0012ۏ{\u001d@x\u0004gygΑڛ%_>`Q2l]f(\u00102C\u001b/)멷4y赌A.| b38\u0003\u0016\u0003~Z9P\trx\u0007ë;<+\"Q1\u0004\u0015\u001fír\u0012\\\\\u0015p4é\u0006Up,\u00022!9V3y\u001fLYǻH?\u0001\u0004RO\t\u0010VF*\u0003gS݀c\u001aju#\u001d`W\u001bDak2\u001461ZCcIڲ\u0001*K%\\@]+!\u0002=\u0014b\u001e\u0019ԝC݉\u001dEݸr6ԯ\u0005\u0002\u000e_\u0003ȠAV\u0000\u0003h\u0003\u000e\u0007\u00116#G\u001c\u0003deYPV:\rS^\r\u000b\u0005\u0002jO-\u0005Pw\u0018m\u0018.\u0001߃k=?\u0002\u001c\u0003CIl3\u000eYw\u00018ߕ\u0010\u001bF6e\u0017ل\\dikbR5љ\u001d&+\"CV!V`z\u0005\u0001m\u0002DQ7\u001b\u0000\u001f+|\u001c;\rR\u0002@.\u001cWtll]>\r\u000e\b7 Lb\u0011\u0002|II}g'&w!h!y6\u001e\u0007\u0018N(\u001bF{;Q׋\u0000]# D\u001fuOrLh\u0016v/C?[7\u0019lO\u000b1yI#_ҐW\u0016\u001fh\u0000\u001cv\u0012\b<\u0003xռmּE\u0011\u0017xD3\u001a\u001a=\u0005桍i\u0017<,\b`\u0005!\u0018Pq\u0005k\u000f6@k\u0004\u0010\u0012A\u0006?\t$#d\u0019YM6\u0002RDJvRK!u/+~xI!쨭Pp\u0005W;\u0019H32$t䐍d\u0013ur\n.\u000f\u00182i.\u001e'WG\u0007\u000bƙ5\u000fH?2|B>N\"u9Rk\u0006C:k%2SVo\u0003>~\u0013C\u0005G7A8RWm\u0007!\nGz\u0018jXjMf\u001a|tX@Tjd\u000es\"@\u0019#\u000b~I\rp'\u00164q7F\u001f \\hK_h\u0019\u0013ZG9&ۇGx}Lԙ0&\u0018H\u0015e%rM8O_\u0005S\t8tZ%#R\u00069\u0005SThgG8\u0017\u000fA'5qU\u001a˲h%|:b\u0011N+qJ\u0002'98̃UYê\n4jpHՀ&|W2c\u0004jAxQeN\u0011W^/'\u0015\u00157~}\u001f6}pV7\u0018lGX\u001c3`?\u000f\u0017`8n\u0015sW\u0019u2:AC=84a\u0003T9F@Y\u001bBz7ˈn.yJ\\C;N;tQw\u001e\u0003ð\u0013ԹG\u0014T{$a\u0002L\u000e敃*|Tx\u0015{\u0007J\u000f\u001c\u0018HfKi\nIA3\u0006!!Z=k,\u0017\t`;孁\u0011\u0007Pg} l\u001bʎcPR(bdl\tH\u0002VJ\r\u0000T\u0018X)\u0007Iy'e~LY֐՝F\u0004\u0002R\u0006K0\u00043O\u0017\u0019v@ol\u001c=P\u00124\u0000[\u001bGas8\u0014\u0006OgHy!s!)\r!!9!\u00055!U!쐣eO\u0015KC\"#TțY?]\u00038iG,=c~3XP7l\u0016\ba(\b<`\u001aG`q8AZc\"[eLe\u001b\u0017ʳƕLFEq2ݸS^\u001a~E\u0012X(\\(I\u000e\u0017\u0016<\t\u0013ԝn_>|r8n\u0007\u0002U\t=+\u0014L\u0011XcFie\u001a%-7e&2Lt\\E)EjZL1S-0\u0017FlSϏ8gj1=6\t,P\u0011e\u000b\u0011<W{\u0007>s :W|j\n{Kھ>X\u0015\u0019\u001eX?\n\u0019#e&\u00125E\u001c\\\u0010\u0017\u0013F3+Pydvf>6#\u001fhE\t(\u001a)Tm(O\u001f|ǧJx\u0014\r\u0006bca@OdFwƒ0XiQGdcNR̎L\u0019NNγ\u0012]\u001cmMV71.!Fh\u0013*a`+\"\u0018\u0007}cc\u001cbuX2\u0015qH\u0019\r&̏\u001f(͍͎\u001f)K\u001f#\u0019\"q4!SR4Vh\u0013uGEyafav\r.D&葨(((\"\u00030\f̌\r(\b\u0013\bqh]\u0010\\\u0012Q0.\u0011\u001d\u0013c\u0012Mh\u00184rZ=&Ic\\kmm&A;8}}yIirj\u001dIjI4j{'JxU?3\u0007~F\u0007[6a\u0012>\u0019(Ѡ\u001f\u0010Ԧ\u0010*CPnH\u0012\u0016\u0019\ft$=WV^\u001cPVOW5\u001d\u0016Mߡ\u001fYgMYHc֋*^TZRES.q\u001fa\u000eQ\u0005ؑ\u0005lZVu\u001bd\bD9TfCi*L\u0005iPlJ\u0014N]Y(_Yeƕjq&˸KΘqZqC&#CT\u0019\rҏ}mf`69x%RuԘ\u0004TfbK0ʬcQbBA<!?;Ek͔:92)϶\u0005-5Jeh^1۵ifNoPjM5g*ԛDeITr\u0014,ځV\u001bq#SüTpM9:\u0014ۆ\u001e\nc\u0012\u001cӱ1W;$9\u000eJ͎\\y\u0015aV\u001aUz:uUM66vUP-\u0012Ee\t^z\u0019o!c.*ZzR,U#/o\u0010\u0016\u001c4X\u0005s`rI,鐥9\u0001\rʄ<j~vu|\u0001M\\IrY\u0013@\u001dPT\u0011<xʟ1.'\u0003`\u0019!<NQ\u0018@X#$\f&\u0014\u0018]0\tid!e$r\u0002قry|I\"d2xjv\u0013Yߨf\u0015S*\u00141\u0005\t>>dbJx\u001ey\u0016h\u0007I%){\u000ers\u0000~0\u000fAZy(R+R\u00119HL\u0010\u0016T\u000b\u0016I\\E4L6-U\u0014\u0010]ު^W\u0019Y>J\u0011\"r,\u0013\u0003J\u0013B2`y)PK8]LWA߳\u0004H^FB@̯}\u001ea瞂hĺ0ǝ\"ĸ3ndX\u0012宖Ns/nO}M><<<ZG,!U|w\u0003K\u0006RECZ ާA!n\u001c\u0019&` ҳ\u0000Sy_X)\u001e\u0010\u0010&z\u001a%\u0013<=\u001d\u0017<H<a?H\u001aDiˤWdT<p/.$H.L6\u0003XEŹh\u000eƤјf\"Dbw\u000e{\u0013׈0\u0003c\u0018\u0013B^a]\u0018}K\bY#^\u0018Zh\"DI*ލ/\u0003\u0017\u0014=5X\u000e7\u0001k\u00017҃h\u0011y Fm\u001ec\u0010:\u0011#Z#|[,kK639-\u0018\tCló[|\u0018\u0013\u0004FP(\u0004m\"\u001bɆ>P{\n\t~\u0019\u0001u\u001d@\u00177\u0003\u0013hYGo\u0007\u000b\bڥŠ\u0001$\u0018\u0003;Fc@G8\u0002;#\\<өG\u001c]\n\u0006\t<\u0005M\rhw=n\b];G;65\u0003+\u0014P\u0007`\u00130^\u0001ہN`\u001e`~\fj\u0016C\u0003\u0010p(\u0018C!EAe\u0003aqC1}\u0002\u0013C\"?\f6je6ր\u0004v\u0003\u00131.Ao\u00028]@8B{|\u0010a#hB>n~psyn\u0016u\u0011\u0017󘈿+2\u00077ԝXg\u001c\u0002&Qs459=@{\u0002\u0004?0#\tpZM3lF{p3,?gyٟ!a{(pm>/\u001cд.d/`=\u001a\u001c\u0001fC70\u0004ԧ\u0001'\u0013J\u000e\"\u0010H5K\\\u0015~¿ƍ\tb^?EnD|B]\u0007k4\u001c\u0006R\u001dCI\u001dX=\n(z%-B\u001bR&kOm\u001a\u0001?r\u001dw\u0018޸\u0012p0\u000f>&\u0007?<a\u0001\u000f\b;\u0006QWw\u000e}I~%\u0004(\b\u0002Ӌ\\C\r9\u0011Y\u001bMFM\u0013^\"\u000fċ\fXdO\u0010eD\u001d$H$'\u0019NJH\u0015#I3YOZ+'qp\u000ewS\u001e\u001f!\u0010\u001c\r\"A$!%$X,\"KI\u0003YIp\r\u0019mw\u0007\u001e`7\u000bp\u0014wp:=L\r\u0013\u001fQC@\u0013E8&\tx\u001c:\u0015pS8Vg'y},q\u0003gp\u001d*q3|˙z:t̅o\fd,J͹\"Z\u0016Q\u001aUx\u0011.\u0016ik9W\u000bvn\u000e|\u0003S8<F8Yv\u0007Eyq^\u000b] [Q@PN\u0017Ac9V؅\u0005v9vZe9\u0017 'x\u0013bzV\u0019,xhĚX4Sg:i$f:}Emdg}?<=?5T-u'@DOk%k)\"d>62\u001aj4\u0017hG\u000f\u0019\u0007LAIþx\u001bq\u00071GxP\u0014R*Ǎ+GsMԝ\u001aPS20l<@\u0011\u001c?F-5Aո\u001e\u001e޸5Zx\u001dWXwq+0\"<⢤MT8UK\u0003<yX>Ʊs\u000e\u000bqW\\\f%u\u0012W\u00157hZpYӉQ\u001e\\ňv\f\u000e¸C8?\f΍3\u001cn&<ĉId\u0015GoN~\u0000:G\u001f\u0001\tӊx0n\u0002\u000611\u001aW&%atr\u0016F&0-\u0005\u000b\u001e_\u0017NI~\u001c\u0015G\u000fH)\u001c\n\u0001\u000e\u0006\u0010\u0007^\u001d\u0002?`ST!\b|:l\u0016G\u001c<vq2k\u0018\r\u0017p>0\u000e\u001c\u001cV#ӝ84\u0006ߛш\u00033۱j웹\tCv`p\u0010>ݳ10\u0016v%%U'8V?\t_LHjȹ\u001c{<\u001e3&̬)8>'\b$r&cp\u0003{\u0016T`:\f\u00045cgP'v\u0004ö~ak\u001e?\u0017|^\r.l\n>/څCք|/\u001f@\u0007܎\u0003FcyG9\u0016\u0000\u00162\u0017\u001d\u0016]ұcq6-.Rl\u000ew/#\t\u001bû\r\u0011º]bO~qui;\u0015\u0019X\\\u0019/=R}F4\u0010XLk6c9\u0018\u0003\u001d\u0018\fb r&G/Ė\u0018\u001d$W|ٱVW.jձ*]إ[/vI\u001d!-\u001a;*ޕb$7SjU\u0010=c\u0019;\u00063Ҙ?\u0007o\u0003v$/޸\u0005ذ,\n\u0012Xn}\u000e+Ra%=W.H\tƄ'N\u0018Q?RjjWr^\\\tE\u001c\u0011kp4ri\u000eӊ\r2)I~<'yN\u000eGWJ\u001cV\u001aRn0͐/\u001a\u001cBBl4ԉ\u001eC6\frUe8T\u001a.j*\fw4eߓ(N*;ST<Uڍfրg_&k\r\u001at3m6:2BСŘ&r4\u0018s\u0005Hp\u001bbF66IUN¸Q.3TJ3\u000ejJ2q\u0018o؍\u000f5vߕ\fU~J*ٟD2j^\u0000'\b91M52XEk\f4g\u0005\u0014\rY\u000f9\u001dll\u0013+\nsXnHNs\\bZ8Lەb~MO馏[\u001fKդ*,U&5Sl#\u00165/\u0003Gi763+w.֧<\t\r9SG%\u0002չMEe^P/8bInuKŹmranbݪX-4y3>\u0016u\u001c˯\u0017\u001c\u0018lU\u001a'\rj^,^\u000fh71nF\u001bȘy\u0013P\"\\ֹ-B-\u0016΂d\u0014,Ǌ\u0002`/(\u0012\nbAAdHyղ֯dۆ4fi,5L}2dZU%3_S11׫=W̽H;\u0010Xx:\u0019O#c㳪\u0017Ep\u0016FIB81(rБ-\u001c6!Q\"ګ\u001c{dwY>ey&&\rMCMZ\u0013MZ\u0015r\u0018\u00054;ej\\\u0001\u0015A+XEq\f\u0014\u0006挄\u00192\u0003r˲S/d\u0005SYlN)ݹINuVR55I\u000f4)I%)RCm|Gi\u0007J%\u0001i\"ߋ\u0000k$UNj\u001er\u0016!ۥɕ,\u0011]\u0016\u0018]EBLHu\u0014W ]\u0003򲪣r|ը\u0012纯UUT\nU+Wg`/\u0017*\u001f!mMVXE]\rk#\u001fݳ\u000eFz}\u0014IEǄd\u0015\u0012A\u0011yZ8Z1~\u0014SIOrYSZU!ϸ\\R㻤Ž@H5\u001d5\u0006 IFJd$LEb<[ðu\t⽉f`ׂX.\u0012o\u0010m\u0012Bw{P\f\u000e޻bh'bh*6FU\f{\b\u001f'\u000eZa\u0007'|/^@\u0001,\u001c%#k&\u0016 jU8\"W-EĪdĢn+ºKuG|qX\bYĖ,$&niTUk_p\n\u0013\"\u0012$\u0012\u0012\u0015D\u0012ԒPJ2\u0019UcLUjj:Jϕ:Gr#y<꒕Ȭ\fg\u0015\u001a*]FhI#tM#44B3`i\tM7-a\u000b*tfp\u0016Y\rSa*gC~mw\u0014@^dQbOE*<7Ps#)7Fay\n믐\n\u001f\n̟\u000ej_v;\u0014\\\u0001y)`jc\u001am\u0017Av\u00033y\u001ff.\u0012f\u0002\u0013N\u00065`={e!/b򥈥Rpq\u0013/R\u0012?-\tT@iڔʿ4A~\u0003kS>jmVҾU^#_WOjY\u0016Q\u0004\u001ax?Vv&g\u0011\u0010R\\)\u0000\"K/\u0002ʥk%O<\u001c\u001d\bXp1P\u001com$5qQ cXFTޕe)\nSM4PIYhx>\u000f]B\rI\u0012ϕR\u001a)51JjIb۶\u001621\foc\u0000\u000e\u0002R\r\u000fP\r\rRCk(b\rWo\u0007vm7)\u001c\u0006\n\tĚ\u0006zrjE\u0003\roTK;$]++>v\u0003\u000f\u001e\u001a۽\fc\u001f~ǏZZ\u001a}-ͥbb\u0000j\u000fW#0G\u001ci%oFɺUh$/5?(\u0019G\t~\u001cŏc0\b$~b\u00009EQ:\u0004\b\u000e_|F^\u0005}\u0019I;l\u000b5wKa\u000bMchJV\u00160\u0000\u0019E:\\:Ǣt%B{\u000b\u0006KuL/\u0000gd\u0012s2y\u001e4\b]!\u0011T=AOI.\u001b?\u0000\u0013\u0012H+XMXPܥ\u0016\u001dq>gA*K\u0004\u0004c\u001bzM#c/v?>>~\u0016_zNo:pt\u001b\u000fp\u000f0\u001fJSjc \f&C0&51II1/\u0012\u001bg\u001dה_\u0010\u0001q0\u0000ބ10\u0005f\u001cX\bP\u0004+`\r-\u0013\u00176ПPOls\u001e&\\wV6\u0010\u0006=\u001f\f\u00110\u0011a&~j\t[Z=\u0006W^u_:Rt\u0005zm\u0016e\u000f.\u00054+k4xƠF\n)O</~\u0001vV\u0012W%qmwڡkڧ\u0018:G6|\"gֿl\"\\N\u001f:u[זjD+D1x4bj6\u0002plVcw\u001dvR\u000f\u0019+4gSX>\tίu/`@hȉ+\u0018f7r\u0016\u0000}!>\u0012w7%,gҹYn!Kkt\u001cv>\u001d\t<Z\u001fäŘ\r><r\rjrsqQA</::o1\fOE%\u000f=\u001ahG#\u0017{P-^9\u0011ح=څ'\u001fpS\u001a[m/`zu܂Ϋߔ\\\"\u000eD\u0011UG*:8o1\u0016h$M\tXN>KP_\r٤4*3ZzC\u000eǪljjm3S\u0015/`R\u001e\r_Z\u001f-\nN\u0013\u000e\u001a!\u0012Mho\u001bn6\\[\u0016b6R\\wϑc*=Vc=?jCZyF+n{>@\u0011<iGK\r\u0015i\u0007O)rN϶\nזѻZ.GZzִrZ3]+}fk\u0002}Ϯb?jԿV\u0005r\u0003(E\th!¤ϣxz\u001dήA{ցgկ6h*\u0002kux/{*0L\u001dFkYǉZ1I\u0005Z\u0012\u001c\u0006\u0015+'B[0x\u0007Լk\f}P\u001c\u000f~+OQ\u000f\u0000f×u6PyV\u0004WIHRaZi:\u000fZ\u0014>NZ\u0010\u00115/bF\u0016*#r#7\u0019i{YQǍԨ+ƌG(HyNd\u00037x\u001cg{=Ê6Wvg\"7\u0011\u001e*l.a\u001an\tZЭ\u000f跔\u0019=Js'jvLbR53f\u001ag̈YaT\u00192c?5b/\u0019Sc\u001f\u001aSbM#I̯\\%gˌ\\}2|))enE1>\u001f\u001b=*U)@=Da\u001d)fn$[\u0018I\u001ccuhuX&L;by7q\u000f3qFzWhD{o͌\u001d\tqڽ]iVK\u001d4+>B\t=5#>\u00034`%ۆ)6ZSmD{d[1ѶИ`+UXj,m\\Fλݳ\r1g$\u0005b>\u001e\u0001ã0{\u0011\tKH\u0010e\u0005\fK\"\b\u0004\u0002I&L2IfLB&$$C\b!\u0006\u0012\b\"ITBR,\u0014\t@\u0014!(\u0015}cV\u0016Vc]\nB_H\u001fg3s9|/>X$E\rҐ\u0010cU8E5IsT@U\u000e-wdґ\nG@2#Xa:\u0018Ŏ;BGYn;[ycq9.YK\u001c$\u001f_mq\u000eg\u0005.j]L,kc\racSUU\r\nTE<',ݩӣ\u0012gFsQ3Lw[,q+'+yN+fNj?g8IK+Mu\u001bJ,Ty]\u0013\u0014̈Qif3\u0017ȝ;K\u0005nEFk\\mǽvo\u000f[Vr_\\GF\u00069Ʊ\u001c\u0002lMԀxꉧ,'r`fE8;J9SU3GK=\u000bqɔϛ\\o@^o1Mfg<`9={4cVy+󱕒c}fCV?8+\u0016/\u0013n-xBRgT7\\c_\u0012-or}'w*Q?_n0\u0006#b&w[I^+Z\\xm&\u000e\u0013}$=\u0015o%PF</ot\u000b]\u0010̂\u0004e\u0004R\nd)=WZX)#H\n\u0003̈́.sA\u0019\u001fx\u000e>0\u000b7f|>\u0002x\u000f\u0016\u0016\u001fhA\u001d,B\u001deVVQ2#*RzTVj|&)ԥ`\u0012\u0001-\nV(!x l\u000fc\r4o\u000e\u001e2cؒbی-͸\"ۈ+c/bO~o&j`\u0019<HiX\u00161JEӕP\u0019\tZ\u0010JU|([C\u001b\nJņn3ڍ١\u0007Y\u0019\u0019\u001a3\u0001l1tzJٓЂ\u001aR}eeWJ>C5o(]\u0019k(FӜUʥ\u001bWj֪\"ͬFnԴnM=ɵ(zۚ\\16&gJm<\u000eh|Pu\u0000<ش\u0015\u000eZՃ4>\\3\u001a\ti\u001f7ѴxMmthJc\u001buC2Mjӄ6ii|qkzC\u001bz[Qk`mD#hl#Y\u0002y&\u0016-\u0016)\u001etS4\u001d\u0012<D\u0013[\"4eo\u0018oIZ\u0017jlkƴzu]kmu\u001aնYm{\u0014FWDlIIO\u000fݷ\nߋ^\u001dTB:^ZVŲNoA\u0014\u0011\u000f\u001eȎ\b\u0018Ή\u0010XX\u0011.\rӰ\n\rlPX&]ݹC;誎3\u001a~AWo5nlol$ϵYPFu+kYkf`Wѿ\u0017\u000fX\u001a5L\"5k̮I288\u0000ywYh$M][\u0001S\r\r\u001b\u0001\u0007λ\u0019zs)9[\rMLtH㱉T\n\u0014K2v\u000fW\u0019\u0019C3\u0006d//`N'\u000b@~:s\u001d5PBwK)\u0006w\u0016\u001fDҨ\u001ei\u0018\u0003pЂ\u001cvq8\u001e\u001d'\u001d&#aˁeaR#$p\u0010Kȵ\u0001*\b5o3s@\u0016;\\'E\u001fQ?*\rE7p\f~ۇ)=I=ӈ?5Jzz,0቙ٳ\u001c\u0016K'\u001d'x5Wh+-\"lMg\u0012x4#JÞ̧<\u0001'9=?Wь\r1\u001f9 e2q8ρ\n\u001bU&. רk\u0017[mH}+iޯ\u0018p#\f;9<\u0011K2\u0002M\u0007f]j>s!&\u0002E\u001c:TKXܗ\u001e.S\fp8.jkaR\u00023н\u0014AWe\u0017\u00064ހRbc/\bL>e~>g|A\u000e`\u0002\u0014\u0003fNm\u0017\u001dh\u00185@8\nq\fP\u0000`%:X\u000f\u0019\u000e>qBx_]}%~1%\u0000ޅ&V\u0000#\u0007\u00047B\u0002\u0007%\u0010B\u001870v\u0007ޯեh>g^}~$%zE\u001fs\u0011`@}x\u0013ËWb\u0018\u0001Ca\bA\u0004DA\f\u0003\u0007z,EL\nF\u0005e;\u0018{\u0003v0-[nrt#Lq\u001bjh\u00058\u0003Чm\u0006>Gu\u0017lꖀiEP0'oeX׈<qL\u001c/\u0013YY=-s\\yL\u0019ǿoΆ\u0006\u0002$@Ä!\\0`\r\u0006cm\f6\u0018laCH %\u00079HPҜm\u0012%Ҵ94R4G\u001b֩iVȦ-4e/\tҚ')'tpgS\u000fxx\fƬZ\u001aQN\u0015\u001d0]s?\u001bu\u001d]\fW4#={ԌOJ5*:t0#4qVN|H\u001f\u001f5*}\\.I\\\\\u0019΋xN.y^s\\٧'y\u0005\u00003\u0005\u001e1n\u001eS4[BxS+k)\u001aj9\u00186.jRc\u001a\u001bsNui$\u001ec\\Q4W9sf92\u0013^o\u001f:\u0011\t|\u0014skL*\u000en45\u001a9\n+9qJxpBq|N\u001f^3sqL͛yphyLο\u0003\u000b`\u000b_ao'L\u00171u\u00184trX>?L\u00170?\u0016g\u0016pj\u0002JU^lb\u001b\u000ePx;\u000ew@x\b#F7b;&\"awQ\\r\u000e㑗#\u000eG~-QXM7gQ;O-SQp2\"\u0012G#\u0013q$*\u0003q`i9-2\u000bv/kΘV#\u0017cak\u00186X\u0011.\u001d#/a8\u00166\u001c\u0012`\u0019\u0012Cj~c>11\u0004\u0014_Cqy,$Ȱ31\u0007;V\u0014cJlYi$+6%90H\u001fAO\u0019PK\u0018L=PI\u0004SA&ze?Z#tI\b %UoW9R2\u0006y\u001bWP~Xa\u000fJy\u0001;RU496*pz9֧1ڌv\fd\u0011?\u0017}ѓ\u0015ݙ\u0011\u001fCM7!\u001cY'KG=2%|'>KL!rl/碗͙s1\u0011\r\u0004\fec [\u0012Do\u0001=9\rV8\u0010PxWtS9\u000e\u0018ڕ{QNUy^\u001f\u001f\tg#?¡\u00143m>\u0017K\u0013,;&Y\u0002\u0017gɸl`\\\u0006\u0015\b*cїy\b\u0017_΂j\n([\nOa\u0017Z\u000bp6¥\u0005jJ4\tꚰ>\u0013ªzB$a-@\u0012Sf\u00054(cCO#\t1.aV-EWQ\u0012|řh/΃D*\u001a.m\u0005\u0003^4aS$E\b0 \u0016u3J$a\"?JE>Nśi^\u0019t!:Q%,\u001dr\u0005\\\u0015pVhЬE\u001ev\u00036\u0017VZk`n\u0017&AaԾ&\fE\u0013QH\u00195咸Oͫz4KI='=\u0005駛q\u0011f\u001eܚ%piQ)CSU6UhԕêӣAgF\u000e\u0015&}\u0000F \fF@N\u0013Z\u0003OIB[%\u0019*%qX\u0002\u001f'{j\u0001\u001f\u001f}񻋿UZLXj`-P:\u0011FC#j\r-1tBo\fAg\u001c\u0013}Bc<!ʍ2\u001d6F\r\u0010ZIk$Q6C$nQm\u0006C2J_K}vo0R\u0017\rS\n\u0018M0\u00145\u0017Ƭ\\\u000b\u001eU\u0016'*-\u001dXQn\u0019EeBZb;PY~%T\u0013IL({:\u0002ۢ&`\u0007aۊ^q\u00075,\u000bQ[\u001fx2TYQX\u0000mc\u00194zL(5Amփb0T](\u001d\u0015D#R(\u001b\u001f\u000bU\u0012\rKz\u00052IA\u0012 mFV\u001clt69\u0006IP;2PPQb\u0016EN\u0003TF\u00148w\u0005Z\u000fk\u001c9Wz\u0003Y~\u0001o;$d5K\"%qeI2AFO|\u001b쀡}\u0017K\u0016\u001d\u0006Uk\u0014\n[\u0013P&C~[6\nA#c\u001a\u0013^\u001f\u0001dza0Vy#{\u00032 \u00056\ti-aU-8YO\u0012\u000fiɞm@o>r:#\u0019w#K\f\u0011V5H\u001bA\u0016 5Їf$\u0005&\"p\u0016\u000f|\u0004wHdꓰb\u000e\t|\f.&\u001c7P[\u000e\u0014M`븪o\u0011R#\u001f\u0014$\u000532\u0015R$\u0006uH\bY\u0010\u001fjA\\\u001b\u0011,\u000biD\"*cD\u0005AtH8M\u001eEN\u001cLm]'{\u0000\u0016LwX\u0015ǿ *\u0010\u0001\u0015\u0010p\u0000ʐ%Dq\u0004E\u0014\u0017\bׁ\u0010\u0014\u0011\f/B\u001cE\u001c\u001byj\u001cMl`֓&8֪16Mn?\u0017H}~~=~\u0005_Y⦎%(\t)Dn(/WS:`ʖ@Φ%r2mKʡ\u001c|\u00142Lh\u0015L\u0002cx, W<$Rk\u00113`\\r2#\u0007s͡jgQ[ ٙek,\u001b3ƛ\u0006vs\u0018Z+\u0019*P\u0010b[嵅O<i\u0010>Ηg\u0019\nS\u00153`Vj\u001deSˌ[ۑC\u0005h(u\u0014:.:\u0012.\u001bXn\u00190g<̙+\u001e\u0002[F\u0018_sa\nSyH1g`\u0014^.@Us\u0005$z\u001a\r4\u001bfp'Eg\u000b\r\u0016\nm=E'{x\u001f\u0016K4\u0004bX94s\u0006퉮j#MCd;srÎ]ر\u0007;\u0012ر\u001f;\u001ah\u001a(|\u0007F\u0001ul]pwr߇\r{)5\u0017\u0017՜ ݌>\u00064A\u0001p&B\u0007\u001d\u00064hΏ{Hc_N`G#I#ůK\u0014uX4`;1\u001f'-cٮqu\u0005\u0007x-tɞ%CR[1Y\u001b~ւ}8\u000369\u00064\u0017\u0019\u0012.H\u001fbU(M\u001c\u0002\u001am&>v\u000b~\u0004fت\u0003\u001bn\u001fc8!;ݪu\u0016.4\u000f@\u000fW\t9|\u0017\u0007\u0006\r-M\u001d\u000eywt\u000f{\u0004\u0015>S\u001f\bӆ\u0010#I\u0007?\r\u001f{YrU\u000b\nn\u0000GL_M%݁{ց\r\u001e0=&&O\u0019VۃA\u001ccYp\u000b\u001c\u0007\u001cdr\u000eXw@0\u001cC\u0006̄9P\feP\u0005`~aY̍;\u001f\u001fټ'\tK=\u0003=⭇܁\u0017uޔ\u0001\u000e_\b8\u0018\f \rl4r9\tscx\u001dƎi\r)>s]\u0012\u001au ~˯|\r|\r\u001a\\K68\u001dش\r+/cHgi?\u000b؂\u0012.c*Zkl7\u000eң49Y}]ZZ9\u000ff\u001blA\u001cM\u000fOŢ\u0012:#WϚdD</W2v\\\u000bZs.$\bB|D\u0004*VޅpنgOS-37\u0015V8~$`P]dO)㘁\u000fF֞\\.f2\u001d\u0012VGr!e\u0007~d\u001fJV9\u001b\u001e]|\u001c\u001d_|#\u0018ht\u0006Y\"\u001efQ\u0007\u0001;c^أj\"G&A,\u0017[Y\u001e6\u0013MY\u001c߶i9l\u000e숗Xu\u0000N\u001c\u000fnNaF\u001d[ȏ2\rd2\"\u001b62\u0000\u0016P\u001dY]n@yr,9lk\u001dtŧdX\u000f\"Ih$1\u00164429\u0011J\u0015Bb*_T\u0013*c1\nۧ*oC{\u0003S1\u0001ڝ<A\t\u0019<8~Zg\u0013նZfV\rղZnjMRuj?Sf9/Qb9j&-p-Q\u0015;]T-\u0015\u0004Ԉɏ>eo{g)Q~\u001ahAN^Z\u001c\u001a0UiEU\u0018\u0012Un\u0018E\u001d&h\u0014\u001aerU|w+Wr\u0015m\u001c]w?<\u001c5\u0005\u0016nk0I\u001b!vßWÕ_n/*}cJ;U\u000b*4X;<1*J\u001c,{T\\,POfӌov?)E]\u0019C)!\u0018*\u0018mU\u00062a.mTAE5k)7Vy~\u00037L9ɚ?^3kz7\u001dP\u00002\u0003VkJ6\u0007\u001eҤ3J\u000b&\u0006=UjE7%g\u0017az<+Ŗ7fn^\t \u001e\u0019jz\u0004M9X=G(\u0018eJSF,B\u0005W(5x&k\\A\ryOcB+%FXZ\b(\u0005.E\u000fQ6X\u0005U\u001e<+Ė|l%69\u000e\u0011i!]552{+w\f>4)l&MPjX&и\u0002\r/SJ\nج\u0006%E҈\u0007\r\u0012CE#\\\f06\u000fC9\u0014,\u001f{rh\u0018a\u001dVᮚ\u0012ɑJ쭉}5\u000b\u001a\u001f5D㢒46jR'ktQ\u001a\u0019@#bjxF\u001cOCcNjH\b,\u001a\u0012\rQ-נ\u0006\u0016\\Z\u001cZ\u000f#mP\u0016GjRRc<5>_b5&.R)q\u001ao%jd\u0014%ŧix|\u00124,ޤ5\u001a^Jأ\u0017\u0013Nh`'\u001aP\u0003-\u001a?<*?we1 $\u0000n \"\"\f\f2\u0002,0Q\u0010NHAA(\u0015MqZ5q4զM6mzĸ&ƚX\u000fa\u000f9\u0001}\u001b\"Ρ\u0002l\bX?m\r_fK1S\u0013U@Y(/ir'+; ,E&C2\f\u00152UZJRSdHPR>%RBǊO\r\u000e%$Hr\u0014T#,g=\r3\b\nb\u0018\u0014oe\u0006Ȝ6RpeE+#=Itsj\u0014L\u0019J26(\\MG\u0019'\u0015qA;Nw(4bS\u001d:F\r@Q\u000fU<Cq\u001a\u0006l6\u000e)c22PzfLJ5M\u0014T%eU\u0004\fř4lWy\u001b4ɼK\u0013`\u0010nkBC&0#Oa\u00154A\u001d̂`\u001c0eIFs\u001ff{Ȑ㣤@%VBnrc59/Yyɛ\u0012MDK&XZ\u0015aYp\u000eY)\r_+4ϡ\\qh\\C\u0007R\u0007,\u0006r()J\u001c<zn\u0014?e&{)_\u0005*\fӤIXtEXs4:M\nY\u0014jm\u00185ں]#\n~B:\u0002wh\u0014^\u000f0\u001fJ\u0001VE7Q)ٓ1jZM(TD\u00035dJ\"\u0014Z\u0012%\u0006)\u0002,-SHiJTj\u0005\u0011\u0015P\u001e\u0012F\u0014CC\u001cڞ\u0000\u000b\u000elP\ffю\u001b2\u0014_\"gT\u0019;sF{idB*\u0014\\\u0011H=Y\u0011@[F4V\"[l\rz&_V\u000ev\u0016njXCt8-sE4V@\u0003TC\u0019L\\F4#lyE_.at\fs<_-\u0000=Q\u001dǫɷ&J>5I\u001aVcwU^56=VS5Y!r>\u0003><\u001ce\u0003kz\u0005P\u0000\u0000\n)\u0011il\u0015\u0001uO\u0000y-P0yڇ>\u0012\u001e+7{\u00064>]\u00035o_pS$l7SO7=ϡ~z&\u0001j\u0002\"9F\u000ef3A(h\u001e\u000b\u0019ܚ4K}i~i<[dZ8ZL-\u0014P\u000bky\u0016gຈm\u001dlyh*^/|3Xs\"kĚC 7IÚ%%\u0012m\u0018,1ϵxXE#\u000bC\rN01Ҿ\u0014C\u0000P\"p8iFjz͚\r 5Jc{J\u001aj}?@\u0011?6f\b\tp뤰;YT':p\u0003p\u001czy\u0006\u0016bFc\u0017I7xZZ+ow\u0015^\u0006BmxB<v.c/\u0017>\u0013P\\wFzw>{pbGs֏\u000b\u000bŜC9VM(g\u0007U8\u0000@xu\u0017\bq\u001c?Nx;AEqu\u0011\u0017O/\u001cNj[9\u0017W\u0003<F^W]ZGMg\u0000_p\u001a\bb x%7ҠÏ\u0011\f,\\~gw-/\u0001MCOH9\u0018;b?%=].;\u0012\u0018\u0015zÇp9AeW\u0006Kä/\nM\f\u001ay\"\u001eujM穀5Z\u0012\u0012za\u001bqiȥg7`x\u0019a\rn\u0001a\u001d\u0006w4'?P\u000f\b_\u001c\\c\u001a\nz \u001c \u0003a:̂`&h65z=\u0013}oÔx$}L_\u001e6op\u0015\u0002\u00179o@\u000f\u000b\u0002`\fDA\ndca~P\u0019\u001a:۱߄V_\u0015?\u00064z\"J\"<}t\tK=|\u0002\u001fYxC?K\u001fWL|Y[0\u001aϚ2cA\u0018دj\u0019~|ʴ\tS\u001fټ\u0017T?QJ\fz9\">uq\u001aN\t\u000f?%\u0016wŗ̺75f/NLN>V\t1,v\u0015b{\u0001%Ө;[|;xR>\u0016<Z7tH\u001eCu8\n#>pr\u0012WJU}s_\u0011DщTMNΨ@Ə7𣋼:~\u001cŏZu\u001c\u001f[8}D|\u000fE\fBm'|.\u001f85go\u0015\u0006-/\u0011(t\"шZ:s_\u0012l\u0013خ|l6bsll29=ق\u001dlds\u0013\u001b\u001f\u001eۮ\u0018\"\u0016G'\u0007#$:D\fb]Pr\\l.`w,$\nϓTVWUD̮\u0011r]9\u0011 ];A1\u0014B9\u0006\r\u0003\u001a(\u0013hr4*Ѩf\u0003\u001e,R\u0004\u0016y\u000b\u0019ZDd\u0017+\u001aG#r\"p\u0010vrԾѿ+`ܵ^\rGk4:ıT-TiL\\\u0019\u001fYn\u00180˰/\u0003\u00002,\u00003,3\u00181\u0007\f\u0018$\u0013vcxKʭk7V괪*RRU~V.Q*Jc;R\u001f{;G:\u0001\trq+YȦcn:J\u0015\u000eFd)\u0001ﱰ\u0017G}VuWj폴~UeZr6f_T=/F|T\u001cg\"S8%S[K8\u0011]ͱ\u0006lsrx[\u0017}嘽,Lr fÄce.v\u001bLg2=&> \u00141,wvi9Tk%?k5t2Y$Dq\"n\u0007G9\u0014or\u0012j8`!E8\\\u0000IL&1B(iK{\u0004S\u001e\u0012H9#\u001f3j\u0014JCq'_vDSyʝi%S\u001eK,'r %pj6iLU1݌2ьQfL\u00114-\u00110`tݙ2y\u0017_\fd2LG_\u000fd}>'.zi{Xd\u000fU˜jɌf*3Y&w/\u001a4\u0011i'p y-0ws_c\u0002=om)]Ɲo6\u001bt=&ez\u000fX✖.kߜ,ȔjٯZ͛ٗ\u0017\u001es\u001a\u001c\u000bJ\u0018*fwa=V|En\u0006+\u001ax\fO\u001c=ūt\u0015?*\u001d%o^\u000eΒ\u001fVGa<Ywe\u0012\nŪI\u001fW=\u001af8%K\u0018(-޲Z\u000e<.z*<tU\f\u0018b\u0006e\u0005e6\u0015Z,l:M\u001f\u000f񔊧#\u001b|\n\u0017ğ\u0012bFk\u001eգ(ǠYgI[LwU\u0019]V\rtTvn\u0006iNb[a[ѶA6vר \f꬟RmvBCYcbAL7c~اz<(m;pפQ\u0018gm%muvZZhG}F~'&=US]g<][Q49ܠy ; ߫ZUS=8\u001aRhmȢ\u0000Gc\u0005M5465䥮iZ86<ՎT9.`qܠ\u0016eG:~GYӿAyAE]i,{Iߡ\u0016bH.\u001dwiۦ\u001cCSs\"\r-\u0019Էao-zlmmXۺnS69G(\u0017(q^B\u000f(pRjP7tՋd\u000f\" |#\\UK\u001eMm\u000el4l:\n`騥N:)C{B*su\u001c\r9  enpS?\u001fuBX!'Dk;4(>ֺ\"tQޓDY\u001e3%R=V\n=\u0014xz1{GN]a92\u0012k=c`~53t\u001e\u0017\u001eRLrH[\u001e(m\u0014\f$`\u001eH#Ϸ\\_!9\n}ue1\u0007ӿH4)$(~I$\r=5XE_Z#_t\t^\u0015}Wt,RT\u001d$k$\u0016S @:;\u0003\u0005I\rT\u0012h$9\")Obp/\tyv\u0004O\u0011\u001fL\\Mb&&+#rrC\u0006\u0017|ǥ\u0013\u0016Ġp!\u001cҮZ\u000fj\u0005BV\u0012Cq$Y\u0011\u0017!6BLaCSl\r\u001daTd\u0016\u0011o\u00101\u0013'\"\u0019l\u0011gqHL\u0018\u0010ݢէ9(Ji\u0017+\"J_1uB\u0019p:ع\u0018\tDS\u0012bsMa}aܰn\u0012\u001e\u0013Bywx\u000bfkf?T#VJ٭aH=Aa+\\89\u0007JI_4\u0005)ҟMD\u001dZYXI׃(O\u001dRS_US[Ƕ\\[U\\=%=@vP5,\u001bO8\"Y=\u0018%]6mzI0H_)K\u00100l>.wR\f)ZL\u0016\u001d-vj5\u0016!/Cp'V54Xք,(z۩g\u001c\fC|D' z\r\"9&5x\u0019\u001dZpT%\u0016\r-v\u001bz'57`\u001b\u000bBcㆎS}&T\u0005yi0(:5\r: \u0014HtR\u0010w\u0016Kc\u0006)j<)^xrS긭\u001dMz\u001a[\u001c9\u001b5Yi\u0006Gcݲ9S\u000bOkI7e.5\u0013ӍB\u000b2\u001f\u001a{2ce\u0012\u000fe\u001e\u0014y\u0007\u001e(\u0014Kk]XX\u0017Xv]`\u00179\u0014\u0011\u0011DP\u0011EEE-}3Ѫ68ƨ\u001aǚ\u0018\u0003&\u00135UcըʹMG\u001a϶&iLL9l?\bqg~e}yG㣍\u000bY\u001b&FaV\u0006\u000f[O?r&\u000e4\u0011ݑ\u000bCƹ\u001aߢ\u0018ԩ~?\u0004p\u0004\u0000Ҫ\u0018\r'Ki.g\u0004\u0005]\u000el\u0000穋\u000bL\u0016hݷS\rc\u001e)\u0019+\u001bC7`?vj\t$\u0011ur\u0001.{gx\u001f\u0006hV.37k\u001cznP7I7M;*D\u001d2f;y6U+\u001f6S|\u0007}\u0003.\u0003U\u000eXzM|;]j\u001esrE5zH]< t9}\u0017\u000f\"\fv@\tZ\u00023a\u000e,\u000ftS|\u001e=\u0013\u0017t}M\u0007>|\u0001\\sOzO\u000e \u0000B\bVȆB}24FQG@\u0006\u001fǗ\u00059\u000b3ЕbA\\\u0019Ru!u>}\u0004p\u0012?^0z\u0006ݣ׽C.RC('~n\u001a>_~fb/%||\u0011\u0016%\nx\u001c6\u001dOt\u0016k?\u0018Sn)q\u0018\u0019G>H^WBԟq\u001e\u001fsϨسu\u00048Mhl6uF\u0016\u000f*\u001eާ<k1N161\u001e){\u0003:&2\u0015l\u000fQ|#&x\u001d!MgM:\u0003c\u0011\u000bw/w\u0012Ec\u0007j/v\u0006wzYΗ:Irq\\\u001c.\u000e+\u0016\r\u000b\u001av*\naڃI$bNg\u001bkb\u0016\u0016\u0012w%[z\\h3n6\u0011i#7PP]I\u00034ou.w:h?K.vi\u0000\u0013nEA\\\u0017\u0012\u0018G\u0012{4XKIěN\u0006Rj5\u001b*\" /rfu)f)OUp-q\u0017l'\u0017eZ!#1ѰɌi\r>Vc%>V2e\te摍\u0015ϯ\u0011i\u000e\u0019lJfSQM49αͷ\u001ehf\rx%{Z\u00051p\"ơ4-6\u0016o,P\u0011\u001a\n4jИTm\u0006n\u001aq<Me>\u001a\u0015_x\f\u001f\u0018\u001cy-5\u001c+\u00028{wn}\u0018W0zh%KdhVWfvWc!޽LӺR8MI~Tc&X[Us<1=/gj\u0013jb(G\u0018ˋl\u001ba5øp\u001dh\u0000?\u001dYC\u001fif5iJ_&U}\u0002M\f(Q]H\u000fѸ\u001a\u001b8C5\u000bT\u001dFU[U\u0019W\u0015o<=\b\u0002\u0007ߏ2pFq\u0015Z\u0012#-93#gj\b\u0004Ҕ\u0005>(B\u0013\u001a\u001flQmp֘~\u001e+~e_UC,dlְ\u001a\u001aڪ!\u0017T\u001c~\u0000\u001f\u001d\u001c\u001aq\u0002\f>O\r\rИ\u0010UEktI\"\u00062¡\u00119*\u001fP\u0011\u0003J4<BcUshl\u0015\u001b+\u0015\u0018v*pX^9yn)/1ON\"C\u0007m\t\\e83\u0003\u0004\rOoSxʨ~*Ԉx\r4&]b44֣!q*\u001b¸j\u0015+8K^\u0012\u0019+ǸC.!eǟQV\u0011p\u0012\u0019;86\\E\u0017@#$\u0012#R\u0016SA*\u000fЄX\u0015\u000f4hM\u0005\u0003\u001d\u001alQP^SU5mn˼HYL.G\"\\i'ބ}O0t\u0000\\{\u0001L\u001a8g5G~\u0005/K)^&vWQb\nB48)J^K<\u0014YMv)'9_\u0012eT(3VΔiHgf&SJ^@\u0014\u0006%w\u000fM.rǆP2(b\f\u0006\u00194@nQ.[lL͔3#Gj2R˕Nc [\\Y(9yY\u000e(1iW\u0012S}Jjnts\\N-ک\u0003r>@\u0011);҃i\u000f\u001e\f\u0019Vgd(͑TG\u00069du(9Y\u0016g\u0012drF\twAF2:)SB\u0006}ځγ$\u001d:P\u0015\u0012^\f,\u000eg\u000f3\u0003_Y\u0006ٲ5(ۢt%ggWk̮*\\Jp5fuoQeEຬ(]Eg\u0010S\u000bWg\u001fђL1P\u000e%P\u0000R]e`Yr#\u0017+sY<\u00069Sg<\u0015);S\u00062Ez7+;y*sIa\u0014SDn\u0007[X,4&rP\f^pV,o4 P\u0005!2\u0016\u0018\u0014Wd\u0014\u0015U薡PE#\u0014Q4NE\n-ZE'̃>8\u0015\u0004dY]p9dj\fF\u0017\u0016EvǮ\"\u0016!fRzD1j56$\u001aHӚ1Z\u001bsL5Gڴ4uS\u0013v~\u0016LǇ=}}}J,}Zҗe-=/kMي\\!iZP[\u0018Ohg\u001dJ(<E{,#K!ʨ4+iS3EL8\u001c#+W\u0003]EJrdsZ\u0004W,͊wXfQ\\g\u0015.s%k=~FG!\":P\reP\biǳ\u001eUF\u001538dw\f\u0012$ٌ4Y!J0FbW1U5劫Ƨؚv\u0018\u0014e<HyE\u0018g\u0014\n_+\u001dTtuPX\\~ ZpA\txA{\f]36:<RJ\r3HY\u001aLZe5Pw\u000f*ʛHoy\t\u0018$\fR^\u0006Ɔp`\u0001}t\nV@\u0011L8GTKC\u0019\u001c3N1ϊPX1}\\~\u000eu?\u0007Mg\u00183g!0C1\u0018Ü`\u001fv\u001e.tޗTgY\u0003b\u000f3\u0006g\u0018\u0006`6Ffc!\u0017\"\u0000]7f\u000b\u0001\u0002\b́v`\r0D.b8]`.\r\u001fZЙM\"ׅ\u0010ziXdt\u000b$s\u0014\u001d\u001eGJ˘+;hv:i4\btsp]f.\u0007\fu3gv\u001eyg/p9\u0001|\fG R^'ĜCxZHeR&4u\\!c5~!\u001fc=~lu\u0013\u001bk\u0013؈qC}ڠ|S:N^u<jU\\>\u0016~\u001aԏ0h.CM&\r\u001fl\u0005X\boӈ`]~\u001f񣇋5顸{\b\t\u0002ٽ\t]k4N>brK\t$B\u001f]\u001a)f\u0003:[`\u001bki8`o\u0001g\u0019\u0002g~rr9H}\u001c\u0019;¥{\bEv\u0004$\u001e9P\u0013\u0007,z)YJ\\BcU?t-\u0019=7\u001f\u000e\u0007\u0005\u0019\u0018\u001eL0cQq-)8ť|<B$\u0013$!`=޺!\\D|f)xROhXux3<\u0010\u0004Ҫ_;\u001e\r\rL\f\u0006Yc'E\u000eK\u0014e\n2A]ؕKpS9\u000b(b ǉP!ݟ+a\u0013p:+5\u000b\u000f\u001fp\u0019H>\u0003?ct$`]9sMxB\u0003@\u0010w~Ǆ\u0011\r\u0010\u0005q`\u0014\u0018\na2B5\u001cX\u0000\u0001XQfe\u0007zE|^&WT\u0013_?\u0005x\u0017N\u001bDH\fx\u0000&@\u0001Q\u0005GՠoLNי1]e\n\u0002?>Ǐ?Y>c2\u0002D|oI9d\r\u00038\u0003\u00158>//w@<)3\u0014̤\u0013\bN\u001bL\r\u0004?>ď0՝\u0000?{wgROyN9%x%cd5\u0014^\u0017 \u000f\\\u001f{%\u0011e3\u000e)/&.l\u001bخlln\u001b应wEVوvϓ:^<@G!\u000f\u0013\u001b\u0011.b(\u0004?\u0005hDc\u0002y\u00122Ķ\u0007uDڄ]?Sm+_qх*?J&v%} \u001d(n\u000fC\nD:\\fkm\bt*\u0011t\u000f3z\u0010s<l`ۉm\u000fgbI\nR\rK9Һ`6\u0001o֓ul\u0003\u001atj\u000b\u001d3\u001eI{nYа1\u0018f\u0012;L5bJqaxE:d'ӁⲾ\u001du\u000e#zoБFBWA\u0004\u0016t\u001b\u001ah\f!#\u0018Z\u001fх\u001f\u000fG'~,#\u001fO&\u0002Z\u0002D\u0010X\u0016\\@m.6n\u000es\u001c;w\u0016ޯ\u000f]\b{d\u0005XN}v&\u001d\u000fQhdk&Q,E*xШ\u001ch!##|B,֣\u0013r/!\u001a4G\u0011\u001eZ-\n\u0011uT&bV&ֳ\u0019ndt\n)C\nZ2ш%TJ TO\re?<\u001dq[Ƞ}ǸXƑ\u0006`\t\u0005\"\u001cmּ6͍LC4+\u00015F7:G1SU\u0017S11\u00012b}r.RulLTi*M0\u001dWn\u001c/G$3\u0012\u001d[kK\n-\u001fƟ&\u001bXdWy\u000e͈\u001fQ2c$@Ֆ2UYԩ2a*\u0012\u0016,aJ\u001b4Kګ\u0002\u001bʷ~|!{N`8NZu\\\u0019\u000f>7]\u001d/Rk3ɰZ嶥jm\\L\u001cʤ\"iʒUTZM\u001b8K\u0003[T`T}wj9M\u001cE$QnrvJ\u001eˤ\u0006\u0003\u00043i\rƗR\u001c-gE\u0015)v8T:Lũ#5-u&0Pi\u001bєA^M\u001eԬI_\tەO_\u000b\u001akx\nG҂Ҋ.\r\u000b`+ܔ9\"T0k#Q\u0019i*\u00187e\u0002\u0014yG(\u001c\u0001AuY`w]`e]]\u00156xM0xD⠉h\u0018hԦ:M4=$\u001a\u001bΤvI\u001c۴\u001d;\u0001^3\u001d7{y{wiJ>SMM,)O\"\u0017t]-)\u000fn~]6p\u0007\u0017Do}=׿%؃\nM|!.oNP9M1#U3&_\u0016,\u000eU\u0016VSSE\u0004\u0015嶶i] u.XwzH\u001fb=\u000fx\u001fpgي\u001alA\u001d\u001b\u0004S!|(^UEUY\\QYM29m^a,-\u0012<\u0015ٗоY\u0016.\u0007e|9)-\u00020pvӍ*\u0007-\u000eM0\t&]\u001d*pĪ̑,Wi*-5,TRŮ:\u0015&5U\u0016W27j{/h\u001f*u]9rFc3e.\u0001K\u0010F\bB|P\te;GYli*.RQy\u0015\u0016\u0015Ve(S^&OF{f)ӡQ\u001b]FV>L+\u001ay\u001f>FG\u001b\u001c\u0003\u0015\u0000\u0016\u001c\u001c\u001e*^\u00143T͑[|oF׸[SQ5SӨ|3kWo2|ەۯ4\t\r\u0005\\UZ\rFoTQ=Fh.&\f\u001fB\u001a\n}/\u000fP06Fk[\u001cyoHCY\u00012\u0003u\bLRz`\u0002\u000b\u001aXmJ\u000e<q%\u0006(YI{J*6-h\u0011\u0006\u0000P\u0005e`GZ>-o\u001ccB2)\bf(=\r&\u001arkxȧPPɡf%*!BCC݊\u000fS\\bo+6\u0007zn\u0013ڌ5]\u001c0\u0011\u0002P\u0003\u001ep]\u0019W>mĤX6&*%p¹J\b[4,p\u0012\u000e(.ܨ0\u001e/\u00046\u0001&|f,4b\u0002\u001a96D\u0007x5ƌ\u0000@=\u001a|mA{D'\u001fRb45AC[R\u0014\u001b@pDT#EM\u001daP\u0011<\u0004\u0018\b0iB\u000eS\u0003Bc\u0004\u0005a<}P{{\u001e$7eh\u0003\u00126ugrј?\u0003v6\u0007ʜM\u0006ncښ\r0mx\u00069\u0007c8\u0002G\u0007Xf\u0014H\u0001⽓1[\u0019s\u0014)\u0005V)m\u001c)n\u001e\u0017\u0005ql(\t\".\u001bɣ=åM$w\u0010c:<\b_O\u0003&\u001c\u0003(\u0002ӧ &⩒i\u001aX\ftSK(k\u0003\u0013Rˆpp\t[eg%yt2'9drcN/8&s-[\u0010ֳ\u0019\u0001ji'7U\u0001j\u0006Cm^0\u001b}ƛnr\u0014\f]\"W4\u000ey\u0000\u000f&걙ztG7B\u001e=V6,Ԣ\u0002\\\u00121ovaM\u000e]QD:Ro\fig3tt:~͍\u0005[`+<\u0006\u0005(f\"$<G/\u0007r/\u001b~/\u000b\u0001~\u001d\b[׸q}\u000fpԹ\u0001Zj^L\u000fR\u001cZ(\u001dDTL棆\u0016ˋkś?x\u00110\u001eAjrf-8F\u001ecNGgZ.\u0004x;\\ qSY\u001bS;Z{\u0003\\ٯ_\u0003X\u0018\u001fb\u0002S@H\fؠAx\u0015^\u0006q\u00034\u001b[4ُ\u0010zq\n\u0017q]\u0013C&\u001f9\u0018x\u001d1~cI\b27e\u001d8c\u0018~!|D^ KK\u001cX}4Y\u001f+]$>#I̯e'{\u00005N1bh\u0001o\u001bf=Cc@\u0007~\t\u0017Wad\u000b\u001c0\u001f*r޸ΞqM&:$fϼɀ\u001d$\u000e\u0012`8dA>ؠ\u0012A\u0003\u0018d\u0001,-=qB\u0015\u0001~#M][}wu\u0005\u0019O|ʯ~\u0003g\f\tr\u0017yA\u000eX\u000fzEa \u0005N\nn2.S\u0016Y4yy]C4\u0003b9eh'{̻Ja,#tZ\\S\tZ\u0015!}5}L\u001e\u001f>U3\txG;h^\u0010ms\u0002{V3]8\nJe|I\u001aN\u001aS\u00184\u001chT\u0012O[}?#ĞIybZg)W*7eƻ\u0012\u001e\bjArz}\u000e}F\u000ew\u0007ㄧ\rSh\u0011GV4\\ԭ~b\u001d&Tb n\u001b_}ث\fѫm\u0003M-v,ϵ\u0013'`\u0007|\r\u001e/\u0016>g,ƒ8B-^T*G\u0005_L|7{٢\u000e\u0012mӉ9:\u0012w\r[i\u0017ɨ\r\u0011Fܤ\u001a\u001d`\u0013<\fW;k,Ex\u000eNT2yg\u0010?fۈ_FtA7\u0010\nZ9\u001c#9NZ֓I:Y'\n\\9y\u000f\u0017v\u00182\u0019\u001aÈ?#\u000e\u0013K\u000fB\u001bh&t0U\u0000jg\u0018BF5\u0011׏p\u000f6Xf\u001eƱZtR'e\u001e]o\u001d;v.p8qNlp9\u001c&MNv-mvJWrT+[v\rh5[@QZXA\\1&\n\f\r\t\u0012\u0013\n\u0012\b!:'}<_+Qˌ7ъF\b\b\u001aQ4$M\u0012,c]Ox\u0013aYE\u001bVW\u001f^e\u001aN{{J;Q>!ctM\u0003\u001d\u0017:^FݏN\u0018\u001et\u0019f6R;Ih\u001ea\u001e:fmMEQ\bڣ\u0019^C\")RQX\u001cs<\nuM!}*F\u0014jT\ftj\"W\u00065=dƲ7k\r\u0007\u00157,jpV\u00037P\u0003E,+s_ܴb%4J{JCvJ.Ym\\)Weʘ\u0002&+W*ߩd~\nZ4Z\u0010HAD\u001a*@\u0011#S4hтk\"6P\u001d:M\u001fAZ]ƴwRIJ\u0015\u001ffa\tX<\u001a1ٔ09\u001474dnҀ9~sb}\u0016kIieF\u0011˜,\u000b\u001cWrFAeY*]\u0006\u0000Yz\u0014\u0014J9ZM\u000b\u001b`\u001d\u000e<\u0017ĉeȖ\"\rX-V\u0006(b\u000b֣.:c\n7(hߡ}\n\u001eSkj.7-}G\\ܓ\u0015<:B %CYX\u000fc)O\u0007/;Qb-SOYrʫYVI6\u0005+^\u0019UrD~ǤZ\u001c[ث&xF\u001eǋr;^\u001c\u001fɊp\u000ehƒ8$:j\u001c0.kQmRD5\u0015jq*P mZjj\u00199Ffy|Bu|A5WU|\u000b\u0000\u001fqOPٍQ4`\u000bz=^0>Eü^P.Z\\jvW]/ۧv5GT_?(g\\.&9=\u000f<OsQ*|_\u000fWy=\u0015\u0002<Mۅ%\u000e\u0000\u0018\u0013\u0014\u0016<y\u001bjhTNnWꚺT\u0014SMӘ|\u001bUW|'e]P+'k߲5euv\u000f7\u001d؈MK6B\u0017x\u001efhӼF\u0016ZrFխ\u001eU[USXe)\u0003;U\u0012xTe\t</s2\rJ\u0004\u0003n\u000e@?@\u0007ڠ\u0005\u001aw\u0007{\u0005r\u0004ͪ\fT\u001et,R)CzT\u0012\u001a^/Kx\u0014%\u0015_Q~6\u0002`ZEpb\u000f\u0004ǡ]\u0010\u0004?3DOiZޙ#{Q%VYˠFGőV#2Ee(Y\u0005=ʋ<\u0019\u0019\"/)\u0016L+\u001c8Bh\u0006+A\u000ehy\u000b4]vU\u0017XYlY\ndeT\u0014TaԥOѠrcʉ\u0010VV\f\u0003\u00130ˀ\u0001o\nU\u000eNڟ`\u001e \u0006\u0010\u0019+/hנ]VG%KL*ʐ(SvM`&\u0018\u0004\u001f$\u0006\u0001\u0003&0\t\u0004F)~\u00030\u0005C0^e\u001fo\u0006C#\u000eY;]#U\rb\u0019\fg)4O$I-Y@Oqئ)\u0016X`]\u0012x)k\nӘ\u0001$y\u000fҫo3h$a\u0000z\u000fʵ5ЏK\u0004fmٓ)Ý7́>A6Á2\u0002\u00033|43\r\u0001#796\u001f4U_.\u000e4&a\u0018b1۸zs\u001dVW6t-ribAL\"c+\u0005ǶDObIcN9TYPs46Ǉs;0c`w^@\u0018nwUf\t5V1!a5&9f6Ԍn&<V\u001c<\u0004cw.,㱗8\u0011\u0001\u0012\u0002\u0002\u0002\u0013@c\u000b<?\u0000xWx[Ǩ\u0012\u001e)`v3֭㬁\t\u00065O7XޔF|\u000b4G!ZIO0/G(Ǝ2/ǈc\u0004wdsMX,ґ\u0000s\t*cأ`wiGoX7n\fڂ>لnތc+Z$\u001c_-xIL\u0001|1yyuz8c}:`?Ggis\u0014yǼO& \u001dٷ=0ۃ>9g4OdNi8)<|\u001e.\u0002[O\u0018+q8O^aX\\\u0004ūÚ\u0002RZ#u\u000f}g\u0017\\\"ӿ\u00193\u00120+FH\u0017a\u001eW\r\u001aMqM\u00167-:u\u0013\u0017q\u0016\u000eSu_qp?a`\u0014ә>^h^\u0018\u0000;\f\u0003s͌I.1\u001d\u001d_^\t}\u0001\u0011\u0003C\u0002~\u000fw=ue|\u0018>r\u000e,!݆!ytVL\u001dX1K\u001f/W[\u0010\u0019e\u00122c̦Z^ً@'~y\u001f\u0005y_=ͫ\fO8\u0017v?;N\u001cǱ%n\u0012;7zImvݺ6[E֪]\u000bB\u0007ҁ(\tʠ*\u0010\u0014kT.T`\u000f@\u001b\u001d`m2\u0012sQS>w{y\u001f+8\u0003!hn\u0018\tX\u0003\u001e_8wp@7)\u001b82}]c^e\u0000?̫\n<\u000e߅o79|\u001eNFb-COoc\\#Wp9/|^u¹\u0003|<~K\u001ehM^#80lO1|e.c\u001d\u0002_\u001cރw&2؉_3/^P'\u0019=C%i/pZO~\u001b\u001b|1!}\n\"zARB\u001bLy\u0010,|\u000e>\u0003O\u001bsyx\u00164c$csyy0;G{\u0014\tW=hϳ<*wnY6\u001fe6NY\u0005]adZy\u001aN8K΋eT/·df\u0019\u000b}?\u0019edNa\u001aA{\u001c)tg\"֣=Sqy9\tܯ3\u0018\n\u0018OTna\u000f\u0012wj~\tm+'\u0014`6@;v\u0006ahO0y\u001c$\u0003>f{;{n2ŵSϰހ\u0002a\u001b<_֜B~c7E\u001fE]\u001c\u001e\u001e\u001eT\u0003K\u001e2/{]\u001aB?J5hgI\u00168Zrs̜y)u&x\"\u0005<\u000e参\u000bǃ-hQt\u000f\u00101\u0013\"Eo2KnB>@6X=GRf\u0019f}6C<o'G\u0002q։J\u0001ekC\u0002}7Ƕ\ba\u00181\u001411-4+f\u001d:Ol#\u0003\u0007\u000b<+x\u001br\u000b\u0002d8rD.\u0004w\u0014-\n2\u0016k\u00199s9Y޵XENf';VR\u001f+\t8WY\\Nc\bo5\u000eR\u0003T\u0000#߯ \"g\u0000~m0\u000fa{i\tgXV\u001dq\u0011;\u0004HV\"\u0013\u0019\u0019/4\u0019gt6覲4+dgdG$~\n>Kc@\fZ\u001abKI\u0018~hyYE6\u0014VhF~\r,\t)Y}E\t\u0016SQiT]ILkiS;,>Dj+>V%%9ib\u001d\"6N\u001f&!\u0011\u0007\u0005\u000fˀX\u0003f2ez˪cU99Ty:;QޣeJZV2V˼\u001dj\u001cQAE-\u0014\\RrU!u9E\u0004q\u0012s\u000bm\u001cohn0*]7t\u000bԵTiU)C\u001djꔴX\u001aSҤZnicƄYEy\u001dj0*h|JTgX>E:'?\u001c'n݅=XK۳|\u0003ý49u_;-s\u0014)(WaQV+\u001aTѦhEJ\u0011gά\u001ak\u0014pnr*\u000f[yZsrW^Ru\u000bpSngN5p\u001fw\u0010oc-u@[>\u000eC\u000b)\u0013VB.1WljtU(r+RW:긂\n\u0010ܫuonk\u000eUsJ5_#9ϫ}*s:Ļv|OA?t\u001d\u0012bqo&FxL\ny,j+P[ZޠMyu\u001b7)6U>(g\u00019|'e=\"\u0003|Ru\u0019ޜp\u0000-ĺV|e:^$Z\"s\u0001~|KwF@܁\u0003r\u0005Ҫ\f\u000e\u0019d%\u0007\u001e\"#O\tY_%xQgT\u001exS\u0000J}N\u001fBw3h&h\u0007\u001bڡ{\u0010\u0006Pa\\a.UF|rFBt\u001e\u0011\u001d-:'kt,=2GWY!D.\u00145Wi8{\t5سly\u0014\tCc~\u0017\u0002;7zUSr\fcN\u00191\u000f\u0004d5\u0016O\u001aQy|Lj78SEc*hct\tU\n9?ހ\u0014ڣس^V>7CPǵIrag+Z\neʖʚpȒp1xiE%ɔL%I\u0015$1\u000eILY(\tIpB'P\u0006\u0012o\u001d+h{\u0007$qh~\b\\r߅uc\tH\u0016^\"sʢ!Sʩ%)\nS\fj\u001fV\f`\u001cV4NaRRRl֝I\u0007ّ]hϠņd6h3\u0006\u0010\u0000/\u0013/\u000e<P@\u0012\u0015MM,\"ϰ2E\f*\u0000&&C79ų\u0018>LH/S/9t\u00075Hu\u000b\u001ai࿏{vw\u0012\u000b\u000f#\u0001\u000eA<\u0010\u00070\u001bsqs\u001bc,\u00181\u001d\u001b\u0004|\u0018\u0006rl7mF1f#+>i\u001d\u0013<>\b]s\r4y%\u0001lH*\u001aP_rsN0\u0016+8t&ܧH()^b\u0017)<v;[i[A:A\u0007=A\u000e8\u0016m9d E\u0004\u0011Aĵ\u0010$+\u0015\"o<8ߐ;ݼldw쒓\u0010\u0002!\u0001\u0002\u0004\u0012 SAn\n G\u0004@e\"\u0001\nJGC))\u0003RZСP\u0004flikRATe\u0005j~Nξ>\u001ce`.ɐц\u001f\u001d?:񣛜\u001b\u000eM'\u0000х.;\u0011q\u001d\b+\\̎\u0007\r\r'\u0015)'/a\u0006S}\t0Pc\u000e7!g \u0006\u001ey\u0000?\u0016Q\u001bK9d%\u0014\u0012\f.\u00005u!\u000f}0\u0014klV\u0013\bO)^\u0003ތ6)\u0003\u001e\u000f`\u0001\u000f{`5=0XI}ƏuaK}u\u0018\\kWr@n\u001bzcyGY<\u0016D^%-ći 5M7a&\u0017X90\u0007Os\u00006&j\u0005\u0006>괟\u0001d+\u0007V곟Xl!y}K\u0018؟6S\u0013ϟ!\u0016\u001fs=U|R<\u001e/hr\u0005뭁\u001b\u0013H(!0\u000bX\u0016\u0012BqaC*5\u000f?\u000e+\u00078p\u000elI>|\tL}_cuM;9`ͅ9x7Z}\u0016\u0000\u0006k\r\u0007\u0001-Ǹ(dD\\,\u001cFN\u001c?#'')\u00133\u0010q˥|x\u0002Cul\u0001b3׻Z>W]y\u0012D&Qp\u001c$\rU\\0\u0005!Vs%\u0012q@ϓs ,QTg~)!Ļ\u0018<jg\t۬13 BM\u0000[\fI\u0003\u0002\u0005>\u0000\u001feW9IнFsƺFA}\u0006\u0015\u0016pC&k\u001f@&0@>\br0\u001c\u0006\u000f\u0001u-y\u000f\u001ds\u0007%\rkTm\u0005r\u0000 YWI\u0015e\u000e{1܏-S׀\u001fCX5ȵG6(пјwU\u0005H}r\u001b:~\\e\u0013\u0011M!\rs\u0011?Σij\u0017OZ{$U1\u0017#1J\t]\u0001v[>\u0003_mp\u0003mu\r})\u0013'hЗ\u0017Q*\f8fy\n>=\u0014w$)\rt9\u0002Ïa|$\u001eљY;6\u000f\u0005f_)\u0003\u000fb\f5خǶ&b{\u001agbx\b\u000bO)5d\u0019t;mG/Q'*;\u0003)p\u000bXUf{\u001d&\u0016w\u0007Ѻ\u0007ИP\u001bn\u0003\u0014.\u0014N\u000e\u000eVjd\u000b~\u0011E=\u000fKx:\\?דDt\u0003O`\u0015X\t>-`\u0012U\u00062K@\t+\\gQ\u001bQ\u001bH/5\u000e?z\fORz^Nl߰Ǩ\u0018c~\u0001g;h$\u0007\u001ci=\rlYnl\u0017\tWP:l7`{\u001c'!n\u001c-n\u001e_%\u0012sŃtA\u000fzDwm\u0002_P|\u001c\u0018ت\u0013]\u0007>`\u0003\u0002td\u0004\u0015\u001fJ\u0015a\u00017#u:IDQR-\u001b4,MGZYm\u0000\u0005bÛV͵ǐy,G\u00051C,E'9 '\u001dF;5:KQL\u001f䥅L>f2H\u00046l\u001b\u0015q\u001f~+93\u0007=\\s\u001csAOǾ\u001dٚ5E^8BpDJ8j\u0018nV\u0013_D*P#\u001cĸc7|8V3pw1w\u001aG6Q)pd\u0005G\u000e\u001cn\u0018Rx੅\u001eM؟Ld4HR1è\u001a:g(UW^1D\u0006wAýx\u0011\u0010K#>\u001e6s13:m\u001aԐ`ˀ)\u0017\u0002\u0002𔰓U\rW\u001d\\ᚈ\u0019xC\tv~nw]\u0002Al\u0000}`hi\u0001`,\rY̹ß\u0011I\u001a)\u000e&;U^U'4$yRTR\u0006LPij݊.V8uS_T(u\u0002)G9\u0015%RQ}\u0015_\u0002ι_m>@\u0013\u0018\u0005xV˻\u001aJP=Eՙ\u001aa2åL2TYrEm5\u0015WEA{\u0002kߢ\u0002^y䶝Ur\u001dF8Xʸ\f\u001aHjFJޗO4:\u001aVđ,Y**U\u0018\u0000\" 3X|WF\\~96>\u0000>`b:\u0019ɧ2\u000e0ہZyV\u0001J)7\u0011WJI*vf*RRY N@9U*\u0019!k]S˵HNZe^+쮳\u001c9ALk=\u001fYHI;c\u0000Q5WR>\fB\u0013K?/M<\n*ϗ'';<wrݵr\u001bLRg\f\u00029<el2<?Q\u001a|\flυk\u00061\u0001\f\u0007C@\u0019\"S\f|\u0007^PP,wMy^C\\*7To\u001cf3eUYɾ7;\u0005*{Gޘ\u001e W!A\r\u0004y\u0016\u0006A\u0017-\u001a@A\u0013\b\u0016\u0011\u001e-TPC-J\rӆ)1\u0012B\b&aa0L\u001d\u0003bZN0\u0005uȣj~@$_@\u0011u\u001eϝŃdSd\u0018ʌ*#Uz$HRÔ\u0014mTbt\u0012\b(\"I\u0014݉À)a%ى>\u0018\u0016A\u0015׃AA?L\u000bp\u0015ew^g;n\u0012\t,$$\\ T \n\u0014D8V\u0002\u0002^\u0010Bq\u001c\u0014\u00182ZN6#2Ң\u001d\f>q;9o\u0016yn'[鐫%g+{ ]Il%\u0004\ne\u000bVP!\u001ad\u000e\"Z \"8\u001b<<]\u000fLpUq-@ԉ\u0004h\u0006\u0011\u0010\u0000ܛ\u0006_!\nc>\r)\r$Uc֥\u0010\r&\u0006\u000fSa\n(H\u0010w#\b\b)<\u001fa\u000es29C\u0001>\u0006q-JFP\u000b.~1͵\u001a~L{\tMH\u0012i\r4\u0019\r-JG\tl\u000f\u0011l+@5c`\u0010*o\r>40E70c\u001bۭ\u001e \u000f+W/\u0005p\u0016dK\u001c,1!\u0001a7\u0003fF3bl\u0018l\fm\u0015\u000b\u0018B&xjG\u000f؄\u0012\u0000;@\u0013 |\u0015Ro.\u0019\u000f<\u0003)>\u000b?:c\u000em\u00179&'4^6O/\u001e3\bJκ\u0011sܺbCg\\o\u00073@\bji\u001ay\\g6\u000f\u0007^g8\u000b\u000e9@/\u001f}o\u001e1DN\u0016\u0016QCb\u0005w\u0003D\u0002&A\u001fzkN#\u0000\r\u0016-:Ncnx\u001d_`=\b\u0001\u0016'd\u001862\u0018\u0000\u0018!'#\u0014\bFW?r&eR\u001cR;㚅ͬU[uv\f~&v6IZ\u0019F\u001ePI\u001c`%XEnE㮥>y\bl>7\r,f=F\u00185\\3\u000eKTh\\5\u0011!%>擤!s`\u001a1k\u001aD\u001f-\f^[c\u0003\u0011sX|\u00070>\u001eCMlFY}\u000b\u001fs\u001d$A\fnZ5d||X`5?b\rߝ\u0010%b&&ϰo_`aM<\u0001~\u0016H{xy71RX\u0007\u0007:8{\u0018\u0013WYI\u0018ň%\u001e@#_&A%WL\u001f$u8x\u0015WXQ>8B>\u000e0uUJ\u000b&^p\u0006Kd|\u0014<a\r&\u0017iD\nɷe\nׁ)Vޒ)V\u0014p˻K4w(_\u000bBS\b\u00104n;6Yas_\"\u001cx\u001bPz\u0007\u0010^dt\u0005\nu\u001d|L/ANAù#$^{Yz<SU)\u001b \u001f[\u0013x30I\u000f\u0007PJ_e:\u001fF=3S?)\u001b(\u0014G,\u001a\u000bJ.y\u0002_\u0000?\u0002\u0007`\u000f0\u0014!ݴo4-2yV0~o4\u000f}6{4?~\f\u001b\"~\u0002:8\u000b\u0019ܛ$\u0014_,`\u0007x\fpz&Ck*2hK\u000bqxiFA8E8A8{\u0015?'i\u000e~yX\u001cԟtN-\u00148x\u0018l\u0001wR:3vN\u0012k8Z\u0018\b~\u001c\u001f^i\u001f@\u0001Gu>G|FwUV3]\u00146KD\u000e_PLpo\u0006Fp*%U~/N\r)ڇGNvS\u001bO\u00138\u0018jQv85mjd+~<L<P6A<AT\u000eNyes\f|\u001d\u0002+EďX`\u00068MPei ZN˨n\u001dv6vh=5\u001aY\u001fk^t7VVRy0Bږ;\f\u0002K[Znv\u0016X0\u0011cK{N\u00079.v9+\rb;B+mv\u000bvgS\u0011ݴ~߁\u0015TZڄWߣzO弩\u0005\u0002x\u0007@j\u000fXlfa3\u0019.|6@\u0006brl\u00075]\u0019m*fcJ\u001dxKH\u0010n2;6\u0000s\u0002\u0007tr1#<*\u0007]'`;\rdb?J,~9\u000fc\u0011{_\u0007Og\u0018hgUmDBg&O\u0005o<\u001a\u0017O2\u0000:\u001a\u0019wE' '\u001d,8(\u0002 \u001c\u0011lFv5Uh7\u00062W\n\b\bt0\u0011P\u0007\u0018q5;\u0019\u0006@\u000fH\u00071q\u0004(\u0011N{\u0001\u001fQ@\u0016S\ttOx\u0012ZV1j\u001aTWSUE_m\u0010^\\[\u0019Ɯ$\u001c-\u000b\u0019zlu\u0013\f5O}\u001d\u00148!\rd\u000bW!\\T\u0013FlU\u000f\u0011\u001a\"[y\u000eO\u0011d\u0018\bn8\u0004(G\u0012F>Ɵ9\u0015D\u0003!Mǧ);\u0015Lr+jOU,U*.V\u0003_ZUbRmP*Q!y7^\u0018\u0003'q~&\u001c>\u0006@\u001d^gUcS;Y\u0015))*wzT0TjĞb{\u001c*t\u0004T(Ѭ<grq\u000e+˹Z\u0007xJ~!ȗ|\r\u0002qm2\u0006\u0019˻\u0018[\f\u0010\u0002\u0001U2O\u0003%$\u0015{\u001c*vTS+Ky<Mu(]\u001cwX&ez:WgX>j\u0019-JsH\u001eOU/\u0010Zl\u000f(\f\"\u0006Tr\fO\u0011\u0014%*HV^SSS\u001aI++5W0*7B\u0019MJ3:e\u0018\u0003\u001aK1VmlxRS4Na\\\u0001ɑJb1\u0006ǐ' \u0004A9J@!%7=A9$e(ϗ\u0002P&#}cr?\u00068ʫ\no6$,fwI6l~vIHBH&@\u0002J\u0002$\u0010\n$AkJJJ\bRZjŢX\u000eZdZQt:0\u0002V\u001d\u001dvږa\u000fV;0/۽=s}o\n|ӷCy\u0007d}Ke+\u001c{y3\u0006݌slP\u000f⼫\u0002\u0011`M2|e\u000ey*\u0017\u0013\u001d(\u0003!\u0015\u0007U\u0014h+ت`>9ò\u00077\u0016RN\u0010-\u001bF\f \u0002\u0017\u00186`\u0015|KZi\n\u0016\u0018|\u0017\u0002A|\u0007l\u0005r\r:)w\u001dr(4KP\nQ~RpBpN\b\u001d/B׏܆hDѲ!|\bPN\u0015\u0019c%|a#hp\u000eJF0ߕK<Gr\u0015rG*TPV\u001e+*X\u001c瓀-\b c\f\n-[ 1!ʜ\u0015\u001fޅJ\u0000x]\u0014%oʀgO&w]E<\u0015T\u0017\u0011/Ɠ-ZMT\u0001D+`J00%F\u0000Q(b\u001e\u001b'h\r|},늑\u0007\u0004]/\u0011\u000f?<w}QܦZ\u001cu4z\u001aX;{S$6ł\u0014:>żbxLq㤸\u0001Sn~ǐ Ѐ\u000f\r(%\u0019\u001c]%\\a8\u0003g\u000f|JHlHOq4\u0015di\u000b\rX\u00116\u00165\u0002|ՆoexhE0W!\u0017Д\u0000./n{\u001dy೎Y\u000e|<\r\u000b\u0014s\u0018cZlŏv0\u000b:r\u0000EE\u00160&u٦0k@3\u0018\u0005n\u0005Ik%\u0010e\ro!ya|\u000eHsvB!'KA#\u0016KYd>`]*Y \u0000Ճr\\tu\u0005L-1Glk\u0000Kx_\fo\u0001\u000e8I/\u00179kA\u000f!h.\\c\u0006 \u0005<FVx%XPb14\"sq}F\u000b(vxg\u0003Um\u001f\u0002xm7%g\u001b#rVZ\b5d\u001dc\u0004?%DN)q63c=\nq\u0004Ŵ\u000eyּ#\r3\u00116\\/5\u0011Q\u001c%,iD e\t$~l6[)\u0010l&`,4o!$>\u00062ꄯ\u0019MS\u0003~w9Xeqrđ\u0005&f\u0012Njn\fq/X6\u001a\u0006,ao=\u0007puV?&kyGC&g\u0005\u001d\u00103d\u0019L(9\u0006!Qj\u0000g\u001b\u0001k\u0004y?\u001bۇG>-})wk)\n!#6ko,c\\Ɋ\u0018A(\u0003\u0012f\u0019\u0002C\b~\u001c\u001eyCv\u001e&\bړ{OK߹F*Jy\u0015W=\u0016烀%\f\u0003qe#3p\u0019H\u0002\u0001\\΀\u0015j<9y{@&/|N:\u0013gT\r\u001f\"bc|'k\u0006u4\u000f\u001dJg-_\u0017-__߃?[m\u0015rrz{\u0013ҿr\u001dGQ\n-@t%\"}v̨N|S\u001dtLF8$\u001fP3\\PEM\u0000/3y^b\u001a}\"3ɹ#LV92l+C\n3l3ԑ)eX%x\u0007?<>j*\n\n-tL4\u0005&qXsh^x_xOǋqJtR{\u001cL(P\u0019&˽\u0017\u0003v+p^\u0004Z!3\bNe8\u001cqY\f\u0014Squ\f\bsa\u000f(C2M~]\u001f\u0017\u0007\n{mf{L\u0001m5\u0003:'`6?)\u001c=|w|_APŎL籟.Li$_y=Bz\u0018?\u001e\"\u001ekz\u000fǱ}p_!B\u0019<DKM`\u00022:\u0001~b9^_#nrGL_Y^.=4.r\u001aى\u001f;v\u001eo'3xll\u001fy\u0005\u001f\u0005`\u0014<gu\u0014͑\u0005v\u0012\u001d*499T\r?n#/[ne\u000bt\u001aLh\u0019l\n\u001dFn$'Dh\fR-며\u000eU`\b\u001c\u0003V\u001bf&&L{s\u0001\u000f(\u0003!lǰ]\u0014v[a`^LS\u001d7\n\u0004U;Mܧ\u0015,\u0006~x?\f,<fﲸU`\u0005s%vX\fSjjcX~l?\u0004mn\u0007Q\u0012\u000ep\u0006JU=ŵ[}mtڿ\n6Z0\u0015jTqlA!vݠg?\u0015\u0010#\u0004o^\u0007v\u0017P}Tʠ\u0013NAVQQf^\\N\\Z]g\u0015uJ\u0002Ëꘑ*F:t\u0006J3Қ\u0005p\u0004\bc?\u0004RlBM\u0010fbfs\u0012R0$<7Af\u0006\u00185\u0004\u0019e%\"H'#ݸ\u0000\u0005\u0018\u000e\u000f('\bO\u0004jlcIxӀD&l-Y8\u0017K5t8\u0001&\u0006\\+7cHTûH\u0014>%}']\rJ)\u001c(<5kn\u000b\u0013t\u0015b#BŅ9\u001f!:N\u001aw\u000fp\b\u0010CȎn\u000e$|_)nSV\"xf\u000fO\b*x\u0012lyxH%k7\u001dx\u0010xSsp\u0019d;I쯇o9r8+[@\nԁ8cҕhC|E\\\n;\u0015{\u0014Tn\u000f\u00026ٻ4wX܍*ɝyyr\u001egEo/(3?do%3$$`BH@\u0001\fU\u0016\u0018d(\u0015Q\"\u0014EED\n\u0018TPM(Ȗ-Z\"\b\"K\u0005w;=\u001e4s\u000f3_sg\u0004}\u0015ߖ6\u0015(\u0005M@\u0001rA\u0016k&Ь\u0012%vJ\u0001^\t;\u0003\fK\u0019\u0013gM@\túZ|\u001eu\u000e\u00169I<9v,\u0015}l\u001f+팸\t\u0019\u0002O8:C_\u000bmk<\u0005b\u0013$J.!)A-A&\u0001.~OHtO\u0006\u0011HZsѴѪŭ$NV\u001c\u0004i%M[\"V\u0006x\u000esRܢ\u0001x:{u>\u00034\u0001 gq\u0010\u0005YBz\u0004t}N}.ѽ\u001ez\u0005DEģg\u0002q%+ġ\u0013~\u0003Ţ\u0013N\u0018y}d8/aKbrg\u001d*bNE}\u0000\nA\u001e3A\u0006\u000b\"\u0001M~K[4[<~M\u0001\u0002\f\u0011\u0013[\u0005[%VA[\u001a\u0004\br\u0013\u0005N\u0001j\u001f\u0002?]༆ey\u0000\u0005|\u00011G@(h`*]S@\u0003K!M>b\rG\u0012\u0011s\u0016)\u00034\u000b\u0011N\b_\u001b(|\u000f \u0000SC\u0007,u%7\u001c\u001d$ђ4\u0001ų\f\u0010`\b\u000f6уv\u0001-d\u0017wCaآ\u001eļb1a1\u0006\u00051NS\u001aaȤϋ\u00008!5F\u0000 -ES\u001bw':{U\u0006!<\\>y\u00160\u001e?*>⎤3&C̙\u001c\",\\&57\u001aK?GӚ\n\u00074JC\u000196g! -dSC\u0016I23!\u0019rm3A\u0001{Z\"\u0011%\u0000I\fcfqdZ$-*\u001c\u000e<\u000e|6xc\u0016w!^\u0014\"0Å(\"\u0017q\u0014k\u0016\u0002NƤ5!96\"M%3\rCs\u0007o\u0004#:2\u0013\u001a4s4/\u001c%R\u001aL\u0019Z\u000fJ\u0001k\u001b\u0019M[f\u0006\nESjhrٓ\u0014\u0014\\gRG\u0014\u0010B\u000b%xPEWjI],-VI\u0005^T0\u0015\fG\u0015\u0015FZќ^IRkA#VN,c.'Zϕ\u0018\u0014\u0003W:g/\\hL1$\u0017iRUkkuRG[bNڱE\u0015\u0003A\u0015\u0013Κh˺نTIn}\u000e\u0003\u0012Rɻ@S3$\u0007(\u0004\u000b4[f\\\"\th\u001f\t/\\4D\u001dSGwΆ\u0017݊+yލCF3\u0013gDv6\u0003gTT \u0015a[>u\r\u0005\b4UFhF\u00114B@?hI\u0016|\rbaX_\u0006MbHДt%\u001b0>B\bS\r.\u0011z$f*|ը\u0010\u0004j@8:FF0'YPyH\u0004`pΪ4M\rLH9:KFf T\u001a{\u0019|jH\u0005h#\u0010O\u0000S4p\u0017udd\u0011q'q\u0007m*i~RRB7\r೛%lj\u0004ۛ\rZo\u0016Iq@>CRM}jP~D&%x8\u0013(\u0004\u000f\u001fD笚|9*Ŭvh֘Ws/wQqN2\u0014,\u0003AI5F(SB)R\u0007V$M׍lux\u0006Uyd./(ǘ\u0017n+\bД<np5\u0014\u0017K:ٔ\u0000+sj\u0012UdӨݒjb\u000f\u000f+1'\u0007Xo#M\u0014c[:>ЬB݆\u0005j>\u001a\u0014\u0017׍l\u0006[\f{\u001b\u001cT3\u00158\u000e؂r99<\u001fcBv\u0018OUd\u001cN[`(\u001cY9y\n\u001a\u00176izEqe-Z^Yqխ暶U_WݱSv7٫w\u000f\u00188vC\r\u001f1r1\u00197~¤Snco5{gκos~?\u000f.x?.|EO<䩥˖xz3ϮZ\u000bk^Z~Ɨ7ymn߱s[{o\u000f{>Og𑯎~}\u001fϜ=ϟ.\\J\u001aJ]IYWQdg+\b/RKrR+kA\u0001ݔ\u00037)\u000bnƃ\u001ae-ʅpa2b\"NLUV܉\u0017w+3~ܘ\u001dP~<\fy\fG\u0016+K<Ô+/b:&e+8fMy[sP>|\f\u001cT\u0016}<:I?().^J\u001d>\\ͻ%\u0019~\u0018__b2\u0016\u0015\u000flv\u0007ǣaO\u0011\fG8#\u00191<\u0014\\\u0016|\u0018LҚ7?3'\rt뮶\u0012;f[\u000emq\u0013&O6}ƽfϝ7\u000b\u001f[xe+.j[ȤƟILiLT*N\u0014h\bj~o\u0013'G\u001f~83gϞ;w\u001e?]p\u0006ƶehbm֮-\u0012;zW_5a\u000f\u001c3Жj꩛sӲZdOG.\u0017\r54PCC\r\r54PCC\rw\r+\u001au\u001d\u001a%^]/\u000f9\t_ԏ-~kwe\u000bܝVOѢ'~HPG\rVF\u0012ծ=Ͽ1}C&|ww>/n{y\r/Mٵz\u001do.Ѳ{_d'װ\u001a6Rk]/޳̾\u0017{t\u001at\u0000p|gvzffgi;fiNд2/\u0014\u0011\u0011\u0004A\u0010\u0000oF)TLP.\u0015\u0003\u0000\u0010\fE[\"-)'-߶g/yޘᎀN\u0003\"_\n)Uk\u0015a\"a>W\u0010~\u0013ՓĢ\r?\u001aJ!&vezzc-̣>$Ck\u0010SFkCe\\\t)j3J-)|ʉ鱶\u000f\u0006\u001ed(;\u000enZs>w'C71}fDm\u001b<W\u0018,\u0010QduY\u0018կ\u0012b\u000bOi6 \f| :\u000en\\h[S\u0006<Fǯ\u001f%\u001bwE:\u0004!D|\u0016%K\u0015\u0015Xu#\t\u0006\u0004?װ\n\u001f\u0016}~ϴv|ʵM4Yg`&_`3Ȓ;\nTEr-ZFbJ\u0012_\u001e6P@\u0000\u0019\u000e]Tnm=1l3<qZ'J7V\u001d`\u001btH.]*GS¤j|\rVJ[\u001b(\f{V\u00015o'92zᴫ{˔\u0007z؇\"\u000b\u0019\u0019ȂD\u001d\u001bA\u0017زz|9ZN6P\n\u0019J!Cճ'׏:ڴ^tSM_CƼ\u001eDz1$\u001a$7\bM0-\u0017,6P\u0006\u0019XP\u001djw摳Z_8l|rE:\u000eNxc\u0003\u000f\u0011~T*\u0007 v2pFB6\u001b\u001aŴ6 ޲\fveF`5mgw8ȀŒ9[yވX\u0018D\u0019BGG<\u0006\b\u00183))\u0014若[\u001bزl^ў=ǏSϞ)\u0001v\u0004{7w\u001bo\u001982\nbpO8\u0013\">\bX4\t>J6 3O;F.\u001c^h\u0007\u001e\u0003\u0017\u0006W\u0017}F\u0007]υ\n{E\u0012\"\u0003f(/c`4Ѭ7h^!}w\u0007>85\u0007K\u0007\u000ehʙH\u0003AΡ 5\u0018.\u0007-F\\\r|\u001f\u0006{Gq{\u0017\u0010im=/ZtU\u0002p\u001cpdK*8+\u001a#KD0\n\u00043\u0000{\u0017\u00007\u000217\u0001@Ao\u0006Pa\u0013.\u001d\u000557\u0017d0\u0017\u0012\u0014~DK2qH9y\u0014\u000eBCOmHLU1tՔl2\"8dX2,\u0019\fK%e(\f%6\u001b@\u0015du=\nםj^A\u0004\\ˎ*\u0019$,!2.K\u001cG\u0015v[\u0007=ZP\n\u0019$A\u000e\u0019=]\u001b+#\u0018zw\u0019^\u000bXaF*b\u001b\u0013Z*SRD\t&^\\\u001d4h`C\u0006͏@v~'x\u0014<\\վAGi]\u00158^@(WI<}I\u0016XA-edYÍDVa(\fe\u000e\f\u001a\u000fZ\u001fg:8QCHz,I\u0014^P\u0014Q%xI-02\u0003\u0016,탡\u00002\u0014A\u0006\u0011d\fjk.s[g-\u0001HQ$Xi}yJ&E|Ne2\u0019\u001c@ZF\u0000\u0003\u0019O\rAF#\u000bzw\u0006/؄\u0011\u00169Ќވ0RYeJ($9\u0002J;C`M􂜇\u0002}0 \u0003\u001aP\u0001\u0019/69\u001f&I\u001fl됼:y*LYT\u0016~?W@lͥt%\u0017SY\u0007BfaC*Pn;ӑW_ހ}]M*\u0005'(bN)%O2qbzȅ)}^K\u0003g\u0010\u001cX\r$'\u0003mo\rN_u_q\u001c\r\ry[\u0003\u0018r=P\u0010\"fUdVp\u001d\u0012\u0005=!\u0012:qܴ.K``Z\u0001J s^9\u001dz5-\u0017&i\t*ઑ9u(I\u0014#ObD\u0004\u001dQHnƖP\rVK\u0003E\u00102\b\u0003jVwn\u000b\u0007'\\\u001dG&ǼԲ֠\u0002m0N\u0003J\\ɰuUH\rZ\u001c\r\u0011%4Y\u001a@\" 5P\u001cog1ip`䉳\u0015ߦq/g\u0007(\u0001M\u0016EɱZ,T\u001b\"V $\u0006K\u0003M\u0000\u00072TjA})Ï\u001d9;\u001ag/(Ė>\u0019Ȝf\u0014+Z\u00125b \fm \u0011@9\u0000\u000f2\bv~\tjl̆q\u0019'G%7B#~̇ސ\u000et&\r\u001bn磛#XB.\u000bx\u0006\u0004\u001b\u0001ю?S]1a<u톖)/W/zfnNcSGq(j9,\tߏO\r%Ɍ\u000ej1!@πt\u0017/,7\u000f]i\u000fu\u0016䁇a\\ŎUq\\3:Z:.g\n8g\u0005:\nEl\u0005A\u0010\u0016,DBHHB\b@¾-\u0010 \t@\u0002%1,\t{ \tE\u001b\"\nZ\u0014D|>^w>LpP\u001d8:H\"Ol@H4@D E> Eߧh\fx\f3{\u0016\u000b=\u0010\u001fp~@bIb\u0015)y`o%65~)\n}\u001eOz\u0011\u001etGr(\u0019\ryĆ_\rx\t{L|@mT+5s\u00077*N\u0011\u001eȁ3GR]\u001cx\u0002څ\u0016)\u001d|9x^d\\\t\\dyb.pPdmkkm_\u0000\"8\u0007'q*\u0006)\u0002\u0004c\u0000{&\b\u0006B?P|5\nb} \u0015\\hXL35j1|\u0007%/h`?\u001c\u000eb!4\u001dУ( \u001c\u0013^@9\tSa\u00016\u0004\u001d\br\u0005\u001e%'Pb\r5A\u001e(\u0007=\u0015)\u0013|FI\u0002S|F!'\u0015\u0014Ac\u0007In#V\u00124jBkn\u001f\f\u001f\f\u001f\f\u001f\f{C.bE\fa\u0017Ԟ\u0006=ag*\"\u0004t\u001cVP*GhHLf)sUQ͚H%PY~5[\u0003y6V!zgkhpw\u0006K\u000b\nL\u0013y\u0004}\\DM\u00193\u000b3\u0012]\u0012W\u0011dki\u0005jJ$#d=U$yA\u0018\n7B-P\u0018\u001a\u0006%\u0007P_6`\u001eׅ3$\u0012}N+5AIL62U<C\u0003TE.3Q*{\u0014Y37@9b\u0005*\u0000>`#%yWF\u001a\u0014SE\u0005\fE[V\\Ks2[nh`\u000fԱCbx.\u000b蕽\u0006|Đ\u0018\n\u0011Cű-\u0002NV>ߊ=jV\u0010y&\tޠe=\u0019<S%tX\u0010+\u001agJyR3\u0014!\u0006鱿A\u001dbhv\u0002W<\u0003Z,2<_\u001e)*46%SK3J2x&a`8?A8ͮbK\f \u0000\u001e18ZAE7]^\u001es\u0001̈́<c]DUT1\u0002v$?P\u001cgGSӸ\u0003i\\~1\u0014 b?C\u0015bh\u001c4Vo;//<=\u001fh\u0017JMm^V\nzE\\\u0003 \u001fN\u0016^禗\u000fp$Fs\f%A\u0018AhSϷ\u000bzO\u001f}\u001e\u0007G\u0005-\u0006rc).\u0012&\u001axũB\bW>ή0ۯk@\u0018G\n*h\\̰O\u000f^LA m\u0016(U42fwO\u0017'\u000fpxa0|YPa47(t%\u0011\b1 \u0006Ο;\u001d\\0^\u001dvw\u001dvgԟg\foB l;e^cdUd\u000b\u0007~Pb07(Pf\u001e\u0014G?\u0016^;87rzĸ\u0017~_|)8Wх\u00105\u0012S\u0015\u000e\u0013S\u0015rI\u0001Td\u0017C!b@\fAs\u001f/\u000e<qv\u0007qXMCAR\u001dFӯ\u0011T\u0006bkt-#sUV%U}8Y@\u0018\u0006@yd;f\u0007ј/\rOy`Q\\GgC\u0005ٝ8\tP\u001b&*)&b\u0003\u0015Wl\u000bM@fv\u0006\u001d\u0014#\u0006\u0001b\u001f\\\u0007MG6lO?w3.}CU\u0013(&:\u0014҇+au\u0011*mDYD+6ZQ(~ʌ&s\u0012PcP|M\r3\u0003[ǿ3E͋KAIT`\f\u001d9IK0s\r^R\u001e\u0018E\b`J\u00032_m\u001cM67\u0010n\u0002Ձ/t]wI}YSԽt\u0013Nx\u0013h*w\f\u001bǼIH\u001eN\u001cd\rr0\u0003 #oH,BS}\u000eĈA7ar>=s߼tD[gnyQAA\u0004$L\u001fN\u0018'3\tc8\u001dFBm\u0016\u0007}.)\u0019u#=g4b\u00054~noUc[\u0016Q\u00118\u0000ܾMYBy͇\u0004fBHOI8t\u0014\u00018\u0018:\u0015K\n\f|H{\u001cȠLd\u001dT}ūoݸ\\7gMӫ[e`\u0004\u001c\u0003G\u0014p=\u0002\u0005ϡn\u0004O\"\u001b@E\u0005dY\u0001s@\u0017\\4yjlflV/o.=ٴBj:\u0019\u001c*\u0013n%}\u0001\u001clNmg[SeJKn/T^\u0017\u0014\u0017P@\u0001QQ\u0011Q@@\u0010\u0015PA\u0004\u0011/],Yinm\u0017yRؽ\ne[\nC>\u001cyE@)H;a\u0013\u0002#ssE\u0002fKϖ?,?_V3|~\u0015l\u0007\u0003EfA\u0004x8䌃\u0010X\u0010H\u0019\u0004?\u0006B\u0000\u001fr\u0003\u001e_({\u001cJ\u0018h3[\u0017^^0_\u0002\u001fS\r\u00163`\u001cp^A\u001fkO\u0010\u0010\u0000o\u0000t\u00027\u001f$磐\bdm\u0001Ð\u0010А\nP\u0007+\u0002\u00066/\nf^\r\r\u0018G\u0010p\u0001\u0011\u00131~)\u000f$T1|RB.玦TM\u001dI千.YoA777SCkCɦC\f?\u0007#4\u001dwPO?Nf\u0011o0qZ\u0011bNYLn\u0019~(VbO\u0014Km\u0016kZeu8\u0012MB\f̵Օ?\u001f?\u0007#Ȏ,kN\u0012\u0019D\u0018s:#:'>V\\9Oe\ft̚R2'L掞8N\u001bhmנ镡\u00141!?m\u0015b\u0010#\u0006~GP\u001eq\u0005E\u0010fV\u001e\u001e\t\u001f7UO$K.R+\r\\f9\\cLu%u\u0013MXy\u001cߪoNhkG\u0013WF\f5Ak\u0015(9\u0015ԁZ$)93Ε\b4Rf\u0019iNb]6*MZIn\u0011AӉW2v\t\b-&Ġڷ\u001e\u000e6\u0000[ɐiuL\rY\u0012e>3\u0016YK\u0002@e\u00046rU/\"4\u000bS\u0015jb\u001eM\u001a\u0011C\u001db\"\u00065b@\f\u0017ЇIUBEI*w:SW.+Է\u0017\u0019[i>9Eߔ+UK\u0006\u0019r\u00137Se@\u0013p^\u001b*6\u000fA3x\u0007!Y\u001f!,!*y-vANEM&ACӫ\fc\u0011\u0004uԆ\u0001nvC$e\u0017^\u0019X_/\u0002.b\u0010m[\u0006rĠ\u0017\u0018\u000eyb\f\rg \\)\u0013\u0005ƴ&}\rIQRV\u0014mz;hg\u0018yn46,\u0004\u001ebhغ\f\u0014;WB;b>t\u0002\u001c\u0012v/KWt:A`jNmg\\}CEŴ\u00156NΠ7\u000e\u0016Ҥ}4E\u000f\u001c1\u0011\u0003\u001f1\u0011\u00121t\"\u0006/,1AaO\\4F\u0015ٴ\u0002C\u000bA\u0012Jd2ȫ(8\u001c\u001bUm3\u001b\u0007R\u000bHaD\u0013 ذ\u0018$[\u000en+A\u0003?\u001d\u001f\n\fcSΙ#\u000bͺvUD֜Zא\u000b)F/\n\u0006(F;Lj!\u0018\n14!\u0006\nrf\u001fס^w\fY]1|6QHUU5gvŹ=utsԚSͳe׈\u00072xRKFE\u0011MP\u00188\u00061H|\u0000ZOgk1\u001e5\u001bzq4`.dzXFPV(3Kd&Z/a\u0010sbP+KV\u0018PB\u001e\u0011CǎOf{~4]=\u0011|RPIZ-`\u0013\rI-|M)z圾\u0004Ђx\u0007ME\f\u0015os\u001d\u001f?߻IocA?c)ґ\b\u001a]쉗RtIZb\u0007Ae򺣕EHE)B)2*\u0003\u0018AW8/1/o\\\u0003\u001e#=\u001as#\u0000\u001aǒF#l{t%/NՓ %\tʸtM~\u0019aB4|}\u0003MG\f5\u000bq\u0011tl^\u001744r\u0017a\u0013\u001f8\u0011\u001b((>\u0017\u001d'\t\u0013)\r1tID\u000fIz*\u000f5\u0014+\f@}\u0015\u0013\u0007;XpgӻG\\^km\u000f'#!_ٴ_DTXr\b\u0012R,-s4A8K`\u000fqqY\u00039UX[~M6®Q\u0005UA۠]tw\u000b\\ԮUGg<<?x_(>6`**9{\".#u<pH\u0019,\\x\u0002\u0018;Jgg\u0006h\u0002\u0001j\u0017_9Lq\u00184ku˽Nswy\u001f(ϗd\u0018y\u001a\u0017IK\u0018;N$\u0011'sOMg]/\n$\u0005^y9h:жrL~`v@\u000b\t(\u0000\u000fW6xϛ<{\u0018q&: YBHTl\u0011)؇\u0005\u0007Kc\u0002ǣ\tڻtK_gaMY\u0018ǙqZG\u0019uֺUjQVn\b,\u0001\u001a!\u001d\u0002\u0004B\bd!\u000bK\u0012 ,d\u001f\u0012\u0012D\u0014\u0005PZq:ZZg~y:E/7\\ߙ}E;Y+\u0000/W\u0016\u001c\n\u0017CA\"f\u0002?\u0015O /8עгV:sMx\f#L]dƨӯӌy.Z\u0007\u0005rp_OF\u001b6\u0012\u001cߙ\ra\u0010\u001f\u0007^\u0013\u000b\u0007cP4\u001e#@9\u001a\u00014p`\u0001X(^\u0011<\u0017|\u0017ͳº<ض\u0006\u001eJsm\u000exok\u0002\u0004Bi팄Á\u0014}\u0012\u0006C3\u0004ȞP'\b{\u0003$N}s]\n݅Tf\u0011\rV;pd}\u0004\u0004l\f\u0010Im\rt\u0013?n;\u000e$TǠC? \u0002\u0005E}\u0003e\u0002 {,\u0005k\r|7(\u0003^\u0003\u0018^B|Xλ_+'QTyZs'1]%~\"0]_,p\r\u001b/\rP\u0014X \u000e\u0000\u0019/O\u0000'7'fiwԬ\u0007uӅܲ)562]ɞHi\u0018OJq\b>\r7\r'8\u001f́j');\u0002\u001bm{k&h\u000bho\u0010'\u0007'DX_A!NW1K)LY\u0013[\u0004\u0019FfZy\fon: \u001bL\u001c㆚\rP\f5ۗ@+@t =\t\u001e 򆶤YIVS~AƷ\u0015ST*e\\W;^^'cF:/\u0015n\u0007΢w\u001a\u0006t@s[\u0002\\d FP\u0000E\u000ft$\u0004H3>\u0011eOsJ0)/(k\u001ch@>Ӭ\u001cn\ffvhN1{\u0019vg\u0003o\u0006'\u0019h9_\r\u001d\u001d\u0001\u0011>u6EgZcin=aqW\u0015u7h4(N~\t=\u0007\"l'h0SF\u000fI721MGMl/\r4d`B\fmȠ8\u00114'<@sgV\u001d\u0017;5Q9Ts\u0001\u000bny*rQ(\u0005\u0018FRi\bھ,\u001d&#{ZsJg\u0003K|ݶ\u0018 ۷\u001a6@\u0007|ftgB&'=TeH[\u0012H}\u0002U{˚6˪Zs}\u0012I/S9K\u0003\u001d\u0019 'h߷\nT\u00077P1!O\fI=\u0019;sc\u0002PcƪQ\u0006m%WY.(IM7\u001aـ A\u000ed\u001c|\u000fLg\u0010\u001fGX\"nJVx+9J\u0012\u0005%rS}Zd\u0018\u00145\u001cLV%THdHm/6%^\u001a\u0018AfdP]\t={}\u001a-*[[|\u001dSJј*9(#6a\"[R\u0006)|Υt9Xe*\u0007\\of{{\u00018\ro@eЅ\fփos{Ȑ選\t\fWtEi2\u0014ȕMe*icAfa<&ZOki\u001d\u000e*QCP:gZd`\"\u0003\u0017\u0019<A72\u0018`/FL]8|ÖT4dHc`JBFF%%*Rmd`l\u000eʨ\u0013kJFLa\u00154g!MP\u000b}ޝnI\u0007#\\IH(tS\u0006M@ ZE<\tY_'lk\u0015WOn:J\u001aT\u001eKIIlP\f,d\u0010.\u000292h\u00190u/\u0006}ݾ\u001b\rtZXi\u0014ڐsM\u0005JLGk6WJX}\"Pb\u0017y\u001e\u000bѤw6[ ܺ\b:y{G=~bxHkQIqF\u0007ډs\u0006B+GC+K\u0015Ub9\u0003#\u001a2 Sڲu\u0018Ad;\u001b ޺\u0010ܗ\u0003<ruzDXbbu\u0003ȳd53MĎJ}X[SL\u0004\u0015\u0007P-i.\u000b^7:gzdC\u0017z_-?\u001dZs-wyޘ\n\f0\u0019\u001eo\u0019C츚P%R_;!Ȋ\u0005]D\u000bYKlCɔh$-q6ଜ\u0003@e>/zn߽ʯ'\u000fmytSqф̚t^s4{\u0002g%wQ5g,lmEڬJg\u0006d୛\u000bm\u001d?g\u001b\u001fz\u001f\u000f݋NP*|3I\u001a;\u001e!\tRŉC䖸\u000b5mkey_goMi\u001c#\u000e֊NǺ_ъbZԊ\"\u0015(\t\bD\u0004\b\tK!\u000bـ\u0000!!@BB\u0002\u0000\t\u0010\u0002\"ua(nXQ\u0014HU^h\u000e?\u0007ܿʪ\u001e\u0003@\u0002\u0003\u001a-g{\u0007\u001f~o٦w7iaݯ'^\tEQG\tT\u001eŶȟEa\u0003|1H\u0012x]&]-E\u001b\"\u0006͚`^?eܡaWtL\u001dmqu~)~?;I _)OԄi_hY\u0011\u0016=A.3+\u0004ݑq\u0003+rnW\u000e-n/\u0019^2禰\u001agl\u001f\u000e}'=$qϛ2 \u0006&\u001c\u0015[ft\u0004\u0014C\u000e\u001f\u001f2.L?+N\nz*\u0006)ShS\u0006es\fs\n\u0012)[+,vU%8Zy\u0010ps \rT z\u0003;v6ُ.3 -#0l\u0013\u001c&\u001f.\b\t\u0016\u0006.\r\u000bx\fD\r\u0019ꞏ|c\u0001es\u001b`\"5^Y\u0002{\u0016\u0006J\u0007OD\b\u0017\u0007\u0004'\"\u000fE\u00025\f2p!8\u0007 ;\u001a\bB\u0000\u0010\u001d\u0007q(\u00057n\\\u0004v{>F\u000f+,Uy\u0018v.\u00055ก\n.I-\n\u0002vA@\u000fDl \r\u001f8p\u001c}!\u0007\u0017:\u001d\u0003\u0005.uXb,15(`ռbYȅK2Uw\r\u0011ׇ\t\u0003\u0016_ yC7^\u0013R\u001f\u001e@q\u0014X;\u0000o;w\u001d]8|6s\\\u0005F\bV[a4,\u000e/\u0000Aqp[\u0005k=;\\ȯ f+7@!H\u001126:C6\u0012 pm \u0016ml\u001cO \u0003+8{\u0016q\u0015\\ׁ\u000eD!P@rԣag\nBdI\bR&ԉ\u0013\u0017qMYϢhc.ƓޜG\u0011{a87N\u000eso5dX\b݋`J\u0010#\u0012o;A\u0014\fccx⇿\u0015LNHV<OxF62\u001fGF_\b#yCaC[yh\u0002\u0016\u0018}!\u0018D?\u0004١u  \u0007\u0012\u000f( \u001bKd\u0016&̒=KU\u001e'U\u001eQjx#$\u0003~Yx/\u000eh0_|%|@t)\u0000MF\fLd0-\u0004\u0001/$m/ߠ\u0003\t,#]@\u001aN\u0019\u00144\u0015<r\bUſP]8Ln\u0010\"e1]}}\u0011}\u0017I;\u0003\"4\u0001\u00071 \u00067VP\u000b\u0015@\fv\u000e2\u0015~oi\u0011E9ќ\"΃,`8U)\u001eJ*AW\fZ1]\u000bU]KWNcKj\u0005\"p\u001a\u0017\u0015k\u000e~X\fu{_\u0011FLUB\ts\u0019#\u00020]\"\u001eL//\u001bj(+$7\u001cS\u001aӭm\"]V\u0018Weh\u0002./Xmkg\u0005❟A\u0019/*\u000fvPs\u001c$nF\u0013\u001d0U\u0014R6*p*\u001a)g\\IQ&$\u001a:)\u0006SL\u0010w^\\R\u0012~!\u001f8%A]\u000eڃ_\u001e\u0005}x\u001aB6>vL7(I\u0015\u000b\u0019sU\rg\rF3Lc\u001dL.SITS\u0004<F\f|dHw\u0013*@\u00154 \u00067v\u0018l\f\u001c%=T'\u0006eY«,<%n5g\rڦfmR[zAҭ-KUAi\u0001\"\u00062=\u0006ngM^iS n)<q},&q,]xQ̐u\bx*3@gd\ncuvu&ѤHom9v(8_-ͼB\u0013\"\u0006ΆyP\u0018\u0017a)!fZ=\u001d\u0002p㭡\u000fє\u001b:\n2E)˖*\u0003\u0015kXF%Tƨo3M\"ZWM\u0011\u001aM,S(C\fUKis໦z2*hgʌ\u00120O\u0017֗\u001ae\n]k\u0016[\u0002F[ TN\u0006M\u0019A\u0018\u0014Ag\u00046W鮣//\u001cw\u001b\u0007\rER\f$zGuY.-*\\]YD i,Wy:3?i5\u001dz\u001e[&\u00181T oeмg]l^u\u001fm;8h=\u0014Co?P\"ՖgWK$BQq#Pn\tf[\u001c~\u0016M\u0019xAb3\u001fԈnm#Ǯ\r\f\u0019F4\u0013i\u0006\n_(\u0019J'u\u0016q<,2\u000eZVP\u0011\\QJUd}=5@ !a\t;D\u0004H\bD\u0016Ȏ\u0012\u0016\u0002\u000bVX\u0004\u0011 Et>󞞹's1\u0017{.bXܛ|mz^y3-9D^鮒\u0004d \rL4T \u0006~\u001am8d{嘳@_h[;V'\u000e(PJ\u0015Iki)%F'\\\u0014WT\u0014onuwWI\u0002e\u0001\u001fU'\u0014z+fjol\u001d/c\u0006}I6\u0012K m+ΨU\\f\\VnFeoÅwE\u0011*I> \u0007\u0002fh:֥ݰ˧֚\u0013.\u0018n\u001f&(\u0005袔[1Z(>D$h\f\u0016$\u001bk\u0012+{*%\u0001K\u0003Gu\u0013\bS[\u0007o{d<5mq|셽q\u0017j??gpzB9(\u001eR\u001cF/\u000foeV\u0013[׃ZE-M]5rI@.i'\u000b\u00077crk]:_Szp؜q봋s\u0007d\u001c\u001b\u001d\u000b2hD\f\u0017Ӌ>n_ҧʫW\\[1(\u0004\\A\u001ax*P&\u000be\u0017\u0007~Qaўw\u00185rr,`\u000b)||dh2e\"\u00191!>L\u0017p\u0005W1CB\u0001zmM><\\(\t\u0006\u0001WyPzѿdf-\u0018-hxomP\u00161^\u0007R#g\u0012¦iIIVD6)/\u0003D~R:.r\u001e\bЬ,N\u0007/T\u0016\u0014V\r֭],[y\n)u߃\u0017\u001c'/RBHoHgyQ0\t\nL=ED]\nDI(\u001e>݂]+Q[W_M\u0016[f\u001b1-\u0017cC\\ÿDa)5:6`5\u001f\u0013\\,\u0015\u0013+E$Eq$\u001brV7z߂jZ'W\u000bۄpN%\u00174X`E\u00073\u0014@\u001bD߅P Y\u0012 &\u0010(\u000bNv\u0004\u000b/W\u0001m\rF\u000fI,ˣF\u00039\"\u0012/*J~\u0012\u000b?\u0001*\\8\u001c\r'C\u0014\u0001| X\u000f\u000bd}\u001f5\u00041\u0006RL܁i\u0006\u000bk\u0002|s'\u0010Z8B\u0003$1\"۳\tu\u001cod\u00158\u0002:;r8\u001c \u001f8\u001e\u0002\u0018DC+D8CN@;\b)/\u0002S\u001e~l\r\bZCDݑA5\"*{&#U\bd8p@>\u0019\u000e3\u0006Nl\u000b\u0001]80\r{`\u0019\u001c\u001dma\rCV\u0010s\u0012\u0012X@\u0011s`\u001c5\u0003Qd\u001d3c&?.n)TC\u0014*בֿ\u0014\u001b$\\\u0014)\u0010/]\u001dN`\u000e,w[\u000f\u0016V6\u0003/\u0015SW1F@g\b\f JU\u001fTC\u001e4\u0004$\"\u00031 Bg\u000b$*A\u000eHP\f'\r`jAj9H7\u0005Z\r$d;A,\u001f\rQ^jC\u0002>\u0011Ak6*\u00128\u0018$l\u0001(|g<5\u00179jCo_j@nE\u001cDioK \u000e0W,\u0007\r`{k\u0001\u0007X3_\u0003*\u0015yBJZJEZ\tn\r$/\u0005\u000eF.\u0004D>y\u001e;5\u001b?5\u0017\u0011HoCI\u0005H>\b,\u001d1S\u0001\u0006d{jC\u0016<, 5\u0011\u0019uj\u001eS h5<\u0003:y)!j\u0014@Ky\u00134@ݿ4$ig>3M\u001bM\b$\"\rq\u0018:y;*C\u0006aӇ,\u0015.1ҽ?'qL.\\|\u0017Q\u0015&$NzEseP\u000bO\u001aN\u000fM%O_\bP@<Ґ\u0000ֻ<\u0013eh@!Z\u0007\r\u001bj\u0003Y\u0014u&o5C\\\u0015D.\u0017S^GU$ͅ`̐n1\u0002\u001fp=\u000e\u0004p\u001dS\u001b4\\:\u0000\u00199\u001dx V\u0007\u000e\u0014a\rd\u001bYˤ\u0007~Hg/$'\u0014gK'd=\u000biN\u0010%\f\u0016\u000e\u0007\f\u0015\u0017t\u0006=n?e5\u0011&S7\u00024!\u0001i\u001f\fHC\u001eJ\u001d9@ї\u0004\u0005^\\Z\u0002;=z4C1O#\n\u001e\u000bFI%>aOЀ\u000e~9x,&i<4\bА͛lG6\u0003\u00078<d\u0014\u001b2K\u0010^QMk\u0000C\u0004Eu:NUb{Ӫ\bnED@.K\u0000!l\u0012H0\u0011BLɞ\f\u0001\u0003A\u0011a\u0012Vb9*xZ{s\u0003\u001a?Ua^W^S/OU&=/ԇD\u0016s(KPٗ.\u0017w\u001aF%vB1.io\r3)\u0000\tiC\u001a[s1\u0006ZО\u0004\u0006̞\u000f\u00107\u0018̯L\"iJ'3؝\\A{DJP[𵪦\u0016uCUcu)t\"\u0015V\u0003\u0005oY\u001cdϒ\u001c\\\u0006kpyW\u000fic\u0014vR\u00105.M\u000fss\n\u0018dV¾[\u00146\u000b\u001aʺL:֐a)V+f\u000eęL{jG\u001aJ6;\u0003o\u000bT\u001dX\nڣƹ\u0006o\u001a.yMG`\u0019bF\u0015)\u0003B+DoS9&j+3\u0010%*MF̹gE\u0016 [\u0019W>`\u0003H\u0003\u00117K\u0016\u0000\u001f\nA\u001aNmtaLs)\u001cJM\u0010\n\n\n.QY2%Y\")u\"bb\u001b]\n\u0016q@$8@50\u0006Eڿ\u0004p\u00130̿\u001abv9YC\u0014u7DrV,8dI6\u0019\u0019\u0010Rr<ĵ\u0007H\u0003\ti(ߴ\u0000\u0017\u0006׵G>trÛV\u001d/,أO[C0\u000fL]5SI\r\u0012=V\u000bE\f\u0019f\u0016Kt\fXBkUS\u001dj\u001aOL~Wi_\r\u0005\u001b\t鶅\t\u001f^9k>=퓝#ۃ\u0006͑QqMz\u001cZA(VIXb>Yʙ,uI\u0019r-\fRzV]@j\n齒B \u001e \rdW'`#g!\fƽßo=Uǹ\u0013C\u000f;|{Z#\"[o]MIjRE6')\u0010\u000boT\u0015WV(\u001cV\u0018X5\u001c֝\u001cU[++\u001f\u0003h(\u0004\\A\u0019j|l>m/^7K>fs,ؐ'NY\u0015\u0015JdXʮK\u00122_f\tdzh\u000bF<ߪ!z\u0019A=P4;A%r\u001f\u0017@Esw]kЙM?\f_p\u000f8#,-:Ym+jQY\u0019ņ<\u001eYK\u0011\f\u0005G*hez}I$jp^ixo\u000f\\G\u001aJ9\u0011t[ivO=W{y\u001f{7\u001aQUmqYd\n݄/4s\n\u0005b)R$\u0018Ī8V}pKsةU\u0000u\u0015\u001a\u0018_8t#Tov\u0007\u00164t_6=s\u0016\u001cꋈw]`X\u0012\u000bҊsdU4a|S$$E#LM\u0001aT\u0010\u001e!\rLdN)σM~kcK\u0006\u001f_o}vvo8~,x8<⻘4j̒\u000ebyƉ_Qy\"\u0012Z4`k0m\u001bz{i\u000f\u0014\u0006\u001a4hހ\u0015&ǁ\u0007qܵy\t\u0013\u00179O\"n|\u001f@\u001cF '\u000fgR> ݈6fYM\\\u0011d2\u0003m&Vp73pp,gn\u000fWA\u00018vx2\f5c\u001b/OO\u0012p>\u0019\u0016D962{\"1>m\"\u001dS^gEYQ\u0018ϸĐ҂\u001fz6\nv|yl\u000f@jGr\u000bj`bC\u0002o+\ro=]ޜ3a93W\u0002gC3\"㧉1ԸkxI!/)uJTm\u000bs\u001aE7\u001eC\u0001j?EX\u0016z\u0016f\u001b?l^s_);xً\u001eٳa'fKf`cf\u0001KʂCgy!\u001f$a~W\u0007\u0014}g{\u0017e\u000f(]P\u0005;#\u000bQ7l\u0006a\n8\n\u000e\u0002` xd( \fyBr&\u0018g\u001d\b\u0001p\u0011>\u0018;~`}\u001d\u001ajuBR*G!lu))6\u001b<קix\u001a\rA;/CԞPH\u0017\fi\u0007 =\u0010H\u0003\u0010\u0016\u00181=\u000bb\u000f\u001fPz\\\u0000Qoh<\u0007-^(\u0011eCUM-tZ':-\"%\u0004,\u0012X8.\u001cλ\u0006\u0000\bی-~\u000f^m灴\u001c\\q\u0016Jw\u0001֮ u\u0012dO~q|\u001b2PG(\u0014\u000b\u0016ac>lpN\u0016j2[\u0003K\u0005e\u00058v\u001cGE\u0001łH\u001d\u001d\u000b\"\u001c\u001eBH\b)$$\u0010{\u000f$!H*(( X.l\"(\b3{9W?p.Y{o\u0003fF0\u001f\u0004\u000b\u000f\u0007 dI\u0000\u001c_\u0007}\u0000\u001bRb/Wx\"\u0003x\u000fW\u0006]^\u0013\f<|s8ųq0}<\u001dNb8!\u0002\u001e\u0003\u0019cV\u0000x}\u000b\u0001s<O86o7\t(G\u000fs\u000e\u000b\u0001\r\u000b]p\u001b0\u0017n\u0005\"\u0017\u0010.\u0002\u0004\bK'@22'0.\u000e@t\u0006gC\u0002:\u0004umtvH\u0013z\u0002I\u0003\u0004π/9\bت#;\n\u001e!\u0010\u001a:\u001a\u0016\t\u0015.񑈾7შQluXk\u000f\u000e@q\u0006\u00008\u001d\u001e2.y\u0000\u0005\u0014?\u0010M\u0000\b*\u0000{&\u00040\ra\u001455sL\u001bCTWH䓘\u0017\u0007㞇\r\u0002RL\u0000\u001c\u0000S1\u001b8\u000b@p\tI\n,.`f@\u0000\u0019\u0002h\r1\\Mפċ_\u0012ſmCDwaޠz\u0003{\u0007q\u000f\"&ޏ\u0018F\u0002\u0003\u001eqH\u0000-Sc\u0016\b9\u0013CA\u0010\r8=\u00070냁\u001fobIu\u001f1M諸6.b?)'|?UjG\u001fo\u0000\t\u001e?NS}\u0016H\u001cA\t u\u0005A^0\u0003Kpt\u000eJˋB.B$T`ΤH\u001aN&6\u0010sރz:hG\rF&\\\u001a\u0002Ȉ\u0003\u0001qHCY6қ\" t\u0004u\u0013h62\r@@e\t̒G}ߥ\u0015G?մ7W-1ۨǼQ}W䋱D[a=<S@6\u0013{9\u0004n\u0000]\n|\u0015W(m\u0006j$\u00162_+ϒj=\u000b7ewbʯt[b\u001fs{3\u0013i\u0012\u0006l\u0001E\u0013 \u0015q`\u0004B3@{\u001e\u0018Cag0Iy&\u0004\u000eK\u0019<^RKe<\"ywqEΤ*y{bVeumus]E\u0003.Iv\r9Tҋt[@\u001a@\\m\u00075@; g5\u000f,zy C^p..蕒\u001a\\Jy%`ܡ+8\u001cэ|U|%\u0019ۤ;ԞޓU&?zY'qϙ@Ze\u0007lyeHN\u0007ι`^:V|`\u0010\u0013~yIϴn)0o$t9ͤh$\u0015j\t)Wr+qe)]bBȚړ]˲\u0005P\u0011\u00072AzS\u0000\u0006\n<@%e׽+\u000fr\u001f*볢C\u001e\u001aR\u001d*\u001aUq+RHs*riN9$XDe:5\u0016}km\u00014dO[i\u0007\u001fAK\u0013F\u0014\u001eJ\u0016yHu\b6\u0012(̌\u0006\u0011WˑJX\u001aU\u0019ä+N/2XL<3fڡϡݕhZ\u0013-9А\u0013\"\u000eZy\n=VCM]j|bCڬ؄\u0016#ب3kel^P$-*U֬\\9j40sf-EhU1\n\u0003g\u000bHG\u001c+@_7\tY@Y{\u0017Uz֧u>w[1\u0017,\u0004b]\u000eYH\u0002LelQuҬ`ZdY-\u0016IVQ¾\u0016guDY@\u001c\u0003\u0003<\t␋\n_x:\u000e[9pˣ!5Q-e'&\n㤞-Pq$FD\u0015k\n(\u0015ܚ|\u001e9ǻenkxn1P`\u000b#|\"Ȝ̍\u001c\u001fj]w{ME\u001eP\u0010[[L('1F:רgKjJPER+.4ŧ3M\b7XN-Kt_\u0012>\u0010\u0003kDP\"ga^c\u0007\u001b'qqK>˞^=SgsוGŜ*OJ)*JS9ZSXW\ntr]:ǐ,ȣ+*,4EC>UuӜХKe\"[\u0000\u0003q`/\bj,\nIgM\u0019k@7\u00026޺|tŦڳ1ѥ\u0018|~y\nM_La˭LQM\u0012-àͥXL$}9UBȹn&;t$=)Y-\u00050\u001d\u0003\u0017\u0019e\u0013pD`aǌ{9vZkgoaG\u001aQudC\r g\tK\u0002v1[F?!RS\nzdH4%Y0aN8u)H\td9s\u001c8\u001bg\u001c\u001c[lIJŴ\\u]I㚚G1\u000fhhjsP+]\u000eռ\\}xn~sDr^G{TA\u0001PI\u001b\r=uz:ڬ5>tk7ͤ﾿Mw/uk\rzDs7u#)y)6YAO9e;\u0016푷T֦P{@!AsS\u0003wZCRs\u0001?\u001eU\u000bO>R\u0005j&;ߨ}M[Z\u0003\nW\u001b}^\u000fw76M\u0016UK,Ց=8RAbyڰsԁ\u000b֫\t\u0003u\u001fTqZV\"D\r'(`A^Iyݿ20duQ琯UPi5w[\"I^OjfƵ<ɕ\u0012awY9*y;z\u001aZ]k^\u001ewiT\u0015\u001f4لݔxwg\t10dBVI۰ՙ!NG\u0007|=xa\u000f\b\u0004~iw\\p7?W^)m,m*m+w4XƋk/\u000bTA!\u0005GRpn\t.q.qst\u0019\t[q\u000f3c>VF\u0003\u001dn=\u001c\u0017R\u0013RL{\u0013\re\"Ibw:C/8\u0019hΎ\u001aC\u001d\u0013B\u0013h$3b\\\u0015\u001aPpJx֮CyK2c~\u0017q_vdrT]ptInp<!IȍN0Y\u0013{،\u0003\\1~dsRd }0b(|(ltT%4\u00114_+gY)FirM2!s:\u0014ω}\u0012\u000027,\te(\"G7EG.\u0014C]\r_\u00165-;F\bE\rKxWh\u0019_L9\u0015Zax/waE\u000e|-\u0011jh$$8r!B+\u0003Y\u001et\u0014nEvxE7\u0015'|_\u0018B\u001f{\u0001AxR9躬N\u0013\u000f5_\fJ\n\u0016\u0015ai&ܖImUlDZ1XK\u000euZO\u001d;rpl@}\u0018v;nS0\u001a\u0002q)\u0000-h.\u0017_t Z;Ո^\n8NaZ\u0005Vha\f\u001bEp6b)\u0003f1\bD̊pV qU\u0010RV\u0007@f\u001c+_\u0014}냊5^Y\rz\u00164[{།\u0007.N!n\u0010\u0004Q=A)Z64X\b\u001b=&\u001ccຄ\n/\u0010\u0004\u001a\u0007\"\u000f˼6pͶBh\u0001rwr,\"\u0005\u0016mگ7\u000e8\u0001T:M \u0014\u0004Q\u0004m\u001c_aΆ&\r:T\u0006q\u001fe\u0005\u0001_!l\u000b8t\u0013\u000e\u001aC`d\u0014\r\u0019G-\nmPjbjRJ\u0010T\u0007F\u0013\\G\u001d\u00002cdD##a5ҥH߈*'\u000fBxr\u000b\u0004-ې\re_ps+\u0000\t}`>\bF\"Sp\u001c},t6\u00156\u001d!l\"FM\u0003l I\u000f\u001e\u00063Ff9X!AN{H+R\u000e<!:\ry?$\u0007\u001d\u0004`{C\u001a\bT3#>ƍQgSwy*\u0010w\u0003lHڨTG=\fcpsdX\"[\u000e,G\\Z\t\u0011\u001f$7\u0005@t6\u0018KH\f\u0007\n/i\u0018m>MKH{\u001d\u0010\nD6XkBA\u001b2\u0007]d\u0018 \u0018\u0005([\"O@~b\u0019N\u0017{@\u001bi\u0003 9\u0019\bZ F?x9\tϙa\u0018c<M\f\u0015cy*\u0010K\"ِ^\u001br۬\"/c\u0004cW\u0015\u001bȬ>\u0004iǩF9\u0017\u0005ݬۜ{1HH@?!i&Ri#g.Qi@sTnB\u0019\u000e\u0012\u0017z!<\u000fy\u001d1v>\feJ\u000b?Vެ#Cbhw/e=(}z,~L:\u0012%|HŞcdA@6}GnRŨj=\u0001˱j*\u001dn_J2}\u0017rcf3\u000e2gҎ$MIٔqQ~7לG᜻\tvfOJsE]Y*HPkPN\u0007aZ\u0017nZ\u0002weCI~T~%c\"7*k\u0010HN\u0014T$Kc͢\u0007ܧEw/\u000bsGxvt'\u0012g@B6$7ϰ&5\u000eoT#G\u001e:\u0000i)E\fe\u0004d\bY$oH\u0002\t\tI؄\u0019\u001e\u0001ld)C@+R\u000f\u0001\u0011\u0015\u0011\u0010\u0005>}/Ç}\u001e\u000507H^\u00060\u0002iƟRO~O$,i,K0)QN|BȢ`\u0007\u0015z@`\u0007/A\\$%%!5v_k\u0001\u0004]7\u0001t\u0004\u000f\u000f\t7S.l\u0005\u0019\u0016t\u001f\u00059nF\u0018\ff\u0004=ް\u001e|\u0011܁Uǵ6[B\u0004!ڐgiz\u0019nT[$\u0014߮sڀxoʐ8\u0005dgW\u0002\u0013os0f3iAp\u0002Z\u0010\u0013\u001b@bڢ2M\u0011\u0005q?\u000bn\u0013\u0013.a\u0015~DX+\"UP\u0017\"\u0002\f\u0007\u0001\u000b\"d&R0\fw~T]\u0012sJ/)h\nk0\u001cx\fQ\u0018bF\u001d-&*E\tjQQDkbaĠ8?R\u0013\u00139Q\u0010_3k\u0001ỵ@\u0014`\u0004 ܦO_,Z_t86]aɿe?'#\u0006a\r<RN`V0epIt&\u0014+٤FI\u00167)DFP^2)$9enUH\u00064 \u0006q\b!\u001duL\u001f(n_َ+;WcT\u0011]vgGjx@c\u00125FȢL\u0015G\u0002Ŧ\t\u00141RI\n.IN迈\u0013<\tE\u0016\u0010d \b^mdF\u000f\u00141Pa]\u000f{f펎_\u001c.\u000fh\"\u0004&%\fJL8YVE\u00121F*dޑ\tY\u0012b\u0005S,A\fu-3АGr\u001akuAK[\u0017~0zd{dڅ\n\u001dU{}.ο2HP%Gs%\u001cF(\u001e\u000b\u00021/SUJp\u000b`\u0003\u0019)\u000e\fFV\u0003\"Ѐ̥\u0010ɑ+O湖vNY\u001fzrG}úMdGҩX\\ʇ\u0013\u0012@.KX\n\u0019C,\u0011\f\u0018c\tL3EGDs\u0006\u0016\u0010#9\u000ehh>dë\u000e\u001dcV[L:<W޺^^\u001cr \fM&3\u00181\\\u000e_.s)\"$WB\u0013I)\r2_F\t0U8M_\u000b \"\u0019X \t\u001c=SvXkΛn\u0019ky^ٖF\u000f+ukQEov1\u0001J̥\n\u000e\u0013)\n118)<^JH'H\u001d\u0013F'阵(|x'\u001aȑ,Р\u0018+=t'n\u001eL}eYK^mwZ%.DR\u0016\u0019/XJVltKI\u000f\u0014\u0014*q$X-\t\u0019\u0013b3'a\\tZ\u0000\t\u0002\r\f޹\u0007\u001d/\u001a}tzcZOUwZ\u0014a2\u001b0Һ AMx\u0018B.gDƱ\tb^HQz|P觪\u0011D~Śx3N`4}-b\u0006\tQ _(PfZiڍ3BMh4\u001c1w~\u0017\u001e/\u0007y-`?v\u0013\u0001\u0017@$P\\FpM\"O.c\u0002/uFx,\u0019Z\u0000\u001d\u0006m(\u001d\u00025ۡ_;@\rЃ='5ǩ\u001e[SRꠇ\u0015\u001b\u001dݍ\u000f\"v\u0012;tbP;L*cZS-\u0005,\u00165zk\u0007z4M=KFV\u0003)[ P\u0019n2FzCC5z_Z~nf:j\"\u001eu>H\u0018A\u001c\u0006\u0003p\u0001\u0011ѽ?گi\u00034\u0013T޹(΅pU\u0001&\u0014Pl\u0001}k\u0000jۯU5{jٮW%/{z9\u0019JԤ#)-p\u001dp\u000354X'M!0Mxw\u0018[^}[Z@\u00014҆\u001eB:ta}~~\u0013\u0001\u001do7Kha]9\u001eڹye|e<o=p㹺Iܮgx:\u0017z]8_\u0018if\u001f\u0005V{Ps\u000eT3\u000flE.\u001b.$\\~ڲe%3K}p7I\f\u000b8KeJJJ݇f{\u000f\u000e6\u001f;X\u0003B\bECMZPՀ6Tу>@?\u001d\u0013}b#o\u001d$`\u001b\u000f\u000f\u0002W\u000f\u0002\u0018{\u0013tC\n5@;\f\u001cA\u0003_\u0003\u0017m@%kPkj\u0005~\u0004CfeK0J\bjn@A((g4:\u0007I?|kXy\u001b\u0007\u0015I*x $%Rt\u001cfffjj3\u0015Q*jS$bZ\\uab'q(\\}\u0005\rTp0zS\u0001s\u0010(\u000b2A\fhBm\u0004Tc4\u0014탱!\u0010\u0004\u001f]~^\u001eqD:M\"!#\u001bM)\u001cXag\n'd&n,\u0016D#fa$ȋO0K\u0002!G\u001f>(B'j\rm6s+.\u0010\\I9M\u0012\u0001D*\u00149N\u0015`\u001e\u000b\f(7Fx\u001a!$\bfツ^\u0000k\u001bx]\u0005\u00052_K,GT-t@B{,Z_]\u001f$\u0013$)\\Na8XE\u0011=\tÌ\u0000\u0018zs\u0007\\\u00112\u0019Nl숄\u000e^\r\u001dRMVBd\u00022ePڠ\u001afV*`\u0010u\u001a}P\\\u0010\\\u001fcB瀿\u001c<\u0012JmQۂ\u001e\u0006G0ց~\u0005Ӯ^\u0000\r7Pz<\u0003^O$B°7yi}>Ǎhc'|>B':8<\u001d\u001cWC𼍑\u00162\u0007M\u00100,؀o\u0007N\u0003Xׂ䣮wv\u001dk\u0005ʯH\u0007\u0017H|;\u001bčW\u0017H^:\r\u00144\u001d.\u0010x\u001a#=h\u000e1\u0010, \u0012-Gr\u0015R:\"\u0019\r`\u001dq\u0007'yq\u0017~=\b\u0000@$=\u000f \u000f\u0005&j\tڐw\tc!o\u0012&\u0013\u0010\u000b0\t\u0007*r4\u0000\u0010bY\b0CFsȒ,!M[t=\u0004NU\"\u0003)\u00173\u0001`^\u000eD`0~\u000e\u0005폰I𱤡\b-Y\u0013I\u001c|8\u00169H\f\u001b #D\u0017:#e\u0001DN3a\u0016fȎ\\\bE%+!_\u0003q\u000bU7xw\u001f܎ pN}!\u001ckH)\n'c\u0018-uh&W؁/1(\"B\u0017`\u0011\u001bp\u00117Yk\u0006e9⬐˶E\u0011TxAT\u0017\u0010\u000eGLro\u001dc\u0018?KO~K\u001b\fRSS?{i_c#:u\u00016ᐼJ\u001fU\u0006O\bjoS\u0014p\u0015\n'r\"\u001dRqΐ1QcM#)'\u001f\u0017X\u0018\u001ekF/%mG{~B\u001f?d%KD.\u0006\u001evX5\u001du3Qi`slB\u0019\u000eE|q볢0H+z/}+K~?H\u001f\u001ecd`v1n\u000bO\r?dh=L-6kq=NƙL\u0005R\b\u0007\n=d,G\u0001Jfb\t*\u0003\u0017`[%ƶh>\u001aU^ذl`\u000e=>ԧٝG\u00190odg>$\u000fnޤ__I\u0019\\2s)\u0000p\u0013Fn\u0002[\u0003lu4v?\u001f5\u0011c5v\u001fwֿ)\u0017\r\u0016eG+\u000b\u0013˙%5oD\u000eH:2p~Lξɹ\u000eΧ\u0015}⏰O2t\u0001.\u0004KC\t7\u0011:y,\r\u000fT\u0003zdVG[ʾ=VF9P\u000fis.)/w\"`8P#\u0010~\u001e\u0011}b\u0002C:1J\"n!ȼ=sSbMsF])c~.SPn\u0017\u0014rn(\u0005W%\u00173\u001b\u0015ʓN\u000fc\u000eQ[=T\u000b,BBx\u0013yɮ\u0006ht9e5hp[Ԋ\u0016˓\u0006vja̭J9jsT}vi.|oC#\u0005$\u0017\n$Z-\u00032d\u001aAC.q \u0017{'i:\u0003\u001e&C\u0001\u000b\u0007D,{ږ^;2(\u0017+r9gJ\u0004'\n*GUYs\u001b\u0007[eu\u0014-FvAdOse}N6V\u000b\t\u0007i(&A\u0006;}_;c䰛p­\u001f\u001fs\u0017}Vt*Y\u0016I\u000f\u0016Ve˯W6嵨~[TsdJiujeje\u000ekq@\u0017H[2\u0015YD,%!iAG\u000f\u001dF>s:\u0019jh[\u0007i~W\u001b#J:Q#gW\t*J-eٍŻu\u0005Mj*UgirYB?uz@Q\u001e5B];s\u0012k:\u0000~\u0010#-4)A)ԡ\u0010Z\tI\t-\u0018\b\u0012\u0002\n\u0003\b\u0002*H\u0017DP\u0014\u0005]\u001d@?\u000e8*~Yѳ}s\u001fs\u001fv:\u001d\u000b{\u001f:,{\u0014~'Š\u0003\u001aBzj\u0003ZƲԨ3Y\t\u0005\u0013i%9ՙ\u0005\u001cp0W(\u0016D/D)췉y@4!M\u0015\u000f?a{g\u00156\u0006-K\u0006R.~\u001b4qj4\u0016h^\u001f\\:\u001aY]\u0019_^+(.*N/\u0014g\u001f\u0017d)\u0017Ԍ\f񟱒@:\u001emC\u0011\u0014y\u0017Sn~c\u0011+\u001dǯx\u0015`\u001aq_8ΩZAd\nёTaiEfF\u0019ajŜ¾#E%/KiG\u000b$\u0014I\u0002;8-88\r\u0007\u0017w>\\/\u000e\u0013~e*=3rpAO^?۶\u000e[cK8!)LjFU^Y\\Q/?//\u0013[>\u0013_LRZbٛ$8I \u0001r\u0015\u001cԫ⾶oý\u001b؁{q{\u0017nvh䘽a\u000f\u0001^k]gOhV0qјĴdL^M0TW\u001bõO5Ki1oxU+q@\u00126\\E\u001cT)I\u0019}QFˣ{*޴!ݖ17ݶa\rL\u0010jiO$3#>$M\u0010r,ȅ#q)MU\u00112Cu\u001e6d\u00057\u001f\u000fm\\N\t;\u001f~8I \u0019\u0002\u000ej\u0014\u0016\u0005<z<!\u001e>TD\u0013\u000ffl\\o,jo\u0004:\r\u0005{\u000fFeǲS{zbb#;\u000bW\u001eק\u001djH\u000fj\u001fNgv̦_\u000b-\u00128$t\u0007%d\u0004iF4;$ݑFSh䑎T^Ŗ86_p&\u001c\u000b\u0004ׄ!\u0005q쁊D$\u0002߁!\u0001c`V761=/{5J\u0012\u0010qP)^^ >\u0012;JBf6gdt\u0016mB᱃F՜ACƾ,ǴPOh\u001fޝ\u00146wB\u0018(\b\u0018\u001dwhñԉ9\u001emb%~cPI _\u0006}8-ۤН\u001b\u0018\u0011\r<F=\u0014Q+\u001d߬O8)4miuy\u001c\u0011(\u0016<\u001b4'\f+d1*9s\\\\gh'ع\u0012_l{$2\u0002ZhBhFI+D>/οQ\u000fKrk{5.T@%uR=w1щ\u001aXE_R\u0016\u001b^K\u001d>\u001eKC\f\u0007\f/>/iE%FoZgaA\u001aլ\fHk\u0016U-ɫV\"WCW9FH\u0004Ք}B[Z~Z\u0001\u000e\u001e\u001f/9})gOrveNf\u0017B82GuRbE\u000e| |#5lYwT\r[`w\u0006\u0007i}\u000bӣ}\u0013\u0018x={ɏPc\u0002Me\bC\u000e0cy\u0010^a[I2ކP_\u001fB-7\u0010:=P\u0002\u001e&\\\u0016h\u0010Ά80d\u000e\u001c\u0004W\u0015\u0006Ph\u001b\u001a\u001e'\rbp\u0001N't<Pm\u000fu༮-t0y'I7V:V\u0012yD8t\f\u0014p|PG.\"\u0017IL0a<\u0005\u001c7y+Д_\u0001*\u0010\u000ebTm\u000fҷZAV\u000b(f\u000eMQ\u00044L_\u0018nHt\u001f\u000b\u0007\b\t#\u0002D\u0014\u0007d\\\u0018(YN\u0005m\"\u0005\fIn`!\f2\u0007Q\u000e䬁\"o\u0005d\u000b`n2M&\u0010`\u0004 Pԇͻ!\u000e+iC\u00164+kBDu\u0019d- _F(\n\u0010\f\u000f\u0005\u0005Tn\bR\u000f7X5\u00147\u001aF\u0003p\u0003.0d!PF\u00138;!\\v\u0007j@n\u001bdʩXN\u0015NȫIC\u0000\u0014o@+\u0012!W2hJ\u0010Q\u0005f:\u0004d\u0000{R\u0007\u0018vO>/\u001b\u0000}\u0010hc{6m\u0004@]Ĭ\u0000\tP\u0002e\u0014t\u001d7|\u0000|ϔ\bA$\u0000י\fT%\u0010O\u0003X黀\r\u0001\u0015>]4\u0004.#`\\5\u0006ƨ\tLϬ\u0019_\u00039,\u0005P-R\u000b\u0005,?S\u0004@5\u0000\u0013\"I\u0010b-\u0003ad\bV\u0010\u001ap\u0003'E\u0013\u000eBP>0O]QM^[\u0018\u000eT\u0014zYuQ\u0016\u0015  Ɛ9!\t\tI@\u0006\f@ \u0010\u0000\u0019A@\u0006\u0015\u0004\u0003(rUZPE\n*\u0014\u0003Ȱw;9]笇ظ\u0006\bm@X\u0007\u000b\u001b o#D\u0000/a\u0014$vl\u001f\u0003a,|Fk\u0000~\u001d`W\u0003e\u00030\u001d;\u0007xۜ{!p\t.B\f\u001c\u0018i+n\th\u0015krx\u001d[6\u0002\u000f\u0010\u0001?\u0010nn\u0002̀\u0013\u0000Q\u0002'q-[FÖ8\b\u0018ā\u0000\bh\u0006=н\u001c\u0011\u001b0\tD\u000bA\u0018\u0002q1\u0003O#pR=\u0016\u0018%\u001b~\u0017h@m\f3@\t\u0002ҵ@\u0017<Ex}!3\u0012)j*t\u0010\u000fo\t5\u0001\u0002\u0007\b\u0010`\r .\u0003*{`^\u0005A\u001a8\u000fda\u000bAu\u0001I\u001bD+ .i5p\r]\u0007\u0019izK$T\u0017J׎\tcg\u0011\u001f\bȷĩ\u0003$\b{A'\u0014\u0002[\u0001$4\u0003e=p<Ar\u0016Ƚ\u0002Ŧy\fY\b=.\n\u00154/qN6KLM()|\u00161L҃\u001d\"_ǽ'=zC|KxEN\n\u0011i\u0010~\u000e\u0001 \u0019h/ykJ=\u001c@+H\u000b\u0005p\u0001\r}F@-\u0012\u0011afG^ANE;V\u001dG\u000343%<9jS]Ck\u001fwS\u0018΀ȟ\t\u0000-0\u001cBw{P\u0000\u001cA5\u0007\u0007}˴\u001e>ez$|\u0010e[IZ؀ ws\u0001*Cf\u0003V=zG\u001d%v?\u0016&\u0005W0\u0017\u0017e\f'\u0006waO\u0017\u001b\"w\u00066x \u0011\u000b\u001d\tÆ9\u001d<cX^O\u0006;-U,iBr3p\u0004Fm^\u0019V!uv3\u0017։ثˌ>~/ϸn\u0018l$;C8\u0005\u000b\u0001T7[ځ|\u001dفa\u0003䮛\rN\u0013!\u000e\u0017F#{4\u001ei!\u0012U!_ٔ>oA%W\u001e;9-<þ$`O\u0007Dfhl\u001b<%n|T\u0000QG\u0004\u0006\fwN\u0005::>r~\u0016u.;Zm`.W&<\u0006AȍԄȾD\rWA3JJb;D|Io\u0017KIyO\u0006%^<A\u0015O\u0013k3\u0004k\u0000\u001d\\!:_:o\u0006\u000fPzD\u001f\u0016\u000e[\u001cꮉw#j4V?VfN$\u0014q[e\u0015qGč\u0016ISV+\"\u0011>H>\u000eJ3*dS\n4\u001ap\u00051:?\u0019,y7s\u0002_pyP]yW~1G\u001cyFԦЎ'\u001bXG\u0006E6&Z,L( %;Hi{I\t2+F,,\u0013jB&)\u0000&:Wn*J.e\u0007W\u000f{;i4IsȒVIT\u001c\u0013|(0g-$Z.UíN2\t+TU%\u0006\tiC\nnE>rSiT\u0019՟՟y\tz\u000b\u001a\u0010߾C7\u001fu27ۉZ\u000f5\u000e/[|ٲ[\u001eWj\u001bʙN[QM*jmU-M-\u00104\u0012cR<7U>42_%di>\n35L\u0004\u001aA,ty\u000b]lrx\u0016Ogwۂ\u0016_;\u0012CO=aCAֶ2fS<֨ThX%\u0019B}0/D=$ק\u001eUR:U)?R\u0010Hӎ1thk\u0000\u0017\u0012uN\u0003\u0012\u001bf\t\u000fGkf,ںkyWS:s-=hUR*S\u0002 Y\u0016#0d\u001ee\u001c\u0015IU+*\"0$N\u0018%ǘq5@:g6t1f_\u000fKm^t?p#`\u0013:Ἇ7R4ԲwVW\te2raS(\u0012hr+F$!ˬe\u000fHP<3Sd[X15@ \u0006cb\u0001fq\u0011݉Ř]K0W4t\rQrFVXY\u001d_aS֗pRK\fq\u0007b\\&-O\u0010\u0017+\u0005=JA]4\u0014\u001f_8̗\u0018-,qi\r\u0010O\u0006\n1P\u0019=\rf<^g̍K\u001ev\u0017;φڻp;iSe\u000b#ݓ &\u0010ZJMr`:/2O\u0018_^*\u0011y\u0011Ni7.*\u0006a^\\\u0015W<ƴ\u0006H=;a\u0013f~.al̽s0W0}Wu8/l_t.ҳWl\u0007:j\u0000~IH\b (\"\u0004\f;\b\u0005\u0016BBB\u0012@\u0002aG(Vԩ#.uSw\n\u0015,0Et\u0000VE\u0005q=c=\fbʎϼO;~|}&GPnj'Stbo~~́\u0019ՍҴ껥\u0019?\f\u0017eUe\u001f\u001f>6\u000bS9G\u000f\u001bg?2ɃV\u0016Env\u001bK\u000e7\u001brk.\u000b\u000e^H\n/usYq[[\u000b\u00127sbMFuaӶ9Y\rk\nU\rE\u001d┆\u0002u\u001f9&NMit\u0004\ftIn3 .3^\u00169w^S\u000fǰVՑ\u001b|פЭ\u001737\\X%XQ\"L{~:ܮԶʬymdmC9\u0013\u0019TeZ\u0017l7$c\u0007hI-if+\fqA3$M\u0017ScC\u0017V\u0011{n\fЭ\t_}#/zq|εI\u0015JŕJ*-A#HOr{kJxBrA7좑ܭt~NZn2I##rߒ\u001cwYQ۞\b7<{<L\u000bYȴ{x)}\u0015\"I_DW%\u00135&u}zR\"Xp\u0007\"]~$\u000fҤGHs\u0017aF%z_\u0015\t_r\u0017|2U^~AɃB\u0006%\u0003h`U,\u001b숋}\u001b\u0017;&.v`\u0017o?O\u0010]GHO#'o\u0007LR9<|5bOrܬ\rW\r7/򬳵b;6ItSh\u000b<eڵމ-\u0004N?#?\u0006Gk\u000b\u001a\u001e\u00129:\"ݻ\u0010v.\u0016: B\u0013!\bB^=)TLmMz0'r'LӧSHRmEӹbGt\u0013ozK^șܹ35\u001e\u0011M᳝찹\u001e\u000bv\u001f\t.5\u0010BAEB\u000e\"Ǆl Po\r\u0004B\u001c+M\u0012\u0011g&<\u000eJ\u0018hK=@±aI\u0018۬\u001e\u00008h\u001b\u0013v8cN-{?po:Lv\ts~B\u0019Be2\u001c\f\u001a#0\u0016Ƒϋ$\f\n\u0010.\bBY\u0000>7ú\u001c{c\u0005\u001bD\u0007\u001afknNS\u0019\u001c2K\u0017\u0012R2LH.\u0018$\r&zrX艨Y?\n^\b3C \b\\?bY>\u0010\u001a.Ԉd#\u000fhݐky˰q\u0003ooLlqd)jMlp\u0006-:\u001d2{-O\b)zIH8!J\u0010\"\u0011\u0002HX>--\u0018t?x9g#0\u000bee:@i\u00035\f\u0016!e\u001296̰p\u0001\u0013\\C8\u0013hՇ\"\t`B\u0016ʂ,\u0018R)\u0012!*B\u0016k\b ;[s@\\#/\u0003\u0013x7)\u001b\u0002{4\u0005<ǃ.fq\u0010q!cB\u0005E1\"ST\u0014,B%\u0010W\"=U\u0010^\u0006\u0019jo3v\u001a+w)n࿡\u001d)\n>Hm\u000fW] f{!և \u0016T\\c\bMPCj1de6C\u001c!>\u0004Q\u000bDHhu\u001d«\u001e\u0010)5\u001bQʤ\u0017\u0004L\u000b\u0010\u0000@JM\f\u00060&\u0014j\u0005Tً\u0016\u000eH\tCָCR\u00166 \rQr\u001eq\u0007\tZلq鄏\u0013\t \u0002gL\u0004Q\u0011غ|AAC\u001fil\u00062}\r\u001dfl)2\u0016HϠY\u001d_8!e+\u0007<8!\u000fvCKľāIp\u00071\\h\"\u0002G$\u001fwH\n.HpAFڕLw\u00068\u0006(XahS-^\u0002\u0007dltf',rw6&`FQ\u00174%o\u000eL:\u001f:!\u001cAz;׈Qɛo%Cҹ7I\b{-GK\u0005\u0002+\u000bD4ȝP*yL\u0004\u0019a5\u0004%B\u000b\u0014)mP1oL6Ɍ=~i\u0007ޫԆ&7rG\u0014Qo1IyCWW/dc\u0001lL\u0012g)\bBC\u0015Bt!ő,\u0016:飔c}!\"LPƷ:̚\fbϱMr\u001a6s_`kcN8MEqkKX\u0017ܪ\u0016 {H\u001e\u0001\u0012 @ \u0001b\t\u0001B-@\u0010\"D@D\n\u0018A^VPֶ^u9ߞ3)1\tŌyD>$\r< \b\u0004\u0012{>p\u000e}n0\t1\u0011[ n3\u001a2+$lw}\u000bb:\u0012XۯQ)G\u001e\u001frU`0kq&LxO1\u000bQ\u0016\f\u001cf#\u0011\u000e@O[ a#\u001aO}k\u001dTm=0}ډ\u0015\u0004}Bs\"oףX}i$\u001a\u00196hW\u0013ѰV0+\ns~1e<c^{\u0010w\u0007\u0003;޶@2\u0006|)ҷ\u0012ld9\u001c\\:زsW? mUwNxLyZe)~W#31\u0002ϫpݜvf'eaOγf_f<U\u0004-\"\u0018,@*2̏Azoh\t\r;\u0016|g%ϋNo5\u0016z%E\u0018O\u001f\u0004Hs\t]\u0011:E\\\u0019j\u00161[\u0005&~77\u001an6\b~\u000fkG@|m$D\u0000[`(2W\n\u0005㐾^t\rhXݫ=)p~\\i)m讱\fH^eWB\n]Il.\fcd5Nĩ\u0011[x\u0006 _/WJ~\teT!r\u0019\f\u00052=H@F:+C\u0016\n7gU\u0007\u0016Tu|L)fx\u0011J.ǽ']yA\u001doV)D\r\u0018K1\rѕJi=,?\u0013',\nuҧXKStrG\u0004\u0002ÐHS\"2(Zl#76u{\u001d\u001c]v2\u0012ξ\u0002ַ\u0017re~j\u0005>9XET\u00142K\u001a^Q9A~E6fL\u001bH\u0017@S@V\u0001@\u0017((C^\nd\u000f!o5\u0015n3aNKǪ]/\u0013wt\u00079Q~u\u0019q\u0006XN-Q1J8yj^NB03S\u001e?*?\u0010g$z\u001f$\u0004\u0016\u0018 \u0006{\u0000\u0000s\u001a羚P?llew]O\u0015~{G\u0019I=V\u001fkȉŔe&\u0011ti\u0005r:NfQ\u0019J8Y9$Q)JRR^y:\u0015m<$\u0007H\u0016\u0001X\u001c|\\\u0001^ԯ\u0004s\u000fv\u0013-K.\u001bO}ݪ7rV>\u0005\u0018VANfgf1ӋjM\u0005Ou^>/NP\u000fJԷ$?I\u0018I\u0014e\u001a\u0002\u0005H\u000e\u0012\\\u0000@\\k\u000b\u0005X\n:G\u000e.5yionm>KWg\u001d(\u0013\u0015K\u0005ɔ4m\u0006#%']ƍϬ\u0015fe\u0019\u0012iƴ$:7<-3.#%.\u000b\u0012lb$\u000bzo\u0012b0[\u0010=\b\\\u0002&:7\u0007;/j;E\tW_\u0013v_\u0011\u0019U*\u000fє(ɧB-K^P\u0015Djω^H;)ʋ*|˔\u0016|J \u0016\u0018d!\u0019\"\u00115.\u00007\u000bEg0ri={vUM-ݥ\f:gv_cĄr5-4\u0019uF\u0011\u0018xb$\u0014[ܒ\\A?LQG\u0018\u0012l2d\u0007\u0016\u001c=\u0003iv\u0002\u000e'po\u0001\u0018\u0012ٻǩѕ\u00177w\u0016\u001e6qiD>\u0006YP|]\u0002>&\u001cQ\u0015*4\u0014q\u001cw\t\u001e\u0019mWB-PA\u0003;\u0002?\u0003k#\u0018t\u0000\u0003{h5h0phUw\u0011-uHy^\u0015\u0016/;\u0017\u0017,1\f\n0idҌ,M6ɍOhoht#$1a-0\t\u0002p\u0012F;0r\u001e]\u0003m3`\u001cfo\u0018uw)\u001e^\u001dlw+{/J#E]\u000bJ\f˒\u0016B'Q:*(v#-3\u0014>xJ÷!\u0011a\b\fm\u0000̝\u0006`,\u0000߷A\u0005\r,hr\u0001O-\u0005\u0017i\u001d<m<`*a|7r$]8$>\u0012~%\u0004s0ɇv9-t9\u001f\u001f(a\u0007x@\u0017!p`\u001c\u00149\u0006 l\u001f\f,\u0000n\u00010a\u0004ߌ\u0002\u0016@\u0011v\u0006;(ݎ[G%]\u0013;\u00181MοÞ\u0012\u001dOʾ\\O<JY1\n\u0000k5o\u001fk\u0002z2[\u001aA\u0013\u0000\u0017,\u00004\u0003P}\u000eq\u0002y\u000f\u00179WzA1\u001c=R0x-'\u0007a[i\u000f\u0004;HvE5}a\u0000\u0001\"e\u0011\u0010\"}_\"\t $!\u001bH$h\u0010\u0011bQtܦZ\u001d\u001d\u0005[-8:Wqj\u0015vTTqÀn|3s3wrs{S|\u0014YYճ-%gOQv@zag(Uzm\u0017rt\u0007G\u000ewNB6_a5dՍ,3kќ*k*reUx\u0014Xsǅ\u001cl*(Z\u00176ɭk#e-Q]1CN-/|/C-5\u0013ұ4\f!.\u0011_\f\u001d\u001br'C̹Cҡ\u0019\u000eL\u0017ݰzz\u001c)񒏔{g,\"\u0019FWL\u0015nK\u001b2\u0012<\u00114\u00158~?0qE`k\u0010 ?I/\u0010\u001a!\b\u0019q$\u0015pg1Y0\u0001\u001c\u001d\u001dT\u0010;ʡpA,L\u0017!f|R2\u0016'c\u0006Vzɱ5\r8\u001d.hR6\u0011Do<!+\u0012&!\u000f\b)\u0004R\u00047b\u0000E S(v\u00068b\t OAC\"\u0013ap|vFS\u0004\u0016\u0017!\u001c\u00045\u0010\u00018O]\bY+4{\u0014Fh\u001d(\u0014\"(V\u0002ӑ#\u0013\u0005\u0019'\u001cJ\u00100>\u0000%(wƁ\u0013fdlfG\u000fmrޟ~\u0003n^BL\tѾ\"4\u0010\t\u001cI\u001a\\\u0019dL\u0007\u0011C\u0011pf\bbc!Ń5\u0005R\u0017\u0014lOh0P¡E\u001ej9Nh8b#MN dB\u0014B\u0006gCb\u0007\u0001rDd\u00169CV\u0006I;hdF\u001eo\b۸\u0010O\u0014\u0014\b@p꣞Sc>\u0010k ᳐ENC\u0001P\u0014@^ᆌE\u001e\fgސlB\u0014@|\u0007\u0013<:S!\u001eRԨ/Do/G\f[1|l\fh\u0016f\u001a\u001b\u0004;\u001dU:A=\u0005*$(j='os背f\u001e2N/d\u001d~~C]'^\u0000OaM\u001b)\u0002^R\u0006q\u0019|m$\ty$\u000b\b\u0016rȋA\u0000C\u0013rr]3CS\u00052.TkyP\u0017\u001d~\u001d@ȏ\u0004A~6\u0010dJ\u001c\n\u001d|\u001d:a9\bz\u0000[ \rgB\u0019Ƅ>\u0005c8\u001bi\u001c\u001480\t:W\u0018=7\u001b9>Эvc\u00004ۂn\u000eAP\u000eAu,l\u001bȗQ!ѿ)^E\u000f*\u0011T'*\rd#d@G\u00194L\u0018X(\faaV4\u0007D{%\u00131K튢|O\u0014\"\u0017Ə\u0003\u000by%~Gnwv?DsdڐT\u000b߳`F\u000f5}E=\u001dz\u0005\u0010\u0000&L\u0006`dcn=\n'\\y0.\u001f+\\\u00122lZ\u001db憘gMOsN\u0018=ɪHӞK{*+y&\u001bO\\\u001b\u00060\u0011TAt\u0007L\u0014i/\u0005vNuĂ\f7uc\u0015ż\u0017s\u0005\u000e\u0007J>?.\\\u001b0s}Իym\u00159,?-wnog\\?]\u001d\u0013}oD|$u0R\u0001.\u0016`ḁS.͇\u0012\u000f=/4[\u001f/[$ɿ\u0014\u0017(*n)1w\u0003ƎKNw=Rv\u001c<[\u00007E\u0010)F\u0012$\u0001z\".\u0003\u00165,uL,X\u001ao?T48˽oҐ17*fhiHRRF酒EMs-3\u0005ԧL4'L]c;ڣ\u0005ϳۋd\u001e)\u0019!J~\u0017r}\u0018EoY{|\u001c\u001a_\u001ey\"űo2ksk\u0012._YB|Ʋ.͊c/5K\u000e\u0016\u001f9P|>wϹ%\u0003VKe\u001cdZ n)J{\u00174/#/\u0006\u001ax\f\nb\u000e}\u0012_`߻FܽR\u0014|~vLU\tk\u0004\u0017,W\u001fTy|zߜ_);q\u0007c2i@Vs%dM\u0010}Q\tỐOs\u001aڷYVp\u00193\u0006?\rc>\u0018 tF}i1\\Ci\u0012\u0017\u001c`mr\u0005kU{*7iw<狹_(o3~n9h2m:oHX\u0005ն\u0005f>L0\u0000?I\u00028XU\u0014\u0015\u0010A)ғ`B(@\u0002( =\u0018j\u0010j\u0010A\u0013@\u0014\u0010\u0014P\u0003((2눸zQ\t3{f\b{vV|\u001d>_NnMF\u001e*1&8xxo\u0002t~\u000b|NΌъXQ\u0015uTY٭\u0012\u00039.}|gWF>UVJoO&51\u0012/\u0005'&Tſ\nNZ\r 4D#/C\u0015\n\u001e\u0011\u0010\u001f+2\u0004T\u0019VkrRtLgve뢰\u0003\u0003%1Gz\u000b\u0012;ry\u001e\u0017r)R~1)ܿ>YƪLa&KEļus\u0004->T\bC\"{٘p#W\u0019\u001a7\u000bưnA:hO6z\u0019Iw\rVzE':J\u000b<Z\u0004Y\u0002$K_ɗ0\u0019!Nvq`Xa\u001dn~\u0013na?C3/F4\\U(|\u0007ɺrp\u000fz*у_Zo2}NfFxDkhS!\tU\u0011u]\u0014\"Lv/⓫\u000b\u0004rA*fIvSHAy%<?\\fg=0_\u0018\u0005#B'-͙\u0001:xwj6\u001dXԅG];\tÚc\u0007Z;z\u001a-/I\"l[+c\u001dŉnyd0VZTWTX\u00147\u0005\u0017p^Mnz<';_\"Q1*\u0014\rP\u000bE&|I\u001bс˦nkaa_\tSyk^icMCc\t4o8D[*\u000e,cةEaIĢ9nb2'E\u001ffz)bJ?RDUp\u0007|M$TW\u0012\u0012<mՀ\u001d0ק\u0005&0wPjAb\u001a\u001ch\u0007qÙ%)^5>9U*\u0007%Ie\u0004Q\u000f'Nt=h\u0016\u0013/L@\nTP\u0002![\r\u0000ד`]\u001d\u001etk\u0015\r5\u0015]Rwҗ]&ok7B\u000fۣKq-I\u001eM\u0019<zJ\u0019WbGW\u000fsEVe1ck\u0011#\u0016I\u0010U\u0015J҂/\u0002\u0015\u0000O0'S^55H\u0011#P\f[:Jzmc.a/\u001e\u0016c\u001c.u嵧{'_\u0016ƶT\u0006D77\u0005E4wrCMC?\u0004D ߨ\u0016DnF\u0014U(\u0004(ƿ\u0004`\u0002\u0001oO\u0012R\u0010ax\u0000qC\u001a \u001ei\u0018q7\u0018\u0010\u000e\u0004\u0015\\\t;w>79'LWBȎr0yL\u001e\u0018,\u001b\f\nM\u00051e?0Y\u000f~rD\u0011#CdU\u000fV\u0004\u0006\u0019\u0019\u0001&z\t0_\u0018@]=hxVr⸁pD0\u001a`ƿޟ:\u0012esZd\u0001\u001bj\u0017J\u0019h\u0005*dA\u0006C1b)VO\u0004(P\u000bT{k\u0015\u0014n\u0017\b~x{o\u0013eF\u001bgC\u00015='ݼios~)wC,D쏹\u001dk\u00135t$9ǐ\u000227zO17ml36E\u0019|blՋ6<ȕ~\u0003\u001dWN\bP\u000f0-\u0003\u000b\u00187\u0001HP5\t\u0005#(^C}lgIqLO΅s\u001fd?8{ \u0001&`V`ǘ\u00159f\u001d32g̠촋\u001b\u0017\u000f#\u001e:JR%\u0005n+Wq\rgC5(~\u0005/r\u0017!Z\u000b\u0017\u0014\u0001Ɯ%\tYgf~\u0017,\"/\u001f|&x6dtmG\u001bU\u001bnߣCnO6\bp\u0003`\u001fs\u0018Y9\u0003P@\u0002\u000b-HU\u001aY.B )RyLR7\u0006*71\u0011[hP),SOeNwen6sew,~^p\\O;C\u0016d\u0012e.|-{\u0000\u0005\u00012\u0013!aY\u001bb3\bV]5+\u0014\u001dꊟJJMWӌV}(\u001b>\u000eo;6kb6ە/\u0018\b\u0007a+~\u000f*p<@\u0012\u0000k:\u0019> }Kې\u001e\u001a_|4k\u001fC:\u000e(r\u001d:k\u000e!\u0001T\n5\u001bC\u0006^\u0010p\u000fZ>}\u0017w \r\u0014<\u0002H[\u0004_\u0000H\u001b\u0018\u0010h\u001b\u000b\u0011\\~\u0013:L:\u001cIvM\u0006Q\u000f\"\u0015\nְD{P9Jڍrw2\u001dI\u0014u|u\r&9+m\u00068)@\fg)\u0001k\u0000\u0014\u000eH\u001f\u0011\u001cE\tvȜ`\u0011\rdYTg\u001a\u0006;Av\u00115&@ $$$\u00106\u0001!)\u001867,\bE*n8RA\u001d[EQ}k=ťӊ֭Uq\u00193_ۙx;}sr\u001epig\u00040\u001d bɴA$\nZ\u0016H2E1ʴ\rJ\u0000\u001bY\u0006ec'6PT9I~\u0003(\u001f\u0014Fp\u0015\u0011\f[83ؘǰ'\f\u000bh\u0013iC\u0004\u0006zu%icj\u001a&v&\u0003ON߃Ѓ`\u001fO\u000bB\u0011\u000bJ\u001d\u0017π_.x\u0015zǂ6\u0003p\u0018\u00180~b8A\\4u\u001exg\u0004\u00143\u001fO>C|\u001ax\u0012\\-,\u0004@0\u0013Yï\u0000\r\b\u0013{M;H\u001c3\u0001)W;=%\u0010\u001fwÔ/x0ȃ&|<\u001a\u0012BD\u0016d,H:τ(}\u0016\f Xi\u0016c\u0004t `)\u001f$\u000e\u001c-\u000b?&^[?i\u001b\u001f\u001f\t>T\u0013h\\H>\u0011D\u0016,Ku \tY\u001eB\f!2\u0014m\b@\u000e\u0012½V\u0010\u001e\"i\rEk\bn\u0004\u000fٓW\u000fB_\u000ba5\u001e\u0004W\u0004\\\u001aR'H#ݘZXc!F\b](\u0017#,\b2S֛C\u0012M\bʆd͔dpG\u0001#v\u001fg&W߉ڏux!px.S\tlH`8\u0004G!ք`g\u001ar{\u001aQv4bg\u0002مD\u000e\u0016)t0\u00001\u0019&*4\f_c3\u0011f\u001fE;v7{^u~%;4\u000bsI\\\u001fI>{7\u0014s~\u0002\u000ec\nRV\u0013$\u000e4\u0019ePͦ24/-!E:\u0013\r>&ϵ|\u001b[a3\u001eSo\"j9O=w\u001260\u001f\u001eG=/xߑI\u0007;vM\t+\u00113\u001a\t\"\t\fD[1`@*\u0019&\u001e\u001eD3>+ߤL_$~YT|?V.z}nFs#b{=bwUywTyߥ7\u000bQ>\u0017\u0003\u000bv&\u0016c\ta$7d;3,\u0019!7#ў\u0013L\u001f\t{\u0019g c\tNr\u001fPչ_Kh\u001aȹ\u001c&v߅s1\u0003D\u001f\r<\u0015}Ip\"Xˀ|ăs8\u0001Ép'4!\u001dιtl2K\r\u0003%d\u0007sobɬ\u0005&?$3K/w)|*Ι\u000e=\u0001G\u0017\u0012\u001e\u001f\f:\u0014Pui㟈&L\u0004Uw(\tdx\rC\u0013Ib̀B\tR2\n{ƛ*WI5GneЌeJѢDNgN˽\u001e^w05@rp_Rhh\u001eɠj_Ȁ꘴?lw\u0003w}\bKo\u0012p[\u0013b\rRH~6[EF\u0014VQlƯuN\u0005V+.Y*Ns:v(@V\u0015o?,r=K%};;R\u0007C\f˷W$VCؓ\u0001/\u0011\u001cM7&wУ(#\u0018Qo\u001b̩G06NX'3<Y\u0013c}\"\u0012۾|sk}ٍ\u001dE6d~ޯZz s)e\u001f\u0019/B;\u001fE\u001dY\b́_g.`H\"{\u0005d\u0007d:}e!uŌΑm3uQb0R\u001feUqhE/ry\u000b\u00025\u0004u6rڥ\u001dY=̾V>Z\u0016Ȗgaks&%C>\u001f\u0005_G\u0003T䷫I+&gRVRZfQ6Qmv>-\"\u0011{\u00179צU[^RZ*^\u0019Q$ސA.o9wGxS#VD5\\j}\\?!m,DPS\u0011\u0002\u0014O\u0013;!oQzR\u001a[3~:7\u001dS\u001b\u000f\u0006o\u000e\u0018hUڻR]\\Qo+\u0011/]%n.Y'k*ڤXUMYW0\u0010Y?\u001cU)aDm{g\u0010ՕAP_\u000e&(TLf\u000b֦CnAlM\u001dU``|wBmMIs\u001b2<;?n-_[])XSY/^],+oWԖ~*鏬(9\u0018]Vr\u0017UQ.r\u0005Օ\u0010T\ti\u001diQohjl5M]_M:4:-p|澮\u0000PѶ[ZT.kzlXпBаliTW\u001a\u0007}\u0013\"\taQ(\u0016\u0004\u0012\u0004B @ؑm( \u0015\u0011\"\u0002\"PYd\u0015\u0017\u0016Y\u0004(.P\u0004jg:\reLm\u000b8ȢTEgǙ3=a>~s>9\n\u000ef?pfތ\u0019=!)\u0019B3&w\u001f7-\u000b\u0010:í\u001cT\u001a~!3߷\u00141\u001a\u0016\fײ~\u0005\\btqjZVW\u0019dx,ҬdX]~at,^}w\u001f:\u0015}.();x{\u001fBr%\u001fFe\u0011T\u001eA:']H\u0003x\u000bu\u0011E:L\u00188˄M|j2\u001a$Z%&EŹ;i\u001dtK+L)(I:Z㟘\u001c\u0018\u0015\u001c7\u00185Qp|o~\t\u0005^BD&\u000f}\u001e8jh]π\u001b4\\nAG\tbyэWYoP|&lmM95qU;\u001cU.pu<c{iG~[\u001a\u0003b.\u0006n.\u001a\b.z\u0018\u0018S7dA\u0019Wm(WI\u0000?e\u0002\u0010ϕ@:@F\n\u0000:@ycC̪ns-9竟\u0014js6@}pom)Ҥ\t5\u0014q'>VnT\u0017Uy?? Ȫ\u0019\u000f=us5:\u0014\u001cr\u0006%\u0000j\u0000\u001a\u0000\u00038Of.-lHa^t\u0016tz/\bZ}=b]Zfx\u001d;\u001b:ƞ͒G7\u0014(=:}B|BF:\u0019V7\u0016^:{Nx\u0014\n۵\u0000W\u0001:?yO^\u0016T]ׇ^+F5);ǃѽAO\u0007ﺴ4BU\\\u000eۘ{>ȔF|rT\u0016^\u0012^\u0016v=#}#mJ\u00116'\u000fjEVH\u0011]r\u0006\u001b\u0001.;hHO2pl`)\u001c\u001d0?cWh-K\u0019jэcǚD&Zn*\u0001Q<\u0012ZG+\u001d2[2Q)'9O7^F;uߑ.> g_\u000fE̟d+\u0005?Āp\u001a{߆L3Np\u0010p~\u0018;\tơwRL2,\u0002X\u000e\n\u0006km\u001db>E\u0003\r!T*\u0006\u0018<M:\u0004\u0001P\rPq\u0013`\u0010 \u0001\u0013RGذst9$QF1_iF}\r\u001f\t\u000b\u001dٴ,hd~j*_վ5^\\#\u000fUZ7\u0019\u0013WU\\g&\u001fL匩_ߘ:Yl\u001a,y\u0003\u0000\r\u0003\u001f|\u0000bBC6Č`Ә\u0011D\tq\u00193dܓa<7\u001e\u001eߢ\u001cs\u001fw\u001d^.\u001f/zO6qrDtↁ\u0006I\u0003Y\u0003\u001fp\"w\np\u0002@U/ɿ.?y\u0004 !\u00036>ք!\u0011\u0004>8^LI\u001f\rd\u0012lT,q*+N׶>~LW4Ӡg3s'|:D\u0004x\u0005\tꩻ\u0002Da5`\u0000ɿ\u000f\u0003 |\f 9\u0007_!(_SW\"y֑vuc8aڽ\u000e\u0010԰ye=c\\\\\u001etm2YYpO\u0018'\u0018-Ba\r-\u0001|\u0001P&(P\u000fq%H\u0018ђ\u0012\u0012BW\u001c=iS\f`0\u0011F3\f1\nӘ+{X\u0002\u001bY2k\u0019\u000e\u0011\u000fY|uS\u0001}.?\u0011@\u0004O\u0000߁2\u000e\u0016`\u0006`Aa1\n5ZJTP+Л^4\u000f#h=up\u0017,\u001608XKt0Ļ\u001475LU$;\u0002x\f \u0004\u0010#0%\u000eu\bj\u0007}4d/K\fP@領F)AWJ\u0013)\r\f(\u0000\u0013t\"\u0006 EƖF;\u0001R!\"J\u0018h`8\u001b A\u0013hy\u0016ǵ\u0014Hs\u0012q'\u0011*.Zo\u0012ω7\u0004r\u000f,\u000f\u0011ɖXD8(g\u0012?\u0016E,A660G\u000b\\\u0014 QJ\\ \u0010\u000eY \u001e\u0011?\u0013ψ\u0004r\u0017ȝ/\u0001j\u0014:YB(>\\E\ft1QB0MƲ!Y\u000b2P\u001b\u0015\u0010ͺ(EQ\u0017K\f\u0001\r\u001eg\u0016ĳoĨ;K\u0012x\u0006\u001d,(RfBҜ\u00100SD\u000f%\u000b݂5%;_\u001b\u001dt߸\u001eJkx(i Z\u0002G>b\u00189<J/$/%&Oߒ\"o\u001d?B\u0014z\u0019Qo34\roh\"\"\u0014 Ut\u0012\t%\u0010\u0010\u0010\u0010\u0002\u0011B \u0010\b5@\b\u0012B\u000b\u0011TY\u0001X8\u000eV\u001d\u001b;zгc\u0019X<?\u001f~yqYA:5\b[\u0001tM\bި\rD\u001d`f/\u0007\u0007^\t4>\r\u0017z\r\u0019}z3u\u0013<\nqz:O|I\u0005~`\u000fV=\u0013\u001a\u0018.\u0006h\u0004`\u0013 t\r\u0001\"7N\rq\u001fQTM\fֆAH\u001e\u0004\u0012$2Ī3\u000fl5c ~\b[>`-c\u001b5Sfe~\t#Ɯ}Ƃٽ\u00000\u0004L \tƋ\u0001\u0005\u0001BF\u0012\t\u0010cJjH}1@LĲQz\u001f#r߇\u0017z\u0013VM#\u0006ٳn'A\u0003F\u001f\u000e}\u0010xiۻ\u0013nzЂL0X^\u0000W6!`\u0018`U8ߐ\u00004|\u0013\u001b3-5\u001c.!q\u001c1\u0005GQ\u0015kG,7[޸VNa\u001b{\u0012rq&ՐΗB;_\fy4\u001dF=\u0013\u000e֧#T\u0004X`̿\u00076M{W\"H7Bd\u0010\u0016]沼5_g\u0006.}ʎ{fk\"f|*k1vWZ\u001d~޴b.#\"\u000e\tt?\u0015>1\u0015>Kg\u000bO.\u0013Qx,\u001aŀ\u0018^\f\u0019\u0011`38\bxػ,\b|\u0007+>Iq峜D\u0019\u0016K\u0005\u0017m%8opks=}2f4\u00113J>\u001a}pIʡ^\u0007~\u00173G\u001b\u000b4\u0000\u000e\u0018@\u0001x{;W`2@_VBkcڝ\"_\u001b!y٦9<B4\u0014&C\t{ㇽ{\u001dH\u001dG\u001d5@\u001aL\u0006ׁ\u0014p\u001aH\u0005@\u0014~${[0||G\n\u0000=/7A*l\t7)\u001aY\u0004QS\u0014ɜ,#\u0005\u00079eN2$ncz?ZN5ӟ<Jݙt֓tƿ;iֿ3\u00153gW:xt+\u0003\u001c\u0017\u00031T{ܥ\b\u0004:hT\u0017\u0015顇U\u0012]\"k\bXSiDQLy9B\"Zr\u001fқͻKݑ֞~Jb(f\u0002Zӟӕ\u001c e;ƹ-{B抵#\u0016#YnKuь\f]OI:\u0013\u0007LƅV#\u0002`iW^[\u000fܙSOٞk2Pd\u001eg3/39\u0003YR\u001b\u0001\u000f\u0005\u000f\\\u0015=;@\u000bq\u0019\u0001ݩDV\u001d\u0004wQ-:D\\\u001czwye\u0016\"Sح@Ln(-M~>z\u001dw,;\u0011XýȒp\u001f\u0006>I\u000fdY>-\u0006-\u0010\\!BE\bݔjoBW\u0014hN(Ԏ}ɂWD\u0011+,z*2m;xB\u0016a\u0005\"\u00174hR~/C);ªțfc?\u0005]Y\b뫊]\bH[@Y1BVaߩSG\u0015B\u0016:j&Z\u001c\u000e4y/#g\u0018$H\u0013;$l61ױTW*H}$B%M\\(/,\u0011\u0012\n\u0006\u0015\tn\u0007\u0015\u0017\u0014OY\txb - \b;jp\u0006:DU\u0006ʎ0\\2\u0010ckY,ͦ&k\\wU\u0016Ebʊ:\u0016NFQ\u0010 _r*(VP~[|\u0002(B\u00110\u001e\u0003l5g>BU t]*щvutc%߱0Nkc,l\t3R5n^Ԑb]P+uH<D5\u0015ZoaU\u0017\u000f0y,h*(Kt#+~U}ͫ\u0002\n_\u0002@&B/\u0016ncV\u0016}\u00044I@\u0007Оn+@fwm!mѦ-IVҦ\f*ES\\^R_ڋ/SPyҾ\u0000N\u0013,v/\f+\u0006oV-Pe@ʀ=\u0013\u001a\u0006\nN\u0010ًo.\u001a3G\\5RuZ;6'XTmڲ\u001d\u0005%ܦ*\nއӠ;dqf\u001a3Y7\u0001(l\u0005\u0016Ѓrf\u0010nE\u0004v8\u001fw\u0004u\f9\u000ezk\u0003WHw\u001b{bJS:;s\u000bݳ\fUWj7IKKPcʫX\u000bZ/\u0004%x&\u0001\t=\u000bp\u000f6&zaG5P\u0011j\u001dW:\u000fjL\u00038r\u0000!\u001c\t\u0001!H\u0000Í\t\u0010nA\u0014\u0011x_N=겻Nm\u0015ƻT\u0010<PT\nV.`j-\u0018>d\u001f|&3e#30x=KvH\u0017U=k\u001ci;\u0016\u0005\u0016m_\u001e<e*դ-OزEm\u001be8\u001ai0,)<ۀ\u001c\u0003\u0006C\t\u0003@-?+m\u001fZI`u'6@pqu\u001c|'QU޾Y\u0005\u001f'W.\u000bȭX޳.$ܠN+\fO)?\u001a/o\rKm\nM-2T\u0012n\u0000\u0018\u00004}\u0001px;\u0000;\u0000?\u0000h\u0006WX\u0010ZtLÛT+U.)>0pt\u0019n\u0013\u000f.>'n_Zm\u0018}W\n>H[\u00164@oƤ`\u001aGLspf=1Ze\u0000_\u0005LRs`\u001f6`a(nQ5\u000bS≧\u001d3JӾU_\u0013\u001bzk;qolcoLc\u001b9a91\r5Rk)C:\u0007\u0007{\u0012P\u0003\u0019W\u0004X\\(nvW(h\u000fdǲs۵\fDQ:8[3.O08ĵ}\u0014ݶY\u001aٶG1ֻ5\u001a]ƶD\\\"ΡKԼ\u000e\n\u0000*/=\r0\u0015\"\u0017&\\\u0015Bֿl!\u0013:!#ԑufq\u0012:':\t;\u0017\b#;?:kXݵ&$F$W\u00121h\u001b|\u001d~z\u001e=}?o\u0019\u001b\u0001\u0013 \u001a\u001b?\u000b \u0016n3\u0006b{XFӛ̊\u001dVsBs>)Kk\u0005\u0001\r\u0016~\u001b\u0007ׅBy\u001b\u000b\u001e\u0014y\u000fV\u0001\u0010?Kv@\u000ex\u0013 \u0005D?\f\u0012BG0\u0017qLd0%\u001fc\fMc{\rxgu\u001c7v+{u+}u+5=Jp\u0007\u001d_A_F9\u0017\u0000\\\u0005\u0002\u0018w\u001b`l7@0\u001f\bJt\u0000t\u0007\u0005\u001fT\u0017a4F1ned8\u0004\u0001\u000bY8ebIeI\r\u001a52@\u001ecs\u001d'?25\u0001P\u0007@\u001c`\f\u0017EԔP\u0011\\\u0015\u000b\u001c\u001f1\bl1\fl0\u00061LF\u0019>ba\f\u000b\r\f\u0018c<iǚ\u0000oܧݢ\u0007\u0010\u000f \u001f\u0000\u0002\u0013\u0019r\u0011-i\u0003\u0012\u00071:\u0015E @?\u0012X4\u0016\u0000&\u001cRD\u0018F\rd\u0007Ojށc\u0014\f*\u0003\u0018\f6SP\u0019B\u00186p+\u001e3辘+gK.\u0015\u001c&'xB:=&\u0005~\f\u0002X\u0018\u0012BE$\u001b\u00039Ei\\^CϿs-Gm\\\u001eU\u001c#M<}ܥ\r!7[G@`83\u0018`z,\u001bCu\u001c\fʦ1\u0016p\u0002>/j\u0001\u0013\u0005wJRC,Hn\u0007\u0016\u0002!?\u0014\f\u0017\u0003۞\fFz0\u0018EY\u0018f&\u0019\\TOal>\u0006/\u0011r\u0005*\tQ\u0010\u0015D('U\u001cDE\n尢O\\\\D\u0012E\u000f\u0000M0Qn\fƹ2\u00188_B\u0011\u001fX=\u0017&P3]\u0011\u000b\u0018^\"°O,ߨ[VeJڤ\u001eRU\u0007UG/Tgs⧪+⇪n}Sq[{j\u001b\u001fVwF@/eP`\u0012}\\zi=\u0012u\\Ԏc|p<˘VtS~\u0016U*~\u0012QV@do}v5uv\u0006^\u0019\u001eͥQw5y2FkH\u0016Wɕ(\u0010a\u000ez{tG\u0006h.\u001eR0#3{g$inuD;nݽov%n=N7coK;bOIǶˮޖ]}$\u00107,5ƣSk<:OQ\u0012\u00110-mH8&\u0000\u0019dհd'\u001edXd\u0014YIgs3e]~õ5NW\u00127HL4\\rA׭][ަm\u0018}^9U3~fݐ{S\"6&d2:HF'6Q7t̓\u0000\u0016М\u0014ЏyTbq~\u0010t[]͙i{iBέ\\ΥM8t\u00162&}w\t}q\u0005_GR\u001cJEϺ4tKGtfmL,+zwNq\u0014Nx\u0007L\u000fdn\u0015G*/\u0016ZN~I\u001c[r\u0017MuG5}qI\u0000\u0011\u0005K\u0015\u0015\u0014@H &\u001a8L\u0016\u0001\t\u00175!\t!!!!\u0004B\u0002\u0001-\u0004D\u0002~\u0013\u0010A\u0014\u0010u\b\u001em\u0001γMzv<gGۭ[y%ɺcF$e\u000bNb1|M\\\nu6~3p:7?M$!q6\u001aOFƒ5(n?`\u000fL\u0007<\u001fh\u001f\u0013;$g/\u0012坳'9}r羜)XLxs*}H3-\u001b)䩠Qa# {d_O4{\u0005`{95(\u0001g}/\u000eg\u000fo\n\u001c[#|Yx\u0000ˏB\u0006q]\u001ac@\u001cﴜq=<+QyOfk}2G2\u001a)m\u001eZ1zW\u001c3~pGڳ`K\u0016ΏA\f\u0014`D$K\u0016x[.9D@|\"|'!K-|\r/{⣰\u0011]\u0014kCT\u0019q<@=Wx\u0015\u001en-zNsP{V'-ky5s:9c9Ԝq)0S[)\u0007QC$5;\u0004x}5?l`K\u000b~qCBXRGͫ;P]dC\u0005\u0002>qwHEӒ\u0004ԫ|\u001390\u001b;Fzx5O\u0011ռ\u0006QQ\u0002BgC$kP\u001e\u0000\u0011\u0003|sKMgZ;\u001e\u001e>\u0015\u001d\r.=w$e@q<;eb6tU!ŕFQ=.Q#\u000e\u0012U\b\u0016\"tGr\u000bVMN|D\u0010#2\u001afo\u0011+)\u000b;i\tDo\u0003kvp\u0002\u0006\u0012a2v\\wz`Ys:P{qG2ˬ6\u0016\u0016d:jH3\u001443!ZHXi\\:!$;D0ut\u0014\u0005\f[8\u0000?\b\u0001^\u001a\u001a|\u001eW\u0011A\r,\u001c9\u000fai;d8У;^rji&F7\u0014Q*Vnbh\nCJdCJ,K!\u001f).R.>H_RT\nDQ\u0015!5(\u0003{\u0011AW\u000bie$J\u001d\u0001\u0006/\u0018\u0019wwT_ZIq<xuاB/Wk(%\u0006R\u0016\"W\u000eKY{O#o\u000bT?1e(\u0004Q0dkP6\u0005\t\u0004;\u001f`͈\u0013\"v&'\u00183{@\u0013x1Z}&ej*\u0003BtB/SPTZ}.+m\rhD\bzW?䫿\u0010)*E2D\u0015\u0000k\u0010\u000f\u0002~\u000f[\u0000Op\u0006\u0000Kf]-\u0000{`\btRm-\u0011泎u.UilRлZJ*R\u0005\u0014\u001a\u0003%Ɠ\u0016@\u0013MFd>ae\u000e\u0011-\u0002Q\u0015(w\u0002=|\u0019\u0002k\u0002Xhރk}\u0017tw\u001c\u0002K\u0007\u001efWvzoUk%ƜyTe\u001f7J|\rEueTam5-hftd֌W\tR\u0004UXz͏\u001a\u0014eD\u0014L5\u0007\u001c;h\u0004ϴ\u0003`\u0007!@[+{}\t=L۪_9w^ܧHr+p\u000eڸVwU9)ECi6P3&\u001a4\u001al\u001d6m&\u0012lbB&\u0014fBdk*=[\\\u0001\u0016?ޅ\u000f;`\u0010@\u0001\u001d\u0002Iv0ʾd Qџ\\ЛvPԓ}-<zg]/&q:+ȩ\u001d\rTv{;-}\u001e߾ԾΈf[\u0005%X\u0010%\r1~ּi%\u0000wp\u0007Ͽэ;\u0007\u0018\u0006h\u00000L9n(h(\u0004Tmi\u0007xp,م7q0k8}D:b\u000f|\u0012\u0007.\rZ\u0002.\u000e\fQ\u000f\u0007\u000e<Ƽ\r8߇/!\u0012ך?\f\u0000V\u0001\u000e\u000e6O\u0002Tb\u00057(\\\u0005\u00027\u001fmǻu!kS\u0015ԛ\\7lYőK3Zϋ3^N\u001e==}\u00143F:5tjO$:@^<w\u0019!\u0002;;\u000ej\b ]\u0001\u0010\u0003'pW\u0003\t\u0011D\u0019KM/nExܲ\u001aS˭G\u0007<<\"<Y˯<Xwz \u000f\":ʺK\u001eoR\u0007\u0000?\u0000\u0005P~\u0017@=T\u0011\u0001Cʆ\u001b$o@&\u0019Eیh\u0017ɱ?sِ(v0hq\u000ew\tݸ\u001ay\u001a+s\r1\u0018~j\u001b\u0017`\u0018\u001b\u0001K\u0000\u0007x5'\u0004Hxf\u0007~\bg\u000e-\u0012l1v4!z\u0002!j;ɰ\t\u0011چ(;:{i7m!CG{w\u00075uoq\u0000?$\u0004\b\u0010 \u0000!\tj\u00038\u0001*,\u0002ɢ\bVi\u000b\u001dtZ\u00147V\\֊Z<\u0017l\":UcQ\u0016Td\u0011+y\u00078g&{{lְ{\u0003ohG\u0001J_CKQ~=@\u0015\u0000S\u001a9o\f>bnV\u0015>h0-\u001c<\u0018m[\u001a8u{\\<Y9?Y9W<<'<\u0001}+[G6\u0012_F_\u0000\u0003D\u0006\b\u000b0w\tFB\fڗrp\u0006WZp~\rN]\u001fcW\u0018ؿ\u0005ew*\u00140/\u0019Y&֪[ֲ\f+J{_\u0016݃E\u0017u)\u001c_\u0006;\u0000\u001f\u0000x5\u0003x<\u0006pf\f\u001c\u0007\u001aRݐ\u001alA6\u0001X/H1\u0018$8\rĘ\u00048\u0007D)#\"\u000473Ƹ\u0011\u0019\bH\u0007#7c/__\u0001\"~\u0003\u00040\u0002w\u0001!\r\u001a5%J)\u0006ơ\nP\u0003\u0005cԃ\u0000P\u0017uB!\u0003\u00104tР!5\u0019\u0004g?w$=!_\u000bv\u0000\u0000/\u0000\u0000,\u00061tƔi\u0006B\u0014\u0003jaPN\"\u001a%^d2$Ʉ6\u0003\u00071Ft\u0001rl\ft2Π;q1gPϢm8$\u000e9sh&\u001bI9$դCI-9K.\u0006L:XxC\t#Z\u0017\u0006uD;R\u0004\u0006\u0006\u0016\u001dBYT&p͡<C\u0017<$d+\u000f+>r\u001c#?\u001cZ_#\u000f3M/\u0019\u0006e\u000eȐ\u001bo\u0007ewbp8S-\u0017\u000f\u001f\u0016]YrNa\u0001\u000fUy,\"_M|Tn'UԐZ\\&MaSހׯ\u001aT%=\u001e\u001cOz{\u0006U\fz9gIO1!E41C׹<ts!\u001f5H\u00005[I\u0005K\u000e\t4\u0004ӂ\u0001M/-\u001bcA\u001d3\n:ȟ@=eOR\u0000\u001alA?ꉯ'\u0006?\u0016}rOT\">z.\u0011\f銌\u0018hԯ-\u0017iw\u000b{=\u001ak\taC,CRDNئC\u0016\u001f\u001d\nG<z\u000f\u0002Y([\u0002\u0006\u0000\tE7i=bAC\u001a\\AOkB+/\u0019wLw<1}?dDUEԬ]@ivY\u0017BQ\u0003鍦7ރ\u001f`Ab0)`\u0004$B\u0003\u0018>\u0019\u000egs\u0003\u0013\u0001Yg\u001f.\u0012/1n_n\u0006ߘ7\u001awϰ_d8\"i46[4\u0018X\\3<oq\u0017%\u0017P|\u000fǝCsɔ;e\u001cT3(#jn\u000fCLo7\u0019\u0011>\r嵄\u000b\u001e37%_\u0018\u0015A_K\u0005n^\r,\u001cPis\u0001c\u000b\u0001?\u0007\\\u0005\u0004tN\u0005 \rB`\u0010h\u0018DSEo\u0002\u0018Ou̐\u0000&ʡ'Q\r\u0013<8H1&FTȅ?G|&\u0018^(=7ت.Dv6ltvS!{lO\u001cVԆ!\u0017a\u0007P~`*Z\u0013pӄqtL:R͠\u0004LCs\u0006R|\u001bI_\u0012\u0017\u0012Euqӱ\u001fKO,^&?\u0016u-Ñ\u0015\u0011\u001d#w6N/►*♺2jw\u0014*vEME4ʈh\u0018n\n\u0018ҵПƃL##\u0014Z3p'S\u00052'2\u0019h\u0014,ď,Q ;\u0018mu\\ݾU{w+iga\u001fˣlns\u0012ۧ.eqhW\u0016D>\u001aF\u0000` \u0015}\u0016l\u000e\u0018A\u001c\u0013m\u0003\u0017stl6+Bx4sPzd\\yʔŊBb\u0012\u00195e\t\u0015Λ]7\u001fw+w_\u0017cmBKI\"KPUvv4\f\u0000t6L睦y\f4,B8\u001a,pc7p5aF\u0007rD{̔=jG\u0002|Ŗ6\\!uSiz)kN>*ve]]q+aMLtX*b7\u001a2)\u0003:F[\\B:qP\u000f?Y@PU/bT5?F37Y-gUYv|cVtbYk25X2}ۗi\u001eӾ-K;4NҌA^6\u000bru\tК\u0003HW?w|\u000698/#\u0005j8g>\t\u0014̛f\u0019M\u000b-KeKr?R|Z9E5.fo/u\u001a\u0001\u0000$F!\u0010\u0002@\bn \u0005ulJA@5@X\u0012\u0001\u0001Y\u0014E#.`ǕxZjUlF2Z\u0015;sng.\u00198g>>&u)1$~*2~DV\u0014]Y$ILLl'bopk\u00069\u0002@[D;W\u0011\"!+H^૫Q\u0004\u001aMmG\u00123ӭ>ȵNSWV:u.NLVH:.K$Mr\"91{b7\u0011\u0004\u001eP\u001f\u0004.\u00128E\u001cC`\u0000{Jm]i\u0017nT\u0006\u0018\u0014\b\u001b\u0015śXVʳmʲ\u000bY咢LSAFK^z<mGV1Yf\u0005όdY\u0019]3T\u001cYL<,Dx]\u000e\\(\u001aPi\u0000V\u0018\u0012\u0015ܦR?\niՅg\u0017$Y(2my\nqAn$/I.ovɒkҳ{=Rd)=uMaND\u0013JTC\u001éj@ك\u001a`g>:kQ;kiZ2E]\\PU\u0016nZV\u0012=CU`QJV\u0014\u0014$Y\u0005NM.)g')v'(\u0006ds8]ٚ&3\u0002&I*`Fga\u000f4\u0007g˨\u0006}=@W\u000e:Eh[+W\u0006\u0019V(DVerی\"ԒJiRqì5M\u001e\u0018\u0011h'\u001e\u001f*o{DZŜb'z\u0000|K}jpvAH{W\u0013ALl\u000f:O^UniCa\u0010n4:vfGɖiY6I5\u00055تzv++\u000eETu\u000f\u001eQO\u0015L9DU0DR/i\u0016?\u001a\u001cWS\r(\u0005l\rBԶ۠r\u001bW~>oJn\n㬖\bu1D\f\u0006mRUjNaug}Pw5n|\u001a\u00035s\fU3\u0007b7\u001d%z\u0016\u0007Ct}v=7\u0001[*\u0011J5\u0016Pjfq\u001ao\u001dEz\u0019\fS:B\u0005L6ψiO3ڐk\u00156V\u001c*Y%]ֺ)s`7΁-\u001cZòf&^l'~L\t!߽\u0011PvK'^\u0001e.\u0014=ӑ#Af'O\u000eЏ\u0011l\u0018=R\u0010-4+Y\u0014֕m\u0016Ydbkuf\u0000M_Osak%[F~mf6\u001dz\u001a\u001cP(\u0006hU\u0007((\u001fH\u0017\"y5\u0012E/_\u0017\u0017f\u0010\u0017m\u001c7A|oi\u0002=3z\u0017j,}{=e{g7>=\u001ef>yz\u0016\f\u001c\u001eLwo\u0005Ty#@\u0014D\rrH!O.tȇ\u0017<Tg`nJ8\u0003T\u0003y\u0006ʦ\f4.8e}GO\u0007\u000e\u0011y\u001db\"\u001e\u001cu\u001ekh\u001d+:\fd\f\u0001lXa\u000buFv\u000e\u0012m H\u001b~P;_7W[<K[g\u0007&CO\u001e#ٯ<\u001a~#p;\u0004n'pc4}S\u001a\u001e\u001e\u001a\u001a\b?K;9\u000e\u00170\t]<\u0007^W|1J ޹\u0012y^YyFy#:.#\u001b#NW?K~^yw4'K.N毛7R~A}\u0012XC(\u0002{\u0019\u0018THoX@zS\nǛC\u0002p+\u0014WC|;\u0003wTY,\u001e,33nNA\r_z\f|J>e|\u00015r\u0003\u000b\u0007B<\u0001x\fGh\u0001f\u000f\u0010L{\u001c\u0003'0yZLA8\rc\u0010<\n0~2\u0006$\u001ao򏁜a?O\u001d@\u000b([\u0017@z\u001b\u00110F\u0010=7\u000b3\u00140z\r׋z9cQ-\r7ö́\u001e1j5򄌑+)?W\u000b$ï\u0002K\u0003(ۍ\u001d(\u001e0\u0011`\n\u00102=\b1\f\t\b|f\t\u0001L<B\u0012_\u0010\u0019!3z\u00193:\u0007B$ՔD(+;`.e\r\u000f3eэ)߀\u0001z]\u0003\" &DD,=q!^d1\t!\u000f5.BCNMĴ[:8e1\u000bOM[1\u0000\t\"8f1\u001c\u001e3(%uc\u0006[\u000eK\u0001M9AΒw>\u0006mo\u001908qLJ8\tƍc\u001cGg\t0H\rYG6.Y\u000fc\f\\#'\u001b+q/?dyTSW\u001e\u0007K¾\u0000!/@\u0002\tZ\u0005\u0002*,ʾ\u0018H\u0010HX\u0002H\u0011Ը\u001b\u0014\u0015ТH݊8\u0014\u001d\u0016m\u001d\u001dک^ENw~\u001c\u001fNr\bOq\u001fw\u0011¢)^/\u0002\u000b\u0002 (\u0002sHlCb\u000e\u0000\u0003h&M+\u0000_\u001e\u001f\u001c\u0001<8\txK\u000fK\bO\u0015\u0000>\u001eNctf\u000e'\fHbG\u0005\u000fZ\u000f\u001a\u0000dAC\u00166=|Gwѽ8}|K ߑgcr?F>c!\u001fS\u000f\u0004\u000fMA\u0019\\=i\u000fOc\u0004Og\u0011#SbH5|'.5Ԙh\u0005Zz%B\u0014SE]3Q\u000fDt\u001a\u0015\u001d\u001eNS\u000fEWG-\u001bM1f\u0019O\u001a\u0011\tu?Ax\u0016\u001b\u001c}aM>nۓ\u0011O_)S\u000b'\u001ezRC*}I\u000bd+d\u0007[}̛~?$'7$XW<\u001e.z60\u0015\u001bs;pv*f}\fτp-\u0010#\u0005k\n,IK`btV\u001c`Y.u˻w52U&߽6\u0019]n|ѳ\u0007\u001e\u0007MF<\u0007My~ozI\u0017fC޿Ʀ76#\u000buAm\u0013a\u001dG\b\u000f\u0005-\bƼ\u0014\\%9Zy%FjM0=favo}OOՀ)c>׬\u0019>~?l\u001f\\\u001bȂ\fa\u001d\u0016h<N;\u0011:\u000b-4\u0018\t\u0004˘'\u0017\u0016\u0014\u000eכ\r\u0004[\u001c\r0X\u00074[\u001f>a߿~}'l_o\u001d0\u001d\b'(\u0010[w\u0005b+`5\u0003\u001c0@hl\u0011FcYq\u0019\u0013eF9\u000b3Й\u0000ۨ(\u0014֑p<\u0003\u000bu}ֽK{BVq\nn\u000en\u001d\n+\bogY^G-=\u0015w[\bk\u000b\u001c\u0006[?\u00170\u0011^\bc\u0010\u0007_\bt-ě\u0004\u001e:\u0006\u0013\u0010a\u0003qFbe=-V؝՜\u0011v\u001d\u0011k\u001cNo\ro\t;(\u001c61'ǖg\u0011;͑ض9\n|/\b=7S\u0011Ѕt\u0006>\bLC\u0003O!l/5ѓ\u0012c;)մ31bGں=\u0016[n\u001a[\u001ccm\\L_&X\u0017\u0014'\\\u0013=*\u000b\r1X\u0000쁭!\fB\u0006wa\u00180$Ѱ\u0006\u0016ѡ\f1&T,ҨCh-Mfٚޔ$7'V94%6ҫ\u0013\bVovZ\u0011C,nKCQQ}܈.K]¸c]\"0\u0017\u0003I\u0013i<d\u0000\u0002^y`\u001c\"!\u0015rFY3]yT\"՚\u0011gQf^`MWsVK\ri\u000eSƔ\u0016amrKuo䳮w]SƄTקa\u001e\u0002I8\n\fF\u001as\u0018r-PZv\u0011s-9!Ek)\u0016\u0015rkCF\u000eg\\ktqC-sL_',IwK\u0007]uҿ\u0015Io\u0015qɰ@\u0018\u0001p'؋i\u000fq\u0016Ꞁٳ\u0000Rcviy]+!hf-yA&uJUtYJN2ϮJQPd68f4\t孢ByVM#\u001fvϓtE\u001d5\n*0\u000f8Lz\u001dпd\u0007\u0006cE0`\u0000]EƨZ?A-E3ɦ@A\u001bnܘ\u001fo^fUδѫTKTܒr8α kPIR(ܳ7ܳ^r*\u001bs1/7\u0007;Lz>q\u001e'\u0000\u0019\fAR\r:J\u0016m(sEM^ğPи(Ƭ Ų\\+gjm܂RZW#P\rBU\u0006QV\u000eW-Su=#*x!Tc'\u001a\u000bjL\u0003ޤQ8\u000f'\u0000\u0019\f\u0010\\CT\"\t\tRFM\u0015.P1ha,\t1(6-+Id,[MQPS\u0015V\t\n;ej׻ȵe=nRq4ew8]\u0002,X\\iP%\u0015\u000128Z\u000e\u001a2\f\u0006\u0003X\u0015Nv\u001aQSK髂X&\u0015\tZ:\\Q-Qg\u00159(J+Fui\u0014WIcn(YS\u000e\u000b\u0000üIwy\u0001\u0010p\u0015B{a\u001f4ܷ\f\u00067XF\u001aU7(oE4\u00042\u000bÍbrkS,klEV^UM*U.\u0015$W4\t\u0013*\\ݢX\u0011q\u00070\u0012\u001f4k\r\u00033\u0000!A4(AD\u0013\u0004\u0019qpU֩Z\u0005\nX+ \n8\"8KlUk+.D:\u001bZu}_Z?y}r?h\u001d<Ozwpf&p{\u0007|\u0005ΠeI\u0006S\u001aaNJ >L1+'Ǫ$;LZ_3~Pec\u001a^:A?iÖ\u001a8g\u0015~\u0013&h;+W&\u0013^I>7A\u001aR9\u001e\u0014{u\u0005{d*`\u0011}¬4=f\u001b15\u0016x/j\\j\u001fѫ\u0006;|v\r\u001fG\rX{EwϔLm\u001cn5l%$\rݓWoy?8lJe\u000fҁ529e\u0003ga:__\u0017qڋQq=C\u00068\u000e\u001a\u00199NwnXۚ]2xuj8\u001dQ\u001dgCls4و<+a\u000fl܃?/\rb, q=0DGcr5\u0018\u0010\u000204/\u0014\"~}Ts{re.r,EvܜGD\u0019\u001b7H}z\u001eQI\u0007\u0007;q-ri9Ѩ\r}>mmV\u000b⭱5^tWt\u000eSYNq̟\u0014X\u0013bߢm_6*m管;k莿+\u0019gs'\u0000\u000b\u0001v\u0003\u0013\u0002\u0001}\u000e\u00028 \u001d\u0005.\bB-\f8Dz 6PF\tmmmmdۤ\u000e}hͮnyc!\u0018xP:շn+9\nd\t;H΢l@@\u0002\u001a\u0014Ѻ\u001fEA0\u0015[\u0010T\u001cV%=вd\u0010\u0002KƠE\u00144++\u0002JDuIU>%Kſ+\n\u001fT\rO\u0003ﳿ\u0004&3{\u0014_3[\u0017\u0001_\f\u000bwE\u000b\u0018.R\u0014.uCK\u0003ɗ\"\u0006ۡrAWY\u000bE\t]\u0014\u000bombj/e?fSXhf?\u0012 \f\u0010r\u000eh^\u000eU\u0002?\u0002mwfp\u001b\u0002\bػ>\u0000p\u0001\u0007bP٭P؋!v\u0019I\u001a/3x\u0000G@\u0000S\u0005`\u001e\n\u0003\u0001j'hjX\u0001U\u000f\u00145\u0001@¨#񥤆\u000f\u001a5kxk ^]zB/Hf\u0002\u000f\u001e,d~\u0019Љٖ@ˀO&\u000e|\u000fP\u0002:\u0001t\u0002^;5o\n@]\f\u0017a\\:$\u000fd\u0017wX<sc\u0001ϺW\u0000[gCp$SHO\u00062R0EP<EY,\u0017\u0013$\u000f<Dߐ~!}ȳ%.\u00049\u001cR\u0015R\f\u0014\u0012h\u001aͥ%2h\u0003NK\u0007+*t~IM\u0011ҟ#e!Xb?!\u001dG\t,r6}Bɔ\u0006ȢMv>NR\u0019]%\nRJ<QI\fhB~l!u?B\u0018\u00173LH{B̤\u0005)\f!\u0016m\u0007Yp>:RpUu~ߜ%\u001eHx]/d\u0001\u0017Ϧ{\u0012̽\u0000j\r\u0007\t~O9^D.Ue纍.O<\u0016Otc\rBTPw\u0017k`w%襸Mt\u001e\u0019\b\u0001\u0019lVGKf\u0016#d<3#Kwa5,\u0011Ն\u0015!]j\u0016\u0018r}va2\u001c\u0016v7Ἰ}[S-.R\\\n@!nӀ\\!Cu~a/Zl\u0006EY`<\u001e7\u001f\"\u001e\u0005\u0013\u000f\u0002{n\\$n\u001b\r\u001aq͸Ah\u0013?\u0018\u0003J\tŀ2EyuŹf)4S6b*B:Ul|\u000b\t2\b\u0002ۚ0#Zŭ\u0011\ti4UT\u0012\u0015$wT9Si̴MuڴWUb*P\u0015ԅJ\u0007c\u001c\u000e\u0005\b\u001d~\f2W\r\u0019:b\\Q\u0017\u000eq}\u0010nE%\u001e\u0017\u0006󖱢2YQjPYl:e^Ɯ>iNs8ar8.hvO8\u001d2\u001c0|aj|tmGF8BF\"\u000exY\u0003;\u001eը&(n1P\u001cO|\u001b3Bq\"z\u000f\u0005Qt8\u001c/ǃKGhE2\rjĪ}Eb\u0013'\u001e{c\\j\u0019l!\u0010B\u0002!$K@\u0002$6Ibر@\u0006\f8\u001bX$vl'\u001dY&vL=i&I:Mm43\u001a3{y9^+b?uUL$L(8/~\u0011\u0014?b.\u001fJϤ\u0012TJ>\u000bFI\fl\n\u0012|,Ki #\u001eޖ_LAYB\te\u0018\"dD\u001eG_ŞvQ\u001ee\fsIZOKB\u000e/yȝK3\u0003kFJ0\u0004}\bn3\u0010уL̽{T\u0013\u0002\n\u0013\u0003rr\u001b\\9fW\u0005\u000b9eAEEr5 \u0007z!֜l=+;ŝ\\2S\u0004\u0007\t\u0017cr0G\u0004Y\b)\u001ekXP!\u000fJ\u0001\u0001\u0016EB\u000el\u0014\u0000kdJ'+RR\u0014D.0ԓy\u0016\t5\u001c\u0019LG\u0015\u000baŸ!5Gh@h@DЯ$\u0004\u001ba!0\\̜\u0011\u001e/񨻍(#AḦ́˚Ͱy\t4iӥr)uQL6WlzU\u0016DQ\u0003s=\\\u001d,\u0018\u001d+\u0014\u000b{xw/\u0013\\\u0013\u0005\u0010:\u000b\t>u\u0016\u0011l\u0015G<>G\u000f~=<𞍄r9\u001d\u00048\tz1iVIE\u001eזƌ\u0019\u001a3SZ\u001cPJ\\ܞ\u0001x\"Y|RԡZoS'&>Ij){|K\t!hQ\u0013< 0*\u000fA\u0005-3^d\u0012 hE\u00100cJ!M\u001aaCqG_NU{ʭ.m#۩mv4BfFԤYJh,]KNi~ɦ[\u0010ڴ\u0004߮%\b'7؇\u001a\u000f1wޭF\u000f0w]żc\u0001X\u0002\u000f[kN&U\u001d&\u000fVfG\fT\u0014F4nQZjFn5r]FЮ\u0016\u0012k/'Yt6~5F_EO\b,\u0006g5\u00100_.|\\}DW1y+\u0019\u001cZu/iВFEtUG9*=QYhc5T4sm&\u0017\u0011Z@bbR&#\nӏJ\u0013!@xU&\u001bK\u0015\u0003>zp\u0013u6\u0007͘79\u001fo=\u001bFlc\r61]ASF\u00164[˩\r\nʪnX;恸Jqʟp|&]ՇȗIz\u000f\"CG\u0004/_p\u00173\u0016\u001du\u001c8\u0007mx\f8ل\u0001ǚ\u0012y\u0007RH\u0014G\"^\u0014mQlFY]gTֵL}qq:\u000646ZGHX#*\u0012qe\u0004_k%xa>}\u0000g6ּ:\u0000:1wv\u0002w\fҠM\bζm֖Ljn=LnhG;\n-\u0006Zeijg\u001b\u001a[nAYè>\u001b_b9Qe5^Rs|^\u0013b;Gxa}x\u0017&ּ+?\u00171s [ܮhhw~\u0011\u001a{I6W*֕IvFVv\u0016ǘ:˩\nzy{-ns[\n[gD<G(Ax\u0007sB<\u0007!@x\u000e\u001b!=\u001a0\r\u0000\u001cGܽ\u0001[f\r5\u0007HURO\u0011a-*-)1\u0016UuyJ8{I(wE2g,׿./w\u0012l'\t\u00063\u0018r,{a\u0010`z\u0018`\u0018Dle\u0001x\u0018\u000e$!v$\u0019ɏ(\u0019VG\u0015\rc\nA;=g%\fpd)^g/=vE'\u001c }\t/}J\t\u000e\u000e\u000ez:`\r?7\u001e\u0007\u00138\u0007^`\u0012f\nT,||\u001e(I*\u0011r/+PNi#*&b3&[iRo\u001fC\u000ey\u0017ة5A[\u001cSxl8:8\u00130wp\u000e7z\u0003wa\u001c\u0000uO`\u001ff\u0000\u001a0N\u0001IP8ς@\u0002\u00052\f!< #\u0002y䌀\"7DH-i\u00071\u0007\u0014߿JKߡ'\u001f}GwEfrÍ\u001e`X\u000f`b\u0016\u000fu\u001d\u0007\u0000\u0001d\u0005c!#\u0003i9H\u000f\u0004Њ\u0004VI\u0007W\nI\u0007V䔕J\u0015;eߊ+bop$rOT२]Q;v.z2\u0011,\u0011c)!+\u001f}s\u0000\u0000@\u0012O5b,+<*_\u000585e\u000e\n \u0016wu\u0017콚\u0002/$'!\u0015\naGJ\u001ej#m\u000byH[C\u0017C/lA޲\ty\u0010_!\"[{e_D\u0019}d\u0001{\r\u0017\u0000*Pt\u001d '\u0004 y\r`\u0000;oQ`뛌]\u001fPQ]y\u00187}\u0018f\u0018\u0006\u0006PPi\f(\u001e\u0005PP%G]O,\u001bIEWE#Qlh\u0010,A\\l(6tQC46\u0004\u0017Kbz\u0012\u0012\u0012.ݏ\u0018wO\u000ewpww\u000b<(v'\u000b܋H\u000f>\u000fd\u0004Z$E,,si\u001eJg|XHCBr<(ds\fr뀯\u0005hf'07!\u0007_R\u0018\u0012\u000e:W\u0015Ɗ2B_\u0019\u0007}(VM*\r6U\tM\t\u000bMe\u00030?;ϋ\u0003gn\bse@\u0013@Ӏs%`\u000e-TMP^q7W;A\u001a\bT(\u001bĉf\u0011\u0017f>XxkU@c^_ c?\\p/0Q\u0006z\u001c\u0007:\u0002U\u0000\u0002\u0017\u0000e@+ \u000en:Ԥ\u0007nZpC͐\u000f7݀\u00073!/o)\u000fca؉\u0007?ǱڏCKswُM>\u000f\u00050U﵀&Ѓ\u001e)yo\u001dc\u0004ܤ\u0003Q}E\u001b.>o9\u0004G윸x~Q`\u0000\u0001:ϞWX\u001ax}ͼ{~｠5i`M󞬉\"CFQ\u001e\u0010l`\u0005.\u000e~  <_\r@]Q\f}Fi\nͦIٴ66*TL'\u0012;<wxPß\u0010-l\u000b\u0019٦-/\u0007!9M\u0014J%rh\u001dS\u0001a\u0001޷\fq%Rճdo6z'D+7\b\u0016l\u00079\u0016/6\u0010B\u0017B\u0016\u001aI\u0013hZ,=eB\u001e32\u0010X'(ar9\u001a\u001e!^\u0011H\u00123D\u001bG\u0001zpts<l9\u001ea\u00104\t3F=@:^\\'WmB\u0000T\u0010~mU5n\u001e5jm\u0004jt\u00026\u00152\u0011\u0000њ.l\u000f\u0011\u0017?%I$\u0018?KQxj\u00050\u000b\f\u0004\fqǰ\u001a\r\u001bp˰\u00157\fPk؏\u001aqT\u001b!ۿ\u0019@IH\u0015T ӍLMD{;\u0010m\u0010\u001e^\u001c\u001f\u000ehpg-{e ;\u000fm1\u0015j)\u0015N\u000bqi).9}\u000bNkpy\u0013:@^T\u001cEylyW*s})\n鈛݄p#?\b\u001f(I\u000eёe=>1E;w<;\u001eA&\u0002W\fE8>\u001eUQ1\u0003=H?y,NxdJ<2uQ-R.i\u0001OeEBvW\u0011jz/+\u0006/\fx=K{+~\u0012rK\fNX2Z*L-!Kel%]ϒ%#/X\n|*\n})v\\UlSl}\u0015M\u001dbc#?4esZ\u000b4\u0006tU\u001e\\q/Q\u001f\u0003]}IEcd\u0015OΔﰦ)[\u0017+ZW(7[sUͪ\r#s5oPt\u0011U]*60>kt&T\u0000\r\u0007Q\u001c\u000e?\u0006wQ=F*\bNm\r\u001e%\u001c4N)h\"/\u001f_\u0006W\u0006fW\u0007dkr\u00026h\u0003vج\fo\"nYo̠\u00176\u0019ABmАc̿B$\u001aQ~<)p0\u001eEa\u001eW\u0016\u001eHiCxڰܰъ_({NV\f^\u001e\n]d\u0019L\u0011k$d>=H(aAha^S}ZO#=vn4\u0013ݛjfWpj/\u001bs'Ϡ?FJ׀\b7GbCd\u0010r#H9\u00111\u0012Pf\u001d蛤^'Ygi3lz2\th\u001a8;8\u0015R\b}J_#\u001b6{\u001a܎\u0000~f췏l\u0001:lvژ\u000eȉ醕1aRVtYFtbaʅ&-jiّ\"\r)\u0011+G7Ni\u001aq4%CrcG\t;ғ=F\u000e\u0000Y\u000fcP'p\u001fFn\u0019X\u0016oEF|\u001eO v\"-6Q͠\u0011\u0003hf\u000eLΈIM\u001a=ߐ\u001ce\u001c41zW\u0007\u001cCR[c@a [5{砚}>\u001a\b)8\t\n|`BV\u0007\f`)-,5!Z>ʔU\u0006L\u001fM\u001c7]?1nݗ\u0019\u0013bW\u0016q\\>r{c\u001a\u000b;ғm|\u000e/\u0006#Y\u0003.h=?goÌX<5\u000f/e\u0002\u0012\u0012\u001c\u0010\b\u000bGAk\u0015Т!\u001c#@\u0002\u0010 \u001c\u0006A\u000ez@TBt]O\u0017Za]-3umn\u000f\u0007~\u0019L\u000b_|?~\u0013i扫t$\u000e))2k89ǹ0ՒJT2k7gk[=LڃYSL\u0007^\u0006&3iH$\u0005%Q\u0010S\u0006{\fKr\u0001ٻ>5`\u0018:d1\u0014U\u0018K\u0012kR$iAzc~97⚣[XV\u0019u\u001d\u001e\u0003'4i^ԛ4#uNpK\tJ\u0018\u0006?sYIj\u001f\u0003eC?\u001b14\u0001LӱظP\\!?kԜsr2\u0019\\\fVAZwmꔌ\u00195I^Z\r\u000fIz-Y/(bk\u0007\u0019ی8\u000f\u0017(bq\u00191;¬Ay</\u001c,Ź9$9\tRSv,3_nvI_^,י*)\rnZc:Ѹ#\u0007M&\u0005x`\u0014D1̧L\u0007ڿbIc\u0005HQbQ`\f,\u0005--)\b\u0013,QLR\u0007}~,=?15/99UWH]\u0011k=OyƘT/6\u000b*5\u000bapݝ\u0007'\u000b\u0012恥.8Vr\u001eVbk}\u00019%`*\tBfIH_PfZIWɖ09%\u0014[\\KEuʘ-nE{#\u000b;\u0011E<\u0016\u0016]UG\u0014\u001eQ(\"\u000b\u0005ed\u0018\\g\u0006S\u0010V\u0003kze\u0015r9*aGF4*CD)⤊EĊx\u0014Lūr\u0016*q*/,ۤ_[\u0015^v-,-*TP[\nm \u001f\u001et3\u0007\u0000[k7ֲ!%u\u0019NH@rXh\u0002v\u0016或Ec떈cj\fiDmlA\nsk\u001a]C[W\u001fQTY\u0019R3\bYsW\u0011Z\u0013א眧\u0007'J#on\u0006\u001eX\u0000\u0014Lm\u0010!Q%#\u00104\u00011M\u0010\u0014pQD\"т\u0004qxN\u0012hr\bm,X!\u000bnwݰyfa^\u0019\r\u001f̨<c<c\u0003Y\u0015<\u0013:z@-\u0001[}\u000e,m\u0006\"[\\\u0003mc0\u0012lAk\u000bEm!^ŊBlIWm\u0006,[$V&޲aZM:lJK,#Y`wm,`+\"8\u000es9?B6nf\r(\td҃@^`n\bJn,\u001f쁘a9x\u001ei0u\u000eS-\u0017\u0005쳊&k\u0013\u0013\u0013O/Ƿ+\u0019g\u001eos~dܛ[\u001fwq\u001d:hg\u001fX\u00161 00{RL>¤c>\t\u001dxc&;b|G\u0014:\u00131S\u0018YQ1\u001d#:\u0004\u000f\u0013\u0011As9|\u000e\u001c\u001c\u0000ҩ\u0019w\fX\u0005\u0004=|}鄓2v\rq~\t x́GO4=ˠ5½\nPB\u0005EE(z\u0006<\u0013\u0005(O=޷z]ɸ-w\u0002\t\u0004\"N\u0000!\rt;<\fJi7\u001aN}7\u001dPHI2$9\u0010CԿ\u0019p;\b7q\u001fBƝIS\u001c\u001e0\"\u0017@!tI\u0004e\u0017\u001bKo4pe\"\u000bWX\u00100/\u0001\u0016#\u0003t\u0003p\u0003L\u0011.#?\u0013\u0019o05w1cbzx;~\u001b~\t3\f'\u0000MJp\u001eT,=/^`Q\u000f|9Y\b0y\u0016\u000f\\t$o>r|O~|F!Dϵg\u0007/P\u001f\bdcE]\u0000c\u0019AnArKĂܑ\u0005\u0002\u001dlX \u0003\u0005\u0000Y,?`/G|\u0001\u000e\u0019bh\u0010EE>{F)[6SDϣ\u001d̘\u0003.\u0003c\tx6\u0005o>&\u0010\u0014w\t-\u0005C}1<%ă\u0002=\u0011&YEy\b<N\u0002\r\u0017>Cp\u001f\u000bm4\u00049q\u0018\u0007\u0001\u001342,&$ Ud=LZțN\u000e\u000er\u000b\u0012q\u0007O\u0013?/\f\nz\u0004\u0004%qx:)$D\u0011-\"\u0005d\u0015%\rd+APg?u\u000e1q\n\u000e\u001exk\b%w~\u0003AE?4\u001bt\u0014N\"|\u0012G҉Xy\u00188&>y;uvQ\r?\u0000uR8ۃo>?pnA+r7\u0010Fx@q\u001fn\u0010T\u001c\u0015\u0010\\9\u0017C4\u001f1$\u001a[1jlf4h:\u0007Ӆ/u<;HT}P\u0005em:X5\u0004$\u001cp\u0004\f1\u0007$\u0010\u0002\u0004$\"B<x-J=pQ깞jkkնVcuWm;\u001d뻏:3̛~۴o\u00177(S韮\u0011W\u0017\u0011_'}Ք\u000f%CCP>\"Qm\u0006CToB\n~Z\u0013C\f\u000fj]\u0001\u001d\u0018\u0015FҊ6\\lU~\\\u001c_qQ\u001d\u0010\u001eBYOU\"\u000e1J\u0005 F* !zR}\u000e/\u0011&\u0001\u000f4\u0019\u0000w\u001e|ku\bWa\\QƗ\u0005#.hVs\u0006|يs=1|\u001cNw\u0016'#\u001ek\"u\u0011q\u001c\u001db\f\u001f\f$?\u0014-2\u0002zp۸%\u0019Wb7;>ŹU8ӽ\u0006\u001fz4Þ8ٳ\u0005'z^m8k\u0007:CO`kO]\"\u0005_ǘ٧\u0013\u00061\u0017-O$.E\u000e&꟏\u0013Q8\u0016Ñ\u0000\u000eEOg`\u001cf_BfOr\u00012\u0006lav\fl\u001bp\u0018xi\u001fxm71Fd7\u0010w_A\u001cB>\f'\u0011\r\u001d]8\\Q|L\u000f|4h\u00109\u0012\u0007'6\u001b{6`ٮf:S-ڙLv.Yݤ]nnbkwrܺ!g5CV\u000e_>T\u0011-ÈG\u001c\u000e<&w銿6\u0016ZY=[\u0012|0,\u0002Ga_pҍ6\t[tyجs0t%zm\u0005u:vMl\u0003*[\u0011/m[bJ,ѝ.ݒ6x,m\u001a!J?\nO?$[FM|@380J]b^q!ވ,fM\\\u00012]\u001eWʶUqKiB}YHҤ_%o5O\bW̸\u0019񢔐O\u0005%RkL\u0006!jy{Io$('C\u000flH\u0003&$\u0003%I\u0016fQmNpM<Cc6̔6$4f&,\u0013'OK!O83\\P\u001a\u001e($>\u0011$2BZ\n\u001dP\r)Ҟs=n#ڌ2tŪh\u000e1hNMaf3sR\u0014\u0017Na\u0019C1,36\nK5\u0014\u000ee0j*`\nG11E\u0014\b٫`\u0000Sg~+Ofz^b)\u0002K29s\bG1s\u001cӐc\u0019\u0013\f7_k*Ԙ\u0002Ґi:A\b/OL_LoWU\u001fPQ\u0012*L,C\u0014h>r\u0016p:\u000e>iBzeE6l\rr1M4侍\u0006>'d[PJ\u0002YҪ2\fܤW(6uy8ƓuE\u0016\u0015\u0010^W\u0007\u0017(6ҜN`g!XK-\t5?OY=1#?\u0006ov\u0018\u001b`\rUyvΟ-\u0015R%(ZBeLUQݭqZ>8,;9,?\u001cy'ʝ\u0016QxɷTd8Gڳ\u0016\bX@~*P`\u001bڢQ3a\u00186=\u0002$fb+\nrٲ\u0002\u001bWZPėX}\u00125 +\t.ka][׫m]\u0002NVM_jUT\u0016XE\u000bgܤ:![G\u0012\u0007\u0012-^]4:u\u001f&rDiי\u0016;\u000b\u001d^Q%k\u0005}j_\u001cooUwj,\u0013\\ub\u0017\u00133^\u001c\u001cwY Gr`C3}Qy\u0003e\u001e\u001d1Lȸfn\u0007ow\u0017KlE~F/zGn)\\)\\*ܮ6\u0017,x2\u0017Js Kt\u0006NR\u000eS*\u000e4~$'\u0002\u0014j+텒\u0018x|Q䋃7q2\t\u0016t\u00027畖Kr!Yw]Q{;TiޣTď\u0012QV\"_ <3:\u0003S\rP4v\u000eNO~%npUFQ9\u0014\u0013FXҘlRir*\u000bJ$?I\u000fRF*ErVe*IXPT!*E9!{\u0019:\u0003\u0006;)\u001a`Tҝu\u0017i\r/>\u0015aB0\u0002\u0005H\u000f\u000e1șldBLf(5\u001c\\ZO\tN$\u0007I2Cp0]\u001e\u001f<\u000f^PU T$\n\u0001QS\u0014o\u0007\u0010&7\u001dh\"i4\bL#UOs\u001d:\r{\\?\u0010a0G!=p:c\f066)a\r~nL\u0014>\\yT\u0019Ɵ3,\nʦ0\f\u0006\u0001'-Dk$F5\u001eO46\u001a\u001a5\"\u0002\u0013\u0015e\u0006\u0010E\u0018\u000b8\u0004Hpj%&*.TӨ(1>\n&\u0001y{E\n9^٬IθI&9]hBm^]u\u000b\u001dKY\u0013\u0001+ǢVwdX'!-'\u001cY0\u00070\u0011g\u001d#Y\u0013T:Gaf)r\n/lV&TƜ\u0013ҘXe\\*T%R=PC_7f1\u0006\u001f&ye\u001eVr\u001f\u0007 dia\u0005=\u0012\u0004H>\u0014}BR8Ο,\u0019$}\u0014oɽ\u001bX{\u001cc?&ؾc~RĬ\u0014\u001dvywR@Դ\u0019\u0002`5\u0001GQk׋W\u0001I%\u001e0P\u001a\u0002Ci4K+MA/@t\fCc4b\u001c\u0013\u0010嘆HG\u0006;r\u0011X/us\u001cRغv)XHk\u0003}/q\u001f\u0014\u0002\u000b;z8x@Mi3\u0010_\u0001pz\"©G3\u0004*\u0011ViDhe\nB*\u0007\"r8*Ǣk$\u0004T͆U\u000e[U\u0003}\u001bV<B@_.S\u001d}\u0017\u0001YԞqp\n5Qod%0\u001a0o6 r'\u0010Է%\\:\u0012\u0004+\u00182Avk\u001c<]SʄeU\u000ee]#9K@U\u0004\u0017\u001c{!my\u0016`<5X:x\u0017k\u00017\u0000A\u0002z>\u0007\u0014\u001c\u0017RS0\\$1\u0010θ\u0007لyY<n& ;|&\u001ay@/ar`:}@O=@@A@w\b:\u0002(\u0017\u0010_\u0014h\u001dʹ\u00198C;2naoai&o-\\\f?$O9_Hg\u0000\u0013FW\u0001 \rc$9ϒj6@WzBW6\u0011\u001c\u0016.Ao\u001dʢw\u0001^KrN`\u0016'\u0003Nfn\u0018uN\u0003__o\u0015J\u0018V\\Wp(y\tes̘|\u001fA%z\u0012pvccp>\u0003&\u00017V\u001b\u001dlc<.=c6$z\f=08WO]\u000bԹԩy$&ߓ\u0007Bwp_<v\u001d1\u0011=H\"a,h`1\u0014\u001b0肉\u0016g\b0\bPB DD*\u0019N@#3I\u0006\"\u00142RNN@I<7>F;~v[.v\u0004B-ӎxJd\"%\"SB\rԩN\r5j\u0010{\u0000q\u000f\u0018|˿C?N?D\u0017_\b/\u0018b\"\u001bOd\nfRg>u\rp\u001f6\u0014Q)\\s;SU[wh\u0005W\u001fp}+\\D Z\u0007BӅ9\tH^!\u0018M?Ө3m&Sǎ\u001bXC\u001d\u000756sjnݸX|8%:Uj-\u000b@oX ^\u0010zXHo2\u001cL77Z3X\u000bȦ\n󸮥F\u00195*phf,Nc<Gia\u0010&\u000b\u0015\bU\u000enOG;\u001f<#pW\u001b\n\u000b.+mWs)hQ窏pJ\u0010'T98Qu\u0001\u000eKpH\u0011nu5uد9\u001e:\u001aP#\"uO\nv\"©\u001dA;*<\u001d\u0001h?p{\u0000}X\u001cN!pkgI;\u000f,.VUOuEhЕ\u0013\u0013u].)lm\n\u0010p-/ XbEw\u001e(\u0006Ke\u001e*\\y>\u0018'Y@*o1\u000fz\u0017uAS;h\u0016v\u0006cGbl\u000b^\u0010;CQ\u0019\t\u001aT6`sQl\nn?Jp!\b!\r\"',Y<\u0011\u001e8\u0014}hHBmc\u0018j\"G:r<QQ\u0011\u0001ʣ>Ħ\flZDB4zT\u0012픊51n(T\u0010{G\u0014U\u001dHOic{\u0019WT^o}k\u001bd4hg7\u0019P\u0019\u0017ih\u00182X8\f\u0013Pbx\u000fņ\u001a\u001ciuBT#'Ib9/a2a\"axFq-ENcEv:Y=k=ן@|U߶^p\u000eĦXcBI\u0001Xc\u001aզQ74QZek!0}$-3-rPe*S,1mU,65*\u0017N*\u0017$Pf\u001f)盅\"\u0005\u0018\u0003JCơqs5>\u000f}{`%\u0011v\u0005,iȵ2\u0018j\u0019/e[&IK-Ŗ\u000f兖\fy%[a)-%y\u0016jť\u001fe\u001e\u0015yޙ{\u0007D\rK]\u0013\rq\u0015D\u0019pFf`\u0006\u0005f\u0019\u0019\u0010\u0006\u0006D\n\u00135.K\u0006q-\u00155zXTkĜ4mz5m<96ij4Iۓd\u00001w=\u0003</*&~,$~#$h\u0013\u0005he3\u0003x9[/ \u001c)I?\u0015-87\u0018`slِ'<kp\n\u001eqJ\u001b4u4\u0017]R՟+\ro\u001bzWryjH\">\f|zemA6\u000eG#ulI\u001b1\u0006kLslJFɄU&3-\u0015\u000eX,V\u001bUZMI[a(\u001bw\u001ecm<+1\u001eVl\u000by+6\"SH\"\u001f\u001b?7wg\u0005:xuH?6#<\u001cMXmE%\u00014X2\u0015\u0016EZ\nS,7{2\nۼZ[b~^*6o]BeKa\u0005?\u0007L\u0002K\u001f^Ze\u0001}%s\u00194\u0002\u0001kah\u000eEI٦\u0016*\u001e\u0015t۲\u0004mPj+\u0010Klbͫq\u001aֵRul:l\u0017sm/ԬkCz\u0007\u0007u]˸\u000f9Dq-빮l-#QW\ne\u000eʔ$\u0015#JLHY\"8\u0015X\u0014\u0005r]+~)W$/U~Q)ʅpEy'<[!\u001d܃Y\u0002ż1t7\u0004|ۊQB\u001aRu&\u0004T\u0014\u0016@\u0016\u001cj:\\L5\u001cIRԀXݭRYVxO^YՐLܢߗuJ\u0007\u000f@\u0002o/K} J#Pd\bc:9pHG#KP\u001dX&.q5َ\u0015,Gjo2;u\u0016\u0011q.,q3l>P/\u0007^\u00120GO4l^\\N\u000fG\u0005V\fG3\n\u0005w><\\$丌X\u0014]9bCJLWcqҦ6H&glt\u001dҥ^եOuo4gH꣰+y|'{X[\u0001r\u001d\u001ezTB^i$1qO➉Ş\u0004dyRaX\u0016,|!S$.TFO&ͽNkpoR\u001drFIII>KB^ޠ\u0007g\u0018\u0001S@-H\u0012 z\u0003dW\fBVHX+' ;\r\u0016<)XTeʆUVU(\u0018ebNL,n\u001e{OKqޫ\u0013)ڸʐ6'.S8\\>84ʕ]\r\u001d\\n\u0000\u0016\r~\u001c\u0016OFo\u0016\f\u0004}HYSs\b\t>\u0010\u0016Ź͚پSX[hbBڟ8\u001etf`\u00135\u000b|?`\u000b4Hn\u001aX<\u0001\tS1?\u0017$0o\u001c.f0\u0015f\u001bi\u0017\u00148Y\u0015c\u0011c\r1Qu@\u0006fύC\u000bPD\u00103I&s[1e\bfƌhLoiqڪ3fL\t(\u001c(@L\u001cс\u0006<\u001d؈\t=x*)\u000f`|W\r~KwQ{s+=\u0004o\u0001^\u0004[6 Q1L\u0001Lj\u001bۢ0m,&MSX<\u0019`*\u000530\u0007`1F\u0005kZن;aX\"FԎG\u0018=a֐Qe۩BFT\u0006\u0001'%`^ v\u001f\u0003\u000e\u0018>\u0010ۣ0}\fڣ1}\u0006t'i\u000e;\u0006w,ǠF\f؂\u000e\fh?[\b?\u0019\u0006\u001c\u001e\u0011CAz\u001cdݛX'$b\u0007\u000f_f\u000f\u000e\u0001\u000e\u00031G\u001c\u0018\tD\u0010qr\u0010º\u001a\u0003+\u001aRW,]\t\u0010L\u0010z?]<XjzbNtx\b|M\u0018=|k\u001b\u0003[=tw\u0000yG_\u0000)hI\u0002\f;\u0003\f>\u000b\u0017 |\u0013d8pa\u001cD8vs 0CK77[7E.\u000b̹\u00173_oI\u001d}\u0003^3vi=\u0005EW\u000e\u0018GA\u0000\ra\u001f:-\u0000Dr\u0000:0\u001a\r3G\u0006_\u001bl\u0005]BG>Z{#=`\u00057ԧ_\u0003_\u0007\tDQԾI@!j{r \u001b\u0005aC\u000e\u001fя\u001e\u000e =\u0018aOpaȞߓ{G\u0013{]E\u000bYbj٬5\u001d{#\u0001|Dc1=GO>\u001d\u0001g`|\u001aC\u000bx\u000f\u0003/y=dO\u001e4\rrjbE 20*;o\u000f!\"\\>'ug_KH\u0006\u001e\b2\u0001kDT}\u000b**\tEZnnh\u001a\u0006\u001b\u0010\u0001\u0011YDQA@\u0012\u0014B\"2bM01rRV&NRV8ff\\*5qܢo~T{=缤O~l\u001cd!Hu'3en\u0000Dٍ^\u0017Ӊ\u000fYDdd\u0015\"d3AvtS\"\u0002oq\u0017?xW\u0018?\u0007\"\u001c\u000b~\f1\u0004\u0010\r1tK\u001alF3`'5ڨqs\u001fs\u001cg#>mj\rO9z<&ȿ\u0006?eg7N\u001c&qd\u0006OT@E\u0002ꬤF\u00055j8s#5P\u001a{8g;V!}\u0000i_\u00182\u0019:2G;C\u001e5\u0012ķQĝL%_AԌ3sӨCBjF%5jH-_'QB//\u0000} Moq~$7 \r/D\u0005Ác\f9}\u0014\u001fr]*|\u000f=c\\|\u000b\u001burQDUԨF-5>V9wd4o鋫˴\u001ewi0Z\"6;ٙ0eG'\u0010\\;kBq5JN&gͣp\ry]U\nDh\u00059YВSG|\u0013k\u001cwqlCye\u001e\u001b\u001e\u0007Æo$O^1\u00177\u0015\u0015x\rҰ,\\p9bu,ǙU85|\u0003z6S\u000b9G#\u001aq\u001aGF^Qߠ1]\u000bsh!ȓx吻|!+ȍpy\u0016~.\u001d)DpM1lt-C[\t:\u0013jtmD6\u001cto\u0001O$xm\u001d}qoc<\u00036WL7OfRߛ\u001f\u000070\u001dL\u0007.Ot%wW􎝆|=^\t\u0018\u0016\u001c}`\u0002M.Ůk:\u0006-ScJ\u000bO9Sy\u0005lv\u000bM=D+4xB \u001b\u0006y4\u0002\u001bO3\r:\n]&s6\u000eL\u0019*\u0011gsf2ϴaR4{\u0015bW\u0019*UY[Q?kP7S+}]s_\\uS^})\u0010ZO.\u0004;\u001d\u0007v{{bs\u0003%}4h1'\u0011\r>VlDo\u001ej|P[*BoηUX3P>G\\=X6rޏb|Y,yP<\\\u001f{-]~tS\\ `<Wl?\u0005M\u001fza?Tӡψ*?\u000b*ұ/\u001b~\u0005jR̯B(o\u0010JwE\u0007\u0015\u0001}bA]iY\u000fb~<@\u0004}6/Gd&8o;蛦\u0000g\u0007GB/*h>*\u0016aRJ=ʔXLAҎ\"eBY$,W\u000b˔br+-]--YtI\u000e#e\u0005?!\u0019,CG߈\u0004.10vƲ1\u0000-Zָ.\tUc6\u0013C}P\u0016\u001a\u0012U\u0018T:\u0014(PL<UTU ʄlU$U%[\u0011)=\"-\"-\"5\u001a.#\u000e\u0010&5\u001cC\u001a4Ўʈa(\u000fwʈ)(F\u000f\u0005\u00105U둣G:\u0005Yj`W\t6M\u00144U*h\u000e+\"*,_(̑o$s,Y!sG\u0003\\{k3{\u001d|n{\rkE\u0014G0j\"^\u0012m\u0010`\u001a M.r\u0014\n1YV%nPGQo(\u001fD1\rrq)jwgeg#߫v\u0014,vFqXL\u000fl\u0000CDހd}\"\fŐ-$\u001a\u000b\trd\fۥؘvELi!B\u001fwȒa\b7\u0019\u0007\u0017\u0013x\u0017P#} \u001av,5@f\u00072Ӑfո\u0000`Xj\u0016#1΄\u0014\u0014)\u0018\tqDFԛJѦ\nG5]SD2X\u0006{\u0017sI,βoW\u0016Lj9.]Þ\u00047$L%a\u0016\u0012\u0013#!1\bp%`4\u001b\u0011kNl\u0013<!\\*jbYҘKj\tEsE>y!E_H^\u0007X<j\u001c#5Y%\u0005\t\u0013`J\u0001c/bS\u0002`H\t\u001a\u0018D[ZӅ(RAc-\u0016\"UbuBǤ+RpR9_Pp\u000e|\tl\u00076\n\u000biG\u0016}dc͝>\n1cx\u000f\u0019\u0016@k[H\u001a\u001ab[\u0011f\u0016B+\u0010:q#1&.\u001f\u0002헥{R\u0014h\u00012q<3I+s\u0015#kvxa>\u0004Y=DlvBP&-~\u0018,\"d%ĞXVjI 5bԴ\u0018c1ZiCvZ3\\o1\\r\u0012{y{lb>Kz\t4&Vq.\u001a\u0015]#\u00134\"!R\u0013\u0006hX0&>\u0013\u0014\u0006'dӀ\u0005~M}̽5G%]3G%>4G%\u0018Vhd\u000feT>`\u0003\n 38\u001fE<\u0013gTJ\u0007&;iHbR48%L\u0003Sh@jT6Q}Ҧ+:mҲ\u0014+3m),)tUSh\u0003ShdArCc#˰\u0000\u000b\u0017Jsz2\u001bgکOzguStV\u0015_\u0011ٱ\nώS\t\n˙М\u0004\u0005SPE\u00019kS+c͹,2L/RX\u0012ݲ|އB}0\t\u0005f\u00158*]A\u0005\n,\fV@a\u000b\u0007\bZƨe|,3mIU7\"ue<-\\Ga<X|\"i\rz˗ЗQbjP\"M1+X\u000baFJԵC]J}U\u0016\"ϲ(y\r{Hkr)Osy)/Sf9\u001dCy9~#ǒr*az.nc[\u001e5(\u0006Xhda\tV>cFg\u000f\u0017WA+%r:!\u0007\u000f\u001a-;klql}Q\u001d3dcMW2UP\u0015\n#[y\u0003\u0015L@^RE7\u0005_W?7Hq؃R\u0016)`+5o\u001ckTg/S\u001d\u001e\u000b|!adg,@PՑX\u001d\u000fuw\\\u0006\fxº2\u0001s\u0001/\u000e)\u0006k\u001aS\n܍>i\u001cޖl\u000eo\u000faH\u000ea\b\u000e1\u001f\u0002~R=Ci}_\u001eCP\u0003\ro,^Ç<\u0003\u0018OXI-A\tGhFo\bz<\u0012^ÒsdwT2\u001fGvN\u0012I8E\u001ca\u0012g0?:\u0014\u0013Ǚg\u0019\n\u0018\u0002hrM@-H\u0005|\f-\u0013\b/:'\u0014\u001e֣?<!9׉\bs\u0003\u0007E\f%o\u0010*q|`\t\u0017N3\rsѼ\u001f&'\u000fgSy\\\u00031)\u001dOI\u001eԾUC\bl'F\u000f\rh§pĨ}j0,\u0019\u0010]o9\u001b-4\u0016^\u0016\u000eW\u000bB-I\u000b\u000f|\u0014rvw\u0007뇮;y:\\XJgp\u000b\u000e_\u0002۪p\u0007{f遭=5\u0018b0\u001b\f)T\u0011\u001b@\u00066\u001038=\u001d/0\u0018\u0004q\u0012LY0\u000fr\u0010C9\u0003+l\u001fn׿(\u0004O=ҏ\u0007wvW\u001arnǥ= \u000b#`<L7 \u00052a!/c\u0015'Dc=\u001a\u001bPڦ[\u000fuP\u000ft\u0002s3?vVFk\f\u0011\u0001\u0017\"`\b<\u0013g::Ih;e\u0016EEh*֯`MbFݤ\u0016ur[׈><ŕ\u0018ldl\u0001l\u0015\u0010j֟%hMFg&\u001a9\u0016GE\u001bq\\#dG\u001d\u0005\u001d(+t|+e`؛\u000f\u001e=vE\u0017Hr\u001ash@\u001e:\u001ast4C\b\u0012jQNFi\u000f-\u001d9c<uj5Y#\n\rԷcbz\u0012\u0007;#w!`sqQ\u001aDʪo1G'\u001d8N\u001c!#ZkuX\u001b9\u0011zZ\u001b{\u0011KBAS\u0018y[x݈:5ud\u0017]hA>֋]\u001dDNg\u001c:ЙCGa\u000eoA:N\u001e:K(gJm\u00165b>\u001di-mP՝\rU\u001a|Ǵ\u001e\u0016U\u000fl';cWC(\u001d<DlvvڽZn\u0017\u001adm\u000bѡPVbU;U&wܭuZ;rrG*u6PS<B+\u0000'INU\t\u000e~2\\\\Fk\u000br\nZ皠nZ6_+T[JU^bZ-8UקtykşVۓV\u001cɵ\u0013׈`z-wV6zku\u001bFXvQ%ݧh\f-N\u0012T-Β'_\u0005>NzM=\u0005~WO2\u0002|u{7W\u0000 \u0000?w1\u0006Ԅ\u0002ZY?T\u0001}40VEq*\f\u001c\u000bzM\u000bf*7h\u0016\u0004+;8WYE\bYy!\u001b\u001eGsC+-)%)a_ڸ\u0019ŵ7+x(0fl\u0016#Yik͊P\u0007-\r%,@=# \u001a^\u0015+eOiJ\u000fWZxR#2\u001cQ\u001f>\u001b_\u001b\nh\u0015- ZE%\u0005H\u0002y!@\u0002$\u0000\t\u0010$\u0010BТ\u0010m\u0002N!Zҭ͵\u001e{3nu;֞vNZ!~>Ͻ`͊\u0017O= S&\u001b',V\u0012\riw\u0000$uLs\b0^5K>\u0005[R)G{Z\n6g-=\u000fXaڌ\npQ\f?|mX\u0019\r\no^:\"YDX\\f!U<ຒX\u0003`d?|lΞH)\u0016E\u0014kӰ:;\u00179:rLh)GCN\u00159u]\u000eQ-\\ʰQ\u000ejIY̡TP/\u001c*IT\u00128\u001f0\u0007\u0017Tf?گ>\u00148b\u001c팣E\u00195yhV-O\u001c\rj\u0005\u000bQ`e\u001d<\u0017y\r[v&*w\u000b_4#2]Y&H\u00074cO79rZM;렂\u001e\u0016\u0019Ʊ\t_3\u001d9j&c6\u0003.\u0012N\u001e:\u0013tpQæ_/'EY\u000eQZ'\u0014\f̆wd%\u001b[\"G\u0014+\f?Xu ;i&\u000b}60\u0005(\u001a\u001eӰ\u0014\u00069\u001clT\u00184\u0019\na+,\u0012ƕ(5`1\u0006h(.z^\u000eɊLC2iTVh#H\u0011Ec[LyB~'Z$[s8ܦIpf\u0014\nbLa5eX\u0002X0QRBq*\u0014[`4\u0007(0\u001f\u0010zOd:yc/\"ɴfI\u0019JG=L+\u0001s3\u001fY&Pa0J\u0017R\fsi:K0PTf̊\u001a\u0018ʽЗ?\u0006]yX\u0011}\"z\\loTBe(me-r\u001eA/{\u0015\u0010\"z`-]\u0015c,M\u0016b{,KQhO|+UA[YJ\u000f*WC]\u000e[:l1p\u0013YUD+~\u0001g9\u0010 ۀ}M\u0005.G\u001b}\\\u0007fN*\u0018KqC0TGB_\u001d\u0003]\"hj!&\u0013y5*\u0005P9P:+ZlW3\u0014\rtu\fWH=*gDjUO!wIB\u001cF\u0012\u0006s/QwZǀ'Ɇ5y\b0(Ȑ_\u0017\u0001{\u000e8\u0013CAGL\t\u0019V;V߈\u0000Vx2o\u000fR/#{Z$y HDG\u0012qKU(=\u0001C\u001b$\ts\u0003[*e^\r\u0018Oo*2}QHGZ\"țRڔ\u0015M*,o6`Y\u0005UHj\"ѿ\u000eK['\u0016\u0007?m$4CB\u0004$\u0016!s\u0003;ڹ\u000e'Zg\u0001\u001b[\u0002#cR3\tHi@R\u001c$bi\u0012,i]G[\u0015Xܪ\t\t\u0001;\u0003u\u000bFl\u0003\u000b\u00021\u000f1man%\r¼\"EB̺1q}~ux@s\u000b`3]9 ;v<Y휋G:㱠3\u0011;ż\u001e\u000f\u0007-\u0013\u000f\u0011\u0015\f!2x\u0010Ø\u0019cf0k\u0013}6J\u0011sl\u0007\u0001O\\\u0006<NDId\t%s\"*\u0014\\\u0012$\u00181#d\u0007SC-\u0012ڊɡ=}\u001c\u0013cӟ1Kmcq[\u0010g<\u0013؎U`\u001d\u00044\fHv\u0007\u0001f'`Z\fLp\f&\u0013 4Ba{y,0\u0013\u001c`=z\nbc\u000e'..v7u7R\u001f\u0006j<x\u0011\u0007\u0014\u0007d\u0012\u0007L{}h?o?pl\u0004\u000e\f\u0004\r\u00193\u001f`!3\u001c\u001bn\u001f\u001b\u0013pHB\u0001\\}C~F\u001d\u00003\b0G\u0014y\f\n\u001bd\u001aa\u001cC\u000488\u0019\bM\b/\u0011\u001e#<hFXHL0\u0007\u0018oM\u0012\t/\u0013s+<^f\r9ZF!0\u0010\u001a0g~?lJ2\u001f\u0018Ǜф\u0006m\u001a\u0002(/Q\u001epaAF\u0017\u001d{|gn\u001b8\u000eN\u0006_I\u0002fs\tg\u0003&EMN\u00068\u0017/%6If\u001es \u0010_e\u001c\u0019K\u001a\u000fY`9\u000fϓɗ[3M?\u0006j8bNS,돚Ԝq-.#\u001e\u0003²b\u0013Gw2)\r&8o\bM-^|x\u0010~wͺI3s\u0017\u001fGԍ\u0005\u0010M}c_\u0019\u000e\u00133IB>#%L-[J\u001f\u0003pmcr\u000560\u0001%&^JI$\"|H\u0014L8x˥\b^ȩI \t@\u0012@ \t\u0000\\*\"\"^\u0005b2T@W=j>gmt]36v[NvݦsT|?D~;K\fNH\u0015#H3i#ϑm%1|I1G,C\u000fy|G\u001e3y\u0013~g\u0004_2\u0013)ѐ,O\"ƯgFCld\u000ebOajWL\u0000#>[_0o6\u00039a\u0012\u0019Oƒ\t#5\t&$dP/:\u001ejT\u001bι_\u001872~\u0007w1N.~v\u0004p:k\u0019ߤ0ڍ\u0011>$\u001f<x\u00110z\u001e\u0010oD2D|Z|\t\u000bkF\t5Zo`&|B\u001f7q\u0003ܲ\u0018 W8_Um/-V\nWțO!S\u001e\\Qs2s\u000bfNKƟ/~lQ@RfV_ǻ\u000ee\u0016}ǛN؃>%qαRgrr\u001eaga\u0006\u0016\u0005oj\u0006^\u0011ԓ24j\u001aZ\u0012}\\\u000bq>)t\u0004vpgp\u0014//^_ğYopjG708\u0011=]\u0018O͙x\u0003ԓ3\u0016I<87+]Jjbf@FRc\u0013n)C\\v\u001e\u001eV{k4Wy?\rC~9\u0019wyD)\u0010B8%3/\u000b\u0007D\u000e\u001bQU^jM\u0019\u001e]c:u\u000et='ye\u0010&I-`S<m^i:?_\f\u0013|px\\\u0010\u000eLމR윤B\u0001=Vt8ǃN2tT9%h]g}w\u00136vc>\u001dG\u001fch\"\u000ex\u0010^Qy1H\u0010}\u0001^\u001eY:9\u001a?\"\u000056\u0005\u0018qj66LubT\u000fZGKB<\u0013\u0014k\u0002W)h\u001dV\u0007ub]X1\b\u001aeG;\u0018Kf\t?6I:\u0001\u0015E1g\r~\u0013\u001es7ڧ\u0007mF\u0004\u0014eV\n5f4\u0006`Up>V.\u0015X6\u0006!Q\u0017Ҍ%!X\u001c\u000350<\u0016_Eugx\bG|Lw\nd*g\u001d>\rIǚl\b\u001f)X\u0013>\u001b#\"BTG\u001aP\u0017\\,SEsajTϭCFTmCyT\u0017G\u001d@Y\u0019̋\u0019 Q\u0012o\u0014\nO}\u0017؂\u001dձ!|u\riKd\u001f煕Q~X\u0016=\u0003u1\u0011cQl2\u0016jP\u001dkDe\r\u0015qN̏,\u001cQ\u0012\u0012⟠H\u0005n\u000b(D\n\u001d\u0011>\u001a.SL\u0006\f>{H\u0001h\u0016%kS'F$\u0010\u000b$Ơ\\*C4\u0015\tz$d(\u000eOB\u0001܉(L\\|2dp:F87`O\u00049I\u0012a\u00180x'29g\u0015Iigk譞>\u0016'B>\u0005e`H![B\u0006IFlp&9H*F^r%K\u0006))w\"Ky\u0014\u0016UȢ(S\b`\b\u0001n:ظ\u000ev`\u0007`볎>VG-}+Ǣ$\u001f\u001et\u0014(#R#O\nJ\u001c\u0005٪\\Rݰ#+\u0016F¤QsDyUd _\u0013Ad\u0000s6x:ْ>\b\u0012(\u0014}T\u0007\"O\u001d\n:\u001a\u0004X5)hĄLm6\u0002KaLAn\u00156tۑ?\fHcNA\u0004F?V'.\u0006\u0012w\u0017/Zd=F.\u0000V}0,9ԋa+`ԧ!Ð\u0001\n}\u0013\u0012\u001b\u0017Bk\\\u0001q=LH5\u001d|Q4@\u0013A4\t\" F\u0001\u0006'Aj?\u0016xK1#M\u001cQ\u00162gLdL3a\u001c\u000bYt\nZ\u000eL\u000bԙyH\u0014!R\u0005U2d\"9k\u001b\u0007^>d{|~\u000fy0Bc{?wp$(^ J\u000e5ři\u001b\u0003\u0017 h!Pۢf\"Ֆ\fU\u0016l\u0013RHqCS\u0001yRHoԾ\u001fs\u0010GBl\u001f$v\u0001a3#{/u+9Tq/𹼜<\\z1:EPyC\u0017YH΋D#\u001e\n\u001crG\u001ad\f$:m:!qAEk-b]\u001d\u0001g\u0010|A\u001e#% 9i?wQ{\"\u001a\u0005>9*VK!G\u0003\u001b%=\u001eB$A\u000e\u001d\r;\u0001\u0014y\u0011 @TQ\t\u0016`NQ#\"7#x\u000fO!m9B\u001e!H@+9Κ\u001f~/;9\u000e_\n4s]QQXW\u001c\u0011eu\u0000eߑE\u0014\u0012=-\u001a\u0006\u0017f\u0000Q(̸ `T\f0q8QU\u000bbզAlVMM`L6\u001e{bCRc4h\u0012ow{\u000bxmcb-\u0018\u0006fJM\u001d`PW`ŘՔhS\u001fE\u0006(4\\\u0011\u0019\u0015ldZ\u0014R[\u0014_yE\u0019\u000f\u0014`oج\u001aloCk\u0003iYΧ6B}3UXO|)uF(<K9]\u0014\u0013\u0018\u0005$*0\u0002r?wrS%/Cy{IydȫW{̻$C\u000f20Mic\u0017vE\u001aFC\t\u0000\u001f\u0018]o\u0015Ǻ*_\u0001c\u000e%N\u0006Ӑ$O,\u000fL[f)e\\,{d39oɥ.߸H\\y`\u0014[\u0018t\u0000C\u0003HH\b\u0000okG[jV'k\\rv:Z\u0007u\u001c$MℵD\u0001\f\\C-i\u001d`|9\u001f1]%^&\u000f*YHh\b\u0002\u001frU\u000e6/֙\u0003\u001d\f4>6\u001a\u0001\u001bVvЫ\ndά<Ȇ3D$\u000fͭlJabWS\u00172\u0006mzAW\bڄf_0'\u0013xn\u0010i\u0002]'\f)vba'luPC!d|\u0011R[Yp\u0016\u001e156v)40wI\u001dw\u001bv\u0000jQ:jXG\r\r\u0018.@\u001aZ.Z}-\u0007Kb\u0015na14\u0002\u0012,tt\u001aN_tb\\K\u000eK\u000e34@\f\u0006o/ua\bh\u0001j!j\b6p\u001bE\u0003Nc$\\\u0003bq'-%r?=\tkgY,zA\u0019&Z\u0001\u0006@\u0003q\u0013.I\u000f\u0003\u0006\u000f\u0002X4iÁ=9]\u0000lix3o'3#MF{\u0004-\u000e ~FK.wuN\u0000Đv>Q@$\u0006M1p2 u1(}\\\b4׸\u00187qț\b|\u0013m3}ld\u0001\u0000Iƿ>_{\u001d\u001c[4Ү)\u0003yWP(]%|\r[6]?>F\u0001C#\u000ec61qF./l\u0000~\u0010\r`0)`\u001c(bJzآ~d|i\u0001s\u000fY;}/\u0006\\pedZ\u000b\u000fAwH\u00110\u0011Ŵ}k1˰_}\u001b-\r\u0012:5\u001b5u]\u0012|\u000egu\rN\u0000\b\u0018|OC\u001a\u000fx̹7T}\u000b\u0017c\fضa{.0.S0I\u000bv͏C8\tZנ\u0017\"\u0007ZIJa\u0002\u001a/`߈\"ih~1/Ƕ\r\u001b\\M\u001a?\u001dЧ<~b\u0003*-a8k\u00077刦\u0017\u0016NƠ\u001bABc\")}\u0013gc\u0000f\u0017cߪ^N*ȎSD2\u0016P\u0004-T+nKK_\u0013\u0004ϡ1L4ʓIg\u001d#?\u000e\bEhX\b\u001erc\u0017;Yv\u0015O^Ö}51%;JU<f\rȋcQ\u0017?=IBg\u0018~E#\u0005ih\u00184SN1ehTh\u0013oֱ5HUDRn\u0013|OFI\u001b7c]O;99(o4ыկٓ\u001ap>hi\u0006#:cFg1v\u0013՜\\;\fkeҧ.]:6k\t8qW:\u001bDy{+\u0010e\u0000Pvw9]\fƧimZq\u001cGiV9hsV8\u001bs\\\neJ]*TNu\u0016A\u0016\u00132_T=\u0015z6k\u0013\\FXᷔaw͆SUnZ\u001e\u0015\u001e=̣U9R%3EiI\u0016\u001c\r*4,\\JhX|~C9>5fSvVfs\u0016\u0013\u000fpN_Fъp\u0005uQ7N\u000b:s<y]Fin*KUtei_f,e\nXm2\u0005WzJ\u000f:\u0019w4#\u0004^oc\u001aZן཭R$\u0016\u0004x(0@s\u001f]}5'df\fӬ\fMVFT\u0019Cӕ\u001e6[3\n5=|W\bFjJQF~Q596>h\u001f\u001c@\fh;\u00033bʹvK| ]9\u0011ʎ\fUVd21fF\r֌\u0011\u0016=Vi)\u001a=MSf)kRb5)\\\u0013c7+9Zh|\u0019qݚy\u000e}\u001b;\u0011`\bs\u0006آ#;EXo\u0006jz\\kj|\u001fMV*%~&unS5Q\u0013r5.at_7W=hTbF&6jd\u001b\u001aѳm\u001c/\u001e\u0015uT@\u0010T@S\u00012\f0\u0003\f]`H\u0019䲨1\u000b\u0016`y ^K$Zf*hY)=Zֶɶv:k%ִܓ?>y}}˚\u001fƎL\u001e}%q4\u0010bb\\\u00109\\0\u000f\r-_EU\u0018\u001e\u0004G$+7ª\\eGڔ\u0015YQ5ʌ5EJTjl,\u00125?NܛE\u001dra\r#Ǌ\f+\tq\u0013-z\n)?zr\u0013\u0013X͎1*#&U,\u0016*-ήԸjY\u001cR)JNإ2%Șx\u0019~)S\u0000'\u0001FNm\u0019\u0018[\u0003q88\u0011GE9^2LTa\u0019J3D)Ր KB\tJI,Pr\\%ͪiV'4˸Q2\u000eː.;\u0000?^b911AaaV٦\u00110QG\u0016\u0010%\u001b#dɔ$cRf%*1D\tɏȐRfř\u0018\u000eE[\u000e*\u000e|\tw)<@75؇\u001d~\u001eg\u0003א2jSHd\u000ed8̓d4\u0007*<S\t\u0018\u0019,\u0014oIU\\jbS\u00156_i\u0015ިu\nnWfZVh\u0017<))}#`/ߎ2z3\u00012\u0012G))NVb5Y]`Ru\u0001͘(Eg$(*3E\u0011\u0015Ye9FY5#kBQp\n><o)8O\b\u001c(^`y\u0001R̳1μgyĘJ\f#\u0015\u001coELQxNr437N3r4=Ϫ|\u0005SP~\u000255U\u0001\u0005K+8)s>yS~NC@SK\u0005o\u0006ޖ\u001at/*zXlȤ,bI&XP,\u001ac\u0015R4QE\u0001\n*(M+NT\u0005\u0014V)\nM-Ճ%4C\u0013Jɧ䔼K>yC6&\u001435Jz\u0001YQ΅Zz\u0001\u0016-\u0017X҉o\u0016ya+>J\u0001\u001e+\u001d)5\u001eI0=hD{&3SV$\u001a_VqOjlyʳ<˳:8e\u001f\u000b,\\~Zʹ4\\SHl2y\u001c1!P&JOոJ?\fHyU%ʳ*UcQe{\"n[FVKի\u001aU\u0007F.wZ\u001bVmh\u000eȠF΅ǩ\u0003zr@L\u0011\u0016\u0004I1Z\u001a(7T:B(GFe遺\u0012\r:\f;л\u000e\u0004\u0003X\u0003_mQg?ߎI~%g#=\u0007Rb|J\rcʥUÛйM\u0010\u0010\u0018\u000e\\\\<lF\nH-4\u00199x\u0010p!̖\u0002bhpj+ވVJxm\u001cH\u0003\u000325?\u0001F\u00135\fm\f[m\fm%E%fnWS,b5:\u0005._\u0001B冴O;o-We97\u00176q&mOI0\u0015|\u00133.O\u000bo\u0007v\u000b0na\u0018`\u001f\u0007 .\u000e\u000e\u000e6t#|NA\u0005s45\u000e{\u0006|w9>k1>$mIgiໝSQ;\u0013v\u0017M\u001cG'$\u001f]\u00150P`C@uQN\fw\u001e+\u001c\n}\u001a|7[ًO\nFwJ]#y\u0012PR\u001d\u0010\u0003a\u0006#>\feԥ8\u0019\ft4v71qz\u001c\u000ejiW|?<g\u0001>-/҃\n܏WO\u000f\u001c1x\u0015NA^SIAN$'g\u0019R,\u0003Y\u001e\u001ahmy\u0001׵u/`ͅ35\u001eb\u000f\u001e%Ұ>\u0004Z\u001a\u0007\f҅\\\u0003Opn!\u0018p8>c\u0010\u0001\"5ec\u0017,\u0017ýKK\u000ff+ų`ߐoO!|\u0004\u0005\u001cz-Kp\\uCѫ\u001b\f7\u0019RnWosܦHv\u001f;;\r\u0001\u001f\bP\u0004eP\r\u000ehfh(M\u0001Ey\u0007Eևb7:󺮢g\u001aKp\u0001>5H\u0018\u000eCa\u0004x$\u000eq`\\,<u}[rlwq8%̾F\u001d^F)^Bg~I\u0012 A\u0017gX\u0014>?Yu\f!yaM\u0017Z\u001c\u0016`{!`{9)E\u000bh̏Q\u001fh\u001f;:.iofp\u0006^\u0013\u0017\u0003'\u0006Ѻ7/}J3\u0015G~1`9U~\u000bYK\u001dm@k6Ӣ?ڵzGOѺѩlS$8AQn<\u001d\u001b\u0010r_\fw_pYX;|\u0017r\"𓈏4-\"el\nֱ\u0010\u000ec\tX:\u001dV;؎t\u0011^\u001e*ׅ5\u0018\u0003\u0007\u001eh\u000b9$\u0012\u0018\u001d\t\u001fV,a߆};\u0017plՐZ|\t-]ɳ|k\u001b\u000f\u001ayF\u000f;\u0018lݘ؀m\u0001\u001b@a\u001cn_\u0004L b \u0004\u0000\u0014-\u0011M&kk^5SWUv6ҤjTiViӤݴnUNC}\u0007>}}.Wy%z\"Y/\u0010\u001f_{Ob>\nۻ3>wiJ>\u0015EO\u001e\u001bOUE\u000e79𓣛\u001c}!\\+q~\u0015F6e\u0014;K\u000b0\"W\u0017ҽ\u0014My\u0005ޑ`HRsxx\u0006/Yڱ8]c~9X\u0019ze\r\u000bTtOҢQ\u0017B|c\u000f29w\u0012\u001dxz8-RL\u001aSγhq\u000fyi'O\u0017oi\u001f=\u0011l\u0018ff1\u0015s\u0018\fc\u0011`4!F?јop4Vc:W\u0001y,=|`oŔ>1\f\u0012D`1*\u0007u`6ƎjLz\u0010a\"Ώn\u001c\u001fh\bF0p\u0006C\t\u001b\u0018LÒ{\u0018_\u0010\u0012CI\"\u0004%M{MlbdK II\u0012%LTc,QcI%\u0018:0,APڀ!i\u000bH;0 El\u0010dc\u0010dsI^EwUtm\u0004DG{+3\u001dwLYfV\u000b37C;1\"##)\u001a\f\u0016/ՆC\u0010Гք6tw`z?:GϘ2іy\u0011Ywz\u000b^ω?9\u001bB\u000e\u001f\rx6`uKlfiq'\u001dL)\f(R\u0014@v9NgѦUG\u0017ޜ!4LE4?\u0006-xo\ts@\u0010Ïy<m66(dᜡgm\u000fGJ*\u0005*%\u001aV@n\rr\u001bјۊ.\u000e>\fuQD\u0006\\,\fNݿ\b{xm\u0012t\u001dM\u0015c[:oC\u001dxhdj2q@FV\u0007\f\fZ'\nܨ-Z\u0017K\u0007g1T\u0015ΡR\u000ea\u0007v+(7~@\u0010\u001fN<_&-7p%~X\tR\u0000u\u001cd\fh,LGz}\u000ej\u001aTp\u0019p\u001a\u001c2Ԣ؄\nc;\u001cE\u0002즣(3@y\u00156uX-/>K\u0013%\"Y=r`w\u001eps\u0007\u0018\u000e:T\u001c:\u0004&9&\u0005*Mp\u000ba7Qn.CŅRK\u0003lm\u0016$iXga]\u0012\u0011\u0012GQ\"}\u0011op\u001cK\u001d\u001fcm*q-$\fRG7u2V<U5\u001e\u000e\f\fYfj-B͆b[\u0015,nK}0ul\u0010\u0010\fۯ@g\u0002ǏuW9D($^#\u001d/cH\u00070u\u0003G'}c1f\u0018I(خٞ\u000f݀\"G\t\u000e\u0007\f\u0015W42\u0000]\u0000\n&ZB\u0012w|\u0007j',r\u0012\u0003<G\b^qqij诲H\u0012\u0014908wQA2U\u000emu5򫛐WGnM\u001fԵǡ=\u000bP}\u001fu\u000f\u0015W>P֊&E&.w\u0003\u0002m\f\u0011\u000bli&IX9㡭BS\u001c5u\u001bv۠T!ӆ^(\u001aFp\n\u0019Ho\u001f\"!R\u001b䳈=%\u000e.p$[;xuwI\u001b\u000eE덂9\u00119r(ݬ«CׂL\u001d:|Hu!7\fyI$lBr\u000bҖHl\bI-_Y̷۴?77s, \u0005ijڥZ\fQn \fY8H!ůܟd\u00112pAф\u0000\u0012;\u0006!\t !3\rO\u0011q\u001dF_|g|\u0013\u001cAfY\u001f㼓#\u000fVA}\u0016FK=J}\u0010\tio\u0002\u0012{eD\u0006$\n\tB\u0001\u0005\u000b\n\n\u001eD\u000b\u0012\u0011!L`0!J{\u001f\be7#b\u001c\u0017ɽ6ɼ0Xa,L\u000f|qzJ]\fPSS\u0006m$;\u001a8D\u000f'!b8\u0005\n\u0007-,FI>\u000b\u001dd0\u0007 1y7ȹf{5\u0007\"I\u001e\u0011q\u001c[\\9\t\u001fN\u0001\u000698\u0016<j%\u0013\u0012\"j:Ùn\u0014\u0010}HWdBLl!\u0006p\u0014!Cm8݉]^|vcwGxKzb\u0004\u0012%\\D\t~\" '$D\u0014߱\u0014\t,[L\"8[.\t[d_d]d]-\u0016\u0018\u000btBFd\u0002 {,J&Dla,.sIJZeNHڶΜA\u001fl\u0002\\D\n!{\u0016\u001f\\\tT\u0015/\u000b\b\u0002\"\f;\f\f& \n\n\u0012\u0014A\u0001WF&%IAbq\u0003\\\u001e\u0015ZkԘU$KxHj\u001bcbXNԦ9{,޷|{\u0003\u0001\u001d\r\f\u001b+#\u00009Ye4Pl\rX&p\u001e?\u0007\u000f(\u0002^{1O`b#=i\u0015uHh2\u0003ë\u0003ϵ+&\u0018n9̠H<6\u0012&\u0006&t4\u0019\u001d-\fF-4f\u001aP3h&M\u00104\u000eubCɗ:Kf\f<pd4KͰ\t͒V6~\n0rC}eHn\r\u001cNsB:@\u0013<@A_Ơ}G{||>|_%~\r/\u000b.\u000e)\f._\\Z!,8\f]u'0B\u0000(5\u001dwN\u0010\f\u0018FO3朜>dPg\b<Y\u001b\u000b]\u0013qp\u001c8{\u0010N\u001c\u0001!d\u0013Թ\u0014^\u0016Z>\\Ҥ}jCtrt\\\\ȯ\u0011k\u0018\u000f\u001aK\u00198D\u001f??8{=<<\u000fw\u0003rx\u0019\\\u0005\u0001O\r&5\u0015y vh}\u0016q-\rt\u0007=\u0007\u0001!\b P\fFj0\u0015ؔf/\u0007TdV\r[=v\u001d]\bKu_}\u0001K7펝ץc+\u0002\u0001 \u0012XAS\u0001\u001c\u001fZQ\u001dvg+tB\u0017-l7\b?ckncgX\b>\u0005Nth\u000fo+\u0013|+{n*\t\u0004^k踂?\u0003t\\B{l\u0017um29wtt\u0019\"w\u001a71p\u0018\u001c\u000ey\u0005G\u0014\\Vx\u0007塿\u0018ۏa\n\u0013]\u0019x:\u0007\u000bk\t%\u001c^i optDoq>!;p\u001c(cv\u0002;i\u0007\tw\u0007|-88,~>^rlWa\u0016د@Z=ZAX\u0003f8Z_m&:-D\u0019`\u0013kwp~\r>s\u001dzK?\"'f)X~vc\u0007N^F[4Eт&tl2!'*,4\u0012\u00062\"^\u000eq\u00176Q{\u0007rר\u0003_\b\\1a#\u0015\u001f\u0006b\u0013P\fG\u0019\u001ccᨆc2pӜ\u001c.E\u0012(>\u000f;F\u000fvf|¤n\u000b3a#<\u0003H#\u0017\u00028\f\n-F\"t<C},\\=;:\u0014':4:\u0004Sp\u0017WhϾ8ֲ\u0001m;Vʛjg\u0015?&xlx\\G\\t<QTSY\f^M\u001bӈT5M!m*Sպ|.GH;=_:\u001c\u0018)DZH\u0013\u001d>\u0005\u0015)\u0016rkKwմ\u0005Z)eZ\u0013TmjKU}*{lVEσ\u001aF]W=x\u001e2und\u0014y>уnOun5W&h{j3T힫q\u001eCU1Bc=U9^=\ty.RJxh\u0001\u0015~Km*\u000f\u001c*qt<O3~\u001d6\u0003+W<Xma`\u0014Z̕7/LZ/o\u001d*ozjwʽw|\u0006ԧP%>\u001aS>\u0013TgYB\u0015*ݨ|V\r{Sy\u001f+\b0w^\u0019s6|\u0017;:rT\u0013\n?Oj_J#5ߤb\u0001*ꛪa}sTw\u0006\u0014+?\\C\u0002o\u000650hv++2*3䞲B\u001c\u0006#\u0014u\r\fjv}L$7T\u001cA\u0001*\f2 (F\u0016\u0005588CB\u0006)7P9!_)\ft21RJq%\u0004ڕ\u001cP\nx\u001dwۜC\u001e^_\u0000\u0018\u0019\u0007\u001a\u001dIqD7\u0015\u0018g C\u0006\u001a\"\u0013\u0016De(#<[J\u0018Ԉ\nDNRRl٣\u0016Z\u0003w\u001a}L֘K\u000ep(щCp`<9k6d>\u0013\u0003FBr<\u001d̨~J2(-*F)QJ+):C\f׀r%j\u0004\"ǭٴ]&\u0014gzWq2\u001d}\u000e61\u0002dZ\u0006ʧ\u0016yo\":*1\u0012\u001dCБ\u0015T\u001bCd3F*\u0018'k\\T%\u0006b.TLje<XKb\u0012*:ᨢ\u0017::\u0010P+\u0002\u0018\u0005֣yé\u0005Ԡ\u001c\u001dE rf.S\u0016_%X\u0002el)!Aq\tɊfh-Plb\u0013)j\u001c@\u0011\u0006۶`?P-^;\u0014\u0006m\u000e&-¸z8Z\u00132>\u001f΁kJJ\u0017%<d(\u0016 -T1(E͊\u0014<'PXX\u0019R*4eBRW(8uR\u000f)0ং\u001c׉\u0004ˣ苌XCK\u0015:J78eS#vbbJwSt\"S\u0014\u0016\b\u0019v\u0000Eyaf]N\u0005E1j'\u000bKX\u0016uw=p\u0011D]Ph@\u0005\u0017\b\u0004<\u001a\u000f0vb\u000eM<9\u0013t$m8Jڤ\\\u001fʤa>QC<fK\u0004%䪳e:Y\u0016)޲Fq;\u0015kŌ}\u000b\u0007\u001eo#f}\u001eV,\u001f=r-\u001eMM켓BCI u\u001ajV\u0017kJVg@uJ\u001b4Ҳ\u0015BE*ddۡ(\u0011Ef\u000e|<ɔ\u001enǦǙ\u0011KTu6v w\u001akl2\u00128\\zfKIv\u00122\u0014\u0019X{b=\u0014m'}(ȔeWT$E:fX\bG\u001d-28\u000e)q\u0006|\nˢs\u0004ho]!l0\u0007=r-,Re\u0018\"\u0004w\bE9͊t&d\u0019]\u0015\u001ap(2dp\u0014➮`w\u0002\"?AIp]~/ON)78OZ5,E`\u0006l\"$\\Fy^3\u0001$2Od5T'FD\u0005zz(=, \u000f\u001bgB\u00065=\u0002:\u0018to9tq9so\\Y\u0019\u0004{\u0013\\\u001fW\u0016m\u0018!TWj\u0014e(\fU@!Crx9l^E^^ǛM\u0017C7\u0013\u00135\"k\u0016COMw%U-a\u001exԀg#+ޝ\u0012H&r\u000b\u0003Qex2\u000eDR*\u0016\u0000\u0011RR>|\u001e`jK0~a|\u001b|}Xzf\u001eX\u0016\u0007d/,`0oJfJ\u001a\u0006\u0002j\u0001_5\u0019\t\tTE\u0015\nWQ%+@3T.¤Vބ;@_Kڕ|VK\u0013H\t\u001aF7D`\u0006a\u001fLr_\u0003hvȣ<\u001aȣ<\u001ai\u001aF\u000eF6\u0006\u0016w\u0003h\fe\u001ds-*\u001c*\u000112eXI\u001b\u00033b3\u001a\u0000Is\u0001m2\u0007<h~\u0018~泙Ư<Zȣpk{SFS\u0015]͖5eģ*R\u0001o\u0011\\9MG-mRR\u001d3p\u0006|a\u001fkG \u0007A:@C|\u0010}G\u001bhcNp[E+\u0013J\u0007s\u00163bƖ\u000b\u00031<\u0002OWb\u001dz\u0010x\u001e\u001co>\u0017Q\"@z\u0019\u001ecn^NVN$)\u0016I&\u0004O/\\T\typײ\r~\f\u0019\u001ch\nx\rNw\f8\u000b^\u0007o7h\u0018\u0005\u000e:9ϚQL3x\u0019m\\\u0000\u0006|\u0005pZ+\u0007>V\u001e4\bX9\u0018np\f9\u0010\u000e\u0001\n\u0000\u0017%p\u0005\u0007b]\u000779E|F\u000ek.=tqߣp_\t\u0000~ \u0010\u0018@\u0014\u0004z! \u00158d\u000f\n%8\u0005b&qO\u001b,\t\u00157G;[\u0014s}F7}\u001d#8\u000f\u0000\u0001>oDX\u001d׏xo\u0001\u0004b\u0010E.!\u0002}F\u001e'W\\G\u001b8?#}\ny\r7{//\u0011\u0002x8xB/?xxd!]\u001fʥ?8\n\u0007J\u001eq\u0017q`2ϓ9cʚv鷈uXi<^^\u0005G\u001c~\u0004_['228}@-1/i\u0004 \u001az]@\"b#v9\u00171::f)d̲%8\f)=`\u0018A\u000e}`7x#\u0007vL*%\u001f\u0002x[f\u0012EA>Nlb=Ӊe2į~xVav];aA-\u001363ڧam\u0002Fnf:iyZ\u001c\u0016G\u00181cW6\u0014\u0018!~>gb\u0011\u0012E,C\r\u0014%F3QV\u001d\u001dX\u0005n\u00018ױ\u0004wl=>t\u000b3mIB6wh=X)p1\u0013b8\u0013{V\fe5YЕ(\u0002އq#%\u001fY/>\u0017`ݍ.F($\u000b\u0001p<\nG\n\f68\u001c\bjȣZӴ<\u0016G\u0005\tU\u0019\u0011J\\\t#J7á{6h^b{?v\u0012[!{8v\u0016\n!J$D\r@2\u001c\u0014-D\u001fʂ\t\u0014xP\u0017\u0012W`k\u0006,@9G\u001e\u0002\u001fY?[ԟ0G^m8rК.5~a\u0004_\u0002\\0A\f\u0002O:YT\tW\u000e*N.gd\rm$VM{Mn+r\u0005ޓ+\u0013}\u0007GXo|/\u001aDA]\u0016\u001aU\u0012\u001c9\u0001fy;kfT\u0010W5-hr,\u001alSNCݚ\u0014;d\\%\u0010X\fmh#aǕ\u0019~I\u0011ww\u001f\u0004[~\u001c\u00038\u0006:Z\u001aڲE7*HFyb\u0013=41\\\u0011\u0018\tT3f(8NYɲGNWfd2\"+\u001eY&YMj:.,/>R+цhk\u0002k\u0006nтҖ\u0015Q|k9T(ƛm,S/My2̣d3[n\u001a\\F\u0017)%fĬШ\u001a\u0019W#^wh\u001d\r\u00178ӂ\u0018%mhY\u000by>̠NSi\u0003\u0002\u0015kTF.\u0013+_l#\f0\f3\u0000ΰl\n(\u00110.D\u00044D\u0012wq;hc\u001b\u00189&\b٬i&VLlkXSi&=iZcܲUt\u001b\u001c\u001e=}kPqQE!\u0016\f0ԩ,+7lFSNx\u00191W\u0019UJ3nUK)rF\u00017r+%.^nrn-d\u001d<Ffx<BjB'e1Ri\nA7)\u0018\u001cM٦$eҔi\u001aQJ,SjK)~T\u000er%7+))%Dvi%X_J\"uww\u0017&|m\u000b#2,\u001cEfJ\u0016\rJQ`U9@a0\u001bf(՜\u00181YrX\n4R؉Jڨ\u000426f#k+;+˳[6\u0019\u0007~v#RGy\u001084R^s\u0013+6T)`9aJF+jS-Yv[\u0012\u0014\u001f_\u0007dK5^%o9IE'ȤeE%}$7èl\nl`\u0006|nK-<&Fehe\u0014kV\u001dh\u000f\u001exIqX\u0012&(6)G\"$WȜT$\u0006N;_T\u0004;pe\u0004Nrn{\u0000=N@`!cp\u0003\\1\u0019;Y\u000fdT\u001f9\u00150P,3^NR\u0014R(SXENVxZ\u0016(4}?!C\u0001\u0005g\t.ʐqw>߂\u0015Y?\u0019=N\u0016#_\u0015<&0ҧ\u0002zs+&OQ\u0019A\b1#R\u0011\u0019Vg&),3]Y\n*հI2dPp<\u0005(0C\u00019?(8/<39AM֪lTi&Sy?;pMgq$*r\u0003\u0014kPHnȐ\u0014\u0005P`~\u0002˿\u0006̖\u001fqHA\u0006\u0017>+#C\r*B\u000bܼg\u001b9G0\u0016s%\\*(EYX'bt\u0019\u0014T\u0014P\u0010%b\u0016\u000f_q\u0014q-OI\u0006,WWҍ1\t%gحNՠ:i\u0015V\u00194x\fi|U<}/!㤀A+\u000bР2|ˌ)h`yr\\\u000erY\bX\n0嘵rC\u0019ƠS\u0004W.jB\u0011豉\u00114\u000e/Ɩd%\u0019\u0016ӛ BM\n\u00100wE=\\\u001c.\u0004BD.\u0018\"\u0001c\u001c'1!Mdb6\u0001\u000e\u00131;-s8K\u0017pG`O+y\u001e\u001dɇK*a@ȡ3$\u0019x\f\u001a\\\f\u001f\\5\\t5\\@5\u0000\u0011д\u001a!`u+-M_M;\"88Lum6{\u0012&P\u001e\\\u0012\t\u0011U\f\u0005jbibh[6ҋP\u0000\u0005@/\u001aDG=l\u0014yC2D-\\X:`\n\u0007XX\u0000\u000bG}\f\u0019\u0004\u001735ã9\u001cp5\u0001XᲈXĢ.$ml||<[\\\nnm 5\u0016ʡ]ֱ\u0017@!H]/Y\u001d@\u000b\u0018&\nVxҏVx£\u0015%R\u000e\u0010Z\u001aq.\u0003|j&UL+q4+ZO\u0015X9HfF$|6K\u0019[\u0000\u0000w+(݋\r\u001d<\u000e\fd۹xvzю(8r965]@:r;z\u0007gAK2>A\u000fb\u0001{\u0005婋t}\fA\u001b=\u001c=\u001c=\u001buh\u000b$߽V3u\"o%9KɓFb\u0006vI\u00039V\u0000\u0011#=\u0018 u̐ǜc@E?e\u001cb(E\u001ba.^z\u0002\u001eCU>\u0004_Z>QA\\%!\u0019Կ_\u001ap\u001b\u001355AG\u0019y1~\t\u0004[/\t\u001eg\u0018?>q\u0011&8Ǣ%Yzq]9@\u000e\"g 57\u001b<Ǽ=f\u001d/΀w9Q|\u001fP5\u0017Xr*\u001e.S\r\u00128y\u0007P\u0010\u000b\u001c \u0017\u0001q\u000f\u001b\u001d-M\\׸p@E~\u001b\u001c_).:\u000bx\u0006~B>G\"QUmp\u0014\u000e\u0007A0ҷx̯5c=U\fK+<.$;\u000f?1?R>@k?eέ\u0004x\u0003\n^?\u001cni 5\u00053|5ezqA#_L\n^.{8\u000b3w𗿂8#=C=:n$2\u001ey\u001d?t,\u0003Y?8\u0006Vr\u0007\u0019\u0015E\u0004r\u0011?أ8\u0002\u001eG:rXD^]M2m\u0011\u0005~A\u000f馲.=\rݠ&救GZq\u0005+YȑLLV8\u0015DDRKX%_\"6cvv'iP6Դ\u001e\u0000l\u0000_\u0012+u:~G-\u0006rE.\u001b9\u001cϢB1į DW\u0012c\rĞ2 YNy:\f߰Z_j%yWx=19v-\u0018\u0017{E'{Cf$Il\u0017q1\tBjrԑdkL\u0015\u001f76`\u001b0`n&&`CbH\u0000'@B(\u0004H\u0013B[Fi.K@%Ye\t(mfi6AZN]5mӺ}m6MӦM۪}ؤjڥ4G.S\t=z?y99\u0019『w\u0010\u000bf\f8$7el\u001f{\u0015\u0013W\u000f('ߡܿ$xqÖ\u000e8\t1Ua\b#f<ߦg3q\u0000;\u0004cX5\u000e#Df\b\u000e\u0012=\u001d\tMSw)h5\u0015졅p$v1iL.x\n8K)gY\u0019BDi\u0015m`\f$\u000e]v>NK<\u0013n\u001b'2LY\u0006%u\t)t\u0005Y='e\u000e*\u0011\\v/<e'\u0004O7sKZꄧ\u000fK\u0006{lYs[Ȩv2oVRZ\f˥_^\u0003\u0017mOa\u001ch\u0006\u0006\u00134\r\u000frx܎\u0010\\\u0011jKmqj\u001b֦iE㏪9ႚ\u0012!\u001a\u0013\u000fՐ\u0000\u001e\u001dxږY>\u001fq~J\u0004\u0019\tM5+ɢmIښQ{rڒ˵9%M)aES\u001b՜\u001aUSj61m\"Z~D\u0019\u000bXR(j\r?R/1~\nb\u0005:m:r\"8\u0014+GS \u0006I\u001fږVQQU\u00066\u001a`(VB\u0011Z7֫޸Qu6Mݪ5Ri3\u000f)yNU\nV\u0003UX>T3\u0010S\u0000\u0005KH\u0010\u0010'bCط\u0013Eȓ&K\"L3TgU\\Z_5ZjUm(hک_Qgͪ,\u0005mUb{S\u001fg\u0015;>S#\u0012{Lo\u001c&\u0017\u0019Yg{\u0002\u0014\u001f\u0010(C$;I!Qk,ekͭ*[*m媰W^2GJ\u001d[SI39O\u0000QsWޜ\u0007w\u001e6\t%3\u001b3IcuKZ~\u000fvl\u000eF9{\u0014IW3SNʜ.*8'\"WH>\u0006\u0015涩 Gyv?<U<w+\\ޘr=1Ht\u001dދ̳[\u0005p\u00003h\u001d]HVr|\r!\u000f\u0003)*v[sg\u0006ETY+7\"w*\u0018PN(\"{m|+[֏e\u0000u\r\u000b̲'4Gx:q\u0013j\b2#%\t\u0015f(,O]y-,T._P9z9Z(iJƕUrT֒K_L_\\O\u001e\u0016g|\\\u001d\u0003e\u000f-#m'J֓#Ħ䗥)oR*)+{il34,kY\u0013营_}2Ú2V*Cʨ%G|GU9\u001581\u001axY:؁fT[s\u001dZO;$G [YY\u0001<Y\u0002>\u0003ʬQ5`\fQ\u0007\u000f)-[J&\u0019RVj0\u001b\u0012vƟ^D\u001fw;X҃][K\u0013>\t'\u0015\u0010dMSfI,\u0019kr@\fʨVz(PRB=J\n\u000f)1<GC\u001cF%-*.E8O#wr'\u0018EXw3ny\u001b~ijl\u0013\u000fq0:\u001bRި\u0016F\u001c()RH#k\u001f\u000f/\u0000- \u0012\t+`ތYtd\u000fwS<o/u(@||EܬŸ)Y)Q\u00124(%J!r$nb\u0017%Q\u000e\u0018\r\u0000M\u0014EPԂZiF56 c\fyx\u001b&\u0017F)F\u0011~o]̞/\u001ebe\u001e\u0013KLR|'\rm\tdI\u001d4\u000e\u001a^\u0007Ť :0\u001f')~M\u0002\u0006v[;~h^r\u0001c6;A>N0uR;\u0005HfbM\t~f/w\u001d\u000f_ዾ\u0002Kax\u001f\u001b\u0001\u0006\u001e\fe\u0002\u0015\"'q\u001c!a$\u001d\u0003|:\u000fx\u001eĞqbM\u0016G#\b\u0011a\u0004\u0010\u0018\u0017{i{sp\u0007 mx\fA\u000eY2\u001a`͐\u000f\u0014ѐb:\u000b\t}0q8k]\bA\u0002(nbL4n\"\u0013L\u0003\u0014vLa\u0014vL\"&i0bK4A<&\b\u0004\u001a?åC){1\u0014ǎJ\u0010\u0011w\fցJ\u00189\b\u0012>\u001fc\u001e;cܘɋ9.\u001c?7Fҳ\u0014B_H\u0004x|\n:;_ \u0006U:G\u000e\u0000;0\u0004\\|H\u0004\u0002v,bb\u001e,R\u0016(2\u000b$y\u001c{8G^~;?o\u0007سEi㗩\u0005W\u0003H*_%p\rp\f\u0006Ǎ' 67%X,\u0013e\n2X&8ҫ>_{\u0003Ŵna\"r܄\u0016*_\u0006a\u0007\u000b|n]\u001bM\u0016>gVc\u0005\u0011B~PW\nI\u0002ʊt9c/g\u0004gT\u0002W6\\ۏ_ݛ¸\u0000\u0007oo=^I/\u0006G\u0003\u0012\b!R\u00066\\{t\u001dƟ6%inmzK4IIKKEZ.\u0016E\u0002\\1AA\u0018\bȠ\u0000\u0015\u001d\u0003\u0018 ás)\u000e`e2q2&s\u0018ӝYiOs~/<\u0017Yz,GG\u0011>\u0012ۇ;\u0005h\n{mf5*c?,k\b\u001cs\u001c51#ꋚ\u000bb԰\u001a\u0007>\u0000\u001f\u0012_8?@}^Gnx7u6v̀/b@2\u0001\u0017(\u0005CA\u0018w6\u0006ڦq-gҿ\u0014u\u00137g8?R<7\u0007\u001f{\b{BGeER?.\u0017j\u0001K?\u0011wvT=\u000e:uч踂89,C%tz\u000bgz@\u0001\u0012\u0007{཮kz\r_\u001a\u0012>\u0004\u000e/߈M\u0019_p귪һܷtɜGG\u001f8qyqa6WqR6K\u0010\u0015'Hz\u001d0\u000fv]_p\u0007|ܟ>\u001bݛ,::)\u0005t\u001cGsc88#8\u0003Zܬ}d/\r_R@\u0011m\u001c!B\u0011\u0000#\u0001_y\u000b\\\u0003b3e'\u0007\"֯MzG<S\u001fq?_;Wh\u0011\u001e\n91\u001e%c\u0019يP9`-\t\u001bђoc\u0003-^,p9=R\tBN<Q?[92tdn=L<Aȑ]Xe\u0005\u001f\\h\u0019E\u0014\u0007x8z\u0014\u0012'mH2G>\u001cek=:\u001eB\u001at5J\u0013R=pt±nѽ(\\\u000eSݰt*\u0015O\u0017\u000f.r\u0003?\u001ab̘\u0003C\"f'\u0014Q~\u0007m\u0016\u000em\u0005IG<4\u0017\u0001v\u0003\u0015PAo ɠy#ynsmE\u000f\u0017\u0018\u0004o\n\u0016\u000e\u000b\u00028\u0014,\u0000O\u0013UB$P]\u0004*,Od_ 2\\G{\u0019?vX\u001a-\u0018\u0016s^tSsd+\u0003\\x\n)\u000fc\u0010:h\u0015_P\n~/\u000ek$\u0015?\u0013f\u0004O\u0018\u0011yF\u0003>Oqm\u0003rѺ\u001c!.s\u0013Sc\u0012\u0019>;\\䱧\"\u001ap\u0005᪇\u0011pMd\u0019ptvZf^\u0006\u001fw@d\u0000G\\ȝ\u0000\n-a4uAL&\u001bcjHָA9ʂ͞*\u001c\u0013P}LHuª\u001d4Z5\u0013\u00149\u001a\u0015_'\u000e`K0\\RE-U$F\u0006p+mw\u001a_ղqlI&&cqjHNQ8:Cj\u0013U`b\u0013+4$JUI\n$5ȗ4VH%o\u0012UqOxBwU`BSDE\u0000O\u0003ƮG\u0000m%\u001e#P\u00071i\u001f(bPɨ!F\u0002t94y4T*Rjܤbs\n\u001d*HW5r[)\\\u0013ʱ\\z\u001bD\u000b$#F\u000f\u0010#\u001fϯw\u0017泥8!7#\u0018\u0011kȍߚ\nY\u0016J-\u0019*RBK\nUX):Jn[rm3/T}Rc\u0017xGi3-»\u0004[\u00181nŌsJnFS'\u0019R*\u001bU`cO۞<{r\u001d%r9|I\u000b);AY㕙>MNgҝ+*{^2^5Ml\u0011\u001e\u0018k\u0019\u0007H=Sl-~@\fF\u0018y24+iSө̌\\P\n93*=+4L={l]< K7#L_O̔\u0000zvx75RxeXՅ|v\u001b\u0006ꤖz\rP#6(e3Ǣ49\\#L*Yek.{LddHO*sLIs#>|o\r#c\u0019`\u0001;3\tmcHrSCn|Ĥ* Y|vY<TO\u0005>\nke,K)EmJ.+x\fU\\Q\u0016y\u001d|;rȻ\u0001\u000b\u0000chiCG3#\bt2\u00147^RL%VJe,u) %\rVRYH\t2*ۡX\u0012xK^n\"/\u001b˴2K-pg]9\u0000]m\t\u000bjF_\u0018-CF2֓\u0007b$&@>*-JLx_b}^\rSH~gC\u0000\u001ac\u0005c\u0003\f~cUE\u0003p>4q*=\u0001Ns\u0013\u001faXFh\u0010\u0013\u000711+)`b\u001c\u001eA\u000e M\u001ch\u0014P\u000ei`\u0001\u00180MA\fC?Vj)x6{Lz\u0002\u0006ӐأVBV7q\u00127\u000b\u0010$K%l\u0005\\xa\u000e0\u001c\u0014t\u001f\\x\u001e\f\rǸcBHuhcC\u000e걓zCON0y\u0016y@0\u0011\"dF\\1R\u001d\u001ckRivHM\u001cdM4p\u0013ġӄ&45GoL\u0003Lk.Khhh\u000bk\\ni)![\r9<tѓh\u0019242\u0001<ù\u0017.\u0002ˍ(\u0018ϐ\bD\u000e\rQA\u0015`\u0013\t1X\u0015<i1QH̡\u001d3&ĤifvjbN1I4c:Iu-lgZ'<.y}{\u001f\u0014C<Vrc`k*c\u001f.rɗ\u0012rQL.i&ԣ\u0018M\u0014\u0013<H\u0007\"\f\\ٜK\u001c|bӣpoA2Mk:\u001cf[|v\u00171TR&N\u001bۉ$_\f.CXL.\u0016qW3\bU1\u0004UJtQI.*9<ԣ\u0002VT\u0000\u0016]\u0013`\u001e0c\u00160͗1\u0006#Z\u0001\u001a\t2hB xD*xX\u0019\u00009S=q,'ı8I\u001dM\\rjG-\u0002e3Z$s\tF!a\rV_s3u@5\u0014\u00007S\u0003wvd\u0004p)\f\u001b\r8\u001aF#[#g\u0011]4r\u001a8\r$7\tajaT0կ\u001a\u0011&(\u0014/\\\u0006$^\u001d\b?h\u0013AF>\u0018<\u0000h#\u0017;\u0011?;:\u0010 6\b\u001e+X\u0012y#tp\u000e\u000b\u001130hs1\u0018\f; 9t\u0013G7&4nrхU]Gy,AU\u0015Epܳ:^J<\u0004a<2h6\u0018\u0000ƺ\t\u001bg\u0001G\u001fI\u0000'M/uE\u001b賏FG.\u0010Y\u001f\u001b\u001e'ṿ;\r1pa0p\u0019\u0007{\u0002\u0013Lߐ\t{%W\u0003@\u0018Ca\u001f!\u0015\u0016WқO\u001c\fc\u0003\f*\u0003\u0001r1@\u0007\u0000\u000f_R\u0019qpf\u0017\u001eLtLRl`ut\u001c^\u0000o\u0001$6hVӐq\r-8.sfp>rFqخR+_W.0Y\u000e\u0018\rāt0Rοgjs;\u0006\u001b\u001apH}A#\u001cGGs\"^@ a\bG>|Tp\u001c\u001f!X4T\f|pƲ~\u0001kg88K8\u0011G\u000f\u0003<\u001eN]<E\u0005D4\u0000(y}YZY;b6\u0000\u0013\u000eԮO\u0011}<\n\u000en-qSM8z\u001d\u0017{Sx8Nk\u001b{M)(3H4z\u0017~=1p\b\u001c\bp;T_+}Xኁ'\t,\u0004?u\u0006\n\u0014q@>zS'u/\r>z:=E\u0013;\u001d\u001cN*ңn<7U#`\u000b:.\u001d_O\u0003Rܠԍp\u001b\u000e/h=k!\u001fG!^7Y\u0010Jgz\\h\u0001Dt*bn\u0015\u0016\f6\u0001^\f489x,؋\u0005h2\u0000G\u001a\u001eM>:p6N\u001cv4\u0015\u0012#ԥY\rE\u001bf\u0012UR0we\u0000\u000bm\u0017\u0003Xu8#\u0014\u000b\u0007teD\u0002\u001ct\b2!Ue\u0005/Z\"\\B.j(f\u0011\u001amV]\u0015O{\u000b\u001ejȭ\u00027\\~t\u0012 \\χc\u0002\u001c9\u0019)\b2xY\u0016ŮC-Z@泳R\u001a\\\t,F}\b9(48ĵ5xW:EiU\u001d5YJϨ.&j$\nn\u00141\rBxS\u000f\u0015(f\u0013YjC(i>'{o\u0010g\u0018G;k}+l$\u0016n9C5\u0019rxxK\u0006<sG\u0015Ή\u000f\u0012x*j\u0019]r~\"}nw\u000eUL%o\u0002 Nq\u001eO*c\u001c}e;W&YC%/\u0019\u001eP8ffc_1)\u001e\u0014\tk.\\p\u0000ṕg\u0001t\u0016\u0014SO\u0011Y:\u0007\u001bo\u0010'\u0019`Q:9\u0000-x\u0006w3ӐQz\u001f\u0012\u0001\u0005>;\\p%'/\\p\rk4\\\u00135hr\u0014#{#PN.\n\u001eidgq\u0001ed\b\u0005Y\u0019\u00181@3zMaL$?\u001cr2\u001c\u0002C&X5>ȡ1A.\u0007%jTPF\u0006giD\b\r\u000f\u0019a!w+'tC\u0019V:7)5C)O(\f\u00171|!OwDt\u001c.Xm)1\u000fPANO!ǁ紆*dT^U\u0006r\f.eGx\u0015\u001cGRZ\u0004ySbdS<J07*\u001e/)|Q1{Z|z\u0012x\u000e-k~\u0005k\u0018\u0005\u0019撧f2\u0019KmFi1)\u001cTs8%dɐ2\\\t\u0016(Z(L%rF5(.춗e]\u0004_[\u0007}vƭIm\u00173\u0006\u0011l4\u001dLb\f\f\tR ͢(b%e*֖\u0018[\u0014m%TvGlFòD(S\u0005/t\u0004N𳛱A\u001d\u001a486S\u000442dS\u0014wF8r:\u001cv\u0011,3\u0013木\u0016\u0012Hf\u001a\\\u0015RW~\u0019M>d{<\r=ZQ\u00151]!2Y\u001fQ,jLN\\\u0011r,rN\u0004i\r9~LSeLȄ*\u0019\u0012W*,qB=\u0007\u00149 \u001b\nN\u0002UHO]pwL,\u0002Xߕ|VLl)f\u001c9#'\u0019CNPEyLxl2{2yeLJUD0\u0019(<eBSf+ĻPA^\f\u0017\u00162z\u00196$;݊%k\u0000K\u0019=+\u001eNǦ\u0002\u001cG,h6\u0013GN\u001c١\u001b\u0015f\u000fu\u0002u}\u0001-m\u000br\u001c-h\u000b\u0014Q`\u001cr*1n \u0002\"ʘTTW\u00001h\u0013\u001d\u0019۹-sn1NM\u0017O̘ۗ{sEH\u001b\\\u0014\u0014Gʐi(\rP,\u0002;Ve\fYb\u0000/9\u000bo\rC?\u0016\u0007p6YMw̕8Gm7;bkR'џ~zIѩY\u0019ii\u0002?Ҿ;R\u001b)K\u0019Zf̰ef2ݧ\u0012Qj\u0019(5OY6l[_s\u0002A^\u001a-//}>-U3Ui0v|:ɮL1v\nͥB\u0011+t\u0015r)\u0015D]᥊y\b\u0016\nݸ~0)\\*ָɽû{Xfmհ2\u0015V|ߵ=růĔTMT۩\u0015jEZ\u001e\u0001\u0002Wj\u0017^\u0005vqq\u0016*B˄ΆKZ[µo5c[_U`8,G bK^2ٓ:\u0013hh5i|1/j\u0015Z\u0005V<jiV\u0000kPV\u0017billZsBcCMk\u001cU;.\u0013nXGj>XA>ך_,N7Ѧ\u0012\r_\\\u0017[=_iu`xD@yy\u0006_2%ʹx\u001d>r؏{Թr`jf>+Te$9\r`c\u000fU:\fI\f\u0005~%\u001dٱ/\u001a袁/\u001a\u0014\u0006h\u0010\f_\u0005s)qql\u001a\u001b\u0000K3[j\u000b\u0006ML_>\u000f7\\\u0001;ֲc4QkTT((kx[\u0012w\nሕ\u0015\u001fKk4U@{.J1P╢\u001d4\fŗqE\u0012`\u0000ƎUn\\\u0016ɼEi]l'$\u001a{.y\u0007ǵ\u001a1Ja\u001b\u000e}\f\u000b!Ϛ\b:mfG3m4I3]4E3\u00015q^\u0017\u001e'$;i츎[u\rr@\n1T\u001a<ȸѹm\t\u000e\u000fa-\u0007߉MKvǀz(j-|BL9\u0011~3\u0016\u001bp.Q3\rxԭGn߶d\u0001N;|ܛ}6\u0007'Ѷ$3'qR<%&4S|qJ~DzR>ދx/9\u0019f |ʸ'yj=\t\u000bk\u0018âٱ\f]0!,\u001dڣp\u0006~ӳq0rN<\u0017Qٗc;ޥ\u000e`|\u0005<\\^\\e>PF<\u0001?\u0004W\u001fOcq|\u0016x\u001diorM\u0006_a{\tu|\t\u0003=&R\u001aK忚6W$dv}*1?X߶i{#_\u0017\u0018\\Y3Nmc}\u0004\r6\u0007>|d)];__\u001d/\u00059Գ\n3%OlOI'\t<!=19Gc&}/\u0005\u001b>\u00053d,mB=E;b\u0004\u0017W8{;\n,g_^U*Ilt\u0015Btl\u000f\u0012\tx\u001f\u001a(\r$\u0005/\u0010g\u001b :{'iv\u0012\u00136\u0007l`\u001egv;8hûC\u0015QO)\u0007͠s'I=.\f\\x\u001e\u001e)\u00159\u0017)#+\u001byJ\u001c9ۉxs'5ۆ\rTx>)3tSI/\u000bWB)t~-\u0006vk~ƻFvNZ\u001fMsEp]z>Dk;\u001addI8,y\u0007b\u001ci|\u001cEN\u001c\u0012bWVf{crVրc\u0005o5(Xe1\u0015/\u0006\u0017sSG\tj+GYv\u0014ꎣ7b\u001c%8pTȊ*J3\u0015L<s,rXy<3/.:jMo&\u000b8c$|(KUV\u0018\u000eu#%n4\u0012xzȂ8\u0006(\u0015e\u0014Y\u0012OL\u001a\u0018fd'gt*jmL\u0013c*Ro\t];\n7i]ƖqQ,.n/\u000fWO<}\fS2c\u001a;:q&yb\"\u000b'D5}Vd%Վ=c(BU\u0004rբ\u001fΞ\rF5T\u001f2\u0013g{̞\u0007@%\fW9*\\p5'\"\u001b-e\u0014]\u001awHe\u001f\u001eϡ5N\u001f\u0015kZ>JYٲ_\u0016h9\u0019\nuk<q쨔+c\u0018v0\f\u0018j\u001dk*z/jWPY2\u0006@\u00158~\u0004R53~ަ\u001e\u001cn0\u0002^i5Ə%F9F\u0019|2fƥeƙW\u0017~5\u0015U\u0019b\u0010\u0015S\u0000'RYo9Z\u0019Rm\u000bUN\u0014u\u0013oֺ\u0007{={V\r1I=L3N9)1k\u0018\u0013%\u0018ҩ \u0006\u0014Q2$(\"t\u001e\u001fӦGQ(L_\u0019=7E(8\u0012\u0019#/|$2ގD#Uyluj6\u0019EWmlqb}\u001a'6t2\"s\f\u001a\u0003DD\u0011E]zG.QuX::zdVEAfmg]\u0016yY#1rHd\u0016|8\u0018Z\u000f\u001d#_y)NRlF0)NEQnf΍yQ3F^HF;9rr\"L.Ñ8\u0019#-*|ָ\u001dߍVkZ;'\u0018}^k\\ʖ9\u0017[C\u0013\u0012k()\u0011=;EaAz%pFnI\u0014Aq2Id\"AB\u0006(\u00047Q\\ \u0018\u0012!\tb)D\u00101\u0004Q5\u000bmQ㫚ؾUZE\u001eJ\u0011I'\u0006n[z^k{9{w)ʢc\ra\u0017eZ\b2R[Xh\ts\u0014q\u0012$z\u0007}&fD\u001eUY\u001f\u0016È\u001a[SF8\u00000\u0015*\b\\L8\u0011V[F8\bk'OaUOX\r\u0012\u0016us3qahua\bqu1vteu92_<\u0013;}G2\u000e\rKB# &`Tq&\u0004I%Yw4\u0013v6NX9\n\u000b7gaV^ha,\u0007\u0001ӽ)C\"G\u0002`CAN\fyb*c4Z̲IhWGV\r\u0001L\u0012gMb\u0002gXޅ8\u001c|DI\u001f\u001bQNh<)\u001aO\u0013z\u0001\u0017D\u0006DF(73@t\u0002iiNi63OLf1;\u0015C\u0004uIمQ|\u0018{\u001db\t\u0002\u0013_?Zj\u0017`&ޱ\u0016\u001a.v?.\u0010_Ə\u000b\u000f\u0002\u0011\u001fς(38яWҗ\u0017\u0017>Tz.?.7i<\u001d\b%oD,!`R8\u0019\\\u0003)\b`. .j\u0010ȥ\u001aH\u0001\u0007B@H\u001c\b\u0002\u00011%\u0019폎@\u0019T\u0002\u0014\u001e\u0001Xb/&\u0010f:\u000e.cK4#1wsb=8|\u0003LfҖ\u000f\u0017\u0010xxCCxt\t$2N(mt\f5\u0019&j0T?\u0012Cp\u0018\u000fmG2\u000eaE\u001eh\u001c\u001a\u00199\u0010K(U\u0001\u0013/0q&\u0016{\u0006\u0017\u0004@Ak\u0000\u0016\u001eX\u0003\u000b=\t=Y&zfͺ\fu\u0018Э>H\u000eV\u0018^iPfPwމЋ\u0012\u0003\u0012\u0006lxH9,4ٲ5f`\f,x\b808\u0011!qM٠)]I\u0013\fl\u0018\u001a\"\u00021\u001a0B\u001c\u0000TI##P$Ccba܍\u00022Sc5#&\u0018F&\u0013G;Τ-gҖ\u001a\u0004H#D\r>[3F5b(\u000bA\u0005b${\u0007\u001fizз9&\u0000l^}p\"F;b2\u0007\u001f!{asE\u0017\nD&x#8j$\u000e,byb!p,dLY\u0013\u0019]ّ!1CHlp\u001d\u0018\\q\u0010\u001c .U%NLH-Rdch\n\u0007^@D\b3Hv\u0001gxq|Dp*жhcH\u0000u}\u001a\u00156\u0006\u001d\u000e7jʌ\n?R#3I3< P\u001bS,\u0012>\u0007 \u001a؞\u0016Eq\u0003\\=-\u0014R'\u00146;9IAzɆ\u001bٜI6|\u0016XdA,@\u0002\u0013W\u0001־+\u0012Y?[ړC\u0006\u000biBF-\u001b(ӊ\t-A[(\u001coq@\u0000j\t\u0015ȡ^s8\u001cj$\u0007,\u0016AE$h\u0011\u0005~?Xhڊ\u0013>\u0015ǁ-\u0019a0|!St+R)5D@*\u0018z\u0005mahCF\u0011nlV7qm\u0006͐p\u0013nyQњ+\u0001{\u0006\u0017O#Ok\tR>5y\u0018]Nbs0\f;P^84~EJc\u001di<rg.\t8`\u0013r\u0014E\tKk\u001bےv\u001dh]\\˹{W*U\u0003\u0005\u0005ר\u000bnz\u001b6j4YZl۾CTtLq]&tѳwb\fM\u001d6bT1cǍ0qR)SeY\u001fΞ3oE9|eXzڿ|Mlb]|?pБrO<u曳ߞ\u000f?^Ͽ\\n߹\u000f{gy\u00051\u0019[ɔKL,Yɴ+ȼ+<@^Cdud\rH̿\u0005\u0000DH\u0004I\b:A\u0004D\u00170$I\u001c%\u0010Abb$XdH02%\u001a1M\u0004d.,|$1Y\u000e($*\u0001\u0006V\tNRBObs\u0018pKtNKx\u0003\u000b\u0012 tEBtCbt\u0017\u001eH~0=/HNL.\\}y\f\n\u0017\u0000).doFX^Kh4ff\u0016``i%Q\u0000JفDi\u0007\u0007G:\u0001\u000b\u0014\"\u0002$`\u0002(\u0002,\u0012B`\f\\z\rB`%,%*)6kB^I\u0007\fJ\u00196j\u0013L\u0017,xrEVˆXk\t\u001a8QH\n$Y&y(ꕫ$uҽyܽ{\u000f!y?zߟUQE\u0015UTQE\u0015UTQE\u0015UTQ!\u000f`y\r\u000ebQE\u0015Uonb}SV\\+e:<=co\u0006*\u0015oWgֈ\t\u0011WG&;D&\u001dN8:<͂[ߝ9qtO\t\u001d*Ʈ*Gr~\\13Ǧ̏.\u0018\u0012K?ja`[ᖰ=7%\u0010¶\n\u0013\u000estP\"M8<[^\bR6+;\u001ck\rk\u001dkeU\t\t\u0013lYj9eKsb\"<.RE?<wx\u0001\u0005cce0e;\u0010Q_\u001a/jn+;P|VlLu`]\u000e:\u0015kfp\u0010]\u001dV\u0018\"C]Cb\fwÊ\u001cQr[+ ,|jw:e\u001bUn3c+:\u0014\u0014|a톣<5aUE\"WvMqФ>l)\u0006%dtU\u001b[PY\u000e#WqrF\u0007tGz]\u0015\u0003(9dj_8`]భK\u0016J7HKwsؗ1TT\u001a..\u000f(rۮѵ}\u001c4f>z{ϟࣵLAϻsƌzfzkfL(ք\bC\f~h?\u0011j}CJ3\u0017E\u001a%/c_TVJ\u000e*pT_xE\u001fy\\\u001a\u0007_^Hڨ;Wi\u0012\u0016\u0015\rY\u0007A\"ҭ[l!Iv^يR9$Vd2nqy>=/<y;s+\u0001N\u0001w\t\u0010$\u000bӟmWy0\u0018\\*c<0gלuN@B!\u001a\r+\u001dG[Yu?R\u001c|^\u0014rrH/\u001e坑\u001b,\u0017~$\u001bK]Kn`l=Z5[7q|gUnr\u001b\"~\u0003F8ߛ-cY\u0017\u0011\fđ\\ೖ-\u0005K1Es\u0007\u0000)\u0005`\u000e[<pb !zٔz{t@E^~˷J\u0001e}yU\u0018-#iږykp?0Z/\u0003j,bh\u0017}\u0017Fu\u0019\u0014DR%\u0006H2\u0000\u000b\u001f\u0000v\u0000&\u0000\u0000e\u0001\u0004u\u0001\u0017\tY\u0002N\u0000N\"\u0005{B^{~ݾV\u000b>>zyH]PF\u0012(볫ܤ;\u001fdqFV\tLk\u000e-zPߔJK{wWy~P'C8d,ߴ.\u0005\u001e\f:J\u0010@7\rdzqF\u0005@\u0001`\u000b\u001b\bV\"\u0011\u0011\r\u00006\u001fX\u0003 \u0000#\u0001\u0019#\u0005\f\u001f\b\tZeW\u0000\u001fŔԃN~a~qf\u001au#E\".lй\u001by.?\u001fXϊ\u000b;m\u0004\rHK=`(tu4G!gn\u0004\u0000_\u0005:\u0000^!\u0018B\u0013@\u0000z\u0002hCL\u0000Z8l\u0004$\u0007@\u000e\n+\u0000<je\u00002\u0010<QQSS}?\u00124iǀ(;jv,_X?j_Xr)zXK=AT\u0010h\u001b\u00160B~[)ܦb\u001fUq\u001b OՆ\u000bF\u0004v\u001dS\b@g\b6_8\u000f\u00021\u0000\u000e\b> \f@\fe\u0000\u0010!\u000f\u0000O\u0004\u0000\u0010\u0014Ax\rC8~ⷎNs]=\u0016/I֣3ѡM*{q6l\u000ejK\u0007~!}\u001e9Ym!!_\u0003\u001d7\u0013Hlް(\u0004Qp\u0005pj\u0006`\u0011\u001a\b\u00010G\u0018X\u0004s\u0001,D\u0000`+\u0000\u0018\u001d/x\u0019\u0001\u0010G\u0000F\u001c@\u0000ҚSШ\n\u001fs=\u0004t\u0014#\u0010#U\u001aRuMT\u0006?|zq+[:\u0014s\u000eM\u0016nִ\u0010䂹33o\\P7\u0016\u0001.\u0007B \u0001<L\u0010\f\u00070\n\u0019\u0000w\u0004z\u0000B\u0011F12\n\u0019Ȇ \u0019D\u0004G\u0015r\u000f\f<6\u0003\u0010\u0000X`3\n\u0011\u001483|\u0012\u00016\f~!]{\u000f\u0019=i5$>*OEtO1o,N4GO\\ٞ~pc݌\u001d)G\u0006\u0006R0X\u0003\u001d\u0018\u0002\u001eQAl\u0006(\bf4\u0005\u0007\u0018 M\u0014<A\u0010\u0004oc0\u0002\u000f\u0000n\b\u0001`\u0000\"\u0003\u0010\u00020E\u000f>)h@<\u0003׹\u0017L\u001c\"]NJ\u001fY\u0017s\u000e\u001er,'%hݹv\n\u001f \u001b݆/U\u0011)\u001d|\u001fJn\u000f\u0005\u0019PW\u0014\nx \u0014kFE\u0006Q`0|=\u0011t\u0005[\r1x}\u0010\u0000\u001cf\u0004p\bc\u00103\u0010\u0002\u0007A&\u0000\u0015ŽpJ \u0011\u0001~\f\u00017%1\u001c,۰PRND,^\u000fHU\u0016\u001d0uf\u0013>\u001d7웻ñ]zQZVq6\f\u0004S\r\u0003\u0014d`\u0000\u0005\u00190X\u0015A#GVJ[\u001f\u0006(9\nR\u0011\u001cWvH\u0000o\u0005\u0001^0\u0011x\u00033\u0002\f\u0000bx\u0013\np`\u0014+gQ\u0003(^\u00011ױ\u0010>9ږ騬*^x#q\u0007b ,Y2aHwcVMOb/f=-\u0012ȁ/}\t-\u0005\f`=\u0004瀾\u001a}\u0006k\u0010\u001f)\u0006\n\u00194\u0003\u0014`\u0002\u0005\"\u000bC\u0000!)p3\u0000:\u0000m\u0011\u0000u@X\u0000oQv \u001fngn3\u0001\u001c\u001bw\u001d:s+\u001e*qBV-\u000bM$Nr\u001feO{\u0007}\u0000v R`\r\u000283J\u0016\u0007yM\u0019O4\u0006)X\u0000ZG\u0019\u0013\u0005y\bQj\u0010{\u0004\u0005<ET\u0000I\u001av\\5\u0014Y\u00008F\u0001\u0010a\u0015\u0001\b\u001ej5\u000bX+~6\u0013\u000eyBUXDCj*+j߯\u001dX9qx;aV,;\u001b\u0010`g\\LZ[ \b6\u000bz\u0014xGP\u0010\bk0\fܢ@\u0006\u0005+\u00188MA\\\u0013\u0004\u0014Z T\u000f\u0016\bg\u0002P\u0000⚖\u0014\u0018 (U \u0010Ͼ?4\r\u0006;Ic@\u0010S\u0005\u0015l|QgVe\u0017\u0013OH\\GIs}-:\u001b\u0019l޸-\u0012P\r4T/\u000e數H\b\u000e1e\u001d\u0019N\u00171@\n\u0019\u001b^\u0006Sp\u0018\u0015|v\b:Q  h\t Z\u0007\u00051\nVK\u0001Ș\u00001>DM\r{_π\u0018Y\u000b̸Ӻ|)weUefᨈ.A]]\u0014dciI~\\w\u0013<\u001c8\u0010/\u0003t\fP\u0006\u0005g+\u0000e\r>*7E`S#\u0005 \f\u0001\u00153\u0010\\G\u0001H\u0002p\u0005χH\u0000n\raKS[\u0014\u0004K\r5uk;mɶc\u0018Vރ\tiE\u000fHD_+߾U\\'9GVXJ¬\u0002\u00179M<~̨\u0007փ\u0000I+q\u0004\u0010\bĳ\u0016L9%\u0019A\u001f\u001d\u0003\u00140pcF\b\"((\u0018`\u0005\u00057\u00027\u0000Q\u0001\u0003#'\u0000q h[:-H,n#\b*Z_YXO\n=Vy!p\u0017\u001eLYzY*K;x2}{\"w7e\u001fr\u001c\"Iw:\u000e\u0017GS\u001cy\\V[<6'Rչ\u001e\u0016n\u0018%:溬'5mDtbZ\u0018L\\&$\nܾ~v\u000fן{}߻<%E\b&gIN\u001d\u001b\u0016\u0006DHJ\u001c\"NƄdD]\tQ!c\u0002@\n\u0011d\t*>7\r\u00158P\u0007W%\u001c\u0003\r \\ h`3\u0006^l:93\u001cc<xWo67!\u0010ʺ\b[ЈZI\u00104z{z?cvTgC\t|ޮX.qDh\u000f\\1yX\u0011\u0003C>M|;\u0000egA :܂\u00178X\u0010J[\u0010\u001a7X\u0010I\u0013|0|N7\u001ew[{Ekv\bcJȬi%J-Q#u|FBѵ<~ԠVTw\u001f<kFK};#9\u0011a\u001bX!ЭѨP5w8Gĥeb\u00125\u0012@\u0016\u0015\nݡP\n`(dB\u001eG $8\u0010\u0002&{j?\u0011S\u000f\u001ep䴥\u0019W5z\u001bNK\u00036\u001dVi\u001f|Q\u0015\u0015Ah\u0004\u000b4ݪ(d\u0017*isZdD(k}P`\u0000͏Gg墂t5RLTc\u0007+ʻ#\f\u000e!\u0007\u0004\u0007 \f1Me\u001f\u0004+ƅ\u001ex\u0005oBj0ǻ8OUN\u0016\u0015\u0016☤\"ţ>\u0012|_JvV{J,͓\u0014ɯ)l/`\rR|Vxfm\u000b96p\u0003L1c3Y0ߜ,\u0014/\u000eNP[@Qt+eKTe9ۏ-p\n\u001cȮ|Bp\u0013W\u0005\u001f$\r%\u000eIHO޿y:~0?_(\u0011gD,rE}K\u0007\u0010\u001ccШ+)\u0014J_*=I,?!\u001e4\u001el=Å[Pծ=\u0004Ğ\t[\u0001\u0011 }g\fOZ\u0018O$o!xL=5dbBC\u0007)\t\tOմ>RIr\\r\"#;@V2[kc\u0005l\u000fzi5a\u0001#*Xm?;62.#\u000f:ĉ\u0012\u0005֙Li\u0007\u0017\u0006\u001f_\u0005\u0018\u00008L+\r\nendstream\rendobj\r243 0 obj\r<</LastModified(D:20171220162736-07'00')/Private 252 0 R>>\rendobj\r252 0 obj\r<</AIMetaData 253 0 R/AIPrivateData1 254 0 R/AIPrivateData10 255 0 R/AIPrivateData11 256 0 R/AIPrivateData2 257 0 R/AIPrivateData3 258 0 R/AIPrivateData4 259 0 R/AIPrivateData5 260 0 R/AIPrivateData6 261 0 R/AIPrivateData7 262 0 R/AIPrivateData8 263 0 R/AIPrivateData9 264 0 R/ContainerVersion 11/CreatorVersion 15/NumBlock 11/RoundtripStreamType 1/RoundtripVersion 15>>\rendobj\r253 0 obj\r<</Length 1002>>stream\r\n%!PS-Adobe-3.0 \r\n%%Creator: Adobe Illustrator(R) 15.0\r\n%%AI8_CreatorVersion: 15.0.0\r\n%%For: (someone) ()\r\n%%Title: (seedsync.ai)\r\n%%CreationDate: 12/20/2017 4:27 PM\r\n%%Canvassize: 16383\r\n%%BoundingBox: 47 -442 457 -61\r\n%%HiResBoundingBox: 47.9487 -442 456.2666 -61.7456\r\n%%DocumentProcessColors: Cyan Magenta Yellow Black\r\n%AI5_FileFormat 11.0\r\n%AI12_BuildNumber: 399\r\n%AI3_ColorUsage: Color\r\n%AI7_ImageSettings: 0\r\n%%CMYKProcessColor: 1 1 1 1 ([Registration])\r\n%AI3_Cropmarks: 0 -500 500 0\r\n%AI3_TemplateBox: 250.5 -250.5 250.5 -250.5\r\n%AI3_TileBox: -46.6401 -636.6396 546.6396 136.6401\r\n%AI3_DocumentPreview: None\r\n%AI5_ArtSize: 14400 14400\r\n%AI5_RulerUnits: 6\r\n%AI9_ColorModel: 2\r\n%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r\n%AI5_TargetResolution: 800\r\n%AI5_NumLayers: 1\r\n%AI9_OpenToView: -1359 825 0.5 1747 982 18 0 0 73 117 1 1 0 1 1 0 1 1 0 1\r\n%AI5_OpenViewLayers: 7\r\n%%PageOrigin:-56 -646\r\n%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9\r\n%AI9_Flatten: 1\r\n%AI12_CMSettings: 00.MS\r\n%%EndComments\r\n\r\nendstream\rendobj\r254 0 obj\r<</Length 24745>>stream\r\n%%BoundingBox: 47 -442 457 -61\r\n%%HiResBoundingBox: 47.9487 -442 456.2666 -61.7456\r\n%AI7_Thumbnail: 128 120 8\r\n%%BeginData: 24593 Hex Bytes\r\n%0000330000660000990000CC0033000033330033660033990033CC0033FF\r\n%0066000066330066660066990066CC0066FF009900009933009966009999\r\n%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66\r\n%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333\r\n%3333663333993333CC3333FF3366003366333366663366993366CC3366FF\r\n%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99\r\n%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033\r\n%6600666600996600CC6600FF6633006633336633666633996633CC6633FF\r\n%6666006666336666666666996666CC6666FF669900669933669966669999\r\n%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33\r\n%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF\r\n%9933009933339933669933999933CC9933FF996600996633996666996699\r\n%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33\r\n%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF\r\n%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399\r\n%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933\r\n%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF\r\n%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC\r\n%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699\r\n%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33\r\n%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100\r\n%000011111111220000002200000022222222440000004400000044444444\r\n%550000005500000055555555770000007700000077777777880000008800\r\n%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB\r\n%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF\r\n%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF\r\n%524C45FD4BFFA8AE83847D83595958592E582E582D342D342D342D340B0B\r\n%0B340B0B0B340B0B0B340B0B0B342D342D340B0B0B340B0B0B340B0B58FD\r\n%44FF838358582D34FD060B05FD2D0B58FD40FF837D5234FD370B0C0B0B58\r\n%FD3CFFA883582E0B0B050B05FD390B58FD3AFFA87D2E340B0B0B2E0B0B0B\r\n%340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B\r\n%0B0B2E0B0B0B2E0B0B0B2E0B0B0B2E0B0B0B340B0B0B34FD040B58FD38FF\r\n%A87D2DFD1F0B05FD230B58FD37FF832EFD140B2D0B0B0B0C0B0B0B120B34\r\n%0B3411340B34343411343434113434341234343412343434123434341234\r\n%1234FD060B2EFD36FF582EFD0E0B05FD060B110B341134123A123A123A34\r\n%3A123A343A343A343A123A343A123A343A123A343A123A343A123A343A12\r\n%3B12FD050B05A8FD33FFA87DFD050B340B0B0B340B0B0B2E0B0B0B340B34\r\n%123A343B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B\r\n%3A3B343B3A3B343B3A3B343B3A3B343B3A340B340B0B0B34FD33FF58FD10\r\n%0B341134123B343A343B343A123A343A123A343A123A343A123A343A123A\r\n%343A123A343A123A343A123A343A123A343A123A343A123BFD060B2EFD31\r\n%FF83FD0B0B2D0B0B0B34343B343B343B343B343B343B343B343B343B343B\r\n%343B343B343B343B3A5F345F343A343B343B343B343B343B343B343B343B\r\n%343B343B3412FD050B7DFD2FFF7D2D05FD0C0B34123A343A343A123A123A\r\n%123A123A123A123A123A123A123A123A123A123A59835F83595F343A123A\r\n%123A123A123A123A123A123A123A123A343AFD060B7DFD2EFF580B0B340B\r\n%0B0B340B0B0B2D0B34343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B34\r\n%3B3A3B343B3A3B343B343B5F8483845F8483845F3B343B343B3A3B343B3A\r\n%3B343B3A3B343B3A3B34340B0B0B2E0BA8FD2CFF83FD0D0B3A343A123A34\r\n%3A123A343A123A343A123A343A123A343A123A343A123A343A123A5F835F\r\n%835F835F835F835F3B123A123A343A123A343A123A343A123A3434FD060B\r\n%A8FD2AFFA858FD0B0B34343B343B343B343B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343A34845F835F845F835F845F845F5F343B\r\n%343B343B343B343B343B343B343B34FD060BAEFD29FF7D0B05FD070B050B\r\n%0B34343A123A123A123A123A123A123A123A123A123A123A123A123A123A\r\n%123A123A123A125F5F835F8359835F8359835F835F5F123A123A123A123A\r\n%123A123A123A1234FD060BA8FD28FF580B0B340B0B0B340B0B0B34343B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A\r\n%3B343B3A3B5F845F845F845F845F845F845F84835F343B3A3B343B3A3B34\r\n%3B3A3B343B340B0B340B0B0BFD28FF2DFD0A0B34343B343A123A343A123A\r\n%343A123A343A123A343A123A343A123A343A123A343A123A343A123A3483\r\n%5F835F835F835F835F835F835F835F5F123A343A123A343A123A343A3434\r\n%FD060BA8FD25FFA8FD0B0B3B343B343B343B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B125F83835F845F835F84\r\n%5F835F845F835F84835F123B343B343B343B343B343B120CFD050BAEFD24\r\n%FF83FD080B050B123A123A123A123A123A123A123A123A123A123A123A12\r\n%3A123A123A123A123A123A123A123A123A123A59835F8359835F8359835F\r\n%8359835F8359835F5F123A123A123A123A123A3434FD060BA8FD23FF7DFD\r\n%050B340B0B0B343A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B348483845F845F845F845F\r\n%845F845F845F845F845F5F3A3B343B3A3B343B3A3B34340B0B0B2E0BAEFD\r\n%22FF58FD090B34343B343A123A343A123A343A123A343A123A343A123A34\r\n%3A123A123A123A343A123A343A123A343A123A123A5F835F835F835F835F\r\n%835F835F835F835F835F833434343A123A343A123A3434FD060B83FD21FF\r\n%58FD090B3A343B343B343B343B343B343B343B343B343B343B343B343B34\r\n%3B345F3A3A123B343B343B343B343B343B343B3A845F845F835F845F835F\r\n%845F835F845F835F8434120B3A343B343B343B343B34FD060BA8FD1FFFA8\r\n%5805FD080B3A123A123A123A123A123A123A123A123A123A123A123A123A\r\n%345F5F835983593B123A123A123A123A123A123A125F5F8359835F835983\r\n%5F8359835F8359835F8333110B110B34343A123A123A123AFD060B7DFD1E\r\n%FFAE580B0B0B340B0B0B2E123B343B3A3B343B3A3B343B3A3B343B3A3B34\r\n%3B3A3B343B345F5F8483845F8483845F5F3A3B343B3A3B343B3A3B343B5F\r\n%845F845F845F845F845F845F845F848384343411340B340B3A343B3A3B34\r\n%3B34120B340B0B0B83FD1DFFA82E05FD080B3B343A123A343A123A343A12\r\n%3A343A123A343A123A343A125F5F835F835F835F835F835F83343A123A34\r\n%3A123A343A125F5F835F835F835F835F835F835F835F8434110B120B110B\r\n%120B34343A343A123AFD060B58FD1CFFA834FD080B343B343B343B343B34\r\n%3B343B343B343B343B343B343B343B343B5F845F835F845F835F845F835F\r\n%843A3A343B343B343B343A5F845F835F845F835F845F835F84838434340B\r\n%120B340B120B340B34343B343B3434FD050B7DFD1CFF2E05FD070B113A12\r\n%3A123A123A123A123A123A123A123A123A123A123A123A348359835F8359\r\n%835F8359835F835F83343A123A123A123A125F5F835F8359835F8359835F\r\n%835F8334110B110B110B110B110B110B34123A123AFD060B58FD1BFF580B\r\n%340B0B0B340B0C343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A\r\n%3B343B345F5F845F845F845F845F845F845F848384343B3A3B343B3A3B5F\r\n%845F845F845F845F845F845F8434340B3411340B3411340B3411340B3B3A\r\n%3B34340B0B0B340B58FD1AFF58FD080B123A123A343A123A343A123A343A\r\n%123A343A123A343A123A343A123B5F835F835F835F835F835F835F835F83\r\n%5F83343A343A123A345F5F835F835F835F835F835F8333110B110B120B11\r\n%0B120B110B120B110B3A343AFD060B2EFD19FF7DFD070B0C343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B343A34845F835F845F83\r\n%5F845F835F845F835F848383343B343B343B5F845F845F835F845F835F84\r\n%34120B340B120B340B120B340B120B340B12113B3434FD050B58FD18FFA8\r\n%FD060B050B123A123A123A123A123A123A123A123A123A123A123A123A12\r\n%3A123A125F5F835F8359835F8359835F8359835F8359835F5F343A123A34\r\n%835F8359835F8359835F8333110B110B110B110B110B110B110B110B110B\r\n%11123B11FD050B2DFD18FF0B0B0B340B0B0B34343B343B3A3B343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B5F845F845F845F845F845F\r\n%845F845F845F845F845F843A3B345F5F845F845F845F848384343411340B\r\n%3411340B3411340B3411340B3411340B343A340B2E0B0B0B34FD17FF2EFD\r\n%070B123B343A123A343A123A343A123A343A123A343A123A343A123A343A\r\n%123A345F5F835F835F835F835F835F835F835F835F835F835F5F343A3483\r\n%5F835F835F835F8434110B120B110B120B110B120B110B120B110B120B11\r\n%0B3B12FD060BFD16FF7DFD060B2D343B343B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B5F845F845F835F845F835F845F83\r\n%5F845F835F845F835F5F343B5F845F835F84838434340B120B340B120B34\r\n%0B120B340B120B340B120B340B12343AFD060BA8FD14FFA82DFD070B3A12\r\n%3A123A123A123A123A123A123A123A123A123A123A123A123A123A123A34\r\n%835F8359835F8359835F8359835F8359835F8359835F835F5F348359835F\r\n%835F8334110B110B110B110B110B110B110B110B110B110B110B110B3A12\r\n%FD060BA8FD14FF7D0B0B0B340B0B0B3B3A3B343B3A3B343B3A3B343B3A3B\r\n%343B3A3B343B3A3B343B3A3B343B3A3B345F83845F845F845F845F845F84\r\n%5F845F845F845F845F845F845F5F5F845F845F8434340B3411340B341134\r\n%0B3411340B3411340B3411340B340B34343B0B0B0B340B0B83FD13FFA8FD\r\n%070B34343A343A123A343A123A343A123A343A123A343A123A343A123A34\r\n%3A123A343A34835F835F835F835F835F835F835F835F835F835F835F835F\r\n%835F835F835F8333110B110B120B110B120B110B120B110B120B110B120B\r\n%110B12123A12FD060BA8FD13FF58FD060B34343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B345F5F845F835F845F83\r\n%5F845F835F845F835F845F835F845F835F845F835F8434120B340B120B34\r\n%0B120B340B120B340B120B340B120B340B12123B343AFD060B83FD12FF83\r\n%FD070B123A123A123A123A123A123A123A123A123A123A123A123A123A12\r\n%3A123A123A123A348359835F8359835F8359835F8359835F8359835F8359\r\n%835F8359835F8333110B110B110B110B110B110B110B110B110B110B110B\r\n%110B34123A123A340B050B0B0B0583FD12FF580B0B0B340B0B123B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B34\r\n%5F83845F845F845F845F845F845F845F845F845F845F845F845F84838434\r\n%3411340B3411340B3411340B3411340B340B340B341134343B3A3B343B3A\r\n%3B0B2EFD040B7DFD11FFA8FD070B3A123A343A123A343A123A343A123A34\r\n%3A123A343A123A343A123A343A123A343A123A5F835F835F835F835F835F\r\n%835F835F835F835F835F835F835F835F8434110B120B110B120B110B110B\r\n%110B120B110B341134123A343A123A343A123B34FD050B057DFD11FF58FD\r\n%060B34343B343B343B343B343B343B343B343B343B343B343B343B343B34\r\n%3B343B343B343B345F83835F845F835F845F835F845F835F845F835F845F\r\n%835F84838434340B120B3412341134123411FD04343B343B343B343B343B\r\n%343B343B343B343BFD060B58FD10FFA82DFD060B123A123A123A123A123A\r\n%123A123A123A123A123A123A123A123A123A123A123A123A343A58835F83\r\n%59835F8359835F8359835F8359835F8359835F835F8334110B110B110B3A\r\n%343A123A343A123A343A123A343A123A123A123A123A123A123A1212FD04\r\n%0B057DFD10FFA80B0B0B340B0B123B3A3B343B3A3B343B3A3B343B343B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B348383845F845F845F845F\r\n%845F845F845F845F845F845F845F8434340B3411340B34113A343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B0B0B0B340B0B58FD10\r\n%FF2EFD060B3A123A343A123A343A123A345F345F343A123A343A123A343A\r\n%123A343A123A343A123A343A59845F835F835F835F835F835F835F835F83\r\n%5F835F835F8333110B110B120B110B120B34343B343A123A343A123A343A\r\n%123A343A123A343A123A343A1212FD050B7DFD0FFFA8FD060B34343B343B\r\n%343B343B343B5F8483845F845F5F343B343B343B343B343B343B343B343B\r\n%343B345F5F845F835F845F835F845F835F845F835F845F835F8434120B34\r\n%0B120B340B120B340B34343B343B343B343B343B343B343B343B343B343B\r\n%343B343B0B2DFD040B58FD0FFF83FD060B113A123A123A123A123A5F8359\r\n%835F8359835F83595F123A123A123A123A123A123A123A123A598359835F\r\n%8359835F8359835F8359835F8359835F8333110B110B110B110B110B110B\r\n%110B12123A123A123A123A123A123A123A123A123A123A123A340B050B0B\r\n%0B057DFD0FFF580B0B340B0B0B3B3A3B343B3A3B343B5F845F845F845F84\r\n%5F845F848383343B343B343B3A3B343B3A3B343B3A835F845F845F845F84\r\n%5F845F845F845F845F848384343411340B3411340B3411340B3411340B34\r\n%343B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B0B2EFD040B59FD0E\r\n%FFA82DFD050B12343A343A123A343A34845F835F835F835F835F835F835F\r\n%83583B123A123A343A123A343A123A5F835F835F835F835F835F835F835F\r\n%835F835F8434110B120B110B120B110B120B110B120B110B34343A123A34\r\n%3A123A343A123A343A123A343A123B34FD050B057DFD0EFFA8FD050B2D34\r\n%3B343B343B343B3A835F845F835F845F835F845F835F845F845F5F343B34\r\n%3B343B343B343B348383835F845F835F845F835F845F835F84838434340B\r\n%120B340B120B340B120B340B120B340B120B34343B343B343B343B343B34\r\n%3B343B343B343B343BFD060B58FD0EFF58FD060B3A343A123A123A125F5F\r\n%8359835F8359835F8359835F8359835F835F5F123A123A123A123A123A59\r\n%835F8359835F8359835F8359835F835F8334110B110B110B110B110B110B\r\n%110B110B110B110B110B12123A123A123A123A123A123A123A123A123A12\r\n%12FD040B057DFD0EFF580B340B0B0B343A3B343B3A3B345F5F845F845F84\r\n%5F845F845F845F845F845F845F848383343B3A3B343B3A3B348383845F84\r\n%5F845F845F845F845F845F8434340B3411340B3411340B3411340B341134\r\n%0B3411340B340B34343B3A3B343B3A3B343B3A3B343B3A3B343B0B0B0B34\r\n%0B0B7DFD0EFFFD070B3B343A123A343A34845F835F835F835F835F835F83\r\n%5F835F835F835F835F83343A343A123A343A58845F835F835F835F835F83\r\n%5F835F8333110B110B120B110B120B110B120B110B120B110B120B110B12\r\n%0B12123B343A123A343A123A343A123A343A12FD060B83FD0DFFA82EFD05\r\n%0B34343B343B343B34835F845F835F845F835F845F835F845F835F845F83\r\n%5F848384343B343B343B345F5F845F835F845F835F845F835F8434120B34\r\n%0B120B340B120B340B120B340B120B340B120B340B120B340B34343B343B\r\n%343B343B343B343B343B343AFD060B7DFD0DFF8305FD050B123A123A123A\r\n%123B5F8359835F8359835F8359835F8359835F8359835F8359835F83343A\r\n%123A123A598359835F8359835F8359835F8333110B110B110B110B110B11\r\n%0B110B110B110B110B110B110B110B110B110B34123A123A123A123A123A\r\n%123A123A12FD050B05A8FD0DFF58FD040B2E0B3B343B3A3B343B5F845F84\r\n%5F845F845F845F845F845F845F845F845F845F845F845F845F3B343B345F\r\n%83845F845F845F845F848384343411340B3411340B3411340B3411340B34\r\n%11340B3411340B3411340B3411340B3B3A3B343B3A3B343B3A3B343B3A3A\r\n%0B2E0B0B0B34A8FD0DFF5805FD040B12343A123A343A125F5F835F835F83\r\n%5F835F835F835F835F835F835F835F835F835F835F845F3A123A58835F83\r\n%5F835F835F835F8434110B120B110B120B110B120B110B120B110B120B11\r\n%0B120B110B120B110B120B11113B343A123A343A123A343A123B12FD060B\r\n%FD0EFF2EFD060B3B343B343B343A5F845F835F845F835F845F835F845F83\r\n%5F845F835F845F835F845F835F845F3B125F83835F845F835F8483843434\r\n%0B120B340B120B340B120B340B120B340B120B340B120B340B120B340B12\r\n%0B340B34343B343B343B343B343B343B3434FD050B2EFD0DFFA82EFD050B\r\n%34343A123A123A345F5F835F8359835F8359835F8359835F8359835F8359\r\n%835F8359835F835983593A34835F8359835F835F8334110B110B110B110B\r\n%110B110B110B110B110B110B110B110B110B110B110B110B110B110B3A12\r\n%3A123A123A123A123A123AFD060B2DFD0EFF0B0B0B340B0B123B3A3B343B\r\n%3A3B5F845F845F845F845F845F845F845F845F845F845F845F845F845F84\r\n%5F845F845F5F83845F845F845F8434340B3411340B3411340B3411340B34\r\n%11340B3411340B3411340B3411340B3411340B340B34343B3A3B343B3A3B\r\n%343B3A3B34340B0B0B340B58FD0DFFA8FD060B34343A343A123A34835F83\r\n%5F835F835F835F835F835F835F835F835F835F835F835F835F835F835F83\r\n%5F835F835F835F8333110B110B120B110B120B110B120B110B120B110B12\r\n%0B110B120B110B120B110B120B110B12113A123A343A123A343A123A343A\r\n%FD060B58FD0DFFA8FD050B0C343B343B343B345F5F845F845F835F845F83\r\n%5F845F835F845F835F845F835F845F835F845F835F845F845F845F835F84\r\n%34120B340B120B340B120B340B120B340B120B340B120B340B120B340B12\r\n%0B340B120B340B120B3A343B343B343B343B343B343B34FD060B83FD0DFF\r\n%7DFD060B3A343A123A123A34835F8359835F8359835F8359835F8359835F\r\n%8359835F8359835F8359835F8359835F8359835F8333110B110B110B110B\r\n%110B110B110B110B110B110B110B110B110B110B110B110B110B110B110B\r\n%11123A123A123A123A123A123A1234FD060B7DFD0DFF830B2E0B0B0B1234\r\n%3B343B3A3B345F83845F845F845F845F845F845F845F845F845F845F845F\r\n%845F845F845F845F845F845F848384343411340B3411340B3411340B3411\r\n%340B3411340B3411340B3411340B3411340B3411340B341134343B3A3B34\r\n%3B3A3B343B3A3B343B340B0B340B0B0BFD0EFF59FD060B3A343A123A343A\r\n%34845F835F835F835F835F835F835F835F835F835F835F835F835F835F83\r\n%5F835F835F835F8333110B120B110B120B110B120B110B120B110B120B11\r\n%0B120B110B120B110B120B110B120B110B12113A123A343A123A343A123A\r\n%343A3434FD050B2EFD0EFF7DFD050B12343B343B343B345F5F845F835F84\r\n%5F835F845F835F845F835F845F835F845F835F845F835F845F835F848384\r\n%33340B120B340B120B340B120B340B120B340B120B340B120B340B120B34\r\n%0B120B340B120B340B34343B343B343B343B343B343B343B343B0B2DFD04\r\n%0B58FD0EFF58FD060B3A123A123A123A348359835F8359835F8359835F83\r\n%59835F8359835F8359835F8359835F8359835F835F8333110B110B110B11\r\n%0B110B110B110B110B110B110B110B110B110B110B110B110B110B110B11\r\n%0B34343A123A123A123A123A123A123A123A12FD050B057DFD0EFF7D0B0B\r\n%0B340B34343B3A3B343B345F5F845F845F845F845F845F845F845F845F84\r\n%5F845F845F845F845F845F845F845F8434340B3411340B3411340B340B34\r\n%0B340B340B340B340B340B340B340B340B3411341134343A343B3A3B343B\r\n%3A3B343B3A3B343B3A3B343B3A340B2E0B0B0B2EA8FD0EFF52FD060B3A12\r\n%3A343A123A5F835F835F835F835F835F835F835F835F835F835F835F835F\r\n%835F835F835F835F832D110B110B120B110B121134123412341134113411\r\n%3411341134113411341234123A343A343B343A123A343A123A343A123A34\r\n%3A123A343A123BFD070BFD0FFF58FD050B34343B343B343B345F83835F84\r\n%5F835F845F835F845F835F845F835F845F835F845F835F845F835F843412\r\n%0B340B120B340B120B34343B343B343B343B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B343B343B343B3412FD05\r\n%0B58FD0FFF52FD060B3A123A123A123A58835F8359835F8359835F835983\r\n%5F8359835F8359835F8359835F8359835F830B110B110B110B110B110B11\r\n%0B110B34123A123A123A123A123A123A123A123A123A123A123A123A123A\r\n%123A123A123A123A123A123A123A123A343405FD050B7DFD0FFF590B340B\r\n%0B0B343A3B343B3A3B345F83845F845F845F845F845F845F845F845F845F\r\n%845F845F845F845F848384343411340B3411340B3411340B3411340B3B3A\r\n%3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B0B2D0B0B0B2E0BFD10FF58FD060B3B343A123A\r\n%343A58845F835F835F835F835F835F835F835F835F835F835F835F835F83\r\n%5F8333110B120B110B120B110B120B110B120B110B34343A123A343A123A\r\n%343A123A343A123A343A123A343A123A343A123A343A123A343A123A343A\r\n%123B34FD050B0558FD10FF59FD050B34343B343B343B345F5F845F835F84\r\n%5F835F845F835F845F835F845F835F845F835F84838433340B120B340B12\r\n%0B340B120B340B120B340B120B34343B343B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B343B3434FD060B7DFD10\r\n%FF52FD060B3A123A123A123A598359835F8359835F8359835F8359835F83\r\n%59835F8359835F835F8333110B110B110B110B110B110B110B110B110B11\r\n%0B110B34343A123A123A123A123A123A123A123A123A123A123A123A123A\r\n%123A123A123A123A123A343AFD070BFD11FF830B0B0B340B12343B3A3B34\r\n%3B345F5F845F845F845F845F845F845F845F845F845F845F845F845F8434\r\n%340B3411340B3411340B3411340B3411340B3411340B340B34343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A\r\n%3B122E0B0B0B340B7DFD11FF58FD060B3A123A343A123A5F835F835F835F\r\n%835F835F835F835F835F835F835F835F835F832D110B110B120B110B120B\r\n%110B120B110B120B110B120B110B120B34343B343A123A343A123A343A12\r\n%3A343A123A343A123A343A123A343A123A343A123B34FD070BA8FD11FF7D\r\n%FD050B34343B343B343B345F83835F845F835F845F835F845F835F845F83\r\n%5F845F835F8434120B340B120B340B120B340B120B340B120B340B120B34\r\n%0B120B340B34343B343B343B343B343B343B343B343B343B343B343B343B\r\n%343B343B343B343B3434FD060B52FD12FF58FD060B3A343A123A343A5883\r\n%5F8359835F8359835F8359835F8359835F8359835F830B110B110B110B11\r\n%0B110B110B110B110B110B110B110B110B110B110B110B34123A123A123A\r\n%123A123A123A123A123A123A123A123A123A123A123A123A343AFD070BA8\r\n%FD12FF830B2E0B0B0B12343B343B3A3B345F83845F845F845F845F845F84\r\n%5F845F845F845F848384343411340B3411340B3411340B3411340B341134\r\n%0B3411340B3411340B3411340B3A3A3B343B3A3B343B3A3B343B3A3B343B\r\n%3A3B343B3A3B343B3A3B343B3A3B112D0B0B0B340B58FD13FF7DFD060B3A\r\n%343A123A343A34845F835F835F835F835F835F835F835F835F835F833311\r\n%0B120B110B120B110B120B110B120B110B120B110B120B110B120B110B12\r\n%0B110B3A343A123A343A123A343A123A343A123A343A123A343A123A343A\r\n%123B12FD070BA8FD13FFA8FD060B343B343B343B345F5F845F835F845F83\r\n%5F845F835F845F835F84838433340B120B340B120B340B120B340B120B34\r\n%0B120B340B120B340B120B340B120B340B12113B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B3412FD060B58FD14FF7DFD060B34\r\n%123A123A123A348359835F8359835F8359835F8359835F835F8333110B11\r\n%0B110B110B110B110B110B110B110B110B110B110B110B110B110B110B11\r\n%0B110B11113A123A123A123A123A123A123A123A123A123A123A123A123A\r\n%341205FD060BAEFD14FFAE0B0B0B340B0B343B3A3B343B345F5F845F845F\r\n%845F845F845F845F845F845F8434340B3411340B3411340B3411340B3411\r\n%340B3411340B3411340B3411340B3411340B3411340B34343B343B3A3B34\r\n%3B3A3B343B3A3B343B3A3B343B3A3B343B3A340B2E0B0B0B2E0B83FD15FF\r\n%A8FD060B34343A343A123A34835F835F835F835F835F835F835F835F832D\r\n%110B110B120B110B120B110B120B110B120B110B120B110B120B110B120B\r\n%110B120B110B120B110B34343A123A343A123A343A123A343A123A343A12\r\n%3A343A343AFD060B0558FD17FFFD060B343B343B343B125F83835F845F83\r\n%5F845F835F845F835F8434120B340B120B340B120B340B120B340B120B34\r\n%0B120B340B120B340B120B340B120B340B120B340B120B3A343B343B343B\r\n%343B343B343B343B343B343B343B343A0B2D0B0B0B0C0B0BA8FD16FFA82D\r\n%050B0B0B0534343A123A123A34835F8359835F8359835F8359835F830B11\r\n%0B110B110B110B110B110B110B110B110B110B110B110B110B110B110B11\r\n%0B110B110B110B110B110B11113A123A123A123A123A123A123A123A123A\r\n%123A123AFD080B7DFD18FF2DFD040B2E343B343B3A3B345F83845F845F84\r\n%5F845F845F848384343411340B3411340B3411340B3411340B3411340B34\r\n%11340B3411340B3411340B3411340B3411340B3411340B343A3B343B3A3B\r\n%343B3A3B343B3A3B343B3A3B343B0B0B0B34FD040B58FD19FF34FD040B05\r\n%34343A123A343A34835F835F835F835F835F835F8333110B120B110B120B\r\n%110B120B110B120B110B120B110B120B110B120B110B120B110B120B110B\r\n%120B110B120B110B3A343A123A343A123A343A123A343A123A343AFD080B\r\n%2DFD1AFF58FD060B3B343B343B345F5F845F835F845F835F84838433340B\r\n%120B340B120B340B120B340B120B340B120B340B120B340B120B340B120B\r\n%340B120B340B120B340B120B340B12343B343B343B343B343B343B343B34\r\n%3B343BFD080B2DFD1BFF58FD050B12123A123A123A348359835F8359835F\r\n%835F8333110B110B110B110B110B110B110B110B110B110B110B110B110B\r\n%110B110B110B110B110B110B110B110B110B110B110B3A123A123A123A12\r\n%3A123A123A123A3434FD090BFD1CFF580B0B340B0B0B3B3A3B343B343B5F\r\n%845F845F845F845F8434340B3411340B3411340B3411340B3411340B3411\r\n%340B3411340B3411340B3411340B3411340B3411340B3411340B340B3434\r\n%3B3A3B343B3A3B343B3A3B343B3A3A0B2E0B0B0B340B0B0BFD1DFF7DFD06\r\n%0B123B343A123A34835F835F835F835F832D110B110B120B110B120B110B\r\n%120B110B120B110B120B110B120B110B120B110B120B110B120B110B120B\r\n%110B120B110B12123A123A343A123A343A123A343A3434FD090BA8FD1DFF\r\n%58FD040B2D0B3B343B343B343B5F845F845F835F8434120B340B120B340B\r\n%120B340B120B340B120B340B120B340B120B340B120B340B120B340B120B\r\n%340B120B340B120B340B120B3B343B343B343B343B343B343B34340B2DFD\r\n%070BAEFD1EFF7D050B0B0B050B343A123A123A125F5F8359835F830B110B\r\n%110B110B110B110B110B110B110B110B110B110B110B110B110B110B110B\r\n%110B110B110B110B110B110B110B110B110B34123A123A123A123A123A12\r\n%3A1234FD080B2DAEFD1FFF7DFD040B2E0B3B343B3A3B343B5F845F848384\r\n%343411340B3411340B3411340B3411340B3411340B3411340B3411340B34\r\n%11340B3411340B3411340B3411340B3411340B340B34343B3A3B343B3A3B\r\n%343B3A3B34340B0B0B34FD040B2DFD21FFA8FD060B343A123A343A125F5F\r\n%835F8333110B120B110B120B110B120B110B120B110B120B110B120B110B\r\n%120B110B120B110B120B110B120B110B120B110B120B110B3A343A123A34\r\n%3A123A343A123B120B05FD070B2DFD22FF83FD060B3B343B343B343A5F84\r\n%838433340B120B340B120B340B120B340B120B340B120B340B120B340B12\r\n%0B340B120B340B120B340B120B340B120B340B120B34343B343B343B343B\r\n%343B343B343B11FD090B58FD23FFA8FD060B123A123A123A125F5F833311\r\n%0B110B110B110B110B110B110B110B110B110B110B110B110B110B110B11\r\n%0B110B110B110B110B110B120B121134123A123A343A123A123A123A123A\r\n%343A0B0B05FD070B58FD24FFA80B0B340B0B0B3A3A3B343B3A3B5F843434\r\n%0B3411340B340B340B340B340B340B340B340B340B340B340B3411340B34\r\n%1134113411341134343A343B343B343B3A3B343B3A3B343B3A3B343B3A3B\r\n%34340B0B0B340B0B0B340B0B7DFD25FFA8FD060B123B343A123A125F3312\r\n%0B110B120B120B340B120B3411120B341134113411341134123412341234\r\n%123A343A123B343A343B343A123B343A123A343A123A343A123A343A123B\r\n%3411FD080B052EA8FD26FFA82EFD050B3A343B343B343B343A343B343A34\r\n%3B343B343B343B343B343B343B343B343B343B343B343B343B343B343B34\r\n%3B343B343B343B343B343B343B343B343B343B343B343B343B110CFD090B\r\n%58AEFD27FFA8FD060B123A123A123A123A343A123A343A123A343A123A34\r\n%3A123A123A123A123A123A123A123A123A123A123A123A123A123A123A12\r\n%3A123A123A123A123A123A123A123A12340B0B05FD070B057DFD29FFA834\r\n%0B0B0B2E0B3A343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B\r\n%343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B\r\n%3A3B343B3A3B343B3A3B34340B0B0B340B0B0B340B0B2DAEFD2AFFA8FD06\r\n%0B343A123A343A123A343A123A343A123A343A123A343A123A343A123A34\r\n%3A123A343A123A343A123A343A123A343A123A343A123A343A123A343A12\r\n%3A343A1234FD0C0B58FD2CFF83FD060B3B343B343B343B343B343B343B34\r\n%3B343B343B343B343B343B343B343B343B343B343B343B343B343B343B34\r\n%3B343B343B343B343B343B343B343B343B12120B2DFD090B3483FD2DFF83\r\n%FD060B123A123A123A123A123A123A123A123A123A123A123A123A123A12\r\n%3A123A123A123A123A123A123A123A123A123A123A123A123A123A343A34\r\n%3A1211FD0D0B7DFD2FFF580B0B340B0B0B3B3A3B343B3A3B343B3A3B343B\r\n%3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B343B3A3B\r\n%343B3A3B343B3A3B343B3A3B34340B0B0B2E0B0B0B340B0B0B2E0B0B58FD\r\n%31FF58FD050B11343A343A123A343A123A343A123A343A123A343A123A34\r\n%3A123A343A123A343A123A343A123A343A123A343A123B343A343B343411\r\n%340B0B05FD0C0B5883FD32FFFD050B2D113B343B343B343B343B343B343B\r\n%343B343B343B343B343B343B343B343B343B343B343B343B343B343B343B\r\n%343B343B34340B12FD100B2EA8FD33FF7DFD050B0534343A123A343A123A\r\n%343A123A343A123A343A123A343A123A343A123A343A123A343A123A343A\r\n%123A12340B34FD060B05FD0B0B050B0B587DFD35FF580B340B0B0B34343A\r\n%343B343A343B343A343A343A343B343B343B343A343B343A343A34341234\r\n%343411340B340B340B0B0B2E0B0B0B2E0B0B0B340B0B0B340B0B0B2E0B0B\r\n%0B3458AEFD36FF7DFD420B050B2E83A8FD37FF83FD410B2E2E83A8FD39FF\r\n%7DFD3A0B050B050B0B2E5883A8FD3BFF830B0B0B340B0B0B340B0B0B340B\r\n%0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B340B0B0B\r\n%340B0B0B340B0B0B2EFD070B34347D7DFD3FFF7D05FD2F0B05FD060B3452\r\n%7D7DA8A8FD41FF830B0B0B2E0B0B0B2E0B0B0B2E0B0B0B2E0B0B0B2E0B0B\r\n%0B2EFD070B2E0B0B0B2E0B0B0B2E0B2D0B342D582E58587D588383A8A8FD\r\n%48FF83FD19A883837DA87DFD0AA8FFA8FFA8FD52FFFF\r\n%%EndData\r\n\r\nendstream\rendobj\r255 0 obj\r<</Length 65536>>stream\r\nGM6xl\u001a\u0017\u0004v\u001bBo4Pm~G=$]?l`欒o\bJYr\u0017\u0018SA<9-\t\u0001R:)-\u000e8Nl\u00168~T\u001b\"j7qshisB>SV֭woX{6&z7VTW_U\"橲m\n\u0013Y\u0006\nN\r.{^=z?Y}3鹧0\r١awV\u001aRvڳG?5u\u000e\u001aUbf*#_*\u0004\u0010X`j\u0011ѥXr^4\u001fTeE7xEVMV9\u0014((6\u000fj\u0016>|ɹ\u001bKpMҊm\u0000W\u001a*T\u0006ɷ\u0002x\u0018\bd\u0007-\u001f\u001dt\nT[|ZxX\u000b~w+t0/WN\u000b9{\u0001хbQ\u0006F\u000f`q\u0002`\t\u0002ط\u001cÔsq\u0005 ?#*6\u001d\u0012UJHfMYzן\u0015+#鼚3Y/^C(M<\u0006_p(I\u0004\u0011\n\u0018A\frX\u0000>h\bה8\u0001F\u0003\t6?iSO1,Y\u0005F(\u0003#X;k\u0016z\u0004ۚXhƝgyڬ\rX\fNg4ؒ\"+A,\u0003OVӛIi\b=-H\bKCfAb#݇}Ii`u+\u001b\u000eSV?DSs\u001b]\u001fS\u0000\u0011%(:\u0017Ň\u00110YQF\u0018Rv\u00198\u0014p\u0014D\u0000SxUBF1ޤ\u001cQ?)R;d[\u0017Ү\u0001}\u0019}m\u001agdy/D\t\u0014^x,4eKyk}t^)\"+Q|\u0006)($RB1/4׋bI\"]+\u001fW?Et5?po*\u00012J\u0003\\}!~s4^D\u00009\u001b%\u0015\u0012G\tE.SNvе[\nn\u0012\u0001~\u0006}Q\u0014\u0014Jc)\u0017*JF\r9EDc{\u0014z>»iT^.V\u0000_B\u0012)raO\u001ekw_?\u0019\u0018\u0018\u001e\u001b7їѷno\u0003<Lj8Qm\u0016s#||w:sS\u001a\u0010ބ\u0001=w}29\u0005>\u0007g?C\u001d|9@\u001c\u0019GS|}Ĺzˏs\\ߋsjMQӃޥ87vb \u0018X\u001b?'\rЉ\u001a\u0003]Ȉ\n\r;'|%w\u0015_׻Z}U+_~C\\,=\u00129\u0018w䇶\u0012<\u0002\u001c~=j[,س[^\u001a,׆L\u0002\u0003IB(\u001f-΃\u0017;Ggr8a8_YAq#\"|MS~%\u0005}zu\u0010\b\u001eyx0y}g\u001e?l~\u0017Z\u000e['P\u0017\u0012\u001fh<nξjLseuϯ}\u0013\u0018_G\u000f\u0019/\u000fq.ah5E^y?a\u000bM<M-{^Sφ/\u001f=Ez`\u0013\u0012Joj1ej\u0005zErgVN\t>a\u0005\u001du\f:̊;0s\u001fح6yIHǅFW\nK4KqrPׂ/\u001e\u0000\u0018rZ[$/\u0003H5#1ɧ#\u0019=Nc\u001d*kFﾾ킶\u0004OF;QEvLs\t-sy\u001b\u0015򡛼}n~!\r0\u0004`\u0015q*g9_a} nt/<&[\u0013H\u0017VO:9%~ɞ-Gyw\u001cW\u001eggy\u0001kq=\u001fͰ|t4;1FRw\u0016\u000bЙR\u001agnXǽ/'X/n\u000e^mع/q{sq\u0007?B\u0011<e[\\'V<_E\u0019p\u0007Q;\u0012<\u001eȴC\u0012l\u0000\u0005.\u0003,Q'om7]_sx_M\u001etjZ;ԳVsl\\\u0006gYp\u0014+^5]/qaH\r^(vN}l^}.mNsUp\r1\u000eVbezv45\u001awGe\u0006Iu\u001e\u001eQ\u0007NJ͝\u0017:H\u00025[U6]579\u0006ּQyіnʁ.A?}\u0011\u00175=\\=U\u0000)\u000e<,vϐͭ=\u0019W9ܲG~}gLk\u001cbV\u0016Q1\"\u0016\u0018ZOհs5ɯoi0uvZьC55cY$܂\u0017E\u0004n9Ñ[B|埽\u000fN~GBqZ:\nr8\u0005@4u(48\u001b+ڽ\u0003}V7\u001cΕ\b6Cs0B#:\"gg|p..H]q\u0014U?,\boЂUAk\u0014\u000f6\u0018\u0005mB;\u0019ǌ/?g'bOѹlQi\u000biTYb\u0011fN2tgֹ\u001d\u0003b\u00166WJ[֗ۈJb\u0017_\nmozt6\u000fL+\u0018L\u001f\u000e7\u0019\f,-\"K\u0007pv<\u0011<4Wi5X3~hF,|dMf\u001c\u0017`6g@d,r%WO\u0005\u000b\"ժzvS'+fJ\u0019uΛehT\u001c[U\u0006F#;-\u000e\u0019vү=[\u001c/\u0011:-Ŕ\tdA;k\u001a\u0013MUEnUm0k4K˝\u001cKo\tZ\r\"\u0016\u0002:yU1zjs!ӽv\"'U[1Bxo!\u000fNg)NAв:򲿧o\u0001ng~y{\u001f_n񢙗\u001cf{FruWưe4\u000bϮ(wSv\t?1qs\u001c\nC?=$6\u0003)3b$QU\u0007pؑ#G@S\u0018'a\"uO6y\u000e {OaX7'XgNE\u0018+\u0019xn$1^i\b^Lu߉Zz\u0012C:J\u001d!VXUUw\u0019ʦfQ\"_lH@+w,+ > $.l\u0002;bÝ\fg4o׻\u001e\u000e04{Qyd`δ9{`[=uڽm\b@~lSwlx|\u001d0R\u0015 *S \u001b&s2v\u0004_7R\u0010\u000f_uFzVڋ)0yrYygn\bA\u0003y#t\u0011\u001a\u000fa)8\u0001\u0000\\\rG}׻iuMg3\r\u0015{;\u0004ח\f\u0012\u000eujh`BIg;Ʃ͍s5<ZΈ﫟Q=Dg<\u001bWUk\\y\r~0,4\u000fe\u001asnJ,U\u0006V5\u0010e#3\u000f7}\t\t\t\u001c%p 3_nC0\u0019ـ4$.\u0005\u00076w\u001fb\\\u0013Wp\u001a;c\u0007Wʔeml.iaz^*I*ߦޱ\u0005\u0013\u0007O\u0018'\u0013\u001e7\u0017fЙ`IV<K\t8RkqK\rr3a[\u0003X\u001fZɎܰ37wo)0\te۟0=B\u0007DQ($.\u0007B\u0002d\u001a\bȧae=!\u0007f1\\^]ÕsuKGJ>\r\u0017u\u001fϖy*\u0012\u001e\tU6=\n\u001b.ӫ\b}V\u0016ɞ\t4q2\u0002\u0018]Q2||TDA}z}$BF\u0004)\f6\u0005}<ܦ\r\u0018o)r\u0003=t5f\u0011\u001b/W+,Xjm00,\u0012m:PE2~\u001b鰡\u0010DKd&toUƍ'\u001b\r;.p.7\u0000$\u000e\b@zp\u001de\f(KN7UC\u0002]r\t\u0007_\f\u000fG3E:ǿ[k/\u0017\ff1NmN#C}?+O\fU\u001e<\u001a7h4J\u001c6sÏQ#] x\\)\u001a\u001cv\u001a5ZEauX\u0010+`A5}\u001d=+T{-},c6td\u000b(yr^?ɱ\u0004ЎQ+\"\bG&\\\u001dz_R\r\u0005\u0010Zya#ڑ][Ulo\u0010^v\u0007˨mv+Q2Wq\t:3y./_\"\u001f\u000by!\u001bq\u0000_J2\u0015\u0016I`9=\n!כ\u001fjU\u0019n˳t|\u001a[O[ĥvn불}ssM&(sM\u001cS\rwt6=/\u0006\u0001\u0017e=L\u0005)\f8i~j\tX-\r8T\u0010W\u001b>--Hj\u0014w<kt\u0011rZY\f\u000f\r\u001bX֥qШQMr\u0007\t&\u0005&\u000bx\u000f{&[lzt?5t!\u001a(N}E}7>\u0015\u0001,\u000b\u0013\u00184Y\rNw%|V\nJ]`ҩgZqx\u000bpl6w`_]#\u0001g-\u0017mtPf\u0019\u001b\u0012&%:$\u0012\u0012^Ȳjf8N\r(݊I\\P\u0014ߝ\u0001_\n+#\u0001ZZ'٣\n\u001by\u000fEGJI\u001dOJų4S|k-\u00182bV>\u000bҩ\u0014\u000f|Of}\\-r\u00040[\u0000h\u0002C\u0010{`/*W7R\u0015)\u0012\f\u0011\f\u0006a\u001d>;Ŧq1ټ*\u0018^ϲbzE`o\u0005\u000fJՖʭ|\u0017\b\n\u0002D<*=\u0002\bS:>$>-\u0001X\u0000`n\u0007\"%>\u0001X\u000e,5\u0010^%3Qׂ@8ߨI`rwÍ]\u000fJժ}/H\u001fϽf;D|j\t.jʤ~V\u0013<G\u0000j1)3\u0005\u0018s\u00160}`h\u0016SnH6m\u0007\u0000a=\u0000\u0011j́\u0011V~fN(S\u00174\u0003߮۬\u001eWFCt\u000fJryz\u0017\u001bk\u000bC\u001f\n\u00070\u0015C\u0013J+<)Mi\u001c\u001b0\u001a4\u000bT!/ҿ!\u001b\u001e\u001a_oox\u0013}C,\u0002;J\n>i݉G\u0011\u0017Q4!j)7$C\u0018\u0011Z6\u0019}|oSk򊢈SJʪ\u001aF\u00112)a\u000e:\\QĖ\b;l5?/[B*c\u0005\ni\u001dŷ\u0013śF\u0010\u0018ʾ\u0019E8\r\u001aZ,vm\nƹ\u0012/){+\"\u000eHjN\u001bD\f)U\u001a|y\u001eڝ;I\u0018R\u001d\u0013\u0012_ \u001f\u0012}#%ݥ\u0011{d\u0006;GI\u0000.O\u0016fQRtQ;Q`Q(W\u0016)r8$(a\nMYRz\u0014^\n1F9:EHjTWng&5><~v\fWb\u0000ќ\u0018 \u0017'Nȧ+==##U0JQ7J8JZ\u0011\u0017%m|bX?[S~4\\\u0010R-\u0014|H\u00110\u0004!޻/A/\nA$2 \u000fvЃ\u0013\b|\u0002?a|n>~c\f>i\u0001b`1 1P\u001e墯Ԣ܏\u001f/pfaj|B\u0018x^\rf3|<\u001f`\u0015<@EI\u001d)?Q׷c~wrVwE륻'!c.΍Kuss\u001ffKHφ,.Q5\u0019\u0006<~.\u0005桩xՅ\u001b2nBnx(rt\u001dZe+/\u0005W-\u0017\u001b 8NS3z{>Z\"=\u0016鰯\u000f\u0003um\u001c\u000fep%M46=JCu޻8\u000fb\u0014)Jȼ\t\u000f z^z\u0014Z]灕dx=ܕC6e.\u001dsp?0mNruttxsrH\u0018p\u001fƁm~\r\u0017;\u000fXv\u001dAw7[ll.C{ԝ<4O[v߫OJ5\"\u0013#x<{l\u0000\"&\\бxۚc,\u0017n\u0018\u001e\u0000\nЅ%ǥ-\u0013hz\u0018ש]`\u0004ݰ7\u001b=_>;mK5aspq8i\u001d\\|\u001c>l\u0013~)Ru͍/h|w,p6y[\u001a2\u00052<2@ -,s\u0006ٵ4=d\u0018\\M/09>\u0013=Bζ~w+|fSY_\n\u000fq~\f~\u0000oz9xk|\u0011z˿\u001dG\u001ba7Gb\u001a\u0004Јg\u0000\u0016;P/jVNjo^Ed})w6S3fZL\u0007A\r\u000bW.v\u000eZ\fuGR}QG׆\u0002Ra\u0002Z/q\u0002NG\u00025\u0015ˎS\u0010\\>>L)iŵn=ы|-=\u001b˟=-:\u0016W`[]AY.g[x\u0011>m|6˾\u0002wvlDr\u0017nK;Qu'f6\u0015լ\u0006˛\fM|\u001fBCu^i݋W]s<.pW\u0015~SsSY\u001731I؜ކnAzmtߋϡ\u0011\u0016;w\u001c@\u0001x6\n\u0014\u0007䵴ԙ\u0017rEnEDy\u00103].2_~v\u0003\f>F\u0011Xj\u0007=]2HMڕ+ZgokmO*~Zxsf\u0003чY\r@봥\u0000\u001b\u0013b2\u0015\u0015-px;pIІ9z\n\f3^<C%\u001b'WʺyY\u0011C^.Ą\u0015J5\u0004`=2UP5p)nSy\u0000BOn}.}ꑸhlT\u0005mYv\u0019.?dlv\u0012Is2eSeJ4glIɘ|^9.co\u0013D64V^7l\u00128x1㣛.k[̈́8Ǟ0;\u000151gڕ\u0002)\u0005u\u0007qE\u0012y+J\f;my%2\u0012\u0015Ҵ$+*-5vO˖/p=Y \"o\u0001;>E\u0018ťlA-H\nZFtggZ\u0002\u0014\fl\bh!gq&CU[״\u0001*e]VyP)kd=]E \u0016K&e1#\u0003|Mdw\u0000\u000e\u000e]/IЦA\t\u0013R<\rםl.󲠦Lc\u001a= %\u0015@\u0005\u0014^{\u001agwt\u00079gV\u001eL}h\u0019\u0014)`-! \u0019bj;\u0002-pDgr߉΂Ie\u0002m\u0017~\u0010\u000f\u0018IZ\u0017w+\u001a\\]Sn\r\u0003\n7UJ^.\u001b{\nIwu1\u0005]n֎؎iZ\u0013-\u001e5|\u00035HXn\bT\u001d'\"&b\u0017\t\tk);\"g(\u0010\u001al#PYo\u0018]\bks.Ou6\u0012k\\-ɷs-HY)ol\u0014\u0006JLec9\\am}^nK&:$R\u00041\r+N\u0002zxicʣxF\\\u000bG\\g\u0006N3\u001f\\\u001a8f6։@g4tˋp\u001cMD\u0019d;D\u00027lU8@)K!ck1LԒ\u001ePZQl\u0013NyK4N{Y\u0001]K=\u0011kGZ7@gn\u001fk \u0002\u000bx&~]\u001c]\b\u0002n>v0Пd\u0018\\\u000f\u0003\u0005BF\u001dFF}Oz^(jY\u0004r?*дZ\u001dKE\u0016\u001a5z\u001c&\t&y\u000eÅ@m=\u001b\u000e\u001e;\\-C\u0006?|R\u001d \u000eskT$5k\u000b]G&\u001dx\u0002\u001a0\u0017F-\\?\t67\u001erY}\\QQ4N\u0001S\u001d<91\u000e\f]CBs h!`a\u0019hL͗w\u0017\u001e\f\u0006\bЇc\u001fsf?{,LFr\u0015z{P*4\u001c3\u0000\u0013Ze\u001e\t\u001f\"I\"o;\u0013RF8RFȽS*湃5\u0016گOCX\r3H`c\u0002pn?\u001f\fHF\u000fƲ4S}pnHR<h=\fIUWV9)ݛ!),v\u001d\u0004s(nz{Z䖿>&WwO\u0004c\u001cA):@\nPۖH\u0014u)\u001cI|\u001bPj?p_y!ߩu[$w{k]Dײ\u000e|O\fN?pd%J\u0019[D^l<=_a\u0002\u0014Cʃ.?ոJaSu\\t9ۿPx\u0004\u0016kkB cF'ab?s]U%ڽ\u0016YPI$H\u0010\u0014Q,f\u0014\u000f8s?ϋ\u001cQ\u0016TV:\b]f{Y&i\u0016Tw5\u0019Js\u0010&fWPP$iϕʂV\u0001c_\u0006L\u000b\u001f\u001b\\.\u00135TT`^\u0015`qo/\u0002k\u0011i3\"\u0013j\u0011m\u001bn\u0015n{\\-Kjw|\r;\u0011 q?\toGH\u0019\u0007yj8stoqViq9⏴ߑd&\u0012_\u0011ٱrޠ<V[\fJ\u0005\t\u001aXک7u\u0007\b\u00114-1lR\bv\u000b$\u0002\u0002\u0013m/ѓf.\u0001m7qS*A^`a6l4\u001fǰ\u001e9J=\"T>h)uQps&6\u0019Q\u0011\u0001#>/]&\u0006%lF^pCٴVp\u00106\u000eos~)`k;]\rfQC\u000bT\u0012U1\u0004*IҩnX!'W-wb\u000e˟=ssl\\\u000ecϼpd?]2;7\\}[[0f6jnM,~\u00152\u001bn֥\u0010\u001cKa\u0007K/\u0017fq/)\u0014(\u0015wzQj3Az#8\n{\u0016\u000fUhS3\u001fMs>噏tX)4]f\u001fL\nDעX\u001a\u000f,~Q4mU6\u0010Z\u001b|w%k]wR\u0018NbݛS0ͮ|<=宗+gB\u000ef\u0016`\u0007iހi\u0000\u000f`S\u0002U{b\u0006\u000b`\u0017z\b`\nn\"\u0003\u0004`Ya\u0017FM;\u000b~9\u001ck\u0014=('V<\u000b\u0010P_M&k\u0013i/@mUNЖ'A\u000e~\u0000#6)\b\u001d\u0017a\rK\u000fo\u0003\u000e l\u0015\u0017 \u001a z'@/\u0010 \f\u0010\u0003Ą{\u0003Mb\u0000&\u0000\u0011,ÿ\u0018\u001et\u0001ݿEl!\u0002oӈn޽:c\u000eU\u000eƪݎ\u0015\u0017?\u0000w F\u000e }\u0005 ^H\u0017 .\r\\ڲ}]\u0002d`\u00012B\u0000*\u0001xs\u0001\u0001\n\u0014\u001a?I\u0015\u0000E<g!+p0xM@43X\u0001M_\u000bN-,[I.\u0005P\u001e\u00012L\u0004\\?\u001d\u0001$2\u0003VythE\u0001rѨ)`\u0004\u0002T79`B\n\u0004(υ\u0000彟\u000b\u0019NCA|\u0016\"XK7 C繍\b;I/+I蓓$\fM%*)^\u0014#510W]`q)IABnX0)\u0004b\u001b&nU?\b~\u0016M7|k2|/44\u0014\b+yE3Ii\u001a\"\u0014X\u0010[\u0014\u0013\u000e\rP)X)H>L\u0003,\u0001)JBnkQ\u001f#/p\u001d<\u0003%\\?K&p\u0007U{!sϛ\u001fX^$_>K]Gʹ]\u0014SKr$K\u001aUO?\u0005\u001dM\u0003u7I\u0003+-R`-\tY3hx\u0019⪥\u001es{4f|Ws;\u0017^['<mn豽޴?H<ΞN\u001aL>;|\u0016S'{?\u0014C^!qKɛwK\u0007\u0004h\u0017;>vq\u0015נ~w;[VPk]e'^p)<\u0001Gݜef}*lթp!QhtV\u0006JYr\u001ab&qh$_\u001dp/}pJ>C|{9U/g\u0018nXc8\n{\t;Tk7C|]}yy>\n\u000bۼs\u0000>Z5\n\u0005p(j, /[f(>ۼ}V\u0019vB7Rnn\n}\u001bo\u0003W\u0018i\u0007WPT\u001e|OS\u0006fk5n?qĉ~2=ulp3Ι~zz^v0:mml1ktk\n}#\\w\t;.[`/N\u0002\u0002y5\r<F\u0014\u00024޹s9wGU_\tX9VK$0@z\u000fvH:3v&P,ˮ\u0017@X\u0017*p\u0015l\u001dsUn(:0}J@Zy\u00145\u0005e$oZs\u0018\u001ei\u0017\u001cmR;7wn\u0013^uw6WqX\u0012}[\u0002A\u000eW\bVaPKͦ\u000fJ%h-_ӡ\u000fuibiLd6׽w3!ZcN녖[\u000f\u0019\nmU\u001fMh4[\u0003uZW\u000fi~\u0003tWck­s'A֩\u0013\u001f 侷j5a\r-[ia[؛M.\u0019Qb\u0012r9Rj.3jn,NV6JJӮ\u001f\u0000KĜG\u0015#ղ\u000fbaT ;yp\u0018RO\u0016\u001f7{n\u0013^s\u0007\u0017\u001c*-TuC=\r\fl=[X4T钉sy}*\u0019'7K'p4X[gƦ\"I\u0015\u000fc!\u0019F\u001b\u0003\"bQ \u0007(\u001f.K=\u0006.g\u001bt\u000f\u001eUMTKaXLkt\u0007ny\u001eMvon\u001b\u0005%z2\u0007bl\u0004hh2\n\u0012\u0007nĎ79`8qK4h\u0014W\u0011\u0018b\u0006A\fz\u0019\t\u000b\u0010\u000bn܌\u000eESzj^mC\u001a\u000eƘX>N{ݲ\u001b>jPv\u0002\u0003)h\u000b|_avz+֖[\u001ff|W\u001bl5j\u0014\b\u0016q`[=ᄿ+\u0000UWa<eE|\\k.?4z$\u0016\u0014{K\u0007\u001bQv\u0005W\u0000i6&?`L$k5]XnAVIlGPX6\u0018Gy\rUÐdJ*\\_T4\u0015\u000e230\u0003ǥK\u0015H#W\u0011\u0016Ӥe\u0000sd\u0012E\u0006Ŷ\u0011s.sܸ$oamԑ\n\u000fО}e\u001b\bPj,\u0013+'\u0015_(\t.l\u001dQޔO/\u0013dçd>Ak@\u0010\u001d\u001f}\u0013p T\fr\u0016WzkL# \u0002l8ͯ}A׮wYO\u001b&5|8n\u0018\u0007$󆦐%3IޕNJN\u0014N봳oU^F\u0019ZsU5\u001bsVq\u0012Or75d3\u0019\u0011{z0w\u0016EDzˉsu鞬EIh\u001an9VVҬTZE\u0015Jy\u001ddi (*%B\u0015\u0015+Gs\u001c \u001etQ2ԏ\u0003Ʀ՚u\u0015&z٤GԐ{Ep\u001eb^S 竢\tOOӘ\u001a`\f^鼠\u0019z\u0001{_\u0015yk_w奸 $0e3\u0007G(\u0007M\u001e1 \u0010cp;Iu\u0006K\u0019\u0000,\u001ea$`\nxRd1H1b@oag!\u0002\r\\ezI+\rCx\u001e\fM*^])UP\n\u0016&G\u0011\u0010T\u0006]&?OOԁ\u0015;'\u0016X#Y\u0017`\n{F\tB\u0005zAژc8Ł\u0007\u0001<As/jm\u001fĦiDntpN2NUǯ(V\u0010?nYМ](G\\,\\N\u0019\t\"\u0019\u001di~\t(iV)oG\u000e\u0017{l\u0007.q*q_5)̬\u000b3`q<s\u0015`|\u001bn.9j\u00170'F\u001bU\u001bFJN\u0007O~\u0019Ł\u0019L[\\\\\u000e~ddY'PKCW3iBWڂ<L7\u000f=\u0004wpZspNp\u0018!ܤ9<\u0003_ޱfod9Lvv)䔼{܈J:x\u000e,\u0018qq@Ɇ\u0003a\u0010g\u0006>CHWW}jh\u001c\u00159q\r~cW\u001c\u000eVʁ9\u001c&\fn9A@\u000eDR\u001bGC\nv\t1l\u0017s~\u0006\u000fƯ0\u00136۞׏\u001bs\u001eFVzO'\u0011E\t[\u0015@Z\u0002z(G{\u0014\u0019!\tZuП[׊=^#R,\u001e&:h:\u0012C\u001d\u000e>+\u001cܜ\u0016\u001c8RV\u0011߶eR\u0005y>۫o-/\u0013P\u0010\u000fƙnKح/ͫ\u0002;;GSS0Ҏ?\u000fs\u0010^\u0002\u000e\u001a:s6\u0003+>7#|ۜZO2DwhC=u\u001b\u0001G/\u001b-fYEPWqf20V;~>\u0017\u000eq\u0001\u0001\u000f\u000e\u0011\u001eC\u001bLb{Ey\n\u0001/껮\u0019~\u0005:\\\u0011n\b27\u001e2A\r23\u0006\u000eL&@·_h\u0001ßM\u0000W-\u00148pƃ\ray3\u0017\u0003z/\u0016\u001a\tK\r)/&UX<Po&^SnԵ.8:Н*n dA5+T\u000emρɰMmr\u00066P\u000e\"ʒ⦌g}dhK2v j0_bt_HbJ\u0013\u00036?KXZt+vj\u000e=\u0014\u000bM\u0002\u0002\u0004_-ilsς\u001c=ִ۹\u0010ܥbBS(<zK\r\u0006\r9T\u001ba6ꜞ\u0002SKSpl}Z%$Ϗ\u0012\u0002Z9+i$FO'\u0002}O\u0002C'D0sC,֠\u0016[Ca\\)bλYMRc7/\u001b\nf\u001dԏXKPح/澦o\u00163jM|\u0015!*-T\b0B+dU!Ŭ\u0003-Ҫ\u001c\u0011Q\r\u0018О6]qT bC|B?k&\u00048kJe&.7ȬZ}VyADP^c07\u0007^nps_΍\u0015wnA\u0017\u001eo\u0014W/o-I\u0018~\u0011\u0018(\u0018\u00104MBݬ)bm^xMO.+JuҊy4{9 A>/j Y/xJ7\u000b;כ\u0015jYh_цn\u0011&}3I\u0015,\u001d󦎤\nni\u0001\u0001,-\u0001\u0010h\u0005*\u0000HW:\u0000Ho)_X1?\u001eh\u001f6װ~\u00197!г\u0013\r\u0013۽\u001b{Ʊx\u001c,QG\u0003q{\u0002\u001dM\u0006\u0000J\u0000*\u0000{%\u0000;\u0000\u0001)\u001b\u0000?\u0000z'q\u0000()[\u0000}[)\u001c\u001aZ\u0007\u001d\u001aFC\bͽPA|FW5W;@g\u0006X^\u000b,K!ߟ\u0015p}Rv\r`}u\u0002`Co\u0006`O\b`~o\u000f`\u0005s\u000f7\n3\u001e[\u0000\u0017\u0004\u000e\u000f\u0017\"\u0003IRJ\u0000<v̙,n+\b2d\u0017+1HkE=u\u0003L\u000e\u0015Z\u0004W4^\u0000~^q\u0001\u0012\u0011|N\u0004\u0010r\f\u0010\u0004\u0005\bmSЫn\u000f ^A\u001f 1\u0004An\u0003\u0003a\u0017 W\b m\u001b\u0000\u001b\u0007[^K1~F#pل`\u000bv\u0013_j\u001fhRiX\u000e}W?\u0014W_\u001d@^|\u0007\b\u0010a!\r\t^\u0000I\u0000\u0012QbT.y\\ku\u0000S\u0014/!R'ӡѵojߪ\r~OOg$o5J*%\t-()VV0U$,TL1/'Sl$\u0011\n^VcBu]&_AQ$'B\"q>\u001b_Dw\u0006)fz\u001aeebrN,f鰙3 \u001feӟ\u0005-ׄ\\W<|_7+ʫ3h\u000b;FG{q6v?!Ö燜LN;c\u0011Zi|]}!I.\u0002)\u000fS4N~k4WA_v\u0000\u000bi__\u001a\u001dk>`\"^C0\u0016N\u001a\u0019\u001er{<\u001aN򽫟fvfF\u0013|\u001bͮv\u001c^bYȶ^\u0006_HUCO>7ZM7'&wpJsW{̒D&*|\u0016x\rǮW\u001e\r%w5iI3Ro:\u001a[p_ba`;pv\u001d'6\u0000KQiV6i\u001cvL8>(忀7\u000fPu]O7'ACiMJޑ%omO(3=\u0015\u0000GF֭k886/8ήOǗ>x~p*a4QT;wm>\u0004^.EXs;\u0001Vf\u0015{\u0018pMw|O4ޕ&Wҟu3&V\u001ar`\u001f\u001ews5e*×3\r£=nfa+(P\u0019\u0013ޟ\u0005f\u0012e~ `Xk=?:u\u000eW}ϩQ\u0007u!j/O.S\u000f\u0000z@Q\u0013Ak\u001fj\t\u001b\u001f(W3hjQŊ&<zaraCIs2ihU*puzj\rI\u000e\u000f\u001a}U_YXpqK474wQqne\u0000\u000770\fp$Ϝt$y#\u001cDw!\u000fqWyuwV&7.ekf\"+;?2Ǜ%݁_X{֏\u00059$\u001b̃sj\u0000-və\r.q*Ū3,\u001dI<ekY\u0015+\u0000\u0011Z5\\{\u000f;S\u0017I_Uip~3/˫r@A+fa\u0002\u0016c\u0010\u0017\u001e.<wy\nVn;xxnx*\u0000k\u0015ł-T\u0010Q\u001b\u001dnblI|kY\u0018\u001f\ric\u00064֠#\u0015wN\u0012i\u0017\u000fi\u0000o]ZFn\u0012gp\u0000oeＩx7}l\u0015v{\u001f9%Vkwz\u0017bv=BdFn\u001eIbIm//Ωt4*kjrG\u0006\u0017#\u0019ѱtER<Pih_{fdj# ̾~\u001d\\\u0017<q\u0005Ub9-\u0007=&\u001d{p-tŊa|u`[\u001e\bP/Xl9S5\u001a~4\u0005UFG\u0019qy:T\u0004\u001e(\u000f\u0016S\u001ftX]lƗ '\u0006N\u000e\u0005Z\u0002W|=*@[́\u0014c\\9Syk\u0018ˎ!\u001bHP5S5%VQ\u0004\n\b4P\u001faxoCD\u0001sO\n΄d72\u0017ҲJl\u0001S\\:\u0019 l\u0019Coi3\u001cK[\u0019*}\u0002T\\̶v2\u0019>.\u0018}>t41z1=@5<L֚<\u0005ٌ@!:šLHZ\u001bOpcK\"8\u001ds$؎P\u0019/#Z\u00073[\u0019ڢo\r\u001et-}]C\u001ft\rO\u0013t9\u001c\u000bt`\u001b\f^U3|\u0003Ty\rqJLߺ7TԺ_)O6صP\u001f\u0017\u0000^r|ˬ\u0006Z,f\u0000r:w\u0015\u0014\u001aw\u0015smW٫_\\\rz[ɡ.\f\u0007[\u001eۆd:չ^yWO&2q\t{e{6e/ 9_cR)\u001f0pv\u001eJB#xi\u0007\\ș\u001c?Foo\u00113z2e6)\u0019Z\u0019?$x)+\u0018aJ\u000bw/T\u000b~wyxօڪT%k\u0002u+\u0005İ,aS:RWh\u0018\u0004«\u000f\u001c1\u001btt::9\u001b}lܲI\u001dWbc5(3yqH\u00145\u0019檦\n8mh' \u0013ta\b(\u0007͆R'(\u001e}֎sk\"\u0000*\u0014\u0014\u0005r>\u001cr\u0014kbNhs\u0015\u001e}Z\u0003p\u0007Z;gUqRUa\u0016Jɕ\u000eO.݈\u000e.\u0012݆\u001217GxAvP!R\u0016k\u0005G\u00166\u000fg\u001846bm2\r\u0001W˨k\u000ff\\R\u001fzѶXQɔہ~j'}`}$NI8\u000e\n\u001dW.\u0013E\u0012=4jN\b\u001cH6y#\u0013QM1ndge-\u0016HG^)ʓY/Vc֩RNː\u0015\u001c){7S^Ê\u0010{\u0011w$DGsEm1KM2}$дthg\u0015(\t\\xd\u000f,\u001e\b\r7p!XW9Y\u001bu3tQPPa7{\u0010Ef\u0007ӵmm~nӡ\u000b\u0017G8N'yse?Bһևp)jd\u0018Dm\u001b$JG\fM\u000e/@ꘀԙ\u001b\u000e{\u0017\u001a\u0014:}G\u0001\u0006~n/tz\u001bTWg\u0017\u001f++>\u001dmSMCЅ$\u0006ץ9vz\u001a0'L)?;U\"8OfF\u001e6\u0006016\u0014~}<8\u0018elt6x NV<p `7,w\u0007{5$\u0017u+\u0019\bӤ*?ŵmZNcq\u0015XD\u0015X\u0011i|.6OsP\u0004xblRAiA5.\u001c;q\u000fs\n~s\r\u001c\u0001n]8}\u0002J]\u0000Y\t_!<\u001enuZUO6ګ%k\u0015)ʕ^\u0004J\u0011j鈰]hf6Ht0\u0004ۚWR><\u0004p\u0007f\u0019Ծnĥ;Јҙq#\u0019v'ߕ<:G\u001a\n̬6~]\u0004),\f<xĞIfh;/t܃.Ch\u0004]CQ\u000b\u0016K;*w@~ʛsk\t\u00101}8\u0003(ʕ\u001f\u000f\u001e\ba&!;\u0018bĬ0D]D&!Gs֡\u0015YE۲TW\u000f\u0007ݮZ\u0019\u0011\u001dx\u001cC&T\u001cAq\u0006/\rgGiϺS{\u0006,=,y/\u0016qûMf\u0004t:c̊Fw\u0007\fz(\u001a\u0010h;17А\u001c\n|2rI},\u0004\b?vtpn޾\f!2\b\u0001xY.m??N[\u0001vh7ާ9h4fx\u001d5KIY\u0012&@j\u001fR\u001a.-Z>#0:q15\u0019,A3KL>u\\>\u0010wG\u001e.n4XJi>ZaQk-i\u0003'-h-<\"\u0003R6Ӭ\u0014dC\u0012b^p\u0018oꭶizܮAX\u001ac\r|}Ջ/W/<0\u000eK&ӑؕ;f\"\fT\u0018?)}G?\u0005\u0003N 7\u001f|4\u001fbNqA޳Imyeek\u001d\u001a[<N>UxtVbխ`Ĕ\u0013梕\u00020N狂(-jĮ\u001d\u0017%i/86%)VIy\u001dW\u0015\u000f\u0015\u0001DԔk׻\u0002\u0013\u0011\u000e\u001cv+\u0010yфb\u0015\u0013\f\u0017\u0012)>P2a3O1\u0014RKokx@\nRl{uj xEFi\"5a+g.?jSI~R&n\n{Sҡ\u0006d31':DjPA]pYziWY\u0010K~\u0015Ύϫ:\rj\b#V\u0007`uS$k\u0000&k5\u0000\u0002N\u0001X\u001f\nL\u000e\u0000(0\u0000\u0018Q\u0001Xi0¬1/e<}9y\u0014\b\u001e>\u001df79WvMDjo\u001dRU^tR9WR؉tF\u0003\u0000\u00159b\u0003\u0010\u0000Oq\u0003ȝ+\u0000(p\u00004\u0001QR,v\u0000\u0014\u0000)>\u0006\u0017\u0000\u0005\u001d\u0000L\nKA??m>\b+ΙlA<#HrAǩ%U7M뇯#\n\u001b\u0001(\u0014\u0000*J\u001a\u0018\u001b\u0012Z\rq\ty\u0002`A\u0002`\u0012\u0001&.8g\u0007\u0000G\u0013cX\u0019\u0007-6s\n|p\u0005q\u0000\u0001)\u000e\u000fs\tVwIζG֢l]#\u001c3E\u0010\u000eSsFəs\u0010c`\u0001O9\u0003x\u00018]_\u0002DdNy\u0004\u0003 *\u0007 e\u0015  \f\u0010\b%\u00052t\u0006HU\u0001H(d\u0000tf\u0000Iq7\u001a\u0014[繕ӎA\u000bLoP!AT8j\u001dGy>\u000fֶAA5\r\u001f\u001d\u0017Ok\tY\u001fw\u0004H6^\u0001wo\u0011\u0007Vﯶpx\u0003ilj3\u0001!y\u0007/5y\u000f|)I\u0006$tMA?\u0011$aZA5IJ.NqǓoWAm\u0013\u0013r\\_n^\u0013[(\u0006[1I0$\r7q\u001a\u0004q\u000eS3LRl42;Sz4'n\t$9.j\u001fg:V\u0017;kaOȽ\u001f?H;&\u001f$''x5H#9mUjMiQؤ<U'`BKW^'w(\u001ac\nLYs\u001fr\\Uk8]}#ۙfo?\\Ҿ~7Jԏ9\u0019)zg|p;?*ɻ\\BD46\u000bUЍ+/яx&])?\u001a\u0013yoϸm\u0015\u0015ȫU0K̛ũx9}L\u001eWi\u0001\u001e\u0016Q;mS\u001dv4W>4\u0013T\u0015~@N}]g\u0015䳫\bG^ibp>\nDvT&\rZ\u001e$$+/gNbvm_oqw圈8=;}N)*DmS9M#Lv0vzyNooFh5\u0019׊\u0005>V\b\u000b\u0003C\u0001=/FvZ4^9{i+UP;£\t-^Nw'@']\u0000Tw]n-x<uϵԘ)\u0016>U\u0001p05`AM|)-,o^\u0018\u0013\u0010&iϛKCI;n\u0017zQ?\u0011ayV5r3y&\r\u000bJ\u0002UjJ}ˏֹBu*VJnU?\u001c\u001bÑ?c.*,E}w\u001d\u0006<WO.\u00159h*P\n $>\b\u00011|y9T*B_\u0011ol\u001fk\u0010\u0011PZq\r\u0000\f]WU M:wqa.˙ϳW5OٜELٓ.\u0011U³uv\u0004K;ql\u001fq\u0013߼ua-RM\u000bA\u001aM3~\u001b\u0006a=.V3iZpTץnr7Inêd\"\u0017^*WpӚ\u0003\u001c\u0016:3\u001b80\u00157=QQ\u000e}ǎ\u0006jrΏ2:5)~r\u0016im\u0018E0昵ЗR\u0017\u001enc\u001cz}cbm\\Nj\u000f/ʋ\u0007'0*ۄRKz\u001e<;w=\u001c3ɶ-9db8zT\u0005B\u0015Y2\u0019\u001fhl\u00197s\u001csZu\u001c*xom->z\u000311GxUK&tPt)\u000fڦ\u0007&4/\u0010\u000fúpa&%zo\r'z`0\u0000d\">PG*?f\f\bk43o\u0013i~-\fr+7\rf\u0010:'-u`v h\u001ej\u0018jv(8\u001aހk\bwe%.a\u0005\u0013=YNzLI\u001d\u0010EiQ\n\u0003\u0014S5L3?4`a3\u0017(HK\u001cDpמf.x\u001bl.~;eMi\u0017ZQUϓ4s\n\"˼\u0012/j\u0017@]N+S\u0015+SեHl\u0013\u0003m\u0012\u0007P\t5\u0014ľ\u0012 Z|P+\u000f7??\u0002^[K\u001e}8f%r[Xϊ\u001b9\u001cz\r\u0006\u001eDŪ~\u0003C/+Oo*'uy~ٚDI\u00130g(b\u001b¦\\\b5y7}u\u0010\u0003j\u0000z|\u0000.\u000fp2Qv\u0004\u0001K|,t[Mw4Ts\u0015-jxMەM\u000bc9\u0002Z\u001a#ig\u001e\u0010%ӽ\u0013 -GE\fSv\u0014m[L\u001eP{H~H\u0006h\u001a\r>?.U}O\u0014h+DgϷ}e<NOw6\\36GΑV3I>zq}'m>\u001aA,3\u000fX\u001cIE\u000e\u0012=\u000f-̷\\}\u0004Kb0gD&@Of}!P6)dtb-л~\r#&#&g\u0019>[!!\u001aVzJ^\u0016y JzOq6\u000ekb8\u001a,Ӊ=Y*X9mC~;\u001cx\u0015y\u0006c^|\\ۃ*.;;\u0004K6\u0004\u0006cmV.5r{\u0018k\u001fj5-B@\u0015]j{S\u0002%3+=&q0\u00055\u0002^\u0000rױRvܷvE\u0005\u000eTkY\u0016p0lȂ<#-͒CyÙ[9Ǎ񽏍7;8\u0013*=vm&\u0011s,]!%ܕ[R@/X5cC\u0012\b5\u00127ı~gH2bY:T\u0010pk/`OHc.uܜV\u0003%\bU\\Sy?\u0012Ga7\u001agwz4Ap;|̂LǾt%V\u001aXӻTuH\u0015KQoO]yNBVλa7\u0016\"\u0017[kRAyq56Te2\rFn\u001a\u00045V2\u0015BKg8 \u001bX\u001f,\u000e<\u001b:\u0011]Fwj4>T\u0002\u000bf!F\u0011_\u000b\u001eg\u001dV\r\u001fC\u0004>\nܯ\f\u0000uE:3C6æԹ>½ym9\u001e^>0oc۶7ƾ\u000e\u0007\u0006\u0005d%\u0006L\u00055D\u001cj3Bvr\u0013\\\"4l\bU\u0006lc\u0005bhA)\u0018#o!sE @t,8~|\u0001/%\u0000Q\u000fՎݐ~ݺ\u0007퇏Ԭ|Sˤҏanà8Ps2\u00066)KՑB\u000eӬ8U\u001e\u0001Y\u0006\"\u0013ޛZ\u000fA\u0004_\f%t4Q\",ÈWAX$\f\u0001*\bުR6U,\u0006U&y.\n}\u0001o#\u001fBrV&\t75/\u0015\u001d\u0005rdI\t&\u0004D-i6804v6S\f\u0001\u0007Ӑ\r%AQ@`X9i\u000eOW\u0005A+\u001bi8:};m\u0004wdoiw.N[~t5CR͎\u0004ɹPP7\u0019ug\u000bzʃy0]h\tDo\u0013\u001c\u001e\u000f\u001c%+,\u0005\u0007\u0003,\\å\u001eW5Gw~m43\u00128t\u0005HW)\u001b-\u001aI;~v\u001cv\u001cͣv\u001cFv<gݟ\u001df./l\u000eݶvqp>F~\u0019\u001f9w%\u001e\u0013dI#l=(\u0010\u001etӨۼ\u0017NvP:\u0010] Cؿ4\u00028\u0019\u001a ڒt\u001cٚOM\u000bx%Yuff\u001f~޸\u0012WUn\tTh&o\"O_ǻ9~ABXC?eГ>\nl\t\u0005m>e6 VL6\t{'>-oZܷ\u0018\u0002ijS*\rAu=k\u0017ժ\u001dQ;lC` ѷ\u001fUFcgh&ޡc\u0004S\u0011*܂\u001e\n[\u000e7\u0019\u001d%\u00144m\u001dkE7jݝXݿczZT퓮R'_\u000fBU\u000fD\u000e\n2,OY/xXƅ#\u001d??\u001aT}\u001f\u000bl\u001dY*8^lA1]h`_iVzGkP\u0005^K\u0001\te\"\u001aJ\u001fͱK\u001e\u0011\u0007%Ģ\u00125_V.}\u0012.rŭP,YaE]N\u0005!7rB%Beʄ\u0005{\u0016٫\u0010W\u0019~uOAk)\u0016v_x~\u0014$>#aO:Tfk\u001a/'B6>ZXoB\"\r*p!oq\u0003:$\u0006F&\t\u0005Z\u0000=\u0006\u001db\u0003t/ЭQK<@'>*,\u0004sy9qN\u0015c_r\u0012\u001cɶ;iR\u0003+[\u0016Y\f2Z{\u0004$\u001c<b:\u0000z{\u0004\fN\u0004@g\u000fI7ŷ\u0005\u0016&)L<\u0000={Z\u0000z΀\u0000zS\u0005zc:Iqx40ʫoK!r#V[\u0013)k\u000f SEziX(T\u001d6߆$\u0000s\f\u000b\rAM\u0000#\u0002p).\u0014:k\u0000iή\u0000\u0014\u0000d\u0000J\fR<\u001d\u0000\u0019'\u0000є\u001a\bm'\u00109HҾ\u0007 ra\\}Yz\\\u0005-oi\n~gJ]/\u000fN)Du\u0001\u0007 &:\u0012\u0000c?\u0007qe=\u0004N\u0004P\u0012\u0001\u0001t:\u0000h?\u0001\fU\u0001I.,ć)n\u000b\u0000;y1U\b.\u0002`r\b`;\u0000`3\u0005`waRv))s&A@\"|\u0003\tώLw2-\rQhJthŘ\u000064m\u0000̜՟[o\u0000NkG\u00007;o/\f\u0004\u0013\u00005X!@l/B\u001dF)-@\u0002.\u00009\u0007\u0000'8+^Tx!V\u001di\u001cD^Z*eQx4\u000f?:O\u001fk/66h\u001bղJ\u000b \u0000\u0013\t#s<Gnx\u0003.\u0000\u0014^\u0010[\u0002$b'\tu#.YSK\u0012i|I\u0002\f$ӟWw8\u0014E\u001ca\u001fWLp*@Z4\u0007׿\n*?}6s&y)eq\u0006i5o?\u00035ߥih\u001f\u00032$u\"-g\tJE5Y}i\fZӓ;\"\u0010\u000b7'SE\u001fG\tݟ\bW6y\u0007&q8=+e)4\bꈦ!73ϋ筑ab=\u00194\bY\u001aXqФ\u0011Lۙo:\u000fe9\u00193yFӢONݚ\u0013!:\u000f;6`\u0017Z4J,M2_U_<\u001f!z:]}޷3q,\\o̮zc┏s\"\u001d7gp$N=3\u001fqxx\\_ o~T\u0006\\wݷ\fa\u0013e\u000f\u000e`7\u0018\u0013i]+Ir^t\u0001k'\u001b\u0000\\nwYZ9о`\u001d\u0016V\u0018\u001ft~<vgn:YnkfM<\u001bks@W_WW* y'Xs \u0016Š _A3\u001fq\u001dWPf\u001a\u0019J{~59)?bf\u0013&wu2\n5yY;Eo.\b\r9\nWҿ~y\u0014\u000be{߬-\u0016nc3\u001cǘnˮer,\u0017\u001dH>&\u001f>R]y_/\u0007|h<|7xϨ\u0016k\r\f\u0007C\t\tِ-!/Am-2|!A?G\u001c\u0016\u001cn>] \u0017fќ\u0015\u0005j3l\"ԉs\u001ezݒЁH+\u0014Ĥs) 7쮬ﺟ~U\u0018&g\u001f\r_K\u001c\u0017\u0017ᡆݝ\u0013Ħݜ~LWxZ\u0019\u001f&ζ\\PU\tvD1\fU\f(\ts\u001cݽ|\u001ejDQ\u0018[\u0004\f\u000fYqM?v\u0005ֲHmv}\u001a?܍'[OZ~uަ\u000bЋ7,\u001eF۫3]\u0011'~\r}N*][.ju\u0000B^CCuWgOw\\k^\u0017{GW\u0018=o\u0007CKC^o7j\bk\u00179_\u0002\u001bNO7\u0012q}e?w{]=]0I'Eu\\h\ń|}\u0007r4\r\b1v!\u001e3\u0006liqwtVqn.xi\u0016fQw\u0007괪7N}\u0012\u001aNUo\u000b;ac(5M-ލjf\u001a\u0010}\u001c}~mv׽bs\b\u000eM/\u001czA0m`Nksξe\u001a)I\u001eԎlE1ݦt=\u0007\u0007ڇʫm+CbGyͲ>.˙=sg.rhTűOT\u0005M:\u0004_nAE\u001f\u0018M=J+3Ze\t\u001bu݆\bjCRc\t\u0002\u000f\u001fA*+\u0001Z\u0019tE7by2e\\y~B˝E4Ӭ_Ļ\u0017F,\u0006/\b3'\fWbsch$N0WmMa9ojk@қ˫7JR;\t\\˓aQͫ\u001ci{@){nY;\u0017#|~7\u0016S%A\u001fm\u0006\u001ctzuZ\u001c\rEnR\u001fˮHw褽ZX]\f'\u001ej<\u001b`z\u001dU*\rwъ\u001a󛰰\u000bq2wq3\u001bQ\u000b\u00185JXH\\\u0003Ҵ\u001b5\u001dէۨJT{¾NjҘ:m\u0013\\w\u001fl7Yg\u0004\u001d;\u001f]~'Z3Q\u001aQwوӎR6]6V-\u001b]e\u0019@&^\u0018mϭQΏv\u000b\n)M|\u001099w(T\be\u0015\u001fՒA)\u001d\u000fUݕ\\jI*9ˋic(hfuӧfZԑ,U\u0007>{7umѯ]̉^\u00194ڮ0gΪi$lHm\u0013=W̉\u001b\u0017+lՒ8)*zƧsGVwWrrÔ\u0017S[Ftv*mEUL5W<b@Yv,oX\u000e\u000e\u0013\u000f\u0015\u0019F\u001ebΚ;']\nǬ>w$=L-_՗s\u0016&sR`8bi䦝\\͍2|2RHh\u0012+'\"\u0018E\u0004 ?rw=\u0004̮cDa:=a\u0015\u0016\u0019\u001e2\u0014{\"-\u001a@\u0004UnVr \f`QZFXu󪚺Y!5]e6}iJ\u001e\u001a\f0M6Y{K_uXt\u0003R8eo-:EGC>1/49!k܃Eк~Q>,z\u00185\u00167W.=k9k]ֹ!dMjr^,EВ*ER!WX]F%_?P\u0007H+BnG\u0000\u000f'\fmq\u001a/\\z\"*'?\u001e^\\wìVWX\rH\u001f/\u000bn)j`y<98)eJKs_5I!s\r\u0006\u0013`J.b夆1T8>VV;\u0012N\u0017+\u0013}\"pFsq̋ō{\u0016^\u0010\u0011\u001d:jDBIdM\u0005\u00179âoS'[kd\u0010#5LK\u000fvU3նq\u001b')V#3~J\u0005\n\u0012\u0011HyR\u0014Tժ&g\r^sչ\u001ap%L9ַ>X>d\u0018KWI;)ڒ\u0012:!U1_\u0017\u0013\u000e;\u0015^}Uk[ѻ׃cu[d3jUOQ\u001aC4NO\u0005Uc\\y⸔k>\u0012*lF̬818arnfEWNHL#j7\u0017\u0013D6ߤF\u001c^`'~i\u0015R\tzt\u00110C>b4(oXx \u0018\u001c\u0019\u000eMc)+\u0010ndo\n%|:iNպ0cb^n$]m$\u001a%b\u000f\u001aGƐ\u0011?#~G܍`=\u0016¯lBR/]T|k[q!txq\u00107<}1`.s\u001bW\u001aZ\u001d-kO'0b\u0013\u001dAKE]\u0010+\u0017ͦ\u001c\u0019oYt\u001f\u0014\u0019\u00134\u0005>Z\u0016ޝonp\u000e'0.,0 \u0004q\u0005t\tEi*Ь!ls\u000bRp\u0000\u0014tG\n|u\u00140cu\u0007aUsupi,`h}&%Ts8\u0013/ krmJ1r\u0012r`|;_LFJ\u0018:\r\u0018JhN.4\u0013=\u0004qQaBmo\u000b;g{NPɵ\u001f0ǄCRj\u000bm\u0018\r\u0018\u000e~i/vBg<6\u0015ED6M'\u0000\u0003'\u001dAqU\u001ad^ɏ\u0018\u000fY:%yrn\u000e˝Dٶc\u0017rZ.J֙Ïn|C`52\u0011eeFܬQ}\u0006\n\u0011$\u0003fF\u001dQf?w3{Ey7}lyץd].\nL\u001bťU؞.\u001bpYgl_F\u00153H\u001a~g̸3,dt~Cd\u0017I?OM'm)\u000b?Kbm!\u0004\u000e\u001f#p\u0001\u0000߀8Y\u0006 ΅\u001e \u0019h\u0002\u0007*+?bU\u0003W8^ղ\u0019K\u001933HG湎F\u0013\rE3\u001d\u0006L>c/9\u001fR\b,L\u0017\u0013\\\f@|\u0003P4\u0004TJ\u0010\u0001&U\u0007@U\u001e\u001cr\u0003(<w:\u0014P\u0004O._1z\u0006C\u001fQyIc3]\u000fa;hX%#odD\u0005O}\u0001У~1N\u0001?}ݩ\u0002|\u0000}\u0011GIvw-\u000e\u0003&\u0000}?\u001c\u0000%rp,@\u001f\u001b@g\u0002SI?15O+n{\u0013 qERo\r)MJW\u001a\u0007\u000e\u001c\u0005\u0004̃~m)B\u0007,,\u0003V\u001b_\u0007w\u0001xL\u0001۳\u000fӀ\u0007\f`c2yW|\u001e\u0002\u0010\u0000{l=\u000e`ץ-`7d>A'yd\u0007&UD\u0019.[(\u0002\u0010F!&4Z\u000e]o夅]HMBѡM\u0001\u001cU\u0001\u00165Ui\u001dpS\u0001p\u0002\u0004\u0005{\u000bCS\u0015[\r%E#\u0003!G@ \u001fIS@\u0003\t\b\u0003b p\n 6\u0012dkSxi;fk\u00172͡t R.4CC\u001bΑ)ìw]W~e[qC؎QW&N|M*\u0002b\u0006\"38\u0002\u0000\u0010\u000b\u001cH\u0003IA;@*\u001f@jO@:k~y\u0000\u000euIp-\u0002)\t^\u0012f\b:\u0013\b\u0015\u0007[v;ּ-Bqv4L!yw\u0001n6~\u0005߅5+Wޕ\u001f@.\u001e` 4\u0012\u0017\u0000\noӥ\u0004_L[B.Ů?}C\u0006^V6\tΏ\u0001)z\u0000\\<J`\u0012\u0004_C>\r\u0013!/\u0011>B\u0017;,쾺nq/~ɚ\u001f__{O&Hr&\u0010/+Kg?IWFeyoiՕ\u0013!\u001fܢ(hyje\u00059عg|Z\u001b{m\u000f>\u0019\t_K\u001f\u0011%(i$D\u0004m\u001e!{Gc\u0016!uokud.Q8oK\\S*'j\u001fO:\u001d\u0019\u001f>\u001f]\u001fQ\u001e\u000e\u001a۹᮵q^?@f\u0014Me1N\u0015\u000eU2\u000ff\u0013jeEs&lO\u0010?\u001e\b\u001d\u0005C$\u000bBn\u0005t\u0017\u0005b\u0007w\nf%\r:|*k<\u0019V.[[h_\\\u001bt!\u001cwRQtɹ|~:H\u0017\u001ez\u001cÐ2\r[F=/%Dx\u00153\u000eVmJE\r\u001a\u001ek|\u001f3N[rqu[\u001e!5S4\u0012\u001f\u0014\u001eTPidx[\f}\u0019#<j:\\_\fOM\u001fqpS iX\u0012y^~ܿ+u\u0007`\u00155Mck\u0015\u0010?'+}Ц\u0011pD{ל7A޸;\fGq<\u001dQzO\u0000\u0011\u0014a({\b\u0006͇}hƽȲo=3'_{\u0005}8.R^L:Ya]%\\ť`-zէƍ<G!\u001aoM8=+pr\b6y|\u0010=\u0010\u001f>:\u001cwXxF/d\u0007OA[A1{w!!\u001fhbgw8\u0007k?<R\u0015\\잛ͥ]\u0006Ra0Lk\u000e~3\u0007x\u0011m_Mwဂ/1\u0007zSeB\u0016?grLP|rBg70\u000e~m\f\u001ewN=iS®ݛW\u0016ZN4ƛL\u001clֳ[\u0010G1ov9cX(zZn\r\u0006+h><\t+\u001cDgan2\u000bA^ut\u001fͻ\n/#POa.aӭԴ\"\u0013k`޴gR3.\u001aU+:6PJcԬfP9\u000f~9}6.\u0016/:L\u001e34\u0018<\u0007T3YgWH1^jS^p0MZ\u001c9w#ٺp?6tk*6h8\u000b׷u\u000fqEѩ6p`PuU,9\u0013\u0015C;ѫ:+kKO+kCu\u000f\u001eW^nٮ|\u0019\u0018q3\u0018r~npsgjȴ\u001fKoi&Yu\u0005\u001bV}XoYu\u001dN'?7՛3{V\n<\u0010RQ(U\u0001#C.aŞ6mQ|dg߻\u00187q\u000b\u001d\\?Y\u000b\u001f_N\u0017>,KBQ_Gϗq\u0017_~\u0010vRե\u001a{\u001dV\r9ZU\r+)\u000f޻rFE϶\u0015\u000fk rh \u00191f֌)BN\u0006ydb]:>|\u0016rF\tZw(&&B_1z^qstkk\u0005h..\u0015\u000e\u001f-t@URY6\baڜo.JhUrdn\u000bد'F\u000fx:\u00140\nʒ\u0016W\u0015]\u001fW<P[Ҩ\r\u0013(]\u0017kΠu\u001a*5q]p|;\u0002z<0\u0007;W D/ڳX+PQ-ֶM\r~6Ѯ3ԺN}E\r[oS4nlIk\u00129bb\\<\u000f/<_L|p\u0018bcBf2\u001d#F\u0007ӞYsyƍWL\u0005z\u0019ke\u001fsf;FKihu5$\u001bXU*ړftv\u001d+ySL6)7UZ) 9D*]Y\tN\u0017x3b1\tuS\u0003\u0003\u001eݾ\u0017~=fQmyR}#._ȌqH\u0019_\u0005~*i5|z\nJCM&R86\u00153J\u000b\u0005OJF,cJ*.ȢdڒH\\A]8t\u001b#mg\u0014R\u0004\u0007\u0000s[\t2槍Th[pRǱT+\u0013*,L :bS@xdJ\n\\,7\u0014Xȋjȅ]jݐj+aL\u0013w1\u0014Iù\u0012;_`;q܀3]cf.׻\u000f\\o}1Cza$\u000eԯ[\u0007\u000fO\u0016\"\u0004պ^/ێ\u001br&\u000e6g)CG㣼sBb^tH\u0015{\u0016IW\u000bG\u000b096\u001d;ww9N:]\u0018-v>AV[{6uh\u0011lji\u0013lj첥ױEǅP4\u001b\u0018\u001c~n\u0012hRF{e^\u000fF\\)\u0013o22\u0013^\u0012Ң9\u001f^8|F_[\u000f\u001c\";{Af\u000e\u000bjr\u0014cTϧ1I\u0011rh\u001btp\u0003z1d\u000b\u0003\u0013R?@[\u0015yi0H%5&ha\rC|k\u0010\u0011\u0010\t+I\u0014x\u0013IxNTm({m2\u001f~1ƵdH%\bMPQН&Âl\u000bl2m]r[Q\u0018\u0007|!,7Lp\u001b꾯A4X\u001be=GV\u0018Ez)dGAՄ[\u0006i1KdSA7\u001a]<?BjdTd.5{\t\u0017CU\bK|zOܿY\u0010[\u0016~\u0000?p\u0007\u001f)\u0019\b\u0017\u00174ܹST{VYߛ;(>*WђP+Y.O\t\u00061w\u0017\u000e¸Q\u0007>&~Ǔ\u0016P&MI5ø%vB0p~w\rm\u0001\u0005I¬^|>8\u0018f_3\u0003)\u000e_|N9Z\u0015I\u0012_^J\r7\u001d<m%\u001d#\u0012#\u0004\u0002eFaLh\u001f_\u0010t\b~,\n\u000f\u001d\u0011\u000b\u001d\u001a֧hWeQ$\u0005`\u001cY\u001bUƎC$\u0017nH+!v!֫X\u0019Ê\u001a\u0017M46ū.JSe\u001e-~=ǍZs\u0016\\WEx\tKq=`)B34Bs\fjly\u0019\u001b5\u000b&b@Ri\u001aI\u0015RFN!ab\u000bsԝsTKV6br1Ql7/'Q5p\tj`kheH)_*,bG5-58F\u0011Q!=\u0005Vc/b}bs;Ex\u000ekd%{nZ\u000e|\u0005l[P~=edC\u0019cfg\u0000\u001b72O\u0004عy]v\u0011S~Z\u0011?ݝ`\t%\u0003bF啖ie\u0018ghl͢3\r<\n\u0006;d\u0003V\u0006˹\u001bP.3tP<AUȨšQL#&=qt朾BN\u0007rZV\nT\u0015j\u0011SKC9 ub\u0015 LTCjjf\u001b\u000f7\u0000C\b\u000b~YG%~)VhH\u0019\u0015\u00069mz\u0007T\u0010giT\u0011\b@\b'\u0001\u0010j'XzI\u0011\u0010\u0005\u0002d@У6 \u0018{\r\bT\u0012R5\u000b!sݻE֊J\u0019TZؽVBV9@\f,nt@+\r;mRw\u0017' \u00073%FpG\u0011C\u0005䲯%x\u0000һ\t\u000eK@\u001b 7 yˤkd\u00009E\u000e0@\nm@Yx\u0003HeMvT`㶳`V\u0017A9gm}˞\u001b\u000e4\u0004G|\u001ac3V|\u0001\u0002t:N \u0017\u0012T\u0004}\u001aŻ\fh\u0000\\@\u001ba\u0002Un\u0002H0\"\u0001m\u0019e@8\u000ehe\u00009\u0000\u0006\u0004gWT\u0018M̜{\u001e&63ʻ9\u0001\u0016)Z!j6\u001fi(cFc\n*NrE@<`\r\u000b\u000e2\u0001UQ\u0000\u0013\u000e\u0004g\u00070\u0007\u0003<\u0002lN8\u0002<<`i6\u0007,\u0000v%rA+\u0010c'`\f\u0002X!kM>z_'JOYGNeG\n>+\u001cJLN\u00149J\t&\u0007Tfr\u000eb\u00006S6|8\u0004[\u0001\u0001O/Q**Ղ\u000fu\u0007xgU\u0000|mh\u0001>h\u0001@)B\u0011U\u0011+\u0005BZ>it[V\t\u000b7fS\u001b\u0018\u000e\u0005_c;~&WaU}\u000e\u0010\b\b\u0013r\u0005T\bD\u0015<\u000f@\\*@<\u000b# ^RW 4г\u000bb\u0006\u0012\u0000I`\u0004f=,\u0019.5`alOJG<\u0005o6QiL\u0017\u0003e9_+<d\u000b4-?\\|\\kq@\b\u000eP\\\u0004\u0014\u0004Jq\u0002O\u0002}2yY\"TGTQ2.jlߐ*gMo鰯u\u0012\u001c5ُ\u000bq?\u001fa\u0016\u0015\u0019|\u001az\u0016\u0011ՏuYp:x\u001aARo7~rn~\fr&>1󕴲Zz\u001f\u001drs\u0005f\rn*>jkk,/ի?ov\u0007OԂO⭣s'?ߜO\u0006WJ?鯸$V\u0012Tdbz}Տ7c߮v,|.P\u00173ޗS,\u001aOۥ#;uC7UG5hv\"k}\u001f\u001c%\u0013\u0010Wr\u001f|b\u0011̊?ORǏ^UN ~\u0004:\u0013\u001b(5t\u0017[g\u001b?9tag\u0011v?´\u001er\u000e־I`\u000esк\u0001>Z*6\u0011tyd%AE\u0017U4\u000fz7]vj8v\nO\b6\u001bY&*g?<\u001e-\u0002_L-<xg\u0019r\u001cw\u0000\u000f볔\u0015r;છZk|V'X\\B^yH\\وَfPNGc\u001fSe2\t:c|-b\u0016\u0012'M4dϳ\u001a0Ϥ\u0014\u0011O\u001f6\u0006Wsl>ݏ\u0010xYq\u0005\u0015k%}?\u00184\u001bѹ4sxd\u001fgāxk^1\u0016r\u00199w?|\u00040\u001f?RM\u001f\u001a瞙Cݹ\"\u001eJ\u00148(\u000eٶ\u0017\u001c}ZSp<jP\u001bG=x+jâN#V\u001a\u0006>\u001f\nncyХg\u0018rT}U@zzpTs\u0016\u0005ɳ\t\u001cD:zc;u\u001e\u001b}\bvWɶ\u001a[(7hfnJN>\u0013>w3s_^zp_i6&\u0016(Ѵi6ck-gڛv;ttⷚӗw: cgv7\u0017ۢa[)\u0000]-\u001ax]YO\u001b\u000b\r|\u0006P\n\u000fUY_ްQ?ѐ~-kK9Mm y:\u001dօe*\u0017Ү!#,lKck\r&e+\u0005w^\u001fڴj<~\u0006P\u0006T:Zs;G\u001a9\u001e\u0018o\u001cfg\u0001!`ۭKQPp\u0012O>l:\f\u0013\u0012\r\u0007υ7at\u001dp;)3\u0016ږBjje}[F\u0018M/NW<j<wi$SrDU?d+\u000fVdsΕG(ݲ#h\u001fƴva-[ePhY5\u001fzGڍ}\u001fgu̧w\tV\u0018s5q|u\nv@Bv|`U[*<JXvIaXpbZbem\u0016Y\u0010>X\u00058N˔\"rƄ\n\r~9\u0007okŸKf66a$eFݭ\u0002y\u00159-7S'T=]\u0015k/9\u0011ٞbigoȩU>鮹t߬;\u0003cgu&F3X\u0007|\\ӷZ^XkVN@tyJM^\u0004Y-\r\u000ezXH*P\u0014\u001d៩_=_\u001ef&\u0001;\"*uw(mi[*]4K1v@6ݙ\u001fˊTM킦:\u001aH;AFjYۖ^g7!JJ[T&BS\u0017R1B9qA%Bƕmś`Sx\u0007]\u0006c\u001al{+okN\u0016v\nN7w˗'G*\u0006ANNY\u001f\u001600\u0003TVj^sRR\u000bFZ2,l%m#*-/,¢.nf$n\u0006,OZK/V\u0017O;568◩\u001e=wq^mBJ~fPL]\u001eM}\u00003Uzg\\Iu[29uY1<OFrVrF]iRM-7ۈL&zN[)AV?M(\u000bI\nX\fF\u00122+ݧ#\bk~sOP*耚wuq|_z;I=\b%A\u0005\u001e\\Ng\u000b*\u0012CjLEl-Sį#G',t duɟP44\u0001uX\u0013q>\u0015>K>U>Y?Mn^\u001cm=}t%[\u0017)j9&Ɗ\\@\u001bgioq{\"Q59S\u00199K0<ܭ\u0014\u001e8q\u001e\u0001MQ Y0ܛXz\u0019\u001d7\u0004Pk\u0007cQ\u001cF]0\u001fkwZ~X/[e1lP]:TukSY`:ߔ^Y\u001aƓ8\bmz)wf\u0018ףǟ-96\u000eJ-\u000e\u000b\u001e\u0019\u000f=I_t\u000bp5:'a\u0001x\u000f\u0012d\u0004\u001a8\u001c:Gjt\u0010UǗ'W\u0017\u0007oԹ|<j\u0007\u001cnWM`d%N8<k|$\u0005W!Yj\u0012ʦ\nŌ;(J\nG[֐u\u001b>=)$PrS\u0011Jd\u001dٷIl\u0012\"S!Y\u0017L:7TE'c\u001dݝ4w{RoJVl\u0017.ii{\u001f}߰CbS~3f&d\u0014=Syc8;Y<%-fzsɺMI<X\u0010J\u001d\u001fﱈ{z\u0013g+\ng\u0015\u0002g{#A{>Qx7#Fs;H\u0019\u0018?\u0007B\u001cTcǔ̪pBpX00/Dn?QZy[t\u0002\u001e%f3\u001c$b\bU1ڮ>z\bpvGLk{3S||\u0018hdb\u001b(&ؙP|!q\u0018\u0018W\u000eI>)k\u0012co\u0000xXkRӞϴTaA8jl׌'%Ѫbt\\q\u0002c\u001cvKq;ph3TJ.\u0002f=FGWbjdLs\u0004y\u0005:\tM\nHUĜ\fl\f:\u0016\u0012]vX tq;\u000f[/o\u0000FeO\u000f,4ԂVd;+frpzG\u001c\u0006\u0003)y9w(恎\u00074Z@gD\u001dWD,}c\"98,,VX@:p<&LX\u0010\u001ak/%[3f\u001e+>;1];ҩ\u0003aݤyGv|lZ?co19@T\\<⁚F\n\u0017Eh]@v1i\u001a|y8s\u0011\\M(娴W\u001ew R\u001c\u001678蔊\u00113\n\u0005r&BnA\u0014s:Zd[\u0005\frN9lv̇>\u0014rf8kq@օU\u001f\u001fgwRY\u0016Ng5V&\u0018\u0011\u00152\u0019\rң^GQ[l\u001b\u0003d(\rE\u000f~\u0013E\\8jəqT*TlܞqiS[_1;\u0019d<6\u000fd$ϓA\u0014eR3O*)t\u000ftCV\tA9@RƤ\u0010:TAs\u0001L\u0010\t;^\u0006`$#&x\u0000&\u0013\t'\bʠxq?a&ߵ\u0016[csϟ\f\f\u0003G2-^\u000e\u0016]\u0004<_(\bj<Ȼ\u0013\f?MF\u001dBK(\u001am@l\u00007c5!\u0005N..\u0007\u0001d\u0002m\t.\u0013{\u0013}\u0012\u0001S\u0001^v\u0001nk'\u0000Dj\tt\u001f1ڃ:hmعd-elk\u0010[s=T\u0001?huA,3m\n[|\u0007H\u00032\u0001qߓGZ*AXH\u001c \u0012b\u0004\n ӹ Ao\t\fHp \u0000O<1 \u0003\u0010+I\u0003:\u0003X~4\u0010\u001a\u0003Ҍ)KibO؊hAZEk\u0016GF\ndn*UWg7@Alz\u0013s\u0005\u0012<`@Y\u0002* \u0001{\u0019Y\u0004!>\u0013\u0002T2L\u0007Pm\u0000j-\u0001Ӏu@߳䣌cɮOEP^MV@]\f%P\u00032h\u001fn2*OAv4G\u0006\fU5>\nӅ\u0006\f@\u0004\u0014t\u00150\u0000\u0000\u000esU\u001e0-\u0003C\t1`\u0007\u00140y\u00190\u000e0\u0007\u0001 bKj\f.[ًٌ7\"ߟSX[etЦ\u0000C͐3\u0018`b|q\u0013N\\aQ\u001f\rn:`#\u0002k\u0005\u001cz\u0003Ω\u0001<\u00017\u0011&\u0000p;\u0015w\u000f\u0016pex\u0003a\\\u0004ܱ(FaC7iKu\u0000\u001e\u0015\u0017婗t\n\"\r\u0013O\u0011A\u001b\u000f5n&+6\u00102!\u0010\u0012\bw\u001d9&\u0001Q\u001bX\u00180\u0010\u000e^az\u0005bN\u0002qV\f(+-.ip\u0019|r\re\u000f\u000b\u0002^IMSB#~\u0019'~M_W|~S{i\u001b\u0000\u0019+\u0014\\z\u001d\u0004@@\u0005 6\u001fi\u0013*\u000e\\NO\u0017B\u0006\u0004o5o@T\u001b_WP\u0002p\u0004\u0011!σ}T\u0018>Cu\u0019~۝վ8H\u001f\u001b7Xv\u0017Z]\u0016\u0015M\u001a\f|cz9\u0013\u001b@f\u001eaZGoBeEhS\u0019ﺸ71\\ô~Y1֥z9t[<<svKDMч\u000fõҭ\u001c-\u0017{Ux\u0006oWC\u0013wc%'dૠ<\t\bތoz&W\u0005'\u0013Np;\u0016=\\mR\r,L\u001c\"[aǥ\u001a]D?o\"BJV׫ؾIǆַY?\b\u0014_I(_G\u0019\u0005r\u001e\u0019\u000f\n\u001d\u001f>a;\u001e\"7lS}u#oVWԜ9-\u0002_\\k{!Ux\u001eR6:{\u001e3z<5^j4a\u0015\u0013'.N\u0005\"͸Q,\u0015Gq\u0013A~\u001au89\u0017HMI-UZ?\u001a>{\u000b\f\n@uj<@#+sТ\u0018\u0004\u0013'\u0003\t:+FFXZEb?<5=֠A\u001d\u0017GP\n)4#k\u000fM_s\fZT轂\u001d<\u000f7h_ԟ?jd4SOԸ!~a\t\u001a1\u0016\u0002C\u001f{\u0013f\u0006ʏUv$}h7zfs\u0018vKoT ސ\u001f{\u001eﷸJ;sϗn\u000fz]\u0014?Qoq7g\\A\u0014\u000eBkʨaRWtÇWxBJ/T؝\u001bk7\u0003:\u001a\u0006w\u001a\u0018+\u0011>u*UױkB\u0019喝v݌41M\u0006Mx~.~_\\+i qMѼ\u0014hqt`j\b\u001f\u0019WНk\u001az@\u001f7Ah}TP\u001eau\n\u00153}e{3CЄW\\\\I-\u001a\\߯wrZ\u0018NsҨ\u0019^\u001fA٦|ĦG4qB\bՙt,\u0005N{F]I\u0014)UlF7if-(/N}jaݹ:Nt5bo6\u0012\u001czszW;b!_\r\u0014\"!\u00046*`VN9{|4[\u001f\u001d;u\u0010k):MT\u0003֨´Y]ɱ\u001dJ<\u0006lN\u0014hTL^kc\u001fS_\u0019`s%aʺ]ujnw\u0004\t˥8*d(mY6j.hV3clȨ'SCIo\u000fI_sW\u001e3(0׭튶\u001e]/z҇ܩzqs}f˯U`ɰ.0j,Vj{Z(s\u001956p_vѩ\u0005ּ+Iil45n\b.J1̖\u001ek,\u000f[<DFcM\r`\u001c_JÁsԛ9Q^56v5N֜̕&:\u000f^\u0006~>\tzKi65:ujcT\u001fNK/)e魌\u0013L\u0002sCI\u001b<{<l)\u0017'TbQZ\tUQ6\u0003hL2\u0015\"uZ4B3>*<ck\nuil~gv\u001exCͿ\u0017M&PU\u001cd锅++%ME;vJzx䩖\u001fٝ\u0016UBAB\u001bI՘X\u000b4&bIO\u001em森Q/,\n1\tjnArW\u000bJ~Ykin,eW\u001ax\u0004=Xd\u0017lU֤CΜ\u0016J\u0012\"\u0012]\\?1QW*мG2R9#\u000eϜ3\u00057L\u001a\u0017<si`0\u000b޺L;<tݗ\u001f&\u0002&n\u0006;?iRip\u0014}[V|%L\u000e\u0005\u0003b\u001dQa_H-y<5yVx\u0010=c.h=}\u001e\u0014\u00062Ҙ<+b[\u0010\u0011i͌/~+W\u0001\u0006Y}Ձۢ~O駁/9z$Bs$UT땵5?AuwxZ\u0002/Yr\\0hNK\u0012z\u0016?\u001d<Cw\bG_\b\u0006\u001a\b&\u001dU3C,b\u0004\u0007j\u0012\u001d@b|&j-hfF\u0007nTlיݪ\r*_ix\u0007%j\u0016fBݧFI\u0016<;bv\\7͟؇%0WMqgޞ`FZN`49\u0018h׫QܥMY[{{2F\u0015X\n¬O\u0014zux \u0014@./F]0`\u0007QԨEh\u0016LSJ\u0014&J}F;c1\u0012]\u0001N&B,p\u0019y]4D(RalxE:K\u0018jJPC\u0019+Ah\nAOI\u0010 \u0012K4юL4Z]{n\u0011کe\u001b\u001e&~\u0011\u0003ÜZI\u0006~eK\u0013<H5e3\u001eS>D-ɑ*?.\u000f0!r]b\u000bd\rSdq3]7e\u0013M\u000f\u0004oWGa\u00179|S${1ݱ E'`D|0L\u0019\u001f#\u001bܠ\r\u0000ێUta+`xv\u0017zwOO\u0007l@U\fO1Y+\u000bK\u00121;\u000foD\u0005\u0004i@9=Gq)<vN\u001aeb\rw\u001c\u0017E)O\u001e\u001da\u0013-fgt\u000f\tU{\t_\u0014MN\fga֥7d6Z3`U7-Vp,aJ>\u0015Hy=;3C\n;\u0007Y\rp>.}\u0005rYtlѢA\f\u000b%t\u001fPUZ#F=B`\u0014f\u0007)C,N*V\u0002\u000e\u0013\u001e1\u0019\u0013©糗f/k<ڎmc\"e瀦\u001b4?2&G$>;Xpku-C#\u0010#G)tA\bl\u0011\u0018z\n4[.ɵȡ2<z=s\u000eCjßq! \u00056d6Nm\u0018?3ϼƱY];ò3.WY7.n.2MF<\\\fW\"3]\u0018UY`E@}l\u0015mzR(ʫGy.[\nE 3H2(*\n(!=>ߟgF\u0006nR\u0011M\u0007F\u00002\u0002^M\u001cw\u0002qod+#̦sRޑ\u000ez\u00119\u001e]Z 4\u0010y\u0006IC~\u0010\b{HڸȞk\fqk\u0006\u0019\u001aՔ\u0015%Ha-ǵ`oCk(U\u0017]^\u0019?\u001fdD8C\u00000Hg\u0013|l}\u001f\fΧ{Z>\u0007\u0007~\t<J=.p.hpJ#}CS=0\u0013\\%&w\u001e\u0010j#\u001c\u0007J^\u001f؍}b;.\u000blD\u001dknc\u0003\u0005r\u001a\u0000v\fS,*Tc^k\u000f5Zn-p!^x@s=\r\u001dZa-e-*6\b\u0007\"q\u0001iU@U\u001fZ\u0004.ЀKb\u0002\u0014\u0011&)ߔI<_\u0017_SglK[iEM\\\u0015!T\u001fjBzG\u0016\u000f/\u0013ta6*'\u0007\u0000\u001dc\"@9\u000b\\*F\u0002T\u000bb;ra\u0011PU\u000b\u0003M\u0001ǿ\u0018T6\u0001`g\fkg\u0015bgO\u0000˟{}˚-\u0003Tәs\u000f/E\u0010A\u000e\u0011u&\"\u000f7\u001f\u00024,\u0000}\u0006\u00189qD\u0001}Q\u0018H_y\u0017\fQ\u000e\u001d\u0002z\u0000_00@{$\t:7'Αd`LTBon6l\u001f\u0006|\bke\u0018\r1\u0001Τ>!.\fEu\u0001le\u0013#8X^\u0012ք1T$Fx-Y\u0018\u0000z\u0018;\u0019\u0004h > uwx<+:\tDmwoD\u001blb\fH66\u001a7t\u0012?\b\fڱ4\u0002\u0017:.s;_\u00183\u000f\u0000w\f\u0018\u001f\u0012p\u0014cZ\u0000<5cLƀS\"\u0010w\u0014\u0000\u0002.\u0000w2w(ouې\u0004s\u001atIkM\tTMZO->6TnyEG\u0006\u0017\u0014ggLb; O$\u0014#\u0001ePۊ@:\u0010&U\u000b\b\u000f\u0004\rǘQ@% <r\u0013 <\u0017\u0010p\u0016\bk~\u0014BC*Z\u000f.U\u000e%geAMf\u001dOE\"<z\u00137 \u0000q߲8I\u000eHʽ\f$Gu\u0014\u001d@\u001d\b\u0004dz-\u00037\u001ak sr\u0006<Y\u0004NLS1<|Y+ByOuzɩZGnh{\u001dU/|\\\u0014rύNܛ{\u0013L$ZG@e\u000e~=2(`3ޣ>P+P\u0000Ԍ\u0002*Z\u0002\u0015QH~9wy{\u0007Q\u0004>~e-~\\\u0004i/sh߈&>#>{\u0013_Oos\u00054.s\u0005Z\u0007\u0003\u0011_\n\u0006r\u00034\u00009T\n\u0002\u000f\u001ag\u000fI\fH\u000b$H\f$1Io՛\"Hpt{ {k\u0006>~{sGZ\u0011y[\nVu~z$!AM\u0014ލs}m}Rѿ)\u000eUS\u0013Yc$\u0019?ޤY0<=\u0007\u0018g\u0007T}wsfnK6%0/\\C].a^\"E^A9\u001fjOÓ\u001e.7kw8*\u001b\u0011:\f\u0018\\\u000e&&6DMM\u00072]-&oS\u0015\u001fP\u0005ߑ:߰\u0016?D28\u001f4l{:f>Σ<\u000f\u0003\u0002c\u0006;B\td'8p\u001c(vmve\u0015p!v:\t\"=\u0011w\u0018\t\u0013>wsL]#\r[+vWA\u000f\u001ervd]&2\u001aP_XYխfVZ-\u0007]|q3L\r\u001c\u0019.\u00196\ri-\u0018hN(\u001f>\u0013L\u001fy|C㯆:]?U~\u0013YvÌ\n\\2\u001e[\b-\u0007-\u0017\u000fZ-uN\u0005Ts0ty¬i{쒴3:;\\{$\u001da 榃g\u0019޹?6Nx$=d\n~\u0000۞Oݰ\u0011\u001eeG5[/\u000fm(MZkiwњ7e$\u0017C܎u4C~\u0015cc\ro8Cf\u0018T2\rBKnU0p_EWȳw\u001b\f0OMt\"Q<\rW\u0019N+\u0010Jt%\u0006驵8>[*<q6ɲ1xzRp\u0010`Ynhѣ.\u0019rCh;?qM{yD]#H\u001e\u001al\u000bZn\u0012j8ˆw<j\u001e or\u001e\u0005/\\\u000fAx\u001cE=#Xc\u0003dzwR}lk\u001fjj[\nU܁4Z\niNEMƎ\u000f\u000buzjyXrjP\u0006%SU3ce`wMeP#?0T.gO0[7n/nʽ»\u000bdps݂\t\u0007\u0006_Kuju|j|-ն}=լiR2hf[YXԬʥR-UOi\u0015smf]1\u0004?b4t'\u0013wV+\u001dlP\tUNc\u001eM]3Ӡ\u0006%7#?ۗ];a\u001e\u000fDe{r\u00150}Ja\f\u000b>2S*e4e:i%\u0002\u0019̺{\u001eiݕ\u0014VpBB[Uh|N.|泻\u001fX.vV\u0017VVչRx\rQ^ej!ٻ\u0011Q\r[jozN\u0007+le\u0015;ѡ\\G\u001a{\u0012d\u0003'M/pŽ^\u0016qA/Y\u0010wZ-|\frB~\u0018x󋼑T\u0003}:?\b_n\u0006I{x)ڝKc͹i\u001bb\u001d>\u00045UmXLD|30X\u0016y\u0014Dv7\u00069(\u0001&_ytNNDcthF2+SU-\\nEfKL\u0017D\r\u001bb\u0007S}\\o|~x@\\;Wmb2] \rn^F\\\u0019Agg\u0014@l@K/ߨV1PZÁ(᤬GjDcKq\u0006wQ=>n\u00058+t#Y\rGËt\fŬֶ1Mcm\u0007R-ճ<?ߴNZ蓹\u0007 Gv\u000eЏv\"w@ȧVYV\u001an;\u0016rg/Ź[)QY\u000f}gK\r\u001dZx!\u0017V#.\u0006'\u000e-\u000egك8d8g\u0004n>sQPzThi\u0010<H~n\u0013\u001ck]\f陰R7MSSRk=\u0019Ee=˝\"\u0012\u0003KKZT\u0013'*ՎʿBqWy\n\u0017\u0017i/r\u000b4ƛI G(;j_+\f7I޿\u0012R9^rjܭ\u0010+;j}odO\u0015\u001dė;Gr =Df*i]~%Mk/E-o1\u0010a*`lEHoeb.:_\u001d\u001e7ζ$GR%>Zkv\u0010T\fG2\u000b\u001b{fBisN\u000fSj;{=WS^A3+`7h[fTY=A\u0014Gq\u0016`LHok~AU<vRz\u001f\u0012B\"G\u001afa\u001be\u000bsP8ï<Ç̜7\u0018ĸxf\\c\u000eFN{t>YsZjXfJΪ.L˾raQJN|M\u001c]j`:.o+\r8{\u001e,8\u0019El}A>,3dCm1.\u0018\fhs1wn\u0014B\u0005ݹNl#h\u001e:E\u0012It\u001a\u0017\u000b\u0019jʸ\u0015fO1\u0015\u0013\u00176\u0017d6XVۺ# {B\u001f\u001cy\u0007\u000e\u001b\u000e˼\u0001s\u0018\u0015fk\u001bF gG|{>iǦi0\u001d\rU*8K6=r&rXa\u0012T\n1\u0011K=b\"5$\u0004i\bI\u001a\u000f1@\u000b}a\u001b\u0016y\f[kUgF̌p1AmH_wrRsi8jb`N_čKw У\u00195%uE2=\u001egwr(Rd\u000eH\u0012*21q\u000ee\u001d|^x`\u0001\u001cM%l\nhfeu \u000b龸W\u001b&[\u001d\fxծU\u0012$J]D';MTj-N.WWtX*YmA'sݐL91R[-}\u000f\u0001|txyBq\u000bX<i(bD[^wң)iQff_]PzZ\u001eS~'FnZ9^.rS#H\r5'{\bV)ʄ\u0013\u0016v|I\u0015[8/vu3x\u0011\u001em\u00143w~?a2-7cdx#h\"\u00143GхH=\r\u0011bH{ {\u001e]\tݷ6h\\]\u0002\u001e\u001bŇM+~-\u0015xS~D΃\u0016\tm;e\u0006_7Qf=2\u0007{[ϸ;)s0H\u001f\"T:(촴J\u0017\u001as\u0003q>Wu\u00193\u0011lP4<(\u0002,A^\u0000GI~\n\u0019k]߽-V>(\u0006o0\n lV\u001b\u001faY;MN6^e̱7\u0011y({\u0019\u0012cLG\u0000\u0018\u001eJ\u001a6nWA@w\u001aQYNy9=PE\u001dR\u001a\u001b)\u0007iq\u000eY\tP3\u0003V]O{w[\u001fjcN<%rr\\_&M\u0015g\fL\u0005h\u0001wW\r-\u001dmLYvBz\n\u001d]6Z=@L\u0018- {u\u0006\u0010\u0014cc\u0001b^\u0003bA\u001e\u0001я|\u0001b/\u0002[\u0000юOP\u0001a_Y\u0016AY6\u001fI\u0006={?%\\\u000eS^e3WdW_\u000e\r؀5\t9%f=Fۍ\u0002\u0018\u0003ȭbx\u0018\u000f\u0000S\u0000y.5b|&܌n\f gt\u0005=a\u0003\u0016\b\tܰAE|o}׍V%R\r{\\5\u001elXP!pbIPExizdQ:gR=\b\u001e)\u0017\u0012ݍ\rbT'1\u0018\u0003e\u0011I[\u0003\u0015\u0001@\u0018x\u00014ʀz:{@m\u0002y3Y\u0011{Q^G\u0005B\u001diơ)WyK\u0012|m\u0006o\f{L7\u001cg\u0005a1\u0001|%~W1\u000b\u0018\r0\u0017\u0004AXYI6`'Fx1\u0001q\u001f'Feq\u0005:5\u0000i{\u00042\"m浘_~h\u0007B\bl+2\u0004L>Ӆ#\r@\u0006\u001c>\u000e\u0001',7ɫo3\u001c~\u0003@\u0013gJ\np%\u000e<\u0003n\u0015\u0000WK+x3\u0015x\u00062\u0000Nmşq\u000f^\u0016/fUCfJ?A;ÛKxI=a\u0017\u001aL\u0011tE2}Τ\u0013\u001b[\nxּ\u0000Ժ\u0001>\u0018=\u000b\u001b;\f\u00107X {\u0015\b\\\u0016.\u0010R7l\"\u0011\u0010\"\u000e\u0004d\u00031j跐:0Mt\r,0X%\u001aݛG\u0013\u0006^\u001ao\f\u0005$\u0010d,\u0005\u0004__[#b#7\u0013\u0005\u0001-\u0000qYׁܔ\nM 1\tH-\f\u0001\u0005@\u001bFn \u000b\u0017bƋXz>\u0016V\"Mi\u001aGDn9c,R{N$DL$\u0004\u00191\u0015~\u0013W}\u001fZ \u0003]\\7@AF\u0000(lQ\u0004FՁbA\u0018O\u0004(\u0004\u0014o3\u0002J{\u0004\u001fd\u000bh\u001f{i-|Bo\u001b\u0002DR{\f'\"\\e?I~#&~ZXKo7'!GL:6@C{bmnpk\u0006\u000e.^\u0011(A\u0003\u001dc<@g)\u0013 f\t\u000e?!\u0003ILoxC}S:O(BRd\u000elX1#\u001fV:?\u0001.\u0006Fۛuz^noW\u0014dԾ8XV7K\u001a\u00127n&˕\u001e\b\u0019Hd$71 'UΈSiG~;ͭY\u0007s\r\u0005%}%;\nv&}a&>Ȁ[\\\u0018N|j\u001f\u0003t\u001ewb?=gy??\u0019\r_q\u0012.\u001bHs_.DCݟbYB\u001arnҸ99g7S\u001d\u001f\u0015aԩ>݌;ħ\u0011փ\u001f[rxo\u001b\u000e\u000f4\u001e+]DVY\u0005L|v_b\u0002d>\u0015y)ʉțd4@1\u0001Kk\u001co֣8\n\n8k2G<C<RDR\t]x5}7W\u0001TOǩ/ZZ{\u0001uk|ֆf\u000f01aWz\u0002\u000e\u001b:d<$`00\u0010$U+V\u001f\rKu*MF[X\u000ejȟy/fHIMə8\u0019\u001c\u0004Ì\r\u001f\u001d\\^\u001b*\u0017[\u0003a5cCW>Nݰ@]rƫU\\fu-8z':1iA{}..\u0002jRomT$*_,\u001c\u001d\u0006<\u001e7|\u001f7\u001e2A\u0005\u0001d\u001aAe:\u000e|\\U\u0005ڰ>Gk\"T˃{\u000b\n}9K7\u001f.Y:\u001e%datmGg#\u001d,N\u001cXƞ:6כf6zKR!7}w2=/P\u001c(s\u0000Ҫ5.JV!m3˺7\u0001N\u001a`y\u0010Qi\u001d9_\u001dzQ\u001f_Բ1V-_͜{a XL=\u0005}xϧ߾{(DÔw;;Tk\u000bY4U=T\b\u001bJ<Zu57}\rk#>}}cUM㯊eQ\u0013Nd@Vy\n0H+#P_PQZ-GJٟ2\u0010R\u0019;\u0010FT\\\u000bל)NoR\\,ǡQ׺5W`\u001c\u001c0[zj;,WY>g*\u0005mzH\u000fJإ2k\u0018\rH\u0018ݯ\bY8Lj-Qۂ\u0005A_fa\u0011G{mw\u000eE\u0000ZSw}\u0006(L+Ɩ\u001aYй]{KrYZνT\tz\u00193<Io\u000egle\u0014\u0013e\u0015v@a^znr=~\u0019э6iH!T9f\u0014N3(Zw7=Jg[C\u0006rXk\u0017IUk|\bڥU\u001b>4WoQl&q9\u0015Dfs_\u000ew>Ks\u00144f7S\u000e\u0004Fέ猔bk\u000b誡\u0002VjJ%W\u0012\u000b\"\u0012{\u000eM^+tԛM;>ktĭW%p\u001c\u000bͥjpW*/.\u0019l@tm|ws\u000fki~bH5[}ʧz#>EAh\u0016le4tަT[H*qN\u0015m(\f\u001ae[\u0016\u001cO7kHnO\u001b#\u001dU_1_LwtZuA\u001f8Yɒ\u001b\"ٽfm{eFL \r֖>c}l=z65ƺ\u001aFJD(sT\u00186\u000e\n^\u0007\u0000|㖑,헭JԒ\u0002Jm\u0011\u0007\u001a\u0016\r\"\n\u0015>M4D\u0013Dw\u0003$]~7땛5R~Z&\u0010?D`E\u0011ಮ,2UZ2tlY\u0007,Ffxm\u001cߓy8茿h$\u00024\u0004XԖ<uyY3M3\f\u0010(~I\u0003\u0006\u0015ݛFבˁFȶ^\u000b*]A&wamQiF:㠐u\u0007xA'$Ӱ-V)x+\u000eΕ\bLPG'\u0001n!/~\u001b\u0019\u0019ܪp6*m59|wcTdi\u0012NX\u000e1fעT\u001e6=Ji\u000f|{nfө6A˰Z;U<{..NN+C\u001cr^N\u0004aY(B\u0000v_K<_:|\u0004U]p|e\u0011Ppe7\u001dbMbim1\u000fRcZ{Dܙ\u001e[\u0016\u0007C\u0016WnZ{\u001f`X닀]hjgXkn\u0006\u0012_4t<v9hN4R?k\u0017s͎#QQsUO,sXnf'`eL4_3\r+mR`Vԧ\u0014t \u001fa\u000b%rw|ܔO\u0002J!Ϡ+.^5jO\u0000FW]ٕʴE\u000bZ620S{+Bz*)Ou#\u000fm|Tȴ\u0018J\\¡FCK>%|[@uƓ|<\f_DRJG\u0004\u0011PI3g85Y\u0010P\"+M^Ȼ_EsN\u0018{&9\u000b\fi֞m`Zj)e\"?NzU\u0014\u000fp C=9BSia{Rjɂ|f\u001ep=R_Tg\u001an1\u0011K\u0016&Ʉg&Uđǖ*!Tp>*\u000b[v\u001fmm?&}8~ڀ}W+V<s7Hʧק\u0006\u0015⤄4zn~}ϱ.\u0006kg2qsd\u0013\u0005n$ӣ\u0004/\u0015!\u0017Ҽ\u0002\fs\u00072P(2;8;\u000eJ\u001du&\u0019l2;y>\u0016]?tk\nKA|\u0000~\rDݪ9SF&\\Μ?\u001a\u001d\u000eY\u0005\"|'Pl\u0015^v\u0010K'D3m&$Unv\u001dÃ~\u001bݔNCZ\u0017-3Mʰ\u0007\u001cu\r, \"6X/\u001bt19\tre\u001d]H\u0019ODG\u001dhv!=Z(<nK*\u0011wEK\u0018˙\u0002\\O7mOj3\u0012*6ވֻ=j~\\\u0015>Y\bx[\u001bc=C\u0000ݥjfx:*>UB\nFևd\u000fkk\u0001Q\u0019+fSIݽ**qߝVL9I7f\"cSzz6*X\u000f\u001dm0\ti^|%s1nVZ1I\u0007~\"._'^o\u000fAܠ|F H9}凔9,LmU\u0000`\f`:\u0000րXлۻU\u00149ޛ_@\u001d%Rh\u001ciͣ˹oޚ0J,3+4V\u001b\u00052\b\u0015\u001a\u0005C7SNe\u0005\u00052\u00008/bO\u0000\u0017\u00188ƈ\u00078!c%gS5\ni\u0001Y\u000e`]\u001dĞwk[\r}h(y>IijERW|JX?VJ\u0007\u001bj$(C\u001ae\u0013Mӽ()\u0002ʥP7\u0000A\u0019_\u0018aR\u0002\u0011?9\u00021F\u0018 X:\u000b\u0006\u0004Z\u0002c9_-__\u0017GtzƳգw\u0001Qu9\teAm\u000b0|/6[krA@\ba\u0006O.G`hE\u0011ٴ\u0004\u0000HY\u0002\u0001Ub_\u001fiX\u0018\u0001 \u0002b\u0010c\u00011&\u0006 e\bs\u0005Hz\u0002$b\u0015;8o@34 BmEd`\nQ9\u001eh`ř*3fA!˙\u001ecCr\b!\u000b\u0014>\\T\u00015mTbL\u001d@u^k\u000bYlcj\u0018\u001b\u0001P-\u0014\u0019\u0000\u0001j\u0005@`\b(Z\u0000*\u001d)17?̯Qq.u2d!\u000f\u0001EC\u0001闑%l2\bl{u\u001f0h\u0002Qv\u0001\u00061\u0018\u0005?`(q1\u0001q*\u0001&cƀ宀,ww\u001bЋeC\u0007\u0015h<=\\+~iq;\u0014Fg%ɗGkQf\r\u000e\u001b\u0019\u0013\\c_1>g:r<\u0018@a\u0011X\u001ec\u0018\f`g\u0001iƸ\u0001;\u0000`?Qy\t\u001d\u001c⏽\u0001^\u0002la\u0001HM~20jQ̿~ؽdjL\u00173O\u0019!\f\u0007\u0007Fx\b\u0001wd\u001bO$:0z\u0000^\rS/C(:\u0003T\u0005Bcl\u0006_V\u000e\u001ff21n\u0005#';s\r\u0004%P%w8f\u001a\u0019õ\u0002^eT\u0017P\u0012Qaa\u0005\u0004\u0001B\bM_\u0011XNրhdU =\u0013+ʍ1\u0003d=\u0018\t@m ^+ n7\u0019 FxGj\u000b\b*K\u0016\"\u0002&,qƆw<T$mGsN|?EIC\"&v$`K?䲘2\u0004Y\u0007Y\u0006jN\u0003ٶI<c\f\u0013F\u0000-\u0011o\u001a\bdW˛o5b(\u0013S\u001dmپnP)ɷ_k8FC;]\u0002iIwH4To{\u0007h܋\u0007V΁!:\u0005\u0011&\rh[\u001bКIo@\"&q\u000ego$!ɾK%*u)wG~\u001e=)gƺ#Φv[wAp\r%`Aasi{g\u0017:[g~\u001d5q~\u0006DCȧ,-!c̟A4H\u001c\u00175任+.}8\u001f̏ɇI1ȄY䃾=\u001b1,!\u000fk̫\u001eDֳܒs\u0013''\u001bաQ\bI\u0007\u0006uϮ\u0013<s7+9\u0013\u0012\u001e'\u001fL*l?qn6T&ʥ;mLދMz&u^\u00054\\>[<yr1[|\nsdLg4|Vq~\u0010\u001271&\u00032h,\u0011\u001d\u0003hq؏cKgjN[ꇡ_:|HcάgMÂWs9qP=a%7ٹ#6|\u001d*,4_޷tX\u0011|[5,X%I\u000f\u001dj'S\u0002\u000eWҭ~4TtB~Jgm-Fw\u0004h\rf\u0012_?u>P9\u000b@\u0016~WXS>4R,_Y\b*\u0019\rcKn\u000fA9|+'>ּۨ>|9)B-;\u0007Z{^\tB\u0017<\u0001ͬg&V̇j\u001d*G݇\u0006b\u0017\u0005:\u0001\u0007\u001aM;Q[v\u001d\u001d.G\r0>\u0012Om_\u0012o-\u0010_R w3gZ\u0005d7gGlŎSaFuFM*Y\r\u00164uR\u0016ɦ\u001dUߠ\u00065Wq\u0016\u0004\u0000풫\u0012\u001f\u001a\u0006>:)\u000ft\\ix\u000b˭f\t\u0015Mdm\n\u000e\u001bc\u001a5\u0016#=ԙQs7\"sަ^\rЩ<W֪b&a}/ǃduo\u0010άJK\r\u0000wH|Tcs][T,!5ͩLF7zjuܖjn|ϽaKVz\u001bu\nukA߲>E`iy椷eKKo\u001b5kja\u0018\u000bx\fk-:\n\t;7/Z\u0011y:ۗ\u001fwVz\bkʴpآ_?m\u0010*8_*F:zXc+X\u0005.jw_Xiق\u0012ve3Y$rhF0\u0005\u0001yL2:@rA\rTx]s*S!\u000b%X\u001a^wҊH{03ߍ\n\u0017g&2\u0002AaZ\u0005(+UĬI^\u000fàz.ȟ''\u0017HX\u00109\u0015rs\f\u0016>\u0015\u0017LMJ\u0017T|Z9X*\b\u0015~1\u0000;\nVHW]\n\u001da< \u00136k\u001ej_\u001cwbmX/u\u0018]rm%k#r-\u0005;sh4{f\f\u0001N\u000e;6W?\u0019aMAţnNB.\u0004,G3Q0\u0013Z1HTO,:{:\u0018L:Fw9ym\u001b\u0001`OVke>\u001dՂw\u000b^{3rl)OnEOVn0\u000eԪ\u001bU,C+I\u001e%r\u0003'aIb癕:OŒ}O|x՝]\u001f\u000e6y=,qI u|Y~qkvc[I<t7\u0003AeһF\u0010\f\u0002k󏮧\u0019Y'Ye\f\u001eol\u000bUՔ<KW_J]\u0016\u001fs CԱ\f\"\u0002'O\u0017\u0010Mk\u0011\u0016׬Y҈[\u0017#m\rz$hARqVo\u001cQ\u0019lNƓ|՚\u0006򪽹VM\u0013dK\u0017R\"\u0005?UDTm\bL-aOݔ@ț3#\u000eQAgkв;sDq898D\u0007a-Ϯ{\u00013q*S!\bP<lSb;;%^^mU1祀}rJ\u0002.4\u0004\u0005\u001e\\-ni\u001b\\\u0005\u001cv(g6l\u0016,\u00056;&ROiQU^Y\u001dlZ1u!gʿ,%;\u001dvEq\u000f\t\u0006pﺵs\r{Y{_\u000b?\u0015\n\u0004+Ec{{}DKc5;-I\"\u00104_iRY\u000eu\u001aKv>*㌷M\u0016'\\\u000eN)y\t佋[\fr7Z)GbhC$1smua#aw~\u000e:.l{RwvY\u000fre\u0012\u0017\u0019KS;ݖ\u001e\u0015\nuA\"F2;xnс=,Q&oR\u001d.oS~@jxݷ)b8\"MR\bb\u0016\u0018\u0016k\u0013OWk\u0000;|wZwrޡݗp~\\ӦVA\u000bm\u001e>\u0003qb5̞VC-pZQS +pZ'$b\u0011Û$rA\"R\u001c\u001e/ol!Îy\f]>j\u0006%.\u0005\u0004%:jK%n\"\f=\u001dwN\u0019o498Ū=j0es0g5+\u001a7H.[xR19;B\u0005]\u0010d-aH\t\"w-Dj\u001c\u001bD%<}D\u001a|ʵ'zؠC?P32L~\"\u0007>ぴ8\u000ey\u001b9E)5\teΝⱚ$p!մ\rz\"5A,vkX\bICB\u001e]\u0011vgU6,\u0015\bI@−.\nœ1̠x4\u0004\u001bq5\u0013e^W̠F\u000e\rq<ׇ>\u0007^+k*-TZƱrZ\u0006I\u001auBwMGl\\Y\u001e\u0014\u001fI\u000bz\u001a7,{W[F@@\u001cN\u000e>$g\u0002\r;\"\u0014l,rث9m,D7i,r}zI\r)\u0003\u0007Q\u0016V=\u000er9d̜'d]\r\u001a}[Xf#ܥ\u00199\u0011^r\u001cZ0\u001cuJ\u0010\u000em'rΫ#&Ρ!G!nN;܄q2(ýB<:ip\u0018@=ry9R,ϧǶ\u0002Fn\bPJT\u000e4\u0012@@vb`äb|FSGغ\u001a?:\u0015\u0007AYUe\r\u001d|\u0016Xf\u0011༘i)\u0005<ݥ8G'_\r4\"\u0014\u0002r6jjf*=j`/\u0000\u0005\u0013Ρ]\f\u001f\u0000t1\u0015.;c\nwd\tc\u001f\u0001$o>lQw}Ț7.W]<9f\u0017~%\u0001&z)\u001d\u001eQjxe)\n\"=}\u0006\u001ed\u000565\fE\u001a`^1QcLFA\u00000\u001fZ$ʭ8į:]\u0019`]-ޠ\u0003Y\u0001V\u001e?i'\u00003r\u0018\u0015ud<\u001c\u001f2t\u000fe};\u0016l_\u0011轿ncJ\\m\u0003~\rB\u0011\u0017\u0005\u0011\u001d\u000f\"\u0001\u00071\u0002j\u000b\u00166x?\u00006p{\u000e\u0005p\u0016\u0002 \u0000/_\r\n\tp6\r\\bɝ\fZpX؎en瑕[R}-H\u0006s\u000b~>vmi뵴N)B\u001a Ά\u0014\u0001\u0011\u0006I3D,\u0001b\u001cU\u00001A1A\u001c\u0010S\bn\u000b\u0000\"H11zE@[\u0001\u0010V\u0003\u0001!\u001ew:\b \tl]KU?cL}\u0017E`<9Ŭ1]\b\u0002ei].D]Z\u0007^\u000b*Sb\u001f L)Fގp\u0000lX1 _Z\u0018c~\u0003@\u0012\u001d4\u0001y\f#@nw@Nm\u000eA|0M?R\u0019@5ɑ#\u000f1-\u0017$ϳ!hsA0JE{#\u001f*\u0006OT\r@ۨ\u0017#\u001b(\u000eb4'1+@c\u0007Ѕ#\u0005bɈi\u0001ZoZS⏱L\u0007@I$UhVl\u0003\u001cmk\u0014-!=PAC\u0002-I\u000fO.&\u0015\rd=\u0019`voѹ\u0010k\u000f\u001e`\u000fv\tt%\u001fcw2r&L\u0004,Xl\u0003=`>Y\f-\u0003\u0000&`Jy6Zy9\u0017|v t{+\u0006U\u0016\u0018L\u0018D~\\\u0006\u001c\u001dǉٸr\b\u0017\u00121x\\c4ހ;.Ӏ{#\u0014Ѯ\u000exN<\u0001\u001e\u0001\u00128C\u0003{j\u000bG\u0002$9\u0013_EU,p~L\u0013,<|*5c*&&$rPj^e7H4_L|=\u000e\rf\u0006\f7K@\u0014N\u000f\u0016.\fDYр\u0002 2\r,\u001cO,9\b<}7\rs5$TRlc$p;֥¶7\u0005)=cE\":կX%\u000b'\u000e_71B+o\u001d9~\u0002\n͔\u0006ի,,|7M \u001fxc\u0015\u0003\np>S@zM\\`<\u0002瓲n& +8{IDDM~\u0005-ݦ\u0019P\u0019rbWC\u0000\u0005\u0002\r<@#q/\u000fha\u0007&X{P[,\toHo˛\u001fWD=H7v\u0011o4mɢ:r5\u0014վ*H);\u0017fP.N.<IKq\ftTx\b?.o\u0015D@\u0017'\u0012Y\u0001Y\u0007TaZ%M\u0006W\f.Lp[gxSx3\u000fǣ<\\\u000fu7w\u001f\u001ej\u001dߙz\u001c\u0003SE'Ux\"&\bIPÏ*]ȟR\\\fWS!K.k:8\u0007)x+<ăj{ș\u0016\"(o\"\"V\u000b\u0005\\\u0018^jHwr!ŧ,\u0016\u001bT<G{VI贆C@и~\u0007.Ry\b?FYd_yy/wPޜ\u0004چ\b\u000fy8\\R6}3y\nϖ\ba6;q2-a¬%\u0016F>37w\u0018*}{?N@W}h;J\u0011\u001cTpZ\t:\u001aeTDM\u001b1v\u000f\rYӭL<Wg`PDE\u001dX-\u0018Tm<\fb0JXUw}hzz!+ 9\r+tWNTe\u000eȾm_T[\u001f=SBtk}\u0016\u00075t;-h%H\f\u000evy7k{<\u001d\u00193ْAY)!_WY0s%;/m>n\u000f\u0001rYnXNd+UH\u001fv\u0017u<;0UVYE%jA\u000b,aY\\v3QJ=J\u0017sh<)([\r剗w1fڔ\u001c7m#K6@̳ѻ}ny\u000b*\u000e2\u001asLsV&ʩN}ݍ0\u001e\u001bA[ՙKYsŶ}{wx\u0012Vթb\u0017hk\\\u0016ʳVSF.֫bB \u000f]F֤\u0018\u00193ѡGibh\u000f\u00191NT>7Yz<\tjΊ]=jvOCuۖ^\u000eT\rrN\u000220\u0003,y+]\b(9GQ\u0004EP\u0014s9g=\u0017ݫ{k-@ĪH7\u000b:\u001eqW\u001dt9r\u0002\r2\u0017gw0\"\b[BZy\u001fe\u001b\u001dcgUj%Xtru\\\u001as}sPKD\u001bv^ۺB Wj{Aa\u00138ϣ%N\u0004\n|}r#\u0013vyl*Y\u0015KmYnY\u001c3I\u000eKzX4t}.caN:\u001fL\u000b<hl3d)\u001f\"z?&JXYvg-Y]jġ;\u001eGfB+{\u001eVY\u0015~Fe<cݍ[{ˢg0\\6\u001bQGi\u0013)\u0019A\u001e5=f:\u0003\u001dov䵰0lh^w\u001aOfc^(]iRs[7\u000f\u0013F 1q\tbfcx\u0016@\u0003ȴ])ml|D|t%n\u0017cx=0G8ӃtֶI\u000bw\u0016zx\u001au#E\u0010ςXmr9dc\u000bdݛ8\u0013\fUW\u000fJ7e2QɆ%u\n\u001aѳ\u0015b]5'\u001cv7V鑵Lw\u0011\fo%Z͘:dYk\u0012GSUkʮ\\ڻ4L/ݛa߁\u0005)8ZAM\u0011a+aP`!Kfz\t\u00053a/\u0019\u0016,\f\u0011KS,_DT:ˢBY\u0010\u00026\u000eo\u001e6r͒>hRk\u0016\\S-Aќ*?YZ6wַ\u001eEEB)uqfbn^\u000b3r\u0017\u001bzc\u0014*W3N\u0000\u001c\u000eb\\\\Y\u0007JW[Uj\u001fT\t\u001d/f#O¾,בֿ\u001cx\u0019ҒӨP)s>\u0013Xb\u0001I,\riB\u00103\u0002eP.>3siԒc?ůW\u0006\u001b\u0015YSaݝ(7o[l\u001e4:\u0013F\tjnCf5h$-A;Q^\\\u000es։70F~\u0007飣aJj_.=i6q__\f[s!s\u000bm~M\u0019\u001c6h}\u0010Z*P\u0007#?Յ\u001czO,:h(Aǯ>m ~20xW\u00170\u0001\bkwv?N^52J8\tF\tZ7[}\u001eS{aL\u0003(Fߟ5V64G6?>\\@uWL\u000f)K\u001eo)\u0000ov[\u001c\tCiT/J`NNR?U\f/,U\u0017Z&ZF\nd\u000bs\u0019HÜD\u0011s\b\u0017.\u000fӈzOvihCkBTbX`\u0002$&@I\u001dGwz\u001cȤi\u001co71,XI#l\u001d\u00068y\u000f[էQ|X%\u001fB*X\u0016뱆`fl#sAΪ\u000b](\u001eoʛ6ჲfƓ\u001c\u0011ꇄ\u001b\u0019EpMwfd\u000e_T2N~ml=̰R|XCCB+}\n\u0016Mv\f*\bZ\u0001{ڒh6jJi/E9vʓ\u0003V\u001en/PX&7=@e\u00171]\u000f\u0002g\u0017ر\u0010N\t\u0002߹\u0019\u0016+\rj\nf\u0017\u0019t`~V)*t3R'\u0018R'4\"_\u001a|mps(!:D?hj\bԮ!U\u000bR\u0010<\u0003sͷI/V?\u001eC8U#\u001d.=\u001f\u0012̶\u0011^8߱2~`\u0001}\u001dЪ\"斓Ӥo!u!cL&Ý`N{BOӡ~_I},M8Q\u0002\u000e\u000e]FgOt\u00026B\tbS\n劭)\bU8khܭ^35EaًPh\u0000MEQ\t\u001dЃq#gy@\u0007QZ'\u0004Q\u0014\rܜ\f\u0005K\u0011)X\rJajw)\u001bWS`O$b|q\u0007G8\u0017\u0000.vп2\u0017^H/\"\u0005F.gm|%\u0012\r#>mxLgipf\u0006Tp{<}A/z=\u001aOTjxEwݒ\r0y\u001cΧ\u0015\u0015^\u0016`>\u0003ble\u00052J\u0019\u001c6\u00050.xv\u0000\u0017ǵ\u001bVOO>\\\u0005f-{iY|\u0007\u001e&\u0005Kq\\}htK8$\u001eaD!(\\S)\u0000Ζ\u0018c2[\u000481:\u0005\u0016#\u0018x\u001e\u0001.D\bEQOth\u001d\u0001\u001c\u0000N51C\u0012B)]F>èdJd'\u001d+B1ٺV\u0006'pNo<Ev+TL\u0004C2!\u0014\u0005\u0018@\u001f<#\u0002<Š\u0010\n\u0010)WcLm@@X)FЎq\u0003\u0002v1\u0004\u001f-\u000bL\u0003Gl\u0017E\u0001|^\"]]\u00077Q9iH\u001fi-Y͚{w̨\u0003{hiӣ>VwFG0I\u0000(\u0001\u0012k\n1\u0016q\u0013_4 I}\u001aUc<\u00078\u0018\u0017 A9>+8\u0000m_\u00001x@t\u0007!G@D{eo\rZ\u001cgG]v+\u0019\f,F\u0019yv4^lE\u001f\u0010eUA[Ɂ\u0007\u0018g3[\u0004\u0000ec\u0012T^ab\u001f\u00172\u0010\u0019ßĸ\u001e\u00010\fW\bȷ;Nt3\u00177Q\u00019FlO@\u001a\u0013u\u001cMF}\u001bf\u00195j[4-|n\f\u0000S.\b4bKY@VfDN7o\u0017z1\u0012-\u0016c\u0007t\u0006_Ũ\u0001\u0018j\u0005g\thd\u00157ٍ\u0001j@\u0013q\u0012xv̦֯\u000bToiԼ7E\u0016k!@+U42`S_H~\tk+^ڌ1N\u0018&`l/F~(\u00010;\r\u0000f:\u00003r1>-f?4`|lo\u0005\u0018'ǥ~Ux\u0016\u0017/j\u001dx)ޫ\r$\u000b/5q4Hj9<MG4E36R\u0013pZ\u000bpN\u0017aԋq\u001c\u0003\u0000/\u0000W5v1wE\u0018\u001e\u0001\u00051#e%%\u00115+\u0002\u001c>\u0001\u000eZ}\u000bUf#BLv!72n-R<򷕢^aG^| v~\u0000;2\u0017x\u0012-~_k\u001f܎@\u0007\u00102!\u0004\u0007_\u0002!1&&\f\u0004'׹\u0010\bf\r\u0004qT;*՞dy>\r?\u0004*V0Br\u0015\b+\tOP9_/K\r[_&?K?\u0011\u0013/%$]86:\"Zd?\fv\u0001R\u001cVV@\b B\u001fH~w!}ef\u001a|yD\u000f\u0002[x\u0010'bۍ\u0019'b\"Q$\n'%-l`_\u0001e{@\r\u0002,\u0004tx\u001d?IbUa\u0000U\u001cԀ*\u001d\u001fVm\u001dI\"6Xg\u0017\t\u0012떸_\u0012\u001f\u001fOZV\"&#KM\u001d\u0012U[\u0001#\u0003Ci=\u001f\u0018%g\u0001\u0001/\u0000bLQel\u0019\u0006yLOrߡ\b6ppJrkI/[/\\q:uԀ֎:\u000f=\u000f+\u000b7&H$\r|d\u0013ȼ,\u001f\\CO(s+{s~]CFJj\u001f(?Hl>W\b۹r9lVǚ\u001b/>\b=as1-neJ_|aL[N2\u0014&(&vO5k(O\u0017Y\u001fyxih9rFgvM*me\rcѦyk1{aY\n\u0017gP\u00067O'\u0019M\u0016Ӛ\u0010#?\u000e\u0010c6\u0016\u0010[\u0003\u001c\u000f{v$\n!f\u000e\u0015U'Ogs<OJŻc{%Ed\u001eΠ{5)6qZ^F!:{\u000e#\u0019K=xXV\u001dR}<z=';'Vg]\u001dtr+=nV}&ݢs;D#R'\u0000[&v\u001bT?.Y\u001ctj}Ih1\u000e\u0000\u0019Fx?3P5\u001fkA/}E]:;.(\u001e\u001bVܬ\u0015\u0010us\u001b\u0014wMn?6\"!wiʫPڭ%jkGì\u000e]P\u0016Fťvp\u001e\u0013&~yUF@T\u0013lC։\u000e5A@O4?.\u000e:\u0013۠!szCZ[ٵQcաmUhjDInVХM\\=,B{Z޺\u0014ʍsph?5\u0017N=\u0017>咵41N\n48\u0017x/}~\u0012l\"w}]9S3F窝*.Zz\u001euҶZ`Jܹ \u0004~[6(E\u0003*佞\u0007ukaqOʛi\u001e=\"\u0007ד\u001dY\u0013\u0018|n;\bV\u001c\u000f[\u001f,ϥ7ʆ>P3W\u000b\u0016=\u0014cPAga9`Qp\u001d~C\u001fΊmzęR\u001aM4\u0005h5]\u000fJ\u001fs=aJ9sB=O3ǽcGY=ONVLۧ\u001fsf^\u001cX<X|$Knf.]\u0018Q\u0001\n}\u001et?4\u0015\u0005LRLė#㑆!ܶ\u001e{b\u001fzҖ\u0000ɞG1\"%sYx\u0019SV/Ҷ7]U\u001bNfxia\u0010tW\u000f!`\\ޠZC[5\u0015T\u001du(Y3=\u0016ryg@9~fσMڅ\u0003WlWҟM\u001e'4t\u0018Ie0 \u001e\u001eX[ێTL\u000bsmI=n95tl>-F\u000e\u0014\u001f\u0015U\b\u0006ԞKP<\u0018*FÖ\n\u0001:\u0007JНz\u0003ݮqS.*S6|R\u001eJ9\u0014\u0013=3\fOeU';SжbI\u000bH=LjM5rG}XL\u0015:nۖ\u0006G^m*Jm\u0016m3\u0013tY\u0012a1\u0004}K\u000b6S˛\bUl.c\u0016܊`[vh˶n5cbUW*m\n\u001e4J(*\r\u0010\u0014\u0014Uvq,МBZd\u0015t\u001e\t1HsΚ\u000f~!(޻,l\u0011WB'KYq9\r<h\u0004=\u0015kުe:T\"\f[*\u001bp-\b\u0007,}Fg%\\֟|\ndţn\ttڴ{\b/犐熀ݞ9~ѡ}|Un8\u001eݝYŘ\u0013\u001ct\u0004ʪ3y`\u0010Z.|-8:5b6r̲\u0014\u001f[\u0013\u0014f4˛,?YnNy)܏_\"b<oBvOu\f\n)}\u0007q\u001b\f\u0010\\iA\"EQuV({6S{}F\u001dt+\u000eimSS\u0010(UW\r,4\u001ai'EfكKft\u001c\u000bvjW\u000bK_+-~\fT D;5?^^]dE?V\u0011\t\"\nWާ\u001aG\u001b'JJ\u0017T\u001eL\u0000Z tK,\u0019cx4n\u000e>ҬW!\u0007^ZĚ\u0018'8\u0010\u000e<^i=P'Nv\u0016/\fU|vT[\u001dSYիFQm|@Rz.2EiRA@Qɽ׆\u0014+o\u001aGFa[Z\u0017:;q\u001aҿM\u000e&oYLO\f\f^>F\u0013/z37\fi\u001es6>BCxCC\u0001Nʤѻm%VOV\u0007m\u0016'\u000eŢkm?P[F+#Z#6\u00102$A!,\u0003\u0018]3'\u0002 ǉmVaѯ{\r\u000e1\u001a\u000b3\u0001\u001c\u001eDM\u000b\u00192k\u001d\u0006\nrx\u000fMm:*U\u001d)V1Vv/\u0003`\u000f*\u0013l)E~\u0003\b\u000fW\u001cwkܳkl5z찠L]b\u0018U\u0011tܰht/澗\u0000.5$#DLN%o\u0011pSd`m@f\u0000[5\u0019Vov\tnQ'\u0011\n>翵s\tL\\Ը֕3\u00067Kh\u001cPLVh\u0006\u001fprѝ6[cEs\u001c=\u0007FjRFdPXr\u0002k<\u0018@W\bY\u0018Mj*?\u0015R\u0019O\u0016b\u001c7fWz\u0010duԡ\u000f\u001c\"]XV\u0018ѩK),\u0019nzi̵KVCK|\u000f\\D8;1\u00001+\u0007\u001b䄜6%\\x+I=:\rZNC\u000fm@\u001cSo/WNe.^* \u00007T\f0i\u0005Q<PDF<@Z  q#\u000f;X󆒻,M]/7U\r\u0014DB\t۬Zj\t03Z\u0017Cr\u000f)_\u001fAR\u000fG,\u0001\u0001I(Tt\u0001ME#\fPm\u0000tj\u0000\u0015x1\u001f]nfӎՒ\u0013\u001fqhzzmٌs\u0013S&\u001d5]ZLB}G-j6C4j\u000b\r/['.\u0018\u0014@W:\u0015%\u0003b*1^C^#@o<\u0016\u0001n\u0004\u0012;,\u0012I\u0015]xU7*v\u0018X#x1(4\u0019LbFTʐmNEZkl]8T\\%PYpxyry\u0003q\u0005X\u001bb]\u0013Ř\u0000!Fb!Ʊ\u000e=q\u001f4(5\u001cx\u000f`c.$-fHW\u0003c/_t\u0013iQ,pk]mU\t/!:MĊjiScׄ\u0006\u0002\u000e\u0000lA1f\u0018K'\u001aeVQƸ\u0000\u001eZ\u0018$}\u0014d\u0000?9\u0017f\u001e\b\u0019+CJ\u0000\u000ebW\u0019O9.+?b6w9Pq5ͯ®NY|hPXalvC0?\u000f\u000f \u0016)\u0018\u0010}\n!Si\f 9!F?\u0015_. |\u001ac;\u0004D\u0003ަ\u0000e@8r\u0019\u0010\u0006X\u0000_Cq?E\"\u0010\u0003\u0014\u0004e\u0011qb;.paSԎ\u0016K?1iY.\\Ni2l[jٲ\u0005P\u0006\u0014'@F4 k\u001eX\u00136q!WlЏqn\u0002_\u0000e1@\u0016S& 3\u001a \u001d U7k_\u0002$<&Q\u0018 \u000eh>/\u0012\u000fk6l3\u001eya&r6*k@xFn\u0013ms\u0001\f\rt\u0002Z_ \u001fW\u00059{\u0018s\u0007P\u00075]Q\u0003jt]\u0003j\\\u0007|\u0014\u0018'\u0001\u0000]\u0000U 5@)3\u001e,n\u001f\u00144Gb猣$V \taB2]gvRL\u000b\u00100eI(k#~A\u0017㷺SQQM\u000b009\u0002F`a#\u00190\u0003$ƀ\u0001Oܿ\u0018ޮh\u0012z\u001ceg\u0017o\u001c3S\u0019X'f3+\u001e\u000bdS|B38{]RU\bo7uF;~}M'y\u0018/\n\u0005\rvX\u0003v\u0001\u0019㍽䲙\u0018cY6\u001dC/\u0010{=\n`ayy_\u0011\u0013O;\u0007h\u0007s\u0003Ɔc\u001cDo<wW\u0001x\u0006l-\u0000~\u0002?\u0001~U\u0001\u001f\\Zy%}8dhebtCco\u000b\u0006Nh?p^\u0018vwEDEL\u0018\u0001\u000e<@\\S\u001a7@B90\u0000bM .\u0010?'\u0010/x-1'u;ۼHh<]UK8\\`ߎDiND?\u0012Iß`?\u001fpb\u0012\u0007\u001f뤁b\u0018\u000eP*\u0011(U\u0002J\u0014R@c8P\u001ahĮfi!2\u00151d\nz\u000e\u0003I9;\u0007\nЉ8{8#2'?ￃ%\u0011|\u0011\u000fp\u00036\u0003a7@o=`OI\u0006݁~@wZ@\u001f!&YI;a\\|e\u0001ymv7:]|٪d\u000b\u0019w\u000f\u001erR&=xsWQ_\u001cCzZOH\u0014PЖ\u0004[hYC'6\u001bqg)[{I1D0,\be+ͳ玷\\;|iɕsb-нM{\u001deou-G+q6.\u001br\u0005~f\u0013\thtbf):y\u0013bZY\u0003\"'\r\u001c\u001e*\u00144%u5^\u0017ysR\u0006!\u000f\t\\D\u0013ZWT\u0016%x,g'\u0019\u0014XmB\f)s\u001cxfLO\u0005w\u0014Bqxo01PA-ז>t?}\u001cکQ3qWӤa_?B?FDCM\u001ahI\u001e򜻖=\u001cΠX\r9\u000e7f0\u0016\u0003e)x\u0003\u001d\u001aw\u0017OS\u001d75EsgJkܖ^&wF$yzCMk\u001e}\u0019)ΊzΣT\rK\"\u0010dU\r3݄wiCq)K}@BA\u000enk-zY4_kD\u001f\u000fdjn!WG[<O\u0011={md֩:\r\u001eUhz+L\u001eKkU/]\u001eSp `~ W/\u000f\u001aOZ\u0003݉\u001dW{Uͭw~7\"v\u0004ʹ{~\u00069jCol^|:]^sn96ʗJ%_\r\"JW>Yms\u0006\nF\u0016,@{+ʻR~]_{\u000fSJZxyGT{ψNu~K\\[4~²\"UH\u0006ҶRޗS\u001277\u0010\u0014o\u0010)\u001a\u0000zG% \u001a\u0017J\u0005h\u001djI)\u001eCz\u001aC?q\u0014\u000evdo![B\nj᙭J\u001bmh$:x\u0014EghM\u000fߒ\u0014\rqwYF=\u0003\u0019\rLv\bī,-,x)w؝K\u001ckgU[\u001c\u001c:=維==o;6q#\u00156ro6sJ JA_wҶįe\u0001Iaۼ%0\u0003:!Ǒ7\u0015o\u0017g~Y.\u0011\b@Pcb;w\n6pyw\u0002sv󐋲*53<\u00182z8,:L\u000f6\r\u001d'sR+?Lچ\fOSQu&kV\u000f7FAa7DXh`(71̯|S&H4Hx\u0015\u0016Al{O\u0004V#3P*īs~ҟLCe(ggx\"08\u0007污WW\u000bB^9/ݻ\u001dD`I6 /=PG5\u0006\u0007fyvj1^\u0004y4ts)W\u000fQ:pW\u0017(vk64\u0003|+{1\ry\u0019<n[0\u0019-J}FS\u001euUЪݬ-Gglˊ_%\u0006),E[|x\b\u001e\u00110)|.\ry\u0012<9n\u0012t'jFT\u0003\t\u0019\u0006SyͦK;]\nYH9m\n\u001eƃ+g|[e?XԫXd\t.%\u000e.'J(\u000bv\u000b{[[M\u000e\u00179].l\u0004s.LTE$2[|\u0004\u0002_\u001d C}\u00113:LrOT</u7dP]\u001cSkSUI3Qp\u001d<;>\u001dR\u0005fOܔcBf\bXQR=F\u001a5;h5\u000fPhPU\u0011}w$3!3go3Qn\u000eZeR]\u0018̥vM~\u001d\bTt\u0010R6z\u0017\u001bkǭ\r\u000bF\u001ḇ25/Gn\u0006,AkQNILs#D<\u0004V\u0018^'Z)|x~Tq\u0011fؒ7\u0018\fWBKMs,3+~\u0016\u001büzpnyc7?|i\b^QZ=4FN0k\u001f\\\u0019%\u00174#W2>\u001e4:[yGyD_\u0007S8ŉ*\u0010HȚx+xm|cvB7\u0015OTD\u0011e\t^\u001124TR#'\u001a7f\u0018O)/Wp{v>>(=\u0015}w\u001cfU\\\u0013%*\u000fj7;&3\u0018K\u00114)>ux\u0001\u001dp|v\u0005G0_r(\f\u0014t3F\u001c\u0014#C/\u0013ZnHΰ\\qzp}օ3Z\u0010Q_8f*\u001fV0]_qȉ)>G_PPzyӲL%`siC@B\u001f[v>]OC\u0003&\u0019Ye7hQ?ؿQN#p\u0014Dۈ\u0018\t!|#2w\u0001V>RP\u000fԳN!\u0000HP*tFnY^\u0014^-K}B\u001518R\u0007e\u0001Zrq(/SoL2Ӕir\u0013\u00057!\u0015>=\u0006Awg[(\u001c\u0011q7~\u0007\u001bi]Ubnk\f\u0019Zu/u\b00\u0016\u0006\u0018NS\u0018K1\u0005Ln:ʕ.\u000b,_o2x3_\u0005m`<k\u001fʟ͉JܾIC?ɜ0Zaq\u001cP\u001f\b>ߡ)+X;'[Ȩϑ&5M)P>\u001d\u0010o\u0005p3\u0002\u00157\u0015nݚ\u0000\u0018W\u0005U-Wk\u0012[jYs\\N5\\\u000b2H?uitY'\u0012ɞ5އۓ\r\u00076?(ǩ~Lex\u0010;\n\u001b\u0019\u0001\u0004ל\u00013\u0000}\u0010Z/\u0000\u0010ԍB(\u0006\bt\u00018\u0000 \u0010othڻʙ-\u0004bNlyN>F2ȼz5P\u001f\bޑs<TwtdU&'m\u001e9\u001e{\u001a@@g \u0019N\u0000R/\u0000\u0012Bq;\u0003 \t\n<\u001fl\u0001d1C\u000b@\u0016\u0001H\u0002dP\u001d\u0000d؅\u0000Ҭe\u0013E:R>L+8^c\u001e5G/Zoln.\u001fwC\u0015\u001cKxcB\u000f\tmcW\u0000|\u0000\u0012mc\u0014.1\u001fPr\u0011\u00004bܧ\u0000u\u001aw\u0016\u000fP\u0013-8M\u0000*^QJBHXUBX;\u0015<\u0017Tmrޠ{\u0005\u0012ٯkHay\u00143\u00169\u001c] i\u001bG=p-\u001e`B\b0|pqz\u0002\u0018e6\u0000\u0018iz1-Q2\r0h(\u0003\f.'ч\u00003C\u0001\u0013E\u0012RVt'v_㋞wY/muSJ\u0007/\u0011Q_c5FHC7\u001bʟ;\n'B<\u0004\u001cd7\u0003\u0002#%c<$=3\u00182^R/j\u0007\u0007\u0003L\u0000[j\u0000[Ou\u0005\u000f\u0001>\tk\u000b^{럨\n\u001cmu~%dm\u000b)F\u000b|6`\u0015$d &F\u001b\u000b\u00005:O@H-\u0001\u00016_A\u0000Jq1z\u001cMŘO\u0000~\u0000\u001dpY\u001d\u000b\u0002\u0007ߔ(H5ɞ\u001c4[?\u0015>MmJL,ōxٱӧp\u001a~6qz\u0011\u0013}\u0010\u0018@\u000b\u0019\b ]\u0019\u0006absd\nB&^}9+\u0003X\u0001ї8/\u001f\u0014X@lp7k\u0004Н\u0005\bv+uˇYb;ܚ(T[\u0015Ǽ\\X\u001f^tv4\u0012}\u001a\u001d+H_:\u0010>Z1h\u0000\u000ePG\r0\u0011P6İL@W~v>Ƴ\n(6;\u0001!@o\tPآ\u0004wc\u0001ȳ-Wp\u00019^\u001c3AK|\rלdF\u0012\b|fP\u0012꣆ ט\u0015\u0000|2\u0006?Ǐ|\u0000=G]@h/F\u001c\u0002t\u001fIRFZ\u0002:E\u0000\u001f\u0007^\r9e\u0007h\u0001\u0001\u0001$\u0004p?ẓe8mz\u0010]\fz\u0014\u0012'{רY\u0006PѬ\u00036O򡿯2%K$\u0012?\u0016\u00131\u0018\r`U\u001d\u0001Vk\u001e`y\u00074\u0012\"QN絛XS+/KUP$\u0014C\u001a*/qgUFLH\u001c\n!'gm\u0005\rj!\u0005m\u000ex\u0002@<8\u0001\u001dh\u0014p\\m\u0005&KH竪\u001c\u001ck=\u000br-l/7IWOW\f\r\u0007\\\u00038#@4+O9 \u0016m z\u0001E\u0001bV,\u0003\u0016@i\u001c\u0010v7;wsv˶\u0015oNz\u0007K@\u0006g?2s0'N$?q\u00125X\"w_e@|/\u00038f\nW@>;\u001a/\u0016PR\u0003(Ph$\u00027/X\u001e2\u001e+%\u001aZ!\u001f'{Mv3XOw7\u0016~\u0012r7.\u0003[\u001d\u0002mΞYY\u0001$\u000e>ЮyސT\u0006y|\u001ct\\V\u0013+]\u000e.\u001bp^Ι椌\u000fc\u001bݞ\u000eOo{;~R{zw\u0005$\"{f\u0015mZ}(b\u0002h\u0016E+CH\u0012o\u001f\r\u001bߚHw/AW\u0017ܡBf?f\ro*o?\u0007Key\b\u0017mz\u001b͟9O\u001fP>\u0013}8!sL\r|\u0014Cmx(gx,>~ʙO\u001dJZ\r$.С\u001fiHrl\\\f\u001b}S]\u00135ga\n5<\u0014Ev(n8ah/\\B-TOۙاE{^mb5[\u0001'n3m\u0012#~]tu\u0012G{ocԹ+rG!\"Cq[z.q/t\\[lk\nS^o͐Y\n5\"M\rJ:Y%/Q:3\nUh\u0005ˢ᏾P=M\\\u0015?T\r+R\"WC}F\u000eх:\u001f=Ϯʝ\u000b͐ꩍk\r)kfO$GGtXҟFT\u001dڍf\u0015F$\u001bVeo\u001azd]^Si[;J܍'\b5Yy\u001f\u0017\rK{ϕl'%;${:t\u00120<q*PdC\u001b\"vݹoSzsOĺOl+q\u0014DN\u001bf9S\r⡲\u0001Vr\u001aT\nŠY0?\tm\u001e=_'o\u0018g\u001c\u001dsۡK~a\u001f\u00124˛5@\u0015C⒭~z~\u0005>t9`ap~CoOm+ns\u0014m<\u000bi\u001c\u000bBt)@wGwM&\u0012\u0011\u0004ʈmS%ǽv\u001de^y\"ղ*\u00163d=\u001eHt>1&\u001e?H҃\u0007\rju&sorki\u0013>m\u0013\u0010ên^|9\nüYλ4\u0012a_u\u0002imN{GcG\u0016?EaY\u0015~\u001f2l=\u000bTS-89&z\u0006gfj\u0010w\u0002F\frhjy}\u0007ã=9\u001eMs7_5V0+].޺\u00150tiD#mvdY\u0015rYW4F-e;LC\u0007+2'4ы5p;iUt3?k}~\u0019I\u0012J#z\u0016r>iɆtc\u0004}T-\"t[\u0013a~IΪ\u0015CG>̴)cYdMC{53\u001b*qUu60h<j<U¨(5;r\u001fKCm-Y*\u000e[8*zS\u0015&}\u0017\u001b%`P;%`3\u0018Ԭ\b2\u001a\"w\u001fw@Qc/c\"8Hv^)\u0019éaih7\u0003\u0014Rqz\u0018\u001dRy6\u0014r;%Ŷ\ffJD,a\u0014m\u0013&OQpM1l'[M\u001e\u0017\u001d.\u001f&\u001b\u0006([pdpT\u0018z rvG[}}\u001f䗎d4s\u001be\u001eE\u001d \u0007WIi\u0014l96N-GWa\n\u001f7>ׄyj4b bG~a\u0018\rZy^ЍyP˙ڭC\u0019ܧ\f\u000fiưrp\u0015\nHp\u0019_n\u001c5\u0019\u0012/1oi\u0013t\u0018\u0014MO\u0012p0i\u0017Xro]\u0019\u0006l0_ڳ<^;3_3\u0012Ѝp*eۉR(C1)q\u0012%\u001d\"`ᓙ5*㮗nMp15\u001dףщ҅\u000b\u001eb^wn\u001bfaj\u0004a\u001bh-\nIs\u0016p͕9w1#\u00157CѪ\u000fU\u0007|\fo#{әZȋ\u0018\"B؇*G)ñq\u0015yc\u0007뺪%VF〲>\u001eq9ќ#F\f8]`'PHS'GX\u001fY34Jtp\f\u0014m1\t\u00127~Y\u000b֬(ix\u001a%T\u0018>\u00011>*\u000b<8i](\u0016\"}K\u0017e-T֣\u0005R\u0014\u0001\"ĝ\u0007dlC^ڧK'K6:\n\"ΚA'\u0010.sXf\u0006m.\u001dǒ!+%\u000fmƎ\u0007\u0011e^]\u0002\t>MlnԱĨln\b-m\u000f^>{!#:s4Z\u0003AO=ƆiTcj\u001f[VK\\\u001drU6\u0014\u001bgP䱗\u001d\u0017\u001e\u0001sayaqA\u000e.^?\rL[U|H\u00155D8\u0018)|m7p=K`\u0005r!\u0015\u000eYH\u0017 3x˩t1\u0000\u001fy\u0001٪@\u0003X\u0000DG\u0000V\u0010heGx@\u001eHH<y:^\u0002*\u001f2N\u001d\u001b^CG\u001dUXe\u0013싾{֞\u001c.\tN\u0016e\u001a|:\u0011p\u001d\u000e\u001acH/7V':}\u0003>\u0019\u00020\u0019\u0011@!\u0001\u0003S\u0000a\u0001#\u000b\u0000>S\u0000!4FU&%\u000eío\u0006\u001dm\"D\u001dW˔.֔i,0[j[\u0014eȾ\u0005p0]})t0\u0012S??ǘA$݄n5z@#~`h\u0001Ii\u000e\u0007\u0006Պo5\u0001`\t\u0000\u0018{|\u0000F\"1}\u0001w:\u0002FiS\"\u001fq@aYޭ\u0018SۧBE\b\u0001ml},h\\$@\u0005MKSj\u000bc\u0003KR\u001d\u001d^:\u0003B1z,\u0015c\u0010\u0002x\u0002xD\u0000I\u0000n\u0000n6\u0000\f8\u0000\u0017L\ne9\u001c@\u001fi~o,\u001e\u0013\u001e0kHSkXyU`hq8,B}}\f\u0000F\u0007 (\u0001SKy\u001e \u0018}\u0011\"\u0000?b-/\u0000\"j\u000e-v$\u0003\u0010\u0000Bݪ\u0000B\u0010\u0005JA*~޻>q?uU\f\u0017窟&RyWH^jF\ros\u0002\u000f\nWGce\u00074\u0005\r\nendstream\rendobj\r256 0 obj\r<</Length 29555>>stream\r\na\u0011@S\u0011@\t@6Y\u001a [\u001c\u001ed{#\u0001˪16y3\u0018x\u0014\u0006\"0\u0001L\u0005 |*P[+KX8\u0005'\u00170Ó\u001cafk\u0019mJ\u001eN\u001ac\u0013\nW\u000bQ\u0013\u0004\u0002oz\nГ\u0018/-5@\u0007\u0006u(=\u0013\u0006h#Ƙ\u0000m\n~E\u000f-{\u000f6\u00034<\u0000\u000f\u0000Mw\u0000.\u000e@e\u0011E5ur\u0011s_\u000f6p/5k?d\f׳]@dl-jm`rK\u001dg7!\n\u0005`\u0005x\u0003x\u0007\b\u001cz\u0003X\u0001(\u00101\u0012<b\u0018df1\riz\u001e`\u001a;\u0006\u0018GA\u0000h^~1\u0001\"K\t-dpfy~%Gl#]UGN\u001f\u0001vKN2\u0017\"\u00006\u0000\u001f\u001e\u0000o\u0016\u0000/A\u0001\n܉\u00011F\u0005L#d\u0001pS76?\u0002M\td'^u;G\u0000ەN$}Q>7\u000bIzZSG#cV\u0016fSs\u000bu~\"/\u0017?k}\u0010`\u0001\u0015Q@x\u0007\u0001\u0006\u00111j\u0014ז븮(~ǘPr\u000er99-\u001czU\u000f/)ɶt\u001eciմ(\u0004\u0001\u0010\u0000\u0001\u0012<(1D\u0006\u001e\u0000Mo\"ڔc~O@.\u0010;\\Df\u0012j&DMT;9ǙC\u0016q\u000f\u0019r8&Ζ\u0014\u000e&C\u0003oSU.`̓\u0001\u0006sZ.\u000f\r1C\u0011=:߳\u0018\u0016LE^X\u0010]gGt\u0003\u0007<1DW\u0016\u0010]\u0003\u0016\u00150\r+\u001ao]XCt\u001e9\u000eDg\u000f\u0001\t\u00172X\u000eK\u001eFW\tO9gq:Ԋ\\N\u001bh\u001biksY\u001a2l\u0002K\u0004F\u001e&ybe\u0017'\u001fZp#\u0003>Ү\bӦ\u0011\u0014I4APY\u000fz\u0013x,b~\"a\u0019?/p@.\u0019\u001dkyjvZ땼.\f\u001a6K1S\u001a\u0014V\u0006VDQ%$\t`\u001f1g0bG\u0012#n#\"}\u00191]]\u0018\u0010C%\u0007\u00131YPL\u0011C\u0002Ȟ!\u0018\u0000\u001f9\u000b\u000b`\u001c9v\u001em1qκ\u0002\\КFٲ\"#\u0018eИXohW\u0011GL<\u0003GL<\u001eS(r.bj8q\u0010SӉ\"*\r&L\u00151EN\u0011\u0019\u000fGNu8*z5/L2;k\u0004B\u00062;mQZR\u00001=*\u0015%\u0014\u001f(\u0001\u000e \u0011\u000f\",<yx\u001c<G\u001f4\u001dO\"iX\u001bb\u0015\u0002_ AUX\u001aLP[\b<\u001eխdO0\u0007R\\EjS\u0005t޳,5-)\f잧K<Ox>X\u0011z%B\bq5yĂjCX~v؃s\u0014&I\u001a\u0010{a@ssD3\rGBə&OvU;TLK7~\\f~{\u001c<NH}\u001e,\u0001\u0003%\u0018<'\u001eJ\u0019\".\u0016\u000fF\"8t\u0011E\\n{\u0013)8G\u0015]\u0004G\u001b6=kMH\u001f\u001eq#_\u001aKVm6Fe\u001allp@\u001a\u0018󤮸%k35\u0005zc45\u0005յ#\f\u000ep}uG\u001dZ9-T\u0011OFX'\u001cSLCU0\u001cj4wTr)+s];?j3R\u001f4*X~\\\u0015\u001cvwճP=`OW\f\u000f{\\5sSCq2;<KK^\u001d7\u0003`\u0018:\"\u0006\u0000hX=&\u001c\u0000G&\u001ctO\u0013\u000ew\t\u0007S$2w\b\u0007c\u0012;\u0003h2\u0007\fj\u00072غM@\u001cKN62(\u0014\nM\u0014\u0013ӉaohMU`Δ\u0002\u0001eT\u0017y\u001ejovVx!\tiS|-_\u00015\u0017`ۉH\u001eQG\\4Zl\u0018qt~\b&I!9\u0007fA'U\u0005h\u0006JccYQQ1{5Pva[W/Ylmj49\u001f\u0003)]셳amU\u001e\u0006^7r^@Zf%;3cqrC\u0011XWB.;fu DH\u001b>\fI6ξT\u0019[\u0018%D.R\u0002U-<I:cCLQe?UVEFm:\u001cIjcpyk*i;\u0018jѲ-\u001au]N˕!<}C끭?\u0003\u0003\u0005w\f{fV\u00162!LE\u000f<.rt\u0014$\u001d\buΐ\r$\u0012[|!kVa\u0007y=\rwuKjpLfA'щ\u001f9me\u0002u\u0006'q:ڦщ$LS\u0004WN<ܛY\u0016X3<2c\u001e\u0018C\u000e?m\u0017v\u0005o!\u0016\u0001!uJy.\u0018 5r5\u001f\u0016'Xq\n(+-]Geǧ*|rAFF4תƘ]'?\\Ci}ˤ\u0001Ju$\u0015bʛF~KrqI[GyۮpW\u000e|\r\u0000;\u0005of|q>؍\u0011<L'Ǚ̯\nAY=\u0018mmp[=\u000b%S\u0003\u001d\u001bGe%8^\r煩!P!jȑ+JJwŰlnD\ny\u0002nlvkv\u0010@4DE}q\u000b\u001c4L\u0002xӭSP\u001b\u0003U\u0011]\u001b $\\yhӄ\u0004hhӄC˟&$\\|_JxH3\u001b~E\u0017/_4h~E\u0017/_4h~F\u0018m%A[kn8\u0012\u0017/_4h8\u000f\u0007Jig\u0010=}v(վD\u001aMb4V%Zi9զ\u001d\u001f'/_4h~p\u001fM\rQ<h,\t\u0015ԙ}\fڇ\u0015l\u0007bs%4M3b\u001a1_\u001f+&rɈ9\u001a\u00045FqM-\u0017/_4(4.Y\u001djۤ^14F䇈F\u001d\u001bc=0\u001e_\u001b\\Vr.v\n+J}>\u001dL^Bz_Y]få=\fLHf\u000b;A׍i\u0000\u001dV\u0018\u00065|\u000f\u0006]zE\u000b\u001d0,]\u000bXV^x\u0018\b]kI\u001f<ص'a\u001bYa@\u0018.E\u00024[ܜ\u0002b_JǰY/u4m`6(\u0010hflFPE\u0016sݤ!\"ظ\u0015w,r\u0016\u001bi1)>\u0011X&6Q>\u0001Jv\r\u000fc\rkrXU\u0019\\Ge\u0001Xl\u0018?\u0011\u0013\u001a\"vQ\u000f'Oha\u0003r\u0016==ٴ4- 8?F\u0013KÎ<]Xtxj`\u0017E\u000ezبã^MH\u0007Z\u0005\u000b4h(kP-馫2!\u0004)O{6\u000bn1aQ*fu`JBUXiã-T.N@\u0013O\u00021Fb\b+P\u0014аxQAVsmikOK5OR\u000fp)晡To`CA\\\u0019Eo0zö\\\u0019BUgX˲zEq\u0006f~o_4h\u001er\u001a]\u0007v{M/\u00002.\u0014DIh\u0019?EV6yL\u001f9kRNQbg5N\u0000yu9\u00032/\u0006~B\u001acކhģ!,Cp2Ho\u0001՝)d\\&K\u0005\u0014>\tϒr\u00198r\u0000:l\u000bL#q\u001dD#7x!KD7Bו\rqPHO\u0000΀gb7\u0006\u000e\u0007(\u0015I\r@mZy`&\u001b4gv\u0005ӡ׍UtǞۿh~>9\u001enm/lҡc<yd\u0006[ۄ,m3NXwkK\b\u001e:ͲP3>A\u0005L3ﭑ\n|{M%e@Ug\u00179\u0011jC=\"\u0017TBDY2j,[\u0019p4Z)Xloq.\f_VZ\u0002\u0005Q|cJ\u0001\fxPg\f\u0014@}=\u001c'+hMw\r\u0014~\u00008:ʠ\u0002[-]\u001a\u0016+xJ~fZ\n/\u001ehhI~-p\b\u001brV~iyuy*\u0006\u00141\f+\u0000\u000e\u000e#sxA\u001fHD\u001bh:Ä>2\u001dyqZ\f]\u0010q^EAΨ6VPg^\u0005\u0017nA\u000eZf1(Gllu|j@\\IZd&w-\r~/oɹFtB.\u0004fBMsHz\u0006\"Q;r\\Q^E)\u000b\fY\r1Ξ\rĵ9T\u000bzI{clt'\u000bvu旿\u0018qfobh\u000fl\u0007\u0014\tW*\u0002MeK[wڡ,/\u001cK4\u001amzB \u0012G\u0003v\u0012Xr\u0000\u00044\u0018`\u00150E\u0017~Z\u001d#\u00133g7\u0019U̠%dV*\\[l\u00130jѸ;H`p\u0004FXe;0;\u0014]\u000f5RdzZ%\r&B!\u000fm\u0011\u000fN%\nXVP5@h4\u0002<D4E\u000eWC8>\u001bۢ`*'k!ed_R^4\r*QhFG\u0005*\u0019\u000f'\u0002N\u0017x,\u001ddڀBh$۶\u0004#[\u0006\u0019$\u001d6G\u001eq{[\u0010\u0016\u0013u1jIW\u0016p\u0014\u0018\n5[\u0010M۠n5)\\Xm)Y\t\"\u001aZmP\u0018*o\u001c'1uHKMNz!\u00073Q\u0016So\u0003\u0012ujR8\u001b`Ww1wHha$\u001c1Gxȍ93i*5\u001dGy5j}좊Bd'_\\ +g̻l:W\b\u001a\u0015\r$\u0017OA\u000bߘkm<\u001f.^-5nM+՝k\u0002ś!\r\u001bQHKi\u0018RG<\u0000ڈ\u0018V\u000e\nJzr1 \u0004lv|\u0014T`\u0010\u000f\u0011\f\u0015N.W\u0006J\u001fύ:>\u0011\u0012\u0011\\^(\u001eVgH\u0012\u000ba\u0019_н\u0010cCvJT*9\\ݟ(ʳ͍\u0016I\u001bUի&A\"-+\u0004hL!PG˴37?Yg:C&\u0011\u0018\u0004Shiز{pI\u00185re\"?oyw;W2\u0019}:\nO\u000e\u0004\u0015\u0003\u0018e\fۋ\rgHdX\r𼜅2\u001c*x\f\u001a*ʺQ\u000bc\u0016#U\u0003\u0018s`\u0011ʺ[1\u0010\u0014'Nzl|TR\u001e\u001a|Sl\u0017(\u0012t{\b71\"'ʪѮ֜@A%[r/w(=y\u0005\u001d+\f\"49{`'<\u00178>\u0006\u001aR\u0014r&D/+'\rOStXn鑆՘7\u0012PMH奠Tԛ~vè:K\u000f|߂Ƶ^E>ot\r:#\u0012\u001cys\u0019\u001e{J1ɠI\u000fq\u0019@K;p{\\f\u0002\u001c6\u000b%\\rINvP1ztI3C\\jǸP\u0012w\u001e\u0007G$,%E3\u001fwCº@\u0019\rSpz=GY-|Ivh9='!G$`r_}HU\u0014[ 1\u0014hJMS\u001aY\u0002`\u0015ƚVO*k?oN0&\u001f<$n\u00109V)GLWr\u001cAq\u0014\u0005nfۡ\u0007aE\u0003\u001f\r])'^ \u001fM\u0006\u000fgE\u0005-\n\u0019'4J\u001aR\u0006|hkFF>9.,\u001eJ\u0001=`\u001c6\u001bGJ (w}\u0007C#NƮH\n\u001c\bJ\u001eSu(\u0011\u001eRN\u0010.7^_,\u0013{Sfd}\u0007\u0012PpJ^Qj(=fO(\t5$\u001f&!\b5\u001cMO9V-fpJC9hZ\u0005\\5txH\u0014{eݡ{\u0012g\u0015qD\u0016ρXP|\u001aO\u001f*3\f\u0000h\u0019\n1hԆ~x\u001dw@n~z-t\u0012z];x2peogjh &:\u001fY\"w$#\"$\u001c\u0013\r>0bp\u0002#\b7>\")/l!s)fT_9\u0019QJDOY#2$\u0015\u001bce\u001b'tE|\t/b[\fÎ%#\u0011r\\v;J\u001bx\u000e\u0011dٱG\u0015 ZޞxxE1ɡظ*fC<\u0013\\\u001f\u0018E^ѼbQE\r\u001c.#P'\rc\u001b\u0016Cmzh'־\u0017c\f%QXv(2'`m\\,V\u0017T.N\u0003m__uU\u0012Aҿ\u001c38{\u001b#`\u0015xQCP<iZ\\v\u001cS_g\u0014uhO\u0013\f)yzM=?9i\u0000\u0000Fȳ]5\u0003&V\u0005*GÍ3VEN\u001e\u001b%P*Jv{\u00115$L\u0013\u001fR\u0016~{L\u001d\tql$7onuhI궠DEˠ!:d\nN\u0010lqWq\fOwSS]\u001e\u001ew\u000b\\u\u001a\nn[k\u001e::N)Q\u00074b[\u0019T>\u0013\u00196pqsu7\u0006Fq1̷È2\u0015.Rq/@aV_wFǊi\u00149&l9|vL\u0002LpxW\u00102Il-Td\u00161T\u0011wr}D.܂\rS,\u001e(+m\u0010\u0003[xg\u001e\\g~3y?8&Űl\u0019\u0004׻\bf%}\bb\u0013H4Oz\t!Ч6ݱ#hwk\u0001Q/\u001cȋN\\&*p\\\rD\u0007.3\u0013ʑ7fqގSڑ7\u0018\u001aT\t:}j);g0ԛO\u001eNM:;X\u0010_4o?$\u001dHGʪAjk8\u0011\u0002=%cnˤ7\n\u0014آN\u0000= s.8c\u001b>hy\u0006t\u0019JĹVvH7j\t3BEa\u0011Uk\u0005i\nȴ\u0015iI0#z>7O\u0001цU\u0016!F\u0002Qpg6Y3{`Z6ҫڸ\u000ew\u001b{԰&#jgޢ\u000f\u0013S*\u0015\u0018\nwJa'\u001fm\u001a\u0004f\u0011ju\u0018/NQ\u0007\u000b/\u001a\u001dv3G3jP\\/.\"%wi6q\\)X\u001d\fF\u0019h\u0011\u0019jݎʖk W]Gg\u0011A\"\u001b7ksI;7Si\u00033<\"?G9j)$.\u0014e,o\u00113ޡ's\u0012ge)o\u001bym\nY)\u00197bZ/\u000eoR\u0012]^.3,ek@:s2h\u0016P\u000fZ/0.6NAw99WX%!=p$4 L̚lK*n\u0002A)Z#u\\ӊ`w_4K4m׵ۿ]\"l;\u0012|\u0019=:,W:Gyq%2\u000e6\u001a U\u000b*!3@\u0013WsJ+*ݢq\u000eM T\u0017:Ȏ\u000bB՘\u0007\u0013g-w]\u001fע\u0006\u0004FʶwKFBҤ<\u0005b.\u001aVc\u0007;@GFS\u0001b\u001c\u0004\u0002d#3[\t3P?Kz*`]l@0cMz[\u0001\u000fA.\u001d\u001a\\piaho]>̶,,s5\u0018CN(k\"|\u001e?[b~}lCv\u001c*\u00159{qxI`7)O8ru/XD݃\u001dִ՚\u0005R\u0010\u0013vB*nHl!p~./\u001ct\u001d\u0000\u0019BԱmfuA%\u001c񩄢\u0007\r8{X;r\u0015BCb\u0003W\u0011\u0019>\u000eS`\u0018u\np7\u0006<3Mۛ\"A=U9fZ)T\u001b\u0014aJD@vR\u0011}uך\u001b]zg}\u0017Ϳ\u001a\rn\u0015\u0018Y\n,~\fWъ?_z9\u000f\n{:S'w*l}(eZ!)4;\f\u001c\u0001\u0015⪍J6ͯ3P5{#ԖRn\u0017Q}E#e\u0015\u0019g\u0013 b&{mOL9s8 y\u0010l?\u0017}\u0010p\u0007;R_vwH\u001bpHFj\\ٲ\u0003wBO\\\u0015:a2V^k%E5淁!'\u0006OM*\r_{.G\u001c`_49d8\u0013ZuUj`sgc,d>w\u0005I|u\u0018|:\u0006.){1]l&\u000f噝tb~ڪ)X\ft\b7m\u0013\u001bm^\u0013cx`[S27\u0006)u/S\u0011<۝!2h|Sv\n\u0016\u0005UVÆw\f;$jbf\u000e<wY9!\\F\u0013ޣ\b\u0017͏99\u0015>\u001ak\u0012u\u0001|>4A=>D2e\u001b\u0013o*fn雘Ѡ(:O^=CIzZ:\t\u0018}!߬\b\u0017\u0000j&n*rү\u0005妬\"?PRћ\u0007x;\u001e=ly\u000bc\"؅kFl5\u00148];NU\r@6McjNQ5 \u0014GG\u0019E\u0017.\u001a-Q\u001f\u001e\u000e3 pZyFNι\u00059C-*ˍg\u0003}|\u0006\u0006\u000e\u0014\\nؑڞQw3^ִNNN\u0012P>.7\u0012ULc\u0013\u0001M#;\u001bG,-9ۄ:\u0016|S ']\u001cR4\u001a6\u001b&҆49,sq#TvgOR=|\u000eLp3F]Lx\u0012F\u000bj\u000eצ\u000f`_4h]h49+[{̶庱^\u001c\u0007Д\u0003k qtU\u0015l`\u0018\u000eb2Z*rgb#eY\u0000HS0U܍kS4b2jOI\u0019W0\u0011.a=ycMt^5QS8\u0015q\u001f\u0001\u0017) \u000e)\u0000`5H/'Թ륵\\\u0007B|<)\u0006\u0016`[wZ}\u0001\u00146\u0010I\f\u0017Ϳ\u000eMm\u001dl.oI\\ՉA6X\u0006l$\u001a}#(Vn{\nq9I: 6\u0005_su鵥`qs?$FZp5pm҆<c\u001fa\u0015,X96Z(KϢa\u0012Śi!$\u001d\u001aGAh\u0015KX5<Z\rqxh+\u0003\u0003R%\u0002zQv5O\u0011~E|:^7\u001f\u000fȫx8F;(C\u000b!U9N(jw\u001e/ik\u000fU\u0007.SFmo9ՀƇL\u0013jcY \u001dW#\u0019\rNr\u0005 u\u0006Ϋel,g\u0015/\u0007{\u0006>QNbĚv_`D\u000e'\u001fa٥\\w_4h~Ѡ6\u0018\u001bllVJ,\u0017v޸[2bi!&\u001aNv\navZGEzZTg\rfmW\u0012Ǿ=xace\u0001VpUb9gwu\u000f\u0006Ӱq-^n\u0018ەK.A{/=ٯ jMQY&U\u0005\u0007\u0006\u0001C\u0013I[\u001fazG|\u00076\u001f0ph0E\u000f-l\u001f>\u000ey\u0005\u001a\u001fx8XmQ/:\u000fS\n>XP\"v|{\f\u0010\u0017Q\u0018p.>ql:~\u0000-?\u0000\u0002Pm]\u000fS\u001aѶ2\\񳩁OGt\u001d\u000f\u000e󇩂il\u0005=>eI7*\u001f3U\r++ ,\u001fRUl\u0014u\u000b\u0000\u001d6E2qɯŨK\u0018Z:oӌL\u0002Lj\n9>a*\u001c\u0015|z8}\u0018>\u001f߶W8~5=M`v/a\tHL\"Moxn3\u0012$Niq\u0004;\u0013\u001dxKq&\u001dv\u0002\u000e{|1ڜ=\u001en[|~z8Rmfi\u0017o}^-w.\u0015tv\n\u001b0\u0003~nnǡ0\u0001T\u00161\t\u0002-\u001cn\u0005L%F4\u001c_&n||іltf\f_l\u001e@M_/UCO>aVp?~\u0007r\u000e4p9\u0004\u0011\u0007\u0003\u001aόBĠѸ/\u001d\u0017\u0011ߏ'[\\|\u0011_\u0002FZ)\u001f黮On0Z\u001d\u0000\u0002?uG 5\u0019,6Ք\u0003<l\u000f|\u0011#2\u0012P\u000e\u0001\u0019\u0010\t:DBc\nМAu\u0019l\u001b7\u0017V%i׍=Мs\u00159\u0005\u0007\u0016[\u0014SLq=燽\u00168^Ў\u0003E.FR؃Ş3G[\u0011\u0004_Ӆ$\u0006\u001aRz\n\u0007\u0011j=\u001b^\b\u0003J\u0004yv\u0014ovsʰԝ\u0011\u0012?\u001fˇIOZ\u001b1ʃ\u0015T>bL\u0002\u001aQfÝ*U#l8Y\u0003/f\u001f~`_pp\u000f\u0000:\":S\t-8S\u001fp\t[\u0001M_g2ǻBBs^HX@d1\u000b6L[\u0001eCuluN+ƆD\"J[\u0002\u001arWy겗sM76&\u0016\u000bߊ\u0005`3\u0011W{|\u0001ٿD\u000f-0\u0010/\u001am-P)\u001fg\u0003\u0019~/bH*/rc@qN\u000ev\u0005>\u001cb\t\"F\u0001&6h*JS\u0016D~4{n\u001a?#v\u0018_~ibՅ+\bs_@#諂Q|_^\"8{\u000f?\tI8h\u0012~S  >\u001aV\u001b\u00177`~\u000e\u001b[ю\u0007\u0017\u0010!\".\u0010P\u001a<x4a2\u000b\u0006_hP^E&m\u001cC4\u0004D\u0002BL`fu\u0004~^V@/8좘\u0001B\fyys\u001e\u0011'dr`0I\u0003GNH5N\u001d\u0018\u000eB\f}\u0016h-=I F\u001d[\u0017;p=\u0019C\\O\u000foSW\"nͻ\u0016]n6_5@͊o`ԅ\u0012d&&!{5Hsa\u001dV\u00143\u001a\u000b\u000eܬ\r\u0010$غ\u001fw\fhdw]\"u\u000f:\u0004fW4뭺\t`ssf\u000bM]r\u0017Ō\rav~ؿIދqP-I\u0000\rAhXa~\u0015݆-<ƖA\nZr?n@/bp\u0000NXzF\u0006Z\u0011\u001a{\u0013\u0006x\u001a4>u5}G6>Z@GpL]O.ȗtynIMcy\u0018yW,UԆw䪪\u0013\u001c6,m\u0000#z\u000f}&׮\u0017X\\\u00169O\u0016kybK\u0003PΥ]My]Lc0ɖ|@c@UڑchX/oQ\u0002&uʃa7f]u\"\u0013p{%\u0018RЩi:\u001e*\u0018h\u0006A\u001bҗ1دJ \u0019q\u0017\u0003\u0002\n\u00041Odi;\u000f}07Y}\fHhֶ5\r8e\u0007qԊ\u0016\u0001\nP3օ\u00011\u001e\u0003xŨ\u0006f\u001e]?`\u0004*\u0015n'~s QlH\u001b/!\\O#5l)>\u001e\u0015Q^a0R[NbԬ6\u0002\u0011W-\u0007\u001f:(t{Pd^\u0006\u000e6OhOZͫ\u0019AR\u0000w\u0007&9K\u00102@\u0013\u001fZ􍨽Ie7C,\u001d\u0013̠\u000eG\u000f\u0001̡I'\u00159\u0010\u0014@\u0007n\u0004D\u0019\u0017<\u0015\t(\u001c¾U\u0016e7.5YI#}[g\u0004\u0006;'*&խ\u0013\u001aQ\u001b[:+aR\tI\u00079r0c!xo\u0018%fXz\u001aSZUwFh>\u0011gfKv2Kf6Iy!\u0019:\u0003'p5\u0017DS5y\t\u0006\u0003/bɍ\u0012\u0007~ll湷yn\nBɣl}\u0002&0.+':\rݒU+O^\u000etE\u000b,\u000fd:;E\u000f4\u001bxl\u00172i\u0015$H\u0000su\u0019\u000fp\u001e'2,{ރ\"8z(X\u0013*\u0005&O7'\u001d\u0003!(1U]u\u000eʀ:R\u001euvq\nBUYꌑl\u0007hh\u001a`\u0018TXT0\u0010\nG\u0003ƒPI$ZdI\f\u0004(=\u000eD1a\u0000la<u`YM\u001ehm\u001a\u0000,7\u0014`i#Fhx\u001f[388\u00046alʐ\u001dZ-1nO6c6>\u0005\u000etpcbrRe2Gl*D\u0011j\u0015%\u0019˅_A門\u0019xC\u0016T\u0013\u000b=~{̏ȦoQ!cė?՜\f\u0006\u001f\u0018b(\t*7$\\\u000e\u0003V\u000e;8l\u001a\u001a`\u000f\\Qت\u0004D\b0\u0007\u001f_&;%OD'h\u0000\b\u00198Rr̰[@5DC`S\tv\u000f+; *G>\u0018HIM1\u001dIW~\u0010JO\u001fs\u0006+y2X3\u0001а&\b\t\u0018\bA*&E\u0002ĸ$@=P'\u0000h\u0013\u001ac<i!;M\u0018\u0017OxC\u0002oƹǸ\\j4\nc%$Ns԰q,\u0005h\u001ed\fF \t#N->7O\u0001\rcjO%\u001aCbDxDbFHVF hIJnZ'D:d\u0001H\u0007 6$\u0006\u0013h\u0007\u0006\u0015ۢ-\u0012S\u00180΁:_ۨ\u0013G*E\u0016\u0018#k\u001a}\"ll\u000029\u0004dqh4VV\u0013kM\u0017K>hkAA1h\u0002ۍ\f\r\u0006Ҩ\u0001Y<Fj`\u0013j%\"\"Cx\t!\t\u0001q\u001f2fW܀X6tDx#kz\u0017L\u001am\"Q\u001e>GEtH\fn\u0014)Ƣ%²\u001d6M\u0019s4\u000b+\u0011W/S2g݈\u000f@đ#f\u0019TMRϔMsFR3>\\\u000bk!W\u0010&ݵ\\z\u001fbjZb1nʺޒ\u0004н'x+RL`0Z;MN\u0000\u0002\u0012\u001c\\\u00014(\u000b?AA\u001c\u000f\u00118\bb\u000b6Db(ۂ#`\u0015ձ\u001d3\u0001/5_LR1\\\r~c-CFR\u0002&Q\u001c\u0014z\"s$?堔B\u001e0}\u0003ZW=\u001b<\u001b\u0003C\u0013aЃ%ۮ9V5iϳ\u0011mP\u0016#\u001ey]\u0004Z;Y8);\u000b\u0004\u000f\u0006~FH\\A_'OUٹ,G\u00155eR\u0018+P[[\u0019)\u0017\u0004_<y26IɜNOO\u001dv6pnb\u001e\u0007᝿F0lt\u0003ÿ4\n\u0017Fe\u0006э5<_<\u0002\u0006fl55\u0000\tyESȃQS\u0006T.GcY\u001fjOw\f5WؗmˀDjr\u0006s\u00138[uC\u00031\t\u0001͊Cƛ\u0013/N\u000b-/7b=eb\u0001\u0018]ãe\u0012FZP|[i\u001dm5'za\u001bNP\u0007m\u0013\u0010X\u001eMkw1C(6F\u0010R\\VgDMx\u0018z\u0002x\u0001\u0019:-m}\tѱ\u000bRB4\u00067G\u0013hn$H\n&0cef\b{\u000bcͪ9e}&\u0002\u00164\u001cO\u0015fjwq\u0012\u001f I/TXR̀\u0003\u0018\u001a\u001c)أś\u0003]:眶=\u000f2S!?i囧&\"7{&0\u000e\rWq?v\bjj\u0000w:\u0005sa#l\f<g߬X=\u001a\\\r|!E|hy\r\u00018z\"p\u001bZ\u0015EE3\u0017\rЮ\u001eb*4\"\\\u0018ʣ_\u0013>\u001b<Hb{W\u0003\u001czS\u0007fS\u0004&\u0003fK\u0018&6Vk\u00033@§\u0014u'ǅђjo`VS\f\teLri\u0013cɅ.\u0018۝y\u000efq\u0006vwX\u0011s\u0003N\u0015;MN&\u001d\u0003ftԉ\u0018Dj\u0012ݺn\u0015=byKL\u001a]px\bL[] <X>RO\\\u0006_b@\u0012&cgJ\nFa6:˿vRڛ+g\u0007r\u0004,&rB\t<^J\u0019D\u001a\u0001e\"2\u0016=\u001acHZ鞠Hs\u0010B\u0007{]V\u001cB&'Αi}sTjb(WU\b`}\u0012aK.I$\u00004޼֍j*2\u0003n\njQ#U=\u0001.I\u0013H\u001f؎4\u000e&0x\u0019z6x-T\u0016\u001e(\u0003Ì\u0005ua\f})a\u001ef\u001bj&\u000f\u001e6Qt7x`э۲z*г%\u0018P4\u001ef.\u0000$~\u000b3|c\u0006\u0006H\u001d69 :'\fō\u0014\u0012v\u001aɶ-3\u001a@0f;\u000f\u0000}\u0000_,ژTɇA\u0013\u0007~\u001a{2[l[)=ٟl2\"b\u001a\u0002pC[zX676\\5$▹&TdYmjBP39\u0003H0T\u001e\u001dXzUrTѶ\u0005Wb5bٴ\f\u0006XGov\"l\u000e'\tDZ[\u001fy@l# !7\rMђ\u000e\u001aܷJ\u0016\u001eE\u0007_BE<^AJjBy\u0003=\u0017a[c\n%e\u001dv\u0017\u0011\u0018qU\b_*7\u0018h`+U\u0012\u0006{U\u00156&bDqe҇:¦vI\u0000\u0012lh\u000bV\u000bâ̠c\u001cE\u001dݵ\u0012\u0013Y\u001fN\u0000<]b\u0007\u0001Η\u0015\u001bW2w\u0003hD\u001f@XA'V'aC;yX\\i\u001btN:udW\u0002O#%,}gڠ:}XEȚ𡲧4R~\u0013lCie=9|T'9PZEt'si\u0006T8u<=\u0010h6+\u0017Kn.03ޭ.`\u001d@\u0017(\b[\u0005E\u001f\u0006bYN?wC9!exѮjQZ\u0016U5i4$Th^\u0000Xh\u0002\u0019+\\`C0)\tc&n%T#\u001eߢ\u0015\u0002\u000e9u'4nNmt.|2\u001aM\u0002ɝv#,UF3p{Ǯ\u0019{ n\bBWΙ՜&,\u0006-Ӛ0\u0012u\u00079؛\u0019*Gi\u0001x\u0012J\u000b֊\u0006r5{\r$[f5@\u0017`F.:w\u001d%={nlڽ\r\u0018\tqĮV\u001f<f\u0014q'/W\u0000\f\u0015h[2,0?='\bFvlϏ@LN廊9\u0003T*1\r\u001a1wP7j\u001d6,\u0000!Lvܵ^|R4Cbi\u0012M,jZt\u0007\u0019[vD\u0014>zہ\u0019Mt:O\u0016O\u0005\u001bL2M]~[\u001cw#I4\u0002ٯ&Z5\rF\u0019$\t\rF\u0012qF)S\u0002E20C\u0006,ZF7>2[X \u0017@Uo3\u0019Ԍ\u0014в,&`M|\u00164I5)JSG*\u0019<i7t\u001a9h?ogH\u0017X{+HI&-\u0002.J\u00110\u001fb$@\u0004Q\u0000P熄y.B \n\u0001=E>=Bֲ\nﬗf& u4hw]X\u0006c \u001b\u001f-i\u001e!V2?\u001aCNK:=6?D7Mi\u001bFkɛ8d;Z\u0005`J:>\u0006bVЌ/1D\u001b^h\u001ej\u0003k)g\u0002\u001a\u0016˄\u001a\u0019~\u00008:b)#Ej\u0019[OU͌\u001b'\t\u0018v\u0019:Lv\u000f\txPM\u0011\u000e:U\u0011N\u0019дw2\u0015!4\u0018y\u0015\r\fH-\u001a\u0002t\u0006\u001cqa\u001c9Dĳw$\u0014&\u000bkYoq6lC\u00034\u000313xB\u001dNFDi8Y3;8bXY4Ϡ)MtG-\u0015҅\u001d\t3+\f{bw 1\u0005\f;\u0019p\u0006$\f*-6fo0(\u001ea.^Ȃ,\u0011\u0016O'ϫٰJ[78=8ɧ#\\Y.LOؤ|Ff\tQ\u0012T+:t\u0010\u0005FB=:\u000b߶qGXIKR퍨:?Q[$\u0004\u0004\u00069,\u0012a\u0007y{V.ܿ\u001f\u0012|c/cX~̩M\u0005\u0007\u0010\u001fG%\u00126EV\tN\u0012\u001d\u0018Q\u0003JJ\u0016]v=ޮ5REZD?\u00075/f\u001e\u0018(*~\u0017U\rޓd\u0002P|ieW\u0019}(\u001f&L$\u001ef\u0013t(]$̜M\u000633=\u0003\u001eqV\u0006$}^oz\u001eUy\u001e$\u0013.oKT9Xdz>L\u0016=\"\u001e3\u0003%$2ҷf#\u0012$jO\"\"y/ڀ\u0015}UIg\u000bA\u0012(с*$+\".Ȭ*ɂ\u0000%&@EMQ;%M!VQwGGV^\u0006\u001bW\u0005ڛ\u000b/\u0015yL\u00005%֏\u0019.\u000f\u0003\u0016h|g?. n)\u0010/-3g\u001f\u000b\u0001\u0012<{}\u001c\u0001\u0007\u0014\u0002!j\u0012bCYh\u000f\u001e\u0010z Ǌ8e\u001dw׏\b\u0004mK1 '\u0018\u0012\u001e\r0_]>n\u001eQ2Q5\u0007!$`,kD\u001a)@?Hf(\u0000\u000b\u0011%O\u001c\u001d\u0002ߣ0DbBz\u001d\u0003|oju/j`\"iv /\"NW0\u0015Mmҷ\u00165{\tT\u00029F\u0014\u0018g\u0019\b+82$@\u0017e'8*4]0f9\u000eb4I\u0018\u001dPT\u00047^U\u0006\u001a,>\u0002͹ԓ6m7ُW[) gt{EN~k5\u000eb\u000f\u0007vUyZ\u0014#㤲cBvV\u000fC\u0007\u001bҕ=<KV^}\u0004V\u0012\n\bZm\u0000\u0005\u0004Rٳ+`d$\u0019;\u0006\u0018 ~XQCP\u00139>\u0018d6>_V=^\u001f\u0011/|P\u001a&%\u0004\u000e>Zshm\u0000b0f\u0005\u000fn r\u0005ލFDV\u00114\u00109o5\u0002m\r߁ĴezɃa\u001b{8\nڢnq:D]\u000ee|kN\rqx>\u0007\u0003\bz,dY%NġcoϽ\u0019$ڵD \u0012Zt\u0011מBcS1\u0002\u0010B\u0003&d<\nb*w9}\u001a&{\u001cȳo\u0017wڰ\u000e\u000e\u001by\u0010O\u00077}0sm;iw|k\u0016|ƘX{~Wǚt\r\u001cȋu(>\u000b\u0013sM*\u0011bQ,==\u00024O\u001757\b`u,5cu;Ώծ\u0005Xe\u001d׏\u001cp͉h6,)Wڀ\u0000\u0017O2\u0007$WY2\u001a/dZ\u0013\u0013\b#'qąs\u0016AZjڶ֢\u0005X\u0007\u000eCQ\nkIfau8v\u0013+Is\t`\ru\u0010\u001aU\u000eM\u000f׏/%^Zi'.ǇUzOpn\f\u000buE~vۜ\u000bXeKQY|X\u0001\u001asO\b\f)Wn\u0010ֱ9\u001aX\u001a׸\u0004VM\u001c\rQX\u0006\rȡ=@Q8$\u0018X;~se@:\u0016V\"K\u0007gel\u0002Į#sX\u0000S\u0012\u0003!9{\b8s7>\u0017*X>M\u0010k\u0016|X5Co\u0017Y6\u0017\u001d\u0017kC_\bb.ˣ\t\u0015\u000e47G??֜MYO\u0001~ǌ\u000f+\u0010qc]\u0005-,Ə5\u001f\u000f\u0007~\u0017kI\u0013X;u1K\b`>\u001e\u0015!\u0010\u000fӆ ʪ\u001e\u0011ڮ]\u0017`!\u00014{b\u000bm\u001aRX'6-KxXG`\u0014s9H@\u0013+D\u0003\u0011\u0003}\r\bX/\u0007Uz\rYcEz㮖\u001am[L/ <\u0016\"6r5T@\f\u0017`]9z1%sXC\u0014ѣ@<67%\u0012h(Ċy<Cf\u00169\u001flAXX/ZyB޲Ea\u0001\u001fH\u0006,xdv+UW\r\u000e^e\u0010z4F-w!\u0000\u0018S\t|\u000eA;]NeX^6nx:KY\u0001!KioO۪.\u0003h\u0006\u00113\u0015|CVᷓ|&S^M'))U_o꓇m]s%Z}\u001a\u001a\u000fo΂oʉ\t\u0011~ü\u0007x\u001a\u0003BZ:\u0004n\u001ahK&\u0011\u001c\b}\u000eT9\u0004f`Kh~R\t}BTNm<o3֐\"B\bbUh\u0002o\u001d)s<ګkKz\u001b39♪ȳbG+L\u001f-f1J\u0015[HBå@i֫\u0002z1Đ\u0017\u0011@P\u0012&=;R[P\bǕ]\u000beVud;vZPnS/3;BF+D\fS޽W\u0003gu\u0003zV\u0002\b\u0007Bi\u0015hϷнg\u0019@DLB\u0002Xr\u0007u\u001dA`MY[v\u001a}+$\u0015S!3:V{\u0015z4BJ:SOojcQ\u0018\u0006&\f6\u00113\u001c\nb%|\u0003\u0001e\u0004\u00151ܾ V@]\u0018+\r\u0004\u00024=X\u000f׏\u0018ŰԂX\tC㉕\u0002\fШ1\u0016\u0013Quf;)\u0006ݞ\u0005\u0004:AU|α\u001bQ0^:9B< *`N0q;SzFU\rdߴ{#xjO\u000f\u0013\u0015\u0017\b\u001e\u0003\u0011\u0014k\u001fAO\u0001%6CԶ\u0007J\u000f\u0014\u0006:cxZG`|#ي\u0015\u0002:0jZЭi*V|4 $}L\u001e\u0002/*htw\u0002V=ic(4|@\u0019RI< [6Yn\u0014_64[>\rojyԪ\u000eiq7V\u0000:T[4AutyFF\u0004G\b1H!89^ϡ1Bݝ\u0006\tں\bRH/\u0011h\u0016]t\u0010\u0004EpKgx\\IJNS\u0019ԷF;8\t\tЋ\\-43MP\u000b\u0011:MtFNG\u00194TZ|\u0003(;\u0005zQAϲ'_ۀ\b*qA$\u0002xk\u001f\u001ccY#g\u000b5jWNfUV\u0004oO0=k\\e6.dTQ,ѩqqxkH\u0006p\u0010Z4>#\n\tL\u0015z\u0015\u0014\tj1\u000b/˃>pg\u001f:C\u0013\u0011 ~h\u0016@\u0011o\u0013\u00028NH\u0015@q郫XֺN܂-(|t-\u000e\u000eo\u00005g\u0014\u0012>\u0001f\u00192\b\u0018C%r\u0019X~1r4$o߂Eha3~8\u0019wZhNa^ϝYu&U\u000bm0\u000e-RI&ӽ\n.Sxc,*^-0K26\u000fZ,ҧk(#z\u0016+TzO}S4z\u0014K1{\u001c&K'(\u00011(1\u0017w;,ŝwIO'novȊٌ\\gw{\r^h93o@R|\u000e˻f[%JѬo~d?'I;Mrf3\u0005w\\rO\u0010\u000e\u0004jTR}&PX_\u001b-\u0014K=\n^Ľ@VO\f\u000b} 'lkdy\u0000h=<iHw\rםd/=H\u000bҐo`\u0010\b\u0000\u0013\u0011\u0011lx5m\u0011Rn$wKEURPWJ-U\u0015@r\\@xj\tT/\t0 ^G>f>-:NíO\u0016vSG0x=#\u0001\u001d&K^b.n\u0011F\u0001z)\fz=¦lLLI\u0010a\n;s:\u0016\u0005W&1\"\u0016tȰ\u0003\u0005r]i\u000bί\u0003`p4\u0011\ftK\r<(vg27J@\b`\u0018\u0012\u0000Ù2Ze\u0005D&\u0014e>q[A\"H\u0018\tAR\u0010@\u0002914M2B\u0012G\u001dl\fǻ`iCJgf;4GJ\u001eI\rDBu\u0016to1˲(7޲V|p=\\\r\u0017,{!\u0014\u001a\u0012'񀃘WTAt/f\"@=dT\u0005\u0004b|%K.5=)\u0004\u000b&#\u00041#{r[U叵*y+\u0013@\u0013h)C(J\u000b!\u000e\u0015\u0010\u001e[\u001c̉ϝ{ݹﰓ+$\u0000z!|\u0005x16\u001a[Vj@5Lc4FdDHs}߈ɣ\u0007B\u001a)\u0014,`ҨN\u00125i\\re\u0006)1@ڭn\u000f\u0017\u001d\rv{\u0005^AAh_nOL6\u000e?i\u0000\u0000vF9H@n\u0010\u000f\u0012DШ\u000bdY6H\u0018}Uj\u001cl\u000e$bG+N\u0014qn>֛$$Zl1 +TS.@ҸpCH~1)\rf:_1[̱\u0012\u0004k@\fA(d\u0006\u0000~V\u0005\u0001Efo\u0006×\u0018ۊ D\\\u001c\b\\\u001fφX4V\u001d*;\u0017=!>6߲_Dn![\u0013\u0006g\b\u0018ϲ\u0006\u0001}Ay,X\b@<?\u001f+\u0000H(8ʦwX\u001c-g\u0012\rGR*򺯞Ԭgj}0<L\u000b-V;An\u001e\u0001]9uG_dw\u0010M%|M\u0002\u0004&(IEac\r9=V\u0004ق\u001az)g*f4p$RY`\u0006pjP\\\u0000*\u0012lr^\u0000Mp\u0019\u001a\u000f\u0014lG)h\u000eDG8C-\tM@ۢ$[\u0010\u0004gHD\b}&\u0005\u001d=A\u0003QwY }yA\u001c1Dl\u0003X\u0017C\u001e4r>ƭ*Zr9x-\u001fO\u0010+QGtr>Z?1oa.~OH[||\u001f(\u0013ov9\u001fG\u0019|O||\u0000-RVR',q{b$V\u0012>\u0007׹:iE[\t'[m\u0018\u0004\u0011$\u0007\u0018\u0002xo;\u0018;\u000bˤ\u0018L˪^}\u001a)Ei\u001aov\nŠgyI\u001b!\u0019\u001d|U'y@\u0017H'>VEn\u0007WG=Ij'/e\rWu}+OM1y?,\u0014k&\u000f6vxm\u000f᭽*c&\\\u001bJ$\u0019\u001aLw#dٝж\u000fˍzUv'ĊVUg\\4ń῾R:?\u0002fiИ\t^\u0016zzY)M\u0013oyƤx\n9\u0013p[E*\u001a1\u0000@/ƍ5nGVD\u0005|[MʦWR\u001c\u0013,F\u001bPz7j\n'/o\u0018pp\u0011͓y\u000e,B\nՌ\n{i\t$3;\u0014ϯjr8\u0012\u000fXo\"X\u0018\u000e׌\u0006јa\u0012ea>׈ƌ\u0017[Db)(frB\\?!\u0015Xx\u001e\u000b\u0000H\u0018Y\u0007\u0016\u0018yJ?t\n_dP\b\u0000'\u0013\u000b0^\u0002\u000fiU{_Yzs7t\u0003\u0016۽FDcٰ<NpX\u001e+wP\"b\f\u0018,faz/\u0012\u0002\rv@uƊ\u0010Cłx|)ʀzQQ@eYW\u0005+vZZ?\u0005_N[ߋ\u0005\tWqL勐\u0004%7\u001a\t|f'\u0003e}'R\"'TKXDHeڧ\u0017)9eȊ\u001beQ?\u0011\u0010ћ\u0001+Y!!zs)|Q \u001aU߉\u0002Go\u0000\u0000X\u001bp_.~?z\u0003X\u001bq+VV #@HZu\u0010\u0016\u0004'\bKJLC:4Erե\u0018ҶP]/\u0011+$ٟɍ [VL\u0004\b\fΫyA,\u001eY\u0006V\tǢ(c$C-]|Uv.O2,Q'1'PďV29L;ɊE\u0013c)\u000eX➯\nG#3y\u0004H\u0013\u0013<޴+SFeh2U\u0011oʼ$oT1S\u001f2\u000f,U8+h\u001b\u0017W17$t~2\t\u000b\u001f(Kޏ^\u0002PKASJe )\u0016ll5\rbD΅׀З, \u0011*\u0016A(F\u00002NnXk\u0006\u0003h?|\u0004R'\u001d'Z}z1\u0019,a\u0014\u000e\r\u001aߑg\u0013=]y\u0004Di>JG1S\u001d=~c\u0002{b\u0012~.\u00133I\\^\u0002\u0012>X(0ny/scFY#-\ry*8\u0013^ݏ\"j\tmB&%\u000e\r\r%J-\u001d&Rb\u000b/\u000eHw\"Y\bGdad!\u001f)\u001dtys\u0007\tA\u0011>\n%\u0002Lyl}[\u001eYEy\u0002::\u0002\\(㟛\u001f/FI4q\u0017\u001d\u001bEyx\u001aYR\u0017~_(\u0013Ib\u0016#])\u000f-V}\u0014Lr=N\u0019_MR ( 3&|>߻\r\bww&J\u0012N\u001e\u0006o\ry]u.\t\u001e^+\u001e!U)*=\u000f!5\u000f\u00152m|v'< Q\u000baU\r\u0017D-j\u0013׭c9\u001cI9kX8Ţ,vzO-T|Y\u0011WFQTTW\u0000]L,MyzКձ)P\u0012+\u0004\u0013hʏD&\r\u001e\u001aVvEWew2U&ӈY,\u0014vB~Nbo\u0017~ZM\u0010*/gBX\u0017\u0014[XnR7\u0014\n[\u0002ѥ\u0006NEWb;\u001f_;*hj$kKd;j19yLÍ\n&n[\u001a+\u0016s4n{j4]3E\u0012a\u0001\u0016;N\u0012D[\u0013֫<W#]\u0004\u0018\t(\u000bu1ə/3\u0013.\u001d|uxtzq\b97VP\n\t\u0015ip߸T\rI1\tJE+}_ټ[%v?X'<o\u0016E\u00119r>?_-\u0014.\u000b\u000b$A\u0018Jx;?V\u0007ϋLPE>}c}|U}\u0014UI\u001az/Jwqo\u0000\u0016<,՟)#p7\n}ZE\f\u0016\u0004~o\u000eRY\u0006\u0006/\u0015\tZ?[\u0006ѾS\u0002a¾\u0011>J\u001f+\u0013>>\u0000\u0010\u000f\u0017m3OQ\\ܟ({C}\u0012֛(#\u0007T¾\u0005e?SWǟ2\u0011\u001f\u0011iD[;sJN3\u001d,7Jr3o?\b\u001c߸ŏӧ+Mӷ\u001cHuի\"ՓN̄KX$ڐ\u0007҈?\u0002BbIRxFt>\u0011D\u0003zj>f\b+\u001b\u0011RS-?e2,\u000be)<\u00177\u001e˚߾\u000f.W.\u0013T6:Ǳo\nʤIʹx\u000f{l\u001fHfG4%AHHo_wl*\u0017I~:f.[n\u00117j<?t>qt\u001eɃ\u000bhr6\u0011e+.\u0005}\u0016\u000fK铒A\rѼw\u0014\f\\\bш$7\u0006\t$\u0018,d1\u0000j]\u0004\u0015\u001c\u001fS6\u0017˘V^KN\u0002^IN\u0002$&gR\u0013g\n1\u0002Z\u00149\u0002\u0012\u0001I\u0003\u000f\n=q\u0013H@-`~]iO@T+x\u0005ڷVV?x!#>\u0006+E\u00173Aj?7tgS,k[\u001dEܔmq](k\u001bl~0q\u0005\u0017T&RB\n^wk[{\u000bnmcPDG\u0000\u0013\u0018{7\t.ˈXճ/K(,y!BZ{\n]\u0005yx~?aSF''g\u0013y\\ }y\u0014\u000f6JJuW#v/.{$\u001f\u000eK_;=\u001fA\u0017Wr/yQ}{/Vr\n1\u001dߍ6b<o6c7J\"/(QN\u0000#\u0005yDo% \\V!À\u0012\bS}WH^\u0002ȣI\u0012g>\u001f@Q\t+\u001b0louwN !\t3@'TwWWUWҕ\\\u0018>`\u0011\u0016\\*?TgiR٧j5j++}toV\u000f{IJ~9\u0015gϻ@TI\u001bLc+T!ph\u000b}kn~$ĸ_7A\u0005*顧~V\u0016qPmV\u0010Mw\u0012\u0018\u0002lȼ[QЎty0&^y\b-F#CC'Dw/\u0015٣z\bY\u0007KFOsjX{ZlD\"LٜO|KW[f\u001et3YiӖ-{iC%3/\u000f8l\u000e\tH\tnz<zr\u0007|t\u0015f-N7]{M\u001cv7t)׈Pf!\\\u0016^9rD~Ӫ(:.SEB7\bJ|3\u0011ιKtZ~,伶Gkb~Q\u0011\\\u000bOR=^zUX<qRiVcq\u001c5?Y.k'\u0001\u0012^^[\u0007>@fӊq¬[S\u001d5=iȾ<3:\u0013*;l>\u00024}l\u0000|י\\ܘ\u00165\u001f:&L*ɯZ\\5Ta\u001al\u0007^VƯݩ\u001d|fc\u001bU\u00187\u0004@E+-\u0004%xGU\u000eY\u0019Zn\u0003\u0018\u0004˘b7\u0003ŀA7^r/\u0007\u001b\u0013\u0012a`p\u001d򸗶{+\u000b*Ƅ;i\u0000C\u001f{/>W~&V.\u001463<ҾDϕU؍X\u0019sޅJ[C\u0014}$HۣTqJ⪷..⚷T3ߝ\u0001Şf\u000fEYT\u0003x\u00106\u001f;Iws&\u000f14qz-/g\u001bG\u0017u\n]-0h.\"a+).\u0007vם1XB|\u001d\u0015*ygSE\u0002ezib̿ռlKUuۘ\f\u0001MoAGni#/qY\u0005%kH9{B)Q\u0006:N\u0000h\n\t%R~=9v\u001544\u001eUP05G\u0017hsY̋F\u0003i!S\u0012#.˿Y+\u001f+$GJ|\u0005v )~\u0011`P)~\u0011;tJ^<Ns1R\u0012#bOIP-A\"L)~\u0011tD1#dDZXaU\u0015ҳ\n\u000fXadY)Vgx-\u0017+X/xy?)V0D\u0015F|\\X\u000eKҲejމ1\u0001\n\u001ez$G,xV\u000b\u001eR[\n\u001e\u0006\n[л\"#d&$\u0003{IV\u0010\u0005\u000f}\u0010O\u0014<\u000e7\f]+\u0016<\\PCv`j~rC9\u001c\u000b\u001eF2Wf\\\u0016\u0006Æ)x09vkV.x}oa_W\"\u000f\u0014<&G\u0002]Q<8:DEY\u0016\u000b4GCo(^@\u0005\u000f`\u001fO\u0014<X\u0015\u000b\u001ez'FIa\u000b\u001e.PBji\rI\u0005\u000f\u001d٫\u001dm\u0018,x<\u0017G\n\u001ezW;\bzł!ޔrZC+l\u0011EZƔ`)\u0017s\u0005\u000fqH\u001f(xs7\u0014SZ:+\u0015<4,d$s\u0005\u000f=R.\u0016<Vl~۶~!\u0019.̇o:$㲂޾kGXBv;\u000faT\u0005\u000fq6+\u0015<tς+^11\u001f\u0000\u0012D\\j\u0005\u000fm\u0016jı\u0003\u0005\u000f|-ګ+\u0017<V~(-pCj\u000b\u001ej\u001dYO.\u000f\u0014<v\u0018\t\\0TjSt\u0017<\fOU;Y\tvhJh\u0014<\u001esnk\u000b\u001ez\u0007Q9-P\u000b\u001e.X\u001bڡ+҂\u0016<\\iGZ+\n\u0005\u000f-!a\u0010EGCOV[cԏ\u0017<N56\u000b\u001eڧv8^]55%p,xOY!\u000e\u0019+!\n\u001ez\u0015A\u0001\u000b\u001ez\u0015...t0\u0012X\u0013-$J\u001bIfv,}bJLfhcSi|ca'\u0006Q,p\u001aػAbCK~ׇoI\u001c9}<i\u0017t2J\u0014GEvz>\u0015c'§n7OFhBu<2#';\u0019FMz)^\u000e\u0013uT\u001e$\u0007)wxs7'Fhc\\RNc)\u001b\u001f\u000e\u000fS?\u000feH\u0001m׼1BLx\u001bdvD\u0016\\\u0011WS6/\u0017-9g;\u000ffuf2bC[3\u0012\u0010U։:@R^\u001bm\u001b\u001d\u0002H\u001f\u0014\u001aG\u0001\u0013n\u00111\u0004d'?_ދ ?z\u001em=2Uct\u0002Npdz}=b\u00178\u001f\u0015o\u0007\u001bKTe&\u0007\"n\u0011&\u0012\u001d,Wwhvyzk\u0005vsT`'>8\u0016g^ĺ\u0000fd%E|fGv#6:\u001cb>8mg*7wu\t|T,9ɭ1>Zq4\u001bS\"YI\u0018$9\u0003N_5ƹ {\u000en\b\u0004lk\u000fch)1/l\"\u0000eٍY5Y?<䳉?Hؽ|\n\u000f\u0015O{nzЉv\u001bY)g=\u0013}1a.~i\np\u001ak\u001d-c\\\u0011g|\u0000վ8j|ʡLO4\u0004U \u001b&\fy#\"G[nBb/.\u0018֫RB.8\u0014|6_g\u000e׫UͰ'W\u0003\u0011^gS!l^\u0019\u001b.\u0015W9jR@#M\u000bd\r\tEحM\u000e#\u0011e\tہB7(<>4^S:=?\u000fq\u001dUL'փ`\u0018yS\u000fBj\u001b\u0018xZ'뻈o\u0019!vP~=O\u001fMA/g\bT\u0012d\u0004C&0\u0005\u0004Ai#Co۳K\u001dKΤ{FivL2\u0019K6VB{6\n,~0oߍaʒ._d\u00136\u00198+\u001bþ\u0013'\"n\nM\tW~Oλwy\u001cY\t?^\u000f.\u001f\u0013npkm\tBTW\u001b[K~P;o:eEĲ7ϕX.:Orl\u00029ڸlj:z؋.\u001ecWFC;U܄I,@DFx| X\u00140r4[\u0002Es\n]WOa^F\r\u0015\fB\t+ҎIHyVx\u001cwS{\u0016v5Ѣp\u000f8#\u001e\u0013Q`A\u000fM~\u0010H\u0011\u0010X8EcK\nOUy@@o꥗A\u000fz.¶B~56>75*,\u0019\u0012Y]޾I\bizv\u001c\u0000:P)ہ\u0001)<\u00185\u0010\u0018_\u0004)z\u0005 \u000buFkS\u001eV)\rW0#V:X_^N7(\b\u0014\r#^qȔ\u0015S?\u000bI%Zj+nnk\\o<\u001e\u000eӴ\u0016\u0005*dZݰ`p5u;?0\u0001'm\n\tP:Z\\4v\u000e8\u000f_΢\u001cq\u001bl7\fi{81=1zB-]\"4KU%ȑνy$,-]Mw\flW0\u00143ra\u0006RMT\u000e൙P1\u000ea\u0013Uz\u0019\u0017hp>1ґVL![\u0010Ĭm\u00022(\u0010:frX'£<2:\u001eʓ+\u0013\u000f4\u0012f\u000fg&\u0012\u001cdhUOa,vKU,<{\u0006\u001e`8}\t\u0012qSU#/\u0014\u001eAjԈ˂\u00041\rXҫ?.<\u0007a$\u0006֢ؐ\u0010$\u0007\u000b\tn\"\u0006G<qYe\u0011A9`\u0001d\u0016Q$!\u0001_Di9L\u000f\n֍+Lqe-\":L\u000b\"N\b\rC٬\u000b\u0000\u001d\u0013\u0006x!#XH&u\u00003;\u0000p\u0016c)6\u0001@YVdV;.9ƦW_qϧ`_\u000fPZjUJc]\u0001(\u0013\u0006\u0003Z\u0000\fJC%4\u0000'vJ\u000b\"Y\u0007\u0000\u000b\u0006o=\u0001dZn؜[\bN_\"\u001f\u001c\u0004EMphT9l0V\u0011\u0004@p\f\b\u0002\b+.\u001fD]=)e\b,:7ia-A.\u001a\u0004\u000ez\u000e7i9\u0006ANYQ\u0005w&:&\u000f/\u0011\u0002o\u0007ie\u0004Q?K\u0013x\t\u001f@7\u00079`vIRVyg9\u000et ',>S\u0013\u000f>\\#ge\u0003S\u001c+K)bz<\u0016u+w/G\u001b#-O~\u0016(yM'Ln\u0019\u0006ĭ4u<6\u0000\u000f\nYڤ$$\u001b{Ƴ*C#cb\u001bwgKV<mE,~sۚɮir\u001evٛd:@gbh*S^?X_\u00174[\u0006~\u0014L\u001aːU}\"\u0006`uK!:]p_/\u0018.og\u001d!7\\-e2\n6\u0014A7޶+~=fQdLQHի;\fbȪ\u0012܋Ʈ\t(Oӽvp5W{ݮ:h\u001aԅsAֳh%긟7ɷ9xQB\u00025\u0000[@bO\u0010}\u0012O\u0012QT\u000e޴Ms'e\u0000Q^QR\u001euF\u001d+l\u0006_BdgC[j\u0018Wq3uP\u0004ZH}O\u0002ɛڤ\u0005ùܴPP_9ɍj--\b~\u0016X\u0004-Gy\u000fRg\b\bU\u00194$,M\u0002\u0019\\擘u67\u0015\\\u0010TKt=ذwwsJWG${t\"\u0019=@\u0015DU)٢MѦ{\u001a\u0019ĭǄr.}5q6q\u001f&p% ȭ5\u0018{pllUPN\u0011[\bZ\u001a,'w\u0011\"\tZJ\u0002nwT\u000f&Q}g(\bI,!7z߿<|}ѭ({pU:<TruGIܒ7\u000eY+ۚE7#4\bZmP_s=:}=B&jdCVX{eU,Yd\u0016Иӛw\u0000)r\\U2'[H\nr]CmY`'o;l|_*SnHa@%s5=\u000b<0݌vN%dTAt\u0014$\u0019U6M\u0015\nb\u0014\u0014=؏\u000e^,{rWGc\r6*!EyC,f\f;P\u001ea<\u001a1\u0019\u0011>\u001cdXMN;Gi8h;D^7i\u001d\u000e\u0003ljp!gQ=WL5cwܓHMpPe\u0019xۭZ3udFk\f\u0012Yix\u0014hCg'ff\f\u0017,m\u001cP\u000emU5-yJ\u0002\u001a*Ȳ3X3\u0016I,0&&\u000bĞ?_2C\nM\u0006Vrݾ\u0018`GH+ͭDS:(|傎3\u0011\rU@.{^}4 SGꅦ֪D|ۍ\\պͽlY\u001fFԠH;4uϰ^nթ{a\n>=n}\u0016C\u0001֫1a; s8t\u000eޱ\u0007\u000f٢.\u000ez\"\u0000ih6\u001by204O\u0005.v9G\u0015?u\u0012D\n$\u001eJ\u000eo2\u000e9vz|k|\u0001:gy~_]eW\u001b<S{IdC\"KEEz<RQ(2\f\t2\u001fTx?\u001c\n\u0012\rt9\u000e\u000e@^qv\u000fNʳ\u0019<ݯj^h76w\u0007VNH\b\u000e\u0013d2?QN6bOr\u0012RIpd91\rԶ-{f3y\u000exs|k\u0019\u000fuWJ2;1`l8a̺#uy/\u001c9\\n}6Cʂ:v\u0007\u000b\u0015\u0018.\u0012@Kj;!>yd*H\u00107\u000e)+)3Jm\fT&l؇-ߧ/4Y$?/-&h,<1옦6:f\u0018ܱ\u0019sQ\f<\u0014D\n\u000fLAb3O\u000f\rg`!\\jpz6\u0017Z:^q\nȅ{Tc,wG\u0015\u001d\u0011ӷ\u0019رbڝa;Snj[\fT\u001aE\u0011h6!a+\u0019}V\u0014ppx\u0003\b\b-ҶIzEhp\u0004\u001b\u001aPo\r\f\u0018i'\u0000\u000b\u0013 \"V%\u0011_ʢo^9塞\u000fz]zr,kl_*\u0004\n\u0006;\u0004w\u0010n\"'iL4z7\u0017a2OinQ*On0\u0013\"JBF\u0015\u0000)\u0006)_\u0018DqK)73eH8J<6\u001b\u0006aE\\Ր\u0013Y$\u001c@\u001c\u000fF%ʏ\u0017:\u0000al\u0007@\u000eC&\u001d\u0006\u0019i6\u0007amplM\u0007afhљCDskJ{ \t&\u0001l\u0012>\u0006&4%#n\u0000kbHSDkM\fiJ4~!M\u0003X\u0013C\u00121\t\u0004&4%F|Y\u0013C\u0012l\u0002X\u0013C\u0012\u0004&4%n\u0002X\u0013C\u0012-)Ϛ\u0018Ҕg\u0013HR\u0016d\u0017`\u00141!g\u0005X\nMf\u0017XO\u000b\f\t\u0005\u0013aD\u0011\nȏخ|h\u001f\"4o@U:Ưbo\u001cG?\u000ey-\u000bjTe\"F7+ߎh\u0003a\u001e3ot\u000bݝ4V݆I\u0018\u0013׆Q\n/h/.z\u0007\r\u0002<?L\u001euoZoG/'sѓ\u0013\u0017EeW^$Q~\u0002@.Ϩ$Gs0\u0002iQQ[\u0004I$-`4\u001a%F7\nʈ,EsyѤ\u001aD^\u0007Z;/Q3q*i\u0014c\u0018ț#ySh$\u001a\u0007̉4\u0019\u0013~X~緟%`ԼE@ \u000214\u0015>$\u0003)BH$d\u001e#ZTeFQ2\nH\u00122#+\"B2j\u00162Ȃ\u0006\u001a*E\u001bר\u0007\u000f1&\u0012\u0007XW\u0015\u001e^T%\u0013D~I<</ qY4EY\u000b\u000fU{n:4M\u0014\u0015@\f\u0007@$)|^Z\u0010Q\u0000\u0005\u001aF\u0001\u00074W\u0019W(\u0000yE@\u0004\u0000V\u0000\u0005\"P\n\u0018\u0015%\u0000\u0003s\u0003t1yC?%&/\u0000\u0017.\u001cO#\u0018^>\u001f\t)\u001aë\\\u001e`\u001e&)\u0018/( B\u0000QXM*\u00113\f\u0004\u00064$\b\u0012##\u001a\tyXhM\u00100\u0002\u0011wh@\u00109A\u0013<tK@b\"H\b\b\u001c/'^DB%\u001e(K\u0000E\u0001\u001fc\u0000\u001a|\u0010\r\t@@\n,\t\u000eiH#\f\u0012(\u0002\u0007:\u00116\u0002v\u0015\u0000}\nCxFË+AT\u00189\u0015k\u0001^4F0U\"0f.\u0018c@\\\f]<ST\u0018C\"0\u0005\u0001\u0000ى 4\u001a$\u001e\u0019V\u0003NQy\u000b\u000bӀ8\u0005g< EQN\u0004\u0006\u0005\u0014\u0001g8h\u0000\u001c\u001dNJ=\u000fhC0傤E(^B9,?x\u0011PE54\u0000\u0012Ò*@z\u000b\u001aӁ\u001d\u0012\u001coc\u001c\u0006\bJԜm;̗y\u0012M_yud\u0018\u00007E\u001eh=G\f\u0019\b\u000b/ ox{\u0006EvvI\u0015\n\u0007쏶\u001cH\u0005\u0018oH@\rЧpzGyԭYU\u0015mz\u0003\tk\n\u0001\u0007&p\rg{FQ@:X\u000e\u0005lw\u0007R&G;__igGѷq2\u001dɟP\u000b\u0003P\u001fϪ_\u000fG?OQ\r\nendstream\rendobj\r257 0 obj\r<</Length 65536>>stream\r\n%AI12_CompressedDatax]Ǒ._\u0000ߡ\u0001qX18@ծ\u001e)\rߎFC`S%m\u0016)P=/\"sw}<\u0003qudԪ\\y\u0017?~W_]<'?9{x_0\u0017_wDv󥣷~Ѿxo~?۷\u000fo<?#o_@䇇/ۛ/^\u001a\u001c\fn^\u001f?\u000fn\u0017^s~śW\u000fQbD~ݛ/_T/\u0014.R\u001e)~÷G/]r\u0019J)e\u001d߹yǇ7ˇo=}ݷ?8ś_|=~\u000f_\u0017/<~\u0017W\u001fG?x=/|W\u001eaG\u000bo\u0007/\u001e\u00077\u000fߏFy(\u000fZ;3\u001fO\u000f_\u0019o?S~ݟ\u0005O1<\u001c!|\\g<_|eIΏo\u0017\u001fg9\u000fyן_X\u0002\u0018w#S\u0013\u0017?w\u001fͫۅi]_>\u001e],^߾x1o_eVTܿ\u0003ͨG#o/Z\u00174\u00145[\u001bqmw;\"FD՘_{7?iw]E\\?<F7\u0011c\u001d>_7/\u000fo\u001fi22V˛^\u001a?\r\u0016}oa\u0017c~\u001bb/~~o~櫷>߾{ryǶ\u0007a7߽z07?\u0000\u001e.߿yj@o7\u000bcx|a/޼xw?02~b\f>i\u001fv,o/;GM<j?\roB\u0018㿿}GcR\u001fٻ\u000ftwo߾\u0003!/Gs߽i^>?.Ëׯ_}7z\u0014\u0013?G<Z\u001a?F;4_z\u0015zs>~C:o\u001b\"ӛw˛ob\bU\b?x?{q\u0000\fŗ\u000f\u0017ߊ2\u001f\u0011ơ\u0013.|ٿ>l\u001c'_\\ሥsi㯎Jg\u0017'x[~\u0013c?߸\u001f>-\".~ś\u001fN\u000eoct9.슫ܵ;\u001bw\u0007\u001f}\u0017_}_k7\u0005\u0017|\b!\u0014r(a\u001c\u001eu8p\u001b>\u0018c9XUx\u0013o]rɧbJiQzJnm{YvcN9kn|\u000f&/ahcJ/W\u001cM-wU_CCɵjW\u001eMw5B-Jޮu;v뾇\u001e{깗^{_~7>^+\u0015UW^~uuu}uv:\\tunp}s}{}wp\u0007\bxH|(C;p8\u001cn\u000fw7߄xnM7f@gn\u001d\u000ej\u001e\u001fZ\u001emv\u0018=pWw7Oѷ>zFw\u001e+*5m\u000b\u000fKm|}\u00190&iG\u0018kwcnX\u001d\u0011\u001c<21Md\u001dz7Fva>^?eΘ1Oa̗܍ٻ\u001dsx\u0018s9:8f٭csI>\u001b\u001dǼeY\\\u001b+a\fX\u0013!cRX/y4VO\u0018h,t7V\u0018ı:\u001a\u001fҨYEǋ'Ǻtn1c^5{5Vn\u001b+uz?a}Xczƪ\u001ejƻatp4vH\u001cď9c2\u001e\u001e{gѳ\u00105}'6fc\u0012hg=쩍}\u001eF-s\u0017ĳO:38ʙ}gp\u001cCr:\\{\u0006s{\u0019y]V\u0018>T\u001d*-\u0017\u00067nv;daȶ!ڡ\u000eC\u0002ci&L$1bc2U\f\u0013\t&\u000b\u000bKH-Y\"D^\u001a\u000fJdUd9%RJdJ(O\"D6d\u0012R$\u0014S\"<\u0012i$\b\brHȠ\u0007\u0007%ϳ yTԁ\u0011d\rK\u001a\u00192}\b:De\u001e'y\\wncBy?\u0006mHD@\u001bz\tcί\f}ίoפ>gW=\u0007ꉽ=}c}I\u0000~\u0006G\u0013\u00129/}\u001a\u001c0rQQQQQQ\u0007jc2\"ɶrL5\u000e\u0002wk,8},*^\u0019n8(\u0004\u0013-qa+2lbSdh$ͦ<\u0012d$ נS\\#FDȷ)HƩ#9#y\u0012dJ;|C\rYGҏߵrʒd!I\u0004H2\u0017Ȳ#=#%HKc;벍Yyx\bY~15ޡ34_ynssmϕ=ݞ!zox͓7O:z\u0019\u001c\u000bg\u001e\u0011\u000fky\u001fkO\u0011?9#O\u0007Ǐ\u0007>a>8~N$\u0001vÇ\u000f\u0015SA61ϓz'pY\u001f\u0018-\u0005'.\u001bEg8~\u001f8\u0006\u00145o۾s(\u0007OPO}w~}tO<'z\u0007z=^8.\u001cs'y~ݻo^?\\z\u0010^Ζ0㰎\u0018bދ/&\u0018|wǧ2\u0017A\u001ec\u0007-\u0012k<>)|7X)W\u0012\u001c`ܲ=:3>\u0003\u0015-FY\u001df+j-2l8>\u0003[4՛\u0019\rmSYl\\Rt`;,[V\u001d;m*Ub'Ux\u0014ի\u001dtŶ\u0010YC\u0007V&6`F`3uvP\\RHӁ-\u001bna.&!\r\u000ffaa\u00139);4*[[-V\u0015[^\u001c\u0016\u001a\u001f@jAa\u0006ob{Mڣ=Wx\u0019:xƞ[{/U\u00136X\u001aCq'rgpԿx>>N\u000f2\u0019v\u001e\u0013>c~\u0005>;0\u0003C>%P?z\nUe\u0002\u001785]y\u000e\u000eXwX\u0001\u001ei`=V?]s\u0007.]M\u001e+FE\u0019.Ї fs\fm\r5D6)3{\u001c\no,:ኍ\u0003{\u001fnرv>\bJPEdoDbG\\\r_/A\u000e@r\u0001^w\u0013䡸aG-)A<;\u00065Hjv\u0011fv\u0013CC$[?!f\u0007s-?b諕BfV7,^o\u0012\u001e\u0011q\u0010J7\u0010\u001du;+<pcf]Tp7O8z2}m<?\u0019\u001cʲ3??r\u001c\u001e?\u001f9\u001fqj\u000eKk?9xAL\u0002T?~\u0017^D\u00037}Cӷ_\u0017\u0014_}{Rh1\u001aV2KLO.\r=Z.]\r\"Kr/weH޻,هie+.^~Y_9Bϧ꩷>q~͋Ǉ//\u0006ܜ\bt(Ёm\u0003\u0012wl/\u0004\u0001>L6a4\u001dq{K11\u001cM\u001c\u001cG聣w\u000blB,X[\u00137OZi>ӧmyZqZrEu}g\u0001%\u0005[o<6coI'o<j\u0013\u0019؆[\u000bq\u0012mE\u0017؟n\u0004GZf/~<o-\u0005ȱ\u001b?]qrD%߹ۻn`_5ګc\r-\u001b\u001d}?o7\u000f\u0006}؃? B>!\u0014\u001e\u0007>R8g?$L(㱒\u000b!<\u001d`\u0013΋r.(s\u0018q7-qr\u0019+'\u000e\u001f\u000e\u0010C%_RNI/s^!m\u0010(\u000boDNO=3\u000fڃc?\\}s\u0006\u00139|38>ͧ>'Ώ\u001c\u00118\u0016\u000e=hѦI.F0D\u0016\u0000xq\fQy\"j\u001cq\u001bI<h\u0013\u001d\"\u0001QE+Jd1\u0003̄@\u0004,t\u001a\u000fyTN )8\u00133W򉧜y\u0019\u001c\t.pF\u000fGj}\u0006ǫ\u001f\u0003egMWc\u001fݎ\u001d\u0014\"*c\\B;ď\u0005y'\\ʿUx5ڥUJk֚D+\u0001ۖfWUi6ZÒL\u001a;eؖ\u0015Qa\u001d\u0010\u001c.-[Ӯ9?%F(\u001d?\u001aC\u0001N<\"w \u0011bqh>}yƟq<ss>O;ڇZSb<\u0002ϿwIp1\u0010Oxn;x\u000e>=\u001f9q|#\rq\u0007_\u0012;\u0001R;~p²_U樏\u0017)B.\u0007##ZѝR\u0007\u001b*P\u001ayj6wXjZD^-|k/\u0014'\u0011\u0015:\u001aO\u000b{2{]#\u0002{j%LgW8h2LӄyRguGK7aTʵ*o@u\u0011S/\fU8\u001f\u0003޻sk1A>v\u0006/f\u001cu)r.R虙쳣,\u001e9c9<x\u000e,g6&g\u001f\u000b\u0000rPc\u001ef\u0005vk\u0018g\u001f^?c~6sAzLl}ܱ_r܈9.?6%#c~X\n\u0007<\u0006!8@\u0002y3\u0013\u001d_O8>J~PN:\u001f}q~F\u001c\u0013w?;]1]\ra\u001fC_{\u000f֜O\u001e|T\u000emMq\r:a5\u0018v\u0002J\u0001\fN\u0010\u0005!5\fy*6ȴՠ$%Zʵ\u0000%*\u0006Hr\fU\u0003f\u0000\tXrرw\u001c;l%(v||.[D\u000fFmc`qy\u001d<2n9Ⱥ-Odnnn9zU\u0000\u0010My;8~\\>v+\u00032I܇l{\u0007\u0004|\u0016\u000e\u0012vfwްr\u0011{\u0003F\u001f`\u0001\u000bߟ}\fq*v1+zn̺\u001b9\u0012\u001eǻT}hcݚ|v\u001acك'ݗO>x\u0001sޗ\u001f(3ߙ;EJZeJw]SS\u0007\b?Y[c>\u0011:<ĿFoZgA\\B\u00003+C2o΂:|G=\u0017**N\f:ժ6\rwbo\u001d\u0016noM\u001eUmXWq^\nd=Qu컣v\u001f\u0003\u001c\u0011WgΛs\u0003\u0013\u0014X\u0014:w\u0016-;X}\u001f\u001e;,hd13Y%\u000b؊FPew\u001cᱞz\u0003'V\u001bzRU^je\u000f\u0015߽yAZ5F\u001e˱\u001bEK>H[\fONǠ\"]|~.|F?Z~\u000e~/awqO67<_oK\r.w\u0017St8q}\u0018vH\u0018\u0016P\u001c@v\u0019&gr-\\ީpAu\u0004wS\u000ed\u000e\u000f%.oc\u001f\u0018[8n@\u0015Ge\u001e{tۡPPzLPCV5\u0010\b\u0011p\u001e7\u0010}ӟ2\u001a5jJ\u0019&0v+Y{`ӝ.0ѻQ3S%Y\u000flt\u0019k6_z9_ƒMps\u001c\u0007KI~B)6ǭnO6IE6Y=Mtn_:ǭέvK\u0016̭vK'h6\u0014kt^x/\u001a2\t\u0015إwzg\u0011\u001a7%\u000e]0KyntI/jh84cP7-\u0019\u0011Q&\u0007o\u001f8t헂\u001f1F5S~ȼw4}vӜ}\u0004~ú0U\u001aE:~ƹ)Q;ǲ\u001aZ7\u0016ƺjϢ~іߛO\u0015dDtǾ\u0015=׶z[HۯU~H+\u0004߲\u00136\u001f\u000b-6?9v5o>^w(\u0013Ґ\u0019\u001eVJx5lve\u0019bjصJ\u001b\u0003Cn\r^Qn(\u001bNʒ,ݧ/H\u0014+\u0013{Ӓ\u0011\u001de\u001e}K]\u0004M?\u0002>t@J\u001eS\u0006uOs\u0011\u001bЮ.zu\u0013_J$\u0010ú\r^1\"62\r-mvv^W\u0018\u0013ڒ\u0011\u001dVt_ٕQ%F/hP\u0003\u001b\u001aZw^w\u0018\u0013Ґ\u0019\u001e\u000f(H[\u0005{]mXT<r\u000eq䬏/\u0012@/\n\bI?6KʤY@\u0013\r\u001a]\u000e\u001d;\\֑Ԇړ~dޥ\nvdhTb\u001dH耽jJKbڕ\u001a/wN]\u0019ZT*YWL\u0014ˢ]Y\r\u001dG_l$*CQ+r>\u001dHܻ:H\u0017366sی\u001d57\u00066n;֕7n}դҹ~mR;y,o:\u001d<o=gR6Ig|O<n?{.ȫ>;j6~^;)ϣi!5=H!_>۳t\r7/ٽAی>m+6ۇ),\u001bY6`qf8>ZlK[c.[/y:XζhL\u0018\\\u0011\u0005iKcst?twcyЎ\u001et\b\u001fv\u000e>gjzX=}CD\u0013kzw\u0003^ƶ\u001f\r.=G\u0007݀O M\u000fI\u0018Op\f.'}4OߑfnÚ)>q2%\u000f\u0004ҮoO]=$<O_\fzKI:3=s9\u000e_@\u001b\u0007\u000f9/'\u0017G\u001d\u001c}JԆ\nn9\u0016g5.M>\u000fΗէj:~\u0014\u0017K9ɔ¾a{v+&}skzXc\u0002M\u000fozҷML>軦kĀ\u0013n\u0018I61&'o\u0003yj5зML>MMN\b]C]\u001czؾIn\u001c}taWMO\u001c}7CX\u0012s݇~'};9\u001a\u001a,\u000e\u0005s*~\n\u0019~\u0000\u0015۩\u0001ޔǳtp)\u001d~JT!un\u0018\u000f93d\u00158oD\u001cŗ\"\u001aM\u001dDD^\u0019\u0003[ds,J\u0016\bB\u001c2q(9\u00149u8 \u001cPjh\u001fE^)|\u000eK\u0014:\"Ӽzm\u0004w\u0000]!U\u001c8RSz'\u001bo|ϾK\u000bl`N\u0001-,!/d\u0010}׉\u0001$}t&q\u0018I֯$Wt8񕡨b@%\u0015\u001c\u001c90Z:s57\u000eQa.ak>|q_6\u0012a阊2?%}\u001c\u0013l{qhVS3_\u001a39j\r%q,*i\u0014Ȗm\\V\nՉa6D|oIK]~\u001b&|\u001ebKݷF\u0011'=N\">i*ʁT[\u0017]95tق 1%B,~X\u0007]}F?w%^Ms\u001e<\"3vH\u0012=\u001dg\u0018- [$%R\u000eZ*K$nuw\u0010K90葮P_8*n@b75\u0013s\t:\u0007. \u0007}NөśJ\u00166CRy9~M\u000eiK*\tB|:cA\u0018O:v7\u0015\u0016;N\u001fo\u001b$\\8I\u001f`Q\u000b\t;\u0016D%f]B$\u0002S\u001eS7a'\u0011[(\u001f9yJ\u0012E ͼLl.Ȼ.KZI}\nK:0(Qd\u0010K\u000eb\u000bE9Fp z)Vms\fbRb$K\u001b^1r왐/&\u0013bt\u001eGA\"m\u0011\u0006!g_1|@\u001e \u001f)A_\rUGok\u0002q* t>ފ'\u001d4\u000e\u000bq4X\u0010ilyvď(D&D:f=PtY$%N]}v\u0001@\u0012wVJ܉eaHr9\u001a:,j8T\u0007g\u000e҂\u0010s)0\u0004<r-rP\u0005:<ͮq1\u0004\u001c`1\u001c|r\u0014d\u0015\u0007Gax\u000f\u0013\fO-8J\u0010y\u001e\nk~c~ר>\u001d\"TqwHd\u0010t$\u0012T\u0012\u000f{$\u000egT^\u0015j3\u0015Z9\"\u000bP\u001d/\u0004}ý2QB/\u0019J-\u0012`I1G=y\u001f\u0002T\u0012:\u0015^\u0013xP5a,\u0004\u000e$Ql\n\u001c-\u0001aۜ\u0018cTK}/t\t\nŕs6KO4xC\u0014PBMn\u000e\u0011zs>S@?f\u0007\u0012Ls\t$i\u0012O\u0017!\u000e%\u0013DIrsKtq\u0010!B\u001cˍ9DA\u0013~\u0000&29\u000e@\u00062Iw>ۢDL^U1l9\u0018\u0001*I^vcˁ24{H=ޱͩXac6@\u001b\u0011!B%\u0002r\u00193WX\r\u001cDo!,;j\u001196w\u0013DLC\u0006\u0003Az0Vn\u0012\u001b]5\u0016\u0018\u000e&qHMD-u2}{kxH\u0005r@\u0017D\u0016;\u0012\u0013\b\u001bBA\\+&X{dl3X SwI#r\u0000\"(uI\u0019T\u001cC.n\u0012Q\u001a\u001bj2c\"t\u001e\u0000P1u\u001f\u000eX{\u0014\u0006d\u0015(0B@!F\u0018%\u001c\u0000/:Un2\"A\u0018PM;W\u0017\u0010y\u0019\u001fCjAnXlh̶y9\u0017I.0\u001czA\u0010W<\u000bm9iIsc6\u0017\u0001\u000fGUp{gvĐHIl:@!ǛCA-M\u001co\u0004\u001fjb\u001c2bۢҔA\b8\u001c\u0006\u0018\"^M\b:\u00153\u0002bU9fj\f\u0017'o.+V\u0019=vu?*rm3iy\u0011.|` Ȳms>J\u0013X8XztUb$aУ\u0003\u001bY0c\fsh+DBr\bUmDDdRg\u0012hq(ބ~|l\u0015b+8UYt:\b,U\\B:Y\n\u001c\u0013*YL\b bԑ\b\u0006f64ņ \u0004Z\u00115YB,t\n1ۢe\u001396'a\"[og>Zǃ>\u0011F\u001b֏*n3\u001bVf]M9\u0011\u0006 ┴rg&M\u0018ޑru8X\u001fj~\u0010[J0̔\bЋAܥ\"Ly[hbl\\5G\u0017N*W\u001f;!bޫ\u0005\u0001\u000ea(I\u0005\u0010\u000e{a\"}B̞]3m\u0018Ǭrev\b986CNJ4˒:\u001cI\u0011e\u0007%T17~|/\f\u0012#?:}ao53b]\u0013T,\bz(!S.\u0012*,jjՋPD}5\u000eűN\u001cxz6We2Cr`8:\u0017\u000e<S\u0014M\f_E\u001d&zv`>Վ\u000f֔[aoI2Adrr:ht^\u0014t\u0019[c׊;YP֫\u001dHlqN#:;ĥk\u0015z&Y\u001eDv_>RC\f͛EA\u001f:\u0017Os\u0001W?Onp^/6.*漦-\u0019OJp)wU=Jovz󥎼\u0005\u000116KTe\rqp\\N@>ӂ>Hq\u0010\u0018j\u001a\fj\u000b\r/N~!b`f\u0004ڏ<\u0016ڢcgX8շ^\u000e\u0007\u0003E_\u00109i9\\\bt80A69F:\u001e\u0016V1B/'\u000e\u00067\u0017MQe\u0001E;8\t*dS'i7:\"\u0012I)>q|ܶ\u0019!\u0011G\u0018\u000bGiE\"mJ>Ƚ\u000f嚸}Z\u00016ݹ3.U5\u000eN\u0003](jkC'VBG\u000eqq \u001cn;\u001by~wt>\"\f;\u0012[RI7T.D]崓CT\u001dg\u0002x߸x9R$\u000e0_K!ɸ\u0003U\u0003y;\u0015\u001cT\u0004҂GSkn\u0003qR9I\u0017qU9w^\u001c9\u0016\b\\\u0016@U78xxgnH^[Sѱh\u000bɎZ\u0014~\u000f0璈\u0017ru\u0019\u00031VJq6PFoQ{\u001cZ\u0018\u001bqpW\u0010R>,,(DϣI\u0016Jrh\u001e\u000b$h(\u0006Q\u0019Fo\u0011*'h\u001c\\:O\u001dIiM\u000f+{R9\fXG.AIdCe!D_/C\u0016LQ\u0019*Ĝ\u001aB8\nנY@Ye\u001b΋X\"\"aٔb\u0017\n;\u0006\n4H-!\u0015'# \u0003)l~chh\u0019\u0012Z\u0001(\u000bQt\u001f1^l_T%|8}j\u001d\u0010\r\u0014\u0011\u0013SzrS\u001e1\rWiwq愷19AYBkA\u00023\u0010~x1G\u000b<g;\u0011\nBġ>&~Cu8QO^WT\u001c\u0004З#\f;\u001cD6gX\u001c\u0019@Ȋ<MY\t0ALN<!\u0001W\u0011!56FD27T`\u00122hP\u0014.Cr9h&!kn@re/`\u0017\u0015s\u001el\u00078q\u0014ǩ\u001cE\f7砥 $zK\u00151ɐS\u001e\u000fj#\u0010dg\"6#\u0018d`g\u0012J\u001dQQ_vI%٧\u0018\u0013R{ʃm\u0004ByF\\TyQh#M\u0019!\u0018VMgW7\"Ęc9F\u000f\u0006q7\u0016\u001f\u0011Qw\u0011NUVtvӮ)-98ՙ\u000e.ԥeV[0]\u001e\u001f1Le\u001d\u0010=\"ҾA\u000f1s\u001aꓪN?\u0006\u0006A\u001cl\f(B?\u0016}:Cؠ-v6ɞ\u001eq\u0016me\u001bH\u000ei\n\u0004pƱV8uD\u000f^_fD.:\u000bKߖN,*JZ\u0014\u0005&,\u00008#<\u0003_Ƈ\u0012J.z\u0003\u001a\u0006jMIU\u001af[#EݤC::\u0018\u0000]\u0000\u0013O=l\u001eT\u0015\u001a\u0017s$\u0001Ȇ0DH90D%6WD+|\fJ\u00146G\u001a\u0016\u0012AIICڰv^0n\u0010\u0006\u00172Ct\u0018/)^zDhyX}2*N6Q\u0004up#v\u000bD)kK#\u0006d\u001ceuDC#5 \u001b-v+65﹥[h\u0005&̚$>;\u001e.;prFڷ6\u001a\u0002(\u0013\u0011\u000ed'3Ds\u001f48E&؝\n$\u001cy%E\tlh\bU\t=z\u0016g8HU+8j\u0010`8\rzs5D\u001d\u0004kz\u0016\u000f\u0013m6\u000f\u0016%r6\u0001bE\u0006'$]jEpaWX`1h\u0010Z͹7U<GcI\u0007E\u0007]`1#sq\u001e)cxrstzHL2FyM˙@KR:\u0011ފ\t\u0005Wp8\u0014{\u000bo7\u001bu.S)v\u0004\u0014IRNJ:mZΪ\u001cuh\u000e\u0019T\u0005\b\u0003re}PZ{7p-^\u0019ʂ\rE~{4O\r;#9ԥJuJ*XX\u001c>7Dg\u0016E?NqjSlM;A^g?4\u001bpNde]}}q1(yzx\u0011?\r\u0006$E#\u0004\u001dJ⹡J\u00002wla\u0012Z\u0001\b\u0005Jr\u000b d=B\\T\u0019 t{|дo\\9{\u0005ҝI 4[8#8hcɘ\u0001\u0012q\u00179 U\tJNr\u0006\u0000sCA\u0001Y,,`\u0000\u0001_\u0005\t|qa9=^&\u00022Auw\u0004Gk8tHȰ5bp19F\u0019_\u0007VTS\u0000zU\u0010Zŭ0)?\u0001竸Pq\r\u001d\u001dPp\u001cR^Q\bN\u000619jo%4b\u0011\u0002q~r߰rZ\u001dE\u001eι&!A8]qy\u000e\u0006\u0001\t\u00112^UD\u001eq7\u000eQU\u000e8\u0004\t  \u0007}S#u\"BD\u0011bA69$Dg!\u0002qy\u0012!\"+ơw\u0000$\"K(\"\u0016CgZ\u001dcl\u001cW\u0002;\b^+n;\u001dTEt'E\u001e\u0015mQȅm\u001b`\u00164<\u0015\u0004l۝'RK\u0013dG>(<\u0004\t\u0018QEFI\u0016\u0007և\u001elu\u0016\u0005\u0001ؠ,kVOp\u0007Hi\u0017{7\u0019`MWtM\u000f\u0010Y\u00031x!X\u0000kC)\u0001cN<!I~\u0011\u0002-aWV~ڪr\u000b\u00124\u0000i\u001ec\fzSg΋_)rʪ\rg]SU\u0016Ӂ\u000exVп\u001c|5֏\bO\u0006^R'E햡][M[͈3k(lZ`iX)n*g_\u0017Ҕd\b\u0004\"\u001f M)Γ\u001c\\C`3}X$>\u0004d~iz\u0010\u0003bgd\u0018Fݲ!/p&9L2/4\u001bzJUMZ\u000f/\u0002\u0017vO>C\u0000ww\u000b2PhF:\u0001KT_n3\u0017\u0018g\u001c\u001f&o\u0000r\u0000\u0018\u0016pI\u001b\u0012b'W\u001e1Wt5\u0019#>]/26\n\b\t:\u0014bs[b\u0017X($^L?dv\u0015\u0018G\u0002EPBE/\u0004+;\u0018jdrjBh\u001aH\u001e\u00114s] v\u000f\u0011#g\u0000)B 4SҜ3۴)\u0016T\u0001.Fq\u001cTG&a0\r@o\n>\u001d󢟤)\fHA4\u0013Y|P\u000bCDQObfјU=ƹmRR\rDo\rsLc\fC\u00062g\u0005)Y\b\u001aLr\u001a\u0019'Ǖ\u0019\blZ8:Iu_UQvhqA\u0007D!\u0014'R&vf\\u\u0006R-Lo:'|%z#\u0012\u0016\u001d½&I\u001e6\u000b\u001b\u0017dx$\u001c8ckmo֭_\u0018HgA\tT5C8~tݬzx.f\u00146eP\f[@Bj\u0018\u0015EH@\u0004+ډ]Mvxr{|eƠȤ\u0011b{К<bj\u0011!>m\u0006\u00171\u0015rK\u0002\u0010ITO\u0004\u0017<f\u0002׃\"\u001dU,\u001f\u0006\u0007\u00134DPBe\u0016T/C\tgo{ D%ZJA\u000fA4 \"\u0017A\u0011%/T\u0018<6\u001e\u001ec.\u0013Kͫ\u0002w\u0014\u0010\u0005&N\n\u001b\u0007\u0013r\r8\u0004<9$vtqe\u000b=\u0018\u001dI0\u000e\u0013{?-t\u0019\u0011Y!S\u0002P1\u0003B^Ht$J[DϽWzbs[$@\u001cB\u001a6\u0002*y\u0001ͳ_Ma\u0005ޞ*\\{\u000bhfE{*\u0011\u0019R\u0014C`٭ꭸ\u001e<<b\\x\u0015YZMzVm4&\u0011%%fe4W\r\"\ffoŽva\u000fj/E@X՜4\u0001\u0006\u0006\u0001@#Fn]\u0015~]OT<bn81\u0007\u0013l\u0016\u001bd\u0006ᣤ\n\u0011\u0013>{q\u0018cz\u001a\u0011gI;:G\u000e׷d\u0001\u000b \u001bҖRm\u000b,-\tQ-/-O%C\u0006\u0012%$\"e\u0016(\u0019\u001d\rʁ]O@\u000b^OR+'\u0011)s^^\u001c΍\u001cɇ]O~L\u0007փ_H`\u0003\u0017mg\r7ڏw=I\u0002aogS\u001aɔu\u0002te\u0016;Nf٬`Ȳ*t\"\u001a=WI9G\fI\u0000\u0002\u001dI'wM\"\u0014JAII0\u000ev(4D\u0012&z(`96[*{Cp:1g*mV#\u0007\u001fNa,Xu߭\u0013w\u00044U6-!Z\u0015RP\"\u0010`\u0000?W\u00141I'FhdV3#&\u001f\u0015\u0015\u001b \u001c\nft+qF|ʞ\"QE\u001d\u0003\u0004\u00058CM/AQj\nU\u001e2\nQ\f>N̙)J\u000b\u000bjdT8\\ɡp=|J)\u0012ډg+ǿ(J\u0013?R05%<#\rV9A<FO\u00176U$Yrl6d=pԑ%\u0018X-7;|=sG)\bn?G'<`\u000b=gF<\u0010$X&\u0014TѦ@Q\u0013/\u0007\u00169;!>E'>3\u001fֽg\u00165\u0011\u0017Jgh2*~\u000bK˧+G%85#\n\u0002> K(\"\u0000gZG\u0010\u000b8W~\u0019\u0010\u001fN\u0012)i\u001d`q(=A,CWYDG| \u0013D\u0007\u001e\u001b=\b\u0002\u0014\u0000\u0014e\u0012#ICX\u0002f\u0006ya/Q<\bn݉\u000bbJd.$\u0006P\u0012$RFHҦwy\u0004&`!\u0019ۯK%\r\t}Ld9PrJ]1x*pA9+~@\u001eE\u0017^\u0000Q2゘kv(\u0010@\u0011\u0016\b[gi>r\"\u0001O7\u0016\u001ep$3jtB\"\\-@@ȑ rHE)'ѻR -zDCC\")VY3Fr\"ڣ\u001a\u0011DOr(%&id89î`h6e\u0013\u001f\u001c,_:|!r\f\u000fN:A~Z*\u0010<Ją\u001d&jP2:\u001b\"|M)ֺ\u0016ΐ\u001aT\fn6ha\u0000\u0018@וȑ\u0011$\u0011$\\\u0004o\"6c\\\f\beҩBwh,]\f1'\u0017\u0013\u0013XDe]<E>g\u001de,?ᴦkLkSrE\u0018A&,ôZ\u0017\f3.L`q, ڄ\u000eAfib?T. G/\u0011J`\u0013\u000erVd;x$Y:A\"Is\u001eC4hXBP<}j1WY2<^5N)%FR\u0003#Q\r\u000b:Ef\u001d۾i\u0014E4(TAo!\u0007cxnH1\u0013g\u0019״\u0004\\Aq$&-\u001b'^I]\r\u0005\u0001e8Fhۈ<1\u0017\u0012%\u0002@.ާ\tMb\u001b\u0017\u0010UkY6LU$,\u0003P\u0005=f\u0001\u000bWQF$&%i*\u000b\u0015.EKbzf|R(E\u0000ñJf}\u0002]\u0014!\u0019 \u0019HE#\u0002\u0005X)ȖJO5ָ\u0000h7*jjRWş(͎}Ƭ8\u0006!Ń1Khq\u001d\u0014ަ\u0014ǟ\u00059\u0005\u0019g)\u001cj\u0010DB0,҅\f'jDOb)\u001c\u0000U`\u0004\u0007y\u0018.qtR\u001c\nf#WEL8xDבgQ/I(T\u0006\rmch\u000bSk6N\"7\"kAӖM#O$թ`u\u0000hE7쪸\\һeqnfn5#L֔<l00eY}$)\u0017O5>1U$\u0012v$\u0005-L\u001dhZ\u00055@\u0001_NXlȘ;+\u0011_\u0012vT>\t\\jG@)!\n .=\u0013Խ\brTd[UܙTEJl,\u0006KRQ\\\u0016\u0001Rn.0/)-0\u001d\u0014L,Y\u000f\u0010Q$1Jj36)Z\u0006%s>7ȋ1+z0\n\u0016;W+R\u0012J\u001e%E7\u0012\u0005n)Y\u001c>kig)j\u0015\u0016\u00038~R\u001d\u0005\u001d^f\u0012\u001b=\u001b\u0001+j1\u0002;Q\fR񨨌ED\u0005#\u000ed`g]S\u0018Bв\u001aX\u001dC7@-\u0019%&\u0003){ E2U_\u00149$EK\u0014#\u0000B^N=hJW|]\u0013|FB\fXЂ6)\tz]NJ\u0001\t^G\"Y*\u0015Z\u0019APiHD\u0005\\!wе ڐ\u001f\f)K(@\bprnwlН\u0015[\u001c2p$\u0000\u001c\u0012 HPQt\u000454Q^rL\u001cYW/GAE{ߗO]\u0005C\u0001g\t䳆\u0014z$IZKbo*\u0013\u0002` \u0005*\u0018P-b1\fD\u000fWM\u001c3o\"ˉ8\u0014p(B3#M=DH;w\u0006CN6\u0004\n\u0002i9E\u0019ϨY\u000fdTWpIXY'\u000bQ,S\u000e\n\u0004\u0002\u0004REaAk\u0016(\u001bcx\u00047eT)\u001a\u001bR2=-b#鎼C,%-EWz\u001b(!Ґ@\u0004R\u0001psg\u0007Iaժj\u000fn}=\"dD7{}U\u0016k y.P߆hæg$3(6-XP\u0015ƩC\u0012\u0004UH\t-\u0004\u0005ChZ1KJ[D:\u0000R,E\u0014)*֬\u001eGB\u0012IT=IXV\u001b6\u001bR\u001dRC]ߖ\bo{H~WG\u0001QVh4_R.j2R]Vo8kZ\u000fKv.\u000fڢT4Y$'{\u0003\b}\u000fV>kUY:A\u0005\f2J\u001evDP\u0004+H۴y\u0014H:=\u001c\u0002+\u0004F3\u001a&[t\fO>\nӎHvh,}C\\\u0018ưo&R\u0011-}\nf\u0013E%:JPIUT\u0001Uc,.hnRllX\\\u001a{\u001cI\u0001͔~]\nP\u0012|sލR4}U\u000b>!Y\u001006\u0005l+ZMv\f\u001c,B0>ip%Z\u001e/#IT\u0010Λ֎*Q/)/ygD3=LY\u000eX4\u0017\u0013Y\u001dٴ\u0002鎛m\u0013j\u0016oM[!'}DC-m;KN\fB6aއM{i\u001eգ'}\u0004I֞oM\rX%q\u001cfS\u001cT,f-0R\n\u001c!O:)n%P]=F\tLD\u001c(\b\u0004B'\u001f5\u0006\u00138\u0015\u0011Mb\u00171TİתZ\u0019fVqٓh'scVY\n2z<:黦Љ]ȷУe&gF]A5q\u000e>'}״D]^DwM3]ӓkډ\u0019r4Y|6q|vMOqӮ-9\u001brv{\u000bHEU$\u0002JHYL\u0019\u0012͎Pt6.)\u0019\u0015n\u0015n9䃦7$]ӓ^$89>Tb$\u001c*:Nh\"g\u00020zݏGt\f\"h\u001e!R\n(\u0004\t\n\u0011\u0011a\u0015TPtR\u0001abIT\u0000VǄZ\u0013\u0006[E\u0001&G]>,%PK1k\u0011W+!J\u001bۚ\u001fPYRS^̵G\u0011/-ӝ&|/Kˇ^KzG\u0012 ,\u001foG\u0013tkRl9^&\u001aN\u0002$rԸkX*`\u001dNv\u0005~[Gv=/\u001ed]W,\u0015ƩW@\u0012c\u001f@\"\u0003Ibp\u0004RX(}⮓Ymϙ5\b\fWe\u0016Gqr2\\]@T-e/\blq(\u0017,\u0006\u0002\\Ѩ<C,;,r/tN\u001b\u0018˾ŵ3c覜׬R\u0013\u0012ˠ`C[\rM\u000fU\n\u0010\u001c:s+\\\f\u0007J~W\"J{Oc\u001c\u0000\u0012WFJUE\u0015(PBNrrE39!Q/ش<O\u0014_ɒF3IR\u0001P2ZZ\nN\u0000!,(^1^S-[aKm&\u0017ED۷i\b\u001f:hL曱UdG]\u0013-xZP\u001a\\\u0014\u001b(\u0014Tl%l'(!0\f%f!8q|&\u0012،S吢`\\*>{\u0014^B\u0014#耛r'\u0003\u000b0ΰlK-Y\bZ|b\u0018l\u0002Kk\u0001lW3قKFjQX\u0011 i&n\u0011\u000f_Ӝ\nR\nU+l28\u000bmRH>\u0004K^VJIcPv*6X\\oZCtHsZ\u001a\u001e\t{JuwI<\u0018%D3\u0000D\u0014;Ѧ\u001d\u000b+\u001bV1z\u000eirQц\u00140\u0016C\u0015QVե@\"\u001a^M{ыiW\u0004yLb\u0018k!^\u0001j\"\u00115\u0003d6V-bT\u0004\u0019*Gsb\u000f/G=NZ\u0016׹őA\u0019nc%@`h\u0007Ft.DDyun\flnxw\u001d+ՈM\u001e>\u0010\u0016uc\u000bݯPHV@\u001dqSE&=\u0019\u000bU\u0005~GHޱgW+8;c\t\u0003`>9\"?t\t&=5}Qr\r\u0003#*ē\u0015~z7!k˒ðIyYtit5d!F&ZP-\r(cI9\u0013{TX^#ɳzQ7\u00049;/\u000e`JB9W&iߓ;i\u0001ho\u0013\u0018\u0018\u0011R(.e3\"B%%\u000f̒cj#\u000bNtd\u00152W\u0017+&yq\u001c\u0004\tSKUojUo\u0012cS\u0003sjM:'GNZQĖ\u000bq$޵\u001a\f\n\u000be\\B\b1\r\u0007吁\u0011ˊ߾%HĢq%n߷m-ut#*\u001eƮ8!9kz\u0001A$\u000ea1ܵh`.H+1;*\u0013\u0004k&!Lzlay\u000eܵv&\"$\u0019Ŧ%53\u0017DqpC<ـ\u0011r\u0019\u0012\u0007\u0004\r<)jZ+\u0016qXH[*DdY\u0014׌Ia'HM@%9SVWTUׂU$D3Zd[\u000fs\u001b/z[XvED\u001ed\t\u0013d\u0002JLsI`\u001e\u0010*S\rHA\r?:\u001d\u0017sU\u0002\bJ4Zi<Bبia..\\u#\u000bH\u00005꬙=1lƦWqinB؜<\u0019P5,Qos{\u0011Gm+j&h:dP\u0002S|(\u0013j\b3\u0006'@Z.\u0000*\u0006\u00012\u0006rR cp\u001d\\\u0001\u001e\u001a\u0014LL\nO]0FZg\u0015G=2o?C\u0005\tΥ\f\u00063\r[թh\r瘗:|JHH%AM%jF}B\u0005\u0003f\u0001\u001c\u0018!YlWHh.\u00044lXyi.M\u0006<*\u001dpZ)(s$ ќƬ\u0011\t1|\u0003S\u0010*}+\bg\u0014\u0019\u0000Jp\u001a\f\u0005e\"b.ReNu2YdC_;x=R\u0010|k\u0011\u0005!YM6|9Gߝf\u001a>ߣ'}|y\u001f1fz׮VFb\\I`Z;RdG\u001ftPO*@?E͗Ozû7^?|͖߽yˋg@P\u0015.\u000f\u0018^/ŗѭ4\u000e|C7]ј^(|,C#\u001f\nQ+/??3JHa2\f&U\u0017ґ8>\u0019-Dv=2\u00152sX8\u0000x\u000f!P1,LWHB^^Y\u000e1\f\b9N2S\u0006jA4iB\u0001/'R&YL+\u0018\u0003\u0007GGpXСIb[,]L%fF8\u001eg\tVDk7\u001c\u0015\u0011\u001ae:~\u0018\u000f7nAZ 0ٓ\\\u000f\fD@L;o6x*A8\"\f\u0019'\u001f\tRf;,\n@C-\u0018fv]\n\f\u001f/N6\u001bGN\u000b\u000fb#ϻNq\u0014\u0017r!!k&{Y`:\u0005\u001dTڳ\r\u0007?fq\b\u0013\u00039R\u0003[\u001d\u001e\u000f\u00146\u0001UWuND;\u0006kXa-EXPpm\u0015/\u0013>KY\u0017<!dC\u0004 `Jלd\ttez/t~>,{n\b&*pл\u000e$\u0003.\n!2>N\u0010!D\u000b\u0007\u0006\bEae4>V(L,UwXk/\u0010bl}rvMV'ea89r{N\b*T\u0010cxKȃ)׈\u0019*\u000eq}S}\u0006Ghd'\u001b@Xb\u0010K&=v\u0012w\u0013\u0015-*.A\u0000\u001ed4_N׆0A DsG\r:r\u0011@\u0011YBo\u0005L\n3 \r\bH\u000f&Z\u0013gϢxe\ba2]g/}s9+RF\\ytdy#ߏ\u00140fe0n+\nM9\nA},&_(pF\u001cݿɍ̀Q&\u0007\u0012B\fbD\u0019B}rl\u000e\u000b`),tzBΜ#]VbA/KyP\u000e\f\u0010:խ\u0000ɗx,\u0013]\u000bk\u000eV1\u001ek\u0012e-%\u0000wtG\u000e\u001a~JY'9FIoMh\u0002N\u001emQ F\u0015|O_\u000bCLD.{\u0014t%~Wrdc\u0007ȡ4S\u001fgMudD!(g\u0013\u0013\"\u0016B\u0013P\u0010cU/fi)̇\u001ds \u00039\u001dd1aRd2/ɻW\u0016\u0010\u0001\"\u000b\u0015!S\u0006\u000b\u0015z\u0013U,\tʹR5\u0013\u0004/\u000e:N\u0006)FWK2zl}Lj\u0015Ⰺ$g\u0010xPDE#5ף?hS\u0012'Mm\\>Xv?PU\u0001(jb۵\u000f:!\\O\u0006>t[˻9̸kKԅ\u001eu\u000e.rX1zeWʆs>G\f\u0004?f b/3;tѕe\n\u001c5x4z*Ź1\u0013(/%B<#<\u0007耇52z\u0017~kk]\u0010|fY~L݋p\u0014b؛ΟC7=<jqʢ\"EY\u0010Ԅ\u001ep˘K=\b+\u001c8 .Ge\tL\u0002|N\u0018kU/\u001ak)Յ)R3'\u0003TVJ!6h+zu;1rR=\u001aKz}ХH\u001a><2/\u001c`\u0017J\fSz$9% \u001c\u0006\u0019\u001c\u0000\u0013\u000f\u0013n\u000e\u0014x\u001e\u0012b\"FabG\u0019d\u000fA\n\f&vh|R\u0002\u0003/\u0015yسD\f$˫RꈉUqX\u0007\\M\u0019\\{&z\u0011.I&)b\u0004ȷ:GBc9VAe\fr\u0010ޗY]p<\u0011<WSqX(\\qZC\u00178EXCpv]dN\u001bex֍\u000eO\u0015p%l:~ӓ.\u000f0}Es֗\u0019DUROZ*gDbj&RɌB\u001f\t8)BM|\u0012D&sKѩK1Ȼ^Z#3A!\u0001cQm4v\u0011%\u000e!Cׇ\u0003K(X,$4B\u0012\u000f\n\u0011S\\83O\f-\u0012(+\u001cBˁc\u001cF!\u0016,kP\u0001\u0002\u0005rS5m?'ō`H`߄\u0017LF*\r\u000e|W$<۩.φh\u0014\u000f\u0003Q&\u000b`)s}\u0014\u000f\u0005V}yђ\u001cg\u000e\tt&oi29D7\u001c\u0004+Aa*\u0014hIʢ\u0015\u000f\u0012M\n\u0019F!tQ\u000e)BS)D9\u001e\u0011p&,,\u0002T6\u001c\u000bƌy@\u0013^\u0007P%\u0005AA\u0017\u0019]\u000f\u001aFH\n?\u001a\u001dG\u0002\rĊ=7)`w]\u0004G^9@\u0012\u0004[/\u001f\u0012\u00165\u0011\u0012\u0014Xrׁ-ꬩ-&9n:e\\L\u0005mae{7Cߠx\nHWK\u0015Ǔ_j\u000f\u0015&N͑*̇;ؓD:\u001a{5\u0016tF\nW\u0015S=fNAwv[Tu2\u000f(i=MPRK\u0016hޓ\u0014.N2^MoIQQ^\u0016;f;-gvF2UqzD,a9qKæky\u0017HI:^zZ\u0006CӬ!\u001b^IT9}`\u000fNq颧:\u0012ВS\u0013>$Gi~]ǖ\u001a\u0013]ϑꮘHsT&bL\f\u0004J\u0006ۮ\u0014ϳa\u0018\u0004b>ODG\u0019\b\u0018\u0007\"*5'{FN#cPb,\u0012#\u0019'\u0004\rZD\u001fHb3Kg=h\u0005\u0005Ծ\u0007\u001crCLݎ\u001e{V\u001b\b\u001aL\u0014\u0010\u0003\u00191*\u001dgkxwjT$8j2KUƬ\u0010U\u0019e\u001c.*N_uÞ\u000e\u0019\u0017Ʌ]\u001eLVv7_vQAD\u0005EChpg\u000f\"C55*U-.GnGZa\u0004A[\u001d:-O\u0010\u0013XR\u0005P\u0011|%F^\u0016\u0017Y\u0011[Z's{;/\n*s;\u0005U\u0002H\u0013O6B!YhU(\u001dmٵP;6\u0010ħ\u000fAH^)L\u0006\u0019\"׸\tW(\u000fHR膘\u0016EpB'\u001c\u0015\u0012$T\r4g\u0012oJG͸+P:2\u0013\u0007sCHf) 4=L-Bj8ۃT\u0006\u001f`y\t\u00146\\ }B=\u0011R\u000eJ.ʛ8l\u0003^\u00183\n\u0014G-S},e1\u0005$\bڽ,=$\\Y5#10Z\fVQUN\u001d\u0004\r8\u0007\u001a \u000e6\u0017yU\bq\u0019\u000eŒ:r\u0012٪p\u000bmf~%KZåU\f\u0018 \u001f\u0018*\u0007\\-hVMQ{[5M]G!\u001cu\u0001[éC2_\u0012UӠbWyc0Jf̶8j|\u001b3҅uU'\u001f\u0007u8NaR\u001f!\u001f \u0012PR\u0006\u0017\u0010u\u0007,j9y\tV/Z!Kdd+F܈RaI\b\u000b$ţ1/HW:^7BJL[\u0007\u0003GQ,\u0017A!\u0011`;\r\u000f v\nh\\>4gDF\r\"\u0011b\u000fX]\u001fL^#My6b\u0003<oaz\u0017N\u001e.\u0012E9[艒$\u0013J\b\u000f\"08r\"r\u001d03\u00117͜lԡhtL\u0012hDo2Dp\u0002\u0013 \f\u0011\u0011)ɩ\u00163\u0018hy\u0006\u0016:0\u0006p3-5\u001d\u0010dK^'\u0007\u0014\u0014+{JĘxԁuv\u0014a\u0012\u0005^ht٤D6\u000bkh] \"lЃͻ\b\b(&9\u0011CgdL٤9)HH+*A@R,\bkEd?8X5U.6WE07Z\u000e\u0000f:f.)ѡ1Q/\nYc\u000b\u000eg8ۘ%\"g\u0005`0jLa\n1?\"к|X&zc+&\u0002~ќ\u0004\u0003\u0011P\t\t,0l\u001aJW:N{\u001f\r;yԁ\u000e*\u0016mre\u0015\u0000:X$D%b\u000e\u000b`\u001c,&3-\u0010\rѽS\u0003Ξ(.L+m\u0002 d@PЬDN_<\u0003\u001b)Nt`Ef\u001d(=\u0001\u0003H3!N\u0000$̄\b˒c@T\u0001QNV\u0005\u001e\b\u0018|9v]\u0014A}T:F\u0004/\u00064Y``\u001c\u00164\n\\4\u000fk[Լ\"۾jO^rT\"{:)}v!32)J\\\u0006N\u0007bj\u00069O)=\n摈\u0018\u0011AH \"\u0015<(HUp( fQ\u001f\u000e˶L\u000e$\u0016<:OU;\"\u001a\"F\u0000^M\u0004\u0006&\rsO\u000e\n+VpŅA\f\u0010V'YY_\u00197.\u000bN8.\u0004\nY%n\u001c\u0014oqu\u001c\u0018\u000e!)p!*ͥDn\u0016IR\u0001\u000e&ӼQ\u0006;|1f2?%($4Pʀ⧌IZ0֬\u0000>Nf\u0005l\u0003Ly܂woOBĬ\u0015[/ f]&BdW|s\u0013iΗ\u0001is4T\u001d{R.\u0007(\u000b,\nX\u000fE-\u001c<\\'vGy\u001d\u0011tAQ`~kJU\rAвtō~!\u0001\u0007p\n\\S>\u0002i>xy=\u0013L.㤳\u001f\\v\u0002+\u0002 \u00071=qy*5\fPq\u0007\u0011\u0000zc|M&U\u001b3\u0010e}w\u0012W.q-Lv7SsņgbW4*ĬT\u0000)T\u0014n\r\u0005M\u001b\u0011\nS}\u000e#\u00165tC\u0017_9_^6d\u0010ݾ\u0003ABC\u0012YQ\u001f5ѻ\u001eꔣ\u0004I\u0004h\u0004~/3@k6`\fZ\u001dz\u000e\u0015\u001f\u000eX@^!N?\u0010\u0011N0=ٴ?8;\u0019\u0005i2dwzzg\tFW,\f\u0001OwC1xYMDGVK\u000fv㚓]جVI\u0010$]\u0018\u000fA\"\"\u0010%K\u0000E\u0014Q܍i\u0012w31IQ\f\u0006\u0015z\u0011ω\u0014\"b\u0012Q1\u0010=VpV\b1s\u0015p\u0010Wb4go&\u0012kĵLJoBkH\r\u0011ar\u0016v\u00072\b\u0015v[LD`\u001b5BTw\u0016pf`\u0011]7=\tڐ7GG\u000f:d(ݢ\u0017#|YEu\r\u0019\u001cob\u0001&\u001ca׉7J\u0003FOꀠ\f*.\fN|l\u001bn4\u000eȣ$,\"z:E+%\fL+Iz\u0001,\u0014/òΎ\u0016\\g\u0006pŦYHT^\"ŎaJ\b\u0006\u0002\b<.\u0018˽*\u001e\u0006隞\u0005\rל\u0014\u0001\u00141Qc\u0005\\LR΅.sHt$A\u0005) \n\u000f\u0013\u001f¨4?,\u0000&p!BJ\u0011i\u001a\u001dBOsܒgqDK\u0010t3\u0002T\rgO]\u0012]\u0016îvƴfyV]\u000fFﺍ\u0005)D@2QݝtQS\u0017\u0003c~\u0011E0ݺ f%2qr\u001d[^\u001c_f\u0015RW\u0003Zs\u00072\u000bq$k\u0002i\u0006\"\\J?t8\u0017Ntᰌ7NA6\u001aqH\u0017cCΖ\u0002,\u00030/7T\u001c`^LToE]LTp>.2\u000e\n\u0001s\"\u001c\\\u001f\u000eW\u000fk\" a%I=It\u0004\n\\FkIi\u0003\u0016\f\u0002 gi\u0005\u0013# a\t\\h̬E譓BĖ!T\u001c.YAD᥷\n%M\bTߛ\u0013q͵\u001ass\u001dl;VYei\u0007\u0016킢o\u001ce[\u0017rR\n8\u0007\u0018\u0005EդLY_ϟB\u001e\u000e8\r|s\n*\u001d.*S?\u0004z\u0015rĻ\u0006bf8\u0003Ѫ\u0011\t\u001e1Í'G:ݖd\b\u000br<Xtb\n\u0018\u0010\"zjq2`}^ALʷ;V\u0015:_\u0015@\u0001\u0011:]#=$倪\u0006A\tY`fNN1RM%&CQ\\&\u0006o\u000f_2u\f^b\b8=˗XFLJ'43HC+\n-E($hTL\u001d$OĚ\n\u0011麂uG;Έ3ms`\u0012i\u0017\r \u0018<N\u0018L\u0011~\u0001;K.V\u0014[r3F4ag8dA(n/hڴ~D\rq]?[*sA?\"7s[pm\bw{\u0018R{5X\u001e-Ek\u001a#z\u0004V<M~:b\rX\u001bz\u0006(R\n\u001a-^d:S0Ђ\u001e\u001c\rp-֗(Iሄd\u0013o\u001eA\\BL\u001cFD*!;-}rGY\u0015TV\u0004-mr\u0012,)<evI1\u0014&\u0016+'dV%fYz\u001da9#S\u001f\u001dUN0f&b\u0001*<|q\u0015\u001a\u001d\u0000P\u001faܚg(\u0013G]BkT>@mÀc\"\t\"p\u001c'!&t8tSa-q/_ifP9A0'{\u0003p\u0007 vKqRR\u001as3@;#|\u0010I\u0007%'\u0010\u0006[B=\u0012T\\ԣz\f\u000f%ګƘe0ָ7\u0000!-f\u0013(8^\u0000LćBE$x.b%6,+5\u000bYxb@'\tm@\r\u0019\u0018\u0012\f\fIղw4ÄU\u0005\"xZ\u001d\u0013\"LPIr\b1'UJuIWTDM\u0007V^'!\u00105[T\b\u001c\u0002xW\u000b\u0014k@|&ik9˪^i\u0004(tzqhN\u000fi,yP#BU$O+\nB.3\u0000Hu\u0006TJF.xv\u0019\u0006 {kr0fy\u000b\\ՌQ\nA\u0003e\u000f#\\\u000b\t\\\u000b\u000e8=\"\u000b\u000b,g:\u001c\u001fZ\u0018\u000bP~Y\n'5#aUD+sS\u001c7<\u000eV~TMݼŰ\u0001*=Al*RQ&8hB<WҫR|W\"oLU-\u0017N(\u0007$\u0014ەJ-q\u0005\u001c\u0012`<\t x\feDP)ZڲH\u0000/\u001f+\u0004\u0002gk\u0019%ݟ P,\n*zͤ?6TMnlF:(\u0001\tZSdO\u001bE+b59[\u0003\u0013I%\u00196\u001a~:5\u0014C!tD)\b\u0015\u000e%j0MؒK\n \u0004Mw\"\u0001%,afe\u0000\u0017xU\u0012jX(\u000b-\u0018C\u0017\\UK=\u00142\u0010\u0019{{cR\nY8ږ0\u0006®\n>\u0004}Df|T䄢JZ\bx\u000e;\u001d\f\u0018\u0007\fP(\u0019=\u001a)\"V.u5Y\u0005վK\u0002u:2n\u0000[\u0001r.ߗ\u0016!2f_#\u0010VRg8n\u001dHuj.tV*\u0018i(+\u0003\u0001\u0014\bvn$\u0015\u001cYJd]S@gS34M!fr9e>\bD.gb\t_\u0014ӻ\bvޢT̬P\bd;\u001d\u001ae\u0013u@d\u00109IG+e\"fy\\%\u0011\u000b0Z\u00000xVi\u0018Q\rm~\t;N9\u0018b\u0003Sd\u0006Ζ\u0014߃Afz\u000eJTriD|N\u0014Bh\u001dSpwΖ+,t\u0005sM\u00025f&HdR8u)\u0002\u0007\u0001]sR1W\fBl/FuU\u0010\u0012sIQa%\u0016`\u001cR\\\u0018 5q\"RV\u0007k\u0017Bj3U^\u0016_m\u0014i\u001d\u001f)e,?8 \rfvk-l)/u8\u0006\u001ae,\t%\u0019D5\u0001Ug\u0017ѣ:h5+\u00129\f\u0018f\u001eJZ-#a%+NXbC.d0\u0015\u0003u˯k\u0005lL/?G\u0015-\u000149Ma\u0010\\x\u0019q\u000e\"M\n삗eJN\u0018eE\u0005?Lv8\u001fbEKU\u0012SW2CLp%\u0004ǎ//Y\u0017b:-2VI*\u001d\u0006'|8ͳ\u000eMܧ2DP{,Npu\u0006yXmx97\u0015\\9\u0015ZP\u001eJ(&td\u0019݈ŲÝE!?qUE+v\u0016X$\u000f\u0014\u000fFײPq2wL%\u0005R\\\u0016L6)\u001f]\u001425\u000e.(VӻZ\u0017*DuB,\u0005`$,Nђ/MBT)[2b\f,k$\f\\MqӁ.g:_\n\u0013\u001atf\u001e5Ą+\u000f)~Ā)'>8Jh\u0016D\u0012^\u001c\\\u000e\bnJ\u001f\u0005\u0010QE7[ \u0006v\u0014\u0013e\u001a-PFa Ɔ\t'7ƪv\u0014jAt7lT\u0002Ч\t'rb\u0002wL.vV%[ \u00146dߠ.jDlhUkdN+\n\u001eK(㰔[E~yV\u0006nQ\u001e|.Z$\u0014%nEe\u001b\u000fUIy\u0010BX83-ׁsڂ(aM,>c\"cG\\\u000b}_sج\u0000ֲ\u0006b:^Ul,A<\u0005I3\u0017\u0012FG*$l*C&ɝfTL^a̟LEΦ4:\tE\u0011f?S+\u001d\u0016)jbWa:s\u0002񶅒xL9LOJWğMs\fBH3G^炏֨\n\t`C\u00183D{\u0003g^XFrH$R\u000fCT,lʡ\"!@Z#L+1tMqQ=R@\u0010P:[y.\b\u0014\u001cLifk*S\u001cj\u0010'p3ض(K/oV,KoB+lqz9*6\\Ѳ4CNS ci)5\fV ,S'2`\u0001#C\\\u0016g \u001c/\u000bSzu\u0004\u0001XT`2A \u0003\u0018um{齹\u0005kY\" $\u001a@v56R,+\u001b:~WF F\n\u000eը-0P$m\u0015jj\n\u0005-~?/3\u0001\u001f\"\u0002\u001f,L\u0019ۂ\u0001b\u001aJo\u000f=$\bBQZk> }WzBvGR0$6\u0010a^0\u0003]$R_\u000eV7\u0010G\t\u000e1G$`_bd!~\u0007\u0006L*r\u0016-=\u001fMV>X\u001dmau\u000e\u0012$F4j\u0012XAW<\b[\u001f\u0010C^\r\u0015鋢2\u0001r[\u0005:,I27Z\u001cYEWHZ\u0002*,\"6擹҃5hpV\u0001}r\u001eTJt\u0000\u0015SE\u0019h3^v@UOPmUK3\u0000\u000bC:<aո6E\t<%.,VYqn`\u0001E\t!\u0018X\u001c'on\u0015χT;r\nda\u0006\r\u001e=71tܣd7!Z\u0019\u0004ÁJ$)XNE(c8Do\t\u0007\\mN-C\u0012bה\u0005\u0010f4K;OوY\u0015\u00028\u0000,\u0014رx\u0015jUZ\u0007ЬE?i5\u000f>,8C\r8^f\u0003O\t\t`̐BtW]\u0003\u0015B6_6-8ATkq[w-;[\u0014\u001c|\r׾UF$CBҥN@d\u001e\u0000Y+{pϤ\u000eGmԺ)Sg'bpypS+,J\u001d@|D7\u0007p#dB@ȧ6\n;Œ!\u001e\f\u0015DiR~hl\u0018(vR\u001b-YТ))|n*9 5٢e\u0005\u001f\u0015z{HL^\u0011\u000fQ\u0001羘Wbk\t@K-\u0004\u0003D$L,\u001c4\u0014|ΖoUm@5\u001aKݧYct5x\td˅7<J7/\u0015\u0016)F=\u0010l:)ݺ%\u0006dI\u0002\u0014\u0006\u0018p\u001eq\u0006e\u000e,\u0017٫*j8] ]Tٖ&\u0005\u0013z\u0018>\u001f\u0006(h\u0019d\u0018T\u000el*Ũ7T-9Xd\u0003\u0011\u0017\u0001\u00138Qe\u0014ZɍM$_55ǥ\u001b\u0002d\u001dE說&P\u000bZ\u0018`X]T\u0013& \u0002X\u0001-lk-л\u0014{C-J,KM\u001b&kM5Lcm\u0011~L\u0010+\u0001\u0005ܖ\u001e%`\\([[$4@'9-Q%*uS(2us\u00012ut$\nAr}kۻn\f3-CŪj.\u001c!\u0010DH3FCΙλ-wTsR\u0010O͌)_Yb}n\bc!*\u0013w\u0016puj^PG-\u0003&i(&\u0015I;\u001d\rzJ\"y.TMl\u001f#!\u001bf99\u000b6\nk5\u000fź\u0015\\{i\u0001\u00158QQ40h\u0002\t\u0006b\b1F{lqp~\u0000Z,\u001a^fXK \"\u0003U=\u001e,k\n>.A7~z\u001d\u000bQ\u001et\u0002S\u0014f`P]#\u0003iIΣ\t\r6\b\t\u001b]@|7'\u001bL7\n49o)\u000b[\u0016%\u0018P8izЍ+\u00160&ܪ0\u0011<QhL3)`Ϸ6\tR)*VnYV\u001a>5:\u0010޸\u001dhԒ\t~*,e\u001cLduĖt\u0013C3Ρ\u0011b\u001dY30]7\u001bY\u0000\u0007/L%ד0&ȼ\"π\u00014Yt.uZ\u000fkVq\u00125\u0001pVaQ%bsX*\u0016[5#TV)ʫ[5N\u0002Ǔ\u000e_ʜ\u000e#'OVé \u0006\u0004\u0013\n][M<\u0018\u0004LkL̫-wy\u0001@^\u000erCU\u001b]C\t*\u001a<1`@\u0010fN/jP5y04M`\f\u0014\u0017{z|\u0017\u001aMp\u000bv4V\u0000.\u0018]\u001d\u0012JYXm]2V5\u0015`;bi\u001a\rV8)C\u0016=FR(#0×Vq\"H\u0012\u0005\u0018\u0004\tpL\tF\n\u000b\n\u0000bPL\u0006n<B\u0001j\u00171aPwG#-Qi\u0007A^ \u0003\u000b/C0D7^MT`2\r;)L}OMIHB1eb2knF9ȖBaꒅ}-=謴G+#-$\u0007\u0016&Z}\u00189gJ[(AAZ\\\u0019btQ-G\u0004Nb}AL--v,f`ܢA\"\u0014\u001bY&%jvhHK⚻|\u0013N,R8f\u001fүw]\u001est4R!Z^)dP\u0014mǘ:ě,bt&\"p\u0013\u0019`\u0016]MP\u00020'$j\"<ξ(?D\u001dN=*ݙV Kͽ\u001dٰv, \u0002\\dD8yMk\u000b\u0006*2kp\u0002b\u0019b#SL\u000f\u0019+CD\"\u0005Ʀ=k\u0001~`Y\u0004cyL`VH,FS\u000e\fYS\u0016\u000bpT_`ӢbBx`8'\u0011v\n\r\u0007BF*E[\u001d\u001a11<?3\u0000R+H\u0015\u001b\u001fy=A\u001dq7aJR\b\u0000\u000fu\\j%+'Ů.\u001f\u0018V8\u001c&1\u0011\u0012dQJsdh\u0019wMX'k\u0017`!\u0017\nF`\u0016~\u0019S\u0010\ryS!2\u000f\u0005w\u0019ț ;Op-.-ڝ3JgAb\",'Й;3aRX\u000f\u0013,iѳ{]KvHH+E\u0018cW\u0007%L0Q\u0007|~\u0019p29f\u0015×\ru}0)8HmO\u0011\u0004\u0006\u000eLO\u00129M-hR*\"\u0014;*=7A\u0006R\u0012ŉ\u0010URLt\u0004\".\u0002/\\{'z\u0000\u0005W+\u0000)B:Z#kU)\"\u001dPk{P\u0019J[P\u0010\u00044\u000b/VvCɠ\u0017u\r[UpnB=SV\u00192f\u001eT\u0015fiyɪqharV{h\u001eA|~\u0018h'zȰ&8!\u0006\u0004\u0005Di:p\u0015^|\u000bi^F'd\u0014ӻEEVbv\u00187\u00134k\u0004\b\u0017}!\u0014DGn8o\u0016iޫAV\u0013}jt\t\u001a\u0011JDY\u00111d^έnt9v@#\fg-2,`\u0001fb\u00175@!HDg~Xr\n1\u001bBUu•SÖ=iBm5\u0019Yo\"ʹ\u0005\u0004q5\u0013Pl\u001eЅ\u001eCm>#}&N;'j\u0012QX$fCz\u000bQ\u0016d\u001e*\u00183:Pk0\u0000Ќ~d~e8XB\u0014YL`/\u0018S\u0003!z-\u0010b[윷u\u001a\"v\u0004>Z|\u000fL:hK\u0017D'=kQ;\bjpAedGM7i\u0015Y8T\u001aXX\u0012t\u0003\f'߶U\\7DPU\b\u0001\tZ\u00172\u001bDg27\u0013@HY̒E\u0005%ˍ!eu\\nn̩z'?ԩ\nK\u0015\fܝY6f͇Rw2=4\u0013\u0005Y\u000b*S\u0016\t7j1\u0015p`j67?%^g\u0015ɓ\bP願\u0014~43K\b fKz\n\u00059\u000eaՙ<\u0005,r2q%EzH\u001aAĵY \u0014p)\rĸN\u00047*iF3\u0012]a2\u00070qBDT*|\u0013}iͬ2yjQ\u0019\u0019&^H\u0013rH\f~\";#cw@9Wi4rB3g\u0003\u001ew۔q5=Xh90&\u0011ǃ­i\u001fS3!&\u0005_Q>;\\L&9D]ުPQ\u0016].KI\u0010i̪*3Gj,e`\u0015\u0016]\u0014Nzd)rޞYPj\u0015\u0001\u001f1qݏaGf{+\f\u0019\u0000;TT!ݛd_ChR\u0019DM\u0011DOF$75vB\u001a^x+·O\u0007UUh,--~m\u0004dBN\u00125m@4RzUOIWMD[,Q8\u0015\n\u001a*-k\u0014(\u0003U@D\u000f,t\u0016~WX*GU\r-9s\u0015A<\u0018\u0007Rs\u000f\u001eM[\u0014\u0006<^&|_$\u0019\n@i96FEXb\u0011Jt\u00018Yr\u0018|J=g3\u001bAe<\u001dEf\u0003FfW:RS3\u0018FٴgﱧE7**/6+3W@b$\u0005^KDS\u0014-3ҨX഑}J6S\u00051/r\u0000E\u001eD\u000fV,Y\u0006K\" f\u0017ƠYM\u000e\u0004\u001aTk\b\u0014\u0014qt.RL3Zo\"zʱ[\\\u0016[(Y3P><\u0015\u000e\u0010\u0018'\u0012(\u0016]\u0004z5D\u0004H1i\u0011;\u0014f\u0015\"jp\u0013dҠZ\u00011l*<)`\tkb@LW+|`/&&\u0005G)W[AټVB\u0005f\u0018,O\u0015\u0005\u0011\u0011\u0001\u0000'.-\u0016A5& `DTb\"sAzLžZ\u00160;\"\"\ncU\u0015nR\u001e&NTaF TbNM^fJ\u000bze\u0017\u0011\u0013ǿ(W\u000b\u0003Wz\u0003\u0004\u0000ޕt`\u0005Xv.n2\u0002Ma}Y\u0018Ztv; 8גVu77Kt\"[\u00059\u0011n\u0014pe0ɫ\r=P6y? \u0014\u001dxCt\u0003JĽz߀\u0015J-7ƶ\u0016\f\u000ej\u0001˒\u000ea\u0001)Ǘ\u0000`\u0001ы3*\u0014\u0015s\tS\u0013{Mi\n`)>\u0019fB\u0010*ვ\u0003\u0019\u0011\u0004(TM\b\nڧ\u0006E\u001c\u0002xz~\fO{}DFL\t\u0016\n\u0011Ű\\U'\u0004Ɣ\u001ćO0NL׬\u00103x&\\=a`˻t8\u000bhY\u0002\r\u0014qh\u0001K\u0000W]_8$\u0015*H\u000ft\u0000NA\u0014'\u0015qYڸ׃$u/tR\u0017$\u0012\u0019[\u0012SNšb\\W\u0019j.8>Ԅ$(;jd\u0004\b\u0004R\"z\u0002\n`\u0010<\t\u0019@&B\u0019\b(bn0\fZa\u0002gՅA+J{Pi>E/xmV3\u000eI!i;'J\u000f\u0013\u0000d+\u0012F\u0013[q\u001aĪzb\fZ.i\u0006!\"3%ۂ\u0018tV\f`\u00061U\u0005YPǅ\u00024ܪ#\u001bD\n\u0011xiSx\n=M/|T\"a:V/D\u001f65\u0019/LL*|D^\"@w\rS,ь#I\u0018\u0012W\u0014bY\u001f\u0007!Ri&\u0012fʂ\u001e䭐tzfӂ\u000e;yӷX\u0017bv\u0016bcX\u001fwEN)(pR4\ffkǌƷk24k\u0018ghQpx\bMe\"M\u0002V,\u0006CcO,ؖ\u0012\u0018`\u0004D'u!\u0007&l,q|w\u0016\u001f\u001e\u0019\":J\u0019LwZއ9iF92\u001b\r|zE[\\\\_$\u0002e9g@LD*D5m/:nqMaD\u001f\u0012Q^ӑjޓ\u0004ɒ\u00159\u0015 jP5'SdVEy\u0015\\Eqd\u0006%\u0003`\\DZTR\u001bZ\u0006d3%\u000efmE.\u0012J_\u0013\u0013#\u001a븲z/\bt@\fMj%-SKhoXh`W\\ȭXM$Z\bYj6G2KI>\u0015jpz YW%n\u0003\u0016\r깰d+^̚\u0005l\f\u0002\u0005Q\u0016Vq阱\b4i\u0000h$Dd\"Lmܺ^SSF8\r 8衰B%ݩKf2>/1SKJ2ps\u000f\u0007)\u001c&)<bpjp\u0010SEVumv\u00007HWI<&o|iIXu̓\u0004\u0007MR\bA4\u0010-[_\u0017\u0011$V\u0016\u0005\u0014\u0017=^:8idA\u001djA\rw$-\u0015d(\u001edJ\n*J&P}\"BS\u0007XG)7'xU6) 2\u0001{mY!/\u001a_\n1jEL\u0015,^8NaI*ǈݳ!Yƪh~\b.R5e!ǐDyt(Z$C7}JVj\u0007@\"\u0001}`\nJlU\u001cڢLHC1-\u001c(\u000f\u0011/ZRDD=L\b{D\u0014-f\u0012*cXA҆\u0005\u0003\f\u0003l.\u0016\u0011vŀא2!Pծꭢ\u0018)!\u001a\u0017ծVf=P%DԜ䡓\r\u0001c:\u001bXh(\u001at\u001cD$ʳE*\u001bt\tZL\u0019\u0003\u0011\t6WCbE\u001dM\u0013&K\u00131eHvlڣ\u0019-]\u0015N\u0004/˸j^\u001aR2\u0018PLiJ\u0003\u0002p\u0004\u001bƢD_\u0012\u001eiT+(\u0004Lb\u001c\b\u000b\u0015\u0012\u0001\u001d$2}߃\u001eP͵Fr\u0000G4\u0010Q\rGq\t+#\n[ETi)*\u0003[@Q\f)\u00127f\u0000\u0002Íyx8z\u0011Sۏiغ(2H۬f\u0014L\u0014E5Alk-Pg\td>[cie\tsrfX `M!\u0016ؒDZT*\f'J{\u0015]x/4vJu\u001b;Պ|aTngw\u0013Yhp\u001e\n1:(]º'\u0003XF%C\u0005.ݢ\u0011I9\u0005a9XeX\u0002ـo}uHKxL֚,\r[$FFE>|j<\u001e(+$HH猪NW>\u000e\u0012\u00030bĊW\u0011bHQMB{X\u0006Y\u0013J\bSs:\u0001UNms68g0\u0015uckS\b\u0000\u0016\tŊpeQP\u00046\u001b9\u0014\u0016ͩ.feO·!H\u0006\u000eU\rL\u000b\u0007i{I,,J\u000fM\u0003HRߖJ\u0007=RtcYi7Un^Os\u0014XAtSۈ^Et\u0017e\u0018T_\fN$4;\u0007\tÍ\u0003􊠲\u001b'X\u000fde\u0017\u00009-f$4;5\u001c\u000epYĪ$%\u0002\u0015\u0013\u0016!\tRO\u0004\u0014R\"\u0010\u001f\u001e\u0012(ܣ)Y%\u001cAgᖞ1_8l\fiJ,\u0015\u0003RʔVK\u001e0#!\u001a:AI\u0006$F)s}daX\u0002ym%q$ \u0011ĩ**C,\u000234==\u0006#-â\u0007\u0001\u0018 \u000e^H\u000b\u0013\u0007\u0016\u0019o`j\u0002uiLR!hd]C1~I<\u0012\u0002)(Bg@m^r\u0002k\u001e<\t\u0014K\u000bbȩVZ%6ؔי%S\u0017ɫ\u00045'&XȦ\ne\u0003Ԫj3hO\u0013\u001e\u0006d\".9`yJZӵ1\u0003~xq!ckB\b\u000b\u001bA\u0006sݤeͥDt\u000b\u001a<D\u0019\u0002lĒst,iVO!\u000b+(M!)\u0010'&@U.G{X,\u000eXrRF00]i%}\u0012Dyv\u000bֈS\tIv\\^]\n\b\u001eB5.R9ZDTF\u0011$T\u0012R\t\u0015\u0006A\u0012G0\u0006\u000f\u0016f\u000e1\f&\u0016-Z\bLbrZa\u0016\u0000v\u0013R\bi\u0016zE@z7IܚΙK6\u0004\u0001B1.y1$A:\u0001d(U\u0002\u000282B\u001f\u0002\\\u0016\nX-Q_(zA_\u0001pZ[\u00044J&\u0010n r-8oz$S'A\u001cV{Ȥv\u0010/yϓӴ\u0002c$ѵ,G8V>Ux8+-],5Գ\nMKa`2Xa`\u00016)2*X\u0016C:nB#9\fIiͦV\bM\u0011i\t=\r6\u0017Z\u000fY-\u000bN855`\u001e +0\r8L\u0006M֭XaX\u0018Vn\u0016\u0004o.\nG-%\u0016B;@˶x\u0003h\u0012X3%Y\u0016X\u0012ԥ~g\u00061\u001c]ޣlo\f\u0017;\u0003\u0016dG%9\u0002l\u001bX8\"vBi:dޔtDC[\u00029&-XPb\u0015?ՊI\u001a~Tm#5 -^ӕ\u000e\u001ek\u0005)BT(iQMCUߙ[nfP8\u00072{Z.\u0015w&/\r`\u0002kB)MH\u00160\u001fh/ڸ3\u0006\u000f\u001a\u0018\u001dxEVrOϼ˶_U\u001b5ϓm\u000e)^{pf\u0016:f\t\u0002\u0014Gk>bG\r-\"\u0001&\u0010\u0004\u0018앝OC^ڌdt\u0003x)I9͎Dc=\t5T[4)jV;-/IT\u0005K2ĤT_\u0002X\u0006\u0003[>c\u0004B\u001b]S\u000b;\u0015D\u001e\u0018\tCKog'~ 7BPD\u0019\u0002DԺn%+}sRx!yx˫V\u0017mLج-TtY\fq0Naٔb75)Mu3)\u0017\u0007\u0016'ܽ\u00124Z_cOS<\u0016Ƶ53\u0014\u0014DH|;_92FUR\u001e|E5\u0018Uop$ή#âDUf2\u0015{§e\u0019\nF3\u00033ᕬAL!k(jVp8VVɏS2Ŵ\u0019,\u000e\u0004\u0001Q]ܓ!s;\u0007a\u0014\rzTutP\u0015\u001fiZ\u000fTmIDTW}Ʉ\u0001F :c)z˛yŐ\f\u0017@\\\u0011ln(H\f*\u001fGq÷nT/3T\u0012wTWUD Txju×ѿ:7<j\u0000\nV0'-1Zxv\u0018Y\u000fSpOj\u000e2\u0011_hXIif3U\ru)5PWo\u000f\u0005m[kmRO{sQ8U4*n\u00146\u001306ͭڽHR׶\u001c]a'A Z<4\u0005Q*\u0002\u0003j=Hbѩң0\u000e3ɸup\n\r~<L6*uՎ\u0018\\{pN\u0013o<\"j=bE\u000bi\u0013BOK\u001e$u%Fr\u00000j\u0014\u001b: \b<8Y\u001a$-rT0f|qr\"ׂ\u000e|z\u0012`g\u0014o3ǰ[-v7\u0015(s,Hɥ\u0000\u001c,\u0015\u0013̵\u0015\"[\u0004g\u001e?'\u0013\u0000=z\u00122\u0012@*KF\u0015--+8KEϮ.\u0002\u0013y_\u0015|%/`nEX@'%\u0005'VS.\u0018L\u0002m\u0003;&x>Xֳ*a\u001bt\f`͒0QfTbXʓ.-\u001b8rrmPG+]w5݈D@H\u0016\u0016{\u001c@-=~lbU-Jh15\u000bh)Ƃ`}gȢTԾ(_6lx:..Yt^aF]h}\u0019\u0010˺(\u000bؖ\trM$\r->U\u0007d\u0016`PB.J\u000ba\u0001i-\u0005\u0019]hiwVN\u00113j!TK\bڸV}#4j\u0011E\u0006\u0016snuU}A:,N\u0016=*7\u0013Jm\u001110)\tL[s_LNe\r\u0007}վ\r6!M\t\u0016\u0002O\u0011 Ĳ(E$\u0000RސIC|M\u0014\u000f\u0012569dJQ:E-R:x\t@Ee (nJ\u001e\u0005@/:?b)FW9/|6vŦCr\u0005Ϗ\u000b\f4u\u0018B\u001a[ՠ\"TC0Cf\u0012p\u0006[j:\u001cu뺚ՙ^5y0j!\u0007ǚaQ+VY\u0007RPkXp\u0005іAS[\u0000T`#\u0007/\u000bE*&=6VύĠ%\u0004;`ZOe˽h`LTIi&s\u001ebtI!6\u0007\u0002Aq*j1\u0014l(\"\u001dR-ұ,ĬD͒\u0002ĉB-Y\u0002\u001fJ9Y˰d\u001e`g\t\u0000ݰb@tY%h\u0019Un,Љ랉sRn\u0015m/if0K\b\u0006Y\u0014i>L}\u0016ASs^D=#\u0006֋\u0002=U+ޥz9\u00115\u001fw3e\u001b\u0000\u0013\u001cBd\b\u0006R\u0017sZ;\u001e\u0010ިL#\u00050n|c&][09\u0014E<}7\u0004FA!\u0004*&jᠾEnª=ؙ4&R\u000b<˩ii\u0007gF5\u0015h]FΖ\u000bU+\u000foA\fK\u000fae\fR\u001d|^ATꜞD\u0005\u0013fF֡/5\u0003CTneVX,5G\u001dݟvU'\u001e72\\6\u0014nȔi{q(\u0013\u0003@\u0004A@JWEONe\u0004_M\u0005d-C Syuiq2\rF1\u0017\u000ev\tȚ\fer(QB\u0017\u001574拦WhM&V`^ݓSen\f<fެ:!oS\u0011rNrf8aq $LkVM5-\u0014dԦ%\u0015Zӈ\u00154곴_t6QJe\u0017M&}I\u0014@oփo\u0011^a_FkȎxj<+\u0000\u001e|9\u000bdh~h){>plB VV\u001bUEǵ,C5tƀ\u001aŶ-[pᠸIlu\u00128EM@16/+\u0016N\u0006eS>\u0018@HBJL[B#\u001cפ[Fp\\\tGc)\u0016=\u0013&=P\u000edb-iH@\u0012\u000b(f*4ۢAmjcl=\u001eح\u00112\\\u001c1k\u0001k=8NVg\u0018\f\u001fIˡ\u00177\u0017̥gg/ku>(o}(\u0003!H@3p/@J20\u0016\u00174\u0019\u0018ms\u001eBh\u0011Y\u000b,ڃLg#꒙Ҧ\u0011W&N\u0018?\u001crm\u0016cb6i4\u0017x*hfZ{\u0015*[,&e%s)J\u0000`e$\u0016U¥KWHhlY(=\u0010\u0016'\";Q \u001ckXtv^i0J` ?ch\u000f\u0005ïTZr+ϪNpp/Q\fKtl^\u0004E\b\u0016@P\u001c?C\n\u001aA~#tn\u0010iF\u0016e_\u0016ٺd?|$!,P\u000e̵\r]h{FxNCmg-W1]TY\u0010\rd14Gm:e\u00015l~{t=kKLTP㺥\f\u0018.\u000bM\u0003=r\"\"}¢A\u000e)]6l]K\u0003\"uq1\u0000\u000fh\u00009[\u0016k\u001f<]\fEp\u0019H\u0007jRCLLL\u0018(yAfDT0.AW\u0007=\u001b\u001eBM$(3\nH85ZJXzk\u0010G-8\u0019(M\u001a:,w+Y\u001c%@v),Sdvb\u001a-\u0017FFa.NѿN3;ZtDj\u00037\u0005fN\u000b;h\u001dZ5#8;U1U^\u0017\u0006``\b&=\u0013\"\u0005]a\u001eg*A\u0015fDZR\u0011PoV\"\b_\u0007C-\u001cttW\u001eX\u001a\u0019\u0007߲=+\u000e\u0015ձ,\u00197\bb\u001b`\u00177t1lmlwaKvdNH]X$](&:є\thY\u0019*[C⯉\u0015W\u0018<~4.h͎_7&^9\u0003\n\fl!=r0EAx6[\u0018giqm\u001e\u0013^g~\"[=x7A?u\\'͙\u0017f\u0003~\u0006\u0012Y e\u001ed\u0004M>ɗ3+\u001aXWWyT4&AE\u0016(_+]k&5\u0003]iVOg@<BQ\u001d&ꉌ~m&ՠO;\u0011lZd\u001a}\"{H7\u0005d7a\f\u0002\u0016\u000e\t\u0013\n\u0000EH=eGgC\u0005¶תzt8mFM9]Nj\u0014gP^qfN5\f5|`\fXE\u0012\fnH,\u001f\r\fPr먦\n\u0012\n\fm$:N\u0006ڐy_@\f\u000065kL8ϛEHZ~ZU\u0019U>gl`Y\u0003_\rgl!\fǤqy\u0016\u001d{ˈ\u0010-c\u0014؉sV6\u0015\u0010[\u0003!heGv@Zf(-wNtR+ը\b^11%X2j\u001c8b\u00190B:A\"V7Mbok+|\u001c?7 -r\u0017+\u0019&~\u00157\u00160E]ȹ\u000fLvCV\u000b5ɓa\u0018.&Jsa5hy.+Z\u0002\u0019o@fK\u0000\u001b洨Ϛ\u000ep7\u0017\u000e(v`\u0004iKI\u001e(\u001a\u0014Ɍ2l\u0010ˬK{Ejd.jcȪ_Z\u0017\u001250\u0012\u001cǜ普%lYĶl5Ͳk\tc\u001aX \u001a\bm\b8fʝ{9]lB\"eF(HA\u0011^4)?E\u001d\b%\u0012j\u000e%\u0014\u0000\r(L\u0006-\u0000f\u0011\u0015!\b5S+r\"\u0000^Z`\u001c.Qi\u000e{зT\\\u0004\u0019\u0016\u0005f4+73q֔`\\\u0007\u000f\u0017j\u001bϑf\u0004+j\u00102B\u0010Y\u001fqK\u0018\u00055m,4]Y\u001f\\8(O+Bש|]U+&\b%\u001e%4Ag+h\b~\u001bbMS\u00187ul\u001c2\u0011L\u0003\u0005-MJRa\u0016\u001c\u001c\u00157\u0004j(^)\u0000UK\u0014DɋW'\u001a]Y؅e]ʕZހ\u0015<G\\+]c#=\u00072QN/\u0015\u0005^jŢ+\\P\u0016\u0014O\u001aǛ\\P\u001b04i\u001eBT6Gq*K<-\bsM\t@NZy\u001f)+ˎRY9U_3rVMH\u0005\u00056*yz\u000b6;\u0012\u0016#ET%&TsTW<RۼH\u0010\u001af0PBc\u0010/4dMVQ!rJ\u0005\u001a\u0015\u0018Ń\u0010H?h\u0015kØ\u0015D,\u000b\u0007\u0013*\u001a\u0011U\u000bSXjFޟ*]YDQ'M~N0-f!Hdwa&[\u0018Ӣ\u001bW\u001e\"3{Ki\u0004\u000fIϲ\u0004f2Q|\u000e\u00160\n,옛hi\"D`\u0000bTOUGRtჀhf\b9\u001b\u000e\u0006&[Sa\f\u000b\u0011\u001bDYr7m\\Ldo&\tګV\t\u0013ߏJDƋ\u0016\"\u000b\\mmN0t\u0016LAj.yqK0\u0017ZB19\r\f\\h=h(\u0004Q\u000fH\u00059p\u0018\u0000\u0013' n\u0016}8+'WI\u0018\u0015;*aE_\u0000@ӡiS\\>7QtX4\u0011\u0003/n\u000f\\f\n\u0016\u0013\u0007\u0014\u0015!A\u001a$ެ h\nQ\nh\u0007˰k\u0010\u0004!%W`}B\te\t\u0005f>\u0002\u000e`G^++\u0011deEa^e\"O\u0014[2\u0014\u0017vZ#\u0012_+\u0019neAof\u000f\u0015`(`URĬŻ)X\u0017bbU|ɛ\u0011\"\u001d \u0011A(s\n\u0011\u0005!OĔ䍟CbU%\u0006Rz\u0013%!\\s[!\\`5\u0019_\u0019,zM\u0015\u00161c_.R9vbÐg\\\u0014V\u001cv\\\u0004\u001a\u00058\\\u000e&çY~L\u0012Z#\u0012oL\u001d\u0003U\r1_=VKUw$\u0016\f\u0013\f#VB2,V\u0006>JL5\u0000\u0003rVR~`cym4Yml1ZUؼ\u0018'W2և\u0010\u0019/?\u0007\u000b!\u001b\u0018l\u0007y\u000b>\u0012\u0014<\u0011V\u0006\"Yx.|!2\f\u0015h%\tL Gc.4\u0004\u00151XefOcd1h\u0016}\u0016d!Z\u0015i\u0003\\\u001f\u0016\"yI}NF\u0005`Au1ة\f\u0016NA\u0007&09E52EbF\u0018\rZ**=\f.\n\u0014')e\u001b\u0010\"!Dx\u001f.l\u000f\u000b\u0011ZQ\u000bO`h7W4奬\fOv\u000eN\u0003yɯA/\n/I\u001ewcOz!\u0007\u000fIp J\u0012Uem2ͼ\t\u0007}\u0019\u0010ѭY\u0014\u0007o}\f{z\u0016*)=Gy4B'ፎVa\u0003\u0013I4:4r\rg\u0006k3F=\u0019J=(>|\"jEDjue3Ƒc\u00176W!Ҭ\u001cMZN٢\u0012-ꡚ!gF)hHDx\"V8В\u000eYywM衵3KM&\u0002\u000eJ]0o9-}Ś&Oh@%\u001d\u0003..d\u000e\u001aRKVA&\u000b\u001c\u0013E\r\u001b\u0018ov0dI;\fK'C̰v,\u00145z\noV\\s[kC\u001ařIrM48d0Zq/Yf2FN\u0016ɀ/I\u0007Nҍrĭq\u0019Ma/8)Y\u0015v\n{85z\u00005UM@B\\sSٔt7Q2|G]_\u000e\u001d\u0000ᡏ\u0001AR\u0010\u0012T&JGhDeW\u0014\u001cut)32\u0018h3\nHX󲠶E~%)a4\u0012K\u0012\nnZRu=-\u00064UJ\u001co+Y\u00160zAk5\u0010y\u0003`A'\u001dЏJW\u001bU0\u0019/\u0014f`\u0006~lg\u0007]'jWܨ́3B\u000b\u0016FU\u0018/{M]U6]\u0012,B\n!]+]N\r2hd\tJLE\u000b Aٚ\u0004N++`AKđ)!׿j1\u0007nW^ttI\u000bٴ_\u001e\\Z\u0015Y\u0018h)S\b\u0013\\\u000fd`5UVpji)%\bHM}X\u001d[8ȪnZP\u00027v=@\u0018h\u0018`lABJWb݄-2\u0010\u0011\u000b\u0003U\u000bЙ6S,\u000b\u0006WnpUL\u0017(\"\u0003\u0007q\u0015uR%&l24xh%1\nV̾N\u00017\u0003r\u000bצ Fk\u001d\u001f#E<\u0019kx^b/g˄H\u000b#Nʌ:)TNMS\rU$CX\u00073\\\u0002/E3<\u0018$J^ tњ\u00105WXk{#Jp\u001b69l}\u0000\u0011 -\u00051.r\u0007U\"Q#F\u0002\\V-\u0013 e\u000f.RT*k\u0012N\f+j]c[\f[\u0006\u0001`}\u001b]$s,V:]Y>Qzh8o@)/J*Zy\b]BO\u00111\u00176[c\u000fE4Od\u0018kW <\u0019\u001bπ\u0018y\"װ~=\b\u000bOj_c!:\u0004 ү\u00056.<dpn\t\u001eO\u0001iYx~sV8EBb\u001bW&Fl0!\n@\u0010\t\u0019l\u001aK\u00165fkbZ\u001frx(_\u0010\u0014'~@@S&l*ժ]\u0004qJ_>@52Je\u0018JϜ\u000b2o\u001f\u001fG\u001f/ݼ훯rvqw#O.Ynnή/^\u001f\u0011hw;\reGx?#G\u001aA(\u001d_wz\u001d\u0013\u001dl\u0014\u0018\u0017cO\u0012\\%\u0019\n;e&tR\u0014~E_sa\u0019\u0003ʐ\u0011M\u0004\u001b\u0013\u0017<Li~\\KE8\u0003\b]\u0012<CC2\u0010\u001b\u0017~\u0014\u0010,\u0006(\u001bSv vJƑ3)GH\u0007Ki\fL\u0010\u000fAD\f\u0001+\u0018\u0012[!H\u0003\u0013\n\u0007|Ni\b\b<\u001cH ׌R\u0010\u001d!3r\u0007vA G&\".5ch\u0000\u0001m\fIJ[\u0006\u0011A&*mB-\b\u0007\u001d\u000fKcJ\u0018D9=*1Č\tk\u000fc+1Y$\u000fAjƱ\t\u000bB\u0013q0/\u0016t:;Yb2D~B։?RKIY\u001e*\u000bD/15\u0001q\"f<i\u000f\u0005Jdr\u0010٧_\u001d\t\u0017\u0011֙\u0018B)BwkdZ\u001bD+aN8^\\;I\u0018\u001c3q.(и9\u0013aƷ\u001eJ3Z<tn\u0012\fKqt\u0014倔΃\u000e\bO7\u0015g\u0016qA[ḆhK_Mt\u001et$e3,\u0011J(\u0011#LED}J\u0010y,B\u001e,\u0002P(A|[\u0004{Iz(|gh\u0015b5Nl=7\u00131\ruH\u0018K\u000fӿjDݖB\u0003\tM0\u0016q`@҃Έz\u0018H!pb8\u000b\t|A{\b\f$㛍n\\j\u000e\u0015)Ch^f@ּ2f9\u0006*Btm(\u0013Ӄ4\u000e68D?Γot\u0010IQD$\u0019M^zp\u0010We\t\u0004uΩ\u0015DYu\u001d<Z[;NC*\u001f\u0003\u0010Q&{z\"\"vrH\u0000ɔ}ޘ\u0007 !񐗤ʫ8O#\u000fse&ޤ\u0003\u0016Թ\u0010`)\f\u0001з\u001bӣ6F{ \\a\u001c\u000b[\u0004B]\u0004\f\u0006\u0003OX\u000f\u0007Ɉ.9,sHԯҘ\u0018\u0007\u0011$6pv\u001dVwtk\u001aC\u001bCD$\u001a&\u00017b\u000bv\u001b\t^oBz\"&\u001eC\u0005\u0012\u001b? \u0018g\u000f9VT\\\u0007a04ß#D_안Mtr\u0000TG#ݟ8K+M\bF\fn\t\u0016yS/\u0002\u0018.6}OG8\u0003\u0018\u0010R\u00063\biLA_\u00164\u0001+C\u0015xGK\u001fc\u0004\u0011q,,;3Ǫm[2\u0017y@k|G\u000b :8Q\u000b\u0006\u0003\u0002\u0016$*\u0003+ѹ\u001a'\u0011k\b\f\u0014\\\b\u0015;f:\u0002\u0000X\u0012qU\u001bRe\u0012\\\u000eȐz\u0007\u0002y,H\u001c^8k7\u0017ԼUe*̋\u001e_uU\u001cCCo\u0015\u000e_\u001e\u0012F\u0017}1Qס\u00136=hz8fUBN|.s$!\u0011\u0003­$%6{cal\u000b@W\u0010{[?'@61@n^\u0017\u000e'&CV%b=H\u001e\u0014[Fkˌ\u001fڬl\b\rac8\u0018((˄\t\u0011+\u0012\u000b\r`\u0012_*P\u0012D5\u0007D\u0004,)2t,D޶KF,u\u0011A$e+ɏ\t\u0006\u001c\u0010DA\u000f̫K]V\u001a#-Ȅ\u0012.U>G1\u000f \tƷ)s̪S\u0004\u001b\u0002\u0019f@\tʹgHg\u0001,Op!l\u0000\u001a0|@oU\u0006^S\u001d\t'״,X\u000fb!P>\u001b\u0002k콄Qi\u0013B\u0016=$49+c\f\u000b.\u000f}\u000f(B\u001dKdT=\u0002m\tdI\u00020~9F: @xZ1*_N\t\u0002P,\u0017\u0010·\n:,\u00019'O\u0015\fx31?:џ+c B%M\u001b&S\u0005nV.\u0007=a(\u0012B6\u0006`TW^ƖS\u0003\u0019Tq\u0000}e\u000e\u0002>{\rf,@1\u0003\u0019\u0003l!l\u00162$d(n\u0002\"#\u0013y\n=wdb\nrPBƤD\u0003E*9#2\u0006\u001btL\u001cm\ro'9D\u0011,S(@8\u001cKΓț>ka\u0004V\u001a2C)\u001cy+\t?yw\u0015:D\u0011\u001eAbg\f3'?%+\u001c\u001d\tT_';\\\u001e\\*NtCʏ~cGy\u0015<B\u0010\u0019I@\u0004I\u0002%DM/:*j\u0006dz)+$X\u0015\u0007?WYAe,1-Aw\u0013=`A{)|!&,RL;JI\u000705\u0014\u001be\u00150\u0019jc\u001dY0\u0011\u0005嗮l\u0010ՠ\u0001G\n1ژN$\u0013}%\u0019\f)r#2-\u0010044?(\u0014GC R:\f%3ֆd'4E/̭#2up\u000b\"%4bQts|O(Ʉ<\u0004*\u001d\fS\u001f&\u001ceDVˬU˷;㵎?5=E-d).G^\u0000X˪Ӣ\u0005NvGVV\u0004n\u000e \u00063;)mF-QTb[i\u0004p\u0003Q[Ƞe\u000f\u0006@!$y\u0006:a\nAw`U\u000b\u0019|\u001b;aG\u0006Ke㇔¸\u001d)d0\u0000\r\"=\u001ct%a,7\u0000c\u0015\u0006\u0001_t.C B\u0006\u0013\u001btd\u0015\u000b\u000eᚈGG>CSGU2_i\u000f9Ǔ\u0018aĸ8:\u0018O\u0018-g+}ZƸBc\b%\u0003ƕu\\\u000bMt/\u00105x\b\boĢӍ\u0017:`E,\u000fy\u00018?2\n}(C@JB,z\u0013i(`%0bH$\u0010n<LL\r\bY(!̔ Q\u0014\u0015i'\u0005j\f)e5j#\u0013(\u0005:.D'c\u0012-zެF7\u0018)=t,\n+ՈȟfĮr\u000eY\u000eiӰ\u0003`!\u000b˶;rDTZzi\u0019\u0012M&\u0010\u00074R\u0011JD<AL2T5ODK!]\"_J\u000f\u0004IO4T~\nJElԁ\u0010\u0012J\u0016\u001aZTAu&FHiE\u001dF\u0011qCVbB\u001cꂩ@3Ƒ@.5)\u0011V\u0003T\u0016J\u0014YR:`x!\u0014#e\u0015\u0005&\u00189c\u0012asRcd꒑\u001c@\u0013\u001bi*@c\u001bs>+Y[(\u0011̌m\u0003#iC\u0012]'L4%#SyR\u0018s]\f\t\b;4>\bgoe\u0013;\u0014\u0012@=4^Ɛ!\u001b\u001e˻\u001aC+S\u0011e&;u\u0010U\bn\b\u000f\u0000l\u0006@Uz+Bm\u0010A\\\u0018N;z\u001cP\u0014ߵ\u0010<)lHDB7SYf\bXCb-u&1b$\u0015\u0001D\u00152a\u0001E_@\u0010Uώ&5\u0002*:?{\u0010Uk]ik\u0000b*M% blb;\r/l!\u001f\u000e:L$%vA\u0007v<(,J><)\u001d1.L\u0004eIkU\r.'*\f0\bӶSUP&ob\u0013\u0016PD\u0001\u001bO\u001d\u001e_Y\"++\nU2yf\r=6\u0004*7C\u0012rtcap\"`+]=\u0007m9#\u0005%Mp\u001d\u001aC\u0018C|X\u0017?\u0015>D4H;jR\u0011]+\u0013cj8DLW)T\b6\u0010hʞJ2D!Mn{\u0007H*+y\u0013\u0017cWe\u00198q9*324\u0011\u001e\f_JuQI\u00173\u000f<p\u0017> ()\n\u0011 k=P0ѓGDT\"|Mc \u001b.pD\u0016?\"\u0013\" h~!\nLh㔒4bs$)5%\u001cSH[A=B2%5V;\u00106\u0013z,\u0012]|Sz\u0004ypbҙ˛\u0015v)K%\u0007\u0004\n0/}\u0006\u001f%\u0013\u000bA\u0007\u0019ɴ\u0015\u001buy\u001bB\n\"~'!R?{O.\"PF\u0013ȩgtF\u0010X\"DBOrtNgTˆ\u0010s\r)zgP\u0006?cS\u0018_>ş/FW\u001fG2?\u00057gw߿>>?n?\u001e\u0001]~ͯi46_]^\u0016~#o.\u001f寏n.\u0007͗m=z+|}\u000fF,\u00155\u001eÑ\u000fS˯_?7_}淞}B\u000ew\u001f{1﷟O7۷7\u0010?}6,\u0005q3]?m7`}b\u001foH'\u0013xj\u0007&jr7_ޟ[L\r5\u000e|GOƪD4??{sv\u001c\u001d\u0018׃=Ty{owodYil~ʗ\u001coKqf<rym]\u0011rߧo/pwW;o=7Ŕn;~b\u0017O|^^s~H \u0003^|qA\u000f=衏19CA\u000f=\u0007=_ܝ\rOo\u000eA\u00138gnooEt'\u001e\u0014у\"zPDnA\u0011ѵr\u0015]'\u0017^\\}^[88t)zƏ1R^S{m/Ŀۋo/0]t寞X7o.n>\u001d?Q~z\u0003'}t\u0019H_?Z\u0013\u0017\u001ex\u0017o.?8S?L;\\AEݿ|\u0015+V۲v0J%\u0011'曋?}ϕcYc\b7o8;l3'SS\u001c\u001bwf\\Mwپys!S5i(mb\u0012\u0013jy9퉆wڨG\u001fKǞz\\SZR0ǾXv\u0015H\u000e\u0010\u000eΣ9ށ]|bL~eF~/f\u001e;ʌ>H_\u001df\u0014\u0003\u001c.rv>-p\u001f᳻/wػcj\u0007X?>\u000b^Z;\u0017;:C ׏%C ?g ׫۫O..{{oٞxw9\r3}\tyEd|חowX\u001fmd\u001ang[y\tK\u000e3~F\t:!\u0012e?}丹\u000e)P{\f_\u001e\u000b|\t\u0007\u0016',\u0005\u0006$L\u0007o|=a}o!ޜ\u0017\u000f>rް\u001d޾\u001d=~V\u0000!o~\u0003l\u001f\u0000\by=>[cBfb|Uޛ@ToNW_\\\\}zquq5cO5ۿnٮ߳^gv}6\u0001Oښ;\u001cѯq\u001fw\u0010\u001dZiAZٗWp]S+dQYqϷ\u001e\u001a\u001emK&M>\u000f=[n_\\^]\u0014u\u000f6\u001dۧwg߿GZgwX_^p\u0010\to(5?\r~bߗ~j\u0007`,gSMr\u0017o9Y\u001dßh6[wgO5\u000b2<l?ׯ//ebgW}\u0014/T;:>{ZhG|<n/.\u001e\u0010U\u001d6iOM7xk>yHp}\u0011x\u0017\u0011)\u00034!\")\u001fH:y\u0011I<{\u0013\u0012\u001fCD!\"\u0010tHz\u0014\u0019Ð~\u000e\u0011I//\"i\u0017ie_^CD3//\"i\u0017ְ/\u0010t\u0002;w6_ͧF%.//\u0004sfQG#xQ\u0010~K;hvR\u0007o\u0007+\u0001|l\u0003ԁ\u0011\b\u001c\u0018o80\u0003#<0\bw7(\u0007 \u00109\u001f9>\u0003\u001b8x\u0010\u0007\u000fl\u0006lpl\b\u0017\r_\u000fpv[pd~ۯn\u001d;_.qq?19Iew\u000f\u0010=.1<\u001c\u000f%v^!<)ы\nz:~\u000f?\u001f\u0007wow4\u001f8z7/twowOj?\u000bԤ-\u0003d\u001eA&\u0006I[Og\u0001Ĵϯ\r0u%\u0017i-`e'>}\u0013؍7\t8͐=a6e8\u0017_V%\u0004\u000e\f'\u0017[A~WfbFq>(=d\u0019'neFq߄}y?Ƿ'A|\u001asW\u0017;ȈGy?>\u001fv\u000fI\u001f:s1;>gK9poXs?8:\u000e\f|p\u001fƍ\u000f\u000e?8\u001fI|\u000eC\r\u0007\u0003\u0003!FCZ\u001e\u001cO;^_~\u001d\u000b\u000bx]7kX_YW7Cak?|~quu\u0013\u001c!tr/+?z2}\u0017Csq{n\u000fx#>?;⋬O_]\\|<\u0004/o^_~y񷗷W\u0017\u001f]b\u001e\f?1j{!`e<X\u0019\u000fV\u001fl{\u001cAS.vY-~\u0006^{\nNHeETX^^\u0017idzx^rǐ|>,)'wfHͻX\u000fdAn,]t0:\u001dN\u0007\u000fZ\\`bbXt0:\u001dN\u0007t0:\u001dN\u0007d-/.`J{z|*j^^vN\u0018\u000e\u0006c0<<\u000e\u0003Ȟ<r@y3\u0013tC\u0015~\u0015.rv>\u001e?\u0007Ty\u000fPmY=y?Lqܗ\u0007y'k\u0003D1{\u000f\u0001CG#xil~uT8[:\u0001Gb\u0004!\u0015\u000f8\u0012OͶ/$=Lk%\u001fOwv;=a\u0017\u0003o=#>%3稈\u000fEk$m~2?lAi\u0007'˭ww6ONԾxdrn&7\u0017\u0004~;P2NSA~B`9d~.&r0\u0014^If\u0019\u001dL2\u0007$Em\u000e&-:d$\u0003l0g\u001fTƝ싻?^?vcO2\u001d\rW{\u0007|b}M=\u0006\u0015\u0015\u001fvy\u000b4ʏjd{\\9A|𳧚\u000e(a7o<X췻7{`d0w})\u001d\u001eۧG;ہ7}qw{aO5uv\u0000Z\u0002}\u001fp\u0001\u0019|=oo>{5.>[I_*\b.6=Q\u000f<?~QVe^n.S@|\u001c}\tg\u0011Ä\u000e~mG{ﵹ_J/g\u001d\u0001/\u001f~.\u000e#~\"A\u0011\u0019*;1΃*zPE7S\u0007U>\u001fUt{\u0001⠊>\t\u001dT\u0017\u00002Rg[\u0017~\u0007]>\u000byE\u000f&ꢻLm\u000fu}\u000e7+ũ;M頌Pet=Izu^4\u0001\u0001j* \u0007\u001f?%\u000bqjƎ5۫ۻ돏tW;\u0018SSc)jO/qD!XW/ž#8?B\u000egbn\\r{!_f\u001b\u001evIV͛U\\Q\u001fW/\\K3\u001a\u001co(.wg\f~z~~򣧚o}qv~$W\u001b\u001f_~~TG+ۃq]\\fc_E^ңp*.'\u0018\u0003WT^J/R\u0002&$~pzono.vM\u001d/\u000f\"s\u0015\u000e\u0012A\"\rS{-x\u000f\u000er;\u000fAvށm|\\c{Q4]\u0019G\t8YQڋ\u0019\u0007XmeFfmo^\u001dL}uy{\b]u}Kբc=yw`=y?Lqܗ\u0007y'\u0016\u001f}~\u0006(F\u001f\"OLgw\u001eu\u0014{y>^<Xׇ\u0010C&R~>ϯVc=\f{Gv}6\u001eed\u0005?dNj=z;Y\u0007+Q,,\u0012&\u000fh6tݎ_\u001e\"T6'ܟ\u000f\u00000/\u0007?ަ݅}kO`\u000f1ϟ|A[}\"]3CA+_qq˻gcyn\u000e;OVpVw4ˮ艹ޜu/='\u001d\u001f\u000eGy\u001dAsc<ip\u000f)_\u0007͛/)A\fÇ\u001d}\u0012zy\u0003*`9\u0018s6\u0011:{W\u0010vx\u0011XW>kLG\fg ŗ7\u0017I~\u0015܆#w~Gxџ_b?r߿\rwGGף_|G$^5h\u0018I5ԣvR}j8\u001c\u0013=\u001d\u001er_\u001c\\᨟\u001arA)G\u001fh}=\u001aMZ+N\\?)>*8?%v\u0014ؿKy}(\u0013K='q|\u0001\u001d&$TQ\u00183chTQ'vG'9vW|>އ1Rkc~Ii|?ՌQ<\t1$0X5\u001fI*q\f0h=c^~k\u0005\u0019/hmǗ\u0018ٸ엟j,N'_oE\f~f`l\u0011lu9ְ>\u001a\u001b\u0006}v\tC,ez\u000eq?etL.\u001d{736387<8\u000eayI/=$\"GccP)xX8}\"2::NY;\u0019?\u000f\u0001ݻq%ז{}C6Ý}\u001b\u000fGm}qz\nU\u001dw\u001cqZt\\X(vd\u001f*8?pfz/Ȃk\u0003JEXޱ@㠻:UƎ$Ozu\u001fT%:Uc\u0003j\u001c<\u001e@\u0018\n:=hy\fu\u001c1R\u001aݍOx\u001dC\u001ch^gxóv6чxoXu\\[M1Ɯɠ\u001dߊ7:ip%q\u0006>կ\u001f\u0002,/8\u0005\u0017U|؞1>\u0017c}0/x7\u0016ޅ\u0013rܘ>\u001f\u0011ǉcg\u001bx\u0007s&\u0018\u000eW\u0018=:\u001c\\-~$N\u0017m!n<\u000fΣY\u001bs=a\rS(:ILtNp\u000e]9gǌg\t\u001f}wުt4~xN\u0003\u0005 Y\u0018fl\"cזQ\u001826f}t\u0005\u001eNd}d\u0017`)@{kjXJדH\u001b:7JڃI{\u0005*X1qW\u0005\u0019#HQ~\n\u0010x!ǟ\u0017bmlxsL\u0015\u0007gE-\u001dG\u001a7\u001aP؇qr4ǲ=\rF\t\u0016?<\u0001\u00078^;\rI\\(\u0015OW9_Cǌ#K1\u001f9\u0011\u0018^8\u0006-\u0018\u0007\"\u0014qh鄬\u001d@TL\u0000\\69رu:kcEkm\u001dҜ:ĳy\u000e1qfppq@c>\b\r\f\u0018\rB\u0014<D7e\u0010]Yr\u000f$wო\u00198\u00012J\u001ffa8=ca3\u0003;\\1Sje\u0010\u001d\u000f%\u0012\u0007~#c\u0003M@_. dG\u0012\u001d\u001fC\u0006\bE[{s/[4(\u0014\u001b=j.\u0005,\t\b\u00062\u0010_\n%\u000eWӅVS3\u0004enaX\u001d%\u0006D[\f.2\u0004XqaxoI\u0012+M8\u000b\\I'\u001eioV\u000fۣ\u001ft<8\u0006n7᡹'zc ͉LE\u0019$3ټ\u000f G*h\u000e䗱)Ă\tb\u001e*ܐ\r\r\u001cyL\u0010PkEZowrjnX\r\u001bqֶy(l<0C\u0014ʼ\u0019\fZWkR胣1#k!QH\u00126Q\u0012?LxpDb8\b]hfa\\w8ĺ1s_쭑xu\u0007v\"虉%\u0001as\u0010bpspA\tdP~\u001b_9.Wu)ApO#S]x\u000f(zICvćo;ndȷ\f/%S\n\u001f-6y:V׸O,BP\u001fr*{&\u0010g¸bx$\u0001c\u001f|x\\!\u0007CP\u0007C\u0007\u0018DrMO\u001e<0of½\n7Uy\u0003$.\u00073\u0010$\\\u000b=\u0003I_pD[Ѫl\u0005s\u001ae'8D\u001bѺl8\u0007i\u001f\u0002\u0019*&'fL\u000f\u0007T1:0r(y9S>\u000e\tMe!z\u0007\u001bI\u000eo|\u0010fc\u0000\u0005,\n$Qԡ\u0012ŠU\u001c7E܇\u0001\u0001\u0017LJY\u000bz`\u0010hơ\rt\u001buS$i%XYa\u001fd\u001a u\r\u001f\t[OG{p!i\rtl;'I2Ud5}\u0012$\\泈JԌԷ\u00155\u001f\u0000\u001f%|j&'\")'\u001dvIx\u0006G^\u0018Htpu\n\u0004m\u0006gK\u001d\u0005ѤZ_\t؝>$]V^\u001b:H\u0004\u0002ٗFbqí\u000f$\u001d\u0006\u0007;8.b+U<'k\u001cgAZ;l\u000fO#~Nx5Ŭ\u001ba\u0019-y\u000fc5֘\u0003\u0007\u0006YV<ZY4]si37[cykLq\u0003|\u0017lK\u0018a\u001fߤyx\u0003?\u0006`쎋ciڏfY\u001f>*PPU\u0015 s\u0002\u0011=\u000f\u0004f>W?6r]\u0015\u0015Ȼ.\u0016o\u001en1\u0018\u0006$\u001buQy]$upti!Kҥi\u00052v\u001c{\u0006i\u0007@߃\u0000Ҙ%kbݳ,3\u001cO#M{֋Tጵ\u0012oaQ?=oY\u0014\u0011ਤԓȆ4\bI\u0014ձ3B]N\u001b{\"\u001f@T·\u0014Y{b#44\u0018\u0013@b\u0005\u0000\u0018*v,o\u0011ޠ\u0007\u0011Y?\u001f&~ǮɮǤ\r\u000fBbv\fK[m'\u0016X\u0003\u000fF=.̓6\n<G\bb\"k\u0000,\t\"Tn5V\u001bi\u0004%\u001fH{#DR4haﳍp\u0010|Ӑ\u0010:<$\fYKw\u0011j\u0006=􌹎2Ƶqw8McFKOe#\u0013'9X]~\u001d\u0010\u001d\u0016;\u001fK5<U1J~\u001ft\u0007پLv&\\WPt\u0007\u0017f\u00167zXޱGJX30^.ҀmdiH1ǹ:ԇ\u000b㚾)LGf]\u0006v6!u\fA\u0019ps;\u0013Z*\f\u0002\u0016\u001cud+\u001a?s\rK=v|0\u000fN\u001eH&\u001f6'U}\u0010\u0015\u0006@וF9q]<)\u0000F\u000f\u0003#+)C]ۣ\u001ah\u001e\u000ehGgЁ\u001dGfh\u0011\u000e\u000f;F3.\u0011=x4\f%\u000fFG\n\u00184[d\u0012}U42A<\r\u0004\u001e:~qE\u001enZǑ\u000e\u0016T\nshWi\u000eƦ`ܢ8 b\u001d\".->&\u0015@B\u001a\u0014\u00179B\u0005\u0011KP\u0010Ɏ\u0004˰<J&mAԌ9xp\u000ebeK\u0000\u001enx%}Kf\u0019! %(5\u000b\u001el{,xg\u0011\t.\u0002Ɖ\b+x3Mb\u001cC,|\u001d`y\u000eű9\r5OD_\ff\u000fǕh\"0\u0003x-pzЛ\nw2\u0007>hߊ\\KJW\u0013Zg0\t\u0011-\u0011/\u001b\u0016UxW&\fr\u001dJ\b\u000ex\u0003:qǹ<?͟SY\u001b\b=\u0018js䖬GY:\u001eAzp\u000e\u0017z>\u000e8\u0007f\\޼\u0017G\u0014'6<\u0016ġ+x̿.WS2\u001a~91\u0000'_!JWvxG_ޝ\u00072ڸzӕ\u000fp;z<\u0011\u0000SG|9:$\u0012Xr<DqƟ*yƏ>1\tm[:G\u001fg;_|m3%KM䡾o4nّx\u0004\u000b\t7%\u0011oB\u0018x)УS(\u0011AVI?]ͅܟO8Z7+Ya[\r/`『\u0007A~H\u0014!\rhx(\f9\u001b\f\u000e\"xN7C>\u001eų2F`\u001c\u0012\u0004a\u0007\u001b2K\u0018rx#JS\u0017ىzGJ\n'd)DU|G\u0018\u001fʒ\u001c)\u00183\u001fd*\u00104xj\u000f;|\u0019ԱTa4\u000fgqc\u0010me\u0010<̃ˣ\u000f\u001e49\u0004\u0007'zRe\"\u0006\u0001\u0019.\"l\u0004\u001d,$L:^9ŉ!\u0013\rʡ[ѧ\u00003}v81\u0014%\u0001~I\u0002\u001d\u001d:\u0015G[;t9橁Ɍ6q$Z\u0010\u00127\bӑ\u0013\u0002[D!os\u0000qn\u0018ɴ\u0007\u001d>\f8\bT\u0010=1+\u0005\u0007\fbH:9|j\u0006\u0003éA\u000e\u001f{\u0006#!zSLQTq'^\u001f9u\u001a*3=bFxK9>fـ?5Y\u0019CHa\b<,\u001ak\u00101\u000bX)\u001cu#F\u001e?\u0004\u000e[.\u000f2\u0018\u0006gy\u001dj\u0006k\u0004d<$\nQ{{S>\u0019$-\u0004\t'E-|VNUR<\u0007è\u0007\u001e}\u000eU\u0014v;\\\u00106\u001d)<Ёbޙ\nC{\u000b4\u000b`)ևAx\u0011\neC<.,G8'\u001amG?<N\u00029Î<`y\u0018i\u000fozN`9ag=x\u001cdwD\u0017q<1Rqq\u00070\u001f\u0006/\u0019S4\u0007]=bS0k\u001a\u001033b\u0011<}H\u0017>#P4\u0016ycO\u0000FJ\n\u001d<L+#OS̃ $v\u001fۦWL\u001eHg7\u0004\f׺\u0019\u001fgKJt\u000e66%xwC2^v*pZ\u0004%;#t׮Ǟ\u0007w\u0014ca\ntI:\\1\u001f֚4$z#CD\u0000RiW+\u0010\\,Jӆ5\tʝV\u001eʧ_ѷ\u00036F\u000e\u0001:AǛYA\u0018Â%-f8AQL\u001ak>DZ\u0014O7_S6Ǝq${jj4'YS=@>a\u000b) \u000bQ\u0016\"\u001d1!\\aaJ\u0006gB4EC./Dص\u000e\u001f}\u00068tz\u0002I\u001d\u0018C\b Ƒr\"sӳnZ.fYиM>=]\u000e1uC]\u000b\u001e\u001e\u000e\u0013ٝV}\u0007M_y~\u001b͖h\u0019\u0010沢`<~#.\u001a=A\u00187\u0019CX4\u000fE9m,\\=D%\"\u0001\u001f\u001f\u0015'\u0005'?\u0010f\u001b˃ta\u001e\u000e#\u0006Çm \u001f\u0002Pp\u0002ӇI\n\u000b6p\u0013į=l\u001e$:柜'8_glߏbk joRq6{iߵy9oJ\u001eF\u0013Z-\nbբ`\u00063\u0007Ǖ*¢nޖ\u0003/޲lޏfs5z\u0016=9\rp,ưhon%\u0000ף(@( 9<\rA1JӫOϮ.olu^_/|sG >\u0013On\u001eS~\u00178\u001a`@[Ht\u0003h2x\u0007/HJ\u000e;\u0011%I\u0014\u0001o%C\n0W\u00064%E\u0001NeI6MB@l5\u000f\b=;F#.:]>pzT!\u0001\u0001q\u0018N\tJ9\u00039+\r\u0012\n̩o\u00049\u0004B3s\b\u0000YI'Ng3\u00110dNJm<)(㜱\u000b\u001f7Ew\u000eCvbhYH\u000fX!xJ\u000f \u0017\f\u0003\u0005*\u0003\u0005\u0011\u001b8S3,g:^7\u0016vp\b?,&\u0015\u001dE\u000f\u0019˂p\u0004$W@y@-\u0010\u0019=,C}\"?9R(\u0014Јƈ\u001d@\u0001U\u001d8b \n46' e~AN\u001c~E'9vmE$xq\u0012C\u0011\rc\t4@m!\f$$ю\u001d\u000e.Q\u0006M\u0019qH³04:$qObw. 8|C$\u00020Jn_w*n5Jv~2\u0012za\u0003 |.r8[\u0014\u0016){\u001c\u0011\u0003=?$ -߅ԮV9-;\u0016DIJ*\f\u0002B@\u0000h!>~]lcQ\u0010*\u0017\fk<ou\u000f|\u0011L =rN\u0014Bǡ\u001a\u0004I8G~5v\b%\u0011\u0019Ȫ\u0018\u000bF\u000e(it8&8\u001eaZv\u0002V(81\u0017@m\u0010\u001eC\"׽\"A\u0001\u001bih18|T|Ѐ\u0015D\u0014:=XeKŗ\"{h\u001b&\tq#\n\u0012\\J`6\tQӆhwD*~.\u0010c_䏎\u0001բc!je\u00024=\r\u001a\u0005l\u00106B\u0004:i\u001eu\u001c)AXڎ\u0003:B\bI=دNH\u0015\ftJ\u0018\b\u001eZ\u0012r!AH\u001f!\u000fw4y\u0019\u0001!\u0005\u0002]\u000e\u0000\u0017\u00006\u0011|s\u0006\u001a&AK0z\u0010\u0001VLDh\u0019\u0004:缬CY1S\u000bЮW*@\n]?E\u001dYԋ\u0001\tdZl}Vp#\u0002qa{~!Tb/s\u001d\u001c[\b\u0002#k\u0010\u0015@Y`\u0006xRZ\f\u0006#\u0007 \u001c\u001d(.*\b\u001eM\bx%n56\f֖1\u001e\n\u0005\r|%L\u0011\u0003!\u0004\u0019\u000b\u0006\u001b\u0004<\u001eU4B7x%#gʗ\u001anf\u0004'ׄ\t\u000b\u000bC\u0010KiBHC ͩs6\u0004E^,\n\u000bs3Bpc\u0005\u0015\u0012i֪r\u0005\u000e'@2^l\be\u001b\f\u001e{*C\"fJB<X*'\u0014,IfhOGߞ\n\u0010;t\u001b\u001f\fƏТ\u0016^y<\u0014\u000b]@B\u0017n@x1x\u0001`u\u001dofRqa\u0007\tNIB7+h\u00143K;\"<o0N q&WcF\u000f)\u00040#f\u0001(\u001e\u001bX\u0000\u0010]Ƌ\\J$\u0002d<lQ:\u0013hT$ZO,n0|\u0016P*)Ӹ\u0017\u0015|ιIg\u0011c[3}r\u001f\u0002DTlxu:˃#z\u0012c|@>\u000b\u001c<\u0004q-9\u0000$\"?`\u0019h(a)\u0005X\b\\\u00042ҡ\u001d\u001e\tKQ*H\f\u0001\u0010pR\u0019$I6^\\\\_HcE\u0014k)s.;l,RX@\b\u000b\"Qcd^D+Jn\b!B}I\riB\u0002;p\u0010\u0001\u0011~H8eC>I\\ʂ6\u0014P\u001dít/\u0016\u0000o\u000e8U\u0015GyM\u0019\u0001㹅+\u0007R\u0014l 9\"ÁJ\u0006>\u001f\"fy\u0000\u00140*(\u0019\u0010Y\rU&S\u0011TbF9^\nJb+1B\u0010(\u0005wB2G@\u001b7\u0011,\u0013\u0013.\u0006;ĖT&\u000e7\u000e+\u0006H=ӷ\u001a94\\HHZ\u0001\u001c@2H,#xIFTX/\r_\b\u00190\rS\u000f9I *H|ƙ\u0003x$ Fe]\u0018. ǖn@\u0012\f$oOF \tDC\u00122\"\u001bd\b\u0007\u0019.t\u001eR\u0010\u0011P\u000eb06\u0015RX2\"\n\r(Κ\u0015Dl(\u0011[\u000feyP.zׄD$|\u001d\u000b\u001a\u0018B{'\\\n\\L\b4\u001bK\u0001.x6[:\u0010{.\u0006`B\u0019$E\u001cՓ(;*\b\u001c`0Oea9edPC\u0003-'\u0013\u0004Ĥ$@\u0000P~~ۛ!n-B3\u0019K\u0018\u0016褖|Pώ_\u0011I\u001b\\s\"J\u001e7\u0017bfDq\u0000\u0011(9'&!`HE\u0019\u0007y\u000e\u0001$\u001c\u001c#\u0019\u00062\u0003$z+(\u00170^*pqz\u001d'\u0002\u0010Ll\u0015j\u0015z\\ \f\r\n\u001fƲ\u001c`I>B\u0002\u0004Ʊ\b\bm,f6|{F?&.]\u0018$f9U\u0010QfP%Cѭhb\fbPsC\u0006#\n(ޤגdͮ+9&\u0011\u0015#\u00019 4ѐEP&\u000b(V'\tbA//ރ8ʼ\u0016On\u0006\u001a\t:nh5P\u0018\\T\u0012%54}͉ӂ7Jn\u0000oX8*e\u0014T\u001b\u0013\b-.jM^౽zZ0)\u00156MĎ\u001a&Yu`\u0004^iP\u000fѼ\n79\u0017o2Ѿ\u0012p׍^\u0003\u0002K\u0011\u0005\b\\g8_\u001186\u0018.Co^Q<\u0015}\u001d~\u00135\nJK\u0000F\b[dckzM\u0014-\u0016D\u00180N^w=5L+aĕ\u0013i9\u0013pҐ_uk^s\b|mK\u0013\u0018J\u0013u\u001fU\u0015vЇ^\u0003]p0\u0011̈\"sj\"\u001398r_άz+\u001dI65\u0011Ya֯j\u001c3\u00135\u0017t\u0004\u001b25,T}u*[OÓk53PB\u0010$IJ,kn2*/A\u000ba#=ƀkeI&(t*`Ef]\u0002>ݯ՘rM\u0014:Θ\u0007ŭO\u0016_~\u0012~MS_\u0013]\u001fL\ty7&\u0007ɋj)VZ.N\u001dCpGy}KvU3Ձګ(\u000ew\b8>u\u001e2cݚ߉\u0002}kRĊo_7&!|\u00121{&\u00059h\u001b~E3\r\u001a\\\u0011ϼfkB\tawBq/rӁk^󑑢Z\u0003\u000b,f;&\u0016\u001aذG]\u0003l/2w6l\u0012%B덇΂<ReM\u001aM历ܩ]IV\u0015y\u0006\u001e]2jxUO-pfԈt͖3\u0013m~\u0011\u001a$K\u0019\u000bGK]Y#(#ad'j\bWm1\u0017\n\u001a$P)v\u0006s-G9I\u0005ËN\u00172\u0006d𘁰]\u0017-և\u0019ln?u\u001fpp\u0014\u0015\u0018\r\u0000\u0018\u0015N\u00192cC7c׋P^a'\u001e9˟\u0012\"+\u0014Pd\u0011\u001d;\u0007q%)\u0012l0\t;\nU>ݎ\u001bE7gzT<8_\u000f(G(m\u0014{V\t=T($!\u0002O\u001ahW Ϫ\u001a-~6\u0014\u001a2\nD\u0012\u0005Ϊ\u0012\b:8\u0011g3\u001bQ4%ė\u0013s:\b)S\u001a\u0012\r\u0006V~[V\u0010E5>{*\u0015:\\YHb\fB>*lvp@'}6\u0004H<%!6j\n\u0019hͪ+J\\*\b_\u0014;݁\u0012%\u0016\u0007S\u0011^[-oy}FG3\u001c\u000b9\u001aG\u0001oD@>~\u001fD4JK|NL@d=8|r+vdz\\YbעY̢V$iyGp5de`ڌvw-#4\u0013\u001cf^;\r¢9AxlDBRr\u001c\u0004ӯب}(E=jbG\b_\u000f4L)\u001e)5Ԣ\b.d\fr̟\u0015N`|זK&HX\u000e$R@\u001eh\u00149j[$BurՁ֏(Qb\u0003\u0015jrS\u0002[%M\u0013t|n4qR8{`Z=BAQ$\bv(W\u001fpDq,6\u0006CS\b9\f\u0015{\u001cj*\u001aGYK$6|ݣGQ&bǫ/wsV3Km5_;Ӑ\u0003e\u0016U\u0017\\\u0007,%v<e-\"tHw8Q%\f20BS<W*Z\rmC-\u0006x\u0013\n{pݵ#J!\u001dG\u0013ٝ`\u001aI\u0019~THEypՈ\\\b*l\u001bh\u001fEM\u0018\bȠ\u0013XHFV;\u0010cK9^&uz\u001dFV\u0011\u0001\u0013Z)qP]*gMs\u001f\u0018\u0003x\u0018\u001em>)3@\u0014}GI*ˢ\tN\tŢ2\u001b/A\u0012@<C^#_4\u0012PL)\u0003%Lq1B=*BWMhB1\\\u0017^VtT~\u001bi2k 㤶\f\u0007\u0007*\u001fX\u0005wu])\t^7\u001b\u0019\u001fĳShć\u0017\u000bc\u0011\tu\b\b/4z\u001a0\u00069/VjT\u0012ƻ@#y\u0001 .$\u0014:z:V8\f/Ԑ\u0011B[(\u0005\u0012\u0003+@h[uB@&V\u001d3beĭ{XwC\u0002\u0011feN\u001fhVW\u0013\u0003Pgzf)g\"5C\u0019V\u001d}7KćQ^\u000b:ZmPwJpPWۓٲҰ>.ԩNFn\u0001O\u001f]06\f6\"VQ`A]A\u001eG\u0017B^?!i*΍\u0010N.\u0003wb3̥g\u0015\u001b; G޺V\u00146q\u0014yT\u0007lj\u001e9xhd̀(]\\\f086jnT)Àb\u0014\u0010nʏ\u0014IA\u0014tϝ\u0013^\t:\u0002mh[B{ͱ\bỤSvޑ\u0017ItjJ\u0004`\u0010I$LP_\"2\u0005l\u001f-8\u0002[a\u0001܉y\\&]%f %\u001e>+\f)[ظ\u0019\u001bM\u001eoN%>\u0005Mk\u0010\n^'fէ_#H\u0005|LǘQ\u0005z6!Ky\u0018@*iBƐj1c6nRu0@~&Ȝ#\u0007?{Sz45?PlGzcg\u0014/<skC\u0014m^YF\u000146.:TQUXĄ\f ^yUC`66W]R+\u0001O\u0013S|֌\\wF\u0005k5C(qF+Mk\nӝ-r}|7\rU8A\u000b\u000bL5#P̳vT\\2)c=[\u001e_3s%\u0018^?\u0013\\۶ yg\u001fS9R7v|Jn{TSciuq|a\f*\u0000)Sلmk$\"e:\u0015o*[\u0015(qX)yQ\u001b\u0004\u001cE\u001dg+O0یU3p9,f\u0003b\u000fft\u000fIauh\u001dJ<fO\u0019k='\u000eqx\u0012sSSםV\\vÉsTB~\u000b]g^ίY[ Pl%0w0*B\u001a\\/NTQ\"z[rM5\u0001L\u0002DV\"j\t[Y\u0015\u00129露.%|0hkY]xEi{ax3\u0005|C$wuoIԓK\u001cn\u0006VA#,\u000eGDk߀\u0000Z)\u000e5IiJl\"lFN2z\u0010aă[\"P\u0001Zb&G\u001d\u001b{7S\u001c\u00015mHXpa\u0013pO\n z=*\n\u0015\u001d{Q\u00130+\u001f*N|9\u001b41%R\u0011ӌ謱E?0>\nuϦApzvj/=.r3,\u00138PB$Ȇ0\u000e\u0014^\u001dw!$>@/lA{t2\",\u0013p*/\u001c@\u0002EO+P\u0017nm>S\u0010|!<\u0002;t\u00139\u0004[Bgzi[OV\u0000H)\u0013x\u0013%xO\u0011\u0002TiIo(D\u0019=5)a\u0005QƦ\u0012HN\u0014&[+D!Y?\u000fe3'mg\u0011(\u0003S\u0012e\u0011{U䣧9K\u001ctsЂBk][\u0014\u001b|Pٚ\u000b\u0003`\u001b+D\u00119\u0019~\u0014*'J)E7{ܥJB~\u00109ܲSv[@\fpkV\u00057cxz6=u\u0001Jvǈ'W,\u001d%t+\u0017>R$U)^|YAax\u0016ҽZ`o\u0005/GZ\"eN;0dJ+\\A~$#\u000f\u0018%:'\u0010\n:ӟ\u0003*9˭\u001cO+ϻrGJ/\u001b2ҐaVW\u0006lgJKj9;\u001eDϮ4I$n&6 ehMx#XD;~\u0006\u001e\u001d\u0006H\u0015|E\u00132\\fs;!}*Ot&2\u001f\u001cq\u0014%ubm9[zJA\u0006\u0001\u0010qwt#\u000ee\u0006\u0006hw\u000e8(!\u0014\\L>nN[3\u0014@\u0015wQOt\u001ch\u00152D\u001e_qAգ\u001885/\u001d}b\u00004D|<\u001eЃ5Z)'\u0002,.q!!K\u000fx<S\u00183TEiE^1Di7=s\u0010ه\u0017\u0011\u0018\u0015ktʵJ4t08\u0001\b\n\f+9\u0014ri-%ڼK\fJ\u001cp\n\u0000An\u001b\u0007wO͔\u0015/D\u0000H\rFmjՁ\u0007lE\u0002865~\u0010:+g\u0011\u0001ƽ\u0017\u0015Ḏ\u0005f>!\u0017kJz՞\u0012wY\f-\u0017J4=7Y߀\u0015,K`j\n\u0011\u0019,dI[\u000b.Aht^)^!w3\u0018MAfG\u0017Va\u0018u\u001dq\u0016\u0013(*D}\u00051sBՉHIH\u000e׎p\u0005O\u001fDܶF\u0015\f=5p\u0002g}\t+Ƃ.\u000e\u0006\u0004/\u0002\u0019\u0003ms@٢4|\u001f\u001bi~ǡ\u0004\u0019! SCk\r\u001cU@X;g\u0001%oMb\"@`y\u0015AV:K3^@e?\u0006yxISj3Tp H\nB~#+3y\n4)\u0016A_\r\\&\u000b\t:e\u0011g\u0002^. \u0001kr*l5%'^\u000f^آ[W\u0003\u00026*'H`{x#:-\u0015?#IAO[>t\u0018G6g_]j%:o{'GJ\u001e\n#SOV1XeNzKU\u001fȄjP&BҙiԱ y\u0018,\u001a\"1߸\u001f\"\u0010Ȟ[͞6'a«\u0018F-\u0001\u0019\u0011\u0018\u0012+\f\u0001hҋr>wѩ\u0006ՑNnI\u0011\"_&ELI\b={3(rCye}\u0007~N/x\u00045\u001f\u0018vTLMhPF3R-\u0017p-\u001c\u0001*B582((c`mΘ\u000f~\u0006F\u0013\u0007m\u000ew<V\u0014\n@`3}\u000bm1\nd7'ޗ`2/R.ոq\u001f\t\u0005Ykg0I\u000b!4*Zd\u001f\u001aޣ\b;B>#Uu:h\u001bp\u000b$\u001b(\u0013ʫJ=\u0016\u0007L0}9`n\u000e[b\u0002@;\u001aiWKw#dRX`G\u0005/jkKU\fy=`-x\r\u001b@v\u001e\n\u0001|\u0011^FK_¯T\u001b-)U\fʑw;F3\u001fT֟s+e\bs$!!xL^W%=^ۑ{|bJ?04 q3i\u0001\u0005wV\u0019؛Cw|\u0003)ڈ`\u0019K4G\u001a|\u0004Di懲\u0012\r]}$L{\r\u0005\u001f,#\u000b>_A\u0012K?\n\bn\u0017u\u0016{qA}\b+\u001a]V]7IҮ<\r_\"ɿIfp\u001edYEFr\"|\u0005\u001cݩŐ`\u0000O(K($S݌!O\u000fθ\u001e\u0007i^>V3\u000fi\u000f,0e>$>\u0005\u0015C̓*a'm\\C\u001d\nb+n)\u0001\u0006?E*>rj6\u0006%肢tpHEhg\u0004=k-\t]<\f<#]\n\u001d\u0010Ԣ6\u000e$@\u001fwb&J@\u0011O˞­7\u000f\u001cxեk\u0012`&ClaL\u0015_\u0010_\n(\u0011I`\u0017CD4\u0000j\u0016\nv9鲣^\riD3خ#\u001b\u0015\u0017\u001c34jb$Jv]z G\u001b3<\u001f&ԙY3e\u001eD'@e#L=\u001dgT\"\u0015uEs[N\u0007ǐak:{\u0015`/7\u0010 I\u0003c2Y*\u000fKG}\u0001}S4<maOr\u0016h%Ex\\`hXW\u001d\u001f4豨\u000e5[Qդ$ɘ?)ڕ#ZXmZ\u000fKZ{>\u0010\u0014.eZ gi\u000e+5\nd]\u000fALyS'Wr5zXE\u0001x\n>>7a\\wg]ݦVBt\u0015WE\"/&Lǟ:W\u0001ֵG{\u000b3:%IMD*Z-6.>>\u001f6P\"$\u001cd,r\u001fVOЍ}[\u0004,.33T!b0\u0017\u0005\u000e)5-\u000b(\u001bt`Z8\\Ç\u0015\u0019A\u0002J(EuxĢWQ\u001dMJ:.z\u0000*QˠD\u0002\u0006*,bhr4*v\u001b\tR8wvɠ,Ɉj\u0003_VrǃsT\u0007Zq\u000ergi\u0015\t\u000bx(\u000bedp6LJ\u001f>C8Mo\u0016\u0011ԭvH+CJd\u0017ǴEt<g]eM\u001a՚gB\u001cf\u000e\t6zm\"\u0011\n1]t9\u001f\u0011ŐhTp\u0011S)\u0003u⁫H\u0017\u0006 T\u001a8\u001e]%ɨ+<\u000f C\u001cѪCx\u0003|_O!m5SAJA>LفXb>g\u00121r4֏}\u0015ĢX\u0013\u0011a\u0019|w잣\n䞶\u0019jR\u0003j\f`\u001cL['8JAi\u0015v=MX\u001d\f,\u0019؜\nft \u0001FqnS$ؙڻ\u001e:G$\u001f\u0000]HT\u0019\u0011CM_\u0001F4X%($R\n?N'TSdmE r6\u0001ۀ\u0015\u0001dAhE\u0005\u0006H\u001e\u000fJ~\u0007v✤CL_2\u0014\n\u0004,e(ę_6ABGucя諠<K\u0007YԲU\u0003g!Egq2Y\u0003\u0011)[(U-/V\tX\u0000mI_1M!|(dU\u0012\u00071\r5<#ZYazuSδ5U; N')ˮt,).\u0010\u0017\u0017L\r\u0017@B{&A\\!߽jW>:#(`sLy\u001e.m\u0003\u001dee-D0n\u0018(4\u001e-R\u0005&\u001fc]x\u0007\u0000\r\u0012ߩ_,\f\f/Cn\u001fr'e00J\u001dŊlq\u001cAtTϔQ֪El\u001dyPe;X\u0001E6ڱ\no̘\u0011Uz\u001d%}\f\u001c\u0012WZPpsFl\",\u001ft\tV֍[U\\9#\nXe\u0006m`B\u0000Gq0r\u0010\tԃ\u0000\u0003!PCw%~L7J-ݦ5}}\u001d(\u0000cp\u0018Ix\u0015]dԖ\u0004p&\r¡=k4X\"d)\\;\r)&\u001a;\u000b+*\u001c5n\b;=M\u001f=ZslR\n|\u000f\u0015H[P\u000e\u0016ǾL/8u'^Wט??g\tK\u0012[#@i-Q\f\u001faM\r\u001cޏ\u000fpW\u0015)\n\u0017$kx\u0004\n9\u0007yd{k3RRJى,\u0012Q8C4Π\u0016\nYѲJd\u0005*\u001eU[f.`N)z2\u0013\u0007]K\u0006v1|\\3M\u0011zv&7\\ӯ\u0002\u0016\u000fM\u0004<|Jvjjw6fcgc]YLzSX:`\u000e{>,\u0001-K|nߏ\u0016D[b\u0003E(t|+ߜIp_\u0002HE\u001c#j\u0013oS\u001a|\u0012:2\u0012ǤYpM'd$n.%\u0018*%uM_2c*ī\r-t\u0005ee%Ɩ{Dv\u0012w*0d9\u001fv\u0011>.\t'讞(SVBfX\u0000xϙcdR\\\u0017\u001euWmd+\u0007Eِt\u000f,\t4\fuP̘)4WEhe\u0019&Fl\u000b)\u001du@r:ǧs6\u0003\u0007fwiZK۴?-\u0003g\u0011+V6t\u0001p;\r\u0016yQe[\u001e\u001e1\u001f\f~N\u00061$3\\?F]!S\nfd[2\bP:t\u000fgZ\u0002k3&`hx뫍\f{M`V&\u001eL-.\u0007\nDcS0*\u0001[\u000f_n?O_/\u000f\u000f?_~/ޥox\u001f\u001doTJ8ߔ\noF\u001f\u0002j_`lW\"\u0015_\u001bO_/_\u0017MSwꗴ\u000ekR\u0003;LQTxf\u0001\b2\u0017\u001b͸bʇ߻\u0001Dc2\u0005\\T'\u0013\u00150lc\u0018ES6aALq=cZo\u0014隱!태\u0013\u0007\u0011\u00019X~^4\u0014Y*g\"QF QZ7J1R\u0007+$\u001cєT_a<]]\u0019'\u0005R2QK3F\f@d\u0001믉_\u000bok!^߫^t8U\b4\u0001,W)۱+3D?\u0002\t\u0016\u000e\u0000J&w*]\fRnLm\u001c\u0011EC\u001b\u001e)CSj+|zeGNr#\u0003joaY\u0012yRZ\u001brV\u0004T(+\u001dja\u0012\u0013\u001f>u<\u0016\u0016\u0014l:SN:*\b\u0019\u0004Y\\*e\u0011]蠥z篃R\u0000f4wT1ܪ\f>Zi؜Z\tm!*4\u000e4zQ\u0016bHiu˶[{>-\u0016\u0017\u0013SYMOzI<V68p\u000bg\u0014zV\u0011CMTR\u0005Ka&63\u001b̦W2KΕfp\u0002[j:J8\u0011l\bp\u001b\u000e_Q\u0003{\u001e#\u0015@l\u00047Hn\u0017J|`%$+3URXF! \fV\n]*Gr#6;\u001dI\u00127%ۨ\u000bk7vsaϏ^Fz\u001c{)$/W>΢\u0013#\\%ۄ\u0001\u00190U{Oέ-ód\u0014xdۭn4\u00104E'0bՉr1\u0006FrS?QVŀR\u001d\u00137v\r\u0016\f\u0012qT-ymK1 ;\u0005}_\u000f,\u0016\u0003\u0017P]]DEZ\u0012\u0017!\u0003u\u0016r?\u0005\u0006pTE|tʑ+\u0002ǌ<\u0019\u0015\u000f!,>\u0005/'\fߥ<J_&=\u00052Pm\u0010C\b!!#ܦo8޽y}\u0006\u0012媜Xȍz7\u00155o\u001a\u001a\u001f?\u0016KQl-ys5\u0004[\u000fSm5N<IL\fyV{Ic\\jZ\u0011؍,S\b*~U9nν3q\\v~o\u001fN_\u0013\u000fzvS癕rixK~AV3?+bO2)=#`Y1ŠvB @C\u0000k\re/!in6y\u0013K\r'\u0012zp\u0003#Q-ajtEP9UbB؊C2\u0015꼈D\u001a\",C\u001b\u000f\t#ײJ8X\u001c\u000f@yf.Uo+Lt\"x\u0014\u0013\u0000)g/\u0019;Xp#G\u0001)@x(VJ|\u0017jN\u0002\u0010W\u000f]:DkEX\u0002=e\bd\u0001\"\u0014\u001c-ˬ꒓KK RwG\"J雽\u0004<Us'\u0013\u000f?^\u0000Ali<4RaG]Eք\"\u0011!\u0003\u001a1\u00102P?jGx!\u0002ƨU{~E,\u0014\u001f1\u0015]=E>\b\u0001*g hP\"\u001fA\u0013\u0015x\u0019\\\u0013\u0010$\u0018%>b@\u0014st;n6_t\u0007\tDdU$Pa\u0003.B.\u0019>\u0005xHU0Tp4\u0015tf0P^Z/Α}\u0015\u000b#\u0016\u000f[\u0012\u0004\u0006B\u0005\u001e\u0012\u000f`ad\"a\u000f\u0004*\u0010\u001c\u0019W+p\u0002TVҐ\u0014#2⇘>ތfw.T;D.Ky8@\u001c\u00003!q&]IW|zw4V+37C\u0000uV(;f3\nBDn\u0013ɧ\u0019]lb&4@۴/K%J\u0001Z)REa6@\" w\u001a$ϏBt*\fn_\u0014Cۥ?16W/TIX]5jsF\u001cAp\u0000\u0006\"\u0002rL摩\u0005{O\u0003\u001a\u0000^#.U\u000fV&EC[5C\u0013#>dG!jBw-R{yjUdnSr\u0019x\\dMaȢh?\u0002RV,|liV\u000flm\u001e߽\u001a?EҺ\u0014X)\u0002Ճ`6R/~L+&.IaUlj\u001a 3W\u001fTW\u0011\u0014{\f\u0004ٮ\u0000Xv6u/00+wi}\u0005^Ƶp\u0019\u0013VTsNǨ\b\u0013\u001a\u0018\u0019y)UDVn@\u00005l\"\u0001BS*D\u000bQ\u001fWhyGJC\u0013\u0013xً*\u0016\tY\u0002\r_DtKBGPcA⎪,mgrAgqw\u001cQ\u0004:WoU/$\b\f\u000eoخR\u0002K8y \u000bY\u0018-.\u001dKk-\u0004\u0004\b5߼f\u0011PY\fȶ\u0012A)G\fE\u0019L\u0016\u0013H*\"Ē\u0019m \u0007v'IH1COwK R\u0011Niwǈq\u0016Ծ \u0006AD8-J\u0015V<-O\u0014\u0001)\u0011K=\u0013\\\u0014\n\f('aqW\u001f\b \u001a\u0012d2ngg\u0012Jw)4q7DrPYNHl\u0006U4~.އ\u0001G3681L\u0003L,{\u001f\n*uo\u001e>\u0000\u0019Pl\u000f\u0011_K\u0017Ҷы4A5\u0014DK\u000f7\u0011z\u001c\u00187}@\u0002|\"0\nF똛0˵C?\u0003򂔋Ƽ`O\u0002\u001a5#\bRU\u000br,EuC\u0013J4gE\n_`\r[\u0010\u0011Ǆ\u0001ѫ>\f:\u0004@\b\u0000hnx^A\u0010ly\u0012?$={I9\u0012<_Y>@/`(@\u0007\u0012'\u001f\n{].t9zI\u0016\u0010A}mYP_>`d\"Ɋ\u0017\u001b4\u0019J)lΑ{>\u000b}\u001cwA٠+$o!-b\u0019\u0019E~YCT\u001cK\u0012߃E\u0001\u0011`1꾤Y.Cn\f\u0015^\u0002Gs!wHpF\u001f\u00016t\u0005?H}h\r\nendstream\rendobj\r258 0 obj\r<</Length 65536>>stream\r\n]5+!TQf\u000f\tbZ)~TO\u000b\u0006bj5a\u0010EB1όn\u0002\u0005@ѭbjŵݤiBWY\u0001\u0005&1.\n$\u001fPe@)U\u001f+\u0003'\fH+W\u0019\"\u000e\u0013y'^\u0010ԁ!9\u0002BdGLVXT\u0002\u001dyQ;\u001dQâG\u001f\u0011Ԕ&Wڈ[]C2n\u001eK,JV\u0012ع%F\n*\u0000by\u0015\u000eaM#\"5*R\u0011\u001bC\u001e\u0003ﲢ=D\u0000~h\u0017Y+('^\u0002a.\u0019#4жc+Px\u0003U\u000fd1r\u001d\u000b\u001cM\u001b\u0010/Qm?E}\u0016\u001fpҎQ\u00124\u0011~7^®<B)b\u0019^\u0006;\u0017T\u0001Q\u0006\u0018w37@WSݻ\u0017l7=\u0017F\\u\u0001\u001b\\-o<r\u0000w6\u001ccV\u0011~!H\u001c=KP {,\u001b\u0018慆)\u0000&]\u000e5cZG\u0001\u0017\u0019\u00050\"\u0003(3\u0005[t6bؕA?2\u0010\u0011\r,CtỰ\bu^DL3F::SwҦ3\u0014ז|\u0010Mem\"j\u0019g԰zpoz\u001d,\r0UvI@:\b\u0007B#͟\u001e-3\neW\u001eb̢\u0012k=?\"\u0010fE\u000f@AF\t#P64s4\u0013\tvB\u001fs~s\u000eN\u0010KW\u000e)qk*۰Af\u0016\"dNyHMeC<VF\u00197؂\u001d!TRc\u0015U\u0019]\u000e01u{.Lkz(PEtfͳS<*\u0012ho+v(صfGaKp;uOD$\u0010\u0016\tp91k~@,^Hf+NB{G\u0002]U+\u0006kh*\u0006kD\u0015\u0007;t\u001d\u000bG%\u0018٭F\u0019)b?\u000f& zb\u0012U(Eҷ\u0017\u0002w>'όp\u0010}JnUA78\u001b2vŗg<۪0\n?\u0002~d&\u001am`DJm\u001eݷS7?\u001bXp<\u0012XJI鹳gLl82҅@]ǯY\u0007X9ϦĚU\u0017\u000f\u000bZnԃJ\u0011a\u0016҇\u0019[9*։ovU@v\u0003y\u0006\u0003ĳ\u0011z,\u0018}\u0015\u000e\u0003\u0019g\\stF\u0006AU]\u0018Px%0\b@#\u000ehU2=cp'a\u0004AI_fF\ng\f%o&\u0014z~׺r\u0002ePR\u0014QGfB[!L\u0007f\u0017qA4\t;\u0016RM-ܖp(GD\u0005qJlqfՒAi۬bc0ZoIe2\"\fp1x 4V#-K>\u0015S\"p\u0001\u0005|d\u0013\bbІh\r\u0007\u0002\u00193jM\u001bCb.\b3\u0012\u001d.<JÊ%qT_\u001e\u00191^K\"\u0006N̠\u001f􆤢SVE&g\u0007+U8\u0011\u0007<B1̌seG5\u0003\u001eJhE\u0002\u001dԯW]\u0013C\"td\u001eꔳS\u001a\u0001\u001du&'/ȭD+J\"\u001bKd\u0006֋SW%чF;j\u0004T\u0015Vx0Ig۔?\u0018\u0019yiph\u0012U;\u0000^\u001c <ď\u0016˾%\u0016_)\u0011?\u000b\u001eR\u001f?P=k-\u0016)S.\u000ed_l\fLDeLėޣ%(FQIZYq}d\u001fY\n%m$\u0006g\u0014\u0018icCbP`,@G\u0014[~v\tKCK}GU?bc+_\u001eL\u001e\u0015̻[bͳ|\nP]V\rOŪ=YBul}\r(_ڔF$\u001b{z3Y=E5}?\"Gz<M\\V)\t^p̆]\u0007]]|>z\u000f\u0013XG9jV\u0003-y\u0010szSd6\b,\u001dHvͨ\b4,|ܽ&qd\\aa(I7\t\u0015 ӱ\\q3\u001eR\u001aT!;$y;}\nX*;ퟣ'r,\u0016IR>ʲ(\u0019v\u0004Wq\u0005=JW\u001fW\u001e\b]\re,Avq\fC<&>y7.e:-\u0011$Lv]ۗ\u00029\u001d#ĦG*W1\u001aw\u0004\u0015H !1{!0t6@^ǋ\u001532B!\u001d\t]\"G\u00191r\u0003Gq&_rms𪵌*u\u001a\"&wv88Έp\fSL69O9ҩ+Rڞ32V\f\u000b#?vlX 2cY\u0018uP\n' J\u000f\f?~t\u001cyBU76\u0005\f\u0019$$V\u0010L\u00167Zvl\u0006M+7ZQ<D~z:6\u0010\u0012 \u0004U2\u0014_$;]:|*3.D{?6fl:y9\nz\u0005o4e0\u0004Q[o\u0005Єu\u0016\u0005w\fL^\u0011ꪥ\u0015\u001cH+\u0018\u000e(J1\u0005H>66icWxfG]-Z!˥\u0007aڝlG\u0001l|\\t\u001dT\u0005}nq'H7*P|Fʏ\u0011T~i^m-Jpes9Ҧ\u0003\"5\u0018;\u001fa\"\u001e:r\u001a\u00040SS1A\u0003G_u\u001ea \u001a]ecQs`T\u0014V,n]SVgqE(ڊ$\u0003=T].\u000b]5ͱ'/Y<6\u001f1\u001f\u0015m\u0005$[=]6hl\\Z^=ߕX&޲\u0015'LGB\u0004S\u001fof|g\u001a\u0015L?`\u000e=sz08\u0002MJ\u0004SoJկգ֮N^\u001d\u001dq8R\u000b!Ab\u001dj\\i\u0002\u001d#\u001b\u0016Oc&\u0016\u0006]-ju\u0015\u0004\u0007l$]v6d\bK\"Kw\f\u0016\u001fYU^E>^IywZ\u00022\"JSScΐ\u00163Өs~xz6\\ŒF0R\u0003<\u001d\u0014E\u0012 ;-\u0003p\u000b0&U9HLwB\u0005I88)\tȍ(Ӿ\u0019Qe\"\nj<\u0005+xW\u00130!d\u0004\u001frTΩT\u001c\"F\u0004H\u0019\u001aq~w\r\u0003UK\u00027\u0006mشr|d8\u0013O*Lq/iD|EF\u0001\t\rE\u001f!\\=\f!1\"}\u000f\n]}`H(\u0019R[\u0006z|\u001dVf32\u000b\u0018]\u001a$h\u0014\u001b;X\u0012W?\u0010qcvL⋘\t\u001f1IzP\u001eNDJ\u0006FÄ?\u0004&Dk\u0004Xb=!. +\\\r|*W90F\b\u0011\u000bh#,\n+Ql\f'h[GC\b\u001b\u0003&\u0017E.zS\u0000\u001a]\u0018;(\fr\u0000\u001b~\u0018ȠS\u0005)\u0012u\u0001KϧQƦ\u0019\u000e؏qȯQ\\!=Lg\u0015)\r%I\u0000ǝ\u0010!0\u0017\rsc\"r\u001b\u0004e\u0011!c1cXN\u0019m\tVLy#\u0005@}=\u0015\ngG_,WE^w\u0017\u0011Pny_s\\D\u0003\u0010Ĕy?`IBoh3ywR\u001co7\u000eQc\rj[C\u0016L\u0007rۆ0;\u0002fIp\u0019O\u0001w\n86x;?31?VAwmt\u0005 J2Zz\u0019]瀖\u0006\bЕPeD*{e\u000e\u001c@y`,`\u001bF\u0012=^c=<Q6ET.yϻ͡\u0016\u001e\u0000)g{X\u001e1\u0015|\u0003\u0003\u0010u_9SU^_B\u0015\u0019\f\u0004w2n`\u001d$\u0017o#\u0012]*Icv<,d\u0000&a\u000e蘁S$8lvFa%G0xmxP*\\ur/m~\u0019\u0017Z\u0018=:R\u0006ٟ\u0005r\u0011R\tщ7¼\u0012\u0002]/\b\u0006 |ELm%<Vr\u0016:UE~\u0014\u0010ס+rX뎉in,Q\"vI.\u0015grZA\u0014$\u0001!.i!M5\u0005ےLRr{'u\u0001<b)O\u0013rW\u0014\r&\u0000o\u0006Ls\u0012\u001al\f*\fB\u0010I&\f\u001d;\n\u0017~\u0007u\u0000\u000e\"\u0000Tuk\u0001\u0019\t\u0011\u00048naE \f:5-ZO\u0018\u0013lP.\u0012qЏR؏CM\u0019*LEc\u001aVe-VN(r\f561P@Ni;\u001f\fyEP\u0010b\u0000}\u00155y_\"6 =\u0017F'\u0015\u0006 \tr\u00064|whuMI}\u0013\\jE*\u000f\u0015r\u0012)*\u001d\u0010>«&=k,VA6\tC\u0017-c3x3x c_G\u0002\u0003\n2Ug|Pgor1bIQ۔(\u000e&)\n\u0014\t(/_q^~\u0015e2J-μgTKVP\u0002W\u00129װ\bd\u000f7\tLw>,ǊzML@-\u0011\u0007}BUX\u001e\u0003#n)DSʑE^IIR?\u0019|*䋗PӒ=\u001a\u0016Q\r/RD|ǋGi\u0019\u001c9 ~}}\u001b\u0006b\u00117'D%LV \u0015o0gI\u0019>wo6]wnSHa\"_\u0010>8v\fv\u001biX\u000e\u0000^_\u000bD3Dt55-\u000ewr@tj^ێ\u0002\u0012mA\u0015u\r)\u0003<\u000b+%\u000bd\fQ\u0013\u0004];RNkEX] 3&\u0004KR͇/{?d\u000b\u0004V\u001f\u0005!\f b\u0003T|E\n\u0011+pDBP.oB! =|vb̏hw\u0012\nȢo\b\u001f*\u0006f\u0017\u0001PUU;ѽ>w_\u0001\n\u001c!<O@pO;UpCZ:oI{QP@0\nNT\u0013\u001e\u0017HBA|\u0005=\u0002I4,XWT\u0017{Ỳوt\"Wڔ\u0014I[q{QʁRr\fC┪DnPDF\u0010'X]β:y<B3a\\i7\u0012\u0005,.\\|\u0012~g129-^k?u:)\u0000Ъ@qWgt\u0001xmu3&PȨf\u0016\u000eT)綢HfD7@9^`P\u000fn]ݙ}3\u0006La:Z\u001fd\u0001\u0007pC/J|/=\u0002MɆ@) \u000f}E\u0019mS&W)\f\u000e\b\u0000@<t\u0000]N3i,\bu\u001dr\u0011<:\u0003$@+ȏ\r\u001f%^֦\u0006lz!c3HtzhWom\u0000\u0017\b'fQ\u000fi@*g\r):|af\u0015r kKj,\u0010n=|r\u0004VbN\u001b)C\fDv?;uyL-\r\u000eޅ*/y\u000e2]\u0007_Kf\tӹP\u0018֧\u0013\u0012G^\u001d\u0012CL\u0018XH28|,47m\u001e*NX-le\n^٭ׁ\u0001u\t\u001bJa4.\u001ezlTAkl\n23\r\u0014\u001fSC\u0015W̹\u0017fT\u001e^\u0018\u0015ba\u0016;6@\u0004>\u0006< U\u0014\u0006F%0$k~h2\u0001?2'Xe\u001dqI\u000f\u001cEyj^cA\u0001,!PI\u0013\b\nUv_U\u0015V\u0002r\u001db5T5dϺD:\u001dk+\u000ekX\ra+~j\u0005\u0001\u00020\u0002bO\u0002\u0015oy'(a\u0002D:2\u0019Nnq\u0000}R2'$愦m-HAf[T=ީ\u000fv-gx\u0005\u0010Tn\"\u00072<.Ob\u001c\u001cCAgqʂ\u000b^\u0014\u000b{?98N<Q\u0002c\u0012p:1UG13+w:NQꮠH\u0002љ(wMŜJ15ƞ3ݪ\u0017YV8\bk\u001fex>Q|\u0012\u001c\u0005\u0002\u0019s|4\u001fFLQ&vPu\u0014ںhs|tEmfohs\u0015u\u0002ߏ_Gy旰n\tN\u0004o[M\u001bN7mKı9cZ:\u000f\u0002~UV[\u0005k$m0{s`P},WܜgL=0\u0014Dc\u00133\u0018JI6q]%U\u0015oDN}Yn\n\u001c\u000e˷d\u0016\u0018x\u0006p\u001dVK94TY`w-\u00170\tɋ\fl\t+#\\,\u0000*Fԕ\u0019sn%|\\\nqa\u001c\u001aبb\u0016GU\u0012lC0`\u001c\u0014\u001eKKrV\f\u0015\u0012D\u0002ǡ3\u0001Vet\b;8O7KɊ\u0005\u0015\u0006wW\nh\u0015f軂k0\u0006uޱK\u000f5-\u001d\u0006r&HАIG36_s~нb9#'\u0011}3\t?\u001eay\u0014\u001a?Nndz6\n?+׮FUS\u0002ZzV\ni.;^\u0005#ֲ\u0018[CL5c&K.\f?9{2QqN8\u000f\bpQ\u0000)p5iS=`ȱ:WľSb\u0000=J\nC|.#,sxn8>sw\u001d78v\u0015:W\u0011!\u00020ٴ BUTE\"\fn)솔VmfJB\nJ\f?ۆwԲu\u001c; $]d;a??f\u0019\"(\u0011՝P/\u0007U:\u0001\u000fӇX\"\u000b<PpT^\u001b\u0007\u0016,#~׺]\u0015E]`K\u001aA *s>4q.1\u0001֤-~ܑ^aU6\u00117F>!K\t׸\t\u0015˿\u0017<\ne\f)lf{fM\u001ep\brF\t\f|Ϊ\u001bkϩhSBgI|z3Gҭt![HS2n\u0015(tV\u001b\tn{ӥ5܆J_\u001aO=\u0002\u0017\u0015O\u00017\u001fHNuZqmzDN\u001d݅2e$dkN\u000bMp0hnc?m5Wa\u0004;uh7\u00070}FfZPeo\u0004:{=P\tmf\u000b\u0005\u0011G1j`\u0018*ʪ.,\u0012͏|ŴJ{\u0018sJ\u0005wh2//\u001a\u0017l~XQlt/J3w׮kBa\u000ft\u0004պb\u001cX\u0019\u0001\u000f>S\u0011>#$**!cӋq\u001eB}^1\u001b_>P򖞱>/vVx2 \u0007~nwnAC|)QҜꊫh+m%fCH7\u001dE+vsG$?Ⱥ\u001cҦq[bc[\u000f\\p+Azk\bJg#OERU\u00137b?,)ȐJ<x\u0004ZBFj\rz5\"4ir?R~?%DCh0:?7+>]\u001aP-Ē\"߶Fv,x\u001b#|K\u0010'.\"B\u0018Lْqr\u0019)ݶC9{C\u0001@R$]zF\u0006A3\u0017L*\u0014\u0011\u00140\rxtH\u0001э4z㪚+@{F _e4/(w2\u001d\u0007+Y\u001f\u001fS\u00065\u0005QKWB^q+8aˏf3t7'\u0002\b0#2!+ݣ1f\u0004?0\u0010Zy;HXB<\u001e\u000eآF\u0013$0ی:zy5=Fr.\u00178\u0005#\u001cQ\bUt.0b\u0010|\u0019\f\u001cabpr8#\b4%#c;GnUܻGӐDo\u001c:b\u0012~OĖ;\u0014OTƃe,\u0012p\u0002?\u0017NqfF&yg.Y\u001c$$\tCrŒ^\u0002\"\t\u0005_$Q\u0001bu.\u0000YĪ\u0019\riH%+{B\u001e\u001dcDA׏vX_+&$_b}U\f=w&[\f-\u0015e\u001a\u0007gqy˘\rg\u001dS6q9aHboC\u000f\u0015\u000eU+WӚ簕UA\u0000\u0014 \t%$Ǥ[Y=+i&푿@]3Q=\u001f\u0014\u0016.U\u0004\b\u0001\u000bh3,7\u0003\u001duYd:~SiB\u001a\u0014|ٕT\u0017\u0010KZ\u00118Jo^Į\u0007\u0015$\u0002\u0018]eduqF\u000f2`\u001f\u0013%\f۝}\u0013:20MO[@e$\u0006Z\u0014Z)\u001aN\nh8\u0007/\u000f{[\u000bY\u0011\u0018=\u0018M|b\u001c*|7\u001cO{bD,ń[lb$\u0001љ>S\u0000)TF84S\u0014\u0003\u0011U\u0001\u001c\u001esd\u00019)a/ Qvu\u0002VEy!\u0005̣V\u0014o=\u001e4\u001eɰBA%cZ)(\f~8剜h\u000e\u001b2᫢\u000exu\u0007\t\u0016k\u000b>\"ڙ¦\u0003\u0016Ƽ_\u0017gmXтlr+&$]\u000efOTu\tx\u0005͉r%)xL`\u0011O\u0014tXO\u001b'I\f\u0017=Y\u000ft\u0010a\u001e\u001aLS__0A&RnCǣ\u0019\u0019[,u\u0006J\u0011)V75F\u001b^Z\r\u000fi\rm\u0017EuRI\u0004\u0017\u001e}\u001d7ۂ=$G%'}p\u0000wI~+P :b\u0010P>1%\u0014A^_o0b͉#^2l\b]be\u000flT+\u000f\u0001unFuO:ѕշ+\u001f#}#uҖyeu%n\r_\u001b\u0019@7PL3\u0005\u001f%:\\WFI\b*ʞK@믗¯#pfkypüz[\u0018 xj0)3@\fK=\u0017&v\u0001NWz$>(jOo\u0015u?H|\u001e\u0013\\[>gԖ$֪)㄄3vn,E\"Y!9\u0002MJcc+d\u0019L^\u0003gq7fGCMq\u001fZdT\u0003\u001e4n\u0012VޤD\fȺ\\c$fl\u0019׋Tj{f݉RN\u000b-1ʷZУ[\u000eX4>\u0002b\u0007.{\u0000.6=7ۈq\u0019}>o'$5+GᆦAk\",T\u0015T\u0002\n6+;GC\u0006pcQ(Pie\u0014`x\u0014Zh7nizG=Tw0lx~)X9MDW\u0006/eJLKUk]\u000bU\u001b\tQ(\u0016C7/;E,/\u001bb0N\u0018L\u001ef\b\u0002Uw\u0005>ȈkR\"D;JR=!+;JB.f.7RSvm0b\u001c~(s\u0014k\u00139JÎ/(K\u001cFL\u0000\u00195&)\u0003+4;ߣ\u0016J\u0005Oy᝟\u0014A\u001cr,\u0002h~Ď\t\u0010%\\\u0007P\u00110T9$4htsc(]\b#&ǳ>w*%C\u0019$I\bΐ96XKRD#;\u0019\u0007Ϻ KR\u001ac\u0012 \u00119VNH\u0016\f4ӣ\rB\u001e\u000b\u0011Ty/\u0014h\u001d?E?HoĔ]}\u0010\tq?\u001ad&|'!:DXYnΎ'_uߞ/E\u0019lƇ﫦\u0017\u001a[^C\fn\u001bw'\u0003ɺ\u0007\u001f\u0019j@ҽJ\u001dng\u0012E\u001eU:TϊD:|\u0013gڣ4V՛\u0011\u0016\u0015\nX<\u0006@ܚH!\\[pQUG7^Y\u0015\u0004<?`R|\u0011zm/'`,E}I\u0010X;g;\"kغ\u0002*T\u0001\u0002\u0001\u001c}t\u0007orU\u00164\u0001\u0001 |2Ut\u001e0$cgAS,H\u001bo\u0017/1?;'\u000b\u0011\u0012@kh@\u000bl1냜LG0\u001e*K\u0016<5Rb#\u0003\f?\u0010>3,J;z\u0005<%Kt\u00199ݳck\u0016\\E󓘼\u0012\u0006Tp׼Ԧ\u001a`V*xmiVD7:dK\bN\u0005ͫy\u0015 k9b\u001a\u0001&\u0016Cpg5j?fa-Y~(\u001b[N-\u00161-zJȻ\"h,#JLtD\u000b(ftVp\u001b=L૗8V3=;_^?Zʩ\u0004\u0013\u0007xQi\u0014N\u0012%vT>\u0013xPMT7_T`J\u001e\fU=\u0019|9)\u0000Pm~ɵK\u001eni\n4\t8E1\u001d#,ԋ\u0000[ĪhZ\u0001\r14P\u000eJ{zɿ\u00013PQ\u0017\u0011\u0005C\u001f\u00165Q\u0002ب#ڭ\u0015}@(J7\u0004$GP\u0011hT\u0015PE\u00194\u0006^]y)5>b;Tf*7\\]\u001f\nR|\u000ba/*6@\u0015x\"}\u0016Y\u000bT\u001a\u0006m\r\u001du3<K?G/\u0018\u0002B\u0018f\u001fPgzIai!0\u0016\nT[9\u00188Pa-+~F,cU,}Ҟ*\"0X\u00075G\u0001¦:4\u0010<~$\u0014\u0005xd)\u000f\u0014pD*ơfkn\u0011\u0002rNu\u0000SH\u0000\u001ft_\u001d\u0019(\u0003oǖ5\u0003W:\u0006_y\u0010)\u0012G&]H#J?PV\u0016ךk߷C\u000f\\(}W\u000b2\u0004\f&!.So19Tm7L\u0013\u001b0դ9_%.=%0\u0004@\u001bP!\u001d4paY\u001a,ӿw\u0019\u0003\u0011BjX\u000bZ\u0018рA\u00137\u000fNqL')\u0011>9K\u0011H?Hq+\n\u0001!Hbd7*̉+䖿w&ssO|\t)\u0014\u0015CNun/F\u0015l:l\u001dZ~\u0012\u000f1(g3H &5P}E\\сK\u0019~Fܯ0殀\u001aqTT}?Q5G;0\u000b\u0007\u0013#\u001b\u0012hR-u\u0019\u001d85ç#EKIxWg\u001d`\u0010ȼc*&1\u0013\r^66i\u0003R\u00113J\u000er8>\u0001\f\fsea\bweS\u0004L\u0015^myI.Q7u\rY\n+6֙\u001br-{Xb=\t\u000em0\u001bz\u001adO;A-\u000725<\u00139\u0013P\u0012lK;QTԪB\u0005C}\\a\u001c|*\\<[\u0012$Ytf\b6N3kq?zo\u0010 VͲ\u0017bma]8\fV\u001dEÉ2Ks}\u0004D\u0007|*vy2]䶴3e4.9/2\t*a+*wI s:dHE\u0003ANrCe~\u0005.)5+&]H՜Aq];\u001eG\t\u001d#\u0000L\f3|Kz+w.{\t\fX4-Ŀ\u000e\u0001!SY\u001c\n^]`\u0001U\u0001ҔQ\ni>J@.Njຬx۷W\\9Fj?\u000fkAO\u0015\u0010M5\u0011>cT~1@eqz\u0014.}f\t\u0011;X>\u001bf%c:LF#\n\t\u0002u\\*\u0005H+ء\u001d\u0019Ӷy\u0006-\u0003rоoX\u0018phtuV\u0015οHC̾.\u0005\u000fi|VOֱ+cu\u000e\u0016pW~5QgN3Y2֣CB\u001b\u0002ᥨ\u001f\u00198a0ofDJlA!E\u001b\u0001\u001e~)K$99(\"ll\f@ַ\u0012y\u001eH\u0005\u000f\u0010M\u001a\u0003O\u00194(F\u0012guA=ѱL;Ndӭ樆Яg,|$ib_mQ\u001cI_t[\u0004?w)\u0010gjE\u000f\bjڐUDBRf`B\u0017/\u0012'<\u0011uҹU5JYtbrr y\fb\rЈcfZ\fܰ3Ԯ\f|\t\u00169õ\u001cY\u0015P$\u0017C\u0003(βj\u0012\"r\u0003\u0002gώYw*\u0010\t\u001d\u001dWc@\u0004>%\u000b\u0003·u\"U\u0007N\u0006\u0015W?$2w\u0002\t\u001a/1Yx\u0002J7\ftG6p;4CUR<:1ĂY\\ENEٻlOb%J]ְ5\u001d֨61VX,\u0010_L-B\u0001ԿPam|&ScCҁ\u000ef-\u0007D\b2LG>ɧaf7\u0007ưER\u001cѹp5Yw\u001e\u0003$\u0013\f\u0006&̎,\u0003Q\fC\u0002sw>{\u0005Jd4*/q<rj?\u0002\u0001A8bu\u001f));nrB\u0019pꀼY\u0010-0\u0002}t!5HgZu*WQ9c\u0001cו7\u0012ʀTN\u0003^o}\u0006D\u000bo?v\u0007\u001a\u0006}\"{\u000b%zg6y}\u0014\u0001.VngD/~8m|n\u001a/T\\o\u001e Uޯ{\u001d$\u0019?Fԛ6r,d\u0002,\u001d&}^⌽g\u000e5se$\u0003a\u0004[h\u0017|\u001cFBsF_K\u0010ZYQ\fb$vw>FJN\f&\n*}EPQ\u0014\u0014\u0002 ʥI{\fQgB\u0006\u0019tU\u0005Y\u001c^\u001f1U`\u0010;ot>B\u0013Y+:sU\u001a\\\u0019\u001b^%w3\u0003G\r\u001a 9P\f\u0015𯿝\u0019αr\u0015-GJbD$(\\DP\u001cy\u0013?j\u0014[\u0007@H\u0001/Ób r9{Ȳ99-\u001a`\u0007JWȱX&SOOY|\bg4,]j\u0019\u0007먛=j:d?*?+/i@o\tIB!U^\u001bjT:Ix(.).8*ؕ\r\u0015\u0014j02@мyo,9ٻLE*ȎY\u001bʔ\u000e}%VE`\u0000p\f0@l(1\u0006Ɓԑ30Pv h\u0004~\f=ȋ\u0014XSF\u001buz\u000fIS\rC)eR\u001d\u001a|s\u0015<?e\u0000=A\u0007F\u001cU<z:3/9>e\u001e}G[YVA\bu޹\u000bEV\u000fd1)0?7\u001ejg_2&T\u0005,X\\/zD\u00125BK\u0001٥ޜ~4Wp+tWҬHI\u0011*q\fB\u0013\u001ay썌싓tkZoQ<\u0007Liǚ|w\f\u0003倿\u0012\u000eEԿV\"9\f9\u0017c\u000bzYϭ|imXη`\u001eѼg@մ\b_>W@ݚ<\b:#c\u0015mvɯȧPu)׳ԭ]\u0011\u001f:\u0013R_1滊Fˢfnɿ\ny\b\\H\u0012\nux\u0010};I\u0006\bo\u0018AFy\u001a\\%}3\u0012\u0010b.\f_[]ng\u000fm0z\u001d#BU3怸8/Cb^5uӢi\u00172H\u00160N%\f̐ʓʳ\u0013לag-e\u001d!di,kDnh֯ \u001e5Hp#;B\u0010?\u0000\u0007=gX\u001b\u0015~[5E*O\t1b9OJ]\u0016\r\u0005>\u0019Ek\u0006PZ 'HAm̒4%L!RM\u0001\u0005xn\u00050B\u0016\u001erU=Up\u0013Mpd\r\u0001:e\u0018N^#` 4C9B\u0000V\u0011Z\bh0@&~\u0005~;\u0005[m<\u0003`E^;\u0019s\u00042,8Q&\t2\u0003;{\u0002(\u0017]3.7aʂ\"/*u',g\f\u0011O\u0018/#a\u0002b \u0005~\u001d;Jh\u001aw\u001cpbb\u00022M\u000b\u0016\u000e2HȈ`M?;ʾ}U\u0003H~{lj0U\u0007w'2a\u0001Ue!\u00073#\u0012\u001dQ\u0000T\u0011jkhڲ=#\u0002=\u00119FN\u001d\u0001*EH'\u0012[\u0019\u0004i.\fHI\u0014ZwU\u0013S\u0018d8ɬU\u0003e\f`SZgD\tC?<OY&~Q<TBk+w硻z\u0005|r7y?s{aR~)\\\u000fy0bU/\u00165&\"\u0004MX0\u0001#12JY]\u0018\u0002\u000bH\u0005b`Ƒυ[\u0016-Mb\u0006%P9(?zG)\u0000: .6mb,bGLj\nazLeP\u001b(?\fC9%wd\u0005e;^M\n?>O_MzR6\u0006)\u0002\u0014-SՍ;?=\u001e4b%@S\u001a:*a\u0017J>\u0006C\u0015B~wt\u000bc\u0014V\u0006fT\u0001.\u001fpsVG\u0019O!Z\"n`\u000bϥ:EdsA:\u001cQ\tYEi\u001aa\u0015;豖K|)F\r@\f5JRL\u001cU\u0012C^N\r5寎\u0016b\u00023\u001a{\u001d\u0004吒Sz\u001es\u0005\u001cJ3h}tH<۵q Wf\u0006ԩCo~\u0005<ӯ3HҢ\b֥sDy\u001ewy:)Ж\u0004J\\&緷WsLɜAKu\u0019EC}e~\u0011b\u0010_P>#ϗ\b0\f0%\u0002jJQ|5^ݧ\u001fv\rDdԠ\u0004/yHGN[hbB%l2ÐXsc\f dFq&\u0014\u0017*V̸\u001f\u001ajoءhtX\ns.\u0019(\u0006=_\u0001ZܾY*k\u0004S\u0005P\u000ez7\t?נ\\3\u0006lbD\u0012?\u0012蔯\u000fGߎ'ȋ\u0014Ke.#\u0005\u001d`0Gw\u001fi \\\u0014ɛ\u0019y\u0006Ϯt(r&#ti]X+KC\u000b\u0005a\u0003Ns^:\u0017b\u001e[qƓlT3B?V\u0000/<s\u0002/\u0006G\u0011v#\u0002\u000bcf%\u001dA\u0001/Ӽ\u0000\u00119%U\u001b\fgзOH\u001e8?cSS9\u001du+.z:xm8/sda٭YΜ-E@QRG8k;ƃ\u001f=$\u00175p\u001f\u0014\u000e;\u001cQAbd$TV.,0,o(o{\u001f\u001c\u0005\"5X]w\u0017\u0001VĨ_W#4\n5TF{|ٯzJF\tL\u001cgtǀBH\u001e#\u0005.Bj\u0013fKU'\u00118y9\tAX\u001a)5\u001f\u001a58+Bg\u000fMZncD0ǡ:+ϵ?QKt^Bi%\u0004@-\u000eE_m49\"B\u0003\u0019=m\u0012٧VMi!?aVy\u0011\u0015kavš\u0006E59&=^K\u000e\u0019\u001b;6}ș;W\u0006g qzP^O5\n[%KkWFz9\t\u0019\u0000r4Z\u0018*^\\\r\u0015t\\-\"N\u000fLe\u001aby]?|\u0013\u0005\"F\u0002$\u00051Y0=V\u000ePP35\u001emy=O\u000eD\u00062z%|T>y}G82w\tĀ@h\r^7^M&(%d&}\u000eEČWrd΋lKI\u0019I;|\u0013i\\\u000e\u00005u)\u00186JAd\u001b\u0012W9ox?o}\u0010@a\u00179kCNsń\u001fɷ\u001a\u0018NݠnVWmJw~W(x:ϭߠݳD,?O|h}sLTmeLY(h0IIݕ'4?=A:/5+um\u0015OC]guc\u0010$Ƞ-,\t}\u0007+yG5\u001d\u0013ҵ\u000f|7\u0003\u0011b_ၡ]\u001a\u001anX\u000eF`dd\u001a)\u0000\u0006SALV~^Ϯ戔CoµBѴa/t{g\u0004;(^\u000e*.\u0011\u0013\u000b\u001b\"Gf\\qQ7#\u000f#C/RI>i>#2WAQPM87;9\b\u0004;O1GO6Y *h㋔:&c\u001flJ\u001d*\u0005h\u0012YXOANB?.j)f\u0015㐁\u000b&_Q\u0012qc\\;nZa\u00152\u0000y4\u001d8}\u0016Ez\u0006\"OCGt\u001bV?CR\"Ρu0֡FzӁ6|\u0011F=/D\u0006/ofU\\,\u0015۾F\u001a菺U~#e]oQk!gqGe\u001fVK1\u0013\u0016\u001ffʧ$\u0010~uR])\t1\u001fuq\u001bsa9~K\u0002|ϰgyb'y8魣^\u0019ۯ{?x\u0018*\u0010c\u0000 ~nQ_\"\u0019\u0006.@v%(,N8\f\u001d\u0000Z\u001e՝;\u0000`(S+\u0003vL4\u0017i9D;sR^\u0012%+IZ+\u000e\u0005$@&h\u0018H$iA\u0003Eno\u0015%\u0014\u0002{-\u0007UL)6o\u001f®/OKA5.;\u0018\\6^\u0012sX\"lSjX\u001d܈|T\u0010+ujx\u000b߇bk͞\u001aBڿG.\u0001#\u0019\u000bϜ\r\u001e03g\u000e\u0018a.\u0018CC|}ṣizٱmI\u0006x\u00150/-:j\u0004ƩvEyh\u0017%I۲8>/c2*0CkM\u001d\u0014an\u000ba*h\u0000W}n\tq:\u0005#=\u000f(\u001c[œ_b/[]I-\u001dumԶj\n1h1;!\u0013=G\r\u001auFx<HfqJ\u0016F]g\t*N\u0007yvY\u0000g)Tk\r8\u0001 וD&ϵ\u0013.xՕ\u0013\u001a|\ntLuO ~{W\u0018f\fR\u001c\b\b}\u0003,\u0016S\u001do/\u0011:9m[4*s~dc\u000b{\u0019\u0011#rE\u001ex;UO.D{\u0016h2R\u0016GwOo58:C,z\u001a\u0011\u0017m@BR<\u0006h4}o6o!?-\u0006\u0006p3=u\u0017b\u0014y#\r \u0012Wp/\u0001\u0005=\u0000傄#m9/*g <\b`^%Q-\r\u0015z^$>2FeiClq͌*r:L3lV\u0017\u0019֬׸\u0018\u0017|G[!\u0014]ʰnvЫ~CG+A5<jiH60<b*|\u0004KeU\rZH7ٝnP-=CPף\u0010\u001a\u001b\u0016fAT+\u001eU_x\nޏ*\b!\u0010\u0007Q\u000f4> \u001fA@tVDpc)Ɩ/r\f=ڱ\u0018t2\u0019P11\u001fX{\rp}\\YT\u0010[\u000b\u001d00U[\u0013z\u001dn\u001a<qyqq\u001e{w\fP\r~oōZ[\u0016P.Oֿ\u001c\u001ba}\u000br\r\u0014\t&\u0017\u0015\u00140Ks\u001eu!Ug\u0014r\\+T\u000f(\u0001/>c<6,4x\u001b\u0007\u0011+^U 8s+\u0019N\u001c%\n}-f\u001c\u001ec\u0005&2(ǈ\u001d!*#-Djv\u0018\u0001S\t\u000f\u001an\u0005cj˰++,\nLeސ04)\u0016\u0001\u001dIo}P\u001c*_Nq\u0002Tlk\u0019)=\u0001\u0003:\u0003vA*C̃P%rೊ\u001f\u0015Ԇ\u000e\u0002\u000bЯ轠\t>\u0011Ic:k\u0004z(e\u0012\u00167eM@8\"2\u00152c\r\u0006AAe&\r ^_뾭72d}h5SF*b\u0004Iwv\u0018n!E+\u0019BF'\u0003*gh@\u0010i0'i`\rv:4 7B\u0005\u0004\u0001=\u001eU`Z2F\u0015\"2\u000f\b96\u0013$s\u0007M4i{\"\u0017+W̛ \u0017+Y4NH<\u0013\u001dZ:\u0012؇t2!7K\u0015y\u0017;G\u0002\u001chK?$ٍ\u000f\u0003\tV\u001fMkfj\u0005\\\\E<p\u0004VsD7!A\u0002CMݫ[\u0006\r{1\u0018zK\u0019\u001a\u001a\b[\"Kk%A,fe.~^\u000fB4Rj\"pg\u001d))Yf&L17\fw`=_g\u0018Mq\u0000`\u000eЬ@MDcC\u001dgB眮\u0015\u0010u#\u0011E\u0003~8U\u0011ѯ$!f\tBBܕ\fI\u000bw\u000b\u001e{ qB\u0007\u000b\u0011Nv(\u00020\u00126nl\u0010B}>o!?\u0003븵:W\u0004?R\u001fZ\u0013H8\u00179\u0016Q8\u001f\u001c\u000e\u0001-tg!`8@Ss\u0013e)\u0012-x\u0018\u001bhirk}WSS\r\u0011fGJ!\u001f7\u001e\u0005q]=K\u0015\u000eU3>K\n$Q$̌-]\u0018?w\u001c3;\u0015,|Q\u0013\u0007UӊqoVO\u00015C\u001e1\u0010N.ym\u00068St@B1?2P=U/.\u000emƵ%K\u0006H\u0005\f*8Fh֮\u0000ݮDu\r\u0015^Xv0o'%\u0012\t)Đ\\\u0014L)jUv[\u0001&o37y+Wbc:<Yk<\u0016\u0005Cnk4\u001fՊ_U\u0016\u001agcG\u001ejHݜ!3d^EGY\u0017:7|?e\u000fCYw>⸡sC*Y.)7+lS]~g\u0016\u0005|\u0016\u0015q\u0015zͽW$\u0017ޗ׭aAO\u001eC\u0002n\u0014Za Ϣ=,.JQ(Y\u001fWe6Դ\u001dbx+S\u0016S\u001f\u0015avvHm⮮\u001eΘ<]Cȝ>\u0011O\u0012xܛ^w^/%z\u0016+@QJk\u000fCIFVOkt\u0010:cLi2.\b#\u000fcp\bt0\u0014\u000fʎz|zԻ$\u0019\u0011\u0007K\u0016.\u000f\u000eob/?\u001c\u000eP;Ç?r\u0006S\u001dV\u001avܣXz^TQ7#oY\u0011F]vF\u0003\r\u000enx́YpOqD\u0000\u000e\\c 3lIfr]r]╒^Fj-?\u000egjj2w\u0016\u0018iy}\"O/\u0015Fp;\u000fdwk+4 \u0002\u0011{\fJcBB\u0012T9k\u0002xrg\u0015\u0018|4jň\u001d?l\u000bI_!m[R\u0010SF\rx\u0010;\u001dU}O!6bݑ%k\u000e\u0013%D\u0007e4?z*sF $oߟ\\\u0005C\u0001\u001bR$CX(L\r\u000foo\u000f9֙\u0010ͻԂ $3nXv%\u0006\"j嫊\u0007YFsm.'R-ߎ\n\u0014\u0017A\u0002jٮe\u001d<'\fW@\u0013\u0003~5F n\u00151u\u001fe\u0004\u0017/\u0015-{hYPjqEz\u0017Ub\u0001w>S%8_\u0007\\E2eԉ7\"E;\u001eqWa/-X\u001c\u0016\u00121-(κwEcK;DD\u0006Z0(z(?\u0011\u001c\u001e\nJ\u0004a{6Ezw3jv\u000bJ \u001b3_)(xKdN\u001aÏo-\ff[_ҫe\u001f]o6أGtgb\u0018p6OY\u0015GiA)3$M\u000fK{<\u0006\u0004U\u0002XwwIȲ-\t\u0018\u0005P*\u0014mv]\u0013.Y/[k\u001f$EfJ\u00052=\u0014p\u001a\f\u000f\u0007i!i<\u000b)(O5F1K\u001eݯ~)ӌM{o\b\\\u0011<\u0006\u001d7Ve;\u0012giT\nv%\bH\u0006pL9tl\u001dS^xH\tqzBP|\u0012\u0017HQ5aQx\u0017N\u0006C1!%)\u0011E\u0002N\u0004da\u0019\u0015ߦ\u00143As5\u000f7Xw*\u00194BgXG\u0004|+\u001a<%3\u001cW{\\\u0005l\u001fYE;3ySC%7\n#\u0015\u0015HNH]`(\u0005j8\u0016<}G\u001b>\nTrn\u0019\u000bH۾X/w.74C7i|D\t\u001d-Cט#&<W_g9\u001a1s1ڐS\u001c#.'\u0005T\u0017bD\u0003Gq%˄;ReIHUu<,t{\u0011/(\u001e5S\u00193&^da:􊤡:3r!mt}TG.\u0014e`.\"4?\u0011\u0015\u0015r5\u001fsd*S\u001dqgݘ\r8pqŴJ)ݺXM \u0007nRL*ʶLV4`7\u000e9#\u001ds1!,\u0001h\b[W\u0003C\u0002yk\u0014{\u0004tϙɰ1#\bmI!;U\u0001N/\u001e<>\ty\u0006\n٤?;m'2\u001crV\u0002+\u001b\u001by\u001d\u00152I&\u00173Y%a\u0013&\u0006\u0000QæY+HjxyҋJ\u0014[8f.C\u0010\u001c\u0011B'8ӕZ!֚4hqSv_j;~\u001b~H\u0017EE[E\f24:=]h[x(2?Q.XF워\u0000\u0019Xd\u0003wk\u0015elO}ɹ>_\fa\u0010<q=3G9Y߾zRRCm#\u00127q\u0013\u0004\u0013^a\u001f$u\r\tuVccXU\b\u0019\u00141$DF>=i'\ne20\u0015\u0015V\u0011k Yg>ؐ4ާ]\u0015\u0016]!\u0007$m\u0017ʿW,{K㽴hI\\J]l\bHsG\u0015n\u001a\rw\u0013\u0019\u001eEYgºU޳}(4qPW\u000fU%weċ?Lj޵C;K񙧅\u0001-&*}W-\u001djη(\u0013\u001fw\u0000{,E\u0019G1֬\tg\u0007Мmyz\u0005xsd\u001d\u0015ߴs\u0006\t$\u001az\u000fw;(\u0011umC_,б\u0015`ͅsK&\u001ee\u0014z\u000bUcn\u0015I\u0013(6͹l\u0010]MTY7t\u001bD\u0000Ⱦ\u0000\u001b^\u0001y-<;U\u0016C[D\u0004|Zό`@l^/\u001d\u0018UWd\u0007\u0018ϾT?\u0007v&\u000fk\r!Qkd'\u0012{`M\u001b\u000e%1#B\u0015\u0001g1&-}\u0019w\u000f|\u0006\u0018]o*ȥ$>?|ԓ<\u001aQ>>${?t>?j#?Aێud'T~:\u000b)ʣꔠV:\u0017oBz;p~O\u0014Sӱz\u0013]\u0005q\r(R v-\u0005\u0011;\u0001&.\nW1C\u000fqú_?\u0000Yg\u0001;F\u000f\u001a\u001e-\u0016.jˌV\r+8\f\u001c~Hy\\uŅ\u001fa$\u00196\u0000%qXQ\u001f\u000b\u001aJ-.' :\u001asK_]7{܁\u001a/|%Q\"Jq\u0019,IY݈\u0012gh/\u0018\u0014kLgi\t\u000ez\u0007LѼU1\u00060MYbvtO}(@aJ||g@\u0012ʨ\tk>$\u0010\u00058H߫;w\"\fvi.)Qs\u0015)(#\u0001z>20=G\u00172Q\u0017q.X0t&t\u00183\u001aM:-CGw1 .uIr~U\u0006\u0006+D<3]\u0015\u0011@\u0001}*F\u001b)e7-\u00112q凘X\\\u000eP\u001f\u001afL{\n0~I\b\u0011\u000f'\u000f05|c~ۏOR\u001e\u000f6\u0011;V;}?i\u0001\"lS=B\u001d=Yis\u0019\r\bSj:19z\u001fK1)r\u0015\u0000Pvg\"9h\u0007*\b\u0015<W ztZ6a0\f.\u0012GVE_\u0001\u0010:\b\u00123L\u0001͢\u0007jI'y%\u00162\u0010l\u0014>{\u0019{U\u000fOd\u0005\u0016w\u0003z \u00011\u0016{\u001c{\u0007QgL*Q+\u001fd?}a\u00010.Θ!0a\u0000\u001cKj̟knX\u0016K\n\r\u0012M鳒o#'\u001c\u0017 ~W(B\u001dL\u001c\r}d;xj5r\njg\u0005z~~\u0015*L[\u0004\u0006Y\u0007\u000e}\u0017\u001b@~J\nZ!Wz^/rTo\u0001Mu\u0013U\bK\u001d\u0014&\u0013\n_L_\u001ae$\u001cpG\u0019o˸TZe\"\u0019-e@sҦ\n6t\u0002zIB\u001d@-x'M:v_$\n_\u0003_#glMͯ|z{}\u0007\rr_\u0019URJ}\u001dx><_MKDj=\u00149$_?J=vRL_缚\u0007H\u001e\n\u001d1\u0012o\n\u0007o(]֏\u0000 ߃Wwi\u0012Ge \u001c#_Y\u001e[.\u001ff\u0015GN\u001avʈ\f.{v_ &\u0010^_v=?\u0018\u0019(!NV;*B0c%3kD{\u0004jb\r\u0005Gci \u0007\u0015{\u0000SJ\u001c\u0016r۠(ґ1;եc'=!*.\u0000 #\u0011@g_V5'zfW\u000b1\u0017.r߃W+`PWySj\u0001[]ýPi\u0006sKIB<pZ\u0007W.q-E<%q\u0013A8즗/\tߍuZwY|j}\bVѦ}Z\u0000\u001dyjt~\u0002E|]\u0006\u000bஹ\u0000(]\u0011Zܼ[rg..\u001avv\u000bh$c9sSF\u0013@z\u0004j<\u0005OD$F\u0005A\u0019\u001c0\u0018\"u-\u001c|\u0012\\#R \ntݯb8\bd<_7JJ(?G\u001dBuw\u000b#3\u0005\rn\u0013\u000bޣ~\u0004^FN2#](]E\u0004P\u0011r@g2b\u001eIL@점*`נ[si\u001d\u0018Q]-ީi\u00029\u0000dP1ou$|VL8R!\u0003l\u001c\\hcnl\u0002\u001bY+^f\u0004B^JAoO\\s\u0014*t\u0006u\tX\u0001,\fI$BR1:JP\tM\u001a\u0001t\\\u0000\u001c\u0000V,c~\u0016v/WWr,WDUoQP\u000bϴU(<M;z5\u0013mc\tzlfV5ML@sȵ\u001f\u00063\u0000G\u0012@T/<U.;1}ɰ\u0007G5VT\u0001]2\\P ّ\u0005$I-Q%Fi˻PK^)\n32s\u0001\u0013qR\u0004':\u000bm\u0019k+\\Wǐ+3\u0006a\u0006g\u000e>'\u001ah\u0003\u000e\u001c Y\u0013\u001cg\u0001m\u0006\u001240Պ\u001ftQ˦fގ$#R\u0002\\{;C\n~\u0004\u000eg_-d\u001a\u0019G즶\\[W\u0001psNd'\u0000Ȉ6aP⍁/ 6Bcҍ)D:,6]lj.Öo6=b\u001bۄ\u0006\u0005\u0010:9k\nZ7x}Sa=_\u0019z\u0018nx+\f@8O\u0017\u0002T^c\u0007ї8(S져x9\u000b\r,{W\\\u000ěۘ\u001d1\u0012ײDi0t\u0003\u001e^a#̈\u0012Y;\u0001YBLu\u0007\f\u0017`,\u0016\ti\u0014>㌰9CR#L\u0002\u001dPÜS ((ѭ71뛳\u0007\u0010f\f';H\u001f%Ȍ.Lƿ5\u0010\u0014_\u0013'VmBGU3)\u0013i\u0017\u0001*-\u0017ٱ\"]4=d\"\teB$E#},1:Db\u0014@U\u000e}OŞ]1}iXH.F3Ń`-_/N-vk \u001ed4̸Keאzلׅ\u001al\u001e\fa;\u00183?,x\u0012Ƞ\u0017@gh94e0Y\u0012aA\u001dUN⢿H\u001a\u0010dAm>,{zD\bî\tpKI^ݩT*\u000b`0Һ*{Hi=ۋ:;.\u001bԫ\u0002Q5>\bϺHE\u00189Œ͍r\u0002WdN7D<ļF@Y.\n^\f@\u001c#\\\u0018\"1!ް\b\u001bf6\u0006ϒ\u00019rj%,M7R\u0002i}MqpTt\u0007x*\u0002٩J>-\u0012n,A)Nt#Ӫ=Bik)JX\u0018a$\u0013lC+T4\u0004\u001cR \tܴ\r}\u0007i/n\u0003\n^\u0000!\u001d\u001d\u0014cAE\u0013yDV\u001f:\r\u0006\bt{P}\u00112ae/\f\u0018y=Jq~]ϕZv\u001a\u0000\n\u0014\u001a\u0004+%\u0001\u0000\u0003}ݪsP-,69\b\u0003\u0019}]\u001aT\\'P\u0010x\u0007ÁIh}*jGb\u0000}\fl2y53m'I0pI ;d*X3YEu=\u000b~\f'F\u001a\"t#/\u0010; }\u0004w9\u0001;\u0001|Zh\u0011\u0001>P1?MŇܪ[\u0012_\u0001\u001e0sJmP d;b\u00078Dtރy\u001ch\u0010 \f(\u00028\u001b&9\u0013;6M;aUm\u0015)\u00118\u0015\u0017.:\u001c/D\"2҂AYׇ5b,Ƶ_q\u001a$B\u001eݡ\u001buGlt1c}\u0003V7Fc8k΃@X;udd_\u0011\fZx?@[\u00168׽Gngr\u0019\u0004(il\u0015<O%cŎÑ\u000bٌ\u001f\tV8蹵b\u001a9f7\u0016U%cc\"Hӥ6\u001aQ\u0013QmeE{Ă\":Z#\u0001\u0014~];U}$$_Wͣ.W\u0002}Hf\u0003Z@H5,\u001c;\u0013iY\u0016{ESH^p\u001f\\\bzn\"y*+jK|=4/\u0010rb~,>{\\ܔ\\\u0000r0YkW)\u0012׷F\u0006+#f\u000757<+ˁc\u0017[|I9%k]LJ5p\u0010Rָ?]$^gϖ{!\u0016z>_*X2&d\u001cmm\u0015f>i欫Lx2& Xfi\u0011I\\X\u0014\u0013vp0w<Y_-\u0005Uy\u0005E]\u0015\u0005&I\u0015\u00055ەR\n䞟@U\u000bݛ|\u00056n\n\u0005#\u0003o֐9\u0005\u001c\u0011j-e:uj-ۏr\u000e\":5\u0017\u00028\\OE\u000eOty\u0014;yDs1xO\u0018\u000bAniQH|~\u0017H=x-mlڸ\u0017\u0017^\u001d\u00117_ڨ\u0004\u0014[\bӉ@92o\nuAi\\Z\u0006\u001eRUNw/z\u0015\u000bD'׽7w濌xeϪ3,\u001b:\u0015;\u0001Du\u0018\u00139;n\u0007Wa:\u00126g[2\u0000yȎIZiZjI\u0019%>~U򏯒\u0010e8ӓYl\f{ֵGe8QT_đn\rl'\"M˟t\fSÝncgݝI\u000bJz}Ab!\u0007Bw&*@ά'`^$_u=f@5z&R\u0019<kL\u000fJtQg%\u0001㸯>\u0016F>t(=nX\u001fsv$5!*\fgH_{.^IOA\u0014\"\u0010_WX\u0006!*{D\u0018%}gR/\b\b1Oj\byPunc]夼VϬWP\u001d\b6\u0018i\u0011fzIJ\\\n\\ƶT;\u0016rt,hJ[,Y\u0014YoR\u0014\b;*o\u001a\u0010~BwA;R<~VJ3Y\u0016\u000f^cgٺ)\u0011:Sԑ\u0013f!PKE\u0005mh#̃R\u0018\r0Ǩ~>}{R9MOQ],ܮֵ\u0016NgSf\u0001٫C\n쪲gqwXO\u0002Vg\u0015|)Z\u00043\u001c\u001aEJ0<e\u0005U뾺\u00036\u0011\u00017uU\u0015\u001c\b~K\tRwгC\u000er`Xz>\u0005rAK\\\fgs_ŨmDi\u0012\u0004>\u0002\u0016\f\u0019RH\u001fQDfn3y+\u00119{\u000f\u001dE!\u0003yl3\t\u0006mR+,\u0014[%7MdlweҲ9կ`\tb{v%F͡}\u0012߀3T&P\u0007`\u0015\u0014#W2\u001d(ե\u001e\\\"Ow\u0010IIK2yeS\u000fGtbt˔F.\u0017{]ƶ]\u0001 P]Fّn2>\u0011r\u0001[#ݕ\u0013j0pO[WrK:*Oy.2ݑ\u001fሬVcUF_\u0013Y#zP=rWtҞ\u0010YX~WRt4bT|{&\b+^J\u0001qGDhåŋBÚ@84c=\u0012?h7\u001e\u0010ʒ\u0015kÈ\u0018^1ԇk\u000f{Dr?VW<3=}\u001f,hY#'jW\u000b/3ɡ\u0004m&M);\u001bGH>q\u0011=\u000e}\u001ak#\u0018L\u001c6\u0015rk\blf9P\u001b\u001dʵ0\"y){o\u0005%\u0005\u0018kWJ~@K5\u000fjt?\u0000=J\"\u0002gXQ#\fk\u0000-7\u000eqGw&RO\t׵z*\u0014aJӺcǼ:\u0019Taޟ̍E\u0011J`KZIF06-g\u000b]\u0005C\u001d()P\r۰7<h\u0006\r+젲v3\\\u000fLs\u001eZ7s|boGq\u001aDN5\f-/\u0007fUCAi\u001doLҋ;/\u0014+syǴz'I\fÉ\u0016\u000f֑vŢ|5+RĹ/#V=ƛYnDcWgac(a@Sl\u000f\u0013ڣ|ov,Q\u0007eJR~lzg\u0000I9\u0014%=;\u0011p&+lIB}JMX_\u001enˌT[b\tת:\t#\u0002Q{/4^3\"{w\u0015%)gV'.7iI\\S\u0011\t\u001a)a{\u001fBN>/1%\"0o)Na7\u0015\r.bDuGEbx:y\u0012=\u00024\\\\h=Y#\t0!ߕm\u0012ӑC_\r.*㯯5]lȶ'\u001b٧!\u000e\u0013\u0006\u0006Q'2Ǒ;倠⟵1ZyV<U:W\u000e\u000f|\u001a8ƨߙ_B\u0005|\n;\u0006+\u0015`5}_X\u001f#g\u001cDkb[_+as^k\u0016o踟[=C聹k\u0010v͎Eq\u0000\u001234齡[wТ\u0001x\u0019W \t\u001c\u0017Q\u00003E\u0000K/q8<DZ|e~@:\u001c\u0010\u0011JsQ{PA\u0004/-WQ=YRZ{?\u0015}\u0003B^s\u000fm H&\u0014\u0011<L}\"ĩh\u00150;Knϳ\t\u0018F-'\u000eK?lnk\u0010\u0012\u0010+)L\t2/\u0012TvXj*0ˀtgJvd \\\u000e\u000b}\u0000\\7؁\u0004-v/^Er<k\u0003^\\i@v\u0017n=v~au\u0019GTe-Ex~\u000fR̉\u001aBw\u00106wZ\u0001\nzA1\u001f@!\u001260w\u0003\u001cUӶ\u0018)\u001aRn~\u0011!.(\u000b\u0006D4U8\u0011x\\Ytxm4\u0015\u001d^ \b7_\"ŕV#\u001aȩR1\u00124=iR֣8\f\rbH3~N\u0011{O$Ps\u0019M\u0013\u0006JZ\u0015\u0018˙s:\u0000ςBxB7h\r*4-\rY\u0004\\d$\n˰|Ir&|\u0010\u0010\u0010\u0000u\u001ch(ЇjF7-agT\u0011SJ>ÐӮK\u001c\u0014\u000fEypR6W\u000e*!&&\u0003\u000eul\u0004C{\u0014TF\u0000B*\u0014EflYH-\n\u0015.5\u0004:#\u0000&XwMhQy(qF9T],]*\u00199\u000fQ2\u0016\u0002\u000b܁lH>TC\nm˵\u0007*3cN9Q?>\u0010Ua#06zU.ao\u0018Ž\u0013\u0016\u0011h\u0015<DBfEp=Fϙ\u00056`\u0003\u0006;\u0012L\u000fo.\u0015!K\u00057\u0010O*(\u001bcSnh?)'\u001d9\u0005o_wRw~e>z/c&gy\u00067UJp|\u001324\u0016/\n\u00177> OUJ]l\u0016x]E\bkݲegi\u0019\rNUzD\u0006Br\u0014H$\u001a\u0007$6A\u001a딊iI\u0011KBK-r5;<\f$ay̺4ꨪ&E]\u001dE,I\u0013~\t\u0007AHFWQIMV\u001dƇB9|z8NZ> u5{鵐ZaRv\u001eQ@jJL)\fI\\$Ȏ\u0004Ƨs\u001b;k\n\u0005X\u000eR\u0011RóF\u0007\u001c\\䠪ʿʋ\u001eY\u0005C6\u000eZ.@\u001b`\u0002W/we\"HIoFWf=0-/ң+jT\t}t%.D\u0011Z4\u0003k?!|\u00109r\u0003\tȚ\u0005Mofj|ŽhT̈́,v젴Պqڃ\"E-Y\bKb\u0013:cZBR6}\u000f;`Jmq˒ً:[*\\\u0017H]\u0000Ô\u00059hȦIڥ^KHC\u0001?\"v4\u0012tr3(<0\u001a\u001fv\u000bm\u001a+\n\u0012\u0019/0\u0012!Q\u0010|%|L\u0019\u001c\u000e\u0000\u001d%k\u0004>pXM.~\u0005{bo\u0013G\tܬ\u0013\u0018B̒\n&*\u001e~lm,\u0013I\b\u0016ca%154SɉK\n\n%C\u0006*c9EZ}uԨ\u001b\u001e_\fY[\u0000\u001f @?W\u0018(j_Z#K!\u0015h\u001e|ݡ\u0017\u001a\u0019Ag-tn{NPx\tC\u000ba'\u000ed;zƝш3tq$r;\"k{/~r\u0016\u001c\u001bR\u0014>89K\f+Ap+EwV\u001cB\"B\u0004\u0019QP\u0019:g]{)L\u0005|\bz?yʂo\u0007<]8|\u0013{h\u000b>`\u0013\u0013$\u0003kTtH>L2P\u0010VT_*o\u000e\nUvmg.V\"0lIb;Yî%_z/\u0006&vl)#ܟ\"ԜR=\"s@$f\u001f\u001aфeV.!W\u0014ȄQ:Qq!\u00170\u0004{w饮Y{Iz/>/U\u0016/Io\u001b\\<ꤲ#\u0002\u001cA{\u0017S_MM鉙R}η[gףU!۳\u0002F#j.+}\u0017jP\u0002*6^jցT\n\r!ha|zmj\u0005ĺ)@2;)\u001fζ;M\u0011Dt\u001cu,Sx\b<f;t\\M1h)\u000f*`\u0014\u0007l9wQ#?U\u0007\u0014m=Z\u0017Jgj@veX_7\u0011BGR\u0012V32\u0003{[= ]]@󊙚y+(QV2,\u001c!\"\u0016Z`\u001728)Jv9;\u0018wEwNgS*!%WV\u0014Jɏ2\u0001/ZX;F\bɟ:g\tewB\u000f(;=\u0018R\u0018\u0002ӒG4z585oZ%x%;~?Sy\u0016Vh_K[0UhHo@[wr\u0011xߩ\u0017>)pqu]]7\"qNZM֪Dꆘ \u0013tAA(t\tM\u0007@Gڜq/\u0019a6\u0013?RM\u0001@W5\u001a>hr\u0019nowp?=VP\u0002ͺr{܇\u0019µ4L\b)CP)9\u001f\u0010Eə諕N\"n\u0004-> $\u0004Vـhx/jP)bH\u001b)ce-C#}K}aQWbR(ٞTb\r\u0010o\u001e^\u0004ƢH'Wܷ5P33^WHAa8~\r5¬S\nA`C(Q\u0002b+rHsJH!z\u0010[=]\bu=֚%J܁o\u0015\"-?\u0019s\n:b+5Qf\u00030\u000eGP\u0012!\u0007=8z\u001ao@RA0\u0018\fzcVԫ֌\n.a\u001fa\u0011t,\u0015@tݳy\u001b\u001b\t\r$~?!\u001f\\Q7&\u001c~\u0000uE~GJ>~T\u0005dxŨq\"*\u0013jì\u0013oh\u001b\u001bqg)Š4AyW\u000f)\u0003YϦA顊Վ\u0014'(U\u001ay\u0016 :\rTN앁\b2W:~q{<{ij\n_ЇXi\u001e\u0010#(łS)/ԟ\u001a`X)q3$I*%\u001c\u001fg\u0011>ދ(\u0018tv}\u000fg\u0001r_g6F\u00139{\u000ekU\u0015oz1_K\u00011'iZ7<\u0018\u000f\"4tTN-<֊Y\rB\u000bww,\u0015tvDS!~\b-\u0012\u0016NEKI\tu#ALOk0oj6@7 8)ݦD\"s\u000e$3)ߦ\u0006\"Ş̹1BmX\u0013acK_\u0005P\u0004*2(ɶ;@\u000f\u001fJEB-\u0002\u001ab\t\u0007\"\u0011\u0013=\u00170I%\u0017i\u0006{\u0001o>\u00188\bW/\u0014>P\u0015\u0012\f+%rp}\u0000+֜\u000fl\u000bj]qW[?A:ؑr۪HOd\u0016(NHUNlU\u0017\u00151$\u001c2\u0010\u0007\u000b\u0019\u0012YG\u0001d!\u0018h\\\u0007Xb0ӨVTT->Q\u0018\u0013\u0011\u0019Z\u00052/R||k>pu\r8-yM%\u0010Ɋ\u0006&\u0013f\u0005{\u0019\u001do9*,4\u0015:?*>z\u001elc \u0000<&S\u00137\u0017#T\u000eQ\u001as=l\tSڷEq}xK#\r*꩹\u0002\u0000;m`Ul*:]g.g}Jٟ\u0018\u0017\u0019\u00141\u0001?\b^Wǒ6>\t\"\\6.\n\u001c\u0012\u0001\fծJih\u00104Qs\u0006`W\u0018v;f\u0001gh9rq\u000b\u0001aU*W\u001dYĘ\u000bf7]n찀kX\t^}M\u000e@U\u001d\"WƬi|ؗ4bS2\r+憜c8ZWh\u0011Tx0\u0016\u0005Σ$S[[z̢ZS;ZG\u001erGq~\u0004a,DT\"\u001f0KtF\u0019ED\u001aj!޷G$\u0012[\tސӷNdt-Ia-Um\u001eKZ\u0012oZ/~d\u0006sܹa/6B\f\u0010.sXC\u001d;]\u0011Rj{\u001b/Ǳp\u000e\u0019r`r )\fq\u0016\u001e]P\u00003\u0001Z@a\u0015{<γ[\u001c\u001e\u001bPdY-OT51>\u001b6%|uk.Xre*Sig3\\S(*\b#?b\u0002\u0013\u0013\u001e\u0011|]㈔i(.=>|z\u000fA]j\u0002Њa>XQQgr\u0015uZU\f\u0013fyd\u001c<h9\u0005nΩs`\u0001Yv\u0007%\u0010\u001d_<KrY%\u0016Ǯ\u001c1ZG=w\f\bd`p\u0004{\u0010-\u0001r\u0000kCau\u0004M`gUfdY1w|4O\u0016ս_5+xrh\u000b1h \u000f\u001beu36>`\u000eb,/a\u000bSD\u000bc |aG\t/;G.t^E\u0002<|U\u0017ГBB!>҉1␯\u0016\\J\u0014m\u000b(%I\u00112iY-=k>Jٜ/8|U˰\u0000æz\u001a)\u0000z#UnCr0\fgLYNyjH\u001aM \rQY@i']gʖ*uЀ\u0016רbS3*\u0005iDϔ\u000fbR#yQ\u00002H!\u0006\tQ#xnZ: \u001dX\u0017\r\u0013=G4DN-h\u001c&:WU\u001dfZg\nN\u0017D$N!=\u000e\u0007.|h\u0011ޫswMC3M_*\u0017R4i<񵭃.\u0001QޠEWVcUT\u001fM\u0014\tʙt,cQU5:֫\u0000^>0!&\"Q1Xh\u001f\u0017߿\u00169\u0007\u0007_mѿ\n8,\u000b\u001aؿ\u0015C7ewϦYq->kH\"Xl7]\u0019-Dѵ!5g2[\u001a-HȻ\n.8\r](;\u0018pf\bPƣ>w:\nczQ*ݙLģCI8\bWf\"T7'񂽛ETfPp\u0007S\u0005|u\u0017V5μR\u0007nہW[Z;h3\u0004.L\u0000b<x\u000f>gele\u001528-\u0004!ӭ\u0000\u001dO-`%h>\u0002\u0000fbHLi\u0003eVꑁ\u0012X\u0002ӣH\u001a1#F;\u001e\u0011fLʟ\u001aul\n9*\u000b[-\u001fMY>/\u0005;Z/y񈪔pc\r?\u000f\u00119>=;%eS\u0007I\u0019}ĻY1teL>)0%L\"\fJ<7Q!\rᙱ}I4\u0016־OP;\"tB4j\u00029`G\u0005j?p7ŗKgad\bO%̕@߻Qpe'LR8Q&B!m\u0006w\b\u0016ʹÁUHZQM[U\fh\u001dVgE\u0011\u0003\\\u0006}K-\u001a\u001f5\u001a|hl7`t{m) !#\bt-hX\u001brչQ\u001a\fBbQK-vwқeZ]\u0011p([Ǆee}_\u0007s:07|o ^O\u0014\u0019\f\n7T$\u0013En_m{\u001eY\"LZELCd),\u0013\u00024rw+\u0002ԉ-\u000bX\u0001aÍ}]Ryv=<jNu\u000b$.p\u0010r=l+Κt*\u0012\u0014e\u0011,ʻ<7?\u001b\t\u0015별\u0012YVd\u001chsd2kQMe#0\u000eD'\u001e=U\u00007\u0006'/Gh\nA\u001cEL\u0002P},gWR:8\u001e_fW\u000b\u0004^qJɄ\fu+5~5\u0001:ЋF&zeVJ\u0014ljV δY\u0012[5\u0006\u001d,\n$&\u001cv%rZ\u0005\t6\u0015Ɖ.\u0011}G#6+\u0019QQi\u0013YN5Vߛ]QPRX6P3~i\r/Y{X\u001eW\u0004dxLQQ\u000e8\r\u001bR\u0002W\u0002S\u0004\u0002v]\bKQ\u0013GĠ,,Yw*e\u0003'ޡ\u0001Kt*R(|MA\u0011U:17yeLoyV:\u0019ޮ\b\u0018\u0011^&?`$Qx#N0\b\u0019+He\u0001\u0002pD?#Ӟ;y@S?3VN^V\u0018\u001be\u001c\t J˒o\u0002p'\u001a\u000f&r-\u0000\u000e\u0003\u0006\u0014ͫ\u001cJ WҞ_Q2 \u000fL$l\u0016k!\u0012АH¤(7\"\u0005h=,\u0001Q>Ò\u000b ~Gh\u001c\u0015\u0011v,S@*t2I\u001cW#\u0003%f\u0003YYcjE\u0004T{BF\u001aP`\rMԘSz\u0016r\u0011\u001d\u0001\u000b}}/͒\u0003>d\\Xm&R{D\u0014\u0001L;\u0014Z\u001f\\\u0006L\u0018p\u001a\u0016yS\u000bG,!q$pom!\u000b<dKud3v.EsGԍ t,'jp\u000f\nq>\u001a)\u0000\u0014\u001esET\\w8[m\u001ekY:Dy\\\u000b0\u000bT\u0011;S\u001f)̂حIu\bi\u001d\n\"j?\t\u0011މ\\֖4zJG;8\u001a4\u001c=ZB\f\u0003YæaP:6bٽ\u001f5P$9\u000fM'0\u0006,6@Rt[\u0004O?z\u00053\u0019H\u001a>h2\u0002f\u001cQD)Z*\u000e}T\u0000\u0012փr*.<OԬICiR|X$\u000f\bȶ\\GR~Br$\\# Sg\u001f׵8\bd:労t^\fLJWMo\u00043\b-W(ҟ\u0004u{0HX+'}\u000bdJ%U]\"R\u0018\u001fŀrT\tTh\u0018YƌD*\u001c}\"-neJ\u00011\u0016\u0011)6\r4=ȋ\u00193\u001b;' \u0010#y_k\u0005\u001a+c\u0004]\u00160\u0000Nw[PJi\u000e\n@\u000b\u0016\u0012\u001c\r`d3P'@g\fQB1\u0019e8hҽ\u001fVY\u0002mW>\\@!\rX\u0016^QB^<+]uzmg\u001cHLoR\b\\\\[\tA%\u0011==!f}\r5>\u001a+k*C\u00019A\nצpF&R9`J{M\u0004=08%\u000f\nR\u0010*'љo\u000f\u0012h\u0003pB\nƄ \u0017;>?\u001eb\u000b\u0013JQ\u0014tq='qޕ\u0002C\u0006qNS\u0004\u0010.j쐨\u0018\u001b#a`[Eo;\u001b\u001bJC$c+\u001cIB\u0018&\u0005G5c-}+\u0011qG\u001eۓ| Zoo+\u001b\u0015'2b\u0002BBQ*[\t\u0003'\tH,4׷0wA\u0010^o\u001fcҦtL{\b:\u001aqOEWX3J+ztoԁ>4+1F3&]kz\u001fo=<\u0002:̟_\u00051$n1u*ls:\"~qk\u0018`/>0(̲{5h)\u0010͏\u0016UإQ\u0006{Tq4\u0004hie>5dtw)\u0005kb\u0007lMEK\\i\\@!\u001e\u001e$\u001d,z*/n\\J?j\u0012RԻŜ]t\u001cO\npl\u001c&@\\Js;]}\u000eI>\u0019> ղpM˔]+j*&DPEVIY@Mîm9/9Z;Cm񾄒|`/\b<T\\AΩQUЄv\u0004HŁ+S\u000b\u0007͉\u0010{]UJT\u0007{\u0007\u0000O\u001a\t\u000bb#x*\u0003\u0010\u001aG6Zo+Vg1\u0018A]\ftM{\u0007\u0002u%B\u0015xΕ;V}\"坏\u000fPNHPݿ\u001fQ\u0011(@t'\u0012.*\u0018%~S\u0016\u0019(\u001eEp\u0013\u0011QC<[p\u0014\u0017O\\\u001eĽ?أB::f\u0015)a\u0014?U$ClJqJ<6މ\r|\u001f󍡏\"9W.;0#\fj׭|4Ugy^\u0010jA}+AV\\\n<|\n\u001bC\n\u001ag\u0001GMfl\u0019\u001c9Z\u000fac\u0010W/\u0001\u001bQ_S\u0010?\u001bfkQH\u0015i ⫮=2C9\u0017\\Hng\u000b\u0011uʋ\u0014=ȘfKd3)?\u0006@ޥHG M\u0000N-B\u0006LF\u001e'\u0013Kϲ\u001a\tvܩ\u001a+с\u000f'xV~\\rp\f\u001em\u000f\u001e\u0015Z>\f$\t.RV:\u0012l\u001bG\u000f\u000b[D6i\u0013Ӆsz2Ǭ\u0019q\u001f\n?zejf\u0019,\u0000ث:\u0000UC\u0014m\u0002\u001c~YbvTJO\rb-\u0001v\u00118Xo\u001c/;pz\u0000<kn\u0015|QΊ,\f<CDR<P@\b\"݊mW\u000e\u0007.@-2XC}V\u001b\rX3W\u0000\u0002 !\u00057\u0007\n`ީp\u0014w &+FZPYכz\b\u001d&*أ)j{)?r)\t<#7\u0002o8\u0001N\u000fȒT\u0013\tZ\u0000\u001dXjFE9;G$}}Zz!YIIȯ19O'\u0001c`]׍U\\\u0012^z\u0011{(z\u0011?%\u0012\t\u0015\\sM\u0017\f\u0002fy\u000f8\u001d\"\u0017[06yԈ\u0015P\u001f#c<:_C\tp,\u0010Z>\u0002\u0004pbΨ!1 *\\JuON\u0006[Z\u0001\r\u00007\f\\\u001fPZ0\u0012s_ǘg\u0004~\u0007\u001d?\u001ev\bF\u0015y*f+*\u001c\u001a\u001b?3IS>\u00192I\u0012|lѓ3˩C\u0018Q\u0004r߆/*W\u0015}+X^\u000f\u001b׵\")d.QC0-^1C\u000ba\u0013\u000b֟]Z\u001b\u0007ӼrΪ(e\t~fD\u0005\u0016ǔ1\u000eL紤\u001ebu\u0002P\u0001s+1J7\u0017~E+AA~CԠJ\u001cx\u001e@z\u0002x[PBO#NN$r/@OV9PU\u0004<\u000fۊgʽ\u00070\u0010\u001fd\u0014q\u0018MALv#XQT4\u0003G!~\u00025cl=\u0010Q\u000f<o\u0010+u%N\b=l6JN2\u0002V8Z\u001eaUQ\u0012wEX̀IaG\u001dq;s/T\r\u001aY\u0001<G5w|x%\bu0A~\u0004ҺRVx+\u001c\u0019\u0016j\u001c\"(!\u0016VG\u0010U3]\u0017,n\r?-͐f\b\u0018\\\u0012U\u001eD[9.I㈑\u0016ws&\u001b2˩°ڷ\u0007T?%\u0003+h-5b\u0013bJ\b\u001855񻁼\u0013Ncs\u001cG\u0005\u00151O-D\u0013\u0003lGl\u0004\nfS#AZ\u0002+K=ٜ7$g\bpe\u001aDrYz]03R\u0014zagz6\u0017B/@DTƧUp\u0000GN(\u000b,I\u001b9i8/ŠB=\u0003[;RXRZx\u0006RYLG[nJ\u0007pU:O!YL\r\u0018һz\u000f\u00051O\t!B\u001e?\u0002Twmf\u000e]\u001c+u⭹i)\u001d\u001b%1\u0016.gz=\u001c_5ƪyQ΂T0\u0014S\u001d1V~_=ǇYS{]6dto<5\u0011\u001bjFp\u0010=ޚ\u000e\\sq3\u0000Wޙr\u0014#ۿcx\u001cc\u0011Y\u0018)eIvL\u0017;\nrby\u001c{:Yu_YP(ѬN\u001c&\u0011cV:l\bs-գZ!\u0005<g\u0005+H>}uOv\u0006YuЙ\nu\u00176;=3\n0$gw*0US3}\b8}Bf4m\u000ejj}J\u0002\n\r\u0005\bmtNIY\r\u0002^S8\u0000Hfe$gN4*Jke\u00145#=\rYt\u001bm]r\u0016%ǭq/\u0000aD];aIO+9~p\trRqSb\u0010ڨ\u0013kOݣ/r?r<φ{X\u0002Hw}~j\u0011\u001cA##7l*\u0010WՍ\rg\u001ffi׻p\u001fK\u001d#d%\u0000`\u0015\u001d\u00142Yld9+t+l(Z]\u0005\u0015\u001dLQS\u0001?\u0001W\u0017]B_\rtβ1@x\u0007.7\u0015_+\u0010\\\\^w\u0000P\\>\\u`C)6'M\u001dBA\u0019?0\u0012BD\"r\u0018\u0011\u0005B4-\u0017HٔT\u000f;x\u001b@ZT/Q9b\u001d=nO\u000ei4qs)\bgQ\u0019\u0002i\u0014\u001aQz罬g+Ɏ#\b\u000fX\u0007y$V|3deMzN:@i\r\u0013\u0000DM~\u0019`~!gIH\u001eOoqDd\u0007\u0011\u000e\u0013h>:Ww+\u0007q\u000b\u0015?U@f}䦴\u0012\u0013?l}H6\u0002\u0011[u\u0010AҾZg:aaywj\u0003\u001fJ\u0004[]+Uhg箖ơ\u001b\u001fڹ&{/h>7}V>\u0002mSv:\u0015Dn\u0005}KL{#d\n̲mN<\u001a\u001aC#Bw4mOp5+e\u000eL<c@?\u001c\u0005f't\u0007OJg|E+\u000bc\u0012v\u001diJ+(h2@|\u0005p\u0012`%\u001f+)Ci\u0019\u0004F%\b]E\u0012 O\u0010\u0018 y@MG\u000f^'#'\u0016\u0000*\u0010J\u00077R(:ȗ\u0003w\u000ba#\f-(\u001b2\bm\fx[.mZ\u001eA\u0004F\u0018\u0019ڊD0@Ј\f\\94\u000f\u0004\u0004\u001eP\u0006Eb3ʏv%ƕvg)|-v6jZӫSU*2\u00129KFΠqMP\u0005)Nc_*\r\u0019\u0004\u0003\u001c\f\\mΨ`F嵧\u0000#<tO'\u001e.\u0019\u0012a\u0015\u0000`?`S\u001aa- \n\u001f-^7΂gj=wh,\u00136\u0012VsIRS\u0003uVϓjq>\n8@YClʫp0\n!@-X\u0015|\u001cڋ]*\u0005&vc툛)U~fVa$(\u001dh\u0001Rk IɳVKIe[{p\u001e(;`M\u0011\u0013.(!\u000f\nnſ>\u000b\n{Mүt0iwDn;A\u0002HQ\u0002eu\n4?8'p\u0000TW\u0007׈c#V\u0012[2J\u0017yG9_ɡ9l\u0004c[Qu\u001aNU\f\f\u000bǤ\b\u001f5\u0005Ǚ.D\u0002HLDe\u0000goCe\fF1|\u0017g);0(V\\pU\u0006~\u0015;%B+\f\"\u0017\tʧb$k2^fuB\u001fd@\b]ǭl뎷\u000f\u0011Ǿz^\u0002|w0^A6)OaW.\b\"q\u0007]NoȮ\u000235dRQ\u0000T\u0013mBpѤJ\u001f\nxVm57\u001b \u0001#H]\b\u0014\u0019\u000e'{뀑BZ9\u000bM\u0015\u0006\u001e 8][*\u0000\u0010\u0017Z؈t\t6X$U>Zƕ`\\W\tX\u001d`;<cW\u0011sc^\r7\u0013lm=iω̕j/3mMW͘{T<˳\u0019صV;q}\u0006\u0015+Mk`崽#\u0000\u0019\f,\u001bT\u00063\f\u0015\u0015u^\nvkf^zU1WVfz\u0005J\u001cg\u0014,ş\u0007kOS\u000f}v+Zeƞ\u001b)\u0016/:\u0019\b\u001d\u0015k\u0015v>3\u0003kF\\Y'Zx!뮲|r;r\f=I\u001ea{?M\u001bm\u0013Q\u0004Gއ;\rKri8\\j6R&Y[\u0018\u001e~Jg\u001e}\u0001sӪ$ä\u001f#BfS{a\u0000 砤\u001d\u0014ߴ\\L\u0019\u001aH\u0000>R?˲\u001eǿ\ri/SU|#\u0015\n̔8\u0010FƝxa\u001b\u0010\u0014\bA|\u0010=Y\u0004̜9^̭1\u00128Jmh A<z߬τ}\t,*{#I@.Y<FG0ʑ\u0015!l6?nbN\f\u000eP08Ϲ\f\fbT~\u0010\u0018&d.k\f\u001fOs \f%\t\u000bkY\u001c\u0013_ %Sc>e/v?%N\"<Y\u0001$+b._\u0015(R+ƟHw?^15VVo\u0017\u0016r\u0006JHf<=ߛa^\u001beCID\u001c\u00191aISfw$[TJ\u0000pRW\u0002<mB鍶h\u0015R+gt\ntv\u000b\u0004n̘s~r-|\u001ap\u0003k\"ĊW1ZVq\\\u001c\u001eu3c\b\u0001C\u0006\fri#ۆ+V\u0014g\u001f^%lԺ\u001b\u0014Gm\nb:~!>xR\u0007=\u001dRTnOڨO{i\u000b|\\\u0004Wm\u0006{w\u001c\u0013\u0004a\u0016*\u001dg!Z[שҲb\tݣPCe\u0014\u0011=D?:9˘\u0011F\bg\u0016W\b$L\u000e#n5\u001a@\rԯȻ/IEVQy:\u0014KʒנaE\u0005-k;;\u0006H\u0000\\c;~>j(\u000enɲ}{yꭱbx\u001a5QPO~+x.\u0019)-\u0003HH\t\u001eu\u0015Ӣ\t]X(\u001bVK))\u0014YORG-Gb30qszQ,Emo\u0011\u001aZ\u001b[**Vۏ.]\"NDBw\u0019\u00171w\u001esn\u00132am\t\t*\u0016>\u0017d\u0007*,h[ɲHY$+ O^ɦL\\1\u0016g@h\u0015ӲȲ\u0015f0Z<\u000e0Xd~\u0018S\u0003ĬcXصbiBђ\u001dw(H\u0001 =g\u0017S$I\u001b\u0010K<\"S'\u0015[N]䁔\n{ -!^q>A;t[O:ʟY7J|e\u000b>\bZ?B-(ɤr]B֯8dP9R4iӾEV}\b\u001b\t##%VIF̍b*\nT\u0000\"\u0006 \u0005/d`þn([2\u00179h)/+)\u0017}߁\u0011\u0019\u000e\u0018'A;,`\u0014YEq\u0007\u0012\trNG*7!J\u0001\u001dYLQ\u001dʗaVT[wf\u0006(W0Y\u000f\u0011\nŭf|\u001f\u000bx\u0001%Cڭ3O@t*\u001a\u0011@ n+Bo?orE2\u001fX\u0017*XI[q).:0:w\u0003ڭks!\u001dT\u0004c~\"\\\u0011hna\u0015a\u0006a\u0005(dJ7ߣַ -b\u001a\u0016f<E\u0013Ѭ)؛*\tfXsQھּl\n'nWd\u000fZg=@^\u0011\"K^]5\"\tCc\u0011OUV$\u0018\u0007,'\u000ba\u001a<uɺBh_\u0014Oǿ*o\u000eG\u001c{\u0019SN?T\u001b`-WICu\u0010d:r\u001cٱ\u0011lq'Z\u001a*׎-q)\nO\tv=\u0010\u001c*\u0012\u00006y\u0001fTD\u0018\u0002l9\u001d@qgn*B\u0000\u00034<?Ra}W\u0002\u0004$\u0015;PUx\u0001r+\u0003X\f5.W\u001a\fʿ0j?:ЗWGHqlA\u001d[ޗT\u0001Z\u0014aDk4Ƽ}\u001dC=Œ=ꥹS\f@q{M\"FOgRGae|_F(w\u000bgB\u0014^ebш\t\u0014\u001cr`&\u0011\u00198r'\u000e\u0012jT*(~!~6O(gUN5\u000f֐\u0018&B\u0012v\u0010zs\u001b*AM#/yԳh~lأ?\u000b\u000bkGFE#\u0016Z-+s}\u001bXH!XW\t$з\u00104Ĉd;;\u0019\u0005db\u001d#oVN\u0019@wWA#R\\xg0)>b\u0018I_6b2HbJ\u0006*^6펠\u000b\u00154U;W\u0011>\u0011YxLy;H\u0002߁|נm\u001c\u0006s:\u001f\u0000jüݜ5̬\u0019b\u0013p\u0002\u0015=2AS`MYH=WHP>d\u0013Y*+nב^Hv\u0006XcM + AW\u00041\u0005\u001bmo5ɿ\u001bNPBF.(Q%\u0005d,\u0016<eGR`Oi\u0006/\u0005=ٿld?\u0005ovwyXl\u0003/,6\u0001lV|$Tkl4[S.y=\u000b\u00158;\u0007p\u0001'Fa\u0005I{VX^d\u000b\u000e,VFJ\u0018Յɓi Wsdi+=;k2\u0019쉃y&H!\u0013`\u001e\u000f\u001d8\u0001}\u001ag\u000b\r%!O0UiP80KWw$2s0ו)iga/K$AWMȄB\u001c\u0019\t\u000bm\u001b;q \u00054Psiڕ(:JvxtIޢ\u0005+[\u00100=l-zDK\u0006N<\u000ecv\u000b\u0004\u001c<oƌNDwۏY\u0013\u0013\u0005Ë\u0014O\u0015\u0015Y\u000f.h\u0003ƯNtI\u0005\u00047\u000eFգSDv2yȌ\\>5Ls%5R%ȑq`Փ8*Od\\נ+\u001bϧ1\\'ou\t t'~\bL3\u000bA^_͚\u0003ȁV\u000fڽw;%ةU`|(\u001b\u0006Iy:l\u0007nm\u001aП&s\u000f1\u0015C\u0011<vع*C|_Տ\fS\u001cu\u001b\u0014ȀT\u001d.nA\u0002XJ3sc=NSp-=oUV:Q!b75\u0014R|}ң<G\tjh*QE~ې6N\u001eYs\\r %tR\u001dxĖyZG0Vdeǡֽ`(<\u0015KGYi%}\u000b-Hm=?q\u0002\u0012Hʵm#\u000eiMZ\u001aZ!ֶ'%./<K=Z3-Sr\u0014\u001fpg\u0014䞷\bKW\u0019ڋ=S\u0005Z\u0013<\u0011L1*t\u000eOg]/.a\u0014Y\u0010\u001dxj{(ï\r2V\u0011j\u001e5''ˇض\u001aseH\u001dGqHtO wy\u0000CR5=U\u0015D9c'Jz&Q\t r/\u0002{\nȲVJnYP9,\u0013E\u0001ь\f\u001dcɵ7\u001a\u000eu\u000eFѿ&U\u0005$_R[\u0005n7tNW)?ҲY=)s}Alo^\rn;zyY'Į:'AD\f6OG)WS(Xr+9\u000e\u001f\"pVv\u001eꓢ$\u001463;j\u0000\u001em8\u0014\bģI/Ȍ5zW3hS[\u0001\u0016\\{ܢ)\u0011.|\u0004\u001dΞ(^\u0018:\\hGOJ\u001aNqEw0ˉWO;ء!\u001fSɇT\u001e\u0019)\u000bw̤S&FA\u0015z\u0017v\u0017\u0014Si\u0002^U\u0010wN\n,14.\u001d&%\u00035u+ƴs7\u0018ߑbW\f2>n18i\t!Nz9mtʣ\n݊nWU:F0qW\t/(:W\u001cx/FB\n=\u0002Mhܰ\u0002\u00171Ze.?c\u0011}G\u0000iz\u0006{U\n\b_( JŷC\u0010\n|\u0019_I2v\u0015A̎P'G\u0004\u0003[;\u0010aP|EC6h\u0000Ҳ;NjTi\u000baC\u0005\"Z\u0017x\u0005H(nT笡}e9ՠg;\\o}={\u001fgW\u0007\u0000ǘ8\u0002c҇P{{\u001f0x&Z\u0017p^\")\u0001y\u0002-ۉ\u0016Ʒ'\u000e1\u0004\u0012rUhJ}rS`k`v/\u0006\u0010\u0013,\u0007GNK6P\u0000eCyBC\u0002YQ&\u001f+\u0010j\u0001;W\u000bM-'kA\" S\u001d`D2\\r\u0012W\"PX%\"Kf\u0006Uk\u0000z6oCo\b\u0011ס!F[5P\u001d8\u0002k3tdx.iP\u0014aEY-k-\u0012-8Q\u0013/9gXxNAT\u000b\u000f>Q\u001d,ʕ\u001dMU˩\u0013G)ch8,Zka+\u0017pn_ѣѻh,\u0014\u001ac\u0017m\u001b}#R\\[՜Q{\":7\n(\rl$9zTXQ\"f5\u0006`٭4Gѥ\u0006}}\tWy`Xx\u0015\u000e\u000f\u000e\u001d\f\u0016oVK\u0006\u0011+\u001c?>fHo\u0019J8JeuDc^oW ;E\u0017\u001d\u000f^৾^S9_t_U\r\u0013m\u0016J06w\u00031w\u0006\u000f\u0013\tpmm37\u001a5ȵ3T\u0006e\u0002S*\u0016f0h%\bls{\r[J\u001f\"b<5ڷc]+C8Vχ~si\tm\u0000Z\u0017Z-ba\\\u0015џ\u0012y}\u001b_QF|t23zgE^>dFirOgtI^uGFtVO\u0014z䒞dϽ\f-\u000bj^\u0012*jT7\"OU{w\u0006w\u0001coAJWU ):D\n\u00011r+k+Wľד=+<\u0015\nBZ\u0018#w\u001d;SMي\u001c\u000e81;j਒#\u001fH楛\u001dM<YBi\"LCG)L1gcMУ<..3Z\u0014.#U\u00156\u0019[\u000e|^D,\\^o8<q[SM嗳4\u0001 YAί={\u00199\\۩(]d[ûT\u0015r4\u0005l\u0001\u0014<ZF\u0016s浿\u0016?oL6\u001a֏x\u0004N\u001bQ\u001b\u0001Og\u000bO0HSս%\t\u0004[u*\rac\u0017btvո?+M[:Po_W<;S(2Z9/\nF[ko\b\u0004p\u0018RA#\nc#yk`=\u0007X\u0011i)7\bCO@i׺?Hn2%;\u0012|u$\u0015S&ϴ\u0011z\\8R`4R\u0018\u0019{hxZ_ f2E:k\u000b}|sD61\u0010,4PSow6eB\"G8\bun\u0019GRB9\u0003f%I\u0015[}o\u00116w\u0016O:\u0006GSR䬗*vKK\u0018G}<W2lֶ}*&<]'ohJÇ_2\u001d4~JHbOP.\u0015-ߐEeg΋\r_\fK\u0005A\u001a\u0012EC{I~I/\u001dw~Yd>9G4;\u0013B648\u00154yƄ\u001e:\u0007c~e-\u001eO:\u0007U3Ey\u001dDH׹(\u0016q\u001c@s֩A邕L_\u0016Oɰy-9a\u0010sL\u001d(\rj\u0015o#?\u0018bzG%1ul\u0019\u0018ᣩ;l\rfTO\u0017.5P\b&4[kʑGuO]ͺ0F\rT̉\u001c\fGXog$U\u001a)Q@\u0015h)\\&\u0014?\u001aS\u001be-Bx*qIqeW\t)ʕy\u0012f˂\u001aj'uGxQ\u0019,\u0001kL\u0019V=b}Ŭ\u0000D*m9K(\u0018HRh&>m_^t\u0003\"\u0010l[#M\u0015\u001fAt\u000e>p^a^\u0017\u0005Vme!WLEJ}ŨU\n=_;T{1j6F\b.Y\u0003'n\u001e#V{o\u000bUg[ir$\u0014*Q{n1ځ\u00154U\"{=0\u0015{\u000e穊\u0013Įw_Ÿ#RW!6U|Q2$Ͼ9\u001b\u000e>\u0019l\u001a4hxG\u0012v(\u00052[\u0017,\u0000_(<B(έ\u0004xVT\u001fzw7q\u000bԹ?̟u2;cO͆|\u001f2{GJ1=\u000b\u0000?߱\u0017??$\b\u00130)|\u0012QZ:ӒT$\u0013z\u0019T'0%8B\bͭHe\u0016bkU\u0014m7\f\n]\u0006\u0001*ᐲ\u001d?\u0018TDTG\u0006@nvE }B7A\u0017!1jg\u001bJT\n\tP`\u0017qjy=VV\u001246%zr6\u0002|\u001a)ѐ>AG=\u001atGO\u0019)oYG@@3\u0011\u0010\u0015ە\u0019gJiZ,\u0014zh%`It\u0017[\u001eM\u0012}W\n@\u001a]*>J~T\u001a$T\u0004\u001fMYV \"j7j+dF%*iI.L9g;~UX*Yڪ\u000el[.q]_)+\u0004'\u0010-\bPWZFw״L#>8+\u0002H;PG@<6Z|\u0012s<g\"JAX>7\u0002+\u001b\u000fCֹ\u000e\u0019B/P\"~`\f&2Zb\u0002}Z}=VF\\\fg?n\u001caǕ+7v܆w<\u00173Y\u001a22)V~O?d\u0002\fn\u0010fL\u000by5ē-\u000f\u0007v\"\u0013^n\\(*\ncog\u0017|\u0014%1Xߔ1Jj@}UrsƮrҾ\u0001˱~G}n\u0013m\u0017o7`\u001b9\u000e@_g'X3L\n\u001cz\tt\u000e7,\u0018O7\u0014*A\u0013\u0019X3\u0003\u001d&e\"-Gn\u0001ۼHɦ'z~ұ\u0004/\u0013\u001c\nIa_=?۟\u0012m32e\u0013s\u0007\u001b<9[JO&57+\u001a?\u001e\u0012\u001a#ad}\u0004S\u000b3dj\u001b\fSمJL$K1.\bdT\u0019\u0019\u001d00ǪlR{m<OKl\u0016ī\u0002\u0017C.\u001e-ȳD@G!{>>ר\u0013O\u0000\u001f\u0003\u0016@\bܷ<rQ\u001bcםׇz}h3_\u0005k_UCఊ07`\u0016#q\u000bEZ\fܽA<T0q.&e\u001ePیf\u0016s'\u0013ft3\u0002`\u0015_~C6IG\u0002<f\u0019J^rIxC)\u0018\u001eL;\u00179$6IعzeqG^^\u001f?}=GvbLA3cT\u001fmb\\~fӂɿEHT1A@;́g\u0001k]ʜ\u001fC#Ì:\u0016ѤSF̣<v\u0018BC\u0015oz\u000e\u001c\u0003G\t\u0005\u0013t\u0019\f7\u001d\tQ\u0005\u0005f\u0014ъK]\u0001\u0017opR_J\u0016Ҕ\u000b\n6xh9_e9bɅ\u0001kWjӣ]\u0019>Gj*j\u001fZ6x}ڌU4\u0019G*N{_\u001d`uMk\u001cgO9Rʗv\u000bY{2P\u0015tﭠ\u0002O]t!EC5\u00189+!T<P˘n9̅ٮfg\u000fp<\b+\u001f\u001fg\u0017\u0006iu\u0012\u001d>w@C-*-)ap7phgץ:veX\u001d\u001e2-uq\u001c`akV\fx1\u001e\u0004e{ nͺ\u000bunP\u0002\u0006/7u=O\u001cy\u001et\u0000YǄ^\u000eO5\u000bfv*˧\u0019isՀy/\u0019\u001b\u0007%~f#7<~\u0001\u00100\b\u001aTN,kkx)8q\u001c#\u000b\u0012B-z\u0018h2̴LH0\u0013X=\u0003\n\u0011S\u0002qqw\u0018G'4\u001dFnUxW\t\u001b|\\-WyD*<74|e8v\u0017T\u0004AȮ#vdk\u0010H!8\u0002֡\u0017>7\u001fc}5$yxIw\u001e9>8O:8F>lOFLn~NZTϕqc\u0002F\u0013{\u0014v,\u001fe4f;j\u000b~ȭzv5\u0002\u001d>qUKs\u0001\u001e\u0011:*f:>KjF\u0017Xhߏ.\u0007Y(e\u000557CW5\u001eZ\fX\"\u000b=_e-=F\u000ez3-:]%qx\u00177=r9\u000b\u000eM/߹[|B8Dl\fj&b9?\r+]Hx\u0019Ga~);z?i92aOsx!)sw 'l\u0010\u001dF\rTLY$s(,\u001aTeD=U\n\u0016om2\u001d1\u0017x՟2Du~>ׅ)\u001e*\u0001A\u000bF\u0019g\u0015uw|r}ׅ;>#\u001aF\u0010\u0018l#7\u0016M\t\u0000\u0010ȃQ\u001c\u0018ݾӰj43b\u0014\u0014)\u0015\u0006u)\u0001k\\h,\n\u0013\n(̵\u0006G\t.6AZ-W1ƭ\u000e۹ٸ~\u0019\u000e?e'ߑ3馬]\u0018\u000b󱎹哾\u001bݼW˧EP\u000f\u0018z\u0011܃\u0000pi!\u0015bQ\u000b\u0018@x>k\u000e\u0013NT)\u0002\u0012>\u0003#ҳBt:2\u001fD\u000f]X*F\f\u001fbF~\fI\u000enV\\k完jd\u001cs\u00188}.D\u001dAJנ9\u001eN\u0015IѨ\u0019!\u0012Ԃ\u000f>COPK.\u0004gS7\u0017NG~)\u00103<e\u0000Tȋtçfm_5?,y}Nj!024YԀttڶ\u0019H~/s9kB+SXG=&.\fK^Ál:٬mE\u0013\u001a\u0019{y19W3p\u0019sD\u0011TJ]\u0001K}3a`U#>ǃ3eOq\u001c\u001c5H\u0019q9ZFu;}vX\u001ayc\u0014DQ6k\bp&os\u0006l!#+g OyVOg`4\u001ex\u0017T*\u00196\"휵aw<ΧӸ50\u00131#:[=u+Dv\u0002EpGD]\u001d\u0007kzឪy;5+8k.Rs\u0016\u001bi()\u0004\u001e\u001bQ\u0002\u001cwVLwm\f\u0006y+\u001awGo)E\u0011\u0003i;E}v9b{[\n\u0018aN\u000b\rwp]\u0019\u000fq0*\fs$\"O\u0001\u00166D\u0010v2t5~.\u00131\u0012IIU\u0019-J\u0007=BT9\bEQfSNҶ*-aGV8Ʌ*\u0003\u00149K/\u001a,95gސ3oYm^q臈\u0005\u000b_#\u0007{\u0010\u001dwY\f\u0002>v!V\b$v\u001b O΅\u0000)y>rCO\f\u0016Zxz\u0003g(\u001cU\nh\\Ժ`?D!MȾm\"X#e\f\u0007##G\u0015P\u0012\u0014\"G\u0015\u000fMss\u0019=ꃲ5}3v\u0005HsH1PhT\u001d\rܡ^x?g9*pt\u0019aϳA\u001e\u0005\u0004D(Tz/^j48\u001eUrC͈b\u0014JT=UU\fPHX \u0000Hf\u0006X\u0002\u001amjX\u001a3Ff<ZBaqʗ\bnܽ}\u00186!\u001fK^\u0011ŚT\\=ɎǠtox\n)y>\u001d/}?gj}y?\u001dm\u0014(T ƧP\b$0Wm\u001dٙ\u0012٧'\u0003\u0002Ղư4R#\u0004<J\\\" wuȮD0ֻ`z4cS_\u001b>\u000faH[nQ%f`\u0011\u0012kp[\f\u0005е%\u001d\nE>\u001b%\u0013lִT8\u000e\u0011?^B\t/h\u0003t\u0013-%+mu`ow62\u001a\u0016\u001b\fUg}\u0001\"{]\u001b\u001bZB\u001dˬ9눯\u00157\u000bIxl\u0005g\u001c5Vt=ߙ>\u0004JM8\u0010$a%1*Й!n_(\u0012h\r![kյ\u0003S\u0004\u00133SN^c\u001a}3bqtd0\u001b\u00129p,\u001fǾ\u0016Ek4BTφ1t{}\u0019B{t̩\u000fSƒV\u0005\u00126\u0011T6_a;e=\u0011>ɐLK\u001e5ϥYNH@O\"1~i?e4/țZy\u0001E\u000ffBػ\u0003Q\u001b\u000e+#Kw8\u0019+\u00112\u001a(3(f?X#7W{ʶ\f+7|iɑ'\f\u0016)\\<k*2\u001c\u0012tȹlCF&]\u00024Ʊ\u0010c\u0013al&jݗ\u001e3^o?\u001a|tx\u000b\\7j\u001e\u0011\u0005\u0011\bc>r;,\u0007wG?d$X|\u0018k}9\u0019;놮W=ϯVIyCCvvȭXw/߿(MF\u001es\u0004o\u001d_?(21c_\u0017=|X۬\u0019$sѪqn_0J\u000e#߿Ho\fg)\u001bQvr~\u001b>ܓ\\\u0016y,Gp\u0018\u0018\u0013\u0014]LbuJiǕ&h˅`||\u00194Zr\u0010}|}:ddP`\u001cǟM\\P\u0013nh1˥(k\nܴ\nw$T\u0000\u0018C\u0004ђCw4`^ $89t^\u001bO:BZ(y:Gظɐ\tsmW}*x7\u001fk\u0010Ei繟@5\\\f\u000bI!8gDI`\u000eM\u0005Y {V\u0017redu7U&g\n[^M\u0018wlf!04\u0015Ew!yϾ\u0015\u001dmY3H!\u0013G38v5M󠦩}\u0013alfUf\u0010\u0006?{@\u0003X\u0019~~n=q\u0000,9W{HkƽO\u0019\bU|\u0001\u0011%\u0019{<\u001cL\rќڗ%3:\u0013ww\u001e:BM\u0010G^}ksg#\u0000`_PY^?i{\u0014G5~hX$**kaľ\nj\u0016%5R-cχ緿uNDVeVKl`sk<BYUFzª\u0019,_j\u0002EdB6\u0002v\u001eǩ\u000eC}NRR5\"\r!Y]VHZY$l\u000bIJ0oҿ.Zݯs YⳘ\u0000=\u0011I\u0004:/ѽ\n؅LŌo'\u0007\u001br\"\u001bB\"\u0004~\u0001-@t&\u0010ʹH\u0014:a\t|\u0001\u0014\n\u000f\u000f`aK'Bl\u00191\u0015x#8}u%d\u001aK*jIF7\nP*FAP[X\u0013M9\u001d\u0012,Oޱj\u001f\u0006\u001c\u0014.\u001fΊ\u000ebm\u0011΁X(\u0006uT\u000f\\\u000b|\u0006\u0016\u0003K\n+r&\n4b~\u0005#Ѯ\u001e\u0018T̓\u0004+oj\u0017`H8pKMmd³5B)\u001144LL[葚cebD9.\u0014kT.ݗ4B\u0004\u0019p\u0003\nJ@{E|Sʱ:XCP+\u001c\b\u000b\u0011r\t+d\u001a\u0011HЄ\u001c.5M3\u0004J2<\u0017.\"aQh<~\u000392f)pK\u0019]>ƛKBHgjLթA2ANG.c\u0016\u0014\u001dbU&R*\"\u000fVN(KƐ\u001fV\\\u0019ᐮ=˴\tFןB>0\u0012TJR2\u0019FS\u0014\u000b)ܨ \t\b]T\"@2\u0006\u001a\reJ?\"\u0019\u0019\u000e\u0012 Rx3 `\u001a<*0jmL\u0011\u000b\u001fp<ۈ\u0014BMR>+?/B\u0012a+HRp5Ϳ$6L*\u001dt\u0010H\u0014^3A\u0014\b,WK-HT%9P1e\f\u0011bZ$\u0013?\u000eN~5tғB-Z|pqM\u0002%\u0014\u0007$IpN)d{&mmԗL\u0010\f0i_7\u000b\t$F,h\u0010\u0005\u001eI\u0006P\u0014I\u0011.Pl\u0003\bb\"IMd\u0014ʻJ\u000b࿒QVQi<Hh\n`\u0001\n`\u0001:.0F1\u0016Rk\n,t\u0005\r\u0017'!\u0001)q(֛Bm10󐃹hHFp4z-Ԙ$\u001a\bJj\\{\u0018+[e Ͱ<r, }\r?V!J\"\u0012aA)]\u0004\u0014T9,2\f63\nJp\u0012A\t/.l\u000f\u0001B@\u001e)V:\ne>\u001b\u0016-KaRg(e\u0006\u0000`\bX^V_=<CN+&X(ʝ\u0005XN\t\u0002%Fȣ\"*E\b7P\u0001Hf]\b%*8AlLB\b]Tr4s81ɀPI([Q\nf :S\u000b=Tc\"@W>x/\u0015\u0004\u001f,_޶1\u0015~կFB&< \n\bV\n\u000f]傱ǀ<'hܬ;.M[`M\u0006\u0012jU\t/!Y;y姝Q`x9\u0005C'$aԹ\u0004\u0003\u0000L\u0016w@n\u0019\u0017\t15$\u000fР@`FZV\u0004`\u0014P\tNdH\u0015fn9ce{%\u0010rf٭T\u0001IQAX9+ǉ]c\tуJW\n!\u0012ᰖR\u00044\b\u000fOL{uB#\u0015N74o\ro*J\u0001\u00056R\b\u0003xP:pS\u0002-5^f(/#p$0Z[\u0018s\u0015BG,@\u001a$T\rD%Z\u0000\u0012Wєa\u0005gpi\u0011ƭؓB >\u0000gmR\b2\u0012GOZ\u0007\\ePPA\u0017Y*,X^?c\u0007i`(򠓈\u001c|>\u0018Mkb%\u0003H#W!\u0017!>hѦZ\f\r$R\u0017\u000f]u5,։#J.X`>\u0015\b\u0000\u001a19a@(\u000f(\n_<\u0002VT>[  <g5\u001c\fR%AqߋJM\t0%,\u0011\u00105]\u000ehIz\u001bF\u0015\u0007|*(FkIZu\u001a՞Z\u001b\u00140__\u0006}/\u0013)\"\u000fje)\u0010\u00119R\"-V\u0005NbrQ]\u0012H\u001b\u001433@/|8V\u0004:_!Ī,\u000fVR%R\u0011_o^t&ˉΰ\u0002oE\u0001C\u0007\u0003MӐ\u001dԥa 6>\u000b\u0005a!N`z\u0016IS\rk\u0004F\u0018JLB*R\u0006)2-%GV\u0012\u0019(\u0006:{3\u0002&GԈlˠ.\n\f9\u001cShGpS\"\u000bCz\"b\u0019u\u0004^\u0018\t!xºP\u0000V=c\f\tNA\u001ac\bRǐ3T%LԤ\\b\u0004LeR\u000e҉\u0012\u0019A\u0006qKBky+L!\u001ft\u0014u@\u001emF_+\u000e\u0011&\u0000\u0005\u000f\u0010\u00110\u0003\u0010b3\u0019`fr?$l4u|7\tȑ7Wp\nhi\b`$5SIM^:γ8P=\t\u001e&L\u0015e}(\u001f \u001e-\u0019\u001eBTgm\u0007؄X`8\b,v\u0004\u0002\u001f\u0012\b⚈,ժj+Ti{K\u0015g#r:l\u001bGb-\u0003y3P\u0017\u0010\u0011Ջ}G\u0000\u0018&%_-79\n\nذ\u0003ت\u000fW\u0002\u0006 \u001f&8\u0014P\u0012\u0014U\u001bBhU:\u0000\u0000L$\u0004XT\u000bB\u0019b!lEy.\u0017U\u001evWF?\u0005/wMS*:̒L\u0000\u000b\u0011]\u0002\u0002O(]+{\u0006՗\"wD#u\u001d\u0004ҭ \u0010OP5Q\u0011o`O\u0015wD\nd`pskd3\u0005c4Y\rj,\u001bZ\u0001/\u0006\u0012 .'  \u000fF1>U)I\u0014Yܠ>\u0003Ve\u001a4\u000e\"#RڙTP#FR5[T\u001e\u000b#2\u0004kd\rK\u0018RB_E\n+Fdsg$fv\u0016\u0014@9@}h\t\u000f\b\u0007\u0005\u0007h)7\fQ\u0018u0G\u0005\u0010͗\u0005\u0010\u0017X\u00124)ڻ(J/Ad\u0014\u001e`d\\'U\b\"\u0014\u0004\u0014P\u0004\u000bx\u0010\u000f6B\t]>dOv$i*F\u0015\u0014j\u0006#HzBs8\u0005%MAV}\u0012̵R\u0015|Om_\u0010;\u001fY^~( E)pb\r\nś\"\u0017'?D1gT>\u0000њETH,0l*Z\u0019jV\u0005GBG3\n`I\f\u0017+\u0018Aȇ\u000b\u0015f7GTN@\u0005\u0014Lv\u0014 ,\u0011Mr_\b\u0005:+fBZdj0u(\u0006\u0000N`UK\r\u0006%խ0]c\"b\u0013Ɗ\bO\u0001\u0006\u0013ʫi#R\u001a\t\u000e!je_&X+ja, \n\u0018\u001bxh@ :$P\u0006}QdP\u0013\n\u0005]+N\u001abq4;\u0007KRN.Ṷp\u0001XeGB7%T\u0011xq꒎Wh\u001e2\u001a2L\tfΫ6z\u0013dR\u001cYu\u0012J\u000bNQ \u001a(\u001cC\u0019dB\u0002\u0007K\u0013&E^,E\u0018r\u000b\u0014J30xY\u0002Xb%\u001a\u000bÄxxס\u0017\"\u0011 P\u0012w8@QH\u0012zȐDZS$\u0000\bo>\u0012B\u0006j)Pui5#\u0007\u000bU\u00121\u0019C3A,}\u0000\\R\u0014xLP&91\u0016SIQ\u001c f:d,[\u0014=3x*X\u00044\u0015\u0011\u0001\u0016ұү8pmu`XCNpB^V\u001egY$\r16.s\u0012NtbDhAaP$\u0010ڦ\u001aSA\u0017rTrQ޲\u0000,+u\u0007\n\u0014L\t|5,U9(Շ2k\u0001ro0\"ϙ:1\u000bːp*J\u0000\\F\f\u0014T`QXS*#+&\u001c#}y,`\t\u001a\u0001N-]cv4\u0014\u001b\u0018\u0016JxÑ\u0002JLMbevwJd泌ew\u0011U\"!:,}!RV\\.\u0010\u0016f<4!i\u001czăf\u0012\u0014f\bΥƊϥ\u0007\b}T\u0010\b\u001e2,%0˽h\"8\b+D;%k\u000e\u001c\u0013`j|@w^/R-JqQ\u0012\f[cDVZ\u0012\u0018I(GDG\u0003b\\4\u0007-!F\"Z\b:+6\u0017$\u00178X\b|\n05`όzx\u0002\u0015\u0013dLq\rOiaf$\u001aR~ېfX6zH\u0019\tC\u0006a\u0014j*eIGA\b4$n_kiQoHLe]LdEy\nj\n\\J*\u0018Ce2^)n<}\btN2#p5/cڷ5I\u0019-A\u0016\\E\u001f\u0003d\u0014\u0012J\n%\f-㙂&I\u000e\u0013 \u0015(lڥ~Ij*\u000fw\u0016S\u0001څ_3V\u0013,*{Vj\u000b.\u0011ҕRamtl\u000f:\u00107\u0007f\u00154\u001d\u0005!ae+s\u0017D;.shT\nǘA|\u0016:!n\u001a`\bń±&\u0018#uF\u000b-쾔\u0011\u0014\u0018\u0005Z[[15P@\u00017\u0016Q`\u0004\u0004a\u0003bo2\u0010TAL#1k\u001e\fhy\u0005kr(J9| %N\u001e\n-\"qX\u0018$,,\u0012\\:\u0018z%XN\u0014jr\u0000)J\u0019\u0003\r\u0001i.Wй\u0010\n\b \u0018:ƕ*\u0013lkO\t\u00059A\u0004obE_\u001c=G\ḅ\u000e.2\u0019\u0010\u001c;BXQinSg\u000eRd\u0002_8\u0003\u0019C\u0012V+`nHՠKlYl\r\u001aı\u0017΀\u001bdg\"\u0019\u0005bY,8\u0004\u0002J\u000e\n&\u0013V\r\u00108q\u0007Ƅ7\ns\u0013D\u001e\u0003\u0014P/א^Yq\u001dW\u001a^:K0.\u001c@9\u0012\u0005/\nѿfx-}5z\u0000\u00128%KT\u0013re\u0004\u001b\u0003;9Q\u0010nN6d$՛|\u0004R\rBu\u0000\u0017KI\u0017k:Ye\u0003͝]Z\u000e\u0004`\u0007cz;p=ݱΫ`{P\u0014b0d\n\"\u0011rY!\u0017b^\u0019Ix|\t4t9k8\u0000E}$o'\u0016y&E@n\u000b\u001d\"\u0002$\u00198Cʄ\u0014\u0019(Y\u001f\u0010\u0017=\u0000f\u0004\u0019B`DaQѲ\n&\u0000Xtҹ\u0004HV=uz)\u0014aqYN7a\u0014\bmZI\f-\u0019ED\u0002DW7\\\t2R*|8I\u0018A\u0010g?9?Xĉ\u00146\u0004*ӄEa\bB0b\f\u00010a4\u000f͐׋\nM\u0012\u0006\\l\nR\f0\u0011ɚp\u0002\t9\n4%-評=\u0016a'P\u001c\tV྆sqb-JG\u001a\u001b'\u001eZed\u0007\ts\u0011(P!`ZHd,\u0019;MJ(K9<T!\u0006\u0018$\b\u0001_\u0018\\\u0010'N+\n\u0015\u0014\"OYJ).!\u0004G8\u001e&v\u0017\n&\\ӈ\u0018@^\u0015O\n\u0005*QX=\u001a\u000f@A*to  gN\u0011\u000ev&Vԥ\u0003JD\u00104@Bf\bOd}\u001e!6\u0014\b1VAM&\u0019E4\u0016֓]NjA=}Z!:O0L\u0006«aH^*%@UϘ3fR+%9S,\rر\rNY<Tq\u0003/\u0014aj)%{&\n\u0003\u0000\r\u000b@u8*>򞬹|\u0011u\bvg܂Q\u0006'm\u0004@jN\u001bE20dPD PCIi@,JXg\u0015\u0004\fWEl<\u0010\u0001I\u0007(6\u00079=9\u0010(\u0015\u001c\t\u001dQ'\u000e\u0013;u\u0000\u0018H߹AP\u0014\u001c\u0012\u0019X\u0018\u0019\u000b0\u0018:R\b\b[mYS;\u0014\u0014\u001ay`U5,\u0017<|-W\t\u001a}@A78Ո$Z뒖mLDi\u000b-s>X\u0004O\nhJ01(\fsv.\u001eCLW!ִTLSdv\bmJku[j:w\u0006]>]a\"\u0018\u000bˑ%>JX\u0010%@d#\n\u000bjs\bI0!X3\\\\d\u0017:\u000f\u001b&I\r5c\u0015JT\u0002b\u001721L\u0015ySs\u0012!V9)kh\u0015#F\u001aJt&2\u0002\u0004gN\"\b\f1DIDɜ\u001a\u001bt`\u001b\t \u001dTʈL\\u1PUL}+[\u0012\u0000-h\u000bDI\u0004,>)>NEtB!DB\u001c@\u0015\u001fxVr\u001aDE8v)#qj%\u000eh*7.e)\\᝾>\u000b>\n\u0016\u0014)υx>&\u0002t6/ed\u001f'\u00110WppԂDTWeλ]a^=:TȰL\f~U\u0015=:M!\"\\ԜQ\u000b1\\m=Ow\tޙ~\u0003\u0007.ȣi՚RI]nػ\b`D\u001f}E\u001f[E.\t\u0015P\u000e;\u0004tTfp\u001dP8t6WIH\u000f*7b}+lB\u0013W;SvAd3P(\u0016|P(T8\r'8!51e\u0018KD\\+6ś\u0000 \u0007%\u0014y\u0015=x;]8,8e>3%\u0006\u0001TITJVk\u0010q`u! @\u0004U+\u000b)\r:78@\u0005W]ȃfn\u0019D:UTJ\u0002|b Iqw\u001a})I1\u0006~Pv%hfDN\b\u000e}\u0005)l\u0018Z2uAq\u00041r\u00140,ˤ(O&gf\n3L\n\u00024\u0007%@e|\u000f2\u000b\r%\u001d\u0019l$@Y\u0012\u0013\u0018{Y&Bl&\u0015ș[\t#* s\u001bѻ.o2y\u0014{c9\u0018\u0018\u000f\u001aE\u0003\bb=\u00151R\u0003ǆ\u0004Gxj\u0014N|\u001d\u0004\\0|@Vl⥡ΤV\u0000[tҪ\u00064\u0018%i\u0000\u0011\u0018V\u00042+))xk)@Wo\u00045A\u000fMpyhiG\u0018A\u0001E8\u0017\u000e6\u0012gV=#\u000f\"@X1Ҫ;N5\u0011R\u0019)'\u0005\t$8s57\u00123\u0007I\u001b\"VS\u0018Sg\u0004o0PK U\u000e/$\u0011Fo\u0000\b\bQw\u001c\u001a}B\\)~y\u00160i\u0018\u001bL萠\u00140M>/\u0019D\u001e\"W@TJ\u0001R\u0010{G\u001aqo\u001dH\u001b\u0004D7\u0002?\b`\u0016 `\u0004ј3e\u0004\u0004\f\u001a>Z}vk!k\u0014a1T@*\u0000\u0017\u000f\u001eV[JPh\t\u0005ID`)\u0002/X\u0017>#-\u00114W\tWD]e{\u0011aŌBc\u0019\b\u0001I\u0004\u001b\t\tLir^[\u0018\fjB(ASk,;p\u000b&%\u0002D\u000b\u001adM`<M\u0013\u0017-E}h֣m0^\u000e\u001eY\bsE^\u0005D]p4\u0013lH\u001a3\u00050\u0000m0\u0007\u0001@j,\u000e̓\u0011K{@\u0007\u000f11j8'\tV)B+f\u0014^Nej\t#V\u0014<\fC\\!.\n#IsQM7J O^S[Obw\u0019Zؾ`V\u0001SM\u0019L6/oWG\u000f;1\u001a%\u0013ck<y疏\t_喆\fFKɫ\u001b㑼OJ\u0001M\t2\u0015_\u0011b\u0005\u0011eg~=?Tԅjy4\\\u001b,GT\\\fo6ow\u001d?x=ޙpnwhHrys]-le~zӓfm\fN9]Nzn?ie۽g/\u000f\u000fLh\u0012\u000by\u0010h\u0003W-9yQB1[>{MR)ހSc%\u0014\f=QE\bڈ \u001d\u0014\"Xұ*X\u0013)Hi0R\u0005o\u0001WDv?(\u0014<.q#л\u0010sR!C\tbh\u0015\u001b\u001cJm\u0010T\r8`BHwqLS_Z\u000e@dp\ta4*\u00020\u0011]*\u0001Q\u0018z\u001c%#\r\u0006(j5h\r5p)6d`GS6=(ȡ(:y2EHRM,\u0002\u0007 Y?\u0007鬴x{xNby\u0006\\JF:\u0017*tg4p\u000b2\u0003\np^|\u0004lX5Ӏ\\9Avg*W\u0010\"\u001dXsj2t4T\u001a\u0012e\u0010j+\u0016+t\u0006T\u0004\u0002M`\u0000Ųai$a|V\u0006\u0016p\u0003`{S\u001eK<kY˂\u0001d4!\nz&Wt\u0011!\u0016̤t!\u0005E\u00189,jh#R$oFD+SOI\u000f\u001c\u0019\\0nlQ\u0004`Ȩ~Í$5DY\n{*$~\u0002\u000fL`_R=)ETr:a\u0006ďc.\u0004\u0002(3,\u001d+M\u0017#,b9DL\n}KGfZW,9Il\u001eF\u001fD\u000b4L\r2Q4T@\u001e\u0002\u0002\u0004\\7\u0010ݨ\n\u0010\u0002A\u0015R*V?C#e\u0019UK\u001eN7\u0004<`Y\by\"sR~\b\u0018\u0004D\u001fjNC-\u0010^\u0001\u0002\u0011C#a5\u0018\u00051Kxr\u0013ΔR،\u0010SJ5ѭ\"\n\u0004,N\\InW\u0012m='D\u0010c\b\u0005P\u0003Ai\f@\u0010\"&G'&p\u0004R^/u\u001c&L\u0013&2\b%w«\u0000c\u000f\u001a+~ҁ.K,$Q$Q2\u0013ǜ@{0\rE\u0006\u0013%D',\b\u0003\f/\u0013\u0018{2\u0016Ht\u00192BJpY~jZ\u0018N|k\u001aJ\u0005\\`ŐG_\u0000\t*qQ%2c\u001b0\u00111VV4B\u001b^|\u0019m\u0002\u001biUZWRC?IaUyoM\"E\td/},E \u001b[\u001fJ>Wu\u000b\t\u001f3<80߷\r4\u001c·5:@>(\u001a d\u000bCP1袢Ʒ,.\"1\u0002?l/$\u001cT\ry\ng㽃\u000bN\u0004_!\u0011$\"\u0012\u0014`GTr\t:\r\u0015\u00116D>k\\\u0007%\u001e\u0019\u001eG\u0010\r#Tx\u00138pI\u0005ċ\rR*\u0012\u00072\u0012YIMFU)\u000bI\u0013\f2VHYr}e\u0012ȹ&\"SZ_=!G\b\u001d\u0011KD\u001fT_\nDY#\u0000\u001e\\\u0014T3UmARU\u001a:\t\u000eoa\u0014\n\u0019!b`sL\f0\u0018͹!\f#4\u0001))j\r#\u001a1NKւ\t@\u001cż{)\u0006b!v;\u000e\u0000\u0007C\u000bM2\r\u001cZD\u0002<\u001e'ߴUB\b5N_i=4z>%X2I&S4W/UZ\u001f~,\u0013T^%\u0019XO\u000e\n\n{P\tY\u0004\ra\u000bl+\u00037\u0000Ô\u0001Y(\u0012|\u000e\u0000\nC4*\u0015\u000bN,t\u0019G\u000eTyȳ\u0014\u0015R1\rġv&+q<y\u0014u\u0019\u001c\\)+0 G\u001aOY)&\u0015ݥiQ\rd\u0011JiYx%2A@\"\u0016\u0012+\u0010.*5DJ6pEEG!D)\n\u0003ϸu\u0000..{I5_~\u0012\u0000qn8\u000fn\u001c9e6%>MS[2\u001d\u0010\u0001)(\u00071P@$^\u000f\u000f\u0016^/\u0018F$&;Er?\u0005f\u0015\u0014\u0001'R$K`yɣ \u0014̮\u0004G)\u0010j^\f\u00075\"TRp\"\u0016\"zNl\u0010{Z;\u0005V\"\u001c\rV\u0006Lje\"9\n@B#?P~4S3\b!\u0012fiv\u00135\u000e\u0018\u0007\u001e\b+\u0001^9\u0004\u0016ޯHoo\u0015.4\u0014JZb*YQ@\u0014ӳP,)''tBp̴Bv/Uҁ\u0013\u001c\u000bQ\u0006 ï/\u0000\u0013Z7ܧTh\u0006}uǠ\u0012<\u0016\u0002[w҉\u0001UN*\fF\r'wë'RcFi\u0007lrSERNl`ꎾbo\u000b\u001fDR\u0013A\r\u0007!\\r\u0019l\b~Kd]2\u00110 \u0003@W/\u0015]\tX߰\u0017i.*(,|wrKo\u001c\tщ\u0018\u0001@\u001fP\u001cA^\u0005^\rҵW\u0006q?\"1m\nTP`l(X@4&\u0005{>x̨6\t\u0003?kb\u0002\u0010kᥙB!S)\u0000Y1\n)5!r%L$\u0004#}\f$ID(j:\u0002\u001eOÊ\u0015\r-A#zcw1hT˘W\"胉`\u0011Z!\",$\u0005kvJ?b#P|b4\t3EdLɁ.>'!ba\u0011\u0007*)T38*8 \u0004Lax\tK A4\u001e4a\f2`qB%F!\\\u0007r܉\"\u000f\u0000\u0006f\\\u0016S+1e%]\u000eoGs\u000e$\u0012A\n-5{\u001b|\u0017;6\u001d\u000b\u0018H\f6\u0018x3\u0006|A7g̚aZ(\u0016q\u0012K~Ӽ\u0004\u001cqb\u001f\u0018\u0017\u000b;\u0010tDE_c\u0005R0ٌQ Ľ.fqLD@\u00185Re'1&\u0004{pLtf\u0013lJl\u0010\u0004\u0011)\b}VeH\th %݉0\u0001b\u0002C\u0014\u0012\no/\u0002\u0012\u0012\"\u0006a\u001b\u0012`z~H$h\u001byFx\u0018\u0015e\u00112s|\u0015N\\@yQ Y'\u001d\u0007\t`\u001aq\u000f\u0003F\n\u0015\u0018\u0001 \u0010V \u0000s\rfHuA|\u0006*كa>}j\u0000IErʬP\u000f\u0002ב\u0011]\fקM\u0005\tBbc5R7\u0018\u0014Ԏ),*t\u0019F\u0000\u000fV̐Ѫ@>6\u0013[\u000e'Y\u001c\u0017a\u0016?|\u000ed\u0010o0?@\u001eA?b`ثDt\u0004J'WXroIdipr@\u0005)6\u000e D,SP*e\b7\u00149qO]\u000bL\rɮ)!\u001f|hDTݜh9\u0001$Mq5KU\u0016G\u0018ݙiW84fM(\u0016bǁ\u0002.(kJ:p\u000fR5EL8\u0006\u0011&bLC\\,D`36g1\u0003@\\\u0017{\u00150\u001e:N\"\u0001N\u0014̗KE4+\u0000\t˶qLf\u0002a\f%\u001c%\u0014\u0019*/|EDE-\u0000v7^Rl\u0013WzH.\u0000\u0019IgR\u0005Dp,\"\u0002i\u0007!B!\u001aM\u001e\u000faMLR1Uq\u0013\u0011~7mU\u0017\u0001\u0019\u001c\rq\u001dW>K2՚[x(ʤ$&a`\u001fԎ\u001e\u0012\u0011ĥ@S`?t\u0005g.v**\u001e\"1v*B gfF\u0000:\u0005[QVn{_Ԟ]lU\u0010E\u0006&km\\\\ˮ:\u001b\\i6W\f\bp\bs[\u0005\u0001\u0003-ƃxPz\u0019م:hHVK.ꃴ/\u0000f,\u001fY2-ZŌ_x\u0002&\u0015\u0016p/\u0001b\u0006\u0019V8t\u0000v/.*2\u001b\u0002.5Pp)\f/\f#1[\u0010:.|Kڻnxck~\u001a6\u001dl;=\u0000*\rUQ맾?o\u001eL\u001bɻjy~6-z}nzI:ߺ\u0016A\tuTUJn~_eslS]V?39xq\u0002ئ)\u0004'@\u001f\u0013<?M)猼?/gdy3!Dm?_I~l\u0012X\u001f1i35?NoM\ri\u001f\\Oz\u0013,o\"c^^\u0006+۾E?}{K״nW})\u001f?\u0015_l6m*yuBF9;`\fP?E\u00154\u001c+\u001fږ\u0000a4\u0002T\u0007Qu\u001f\u0019\u000e*\u001cHBR\u0000o\u0000M\u0012\u00045,S@V\ttN*\"a)?)1DP(\u00154,|?G\u000e[RإwiI,\tdX$\"!\u0003u!yKAer!:!UܴTIa3*M\u0018\u0006Zҝ\u00147p)\u0007V?h\u0016>fI(E\r\u0010Ϗ̭@\u001b\u0006fY\u001aNIU\u00191))<$\\},l0_\u0015FDD!N,~gY6ՎA\u0013/a0\b2iK'3ЉqE\u00052m\u0019$G%\\@fܐh_ΝT)lI/ن*:8fQiGTn/鞕Gmn\u001b\u0019n_?@VAC\u000fX\u001f\u00058b\u000fɉ\u00013ĺ¥/\u0015\t\u001a8J;+\u0006@%l=]$WK\rb٤~L%I1laV\u00059\u0001\u0005$\u0016:\t\u0012WA\u0012u(\u0013]JR3P-Q6?V.-\u0003b.PfY0:\fR.K\u0016_rs}],\u00111B25\u0007\u0015JFB^\u0005it&VfC\u001an\u0005\u001bt;L\u000fYR%>4\"\"UU\u0013﫼-\u0015(\u001el\u000fsX\u001dlN7\u0017\u0007({$B/HiOPE\u0000ay\u0019#S\u001e\u0003\u0015XxXM?}ɮ5ڡWB\u001a\u0001C+Gw=~&>S\u000f}BcKf\u001a\u0001C\rY0<.67\u0015\u0006]\f$[\u0005\f\f\u000bs\u0001bϐ$b\u001ej7b_\u001emN>*{PYFe=Ð\t:\u0014W!Z\t\u0012\u0016H\u000f+Rq^4r5\u0017Y^x\u0001w'5<J\u0000L\u0000(`m.4F,yZ\n\t\"JW\u0012\fR{!\u00023\u00113\u0012iR5o\u0012~A\u0012˔TE#o/\u000442+UKC_(\u0003byRӪ\\\u000fK]\u0005)\u001f̮2t$fEacȺ5Ά61);<1C>ju\u0012κ\u0004}Fˣ/\\DƁ5f\u0002κ{@˼\nlR3bde-4Z_\u0018,Bѷ\\Bb\u0012w+\u0001m$e:h\u001a\f\u0014622g)N$&cu\f\u000eh\u0006ȔN\u0019S4/M`\u000e3\u0013i\u001e-L&nYq%E \u0017Y֞B\rH6J=L\u001d\u0019^gi\u0007?U|#-$\"s²v\u001b7\u0007g\u001dUe\u0017-\"J4\u0005\r1y\u001aD\u0001ʴ2}\u0010\u0014MzE+Ӽ.\u0010pG\u0013.2\u0001/d>W&\u001d|.r|d\\7ԷwRHjﮐw\\&0E\tY\u00143Z\u001593,\\YL/E\u000ed\u00048`3텎LtP44ư;\u0007s+DkdhE#\\3\u00156'}އ>ǘ$ѐV'\n1 \u0019/\"K1H-%@\bgm\\k)\u0004P%<z.F6<\u0012*Zp$5s\u0003\u001cdyذٌ6l+$F\u0007\u001faI3\u001a\u001b\u001d:S\u001d'\u0018[@2jԿh&x3\u000fXy8\u0015Eڒ\u0013G\u001d\"\u000b=4+7T\"LQ\u0005W\u000e(:9\u0006,\u0010<`K\u0014Es+\fx\u0010rs$5\"\u0017YKU\rO϶ik΀Q2MO\u0019PkPhbHS %)AW×Ƶ2]\f6s,I\n(%GxK\n6sHxEq.\t\f\u0013A%Z$9c\u0018us\u001bۣmU)*{\u0003JT:C7\u0015M0ʃ\tIP\u001b&ŚN\"ޢ y\u0006\"+5\u000e\u0006w\u0002zvW`Tw\u0012)\"X'\u0007\\\f%4`spfZj3m<7_\u0016_7\tVr\u0015L@\u0004\u0019\t\u001eiL\r\\\u0006l/585[jg>\u000f}'g\u0000SV$m\u0017BTGRg e^%a%I#)\u0013MR\u0019_\u0003Ai'5\u0017ㆉ\\;\u0017f\u000bz\u0011Yy-%Q#ԏU\u0011%:_\u0000Tu*e\u0002dFukIU0O-UJS\t5:@87u*e\b\u0007R#\u001bÓ婪N\\2a\\O)\u0000 R.Sbx՜d$>WO@ O)Sl]D\u0016Xz%09^{gwx<\u0014)j(x|`\u001d&;eUqZa62t+\u0005TVHQ\u0007!Y\u0019z䴀J#IENԨU.컬\f\\c\f%ɆV*}N%𜕍SɋxY\u0019:ԃq$\u0018\u000fm\u001c\u0000\u0001\u0005\u0012\u0013eg\u0010է\u0018ğ\u000b4\u0014ex]h]SzO\tja&S֧\u0014PO)TZ¦z\u00132dR6L$\u0010߲<Y\u00192:Ƨl)eZ9+C\u0012\u000eP*}n}J\u0015;\u0010\u0014Eœ\u0003Do0+0ԋ\u001a\u0017XlΠ:|lJ\u0001)p*5;\u0014ٍQJN-\u001eXOp\u0017t\u0019@$(\u0017W\u001daLHj8:!J\u0002[\bڼ\u000f\u000b2czpscuF\u0017a`dEJڸ^$ߔૂ\u0014y̬Ի^\u0012Z8\u00029_.ܓYx:TeNLv\u0005\u0005F\u001fג9\u0003Jk\tj\u0004\u0011Po7To2\u0018QmkVRz\u0019-\u00068'G\u0015\u001b\nw\u0017\u0016*C\u000bU.U|Ğ*$&XW;_1Zٗ7gZMzfJPޥ\u001ePJކ\u001cgj!!5*2$j*'uz/IÖ\u0002$D\u0007O\u001d|\"\f}%P4!Oj~Q\b2p4R- 4*SX#ÖLuyJ=^EWw\r\u001a*t3rJ_ٔ'I5\u000f$p\u0010_kC#$\u0003\t'\u0011\u0018:\u0017mC@w^'\u000en~\u000b=m$\\u\u0014i\u0016M-tQ\u000eҬJehWuI%KD\u00137緫p5v#\n+PLkA\u000e@HB|2U$S\u0014*\u0003\u000fL{x\u001a\u0017\fS:'>SA? ȱy\u0017D.%B\nx\u0016.a\u0015\f\\08\u000b1\u0013\u0019Q.6\u0014R\"fY{ET\u0001\rnLk\u00023O'\u0003\u0018;W\u000b%EXZ\u0017af|uiZ!j=rxs8\u0005S\u001a\nE{<\b\u001cI\u001f\"e\u0014I'+܊m\"\u001fL\u001b눷0Wɴ\u0016,L3}0N=k>/QE(!܇PH\u0011\u0004\u001f\\\u0016LBgא\n* 5%2E찓S\u001b7wRqŏ4Bآ+mǙ('%G6gKW@\u0007!#\riJ/P\u0003=V-\u00028]*\u0012\u001bPR\u0005i]jt3ČQ\u000b\u0005\fT6\u0019{\u0017&\u0010)E\u001bwKw\u001b@H<Q\u001e\\(I^\u0001S['7Fxɨ#n\tbH \u0012ԥ<\bwhHqP@CN5\u0007qo3\u001fx\u0004!Z\"=:j6f\u001e_IuwL\u0019FT\u0014<\u000eJ2^uW\u0002bpHZI\u0010(vRn\u000bHYfu\u001a׉)M\u0003\u0001Q\u0007Űa:\f63:]㹩\f+QLS\u0019\u0011,$4o>bi\u001e\n~Cg\u0005dCӝ$K9ܱnZvT\f8E\u000b\nN\u0013,A\u0005B|D`c\u0004|Z7T\"F\u000bH,\\'_\\r\u0001r\u0013\u00148hYfм\u001d(ZK좃\u0003\u001b\u001bk'@T*\u0015$4(\u001d{\u001b\u0005zL~{;\u001a\u000bz9u|\u0007>vO|=4&%ŗysiP~8%\u0002\t~bGp\u001aX\u0013 N!ZAũ;\tsk&fl$&\u0012|5RE\n6\u0010n\u000f(\u0017P\u001bnI\u001ev߆ЄP\u0007%x&Fe<dc\u0007\u0013d\u00192\nblE\"h\nIy\u0014#z#AS\r\u000b\u0006\u0017\u0018ֆ}\u0011\"\u0015\t1\u000fcX*ﬤE\\\t)o!zb\u001b{z[J󃧒dnS`D\r#\u0003ܩ6lR.DK#ܾ\u0017Z\u000b\u0002nZjSE\u0004bQ?! l$b30\u0012\u0005'0>DJMQ;\u0016To\u001f\u001cT\u0001\u0007NvjBj$m.i~\u0014/I&`5'XᴕHjXw{,En\u0017֢\"D}Tz;n=6SӒ9\fB\u0002W!hbY;yڢ(ڭ g%ކx'Y\u000fܡ\u0002h)|\u0015\\ޭ.&-\u001b.\u0012?\u0014qxsBR;3!am~\u0006\u0011t/6k\u0012m`\nݑ\u0002\u0005O\u00145t5\u0018ƩtT \u00119\r\u0012M|\u001c~n}T#Nź8\u0015T+NźnuSq*\u0015\u00127L|8\u0015Sn*Nź8\u0015S\u001bb]7N\u0005U\u0015\u0004}Hm}uSq*\u0015bTu8\u0015a\u00145qSq*MũXWJ0)Ʃ0BuTSn*NźTSn*NźTSn*NźT\u0012bTu{ũX7\u0015bTSY7Nf8\u0015\u0015b8\u0015MũxR\u0014\u0012q*6SQƩl*NfSq*6+N1uɖ.˦TlGͦTl6\u0015IqJPT\u001aSdkC\u001eq*6SY7Nf{ũl*NfSq*\f,q*6SY4\fD^q*6STSTMTlWJP6STl6\u0015b8\u0015\u0015b]7Nź8\u0015Sn*Nź8\u0015Sn*Nź8\u0015Sn*Nź8\u0015;\u001c)Sg[G;chlNN])Rur\u0013㣷uurɹ=cܓbSc<z\\t#w{H)<\u0018\\@C'og+x[G'\u001ay<ZI%{C.tro?u)jo؎NnݔNTN\u000ejG'i\tA<N\u000eҴNN/ybܓ:SN>EZS:9\u001cNα:9G\u001cԄԎN\u001e̴%:yv^'\u000fV\u0014P\u001clZ'65R\u001e:yu^ܔN\u001d\fuhТjGSӒurNvsIbܫ5N\u001e-r3N^;+]jrW'\u000fcv7]j\u0007+$M\u0014oz\u0004C'\u000eѾT<E=1\u001dtr\u0013`w\u0000#눔?3\u0013  mq'Ef=n\u001d>\u0002\u0018I>NK\u0011\u0007%yhQCޛNE]ߑF\u0006sPq+#>\u001eZ}<fyT\u0010\u0007>\n\"<ר@U}\u001c$#ؒ`Z\u0018\u0004uNQL\u001aޕ\u0003oǵ\u001fI\u0018\u0002u\\ʴuI\u001c6Ӹ\u0011AG:MF\u001dwJ\u001a׶J\u001bu{LڨN\u000b`!Zui'\u0014yg:޸0\u0002x\b\u0016BOZmܗ\u001c&k0&OdCm<zm<o\u0012:KB\u001dP[m<\u0017pgP6:\u001b-;nccT\n\u001a:q36(\b\u0004ƝZ$5q\u0001\u001ecOR]\"?S\u0005F\u001dwL\u001020[8-q\rQ}1FOjOD{\u0004\r-f\u0016~[,mq'EYHJ(:\u001eP:\u001c6\u001a\u00168N\u0015Q6ڸVeN8U;\u0003}U\u0010w%u\u000e5qh4S\f\rc\u001a\u0005\u0017~$\u0015L\r\bi<r5<cEU\u0016)^\u0013J^5k\u0001)\u001bj5q\u000f0\u001a{\u0000R,5ܯJ(\u0001\b4q'aCThǼ4+*i֔L\u001bMiI\u001bM{Ni\u0006\u0018\u001b\u0007\u000fSݤq`\"\u0006n\u001a\u0003j^i-5\u001d|\r\u0001L7!X;\u0010mt\u000eXzyjP\u001e)Ӛ\u0010K\u0010KM\u0007K3CJj[R\u0018jR\u001b.\u001fg\u0002.1\u000e\u000e^W^u&%E\u0002vi\u0019\u000e`W1\u001a5d=g\rb]3!S,$\u000b\u0018B\u001b\u0002|$Vk/h)-`O\u0001^\u0017+\u0014\u0002vI9v\u0013i\u0018ny?J\u001c?(EL\u0007Q3_!\u00142~A0!\u0010\u0010.!E-\u000fel\u0010?(36~0i_c+`ܛu-\u0015Jg\u0014>ԛ\u0007\u0013vJk\f\u0010v\u000e\r\u0016\b{Rv5<?hX肶\u0013\u0000Hjs3!p-J/Es#P\u001f\u000b\u001eFZiF\u0010K9H\u0007W-U\u0018bR\u001aj\u0013\u001e\u001dW-\u001b[$F' o6vsN\u001b\u001fƉ\u0017\u0007\u000f\u001ak\u0006\u000f\t\u001e4g\u0003a9A`C\u0007[\t\u0007FoXeSƧ\fg[\u0013\u0014>kނ1Ћ\r\u001f4r/7\u0013Ε.{{4ӟ\u0006-)kMqI|/:Q\u001f_k\t\u001fLDmc[\u001am=<er:],\u0019<\u00062Ch;E\u0004H\b\u0011$T\u0004:3\u0015=h[ITXu\u0006{*N\u0016\u0006\u001aT,$xAz*況o w\"X\r&\u000eΩU{F|̽W#\u0002\u0004\n)\u0017&m0\u001a!E\u0012EKGV<1^\u0002\n\u0018yᦑw$9\u0012\u0012[D)\u0012'\u001d\u001a*ğHE!4\f\u001a1U40&nAjIbz\u0013A`Lk2\rɍM&КRK])^P\u0011q+=\u000b&n$fKH\u0018\u0017|,Md7u)Z5d\u0001\u0017\fXf\u0013PѧyrޞܒB{rKm\u000e\nڊ3,^\u0012+õ[\rV\u0018, 1˺C1\u001b\u001b*lgx*MS\u000b5\u001f\tQ\u0017e\nk,0̴p\n[jê\u0004+R5Ja묀gk\f\t\u0002\u0017\u0015o/X\\=tݼ_~w\u0013M°\fDD,`kv^BN`vFGjЬ\u0011Kt\u001a;*G[7\u0003GE@\\t\u000bފ\u0010.\u0011>آ\u0007\u0018\u0000\u0011\u0007\u0000ﳟ\u000bs\u00179a\u0012NB6\u001216V8ԐFaAXa^<b4M\t>\u0004N\n54[B}ID\u0016?,\u0017!0*\u00054Te\u0004VRL5F\u0016Y!{uP!K\u0013 \u001c/aH/\u000bf`*3\u0019\u001aL];\u00170\n%\u000b\n%%\u0000u|ن\u0005Տ\u0018\u0002\u000er(z\u0014\u001eJO\u001bܡ\u001a\u0011DsA\fܖKy\u0013ؽ\u000e٢3|\u0018̣\u0001\n:e\u0001\rQ@GS!\nz_\u001f\fyX1h*\u0011й<9\\ܐ*yG;\behqFӀtʁ!&\u0014ACmCAd\u000f{{<\u00041{\u0003\u0012\n2\nMJj!\"puGeE弉 \u0012*jjb\u0014UB*M_0%eTsK1L(\u001cM\u000b 0\u001ao\u0012̜\u000bI6T\toBD\\6\t\u00165\u0002d%=\u0015\u001d\u000eK}\u001cn\b8nhCj[\u0010\u000f@R\u0019h.\u00028\n313\u001ap]\u0012\u001eo\u0003vd&p|\u00011K|lNͩ.xĬ)Y_Q%p/\tJyڵ7wbp\u001e\u001cn\u000e?+ᜩ@w\f\u0019ff\u000f\u0012{ؕ 8rs\u0004\u0010ʉ\u001aZx\u001a\u001bFo/+'vﵴ9\u0015qt28]\u000bٺʧT&\u0017\u0003\u001fʚnĐ\u0001ѽ;+B8\u0013\u0007\tѤ!%JJRtgބ+)\tK]':+\tY\u001ap\\zr\u0017{ܡy\b\u001aN-ϭ\u0001]v@i%i\u0010\u0014\u0018^P:\u0017HwynP$\u0018\u00196\r\nendstream\rendobj\r259 0 obj\r<</Length 65536>>stream\r\nnD}]\"%\t;\u000fkMlrҨcXs[|tYf\\\u001aU1IηOw\u001cx껝&prPZkBzhy\u0005*ViM\u0004}/9o/h{U\u000fDz4탟R4t\u0005o0/YrfO\u0004J\u0011`.כ\u0014x\u0019iҌa,M~I3j\u00006.'N^~/m'ߊ?yso7f\u001fVԷ)r|x\u0013Om{>$Ⱥr\u0010yA`3N\u0017/Aw^l\u0017x{'VkGo\u0015v7\u000fG\u001bΦ\t')^x\r\u0010x\u00035vR\u001cnxw[ߧ\u0013+ߴvC>ּ%e[\u0005\u0007ۣ1VMk/]ѶBGˮ\u0017F]\u001d\u0004_[#hazm*\u000fhHl~\u000f<3dɢ*x\u0015t\u000f\u0005C\u0005It6<O7=hZd\u001b|p#w'\t\u0016\fyczsmxm޴7Xh\u001fMm>ڨ>\u000e7^gl\u000eڢ\u000e\u000e^l(΄ti\u001dvKg;Mh;7Y\u0011Ig#Mh#}T`?MOw\u0006<5-{.\u000fѕ3K5|?w\u00164;0\u001ez3M\u0019L6/oWGimv}s'nxϭoS\u0015bi=$(=s\u001fLmjy4\\\u001b,GW'?nD\u0005_?7sqKHrys}ύ\u0004W7&͝cJ__\u0019Jhշ\u001f33>^\u001d\u0016&oz׃Id}09?䯋hzz3\\Ӧ\u000fu8ӳMOf\u0001\u0007h*2|\u000f\u001fnm\u001d{<Qt[\u001dqӏ\u001bfow/f{kjC<se4Gi%@hu0ifE\u001e/4X\u001bc\u0003^\u0018\u000b[eNwK7\bFX{\u001e\u0019i\u000fFꞩI{W\u0016&\u0019\rj\nV\u0016\nʢ\u001d>\u0004\u0003\n\bǮa\u0004]\u0018\u001eRoO+ov\u001d|Z\u001e|\\f\u001e;Cz2\u0015r|ye;E'>\"{8t\u0019eǞ=o\f{陞\u001f3O\u00077=\u001foe\t\u00130?u5`^J^\u001dF묿Bz&+P:\u0007\"]\u0012\u00185\u0007|g_`Ϝ\u0010lNspr[\n.KM\r\u001b\u000bhP\u000bgnn Mo7k^3w\u0015`vf~\r\u0013д98©z|޽͞4\u0011\t٢43zk{dy^\u001eEo\r>\u0015\u001aݝxk(`0޹]^ooU\u001al\u0002$RNB\u0016ɟʍ=Av={[\u0017t'U\\fWpO\n\u000bˏ;oǻ5}n~2S;H\u0000_讃?_TiU\u0006?7/\u000e6i\u001b\u000b|m\u000b\u001bl^eUg{~/ԟ\f\u000f\u001eG\u0013\u001923t<\u001aLN__\u0018wwvGt{?ol\tq>{;Syg-8\\\u001d|y>i;w\u0013=\u001e\\}yw}]\u0002ic\t\u0013݄FK_#^\u0018\r6׿ܐ}1`L+;\fv\u0019#_/\u0007\fK1Ț=\u0016\u001b22)CL/m0M0\u0016iw\u0011t\u001e\u0007KO\u0002*ۛG!\u0000Z/S!\u0018d7>`\u0007\f_ \u0003\u0006\u0018-\\#ѷ.Isg_䏕-;@\u0001?!t\u0007G\u0015b7c\u0016B\ti2$5\u0006\\WN\u000f\u0018\u0001\u0018d~ \f4(u\r=8\u000eP{G.Væ\u001f*cx ?\u001e=\u0016\u0007KG\n\r<$m<rOGO~&#M{{\u0003y><`_JN̾xY \u001e{e)\"LMI4V\u00009`\u0007c\u0001b9!\f&;By.E&yzi\u000e\u0003\u0006129`_\f@L\\q4~,\u0001\u0002)Y-\u001e\u0003\u0007\t<_JeFDWr\u001f\u0003f}\u00079v\u0017;mto\u0005\u001eju\u001cp\u0003q/fQL2W|Cv}\u0013j2Ή~\u000eC4e\u0019y(A\u001e0A\u001e$|9\u000bP龝Z\\\u0004\u0005F\u00056*\u0007\u0007;\u0007\t5_. p78,bEic\u0018PUG\u0005%\u000e\u0001A>\u0017(N\r*yp\bEi'[\u0001\u001e05\u0003<Șr\n4~Ð$R);Q25C\u0002b\u0012#A\u0001\u000eAJ\u0017\u000bYLL-\u0011{*\u0017\u0012Q\u0014vO\r:`\u000er\u000ew\u001f\u000fr^XUv\u0002db#@]P4`:O;>@>`\u001f\u000er^\u0018o E^cgc1{Oհc;\u0007?[AN˗㏙=eEf_N` D\u0001~\f ߞR~v8\u0003\u0001\u000e9AV\u0017\u0019sYMQK/,T)\u001a/.F\rlo{\u001e\u000f㿚=\u001e|9JMQr\u00076wCgT2)N8<\u0007_\u001f\u000frZ\ns0q,mi\u0017\u0001æ8czX\u001fp3\u001ed|cTG\u000e\u0003x\u001aa\u0007y.?kEG\u00130fp\u0001{<`7{>\u001an\f7;h4o(>\"g~}:-GIp0~{Po\u0013\\}_6csV:K_=\u001e=\u0018|p9ۛqޕQDCҮ\u000f\u000f'*]_YyZ_ȯu&\u0012I??Qo\u0007]\u001alջ~S&r\u001d<Ǌn\u000eI̥a=e\\NL[83\u000f7kzOr{kS~=E9dK*$i\u000fqPe\u0015${77?i5'Ǐf\u0014M/o\u001c㮝sJ<3o%%b\u000f<UnC^YgeEV\u00146{FvyիNoC,\u0012Τ3\r\u0018\u0016з;[Y$^ڛ\u0019!kf6FÍO8\u001b\u0007W?jP=!5{pp7|\u0001ӝU_n[\u00187Q\rѴ\f7*Nz+S>ͥϳ\u0015Zk\u0017^OӾ&*\u000eWC>f&'E\u0010\u001fOoiF/OR#};7Z,*\u0003ј̰SҔf<}\u001dV-_jv\u0004ɿ\u0006-ӿb8}\u0005Ohi\u000f&W\u0017Ѳ}LՎ.lnGݍp\u001d+'\u001b\u0007Vv\u001ak{?\u001a\u001an\u000eHs\u001f\\Ø~ӣM~vk4\u001enodm_EmVr}1 d\u0019\\\u001a\fԿݯ/fg\u0013SO\u0018p@b{`/o\u0003\u0019\u001c\u001b?`v\u001bow\u0007W\u0015viM}\u0003!<ߙG\u001a:>wxOoΠ\u000e}\u001f{o\\OEBd͋DC\u001f4:Hl[$~xū/˲6Ry\u00017\u0019o>{g\u000fۻR\u000b;`\u0007\f\u001f^2\u0007{d7K-2蕥͝\u000f?J/b_r3\u000bCKwi\u00000vP[\u001c^HgѻK{5{~_O;Mkui2D\u0001\u0000$\u0015\u000f.{?@/\u000e<d).\u001e5Jb\\U\u0007z\u001bN\u0006\u001a|ww|=\u0005ݍs\u001cf_\u001c~02:ҳ\u001d\b\u0015֨U\r[5w0=Gb]TgGW+7';6I\u000e;ͥ\t\u000eY/\f\u001f\rvv\u0006ҝU\u0000yv;l=\u0005/tO1ޘ֢<~3\u0019Dt\\C7^Yf`=x$p7,0c\u0012q~7\u0013ma;\bz\u0013v`f\u00069CʅeBM}\u0001\u000e\u0017w?\u001bοBhBMy!lX\u00124,nC׎\u001cZqMu<䠟\u0010iҶt_|xE~͊]i\u0001q.et+ʴ\tN?xJ~fm2P)kwх-1{-lȑq9Æ\u000f(i?x^pQS#\u0011WTEc\t0aGۍ]԰KiH]Ziū%\r\u00074u\t1mg:?ݪE,nJ\fΜ\u000bw6\u0013':6h{t&g{FzîgM`/E4M_L/eK\u001chfrYC\u001a/t5E{H]!xFJ0Eӕ·VJv=7>(vڷwFh.nղՎ=\u001a\u0015\u0011٨)ܾ#YڝBFA\u0016x}^^;szw\"zVy\u0016EomNt/z9Wԛ!\u0016\u0013ʪOGӪ۲\u001b\u001e-n\u001c,hYt[:ܫT=\u001antdݖvݖfnd>_w.L\u0004k\u001ai\u0017ZN=-x\u0014]\u0001p{Z)'\u0000{2􎜾rel$\u0016y,󩥅VnVt\u000e\u001fsgK%pjQ9R\u0012Z\u0007>1<?uL\u000f\u0000{$?7V#L!'\u001fƓ!< C[]:\u0019F~'{k{y4\\\u001b<?q`Zgxmw/wM_9\tPkK;0\u000bZccY7L;׍\u001b|/ڛh}2V>O\u0019sk9{}j}Xw\u0000D>\r\u0011\u000e7\u001co\u000e>fFw1䛞G\fpu^w| =<ع|@_rSI1\n\"|\u001bә?-?cck;\u0000[>\fCs;kC|_Gy\u0001_ɷ!~7k%\\j\n_`a\u0017P`\u001f\u001f\u0012֮~pxo\u0006u?j|?bY1We\r{\u001dȨf\fE?d\\/ywjIɰVl?jx\u000fc\nrK?\\}!Uԗ?\u001f\u001b\u0004\u001aT3GfQ{.h-:/M8Dg\u0007ݍx.,ucz\tv\b`3\u001cLzK\u0001\u0002E\tY_\u0018\r\u00068\bxxk~2K^G!4\tK\u0000';dg\u001dt9׷\u0013j\u000b\u001a\u0015Ufz\u0017È\u0017`\u0012f\u0006K4\u000fF\u000f<4\u001e\f]q~n+.Iz.wک\u0007Bﵙ-}P~ƣg{\u0001~N\u001a\u001bI\u0013lmixxwz2Ԧ;୷\u0007oz;\fj\b6_?$\u0012\bx;S]pݞ\u000fN\\;4:}wwg\u001e\u0007fGvD\u00139}{0cwy}_\u001d;v^gVn4j(覆\u0005v=m\u001b~08o_1\u001eXO휍趷;vp;\\\u0014\u0000\u001aI3D{nww͊s\"\u0014\u000e&[\u00032Y bWFQsomw;SOBr]\u001a7\u0007\f,#9\u0003ρ~c\u000b\u0002qXF~ܑr\u0007kz]\u0007tK!گq\u0005u\u0001\f\u0002twq3C^ginޖ\u001bNtem/}\u0015\u001c\u001fؤX\u001d>l7撹$\fO]\u001d\u0001VDW&vn6`4N TF\u0003Co9ۏ޶zTg\nJ\u0015\u0018ҽ>6h_-\u0013^<ɝ}\u0000jyfm4ܪy\u0012Llu}ߣ\u0012srnZ\u0006y]4'7V\u0007Kh.t|s^o}ff.\u000b~\u001e_\u001b(h]\u0016\u0018wR2\u001b_[l@4\u0011Yu`t\nf}غ7{wN}Q~p89+>d0vW\u0012\u001fWm\f?Yf{ȭ\u001fnaS[{)\\r\u001fOjdKh8o=1\u0013\u001c\u001fga~\u0004/\u000fƛ\f\u0007\u001fy^]Ym>GK3r*WVy\u0019pf:h\nƵ6޼\u0016\u0003;\u0017qq\u0007XXn>8;3\u0018d46f?{\\\nk4uTl>?_\u001d`kw\u0014\\6#Ms[eV۪\u00170\u000fl\u001cG\u000e=c\u0017G\u000f_<>Zw\u000f\u000f\u001dY}sы'/{q]?>?\u000eҡC'\u001f>th͟?H;95_x=8\u0017'\u0017[W\u0017.\u000e7\u000eAqn2L\u001d2E@~7uw_\u0000lZ?3Zf!sO뗽ٽQ?~j}c7ϝ?\u001e;p..\u001exeq{rv.o1oguTk1\u0017\u0017o 9|\u000b\u001bɍ+ru0uLrы_'/$եg+;\\-O\fS\u0018??=~\u000e\u001fr}rR]=z؛GG\u001f\u001f=8k/$\u00163~>;\u0013\u001fNuw_=}oX1{v!ۜ;rܜ3g\u0012l&\u0015hIӋcw^lkevc5}썻+YZ=<vqUWͱ;g玾zvvٻy9s\u0017O\\x2w֟Oﮝx)OO|5µ߲닳\u0017[.L\u001e\\<ܛ˯͓ʍ˻O+\\\u001dXڵמ\\?ys7\u0016ϯ<rg37qn=7|k t/9z'\u0019?\u0018\u0019<~8օ\u001f\u000f痞\u001cy=<sԝ37~{pve샍˷\u001e޼?{tλG^=9z8ןy<:'7N>~z|曧<w?R>gg.?z~lmf_w^\u0014s^\fzy\u000b^<9mƿWoOs#\u000fW\u001f\u001d}fGQ׋./oWW\u000e\u000e.\\{u:Ջ[uƑo\u000fzsڵlxaxѷs?]xwE»/F?~>\u001a]rҍO6&텕kgݛo[s?\u001d:l`\u000e.\u000eV{yV7w'Oʕlp@=|f#'\u000eɑΏKog\u001eMɾ::vci)w_˗f~we\u0013vNmvrW޾ՕO\u000fN9={d؍8\u000b\u0017gO,%\u0007̻wr{k2{b:8~ή,\u001cY^\u0004kz;s7/-\u001f\u0016(\u000bw|zzs\u0016t\u0017狥Go>zz';\u0019O^|kegN\u001e8?煅\u0013Ο\u0007Y|xq-7\u000eS\u001e~<r\\}yy郵+w6^\u0007\u0016ߜ~a\u001b\u001bnf$yǷ{3՟ow\u001dY?sOv\u0016Kš;ޞ~O7O?ף\u000e\u001e\\f=<tf\u0013\u000b}47ՓSs֓_g.>xz7Q\u0002qYQ,o>x3?0\u000fVW_|25]yp7\u001eݟ\\>r{\u001eاk{\u001c^Z\r^ݹƛ\u001bw_\u001fo?v44g֎\f3?\\w{׎4bcڭ7Ty{;N~2\u001eݺܸۙO]ͣ\u001f\u001f[)#g\u000eCko$?՟92õ\u001fV\u000e̟9=\u0018c\u000f:\u001e\u000f?=t3_$O|Ʌ\u0007N\u001dzݩ'ertvѱٛ?<5w죹͝'g&'N\"43W\u001fڥY~g]|2Id^o\"+Ny\u001b&͵\u000b&?5~8\u000b^\u0014.(\u000f?}|rbxN^\u001c;2<~ް\r\u000f_:sƓY\u000bo:aë?],|~D/^W[pŕ\u000fΥw/G=4z6|tΡ3'\fNtڱO\\{>x[ǟԟ[{O4rթ\u0007ˏ\ro\u001f=R,~zNjxF[/o=^:gK9ť޸>wȚ\u000fn.\u001e?<S<\\yJ>?l\u001e_`lKOnmxfw/wOxV\u001f6<z\u0017/̼<i/|n̝C=eȣzlZv/l}ܾ:Yѥ'o_ޘoFG.]\u0018.:?zKsݼsfnt*?b~>8w7NɉWg'.^\u001a\u0013OV\u001d~\\xp_}\t<\u001d=t#<>_ZǏ\u001eǗ~[;_.6/{\u000fO󗯜\u0018:><hx<O|f3GZT\u0015J߂`\u0000\n*fs\u0016ؘsgf\u000ft\u0001zfv|[ӭ\u0004ǴVFӈqgE\u0010<2:]䪫[T\u000fKdIlp߻Ah\u0007%'sԟ\bJ{d\u000bSoaZa,Z#`\u001dX#=qj\u0013pVv\u001aVId6tlmv)]x-j{@YD\u001fIᇼ4B\u0016YYJ[m\u0019TL\u000f\u001d}w\u0017\u000biW!w\u0007/&\u001ex_y\u0010\n\u001a\"\u0018\"l\u0011\u0018_4<u\u0007dF\\\u0005Km\rEn5\u0012mt\r\u0015\u001dtzF\ft*_f^MX$>7_l\u0015bNIN.\u0007\u0003\u0003;1מP>`@j\\aK0a\u0007#zg=)8%@IIBʬK\f濃l'\"?\u0011r\u0017gQJ;\\ևv/U;\u0003φ\u000f\u000eYkΝG㡮Odv՞K9)׿3y\u0019zWA\u0006'G_\u0015[}+\u0018z-\fYlV\u0013\bTmS*\"\u0002,U\u001c\u0014\u0019E/L\\Y\n\u0012GLYk,vn[\u001cv\u001aW\u000b\u0002\n~n<\u0002F\u00104\u0000\u0011M?#\u001cZ_ݲԷt\u0017ߺ;|nhu\u00147\u0011[7\\ap/<I{IN\u0012G\u0004Dpt\u001a)߹\u0001,c9%7)=^m\u000e\u0005\r\u0000ڛ_\u0014*Gcܼ]vߡ0q2\u0011\\XW[Bl\u001e\u001a\u001d\u0005Պcv\f:D\u0017Hd4\u001d\u0003\u0001[%r2La\u0018z&O\u0002+i<[]c~cO=_Vyw\u001c\"ptz@u\n;⡭dkHɉMD)d?\u0014/W@͗3ޛ\u001dxխ1]Kkk9TW\u0005?s\u000exx\u001e\u0015D\u0015\u00063~\"x \u0010RC'q\u0013K+ǵ\"\fm\u001f?ÁW|Iw\u00190(_M\u0013'Uڟ_K~\nO>\u001a\u0007ήiՕr>o\u001f\u0019m\u000b^ʔh+k\u0002>vfY\rO0g%'Ml\u001dtwB\bV ]5\u0015z\u0010Q}rcW\u0015K[>KVP;\u001a\u0002HS^I\u001am%Bf\u000bmsGߌmǢl\u000b'\u0015\u0005Kԟ\r&+rB\u0019qT֯Md\u0000l\u001c5D2q\u000e6c\u001eT9\u001b?q?񀧝@XgFy@s5\u001cG)Ui\u0015[\u0007˒7\u000e[_6I5\\{ձ\u0002\u0019\u0018_\fI!\u0014юPԤ\u0002#0\u0015`uJ\u001e\u0006\u001c&5o\f%\u0018=}T/\u0016h2sԍG$֮c\u001a*4t`]_+9 M1A=\bc\u0004\u0012tߏ\\eG\r\u0017p\u001bq\u0010p`벶j\"/\u001ff'`\u001fD;qd!Ik+E[0r5S\u001d.،V\u0011[['zI\u0012u\\)k7؇qKɟZ_f\u000f\u0006]Xedw\u001d\u0013ܺ)+ꂷ9\u001f\u0000\u001d^G\u001b^O>\u0017jUm\u0010W\"J0\u000f<\u001eKA\u0017^P̨(;)և\u000fY\u000bnQ\u0019a\n[Ť\u000e$\u0011h<V\fE\u0011_\u0000\u0016&V@\u0017T\u0015j^\u0015{5}!\u0001\u000fP.\u00195\u0018\u0018O|o~іW6\u001a\u001fY+Ay\u0005SyշOҴ@qr0G훠\u0000k@ՕE>ZUb\u0019E1瞧(fχR?bú'(^s\\O>\b\u001bE\u0018\u001d\u0006r}]\u0012\u00150\u0004zOu?$᝸+LL\r?8{-G\u0017{[$Fb32Xi]P8nfm'`\u0013l)sN~K~}\b'ܨunM}s .ijO\\9\u0002G)|\u0010YZJ5y6yK\rk<1\u000e5C3[?[+kdS?)M7\u0015*yp\u001a:~H_\u001c-E[)x\u001bGo7\u0005d\u0011l\u0018}$ӝA{vGyX\u0013f:\u001d\u001b2\u0014;Tjd;\u0016\u0018=a7 \u0003Xյ߆&e\u001db\\\u0007\u0003ޡZ(՗^]2nb@k\u0011\u000eos\u0000\u0019g]!EH#E\u0013\u0016Uuz֔-iK \u0016%_rC\u000b)r:!oեt0u9\f{\u0003X!Z\u001b*\u0000R\u0005B5\u0010JmV\u0013цk@;2H<\rlpf\r\u0007JQY\t\u000f&sjT\u0003~h\\/NAg\u001deZ\u0017U\u001fߺͩomqA\u001b,ѦAK:|`\u0007㠂\u0003\u0004MD:a\u0012ϭ\u0017\u001en=D$\ruU{v:Sb\u000e奃V%?\\\u00153R\u001du[qΑ\u0006\u001b~\u0010.}򥘿\fϠ\u001f}r\u0005\u000fspc)11 F\u0010*3\u001fqG[I*ՎVm\u0019\u001b\u001d$Qȣ\u0016s!_l\u0013P\u0012\u000e=\tН0hVgWvEm^0jObn.;ک\u000b$!\u001c qs\u0002x\u0016͊Na6r)^\n'Wøֿz3]F\u001e.R{\u001eӅ/\u0007r!n\u001fz\"\u0014\u0011Oз\u0011.8\u000e]\u001d?2o>ŷ*!\u0010r\u0002:XδTn~6ʡ\rVS/jG8(%3\rYKi/\u0004o浺L$(O\u0011j-\u001c\u0006Iv:عޱ\u001c䥚}\u0003->ZRe\u001ceGսj&Lt5e~\u000fJJ|ŷz]߿O[90#}\u0002֮NT;oY9J\u0007쌿˻n\u001b\u0018<un,_p!\u0007TT+k%W-݋gTɎ\u0015ꡗdþ]F \u001e\u000e\u000euGZ;Z\u0012\u000bJY\u001csrGN-L#z\u0004Id\u0011d\u001f4\u0001G+ٍnd\u0019OY.uj'c.p^z_ђ]'UoJ\fY\n^'!4(cpl[VbO9T'K\r\u00157\u0007жPTyp\"7stb<[3*Gި0@-]S/\u0018Z7#>%\u001dV\u0006(hwt\u000e]0$h\u0007\u0011UNh^\u0017\u00127س\u0012r^\u0001-6/A+\u0000\fn\rZnfuwz瞰2\u000b$m\u0006\u001aj/ML+p\\n\u001d\u000b{\u001fEuZ=rnŒ48u,qB\u0007ZLqs}\u000f\u000e+\u0018\u0019\u0018v\\ A\u0005\u0012{Bun[\u00196i-Qk6ll͖BQOUj\u001dƦʹ\u0010~k3^i\u0017s\tn\u001cސbchWC\u00163*&\u0007sވns9C\":1\u0005Ͽu\u0003Oh\"hH%읮뒣2\u000b\u0019$\b\u001dfbuM df,o1}ƞv\tb ]\tz Q\u001eX.p/h{5+řgGZ\u0002\u0019H[D{\u001c%ߠ\u001d\u00195;P\u0011\u001e\u0013m%/'\f\r\u001ei:\u0006Tސ=o\u0011\u000fwD̾7|wyK\u00177|\u001b\u000e\u0006(kO^=;\u0005\u00058\u0012,HB<0VO@-c^%jg\u000f\u0019SEHŎstPs\u0010!.$)Y\u0014`[v/#B#\u000eEy`4z>߾\u000f\u0017\u0014l[\nKѯfPW\u000b0-3gwu$G?v\u0002p4tDi\u00180]\u0007DQ\u001e\u0014~,mxSkr\u0015cS5hX[K>1Er\fHGlW\u0003&d\u0012\u0017^}!ҷ\u0006kSZǮ;-?\u0005\u0006\u0014\u001bT:T}Rw\"q8w\u0018j٘m\u0015MQ@[U9/\u001d\u001b~nN\u001eP|wʱa3zKB5KI\u0004\u0014H݈M7K;P0w6'pF%uv\u000fs\u0011ܮsC5nD\u001aqnj@hF5<^\u0016\t\u001ciT49\u000e+S$PFXF\u0005(\u0000SsVX\u0016A!w\u0007^\u000f+\u0017\u0012g\u0010fس|h<gzfyڙ{i!Df8E\u0018F\rEƶ[#QvKB\u0006/5Q'\u000f\u0016\u0000^$v`چdvP\u0013 f\u0005D\u0002\u0001,\n\u001a2[~Eͻ\u0002)@FcsBhj6\u0015a\bĨل$<\u001b)g\u0001a;EP\u0016/|F\u00050I'A\"NO\u001ay6+2?\u001a\t\u0011XmҲ{q]Xm@kd5-{\u000eaӣIp7҈C֘!}ɯsۮ+\u001b΀ p\u0002,\u0005\u0018J> %MvZ\u00153OҮ%EB5[\u0013<K`C\t\n.Z\u0006,8Oc\u0011&\u0018\u0003I\u000fVިe\u0017}תv\u001e\tǥ0*\u0005\u0005a\u0012Y[GZA\u0004}KPT.\u0011<o[%\u001acOu?ps&2ަJ\u000eE]nO5ܹ_Cr!)\u0000TyD\u000fA/E\u0011#R\u001b9hӓPx\u0002E+\fz\u0014\u001a=C.\u000bO#R'WF\u0004\u000fؘh \u0012a`H\u001c\\\u0006\rβ)6Z۞B.\u0013JR\u001a-{c+i<\u0007)fU\u0003\u0013^\u001cAH\u0011\u0013Tl\u0010J\u0001ZYCc\u0013\u0015mpB\u0000L~M2ܾHm\n(RPJ]\b8E\u0015\n@OI\u001a\f_U>6@b8eߢ\f{\u0000\u0004.\u0004F3\u001c\u0004?$\\f&\u001b?*y/Ād+6\u0012Û\u0010>\u001f~kV0\u001f\u000b\u0016\u001an\u0015y>\u0014\bEl+s~Y#lTeb(@u!fl-\u00198=blQj\u00134>\u0004>\t!v\u0017\u0000U \u0001\u0005\u0012R\u001bw\u001ea?\\x%1\\\u000b1ڻwȩs\u0010#{u[޶e!F2\nf4k\f><mhO}sŤqi\u001e\u000e:\u000b\rV4n4Q6: {=`b~N6\u0017\u001f_\u001f.]a\u001eyU\bp\ta%\u0012g\u000b\u0007\u0016o\u0000\u0015`U}v&5=V6eq\"R33ۉ\u0002fѭ\u001e\u0011y9\u0014iBnr\u000ew؊A\f0KBxɊ\u000e>~{\u0004K\u0010Cߙ'>_oKwț\tz\u000e_!s\n\u0003BptœF9\u001a\u000bp[\nU:/51j\\\u0001ٽª\u000b0\u0006\r\u0017a䢚o\u0007\u0016$t\u001cŴAn\u001aY\u0018\t\u001cm\u0017)s\u000e\u0015ه\u0014\u001e:֘\u0003\r~\u001c~/.e\u001d7]T\u001bFT,\f|L-uNK!䠪Eյ?wf<-\u001dbv3ﲧO#v\u0011;m8=܁t͞U\u0011v\u0016\"\fx<@F\u0014&#Zeӌfo/ r\u001căϔcχ:c|:weZR\r\u0010K,/Qkm1aXk2\u000bz{(\u0007)F\u001eJ:Oڑ\u0007Z<ڠEsPK^hDpz,A\"\u001a\u001ay\n\u0007\u001d='쒶xZ{\u0015*y\u0013\u0002i6ŏY\tFbn-qC\u0007Vz\u0007h򲫨M\bݿm(\u0017UmQ\u0019ۗETR\u000b_\u0007:D.Cw=h+tME\\iͥ(W[\u0001Uj\"ZhY'+S${Dt4:%f'n#s$/fQKɨzpM'ƧݙR`\u0002^\"1ܔṔF~\u001ab\u001a-\\)\u001e\u0014seS-x\u001fW`\u0010s:.\bu\u0014+\u0011B`\u0017^\u0004\u0003\r_x*g̾3Z\u0011$=ÑT\u0010\u0018\u0007\u0000\u0002P\u0014+%'-uSע\u0016m0\u0015?M\u0011Ȑ#}\u0018iU<\u001ba7Ge\u00151¬/S\\  \u001bc\u000e%\b\u000e<Dn;\u001c*\u001d\u0005\fy;\u0018m7]$H\u001e3\u0010xvt\u001dz;b(M\u001au.nϞ!Ԛ\u0007\u000b9\u0006\u0014m~\u0000JQI\\H9\u0018U]\\M!B5S<-\u0015)US+R͉h7pw,VIމOܚ+G}U©\r\r1]nt}\u00164ž<\u0015.\u001bV\u000f(ؒg~d\u0016EZ^\u0016(#\bBGJ[68EdǙH\u001c=\rޯ\u001aPէmoûMk:p`|C)\u0011Rx3\n9$ h\u0016LWhF6~/[\n\u001dVkIr\u0016_vAGQU;\u00199!\u0011.@\u0000OIs,q^N\u001e-\u0000:8$Y-s˳H*z,\f-X3:bW\u0005\u001a\u0013[n\\V<_g\u0010׷pUm!f%g}~٥Y</7mqZ4[A<}ϟ\n]\u0005W\b;>3J\u0007R\u0019r6/\u0011o˫3<\u0013\u001b\"#e\u0002f'}&}W&U\u001a5\u0006NJHVS|p\u0007\u0012%x.y/w\u0014߭=\u000eEVy9^6\u001605Iݬ9\u00069^gTi\u001b\u0006'Z/>\u0002̕P\u001e\u0002\u0001Zx\u0000.Xn݇j%L`\u00067\u0019#M\u0002=H_eUHa{\u001a\u0016\u0015\u001aG䏸ݍmrSj\u001cb]u\u001a\u000eH\u0000c+Vq^a&a/\u001d'Hj&>9ߩ&%^\u0003U\nE\u001dN\u001f|QB:ѮC\u0005(=% 1=h\u0018D=S\\\u001aj\bhxt@\te\u001f@+ԋMڨ%\u0017\u001a%S^ih-~|\u001c\u0012-\u0013^Nŷ@\u0016\u0016\u0005;E\u0011ήX^\u001fa+JIA^$P-~.q\u001a\\\u0006FcD\u0019*\u0003\u001f5Y\u0017lg姽w,`6\u0012:%\u001afsӴ:*T$GRة\u0010y{Wz:-U.\u0019\\*2\u000f-fL\u0005\u000b\u0011\u0015g\u001fVͿF_\u000fs|+\u001bŔn2\u001cH\u0010[o\u0006w\u00072hʘKsw|*LZ\u000f\fe\u001b\u0019e'\\݁g\u0006H}\u0000uYG\u0007~I.\u001aU0h Nm\u00175suc\u000e^Hj\t}]jY\fњhi]׿]X\u000bRn\rա-E\u0011:D\\\u0017k\\y\u0013I4՘˔\u0001ŎF\u0000\u001f\u0012Rs*w`ڬ7zUb0П1[gzΖfM\f+n&y:>\u0000Ʃ?\u0013gl\re'Ln\u001e5Rm\u0018+g$y0z|yR}oU=/\u0017؃\nbGˇ]~uʰC]zoEV.\u0002S\u001cTkRuo6Մ';\nu0og5B%plf\u0019psċ׽\u001b\u0019l7R\u0018h\u001dQ\u000fˑ\u001f>?\"\u001ec\u001a+0sY[Sn-N\u0012c\u001e;>c)i*\"i\u00031Α\f;^2/V\n\u001dͫn{>~UHRG@\u0007ۋ>\u0006\f;N2d켩{a\u0012@׾lƅ\u001c\u0004\"|>\u000e\u0011\u00136ջ>\u0012rq5X\u0014@r'=\u0017}\u0000Pn&\rd)n\u0005*Z'\u001b*4\u0005h\u0001?ɡ6\u0012I}󍺩hE\u001aOسu\b\u0003Ծ\u000b\u0000h|\u001f@h>}}C5QG.6/#=O-9#\u000emOvDeZ?!7\u001d\u0016S9Su&{umy=#\u0007gj\u0000\f%\u000e\u0017\"hW=֞xB\u000036-i\u0000\u000fC|%\u0017{uENsNMa\u0001_u)78hW\u0014k٠[@;2Մ7hXZwں:5{z\u0011c]¸\u0019\u001d@޵G^F<8\u0001\u0005\u000bޓZ8\u0019sk]Z*RR\u001b\rDhaMy?u\u000eC\u0002ɡR zn㠱Z1=W[\u0014\\KO\u001dW\u0007iZ9㤏\\մ_BDN\u0014HxGR*a\t(f\u000f[aܚ@\u001eد\u0015[\u000f\u001a-lR\u0010x֘`g7F\u0011['t\b\u001fr}^tU\u001aqh((o\u000ec\u0003|z̯=^Gp,*ڒ0{8P|F^\u001e˭\u0000s\u000b-#Hw\u0006ե\"\u000bH8i6so(\u001a0+T\u001074ٓR`/4uLkOo\u001f\u0016cly\u0012E\u001a\u0006T2My=Id\u0006Uf+z\u0002\rDB\u001bYc\t$fܰjۯUv\u0011Q<!d:w(}8[bYl\u0012\u0002͈\u0010\b\f\\Xۼvs1\\,r\u001e\u0015Hr>pZri_!pϏ8f6^\u0019T&q\u0002j~0M/T69D\u000fȎBuP4\u0001p}'~\u001d,\u0012m\u000e3\u001f\u001aʗ;=XYd{h\u00167TLvn\u0016`s\tkxZ\u0013\rg:]Xh[x769`7Ri{j\\ٰZ^Q^T>A,prU[?\u0001APN\u001dc\u0019(6|Q\u0014\u0017P.\fGƙkw\u0003\u000fIR \u0012#\u001e^J\u0017^0VXG3lW)%}[=+!\u000b\u0003\u00062\u0001=9eCЏ1\u0002\u0012\rRk^\u0002\u0006anw\u0003\u001dK@M\u0004\u001bġf\u0002I/,ΫU̸KN\u000bL8%4rԚ~CKJ+/.Gȥvqq\fccyH|6uuC^P[\u0011|?mMi\u000f**\u0019}@Sg:pIYw~\r\u0015UVX\u001bkq2\u001dVJp=\u000eU]1F#eNyl.;H? ֯\u001aq~Fsjm?$لOz\u001b\u0014\u0016a\u001fl] \u0017\u00057\u001e:'5o`&\u001d5u>֙nA\u000fڍ~i\u0007ZWXJ\f+CLkh\u0002vfKQ)?|X\u0004\u001fp]7GC&oS|4Vm\u001069h?ǥop:Ƃ&NN{>:\u0006 ;Efl_\n2\u0013|gxT?\u00136%\u0015\u0005>X[i_J)^x|nw!o\u0007\ryl:Pa|\u0000o)I\u0011\u0019Uħ{NO\\0 ih{;bɮ݋Mk]»{\u0006<\u001a\u0004\u0012\"f,\u001f\u000e/ʧJ\\{j'N\\5\u001eGʼ{)WMr(o\u001f\u000f\t=͗n;zE|ahS\u0015\rΈ]k\u000b+bmu\u001erJSH-P[6U\u0014\u0012\u001dHk)s:SɈ\u0019\u001c\u000fn\tkjzp_QR yM&0\r$l/+:(!]4=\u0012=\u0006)\u0000\u0004aҒץ+5\u0002+8qS'R$sj\t;s\u0002[.\u0014+y>k\\f-wm\u001fNw5C'_ޱZ\u0018Q^=]z)\u0003T\u0012\u001ft2ujz$C%nOnk^qf\u0001\u0010;gսN\u0004k+U48x[\u000bݟ6\u000f\u000f**ݱ`wz\b;)\u001c7\tֳ\u0011\njs}媷dv\u0012\u0018MtqDDrH_\u0004\u001ecq\u001eG/?\u0002J '1IKe#\u0018\f;d\u001a$˲\u000f;g\tG_:'Fu\u000e?\u001672:\u0010rdANŴ\"`\\.7\u001fyXٔⴽ~jKv[e\u0011u4\u0013\u001a1RxBu&/Nl\u0006Ǽ\u0015\u001b:&\u0007ۦI_O$sW(\riѧ\u0019a\u0001;uoH\u001bg4suώddܞ\u0003\\e6\u00174ktq|JnD_rd\u0006\u0019 \u0011~}&XK\u0007cr\t˭qKQW*GQQE\u001b\u00021xXf1\u00076\u001b4-\u0004\u000flo23Q/ &5ts薂\u0007c\u0003:z'XsN.9z+\u0018N\u001dq;|cIpѣĝԽ\u0014<.C*xR8@b3@m|$G8zk\u0018jj3w%ܓD\u00129mŪ7g[S\"楚\u001d[;C(u^cal\u0012g\"\u00018`?)K,ܗPܦQ\u000f\u0011~\u0018\u0001gH  J\\B޿\u0012\".V͝:`\u000e\t\u0013C\f9{uAD\u0010\u001fS/%ۖ6cvk/B\u001c8<tԘ\u000f`ih5j[u{t>ğ=M&@ԍxpVK\u0014bMy\u000e<xꍶ݌v\u001fCxX3d_ֵ>Z͋H|j\u00020\"k#vݩxmUץ\u0017ڼoG߈\u001f)\u0011zB8-p?i\u0007Ց6\u000b3[\u0004R\u0003b Ò\u0018_O[+GsHʕ\"\u000e9i9Wo\u001a\u001c\u000b\u0006wɵq\u001d\u001ef9Q7e\u001e\u001a\u0011哼`-G`c9o*]}\u001e\u0019G%\u001afFfP\\\u0018фE\u0003>\u000bRƪ\byVJ]\u001b+\r1`KbJ2>l;(+-2Evd\u001dJ\u0005V!9K)\"oc͎ePڴ\u001d^z6XP\">?J4uJO\u0010;tӎ:TZH\u001e/\u0017MܺMW¿VJAB(^) s\u001ak1\u001bʭ(P4B]*U\u0005E|d*\u001f\u0012Ȅ\u0013Cf\u0005*\u0014Zm\u0005)O\u0006T2G*nn_\u001f|Gm=\u0007@^\t\t\u001dצ8z=\u0001R>i*xyi\u00076iW2e(I8\u000fv(Λ&i*=Bl:lu\r};*2US{ZNl\u0006Dye8=\u001eGHk.u7\u00190ڥ{+\u001cϚ35Oخʢ\u0012\u000bM:G?o\u0005G'(\"\u0000_T!Y,{gH\u0012v\u0016#3BjR[7v\\6ZI\u001a{+d\u0012gIۃ)(USSM)\u0011x\u0001lrwJX}k+C]gafTj8)d-{Ql\u001dɲӖ6C\u0014e\u0019Fk,\u0013ru~E7lё\u000eɍD3xD:Xa,ATxb[pS|ù\u0002\u0013p¸U]G)ܷWV%+\u0017ՑwD,Nt;'-2.ryI7(\u001c3\bonWEVyAJJHWa=YM\u0018fEP\u0013\u0001+m.ךt]\u001euw_\u000fs9\u0012~\u001d([_wc\u001d\u0001d6۟<d:Q\u0006\u0006H\u001f\u0016¤A)u(i\u001bx|aq,uf.5?[2\u0001\u001b\u001eq%\u0011v{$%=\u0003O\n\u0011\r\n\u0015Tm03]\r<9ǂ=\\cQf&II);f<\rK/\u0007\u0015\n9:P\u001e/+\u0005\u001b\u0004N\b֎|\u001dp\u0015qJ\u0002:-Dq\nymt\t㢀/e<`1iET~1ܪ\u001eB\u0012&pA]q˸\"9\u001dӓ`l%c\b{ޗ]$.(voiZ.{\u0003\r<S4n\u0006$޼\u0016\u0018\u001bqG\u0007[`\r}p5\u0002\n?ͩǞ?\bN/\\_*;dhsā;h/\u0010%\u0019v\u0011M}z0\f!6/԰h\u000e7R-'s\\geh'$\u001eS[B1>5<\u001arz\u001d.wE\u001a6D4<G\f\roisg_>5\u00021\u0017w\u001e\u00183R\u001eH'U6@馷GLk\u001b3\u0006aeFʸjH@fGkѧ\u0001%֪Ҕm]ު\u000eF<Eь2W;ou*KGߩVoX{\n$l\u0005Y_\u00197 v\u0011ibpmIQ{\u0018Q{duXI,.J\u000e!j싑]z&J\u000f<\bUUzܾ\b3[1\bΟ3ufK2^\u000b0n@\u0002\u0011g+fWX>ٕ\u0012_\u0002ʸפߣ`<\u0015J4@F\u0006\fM蔸m\u001dٮYz|b\u001e6\u001dƜ\u001dj,mdY<rӆ NQ/%Ld%<LmM~A5kx\u001b\u0011l\u001fP\tt\u001bAc/\u001c$5'[Dƭ\u001bܽ\u00075䎛&\u001cdے<i5c3=s\tRgI֔r?[Ty9.lc\u0006ŵ\u0019R\u0013@mT\u001b-<=*\u0000\u0015:\u0002+}Tï\u0013(\r\u0010kl\b\u001c7:X\u000bq,`\u001caa:4!\u0011lQ\u001bџ̮l*ZFC\r\u001c4,<\u0014[{@5Qhg<j\u001b7;\u001azIQf/bg'\u0018\u0016KtQ\u0003\u0004*vwqC\u001c\u0010\u001dc[Zwqmh\u0015HNu^ṽ87Y&\nh#F\u001cw{t2\u000b/㇯Z7[\u0011\u0010F4SMy?\u0011~\u0006L.q\u000eֆ\\vr\u0018;毪/o\u0002\u001a>\u000be{ \u001bU#en[E`}o2\fZSKec\r,zr%iK\u0012-qlay\u000ez/+ċu\u0004r\u001b\u0016\u0005U>-\u0004N?r~\u001aƯ,B#t^jFsd\u0006\u0012MbuZ{RG\rL}G(V-\u0013'Tpv\u0010n\"\n\n{j䎭[ҝ\u0012\u0016\u001b\nh%\u0002Z(3?g~OO8q\u0010f۾\u0001iNZc\u0000z\u0019iX1\u001e}(\u000f\u0002\\\\QRfVGY\\-4\u001dͰ\u001cx#SϘ<jby\u001a>_\u000fa27γ\u0003\u0010\u000bx\u001fTl6\u001d0_g\u0005\u0000@ńJ=ݽXs6x=\u001e\u0003\u000f\u0012̃&^un͚z:VN>D\u0000\\\u0010X]Z]J6X!u_I\u0019\u001b.hqC8>'F{ʹs\u000e0Jt\u0010\u001cX:w_>z\bW^&\u0001\u0018ز9\u0007\u000fFp؀0% vp6*ڨ\u000fI\u001ee\u00172<͉`q\u000f/U;#\u0011 83i\tV[[ k?HV,$\bgg\u0015ZdїjMp/?c:\u001bǦ:\u0013[\u0013O\u001f\u0018\u0012 b_X\u0016PÃ͍֑'h\u0003mV6do\u0003b,g\"hR7.\u001f\u000b\u0004kj.dbkB\"xpm7蛤V\u000366ԧZg(>HJ\u0013\u0017\u0006x]Rsi\u0007^cKbF\u0007%'&5T~\rb=%\u001d9\fd\u0007<\u0007\f86\u0016jШsWNϭZ6t[DX#WEPH\u0000'Lbw~\u0004c\u001a\\d,\\\u0002׉jCH\u000by㳽aZ\u001f-̆\t\u001f?$̩\u0019o篔e4\u0001W\u00159nXз)oQ-?-\u0010 N:<gEW{_0'/k'\u0014\u0013;;UчyOQ\u00070j\u001a5\f|\u0002zJ?H\u000e{M[0ֆW\u001e&9koW|C\u0000\u0006Ջ\\d՟c_\u001fN.6<{S$\u001eBj\u0018\u000eH9MOf=b#\t\fD%`~\fD2ev\u0001\u0001\u0007ʊ\u001b/;\u001dҙe\n$w/oD\\r^\u001dvMb upE#>&Ck6is4{UTTG1Z\u0017pwY)\u001f$>0vM\u0011\u0015W~\rCK7mw둏\u001a_Cի\u0006~TTi'KIuc\u000e\u0011\u0005\u00171\u0011O>\u00060\u0005Ä\tP\u0002T\u0010;\u0003\u001cgwEOBX)\u001f\u000e;\\\u0001eDN/yԾ\u0012ur~V58kyT\u0016J4z- \b\u0002s\u0002s\u0012?Z)ꚞOCrCz|\u0001K~҂X\f%\u000e~<u\u001cr\u0001x(K9\\31+C)'(A$\u0006H\\\u001dH'i[ե@zB'^^;98\n*\u000fyTDy\u0019\u000b̚/\u0006AL6л$\u001f/V\u000b2GH]<H]Kڴ\u0001R&\u001e\u000e\"\u001f}cBa#f2^U-#p\u001a\u0016&A\u0018\u001evFɾ҂N5ϲ\u000fǭ\u001c|^2![\u0002<QGю]R$ك-]yM%\b^dQP_{ύdO¶\rx\u0005*\u00134\u0013WR^z\u0013\u0013_FgFbޗT\n\u0018\\U.\u0019H\u0002\u0012;.c{Z\u0013&\u000b-J6%[bpZ'\u001a{=\u0015ڄQr\u0001Ǒ/\u001fAxu!C}\u0005yCV\u00144\u0001U<\u0002:]\f7чrͦ9qMh\u000egѨqeS-\u0004Xi:yO7 \u0001$\u000eE!\u001aQ+͗\u0018ɣѺ\\kؼ[\n\u0019^~\"m*(c\fѪCaV`U\u0003Jָ\u001c3Uz&([>\u0006\u001c%&?Af\u0017\u0018\\A!.[X)ǵp\u000eN\u001cVFr{UGEA\u0013\u0006-a\u001blXպ$'WafiћQ\ro9\u001bF}maUѹ-\u0003\u0014놾Nlv1\u0005jH\u0013Ghs2m/HudŝDVBL?s\u00022Mֵ*X6\u0011\u000f$oΝ}D:dR$رb\u000frl\u0012o\n\u0000#ϴ[ZN?:BQ\\}oF88\u001a7=\u000e\u0018j#7\u0019w\u0004\n<ڜ݌j|\u000b^v\tP\u0019zkts\u001ac\t\u0001\"v\u0003\u0006?t@\u0004BPn4UIkP\">c\\K&q.\u001a\u0007\u001d.A\u0012_l%\u000e(l\u000b\u000fĳNչ\u0013cQ\u0012EaQj 8\u001dG2\u0015ED/}\u0012R_Gr\n\u0005\u0000R\u0014%\u0003L_-7VXg^\u0003ݫ^08h}jUYXD\f=i\u0006)Nn&{h?\u0013\rzmr<hQ\u0015b\u001fɦ+0ڀKJ\u0017ꚼ\r֤SST\u0012c}AGݔBQ;P:6\u001bu=\u001bTbd8n٬ݚ]M\u0004\u0011\u0014.L+j3>\u0010R-[\u0002G.$L==q踑*lp'.i\u0007͏\u001b%*\u001f'=\u0019Y\u0002{RD-\"PXׇ\u0019 \u0006QWY&k/\u0019P::\u000b_\u0015\u0010\u0010j\u0005eR\u0002\b.\u000eʖ?\u0007dX\u0002fc5W.\u0011Q\u0004J˨2\u0010ۮÕC\u0015\u001e#iݏ>\u000f\u0010殝F\t\u0005\u0002g\u0013Zx\u0004d-jw)G@\u0014[l:M!,&[6G>XI\n5:HB i{\u0013(\r\r\u001d\u0016b8V3PP.8jDixs\b?)S$fl_\u0019,]\u00007}\u0007LIp\fL\"}3\u001f:g\u001a37>\u0013\u001652eoYͣa8\u0001\u000f#˖3U\u001b5e<4r-*I\u001c\u0000oTɻ\u001e`\f\u000e\u001cC~[\u0005C<\t\u001bNCە`\nq9LT\u0003І\rKJ,[GNFqh\u0001OU)d#e׵TOEg\u0013P\u001d@`L޿XZ\u000fYnn~9@<\u0010fT\u001b%\u001di<ЯJzjw\u001aޠ\u0007QUԇ/\r_\u000fĭa35GwE4~ݸCrCF̸>Vr$}Ju=sp:\u0001\u001c`7l7\u000flh\u001dᢸ@(HLJ4|\u0017\u0006nX-[f~ήr\u001fh#3\u001fw*6A\u001dFglo7<ex\u0017W8L#Yފ@Z1\u001a֌IdC\"<kl}gt\u0003~<kecGQv;Zy0\u000b2dbgCGO:U0мxɄ3Z\u001c-*Rqo\u0016ICE|\u0006@\u0007p!&eP*QkR\u0006W浭zw%\u0014A-\trIP-q\u0017\u0015l!$\bQvZzF'IbQUn\u0016PU!U겔ZC퓣됪V\u000f,\u000eAz1&T\u001620y$G[\u0006`~1=\u0010\u0000/\u001d.CT!\t\u0018X\\|=\u0016#C\u000f\u000e۰q(Aw lÒ|0+\r7\u000fIK%tS#P$\u000fmq`~7\u0007\f˜s\u001fE5~\u0005\u0001*LGԂ^C\r& \u0017I/C\u001eOzV \u0000B@uE!>sL)\u0019:x^\u001a%QW~L\u001ef\u001b0Aʙ63Nɋ5K\u000eB1|{y*{Z\u000b\u001f\u0007q\u000evВ|\u000fgi,\r,aoJc=Lw]\f\u001dYXmR:v\u001b\"\u0012Pc\u001d\u0017Ke9\u0006\u0005sj\u0004J\"v\u0019?`\u001e嶔uS?>P\u001bhTioW\u0017OdB/\n>GW,&\u000f$1%N;x^=e\u0006e\u0007{eBo`\u0014P0\\[8\u0001Cӳf}\bZ=XOWP/\u0002f/;߲ƳN(?Wx\\Lqf45ۋ&\u000eѢ[\u0013\u001f\u0012\u000f\u001ac2UOEiSщǿ9/uM\t:(\u0002ۍeK[95\r\u00178+&\u001cnك=5lͣc\u0015@.\r\u0007^e_?$v۝j]*A:\nGAswM_ҩu;4\\\u001cV\u0001vxY\n\u000b~NN\\BO¦\u0015]\u000f\u000eu\b\u000fle\u0000ky\u0017kp\u0007\u0006\u001eU\u000b1\u0015pIW('7:uqr)qY,\u000f\u0012\u001dX7]\u0011XfX!G0|\u00148BкQ!hWz\f|#Ɓ^m\u001f.*-$\u0011\u0004xN\"-ݥ\u0014h;Qzӯ5s~fؗ\"̗\u001f0ƌ?H\u001b!\u001bl4K||2SF|u̼\u0002PRĝ\u001fv/\\aP\u0017ݰ2>O\u0004\u0010G\u0002\u001av/RUL_bE\u001f(UMTgj_$#:|\u0005&ooXc-wL^U\u001e)+\f~L\u0018:\u0011n>0\u000f\f#>7_~e\\j1\t\u001dG\u0011tCgڳGp\u0002iNrbTT\u0017\tT_{\u0015\u00020rb|y폄Q̓\u0016\u0019\u0005ȫ\u0014@\npVj}\u000fa\u001f\u0012|T\u000b\u0005!JG/\u0018Ut&.dw~O#\\NjX\u0007Fn݂+Ha\u001c*>p~5bP\u0007a!q\u0018\u0015T\u0005t7\u001c?g\u0005s\u0017Q.\rSw@襏UOԚ\u0002\nTN:B--i>F?H'}1ђ\u000br(7?e\u0006n\u0013QRU\u0004erT7\u0012\u000be\"М\u0013xi\u000f6\u000eF/7oj~9\rC*LCe\u0003jC#&pd{uvZ+R\u001a\u000b\rYISkSi龅tg\u001dt\bhœ\u0002QAꟋ\u0019T[\u000f<Wi|!99g5\u000b<\u0001(\u0018jK.m*bq\u00118\u0005!'⚿͵Uw\u0017rλb1T͝▆h\u001epp'꟏!Yˍv&@C\u0013\\ȫ5؉{AQÓ([zM[A-XP4?\u0004~5tKE0&9\u0006q\u0012\u001e\u000bQc^\u0012$փtH\u001ca\u0018ٰ֯)yB[5LRsn\bּrRz-L\u000bR\u001dzЋW=\u001d\u0007\u0015[\u0007\u000bjt:r,AOQ1 $Mxq,KƏ\u001c6*$6Ze~j\"J4\n\u0010,\u00115\u0019\u0013i] ȴieW\u001bҋ\u0000ƛ68P\u0017rG=\u0013k`lY \u0007\fҒ-\u0014_\u0013+B.C\u001fs\u000emvW\u000e\u0010kWy\u001e\u001f\u0015e7¿åHcG^\\uWVdPy\u0012ڢ1@Ԛj\u0002ol\u0006u\rܻS3w˦_h޺\"aۣs0>\u0017aӝ\\L18s\u001e&=\u001b\u0018_zt߲`\u0014C4u;Q!ws`q\u00175A߭yb\"ERU\u0010$i{(O\u0016\u0005KO.\u0018!IewZw'cw\u0001Z3Sg9d}r\u0019ߴQ\u000fer\f9\u001a\u0007G\u000e\u0013̾y(Jo\u001fT*f\u0006\u0017^H/x\\\u0007fy7|e0X)\u0011aG\u0010vF\u0014\u001f\f^7<*:Ϊ\faE\u0014g3Ev7_tĵ]\u000b\blvvH$jEb:L\u0006?\u000b2hi7N2X\u0006\"r-c{K|`Bjv)E6\u0015`p/%:\u000f\"!Qj\u0007yr-j1lvjlhiK\u0003\"\u0005_/-kV\u0017p\\ݷe\u0001Ms\u0006,c=E\"|y\nڪ?{\u0004R\u001b \u001d>S*@\u0007no\u001e>jtd՜W `\fY\u0012\t\"V馬\u0003G7\u0016\u0004~B/\u0006N\tv\u001e,rXZMqXpN\u0012\u000f\u0001\u0006\u0016.jȒ\u0013\u0017'o^o\u0003;X6!A˛WO>F\u0001k9N.\u001af)nl\u0019s\u001a1 6&fKc(\b/W\u0006-GCBAh7.[W*̾\u0010~\u0012\u0014'C;'P\\u>J0y~Ä-3P/ntom |9sb6eϠJNhT&_.\u000fLR}\u00039IR@\r3gvؖ§vJ@<T\u0005^2y\u0007\r$d\u0007\u001c)\u0010AW\u001a4IUmSL\u0014']D^Q<\u001c\u0012dD*\u0016̻r\u0000FW\u001b5G\u001cfJ[e&ªp.drqGMF#Ȉ\u00134\b\u0003jז\u0013\u000eY-jcΥ!pŧ\u001ea{e\\ap9\u0016!5h͟#3:h1\tįCطl\\\"ONk\u000f\u0006F?~wdfBq7=\u0006Biv\"\u001d\u0013Qy`{E8=`_\u0007ǙG\u000bD\u001c\u001e\u0016Uݽ4\t\u00118J2\u0012l\u0007\u0000n\u001b]Fڊr\u001bb5\u0017=\u0014's=Ւa:\u0018dfRQqsx\r[_\u0013.Dc9\\\n=O\u0007p}\u0010A\u0018'\t-˵^{_S\u0014o\u0018kӴr2?lX\u0015@ \u0018P\"Ui\u0017\u001a][SWժ)gJ\u0002v<\u0003\u000b'ƥ\u0018(j*7ܒɶ\"j\u001b\u0019#{\u0004\"\u000f\rBh'\u0012\ny\u000eZ\u0000u\u000fX\r\u000eJ2YM7I}CCR|*\u001csoe\u0019V\u0006h6ܹ9\b\u000b~Rk\n\u0014\u0004Wm_2,cBSN^Pg2a\"#3\u000e\n9%/߉\u0005\u0014Ր\u001f\toiHK\u0015@\u00064f;\u0015TI]1\u0018f\u0003\u0003\t#{/hL+.O#moty>uc\u0006@|]\u0005zslk[H\u0002R~y\u0006$tث9\\\u0019`}K\u0019B'?\u0016{PQ>`̖J\rG!Z5f\u0013\t7Vw<\u0017ҤdUؽujګ(lX\u0018S,x-Q%h:\u0010PKR0TjR.R\u0018/0Z^8\u000fW\u0000D\u0005~y&S:ŻMLaO\u0013F\u0003\tNi!04\u0010LJ\nֲ\u0006/`TQ\u0005\u0018\u001aWhG.\u0012A\u001en\u00168\u0007a'[WDtK+T]q\u0006&:\u0006Z\u0011j\u0015\rۙ'b\"Q+oZ>]\r57WiQ3}0?$Af3P[Pp\u0017NI\u0016D&(\u0016y]m&8=:E@VvEciQ\u0004Wn\u0004p\u001c\\\u0001\u001bh\r0.h\u00101\u001fhμ\u0015D\u001dW+RۼQR\u000f%\u0015]k8?9S-$\u000bzj\r'T(\u0010\u0010;Z\u0000\u001d\u0011\u001a\u001dժzŧ!_L\u001ar\"\u0015\u0001T\u0003W6v~ۯ\u001e)8<\u000b\u0007\u000f罵\u000ff\u0014@g\u0015bwH{\u0019h$K/b\u0003uMʶ.t\u0005͈\\\u0007k?\u000fܺ$Ku߸\u0017\u0011\u0019}ef_jiځ;%u䦢K/\u0014׺M윺ǅ*!CR)\u0006\u0017\u0019\u0013!\u0017\u0019OԬ\\'Zm*@;\u0007EiZI^!N8\u0007.^[jlvb\u0012R\te;~1#J&o\u0015A\u0000eaV\u0017^\u0016\u0016t;\u0003,f\fE\u0002u[\u001cX[Z\u0013\u0007\u000352ki\u001cr^}/8m\rvO)\u000fI)\u001foUJ)\u001a@\u0019>quݱrP͊\u0000<x=V{BߗK\u0013}\u001f]\"BVk\u0015\u0015o\u000fHu\r=i\u0006>3\u0000yqzV:~\u0015\u0006ǂ6\bg45\u0013F᦭\u0011?*.>/ݻ.\u0006\t\r\u001bS\nnU%\rzUU֙,[1硟Z壡t0\u0006[zt\u0013\rT\u000f\u0015il\u001c\u0013\u0004vW;\u001aC=\u001b=K.֜WouRm\t8d<B{ek\r+wۯD߲Į\u00152g:{bhF\\QOo)fډ\u0006mwhu,ʻh~ҞO.a\u001fQR\u001b\u0001}e\u001f_(@{^SoN?\"շ\u001f\r\u001e?$UE>m\n;'E(S'\u000f㮓=ڟ\u0011M^(\u0006@˞ \u001ccB耫\\\u0018,\f\f\u000f\tK~GJ%\u001fQ\fDb*6 Vy4b\u0004rK(g|cKZ*\u0017鲧\u0002I3/\u00169\nd,/ʮd\u001e/;(ǫi;A/\u0013Q\u000ffWG1TU\u001bEh\u000b\u001b\\wOU\u0016r5b.\b㔭 clM%ē\u000e^/\u0016~Aqy\t{\u0004eZ撪ʭNݑ5,w\u00166\u00174^>X\u0010!#h%\u000e|\u0000m_1[2\u000b?a\"\n[\u001cۂ?\u0016Gލ\u0015l5`h[M\u0017͑u0\u000b!VerzTH\n<\rl͹!u\u001a\u0005S\u001c\u0013tw\u000fw\u0010M8ʄ\b{KN^x\u0018~O/mK3\u000f\u000f\u0015ŷJPMF\u001bY*DOl\"4҆ҝeeE\fhU Q8WN7P>Tm~7\u0001\u001b\u0012C-0#uPyUt/R'\u0003!\u0002\"?\u0019wX\u001c[e.XG\u0001kh\u0001_B[4\r0EbU`EO:)*Bo9^4ǉ4\u001c<ae,ޤݦUc+\u001b8h%~?;~UH\u001bH*\u001avޅ}E㷎[!jqۚ\u0012\u000eOQmY噘_2w*^L|Np^`uP\u001eL]dlv3jdK:5RXۣ$,\u0003\n\u000ey֦)15\\\u001c\u0010\"T#%\u0007uֻ\u000e8-\fǭ]\u0005:BE\u001c}W|\u0011u{MZ6\u0010\u0019'<\u0003vꖀ\u0003mY8k\u0005ot\u001fMqo_Mn%~/j9\u0017U\u000b\u001f10>\u000f6\u0018VE*>[j|\u0000Ο\u001b%|~٠u:\u001at\u0007N;5]\u0019߻T\u00104X\n@s\u0003vua%\u00078\u0016:G7\u000e\u0013f\\]݅\"PZ\u00012\u001dt;\nY3՞Z\u0013#p2w\u0018V\u0007\u0003\u0002?K~աP~uk\u0019iG0w\u000b\u001f\u0018\u001aJ\u0019ևPM%|8P\u0019ά\rv\u0001&\u001fs\u0007k~\nt^{{9\"\u001aR9y\u001c\u0012Wؽ\u0013\f巵\u001b\u0007{W/B\u0005s\"F{C\u000fӄ\u0017{ިZ\u0011\u0016\t\u001dQN?k.\u0016+7\f\u0007'Ow#:,\u0019/~<;s\u0019\u001bu\u001ap\",3)xxovՓEan\u000f\t󌐞ٱѳ\t\u0007!35oXV\u0016ijĚk8\u001a{D*-v.\tհ\u0001?}fFt\u0019!){RsV\u000f4W\u0015<U\u0013õQkܞi/\fES3/\u0000B\u001b}\u0011[5EWײ\u001c<G\"|\u0004n`\u0012r\u000bS+F9c!UZ<BS%p=MR//\f\u0010MuhCR\u000b\u0010rr~9o\u0000\u0016+l7K4iZkba\u0001K8WfSoi;m!Xu\"wIf,Z7QZo\u000eZ\fhPeR\u0001;qNߜ\u000bL>\u0000'\u0018 ;H/l$gaX(]m\u001dm2zmR\b>D\u0007Q~\u001fT\\AB6\u0017Rm~\u000b\u0007#\u0016ZIgbV/dPn,Ǹ\u0010Kscxg\u00151t&չD\f\u001bLGzR\u0010\t\u0015n\u0010j8\u0002޹ z},\u001b;g?>1\u0003Мo\u0019#r(\u0014LdhGq!@#\u0017F*`pXR_C'7&PW!c\u000e5\u001b~9Mb`օ+fV\u0001׫1uI`(\u00119\u0006_ \u0017\"R\u0017IA4h\u001d!5\u000be;e#P@`ǌ+\u001b\u00027Vt1\u0010{J\u0003vɿy\u0011\u0012ؕ8uT\u0007<iG\u000b\t^{\t\u0001x\u0012.Uq~^DW\u001cj\u001bĞ瞈i\\7\u001fi\u0019\u001d$ݒKE>n~?\u001c\u0014p&*;Ae-~Ґxِ\t\u0003mo\u0018\rlܐZ5C\\\tD5BR}.+^XV\u0017z\u001eC\r.ͻ:vn\\RW&\u000es\u0015fV|\u001ft'ie\u0011\u0007aHNj@!hWZ֦\u0016D/@W\\ft^\u001ef4\u0017+g֭,C|{9\u0013\u0001]qzr\u001e\u000et\u001a܄>|JECcQƊP\u0011[N\u001fa(h鸻ͲB\u0003dl\u001dָq>ygT{t\u0002\u001bt;Tz\u000e\u000e0$aù!|l,dSL#\u0006G?\u001eQ^,Vsj\u001d0\u0018v\u001aG9-hi\u0012Wq֤ᡏ.*L\u000e\u001f<>v V9LZ'\u001eU{5\u0006Z3\u0012\bɴ\\\u00141\u0015}\u001d\u001cdƸʻ\u0000\u0015\b\u000f4Rqb?\u0012&t\u0010'{FI!Ng'OҚ3U\u0000$nRUq]\u0012i\u001a\u001dr\u000bk+\u001b]\u0005o0\u0007G,&Hԁ \u001fW\u001f\u0019ߋmR))\\+q\u0006-\u001fyqښ(܉ة;\n\u001axxD\u0017\"էHٵ-hI5F#>\t5\u0015,\u0001*lf>d>ubwAS\r\u0013Kl'\fu;\u000bi\u0015UEBx\u001fa*{;Kٛ\u0004/\u0000@\u00108wk;6S1#-\u0000{u\u0004\u0016j=]\u000b3v.Ѓ2*\u001d\u001bh\u0004^M#m\u0019ڹ=1$<\u0010\\:!\r\u001b\u0012fgU}~UjWq8\u001c(c\u001f\\\u0016=Wc\u0018\u0013vEs\u001al3K\u0014\u0004ϋu\u0003臘,\r>cri3X#Xt\u001e3k)-Kڙr\r\f(Fc5<\t:SV\u001e\u0010&\t\u0002\u0005#t*\b~Kce/3p.<. gȣwx\r`Cij?V\u001eګ8>2ǕoP⋄Y\u0002\"u$-\u0006EU\"\u0012\u001a,\u000b6C\u0016vӬ\b\u0015z>h\u0010|StKv*#dU\u0016hiܨ-\tJz=iI\u0010뼚Z-z^,~u\u0017DW$\u0003\u0014\u000f>1^\r\u001d\u001c\"̱\tݱ'\u0007\u0005=i#\u0016HB+<\u0016^\u0019 bEy\u0010\u0001eSi\u000e[$Na[gz\t\to\u001f[\\An(O<\u0014\u0014jAU_\u0018}\u0017\u001b\u00046_I\\*HC?+PH\u000eZ\u0019\b\u001aُ\"p\u000fֽg3a~n\u0012v.\u0002esRE\u0011zTgAA\u000e{\u0017$\u0018Z\u001eU~<i\n?х\u0004\u001b\\/xX\u0003}U\u0002MpFqØ\u0005kV'@`wuסҙmO\u0005\u000bFڹޕ\u0006\u000b~@qr%T1\u000fԹG8\u0014\"PP\u0015p \")\u0015D;\u001d\u000bnD\u0017om[\u001dQ^\u001cT@HqS#VL*\\\u0012YYU\u0002x41\u001bk\u000f\u000e֮3r7ut\u0015VUO󖼇\u001d3G\u0006^J\u0017ǀ\u0002\b\u0005\u001f\u001dDnL\u0015MQK\u001b(1y^x\u0000\u0011\u00122\fPn44'5BЊ\u0006h(\b\u0006e\u0005r\u0005UN)`빴;z\u0001YrsY7iMt}y\u001b\u000egj\u0004@#֨]M3F+=ԭvۚ\u0014&D2\\qj}UL\u000b?MX`rogҐWpl\u000eRXei\u0016A]\f91Sfȇv/\u0016gHI\u001dcL\u001bzIzHnM\u0018WKϭH7KXZ\u0005(j\u0012\u000eNb\u000bT񟘶AD~\u0002(\u001e㒁]c|\u001a\u0017TL##عRs𞱋X5z\u000f\u001b\u0002j\"nv\u0015:i5\u0002<kBY?\t\tQxddXz\n<m\u0000T`1/Q\b}h{v*S.^ŻrM#psa^\u00143U5D\u0017\u0015\u0000{$){gUx$yzgY)dk\u001aڬw-OfL4e!4a8-s+b[ismk\u001f~kJob\u0004֨5-G-&M}Ofxڑ֍ϕs\u0016hotU\u0004!>Pר9\u001bVQCdgO\u0014-r\u0013cx~\u0016TO[\u001eƍ{\u0013dgۿc\u0014\u000e99\u001bSR\bŉ0f\u001aX\u0015\u001aT\u0000)i22SnmVXR!,ro{w\u0013*_\u0019.PtVU\u001bST @V$\u0011\u0016̱0\u001d\u0016r>yKyݧ\u0013LN~KOV<c\tv\u0007J)IUTU=\u000eEW\u0005+\n\u0010fLC\u0004rSl)\u0001`c\rnX$zSn𹶇<䉌Wp9쵦-4\u0004uX]x\u0015tyjwa:\n<nYU.Uoo1\u001bB\u0006S\u0001kKk0&VR\u0011ms\u0002eCG_<E\u001c]\u000b(\ne/`\u0013^^\u001eOla5-\u0019\u0017Z&\u000f8=:ƁBѮ\u001bk\u0012^>C\u00010\u001f\u0002\u000f\\15S\u001d\u001eø\u001ap\u001a{<\u0015Q\r>}?SF. B\u0018\u00012$\u001c8²2IϦέ[1W]1IO_E)yer\u00185\"7#\u0007\u0010Ї޻5\u001c\u0014Y}K`-M\u0016uԘf]b\u0019fեq?H\u00036iE?=^Sۻ+\u001dcL'\r\u001a)\u001cRûgc8o\u0019\u0006wV`6\n'W}4q\u001dlfh\u00075Vr}\u00014boߞ̯\u001b_]}{\u000b:d}\u000e\u0016\u000bm\u000fA{.~\u001czvSiޕ_|]D\u001cXҀg}\r\u0006\u001d8ӝ\u0007V\".\u0010\u0003\u0000Îx\u001d\u0015N|\u0006]\u001cD̥g{^lR\u0003!atf͡텮\u0014R\u001dDRtJիB+I0\u00004xl\u0012g5\u0014oӬu{cõ>\u0007ٽaIj,[5i\u0019\u000fN:miƜ$ٺl\r1{LllD8nMZ>-[\u0018wu\u001d\n\u0017}\u0002s3,)7FuվFpvM\b߂YQ\u001c3k\u0013$RKtaWʫ\u0014X-Tj7zgU  \u0006yfygYl\\\u0004^v\u0016?e}\u0003]l?M~6Ͱ \u000f۾\u0005\f\u0006ijy\tUE|Tqťp2ݗ|oݳvy`MXa]ڳE[X\u0004\u001cQ!\\Ʒ\u0004\n\u0011z`{\u0000\u0001\nTD'\u001dVغz$^X)\u0017H΢/\u0014\b\u0002{\u000f,\u00194\\b\u0006\u0018˿H@}bg nUt;Y}\u0012&m0i\bZ\u0016GRit\u0019@ \u0005܋[^|npD\u0006\\,q\u0012rD\u001ebJ\u0013@y%-;KC??\u001f\u000f2\u0016\b|nޣ(;i\u0017f\r={C$^WVڱ\u0005PAa$|\u001f*\u001fA>?d㼔5׸y\u001a\u0006WG\u0000\u0017\u0000}\\Հú\n\u0018c3ǈ[;\u001f\u0000\u0006N]0\u001e\u0017^|6ծ87\nrO\u0007G\u0004$2ذ\u000eɽ@\u00115*\u0017\u000fNb\u001e\u0000n\t\u0014\u0007e?Hʏ,US\u0019-so~xt\b\f\u001c2Y+\ry1nXíO?ߓƳGc91BmD\u0017ElT;\u000er«=)D\u0019m\u001a\u000f\u0010\u0005\u0003\u0014z̐e\\cg8<2$\u001a3ǭ\n\u001d\u001b\u001a\u0015\u000fgg\u0011j3ܭ:\u000f\u001d89\u001c7j\u001f=ڃ_V9x7>\u000101\u001a\u0016Jzya*%\tdM28'aYz8DtZ'ȝb\bZ\u001b?EYT=5K\u001e\u0014\rJے`CD]5ebEJ^32FhLssn[5j?\u0012|\rzQ3\u0004=}eA\u001dq\u0012\u001aW\fT5R\u001b\bsgqw{hr\\\tw[o\u0003w\n\u0003\bN:;\u0017N>z\u001f\u0018bEse@v(&t{V\\\u0003<fokCL;\b\u001b\u001d踶;]S4\u0016gw<o1\fmwI0ꛭzV\u0007@O\u0002\fIܯ:ͻ~H\u0007Xak7we{[މs\u0011+\u000e^J'T9\\\u0004Bľd\t\u0001ӭ\u0018V~>\u0002seK\u000bՇ/+'{L\n 1Uǰb_y.M\u0003`-aZ=9r.!^^y2d+b,%L\u0015N,\u0001~Y|\tI\u000eԀ\u001cqP-\u0004\u001f\ty\u0010JZʭW\t\u0000\u0004yA\u00194\u001f:V5,*\u0007켑ަZO.W%Z&+Jdj:L-5z\u0015Wuav%CΛ;pF&\u000f@w\u0003fQ&[W>K\u0007S\u0017\u001aO+W01WFc\u0015t0\f\u0006\u001bk0I=<\u0000\u0019\tq&zgv\u0002cs(\t\"V\u0012OU\u0007,CWE\"2,9ut8x\u0016%\u0001;<Y\u0013ڞ \u0015\u0010i\u0006wRPs\u0000E\u001a\u0013L5\u00134vL,\u0007kq\b\u000fr7:l{'9p\u0011зS\u001ar1*E}ЦԝO-R\u0013⏙QIcٕ\u0014߱[Ņl$kH\u001b\n\u0017*~\u000fX\u0012\b&\u0017뽒=\u0013IVJI^?kk!9\u0012u^r)|?%\u000e\u0015i\u000e:s+M#O5\u001a}})zS!\u0019F\u001fAԔ|#P\u0001S,ݮ\u0015GuJ0]#\u000b:`#^C5>b\u001fX'iTFG_Ի\u001e\u0016&\u0017\u000bįU>zݢ+9dy_@M'g>ф2b5P1k7ܔ\u0006ݒ@Fz{`x\u0018ѯ\\>g\u0016`4W G\"{Nu\u001aCB\u0015FR#\u0016\u0017Mauѧ*\u0002:xG\u0012&vq2s7ڍ\u0017\u000b\u001f,W+;M^\u00132NY{\u001f\fB\tAP\u001f\u000bΓ\nuEj\t\u0015\r?,ވ^cүn1_0H\u0001\t@b \u000bP\u001a0ܚϠWpFHn\u001dO\u001f#W0:\u001d.m2\u0005u0mq\u001b\u0015˂3=51\tM5\nw#T2*]fTn徑/\u0016'\u000f\nu7a3ċ)hd}֣`\r\u0006'38sW{wQc]ZZ\nSSREy'2\u001e1~kTZ\u0017\u0016w)pǉdԆf0:vr=\b*ʋPm*x>+7=\u000eh\u0000\u0003 -}d^?$=\u0017n>\u000f-\tlP݄^+/3Ts|\u0015D'\u000fG3ϊ_\u000fq1ܝV=Դ\u0014S \u001cb.\n9}\u00118\u001am>5\u000b=aL`n,së7umR9kLsU*ρyMnGj@Yq\u0007I\u001eFz6\r\u001f9\u0002=:f\fC!lO1\u0014TrJ\u0017}YZ-֏t|r/W\bu\u0018%rn9e\u000fsDǳ*\u0015_\u0013.w֨.ZD<9y:[M\u0015yVRd\u0011ͫҨ2au'\u0000VWヲ$yx\u0019\u0007$$9@ڪ߰g{qøT\u000f\nqA\u0002\u001bioႶ?qzA \u0016ޠYQݛ5\u0002]j2l^\u0015fBZŀW\u001aro-d5[ZgȞ)zT>\u0011S͡TFBU;M\u000bs\u0013w;3\u0005\u0014̐\u00021`|3f\u0019wV,[3jS\u0007M3n-\u000f\fɿ\u0011\u0018\u001b؊\u0016؞LhED\u00177'\u0015\u001dP\u001b\u0018\u0000]7}O&\"+QafY\u0000sٖ:\u0003ǝGS\u0018{.f\u000epV[Wzja˛\\2_FJL%3N5N^\u0012\r\u000bұ~㊤ 7?&vi&\t7KǦ_p]J^\u0000\u001fIT\u0006ċV|Tt\u001e\u0000phvV\u0017k*,,l垮u\u0013T֊7?:\u0006z-QM!*x\u0014>JLMid~u-5\tI\u0005h\u00153op0\u001b|!t⸬*\"衢VwN{\u0005-}յUsvqphv{\u001fέ\u0005^=\r4C+M>?7My6*7CC\t՝9eTb\f\u001eT^N\u0002Q:!\u0007Rsr4ע\\<:{o1\u001b+tB\f\u001e\u0013[\u001e\u0005%zhU{\"\u0007V\u0016\"aQ\u0011@\u000007u#aڹH[Kc\u0005ۤP\u00078X̳\u0011sneз\u001039iJ\u00046\fkuH$ܭw8MH\u0016\u0018hjc͕^\u0007޹0iJ>Ɩggh+f@\u0010p\u0018\u0013?k_Zߌj-\u001bKTڗәqYy{o&i\\\"̽47r\u0007F!OZ$\u0011.\u000f%7v\u001cY;vHK\u000f\u0018.Zu0:\u0011=;p\\E`9'?\fHt\fbJjUz\u001a\u0019T4(7ۅW/\ti\u0018E|cO`REh_qx$)W\n)ggŴ\u0001j2ޥX]ۓ쥞\u000f:6\r\u00108qA^u|!2\n2\rȰJ6m{)!UPTf\u0011|MiUy\\᚛@yus;\u0005Z\u000bz-K\r7nP]~\u0015-)\u0002_z\u0003+О\u001a薆\u0016_GV4\u001495\u000b?\u001fU$\u0019}\u0012tvNH<\u0006$Ҝ0ZF꣉\u000bܳ\"[-̢X{\u0015XqZN:?=\u000e:`J\u0015~#+/\u001f{S\u0007^/X\u0003u\u0007EoH#i'R=O\u0007J`b\u001c~)x=Bm[x\rJ%\u0005TNM*3\u001b3\u0003gm~Mk}C>ak\u0001C \u0017,.^\u001fO1:;AZƭgcym\u0005+ii%qWo|+\u0013[Aڶ&<\tU:)j%Lo\u001d-8k;?=uh\u00111`Vq*lR%\\\u0019^;quI&\u0016VЭeqzSiQ!\u001f/%;XWj\b9tm\u001cE%  X\u001fWZU%8\u0003pv]f5[3G\u0012<}\u001a}*lKUJyJ yduՋH!AC1<~3\u0001=\u0016x\u001eX#HH\u001br^m@W{\u0001S\n6K$C\u0012b)N\u0007(\u001ac)Zʲ5ѺY\u0015#Ƈ[qe,{\tz(s59\\v\";XN}p\u001e\u0003mµV5.sg{Jb842fU\\H\u000b&pc{~I&,}Wozn;\u0015ὀέ̭\u000bWg%)^#?\u0000zJ\bM\bj;ˍ\u0015\u0013\f/2?\u001f\u000bǽy:J/Wb\u0015z\u0016\u0011ht`OT\u001d\\ˡ6ljnq3QyyN%_\u0015p$0XyNI=~KteIDYMNNC̲JpS\bϠ\u0007,\u0015,\u0015n\u001f\u001cB>T\\%x$\b@D6tdu\u0007Y\u0010_`y/\u0006\u000fq2\u0010hMɇB?x)A(-g{%.*\u0003!U\u0006g1w2\u0011f\u000b\u0006\nf\u0016\u0001ܡP^k\u0012D>T˚]\u0018#\bDMϛ,[u~XLbIwo(jud\u0004\u0005|\r:]1}7\u0003<\u0000ɞr\u0015Bo.\rf);}\u001d{ZD<g9v\u0011rS\u0000!Zk{\u0005MH\u00163(`N`ke\u001fgM`Chb2\u00018R\nozo<\u001c:̨.`\nFoqO\u0019wO\u0006ȜƘ;n\nH2+[0\u000bX\b 4\fޗ\th\u0004p\u00024\u0004KϠs^>6%\fsc<S5\u0002ҙë\u0006w᎚\u0014Nٽ\u0003=\u0018\u0000\n\u0004\u001f_hd^MhJ\fwn\u0001;H}\b͗z(s#Mǟu`~$I\"V\\\u0004? :O/\u000e)\n\u00010}ӂ+\u00150\u0007qٙz&U(;C\u0015v2A\u00133s\u0012\f\u0007UT]LZ\u0004Ȫ\rT-opT\u001e^:G;r<G-S珫8H\b@lwK?r*P\u0016\u0014; Yo>9$)7J=y<\u001awf\u0005%LeMG~.ڭgv\u0011qI\u0010n+\u0003HbpFs:pXu;\u0017{Q >]-n˝\u000en\\\u0014irFv%\\9YY *K\u0007\rmg[YnX\u001e>@k\"ԂQOJxޯ7ǣ@c\u0019\u0000u]rNn\u00021VBZ<\n\u001fRqVM_z\u000e1\"p'\u000br\u001f\u0013o*X7OTUqp3K5y1ǭMgn\"R\u000bQ^nʒO{y\u0015\u001ar8y\u001c!,lkƌ\u0004\t\ff\u00154J⒡\fw9\tEr\u0001ݙ`\u0007UBg\u0017Fɽr݀\u001a@JkߑR2+\u001d\u0011aAp\\LSX#<lZ|\u0015,\u001f\u0005o]-Tug?Z\u0007oZ+-\u000f\u001eBΚx\u0002P\u0012Zv\nd\u0001W>7̀z;+\f,4J%h\\\u001fק˝Gy!*R\u000eyƢ/\f\\\fP_\u0018vȈs\u000bv\u0013R8\u000b\u0015K\u000e])۹\u0004\nhU'bzapfbk\u001f\u0007%\u00071\"mqVD\u0013w\"40^#]<\\\u001fGaM{犵Y\u001c:MnN=P\"1DZw\u000f\u000e\u0010ց\u001eQq\bx/jU\u001a\u0012=z<]a\u001au{c+\u001cQ?`a4S֒\u0007{OY\u0011V \fՇj\u00015Dr.\u0002#{o~\"HRJL\t_C\u0015+VU\u001c-E6HSkz|qlA!Bra\u000b! ծ\u0000Ŷ6}\u0005\u0011Qݸ`G}ܢe\u001a\u001fi[<\u001aEX~\b\u0017ZT~fثHRCsbb\u000b$wM!kDԛ<6m\t3:\rn\u0017Ցꩵ40Jxq=zGO){\u000b} 6i4ɚ\u0003©z\u0013n\u0016,^\u0010lD1ۥFՆXG>ã#کT\u0014 \u0004\u001dU\u0000D\u001eU!*3yL\u0002\u0015i~pS\u000f}kL'fŐ8EzAqսģƮ\u00118Wy\u0011(P۽D`0C\u001e0f@Ə$d8cV&N:}R2qYI\u0006;!c[\u0013mN\u001f\u0016\u0014\u001b\u0017w6穩\u0018h^$X\r,aūT\u0016u\u0007@m\u0017%\")b\u0013}/\u0004\u000ef)t\u001bulӕ\u0006[\rNjFN\u0011RGKUaGgu2h\rtZ-X\noьEV)T|Y7[CnW]w\u0011OĮnyfP[\"\u0006w:g\u0001\r\nHӶBQb߼=J>\u0012*[y\",8@\rC\ta2ref\u000e0uSveB28ml{:ܞ\u0000$B9^ű-Q?t5n7rJ\u0013gZPOV8g\r\u000b8ٗY\f\u0017CT^;S̝\u0018J$;%F!}'|s2K[uo^\u001f^ǰMpQ=\u001d9\u0017 IԘL\u000fџ.Yt\\(R|zH?p܎x%\fm2|9\r\u0000lMh1~\u0017oZ?_$u*O\u0006b֔?ӿ\u0019Is丗Z:\\\u00189w\u0005hA\"0]/0Ϧb0d+\u0010S\u001bqw\u000b\u001eG#\u001b6_c\u0017B;eV[\u0016\u0017r\u0011\u0015/\u0012M|V-LGYWI9ؽ\fW?<y<?ơ\u000e5\u0006\u001f\u0002&{4nb0]~h\bؘt]/҈UT4\u0002,'m\u0005Q[\u000fQ:\u0013f\u0019)kU'iu\u0004m\fV6}}zT\u0003\u001b0fj.bj,gǧM~\u00149VUy\u001b\u0018oG5Gr[5\u0013k=l2wOKO @J\r7aȷC\rgl߉\nyU\\R\u0013ioFys׽ns\u00053O(\u0000{QZM[iy%\u001e.^nE\u0007\n\u000f0\u001b)̂\u001fֺ>QGj_\\\t\b3{`S^\\Ojfi)k\u00050drcu/W\u0004 ≸N\u001c^PH]7iUlB`ﶼ]]wbGǗg죔7\u000eYf\u00066}GQuqN\u000b\u001cۘYb5Hըٔ<\u000e9\u000b=Zp8>y$UϵkZQqim\u0005\u0014̮\u0006\bB)S\u0001=j8Hݴnw硐35 \u001b5#kڈ\r\n<.Ls\u0015\rJk\u000fm\u0016*ϗF<\fez&v\u0006\u0012lxK73U~\u001387:4b&\f47оP\u0013\u000b幆nc_l癪 [cԩEyuz.\r넮\u001a\u0010\feiT#hXsB؈\u0018N*֯a9\u0010\f8'1\f\u0016yLL\\0M\u001b^\u00023w#箮k4r_V\r\u0019z\u0002\u000e\u001c\u0004vEP5k\u0013[\u0007\u001d\u000f\u0017:G[Z&75bq@ټMN~߉;HF>ZUwyrԤWۘ4;s\"\u0019*H_e{#e7:,\u00059;yD&r\u0017\u0007a7|*\u001d͞g\u0007M`G\u001er|\u001678\u0018nбȭ\u001b\u0015K2\\/}C$\u00171}!\u0007K܀S&?(Y[s\u00045u@n|u~ր\u0007/\u000eתo\u0000(s*܉)\nW@jc><<qM]d{uu\u0016\u0014{*y7\u0010l|RRu\u0011\u00166\u000f::TKoj\u000f\u001eJ.\u0005oI\u0007c+\u00156%8Fw^\u000b9e\r$Q-/S94~\u0016\u0018m\u001e*AI_L]<qly]\fj6WUi\u001b]XvLT?\u0010/\u001c(\u001aN\u0011&n\u001439=VR\u0000qP=&Ŵa(\u001eI$\u0001ʵ3jQTعd\u0014gR{/z8U'|r@f{ǜB\u0001nzu\u0004#}l-ToJ/\u001a&cG\n^3/IϮ_M\u000b\fm=\nI!%dϭ\u001f\u000f4\u0013O7B\u001c<{\u000fVа;m\u001f'\r0?\u0019s}2\u0016d\u0019V6]rS1\u001e\u0002\u0001m6Rߞ\u000feS:QN(3,\u0010+N:̷q6\rv(rEl=I\\1\fyD2\u001aJ{\u00186+\u0013AP\u001aSCH\u0015&\u0005\\?˯\bRǘ̫\u00149E*@\u0014Ē+\"\u000fݦlZ\u000b֛\u0006\u001260ҭƶ1Hۈ\u0005\u001255Iq+޹Q::\u0005ǭ\u000eV`}E\tޱ3\u0003n\u00194]G[\n\u0017\u0007$fҬ&TuԄ\rl\u00169\u0000jm\u001b\u0007eۄ\u0003~e\u0015}\u001f\u0017\n:C3'm\u000f.RP7_8_vKU\u001cs$l*BT|z@A(\u001fhўZz[yת;.vVf\u001a\u0019V:\u001c\u000f\u0010fIY̱`H\u0015H[A!\u0011\f-,,3\u0006-l&d%\t7YCFV:nhA\t{t^\u000bl]䄖t\u0012'KN3&xȦ5\u0004B\u0014]c5Vm̺\bӢc#\u0013Q\r8BJ\\\u000eVrO?\nF\u0011\u001fu\u001fa\fC԰Ef\u0018\u0018DX\u0010rs݆U\u0002}~PV=gW\u0012\u000e\u0012\u001dZ<(\u0015\u0005\u0006<f*1t6R4;*\u0015i\u001f?Pҕ\u001fIWQo\u0007WK\u0007\b4\"ʫKiտA{ġFi([\u00075TSsRd{Yarl7\f\u000b%)^g6EZ^E\\a\u001ejJ\u0004VneȱW\u001761%ģXb\u000f\"^\r\u0019cwٺd\u0016;3~o\u0017\r{\u0016FVTRݯ\u000bD?Z#2cEW\u0010z9(o^>]6\u0000^,8$\u000e>\u001ax\u000fzK)iG\u0010*8\u0016>Y\u001f\\*M^d.6~\\^?I\u0019u&\nv\u001d\u0016!UGPW\u001c\r-P2{;kPp,'y[ىD&\u0014Q\u000fp1P)]CHPܳ?T\u001c\u000b鬴0Yb$}C\u000fcf\u0017\u0016c[Lj\u001eg?$J\u0002b7\rAh\u001cuۖuN} 31)m)꽴\u001euA\u00144u̖K׭&c\u001b*rph\u0005wqMOO\u001azΗV.)?@t\u0006q\u0003WjT_5\u000ff\u0002g\u000e2\u0017Q$iNn\u0016\u001e\u0016^CXs˵\bH)4\u001d!\u0001\u0006:>:\u0007٥ߏM؞=b5؆\u0002>qt\u001c\u0019mH%o*\u0018%\rn\bn3LNL\u001dNr\u001c\nCE[\"\u0017jҴ=.bZ:\u0007nP4u'\u0018&׷ƅ\u001b\n{Jz(\u000b1^T4hH$_\n\u001b;\u0007f\u0012ZIHImN\u001fJQP~TX0\u0005چ,I\n%1$dF2\u001dm\u0011W!4W\u0012ꖾy\u000bF8/ߨ7\u001a\f\u00050~K\u0015j\u001awۍ\\&ȘEg<C\u0004,|y\u00116nY\u001bw-sfstk\u000b\u0004\\n\u0002B\n؂Q͓5n\u0013uZ>\f\u0001㐇\u000fK9ʔq\u000ft\"K>i0F6\u000e(mwQYmiٴ}6\">_,5g\u001dt:z'^\\.\u0016@\\l\u001eo4\"C'BEE<7=圵+N\u0003\u000bA\u001d(\u001em\u0002\u0012\u0007אى{OEߜ>\u0000₤G,LT6'\t|˗hF4\u0010jV\u0017\u0012\u0002\u0013܀\t.z4*0\u0007]J\u0011\u000f|n%߯e/laپ\u0015>H\u0014Yˣ\r|v\u0016l,\u0013\u0015.j;_A''އV1(ﳹ\"s]\u000fD0\u001cN2=5Nwk9(1/[委\u001f+9C]g5d8Z\u001f\u00172\u001c+\u0012\u0011Ú9>kZ\u0012i+4\u001dP*\u0004q\u0018]\u0015\n.A\u00134\u0012\u0010|ʬ\u001a#:ºUGS_\u0006\u001b#I?A5<\tۖ\u0014k\u0019\u000b\u0007,4s]\u0003!7o\rb=l7nf߷.⸜$\u0016M/op[[d\u001aHMۙݓ\u0015fk69\u0001=iEs^\nU<\"?\u000eyz&m0v.\u0017\u001f<)o:\u0000Ym\u001a鎯\u00188\n-?ջ&Bخ\u001aTI6\u001fbR0#Cz=\u001f\u0019%4\u0006=VoX[I(\b7\u0010+n(t\f\u000bm#̢t\u0014\u001cQ9*!b\u000b{£õ(_z\u001f7qk-OBK)\rn\u0005\\qƔ>X:E$\u0019l C?>H\u000f\u0019\u0011N\u000fS4,%BX%\u0018K\u0003\u0006\u0012ZDm\u0001ą\u001dJid\\.|C\u0012u5/>0\u0016erSނÓ\nЍ\u0019Pe\u000f\u001fjoٸ\f}O\u001aū\n%\r\u0007=D\u001b%Ƨ9|jDę&\tAB\u0014m\u0012@C_ŘfĞ^7}FaQ\u0005Wj۶cxˠ?夕`DZdAwZ|L}E,\u000eNȒ^J%:畘5>\u001b\t<g_G\u0014_\u001fh\u0002DZ\bsU{E\\n_X2ŗ>T8-B(\u0004\u0005|Y؊\u001cn=_ŕǴ9u\u0013-tʖoLgXpᨶ\u0002}0}sڤ\u0000ؼ[\u000fcpqcWZgc52\u001aD$rVfx)\u0018?;[Z_T9\u000e\u0015\u0016WJ}\u0000CkC_*T{Fz\u001c\u0007x\tk4j ;MIiٚ\u000e2J\u0006?p\u0007}Pr#E\u001cӆJ\u001co%iݘJBQ2\u0012\u0012\"#Z9\u001cHvue\u001eY@\n@F'\u0013D\u001e:<)*\u0010~ 5X\u001e\u001b\u0012\u00190\u0018+_\u000eEW\bf,2+}l\u0004kM\nw\u0000ru+3\u0016Ei\u001dEvBgz\u0018D=\u00142\u000f\u001b4:\u001cJI\u0003cj0NT0OD\u0007\u001ax #yzy/w\u0015º,j:bq\u001aC\u000f\u0007ʊOeW|AJI9kY\u001an\fl0\f\u0011:\tsy\u000f0RjV|m\u0014\\D?NT\u0001΢d[\u0013\u0010i'\u0015opk\ta\u0018\u001f\u001b>\u0012m䫨7hԊ\u0017I&',~.է\u0015\u001d\u000fNWR\u0000'9|\u0004޴\\pӛ\u0019O\u001cW}g``ܷgn\u0002?t0\u0018p2黢t|\u001b\u001b!\u0003\u0014`h\u0000S1,\u000b^-Kܚhi@TPܽ]ik\u0016u2\u0016+\tTI.\u0013mʠ?^\r^)KvFlN\r\u0011J.7!Z\u000bY\u0018KPiɹvRM\\?ϔ\u000fe\t{,**F9l\u0016\"}xˀJE/5٩jհy\u0004 н|\u0006Xٚ\u0002p\u0007mjuBɗY\u0005\u0013R*b\u0000\u001c)--:A\u0015;v[H\br^Dm\n>\u0001J#Q\u000ef$ʃ?+oz_\u0017W!T! Їx]\u0013k%ջJ\u0011Xٻ\u0012ͥOfއxNZ~m1/!O1ۧ\u001a3HUB\tǭ5A'\u000bSf7hK}Lo^mcR\n\u0001y\u001de$anp6\u0005-\u0012]| /j\u0011[5Ǖx74\u0014yy\u0016s\u000e|`Gc)\u0016I!\n\r\u0016\u0004VGkǍ\u000b\u0019|C%v\u000b8\u0000Z2ѯ\u001b\"\u000e_~5M?\u0019MY.ǵ:ۮYZSzN-dsF@w\u0016\u000e\u0018`XKb| \r\u0005)DJ)\u001a\u0013v\rR>p`Қfn2VʐS5_qqC$XŇ\u000bqh+\u0018-ҀN\u0015n=BԬnwYӏnb察#\u000f\u000fr;%\u001f569!Q+u\n\\ArPw[a$:(t/\u0013A\\o\u0019^JMO~\u0005Fm\u0015\u000eZr됱Td>V{j[7b,Q\u001d\u0010ߧ&f2k\"\u001fΊu%f[k_[ي3\u0000_$I}띛,<,@\u000bYYo\u001f\u0015`se\u0011[sIs[\n\u0003yu\u000bγn)OZ{̹'\u001f~.~͖U\u001b؏z\f[#\rj\u000f{l$ݬ\u0014\u0010Ӈ\u0017Z+_)T>]zc`\u0017%v;ï'j۪E\u0013\\\n9\u0002dw'\u000fC@_Ǡmkޡ /\u0015\r\u0018qF߀\u001e`C\u0018pN6\u0003\f*$wW:{Y\u0017^3Źm&oP`=d\u0000\n\u0015{\u000b\f9\u000bƿbi4[!OWTM\u00030%#<Xٸ,M9p\tG\u0018}=ҍ\t}MiHx`NRf=ԊG1+kfgf%k\u000e\u001e崭\u0001+ܮުo\u0006<\\\r1EkB\u0019d7_9\u000bb=1\u00133^\u0007o7٨\u001e|^a\ti[p1U\u001250[\u0014bi?M[h\u001d״_՞mж?tpX.z2\\%)n_'%,U'mMF\u0011\tR\u0002{5\u0013kQ/=tO8!\u0002p}4ˎ\u00064߈Rк\u001c\u0016=\u000bl\r\u0018zW\u001f7ß12iƧ\u0001a\u001cz?\u000bt>\u0016pZ\t(C\u0016\fCN_IW@Jmٍ\u0004\"yfF+KŰvyt^\u0004F(D|VOb\"]p/=&.ҩ\u0006\\*IR^塅g\u001fY\u0012y܏\u0019d+Lf\u001f `\u00071p~E\u0010|\u0010Ipd\u000bxۇʛ,>F?\u0010=3\u001fI8^]r}mƋxo\u0016\u0006\u0010}tqy|\u000f#\u0004Ǿ\u000bYZ\rTX\u000e\\\fsPܶU<ќJ9C8i\u000bn\u001a,u3qB<\fk?~c4@q\u001b\u000e\u00126\b<C\u001b\u0015iڈ4Sq\u000bV0iͫCpNvl\u0016\u000eu>o\u0013WY#x?+IcW[\"9n'W^\u000e67{&iY;p\u0002Y7k\u0001G!7nu{XK\u000fj \u00050.cTnVܒ}L\u0012hR(#vO\u001dS\u0001,\u00054|Rrx\u001dYv[cQ=\u0005Av?\bC\u0013\u0015(kJr X\u000f*\"b6_\u0006WȣKo\u0014&ʟFr=\u0002=΋U~\bn?Bݚ\"&\u0013B)SnqgOX\u0001\u001c(\u001f\u001b@2!hFnG7U4Sd}>\u0007m[\u001eF\u001d9A>8ښC\u001f S2?:T\n^!.!3{leqnu5t\u000f\nXH[\u0001\u001fm,Y;W\u00137\u0012tyYwW\u0002`w\u0016\u001eR߻\u001d\u0007Y\u001a\u001c\u000e²\u001di[ͷ:4\u001d\u001d!\u0015\u0014UFg2L:\u0000\u0001+\u0001\u0000(9N\u001a@ٰ_֓6Ra߃ι\u001eTQ\f^Tjs\nq\u0016\u0004X#I'$KqEe&3X)PeF!\u0015Xw+>\\īWxF\rg\u0007(B0\u0012D;!и\u0006\u0018Mq><n\u0013՚]\u0006m\u000b\u0001S#\u0010+6܍N\\UysI\u000f\n>+qC5x׭Z m|4՝:inb+^-?\u0003\u001c@s㨢e1V.%ե\u0000إp\u0005\u0003y\u000eF1Snvӏ\u001a\u0014nMuP(\u000f\u000fxdĽ=ܕSGt\f;63[3K/:.\u001cu\u0011}ꎶBޙ\u001b}\u0007Y\u0006ŋ\u001f\fǍSÓF6wǅ\u0015\u0019\u000f{BUlrp(\nS\tf\u0010oMg}T\u001b#2wRfaM{\t~e\u0017*V]wjw-Gz~f\t7ňxgbG\u001dpwLް#\u000fYU\\б\"DM\u0013\u001cЏ\n\u001bϦ5hԿ<8xu+6['J\u001f\u0000M= 1\u0013ϳߚ\"h\u0017\u001aY\u0000\\u& \u00024\u0011\u000fX>Bğ\u00119^pþ6^qޚ\u0018\u001b+]1Υ(]\u001f-\u001aR\u0007.g\"XY\u001fϞcn+c*'WD_j\u0006f')hz\"*!(\u0011bC$\r\u0015\u001a0\u0007\u000e2S\u0004->;]t\u001d.\u0018:A\u0004\u0002f\u0018pr w$U>Z\u0013?\u000fp\u0014Sћoz\\HN^-QQ\u00148e6(UZ5\u001apZ\u0007r{կ\b/Ӭh{\\mKұ\u000e1;Gi9Tk5F߼/ln&U|C΅π( #jcKp Jtߝiz M$uut\u0006R%=i5\bV{\u000eK큄ȰK#Jhv\u001fa5?g$ԽP\u0014=wע\u001cn3iYWKѯ\r>Xmkmm̛f\twf\u0007\u0007ޯݣC\u0002\u000f\u0007*\u001csi\u0013[\u0016*K]y}\u0003%^\u0001ڼb\u000e\u001cQ\u0015Q:S4kef\u001251Xb\u001fV\u0001=@SBͦQ\b9\rq6H`{R!h\u0005V˪\u001a%FQDNhUs1j\u0005\u0015sa]E+ܭLwJU\u0013)kqkѫ,\\_\u0007\u001e5\u0002$)\u001b\u0014Ia#y:ԼM5\u0017\n:yr\u001cƴȡJ\u0004oDC\u001d\u001cc\u000f991c\u001e+c\nzPKx\u001aQ&I\u000f\u0010sk\"\u000f揖N\fYyF,#S,\u0011jM(nkѡ\u0007-5olJ\u0013/z*$E\u001a{\u0017}0d'^\u000f\nn\u001b\f-nyz:\u0010H@Ak{\u000b/ˊ\u0011Fd4߳X8+8v%v״ɪ{mߧz*ՙuFֵF\u000faoSa\u001dkAŻL\u0006Ϭ7\fKɨlGgR\u001b\u000f]4\u0006<-՛\u001e\u0016Y\f\u0007a\u0005%\u0012\u001aKW.<WVOY\u0003(1-'wkϠ\u001f\";\u001f\tqH\u001e\u0001A'7Vh:9Or5ƈVC۲<y\rdPSq\u0017'Q\u0019\u0006/ALƹ2`\u001dAh}kb\u0015\u0006\biUA\f\u001du\u0017)\u0007\u00049@6^PRw#B94\u0001\n\u001fl~>e~\u0002aVhR-luBV92^\u0012\u0005+r8B\u0015X\u0004\u0006w5_-x\r4\u0017\u001bi\u0001;m>]lת\u001aRk)L`\u0001V8m/q\u0000g.W\u0019\u0017\u001f\u0016C\f-΢\b\t\u00014ڝ\u00162=\u001bs\u0014/*ۄ갭VՎxi\u000e7\u0000Ngs=-22\u001c\ff\u000eҦ3:E{X\u0000GO\u000f(\u0007OJPɏVe臧OK\u0016N!|\u0004פk.+Tweqr;.\u000fN\u0012w&@u?\\'_s4\u001a[:\u0018\r\u000bp5Ҷc\\dMb<3\n贈gԲg*QCͷN$by|]i;\u0004mbٹEu\u001b7\u001d/}A(\u000b=\u000e=X\u001d\u0002>\u0011c}nMޒ]c]a,|4\u0016YoS?R\u0016^ge\u0018檸(\u0005F%\u000epZin;v7W)96\u001acƻC\u00193\u001dթۅ+_eNe\u001e\u000f0+f]\u0016^\u0007׏ٕ}\rsy\u000f*C[>H\r*\u0016ȟe\r_a\b\u0013WEN\"\u0006E0\u0014߱<U\u0010\u00042LOA{/\u0010\\<UA\u0007evq@\u0017.\u0019lNk9jbc*:EC*\u0001A&>zGhwsdVY\u001aͲ]TQQV5}?q&c\u0017[;]q\"\u001ca\u0010\u0014vIֱ`ޫG1$߬ilE?ҰhlZNn?\u0012m䑆tBT^ĸ35`1fTssT;oX\n\u0000oŤf\u0013SFR[~l[8]mFuO!ΰ֧zCE\u0002Į\u0019ά\u0013{1gk=imXj\u0004sc6=[s\u001aG\u001cœџrk3,\rte:_\u000eP2n0`kcScsn}̊~xW+\u0004Ɂ떫C]`\u000bح M|aB,\u001c٭1\u0013Tv\u0007-\t{n7]@Fy\u0006\u0005Z\u001ei3?\u0003[U ^ib\u0003DE;b\u0005x\u0014ܒd\u0012\rѱn\"\u001afo*\u0001s>3\u0015y\u001a\u0002HSk|\u0003\u0007c\u0010]>\u001dY*\u000f`_j\u0017ȣe\u0017`T?\u001a|dxDTK\u001c7\u0015jۂRCh\u0010+E S|?\"0mE`\u0012\"V}Yĝ\\ۊP\u000bMD߼)kO\u0005\u001eo|\u001aX\u0004`6\u0017v\u001a9ﳎ\u001b]gU\u001fqaj𠎌\u0017\u000f+$6/#\u0015d5wd\b\u001fܶ7\u0016}\u001c3I2RE?_RUSR?ļ\u00117sk\u001cUbF=>HTħDMA>\rګ'ݮ}}\u0010\u0001UUӤ\u0012'hZ?°A*Akj9E\u0003٘4a=WoB=$^\u0016tDm\u0012q1xV\u0018\u0014\u0006[\r}p\u0014n\u0017-`\u000e\u001d\u0002\u000b`\u001f\u0019\u0010_aK\u000b\u001ebv3\u0000hA\u0012l\u0010cntu{FQ#2\u0001X{/{I\u001e'6.DH\f&\u000fg\u000e$\u001dboky\u000f%2O`7\u0005ش3f=YQvni:38d&\u001aj^rmx\u001cbQ\u000fЗ\u000fw|>\f\u000b6\\\u0011:\u0001w\u001d>\u0010i3\u0000؋j?\u0016Z\u0012{ίzrv\u0000D\u0017?\"|>-B|\u0000XQLض|Jzw\u000fN^g];;K\u0014`̊\\>)n-g%C,j1لjUUC\u0013/|5gr\fǮ\u0000[=m\u000bY\u0003\u000bYܾQZ¥N\u000b\u0013Y4';cA\u00022-JB!\u000fZ\u0010a$ɏkߩ*[|\\kz:-ROWkC4)΃\u0005wx4\u0019+4u\u0003gӳ`\u0000f/#?F>]FZ򎬻gU[E96⼡ע\"`}%\u00158\u0011]\u0018*\bV\u0013\u00013{:\\G\u0001eR06^QIz\u001a\u0007H\u001d9g^&^+\u001buW!Fr9!?G\u0014gNψZ+!ק$[\u0010$O3<\u0016{\t\bh9^rͫr_\u0007/H\u000e\u00136\u000f3c҃%tr4\u001cz@\u0006NG\u001b{+Xbh\u00173W9Ƅ'8T߿׬auϝ\f6X0|v2bXr\u0000vy\u0018,iS\bzc>_=\n1\nr-3\u0015fVt1e2J)\u001a .ClA\u001f2i'\u001f\u0015\u0016m\b<O8҉ߘۄBl\u0013\u0007O7_D\u000fg\u0005%u3Nytg\u000ev͕]\u001dͧE_0Bx\u0016(~D 3_-Sۭ!2bXRŭzrb\u0013\\6\u0004\u000e}E\u0010!}pāՃi=B:`\u001c\u0004H=\u0017&CD\u0016D.\u000e/E[O黚\u001cOJVKAݯF5|Vkg//z_H\u000eP=\u0015~w1hV\u001dMѼKRI\u0014xGj^Vғ[̙_\u0006=\fP\u0013{QDCa|vQ\u0001}_f\u0018v\u0012P(˿F;5\r;ٺf9ǻT<mгD=9\u001b?\u0014hCt$\u0006N\u001eB5\u000b\u0018rRQK\u0013ҝ2fv\u0000G\u0017Sҧ^\u001b\\u\u0006`Į;|A\u0000\u0010~4{Y\u001b;LَIkȷI\u0005>n{\u000bS6EH3F\"\u0016\u001ed4RH1X`\u0015\u00069\u0016MB\u001foR`Fש\u001bӶ*zn\u001a%7ڔ2j\u0019;ډήZY4bfrbDt\u0013\u001el$\u000f\u000ee\u001am3\u0016Ml6e>R\u0014reEyamw\u000b7\u001e<uy\u000fL޼O\u0017:<\u000e\bXg:?6W\u0003\u0001#%#)tYEWޯ\u0006ufi|9]&oqw\u0015Wq:5]?\u001er-\u0014巨\\T:\u0007tutA__\u0003i\u0010\u001d/_s+f^H[?\u0006#P^B>&\b\b4$zn<>k5R폶\u0015?\u0007\u0000|\u0002#=\u000f}>v\u001fW\u000f^[\u0016^jiְ\u001a93\u0007o\rZ\u0011n\u0010\u001c:R\u001bۓ\u001f\nKmfu\u0016Nnk\u001d\u001cS\rU\fͅ\u001e\u001f2RH\u0012\u000f\u0003f\u0012\u0004\u0001u\u001exo&mwxr\u0007\r'^/:6Z&l;%ͿH\u000bȊN\u0007![=a6Ť1⨳\u0013pո\u0007M$:l':1^8\u000bKI\u0011\n\u0002\u0019zpJ7i\u001bW\u001e4g\b9]˞Cy\u0010\u0005\u0015V\u001eW)VU\\0<}e%p\r37:e=\u0000KQrw\u001f\u0004q\\U\u001f\u0002]EsjIAE%ٿ\u0015HRjS!g'\u0012;\u00150C*ɊjA>\"^'t\u0002f}sj~R|[3hUkv.\u001f\\/o78ȭ?\u0010|q}vs\u0015?ıfnVl@Gƪ[\"\u0001S/o~>c\u001eɘYoXҠ\u0011!\u000b\u001ee\\4t\r\u0003\u0003\u0017XG8j\u0015A\u000eهsrM;\u0012$'d\u0012C7oy̥Gvm)#k;\u00187\u0019\u0000*p[oD|\u0002i\f#ɡp\u0016\u001b\u0015hX\rOL/l2X\u001aĘOcNr1\u000b\u001fo`kڜsљZ\u0013U#E׭Weo-\u0016?\rm?\u0001\u00177ʃ/my\u0016-4\u001d6v(\u0012\u0007a4\u001eXg%\u0000\u0010껁u|JWՎ\u0019+UVk:@C:N?\u0004b3a\u0016Zio &#\u000fҸ4حܜ?=}ko(\u001f\u0019Z\u0000Qe1t\"\fJ2lK\u001flN\u0012ѓo)mOSj\u001a'G>~=]_8\u0001K}\u000bqմ-]0;}\u001e\\\rl\u0003Uv\u000burJ^y}Ƽ^g\u0004c2W^V{ÎGqx8O\u000e\u0001ucV\u001c\u00055tOT\u0007OWO\bt37,\u0007F[\u001b_З\u0016G\u0018/s;,\u001dw3zݧ;թ\b8ʱ9ͻ;\u0000=G\u001b|`mN\u000ec4\u00156ז䂋/s=5]{\"Dn\u001c&{j*5uJ\u001cx&~,O|ε5IjEW;W<c@\u0019\u000e{\u0011\u001d^\u0007\r\u000fwŸ>h<\u0001Own\u0007t{~5\"\"\r;h;\u000f9(J\u0016\u0012\u001cbSlmRS\u000f/STeٿ*YϮwζSvFlA$h\u000b\u0010ǩX0Xאx\u001e(:2ٍpۆު{P#ҧ\u0001Y2}\"j\u0016h7-Ș&䂃T2Mբ\u001eE8ٝvPbV0ܪ\u0015#F^v\u0003\u001aMij5ڮ~іW3*fHou\u001eW.\\[fmມ,!2\tIa~eó-\u001aI]qLǹ7\u0018\u0016=\u001b\\dp\rs5&\u0004$X<X57\u0003znm\u0019t9WNn\tKPOR9\tE?0Aa\u001bΡiudxA´\nfG\u000b\u0017\u0001'Wut:Z|[~{d4\u001d&?ˏ\u0002R\u001c\u0012\"\u0010޺Lh+\f$8_\u0006Xuիr9sFFÑxruj\u0000\u001d[~E#\u001fN/v\u000ewJjz\b%Ȭ.\u0014̀5E,TpZ,Îm9\u001e\u0004YB{<.&^inwG8\u001cԌ}\u0007xW\u0010Z3}HadvkS{H֎NÉ9U֞] {ɆK\u001d\u0018\u0005u6b\f\t\u0012xèAF+᯻^>\u0012\u0013X\u0007\u0017LwQN)\u001bR\bZ\nud\u000f50돫r\u001f_yaA꧲k{Yv՘J J\n|J\u0011G~KN|\u001d=R\u0011,A\u001b^,\u001c>\u0014N\u0016_\u000bgN>{\u0005KVRf}{}K\u0002#7{\by`\u001e\u0017Ƭ\u0006Q,\u0010{m\u001aCJuX(\u0013\u001a\u0007SC}\u0001ߪޫ4myq\u0014\u000bt$\u001bpr~OgM=\r^4d{\u000b\\!JƜ=$婑#\f\u00039\u0017LrdPe?P\tC\u00028u\tTtobm3[9\u0003\u001f˧\n\u0001Ȅ\u000fH\u001a\u0006\u001c'n*\u0018rR\u0013뤏j-141i\u0012T }iG\rid?-0:``b\nY&k%i'\u0013dnP-7/.VBBO/\u0011\u000f:aa\\KC\u000bʷѩdRr_\u0016{͛-og#z.v<Jr.\u000b1)a\u0018@\t.>#io\u0019fKQgn\"r\npۈj\u0003(u\u0004}\n(\u001f\u0015Gjma}\u001c{QQl\u001e޵ބx!Ӻp\tǓ>Pnk3*\u00158tK\u0019tHMY%o\u00062Iyb\u0006L%]q\u0006W\\v@mᨒӽa>9A7:o GO)ݾ3R\t/\u0000*`礤\u001c\u000e\rG|(`\\/\u000f~7Pb/\u0012\u0015-\\+vjCr\u000b(\\]\n\u000f\u0016-\u001e;\u000f=VsQn3\u0017s$iug\u0015Nl.~*'\u0017\u001c\u0001r]\u0003w\u0011,\r\u001b\u001e^4HJ\u0004\u0000Qƥ\r澝W+`-DT[\n~yix])CDz]_\u001b_\u0013*նvά\f\u00144/DR5G\"rt\t1JcX,MH\u0011z^\u001f7nu;_KVhn\u0019ZY\u001a\u001f˨\u0015\u000emU\t\u0013ҍ]+\u000e\u0016PL^\u001b|\f\bT9Eh&\u0007\u001bq+*<Y`G\u000fkB\tyQ!T^4NU,Zm_do%`WA\u0003\u0006?lCٕ:\u000e>~w9]8\u0005yv\u001952W^6.v\u0001TG-\rm\u001eg\u00199\u001f\u0000rY\u0010*\u001fy\\/ay=\u0003\u000f\u0006k-m\r\u0007Xv\u0007t>݉\u000e\u001a[\nG\u001c\u00184P\u0006{DQ\u000e\b\u0003\fqsz}ʇduIwy\u00023\u0004>\f]@1o\bUФŉ?\u0016-_\u0016Ӭn쇺\"@BU~0 >d^:\u0011t\f蠓#0s.V5h\u0016o5O\n&g\r;_4\u0015f)\u000fIZv\u000bV3\bxF\u0005\b\u0019SC\rݓ~J_Q\u0007HL<WxɔocG[4\"T#TZK#G\u0017yq\f.Y\u0007η9cx82F̵1ueBlßQl\u0013iGIvw_+\r+@\fʽ\r\\p>\u001c\u0005R{?㗍\fɏ\u001c+\u0014a5(<<$1\u00000e\f^$eص\u000fƤ\u0011:SLʚU\f\u00029AjZb\u0012ۚl\\}&w]\u0002{\u00076\u0017Xh\u001f^l g`ϳW~rP`[8b\fʄ^>Ѝ\u0006|L\u0003滀\u0018\u0018~\u001b\u0001QgB\u000197`5UgG\u0013:o\u001dP\u001fhLZ[S!ŬfI\u000em+\u001b%ypQ7޶\u0007\r\n\u0012Y-؇\tA[e\"Wc\u0013\u0014\u0011ֽ&;!9cncq>\u001bB\u000bChEL1v|I'\u0001\u00009R\u0013v\tͬ8h*Qi\u0003b\nCu7z\r۾Iw\n\u001b+,Z\u0004.]g⽁o7^<I\u0018\u001d)%S\u001a\u0011\rKxD_\u0010j\u0017*w\u0006f~^$n(Է\u000f\u001e=3\u0011\u0002?#mT>V\u001fߦIT&\u00176zJVѪ~\u0014ơIkP sTx(x\u0005\u000f,{9_μ`p&ơX\u000eOld7.\u0017rs>.դ_ É~k\u0017-lr71\u0019\u0003hlLT\f?kiꋷQpf7Z\u0011\u0003U4\u0012\u0014\u0002\u0014N}\u0005\u001bשUx~[\r5%\u0006q2o0\u0018J{^\u0016'\u0007M\u00012\u0001\u0018\u001adTep?Kc(0\u001d=];=Uu\u001cAjpЀuTf^-k@7cW\u0015T\u000bL/x\u000edzX\u001bf&zqENFX\t\u001bǭ\u0014+\u0016v/mN㕣:Vy%O-QϬ~%(&\u0012Q\u0012df\u001co,&)S\u001aR|bPp8K({eʿ,\"Fd/&jɏ%\"j!s\u000bzbN?\u0004uIמ1^b~h1ns' ׽+=7s3\u001eJ}f7nT8Hԋ9Ԯ\u0007Eߪ*=2\u0003iY-T2Nhy\u0013\u001d.\u0000\"F\u001ev\u000e;\u0019$Cگts_\u001b\f̯\u0013Ǥzx'\u001eZ\u0005yIL\u0015RrN\u0010q\u0002)\u0003V)d3\u001aL?X7W{-iR@N Kn?\u001f\u001b>Pܖ+\u0003\u0015Lڕ=ID>\\<\u000b\u001fm[2h/Au\u0015|g\u0013=~+8SEl`Ч\u001a5+\u000f\u0019\u0013zJI\u001dtָٺᄬ`=}rƖ]``,Ol,JQuh\u00116|w\u0001kjisFˇ\u0007jF3/\u0004R|\u0006F4\u0006#EDXEidn̓9fI*_yN\u000ej\u0019|ڮ \u000eWzԬ'+۩CP]%H\u0010u(>ޙǾ7A{Ih\u000eQ\u0007VO\u000f\u0019\u000fYe\\t\u0013/4_ۛR]W\u0014i`74F\u0011C57OkA\\\n's\u001a\u001cQ\u001fpX\u000f\fv\u001b\u0006~Ig\u0014od_\u0010&$\u0006bkJ\u001a{5\u001augؓ\u001e\u001foUr'sE51\u001dUPu\u0017k;eym\u000f\u0007`ei\u00119?\u0011\u0015ߑQ\u001e\u001f\u001d`ڥuRq\u0007%),!_jOFhuts2n䦍аt|Q\u000eEo4Xw&%%\u001b\u000e/\u0015VЋ-˸3\u001da;\u0000iwfnv5p~!`\u0014cb1\u001aәF/?\u001d4\u0014hh@C}q5w\u0007\u001dыDX\u001651wiS.<\u001bt~\u001b\u0010:\u000b\fZ=Ee9v\u0017![EmMl%k\u000eEUCGs\u0002\u001c\u001dʈi71-\u00182[{\u000e\u0002N\boݎ/S~|c{ך:\u0007j,݈\u0011A\\\u001eW4UgEqPfkF-\u000b\u0011l\u00162\u0012;8 %Z\u001a>\f\tQx\u0014͠i\u0005矆Vvՙˆ1\u0019\u0017eđ$/ǵg\bOP\u001e~\u0005*|\"Um1\u0016q\u001dݮg \u0007N\fҷ#]U\u0015\u0004\u0018\fT9Ἣl֦\u0005%fU~\u001bB\u0012nmu\u0005Z\u001b6\u001fx4u+CW \\$_]zU\npM\u0011늏\r?bϕ\u0005J\u001cc:D\u0001xuZ}Pu1ɠnW\u0003k\u0011hV\u0006\u0015s;ǿp\u001d\u0013]jU\u0015~\u001fPV;+ˢU\u0011g\r\"\u0006B[7\u000f1q\\4Ƈ?[+1K\u001fptcdRNpMphW$\"n#\u001a\u001b2 \u000b\u0010̶#ROuz31\u000b{<;vK6*2\u00077~f~%\u0017N\u0002.28ZiAZ\u0010bKkdHdMtK7'\n^>xhgJ\u0006=\u0018pк\f\u001fv(`#E}jyHK0lyĖ9\u001eE>-eB.\u001c-e*Oe\"\u000f\u0005[\u001bEt\u00076rP\u001765-\u0004'Btd~;\th\u0013*=\u001c\u00028ӎZk\u0012~ڛ\ng.v!\u00188]mlvjfPxz|Sѳ*p\u0003הpOYe<(\u0014\u001aEܝh\u0000;ѝ_+y\\Zi\u0018TM]|BZ\u001fq\u0011U-93\u001f)U5\u0011K\t$t\u000fG<\u000b&ӎnCQOݼ㔼oɠ<\u001fiԭY\u0003~^uxWkVfͬs$\u0019y)E`\"\u0002M}\u001d\u001bxГ?ݩ\u000f\u0006{gs\u0004g\u001cmZ5U)=\u0006\rlvaw&\u0003'l~\u001dat\u001d.fu㴙o\u000f^|c\u001dqXmz`\u001eJ|*x=j\u000b\t'!}~m|]EF\nֻV?`\u001eɏcd'䦳bUYK{o\u000bIA\u001d\u000fp%HʅӸ=O{1rm\t\u0016Jwz\u0013w\u001b)\u001f\u0017{^kK1\u000eԲw7\u001bP3E\\L:bV\"\u001eݦ}܋lyCe\u00155\u0001\u0016Uq\u0006з\u000btߓzF\u0004ёD.7\n\u000e(8\u0012zoEB'f\u0004SNVIXcwnV[$U\t)z֏r?\u0014>/qQ\u0004\u0003\u0012(>\u001cF\u0010v]EXag6e-j\u001fg=CSA+0H(w]c\u0006O\u000btP5ji\u001cDw[Sv?7_)Yܻ\u001bZ[k.gY~~֧ɬBcl }\u0013\u0011N\u0003\u0018\\;&32Hz\u001b55m(a\u001aU\u0003gYMǉI9a2Ohվdfb'{y\u001fjH}+Qz\u001eAV\ry:2<?k{-_>q>\u001d|$]\u0010\u0004\u0006\u0016\u00146\nWnد\u0011W\u000e\u001eA\\\u001c֟\u0018/ba/:q7ڙW\u0012ą\f0A.\u000eB=-ѐtRnvi<NFc\u0014\u001fge\u0001.*\u0005?k\f\u0015\u0010\u001e\u000b\n6><\u0015\baa|*3m+w\u0005,^(U\u00039|~I\u0010ֳ϶2U\nSSa@ĄF:N;[\u001fԕW\u0006i}4dԐ|ʞ\"uiUq<sa*\u0018\u001a=ލR :Vs;H\u0004dP\u001czՕLms|rv}\u001a2Vy\u001dp\u0016V\\/?'\u001f4\u000eͶ2\u001f~\u0016\u001fM^e~'\u0015^sT㛌&AE%\u001a\u0000~\u0004w6~\\C=\b\u001a\u0015\u000ft]?\\:~Lr\u0013;QtdY\u001fxFjCk49\u0019+\fA_k!⺿UM5l\fՙ\b?\u000b&_+\r^ݐ۟z\u0010\u00171\")ݔ\u000fύz\u0011zz\r+I,]I_qb4+鯣I\u001bd٥<]v[\u001f2\"(h/M\t`C\u001e)gb}\u0010\u001a\u0001~&^^\u0012\u0000d1\u0018t9\u001a_7v#%\u0005#\fDG1\fl9\u0019\u001d[0RU^\u0016\u001ew\u001e\u0013aaJ@.}ء\u0014i$տMw\u0007<*\u0001\u0017\u0019~\u0004-j[M]?Vܐ9A\u001a\u0015e2ҧ\u00140yuK>qzr:fejg\u0001\u000eWe}\u001d\u0011a-Ræ\u0016\u0005u㛡$wCe2苿ɮ!-ɝUSwd\u00040mh/E9\u001d\u0004Ԓԅu9EׇɩCL4_\u0006\"պ@\u001c#e\u00014y\u000e+vi+jsZ,J\u001a3\u000fQ~l;u\u0001/k/*ȷ\u0004svl01\u0000?Sb߯*jG#|aA_\u0007\u0005eŏ\u0006k+w\u0015%*PJ:Wʯr#k^CU?+?\u001dS6\u00167c=M%nJe b\u0012\u0016K\u0018=b\u00039`O][\u0000,ӧ\u0010>\"HH}L9\"UAN]ݽؗ'c%%4\u000er\u001c:ҳK0\u0013Q3OXM\u0017[`\\%\u0007\u001dp~i;M2J;\u0004s\u001e;[\u000b*;P\u000ej\u0012\u0013\\h\u001ea*X~\u0013j\u001fq\u0007'\u0002VsLxm&?\u000e\u001e4!^a\\7\u001djVa\u0017]0\n6Cu25J\u001dM'}\u001bm_\u001aV8\u0010k<\u0011\u0015V\u0014M,.ܮ\u001f{jUok\u001csZk>M);p;MB#-9Z +4y̭-P4o\u0011`nˑ\u0006ۛ:3\u001c\tm=jF\f6\u0012\u001d\u001905#n\rQF\n\u001aDߨlӳ\u0018ifunw7zk\u0019*M0\u001c7\u0014yA}*\u001ef<Mmի=Yк+v-^ԇOjN9ޫ;L\\mo,^\u0005d\u001az1+=TGU%IX!\u001eu--{SZ赂\u0016iV\tG\u0017\u0010}t\u0003A]{H\tj(Q|e\n9|eLOcq9ɔ\u0004r!\u00012Ѿθ$Msٯ\u0014AVcto\u001dl\u001a\n/yfڽ\u0018\u000b'䜶\u0017jC\u0010z}3Tk3Bw\u0010D,#x\u001f~M\u0016ƒhXX\u000b$:Vl\u001f4jP+W\u0017ԧ߀1\u00125iy M|G?ùYv2Kyj;eplS1S\u0004f*t4k\u0017r.v#JRt2ANmpӺ>\u001e1H\u001d:rq\u0007\u00058\r\u0019cm!,\u0007\u0004pD/>g\u001c}Ѫ\rKO\u0017I\u0006ˣ\u0004\u000eB\u001b2dp*YB|\u0006_烜T-s0fwuKyn~|\u0003\u0016h\u001a6#C\u001eE;x{\u0011q6\u0010I u\u001d[\u0015#\u0017߱7ܟKOi&Yv\u0016 d$ ;\u001e\t\u0006WuObyW0͕Xr/\u001fY\\%F;F;Iaql9\u001fa9qK+I<);\u001f C!enVvk\u0019rt?ZBy7A[;\u0012\u000f-]\t/Oߍ<Sx `~\fDtp\u0011\u0013-X0\u0015*٩y\u0015\t\u0006\u001dV\u000evIِ:x*Eǫxye zǒ1nD.5<n5,\u0010\u0016V_E]y݂cf8JI%o藼\u0019kLz\u0006\u00001a-hֲ̲\u0006({M\u0005er;_#uf{_Qҏ\\mԂ+:\u0014/(\r&\u0016\u0015~/GgG1^tT8,\u0014GF\u0000f\u0003zV?|hIx\u0003\rJ\u0002+߲\u0019$RJb궨v4bM\u000b\u0010K\u0011hu^s^k\u001e\u000b\"\u000e\u0016R:\u001dQtV\u0001JcUsf\\/jᄅ\u0016\u001e5%߰'o\u000e4~o\u0001ZNLyY\u0001SʞR\"S[>?K-FU\b\u00057V\u001a%\u001d\rz\u0003:cy\"LBOFM^9`?\u0005EdUflח\u0003٪Jko\u0006s\"E%DL\u0007h'\u0012f(*ʨ'6r\u0018-j3d\u0018*s\"Z^\u00195oGV_)\"\u0010\t\t2tw|\u0014`\u0017ZKm<\\\u000eS23ICUu[\u000e\\㻊\u0013m]W;./eMXE\t;ּ\u001fE;~lv<ޑң,\u0002\nW5\b̪}0ܑ08pzܪ֦*].@4J\u0003\u0003\u001b\bw\u0002\u0001\u0014|\u000b\u0004E\u001d\u001e\u00028\"u'}\u000bQ\u001cQ}0oMM姢\u0005鲇=#\u0004|\u000eMڸTȹ*5\u000e\u000e? _h׊WX!.!Ї`ޙ\u0005\u0011~xyK=\u0011NISuZǶfs\u001ack\u001c3w\u0002_\u0019]Aڔz3\b6\b=3zlv§4'zgu\u000bp͐rqKԬdJPdx,\u0014}7,\f\u00121&u\u000fFw`\u0015xis{N\u0014*$ٗHj|2|\u001bGŭ^#z\u0011ҟuOdu:uE\u001fBE\u0019gf!f.&j?d#\u0018PK *\\ĿP}\u001aսw%Q:j\u001d~$!5UyQ\u0019c&UiUЬm{\u0010@b1 imG1\u0003,#\u0004Tk'ds\u001b\u001fz93\u00026L7[X0<i\\\u0001P)\u0019\u00175T\u0010xlQtW\u000b\u001e;l\\WG4<yi`ˉ\u0012\u0019͘\u0004PџߛJ<ZS4\u00172\u001av\u0003ݰԽ)mZD?\u0017t\u001el,u8&L.${!|\u000fov.Q]imjvE\"\u0002Kue\u0004\u0001=ᑋT=Nn4EKq=[ +I\nЁ7e7\u0006\u001cj\u0004jEE9U.NZ,\u0014&cӷx\u0018S\u0016\r=\b\u0004<k<3^\fs\r=`S򱻉\u0006\\_#h$D,/j\u0014٫\u0013Gan\u001fopб]Ė\u001bK=\u0016\u000f˥΋lX\u0000;&w\u001e\u0013&p[75l4\u000bN\u0014\t:0a3]uvˮ0):ǂJ=J3'\\Z΂q0f#KQ{\u0005y\u001fc\u001f)O\u0019TĿfI,X2LiN\u0001gE.\u000e\fn՘Gr15d̿\u001fߠ{\u00066[ֺAIZI*T\f\u00191\fyՃŚ@{nл3\u0019%kv\nPo\u001c\u0006\nqUsd'\u0015L+b_;2(\u0003\foג\u000b~^w\u000bɟ푾ag'7Is%\u001bѯF}:f;oOCq\u000f\u001bG\u0016+N\u0001O}\u0016q@znS\u0017`׾Gڛsn\u0012U\u00148@\u0004[KLv\u0017frq%&LX{9\u0018>0wpaIn^VD;z1.x\u00119\u0010a:>\u0000R!8892\u0000QIb%9|~o\u0019\u000f\u0005\u0004vHHUC\u0016B~Ƣ*c\u001b\u0007\u0000CQ/\rSye&jZM\u0000\\?hJPr\u0004`UQ -m\u0014=ȳn\fBc`IUZ:!,WP3'\u000eӱy\u001a\u0012 BR)[\u0013)wϳjK8d6.8:\u0006gs}zxj,fKXJ!+[\f<$\u001dDr{r\u001dVy\u0003\u001dqbQ5wiB\u0015t~x&s\u0014\u001bꁕ\u0005yϓjR6?iZ8\u0007T0Sa\u0007jnj3\u0017bǑe^&C\u001dW4d\u000fՏ^\u0005AR\u0013tLt?O3Aw=\u001d6DW/TkG`WJMR_slmzg9]#\n\u001e((R+%\u0019}isI>\u00114.r\u0019I0㵲piUI\u0019TȄRD)z>\u001fc6\u0019fySJ\rKyk!(.Jꬬ/9nO@܆\u0006Q>wI\u0014/?ƢҳijIጚ;-;ޤyĄ\u0013!(อ<R9껭0a/?f޳;\"3\u001e&ހ<v*.OkG5\u0005i'\r:S0\u0011+\u001d\u0007]\u0019\u0014\u001fB^(%KKGT;>\u0010'{~SR\u0013\u0018po\u000e;A)Ý\\֕\\N.\u001e\u0011p\u0010YbKk{\u0017z*\u0019f\u0012\"\r?rMU(>\u001d \"\u0012JHe;vws\u001b\u001daZ;\r\u0013sO\u001fo}\u001bQzsih\u001fx޿n[t\f^s(m~\u001a}Vǐ9;BF`fRZW<k!8c,;|T\u001a.vn\u0010'a7\n,M\u0006e7Q8fy*Zs\u001dN\b}Ϻ \u001b6}\\vuN>ҧ4\r#vq\"\u001f}\u0012~Q\u001ě>VlQ:;%f0lRXe<$2Zm=\u0003B|!\u0017m[Bo\u001e|rcI4wD0\u0007p9:\b\u000f̊M\u000ed\u0016|a@vga\u000eLG@EG\u0003\u0003\u000b\u001e7[\u001ex*\u0000.u>6f$\u0005\u0018eb\u0000\u0005#^\u001aۤ\u0007;\t\u0016\u0001\u0017J֤L\u00198:9=\r\nendstream\rendobj\r260 0 obj\r<</Length 65536>>stream\r\nћ\u0001\u0015k6mZ\b@YkI\u001e\u000b*3\u001e\u001f\u001f@}fyiCTiYv4ͤ+M.O\u001eZκZBGvkRF\u0005 zso\nȩ\u000b]E\u000eƎ\u0004c\u000e\u0016\u001f .AVʖlS^jr\u0016^+k8yԺAgN%1\u0005)_\u001frU\u000b\u0010ң=\u001c'ip{ZVOi\"ip0Xsϓz\u0013\u00001ѹ4j4\\a\u0013U\u0018\":=S\u001f#`}Mt3oa\u001f䰯˅5{O=Fx=\u0000\u0010\u0016+gcz\u001eq%GЩܲvRkٚ\u001f r\u0018+hhu-J\u0002^Uo\u0019\u001e\tH${j9\u00102̟W-x 8Q22vv\u0005\u001e=b\u0000\u0014\u0011\u0006\u0015PB{ս3?nϲϗngXc1\n\u0011T\u0007ƑfitYz\u001er\txov\u001aϘmvk7\u0001|Ca\t\u0007SO9:\u001b\u001aW;\u001fC\r2P\u0016Zn[?\u0007=R0(k\u0013~*wڄV\flz}ғїB*\u000e0Y\u001d\u0003n*)/\u000eL\u0006vob\u001d\u0001\rV4\u0000ʐt^l\u000bÌᔶ=ͷ\u0004ۗ\u0018ք\u001e*32Haj\u0002lW\u000eeܮF>s\u0011չ\u0007JүMj\u0016յbic:q.N!\u000f ۛ\u0000L꥞4 N7]u꾰mMh\\򨮻\u000f\u001cK#$Y7c)(ٖ%\u0007_Żп\u0013_\u0010TAo5䧕w,Ӗ\u0004hX0\u0019\u001f\f\u0007lWgb\u001f#\\7?\u0004+g\u0003\bS\u000e\u001c \u001305\u0010&9\u001dw~Ы(pz\u001c8طs\u000f+IMA$=Xb/\f1\\/cSj\u0003\u0002h}-іw\u0017WKݝ7v>`9%l%7mNI\u001a_QZ\u0010ՁfCQ8Z܋g\u001dl݁WJ_\u0016Ћ`\u0016S{갣8\u00152$mθw<\u001a65hߨ\u0013r{\u0013{sy~_\":7\u0017kW$[܀r7\u0018{{e˻Z|9\f4%5Iؚ}\u00043W\u0003XJc;9p<27^-ܟA-½=,NZ攜\u001ds,\t\u0002/n.sM?Z~!8X-{{9J+,aMg>xMi]ݩHy\u001d_̆q[/φX^zŵr]r |~\"eC+U[-\"ƜMO\u0012fܦyڬ¦YY0\b\u0000ȵ}܆kDg\u0005~) ً빢Ȓ\u00177'\u000bJ;\u001dc^\u0017J\u0003\u000bDtޅ\u001f\u001dc\u000eTuo[/O;K=\u001e|\u0002\bgsG7\u000f\u000fz4?\u0006[X'2?g_{m'\u0016\u0010YPaAv:4d}fu\n\u000bK\u0013?nwL\u0004j\u0003w9#y\bGІA;&5?[iĪ\u0017%dm4\u001eLh\u0017\u000e:-\\{ri\\gTi;&fVr7Ņ,na\u0007M5&\u0015y\u0015jqoͣ/:~mY:K(ʵWzm =O\u0013|x9\u0011\u00067q\u001b=:$ol^&\u0003Xh4:3\bZU/[RK8QmIkҖ\r\u0011+:3\bţy,\u0015s>h\\ݖd?_fϧņkˢ\u0019\u001fE\u001d2k83(\bώ3>d\u001eP\u0015}\u0000p\u0001tɜ5dؗUIXPXZO怉My\\\u00137NR\u0018W\u001cmr\t-\f4%0g_1Q%\u001bsP\u0000bL^SoO_\r7@F\n+\u0000\u0005=J_\u001f5 ڷؗTH!\u0011,\u0018^j\t3氽]ϪjFe{>!U\u0007O\u001c\bLӻpM<V.;uּBؾd-缬}UY\f\\6nmuѩ:a3$lu\u0007NbEb\u0014\u0017V)HG\nrevfGj>Y\b\bC^scu^nх0L\u0006^8\u000b\u001f'NaW\u0011פf\u0003>qPz?N\t8KWe\u0013R\u001bD;\u0010\t_g򔑺̗'u֝/I>:0[\nրtܯ\u0015-G\u0015Կ=tKY\bj5sT}Y_(\u001e)\u001dtsRin\u0014gR\u0013f`[R<\u0014\u001e#m{CA\u001a-{\u0012+Du\tniV|\u0018\u0019F\u000bϜy\u00032{U&@Y-\u0011\u001dS][-xPA>\u0003g=^\"\rO/ww!_[ߺQHb0:\u000fs)a\tn \u000b2q\u0011]X=MγIO-@`Iu#ˠ^\u00106*ؓ=r侇z\u0001`.mlz=\u0010%\u00037|hX[\u0000\u0018;3qFx\u0003~髹,4\u0004D\u0012r4\u0013`\u0016h\u000eՠ\u0016\u0019\u001dPlRxP^l~w\u0003\u0007T+\u001ff`;\u001dQ)m}6P[|su\u001br&}\u0010\n/dH\u0016͙ԉKw:\u001dzZNcf-QDIcc{snυEyw\u0017#n붿D\u000fKm\u0004S\u0016d׃F燉\u001a\bꍼ:\u0019ꇫ9Jk[q)_b};^)ÎWfv:N.QLKqoX\u0000=-$F'I~U\u000b\f\u0003͑\u0011R\u0019po{B\\$_;=\u0016 v\u0019X\\'`\b`˫w͘iw\u0004d\u0010V\u0007k,BY-\u00067M];{>R?B9\u00079@CQ&,\u0018\u0003}nV\\\u0004\u001bR\u0007A\u001b|L]LvQƭ+ݐw9o4'\u0019{x\u0006;;m!Y\u0014㿿`+ӿd1(-󩏮:w\u0010\u0017\u0005ܰ}=\u0001\u0001G#\nrPpWD\u000fAíARk\u001d_$\u001aƥ'\u0017l\u001buPWMZ+`d.Zf&GI/m=oŀQ*xbpٻE5Ə.#\u0017)\u0002\"\u0001m\u0017K\u0003-@hYTFERt\b/\tĎ)Æj\u001c*YE{\b\u0002L\u0000M̩\u0011WݕzZ\u0017h\u0003KR=*\u000b=\rm\t])=\u0006\u0002ˆ\u0011NrVS^fjX$ܨl9\\G~[4\u0010-s&r7chj)ɔ\t\u000fCUdУuT+y[\u001d,\u001f\u0004rB\u0002\u0003'\u0019-2P\u0018\u000f?%w^\u0000sk\u0003G~u\u0000; ^Ht\u0019F^\u0007\u001a*%w\u0003\u001b?HU~<Qq\u0006GSͪ(Ø\u0013?3\u0014\u0003yѬU}pZa/\f*\\:S\u0016Y=L\fĵֹ}g?yesf\u000b&zf|\u000e늖#\u001c~z糅}0NB\u0006ϱgr:ԏj\u0004J<:\u0018;pˤ{7KkDC\u00126\u0016ߒVEEda\u001a_T-K;U[uȺa\u000b\r\nHT\u0000\u0011Pi\u001cur\u0005\u0013N\u0006!/g\u0018z?wt{50^y#fc\u0002_\u001dN\u0016\r\"3JIP]@+ӏbժVLTZ¼91\u0012\ft2\u000218\u000f\u001aFB=]\u0011C~+CYp\u001d\u000eV\u0015Yr<Jt=bR\u001aCҫ`vj\u0001\u0018'837\u000b\u0019<sV>oDkT䪱w_ee~\\\u001d;ykբz~Y|u3\\u\u0010\u001ew\u0003˨\u0015K\u001b\u001dkKƽM?B<ɫLa\u001eHy\u0003\u001cL\u00013\r6}t?#k\u0007`\u001aE\n=\u0019Kd\u001f\u000fe\u0016w\u0014Bdf\u0011zЄ}\u0019աTxdPp];ryX22Hxrz<bl'd!An&\u001eӕ\u001f>\u0017|8*nFy3gv4oy@k^,ݺ\u0019\u0012WG}i#P䒽Jo*)s͛:L\u001bQ.ܬ&\u001e7\u001cW|~y\u000f3]5\u000eSE\u000e\u0002uŇN\t\u0018\u0007FVpT\nQLxzն[\u000f,~,f6mօV\u001bi\n|a/'\u001d*ǒ\u0018ve\u0014qPpGLr3bˋ_~'A\u0015$QYW86\u0002dUM\u0003\f\u0007|\u0014fm3\u001d1Cm: \u0018m;x]=lY/Q;w(\u0014:}\u001cﴵ\u000b4`\u0014bf]bޘ^ϴjgQ\u0003utB4\u0010VY/u{>\u0015׭\u001a6_87?҉5#}\u0003\u000bm[,KcdKW`ƮȦz\u0014$?=)WL\u000bO޲\rU\u001153?\u0012\u000e\ba\u0000#<\u0003\u0015{\u0010c q&͍ح\u001f,7\u0001G\u000bp˃my_.\u0001@I]s]rήl\u0007\u0019\u0006oӛ/\u0012\u000b\u0003Y\u0005l\u0018ގ<x'R\u00033sdO?\u001ed\u001c)36N_$wk@\u001aRFuoƢFRiϊ/\u001dجOCX1\u0019t\u001aCۼq\u0003+hpu.c\u0005\u001d\u00155\u0016Psf'n3&+/\u0016Wa~\u0000K\u0001Tppy\rǋ\te\u0007\u001d%Dd̦r\u0013Z/JЃqBl\u0017$ǭ7,u?\u0017tT3?5D\tnYB\u0017^<(Lp\f5yVn3^(k]&\bm|HmI\u0001\b>a~5.\u0012f9X\u0005mlVZL-/{{\u000fuE\u0000<9ٶ7\f=rm<e\u001d[U?\u001d~vu$`m\u0015hHp>س}\u0004;\u001e\bw,\r}\u0001N\u00173-sQ>\u0004\u0015Cy\u0001A99W\u0007\u000e\u0001>]~V\u000bmS *\t3?V7\u000b8!\u000b\u001b޿X5!C#na}e\u0006@\u0016ϵicP(\n\u001f=h\fW{\u000f\u0003k\u001ap&rpz\u0005B{eh]\u001fa\u000fd\u001dp m\u001fj\r:3CJ_\u000f; \u0007$]\u0000.\u001f[[\u001d^Kk*|\u0015~nͤg\u001d\u0019n.\bA!ahZ\u001e.+-4:*u鳬o\u000bצ80fʨE\f$MX_D\u001e\u0003\\B]\u001eBKډ;\u0018y@߬!W\b>[NM_gƾç޷ܰЬ\u001bǃ\u0012a0ƹYn/]̙ڌa\u001cmȢw)]MBx\u0014_\u0001\nic.m\u0010[\u0001\u00106}A}\u000f\u0018;c\u0014n}\u001b\u000efQ\u001dvپݒ?%8Zf.x\u0015\\qx@Y74:⃣!?!\u0010Υ(c>穉݆FKl::<\u0005X\u0019Vf\u00058\u000f\"\u0015\u001c\u00061\"۳GhNc/b^S(iU\u00199M5\u000eMc71O_#g\u0011~-ʳg؃˞)ܙ;\u001769\f\"'\rQvP\tt\\\bd\u0012]P),~=\u001eIJֶsz-jNRˎ6yA{}:f:n\u0018,xwkR]=\u001fO^^M\u0019[o\u0010{7Jkhg\nu\u0018zκݫ48\u0013H#)d7h򉥳\u001fm&wr#a\u0012sX\u0016܃_\u0001m \u000f;~ΝgǠ]\u001f-\u0005BC\u000eFuRG;\u001c\u001afo\u001c;q77Eߵ.}\u0011-4\u0006sL\u001bunrdp_+Ywswu=x8\u001eJSWa3K LKWo\u0011nQ\u00181ȃ]#$*6\u0007~\\\u0007_NvZ~O~=dI\u00009/{\u0019\n\u0011=\u0015B:pdOc0i\u001b\u000f$9qnK\u00156*\u001fn|Y\u001czPH\u0010Л\u0015MJ\"=;{\b_u<l\u000f[zq%\u001f\u0014q\u000f,+wgLru pMo,85tѾ,\u001eiA&\u001ejo8XX\u000f\u0007nc%5f\u0011!|\u001c\u0011?t)D@;\u001ayCot\u001a%91RֵpP\u000fcl\u0006?\\M\u001fw]hǁ\u0013Lyꌋ͗=fn߮L\u000fp'SY+XNY\u0017\u0017pyRo5W!b4{\nrʒ%dW&_װB#Ѫ\u0017Q͉՛~tM|>F\u000ff\u0011t\u0003\u0007pj\u001dep\u000fQhN'\nԜ1\u0019B968Q\u0002nҪ_:GĚ\f󉋱\u001bZ3/ \u0005A\\\\Gm(9k΄RشE_z0wA=7UR[@j,\u0000\u001cJiۺ)Zζv\bje\u0005Ɩ6\u0018I\u0010T\nv\u0017\u0004\u0016\u000e:)f\u0011\tݷO^\u0013x=\u0018^X:9Jջ?\u001a-߯\u000b}8NԶjA\u001f\u001a(h\u0016n^lG\u001e\u001dx\u001f%J.<7Lb^g8?8x\u0017oJ؇<\f\u000etx΂U\u0013\u0003\u0012\t!C\u001fL\u001e\u0010-߮O󱳅dV\u0013^[v\u001b2c\u0002r6vd{\u0014<:JQ\u001e4|8E+/)7~^wbѵetF$U\u0001wefzE0l}\rwjcKClb\u001f\u0012JaOk}\u0018Gl?QG^O/Q=@K\u000fZ\u0018:\u0002ϴ;\u0011\u0016\u0001طzqegb[\u0001\u0004j 6i\nY\\ϕw\r4\u0013p\u0017m\u00170}\u0018^uF\u0006\u0006bfMvkmV͕3j\t\u0003\u000b.%4\u0017\u0003gg\u000b\u0011 NkY*\u0006t7jI*jz\u0005\u0017@\u0007TI'R\u0019\u0006xx,\r\u0002γ6p\u0006%\u0000\rv\u0005B\u001e.k<,*M_\u001eڻ`&r\u0016k[\u000b/l\u0017޽S7V5OҒOfoϮb{P@iŶ|~Yw\u001ex1QȜ9U\u0010\u0007\u00193'\u001fӑQx\u001a:\u0017ܾ>}qZ3\u0011ဎz)s \u001d1g )-&DL\u001c^Y9F\u0018E%n'\u001bP_ُ|\u00059ȵx\u0002TmQ1ܵҠ?連W\u0012=\u001e7\u0005\u000e]'k\u0018Q&df%s0\u001ay\u0014y\\Ũk?\u0007\u000e'\u0012ZV<jq\fLo; {T\u001d\u0019\tϷ*ĵ\f&+Y7\u0018j*Gf{׿H\u001cҘ<7?M.$5ǍH\u0017\u0011Q񼄬\u000fu\u0013Eg\u0016\u0001\u001b!U\u00001[O3S}^\u0019rRi<TX,E\u000e\u0005\u001b\u0003:@\"\u001aÊA7F'^ʌ\u0000\u001e}{\u001fy]|Lס\u0017k!ԇ#^K\u000f\u001f0\u00074\u0011LZvf\u0003@N=ѓ\u001e_sy\u0017CgbD4A7 \u001d03ƇH\\ő$\nu\u001b\u0006e\u000bq\u0015\u001e?;z=*C\u0019|pD\u000fo^_\b\u0014lj\rw\u0016H6\u001dYv\\\u000e \u0014\u001d5B\u0013'6]D\u0018P\bdD\u001fq/W]c6]Kk|N|>+pf3`y^&M}\u000fj`1N`|yʭy\u0000\u001a>T\r\u0012\u0001\u001eQ]PQBX_\u0011Դ,ahc\u000bul\u001dcYrUYBKV\u00110^#mL\u0010\u0017ԀHX\"E7\u0016etcVAb\u0012/p\u001d\u000b3\"`bd\u000eU\u0013w\r\nժwvՎE8AyCkNgf5<=9M˯NX9Z#P+L\u00043\u000b:\u0019\u0007ߌ.\u000e%\u001a\u0017rM#vz):\u0005nzv\u001b4\u0005[):ޘW\u001cij\u001b6?18aL\fֻ7\u0019a\u001d&\u000fq\rV'i⛒}(ž\u0006o^*\u0006^+M}S]\u001e9o.(%T`z\u0014{\u0019\u00116n_b\u0016HBDG[\u0015\u0007$jah\"V$F.+@Pg\u0016l&yՉ0H\u001f((](Oq7\tPNOݧp_j\u000e}Vy~^\\}\u0012As<].\u0019\u0011\u001e1~\reٖz\f\u0007\nA>ԢUVJ,^*,1O\\\u0016s337{4B\u0012_IMV=^5B>fųQ:KjrbQq]\rϛswoVڍ\u0014`@\u000fXnK\"B9bך\u0006Yin\u001e4ңwy _\u000b#\u0015\u0005T\u000fz#zQ40(:z\u0015yG#`o\u001bb>pS\",.\u00126kÕ\u000fIOP瓜v\u0000ijؤ` >Eo~9\u00021oWd0t1\rYG<X~F'\u000bih(\u0019!.;>YL\u0006XjU4\u000e\u0012<\fNT\u000fY\u0015\u0015\u0014dKM \u0005}[\u0011^n9.OIEy|*,\u0013jn\u0018\u0000[J#|蚱\u001d{zq\u000fc JjG\rLf`/Kwz8\t\r{We4SSOJ#\u0013\\z{\u0013\u001a:bsP^Ɔ\u0003oO&?6Q\u001aX1Fle;QQ\u0019ۉ7\u0014Mӛr\u0007_1@-)eG\u0013\u0007t[\u000b+~TKhD.o\u0011;b?Q75'\u0017#\u0014㖲,X!7\tOՆv*D_\u0004T\u0017~\u001e\u001f$cNv$\n&kv~\u001a7\u000b]\u001a9*Mwݫ(ǰ5$-\u001b\u001dU5K\u0001z\u0018߽\u001f\u0014J_*p\u0013&\u0017\u0013`,xժ㥆mTso\u0016͘l;\u000fָ\t{lXZ5[=I\u001cA=|_\u0001Bw\btӔL\u001cԞ\u000bc\u0003L/\"xUj\u00042\u001e\u0013ܬ\u0011gW})oŌͿ1}{xܚ iJ^@[\nqG%m_QO0=\b Oh+\u001a\u0013K#\fwU\u0004\u0019y'Gz{@ӇP\u000f῝_7/~\u0010^usw\bk1<16FKX\u000b`?K,Pzz\"Gh2'˂\f\u00191>\u001cG<'\u0019\u001bo}s\u0015\u0007 <\\֔\u00026\u0010\u0015kOr}\b\u0002U,\u0013ɻxs2'uJ\u0007 ^r]ɳB7.DH$eWE0g\u0010C\"lkG\rlO\u0001\u0006W^q'UQ@:N\\N\u001b\"\u000b\u0004Jh\u000fNDn\nde˟*\u0002f6t5V6'\u0016CC>K\u0013J\u0003P\u001fq\u0007~h\u0003\n7ʛrw\u0015\u000bZ\u0000pE\u000648myyUsṢ&V\u0004\u0000\u0007jk\u0011-`_\u00028\u001c\u001bl8?e\u0005Xm3e^!(6#FYݫQn\u000fό󵇫y?o\u0000!F\u0012?vBED\u0018*W{{~jYٛyZ\u0017`'C^zZ>3\u0007\u0016Cb\u0004{1.=\u0014XΗ$M?gEZ?\u0011|\b'^Nԗ\u001aXF\u0016?k'(^NUGo~A\u0019Wԉv\u0004αrg{)yӲR[k\u0005\u000e:#\u0001\u0014\u000b'=\u001aV,~\u001dcWUu{\u000f2EcH`%Z.O7\u001b\u0001a_T\u00028diɥ21+%,Uex &3O4B?Oo\u001e2F\tEGKQۺ\b7\u0012R79\u0011}~+\u0006J'\u0010|蝟@\u001b\u0010\u00167\u0015\u0015nT\n8b|XӃp򵴑]Tpv]7u\u000f\u001b^GT=$c|\n<\u000b~/3]~9\u0010\r{X xja?\u0006\b\b@_શl%{ojfI\ny#Weզ\u0015K\u000e\tm~XڵQ\u0007ҷs=`tn݊gR\u0005q)e\u0005<-62m&Aǅ\u0003ؔ\u001b}\u001a6\u0013o`(Bp{tӛ\u001fA<C:4F,\u001b&<\n$=x\u000202ń\u0013\\j';\u0006 \"\u000eo\u0011\u0007n[/v{ \u001fNh\u0001/\u000bJ\u0007 @\u001d,X~\u0019^6b\u0019A\u0010V#Uܜ8`Z5ʠF̂\u00163^uїP\u0013\u001b~\u001cBp\t\u001dЪyi~\u0007șd4p'X:\u0018_ob(~N{MED\u000bLg%׫w/\u001aB^GK6yxT\u0012@Fkno;\u001eO.\bv\u0015=tzi\\L&V\u001e0Bo]3*8\b-4\u0003v^4眅阯9&c\u001ejD\\\u0007bEv+qkc`*WsYtfhӦ@M#]x{q\u001e\u0013\u0011[aWΡ\u0019S\u001b|aRfp9Њ\u0015X\u0007{\u001c\u0004]z\\ݖ\tƾ9M\u000fVEq,/\rˍv\u0019c\u0003ذؙ9\u001evU\f{}\u0012#z\u001b*p\u0015贸+7M[G[s\ff?\u0005;s=;\u001c^_~\u0001bo\u0012ޚ\u001b\u0004q`md#Iۭ]w%8JK;y\ru\bϞ͛CW\"\"zC-V3a\u0018`.U~AHzJ{/\fǎ\u001d\b\f/\u0019=cc\t\f0'\u0004k7CakH5\u001d1.ڣp\u0013d\u0007F;GN.66'?hT> q~E}\u0011;$Z.0G2-\u000b\u0007\u0015i:z]mAc|Ǭdov'อ\u0017nb^~{w<5qJ(Tj]\u001fn\u000b~4J;)L:U\u0011lϪj{9\u001f6/a3L\u0004sRmӖnE/ӷ\u001c%z񺵶.2,<C[~pH~,;\u0011' Ӊ\u0013lMw7ws͍R\\\u0014Z;_R`\u0001{\u000e\\T\fP}PA>Xv\u001ejW,\u0000p\u000bw\u0013'(|r瀶~\u001c\u0010X&(\u000167Ȕ\u001a\u0014Yܵ}Otg04M{0gi֒N6.O\u0012?\u0010f'cT,_$ex$z\u000f:ܚSS`\u000eq\u0004\u001fFn\r~U'yC4m_7\u001581@ٳdTrMrk\u001d\u0012'͖bVk4Nss\u0001~\u001c\u000f)\u0004\u0017uwh=~hd!\u0016GvrLalv!61x_tОMV?;/\u0012¬$Z2c+\u000b&\u0014{\u0005bZKu^^uqv1?q:J\n#\u001dKQrZt\u001dt\u0015߀&dtpG|;ڨ\u001e\fyQL_pCM5\u0013'(=u\u0017ٽc}(\n\u0010\reP&c+Fm\r}Yͻ\u001d\u000f:xUqhz\u0005Pf N{\\25ĺ'\u00010l\u0014̊Og\u001e]7^>˫1S\\Ժɷ2VB$⤖,lY#1|$ZU*áY\u0000Tg!\u00022\u0006́\u001b-sDÏoS兕p\u0019g`co\u0013a`MA)بs鯺nN\u001f\u0018̇J@t:\u0014\fw0H\u0011wwm\u001d*PO\\ܹTF;\u000eAH\t2pun \"\u0005%UF{k&V֯\u0006;҉i\u0005=o(\\=`\r1%_@L)3yT2A#!1½$*Y*\u0016@]_\u0004\u001b\u0014w/i]E}mdѴ\u0017$\n62\b5uO05\u0014$)/JFz2P\u0006\u0017S2cZSQr[M]Mo6;\u0005Ee/\u001cvwyh 0P)<\u0007Mt\u0018<+YDo/,W\u001d\b\u0002߫\u000f/KާȌ{%_xo\u000e\u001dx2\u0007K`z\u0005:eH\u0013uuHjc]\u000bF߈q\u000f#G\u0002jI.\u0000TӤKj\u0017\"\u0013\bh\u0012\u0010zQ2\u0017~3{ȸ\u001a]*Ň}ZfbMݛ]-\u000et}0uun!L\u0000\"ٹE\u0001G;\u000fQ2q\u0010̞\u0007b\u0010ws\u0004!\u000bî4Rܰ@+R\u0004c}z_A_F#rlXzXC\u001aH|@lkMapU\u0010\\U\"\u0019%Dc\u0004(5;wpd\u001e\u0019z\u001fn'\u0012Ӕ\u001b\u0007մQHejVZ\u0002/uVh+5ƈ+\u0016֭k΅1hH\u000eWNwy\u001aD2\u000b\u0010b|^;\u000f31BdI*u^\u0013X%h#=H9\u0016LUF\tn,*WW5_\u001c\u000e0?k?\bR\t漡\u001e^/jt\u001cșL\u0015m9FLӫ\u0019*\u000fwe/H%/\u0004=ә+\u001aE~\u001e\f[su\u0006\nMx\u0013sl%&ќ\u0004T_۶$s\rYg0U46\u0010\u0016Eϔ\u001a2\u001c\u0013-_cLO0p{\u0018\u0001\u000bgS\nxy׿̞f,rnƶ\u0018B}\u0010릮~6\u0018\\hDiKk\fFW<r\u001bYf~,ؿśN\u001ckę `(}\fE\u000e]\u0010Rq\u001d`\u0017')'\u0017hSvnvtbMi{}v`ܬ\u0005|\b<\nZ]W\bm\f[3V<Yz%s=hu\f:%\u000bEx\u00028$aڝP\u001e\u0015?, uغ}j]k\n\t{\u001eW\b\u000bbȉx\tn\u0019n\u001f#\u001bw堇Ke\u0007&>zݱ^Ž{_m^V,ݕ@/FW\b5\u0007\u00053}Yi;}f]6\u001dy3#`\u0013|:$g\u0016KsAY*5̛_O&.?\u0011\u0010h殗w϶Mm'\u000bL]dhz*2[4\u001bӮ(xE,\u0015%J;\u0014\n2)\u001b\u0017{b~\u0001~VsX/^=^/G6St\u0003imm@S74\u00077&TY\u0014\u0007w\nC:\u0014{SI;8ԏS0W\n$O\\9%IoUHqm\u001bGrb5ovc/β9k^&\u001f[WN648\u0016bx\"r\u0007\u0017:\u0007\fvr<|DH4j\u0001Ɍ\b\u000erX\u0013*w\u0003GaL;A\u0007\u001eSRn!]oT#\u001aʔrWu?_in'lp\u0016qOѸj^07\u0012NBM\u001b()\"{\u0005N7:Lk|m4Ǭ\u001ag3fRGgZ0;n2LG7uoQ烼SڲhDFa]Nl\u001d8\f% v\fV.d9x[R,NoÑ.%\r*'\u0001\u001c2G{-؂\"/WzOyw_ݷcgjP\nI!\u0000\\\u000b\u0004A۽~X\u000eî\r\u0013\u0016\u0016\nU\u0011P5ZJ~?g\b޸4Q\u0004Y-\u001e[\fcb5Pxy}f\fx:5PSbKYkiQyJu0\u0014»͔/\u001cj\u0018~^S\u0003M\u001afzZ?d\u001en\u000em2~I\u001cl\u00146߿\u0013+\u001b8\u000b^a\u001c<AD!&Rcϰ`RZf;\u00176Sd:W(\"(\rHPq$V5rՏk\\.ojڼ\\v@HK\u0005ₖݹ@ӆf&e>gm8iw\u0014\u0014og67/`Zs2(۳};EU܃81\u0015!\u0003렫\u0006g؃U'=-*ߘę͗wϿ5&8a\u0018Z,Awd;\\o;݊s;_n<%6YtWq;\u0017Hv\r f=N`Y\\\u000067Jzɕܞ,ǩ\rZ\u000eȿdܼ\u0011\u001en\u0000e`ǹ\u0013zrb&bi[x~\u001e\"c_O\u0001=\u0006K6\u0014\nƨ/+P8_<_tx\u001aв`ґU歛NyN=vUp4KR݀krsVrdEƞۂWң(V˟C\u0004c?׈*MZ_K[#z\u0000U}]\u0002Mum\u000bW>hoR\u001a\u001bC\\1\u001fRs^\u001cQ{r}=㪃ۗ\u0019o\u001f.Z9`\u000fD^m\u001e޸dg:g\u000b\u0005=\u000bW&KL@֓@  v\u0004ҹ9>,}8U>'CK|;[kr\u0006~\t0fwi:!k\u0015[)nI~\u001aێ7Yh>[;PW\\?m?ߔmؓؕwLw;ߛ\u0000\u0011qO\niO?\u001cL\u000b柁3`#oifkZ_k\u0015;jم\u0019\t}c-ahfˋ>^\u000446\u001f\u0007^UȐ\u0018\ryfK\u001b\u001e7[̄c\u000fԜz3q!-\u001ev\b\u000bلb[ܹ\u0018X̉:Ҷ\u00054M\u0013-ޜ:;\\\u001d2er3&pt\u0010\u0007\u001b\u0015%:`t#1\u0017n\t~\u0011:I]\u001cC\u001b\u0011/\"˱\u0004\u0012?2;T,i΋R{_}sPjg[県ݺFEw]70BY_~_*ވ=V<\"G4D\u0006\u0006u\u0013=[@FW0\u0005o\u0016\u001eh\u0010++\u001e4\u001b||Wz\u0017'>r\\YJ-1vuoN؋8\u0006wxn+W\\;48%AKn|V\u0017\u0016RBJ=Tl맜إC}6?M\u000fږsUgHH\u000f\u0018\u0015ʺNZL\nKY5bE\rQPu\bW ]煆&Xj(\u000eЅ\u001f1:\u0018\f\u001et\u0004#pMm\u0004\u0011^q`PWCA\u001c͓P[c\u0000;W;\u000eS;@~ G\u0011xXD'A~ų\u0019=\u0004u2Bq^6\f\tE0nU-n\u0013\u0014G\u0014\u000f˹ZqsXzX}O-ߊpAsId!~A\r\u0004Ϟ@\u0016\b?)Q-z\u001bD Ú4W\u001arZFܨs.z÷kӑ/\u0007[-w`YW\u000fVN:i>\u0002GC7^\n!`b\u000f\u001b:>zu\t$.4\u001cljk\u001f\f\f{dC#\u000f\u001a\u000bd\r\u0010ڟq\u001c\u000fÓ'\u0014\u0007\u0014Z\rcs5\bw3V*$؂7{\u0010~z\u001277ұvLǗ\u0003H\u0016;e(y\u0000(\"\u000e)Rϑ/\u0006Vvgc\u0014I'OR\"\u001a\u0018*+Y_\\bf\u000e?\u0017u\u0010\u0000®ql</W\u0003\u0010a5gt/\u00129[h~\n`~\u000b$ejb\nvtOTM5v?n\u000eAoaY޶q{IL8qRT\u0018vV\u0001vsj\u0017\u0015\u001d^nJeKw?W35w,,D\u001ck(\u0016Oi)1d\n\u001doi5\u000fs\u001cs\u001c4CkcTN\u0004ՃtD3Oh\u0019%\u001cI%\u0010\u0002-po;\u0011\u0002ޟ\u0007O\u000fzzن\u0000N\u001fyq7)G&~V\t` {R\u001e`aϝ7~`r(◷`bV~LY\u000f\\W\u00020&\u001em~+C?d\n'U\u001d/JBfh\u001510\u0017\u0000&cI0]\u0012HY\u0003.4~`H:OD2\u0017cE'1ЈxȪ?\r\u0000\u001aaQ]\u0010\u0003\u0007:\u000f|vj'5Y>U|,\u0006\u001a~ִʗ&o2Iq\u001f-AOӘ\rtʠ%(\u0006\u0005ׄT\u000b9:\u000f*m-_>JyP1ƅ\u000bQ^Tٿ\u0006إǵKIR̷\u001cN\u001eUгTP\u000b\r6>6q>!4\u001bCHK\u001fgy*\u00164XC)TO\u001fKhI\u0019ϔ[|\t\u00060Qw}\u0005Qү:\u000eizǀ <|=\u0016R\u0005?d8\u0017\u0004r\u000b\t\u000e=\\6cGBtv\u0002K@b\u0016&\u0007~#_DǶk&[$QߏXF\u0003wyD1\u000f\u0014t%&Hxl\rt}v^0AO״\u0018%Q\u0013%\r&x\u0014}O澜\b\u001c\u0017gw\u001c3eh\t\u0007Y9^7Q\u00035;\u0005\\P\n2:0\u0004&L,8^9qlH\u000bD=G\u001e\u001d+y5\u001cdsuu\u0017!HG\u0014Z/\u0000;\u0004ﲵ:r<-\u001a_^2݌sFG{,HI\u0002x;ȝ3]2SA؇m\u001c\u001ei\"o\u0019ͽ)lߜ|Yk/K\u0015rL\u0000\u000eŭ'W-SKo\u0001bh@mKU*=#-ĩs{\"H%\u0019\nǝ\u00181]Ļn`nQޒ.-enI\n\u0018#g\\\u0002dP\u0016rX\u001biW\u0019\u0012VgϮZ\"f[Ҵ-lxIgc[ؑ\u001f \u001e]\n%#\u001efA݀\u0016;v.Wu♱'T.r_ٸ}\u0001ʽ\u0014[o2<⹗Xk/)&C-\u001a\u001c7}\u0016\u001b\u0004;]\u0003ޔ주r/\"]f\u001e\ta\u0003Qy\u0013.\t\u0005\u0012\u0003\">ͩ\n\u001bǓ\f\u001c`mdâ;\u0015\u0011n-\u0001z\u001e\u00133WI1L/guf\u000b\u0012\u0007 Y`QHoQ\f[w\u0001T\u001aj\u0016ٓ \u0004I6\tV>L;[ f̿HC*jIr\u0005Q\r}6iwzg'*VZXA9]*S>!\u0012X\u0006RWY0Z\u0012jx\u0010>/¾Z#Ɗd\u000b@v٦\":plj$\u0007a\"_ãѰh\u001em)݂$݅ya6F=Ӂ.C/|7|\u001b(Ct-M XEZ?jz\u000fѡ5\bq8$]^-y=І l6|$[\u001b+O\u0018\u001cFN8<s\u0010\u0003zŚA$\bnm)TW26\u000eIV`8\u0010܊\u0002&UgH\u001aEQ\u001fUfNO-Z\u0013>_?8D~v\u001bWŦvz;1ߋvAOɷ&i\u000b\u0004JqH(Ge\u001e6iɹ{\u000bOׇ`\u000e\u001c\n\u0012\u0005iw\u0017R'^}\u001aJ҈b}ST:\u0012Zy\u001b>Y#SaM;\u001d\u0017\u001c\"X\u000b\u00045\u0016\u0004qL\u0015I0!h1J\u0001ihDm:h\u0006ȏӊ47s:BGlѽXz?bRDQwkp\u00070U\u001eA\u001d\u0019/:\u001e;\u0002ʶbӡnB\u0018Q\"\u0006iJ폵h\u001d\u001f\r\u001el\u000f˿N\u001f\u00164V%d2^R;G+\"͛%7Y!\u0001h\u001fUn\u0017\"0\u000eӟҤ,i\u001a7_63L4k\u0000\u0006:\u000f\\|a3\u0010D\u000f\tsO;I})1k\u001f/Q\u000e]w/u\u0006\u0007\u001a[\u001e+F\u0000\f\u001eU<G\r b{0E{_\u0005\"\u0005I~\u0006Pe;И\u0015\u0013w\u0004;B\u0017&#|_0%\u000b2vޛ\u0017\u0007\u0019фU\"ϕ\u0007[k3l袛\u0011<\u0005hXb#\"\u0005.\"\u0001:i\u001c*D#Y\u0004~!5-\u0004G:~n \u00188VayoN|GKۯ\"\u0016\u00119qA\rtb2V\u0000\\Q\u00038A4\\Vkg!\u0013.\u0003HGl8;ۋ4\u001e2yPU\\fֻ\u000e7%\u000e&\u001fQ_\u0007Kc7\u0014Yf\u001aFt\\b+4Y|ŦCN,zi\u001b\"GJHq\\*[\u0016Q;9j\f\u0007>/n|nnݍgHoh\u0013F\u001ek<6m\u0015qcg\u001b˽I$\u0016\bZ\u0017X!\u000fZ\tVh${Q(QRٹXæZfwG\u001dnGs%w\u0001\u0011mB\u0017ך1*x-B\u0019\u001aQ?qk0uFٰ\u0006*6-\u000b{*{EdN\u0003ˊTGqt\u000eS(;m6]neJ\u001c\u001eO?\u0006OoQZNOD*sN[\u0018p@O`eɹ[\u0014lvTɪQؤfJPm#\u000bTb)\u0017=m~~h%!K\u001fOޔI\u001eMϋ\u0011\u0004Na\u001cx\u0019rہ}+(W\u0005VZUV4B/!9\u000e\u0005&~m7JZ\u001c\u001211\u001c4́H>H>EnC\u001e\"AlM\u00172ՙ79\u0003˻Rtͫ_\u001an36M\u0004\u0002BOnLZМw\u001f46<**w\u0018\u0006.\u001f-}\"GC6:{]>.\u0000&/\u001a\u000b\u0002/w+ab}crjWU\u0017d\u001d\f\"V=mƈ[˾.\nI6=U\r\u0011:\u0005DS?}rŵMB+Ebn~\u0006>t\u0016{\u001dqg5\u000f\u0014&Wa׃jP\u0012,\b.VdL79\b\u0007Lq6Dh\\ֳhӅݜmU\u0017v{Ҭ۰_*\u001bzNi_':s\u001c\u0003R\tH;\u0000?pQ9\u001bOꎻ\u0015 M~\u001fF'צXI\b-Ҿ4]aA;T-!r1FK\u0016l\u0017dU{f\u001e\u001cwǽ͟wu\u0018(vNtw˪\u0018OHdA\u001aS˩sňEK(\bq [3ê\\\u0016!-\u0006u}6/т{}c2\u0005\u0011\u001ci6Zj܀\u000e\u0004^[*:_ٜ8K'sM&/\u0006_LWd}z!;+}\\(\u001ePZU-kr@-=GL[\t3X\u0003T$sI)x_\u0002j\u001a_\u000f3è+X:5\u0018{\u0007egCz[\u001bSխc@z1[1\u000b`ܛ\u001eO{\u000f;!\r2\u0003p{+U\u001d\u0011yD6\u0007z\u000f6oH52\u0000BϚm9^K|\u0012:3\u0016W?ݗ\u00107W\u001e\u0018Cs8v/\f@i2g,g{ǵreW[#\u0011v\u001d\u000f\u0017[\u001aO\u001eRjبy\"yYѸʗ)soY[HVtF}p\u0000\u0019헼N>eEj\u0010\u0006znn*[Wڂ\u001647.6f=*\u0012[\u0015eO\u0019aA^%8ߍƾ1[uJąa\u0014\u001e]6b\f\u0014\fRU \u001adaI9M\u0002\f5)Ǌq][nyP\bsIݧ(N\rM\u00033à[\"o6\u0011P\u000f1l\rF=y,k)l@\u001d\u001dbfP\u0014[Ms!M\u00078\u001dmAc_m9:\u0002X\u0005!.'胿ٳ\"<G㽖պ?Mr\u0007!'c\rF/=0cC\u0013yOh\u0001\u001e(2\u0010'E^tyelff7\u001c]{'Zo\\]\u0013*}'~\u001eYҡ|t[A\u0013\nZ}|\u0000&3Գw-\u0006\nGxu0v9rEoSϦ4^}}Ssia\u001f+\u000e[\u001b\u001c^Sl%o7[7v$$/VEq\tZ\"lUTqBZY\\0dw1\u0017y>I\u001f\thMzl\u0002w{hB,l\u001dr%/2\u001dov^/g՚\u0014\u000f\u001f|%4\u0017\u001e\u0006>CT>u\u001ana?ui\u000b^\n=\u0004e$^f`Y9ښ\u0013!*G+\u000f&\u001eu6x\u001eͺŕmj\u001f\u0003!`O\u0001[vG6\u0011XiǪ-o\u001a\u0015յwA\u001b~%jV\u00077۝-T *XZJ\u0014\u0003\tZk\t\u000f>X\u000b;,\u0014%v.[c\b\u0017M9|O\u000fJpwSڨٖ0\u0007\u0007At݂\u0005\u001amt\u0013?\fJ[_*`J\u0015z\u0011X_!MKq\u000bZNҎub\u001b\u0001{ڻ2e\ftbiAuDX\u0000\u0000;_^a.\u001em(.{wA\nR/@\u001aj\u001b|\u0006ԆupU7Wѐ<ҵT$NYiѷL4f<t/d緧sIv\u0005ʻA\u000bn^zg\u0017fv/R\u0015+A`\n&yw[ێ$[\u0017H\u0007~ݿFz*봏mYh\u0006ǷGׯ\u000fM\u0017\u001ek1\u0004G!jV 4:iï\r\u00126bPW5\u0011+<j'\tv\u000bf~˾Z>23j\"\u0003OU6\u001a6$Î5x\u000b\bVk.~\u0019ܒuP/\u001b~JЀ|D3y\u001e\u001as^h\tmII;jb\u0019Gi\u0007Ade\u0012y\u0003$SR >i/\u0018FE]A\u0016ogf]-h\u0015\u0017'P\u001c~n\u0005p)\u0005\u0000*Qt%b{\u0016:(}AN\u0002 \u000f$m\u0013qs\u0012\u0004rܽMK[5xq0\u000eG\u0019+ɉr\u0019Mm7xՈt[׫\\`c8>\u0014WnK2z\u001b\u001b\\\u0011(J ,1TnS\u001c-^JT\u001c'\u00053ǚ-}蕋\tE\u0003\u0013ȩ\u0011:\u0007t4v\\tw\u000egm\u0016\u0003>pjg\u0016.\u0007\u001dv\u001dgٔ\u0002/̛,\u0011z2\u0003t\u0019З˞B%ecslY5wʿ\u0010oN\\))\u0006ݱ'\\{-\u00144D\u0003͵7-9)\u0001\u000fdW\u001e\u001f}RHw5>vR\u000f\u0016b)?R\u0013:*t^\u0000_B3j\u001b)o\u001e\u0012'\nȪbaml\u0005\u000e\u0013X\bκgI\ty׆זg_9- \u000e\u0010\u001f5\u000bPwqMr\u001b^6sSjAъ~˹\u0005[+v2<2^,T{\u00065YBo7$h=JP=\u0001\u001f\u0001.\u0003rruVE\"T\u001f8KI{Gê~Ǥ\u0005*\u00153oϑn+\u001d\u001dޱaX\u001blϫn{_\u0017m0AGc8L6(ۓckN1~\u001e\bz\u0001s)yp5\u0003E\u0013^\u000e:8^ġ6p6\fm\u0011JV>s#\tx(:M_zf-u{BN1xH>lN;-~\u0005:Mj\u0007\u0003\u0005[oxM\u0010Ⱦ\bur\u0015\"rWtzQ#M\u000b#^\u0015e\b!jwo,ALu\u0004p}{yiAՠl\u0014vDtKm):\r\t&gzKY\u0010j\u0003V\u0007\u001f\u0014{Y;bEg+\u0002n\fe|%iAdەdpЋ*Yy\u0007nA\u0015R +Y\u001cr]HUe\u0003`\u001fǒ'1*k~᪬jqO\u001dC/\tbn\u000f\bܗ)?t\"X#k:\u000e\u0005\tHeb_^\u001am$\u001b\r#!\u0006}=\u000bj:ӫlR\u000e>*\u00062C]~o\u0019_\u0002\boإ\bGd\u001dD:KǟMg\u000b[1\u0016\nBXt8Q8\u0011+o~\u0001\u001dP\u001f\b\u001c?Pۧ+(e5Cy,đg}p,ة\"ڻKS6W*=\u0005\f^\u0013E\u0003\u0017>\u001eD\nt\u0018hP\\\fm\u001e^ʨUCO\\'70L\u001f5U|\u0000\u001a6ѡ&َg\u0011s\u001c<z~\u0005j3s\u001faF\u001f\u0004\u0014\u0002\u0018\b46}lzdϕ|C{d8\u001b\u0013}\u000fç9)X\u0014[s\u001b\u001ed\u0004s\u0017\\c\u001b1:\u0015c:\u0002+JQV<\u0013:\u0015Q\u0014L±Z*z3}BJI;pf)ez\\@)\u0007<\bou^\u0017M0A\u0013)|\u000eot\u0018VhGXd,ˤbMC((J\u0012@.53feǶ[9fl&a\u0000i={ɳ.a\u0018Ӧd(; 2-}d\u0011?\u001db;\u000eO\u001e4\u0010o\u000fiD;k\u0014;ySwІEIo^uq:,C\n\u000ftUB]m!p\u0014&$^[OR\u001983M,c$\u0018WvNaGst\u001c)\u001e\n5c\u0007eo\u0017}/S/W#;-o<x|dEaz_5^\u001dQc\r{\u000fZE/Fʰ\u0003h\u000eX\u0014o\r\u001c\u0015+A (\u000b2\f~\u001e!K޺f<,Gݷ`'8nyv<1ܩ\u0013uP4\" Yyjdwr*znhYm\u000e6gPts)G$Ѕ\u000bu\u0005\\o\u001aDcߖu\n\u0013}hK}],of\u00105Nqa\u0014\u0003\u001fC/\u0017KSVR^\u001aotU{Rx[C1!/+\u0018)):\u0007!9`\u001c6w]y7{ڼyi{\u0005i,a}>ٮ\u0011\u001c_]u\u001fCl\u000e\u0000\t\u0018?\u001d+Fx\u0016xPpgymY\u0012)j\u0002aoo6/\r9ˢ]Ԧ_>\u0018p0(\u00152@\u0016{k%ݪj\u0002wo\u0016ݳ:6\\6-\fv{\u0002Vt`B\u0005'q+\u0010n\u0003A\u001aˢ_]=\u001dF;\u0018s3lƼ\u00109i4Ns7yO)\n4I\u0011\tn奸H\u0006\u0014M׾vSU#yz\u0014ykrgk\u0005Cf\u0010Ӌwh`\u0019H\u001dEt\u0013&|5\u0003.\b \u001a[\u0011\fܱΚd32\u001a z?.\u001dlsFL{\u001d-\u000fqW\u0002\u0006\"\u0017I\\P5eU\u0015\r\u0013|\u001fYZ깊\u001cGuAP\u00164yc\u0001[Ʋd eY\u0017d,.U>y<\u000fms\u0007ە/3f42F\u001d4D1,;(\u0016[OmbB\u0018~?\u00000R#'\u0016a4(\u0011ѢԱKXQ\u0012ru3޶m\u0001ޢ\u000fBєOfeYOvH\rȟ,\u0012g)=5W\u001b[`\r7l|Q̓ٹ<u)S櫿o۳\u000eˢ1\u001a\u0006dU;|Գ?t^~\u000f&W\u0014\u0013iS\neUH\u0018Vq03h3>@V|a;\u0015\u0003ʵvG\u00028)32|Ϙ<6\u0004<\u0006l:܊?8n\u001dUqM{ժ2T\u0014l?\n>qdI\u0006Z\u0012^E;x\u0000AR;5dOO~i\f\ry=S;7|O_¥hs\u001f{.\u0007mj\u001c\u001b}\u000bګ|\u0004_-.\u000e\u0003\u001c\u0017B:C\tXz{pHհ\u0004?\u001en\u0002\u001c2\u001chK\"YYُ_oq.E\u001aF\u000e3FȢ\u0003o.D#E[.\bfcȹ\"!-h;S\\Hzk(gk\u0016W5V'k\u001dCￓ\u0001\u00058a\u0001\u000b!`N\u0018ПH\u001e:Ѓ8R$\u000b\u00025\u0012J\u0011K\u0003a:.Euq&wh; Q1<0pT]淏\u001b=cwNqob=R6w\u000f\r_[Uk3Hwbx)ʭ#\"\u001c^{:TimB\u0017%d7ΫU=V([I3_\bu\tM`Y)BQ\u000eS0O۰K6gv\u0001m=vB\f\u001bs֙t\u0007Z\u001bax|Pֶ\u0019-&/*f0/\u0013\u0015b.xޤ}t\u0007\u001a]d-{\u001f\u001cԊli#ֻ4!(>6|T\"MCƘ_\u0019Eۮ+\u0010&W\u001f?b(1\u001d)\u0007rMK(H>3\u000f\f2 d䠸U\u001f\rj3<F&QZN\u000390\u0017_\u0012{\u000fS;(W\u0014y]9[0\u0014\u0019\u001c9\u0019ZЫ-\u000e\\\u0010뤀3uw/x\"&j\u0015~\row\u0013\u0005P\u0017/-\u0015;dTa\nf}r=\u001dwXRRW\u0003jFiIGwӟ\u0012\u0017+2\u0011@Uw%}[n:I\u000b-c.slE6ȀYƺ뮩\r\fq\u001as3 pK,\"!\u000fgM\u0001\fO\tmVX\r}yfh5/l9b\r{Kx-:%㮅*mU\r\u0017`\u000bȓ_\u000bz=\r\u0012ҤJ_iE/v\\l;\u001b\u001b\r\u001fTa\\R\u0007ȃWdv<筰Sǰ\u001e\u0018vD\u0014#?)\n@f\u0017ǣ[~Np1-Ssy[\u0000v˛v\\@Ky͕6EWԸuxX\\$jy) 0Nv̚\u001eړI=%\u0000*j۠HQ~bl\\g\u001cQ.̟|v2ME#09Z~T\r\u001b࢑پry}\u000b\u001dgm\u0010\u001aAMB},DI\u0019A`\u001c7\u000eW\u0001\u000fj3\u001eyuѥ\u000euei+\f\u0011\u0001 \r.S܅U\u001c\u000fj8\u0001\u0004u׉1nZ\u0010r\u000b\u001eh\u000eS\u0007XK%ɲ_[\u0012ssh+_͏\rr\u0014AW)\u0014!N)|<\u001d\u0001|*!\u0003M\u001db'/\"BqO}n\u0016j_v\u000fp?`unq\n\u000bҵr񆣕Y\u0007d#k\u0012kwަQ\u001bYΖ\b~!\u0013E\u0016b=\u001c`R\u000f\u0018\u0018[\u0017\u0005_7:jsEvz+;\u000bP\fcl\u0015m%Ѳq!l\u0005 \r\u001b8(Cno>\u0000:zEOCQ=\\0_]2l\u0007EЧq\u001d|uvJ҇'E1eݞgYW\\\b47b_DWW&KA\u0018Я_О씬h\fuIA\u0007\u0001'ΛÂR87\u0016\u0000%v~d}::k\u0012Y\u0000MNh\u0000%Bз\u001b2\u00066H[h|qI E\u001dEJyu\u0015&?k+'M̟؉^Ѓ\u0002x%\u0003\u0002MZ'5Nx3y؝\u0012K[]UM(_\u000fݻڙâQǑF鞚\u0006k\u0019\u0002<k\u001a`\u0016y7gj\u0001̱`sʭC\u001dRp\u0019\u001d\u00003xt}I\b8C=\u0013O\u0003U 7ܶVf\u0007k\u0015ful%}c}k6X\u001e\u0003AD\u0007,\u0011\u0005Z\u0000̽\u001dԸ\u001c2\u0011>4~'\u0005<6m\u000b\u0016>C\u0004}o\u0005;{f\u0013߾Z\u0010%/\u001fk,ES>[[{r1\u001fT\u0006.dthn+l \u0017j¯L\u0004X_.ڕuk71`\u0015f<\u000f[㭧X\u0012]Ru[U\f$y\u0017O׼늰tFg].\u001e\u0019gy˻;Lvc\u0018x޴z0\u0010)aޡ0ռ}[\u0000^at\u0006;zr|,#\u0017dt#Qb;|zǫ;J\u000bՎ>\u001bow,3t,\u0015$\u0011\t?2MH9`T\\69n\u0018JT\u001c\u001eTE\u0010:f}vݱXiHX >'eD\u0015U)[\u0010ZXW)\u0003Kx;cMj\u0010\"JVL\u000e\u001a\u001e\u0015\u0019NYQ;4;hfC\u001bp\u0011X==\u000eK;\u0000Ғ\u0017M0bjɦmEe\u0004R\u0006a:3q[\u0017\f\fjn\u0001\u001e;\u0000\u0006&q\u001a#r|Z\u001c\u0014~U)X\u001f2\u000bi=:o%N#2\u0000\u000eOjt\u001a0h\u0000wJ%,\u0005qzI\f~=4\f6kA@bw)\u0011{q_\u0004*\u0002\u000ez{\n\u0015_tWa\u000eT\u0003\u0018W\t;ls\u0006ԽkjѴ\u000eD[mת\u000ek!U\u000e6mp\u0011\u0014W1Dz\"rJGp\u001fE#\u001a\u001aKo*~x\u0011\u0006\u001a,NiV֋鷧;\u001cD;-v\r3k;\u001b9\u0004\u0006Hu\u0018ٸV\u001a\u0013\u0019_(W(\u0000_}_/L\u0015\u001e\u0018=ל^/$\n\u0007\u000eG\u000b\u0015|{/yaO%fKSR\u0019@gŲrgq]\u0013<˧$=!|\nQ[cZOMm\u001c\u001abAU+<ܛFЖQ.T^.NutdVdm)c~ cN~mh\u0019\u0004\u0010\u001dn2md\u0006|:+z\u0003\u0016Tg/cEg\u0001fikXHe7\n?ZG6tO\u0019lǧ_\u0001\u001bf+\r><gqY\u0004*\u0012\u0014\u0018i.}yRn9YٿZWBFui@Q%\u0001\nt413\u00102;\u0016\bm#?uMgE\u001bejxgZcS|\u0014\u0005\u0016\u000f~)Ә]x4с9{蔎uw=lt\u0007\t|U5iۛT쫥sJ Joyy5,㟖Z,*l\u000b\u0017Sjg\u001c^\u0005->_W_Lߗ\u000bƄ˞,\u0000n\u001b=#o6K:?%\t\rr|e]vEAnEAnE~t*V\u001b}:\\oCT8C\u001bg#/O\u0012\u0005_tv%9e&\u000bߓ\u0007'~<\u0013@ihw\u0000)~=bciT@o7neQ\u00019QQ\u00019{7Z{S*-\u0004.ϫ_l1R鷛/U/w4\u0002\u0017r~ώ_Q鷛m4.v\u0017[\u0018Ϳo7k4m._r>ۯr>WN\u0003\\/j\tեHE\\M\u0019s==C2\u0016Ȍ\u00009\u001bָ#旲w\u0015uEKr?<?C᧾H\rbSroTί quda\u0018~ed]\u0016\u001eև\u001e\"_z;Rsv+H}?Qf\u000e\u0015,eHeE2ܦ\u0005w\u001cY3ةXwGbʔZ'HO/o}\u000f4D}#\u001e.nI\u0003|'6]Bb~^w%x8\u000fv\u001bяg/OR}NW4n^e\u0000ﾢn+j\u001f<߅!\u0000DR?\\Whzuy\u001bY\u0018\u0016ң⥝{ƶUۿC.FQ<2J#\u00029Xe<%|/\u0018uf?4cq?/V=\u000eoz2ktIz~Dl~\u0007/Qw,׵v\u0007(~\u0010\u0007H\u001bs\u0018#Pb.O~iӱm{j[gBK|\u0018Ǖ~/+ֿ\u001bߨz|EsW\u001eWϻ\u00009=?}\fv筗'\u0002qZsi\u00018\t$\u001f]zYOv=\rd+\u0019rN_o>n\rZ9<k\u0016h\u0003x=L~\u001d:Kcb6l,[\\\u0014~|ܖ:QffroWz7V+7\u0006'\u000e/`8m Y\u0000ܻ\n)֚y/rުNęQ$X:8T\u0011-tҐS_n~+ol9޴Mq֋yo;\rNXՑ\u00192fM79MҭI7>If',|fv}76ot[Ŀǳ-ǻ۬_`2nʳn-جd4?纪H׮`\u001f9QTd\u0010A\u0010\u0010$\nv7W^\u001e&(\u001a*dk%#dD&pf ?b;$\u0001ӏDt\u001d\n\fx^rJ.kL=}a\u0006I)wb\u001bqvK%_p\u0013b7%*h\u0000́\u0005\u0016GF\u0017[DYyT\u0002]\taNaLuw\"R\u0006ؔ#;oMhc\u000b)ap\u000b6Z6\\m\u0014:\u0010zJu?tu-YMz%]V-\tl\u000eI\u0002vg\u0016Zl\f\u001e0җ\u0010V\\޼vTj\u0013\f̆v̦9gaY}UT/N[mdf5ѯ\u000b:l\u0018_aR}CK\u0010Tv77\u001d5\u000fj3y\r\u001d\u0005g\u0005@8c\u0000\u001eCIBmgQ}CQ<H[|҇sC{j\u001e8F\u0019aƬcU%遣0`vnk_~+O;O\u0012e(w\u0011`p\u00149~Av5]I0{Qv5?\u000b|3>\u000f׮濩\u0005~?\u001f\u0017/\\U\u0005~ϫ\u000f\u001bT\u0012Op~\\Z;]4y!cOW_Nxڏ3>\u000fwߣvƃ\f9o\r{X/=-a\u000ey!I\u001ac[aVx|p3t\\lGcdbXxHR@\u001fK~F];pTo\u0007ۼ\u0011ĨWf\"\u001bJבJ@[a4\u000fyޥ\u0005L܎y\u0006\u0012}N\u000f5F~9M+$soeVו}MFS\u0016^\u0010\u001aPs\u0011dHH*\u0019ʂ{ګ\u0016j\r0de[I?IJ\u0015bT3&\u0017&Z嘓o՝^XFF\u001bHr*sRkyC<#ϻ~N;Y\u0001ƙ=P}Ы\u001c|ħm';|\u0017Դ\u001eo1꽜uМ:2Z~ml\u0003}yͣ\u0006])}ʹtJy\n|׽D\fR\u001ftHK\t\u001b='9IjHd\tzbKRe:o,YJ`{Ί|ΣY!v'Z\tBϨ5vCQ{;\u0018U\\eRw;zҐ_<Z@)&kֈ\u0019\u001e\b\u000fCiZ\t\u00070ik\u0018;{-ɀ=ƨl쨸\u0013תVQMv\u0016wi\u0013j./!\u0011i\u0006sF<n{iKn-l\u0006/\u0014$d$\"~7\u0007e2=n\u000f1Ҥ\u0015剻h\u0019\u0015=|֜8\u001b\u00050\u0014ΐz(\u000b͠}\u0014mrөg2yh\nؽ\u001a;\r|\t\u001c ߿=~z\u001e-\u0000\u0014\u000f+zwg`^J&Z`\u0004L\u001b|E!&lnѥ(\u0011.b1.\u0013{Fhf8f\u001bt\u001e|l}>vF+G\u001b0u[\u000ekO\"\u001ctڈE\u00018aU\u0010E91vKN\u0002\u0002i,\u0016ۂBߤ@\u0019\u0016?Tگ;RFN\u001c\u001cL\u001e\u0003VO\u0005ǲl\u0004#yrNѠ+SfX\u001bn\u0018 \b\u0014\u0004&ds6bQOo#Ќ|Y>WO?\u001au5FUoqʳC\u0002逾ph)\u0006\u0003=wy/`@i\u000bI.מqfi\u0004qx\u001f7hl\u0004o]$j\fO/$_Ÿ vN7O\u00178yʻ\u0004\u0011ԙRy;I\u0011ێV:Ex$N\u0001ڠpmh#vSeWwT\u001fKI\u0006\u0017\u0006[YEH!\u0002V>gjcc0)c$'ц\u0015Ixk\u0013ד<%o]\u0014\u001e\u0006{,h7[p\u0010*\u0017[4{m\u0011*$I\u0010E\r)ĵ\u001dF}f6nG\u000b\u001eqG\ri/^\u001e2MvW\n\u001a>\u0014>6A'|2MќM$\u001f\fF\u0014)E3\u0006D˭\"$YO{RS2iZ6MsO\f\t;,zJ\u0015D\u001al`:\\GuȚ7\u001bP\u001a[5{im\u001b'\u0017\u000b\u00125+(EhX+W=\rS\u001d\u0018af'[`ҳA*\u001d{G\rێUzm\u000f{\u001dN5\u0017\b\u000bIbQ||\u0005vRV[Vģ:R@\u0019s\u001bDKRnle=)-P68\u000b\f\u0007L#Gw%h\u0013T\tl^\u0004\\K\u001c\u0015D>_eQX ze.%r\tG;l0fw\u0018hI(|p\u0017\u001aJ˒z\u0000cB˱p\n\u0000i\u0015Ұ\u001b$>\u001e[;|#qT3Zy!oR\u0001 eb;m\u0001\u0017i^@sy,Yﺪ5\u0015K%rot\u0013ciP\\p\n\b=\u0019޿I(\u001fK\u001d\u000bI~3y!_Jv/p&.cWCLB?\u001fdTi\u0012L88X87wWi\u0012Lj~BIQSQW\u0000\\ͨEj~\nf*ք[)UJ݆։-\u001d\u001cQ[\u001ey\u001c\u0017}ҹ\u0015)x\u001e9g\u001fiT͘sZt\u001bȾ\u0003y<z%(\u0017f5f5u,icT;ݵsbU?<\u001cyozR*ܥ|y\bz=\\W%\u001a\u001fUvbM\to\u0018 F5rmWYYHCFq\u00191g\u0004a*}/jǮ\\~\u0017<=poJb1K\u0014Ǖ {{$\u001eϟ^EĨu\u001fՉe-zq3?7ţ\u0005\u0019*4efǖ4LeL\u001fJ\u0006S_%1ƈ󸬶<&.x\u0019\u001b\u0010d\ng/\u001a4[y[^y\\t\u001eHWN2&Z\u001bGVV0o&P\u0006t(\u000b]Z\u000f\u000fq}\u000b\u001f\u0007+9Yr\u0017s<3Ӿ IH\u0001Eue=(\u0015Z@۩Ud\trFI3\u001a\u0011\u000b2\u000f\tf>\f\u0015C\f\\scċaTs=\u0012s&\rO~z!yQݮ[\u0015r9踄\u000fBͅ&ƹ\u001b:Cwg<WqC󹷸plZl0t٤ѯiQ++\u001fIB|\u001a7\u0007\u001b՟\u0003wZ[F(w\\\u000f\u0017vho.+]\u001dfnm\u0003+u\u001f\u0006\u001c\u001cy\u000fΦL\u00054Iا]b\u00074Y\bկJ\u0012?6ßvtlh0\f8l@\u0013`]0\u0015hݾRtZj=4<\"H<\u0006F'\u0019f\t\u000f\u000bf\u0017\u0015wIT緱NK\u0017\t4fg[=\u0007Y\f\nw{K}֎\n\u0013ۀ\u000bUy\b#\u0015^\u0003@خM{2L+bae[߅7$\u0019],Ĩ`\\\u0013qQc8ӟ\u0010{#]\fwWdNylr>\u0013(`2!֗ym\u0014%\u001a-E_s4t>LtoOH\u000f%G1*\n\fu&#7\u001dݣq1\u0016'%Q\u000fm\rz2:\u0017$\\jIdI[O\u0004+0H\u0000xXH\u001aM\u0003{$gg\u001a2xZ$cK6л^\u0000Mx w%M'K\u001f(813@8P~Z$:F\u0011.*\u000257\u001dFK\u0001#IUJt-OT$fQ\r/#U3L\\`;˃I~\u001a'R\u0004ʀDPc!핾K@\u0010GV=\u0001o6$\u0013vIם 1*ƨ.jn\u00151/VlogF'ZQ\u0004XZGf;\u0019SJ) uĸ+Its\u0002\u000bq\u0017E0MR}v\u0000s\\B̩꣨a\u0019\u0005m)\r\\u1>c\u0017J;\\6Rj[s3Dd\u0011/;xv){\u0003Y\f#\u0005نmJJc#\u001f89ۮC~\b\u001eY\u0011ZDEDw\u0011wh|5aWɓĤ$z;u$\u000f\u001c\u001b.M\u001f\u0017(`'\u0002כ\u0000#\u0000\f/K\b!\u00040\u0016i/%ILQĨr:IA\u0015>\f&f,\u001feLQ!vꅏVr\u0019׭\\+GJE\u001fZ\u001ff\u0003\b\u001dísPI\u0010\u0015XH\u00007[{m\u0016cV#T\u001dE:@\u0017ޅ\u001bbU\u001f|A\u0005ey\u001a~\u001e6l\bY\f53\u0018m۵k\u001bmz\u0012Xs1}/I^?#QC\u0007\u0013DN\u001awۼF)=4N\u0007d햜rBttq\u000bV\u000bmv}\fuH\u0018zt^`0)P!ipn`j\u0002Ws\"#nKL\u000b\f?w!\u001a\u0015Ȯ\u0000(fDH\u0015ͽHikk\u001b[<eY+\u00198:+\u001cjiu]\"X\u0016\u0017d\u0006{įޒ}`2F\u0017Ӑ:1ѯ:'NުۀKn­V\f\u0018_\\\u00110֜\u0004%\u0004T\u0016\u001b5z\u0017h,\u001agIB@Nm}\\(fK\u001cZjn&}\u0001k-\u001bl=s*\u0015x7J\u0001\u0003\bD\u00176oa{4G>M;6Ĳcg\u0001fLq'r\u001e\u0007ydVD<~^7\u001a⿮>{hurA\u0001\u001eR\u0010Gv~A\\icT\u0010]4t$3[_TLnj3*yU\u0010|pcǿ\u000f\u00178~\u0001矮櫨_Liߋ\u0005Ώ\u000bPX\u0019\u0007[?3q\u001fk\u000fOw\u001fi\u0002^i~jzbŀ\u0004B=Er%?2lmk\u001e2\u0007v~u]2hor|u]CwEubfJ89\u001e?=,B\\\\(\tf/4$yO0eں\u0003j\t\u0000Iyf1pʌ0\u0002dGYN\u0000t\u001a]]k\u001cSg6نe+杂!8)R\u0017\u000e&\u001fJYbbl}\u001fjF#$ɒrT'\u0006-r@zkX;\u0006q@/{'\u000b\u001bIε5N\u0018D-ʽS>:'fAM?\u0014\u0005\u0019ڇ\u000b0I>!_vbz\\~⨆$(0\bBv|L^z&@߹S\u0019\"07\fYk*&q[>I|6\\~\u0014SVlަx}ڿs2$KƜ.oݨv\u001fLmn\u000b{_f\u001a3\u0018\u0003܍\u000brѵ1Q=9ݞ\u0019O~Ч$\u000fQq!oemUn0˜$\u0016\u001eI\u0012\u0018\u00073c\u0006%b\fMߙ\f\u0015:%Kmа6b);8%Ţ+\\\u000f&\u0000ܸ[c81IvIB6FĎFcG}P(#0FE۱GTM<\u0017Tt\u000e\u000e]t\rYȗj\u0005Et\t_ƞG_Qe8,{u\u000b'Ԉ@\u0014Fc=0Yֵys¥\u0013,.\u0015ͷˊq\fͭ\u0013_pԣB\u001f\u0015\u0001\u0013O\u00009㪐N^N6\n^t$\t%io\u0012'-gvӭ\u0015\u000fQc\u000f^\r\n;npKj\u001b\u001ee(\u001c/49}e2<\u0019\u001c8ʊ>ҫFU$\u0012V!\u0014\u0014\rU$|@I~Ѯ\u0005\n\u001f_\u001brYiEC:=}x\\\u001f\u0001{}pjp ac%\u0013q-\ttrĉE{ΉI%cN\nG\u0001|\u0006=ȹzeSDB\u0019\u0005[ܞ=`4\u0016YS\u0016MI0+`jJ\"a$\u000fb\u0019(H\u0012ױ\u000ebTS^5\u000eksԉb\u0014dGM׭.+ێ;nW\u000fp#-H4ᄣ\u0012\u0004vۧ\u001d_Q8t\u0015T8%4⿔k6*Aŝ\u0018u8fZ1>H|R\u000fJ3:N\u000ef9w9F\u000e-`O\"3u\u0011'\f)\u0017\u0002Yj\u0018\u000b/\u00132^\u0004ҿ\u000fϜ\u001dtF͙m<I\u001fWjO<\u0007\u0010,\u001d\b%Z\u00118J\u0013\u0011!Jw\u001d\u0007;KaM\u0004Yg\f2\u0002juDZt \u0015;$\u0011;\u0016b\u0018չ-\u0019T\u0014B-\u001b\u001f\u001efesŶVm`\u0015:\u0016W\u001f=D\\Gz|>0*\u001d\b)\n\u0004\t\u0006j\bBowpxmI\u0012\u001biF\u001a\u0015|d$ߖ\u0012ix\u001a\u0013>ҙ{S.\u001c\u000e\u0005rO\u0005v\u001fp*Z\u001a\n\t\u0006\u00008]#tˮ\u0004AHGZ\u0010[n'7%8ǆ/N&)I2םQ?X˥l}=ʜV%<IK\u0010\u0005SJצA\u0000glrKs\u0014\bw$&r\u0004nn[.\u0016|[\u001cYqk\rgoM\u0015|w/\u000fOnY<)[\u000b2\u0004m\u0014̷v|.im$\nW\u00116\u0016/\u00157]\u0015\\o\u0013p/%͙Sq&ҹz{\tXUg!`&ʃ&\u000f.\u001e\u000b!6.\t\u0017\u0017u\bg?)?esn(\to\u000f\u001eNfc\u000f&\u001fI2!D\u0007\u0010^gw\u000b=W\u001al\u00003,v#SYp^Oy\u001e\u0004p&=?BKA\"%NzM#\u0015\u001c֣ܶ\u0002\u001e&}l5V~UI\u0012.X\u0012W(x\u001b{-\fJJݸTEmU\u0017ĩ؊ȱJ\u0001ZA\u0011h\tX0m\u0017\u001azu\u0007!\u0004g98\u0017\u0000S굒&`zRk+^\u00125z[\\\u001ar2`\u0017Ӝ^\u0000\bmK\u0018zw\u0018xb9͐d8=~39T;g\t7\u001e/>k>P,\u0016~'I\u0010%,OO0&V\u001a0\bc{8O)u9/Q}m!0Fem?\u0018P\u001cMX**r3\u0004\u000fG\u0000n\u001fN@ ).vy/;sڷIX;\u0011\u00014\u001eqEOənk;~U4\u001ea>n6\u000fMـr^\u0015W(\u0004\\n%\u0018|tM4l\u001d\u000fĜ\u0013\u0013\u0012,6ɠpƴ~\t8\r+ZIR~\u0019<\u000fv\u0014Yp\u0000\u0014ܶwa\u0018:\u001e.<\\d~}f^_X\u0004̆\u00138}(\u0007t&/\nF'bo+O\u0012毊J\u001cZao\u001a`\u000fe{j\u0005\u000e<C\u0010'il\u001e&*$wL\"YCRǂ5r;'ճu^Υ\u001bK&\u001bh\u0006Fj||$d=_Lް/\u00178\u0007~J\u001e/p&\u001fk_\u0007[q\u001fj\u000fgc5\u0017\u001dj-;z3~A\u0015\u0005\u000fƜg9$1ވ9w8`\u0002\u0018<\u0005V=oH|lY;AucTUS!qE\u001dyLRQ\u0019O[*ƨ~!X<浼rF@g\u001b9:e^>\u001fܺ+ 睬7\u001ekЌ\u001bjr\u001dh\n<`%Ag:RC%TYi\u0007g8@bd$}rCWvfЗL\u001b9\u0015q:oG]fK]͹Նjˇ\u0001\u000f)-ǅ\u0016+iXTX>y)\u0015\u000b\u0014*\u001eէsTߌ!s=oNPźʦ<j\u001e\u0015u\u0010*(#\u0019{+M!ݵÞ]RH\u001eQ\u001b\u0018\u0002,a\u0018.?sҍ\u0005h4nSo\u001dORP!\u0001x7f^ǃkG\u001d\u001c&\u0019\u000eeѬ\tb$o\u0016x]塥\"·\u0018Q2_O&6.QM\u0014\u000f\u001fAO$CVw\u001b>zL&\u0016u]?\u000f>J\u001dpK\u0016FO^K|n\\\u0018ڶN\u0001r\brµ=\r\u001e\\?K\u0017ſfbTt$KƨZW\u001ayaru_\u00153KJQY3fJ\u0004P\u000ed\r_eZ?4>Q,:\u001fb\twJ\u0002o~b[^vm\t\u001f}%yr<&\u0007\u0015,փe\u001b_jr{\fP3^'3^{<wqY9\u000b\u0019K\u0007DM|kn\u001a`V1r\u0017\u0019a%\u0011$3OcuJQc\u001fݟΰ\u0019Njs!\u001f^p8z\u001b1J`\u0018y\u001b1\u000e\u0019:m<\u000e{[\u0019O\u000b\\\"\u000et I\u001fK~fI\u0012\"\u001a&\u0010$|8BVcf\u0014\bCS3\u0001q\u001a(v\u0004\u000b\\\r\u0011oz2\"\\bedrLk\u0003U\f<;ܷ/L2`d `\u0010\u0010y>{1\u0010韕k\u0006h)LNO0T\rD\u00070߹\u00106\u000eQfQ0J,(x\u0002=\u0007{\u0002\u0015B.H\f\u0017$][a6=\u001f&K\"Q\u0003EĨge\u0007U+qd2{UviZkmE6uɬ\u0005R\u001bg\b\t!`1߼*\u001c\nUI\u0002]\u001e\u000fu0!jv#ҩ\u001bkc<9ܨ6Y\u001dT\u0007\r(Jh(~8-\u0019\u0003\n@V5J\u00120f\u0016fCD#b؍\bq\u0007voO|?Y\u0004s\u0013[?IT\u000eZ\u0018\u0005X\bL۩\u001d8+p\u0012\u001bxA9ߟ\u0017f<|(\u0011ws\r<a\u0006\u0001.-\fV\u0003\u0002\ff\u001cb@7IFk,[jgԵ؋\u001d\u0015i\u001f5#.N\u000f̜\u001b8<YޛJQIb6k=f˘ވ \b\u001bZ\u0004,g3x-W\u0010![hq\u0010\u001e0\u0002o$Еlz1:Il}^>ZEͭ>nv[Jwm^ri%:m\u0014k\fD\u000b\u000e>``?$[#hޛ>%/#\u0019$Sj_ɚ\u001bB|kڮ\u001b\u000f\b[8]~\u001cU$\u0013琺sk\u0013Iwx0x^[]-\u0017nF@[\u000eڤ\u001etǭAsʨ\u000bCm1V\u0001#ڂcN\u0017\"\u0018 I(DK<\u001d5f܌V`\u0003Iw0(޹iYU&\u0005e\u000e\u0000\u0015ޖ\u00053P}JM\u0004n:Pqnvz\u000f _\u001b3N.?ɱdaj\u0014|:{lnekF5S`\u00173E~\n\u001frB^\u0016T,YO;C!Iv\n{<IXB\f^{v\u0011WINw3])ŵU[\u001ds:y6v\u0012hq\nCwC\u0007\u001f\u001d Ol).[\u00166PZs\u0000Y\u0003\u000fn}b;Xely*\u0002_I|=A_\u001f\u0003&ks-JdɈ\u001eiq?\u0015\n.0犙Y\u0005{\u0017\u001a{\u001b6;iܙTJ:\u0017\u0018\u0001X\n`vu\u0007UV)-OJ,\u0014+m@\u0013o6\u0019\\?\"\u0005v\\Q_PTw㩁v@KgIQmo)Ll\u0006\u001e\u001f|\u00171G%m}O%oFBJ\u0001V1Y\u0004\b(\u0002.q3\u001a\bQ+BubDp'P?\u00056R\\iXQ\u0001\u0005te%s\u0015]X\u001fK\t\u001fާ\u001cRUi}Y|oL@W\u000eP\tG:\u0017nsg^xα{\u0004!X,T>K;'>\u0005}Ɣ\nջ CTAb\u001ca\u000e\u001eW+D-7\u0001zJz@M\u000bIF:]lΉb<o#sΌ.Ȏt$n%s\u00121eQ)NL|c\u0011@Zi\n-btk0Gr{l\u0000@\u000b\f7g\u001c9>Szƌ7Ӑ}/LG(\u0019xLUGvѭVR\u0015nƀ[-)\u0005pc\u001fZ\u000e[8\u0015\u0019M2\u0000&5Xp2tvlX;.\u000fktOwD$Mһ)1S%>_\u0015!'-ŔpK\u001aϰ\u000f:\\P{^׋T?\\\u001a>Zd;5\u0007aqM\nל\u001cA35\u0004\nyk3e7\u001bi|)0]}D%\u0012U\u000bOvw5Z\u0007\u0003}~@}\u000bR\u0000m?\u0017\u0013o\u001c.zM\u001eG.KX4qMn\u0000P/vWFW2\u0003eR#\u0003#\u0002K$B\u0002g2^/|;\u00178~\u0013LJOW3ꪭƼbL\tcJ>\u001e.1JB9Fŷ-?߼N<\u0004\u001d'p\u000b\n\u0011a=er\u0000]p߭Ǘ\t\\9\u0019l]7^؉\t|~Ӫ\u001b&\u0011\u0016V\u0011Ji}S<f>A&F]5\u000b~~\u0018y\u0010ƨ\u000b\u0017IjFH\\g.\u0007L\u0015xœ!i͘cE˘ F,Uz'\u001f\u001fIBDUV[&zrcT\u0018_%x\u001abN$\u0017CfUM\u0011jš\u0007\\>+u\u00062G\u0017\u001c1oј\u001fY=.Ff\\{\u0004bZS?-˒UI\u0012.Ϩ<\u0015\u00034~:F,(\fDp\u0013:QJw\u001e\u0015\u0001-Wa\u001a\u001f\b\u000fK$%5i\u001dEv42\n$r\u001bS\u0016C\rΫa׏E&\u0015Ok#e31\u0002-~bv|tn\u0016y͆gxmh\u0013Ȧ\u001an>VY\"0$gHUW\u0005UsՌ\u001a*\\*\u001dE<]\u0014U$)#,+=jQk_$sɨNtQ<\u001f#_9\u0011r/f\u0003tO\u0014S-F01%ꅑ(iHW-m+ K\u0012O\u001d.۽4}0Z%n\u0018!ˋX.\u0019>ҲxF3+3\u000bמ]b@Ei\u0017oͨMݟN9y\"q\u0001q01eu'Uw<M{NzR\r/ΒX*D<)_?KVܮ\u0006I\u000ei^7z\u0000\bGzc0K)yOJ\u0007s}v:ԎۉG.\u000f\u001e-$I_\u0014&Q\\m2ca%6|2[+I\n)jAMk~I\u001eu]X\u000fW_\u0019B\u0019vF:\u0019\u001d^am{̱\b,l\u0007z\u0017Eoex\u000bБݳ%\u0011Tcf7ʇ\u0002\u001f㤒9\u001f6/ƒ\u001c\u0004]ӷl^ֆCMHp)L\u0013I7<\u0017\n8mR\r<\b\u000f\u0014#8~\u0012袥s0Pj\rIZ&9Ƽ\u001c;:\u001a\u0016\u001a5}<d{T\u0007Ł\u0002w/x\u0010n#\u0019\u001a%\u001d\u001a\u0018ɂ\u001f\u001e\u000bXv|tOS\u0001f>حei5%uCPCKO~Be$YN\u0010I$\u00125L\f=\u0007wҼg]yh9vpR\u000ezB=$}}W\u0007}\u000e\u0013P%(ZU%\u001aۈtH- b\tM~<=R<vpL\u00077`\rܮh1qXX7PY%#%V&%M6۴zd\u001f\u0012ͦ0|y5l\u001f>_zBbtL|Dj>FI^\u0018\u001d\u001f\u001b\u001ef78f\u001b\u0001ϮZ&,'\u0012\\\u001c^UƹK\u0001\u0015\u001c\u000fL\u000e}7ȋiJB5Drn\u0016H\u0019\u001e->\u0003%\tEQP!j\u001e1l&U8܅@P|\u001c7()3\rsdGbM+\u001cS/SΩ\u0005]Y\u000bMO\u001e=X\t)tkhK\u0017q\u0018,1$\u000fMZE㶄z\u0015E~$\u0005&#{j\u001d\u0015ϑȀ9&<WVF*ڃ04)>/>?-\u000e}\tY*|kBp|\u0010:H\u001ekP}Dy\u001bjm&y=\u0001\u001b68n--d\u0005N4\u00125Žps4An3/d\f!vJ\u001bJ5n\u00079\u0012]X_\u0007ϒTX\u0012S\u000e\u000evӱ[ͨ}>ݯM\u001aK9\u0019{qλ\u001d/Rs\u0007hjD'6;/\u00047T'\u0006Co^\u0000'\u0012x)b\tRZ\u0015A~\u0011$Q'3nԨK\u0019\u0001ɋBɞ\u000fO*CKay8]^]Ge\u001fjJFE\u0005hG\u00015n~]\f8_Ufe\u0001\u0012z],\u0000{{\u0001\u0000\b>ۯJT\u0013O9\rgt[үh\u00181F#7(hKς\u0019T+\u0019X+[r\u0018\u000f֡憠P_ű]t\tt\u0013(W+Åa\u0001X<bn\u0017$\u0013ծ\u0014d\u001aQ3\u0015\u0005cY\u000e=23.e\u0011e\u000b\u001fғ\n\u000bOu2\u0011W2\u0002\nke3\u001a6(\u0004G/Iޗ\nO\u001ek\u0019̥..Lq\u001e.\u0012o^1*omZG\u001e&[mĆ\u0019R\u001a\u000f\u000e[]g6B@/\f\u000f\u0012\b[~x1\\\u0004Q0\u0002\u0011\u000b}{eQ4JsFG\u0014_wY:\u0014hE\u001f۬>\u001f@2='\u0010\u0004\u001bQPGC\u0012O[\u001ft\u0001\u0017\u0006Kqv\n\u0000\u0019;}aeW֢1\u001esjv\u0019ΨU!uzvz\u0013\u0006J|6In%\u0016Vʠdvo7\u000b]\u0017\rc\u0013lk\u0004]\u001c!zZPJ-wM$\u00001f܇\u0013BÛ3zgLߚ޹7\u001dzI$Q3\u0006̥=bDp{\\\u001e\n[\u0015ºJ>\u001f-s\u0000\u0000V몺ZVz۹>n\u0018l\u0006\u0015=t\u0019\u001d&\u0011?N4z$_~$ǒ\u0012+\u0003F)\u0017v4){FX#\rm^HH{i@\u001e\u00107=\r\u0017btҢ\u0013\u0011Zm&\u0006OX\u001eM1\u0010Mqr#\u0010IvkD<Jb4z)'vx;]U6-\u0016\u0012-n#==x,MC}r\u0004$Ý$v\u001fHۭMs5O3*N!\u001emUy|H\u001a*P:f!*CҊ\u00119B>9\fkIv[\u000e5\u001e\u001e\u0018MJɚdwgHC\u001e\u001fC8pGJ\r\u001dX\u001f\u0006Bqx\bK>1Z4UDP*>\u001cU'3\u0016jTŪ(pXiP\u0014^J\u0016r 4Ŷ@{ϼM'\u001f\u0010tjB\u0014q+>& Qsѩo\u0017a+\u0016f\u000e\u0010[gL:Pߋ\u0005Τs_Oݨ_Lrn\u0017\u000b\u000bXG\u0014ԲTJo\u001dUm<FUDi\u0015Wx=xۣݪ\u0004so=Q!\u001bpei.yd\u001b3;X>_\r\u0011]reff}UD$hT9jQ-+5~\u001fUC9f|~\bn\u000f|\u001c\u0018U<}_ƞXUq\n9詼s\u001a\u0014i;BJJ[rAÎ\u001d#\u001ekʹUS$uEqTY_QeE\u0015DUH½`T[ȟ\bz<ޢG4߇\u0003\u0016̬[ϥwn?cN[;\u0016ԇ.tm)yؒE\"\"e\u001cY*\"~JTZT!`,vж\u0019IgKý]\u0006G'݇ҹ\u0016tf۶\u000b\u0017V赳w`\u001dFݞ^\u0018B\u0014>Ϊy[\u0007B=wo*@ɤS\u000f2\u0014y\u0011Wg\u0003\u000e::l'\rd\u0015\\:9IЏ;M%\u001cŵzVcTpkJ\\^\u0007FDZE`͛C&;\u0011ts7}9\u001f_U3\u0013u5ir\u001c \u0012V?D\u0015>\u0005u\u0007]:Ĩ\u0006\u000bDJ\u00168G |x=w\u000fZVɶ=ƞ>\u0003n={8MhZBC~4޵HGדmJ֩Gi1בUNM\u001b*Q\u001bU4'O\u0002)\"O^dTtlզ\u001a,xy\u0014\u0003\u0017%\u001a3|m]\u0019\u000bJߜ5\u0007koq[\u001d,\u001dF8Jҹw+U\u0019=Ĩ\u0016{MŨ%gr\u0003I,>\r\u0012\u0003|ҳZz>\u0002ֹ3ٶ\u000b%\u001eĎ\u001fkH73Wnu<J_Pi0Eʓ\u00048퉳HsA\u0017Y_wbl'ZF\r\u0011j$ZQq\r@>\u000f_eSitvě\u0005m֭L\u0014qv84\u0002rA\u000e0]ｂr\f}M2\u0011ƾ*?s>OdT9z#h5UsE^\u000eu(\n=/\r\u0002EsfE}[WTb.\u000bJK\u0004\\pQ\u0001U=Yh9&c*\b'|\u0017!I\u0019l 1e3\u001a$Sy+ɧdɺ\u001dJ֍P<ow<mn^\u001aH$0?SςebiX\u001e!Zߓg}>\u0013=\u0019z\u0010\r,\u000e8ػ\u001d\u0005w(U\u001co\"ɀ=Z\u001bTܜҷ\u0019᥸61*pO\u0015__\u0016(%ytHo\u00069i9\u001cF\u000f\r_/{PN:p'٤I`@ԒP50籠\u0002\bU\u0011p&\u0013KI^0jL\u0017x\bw[i銐a.ۥBӤEu\u001a\u000fN[s)I.\bt8Ͱ{cĢ)X?I\u0012Ruogԡ\u001f\u0018\u0017I^gzp\u0001\b\u0005\u000f\u001b_r7键|S6p\u001f';K?^t\u0001hZuÉnts7a\u0000l'lwC\u0006Yǂm*W\u0011~;g&ڊQU1\u001f\u001bۏ]{{\u0017\u0019C4gFsk.;QDׯ_\u0002Gn4xdGxǛwGS}>\t\"\u0016߅W\u0015OFe,5r\\\u000fJ\\NTL[~T1\t\u001dVXޤG7\u0015U*áɀYekSRN-4ac֕Dw-\u0006\u0013\u0001`*\u0003va{ڍmO躆6\u0003$\tO3`4Fm1ȓ@Ǡ\baI2{$yM4\u000fZm\"d'Ul.\u001dmzH$ݡʫ\u0015m\u001c.[_|}ݽMFMk6DyzV\\ܜfn@^7Ͷå\u001d\u0011\u0005߬\u001aǂO\u001cv?S\u0007\fk'D\n\u0014t2\u0007u0}oM߮yy\rK\u0019DUtiT]\u0005\u0013m\fj^'v-%\u0003\u000fe\u001dH%e=XѮ\u0000?$9\bj\u0007vd\"-}\\\u0007׭\u000bRB)@YK\u0000ؙb\u0005\tun$EGLUG\u001cfͨ\u0019|NԪ\u000b7k\u0004Ux0gYvyPG\u0007l\u001eM\u0013\u001dܺÝfP_\\n\u0007\u0001PjҋjgR\fޛ7\u001cmTv|Uy\u0018D\u0012@\u0004=jzk\u000e=OWL\u0005yuZI\r%ct[\u001d\u0003S[jym\u001a{\u000b,rv+\u0007U\u001f)wZI,p|3ojVg\u001d0\rX\u0001\u0006\r]D1\r_fٖ/^\u0010\u0015\t\fuz\b\u0012|\u000f\u001c}J\"PF`\u0000\u001blO\u0011\u0002ؖe\u001a|73*?8J\u0000D/Eմj>FFVm܊EM\u001e\\\u0007<VW8mߓ\u0001̨w\b$\u0005ue\u0013\u000e!3N0zkUvzd\u00003l@&жԓ\u0006`f[9\u001ai3ޱQ:ef4yv\u0007\to\u0002\u0004.Ćiעʲ[\u0015\u0006\u000eF\u0005\u0011\u0015[:ASgwͽXU_.\u001c$3#\u0014Ěc!h8-rAJ2?5\u001f}^FKEU\u000fU8ۜ\u0017TTl>n4Ht\u0019[;)6+R1ޠo?H\fJ\u001c9\u0014\t\nPştd6ع\\D\u0007R8B\u0018/:*7\u001bu4/ʋ芷o\r֋`pg{&Н4tG\\\u001ct%3\u001e'8y$\u0016~A\u001b\u0007/F\u0007%|\\=boլ:OYvoJy|\u001d\u000eHTj\u0005~ӽAScCPʹ\u000e]Hj}߳\u0017d\u0018',\u0015~\u000ec\\PJA\u0016kt߼84fsjcVf=[׃X7j\u0003iS3>[Txͻ\u0012r\u001ab\u0002囡56\u0006&L\u001cN\f0;ΨnT,خ]J\t[vG*ͼT7qG8YgVlX\"}H\\b.F&\u0019.\u0007Ch+]\r:Z=CJǁ;NA\u000fv7Q\u001a>\u0005],3iЙuv0u\u0014m\u001a<u+B\u001ec1zӳZ+˟\u00191aU\u001bIU&6hm\u001c\u0007:~L\fPj5+63J綊N5{;9\u0013A;0.x~kE{ki\u0003/lO8AS\u0000\u0000;\r\u000bf\u000f,\u0013Oۚlr\u0000E=@]FW,A\\[S\u001djK%DArL\u0001]~;2wgϋE\u001cһ\u0010-]\\;\u000fK3_H\u0003*o6H$M\u0004\u0005ILtzg\u000bKґ\u0005x3&P!ZFN\"U\u0016ƃ\u000f#mf\u0002A&D7/|\u000eΩ>mjtJȻշ{u~N\u001e\u0000!@\u0016@\u0014$$}4,]\u0006X\u0007X\u0002\u0000m\u0017ם%:BԎس+O1-$\u0018\u001e\u0018T\nw;mBl\u0016;$XJ_^\u0005\"xAk\u0007H`R/DW\r\u000068W\u0000W\\%z\u0003@\u0014Xzu\u0011==\u0016\u001a\b\u0001\u0003Go᷁g\u001b2\u001btWc\u001b<ٶr::*\u0007\u000f\u0000=щ[I\u0007\u0012Mn\bW4v\u001c&# !xWw,w3\u001ehN\u001b.v7b~8\u000eJ=i7=&o66\t\u0018[\u001eT7?Ho\r\u0001RM)<A9B.8$5w%@,Nᅆ\u001eFZ۷\u000bws\r}i:9qg+EK~usm`?\u0016a=G4\u000f\u0000\u0010&9:\f\u0011\u0015<I\u000b-\u0013l7*N\u0004vޫ.߸\u0015gEѐ:-\u001b\u0001mtx=\u0018.zkN\u001e\u0015\tH\u0004O8/\u001eT\u00196 ۦ6iXL\u0002\b \u0006j\u0005{\u0001\u0016\u001dbP^1iiuHt?U{ߵx\r\u0004*P1b<k]޾wtv|l\u0003Ǣӡ;]%\u0012Q۲=I7\tXmp\u000f(ǿDe\u0005\u0010\u0001\u0018艏zr͕d+\u0016@\u0005X^[\u0005{\u0013=Jf\u001epS\u0013|l?\bݭyF)nyqfn}bƾp_mPZJɺ=\u0004nu~\u0012~\u0017mGCX(ep\u001f}]O\u00179\u0007X0{%g0+nMM3C0fcCN#\u001b^Y:Vө\u000fD\u0000\t\u0004fpӄbPiXZn vf'Sʾ3\u000b<h5\"b\u0016\u001f+.\u001d\u0014|\u0001o9/-u\u0015<J\u0015DU;\u0005e\u0013xZE@/\u00009\u0013_/y\u0006ϩ7XZ\u0002z?4Z;\u001c\u0016ڛy/\u0002V^!\u0007Z\u001bߧiʹtfRot{\u0010TԸr=h3\u0003~K:*åMt\f|K毟\"ZQbP\u000bIeWT^\u0002S\\IvW#{:\u001cV\u0018z\u0001\u0015ڳxUh8\u000f|,,|j4d\f\u00062kr\t?A\u0000<Br$/Nt\u001ep*ۍ#s\u000b/T\u0014m<>v~\n]~=mE\u000e׋sTUu\u0015˅+.\u0019ܖPo\u0004&GHAx\u0014\u0001\u001fCH\u0013.oR\u00044.=AC;-F^XܶBFuDY\u001fڋiee\u0007\u001aۃɾO<1=\u0019+5})\u000b[!ў=w[vT\u0014:b'H:h\u0003#TPӒ'Rt؊(\u000bڢ.Pʧ\rch̟wRvaytzEc35u\u0016&_¯Oo|\u001bDǔ\u001cqT\u00000\u0005蛥AH\u0001$\u0000~\nVկmrZP.\u001bagzP>|mno8O7Vi`,O\u0017̞̔t<\u000561V(\u000eW8j}L\u0007/J,\u000b؏\u000b+/<柛bU1?\u0012d]]8 $\u001c:N[xNWa\"q\u00167͚I]Zz\\Jt{m^9\u000bcwh\u000ekE\u000eX>{\u00006\u0019W4@\u001d\u0016t\u0017ԲDzn\u0015\u001f\u0000,iu\u001aul/Շqq{3$e0/YṣJ\u001a;o-\u001eVn|\u001d\u0007Y^G-e\u001cvŷ[CUɑ7@S\u001f\u0000$j\u001d٤V\u0012\u000f;]e=6U2\u000f맹NF܆.+|\u001fȓ:(\u001faw7=\u000f43&M>,\u0001Y\u0010us=\u001c\nБ\u0005lL\u0016T/%\u000f-8C.]L\rkp\u0012[i4\u0013j\u000fWX%//h37\u0015O|<gHi\u0017i?\u0006w3\"j-qŇJqג\u0003\u0000t'=%/^Z\u0013QT,»G5\u000b\u0015Bq\u001dlZ[_F\nSfvxxA&.!K\u0003cVQopbeˣ\u001fw^Bn u\u0007W)[\u001e\u0000}܋I\u0016Xy2:zXSl\\m\u001d6\".ѫ\u0007}H鞒\u001e#:A\u000bv,gQo\u0014\u0007r7`1]w&GR1u\u0011e\"P\u000b7\u0003,\"\u0011!,\u0006]}SKv\u001cٸ\u0013v/;\u0014 W3RsuR_Ï{\u0006\u0017/p\u0002,|Qh_[J~2!_LDN\u0016-I\u0013$\u0006wrkL\u001c4x\u001dL|\"\u0011m>7q!٬{U.G58ϓ<&޳r֐>i\u0015GdS3\u001a\u0017j+\u0012J\u0006i!'g\u0017xz%\u001aJ\u0002\u0006LNO\u00107J)BY'Ex\u0012N+\u000fE0sbP&G.kv(\n^\u0017U\u0005AQ\u0006LOV5\r\u0016U)DS؃{:h\u0016u.\u0016\u0001@O\u0013`\u0005Ib/Tӵz-nsF\u0016\u0014X48?07+M1&6\u001at7\bp\u001fI1f\faQb\u000fF{RWi.G7\u000bu3;uսS\u001cc19?-\u001e\u0019֙׭\u0012_o4rHVq,RVgظwû\u0003\u001e:\u0005+O\u0002jβ9\u001cDz|\rǻg\u0019'\u0013:no\f\no\\\u0006v0YK\u001e/D\u0007\u001f\u001csY\u001dl\u0013\u001ePYT\fFlC-'ªvG7VgpƎGb?>_z\fjaWl^\"};՗aի\u0015x&Z}a[0\u001eQ~\u0007\npZ2V\u001dlKyXH{qdV\u001dܪON\u0003!\u0011XwR^Vҩ5.\u0011'\u0003o|v\u001a6M{}mi4x܌OB_\u0006!\rsV@\u0000\u0000\rHuX\u00192yN\u000e7^08\u000eu\u0017~ziA-zq ]1vfxhC;(\u0010m<[Z5ǰ}\\'\rsK\rT\u001ag]\u001f4^f\u0018\u0016\tP?<5\u0011\u0001$'\u0013m\u0000\n \u0013\u0001\u0010%\u0012\u0010\u000e\u0000~gF\u0000\u001e\u00123y\u000b@>u1Wv{ϩ3nk\u001bOu\u00185I\u0000\u0019lV\u0018Y\rW^\u000eЙN\u0004W3uqHM\\\u001dH\u0000\u001dD\"%:/q\t j\t\u0007H\u0000nQ\u0000@\u001e?\u0012d\u000br@yɪ5hE\u001ej\":Qz\u0018=u\fN\\cv?.\bM\nMΜ4K[\u0000t|$Vv^\u0000\u001eV\r+f\u001e@Q\u0004\u0002h=\u001e \n|\u00020ByoP\u0003\u0015k޺\u0016y\u001a2]?}\u0006ok\\I\u000f鉣MMo\u001bͣn\u0019,\u000f\u0000 D\u0001wz\u0000n\"u\u0000da\t\u0000\nx\"b7/sFi]\u0012\fSr'Ϋ08J\u0018=!+(\u001e?}^*ͥEvN\u001b\u0000\u0000_ToI:8Y\u0004f\u0006_ai\u0013\u0011̤m\u0017\u0001h\u0000\u001fi\u0006\u001b$V8B\\YX$3S\nL\u0018SQY\u000ezW.>N}\u0000_.:Y\u001c6\u001c\u001b%ı\u0000=\u0002\bL\u0000)\tRR\"\u0015C6h EĸDe%oL@p\u001f\u0018X\u001a/OedC\u001dauZS\u00049\u000071ɵo\u0017}T;8ym_5.v_J_:<)\u0012Gu\u00001M0\u0005ac\nP\u001f^\u0003ɝ^Ɋ\u001aK\u0019emux|+\u0001:\u0011~YaN\u0013S器Ѹ\\;\u0014Jq,m4{\u001f\u0000B\"f\u0000rĝv\u0013u+\t\u0018\u001a`b\u0001x\u001b+Rlp\nlΞ~?2hX+=*޸׹q\u001a\u0006-\u0012[\u000bQWtP\u001bZh[#abH\u0013.+{\t3'\u0007P$$\u0006mA9PşsT\u0006%\t\r5Mh\b[˷×!&>f-\u0005|\u0013\\ސ9nLɱ_t(84&][8T\u0016SRkG4Q^0\u0000\u0000\u000f\u000e~\u000bo\u0018i\rWZ޳EkwU[\u000eCMG޸ھ˧s\u0001+vNހ{:RFx\u0014\u000e$8T1\u0002[KR{\u0019j$Z-\\\u000f:\u0017O?\u0000s=\u0012Ĥ+q\u0000F;P6\u000e*\u0016 \u001f>i\u0014\u0003$00HK9P\u001b\u0013dqOp%۽+? \bHlq\u001bl\u001an9V%jM\u0003̞|<@]\u0005elC$\u000f{\u001e<\u001aaAv\u0012.%\u001cx8\u000e\u000fIP`v4͗}6Jc\u000bhѯ\u001cKYCQ0ze\u0001\u0007\u0000F\u0001V\u0000J\u001c(3\u0005*0\u0006Pk\u001bi~Њ=y\f\u0018wu\u001b3Δ\u0007{\u0001;Gm\f5HS=Mkx\u0011F3lVRM#zX\u0011\u00123 \u000eoN꣚\u0003P^:Tr\u0004\u000bU{Y\rnn\u000bG)8~?6.\u0019l\u001dH62>j&W~tV;LrvIz-K;,\u0011EȞ\"\u0000Je\u0003$\u0012}5\u0015\u00016A؉A\u0010TP)@}$[\u001aB#eyk1YQm4Y˓T_Ǫ#|/\b|\u0013Ey^\u0003\u000fʥ\u0007\n$iLDA\u000fލ#4݂/t#4e:Fd}+4rmy\u00170Nշڟ+9\\¹*]\\\u000fa2Ǭc۟kԪ&\u0013\u0013?HC\u000f\u0000|\u001b^\u0000PJi\tazY\"^\u001d9/nN33\u000bjR&,FzІsky\u001dj=Is\u0007|+.\u000fGo5_>֭\u0003]&\fCǢ? \\ޚdJs[?:G;诼Nxn@sw^y\u001c\u0004Y6rIZ-\u001d>ͅj}\u000f\u0017<rKb\u0000\"VCNᦣ\u0012oFRMˋş\u0015Nr!\u0016-$((Y\u001c~Se!\u001c\u0007HF\u0019\u000bAe1AUoQ_k>ԇ@OJ|k\u001a`֎Q\u001aF$uZ#Tf^夹/\u000e\u001dOi>\u0011C\u0016TH?\u0003Ԥ7;J>:_\u001auZ@8_\u0001'V}p7~nvgއlo!=Ϸ\u001f8sה\u0006'Щnd\u001cni\"LĖߓ\\Kͻr:BO<\u0010g<\\j\u000eo2 D\u000b\f\u001c\u0017>\fE\u000f\u0000\u0010L\u0002 \u0002\u0019O\u0011\u001eǍ6\u0010\u000fś/o㊐czy̢\u000en5e\ryVs1S\u0019\"lqU\u0006\u0011\u0007\u0002,\r3\u001f.ָb]g\u000fB}\u00000\u001b\u001e\n*ë\u0000;e\u0015env{%(Nby6i!uD\u000bj#ˊCW\u0016\u001dߘR[D\u001e;|\\+\bW\rn\tq?߀\u0017Y>1rdl̜W6{N\ri[\u0000xwPFJ\u000b[R&\u0010#\u0007\u0017\u0016-]ƴ%-;]3\"\u001a@,G6*0fkn\r_K(o\u00060ܡ\"3aCpI-2>Auݗ#k.(o\nN*\b4rLz0wT%q\u0017kqX:gJ\n.$236\u000b%_>[\u001ec>E\u001d/\u001eΈvW֜\nNFDj,\u001dJ6]ǜ#k\u0003\u00000Aԩag\u001c\u001dn\u001d\u0019hh4\u001e\u001dk{ENVvl\u0007ud-\u001f.\r?\u000e\nL\u001b8r\u0014-\u001f;#J\u0010\u0012?\rigeDv\u0011پ(\u0012\u0001\f4K_7\u0000\u000b1m&Ի\u000eyZ\b}hlWj_g噬q۔<\u001b0+ȓ׆ks>_aKmT\u0006ZTd&G{D|/\u0005{yހ*9\u00122\u000bz\u001bZq+N\u0003{\u0011N[]œ$\u00111#[\u0007O'`шLT\u001b|V2B\u00114,%8\t\u0011c\u0006\"SQ;o|Q;I@NR\u001fiΤR\u001f[Ak\u001f\u0018.}_$S\n>xF_vIF*yQo\\ƧW \u0018F^\u0015NgVD8\"\b\u0007#p\r\u001c'c&`D뙟\u0007E\u00133?5!aVDi\u0005f*\u00163\u0011ɫ0ܰR\u001a)\u001cb?}?M=:7EZ.Dn9֊I\rD\u0007y57bSmRe\u0003ؽgv`\\uA8X]\u001f wokOӵd\u0006EqtnSeV01;ͦ\u0015Ug:.\u0011\u0017bvVߝ[܌gB9@\rV\u001b9ӮI:\\\u000f\u0013{⻫->\u001c]l\\nF\u0003T\u001aHsPzǉ]튍y'8x\n4|\u0014\u001d9=|\u0005MkG~VP=?@\u00143Hs%Frc[S13ƑT҇\u001cn\u0013uʹI~Ձ(^jX^{Eϖ֯\u001b>\u000b\u001a7`Qby\u0000׋\r\u001dAI(hWڗL/W\u0019RӲ*\u0000PR0\u001d\n=(^\u001f\u0000m\u001fR\u0000\u001eg\u00007\u0010\u0013<WP\u0000.c\u0001y7\u001e\u0014?\u0015\u0014\u001d\tf!\u0003\"Z\u0002ES\u0006E|\u0004ŲB\u000f=xÐ7{9fs\u001b_\u001d5Z\u001dnf\u00012瑺?_J|\u0012ޫԗ\u0000Dꨙ};\u0018N<\u001e-4٠\u0004]mW4U\u0005JD>\n\u001ewDj,\u0004fz~.!dh\u0013O1u{$ll)U6j\u0006P!jV\u0000~~\u0000L\u000eˉ]D*;OL\u001aTtH=\u00121(\u000bDl\u000by\u001fN=;Ho\fӰ]|#A{\u001fڹp4gW=\u0012Cv7&:vs\"\u0001\u0015TzW\u0014fD^\u000b\u001eL]\u0000\u0010nkt\u001fAi\u001e\u0003PV\nXA|xVu8|\u0017f\u0003ć0G젶˷ͽKW?HC\u000f$RkPCGGĚ\u001c\u0005\u0010\u0002D\u000023^\u0002Ŏ\u0000PI?8I\u0012\u0007Jd\u001eg(q\b{zu&ZK\u000b\u0013E<3h]N\u0001\u0019\u000eѰZ3\\zbi`+\u001e\u0014I'w\u0003Ġs'2&v\u0001\u0012IO\u0016\u0005@'2NZ\u000fD+O~#̫\u0012g>\u0016߶N=%~@N_d\u0014̞\b$uؽ`k8\u0003<l^\u001cg{\u0000($Rw#{4\tf\u0000\u001a@\u000b\u0000Ed\u0015?\u001b\u0000k~G{~5:O\u0014<b%\u0018\u000b]\u0011_E\"\u001aաo7 Tb`X;\r-0]_HS{\u0007\u0000BFD\u0004`/1Dd\u0001\nA\u0002\u0004Э\u0006hkŽ\u001bD][e>M\u0010\u0012\u000f\u0016\"\u0019y5-:\r$1LE&\u0010-ir홺ݵ㩟9;X\u0017;Z\r~\u000f\u00005\u0006(I:T\b\u0003;\u0002l\bn\b`7<56n!Ա$doh\u001e\\\u0001Mf\n_vu\u001cDбXSg /g \u001c\u0016t\u0016G姡woLv/\u001c\u0019\u00190GrH<\u0013l+1߆\u001d$&nDg\fY=׎\u001b|u%\u0002\u0001ӂ\\垩\u001bnf}\u000ei~\u000e\\_NF?>e6w\f}?ֳ7>0\u0012g89A\u001d\u000fo[*.\u000019(jLc3\rK#qͮ\u0007\u001cMxD\u001eu'\u000b\u001b[<~a\u0014x.և`)7;(ub/ڭ3tp\u0016ef}5:z\u001e:\u0007\u0001Z%ĝ>\u0005ST\u000be{Kߠa^j%\"\u001e\u0012٧d7O;\u0007\b\u001a\u0010w4>Ԇ>d{k;r!o\\§uێ\\qfkh~\bF_hZWjWaUm\u001e\u0000։AWM\u001cLƠ,\\\u001dF\u0016Q>iiPODQU]AL\u0017PJ\u001cAY `3,\u001as]򵇺f]F\u00071\u0019ݵQl)o\\8\u0004\u001bҐn\u001fҪ(XsT\u0007\u0015r\u001eD#\u000e\u000bכ]-Xٞ6+r޲!ֱHGNa'3;؈@\u0015tIjTmx4\rstVf\u0016XHD)\u001fRC\u0007|MFJlH%\u0004p4;7lc+{\u001du\u0005p\u0007܆6\\r1砍;|hZM@{GmI.<Tuv#(ӛ򽒺,;Wt~YI<\u001d-b,UST~Da\u0000\u0004ɷT*2È5[kW\\wqGѻG'<>\u001f=>mi\u001fԿ\u0019=O=pym\u0010Gί\rP.J\u0017E\u0016|3ĭ3+TgzWN`8\u001ac~\u0000:[O\u0018\u0001j\u0002K! X>vX<^mިs}hEڐq5MmԩjvTW䱽\u000f{LTQ~ٙ0:)vVNe?%sS\u0004\u001c:%\u0002\u0000\u001d@2\u0013Sդ.\u0013\u0007n\u001b!͇\u000ef|p\u001b۩Vl?vk\u001enn[BHW/Tju5g\rY̆EMBzv\u0010&\u0006mȢտbTqAłS@Dn!\u0000HuĤ*_M+L\nǁӟ,:U$H2c\u001cf1e\b1^V\u001dS0Y˕\u001bQNȢ=\u001f\nc{6\u0016v\nƙU\u0018;X:ر\u001e\u000b~\u001c՗\fy\u000f`O\u0006*C_|-Y)\u001cݩ뗿\u001aӣm\"JMqg#a.Q _+h!\u001e:ӹNuY>Zb&[L5~&ő(* \u0018]53j\"KxJ\u0006W7\u0006{$#i\u0002(Y@uLt\u001eb܍,,CoOߗd0jX;_\u0018G[j%\u0014Fvu<!\u0013E\u0013\u0010J\u001ey\u001e*đ\u001f+]s\u0007k\u0006\u001ah~is?\u000e\u0000OF(>\u0004e9jj\u0001LzI\\r&1I\f9lsѕ(X^$󓺸;p]!$ˣ6\u001c5\u00063Հ6g\u000f\u001e\u0004\u001eX\u0012v\u0001\u00033A{$\u0013\u0000U({\u0011\u0014VUPn\u001fsh\ruwS_k׳\u0002]`NԍhDo WrF\u0006\u0014s{A@K\u000e2q`A4+g~\u0011t\u0006e\u000f\u0018\u0011`\u0005*n=1dߗSȟFLyo\u0005~cM\u001dS[v=gpi\u0006;G\u001c#4,҅]a\r3Ky;Z\fGUƲB\u0014An\u0003\u0000%b\u00076\u0000U|Q\u00078\u000bzqjDl\u001b)C\u0000(HryB\u0010{?\u001de<\f7fWO_\u000e\bE\u0006w+ipz#Ļ\u0012O'zXho1\u0001W\u0006*M\u0006w\u001d}\u000fEk`\u00166Qjja_MϹԉ#uV3Xa\u0003yHG^\u0011x\u000f3<t30dp\t`\u0018,AZ\u001b\u001eWn\u0011{]{\u0000,|\u001fTY{2~[8\u0015\u001frsniO[l8X\u001e\u0007R6zagN}x&dCE]Hn22a\u0016:\u001d\"7\u001a{^t\u000b+\u0017j\u0017nt\tM\u001foAȵ\b2@$NsX[o2T\u0019u\u001fȁ.,\\Pas\u001bQh>hKAi3]sCq͡q'\u0004$3q_H7ƖL\u0018\u001f\n>_̎xʽ\u0012Dw4cs6\u0019\u000e\u001e\u001am|\u0016c*-\u0016G=\u000e)ͭf5\n.;V(k\u000f'}g\u0005'mmLx&ōۃU*rS%u\u0004_V;(\u0003^\n-;P[]xl'䫹DT辕\u000fF&\u0006W4v)Dnxvl2\n\u0006VΰhQM}&P\u0016cmS\u001c\u000421@M\u0007ⶋS}'m>+\u0017!m!Ҥ00g;q#~꿵X\tw6~Rzܒ]*k{vo${`\u0000\u000ey֕0\u00112ݧ5\u001aP݃\u001f!ѹv\fr\u001d\u0018tZk+rs3\rsJ[;ԋ$\u001d\u0006R֫\"U\u001ez\\r]Mi:뛇O\u001ct3*\\\u000f\u0003t*$鉢\u0018 3{^Ԣ,\u0019\u0006m<.zE\u00020'd{tAxT:WO^i`ݫVY\u001a8r仿ǘ!>:뗓ӣޙE;b9JԕF\u0000\t]NpW+{+꡶4mRlS^jp\u0004߫bWnbTe/\u0015G0\u001ci6Pm\"\u0007\"8oH\u001e\r(g\u000bPHZ\rJ(\u0003\u0012\u0007P;;\u0005PeҞsAi@\u0011X5P\u0014(2\u0005\u0011\u0014s\u0015(\b\u0003\u0014\u0013(h\u0007(\u0011(\f%P Z0(MPh\u0000\u000f\u0004\u001b5#\\\u0016/Zh% +į?u\u001e\u0003(]Y\u0000чO<mY\u0003v\u0014\u0013:\u000bJ5'zJ\nvK\u00016\u0013s'ѻ\u0012\u000b\u0014P>K\u0013z'Y\u0016\u0012H\u000eL]T<a\u0017Qt?y.=˸ʿ\u0004(\u0005(BDzHY\u0001h\u0000\u000b\u0000\u0019s+\u0011Aq\u0013k\u0013hP4П\u0002E\"6%zs\u0014$zc\u0000\nz\u001dV\u0013'\u0012\u0014<_NY2\u0007\u0018kXC;\u0016\u000bF\u0015c~hkTAÜ\u0012y\u0000}\u0004\u0005!N^\u0002\u0000a\\\u000f5P\"\nT2\u0001%dv\"v{KĞD,]\u0012O\u0017\u0017/\u0007JPgx1o(YILvγ_\u0002\u0014璉\u0006%e$\u0014a^x\u0004sp\u0004p\u0004YHzD\u0019b\u0013t?\u0013=H\u0015{\":߇[}\u0005\r}굗&Uۉc{W\u0019\u000197h?]ݫ(]q^8ozw[j\u0000(c]\u0000\\Z'\u0013\u0006 \u0002\u0002\u0018$WJ\u0012\r\u0000c\u000e}D^\u0018\\۸U*\u001a<\t=\u0003Dm>ܕ\rg;\u0015\u001dݦ\u0016\u0013O>1:/⽔xx\u000b z\u0006O\u0005ki\u000e\u0005 \u0006c\u000b'ƕ[oЯ\nS\u0010zїN՟r\u001fF%n\u0019H9lkVy?\u0005\u001dhy^^W$/9v;9\u001e]hd\u000bή/\u0001J\u0001S\n|%Y\\_2\u0003\"i\nr3䧅o\u0000IFZ\u0014S8`b@3s٭3%\u0010'lt\u001d{\r<d.v,:yt,\u001ea>Uv\u0017OtNn_\u0002ʷDjO\u0003~\u001b@!V\u001e\u0002tt^T\u0003T&\u0016DB\"~yw,\u001fEyrU'\u001ey:L\u001cv\u0003}OvFm\u001eǕgh`3mnygp8B>5@\t\u000f~\u001b0\u0017\u0001rV\u0000=J<jp0-_n.~l\u001bfj/ߘ[፻T{WR珵;\u0016R\u0015Nv]\u001cOY9\\P̣=GoO\u001czVY숪D\u001b\u001c\u000b[\\:_\u0002h\t \u00018bݗ\nqz=-nFıq؇\u0011x0ҭSPnR;TA>{0\u0015zG4:\u000bEg}cnm`f848Q.od6XOVS_\u0014?umtZ+4̔\u0003(ߡ\u0007\u0002T\u0001638Dg\u0006_]}^<B[~?\r0*v\u0013+X\u001a\"wwB\f\u0019\u0018c\u001de-y3~\u001bz]\u0015kPeMy=ȲB\rl/N\ba\u0000P\\\u0003H\u0015MwV`\u0007\u0007>] <\tcsܾ\u0002hpqlgMX\u0005KU]ҭj\u0017_>]Y\u0019A\u000e[Z\u0011Y\u0016\u0007\u001b8\u0005KҮH~SuPn㗧-'=i\u001a\u000f\u001d9U\u001d\u0007)\r=]ea\u0018\u0012~is1z{&HHe+Trcj_eQ[\bt\u001e$]k\u001f$\u001f$}UIB\u001a=\u0017/&R>\u001f/\\`.)n=\u000fpu\u001f\u001doXnd:fr\u001beu/hWD\u00150D\u0012?0\u0015J;s^\u0012I]^vb6Z%Y \u0004:,\u0012\u0000B*44YD\u0018E,<\r`6xqe\u0004K9]əiɢtn\u001c%LS_o5e\u0015z).mUF1B4]VYnޜ\u0017?Lȟf@/LcV'PrG2/1*@r|K|\u0004}=D\u001c=\r\u001dؼ9GG?\u001fkt\\TNe[w=؏\u0003ݱ\"%rnsҵY\u0016sYFk\u001a{Kz\u0002xBW_$\u0003N$i&tM@\u0007R[\u0011JH\u0007\u001e\u0018[\\h=LƫA\bs\u0016爭О5+{~팱>ud\r!X\u001bK\"\u00163?S%2%<>N=G\\\tдuKp\n'#\u001cr`G/\fOdn\u0017#\n\u0017(ﴪUU`ew.6HMo<ć!zG8n_rÕnO-\u0007kى\u0001E\u0002\fc,tT]\u001eM#O)_g/\u0001:'q\u001bb=Zo_@NǕ3v\u000e\n<\u001bZT^\u0018#hi^gM\u0018ȇ\u001542\u001cEy)\u0018\t\u001f\u000brcܣ|.5F\rgE\r۷d\u0010#k\u0010pU\u0018G\u00195\t\u000f$&\u0019d%\u0002g\u0000TX\\fUכkAt\tnA\\c\u0013՚l}cmZ)9K<\u001f.pK=\u0010t6<\f\u001a\u0006U\u0001E3Buψ軿\tנ\u0007w޿\u0004g\fY WPF\u001bw\u0002~\u0018ggd\u000f*wX\u0017\u0013F\u001dP\\,UX~F\u001eX\u0005D<E\u000fOq\u001e!Чx+е\u000e;\u0011\u000b\rr\u0004t,;72\\F\u0001/|P\"EAy+f\"/gn:\u001du?\u0006U'\u001bAd\nS~\u001akNr٩\bͫ6bEcRPvG\\\u001ay߹\u0010s{eG\u001a\fs6==\u0003*\u0004']eY\u0006u_\u00065\u0012\u0017\u0001\n%g\u0000l\u000e6;跏6U\u001dFXi\u0001I`0tэdxtuBֶ|\u000fj߉\u0007W24K5Y_z!dHi\u001cmTĵE\fLjD_\u0003u\u0002e$\n\u0000g^ԣ|fws\u0004ҎDg+\u0017k\u000emYs\ni\u0013>ן\tU\u001cEeD\u001f|Q΁uו2NHׁY\u0013&;}Xӹ~s](m\u0012􌁟f?>+\u000e/x\u0007ť8G\u0019{&;\"?W-F+NToKwrZg9u\b(^\u001c\u0017\u001dTZK}{͊F3\u0015\u000b\u001e>܊\u0010\u001e+^k];\u000f\u0004&~c;&_\"\u001d:WmŸa?0]g\u000bϡq[u,\u001c\u0016Zߦ\n6{r{a}QF'n\u001c\u0007\u00075Z[pg\u00131%[-״\u000b-J\u001d.Z<\u0005\u0004Sߥ=k݃Ż\u0004nqvx>\u0006~]]\"\u0003\u0007\u0013ƃ=uXƕu\u0018p*\t\u000b(X̊q1\u0018Qϯ\\\u0019\u000eK)]+r\u0000[\fco\u001fǏ\u0013]D:y>\n\f0k{f:At۫D_\f9\u001f]繥ք+8\u0017ds\u0018@D\u0004\u0011\u0010L \u00060!\b?\u001b{G?\u000fMnyj,Z=;3d7qn-\\W!DG<`p|V%W >Re-6_]8\u001cvٺpy\u0017`YM,!б\u001aZXGz$pbo 4S|V\u00169[\u0016)\u001dvZy'^?7\u000eꃈqrf0\u0014Q_CS6Ri~[-6sN\u0006[jDk&YMB.R+[\u001e|j+v%1F2+1,Z¦ |^~\u001dHPݢP\bkV\u0018+mΡO+MCOc!§]\bp[4@lBHAf}=~i,\u0016VUƭUvWԹ,t\\^/a>7?߰Z\fĂ(1SGP>\fZuZ\u001ay\u0014h:ۑ(xlhItӬ\u0001&1\u0011\\~\n\bAI\u0016ηBD&\\\u0016:|麹֊)\u0010HQh|t\u001eŁq\u00109\n堓ײ+ch\rUE3I\u001clRnzL\u001a\u00034}ڒ9\u001cP!BiV\u0016ڂRhzQβXG:fA:\u0012w~|8\u000erC|}\u000b#\u0006D@L+\u0001F\u0015\u0000cd_38\u0012Tt\u0000{\u0005X\\\u0007h̰\u0000]\u000bm|\u0000(@*c\u000b`o\u0001\u0018\u0000\r\u0000+-\u000bMp{d\u0013\u0000\u001e`\u0004\u0003>!\u0003X8*Ӕ\u0019>\u0007\u001f\u0000Dy% YM\u0013JN\"i7\u0000Nh|\u0013\t\r$\u0019DXOĮz\u0000Aq<QJi\u0000>vh\u0011\u0002XB\t$  $\u0018kjt³g\n\u001f\u00159͒ҴB{{\u0007\u001dq$\u0003\r\u000b4\u0003p\\D~\u0003\t'\u0000\n@*t\u000f``]\u0013DO%ڝ[ӭ3HQӌ<l7R@cWXq\u0005@\u0019>?\u001fjq\u0000\u0016\u0016\u0012*m\u0003\u0002F\u0000\u0012`6L$zwdR\u0001@\u0010\u0001m\u0012ѳC\r \u000b 8ģxҹ:?$/)Ty@\u001dJ\u00031}?H\u001d]o\u00120\u000fP\u000f\u0015T\u0017=\u0006\u0005M\u0001|KI\u0000\u0000.\u0000c\u0015\u00000\u0007\u0004h3\u0004h$\u0002$\u0016A\u001anc4LcnNPy=*BTիTXg\u0013y\\ȑ=/W\u0000M\u0000:+IiĦv~^?ҰjN\u0000-\u000b\u0019\u0006&xܛoWw\u0006z˿ĳ><D#y5C?\u001eCUpnp:WF ~*\u001e\f+!j\u000eXX6:Eҍ:j7IAw@\u001c ~\u001c\u0010r\u0006\u0004\u0001{1ݿߥ^\u0015[B'lRiL<>\rw\u0016tO7᱋\u0003핁{alSW \feq q;\u0012nH%j\u000fҀo\u000b{d\u000b\bz\u0000(6\u0000aQ\u0001\u0012_'۫\u001b>C\u001bg L,\u0006k?XitwMK\u0017^V\u001aD~+u^/\u001afF\u0001.hUAG\u001dcF.\be\u001c׵\u0002fS!\u001a\u0000Y\u001f?t\u0001or݊4\u001ckٿ\u0006Ј\t\u001f\u001cxykAnj>yIgκwEsCA<&0;\u001e[ \b\u0010O懚]\u0013w|^Zbe\n\u0005@glһτ.O\u000b|L,f\f5\n`\\(\u001f\u0013v?KgGs,~<bw\u0001\u0019N{6mb\u0013*6cֹϯJX\r^6*L'\u0017I\u001f\u0002̈́Lګ5ߴb\u001b?\u001fÛm\u00063-.\u000e\u001c\u000b?`vc*Z\u001c^')47{Uc3X5gWgWXV7a4;L_eH\u001a\u001c3Nt+/*X<Ug\u000e`.`éw\u001d\u001bl9\u0016p5\u001e;#W|YkI\u00192X\u0019?B\u000ew-2s㥇-\u001d_\b25صV>\u0015\u0000k\"דER\tk;ߵ'Kc^,Ud\u0007\u0007-0\u000b\u0018^f:tZR-jWKY\u0018\fuԩ:Y,\u0006-(\u001aڶyZA*9fiQ8^\u0015?\u0007c\u00047\u001ai\u000b<N},5}gf܇\u0000:pM8\u0017b{him⺹/\u0017M@Ϋ[f-\\72k\f\u0016qςo{@iP}PҲpKRl3/G@\u0016=W\u0000\f$@Nu\u0000\u0014.Z)\u0004r(7m<h̸Ʃ홚\u0004`O\u001a֪\u000fƢFz8zL^T{]()].[\u0003#lNdvZ\u000eg\u0017K馓\r_\u0001 N2N\"A!Yĕ MQj.9\u000eRl\u001d\u001ep\u0007mEAL\u001b}UC4JБ\u00146l\f*<%K[13\u001b)b]\u000b#v:=C\u0014TWS\u0006QH<:ݽS/\u001a0\"\u0016\u001c)v\u0007伻I\u001a%۳\u0011:袴ԞjOU_|FC6a^j.3|JN\u001e7O7BUݞ0x&s-;݅!TA=\u0013\u000eӅ\u0019 \"|\r\\\u0006\n;\u0013\u0007O* F^W##o;HMxMM\tui\u001as=.^wsc\u001a~\u0011><0d$\u000bi\u001ft||w)OO\u001b\\\u0001C\u0006'LË)\u0003lfQgTv椹0`ՠ6\u000eT\b<Ξ'?W3r?5{BerXM\u0002~Rl\"Dkr\u001b4I9qri\u0016pK\u0001c79\u0019?[\u0011\u000e9]kg1\u001dK/<܍k\u0011\u0018.\u00135\u000fE\u0010ʬ\rT7=&cd⎯ɏ5R\tQSgۊ=bf\nK#{\u0015@'2933iZԴo\u0005jS\\Ek2\u000f-#@e4͵tR.3WO0kأxUK$gX\nj\u0013\u000b;z}L\u0016\f\u00074\u001c\u000e؉5\u001c\u0010|*=~<\u001f$^|d+\u000e_;璱<6N씻\u000bfՓ1F\u0006?մq#۝{p_\u001fܦ\u0002WhiKЗŸ*3'{tLl\u0007b\u001d`Wt\u0004?>u\u0003\u0010\u0002Kp\b%5.[z0s\\8?*͌bz/,wS#c\u0005\u0016)%e\\ZWKq\u0011\rK\u0018>A\u001dl\u001f_s03 2k_@^H\u00125Ҳ^2黔\u000f{%)\u001b\u0015ɼ/bq\u0006\u0016Z]n\u0010\u000e?7\u0012oqtO\u001a[cqP|[X\u0015˱%\\DdgyvC\u00123\u0017c\u0018\u001bw\u0005@QQ1\u000f]rS ut\u0001hI:s\u001ec[#{S0Ӝ\f75G\u0017I_ltU`F|`q\u0015\\5شovxh9_+onXFoԻ^; ټ=;NOl^yw2x˅z\u0001\u0002=]loo'\u001e:kUwe\u0016UV+a|.J,\u0014\u0000\u0019?Aq\u0004\u0017)5\u001catޜ%Zn;dvT7:\u001akh?hFO[HqٿMod@-T1\u001bk\u0015\u001dFkk&֟jn2*+#N}Jz\u0019\u000eΌN̢z\u0006o(\u0014\u000f\u0016\u001dr1;H%{k\\+|K妷tmNU-j\nV?H\u001e<x̓\u0016ۑ*kE~\f7lԐW\u001e%S\n\u000fԑ[we\t=\u0014\u0018[,t\u0007Ql\r(hF\u000eSZ{LVKLƊB\u0016#+$Kl v9\u000f\u001b\u0015;4v!\u000f7j\u001d\u0017lwU\u0016sϳ T\u0002E\u0019/hX\u001f\u0018+\u0006Q9-\u000b\n\"JwFQ|uȶJج\u0005\u0014\u00116ηF\u0015թ9m\u0002j\u001fֶ0\u0013\u0015u\\T\u000bmqL-[\"2\u0018\u0016.\u0017/\u0017s6Y\u0019I]f9o{ЖxMoTɠO\u001b\u0011cݐWjf{i֠Reث3rԟʸ3+\u0004\u0007Z`Fqr+<;v=2P*B3\n\neFm몞\u000fM_`\u001an\u0016(9\u000e\rJ}'XfJƐ\u0015%\u0002(IT^۟>9\u0015\u0006P.YUl\u0019\u0011ɝ^:~1\u0005AK@[)v,oC%v0ⴾ\u0018f\nZg\u0005ĺB_,u\u0003]J,\u0011\u0014(\u0001\nڸ76A^y[ϙ_\u00178uA;\u0012J1\u001cP9O:^\u0010\u001eݱ+qx!$B}=\u0012ʵAY\"S7g\\x:w-\u0007~!+lyc2\u0012?'N\f\u001a\u000b\u000b3=`H`R+~|\fO0\u0000}\u0000\u0006@\u001e A(\u0001Č\u0000\u0019&\u000bY\u0004\u0000>W\u0000s7_\u0014\u0006s\\\u000b\u0019\u000f3\u0006P\u0001ti-\u0013,~ΰCv.J0C\u0013\u0000Z\u0000؞թ\u0018`ԫ^k<m\u0006\u0000D$:\u001b ѹe\u0013\u00015\u0006\u0000\u000b\u0019t\u0000\u0010=OND\u0000\u0018\ni\rv\u0000s\u0000gU\u0011P\rh%x&\fw\u001d5{g\u0014\b\u001fu\u0015\u00178\u001b\u0012C+E!S\u0013@W\u0017rT\u0005(]\u001e&bD\u0012=\u0011\u0006\u00008\\n:(wD[\u00000_U\u0001\u001bm\u0012\u001c\u0000W\u0002YQ{7K̴ܺv%\u001d6~\u0003wω|$J\u0019@G\u0012\u0019`\u0000\u0002\u0018Zk\u0000g\u0000:_\u000096@\u0007@7\u0001\u0007;:Q\u0000|B\u0004\u0002\u0019{'7v L]M\ty\u0015/rTzdGsQ~\f;\u0003Nj7\u00002\u001bAG\f[qH!+#\t&?QH]+\u0000\u0000ىPV\u0018\u001fݷYo~\u0013^V~MU\">vt;ng\u000bm\u000bC\u0007\u001f{}_V4P:\u000b*ߐTH1hilX\u0000y\u0000\u0004N\u000b\u000f\u000f0\u0003Y\u0000R=FOu\\ʑ<R_gn\u0016\u0002\u0019\u00122XAc׈QPw\u001enA^\u001ag\u001a9_Ɖߐt#+W\r+i҉\u0005p\u001e\u0000\u0010\u0000NA\u0017Sa\u001b=j\u001b\u0006\u0019m `,n2%\u0004\r\u001fBcw\u0007'\u001e\u001efIBﯟ\u000bY(|b0,) !s[дX\u0001`\u0003\u0002㟀\u0004#*lG<S#\f}Iu]ٙ>>o\u001e\u0017M\u0004~*EVY?\u001b\u000e3;nOJ\u001e9ssy{0+\u000be\u0007\u0002\u001f\u0000b\u0000\u0006'\u0000ϔU4a\u000b\u000f{[Rz%;\foq\u0012%O~pez\u0005`fTx\u001f\"wEK\u0016q ?AxdYH棃{\t+yc\u0012\u0006[zt\boaٰ\u0013\u001b\u0000Z\u0013\u0003SqL8S)1_1)Cms\t\u00014\u001d߼M\u001fݶD\u0019jhf\u001cBP%vQ5T23Ό?4\u0014-\\\rnu|+^z_\u0001Y\u0005&R=\u0000ĕO^TX\u0010Q@ʉ\u0001Խcݾ)LznL3>0orvt~\u0010\u001bf_].,Zg=LpL\u001a4AX62Y`Iw=~^ĕ\u0010Sml\u00055ekr[\u000fA㛉o$\u0000}_\u001cL?jA~]G\u001f\u0013\u0001\u001d[?jΓw}-vzЬ.X\"]e\u000f:eUH~\u0011M\u0018\u000fG\u001b\u00173qx}\u001a_憼l'T\u000b\\\u0001/\u00058N\u0001 F9\u001d\u001b?Z߻'\u001dKWr\u000eWԎ%\u000eM@mɛ*>ۢN[z%n)=P+y#ZEVVA\u000e\u001du\u001ai(rhISMrW$#\u0013\u0000|^HFmbk,ք,\u000fFf\u001b,ނ׌X7u:tZ҃6[݌/͖s[\u0018-i_4hS3VZ6i\u0000j}&I\u0004_O.Q&k=AAjx{t'))U+%ݨ\u0005n5~`[w=x\u0006ND2ڽۭNtdE{oj68э++/\u001eР9\rR=wó|-3\u000fgf5~U+>H㵖ȥp\u0011vO`\u001d @ԋ62A~UH\u001b?6m!GwI\u0014o޶P\u000b3j5Vw}E\u0019a;Щi\u0016\u0011TܠW\u001f̼]x4ڹO5JL״NM,\u001d\u0005t\u0001vxMqNP\u0006\b\u0010JI4z\\t\u001fślᎾpί%\u001cO\u0017PKrm]jJe-OT\"=R|Ѫ=]`\u0006\\(52aek\\1qN\u001f$&H\u000ff\u0007\n-䇇^\u0015:{.\u001e\u00166BAu\u000bk64nD՟5DZ\\VH'i]N\u001azO3sN';\u0016xZLδE\u0012,y;\u0000ލƀUv(ҥwn,\u0016\u0007Q]߶N\u001c\u001e{\n6Ua1\u0005Uu4\u0012bugA:=n}A`\u0010Bɔ끻\u001bWeH9ѥw\t>v\u00043z|\u0013W펜ߐt{ORv\u0001]7\u0011\u001eTfs;7\u0016Z؞7\\.>t14Y۫[\u0003ς/\u0012GHOMFg\u0005tQy\u0017\u000ffcX\\1ߍ¶sƋY\\cVjͼoym77l{DꤤV\u0013\u0011{\\{܁䧻bl'\\?\u0013h\u001cRF$g,[\u000eCgru|\nFw5#\u001fo\u000e0tv7\u001c3>is8{2\u001a3oާ\u0000rw\u0002r~ϸ{=}A}\u001eWO{cu`kuΕP߬L6*%6G\u0013(7Ƿ7Jq1$̆̇'\u001cʱ?\u000e~?޹5;i`N,O!K\u0010x5\u0006sݩ)&j\u001dTE\u0007\u0017eM[\u0004>a!k2id2l1Qٕd~^\u001a\u000f\u000etQ;ޛ~s{xtui]K>Mj]*}wjq~\u0003\u000fb\u0018O\u001c*3;;-KǇPT]bGpYTslYF\rH\u001b{N1\u0006@\u0018\u0019n@1955\u0018LpnNi+\u001b+@h]r?SF\u0001%FԢ>]'n.՞=kՀyݭՠfAySg(tNf:'K\rCJ\u0014?7>G\\؁#j\u0018+\u0016x%ϗc7\u001b\u00072\u0014&\u00161(\n\u0016fd;\u0019\u0017˴-mVm\u000f޾\u001ex4D\u001bː']V\u000f*\u001cW,\u001bk\u00166\u0015nC\u0018jX\u0010\u001d\u0019)\u001b\u0006#\u000bL\u0019̛A-'./O\u0012\u001dF7]{:[V:P1h\r\u000e<\u0016eyE]YMgKV73N\u0007]Sm\rp\u0004Y\u000ek..\rq b\u0011\u0016Jxt\u0003u\u0004\u001cbG<K/\u0013qON`y庝GFetkt\u001eeyGۮyV4Gdl\u0016/B\u0018#\u0007|&+s+\u0018*+o'\u0005\\bohϹ\\#PH\u0015\u0013\u0002cVͰ;.\r\u001dY\u000eL\u000b\bp-v]\u001b+(rNEwlsf!eu!kӧ\u0011Z#wf\r:4Hv\u0011fD`\u001fVI\u00163\u000bn}s}'U\rdݨD1~\u0019HOgSgO*3K\u0011νIUfSRRE0\u000e\u001fN\u001aV\r<GmZ9Š4eNW3Ad\u0006`m޾\u0011]J\u0013\u0002UU4z>,=GԌ\u0019ƒYTB\u001efiRt8\\Y\u0011oJ`xj;{z`/2)ޮdq;\f\n[oA(\u0017tIJV~úf>=j\u0012lyeVXf\rf!ҋ\fZ'b\t%\r\nendstream\rendobj\r261 0 obj\r<</Length 65536>>stream\r\nu\r\u00195jIdIhόlfBA.:M\u001ct\u0003}՞*o1y(L麉i\u0006Y8gLmBd͂6]\u000b[h\u0016\u000f>8_s\u000fD{x|u\u0000,3V\u0010ݯ\u0010B\u0014찶P䚞^+\u001a%k_TmIV`P!B-\u0017:\u0013ALŢgՕBb&Q7@r\u0019 !L\u0015\u0014A\u0006·\toPf\u000e\u0017HxI$Ԍi\u001dƦr.xGsޚD\r\r4vke\u001c|,\u001a.\u0015\u001d/h%7m)\u0017_V\u001c]\u001bĠ.p{!p0\u0012Q54ZD=r=\u0004'H,\r\u0000\u000eM\u0000\u001d>]\u0000\fuKHT\u0001ltl\u0000n\b\u0019\u0003\u001a\u000018\u00009ϑ_H#,\u0000\t\u0015@\u0003=\u0004P$b\u0000*K\tsK\u001e\u0004@Ht\u00005\u0004\u0017@'\u001e\u001eg,F\u001b\u000b$\u0005!\u0007wߛIq:\u00118c\u0001|9\t\u0000r\u0004!A\u0002\u0007Rj\u0003x\u0000ƿ\u000b\u0000\u0005\r\u0003\r@\u000e\u001a\u0000%\u0012t\u0000\u001a\u000e&\u0000@\f\"$.\u0001\u0004l\u0014\u0006z\u001f6B/L\u0000{\u00158\u001b\u0000$_ZIiV\u0013\u0017\u0001H5\u0005d`TU\u0001@\u00012\u0010\n\u0000M\n8)sl\u0000\u001d\u0000L\u001e7\u0010Lj\u0012l)\u0000Yw\u0006@@Y6\u000b_G>\u0017\\y\u0015^\u001ap\u0019It\t\u0007\r=GRCR~\"U=\u000bmN\u0004X\u0001\t&_\u0004v\t ZD\u0003\u0018\b¬RO\u000f-;>\u0007t\r\u0003p_L}vcvzac\u0015yi\u0012\u0016) \u001d\u001c LQ\u0016ڞ\u0015e\r4ѱy\u0000wD΂-@Wk\u0002;\u0003P.*\u00034W\u0001\u0018B$\u001d7\u001eqN>\u000ex\u0000yg^5ţJtDd4t8k1\u0012aݹXKz|ͿB\u0017\u000fx\u001eԠۙ#\u0001b)[ЉDMe\u0000+,VޏKAad\u0015G\u001f\u001fsd2;\fv$cs lq\f1\u0018~x,\u0017J@s\r\u001ft\u0012g3{e~:T.|Iz\u0007/BiO\u0011y\u0012S/),?\rg\u0000xA\u0001vo\\\"wGfO#.Ios!w\u0018Yo*wyAަhpW\u0016E͂\u001e?gx:Yz4<\u001e?o\u001a|\u0007W\u001f`0\u0006عH\u0013\u001ew3\u0006\u0000lw)YϺz׷\u0007`썫.@&>U\u000b\u0005g]fBn\u00177Qg;֜\rퟘ\u001e\t\u001frߗ;ߖ\u0019g\u001b\u0000(\u0019\u0003`\u0012[I,2Cu\u0013F\u0005[^x\u001cZjn]\u000brX|ځNkf\rx,K#1Ca*|A!l85l\\\u001fzi5d^;2oc}Gl\u0006<D꫞\u00147&nlub\b&\u0011r\u0007a\u0007狗648\b4f'\u001eK\b\u000e,%wK1w?:욅2ӌ7bƤlO\rzYk\"\u0006畻~W]VJ7$~&\u0007,\u0001Tk~)]M=q\u0014\u001e\u0016c\u0017뇒~m\u0016K}fnʉ-<7X\u001a\\/#*VR2Cèˍ\u0005\u001c\u0016K\u0006\u000e4aO,\u001aa#kou\u0004=g<]ܞc;{\u0007bkR.^7?-efun9ٱU1Z7\u0017/k\u001a?EvM\u0007k=LI=\u0006vO\u0015\u000eoHƥ\f\u0005`ͤh3M\u001a=3x4/r\u000e(r>NG~ͯ\u0015\u0011\u001c`zisDzJzsFc\u0003zk\u0016\u0014wZk\u001bvTS/UFYEK0?_}w<\u0017[ߐ4P\u0002xlE0yRlp?~M\fU)*D<vTk6ac݌\u0002fi9A\u001a\u0019j\u0011笁yZI*o\nQMv1\fg%7!UoE)IT\u0006\u0015+]s\b\u0010\nr[~\u001b1Q\f\u0012ϖS\u000bAML\u0016wZ.|\u000fnr\u001aj3\u001bs\nA\u0006\u00022;\u0019˗p'v%^\"'\u001a,\u001bi\fa\u0014\u001fo\u0000`f\"5\u0019P\u0000\u0011f\u0001S\bf78PNd\nٓ~ycM\u0003uiW}/\u001b\u0003-SyjV}S\u0015+\u0017ޝy:719\u0015am15k5'7ar3B\nм%%V\t?X/\r\u0012q\u000792z9\u001b?TsH_h<\u00009]Nڭwa~},nKUJ\u0002͊7Y\u0015GJ\u000b\fdҖc?\u0005p\u000b_ߝ\u000b]OG6\u000121O\b\u001f\u000fS~<\u001c\u0019\t˿\u0002`@x2h]Xvˡs*Z޾y+LQS7\u000fҜ)yox6ߗե\"rUsRmť%=\n\u0003_\u001bM0i,9~lynh\u001crír\u0014d\u0017\t\u0006w5Aj{dz\u0010'Bh̍\u0019ډ\r'7g\u0007#F9L9gicqa.zlԌ\u001ad%c\"\u0015CiFeaW4G\u0019|E(1mOK{\u000bqP`\u0017Rm>\u0017-\u00185\u001bno$EzѧTF./;x\\\u001e+j\u000bv\u001afz{iS;+Exu\"\u0013IFg~\u0019\u0002\u0016\u0018\u0010qy|$w`ZzYx*\n~m\u001fΞ-Bۜ7\u0018~``N\r\u0000#OJݮW/.ԫI\u001d|u\u001bԥ.6uw++t*-\u000bbYkX\"\u0005l4<Saۗ5\u001bjhk\u0001:\u0007h&%h\u0003\u0011\u001fo\u0000[/+sW8?B~`$JZ/˶ĳ!іVDѝZ`\u0010r5\u0003=\u0001<ZTr\u001f?u05ʠ\u0015+W=a\u0006{&+&+\bWt@s\"\u0019ѾW/E7\u0019)ce&\u00106%aiɵz\u000ee\u0007+:t~Ӫ+&ڕФx8Nw0q./}?>Ru36\u0007p*\u000eFڒ^TMjew\u0015\u0005\rRKt\u001bE6X6֭I7]uc4\r/&MB,\u0005ڔ\u0000\u0019XsrN=w|!\u0019\tGij\u0007{Ny75ήI\u001f$\u0018b\u00069\u0013\u001a-o\u0017.ٙq9id$?tV\u0019wV{V|Ktߐ\u0006\\Gn\u001f&\u0005zwܯ ,6\u0000.\r~\u0016/FKm=X\u000e+qUt\u001a'eF\u0019+\u001e-f;ܳ7_\\}yNmU)#:58sL\u0003ٷNnTjAo٦D\rN\u0000\u0003N|,>YfLn\u001c;\u000bλ=83ࢬ5e\u0019Jc\u0018\u00198j\u0017{K\u001a|$n!,t\u0006hʨAt9kQ&\u001ff^U\u0002;ed\u0013/\n\u0019\u001cU@gY=\u0004W\u001b\u0007|\u00014+֗Q\u00143\u001ct.|5&#\u001da7\fN\u000exi4]g>l\u0016\u000bLJ3\"+!$+]$+ƸY#1oߐ\u001e%T+(ٵll޺z?\u0012%*sMpmܼК\u0005~\u000eҿTO-\u001cz\\do\r*^:Bvjh_\u00154EH\u0000yy`uz1ը=[oY7n=߰۬7M\u0019ڿ\r\u001a>iyV18qs4s@\u001c^KEhkIoQ<13nryKʫ$Ov\u0017g>>\u001b͑\u001bfŲ.m8\tޙ*<ݧG\u0015n*\\߰;؈E7{Tr/w`vSO5ԧOp\nJ\u00142t5r%\u001brAh,R\u000fgT3k=TwQEa^Lf9\u001fM\u000e8\u001a2\u0016][\u00197,78goz}\u0011\\\u00128?*NU(w]QCQu\u000ei](֔qTz}:Uj\u0003VYWuV!BoQ.$ў]8o\n\u0011z\u0016\u0000Gu%oL|̈ػlrkqэ;\u001b\u0016XS}\u000bϽN\t!HlChl/G㡴BԺсwo\rܐ*ꝈPjT*z&U-a,h#7&^.6\u001c]\u0004b詸϶8\u001aq{c,\r5P.*MüSN\u0005'Ul'+v\u000eɆk6gՠX9֩,4nI\nM,;9?\u001c]:D)b\u0002\n\f4\b\u001bS\u0006u\t\u0015W\u0012XF*x\u0013F\u001e\nn\u0007i\u001eU\u0019\r \u0015\u0000\u0011O菃\u0012Z}h\u0000\u001b\\\u0002\u0002P\u0000P^ɂlx+났1dj\t-ȎC\u0015d)`\u0007\u0012\u0013?\u000eҍtLKe\u001ed{k}({t8_R\\\u0003ȺD*\u0003n\u0003(\u0000\t\u001a\u001e\r\u0007M\u001f\u0001I>dLA6tV\u000b=6\u0002\u000b+\u0002OT\u0012\u001c(]\u0004ud7Wz]^&w\u0017ɸ,LӖs\u000f@/\u00034N\u00132-.' \u0019\u0007\r\u0000\u0001\u001d\t`\f\u0000W·\u0000\u001cE\u0000\reRaoȝ\u0013lo\u0003_b\u0000!\u0010O&\u0018onf\u0003v$jS7[(/{F5nOG\u0001@]\u0002`Ot֏H>\r.+@k\u0007ԃ\u0013\u0000\u001e\t$G\u0016@X\u0006[^%\u001c\u0001dn1҃\u0018]\u001efߜ\u001f\u0011oB#*/\nK\u000bc\u0005o\u0006qſuy{zMq\u000fV\u0013\u0006@6@\u0010 NG\u0006o\u0000Fg\b\u0018 M)\u000f\u0010\u0019G\u0018Sw|3\u0016Yb/rkG\u0019zR+u87SgN63\u0001G\u001d.{G:1n~\u0014!&Ri\u000b \u001fx\u0004Б\u0019-r+@k2\u000f:\u0012*I^T\u0015a\fϞ1f\u0004/\u000bexK[5~&Y=\b~\fn^i@OoS|_\u001el:?ytn\u001fGw,ls\n\u0000O\n@\u001a:@\u001ev\u001a/(\f\u000e46\u0010\u001e\u0013~0\u0014޹l\u0014=.\u001b#\"f\u0001j\u001eީnRΗV*Wl\\}_i-{~޹U\u000b\u0007ɧQC'.O\bG\u001cs5\u000f<n\u000fd\u001f$2Hݤ/w@\u0017`EcQ\u0007Yǹ~\u0014,~<\rOz\n\u001fڞw7qMv`/$\u001e\tVdb.bo>vy>!x#.:\u001eV55Lweqm\u000fo\u0002V\u0001-\u001a\u0000}Uz\u00003)\u0011;>R>cz4}_\u001f/|6K\u0017r\u0015\u001f9Gn\u000eN\u0010\u000fő¶kSsh\u000eZ5tn\u0007\r<\r\u0016\u0001 \nd\u00061Y'D\u001fWi>^?=a8\u0014\rJY\u001bF9\rP\u0015ۻ^H\u0006v\u001d\u0019eUǪbv-uݾu{.\u001bʂ\u0011Q+\bӕͪh̗⻪-+\\5<\u000eQ~\u0003@N\n@O\u0012`\u0000<1\u0000Qv0_U\u001f=?P8\f\u001b\u001c\u0013tpߋ ȷ\u001b^\u001af\u0002\u0011*6aG`}\u001a5٪\u0000Rj{Q\u0003,kow\u0011]des-\u0006b\u0007\u0002*&\u0015?&\u0013n&\u0001\u001eŷ\u0003sSxi9t櫩ڱcrwB30\u000eWw3\u0012XlSjZԗ31\u001e#\rT֟\u00137|\u0011km}8\u001a-K@5\u0015RH#LaW)`=\u000fԒ\u0001.iĤ,E-JW6קC\u001d\u0005`u:bMh|w7/(ZN\u0015T\u000fs.4\u0010 mW\u0019ug\u0005e5\u0005{O4<\u0019)\tWg*tv7\u0014\u0000>\u0014={yB4\u000e`DgO7\u0002yU\\®ZP=B!,kø^xVR\u000emQ9`b}d<ߞRfv#=lR~KNj<-\u0013/b\u001b~\\ou}. 2\u0017\fYT\u000b%BEP4ʇ;;řC6\\IA2\u0002`\u000eZj_\u00196x+ΝS\r/;<q'-B\u0017Q0\u0011[.OWE4eH¶Y\u000fGb\u001f\u0000\fz\u0001]/6ҵP-\u0017wF~3d'sim`;4\u0017\u0006\u0014me`kfpTv\u0015\"j<\rf^\bIAm\u0017V?\u0002%|!\u0013@Ov=A!=Ab#I\u001ch)MVW\u0000\u0004T٦WO\u0010vvYV=\u0004..YuQtgH\u0000߂\u0001ň AE\"\bD`\fF?pgz\\u]nKBծ\r=͚m\u0002qӇuVp9=`탪l\u001f\tJX\u000fyRF׭7yDVb\u0005OFj\u001ax\u001b\\b1#\u0013\r3\u0006q=!ݗ\n_]fۻip6|\u0017Vv^50>e.;s\u000fl*&]\u001dv_L\u000fRm5?;'y7Z_c&=\u0003\u0003^\u0013*.wh,i^z@\u0017é\u000e1*$\u000e\u000fTB/0\u001fr\b\u0005j\u0017qr!u^P.](r\"͘_e/꛸>\u001eώ\rW3ܝ\u0007)Wzw}\n;$tR'\r5 ;0\u000bڈ{\r&7F'nV\u0019TS.\u0012D\\\u0006C/}\u001ek'\u0001lUT෷v3\u000e9P\u0011kq01\n(<1tH߆C{X ,TPx\u0018\u0011}p\r]hl6u6W\u0007)\\qK9\u0010d>O}BC( QdWM\u001aRo{\u000f\u001a>\u001an\u0003jӖ\u000e\\UC,)Z_\u00012\u001b\u000f\u0010\u00135\u0019\u0003^p{9U\\ˮd2K0\u000b1FP\u001f\u000fIy>/7ިk<\u0002=^\u0012\rVҷ.5*G\u001b@XTâk\n\u0007`\u001cn`3O̠hhyDRN}Bjy9렔3|fak`z|Ig'XŞu.*\u0003p4K\r}v\b9w\u0019\u000bWQ\u000b*!\u000f0Xs\u001b?2k\u0010\u0002\u001c&}z)Q\u0013\u0002ʇ޹55K;k|\u0018kD^?et\bGez3[£9hf5ܓ\t\u000e۫z3\u0012{>$nKS\u0007<6A\u001c=2f,X|\\{.v-輭rN\u001fin{!\u001a\"\"/5޴+E}\u0003EɃv\u0004_/DRmdu6b}񨍴\u0006\u001f\n\u001c=\u0000hpĮӄ\u0019I\u0011uxM<&N}\u0003X\f&h\"\u0010jaA8&\u0001Ωo\u001boKl\u0013k吃\u0006Y*oyI\bϗ?v7yR*wHς^UT[\u001c\u001bH&h>YZ:xBŏ&T{dWE!u\"\u001atzH\u0002!r\u0012W+\u0007\u001e;<\u0006sL'&\r\ri\u000e\u001e:rq\u001cGi^5\u0001t-\u0017k+ b[\u0001\u001d\u0005\u0017\u000e/\t Z\u0001O>rXu)lcsx<\u001ewɋNԊӹ\u001e.>\u0006/DJXsqo94;tBo\u00039j#3H\u0018-=ݹa^.&8\u001dȬ̇\u00177g[jGc(L\u0001z\"\u0005u\u0010t:%ד\u0001GtF\u000f6d`hdޯ<J\u00162\u0014\u0006vzS:nkYi%\u0003k9L/YJ^x1+i4v\u001fY\fBbWC\b\u001e6;s-jG {M*\r\\P\u001cS0վ\r(\u0006JVAlW\u0015\u001be{_2Ux%_{0\u0018\"\u0012\f&usFiM'S\u001f\u0016-\u001aZA\u001f5wJx_}n\u0014.\u0018\t޻uWn\u0012ʓ9a~C_\u000f]\f#N|o\u0015\u0010\u001e*Jswf\rin\u001aS\u001cZ%ZDrjM?Z{w)z\u000bV\u0007\u000b'\u0006\u0001֢\u0011B_\r\r\u000e2\u0011<#L\u0003z\u001a\u0001:\u0017\u000bZTvbk|Z`E\u0000a\u0018V^ِ\u0002Vօn\u001d\\M8bծJܝJ\u001eo%\u0010S\u0007Yl/ʃ\u0007T\"|%V\u001f\u000b\u000bk\u0013e#=lt?Y!jg>$Dh\r\u001a\r\fݴ]\u001a͏\u0010֧\u0019j\u000bO%>b\n\u0010ֲMye\"2&Ҩ3޳$p|ӦO9EeԮ\u0014ኆ\u0015ja\u0002?Lf\u0012\u0019W7\\\u0018DwLA;\u001a\u0003\u000fk֤֞~uDv[VE!\u0001r9|tZ.:\u001dw\u00038r(S`ސ^=-Y\"쬺\u001bHh^R\u001f\u001f\\TNr\u0017Jr^t+\u0019<\u001b6ɱIk\f\u0004x\u0004\u0002\u0004XK\t0R^&\u00014O\u0000R\f=e?O\u0012@7-M1H\t o\b{\u001bZ2%jvx0K\u0010cR\u001a %I\u001e\u0012[)K2\u0003a;tIw$'%$GI\u0003'\u0003v\u0002$S\u0000쭔\u0000\u0011M;\u001f&\u0013`7c\u001c8~\u001bS\u001aDfl\u0002YO\u000fINKi`\byU{I~I~46yJ9O[\u001eW\ni+L\u0003crғ\\''nsSaWz{S@\u001aRcm>zL\u001e]{i޶x {Ii|/\rb]\u000e@fiiґ\u0002|\bo3%y\fh$\u001aIyc\u0018s\u001d#{z\\\\LVo{w^u۾N&Sɳ\u0007\u0002>;V\u0005\u0007;֬s[!]\u001a!0w^\u0018?$\u001e\u0004E$\u0005bSO\n\u0006\u0014\u001e3.%$\u0013>O\n4H\n=)\u000bvj\u000b\u000eS)gs\u0001()\u0000h\u000f,zݱ9={Fzla%C>mP4\u001b\u0003\nN\u0006\u000bxS󥝚ӵz__.!8K-)%2)jZ&Ev\"\u0012oAz<H\u001e\u0006^q{e֙T\"(\u000f\" _\u001eު5\rIú{-eLO\u0015p>Vx\u0012a\u0012k(B\u0001\u001dg[\")\u00144T\u0003Q6I1\\w\u0013\u0005\t5\u0005|Б\u001ea<IzzI6.i}\u001cjYQ߹2'\u001d\u001dM:;\u0001w,_;+\u00148%1\b\u000e&\u0019=@|u}\u001f=?I\n^Jo\u0013(C8\u0001'@/\u0001ӯR\u0006y׳+\u0010$Et1ױK\u001aonWw~#p\u000e~;\u0015}v\u001ca[.Ս][\u0017*!\u0012_WԌ\u0002ᛳ:>%ޛ9Á\u001fa+Y\u000e\u0015MJ\u0005]wG%RT\u0018>ֳ\u0015Ӕ;\u00072n\u0002\u000fvqo\t\u0000\\\u001fyu\bJZ2y\u0002f\u0003ۛŭ&o7'}Nq-\u0016(\rv\u001e,v%\r5lUɡ\u0007iq\\Ċo\"4w$\u000bq\u000f8+f<p|\\!G۷lo6~\u000bӦK\u000f\rY\u0006\u00146;[u\u001e83\u0017i2K4e\u0012Ѹ`2mEOo6IY\u0014Gr\u0002vzR+QA\u001b\u000e}s\u001ber\u0014j=\u001b\u0011\u0001{M0dX֖w+p\u0019 =Jm\u001e\\FΠs}-\u000e94-L;}%}\u001bQ\u000f#K\u0003YV|\u0012$\u0017\u0005XTư;(k)#\u0014wU(\u0001WN3)\u0019(>%,iv||R|[ZC謢u.\u001boYY3,vt=?L\u001dVwi돦\u0011ބ=\u0018%m\b6h]צ#DL+J':?ioR]DIc߽\u0007v?\u0012jkd_lq[ء\b86?o,>ٛ\b\f\u0007t\u001fF\u0000  Vjt@:\u0001yn̉%\u0013X+-Jw\bEi0Ɖ(ׯ][1\u0001._imx>ӱ^$\u001chb#5f3\u001aYqІ \nR479\u001bFU\tgv[A--8Fk^\u001b9'7,ͦ-,_{|?\rUOh%gDe!*ԮG3r~`*YuF޵=WD&\u001b@7[Ɣ\ft4tX\u00117\\\u001d'/rS3f\u0000һ\u0006Ɵ\u0012\u001d\u0005e<@O\u001e./..\u000bv\u0006/ل^$͖\u001eh^ER~\u001eȋVnywv\u000e|yQ?۰}\u0014\b#Y3\bA\u0007w\u0017y'UM\u000f=Qg_O[vl)4\u0017圼X4w0KP^Q\u0017@USxd\u0014\u001f\u001f#ӰjtD{Ϧ.yfp/\u001d3|T\\\u001cUq5\u001bۆc{zi\u001eLǖ*p\u0005(͐ml1\u0016r娽H\u0004Q+@nyT\b/\u001do6l6\\7I|leE/Ij}N7{\u000bV\t|ޜqEL7{'`\\\u00008*f\u0011}8ndkSdTʍ\u0014\u0010Kr'n\u001e(Qָ]\u0011K;\u0001\u0003Q|3i\u001a܆Cf`_ \u001dS\u00030*\u000e\u0013h\u0015\\fmRJ!vN\u0000Z{]6.қE\u0013.\u0003'\u000eKFe\u001b-Y\u0014\u00079)\f\u0014q݇\ra~-F9\"WλS\u0003c)p$jr\u001dc\u0017.<\u001bfFHJ~sﭘ˶Qܥyn\u0007rwT\u001eq4$vMU\u0000Ui#}7z\f^\u001c,T9@l\u0018Mp\u000f&{\u0012\"6qd\u0005,0d\nNWt=\u001b1\u000571\u00053Midx\"xVGP\u0012\nu̎|v.4W̬6\u001a8\u001bN\u0007b|C\b=\u0015%\u0004I\u001dVAU<\u0019b\u0005\u001c\u0010\u001fc?6esZ\u0014vL\u000f|\u001f\u0000s_rBkӯ\u000eV߾0Ck)~-7,&Gۃy?\u0002{eo%0j\u001b+\u000elᤆ뭼\u0004 \u0003\u0014V\u001d'D\u0018Jgsm\u00076ܢ%,}j\u0018n)\u0003d\u0013\u0001{\u000fCCJSE\u0000J3j?guR'ߍ{gLɛ\u0019\\c-Sk'\u000bU\u000b̝2\u000bHϸ\\Fnn\u000f\t@qw\u0018pD\u0013u;w?>?/>7V=\u0015cб۱-#\u001cc\tԱ\u0007Z\u0000\u001fW\teEօ\u0007>s􍬭><r461&VcI`s\u00125\u0004<Fd\\{'lgʺp[.ыUλX\u000fX\\\u0010ş\u0011By\u0010U\"|T/\u000e\u0014md'Mk~8^Z+NwQ\u000bsUu#cq|k\u0016S\"cΓ+Ev\u0000k\fQ\u0016zJz~[>ִ\u0013S\u0019%&@s\"$8\u0007mJP`\u0010cPĂ%Z\u0002^a2kgwd3on̢61u\n5[^\u001d:H\u0005N{v8\u0018\u0001~kWB]kKa:mA\u0007Xe`6\fb?a\u0007܌Qk+n=\u0001\nz[Q\u001blpਊ^cu/硩\u0006V_i\u0002p0\u0015DG\u0011w3s8\u001bߊW\u0019Dae#klۃJՆ-ri\tb \u0004\u0004GxM\u0013h{4Z\u001f(\u0006Uc? cٻ\"Dl\u0010zޣEe5.Σ +\u001eE'PwR\u001f\u0015/a_\u00078,\n:xKs)43YBObdr>.Cxj\u0018VtӢ;2PL~\u001du^!jQް\u0002\u0010!>`f\u001a}B[\u000b\u0017ճF\u0001UK\u0015\u001cQۃTq\b\\n5\u0002B@z\f֚Ԇ%N\u0011\u0003%\u000b\u00022\u001f\u001e+H\u000fʡ-ht[Ww\b/׎\u0006k\u0011L!\u000bpƯFmՏ.sHQ^٣(Mߨ}IA\u001e\u0010q\"g\u0002#\u000f7>UzÐq˳{Z+\u000bx\u000bvp6F6mV\u0006|P6G[WE#\u001a\u001aU\u0013+EU\"?\u0003+!U\\\"\u0003x7\u000f~nS˅\u0013\u0015'\"U4U{1釅G\u00017ĘDɾ7i7\u00126\u0002i4\u001a\u0016'1E#Pkaa\u0006*Y|*s[>Z\u0013\u001eY^nd\f\"l\f]\u0002e\u000f\u0012$y&A1\u0019+!\u0007yŗO\u000f\u0017B뢛sC5Nό\u0011]Z\u000fY\u0014\u001cV}r)u*ڴBfS\u0015u!u[Wm[\u0006Ciy^K\u0007|c\u001a\u0014O+\u0014,*qpy\u0002Z}ۉ\u0012\u001drϨ\u001dl}^Fua6[kE>3WH=F\u0007XNn\u0006oy$7\u0013\rWf%6J}S\u0012|\u0019|\u0012\u0014;\"8frjQa,/Pnfv,x][:.=\u0001O)\u0018>r&\u0000\u0018)\u0002H\u0012\u0001S\u0000\nM\u0002$ȥ-t\u0000\u001b\u0000f?F8\u0006\u0017;\u001au\u001d\u000bC\u0012j)eL)g*\t\u001798}\u00077,f)U\u001dҷ)bi-\"\u0006m\u001ah'$\u0000+j\n\\mUH_>\t\u0004X\\\u0002LJ\u0002\u0004m߷\u0001\n{B)f+܉\u0002)#%eaܜDv)z\u0014k]}\u001bJ\tğvz\u001e\u0010Pod\u001epD~̿/ҰO\u0013W@ӷ\u00194T\u000fk$9Cc\u000b\u001ai\u0002\f'\u0002x$2\u0004H*\t \u0014z)AW\u00079*~\u0013\u0017d|[=>7]\u001b<*\u0018x)v\u000f\u0015vG/WfB\u000bL\u001ahV~Ir\u0019\u0004i~n@G$[)޻+-!%#eSAU*EԬv\u0019\u00125BS\u001a\u001fg~W\u001fKzLTԻyKS/eEaRW?0WV\u0007k}/4'ɷ\u0014\u0015\u0004I\u0016\u001f\u0000\u0012tjR_\u001c$/uzy\\K\u001e\u00177(>ZϠz7zo'\u001fs\u001bqnѼӝ\u001fg8\u000bݾ\u000es' ln\u001cXIFJ\u0007\u001b%\u000fW'%($\r\u0004\u0014T{$\u0010)YZ\n4::\u001fauuÍ?h%׈\u000ba+U\u0005j]A\u0016.bwx$+;{L8\nzj\u000eQ\r\u00036+nVw\u0001ѻ\u001a]U;-n\u0016?\u0013bI\nUHb=)\nZV-\u001d\u000eۙ\bx{,5b\u000e\u000b& p><_ǩ\u001enWxuuoK>\u001cė5\u001e,԰\u001d\u0000]8A\u0019m*Ja]l\u0015ty=\u0003rܑ%\n\u001fZ?$w5\r\u001c~\"\u001a\nfRL;8:>gGMʟ-E>F~ |Evِ#ם-kvMOے-\u0003]g^T4\u001e?t+a:]\u001d:\u0016:n\u0005#ܢ\u000fEl7O\u000f\t\u0013?k~+*tt'\u0004\u0011Fn\t؜KE\rV-V,_\u0013Rf3#s@\\G?Q.\n\u000eۥ}ݙ,̫-1t>k`OR@\u001ab\u0003>|[`\u0000=x\u0005\u0003/ۭ\u001eNfWj\\\u0013;w]غqrؐJ(O'pfǆΤK\u0017\u0014-?[:%#\u001df)UnT0\u0018!)\u0002ZڛG>ayl\u001b_&`Kf\u0010\u0005l+._^N\u0015/u=\u0011\u0017\u001d.N\u0016}Y}ka3k2VgNdE\u0013[XmY0-X70P?ϻM[\u0006aQ{YXX!6ͿGp:uOg\u001fD\u00107{VJ^slnT=A#,*\u0019;}\u0014\u001b7L\u000bK\u000bnF,w}\u0002\u0007\u0010d\u001fdf\n9]\u0015E9m`r\u0012R\u0016827\u001b\u001b&/z?t\u0017MlW\u0000{lWf7\u0004vx\br~m@Y\u000e7՞ebG֜Kpr\u0000H\u000bh\u0006Ro3\u001d8oaw^\u0018&Ϩ\\}GA\u000b$.lf,K/\u0019\u001f\u001fޏ\u0011\\M{=\u001cG\u000el\u0006]_vҏ]F\"yy#\u001emQ7\r'{DQm~n|UpkuwN`{Uw-aIh\u0015t\u00171eӫ1.>Y.\t%)ƻqꇋ4\u000f{\u0012\u001dz+ϗO\u0012t<8m\\My7b0%DN\u0003dOǺMΟώ*ú%\u0013Uؗ`e?vFlMZnN,l̦\u001eX!9<a؞߄!\u0006\u0002'\tؼ\"?]NQ\u0013\u0004\u001c6'lXa\u000bٺ#~1<0k\u001ems`cZC\u0016,H%r\u000bC=:z.n+_a8Ea2r(^gŮ)'emY\"\u0010I|xˇT#x5ՙ\u0017Aa1C-`guCh0m\u001d0]Vʌ1YJU|zLHz\"8k7Nx. \u0012[ \u001aWAd<σ\u00141\u0019/v_wfR\u0005\u000fw\u000bCT2\u000bGkzk\u0013Xkgd\u001eӺ\u0014|'\u0018T.\\c\u001a{#\u0013\u0017W\u0004\u0013H\u001b1*\u0017uIW!2h\u001d\u0006Ͷ4J\u001cIF\u0018\u001bS6.O\u000f\u001cC\u0014$MT/\rfq\f8]'2dC|'&\u00041>塧$\u0013\u0005yi*cf;k%m\u000b\u0015J\u000fåh4Ds \u0005gю]\u0010\u001b6\u0011~\fDw\u001e)\u001a`OkH褗\u000e7\u0011\u000bϟǶS\u001dR@\u000f>\u0013}-.GDuV\b~JNM\u001f\u0014v>[\u001d\u001dm`$~Gj`V<7\u0003\u0013\u0001,\u0005) +=0\u0000]jpp\u001bW6\u00046)ʍ.w뇨Į\u001e\u0019n7}_bvSmw?s\u0015+M^1F\u001e\u001fsSEJ!y(36.>N ¨q!*|+G'hs~**)\u00169.}9/:̎IVmW6뽳w\u000f&GIIU~/2۬s$8՗gO\u001a =\u001fL\u001c6\u0018hMMӑ:߈[z\u0011j[_Y\u0016\u0018ri@*Z\u0017\bKs*p\u0014<\u0013\"BjnOmn$Z^\u0007yt\u0017ﶷWc}qV\u000ez+\\fs5Rl\u0002\u001cU\u0004Lͼx]Z(.Gg>\u0006/p#\u001e\n3&=\u001e?&\u001e07\u0011ky)rA<͟\u0002Bd/t\u0005\u0000_}$\u0007á\u0000\u0006\u001akT}&]\u001eԳ<Q\u0011\u001e((*\u001f5)gh\u001e\u0007)]X\u0014>nwe/\u001a5aI\u0017nna\\5Cd21\u0004lzC0 \nz>%.\u0005.VN=x\u000b!\u0000nE\fkw\u0013˫-X,L\u001f\b\rJW\u000e\u0004ܑ.9\"\u001fL.ߺg%Ӣ}2ߔ:C]K%G3F\u0000\u00114p$@\b\"z\u0015GeC>CLmi3\u001edUY@OB@\f.>rxY/8F9\u001d.<bv`,\u000e;}aMt\u0014{vnҡxHz^XlId\u0017zCl<\u0010mE<z|\\ЩQ\u0014~c(Z~\u001bxqG=,n]hofj4]\"Y\u001eZh>;R$]p~\u001e/ƚt>Hǆd3\u001fD~\u0010\u00021)hۗ\u001a\u0011cж Jy\\[o8whB)iur6aOG\n\u001d̶Wؙo\u0019#j~iNg1\u0018\u0013SrD8\u0005\u000b~\u0007\u0011\u0007{0\t:\r|_\u001a\u00108Ԏ14&?9\\4?7a@[\t!C\bn-\u000e]#\u0001Fs%4M8y6JN*Rc;<\u001b|\u0014\u001b\f3ɆDo,Ƕ=gʢ\u001b3>`\u0002KQXUyQRGfh9n\u000b/\u0005lP\tթ\u0005և@\\حYnwFwCG\u0000\rVUjfѯRTU\u001a\u0016NU[j\u000bE?]\u0003L2f\u0007Ȗo3¬e$W\u0013W\u0015Bl)\u0017+fX]\u0006^S!SC\u001c\\\tQ5j[ŞWQ\u001e|?N@qa«\r! eR>\u0012(\u0017nvOi]\u0018mK\u0003yૌbk\u001e*7O[pHa\u0007E\u000e&v;*i\u001fF\u001d5d\u0015*/UٷM\u001eB6D,ۙ~\r,w4\\\u00030\u0000+(\\\u0004.^Pا\\='(\\ֹkA\u001d\u0002;\u0005\u0004M\u000f^\b~Po塥b\u000f쩰\"Pf\u001c\"vyR~\u0005`\u0015#9ڀ2'\u0016$%h1\u001f\u0015Ol_**Vl^fva[{>#)r\u001d\u0002(QHq\u0010\"am\u0015Ȟ\u0001\u0003R?t\u0014V\u0017\u0014v\u001cuԽ,\r!G1kԛKVV|iY\u001f0ؓ\u0015u[E\u0010o4ׁ\u0011\n\u0010B)r\u0000\nkRK\u001a'Mњi#F\u001a,_i%6\u001d\u001a!Ʒ{\u0002[\u001e\u0014jB!<FY.G~g@j;) tQ\u0014lZ>ӫ6SIގ?\u00140Na̔&/ǛR@\u0001Ԟ\u001b'\u0001q\u001a'AKM$R\u0016ۏ񷆉)tϹqH)O\u0007?V-mDʡ\u001f\u0000\u001fSXit9\u0011ՋnOIBV+VU=\u0007\u0004\u000bI\u0000%F\u00024˪o\tc\tP7^;./\f9eR1\u001f{\u0016\u0014jڭ7bop<LxwY*\u001e_o7Q\"E_jճC\u0002<Q!aJ0S!1\b\n\u001c\u0000gw\u0000\u0000|k\u001e3^w\u001ëk\u001buW\u0005cS=\u001d5;O:d\u001ei\\ߧ˨wG\u00075\u001b.LfQGB\u000f\u0005\n^\u0006j5\u001d=*X9WK40,\rQ!}ns NPT$݂^3>{S(/vg/\u001ek#p\u001fF4hn\u000baU~\f\u000b]Yֻ\u0016<\u00192nР\u0017x;hz7Wy0xB0[,\nAH\u0003P?%wQ\u0017?YZ\u001aīއz<T\u0007\u001a\u001eS6\u00164t,Z\\\u000b__A{?W$Bc?\u000ez1D\u000f>-\u0011\u0011x.%$lT)\u000e0\u0016\u001d@m_|Y\r0!L\n\u0004.\\FZw\u001c5ЈB:u*0\u0017h\u0019N'j\u001c\u001f0OXp\u0019]!\bz0+}1m3.C=Mey\\\rDYjfȿY$^\u001fz\u001f\u0010i5N\ny\u0017շxBXp\u001d|\u0010\u0011ݿѽq;\u0001eDq;9u֦R6ӆ;`\u000fWO}/т/c2;9Z8o\u0014\nb0lŋRc}^Fy\u0002$)RA-\\AЭǨ=\u0018cv<TٖSDぱB/و:%ѽ\u0019LDS\u001d\u0005..\u000eUue[\f\u000e|ׄ4I9rgO@f[e#ii\u0015ai(?B=\n¡q=\u000ewr7f\u0017\u0016ϕQg\u001e~6-/ϵ,ue/#N\b{p]pw4p$-0nRvy.x3iρv[5mwjZi곡z\u001d..NhDz__%\u0014\u0011z+:;+&}x2K+jlgj_/S_N9+\u0005-6\"<\u000f\u000f|vt7YV\u000b޶T![Il-ϘWܝa7Wy|܈i\n.\u001brhM}\u0006B)\bU\\H\n^z+NGZւB\rTP\u001d\n\\F+]\u0017Kǅ̚\u0011\u000fȉlZ\u0003a&i]c~y\u0017\t:=~\u001a7ZӍ{P{Pa19\u0006D\u0016r9ϧ:o\u00157f\\\u001b$q#Kfm\u0013\u0015/O&.{%t\u000f\u001dctS\u001cF\n{u$w-\\\u000fBh8ٙ\u0019F66\u0012ռ\u0006߷Q[\u0003ϝtTYuO=qrIT2~g\u001f%r\u001ccE$w\u001a/s'K,6g?s\u0002(ku+y){h?d!b6Z\u001bɝnsy7\u0000Ou\u000f-Lwx\u001eJaC\u0004&2:lXz^|]@;w\u0018\u000e\u0002D\u0006*bNe^j_\u0007autO\u0019\u001fïz5*ۻHNדt\u001d.\u0010\u001fq>P\"\u001eݽ\u00046ײ,ǴZ~&ݬ\u0010R+\u000bIK7v\u0016?\u0006D,\fsa\u000e]޹FjiTIR\u0001mv)\b%\u001bوrt\u001d1j#k[U@u\u0015\u0007cϵg7\"jvY[CUW\u0017r[ksɵU8i9ҶLLe\u001eqxi{!ɮ#HwxTyuY\u000eZ:\u0010~vA8VM3\u001f\u001eX\u0007;\\C`\u0019\u0013\\_\u0016OՏ!Xt9gΏ_5zqD+ٴ4hUv\u0013\\\u0011Is\u001e1'X\u00106Z\u001f\u00050\u0002O\r㇓\r\"\u0006mqm\u0011\b\b]\u001eǙh\u001bd~-gpҪ\u001bFj@G!&fַo\u000fOA\u001bbCUB٣lW{ye#q\u001eE%%\u0002TG\u0012R9\u0010\u001e\\3Щڀ{\u0011o~\u0011k|w̸\u000e3.9Q)\u001fl9\u0010y)\u0004\u000e+lOXE{8?UzFy`F6\u001b\u0003\\'\u0013T\u001cٲ=\t(޷ʘDƵWJPn8\u0005F<\u001bܳ$\u0018f\u000flo\u0012Kl&_w47Yh\u0010!4v%&.\t^:%Hfq$5_\u0019\u000eL>\tp\u001eޝl]+}Ey6\r)S8:+2\u0013\u000e\r!\\|\u000ew\u0012mk,{mi=z%\u0004\u001a<=\\P{QSzB\u001bE1vM9`C_.\u0007\u0006e2*_c\ffڻM\u0017V/\u0003\u0003D!uGZ!?^\u0002{Fǂ\u0013\r5\u001d\u0007s纍M:Q1aNT][h=x{B\u0010a+!$z0yI\u0013(Zf![:w3K[F\u0011łDxgFGX0yL8Ǫ2d=IopK'r*2M1^K\u0018pT<!|\u0016Ew\u000evb:m\u001fPXFE\tc\u0003D_-)O<\"d<4)^\u001e\rOQbaEy3\b-h\u001fڄPMS!\u0003w\u0014ֱ\u0014CcE!{!%t\"h\u0011tg\u0010tm\u0010trD-\bb]\u000e\rϜ#t\rQ95Z^t-a<K4Wns3\u001c \u0012[.\rzGXNk\n\u0005OW\u0017W\\\u000e;\u0015rqQ\u0014Q(\u0012>`W3lb#\u0011ҰQMQ^[Qj˅oBqfd{b[=\u0012&?^WMdx\u000f\u0012lO [$\r;p'Uju4mNX\u0012&^\u0006]JGD/\u0000C'<F'y\u0007(\u0014\f\u001c\u000f\u0013s\u0015\u000bw\u001b1UJ(c\u0018}\bNڃ9FWhQ\u0001Z@]b\u001e.];\u0015;uJ~xFҧX\u001e߶W\u001c'&^+\tk蕠0\u0014I\u000fv~;i'\\ٲb\u000bmY0in\",Z,\u0012Cx\reBp\u0018?.\u0007(clr\tVc8ߡ\t@\u0016F\u001aD\f\u000e;(Y\u0015\u001a\u001f\u001d\u0011l\r\u001d*E,6|\u001fP\rF݈\u0013\u0004WJYӂ\u0013ϠauR``CMM2o4$5\u000bn,pw8{ٶݱFԶ0\u001fg4\u000e\u000fFj\u001c83\u0011:\u0005\u001fx[n\u0000ӥ<f-\u0014!>,z\u0007Ψ5\u0017CիfE`;:¹Y\u0003\u0006?\u001c gh<9_Sά5\u0016\u001c5Mdzl\"ҝ\u0015~^o?F\u0002\u0016;׬9Y\u0013\u0017v\u0006RM\u001a<y\u0010\rU-\u0007߫R+TUC^̀yn_NP̫\\9QgF9\u0016)a\tX\u000ek\rcߦ*/e\u0010~>.D]\u0004D%(?紟Ua\u000euWЫOO9\u001b˹pڷ[h2{|Z\u0012X{/ͫ\u001b\tV\t/a\u0006Jq/6qu\u0013\u0017k'\u001d/}XbmrX^Uז\u0012\u001fSq<yn1u#tJ\r%UF\u001e.hl\\o@d2M/඲\u0002\u0016\u000f1T\u001c?<XD<\u0004\u0002\u001cZz^\u001f}\u0001\u0011\u000b\u0004D\"Kw\u0003A\u0001\u001a6\u000fmXJ4\u0001/\u0013+鏋Ù\u0019\u0011\u001f=D5\u0017\u0007kG&\u000bz{Ž?2F\u0014TT{\\fD\r\u00145\u0006XʂغeUaǂ9D\u0004\nJ0\t7V?\u0017:f\u0016\u001aHF\u0000DU@+\u001a\u0007 p\u0000A\u001c\u00181׌\b\u0010d\u001f_݊7\u000fA\u0001K\u0013Ttyf\t\u000b\u0018\u0000<4䵭}Y\t\u0001l\u000f\u0002d2&\r\u0015}M_\u0016\u0019q\u0001d\u000ffc#\u000b\n\u0000$dlo\u00005\u000b\u0019LC\u000e\f,H>\u0013\u000e$I%VOR$He3b%IǽEt\u0011T\u0019p\u0014\u0005dLKm\u0019v\u000eh$Na7I\u0000~\u0015\u0011oQG}G]c\u0019?$\u001f[B,T\u000fP$]wM]>y7K]\u001caIz^eq^\f&n:$}\f+\u0012G\u0013qm\\E0,9\u0011x}\u0017<Û\"RHb\u0001\u0018&o\u0018\u001e^en\u00135\u0018myɂ\u001efګsvϯS\u0017~J/2je'~v\u0017ȼm)<|֕֊>2ӾKg\u00197Ԑ-PGwyI\u001eg\n%\u0017!?R\u0000\u0005)\u0014h\u000eW;L\u0001ns\u0011˿_D#\u0014AWOނ̇\u0006ywEӫwM\u0017T\u001c_?3W(LW;w/(O?uF>owukAE`?Y}ӕ/3\\vj\u0011=\u0002_er}\u0013U>\u0005\f/\t\u001c3QGFTv0.}+#tl?4qw\u001eYĢ^zo\u000f\\'*?\u000bP\t\u0014s\u0018\u0000ޓ\u0002<4|ؤ'Hs!uʰ\u001ein\u0019_eV*\u0005(7+ޒ\u000bpsLӧҍ\u001e\u001f+'D>cX+}dծƷIQp*j-H\u0003\u00138k5\u0000\u000e\rħ-Wզڪ=I}m\u0013b,OsNIebq\u0005av'+QM\u0005\f\u0016Q~5\b/H\u0007K\u0014\u001a\u00059(\r|-ܫږ\u0017L\u0019\u001fwO.dͭ\u0013\u000f5v+7[!Y`\u0018}O]X\u0015,ʢ7!?Oׄm-^㛣̚EFKŧ\u0001u^BF\u0011whWK\u001ayMĸCEXǭփzTڏˤ\u001ez:\u001fPr(kL.}gdʟ\u000bIg;?vs7/Re\u0015D)\u0011vPgvt4.ޱ7z\u0005ϭ}z\u0016ۍe\nKb\u001e:C\u0002\u001eٞіj.8}{Y/\u0000ل9*\tf\u001cMc>ۘ}|\u0019744,D=̍^1F-!W\u001fe\bмczNNra\u0018i,̧CQ\"\u0010s\"GΔ\u001cY\u0017ۺL\u0013ЗƓFƼ\btėur_\u001ejk4ar˚ZۀR7`\u001fszʲ3N?L;\u0018\u0011\t\u0013DVńme/F\u001aՕ\u0003F`\bi\u001f\u001f\u0013~k(Xf\u0010Ix~Ğ\u000f''\u000egFSnUe8\rB#7\u001d\u0004WEi\u0010U;\u001fBA竲8Uoj(Z\\\u000ewP\u001e^\u0007}iI;^a9=\u0003~=0͓\"ŻA\u001f\u0014n\u0005e\u0003H\u0003MCsAo\u001a\u00011\u0017^nOerB+äm|%W'\u001d>ƒY\fזZ|\u0016pw\tl\u001fC$d\u001c6\u000eJL&\u0010hv\u000e_c\u0019ga$+?Uu\u0015Y2Vq?\n.WI\u001bn`cA\u001a}Y)\u001e\u000fD\tKP\u001cW$z,,W\u000e$P\n\\4|6{1Mx(w$Bb]J*%e\u0001ʷ\u0016gyEOd&\u001av\u001az-RM#?\rxTm҉A٨/ҬCb\"-,TXBNȏ_1sh8#%\u001dF\u0015, 6\u0018A+C͈f_/\u001f;0Yj\u0003\fX\u001c7˱~\u001e\u0006Ēn\u001d2S+<5F\u0018\u0003k\u001bӜ\\\u0010ŕo\u001d:$a\\&F*< S:f\u0007ȷ\blFErָ\u000bF܄Y\u0000\\$\\]d/\u00067QTx\u0001b˃\nݟEO.ʹTqL2,6\u0001wCFUxK\u001fϦ:$n&#P{)\u0005p#5\u0014qiqI~F\u0015iUSP#\u0015Gz\"LYqk\u0018@3v\u0012c<*\u0017wxq]\u0011-Ur\u0005׼\u001e\u000b^uo\u0017\u0001ea]Ӷ=V\u0003sL47׈,.:LX_x׷gQ\"|\u001b|\u0003$^B\f\u000be%@\u0019\u0013Yh4^ a>\u001f\"d\\/ٿ\u0016S\u000b#Nd\u001fx\u001b׋ކqx]h><&q\n:x!V\u001bTn\u0006Bl\b`05eY>u3\u0017td%Az_]\u0013`M}\u0017EzLцޥh\u0013\u001ee5j}34\tpx)\u0015!+\nSh[8YOZ\u0019\u001az+\u001di\t\u000fb\u000fK%ż\u000e,\u001c]YWgxϠsL\u0013C:\\oa\u0003:\u0014SR퀕\u0006ewUlL\\\u0006孤}QNn\bJĽ/%\u0013Hb\u0012fV\u001a\u0001EHoyFPEsSx\u0011Q=\u0013fRrcakv\rW\u0019a~zQE\u0001\u0007k\u0011\u0012d銄lsI~\u000eDsԈ&҄Bl??}mnx^D3;\bc87yVsg[!\u000egqN(ha8\u0006J8<df<\u0017c\u001e\u0016ZF@i0'\u000fR\u001c\u0001Ⱋ׉\u0016\u0018:*xA\u001fA_˘C^\u0013,WX\u001f\u0011\\͖W9\fZ6k61+H\u0017x\f)<Of;\u0018\u000b\u0011v8\\t\bU*堚#7\fBb1~1\u000f})U\u001fk=t?(vjә\u0005\u0015\u000bS%H$\u001d\u001aipW\u0014>|\u001b1YZ\u0017a~a!lznj\u001d1q宣\u0002,~^\u001aН\u0014]A8#A5e\r#mbb\u001ew!v7\"!~,J\u0017);OG\u0003.޶~ \u0012}\u0010u>\f'a+숊.\f1AN/>2OU\u0011ғ\\\\\u0018b.nâ+Qv3\u0010{u`u8g\u0005\u0014%\u00196#[+F\n[䳨\u001c\u0011*n=\u0013\u0001{~k }C³v\u000fD[Q\u0007kRkp\u001f<\u0003xhKW\u0016m+M\u001dj!OQ\u0019\u0010F\u001cSA~\u0018ԝփl\u001c5\u001a~>\\\u000764\u0017\u001eu\u0004\u0005@s/E])İTQ\u001a! :Z uν}\rY\u001bÚ\u0015/on\u000fUzq/\u0016\\\u001cM\u0017\u0007\u0011{\t]\u0007o˗\u001bHvs.\u0004Qrcnٝ\u0017suP$m+X#P\u0017hD|o\t,\u0012:M\u0013J,9qfu+U\r\u0000\u0005uP\fp@?k۟j̻y.PB9\u001bZ\u00179V^m\u0013\u001d\u0014쪃iۭN|\r;Vy5\u0001\u000766f47w[$\u0013+yo\u0016p\u001dQj\u0001\\ݿHo#2R\u000e\u001dOR\u001dڄ\u001fӕ5ZS]$La(\u001bYܾ9Cg7:/1|s\u0006\u0001~Ѥ|\u0013g\n\u001b\u0013\u00047\u0005E6ʄ׃O;p^7^M:)ZczT\u001bܨ\rUы]\u0002\u0002;q\u0002\u000b\u00001t{,?fhz\u0000t۝\u0019[nDDnQ\u0000wI\u0016w\u00107r/_X⾢'Kg)\u0018\u0003EhV6 >Aʉ\r6\u0010d\t5KfKr.\r{SYKE'b\u0015A,U~\\dsS\u000fcӘkK\u001aJ+\u001eؑZ|P\u0006\nZl`\u0003-\u0005{{\u001aH:h\u000blE\u0013&-{\u000b=\u0015\u0007^w!\u0018#8\u0016\u000b\u0001\u0000V\u001aq\u0016v -&BV1\u0016Q];RIak\u000fXۿ\u0001Ad\u001fИ\u0014\u001c2\u0007\u000168.F՞l\"@;a{_LOK)\n!,nJ`=X㷶.4{s?aCN\u000fd؞{\u0000\u000b\u0000PZ\u0006Ѓ\u0001GJ\u0001Xa$\u0003X=q\u0000\fO\u00006\u000b\u0000Ƽ0\u0000c\n)Yaæ4\u0000-\u0010,\u000fK˿-\u0013\"ا~h\u000eSl3-iTk\u0015.}\u000ee'\u0019E\u001e)Cyų\u0007`\u001a\b\u0005\u0003\u0007J\u0019ޗ6C}\u0002H\u0004pZ}\u000f\u0003\u0010\u0001<\u0006$\u0000x.@\u0000\r *q\t \u0014 r/eN*ە^w\u0000նSQʝK=`Dl7sx\u000bم\u0000X\u0005\u0000\u001e\u0014.\u0000>'_\u0000\u0000\u0000\u001e\u001d\u0006@ *\n\u0010r\u0007\bW7\u00002\u0000Y$oVoSC=%1G^\u001dWXɻYI$$ys$Y:$nI\f\u0007P\u0006N\u0012DeBJx,iz\u0019T@\u0012wU}_x2Cw\u00032=B]Hʫہl\u0007\tnC<8`\u0005YɻQrt\t/I\n?I\u0012k$.Yn\u0016Z\u001cgDYn>\u000b\t4\u0015ٌ^ud\u0003Z\u0015_wP\u000e\u001cV5COB9R\u0017޵އ;\f/)\u000fɇH9Γw;\\/#\f7Hޓ4'>\"\u0019ƷSZ#*L}Ƒ\b\u0018=Q'Nηc/o\u0015o w5\u0005d1\u0005\u0007Ӛ%\u0013A\u0006oj|삝|G3Toӭo\r'osr'$\u000b\u001f;A\u001fqxo`;8\u00179nZ\f37z/\u0001\f*[+:<\u0018as'Z:e\u0013ȎB\u00192+\u0015\u001f6`H>Ii|^i\u0016fd_/CS\u0019Mk9o(UN+\n\u000b\u0001y)>:}ǭR|\u001f\u000e<kPzݔ-\u001f\u0005D=*\u0002BDr+jmQ\u001bC\n0y\n\u0005#\u0005,,NV'{!.8\u000fd\u0007as\u0010oOF}n\u0014WX\u0007WYK\u0010\u000eb`i@?\u001dH[mL7\tmyj^]\\wu\\z2\u001e#oFf\u0001[z\r;\r\"7UͣQ9\u000b\nd\u001fvy\u001a>|\u001aknfi\u0000dGͧkNea\u0014͸F7qI˷S/*pA[_\u00181Xuerny؉5æn\u001fX+͍GF\u000bųIUI\u001f\u000b`(x|\u0017۹۲넛xOK`C\u000bp\rGaueK9tqj\u0016l96D\u000bPJ桲>\u00183\u001b%nxbuUkէV\\P74Z6.=H\u001d\u0007OBFmw\u001f9z#^{&(\\׫Y\u001e.{tV0v0\u0019̣>Gg.\u0010>;\u0014̬9BE\\VGںfl\\͞\u0019\u001evQtL7\u0014\u0011سgnh1:L\u001e\u0006\u0019a[\u001b{/Bz/veF\u0015gl\u0016#\u000b4\u000eu֪'\u000fKU>\u001f\u000b@\u0010+Uql}\u0018X\u001b$\u001c}\u0019\u0013m5\u0010To\u0019R]#%\u001cO+ET+[\u000f'(drM;\\g\r\bĠ{\u0011jN:Z\u0011vh滵1)dfiC1M\u001c\u0019\u0003;N\u0001j=RP7AUeJw\u001at\u001drZ1w#EL\u0000}r$1o\u0000|\"ւX{\br7Ek[ٗ5V؊\u000ehlmӅa\u0001\u0007j\u0017z)\bP\u0016\u001c\u0001b/S=\bL=lYuמ94xii.vRQwure\u001bJ\u0002m:|U90m\b:\u00147??{\u00178\u0005\u001c$q۳6@\u0007<\u001f>B\u0001Qj(%$1z>7\u0016ԭLY5WV\u001aqn=ށ|\u000f2\u001coU\u0003⋅xxk\t*\u000b9y1\u001e9\u0006nʈ\u0011_s#N_?'\u0017\u0018\u0013\b\u0001c\u0006YoWɎh8l\u0005\u00175|Xq]eH\u0004SwG+o|\u001aurg\u001ds{;eH0б\u0016\u0017.\u000bp\u0014(R~,7\u0006_'=>\\\u0017\u0019\u0006R*^ٕ|f\u001b0\\\u001dAwc~C\u000b\u001aֻ\\Yq\u0012=\u0016ThLд\u0016%!J\u000f\u000f\u0015ĩ}\u0014>G\u0017g1:z\\4ш?/|ԩ|J|\u001cus\u001e\u001d!3q_p\u0019\u0003drQ,24\u000b\u001f~%!s\u0004\\cpP1o9s6_B\u0013u\u001c;Mh>m\u0017Q\t\u0015\"=sY\u0013,o+h\u0018|Qm^66܄2[nRen)A?.NؙHcjt{x\u0010:\u0003i\u000fB>K{N\u0006mϮ\u000eu'\u001f\u0003Ȋ:ܯR^|='݇__\u0013\u001dƃ\u0005\u001aP1\u0007Ng>)rG;ZzbGZk+=k0mCR}C\u0000&\u0016pf=oe\u001dի<BqܯjPLXֽ\nEo~*U\u0013\u00175r\u0007 bi\u001e0\u001fq  \u0001\u000e[r\u0003Epc;\u0013dƔ:6Wa\n!w\u0019C\r=\r\"\rJdF\u0006ޕ\fZcP\ndƉ27\u001b-Y?\u001f7gp/?ӫd)t*\u0019\u0004֡@Yp\u001bǘ\u0000\u0016j\f\u00154DYt\u0018+\u0017pI4no`Sڥ@b\u001fpI\u0006rJ\u001db\t\u0018BZ\rA'Gk4\u0013\fk@\u001eC=7`r6a\u000bܷf\u0005x8xM\u001c\u0013IDq\t\fb\u0010d|\u000bÝ\u0001uNr\u000eI\u0013̚\u001dR&PZS(Y\u0003I~\u00115O&~jCʏN\"L 쪡X\u0006=hx;\u0010?\u0011=My2Kw \u0017M\u001bέP)T'\u0012\u0018\\\u001eyB<f4Ƞm&sRw8,1#9jӃ9L\nN\u001c\u0016,\u000b?\u000f^uԺ\u0004;\u0005I#\u001fI\u0010r\u0011(4?\u000b.1\u000eoYԾ\u001b-8%E\u000fJ\u001eH\u0014V:y3y \u0007\fnBg3\b*0B\u001a\u0001Y\u001c1\"~\u001a9\u0017`\u000fy#\u0014!\u00077_ye?dM_(ws?jT\u001f8=``N梮\u001a\u0003PmsC\u001d:ڋ!݅f-}\u000f<\u0019TkV&q\u0002\u001e~r\u0004\u000eSo\u001a371*\nS8^c_;]\u001fq\u001e.ʽR\n\"x1U_~=\u0007\u000e<.؏oJ5?\u001f\u000eb%ι\u001a\u001aóQ.,X\u0000=/;UiIm;z|yiyN}u\u0002\u001ebrA\u001eE\tD!-\u0002H>w\f{۠AF\b׊+b\tΔ\u0019p)[r:SLv3-xGy\u001f?֋.ػkc՚ {\u0016eݐa\u0014\u0002\u001d\u0018\u001bM\u0002a|\u0004\u0019\"R(1>;\u0016H^2ptv\u0005ݫ݉y_tܶ\"׶aY\u001bvݚ\u0003u\u0016\u0006\u0016W-qZ!B>aKo\u0003vS\u001a\u001aNiKeaԬwf\u0014\u000f\u0014t6\u0011\u000e&f\u0014^\u0015W\u0019w;&\u001b\r9\u001e_Q,>\u0015(:ںGv`V[/hapq6S\u001cLǟ:7\u001a9\u001b ^dFf?)֖\u0006Gz\u000eu\bZ\u0002d\u0005_Cv9<\u0019]B&\\Y\u001bU+ɫakq8O+Ik\u001dlRKS^GߛM>|u>\u0017uH\bp,?k5ŪVO6\rsZ9#rn+Sf\fc\u000e'lxhz6Ϥ4\u001c(-\f\u0011\f\u001a\u0013򊽶ھMm\u0013\u001d얭FjF_=v\u000b\u0002`JRʅ^W*Z٩t-\u0002#\u001e2\n![~֥`)\r9%GhHA\u0006KD\u0012\u001db\u0006.i'j0x]P\u0012\u0007\u000f\u001dJ'ea+Gz?rkJ}^jດ; Qѝ)׌]Zd\\p6\r8\u0011ȋ\tB8(/>)\bG#1ül<+.۱dԱ\u001f[h\u0005JXf\u0015\u0003vbЩ\u0011z\u0016\u000bVtz#\u001d\u001eeʋgY+z\u0003w\nV?\u0002\"?Y/\u0016}\nsbS+UߵT[7l\u0000}\u001721\n\f\u0000,\b7\u001f\u0004o\t>п\u0019nF1ӱ\u0004fu4\u001fwME:\nJ[N\u000enD9\u0005o\u0018S\u0006\nX\u001a\\h9mMi\u00002Eg\u0019\u0012@\u0016\u0016@\u0003\u0007\u000f\u0000I<M\u0000\u001c\u0002@;\u0000`\u0000j\u0017KߙY3V\u00014\u0007\u0019Q\n\u0001gx\u000f9\u0017=S+O^b\u0013uB\tΟi.\u0017\u0013z%,\u000e/u\u0006l\u0002ڝv.\u0001\u0001,\u001d\u0000:\u0002\u0018|y\u0001\u0000;M\u0000\u0004}<\t2z\u0002U\u0004p&\u0000\\,i\u0019+\u001f#+gk?Ɠ\u001a\u0002S\u000e\u001f({QZ\u0012Wh\rG8$N\u0010\u0014W\u0003`=cv\u0001,\u0000vcK\u0019}\u0000|\u0000~*4~3\t\u0006\u0010\f$\u0000.\u0000@\u001f\u0001\t\u0016\u0000\u0010 \u0000\tdl67\u0019\r [P>\tK\b*Iʆb{l\f\u0004)H\u0012j\u0010f\u001e\u0010.f\u0019O<I>N\u0012\u001b\\\u0019\u000fVPzE{zCdó|.\u000f\u0003=\u001eܣt\u0017@Ըэ[suu3\rFj\u0015Ɲ)\u000f{Hɻ^$w\u0012$\u0015;7̢\u00195ː\u0019G$!6\n/9\u001c:~\u001e#f݅{jk{tZ< qe_W8/^{AwU'\u000b?\u001bdR\\gy&α\u001fAYe~MvvT&I\u0004\f]h\u0000gqܣ; {\\s%^}rmsg\u00174.ω|sgH\u001fN8S<is\u0000-\u0003e/\u0002u_{8%ߨ$Sx;ɻ\u000f\u0011FD9\".<xk!D\u001aPx\u0016;\u0017\f3Pkҧաǟ\nxdrq}ti\\ӨkOY3Ӆ\u0000oOOo\u001fU|:c9y,Ըe F\u0017\u001dGڐ\u0015]M?_<\u000fZD$xPr\u0018^=\u001d\r蒕\bc|x{N&!\u001bF0_\u0000>lvNڛmGy!N7\u001a|\u0016|\u0006}R~EXO\u000fџkYMryMf9'c٬e\u001b]`\u0017g\u001c\"3X/\u0007\u001c7j~nhm]\u0019o#7[[c7\u00100\u0017=A}5֬]Y\u001d\\\u0005Zg\u0012Y>H[\t$\u0012\u001fe\n\u0019c.\u0005\u0014:\u001caq\u001c\u000fRAXT\u0014ïQ^r\u0011vc\u0017[{\u001b_|\u001b;y\"QU#u'C4>oZ*\u000e\u0010\u0016سY='gGrH\f\u001c\u0016,Jԅ\u000e2Ymg9\u0005SH.Μ68kS'\u0004\u0014I4䦲*ܣ\u0002M\u00176[fժ6wRwq\u001c\u001a\u0001|mG*h\u0017vb#EEtcΫ\u0000$z\u001aEj\r̸\u0017\u0003s? \u000b/Rcy\u001ep~\u0003z6U\u0019\tZgrPhjӯ\u0012(F\\(lωǙVcD\u0019/k\u000f=VL8xv\u0018}\u001f_^-OQ\u001d)Xep\u0001\u0007MajW!s\u0011\u001aaF^a\u0013AkdeZ Nf\"\u0014wnjz4k֊58\u0019ٳ6k:z]x>Qv.I2k\u001aFMsD\u0015r\b>09vk2)>I??)C~<:'^\u001e3na5Gt-\u0013\u001f۞r{.*\u00178h殮@o^\u0017oI\u0007\r霥z\u0016?h\bFJ4\u0007ϊïa\u0014&.\u0016H2tm.CmnUq%\u0011\u0011㻽pêpy:\u001ctFr<5S@^mC-J͔t-5#fH\r҆禕%*(R\u001eU&G0&-\u0007]Zp+D\u0017I.R\u0011[\u001fʂSw\u0005,|\u001cuw<.xhn5q_^D{{Rh~\u0016!\u0002Zukn׃󧻶~f;N^-Њ\u001cF|I|FHLӛϗ8\u0011-\u0004ǈ\\\u0001x1Mͪ\u001f\u000b\u0006\u001fl\"\u001f脯v{nw\u00178j8\u001dtt~|Seu\u000b|_7Y\u0007r=;ѼKW_BTs4\r\u0005&Qְ0£du@ha\u0010wcޚAMw+aD<qNVXGض\u0017\t̕7\u000e!\u001fF\\\u001988\u001cR;N\u0015L*\u000b\u0011%Vo2\u000e\u0013R؝֪hrJX[iI\\DiCX\u001eݱ\u001bq1!F<\u001b0|\u0018\u0004\u000b\u0014Nf\u0016{kS-\u0019]ƞL\u0015iK4\n\u000fy_fsZX48(\u0000?\u0001\u001aM̿}h\u0002ٗ8\u001fgZ\u001bΤc\u000f7҃\u001e\u001eD3z\b\u001b{\u001d\u001c=>f._>'q=\u00037Z\u001fW\u0010\u000e\u0013\"\r\t>Ҧ퓦(cIQa7Ə`QAC3j;%ʆSyC\u001aM#lhk&h`-\u001d \u0014O2.騒/z\tV`Ua\u001be\u001cEφonlocHB\r+[jXw.\u0003;\u0001\u0003\u0016j7Hpo\u000e-ҷGF\u0002\u001c\u0014\u000f\u001f;27\u0007n^aɜow/CU\u001d};\u001e\u0013h\"v1ih\u00148\u0007^oym[dײB?;&\u0019~\u0010\fz%{\u0019frI=8\u0015|\u0013^#͘$|\u0016 bLY\u0010Gɉ\n0\\#L{\fEcPZߦ;Q\bd}݃M%\u000fqc)h;`5\u001293ϓ]h!<tD1\u0004S:>\btjN.!Ï\u0013.K\bU\fz\u001b\u0005\u0005bj?P\u0011xw\u000f8T\u0011g:3\u0018\u0014t*Ŋ|1֘\u001a\n/w᜹C'~\u0007\u001a_TBH\\6BM5\u0002!\u0013j@H\u0001᧪254czG=_D\u0011G^-EF^m\"|7P\u0010+0?|\u0006Pk,y#v\b:pܸw\u0011@4x{/.L\f\u00187rZ!P`ݓ\u0001T\u0014HACPl\u0012\u0016çc\u001a=\tFv\u0006YH;rT\u0015\u0011T\rNS\u001b_\u000eUL6`܇:\u0006U\u0018\u0000F:R#\u0019l\"*y<\u000eg6f\r)#q\u0018[\u000f_~gg\\;縎\u0019G\u0017}\tIFnQ̎ާ^:S\u0015s\bmG<̧\u0000[\u000f\u0015x.A\"ު8[:gioik37Ipo#;`&H-'jBL왎_*\u0015޵\u0011f$+\u0014W\u0002\u001a46\u0002^?kGަ\u001e\n<:.\u001f\u001c^#t&˦s͒ព;X3n`\u000b\u00107&Y\u001eM*=0N}5\rD]{a>B\u0014yv8E\u0006wOo@\u001frF\r8O`x|\\}c\r<(Gn_LԆmҺkytyڬ[?6n[\u001a\u001439\nJ?Ss$toVnWJBy'QɥS\u0019\u0006rqkD@ޛ\u000bgۤOn:\u001c+K8+!\\\u0013kP;|ۥJgzqDC[\u000f̓Z5|/h\u0012j,\u000fԠ:ѠVҼAI[\u0006lؑ\u0005S\u0011\buc\u00042vj7\u0004R.n#_\\DF.)mYs[n\u001a~L\u00192i:E)$u\tnc\rF\u001a\u001btm\u000bKgS\u000b\u0006V\u000e\u000ec]VBU4\u001f`)\f/븜|fP\u001bmu> '$>\u0018F*p\u000bq\u0003T^:\u0017zـ׵p(E5\\jU|Uj\u0011k8\u000e+WI\u0003TGEzeNH9mu\u0000*q凵(Yz\u0011\u0015 \u0012\u0016]\u0003\u0010\u0004}]!k9`#7&\\\u0005ҹƐ1 &K\u0019;eN\u001c+%dk{\\\u001c% _E;\u0015\u0000\f2>o\u00156XjtF`\u000ebjC\u0019xKvY\u0010yݿ\u001bV\u000b\u0017n.{mO;No3mNn,\u001c0,?\u00029 C+\u0004]\u0018/MJ]1oHL#,4VsUU\u0016\u0000lG\u0000\u001c\u0010'}\u0004>\u00010uGa^/\u0013.:2:aq~~ 'x}(}G[5|^$EG}y}Fvqf\u000b7u\bf})CԀ\u0017@oSf0'wܧ@V2>K</^\u0016@49\u0001r\u0011@\u001fT\u000f !徳\u001f-^_\t-\u0005\u0000,\u001aBY\u0001\u000fR.-qwM:ZvC谡\u0015T\u0006sG̷[@?\\\u0019\u000ech~X!@\u000bt7N\u001971g\u0000HT5~T\u0000䶠\u0000\u0000K#\u0000\u0019)+\u001f\u0016\u001f\u000e]*Mfeo\u0011\u000f,BŠz-gEV\u00051\u0000d\u0000ȫ\u0002(j\u0000X\u000b\u0000\u001e`\u0000.}\u0002н\u0000|\u0000`=\t`be\u0000`+O\u00015]\u0007v;:=,\u0017Z\fo\u000f`!?F\u001d;i\u0011vIm\u001aQ=]}96XU5u}\u0012\fy^9oM\u0000mPٯ6\u0017n~^\u0018\\;\u0001YC<\u0000sows\u0004r\u000e~\np\u00014\u0001e\u0000v&\u0000\\(wõ'\r\u0010[o\u000e\u0010>\u0007\u00126I'%I\u0012' ?Ƞ\u0019{+I(XI23?ӄdmkZA]EEdųVu\u0016= ?߅Gt\u001d&P_zZ(Jט#fWlm2\u0016?pde:IF~\u0016le!ZYU7COwBl\u001a\u0017\u00156\u001aOP>V\u001b{@\u001aL#xk\u0016>\u001dPnr\u0013IϤd*טW\u0003\\\u0007\u0007\u001f\u001c/h|\u0013\t/;\u0014qZu\fc~ʛC֏?}0I|v\u0007E\te_\u0007\u0010E\u0005Hsq\u0017nM~(~ŝ\u0015Ժ\u001a\u0005\b6\u001d2+w\u0006\u00174D]CGgȧUQOyE:\fߋ\u0014Ү<2Zy:\nc)\u001ew-dC+I:0\bԿA\u0013,ԭ,J{o=7:\\P?\"yӪN\u000e<2\u000e:p-nw~o(;\u000e\u0011u\r\u0013\u001a՝\u0010<\u0016ҷ'\u001ev:[*a|``\u001bOS-2Hg,Y[.+\u0011{Go\bd;ώ87,n:ȣ!\u0018\u0004ynvɇM?'@l-\u0014Kj>\u0000-ۡ\"Q\u0012\u001e{g`z\u0015sw;>.κ])K\"!y{2W%拏*Tv}bΑzENE\u0017\u001f&MM9O\u0019c0\u000f<|-f\u000f\u001b^pX>\u0000˹Jڧ>>2Cյ4W8Ԗ\u001e\u0017:/:Ҵ\u0007\u000fcvg\u001fɧ|%~y|\u00151\u001fuVu4e\"4)\u0007l96|=J]\u0019e=2\u001d@W׵z,XOqv\u000e\u001a\u000e\u00147\u001b\u0003bUG݅\u001b1>|9)\thVn0<|2\u001caS:;\u001b\b,[-os-߷xBgIi\fBC9tlNO8aoq`jQL|D\u0001y%_\t[JhN<w=Sq+\f3\u0017}?W5\u001442I\u001c2GV\u001e\u00049\u0004nK\u001e\u0019z\u0016h}YC>²]p֢?!4I;g\u001dwj^yAÄ¸a@@$ԟ[\u001cc\u000fj\u0003T\u000b\u001cWi2nvj8͚}oel\u0015JvJ.u\bǽ!ٝޞX{+d\b{N\u000e~\u000b\u0005\u0001։,+\r57M/\u001dZ{+\u001d^\u001b\\{)M\u001fLzg).B%\u001cll\u0014!K'\t\nM\u001a),7'OZnȻkoJ\u0019AY_\u001f7\u0012U`5[74]b\nyVϹtA}ifO\u0014\u001ez\u001e\u0001ڧ7<6iY~\u00103\u001b*?+\u0010&S3[r?$=JB'bzMrBBu\u0006:\u0003ؽG\\TZ\u0005-\\\u000fWQ;C2\u0000J\u001f]ٮ(Ьm6(s`\u0016\u00130\u0017>;\u001fN\u001cZ\u0007-UWWWO\u001aiu\u0010ĭn\u0019f4oi١iGÑ_A`+is|*wZ:K5\u0016\u0006\u0017z&\u001f\nuW&8Ƅ\u0007g\u0016n)Vrm\u0002fvv\u001b\u0003k\\\u000bY壬GQ\f܎cP.V׽\u0016e\f;k\u0001v2j28p?Kv8PcJ\u0017r-ҕg:[\u0014tZe)휶CkKoi\u0016˻7wsf\u0002\"8qhU\u0000pجg*c\u000e$;\u0017~kbƪj+qoZ~9q3c3\u001f\u001e\u0011\b]/\u001d\u001cE&gL0)L\"Ow57hxuԻG\u0016==^B\u0016\u0014OR-\u0019΂\u001fvg\\\u0010\u0016\u0011=4XOk6,ڙ&l\u0016\u001f\u001c>\u0016\fwG/tV]5[W\u0013z\u000e5\n\u00160Ym¸.k\u001e\u0003UεwM\u0016ǚ8ھUeSFRlu5SMLϾX\u0002529~g\u0006HGP\u001fo\u0019`27mA5mhzmộ,jӑn,\u0016vs;X\u0018A~\u001a=c0;\u0004\"Lj\u0003\u0017\u00134\t1Lu\u001c4\u00025s^\fiWw!/\u001d,ۢȶde[.)\u001f,?X\u0016sv{Xt^5\u0010mx\u0012jv\u001d\u0018%\u0003\u001bԯ\u000fma11IX\u0019HA\raVCX\u001d6O2}A\u0002)'S'z)UBG)6'\to\tx=&?pO>:B\u0016\u0014ad^RYi(\u000e}L\\|F\u000eZ\u0012\"[Mzg5R\u001fef8dX\u0005Zzt\fo䡱#!'#\u0006;\u0013%\u0016<Kq\u0005\r\u0018\u001e&$pj@+\u00163\t)\u0003\u001dl΅l'yYf|5c\u001fZzk\u000ee\u000b{7\u0015#7m=lyD=\r@H՚Z]R>Wy o$9i\u000bTMB\f\u0006\u000e/Rd\n(n<2;b?uYQjܣp\u000fDsɳ>@\bd\u000e\u0016[y_\u000fVqMMg\f+\u000f%\u0005t\rԯ\u0005қstvҶqJ\u001c'⡛ˊ\u0000\u000b-\tT,p|ut\u001f\u0006+JJ^\"Y\u0005\u0012mR\u0004\u000fvw+~\u0002ACm\u0017Pȝ\u0010bݮt!\"-+E)[KvA]\rr=\tXߘk:'u\bo\u0002]_~eu9'sF81|Q[\u0014V\u0019;\u001e3\u000fCFC\u001b&/6\u0012z0ڊ.\u001e=n&ܘ||ôQA}\u000fO\u001aۨ=N1Q\u001a\u0010+|QUCM\u0017K*IK`׈\u000b\u000b'=7\u0018k1'Ag\u001c23\u001dmI\u0006<D6+\u000e\r\u0017=ʭV\u0014e)#n)!w\rs1U>^΂\u001e'\u0011\u001e:a+O\u0014\u0006\u000e\u0005\u0006\u001bʢ%#(!.<i>fd.1&'\r\u0019uCVL&lvz^3tfL}˖\u0002hԦ)$Y\td@]M\u0012\tmɇox<\u001aj\u0018xܱfx/x=\u001f\u000f\u001f^Z\u0001*N7dEз\u001a:>٥)ǭ(}ᆽ6jͱJЋK;b\u0001kFU\u001dy\u001db\u0017+@(\u0011*w=&֗) t$`\n:\"\b\u001d\u0015't^eran4`\u001b\u0018\u0007;-\u001dDƝ\u0005Y\u0018Z?ya]ܩGQ'C\r\u0001j\u00108 \u0011\u0012{v\u00036`7L|L>ѱDh&䊑\u0002\u001f#\u000b;:!v~\u001bKHqz\u001b!@Imٺ!EvaE>6\u001e](`\u000e\u000bMu\n}\u001dn]ҡ#tNH\rhc\u001c\u001b\u001c\u001a2ޡo[\tXP1^j\u0002c$}0K)?\b|'\u001eMʞ0w^(\u0005\u000f\u001e[P#)\u0013?]q\u0007S\u000e=C/\\C_\u001fYa\\Mv{gg\u000fFCJHrcke\"\u0013qNYBW\nI+[+9Y.ϋe.LqzUWn}*r\u0017\u001e\t\\(6Y\u0010\u000et\u000bR\u0012RL畟\u0001?-\b-\u001b\u0000C'w\u001auxɺX\u000eԦ\u00101\u00139\f歬c#ϕ*VΕ@\u0016{֙>-\u0007Yzɂf7>\u001bQv4)-s!;mIȺEtb\u001738~k<2R2r\u001fe0Fڦ?8e)6$V<@OGV>lQp\t+k\u0013v\u0012!'P4RBef[\u00167\u000f\u0015\t\u0001Z`\u0001jrh\u0001jGSt6)\u001bf>EL}kX:\u0016Z̏ZZ\u0010V\u0015\tPO\b`yގ\u0000.>7\"k\u0005=Ht^Yr\u001e\u0018<\u000baШ,W:#U\u0014'\u0015%Gʭ\u001e9>sT<Ou)HKq\u0001*\u0005)\u001e`\n\t`-`\b;\u0000F\u0014\u0001#,`䌓b4\u0004bƀQ\u000b%03\u00050\u0005.\u0000M>?\u001co\u0017Ʉɍ\u0002{Ǳ\u0010\b-$^M}\u0017U/\u001a\u001b#\u0006b!\u0001v\u0000-E47E\u0010\u0000\u0001~\u0005`;#`\u0017\u0014\u0001\\\u0006\u0015\u0000WC\t*=\t\u0003\u001c\u0016\u0001\u0002\u001c)[V\u0007\u001b1@˪{rPң\u001f\u0013ϒF9.jz~ށ\u0018/Wf6`ۂ\u0001w\u0001\u001c1s\u0001'n<Yw\u0006\u0005\u001f\u00018\u0001\u001e+\u0000onݲ\t TJ:\u0010\b\u0006\u0000?2@\b>\u0010$\b\u0018/y[[\u001e ]t7%#\n3E9\u001e\\1ɗA3C\u001aw\u0004]k\u0000]\u000f\u001c\b\u000e\bs\fK\tD\"Ԣ&\u0000q\u0011\u0019@L\u000e\u0006H\u0014\u0000I@ E<\u0003R8X~H\u0011$%a|)$QY)I4NDgTܪϬ{\u001e3=\u001aܗ\u0004hK!m+\u001b\u0012\u0012z\\f&\fT.BǸ0l|w9DߓhwU M\u001d\nhSGiSdߟj\n\u001enZۧ1rPSt\u0017T٣t\u0006;5n|v\u001fIRtrڅ?Mqt\u001aVS\u0017Gz\u001efl\u001e=@n\u001b?񡙞{~H^s61@SDIzZ1\u000fck_ܸ}b}\u001ac;tA\u001c\u0016LTiX\u000eȣzÌrqmx:hv9\u0016Jou4]w*ԫ9J+>f\u000b+ǝ,$i6+i\u0013;>?I\u0016{J\u001cB)3\u001eGZ\u001duqm7'le\u000f;^~li#)L\u001akz)\u001de\";(sS\u001dΖz:suh\u0006/x39ثoCړtRS_'\"oHK)ڴrփ;meycM\\@d+~!\u0005-\u0017[d7a>\u0013\u001c\u001aa\u0019<rS\u000frJ!'v)EM\fqs<\u001bw\u0014:f3\u001b\u0014FaطY,yM\u0013Q迠^Z\u0010\u001f\\\u000e&d<\u00042뎹-\u0004L,>ɖ[V\u0017Э9s\u001a\u0007wi='#c\u001457yDy͸sNc=Gổ\u0019Ii(_UxC\u000e# \u0017}Ks\"@A~%o!\f㋠\u0018\u0016U5-9[mvi\u001cQ|޸fU][eB \u000b\u001dS\u0018w\u0019mfQVB>\u001c0S\u0006ɭ6\u001b&mӟ'K<^auW²o\u0011ZrлG%\u0018v}i\u000b&0\u0005\ro+7\rWEɻ`+'6y\u001a2\u0006ɋԾ\u000e;9ø?\u001f#\u000eU\u0003\u000f\f\u0017\u0013yD\f\u000bF\u000b\u0011zizXh|\u0017vIq\u001cu.˺xKwm?.\u00067ߒ6VS}\n̎\r\u0013\u001e&\u0000m\u001fNѶ=\n<\u0006Im/\u0013\u00055Jl8v҆\u000f<z馏Хr\t\u001c}?;\\;l5Vrka/\u0000o4'la̦QH\u00073g륪\u001d\bmV\u000fBw׋+=!CP\u001dZX^?g>nnO-3\u0018[6\u0018a;s;0*8\u000e{m!\t>\u0016\u001b\no\u0014\u0015]_ubvPpʧ\u0012uM\b}\u0012kP%uq:mک?\u0018ڵ:Zߵܤ6\u0002Z\r\u0011z\b_~~>\u0018]xl)Ѱo\u000eu8\u001f\u0016+@go\u0014OQFPFE7q};'w\u0018TSiUͬcWy'7y{{m]v6\fq*\fgHZpRGMygb}/RѢ\u0019vc\u0011\u001dj\\TO\u00043PSj#U&s;Kqm{\"vM>h)\u001au&6])R\u0012B\u0019M6p.ļ{ĝ\u001fMq\u001bė\u0003[>9u}\u001e\u001dDn\u001aTnvcVO\u0007:|2C| k\"b\u0019\r8uކz|PzJt\u0014Q\u0015NN3--Ty-͍G~3\u000e\u000f˴\u001a7[Ms[^{ U]qݮF^͑p\u0014X8>6ofoyc#6\u000fYa1΅N!_oi\u0016\r\u0016HW\u0013FP\u001dev\u000bUދw\u0015\u0004ǲ\n\u0007W$_X\u000f7ʬnǹQ=ZnGLnַ\u0003ς$x\u000f.vOWtjiJ\r\\kk6Ve5lb{A%A6\u0017&\u000f1ų\bQEt\bU)u\u0004\u0015lcG1NL\u000f߱l)\\_F.q.E SڋSWMkUj\u0004z3j\u001cp.ذc\u0015.ghx2\t\u001a\rzw\u000e'\u0010~֟xkb\u0007\u00175C^$<\u0007\u0010ydY(9lRuL\u001d>;̋[\u0015k@]m\ng\u0007;_\u0016{\faT'{\u001a!̩qܱ\u0000v9aO\u0013Π}E\u0016sG\u001b]U9Fʔ\u00043%\u0001+yV\u000e3\u001frqHnqTǷ߈~\tz<\u0012\u001aq\u0010=_&\u0003L@f@7\u0016e]$\u000b\u001bnkߚap\\}oPj(kL*&q+7s69A\u001dwtC<jb_\fgGci?/%\u000eR~}\u0018SF\u0005R|{<vܽ\u0002mޡzGz'\u000eryѰ,fzmv\u0018ƪϫK\bĪދEC\t5\u0018\u00052l˶A@BB+ЌZ3L6Bq\u0000\u0012\u001399WQ.G<sUv(]Vzmg''i3)wO;ga\u0017zzYJa~:Iدn\u0015jBy*\t=\u0004DYA\"6)yX\u0010\u0003c8f\u0012(͚,_]q\u000fhtJ\f;\u0011e6}\r\u0013V&\u000bmzvk.h3)N$mw\rl3zaһb\u0001r\u001dQ\u000eN=~Vd\t5\u001fa䍘oJ$&4O<_eW\u001e]\u0013.\u001a\u0016H\u0017\u0002=3k1\u000e\u001fzn\u001fU*SԪfiT\u0015=4I\u000eiA:!On=몓[M\\QZS|\u001c6\u0007U݅\u0019:n$sE\byRe\u0016\u001c\u0019#q:P\rf\u0012.w\u001aM&\rE6EqC\u0017mLU7*{\u0003\u001d86\bǭ  /\\_x_p_\n1~)\u0016\u0004!`\u0013\u0013=ȹ\\u4tmꚢ:-B>,&/g3}^!C\u0017{r͏M!E'w\u0017KƈĘ8o\u0007/˛qݳrl7\u0017=#4#:ؼ`򩢃^c>w?\f\u0006IJ7\u000eZfմ\u000e[!+*@!Eb嗹\"AP\u001bidP(S\u000bǉ&m\u0004xǘUq\u0016:ձ\u0019\u000eO0vhr^aFe/UQhjAf3c\u0004BLif#&ŧJo\u0015bRUR>՞X3rYa)g\\\u001f{;\u0003aTᷜ#=jid\u001a\u0011t$IT)Uʤ\u0015\u001dJ\u0019~S`3@,)!E@˫{/WM\\\u0018Tk\u0012Zwî\u0001\rz]\u0018wCC\u0007[Zg^?vG/e6\u001b\u00153Y\nrjhiy\u0017WLw\u0016`LI=\u0014\u000f\n\\vER.[tWb\tC&|<\u0000\u000fn\u0016L\u0012xyV89\u0017\u0019M\u0006{n\u0016z\u000b[\u0007J^\u0003\u001al\u00054\u001c^dLxh\u00104's,g\u001fZ\u0016o\u0014ڋ،[Sˆ\u001b[/\u001e\n\u001fQ\u000f\u0014y$b\u0014^,\\\u001e'従pSy\ndW,\bΥ\u0002\u0019*(A]̈́܇0׃Nѫkϩ\u0002g|ΜK~v\u001eNYFN\u000fԲ\fn-=V\r,\u0019(v~|\u001dZp\u0002\"D\u0006\u0013foB`EPAĦ ?\u000b\u0005:Er\u0018ˮ\u001do9[9L\u0019tP}\u0003b[8\u0002@L\u000bx\t\u0007D>\u0000(\u00001J5^\u0014\u0010N8\u001f\u00167hxW\"\u001b\u001b_W\nFv;\u001f_1Sޞd\u0002\np~z\u0014spR`v\u0005\u0007\u0003MѦ\u0000H|\u0014\u000f6\u0004\u0014/R\u0017@\u0015J\u0014C\nPEB2=ǀG1X\u0002T\u0003\u0016\u0000y7)CMioΚOe>CgdJ\\\u0014\u001bRyKD,Yɼ\u0019w+W~`@7\u0002Х\"\u0016\u0001M\u0014*\u0015\u0004t\u001c\u0001\u0000M\u0000=\u0014\u0001\u001dI\\W\u0000O\u0001=M=2z\u0000\u001dF&\u0000Ѓ9\u0005݄ۅ+ϟ\u00124_2aiO^\u000eB\u001bSO5\u001f\u00146̎\u001a4ixuFN\u0003\u0006\u0012)U/\f\u0018e\u0002&]:`QC?\u0013\u001d`[\u0002XG\u0000\u0017\u0014\u0006`\u0003m\t:Iqb\u0000;hf{X\u001e\u0001?\u001a.]ב\u001e2+dv\u0006v\u000e\u00040\u0017=@?Vth աՊWaX.`ߧ\u0006H,\u0004\u0000ט.\u0001w\".95\n\u0005ò\u000f\u0006\u0002x:W\u0016):\u001f\u000f\u001d@\u0005e\u000f@\u0018N\u0007S\u00133!v\u0015k$oBͽ9+A/O]+:\u001dL~\n\u0004\u0002:9\u0003a\fR*\u0002Q@\u001c\\ .\u001bc \u0018w\u0019\u000e$8\u0003ݦ)گ$g\u001f\u0011O{$QQ>x0WEQѢY?}U/~-綡ͽu77j_d\u0014^jTOu\u0011ҁJѳ簜Oy!vCHHɧ)>L\\0K<xz\u0018;~O^uϑp|JLF\bq5*{x\u001c\u0016U㔸7UV\u001d?:v`zw\u001b%\u001e\r\no9-\"\u001f6j4P+0O3﵇9yH:7XY^b%ޝChy:\rKEϣzbaF\u00073*Gsv։-63f%j__3\nk{R'E$DTQE\fo\u0013\u000b?\u0000[HUY\u001b 7F\u001a_\u0012[\u001eX?\u0018\u0017sco\u001b4m槓ulO\u0017kf3^x\u000frH,nKr|X]dw[\n33xƫS'{<\u0004\u0011'\u0014!I9\u001f\u001e0On]Ţ\u0017\u0010/hOd/=΍\u0004\u0004\fZ3\u0007\u0014zӍ^\u0018N<>m|96.jVsD\u001ed!ѽ\u0007C\u0006(;K*PH[@\r\u001f^z#O&t~\u0016'i\u0005/v2]dLj\"\"k׹gۇ^G&AƣSe\"r\n\u000e\u00067fN\rc\u0014R\rg_\u0007p\rC\u000e\u0007t\u0006)\\3t^\u0016?\nﭺdy\u0006_NxN^Ʋ|-p\u0016mѵ_ņ:+\u00015\u0016w\u0016\u0007~͢f܍;\u00136\n{8\u0010h^i=t:T\\w~TB4R\u0018=uw\u000f.\u001cv\r<:簱P}]c6QmDlI\u001cŅ\u001f(Q\u0004܁n_\u001dy8/\u001e\u00066]꓃qׁD\tb͇\u001eή_;^m:\u0002#4ܹPgӺ{\tmn\bSƝ8\u0011w-\u001c4fјɱa\u0000\u0007\u0017zL֋i=XY\u001cv+2\u001aW/=U8:\u001cߗ;/yf[ ҵŪ\u001e\u0006.F\u001d\u001cڽz>ז$\u001ex}4;HGr\u0003\"2X}qA:rɶ\u0000\tVM??>67fjBx\u001e\u000be\u0014k7v8\u000fG\u0013xs>\u001fjp]6۞\u0013z\u000b#mc}\u000fP֚Qp6wԀnE1`*_ԟ\u001dqN'\u0003QyW0f=V_+\u0003+{\u0014@V\\\u0005~\u0017r&g8q6窺\u0003+8\u0016NJq\\{eX\u000eS;t\u0007o-T%a3>B}ECfP\"Y0]\u001fQzs/;[4Nn_k\\]1Ց\u0015e\n\u0011Τ`b=ۆmYZVS[e\t],MY\u0018G*Ʊ#\u001e\u0018ѧo|7w2Zjn5\u001eW\u0001\u001aF\u001fMnrDw[\u001dg7j\u001c}_9jr]7\u0018O2Vyd¦i\u0012&eîAݞVvKɊ\u000fдv;\u001aZD)?w;;\u000bX64\u001bz:t\u0003Vy&J\u000eR\u0005ǜ1W*lZ>ˎl{1*\u00046t,\u0007\u0016\u0002So+\u0013\u0007m^\f%z{Shi|-4Մ~*oqnWSM#\b֔R\u001a)\u0014AT&+ue&k\u0013;J\u0006Xk̢Rv\u0007{+[U[zɁ\f\u0011aGa-5\u001c$\u0003L\u0003c=ֶ\u0003\u001f&z,5>դC]!kϼ\u000f+u즢ʳN'M\u0013?K%S+M\u001dxDrtz6\u0012e30apm`ZZg\u0012=\b\u000e,$Mq!4\u0010״h\u0002A\u0004j򶺪V*ȶfv+\u0002\u001erAs^E%gvz\fJ\u00079\u0017Jf\u000b\u0007\nJo2\u0016+~|܃1\u0018\u001eu\u0007͹sJӫ\u001c^/%t1\u0001\fʲ!m\u0015M\b\u001b:|D\u0015(c]Ѧ3.u<=;rU\u001cJ+KLm'nn,֠#\u0010+g\u0002\u0011\u000e\u0016/ෳßCs˷oYa\u001e|ˡ{|KG_\fg\u0019;}q^֮gU\u0016ik\fSG\u0002TT&U\u0004Sr;+\u0016&ҪiRjb\u0003C\u0011\"pBשZ\u0005if\u001b48yu85ܰOFȰOVgfhyq5zw;y\u0013e\u0006d\u001e]6:jB\u0007\tìկs:Dz}S3\u001e0'\u0017=\"\r!֢\u0013'zV\u0015G\u0016\u0006\u0017xp7=zd6\u000e\u001bɊWEgm\u0019QͨŬ(^\u0019!3&n/R2}mmZS$\u0006DT]x\u001aNW\u0013[2\u001aWٺT^\u0019чШx(Ljz72w\u001b\re=`MyPߛ1Oʌ#5ds=.2\nmص:\rQ\u0016(\"\r!v#ŢOCqH\u001b\u001f\rD'ӻ\u0004U.-<U\u00038\u000b+ڳn\u0003ej,\u001ern\u0001߄F\u0007JǄy!݋x]B\t\u0013\b\u00146U#\u001c&*댺Leii㾾PKZZ\"7\u001a^n\u001eBH@\u0006C==r7q.+n@ʥ7\u0018\r\f\u0007xqI,D\u001dy Ô\u0017#\u001c>\u0010=١\u0012}t[` \u000e\u0012CFLJ`х̰F-6\u0004Ј*w4鵌\u0003Y\tC%\"\b\u001b\u0002~z]\\9ևx3*xs3xM\nӎ0py8n\u001b:ukOO/W;\u0011\u0003T\u001dwav`v\u000bN5K9~*uW\u00045@֠FVr88AS>~xw8\u0018w:\u00140.\u0003csоY~bqK}YEdA\u001fl\u000f}I\u001f/%v\u0002gIe\u0001h,\nPFh.''̖1g#\u001a\u0013YK=N̽\t¦\u000b\u0005MMJnĺR\r\u0006B\u001b\u001d\b\u00157U]ƕ1jf+i +j\"SC[mC\u0007FyNY\u001e.Jadm\u0003RjNŃOX\u001a7LqrxfD\u0007\u0014+b\u0011\u001c[Q5eF62/\bd~S\fɻ8h=$Z\timx_ʬa{}f\u0010Fn\u0010Dk\u0001x\f97<[3E\u001bQ#J^s8h<]cT3ɱGT[y9%ews\u0012+6\u0005^oTQP\r>d*\u001cL-\u00187\u000eb\\\u0014V(\\Wй\u0007R\r\u0000z\u00109\u0014@B\u000fp\b\n,k\\5Xʅv9pnzKKh0Fxy\u0018@>\u000fxG/\\Q?#Qq_J\r؊ַ\"\u001d-)\u0017MBOCxCkهI5̿\"?*q^Y|Zr32-|Nodqh&CNյW=\u001adX]\u0007n\u0018=\u001a?ɜ\\<_\u0003NmARqɫ#uǟ\u0014BnVќq\u001cTw쒘:Y}if6,u92\u0003{\u0002\u0001l\u0002\fu\u001e|\u0000G\u0001f\u001e5YBi\u0006ijk2_S'/\u001d\u0001A;Shl\u0001\u001d\fbkM+ap\u001f.{dK\u0004\u0007L\u0000cAb\u0001\u000e)l#Ů\u000e\u0007=\u0002Dn\u0007D^Iy&\u0000t\u001ca\u0005w[7Gtt\u0000|R\u00183jY->\u001b&Wx\\(0VG%0%\u0011\u0014s-\u001b\u0002W.Y#g\u0007\u000f@\u0017 ^\\+?\u0000)T\u001aT\u0001ڀ3@:95\u0007j\u0005K\u0000^\u001fh' 9\u000e\u0007$)fc@bZKAӡ#p\u000e\u001aRd-b\u001c +CKn\u0014\u0006\b\u000bv\u000e\u0007P,\u0000\u0014@)\\\u0004P\u0000\u0007wd\u0000Uˈ\u0006&#\u001fP\\\b[sUn\u0001\ra@H1ť\u0001|\rD\u0004.\u0014X@\"\u000fPowb}αҦ\u00187\u001amEӕ`MXoR*r\u0016ˁțf\rz<Ov\b\u001bO\u0014\f\u0006%Jп]\u0005\u0004L\u0001\u0016`\u00180}f\u0007\u0005T\u0001\u0001\u0000\u001d\u0001)2`>o\u000e\u0014`A~{1\u0006\u0007sx>\u0013?dau\u0014Rs&\u0019\u00117V\u0015hաzi\u0015\n\fX\u0004(e\n*`_a3C\u001f}O\t\u000es2g-99\u001a,\u0002\u0001/K\u0004j\u0000na\r\u0017ksZAŜ\"?\u0018׹-\u0017J\u001en޶f([R_vlj\u0015~#ߪ6FP\u001fP}%@XJ@$_cQJ\u001a@\u0007K V\u000f\u00104\u0015\u00001J\u0014qM\u001f\u0002)2L\fo\ncV}\u0014> vӛm'soyO\u0015\u001b\u0012\tFLNWm!ߝ\u00128IG|4s1:\bK\u001fMOOCɧ\u0004dIq\u0019A1+\u001dw>ސ b3n\u0012\rs\u000eNrD\u001f?]4\u000e\u000eP7sϦ\rrd\ru\\35sl\u00176pJ.\u0005\u0005N?C>-7u\u0010v3\u00177^lL_㧖[\u001c\u0000}?wk\u001eoL'U\t:v*Ic,&/\",\u0003T?\u001cts\"fNE\u0017\u001f4\u0007Ykr6&\u0007\u000b1B\f`Ua\u000f$}\u001b\u0000ސf֧oJ*Dr/K|\u001a.\"z\u001f-l>\u001c\u001a\u0003FO\u001eS\u000fd&{'!&\u001a)\t7u\u001d{+\u001f?:*EտrSb\u0003ؘ=;mJtB\u000b\u000bJsR3S\u001b(MyQ\u0004ż\u0019܌\u00135?bclFäW\r\u001f\u000f\"y\u001edR߄\u0006ZpYVSN.)>?5&,۽mBZ\u0017lfKA\u001aM\f\u0004zN{\u001b5=7숏pȚA$z@}7LmJ}siFN\u0014Nަz\u001et\u0003tN-!o:؎Þhͼk\u0014\u000f>f\u001fOLmabkvG\u0017yWgv\"( wUǱG\u0018\u000eC8?\u000f#4C'n#[\u000f\\4xn\u0016ΩQ,u$\u000eǴ\"\u0012zs\u0001\u001a|h$KWSA\u0002I0E?\\\u000f{;q9\u000ef\u000bDmI\u001c=\"1|\u0019f\u0010ul@հj QfiUyZ'6mB\u001cZ}[bVy4Gn*\u00057טT}yo-!\u0007\u0007rz\n½vx\u001a\\b}@\u0006^;G\u000e[g\u001b\u0019ۦ90B\rvpO~}vwQ[3\\m\u0018|ЗҸ(u7\u001au\u000fA9;i(\u0002/Ԉ\u001d.\r5\u001e;|\u001cU\u0007vX(dJA'E\u0007Y\u001e^=YN:f{AA}i=\u001d6-\u0012ʹ\u0006\u0006^h\u0002?Kt\u001d)9@*}'1ө57ǋa1f8wfͱ[U}\u0014rp{F$۸C4rւ/Zr\u0014x׬\u000f[jzͶ+oF\f\\g\u0016+6n\u001d\u001c@\u001d>x\u0000\u0019)\u0011/\u001eheWFf59\u001djU:7h9ZjWٲ0M\u0007_[-uw7770\u00031\u000e\nk\u0004׎SKoABVvmE\u0006Z\u0019a.5v?N̻Y<^\u000bO\u0014wn\u001e~_K_~8Zf9W\u00005*yVi7ZE\u001850҈bbZoۣNfFֹ\u0011}B}|r*zf+Hys2JzaMQFE7WcEǽAZv\u0011\bj6>MTG[L\u0006ÞGǪI^TDU?ufmI\u0014\u0006Z-v+;r{v4.,\u000e<UŕUEQnGdB\"O͑$W\u000fWZ`\u0017\u0010*ڑl>\u0005,u\u001cvv{Ʋ֩Ifg.f~\u001an\u00066/j\u0007LQ\u0007\u0006,\u0012\u0018a\u001cE-\u0019;\u0018P\u0016A\nI\tvNQVD-\u000b'l\b]+ź\u0017i0f\f\u0006wp\u001er}#ULdl{}q4\u001a-i3<)x|S>hPRF\u0007qFedHJ\r\r\"ұ#a-B\u0004Bq<\u0005\u000e=.;.y(\u0017ϱojozla\u0012:~\u0005hط\u0003\u001cGXw8~\u001d\u0006\u0016\u0012\u00069]!MnLd(\rz%'W*\u001b\u001eq¾ma\u000f)`O7-xSu\"$˱Z\u0003g\u001f7wXoBa\u0011B뤱B\u000f%(\t\u0019 Uڵt%Tdmqb>%wL.WJ\u0011yJH\u0010+x#\u0004\u0011$\u0016+]\u0007]\u000buΦñN}(>sVػ'\u0015ݓ\u0019\u0011\fn\u0013m'HOBO̬π\u00101^nq4J=jK1_]\u000e**7<\u0005KY+\u0012RM{1POYallЬ\b\u001e2\u0016Lfd5F]\u0006\u0011=\u0019!{ZWgejw%\nn\u0001eջsH4er6\"@q_a8g'\u001eSwGGU*\u001a-V_qp-.\"\u0019r[[\u001eqcE\u00197  F\bA$=9v-\u000f\u000e:K-\u0000ޤm0͚\\c؝&\u0011LG\bO씁GTqB9\u0002\u0010;$\u0010;.pRt\\\\\u000bAVmpךЪFZ(O|\u000b蜈&dȜr\\\t\u0019ts4a\\wż֎QILOUB[Z\u0019a\u0002\u001b%םB&ˏG-\u0001%q\u001fw\t\u0016ި\u0019*vI#:'2gq\u001d*ް\u001d7<܋UiԺgWqy\u00017.\u001bR)[[$4ԊK\u0019+1܌rķ\re#7\u001dw?$. \u0010\u0002g(D\u0010\"޸\u0006N5,V]L1f<wACI5ޟtPIz\u001b\f\u001e&\u001a*_Ӊ\u001e\u0005G\u000f׳F=vyu[tHGr?sAU=R@9#IQ\f0g1a]{n\u0012k0jV`;\u000b\u000f>K#V%[\u0017;˜+?dg\\RZ;Q{c2V\u0012<kh\u001fFI@Dob'ijm\u0002\u000e\u0001\u0013\u0001\t8GXMXU\u0018\u000fO^\u001e\u001atpnHY\b6\u00169㣬h>Zs޳\t[\u001f\u000e\"\u000ef\u000bVT\u001f\u001b䫳C\"'\u0002 \u0012qbU8F\u001a\u0001m.\u000etxQ\u000esVC\u000bۯʁYn\fj\u001d\u001dL)td\u000b\u0018,\u0017E\u0015bV:^\u0011\"iJZՂCIڛ\u00042V%G)}\u0006C\u001e\u000fb򠿕\r\u00015@\u0003\u000fk7l-\r>XA0$]\u0013\u001aZ*fT\u001fw\u000f,\u001eIr6Rsի#\u001eB\r\u001a\tk=\u000fX+¢T\u001dd\u0001V\u0006O\u0017\\~U^1ufNi҈p\u00001J79ny%&z˅Y\u0015hsl-n[#\"=Vq\u0011\rg1#x#|<2ib>4Sh/!cVdX\u001f]]Xo_xˣ:,&\u0007N\u001aʥd>%p}|y\t\u001ds\u0006󂘁\u0014aYP¯Zs\u0005\u000f.1S\u0005\u0016\u0003A\u0013% \u0013 ٹJY\u00152y)gg\u0006\u0006o\u0006\u0005~r\u0000\u001b`\u0013j\ndU\"'cUH.KyJcq\u0004P$s6\u0018NԳR\u0011\nko)rpa\u001a~O\u0001\bږ6\u0019|`W\u0012PCO@m0.\u0018WS$\u001ef'y\u0005[5;\u0002j-\u0002j\r\u0000\u0014/\u001a<ZBE\\\b_=mU.#ΔUBI\u000b\tGl}֧A\u0006Ed\t\"+\u0010W\r\u000f.E\u0004\u000e'\u0000\u00061\u00145\u0001 fJ5u\u0000\u0018\u0003\f\u0007\u0014+\u00110>Sdv\u000fdw\nr9EY1ω[(+EMr;F\u000fƓ\u0015\u0015fdl\u0002H{\f\u0000\u001b6y1x\u0010\u0003\u001e`(X\u0005̥\u0002,8\u001e\u0001\u0014\u0013\u0001la\u0007l\u0000+)F.`x3Eg\u0002\tvJ1G\u0000;uUΈo\b\u0010`{5`\u0003Y\u0006l3}\u001b\u00169Ѵ8.gA\u0010p8K1׺XȃT뼐\u0002\u0010\u001ePqeJ\u0002B\\\u0001\f\u001f\u0007\u0001\\\u00007wh\u0007\"\u0002)\u0002xy\u0005.\u0001$w>\u000e\"a8OG\u001bZ\u000e\u0005؄\u0017Ņv\u0001\u001bnЪlld46\u0015M\u0006'\u000bZ\u001e1\u0007\u0002r-\u000bWNco*H<?S\u0002\b|\u0007!@kN@Xa?VxC \u0018\u0003DNaS\\@4# \u0016w \f\u0000Qr)+s,:y4l\u0000y,;t\u0019\u0003!\u00161d ,SХ3\te\u0001\"m\u000b5\u001fj\u001d\u0019ݡW\u0002ANa\u0003H\u000b9\u0007z\u00062\u0001 (@.@D\u000b _ԱQ\u0014*kvb1uD/+l\u0013\f*w%4<!\u00162\u00194\r\bC6\u001aw\u0015|\u000f\u001f\u001b57ex\u0010\u0001\u000b/r-\u001f*ב\u001b\u001b\u000eP\u001eP/\u00032Ј\r4\u0012\u0002MV)>SᏞ\u0013~\f\u0013\rqq\rmkR#D]j\u001c@IO8'V>;݊IY/ǈ}g1+\u000fva+\u0000?y\b_c|20wtx+\u001dѕ\bBmYe/'ey\u001f#>|<C6\u001bCK*9ͭg{s̽BbOW=x]>C\\FR\u001a=wȧ?m>_kԢR\u0014ωQ-nv;Fh~6V\u0014|\fup\u0018mn\u0016:DykW=rwZ>\u001bsޠE\u001begKSf,b>\u0012}\u0012\u001a6\u0005?\rݿwqω^jp;G絫<\u0018hK1lIvu@Y\u0007Ӽ[\u000br/g2G\u0006ڬ9\u00053t|\u000f>tO}4c1ϣ5?I]=qF>oG9\u001a|Ƶ\\gVéU1\u001au\u0014g5?^bY靹N7&\u001dMb\u0017r\u0016\u001ds,9Jj\u00047\u001282T.t!d\"C\u0006c]\rO%Ϭ #ѢwƇ]8N\u000e:ل\u000eu\u001e\u001d+,8C_F$̖Jݙ6Y\u001c7Q6\nI3(zSw\u0003eu\u0019[:LC\u001aHwU>\";quD\u000e\u0010rɩN:X\u0016\u001fsI\u0006g\u000bOῸKrJz~-4Il\u0015](LlNX>z\u001e%ֻnN\u001c~j'Ǯ-^֭|\u000e󟦑!`px`!\u00151F\u0003ٮ\u0013cZ]GY\u001aqp5&ոWsn$3Dx}%E \u001e \tw\u0015\u001aI&÷n\u001d^k)\u000f<U3Jbg7\u0002KjA\u001e\r\u001a\u001b5l^#PǈP뷴/O>2U\u0012q~3>\u001aF~~_\u0019ܷ'VY:ܿ\u0003<\u001eg3^\\k\u0000`K\u0013$\u0014,\u001fmi{7\u0006\u001bsWZ^+V-l\u001a׫\rުLZ/\bר\\tuEVCʚz24&+ƳS\\dڻb1n|\u001f7ݵybxvZg\u0017(\u0017:ǠFe\u0017\nh,zcxZV.GڸQXӕ~*m\u001fU-k\u0007\u0003\u0015\u0012eB@Q\twR~wݭH\u0002U֩\u0015/eCb\u0004v\u0010&\u000b;|65+\u000f\u0002r;\u0011\u001e*j$~3t6O\u0017󡢰KY7\u001f\u001ftHizFvV⦫Rd\\VV]߉Av}T#;xWVR\u0010V? ̞jk;U\u000bϵ7)D-\u00186*{o\u0003Ȧ~G@`%wC7?~\u001e&ޕA𬬲.9q_pnK<9n}L{JY\u0015+9Ć\u0015\u00067ǒxb&2U[\u0016CmR0Θ\u0000nXJހWIӶWKϭg_Q{\f'-p*5״*\u00174\u001fuכb\u0019yN-6:{8Z'nps:cK\u00001(I\u0014^>\u0016%\u0017@5Vw\f\u001dUyeԋgJ+kYH&\u0001V驔\u0013ޕCNeSl,r\u0013q#\fbԜ\u0016+b-s?K\u000b=s,⮲r\u001a>-7uu\u000eݍ^\b\f#|5biI=`hJ.Q\u000eq4nwG_>7hFn\u0003K\u0016>B(<b\u0006Sf^ĵi\u000e߳G]>\u0015\u0003 x^!t;y\u0014+\u0004Bvi]K|~a;)\u001bpՋI[\u000bS\u001c;GΩ5&Wd\u0000k\n{YsvrۑZH#یR_3$'\u0014Ahzc\u0012z0$Q5RX\u000ft8Jm6\bU\u0010)\u0016śsd{[9ɯ?9\u0006|m\f:\bP\\j+V\u000e~p\u000e@nלt?\bxI)\u00154u\\qlk>!§\u001a1\u000b泎\t\t\u001b\u000bL{,;<\u0001\tVa\rm}<ۮ\u001d%[\u001e6TQf'e'6e\u0003}vʒt\u0015\u0000O'ű|z\r\u0014E!FJF#Tw0`Y \u0012\u001a\u000e҂G>\u000b\u0014\u001bjf\u0018xy\r\u0016M1O\u0015:_>\u0011\u0011asf}Z5}ڛ\reȭ]as})\u001aB\u0018r-zm\u001bx1\u0013\rf\u0011>QU쇟Lwm1\u000b[\u001e\u0006獄)afn։\u001f\u0000aA]bF0g3ͲĒC8x7Pyg\u001c޽^\f!4\u0012{J3~Tl\u0007K\"P`\rKc~\u0007KݍbnEOϜ>9ldmA*^Xr7R}2\rU\u000e\u0018\u001fѧ5v[Nn\fO\u000bң.7\u001c\u0016.D\u000b\f%-БfGSbsd?-v\u0004Mw&gJw{q\u0012\t/94\u0002V]\"pDUO߰\u0014VGetg\u001a\u00180gֲ$ӂ7Ska@Ֆ|қ\u001cN,]6&ԇ\u001c3G>\u0004J2F:Z\u0019(I:\u001fK\f\u0012H7\u001ayOe\u0019zwłYk\t0C45T\u001dA?\u0019v|\u001c*\u0003\u0011St\u0014Euғ?\u0011D>1N\u000e,OY އwNw0\\.\u000f|:mPtFڸ}\u000e/|:h3DpV~h9PvʴZZ\r;#HՏAJg\b7\u0019Nŷv\tv\\iskzԣWIؤnPإbs@\u000eєۛ5\u0011o\u0007btGo97\u0000-,?cpgTq$KR\u001a#?An\f\u001cC}01Pbj(1|K\u000er'HtC֤ɮ\u001cJM\u001dbujC\u0002N\u001aն՛LKj)dk[@'\\F>L\u0018C6\"{c2\u0011y\u000blj~Ku+\u0018\u001f\u001fA3\bTC1\u001fVV\u001a\u0013\u001d{b%YA.=@.x6%kiz#Je;iι͑\tUro\u000ee8\u0013#∖aǭEW'oS\u0003v~Yu\r2ʳ\b̝Rkyn\u0013\u001bl9%\u0014M\u0003{\u0006\u0001\u001f\u001ef X2\u000fk\u0011pZ`\r9fjݹJna\u0017ϓ\"խ8:s\u001eC\u0015T\u0013I\u001cx>\u000bj(p\u0006HWou\u0010\u001fj\n\u000f\u0006){B\u0010FLQ̥Y:1OsYDW$h^L>ގ2%2G3%Rxl욖{\u0014)\u0010\u0003mNj3;KQ\u0019\n9`Ø/>!7\u001d<߶Z(7rݨR\tF7;k˖GeT3f\f6}\u0002ěBRX@|\u0000$@g)vV\u001a\u00107\b4\u0004<~\u0003b\u0012)&ς}[v¬\u001d :-=N\u0012\u001a#W|7%M \u000eqQgur\u0012h\u000f\t:\f3b\u0007\u0004\u0003M\u0018(S\fʾ\u0012@A'\u0010\u0003\u0014\f)|'C\u0003\n\u0000߀g\u0014s\u001f\u001f/mŅR<\u0005@h4Ɔ5\u0004?,j\u000bn(%Q\u0014e('\u0001<2\u000e\n\u0002\\\u001d\u0000=/\u0000B[@s\tz\u0002\u0003S\u0014c\reb\u0007tES\\!@C\u0015ж\u0011\u0000Z\u0000$0Efޞө\rsi:TП%\n\u0007u2\u001e_-ʢ\u0012y9l4x\u0013\u0010[!`\b0\u00143Oam\u0000#\u0007\u00040Cw\f`M\f0\u0000iq!=I\u001esA\u0001'^h\u000f0u\u001avmStS웶6\nZ/j⢳!Q\u000f\u001a`>\r_\t#\u0012A\u0018Ξ]\u0016sE[\tX~\u0005Ām>\u001d'̯\u0015cE,\u00068Mg\u0001W\u001ci\u001b\u001e\u0016.*\u0013W\u001e\u00035>~O\u00017\u001e\u0001(ubn$\u000e͓\b\u0007\u0005&J\fP>\"Cߠyp\u000e\u00067\u0016vs;\u0001}B,}'\u000fp@\u0001~s\u0015\u0000U `U\u0007\bƽO\u0000v\u000f\u0002X0ɤ\u001fd\u0006´\u0001LM2\u0010W\u001d4HGr\u0014-B\u0005E&&,x\u0012=[(g\u0010\u0018\u0016p\u0010_+4C+<?\u001c)\u0016\bOb'j-\u0001=\bت\u0001tK \u001b&m\u001cH;L\u0000\u0016\u001ftm\u000f=87U$2t9>\u0017(H!9}b\u001cS\rs8m̟&L_O7l_ߨbR\u0003\u0001:́ҵב#iQfտ\u0003P\f]n\rk@3#?o\u001bgsS\fϧ\u0019=\u0019~dᶤu=\u001eW\"||.kL3p\u001b~N,s\u0016g\u001ft+IYYᜣ\u001e+Ø1L0뇵g1\u001aN;?ӦVO\"w\u0011-8\u0017i(3 ?ES#~ݾп\u0012\u001cpp\u000e3C1uzQ`vl\u001cNB&Rn\u0006;bl79V0\u000eqJ\\hJ_>2Uw\u000b\u0005З糂\u0017nFȔ\u0011%kWk$c\rn\u0000?F7,sj[St\u00046S]*\u001fˈEO+\u0019/k2_dy~e\u0001)Lbϣ&ul5>NOk(\u0014x\"Vޝ5sMysW6FC9:AU\u000f=\u0011C\u000bAMJ3;ݘgqJ\u001fIQЫ=>ߥ1{ܲ)\u001f\u000e{\u0002\u0015\r\"\u001a\u000f>6\u0019\u001c뻹\\,G޲^o\u0013:7\n!^r\u0016\u0017b̊RI\u001aS\u001fĝI\u001d>g5a$\u001eP9?3@s`AAvi\u0001}d*=/\u001aM\u000f]bW;qm8<8䮵g;TL[|]\u001e3_+6ƪ][Fħ0C\u0007\u0017a\u0017a~KQ$d\n\u0002\u0011gFwy\u0010u7%y%6ڪS'm\u0017\u000ea!w.InZuu-5Yj\u001aٌ\u0019]\u0012XV1+\u0017\r$ne,\u001e;.=.ۮ[(g6VrS\u001d\u001fy|\u001c\u001fᮟN\u001dٰIr;if[DVO\u001eW?07_#\u0018[qǳƬx[7\\4/칎Gm0\u001aqj]\u001cKUu\u0004>+x,U$?J?\u001cXq<\u00167x`cN߸Gv\u0012V/Hz\u0005\u001b\u000e<ps\u0014W_Y\u0004-q,xոYVj7Π\f:JVM)0\u000b;\u0019h+}*YVO..A9\u0014-Nb\u0011WrH˸}<ӝƭi\u001fK0\u0000:\u00157\rߦb[\u000f]\u0017w\u000fx@>/!X%\u0013tE**bwղ.K\fѫ=\u001a%k5\rKP<,gf\\NU,\u001b\u000ey|jDhZ\u0000Gb\u0014Awk\u0003hQrOZMɯ2ϐ9O}sYܶܯ+goR\u001e^&eKi`G\u0015\u0019_,6o/.G-w+hũFD>`ũ\r֙ZVW]졚Z+<Һ0\\b,0\u0000vύ2l~K[鑃EYo}\u001dpG)V\u0016\u0017rלwqǡ{>\u0014\u001d\u0010mCL\u0012׾d]-\u0015\u001eQ\u0018T#;ƨ_Il>Fu'<tDLtgte\u0014Xbjwj3y΃DnV\\FP%[o\u001c6^VV{ڛ,Hn̿\nOF\u0016\u0006';_Ї-\u0018gZaN'>CV@YGZRK2ͱ>\u0007uSk+xdJ\u0011JRLo=;?4&Jx)-`l\u001fm8qڷyJbfBh*WW,l(FvIYgґ.-\u0007y\u0006L-ū~USURJ}0)\r\u0013V)]\u001c..bJܢ+uCpe2E:h\u001d\u0014Q֤\u001a_\u0013TN\u0007I)/\u0006_\u001ditzc벾w;j\u0007!v\u000b@\r+xVyaRr^\u0013%樓|JO\u0016_\u0004\u0012\u000bRG+\fb?Ek^7\u00143]\u0018N0\u001b`lp.3\u001b>N2ճ6zSJ-\fܑٿmBJCREfCwGf|ֲ\u001beKN\u0014lF8T\n+&\fOP\u0018-!cngT\u0013os<<\u0014nad\u0003nQȟyxx@yx~je\u0007kB]\u0006E@ǘ\u0019\u0016\nNG_Tjuu\u001aɭ''\u0016\u0012\u000fZ[\tot\u0010FHp\u0011\nW\u00102\u001bO\u0005䝌#np:JjkĮ-9%e%ݑڹ\u0014\u0007]OSصFE\u0015]%?J|۝۲r_\u001d@2vUiMDI>6t.#\u000e@\u0018ٳY\"\u0019\u000f'5 \u0007dw\u000e\u0019\u000e8>\"<[J&K\u0018*\u0013\u001f-SM[Yn\u0005:x{>\u001d|j1}4Xʅ:ɲ|Z>Z`(dK\u001cTVR\u0014i纂Y*3PA3<{m4\u0006Gle[D#}&LýS4\fYXEu)*4$T?WY\u0016c\u001eys[J\"?Y*\u001dt7\u000fF\u0015\t㞳ݾf{0976RcݒY(yg2dr\u0012汛ʫ\u0012}o>#kF7+ىJ;>\tST<\u001dKdoj\u0007_\u0013/y\"'K\u0013F/\u00120Y\u0011{\u0006\u0017G\u0010?4Zo\u0001CiҾ`I\\Gr\u001cvm-VMZ\u001cn\r\u0014W\u000eøsn5o]ZTx(\u001bwW]'UJZ\f1\u00141(d}\u0000'E\u001c\u00127`\u0007;\u001d\u0007w\u0005\u000eťw\u0018l\u0007躭Yx-5=~\u001a?}\u0002[b\u0014g}>gK\u000ee/& \u0006R[\u0016)JdVyHM\u00070DXED\u0006\\fdmqqsǊC\u00053:Z\u0013\u0014?.(b\u001d'\u0016\u001bw\u0005/=^9\u001eh\u0016DwX\u001fdhd.LO+SFٯ6-U_q\u0018!Oy;@b\u000b[kb%\u0018]\u0007\u0015Z^\u0007\u00140߃uPf<`Zl\u001d8}D18H\"8Arb\u000b\u0013,t:_\u000b&/\u0013/\u0016?O֙\"ݺmm*\u0016\bhbs(\u001bZZ\u000ev(\\p/LsܼE6AB\u0014(㈸#ypO^\u001cSܾC\\\nd.aeS\\ \u00070Z|B`|]G\u0017}\u001foUVO\u0007\u00191hsK\\c؄(;Zp1P\u001cf;pV\u000e<\u0010ޭ\u0005yt\u0019\u001fj[[蟠xzAѝCFgR+\u000bY*3W]|،\u001b-*k#\u000bC\f$\b;h;6*B4\u0000\u001e\u000bi4S7\u0010{'mNZ7}5\u000bzj%P.\f^e'A;kփxf-x\u000bs\u000b\u001a\u0000#\u0000jZS\rZs\u0006pHh#\u000fp\rpL\u0011/\u001ah\u000e0Jme\u0005̄\u001dqDY\t$X\u0006d翧\u0000N'\u001eZd7w?lDn\u000fLX\u00153'Z\u0002\u0004\u001a)*]@\t \u0004xxI\u0002B\u0014\u0014\u0002 $5H\\\u0002B\u001e\u0001A?*U@s;z?,Y\u0002L'JvG2'_d\u001d.'~M\u001epp\tby\rJW2 O!vb\u001a\u0002NC2Ekt\u0007&#,x@ꌝb\u0006Q\u0000@gS\\\u0015@\u000b Io\u0007H@\u0001\tl)X*VHZVsFG2gV1Տ\u0001\u00017\u001dt7[eՀr\r\u001aj6W=@e\u000e\u00146\b\u000f(\u001e\u0001\u0001U9\u0000\u00152\u0017@[ 7XJc\u0019P\u0000P3b\u0007Լo\u0001jv\u0001DNje\u0019@\u001d\u001c߸1DV\t\u0013Ke(nF8Unƕ \u0017\u000e.<.I\u0010\u00193xCk\u00026\u0001/\u00015)&C@7^s@\u000f5\u0017F\fC\u0000q|\u0001rQ\u001c`TLm\u0000F)W\u001d\u001a0\u00060\u0002:\t\u000e\u0018b-\u0001\u0006\u0012J!5\u0016| i>x|I\u001bۈYsȁuz\u0014\u001e\tIvFOuhIw1怙/~\u000eby\u0006~Gr\u0003Vn[g)k*\u000f\u000fph\u000b8\flRD\u001f\u0004,\u0017x۠E\u0016\u000f[\u0002\u0013ۿpF>Lr1=491'\tV\\7\fvYLա\u0003`_\u0019psk@w\u001ew/ݳY&OY\u0002`\u0003\u0001\u001b?ko\u0018\r@\u0002\u0010`\u0000ǀL~\u001dXq6a_\bNWvoܲ\u0019$kY{A:\u0010\u00117v_\t'\"\r\u0015\u0001b\u0001@u\u000bHT\u0005\u0012y@RIgN(\u0003R,؅ЄeYTڹl|\"HfyC)W\u0011OK\u0017ə|&Ĝ/_9\u0002u.&W^Q\u0006P\u0010(\u001e\u00025\u0007[@e!PYl|\u001aX\u001f4NoTQf}l\u0017\u001b\u001atwW\"\f\u000f\u000bޕ9꯳8o\u00111\u000b=FOX]\u0011/妻au\u001b[빥::FS\u0010~._%k1̐wb\u001b\\be]\u001eCpo\u001cy{\u0004l3=mTa\u000b«M\u0013w\u001bn\u001f!_V*\\)\u000718\u001d]|\n0\u0003m>Ӯ92.\u000eg\u001e̿fbEP?KQkAbpK};)0\u0017s\u001c#q2#6\\\u0015W\n.uX'^\u0005Tǫ6[U\u001d\u0014N76O\u00054Ql9>L<u4ّx>QÞCp\"\u0003\u0001'\u0007A\u001d#9Un%5*?w\u0004\"\u001b»sg/3t\u0004?&sL\u0013\u001es87\n\u0018\u001f\u001e#7T\u0014=Ï\u00169\fR}\u0017\nFeqg\u000e%o\u0013\u0007A[\u001f\u0017i@Zy0Z\\\u0004\"ۊ\nS\u001f\ncqkʾ<wHƃ\n\u0016q\u0002\u0006\u000e8xгc8<ԩS,\u001a\u001e\u0003\f-Ci^j|a3mӀLY|`F?\u0018{oR˻w\u000e|'=|9sv\u0014ӡL{=/\u001b]?\u0017|3:u(:W\u000b\u0013lmݺܠSq\u0019fd3QvΔ[cVj\u001b.՗\u0007BmJF$\u001awU*\u001bUV/SCO9KD\u0011\u0005}dD_;KI:\u000e\noaZ<+w9B>\u0018\u0005:U1s\u001bZ\u0003Y/]R&OZո9T>җo*`sOT\t\rYM:rϾe\u00151[/Mm\u0013hjNv\u0019\u0012`\u00028G6Hǁ\u0005\u0006X\u001ek>8Wdc>wGCJҧ&mĩ垩s8^:eq\u001d,|=*jUe]\tWEolZru|GS,\u001f\u0006] z`>7J\u001e\u001by\u001c_ԪzeXߒ\u001cz\r*ӟ{F\u0019R\u001aƏnAqoK\"Q28HلKVю~ͮ\u00177=.fXXf\u00053\\f|Sj)\r9\"\u0005FNX0zkZ\u0003yvw(Ϻޛf\u0002o\u0018従<csOH.Γ]e3\u0017sWkg˼\u000ez]콘{ڍZ\u0002n\u0016g^Z\u0013Ŕ3[pAƨ:E3c8BF&euѭv|R\u001f^p1\u0017 \u0012r'\u0010i\u0017aGxMw1հ|f\u0005j`Լ\"YV){KM\u0005:\u0005ƛ!&BD\u0014\bnO\r-\u001fACumZ\u0001O]Z\tO*t8F\u0006*gN\u0013{R~\u0007\u0012r\rmͬ[ԵDdY6Ly\u0001Wk\u001a3\n\u0017\u000b}\u001d#1:\u001f\u000fߴ\u0012I^\nkb*\u001e|\u000fR3\u0017BxY\u000e\u001av(si)?Mjo.$V$vGsI\u0015\u001e)F\u000f=b{\u0010e9yY\u001b|4{ѣRc|fMf6e-\u0014\u0003\r\u0015ZCP{\u001b\n\u0011\u000f.r\u001bd{CCHJ[y\u0011\bYu&D=\u0011\f?\t\rpc\u0001\\`\b\u000ei\u000eF\\lAɇEf)zf\u001a\u0005PYXz.;5TuS*1u]>\u0015\f2w\t;Rҙ}A)$\u0007Qśxi\r8aa?y~|\nx9><qn\"\\U\\\u0018q}#!BS.PW\u001dtqjuڗn <yZ9{TkJ}\nD`|$YwW\u001d _T\u0003)8+\u0018\u001a\t\t\u0014myk9P}rsN9\u0013~\u0002ڨl\u0012+,XG6LXgj%3\u0014woR\u0019f;>fZC\rcCx1λCRRJ`-\u0007{ؗD>16\u00040x;;;\u000fbnrghĮ̂-³+/iK\u001a$PZS\u000fG76\u001e-ubTE~+\u001b!\u0014f\u001b=д\r_سvv\u001b\u000e'\u0011Vt5cJ]\u00165\u000bvEVy,\\\u0011,\u0012,.Uڵ4r:=]mAqa\u000bJ\t^%}\"$hM*\"\u001e\u0003K<TML*\"\t1Q\u0019 G\u0011նVWwoi\u001cjxҭ*)q.\u001aBaBHG\bk!xtU\u001a0C\u0001/S&^چ\u0016(\u0011ۯ\u000e\u001cnW}A'\u0005ʲ\b\u001c7XZく#\u00067\u0007e\u001f\u001f=[C\u001eA?~yd.7 Gb*U,(l\\qd\f!s\u001f\\9g\u001aSky:Le\u0018X\r=Q%2J\r:#*?\u0015\u001f\u0005\b7/C\u001av!\u00039a\u0003ss\fCV+\u0004q\u000fC7\u001as\u001dsU;t\u0018sN20c#mPm%ؗR93Ż,11}f1v(\u0016/\u001c;\n\u0011Y\u0015\u0003+6>n*ŮcO<{~tY\u001fae\u001c9zXZ7\u00178OK<|>v󤶝{o\u000egUdH\tՅuo+9_1%̋\u0018=I/ݘ\u0005>F\u0007\n5Tu \fpOH<OX:1\\)+]C\"D9<OCn_i=r\r5q9~/#A}\fb\"B&ؙ!Io<*O\u0003IHO\u00140~ԫ\u0010O/ı&S\u0017lǓG!@+yFB緻nznعƐ(؂H!zbx\b-.\u0007wy>Ű\u001e\u0014\"9@\u000fه֡*\u000fa~\u0016!d\u00009p\\Bkid>.y\f\ny\u00059,\u000ehՌ\u001d\u001e`c\u0004wk\u0004X0Ew\f=\r4h\u0013H\u0017JlfMuLG*;H=!3L̴+\\W`\u0015չ4\u000b}u\u00049~mJV]f_\u0017N\u0019Wa*Ⱟsh%ws]D:\u0003\u0004E@g?Adܦ5[^ƅY\u0006YtCw\u000fn|73\u0005;\u0006\u00194O1K9\u000e*MFe\"c\u001aOm+_\u001a՚\u0002tUB*ҭ$\u001d\u000e7^\u0017t!2){͈Nd!R\n)\u0000k`F\nMѫH:\u0000\u000bIn\ff\t\u0003l\u0000֚4\u0000\u000e\u0001\u0016\u0012\u001f\u0000\u00050KqN+/{e7AsYفX\u001a;\u0018vCǩo\u0013Y-\u001bk晼)#a\u0015au!L+\u0000$5e\u0000\n\u00142oF>^)F\u000b2\u0014O\u0007\u0005^\u0004x\u0003k8n\u0001\u001e {zBe\u0003p3f~,z~+g>\u00060\u001bG/ޱ\u001bt\\\fq+\u00061\u001d\r\\ZN\u001fB\t\nҮ\u0002\u0004w+\u0002@+\u0006 . \u0004\u0010CvuI\u00001r\u0018\u0003'E[\u00058\u0007@t|\t\u000f\u0005\u0012\u0015\u001cel9\u0014h~ gH˳2\"zmCmen\u0002\u001fNt@<n?'$IN\n\u0003\u0012\u0000YK?<\u0002rƎ\u0000\u0019Wm\u000f?.dRI1\u0000)\u000e\u0001\\\u0000р<7JL\t F6E\u001b7E\u0004Qҷ%\u001e#)=@:5\u001cW\u0011%+ʔ3(}i\b̠\f(a\u0003|\u0001\r\u0007\u001a\u001d@\u001f\u001f2\u0000\u0000\u001d@gS<-@\u000fK\u0001G\"\u0005%\u0002c5\u0000]C)\u001fS]['],ȷ\u000fq4?\u0013\u0013\"j@6o\u001b\u0017g!\u001b\u001e\u0001\\`\n6bL3`\u0003\u0005lH\u0002m)ve\u0000}\u000f\u0010\tĎW\u0000lL7\u0013`\u001d\u0001X\u0012'0*Yx/;y=\u0011\u001cA\u001f~ۜ4\u001b\u0018YǿJ\u0013\u0007ps4\u0007C\u0002\\|Se'ż\tZj|-\u0001ޣ\u0000ߨ\u0001_7;ń\u0003|A-ZnCӷL/v`Ez\r!2Yߖs3??o\f\u0017䟵\u0017Y@t*\u0010g\u0010ss\u0003\u0001q1U\u0018@\u001c1\u0010۹<\u0010G\u001b\u001dc&\"(k\u00039E/\u001aya+T\u0016\rѡ}\u0011ߜ?f\u0017L+\te\rȺ\u0007\u0002\u0000JK@іߪ\u0013(\u0013(^E\u0000JS{7ܴgJ\u0004W\u0013.t?Jsw\u0016IYNE~.jt?k?=\u00128=Ǳ\u001d1j[zV\u00156ܰ\u000e񹷺աJ9Ee$zğ\u0003v3~d\u001aCG\u0000zn\"z]\u000bt\u0012<91Zߥ\u0004`o/^\n\u000bGDꖞLS\u001cزvGp\u0007\u0011{@8\t\u0011\u001e\tUs'!S;\u0005\"^X{#-ƺM2= {\u001eˏ\u001a?[\u0017~n\u0001<\u0006h6ЈE,t_֦!S:M\u0003AWð\bQid#¼_\u000e=\bWݞlGmӸn\u001apVW\u0015$E,\"3tZc\u0003eQk!w\u001a_IAVY6VtgSͮs\u0019|OhA8#ޏ.s\tGt\u0017'{grўlm\u001bku\b\u0016ߚQcݸ\u001a{{\u0016@h1ɩmu\u001c8\u001eZchO<A}NcG\u0001Ѓ-sWW\u0011)V7M\u0006a'\r9^[֊{0j[P~ѿ,TRو\u0005\fAU{Wc!!\u0003\u0003x0s]M>\u001e9˟I?vC-m-RХy\u0011?@\u001b\u000ec@M*vjQ|6\n)\\(%,K$͔XE!*<\u001frR]\u000b\u001bd\u001eWw>;!c\u001fR2[޿4'4/'B!lPTX\tYZ7,2 $\u001a\b΢ʜ]%TqAD@zZF\u0006K=\\JG*\u0017_\u0003RPʥˈ\u001c\u001c1P.\u0006\u00076M\u0013^עg[Ö),Rpjeʾ+|\u0013S\u0004\rn~.֯SY\fx\u0011LxQ+[qV\u0005)\u0005xDH\u000byNȋ]^Me\u001e):4<)\u0013YهvP\u001f>\reՈJa-`y*]\u00020)x\u0001\"T>P\\\u0004)\u001dM/Jq\u0002\u0011Ǧ\u000f_,\u001dd\u000fF\u0010<\u0019=\u0019{<\u0019}2J29\u001dWtMD\u000eaI_Os)k3Z2\u000bBARa\u0005xm5>ve\u0011((>y\u001ems?<G64\u001f4^\u0010\f\u0011l&)rF\\˽/;yפu\u0013&ΰ;:C<Teв'm}koLK>C8mŉ\u001fI\rcLnR_>9ڍU+͆TN\u0003I_'^U}^^rMbw^oߚ3l=1=Kժ\u000b'P½R\\Y<O9clJƶX\u001a2\u0017'}֨D4ƒ\u0013Wz^z\u0014GսK1zJ\u0007637eg>2k3\u0012\u00159M{];\u000bcc\u001bȚ\u000bW^&\rQc\u001b\t\u001f΃^\u001b\u0013\u001b\u0005.-fkJjJ=(iJ#Hd\u0017'|t\u0012MM0/)=z˭;mg\\\u000eT\u0007Q\u0003fOϲeh1W/30KCnN1v74*h\u001fZ\u001d\u0007]l7\"\u001b_Mz\u0014U?lE#3+')y?8q=w?\"2J&TjwO}ny\u001a\u000e]\u0007v,k\u000bE\u0007,5,#M6#GӜ.\u001e%Rr6[\u001b]O\u00062\u0017\u000f-N'24Liv\u0003)Ws\u0014`Y)#\u0016\",.o34&\u001bCqWsqY57\u0003w-\n\u0017\u0002c?\u0006pz=)]hNk\tI}PU52`S\u0006[[ZS4G}\u0019VS)I\\\nŷXx\u0004YU\bvA`\u000eo\u000fm\tC\u0007E\u0006~4'?}i)&m*\u000eG^\u0007n6)-Z5\u000eTmU\u001d\u001a\u0001\f\u0005/\u0003QΜ?*E̒|$lz+\u001cZ\u0015\u00126\rk \u0004Ns.`\u001cu?EyJ\u0019w|w8ٰW\u000bc^\roF\u0012_rNaꇶB\b\u0013W?Wq]6\u0015Q5\u0010\fWcB\fD\u0006%ʊŊ$\bz\u0012Xću\u000b\u0015˝97\u001aʆ\u0007\u0016iնYyt\u0019o\r|\u0017{zuNߛ|I^5wc jϢ鮳wGMf6vBGϚj\u001dv\u0005vT37`XwL\b\u001e/?X1\u000bXprrkMʱ\u001d1SfO<!\u000f\u0005ci\u0013~L?hA3[4DQ5jz~[~-=L}IM\u001f%\rqҤB^-\u0017;\u001d\u0014;͝Or)n^\u0014K\t\u0015o\u0003|\u001bΗd6vz>8$?Z\u001aUg\u000f\u0015ݮnڥ!\u0017Q3\u0002SKE\u001dI.4 \u000bȹJ\u0012\u000bJ\u000b+.nxb]:Ib\\\u000ftlzӦg\r\nendstream\rendobj\r262 0 obj\r<</Length 65536>>stream\r\ng/[h\u001c͗u1V>^_kB\u0010X\u0012*[\fK\rR2}Y=P:;$iz\ty\u0002\ru\u0003&\u000e>\u0007&\u000bJ4$ݖXG(U`DHwf\u0019q\"\u0018y^ū=e]Wm~yZ\u0017\u0016Ք!k+мJ\u0005\u000bb\u0017Fϋ\u0013v\u0001\fBCG8Dô@P\u0018\u000f\u0013b904\u0015t|؀G2T^\r|KCp~x\"X^+Xɗ0i\u001eaa(mIѸ`\n&\u0015gx^*(:1wVEW(|%\u001fWIiS9S=\f\u001eD]/YD(\u0011H\u0007\u0002߷'xE\\@q\r;-d'5\u001a&K>&˹%th{J\u0003l\u0007Hol\u001e\u00103\u0010{t1D7n](\u0010׭7fb.k\t)EvUkRŠg\u0013Ӂ)_A\u0000I7!쬍pLD\u000e<!\n!)\u001b6Z\u000ey\u0004A%M\u0007/n\n1\u0003<go\u0005\f\u0003؅9\te\u001aBF\u0007>E\u001bF;,M3mgjmxǖ\u0011s%nT]Cէ0\u000e3m%\u0019HG-Γ\u0011v\u001d\u001cy\u0012\u001d\nM\u00160#\t\u001e\u0006솏\f\fT\u0011^:f\u001a\u0003O+@8!\u0006a$\u0001/\u0000z邝: <\u0005\b0I]OMPZZ/\u0015rҲ}Sx\u00157I2\u0017E$YM0`\u001cB\bE\u0006ֈ3Lr:!\u000b\u0001\u0012DV\"\u0007\u001f0\u001b&\u0012\u0001ɼVdD$ n\u0014Lo\u0000\u0012\u0007D\u0010 >\r\u000b\u0010j?*ؐ]S\u001d^?\u000e-G[''n.S?ѺȀS\u0004\u001e\u0004W5\tq\u001bl*\u000f[\u0002ά4XY\u001a#\u0005\"\u0002<\u0013yg\u0000y4J.\bM9t~\u0002j't9ڀ;;@\u001ey\u0002rq\u0000r=~cH\nr@+\u001a9t-e* \u0005LXC\u0003BYϜ\u0004\u0000y@[\u0019P\u000e>e\u0003j\u0000uT\u0012v\u0000u\u0012Y\u001c\u0000uR,8@]\u000fP\u0017\u0007\u0004M;So\u0019\u0005Yi\tn8\u000fk#\"-%+?\\\t\u0019%,j1iiDu\rKX݈ho\u0016\u0010gz3G\u0014Շ\u0000hU\u0001\u001dx\u0016ۡr$\u0007ͽ\f\u0000\f\u000f\u0012,\u0001\u0003Yq\"k\u00040p\u0006ak\u00010Ho\u0004g\u0006\u0013'L~m\u0002z\u0001Ve\u001bU\u0019/\u0004\u001f9LJ:jb\u0015n\nXK\bX\u00002\u0001c\u001a`\n\r=.\u0002攩\u0000j\u0000\u0001kr3}\"\u0017`%*\u0005\tX;\u0000Fu\u000f`\nX\u0016\u0002\r\u000fEMҬ3Zׯͩ[\u001d58eU|}<zI&־9L*\u000f0ǓCc\u0019V\u001c`\u0019\u000feo_+Jw\u0000WΏ\u00007\u001eE'[\"[\u0004&&\u0002ε\u0001\u000fCɣ\u0011\u0003ܣ\u0002\u0000/QyKmJ̪ߨ cr)cXD[\u0001ZߚRS{\u0001GoV\u0017<Aj\u0013\b-Y ¼,\u0000\"bx&,\u0010N\u0012\u0010V\f\bcE^+y'\u0017'\\o\u00113C]\u001a\nMYn}n֡R\u000eӂV{2\u001dMS?\u0003\td\u0010 U\u0006H\u0006dT'2m\u0013s6@\u0001\u0000{\u0003i]o\u0002)\u001f%0 M禊 \u0002;Ƶs8D6\u0018va?\u0017)u6i8\u00136ߔ)\u001a]84to39Ӭ'\u0002*\\j4P]\u0016T\u0004T(x\u0002\nD?;9W5\u001c\u0012l\te[w\u0005mN߹JRs\n|\u0006w￈L_T\u0007z0\u0006\u0012:$2@\u001f\u0003\u0006%\u000ei\u0001z\u0013_̛&8\r\u001b͞~\u000e'\\\u000f,nKԺ^\u0012sgc,NVX\u001d3Gds$/iW~۽;DLZᵺ\u001d\u001ewCf-\u001d=Xd\u001bz\u001e9s_\u0000Bt\u001ft7\u000f!5-C٘\u0019H^f\b2^~9\u00144+M\u000e!7繗Ӌ7ȩ?\u0005hc)B\u0013sFNu>wx\u0019p+lhY߈ۆ\u001fRz+^\rq6Y݋؎K8#-\n\u001f;\u000b`\u001e}\u001e+4h*\t6({G\u0015C4J\u000fIŢ,@\u001e)dv\u0003^uS|79ߥ.׋\\p[A~Na\u001eDZoafձz~hhߑ zq/\u0014\u000eq7 .y;!:\u0011\rf[q[QZ#4{V4>nc9~)\u0012'Yɦ|_\\K{\u001f;iB\u0006b̴\u001e\u0019nGRg_\u0018~y\u0006\u001f[q\u001eq\u000fR}%\u0007}\u0013>{(\u000bf_I\u0012.\u0003\u0015\u0016\u0006VԖBao\u0015q\u0006\u0013\rNC&8\u0012㸴&{tej\u001fC\u001e\u001byOν\u000eFDD>l,ARH \u0012V9neߠs\u0015S.\u0007\r]*/-tTRϛQtH\u0011+|7}0łų'`D\"c3\u001bnC+N.qT\u0016R\u001a0~%\u0014N<XgPr܃\u000f_~z\u0003LǊÜG\u0016\u001d\u0016P,Lm\u0000o\u001bF>L2y\u0017e=E6L\u000b9\u001fbP6tbVߔ#&yX\"\u000eJ)V(-0ͫΡXٵ\u001f>\u0006I\r\u000bmr4__\u0014\u001eܦyfX1wh$˿\t;\u0014kY9\u0013Jf}y\u000e^I\u001b&\u001d\u001d^\u00000\\ΰn9\f\u001b\u001c;|[\u0005\u000bW\\7,[\\8+i>y\u001csCfS#\u001avIɴ<\u0013OZ㌆\">\u001f^~sMb}r^\u0019?oa\u0019ĞĲlEk\u001aZGed.YkYt\u001c,q\"g\u0019ڭƫ>\rkEVR\u001a5ZiYɽGȏ@frp^+q%w\u001c+ۓS=شSصF{hdfa\\vI>_\u00192o#p|\\O{\u001ef_.`vZfZFYFl&Zl[kt\u000bs^fŖR\nwg~9;%8\u0010`ic\b\u0017l\no}-,zeRH36f\bj8\u0015u}vu!s\u001djg\u0004Ajr-gU\tdj*}\u001e(:C,1)iI\u001ee<*\u000fW8BN\u001bz\u001b:\u0013\u001d(֢qu6KtMPva\nsCx\u0011u|Ӵs\u000b5ɨ׈+\u001d_\tT\u001dw)tXy%\"$*/C-DP5,\u000b\u0004\u001by(&kUB$z!s_$JW!#X<182\n3\u0018\"t\t\u001e#Z\u000b<~FeM)\u0015HЪ^-\u000bJTU\u00152<ngPRf!e\\_BL_;\u001c:`\u0002l2ܝs\t/φ;\u000e*={^!Cv\tt\u001aq\u000eLƢ0Yғ!\u0019\u001aM\u001bR[[\f<N\f4ο(X 2J$6/LY\u001f&|@,F?q\fpNRnjqft\u0011bL5YêAsVM!j8R*df\u0003\u000bH4\u0016ת\u0013)MK\\} \b岃\u000b\fSdjX\u0014x\u001ct(9T٘t}<c9t`z#qY3;Pi-#̡I\u001fq\u0012*Yz\u0006)27\u000e\u0010iW\"(o|M広W\\OcP~z|3I7ζf\u001d+23=1+*ѯI\u000fKv\u00060&Q\u001dD(\"oo^[_-\fd{&2^.tݷ|)[+&\u0018B\u0017ԇg\n(IiX?B7\u001e|X_ӮwbSjrܯ/c\u001d\u001e\u000e:x\"\u0007v7р\u0012ljr-)3\f)$s>\"JM\u0006#V J^!0ŷo\u000b\r\u0003:La\u0013ꠓZͭ\u001f|hʻOȭ\u0010<o^\u0018cwNN.6L\u001fx1z\u000fY/jJj_ʋK\u00189JT\"S#W\u0017TX\nQ\u001d\"9s|;͝J%Ns|A\u000eO\u00195c2o*V\u000b^\u0015찭\u000eHƘgF\u0018Qti*rR(\u0010¶{s-N}[H#튠6u#\u0013A\u0012,&V\u0007\u000e&J5$h1H+ニs?ؑ[X\u0010MS=a`\u0002\u0017G\u0016X\u0017\u0016T\u001aJ\\\u0012y\u000b2ߔXɯ,M \u000bECT\u0002Go-]Xqu\u0010\u0002a|l\u001b\u000fUP'~$\u0017aO%:\u001cx\u0015?pnu\u0003ر\faX]UXLg\"#\u001bD落@U1NGnqt_\u00011\u000f?_t\u000f~V\u0007xЬ\u0010\u0012!aml\u0007/5-S\u000b\u001ce\u0014iA_8aG?\b\u000eKSZ6w\u0016crQ@Nĺ=hz\rJ'\u001a/d4GD,\t\u000b\u0015\u0013WQ _\u0019g\u0000\u000f\u001aְ\u00074\u0011ۿ\u0000`\u000e\u0004\u0007&8}\r\"@ 8<(\u0013ÜmF\u001au'g+܌\u0015)s\u0004f=?̓$%\u0011;_\u0014\u001a7w供\u0010i\u0006Ƒ\u001dC\u001bA$*E\u0010-m,\u0019'\u0001t\u001b\u0000G51\u001a\u00018Ne\u0001\u000eBKj\t]@5C|-㶌^tY_\u0003gIS\t\fzҗ,,\u001bϼ/ة=y\u001e#\u000fzGX\rM\u0007B:\u0005\u0000\u001ckТ\u0013,\u0000\u001fI1f)GRʟ'\u0012\u0000_7HoT\u0017[\u0003x7\u0001\u0013g\u0018Xiwh+jIBb\u0013&X}<\nE0_\u0011^\u0015y4\u000fwxTl\u0001\u0004\u0000!@dx\"7\u000e\u00109NM\u0001D\u001c\u0000\"4{DK@{\"'\u001a\u0010j7'9# \u0015\u0005\bu<_Nn4\u001b'\u001b{BOrc/I\u0010\u0000\u0013b΁Bs<\t\t\u0003B4֒R3\u0018\u0003&\u0018@*\u0004Hwd%\u00011kT{\u0003@z6\u000b:&r\u0001\u000f\u0001)W#\u001c I\u0001nnm޶r?۵2)\u0016syH(\u0011\u001945CVq\u0004\u0017\u0015޴&@\u00063*\u0006\t\u000b\u0011\u0002r%<gC\"\u0006(\u0011q\u0001ei\u000b$ʊi\"\u0003\u001c\u000b(+\u0000J\nR\u0001\u0004\u00142\u0001u\u0000L\u0011YV\nB\u001548o 5UF/\u0006K7\n\u0015\u0006E\u000e%\u001c`@zRD\\9\u000fC\u0001\u0003\u0001:\u000e\u000f\u0015\u0002bcAc@Z\bA\u0000Vo\u0002b;\u0000-K\u0006i.y>\fvUgT+\naoY&W\\E{L#Ӑ?\u001e\u0011I9%/ΜY@\u0001\u000f\t%٘Ɂm\u0015\u0016\u00000Yvۀ9}9DVO\u0015*\u0005MP\u0007T\u0000fFq\u001fχG\u001fz*u抿E!w3;4 e\rN\u0004O\u0000V1p!Ĕ2Ad7u!E9Zeu.\u0004p:%iD\u0000ʀ\f}>|\u00028\u0001N\u001c\u0015\u0001ā\u0000Oz RCH|N\"\u001f\u0017o\u0012-\u001bG\u0005@le㋍C\b:eOo~4\u0000\u0002\u0003퀠Gt\u0003Bq\u0012YԁPs\u0017@( \u001f ԥ*ȓ&\u0010\u0016\b0'\"߅TUnZ/\u001cG\u0007\u000f\\rߚr\u0000>95r_Dz\u0005~Sz=$\u0011 $\u0006H\u0001XJd;\u0004?\u0001iĒ@jr@*@J7 \u001c+\u0005ek'G?&QoAjB1@˙s|\u000fv\u0001\nl(s\u0001(o}\rO\u000bPECt[tGzda:\u0019`M!h\u0003\u001conoKcG\u0000qP\u0004:u^OF\u0001\u001292@w9\u0010,yO\u0001c/\u0000X/M\u001bu'\\Gn\u0013fdXVrpwxg\u001fӐw\u0013?Dbe_xW~\u0013Ewq7m\u0016:YZ\u001cVa\u0017/h0>,Fc\u001b\u0015\u0011=\u0014s\u0016#al8n4_ _w^\tw\u001b+\u0017u\u0002]OC|\u000bE؀cf%Kymƭ[X\u0019O#uyW96(Q6^6?\u000bJ0k)nv&Ҿ3\u001ezto7G]/\u000f&vg!x\u0000 2ξ\u0011\u001c(\u0013j8#=\\\u000b>\u001b8#u0cj\u0016@4\nMK\u0006ۜt\u001f{dwj~\b`b ~'XR;2}\u0013\n}jVom\u000bv[mkL;&l]c\u0013;Y]S\u000e6\f[dmsLj|ڊk/p(sq\u0007߮X\u001ad^zMf:݀\f:sY!\\\u0016m|[\u00174Rosg|nM}\u001bCWY{E[^>aQdd\u001aS/o֐ 7\r\u00192d>U\u001at\f߭AZj5Z$s萫E59\u001c5\fYTj ʾIEP1\u001b\\\u00035m[5zQ2ݹZ\u001fIV9\r\u0011Mmr{2{`0a$$7\u001aU\"c9}4:h/\"\u001e0Sn_~0sjɄ1Ly]As\u0002\u001b\f>\\&}J\u0017;6s3\u0017Xgn38I[ߤtʡ[qmJ\u000b\u0006̤\u001elP\u000fF׊Co(:Ȫ[ίw.\u000b\u001en\u000bF;}V|˚b\tK\r\u0005jw\u00177;|vߛY\u0018)x252q4f4ut\u0010q{\u0001c;q{Uw\u001d,%|\u0006\r\u0005)\u0017_\u0013+xc;wYɓd\u0002YrUNH\rY7?Ca=.2ɴ>\u0015kym\f\u0019\u0006e\u001e=]\\\u001b\u0015S^ìK\u000bXw˷~\u001dAU\u0000!<XUl\u0005װp:\u0013\u0001`Dr{8bawd8t\u0018ړjش=ѱSo`Ehjfaa\\vI\u0019z\u00118\u0013^O\u001er\u0015].c]vZv\u0014\u001bi-u$O:m[ti9\u001dOA&j\u0003d\u0011=ZQFX-,xs٦\u0015I>,9#JE*~ܩaf\u0005x;Lɭ4@jb]@}`^t\u0014S\u0014S*\u0015S\u0016?&\\nJY;v+OXJkn1hN6WG\b5ib\u000b3\b\fd0o\u0012\u000bú\u0000vI\u0019&c\u0019E\u0005Cըܷլҫt-Bua\u0003\u001dɎl\u001fK~$b4<\u0014(~\u0006ۋ\\\nZq6-C㺋;\u0010\u000eI/8B?fưv\u0011ķ\u0014o\u000fz=keQA<G1=\u000fH\u0005K\u001e\u001eڴ&\fĥ\"M.{C&'!\u001eS\u0010l&nOXYH(~@m_~[x5<{ܡ1pfqVKd\u0017Vvn_h)ZN!rh0z|\u001eu^ї?ˣظɣyIY5\u000eF]U䅒+\u0002l~ZJ\u0018s\u0014sN9_\u000bzJ[񘛶j1a!$r\u0019}wR1kc\u0018|A5o!`\u0007}L~fd! DVHP|w+\u0011\nԙj۷]Ag/WܜI&\u001aF\u0015=h-gpq2uEA\u0015FeСKe08H9^J׺F~H4!(X\u0011y\u001e\u0012W4O'lL^Uܒ=pǢp-\u0015s޳Q22]D1w$\u0007Y$KۜSCe\u001dl\u00181R%\nJD\u0014(\u0004E,6r\u0011Ɗ\u001d/6E\u0007n-\u000f]Y\u0006(Ł\f8@\f^\"9g\u00023Zx\u0012K<*_1t\u0018b@?/\u000bm\u001bo?8$g'O\u0014,fervdn|H\u0013Ē\bv?\u001b;D\u0000\u001aL\u0001ωSlo_޼8\u000fK%>so\u000b6v\u001fZi\u0011Tܑg^\u0002~\\r>q\u0003\u00054fdzH-_VvN욚֖}eOVĚG\"\u0003@,\u000bI\u0014aT }2\u0016o\u0007棎3\u001fsכ#\u0016\u0006eW`O*&p\u0000=-\u0001m4\u000eOQim\u0016m-J\bL]k2</t瞰y|،cN\u0003s\u001bdK!\u00191ЄBhNbobC\u0014ϖ T͌A5YbךGU)\tyUv6=*o\"\\m!\u0001\u0018@M\tT.\u0017Z\u000bЂo\u0006+Դ\u000beP\u0015Ow\u001a\nl~r]tagມ|mAye1Yn[v\u000eb\u001ea\u0015\u0013\u000b=\u001730ڔ\u0007L\"7\u0005o\\g`tr\u001e\n~O_v8b,l.>*G䒟a+7hu\u000eb9\u0006Ɇgu^F\u0005\\&\u001b\u000bk^s\u000b\u0007\u001e!\r5%j?2\u0019A-w\u0013X-;[b6\u0007\u0003ط\u000br\u0003\u0013Ly\f\u0001?\b\u0017\u000b\u001a\\!\u0019U*Mh\fsȝ\u0015\u0010\u0003\n\u000bc\t.(f'7\u0006d;YzٚO4\u0010]\u0019\tN\u0018rM{K;\u0006ՆKbxKJ.\"­Wȭ!z8\u0003m[\u0011c}>\u0007\u001a\u0018\nAd<\u000b*ȱ\u000b\u000fG\"L\u0004/\u0002ә\u00009)\u0015m?;nQ.~}7흼\r/OG7V,\u0015y,еw\b/#\u001cڒ\u0004_;^`upL\u0016^6C_`p\u0000q\u0002L\t\u0006Љ\u0015\u0005\u001c*ifJ:\u0003X5\u0001\u0016\n\u0013\u0007|\u00070:\u0001Jδs\u0018SH\u0016Ў.'_3{=\u0018؈Pz#訴#\u0004\\?KTV졉6ރ(_?\u0000R>\u00023&ry\u0003c9G\u0003Od\u00048-\u0013Y\u0000\u0004,\u0011O6\u0004sk\u0014\u00046Q\u0018\u0004z\u000bjd\u0014PQĵ1`Rn<s'^\u001f_ά\u000e8oVvԴ7+Y#Cq\u000f\u0000\f\n\u0001\u0017\u0006\u0004cJ(\u0002$ډtJ\u0000?N\"\u0012\u0017\tu#z\u0011S}\n\u0019\u0002xJ7]P(k\u0006rN*y\u000em\u001c&PtQlp#_I\u0011y@\u00036=4n[?\u0016{@ \u000b 8\u000e\b]\u0001R\u0000Y~X@t5N&w\u0005\u0010O$ޤx^\u0000b@\u0002@4\u000b@_@Y@x,|)ʑ\n-]̙\u0017\u00134\\|}Hr\u0011<pE\u001c>~|\u001eãn\u00022}L\u000f\u0013<\u000fI1\\R5\u0000$|\u0000Ia@\u0010\u0001Ȓ\u0000rT\u0000Z\\SDF\"\t 'C\"w\bӮ\nȮ\u001b\u00022d7\u001f( 8\u0007H\u001cZ\u0017\u0015\\\u001bc\u00111AO\u0000%\u0007o\u0014|nu\u0007F\nHt\u0003s\u0005\u0013\u0000M­\u0019ɥ>C\u0011\u0003P\u000f?$\u0000\u0013&R]\u0000x\u0001uZ\u0011f\"\u0016HG@C\nPB\u0011PFu c+\u0006jVc1wZ/GE\u001c?\u001c߿'L02\u00014#eѽ,\u0006}\u0000ԽC\u0002ȁ\u0002z\u0012؀,`o\t0r+\u00040.M\u0002LF\u0001n=a\u000f0h\n\u00173T\u0001:)צ$-ǟ\u0005QgރHØ%]HcÒ}␟)kJQ_\u000e\u001d6 w\u0017\u0007lU\u0005lcFk\rpH\r\u0003\u0013=\u000e\u000323\u000f`G\u001f\u001dU\u0003dW\u001a\u0011~YI&#\u0007\u001aQ\u001dDLÆ\\`5>\u001cxs#R?aå4ϟg_h[ p\u0015\b\u0000o\u000b@\u0010,\u0010E\u0007\u0017w\u0007\rG\u0000~\u0000Y\u000e\u0001_ߤvYU\u0013u\"c\u000b\u000eʶg\u001fN30b:Rq\u00129\u00137ekX\u001ft\u0013\n~N\u0000Rm\u0000րTxXrz/ Ѧ\u0004$\u0001q\\\u0001\u0005B1Dn\u001dn1n\u0016\u0004\u0006-,=AiM)R9L\u000e\u0003YVH@\u0019\\A%\b(dF7\u0004PdITq\u0007@QWs37?!\"yZӬ Xms]\u001bΑ\u0017Ms.\u0013+9\u000b\u0016NM'ա\u0013192-\\@w\u0010\u0015Z\u0003:}\u0001^\u0003m@Oy|~\u0000{Dā/-wO.ڭ|A~\u0006gl%\u001an9Е\u0003ּ1mN9estFz4^\u000eE&ZLTr{iWDΊ,64\u0014Z4\nK\u0019jwSݜ\u000bv.4\u0007u!^}!>w\u001bV?gnMd99t<8RQ3cf̘OAW4!UjlN\u001a\u0019qn\u0016q]ԇC6\u0018|j\u0000O׾\u001e޲*fV>umڊiN&W.ͮVF\u0016psF;\u001f^0\u000b@ԜA\u000ec\u0010F#/C\u000e=0ȼs?rА-sG.-).)4rZqZnOٽM\u0004\u001e\u0018ZaI6il3ꦵo\rR/o\u001aԚrѽZF\u0007\u000b\u001e;[f\"*+\"o\u0014sˌ>X-\u001fm5x\r)\u001c=\u0014[ע\u0002yq\u000bA\u0000!b5+v.M&iF\u001aش\u0011Wh:;S\u000bj?1\u001d~+Zꥳhzm~\u000e[=J䒬r72\\\u0016wLHnwBuS(Ux+ǣ\u0012J\u001f/8~СR =ܶV>Q\u0006WY\u0014_$\u001f$\u000b\u0005}\u0005\u0018Qd\u0013\u001ay_B\u0006\u001cξX<$qEa\n(̾]\u000bNM\u0016H7Sn\u001bN?4ͺCė$\r^\u0001\n\u001eyE\nM\n}\u0012QVY>\u0019\u0017s@kWR8u/\rn^#KҞ\u001e}O''WTҐ0%}\u0018e'[W-3\u0019Y\u001d\"?.i\u001dH\fu\u0012QF@\u0011}gCCYgNk8'+\u0013O\u0007PFCǸ{_\u001c9$?Y:u{BfѾڞ\"36|5mS6\r>q\u0016\u0014A\u0005&e1j{w\u000b'}X>ΰrF\u0005-\u0011vQKdXt{ӝ*;Ҧ8owqj\u0019T_3\u0013\u00155+n\u000e1|yc3m#pǡLGۻT=,G~:4,u\u001a\u0017m{ɓߘr%\u0019\u0016iȞ\u0004\u001f̊jO\u000f>%ZXT\u0012[]ɘE\u001b~`\u0004V30O\u001ef\u000e\u0003]34g7Z#jn,j`Tm~ה^Pz\u001cky\u0013~-wd7\u0017leyOpe\t\r2cilf\bM\u000f//=tn_]\u0000ߊ?FN5\u0019e5^t],۪F=\u001d\u0014^eQ_uC\u001e֟}ّŹVҤsHaq\u0012:xb4b4fb4b4\u00154\t\u0001A%oZ\u0005d.yҝY\u000238&]~\u0007U\u0013G~^\u0015+&˯\u0003NDaeG(irXS\u0004CMzCG͍/boUXPTg\u0002\u0005\u001ffnC|?<K<KQt<ːN\"jYOk}\rZ\neTK<\u0013ʓr@9nf~x\u0010H;QW8\"r\u001erS\u0005\n4q~3\u001d1|]<>\fnd\\X\u0002N\u001d^\u000eѭX(&>l&(\r&=\u0013_Y>I8Z0[[\u001cghYFu2MWCvc,e_ka\rKTEVB\u0007\u001b\u001a5~+\u001dv<\u001bv\u0001\u0019\u001dp>9!}g1\u00107b\u0002c0W$3\u001ddd3]\u001fuE(-{\u001a\u0011(j-)$('F~3\u00025˞m;\u0005|p[?^I>>\n뒿w9|f\"\u0013ڒ=ϳKϮX2{dtr\u001f΋tk7z\b\u001a&Gy\nҐ&9}\u0014gd\u001f_\u0012D~Z\u0012D\u0013ϡ\u0004ae-E\u001b\u0002m钺Ôf\u001b*W߬\u0015W\u0011{i&r\u0010GLW$ƌ>L\u0018Fiz[R\u001fFoD#FAnCΠ\u0016Ffw;XOȟ\u001cAFu|A&8\u000fn;lWC0*\f*\u0019!m.\u000b\u001eQJ\\e^c55\u001c~K\u0005md[ָ\u0011<?\u0007M\u00078\u001dPCAք)N\u000bb\u001dl\u00028\u0011re\u0010/\u0019\n]\u0019M\u0019+\u0018M\u0018/8G\"hUPI\u0006\u000eX\u0007ċRz\u001390\u0013hFXbSd.ER)l%El,L҃\u000b:OXK\u001cCWC\u0014t\u0001^G{-:jt]W/DT9\u0004\"\u0013\u0012N\u0005kg胡%$w=*A`2QD4gMk&\u000b>vAJ<.#8vºY:Fc,Dm[poh&*\u0011U\u0010]x\"^jԭj1L1/ȅ:7#XϩEKx\u0013=yƟ\u001e{^J\f\nb\u0014o\u00149rG9bz,\u0002>[xTT|\u0018}\u0005:8c9.uBQN'QNWG<\"ՔbG)X\u0011yME\u001aj\u001bw\u0000\u001ail%\\ǝZT\u0015J\\Y\"\u001dt&\"0MTѥ\u001d\nzu;\u00165\r\u0011Ko\u0016,~nIx\u001a=\u0003(d=⽺7DT7R\u001dL#\rۊڑ\u0002ڻvp\u0001ڙ\u0001Zyf\f-;7t\u0003#<\u001cӑ̄yB<.SS+)=j2,\"\u0019V\u0004\"qsB=5qђW\u0011w?\u0011%n#=r\u0006z5\u001dim\u0002TR\u0000]\u001aP)@7e\r\nЭ\u0004\u0000ė\u0000\u0015\u001f\u001e49Uɔ\u000f9¥\\@&5=?*o\bN!cH$\t\u001e۸-.7\u0016Ϧ\u001ai\u0016D\rh\u0002\f\u0017WPNGer\u000f(\u000b\f\u0001X\u0000X6\u0007X}\u0003,\u001fA9f\nV\u0010\u0000K\u0015%>HN\u0014OrVra6|6\u00190<L,6Fv0\\;lKr\"v!g!\u001ar)G^}P#\u0012ij\u001a\u0004\u000en86\u0014o\u000b03}2O$\u000e\u001c\u00145S}.zwbp\u001fV\u0018`d\u0000L\u0010p\u0006p\u001be1#a3iRz\tez+6־L(!b\u0006\u001d\u001a*~2v>V$0AJ-\n)EO\u0001\u0006\u0000\u001e1u]\u001b\u0006\t\nA\u0003O\u0012.~qG\fg\u0000~=\u0001\u001b\u0001/\u0000^{9\u0000ϽH\nUh\nɮ\n'\u0016k:l\u0016;]q\"bG`a\u00129X8JF(\u000e)}W\u00058\u0019\u0000WK}\u000b\u0000}r{\u0002\"à̒P.\u0015@k\u0003([\u001e\u0010\u001a\u0010E\rĦ\u0004\b\r]u\u0002\u0000'\u0001~K7<V\u0017,فe^\u000bϱ\u000euݓkd&R\nf9bym!̈h\u000ez\n\b2j\u0000Z\u0001Oύ\"3 \u001b|L\u0011(F\f+\u0007t\te5\u0001d$\u0001pv$\b * \u0017\u0007\b\bJ\u0003<1a\u0015\\vL}\u0007NSpʣi\u0012%ׇ\u00031덶xnT|2[E\u0013چXE\u0013\u001d@܅5 = ;\u0005ӂ\u0007H}\u001a!A%W\u0014D\u000b4\u0014\f\u001c\u0016e\u00164&L\rD\u0013'\u001cD1\u0015s\u0004z\u0005T\u0000]̳㊝\nSC.ˣq%9ʱRszD\u0014<\u0007\"f4yD\u000b$\\AAth\u00056\u000bR1\u0010#4%\u00102-\u0010\u000fGPN<+6\r8\u0015R\u001d\u0010K\u0000\u0015ĐS;\u0018=h%\u0010=><^cʟUYʉhhǺ׽]87lHsƸ#OЌ^(\u000f\u0010=_$\u0002>]yf\r}2\u000e5\u000bR\u00055\u0005;\u0004\tPa\u0000\u0001 ~ c nrP#\u0010d\u000b\u0007\b7Zu\u0010\\tMU21D<qr:\u0007C\u0000g&\u0017}$;?>=\u0010+CF>\u0002\u001fÂ\u000e\u0013LM2iE*H\u000eH\tHvm\u0006$͔\u0002\t&)=\\R1:H\u000e\u0005H6f;, Ļ Z.FZ\u0015عyt4G\u0010\u0013j\"\nB\u001f:\tЇ\u000e=_{S\u0003I\u0004J'O?<&\u000fҵCVw 0=>pv\u0002H+!H*H(A\u0003i,6\u000b\u0013\u001f''S\u000b9Hݮ\u001aH\u001d\u0016C\r}ՠß3\u0019ku07|'}\r7H WCPy\u001e \u0017 \u0007=nW8&AM\u0012ds|Zq<\u0012'5]Ėi\u0018GυA\u000b3ڽ_ӎr\u000e!DXb\"|?砺DX07Yz_jCuQ\u000fS{%\u0016\u0014V\u001b\u0007\u0014خ\u000f\nm<\u000f\n\f\u001f\n;:\"\u001f.S\u000f<\u0004\u000b0\u0001:\tIB\u0019BvHSaqajoP#w=\u00192\rVl\u0007\u0017;(7IP.}P22(\rbplx~}aOы7\"MI\u0012(uM\u000b\u0003I&/ckoNa%hg֞M\u000fŵ6Z\tyș~3Vy\u001b\u0011=\u001cmL0ϣS[и\\K-^uX6txGqy\u001f`w}\tE\u0019\\CC0,\"+s@#Ћ#ej7s?\t\u0012y;\u0010E#Uwz)}V~r\\{\rI#}\tr\u00128$0IGO_QCX\fPC/l]zJ%#)y=m)UmA.\u001b;{*8O\u00151sXI'\\\r&,q1!Ff0Z\tM'#>L]nYlѓ\bF2J6\u0016\r?ANSE~\u0017s{G\u001af>\u0006Z?L^d9{Zszc|zWJrY/r|\u0011˱*\u0006\rmZk}\u001a2Č(=w1n\u001eǂǺ6>K0?ONXj5q\tI#\u001a#aء<\u0002\u001a>,|`XH\u0017\u001aNΝAq9\u001fF\u0007F̤kC\u0011vP,q<=9.:y'b^|\\Sl*;|\u001aPE[*\u001fhl|\u001f.\u001f>~_z\u0002^<(,Q;n-g\u0002퓕O@A(7MK\u000f\u000f5C}[@뗧P4\u0000\rZi\u000bKv7,w'EًX3Nگ\u0005\u0006v>la*\u0011%)MȽ\u001bx\u001eMy*#a}@k$\u000eLޑXwh\\\rH!P;0>-r{Q\u0013kP\u0016砽g-WK/Z\\ȷJh]jҬu\\w<\u001apks\u000b\u001eԑ\u000b\u0012lP=Suq:j݉T6<l\fc\u000fr\t%̇\u000e]&[ˇM`) F\fԵ)ͤ1(\u0014~\u000eʲRGz)\u001aZma<FwPcJ%.Yy-gPZ:YHi1(K.\n[䦏]h^b)[\u0012\u001c_\u0012vuBʖ\rm{ν:,bF8^*a#tL\u0013PZr&2ȔNƬ\u0010&vJ)\u000b\u0018b)\u000bv=)ۢPMǥԴby7+M9MDvU\u0016s\u001a}͵Nݰ$(\u000fߋ|6\u0016TkX\u001c:Σڗb\u0015]]\u0017K*x O/V&\u0013>j$/S%,6i$k\u0017\u0017\u001ci)^\u001dufW8*g!\u0013C[ nd@ғaHOFb\"=\u0019f}cMM\u000eņ?bU\u0006e*|uɃ^igTϵg=tnW+kU\u0014-!۫dYYe\u001c\f\u001bw&\u0006Fhz3IPL\u001dH͇a*\u0013[0Փ\u0019\u0007.gZ½ZuK{\u001d\u0002>\u001eWz1VR5>Y8\u001953޼kJzҎ+$\u001aנ\u0014*ةyNef\u000e&O)\u0018|y&ܽ$1(elܻPa\\P.^-MǞ\u000f3\u001dV?&+\u0005#&hN{l.jz\u001f>tMj]r\u001de֑ں<#bݖʆ\u0018R\u001a\u0004'%(\u0016\u0011\u0017e\u000bc\u001bwzd\u0003O\u001an4\u0006p)pգskDۣ\u0004VƑ43F\u0016W%M˒C˦:Sh ]^vhQ\u001e\b2ܤrM%YXF2#qGCtKrN)(Xb\u0019\u0003S\\ꩄ\u001em\u001fs6.rƃ\u0018I\u0014\u0014Ff\u0018%\u0011;{|((\u001dJ\u0005sh|[)\u0001\u000fSPIi\u0014j\u000f\u0016\u0017g*E\u0014#Y8xm7fcM'E\u001a8\u0013h\u001eF1tϑ~\u0014H\t,Ubtbz:hR9\u0012÷\u0007-o\u001f\u0014>U<5cĨyQ;\u001eò=\u0004řb\u001a`z\u0017i}\u0006\u0017WgI_\u000e}4\u000e$k[^ƌE(\u001d4i\u001c$)\"\u0005MC\u001a4C\u001a\fOMN(d\u001d+F8\u0004˪$Պ\u0013L!ʦH\u0001-\u001c[\u0004\u001e\"PEDFșHyx5kE\u001a?\u00163\u0019T.\u0012{SKq\u0019k[lGhr4Ě\u0012$\u001a.\u0011w6ϐ\u001cO9F=9F\u0013\u0019\u0016˞\u0012\u0014@/>lE#\u0011wJvD\u001en͉HՏT\u0016Nh\u001f)|HF\u000b+A*ZxFW\u000e/hlFOTb!\bQé0KqN_\u0013ȶ!cG19ǲO^V(#Aq\"\u0018VRdZH\"*D\"\r\u0005Q\fě\u0001\u001a\\!r\u001a k\u000f yG\u0003H\\j,W\u0017/~6ΩS:Ix%&Opˑ\n-Dqx!\rE\"\u0013\u0018Vfr\u001c\u001c-\u0000\bW<g6\"=e$u\u001e6@ˋ\u0017кo\u0018\u0004W\u0011>򂨖\u00004\u0002DΌ\u0000\u0002'\u0000a<6Xܳ%\u0011qg9MrU\u001e5\u0010<f!\rM$j\u0002C\nO\u0017\u001bB6s RHz#\rlE\u0003^\n\u0000q*@Ai\u0005;Cy\u0001\u001a$<\u0000Ms&\u0016\u000fPL\u0003\u0014\u001fBv\u0006%,P\u001doW0\u001b>=/hd}_Zpqy k%Ƈ\u0013Ih4C9,I\n\u0016P:\u0002\u0015\u0005кB\u0003tp\u001c\u001a\u0001ew\u0001#\u0000U4@\\\u0013\u001a~_\u001b9\u0000p\u001fx\fЙ\t\u0003@B*b^Gc,;l\u001faȝFcƐ%Xxΰ+Q=\u0011\tkHab\u001bR\u001bsTϑ*\u0013\"`z\u0004\u001e}\u000e`xf\tBY\u0000K\u000e\u0000$/3\u000b\u0005\\\t}蜲\u0002X\u000f6^\u0001,f\u0001=~\u001dng\u0005YW|xLTۇuLS\u000bF\u0014J\u0013N407\u000bl.(,?hd\u0010\u0011:\u0002v\u0002\u0018v\u0001VAY[\u00020;ǂm\u0000O\u0000\\\u0012`z\u0001ʮ\u0007c\r\u001f;i\u0005W\\\u0013`jK\u0004\u0018|\u0000lک\u0015\u0003\u0016Lr=\u0007GK2u͖hovQX~\u000fX5\r\u0011~\u0006\rC\u00024xG\u0016\u0012\u0006\u00068\u0000\\Y*ܠ\u0000Z1\u000eE-\u0003\\\u000f\"\u001e\"A\u0000|u\u0000޷\u0015׭wH\u0017\u001ac<\u001bۜ\"a_8l71t\\i\u0012L\u000e}h.azb<'!f8\u000et\u000bm\u0016b8\u0010\u0000Θr\u0001Jۀ\u000eˇ\u0007\btq(v2\u0002!d(94Ǔ\u0018 > )\u0003\u0010TP=\u000e\u000bgRI'w˜G\u000e|CX\u001ecS\"A\b8/BhX]\u000e\u001c@\u001c- \u0019\u0007i\u0005\u001aJ|BV:\u0014\t\u001ah\u0000J_\u0001w#@y\u001bq\u0000$UYJ\u000e.\u0016Y\u001f9[^g\bb%4@k1A\u0001/DD<{\u0003D/\u0011\u0014S\u0000Q\u0006\u0007Q}\u0003Q6\u0003yf\u000b5@hbgU\u0016\u0013#|\rk'bʥ\u001aXI\tvW\nO\u001f\u001a[>\u0013f6t_+\u0005I\"(5<l8\f@.@|:@:x@<\r\u001f \u0018'\u0001\u000bb}P\u0001YK\u0018/>\n\r\u0016=GAw`J9#Jv\u0004}\b\u0007Sh:[\u0013'((\u001eV\b2}fBu|R!4CWr[ AfA) Y\u001dmA2s}dJě耄{AB< ѫQSlL<\u001a\u001e\u0017L9\u0003#k-\b\u0007VCǡ\u001a\u001f9-6Yg\"Y\u001a\u001f\u0014|[; m\u000f -i\u000f^$c ݐk \u001d/ \u001d@jo 6@Ry\u000eDG\u0010R:$H\u000fR\r-?L|p||C#\u0013B5,ej\\-\u00009rV\u000176\u0005R\u0007i>:e?\u000big\u00022J4\\48\u0003*\u001bq}cFy\u0014\u001dg!Sh5C74\u000e!)\u001c4ς_ްjn谆0x.[O@a5W@P($(\u0016ۤ\u0004\u0012f\u001fEDP\t$hy\u001f\u001e}ZX\"$j<\u0010q\u0015Jh\u0006̈́9e)͂\nvkb'~\u0006兊r\\\u0003y\u0001Jb\u0003J\f!OR̕Lι>\u001e5K;ް\u001cS,\u0012t\"Un:U6ߛE \r҃+\u00156'ӵtX7ջ\u00136igyz\"\\dOLv8i\u0017ޮM}$|Y!ݠO\r]f&c\u0011>G[=H \u0016EBNl۬{Uh2|e&ɬWەvx;kX/ӓ׋[\u0005y^J)j\u001a;x_\u001f\u0002\u0017\u001d!v:pݯ\u000e\u001clb+\u0002\u0007o\u0019t?\u00138ķ\u000e\t\u001cl[\u0007\u0004\u000e6\u0013DTw2S1z2\\\u001e.\u000eXEHYP\u0005\u0013f%#{%33n\u0019:YhkQG \u000ba`UYEc#\u0010\u0018C״~\u0005h[6;\u001e;SH\r\u0013{5\u001a*, YMnDB+]\\,2]\nkUCy<\bF\u0003Qn圶{)V$\u000e\"\u0018y6\u001cY-\u0014U\rZ\u000fY?La{#\u00014<U\u0016\u0015\u0005cgnv؃}DV[YAJw\u000f\u0014\u0004'?\u0007o\u0007\u0015CQf;\u0015㼱!\u0012O\u000enH*˨\u0018\\֒Z\f+ƭٽn.|W\\\u0015((G\\o\u001bȥ̀S\u00186zi!h\u0019`wܩ\rm+$Cr\u001cE\u0006i\u001bNJy\t\u001cf[{\u0006\u000399M:7-Ћy0ŻѼ!NU\b{:\u0011\u001fFCtX\u00171\u0004Q[Q\u001bcݒ7\u0019iI\u00078g\u0011[X5s;֙4o&zG\u001f`1كڗglƝ*\u0018\u000fP@\u00137xFn\r4l&5e\f\u0003s\f\u0002ZBJ/\\\u000f\t\fòUS\u0006߭k0\u00019z(\u001a\u0014bj\u0007\u0011ƕtL0\u0017\u0013Hi![\nv#;>Ӝث\u0005\u0007\u0007C\n#-jc\u0018\u000ekO=u\u001aauL\bLJ%Z\u001c{)A.\u0017RpL\u001aY\u0018\"?8\u0018X&j\u0011I>J3r8oN~I6Y=\u0018(a\u0015>y\n\u001c\t)plRK]7S\u0000\f\u001a]=p\u001b\u0015M͂;\u0019\b2w0U\u001e-⺂G)/\fdp>X@\u0006\u000e$lb<42e\u0016n0'\u0005L4뜍-c;lkxQv&Qu=\u0007?Oe\u001dJ\u0015\u0017!,nG,ť5\u0002\u0007Q/+'lQ7h?\r\u0010}ksf~stH/{{\ro5!\r\u00136{W\fo\r)l7ܛ_\n\u001fr\u00063?9\u0004+7pk'P\u0019\b~o\u0010ؿz2Wh\u001fj0\b4pѿ;\u0004\u0017;\r\u0016`\b\u0015(BIL\t\u0017\\:TB*AT/O\u000blo[\u0002ya\u001b\u001d\u001aq)\u0011,ںOw\u0010\u0019բ\u0006[\\|L\u0010R!?@T\u0014\u0015\u0016\\\t_5ow=\ns3\tPuڪ\u001e-ko\u001d\u0017a4:5x^\u001d#Ra8\u0003K^/\u00025|\u0001o`o񫡄\u0007=<B\u000fߪ,BWM\u0018ZSsV02`@b\u0006\u0016|qi]\u001ew\u001eۯ \u001d7vi\u001d\u001a{6vֳ\"yOJ1\u0017ҜCc>\u0006\\m\u00022)>]xe\u001b\u00179P`3_Ȩq\u0000Tfwh׭۫\u0018^ݳ\u001e07${͛\rN2\u0019V%\u0015NcYޖ=f]\\!\u001a9<#f;hz-By8Q{=\u0012V\u001c\u001b:Z~\u0010S5-]s)4A߈\"4/\u001di\u001bfjW׿P`37r_\u000bYF\u001b)lqSY\u001e\u0006[4GjhC_*\u000f(MgA\u000e|\u0017i8R>]yh/U`3#҅\u001a]W~RL\u000b.\u001f\t.RVJ-Oc[r\u0013`\u001dxe ;8fZL.e|>\tomg#n+{;J9U5ڦ4P;ӆFV:rO*+Q@Jpc+;n\rfYP肷f!Vގ*\u0013y5t0\b/\u0013L9D7|:lN.nsh\u001dMn8\u0007YX~̌\u0005-\u0015\u00127Ľ\u00157FZgfz\r9\u001cH^\u001czA\nĩROox\\AJ?1IYɒf݌@\t3?f\u001f\u0010a}(u\u0016][\u000e䌮YTOIW_.#gAӾ-6\u001a-߫-v#:3/b24\u0005P$͟3;\u0014Wˊ!jg떥\f蘦Te㢿tDӂ\u000ey\u0015/\u001a?w!\u0013iy۴Y0s3j'\tn1ϾA+Y/|o\u001b%+sL֋8\u0013Ǆ[ h*WV\u0016]B9{Q\b)'Cv.[żя-fN\u0004{oYb^6rQ\n.\u001adbƦ\u00039*sثS6h&nugAU5n1W\u001e=oX9\u0016\n_-w\u0014\u000f^\ri2Q:s\\o#\u001c7I*)P\u0000ۚxL+:q\u000eU5OY/\nOe\u001c+I\u000eo\u0019\\YoٛB\u0006`E\u0019o\u0010\u0006Cͯ3h~\u0019,~o\u0010\u0006wo~K?~\u0006s;\u0004~&{{/{z\u000f\u0012Қ\u0010pOJ>̆\u0019\u001d>@@uU\\!jl+k\u000e|\u0004{u\u001c\u0014\u0004q\u000eQ3x{!F`H\u0007 Ŭ^/CѾfFb\u0010PS;l*\u001dO\u0019٧W\u0010x~fuAT}L/\u0010\u000fPi\u0004)Ӫ)׬]p`4K\f\u0011_'\u000fuXs{W6%{6\u001co9W%{Q_fAଧ]JghV\n8w\u0001gd\u00029\u00105~1d\u000e1\"3cK#K\u001de/eۼs\u00055-c\u0010\"V\t\\:f9(}^{\u0018S߯W\u0018\u0006Q,\fi2\u001aK\u0002r\nbDc(PWw\u001eq\u001cQc0J\u0005M\"И߿F<Ƃ1}ATu⎄~\u0014D!jʀz%\"1QndPuPea\u0011]^-B̈(\u0004_|xmRla쎌*װ\u0018䴳\r\u001ea4D566qup%\u00160\u001b\u0006Z\u0011q\u0004൞$|:swIZnݖAy݇Giv\u0000N:\u0006\tQex*nܼ6\u0018IeP9k<G*.4+g9ޅ\u001dM\u000b\u001b<F`f\f\u001c\n\u0001D։pNxZЭքT=\u001281u<Eq\"R\u001fC\u0004%]8k황-o\u0012iw7;V#\u000fe=U\u001fѭ]OGȹHAG\u0019rg}\u0018#3Pg\u000e\teZ\n/jwbOޖ٥z\u0005\u0012\u000e})K͗tތwhm:AT95TMD[9\u001b%\u0001\u0002\u000f\u0015Fx/o'&SI\u001dg\u0012\u001bv\fOcRvդ/Az/\u0013\u001b޺Z\u0013,ƅf=Y\\L6QM9hÊTe\u0002Ƥ\u0004Ъ\u001dw<VZ,fV\u000b:\u0017S\u0003wN~ڿ|re^)E[mL\\e;SHe\u00049O^f0\\\nEx\u000b;J+.Ini㱧җ\r*QV?\u0007%p9P?Ew#Gw3WMFެ\b|\u00045N\u001cܑO\"qM7ɋ\rcM\f*\"7hHt\u000ba̭0\u0012/\u001c{_̢x+`m2gŶB^\u001cı\u001d6V[qN0\tQט9^`vm\u0004OU\u0003;|W\t_n<xh^'#&m<S.L29[ދ\"\u0019t%\u0002z*7\"\u0005ޤ8'HI\u00056xJL\u0012;ye\u0004{Ǜ#=m,\u0015CEbntU.\u0014\u000b\b\u0014/@7>\u0018\u001d\u0002\u0011mK\tG*GU؇;iB2F6\u0011Ɯ26r\u0013Hva#.'G:\u0005\u001d2\u0016tvb\u0015&Ӭ|Ӝdr\u0014\u001cA,Umٹ$y.fr\u001f\u0012[1J;zU '@يV\u0002\u001fJ\u0011nD\t5.vYOƳ62s_X.B\"Ti{Nc*7_Ґ7\u001cdcL?/UEp\u001f\u0016F-ۍt\rW=A;eȂ\u0015HE\u0011tR;+<7\u001c\u001cәޯNg\u001d2?lj@\u001c˴HZ؄W\u0017qqw6]\"z޾e9.Ƨ\u000eIN6Iz`lF'\u001b*?5\u0005|ax!S\"oy8?^~)dv<R(wni3\u0013lc]\u000fU7Su]yF}3\u000f!,\u001duuI8ꑑ~\u001bs:]W-\u0019\tYo\f\u0016?\rJgQ-h?\r\u0010\u001frC\u0005ׄ4XI{\u000bP\u0010\u001frCO\u000e\ni0\u0004~oi0\u0004~g\u0013Qjm>w!`TRc\u001aY[\u00153ՐmYoYɓ\u0010דf0YܨuW\rPO̗ʈ'\u0012\rg-g\u0018D]5aH9\u0018PDV\u000b8aHͥ\u000bF\u0006\\6$k#E*GjWli\u0006]qY.\t\u001fj0Ņ~.\u0010u\u0013X=u5륽\u00167ͤbW\rgV߯F}y7^Rv^\u0019\u0003$!\u0013p\u000e\u0019\u001aD\u0006G.pU\u001e>x>4+94\u00047u\u0018Wnjtֿ)c\u0010ڼ\u0011e\u0011i˝&T\u001f6:\u0019EY\u000e8'A\u0003\u001cxS>>:y+xP&C7o9eqL?'\b\u0012\u0018]yO:g\u0019G\u0010b\u0004\n]'ۿ@\r|8^\u0002\u0004^[#\u0013_Q_Uk#A\u001f\u0016.|K\u001cF}}\u0002\u001e\u0005\u000e\f)7\u001f\"pnW\nJ]\u0004bUI\u0016v!\u001bQW\u0007\n([\u0004AXr$Ev\u0012\t5%q0O\u0012\n%F0`\u0007Q\u0000rJ0\u000bo\u0017$,\u0005z\u0003S\u001d\u001d2]\b9[\u0005No\u001d\u0013k\u0006\u0011\u0013Y:\u000fexA\t\u0016kx2+pWr\u0006\fub.\u0005Q'\u0016\u0011؝HmШ\u0012j`\u00112E-\u0005ryy]y\\\u001492^\r|h6fo6'^~F!Or\u0001`{\u0016S\rp\u0007k\u0017qӪh\u001dگ# quM\u0012HSy}F]/N'f{\u001d=T[vU\u0002w?\u0010\u0007jax=\u0019&۽W7c*\u0007u)iY5އ\u0019\u001a*\u0016.=Xx,צ'z^t;\u0018l\u0016Yz\\Q\tn?#A:-PQʽ{՝m\u000fbZ66DɅuF%\u001eW?x\u001e0]76+&%\u0003nQ֡nT2Hng_;\u0000,8\u000eFν!b^ǎs\u001a\u0016bdaifCk\u001e?<}.Jz$D^\u001bT\u0013\u000e9}URsiΥa\u0012iGYoN\u001frЯֽ\u0016\u000f<W3X[efӱ]/eh\n[eGo\u001eˊ:\u000b#lo\u0010iI\u000fSOLmTaxj\u0016\u0014K\u001e>\u001aZ]\u001fs\u0015\u0006\u0017x59DV򢯝p\u0015F{9:&Sԙv\u0004.NPt~.xa:¬5k\u0006y\u000fʕ<\ruluLܗ\u000f\u001br:&>fs9ɣ\u0019)r\u001aR؉38\bȱ\t`8u%\u000e}j^ Ñi)7k\u0019opo峣\u001c\u001eK`\u0001m\u001e\u0005*r+XW|\"lY5(ʚsԇNzd\"r{h\u000fM\u0017=\u0012\u0019v\u0014}f^Lk*̬\u001dJ\u000eu\u0019u7=!HT:%$y6T$-nTRewF\u0004\u0001L5'uLv\u0015ftł\u000b1S;d(k3=\u001b5i*\u000b:\u0015J\u0010?|Lv|>{^_vjV$O\n\u000bc[_;\rߤŸ\u001c28\u0017\u0002}M=9Dod\u0003wbޠ2;\ty/V0!S7v;O4\u0012J0h\u000b#\u0011b,P{Psu\u001cďNa7r\u001c\bG\u0007'6\f\u000e6~{\u001edz\u000e\u0017A'=\fꚠF6RLޯs#٠Ą,コj\f^I=Vz\u0016f\u0019[99뢋\f[\u000eԄdk.\u0012hwoMs{Wl_\u00056- i\\b)\u001ebB?`nx\u001dnf\u0017Y[Oc\u001b7rL\u0002\u001dgZy|\u0010Qb\u000e\u001bZa\t,c\u0003O\u0013\u0003<\u000f*~k)(w\tlo[L\u001b$\rKcXq\u000b<.$^:<ם\r=썩<q\u000fk(@%v}v\u0005u\u000f\u000f]mܺ}\u001a,\nd2s\u000ep;\u0013/(ψP'?}#~\r.^;2ߵLa5v3__4&wv\"]SUO\u000efn\u001e69\u0018\u0012\u001bChɨeыM\u000b\u000e\u0004뛿no'o\f̔E\u0006 7p\u0006Ϣ~\u0003'l7\u000e\t)l7_~\u00194{{?\fVҿc\btH!{{@4\u000e\u0001*祻\u00153r\u0012+}\u0003\u001e\u0010uBn={}1]dVxFE8i\u001f!y_5pҕ+՛CizWXA#\u0018g\"$e!\u0000 'Qp\u000eY)8N+{Viek]\rA{栫U7W\u001e)\u0017=\u0012<M\u0017J\\W%vU\u0002w?\u0000)0\u0010U(\u00040\u00125r23[̪r\rYr\"CG·f\u0014\u0011֙\u000f\u0015pH\u0014K\u001f~P t\u001a\u000e\u0001F5NV!jֹb{{׼sKs'I6a-Mݿm\u0019\ruum2<H\u001f=kh1uU;T\u001bg\u000e$j-\u0004A[2\u0007\u0005\"~fq!-`H<gII3'H\u0005j\u0000\u0003CW3kE\u001dT:7t\u0012籧D`V\u000ebyl[\u0002K>\u0014\u0019\u0010~N1\u000fUn>mi7\u00044\u000b9_\u0011PS뮧MƘ*S\u001bD׌ǲ/C~:8m~P 4\b\u0010\u000e\u0010uW\u0003u_P{2\u0012 \u0017{\u0007vwrC{w9we3ޕĢӝ(,\u0016\u0007guVY\u000bi'|C\n9W?9$0Pyƃ\u0015GtLGN\u0006\u001fa\b\u000fW\u0015%g@\u000e]r=\"<{;\u0001\u0019\u000fqu\u001b$X濠+\u00105m\u0010}Zǁl=f=\u0006z|D\"L\u000e^/(n\u001eK'֩Om~P \"s\u0006C }+AUm\f\u001d:\u0005۪\u000b\u0010_\u0018H%4{X]^눠7\u000e\u0011\u000e%l6=3)V\u0004&\u001foU>Q{|r^l;t\u0007cm\u000eef00V7\u0012x1-\u001a+\u0011JG\fW\u001d\u001fYve\u0015$]8ʬU,տn3*S3Uq\u0007<x!\u0018msXӰ\u00011\u001b%\u0001\t8D\u0003\u000f5\u0012xOQJa.\u0017\u000fw\u001a4Cmb}:\u0004G\u000f\u0013d\u001f\u0014@Γ\u001fpf\f~7@G:&\u0002o\u001aevf;|n\u0011??A~),7E\u001a{tOE\u000e&%\u0010+-g)~R/wR\bPk;آ;\u0007=\u001ei2\u0015j0sB5djE\u0012^x|qvqdb\u00134{U&Z0\u001eNsi\\:~7\u001f3B\t\u001eSk;}A`č,\tǹo\rw2\"nk.Z\u0019L׼0w\u0017gБgҚDt\u0002\u0011#?K\u0000y.CQr\u001b?\u000eޚ-b\u000be٘{YwsNQ2\u0004k\u001f7\u0017\u0018\u0018ޅ)?k\tpb<;Ҵ0$O$~\u0016W j\u0006l!o\u0013*#Jt{{WCU;$UU\\\u0007#0g\u001a޺\u001fy_n8B\u0011Z)75}~#%؛Yh\u0006p<~9\u000fC;2n\u001d+z<e8i7C>]ND\u0005\u0005\u00114p\u0002U]|a^i\u001f\t\u0019W9c)~\u001aq?(7\u0003iU\u001ee}?\u0004pK>\u000br+bϠr|{>L\u0005/ɝ\nO\f_;\u0002]\u0007w\u001bl%\u0017u34b\u001f%\bڿ}U7Bױ ):Dk:-}NMDcۃc[Yv]v/ɝ\u0012&w\u0006ŭ(cُNޠΙ\n|EƧ\u0012n^Wu\u001fs\u001d|$2fCtm\nsZNL5K..\"[[4\b;gtPK\u0007f2o\u00169O3jgli<Xb\u001c\u0004\u001fSbw4#N9(YHoOZQ\u0002z!\u0005j\\ՉyRI>5\u001drf2~52\u0004[ʍg{\u001d03?ey2!;\u001dU¼f^%czH\u0011ŧgsL9oRu2\u001b}au֓0~\u001eS\u0018\r>,=`w^V\u0001}ÀQH!>w斉^{%P18\u0011ˊy\u0014\txc2VHu\u000e\u0018/r(\ryPW~K~={8&w\\\u0019'NPtVڞ֞^b\u001f\u0014wZl<āמ\rc-/Gwz֘\u001d烑6xu㞵Btޙb'}\\;33:[eOmkm^fcKv\u001bWWRmxf~\u0002\u0014A\u0019~:N)?\u0018~%qp]1erd\u0012}2_G;\u000e\u001b-ﬂ\u000frխ\u00029׷\be\u001dM=?|rr1yt]Z|\f?\r\u0019)?\rL7C`E{{?\f\n/38\u0017T;\u0000Qgw\u0018۱\u0003q\u0001*E9Ns2\b\f!\u00029*䌷 ,\nGwory8\u0004$DC5Knkç0\u0017?͓0\u0014rא\u0014\tBm\u0004I!͹3W\u001b{q vX,.:X\n\u0002)\r|s\u0007<\u0019\u001e!\u000fŪƝތ%Y}\u0005s\u000e%Tx\r\u0002)1\u0018R~d\u0011?\nj\u0019k+:Qq2\u001c\u00194\u001bd\rYoR)\f̃\u000e#\re9\u001b5p+\u0013P\u0018]\u0011F\u001eU,/oNBT}jB\u001d3\u0007\u001a'z\u0015\u000bP/;>\u001e!\rlU\u000fΦ]\u001c\f8\u001ae\u001f^PFכP\u001fRv\\er~sz\f9G\u0005ʗQ\u001cD\u001d^ɉ38v\u0001M],8=2\u0004\u000eɐ6QGG]'\\:m\u001f\u001a<eTΰAc/e\u0013\u0004_|nO4\t[]F-\trjz\u0004Ce}\"]HAt`B\u0006\tӁ6?*\u00069HiRF+H<{ݍx#R\r^!e\u000b*\tP#'X\"wQZ6CՎ}\u000e2&whk=Ȗv\r~~H\u0004iXezWF<\u0016LKi{ve]#&@\u0016\u0004\u0011 \u0019E\f\u0005OwES\u0010\u001aU^kf\ndwN\u001b'TC:ZĜ};!\u0019v\u0019TM^>9Mj@}6sOuTUKjpR(m'5ҫH.Jg7ǾЗ>nd\u0006/׏\u001f$\u0019I\u001f$,\u0001tc\u00185\u0017tTg\u000bn\u00131(VQբYWh\u001d\u0015H?B٘h#=zJ\u0015یߊaӜs'<svnQ\u001b*=f)iV1*V9i\u0011׉Q$Wϯ\u001d'\u0007\u001d%qFn`7^\u0003~:Ĺ=̙˗V?9k\u001cA19rrfUPQgoZͣ\u0016#O݋\u001dpvY%Ǵ\u0013W\u001cj5y\u000fh\u00128ζ\rϬUkZ++&WJLYFO\u0019t\u001ebv5)?>Y\\+SWrњϏ}T);9V\u0007Ly@N\u000f\b\u0007WLSlm\u0006;ό+tlfO\\b;\u0015\u000b5]s\u001cGU2`NVMԇвO\u001a\u001bu{uU_\u001f奨k(W~vrSlW\ng3\u0005\u0007w\r=6G'͜N3M\u0012#㐖ŘC(!\u001dO<V\nM\\39XU=eHD$\u0010IX#Yn֨ݨSBr١\t8S||-տ[Lٙ'I>\u0012\u0015\u0011y[\u001a\u001f\u001e\u0004\u0005PY;{qw'eVd\b\u000e\u0012H6Mg\u0012z\u0019N|Yx;ԉ\u001cO\u000b.96|rt\u0002\u0016).?\u0018\u0019}8Jw\u0005@:khH\bn7kk\u00102\u001d\u000b\u0013:M\u0002Kֲ)݄wZ֒N9Y\u0011/\u0003#Hd J!2Ed\u001adIL^?\u0013JtysOd\u00067$uLG(k\u001cm\u0007k.}o=-4\u0016\u001duߒNr|JL\\ͣ\"g#.&_>쿗\tc~bN\f ɽڃ\u0017|>gfcaZRVDr\u0004uQT39J{뤄^ms5y\u0003\u001762uؔngK89\u0019\b\u001a\\\u0002ŮVТƆm\u0007Z>Zېpء\u0002.cĘ\u001cz,\t7\u001etRIgn\f\u00176岒l1=#\u0001\r\tQ\r;F=TN{uݜ\u0007\b}<K\u0007X´/͙U)qe.'*durɦI5grlŦqP\u0011R:\u000b?g\u000bh\u0004x\u000eq}'=f\fw9\bPJPY\u000b\u0012&R1\u0017\u001b\u0001%u.K\rw\u001bt2k\u0015\u0005ne~΋\u0014u\u0001ҡ\u00023wԔz\u0014bԎm2\f\u0003X\u001dcjO\f}ĩ'L\u001cpڞmjjYnMeqYqC[밈(ž\u0012_'?\u0010\u0004Ǔ7{LJCyp2;FSruIJfwd\u000fQXxg6\"R^ve\u0015\b\u0015xeˮױ\u001c0!jb?O%׉;Wo\u000f((\u0014{Z]\u0014x\b\u0019q\u0017Ω@\u0012\u000b+D_^mG;ow!\u000f\u0013_\u0000}+:\u0010M\bcH҇F\u001fЎC@{\r(xLճ\\llVZ\u0016\u0005jGX\u0019<\u0002̋2\u001bTNo4;\u000ffջ\u0018lh\u0011d/\f>\u0017%8-ͫGR=Ę\u0011\u001el jhOb۝r͟\u0012_\u000f-)&qؙẒEޝd\u0018qnRC>ܴ<c\u0007\u0002=\u0015da\u000eܩ3yg͖EM\u0019GO;YDr7Kq3g\u0012XdX\f\u0015x\u000e1\u0018H|\u0011Cv8.|n\u0003PyI\u0016bJYT\u001c\u0002չK\u001b3M`\u000bC\u0018k\u0014\u001eX.\\l3:!d\u000b09a&\f\u0005V\u000b9\u0011Աu\u001a>2\nj\u001bzj#٠9]t'\u001de\b{j<DȱK\r ۺl\u0006NZބxe|\u00022_Ku.Cyߒ\fqQi-\u000fkB?L\u0016\u0007e\u001f&):5hS@/&X*F#1i>Be\"\u0014\u0015K0`+p{Eǀ8F\\\u0012Ό]]\u0019jvMr\tZ:\r?/j̙\u0013@^@t@C\tLZzge^[H 7f@Ճ$j\u001d\u0003 [~)cؒuG㦵7#Ft\u0013D8RRHg-8퀺_LPO~pn-\u001dw5h\fcG\u0016VVFO]7\u001a٢\u0007IH[]wP2X?t4\\9m#\\[ObJ+ỒZ<2r$a/篩\b\"j딠1꽖\nR_꟡#٥i(s OhԊ4LOo\bOZٻzHz;rP\u001e$gxI&km?r}\u001fI\u001aYC_!\u001dݷv9.Ɯ{߁Y&fʒ\u001fq\u0006NFcVt\u0006ZY2\b3~j?;\u000bԞN\u000f|+)\u0016űA\u0013Ħ#ծW/%̟5GtC\u0004UGCBP+\u0015z\u000e|\u0006T[#Er\u001e^\u0003-\\\u0011~{%%)\u0017$6q,\t;\u0014z9xQi\u001f/N(WM\u0001̌Qyn/80\u0000s7\u0019FrRnm1}ո\u0015\u001dr\u001fk\nB0-\u00004\u0003ɦ\"wOMwȒ\u0002B$b\n\u001fg+9qW\n5i9f*\u001edͤ,σ~*\u0015V*@2xw\u0019-o\u0012>2}JXbg86$DėC\u000b>ݯ7ǯP5\u000bAbT*;1+&aPXZ/Vn^%T\u001f}H<Ԇfy\u0013G7@dձ-璱\u0013ow-wz\u001c'\u001bs\u000eMzD'yiA\\kJky֢Z'TEVWLFH㑄{]%gO}}hI'tNc?dR5=T7j|㖻r\u0001M.ꎼ\rMs\fIi\u0018Zo꾘{RAyD6&oaGB!/ŝBXq`y[\u000e\u001fHbt\u0004@\u0000@&\u001fg+\u001f},N<bg;֦o*\fњv/QWuMSieHemhp*n$)>3j5]{\u0013jG\u000fluToN'\u000eK:ݚ|y;{~\"T}@虄4\b.\u0005MM\u001bJ\u0011{}=c%)bGa\u001aA\u0007ǉ\u000e؋L\u0007@\u0007J2Z\u000bz\u0010@.N\u00011FկqHZ(ʜ@BseO,,6V&>Z2f]&Oh\u00157w\u0007\u0014\u001c.\u0015Tr))~HLSO8|ȓJbt%Q;>\n|]}p\u0016\u0015o\u0015W*vLYnŪr\u0015e֤K°\u0010p8}K:\ty7\bM%)[:\u001b\rr\u0004UR#\u0018\u000fH\u00004G\u0000GqHӿƜj;K\u000e?O\f+\u0016\u001dљicEd;(1(ֶznԽn\u000b\u0003?\u00008xXD9d)\u001eÒ?[O-&\u0000\\\u0013~\u001cҾ\u001f\u0000\u0011,@.\u0007EJ{Ն\u001e5k\u001et=zk\u0001nfI\u0017ZMI\u0012ӈb4\u0013'Rޔnlnm;\u001b\u001f;\u0014\u0010A\u0002o\u00144*tx39\u0017 2:\u0018޵ u[0!xd̯=1ӧ0.$\u0019\f\fXvcH˄Ԏ\rn\u001bM\u001cwp\u0007\u001f\tk̩LbN^9w)hy>]vAM.c\u0006\bpyt[\bS[ʭ\\R9ޱo\f]f#q9ˉŵ啗\u0015Ik\u001f$\u0002c\u0014\u0018U^q42A.l4lֲ5]?\\\u0013]aYp%\u000eR\u0005\u0018vEo+Ð`P:Kr\"ݔ'YyE>?\u0012\u0000\u0016@ss\u0004\n7R/0}Zf ֞á2f\u0007=DG`7\u0007ilAׂLτ\u0005\u000b\"\ntF8sTۭ<@(̮} #\u0001rn\u0000\u001amOP'fK\u0003BNI8h\"\f\u0018\u0014PY,G\u001ewSX|&y\\k5{W~pZe\u0010\ba\t&stW&_\u0013/\u0006\u001a\u00104\u00186c;b{\u0003\"\u001fiy\u0011\u0017jĚ\u0019g,\u0007B\u001d8\u0018=6|\u001b8~.d\u000b.\u0019QVrp\u0016Pi?/\"O\u001cN\r՚JUZ\u000b\u0019#\u001f\u001ah{?8i^7(\u001c]D5+s1\u001a2#xHPs!!\nkɄ\u001b%\u001b,\u00079%\u001fћ\u0002pQJ,?f5Էs]N8&HgY]Yy\u0000ϣ\u001b\u00181sLfWEQi\u0013Mik\u001a0K\u0011o2ҥ\u0019\u00049Wq'&o絒pGFA\u000fD\u0006\u0014O̡̚3\tmoU\u001b\u0017>lD)ߺ̭et\u0003P*[!\u0010բpL?ۑG.S\f\u000eYF{u`X>L\u0010l\u001bM\u0016\u0015Q\u00175;:e?r\u0012wq'}$ga\\h:\f\"\u000f\u0002\u001f@O\u001e)lOGb\\A)\u001e{BMLIu\u000f\u001bȒB\u001f6L-_\u001dErbSݧgL\u0007MA2\u0011\u0006,ͬqt\u001c3[\u0012\u001elP(,C\u001d !Ɇ\u001951(kBCň;},56-\\_)\n1P0ɧ\f>S;f\u0006s\u001b!kh\u0010\u0014\\r\u0003\u0006wy\u000fK\u000f=o^z\u0018L{T\u0001{/\u0016P\u000fP뼦֕-P˖ P\u00154\b\u0019dL|pE|J^ڠdom0Gy\u001b*U\u000e֬{MVFptSm\u00168G\u0017s!gy>T3y\u0011?L-\u000f8ר?O9)>OPfbΩnZ\rj`~?0\u0013T=71\u0006wE\u0005\u001a\noOrsRZuNj\"n<\u001bs6&8\u0019/lc\u0005\u0007\u0002j\u000b֥\u0019m.-PXNhjW\u0002\u0018-*QξJ\u000f7Q}`jH6υ~^y.W֎a0߰vͰ\u0013r\u001bM\u0003GPb-4\u00075l\u0006\u0007r\u0014Dp\u000e ҽ\u00179\u00197;;\u001b7f1ΫFX>\u0010aW\u00169M\u0017F\r\u001aF-~8ԂH\u0001U88\u001e_\t\n\u0018s3mǩ<0*']#OUˆ>e\tswoKJ\u0016u\\6Ѱ\u0018S\n'Ͱ٨E\u0003K\u0016-O'U']'ib퇏p\tK?\\Y+kW')6A\u001c#f\u0004\u0013Sl\u001c\\}2&\u00158[.\u00113\u0015\fmO\ru69\\N3|6꓅SSR7|7`j\u0002/#6o\u001f|oj\u0007Ԯ\u00185,-b.F1DK\f;/\u0013&t\u0011LD_w\u0016ϛ|LZHc̯U\u0011Yx\u0019/\u0017}(gfT~ӊ';%Fԡt]͖\u0004z\u001b;\u0013\\vfIGOŔ̟$\u0011/OcKUc$cx\u000fĖRSU]\u0015/o/?\bH\nXb\u0016bԣħoyt\u0010\u001dK\rJ\u0013\u0007f+K5ΜYzA٨prr4v\u001f~\"B'\n,8_\u000e\\ǎcs=\u001bwY\u0013;\"S\u0001&5!\u0004\u0006z\u001c\"N:\rfWtx=\n/\u0018vGYneg\t5}h3\u0005Ӷw>W{~Tsx(9gOud)Z\u0015xviHލ\u001fE\u0005v\u0019sVZ8\u001f\u0004ej*i\u0010ZR\u001b\u0016I#h\u001e+Z\u0006jgY,+ Yg(кwzf\u0002\u00068'^T̈骧d]\u000f$~$>=V?HR'_\u00013\rՌCj%3)-'F*nןqw\u000f1\\l\u00044A٧6W7ꬳN\"\u0017Sêa܉vp\u000fOUӘtN-Ir\u001c)nrSs_qTd&e\u001e4\u001f̟ɆF\u0002] 3\u0013L\fmakp&:\u0005KP\u001d\u0016lTSOaWȻiܢQ\u0006Xm\u0004m[z\u0002kR\r>\u0005.B\u001au␆ݯ\r}\u0015@\u0004x\f\u001e\rAIwZ/C6C1\u0017l\"ZH ͚\nco\rqصW8U4+3n1+1;+R\u0010\u0018ZRL\u0012OCEO\u0018\u0019C$5\u0006#\u0005@\u0012=\u001eA6FX\u0019J\u00191\u001f'7u\u0015Z\u001di_\nAa\"DYiO['-\u0013h&}tt~*\u000627_)Q%v\f\u001a\u001d/|\u00033{(M%kh3Mp3c:\u001fV\\\u0016'\u0011 &Av\u0005Cx8);콼zAD?NKǲk\u0002\bJ\u0000=h\u001ctPڵqt9iO\u0019~4؛\n2\u001d\t{}se)Qސ\u0018\tx<ʍI[<\u00106+\u0012\u0000\u0005r?[@aC1~_Oz\u00171\u0011wf3C\u0018S\u0012iO\u000eZ\u0016Dgڄƨ\b拼F'\u001b8M\u001a˱\u000bȬrX6r=@xƩߠ~\u0012w]}-ը3\u0001\rpaﲄKW2l\u001a^:o&3\u0002emJOr6jK=eMnEGi\"'\r#΍ޔ\u0019oqy))\u001dSzMq?O\"6\u0013\u0015~*܋E1>\\dSPXXk^71bgerZiS0rV`X:n4FF\u0006%r!Y-\u001a5r)e\u001d%\u0015\u0011u4$ͿN@@QgAoFOoyt\u0017S¬+?<?~<\u000e'\u0007ۦyZ\u0018x7\u001d\u00124ژ\u001aK41!8X>Yv39MDGᄊMT8j7Z\u0001P=\u0017gs,L9iɠNLy`eLb6M8\u0019ޯ\u0005aȿɣ(\u00130oY|\u0019.\u0016\u0001\fG\u0013t#w \u0011Y_\u0006xX2d{\u001c{\nk:0p/\u0013}0\u0003Rƈ󮼍{bnT8Rۋ@Y\u001e{N:P\u0004rx\u0005kW\u0005.{m\rT\u0005K:ruZHFl\u0017w\u0007\u0016yӣ%A@|\u0000\u0011\u0010:>JNX\u001d|w+9uQ&\f\u000fK\\a[\u0015\\@圳6/T;u\fԓ| \u0012\f\u0016hQ.7/V\u001aͽӛՄt\r\u000f˟\n89~~=-f\u0016ޮyKdbD4q\u0007cJ̵xviDib_3\u0006*}\u0017ȣ\u001fuD3KCu\\J3_ϐ`pV6\u001eSZ~OH.3aA0\u001c:u8_IL\u0000sm\u000b\t.\u00111bɊ\u0011o\u001bdiךP\u001cUp\u0017\tD\u0013\u0012rJ}r3$\tƌ9L\u0019q,\u0007\u001a~k\u0017\u000b<\u0000X_q4Trֺ?k^`-\tFWZnC첧݉OX0aj\\c5\u0006X\u000b+c\u0004Mg:n[\u00012դ%D\u0019\u001c\u0016$5~w\u0011v<!{/0N7H9|\u0002kC\u0004[Ct0*6L\u000e\u0014/\b\u0018d\\\t\u001d\u0010:[۴<__\u001bb\u0019A>VTN\bFmфxVd:#u鏐*9\u001e\u001a\b2\u001db`\u0018X\u0013x9XG͠J\f\u000b!|0%\u001fZ {E\u0011K\u0011\rvM\u0000(u-.\u001a\fWw\u0016ưQ\u0017j1n\"[{\u0018|\u0010#&\u000bcKq\f6mwO7>2=f\u0017z\u000fUGfJs\u000e\fQdm_\b7\bZ<M\u0007j\u0017,ЩY@\n(c@7RW Ru^]Lс2rSع\u0011\u0010\f\u000bJr_s؆+ڽqOH<?\u0015P\u0019\u0001\u000bT0>\u0003*\f\u0004\u0015زA9ʖABXr|zO椟\r\u0005{g&\u001dV8u\u0011\u0006\u000b\u0016?/f\u0019MPhAjl):[w4l\"\\<d<}.u&׃oIl\u0014\u0007I\u0003Τ\u0003ߢ31bY\u001bTC\u0016T$d\u0005*\u0001t\u0002*c|͜@e\n\u001f\u0017J>Mؾ\u0004k_U#3\u00185\u000f\u0012\rw\r҇|\t\u001e]^S\u001d.{M='^\u0014X#A\u0012OcBq\u001au\u001c׻\u001bS PqP\u001e<\u001fl\u001a\\\u001e*\u0013wER\u001d\u0017A\n/}2Sý\u0000\u0002&@\u001e-8j+;ʟew[5_,c4nvi<0Lqt\u0002_?\u0010PbXߋ9\u0003fM\u0001ʙijD\b;\u001cs\r\u001e!\u001fF8Ѓy}S\u0015u{\u0005BZ͸[[\u001dn\u001bN?T<>v\u0002i?[g5,\u001fH\u001cv\u001c\u0000#\u0011\u0007z\u0001Ղ\u0006Uj@^nS<x{\u001fLɭj\u00075MXu\u000fЃv9|\f~~\u001dwXJWw|\u0017-ȵl5@%?\u001dϖ8=\u0017Ts\bA\nh]A\u0015\t ĖQѕ@)MW}\u001f_*\f\u0014ʬ=6S#]𶎀\u001e\u001f+'\u001btz\u001aV޹j룩/58Kݎ?8\u0017#fK:{]\u0018ߩ\b-\u0005ږE7_fG\u0017dc߸\u0017\u0007\u000e\u0004I\t{S\u000b#\rUcYS1Xf':讵w\u001aܗs.$\u000fد\u000e?8\u001fSˠ\b(PmL#P˶K?\u0015<zrv\u0015\u0003ߑt29Jۈ)\u0015Sޚu#T\\}I1Ey38o\\dT夿oi'Z\u00041e-F%qf\"{L\u0018D4@ͮ\u0007T\u0010\r\u00022\u001f?cl@9O\u000f\n+X0-_N߇2ܵ@ޔ}ʪ\u0018HMo\b$2`'@be\u001cR]\u0001݇\u0001Ua\u001bsrX몇:\u0001\u0016KB>.\\\u0002ס\u0011/|(畁y{b{+\u001bsaoi7\u001dP@\u0006dD\u0011ϒjj{*\u001fE?\b|giB?=\u0015~ 'UPU7?@\u0012=P/%\u000e\u0010;rtv \u0017\u001d.\r(Dǫޥv0\u0017ڒ){\u0013ݾs@Ɔ ӣ(2bTߚ\u000ewOiѠ$$jr\u00049w\rխnAz}%d\u0007Ա\u0003GP\u000fWsqB/V!rvyHf;\u0019hl%\t\"\f\nTT\u0019w⮴߹O0wǧ[\u0016)@~<jqnr8t\fR}\u000f\u0000\u001aWk_Rv\u0002\u0016\u0001=λ\u000eqRvZX\n\\Jr1E#*\u000f|zl\t(\\n#[FnL\u0005Tq)~~:z|[\\5Ǩ]3h&D\u0001t/@H~+\f\f\u000bOR04]n+d=B\"OJ\r[BR|rFbYd-j35]\u0017\u001bL,\u001f\u001fcԈ@-3\u001c@\u001b\u0000*1\u0015A\u0002gѼ4._m\u0011m|EVŔ\u0013\u0001!\u001d70Ÿ͆@ob|\u0004\u001c\u0003u\u0000@T,\u00150P5\u0015\u0007;\u001e't\u0007j\u0013Su\u0016\u0002mwJ{܊G,+?a췦\u0013\u0015>;\u0013`aߋ\n't|XC $Tl)\u000e:\u0014\u0018*\u001c\f\".ėɟ\t*F2\u001d!b\"FK'p۽|Nzu7X-\u0012\u000e\u001d}0\f\u0006\u0015]*<{3Dr!공9.x.\u0014n\tYrYRX\u001e\u0018Rh$yg\u0014\u0007\u0002}{*B\u0003Ԧd$\u0002P/\u001cA]f\u001fM|Ϲt[U^?!vC\u0006Dk7-V[l%u\\\u0006٦^Ym2E\u001d\u0006=\f~|N(\"\u0010\u0004G\"z\u000bn96AmMo<\u0004\u0010,\u0006+\u000eyy[$x*\u001fYP+S٥\"|OeK*֭ځ\u0006ƛ\b9\\\u0014\u0002}\t\u000bGEnUTueVc &Z!_K?Z-/\u0011ʲ\u0014x4٣}\u0015-\u0017n\u001erv&\u001axgIGj1͗\\\u0016dn\r_ΎUK ii.N[qܦ\n\u0016۞nUJ\u0013qRG\u001f\b?ۓ\rZ&$\u0012\u001b\u0007\u0007mуn\u001c^\u0003V\u001f\u0011Y7|y!\u001fo\u0004\u0018d򡄎N\u0003ɠB-\u001cS\"7\u001c%_O$XuzR\u0012X !=:V\u001cBr~FBpu\u001du9:s[j%82\u000b\r\u001f9Y7\u0017Z\u001egŦ>ӯ˛Zz%[_٦^\\ bcvrF!fUp9\u0003.U^̌78J\u000f\u0018]\fj+\u0001jw56٣\u0018gK;#\u0015\u000f]8Hn\u0006+@\u0018bJ\u0010F\\uބ0&B\u0014}s_{^6Ӆ\u00194ް?R\u0005\u001b\\\u0014r\u000eӳթB@hNh<\u00002J\u0012񜣸hcg[8onCo5h#7gB\u001b$w<`cu\"'5\u0017X\u0015\u001dk$\t{.V'\u0015:}M*\"7$+Lڐ@@\r\u0001k1hHAyKWNf\u001f\u0002\u0010QZ7?\\%\fY|e6\u001b,S~y΢Ju g74s7\u001bu\u001a9mm{K\"xwndR\u001aOx3d<F\u0010j'\u0003$q\u0007\u0005\u00115\u0005 9p\u0016I`*~p2:a`y\u0001{@6\\.W\bk\u001al臊.\u0019EO40\u000bz^Ysmo\tu8\u0006ms\f\u001a8UG\u0005\u001ae|iy=:CИ@@\rΝ.\u0016(K7ҳv\t%Aŷ\\9%'69iydu9~M4swhg0vd\u0010\u000fq\\\f\u001fI\u0019Ca{\u00108ظs%ep\u0015c\u0006%\u0003{5G6\u0010@J'.YoV0\u000e|\u0012waݽ\u000466K|d\u001e\u0012W}\u000e]:)׿'\u001f42\u0015\b:Cl6T W\u0012}\u0005}\tM*=\u0016^\u000b?)I]NTL)?\\\u0007v)*/\r8d\u001a *#(]m.Ӑ_1\u001dt\u0018ԗ:RWyh\u0010xz[d\u001fI*!\u0013O%i\u001b\u001eJ]\u0013\u0007\u001d\u0001=O;m\u0019\n\u000fDBz\u0017pW\u00053$'cp#8ξ\u0016\nZaP\f$4>\"(o\u0006ÒoO.#}z\bǻb\fw\u0004doΓc[ZzvHP\f\u0012\u001fM9%@<l+5>'vHl2/iD\u0006Y,d\u0000x\u001fC\u0003ڃ\u0002O2\u001b\u001eW~:8זbcjYheVa3\u001f\u000efe6J)\u000eY\"oz\u001f~{/=ҽ\"0@󠄢X,\u0017\r|<\u0013=\u0000c\u0003Jp!wa׳.GG<Uaیn΢\u001b\u0006ӛ\u001e 715N7Q!ӻ0*dkv\u0007\u001d8.6L/L\u0002-\u000f8u\u0004?G훠KDbT={\u0006!\u0007ʃ\b\r\n\u0011k\u0007u\nma[M,ըnGŠ{\u0006mT.BTЯ>ކI!h\u000eF\u0010UЭ$A+g1:ʠ$R+P5LP\u0002(ny\u000131/,\u0018\t_O=Z]t-\u0014q&a.g&A Z)C^q)\u0019F]xUJ{'8\u0006/\u0016ٜ#k\u0007\u0001j'tQ\u001b\u001e\n(i\u001aO4\u000eż$f\u001eVrc1_ɏB9Z^\u0015\\͐M*k6~]\u001e\u0011{b?mT\\J3S6V,\u001eR@;Q+\u000b\u0018l\u000b\u001et\u0011ie-<^\u001b\u001e޻^\u0006y\u001b\u000f\u001a\n\u0017|=Ռu.v\u000b:\u00174~^\n^\fW\n[hIגF}\u000b(O7hU\u0001ި\u00065\u0000aY\u0003K@eq^@?g?\u001bN&u\u0016P~ѝ^s^+\u0014$\u0013]F\fV\u0005Q)ee%jiO\u0003\u0014\t\u0005ר\u0012U9g:(Y\nTObKK\u0010+Pmv\u000f_W:_u\u0015w+r\\$f\u001b<YwÌ\u0019]삍U`TP!{[\u0006Y\u0011Y\u0013St\f\u0013u\u001ewȵx\u0002OJ|A@y:U\\Pެ PĖ\u000eAU7A՛n@UJ//(z?:<Fը~KU\u000b\u0010\u0016٨p;B+\rգNzS0J%4\u00182\u0014xy?r~|`^@Ybε~S!P\u0013\u0007\bY'v/\u0006\u001e\u0001x,\b\u000f3x\u0011o)趽b4:\u0016Pak\u0001L\u0002+~nPCrBt.z$Y\u0001\u000bqVd;T\u0007\u0001eW\u001e([b\u0013T$\u0003UW*@qU߈\u0014FI_E\u0015h<@`\u000e\u0000\u0005\u001b|-\u0013^\u000b9w?h\rϺPհяIY{q'YvO\u000eLd\\lW$.|\u0005\u0007-\u000e\u0017J\u000bT^\u0016\u000fjU\u00030\u001aރڭ⁚M?nM)S}/f;Πx[$>\b~WiquZX|<vaYފ\f{\u0005DG~\tFk\u0002o%4o>(ߍf\u000eGR\b2+c9w_~ud ߝ`c76|\"\u0004Znj-RIVcG\u0010\u0003o\u0005Ux;\"x\u0000g<l|j\u0013,^~C\u0000TJ^'\u001a{ƈs^z09\u0003~FQҁ҇纲V\u0011uG_\u0003`\u0005^('z9QuNC4h\b>u\fpn=\u001a`[\u0012(-R<q@\u0017Pi]qbO\u000e)Y2\u0003Ѐ=H>S\u000b1\b\u001asGV\\Ŋ\u0002iB23\u001eHd\u000bAt\u0014Pܼw$m\"blɮC4\u0016 8qP+T/NW]g\u0006~?\u0005I>|CȽy ߳\\Jr\u001339LJVsPdSdK53\u001bkƩ\f~\u00172\u0002\u0003\u001d\u0010T*AmJA\u001d\u0000I)\f\u0003.\u0014t-`_Dq\u0016\u0019!\u0005#ٷ99\f.d@\u0015K]&\u0016{M]\r{E]3\u0016\u0017\u000bc#\\3ITu\u0002*KڪQ\r\u001aqT}b\u0000ZG\u000f<nI_stƽeϦ\tOr4J3?e=ۓfqD\u000f!H\u0017\u00179_\u0012R\u000eňW\u001fG\u00012g\u0017?|e\u0002*\f*vJf\u0003P{;d˷Tɽ.C>ӰZm\u0002n]lvX\u001eHk\u0017\bRpٚ|\u0019AL0)\\\u0015>#mM\u00113asO?9~l~\u001a\u0019O?\u0010PS&`\u001b\u0012 Ƨ\u000f\u000e\u000e^ag\u001fBk7}_]\u001b=\u0014\u000e\u000b7I!i4\u001e+g,>ސ\u0017(aڹG\u001c+zM\u001eVG#g<\u0015\u0007[zg\u001fYh^\nP\rR+Nb$jr\u0004}y\u0018ՑbT\u0007\u0010v@@r\rJP^=[{{\u001d$.??\u0016\u0003Kc)w\u0007.on{bjHJo\u0016%]\u001c\n\u001d@'\u0004Ne\u0012ｕ3Ymxe\u0017ޓ\u0017P1ߞ`\u0018;H]'j$ݭ$jW_?N\t\u0011SO\u000e#S3a'z\u00075(x\u0010mb!or\u0012|&=[ݰH\u0013s,\u0017\u001fX^ OCk?؝쥊i\u0002*~\u0006\u00045\u0013\u001a\u0003?\u001eAQ<\u0019{\u0019eh~r$Nz_i~e\u0003K\u001dҊq#*8Pk3&mHDV9\u0007#l1USdܖad/߷gnj]M5\f\u001bN>}LJPQ:l\rGj/Ɂ\u001f6\u0013e\u0006!\u0015O[\u0013aQ<N]'K1\u0007y2\u0002\u001d\u0005\u00057:Ʀ6fg.Oy\u000fj*\u00070'!\u0007\u0017]npIFkU\u0013ۮ\u0011gZ>3d\u0013xԐu\u001bnTuA.x 4\t5\u00077\u001a2)\u000be0\u001e0~{<K8|\te=g\u0013/B/\u0005Tq&\"f)\u0000C\u0007}{8M?OiG̡7G2\u001e\u0012m,5\u001b\u0016D%2̼KOr\u0007?\re\u00025g\fwHQ&xG}7z\u001fT~<X\u001dg\u0017PYGg\u001dq8;&Y5 Ѿ龴WLVĮ\r˛\u0007-\u0002aAPs\u001da@\u001e^w\u001dף|-\u0005+\\\u0012w\u0006)0<\u0015\u001ajM\u000e\u000e\u000b!;8Oj*\u001d\u0010C[GӴJ&'{\u00015\u0013\\͔M\u000f$C\u0011w/\u000650m׮%u'\u001e\u001c6K\u000bkTf\u0001nMA\u0007KYu<|tRP?̰`_}\u0007&>~@kT{qrmr|%q\u0007u\u0007\u001ajyf\u001dIIDI\u0019b\u001a?aҗJ\u001cuT=E\u001dy-\n'X\u0006㏆$qƄˣk\fKFoP\u001a>9\u0018z\u0001\u00033!.\u0019].\u0017\\]v%չßߋ.IJ\u0005׼!jBkͳH\r?K\u001aC}\u0006)\u00041j\u000e\u000529>\u0007[\u0018΄8sVAb\u0010\u000f=g^3JuټԹkx3,o]imip'>`b/fr\u001c\u000e-\u001e۴z\t=\u0016aᚃ\u00176\u0014SMe/3\r9\u0004KS\u001e\u0003\u0016C\u0003\u00072C\u000f\u001cer9ӹ]gX\u001f~wNq5k6GfMXVK|?|EǮpg;ux6ǡ>\"\"%CfL\u000b\u0012A83<\\ֳ^ݞ\u001e3]nB:bMd'VP\u000f[p\"%鶲ֶ{,*5\u0014\n`\u0005\u0015b\u0001F1V{.a\u001b$='\\O[y9^c8`\bzw8_\u001fFln8W4sUM7Nܨ\u001c'\u001avbջR̍r\u0016s\nkFw7O>]ǟ}</~d\u0003ΖG{xr7LrX\u0002ے!zʿ\u0003\u0010\u001a?\u0002D1\u0007z\u0000oQ?2 \u001a\u001c\u0010]7\u0004DI\u0000\u0002a\u0005_?\u0014ǧS{q\u00078q\u000b\u0001M\u0001\u0004\u0002U~{UV/\\M\u001aT\u000f0fE\u0013s|zs\u001bf\u001bgu?H\u001c\r \u001aJO\u000b3\u0018 & \u0012\u0010\u0013\u0010\u0016J\u0001B\u0016kPއz]чb\u0007I\u000b\u0016E7%\u0014\u0017j\r\u000b\u0012މ*vF\u0011}6V1V;\u00001Wƀ(u]\u0000p\u001bK\\u@m@|. I$\u0002Ľ@:;5\n\t\u0006+^c3o&ba㞘.L\n1s(+ѹԣkd{VCudl-g.\u0011Y\u001dK\u001bK\u001fmXJ\n\bQ\u0005urP.A\u000bS~ā@\u0000;(\u001a\u001f3O2\r8LףAhE37x\u0005-}\n7]΀tOUC\u0013\u0000STm\fK1\u0001!u)@. w\u001d\u0017O\u0002B^- 8p\u0010\u001fO4:':bv+8\u0012We*2\u0005v0\u0013]\u000fl=FO\r\u001e_\u0007 >\u0014kΠER\u0013 K\u0006O8\u0000\u001ee@^\u0016\u001b\u0001<xӵ7ֻ1\u0011\rl_/d\u000bl>xCrk2\u0013y \u0003=Y!.\u001d\u000f\u001dx\u001bP|\t>!Wr\u0007>\u001e\u0011\u0002S\u0003T\u0001d\u0003R\u0007\u001cI%5s\"_,*=\u0015_Ϫ\u001e\u001153\u001e\u001b.u\u0004TW9\u001e9 ̣ѫ-T_x\u0011=&[A\u0013/\u0012y2\u0000]N0\u0000h\u00016gPsD\n\u0003*w\u0011|\u000enbiw>\u001b\u001e_O\u001c*{\u0007\u00044\u0017;}6lF\u0017pci9\u0000$:\u00039J_\u0001\u0005@S\u0002Թ\\~F\u0004I\u0000\u001ax\">\u0000tz7w=f^a\u0012isx\u0007\u000fR/RkPO:\u001eP\\ZXom7V\u001f/Z*[[ى\u0000r\u001dB\u001b\u0003@%@ϭ\u0011`\u00150Ι\u0004̔cvq\bOqWC\u0005e@?yZ)=D%\u000e\f\u0011f_gd{-*5wtjۙw?&\u0014^\u0004m/\u0017J!2`0\f}\u0003,ÀlH60\u0001m<\\\u0014^ZcHW\u001bI\b>.T=M_\u001c\u0014\f\u001b/\u0006R;C\u0007=5N'\u0019mN!\u0001`H}Pgkl\u001a&80?ie#L\u001byP\u0016/GGc|9'\u0011\u0006v{x\fw:߻cwE۝4k\u0015ٹvfr*ѴR1yd$s\u0015C\u0007Z\u0007\u0016y\u0001j\u0012:\u0001`@\u0003߅NM\u0007cy\u0011R\u001a\u000eӌ\u001f$q\u0001\u001f\f15{o\u0003+TFSڝyjn;\u000bu\u000ffųXm\u000bTEԹd%\u0000gkn\u0000\u001c~W9X$ݓ\r{IΉZd\u00173m\u0006sOg{uޛzwWm}p\u0015?tk<ZqjwklwE羶vc\u000b2Ie_%OxYxc \u0003@>SX\u0004\u0005\u0011`\u00169M\u0001[k>D\u001c=\u001e/Kw:A\u001ag{\u000f{SLvbfRq~?{\u0011''sVp<3\u0016h#j#U\u0012L\u001drfvOUD9s?[n\u0001B^FM\u001edk\u0012\u001c\u0006 ~Ȏfc3qsi^`\u001fw\u001fQ4\bl\u00019}qv?YDeQ<$LM6OՍ\u0019\tp\u0012B)\u0002\u0015U\u0000+\run?ߥ\u00180\u0000bz\u000e\u000erhU/tv#\u000bzSgonhh/v^p>i\u001c3aS\u001bWr\u001bSz\u001d~`?(x\\\b\u0003\u001b]I<B,*uQw\u0000*CΦ^@6\u0019ȱ)j艌ovrI/p-wzOi\u0006:3J\u0016?N9ib5?(.'Ʋ\u001cg,7z\u001c/-fER_w\u001f$\u0001\u0007\u0019s\u001d\r-\u0006.VYv@nr9@U++i\u001dr7\u000b\u0015i(n,յ\u001b\"\u001f\u0013,\u0019\u001b<>/ҢK\u0007ӛ`]a:뒷\nr\u000fk\u00132KPw%y:\u0000\u001c*ZmT܅<q\n\n{ؐN8\u001aS7S-<];Ɲ\u000e{4mkC붟zm\u001doOqU5д.ukwb\u001c\u0007*9\u0000Ý?-$>mDQM\u000e\u00059\u0011>؛.,)]GtVȈ\u0013\"o#\f\u0003MišݨOj\u000bey\u001b$@\fZkT\u001ceԒ,g|nH濿\u0004x\u0007:\u0005t)%If[`z\u0017\u0011:k98nav)E̫\u00185ே8\u00145fe\u0015(G[x\nbfv\u000f'4z-^[U~Ypbk:1\ncw@%\u000fz\u001aa⪿K}/BL\twsNɻ\u0001iǕBr/uO&\u0011Pl)J=wH8>C\"\r;=r\\n*nAI\n\u0000a\u0002z?%{@먙KvkґV{ѸLk+INc\u00155\u001aE\n<l,NlO2\u001f^5? \"hFڋm+6\u0014!6QlY5'$1\u00003]\u0003F\u0002:o2eœ\u0015\u000epH߷r+Y>Toq6\u0006n'cWoth-IֿU}'H.ީLR\u00171S\u001fbb\u001a\u0012_BFY=\u000bj}TX\u0016\u001d\u0016eZ.>z/v?OT7H9o%7\u0003@vS\u001a߆Ӎ(.}~uK^=V_\t\u0005iBPb\r\fR(?%^㩇kK51\u0004%7\nezѕęq\u000e@ǔw'\u0014t~KɎs\u001a;]ea]3kvV\u001e^>+nJ\u0012)|#\u0017b\u000fxDcjn\" /~kP5&ιZQJx˩˭6ࡋUm|W$Y}~ScwI?٬\\oӣN\u001aC\u0005>\u0019Lbm{ē\u0018jܸO^ZPJ\tހ\"y\u0011\u000fIQtNke*~B(SW\ti[b\u001d3\u001d-1\r{x,.7\u0013:Rrd\u0002Iv\u0015j\u000bNC5ǵ>\u0015[}S\u0001W\u001e*¦\u0002QKΗQ-U\u000b_\u0003y`Otгh+\\j\u0006Ι/V\u001bnjygfV,hjܭ/[/r-'\u0019]>I\njZj\u0005AY˓R.~/lΣ=7\u001a/Iy\u001dIe6HFr]TaGy;\u0015@uzœ6SWn+vfQYK<x\u001fj2f];\u001fQ\bkfJs\u0017W:-fR\u00013O4I\u001f~g\u0007Mt\rTlϲYS-4\u001d\u000e\u0013\u0018#.i~˘vnp3M\u0003\\ev&\u000f\u0016{݊U\r\u0002ڵ_2-le\u001b6y:zb)4*K\u0002\u0013\u000eWoH\u0003lFFWJ&Lu\u001cx+\u0016\u0015_\n(A@!M_+)Չz9gKyό9rIN<s`5jdKȨXa~\u001d}Z`#j>\u001896uI}\u0013-ޢL@L\u000eg͟5\u001c\u0002cN\u0001\\m\u00016g\u0000U\u0004\u0006\u0000vb-\f\u001a`Қ\u0007\u0018\u001dk\u0000}c\u0005@7\u0007Pgq\u0005\u0000\u000e\u0016\u0002T,\u0010\u0000-E\u0016m>\u0000%[&f\u001e\"bǥ\u0013\u0013pǊQLŏTm\u001d\u0003`3b;>\u0002~\u000eq?i?[O6zg,\u001b\u0001Hw\u0001\u0014&Pz\u0007׽A7@(\u00026@,x=w`۫*:\u00158wgzӹq;`%?\u0001U\u000bJL\u00153=7\u0006Ӭ\u0001\u0000\u0014\u000e\u0000\u001fP!\u000f\u0012Ƅ\u000er6\u0014\u0000,3ɶC_\u0007\u0014\u00146)i\u0000E\u0000U\u0005\u0003b;Q}\u0019\f\u000f}\u0016fz\u0000y9ә\u0000<\u0005\u0013m~VHbf\u000e]\u0007:G\u0002>Ȁ\u0014l@d')7,\u0000\u0000\u000bCW7\u0018Bۨl\u0003\u0012\u00014JJRa\u0005)\u0000\r7a\rш\rmNaFL~a;gp|_\u0001\n\u0002G\u0000k{s\u0011JlPXB[#\u000e\u001c\u0010\u0005*>l=G\"l\u0013`=\u0012`˅\u000f\u000eF\u001feY\u0002`H\u0013fҼ4\u0015\n_\u001dvAer__z\u0007<~\u0000/?\u0000ԡ?\u0003>\u0003b1c\u0000Y\u0010U@\u0005\u0004naQ\u00112[b\u0016:\u0005xbo/Y4S72\u0005XuX}ﶮ&>`\u00143Hu\u001fqEWWsN\u001a\u001edi{<+\u0000j\u0000uFߟdX^\nۑ\u0006\u0018q\u0001y\u0015\u001eT%\f\u0010w\f\u0006\u00042\u0016<n\u0001o7S 67).:?\u0013;b\u000b:\u0004>\u000f2ܷb׻ͭ+\u0001\u0005@\u0005-\u00011BoP\"\r\u0007\u0003\u000b\u0001\u0000n)@ܟw\nZGh̓zA̟ߚR?$JqSnD>H&L_L}\u000eoٮH+L覛?H\u001bP$\u0003\u000bX\u0001\u0012\u0017C@U~du@6pZ\u0000@=p\u0000\u0019 ]@Rv|jѯۂ^u\u0011yV\f8\u0013r_y%K'к\u0007r:g\u0006͝ڎJSb\u001b\u001d\u0005!N_\u0001\u000fp\u00004<\u0016R\u0002:٦i\u0000F\u0010\u0017\u000b3\u000fE[r|nT\"բ\u0017dK~#\bQK:GՏKSY\u0019\u0016,_}}\t)TWS\u0015 PꑁR\u001aP\u0013G\u0012=\u0019tOq\f`Zb\\̵j/n&.CŽp\u0013+\u001by/};\u0018W_,ɾ}Tz\u001d.\u001c'\\S\u001eI3E\"\u0016V\ne\u0017.\u000fN`YbP꣘Dß\u000b^\u0002\u001d\u001c\nVHlKHGіn\u0007}ܺ^^)\u001dM\u0007..\u001c\"&#؄e+Z?s{ҍ˭\u0012]ZӒU_)2y|qR3_\u0001:\u0007DwX1`r_[Ld\u0014\u000bd-\u001efkʛ\u0003\u0019\u001espMWE?W?~Q\u0013OTe5\u0003kPܭ\u0019nJnI/Mhb\nd-\u0019c5ώ[\u0019/+\u0000\u0006KM\u00024)@}\u0007ٮm\u0001.\u0013_t\u000e;\u0005q=)U֒ꁜ:W\u001bn/[\u0016=l+[)7U[Vs.[̼8\u001c3?҄\u001ek\u000b\u0011IH59B\f\tԠԗ\u0003{\u0003\u0019I\fu򾒒\u00126(&󬨒\u0011y*omP[l(uud3\u0013k\f\u000e\u0019yAyD\t[Tƅβ3F\t\u0007i\u0010ԯ:H\u0014PL;g\u0001W\u0004lLz*~fr\u00172Z\u0001~ڻf'fZW.+)L}_ZNR\u001f?ƽe5T8p\u001eaB\u001c'}nI\u0000ĜE\u001dؖF\u001e`P\u001fJ\u001d3P`ҹ{fe\u0015\n9n\u0003Vy(c\u001bgY\u001c(?+U=a\u0005iD\u0007[\u0018Mc\u0016A:EB\u0010\u000e\u0017\u000e\u0017m\u0012Bv_\u001a\u0006l3(\u0001\u0004)XX*+ð+ט/J:zɼ_%L/\u000f\u0015>\u000b\tc8oyy<#qxfvsM\u000f}9\u0011C\u001f5C\t\"\u0007Q(`\u0002\r\u0001ɟfI\u0014\u0000\u0018\u0001Vp\u001e>[\u001cXmY?t=\u000f\u0013\u001c1A\n3b\t!?|hj޽zJ9C\u001bZ\r敔/\u000e$wU&,\u000f+\u0000\u0011(\u0006 x\u000eM]'-\u0001;\u001dӨzm%^yj\u001eI\u001dzxv\u000fyL60q\u0007G0/<ۇ}zGcNZY\u0014\"NcP\u0003m\t{\u001esi\u0001N\u000e\u0015Ug6R\n\u0017\u001d\"u\u0010;mQu\u001flg[ӊա{r799\u001a\u001fӋaLUr\u001eY\tizjv,*\\\u000b$.m|\u0015ZY\nr.ޮr}}\u0018Z<ڿ\u0003X+4h\u001fAbs\u0017Q>N\u001bM.z,\u001ax]s\u001b֡:\bѼ\u001aH\u0002zZ<h7@\u001d3*rd5o7zy\"\u001d;l0Slj6\u001a|\u001eU\"\n(~\u0012\u0000m\u001e\u0001\u0003=b\u0011ܟ\u001fz9\u0007a\u001f\u0006Cq\u0019\u0003 \u001e-/Vo&v8{\u001c|Q\u0013JN>sQ\n#wtٟ\u001dBx=˂'L\u0011kD01yԐ&\u0017\u0000\u0000=\u001d\u001b\nJnwR\u0017\u0016k\r\u0015\u0017fq=jVlb\u001e[]\u001b?\u001dOmlkJ*)\u0005UR,Vߌ-q^@X[y1\\GffW%~)\u0002PO\u0013n/&+WѦ\u0000۩v\u0001\u001bgvazFOBSE3wV^(\u001f\u0014nאs]I\u0004U\u0011\b\bM#u\u0017P\u0012\u0004Yv\u0005ዔK\"llZS55\u0004s\u000f\u0000\u00156\u000fy\u001b\u001f.J\u0003^cimy\u0010$\u001e-HJ&\u001eJ,{,\u000eWWGIѱdiRЌ'\u000f\u0018/ɹr]{\u001c&Ͳ\";M޳\u001e\u0013B\u001e)q7EYȈ(̯\u0000tc,s&4W\u001d79(\u0004\u001aA,Bf\u001bӾJ\u000f8#,.:\\ytkNvx6k\u000b\fES:rV^\u0011Wb˭SVW)kJu5gt.rp£+>t\\cSWy~v6ܴj\t\u0013(#%F\u001e\u0010ћ\u0015ājm;J3WZ4A`f-zT$].[v\nz齪\u001bz{,~\\*\u00192積J)\tzAr7\u0011\u0015=+VS5?ɏu:\u0005cf7W[\\;N'*J1r\u0017%sk2>\u0004_j\u0012s(\u001aġYiwy瑬\n\u0011+`Oׄ2O~Z\f\u0005,櫅\rW~Ů7\u001aNˈ\u0019O\fU ?U\u001bL;l\u0016<St\u0013b\u0013\u0006SX\u0013\u0016r-Z(Z)`e?OFi}v Q6쫞5a'[\u0003s?\u0015ƙt$\u001a\u001fJU\u0006l\u000fUQkiX-\u0007à%d\u0014\u0004-;MVqqsR-\u0002bV~O4Ww^q՛\nB7k\u0015\t/;ZDTz\u0005\u001cvs\u0016r\u000557+U/0^a\u001e\u000fe9F\u0002f1%\u0003\u0019Akug\u0016}+@eu=\u001bpXQ*狫S/-9O>\u001c56\u0005z܆?ɰѢcI\u0007\u000f\\@@l@'{K\r\u001a\u001e|\n\nu`\u001auF޻q\u0016I^gưq5kE~\u0015\u0017Z'O>\n)< Rf0U hV(jodɕY)GB8^ĽYCɯzxe\n\u001dD '\u0011\u0015G\u0014\u0015\u0000]\u001a\u0000.*@\u0000 /\u0006he\u0001y\u0003w\n\u0000=fTNj\u000e@dH\u0006H@RgkeF\u0003 ڮ\u0003\u0004HA\u0011\u0004B\u0001@2e̢\u00002/P\u0003\nz\u0000:X\b0m?&z'$\u0003J]\u001f\u0007Pe\u0015*\u001aϷ\u0000>\u0000#\"R$zTP\f>\u0001@\u001c\r*U(v,C\u0007xi-\u001e\u0003S^\u0002D\u000fP'ʁT$@}\u0005 l\u0013lu1Q=TG\r?U\u0015\u0000\u00057s:!؂r>\u00070\tBbƻ\u00020\u0005\u0018e\u00018]\u0000j\u0000+F\u0000.\u0000BX#\u000b\u0001H\\CL/Pt\u0014\u00031d!@\u001dj\u0010\u0001\u0010<Kxdz.\u001ai\u001a\u0000\u0018\u001eAH@`\nUb\u0007]7\u0019*n\u000f`r\u0001\n'b\u001b9*v'\u000e;ǰo\u001c \u0007E!@D\u001a c\u0017\u001aHjAPgԧ5y0h/\tJg7ү)<R\u0017\u0000J]\f\u00003ŵ9vW\u0000\u0003\u001c\u000bW\u0000!$\u001eC\u000f-x5\u0000\u0015\t@\u001a\f\u0010\u0019r\u0004@\u000e\t}\u001b'os\u0014\\pY#aT윋&V\u0015PX\n\f\u000e\t+ɕ7NHWp@֭\u0001\"6\u0000a\u0000\u0017;\u0000lѺ\f0\n-g\u0000\u001d{(:'~\t\r\u0010Mdg?A|FWzG7\u000f()4+~_\u00016\u000eB;\u001cZc\u0005\u0010\u000b\u0002DH\u0010\u0004\u0010\u0010L\u0000wN$1\u0007\u0003\u0002ˍꦢ\u0000,`p=\u0001ew#q7#v\u001f<m\u001a6jiw_}*{c\u001dd\\W\u0000lW~.Cy\to\fcm\u0001U\u0012\u0001 [lH\u000b6\u0005d-\u0005KO\u0001QEiG\u0017n쟉QҋhxGWQC-bg-gk2\u0015f\n%7\u001b4iթ1Er^yH\n\u0002`ے\u0002BWXW\u0014:w@!R\u001ePr\u0001TSSl\nș}3Yҡ\u001as%\fW#\u0017fN¾\u00046dCVh_-(D\u0002?/s\u0013e\n-Xr\u000f&i1\u0005y\u0004*s U\u0002Z\u0000\bnqު_Vg>)2{o\u0014<.D\u0007Z3؟𤳹2Ӄ\u0011\b.>Hw~\nO>\r\u0007\u0003n\\|f\u0002~\u0005:y\u0019vMxؤ\u0000]\u0004I\u0016\u0003\r[ǅszy\u001a\u000bn\u0003/EUbW\u0017Flb=\u001e\u0006Gm.M5~J \u0016\u0019bY',]i<\u001b\u0002H\r\\\u0007N`i;@8\u00118(}Ϸ\\O\u0016_קkAȧA̳ݫ_ڝ\u000euq[\b\u001evݘ\u001cW\u001fdRmf9hy6ۥ&Z>>[\r \u000e\u001f@r\u000b=\u000fJ\r\t*\u0003k=\u0000U\u000e~\u001c_x5y \u0005|yiMro/ǥ*<\u000eD]d\u0013ٖ*)f?Iv-\"\u001a\u000byךڛ\u0016<\u0015Ԋ9j4X\u0019x\u0018˯:\u001a\u0005,M\r}8Rc\u0007́R׫rlz/Ya|IayJQw \u0007Ψ]_\u001bRJ厙Ja\u0005s:M^l[_\u001b[Jx6#\u000f7\u00119P\u00142&cƙg\u0002\u0001wWb7\u0015ގA\u001frĥ<jpU\u00164\\&d}|s<>ni#pӁZ\u001cwvY4shٖt\u0013ƛ\r\u0015Ʀ&,@a\u0003>R\u0010QjX\u001f$\u0003\u0006vNf\u001bvN^\u0001KUz.2\u001fiZѤQឭ\"mK\\9/|\u0016\u000fgF\u001c\u001b}'-8\u0016rZdGC,\u001b\u0017\u00127<\u0018<\bw;.2Zt?NR(k~ O߹W3\tK$wҳ_\"NT<RC!b\u0010Gw\u0016\u000eɦ+Z^\u001df=;\u000e\u0015'\r*=M\u0011Ň!?cA\u0007'[ӥ<SrZO$\u0001FO\u001dJ_\u0011>z=!\u0003%G\u0005\u000fqd\"^qD~ƥU8×7u3\u000ev:_\u001evZ=\u000fξ5<x9\u0004\u0015qg-6S\u001fXsl!wt\tѻݤIE$\u0013[s\u0015XH2\u0011W ya깔[\u000ed?j:ܮ*guf\u0017\u00176>\r|eK7xۃZ}<FLނ&/Wy-'jQ\u0018jQ\"~41yk'm>t\u0000j\u0001RM@\u0017k+~i\u0019\u0018勿/oԦ~\n+zfwscqf\\6\"\rzO\u001dFAw__څ2jI%\u001bx}e~-GmڕY3IlQ=R0R\rn\u0015\u0000P4\u0006\u0014={<}/j߶/~\f\u0001,Z`\u0000:`9\u0018'oOG`=ĳv宏d\u0003ɒMw۵ՕۭlYl}1j~z\u0015ǟ\u0000/s\u0004D\rJڂSֻF)\u001fk}Au;\u001ak5\u0007K\u001eggܦXQ.6g\f#6wj&M\u001fw\u0019(ːO,8t\n,Mꏖ'4.|\u001b~v!nSFWA\u0003\u0014NN\u001f\u0012\u0007pӽfs\u0015o{sʔ6s\u001f^m\u001b\u000f2na\u0017?:C\u001a=OQk2oOyz\u0017X+{Fy5*RaBV\u001ek@ԍM#\u00196I\"o\r:jWG\u0003=t>UBW\u0012^no$vI[Mg\u0016UG\u0007?\u0016exun!n뽺Z-\u0019u\u0014Dnaw^>ii16(>ٔ?\u0011p32*.}j|!\u001b-+~\u000e)uj^ҦnUgݚ:ݡ}]mo&'<2fL\u001eM_i׷ٮҲ\u0017ܛs\\w\u0010tj\u0005rqCʘt@4NB\u0015\u001e\\m@Ca31\u0015J\n6\u001d%\u001bKλ;[\u0019:xˉOR\u0017RQ\u000b\nU}G\u0003i̹N-^\r7=\t\n3Kj>,peG=,^՗ Q\u001538P<>~EHYߎa6fbpQ\u001c\u000f\u0013\u0000?\u001e\"y|ڏX\u0014\u0017}F>ISs|hT5MHv\u001f#\u0003P*Ƥ^\u0019ei4\u000fϕ=\u0018LW.vW\u0011{GbjvXM(\u001b\u0010t\u000fP\u001f΢n\n\u001aԦtn.PG.L-\\6%@EDg\u0017?\u000ewjGUr\\UBt.| (QT\u0013jqW.e\u000e;( ba%g+d~^+%wWyj6jQ1!f~[$r0t\u001fR6Ar\nJXn@Ď7-\r|\u0015v\u0007|4\u0002\u0002v1\u0013,B\u0004^ynRy\u0012ekx\u001f,㟰^ndf\u001e\u0012j7y\u0017?t)6:cIF[6\u000bă^[)Hz\nU5pF%]QT\nqQfsd{V:I-zd\u0007\r\u0006:[\"\u0007s<c1Se\u001d\u000fbu\u0015\u0001)!\u001f&o]\u001c\u0015\u0010['&T^jmZo9\u0018\u000bߊ5\u0019m\u0004-rѩV-FiR$;\u0017̓O1Ղͧl\t]\u0019K\r\"\u0011'\u0019\u0010*>WՄtH;{]$6\u000b+i\u0019\u0019!&ߧ\u000eV$xdd\u0001\u0004̧t6WK,Z̜h3]:t}|eJ\u001c-бHsLX#6{stS)ne1BTD\u000e:w\u0007IH?'`t\u0015frkOQ\bTa\u00174s\u0002+k9?\u0014{XGhZU>ܙoЀvӍ㐔jNhU\b\u001ce>e3%\u0002\u001d\u0004\u0016\t\nR\u001d9SyPzMSgO35wį\u0000MW\u0001u\u0016\u0013ʍz\u0000c\b\nb\u0010\u0002$\u0001BTy9\f: 3>OA\u001d@&x\fA::S \u001d3\u0015*\r- A'=@z\u0010m\fGz2\u001bs\u0004ˀL7x@d\u0004\u0014(Sӎ,8%\u0017 \u0003 S\u0004X\u0017O\\ s@*\u001eAFFP\u0006~} Vݠ}\u0005>\rA-@:8ޠr\nC\u001ab&\u0012Db\u0001\u000erL@+f\u0000^染\u001f\u0000T`AuX\u0016<=\u0000P\u0013\u001a\u0005PJ\u0003d;\u0001\u0001RĖ sAfe\u00038 @F}b٨\f7~}@&BE_\u0012\u000ews\u0010R\f2<\u0017kҍ{K:\\wae\u0004<9/@I\u001bg\u0001+GWd\u0004P\u00057\u0000f\f5@T#\u0000\b\u0002$u+ s7 N=Y6:\u001c}:\u001bbBAD?j?H\u0003R{J\"w\u0012m1l.\u00004$\u0004E](u\u001d\u00003\u0001Vx%\u0011\u0007`E?\u000f\u0014\u0000ԭ\u0001\u001cD\u0003\u0017\u0001Ȝ\u0001D#X\"ݔ\u0019@\u0001 L\u0003q?E\bSO\u001cQR-\\tj^\u000b[2H\u0003xN`16T[\u0000:zP<\u0004ԟ\u0002Z\u0001r+\u0000TWm\u0006\n}\u0018\u001a\u0007Q\u0002(k$.@n\u0005\u0018O.\u0000Y\n7Yc\u0015^\u0017z\u0012\u0019v9NhSTh|VOȟ\u0000r9:?\u00065\u00048G'3<\u000e\u0003ܾ\u0000\u0001v+\u0001֑\u0000h\u0003VUЌ\u000f]7\u001c>\u00175|<G5ରz\u0017歹g'.aisamNz\u0004vF\"\u0000X\u0002\u001b\u0000+@H\r\u0010%$v\u0001(\u000f\u0000\u0012\u0000\u001ft,'QhP@~\u0017B <+@ǷuUlavF\u0003\u0017#*YJ+'=\u0017xj}W6Rd\u001caOM\u0006X\u00001\u0001a\u001e6\u0000R\b6@t\u001a,,4\u0010\u0017\u0010]^?|\ba{O\"\"DR­\u001e@ͫ_.gbD/e}\u0013Ǒwan=\u001e7f\u0005c]j\u00114,Z]3^\u001a\u0013\u0000M\u0013u~\fH<\u0003x\b\u0010\u0001T(yufKjݯϷ\f;Um>{\u0014\\ůsA.|}+1=}0f]S\u000b&\u0019\u001cd\u0003L1\u0013\u0000wk\u0005e\u0000\u000e \rM\u0000G\u0005(\u0005b\">t\u000eM뜝k_lKx)84F?xƣN\u0011-MIݪj/\\0\u0016Ht:77Lۏcs{2џܶPj$4\u0001Ap\u0000xp\u0000ŌԻ\u0010uȼsto{\u0002X2҄\u0014C\u001d^w:lA\u0019SkMô+6*uȩ/\u0004YgޡLo`Z=ٍ\u0013*,ɉc+݊\u001atUMI\u0000\u0000<\u001e\u0001hn&\b\u001eyuZrOo\u0014ޝ\rwX}Uc,\u0005KL&5;\u0015\u001dr:\f4g\u001cOf}zLj\u0016N`wJB3\u000f}'\u0000\f@\u001e,Ҁ,,\u0000Muſ\u001cWs1ǯ\u001cHn\fpRo,7I[ƅܟYnV:l&>=\u0016ՠxd{c\u001dGdZ}~-2N\u00014ru1~z\u0004\tyOܟ\u0000\u000e\u0001M\u001e\u001bSl!GpQ\u000bl\"\u00073yǮ/M@I<\u001b,ҌfsǢvS\u0019i*FΨo\u001e\rs\u00001M8l\u0001\u0000\u0000\"nξ=+G_ˉ.T>_ˍ]/Ǳib}1۪pc6fW;4'Wm-f\u001blgWk=\u0013B~\u000bb奔?\u000e[>\u001f\u0003}\u0015-</\u0002|*[$6\u0015pm&~\u0001>9\u0016\u0013YȋBƊKM\u0003N+?dPhtԙ]\\r\u000fҋ53ޓdӓn=d@\bK\u000fɁS\u000fɧ\u0002lYx[x\fqNk2q?\u0018:w\u0014l,9oz]j\u001d\u000bsᢱQDڳ]A7>\u0012VC\u0013Nb\u0002n)}M\u0017x\\\\;cqt=Dj{\u0000 h@\t~Z\u001d\u0015.o\u001c\u0018+?UG2\\g\u0002Xҧ\u00169\u001b]e\u001b\u0004\n(+\t]]\u0018\u0003>dm1_.kca\u0010^GO;t\u0004]\u0006/]\u0012~;T\u0001\u0018͓zE'grՏ\u001a\u000e?^`[@H|\u0002Hwİ}`\u001aWMVZ\u001b^\u0016ufc)?A'\u0006?:1R(m \\:\u000bt\u000eG]MWgyEn-8\u001clRTD5}\u000e\u000e2K\u0016έJ<˾GOmބO~Cno;\"ۂk\u0000w\u0011\u00000t[;t\u0018,Rva1Sq'\u000e7\u0005KV \u0019=K\u0005\u001dRSޢG\\ƵV/ NnuKI6}RjmWfS'\u0000\u0001\u001ewnq\u001dT>N؍]Ck\u001aڒ͌3\u000ec7n\u00013KLn0\u0015],]Zv|k(Kɟ7Qskt]~\u0004~\u001b?AZ|\u001eV9MsAr79\u0001 f&FN+>npRsiϯʋ.lk:fmu69\u0001{Nnv\u0007uZo#iJve-\u001bMrpY6]\\\u0007lW|\u0016A}8\u000fOR6\u001e%\u001d\u000b?\u0001\u001ahF\u000eҤr\\uwyn\tZɭ4)߼TnZkU[YU5i9v\u0013\u0011O]ҝk{O\u0013[x5$#\r5ϬJ|\"]*%H\u0015'H3Y!)SۅP'<>Ot\u0013\u0000TZ\"I\u000eI[.t+wB:KBA*nN݈(}0Xd\u0004JώͽT!3I\u001aOjuq.T\u001c0JU&\rq\u0016`\u000b1ɝyeX=W1Iw9\u0012s\u001f\\;x$(_U>$;\u0012n˺(E΃{\u001bs\u0016\u000fju\u0019fVk]z^R\r\u001f=V2L*~QK>7]SUpV\u0001;P\u0014AQ\u0011EE\u0004\u0017\u0005\u000eQ\u000e~׷=܁TIK22\u0012\"~\t3q\\iSdw\u001dٶ\u0007};\u001e\u0007W/\u0007_\u0002\u001cwZeE\u001ela\u0002\u001e//\\\u000e{\u001eµ%Jۊ)<d\nf-+?\u001ft2wZ}a'k\u0011\u001bO\u0015\u0003e[E\u001aʻowu/j½n2\u0011wT}J|h(ګ\u0016\u0019#;a1[\u00022[\u0017\u0015\u0003&/\tgTz<Uʛ\u0017<2&s;\u001b㨥OUP\u000bTf\u001f#;@qm\u000f52R\u001b.*﹝:Z_*{|o-ί\u001bKqwSӧzZnSe\u0014\u0001ֻg\u000eh뽹_Z4Qj2\u0012ZĜ\u0012`V6\u0014/\u0017`4?S)j{`sK\u0001CQ5A9\u0004=3=d:dN|8Y˦I8U\u0007\u0007w\u001dJma\u0012N|Kv\u0017\u000e]ӕQ˝4G\u0017cڗs\u0007/0\u001e}N_X;\u001168\u001a׸3\u0005\u001bUȦM'q\u00141a!̋\rp|/_\u0011\u0014msCa9ʱ3K_o</aH>\u0002B\\\u001c\u0018t\u0001]'_.\u0017\u001c\u001c=//ZMR|f‛\u0002=\f96C<ҝV\u0013\u001d\u0005^awu906a8PxK뾐iE\u0014zTEOfV\u001f{9.\u001ffeYho8]|\n{\r\u000bi#˩Ú\\z-\nr^;-ds>ǡF\u0007Tz[$\u0018\u001e\u001bB붪e۞+_n\u0012w~{]2\u00159'gKhF`(X&-s1_\n魱:\u001eu\u0006~s\u0003>Q;\u0011^Gy,*M̘M\b\u000b\u0013ݧn\u001e%@DWܨy4%)\u000bRzFY<?iv#E&>z\u0014l2kmR=^ݑjSp\b+xD\u0014'1\u0000ʗ8\"p\u001cĽ\b՞\b5l\u000ba&K߈H>\u0017\u0000\u0000e~\u001a\u001aa\u0013`B\u0003Le\bS\u0002l\u0004h\u001b\u0003d\u0001\u0012\u001f\u00009\u0010=\u0013 ϑ\u0003dU{\u0001d: <@\u0006|x\f\u00012\u0010\u0003\u001f\u0000<};@+3&/\u0000l<f~\fA\fU:P\u0010!*]M\u0011ʳ9\u0007s9\u00069Co\u0001\u0005n\u0000a\u00019\u0000M37|\u0011Ď\u0004\u0017+@\u0005\u00041@OjG\u000f !H\u0005\tU\u0000\u00149m9z\u001b/\u0000̞207P:cZ\u00048\u0019y,\u00003\u0005St\u0004`{\u0001`X\u0005P2\u0006\u0002蜂\t\u00190xQ\u00002%\b\u001eC,P\u000e~D\u0018\u00041\u001c\u001c\u00134j\u0002\u001c\u001bF]U@\u0007%\u0001ܜ+4\u0006Xe+I},V\f7\u0005\u0018m!W'5\r\u0007\u0018\u0019\u001f9\b\rи\u0002w\u0017{B,M㞌fx1\u0004)\u001dݿU\u0017\u0000v]A+c\u001c\u0016p$\u0001\"{R\u0000\u0016\f\bc\u000f+\u0004\u00007#\u001d\u000f\u0012e\u0001>\u0002,\u001f\u0000\u001e_m(\n]\u0002n@|`٘Yb\u001d?vNU~\u000etXz7y&/\u0016\u0005EN\u0011\u000f\u000b\bX'P\u000b[\u000b^$. b+LCj \u0000Z\u001a\u0001<\u0000\u0000\u001fo\u0018VMC<[5T5G\u001b={{ϑҜ+,\u000e\u0018rt \u0005*fc\u001c\u0013\u0002k\u001fC*Fڀ\u001c\u001a /% m8( \u0002 Z\u000bX\u001fei\u001e\u0017\u001aṶ}2\u00153zV}cm?\tq'\u0001\u0017-!=\"!jz\u0001\b˺\u000e\u0014\u001c?B\u001bw@8W2s\u0018Hk\u001cƯ\u0015N4K`3uFݷMNG\u001e˳>g\u000fNեzm\u00169pw5-[Ν{w\u000b\u0000oPa\u0001)?#>\u0019\u0003˫\u001dH+\u0003bJDE;?yA\u0003,\u001fm\u000es⧔пy:ɑ^tռ\u00065b59\u0012q|ěWyu8wq\u0011\u00070n~\u0000s\u0004ŝjkCu\u0003=\n bjOh\u000fTݡti.s8>s.,\u001cuZ\u001ewl;\u0017\u001d\u001esK~?!VFi\u0014\u001c6\u0016\u000b׋|\u001c.t4Oˣu6w\u00016#\u0004\u0003)\u0013D5ƶ\t(z|y\r_\u0019`/{Z{2k=s\u001c;\u001d2a_\u001a\u001fyF\r_0]ѫi82gl߭;18F=Ǚ;w\u0017\u0000ѬBֽ\nRk\t\u0007v\u0000;:\r6u|;MdP\\T=%Ѳ\rh3wٺYsWV>.h|]ad\u0017_17/\u0018۩Uv\u0005\u0001v\u000f@aڪtw,C\u001b@,;e@\u001aH}-11LjɾyߵvO\u001do9_H>Ь>*;\u00059Ohm\u001aOsfoLB0Ӧ^\u0012ͼȯ]RY<*{X\u000e-@@m3m)ӳ1\u001bǉK2$ۍ3u[\u0005XA\u0007e،25\u001a&Jb}WW; y\u0013<wGGܝb_F͒ RJC~f0i~+Z5i*ykV[\u00035N)1z˦&n~ߜdm\u001e{db\u001a]Ճ3\u001asݨ6c[\u0005@t(Uxv28*\\#;9\u001eGR_97|uoAdcy\\9#+rgR7--Ӟ\tE5h;=Ox(ӷXi#\u001ct\u001a1+:Cso5J\u0005\u0018O\bH~\u000e\u0005\u001eP$Ӎա=tyx͆o;\tǪ\u0003|=麛5r\bW\u0014AkB|]0Xjl24hv&%yA|n4n4h\u001a\u0005;lկ9k\u001e٩kNR\u000b-* \u0015Pg\tyW\u0016/\u000f1,\u001b*\u0019\u000bpLi;il\u0017>_}1\u0004{0g\u00052e?:'W$hܢ=\u0019\u0000\u0004rn_{Si?\u001c@9<;\u00000\u001a尙s'}\u0017\u0000?Y9iP\u0006\u0007}}۵\u0012`\u000fGh/R\n<8w^^FJQz5bWFJ\u0018\u000f<hwh?\u0014%\u0006^d쎊};*UKeOuZvO_Y\u0000:w9կEΝ0=z^@\u001f\n\u0017\u0003~E}uʖ˧\u001f\f/?:[iS\u001c6bMݪ/^Yޙ\u0012zwtW\u001daܖgh)xzݩEG]%̿\u0000RR\u0003Zh\u001c\fv;P[}U\u0013'm\u0013:}S;q)oXQSZ2ͼޚ;\b:U9CV\u0014k\u0018M;mFk\u0002>o7\u0005\u0017(\u001c4j۩GnQjUa\u0005ؖ*q?V\u0013\u001a\u001dȃ6o '87fbdu5uGӤ\u001fZDɨs3no=V;R\u000boIs&% 8-R\u0010{L\u0014\u000f5{)MnmD4\u0002ݼQT\u0006 *\u000f3r\u0014`I[}jJjϠȜ_ݨ68\\\u0018p()Gv+ENr\u001b%@Cگ=Q_5fu\n\u0010\n/5\u00112^6nz)vo}/^\u000fk$\u0012;u^S.Ư\u0002UbO3ɵ`d4ק\u0011?.8\u001e~&W\t\u00103ҭmXf$\u0004j\u0016˸ٗz\u001aQh?#jU1ӄ \u0005@\u0011~:\u0012\u0019Re|ϝڡ]\u0015@ғʈj\u001f&\fWC\u000f:uOooμZL\u0006P\rFbz+d\u0001^i<@[7|%\u0016ԤFwR\u0002sQ[}\u0016ߠ\u001a\u0006\u001f5X/\u0004R&;d\u0015׹=R\u0016͌PZX}&\u000f\u0011h_\f^^u#\\\u0019\u001by*6\u0011/l\u001b\u000b\fG6\u0002LGGZ#T;\r֦osSp)v^MIYU7&wخNU}s\u000bd?&\u000f,wVM|r2YI\u001e-\u000byl~+SD\nr950\u000bUK^{\\5ڏ-ֿ/fS&۠eWJNz^\u0019ʵ8N7\tԌ\u0016}뎓\u00016>&|ԝ3v֣D+!*8\u0011\u00155\"=Wsr\u0007z~-mO_zAp+ŀlW\\wZa\u001c޲t9RT[37ۜA+$\u0017 6Ћ\u0018\u0006U\u0012\nC\u0007LhݣXitL{\u001fn;k^wXU\u0007}g'b.\u0012r0\u001f'\u0019\u000e\u0016\u0014\u00173*<-}\\He\u0019s0N_؂\u001cY\\-e\u001b]\u001fe֌8NgYls\u0010`l4ĝN\u0014(OW\u0018z&\u0019\u001b=\u0019ذzV_(׶ŭ(\u000b\u0006\u0007g黗fb;s@3>VTR\u001bGQf/ڈ\u0003\u00187?XZ\u0010c_.ڊ>s\u001c;%z[4\u001a4\u001d׻]/;17!v\u0018\u0006L\u0015K_w]+a%\u0014\u000ef<l+erdB\u0017<_&mv5H!Y6J+gjA}0M\bqR\u0012ymyLUOKGb\u000f\u001bq̓e\u000fYv*mκJ^\u0019>,\u001c`rQ\u001a/J9}\u001d]:g5J*[iPS=\u00012#-Cj{Y\")A%|'|BL+\u0014\u0019TIn\bXJa\u000b~\u0002A3@GEn\u0005*mڷ>.?i:^|W֥:7vKQ\u0015j\u001b\u0013.\u0011T9|\u0005\u0018UBI'\u000e\u0007da1\"C\u0006\u0011>\"4d?T\u001bX;4\u0017f3Ҫy9L\u0018\u0014[bNfr/s\u0004˙ș*+zĩi\u0002`V.CR\u0015\u001ao\u0013\fx\u0012[\u000b$~\u00147]e\b\\\u001a\u0015\u0011Z!nsD\r/P/B\u0001b\u0002\u0005D\u0000Uk%x9\u000fy\u001b\u0000\u0019\r;\u0000Iۣ׹_\"\r\u0010N5\u0011S@W n;j Vr\u001d98M\f\u0007T\u0004\u001bu\u0000!\u0006oHEo\u000ek\u0001׆R*;\u0015U\u000f \u0001q}\u0007\u000e2\u0003$)&sj\u0002\u0004\u0015\bA0\u0016\u00107\u0007 X\n1!,@Q\u001fZ7\u0012 :mۣHR\u0000TR\r\u001a`q\t`\r\u0006n\u0013\u001bT\u0005hj\u0002\u001f\u0000J\"/ܚ\u001c\u000e\n@H\u000bB\u0018BX&@t\u0003)A\u000f\u001d\u001a#]\t \u00061\u0013p\u00123\u0013ץk0G7\u0000i\fu\u0006L\u0006`!\u00030{[\u0006\u0013\u00006!~>:\u0005}\u0004\u0018\u0001z\u0000@\rL\u0000\u001e@yK\b\u0000-R05E\u0002a!b\u0002v\u0011e\u000312 ۸͜srtc,'Eϳg%wAlo~\u0001\u0016wbmY]m\u001a\fZ\u0006\u000b.S2\u001b{7-(8L\u0012+5\u0001[8*c\u0004\u0018\u0000\u0010'@/\u0017W6\u0003aq\u0014njpS8\u001eUOa)>={4&{k1YRėR\u001c[W\u0006l\u0019\u0010\u0000D\u0002\"Ǚ\u0000M\u001c\u0000<\tz\u0002\rG<wjn\u0011\u0017։\u000e\u001d\u0012x-R/_\u000e\u0012w\u00172Ͱz`5\u0003\u000e;\u001c\u00128d\\z/ؠ\\8\u00071\u0001\u0001xu8v\f u\u001c\u0010\u001f^}Ps! I&N\u00175}I꫰$Vϧ;>Y\u0012+K\bNC\u0015wU\u000fo)_\\Ni\u000f\nU\\\u0001ǳvsĭQ?\rs/J٥\u0000J\u001aJ\u00053\u0016\fb\f)Th8\u001cYׂ\u001fy3\u0002ͣ3N5\u000fWE\\.\u0012^\u0014G>WHgͩ,7\u0016\u001d:y?AMu.OQ\u001f\u0002y6D\u0003[\u0005@j\u0017\u000eZ\u0017ԯב\u001a0WYY_|?\u001dxpo\u000bS\u000f\u0007L6\"+]8޺ͳ:n 8\u0012J&\u000b\u001c:g(Rwvn}4mŻ-v]V=]8h\u0015\u0006/\u0000|\u0000BIg\u0001\u0005(POvvA:NST0e%\u0015:h2=\\/\u0017\u0018`Axݵ(\u001cM=Smv\u001cT=Վ&|S\u0011W\u000f2Yar\u001emC\u0006|x&\u001b1J+w\u000b\u0000?{=\u000fݾ\bR{_=^tT\\XÍ[$r^]\u0002=\u0007%\"M3{.Lȷ\u0001plva<Z}gJ7]\u0017\u001b/ql`A͙kenY4DWYxd,\u000bC\nNǘ\u0003\u0015\u0016\"H\u001frJ4a\u0003ݛvǞ1#\\~]elZ/M\u0016]uss']\u0019W-\u0016NVi<56w\rcq\u001a\rʌ=q\u001bB\u000b#1\u0019\u0003s39A'XWn\u000fN~)+v[Gd+1S\u0013!ݚ^\u001d<M{$8kI\u0017\n\t\u001b;欵Wf|b,󅁌\u0014\u0010]R\r=\u001cƓ'C\u001b\u0007.B\u0012M\u0012v\u0001\u0010K\u001aݜ\u0006!'\u0016RR^&\u0015\nhhk˵$e0ogx-%VY4\u0017O\rTJNp6ɦ1U5uD\u001d\u0015;X]|U2\fn/\nZɂ\u0014aݔ\u0012cJv3S1I麐wFwNF]]o-k 罭Kg+8zO\u0016\u001f\"q.O͡0\u001e2x)1\\\rMꜸ\f0L]\u0019`0ǳY\f:\t_\u0000d\u0003)v+a=^ߏ\u0001z\u0018l]\u001b\u0011|O:%\u001a\u00153Ж4SB&M54ǌJ\u0017j\u001ai~RNzlLw :~{VۃJnrt?Ω\u00030ֳ\u0002~O*nj\u0017\u001fp\u0002Ō|\u001bze<Űw\u001d+Amahʾ~\u001c\u001dUG,\f\u000ey*_WnwS\u000e͞PSS\u0016SSPu\t?ݞW\f\tZ\u0000\u0000t\u0001 ,s\u000311۹{{\u001fI\u001e킦ѵ/\u00169\u000fi_0h\u000eGsF\u0015\u0013\u000ewԴ*=B?%\t\u0001\u001f\u001d\u00116lLv%\u0001b1W\u0016rN[V\u0000H=SxX\f9\t{#.\u0005w\nֻ\u001e,ե'\u0015oA.aGo{b|̝\u0011[Cu\u000e\u0006*F}'] \u0014|ztvFeN_zsaO}Y6]?hi}<S\u001ey/埻wl<͗}\u001fIk^Uf\u001f<\u00148`8\u00196QQk|K2[B\u001cڝB;R[*RZhhKZW*m\u0019\u0016V괚mZ\u000esb\u000bl\u0000)q\tw\u0017;i6:*Ig'xgY7U^l}Xs/@fGL\u0015hL2>P\u0017\u001c\u00158\n\t\u0016XE-UyiV\u0003V銔<}|kRr&\fŲإDL0Q\"q\u0017~2B\u0007#ۼd~qF<\u001aiQqF=iæhj)\u0003]Tå\rf%\u0005\u0015DJT~*%E\u001bw7&~ҘRc2u\u001bM\u00164<h\t>59?HR\u0011-o)x؍p\u0012\u0010X3?b{M\\9:XkzdXP{Y0\u0016Kl\u000fM[,\\JwQyg\u0012ϔ&=Eƃ\u0014a\u0016`A\u001fB^\u001d~>{zh\rwݬ\u0007\u000bʰ\u0013\u0018\"z-^Uxrp&\u0006owA_L#QM\u001cٱ`%\u000bDE]70)\u0016\rO|\u0010wX\u0015jm9a\r\nendstream\rendobj\r263 0 obj\r<</Length 65536>>stream\r\nVwU+)j[\u000bխIn׬-\u000b7`_vV\u0019bnW\u00061N\u0003RUO#3\u0000긟ZR\u0004KI2\"M[p\u000fEc6!B\u0019ZfatS\u0017˄\u0013˼<{-V}Pm6߼I\u0004׍_ќ\b)\u001biz.Bx1W*Ns[m?ޗ J{oהW\u000fv-c}mrH\u0015Ɂ\u0013\u0002ڒ\u001afu\"Oyq*jmK]]Jq}S'XB2>x_ʖ\u001f\u000fS*XM,\u0016,W̯Po_8\u000ev\u001b$\\\u000eݲ\u001bk\u000e7\f\u0005:YM\u001b]CT6Yn Ց\u001d^\u001eʝ4a^ti\u0016BZ)Ǉoy\u0014J]k4\"&\u000eE\u001f\u000b]\u0014\na޸JaǼzv\u001c\u001bvѪ޴;ҟ)kaK˶׸{5'4OyvJP(˯&k۞Uj\u001cCq]~S\u0005\u001a\u00057te\u000e*P@\u001fBʹA/}R6vess\u001d?\u0000t[t<5;7-dPoN5G\\{$/*OT3~/ϙ2(-fl\u0006L\u0011Bql3s@)K?G;_l~rU\u000f}\u0015.\\v&\u0013,\u0017?_X\u0014ufbyƛL\u0016~H\u0006Զ\u0004Ӧ^Ň6UdZc*ER,*n١\u0002?\\ЌxMM?\u0004}iA\u0003(4:vSOG<SݫSJuU\u0017պq\u000b\f[ٺ\u0017\u0010g-!<#\\9:cK(\u0015^Hr]&\t\\W2r\u001cY>Jl\u00196T\u001aa~RA.Ob\u0011Bz<o^'eSł[\f3AACӧ\u0015R+\\\u00156\u0013B0uj¾Y{|r\u0001՜:tVe|o@IE^Kl~NzK$&6'=\u0019*Qk<\u0011C?[n B5ӂG\u0016x1\b\b\rX<~A[;e<\u0016'\u0007<QJ]-[s\u001c\u0005SiIFa\u0019&*Gz#\b 4)\u0014rl`\\+|&\"BiC\u0010+\u001dD\u0004z!\u0014[OC<y(v1bE\u001f58\u0016xkoT\u0005\u0014/@x\u0001\u00015\u0001M\b3-\u001dZ.fR9cjs8?\u001fO\u0018@L\u0011G64F'I\r\f2s\u0010,NQjo]*)hHP\u0017p«T\u0005(\u0006u\u0012W\u0002u\u0012!\u0003w>&_=v\u0011.\u000b xfi\u0016\u000b\u0014!sˏ!T;\u0001L\u0017\u0018\u0010q&|Oj>['W$p\u0018*\u0000\u0010\u0005(\u001cg07\u0012\u0000\u00054@F\f\u000fb\u0017pc \u001a-\u001f\u0004 \u0006%c#HbF\u0010\u0001oŜ!8k\f\u0016>xݥ\u0007D\u0011\u0018s#J{irO\u001f\u0000k\b\u0014RW7(Mlk\u0002!\u0001*MCܕ6\u0001b\u000f\u001ctw\bYX_Q\u001eR\u0005H3ӂsMK)\u0000\bK\r\"F\u0001\"lwέ(5w:k\u0013\u001dXK0\n/Y_\u0019:\u001f/\f`%\u0012\u0007XMXn\u001bFp\u000fz\u001b`H]\u0003i\u0004}\u0002(|\u0003\u00016K\u0001y\u0000Z(ԤT\u0005b7qmc\"W}D\u0002ygY|d\u001bڳ2\u0014'@j7\u001e?\"6/Fq\u0017`F(\u0014A8,\u001aI.\u0003\u001a\u0003\u0019t\u0001\u0016\u001fu\u001dS[)\u0005`u\u0015{*r\u000e=\u001b~\u001b·d2)/\u0012\u000fGӮ\u001f\u0005欜{4\u001ajZ\u0018kW,.\u0016h~><ŮW\u000f`4\u0000,\u001d'*\u0019\u0014.\u0006\r\u0012 & Ч\np??\u0003GsT\u0018\"\u0014{\u0006n{r8Z\t4*<\u0016\"*?\u00048j-ۮ9:q=hU\u000bGsYo{/w\u0005l;~wށ|~[{ρ/`\tc\b\u0006f\u0002\u001cQX|R\u001c\u0010gr 27\u0018oq\u001eV$e\u0017WˣYwL\u0001_3rQ_\u001eA<=,\u0004ӿ\u000bz1G\u0017ETO1Mw%U`^R][Y-\r\u000b\u0000_}\u0004tq\u0003$Oy)>4\u001b\u0003ۏ̯A.y{+CE\u0007i9\u0018\u0015n;콁xH#Q:/4v\u001cVXmBw]o۫v)PRi.4o\u001f\u0001T\u0012\f~\u00010C\u0017\u0011\u0001HYg\u0000\u0013 &\u0007\u0019\bx;ΥG',wM>\u000fTQ:gRn\\\u0011&V7DLltUT\fQXt\u0011Zx$K(·m*ab͜9\u0017\u0000>hA\u0001PL\u0001u*F1顃e}ܔr\\<?Rk\u0010g#GW[\u00189[7Vu\u001a\u0017wƅ\n\u000b̒d9n\u0004vj\u000bk>ȓ5^zi3غl2qMÈAhl\u000etMLʿ\u00004\u0007S\u0011;1zL<Z\u0017wL8\n;M\\h*ۙiO`&\u000b+M\t;,Vh\u00112\u000fzƺ:\u0005tUj&\u001b䙕_xoFpA\u0012!T3i軱VɀNz\\<x\u0017Yb#\u0014fz%:3ß\u0016\u0014Btϲ}}<l\u00196Xvܝf~9\u0017\\@nSg\u0019@f\f`&L%e+ܟ\u001c|<_cҙq^~KY\u001bi\u0013;*蛲v̊o7:xn<;䒴\u0004&6_\\c=JXRb\u000feA\u001e4nVwNF_O[2\rN\u0005#&\n\u001d\u0003*F#{WԵ9\u000f(;ڰJ6\u0013m\u0012V\u0006C8/\u0000breKGWz}\u001a\u001af\u001eF.*5^#sLޫKh[2ťY8frfу>8$1=\u001e~G^J\u000fôT\u001cVIsP\u000fCu6\u001c6Hi|\tX\u0015\u001e\u0004\u0005\u0015͟_\u0000χ\u0002& ~\t!_:\u001fs-}/\u0015@مP\t\u0010g\u000b[W\fRf8ov̴DW{|sa߃\bpC-X*>a\u0016zJ'>ǔ;(YNPJn\u0019%\u0001V\u0010\u0001$8ٯ!\u0014gg?{io6H<<CGç}UYl9\rܨw1~<5F\u0001O\u001fĖ_eH\u001cQF3+]:p+]t\u0019T`KNLݡUcC\u0005@2k\u0012;a\u0006{:RUSf\u001c6\u0000\u000eJi/wW\u001e\u0019d\\\u0006U2\"ZQZ5\u0003s XZtHd\u0010\u000et}NunF$\u0007$\u001bE0'\u0016\u001cr+F,Fȁr Ĺ_R&\u001e]t\u001e\u000fqsS17+G \u0017\u000bc,,>!6\u0003R<ꏦ\u0016\n\ryX\u001f\u0006\u000343eo(L~{\u0016dX]x$U\u0005ش\u0012\u0012WK'tk\u0011y\u0016}\u0015G\\w_\u0000䮊?\u0019\u0016\u0018w>qWt7\u001c\u0017@V~f6B>\u001bҽn\u0018^̰:lr-u;=(7\u0019;>םhyeo\u000bE휄g^4\u0011@H|N\u001bZA\u0003,I\u001bj+[\u0014\u001evGNzج~E\t]r'\u0018i7\u001cAbF\u0010Aj\u0015U.'O:=\r哳\u001f:A9fnʾ%DXLߺfdr!TaXn0gsGbs7k\u001e/B\u0017o5\u001b]q\f\u0011rW\u000f붹u\u0016xR}4\u0019ի\u001bx\\\u001f\u0007\tK}(\u0003l]ޛƠ\u0006Z#SZUfV\f\u0005T#\u001a81?ԍҧW7*yndAn`\u0005\u001e|f2~!hQtZ\u0019uuoR-wsX}6)f>l>d\u001a5 ϭǯU\\PR.8ŷƽ\"KU<\u001c(Յ0jW\nB?\\TCy;.&۫-۰c^2oL\u0015\u0002d5Jey\u0004ɹ?M\t3MoMn\u001f=qȭ\u001c9[?}\u0007Q\r]\rsLak`gvĳ^<\u0014EaW\u0006Yko&j;?W(s΢|\u001c\u0005'Nqs\nbd\u0005\u001e?oViqAIz=u5fd˰j\u0017Z\u001d,\f%i,ۛwnW%e\rּ\u0014g9a\r\u0012¤8I\u0003ڮTͪm7ZģrAm?sXEI\nsd*\u0002*L\u0005w⮻Z^92ιwg8ha1)P͑<E\u0006$)$\u000e\u001ey\u0015kI\u001baGZ\u0005?z%ǣCR#&t\u0015\\֮Xh*2(럐(W#\u0014\u000ee)\rjoB\u0015O>]\u000f2⼅Ĥ\u001b8\u001bѼ:-\u001eL6:SclЙJWu~]x1rڮGjrft\u0017g,[dQ)?bP,cs.\n\\[D#[X;Ya=q\u0002R̎Lۑ\bl\u0014_6\"l=þ/EN\u001cS\u0001g\u0012J7m5<E$^\tW~P7\\kR\u0013\u0014?\"\u0016W0[D5+QqĺΤvG|Dg?BW\u001fH\"O7|<w\t\u0016Xn/2\u001a[stenYj4;\u001eƳ+a(e\u000b/8\u0019\u0001#8\t6%ϰ^?\r6;IrC}n\bVޜ3B\u000b\u0014SKq\u0016\u0018QQB\u0002\u000f0p>sڮmjk?U\u00185+{7j)V%_,=M{J6_,ĜJ6zlu>2vz>D8Lo;lbL\u0013\u000fJuEMQxKM*Yf\u0014\rPIbȯqbX_v\u001cA\u0016\u001d9VY&R\f_6+B^oƢ,wf3[bAMy-uRz\u0002\u0019\u000b8+ߖ\u001dBk.`ra\u001cQk\u000bH&{3\u0011^l#BcrA\u0004!ɤ\u0007\u0002auM[T,\f\u001bs΍P*P\u0017ɕۏ\f%D%\"MV\u0014\u0015EeR\u0015d,o&QC\u0011/\u0016V\u001d/L\u0015D5\blq\u000f1#\u0002Md,\"T!\"\u001a\u001c\u0004zZb9\u0007\"~!\u0019ŢRmkk|5sgl\u001aFy184A\u00047\f\f~ۗrXp\f(\u001aP\u0013L\u0018E\t \u0002YdZe:\u0016Po\u0004\u0001>P<`j\u000e\u000byx!_\u0019\u000f0^;Uf?\u0003#A4K*t\f7\u0013\tW`)1hb3\u000e½@L!D\u0014¤ a M%Vʄ؝cE\u0010\u001aC/?0oo|\u0017~\b\u00102(`Pj\u001c'zoP\u0005?L?&cpga\u0013\u0007zG?<L\u001c⚍A@\u0014!5Y\u000b[\u0010/?\u0006a\u001b@\u0018?`P?\u0012\u000bP{D&Ty\u0001Dc\u0000Iao7\u0006\u0017v\u0017_zbѨܺ\u0005quO\u0018\u00013\u0019D\u000e\u000e\u001f\r\u001cz\u0019\rB\nu?\u000eW,IG[DUNPy;=\u0007_W_\n\u0001՞\u0000y%nX%(Vpͻ|`\u001dz?\u001d_\\\u0014:<\u0007\u00126Mw\u0010ZVq*d\nX#/lBfad!c%=t\u0012V=_\u000fd\u001b\u0001@\u0004'\r \u0014@9\u0004\t\u0007H\u0017\u0001T\u0002Z^\u0001Ax}\u00104P\u0012uP>\u0004ֻg\\~_]\u000b5\u0013pk$e\u000ex݅ㅻ#\u001edo\u001bTܤ\u0000%P;\u001f\n;m#1\"\u0010\u001cJN\u001d\u0000h\u0000m\rhw:=:\u0017͎ȲS;Je\u0010\r\u001bAi?\u0014>JsvdɎ\u0006kg[HY9_a\\œv\u000bJx3{U?\u0000\u001f\u0000hC\u001c}\u00028\u00134\r\u0018\u0001PnD$k\u0004L\u0017i\u001f12=߿\u0019ņmׇԍ}\u0017wu/9,nNnx\u001e\u001bij]^M7E\u0016X/\u001c\u0003qL;#$\rR}\n\u0000\t\u0005]#\u0000\u000e\u0000~ڒ\u0010\u001f\u001af߯'ϊ\u000f@zwI׃kX\u0017UVeRx8Kz\u0001j5q7\nǵ4\u001d%|/\u001fv\u001d0>^{\u001bi;&X깍T\u001b\u000emRkIVC\u0007uP\u001d\u001e=9\u0004'V0\u0005\bο\\?\u001foܽ5Kl=8\u0013彯T+S\\\u001fbu\fd^\rsR+Q-la}[m{\u001b#&=\u001eyf\u001fkH.7O~\u001bnv!\u001fؽ\u000fۙU\u000e\u000f\u0000![h\u0000%C@L\\\u0004\u0010t*\u0011+2-\u001a?Vg\u001ba2a?n!}\u001fs6]l֛\u001d6U{)\u0016f'8PNo\u0017./2c\u0015ۯ T\u0002r\u0016f}3d?B\u0003\u0010}cM\u001c[?\u000e6]K1K۠{hlnL%m%ٲ̬\u0016I7-'5\u001fE̺v9)9\u001fp,of'\u0016\u0019\rBHO?N95]u3T\u0010LN/$\u0014\u0003s=\u00185_xnơ<Y\u001btJSg*c#\u0006Rn\u0014Sn{o.z¦gh4רiM\fMwbYM\u0018\u000f%U\u0001ς\tsF䌀$1ާ]UjՇvۋ!\"9`Ɔߚՙ[~\u0017Y\u0006%5\u0002BF^/bNW9\u0007_BLCŉ\u0003St\u0004\u0017ִ\u0001m\u001b\u000e\u001b^w}\u000fP=_X^i\u0015I\u000ey>iFz<M=gS-mL\u00015\u0012Z_CE|6\u0007Y\u001bsrg\ff\u00175$)ܛ\u0007\u001fگ+Y\\n\u000e\u0017n\u0017D\nyH_7ك쫚1/.g7\u0001[ת\fO\u0005:\rtm3,eYuuc=>\u0017{#$\rAW|\u0007VDFH\u0006x@\n7#{\u0002n\u0013_~>vG?/`lmnS>lV'.\u001ekR\fFOKܭ\u0013Ĳ-hbu=]\u0010PO1qљUE{(԰d]\u0003H'Mp\u0011\u0010`ɸvsOÊUKi~2\u0012nŗ__\u001f\u001a8KXB\\\ty'Frʶ%fR>KOVM\fXB Y.{\u0011\bȭ\u000flma=\u00181d\u001e̾f$\u0019^?R2=.K\u0016Xm^\u0011ĎK¹\u0002<lLU1C\u0013()Eu>Zdj+ZƇ,\u0010sӂ..\f9w\u001d#\u0007}O ݹ\u000eajfլ\\S$MwӔxg\u001c?ww\fB~K\u001eOʺ^\u000b8RL,QM\u0005S:_;j;V۪[\u0015R\u0011\u0017\r/E}̅\fǳ\u0000ՙCgpK@6y֤Bz\f~@}N]=d\u0002p<sb9/bF\u000b\u000bF\u000fukςxk8GK\"LSZO˻\u0014!\u0002\u001dd[\n\u0001|\u001crU\u0006%cL#S{6y?q]oXdu!D\u000f$ߘ$\u00179O%FA~t5sz:\u0003a-\u0015kf;zN[ژ3s\u0010~դ\u0016o)駴7,R,\u0017\"\u0005:+:hQ\u001aJ\u001a8q9\u0006L? \u000b0\u0002Ǟ&QՊ\u001cQ{,\u0019O\"L\blG/w\u0004dN>\u000fCz\u0016v\u000e}Z\u0019{)3e+[\u0013N\u0014HxR\u0003q4#sf\tyEYu0A\u001f>1&\u0016K\u0016EF\u0019\u0019#j\u001aᢽ~aʼT::\u0006S,#k`$?B㍇qkN'a\u0005;j+͜=b,>'FeXF\n\b.Χ$/,sf!{\b3K{vYs^,L\\T\u001b.99.c&DEE\u0016E'!:ZwW\u0010\u0018I\u0004ֈŲ/GF[\u0016rs6\t`9ب~\u001dGIGKg\u0011\b^q;v5fVAc.n/\u0007o`;Im\u001c \u000f\u0011{fꄰ|\b'Xt@w?\u0011ݥsr\u001e\u001cO\fI\u001aM1L{|܆f\u0017i\u0019և(g8g\u0000bv)\u0006H(1\u0007ٌclGhRF)1d'\u001f۶Ƌ$׈}\u00189A1;\u0001\fb}BFev}\u0002\u0013Ӗ<\u001cF#y<s\u00107\u0011Ssc\u0007T\u0007T\u001aW&zi\"_ܾMe$@׎^QK|PϺ5.qpX<6\u0012J׬gnZ'w\u0010}\u0007\u0012\u001c5*U8;Ҵ\u000f*r:6K\u000f?ꝑ&AO\u0001^Kʷ5Juv]=ExXi͕&ٴ\u001dkp\u0002\n$c\u0000:<^Φm\\\t R.\\\u000f\u0004!\t!\n\r\u0007\u001ax0\u0004\u000fzrؿ\n\u001cCךtIV\u001dcsW\u0007\u001dаۉ=<\u0015WZ^3T,N/j\b8o\u0001qZY\u001b\u001aE\u001e8زf\tڛ6$U\u001cj4K헖M1¬vam~HÄZ%yiOMf47ORx6mc\f1,ӣ\u001c6a=\u001f\t\u00058\"6j\u0012>4fa*nL9מo|ZgyТ\"\u0002]6 \u0002ܠFԬѽ\u0013\u001a:r#\n&\u001eTU.z']ޗwUcGpz\u0002j.U<+k\u000e~'\u001cI\u001bA1\u001eD{g0\\qc|Z\u0015\u0001\fVߴ-b\u00053Y;\\^byrދ%/-@j0L@`)V`IsO*\u001cJ;\u000b+9im}eէ}\u001aIt\u0013G]?\u0010FJ\u0017{}Uar\u0005\u0006\u0006\bZF\u0012ο*]E\bz\u00145W.t\u0002⡞C!CU\r-N{8d5z,1ʋۦէ>\u0004՘Dwl\b\u001d۽f'`s۷rT\u0002A0/ըY(F¹3\u0019\u0014>卼C27k\u001c%\u0019\u001e[\u001b0{\u0000kX\u0005b\u0004w\"v\u0000\u0010}\u001bs\u0002/Th%΄ɨ4\u0011a`g^(.pHn)!M;Ϸ\\3w\u0017G%\u0010=\njҧ^\u0019\u0006~}\b)[\u0013*YR\u001d'̷\u0007\u0002Xo\u0012'eE\u001b[\u000e%\u001e]X\u0014\u001f$<\u000fN{l7ZG҆\u001af=\u0018^\u0001+r?A?^8fp\u0012\u0004LziW\u001a\u0006pTS!ܑ}\u0005\u0006QJo\u001b&\u0014.8Qv8s\u001cI\u001cZ\u00051¦z׏\u0016&ezJ>R>8S.F\u0016cFxZ\u001c3U{I/eA\u000f\u001eɲ4v\u001a'\n2K\u0014'*x8\u001f7;]\u0005Ǳ)t׍c\u000b\u000bSǔ}\u001aX\u0016Rjʢ\u001bJ\u0011OQ4jb\u0019`_y\u001b%{/c\u0000\u0016\u001a{6PC!\rUzg\fO|K\u000e\u000b8Ѳ\u001dsqw1A:rk8E*,)>OR\u00125N\u001dtۋzsCύr)<9C/]OlblҧBKpn(?B9Ln]\"|\u000113_|<(m)Tr\u0010YEWktX!\"R\u0002x\u001c\u0006\u0015!r)nM'w}pe\u0000p\u0000rӧQ?YuߍQa\u0018$'rz8\u0017Rn}1U)}O}Z,h|﮺\u0016v\u000f\u0006IDy^\f^<\u0013dckMJ\u0006=\u0003\u0007O~ImjMa\u000fP+壬\nJ\u0000\u001aB,?~U{18|e_{o]\f\u0012]]\u000bN|+\u0000<y\u0002Qiz\u0010\u000eN{8,Y틝Ȯ$bI/~tGMK$$wO?%e\u001b'(_zɡljT\u0000\u0010\u0017oPPO01O\u001a8?Z`x\u0010auwy7޻>\u00029'wA\td7\b\"<\u000eco\u000fKҸ-\rx]6K\u001ab6]M*+!ɯN$o߯d\u001d\u0012&W'\tW\u001ebokd\u0007q\u0004#\u0016uf4.Å{چ%q^3k])A\u00152~Ɩ-X\u001b\u0010Dgq㊘]*;c}\u001b_Q»$Ba\u001ah\u0014\u001acR\u0018own\u0001F.\u0012\u001d\u001beg]\u001c\u001b!Xtje> &R]uqE/\u001f\u0006m\u0002(yQ)\u0000qP{-$˙rBqsՎ\u0016\u0016&n&ǌ/i$~\u0005/>yq\u0005\u000eLW?uf{ܵ\u001eWZ~[ךRN]0\u0017\f6\"}\u000f\u000f8\u001f0\u0003#ߛn\u0002\u00174.i\\T>`\u000b71;\u000e\u0012Һ0gvi6Rc;/\u000f&\u0014țq/CP_r\u001cNf5PkByK\u0015vcI>X\tD\\zEv\u0015v해7?;'u!N3K_=!y\u001aB\u0002\r!S\u000bL=xvz\u0011\u001dURr\u001e\u0010elI/)+ent\u0007\u0015~Pp}Kuc\u0017K0ϋ\rjnڬC5[iI>\u0005\u0003Q\u000b\u0006\n|tј\fPL֢HC.To \u001ce'f=E[N71Zg沘JWǒ]\u000bk<ct\u0001%M5ɣġDnwW|gx(\u0019mNά?\u001b2\u0014j1[VR`*\u0007P\u000e\u0016f-@.A|\u0013:\u0010a;fl2/I\\D>;_\"д#\u001cJaUc^.\u0007s`\u001eh,dӸ͙W8\u001a^OzM\"\u000eԼZX\u001bh\u0015\u0018*\u0005᎑{Q\u0006Ż#p \u0014q\u001dYZ\u000f'fdMlX\u0014mjcA6Z,q\u000ey\u0003o>^Y\u001a`\u0006vTj\u001b\u0019\"*(JZ\u0012;Y\u001dâ]DB\u0011\u0000\f\b't\r\u001c+2쪭mFVYxX\u0014:b`,G\u0007qW\u000bo\u0013GL;⌛\u000eQ\\Xrtp[i5?<*'xc\fH\u000f\u0014u\u000e\u0003[cǈagO]작r\bXe,3\u0016k\u0004p\u001ey\rn3!xwڟ\u0010\u001dG#h\u0006娺tqӘyd,Pԙ\u0010P\u001f3\u0018\u000b/P\u0017u+|քiJLwXǦഝ<Jdnۓ!w'C\b3V\u0013s;_fdl\u0019\"\u0014\u0017[U\u0014^E*\u0012v׮ML\u0003*\tJSU$=6\"vz|K*\u0010z\u001bk0ZOwK-0?\u0007g~zXj#p\u001e)*\u0005\u00033cpM^yfS\u001aKd8gd͸so\u0014\u0015M\u0018m\\\b^/H\u0002\"м,e\u00148\u00160\"bFF\u00025h廓Y%Fn!fңG^'\u0003h1*R&z`HX?\n`4\u0007)\\{EZ*} r&ck\u0017Q_\u0013qIђaC\u001e<8XLB/\u0005@\f<]1}C8\u001c\u000bR~PNaiFnfr;A!*I\b;a幄\u001dE\u0001;89^\u0016xtB3I)޽2[pYbgi99hncacKN\u001eUtY,\u001e.Hn\u001d+x\u001cL//G볛S\\cs\"Yxi\u0011x\u0015zD \u0010x2\u0013~izG{-IC{U\fG(\u0014\u001a\r}Ys\u0002JN\u0007ֳ,}ԑo\u000e\u0012;\u0015b8\u001e4Xi\u0018ui\u0014\f\u0017X:śt\u001f\u000fQ <mQXd\u0018\u001a&T-.lҹr&\u000f:v`T1\u0003\u0018\u0015\u001fm4\u001b\u000154ww\u0005>\u0019D(m\u0011\u0016umyۄ6sq$O\u0006x\u00124\u0019s\u0014:̜\fl\u001fl\u0017zA\u0000y\u001a\u001cKU\bBd2\u001cd}lփYM\u0006%!\u0007\u0011a\u000fJu\u001f7\u0014hg3R4\u0003Aw:D5S\u000e\u0018byᢹ\u0005R;%\nY\u001bm9<bh|\n)lLGK\u000b\u001c#Ğ|/?-\f,@pXp\u0000\f\u0006#}J\u0016Wy\u001b\u000b\u0007\u001dCwH^pAawg)_Ӭa=SUn0_X\u000ewF8؍>DsFݰi_aǥZT\u001bE\u001bA¾p\u001c.r7`;woo\u0002i#WSuy>\u0015>cDc\tc.%afO\u000fթeMH\t25~B\u000f*\u001fzTop~y\u000eKkn\u0010gP*\b\u0014͏\f$\r8\r~Kz!\u001c\u000eKn]Q6P>y\u001f[vZ$<V[P^j.ͿIW\u0013\u0010\u0013u[k[xRwG>oG\u0005ֹ.\u0019\nv;$\u0000L䋇=ף\u000bA'A.Oޅڄ9l`kA<nҗ]zx6s\u001e7u1\u001d*՛CΪ\u001dOCv\\wR񋷽WLY\u0006舚򨩼|9E\f\b7h[[\u001fZo%\u001fޚ/jQԮi\nZ\u001e'LfԂ\"\u001e+{.Wz\rAD;d\u0007K\u0012V\u0019{52\u0019a\u001bC\u0016'aqBW\u0007_N&#^Ezŝ\u0018,_!v a/\u0004C0Biu\u001a\\K*$%yUKe/nqq[+E!͋3w.֖>Xhw\u0006V\u001f\u0017z)졌|qab\u0006\u0004h\u0001KY\u0016'e>\u0019W\bX\u001e\u0007\u0001:8>.6QT޺\u001eVz\u0015ﮀ{F9W\u00013A\u0002\u0006\u0001dZl\u0000\"M\u001b\u00002X\u0000%x\u0016t\u0000pڦ-'_>\tވ!,klȴ؞'\\vi4nkuGp\tbTn\u000be\u0003@zo!\u0006q\u0005\u0000\u000b\u0000Z5\u0001\u0014CP\u0000U\u0002\u0007\u0005@k\u0019@?\b*3\u000fz\u0018mv'\t6E~\u001c\u001f\u001aߠc5cB>\u0018}\u0019Tڅ\u0007`|V\nqTl\u0014Cxn\u0000\u001b\u0000k7\u0000+\f?iU\u000e\u0006/\u0010:\u0010\u0016%\u001a\u001eO\b[;Sio\u000f\rb16}\tv~-s8w#41߯\u00155]\u0004kj[&س\u0003kRg\u0000E6;\u0000%j#;\u0000SFʬo\u0017lͿU4^l\r\u0012\"%OCwdEq)x8q<\")W\u001ch'sKn8\u001e7)rN_:/R&QuN9J@\n\f͔0!J_J_\u001c+i]\u001a`;@nZik#J\tniBN\u0003\u0014KYNF\u0007Sj&G\u0006Jbj)^s\u0018*{^,ޣc+Ͽ/\n.oy%93N}#\u0017M7rYı&4TrL7иGh۵\u0012n3vKƅh_&z\u0019~&6{V̇`tc~Ǉ_~~Kڋ\u0017,DO7'}\u001fq(8\u001e[?yj\u0003\u0013@S\"%Nr\u0015;v\u0017\"\u0006JMk\u001b]^`s|*yD7h4f{\u00137\u0018){a=bws\u000bp!K?\u000fܛ\u00147=MAts7'\u0018\u001cX~ş\u0014JN\f\u001bn/\u001c݊\u001eͲ\u0015^f\"wo\u001fWS\u0001wQ˴Hp|*\"-ﰭA~\ry;1zV_grO9\t*\tP\u0002̟<tn\u00179]'OӲӼ]7G\u00177\u0016Ͼ[O\u000b\u000bNo\u0010\u001e\u0019rs8ls}[ѭs\u000e6Yam\u000e\n\u0010\u0010yk7_/_$Ŧ,p;}\u0004\t\u0010\u0014w,d<>ir\u0012\\ǉ\u001atkj\u001f\u000euxwTFQ#cWi4\",lܝ\u0010ߏGX5bQ/\u001f\u001b_$͓\\\\\u001f&9}ܖx\\=\u0014shqV48no>o7l\u000b*fX\u001cК\u001bjQ\b\n/,\\t1\u000f$Ϣ\u001eA-\u001f]-Z\u0015-J_$9d3%c~'쳹b\ts!y氯\u001a$7\nT.Dz_J^8皥V\u0003\buVA8\u001cΚoE׽^q߸\u0013qs7\u001dt*c2fv̌YKp]K=v*\u0017Intms\u001e{p7=-됪~h.z8h\u0003#QɥFP\tXa)\t#O؍%°54s4o{\u000b0\u0007m\u00025J;3\u0005JYC%d˟(<]ߐ)\t\u001b\u001e \ta'\\jWz\u000bȏ69}p_;\u001b:;Kώr҇FüF\u001cl!n̩i\u001c)~:z0nt忴\u00156\u001bʫSԚa(b77I\u0001м\u0014@wTVjC粣+i\u001f\u001a<^qg\u001d\u001e,M[W\u0019\u000fy2@w/4\\z@\u001am\tu\u00148o@>xdE֡,!e\u0012\u001fm3Hvwq7\u000bu\u000f\u0017_亮4q\u0000%Rv+9kK@Z,M\f(g\u0015\"}q /z3xi\\\u001fPNY~[>\u0005\u0004\"]\u001dt\",Z\u0003\u0011v\u0013\u001c6}bV^2\f嗟\u0017zSO\u0005\u000fC\u001c\u001c-Qs0\u001cE'\u001e3[\u0018qTs\u0014Tp5Tz+rqs*EAEME6\u0003<\u0004_\u001c&7C$\t\u0017\b\u0019?\u0014_Xv/h;]7\u001aG\"xO-'J\u001a١sv^S|\u0006>աiZQڦUY3r\u00191\u001f\nM\u000f~]_Mc\b\u001bJ\fDTc}@\u001f$A\u0012\u001a[FvjD\f%Ce/\u001e\u0017rO[?ݒ]^:6>\u0003ݾ'\u0005\u0005\u001e\u00060\u0015uh\u001cA(ǐe}%gY\u000e&k+C>\u0011\u001f\u0017 ^\u001c\u001dlU\f>i9IRT\u0011=.O\u0006FLy)\u00198\u0014\f=@\u001c[Ç\u0016g^}~與C2ӣ\u0001\\^.Y\u0007\rE9o|(e\u0003]->\u001ez8!WnYGVL8\n#)I\u0019&w{_~$W&\u0013:\u001etH\u000f縔@ΐ$=eSCTYz8\u001d\u0007?;Y\b4'hPf3,Y\u0017\u001de=\u0016Fu\u0017U{ak!`;(bB{b\u0007\u001a$!\u000b(D֨\bA;b]cFš}oF&'Ƣ˕U g\u0014'\u0003[ϜИNWmg\u0019l\u001fb\\/\nue\u001eƸ\u0010\u001c1,dF\n[YVGMWpb<%ǥ:\u0001`j\tX\u001d[-^|kxZ\u0014q2\u0014q-\u00172\u0005F!dXبiQ!?at\u001cp{\u001b2 \u001eWn>y8\u000b;mɼg\\F,!\r}aZ@Ervy\tS\u0012U\u001f1C@O\u001cr,ZQ\byIҸWvi\u0011\u0007(%\u0005+'s!%2ֺԝqKpq\u00185,P;6BH\u000b\u000b.`Goܾ+\u001c\u0019\f\u0012\u00119l\u0000#8\u000e3\u00193n+5kOo!P/i:U\ra?h5Ӆ*Ud.&<ui\u001dm~CRCt6^!\u0019|hGQ\u0019AS\u001157Ûpu)Zuf㊘j\u0003n09\u001c!pA`fLI\u00181\b&\u000ba\u0010\u000e7\u0004$?eb1DkKH\t~e\r(5)#CU\u0019\u00151y?Q:M\n\u0018G h\u0011KJm!xv=\u00115EE}\u0005;Jr\u001c-`K.\u0018hvX%\u0003*)Uo\u0001%\u00155C~64\u0007\u0003A+B('L\\z\u0004\u00152˧\tӘMޢO\u00195q\u001fy\u0015\u0002A0y\f+\u001c??F-R[?a9lڠ7=kW\u001bn$ݮ3b]\u0015\u0002]uѿBBOv:R ΖZMa ~s\n{\u0000O$6˨m;[\u001e\u000eOt\u001egXO\u001f;E\u0002\\Y\u0003ADz(q11k;v%^~LR\u0005\u0001iﵒHe[\u0000Z^RO~\t\\PݧZX2iVԧ@\u000fS6\u0016\\ufWS]`?ZB[NR\u000es&YBlyV\u0019cl;\u001eԶ\u0013\u0017G(0e\r6K8ج\u0011V_R/7\rf\u0019w\u001a\u000eC7\u001foq}Ծ=\u0012+(1\u0000\u0010~9IR#\u0007fuol\u0006vs\f·'\u001f w~76j>V:\u001d2\u001b[ǫ\u001dܾ>ҟuo\u001eIO2;\u0005Q\u0015\u001fW0NqoY^g*\rtEOl1_6Cw\u001c:!N=-6Qv\u0006ݭ\u0015\u001eze\u0007e\\XMf\u0002Ʀ\u0007\u0011/\nR/-Kiʥ#a޳a\u0000J3Y*TiRO5tSˊiPަTf!Y^B8{W\u001dĺn.=:uL\u000b*9Tzl®\u000b\r\u001fkC^ϔ}1ߞu:\u000b\u00139\\Pr\u001c\u0000w\u0000F\u0011\u0000\u0000\u0002˱\u0003\f\u0019|(jں{ \u0016_\tc\u0002t\fRN\u00173\r:CۛBĭ/Nvu)⁤sS\"\u001a9\u0004o\u0006\u0003~\u0003\fϝ+\u0000|\u0000:\u0000S\u0001\u0006JO\u0004`<\u0007\u0000p\u0002ː\u0007k#\u0004JU-el)\"u큅јο\u0007\u0003[Cfr,nQM\\;'M9\n\u0012M^a\u000fT;\u0000\u001c,RW\u000f@r\r#\u0010\u0007O\u001eڷ\u001b\u0000rk\u0000Z\tE\u0000ř9r{ʩ\u000e\r\u000b\u001a@\u0003\u0000˜\fU\b+䇣\u001b\u0018\rC\bwO\u001dln{\u000f~\u000f\u001cl}W\u0002@\u001f\u001f@\u0012@.b'狶\b@i\u0002\n\u001ek\u0000\u0006\u0000\u0014\u0000&X\u0000o\u001d\u0000+g\u0000oYlcR\u00101KY~I\u0002Ky7Xs`sGnu{\rd3\u0013؟fI\u0002W\u0006\u0001u7\u0003Wn[3\u0003/;aOU︚ۣ8+:\u001d\u0000G9ᗟk<'\t)8T!\tIJ[q<SV8&;Y\u001f*ߧה;J.eTSIҿ\u0015ߪO\u000e׭d\u00131ӠSqq\u0002:|\u001a\"̤8Z\u001abgxd(@\nWIieU1e;]R\r\\{9׮w^ײ\u000b_k*MY%3I14T\u0012xR]\u0017l\u001aeiv}i.ɠ\u00044\u0002gEC ff{\u0014;/ײq޾&\f;ۓG4@\u000fv\u0007NFyo?Vxooi\u0012n\u0013YƿaAt8֯\u0005~2||i\u001dz-\u001c\f\u0011̃(\u0000]\u0007M\u0003vm|֮:^,\n\\]>\u001e}γiޛ;)Ooo`l3(\nI\b\u0004?~{ϩrV\u0011\fxƭ{vЫ5<W\u0013ₔ\u0019<z\u0016)l#E\\\u0003+\u0017/w\u0007.\b-DoM>Fk#_⯳_UxkTvxoF.NӠM=ų\u00067w\u0005\u001ewۺ_s(x\u001aڑlxq~\u0017Yȝr[ʑn<]\nC\foޕ3\u0010E\u001e^o>b\nҌ\u0018_Զ]d\u00135:I|\u001a_^V]|q@mzZ\u0010\u001d6\u0013D\u0006Ƕ\u0011oz?qfjIv8Aĺ0u?*D5\u0014.^֥}&E\u001cc!#zq1\u0000㗚\u0000CK\u001fn\u001e\u001eRkt>=4\u0011%Sz\b\u001b1C\u0012n.`\u0019X.\u0005\u0007}-\u0015>#\u0012\\\u001a~+)kh~G?|0/3$4\u001fYu\u0007\u0018^-\u0003F=\u001a\u0000mW\u000f\r=ɻ_$@\u0012`^膜ֵ}:\u0017\u0001WA\u00046jel6򢃎fA\u0017G}Qއ_j<b\u0011E)\u0002qm9Zi\u0016ao[\fo4ǘjִ\f\u0007f0\u0005ic\u0018\u000f[+r\r5\u0011\u0006,A|L\u0005x\u0007;ͷ\r69Ier\u0000,N<Ҙ?6$;\u0013\u0019i3՝~[NF:<f-\u0006\u0000,5\u0002Ah銄gY\u001e\u001b02PSU򧘽-\u001bWJ+)\u001avq\u00062[%\u0011qZ\u0011y)v;~6\u0005y[[튷ܲut?{n/\u0000ݥv\u000eKG¬=\u0000tKix嫑 \u001a)\u001bXh\u0014\u001e`j\u00189Zj[J\u0014{0r\u001b\u00139)ƣll6k±-z+qT^\u000e9\u001b~úLǰiR\"m؜\"M=I1\u001d\u001a\u0014kuÈg\u001a/El\u0005Hӈ7j\u0013КhvPx\u0019GP@,'km{\f\u00070\u0012U޵+z\b!1[e9\u0016S^?~\u0001xwxu4>h7͉\u000fB/oV+\u001boEoS\u0011WW>Aܑ\u001f;IMG=CU\u0016P\u001dޞ\\klҟsE\feҫ\u0002g`\u0019(K\u0012gig0r[Zkg\u001e\u000f⊻\u000f\u0004GK\u001fki>.Ӵ6񋓬U*\u0012X>]y^B&A%Z:\u000b=\u0013ȏ̃[F+\u0006T\b\u0015\u001cS;9\u000e\b\u001a[9\u000fD2⤟\u000f^a\u001fE\u0015c7\u0006Y&?WnU3b\u000b\u0007#,E\u001e\nպgەn|\t\u0013r\u0016b=/\nVҎAֲJ7=WJ\u001fPU\u0016B\rɭQ7'S>kg\u0002i(f iH\u0019\u001fn3\u001a6\u00124Q~Cr9p^_v\u001aѭHi硻k\u0005i@,[\"2`\u0001g1O,G1D+e\u001fmE#Hi9y\u0004z\u0002\fI2E;$^Z)otE$\u0003&g\u0015jJFEd\u0001Ӯ[]j\u0015k0cFx._rP2η,\u001f\u0001?\u000fwÓwQo\u0012c/N1\u0001Gtm\u001f),&ƥ\u0017_}>F$%O\u001cww|DJB,JD,z\u0002\u0019\u0015:\u001fBy\rT\b6Ȣh\b\u0006/\u001b|yj\u001bf/'42\u00101\u0003'|s(\u0001ͩfv7\u0010;\u0002K<1\u001c.dK6$Q*\\tKD\u0000\u001esՂWwQW*^=S8cO\t7\u0013w(&\u0017C\u001fV'7Up:ֽO\u001ezF댻Bp\u0017ܰ\u0006rcO|Р;\u001dD7+lbv)y<aW:\u001bx\u001d,wwķ\u001ba\n&!zJ\u000fjֲD\u00172x01D\u0017\f\u000f\u001f\u000e'ǒѮ@Γ|e7ꮨ-.OVȑ͕}``I6\u0013u}V\u0013\n19=v\nL!=\"U\u001dD0\fm97+1\u001fv\"2E=i\"\u001b\u001el\"l\r\u0003aUR|\u001f)Rt5?mn4qEԑ\f\f2WT%s\u001376Ӣ\u00065}ɬEc\u0017\u001e7IlOb\u0019%*\u0004\u0017*5\u001e\u001be\u0015=+Îv5\u0002\u001d+<\u00030ޝ!v &Rp\u0007J57b=Laν_~\u0006v\u0016\u0007RZR|\u001b(\u0015\u00189oړx@eai1\u0013r\tQ5\u001c\u0010\u0017^\u0016vDOC_\tT{^iHN\"\"&̊!5c\f\n\tQ^@h78<\u000e\u0002\u001b\u001e\u0004\u0016}u!jAT\u0010g\rЧ=v\u0003\tf^B:+\u0017\u0006C7U#8:`L`\u001dqGm%\u000b \u000f\b\"SodnC A\u0011?y\u0010m~>6=Vz\"ZM\u0010w[=r{^#}˪3ܪr(\u0013|H\fל\u0010ԭ+X˛\tZ\u001b\u0004U\n%\u0004.\r\u0018\u001b\u001eM'\u001a\u001c{`q\u0006I\u000f%\u0018*8Fzb특[gzb\u000e\\m(mk|\u0019n[\u0014m[\bi[AM\u00187jwf\u001a΍mu_r[}\u0001ِ㸟%!ud1;W\u0006\u001b c7:ȼw\u001ew/\rՎnsG\u000fX6->\u0000\u000e4¢,0CY`kchgӴ5^\u001aR\u0002[w:%:mH<sZ\\\u00129G\u0007\u001a;ΎBg8֧GO[[Dd\rVnһ5\u0017-\u001dhϛJ\u0003ƚ\u0006sFy<8kkRVy1Փ>VO8PN\u0004\u0014:ctohf2Kf,?\u000e\u00175\u001c5K\u0011+ݣ0 4H\u0003l>L>ZkЪgTN?vܩr\u0006AJA\u0001m+\u001b+T0k@r\u0001]3D\"A\u0000\u0014V\u0004Asv\u0007k`Ol,\u000fVX$9Ja\\8>x}\u001dQp+\u0003sIfsJXs5\u0001Ӂ.\u0015+\\\\*F\n\u001f\u0014iq+RY,|\u0002uF\u001a}΋soZ/wL|%y3Cg~w{F\u0016\u0007sDE]lciRtG т\u000e1\u0017(ڼ (-+9\tU/-&yXDtE\u0004V5\u0001hv\u0003\nڥ8O\u0000:\u0014\u0007\u0002Ϧ\\\\\u0000J;\u0000}&\u0000}a\u000e\u0018\u0000<\u0017TUn}-\t\u0015YQ\u0004\u0004\u0004\u0011\u0015\u00039G?`s\u0011;HQ``0\u0000T\u0001nki[=\u00031o' c1i=\u0017Aѭܼ\"\u0019y9޼u`f\u0018.Z\n\nVqS\u0001%?\u0000G\bwƫO@\u000b\u001c\u001d'D\u0003\u001c\u0003z\u0001A1m@\u0016Џ\u0006\rgތQEq<M\u000f-ּtTP(ZzU󡜗.[~A52m+\u0016Z\u0018ـ)K]\u00100\u001c0^u\u0003u\u0006l\u0001,\"\u0001\u0007\u0004F\u0003vy\u0002$\u0000{w\u0000\u0007-v\u001cQ\u0010\u001fؽ։\u000e\u0012Ev-S\nKd8OO\u0016%J{P5jpzm\u000f\u0006e3\u0000ܦ\u000bް\u000fXp\u001b\u0001V,N\u0001V\u0003W\\&{:\u0002ßT<x \u001ce\u0000w\u000b\u0000?>\u0001?W?,\u001f-_L\u0001oZ\u0005B]Ű_FVoR9\u0004J٤ꬾwItNA_J\u0015H;Ӷok^ΘC?׊\\ow%\u001b(\u0003^\u0010t:lT.T\u0007\u0004&\u00005JB\u001c\u001c3zO+ze=W1؉\"\u0018\u0018K}5\u0018od-2[\u001a@Q\f{\u001f+oZ_쏾\u0012*D|J\u001e\u00137B|\u001f)wIDL\u0014b̉uYW\u0018\u0005k\u001ei\u0005sR8vTx*<v_\u0010ܦ{ۜnkfz._#VJBy1n\"x*\u0014t\u0012Іy~')\u001e3g/8\u000fw匏nm~[x葹i\n;_\u001a䮈c\u00063.\b\u001f\u000bћJi;\u001dѫ\bQ\u0012qu\nz\f!o;r$v픯;#ᐽt>cMVͳ\u000bm39uNܳwaRtyG\u0019)f}\u001fo:[==27FN^S7\u0019⮕8 c|Q%9ne-a\u001cuGKޞt|gϣ_\u00041كt\u00163^)O47[d\u0002č\tAYj\u0015\\ĝ-Vd\"~\u0005\u001f\u0014\"ƚY\u000fDnZI\u0012e:zݻb^E+7grj5~^5\u000eңëxlczmau9o+\nok\u0017Zqa!\u0000-\u0015ܷ\u0014B4\u001bC˛-~V}\u0013\"Z-(;9]!_>XQ琍ޫ1\u0013\u001e\f\u0015YW\u0011j'}^f5~%[Gt\u0016T\u000bҦai,Ln'OS;lO&\u0010$(k\u00186= \u001a?y\t1\u001elG\u0001+%R%A \u0019/:G\u001f>%>%x\u0019p\bjPgߏ~=V[\u0017\u0019\u00064m\u00060N.'\"\u001c͘\u0019ϣHG#~C%n;\u0011_:?J\u0006 ׾vmC+w<V{b=</W>O\u0019}\u000e媬#t#[]\u001e8sXFIb]Qt7[3x4=*4}Hk4XVl:ĞAƳr-=\u001e\u0016X\u0005\u0005#\u0019V䐪\u0003iԞ:o{+R\u0003tgn)\t|%-2\u0002Ti/\u000fK=D\u0003~&B\u0006ہo/;AϺUޙ{=|ֲ.m\u000e3sy'pt$;gR-R˙[[\u0006^+|xΕ賂Wݮ\u0013\u0011Mݢ\u001b\u000fx$a\u001c6\u000eG,N\u0019Խ\r\u001baF˻]\u0019?<IsCזǁo9(Zra!\u001a2Q2h\u00183n_jM3z?w-Ym0\u0017o\u001ee$`qXPMuE\u0019.h-duؼG^s7w?+:PԨn\u001f*i4|8*c\u0003gȰ}c\u0012/(\u0013 hM\r\u0014@9Bh;Ffz1A\u000f\\[k\u001dZQ\\Nk<xt=jYQ_{Ǻ}'cg:n\u001d~t,\u000b[mQ6-A\u001a'_\u000eb`7=FYzѭ5VPeټוº3hngdf,4Ks?~q%=d^gezs(p}^]\f2\nwʲ*5\u0014a!ʸ{6 :|w\u0005U}xڛ\u0007&NM5\nm5\u0015Vs\u000eUZ\b\"'77j\u001cRR\u0010xteg˄;.ʄ\u0013\u0012de\u0016\t>j\u001f[̍bP\f3x\u000ea7]2vIfuro\u001dhۦ?Η&U-D\r=\\GlKa5e5mn6\rf5\u000ei*{LD\tV΀\u0017[\u001bvg\u001ac1Dqo2\u0000\u0013T(+3f\u001do\\\u0019OlȃV~2S֚6YCז+M꿮*\u0002!\u001a%*\nЉ4\u00048V8٢.w7u~/[:әk&}eX:\u000e%\u0006l[\fnQK6F\u0015;\u001ccaI23qD\u001f5$;xyfĚgt'\u000f_$-S\u00177kAY{&\nF<`%|32UHI~=Ԣؑ>b_At(ΚV\u0015\u0001\u0012ZP\u0011\u0013ʯݖ_\u00183X\u0000}/}F-(\u0015R\u001eV\u0012\\>VvZ8X۸mT\rI\u001fRg1Y\u001f\u0001_\u0003ܪ!պ+]lx\u0002@V\u000fޏM\u0019̱ph]sh\u0001qfυ\u0013$\u0019]6!n`sCQ\u0013'\u0003\u000b<.PNJ\u0007\u0007vu5U[\u00057\u001bN^W7\fe::\u0007J9L&$DZr+w5FlFMPQo͗\u0011gU[/\u0016\rK̵OL\u001eVggy\u001cb\u0010\tR_TǺ?B\u0012\u0013y\u001arF`T\u001fՖnkJ\u0013}Du׽k<UiZ\u0013Ý\u0014W7)Ӹ\u0000\nI\t\u0013|!7qU1Xh\f[-\u0002\u0007G@HBHˇzC\u0010 MsT6\u0017K\u0006B@)jðj]\u000e;݉Zf4OҕjclHrN[14v\u00031/R9\tH\rÇq0|ގfn{aF\u000f{\u001e~j!%a\fzH'3fBfN,i:H$i\u0003\bǽ?\b\u000fcu oqaҴ#{<H\u0012E%:\nj\t\u001a]XOxņ/,\u00057s\f1\r+.A}&}A\u000b5#d@ ㈯\u0017\bG\n#\u001bg#A#4#\u0000Z0ṟ/fÏ\u0015=K\tWmRb\u0019::n\u001e^9O`U\u0007%;\u0007\u001cΧ\r^W\r#¾ٍ}\b<x\u0015bɱ4Q\u0018jx;\u001bؾq1tNzU|\u0010ЫkA\u0005\u0015>ʾ8|1}ܛ:lJgǌ6lZk\u001e\u001bHEQ\u001bԘǠSuɒM'TU3\t5\rq\r-ZWしG4IMX5xn6ˣ7mUhUNƫ<&ղxYeq8\u000e)J]\u0016\u0006NRKZ\u001cV>\u0001BRɼ\\Oml\u0014܏0p򨳽K\u0002\t\u0004i\fSbt&z\u000e\u0016=s\u0003\ta%R\u0006]\u001f\u0015ZLb\u0013.CS\u0000,\fi\u001d/\tŵ9\u0015}\u0006\u0014]=_AֿS\u0010=Tjaȏe/\u0011!;t<iIhX\f\r\"w\u001e\u0005dD\r\u0018Hai\u001b5\bmS,݉[a7R\u0005ݖ\n\u001dD);])_n\u0014Q\u0015Q;G\u0019!6zʐ:UmK.jy[\u000bDp\u001d\u000bIA^\u0019\u001a_\u0011;)\u0019lv薤\u0018Y\u0017~?#x\u001c\u0018+,)Q\u001aN\u0017J&nNFg7\u0019!+PxY-20R\u0019\u0019\u001f3r!Y\u0002\u001dERu>9G+ɰVIEm$\u0017u>c;y@e\u000fz3Mdb\u0002fL6\u001a\u0016\b\u0018JIi=\u0018钼oY2O5\u001f\bٷ\u0019}<\u0015cQ\u0005@n\u0002|c\u0000\u0015]w7\f\u0004p\u001dK\u0003pqشTZg\u001eQ1og>K:3Ғxu=n:B&\u0015p#\u00172\tBƕ\u0006N-\u0011\u0010\u0002e\u0002I\u001f-\u0000f.2KDg\u000b\u0018\u001d\b=\u0001Y\";,\u000fހj\f\u001a\u000bG7=d?2\u001aqA1;v;\u0002e\u0010\u001dUR\u0011\u001bmgS\u001e>~=uxC< \u001bC\u0004TUc\f@!3\u0017PTz\f\u0006{\u0003jc\u0000u11F:\u0014\u0010\u0002t\u0006N\u001e<ss\u0000e?α\u0002޶\u0017\u0016\r\u0013';R)3˱#zFǙ\u0002:\u0005?\u000e<+v\fH>*Z\r@ZM@Wg\u001a\u000e\u0000t\u0007\u0001:\u0001܆a#` މ%_\"`K}\u001b\u0002\\I\u0003\u0011\u0000kA~O\u0004X[jx\u000f\u0000\u0010\u0017\u0013fQ&\u001bʐF\u0015㩷sk%\tqx-4t\u0000z٬\u0012;c\nN}\u0001\u0000\u0006\u0006\\Z\u0006\\J.\u0006\u0001\u0002|s)\u0002H.z\u0001\u001eG\u001f\ri\u0003O\u0017\ny֫qC.;ϨxEPv\t4va+\u0004_7;X}\u001c:4\u001f\u001fz\u0002\u0001诫0@\u0016\u0018\u0007\u0010\u0011\u0006\u000467a\"W_HL1f\u0015ERj\u001c\f|ox%~\u0006e\u0013\u001bCqλgW\u0011=\u001f\u0003~ޕWVGQH*d#h|x/16jj\u0004'vMbxKzׅ|\u001fF|x<?t6nWYYz<䃛/\u0005rW\u0015'\u0011A_a\bj&_(2;qS_0\u00137_Eޟ~*ٯ\u000e>Q\\\u0015\u001c>Zz;U/ж|;DLqCs1/Ǘp\r/=pv&\u0017\u000e|\u0017K12\\Wc/2\u0017׬#E/\u0016\u001bֲ?^1\u00033Z\u001fpˑA\u0017l|̟|7Y_G~\u0007ˇ\tW\u000fi\u00071픈IN[\u001dȫ\t%akl\u0013WJ\u0007\u0017;%R)BD/U\u00101ʷ_\u001fr7[/Gd/\"GO}\u0018\u001cM!<Hv/_.?]hؘ{}\u000f\u001a[+p+/7d\u0019nF5Pz.'Gsx/\u0016r2/ĥ7_DoD.]^\u0018I_\u0014-&,w*/0sF \u0014r xa\u0013`ymC\u001fmE.ֲ݅^ǹLBvO\u001e\u0014v.BDVJ\u0000Zn\u0002dS&G\u0003'q\u001b/sL\u0015~\u000br~07?bGon/\u0005.:/CrH\u001bn\fb6%j稖^-¶0+`f#}\u0014mn\t\u0003\tBZccj޸\u0006\u001e_y\u001fJ#|07a\u001dcf\u0019\rr4O_.пGdzXC\u0013_\n:l>]ۯd,nRs_u\u0012vrK+ ƴs\u0013FۻٔbO7o\u0019aư\u0016f4=W׊U\u001aj+\u001f7a4>v^T[R]F2$3\u0002'J/Oߵ=y5EEP\u0006yqpfEӛUm:f_Ǐa\u0010o\u0010?A!z;{GV{GH٥^p|fݽO.[R?N\"9\u0007\u0000P?w\u001eXc\u0007\u0005|}G/}Q˷}΋f#q?LO?/(-?=x\u0016\u000b%s&]\nv{VhD=9,ꎘ:T[v=;s\f:M[Ko\n4lE9\u0005,#EèM\u00196!/z\u0007~uS\u00137\u000e0Q\u001e{\u001c7}}Pg[^+=\"Tc+vr󅓊!:aZ|4\u0014M#jAu\u000e6gl\u0013IxӟEE\u001b֙>VCulo\"5u\u001d<`<H\f뭚Rjŗ%\u0003\u0005'\u0018ըv8@|jIuo*uHgg>y'_\u0006\u0007\u000b\u000b\u000fX,\u0018Vsl\u0001dRER׆o\u001f\tҬmٳ\u0005wEeAN$%?Nkzkj#Lr&⦮_\\\u0005&l.v%lm+ɀ]nnֻBbq7\n#Ms\r󙖵ʶiaKֺ}-|xh~F4QɲLP*\u001a\u0006\u0015ZAs9-J06@RRr\f\u001ex#88Wp\u000f._Ӵz>d)Xp8ƶc\u000bV[\tizަC_gG6*\u0012\u0011*7?ͶaIQ3cQ\u0002YJ\u001cNV5C';:_N=3c8j\u001cp5.%W`ܤ\\\u0012Ne,\u0005WܻԩmmDDg\u0006\u0015+F\roxj*JY^gH0ny2߰&LE>C\u0012)\u0013M%IQV\u001dDBƙϱ4Z\rQ\u0010u?\u001738r\u0002|\u0012})b\u00174eYf\u001d\\.dƝ\bu̪InWh\u0004jpAuhwCQ/o@ҼYޏ\u000fN5#\u0013cb9{4$%b \u000eb&\u0005%KGBny+m<ʅJ6Ft5rNpȯi;Yz%ƥ\tg`M}eVcCY\u001b=wt+\u0004\\r-iH;W>>\u0013다Ӽ\u00193f'\rO!$\u0019~Y\f3R$(^ZW\u0011-y*Rd\u000f\u001e޵uم=\u0017\\%79~fdLu\u0018\r\u0019\u0006oۋ71e`ɭе\fa,\u0013ڨESg3W\u0019R-J|\rX\bV(7:\u001931Yp;epue23gCxc\\\u001c+0-0\u000eZ\f9k\u001c\u00197mub[D](%ai7\u001aU\u001d=\u000fwihiC7w94ٚ\u0006\u0016l>> k~{#I(ۖj\u0002\u0013g\u001b}*6ړxNBk\rR|^sTa\u001ffZKf̦hJ5H\u000bLU\u0017\u0011~|t\u0013u%b\u0011Rub\\Ұ@w2}o,\u001a6Z-\u0001ɗYBkU٧ΉY}\b7Jy6Y\r_{΢W4Yg[b\u0007 \u0001Jk2(1\u0018&r Y\u001d׭<HB!\u001dY\u000b>DrE|\u00022HuOq\u001ajm\\+\u001c\u0012R?:q$*R[\u0015vIqsUf=G==̭\n\u0019?OӃ{;EQhZ%)Ff\u001a%h.\u0001J׸:\u0001ha\u001c^T\t^G-x1?*?N=ќ\u001e\u0011^-嵖Vo8B\u0010]\u0002Kl;\u00181c~.nM/fL}\u000f\u0004$dIYFDf\bP8`p\u0004*a.\u001d\u0007yێDϻ\u0010=ϭdF\u0003uW1\u0017\u0007| |b\\XU\u000e[h&IM\f=;\u000f\u0015\u000b\"ɓ2\u0011\u0005i\u0011-\u0005pqYbaS=N*)%j(?ٕ~^m\u001b+j//Hu[M9\u0017\u0013\u0010샃8Jj=\rz{w8\u00156n$Ah\u001c(5iDr\u0002\r\u0013\u0012U'{*׮=Q꾚W\u001ek#mU.}&9{U(A\u0014iR\u000b}\u0015${TzHv!YE[\fA\u001as^m1|\u00177{\u0017J\u0004B;m\u0016\fJ,(\u000b`f+O\u0001ã\\\n\u0004(ɀ\u0015KBBr4@rGl^\\ʮ\tg\u0011I峅m!\u000b\u0015\u000fѲy7/Ν;u\u001aL:_\u001dj|14.xZ?\nKg\u001a<5M\u001b\u0015ZBIdfPX؁*(\u0015\nไ:c6S>wٽ\u0012uεP+GU\u001bϲIek\u001b~A\u0012쇌\b\u000bʹ\u000bLD&S3[FW\\ÈW_@7AW&c&Z\u00069OTil߫<n;\u0014\u0016hiHQrk7\u0007\u0000gs)>Lr<j6b,-9PN\u0014\u0016UjrI\u0017M\bJmz2LW\n\u000e7\u0006U|\u0005VHS\u0000#>TDͬؕ\u0004s9.\u001dMǥ\u0016\u001epb\u0010\bD\u0007H\u0016x!I\u001ck\u0011\u0002b.\u0003\\\u001a\u0011yH%\r4\f`\u0000܊a9\u0000;\u0000;\u000e1\u001e\u0000`'\n3\u0016\u0000l=}\u0000l3\u0000\u0016㿛y\u0018A\fI/\u000f4Kڎ[0ۈ\u0017\u001fYJf93Pb`r\fJ5dBXNm\u0001\u001cI\u0000\u0002T\u0018\u001dDa\u0006D1\u0003\u0004a\u0000!1l\b\u0010|\u0006\u0013B\u0001Ѡ\u0018@49 x#\u001dcUαw\u0014F]hR\u0011I;g\u001fL\tI\u0010#x<\u0013vv9v\u0016a#p?:t\u0017V\u0001Y\u0013dT2ƈ\u0007H\fF%\r\r\u0010\u0012PPp\u0003T8bz^\u0015qx\"\u0014PZ\u0004J\u0005\u000bBϥz}\u0003\u0017\u0001[\u001coJ\u001d\u0011E+\u0014\u001cw2L8<6ҕ&.GlA\u001a^\u0007T_\u0000؀ư\u0001N\u0000s\u0007\u0018\u0006L\u0000\u00013{\t#`\u0016\f\u0002%MK\\t\u00140W\tMBacA`F*\u0001\t\u0018\u0019d'C'v\no!lz\u00158ro\u0001vt\t\u0018!\u001cpÅ\u0002\u0003D\\\u0000.V\u0000//[\u0017E#-r\nc\\\u0017M&,\u0012\u001e\u0011v\u0002\u00190?+S\u0016\u0014d}9\u0011vۘr\u001c|W߀\u0015oVoC\u001f\bsZ{ò>1V$\u0010\u0013cӋ\"Vb(\f|czG;|nٟ`?!\u000eJ1\u0001\u0019 SڳE~\u000f\f\u0017_O\bw}\u0017\u001c)\u001cU7d`t5 oo\u0004D|ϏҲҺ{uJCópW.mM\u001dhW\u001d]\u001fH\u0011\u001fIU_[W4˿\u0011ڵ[󣠷w^>6\u0015*\u0016i\u0003}\u0007j<ȿ[\u0017ln/s&rtWY[#\u001f\u000e\u000eQ<Hxr^~R=<,_\u0016<͚Y\u001dOҥB\f*9\u001bY\u0001261f~\f\u000b6\u001f\fO}Pܲ\u001e\u0015]~\b1[d\u00126&m\\h\"wrٯ62K|\u0016>\u0016VٟE^rTvZ\u0010U\u0001\u00021h!weg;BE/_gN\f];yQ;jg s-\u001f\u0006t;Yca0[pn¯\u000b|\u0013\u0003%\u00017F\u0016,\u0006\u000e\\}9i'Y\u0012K?K]JQ\u00102?\u001c~\u0007s\u001c>j[LrkS\u0019_եq*.\u0003_\u0013\u001bN4\u001c\u001en[\u0006:\u001aNw\nN+kh1K\u0004\u000b[mѽ;*}\r?\u0013d1Լ\u001c֠a\u0015D\u0010s|_zl\u000fwjr%NCZA4ˏstH'G5On\nL\nGw\u001baF̵\"QiS҇a\u000f7\u0018jA0h@m\u0014oŀ=c\u0012\u0003\rzPqqOu\n_|G-$W^\u0011ac{X\u0013\u00164\\:7#q>S\"_~wg\u0003:nW5@Ͽ=\u001998Ȯ\u001aվ~^4YZU\u0011&X:^_\u001b#L\u000f\u0019=\u0017vJ\u0007N\\@}=\u00038B\u001ff\u00027=ҭsE\t,H\u0019NWPo엂~QE7^V\u0016V;\u001d\u00174V{+]$9|!۰\u001bְ%:p\u0012td!}\u000bfj1vʨxA>2\u000f*\u0017uW=\t(ɇ|9\u0013\u001e2C9mf\u0010:eU2R)ny]\u0006\u000f9\u001bc/GtN\\C\u001dxY\u000bXo4cU0K@1vm¨m\u001b6.ힺ;gK\u0003#M\u001cBU{n\u0011tX`1sE疩i79]z9ۊo\u000fw2{\u0018}np \u0019\rf\u0006NV\u000e=\u0015\u001b3KKjXD>yJ0ݼ~]\u0004kiyK\u0013+rD(l4(\\ZucW槾Hl\\US3?0\u0017\u0001ַ\u0007\u0018\u001f}jb~v\u001d\u001dλ6(*wƝT`fT[vDR\rM.:ጚ\n+VHX+6x%CENSÈIc:Q/C\n˝z$c~ܓG<=qqliPpܧo>L{.2Iu\u0014$_2S>wtFj\r\u0007kK>\u0003UA+x\u0016Ge$r׺\u001aYd+7ӝlTXMܕv\u0006:mjwmKmN: l)X?=+Q]4\b$=yˠd\u0004ɕ\u000bAbL\u0013M\u0013\u000b\":\u00154UJFZДJ4\u00195uq\u00176KϮaK\u0003EH\u001d\u0001_nBX\u001e\u001a+5\u000f2Iå8Y\u0016bM}\"<zl/0f0@-֮r\u001ep9;6Ph\u0005E\u0017PTkh3j\u0010=T)TF\u00074\u001b\"i^m Qk*ɺ+\u000eujs\u0006Gz\u0000F8^@\u0014\u0011Sr/\u001b*_XFF|;HB\u0017\u0004_|\u0011wȟoC+r:\fa\bkhbj?+\"\u0011.\rtC\u0013C;5\\u:\u0006\\zg$*\f;]Xח0ߟB\u000eH^u:_,;\\ۊYkZ)UUf3<`-y\u0015@Cuw\\4aS*ë\t[UԢm|7xVku\u0014הР#\u0018T_qR\b) \u0006_q\u000f_\u001c;9H1x\bluE\u0019Y%G\u001aC#}\u0005Þ&\u0015\u00077\u0017\u0003_,lXz\t4(\u0013Hs6` rLTm2Ҙ얤ldBr5U\u0017nY\u0017\u0014Iuy1\bzr:s\u0015b;}\u000ef/Ā=\f\u0018RnG%?P'On\u0005ŗ\u0018\u0019:9}_CUBy'nl{\u0006YʵԠsd[g_\u00109\tH{#K$/\t\t㵠qnqmq\u0011gbsکފȃDc\\xgf\"W4\n) L{lߊJȗ܄י\t\u0011|r\u0015iIHSqAD#\u0014O7N0xω,ne\u000e\"\u001e^\\p/PY`\f\u0015\u0017\u001e|W\u000b\u001bʟg\ndzor\u0012\u001er$T\u0011D6a\u000b8\f\u0000^Q<ֳ\u0004[\u00190\u000e\u000b跲\u0000t?<PW\u0010㦂MF&NEl4\u000b7Ɠ\u001f2tHcԫ\u0019(_iRE1)z=\u0018Hh\u001eJ@d\u0003_]\u0018/U\u0015޵EC!z\u001aoddv}$zcDtFU\u0019ƈ=D\u00064x#4(lp$ɍ㊥k/Ь\b\u0005\u00168\u0017|\u0018=\u0019Et͐\u0019*\u0011N\u00129\u0017q\u001aǶ\u0011`]\u0007t{Z\u0007=r\t%\u0001WqUBG&<Ì)\u0007\u00113(\u000f\u0016_~D/pywŨggS\"\u0010(\u0002&DK2]'\u0012fz·\u001aOy3x~\n\u0018t_v\u0002]*B\r=\u001fM\u0015%\u0005S\u0005\u001cUR\\C(tI*\u0012\u0011\"^b\u0004 \u0016Cd:#r)\u001a }f>]v_<.\u0006\bk1sh\u0011T=\u0017+Y\u0000\u0011:'f\u0015u3Va>9Pj61\nfdpj<\u001fFf\u0013G\u001f\u0016\u00174Re\u0016\u001e+/o!=2oj70.bh\u0018R\r5O.})~VIKe,Vȵ`x#\u001d79R\u001e\b)l'O\"0R\u0017.(l [(ëR~xyK-\u000b*r9+\b]g/\"D&\u0002<3\u000eYM捽0'f;@m\f(\fSw\nŎ!\u0014ϺTMrԇڮ!3sV(5\u0011҅xߥ ښ|\"\u0006=\\w\u001f1빇\u001b<\u001f^0g`#b\u00123k1\u001e{M73(J'H\u0007\u0010\u0004(VγLZ\u0000cM%\n~:K>9?p&g*avܸ7[\u0006w8,o\u0003P;R%\u0012\\\u001e{)$\u000fWH8l_H]`\u0000mPcJlx\u001a\u000bĤ\b\u0005\u0007h\u001f\u0011\u0000:t3\u0018\u001aa\u0015c\u0002o)\u0000\u001da\u0013vS\u0011@z\u0013m\u0007h4C+ۂ9ƫii\u000fǶL\u0019X@6\u0017!U=GH҃*ʲ+\u000fO(׼=@'kDbzWb4W2~&W-1\u0000`E\u0001\u0007\u0018o\u0003,\u0003\f\u001a\u0003P}^[z-@\u001cO\u000f_XD6qn\\gǼM\u001cmI!m#jEHyg>*~.U&(d\u0005p\bN\u000b\u0000/u*\u0000V$\u0019\u0001mU\u0005xo\u0005x b\u000021>4\u0005\u0001_\u0001>j%\b\u0000>^\u0018a\fTe\u0014K]\u0012!\u0003z2wp\u000b\u001d7v#\u001aM?M5E\u001f\u001d\u0001K<ˀSW9\u001a\u0010\u000bG\u0004q\u0004+k\u0000\u0012\u0007d\u0005 \u001d\u001d\u0010c%\u0000w\\@\u001aG@2 '\u000e\tHY16]T\br! u\u001fӏ):ﾐ:<<*\u001c8{\u0004\u0018@N<R\u000f\u0001P\b\u0010H\u0000;\u0000z\u0013@c\u001dm5@\u0001zYX6\u0001}G\u001bO\u00144\u001a0ź\u000b\u0018R\u0003DV\u0015\nL[^xBIȡAX\u0017;p\u0010*}ۜ\u000e-j\u001a\u001a\u001f]պ\u001bL\u0019\u0001Ljmj\u0006آ\u0003z\u0003vf\u0001\f\t8a\u0000j\u0000ms[#MQ\u000b4\u001ep3\u001fc\u00104\"\u001d7L\r%\\\u000eǗ@\u000e\u0003A\u0004I;\u0012ɯ8\t\u0016^6j3/2ۥ\";\u000e\b\u0001\u0002I/~\u001f!F߇@`\u000eIxvULX\r\u0019\u0017\u0019\u001fO\u0011Q$Wf1M)3\u00172k\u0004C>o\u0017_W=|#~/rd?1ox\u0003~C\u0011\bOi?C}Ȼ-ȹ/=EǷ5)7]{VF/bM\fo~\u0012\u0011\no u\u0007֦nk<ʧ_W׀\u001ft-ҲFz۹MV.G\u001e)]:\u001f\u0012;_j$u&di{S\u001c}D3\u000e\u001f=Hh?#Ϋ=ܧIn\u0019|ܿXcskǤWMm]\tNKfR\u000b<?ux\u0006[uG6ˑսjÔ\u001f\r>H\u0007t/nA\u0015[u}nv\u0004چ߅EMUVH-\u0015B\\D-2p0=\u0002y#R?\u0003<\u000fOo\u0003\u0007>Wz\u0000grAG~E\u0016\u000eiv\u000b\u0002c7;>6tLI+r5Q7\u0017>;P|L\u001cp53W,촲\u0011*\u0013\u0017\u001b.܏ɛ\u001e\u0019\u001932_|5l4J~{֕}{AD͎++\u0017lfy\u000e?+Ll\u0005`-+\u00012\u000b\rQ\r\t\r[YcxNBNG}鎘[q\f\u0011\u000e?~}?\u00011շ\u0000^TB-]ykc}\u0010?s\u0002([޳Vd\u0018}\u0013$f\u000b\t?9*`|яݺF9z\u0019N\u00074L^Lʖ\u0007,\u0017\r痔U![ꙕY=ݐCɝ^]%\u000b}qԜ9l\u000bYuE5r9n&\u001aAX\fuV\u0005v-Ekr#ÏGô/v\u0007p\\a=Q9<={;}U\u001eյ^Uj\\2\u001f\u0014)mu_\r6 NmP\nG߭&FL\u000e'f1\u0013\u001bj\u001e2;=Dv\u001e0۲#ne>BdXv,\u0013\u001e24\u0017{NX\f\u001dxo,wSܭ3]\u0012N@IL\u0016V\u00192:\u000bfQ̩F{[w\u000f\u000b\u0012\u0013y\\zѯ_\u001eƯܾUs^^NHӟl';\\DUUn=&.MHZHu2wR\n\\,>ɥa(ިKz6F- ;8\u0016{>OjZ\u0011\u0015Z*?LZ\u001fwlM\ndk\u0019SҔ\u0006\u001f(+f5x>fm5\u001fRyۏzKM#v֖_a+|\\KvhÄzۮ~\u0019KUP\u00163E\u0017K5zE\u0007U\u0010?W\u0015+Vͬe[\u0010W.4lͼA#Ͷ\r=5jV\u0006q\u0010r&)KqӹMnC'\u0018hҋx\nYw>\u0015K\u0015J?췱;m,L\u001bF:,*\u001ff\u000e^\u0016GJB͔lo`\u001eE0y46WUo+\u0005D\u001a-Wo nOr4/{`7u٠kRp\u0018\u001ehύ@\u001dvb4)\u001b\u0012o\bL<qP_\u0003Ԛ'V\u0006/SJNKMbgi?sQr\n꡴;µN|Oͫr5\u0006zPju[־\"\" w\u0010\u0014E{\u000fYkw?\u000e\b$Y\rsTEbӒoc:Xn1\b_Z+n@'n\u0003dx\u0018\u0011.7JR:.+b\u0015*ӛT\u0016\nYɹޔu\u000ep)\u001f/ۮ \u0016}G={\u001eN8[Yh~50Ǩ\tP\u0018d\u001aH]\ry<ֱкkki\u0017J@Z制bi<Y{{跾\u0017bE\u0012I\u0013)-g6_NLd\u000b!=Irkx.[F\u0016\u001d1ǁ6293agg2~2rcI/WU\u001f\u001a\u0004@eY9^\u0010YiM8>А-8uOy.j@Tk.\u0011bT\u001e\"fo1X,\n9Qm\rY \u0003xkfVFF[eӽ-:5yY\u001bZ\u0007O\\99'_˹,m\bbAz\u0014kj-y췒jB|ER\u000e6ʰVJc\u000ff\u0002\u0019=#S:Xr2'zj\u00136gr-KwI/\tKt(*\u0002|v;~\u001d,v+\r~P\u0004J~C\u001fe&HJÁ\u0013MeE\u0012):M$8в\u001a3p\ffu\u0017j7FP0ԭ\u000f\u0003\u001cv.s|?[K<ekC1\u0012hk\u0014rj}Txw3GWEo)BX˝G{*˽Fc_C\u001c#N42\u0005p)\u0005s9\u001cgo.*\u0010`\u00067˽ɶ!v\fm\u000b\f\u0014i\u0001+ܲ寕OlY\u001b)Ԩv|Q\u001b񭜋\u0000Q3Cɷ+]k`\n{\t$:笏Q\u00123YpW?\u0016͗ɭfx\u0014ˤ׿'8\u0002\u0004ïvTP\u001aU79\\Nn\u00031\n\u001fڶ\u0018Ԇhk\u001fn˻KL/#M^2\u0013GoI\u0013s\u0019\u0002R\u0005Cx﹵qDgkoKc9`Pqp2p}p(`\u001a?臵ׄm\u0015]6*B[(T#aԲD\u00130tR9J7׵hY=%\u0002\\\u001d-cϫέ\u0017d=Ƒf\r\u0011\r\u001cw7ƿ\u000eL%]\n\u0015-\tVPRC[\"\u000bȶgZ\u001dY\u00155\u0013Ep\nDf6\"\u000fT/>r\u0013Jq_ߓ۝=G;\u0017vn>ls,3id%wLZ_\u000e҅QqsNi)\u0015x4\u0001OLX(P\u0001=Dv9(W%sw&U'Ɵ?\u0006O\u001bj⚸\u0007^{7KmZcm3\\V4X\u001a{=l\\L\r/N\u001fgRSKin\b[\u001cApؖ\u0019\u000b\u0016qe4\t\u0018sQh4xW\u001aIѠm\u001dK3Wtl,}lT8=Dǃl$Hrm\u0014AL1\b`\u001f&&۬{k̲\u000bt^C{\u001a+qo~\rh4_XI\u0015_h\u000e^XV1Yu8GnkS '\u000e:r7\u0017-$G8(\u001d.Tr\\\u0007Y\u001a<o4uTYû7Pv\u001e|?죳^\u0010$|׆ί\u001b\u0004mFeB\\/9|8!H#уV\u0010Wq᷶j/>qk\u000f\u0002N\u0017v\u0000kZ\u0016C\u001dY?jS \b~k6NiN#sߑE߰`iӴ\u0010?&{^⎈\u0007U?hKN0asd-,,\\&\u00014ǍAКdVB˔O\u0007\u0006|\u0006H\u0003\u0013,Kj4'y@\u000ḙ\u000f(a^IѠ}e*~\u0001~A\u0005YN&mƙ\u0010G\u0017\u001fWb\u0016jEBk\u000eCn\u0001a\u0016Ԟ\u0016}\by\u0004\u0002d\u0001}t\u0004k\u0015'K0\u0000.\u0013߀9U@o9c\u001a\u0003tO\u0013\f#@;\u0014;Zە1vwۓQ`!di\f\u0017$ \bl\b؄_\u0012Y\u0018!\u001b:\u001f\u0017+l;\\_Wܰ'`3v\u00068\u000fX\u0011\u00138&`C\u00159Hp\u0001P\u0000H\n`]\u0005Xu\u0005,\"\u0000φ\t\u0006+pT\u001fG⮴\u001b]G\u0005+\u0005\u001e!\u000bЂe\u0001/,u=tC8\u001fh0E\u000bTG\u0016eW7P\u0013G\u000b\u0018\n8uIp\u0001Wq>荔T>.&^)\u00059\u0015K5\u0001w\u0001%@\u0005>\u0002ܮKz.J1\u001fݎ:\u001b˽T\rY\u00121\u00067XH,|^>Dis\u000bC\u0001be\u0000\u001f0\u000e\u0002u%\u0007ˈ\u0000B>#\u0000\u0017T \u0018U\u001b\b>9߇j\u0017\b\n\b\u0013\b\u0017\u0002w\u0002\u0011\fǩ@|\u000b@{\n\u0010\u001e\u0011\u0010d\u0011gR\u000e\u000etTF\u0014\u001a2%jJ\u0014{5<\u0006-&/|Bps\u0004\u0012TFt\u0012\u0010k\u001d@] An\u0015H\u0005\u001e\u0003:\u0000\u00198\u0010qX\u0004\u0001Y\u0016@#\u0004r\u0001Қ\u0001}@.w<\u001b[3d\fX.M3P--s,0!Pd?W:\u0007a\u0013oWfk]TAն@\u0015NO[\u0004Pǒ\r\u000b\u0004̖\u0006\u001aq\u0003F\u001d-y\u0016\u0012?=;Kn%\u0016S)\u0012ڄ\u00174W45;5qA\u0016?3b\b~\u000b\u0019\u0005:\u0002@\u0011E\u0012 w`H.`ȃ&0\u0011\u0018j\u0000&T4M7d`'uHx?t&8\u0004Ο\u0006\b1{\u000bq\u001c\u001e\u001ag\u001f\u0011a\u001fHs\u0017B}f4\u001bqxSy\u0004\u0015w=\u000ej\u001eӘԀlɾE3\"\b\u0013i}hƽt*:PnD[DӾ҃^r4jO(Q\u001fgq$N\u0011,\u001d28\u0002l\u0004iR?nj8ey\u0016?uKK6Z12{>h~\u001au'NV]Q}\u0016c7sA,\u00038\u00035u\f}G\u001ev\u000f-1E\u001bz,M숬MM\u0013| \u001eJ2B\u0006^F\u001eo\rU:\u0011ʩ^nOp/PvY=\u000eN\u0000p\u0010޶\f7\u0001M\u001c\\sz\u0015b?/Key.\u0006\u001cC\u001a[\u000fZM!U9h.?S\u001fSb/S&ɏBa\"c\u0004Eq]S\u0004N\u0007k\\w+>̺\t%m5qye\u0016FKm\u000eu&yNܸx16Ԧ~vҜ슳^-cs\u000ffw%7xBC#\u0007\u001ei\rw\u001f۵R\u0017rz4{Y\f\u0010έs?Cv\u001cc\u001b53^^cn\u0013QHsÈ\u000bC2\u0007\u0003i\u001fkk\u000fvN/~\u000f\u0011CaګOl]F:lM\u000bcRmgq՞o\u001a,#L/b!Ч\u0004&,ݬ2x&;~sf\u0019-\n}O箏IC@᱑A&GQK(\bP*\u001b{絔Ϧ\u001cQ;wq\t\rh}tq$Dg6\u0007kuR?Of3\u001bYy\u0014[ljV\u001e2h]pc@!wPPֽZK\u0003C_6\rPJ_\u001b6}8SwK>XT\u0011>𨴷V[7\u001aqy\\>T\u0019S7jo._ܪV\u000b\u001cl洰B8>7\u0003{`8\u001b-\u000f\bT*n\u0003ax\u0019-5\b\u0006{U\u001b.}\\i|#Xn7WAr\u0012G\u001a\u0019E=O\u0015&wtԱZQ\\U*~d^\u0015`\f7\u0012쫥e\u0013\u0014I~ח&\u00061W[;ԨdgZ37?ti\u000em)xB\u001a\u0011LQQBQ֧-?#Z$=[իt3@~f>og=xNr\nX\u001bS,U6nEmv\u0017R\u001cb}IQ_v4~\u0015A#?@\u001d\u0001!wc\u001e\u0007Cj%SGD\u001eqe]:hh,xV\t-\u0017^rBS?\nbi֙ktu+\u0017pwvu^.\u001c)PFݾ->_y뾘;VJVdL\"7K0\u001bd\u001f^\u0019\u0005*_\u001b+kfSҶ'oL\u001e4\u0012r樢'*KmٝF\u0015'hm\u001bS-4ct\\]yiz\b\u0015Q|U\u001c\u001eU\u0013T1a?uKE#۰\u0014?IzVIٚЫ>\\\u000en}5Oޤڔf8+T}W̗KDH\u0015Nޚ.\u0004HSڲ;^\u001e\u000bjퟪnio\u000e;4\u001d|oL\u0016Ӏ}TpYGzY[#<\"!\rb\u001fl\u001e\u0012.kf0w945#88?o*\u00077c\u001c;+ڼ~Z\u0017N\u0001iU)k\u001eai7GXh\u000eV1\nOn}XG󍶪w\r?XZJ'ɟEQ\u0014\u000e?\n\u001bkyyqp֢@}\b1A.J~yUTG\"65]̋\u0014,\u0016Uk4̢c>\u0019^qQ[Umu*]\u0016\u0011\u001d\u0015. \"8Y\u001d5;2n25\u0004+)Aê\u0014nRy!mr\u0003zq*~9iCA,\\\u0016N,;2!V]\u001be\u001cҮұ`\tkЈQW\u0003QUzg1\bJS]\u0002hؓC\u000bIX?H;3Av\u0016\u000f<\u0014ƽY\r \n6o\u0017\u0003ðc\u0015T/\u0001[\u0005H|G!4K?j,\u0016'\u00062\ftlXh۫!sS\u0019\u0000㶅*2k/2gR/J\u000fܭIj-\bŷr\u0010ى\u0005{#YN4xw\u001a>W\u0019\u001e%9%L\u0003*gMVt\u0000m,xPMPYZSm\u0007s}143UZʛA MQY7qIvxݙP\u0016DV'B>\u0018jsG-\u0001૱iR9yÒ\"ÒVٷVѫn5z+o_'|\u001cú>X!g0ō\u0003g\u000bFvg#\u0015rGfc^XH\u001aWߋðw\u0013M\f\f\fBS\u0002̙\"?\r\u0018N<Z\u0000r[=\u000e/\u000b^\\\u0003E\"L03OW[w[EEC3w\u0019\u00037\u00052Ku}{^^;m3:_\u0018HO\u0018\u001f\u001c\u0019;\u0013\u000b=p⋟GG,Wy\u000e=Yv[\u0015ƚ\u0005:|a-Ct\u001ei\u0011fo\bs+F77\u000f\u0004/\u0017M9,'h\u0015\fJ^\u0016r6ܴ&Ѭ^%C=ƣeֺW\u0003;ͥgA\u001b\u0013]í!G\u0019[뮶,<D1~A\u0018&\u000b>\u0017h{֩ _fg@\u000e %!ƹ7K@\u0015Ǥ81\u001b\u0004P\thT'\u001akD\u0007BX62))\u0015,F,ڷT2Wjv!\u001aP@U#J\u001c\u001dK<6%/(a%\u0007\u0017B\u001a<M\u0000Tdb<\u0019D\u0016>\u001cxx._]\u0017#\u0004>em\u0014>F_\u0018Ǉ\u0004Jcֹ\r:\u001cRp9uU\u000f^VBpn9N\u000e-Ҙ=>c\">.\u001dbVY/\\>1&DT*YEtk7кN)ײ?hN{\u0006\u000e)5ڶ\u001c*$ѡ4{\u001d)4\t3h\u0013UPs/~;\u0005f,S\u000eG\u0007!>l(\u0007\u001f34k3\u0000䒓\u0018Cn-CD;QQ\u000f5x\u000fk\u0011e%k>6B\u001e\u0011\u0015\u001fW`-RAb?\u001e\u0014PX\u0004DF]zKv_Liv\u0006\u0019\"\u001c\u001dym΁FN.[2?\u0001w\u001d5~;!A̎M6k$\u0014\u001b\f l dmg<ęw~\u0002bjQ)\u000f\u0010=~\u0003D!V\u001a^(\u0019pTSs\u0004#[\u0003L7\u0006)R{\u0013\u000b\u0019U\t瘴\u00141v$\u001ca\u0013f~Yj!B\bqq`\u0007>LPF\u00128@\u001e\f;\u0001ci\u0006\u0013Np\u0001\u001aV\u00019V;\u0014՞JU)\u0015zjV6g%RO\u000b$_̉i\u0017\u001brZqM\u0013\u0018\"уM%\u0017A\u0003Z\u000fUg`N..`\u000bqM\u0010}\u0001\t<)\bh\u00014Y'g\u0000MT@j\u000bP/\bSE\u0005\u0019'߆A0[v3ŕ)iUw4TBu3jB\u0001(oz\u001a=]\u0005{pfۜ@\u0000=[\u0001\u0004\u0004\u00120\u0007\f58\u0003F\u0000H0`j\u0003\u001a0I?2A\u0007ɉG<N\u000e\u0017s\u0019H6`\u001e`Z;`|\u0005L!;L#7NU*s;\u0015Tj\u001aѢKs>\u0001j xT3g&ա\u0017X\u0012b\u0003Xc\u0005=\u0002[\u000fvX\u0002F\u0000\b\b8\u0000N7+=fw%\np\u00048l\u0000p\u0003\u001c\u0003S8S\u0002bط>~2e]\t h\u001d\u00079|-I7z!ƕzd=_\u001d:>\u0018\u000bx\u0012\u0002\u001d,u\u0010}\u001a\u0004\rk\u0000\u0001\f+@\u0010(A\u0004\u00136q\u0002Y恠.q\u0015\bX\u001fK<Z偉Hɇ+T7QI7\u0017^\f2X\u0013bvoa|1G}\u000fwI\u001a\u000b\"\u001a\u000fD.\u0003v\u0018\u0015 \u0016$b\n${z\u0006RAS\u001b\t\u001d Edso\u0001M>:\u0012e ֯'Z\bq*۩Q.9/:&v22\u001e]l~XLo?%}M{So3\niĿojmP)P\u000e\u000f\u0000**\u0015\u0016\u00185\"\u0016\t6P{\u0004\r&\u0003Ԧ'2|gAw\u001fQ^\u001dgFrά^\nU[?.87MH\u0005%\u0011|\u001b{{\u0013S\u000eՁ\n\u0000z,lǓmO\b\fD\\\u0002#e\u0013<\r`\u0017HYӗC\u0006RI?4vy{l\u001cJP\u0013L\u0004\u000f*\u0002{KG[Ok<!z8\u0007x_p^4;[&'݈Ayom*ѾǂzoT4_ UNS3j}7?\u0000<\n<g} \u0015~/\u001dW\u001dk[zV;f^k{9\u001apM9?\bǗ_\u001e\u0007{66a{\"@H\rs\u001d\t\u000eG6E*\u0007y!~Z\u000bp6X5u'~]n{;-G}x\u001e⻏!G\tKnG;\u0018uM\u0000\ru37V_;&ZFx#:οNOzćTC?]Ϊ\nnD+4A;-uRfg騯>fVm套6\u001c\tVZFīx\u0005B?ϡ\b*=cljg>$';oNR\u001b7\u00197R8N+xtimTM؞([:fZ/6;-7[]zyūxͿOv\u0016Kg,.}tmzd\t+&7qνό\r=\u0018A;@Q8Is\f\u0015-}5\u0000c9ycgC}]-\u0006\tW\u0016.͐nM}\u0010T'N[&\u0016\rG!\u0019͆\u0011\u001bm\u0006\u00031<QtCs3L;C:h-&dϸήQRI\u0006$ڝ\u0013\u000b\"#ʷL\u0016;pO\u0011w;vSxㅒMLڙ\u001do\u000f\u001bj\u000f\u0019\u000b]\u001f6;\u00011`:\ftNE[mHY\u001dZvk\u000e۫idlcpx\u0003Z8B=v\u001d<kV\u0018\u0006q׀\u0011w\\EA<Az\u0004XQyǮP+Hzt_\u0007q{X} KMozos{\rhZF.J6Ȋ\u0004\u001e\u0003lgLj>c/jĩ\u0006\u001fTIr\u0019J%4w=\u0016(| x`\u0017Inriu(\f\bf\u0002\n[֖\u001a`R};,\u001f\u001bд|#\u001a\bM\u0003T\u001a#J_F\f=~cV[Pᰬf\u0017=\u0002`;RR}K-\u0013x?ыn\tup˙\u0015_\u001c\u0012|O\u0007Z8|>sFw;#T\u0002:Z6WAp\u00057FP#?sj?\u0015iwA=Ex\u0011{CS<S$(\u0015Kw/ΆV\u0011{r8#\u001cͩq(I\u0014걦\u0015Xw\u001fgt0)M-ݭS1\bj\u001e\u001d{8xjoGJWC\u0006\u0007\u0019Wd\u000b{\u001f\u0006z\u0019\u0001$pS.RD>w$Vmag:\u0016\u000eMZ`t>w-<+[,%o~u*\u001aP1FҰ*\u0001\u0011laiq7nTӞzZ+<g=.ʸ_rjX7ư>K`Ω[?\u0005xB\u000b\u0006\b[\fuxيeA\u001c/1_zGHG:y䪨aD]\u000f&97s\u001f[ya>\u0013`RX\u001d\t8[*\u0016w\u0013fC6$BP}/<Z>׽1\r 7!\u001aYt2\f|9\u001e\u001b\u0002۫dT*B+̨TO6;[T\u0001[I\r\u001fWk[^rk/\u0003y\u001fu-bcsI赬ZlYj7i}jL\u000e\u001e̾\".ڲ{jejPVTS|Caiw ,[L#R| S-=Q܀-\u000fz\u001fLTg\u0012Q|\th*;\n\u0003k\u0017SV\u0005ax4S3/\u0017=v-Ճ'w*-ʁ\u0015'\u0015vb\nr\u001b.j\\Oҭt\n$}\u0019`Dy|\b#C\u000b\u0016X)\u001d~iq)E\u001euk^Ȕ0\f=;@\u0018Vn5\n[iU+ϿZW\u000eO4ty'En,Ӭԭ1I>R\u001fV+h\n\u0010Gy'\f<\"\u0003+}\fͮ3ړ]C(a\"<G\u000e#`v8Pq:NP[,M\u0001wGO]/#?2\u0010Vs]ҨӍd2\u001dKv))=(?MW\u0016\u0010گe#>)Xq\u000b<h3au\u0012!B^fǱ/-\u0004șk\f\u001a]&>&\fC:\u0011k`\u0015~?/K\nQ\u0015_\u0018F\u001a\bec&h+@Å\u0017\\\u001c\u0015#]>ET:\u0013\fC1\u001f?n\u0005݇Hfх\n'\r*A.>C\u0011[+V7,jD<y)\\ݣ\f\u0016\u000e\u0016rW\u000e5&\"拆s,\u000bv\u0002\u001cb-\u0011}y\u001b_\u001f|sޡ)8\u0012}\u001a\u0016o5ejm\u0010\u0007p;V}bX\u0011;,Νߌ1b\u0000\u00146٬\fYHꭷ\u001dm\u0011?O'C;\u0003^,ʼ{\rJ\\\u0002v\u0018Y3=fX\nZӧ\u0003w[\rA\u000bz\u001buTg'Ld(\u0013\u001fn!\u000e$2\u0017\u0006\u0002\u001e/$B\u0005\u001bIHPp\u0016=n̸rЗӡ:\u0019\u001d\u0011AL\u0007<\n\u0015vt=&=\u001aԭT\u0017\u001ag#\u0012t%>=M4\u0015&,4\u000e8%v\u001bcP-#U3nIfDkt\nQ\f_IA5$^\u00173e\u0016xdJJ˫\u000e%Mv\u0004!\u001c^\u001dL\u0003<\u0016\\R77?\u0018mM\u0002\u001d|Ώpg.pvEfp˗o\u001e\u000b<V9%W8ъLvTQ:rFpq\u001aYDBX\"\u0017\u0003#\u0017'r\u0013\u0010FrMvʾߛ|bv\u0004:\u0007Yȝky$i[\u0006sUy>\u0014|\u001e\u0014_-70tѠ1\u001c\fW5;/\u0007*\u0017\u0010r7$\u0012.\n\"y2>\u001cm\u0007X\r8$AVZvZ\u000e5}\u0003U&sLc!B-v~lWAn!e'B\nek{\u0016n4r2\u001eO;El\nSSB:d@^\u001c'`ݟK\u001d\u00054kJ\u0013>镼ml|_dP\u001b&\u0002\u00050\u0000\u0011L\u0011Y\t\u0010ϖ=,늅nx˙\b2j4>ȷwv)B\u001c5*JwMr0Sk\f?UM\\ʝ\u0019\u0007G`q\u0013д5\r 6jfm))\tX\r\u0015\u0019\u0010\u0017\u0010\u0010L$hiȒA\f\u000b/]\u0000m\u0002'/׀Lg\u0000>Ҿ>\u0004\"=J*oq,*7Z\u001c%zZ\u0004Tȷ?n\u0011_ǪkS(\u001c\\~s\tB* \u000fFi\u0017\u0010$27-B\tZ\f  j\u00022,\u0001#\u0019@f\u000e* \u000e Y\b\u0010X\u0006|(琒넵\u0013oA)`(<\n|byB\u0016O$|3׾.@7YwZ\u0001\u001dU\u0013[]@A\bPDg\u0001(z\u0000\u0012\fs*\u0004\u000b($8\u0000厒7\nĺ=\u0004\u0014\u001f\u0001\u001c@e\u001e oR\u0010&k*h|I+8sPaF8\u001de\u0005DI&ف5fV\u000blџh|N/ꣵS\u00071\u0003L\u0001%\u001b\u001e\u0006#\u0003Mu!*O!ϭ3/䍫T}lQ\u0015\u001crmӻ:6Ƿ<W^\u001c\u001ex\\cuLd8[0|v|Ǥ\u0007{\u0004\u00023\u0005Lǘf\u0005r\u0006,N?\u0001+\u0000\u0005\u00066:!Q\u0000صNY\u0000v\u0000;\u0005FX\u0013\u0001\f\u0003ئ;\u0000w\u0002XonL9!E݇H\u0018\\Cs@^de\u000bC+uT^b{.\u0005=\u0002\u0003>\u0010'\u001c૨\u0001I\u00074O0\r\u001bL\u000f\u0003F\u001dì\n\u0000~Ӆl\u001bzf$8\u0012T9\u0003ͩ\u0003\tp摡oIz؍\u001b(\u0010Q>u\u0010o<GM\u0004\"24\u0002\u000f\u0002\u001e%\u0018݁@|% \u0019P\u0012\u0006\u0012F8@ʛk ޒB5c3TO}Vw`[6uR\u0015'\u0004\u0014v\\*b\u0017ڎStL￾4ߡD@S?'D\u0019\u0004(R\u0003>\nl$^\r\u0016^\u000bht\u0006*vׁ\njuM櫬.~t\u0013w<\u0019\u0011'!lrL(onir>4V85o.s'j\u001ehu\u0003tN\u001d]+\u0011\u0013\f~F\u001dQU\u0013ޮb\u0017*gixC}9Mzug\u0001S֞ck?!=}sr_\u001dkODN+=VѾӰ\u0014*tʟ&#$T>e\u000b'yqʅּٖވC\\kO\u001cuGpz\u000e\u0015,IYXu\u000f\u001ep#эڕ>ҟ8uΡaP>K>R\u0013yB%[z oK#arT_9Ó\u001f]c\u000ev\u000bzVޓ&3.^?\u00127s|\u001cVb=#s?-\u001d6#o53Uʧ5\u000b5]v?EYu\u0001{D\u001e\tkn*{\u0017V֝[7b\u0005Tg r\u001e\u0000t]<?\u0004\u0018\u001e\u001f}2w\u0014'bx\u000fUc\u0018x﩮;пoj\u0016\u0015\nKfni\u000e>({2?\f<96.o)1>&b\u0019s1*{o\u0003\rGBj(baI'?\u001d\u000bNN\u000e}cܲP-ZQ}ODzRbzB]\u0018\u001b\u0000yB&($P9` Tko\u0013AwyI}\u0012ypk]Z.n\u001d:\u0001Y?z\u001er}ixb{tc[\u0007V\u0003K.6q\u0018aѳ\u001e^w)UG\u000eb'yfuSߖGɟ\f)ե0/\"︙\u0007\u0003\u001e\u0002=3FX:wχM:ڗкw\"<\u0007@\u001f4\u001bӰQ\u0001qEYn\u001dx\u0018`{YY)[ݵ}\u001aG?hojӑ}JX(j\t\r}j1vx\u000bCg{Ȉuvst!oEkcl.?Y%_\u001cںjU\u0003iU+\\\u001d'U\\rX\u0011\u001cŸf'{oP>=\u0003ӰV+T\\\u000eǸ\u00187/+80QKy!=\u000f\u001f+nF\u0011h˰}j\u0002לN\u001f,Jq'Ÿ++V\u000e>wnP-Ba\u0000LyiDy\u0006\u0012q\"Kv>K\u0014RDXxb!^z\u001bl\u0002)c,%nYf0\u001f\u0003v*x[\u001c9֨R\u001eHrm\u0005J5:\u0000\u001d5ɏJy~^9iWCReݧ 7r!\u001dt\n{\u0012\"\n\u0013'j[W8:~4\u001fqq4gy\u0018V\u001f\u0007c؝,?\u0018vObT;~w86иU\u000f/tU~~g!ƯY*7\u0012L\u000eRv6l\u0015s\u000fNU].\u000bPwt'?v+VgY-\u0013vZ\u0004<cf9liaj7L\u0015Q]\u0015\\\u0002\u0013\u0017qehƭװ\u0004\u0007\\+jv(b஥w~U2%2~~4v\u0006Z7\u001a[QvY=:܌d6FCϘ>m\u000e_)IwêZ)]#\u001b+V\u001d?Ë!ʜ\\$咗\u0007$EKt~S廻\u001b*5\u0017t#g껅f;C\u0017(u-j\u0015gr\u001a_0,\u001b\u0019t֑\u0012~Jkaa᫮\u001a\u0012>_\u001bZWO]>'sV(i&_&F\u0006\u0013Uطq\u0014\u0006-'#N]Dx-\u001bpڂUOq>Sрv,.\u0003bV85\b\rs\b\u000e=\u0001_\u001etYG\\a\u001f1TףP%L[%g=|EǤpВ\u0014\u00151z]Q\u001d\tMa\bu\u0002pg^\u0015\u0011>\u001b(0n&+3n\u0010 \u0002ٚ\u0007\u001cW=\u000e(g`RnjwF4Mnd\u000fݲ\u000b֦bG\u000b;_aǆ|r'͈rVtsvcڽ=g\u00115\u000e\u000b\u0016F\n[r\u000eR\u001eq(>9˝\u00008Q>a6՛P\u000f\u0006羮ʠoNaUh\u001c=\u001dv--^v\u0014koVKA\u000f|zt=z%I65\tPԪ3ax$69Bƨ=$pu犇WܢM`Zʇ\u001eSC{ ݖ%\u001c4\u00074ohvc\u00076˔\u001asNWA]\u0010}\u0007T!Pk^VgTmOچq\u0011ŔLhR\u001d,psJkϡOƮʇAٮc_>\u001cDnjw2kJ;_;yR1_;T,NvA#.;8\n\u001dSvkA{\rj\u00046\u000f\u0014<鶍\nb%-\u0015~:{\u0014TJaa\u0012\u001f\u0005X\u000eL|<3t\bƃ\\%\u0010\u001dȔ\u0016ɈBU_-\t\"ox\b1}\u0010zl'T\u0010ަB@\u0001̓85:ѱW\u0016[_O\u0002?},Unev-Vu{.\u001302C\rzwŌK,-uw\fnt\u0002*\u0002xݍ5d&nW\u001a|<9Mcu9K5s\u000fV\u001euORz\u0016-1^~\u0011ɞ\u0014n\b$vdsع\u0014$d\fP2͛E[HIr|(6\u000e&=m0\u0003VN\u0004/>`<|0bF2\u0013հr膒;p\u0005%/\u0012/vЌɧ++V$.VidG2gp(Kl)\u0010\renYjiI\u0015JERo:1l|\n\u0004|JBa>y\u001eŖ[lyްrGˠg@;\u0000c\u000b\u00109#\u0019i-^yD(Hr\\H+\f>\u0012}s,66T\u0000h>s\u000bpǟ?Md6#_|08/0̮S2\u0010\u001fx.o[\u0017\u001f]\u0013[\u0015\u000e\u001e\u0002F<;(GC5)~Nom(\"f?\u0003\f|=Jp\u0014a%\u001d\u0002t%\"Us `\\Ee9̍4X{g2!\u0014;\u0017̒w\u0006M)OG\u001f\n\u0016&縈6*:Hm\u0011qhws\u001aQ<\u0018ʮ\u000eU6)\u0016{\u0005ڽ[\rV\u0019$`!\u001d\fRç\tҵ31@T]*V\u0015\u0014޷U/\u0017r:\u000eR~\b\u0005s\u001cxuȾY0i&>\\/\u0011\u0016_=;хTu\u001e-(k\u0019\u00183v\u000fE\t^\tKT@\u000b@b/@F\t^*+l|A49c9E\u001aWrWoT\u000eqvy\u0005ՙ\u0006g)Eݸ\u0004V\u001e[\u001ftA-\u0019\tw\bǋ\u0005׻)\u0006&I\bp\u0012\u0000\\\tj\u0004=\u0015`\u0003\\\u0005p\u0000\u0016\u0000\u0010y\u00000[\u0003f\u0001\u000e\u0014U19(sMSYg7N%O2t*\u0002k.BQ\u0006X\u00077\u0013\\@\n x\t\bc4H\u00034O\tV\u0000\u0010@%X6 \n\u000e\u0010\u000e\u0001B9;`= <\u0001\bHA+q\u0011?\\ĺ)\u0017ۊVߜpĲ\u0016a\"Ɵ|5_eq\u0017WBk\u0010\"\u0010\u0006 k\r\u0010W\u0017W\u0002$R\u00017\u0001ܢT\u000e) \u0016\u000eY\u0011\u0001do\u0003\u0016\u00019z\tg@\u000e4 -\u001f\bNL\u0001`V0KXYmW-=ג^(sQUdW]DI9\t&\u0014ń(Ŭ\u0010Wg\u0019g)\u0012\u001a5jooߓɨ\u000b,\u0006v\u001e7\\Tg\\8G)ՎwڀMˀWs\u001d\u0015\u0003v1\u0004j<\u0005\u0002\u001ca\u0001'>\u0018:0\rX\u0003J,z\u0000Nc\u0016\u0015y>8Lǹ\u0001h\b\u0012aF\u0005!Ι\u001dE\u0003Gǲ\u0005\u0007T\\Ίj\u0002N(n\u001a\u0001y\u000fA|\u0000Ϫ\u000b=\b\u0013\u0005k\u001d\u0003\u0002\rɱ4m 0x'\u0006\bH\u0019\u0006\u0000\u000f\u00016S_k\u001ff|-)0Sҍ\u0019\u0014k\u000esfCZPVc`=B)w\b,\u001f\u000e£\u001f}\u0016@c<v\u001d\u0010~r\u0006\"_\u0003ޥ\u0012\u0007q&\t@\u001f\u0016r\u0015H\\!\u001bE@]\u0006H\u0006\u0012H@>\u0010o(əVͪ5Jp-wפ;3.HP\u001c\u001ar:Oq|雄M\u0003~kCA\u0006\u0001\n\u000f@]4M,\u0014PJoO\u001a(N\u0005~S\u0004\\;\u0000v¥ŴV\refeyA\u001b8U\u000b\u0000\u0001ϫ\u001f\u000eԔ?^4ܞ?o\u0002Y\u0011\u0013Iw\u0017@\u0013\u000e\u0019;`W󊝊@\u0017\u0016c;\bV\u0000˗)]\u0006z\u0015u\u000eH\\s\u0000[d{'\u0013\u0003C`xRV\u0012u\tLK\u001b&ބ&\u000e\u0019\u001b\u001d\u0018\u0016w8\u000f_\u000e8B\u0003 k=0e\"Qak\u0018d\u0013C}\u0013lY\u0012\u0012EFz\u0011\u0010K'a\u0002{9?F\u0004(= \u0017\u000b{'\u0000W\u001d_Z'ٷ:a^;gee\u000eNJTۄ&kpB\u0006$s \rI!Htʖ)\u001forDv=cz\u0002=Ђ<5wN1a\ntw\u000b\u001d.\u0010:z=iꪔ\"$9\bui)$\fB\u0006~\u001co*w7써k/\\\tEh5\u000f#\u000bt#\u0002pÍ\u000f㵇\u001c+X7w{Xua_44ޞl\"M\\|*ƛd&\u0006ٞ:>݊BD]z]fg\rOR߶+&Ӆ+Sb\u001b\u0013\u0017F\n)1:lk 0['ܿsԔΕxMܲ\r\u0019H\u00050\"%t\u001cj}*sQ`\u001e`?,V@g{zYeۿM3gq\u00030&\u0002b1c.ev\u001cS^K8jк\u0001\n2e6?#%\u001b\u001d:>rK\u0002dm΄aT>k{S3\u0006\\\n\u001cY쮋ZgWi{^ormԺu+Ӗ,gz\u0016h|քSЈ6 \r'\u001d?RqY\rK_R7ZbޕΗ<{?\u001d8g6nԎƭuWKg˽0]<\u001195lj\u0017jPRm]kUj.7hTw^UK˞{lF8-*QȜ**ȽA~@\r\u00143ЩW\\Z;\u0016J\u000bS\u0013q,&9`͡\u001fw%\u0012{,X\u0002%?mλ:-j.Vw~TΓ{l\u001fJ\u0014oDt6}O9yNhg\u0016J■\u0015m/vdb\u0013\u001aZpZpY@w\u0002nq?kz#1 jՄ˩Im:6+ʓˁ\u0005NHҨdJ:\u0017s/{m/\u001a-&\rn肫,.hCηei/rQVGX&pt&\u0016'\u0019#\u0004*p}~+<\bXW\u0012\u001fq\u0010Ji\f\u000b\u0012\u00166u؋K\u0007m\u000b]\u0017'\u001dCa)\u001b׬/*҆3\u0018V\u001b$mYV2GVI`nB-=Lڶf\u001a\u0013]\u001aK7g\u001a+v^\u000f\u0013\u0010U}\u001eYL<7T\u001b)\u0016I._\u00142-<g$\u0013-g̪~)(csk L6u>|v\u001c\u0007Lx&Yƥs_3wѠL[\u00163%_\u0019Q]4Al5\u0016e0#kQs{MK~M6̸v/dy<\u001a\u000b-\u0010\u0016}Yoh]2jOoFivXaȠç\u0006\u0010\u001d\f]фA3%\\7\u0017Pr_r?_2}\u001f-̶FYZ\u001a\u001cQ\u001e\u0006RɄZ6oeW9\u0014ÂFz.V'VѨvUz^^ٍDS\u000b:R^\\/\u001eڈ(aɦSJv A|\u0010'3&$J,K\"_:8^饩^R\u001f%LFyo5ke^ҹb\u0004K/AX1٨\\Ak3I7v$.9Mt%5r3\u0012\u0010Tף/Cfz!L\u0012\u001f\u0011H\u0017\u0011\u001c\u0013]\u00063\u0019_v4\u0014%ҭ\u000fRcك1w\u001a\rsYcm\u001dN/g`Z9C\u0017YJUN\u0013?yNs\rM\u001ab\b<o\\ʞ2AW\u001ak\u0016D\u001d\\%\u0014w\b\u0019F\u001bRx\u0012\\N87ܰGL\u0018XibY8'\u0018uR_WS\u0006Ȼl/z.\u001bUcN]FW/ͥ~S^7% ~o\u0017z$گFM\u0006,BzM\u0004rǬ*x彸FfKd[g.]h}I\u0017\u0016:\u0016#'$Mǘ|[l5[ f<:zc\u0010f\u0013֕ߒAqyE\u00136\",\u0017oST\\\n_<7\\c\u001brΊ`k5\\*hጧ)8C'\u0017r9*.\r\rJG*3N;2\u0002W|\u0016WPm|BjQs%\t0\t3$!++.%P^櫗\u001d]k\"\f'E-|Z̵n1etdӅ6I6E\r;UJ=6&Y:\rM\n\u001d_-!\t_}\u0011\u0002\u000fļ\u001d\u0013\u00109b+}H|Y\u0013zMpm4ZR\u0005'+G{]*iIXV,_$\u00138{>\u0002\u001b?\u00115;\u001a'3)Aw\u001a~!\u001de\u0014l\"\u0016D JQ꫊}wբ(¸ΔǸ;j\u0001ћ\u0003Ngm\u001cr\u0016nf[eƦmCk\u000f%\u001f\u0019\u0019gX\b\u0012=\u000eY6b9o8D4m>\"52\n9VMN+\u0015aX\u0004\u001e\u0018\u0011oa\u0003\u0018Vo\nz<ʨKCTR\u0017o9V]TGTz\u00073\u0006:\u0007r\"k^>Va0%\\QI\u001e\u0001&#\u0011*;\\eMi\u000eG>Nڭ#\u0014wӦ\u001a\u0019=~8j>S`T\n\u0015\u000b*-+0r)_%CK~=rh؈_\u00164\u001eL눨α\u0014x\u0012gn\u0012j s]dhdEb:XZ\u0017ATn:%Hl`xUWI,~}ŐVc\ts*\u0015E=0CDs\u000bA\u001eNpo+\u00025Y(=PJn|\u001d4SqS\u000eS;TBe-IȌ|of| s\u001c$\f[i\u0018\u0017>d&xTxj\u0018\u0012{$^\u0018&x\u0018\\;$\b#R΂kǆnPOM\u001aϯ6U\u00105+;\u0014\u000e'ۈ\u0002i\u0006\u0003q\u0001\u001e\u001d\u0016\u0000PD2l3{$97/9\u000fFB#\u001e\u0019 իKbS%\u0005&\u0003ħ` \u0000bВc٘\u0018bXF,> F\u0012\u0010\r\u0010\u001b\u0000x\u0006Ĥ\u0002\u0002b$󤉾Y\u0003D\u0003\u0013)n7}u+'\\3ҡ\u0002e\r\b|G`Η\u001ciocsU\u0017Zf\u0011H@J\u0014\u001c1\n\u0017\u0007Hu\u0003ȱ\\4@6, {^%]\u000b}n\u0018Kw\u000b\u0010yҦ\u00009\u00102;lO}\u001a~\u001d5ފ\u0000%Rh];/O4))y\tku_w(Qw- A\u00157REN\u0003\nڰb`\u0019Pj\u0000*d\u0000厊5@n,)&Hx=5i|\u00005EX\u0005@͜>\u0005P!-\u0002Ŷ\u0001Uq?\\\u0018@et/?*\u000f\u001d\rj\u001f\u0011B\u0012=^$r\u0015\u0014\u001a\u0019|7k\u001bE\u0011CO\u0015\u001aoB\u0019DI\u0000T$&l\u0005b\u0006y\u0003ځJ\u000esH/m@?\u001fC`\u000byv\u0005Bb\u0019ǟ\u0018X>#@_\u000e/@_W:w\u0004\rs\u0000t'h?']ᱥ<YCv۬\u0001\u001bUJΰ\u0005\u0013S5@\u001f&`84\u000b\u000b+\tn.`\u0000\u001c>|\u0004}\u0012\u0007v\\\u0000ۅ\u001a\r\b`\u001b<`K\u0014\u0019H\u0013zL\rFA\u0017\u0002^'PV\u0013?H\nm\u000e<ϥ\u0014I\u0015\nЙC\u0015C$[k\u0001\u000eϴ\u0001v\u0000W\u0000׻O\u0000wP׀G#'\u000e\u001eK\u0004A\u0004\u001e\u0007|cv\u0002|\u0000r]gj[)\u000b&>D0\u0011\u001979LI\u001e\u0013\\Ѡsj\u00047R$\u001c:\tS\u001f/9Zr\u0001«\u0001(\b@]@W= .\u0005\u0010\u000b-_\u0005b\u0005۹\u0003Q[f\u0013@}VIDZiT`ǻt\u0007f]ĞQ\u0010Ԝѿ9\u001fN<ǉ4\u001e>\u0010$A%\u0012\u000e7篵p\u0019a#\u0003\u0014\f\u0012\f+' ooI\u001eț\u00041\n`Q\u0002r_rK.JQeŭo%<\u001d[Аyc++\u001d'9\tsN$$]/MVK֑Q\u0015h\u0007Z@\u000b\u0000h\u0003M\u0005Z\u001bn\u0002͇@\u0010\"jx\u000bhu\tc)ؘftiIvFU?l<aIM_\u000f=Of'b\")|\tMLloop۠\u0006iya@mvjcn? ndAz\u0014L@z\u0013$&\u0014/֗Xf\u0013Woߐd\\,Z,?K%̱p,\u00134g=1{\u00032)N{#Zr.k\u001ay)rQsY;v}vd'.1\u0013qY\u001eb\u00190x@|z[u-w={o|tI_2\u0018R\fr\u0018q\u0018q<-4LV>f\u0016WRvs\u0019\b;!A\tM\u0010tR`P\u00133Vc\u0004wB^DG#9>Kl\u0000\u000f].\u0017YJy}sUT\u001a+e\r\u0001.B\u0016?dAY\u0005\u001dNOօ\u001c:90Pq$\u001e\u001faԚCE\u0007S\u0018>Q>C&\r$>\rƛq\u001ffR\u00162\"d9>E\u0002M\u00026:9\n3\u00124?9B\u001a<B\u001b\u0017\u0005P\u0013oVOӳ8X\u0014X\"f\\\u00113I\u000f~.Yݛ' K\fk|m\u0011ҟt3ڄ\u001e\u0019y 3*Pٝ[\u0003ugQ\u0006YȏW\u00011\u001flu^ԩ3l>xޢm_2[\u000fQZ;lL_f\u000e\u001c\t\u0017$:\tmڽ#[_4in\u001bQ[O\u001b\u001d|_\u001ew):y\u0005l]\u0006ٕ%m-?/\u001e}\\B+<'A6?#\u001c&4\u0007\r\u001bwR\u001d:\\FG{\fl\u0015_|%\u001af\u0015?VT$o \"b9(\u000b[߬y\u001erE6uaqe=9ʰƴ\u001a6*D=\u000eYkj%E%=M\u00155\u0012ڙn\u0017ʷ\\67\r\tmǱpd\\\u001aUm\tڵ\u001ei#E\u0015sٴ\u0017Ե\u001dIً.$$7>ԫ=\u0012qNͥGMrT\u0012unEyZa\u0016ge\u0003xk9\u001c\u000b^KY\u0011TqѢ\\\"z\u0000@1\n*^C?w\u001c>g9/WleynTw_\u001el 0X&Ln4hV|mV*t3%hv6pEѰ\u001d\u001e\u0014-*,621]\u0018f9*_s\u0012h~ʪ\u0004g.c)zn\u0005b;Ms'fNr#\u0013b\tݸ\tݵC,Or\u001c־D^m\rW;ëV5XvM6or~/<w_s^:|ẘjV!/\u0013\u0014N\n+زhea~v٭9ǽ\tTw+m7X\u0004d8F-\u0007\u0007Ow@-\u0015m7\fSkE M\\\nַ:UK\u0017j%ٜ>KPM\u0016?\tvd=\u0017KѲȥj\u001ḇ\t\u001drږZ\u001a0-c1zwF-t9xh1\u00064>oӪ7\u000f5Uro}E\u0007Ν\"\r7\u001eX=ᶑMh\u001b7o7\u0014=q a^bM5ڲ91\u0000o\"VJ6\r&=JҬj\u0006e*ӳuLKSkpW=Ɂrՙ*3VHһ\u001b94G\u0015)%8G\u0011њ賆e,Z\u0007[?Xdl\u000e'N\u001a7s7{N_d6\u0003V\u0005B\u000fTޤ\u0010NkRz\u0011Mm*%s+\u0016<a/{r\u001fw\u001b^ICE=I{1\u001a<s\u0005|j\u0015}\fxjq5\u0006¹ip5\u001d̹m\\ԖY\u000fvTkdѠ;L/\u0015Lt\u001bK$X3j\\q\u001dtM\u0012\\\u0007mRmF~Ll\u0013]z\u001fhJ\u0015\u0012\u000bb_/\u00137js\u0006sgG8g\u0013Dhb\u0011(ô׃)\u0013\u0011\u0019+NVRU(oKs\u0014[$\u001a:.EwYZ\t\u0015.?[%8iI\u001fFG\u0010\u0012dX\u0018VP:4~\u0001h\u000e\u001d~m\u001b\u000bR\u001dn\\-cub=\n#0e<9\u0017JQ\u0016V)Qa13ꔎ;3/\u0002$E\u001bŻ15\u0017%ЮR.%h~xh\u0000\u0012\u0002qѼ[\b<C\u001a[+\u0016W+Ex\u001bXx\r\u0019\u0019M\u001f`S/@R)\u001bdo͈&f)H̠Ԑ\rSrtL\u0018v]? 3t\u0013\u000e [\u0003%\u0012&b\u001e\u0004\th}p|'ؓ\u00122l\u000b:Ŏ\f}z\u0016\u001d.4hVRjB\rȎ\u0002+N.N\u001a)*^V\u0004''Gy|nUcL`;vZ;7I5FԸɯ{F\u0012\u001bҋ=\r\u0007+C\u0012`:u\u000b'{\u0003ә@ީŷeC\r\"5r|\u0012dU\u0019\u0012dM\u0005_aY\u0014+\u00154\u0017=\u00118\u001fhc=͡хyUƯGN5g7j&\u0004\u0017>%P\u0012r4Ŷj;{^Ի!Tf\u000bT3d)$\u0012tb9D.zl\u0015\u000eԳj\u001eƟoZ\u0002,4eTĨ\n.\u000fF\u0002WD]\u0013QB\u000fik1*\\\u000eS}݋!.`IĮ s%hR\nkS<ہP\u000eR\u0016U*u\tn$\u0001Qj\u0010\u00107\u0004^,Na\u0005!9\u001bJ~\r=Q6/\f\u0015;\u0013~\u0000\u0000߬k\t'>OP)P\u0003a.\u0002w\u000fi%\rg2N5̳pO\u0015Kԛ^\u001a;h \u0014$\u0002qox{bu&B\"z*\u0019L@%\u0005H&sZ\u0015De6|\u001f&{SAϨ,5S~!>W\u001fZq\u0003M\u0002AHA{n\u001aI9)_zf7\u001bbYy<sYPl|ὰھ\u0005#\u000b\u0014{?1I\u0010\r?ob\u001f=q״\u0018wTjh\u0000Q\u0002\f߳\u001a\u000e<\u0003\u001bӖ\f\t\r\r6YO\u0015`\u000e-\u0002f\u0000lD\u0000\u000fmuz;u\u001c\u000b\u000f`\r}H\u0012%}\u0012$Fٶ>\u0013ecٟ.\\\u0005)LèO-\u0000_\u001f\u0017V\u0006\u0013p-\u0005!\u0016R<\u0010J\u0015\u0000r,L,2\rҏş\u0001<Fp\u0005\u000b\u0005t?\u0002\\\u0001\"\u0019.eN\u000eL.jA\u0016Aòѫ*\u000f-eS\u000e7\t`|Qɽ\u0010a!MR\u001a$K\\'\u0012XZBnS\u001c  \u001a\u001b|K@0\u001b \u000f\t\bd\u001e\u0016m\u0001.\u0000*(ސpJ$k\u0007\u000bñ׶\u0012N͖uNV\u0017K\u0018\n\u000e\u0016$A^U\u0014\u0013=ʣ\u0019\u0004?ze\u0000\r\u0007,w\n\u0010\u0014\u001a\u000b\u0015W9H3X$@.& |1z#(\u0004'\u0004$Lv\u0002!0\u0002m\u0004~\u0006QbL$;@}ڽG:{t%\u0013dDs4GP##\u0012a\u0019\u0006Ivc_\u0018]\u0000Y\u001f\fN2 g\u000e{.\u0007(xT\u0001\u0014T&B{@Y\u0010C\u0004\u00146(\u0003L\u0001ɥ\u0000y\u0000]\u001e\u00009-X\u0005\f\u0001\u001d^qyY̵&bW!*iTĂ dаaT\nx\u001be\fPЀ\u0004\u0001\u0002\u001eP\u0000j]7\u0001\u0015M&\u000e-[g\u0007t9z\u0001t%\u0001S\u0013k@k\u001f\u001c;\u0010\u0013q!^0hlCW\\\u001a'.6-\u0016V:&Id+\u0012<\u00124:\u0002H\u0011\u00161$@u\u0015PB~,pJ\u00110z\u0005Lm\u0001f\n\u0000\u000bUgO\u00072\u0007\u0005,b\u0000:\u001c\t >my'әĀ^..s\u0019&\u0001ߜ8$i\tyL:7M$]W\u00109jˡx\u000f\u001c;\u0003.=\u001b\u0002\t/\u0000wp\u000eg'9%$\u0015\\Sc\u000fg:\u001eO\u0018pE\u0016o\u001bG!:%Gnh\"K5\u0010AʹZ*phjRSIs\u000bߨoZ\u0019\bfrA\r\u0007b\"h6@\u001d\u0010\u000b\u0006D**\u0002v\u001bj\u0007\u0005\u0003`7=KΧ:7\u0001..vbN-gr\u001f:)IEmǉ_f/fe>\u0005dR\u001c@^2^,9'}Z\u0002r\\в]l0*E\u0002䗋\u001bv\f\u0014\u0016)\u001c#9\u001bBGi.~5b/_\u0011\u0013_\u000f8[:|{\u0005Rs\u00024\u0007fIɍ\u0002 k\u0004Ի\r\u0003\u001fCuZ\u0003u\u0017]wfBVFø\u0002-!b(%%\"&\tek \t0^\bQg|0-48W;\u000b >H\u00059Ncd\r0$c},Ɇ&q\u0014\u000bq0gβx\u00193oʵX\u0017\u001dN\u001cǵog\u001dF%i\rK1_Z뗡HoG'\t~R^d7).;\u0015EG<\u0014t¯e֣\u0003t{Ͻ\fm\u0010K=L\u0016V>7QYW0g/l6ZBxᝬ$\r{M!|qw\u0006ќ>\u0005Y>dw\u0015u\"uÍBc\u0015\u0015\u001dsyX٥yK\u001cw^:V!ٞ:O\\w%{7:s;\u001aKlpIm?Q\u0018WR`w;EM\u001a\u0011f578&\f5Ikptcy+vv0Ϟ$\u0011!͔\u0018]\u0019\u001d}\u0018UKi\u001e\u0019p\u0018\u0006T}\u001b|φT%X9+ uuS>\u0013*}Fs\u000fVY}.VJB\u0006\rQ6Y\u0017'ec\u0011ʇOo\"e?G?ҩr\u000f\u001d\u00011;x]z5;uzo5\\WVo3<\\=\u000b<>Q\"+5lr/jHN\u001c{$Nox{\u001ceJ%\u001as,vD{͡\u000f\nObdt]4<\u001e\u001fھ\\ZY\u0000g/{a5G٪Ԅ\rac\rg%errukպjN'p`Tͪ|\u001b\u001cHRe\"rUVQ&Ʋ5\u0002Fqڪ{IUU\u0007Q\u0012VΝy\u0013\u001e\u0006Ekk\bgT\u000bļʝ{l&\u000bWU\u001e\u0015}L\u000e*\u001b)\u0017wC9\u0016SJ92Ћj)l|.φM\\~ai\u000b׭\u0012S;N<\u000f[_N\f$\u0017IVC\u0002y*Cq+ʣWtV,}fiõzqZZ4E\u001eLE}`SX\u0002}]^\u000f&| 9/Sh\nY72E\tWzn\u0015֢e>o~ΫDG,eI\bHd\\L@Lȹr`\u0016\u000b\u001c6[\u00175Z)G)wzܱw\u0013?D-\u001bVVn63\u0007\u0019\u0003sUXXa,{2G;`BgHۊ([7g8ՙ\u001eOÆ\u0016XV's\u0002\u001c6+\u001b[\u0006l~/ޔTT٬\u001a`#bY3\u0016fm\u001c{ɛ\u00118驇U\u0005k\u001a\u000e\u001b\raOu['8h$\u001e9^J\u0012mW\u000f+ů0E_uE\u0015\u000bo얉Ļ\tseOlw%3\u000fܕ<3J-Fsp\ti\u0010\u0015[vճxA!QSJX\u001b=DrO˽|.7rP\u0007\u0017\u0014d)FI܎}qkGb\\bj,I{\u001a\u0013Sy\fQ+RW;폺9\\\u001a\u0014{}\u001fdVO3\u001fmo\u0017`/\u0013zB*(DOS)wRF[^ڼ*\rG[\u0016@\u001c\\mZGa]\u001a/w\u000e;_N:<}M\u001a\u0015M]bm~_¨2*M=vj9+8J\u0000cVgoL=\u0007r-J粺)t|!9M\u001dv\u0015=\u0019)>\u0005\t<PU\u001c\u0015K̗\n\u0010PtM\u0001W\u000f}{x\u000e\\uz\u0007ʰy5ǜ{im-}\u0002\u001a*#\u0007i^\u0012\u0017\u001dq(iZU=kyVۻ9\u0019#!\rK葔Y\u0017\u001eR*Wx\u0013؅Db\u001c\u000f\u0018\u0001\u0004\u0002Rv:_2<5\u001c+_:Ǯ*]Iw̹2\u0019]F\u001dPtEG:~!<9.Tڔ\u0019I\r9\u001fj\u001f\u0015͵>M45qRJQSK}\u0012T?DT\"a>\u001d\u0012;\tyWmS7j\u0006q\u001c&1afn0筗euQGw\u0007\\H=S%eW+\u0004mM&|\bX.ϮB\u0012\u0011\u0005Olն4^6\u0017IU\u0019--,ҝ_\u0017\u0007#K9[\u0011{D;+z\u00172\u0019\u001f(qt\u0010_PMy%ʼur\u00022ԩE\u0004P\u001a\u000eU̥3tW/\u00180y:bdgfQI/n\u000bK;!\u001bI1\u000fJ\u0014XXD7ޛw^ޝ;S2%\u001dXA~RCC\u0006JY&?H a\u0013Ӄo'0q_OpR㎘;\u000fat\u000f \u0019.\u00172S[j(r\u0012ʧ\u001eZ/\"^\fKv2eU66o\u0017'rE\u0005 ~i\u0019h\u001f`\u00036Ko)\u000f䘀odnMHؕ!bI\u0002Y|)g\u000b\u001c\u0018-tߨ\u000fцpۣ|䤐\u001aIKH}cÝ\f\u001d\u0005HEO\u0005\t:֘:\u0006\t2ƙ\t),\u001d\u0014YŞ*ЍԦ\u0011ݓ\u0003eO\u001b2VĬ=;\u00108e{\u001d)l6g\u0004ŪmX%#[+6\u0012*\u0014\u0019\u000fir\u0003D,/a1⡇\u0017\u0006-&&ԛ$G&wY\u000e}\u0002eJZ-$(FfF\u0017ޙzm\u0003/\u0004TW8U/ouF\u000f\rmR'*lW\u0010*R$\u0011\u000ei\u001be\u0003_\u0002#\u001e\u000e1=o;{JI}\u0005J\u0001#l\u0006(\u001ad\fMYeW,jrAJ˙&$yVA]x3ntӖ{N84K\u001e9\u0015Wfr'\u000b\u0014\u000f>pw1Aa93P!+[ \u0002e\fB\u0004P\u001bce\u0001n\u0007\u00005\u001bs\u0003Pil\u0001TX\u001c?Y2i='\u0001\u000fS^\u001a\u001dmM?Ne6ND\"}W\u000eb\\b9ET\u0004\u001bh\nY\u0018#\u0005\u001d8\u0000M\u0013\u0003hT`\u0000Yi\u0000\u0003\u001dK\u0003X\n\u0012F\u0000r\u0014@h>s\b\t\u0013iǲ\u0001tZ0\tY\u0003C_9{n,`\u001f\u001ddA/*\u0002'\u001dPqY!~B1$\\\f~\\\u0000x\u0001\u0017A,\u0015<9\u000f\u00101b)b9% 7v\u00050\u00016Ŀcu\u0014J!1(Nr:\u001bWGS\u0016\f1\u001b#a`\u001f\u001frr>\bi]:}?'\u001c\u0010:$H\u001d\f#\u00028B\u0001Φ\u0000ך0[\n5Ve_\u0001x]ƲX\u0002a>@Y\u0001^Z\u0001\u0017\u0000P+\u0004\u00073\u001e\u0018\u0018?i(BhK&-еCpR\u0013\u0003\bG/P\u0007\\׵\u0017a\u0004\u000eu\u00068\u0013x\u0003@-phM\u0000\"q(wX.y@TZ,\u0010\u0010e\u0001D \u0002 ǿ0\r \u0004\u0004\u0004Q\u000b\rִh\u0007Z4k71(wu\u000b!\u0013dN\u0002\u000f%)\u0012'C`P溿W\u0000B*_oҹ\u0003\"<U.W\u0002$2 \u001b\u0005Ȟ\u0000ٌO)ٜ$\u0010t\u0018Y\u0005dy\u0016.\u001b\u001c\u0000'9d\u0004HI3N\u0006RCyAI$IU\u0007Ȓ'\u0013FPy~JMn;iL\u000ea!@\u000f\u0001\u0005(\u0003J5@\u0005\u00064z\u001c\u0016f<H@Zs]@\nr|\u001dPY\u0017,)e\u0015C5yL\n\u001cA,&\u0014r\u000e<v{H$lOx\nq9A\u001e\u00108\u000f8@\u0019\u000f\u0015\u001d\u0005Х\u0017\u0012(}\u0014\u001dp\u0006`j.`\u0019`\u00010a\u001aK\u00110\\\t0\u000e|\u0000 \u0019\u001cЏ a:@\u0019^:+l\u0017keғ}k\u0011\u0006U\u0003OY4\u001fv\\*\u0001\tf}\u0016`߭\u0010p\u001cp\u0001p\u000bp\u000b\u0006\\\u0012m\u0001.\u0001q\f'\u0003쩟k]k6AE[sᕅjt6\rZ(%5%Vm'bE%q0$l7I\u0019N\tk͠\u0011\u0010>\u0000@|ב@$\u0010\u0017\bQg\b'Sئ} \u0014;\u0010Y[})=T\u000225\u001b8\u0012^;@\tM\fI%I\u0011\tW4\u001e@\u0007ID\u000f&h\u0002\f \u001b\u0007-#\u0000r9\u00019\u001bb@Vky #)U\fH\u0006&nr9@K\u0003r5:\n-xl\u000eZ?8tr\u0012\u00147b\"#aIu\u0015,M\u0012䛰;*\\f^Dbp\u0015ד\u0007\fN\u0006j\u0005*%\"\u00147MtIR43x1\u000eN2/_\u000eIo,זzeo\u000bҸ\u0002{\u0001\u0013q́1)\u0017\u0017{^\u00035_ qW~C}nr:Ĳ%\t\u000e\u001f\u0003O+uGk\u000fV:>ZN/;={^u#q,ORzt|a$\npն쬙0ԑx\u0012U\u0016d\"-ŕLe\u000f!vPL2Ɯ\u0010\u0007@[it{ډ?G\u0019wx\u0015rcH2È\u0005Twx\u0007X(^VS~/o6x6'|\u001eL\u0017'!_\tYP_\rs2A>\u0001{\u001d\u001dClr=\u001b8Ə/jWc\u000eVr,LX6^\u001aڬ\u001bӅLQ0qby\\ѱR\fzg<fٽ?A ճqD&%\u000bp%\f5q&7Azk엇Gy\u0019?Hssg\u001bOӝ)b4:aV[c\u001a\u001d\u001c~g_g{(XXK\u0016ήpѩ5oe\u0000\u000bBY{p݄VQM@jњi\u0006ɿY}\u0010\r\u0016\u0005!&\u0006Č0:3\u001fkQ\u001dy;\\vV\u001b޳n{y\fqIcZ\u001as;\f\u001b6Z\u000bZW{\u0007\t⇯=\t]*K\u001a\u0003TuKK\u0012\u001boBx۾0^xǧ /\u00046\u0005\u0018$s\u000f\u001d6U5+lb\"UO-)W+~)߆B9+s:i:\u0016vF\u0015|QvKqZE\\L\u000b?\u0017ڎl\n\u0010|$i`y+\n\t%\u000f\u001azIp\u0017Bf=דJ.ָs\fؘ9a^>sP\u0011NTsO{\u00117elG|\u0006:TUf4%Hu(Us\u0012Te\u0019˪x=ox\n?I\u0003ʧ'i\r-M\u0012[:{Ǳw\u0004-ۆqjafn\nE/w\u001bK\u001en؟\u000frg2<«u6;\u001f2\u0006~:\u0015?G\\\u00116?{2GjBs!=~V_4\u0018\"b|_IL'0Ej\u0005:\nܱhp\"2Ɍ\u0018蒷dI2,Q/9N\u00123du\tEǛ\u00186Z⠻3@Ezk<ɫEzeaJ4Ũ\u0012T֪W7$T?9\u0015s\u00141%y>\u000b{jIX\u001c3~+hQQ? t2ݐk<\u0017TpUN7U\t+wh\u001b)*5[ʷ\u001d8'fz>%=O3^\ns'Yʭ/~yv,d\u0019(vt\u0000\u001amqX7,BϤ\u00153K\u001a3x7V\u00178~a/U[J4_ <)E%n|@\u001cT\tMz\u001e\bS\nb^lYDͦ8=1´\u0004ۜ\u0002\u00064_/U)\u0004sĎ\u001cO/\u0017I\"\u0012{ .+߶˭G!/T3\u001fi*>\u0010Mr\u0005󫢱|G9l(Yzv\u0014֣dϷ9cS`LnwLZ\u0006\u0012/FN\u0015W\u0017Q'S:\u0001ڥ\u0005[lb,O_3q0^ӻ175\u0019Ź4\u00142s\u0006G?5T,X_\u000e\tfJׇ\")3\u000e؊y;܉y,<p;\t3\u001e\tXK{q\u0000Ĺugj\n}!4P#Ǡƴuw\"&+\u0011>?8u\u001ftMʸ!Mʸ\u0003j\u0012O\u001d5Uj\u001e\u0010Y\u0017JB$\u0012\u000e\\Gz\u001f7q\u0012'anOw\u0002>p|9/OMkꞧPU\u001d>Xza\u00050gG1R`];\u001b8GkUåz\u000fCь\u001c\u0017\u000fO\u000fm﹨(w\u000f_\"Jr\u000e9Y0`\u0000,\n3=9̜\u000fkn,~U@bf[5\u0010No\"\u0003]2]9Bs\u0012k\u0000̲m5s\u0017I3ѣPW*6;DQ>jv\u001bAj؝x\u001dbYgop\u0010IMWQ\u0005>?f\bpbEK?\u001a;OY6טU3ĺL(A5s<J]\u001dd;VT\u0000/C*DJR~s:ŷL)Y6\u0015]PUz\u001b;$I^T0XL-AVc[I^ve\u001a\u0013Gwv>1}6:`l$x1L)\u001f\u0018jU\u0019yߥ\u001a\u0003$\u000f^-\u001crpRH\u0010&&\u0012'\u0012\u0004R\u001fIQmk\u0019K3RIԗd0&U\t,K\u001dnr\u0012-\bb'xtleν\u0005g(vʙ!\u0007u?43\u001e\u0010\u00055ҭ\ndI4\b]N\u001d\br\u0004mP70;_c^bv\u001dvo\u000bPMo;d\"\u0014/ɜ\u0003YjGA<m>O7έE>2g`plDofաH5Kč\u0012H\u0005N.ЫNv1GSG,\u0011-\u0015\\Ox\u001daOn\u0012`\u000e+Gݤ\u0012\u00016\u001e\u001d\u0016tX˕]\u001eS쪚rvD<^P'\u00146ߑx\u0017dt8c߰ylXd\u0001ܠmPBkl&|\u000fz!#\u0016!*[3\u0005\r\nendstream\rendobj\r264 0 obj\r<</Length 65536>>stream\r\n\u0014*\u00113a\"`\u0012HE`r\u0000_\u0015J\u0000&\r\u001a=\"\r!]BQ29@T#''ɓ\u0013Ե\u0011rXE܄:rAp@imX\\\u0013W\fUz,hV\b\u0000)+\u001b';||l:țQHE\"¼\u0000G\u001b\u0010jq\u000e(~p\u0014\u0000\r+\u001b+@+\u000e\u0010D\bרV<w,^͔\u0013\u0012tD@toj9\u001b=rp߳Keʞhu򱤄$\u00151'\u001a\u001f}z;l&Ȼ?Dr\t\u001d1{\u0012K\u0003b-\u0010l\u000e\u0012\u0010\u0003\u0010;J\u0002y\u0003bno\u00011\"d\bGl\u0017FX_OL)~e+烋\u0017[\u0004ix8\rǁqϬ\u001b-]O\u0011\u0016ү+_-\u00011^`e\r;d\u001c@r\u001f\u001bz\u0000'\u0000\u0010\u001a1\b\" \u001e\u0005\tTVA:tZm\u0003R%gD[qA. \u0017\\=\u0014\u0011M\u001f\u001b^\u0016\u000b7\\%;g\u0013K=;u7d}Aqc2F\u0016^\u0004fv\u0000!!K;\u0002ڻ\u0000}x\u0001\u0010J<M\u001cPR\u001c\u0000o\u0001\u00159\u0016\u0018=H:\u0001|\u0002r\u0018#E:[\u001c;EHSGԀ\u0007\"3C\u000f\u0007-mWvV<mf\u0003\u000b\u00195l\u0000m@{.\u0015Pӗ\u0007S\u0003MA8H>i\b\u001a.\u0018\u0010U[\u0004\u0010P\rP\u0002<@\u001e;t<ZR1g\u001cτ07\u0007\u0007SP\u0017-y\u001c\b1#j\u0007?(\u0006q\u0000wܸ\u0016W@\u0017\u0013/@\u001f@/W\u0004\u001f\u0011\u001eB:\u0006\u0003ڣڀv;\u0006\u0018\u0003zH\u0003z[G\u0002Y\u0001=5\u0001<8.\u000e3hi\u0019=W& \u000egϔ\u000fK\u0016O_˻/\u001c31\u001e\u0007i\u001f:B:\u0019K\u0000\u0001`jo\u00120f\u0003L0R\u0001KӀ\u000b\u0019\u000e\u000f0\u0002\u0010y\u001csXwd\u000b0z\u0006?%\u0016\u0011>GkY璐\u001d\nitd=<\\N\u0018L\"[NaS\u0000\u0017\u0000'DSkNJ\u0010n-ܶ2S\b\rR\u0007\\*\u0002.eV\u0001\f7t7m\u0019\u0002I\u0002oE}8~J\u001c\u00062\foS8\u001f\u001fUI#\u001c\u0015\rђ7\u001dҀ\u001c@\u000f\u0004(fc,27\nj\u001b\b\u0004\b`^@a:\u000e[\u0003}\u0000U^D\u0002q\u0003>\u001dPW˱V.\\7{m,\u001a\u0002\u000b\u0015)kE\u001c \u000f\u000eL c \u0013\u001e-R%\"\u0015IH\u0018\t2<@\u0016.@\t E2X\u0004G{\u0006D7\u00004\u0000b\u0000_f}\u0019ELh|fl\b-zp\u0015<`kREYoL84\"5LP\u0016\u000fC\u0000E\u000fV+#\u0001ņ\u0000e!;@IHz\u0005ȗ\u0016S\u0014-܈\u0017\r\u000e\nr=L.P\u0017F9\u00115+\u0015z\u0011'$ҹ%\u000f<~O䋬a~o,J\t\u000e\u0002A\u0017r\u0015\u0013D=/\nS\u001fD\u0007\u0012\u0014|^#~;\tTjlDf76ҡCE\\N?X{]E\u0012HEL~[={/RZ$/Cm(&H\u0016$z5Hd;HD\u000fpnhU@|@@Iրv7\u001fbZO\u001a,ϗ䤵ױJ^/?4*\u0015*PX/F^/7/zCkoB\u001a__2o\u000f=P ]@:d@Z-@\u001aSڿ=DR U\u000eC\u0006^{o.Y}d\f\u0017BN/힯\u0005e\u0006/><\u0001pcfѻ4nb^jkuIگ\u0015c\u001bc&^bd:\u0002Z_i\u0017@G_G\u0000_V+\u000fm~f9^\u000bb{E(]D[/^1\u0018\rf7>t\u0007'E\u000exF2p\u000fD8]zoOYɸXs8˱w/a-\"\u0016B\u0012WF+Z,\u0014woC\u0002*KRWA\\ၟ\\HX:7>{inw^=\u001a\u0012m\u0007.=\u000fU}K+ޚG\u001djX83%\r3y\u000eOf\u0005>OĊ@Z';\"\u0017_\u0002HC\r3ZȋB\u0006{\u001e\u0002\u0012RW1t\u000b\\\u0017\u0016*\\Loz]|d I\u0016|jeɶ_OM\u001e7a6t?2\n\u000f[\u0011\u0003ͻ-\u001dVi>avZ[\u0015Cn5߉\u0015V\u001a_!A\u001aTq\\\\F~\rϭ\u001b\u0018\u0012\u000fQ\\O⁦3}\\]]|vԳ֟\u000esxg)YV\u0013+xl܌#݈GRt|~\u0005y\u0017]HEi\rkr,h/\u0017\t\u00050!l\u001b\u0011.qU);\u000b\u001aZP\u0003I-e|mV١Vtj9\nyZZT|[+\u0019K?\u000fN+8-+_ -w\u0018h5TC\u0014T? B\u0006jB)T\u0017CU+e>҆\u0010\u001bTH8+b\u001a*9Ԍ;N{)gAca[Mj\\ߏZY-,Yi,59S^\u0016J\u0015H[+]NW\b7\n[\u001ee5 #[fN^H49.y!c\u0004r\u0016¤,KQv֨/`\f36\u001cY\u0017$w&]4&\u001f5\u001d)\u001fId3ר%\u00050\u0013\u0012*ULtj}Bfw@^o)\bH\u0016;76kԸHf܇bJ\u0006;tYc\u0010Nt^4y#v(jZ<J:S%lӥ$.\u0012NXK$x\u00066l7-ΏwģIרRj>D{\u0006 {\u0015XJ+[SF,JϔK9\u001c\u0012\u001bFܓp)!\u0015ɧq8!l\u0001\u0004GI,|\r\u001fQ\u001a|<6c\nQWE꠫~nD]gŚ٘R\u0016\n\u0015;vuu)-o7B\u0011R.'u\u000e\u001fM'^\u0018wqֆ>]m,7QQ39AѬ}@\u0002uѿ\u0003\u0010\u000b\b\u0015pF&SB\u0006\\5\u000bH,\u001aR$\\E3bΉ2|We\u000e\u0016;v\u001cj\u0019+\u0017\u0005G,\u0011X~Ħ=\u0014\u000bG-Rp`X\u0013B;y;;\u0010G\u0005W\u0005'9K!\u0004B&AjE\u0010ef\u0014\u00131'-!Dڈ\u001f\u001b>\u001eͼ8dad&36\u000eA/s˨4bPׯEdNÉ\u001aP:wljܢ\u0011*\u00153룧%OBje\u000bi$YD\u0019NW\\\u0012Ci|MH(_y7\u001b\u001c㩗yoQ&z\r0\u001ak`\u0001ł%B0f\u001442\rԧx$l΢dNICGs7T\u0002}/sc|#=s)*Ü)LŹ*+!&V\u0011prȥ\u0002\u0006fg\\\u0003cs\u0019˂+|\u0014e.V3Gj׹T]S\u0014}r_E!\\/\u0014\u0006@d\bc/&z\n͊Z?g\u0011+8⩷밾\u001f]\"{i½r)7}gs|ɕj-\u001b\u001e\u000e01d\u0016~Ll$\u000ftF}HbKz\u0014t1\u0011'L(z\"]%V~,4}\nAE糁0um\u0016h?9]\\&2\u001eR{F䈍\u0019x\r\u0019bVW+ꎦg#eW\u0007`^\u001f\")-\u0015R<ͳDO}4\b垞~\u000f\b0\u001a6\u0019\u001d,w,\u0004,<%v:Wem2ŋu^\u001ba☺\u001er4bo\u000bvV8M\u0013YM|:dJYi\u0010wr@Wހ\u0019`s,T\u001d\b\u000b)\tsu\u001dP3_?p\u000f\u0016\n\u0011\u0001V6\u0011ŃH5UL5|W:|\u001ec|Jmf𲟔\t\u000e96^.\u001fMWe;>9-<bltm\u0011ܙ\u0001\u0001՘:}ҥCmSR\u001aL睗DI\bu\u001e[:Ǉ\u000100XՈH:EXs\u0004X/'\u0001L\u001b\u00007ʁ54\u00018QTJdj߈$s.7m9CI,\u0005w5\u0018K\u001aL-+A-\fR<!Ŵ3 %\u001a\u0012zޙ72ay\u001cq]cR\u001ay\u0018\u0013\u0015ɦ8X\u0013\u0011\u00068h\u0001\\\u0000O\u0013f\u0014`~\u0003̯\u0003\u00155rd ؛b\u0007塩/Jf]>%,V_B9iT4&\u000fH{,\u0001\u000f1~ǜ\u0019\r#\u0012:fČ\fW\u0011P\u001anAp\u0001\u0000G#\u0010&\u0002\u0007\fZ\u001d\u001b\u001f\u0000\u001f&V\u0000\u001fQ\u0001[\u0017\rm\u000f\n\u0006x\u0004xF,Q\u0012\" R\u0007F\u0013\u000f̅\u0011w9inTXIoƄrt׷>ҡ\u0015\u0017\u0011~\bٱf\u00113ל%\u001c\u0000O!t6 # (ƃ!%@Й,k\u0017\u0010Lw\r\b6\u0001DDH\u0002\u0002c\u00006Qml!\u0017%>5W\fr?e-[h(+\\:4\u001bmL)!H~\u0003>pGشc#n2\u0003D2:\u0001p<\u0007ذ\u000e9\u000b\u000faK&K\u0019\n\u0011u\b\u001d &\u0006\b\u0003\u000fJ\u0007\u0016\u0010}\u001d\u0010K+C5>FUcttE׶+\u0012F))\t`c|48Cb\u00181T,\u001fC\u0013k\u00012\u0001<Bh!\u001f@6\u0019\u0006B;\u0006]\u0006d\u0016t\"\u001e;\u000e\rΌӇ% pDHGRTK^䴴PTT,b.J;\u0017,#L6r\u0016Պd6&c\u000f?9B$\u0012\u0018cHK\u0000,\u000fdyl@#\u0015P\u000bP\u0019\u0015\u0013 Ge5\b)rC\u0001%e@\u0011\u0006NMx4\u0004)SkE1EjIZҍwɜYS\u0007Ěm8]\u0013K<\u0016tqf\\\u0003?t0b\u0001)Wo>d1\\t\u001da\u0000]\"T\b0\u001c\u0002t`\u0002:]\u0001l9@3:\u0000\u0011\u0000u,U7YD\t[Qeq/O>w<O\u0000t\u001cEj9WgHAȬ`gAn\u0016\u001aۀ\u001f\u000e\t\ndyoam\f0\b\r>V2}3\t\u0001^\u0001Lև\u0001\u001ci$ \u0001#\"1^\u000eg}X62<JʠT\u0016.\u001a\u001eè<X^t$`-[\u0016uq\u001aEN Lҡ\fk7ᗈ\u0000\\g\u0001;)}R\t\u0001\u0018p\r8B\u0001:\u0000\u0004ݾ4>`\u001bۂ|茌Q+\r\"{\fϼ\u001a\u0002Y(Y90]\u0000pu\u0011o\u0005/NSMfQ(_ˀ?W;\u0010Vc\rM8\n\u000b>\u00071\u00038\u000e\u0000󀳳\u001e\u0006\u0001?»&xNo\u0018S\u0001_H GEoBW\u0006\u001f\nWD/1!\u000eޮ\t\u0015*\\Gp\u0007mG\u0000q\u0019׀Rj\u000bDyL\u00016@p>\u001e\f8\u001458\u000f\u001cU[2C<;-dq\t\u00051\u001cr+\u0014u~\u0016F`0A\u0001\u0001(R\u0000C\u0001eGXU\"$\f \u001fw o1 # k\u000fnW>@#a0\u001a%58bTȿJU0bn{'\u00071~zYrDϊ\u00071X\u000e.b\u0011\bn\u0006ъV\u0002Q5\u0005Q6\u0002u\u0018ح{#s[8\u0007j/\u001eE\u001dCN߭&^$\u00178 Wo{&\"7uAb3XD\u000f^-\u00126\u000e\u000f\u0011!\u0019\u001fG .;\u001el+\ti\u0003E+D\u0015h\nh2/8g#+\"~._$pz]*1K7k/J\u000f\u0015]齟\u0006p\u001a\u0000It5\u0000i4  UvA<v\nw%V]\t\u0015~˾E{z5+W~Wy<KJ\u0019Ѹg{\u0014nL>z\u0015˄OXr\u0012;仈\"yQF\u0003Z\u000b׹O-6><\u0002R9=\u001c<-?K\u0010B*=\u0001UK\u0015GTZ'Kc޻j9\u00173}ÝהfQ[m3פ{ۚ4`\u0016ҭKŹ>޸Mo\u0002\u001d2+\u001424Tpحބ^2\u0010־\u001emm{?o3um\u000fkV^+'}n\u0013YJ\u000f\twP7f>\u0014on\t#gڜZxwcI#΍`X/4z\u0015\u0006ϑ̝h0\u001b[s:bDV\u0010Zg\u001ckL,ўkoܤmؓn.o[\u0019h[\",?X@&%T<%\u000f\\;B\u0002\u0012y/@>r-IƐ\u0018E! s'ЂaHC\u0006D\u001b9>C?tQ#\u001d#{v2-v\u001dvj\u001c6jHՉF5\u0017n\f3ʰ-rz\n\u001fkFײL_.ZB\u001b\u000f\u0014|t]$.(\rX$\"\u0017\u00056 }oZ%\u001b&\r4{h\f|\u0016\u0005W3t\u0002](6\u000fϦy\u0016kQ^ujɔR,^+S<_fA\u000f(.\u000fz>ΕYP\u0000\u0012RQP+J\r0A64'_<hsRS=\fo;\"\u000b\u0010*F(\u001azA4Fۢ:\u000f\u000bE[ܤ2=vFþgYtI2SPJJ\u001aȥ\u001aOmg;&Ue\u0014\u001byPVE,Q\u0010;R\nj\u0010INdm\ffY\"E*h%x\bP\u001a,㙂h2iOu)MT-o]O\u00118\b󄻈n\u0012B\u0014?W\\Rl<\fmajq9D\u00021:&NhQD/PWD.v\u0006IЈ|\u001d3>]?;'\\c~p\u00130,\u0019&!G2B*)(im5\rk\u001c;WMZF,%^QEVͻ\u0018ZH*\u0016c\u0015{|Z*\u001d\b)\u00028O0g]XFD\no\u0014ؗ\u0019kqzM\u001au,6\u0010&.N\u0010Ђz{DG\n\u000e\u0000\u0016TV1O\u0016\u0014kRrf'/rۆbPr%5˧0C\u00126'\tL\"{\u00129!@\u0012U\u000fU\u0013Ifp|N\n\r\u0000+Յ~4\u0015kԝ*De\ta³dؿl\b\\<2\u000b]j\u0016$\u0010Gt7\n!v9N*uZ[*D\r?ԫ>\u001fQ>\u0011={\"H1m\u001f\u001fF5>b \u001e\u000fQ3o9*n\\{u\ryƒ\u000eDךNy5\u0012ej3p2!y^\u000bz#\u0013<}orᇝt%Y>.?wQܤ&YkXcr\u001ft|>2,\u0016~Y\rFQ\b,\u000bpxT\u000bF\u0014\u0013ݎǦ3\u0012Ty'[&\u001eLX\u00117:?t>>V!>̀KE%ڒ5F\rMT523̇`phk9\u0012Ѣ)r\u0014JCvzR[UZ\u0013өZkSQC\"^)\u0007B>\u0014!\u0019\rlG؍$VG\u000b$|>\u0018pC^g$eM\u001cl\u0014\u00164>\u000b\nY\tW\u0019ϊ^3.;ڑ\u0007\u0013\f@Վ\u001eGU5NYl))\u0014'RHvY½˄{]]\t6HA(e.i7/ɖb\u0012A:$kZH(8gs[,?n!\nV^?.>\u001a=0{2vscJ֜0wM-4ܯ\u001b٪?H;,qt8m\u000e\"S1OxVdX\u0004/QO葧$\u0015~5Y{!\u0006{ָ+G:4Yl\u0016.\u0017|Ug7MoF\u0016e+\u000eU\u000b\u001dkd\u0014\u0003-0\"rm\u0006X\u0011'u\u0012 Ư}װG:YFo{\u0014y\u0015a\u000eTdFDHzff;;1<2\u00010ߓ&:\u00039F\u001c\u0015G\u0016OR\u0019;/\u0006̪FMsۦJI5Z<4RmmRyO\u0013CtC(y@(\u0004k\u000b\b\u001d\u001e{lcybTL]r~\u001e\u000ec\u0007\"\u001c\u0003E=\r\"\u001cD\u0013rI1~KV\u001d=\u001a׹Z*/\\חܬ\u0011?3`ץE5Z<\fꐢ+Cb2h\u0013\u001f:5\u001aa0*k\u000e*\u000f8|\u0015\u0001F)QR\u0007\u000bR}8|\u001c\r<n4xK'd*2\u0015(Չ\u0011$kuz~8{ʔjR6a\u0007ըtZ\u0014\u0005m\u001dRR]WڄJ\u0006-|_Z\u0007\u001d,u#~2df1dp\u0001-Z\u0013\u0004+\u0000X[ l3\u0000z\u000067t̥\bt\u0000&\t\u0000K1\u0014%tt}qqH2G/̪Jv)^;nvIOu+C)\u001cR>!1G֮\u0003>\u001b\u000b\nL\u001fRpC&2z!\u0000{\u0005G>9y\u0003\u001d`\u001e`\u0004\u0003\\\u0005خw\u0005ؼ\u0017\u0005`̐\u0010\u000f\u0003Z8iܺu\u0016eeZN9ۣB'Z8c\u0016v&>&/w-[v:\u0002z\u001cBxN\u0000^\u0013\u0016\u0010j6u/ez!\u0001|\u0015\u00008{ps\u0002\u0000^j6\u0000>\u0001<R\u0000g\"\u0013}\u0012l\u0017J9']4\u0005S&SzCAIW]5XKWn\u0014&\u00191\u0006XMñ-7>}v\u0002\b2eBhZ\u0010\u0007@ȼ\u0007A' |T@Ѝ\" \u0018z\u0004~\u0006\u0004؋\u0000lh\u001b~P\u001a\u001eȬXNResmRv\u0017s\u0001ޱ\u0005X0y04$GJI6>D[7#\u000e\tڵ\u0001!\u0006:ҡKPx8k\b\r\bOd\u000f\u0001(3AV\u0001qO\u0001q^\u0001\u0013\u0014@y\u001d\u0010\"\u001d3-9\u0004Je\u0011F\u0001Ss<j\u0011)>\u000b\u001d\u001fa\u001e\n\b?[ۮ\t?\u000eY\u0004Ga\u0004Hnb\u0000\u00019W\u001d@\u0013\u0003\u0007\u0000$9C;$ \u0006 G\u0013\t`\u0000Yi\u000f\u00019D\u0000\u0019y3&!x\u00190ϯ@P/g\u0018걵Av^+\bOA-7û'Xqr\u000f\u0010\u0007Y\u0007d$;\u0000dN\u001f\u0003\u0002r3\u0001E\u0016%\u001bP\u0019P\u0007W\r\u0017O\nΉ\u001c}\u0017P\u0002x\u00005jJ\u00182*\u0018Pg\u001e]ޢ\u001az\u0018Ә\u0017fg\u000eLw\u000eQ\u0016y\\\u00056\u0016Õ\u0001'\u0011\u0015T|\u0013Wt\u0004Q\u0001\u0003\u0002LL\u0011\u0001õ\u0012\u0010\u0015`!=7#\u001bћv\u0006Fw\u000eI\u0002:7Q\u0014Zy/^(Y_M\u001a\u0019̉Ab2_cz!1\u0019\u001dW\u00032\u0003ҷq?5H@\u0016\u0001;]qSsVW\u0017fp+Ä5`Q\u00060\n-ç4J\u0007IR\u001eX<fZ9xuEp\u0012R}:4\u0012W\u0018\u0019j,I\u0001\u0000^O\u0001_M\u0001_\u001cF>1E\u0006\u00174\u0000z\"b]æ\u0007YR\u0013<}d0G\u0015\u0005M#\u000e\u00020\u0010\u001d\u0014z<&n\u001c$}j\u0017Iy\u000fī\u0010쁸>ܳ@L\u0014@1\u0010\u0007\u0010w\u0002\b\u0005a\t?`\u0011r$*\u000fR1\u0001#/ZO\u000bl\u000e\u001dJ_:4\n\u00188\u0007g7\u0017Je+\u0017:\u0000J\u0002h\u0015-\u0006\nv\u0001yڲˑ@fU =4\u001bHSNg_\u001aW?\u0002uJi\"Y8`;\u0011#oZ/\u0012\u0011\u001d@W`']~yi{˽({`.\u0012WuE՛\rz \u0016iAb\u0002\u0010\u001aP߫\u0011P\u0013K(?!A\u001fޤJLj5ےaH\u001f:l*!1\u001c\u0006ALPZwiHa-{V.\u0012WP.n2a/Ap@vU@|o8ufx-\u001dsHˤ\u0012}ˬF1!_\u00029,\u0016ҡ܋\u0004j=\u0017%I \nm((5Hv{~\u0017w8d\u0015{n\u0003\rH\u001d2\u0018Hc%\u0007\u0014#OW\f\u000eWi\u001ccM\u0005.y\u0015;\u0003Pċn)\u0006r'_(\u001cF/-V}r\u0005\u000e>^8=ư~\u001cZ\u001aCe\u0002ϦמՔqw.~\u000e\u001bڬGKUZ\u001eM\u001eQ<]R`u\u001bO\u001e%wz:Bw-\u001eS&A^[_\u00053<vN,>*\u0007oc4\u0004.\u001cg~vBOj\u000b\u0007wg\u0016~pp7Hnn煃7U\u000e\u000f6\u001a54HӏTcVۜ8Niݱ0%\u0016 S܋\u0001f\n]3\u001b1LI3*)\u000b\u0016\u0018/ӋJ\rzR*:A5\u001aT\u001c%xk=[ocuXG;md8/7\"ҥe\u000ek\u0007;qK56\r\u0013,N\u0000\u00168Ni.t\u0010V*vԍ5W\to?ح6٥a'm\u0018i,:}9Tj\"E>k社^Zp=ʟ^`ކx֩Wd[\u0003Anp\u0012?^?+tɵBO\u0015\u001ag{a!Y\u0002\u0018\u001e-\u0005cwݏ&ׇb\u0017\u001c8Ga}\u0001]{\u001cC1\u0016\u0005vq8Sb'4\bz\u0011c3zX\fkU\u001aǠnu7\\U,k}\rȰ)xXfk4_VV)vUɬ\u001aԸk$+;ZzxLM`Vʢ\fZ+BfְDkqUw;ĂquG\ra\u0007\u0002.\u001c\t r+'\u001f^]\u001aMNt\u0018\u0003}_\u001e\u001euh]\u000fb-Wsբ|g7^˟]PZB*??B\u0006+\bSn\u001eH\u000b3\u0015(io\u0011(/ga<;\u001a\u001b5'{/[+8[>NV\u0016\u000e\u001b\u0016t2\u0003Emg\u0003\u0019N~\twT\u0006O\u001f7௎>\tw[\u001f\fm\u001f\u0002 ׶_\u001dOl}\u0007ϛ[Ұ\u000b߻?/)/nr4?G%\rmhǒϣ%\u000b剺/mz4?RSk[_׵\u0002\u0013\u0017?8\u001aHn~*ޟ\u0007j\fTe|M\u001a\u000fK.tr#Naco3<D=++\u0001ԒlW\u0003S|41\u001fbJzl\u001a@T_E %\u0002HA\u0003eƯ\u0002sxP|a}b;`\u0013ܗTlu1u0Mf\u0013~k\u0013w\u0011g\u0003y\u001e\u0006)=\u00057\u0011k^as\u001e~b޾Vq.8tR2#\u0019\u0003\u001dz1w4\u0000w\u001b6\u0017[ߨ \u0014o^x~kC4]$vZdƳ,~M\u0019B\b33p:޻)vgf*\rW\u0017h-\u0003}\u0007i8\u000bQXko8D~k\u0011{s#6&<\u000ekAS?߇n\u001bXP3\u001b\u0000f\rW(\u0003E/O,oYX0h\\`\u0012jfNkP.@\u0019No3\u0013bM13Ceۋ]\"\u0011n U\u0015R]\u00062\u0004Jw[|\u001aqlMN\u0015Xۇ-̗3y\u0006lR*\u000fZS7o\u001d\f\u0017\u0000n\u001ftt?\u001d\u0002<\u0013\u0015\u001aC\u0011=B'fz`t=nQhN\u0001:\u000f:m~M6Q^Kz\u0013B[\u0000w\u001bW\bV\u000e~\\\u0005a^\fgg/\u001c%lGDcZ\u001cSs޴b]:M\\2\rѵ\u0001>!\b?y;F\u0015xbkGe\u0007e\u0000k-tGb\u0003Zi^dW\u0012㥣ʹY<lV\u0018R\r~몑\u000bQl\b}\u0007;{=\u0006rsrk1?\u001fK[l{^Z,۫)CW\u001ds\u0014JhR\u000foHȂпJ(|\u001anV\u0006\fLHuq\u001eVt\u0012ow䎽M\t̨1\u001b~\fe.gm\rR|կ_{̯Au&W<\u0004?\f;\u001c_cn\\bt\u0012*uR2q\tS\u000f=z\u0016[=I<w\u000e&\u001bV5[eэ+\u001aNqϟ\blÛ3m=ߘEZR˥B\u001ac~\u0007\u0001i\u001d]cP weTߥ]\u0019ԡR\u001c\u000fqz,t7 \u0014\b\u0019q=T+,e۠٧\u0012G\u001dlj&\\,]ꠖ\tnM\fR;6]*5NWsAؿ8W-b:ȹeZ\u001a\u0001Y\u001fz&?M2iܺ\u0016U3Re\u0005\u001aȗ\\⏻jŎ\u0014΃ek>\u000b\u0013a\bt;\u0017\u0017b\u0007R2\u0004& IU@\u0014׽6k1;[;]N%]횽\u001amif*\be\u0010%8L\u001fsy5\u0010W'\u000fS\u0007G#T\u0006P\u001f))\u0002pIC1׶oG[u3|k[\u001d))/n}\u0013u_?\u000bݒ3_\u0013*|k[\u001fD]\u000fvTR_u4I8αH\u0002΁ѣ4޹W\u0012\u0011a~MeGܮum3\u001d{9<gkuW{vK\u0003x*\u0007=\u0010i\u001b)\n\u0017ȃB\u001b3\u0018w(.>`csAcM#aqd.sO?gw1y$??\u0003\nX\u0019Q\u0015aIW-nv -PNn5.,w^ߜF#$k\nܕ9fNKYηom\nMNƖK?BfwHuV\u0007ҡ\u0007UT7G\u0012~,lG7\u0007Ә\u0015nϻul&n<7x-\t#A\u001a\b1{\u0016&\u001a7+\u001cRo@zL\u00054zOyOC؎o~qO\u001cs-}j\u0002f^ZOd\u0017Ad\u0016;qy\r\u000bB(\u0006\u0006؝\u0015Q=\\8_\u000bl@\u0015ϗW\u001a߄Zp:f4\u000bD}\\ifvy%q>}=\u000e\u001cvԻ\u001f믳\u001fPR7 %\u001aۋvu&n^O&=bM\u001c~9fv#\u000f+y\u001ecN'u(\u000e\u0001\u001f]zbpFЙ5\u001fy;x?@zl6\u0013\b}7L.\bu=P\u001bI3Ĭ(Rz\u0007M}ɼ\u001cnԹ,PB\u0010oT\u0013GHu\u0000 \r9xI's4z\n\u0011gmq\f21ސ\u001d>jV;UjY]j8xZ?\u000fC\u000e?Q\u0001|qW(V\u0007Ur\u0004v0qU'kig;\u001a%\u000b,2\u0017ʼ|(dZfw\u0014,Sӹ[h>F?\u0018\u0002q)\u0013\u0001K-F_ƹ(_\u0011MҚ\u000b!u$~w;χA[y#7iwE\b!\f\u001bњĪÕ\u001b\u0010\u001cVx<\u0015\u001b\u0006r$\u0005oI\u0015=-RέrOgoǪ'\u000f\u0018.9iRWy\\،>pWaz}2F^\u000b\u0003Iu%㫣\u0006&T%W9\u0006P+zRFt\u001a>^y3vx]㛫[vY5D0^oJ%qv~[hnC0TdMWdeTy.4P\b\\O\u00029=\u000es/۷~\u001b%nw5vruP|bboL\u000eͽ\u001brjC\u000b)\u0006`\u001e)c*w!<\u0000$*t?\u001a~^7ڢ҄эmWk˔03>7\u0012J\n'\u000f\u0013S@;FE7z1~W\u0001\u001fT./Oi]\u0010~\u0012]Z>J\u000f[T3╙,t0q\r?Qsj\u000e&}>کMQlr\u000fJ-\u0007\be}\u001fA W\u00105OO=.Vr~+\n\u0019'Ƨ\u0011omXjn#ֱ\u0011?VT\u0005R)k|U=Jl#\b.ս\u001cyu>y[K\u0010Zy|SnJgOfZ\bҼ-\u0016U,ٴ*$+B\u0010N\f\u0001R#}\u0017\u000f\u0003Plk瀗yw4D4]\u0003,\u0006CuG~z'dkܺ\u001ff|\u0015[\u0015*mMh=)5E\u0017sX(IQ>]\u0016\u0010/I?\u001b`}]O|\u0019s롺j[3ɇbI\\cZD?8H+\u0014΃DzJ\"(0Z\u0014r\u0019&9!J\u001d\b\u001f\u000bT\t\u0004=s\u0007}D yi c+KIJ^xVrrtRJtvq]]&\f6\u000ffY[p[\u001f;Gx\u001b\u000fR\u001b<C]G\rG\rϣ٭x3_'IXR_y4\u0011\nk[\u001fD]?\u0002?RR_r4\u0011Т3[{Uc\u0006'3D \u0019\u001a\u000ej[?\u0005<HƝ;oMg\"i\u0017ʴ\u0019eʽV<3h!u9\u0017\u000fE6W\b\u0000oTr \ff\rkZ\u00021\u00040}Jƫ:\u0007/\u001d\n\u001cûϟ\u001eGZlO^Mi-ov\r2\bE\u0013l\fR\u001d$a۶\u0011\u001fHc&y \bZ\u000b}K˓\u0018-\u000f\fٖJ_eq\tVVڇ<AN/)\u0011#\b$\u00199\u0005npd,J9^\u000e-d\u001dr'nvJL[YYi\u0019(\n9?$Z7\rp7\u0001$h0Î~$\u0006\u0006p^\u0005JF̶#ɵ5\u0018ov6\u001f~F:8}BxͫpA3~eQn]\"G\u0000D] *y w \\?Vl&?ȸU/Um\ranq:qT˥?l\u00192[N1'tg\u0019A5k?TT#g[gPCjbVe^\u0013\u000en \u000f5o3>Wszdԝ<Ӈ0\u0010%y\u001el\u001dϗK\b߀p~]\u0005bT\t\u0000ϥ8:6e^Ŷ\\U.nzآ:֩Jq\u001aa\u0017&Z=\u0006^\u000e\rx\u000b׫[/\u0004`ߔ\u0018Z\\+T\u000ev\u0000\u001b^ZbYܨ>(>@\u0016LV4\u0017\u0000in<ClbF~WՍK\u0004\u0017\b~Z?K\u0002P%KW6BYV*\u000b4e2o%M\\C?In[~nۭ7(:t6BR!U\u001e\u0001[S\u0015^/^rknTys4'\u0016&5m$Ӕ\u0017](5wrL(40d̋ZU\u0016q\u001fm~\u0004ƿ|,txT<\u0016E6[\t9\u0002   \u0004#APJ[}f3_nzz\u0015fSz%=\u0018]'iܘF\u001dUY\u0015?+Ș6ϱ\u000b[j:5{t\u001awr1*t'\u0014>S3dcgRgTko.?|AS8ntPҠ[\u000bԻiՒn\u0018\u0011r/YKʈFK\u001biU-)4\u00187d:\ftZ\r\u001b\u0013\fd3-f&G+z|B(\u0001J\u0005y\u0010\u00153\rP6AOp]\u001f1;\u0000#t4]N-N+Ь%ƽe\u001e4\u0016xPԳ8ed4)\u0014Ҹ#U_u\u0018&\u000ebw؆\u0019\u001cK1\u000bT*(/P2{5:[8\u0017∵;ۛ?Z;\u0013\u0013Ʊîl\u001eGL37~XdF.G\u0005TS)'\"P?(\"s`\u0007m\u001e>_G|<s̹V4,\u001d\u00191=3\u0011T{B|e@\u0019wI.Lj\u0004)&\tݘ%D}H+j~\u0001Ͳ\u00037&E\u001a\u001d\u0012$&-\\ӑf+g]\u000ex(̳[ڌMdU:.˭\u0017zB.6f\u0019c0g߄G/$qB<Ǳ\tNa\u001f\t(^ӆ{\u0003sM\u0016a1f#\u001aH;5\t;\u0019\tźf;V\u0011\u0004\u000e\u000bL1Y^\u000fWa\u0007\b<\u00003%x\u001cDF$\u0006,g1:g]?fs\u0017\u0014Y!`\u00106Z=\u0017.ٕ\n+MXE/Vf5@9M}q\u0003\t͊߉L\u0016p!wJ4\u0015mM\u001eQbVhFk1\\UMdZ'\tL얮M@|Z'F\u001c\u0014p$Ə\u0019*\u0015/\u0018\u001bkXst\u0005;VO\u0004\u0003yI\u000e\u000eY9\u000fU\u000bc\u000f\u0010\u001b\u0013sw\u001bGѺqtA͙P(2R8mVDT\u0013q8r+GG_d\u000eX\u00183F,8:\b\u0002Kx\r}~$\u000eRnMN,,\u0018\f\u0014\u000eK<&\f,\u0014*402mGF`6\u001aLɡ'gUg\u00186|9\u0010\u0007S\u001e\\'\u0012:\u001bFNW:r\u0017\u00071nlUYRD\"gw\u0018]fQ՟Uy\u000e\u0002i\u0011\u001be\u001fg\u0019(|/a<rBo<u'\u0002\u0010\u0003DU:\u00009t\\\u0013n\f(1(cv\u0010\rZ\u000faDM=;fE䮎\b\u0017\\ޞ;sY>-娌c-K\u0005J\u0017܇~.J\u0014\u001d\u0005/pj1\u00178#S/pFߘ\u0005?Q<m\u000f\u000bq1)_nza88Uι~/>c\bT?\u000bJa\u0002Jt\u00008\u0001μ\u0013<Q'\u0011P:[\u001b2 \u00138\u001dSlM0d𡣗P|HvU\u0001hE\u0000r %G\u0003]v<\u0007;\u0003.}\u000b>\u0013\u0019y\u0010l]g%zeӗ\u0012e&#lۛA`v9@\u000fK\u001bSQbUTP\u001d?v\u0001ҠXmATG@)A?:2CsHgYm\"޸ksxM>₼3\u0013Ur\u0015:Ԛ\u001a\\/X䜫+S\u0000Z_1\\\u000e:|\u0015Q\u0007\b\u0004A7ʣ!{E'y\u0017U\u001e\u0011\u0016F\u000fS5\u0001[c:{0L>Ieo/-\u0013\u0002S_7T4n\u0000:!rz\u0001\u0018\u0005as=딞w&3GеU\u0014<z<fW\u0007%]uK_ mm\u0019\u000fUvbdoIın\u001bu6>.`\u001fJК\u0004\u0003*\u0003*UxbS?yl8\\h\u001e\u0004e\u001aLnp<M\u001dZ.k\u001eZ:c/b*\u001b\u0015\u0006=J\u0002Ё~\u0017Ф7نP\u0004Sv\u0013\u001brޤ`zcvX8+\\h9epRtRnӒg\u001e㆟7al*+LIԨj~T#Z ꎇ&}\u001e /C'7\u001f'`7xosf|~4٘ҶOzG]ԃeA\u0014*5U΢\u001f[nV\u0006_(\u001a]CcrН6mP.ʠOVsM\u0011 Q\u0000`u2c~\b\u000ej_wnsj-I\u0014NP\"%skFcK\u0003YrZM\u0001T+®\u001aBjyu@T@rNJ\u0004:xI}@%\\vˑn^oYQH)F|&'J\u001blI\u0012G\u001d\tui;\r*q\u001fI\u0014R~\u0017 P3Dŀ\u000bSP\u0005Ǉ\rr?z\u000fz,,W:]1t(C+\u001a򅺈!\bne^zɍ2Bb\u0002Ժ\u0005\u000f)wԊ3T҃c)_\u0003mbl\u001f{^0\u001a+޼\u001c`9\"29l뢨L\u0007g)~\u000fUMgYx{ެ\u0017\u001au99V\u00003`/\u001d&pҏBNY\u000f^bh3VV熂Y+\u0015Vj7yVy\u0011\\K!Cf\u0019\\H,`g\u0016鉝\u0006Fz\u0015yf۟J\u0014\u001duۢ\b}\u0007l\u000f9[$\u0015OO;Gk\u001c\u0018]{:%hg]\u0003b\u001eqW3L3\u0019ڂ+I\u0019V3abS\u0014ʗԉ\u0000N-\u0011\u000e'*\bRfiﴖΎ)\tcBib.\rֆ\"ݬWbk~0l^u\u001b\u0013gL6ɦ;r\u001a't\u0019EnǏ\u0003M\u0001LZ\u001da?݀l<Dv7\u000ey\u0017)<^d^peA#F\u0015ZOmsVY(2[IA_DsR=J_'\u0001\tpAT J\u001d\u0006ɣ8+q\u001dZz\u0016\u0006/A\u0019U5;R[\u0005Gٻ~*ъ?S(\u0013uF\f|\u000e\u0005 މ^\u0012W0Kad-/,\u0000\u0014ˠ8ճ?[$\u000eޑ\u0016m}mp2LfU&gv}fnڳČJ~D\fcbb8A\u0012ؤNGT]\u0018^}.pfBxPG\u001fG\u001a[vtyS\u0012Yr{nF|U\u000bZ\u0005bC?\\<$E8\u0015J\u0006+.MAr4\u001ff3ë*|AA1(2\u001a(@eG\u001auA/mZY\u0018٥K1NW~#AG=z\u001aBZ>V\u000f<'!\bhq$v\u0002Y\u0003\u00073ni\u001aR\u000eb%\tFc=YUM[LցZ.Ic\u001cM\u001fL\u001c\u001e+p6>=줵|\f\u0005Ǩ|Й{DF\u0002Jʳ\u0013\f{iý M-tzWz.\u0005N,:eF\u0016[\u000bP\u000e=Dx\u001cPWqڠvDnT3.\u0015``\u000bq\u001cىyԮ\u0005\u0007os\u0012=\u001fK<9ɱx\u001f]{\u0010Rf9{XTM(C\nu#u\u001a`\u0017FƱD\f,F`Dn\r?\\udq\u0000{y \u000eduЉ)\u0002X\tn+ꮴ\u001d)F\u001e\u0003R0k8Db\u001dYW\u0013Wo\u000f`\u0011A Y@+N\\poؗ[O[\u0012=|N~o!.k]T2Fx(Dz7_/d;m8} ]|2\\E4Z=e<z,%Ͷn@w(cxgR\u0004_\u0012X7\u0000):qP3%P\u0006\u0000\u0011eR\u001et]8պбo\u0000q+{}i{2CL;\u0013To(J\u0004\u0015%ѮBx{^ך__r~\u0010\u000b\u0005NX?FipF]m\u000f\u000b\u000b]\u001f\u0014V/;jAmBT\u0001QWw\u0000dz:'\u0001:7\u001f7ly_\u001duɷ\u0010F\\cu+i4k:h\u0017~FIg@SaV\n?~]\u0000zDyhR{2\u0002h\r@Q*4@ް. 9\u0017P\u001c2!S\u0000\u0004}x]\u0012)0n_k\u001cO\u000biM;9\u001ew\u001b&4pclG\u0012E\u0007\u0000\u0004%\u0000.\u0010u5\u000fP\f-P*c]FmPt\u0006HXYd>éGcoܭ\t\"j\t`\u001bcB\u0016.o~\u001d}*g}]\u0000\u001bԬ\u0000-aСwM݄r\fQ$tXE\u000eJĦ\"\u000fܝ<\u001cfO֫oi|o#/2jUӘى^j*^\u001c\")\\iũ\u0002E\u0012T&]\u001c\tZ7ȹ=@N|>.\u0005o\tY}6\u0003ҏ\r9]\u001e[n=q$\u001d\u001b3M\u001b(i:M\u001ez\t::j[=\u0004UeJ\u0012ո?(:}GmwIU/JA\u0015:/PZ]Pn\u0010\u0012\u0014\u0011꣓O\u0013^\u001esR>2R\u000fcЙEzy5\u000fCIܻD!'\u0004.nX\u0019\u0017~]\u0000'#\u00179 @1RA)\u0005ޠt>\u0015ׂ>[ӯ\u0005tr~c\u0006Txi\u0007\u001eOkI0f)XzڰR\u0015W\f'V.QQ\u0005\u000etי\u0003@9~B\u000fc3ࢅb{B\u001aSjmMt;\u001eVVhY\u000b,[^)c[Av溣\u0013kA+!_KA1ls?H\u000eu\rJ\u001cyr\u0000ʯ\u0012ևW*\bXOq\\S\nNGkǕ6\u001f, #z\u001cM=)b!\u00156ʬ\u0015|\\L\u0000mu.\u0007G\u0010uV\u001eJ%PD\n\u0006PfIz(I͖R//qrh{V\u0016'\u0012/FHl:\u0015W\u001d+Xh/P\tha5 %@y\u0019EY\u0005q.s42N*}\bHaW\\>1j[;k\u0017(o0\u001bܱ.o>Z.2\u000bD\t,è\u0006ҚVS8:(L\n\tI}u7ڛS\u0019Ogf9fZ\u001fL\\՞l]\\ nw=\u0016\u001d76\u00000KVF8\u0015ht0\u0011_ܑ387Ʒ`&-\u0005Ny-oƎ%tA\u0006\\B.]ib\u000fp\u0001\u000b\u001a\u0018_X `\b\u00037m_\"V,>1\u001fa\u0000a\u0017`kp&)P*MP\u001eiP*ĳ={_.׮}.1JxEZFz96gp\r\u001e>^\u0003~&\u0003k#];c\nCp28GsE\u0002\u00066SP\u001c\u00052ȆuK\"\u0002,Ii\u000b|\\=gtmHsNOrkծ8(9U~ҡ-\u0012 :\u0007\"l\u0016ű\"Nk5?_\u0017Ф\u0015\u0017p,ŎpfB3F~@m\\&\u001e^X:\u0016f?[\u000b3on-BtfM[$wPI7\u000f/|R\u0014\u0016d3\u0015I(K%?\u0015\u0016\fT\u0007͋\u001dy\u000el'\u0017${e>Qޙt\u001697e5[𪒐ԢF\u001agUfԵ_Ck*\u001dŻq>`z\f\u0011r%D\n$\u0003\u00027O\u0019\u001c}R,\u001dצNޙAL\u0016K\u001aCmwKV*n\u0006f\u0013byI\u0016vK냕\"^v\u0006W\t>G\u0016\u0019Gd1tMV~]\u0000:p'9P\\n>~_m:bg~MR=}3;o%\u0011'g*Ol&&\u0013cjŉ\u0011IFv.;aI(5n'BC?(\u0000\u0013X\u0019v@9f\u001e5\u001d\u001ens=\u001b\u001f{cGi3qI\u001c_|m&\u0019ߌvs+ȃYY\u0001\u0004c\u0014zG+1:M[3\u0003.]>\"L#\u000f\u000f\u000bNMO{z2\u00073p&WR\u0017%qn[\u0013r0k\u0017T՟9}\u00126wHt0,\u001aNU\u001f#\u0003#]\u0000\n\u0002(2][\u001fR~FYh*,\u001d\u0011}zTw}a#U9\"icF61֔mb\\|(\u0018\u0015Z;Qyņ5r\u001e\u0014:#o\u001f#QRP\u0017\u0005<V-3\u0019jjT)3M*\"\tʵoNѺ\u0003|\u0018.=D%2`qш\\+cHda<=ZvdrsX?߃u\u001aO\u0016%_\u0012)7<u[%3FMT\n}.0FUT\u0006Do68;Ŧ8r\u0018]#jph\u00068\u0019@v\"}Љ;N?T\u001f\u001aUjzqLv=}\u001af9\f\u0004i~!wѦ\u0001Qlr\"&9ԃl\u0018Vr\u0011\u0016!V\u0006⭁ S|\u0004kȎ\u0012^\n{\u001b]7ʷ6?(\u0019.)nL#\u0002nr\u0012\t:bkDٳ\u0010Hx>l(B\u0017᪥\u0006bOWr{\u001f'r;~Q.%dWr.\"nZ*u\f]L*nc$0h/ـ_<\u001cUқBG{<hf\u0019^Tn,:trj\u001fYMlS5Cn#u\u0011.zn]L(U\n\u0013vM[J. @⪠ S\u0003@7@\u000e\u0001DϞ>Na\u0002\u0005Z\u000eJ#,X)/v]Jԗ;a,zsHds+\"9ܭJm_B\u0002gOQ\u0019\u0019ퟢ~'F%/p~_mtu8./\"CN[vh3,\u0001J]bqM\u0000Y\u0012൫OƹQ}%~@{J_z*xkqtsoܴ&~\u000b|wsя|_\u0015P p\u0002qi{\u0003t\u000345\u0000I_\u0003l\u0015q ,\t/'\u001f(#s\u000b{m\u0018\u001eF\u0010M-:v+:,\u0018pG\u0016FMÊ_(\r(,\u0000\u0014B\u001aʣ\u0001=p\u0001=\u0005)\u0014(N*#P3\u0012(\u001e=#OHv/\u0012J\u0007I;Ӑ\u0013^rTͅ_5\tӶy}p}OD=T\u0004\u0014\u0003v\u00019\u0003\nl\t[=MCk?SggPL\u0005B\u0003P,d+O\u000f}iN<.oW&X]kD'H_w7?zc\u0006w3;\u000eq\u001a\tv#oZ\u001bը`÷Yz3(.,(1({PtaX\u0011@#?֦?\"לw\u001b]tzL\u0010n̆Amc;6;-e\n_\u0015X\n\n:\rQ=D\rm6p\u0016\u0014s\u000b(ک<(-(Q\u001a=7P{=|]/\u0005C\u001bcmu`uR%\u0001q߫,53㦁Ka^mgw+^E(\u0017'R@ْ]!+O\u001cZu j02\u0014}\u0005aOU=r'['\u0010juLmY(/:6\u001dvjA\"\u001b(\u0018PrfmXN].Q\u001fK~$p[=2\u0000iS\u00109\rp\f\u0005D&Jf#ʊ/{oc\"r׎e\b\u0002e,-}\u001an6>ʫݡme\u001d`fSVbsQ]76KYo~G],o+P76(\u0010QB.:>:g}?$ge\"ME\u001ct^\u00139AF6LzNs!\u0015*$v'\bX>B\u0018,~I@)pT]!\u0000:CΧy>yX+\u0018/omvv\t3w\u0010:`~SÝQF\u0013ۊOD!|כ{\u000b\u0003R\u0013\u0006e1C,lI\u000f\u0017*BnO.(f]\u0001\u000bq\f\u0016M?c:xsQ>S8ɆmէmU{MuQoװ\u000e\u001e&\f\n\u00114OԚ=\u0017\u0005{\u001e\"Q|8?]@w\u0000{}8\"1/ʖ-JV[>2#\u0017\u00198K$^qͼ\u0004R^\u0015\u001ahŸܛzk-JÈ\u001e\u0011\u0010\u0019[Ţ\u0000\u001a9ڇ\u0019\u0004 )%Y\b\u0007p,\u0015 \u001aÆ^\u0004;y\u0012Tc-\u001bm\u000f9TɨͲtn6\"[nU\u001dVWd->S\u000e\f^\u001ctFO\u0004Vӿ}G=rp\tMCT}Æ/מ\u0004\u0002\u0001f@\\É]ᰙ?},JW\u0012\u0011\u001bE]NZy\u0011r~,*템ObaFiKGd}6\u001f\u0006/\t@\u00063~,-\n'\u0005\u0002dya\u0017wc?8ym9iV{xV\u000e5rg\u0005HM+,\u0015Ae\rjQ{3=9RMYjf_\u0012\u0000 d\u001eNO\u0011\u001cKp/RJkPnN<ʮa\u001e\u0017\u0013b#g\u001fݤT.?M\u0004]z:{&\u00172t1['KI\u0017<Iy'JvS;j\u001b-a$@iAټ<\u001f[\"YO$p|kctC\u001bq׮K6\n\u001b_YztX9qff蜛H6;xs\u0019,0\u0002]f_x\u001dĩ_\u0012`6\\w X\u001dVC\t99xZTpզw덯\u0013Yg}{|\u000b!\u0014\f\u0014rՙ\u0013ү5'3{Vd[IeǛ\u000b\u0012)YN+-<|)2$\u0000{\u0000NO,\n\u00046|S}lqs/nr\u0013r:f8c\u001eld\u0019:\"6<|x8Y9\u001e\u00022\u0010祲ֹ\u00151~kmw4Bb4s\u000e8%\u000e\u0004.M\t-q2(a\u0019dVhϷf<\\vga4l])\u0016k#{,\u000b\u0002Q%9+9ܰ<Y\u0007\fjl4/\t@|4\u0006;(R\u0003\u0018G=O\u0010mnX\u0014OʵM®ht9:?\u0011Q8Qkn*G&Yk\u0014/SO8d8>Ɖ쉓7\n}lT\"b\u0001\u0007վ_\u0017z\u001a\u0002f\u001c6\t6=\u0004ƧCM.]z\u001bsy2\u0004O||2?zӌd@m28\u0004a\u0015=<>\u0007\u0018ZۂQ9EĆw-9X~/t v\u0003\u001bb(\u00055;8Y\u0007jtTvNM\u000e*\u0006+;C4ذ\u001f0av:_܌zI3ԱjttB\u00172'|=\\y0У[y*A8@r3VB\u0016R%\u0001\u0003bxPn<v\u0019Z\u0016ɫh\u0001M\u0013`4+\u0011_)Mہ'\u0001;\u0019ȝ+\u001ceX\u0005\u0011\u0000\u0013yp A[u@\u001b\u0012}$2o7-{\u001d\u00168<b3Ba.7Nh\u001d0s5\rM*}-\u0018u!:-\u0001?R\f\u001aZ\u001d\rZa\u0003ƃ@\u001ePN|XK8#\u0006\f=|UTMh9\u001bʜJ\n)g2D>p6\u001df>V؅\u001elFU\r\u001ba2\u0010{?Aj$zo)$Y%x\u0014jԬ%enXTgRq$\reZlv'/б{k_e:oDx\u001aNH\u000e\\\u0015?N_\u0011[[v\u0007b\u000f\u0019Ĥ7ʼ.Qn:{9i}sW6e{6\u0011kB:ݴ%\u0011]TG \u0012\u0004B9k*VqZXz\f{kD3IAT\u0014l]VfUz9՗9nxӴ\u001a^\u0017fY\u0003E\u0002llF4~I3?_@.8=@3 2;0\u0011TO\u0000)_wByPh,M!G3Z>\u00134A|c!P炥Mh2e\n^Y\nT&:p6\u0007T)6\r$\u00178?\u001e?D\u0002'\u001f~\u0013VQ\u0019\u0019m\u000fg3T\f+<ĳ =z )\u001cD/\u0000C]wۃo]`)\u0002;\u0002r~\u0016@`ϒ4\"\u001f}y\u0011\u0007\u0006uuhS^qpt2J۶u^=;?I\u0007\u001f\u0001\r5,fAC\u0017 {,qk\u0003Q\u0003\u0000a\r@\r\u00144Fs\u00105\u000eGD\t(\u0007=㷇s%Z*{o\u0016.|^ms]t\u0004ao퉹U\u0001ytk\u0011hK\u0000\t,\u001b#\u0012\u0005h\u001aC\u0004e\u0005H\u000bRY)HX Ē\u0013Sa{R`!{\u0013\\Unv:lO7C\u0018+\u001319$Pů\n\u0010x\u000e:-|E\u0006\u000b\u0004P\u0005\\XQD՟-\u001fHXJ\"o\u0013M\u001eXBd9F](ۅ <\u000e\u001a\u0015tE/Fs9G\u0012e\r;(\u0006ǈ' \u0000)\u0018@\u0013\u000b{t\\\u0006|\u0002}z\u0000\u000b\u0014\u001ectьrsU=?.\ris9}⪵n\u0003kOt?\u000e^NV}\u0010\u0001~U@޺@@O:G>F\r\u0002\u001at-\u0003\u001b\u0004HȎ\u0017ؗͧc)\u0005_Z:D\u001c E'CQiTvݦhZ*_qs+k<Bى6\u0010ϰ;_\u0015@R\u0010\u0014z'\u0014~vt\u0000\u0003*\u0004EX\u0007~\u0019.k\u0007!a4ndN,x\u001ch;!܃.[\tɣ\u0013+\ffnp%z\tK앝 w\u001c5c:D,\u0001y\u0001CnA\u0011\u000e\u0004\tPrIn=\u001bs\fzZ\u0013\u0005`OO;е;gM/\u0015CT\u000e\u0002y\t9ė\u001b[MO* 9/\u000fP{^g.F\t\u0000R\nm?G97\u0004?$qU:)\u0001ZrxUHCs\u001eO;ByѫK\u001bv0d\u001a_\u001fe4;,I~U*׷4yt؞bBkf>ǝ=\r\u001aܞܧ\u0019% y˜\u000b}YƖ̡\u001bo_5tX\fRoL\u0014\u001e\\6\\\u001f\u0010\u0013\u0012\u001eCȿ\u0016X7p$e\u001c?^\\iG\u0019(nzI@>\u001erSÝǷ\u0012KJ\u001ag+=\u0006~&\\HǢ0C\u0012\u001e\n1qmƏԔf1g\u0006UI;'ZR\u0019۫\b,\u001e:q}t}\r\u0017K\u0000ҏ\u001d-nRr7T1Kֽ\u001a^ȽY\u0018Δ_2\u0013(6\t(D\\ PCz\u0014W,(U6\u0011T\r\u0006fMLl=cw4\u000bh\u000e\u0003~IL\t}o^\\x\u001b\n\u0015(N\u00190<\u000bF^\u001e3\u0004\f?c_aQ}hճX\u0003Ŋ\u0000Vt^g}|\nc]\u001cBMLB%\u0017e;{\u001e}`\u0018\"ԒW\"ߓiة\n>:\u000b5.zXH)\u0019r\u001a}U$Zv!\rиV\u0007ű\u001f^\u0002e\u001evZwvX8lUwu4\u0019׿ir(nx_\u000e\u001aK|\u0015\u001eX֜Al\"\"de[\b)*\u0010`<qÏDn~*\u0010\u0015Ab\u0000M8\f\u001c\u0019+t8\nvSãr\u001cSN麯Oj*\u0019;Ѽ\ta\u0016X[/`j9F񉙹kd'W\u00163`\u0002El\fF_Ϯ9\u001f\u0012\u0000\u0010YY~*\u001b\u0015]J<\u001cnNṚmp=h~\u0014YUM0Ia.و\u0013mIeV\u0019}U@aف\u00039-\u0005;(Ƃ̞\u001ePzy-\u0017yҶp\u0010,\f!%Hjf+r\u0015\u001f06ko.E/3ere<Rϱ\u000f\u0012\u0011m4)b\u001b>\t\"GK\fǒ?\t\\BnT\u0012%\u000bJ{\u000b9N:ywVjًÀvJڄ\"$Ccyq\u001a}SHȅAYu֜2\u0014vc\u0000\u0000߯\u0013\t&\nX66lӓ\b?54?E|U`\u0013޷\u000fcjp\tlQ<]Եe&LW\u001eWtc\u0003e{S\u001eH1\u0015\b%`\u0010\u0011\u001f^b\u0017\u0019փpOṍ;*\u0000\u001dYPj>#WaOOɲ\u0019K\u000e\u001d(d/j\u000e.\u0015RF빕nm\u000bߑ\u001b\bZ0_G1,뿊cٿ\u0013O\u0012~P\u0011\u0014E\u001f\u00143!\u0002ʱ.\u0016Hlz벽!,z\u001f4ӊCM7\u0019[\\83IiEf\u0012\u001c5\"\u001d'x0pg\u0006#YX\u00176Xo\u001b^/cl*\u0000\u0011.\u000fP|Б\u0004쒌3%F]=f~сl\tqc\u000b\n&T.vl>SpՙO\u00058[֔Ʃ$ᦅ9]wG̴\u0010\u000e9<\u0018\bK:UwfO^*\u0000pjg:uM\u000fX*\u001dH[U\\E}ތCZXvDU$\u0010#r(\bݻ/\u0014\u001fوs\u001ez\u0019\u00196\u0006Ǡ޼[vj?۽~$Q\u0010\u0007ŠKMK\u000e\u001aB;/QmRvf\u001a'\u0016\tp9ם\u0006|Idz\"~&vaO\u0012'N\u0006`Y\u0005\u001fޗӥ6^o^\\vŠUv*lUJTY,J].m*\u0010.\u0003oƆ̕'1W8N\u001f#\u0017\u001cٜ\f\u0010\u000e\u001b69\u0010|?~JV\u0007QΟt5IwbvMѹIu`trU1\\Qvw!\u000eOZ$'sŦ\u001cd\u000b\u0005Ӏ7Ʉ\"w\u0018-#\u0007boHѐ)KXCK ,ANYGH\u0011]mѝDU\u0002\ri˽O\u0013RC-u\\hca=П9P`C \u0017Vaag\u0004vi1\u0016Vfzm[t+3i(ɢPY}7ņjD\u0019fru\u0007\u0007ŭ˳c_\u0015Z8vև֨56\u0001?(Eb\u000bځT{\u0015:V=\u0006Mk;*\u00194\u00154<\u0016o4t]ĭ|\u0015kĪ[>ݪ2\rR&¬h\u0010\u0002r\u0006N\n\\\trL\n\u0005\t\u0003=!B,\u001e\u00052\u0000vȁ\u001c~\u00029\u0019܀M\\A+h\u001e,l\u0004\u0019㟧zob\u001d6͝ߜdlTwji-?\u0015X7\u0013\u000bS/p~i\u0010\u000b0P\u00175\u0007\u0010Z/<@\r(\f\u0010\u0011\u0014\u00025 x _n[ ,>y69N<c\u0015v\u0017\u00068Ȋ9\u0012UX\u0005㺥ցC5%)?\u001e(m4W9u\u000fa5;lh\u0019]AHAT\u00028_\u0001G1zϏAI`\u000e \u001bE\bA>(A^$ پq/E\b{i\\\u001b1sM\u0013EL΀\u0004'\u0018MbY7fɇl  G\u0017\u000e\u0010~\u000bZ)C\u0004\u0014p\u000ef\u0016>\u0010\u0016[%?\u001cn!\ny$\r5p\u0010`'mg\u001f\u0015,\u0006V<x2ҝC?(dª'cF/?׿\u0016\u0013\u0010܂\r=}(\u0000R\u0000'@\u0018\u0002\n>\u001dݹ\u0010\u000eO\u001d/5\u0010\u001bgɞL\u001fyf\u00114*'_7Il kI=cLl̹\u0019~A>=M밷\u000el\u000boP]!jQQN\u0006\t\u0000$\u001b\u00009l\u0000Z\u001a=ߟ\f~8j~DO\u0013m{(n\u001a]xTύIN{{JEɘΫ\u0003Z0J\\|Aٽ\u0011\u0002LxHCĵ\u000eQIN-6exa|Ԗ_'3w(np}!\tƞ!p;ri\u001cNV\u0012_k5?\u0007\u0006ƕGn~$ wiAT\u0002\u0002~訑f0\u0000\u001dL\u001eg\u0015|\u001dܳƫ@IxD\u001cF\u0011(\u001b+v\u0006g\u001b\u001e_:>ƹ\u001c۾q``3\"֝N'=9\u0006\u001f|[o)DIGQ\u0002ro\u0019J\u001fABn1\u0005Rcuqe\\ZINc\"˦Q\u000bl+u\u0005Ec嘞ku~6ȯ$%$;'\u0014|Pᨚ۰2Q<?\u001d.(8JG\u0003gy7}5\u0016\\n}T[ij~m\u0003ʣj ˕}O[ʻ?\u001d)\tLXHkk--*%rw\u0001؄s@>96Zw<(\u000b({Aog1t:M|mzwX7WۨCk=+I%Ydc,JG~^h\u001en.zz\u000el\u0010@l9\u0014\u0005\u0001yd\n9q7\u00003p]zne\u001fPNT*i\u0019r2v&gG޾\u0016jO<r@gr=֏^v#C\u000b{ڧ\u0012ULC.|C#\u0007\n{\u001eb\u0002\u000e6\u000bg}ψ(3)We\u001bb\u0007j_L\u001b2G\u0015f\u0017E+<#\u000fvM^ͼ\u0010/]aL?'8(3yi\u0003\u000bj~T\f\r\u0002sc)\u0006Q9JfנzOf\n5uX\u0004=YӚ,W}Q͜G\u0013O[׶\u0012\u0015\u0006g_>ۙ'BAٹz-ohy+K\u001cu\u00058Igw\u000f L{^0JAeγ9i6\"]7LuW[w0檻)h[w>7ZRk\\x8\u001c:f\\6}ޠ!\u001a7ӾZv\u0005 \u0012&yAI,?\u001c<:J\u001dkN5#uL-hQ\u001b/KH[*KK7^eY;.bئ׹2߽U5N\u001fI\u0014RcwT/\u0003QU\u0002:1&t\u00137\u0018`W\bΕ[Pj\u0013QF=`\u0011ͬv\u00107\u001dۮ\u0007V\\\u0013Ws9#\u0016\\\u0002[(Qx\fDg\u0013&52IG\u0016>\u001b_\u0010\u001b\u000bΤe]i4$>\"y;7\u001f%nIt;\u0018X\u000b59tB1-Vu\u0015E\u0012#%c!:l\nٴ;S8\u0013M;RѸ|9,+\u0002\fQQ\u0000кR\u0004Ń;\u0006\u0018\u001f\u001b\t=s\u0015\u00103]mx\u0017K\"ʼob+Kp<G\u0016\u0002\u0013\f%q;=$ly\u001bğ>\u0007~I\u0013O\u0016o}\"'TSJ\u0014 \u0006wOOP.)\u000eQ\u0014\fcK\u000f[G\u001e@b;Px\u001fw5f|\u0011歺\\(N&~=+\brURU\"#&\u0017w<AI\tLkUk\u000ew&zW\u0004-\b\u0004+]ޝ<dy'z{89\u0017\fGàԔY0\u0010\u0010_!$׌BQzZA\u0019l%\"!==JftGӤ\u0018Fu4M?{\u001a,}{  ^O\u0000ٿ_\fk\\\u0013',Zs9U5\u0006\u001e\u001e ̟Au-$E)r0ZԱMU\u0016,$DeH{&Uux$((\" *\u0007<\u0010\u001fz٫֜z\\4TwGHB`DT\u001a}\u001e\u001fMf\f3/7uCS\\<?\u000b\u0003\u0016s\u0004$>6ʥ\u0000W㱰=(l\u001e\t<LXba\\zƩ\u00125qf|\u001fQs64Xfi/e'Q[f3]I\u001fg\u0012\u001amZFd?\u0000l\u0019䁇\u0002\u0011F\b\u000em-c+bbI{~8_\roM<^̤Lw㕵)KzqkҕtF\u0010\ro,\u000eb\u0014iӬ\u000eP\u001f\u001bo$\u001c*\u00113~I::8\u000e\u0013\u0000tuv)Emmt\t(sN'|YlXm3\u0012.\u001a\u001dl!d\u000e-H3FOtTV9Rf\u0005[]G6jwʷ\u0011\u000f\\T\u00176{_$n_mry:Mz\u001cfȣFg{k\u001dzKmuG(B=PHQdܪ#9!s!F+ɋ.T\u001bڑ;\u000eYQ\u0019L-q\u001e9f{O\\f;ox[[\u0010kK&PF~0)\u0011ȍ\u0012\u001e:='%2\u000b֪B\u0012.\u0010f㻹\u001a\"\u001952K\u0005Ɍ\u001fqĳV\u0007)\u0003X'TVG+%x)'2f\u0016'޻Bz4\u000fV/:K@i*Zh?kֿ%\bMXuFf|\u0012y!8D8^jӮCKRF\u001eD%\u0003l\u0005lGsX*?{ԉ[)\u0019٩-V!@$8m#\u0012iIL\u001bj=0LN=Y4V5:nqfoT\u001f.m\u0001\u001bX=\u000e\u0011\bpvX7\u000f\u000f9\u0018\rQ1isk}\u000eJ\u001f9@轑ٞޜ\\0>uѐڐX\u000bǲTLXRQvrY G#f5N\u0019LܖJ\u0002\u001f\\\u001b\\,\u0007jN2o1i\u0017]t\u0013f\u001d\u0018c\u000erٵkj2Uu\u001a\u001aס,\u0010d\u000eͬ˝ɜaI*\u0012zr\u00140$\u0014iӒ\u000bV\u0003\u0001\u0000^\u0000s;\u001f_\u0000|I\u0001\u0002\u0000\u001dA+{u w@48 re\u0001\u0007u\bi\u0002x's\u0006x\u001e\u0003\u001c?<\u0001\u000b0'\u0014\u0000&mUP\u0005`dˌ7@7\u000b~UOy\u0011?R@_?ЙDZA\u0000CA\u001a\u0010<\u0000¶{h\u0004\"\u0001!pM@\u0011\u0014{]\u0003|F\\\u0001>hA>ġX'\"\u0016_97\u0016\u0001f|{\u0000k\u00128W'QZ7/:zv_\u0013\u0000\\AO\u0007x\u0005+t\u0001W@.{\\M\\\\\u001a\u001c\u0000E@\u0004Vn\u0001~\u0000|-e^5\fk\u0013\u0016@F\u0006؎\u0018;<4ly\\2\u0017x8by\u0017\u000b\rV\u0016\u0000˃9:\u0000O_\u0001!\u001dPb\u001fN[5L\u00039\\\u0011@n \u0016X'?\rPw\u0007J5z%\u00045PAq\u0017Ej\u0014\u0019rcM\u001b+'~\u0010{D\u0015\rҫ\t\u0003,\u001fW\u0000ns&Vw%\u001e(I6BS)\u0000\u000b|@V\u0000^\u0006\u0003z]C\u000b\u00107\b>lDeb2\u00145u,zŤ#Mf/v*.\u000e{˓~\u00032\u0012t\u0001rOH|\u0001)\u0018: \u0016;#\u0005~P\u0005d:-\"\u0016 W^_F':KD4./];\u001c}5TW\rAu/y͈֏\u001fziw\u0007\u00003L\u001c\u0013&AE\u0001`\u0002(\u0001-\u0002.\u0000\u0001rB\u000fbmH$k\u0004(u:\u0015fG_'꓿9yox\u0006\r\u0003ᴳw~?\u001f/\u0001\u0004yұPgC1\u0001UJ-(\u0010Mbg'@Q\u0014Pv\u0011Uz\"5\u0013\f\u001a\u001eo\u001bۢXh-=ϣ{\u001a7`\b*6\u0017ǰheUjߵa\u000f\u0000\u001a*\u000e-!IᓀB͟$kX 9㡭\bo\u001ej ;ϴݻuz\rޭ19[:\u000e'L~^S\u001fW[;<\u0018n\nLc~ayռD\\\u0007\u0000xR\u0011zC\u0002\u0001yJ@\u001b\\\\V\u0017\u0010<)\u0006ɢeS.c`o{ٿ\u0015oA1\u001cyI~\r-7\u001a\u000fUI\u0017\u001bqߚ\u000ft|>,_\u0002\u0016sK*!\u0007{'Ѳ\u0005@\u001d?\u0001\u000eUpg=\u000ehraV=\u0016W{l\u000f$\u0014\u001bgrο݆NCܲC*M:T֝ӭh3C\u000b\u0007\u0000\u0004z\\¾T\t`\u0003-FI柨$p\tM^-\t\rwI(\u0003sֶp]/\n\u001f\u001cණU;,%{]\u0010{P^&5\u0017h6=2e{f'4vgT(̫?.Ux=\u0000A_T\u000f`\u001b\u0015$l\tV/]:c?<Q'h69E\u0016`\u000e;\u000e[%'̗e\\ޤ??W{*W1c14\n\u0013{D2)f\r}O=\u0000$_Ol?I,&ҙ{p2t\u0016\u000fQԷ.r|OZ;9YX2Mݛ.e$/鉏\u0019\u0004r]lsY3\u000eҪjhض\u0007\u0000D\u00054*\u001fOo+\u0015Pv/3;Q۹*ʨ\u0011\u0010͸\u0019FB(+(\fSOn=E[ښ6}g1C\u001bd\u000bS\u001fɕ>Z8T)ۋeFH \u000e\u001c5UzI\\g\u0012zW\u0001]s\u0019ǎC>qo?[\rQ)\"\rl2B,Yg4͈dBd3cP>,f\u0019UV۰ﾃHo3V\u001dD'3dNP=\u0000щ~Vq><s*묂\u001d)1Wէr\u001fnR39\"ة\u001bfxr2\bK\n[K\u0016w,U'G\rz{3\u0000џ\u000fbi}>'\u00186S{kHi|DZNP=~?M>SRX?^vZJ\u0000\u0017^\u0011ꢇ5\\*XnMۃ^g;;=he\u0011F\u0003$gZfw\\*z\u0010W\u000e\u0010JE}ES\u0003\u0016+\u0003\u00104ޟ$Ow\u0006z\r?!޵:\u000e\u0017L2(\u0007fn\u0014v^}YkT\u0010&{֌DjN\u001e4J`c\u000ftǒϹ׻\u0015&^d墇W墄\u0014ᰒ\u0003\tY)&U>\u0007a\\i8;s=؟\\G\tua?Ejʕ{ݸ3¨.[Qq/`ػtC$;h$_IJb؝V?\u0000I\u001e%֊y^Hhx5(3]='kk^f:L-i\u00129v-L4\u001eȺ{L5T\"[}zzUJ\u000b:,\u0003b^6Z\\j\u001dβ\u0010\u0015\u0001X̿]#Te\rH\u0001-^7O }\u001atD\u000b\n\u0015se\u001aLTu~9I5W\u001cjY%sqLHEIp[%tQV\u0007[R\u0013sć\u0015{W\u000f\u0000|\u0003=AV\u0002BA:˥`0m=M-na10e.V\t\u001ffzUJRQ?rwu)=H鵎b}Լy\u0005$N>W\u0010&tM\u0017J\\sT +\tʿ\u0007}\rȓ\u001b\u0006u+eTp\u0012v*&\u001dZ-4f?aҦO34\u0017\f۹OFղ\u0014.?\"uλb;vL7[Ckk]`KE2C\u0013/\u000f\nc!vcl>'\u0012^\u0001\u0006ۃM\\\u001eniwnǼf\r\u001f6?\u001c\u0019ǥ7bw\u001b#7硗9c|\u000b.Uы6\u0019&+V\u0012\u001dMv\u0016駖kɧ'o\u0007\u00008=c?H7b0VΞhyњNyVo\u0013æ?Pz\u0010z\u0018>k_TKJҮ\u000fHX\u0010AʣUKHƅ\u0006Vx=YKp~J®984\u0007\u0011V썷\u0016X3<b,,\u0018+eY۾Ξ\u001eº\u0002ҵ7_Sn֢jMUʷ4~=\u001ax^sl/[_*B]:7$.k/g+\\eݞ_V%uLO72ȣ#N\u001b|Vߪr/\u0006\u0012'm;ǬmN*nnTC${Z/srIփrTWS;م}mO5ۭBcnoB\u001f\u0005-oE\u0018\u001dn\u0006\u001aˍhGJn\u001eқjˬx!^\u0011GFf1x9\bj~f\u0002l9uW\u001fkS5;$3lE\u001f\u0013\u0016\u0018%\u0016Dϼ95\u00035;*,׎J6\"Gǀ呤\u0003q]Ss%4\u0006\u0013$\u0003rlQ%\nVx/\u0004eR\u001f0\u0013gR(י\u001c\u0017Yhl8)fi\u0011/F\u001bb[GLJx[V\u001e.:u\u0005r/bk]P[vd%|\u000f\n\u0014QP\u0007L\t}L\"񾨴ʿ\fN\u0000ǟ'EE\u000e$%\u0011C\u001d\u0003ժBjDN:$gxU2*;ք\u0011Ĵ$\u0015c\u001d\"zi~\u0014N)(\u0014Ssh2\u0012ǔ)\u0014+HKc$WPi?\u0003`\u000eP;\u0001A}i\u001b^L\u0016\u0002*\u000385\u0003<\u0003Q\u0016,z\u001e\u0018g3a\u0018\u0000\u0002>;@\u000f\u0007 \u0001^\u0000M\u000e.@;-\ruE2c\b/\u00112UO1IZ\u0000\r\u001dl \u0000o\u0000WJ2b\u0001p6\u0000ػC~\r`z\"'\u0000kX\u001e\u0014=B\u0013`)6\rЧAA'\u0016k'\u0016\u00153{ۺ\u0011Qbli\u001bL˘\u0012\u001e\u0000c\u0003?\u0000+T7\u0000O\u001e\u0000+(w\u001a?mm\u0005\u0015\u0017\u0002\\`9]r\n62K݁wػ^\u0000&\u0011pL\u001a\u0000}2\u0018Ž\u0019G\u0019Nk2_P>g8}\u000f\r\u0004ī\u0001c\u000e\u001f|\u0007J\u0000-1@Ju\u0006^\u0003\u0004F\u0000\u000fvyk)\u0001\u0000ϳ?`0/d\u0001V`2P\t43\u0019D<\r]szٳKY0\"{{y6kA\u0000\u0000Q<\u0018y@7\u001d\u0010\u0017a\u0003\b\u0001`E?mO%\u00035\u0013uz\u0006X}\u0003l\u0002\u0011P\u0001۲pJId3ۯj??ؾILߺbi{\u0000L}*}\u000fu\u00078h\u0011\u0012䲋&\u00150\u0003jݏQ\\\u0019@\b8M\u001e|\u000e\u0015~❓~\u000e+D6F(FP\u000foyajy\u001eF7o.|z~\u001e.SS\u001f {\u000f\u0000̌aP\u0007%\u00004\u000eA.̃\u0016A\u0015M;\u0004p|_\u0017 W\u0017\u000ee@Ȏ\u0015SG\u0003B/r]\u000bpJ\u0013a3)F6^?Թܦw{.6l`\u001d\u000enIP\u000fPq~6\u0003K8\u000b̕$\u0006d8\u0003 r8/Ku5G~n3\u001aTO^w{V*7\nī<Ɍ/⏃\u0018\nfAjwn]GM!\u001em\t<[\u000b6\u000bT\u0019\u0000P{~\u001d@\u0015\" ~бT\u000bwYm=D#Әmo\u0011ubt\u001e\u0015\nS9H玬\u000fܾ\u000eRh5}\ti/(\u0012F\u0012W~\u0000UR\u0007KhNPꪖJ\u0002ˀB}@I%32&\u0016\u000eyjGy\u001crlƼ\fӢs\u0010-k\u0017+\u0012}s\u0019V\u0016ͽ&]U݈է~\u0015/Y=Nb\u0002\u001b\u0004<6\u0010$\t-٘OB\u0019\u0005Pč#|\u0012\\uҽgDµ`fz,?8\bݒ:َhӋ-\u0019{ޔW]5c+U[5Eُ\u0000';\u001fn\u0003\u000e4f\u0005r\u0004\"ٙIrYՄ=:,S\"4_lp3dmn;UKoR(Z\u001b!?朮vy*UkgaR\u0007`1\u0002\u0007'\u0006j|R\u001d7s\u0012A`\u0010Z:\u0013נּ\u00153kRcڎJ\u0005os\u0005w2J2B/dl?u|9\u001fl\u0007[[w@ij̸YdNaL\u001bѦh\u001aN~ _ӟը|Q\u0007f\u0014U\u0019\u000fw{.\u000b;a~j(3zH:Kw\u001d\u0015\u0014R#TOnSͯ\rM\u0011wh31&H\u0014'XJ*{T7\u0001@\rPвORB3t\u001fk`>ej{4O2]\u00135#qybW8i\u0015:#lOY\u000eM\n\u001e\u0003b\u0004\u00191\u000eEdUȏ~\u0004\u0003,\u0013\u000b\r(]@2[\u0007HK#=\n\u001b}} \u000ey\u0010\u0010FIX8J]Xud\u0019\u001f8-ӽ\u0017~3b\u001cӱ~MuѸPƝ\u001c\rG\u0015TA\f?:O5 u\u0001\u0003O'ˋj\u0014o\u00029 npsO3e-wb)j\u0005+\\Joc\u000b.Ǐ\u0015o\u0019i;\u0013p#/ڇÁ=\u0014 @\u001cO\u0018\u001c{\u00113ݾ$?A4r;6\u0013fn?$9]\u0014՞V#r&)Cf~\u001bj\u0003\fý\u0013C]w*w÷zd\u0010\u0007B]w/\u00019\u0002A\u000f(\nAQoY\rQ/O0=m[XTAj>-Oq\u001eRc3fP׾g0t\u00158}\u001e\u00155O㩯f\n\u0012r \u0014:F~\u000f83[N7j\u0007o])@g/K3ImvOP\u001e7JӹZJdŌv*:2>\u000egnhͭn*lp}Ar1P{e&3fg+\u001bg,\\+%L\u0001@K//\u001a1|\u0013;fkm&oﻣ奻f9f\"[\u0006IQjJp.ۘfҤbPkz\u00125|ۗL0,Fmg1g2H=C.&g5s%m\u0014\u001aj\u0005ɇqHQ<}?Ef~Qn%νQ:Zf\u0000qHa|ʧ4!rc5)t_,G?\u0011tZԪFv.n&/Zѧa.T{M\\Ny\u0007 /\u000b!\u0013_΍]+=3L=\u0005\u000e9\f[3jKz\u000bl{~o=t\u001ef}w/7XQlH2ʆTj\"\u0001NK\u0004z1p\u0018ŭ|^h\u0005lD\u0004\u001b%QC?_\u0002%\u0007P5\u0004\nU\u001c\u000fo\ntJNwԗ\u0013lFqY;\rPj$6S\u0006)W\u001f:x#C\u000e\u001cOma<G\u0017q\u001b=\u001e\t^,\u0012,\u0005\u0000'Y>u]uq8\u0018]_wc\u0019[K~cy\rYj5mrVg]e݁m\u0013O2\u0004P\u0012\u001d\t=|Ġ-:h\u0014Gf\u001bRO\u001c|<Tt)<\u0001_k|LFX0\u0007 %\u0000=x7b8o\u0014\u0014qȩ\bmu.~ä\u001eg`lbrٻ\u0018;xK}\"\u000f\bձаK_?=>Ln97E#9ױZ\u0013\u001f$.\u0003v4}\u001ej']S\\¨\u0016Bߞ{&ؽX]Ј W,\u0014C_CλxurH+C<G=b!<\u001eF|=yLrNۃY5\u0016eiҭ@=#l\u0004DM\u0018{oqjK`6\u0016\u001aX4=JZt7{R+˨sK,twBTj=\u001ajHK2#}GY$Y\\vߜk\u0003j@\n\u000fW+إqh\u001f\u001eU_\nvY`u0\u001a)\u0018\u0012lU\u0019IHF\u00011.ڭU'h=jvb\u0014qֽjkmΕ#vJTWI\u000bfR|/ϖӓiwUSgfT\u001bK`8jWtS.O{\u0019Wn\u0013ک۹CceVXQGdDi'\u0002*\u001dz`\b\u0004N=EFG\u001a\ra\u0003-bp~\f*\u001cq ʎ\u0012B\u001aBÕ$4\u0011t[m&Nc:\nSU\rp{7d\\W}BĦl\u000f<z\u0018^.jC6\u000fXG\u0012+CU8,͔>RgB\u0011ZZ;)Ie7pYNAQg\u001f\u0010t]\tnN\ba\u0001> JtN^|Y|Izjh\u001auN\u001fTڽ=fViV5i!UY >#g7J}r+IH\u0007KS`\u0016͠C6_Pz\neub\u001fʬ`9o ھ\u001f 2Wg$\u0019\"sg+\u001axt\u001f\u0015mVfV,1Uw\u001aLd+R(RIz\u0010A=7ԁ礥W\u0012v&VȄ\u0007\u0011`\\=\u0000\u0000G\u0000\u00186@O64\u001f\u0000CBS̔\u0001z\u0000#\u001d3@4@%\u001a@c\u0001Ќ\u0003H\bt6@Ϊ\u000f\u0011\\\u0000>\u0010N\u001e\"\u0001dK7\u0001%^\u0012d\u0001\u0010CQc|J\u0011i:#\t+(\u0002_Xm\u0004؀\u0000QXՏ}a\u0005@{\u0007>\t_\u0002b7\u0001ں)\u0000e\t@\u001c\u0003ht\u0003(RN\u0001$Z\u0015\u0001\u0012gx\\\u000eD\u0007\u0016\u001d\fF\u000fn\u000f/\u0013C\n\u0007\u0012O#uYRG\u001c`\u000e`\u000b`:\u000e\u0003l\u0016)\u0000\u001b]q\u0007X8\u0002ޅuN\u001a@\fBr\u0001*Z\u0007(Z9\u0003Ђ\u0007&D>`\u0014]z\u001eak2dj1%`E;\u0003\u001c:\u0000Ӕ=xE'!<\u0000`\u0001\u0003\u001e\u0015x\u000f\u0011n\u0005#\u000b<`aX>@M\u00076\u0010\u0006[j{Uvh{\u001e7]=O\u0017!V\u001eq}\u000f;\u0000hO\u000e\u0017uX\u0002\\\u001e\u0000,D\u0000_l\u0000\u0017\u0000_j:\u0006l9\u0006[\u0000f/\u001f?t\t[\u00063\u0001F\bɢ\u0011@+FV\u000f@]6\u0007ЩU\t8(גcCL<\u0006<)\u001b\u0012#9g.@ݡ\u0001+^@[\u0002\u0000\u00104\r\b>?L\u0000A\u0000\u000f\u000fU\b\tK\u0016;c\u0014NQp\u0016ʋxjn2i`vNi֬\f.t]^%\u0000jK*|^,\u0001K\u001f\u0001!_@ҏEpv%@\\S\b\u0004\u0001V\u001diK[{]ix5w'ZL~V!i\u001c$\"=\"i~4h\u0012\u001c\u0000j\u0006{(\u0012\u0000U\r`?b\u0005y3 '\u0015Ӳ24^`sC\"׊o8\nqOyFЎyG~\b\u0010;\u001b\u001a?{`VA58X\u000fO\u000fR#YT{G\u00176\u001d\"*x\u0002pg\u0002\u001b]\u0000$P\u00022'*,\u0007Xү7.<\u001b\u001e\u0010mÙʵ?\u001b\u00179[\u000fg*9]\u0007$V0ѽ(;i]nw?kw#at2+\u0012y Lh\u0007$\u0018\u0003\\\u0003rmT|4a^2\u0015?ڹ\u0016v'Nrjfn\u001d\u001b,bEۻx\t{Sbws`_O1Io\\gqS]X-\u0000-שk\u0012\tl/\u0001з\u0002<WPJCf\tޙ\u0000d\u00113=-^N\u000b\u001e\u001b#s\u001e\u000bF\"R\f2N\u0012>뭮m2,{=\\\nKgoj1/Kwâ\u000frcэ\u0004Qry~4\n\u00043tx\u0002ȿ\u0000y\u000056!G\fBknYl)<Z\f*=vlۼ\u0014|+CyQw\u0017ZHwbSO=Ob\u0007\u001dr\u001cә1k3E&~a\u0016$D׀}`\u0003U ilH\u0011H\u0002+\u0016\u0011)&~彾\u0018\u0017|X|07U0\u0005_|TZެ\u00040\u001f㎭fMFt\n(V/Y}/M\u001dX66w\\1w\u0002L\u0006\u0001\u0019ȵF[@\r(u&Q ߢ|կ\u0017_xjo\u001feKj/o6|ܦ3J/}\fP\u001b\u00172aUg-\nX)wͯT\u001e&7tSDb\u001b\u0004}\u0011Ư\u0001|0}idn\u0001\u0019y\u0000VG\u0014-\u0016پ+vS^.2Je\u0003i\fQ\u0014ts%su<\u0013I[c6\r&\u0006'\u0017\u0019\u0019~@g#|#\u000fa\u0000:ߓ\u001f*\u00041WBTg\u0010\u001bNL\u0016r]nvN+jݜ\u0013~\b\u00047LO\u0014:gcr񌑟#uh\"Ҩ<Cç~Όʱ\u000fBX\u0019\b/b>\u001b\u0000\u001aC@\u0016 g\u0000(-\"5ǫ<z+gڎf\u0017uڞ7z\u0010/rf}8d\u001fZ\\dc#U\u0018U}45pZvf7\u0017i\u0013>\u0005,}\u0010\u000bA\u001apx@Ǐ\rG&g5:\u0012_d\u0016;[9\u0011Ry^\u001a岿n9v[2\u0015\u001918Ggp֚\u0003(i\u0001ë\\᧥)lP4\"K7/Dk\u001an:~'z\bފ\u0007j\\A%+\u001b\u0017\u0015E!zvmrRq3W<:\u0010ĕ~ 4A\u0019#:))+C\u0003a\u0000\u0015\u001b\u0010v\u0003(DRoT9:C.ݐKD]o+ȶvӮTK|r0\u0016p꛸\u001b[x\u001c=\u001d6\u0000]?y{j(C\f|\u001dwL11j\u0018Оl\u0017ӅT 9\u0000!\u001apxj*]vjW\u0017|en9\u001bh_\u0018·\u001f2bvϹQ\rÊ/|x`\u001b>\u001d\u0006\u001f-w֐[>Ϸ^,[\u001d No*mZO>=#qtJG9K\u0000\u001e/-\\@\u001dJsp\u000f\u0011VzMځl[&yͲfn:ɹnv\u001bq\u001a?\u000f\nUl_d\u0006<3v\u0010KvR nb]\u0007F/RKq#.vɴCvW\u0000\u0003O`L\u00009yQB\u000e\u0011;{mqrz\u0015r\roݓ<9b\u0007]\u0006Gs̠i=*\u001d\u001cO^\\F$Ey&혲pmҋ\u0010>-jF[n/d\u00009cAvdcwnp\b3o;+[Ǣ\\.T̀\u0019d=V\\p4_{aAKN=Dj\u0016_\")r1-\u0007F-=X6-;7BQ\tFPBkܾ6{gz5Ӵu\u001dYT\n^ϴeȍRJ\u0012\u0003-]_ѳEKZ\n/*ؼf\u000faX~\u001bGsr4#sk-O/\u0010<?\u0017]\u0005oH\u001c\u0011>R^\u0017҆\u001aa%m/{1L\u0015\u0016'\r\u000f\u001f5_OFo\u0010\u0003\u001d3+Ujv>حwc\u0019\b칐Ī`B~U%9\u0011߼+.e{nv\\˶\"\u0015\u000bĽ\u0017ZC67\u000f(&/.X\u001d\u0005f\u001aNqgX{)zҚdzڔA)f(p\u0001;kV9\u00117{+\u0007S\u001cj޻\u0002TB]Ԕ)S\u0012\u0012_Sh8\u001bnsG\u0017~-*qu1e\u0016i.\tc֭ZzP~%|(\u0010|HN\u000ff\u0004\\ŏ'4%\u000bv_\u001d5\u0016\u0003]C^sT=q8$Cjbs$&4ْf\u001dގzz[_\"r;91s\u0007+X`VG\u001a;ܘ`ߟiܥ\u000ewώҩ\u0000Q7c9[Zd㋉F\u00148\u001eK\u0012G\bVW\\٬\u0010ӭzYƼG-T\u001bkRJU<\u0003A\t/.2_{֧Ι5|Ci;+&%z_d\u001e4Cw\u0016\f=9\u0004\\e&j{\\`\r~Z>\u000b\u0012znvò0|g.]&<!$\u0014\u0003K,3g%\u00125)y\u0016l&\u001e+DE^J\u001e\u0016\u0018U\r 1/Y=\u0018\u0017au\fv?\u0011¡,ʗ\\|/lB\u0007ESV8p0\u0014ۛB1k_\r\u001e,H0Ȍ\u000eh1\u0013.E\u0012j1jZTy4(j\u0011\u001aiF}&VT[7L\u001f̠\r\u001fv\u001cL+i*^-\nCa寮\u001esK\"RA6\u0017_tU.'0D|\u001f_>/aw\u0014@-⨻jIo2B\u0014Ҽ/uFeZZ!\u0015K1J\u0012}&r٧i*\u001a1VΗ\u0015bq#-\u0005\u0011r\ti\u0013k#r,=јcPMۋ7v\bGɚ\u0000\u0010r\u0002T\u0006H\u000b\u001b\u0001n\u0001?\u0000%\u0007@\u0006\u0002Q\u0005ȴ\u000eE[\u0000@\u0019ok\u0014 X\b\u0002\r7\u0017V=eBk\u0001\u000f.\ra\u0010W\u0006dKGqq\u0010{q\u000bJ{\u000b\r\u000fP3q\u001e.\u000e@֕\u0013@\u0006c\u0000E_\bp8\u0003n\u00008 C\u0005!y\u0010\u000b X\u0015~!b\u0016 9ZA\u001fF;ok\u0011Y2*\u0004@*\u000b\u0011 Cn\u001dnh2{ßB\u00022Q\u00050\u000bh\u0001t\f\u000bEG$@\u0012\u0011Kk\u0001d»n:@ExK\u000e |\u001c\u0002!\u0010\u0001%\u0001$4\u0012\u0007[۫B\u001f$\r4](y\u0001\u0018\u0000\u001dc\u0019\nq\u00038\u0000袴\u0006ht\u0003h\u0006(E\u0000ʹ9SXpSi\u001e0\u0001+\u0006l(v\u001c\u0001DW)\u0013\u001b\u0019ߏ[X𢨭}^KG2\u0007\u001cxnܽ\u0001`G\u0003\u0014\u00006[\u000b\u0000\u0010\u001d`Ů\u000fP\u0012g?\nI\u00012j\u0002J\ff6\u0001ۺƛ\tD{3\u001fGy6LIn廯*u3z]\u0011%\u0000O^\u0001{ġV\n\u0001!%\u000e\u0004`Oh/6|G\u0000K9~lUvLx\u001a\u00058>{0z\u000eCRɽt|\u0013\u0016ޗѨ{\r5I\u000b_Hb\u0007\n@;\u0011<\u0000\n\u000b\np\u0002\u0002\u0000t\u0000/f\u0000Wއxw>aɽc]\u00146BX.L|6|U\u001f|ZY}y}73b%\\޹PI<l\u000e5\u001e,*\u0012\u0000Y۰m*L@{?~hN{\u0000\u0018k\u0010\u0007\u0005\u0010zj\u001e\u001d]ziU9.<d[{8uϦMˣVϮ-/\u000f΃\u001cK\u001e\u0004\\]\u000fR<W[q+o_\u0002 [\u001b`YSO$\"\u0010&\u0001r\u000ermL˳\u00159ޓXG6,~%\u001f\rq#\u001d,g\u0004t`쿗|/2J`+3=r\u0013@wj5w`\u0000,\u0013S\u001d\u0006N\u0012W%[ȽA.s\u001bUZQ<S}uJ\u00190H\u0010[H-J..~FH\"6\r3Y\u001eŁ<*X\u0003,\u0007ۼ\u000e;Ui|\f\u0004\u001c?\u0012V'3@.m~R7\u0015\u001fe\u0011n>ݑSc n\u0018[M{\\?~F~\u001a+CWFKw\u0016\u0004nG\u0017ݍ,;H9*\u0007K\u0000.Cx\u0000z\u001f\u0001\u0018&Ɨ\u000b\u0011WҚ%R.\u001e\rBx\u001aG\b^nR2CkG-GQ\u001fS4/:=_v?v\tH뾳\tZ2K\u001b\u0012#9\u0002,-\u0010Pe'A\u001b\u000bT˭5:416~ivY2\b5\u0014-Q\u0014:A\u001f\u0015j몔XkքgKD\u0014PO6?s:iApsʏ~\tؗ$Ӡ\u0010w\u0000INBNI1/aҷ ]>?m\u0015x\\{jcmS\u0017V.pS˫m\u001aU=şit\u001ef&7L:ڡ3l1c[Kۑ:rM\u0010\u0012p\u0010U%oC֖mπ\u001adSg*=!O\\G;}\\\u001c><Hra?X\\!w\u0004hA*|$Sg\u000e3^)R\r'S\u001a\u0019A\u000f)'\u0011uڇֵ`\u0000s&ч^\u0017;yߨf\u0017\u000eN\u0011l\u0015|\u001cz̧B;g\u001dT9\u0011l2\u001d\rg}\u00079\u001aB\\|\u0016\fi\u000fuښx`Nf\u001c[\u001f.52\u000194zu\u0010\u0001ǍWCv\u0015Ӳ\u001dNs3Kn@u]\rt\u0007/_~\u001c&/\u001b:$\r\u0018\u0011.ӛʸĭSg`~]VX^ZBrsc\u0014X\u0004Gs8H0_T\u0013hIu\u001dQ\u0015_C[l(-L2cK\u0000\u0001b07\u0000\u001e-.\bD\u0014yy^\u001d8޼}|\u0010\u0004}<\u0015F3K\\Cf紵,/7kA$m(]u.\u0019O2\u000f\u00061D\u0018}\u0012\u0000'?.\u0012\u0018\u0001Ju[^~}\u000f\u0017躥K\u0012c'>A\u001bc/UGU_s\u0007SzeR󣲙\u000f}%_O<\\OZt\u0006az75S\u0013I<~\th\r6oz/;m\u001d\u001c\noHޞ^\f*V\u0014+jpV\u001cmwݟp\u0006ecf@PJ\u000b36BlZ{$ҷ~)I\u001b[S_\n{Q9\u001e3\u0013\u0013\u0000=¾DNa\u001bog.ԏ\u001fgh\u001cPט5[l؏|XO\u0000y\"-Vf-ݜ7z(A;2nc\u000fR.Ԧ,g:^\u001fcgkVQD\u0004\u0011Q\u0010\u001bP\u0004\u0001Ql\u0006掵̨\u0015q<HI/`F'd`ZHuÁ\u0019.́\u0017Q\tFI_H<vP\u001c[\u0014\u001c.Ǘ6ZŕMO\u0014S\u001e֯r$dI%\u0010}TGi_|NDٝ\tST3lK_/εpK{a\u000f<1\u001aa3\u0014\r\u0012\u001e\f?$\u0013\u000f4Xåּ13=eOv[Ӏ\u0019>]~.\rySF0\"ݎ2Oeɚs1Cl1<'NOg?3l\u001cf䁱}\u000b5\u0002\u0014\u001e N\u0005  k\u001aRp\u0006@\u001d\u0006oe|*c[p[[\u001ck\u001d\u001cTFgZ\u000e,)\u00045]&\u0003\r\u000f\u0014\u0016Q2[\u001b=>W(t5fZp~Pb\u0011-\"O\u0000b{@yC.\u000fbӵL@\u001a'i_gD9cQ),/\u000evdW\u001e=rps\u0010z\u001c\u0014CoYb`\u0015zVmzA!vctR\u0007s\u000e-\u001d\t;\u001ft\u000e\u0017'˞{2:M\u001aQ8\\u\u0013꽖\u0006T,f]fؚi\u0019JwyUY<i3'Wg72\u001dfZWfNt7\u0001i_\u0012/Jm7>\u000f.$^\"\u0012\u001f__Y2<\na٠j\u0012zi\u000eE5B\u0002l\u00062\\'n7K\u001e\u001f\u0013<\u000e\u0019\u001c\u000f ϔm^L\u001eCi\u0017\u000e\u001aU\u001d2\u000bA{L/2SmM555gkJ1\u0017F}x}(7ϥ>aWf>7\u000fNǼ}Xh\u001d\u0015QX^ͼ1e\u0007vQ>#ݾ/I\\~2ޜp\u001c\u0018ktlUīy\u001bωfIQ\u0013\u001bxR?ʧBu\u001ey.Ҙ:8\\)\u0011i'=\u0010qjE\u0005AE\u001a\"O\u000b.Z\u0019)\u000f;|ucֵ\u0006\\C<.|\u001eVۥm`k.$Gn׶A6^}c:=ڷ55û_j.\u001f$O,\u0018/\u0012\"6\u0010u0@_Hm\u0019z\u000fz\bی\u0007e)Q }ݵGܮn\\Zz4\u001fۻ\u0011Y>`l=^I_EUPQ\u0019K%\u0017s?e6e_^'e\u0001k\u0019k\u0010HH\u0012\u001dV4zlv^/sv'=˷\u00114n>\u0006֢V3řQeޮbWE_\u0016;Ө$\nT\f,Pcq8P|a)l\u0016a?V>\f\u0004!z\u0000|~K\f]{Qyrl]+a].{Βb͵\u0014\u0012.4\"+'CaԮbz\u000b\t\\x\u0003Tކ:r\u0010\nIG뒈/'U^\u001cY[k,Y\u0013Y\f<kT\u0004\u001bd~L\u001a{\nkƱF//c5;)U{F\u0007\u000e5SU,GeoKR)y8S\u0018+9S)\nN,H3\u000b\fVD1*\r\u000bݛ2~\u0011EFH8\u0013\u0000A?m`;\u001f\u0002\u0014zI\u0000-5¢c78,5\u0000\r8%@r\u001b\u001b\u0007H\u0006\u0013X\u0004:v\u000fgy\u0004\u000b%\u0010\u0004^\u0000+\\&\u001c\u0014\u0003)$@v\"5\u0000mf\u0012cf\rоON\u0007@\u000e\u000e\u0004\u0003dƮ\u0000\u001f]\u0006\u001f\u0017X\u0002\u0004<\\\tc\u0014p-%\u0000)2\t'Jhi~I'\u001fS\u000fQ\u00008\u0002,D\u0000\u0015,@[6@Ѳ\u0000b\r\u0010?<\u0000m$I$iH\u0000DyW\u0001,_\u0000\"\f\u0007\t)@'}\u0005\u0013pi2R|\u001f\\=tro¨$7\u0001pKt~z3UM\u001d`T`\n~,_3\u0007\u0013\u0001芟\u0002tr\u0002̞\u0001Z\u001e\r\u0002/\u0002\u0004[\u0000y[\u0012<\u00009V\u0004^R:\u0014V^/Q\u0014]-Pdn+k?\u0001\u00106O1wd\u0004-5%\u0003ͷ\b\u0011\u0003Xݐ\u0001\u0000=}Z\u000f@U'x\u0016*5r.@;\u0002bv]%S}z\u000bR'xM7y63$g{5,<.ؠcSs!)\u0007lu\u0001`/[\u0001\u0003j\u001f\u0000\\-\u0000g*E\u001f`{\u000emI-x\u001f\u001aPÌ{3j}MKǑgQu݆ \\}ןGw(ެ|c\u000bB\\s\u000b?\u0014|7)-pB Q\u001dm\" 7~\u0002\u0005Vc.9G\u001eG5'.>U[o<ɎM=6s,]1ousK\u0013\u001c)s\u0017\u0015ΏK\u000e9E\f\u0014#7\u0000n\u001c\"\u0003\u0017\u0015!QY[ {\u001b \u000bYg[\u0018\u000f_>ϣFn}q7u{\u0007yfr)1݆?^wNs\u0017ҝ7A;mt>\u001aa\u0003>U`Oe\u0001F\u001fu{oHJ}\\\u0017\"K{j Wz '^ Txi_5e\u000fI?} nN\u0005y^E9\u0014\u0017{Cכ\u0007\u0007L\n.~|QE\u0003R\"-;}\u0002!DֳO!)C\u000f\b茭\r\t\u0010L\f\bfէ3^\n}*0I8V?I.{Gӣ\\ao%g_ɨ#䂭̄=UNvl7)mf1\u00064ajH\u0001`\u000bpFdAv$\u000b\u0016\u0010\u0005\u0010^fKX\u001fՃч=\u001dxodݵ-}ocosa3#ږsվ~ȣsP\u001dO'\"1Q$CX\n7\u0000{Q\u000075\u000ed\u0003J1DU\u0013\u0010\u0002|\b=\u0012\u0005ӊY:V\u000f\t\u001dnN%lMuAp&Ѕ8LD.:\"|6gf>\u001dkU5ΕHkB\u001aZu_UY\u001b:I>L\u0017 Co_켞}\u001bϵ5ΧC~@uyG\u001cX\u0012LS.I\u0006\u001bW\\oo~^\u0016\u0015;PUh\u0019\u0016^~NiI8Ůigve8 5ts\u0003]q\ndkaR䦜F__MupD\u0007&<}]as7\u000eq\u001c\u0014?\"єJ7XiKxFQyZQl񴄾@xײ9(M%gfX-\u001f9sF0\u001d\u0014oHR\u0007|<\u000b@|v?Oo\u000fr;!5/_=z'ۤTL߶,\\]~=j\u0017N^h|vkGR\u0018r\\7eiqi嚩XrY|'\u0007q\r\u0000o\u0012nn\u0004\u0002\u0002Չɰ\r7YyC\u0007<>\u0007Ln5r-MG\u000b[q_%~\u00132׳9r\u001ar`\u000fҲwZۏ'^Oz\r=o@j$v5q\u001aPH\u0017$\u0012.'Ry\u0015\u0013Bcw\u001f=,:kohvlJ:7\u000b,_frEV\u000boTV.JYd;^ɬ\u0002>\u001f\u000f⩵z\u000b{\u0017|#\u0011)4;c\u0007\u00134qW\t].)\u000e)ߐ4{%RH*h[Bڧz˶.Q}zV-p^fngDM\u0017xWD.rĳLkCV\u000f:oiw4V'w\u0018;K \u001cct\u001aѤ5F]65\u0010\u000b[\u001d\u000fm7$$m\u001f\u0003UoG\f/\u0006vԭ5ksfvN>jK5i\u0015*QT$tۑ\u001fR\">\u0013C\"\"،\u0015\u000fX\u0019oRm83~V٣i9sM\u000b8=&N\u00171I\u0007?Nj>\u001em0\u0007#G\u001dk\u0018v:u8\u0003Vf0ʕk37iO۝0ؔ\u0015UY\u0010G/GR\u001dю\u000b\u0003̾znJh)zp\u0011\u0017O\u0007rr\r ;\u000b\u0006\u001b8v5OzYM~y<\u001d\u0019\u0014IAg\u001a#%_*C&\u0011r^+Spm4&\u0003\u0019\u001fP\u001c<hɰg\u0016lַ\r(bl\u001e\u0014\u0018x\b\u0003s]M7ɲ= l\u0000o\u0000Y?\u001eħ\u0014na⪤\u0013\u0014iKm~#b5Y\rq+\u001f\u001eK5zky\u0013t`\u001ch\u001bMw#2@vc0{!}b9z|_u\u0006#\u0003Ĺ:g$1汳$CsH\u0004ھ5,`LB]2L\u0011-ħp-M(H\u001c`W\u0001\u001f\u0017T0P=mR!i`~'t+{kA[ZԼaoVoRtcg\u001b\nJAiߨ{/\tVe$ 'U'G~*řtֳ%f\t^u\\h\u001dv6T51Ns9\u0006IOZ\u001aBZNW\u001b.\u001f\tnoAN]Feg5\u001cQ\u0017R*\t\u0001췱,\f t!gM,=Z]\u00013%YKV<\u00060\u001b.,$\tXŪ%{wBS!ݵ':[giwlp'\u0007b\u000f'\u0007+'wށݱC'C7\u001c7\u0004g\u0018+\u001b]agV\u000f\u001eCLn?)\u001aKȽ5ߘ:l(Vs!ԙ`7\u00040s\fx\fFӿ)VB\u0019Ǎn:M t#:Il\u0003mۿs7&ovF;!66og9EWny\u0005\u000behۆY~f\u0016-bxfj\u0017\u0018eAO\u001e=-!PT6+\u0010\u00163_\u0017^\\?{Ku%\u0012s\u0019L]rö\u0017~cJ)?7Ɍ&tĦlWInStlh\u001bD푷zn{uug.S\u001e̢rV9\u0016\fx/ULQ걣foH4ЏmēK\u0013\u000b'\u000e\u0006\u00160I@B[dfK\u001afpzK:6\u001aK}um*Rݺfj]b\rY\u001dG1uDkm\u0002\tzT\u001fNܷ\u0010\u001a2\u001c\u0016aa\\\nM\u0017\u0007Η11<G%0j1\b{|=4]?\u001cԌz)}VgV\u001a*[^M\u0019UwUEM+\u0001i\u0006oOMW\u00179qm:\">\u000e,%|{\n`GuYo2¸-Yv@f6\u0018r=\u0002=I^gٸ=jh%eʅO($*f[H\u0012x\u001766^q{8\u000b}n8Y~=K8$\u0013f\u0014b3A\u0016nb+Pf+kc'jラڒ,\u0005Z:){\"\u000brYdMQ\u0019,NȻDNؗ\u001a>{DN*Ӳs:\u0013XoP\u0011\u001d*\u000bHG#Q;\\4\u0018yl_ͣPQ\u0003_\u001d\\\u0019'XJo)_#hߵ|'7\t}zLg(d[GR\u001a\u0001v\t\u0013\u0007\u0018\u0013.\u0015u\u0013\u0001z9\u0010ߠ\u000b\u0014qQ\u001bz;{u\u001a]4D沪:5ts*\u000ek«\u0016\u0003#\u0015lxwͅ蕦~oYU{<#~r\u0003\u0017C\u0015 <G˩AbKP6\u001313A̿'?\u0000pn\\\u00050o5\u0001\u001c\u0014@4`.&\u0012.\u0000<\u0000L`\u0000\u0017bx\u0007PM\u0001tŴ\u0004}+\f |\u0007\u001eM\u0007Oa\u0001\u0004z\u0017$\u001f:7=f^\u001f~\u001fc3QOtNm!ӭ\b\u0010\u0002H%p@z\u0000pC\u0001\u0001W\u0018\u00007\u001f\u0012[\r}\u0015%(J@f\u0012̲\u0000Fɏc^\u0002G\u0006pM \u001d\u0012\\~P\u0006W\u001e\u001f\u0016\bnu󂘝\u00004wJԵ\u0013\u0015\u0007:\u0001ȅHNx\u0000E\u0000\u00128@b\u000bwe°W\u0003\u0004{\u000fw\u001a'\u0018'߮R3\u0000O\\\u0000X%\u0005$%y\b(ƶA\u001eA󝳔cG\u0014H$)x\u0006\u0010\u0012JS?\u0001\u0002t<ғO\tI3\u0002ȵ\u0003$\u00012\u0000B\fm\u0004+@R\u0000$f\u0013\u001e@N\u00029\u0019v25}\u0007%ID%Q^yL\u0011*;\u001b\u0000\u001f\u0000?&?t{~?Y\u0004\u0017\u0000\u0000*j\u0005.@fR7?\u0016\u001d \u0000\u0000DQة1w:c|ޣ ?|\u00130\u0015';;Q ϖsM#JG}T\u0004c~oB\u001b\u0000R\u0001\nu\u0013\u0003\r*H\u0000\u000b6\u001bf6\u0004\\P\u0002Xd\u0000zZO;1g\u001cy\n^*U/P$lT-ĕpŭ-3ϧO\u001f/o\u0005|iP\u00188\u0007\u001d\fO\u001f3\u0017v\u000f6׿$s\u0004H\u0015&mU+7\u0002x+^!<\u00008!\u0000xDץQjxE3.g;\r鍓\u001eNZ\u0005n\u0003\t\u001c\u0018\u0005ٚ\u0012\u0017}yԊ\u0019xr6t<w\rI)%:oD\u001a\u00011\u0000+\u000fidXm$\u00150\u000b{R/#v/|4|ӊ|?^\u001b\u001fNܯ$*\u000b\n=+rj|.\u0019\u0007\u001f\u001e\u000f\t\\~M_I昵~|8!::4y\u000fG˦O \u000b׻\u00140\u001cjFnf\u000buJ=]x\u001fzҨEl4ryK\r\u001fO/[]g\\\u0014{fwփyֲlxV\u000b]\u0014\u0018N\n7y\u00141l\u0000L{&R\"\u00038\u0004rX.)ix~_#\u0001s8\u0014\u001cU:M\u0014\u001e]ua&\u0001\"{/lwqv\re\u000e\u001e1c!,ԅf\f\u0003T\u0003l\u0003z\\쭓}N56CRrt\u00005\u0007 \u001bgipQ\u0013\u0010\u001c-:`f\u0010xOuyh!\u0019o_057\u0003ʑsn\u0014cf̞n\u0018\u0006Z$\"|M\u0007+1߮e\u00028k+L\u0013_\u001bfm&-TDex_;s+N7\u001c\\%vX}}\u0018x_֯EI5\rwLf\u001c\u0018\u0003)lX҉Lq}>K\u000ej\rj߬Vkk`zS\u001f\u00038QD΋Թӈмy\u000f{\u0010\u0018ci*j~}`-\u001fKgs^kzV荴9(J\u0004i,-]{.3/p_\f.2wgg<\u0002\u0015\u0002ݞ\u0005[E7\u000b~CRAOI>^R7\u0002 \u0012\u0010\u0019vcV9\u001eW\u001ey\u0012\u000fyޙ5}hͬ^z嵒ԵQa\u0002@\ru]LEtϳm\u0016ʬU&)\u0015ks(\u0005śJaj\u0001`g\u0013dsD*ˋp/J~m\u0003\u0004TeRo0\u001d\u001eF2\u0007,@uS5>_yc\to\u001a\u0005&\u0003\b9\u0014wյt?YDT\u001dSu>䤦<ZJKI\tk7\u0000\u001cɴ@Ҩ\u001fc:\u001eGcrm\u0012\u0015\u001bY\u001f6G\"s\u001ekjQ7OFn0\u001e*\u000bn-ω¹\u0014JɁ\u000fǈNAST3lo\u0015\u0003\u0011{_Z/e/\u0014m\u0012մ3|,CҖ6n$KCU\t\u0003q\t/ad6g$gC[;ƴWn[ж\u000f{͂\u0015D\u001ep*_*&)FX?=\u0004{\u0014\u0011\\c=\u000b&\u0011F-\u001auY\u001a;xE\u0015\u0012wM=L9\u0005DEOD}xya1U?dy.1ʨd&8L\u001a\u0019?Ƣ\u0005_ʙYURS\u0014Bdy}\u0013\u001a)\u00111\u0018F@\bzTj\u0007^o2Z>?\u0019Vו B8\u001c:\u0000p\u0006RLߝ ${\tYѳ˅A4*vwMǕ&uq-diᲗr)Yy$Un\f\u0017EUC!\u0005A\fF<>\u0018\u001a6Vă[M'.+v%Ͷ+^~_\u0017~)!9\u0012䦹~0'\u00117(oe~\u0017wZF~U7\rNNCLYh.\u000f,o{ˤ\u000fᑤuVwZFEts\\uT\u001eJ\u0019zO<s{\u0005Qcn\u0003Y/\u0014>\u0013|>l\u000e\u000fR\u001fN~4'#\u000e\u001ed]ɑrN!,HƘ:TZvh\u001b-Pq\"ؙ\u0007YZ7.?E\b\t\u000e\\Cy8tw7\u001ckaÖVwQ$ϰp\u0000/w-~CҖ\u001d\u001f@e\u000f'\u0019繨\u0016P㸧!n\u0017֤l-,x5U\u0013\u000b\u0005C\\\nRq\u000f1B[&ǂɩ<$cȘK\u0017\u001dt%\tTe\b\u0004+C:gqw\u001b@\u000etHrsfbneì\u000fvE̬\b7\u0017a:K'PR]c\u000fO#\"v/\u00176@gN,9;d[PwSq\r\u000b7j_\u0013֬'\u001f ٿH染Pk\u001cjB\u000ebC6=\u0001|\u0005{y@E[+*O\t\u0013Ya;R~\u0018\u000b+L\u0003[(\u0011J\u000b!\u000b\u001ahzݨL:qu(~P\u000ew\rtq%'ᬫ!7F9Y\u001b\u001d+G\u0002Y9;Ϻ\u0003ѯ\u0015<>{\u0011\">nZqI\u0003S>$eu؝Mvw<\u001f\u0006Y||ퟬZHӫ8ܪ\u001d\u001d)LDm[za>#h;T@\"P&\u0011\u0005ʿ:yPv\u0010K\u0010#\u0007`\u001d\t׊3y߼I\fD^\u0013jk'.O\rif*S\u001d\u001d^o7\u0014]N_$$;$6?ZRm\u0015*_UFx;\u000eZLc?@\u000bI2?G5Y\u00152I͜`M^*R?Iv\u0011bʿN0܎n\u001b\u0002?\u0004\u001e7(V\rU:\u0019aԃ?\u000e0m\u0001$ױ7lVUc^\u001d\u001bsjm\tz\u001dWF}5ꓕ\u001b\u001dw\u0015kK57L$Z</v=zff;Ϝ)F7ǳ*\u0015w6tK\u001bB4Tm{ۺ\u0016~4\u001aϷ^Dͼ\u0016JnMLM'n&\u001ae\u0015'/YQ21\rVBo_w\u0017;)?\u0012;A\u0019\u001c\u001b^36>T/Ȗ\u0007'ڠ%k*+&Urدm\r#l\u000f\u000efŹ/J\u0019#2\\\u0016\u0014)\u000b=fZ\u0016oHٞǧ}!~}.\u00130\u0004J\u001e䍱SO;8lʹϧo\u0007pXF\u00069\f:5v\u0019W-P*n>*wW.lsGWIȰ\u0018KX\u000bz1g%\u001d\u0016,_uRGk@Zq\u001bs_\u0012Cʗ7\u0019D<Mj\u0016ӽAV`?K|5:H[\u001e\u0011\u0006_2DUŲ:JͮU\fUXGL]ym\b]rsL~\u001crL-}D\u0016wx\fkh@!a^Y_~ח'q\u001crdDnN}\u000f\u0019jOʨʅ|)?­X:\u001f\u001d/\">}׿sL-B\\+ pw(chb\"S\u0017/A\u0002/:\u0001L\u0002R/\rI\u001f0[zZ6\u0007_!\u0018A\u00163w]bԖdRm;9XŦ5+\u0006[~^XU^\u001ba*+\u0006\u001c|6Y,\u001ax\u000et\fL;\u000ezZ\u0007Tb\u000b:7qbRk(\u0007^k[E6Ȃ`qK\u0010~~\u0003q\u001e@^\bڬ\u0006`j%\u001e\u001e!V%\u0005@Ov\b=\\@&\rq<6ll\u0002i]<AfQv\u0012\u0004\u0010d9\u0018d}\u001ddv~HTA\u0004&Ͽ\u0000\u0012<s\u0012Ej\u0000}h\u0000<\ta\t\u0002\t\u0000\u000e2\u0000*\u0000\u0010]\u0000\\r7)']\u0002\n@\u0013\u0000c\tM\u0000\u00114`\\Ϭ\u0013Tx\u0017\u0016x\"a\u00026\u0001@fH$N?\u001f\u0003e5\rDj0\u001c\u0003=h\u0000\u00162.\u001b\u0007-\u00023\u0000%\u0019iBh\u000eum`\u0007\u0012w\u0000Iͦ\u0004\u0016\u0014'1Ulug\t?w#2^n\u0007yo\u0005\u0000}kԽZ\u0002Hɯ\u0001dZ\u001f2$p\u000e\n\u0001/\u001cVjA\u0006\u0005}\nV-\"K`$\u0016\u001bK\u0018($;1,N޹z*P[#*3k'9]X\u001bvͰ&\u000fNCO_H2'*T\u000bM6@\u0001@\u0002\u0000E?\u0003Dc\f;e`\bGa`jĶ1WܧZ9{w΃'6\u000boER\u0017Z\u0014.\u000fd<:0ݾ\u001b͛o!)E\u0001 dꅜ:Lg\u0001Ԅ}2\u0017R\u0004}\u001fulUzZ$\u0019UC\u0004|\u0012G2`g\u000fw@#p2\u0005?e'f*~\"r\fkoHr(\u0000\u0014B\u001344t68}\nMIC\u0000[fO+|\u000e\f+9z̓|\u0007vm7>7>\\!~\r\u0003|\u0002\\_O@^*xzꧥ:Gv~\u001ed~=\u0004\u0007?'?H2H\u0015Ҙ<\u00104[$\u0006`G\u0004U¯\u0019\u0007\u0016p\u0011m\u0006O~t=TⷧAN}شOm:yc~\u0014#-`QCm<\u000bikL)3)/\u0000\u0019&:\u000fD\u0001Ό\u001f{\u0017K K7d죹\u0014\u001d\u0011\u0019\u0003@\u0018.W}s4n\bCp@/k\u0004>g\u000e4\u0007/v>v+[G1TQ\u0018\u0016\"\u0016\u0003@\u001bP\u0001`\u0015{IΎjN}yU\u001fXqKb?3ItU%Jte_N[<ݩ0Q7\u001aF\r-;ywt\u0017\b:\u001f?gz.xIz\u000ed&)$I҂JTiH\u0015d~\fӘϸ,n,KU?Qs7DN5{XOiݭro0\u0007eKlmmQ\u001f\u0015Ɠpk@@Z3fz-;|{>k\rA}R]7\u0000-\u0002r\u0002!R b|<]\u0011D\u000f9mW\u0003\u000fL}_̮\u0006G&cp ׋Әh䫳(/VOn?\u0017+|\u001aKV.K}B1Ѳ\u0007\r~\u0014\u000f\u001bf4(\u0002lmI\u001cV_=|&)\u0017*u\u0004,}\u0017d_!+K+r;ә@\u001f\n\u0004<3tiѤƪ[v4]7;;:ǵ^\u0019K!NC\u0011xSY+$\u0014\u0003Xn\"5Gq2Ǡ\n3\u0016b'F:ǩy\u001eZ|n\t\u0017vq2f6^0\u000b`޴&ɽWS6\u0012Z\u001cK\u000bS\n,=)yrJL'!݂l ͷPIW^}CyVYyֲ\u0019yx\u0003`:i\"83Qu_\u0015˞N\u0003 $\u000eycTw\u001a\u0016\u0018ߪ^ƺq]Uc;\u0015\u001eK~\u0011\u000b)C-;;pYgqK\u00113\r8m{dS\\ϬlaCr2ܔW\u0006SCRG-=J:\u0015\u0012\u0015s!!쵅g\u001cR6|2kEH?g6\\7:?J-L\r\u001c\u0017p~3\rl\u000fң\u0011\"&H%4\u0012!-,ݏ18@Chˊʈf'C_\u0013>:ڪ\u0002\u000b\u001e(#[n\u001c2\\\u0011;Ein>% b,EgLr@p\u001a=$v5<M5\u001ccs\u0015rӊ<\u001a\u0007KkT?#oh\nww \u00153Ɖ\u0003\u001b\u0000޼&:gb3eyS8Dq\u00161\u001aSvM\u00153au\u001e6^\u00194_\f\u001frNY9HϝqkǤ/\u0002d@\u000fQtu2T&d.E0\n5^t᯵F$e:E/$mZ|:׊/Mc\u0004\u0007n<Ql\"Ln|Ʊ^N]\u0002~-y^(:\u00067y\u0012{g\tT\u0005c\u0010D@jѤ>rI\r9ǭ՘}\r_\u001bI7\\*܊a\u0003ùX~\u0003gƘG_4˳\u001e8\u0007;\u0004\u0011\u0015\u0010lnKs̔|)g3\u0016hØDW!6ƸգV\u0001v}mt\u0006c\u001f@=\u0000Xn\u001e\u0014>\u0003_rs}\u0004d74V3_קA\\f>shmՠ/g7*H@f2gUj!x2\u001fI}k\n\u0017pQb\\\u001e\u001e\u0018ڻXw\\?\u000b\u0005}4S?m{eXv{F7ĂW\u0005E8\u0007{h3zggeLh\u001cƓ^WMoG,\u00040*)U\u001d'wuM3\u0000\u000bbscFp\u0019H\u00073i]\u001e_\f\u0007p9G{SA\u0017nYW\u000e9\u0015_EwY\u001dlR~\u000bOgN\r]q}ۑ^O|}\r+\u0007{6>-7`QԦHNN}\n4-f <^\u0017YlŽI]gO\u001e\ff\u00133\u0014G\u0000׸wU\u0018utNC\u0002C!rUҦfp1z|st\u0019jɸX)>(۱Kl\u001e3L~0\u0016{(m\u0006H9PXxkrxIt\u0007Z\u0010ħڡʥ>i(L\u001bK\u000bE4Ə61\u000bTm\u0003Az\u0005~Ñ޶^&~>7L}</;ɜ\f;P>?jeE\u001dvǸ\u0001-hkŦZt\t;=\u0001HfZ*9x$po$\u0006o\u000enH^d7h\u00065u1WntV/^\r \u0006\u0019k2hAmt^\u0015Ӑec\u000ez\u0015\u0003\u0011ט|\u001cP2\u0005HTYvѡʁ\u001c=\f[ߖ\u0010\u000f\u000bsofZdᓆvlïR\u001dw\u001b\u000fKߖ,\u0013ko߸.Gכ2ug6PCk\u0003\u001c\u0014F׾N?t'z\u00059f\u0010nAD\u0005Fk\u0013\u0015n\u0015\u001bܥ)MwCQ\\\u0011\"&\u0016G:Vk}ߪEƹ[Ӛ\u001b\u0007I\u001f8-{\u001b\u0007c\\0XaI#w:Xlwlrp0d^_|5u\u000b3D_r\u0014\u000bh\f*EL9JcAKz=cz\u001a(bO}+Ta|oU\u0019Xb^Zm2p 7|6\u000b\u0013\"yV@30\u001cK:gj:f~I^(mq\\tZ\u000b*\u001d\u001d4봃7ZS\u0005V\r42ZŅ*VC0\nO;z\twT(MKugV)^5V\u000e*ґ&^oj?+v\u0016f\u0016LɐtJlWo(;zc\u0005WQj>nHTP)kr4etwbz\u0015\u0016&\u001f!)O\u000e7\u0011Z%Zt;r&֍rF.C?HD榗%t\u0012-\u0003G\b12uqޅ.Ik\u001fNQá{kw/I]F\u001a\u0000%yMeANs`Q1M'˵\r\u0016w7\u0013\u0016.&U8^\u000e-\u0001\u001c1;AE/\u001e\f(<<i8209f_#-5\u0010w,{=m*9\u0007]>rt\u0016BW%_QsK.T#;5/.j\u0013\u0003\u0017\u001f\u0013G^Vp\u001cG\u0014^S\u0003E)@\u0006rdpq\u001a:bE\t_~<M|7\u001dVJz٣W*,\u0007.zY{ݪ3<}.`DD !~\u000fkU6kV\u0004s?\u000bdHdzmIHl`|ہ3\trH&=EC\u0000Լ`\u0000\u001aY\u0000X\u0001@r\u0015d\\\u0013d>dik+\u0004\u001f$NRu;\u000eNte\u0011>AGJ,\u0013xb\n\u0004j\u0014\u001a`H\u0010&_\u0000\b6\u0013\u0000\u0005%:rs٬\u0000H~\f/\u0003?\u0003\u0019\u0005|\u001bd2\r<\u001a'283N(\tu#6/\u00002O\fZM~\u0014Lbo1+\tm{/$i\u0000:(s,kT\u001e@_6(\u0000\u001f\u0001@\u0012@\u0002\u0019䃌[\u0004 \u0004(\t:\u0001'Ф\u0004\nd\u00169#AM`\u0004 D?\t\nȬtl\u001b\u001aӗPD'/\u0016\u0013?\u0006b$\u0002\u000b\u0018gT\"u3'0j\u0000Q\u001a#z\u0002`b\u0001t\u0001\u00127\u0000Me\b@\bNL \u0000$\u0003(Y5\u0002Z$`\u0004wݣ\t״:|,*\\|(Lp6y6T^|$%\u0006\u0000}\r\u0001\u0004(\u0011\u0016m&\u0010R\u0007>i8\u0006:#\u0005%\u0002pW8äL雧;\u0014kL^v|=Fm9P?\u000e}=\u0017|$ݩ^az3g\u001eih\u0014B/\u0000/ J>:d\u0001r\n\u0000\u000b\u0004'\u001e01\u00073\u0001\"i\u0017TZ\u000et\u0014]VN+*t_Ԯ!^xDBAz\u0019\u001eӝ2Wvn!-\u0010Xh\u0017Jğ\u001e\u0015wZ\u000e&\u0014_\u0000O\u0019,Pf,@F\u0005\u0007\u0002\u0018\u00018Z\u0000ta[\u0003\u0010Ńp>@>݁/{sXV/ck\u0018ukO\u0013%s\u0015go\"-?9x7ާ(z9\u0016w\u0003\u0019\u0003שl.w\\|S\u0001 qO+9dS[o\r`2N\u0003l-'w୴\u000e\u00173|l\u001dJ`x~JFK)N*muh1^\u0017mR/\u0019<\f2:\u0003\u000egOĪS|۔-=lښf\u0006g5e'\u0005\u0017\u0000Z \u00008@A;#6\u0000R9~\u0017+TEs7Ƶ<\u001dN\u0011n\u001eEr\u0011:\u0015\u0007t\u0013W\u001d>^\r\\ywamz;\u001f]wo,6\foɘyRQ (D*[g/߶OgGZGG|\u0007Maz,0j!nV\u0017C}G:\u0003}'M#\u0001xiތˍ +ţiCc^puM>\n\u0007\t%w\u0007Zc㔞p^|C=sN5vLqE\f'Fz\u0015uP\u001a[7`Zp~Z<\u0014\u0007kѫ׭Ys\u0010˝4\u001e\u001c\u0015s~c\u0007})|cNj0=bǯn\u00156\u000f\t5Nan˼n͹uko\u001dYRYԺhR/V.AKmHa\u00192Arf:ʧ\u0014(\u001cbÂgnkܰT|F9lA\t\u001b]BY\\5,鼹Ve\u0010\u0007\\C\u001cjʲ[-䤲|rX(\u000e\u0017X#U\u0013g$s\u0019gܝ\u0017NF\u000fϦ-b\\6,\u001c;_OdU*iNk^<N{n\u001ff\u0012aQvVk/Wjw_-eFEҟ\u0005 a90nU\u000e)\u0016f˒3>\npYot;kzY#\u001c2\u001aH?F`\u001a.n\"uks>\nJ\u0018\u000bT5.\u000e\u0017o|sOu\u001aʫF_-7\u0018\u001b\u0012eN2%6ec\u0016B=z\u000f\u0012\u0005\u0010\u0007]\\-;+W\u0010_O\u0006gK\\j\u001d_W\u001e~\no3L\u001cy2Txɠ6Yn\\Va/6gU\u0019Xįl=S,|\u000ec~<$>W\u001c>7r\u0002x6d+42jHOf!.\u001dܩoW\u0003Yd\u0003#}A\\vk0\u000b7,<믴/\u0005Ĩ%\u001332KWg)\u0011W\u00136S;\rdv#\u00157dJG1\u0005\u0014t\u001e)\u001aJZ#\u0005\u001cN\u000e,y\u0011]Fus p\u000f|arrM\u001edӡ*O\u001ez3Eղ\nMgjWBۍ-;̍.\u001a<L+M+t\u0011=ʹ-B֙:[Ww\r{5K1#Ktt\u001d\u0017\u0018fzp.{cc]XFͰ\r\u001boU\\\\\u001aTE\u0007V.\t}H\u0010V\u0011h\u0017r,ʕ3\u0004oqĴ9]j\u0001\u0012\u0004?+\u001fTs\nieT\u0010sA8:q T\u001d\u001a'G\u0018Vu\u001e+\u0016ϴ6rЬaR'8%Q\u0012\u000eS\u0013fCtsrڿ}*\u001eEژ\u0018Q\u001e\u0018擈aLjJ\fH\u001ad\u000fqsjwo;\nj\u001a㳕yGnګ-\u0016h̹g<9O\u001eZ\u000fdy20\u001c8\t\u001a\t̙YPQKU8ki$X>)\u001c=\u0014O\n5V\t\u0010c\u0002mM|ߗ'ni_\u001exGwZI\u0002\f&Z\u001d6\n\u001b.lw?'E\u000eUM\tɊv/2o+c\u0010)@$\u001a\u0010y*\u0017\u0007\u0015>^vÑj#7=ӰW\u0018\u0006Z\u0005\u001f?<\u0006\\\u0017|T_^M\u0004״V\u0012Yٵ.Z0p9KT2 NSD\u0017H,D^6Ҽ+b6h\u0012\n6;\u0003\u0004Y)fB\u001eA2jыHܛy\u0014O|\u0001 {EQW?\u001f\rgHҞ5m\u0014\u0001)*_%ԁ/®\u0005ܩ.L]>ЋQR\u0004AtB2Ɛ6nݨ\u0014]'!:!P{\u0006#qp\u0019jW 7\f|\u0015\u001d\u0012QC\u001aO<rL\u001bZo&w;A\u001eWԻi2\u0002\u000bfKl鵰.̂\u0014dy\u001fL\u000ezs}\u001e85\u0015`v\nU<\rC獌M\u0000\n\u001b\b&\u000e)L\u001c\u0007gؾuT\\\u00073p38ȟL\rpo尠_=}\b\u00181\u0015\u0005&(\u001a\u001d+\u000e\u0002r\"|\u0001q^\u00127GF\u0018\u00069El8\u0002\u001bdR\u001cq\u0016\u0006?3\u0002ϽJsMds-T6u\u001dx$bmxF\u001f㽺HP\"=@\"HL77'kܡY\u0003{Յ\u001a)\u0013aR\u001b\\\t\"b`\u0018L\u0019\u000bC:fw:Lo<:9'9bVzVKJ\u000f\u0017fU\u0000\u0005sVR۔X㫖00\u0003sF:Hb!*cxo\u0011W\rR5\u001c<RZ5k0\u0013Ѐ\u000bh\n4c\fuM9K{j\u0015 \"g6\u0001m՝&:$\u001dLy\u001d/`\u0016\u001b\u0015?W\r=\u001cQ;Y[Þ\u0016*Ren\n\u0012(Ppb#\u000f\u00048go\u001bҗu\bϧ<\u00045\u001erSk\u0013\u001cu\u0002<iaٶNΡ]lT_}hU[f4i[\u0002OYUgsڌRϿ\u0018U\rs^0~6\u0018\f\u001cqɢ%rȏ{ A\u000e\r\u0004.\u001aVc{vѴj\u0007ϬN^d\u00177vJ\u0016ZGihU~ldG$FݩzuX\u0017I\u001b\u0005h^[l\u001eڂE\n\u0001/A^\f\n@\u000fkk\u0016b*YI(\u0000\u0010Uc>Pbq+rV\u001aH=7:#^_O|kRnX\bIe,G%EMpޟ`\u001dV\u0018[/3CX\u0006X\u0006w\u000f˝>*\nމx˪$KB\u001e\u00055E\u0017\u0003\u001es1K\u000f<Vc\u0013+7]Ve^b]TJ'\u001eX\n\u0012%\u001e?vW;mUzF6k<'2\\\u0017J6\u000f 2ü\u0015lOuqXrVF>\u0010\u0010\u0006xQPzm-C\r@ӏ\u0004w\u00060L:\u0000\rRН-\u001fW7tR\u0003±DX˂o\u000b\u000f\u001a)78Y\u0016\u0002\u0001\n``\u0004BV KqhԲ48e=\u0004ƴ[i$5f7F !\\齩]yӬY\u0005,jPJ<WC\n\u0018'nӤ:\u0002l/\n$\u0005cST9'׻dn\u0007`.\u000e&R,7a+\u0001\rc&'\u00160\u0017}rQ(qM,JViPx\u0010DpgG\t\nz)(\u000eMQA0JI=}S=OQ(\u0014\u001b%x>8\u0006joq./4TM)Dߘ\u0005cwG>&D[]Esbk%`\u001c\u0014:O\u000fkg5;\u0015%j#\u001c(qM5\u001f%\u000f\u0019F7\tv\u001a/5o\u0015\\Ɖ\u0019&R\u0012و\u0001\u000eNFĐ)ѣ\u0002>E_~\u001dd\u0019t\u000bp-eKQ\"Rz\u0014>}妥!eN\u001d~6\trw>O7_#\r\n\u001f(4TH|8w:}ӗ4X\u0013ĹŹ\u0001\u000fTc`6bn?y\u0011\u001e[R\u00028\u0006\u0006!M&\u001a\u0015cǥ<Fa4K[n\u0006J\u001aqۜ@\u0003\u001fd2%]4M\u0014A7\u0005}d|q~FfF/ΏP\u00028g\tZ\u0013.8qE}#\u0015\u000f-\b\u000fX\\BѱO\u0002ɚw\u0011J/y\u0006,^\f\u000b\\\u0003\u000bXn}Q\u001dE(=zeA\u0000\"\u001f\\\u000by\u0018Ņ\"\u000bRE@8.h2\u001c&*\u0011cxzZ׷(_\u0019\u0006\u000f{S\u000eC\u001az<6crO\u001fr=BOwPϭ\u0016@w'/z:g/NQk66C4O\u0006ICV\u0003[)4\u0012\u0017^{:#79=B})Zy_زlPx7ӷMLU֋ڍK_\f\\ܮїE\u0016o>#\u000erv*qgXmCL.U%]2ݗ4J\u0002JL\u0013'-FLB\u000fH=Øa\u001e@Ԓ_݄rsYDY\u000bʯS\f7'+:p\nf;R24<\u001c\u001fcP\u000e\r\nV\u000e@wjf8+溶.g\u0010\u00174\u000b\u001d!\u0018CfK[v_Ƿ\\\u0019\ff2.ޞ?\u0019!ֵ͑VT\\\u0002}Nͱ'h\u0005g\u001aI\u001d\u0006!WU\f\u0000O\b^~'\u001e\u0005\u001bn)qS\u000fqa9NeRrqkqwB\t\u0001QYL_rd6~\u001cc=\u001fɚ:j\n}̏<\u0019ts~\u0017{yKo+ \u001a9dnּ\u001a;,!U\n+uXe\u0000\u00044Je\u001e1C󘬸.K\b\u00010\u0015\u000f<ӲW\u0005g{bnQ3koNU2؜vώn5n6?P0^UPl/W4:Z%-&7Rè\u001a\u001eS\u000f\u000fp\u001fbچ{|{\u0017߮\b\u001b\u001dDVv#TxB\u0012\u001b\u0019lǘ\u0018'\u001b~)O\u001235e\u0002VNn|s\u0012\u0005vL\u0002\u0015j\u001eW\u0016#\u0015f'JEfgjofg5?Ɉ\u0010\u0017'.\u0019gwX]XO\u0001\u001dٽX10 㰶th-\u0013(v\u0019R;v\u0011W\u0002h\u000buƜ\"r WeY=jMW#IlVR)ߥ\u001eRJ=\u0017KKC\\.ß[\u0011Z'7T=q`l:`\u0007Wcֶ*vwXI_~q\u0007\u00016Wz/2֮K/8SV{5k\u0018GSnk#)w;\u001b\u000b׎\u0015V|\u00001K\\>\u0011\u001f/H\u0018~O\u000f?\u0007oПbAs@ ^gk\ts(>^ڳ\n\u0002+\u0004u\u000bC:jqW\u001a(\u0011\ro\t5L\fmMk\u001a\u0017^\u001f\r^E\u0010\u0005p=;NZ8\u001b\u0017W\u0004l!a\u000fqt\u000e+(3>ǺSﯬU\f[h[\u001a\u001eֽR_!\u0013-:W\u001fs͎YY>aK+\u0002jT~qtXӈ:\u000f\u0006p7\u00116\u001d㶌'[.\u000b\u0019\u001f\u0012\u0012\u001fV\rˎ\u0015:N\u00121}{ineeN\u0016\u0013Yދw{.̇Vn^{fY'TSRv_D\u001b\"`8d9\u0012\u0013)3 VIڌ\tټG\u0011q*16F\u0006\u0005;=cݐ\u0017INPU.\u001b18\u001eLͲlkRw誴i\u0006\u0017)\u001c\u0017J\u0007DW4@\u001b5!romd}Ά\tlzB${nx\n\u0016Up(JpHv\nP5H/k\u0012#|j\u0011!>~q:\u001c$e\u00105\u000br+cI[Z\u001c/+u@G\u0012%|6\u001f\t.\f\u000e\u0005 ?9.\u001b\\\u0018ge\t*\u0019z3cJrBӖ\u001c\u0002\u0013Er˓\tp'}?6/b%\u0003b;\u0013\u001f\b¼\u0017ܼv*-ln}O;֘o\\\u001fEZ\u001aǨ\u0007ʝ+:\u0017Õ3\u001e\bzObK/N\u000b]c\u0005ag@Zv\f.mdB\u0007V\u001cp{ȆQxy͏\u00194fSu씩\u000b^U_\r2xz#@.t6YT*m\u000bd\u001a2\u0011DcbX\t`>_]?Sn4ϳM\u000f\u0002\u00074\u0017x\u0011z$\u0013+`\u0004|˴}eqG\u0002\u0004\u0019bЙa7q\u001a\tk08Ǹ\u0006泭YrوΡ\u0000mȩ~n/\u0007\u0016\u0014\t*u\u0010&;ί/\u0002Fi\u000e\u0013\u0006K\u0014=\u0017d\u0003\u000f\"\u0012IJNJ\u0011FٚZ\u0005:\twEU\f_Vk:k\u0013\u001fQ\u00151\u0003:?3?x7ryZ7ID̞#ضj\u0004ʪ\t/\u0010,MITڲrK9с0u!G+GLSeRFf-c\u0006F\u0013\u001bڕ>\n\u0019:\u00001c8̓\u0017dKy\u0007\u0011osfx@F\"@=D}2&\u0011G+{\u000bzЗ6}s=Wڱ4-\u0007e;օac!M}E\u001a`|!k\u0010L\u00155R-#>顅0\u0004EA\u001c\u0006&i\u001f\u0001G\u001arXd\u0007[\u001fE呲x\fv!]\u0004g{/\u001e\u0012i\u001c66W/\"}H|ʃ\u0004MG܈˄@fR\nב/٣\u001b&agYu;\u000f|å~\u001f0\u0012ss\b\u001b\u00125\u000ePZ\u0001j~\u0017\u000fT8O'z\u000by\u001e.A,/*m`LN\u00177VxriSVd,\u0010A\u001d\r3Mo8:!2yr0\u0015+\u0003\u0007v~koh8\u0003uQ)þ\u001b\f7Y\u001f;8\tTw.q\u0005y\u001fl\u0006\fupK0-Pot\u000bBď88z_\r~&f\u0003\u0012k\u0005|[2tn#<=\u001e+jM:\u001fW:X+mq9q+ykݴ]k-q[\u000f,M\u001b\u0007/y\u00119rmŜ7&aלk\u0011O\u00029j(b]\u000fo9\u0000!\u0000څ\u0012C:1w\u0011r\u0000#&l[}R <-ʯ M\r\nendstream\rendobj\r5 0 obj\r<</Intent 15 0 R/Name(Layer 1)/Type/OCG/Usage 16 0 R>>\rendobj\r32 0 obj\r<</Intent 41 0 R/Name(Layer 1)/Type/OCG/Usage 42 0 R>>\rendobj\r58 0 obj\r<</Intent 67 0 R/Name(Layer 1)/Type/OCG/Usage 68 0 R>>\rendobj\r84 0 obj\r<</Intent 93 0 R/Name(Layer 1)/Type/OCG/Usage 94 0 R>>\rendobj\r110 0 obj\r<</Intent 119 0 R/Name(Layer 1)/Type/OCG/Usage 120 0 R>>\rendobj\r136 0 obj\r<</Intent 145 0 R/Name(Layer 1)/Type/OCG/Usage 146 0 R>>\rendobj\r162 0 obj\r<</Intent 171 0 R/Name(Layer 1)/Type/OCG/Usage 172 0 R>>\rendobj\r188 0 obj\r<</Intent 197 0 R/Name(Layer 1)/Type/OCG/Usage 198 0 R>>\rendobj\r214 0 obj\r<</Intent 223 0 R/Name(Layer 1)/Type/OCG/Usage 224 0 R>>\rendobj\r223 0 obj\r[/View/Design]\rendobj\r224 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r197 0 obj\r[/View/Design]\rendobj\r198 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r171 0 obj\r[/View/Design]\rendobj\r172 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r145 0 obj\r[/View/Design]\rendobj\r146 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r119 0 obj\r[/View/Design]\rendobj\r120 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r93 0 obj\r[/View/Design]\rendobj\r94 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r67 0 obj\r[/View/Design]\rendobj\r68 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r41 0 obj\r[/View/Design]\rendobj\r42 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r15 0 obj\r[/View/Design]\rendobj\r16 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r241 0 obj\r[240 0 R]\rendobj\r265 0 obj\r<</CreationDate(D:20171220150331-08'00')/Creator(Adobe Illustrator CS5)/ModDate(D:20171220162736-08'00')/Producer(Adobe PDF library 9.90)/Title(Print)>>\rendobj\rxref\r\n0 266\r\n0000000004 65535 f\r\n0000000016 00000 n\r\n0000000284 00000 n\r\n0000053705 00000 n\r\n0000000006 00000 f\r\n0001092560 00000 n\r\n0000000008 00000 f\r\n0000053756 00000 n\r\n0000000009 00000 f\r\n0000000010 00000 f\r\n0000000011 00000 f\r\n0000000012 00000 f\r\n0000000013 00000 f\r\n0000000014 00000 f\r\n0000000017 00000 f\r\n0001094151 00000 n\r\n0001094182 00000 n\r\n0000000018 00000 f\r\n0000000019 00000 f\r\n0000000020 00000 f\r\n0000000021 00000 f\r\n0000000022 00000 f\r\n0000000023 00000 f\r\n0000000024 00000 f\r\n0000000025 00000 f\r\n0000000026 00000 f\r\n0000000027 00000 f\r\n0000000028 00000 f\r\n0000000029 00000 f\r\n0000000030 00000 f\r\n0000000031 00000 f\r\n0000000033 00000 f\r\n0001092630 00000 n\r\n0000000034 00000 f\r\n0000000035 00000 f\r\n0000000036 00000 f\r\n0000000037 00000 f\r\n0000000038 00000 f\r\n0000000039 00000 f\r\n0000000040 00000 f\r\n0000000043 00000 f\r\n0001094035 00000 n\r\n0001094066 00000 n\r\n0000000044 00000 f\r\n0000000045 00000 f\r\n0000000046 00000 f\r\n0000000047 00000 f\r\n0000000048 00000 f\r\n0000000049 00000 f\r\n0000000050 00000 f\r\n0000000051 00000 f\r\n0000000052 00000 f\r\n0000000053 00000 f\r\n0000000054 00000 f\r\n0000000055 00000 f\r\n0000000056 00000 f\r\n0000000057 00000 f\r\n0000000059 00000 f\r\n0001092701 00000 n\r\n0000000060 00000 f\r\n0000000061 00000 f\r\n0000000062 00000 f\r\n0000000063 00000 f\r\n0000000064 00000 f\r\n0000000065 00000 f\r\n0000000066 00000 f\r\n0000000069 00000 f\r\n0001093919 00000 n\r\n0001093950 00000 n\r\n0000000070 00000 f\r\n0000000071 00000 f\r\n0000000072 00000 f\r\n0000000073 00000 f\r\n0000000074 00000 f\r\n0000000075 00000 f\r\n0000000076 00000 f\r\n0000000077 00000 f\r\n0000000078 00000 f\r\n0000000079 00000 f\r\n0000000080 00000 f\r\n0000000081 00000 f\r\n0000000082 00000 f\r\n0000000083 00000 f\r\n0000000085 00000 f\r\n0001092772 00000 n\r\n0000000086 00000 f\r\n0000000087 00000 f\r\n0000000088 00000 f\r\n0000000089 00000 f\r\n0000000090 00000 f\r\n0000000091 00000 f\r\n0000000092 00000 f\r\n0000000095 00000 f\r\n0001093803 00000 n\r\n0001093834 00000 n\r\n0000000096 00000 f\r\n0000000097 00000 f\r\n0000000098 00000 f\r\n0000000099 00000 f\r\n0000000100 00000 f\r\n0000000101 00000 f\r\n0000000102 00000 f\r\n0000000103 00000 f\r\n0000000104 00000 f\r\n0000000105 00000 f\r\n0000000106 00000 f\r\n0000000107 00000 f\r\n0000000108 00000 f\r\n0000000109 00000 f\r\n0000000111 00000 f\r\n0001092843 00000 n\r\n0000000112 00000 f\r\n0000000113 00000 f\r\n0000000114 00000 f\r\n0000000115 00000 f\r\n0000000116 00000 f\r\n0000000117 00000 f\r\n0000000118 00000 f\r\n0000000121 00000 f\r\n0001093685 00000 n\r\n0001093717 00000 n\r\n0000000122 00000 f\r\n0000000123 00000 f\r\n0000000124 00000 f\r\n0000000125 00000 f\r\n0000000126 00000 f\r\n0000000127 00000 f\r\n0000000128 00000 f\r\n0000000129 00000 f\r\n0000000130 00000 f\r\n0000000131 00000 f\r\n0000000132 00000 f\r\n0000000133 00000 f\r\n0000000134 00000 f\r\n0000000135 00000 f\r\n0000000137 00000 f\r\n0001092917 00000 n\r\n0000000138 00000 f\r\n0000000139 00000 f\r\n0000000140 00000 f\r\n0000000141 00000 f\r\n0000000142 00000 f\r\n0000000143 00000 f\r\n0000000144 00000 f\r\n0000000147 00000 f\r\n0001093567 00000 n\r\n0001093599 00000 n\r\n0000000148 00000 f\r\n0000000149 00000 f\r\n0000000150 00000 f\r\n0000000151 00000 f\r\n0000000152 00000 f\r\n0000000153 00000 f\r\n0000000154 00000 f\r\n0000000155 00000 f\r\n0000000156 00000 f\r\n0000000157 00000 f\r\n0000000158 00000 f\r\n0000000159 00000 f\r\n0000000160 00000 f\r\n0000000161 00000 f\r\n0000000163 00000 f\r\n0001092991 00000 n\r\n0000000164 00000 f\r\n0000000165 00000 f\r\n0000000166 00000 f\r\n0000000167 00000 f\r\n0000000168 00000 f\r\n0000000169 00000 f\r\n0000000170 00000 f\r\n0000000173 00000 f\r\n0001093449 00000 n\r\n0001093481 00000 n\r\n0000000174 00000 f\r\n0000000175 00000 f\r\n0000000176 00000 f\r\n0000000177 00000 f\r\n0000000178 00000 f\r\n0000000179 00000 f\r\n0000000180 00000 f\r\n0000000181 00000 f\r\n0000000182 00000 f\r\n0000000183 00000 f\r\n0000000184 00000 f\r\n0000000185 00000 f\r\n0000000186 00000 f\r\n0000000187 00000 f\r\n0000000189 00000 f\r\n0001093065 00000 n\r\n0000000190 00000 f\r\n0000000191 00000 f\r\n0000000192 00000 f\r\n0000000193 00000 f\r\n0000000194 00000 f\r\n0000000195 00000 f\r\n0000000196 00000 f\r\n0000000199 00000 f\r\n0001093331 00000 n\r\n0001093363 00000 n\r\n0000000200 00000 f\r\n0000000201 00000 f\r\n0000000202 00000 f\r\n0000000203 00000 f\r\n0000000204 00000 f\r\n0000000205 00000 f\r\n0000000206 00000 f\r\n0000000207 00000 f\r\n0000000208 00000 f\r\n0000000209 00000 f\r\n0000000210 00000 f\r\n0000000211 00000 f\r\n0000000212 00000 f\r\n0000000213 00000 f\r\n0000000000 00000 f\r\n0001093139 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0001093213 00000 n\r\n0001093245 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000056145 00000 n\r\n0001094267 00000 n\r\n0000054122 00000 n\r\n0000446323 00000 n\r\n0000056451 00000 n\r\n0000056337 00000 n\r\n0000054801 00000 n\r\n0000055580 00000 n\r\n0000055630 00000 n\r\n0000056219 00000 n\r\n0000056251 00000 n\r\n0000056488 00000 n\r\n0000446399 00000 n\r\n0000446787 00000 n\r\n0000447842 00000 n\r\n0000472641 00000 n\r\n0000538231 00000 n\r\n0000567840 00000 n\r\n0000633430 00000 n\r\n0000699020 00000 n\r\n0000764610 00000 n\r\n0000830200 00000 n\r\n0000895790 00000 n\r\n0000961380 00000 n\r\n0001026970 00000 n\r\n0001094294 00000 n\r\ntrailer\r\n<</Size 266/Root 1 0 R/Info 265 0 R/ID[<A1283DCBDA2FBD4C9C5A2308D54143F7><33C6E19BB2EE4C4EBD47AF4749AB4528>]>>\r\nstartxref\r\n1094464\r\n%%EOF\r\n"
  },
  {
    "path": "doc/assets/logo_with_name.ai",
    "content": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[7 0 R 35 0 R]/Order 36 0 R/RBGroups[]>>/OCGs[7 0 R 35 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 42168/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 5.6-c145 79.163499, 2018/08/13-16:40:22        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:stFnt=\"http://ns.adobe.com/xap/1.0/sType/Font#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">Web</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n         <xmp:CreatorTool>Adobe Illustrator CC 23.0 (Windows)</xmp:CreatorTool>\n         <xmp:CreateDate>2020-06-26T16:25:11-07:00</xmp:CreateDate>\n         <xmp:ModifyDate>2020-06-26T16:33:18-07:00</xmp:ModifyDate>\n         <xmp:MetadataDate>2020-06-26T16:33:18-07:00</xmp:MetadataDate>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>56</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAOAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qxHz7+Zvl3ybbKLxj&#xA;c6nMP9F0yChlfsC38i1/aP0A4DKnE1WshhG/PueM6z+ZX5m+YnYi9Hl6wb7FrZj99Ttyl+3X5MPl&#xA;lRyPOajtnJI+k0PL9bHZdCnv5AL7Ur6+lkIUmadnqTt+1U7/ADyHEXXHVZJmrRN9+WenWsPqrzlQ&#xA;f3lGII9++2Et+bFkgLBtryJ5L0K//MvR9KuojLYOktxPC5JEhiR2VT/k8lFfEbYYblv7LiMuQCXJ&#xA;9WoiIioihUUBVVRQADYAAZe9i3irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirEvzO89xeTfLMl+qCbUbhvq+m253DzMDRmA34oNz93fBI04us1Iwwvr0fPFraXk97&#xA;NrGsTNeazdt6k88m5Un9lewoNttuw2zHJt4jUaiWSRJLItBtYp7tvVUOiJXiRUVqAMQz0eMSlum9&#xA;zpMBuYbqICNonVnUbKVB6/MYac6emHEJDaiwvzl5zN0X03TH/wBG+zPcL/uz/JU/y+/f5dQS4+p1&#xA;N+mPJFflPd3S/mh5aluQymRbqAsRu6/V5OPX/KI3yWPm5HY5rMPx0fUuXvYPnT8wfPvmvzP5vl8u&#xA;6DNLDZx3BtLW2t39Np5EbiXkcFagsKgE8QN+u+Y8pEmg81rNXky5OCHK626qcv5CfmDbwfXYprSS&#xA;6QeosMU8gn5jegZkROVf8v6cfDKD2TmAsVfv3R35Sfmbr9p5ht/Lmt3Et1ZXUn1aL6wS0sE32UUM&#xA;3xcS3w8T07e5hM3RZ9n66YmITNg7e59A5e9Gll75p8s2Fwba+1eytbgbmGe4ijelafZZge2Cw1Sz&#xA;44mjIA+9MYpopo1lhdZI2+y6EMp+RGFsBB5LsUpVJ5s8rRXX1STWbFLsMF+rtcwiTkeg4FuVTXBx&#xA;BpOoxg1xRv3hNFZXUOhDKwqrDcEHoQcLc53REZ3YKiglmJoABuSScVJS+z8y+XL26NpZ6rZ3N0ta&#xA;28NxFJIKGh+BWLbYLDVHPCRoSBPvfN8//k7x/wCBEn/UYMx/4vi8yf8AG/8Akp/vnvH5l+b5PKnl&#xA;SfUoFDXkjrb2YYVX1ZKnk3+qqs30ZfOVB6DW6jwcZkOfR5dpX5T+dfOtjDrPmPXngW8UT28MitcM&#xA;FbdD6fOKOMFTUBenhlQgTzdTj7Py5xxTlz+LWr/lr568g2T655e11rm2sv3tzCitCeG3JmhLSxyK&#xA;KfFU++JgY7hcmizacccJWB+OT1j8v/Nq+avK9tqpQR3BrFdxr9lZo9mp7HZh7HLYysO40eo8XGJd&#xA;erI8k5LsVdiqG1DVNN06H19Qu4bODp6txIkSVrT7TkDvgJYTyRiLkQGtP1bS9SiM2nXkF7ENjJby&#xA;JKoPzQkdsQVhkjLeJBRWFmll95o8tafP6F/q1laTjf0p7iKJ6f6rsDgJDVPPjiaMgPimMUsUsayR&#xA;Oskbbq6kMpHsRhbAb5LsUvAPzxv31D8x9K0upa30uyNyU7etM5qfuWPKsheZ7dyniEfL71VNEsPq&#xA;yxPGCwHxSDZq+NchTijSQ4aIUtM017G7mqeULrVH+R6HEBjp8BxyPcw/zn5zN0X03TX/ANG+zcXC&#xA;/wC7PFVP8vie/wAuoJadTqb9MeSTeX9RkE62jjmj14N3Wgr92BwJBl3khGl/NryvGm7Kblz/AKog&#xA;c/8AGuThzdp2OP3w/HQvprL3s3zl+Y/5e+aPLnmmbzDokU0tjLcG7t7m2BZ7eR25lHVakAMdj0I9&#xA;9sx5xINh5nW6PJiyGcOV3t0VNG/5yF822gVNTtbbUoxTk9DBKelfiSsfY/7r6/dhGUpx9sZB9QEv&#xA;s/HyZ35H85fll5q1VeOiWlh5hZzcIJreAySSg8y8U4WrOD8W9G75OMgXYaXU4MsvpAn7h96788fP&#xA;F95f0W20/TZTBf6oXDToaPHBGBz4nszFgAfnjklQT2pqjjgIx5yYp5F/I3Ttd8tQ6xrF/cR3N+pl&#xA;t47coAikni0nNXLlvtbUyMcdhw9L2XHJj4pE2Up8m6xrH5e/mM3lq7ufW02S5S1uU3EdJqelOqmv&#xA;A0dS3tUb7ZGJ4TTTpsktNn8Mn03X7WT/AJ+eedQsWt/LWnTNB9Yi9fUJUJDMjEqkQI6A8SW8dvfJ&#xA;ZJdHL7W1Uo1jj15qWjf8486ddeXIZ73Up4tYuIRKvphDbxs4DBWQrzenQkOMRi2Y4+x4mFkniPyS&#xA;z8mvNWraJ5vk8m6lMZLSSSa3SNmLLDcw8q8CeivwK08aHxwY5UaauzdRLHk8KXL7i1+ffnLULjXR&#xA;5XtZWSytUja7iQ09WaQB1DU6hVZaDx+jHJLel7W1MjPwxyHNOdN/5x3tBosctxqlxB5g4CRXi4C3&#xA;il2IWnH1G4n9oOPGmEYtm+HY44N5Hj+x5joA1Afmdpi6k5k1BNat1u3bcmVbpQ5J2/aGVj6nVYeL&#xA;xxxc+MX830Z+ZHk9vNnlabTIpFiu0dbizd68PVSoAanZlYrXtWuZE42HpdbpvGx8I59Hm+l/md54&#xA;8k2cGkeafL8ktrZKsEV4C0Z9NKKv7ykkUtBsKEV8crEyOYdZj12XABHJDYdfxsWVaT+eH5f6yv1S&#xA;+Mlh66mOSO9jDQsGFGUshkXiakfHT3yQyAuXj7Uwz2O3vZnBoXl86NPp9jaW8Gl38bepHaJHHFIs&#xA;ycSw9MBTySm+ToOcMUOExAHCe55f+R95caLr2v8Akq9b97bStPb12qYyI5CB/lLwYe2V49jTqey5&#xA;GE5Yj0T389vMDab5MOnwk/WtXlFuoH2vSX45SPnQL/ssOQ7OR2rm4cXCOctkn87eXR5e/ItNLIpN&#xA;F9We5/4zSTK8n3M1B7YJCotOqw+HpOH3fes/Lz8ttO8zeXNP1vzW0l+TAtvp1kJHihgtoB6SUEZV&#xA;uTcOR3xjCxZRo9FHLATyb7bDuASTzHocf5c/mTodzoEkkWn6i6CS1ZmYcDII5Y6ndl4sCvKpByJH&#xA;CdmjNi/LZ4mHKTNfzv8AOV/oHl63s9NkMN/qrtGsyGjpFGAZClOjEsq19/HJ5JUHO7U1JxwAjzko&#xA;eXfyJ8pxaQn6dilvtWnQPczmaRBHIwqwjEbKDxJ6tyr19sRjHVjh7KxiPr3kgPy48t+cvKXnq/0Z&#xA;IZ7nym5fjdSUESngJIpFqRV9/TfgOvy2EAQfJr0WHLhzGO5x/j+x67lruXzn+Z4YfnHe8jWthAU7&#xA;UX4AR7775Tk5vJ9tf3vyZCSACSaAbknA3POPOPnNrxn0/TnIsxtNMuxl9h/kfr+WRJdZqNTxbR5J&#xA;LpFtpd5+6lVluBuKMaMPb3wOCbTy00uxtW5xR0elOZJJ/HFjbMvyK0h9W876j5jK1sdKg+p2snZp&#xA;5ftFT/kpy/4IZbjD0vYenNmR6fpe9zNIkMjxp6kiqSkdePJgNhXelctejPJ5D5X/AD3udU82W2l6&#xA;lYwaZYTvJE0jOzyJJ/upWc8FHxDifh6ntlQyWXTYO1TPIIyAiHpWr+UPK+sBv0npVtdO1ayvGol3&#xA;60kADj6DlhiC7TJp8c/qiC+X/MNtaaH5/uIfLkrSw2N4n1Bw3IiRSp4hh14yVWvtmMdjs8pmiMeY&#xA;iHQ7M+/5yRt5hq2i3BB9F4JY1Pbkjgn8HGTyuw7aB4onyQvlX8iIfMHl6x1iLzAIlvIw5iFrz4MC&#xA;VZOXrLXiwI6YjHY5scHZQyQEuLn5ftR9h+Qul/pFUt/N8E11bTUeCO3QyLJHRmQgXBKsB122wjH5&#xA;tkOyY8W2QWPL9rHvz9t5o/PzSODwntYXiJ6UHJDT/ZKcjl5uN2sCM3wDILD/AJx1hvbG3vIfMgaG&#xA;5iSaMizqCrqGFD6/vkhi83Ih2MJAET5+X7Ud5O/JjS7PX7DVrHzXBqJsZhOYYIUPIRNRl5LO9N/h&#xA;O2Mce/Ns03ZsYzEhMSry/awb81lax/Na+nnBEfrW06nxT04zt9xGQn9Tga/06gk+T6fjkSSNZI2D&#xA;o4DIwNQQdwQcyXqwbfLa3dvefnPDdW5DQS+YI2jYdGX62KMPn1zG/i+LyfEJaqx/P/S9n/Nnz55g&#xA;8n2+mXem21vPa3MkkV21wsjFWAVowhR0pyHPrXpl05EO77Q1c8IBiBRZtp2oWepWEF9aSCW1uo1k&#xA;icbgqwr/ALeTBc+ExIAjkWMecPy98kappd3NfWFvaSRxPIdQhRYZI+KfbZk48goXo1RkJRBcTU6P&#xA;FOJJAHmxj/nHfUr658sX1pOxe3srkC1Lb8RIvJkHsDv9ORxHZxex5k4yDyBQH5mxt5V/MzQvOMI4&#xA;2t2whvyOlUHpSE/OBxT/AFcE9jbXrh4OeOUcjz/Hub1unnH87LHTVPqaZ5ejE01N1LJSRvvkaND8&#xA;sJ3kuX99qhH+GH4/Uyb88/8AyXF//wAZbf8A5PLksnJyu1P7g/D702/K/wD8l/oX/MKv6zhhybtD&#xA;/cx9zAPz0/5Svyh/xlb/AJPRZXk5h13av95j/HUKf/OQytDqXlm9deVtG0wfuKq8TEH5jHL0R2xt&#xA;KB6b/oe1RyJJGskbB0cBkYGoIO4IOXO9Btjl1+YHly182R+Vp3kXVJeHp0QtGWkBZV5LUg0Hcd8j&#xA;xC6cWWrgMnhn6mSZJynz1+cUf1f83IZKU+saVE+3eksi7/8AIvKcjy3bgrID5D9LG/OOv6lfF9P0&#xA;6GUWY2mmCkGX2H+R+v5ZAl12p1PF6Y8mILpOpN0t3+kU/XgcO0bYaReQXCXNzxt4YTzd2YdB9OK3&#xA;bIdA0LXvPWoHTNBUxacjAajq7giONT1VenJiOi9T7DfJxjbsND2fPLJ9KeVfLGleWNDttG0xCttb&#xA;jd2oXkc7tI5FKsxy4CnscOGOOIjFNsLa8d/MX8jJdV1ObV/LksUM1yxkubGaqIZD9p43AanI7lT3&#xA;79sqljvk6XWdlGcuKHXoxL/lXn55CD9Hhrz6j/d+l+kY/R41/k9b7PenHIcMnD/J6uuHev637WWf&#xA;lz+RtxpWqQ6x5imikmtWElrYwkuokU1V5HIH2TuFH39snDHXNzNH2WYSEp9OjP8Az75JsfN+htp1&#xA;w/oTxt6tndAVMcgBG42qpBoRk5RsOw1elGaHCfg8m07yR+eflZZtP0CUSWMpLEwzWzR1O1VW64sj&#xA;EDqoGVCMhydPDS6vF6Ycvh+lOfy8/JbU7TW4/MHmqVJLmGT14bRW9VmnJ5epNJ0JVt6CtT3yUce9&#xA;lv0fZkhPjyc+79bMPzN/Le285afD6cotdUs+X1W4YEoVanKOSm/E02PbJThbm67RDPHukHmtp5S/&#xA;PzSNPfQ9Odv0YQUUxz2vFVbr6bylZkG/7NMr4ZDZ1cdPrIR4I/T7x/ayv8rPyek8t3o1rWpI5tTV&#xA;WW1giqyQ8hRnLEDk5UkbCg9+04QrcuZoOzvCPHP6ky/NX8rl83wxXthIlvrNqhRGkrwmjqSI3IqV&#xA;IJPE+/3M4W2a/QeMLG0gwfSvJ/58pp/+HVufqWj0MXqSTW7BYyQKI6epcKtOiim22QEZcnAx6bWc&#xA;PBdR94/tQmmfk35x0jz1ps9vZm50ixvrSVr8ywLyjjdHlf0zJzA2ai0r88RjILGHZuWGYEC4iQ32&#xA;e3+aPLWm+ZNFuNJ1BSYJwCrrs8brurofFTlxFh3ufBHLAxk8fi/Ln84fKU0ieVdSF1YlqxxpJGoN&#xA;ajk0Fz+6DeNCcq4JDk6YaLU4T+7Nj8dDs3ceSPzw81gWnmO/FnYVAkV5IQrAb19Kz+Fz/rY8MjzU&#xA;6XV5tpmh8P0PWfJ/lPTfK2hxaVYVZVJeedvtSysBydqdOlAOwy2MaDuNNp44ocIST85NItdS/L/U&#xA;TOyo9iFu7eRu0kZpT5urFR88jkGzj9pYxLCb6bse/wCcftCli0S+8w3VWudVmKRyPuTFCTyap/mk&#xA;LV/1cjiG1uP2RiqBmecmUfmtoOra75Ku9N0qD6zeyyQskXNEqEkVm+KQqvQeOSmLDla/FLJiMYiy&#xA;mPkPTL7SvJ+k6dfxejeW0CxzxclbiwJ25IWU/QcMRQbdJAwxRieYDEPzX8neZNe8weXLvSrP6zb2&#xA;Eha7f1Ik4AyRt0kZSdlPTIziSQ4XaGmnknAxFgMt88eTbDzboUml3TGKQMJbW5UVMUqggNTuKGhH&#xA;hkpRsOZqtMM0OEvP9Ptfz58t2I0extLLWLOFeFrdySJyjQVCqvOW3bbtzVqdOm2QHEHXQjrMQ4QB&#xA;Id/4ITb8vfyx1XTten81eabpLzXpuRiVDyWMuOLOWoo5cfhAAoo/AxhvZbtHoZRmcmQ3N6VljtHh&#xA;vnf8s/zR8x+cZ9fjXTYIxGLazgeZ2KQISRyIjHxEkk/OmVyiS6LW9n5c87NV70nH5Q/m6ZChXTFU&#xA;DaQyvxP3At+GR8Nwf5DyeXzREH5KfmpO1Jr/AEu0ToWUyyN8wvpEfecfDZx7Cn1IZFov/OOul+sk&#xA;/mfV7jWCpr9VjH1eCvgaFnP+xK5MQDn4OxscfqN/Y9X03TNO0uyisdOto7SzhHGKCFQiAfIePc5N&#xA;28ICIoCgicWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeReYdD/OLzfKdC1WCz0zQP&#xA;WrNeQspM0cb1QlBLM5O3ILRRXrlREjs6bNi1Ob0SAjDv/BL1PS9NtNL02206zTha2kawwr34oKbn&#xA;uT3OWAU7bHAQiIjkEVhZuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/9k=</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>\n         <xmpMM:DocumentID>xmp.did:43e6085a-bbfe-3a4e-bfe5-da7b5cd28e12</xmpMM:DocumentID>\n         <xmpMM:InstanceID>uuid:fc863ea5-5425-4900-821f-65a25b0f3556</xmpMM:InstanceID>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>xmp.iid:2a798eab-c75d-1145-b1f9-a50de0f99ddf</stRef:instanceID>\n            <stRef:documentID>xmp.did:2a798eab-c75d-1145-b1f9-a50de0f99ddf</stRef:documentID>\n            <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>\n            <stRef:renditionClass>proof:pdf</stRef:renditionClass>\n         </xmpMM:DerivedFrom>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:2a798eab-c75d-1145-b1f9-a50de0f99ddf</stEvt:instanceID>\n                  <stEvt:when>2020-06-26T16:23:27-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CC 23.0 (Windows)</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:43e6085a-bbfe-3a4e-bfe5-da7b5cd28e12</stEvt:instanceID>\n                  <stEvt:when>2020-06-26T16:25:11-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CC 23.0 (Windows)</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n         <illustrator:StartupProfile>Web</illustrator:StartupProfile>\n         <illustrator:Type>Document</illustrator:Type>\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>600.000000</stDim:w>\n            <stDim:h>150.000000</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:Fonts>\n            <rdf:Bag>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>ArialMT</stFnt:fontName>\n                  <stFnt:fontFamily>Arial</stFnt:fontFamily>\n                  <stFnt:fontFace>Regular</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 7.00</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>arial.ttf</stFnt:fontFileName>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>Arial-BoldMT</stFnt:fontName>\n                  <stFnt:fontFamily>Arial</stFnt:fontFamily>\n                  <stFnt:fontFace>Bold</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 7.00</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>arialbd.ttf</stFnt:fontFileName>\n               </rdf:li>\n            </rdf:Bag>\n         </xmpTPg:Fonts>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n               <rdf:li>Black</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Red</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Yellow</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Green</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Cyan</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Blue</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>RGB Magenta</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>193</xmpG:red>\n                           <xmpG:green>39</xmpG:green>\n                           <xmpG:blue>45</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>237</xmpG:red>\n                           <xmpG:green>28</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>241</xmpG:red>\n                           <xmpG:green>90</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>247</xmpG:red>\n                           <xmpG:green>147</xmpG:green>\n                           <xmpG:blue>30</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>251</xmpG:red>\n                           <xmpG:green>176</xmpG:green>\n                           <xmpG:blue>59</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>252</xmpG:red>\n                           <xmpG:green>238</xmpG:green>\n                           <xmpG:blue>33</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>217</xmpG:red>\n                           <xmpG:green>224</xmpG:green>\n                           <xmpG:blue>33</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>140</xmpG:red>\n                           <xmpG:green>198</xmpG:green>\n                           <xmpG:blue>63</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>57</xmpG:red>\n                           <xmpG:green>181</xmpG:green>\n                           <xmpG:blue>74</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>146</xmpG:green>\n                           <xmpG:blue>69</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>104</xmpG:green>\n                           <xmpG:blue>55</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>34</xmpG:red>\n                           <xmpG:green>181</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>169</xmpG:green>\n                           <xmpG:blue>157</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>41</xmpG:red>\n                           <xmpG:green>171</xmpG:green>\n                           <xmpG:blue>226</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>113</xmpG:green>\n                           <xmpG:blue>188</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>46</xmpG:red>\n                           <xmpG:green>49</xmpG:green>\n                           <xmpG:blue>146</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>27</xmpG:red>\n                           <xmpG:green>20</xmpG:green>\n                           <xmpG:blue>100</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>102</xmpG:red>\n                           <xmpG:green>45</xmpG:green>\n                           <xmpG:blue>145</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>147</xmpG:red>\n                           <xmpG:green>39</xmpG:green>\n                           <xmpG:blue>143</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>158</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>93</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>212</xmpG:red>\n                           <xmpG:green>20</xmpG:green>\n                           <xmpG:blue>90</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>237</xmpG:red>\n                           <xmpG:green>30</xmpG:green>\n                           <xmpG:blue>121</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>199</xmpG:red>\n                           <xmpG:green>178</xmpG:green>\n                           <xmpG:blue>153</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>153</xmpG:red>\n                           <xmpG:green>134</xmpG:green>\n                           <xmpG:blue>117</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>99</xmpG:green>\n                           <xmpG:blue>87</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>83</xmpG:red>\n                           <xmpG:green>71</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>198</xmpG:red>\n                           <xmpG:green>156</xmpG:green>\n                           <xmpG:blue>109</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>166</xmpG:red>\n                           <xmpG:green>124</xmpG:green>\n                           <xmpG:blue>82</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>140</xmpG:red>\n                           <xmpG:green>98</xmpG:green>\n                           <xmpG:blue>57</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>117</xmpG:red>\n                           <xmpG:green>76</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>96</xmpG:red>\n                           <xmpG:green>56</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>66</xmpG:red>\n                           <xmpG:green>33</xmpG:green>\n                           <xmpG:blue>11</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Grays</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>26</xmpG:red>\n                           <xmpG:green>26</xmpG:green>\n                           <xmpG:blue>26</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>51</xmpG:red>\n                           <xmpG:green>51</xmpG:green>\n                           <xmpG:blue>51</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>77</xmpG:red>\n                           <xmpG:green>77</xmpG:green>\n                           <xmpG:blue>77</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>102</xmpG:red>\n                           <xmpG:green>102</xmpG:green>\n                           <xmpG:blue>102</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>128</xmpG:red>\n                           <xmpG:green>128</xmpG:green>\n                           <xmpG:blue>128</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>153</xmpG:red>\n                           <xmpG:green>153</xmpG:green>\n                           <xmpG:blue>153</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>179</xmpG:green>\n                           <xmpG:blue>179</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>204</xmpG:red>\n                           <xmpG:green>204</xmpG:green>\n                           <xmpG:blue>204</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>230</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>242</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Web Color Group</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>63</xmpG:red>\n                           <xmpG:green>169</xmpG:green>\n                           <xmpG:blue>245</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>122</xmpG:red>\n                           <xmpG:green>201</xmpG:green>\n                           <xmpG:blue>67</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>147</xmpG:green>\n                           <xmpG:blue>30</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>29</xmpG:green>\n                           <xmpG:blue>37</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>123</xmpG:green>\n                           <xmpG:blue>172</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>189</xmpG:red>\n                           <xmpG:green>204</xmpG:green>\n                           <xmpG:blue>212</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n         <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\r\nendstream\rendobj\r3 0 obj\r<</Count 1/Kids[9 0 R]/Type/Pages>>\rendobj\r9 0 obj\r<</ArtBox[18.9115 11.6484 582.775 129.454]/BleedBox[0.0 0.0 600.0 150.0]/Contents 37 0 R/CropBox[0.0 0.0 600.0 150.0]/LastModified(D:20200626163318-07'00')/MediaBox[0.0 0.0 600.0 150.0]/Parent 3 0 R/PieceInfo<</Illustrator 38 0 R>>/Resources<</ColorSpace<</CS0 39 0 R>>/ExtGState<</GS0 40 0 R>>/Font<</TT0 33 0 R/TT1 34 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 35 0 R>>>>/Thumb 41 0 R/TrimBox[0.0 0.0 600.0 150.0]/Type/Page>>\rendobj\r37 0 obj\r<</Filter/FlateDecode/Length 708>>stream\r\nHUMo\u00141\fW\bxcv8\u0015THBR\u0004yf.EB\u0001̌\u0013ٻ>ٻ=HJ\u0012E~\u0015>]\u000f\u0007J,UTZ\u0011\u00190y\b\u0004#~BZX\u0015欬U\u001aͷ\ra<\nEN6Fb,֨e4ܸ5\u001cSRLb3apn<WRW39SO\n+\u001c\u0001*.GeN[8ut\\İj<'sޗ\u0007\u001e\u0013\u0014akF\u0004\u001eC\u0004\u0002\u0013iAo!\nK6g\u001an\u0007J?BdbʓqN`rI\u0015\u0001PA^\"\u0002GH\bU:\u0006h\u0006@A\u0003\b\u000f\u0019\u0001u\u0003sy\t54E\u0013\\p\u000b\u0012*+[:Z\"\n6\nw6\t̃kspP\u001c3\u0010T\u0006p8ÏrG_A\"D\u0004`\u0004k\u001e'z.\u0010Qu+x\u0018\u0001!Zp\u001c\\O\u0015\u0019\u0003CuEmbU\"L\u000bݧf'NhE\u001cS.ZP\\\u0015A\"y\u0017\u0019\u000e\u0005I_x.-V<si8\u000e`[Lo^cEAO\u0003IN\u00154y\u0005=\n\u0019\u0001\"^K^\u0010\u0019\u000f\u0006Q\u0007\n\u001f\u0006\u0006w2\r-$=3L\u001f\u001c\u0019[rC£l\u0015\u001d>r?Ǚ{+Y݄s\u0013\u000e2M'<նhiRsɳÀ\b*Q2&^CKA8k69\\]}~;}^|sx\u0014/K\u0001\u0000T\u0010A\r\nendstream\rendobj\r41 0 obj\r<</BitsPerComponent 8/ColorSpace 42 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 18/Length 294/Width 75>>stream\r\n8;Z,#5n:gU#^jIYi%^bo,sD&@rLr+O!O\\B'a_n\\Fc!i(qJ70;L>(>;\"p)P!q*1fM@\n8k^t)`/g#^LQpO:AH`*?<loc-jWpZGZ\"iA@(M/25qd8G3'^$/?jeQ)McjL!-V\"#Rc\nI=L;6o2^'%Q)'2OD/^e@:*el5\\L*%m0BpetK-liIe>C*$OPjC_h5`;PQ/Dp)\\F'/;\nG>;#>.Qfdo7b3KK+c^e6V0nAFZL<Z/B33DZo0on\\^0oth`laPh=^k=QMET8?l6H`f\n]-%%1\\%/P-\\$pp+OoF-B!s%:XT[a~>\r\nendstream\rendobj\r42 0 obj\r[/Indexed/DeviceRGB 255 43 0 R]\rendobj\r43 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\r\nendstream\rendobj\r35 0 obj\r<</Intent 44 0 R/Name(Layer 1)/Type/OCG/Usage 45 0 R>>\rendobj\r44 0 obj\r[/View/Design]\rendobj\r45 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>\rendobj\r33 0 obj\r<</BaseFont/CANTDO+Arial-BoldMT/Encoding/WinAnsiEncoding/FirstChar 83/FontDescriptor 46 0 R/LastChar 101/Subtype/TrueType/Type/Font/Widths[667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 556]>>\rendobj\r34 0 obj\r<</BaseFont/MCLBNU+ArialMT/Encoding/WinAnsiEncoding/FirstChar 83/FontDescriptor 47 0 R/LastChar 121/Subtype/TrueType/Type/Font/Widths[667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 500]>>\rendobj\r47 0 obj\r<</Ascent 1040/CapHeight 716/Descent -325/Flags 32/FontBBox[-665 -325 2000 1040]/FontFamily(Arial)/FontFile2 48 0 R/FontName/MCLBNU+ArialMT/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 519>>\rendobj\r48 0 obj\r<</Filter/FlateDecode/Length 20410/Length1 54559>>stream\r\nH|yTTG\u0016ƿۯ_u4\bB{ڸD:::N\u0012\u0015GD\nA\u0014\u0011\u0014%\n\u00195*nᮀK\n{DT\\@Q\u00168Qc<{c&:ު{^ի_A\u0000|\f\u0001Cuᘅ<c\u0016\u0011\u0015\u001f\u001b\u001aT\u0006P(\u001f\u001153Q>]\u0012\b\n)\u0013\u0012&wݬ\u001d\u0010\u0003&͙0hu\u0011\u000f\u001chU+G\u0018r\u001cx\u001c\u0012\u00138{D1:\u001e\u00180*njT$nu~\r=\t+rF>H\u0012\u0019\u001f\u001dod\u0017Y0uFKb?aztBFG<~\bAXB\u0010\u00157].ZuLPiE7S<E]\u000e3=\r\u0007\u0011\u0006]#VR\u0017M/\u000f\u0003n@m\u0011{VC\u0000*xq8\u001foQKn\f\rI^T1/SPLy}|\u001b5n?Y`\u0016-[\u0005\u0019l2\u0007(iۮ\u001d:vzs=z%^\u001fӷ_\u0001\u001d\u000f?x!C>l?F|Q?\u001b3v\\D$>\u001a\u001f=ab̤qS&L>#񋙳fϙW'%\u0005\u000b\u0017}xҔeW\\zu6lܴ\u0019[mߑs=ֽ\u001f\u0010sr\u000e\u001f:|豢'N:},\u0015/pR+Wn*n:o\u001fߪ\u00060*Y5R-\u0004\u000bCYB\",\u001722G=D(\u0010ǉ\u0014qxA|$`A̭I\u001e֞Ժ\rɆsRۘdaY\n\fRi4R\u001a-IbBIO\u0017Kn$eI*{r<GNɧg&\u0014h2,\u000eᦱf\u001b\u0001f<\u001ci\u000eV\u00057\u000e6)PT^i+͕ %DitUB8%YY,Q+k\f%KW\u0013JrE)S*\u000f,0K\u001fK%222}R@ɺؚc-\u000fDBN\ftvs:{9{;9:5Q5/j?}^\u0015Jt%j5q*LQ\u001c!D\b\u0017\n\u000b9ŕN\\xU#HqB\\-\u0018Q\u0013M\u0016ho\u001a)\u0019\r.#ts$K\u0003\u0006d@*nKK\u0019\u001fV,C(ʉb@Y\u0003Aaќb\u001bM8\u0016fc\u0003\b:[(+P,\u0014p=Pr\u0011bl]bͳ:ЉS)9:\u00078+j<\r%\u0012\\3]\u001e>v\u0003\u0010߯?I\u001e\nj\u000bn*t7tu\\jk.}\rx~:\bp$\u0001\u000fԼnhhq\u001d\u000eˡq0\u0010\u001c*\u0007\u001ey~3T/\\Sg=k\u0017>\u0001<:z\u001eP\u0015[5q~ꕎU{**3+\u0001{<\u0002+UrŬT\u0019V٥2>\u001ejafbdoc7[d{bs\u001e~yVb;m;e+ݶ\\[[\u001f[o[l3ٌ?nq\r-nһѵA\u000fV\u0016fͦ-WMp-}Ԅ+\b!Np\u0005sqfq<7\\\u0014x] ;uoĴlmn\\7FQ\u0006[?,Ew*W{2znV}\u0011o{Vc\rQ?^wO֯Qֿ^ϩ\u001ffrnio3>\u0005o{6-\u001b:\u0005B,\u0012\"\r\u000f\rVb\u0019a\u001fv1R8\u0005Xg\u0019+\u0001K}\u0014۱\u001f9^ \u0013Y\u0012dsD!\u0015Qh\\%\\e\\U\u001b\u0013p\u001de(G\u000e&\tV&n\u00021\u000f\u001cXXLd#\u000eS\u0004L\f|D,<l\u001c|y\n@\u0012\t_\u0011\u001e\u0018\u0006R@j\u0012D\rmM\u0016.b!-ܴvAA^#oS&K]>O\u0007()r)\u000eR>\u001d¯E)\u000e\u0011*B:J>KǨ\u001aQcjB~ƿ)q:A\u0001ԌI:E\fo)#\u0017yԂZ9*V\u0014D\u00062y*\u001a?>I$t.%*t5\n\u0010RBeTN\u0006UM\u0014QkzP[\u0016KardX*[ְl\u001d[\u0006Q\fafa[Vmg;X:`l'v=̪UOf{>\u001d`Y,\\\u000e|v\u001dVǩ\u0011V\nQv\u0015\u0004;N\f;˾eX1;J\u0005v]b2®kkԵj-B$Q%\nZ\u0014E&jD%Dov`\u0015\u0016;cw\\_Y]W\u001cǟs{s/\n(F\u0018EyǦjj4j<&\u0000<dPlLbjڮ6M1\u0011\u0011\u0011\u0015\u0015\u0015q\u0002ġZ]\u0003ߋ>_uN\u0015X]P%*UT\\]S\rUn[u:mZ\"ОuQu\ru#\u001dunD(ǆK\"%.|r9_s\u001e8\u000fjƩu\u001e9ucy\u0006\\\u0005uNi:]7\u0019:Sp}\u000bBH/KRL/+J~Gyz^u:_\u00170p*P7\u0004z\u001ci[ÿmޡww{}\u00158\u001b8\u0017(\n\\\b\u000e\u0014zP~}@\u001fԇa}D'S}c8\u001bpCnq\u001c\tܘp\"'q2p*qz0?X݂s;fc\u000f1\u0017{ao}\u001f\u00018\u0010\u0007`\u001cCq\u0018\u000e\u00118\u0012Gh\u001ccq\u001c\t81XM939qsn-:\nɷ\u00156q\ru\u0005\u001e\u000bq\u0003nM\u0019Vf\u0017M7\u001d\u000emzNWAW\u00067JUeZCڪjGVUg=XO\u0002\u0010+\b\b\u0004\u0005\u001a\u0010\bl\u001908B\b\fxC\u0004DB\u001cA}\u0012!\u0006b\u00014F\u0010\u0007\u0010VߪX\u0012VVkH@2@*A:4\f49ܖq\u0011b͕|kȂf\u001cZ@Kh\u0005\rv\u001c70\u0007\u0016̃\u0000\u0016\"X\fK`)~\u000b`9~\u000f#?q\u0005Ox\u0012Oi<g\u001c\u0016y,\u000bX\u0017\u0014/a\u0019^+x\u0015\u001a\n6V\u001d»n7\u0001>jZ|\u0004+`uXFH|Oe'h|F\u0001\bd%AAH\u0013\u0012MLl \u001bF2N\u0004r)D<X62|HzT)b\u00015F\u0014G@\t%R(R)ҩ)eP&edBͨ9ԊZS\u001bjK9jO\u001dy(Se\u001au\u001bB/PWzQwʦ\u001ew\u001e\\Wk:ԋzS\u001fK?\r4\u0006\u0010\u001aJh8\\zkf\u0019vw\u001en\u0019d\u0006!f\u0019f\u0011f\u0019eF{oy\u0002o[-Q4X\u001aGi\u0002MK;Di\n4O\u000f4f\n^h\u0016N7 \u000fV\u001aX\u000b \u001f\n`=\u0014\u0006~\u0000\u001ba\u0013l-\u0015v\u0001;i6?j}w\\oJпC_\n}͵pn>\u0007lc\u0012MI6)&\u0015ny\u00116iP)\u0016bX.V<F\u0014BYl\u000fnO\u001c\u0010\u0011qT\u001c\u0013\u0011\u0013\u0014_o\u000f&Ӵ0mL{\t8+E\"[RTA\u0015܅{p\u001f\u001eC\u001aA>/;!>G\u001f\u0013~Ϝy\u0001j\u0011cx\u0002O\b\bK\u0010\"\u00052Kve\u00175|Mf\u001c+{rpF\u00049^$e|C9r\\ \u0017%r\\\u0011.Ur\\+zAn[6)ww.W\u001e\u001fOâ\\UC~\u0011nOh&OӲH2J\nY)jY')be\"UP*N%ƪJT*U\fjڪ\u000eꢺn*[rTOzުj\u001a\u0006j\u001aj\u001aF^P\u0011`o\u001f5VMTT59(\u000eK.©4pD'Iw2,6NW'u:\u0003Hg3љLu;3B%Py\"t+T\u0015\u0017z\u0010\r=1\u0011F\u001amȸ7\u001eoo\u000egsw/|o~fx3WYl^ΟOg\\_Wo<_\u0002Wh~6/՜4isƜ5L9o\u0005Sb.Rsɔ抹j5s\u00057ƍ\u000bVu*.3;`[6\u000eV&۶vl\u000elߎ#(3ƌu{qVu90X\u001d\t\u0006\u001f\u0005x32\u000f9rܛwՒD- Q5\u001eŔ\"$PTRbO1\u0018/!JIQ˴(jƨ\tZBm\u001dZc-AmLմffy>{=sw\u0019d5jvu\u001daGQvMe]ۮc׵zv}Ў\u001bٍXS93Ysֹ\\t.;⮸'w\u0017C[G\u0015I+E\":\u001ctdLPi\u0005:ʋxs[.|[e\u001fWfȞ\u001f\b?\u0018\u0019^\u001c~(<\u000eپC\u001dv\u0004vDJ\u001c4?N\t:^XiXY3\u000ep\u0007\u000fss`L+\u0001\u001dT\u0012\\\u001f\u0004͹Ne[ۭuzn}Ѝq\u001bX4Y=MrqnS7\f1CM\u0019f\u0011f\u00196s-\u00047Mw3ܞn/7mv\u00147\u0011|\u001e|\u001c\f\u0005}<'=i\u0002^%g{؂zU^zռ^\r/^f0\u000eRqp^p~0?\u001ag&c\u001e/}~s)v\u000eZE\u0014D(\u0015e8#Ίs⊸*↸)\u0013mQ\u000e\u0006d@ud]\u0019-3u\u0002{Ru\u000f\u0006\f\u0003 ШN\u0011}T\u001f\u0003CN\u0012]\n\u001exi\u001esd#X& dN<0j\u00015Mɦ R\u0019/沅L|\u0005A??B\u0003\u0010\t>U*\u0004{j[\bq\u001f\u0000t2u\u0002,-\"h\u0016%:|`\u0002횾oXV#p+NwZX\tXC0,\u001ejk^ӱ:,3MȬ0+*Ym֘f|j֛\rfl%_?.-Uv>f$s\u0014SuJLf\u0019fef9f3^Ĉқ(R\u0010\u0014_q\u001aT^q\u0015(ww\u0010m?p6A:̏B\u0007AU\u001aKZ\r5Ȣqg>4/HCI\u0012<\u0007zo/U\b.\u001cy\u000eo!Q\u0007\u0001ŸԏYԚ#t/7v\u0013\u000br(\n\nu0\u000fEo\u00147rA\u0006V'@{\u0015CA4\u0014h\t)J\u0012.\u0016q=9se'̲\u001fS/SUfdcu%\u0000Sv!&2\u00061ERS\u0014Q)\u0017Ћ\u0019\u00111(R\u001b2\u000eq:\r\rxHa:\u0011*%P/x\to>cߑ\u0011\u0015ѦФQS7b|*a\u0004X&e#+0\u0015ڻGjzf\n]q\"11CP\u0011Pcy&\u0014MI\f@gsC.S[ \u001d\u001aIh+=*\u000bN_P<0j%i#:b82GW\u001da\u0019jZ`\t\r\u001d\t\t=\u0013|\u0001Zl\u000fA\u0013]t5;\u001c\u000e܋'æfEX4P\u0011O\u0019\u0002A%Ԭab\u0002`I\u0005Md\rY\u000fuJU\u0000S^WQ\fj5\u0011Vסت\u000fVX`f%t\u0017M^\\\tQh^0#T_j8(D\u000e`pޅȸ?9\u000eC좸\t$Df\u0000\u000f\u001cHU߾o}\u0005~\u0004]\nA_t\u0014wDAY ķg\u0019@oad5\u0004_fqr,)tu79W\u0018\u0015\u0001jZU\u0007ݲlk5m=j}G -\u001fJuW|\u0015<|Ls)wbREǥ\u0001)\u00052Ulyb\n\u0017\u0006zV\u0014zb\u0010cb\u001dɶ2s\u0006\r\u0013\tͪ>ǥ\u001e}[)fhT\n\u001dL\r<*[8y.˫\u001cP_5${ \u000b/EմM\u0014)$UZ<N>I,j-o,\u001a..+:GbjɹTN*b(P\u001a-UxH-]\u001bnRW_\u001eK4ʔMW}&cCQ\u0001Sh.3h\u0010\u0006D\u00154P\u001f\u000bս\u0017\u001c q'\u0002\u0005B\u0000'\u00142(\u001b5\u0007\u0014+\"MCt8:Dd(?\u0010\u001a\u0017P<xbtf\u0013Lc6*\n'΢LwE$2D/ݐ#\u001el\u001bi|u2u\r1\bޥn\u001dv\u0010+%e(E|wc߫oMC\u0011Jhc@Ӡ@\u001cx;~'SHɬP6\u0004Qx\u0003\u001a\u000fW9j\u0016\u000bxq\\DRZQ><RWWXTi-eՎ+KR\u0014\u0015q\u0012%NE\u0001\u0002\u001b{A\u000fAs˹Y[((\u0007#\u000f E\u001b\u0001E\u0018\u0001j}3˥ɢ-J.gcy\u0010Wo~\u000f;\u0007qǷ?p߻\u001bl6k+Ko_`LNx|lȹoS'OdC\u0006\u0000}C%G)ޞÇ:\u001dr{[\"\u001ekmF¡`@h8G6ai\u0005ҥ\fi\u0001\u0018\u0006\b:B4k\u001aoi5Lxf(aWMMS\u0003\b\t\n\u001dHg{0l\u001ci\u0018΍fiԚ\u0019Fnk\f`\f\u0010;.\u0002HݹQWB\u00048Rt:z4\u0005\\a͛iEU0\"`Nv]0Y\u0016\u0011f\r>\u001bϜG\u0015\u0019mz|n\u0016L\u0016(XF\u000evY$\f̚6JA88\u0012ռ(UykY0\u0006#\b\"\u0001k=d\u001e$|&|VJ49MZ\u0014vnڰ4);Tث~R9,Te\n\n}!,ykfIfؕ;m5\u0010O4R]&Phv\u001eY=3\u0010\u0014\txbR\boJ#)\u001a|,\f&\r֒\u001dyy\u0016dJ\u0011d\u0000=Sq=I=@cq\",)8!賙O*\u0012;2\u0017\u000fAl\u000bI\b\u0005~X1\u0006\u0010<oz4A\u001bcd-&\\̗\u001c^撲/w)d.Pf\u000eh]Qg\u0017Ir]R\u0013G\u001abY3H5$)\u0001!\\+s\u0006OX$f%\u0012\u0014\u001cLL/yժgJ\u001fxVsX\u0013^\tp.:Nk\fR38S{Aƣ%S%YagjTFR\u0001!r\u0005?U#\u0014\u001aó33B8yJ\u0014*\u0006%2u'N,6\u001e\fS.qM\u0017\u000540c(.\u0016\\-6tR\u0004sqGQ\\]$4R|5UsOF_2\u001fKXS;\u00002s d\bĹ\t\t4!4W\fB\u001a\u0014\fA\u0017+\u0018\t^aTH\u001eO\f!\u0003JГ\u0018v\u0010xQWմ )\u0013\u0007\tqX2sƨ1fLH\u0012D\u001e\u0003)ad\u0002ObŅ1\u0017\u0004쉑\u0016jer\u0007s73X^5L \u0018_1?҂\u0013{H\u0014&t3.9\\:6\t0e??W\n\u00022\u0002\u001a\\tr\u001c\u0002_\nQ)^Ex\u000fFXyU '^q*I\u001f!uk}\u00048p|s\u001f\f_x[z:k*ʎp5?l\b'X\u001cNE\u0013lDx2I/U]x;in\u00134\u000f\u000eݳX*ٴ\u0016囆'U\rJ \u0011;O\u001am_Ln<\u001dE;\tز*[^W)9;G\u0006\u001f\u0015/\rEV.\u0016E8of\u0014\u0018A\r/vͩXn<5K}iH\t\u0018J\u0014\fħsĶ\r5\u0004C\u0015B&[p}\u0005^7AWY/\"P϶\n%ʋ+E\u0018\u0004Тɐ8\u0014r\b\\\fçY8=_P7-~+yW\u000epWDjXB`m{㺭C$:C;סV\u0005\u0015\u001b\u001aI.(@A\u0010f8e@b\u0015x=]h9@bTq`sJD<\u0000>ԙ=\u0002B>y*\u0005X(\u001e6\u00035 \u0014\u001bvR𮊿`^7X\u0001\u0000j\\c%\\cم\n\u00046#\u001c\n\u0017\u0005P\u0004MJx?\u001cH_\u001a(\u0014\u000fHp\u001fh8/\u0005\b\t[\u0004\u0017Ưǯ\u001aGМ>v\u001d\u001a4\u0018K\u0012x\b\"\u0012|\u0006ZZ/N\u0005.{y\u0003\rV@\t\u0006ZA\u0006xwG+\u001c \u0005Q\u0015PLx\u00035\u0006xw%\u0013$\u001f`\u000f\u0018Vbv`P\u001b<\u001b8ߗ\rD~r$wtz ?\u0018\"kG\u001d{F+veYZ\u001e惴\u000f\u0006}\u0000/v\u0013\u00074\u001f}\u0000/<G\u0012\u0001i 0&r'W\n]nn&m:T\u0013Kg\u0003_\u0007؃|oWo\u0013_q\r*J:Ւ\u001eiRiTdHd(\u000f\u0014IѺ\u0012A\rkP܈P+&\u000f&\u000fu^#}U6ЖԾ#\nYja\r\u0001p_ɤ`Di7):B\u0019\f\u0013#92&x\u000e.;s\u001c\u0015̌xtvN-s7FS\u0015\u000br9XȖwEm\u000f+-i4*տIC|>1nl(uFGm\u001aM$*\u0017\b귢WR,GB\u001fv=D }{O\u0017Wu]?\u000f*+\u001c>?pȯ}<\u0017U\u001f\u001cYdwowok@\b!\u000b\t'|\t` \u0011\u0018\b\t#\u0003\u0003BG8\bme e2\u0004\b\u0010(2tF\u001d\u001dA\u001cPR\u001c{nCy}y~ϳ%9M\u0015ym|\ro\u0019\u0010=Eq8Oi\u001dG@9يPXx*Oʦ@\b>1zbUIiIqiIĪĄp8-)\u0019]$\u0018\tCAI\u001a]T\\o;[V\u001f[4yu?>9Z$/\u000bm/\u0006}xvSۦX>:4^WlŻ\u000b/Dl\r믴cm_|K)/Hn&N=rN鹮*~(('xUV)ul\rh\u0014\u0015\u0013\u0015N\u000bys(B^U)4^CQ]N\u000e\u001d\u001a'\u0010*+\\\u001b\u0019\u0016\u0016\u000fG\u0004D^_\u0016^\u001d19<y%BXYmJ={F>auz\u0017j}.\\/.`d\u0012Sv]gwY.u=1\u0006ӧÈDFX\u0003\u0006(\n=6\f\rcJ|$1l-)MCUR^3Ū\u0010\u0014Ejl,^.vfB9i!\fQ+^n7\u001a-i\u0001I\u000b̼3h%*\u000eS\u0012߳\rj^@1~~wݽ8};\u0000er&\f\u0000Ԩ-\u001ddjnVP**\tdu9_ \\U&q}adP{u?>~ۺp#;V팜\u0015pqo:\u001cmiß9D\u0003\u000f0!1\u000ex\u0004)\u001f5z\u001bG$W]6\u001a~=뺕\u0016\f1>٧\u001aӣ68inXVl.lRF\u0012$F+(>Xj\u0019/\n\u0012V(N\u0004L\u0013Uiÿ2Ϣ\u001a_U]mݵ5!%Z\u0002\b]F*\u0018v\u0011\u001e1*}~?\u0000\"Ŏ1d\u0018\u0013(O0`\"Ɯ\n\u000fsì<\u0011ټqx\u001d{\u0006\u001e>A\fVR~\u0014deŴvX9W\u0016$/iQN(`vPQ;'eN\u0012< QVC\tT\nI\u0013L\fU\u0019;:_]rΐ{ƶjX\u0019kN2zvՔ;p\u0001g\u001958_#rJ\fCY:Utw\u000e\u000fL {^C`hs\u0015H]3\u0012\"kg\u001c\u0005E馤H\u0001\u000b\u0015[--]\u001bx|r~A)x+LcޛfŒeFK\u0016lzaYEA_^5\f,T)UK}joveY&)\u0014Za\b\bm667\u00057v~c\t<\u001f/\u001fU.\u0018o\u0007)\u00147`<\bc#̀iS\u001bWp@EE}\u00036o\u0010kG2\u0019kt]5)3!/\u0018\b1 \u001a1\u001cT\u00149`\"'\u0014\u0016`1#Ɨ.X/:#vVRm͋&orS\\\u0011\u0011]VOBVy\u0004`rTv\u0013-\u0015\u000b\u0007k^oC{7󌛨h]\n46j;<9[KV\\p\u000eͨ͹4[m_OK=6}k|\be5v&)\u0017$ӡ(diakqhz,p\u0013p{<]eǛ\u0016ܙH\u0006QJeD \u001c\t$8K\u0005vkpWkgE%\u001eep[WE#7z\u0006[\u0014Wln\u001a\\QV\u001cm\u000bĲ\u00037o[xkjS=\u0006\u0018~GYyN4ѧFXî\u0006˙f.\f<6`\u000f\u001en22\fIG|r\b\u0007b\u001b\u000b\u0001\u0005GF`\u000bcl3A(`xchO<Os1\u0001;P\u000b4\u0002gs@=1\u001c\u001akh\u001dG9#jOcz\u0000g;\u001b쨔d>y\u0017Ejh\f쓎x\ng\u0007!\u0017}\u0018\"̫޽,$ W\u000b\noj-\u000f\tk~\u0013؅= \u0001\u0000Tct'!vAρY9\u000bD\n\u000e=\u001fvH:0\n(㏳$\u001fd\u0017 q3\u0006\u000fCgY\u001f\u0019\u001b\f\u0007-0OoA\u000e%\u0016\u0012l\u001bd\u000b\u0010\u0005*[\u000exn1\u0000ޑ\u0001_\u0017yhs^60A[z@|\u001d\u0012I$9ߕ}VIcVk:o\u0007\u000eb\u000e\u001fxȄx.`\u000f\u0013\u0006v뿔\u000f_\u000fD\\\u0001d\u000f/'Sܹ$ĘE\u0004<8ى4c1Y\u001ev>\u0013c¯!E D6px\u0005:y\u0004\u0014\u0000[@'\u0002|\r\u0003ao}\u0005\fq\u0007\u000fa\u0019\u000e:Z(8kb\u0014IB-'ܵ)3t\u000e85${LAp˕wa\u001f,\u001dym'Β}$\u0010\u001c 'vY+\u001c\u0014\u0018\u001f\u001a\\Uuu\u000b$\u0003( \u0010\u0006|Ĉ\u0011E\u0011\bjJ-\u0001:ڱ\u001a\u001b)P|Q`\u0010h\u0003VTdv|\u00148u\u001aJ;-\u000fL\u001f\u0014HNkse\u0010Bޙ^w?^{\u001e\u001czC̱-VYÜ37\u0013SVxse?LF\u0004#\u001fnuf\u0019Y^CY+R-YA3l-\"6ӴxgD\u00104\u0002Il\u000bw\u0007vh򓁷#h\"f6_\u0004-a~HO\u0004gČ\u001e\u001eXKlIUJnR ݔA\\`9\u0002<w\u0001yegy_Y\u0012R1G@n\u0011X!\r\n\u001f#ˏ9חbeO\rܿ\u0011>%8\u001fM'knl\u00031\u001a̍uVnE:~:\\t\u0016{|OYkA\u001a4Fj8\u0013w9kB\u0011?8D\b\u0015'aλ:\fp'\\,{'\buz}\u0016aq.ȥWG2'gkl9 <Ze(\u000f\u0007;12\u0013\fl<>4=\u000b~\u00174'KFcGK\u0017%R۬ZV'K$6KCѳO+\u0005ĉ\u0016\u0019e~F\u0002I\u0006\u0013Q[n\u0014>;>:*;TDXcmaS\u000f-3Y zb4jЪT&܋\u0012*T\u0017\u0015|Tn~'6'ob?\u0013ׁ__P\rǙLoGKZO,f\\\u0016\u0007I]Qp\u0002\u000fⶰ\u0002:Dk\u0019\u0011Jo\u0001bu:}ʯ19ON\u0017np\u00023ʏ\u000b\t+[s\u0011b\u0014w7O3~%92| ϛ-M_\u0019ob-U\\r\u0013˥\\r.w{f&g͸\t\u00077BbUܭ|E\u001e]cs8Aayv\\\u00161\u001c쪂3E_>J_tm3\u0018}꼌>y\u0014;\u0006gemXJr\u001dy >܊\u001dn1\u0007\b3F\u0000}.\u000b1Ӧv\u001b#ǘ\u0019~U\u0005\nL*#[\u0001\u000f\u001cK`@k\u001a8\u0018nUX\u001bk\u001dnU\u0015ÒO!Og\u000e\u0006p^\"_uoT\u001dK\u0018\u0007\u0013,>C9\r'ɂ\u0003#}*\u0005\u0019\u001f\u001dpUb⃀\b}c{i+w+\u000bmU{Ug#vX\")L\tNo\u0014wݎm\u000b9s\u0013>8c;y\fQxEZcs11\u0002h_;\\л6^\u0003+\u0015G*cծs=\u001f\u001be\u0010bx\n\\\u0011su+cɱ8wcTgs?\u0001x\u001f^+!*\u0005!%ԑ-'7Hab烵ġm@o}\u001f~Q\u0010w!o \u0000Y\u0019Օ\u001eMGMɌoȿ\u000f`\u0016\u0000?\u000b=\n*\u0003oO{6'\u0002\\\u0017a2#\u001dޡ8Qf\u0005=\u0007[\u00077\ts|]ֈϿ+\u000eDG؁7\u001eMoqb<۲a*Ԕi\u001d϶~ؾl\u001d˺\"1O\u000f_v\u0015%\u0003O%zͰzEy#;&\u000e\n\u000b\u0006D\\G!vbO\u000e}\u001a\u0005m|L2\b?&w&\u001e?=\u0010>\u00148v]Sn<Z\u001ca1.0A}ҹ\u001cvcL\u0015p­K;\u0001]svn$n{q=S(p]wo\u000bڑ?-jc+A\u001c\u0018\u001aČ\u001c\u0015.Pk)N,Ŵ\u0003bX\u0002j?xlbexi皏l#vϮj}nClf\u000f.\u0001}+`N|d?yd]}皚\u000e\u001aK\u001e#wi!\u0016'ۥpO'}2I,6x?<S\u001e\u0019Oʹ0\u001db\u001c&9d\u001e\u001c:1v>\u0002_\fY<[\u0018Hs@\u0000y|Cs\u0007V\nPGk\u0001y%㘧G\u0006r\b՜l\u0018<^ji2\u000e0ߥk&|/%x?I2\u001b.ԳQVx_Vk<,K62\u0005i@B\ty!9\\\u001cq^՜\u0018SL%R\u0003mΟC0xnM`&WWg\u001bKK\u000fV]m\u000bA-0zj#1M(מd\u001azMmd!}u\u000e\u0005]]⵰j6\u001as w_Y_ʠ2gkYЛ;\u001f7\u0003jo\u0017WpGoijFy4\u0002}õvl;n\\r\n(Ak\f??\u0002y\bM,^z~^~&|!k]$9~w2̠\u001e\u0012)Ď~f(rϩ\u0007\u000f.{ڪq92\u001f!i\u0012[7J^R\u001e*E/ĺorv\u0015k4{tsI\"Q\u001enO쇩\u0015\u0017wOў'5ާr#\u0007Bj\u0001\u0002\u0011{\n1-#n=0\"y\"Qf~\u001e=eRma:~.\u0001cn04Z*S\u001d;\u001aW`.+\"\u0017@\\\u0002y1_gzt&?\u0005O\u001e;\u0005o\u000b\u0013Ggv.r8zLr|\u0007wl{M7;|\u000f\u001aE83j\u0004,\u0007ς,\u00021/\u000f\u001e\\Uuuy%<b\t\t-\u0014\u0010*H\nD\u001a \u001aa\u0000h\t\b*RuZB\u0003\u0005HDD\u000b\u0015\u0018\u0004\u001fHD:L\u0000b[ִSL\u000bT<r\t\u000f3߬{ُ_kdc?0~0\u0010۾noU[K7rσ\u0003?ӷFl\u001fXƷ޼|v\u0016b\u000fn~\tYؗa\u001fr~b7\u001f:״ 'Č[E=sܷZ\u001fxoYg]L\u001b.a'tȳRAcx0Ք_\u0014Ԓ\u0004}V0z#\t\u001dR\u00142ی.\u001eM\u000frq[5P*aMͅ? \u0017l2\\\u000fӲ;ۂ`\u001fFy~J~\u001a̕9y3e[x\u0004_d\u001a$,\u0007\u000f˘n\u001bΔk\u0002g\u001adJmޯ\u00019?\u001e]W&}'Zˏ\u0007uͶ\u0007\u0006A\u0019a?\b=f2I:͟\u000b{\u000f\u0004ʀ(\u001f5D\u0016#D\u000e>>\u0001z\u0017.Cz\u0017԰Fao\u0012۷ES$\n&'nF/v7HO\u001d]\u0019^\u001a\u0007e1{bpItTFS\u0004fk>2ǰ,a\u0015~\f\n\n;6\u0014\u0015:.JlM*\"\u000fVIup-]-\u001a-=UEu35G\u0007_E\u001fks\rp\u0000_<ѝ:p3\u0016\u000etsx_=g2|_㨵e]y\u0007͎\u000f-\u001e;[\u001a=jukfwhs癬aH\u001eNd[\u0014;=yF}\u0019}!Ltt24<k6Tu˵\u0019]}\u0006{&c9KՏ[lFq;gzGv\u001bl8\u0010\rXK\rܟY\u0013U^/WEς;%|=КD~\u001e!Djg$% $\u000fYg\u001c\u001dU/%>jл[;/]dv[?\u000b́DdҼnƆ\u000b\n*C>u,Jc%d\u001eyal\u0007\u0018I/_v]ql8!Ү߬E\u0013e;Bu\u0000o:*^ϼ'Ȯf\u001f<Tqz\u0016\u0010e\u0017;!Llo~vE<\u0005'63N\u001a\u0015\u0017W*\u0013\u000bK\u0016?ʴ֚/f\u0014 O\u0006\u001a+?\u0007s\tG7\u0007\u0002@_\u001d\u001d+_^arق}!\u001bŊy2^ٖ}_I3RZ~!P\u001d;z1,n3V\u000f\u000b,t?Z:1/U޺=H5\u0013&2봓\u001cw\\\\\u001c}yw\u0012ߓaz\u000b`Q]q\bg_m\u0001;q\u001c2#=_.Iiz/z,v\u0002I\tʃ\u0017l P±آSeR,hZڳL\u001dK(?j2ڣ\\\nRo\u001bRm[[R&Lt\u0017Lr\u0011\u0010tȸ1\f'IWִ\u0013\\Zq\u00077\u0005V\u001co_ɊT\u0018Ǎ^p6xIf\u0004#4`\u001f#\u0019\u001e|.\u0004Wɀ<̖_\u0017bU=uE8A\nwhP򴬳\rM՘|$iIqے\rM\u001d;kFF\u0011q9XdV\u000f\u0016&Ǯ\u000bh)mPV硚P@q\fc?ҽ崠j\u0017{-\u001bURd<\u0015T\n1W(c2%Q2R\u0018\u0011mYRG\r+\u0015*)d\\ڵ9^+ѫ\u0007P\u0016w$}\u0014}fLW2\u0013{\u000bg\u001a]\u001a-\\\u001f7\u001a,!V|cmqzmw\u000eg^c:)&~\u0015{~۞t'6il$Ο\u001c_=T]$k,C+4F'\u0017|Gj4jL59\u0003-4MƖn$}ƠTA4\u0016y]\u001deXf\u001ebJ/a,K-^xIm~k\u0005^/\u001b\u00182\tr\u0016Z\u0005N8ib!qZݟ\u0019$^H/9m!Ǿ؎ti[~T{'+Y;ɻ`w\\\u001f\u001c01|W\rҢ5i4\u001aՠ\u000eK*^7Impt<wd:\u0007e\u0005J\u00071\u000b٧ǜz?)b.\\r\u0010\u0019?'B\u0017\u0018foW+ςݲFljyWʍy\u001d\u0017ކ?`\u0013t^2߈%|J)\n\u001b^\u001e٩z\n7fX/Er\u0018\u0006Ca<r+cMcf\u001b}R.#x\u001e\u0011hCKLnxEC\u001dR}ϣ\u0010ַ+5\u000e#L\t\nY]eX0RV3[R4tE}Z\\G~yT}1P^s{\u000f9m4v\u0010;\u000bcCx>\"\rCձN~\u0017?\u000eLgLù{_%/H̙%y]YJBTęi{\u0019j9HN.O\u001a\u001fC}|r\u000e\tfx7%\u0017G6Gn\u001ct\\dO\u00062\u0003OWB}pMF}Yk\u001c&\\ss;gc}W:d`\u000etMZ=L_ǭeX\u001fu\u000f=2I'+\u0007\r\u000e\u001b\u0004\u0002֞27dڴ\tSOͬ\\h|eVu>c%Lw<L>om1럩;\u0018F[|/!Wrfw믾flV\u0003h?GW\u001eR\u001eb֪G\u001a\u0007߄;5.7gl8}\u001f\u0010\u0012JK$O`\u0002\t&5R\u0010Ґ&@3))}Il\u0006\u001a:(\u0018ҩ-Se&\u0016R*\u0015\bbg( \u0015\u001da\u001f\u0003`Ai\u0015ZZ,w߆e\u0011\u0019oϹwǻsܺ\u0012\u0014YnY\u001c_/_/J!A\u001au\rΞԲ\u001fd7D]\b\u001f%p\u001eۙ_}\b_&`\f3RيkџE`f19^,z녴[$\u0004H)H\\gn9L\u001fُ꜑\u000ep\u000e\\J\u0011{D9cbX/\u0019\u0003c})g%\u001f({\u0017\u000e0KÔn~\u0014\u0018.Heq]\u0011\u0014\u0010\f3\u00063zsN9经1ir(ⶬ\"K8krJ;\t>bt2I\"v8Xd\u001bİyi\u0015#,\u00183\u0017Ex\u001e|4OUg<lX={qeRnc\u0015^eL-d\u001cn<D\u0012g,\u0000FP䃯2y\u0012w1~WS\u001c\u0017q+OE\u00152gcw=ьZgLHsU]׳q.\u0019Y\t޻BQJ]+\\ox\"\u0013\u00139-\u0013=+\u001cf\\|X\"\u001fc\f=VOs!\u0010k~-a@{0E\u001f6_y9y~\f<m3rgO<'\u0016p\u000f'K!/r1y\u0003ܙ#!)d*irr\u001a7/)o!e\u001eyhߘ颎\u0014{7V1\u001d$].H6~\u0014<kPB\u001b{k\u0010׫\u000f(qul\u0001av\u0001\u0001\u000e<&ی\u00013|\u0007_2v;o\u0018xg69>s4dA\u001d!ݢXb<Ơ82|1iسlv\u0016sٯOB9+m\u0007);H+j7)Yo4Ϩ3'3r\u0013\u001dW 6s٦w8/j;\u001fe}LJ}|G\u0000*}꼫wq>os)L\",0N:$JN$dV.ߋaR\u0006N}9܏}X)!\b̗_\u001fz+F|:yoq\n\u0015l\u001b\r@L֛q14\u0013w1|\u000bs\u0015r\u0014kyt{\u0017\u0019ك+(\u0017%:.5\fvMs\u001f\nd$b9:S.CmF\u0011e\u0001j}\u001b\\)in-q\f\u001fʷ\u0010s\u0018p&o\u0019PLCDՈ?!ۂ*>\u0018g\fp=\u001fO^C)k=\u0003ӵ\u001a;92u8%sG=q\t{fҮ>~\n}ړX\"5aqĻ>}~\u0014|{g\u001fٍ^\u0013\u0017X&B\u000e\u001c\u0016\u0017\u000b\n*s:\u0018q\u0018h:,\u0011Aۀq\u0014<oǽO\u0011i `**c9Y\u0007)ncg{\u000fwsiWIH\u0011;\n<q$\\\u001eھ\u0007{0-c6\f\u0013\\41\u00191\u000eͽv\u00162q/r<3\u001fVM-\u0013A\u001f\u0011s\u001b\u0018!\u0018*oQ;&o ̶gߨ4J\u0005ͽ+\u0019&zA|Gx|vIKM䂳M9GI\u0015pnO\u0012\\<8D\u001b k=k\u0017iQƽ-l.\u0015y\\\u000bMZYy˽\u0014\u0017^\u0011/\rw'؎\\.٥qPD\u001e^NfQ\t\u0002pa=YGf2ʃ;bk&#l'\u001f\u000eY|\\P(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\u001f9\u001e`W\u00070\u001b\u0017\u0019\u0007\u001b7`\f9j\u0004\tW>\u0004Y2<G\\]CEWשoruNWL;\u001e=6߹\u0007Lս1-WX_:ZW7\u000fZ\fB9JQ\njhMY\b:I\u001c=5YR\u0017~ևd\u0012>0-4\u0011%fU\rʖa6Vf~z\u000fmwӎE\u0011\f!@=@ϢCXC/,jC\n̔cB\u0017Z~\u0000ݶ,V<\u0018cCs\u0012\u0010\b_u<-r-,T'/W9&DܙZn>\rR\u000bmQYVAr\u0016c!$V'$k{|ߖ-ltOAk#Jd}5byq\"7c\\yebFY\u000e\b\u001eŘZ>\u0019K*6۪tF=]5?\u0012DPĚ\u0017\u000e[\rֶxjcvt\u001d,k樽Zew6w=\u0015\u0002V \u0013\u0015X|,PV?f;\u0003@;kk#mVMw0&zjl\u000bŬpHԪ\f5C\u0001r{d\b;bhhGm3hGF.\u0014;cV̶-\u000e\u0006\u0015NZA;\u0016\u0004e\u001fA;\u000fc%*\u0017-1/\u001a\u001bUBoţ᏶[r8EX\u0019)羞#\u0011_#\rQ_\u0007}g>\u0012/\u0001g\u001ao6fd@\u0015z/Њ7\n^Ц+\u001c_pZ\u0011\u0010V\u0018/&3{}I\u001ax\u0012\u0001\u0006j 4>\u001b{igM\t2;HF\u0012H\u000e M\u001a\u001cҐ6U'I\u000b\u001fSժr2'\u0014lݚu:&_i??\u0003Ccy};*\u001b\u000e[U%V\tK\u00063\u0015\u001d\tiu\u0013*X\u0000>2D\u000f\u00036\n\u0016;瀨\u0004\u0002ˢt(Pf\u001eǮ\u001f}Pi%+\u0006\u0014\u0015\u00010\n&\u0014KȜ\u0000\u0002\\V,}q\u001b>+]3I<5G-o<}=v{{-Yop<i\u000b؜(\u0011\\d\u0004\u0003?\tKٯHR\u0015e\u001dq\u0000S+FrjA\u00110b\u00055-L#\u0015\u0012&}Ug5-ɩ'*X\u0000\n\u0004cr-9M)\u0000\u0015g?!\u0004\u0007$\u0001`\u0014L\u0005\u0002\u0002\u0003\u0010{_<I+4`}\u0010{\u000f\u001elDtv%ge`&\u0001׃z\u0010$XQ\u0006iymJ\u001b\u0018˯\u0014Vt_le\u0012\u0007A\u00136\u0004t0\bIGt\u0003\rb\u0017\u0015\u00002\u0010\u0012x\u001b [\u0005\u0006qM]w,D\u001foH+fҿޔwҿ\u0005\u001f_boQN2M\u0013\u001c\u0013\u000f'P\u001dL\u000b[q\u0004H\u00010\n&-.I\u001eIɒJtɧ\u00128X0G\u0011LS\u0006K?AS\u0018\u0017\u0011\tc|\u00071s\u001e03\u0011\tc<y\u001c0(\"a!D0U_toੁ\t3333Έ]̍=ܞ\u001bO헨=N>O=>Dm\u001aԶ=Owb*lj~OsF%jF2\rjǩMm*t\u001f&]^JF\u001f':1X',^\u00075ٲ һ<]޲;y\u0002?E\u001ca|\u0004|\u0016\u0016qE \b\u0006\u001aX\u00015\u000b\u00036\b\u0000i0\n΁\u0015Y\u0001\u000f\u001c\u0018t>\u0001cػwN#cʤFQ:\u0010EYD\"e[Ԗ*m__6L\u0003{M[7{'۸u\u001f<Ϭ?\"Q\u001fV\u001eE\f\u001aIʲhۉ^OA\u001c\u0016tM|\u0011GZ!6W}F\u0019vȼaT)ܜ.NڒG\n7ÿ5Y\u0018\nhYA\u0018|9\b8\fOk\u001eOC\u001c3÷b\b\u0017`\u001b5i,|\u0013O)p)P\f\f\u0004\u001e\t$\u0003\u0002\u0001\u001e\b\u0007֪a5Q\u001fT\u001bUU>D][-[&IZH8Rd\u001cbZq*ó\u0015\n\u0007\\;J\nGt\u0007bUڸoy N@\nCYgY\u0006jYp\u0002*NS|\tY}JPJk\"u\t-\u0012J[.<.W/<W*t[:ײk5nm\u001dYR@+\u001dْq>R_YzKRqV_җ+\nUzPNoAsKTK\u000b\u001dը8\u001enkh q74H\nt;V<IMUOR\u001cx\\j\"6Y-4Nh\u001a$QMJCD\u0012>$%\u0007J\u0012u;'hyyUӼ\fnYӤёx,?\u0016ˏ1\u001cO\u001f-(ؑǄ?<b9h,Oܧ<\"ʽ4\u0019\u000f\u0015GkcsJ=}]lPl?urJE_)WJo˾\\idK{G<_aMXc흥l$tOζsxty4%Xi\u000699#Ji\u001aR9r\u0014B%%ĩ)Җ*}ؐ8%&ܳfm\u001dp<AH9PpӁ\u0000c⒜ݫ|vKnArH*\u001d\u0011SuW\nl6_V\u00158\u0010\u001dah\u0018:2\\Ã(pej96MⵉU&Nգ\\LԽw$\u000e)NɝMLyg&it#\u001a\u0011%W\u000fl\f\u0019>\tT\u0012V\nK\u00065ś\u001as<ճ\u000b0\u0000-\r\nendstream\rendobj\r46 0 obj\r<</Ascent 1056/CapHeight 716/Descent -376/Flags 32/FontBBox[-628 -376 2000 1056]/FontFamily(Arial)/FontFile2 49 0 R/FontName/CANTDO+Arial-BoldMT/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 136/Type/FontDescriptor/XHeight 519>>\rendobj\r49 0 obj\r<</Filter/FlateDecode/Length 19625/Length1 53268>>stream\r\nH|y\\SW\u0016'/&\u0002\"{\tXU\u000eUZ:3UX\"\u0014Ae\u0011TTUpĪᆻ\u0002* \u0006{EqgS&\u0005Nkv\u001aHz\u0003|\u001fsν}\u001b\u0010H\u0011#v\u0015Z=\u0016.a\u0011q\tz\\\u0001(\u0018h\u0013\u00161;Qv\\<!\rЄE%L+\u0003\u0001عQc֗\b\u0001+S\"'Y7@\u0015_/h\nw/^\u000e\u0012\u000b=\u0001\u00182.6>\"\u001cx\u000e\u000bOJh\u0003mxyZx\\U\u000b\u001d_M\u001epO\u0011 \b\u0007J \bU!B+n\u0011{]th\nDܵEV9\u0016]\u001c#\u0005\u0017\u001a6P\u00069*Cӗ\u00039\u001c<$\u0016;k\u00158\u001cΏț\u000bC*s\u000b\u0014\"h[\\-][vsh֫]{\u000e>~l0\u0007(o\u0005vz;]v{{\nzW>\u000e~\u0007\u000f\u00188h\u000fh\u0011!\u001f}dq'|\u001a:1,\u001cEL<ejtLlܴ3f&Κ='iϿ 9e?\u0017.reiW\\:}u7dlܴy\u000bm߱33+{=9{? \u001d?Tpc\u000bN,>us/bɥ˥W^~歲rTTVݾsk`|S]\u0003\u0010A|\u001a\f\u0002rdXA_\u0018!\u00114a%\t-#ĮhqDL\u0013Wc%a\u000eM\u001b\u001b{/oO+\rIHcҧ|T\"UIfR˭dl=>r_y\u001c*'sdy|N~n\u0010\r\u001e\u0006/`2t1\f72\u001aR\r\u001b\f{*#32\u001b=F\u0018h|8\u0018nW7(PT^iQ)>JY\u0004+J,UV(,%O9\u0014+\u0012RW\u001eML\u0003La\bS)\u00149W!wIn~nQ@dc6/[-6v樋{YAv{=^s4|TAePS\u000b\u0001B0OH\u0014W\trU\u001d\"+\u0015eJqX.>g`~\u0010mP{\u0017bo\u000f~)~~/v,\rB(NRBtWFz!\u001f;I.\u001b(FˉbDm\u0013abz3E7NѯbqR\u0003E\r\u0014C)+f8{bfhN1S5.-}}\u001b\b֋Sg\u001bh\u001bb\u000b{Q\u001f@WlO϶8):\u001eK%O7\u001eGTVV'@wGWUʀpLl\u0018`M\u0006\u001eyau.VUceV*XUV<v3.nЩ\\<nh\u0017=\r<\u0019SV;\u001f[[ls*릚5\u0019\u0019ˁ\u001c\u001a<cVwWݣ:22\u0012lm\tt\u0004Z\u000e6\u00162?5[?7el>g>k.K=C\u0001\u0000l0}w\n%v;>OxN\u001fm-͍u_į\u0007n\u0013\u0010ѐ\u0006\ffbo-Pw\u0006ei[7$mn\\\u000bύ.>M\u0016X\\]qJϳ^Um\u001bG臿iS}?1\u001a7<ٯk6\\%:߲\u0015pmxNv\rڻS.b\u0010\f<X؎}؍H\u0017a\u001d'F,%3~\u0017xl\n. >C\u00041\t\u0010R\\-\\\rĿ\u0011\n\u001cXۨD\u0015GX\fј\u0018!\u0016ӐxLG\u0002f`&f!\u00111\u0007? \t0\u0017c>@\u0011\u0005_B<\u0013\fH*\u0012HM\"lMVN4vA;)\u0005ȅM\ni7\u001cʥ\u0001ʣO\u000e\u0011:_ph9\u001dTHEtZ+bjEɍQ\u0007St<-3ty@_\u0017!\u0014P{TB\u001dȇ|ɏ.e\u0017[<$d2J\n]ktnME\u0014@\nʩ*n:[\u0014H\u001d;,-g+Jfl\r[ֱl\u0003`\u001b&1mf[öml;vLŲ.a9,W\u001da{>\u001d`y gX\u0001;̎:V\u001dǎBVNb\u0019vc\u0005\u0015J%v+*Ʈ\u001b&XN]\u001d\"D\u0012U EQdFԊ-D*X%bw]5\u0007~>:8߳}g9wϑhH P\u0001\u000e\u0006\u0003\u0018wL\u0000\u0001;6F^]\u00001LI2c;Ƙ*\u0000{(3\u0001b=e\niShΘ)2\u0005s\\2\u0015s\\3\rs9\u001cs;'N>'6&r`+J6VUm5lSlu[ær\",\\g,\">\u0017\"_\u0003Wx#{=z`kZ6ͦ\fik:6Kq\u0005hgؙvmعvo\u0017؅\u001d]db.r®\"G#vu]cu!6v}Ͼo?\u001fڭ\u0013ȱHfۏ\u000e\u001e~j?\u0007\u0012'qeU\u001a's\nW\u001a5\u0016q:gpftyt\u0005Nv1\u0017;D_ǎ\t;c\u0017ݰ;\u000b{c\u001f?\u000e8\b\u0007\u0010\u001cp8U\\p\u0016gs]\u0001_|\rnȍ1b\\Kq\u0019.\u0015\u0012Wj\\kq\u001d\rQȋV&,9\u001eʏ:\u001crn;wS]sy\u0014;%Nrʜ\u0013穓\u001dZ\u0004t\u0005\u0005Q`\u0002\u0002\u0005\u0006\u000f|@\u0000!$@\"sAyw\u001a@E\u0004IP\u0019@U\u0006ɐ\u0012WߢXRN#4Z\u0006\u0001P\u001b@r\u0013n|\u000b&|\u0007l\u000b>4\b\u001aC\u0013h\nA3\u000f~\u0003Sa\u001a\totx\u001bfL\u0005a\u000eoa\u001e{\u0001ğg<a\u0015Q<\u0004|<\u0005x\u001a\u000b\fsX\u0002^Kx\u001957&x\u0007m\u001e\u0007\u0010\u0004K\u0011,:!c\u0013\t>ty]AWg\u0014!@WI(J\fYB\"rӕu\u0015]UW:|P\u001a:Uפ\u0012(Qy@\u0015\u0012%QeBU\u001a%S\nU\u001aJ5}CiN\u0019I\u000eeQӨ.գԀ\u001aR#jLM)=Gͨ9=O-tΠԊ~C\u0005jC/R[jG9Ԟr.ߣ\u000eѷ>>\u001euԅR7N='ԇR?O\u0003h1_@HW&ݥ9~{?WzIo#}\u00012P\u0006`zv0#\u0019\nf\u0007sh\u0010\r!4p\u001aA#%\u001aE4h\u001c4~O\u0013i\u0012L\u001fUz&Gz\u0003`1,\f\nX\t`5?5\u0016z\u0000\u001ba\u0013l-4\u001fr1\u0001[c06E߱/c_žRy\u001b;x'ݼG7T)$MF0\u001fMɀ[jjSK\nJSMT^_\u001dP\u0007_?՗\u001bdI}i,ͤ%V\u0011uB\u0015ꂺn[\u000e܁p\u000f\u0003x\bPu\u000bx?c~O\u0017\u0017\u0014\u001eA\u0019<'\u0014r\u0014(ADiuKJmmu\u001dug]`Qz_֯7T\u0019z\u0005Z\u0017z^Wzިfުw=cY\\t/MI\u001fRua}LB]\u001aKb]\u0019ea#&4fL5b\u001a&2&1٦iFinZ֦ikr\u0014&t0\u001dM't1]M70=M/1}M?\f0\u0003 38!|?>Ucf\u0019gA\u000f<q%x\u0015^{^\u001d/k5:z]^_o7\u001by\u0013XQRZFN^A4D\u001cQ\n/8%\u0013|.W|/?\u0006\u0013I+`J /X\u0016\tǇWpZv8/\u001f.\b\u0017¼pq$\\\u001a.\u000b+*Y\u000e/rX~#rTq9!'%_NIB9#g\u0014y \u0017\\+r5ƧJ~Sv\n3Y\u001c=s#カܨ]Z\u0017]r]]ݘ+nn薓!2 Ü\"|a8Z\u0012->p\u0019!#%\u0019_<+{77wD\u0012\u0004-)*AR[-\u0019[ѱ؊J--dHK\"RQR\u0015K<RFtg'-}פev9\u001daW+ڕv]Ŏ\u0018]ͮn5v-;9:'<\u0007s9u9\u000b⦸%\nm'F\\+\u001b\u0017%}\u0005\u001b0M.;β\u001bnW\u001c{\u001b6|]=e/LS\u001f\b\u001f\u0014\u001d~0|\u001d}!p\u0011ȑ\u0012j*upqBㅝ\b\r;\u0019gL;w;,\t\n\u001bH\rR<\"\":D\u001bi17܂'p\u0006/%<vd[ٍtQn\u001bVuX[ӭ&T3mw;qn[ۭclaf\u0019aF([ϭ&]nn&/=ݎn'%49\u0010\f\u001ey\tOzӞx^\tz\u0002Jy2^YWދ*x\u0015@:\u001d<k5ޚ(\u000e;_Oq:\u0001'9(\u0015Gw^\u001c\u0013\t+N<8%.+\"_$5Q \u001b N3\u0010&\u0019\"d\u0001gRt\u001e\u0002t]tWg\u001e\u0007Fu\u0007\u0011F`1}\\\u0000qz<4Zo\u001a%@d=\u0005t\u0003FQ4\u0019/kT\u0019+2A&\u0017d\u0003~\u0001\"\u000f'\u0000,^\u0013쉴?#,}\u0007i\u0001ڴ2st\u001d3W5t=3_7D,\tf0A|\nb\u0002j[UJ\u0000Ǫau@&VSkfYn7+JYeV5f|d֙fl\r| ȶ2I^M,H\u0013\u001c7&ͼcfifwMwS&b\u0012wp⿢+\u000ex\u000e%v\u0013*G\u0012(\u0014=+|2*Mi9T5*K=(\t^.i>'\u0019-No\u000b6\u001f#ˊ\u0011u{qޒ\u0005B)\u001cjBݸ,\r,=D\fKh)cZ\u001a^LM\u0005\u000fO)E|/L(bhW(z\u0006\f1sjKph\u0005Go\u0019}\f\u0019&V\u0000VJ\u0013i.m\\,*E5\u00110\rبԗ#ȷxdj\u001bl\u000fQ\u0019\t\u000fD49!\u0004T\u0013\u0019L3tOiԖr\u000ee\u0014<cM>\u0013T1Uȶ?\u001dO\u001fR&vd7}]\u000b\\+r;\u001e\fÙ:UU2KV>ERuh\u001c\u0018%\u001d\u001a.<GE#\u001eP5C`~WS\u0005@(\r'\fݣ\u000b\u00071\u000fu߇;8ǈbX.6mm<\u001aj:.BB\u0006\u0004~\u0012\\\u0012\u0016wyp\u001fKQi芍)~~p\u001f~\rټq\u000eq!#F4\u0011Ī_Pq\u001bAb\\\u0014?2\u0006y\u0003LKU@Ū*AuV}m\u00131ڀBV}H߅\u0016S1MxÙǞ=\u001c`fp\u0007z7\u00144\tXKY؃\tDO\u000f\u000b\u00158k 5܋\u0010 \n^sd\u001cbDh! 1\u0004#\u001d,Yq^\u0014!r*x\u0000}(0NN3Q\fES)kT\u001a&jRy\u0018qy~j\tUɪ\u0007mX!/t=\u001dr?t\fW8D\u001eEs\bh0Rl\u0011U\u001a\u0017ʬ xC2Tq %sVFDROZL<?PCΡ4KH&R/|hFgx GMr>*i+hH\u0015{%eX-\u000bx3\u0015ߤ<V.?\u0014nitZ<\u0012w\t\u00114J^\u0012][U]\u001c;\u0019]O\tk\u000e&AA|,*^,\rz\u0000AFZ\u0016QH#e5ҿލj\t\b\u000eSk~#\u000e\u0014\u0006fn(b\n%U?(\u0006K\u0012.ԇRi\ng\u0019[h\u001e>?\"vቦt\u0004c!]ya]TʦB.9\u0011z(\u0013k\u0005jϤUf\u001b\u0019P\u001e\u0015#\u000eDPmjx\u001b#Wi-Q+@cٚx2\u0019Yz}]p\u001f,\u001c2J=<\u0000\u0004;8wTP;n#pn,aW0rP+\u001b1]&;/8\u0004&pX\u001cBr?\u0006\b\u0004cj\u001f$\u0007\tbt u\u000bXT1Mi]1CE\u001d&TJ6UQUMK*J wNdvgw{j\u0015}!\u000fó>G_AC\u0010a+ڏK0\u0003P\u0002v֔/w\u000bP\u001f\u0016Я\u0000+ԉQ!PIހwL\u0015W\u0015D\u0004dq, \u000fއ:*\u0007 w;F\u0016џ\r\u0013>mM'cЀ۳{[WK\u001d-7ml\u0010J׵\u00101,\t57\u0005\u0003~9u1vbM\u0014F4\u0014\u0004-R\bٹ3ˤ\b\nEA\u0013@Y\t\u0005MX)y5Oy\u0013sB7E4\u0011PGs?\"\u001b\u001ed,0t\u0010Ҿє႐2Gt!\u0005+1I\u001cfbQTbꀭ\u0003N\u0012`\u0012l,$\u0005H*IJ@3C\\:\u0015\fXTArTCOsI\u000bJ\u001aa4KR\u001aa1}4PΩ\u0017\u001c:Z\u001cCdtN3\u0015\u0015=F\u0004qS=\u0017\"<OVZ&5\u001b\u0013tQU\u0004m?\u001a[Eg@_5SP3\u0010\"=(@4꼒y\b)#GU\u001b0IqA>2\u001e/\u0004T\r\u001d8\u0013\t\u0004(\u0016ԁ\u001c\tkA\u0014SM\u0006\u001e8s/\u000bՖX׀-9]]\f/\fp׹ed\u0011\u0005\u0005\t\u0002d#0N\u0019D`'`\ridAt_3rDP?CP\u0001d_5E\f^'˥\u0006%^$mzDISȱǐ;bej+\u0019\u0004 \u0000\u001f\u000f\u0016v?\u001c'BYFGA&s5Y@G3Hn\u0014*薹%n\\,w/\u0010W\u0011GE.ѝ\u001ep1\u000fك$$'\"فUR޹l[4w2g\nR\u001c\u00154\u0019V(ʧu!VY\u001eLP\u0002\u000b\u0019+쬵\n\u0013\u000e>emErz/|m1KKZ-o[%Ρ _:Be\u0007*ʖ\rHU3DȨ\u0005XN\u001e%\u0002GY\u001auM\u001dO\u0017&\\}!e.*0Q\u0005J\u0012%\u0019O\u001f<\u0010\u0012\u0007r3\u0014>\u0002,WdCKZ]\u000b.,:lpVFhҰ҆\u0007\u0018\u0019:ے\u000e2Uq@\u0011#\f'2]K4l5dͻm\u0006\u0016NF#XM#9[Y\u000e\u001aSb'2\r\u000f+{\u0015Lnd+&X\nF~\\L\u0011dc\u000f$aB^An\u000b<\u0004M\u001bVh0dD0=1\u001298\u0004ՏO(#o/7j]\u001eISoK\u001c\nsyHTȨc?\u0016\u001ek;\u0016}\u0007/\u001d<)W߿\u0019Z\u0013ש<\u000f~\u0016'\trN<G>\u0010? \u0016Y϶-$Iɲ)1I\f{V!0Yh!~6V0,}_\u0013+>w\u001aF\b$\u0004q0`B;q\u0019\u0014\u0002B|#᳦/ᫀ\u001c\u001c\\>@/z~Ջ\u001bfk#\rk^4~6Dc\u001cIg>{0WBrgA~~/\u0010tr\u001e.LH\u000fҽ\u001a=)㽉|~$E\"\u0011l\u0001<,\u000fg\t\u0011\u0001\u0002\u001fgx]#\u0004+\ttǲ\u0001:6;!E\u001dt\u001db\u0007ซM\u0019\nsCdP^ٴ\u0011'pظe֎xdqwķn\"^s$BDm\u001bavc!pe\u0017?\u001507#k~sڣX{[\u0017?+w?^>\u001f\u00157l;|W\u001dO`|\u000bװ^h1]4߆T\u0013$xŢ0\nOi>\u001e\fQ]\u00136\u001c=)eL1\u0005:\u0005x9\b.u˅\u0002/p\u000b͹ncL<3\u0011,\u0001{u8D>1\u00183Ə4ƚ,y8tX,DD\u001ce\u0017V\b@RC\u0016Xytof\u000b|{lqǆ~U\u0005>lp8➌o~v\u0005ƻ\u0003ƻA\r\t|\u0016qGr.q\u0013%\u001au\u001c\u001aN˖\f/te\u0015=\u0007]=#,jGv]7=o{L\u001e(웮PA^;\u000bNʿ\u000f\u0016\u001e>Bܠ\u001ab5k2rW\u0019\u0007i?\u0000MpYQ\u0018{\u0019h\u000f=\u0013:\u0011\u0012CMf]q\u0000|l\u0001#%\u0001\u000bb\u001e\n_nm\r>9&ATkm0xH\u0002<x=\u0019p2(tfA~¨u\u0003\u0002\u0003ГDigz\fqGWB=ON\u0019PrA܃*\u0000~@+A\u0005!0<\"P4\u0007\u0014Z\u00011o\n\u0000vP32B\u00078(j`}v\u0002X;EЈVc-bH[G\u001a~f.7@\u0000?39޳٫ӟa\fZPԯ\u001fYdu\u001c8urC?\u0002\u001c92P˜s\u0006ˠO5;:\u0003֙~SYtˈ}J/*\t\u0005k\u001eu_~ۛ_du뼻G,\u0013PHfYM\u001d\u000e{|}6446H\u000eڶ\u0003\u0001ced444Ɏ\u0013:\"{HF*er&NuIvlCn\u0016t7MRB;ɗ!\u001f\u0004M/a \\\u0005:6\u001a\u0018N\u001d1nq+3Sr\u0019s\t[`W*+[\u000f)Z\\K\u0019'Ք7J%*'i[#||\u000fxA\u0014eBenYp\u0005}\u0005%P.&W\u001a4J\u0000K:Gy+H^퐧\u0019H\u000f\u0014ٗ\u000bdn1f\u001d-kB)Q⠓k?\u001b1ݒT\u001cA\u0019\u0003隿\u0001ڵ2}iuy\u0015]ֵ\u0015<w\fHK\u0011=yK\u0015B(2宓Ay篔(\u0017{\u0000GzٟHK\u0006\u0013\u0019ZƘ/\u001b{:\u0004 sI.c\f3{GO7p\u0013iۨ\u00033؃*Cc\u0002ss\t~<W*ygUey琕@LW\":D\u0018;\u000b1cm\u0014\u0018|<\u000br\u0016*f\u0018m=\u001b{f6>6VQݳk0$\u001f:\n}Mr}H_LQUVRY_uMrFV\u001d̼V$\u0018wJiSg^\u0016I\u00175GP5?|:\u0018h/Z.YØ~%vZ/c2yMzsPz:~2.]#y8N*%UgdE7Zgp,ϫ\u000e{b\u0005&J&ju*xɖ\n;^L'W\u0017\u0004~T\u001fGga!\\gUgYS%\u001cnF.22\u00070dا^{w\u0019oꥂIts72\u000e\u0001t|U1;:撶\u0014^RmF]m;o\u0007{\u001c\u0003kl\u0007h\bua}uȟF\u001f%3ˤآ-)sUDQ8#\u0017OX\u0015\u001d2pL\u000e:\u000fC\u0001cl\u000b >V55,\fRWuE^KLeOQ,}Ҹ\u0018QL\u000f5-8Zj\u00013e\n㾦qUY߱}\\nu2t<-wz'sHSΝ9L\u00043~\u001cV:)N\u0004loN˼ɲ\n+p_xD=+]}qS\u001eM/<\u0006\u001a5װF5}\u000b\u001at}K\u001ca}\u0006^E٣\u0015Ɔ\u000b\u001dۼ7{?&݇䦸K\\ȵwOzlDʽ/o\n\u0002\u0001\u001fǿ\u0014NիRٟ\\K'\u0011Wl\u0013r_-K\u001a쮎XPǹճY\u001dҕnup\u0018Ctnʯ6\u0013S\rTtIe6y1\u000f}\u001frzy\u0013MYn1\u001f9؞&MR_ppޝcYd\u0017bg,vw|ͻ9 W:_k/Md;52}V:\u0001.\u0002{Y&{?u#؃NKH\u00173s|\u0011\\satP\u001f鼂U\u0018{P}IU][\fu<~f:.Lp=蕕W\u0015R\r\u000fڻy\u0002keM\u001e`L<.a<\u0002ـ\u00101:\u0006t/{\u0019\u0006\u0017(o?\n/Q]\u001chq\u000f-W(C\u0014;;=:~\\\u000f(\u001cigH^*-y\u001eK{}e;\u0013iK7 \u001a@v>\u0001ދ*\u000b5>\u0015N\u0005η#7|G۩`Mn>\b\u001a}%\\\u001b\u0017\u0013<q~ dy2<׶;#Nd\u0007\u0011B(dxQ|yE\\>veO뼟#\u0005}\u001b*?>JKX\u0014m=\u0015zb\u0015g\u0002u\u0013LJl_':57\u0013y|^rf.ܤloe]r6\t\u0018p1wvvt\u001e\u0012l\u0015r7[7\bYJHSD\u001ao\u001ej|\u0012ҽB\u0017f F? }\u001buoC-<+wʮGe6=\u0016+_59<(bXKu(&2r9\u0010ퟦ$\u0002\u0016!/\"?\u001e7\u000f\u0005~%\u001fгgLc\u00017\u001c}\u001c?8Q3\u0006D?\t<ېےѿD+\u0019\u0003oJ8<\f9\br\u000bxS;ys1]gޓyST=N׷_.)W+\u001bΗi9{OFo\u000eC-)&Ċܘ%xՁ;Ek[p\bYK\u001b]\u0014Ӣ\u001dFL'\u001b#O!\u000b *\u001e/\b$cV>X~\u0018\u001d_5\u001fvCPIe;]|\u0007o{#F9N'%Q>Iֶ}o\u0011\t;Y\u0011ϑF:$¼|\u0017FEz\\rR_5$\u0006\u00064\u001b0\u0014'\u0006O0}A'뿬\u000fUU\u001d{}]\u0015\u0002YX \u0011\u0003d6Ā`\u0004\u001c\u0018]p @`\u001c\u0019H$K!T@@\u0016a))ĂXf\u0018\u001a\u000e@\u001a\t\u0001\u0010\u0003eb\u001a;}~瞻|v79{~)}2(s\u001f(xֽ1{nU[}ȞٹoqN\u0001vMߚ7$c\u001ffާi|w\u0002}/&_/.\rwJYjl$\u0000\b[\u0003ⳫS{ͅi[\u0016\n\u000e8/w\u0004f\u001b>}FDh\t\u0011m7v9Rlq_1 *!\u000e6Ju8B({P0̤7ۯ{ǥ\f?ߝJ\u0017e\u001cUƘv]\u0011\b몗!0%\u0018$W`\"L\u0016Ao?\u001dvD\u0016mu{e]\u0014NR\u001b,H\r\u001ak4^%q$i֨ܬV%k\u0004v~͖qv\n\u001akZ6s\u001dsp2w<~7jl.nd\f\f f\u001f㭷jK?m\u001e%\u0019}O\u000b%\u0004n^\u0019#?\u0010:*\u000bFM|Pz@J\u0015Rm5{ꠙ\u001c\u0005\u0007]T|<\\=\u001dt3\u0018\u001cF9>{\u001bvu\"H%{u\u0019V\u0013dPX\nql\f&ŝC\u0019\u001b<iL\u0007_h\u0006tsF\u00079\u0016ϸS{u}_!\u001aT~\u001d7ejR7\u0015s^Y¸{X\u0003$\u0016}u@%{Oʕ\u0017f\"/R\u001e=RpJn_W\r\tXOlm2qm-ALe/;\u001a\u001dgA=s\u001c>=c^_Ý63\u001c>tcs'ȅjɅrŕwͅr#s|%摯^y+2\u0017ʯ\u0014摯^Pޫͅ<s\\(<ByF;ðwSyY.ջ\u0019a:u,l\tXS&\u0019#݀Z<<\u0017mqcf\u001ews5Ν3'#+1\u0011P7\u00133vIFf\f/&6s LϺ\u0012{w\u0002˚8\u001bX:Xê>wt̊UwYX/?R\u00172-DG\u0006=߷7'h\u0005KoA'vͥr\u0011^o92AZc#4\u001e\u0014\r)\u0010tNit@V[Mt\u001bȤ0EͲ2z}\u0019EHʓmx1&˔\u0015ʗJTWEJ5{v]2vY\u0015\u0017&;gm-X~Y|jd\u0007\u0005rYؙ{\\\u0015\u0015/elSo\f\r~,\u0003D[gSM@:ٽ~L\u0016\u0012\u001fVFCsj\u001b몕G}U+=R\u000el߱M؊9#\u001b9\u0013]suMk\t@\u0018n=j5vf,a=S&\u0007Ky\u000fsl2Ԇ\u0019fp\u0016Ml.=R@tW\u0011=&]TE8׈a\u000f(qS\u0001l3\u0017\u0005é1\u000b~o-\\i\f\u0004nP^\u0013f:gVtcf\\G^8ow\u001d\u0017?~}^o5zYtk6Gz%Yz8֓\u0017qءIFj9s ѹVYk8{W˵Y6~mֱ%6\u000fS\u0012}ݚmyl^oN2FTbU\u0012\u0006Mcm\\\u0016vXUܹq-N\t\u001bMCؘm\u0018}\t2ꕉDOfoŖ\b\u001fCė!=JGŽE<\u0003{(a_`\u001a\u0002Yc\u001aYرƾO*/EX˸Sxh?O'eQK%\"\fg56j,l\u0003ZH8<㜷QI=d_X)9'~H+[\"w1ʧk^#.%XӨyI\b\u0018mp4_G9^z|΀8\u000e=\u0007\u000e׻'[\u0018sD9D2s\u0006D\u0007h3׾T{]-R8׳U\u0017t\u000f\u001dm >D烷Џ/:OKa\u001do۶?\nc-uwy\t~\u001f-y6~)SH\u000f㤩uz[u삘̩y^\rP¼u.e\u0003s h\u0017l(\"YlC\u000b\u000be ѓ}\n֢\u001be4Gj\"eB[&\u0004\u0000j\"~+4,Z_\u0007>ڇAE~=OE9?V\u0004>{R^\u0000z\u000e(sػ`1+wTʿ+婎\"3x1k1~\u000fƠ{zKe@ٍP\u0004\u001dZh<oWf/u\n;\fi\u0011_\u0000\r:=2FFyO`\u0017˨\bഔ\u0005Ur92Kf=\u001dnᶚe/b\u000en\u0004ΦZ)\u000f%.28|\\釖_|w[\u001fb\u001e,;\u0015Q\u0017_ZY\u000e\u00056v\ngK\nxmI]g\u001d޵DFߐUѣhGeE4׸NzT\u001f\u0019IOD\u001f͠އ\u0006s\u001d\u0013,rZP56\nGj؇aR\b^cws=\u0002/1\u0010O;\u001fl~-Ʒ\f =<s\u00136**Q)U2ߍ\u000e͉r'_s|;\u0013m;wBz*~%{\\yq+Mn%o^Jrޚtכ\u0017TC\u001fi\u001c|\nga)/\u0013પ3\u0000s͢\"\t\u0010v\t4, D\u0014(Kd,`Z\u0017t\u0010D\u001aG\u0016\t\u0014\u0017b¢\t:\n2j[*cHqa,aZZ˚?xws=?ۿ\u000f{܆c\u000f8w[=K\u0011\u0011O.\u0011\u001a\u0003m%vq=ܩvNcE\u001b\u000f\u0012\u0016|lx\rŦNE5O6(⫝Q\u001b\u0014\\2@8-3n,6\\R\u001b䛙,k3ն=^\u000f7G`#Hp_]\u000bǱ3ꛬt:\u001fʚ{[)z\u00077x)/\u00131z{q!}H&{=$9Bbumy|>/;e8_}I'ݯ\u0011ky+to\rC}\u0017:5IΌcqk+c2\u0003\u001b\u0017;5i\u0018%rK˼m2.;\u00185g!5gSIa\u0015Fz\u001d`\u001f{.g_m6#ii?$=\u0013]erT)נR\u0012.S.+\bX=\u0019\u0019Il+jo6I{\\ch3\u0011{TL\n.')yR>$CR\nf\u001d!`fa\u0017Qm\no?{R>@ꐵa^4Dst\u001as8\"^A$2F\u0015Ξ\u0003V|&f\u0017ZK?{Tyo}|A{y\u0000n-r\"KO>MOd5T\u0013Yb͒x=l/C%ߴH\u001f\u0003qp>T%N\u0011NEx\u0012V#߁C\t]Rz$z\r:O;otIb/\u0001W}p\u0014Zf]#s)\u0019c\u00029W_v\tt\rL&uN\u0011ع&``޺\u000fv\u0013\u0019\u001cvRssY\u001cN\u0019*cA\u0007^{X~{Sż13UU!?ßyϜ^2\u00177>~Lls&SdB\u000f9ߌ7\u0010U\u0012cFkmyAbVNѺ'tW\u0019{:=U&ߦkĐe-vjtl0\u001d!\u000f:A\u0004a`T{\u000e$S\u001ej\u0003\"dQRŌ\r'׭͸\u0007R^d{]j\u001b\u0005[#aR0F\u000eԡ͖%6VKtQ\n8/\u001b\u0014\f ?{kGb\u0004u0\u000ez\\(r4-&?s\u001dtP\u0000!RvQp{YVV\u0003YA<o/\u0006N\u00121`j؎p\u000f⏐ǐ5^<h۩\u0013o?lO\u0015m<6m~\u001e1ÉM\r\fS28P|\f~62Ubw?6\u001dkW}n.g\u0019sdYͫiK\u000fc\u0017\u001a6Y\u0011\u0014\u001c}\u0017ʪGd{R\u0017L$Na,2\u0019Y1Ԋ9HMjM\u000eq\u0016L>yC\u001fb.[K\f-<Ʒ\u0013c4nE\u001b4.7\nd^\u001d6%9JpF8\u0013\t\u000e\u0013BEl}87Pdё\u001fDV~!҈/·\u0002YIX9Xlڞ`|0x\u0005s;k\fe\u000f)qS\u0012Լ*5Ogi䳒TwlK&\u0003\u0015P.ȓ\u0017`\u0002J)s[7e\u001b\u0011 \u0007AQ\"K\u0017\u001cfn+\r\u00068+e+l4\u0007Cׇn?`d\u0016K\u0001c,Iw\f\u001f\n[)O巹\u0017eQƾ_[dcL62k@)\n\u0017ߞ~Y\u0016ٱʝnI}m.Ƭ7#\u0018\u0019_C8\u0019 8\u000b؞p\u0013\u000b̖9Nahu QlƙA\fiE:cľqc`\u001fh3,^\f\u000b7p:,<.w\u0012_7` \b4w5j{jN4\u00135Os>+\nH+\\w%Ks\u0013M\u0007JY\"*i\u000fʵ<yN}ύ\u0006Es@rí@!sCx*}mxɾ\u0010s\\l\u0010^̷\u0012b\u0006e6S38}M̤Ⱦ{͜eQT?С:\"|\u001cF\u0019M^\u0007q4P?kla/\u0017\tn\u0012)\u000f4Gd\u0005F\u0005DJ.\u0013^P$t\n҉VȄ525bm>\u0017s~-AX\u0010GeL\u0018\u0003d2\fOf\"w41\u0019܃x\u0012պ\u001f\nEP=Y\u0011\n{v_&'\t\u0001ʏd_JiR\u00171Drμ8G\"dl\u0012Y\rLF}j\u000b݇)ggׄ;ɺ?u\u0000{T_}f.=Ci\nO1^\u0006f Uf,۝.\u000fǟM\u000bX]Z\u001f*\u0003>\u001fl\u001fd\u0011߯\r[n\u0000}g3,̫6}8x\u0014cd<;js9-yL?\u001a4Z$s٣)0U=Wo+b{|Rs/|8})F\n1ɷ+xYu\u0011{e\u0006{9k;!e\u0010d?3F.B\u001cEՒT2Z\u0001\u0005\u0004;eǜ9OtGS7lRWqaj'rg+_C{KofwP\u001e:B\u0010\f3%0r/ئ;|NIFb\nYx\u0016B*ݘ^`\u0016h,M8\r0G3%iJ%H,}L{T[\f\b֊B\u001ed\u0001>&:Me7mco]=?I%u:Ds}mP\u0007G콗\u001by=,Bo}v/鿏w-`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`!Z56}^\"/\t\nP\u001f}ȷOApOAWpDr\u0004<|OvqKZ.O7\u0016n^WʷPҊ6?7s\u000fx7sA\u001dO7s7\u0016G\u0017GYz\u0014)D[i\u0000YFA<@\u0019J\u0002\u001d,]\u000eP\u001a[Ħ\u0014\u0014\u001dDa\u0005\u0013&f;n\u0018\u000ed[O߻Gv\u0011(AI##Yn\u001f0\u0010#Y\u001b<\u0018ZȢB1ۈӑfGq7R1\u0017!HxFx-\u00140\u0018?αN9SŽ\u00144w#h{\fnKS(\u001f`Lzuymp\rO\tU\\G^\u000e}\u001ey\u0001Hc\u0015l٘YxL\u0004$G=#<¡\u0003*:\u0003tp,]\\6\u0015\u0016eR`h!\u000e:y'آ:9gL\rftT;c2łJe\u000e'*\u001eiGCG`,\u001dU{cx&~\u0004fFjo1=EGyLNL\u000eXJ5{D\f:UL1\u0017w\u0010F\nc鄓S\u0005=Gj26w\u001c\u001c\u001dv\u0012\t'RRp\\2'}$B,oe?\u0016=%cޝT@\u0015q\u0016S\\,\u001c厨/CƘ\u000fG僿\u000b\u0018zݍ]tk\u00173 &0(a9`ֽ˩\u0005N4)z?{\tE\u0013\u000fZ\n+2~\u0014\u0004wmpn\f/\u0004\\\u0015(\u0001I|k\u000f[\u0010vn\nW|{_\nO\\\u0010\u0005]|b\u000esֈ}[9\u001b}+A\u001bZ\u001f\u0010of+`\u001a\u0004^\f\u0012\u000b恔s Z\ny\u0001+,\\oy 1\u000b\u0005C\u0005:_i]?jy\u001e\u001f\u0000\u000036XD\u0019\\<9\u0012<\u0006\u0001\ryƁ$CAJ\u001b\u0015e\u0007W)\u0002\u0004\u0001\u0002f<\tTn%Wi\b\u0007P4\u0006}\u001a\u00039.K\u0003K[@?]Yީ_\t7`#\u0004\u0011#\u001dObKO\"C#\u001e\t8?\u0010@;P}\\I-;>\nݲVsn| \u0019]\\/A熃jNZUZ?\u001bX\u0019!>ZZ\u0013*!۰m<h=<e/QL3e\tb\u001er\u001bJh^*?'P'\u001dki%\u001ewYڃJϚ`uN\u000bQtqW;UUnӲ<\r8ÝOUz\u001e\u000e#7R\b\b8q>&kةI$\u00065G\u0014B>yr4r}VXYNo\fʏ.,L`\u000eKAiwC]uUtwܐy<ڴd+\u000fT6WVk!ސ\u001a[\u0003So\r\u0006\u000b\u0017f\\\f A\u000eGX\"__\u0016qOgFZC!ֱn\u0011Ecoh\u001a\u0010sM|I\u0005ů5=\n+1K;\u0010>8؏C\u0013ĵ\n\u0002ީ'+t75fju3Y\u001977\u0006M\u001euQ\u0010o\"v!VEn!~\u000fommƷu}\u000faĊۡPv}:̸^\u001dԸ\u0005+\u0012ue\u001bTz\u0007sh#.6n\u0013g={J%#-\u0013\u0001Ȕ{]\u0005gŔ\u0006\rVuQ6zC\u0017ڠzՀ8\u0017ȴW\u0015W\u0004N\u000f8\f0'=/A\u00138\u001b5\u0019\u001aXxGvgi\u0010\bq\u0012\t44%\u0013I\u0014\u0014@\u0011me#\u000b#\u000b#\u000b#F{/\u0002m\f\u00181\u0004c!\u0018C0`\f;\u0004c\b\b\b\b\u001b\u0011\u0018\u0011\u0018\u0011\u0018\u00116\"0\"0\"lX0,\u0018\u0016\f\r\u000b\u0005Âaa`Xl```\b\b\b\b\u0011\u0011\u0011bCP0\u0014\fņ`(\u0018\r\u0005CPl\u0004`\u0004`\u0004`\u0004\b\b\b\b\u0011)\u0002maaa٨èèèQQQ\u0017cWe\u0011\u001a\u001a\u001a+5(5(5(5VjPjPjͩ\u0017x1\u0004I0\u000e&vpppVx\u0015v000laaa(((QQQQb\u0004\u0004\u0004F\u000fn\u0011h\u001f\u000f5i]+&<s\u001cq<Iw8>EW9>I\u00179g8\u001e\u0001c\u0011q,Pp\r\u000eN\u0002\u0006!\u0001@H\t|\u0006yu_7n\u0016>\u000ez3ޛE3޺W({hH6(<v`\u0002\u0004Q7Κz\u000e\u0001A\u001cD׎C\u0003&n~$ BJNE\u0017FԨJTRU\u0017\u001452^+dP5\u0012ʕzDWެ\r[Ǽav\u0007\u0016@蛠߀C\u0004tF28\u001dsv\u0002>ҸZ}/$}\u000f4.aqҩ$-ĩcu&6H:aLt;K\u001cg>\f`2\u0001_TAAnA@R :\b\u0013$\u001dk\u0011r\u0013\u0000cobե(]\u001a%8\u0002{1\u00003>\u0001x\u0019,N7oE\t#\u001e\u0001O\u0001\u0000\u000f=6\u000ep3\u0002\\X6J\u0011\u0016ơs\r,Fyxl\u0018\u0004H\u00070u\u000e\u0018AI\u0014&\u0010\u0003\u0017\u0001\u0010P\r&N0:k\u0015{\u0005]\u0000/u\"l3\u001dF\u000fχj\u00039\u0013eB,ooQv?+`\u0007+RxKC\u0016;ʩ\u001dVb\u001f\u00056.`%$.uG\u001b,\u0004\b~3/x},fIu\u0013KN\u0004qөM\u0000\u0019\u000b\bM>siXI/yU()YAOU.S(Ҧ\u0015I!Je\u0012ض}m\bmaaP\u0002M$Hp=Bd\u0017s/\u0010{Q\u00175Ff.\u0003Z^s9~´}ywMg/:UJ`\u0017>%sOwtg\u0002'soN(}=%Xwgtohs\u000e\u0018t\u0018vv\u0007]^T/9u\u0014-R\u0017,y\u0017h;\u0006\u000bh@\u0000#*<!\r(%`8\bDIB\u0012)j!_UU\t\u0016mŁ\u001d\u0003cDB4:Ȣ\r@\u0001%\u0004{\bĨHG)z2G\u0010Bt\u0002Nߑ&\bpٖr&VV\nKZa^+,/_[Z]C╫\u000bK-W[-[\u001eUUs[R\u001bF\u000bBޭeN:庻9\"I\f`L;\fb,X\u0019p\rY{R5#\u0002{x~ qCקⱕgaB\u001f\u000eZGAЕʦ3tu`\u0015[\u000f<\u000f\u001bn0h9,-A'fl\u001e/^pppk\tw\u0014\u000fm&)lVRPU\u0012!6O\u0016m~|\u0006f\"ːj>h\u0016\n\t[\u0000\teL=PA+\u0002.YZk[%*k\u0007>\u00197A\u001e'FF-FmHK62\u0011 \\W\u00111PKPD=@'\u0005U}5^Rk6n\u001bY\u000fYj\u0016\u0002e\u0017\r|{\rk1M,QQ\u00166WR#jI/7\u0017$\u001aA`%JcpVĠ HmOr\u0005Ca=\u0011`\u0000\r\nendstream\rendobj\r40 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r39 0 obj\r[/ICCBased 50 0 R]\rendobj\r50 0 obj\r<</Filter/FlateDecode/Length 2574/N 3>>stream\r\nHyTSw\u0016oɞc\r[\u00065la\u001d\u0004Q\bI\b\u0001\u0012BH\u0005AD\u0005\u0014ED2mtFOE.c\u000e}\u000308\u0016׎\u00178GNg\u001f9w߽\u0000'0\u000b\u0000֠J\u0016\u0015\u0014b\t\u0000\u0003\n \u0002\u0011\u00002y.-;!\u0007KZ\t^\u0007i\"L0-\r\u0000@\u00198\u0007(r;q7L\u0019y&Q\u0013\u0004q4j|9\nV)gB0iW\u00198#8wթ8_٥ʨQ\u0014Qj\u0001@&A)/\u000fg>'K\u0002\u0000t;\\\u000e\u001b\r\u0006ӥ$պFZUn\u001e(4T%)뫔\u00060C&\u0015Zi\u001b\u00018bxEB\u001f;Pӓ̹A\u000bom?W=\nx\u0016-\u0000\u0004[\u00000\u001d}y)7\u0018ta>jT7\u000e@tܛ`q2ʀ&6ZLĄ?\u001d_\u001dyxg)˔z\u0016çLU*\u0006u\u0016SkS\u0013eO4?׸c\u0001\u0007.\u0000\u000b\u0000\u0000R\r߁-\u000725\tS>ӣVd`rn~Y\u0002\u0002\u0002&\u0001+`\u000f;\u0010\u0002\u0010\u0002A4\u0007 \u001d\u0002\u0014A9\u0000=\u0007-\u001dt\u001e\u001el\u0002`;\u0018\u0003~p\u0010\tGp\u001e|\t[`\u0012L`\u0006<\u0005 \b\"A\f\u000bYA\u000e+\u0005Cb(\u0012R,\u0000*T\u00162B-\n\u0007ꇆ\u001dnQ\u0004t\u000e\u0004}\u0005MA\u000f0\u0002a\u001el\u0007\u0018S\u001cx\tk&\u0013^\u0007\u000f>0|\u0002>\u000f_',\u0002\u0010\u001aG\u001c\u0011!\"F$H:R!z\u0015F\u0006Qd?r\f9\\A&G\u000brQ\f\u0015h\u0012\u001a\u0015E]a4z\u0005Bg\u0004\u0006E\b#H\t\b*B=0HIpp0MxJ$\u0012D\u00011D, V\u0010ĭ\u0003KĻY\u0012dE\"EI2EBGt4MzN\u001d\u0004r!YK \u000f?%_&#(0J:EAiQ((\u0017)ӔWT6U@P+!~\u0019m\u0013\u001aD\u000beԴ!hӦh/\u001c']B/\u001b\u001fҏӿ?a0\u0018nhF!X8܌kc&5S\u001d6lIa2cKMA!E#\u0016ƒdV\b(\u0006kel\r}}Cq9\nN'\u0003)].uJr\n\u0018\fwG\txR^\u0005[\u0004oƜc\u001ehg`>b$\u001f*~\u001f :Eb~\u0016,m,-ݖ\u0007,Y¬*6X[ݱF=3뭷Y~dó\tt\u001ci\u000bzf6~`{v.Ng#{}}\u000f\u001c\u000e\u000ej\u0001\u001cc1X\u00156f\u001cm\u001d\u001c;\u001c'\u001c_9\tr:\u000e8q:˜\u0007O:ϸ8uJq\u0015nv=MmR \u00154\t\nn3ܣkGݯz\u0010=\u001e\u001e[==<=G</z^^j^\tޡZQ\u001bB0FX'+t<u-{__ߘ-\u0011G,\u0010\u001d\u0013}/\u001f\u001a\bH\bh\u000b8\u0012mW2p[AiAN\u0006#8$X\u001f?AKHI{!7<qWy(!46-\u0017aaa\u000f\u0017W\t@@`l\b\bYĎH,$((Yh7ъb<b*b<~\u0014L\u0012&Y&9\u001e%uMssNpJP%MI\fJlN<DHJIڐtCj'KwKgC%Nd\f|ꙪO=\u0006%mLuvx:HoL!ȨC&13#s$/Y=Osbsrn\u001asO1v=ˏϟ\\h٢\u0005\u0005#¼\u0017oZ<]\u0014TUt}`IÒsKV-Y,+>TB(/S,]6*-W:#7\u001f*\u0015\u0003\u0007\be^YDY}UjAyT`#D=\"b{ų\u000f+ʯ:!kJ4G\u001cmt}uC%K7Y\u0013VfFY\u000b.=b?S\u0017ƕƩȺy\u001a\rچ\u000bk\u001a5%4\u0019m7lqlioZ\u0016lG+Zz͹mzy]?uuw|\"űNwW&e֥ﺱ*|j5\u0001kyݭǯg^y\u0017kEklD_p߶7Dmo꿻1m\u0001l{Mś\r\u0006\u000enLl<9O\u0000\u0001[$h՛B\u001cdҞ@\u001diءG&\u0006vVǥ8\u001anRĩ7\u001c\u0002u\\ЭD-\u0016\u0000u`ֲK³8%\u0013\u0001yhYѹJº;.!\u0015\nzpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\\dlvۀ\u0005܊\u0010ݖ\u001cޢ)߯6DScs\r\u001f2F[p\u0011(@Xr\u00194Pm\u00198Ww\u0007)Km\u0002\f\u0000\r\nendstream\rendobj\r38 0 obj\r<</LastModified(D:20200626163318-07'00')/Private 51 0 R>>\rendobj\r51 0 obj\r<</AIMetaData 52 0 R/AIPrivateData1 53 0 R/AIPrivateData2 54 0 R/AIPrivateData3 55 0 R/AIPrivateData4 56 0 R/AIPrivateData5 57 0 R/AIPrivateData6 58 0 R/ContainerVersion 11/CreatorVersion 23/NumBlock 6/RoundtripStreamType 1/RoundtripVersion 17>>\rendobj\r52 0 obj\r<</Length 1144>>stream\r\n%!PS-Adobe-3.0 \r\n%%Creator: Adobe Illustrator(R) 17.0\r\n%%AI8_CreatorVersion: 23.0.3\r\n%%For: (inder) ()\r\n%%Title: (logo_with_name.ai)\r\n%%CreationDate: 6/26/2020 4:33 PM\r\n%%Canvassize: 16383\r\n%%BoundingBox: 230 -448 795 -329\r\n%%HiResBoundingBox: 230.911500548278 -447.3515625 794.774999999998 -329.546242367805\r\n%%DocumentProcessColors: Cyan Magenta Yellow Black\r\n%AI5_FileFormat 13.0\r\n%AI12_BuildNumber: 585\r\n%AI3_ColorUsage: Color\r\n%AI7_ImageSettings: 0\r\n%%RGBProcessColor: 0 0 0 ([Registration])\r\n%AI3_Cropmarks: 212 -459 812 -309\r\n%AI3_TemplateBox: 512.5 -384.5 512.5 -384.5\r\n%AI3_TileBox: 116 -690 908 -78\r\n%AI3_DocumentPreview: None\r\n%AI5_ArtSize: 14400 14400\r\n%AI5_RulerUnits: 6\r\n%AI9_ColorModel: 1\r\n%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r\n%AI5_TargetResolution: 800\r\n%AI5_NumLayers: 1\r\n%AI9_OpenToView: 58.347368421053 -149.378947368421 1.31944444444444 1219 848 26 0 0 259 87 0 0 0 1 1 0 1 1 0 1\r\n%AI5_OpenViewLayers: 7\r\n%%PageOrigin:112 -684\r\n%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142\r\n%AI9_Flatten: 1\r\n%AI12_CMSettings: 00.MS\r\n%%EndComments\r\n\r\nendstream\rendobj\r53 0 obj\r<</Length 5448>>stream\r\n%%BoundingBox: 230 -448 795 -329\r\n%%HiResBoundingBox: 230.911500548278 -447.3515625 794.774999999998 -329.546242367805\r\n%AI7_Thumbnail: 128 28 8\r\n%%BeginData: 5262 Hex Bytes\r\n%0000330000660000990000CC0033000033330033660033990033CC0033FF\r\n%0066000066330066660066990066CC0066FF009900009933009966009999\r\n%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66\r\n%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333\r\n%3333663333993333CC3333FF3366003366333366663366993366CC3366FF\r\n%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99\r\n%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033\r\n%6600666600996600CC6600FF6633006633336633666633996633CC6633FF\r\n%6666006666336666666666996666CC6666FF669900669933669966669999\r\n%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33\r\n%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF\r\n%9933009933339933669933999933CC9933FF996600996633996666996699\r\n%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33\r\n%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF\r\n%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399\r\n%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933\r\n%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF\r\n%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC\r\n%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699\r\n%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33\r\n%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100\r\n%000011111111220000002200000022222222440000004400000044444444\r\n%550000005500000055555555770000007700000077777777880000008800\r\n%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB\r\n%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF\r\n%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF\r\n%524C45FD0BFF835F3434FD050B0C0B0B2EFD70FF84580B0B0B1211341234\r\n%123412340BAFFD6FFF340B0B34343B343B3A835F5F3A3B1134FD6EFFA80B\r\n%0B123A123A123A125F5F83593B12120BFD09FFAFFFA8FD27FFA8FD07FFA8\r\n%FFAEFD2FFFA80B12343B343B3B5F343B5F845F84343A1234FD07FFAE5834\r\n%0B343483A8FD22FF840B3483FD04FFAE593411343483AFFD2BFFA8051212\r\n%3B343A34845F5F345F838311110B120BFD06FF5F0B110B0B0B110B1183FD\r\n%21FF830B0B83FFFFFF840B0B0B340B0B0A34A8FD2AFF0B123A3B343B345F\r\n%5F84835F5F8434110B120B34A8FD04FFAE0B120B83838334120B34A8FD20\r\n%FF840B115FFFFFFF0B3483FFFFFFAE5F0B34FD29FF340B123A123A123A59\r\n%8359835F830B110B110B340BAEFD04FF340B0B84FD04FF0B0B0A83FD04FF\r\n%A884598384FD07FF84835984A8FD07FF7D8383FF830B0B83FFFF590B59FD\r\n%06FF580484FFFFA8FD07FFA8FFFFFFAFFFA88359A8FD06FFA884598384FD\r\n%08FFAF2E123B3B5F343B345F5F8483841212343B343B340BA8FD04FF5F0B\r\n%1283FD04FFAF5F83A8FFFFFF84340B0B0B3434FD05FF58340B0B0B3483FD\r\n%04FFA80B110B0B34830B1183FFFF840B84FD06FFA883A8FF831183FD05FF\r\n%5834AFFF0B845F110B110B5FFD04FF84340B120B1259FD07FF840B343484\r\n%5F5F343A5F835F8312110B12123A12340BAEFD04FF83110B112D5F83AFFD\r\n%06FF840B0B34835F0B0B34FFFFFF340B0B5F83340B1184FFFFAE0B0B0B5F\r\n%83340B340B83FFFFA8110B84A8FD08FFAF0B34FD04FFA80B34FFA8110B34\r\n%A8FFA8340B84FFFFA80B0BA8FFAF340B59FD06FF581134835F848383345F\r\n%838312120B120B12343B120CA8FD05FF59110B110B120B3483FD04FF590B\r\n%34AEFFFF840B1184FF84110B83FFFFFF340B34FFFF34110B84FFFFAF340B\r\n%1183FFFFFF84340B12345F83FD06FF5F0BAEFFFFFF840B84FFFF0B12A8FF\r\n%FFFF841158FFFF5F0BA8FFFFFFAF0B34FD06FF340B3B5F8359835F5F5983\r\n%110B0B110B110B3A34120BFD07FF83580B0B0B110B0B34FFFFAE0B0B34FF\r\n%A8FFA8340B5FFF5F0B11A8FFA8FF590B0BAFFF340B34FD04FF590B0B83FD\r\n%04FFA88334110B0B0B58A8FFFFFF830B58FFFFFF2E34A8FFA81134FD04FF\r\n%AE0B59FFFF0B34AFFD04FF84A8FD06FF34123B845F845F84838412120B12\r\n%0B120B343A3B0B34FD0AFF848434340B115FFF84340B340B3411340B1234\r\n%FF343411340B3411340B1284FF0B1234FD04FF840B1183FD08FFAE83590B\r\n%34A8FFFFFF3334FFFFA81159FFFFFF0B5FFD04FFA83458FFA83434FD0DFF\r\n%340B3B5F835F835F5F0B110B341234123A123B340B58FD05FFA88483FD05\r\n%FF83110B34FFA80B340B340B340B340B58FF580B340B340B340B340BA8A8\r\n%110B58FD04FF830B0B83FFFF5984FD07FF840B59FFFFFF5F0AA8FF830AAE\r\n%FFFFA81134FD04FFAE0B59FFAE0B58FD0DFF341234845F835F8312110B12\r\n%123B343B343B343A0BAEFD04FFA8340B34FD06FF11110BFFA8120B5FFFFF\r\n%AFFD05FF58110BAFFD08FF111134FD04FF840B115FFFFF110BFD08FF3434\r\n%FFFFFFA81158FF3434FFFFFFAF0B5FFD04FFAE1134FFAE1234FD05FFA8AE\r\n%FD06FF340B3B59835F5F0B110B110B110B3A123A123A0B34FD06FF0B110B\r\n%83FD04FF59110B34FFFF0B0B2EFFFFFFA884A8FFFF830B0B83FFFFFF83A8\r\n%A8FFFF340B11A8FFFFFF34110B83FFFF580B58FD06FF840A59FD04FF3434\r\n%830B59FFFFFFA80B34FD04FFAF0B58FFFF2D0BA8FD04FF340BA8FD05FF34\r\n%123A848383111211120B121112123B3A3B0B0BA8FD06FF840B340B5F8384\r\n%34340B1183FFFF5F0B3459FFAF590B1183FFAE340B34A8FF83120B34FFFF\r\n%83110B59AFFF5F120B1183FFFFAF0B1158AEFFFFAE840B1184FD04FF840B\r\n%340BAFFD04FF0B5FFD04FFAE1234FFFF840B5FFFFFFFAE0B34FD06FF590B\r\n%3B5F8311110B120B110B120B34343B0B0B83FD08FF5FFD070B1158FFFFFF\r\n%AE340B110B110B0B34FFFFFF830B0B110B0B0B1284FFFFFF340B0B340B0B\r\n%2D340B83FFFFFF840B0B0B340B120B0B59FD05FFA8340B58FD04FFA80B34\r\n%FD04FFAF0B58FFFFFF580A345F5F0B1184FD06FF58113A5F11110B120B12\r\n%0B120B343A3B0B0B84FD0AFFAE58340B34345F83FD06FF833434113483FD\r\n%05FFA85F0B34345FA8FD05FF83340B3483AE0B1283FD05FF59581134115F\r\n%A8FD07FF590B83FD05FF0B5FFD04FFA83458FD04FF8434110B5FA8FD07FF\r\n%7D0B3B1212113412341234123A12340A2DA8FD0FFFA8FD0BFFA8FD0BFFA8\r\n%FD0BFFA8FFFFFFA8FD09FFAEFD0AFF590BAFFD04FFAEFFAFFD05FFA8FD07\r\n%FFA8FD0AFF59123A3B3A3B3A3B343B343A11110B83FD4EFF0B5FFD1FFFA8\r\n%0B0A110B110B11FD050B2E58AFFD4CFF83830B12A8FD1FFF845859585934\r\n%595859598383FD50FF5F0B34A8FD7CFFA8FDFCFFFDFCFFFD2AFFFF\r\n%%EndData\r\n\r\nendstream\rendobj\r54 0 obj\r<</Length 65536>>stream\r\n%AI12_CompressedDataxks\u001c7.\u0011\u000f\u001f&q)qOxOlD\u0015ǳmى\t\u0005[bۜH\u001dj\u001fyqL d̘%1\u0004x\u000fOw/nr\u000e'?^^~Ǜ_|~o7*l\u0007}>>%g\u001b*|7W/.oo蛫xۛg_}귵QTrC!TA\u000f\u001b1/ E.~\u0002ʛQ\u001a߼~qua&D\u00127mmT\r\u000e#\t[]\r3JE[g0\u000e\u001en}uy}7on^ܾls\u000f\u0017\"b//_|ٿx;7w(x?|3=I|q\u0011o>wί^^b_]mi}۫/_.1)nt<>\r:~<<\u0015\u001e}}ywB2_n?R<+Y\u001dmۿm4!\"\\z\u0012s-\u0013rF濔.)|㰉\u0003%9˿_]~7חyLvw_%c0?sWo_^CYL\u0017/T\u000b\u0019\u000bIj3;od+\u0015\f/~P/^_^sOU7n\rƏVͧƭ\tc,\u000f7jkTFi2^z9vNM.=V\u00118_b3ŹAcy\u00014Ao|\u0016_\u001f\u001e}vSʍ<Ƀ.|\u001cs~qv\u0005k,YP;\"y'OL|]A//7?\u0018\r0+7OUruKz~\u0015o/o_\u0016K//חwݼ}sq/no~\r*u/X.\u0007O6)E/)/o7=|%a_>\u000e}q-4o.\u0001\u0006(\u0017ˋ[|7/c8}\u001fۛ]^\u0002tCi)\u001fr/z\u001a\u0007\u0014~x[!\u001fxW\u0017-\f+&k\u001c:x훧w߼yA}zeۻ˧nhʳ\u00171R\u0017W/_^&\u0006:/G\u0016]kj#?|\n~vl6wi|wwӳ܅GyQ^F-穉ge>ew=4jH/|^b\u0017O_^}yw\u000fOxkO^?շ%e~-V%k,7O/R\u0017{.fo_/j%\u00172\u001c\u0017OL_/Qe}*JfM\\2\u0018M*~St3{&\u0017ｸ\u0015\u001fx^}Zz\u000f)N\u0006'\u001c\u0013u78fgy&xgg9\"hOVвR۷];Qڟ7]Z}\u0006Sڗ;ٺ|-y/_Eno޾7O>Mb(͗27\u000b\u000eQa}s7ˋ\u0001\u000fT.V9X\\p\u0010/6_\u000bk!ʿ\u00162\u0010m~+\u001fTAzz˛׳Sˋ:hep\u0004~yYd˻??N\u0010\u0018\u0016e9)\u000f\u0016e=d{SkON=פg\u0002G9ﮞoo|e}%4ϓ,\u0015ëܼz63%_qJ4>W\u0002\u0007MS[k-!?R+\u000192km,j;GJd5 '6e\u0002\u0014Wy`r*o.y5]SJ~=UxϭO?D๿\u0017-6\u001dNW<\fеfBa*?<ۃ\u001fxfIϒd\t5RHYK:\u000f9\u001dsxq15ѳdf.C\nR+8K\u0011iܩ,\u001fo\u0007xD: \u001d<͇OW~,9mʟ'o\u001df)n)=>5iȆfV9y\rYs0YÈ6q6\u00135is&28L?Cn֘4Nf\u001c]f\u001dm(<tcȿyfY526''3ř\u001b%\u001a9O4W\u000e93<!\\\u001a͜*-zF,/{\u000ek{G;\u0015i\\Z1\u001ao\u0019M4{9b5Zg\u001d\u000e\u001eўc8\ru\u0005\u0017Ν!\u001d\u001c);\u001fwH{\u000f\u001c\u0003x\u0010\u0010>C8rQ\u0018$;яan܏8cۣ6#4x\u0016\u001c\u001fv\u0006\u001dr\u001bwqvqw\tva?#q~6ɠ3N\u000bglvvv8;ǲS2\u00199C8x\u001f\u000e9\u0016>ڣ;\u0006\u001cǳ#vx<8М{$|9GB(09\u001ddZ,\u001dfl[X\u0012jh~Ja\"Ydf\t\u00115꜖mҼaR,f)ҸHa,Ĕd\u0017̒%5KÔʰ?$k\u0001YڧTb>2k˙Z\u000ef\u00045fb9Qϣ݌+ƫ\u001d<1\\b\u0002͍adS4\u0014$\\NV\tN6IN\u0015ҧ^.(i\t\u001d?j\fdrJ4\u00009=<eF''\u0018d\u000f2;YAF)\u0019^Fc\u0005v~1r:WAziW\u000b\u0016\u0011Cz߃E r\u0016N䡧XRG\f\u0019\u000edq\u0004y \u0016Rd\u000eXjGL\u0019\b6\u0018@X\u001d\b\tpvcA\u001c0X{8 \u001eَ\u0006DZd?R9`(a\u0007\">@\r\u0002/pEtA#=\u000e\u0003\r\u0005G,#&qpD7\b0189\u0015xs,\u0003d\u0003'\t\b84\u000e\u0001[qCj\n}ıq\u001eY\u001cb\u001aq9c\u0007/\u000fcV<\u001eT\"3\u00168dRMG?ٽ#\u000eP(k\u0003ZI\u001aUYЋIY\u001aX]º\u001d#rJ' gF\u0011W3'\u0016$0\f\u000b<\u001b\\hd,m+a2\u0007\u001b\n!\u001cQ\f9\rWy];\u0015i{f\r<Jg~\u00006<K1\u0019\u0010\u0019:Oژn\u0005dC\"<\u00141!P1̌`cf'[D\u0016aRufCDh:kTW\u0005N,Ә'\u0011/\u000eX)\u000f\u0019.\u001f!Xմ&5'ZB\u0010%){hO.i.3E4lP $!\u0012/y\u0014XHG\u0010\u0013\u0011zKg\u000br_LM\nmʲkd^[%y+)ЧI2Ii,\u001d\u0001T\"KzEKiw\"œj\u0012Pch7kDoRx(.@imW\u0012j\\\u001fsBQ8;^u\u001d\u0016.Sۊ.IN)kS^B\u000b{֤keW\u0017-B+ĕ=sv줗4VdݤYO4%YvAc9}ìvVp:6u)޳_{ڃcWt\u0014C;>{yҗwԮQ;?®>`<fA\t\u000b±̯\u0004Vt\u0007a\"GR\u0011J]ūʕ88JBĢ\u0005\u0011'\u0010(f%!P\u0012\u0011+\tYguJ\u0016E$h,hQ:\u0017AkL֓ODRQE>\tT0BJ\u0016--\u0011\u000eYڋD.\u000f\fk']\"vQJ\u000e\u0017/'\u0015Ksl+j\u0015\u000e.˿\u0010(\u00054ˢ 胎\"\u001dDNމPXFf\u0014Ό\u0019DG\u0012_'Nߑ\u000by`\nuϔPM4<jV(vϨ3(&\u00195\u0016~\tَ֮.8\u001bI\u001c\fvL%5=tjT'U\u0014Mi!,3U\\\u000f'r$\u00119T\u0016id\u0016isM\u0004\u0006`I\fq\\h c\u0016iߦќC>\u0006\u00029?JҫɬE;Tɨ14i7\u0007\u0012XFLBQ#q\t5Oצ\t5{ϟx}h|F\u000e5(E\u001ar*טS΢Ƥ-?TL[LKE\u0013\\)NzclIƛBNcM1]M\u0015^V=ZPuڴS,h\tjt\n)^Ai=4gAc2\u0011]i\u001aBY\u001e(^:\b\nP\nrUޔbO҉GR\u000eܳO?~'Bq\u000b,RPL^XA0^\fd\u00137W\u0000\u0019Wgñ\u0013\bƓ㽘r$\u0003\u0011yq\b#\u001b)䣘Aِ\u000b\rNɰ\u0013Vend`|\"\\ Ojt\u001e%9}\fG;1B|\u001c)zaǀ(h\u00164ӓy:\u00190\u00071S5b{\u0010\b#z\u000b<\t(PB\u000b-TPDi3\u0005-uNtt\u0013՜F&8\u000bj8%O6vK\n\u0001-(ے5k3ӜYkNQ+'x\u000f\u0015yj<]]t\u0005稍ƿf\u001c\u0016{g\u0013\u0016E0\u0003Y=J[n،j\u000bџ-(m<8Dv-h\n\u0010Ҭ%Ǎ6NG$_GdM\u001ch\u000e\rqD*fpvj!,w\u001dO\u0006ȣ 1\u0010\\A\u0019\u001aFy\b\u0019Z\u0005\tFu01R)y'zY\u0017v\u0000ݛ}/ڍ<\u0012.\u0016CgL\u0006\u0000\u0011p\f*-G:zt3:\\(hg%k656[tX/z!\u0007\u0017ϴuB9\u001aȃ\u0012㖱zƲ\u0014\u001f&_\u000e{E]wl\u0017\u0016玱[QC\u0000C4F\u000f`t\u0007\u000b08\u000bZiy}}lo[=EtUo3EHa\u000fևj\"OZ=1\u0011\u001f#o?p/lZ\u001fٙ\u001bM(L̴d/̘!\u000b\u0003\u000eCe\u000fH+l)} 8^\u0018НGI\u0001\u0007\b\u0016Êo-\u0016 \u0016$7,\u0014a3*^in1\u0014\u000fC$^DՏ0Sh'oO<O٫UG#=ZWʋ:39Ϝμvq)u,N4:q3$GQnr;-%%ItltU8P?(Ww≴e\u001a\u0014!+m6yɌHoqd\u0018plv*\u00030{\u001d_9.%\u001fA\u0018c&2sޚ=Lwȼ^\u0016cNQ$\u00013a\u001a,<Iy$$\u0013Rq.%c \u000f\"\u001f\"\u001f\u0017\td\u001aVN\u0016(.Z$\"+c-e(YV\u001d;β$i\u0014iy'Y1IV6IeI9fBuIJ,9IB\"!]cч$\u001fW\tY$dng\u0012^d+:\\Q\u000eI{4+5 )\u0018eixW\u0007\u001a]M\u0004.\u0014R\u0002Wo;\u000bj(\u001d+)СY\u001dJCa\u000f\u00142]$\u0004b\n8B\u001f)|\u00142V\u001a\"a\u0007g]\u0016/Sw.;Y:bR<Ò-|+!{N\u001e7&*QL{95vFYo>\u001e\u0010e\u0006Yssnf\u000eD1XZ\u0018\u000fҽD7\u0013,RJ?\u000b\u0005\u0015\\X*i霚=sKt={fŹTk\u001e\u0007=\u001e~?kq\u001d`~3}曞3\u001d5~z}RceOs,;d3wM7\nUV\u0017J:g&\u0013\u0011H\u001e?em\u001f\\\u001e:GN=\u0015)c.mY$x\u0001G\u0005\u000fCȚuGiӺ\rTwv.be5re\u0019EE`\u001dv,MzDK\u001bR#[V0y\\C\u0011.Fܣף\\V\\\u001eC\u0007x~6~N3SOTA$q#HjE8\b\u000eBET1\r*D#\u0003|RRM\u0001b \u0015J.ƭ\u0005՜iB~n$=\u0010pT\n&>T\u001840'Y#:QM&\u0005c0ξ6$X0\u001f\u00070\u001cKm\u0002\u0004{\u001c\u000f`Umn`;i\u0011\u000e②j0~\u0007r~+~F\u000eLЏƉ\u000ebpf!\fM\u0006q+\u001c\u0003*mĭsB)ayWW.oE1%I6W\u000e\u0014XY}V@5,89ecᩳ\u0013\u0014]\u0016\u000ev\nMGCE n\n̝§灸˅?أI2U2\u0015PұH\u000fɶ\u000f8Ur\u0012Q\u000eDRD4+\u0007i\u0012~\n\u0013~1l%\\]J\u0014E\f99Ŝ2#P\u0001+S\u0014Z]\u0016N1%Si\t5Śv5\u001a\"伱4ͽ1\u0010fd ښ\"?cJ\u0002\u0018v]:;\u000ejr\u000bD\u0017`\u0005\r@\u0014\u000b9Wy7\u0014v\u0015aҩYTڗ؁Y8\u0012i<ˀcg4+5\u0015S_v94AdEz'ԞUlDqy}\u001eAa\u0015E}ɘ}\u000bvYy\u0014\u0007ݢ-qU}t%WIGh$y\u0013KpJ]D-<sђxkEO\"^\u0004YO2y\u0012$MI0\u0012u$\u0010>\u00043/\u0002\u001aK?\u0002&\t&59|>yc-\u001e\u0005[\\{]U,\u0005\u00166\u000f\u0017>=f^R\u000b~:yLM\u001c:KycTt&j\u0019^b'8E/qE\nbχ\u001aD(2|\u000f5.ST2|&dc4&b.O\\2r\\\u001e\u001e0Ky|][\u001c%\u0015ŗR\u001e_JI\u0014L\u000e\u001c\\Y'ټHF\t\u000e3\u0019|&\u001ffA\u0015'44\u001dk!jSBfHKHsoC\\\fI\u0005\b\"k\u000fj˴zt\u0012jt'}$G\u0004\u0010\n(^ehoS\f]b\u0015\n\u0005\u000e/p\u001dП.\"Wmr*\u001c<qMxY3M4Yz\fXB\u0000\u0015bLbLNT\u0016[e>\u001e+'$d,Vl\u0014}N(Zעwu7\u000etZXÞgi\u0004Nv'\u000bm\u0005xкlDSE[\u0004>j\u0010\u0004e\u0010CceMn\t晇,xd`UT\"\u0014\f<\u0015y&:6\u001b^\rXSS4\u0007bxw[[9Q\u0012\u0010!O>\u0019N\u0014\u0005\u001f\u001b⪉ʘ4a\u000f\u0003Mcp\u000b=]QTHxG]ş\tbm~Q[<\u0002k9QW\u0014U\u0005c\u000e\u0001v8^\u0013\u0019A\rtN\n\n `,ݨM\u0016o\u0012L\f\u0006>N<t>\u0019*d'LT+\u0015{1\u001d\u001a屎c8qu\u0019u=bkj\u000e#u0Hٍ֝8Xu}\b\u0014\f\u0003h\u0007\n4a\u0000}`_{za0h\"X;:Or8h\u001a(h\u0006&$K\tzN.f'=y4iGSaXx]KݵИ L3HO$\t6H\u0001\u0001jQЇ䘕\u001011K(32Y;T\u0004D_\u001dJYtIa*\u0012RHO>N7I\u000e7n#)S`۔\u0014rn7`\"R)\td\u0001dAP\u0015?\u0013YEH\u0011&hU\u0001tZI07%a\u0001.dO$LY^Od\n~)#\u000b<.}\u0001C?aS%f<L\u0016}*\f%f%kQ*\buI*oqWIa@Q\u001a)ƞlI,h\u0002\u00167Y\u001c\u0004\u0002XBߘ]Xq\u00142T.a\u0016\u0007@ШL)S\u000e\u001b\u0004`Ag\tΨT\n\u000b\u000beLAv4~\u000esZ\u001c\tkD֤\\\u0016g){mPGO\u0015Љ46.{-\u0013j|ĻG\u001f\u0013!2'4I\b,\u0014钒M,AQDD23N>a8 Xl)>Rhʜ,o\u0000\\SJ2l9\u0017Cq\rmIEU(?S\"V\f(JԦLuƴfAq\u0012\u001f:C^PPF~?U:f\n5t=L+ZU;F<\u001a\u0005Zd=&\u0002$B\u0016Ԥy*|Sq\u0013Y&N6s\t|YBhv%<\u0003\f@\"RPΓsɓO\t @B\u000ba\bN$2 ,Q\u0011%\u001a%\u0015\u001c!S*{i!`Ř7I^\"m\tLKNs\th)'\u001fVR,ýIg%]\u001fN\t5>\u001agJCv\\\u001dϏ\u0007A\u000b\u0002IM\\C7\b^\u0014l^kJ\u0014kTl\u0012\u0019[4\u001a\u0001'4\u00142q\u0010$\u0014(\n\u0018*T9v^\u000e.\u0003GQB\"\u001e\u0003S\u0002W)\u0010'8W\fs(gr@,,b\rpr\u0011ήC5M\u0006bnLmmnf3\rĶ0Ƶִv¨Ƭvʨ0gN\u0013Usښ)\u0011Ƴ\u001fZՔ|y8RhuIa\tW+EJQ~lR_)ʯ\u0014W\u0000{g@\u0016\u001dm\fa\u000e^Κ\u0001\u000etwwǀ?UJX\u001e9H@\u001a\u0016{zx1\u0007>^\u0015\u0002B\u0014)qj;.\n\u0006\u001c\u0004`\u0018j\u0006\u0006wOF׆1\u0016j\ba\u0015b{C\u0013\u0010\u0010f\r8ONtv:v\u0003p>Ի;u6\n\u0016P܀\u0013܆\u00124ӟ\f3]3c~ƱM\u001fmMs(\u00020\u001alkq*X=G2\u000e+s\u0015\u001c\u0019t\u0004?4΀fC?I%\t6>h\u0014\u001bL\u0012\u001e1^t&Dh\u001d\u0019<\u000b7\fr$dXQ(AC\u000e\u001fN(QONxo},=*1heĦJT8\u0003ʣ\u0005\n\u0014<<\u0019vc$\u0018۰E\u0005N\u0019TR\u0006'8y8\u0007l&G0\u001f<gf}\u0010w\bD\u0002NW\u001f\\\u001cs>T\u001bYMKma5Uܗu/+_\nwPu5~\u0010\u001c%\u0003\u0004\fI+h!\u000b=;8.ۘBz=\\KtyS~0~(g:_Z\u0010|u.#\u001d\u0005-`8\u0017<C-7&\u0014to\u000e\u0019I\u0007Q\u0017\b\u0011s˸\u00011_8\u0001,2aљ\u0019\u0002\u0000\r`|\u0005cSΎ#md\u0011\u000bi\u001fT\u0016.k\u000e7d\u0010\u00025͚\u0005~e謕ЯzR\t*w-=%Ğ|K\u0010.\u0016PM\u0013\u0019ǚՖsqz\u0014 ܉\u001cPgsyw~4\u0005\u0018IBVTrs\u001c\u001bЙ.KqvWAX\u001cS}X]'wMp\f\u0019\rhr0E>s6\u0013(q?;sC3P\"\u0015\u0017uV[\u0005۱)9+V\b؊Is/\u001b+aak~\u0012mޚqǦݒ\f׸\u0014\u0018\\­w\bQAƨn\u0010:\u0015ƓJ^Y?yQ\u0014\u0006\u001caT\u001bj*#Vê#\u0012\ryѝ\u0005w\u0012M:\rO\u0007Mz\t\u0018$۞)e\tLY.)`O\u0003a\u0005pQz\u0011.2\u000fl\u001cgNaz65j+x\u0013m!Ν<𛹣wu\n\\Sf>Su~?s~=v=]2\\jJ.\u0014;q;q~\u0004[\u001d(89q;\u0013\u0007:#Nst;{\u0015g8:͈K[\u0014G5:q.\u0017SYjih*\u0017<oݏ݂whMu\u001f2~9^\u001e\u0015t\u0004?\u001dA\u0010t\u0003'\u0013\b\u0006s~խdża)\u0012\u00157jd\u0000\u0011\u001f8\u0010x\u0013Jf\u001fIT3#\u0000qOjB\f_H1*\u0007QWڒhqM\u001a\u0006\u0006N\u000b\u000fSūr \u000e\u0006!=*!\u0001(!ȃ\u001f\u0010ȅuˉ.yɺqt\nvUn\u0015\u000fG\u00169\n\t(I \u0019P\u0007Lϙ|\u001c\">\u0016u!\n4_(r\u0017u>dyEgs9\u001c\u0017q\\pz%\nۃ\u001d\u000fƪ6ޗ\u0014K.RD,\u0014L\u0002\u001c$ad\u0010@N<\u0012G\u00173\u0017X\f-Z\u0000Es8U[A%\u0002FQ\u0011\u0001\u0013grI\u0000\u0005G\u0007B\u0019fK\u0005<\u0005j3\\K}\\Bw\u00049^$䨝9hoGWz\rr[)702`g&y<\u001a\u001ftKӀy\u0006o\u0003\u0002\u0004\u0011\u001bҀ\u0016Ir\u0000\u0000\u0000\u0000-\u00041;)W]v&tt`rJe%5f](楟\u0016xJ\u0015\u0018fΒIyB\u0005Y3LO_c\"B/hǌs*nwoed)\u001aƥg?C+77q\u0010iX>ۼ]E+1\fZ/'%s\"$w5%\t5?U=k2MdH;m\u00151_d\u0005tc^XbY\nMMĥm\u0013zQ;\\\u001eJgm'L\u001fCg?H$q=Y@\u0016Ĵo9Zq\u00107UeOˠܾ7f3wkMw\u001b\u0014J7\t\u001c0b\u0001:\u00145\"R&A\u000fzq]'D߉.*0Il\u0014y9ɖήt$(rWC\u0014[¹\u0013ja\u00031\"#&.Q]K\u0018\u0000\u0014\u0013x\u0014^q9Ť#N\\N\u0010`\u0013(a\b\t#G.o'\u0002\njq95.E\f\u0015ݙ\u000blD3\u0013\"Bo2N=fqv\"R-O$D\u001f9>T\u0002ũxs\u0012i]/{\u001a)Š*\u001eUi(S\u0010o<˕\u0005V.K~F\u0011\u0015?g9Xu\u0019>Cv;a즋vb5R\u0016\u0014ǐVG^*^\r\"\u001bqFGxB8\"\b(\u000b9K!h& ]\u001a:93rtNF\u0012\fH&(HR~Y\f$LWԚz9(]I[~+\u001f|&\u001ar%\u0006g.S#^\u001d~yFxHBǻL1&4RzFbV^&1g{EA^e3fa,\u0018Z\\gM]\u0014X\u0014`\u0013m&H<K\u001f7\u001fV7\u001dAx@Ɍ\u0005eJ{O\u001b\tseg\rӯFe+T\u00184m*\u0017\u000fV2\rVdt଄h\fਢH,-4\n\f\u001dM٥l\u0005V\r[\u001c\u0012Y7#:۰\u000f̏5XUk}W=\u0016G@[;\u0007iwoV߫Nu\u0000\u0012Q_s.\u00185چ]*.&W8\u001d!|Hטng\u000fiZvNqvo~'[wBONt\b,:ď\u0001Xq\u0018\u0002֎\u001axt\u000fzp\u000eL\u001e<jB鹇waZȗj\\XLFX;~DL̦<ظϟpy@\rhʰ\u001e\u0006~!3k\u001c̯q0`|\\\u0001xcbC5-GmGL2RӍӝ|Bq2N73|{d~ ro|&\u0015VV~]a\r\u001dw۬ޓWH\"\u001a'jwcqaj<=Q_{uoO.>!N\u0011mrؓQ\u0017\r\u001dB6)0 Ơ!FW\fxBl#\u001a\u0015\\e/=FsvB] _^<\u001b7jr{'e\u0004\\A6@\rˋ=\u001eO>IeZԥ\\hyI\u00051[\u00054n\t[9UԠ\nZݪ*\u001beㇾ83Qy\u0002׮Cv\u001d0E1]\nSqz5\f([E\u00129VYaa⽹}\"w\u001fe\u000b\u001b3\u001c]Z\u0006<\u0002`k\u0012\u000e?ń]\u0011{\u0015q$r{\u0017|\u000bv1qM<e\u001f\"\u0015w\u0015=\u0005<k4U?\u0004Q䈟5\\orFJZW4,/hȱO>ѡ!ŇNѡXe\u001d\u001fu!\u00129T\u0017\u001c\u000ePn|?g\\\u0007ho-\u001e\u00050bH\u0000l+|Q\u0000K\u001cU\nGŕ&\\Y.qXe\u001dY*^$ٛ~[\r\\X\u0007uM&~]\u0013{\u0012p'G:\u0011$?T\u0013\u001fT%'xs~:W\u0001s|גgRޗ\u0017wwןm~{Û7\u0017\u000bmbFo,\u0015 Mv\u000bA3$`n[F\u0000Fؘ`K6RF?\u0011w<\u001eC_mؼx\"o\u0002\u0007mCW}?߯\u0016+y\u0013\u000f+\u001fOwwwW7\u0017?l>Kʙ\u0018>;}x7o^^>o7o_ce/m\u001e~Vx1]$SNJ\u0011[\u001b\u00028wc\fX#C\u000bl]n3\u000enԃ\u0019\u0003XN\u0014\u001epnƭ\u0005!&E\u0018ō4\rhs_i\u0002\u0015q\u0001LD\u0011\u001aD$(C\u001b\ny.n\u000b\u0016\u0019W-Սf]\u0019y\u001b-'\fU4M\u0000c7lAt.n\u0007P2t\"Bd\u001bA:\u0011r\u00020\u0016Ŀ#t\u0002,>R-\u0006PB\u0003m\u001f ў\u0000\u0012Gw\u0006\"A\u00190\u0018\u001bW1`\u0016\u0011E\f\u0007E\u000f\no`\u000e\u0006kwTz>l\u00197FE\u001aTaBA(<@`6c\u0019<?l9@\u0011ÁX-hLl\u0010. \u001bѽa\u0016b\u0005>75`\u0005\u0011/6\u000eZ\u001bi\u001c\u0016\u0016m\u0018M6\u001a|\nB\u001b\u0018Hg< c0Lځ]jt\u0019W!n>U[.~3n)X]X\u0017Gt\u0005\u0019.yr\u00016 9[$+B\\5vۨGĂG~5d?6:1X\u0016R!]ERd۞Ej렓J_cX\u000eCh֏,.#WSքnR\u001cc7b9|\r\u001f!\u000eG>s}qJs\u0015ᔵ2\u0004RO\u00045<]4Ȣq\u001fS<\u0018VyK$FK􊍡٘\u0001Cя\u0018\u0011C5-vI6>W\u0018Y(6*][?`ʊ݈cװg\u00188E9B\u000e]J_\b\u0006РKai40` B+\t\u0018p\u001b\u0003i@yI5MH\u0004a͝9N\n7Vs\u0018-{!r#\u001c\bB\b\u000fx+]y\"\u0016}\f\n|\u0012H\u0011\u001cZ\u00053k(}T`=\reӵ-Q}Jƴg4ՎPmM\f*q\u0017+\u0003\u0017i@^ڴ\fv)xN.\u001a3\u0003\u000e\u0000nLl\u0006(\u0019yaC..(M=\u0003cg4srmMނ[ZZQ[\u0014k\u0019k(ԆN\f4OO|\u0006ˋ\u0017FfX\u000b\u0002\\\u001fUX޼}8qnϏdw!/h\u0012'\u000edj\u0006#+N\u0006p<ap\u001d\u0003'͉jẹ\u0004\ncm\u000eL\u000b\u0006\u0015&\bټ\\#\u000f\u0012\u0014RAA\u00061?ҫ\rgq~\u0003%e@<KӢpThy:)R} xmjׄAmK2b~#j3\u0006\t\u001b,\t&\u0000\u001dT>\u0018<\u0006C/{\u001c<\u0012)+1?Lыk\"lT\u0011\"2Mj\u0018\faKD:E׏isq\b)fa\u0019e::\u0014Ӆ\u0003S\u0012pnF\u0015\u0013z.\u0007i8\u001evPdG9ȿE,e\u001fe9\u0013\u001e<hʻܧi,r\u0015V>\fN\r3:A-~sPt\u000e\u00067\u0013o'\f?\u001fG\u0010&jG\b8|%\u0014\fm\u0017f>6Vxp4y\u000bkv\bl\u0006'æ\\>Ir\u0000x-,S \u001a\u000b\u0000FG\"\u0004\u0012<0&\u0001\u0016xWd\f\u0005_\u0001a\u0000&\u0002s\u0012-x-5\"\u0015>\u0017D`.\t\u0016\b#\u0013o*\b\u0006m,\rF7t\u0000\u0003\u0011Oag@1L$\"\u001b'\u001c`\",j8Ԃ:JWwcR\t\u0014b5\u0004\u0005t~$ꘁ9\u001f\u0016,f`l\u000f\u0001P\u001f){43IQ\u0000WɕTg}'\u0006H0\u0018\u0007³n{$Ӌc+C\u0014gcph\f\u001a+ϟ)\u0007)|0\u0003[Cָy#mFZ\u0002\u000e\u000eS4\u00138}+\u0019拦ך!ͬ[\u001ff:D\u0015ہI,\n'\"\u0006\u0018L]L%\u001c\u000f\u000e# ?\\;`\t\u0010\fNƢ\u0019s[*#a\u0005Na!Tǀ\" 4ڌܽ\\_\u001bn\"\u00053r}gךq\u000f|\u0003)\u0017\n;\u0005ͳ\u0017K\u0006;l\u001a:E\r!|\u0007$;\u0000BB8JҐHgq6\u0004\u000e4*\u0013N[S\bN\u0004\u0018G¢!hjy\u0011\u001f3\u0006\u000f\u0004(h\u00059`HB%Ҡ`۰\u0010Q 5\u0019N/&\u0017b\u000ed|F1\bA)F Wa61F9\u0018bR\u0014u9\u0001\u001bՍ؟X.JN\u001fUv\u001d0lii^)A28>>\u0001\u0001\u0013V\u0019gd\u0003q\\8N\u0001QP꠻ՖHMOt\u0002z)R\u000fF\u0007\f)FF,\"#\\(XV\u000f~VcĀ\u0019lwM])9\fUP#6w#\u0003\u001c|\u0013 8\u001c\u0018ՅM?mHҊr\u00052Ѩ\b4Q7\u0015;\u0001&\n(5\u0016\"\u0019$\u0002#\u0014\u0002$!ԋ`<cfq9\u0001Q~\u001el\nTW\u000f\u0018\u0018\"BJԅl~\u0010;4=șĽ\u0013xV\fip(\u001cϐ\u0007L4vȫCU@j\u001ds \u0002S\u0003FXcD\u0015tZs\u0006R'\u0005=0\u000e\u0004\u000e]4dT\u0017\u0014b318\u00197\u0011c]Ă\b`E!)@OI\u0002U\u0015\u00148K\u0003\r3Q< \u0010Bf\u0007ЋD١\u00116x\u0017\u001b֒bFjVј\u001c\u0010\u0019\u000b]F\t\u0018\u0011\u0005B\u001c6+]P\u0018vm`}JS 7\rIWO7mW\u001ei\"(\u001e@(\u000e,#\u0007. \u0018<BۆlbOq\u0018X\u0002\u0007Ǣ\u001cϰP\u0002S\u0015\bI\u000b\u0019\u001bˎƎ&\u0017PV\u0012^gQMܔقx`\u0000_\b>NVkJUW\u001d/\u0000?4SY\u0005\u0005N+Q,F먍y2\\\u0004\tdQQ\u00026k\u0003U \u0019X:cRJF=ŭ\u001c,\\\u0018\u001f\u0011\u0000YC]FB.\u0006[\u0015LTߐ |\u001eU_k\u00074tj\u001e)o\u0002A\u0007O1BKK y\bZ`\u0005\n1*8&-X\u00004\u0017:-Mf|c\u0000\u0005>\u0000\n-$\u0015\u001a\u0005b\u0002:2x·\rAF\rTaQo[mdMRR.6@%\u001beAQpn\u0003\u0014n$X\u0003Oj\u0003cɀ-\u00004)m8\u001dl#\u001b\u0003e \u001bcy\u0016۟\u0002\u0018K\u00028'\f7\u0014><\u001dD<#\u001egD5ঋ{cf#Sa\u0019\u0001\u0017\u0006ڈb\u001d\u0001!?D'4X!UJĥ\u0002\u001c\u0012i\u0000*V)6@R\u0011_Dʈ6@r*f6\f1\u0011\r\u0010T-+?R9\u0013\u001a\u001fh#dX\r}8\u0001FO*bNx\u0006\u0018^wzÐ<p2<V\u0011\u0018b>\tf\u0007.\nӽ\t²$CY-u\u001cnJ@^li\u0017\u0016:H\u0010VުX谋! P5`\u0003d#\r @D\u0006!+9;hv\u001cbh6#8.mspPr)9\u0005a9|38r~r1ѝ1=_(\f\n<*\u001d-3ʑړČ\u0016ܬ`e_\u001f\u0017fv}Gu\u0005\u0013?\u0001\rͦblk;u_4ՎPi-Ow\bsTc/Mt}n6\u00184U\u0013\u001b}bsbeG\u0015G&Ub!u\u0016Ȭ6cnsͬo([͍skjk'F?M\u0017胦baG&\n4<[[MQS\fTU?Zo s<\u00043¹\"\u0015S1e5\u001e\"\u0007B@\u001f?N\b\u0007K>l!\u0005\u0012C\u0018o\f&M,7]\u0019D\rq$`D\u0003\u0006Pg\u0017^\u0012@\u0012\u0000\u001e{P\u0011#QM\u0006M.ʀ* \u0002\tLC\u0000d\u0012A\u0000O,>\u0004z-#\u001d\u001b~7*;v:7у+/!\u0019\r|4UAG\u0006c6b8]1\u001aT({.g!PD*@oV\u0010\",m\u0000D'CZVήC\u0006_L[=\u0014\u000b\u00012\f?M\u0019\u0011!R\u0006.\u0012vxh;\\}O<D-\u0002G\u0003²\u0001c\u001d\"7\u0003go4Ż3\u0018(HEr1\u0011EJ&\u0017\t;MgރVNq{\\Kx9Ԗ\u001a7J\u0011]\n;'\u0003dㄠ4?T\u001dWwy{XR\u0003\u0015'\u000ew䡟F\u00072\u001b\u0005璼&e*2W/ɩ*G0ޝ\u001b&\ncR,Ž;&- \u0018x\u001e\u0016B\u0017jeI'-(G1d\u000e\u001d\u0003=~]\u001d~q_{t\\7E׈W|\u001bI\u001ez^V?HB\u001e|+GDro\u00157\u0006I\u00121t\u0014\u0000d4\u000bk\u000fArjr='b\u0019l?\u0002\tT\u001fiz}_\u001dTl?8䱫f/sE[\u000b\nt|@ JKDԆtUk\u0006B\u001b&\u0007gT\u0014xmSǻ:Q=\u0018*\u0004p\u000e\"\u0005\u0004q\u0013\u0013\"Ht.;\u0016G81cWJ%\u0018[2\u001cnKo*\u001bcDl\u0019;GSz B\u000eH\u0005Nr\nF\u00157\u000e6kۮ.wsS%\u000f\u001fbP5$\n-a\u001fQi}\u0011\"\u0005\u001fbRi4c\u0017Tj\"=PK\u0015{Gyc$b?PN|\u0016o9Ju>IaFνhWbݯuUu/]}^yb\u0012\u0003\u000bx7\u001c\u001c\u0003E\u001bٚWu%VaW\u0006C3u,(\u0016>;ރS.4dD7tJ}gG=dN-`W\u001al\u000b4\u001d_NrbFӑj5v\u0019^k@\r>4࿊2bTT3K\u0000ݏ\\q\u0016\nY;0\f\u0000\u0004\u0001\u001fL\u001ev\u001a\u0015\u0003MT\u000f\u000b\u001a9w,\u0001MK\u0001\u0011>\u000b@\u001cMM\u0005\u0014ŒBrEKt\u001dԽ\u0015\u001d<<*D=NNO&\u0007g\u0006\n\u0016T1\u001b3g\fdKd^8`\u0007vε62\u000f°iY*qW\u0007W\u0003/\u0003rV\u0016L՛ɍ)\u001cL/3*7xrh\n/#<y\u0019u:^je\u0010\r|\u0002?\u0006vb*qD \u00133D\u0017\u0015\u0018re8G\u0019z\rxUp}\u0004-5%\u0004\u0002'\u0014\u0003\u0007N&\u001eGڮ/|Ln-\u0001\u00156\u0000\u000184ډkKQMeȘtouiyt{R6%G\u0012;[>adCiukl6ۥ\u0015G}2Z\u0004~_$c_\\xT\u0016Cgc3\u0002&Wa)\u0016۾T\u0002W\u0018\\d֗+Wk?.jS?]\u000fiuS-켡\u001evD&\u001evTV\u000bUPZך\u001er5 7>\u0000\u00136}\u001e\u0014п}K4\u001f\u001e0 80\u0018\u0019G\u000eгX\u0018NU\u0015?L\u001eK~7]\u001f\u001e6̀|\u0006NSz\u0010\f۶n\u0015DP\u0012ܴb\u001bļ\bJ\u0014pk\"\nU\u0004\u0018a \rbY/y45/\u0012\u0003AJtbh\u0011<D?-\u00124.e\u000fiaֈ\bQ\u001ev\u0007:\u001ayf\u001fclm\u0007_-`F\u0003!S\t#\u0004mRx¯UgkxxW>\u0019\u0012*ZU#D_mV3=޿\u000e\u0000\u0019x\u0013F\b\u0019\u001bj\\Ap@G8\u0007X<\bt%V+\u001aחrӪ\t\u001fn\u001e<4S\u0003,~\u0001+o\u0018@7%RW\u001d\u000b\u0017\u000bI\u0005\t]\t* Ð#N4\bd\u0014V\rc_gIT'1է}E\u0014\u0014KX=i\u000f\u0007PLEO[L'ֲ\u001b#i\u000bC6D}O[-ƥ\u001bڮ/\u000fG\u001cҡyx\u001d@G\t\fI+jYK-\u0005kHA\u0001өK;\u0018\u0012`\u0003\u0016Za0\u0017?:^%C?:\u0003$N\u001d9@zs'R^])ٔ5 㴻\f'\u0016W\u0010\b\u0012ADYhe\r^d\u0014A3(A( \u0012%\\q\u000e[Sç[\u0011Y\u0006$1`ZI\fP\u0012/Q4KP-R\u0014hx1T\t\u0006\u001dG\f:px\n\fY\u0010h\u001744(\u0006iG\u0010\"\u0006\u0019$(*F\\ZxXx4\u0015+\nm\fRXƁ=fQ+f7\\Cvh\u0019s\u0014DL#hk\f\u0000EӴ!s!d|牙D :\u001a\u0011\u001a\u000bDG2a7Z)zƒ>\u001f\u0012\u001b=ҿ\u001d\u0012\u001d\u0016\u0017\u001f6.pqe\u000fTW\u001bJ4Av\u0012sw\u0018%\u0005\u001c\u0010\u001aС!\u0014M\u0004\u000e\u001c\u0018 k3\u001e\u0014\"\n⢁L\u001bS6 \u001c\u0010\u000b\u0013W$$hP\fM5\"<~2\u0015H\u001a\tl$\u001cЛd״Qd5\r\u0006\u0014J\u0003wī\u0013Ų}/C ysl\u0014\u0015\u0005\u0012=:L=*& \u0003[lK]lrD)[\b+(VPQt%Mu\u0002D\u0017\u0007Z$}`\u0012Ax\u001265U\rqיc`å)>µ!!ͲbqȠPV%.F\f%ӗV@j\u001cQ \u0007\u000e,B\u0004ѥ8J(V6!vHwQ|(\u0016B2KxFQcA\u0005aMURV\u001e*0n\u001dY\u0004'h\u0016\u001aۣNL\u000e\u00140UIIS\u0016\u0001ln\n`D@y\u0007Į\u0010\u00137\bQ&a1c#SC\n&â\u0019J):1~\"kӰ4y\u0000ڔ\u0015-4;w%@\u0013abłIZ#G\u0019L%w\u0002\u0011;p(_h!r5tʥW\u0013xnqᗎD\u001bo̚?5¸2n\u0013߇U#q3d`\\_)S\u000fW%?\u001aJn4ot\f\u0019*R_46\u001bU1\u001d)+\u0014HDDYTidc^\u001183Gt`S0UF\\b|F#\u0007\b9N\"\t-NJS\u000bjU\u001e\u001dLNM@'҆ϳQ|PtrI\u001eG\u0000T>\u0003= U)Z-!D\u0007jةԇQ;.k6\u0010\u001cP`\u0019a\u0017]/A\u001eƌiP\u001ab-U!6q[4\b\u001aBż5y؈i\u001el@B0J\u0018KY\u0007qG\u0012.`N\u0019 Os\u0012)\u0001\u0018Pi#d\u000bz)p#Q\u0018TB\u0000\u001362s\r@\u00037\u0000\u001d΄u\nN\u001cJ(\t0V!!\u00138\u0002-\bn@.q/mrCm)%)\u001d߬xǭ\u0018j퓚\u0012nl,ͼA9#]pcAFGF̼:Q,f\"C\u0014<A\u0019n\u0010/\u0017]\u001e[,]\u0001\r%P\u000b7]z4`׃J0OLsaߗDQXH4ӝͶa4\b}<?-[j\u0007\u001b/\u000flVA\u001c\u0007A#[@-p\u000b\u000eFWX\u0010\u001dd\u0002x0r8OwE?0Jl]QFvct`[yFiXBWTWz\u0001򮆗@M\u0019QF/ߐgmp?m;\u000f\u000e4Qt\u001ai ;\b\u0007\u0010\u0019xPpՅoYDĳV}lyK7R\u001e\u0004\u0013!\u001f9݈N9/O~nr&b\u0012o@@;\u001fڝwfDUNj\u0018\u000e).sΡ}USy\u0019fx!n:\\0b\u0013t\n\u0016x\u001d0F\u0001Kֶ\u0014\u001dI)\n`J':I\u0002u\rd\u0018\u000eȻ8L\u0012\u0012ϋT-l(\u001f+b\b!UX~+}JRϦX6\u0006q{}\u0001K\u0015Z\u001dI\u00106<4\u001f5í\"+~8x\t0TP*:\u00181r`\u0017fqZ<1MH9z%] QO*\u000e\u0014\u0011Z\u0018##\t.\u0002uXc\u0010\u0018K_[O+U|w)EWA8b\u001b\u0002JE\u0007>\u0017'.\u0005\u001f\u0013k\u0013\u001d\u0007!\u0013\t$M\u00127\u0016̔8c(\u0000Ò;Cz찀\\\u000eW%\u0016\u0017E?\u0015;\fXE,2\u0018\u000fprZ/l\u0006\u0001u%58\u0019[A([K[\u0007oi]@%\u0005=WTҖ*\u0015_zph\"ż@q\u001d\u0017nC2\u0000ĸ5F\to\u0001Ⱥ\u0012\u001e\u0000T`M}2O-t yڐb]!$o6\u001cXQku\u001fӔfT8\n1AN\u001f@xyA.\u001aζ;\u000b8xRWf,rt{P-\u0006|q/I,aKwۭc\u0004\u0012c\u0015+=JROe1f\u0010?\u0011ڢ/\t~rMmKICҽ\rf׃\u0007g#6v@W$.9\u0011K-DCL\u0017rl5(z$ɎSN\tQ-8q6HޤXI`B:\u0010\u0007-W3\u0000{\u0014yA\nw\u0010GJdA<A zT\r&\ru̬hN\u0003=n)&L\u0016&T\u000f'\u001a\u001fѭK\n>\u001fy9U՜\u00021VMzdFn\u0013{\u0018>W\u0004*1\fa3d\u0011 m\u0013.\u0005z>ƵK\u001d\u0001v\u0004\u001fJd1~\t\\F3`\u001aRXLjѦbj+-<\u0016mN{\u000bt/T\r<\u001fgp\u0001X\u001f\u0012Yd\r<\u001f\u0014]Ѡ1$NJ\r=/%rA\u0013/Xt\u001e\u0015e0$TW8}~+D\u00075/{TGVY1ʐhST[>$\u0016\u0005#3/_i\u001b{侎q-Z\u001cw\bW\u000e\u0004\u001f'\n\u0007&;E\u0003+\u0016^Mo5{+\rv%\u0016bپ@w@g\u0007-i\u001eЕOh\u000b\u0011FC1Srp4_0\u001d^^[#\u0015\u0015b[v%\\\u000235,btv'J_\u0019,arJ\u001a\u001aȽt%ֿ+\rOיv\u001fٜsA'撏'0\u0004BG(OԀ-\u001ay\fG8\u001e-h^[\u000b\u000b̽\u0016I_4TK3~T\r\u0013[\u0017gYo}Ҳ@>i\u0006ɃH%G\u0014Q \u0003;\u000e;@\u0004A2:4\u000e$\u0015@2:u\u000ehC\u0010\u0007;\u000ezp\u001d% P2:0\u000e%\u0012ct\u001d:F\u0007Tآct\u0006\u0018\u001d\u000eaA\u0018v\u0018}\u001d\u0018]C7\u001da\u0007Q\u000e1Z\u000e\u001c>lQ2:\f\u0005JFءd\u0014,\u000e\u001c\"bbTt\u0016\n$v\b\u0018\u00050q\u001d\u0001 'v\u0017\u0005B\u0003(`8\u0017\u0005U(\u001dEY\\ǲ\u0000\u0017[,\u0002AXt\b\u000b\f\u000eð\u0018\u0016q\u001dĢ3v\u0015\u001dLc\u0007_5W\u001dxE؁X<|\bD4 \u0016+\u001a\u000e\u0013\u0003h!\u0015A,:Dƾ\u0016̱K_b\raX\u0003\u001cu\u0003h?j\u001dâ\u001bz\u0001nL-\u0005::J\u0006S1\u0016\u0010\u000eq]с>N50+\ru%P V-$.d\u001cst72m;\u000f)+I\u001fA\u000f\u000f\u000f\t\u000e5/F\"9\u000e,7G[\nB\u0003%3H\u000eH\u0004ؗƿ\fR\u0012ZE8A`<ZLWθ,\u0006\u0002.\u001d8&\u000f3Y|\u00033\u0005*6}US\"7\rO[Q?mg\u001e\u0019A_b70Vݭv(ڍ\u0019@C.\"nlt65?\u0018YDT_\"AZR^DV\u000bL[0k\u0015\u0014Ak}ރ.Ϥ)f\u001d\u001fVl'z\u00154XOt\u0016)*cҽ\rfׇfe~\u0001s\t\u0003*\u0006\u0001pC$ \rj'ë\u0013\u0001A50v[\th%\nx\u0014O\u0011e6O\u0018\t{\u0005&Qm\u001fu^\u000f\u0006#@\u0002B6+t/|Sf\u001fb1\tÁ\u0018/(\u0010\u001c8Dh\\뾩-\u0019vx<4O3\u0006Y\u001a%:<\u0013$\u0004냄:{4Ÿ\u0002\r\u00199(O\u001a@\u000ene\u001aZa`\u001f\u0018kCMwy\u0019P\u0004\nʬ\u0002R\u0006(+|O\u0015\u0007b#0)\u0014}\u0015xwǹv\u0010;+ܴ4G{6˟\u001ad)O\u0001ft՛/E\u0004hYE\u0013Bj\u000b,=\f9-V\tb!{%\u001a'.\u001eH4\u0014\u000f@v\t]G\u0012\u0007U|W,]u\n\u001as\u0001y=/oÛy`W-\\FS6$xH2zї\"\u0006Ce!fPG\b\u0012\u0017\u0004`FSWW \u0014ھ=f-:\u000e%\u000fIM\u0000z8qJgB\u0002](t\u0017W\u000b\u0012ϋ\u0019v0.<0'\u001f\u0017YW\"/޳\f>Ps\u0019&\u0010΢8;75cRf'\u0006\u000bc<\u0001$:\u0011l\u0010N\u0003MVڌܹj\f[<{vB\\]ߊ}SG!7tr/:\u001bs\"UtJ;\u000bN_b\u0006\u0015r\u0004l!ztF\u0012\u0017cE\u0017,)\u0007S32k\u0013Մ\t\bZ5F.\u0012\u0019)(5>Ͻ˵5B<lVH4c\\\\Ψ0oP\u001a:5x\u001f\u0017\u0015\u0016BD\u0001HK9Ot63YoY\u000b/\bZЈ\t|S>>%&\u0015%hP)AKܕ\u00076/8Os_\u0011*(\u0004J4_UOXH8\u001e.E\u001b6\u0019$\u0018L\u0014\u001f\u0012Uk\u001b3\u000f/,\u0001kKߖnL9)bŁ/FKD\b\u0011\u0002?)1\u0000s}\u0016\\Emo\rbS3>b#6d7x\r~@@W($\u0002&rr\u0005.(\u0010\u0010>-j\u001b3\u000fMG\"smJ3GGbI(:Fu\u0010e\u0004c\u000e&\u0005)\n\\&^e\f+\u0019Yn\u0010>M+z}x:Еhb\r\u0012VEP]gv$\u000e4L[\u0006{chXn\u0007\u0017F\u0011Is\u000fV\u001b#0޷,\u0018.m\u0016\u0015A\u0013\u0019^n{\u000fz\u0004Fk#l\u0007&9AjpJn&j\u0019@~h_M:vte(A$\r\u0014TXn\u000bԵn\b<4\u0017@qh\u0017$Mg\n#ͣn6'P|s3)P\u0017\u0016\u00140*%\u0004hS`\u0013G l;_LWj\u0003^\u00162XP\u001b/3(!Ԃ\u0012W%q[\u000eO_Q\u001eپ\u000f'&dZ&SB\u0004\u0011\b\u0004ӑW݈ -\u001bu\u0010\u0016Ǎ8\u0007*|H\\׌@@m\u000b\u000e`zUfN@\t^I\u0007͆\f#-\"-\u0004aY\u0005b#zױ_Z5:lp\nm^_6=Ț\u0015\u0018c9%\\GTC\u0003%\u0016@jr=g\u001cms   \u0006O\u000b\u0011d^\u001b\u001a4Q\u001aewF#:EvIёMS\u0002B7}0\\\u0000I\b){u\u0002@\u001ei\u0005AK;;YNFr\u001b\u00142, \u00050V\u000f\u0000h~\u0002\u0006|\u0018UД\u000766xbSC\r\u0014Կ5(@4\r\u001cG\u0002\u0004D\u0019s\n*\u0019Ue\u0015llǂ\u0000Κ\n9\u0006fW\u0012w@cr>\u0001/FLũkQŨE\u0011H9\u0004jr\r@\fĘ:>\u0017dK\u0016䋠Ч\u0010ZÀ\r'p\u001eY̛4Ph葼t\u0016v7w{\u00020eZPI\u0007\u001a.[YE{\u001a,.Cb|nq\u0006g{1L\u000bMƘul-Tw\u0018\u0003iyj_Y \u000e5NDXYcq\r!Kɭ\\\u0018@\u000f\u0006!K6a\u000b3;C\n56XSrut=J\u0015Y\u0006cO\\qgn{JL\u0019kOSn\u001b55 N\u0001VM\u001fNдsrq];\u0001.QM-2`F\u00110\n[\u0002&!Mm\u0000J:Tm!JC\u001dS:xT6s\u001ac7\r\u001bcNB\u0016tN\u0016\tdy\u0010\u0005*\f\u0014ؾEN|vJ*rҔ /v2TS\u001cש~B)TG\u0010Mɕx믁6M\r<\u0012'.\u001d\u0013ps\u0002\u0011ƕz\u001eJC5c\rhm\u001ak\u0018KgՁh\u001b:5~\u0010)\u0000ۂ\u0016DcVh\f\u0014^\u00128J.]\u0007Ao\u001b*\u00190CS\u0012AjG\u001bJ:\u0014Meg-C94/c\ni\u0007u\u0002J/\u00029\tD+BүJT\u0013X\u0012PA8IxOHbXY-LCmEx[Ņ迯-֏QÃʠ\u000fwa$8]t7OXon}s?_.6O?[)߯.G^9\u0011\u0015ͳ\u0007w7P뮰G%\r\u0018n`\u001ayywwn/\u001f솓\u0015󋿼}~y}7d{ru\u0017Ef7g/\u0013}oͳ\\O~:?lo|\u0016uO\u000b[x \u000bԋPR\u0003\u000exl\tT̓\u0002x߯'_gma\u0002\u00196;~V7\r\u0017OL$=jۛB9ź{3\u001b~͝gsoWߦv&\u001fq\u001b\u0001\"@\u0018)\u000f\u0012֭x\u0003dE1\u0012H1,JSaI%^\u0018T:qXN.pxQ\u00042Q$f=\u0004T#3T_N\tnFOw\b\u0012\u001fQl\u001fRNEce\u0005c\u0017RNQ\u0004 T̜%F\u001aa:t/\u0014Wĳp0X\u0012dAB7\u0012\u0018zH\u000f!ie\";ayם\u0013\\>\u001e@V*A\u0006Y%/'0U}3[+g\n{\u000b\u0002&ȴ2p\n\fA\u0013,5^E1\u0010\u001cޠ\u001e@΃4\u0001C$[*c* 7\u001dAW\u001d3\u0012\u0018$&WƉ\u001by\u0015a$\u0019\u0015 c\fTSU\u0005>HTU~\u0014X,FuȈ+Vax\u0015½SY|\u001c\"\u0018\t2j\b:\u0014V\u0006\u0001\rG1~(\u0005i\u0015J\n|W)z\u0012aF!jZJInI{ypȐD]xB_ \u0013ޑ\u001d\u0019hgV\u0005{ }'$^iQ\u0018@N3FaB\f\u0004X\u000e\u0001\u0014\u001c\t\u001d78i\r~K\u0013&\u0004|)MQ\u0017A\u0015C1\u0019Vd\u0013n\t>T\u0019aB!GQ0)@J}\t,H7&\u0001tB\u001bx #U8a\u0017Q\\¦\u0012r\u0005\u0012O2)\u000bi\u0018-\u0003\u001e\u0012h\u0002gg\u0000CӔ+ErqU\"E*}*1,a|}\u00058\u0005ҥb]$&2g\u000fI\u0006\u001c,c&}n@\u0004lN\u0001y*qȌsC\u0018;`f-!4\u000eYSͫ\tKL\ny\u0015\u0000'.\u0006qh\u001e\fi\u0013[ B\"Y<RHqt Ї,2rZQ\u00011А4\nh14\u001e!IKii\t\n-VtRfqr6%\u0015H\u001fP\r7\u0018e\u0005)!$\u0011\u00124q26Aff\u0018)8^^`j\u0004LJ\u0010%\u0006*\"(\r\u0003M\u0013\u0011tA\u001bOG,#vpl\u001f/\u0004Ξ\u0003iHb`w`#Tl\u0004:\rJ 3ʑ2\u0004!\u001exA)zX\u0005RH?Q\"j\u0017?F\u001a\u0018\u0002\u0019-\u001a'ͨ-H\\\ny\u0007=v\u0019q8F\u0007R\u001b+d\tz\u0012&D\rM`!-a.q\u0004)\u0003n\u0010L\u0012MI26WFqH>,!_CĔ}\u0014d\u0004\t\u001d4}>5\u001f\b$^oe.o\u0001&\u0002k@s6\tpR;ˍE\u0003@*j\tb>|^q\u0015V9\u0016R\u0004yprk\u0018j\u001doa\t8\f\ttR\u0010$Iډ\u001d(:O 2C\n\u0004fyAMQ\u0010FKVH\u001f1-\u0019\t͠vpNjXRr/c\u000e\f\u0006\u0005XM!|H0\tK뙖a2q\u0003aF\u0012%=&&EYIc?R\u001eF\u000b\\\u001b\u0006A\u000fЌb\u001byxh4+\u001dx^\"\tzyn\u0010ލː\u0013Ԟԃ\u00123CFi\u0012\u0016L§TyT\u001cءZz$|I2۠vt\u001e\u0012>gAF*xiC\u0005f.\"s\u000b\u0019+\u001eu*dR-ͼ=!0`t;ym\u0003\u0019pEIeØ@;M1c2Hx%C:pt\u0001b\fCF׈܄\u00040\b\u0016\u001b\rWCPcGo5\n\u000e\u0007؁d*Yqⓟ\u0001_\u000bv78\u0017g\u0001TdtB]S\u0010N;q%lOA|\fo\b:A2\u0006z\u0002\bM\fÙj <\t\u0005W$W\f^\n\u001aX\u000b\u0019ѧEz\u00000#\n0e&H\u0010nE\u000bHO\u0007\u0011Kxm+ù\u000b\u0016/\u001d\r\\D9\u001fA/WAU2<\u001a$\n坸Ϡw)rr;l\u0000\u0019$\u00111ec>\u000eYbIA\u001e)^%E4G\r@ai-1c{-\u000e\u001a$\u0004;R\u0013\f\u001f^<g\u0012 q\u0007h\u001fygVVv!E\u001fʥf \u000e!2\u0005OZ6\bh !}u\u001cq\u0018xܣ\u0007-+\u0015U\u0016\u0014x=EhB\u001aQ\u001b\u001bX,\u0015m\u0016t:\u0006R/&vȔ鈋\u0001I[̞<8r`\u0004v\u0006_\u0012;{\fr?6#旺hz^Ӭ\u0005Axz07ts I\r\nv\u0018\bX\u0012Q#\u000e\u0002\u0018\u000b\u0016 J#ѕ%Bfz\u00136O'H\u0012*\u0000\u0019#\u0000y\u001df\u0012\u001cX\rFL54.\u0013ad?EcH@fN9v)\u0018G^A3\u0010`n74(R\\\u0000E\u0000\u0010r\u000bSW\u001bz%!-u\u0015d]]ÞUDG)qSԛ8huum6U/fCHU$j$73C\t\u0004!㶓&q{RQzgMVx14=\u001e82.y}%Y|\b^y>r\u0001Iy@\u0010K]'KK`\u0004\u001bC\u000fq\u0007ǁ\u00117҇s\nf\u0001ȥ\u0001\r}Ng;W\u0015T˄\tƔ[iо\u0019*\u0016i\u0007Vd\u000fdl6wC\u00076\u000bh26|yO\u001c\t\u0003+>\u001caJ(0)qHNr\u0017W\u001d?\u00067;\u001dF>KMU\u0007\nc2#Y=\u000b\"D_fZBHzDcߝOq\u0006AANN\u0013E\u0006ɑ\u0002\u001e\u0003(Iab\u0014rpV\u0014/\u0015C(\u0012B@\bS4rQ*L\u0012\u0000o ;D*ɵ\r\t{\u00026(L:\u0017\t~0\u00041%R?d\bBfU\u0013?*\u0002cQCAlQc=f%r֢\u0015撮\u000eS}罣\u0017\u001eIu\u0018śS\u001f$Ȟ꣠@^':aU>!CP\u0007%G2r_\u001cAVN*\b\n9\u0012tMo!\u0002\u0003+'yrd*&PUH_K'\u001cǯ\u001dCx%Ɣz\u0007J-BqML\u0011;-\u001b9c\u0002\u0015X3~+\u001a'zv\"a9%=M0\u0006.eN&q\u0018ho\u0002s܁\u001bFuc16\u0010q[\f)P\u0001%L !ԼY17-Tf(\u0015i(\f\u0019\u001fK\u0000Yߘ|XT\u0012ₔt:lǌs<\r\u0005H˓&晄I\tOJmR61\u0014ܞ\u001fDInu:%(C!z\u0005g\u001f3qM\u0015k\u0019\ro\\Yr.=הds-פ\u001dG}3]!{$(D\u0011z.m;ū\u0016E3\b%_.ẘsAS\"\u001b\bk@\r,K3dC@uywv\u0016r'ty'x<j^Ѯ\u000f2W#`\\ Z\u0003=(PG>݊n5h{\u0005|\b\b&C\u0003\u001aĞc)d\u0014Tql8\u0013\\/B\u0000\u001eⓓZMt04\u0013\u0019t4\t'4D\fvC- \u0003\\rlÙ\u0010\u0014O~<|p1?'KwdN%^C9t\u0007=ME˰~+]3dD\u0001XLq\u000ep\u001e-yL\r6y\u0003.;n:k\u0013HdgTR5/BUSsɸhZq<5{i^l\u001ffDe$$QR\u001f\bT\u00199\\ruH\u0006JY]\u0018FVlID\u0018œˤSfD|\u0016*J\u0004Nl J/d\"dpJ֔\u000eL+*Ou(Mu\tDK\u001cCށ\"v-\u0003\n1D6E\u000b*\u0018F2C\u0002l\t)L\u0016SZA\u0012\u0013,dh{3\u0004),\u000bj\u0018g\u001b,P\u0004h[`\u0013\u0013\bBBrU\fG%VI)'4A,sXCUp\\ip5\u001a׻gG6\u0001[\u0005\u0005$[{?Ryb\u0005(~\u0013\u001dAAs?u/4\u0001\u001dirm[OE5X?\u0005'*\u0017\u0011]ehVH\u0004<\u0017\u0001\f*>-RL\tIU\u0013=\u0006!b7k=\u0013fBFbBTp1\t\u000eβ\"YWn\u0014 keSϗ\u00107ТB\u0018F)v\bA'\r^\u001c\u0005\r\u000b|((!7:S(p\u000796\u001a8\u0018UKuS~^C\f2frD2iE\"96\u0019D{tFy\u000f|&wNN\\\u001bk;-/ %h1J4@\u0004\fh,1\u001b\u0013(r-(@J@\u0005\u001c\fx\u0003u$\u0016xii\r\\Qtq\u00131\u0016\u0006\u0010c`\u00131iH:&\u0005KE\u0011\u0016Y\u0011I\u001f{'ot\u0000Cxۆj\\-F\n`Av8W\u00063cR\u0015\u0000%0&~jIJ\u0018[$\u0001(\u0001) AQI%O'I\u000f\u001d\u0012Y7o\u0019>ɸi\u0012\u0014\u0003A4k\u0010\u0011<p1J|\u0007JT\u001cEo\u0004k䦫 5<W\u001ci\u0005\u000e\u0003F:\u0013\u000fa\u0010tAa`\u0004\n<UA1]<:\rj$|Ű\u0004\u0014\"\u001ba\u001cS\u0003X\u0001.|\nU)'\r2؅\u0010ZX\n8PCM%0RB>N\u0010\u0004ƣt \u0002)jyp;ݠ\u0012\u0004ZP'ʦP2\u001b\u0017㚏骈ܔJ\u001aoVY>h\u0018C^8\u0012#O<yfk~z\u001cDX}AyèR< k/nl8\u0019\bE\u000e<iǝ]3\n\"\u000e4dH\u001c@_\t\u0006@x=R\u0002\b&+B\u0010M\u001b\u0003S 7ԐՃ\u0017a\u0017\u0001=M$HLPhs{yLT=\u0012aK\u0010 @\u0019$3p;|\u00079\u0016*U==q72\b\u0007)$Dk?aՍk4ťC2<CQi\rou*2\u001e\u0007^0\u0015lppyjxy\u001cRf\u001dfMd4\u001c{\\\u000eыN\n'mD;Z\f\u0016˦jS\u0018K|3E\u000fCP9\u0000\u001aKE+(d\u001d;\u0004,\u0011\u00138\u0013O^)wHwEƐ-#n^E\u001c8\u0001(S\u0002?I$(W]ʱPʖg,!_q\u0006\u0018H;vǱMڎ uRq;k]&m(ގv\u0003]z\u001c\u0002tQX\u0011IPDVUU\u0014\u000b\u0019\u00067T\r ۃ<z~S\u0011i!%,&pf:o\u0007{̭c\u0000sF\n\u001dUJzNP-e\u0003+\"A2\u001fg,wU=\u0010g\u0006dz猫~<Z\u001d\n>^ܚVѣ(v?BTb\u0014\no}N!߳B94`2ތٺ<N7\u0018niHJz\u001c6h{~i\u0001vm`VOvv\u000e0YT^O\u0002p䢏q,]\u0003<\u0007\u001e)XGJ\tO\u0001\u0006d}D`wA80\u0016 a(S\u0019j\\\u0004swa2\u0002$pQˠ2,ʧ\u0017$do֔\u0015\u000f[Θ\u0006nrl\u0015\u0017BuLK;\u001aآ8\u00078$j,#,Z\u0013ܸ\u0006PmzXɿkİ=Y\u0013A\f=L\r\u000bi3\u0004FͦL)L6\nAV\u0005V\u000eq\\M\b]0\u001ad$\u000e\u001f\u001cs\u0000w;\\\u00035Dτ\ri\u001coI\u001ap8\u001e\u0000;VY`\u0015k\u000bX\u0010\u0017\u00039\u001b\u000e/^=\u0011׿{b@\u0015Hr|\rcX\u0001\u001a\u0019h\u0005 \u001ds.\u001a\tN\u001bO(I\u0002n@\u001f&JGA\u000f\u0015I]\u000b\u000b#s8\u0002<\u001a;(Lf|ӔYh8\u0000!Z\u0014Z\b\r㕠\r1C\u0012h3[ER\u0015g\u0010Y\u0016R,$\u0001vOJ9@ߡBj^\u0013\u001c,()\bs\u0005&[qh%\"NN=>I)\u001dMh=5<\u001fiح'[\n/=\u0017|fUp!%nE֍\u001b]RM\u0016\u001ac«Ѿ)S\u0007֒\u0005͞\u001c\u0015>G禞l\\uBްtS|2\r\u0015+L1ׂfh\u0000+@k\u001aa7x\u0011ZG5(O\u0002(Q@u\f;\u0017\n4\u001e\u0001𕴔$z8?*ӑT;`~\u001en\f\u0017\u001cD\u0005\u0005sDU\"YLÈp\u0004\u0010h\u0010& y;0\u0002<[Gȝ܀wF%P\u0014gshxaX\u00059|B\u000bi}HhWIc+\u0002^u rw\u001cG\u000b7Qsc[xC6noh\u0015\u001aU4賂2~XG\u0003(g3\u0010\u00022\u0006S4c\bdaxt[7\u0006\u0000Ҡ˹\u0000Z|r>\t\u0001\f`b\u0013-\u0006/\u0000\u0015X覷\u0011V\u0004Q\u0003z['X~wq\tc^{#~q\u001f[ّ\nTE0J֕R.\u001d{#wհ\u0014}u\u0014A0H\r{\u0019J^\u0016n\u0006\u0011\\7O{|0nivĺ j#\u001e@\u0006\u001dD\u0019.<N'ȓ\u0005c\u0012eaZ$:ȀdMyth\u0006(M0\u0006J\u0016븅`O\u0012\u00135^1\bLf{f1(Fv\u0010F\u0000%\t\u0019\u001c\u000f\u0014=@zأ=zX`G߯Du\u00154\u001bٯ\u000b=\u0000#\bǊviĤǿA{K\u0011\u0010\u0018\u000b1&ϩ\r\u0016pliGHT)i\u001dG\u000f<\">\u0000/ɶnA\u00045dswr4\u000fdt\b\u001c!)\u0019Zߎ\u0010-eZj>LX\u00137+3\u0002I)D[\u001cqWQS\nI5d\u0011\u0001\u0014\u00114Rݥ\u0019ίH@\r\u0015`O\u0017I,\u0005\"\u0019ި\u0004L\u001a\u0016!!E$Õ_ÒK\r{ȑK&%QUb#\u0012MT6Cc^GpA\u0004ƚ;\u001eq=\u0002\u000f\u0001K\u0005\u00016\u001cL\u0012ƥul=1=Ev4TC\nC\u0006ct\fy:*\u000bm\u0017\u0011\u0015ZsmMK\",k̐Bscc/\u0003(\u001a\u0015`\u0000:kHe}|Nw?6&\u001eN\r\u0006cy|s}\rHa>,R՛m\u0013\u0005av\u0014]\u001e?\u001b\n@5.=X\u000bAW\u001f\u000b&{We)_,@B/\u0018-0\u0018.4\tBoBT\u000eR\u001at\u001a]4G\u001f\u0015h\u0013X;%i\u001818CF<FO\u0011DS\u0001p\b\u00016P\u0000F{\u0007I!HjҐ΍\b$:\u0012\u001aH\u001cqU*\n29ZrW\u001f\u0016T%LGmZ>`;\u001eD05M\u0006qּEGFި\u001a`N%o\u0004{r\u0000\u001c ;W\u0006\bp\u001e\u0017=\u0012\u0005\u0017K˗Q(9\r\u0019\")Z/aqH\u0003 \u001f~\u0010F\u0018lΩ)yaL'\u0000GhL\u0013\u0011PA?9zS½}\u001d%`9ژ\u0016\u0012j\u0002\tԐ\u0000ת4>>\u000f?N-NlaSJ˳\b([bWG\u001d\u001eձ9+9b`UFyD/1uS-xJȃ&奦ίuxc\u0007Ȗ-PG\n%\u0016|m$?\u0015K\u0007\u0017\u001ed\u0007ǘGbl\u001c o\bgN\u000fW0p\u000e\u0013t%7I\\ i*|,\u0011uX.\u001e嘲tih­!tnL\u0005EÜYTAy\u001e# ߾v\tds1d\\*+OM\u0019\u0013E\u001e\u0005<\u00115.m7+z \u0018\u001cEOb\ny\u0007iƭbSƎ\u0017j\nJ\u001e\u0001O'\u000e\u0003+_\u001e1dS/{1\u00035B$蘀\u001b\u0019f\u001cL#\u0000Ь<g=ŦX\u0014~1\rQM\u0014ǌt\u001b.\u0012 91}\u000f\u000f\u0012N\u00050\u00068jS\u0004ಒ\u001b'rD\u0015k^\\\u001f8@7s\u0001@1OSOÆuם\n/֢3\"}ƋL@iTz'\u0018\rሪ\u000fL@g\u00148\u0003u׮sl\u0002tE*OBS\u0006ȱ\u0006KS3dJ_\"!pӪ7ę\u00041Ӑfzg'\u0016\u0014ۑ*\u001b\u0004\u0012/_+!\u0012\u000b4ls3\u0004\u001e䷌7nl\t ৉\u001b;@\u0001pciB\u0006)\u0011\u000ex\u000fF\f9\u0010`)B\u0015рëa É#ޓ\u00056ϻ\u000b.hx5\u0018e\u0016I]\u001e{o\u001aX֭^ϝA\fz\u0013%\\9\u001a=9\f۬Yx/0/jj2C9SR1XcOȋj'6\b\n+u3iW\u0014\u0012\u0012=~t\u0007\u000b\u0007\u001du=,wo%\u0012H\u0014L\t\u0018}̸̌r\nzR\u0017:\r\tI$̰l\u0015_MB@tt\"/y}ݢ綕`<\u0001.:o\u0001F+\u0010x.dmzS/IP\u001d`[Di\b*^\u0019OE\u001aFz301֫ڴ\u0018\u0019Q\u001d\b\u001bIx3y\u0001)ە\u0006aXL\"\u0017Ӛs\f\u0019\u00002uS\u000bnz+(/R}x\u000e=p8aX\f.\b>\u001aT\u0018d{\u0002\u001995\u001cᇇGJ[ݧtS\bʼXR(\u0018\u001eiӳp\u0001ᾟI\u001d$\bfI(\u0013E=-^_\u0013\u0010\bla:\u0011x\u0017f(\f\u0004N\t:.\r8\u0010\u0011v\u001b\n7V\u0012*X3c\u001722eOI8\u001d\"\"h#ZC\u001e\u001a\u0007\u0004f\f e\u0018\u0013B&\t9:O[yiX\u0016[V=LUd\u0016\u0002c\u0000\u001f+&\u0019^%O\u0015\u0016c#J:5cb>7`VlH\u001b\u0015z\r\u0005\u001f',!l}f4N3\u0003:9\u0017;CLcRi\u0001.\u0004b-\"}'ςe3\u0011ґw~L۪hKeSu\r\u0014!xE^KD{U0V\ny.\u00194\u0004\u001b\u001dWb{\u001a$\u001a\u001bc\u000e>\u000fdG8e{O*Ghq \rrTb\u0010`K)EI8wM\u001c\u000f\u0006+<FlG#rd#Ev\u0002s3\"F6rK\u001cΊh \u000bmw]\u001fJ')؟eA\u0003\u001a$\u001f \u0017\u0007]s\u0010\u000ee\"\u0002EMVhR\u001are\r]\u0001\u0017\u0003\u0003:\u001e\u0013#A\nF٢(.3\rTh\u0001|O\n*\f}wp|ڒʕB~dB\u0007\r)uz1\u001a\u0013b\u001a0\u0003q\u0017^+\u0013ke6j#\f-=Wcɞs^MC$(\u001eb\u0005di\u0015+(\u000fD\u0018H\u0016|t2kk\u0006#&2#W ɒ\u0004ǇEx`󣮠Ƶ,̴R\b\u0007.\u001b\\\u000buզ\u0010L\nV\u001fL!bcd{\u0005A`lC\u000fX\f`F*ͪ*\u0018}0KO)Ѭa\u001bETǟPlXl\u00103\u001aX|\u0017\u000f˂C\u000e\u001d5\u0005ϸЫO\u0002O\u0004\u0013^ܘC\r\bGـnv.@>$TVtRč.\"GB\b\u0004\u000f\u00175,v\u0011\u0005\"|\u0017\nTͿ#~\u0011\u0005;3\u001aLDdL-{ߐ&J4C\u0019לcSXc\\]!\u0013\u0015n\u0004\u0002[4lf*AUVc\u0010Z#6ρ<犠d\fB5dǉ_jHd5TaV0c$ j\"\u0002H8%\u0005$ʎ#j\"%\b8\u0010hnpRX%\u0000n\u0005U($_߁n\u001c)O[#\u001fB#H\u001fu\u0017|U~\u0001v\f\u000f篿\u000f\u001fo?X\u001b\u0003?T5.EBϫ\u0005\u0003\u0001%-\"QS\u0016wH\u001f2Yfa\u001ab#FG(\u001c5hЁtz`[nՙݮ:dңz<2 s7lDǄ\u001d@|a\u0003L\u0002\rKގ 7\u001cn$\u001f\b*\u0018dT\u0012t6w\u0019#},t{N;@V4hpV|!\u001av{Hղ\"\u001fl9fBH\u0011EUPj\u001eg&,\u0016,oq \u0000\u0005%5\u0005)6#\tB󡒱}G\u001dV)\u0007`\u0004~wc\u0002Z\u0004Gl<'f|z؍\u0005\rS+]-(\u0012OEϠrz1U\u0019X\n\fW#j\u0001N(9#,\\{_DO%\nTb$ĮP\u001d\u00127\u0005UZZ#̴\u0007o\u0006\b\u0016\fD\fS\u0000vl7\r \\f3i-qm+\u0015pmpoEwObӼid\u0000}#<tqrT$J;\nw\u0004SΈaLغ}j\u001a&cu)~q6@\u0000QdCe^;ʇ\u001b\u0019\u0007g[#O\u0003ɟ;ֆ\u001e2&7P-e\u0017^x\u0019Y}[h\u001e5^]\t¼K*Dp\u0013\u0003Ԅ\u0007%ꞃehm)^x+rBD\u0003?zN襟N\u0006r\u000f[ϘK\u000fWM\u0010\u0016bmaZ\u0019\u0005LYt8x.brk\u001b!O\u0011zmi\\ْtBA \u0014\u00178ӝ5z1\u0014z\u0004h+\u0019\u0017Nu#͚;\u0010+V\u0010\t4C%\u0015uȻLd\u001d|*P\t@aS{\t'|\"hw\"\u0014AC& `=J\u0016{7L8\u0010M'e\u001bv}e١$zh@V\u0015i^;a)B\u0006\u0003\u000e@\u000bʀV73\u000e9jY#J\u0000\u0015\b|rZ>cָT`c5\u001a.\f+AQ\u0012̦wε\u0011\n1G\u0000MB@\tơ|\u000eρ]Q8'!E\u0006f#[Peű\u001f0X%,\u000f\"\"sq\"\u0011$U @D\u0001VuI\u0007tZp@(\u0019;QE\fgX\u001cU\u0002W\u001cWWr\u0006P&hc\u0004S\u0006,4v\u0010\bU,y|{\u000e\u0017/\u0011\u0015d\u0014k\u0011-ǫelaΘl(d\u000f\u00020V\\>[̍i4.k\fy]h7΍cF$\u0013<S`żo@݀j~^5\u0000\"I\u0010\u000bq\r\u0000p&\u0017\u0016t]6\u0014\u000bީ\n\u0012@psp<s\u0011ydxƚ,Z\u000f\u0019ý\u0000b$ݿ\"A\u00025\u0006dJ3\"91(u:._ZQ\u001f\u0017C[=\\+>|a\u0010m$9\b\u000ekbb\u0015,k&>OݳF@\u0002G˘p\u0000pϩ^\u001a\u0000\r\u001bf9\u0018c?\u001bߦrPy8d\u0005\u001fTx\"\u0000\u0006Z]Z\t<~ ,E\"u\u0007*\u0011\u0005\u0004HM.\u001f:P\u0006Mb\u000bʎP4\"\u0003!hpK_X\u001bK(f\u0018\f]0\\[{ 72{\u0012\u0004\u0011ٗE\u0011MD%CdoY2o1Q\fd\f\u001d;xM\u001fw\bqAh\u0016h{&lTvOJN&\u0005%h\b|QA\u0015%aU\u0019XWR;_>h'Wh\u001eE\u001dz0\u0011\u000eᵁ$\t¼0(/\"'B\u0002-5䣄\u000f5[\b\"\t\f-|$yx\u0005\u0006\u000491G\u0001Z\u0005{*fJ\u0012:\u001a\u0017@$$\u001dH-Bͤh\u0004g|\u0006\u001e\t+w\u0013z=ƭ?\\O\u0018h\u0001\u0013,m/23qy\u0001VOxن=#G\u00116!\n$jk\u0001ɫt;BE32} 4(zS\u0019=Zf\u000f\u0007͈/\u0001ʂn\ts\u0013}2\u0000wѲOI\u0002\b\u0011a\u001cJ_qRv\u0019\u0013P5LW5_Q3NS1LԚ\"(\u0012[\"\u0002\u0017\u0011K=#4\b0Ve.tٙݧh*\u001dZ\u0005'hk#B$mD{z\u0010+mtw7*٣̚gB\t\u0011q\u0006_'9e\u0014P\u0019h:u1\u001fM34\u0000fߜ ņ1Գ\u0004R;GXE44\u0019dC\n1P[B\u0003:It\u0016\u000e܀~E=F\u0005K\na\u0015E\u0001eޒ{D}\fΰ4ȯc A#\tib<yhBԱ}x\u000bZ\u0005g{\u00069\u000f4E\bTU2A2 n\u0019J,:(4 I\u000bןI5#\u0011'\u0001|\u000foˤ=\u0014sD\"\u000b@OӶm\u0005\u000f2`D*Z`0\"I\u0004\n\u000b*T^\\M\u0006-I\"X\fczk\u0017:Fj\u0015!rD\u0011\u0007nU\u0001f\u0014\u0017y,#^Yxp\f3\u0002&yG@2u 0\u0019\u0018\u001b\u0002<1jtFA \u0002\u000fW\b\t,\u0011n\u0002(\u0018;WIw`\n\u0019`\u000e`c+\\\u000f6L\u0016Bc(\u0018#0h\u0006\u0005cVQ{;KtBY\b5A.Dy\u0011\u001d놞t\u0016&LE\\U-/1FʍYUDR<r\u0014\u0012\"ݴ\u001744ShU3\u000f󲯘s\f6gRY߫9Ǵ\u0018\u0000_\u0011 KpM^\u0013\u0000w\\#\"A\u000bF9dg݉,\u0016xa\u0002:x\u0012UL<\u000b8\u001c\nq<6V4wNWaQ2X\f4sc\f\u00054(%ΐ\u0005ⴐҴf&ug=q\f9tR@k\u001c1u\u0002Ky=N/\u0014\"\u0001سX_\u001c_g0o/M\u0007l\\5eOMy\u0019he.\b18\u0006\u0012x]-h\r]g7(\u0012y]Wwn@}᳞+\u0007{ETo\u0001sɟs$\r\u0018iEf\u0018zx\u001f&szHbGV\u0004zgu\u0019xsqgo\u0013>&Ĝ\u001e^l>\u0015!Vo~hU\u0012\u0001+W\u001ch#\u001a6i\u0006#\u0016򤽄<)D+w7ǝ\u0019N\u0015%\u0002;PEmOa\u001fy\n\u001a\u0003.&8%(%K\u001a\u001c\\@R\u0010\u000e\u001bzXlJs^c(p<rMT1VdݏZ\u0016ݏ0Ȟ;\\\u0012^8\rІa|S\u0005QnTt\u0001\u00166G[\n\u0014\u001bqf'i\b\u0010GBW 9V^F%Lױ'\u00169Dކ\u001c!Ut \u001ejq8\u0013\nP:\u00194ba,2\u001a\u001b#>VQ,\u0012\u0001(s0\u0004v*\u0004!jq,4ez\u00124]\u0012W\b\u0002|1*ы4tGў*=\u0016!*@tஷ\t\u0017~\u000b]pC\u0006s󈆴[1h%\u0017\u00141FcY\u0007\u0016k6\r\u0004+&\u0007Uˋ0-\u0012X;e|C/\u0010va9\u0014\u0013\u0018ñoSAq2F\u0010Yp(hu_oMΌ<ɯ<\u000bT0!-\u0014\u001aՇh\u00183ǟ\u0010w\roC{\u001e\u0010X\trn\n&W*I\u0005ڬ@A/^Kc-lx\rs:f,K̈́\fn\u000b-N\n\u0012Ӯ\u0003!\nmUx\n\u000fX\u001c3\u0007t\u0004uW@̂\u0006+\u001c%Kb7>,\u001b\u0010*q\u0010,7a8ʁڈ:VjT\u0012B}7AO\u0003<r͈\u0014eX\u0001$~XŭH[ \u0004Jr\u0012b4\u0010XAgT|2MI  4+t'_\n\u0006\u0011ӏ\u001cY\u0006\u0015y+^\u001ekH^\u0015Xw/FcŁ_4v^`bKf(+\t\u001f-\u0015sW\u0003!)й%ks\n\u0013qQ\u000e솱8\u00153\u001fq\u001a;\u0003sݔ\nJDd\"\u001e\u001cގ\u0019izjy\u0015QkT&\u001a#)~\u0019N\nra/\"L\u001dJU_s. YZ\u001cb{[h?}0+K2ޱ\u0012WkJkX HnAX\r\u0019:\u001cOj\u0004TKJ0S\n\u001eʘJ}Le2d*o\u0004:*n\u000b\u0004ZAx*j0v{8C[q_\tXDL'$\"\u0014.&^R백20A b/eDԺ\u0010\u0011#. UJu~=Ǵ!K\u001f<\u0014XPz(\u000254'\u000fr\u000eh\u00028\u0012_w\u00064!\u001cz3k\u000fU\u001c\u000eG2(jǖ\u001111-\u0011\u0002\u0000<\u0004\u0005 z\u000f[촱ΰ\u001cRm)&PX\u001f0ko\u0017\u0017n\u001aǕvd*}woyE\u000b\u0005 *W#{ZpW\rsv\u0005\u000228\b\b,\u00006\u0014RAx}^mFI#ssX\u0014ӵ-\bx<\u001dC{Q\t'\u001az\u001a\bauxc!sӛQnPKާ5\tDۤCm\u001eiz<kѯ(>\u001aOAU:\u0018j\u0000\u0000:#\u0002\fuMPN5K\u001fˢalu\nph*\u00045\u0018Bi\u0010|\u001cX1<U hzn{͎w*hMG|MFjC0r`}g9hiD\u0006\n)ƴ#:\u001eGw<~k\u0000<\u001c--\u0017:\u0017r\u0000Ւ\u000b=0|E\u001a `j4p\u0003.=5\f\u0002(a Fp\u0011Af\u0006y̆T\u0013P\u001c}6/R\u0010Q\r>B\u000e\n\u0016/\u0014̖6໊%s\u0016pDlƘc\u0011B\u0006]\u001fIQ\u0015Q\u0017h<{;\u000bJ\u0014¡B\u0019W'\u0007x\u0015\u0000g\u0014_.P;P\\\u001f\u001c<'\u00153ʛR\u000fe#WJQQ\u001eAqgg0֡)z\u0012V\u00058>RĹH힗\u0017wsR\"}\u0014E\"0cT,>?\u001f;+\\\u0017Arm'\u001b\u0001N=V0\u0019\u0015\u0005Mpu5#L롒)c'nn?C\u000f'JU}\u0003\u0001o!5V-2+Nyz=QC\u0019݈,\"ԭ\u000bD.\u000bc\u001aU\u00038St˵ ]R\u0010Wڑ\u0000\u0006oagMS\u0002ͧO\u000e\u0000H̊H\ny\bд\u001cbZ'\u0014\"QW\"4ŪѺp<}8Ue[\u001f\u0011\u001f.P\u0000_\u0018`V>~rTC\u0015-5/K\u0015\u00024\"uԐEWG\u0004\\wι7\u0010rLŷ\u0015\u0003LHZ\u0015y}\u0003,'\nfU&ȣYl\u001b1\"1uokI;[xiSFu\u001co8G/\u0010\u0010^5g3z\r\n;\tѧǙ\b\n`j\u0012.޴\u0014d\n\u001c)\u000euh8\u0004Ȝ\u001a|ۡ3rt\u001e\u001b|B'fl\u001bKӌ6L[f\u000eB~\u0013@N\u0015\u0006\"\u001bCF>\u0002\u0019N&jUw\u0003T?G+]t\\~kw[=\ro\u0007V\u0006\u001ccO\u000bs,=~\u0018MlC\u0016آNV36\u0006ȐJ\u0007\u00193@5#>,ٞ|~$\t\u000fHkFw[?FCh=?/__\u001f?o_oC?_Ogſow\t*?\u001e\n/ش\u0001VHlwle8)AL\u0016`DΉELꪽY*\n<B\u0014Xx+Oi\u0005Z\u000fp\tl-ҋf|\bּmɇ*C\t\u0013g]<bؐKF\u0017' =\u0002P]#?u\u0005`\u0018j<\u0015?T\u0004Qd%B\u0016\u0017\u0003jNqKS\u0019G\u001e\u0018k㔔?*~\u0007\u001belx<\u0018q\u0017~L8sA\u0001=CqK64b81|N|oW_,rU\u000eD\u0003qUnc\nW(U8\u0018DU-\\7D#MtT\u001cFSHH8Z\u001ah\u001e/yqgW+^-ʵ\u0015\u0007vJ,RbΠ\rCm}\u0019\u0002\u001cTol0DAQ圙Z]B\tZ'X\"rpU\u0004XI&T(؁y\u0012*\u0001X\tU(l\rfƦź2~\u0012mhA]́c>ީr\u0002Ϻ\u0011_';\u0002Dm\u0011\u001f/9}!;Bw<c\nM\u0014\u001dr\u0015[1K`F`\"DPP%tYU\u0000\u00119~L\u001941:\\{\u001d@|\u0002\f\nc*\u0012Sc\t`\r0`G\u001f*ݥ+O`M\u001d~#9W\"<\u0019\"mgX\t@\u001e\u001e-L7<\n!\u001d\u0016Yӱ\\\u0018\u0017a[C\u0001y\u001f&\u001f?g\u0018Ä:n3\u001bwWiFF\u001f\b\u001310\u000f\u000734Kn]x@&m7obT-PY+S\u0012 (S\"3>TFa\rFf<yD~8;ȁ7w4\"\t\r2dv\r\u0017H#\u0002%\b0h{ĥrݻT\u0018_ѷ;\\Cp`$\u001aQxG\"~\u0016}k\u001b\u000b\u001e\rL~\u0012R\u0010tf!mL\u0000,7B;Xn%#qH\u0003W\u001azO{HSB>\\y\u0000Yu\u0003R*\u000f[~D\u001e1Qg\u0019s\u0014qoe1j9\r\u000fh,1Eb<\rIt+/wzN\u001cJ#\u000f{G+\u000bRk\u001b-;`\u0018\u0004v(cp6~w'1&mrj\u0019/jdJg?Lot\u0011x^3]\u001coa\\χ\r˯\u00047ֲBBbj\u0002B0`B\u001e\u001e\u000e7|\u001a\u000eۃFqza\\<a35._T򧩼h#?ž-89\u0006Q\u0017_D\\QT<\u001c=ϻo&\u0010\u000b>\u0014#'Ow\u000bޛhmީ\u0013<\u0015\u0012m}űT3\u0014-i^fj۹\u001dk>\u0016e\u001e\u001f>E3O{QUÕ}\u001fi\u000b\u0001\u0018f=/\u0007{^\u001c]X,q藔q\u001cŽS\u0011?Wnʉa*HᦎN|-m\u0013<=ӕ?m.\u001e+Ηz\u0018-jU/:gBr\u0014w\u0013tտӚ\u001f\u0012pY$nu*\u001cI[(\u001c\u000e\u0012\u000f?s\\\u0000CQZYx7-\u001f\u001fap\u0014WUPd\u0005\u001f劁}imC|w\u001f/J}|l\u00132\u001dr8X\u0014B*\u001aU8m1Fp\u0016'ke\u001b3à%\fia<|Ĺ\u001aԲ\u000f\u0007\u0011\u0004wb\u0015g\u0013\\~0a(nY\u0005J\u001a+^0HN/Gp\u0018\b\f\u001eF \u0000\u001c\u001e\t5m.Oo\u0001@w1voo\u001c\u001f؅1ݼM1t~;enn\u00060N\u0004xc,_\u0014uwX=0\u001d\u000fm6_\u001b^μ\u0000򷱇9率6\u0005gݩ/l >=1Tg6\u000ba<\u0019\u001c\r\\>\u001cQol>H,ܴê[T^ׇ\u000b1t\rAd\u001b\\\u0017wH\u000f_kY85U^vw<]\u0001\u001c}X\nSuu:\u0002.j;2Z\u0018}3\u0006V|\u0011Ǫˎzp^\u001f.;\u00125?\u001a#\u001e6[\u001d9ʫ;#\rs=\\oS6Q\u000b.\u0018c\byCoD\u0006ȫd>$si\u0007*0x@\bP)\u0001P0_\u0010\u001ax- laL\u0018yU\u0019SD䴦\u00187N֙\u0019\u001fnά\u0004?\u000f\u0005a73kz6sK\\Y\u0003L\u0019\u001c\u0016>˜_˓LZVT\n\fY0^f6bo[fo,#bܕϮ9?M\u0011l<'[\u000f2_\u0016a\u000f8*9\u0019W\u0018S~\u0015|$\u0013a쑹A\r \bAd\u001ef\f,\npɻ^\u001b\u0019 9f\u0019\u001d\u0003\u000fdr\\ƴ;~\u001a!\u000fa\u0019)L\u0001å.\u0006\u0012!t,FB\u000e&iK\\\u00151}\u00123\u0007\u0006w\u0017b}\r$l1,jx8\u001d+K\u0018Rq+\u00100\fgca*\u0016\u0001>פm,|K\u0000c0X{\n\u0012m?3O8R+]_/?aFf\bw\u0002L˕G^g6\u001aV!\u001f|U9{0H-\u001b6ӈT\u000f\u0001Wt~\u0007\u0003\u0006z\u001c-?+\nP)Ҫ\u001f7z\u0003v\u0007\u0007T\u0018̉8g#a\nYc\u0011\u001cJ`f\u0012\u001diN\u0011O\u0016\u0014yz~\b툻}.k7\u0017a>\u00103>(r>m\b{=8Àke'øo;a\"Β\u0004\u0004&]\u001aX]\u0013\u0016\u0002 |v<~\t;o\tS_\u0017\u00190NqpP\u001f\u000b\u001aO;xՐ:\b$NX4\u00041\u001a,~\tkՊ$)VoWaN\u0017\u001b˻7\\&\u001f_f\\1\u0011-ö́\"\u001fUyY\u00077m&L\u000f ӄ<̄\u0004t\t6\u0013\u000e~\u0010\u0001\u0017wMIO\u000faz(5uV)7f\u001aނCM\u000eQw%\u000f7a3ʹk-r~t\u0013\u0016 ݡ˜p\u00136y[B#L\u0018;x\blubz\u0007\u0004R\f\u001e\r5m\u0019LkqMzx\u0006\u0014Y\u00172\b&y)#\u000bl\u0017D\u001c2>\u000f_`hQL?\u0002\u001fa!i\u0007|N`\u0002Le,&pm{\tj.N4,oߋdQ}i \u001b\u001b#_B55MH\b`:ӗ\u0018E\r=mO\u000ex,K\u0001[\u001f\u0013\u001cõVv.^\u0016PG/p#D>!/G8\"k\u000f6=Yd\u0018s\u0003$˴lp?pܔ\b5/\u001f^NImòR,?x$Hj|pEc\u0001c\r\u001ar?\fy\u0014rQ\fy\u001d%Kbm\u001bY?4n\u0004\u0011#[&_~* rI/}\u001brd\u001cwT\u00032e2\u0015\r9&SqO˘\u0018*>pCC*\u0006N,1*5Y(˘W\b82[Ƽ4y\tՇ3/v]μ6\u0018\u001cxkCU=ys>yec1\u0016P`,zYˑFa\u0007ȵ-zY9\u0004O)\u0017\u001b4\u0019[L^fH:fjzfC\u0000ӫ\u0004\u000fR\u000ey/z^{:`#5\u0018L%k{ڠ@G\u0017`[9Xb><z\tO\u0004O^T\u0002|\u001a\\Vb\u001f9'mK\u0012a{O]G\tZq\u0004m%dĵ\u0011䎍{F+h%{=OV\u0001okҐA\u0011\u0000=pe'\u00171\u000b\u0002YBEMte{7V&1{C]ј\u0001{g\u0018Gu]\u0017\"<B\b\u0018T\u001e.lUHKShHXV\u0011C-o;ߠ)\u001eXau\u001f=\u001b<\u001f||fc1c\u0000}\u0014#XǗ'b=||!\u001fg\u0004\bEC/\u001f_zgl\u001f\u000elo|&]/?_/<\u0002.\u000b-]Eo|y\n;e5v`\u0005pf\rW\"AL?}o\u0011<|9\u0011a#\u0006\n5_G\r\u001a\u0001vn=\u000e`Lw?{\u0015)\u0011l{@r^\u0003Wk\u0012I\u0003%t=\u0014o\u001d\u001f{Ƿgￚzc\u0011;0\u0013ڐ-r^\u0012\u0012YQYoU\fi d]{meڕK۵\u0007?7#!\u0018\u0005i+\"۵׿#d\u0004Frmh\u00104kzrYږkSXyY/Q\b4\u001ffbcP\u0000\nȼ\\{\u0005*/]ּ+\u0005/^S}C!#oc^nˇ$\u0003/j\u0015ƻp:_ƹ\u000b\b^kXͲ'(n#{mqQ\u0019noQ7=.38J`$O\u001fw6}q/k\u001bbJ^kTgw'!e~~ݟMq`Vaxn\u0004Nx\u0007g{׶\u000fZdbz^\u0013rj/eӤv Qj˛VxJ\u0014~E\u0015\u0017%fTf) ?@K,}g\u001b\\Ҳ0\u0004MoYʿЖԞV͈V})\u000f\u0007pWql#S\u0017Rmb,\u000ew4+@Fz3\\&m\u0005\u000b\fG\u00165:zOW9-mWpRpϫUu껽+`Tk\\rmZΤRqk3Z\u000fVek\u0018ӞU\u001bpKӕu\u001f͋MͲ`\u0013pz\u001a\f\bUS\u0011_\u0018^\n\u0018^M\u001cPզ\u0005ɻuhU\u0004?C,/RF|\u0018^%\u0010X\u001f\u0015Z28e,b'f\u0015Լ=P~X֧w4:E\u001d\u00047%Ի魾Lɯ:KԹLU\u0015*gF͔Xr3\u0015Id|~4PC\u0000TS\u001eO\u0013S!I)\u0011LF-YHN\f\r,-Sͼ,L\u001cC\\JZ\u0003qeX\u0005u\u001f/Xa\u0014sAK#\u001cRhk/ǹKi\bݘ\u0013+i\\:c\u0014P۸\u0006>:$;\rՙCЯUEݺؘr\u00131KŲ.U=[X0=L\u001bsie31҄}\u0000&ܦ=Lm\ba\u001aէ\u001c(P\u0013˴bQ568LPpj)2z\\\u0005zު~rCf\u0006CWhR9p041bŖ]@\u0006fj?\u001fn6X\u001f\u001ctyTBxFZ\u001eVD(jz\u0012\n\u0007z޿Za\u0005\u001d[C2,q-;Sӽ\u0011.\u0010Xw_ӯ\u0010\u001a+r\u0007y\u001bƾ4ԟƦ?,8PU?VME\u00004T54f+Gڶ.O\u001b*qt\r\u001b\u000eԗ\u0013jӪ4fd^)\u0003l\u0003Q\u0017\u0011\u0014\u0000\u0018H\u0014\u0015.𨨳<K~7c.\u0004eZj\u0019@.a\u0003Q2-5Y&%\u001cYC$6XX)\u0007\u000bKS옙mp9Rj{W>ŧLROTJEc9%އW*\u001fJH\u0010/R\u0006zY\u0006II\fIeǧ!E2Ų\u001f Ozۮ]e4\u001b\u001cz\u0012\u001a[\u0016[(D;R\u000br\u0012V@w\u001b{(MP$\u001e&\u001c\u00014\tml&3Ws6(\u000fOP<\b(-+\u0016ՙe\u0000w\u0001bﾟ|H\u001c3>9=6\u0000\u000bC~{\n\u00053e:ܷ'\u0017r\rYx*vĲi(e\tQ*HOџ(#Ԟ-zH\u0011\u0013)3J_.-i|\u0013,\t\u0006Dķ\u0011Pa\u0013%7hX4\u0001\u001d÷|h![e\t\\j^\u0002g,>`J-Z\\%\u0004Ş\u001e\u0007R_\u001ek˶<2C|Xc\"0˙#&\\\u001cP*7X=0Wi_Vk^r%9U/\u001cHv\tH\u0019Zҟ֖{\u0012sak#f.#KD\u0010A{WsK+U0eVB\u0012cC\u0003U`TJÿmN\t-3ȮC\u0005;n{Q= ˂yuY\u0013\"1xrM$\u0001W<l&\u001111%ueJ=KR\"fJvS\u0000\u000fx.\u000fq\u0011r@XD4\t7ftɆt\u0006^F%M)5a&I뭶ܡX6$9b\fi\"kM\u0016g|cHҠ\u0012w?O\u001cJWJ:֩j=L$\u001e'\"\u001eHCwDb\n/#B*]\u000bm7dj\u000ey&Bc'%2],\u001b{H\"-o?*S1\u0013\u001bE\u0012✳<\u000fykT\u0012e-$\r 9\u001b\u001fM \u0015݉'MӨ1Ͽ3z\f\u0017=+\f?#/1wFPwGF渠ѣ\u0002`c&Eקѣ\u0019)\rh=^8L3G=M=U6;ߞ >l\u001do:vu\u0007Zo@i>聝&\b\"U󇱣+\u0018\u001f\u001a\u001dտƎGjC%nxBp_4\u0018,tm;%KbHy;\u001a3#EW\u001bHa2s\u0017Lr`_6\u001c%L3dD\u0002r/\u0005\u001cʥ!໛Nc\"5\u001cmpT\u0001tKm9\u0005\u0018etst\u0010? \u001ciPTk4$#\r\b~ts4Q\u0000i\u001f!e9\n\\j\u0017`(u?\u001c=  ml\u0002wy9\u0006\u0006)\u0007\u0006O+G\u0005[\u001ac`\u0003)\\\r6rt:\u0017Li䨶o\u00158~ȑ\u0006˿1*\"Q\u0012\u0016O#G\nL3-J \u000eRz8z46/\u0013\u000f\u0017GP-!ڍ:{JQO\u001c%oVi8\rF\u0013ZAO\u0017Gply\u0018e\b\f^\u0015q\u0019\u0017Q\u0015\tAM)F+\"{nF\nx\u0016\u0002\u000fFZ5\u0007]\t6V'7Y\u001fRTxto\u001d\u001cMi7p(ݍY~M\u0018\u001b\u000fFҙFY!~B\"z7z<kyFL0o<e]`sL\n˼\u0011q(U 6od󌷴\u000fFA\u001f=A\u001f׽\u001b\tH\u0017Oṧy#/jW{6a\\\u0014wߞJEYo\bX<\u001f2\u0000:2lOFZ\u0003v\u0001LbY65t펻e\u0005\bm#$l\u0004Fildа7?ޟ\r\u000fieD\u0015-Y{\tc,\b<,\u001bai@\u00100;^1H?,Ap2zZxez)\u001f¤ʵ<ʒ/^\u001be\u00141޻/wwG\u001c'Dǖs2\n\b\u0017)AJAw1*#\u0006n\u0000\u0015\u0006vӏ޸FK~\u001a8\r@b2f\u0014\u0002\u00019\u0011\u000fcFǨC\u0012#)*!i\u001dӕ\u0006;>\u0018u8TS~1y\u000bs1\u0010><\u0018i\r7hCSu\u001bK\u0018m8\u0002]sah\b4\u0015rh\u0014%\u0001I{\u001c\u001a\u0006%Ŵ|ѡ,=ӘQQF5oPy\u001b31\"ӉBәQ<'`k\ba.gF6\u0001Bç3#eѦ\nT\u000eOF:iڰl\u00117h\u000fGX%x}5#HDG\u000e\u001eOf^OQ!\u00139{7k\u0005A\u0004\u0000aHa]C\nVMb\u0002ڣ\u00160\u0005\u001e\u001aL\u000fF)7V\u00111pmjrm4:\u001ad܀اk5\u001eoFś\u000e~-F\u001ad<:\u000b\u000fF*\u0002ywپnc$&gݽ1\u001c>\u0014V\u000eýQf+-gFP\bi\u001f`]Ɩ$c\u0017S^*c&5AJ\u0006K˼тk捊+\u0005\u0002U*n0:\n:I/ƕd>K[\u001awÏ\u0016\u000fgƛ\u001d\u0015#o!\r20`0`\fms.P1?\u0016HEB4WlޞW(\u0011>\u0014ǇV\u0001!0\\J\\C~މw~W(Q\u0016ᏈJBL`;\u00143\u000e;D\nm\b>\\\u0010aU\u001cZZ>D<CqmC\u0018\\\u001a\u0006|\r\u00064\f\u001bE&\u0002N;C8抷f!\"mBN\u0017lPz8\u0014\u0019z9\t3\u0019opKӏ04!$f׵\u0007m_X\u000eb\u000ei0-nA\u0018\u0010\f\u0002\u001f \"\u0013Sr`o>0Sɟ\u0019W]@\u0010Z s֘\u0001\bw\u0002fz\u0006,\u001aĔ\bh\bL\tw?rE\rY\u001a9tk\f\u001f\u001f:No?t\u0007\\*t\u0014|=OĜq_5 H\u000f>\u0000q\u001fM\u0006cCϧI\u001f58\u001e˛+\\%_Wi\u0007D\u000fH)@\u001e\u0001rp\u0003Kh\u0011ٕ\u001e\u0000\t=\u0004`J{ kŨZQ{8Q\u0016\fDӅӒ\u0016r\u000f{}߮xKPlᵩcGjmYmUiy2;Nw\f2\f49ʉ\u000f?;;QMf\rFoU@iZǇ~yթҶ\u001a>Or\u0007`x9\u0011HO\n\nE':mA*/t6@Zz\u00181XsJ\u00024\\\u0010>mdrje\"ǟ_\u001d=9\u0002e\\f\u0018\\(Ĭ_~\u001a!\bL\"\u0014˲CX\u001a\u0005Nz-\u0006Z[j!\fu\u0011R?\u0012e\\\u0010eUgl\u0018y~U\u001bx#\u001cB$c<tէC[E?([8z&ua\u0015;_kE=\u001aY7\u001akXcPih\"0Yjp/C5\u0016N\u001abg`\t١\u0013\u0010\u001c\u0016\"\u0010x\u0004\u0000O4@eF,N/TR\u0014\u001am\f2.#B\u001fW\u0003\u001ay\\^g\u0018io3;gp9ry_/s?\u00029=F|PB-,G\u001c\\q\u0002`\fw2o2vg5\f94%xl/2\u0010\u001cG\u0004`L %y\u001e;Ty[Q\u0005\u0011 <\u000e\"\u0006}yQu\r/i6\u0007a<Mƾ\u0000IMS\f\u0004^\u000fױ\u0018\n\u001faw,0dH9-0e\u000bt\u0007cR=.@k?\u000b\u0003XMʼPP]~_Rdz5LWY\fkӦ\u000b%щxz]\u0006!\u0011oC\u001a\u000bPŇeukEO\u0017=r碄LP\u0006P|v\u0002\u0001au1C[\u0005uV80\"M4>lW\\ᦵ>\\&Z}.\r\u0005u$\u0007\n}\u0019]\u0014S k}|\u0005˶S\u0005Fi~=Пe~=G\fYC\u001esY]uA/#+\u0006z/@X:\u001f\u001c\u000b\u0002\u0002r\"\u001er2\u0007>=d\f_m[T-iLe\tG%\u0012'4]\u0011\u0003tZ\nuBlo\u001eS\u0018O\u0004m\u0014˗0r\u0001xsUN\u00180R0Jc~.(i\u001381\u0018\u000exe\n=>xA]Vo\u000b{m>ԏo\u001cٗ\u0013?Ay\u000f'ʪhD.\u0014ݾ\u0013~8Cdt-Pʴl,\u001amȴfA\u0013lex\u001c_vJLm\u001f5\u0015>[\u0017ߢ|IrU~㹄'j_VK*~X\u0013pV\u0010m\tGi4KOI͊JMjtstK\r&I\u000f\u001bM/n(\u0014-\u0004__FH\u0010QQd!m\u001d/#\u0007\u001eԯ͍(kcӨ\\>ʨ\\1`TX\u0011\tԺ߹\u0014\u0001\u000eỦoH\u0018i\"2u7<\u0012\n\u000f\u000f\u0002e=T$\u001a\u0005q8Ӧ!\u001fJ\nPA\u000b'[(c_M3&ӿy\b3\u0011*~\n1@u'Y.\bLd˴\u0015\u0018r+{j%z9`\u0007\u001eF\u000f\u0005q\u0007!Y6\u001a[G}\u0002\u0004c|V!\u0016I/%M\u0017$0xc\n\u001f1pMcܳIlwZ\u0001*e&\u001fqm4S;&S\u0011V\bmAV\u0010h#Q\u0015#a\u0001&8jF)]0\b\u0016bzvj%qB`d\u0018\u001748{\u0010W-㦨Q>\u0002!}\nS\u0004vZ02.YMzZ_K|B2N\u0015ǴգhV\tZ`0q!@Pkj\u0018dBP\u0018d\u0006\u0004~\u000bN\u0015\u001f\u001f酛L\u000eά\r=\u0006}zR'N+ӵMޔ\u00147]>\f:~X@uB\bvh\u0019+[s{J_݈^ǍipS^ٕM%n\u0012\u000e\u0001G\u0012iw:z\\z;Q\u0005a7CgJ\n޺E3-^\n\u0000NU4v;'VZ\u0001Eg\u0005\u001f\bYse\u001cPl\u0012$-~\"XfΠ$ݺIPU#rR\u0015<FڰV\u0002#4~^9 ^tq\u0010{Kb;\t8\\D\u0015\\=\u0010\nJ$1T\b6\u0012KXV\u00055\u0002\u0018E.<\n\u001cN\u0004JcI$\u0011I\u001a\u0007i\\}bO+!\r\u0002\u0014vo*\u0011\u0001\u001b/H\fԺMpW\u00059O\bE{~^ú\u0000\u0001:\u0000wV0\u0005h\u0004\u0011M\u000b1\rt\u0007iA\t_JlC-qƮ\u001eu9\u0014\u0004JS[\u0007\u0003R\u0004\u0001I\u001d/\u001e\u0000\u0003\u0002\u00169\u0001vc\u0019S:\u0019j[\u001cˬ\u0006\u0015\u0011()\u0018F6\bl{|#F\u0001`Ru\u000bթN*\u000e1\u001a\t.vau\u0006\u001fկ\u0010)r\u0019\u0018[2XG\u000f;\fY0mLW\u000fiMގxT\u0016}zL]> +\u0007\u001b\u001b8\u0006\u001bbԧ\u001dh%\u0000ѣ$\u0007\t1rGʦqzPrLS\\mT[ҘV|R`\u0012\u0005Wa\u0016\u0011z\u0001vCX<\u0015Bs\u0019TayJ\u0011Sxߡz5IDt5\u001d.0ˮy Q[^mSK8&D>\u0013Df9(\b\u0011B\u0018w\u0014E'\u0001v\u0002\b&!hf\u000e7h@fa\u00008\rΝA\u000eg %A\u0018\u0002il\r~\u0005ؕP\u001bqt<B7`&tkShCx_r\u001c(z:zh\u0014brev6EONf/S;0\u0015\r*\u0006j2)cˁ\u0019_\u000e2\u0016pN^@e)C3>qT')@jEQ!\t\u0000}\\=#\u0019{t\u0001cZfIs!nSJv;\u0012/ݘU[8\u0006a?la\u0003\u001e9Y\tO\u001al\u0003]8āilեl] \u0019xdW\u001eH?\u0019|:\u001cN\u0007]x\u0017N&$֩Jӕ o\u001f\u0006}wMF+p/D^\u0007[[{vюT\u000f%M\u0016z ]ףz\r_zx[8~N}\u0006\u000b?q/\u001a\u0019,}x(\u000erF!U˘Mx?BӥGύJ\u0017\u001c>yu\u0002\u0015!͸-՚/N\u0010\u0015\u0017dax\u0018?Z>,@\u001c2\u001fWk\u0010\u000bEc]9G&|ީ\u0014\"Oxu\u001d\u001dr\u000b +!l=\u001c\u000f]O\"uy7F3EBk\u000bq\u0014K|\u0004R&JUi^H|\u001e*_?\u0015n(Lplo\u000eD=|8p10Q\u000eb喹1Wx1\u001d]k;m]CR\u0012@?z\u000e\u0017\u0006W#\u001a71\u00011,C\u001e2눣H{))\u0001e\b\u000fcSHUTx\u001b\u0010<\nL>{טX+kd\u000bV.\u0019\\\u000b4\u0017\u0000{X3S\b۷[KHc1xě($㙌@Ex4Nj\u0000\nm{\u0000G\u0014\u0001U,kpG\f|6\u001cD\u001f\u000fL,\b\u0007\u001cRft,VXpٍ\u001fM\u0000Ψ\u0005-\u001aJ$:\u0007\u0011;[\\Ӣ\u0014Cr\u000b\u0001v\u0012\u0017\u0016\u0018X'O\b\u0018[\u0015nS@սu\u000eAZ\u000f0uHvu\u000bO@$\u0006XOۘ\u0012eSB\u001e&Wq\n\u0013ɦ\u0002~Q9\u0001\u0017>\u0013)5K>̐2:>L5\u0006\u001a#\"\u001bGL\u0006{@T߆\u001eqŮ&4ӻ\u001b\u0012\u0001\u000bvѼcDW\u0001Ѡأ\u0016OTv\u001couت\u0012=\r\u0007M|%1\u0017Jxa\u000f>z(Iż3\u0005ܲ\u0017\u0002_\fYa\\>v\u0007]iqrkEӺe}\u0011]PT6|5f\u0016|Xֈ\u0013y3\rĆ\b\u0016uZDSf?\u0007GHر\u00047D!!e\\1\u0011\u0000=O;\u0014: \u0005u?V5Gv\u0018\u0007D˩;\u0017CrD\u000f\u0016`z\u0001\u0016_S\fpI޶ظ\u0017\rFڐ\rq*\u0015lu=JÌу zc|_P҂ meJ\f\u001f\u001bdf\f\u0013\u001dp\t\u0002~UIQlYPǏ\u0011{d}O덨g1S\u0013C>\",?\u001c\b@\u0000S\u001b\nF\u0006ez;\b:5wg9^\u00109\u001a\u001azlx\"?q=m㕮,W4Zp \u001dhROxj\u00007Əjgj&a\u0015wTo# \"1G\u0013nSkʏ=\u001dE\";tęU\u001a\u0017\u000eI\u001e+_\u0007Rn\u001e\u000bp\u0002H(gH5Gn\rVi@v=)@㭄\u001aF将\u0019`\"1vtw*XcrЬ\u001eWxIP/>厙\":VL\u0001r\u0003\u0001tvS'2$$\u0011/F/3qߚ\f`3`f\u0014]ˍ\u0017B\u00172l\u0010r%'w\u0007d8\u0011'آl\u0010պmar\\>&\u0001;\u001amjxM[bwMǱA<ށ\u00189ғU簖b\u00136Y)N#!\u000e\u0003(\u0018ؖp\u0017Iuח1.\u001bKESh>vtokLXpCˢ\u0003α=.Z\u0018F'vT|\u0006\b8䖂'[ȹ__7%\u00017:1B J4*\u001eWwj\u0014ԙɯsb5DZ5\u001caejq3tH\u0006{<\tGpH*n\u0019\b̠g\\٥\u001dE!SV3$\u0006\u0019\u0000)\u0005$WL\u0000\nj,y;b\u0016c }8\u0005$Jg\"f\u001bҹDpg0g:OM\u0015?*<\u0011\u001dC\n\u0012tg5⤄G]N1<ƾm3\u001cǁ}f\u0007yjRe2P3\u001bL$jh΋sƌ\u000eu\\Y;`\u001bӥ$\b\u001a\u0015\u00183Mr0-\u000bu8[9[|]|\u0005|\u0007d\u0019=ʢWc\u000eQїÁHwAP:DVK=lJ\u0016ӷ̈́H03S\u0005i\f;&pR~ǔ֨ZR\t#\u00143\u0000,*#p\u001c\u0007#\u001d4r4ezT`ٹ@i\u001eH\u001fޤDSo%SȽoe\fuٝc|T1ຓje\u001eXP;9Ѝ\"Y=b U@1dAg\u0006^\b$HG\u0005\nT9u\u001e\u0010S\u0004Rq\r2 D\u0015|{/4=\u0019HS:r?;}3fP%t\u0002ML1FrνֈF\u0003m'*5Z\u0000|n\u001d=-m\u0018~:\u0011Pn'*ӡz)滫jԞH\u001b.ڠ9g͞\u0016\u0002*\r*c\u0013{\u0004\u0012v|R#\u00062|\fL\u001eYs\u001e#Z8جY%75\u000b)^Dm\u001c\u0014ORw;\nP}N3iQr_G{\r՗ܑu֪3u%lμN5́dh.rnaBh\"E\u0004XW9c}mb~@\t\u0015-ﵺu'\u0001x;QM.\f\u0018ڹ]=\u0014c1IzJ&ϝ0I\u00111\\~C$qb\u000fX-\u001a2x\"m1TgZDFs?JHM,`UV\u0015~&hcٸ/mZ$2\"p!dȩ@\b[\t1޵}\u001a;A\u0015`\u0004\\YІxv\u001dn\u00043de\n\u0010&t6CN\fqh\u001d\u0013s8&\u001f=Kf0K^\u001bNQ1R(:Qs\\HFۊ\u0014rŉzEtèA03'h&*O cصP5¸Gq\u001davwy[\u001eZu^\u00036w-N/04\u0017Lnc$%H4Vp\bDV,\u0007!V\u0012;<kRᐉ\u0013Ȁ\u0011脐\u0010*'rcU%YS\u0006`;\u0011\u001bѢx`\u0004z\u0018^n91Y\u000b\u0002\u001ay}e\u0014Ќ:;d=gЋ=\n\u001fFmǈ\u001b\u0019PNۥ3*\u0016mzǑgХk\u00181ryة\u001e\u000e{1U!z,-D`D/Tc̘˹1K\u0010Kn\u000er\"\u0014\u001bJA\u0016櫛ƼI~;\u0004$)U4ma\u0018&5]P{\nc\u000e\u0019_0ݎP\u0004;\u0000\u0011a)\u0011r< Q<w\u001cQ&jt\u001b\u000b)\te<ͯX\"1\u0012ۦe\u001fo@.SI'\u001f5\u0019u_@DiܑƯ2k\u0013\u0006\u0013\rI\\.a-\u00045E--IXBx\u00107\r1RtiC\u00035j-%xJ\u0019x]+\u0002[\u001bKS7B\u0019QZJ[cg\u0003y>/%\u0006̎1\u0003:X7lYtvBZ.EJ&dsEM \u0019+Ae~\u001a\u001c݀QA\u000fj\u001aA\u0000G*>ݞX^\u0011Ѳ?CVTy\u0018h9;0h\"_\u0018?Y\u000e\u0017\u000bƁY\u0016'ѕ1\u0003 t\u001a{\u0011&=;\u0017\"FhD|z6~}l\u0006D=f1;׽Nz\u0007>g=~<\u0006ZG\u0005W\u0005uDy:\u00073x&\\\u001f.\u000eOF3t4\u001f\u0003\u0005vȭv\u0019\u001a[p\u001f\u001eYX\t6\u0001\u0016BݯG \u0015U7Oओa_\u001cO\tCƍ\u0007 \u0002'PgH5o\u0012o9\"\u000bMѭ{(\u001dpN{ٍ\u001e؁)#i\u0004䐅b(\rqc2SQ\r)\u0005\n\u0007\n3Pk6zx{\t@%\t\u0018S2\u001ee3N\tB\u0011\u0013e\u0018\u0002\u0007ʘd)\u000b\u001aOA\u0016\u0018P$DO?\u0018:o_\u001aP;G\u001c;Bpe1y\u0002R\u0010\u0015:e\u0002cK\u0019\u0010\u000bTr3\u0006f\u0004b4:+Q4p\u0010\u0016\b\u0012\u000eI\u0007b\u000f>2A\\cC(;q\u0004Bs<z\u0018\b3\u001ck\u001d:@wt[asC\u000fxj\u0017\u0019\r*\b1]yo~qj݈A#OW[tb9H2z\u0004u5\u001f\u001ex\u001fs۰c\u001a\u0003N/\tC\u0012\u0005S\u0016Ncs\u0019}\u00190`9,xס[\t\u000f*\b.R}\u00038\u001136\u0000\u001b)\u000ey/1\u0013Σ\u0000P~z\f\u0011\\\tVE!Pn\u0014J;m=H&\u0019S_[8\r|\u0002D\u0011\t̎\u0000\u001d<xzi\u001fc8\\\u0013V26 b-uNc6xW\u0007\u0015P@kz@e\u0001獹\u0005s\rd-\u000b\u0019\u0017j\u0001eDBKHo\\zLceyR\u000fEC<'O8x\"B>0N2BTEՓ4qlv0k\u0018bbL6C\u0001oe\u0001QWd\u000fviG/\u0005R¨4\u000e'WBsjBn\u0017IqhqH]#P\u0010\u0011]lc;S\u001a\u0001DFV.\u0015\u0002v)\u0001> R8^\u0004ELx3AIT\u001ewb\u0006m\u0014\u00011ZWJ6Ac%\u000e1}\u0005>,@\u0001/^\u0003F\u001f\u0018\u000bG\u0016a%\u0007Xfع\u0011\f2\u0000b5@nEA\u001e\u0003\u0019职՟\u001a05˯(}gȏҭ8Uў\u0003#to pS5LXT\u0004\u0010a\t09bm\u0013!\r[Y`^sr-y<PxI\"P\u0017[O5\t\u0011#\u0003IHq-\nL0\u0014Ȯ\"p$'&*%͞\u0001\u001b\u0014n\\-6\u0002=\r~0g>p$'=t\u0006*r<a\u00076\\œgÓ#8Ay\u0006`)¸\u0004g8nBoߏoI:Dc\r\u0002\u0004)Y[nt|:v\u001fi qq\u0019]ħ8s\u0002\b\u000f󢺹\u0014\u001aNsL\u0005HUe+az~%\u0010\u0004dddYS虢4\"p\t\u000f&׺X1\u00198(9\u0019m\u0016\u001e\u0007K5\t\u000en?A8Sb\u0010Ǣ1j\u000e`!?zP\u0017teB4%{Cn.YW\u0014pX(-\u0016'L3Sz\nr:ïd\be5ۈN>eDtZy`E\u001b%\u0016uȶ\u0013\u0014\tT}\u0002A<6\u0018<\u0015\u001b\u0011<\u000154]\u000e\u0002\u0000\u0004FA\u0007YF͔\nY)qw\u000bd\u0007r\u0004nqh57 ij-/ROU\u001en+xIU\u001e\u0010\bJ\u0013\u001fQ\u001fsu\u0017\u001f\u0003\u001eq\"4(\u0000lJ:ɞ\u0010\u0016s~I\u001dA\u0003DHSP*W\t&\u00059\u001di~K]\fhi0Y\n?;\u000eeF\\ \u0012Shn\u0005\u0014ZD:\u0017-\u00023^Bo@\u001edT \u0011{6O(};g\u0019VH81&\u0005\u0019\u00119\u0019B\u0016K$LCB_M/\u0010NwŴ3\u000fѕ\t+\u0010\u0019;\u000fk+\u0016z1P>cL\u0001J\u0004V\u0015\fASPgw  ~\u001d\ben\u0003hd\u0004}ߋTMHu\u0019\"і\u0014%XV\rѪdEJ\u0001\u0013\u001eWq5'_\r)s5V$c\u001a]fL\u000em!R=Cz($h\n}\u0018RtX1^\u00136\u0014MH5RĊ\"Fl\u0003\u0007\"\u0006i<Njd\u0000o*\u0018S\"wP\u0007:;6\u001b}jrPx\u001fՐ`\u0015;u[e5Ɇ\u0007jk/q`$<n\u0006d!\"p\u0006\u0019t#\u0006&\\iz\u00148s局B:e%!Nq\t9x:G='mKsLg譖r4iJeiID\u0013/,V~R\u0006CHt\u001e\u0016\u0018,Ry|ٖ;wP\u0000ꜙquPosCOI鯙\\n<\u001c\u000fYԤj3{CLeu\ru59a\"z\b\u0006[0X0RAHY۳.E\u0002Qh$n5 \u001a\bĂ}|G~޾&(/CD\u0000=ZA\u0006:Nk8\u0010=Ag1\u001cY]\u0003UCN'us\u0013oVN@cB=X\u0002AG\u0015%G˘`(DI\u001e\\ٱ$j\"\u0010\u001dG74RAMAA9\u0013,T~o3d=go\u001cU\u001a:\u001b\"\u001f]'<R\u0005!!e;PJ\u0015ݎ0qx\u0011P=\": <Y@\u0019$b]w\u0003 Dh\u0019\u0005\u0016ipk$\u0015E\u0000\u0015x\tc/7Գ6\u0001g\u0000 \u0019뗊\u001e\u0005\u0006\u0001\u0004qyw}\u00188#v\u0014e<\u001f.%_\u001el>41^y裈S\u000b\u000epqO\u0002~3@S\u001d!\u0011ŗ12Ĥ3NK\u0015a\u0016\u0000\t\u000bXAM\b9P>\u0002삪\u001cF\u0019^K<y\t\bԅCΚHIâ4sG&2\u0010?0([MY\u0004r2Px\t:j@Еc\u0016r綟\u0011Gk@4v7\np0-y\u00026>;`E\u0016C\u0016_\u00148\u0007ˎ\u001d^?\"F\u000fP\u0018Y[ԯy\\\u001c{9Oa*!#QlR2t?{\by}\u001b\u001fݐL\u0007:\tc{R0\u0001?Y<\u0015\u0018b+\u0018)5^\u0014+\u0016Jv&\u0010v[Z\u0019{8N\u0013K?Ty+,H\n\u0002\u0006\u0018\bvʯ4El0v\u0011nx5Hg:[uz@WG]W̴\u0015Yg\u0014=^4L(@vZjiU5D\u0002gDv\n8+P/p'\t\u0005~\u0004*L\u0002\u0016J\u0005Y\f?*v`+d\u001e75˷\u0001xꊈ\u0003\u001cH\u0000iaAѿ`\"aD\\Az\u0012t@\u0013\u001c\\\u0001>LJMI\u001b\u0003\u000eW\u0010T\u001bI8UȎ%E\u001aS\u0017H&=|\u0016\u0016se ΋\u0003\u000et\u001a\u0002c\u0007#\u0007j>\u00154\u0004JFw\\sy5x{xw\u0001楠\u0014LD\u0002\u0003\u001bG\"\u00114\u001dB}\u0017cr\b{LA[}G&\u0013an,\t\u0007̩LUD\u000eEc\"G\u0011R48Ù7\"\r\u001alFv\u0001}\u0001J_{Y\u001f[\u001eֳlH-\u0019\f\u0017\bqD\t\u000f\u0005h9\tE\rq\u0016ԛ\b\u0012\fx0-g\tOX{Uഛr\u001cO~PIЃK\u0007R\u0012<\u001c)\u0005\u0014Z;rp[\r\u0003,\u0006ؠk,uu:  ?\u000eTUb\u000evLE\u001cE\u0000W*\u001dH\u0016\fSHU\u0000R?]lc/\u0013I;\u001c\f;;\nڰscOQelޏ\u000ep3Ԓ\u0017>)j7\u000b\u001d\u0010(U9:\r}Ḷ\\{\t \u001c#L:gI\u0006\u0007\u001d5#\u0000!\u001a>&y7W\u0018a\u001f\u0010\rI\u000eV\u0007j\r\t2>\u0012@*\u001f\u0016\u0014͍\u0014-(V\b/p\u0003\u0012)5\u0004~D<K\u001a=Z\u0004p 9<F\u0007`u*Lo\u0001\u0014s03\u0006JtHG \u0004ݐ@pYnwGɹ`W0\ni垰,gb n\u001e\u000f\u0002}>TQg\u0003BrmiVC:-\t#]5Ԫ@,ߴP\u001e\u001a7\u0004|\u0010v\u0014@\u001a>d`mzsCJ\u0011jw@Zc`\u0000'*\u0014\u0006lr\u0004i8Eq&,/43\b\\Hkݠ\u00061\u0002f\u001b-v\u0005\u0016R+N.X4\u0005\n#\u0012ś\u001c7\u0007\u0011\u000f Tmfx\nγ.Q[8.\\BeI\u0017\u000eј׮=q\u0002P%\t#\u0000#bWbUm\u0001\u001atԠ\fƷC\u0004x;U\u000bȗah \nL\u0001ܹQr;8%9MH\u0010e\u0012\u001f U6/_*\">\u0014\",x\u0003]jՑn7\u00119AeQ\u0016\u0011\u0001@\u00115jO;G\u0011J~?j\u001d\fIh1jsFA\bա:^$mTR\f12N$-t\u0006\u0016;(\u000f;?\u0002\u0018]H\u0011Mٔ!\bl658Иҡ\u0007\u000bPSdRϮ\u0018qdDMb:\u0013r\r@)OVib34t+\u00060`[+z:y**mh4Vzg[\b\u001fBjR-՘!\u0016)T\r1\u0011ԉU\u001bq\u0002\u0002\u0011r0 \r\u001dJH~\fQ,\u0001.~\u001f\u0013۬>\u001f\u0011f@3\u0005\u001f^{l1$uttS\u001f\u0018\\]zcxyŌ\u0001m\fs@~H2sJa>jG4m*\rJˌ漞Gq;;&*V,\u0015\u000eyko+fR1n7C_\bn׌Ǯ,M93`MC\u0002f\u0011\u0016f-ZzSi\u001fd1b0\u0004\u0013H\u0007\u0018@\u0012\u0015\u0002z̕*5)\u0011AOvk;a#!RG\u0010VGTUދ$\u0003AE\u0002[\u0000@P~oDH\u000eЩ\u0005d!X6-Q\u001d5\u00163Q~֖&\"hҿK`ƛtr7\u00071\u000bb8ߡZɊp굁;pk;6'jC\n`c\u0014=.\u00016Z4Mc&?\u0011`k-o\u0018#F+o\u001fd L\u000e[L%<>u|sZ\u0011WlX\u001d+\u0016\u001dw{\u001a\u0001k\t\u0012uS]\\'NGT\u0002Ha*MW>\u0013CDΛ0M|i\u0007̪O\u00112/\\9,zL\u001cc\r}P<\u0005<\u001fMs\u00165J7%\u0013\u00124)N\u0001Vu\"fM<Zc';u\u001fr~HaZ(t)Y\u000f!.z\n!\u0010\u0017\u001fC,)%9\u0000QV\u0004sN\u0012!˥\u0005byzK5m&gc+/qX^yrQ\u000f5\u001bj\\zA;\u001e/moK#\u001d%\\!=\u0012xv1Fh<,.VS\f;~ϳ\">=\u0017=\fbDDFXy1\n\u000e=?$zNt[̛\"[Bk\u001843\\bK\"OI;17c'JLעJ5Ci\rA9gN3 -Ý=H_Pa_<\u0004*ɺ\u001b/e8V{x\u001f\rd>IT\u000b\u0011?%\u001e\u0002\u0018ڠ\u001b\u0010\u0005/\u0012\u001d%^wQ<gXR\u0018IӍl\u0007bJvK\u0013ʹHj`j8ǭ;cYɈUlfZU\t\u001a߈_F$-$I\u0005e\"K2|\u0003m\u0010an^~Ѽ\"\"\u000eie\u0005\u0011!\t-ۿd\u001br_r_5\u0018`w\u000e]\u000e\u0007)i͚%ߓ-c+$CH\t'\u0014P\u000b*ȍ\u000b\"ŰfvSI\u00161ms\u000fb\u0000E-\"~\u0000h\u0014|*NV%QF5\r\tga޷KpA2N\u000ekN܆O^L+))F\u0015'\u0002\u001e\u001eۆs\u0013YѰkeN\u0003.ui%RStP\u0002?\u001d/z\u001eB7A5\u001a瑤0y/!OG*\u0000]$\u0013\u000e\u00179_dbl\u0019@٦\u0002o'Q,,̴CF\u0016Tŉ\u000bFN4\u001eX\u001a=\fS4pl݉:\u000b>I)mJw\u000f\u0012J<\u0016^\bE\u0017l.<B衝1Yb\tj__D,Ԓ_\u001fS!Yf\u0019\u000b\u0017>5|.E!!7ܠhPTUUuS\u0000J$\u001b\u0000x|ʔ!k\u0014.r?#V]=5\nKܟ\u001dU\u0011{Hx$]\u0011[;\u0003#\u001b\u0001\u000f}19N\b,h\u000e\u001bKU\u0017v΂-\u0004<'+_3LV\u0013\u001aԢ\u0004W`ysW5w\u001bU(hۈLp\u0011\u0003t\u001ef\u0000\u0011\u0001Nt\u000fO}\u0007mg$)DI,\u000e\u0011\u000b$,&fH@N\fvO\u0011V>\u0014\u0010M;̄pW\u0003!.\\A.2[4FO\u001c y%\u0003\u0015x|iD\u00051|_[\u0006U17\u001bP\u0015\u001e!LW\u001blQ'n\"_mae.\u0015c|\u000b\u0012\u000bx\f\u0016WDz\u0003!%Q\u001f0iP->lʑU\u001d\t\u0017l.\u0004ٱa\\ψ+QZr\u00021r\u0000˩@Vd\r١\u00159,\u0003\u0017Vy\u0000eHt\u0007UnKv*nh!6EV\b\u001b%Іm+i\u000ei\u0007g\\\u0002\"/?|0qmޒ\\QRmC\u001ao8o\u0000hNi'l\u001aOX\u0015p5D\u0012-\u0012JX&v\u001f;\u001e=\u0007\u0004O\u0002JU1\n\\Jљa2ȏ4yu[\u0011b\u001ao܎|\u0007ov+Otnr\u000f46w/t\u001dh}?'Eֶh\u0010wu龻H\u001a\u0015\u0015\u0003kv\f\u001f{#6X\u0019HPy}w\u0010>\u0014@cz@<\u0017\u0010\u0018>\u0010 jB\u001bwA\t\u0012\u0005\u0004$ыԛWVfؗ\u0011d$o\\DN!s tl؉\u0013Io/R$/#\nz9#a#IHFI?SW0T+&Ml`\njCsBD>\"Y>!OIΛ\u0014\u0019Qw;\u0016r3ߏ\u0011o\tVvBi\\H+\u0010W0>!3Q`\u0015Et+D\u0017&SA%94#Y`\u0000IXb(Nw\u0010(Wz>!\u00003,\u0015\u001e\u0001Cy\u001b2b8\u000e|!\u0003\u00031\u0006y\u0004ce\u0018v\u001ebӲ))IƟ^jڎU9;Ϣ{\u001d\u000e'i\u0017LV@VqM$\f@&1joש&sE\"b\u001c\u0002w<@^{tZ\u0003\u001b^'7#}xd,t\u0003\u0018fOT2{\u0018<C\u000fd`x%&`%`&9\u0015g\u0017Dg\u0015\u0014\u0010k]g}F%eQg`\u0007~Ny\\\u00148}ɄW:Ϝ9t\u0001M\u0017d\u001cD\u0014D-67H\n|q_N^\u000fJ$o\u000b6^(]\u0018\u0018i/PcP\u0006\u001dr[3\u0000-\n&\u0006o\u0016\t\u0002; }m\u001d_o6\u001dXk\u001fE\u0003OEC\u0000\u0014T\u0018\u0004Xb\u001f\"\fX\u0004\u000et@Ow!\u0012?X;'\rLzS^\u0002Ö'Q%\"1wI+\u0010s58pЭ֤\u001f`\n\u0000 \u0019of\u001aU\u0010\u0012fޫɸz'`[\u0015vYw&E\u001d.C@Kq\u000b\u000f\u001a{ @\f\fSb\u0014m}\u000e&=C@\u0019\u0014\f#M\u0015\u0006\u0002{FxT,|o}X/(\u0005F\nv\u000fsJVK\u0005sJqu\r,cY.\u0013,\u001b\u0005P'FKsj\u0001bG(zwVvP+\u0001`Q\rd1mKG֮iKLmҥҝ)ntÃ!)$Q\u001bR\u0007uJ%\u0001G2Y5Tu7V\\9}F<\u0015~IGS\t4joJk_X]$G{$?=!隋0}Rz1R *\u001dz\u001ezGq$&\u000bR!\u0003gn\u001bi\u0001a\u0007Q2<\u0000EH]\u001bUpZe\u0017K{׼y\u0013nܨXI=+/F%֋B2ۛlE0e\u001dIx\b\u00054\u00140?\u001cQU!\u0019\u000fݲK\u001fw(`\u0017݆ŭ]N\u000e;/emR#f`,%\u000f'*Q\u000e:\u001bCR\u000f%4;nw\u000bx\nHÀ56\u001b$$C83Pc\n*΀D\u000e1jprkZi\r<M7\u0016\u0017%\\\u0018X\u001a\f\u001ám8b\"qGDO-wq{\u0005\u0015F\u001e8|9Pa&/%P\\F#\u001cxW\u0013]\bE!\u000e\u0006\u001exj@\u001eג\u0004S\\ش\u0004\u001fV7*L@\u0000/,\u0003c{UO+\bS-;\u001a4Jo\u0000\u0005J^\u0015\r>RbC7\u0018/D{WS\rc+if+&viF\r\ne\u000b\nN\u0019ҍ\u0004\u001c(kX\u0002#+\u0006n3\u00176I'uHfl\u0016}d$XH}h(\u0007\u0016\u001e;\u0017DyQnr\u000f\u0007f\u0002'#\u0007),fM\bNy\u001f\u000bCF\tۻx-Ͳr\u0018LAE.Wg\"|\u0012lJ\bvuK\u0012 cF\u0004\u001a>Wr\u001e\n\u0001Y<d+Y\bx\u000bc\u000eۀl=\u001b\u0012a=q{1=\u0016j\u0012LU;QxL880aQڃH\u0012P'{/\"vroY\u0016!c&;\u001c\u0003\u0014\u000eȂP\u0014P\u001a\u0019\u0017M)x\u0017\u001a:D\u0016\f'[!2-S$DM}JD?I\u0014usP}'`?{^AkX6_\u0011[0c\rY=4EbŒw\u001f#RBpER%\"BH\u0012?xmB\u001bo{0Kd\u0014JU9k\t{3\bxRrI\n\"K<xBQYi]\u0012yWD\\,xx65t-ք(\u001b`\r$ٱEpԨLTGl\fo\u000eI\")\u001bNcm&\"vKqt(\u0016\fD\u0014\u0003IU*9P \u0004J\\P(^\u0000\u0005Eǐw\u0000[z<\u0019\b|8ѕ7<\u0007ƈ-\u001f;+>`2\u0010?v֙ JQ\u001fڤʽ%}\u0000v0OJ\u0013\" CGY`a?`;dji1\u0004[+\fiF\\;\u001f.H\u001eS\u00143k\t¶\\M8G*:]rZ^TW!\u0012rf:_+\u0010L$(\u0006Kd\u0016\u001ea@p{\u0013vVi^\u00074\u0003\\.\u000e`w;[@[5LK|8\u0012`5ԯ/\u001fг{\\v'w!}\u0001\u0011\u001e\u001b >_狼y]2O=\u0019t\u0012a$\f;\u0006$\u001b\u001e\u0012-X452\u0002jX~Ä\bP)\u0006[̈y\t\u0013\u001eiͨ'\tt՛\u001fQ\u0006\u0013%qWxO2m\u001eٰRU*\r0ld(=(qs\u0011!Pu|\u0005Z\u0019\tZ`Q\fHK8\u0012\r\u001ae剪n\u0011!\u0000\u0003us U%\u0006\"x/<irׇF9@&>\u001e\u0017H0\u0004&.\u0002,<[°^yW\u0011m\u0010FV0#={T$KR[^o*%Ǥ-L^Z{\u0015n\u0010®fPR0P-A,\u0010x\u0019\u001eyf\bԍpLɸ6@\u0018jq/\u0003\b乢6\u0005\u0005\u001eC9i@R'l׋\u001d\u0003&*U\u001b\t*oc\u001f\u000b3]֠\u0010a\n\u001cJ\u001b\u0000Y\u0003\\\u0017,5h#4j\u0013`-5芤fyI{*\"\u0011ʄ6\u001d)Wy&K\u0016\u001d,lWǹvnB\tL\u001aJ\\92\u000f\rZL_\u000fD\u000emnd6f\u0011nl;ĵ&i)@т}FXF\u0014)\u001f\u00169ms.sf\rf!\u0006*Y\u0007gE~*\u0005\u0004nv??,ݺ\u0004I\u001b\u0007.^v3\u0010T\u0016ba1oE%d\u0011&ru\u0003w\u0011|ZgK#*݈|eׇ)5u\u0000$;1 \u001d[7T!;(\u0006\u000b\r\u000f\"\u0005K(\u0017\u0000w\u0012V,\b\u0017V88m4Lk\u001dIğf* %\u0014`\r\u0018Zn਼8 7C-(,\fxN,\u001bƐN\u000bS\u0001=0s0\u0001GIϡ95\u0002QqU\u000e\u000f\u0015xOƭ\u0001\fWPyc?:%@Z^¤T\f[M\b\u000fk\u0016zeE\u000e\b:ڔ2\u0014q,\u001a 5m=t\u0019I؆\u0019ӗDE\u001c_\nh\u0002^&\u0014sU}1E\u000es\u001dA 3Yٕ^F^\u0014I\u0018©K\u0010:h\u0017d\rl\\fsm\u0015CS<O\t'q2Ū`uk[v\u0011pG\u0012eBc\u001eBr82sђ*\u001e{UR@&?ƝJj\u0001\u001bW,=S{d =\"C\u0017e\u0006 9-; c\u0019=\u0004f{R/&hp\u0017eC'?o)W(1A\u0010\u0003߶A_=`)˷\u0016\"~jj?\u001fɅ\u001e ֟\u0017\u0019!\u00166\u0004؄\u001c|R@t8n{\u0002ٳPQuva\b s\fCD\u0005J^`z0P f\u0019MQ][(ˏ\u0004cCYk\u0016,gцtPu\"\u0011{\u0015ͫ|Z)MW̖f\u0011Z\u000fx?\u001c\u001a`d\u0001TӉd]zP\u001fȗ]f\u0013<\u001e\u000e\u0017ZI\u001eYR\u001eQjVL)\u0018\u0002\u0019v\fHu\u0017\u001bu\u0004L(N2Mד\u0017r\u0011\u001byN-}\u0013wE-ʓ\u001d\u001bHd\u0015$'\f\u000eƮɊU\u000b\u000f^zˑ\u001dB\u0019mcWio_TƘ xl\u0002\u0014\u000e]c\u0013Er=\fu]\u0018g,ow\u0002\u001cMHCx.෱q/\u001dnUa)\u0001.ʐ*\\h/\u0005Rd\u0007aK~Q)7)YAyV43yW;Ȼ\u0003~rʧ.\u0012F/;H\u0017nb'\u0014kȝ\u0013@\"*,Y#5\u001aXv-Фn$0*3O\u0017K\u00114\u001c\u000egw\u0004+o\u000fU\u000e{fC\u001e_aXLE@O`6Za\",3\n)BbwLY52#e4O1IbA\u001c\u000b]Ya\u000b121\u0002\u001d 2\u001cR5G1HMOIaI\u0011\u00159Y7\u0005gr\u0003])x_\u0010C\u0005Y3\u000b*8{ƶE\u0001w%4\u000fDh!\u0011\u0019,Lvq`)Jv݆*Ud0H\u0016@h\u000f\bEօ#\\p\u0000!rE-wĎыQ9\u0005*_sHPmt%w\u0019LPWuE쯰<a/O\t?P{Жg S\u001ddޢUofxWh#@*vЩ\u001b`7v9g\t͞;@&]MAdZ=l&8Y\rIPG,Nm*E\u001eG`\u000eBAT^\u001d6EV*\u001a݉\u001eSgX\u0018RKce\u0019~8\u0018K\u000b)07Kcyqv\r\u0002t+TH\tGr֜ x\u001d\tܢ\u001ec\u0006ir\u001a6d\u00075ò)\u000e4fut\u0006/͒H\u0018\u0002U\u001d\bu\u0003\u000fȃo+L\u0001Ok< V\u001c\u0010xVkT.0Ȟ\u001b\u0019|\u001fίOZ$\t!\u0000zЩ&\u001dN݋j5\u00190,]fAxEn\u0010xFvM`avz9$\f)R|Mz<r,գ7\u0001h\u001dzWqC\u0006\u001erb#W^\"eZ2(\u001cݦqk*\u000eUЂw\u0010L\u0001=FC3Efp\u0018:j\u0000:H\u001ao\"\u001b&R*\u0010q%5ث<ԹFƉ#ԥ:}\u0001$\f$\faE\u001a\u0011\u0003;%YmfHJn_0|\u001be'O\u0016\u0002uܮ\u0002Ny}\u0005'~(YU\u0012Ѷ\u0016\u0013InB+\u000b#<!\u001aR=lgC\tT2'b+tE&Q\u0011iP\u00138\u001b\u0010\u0012%s9)=f6]@(ͯU%\u0007\u001e\u000fP\u0018[lo\u0003K&\"]zĶ{F\u0015_8\u0011\u0003T\n7\u0002v\u001fz9\tW\u0002\\IKR1`(MIVOR\r\u001d\u0014\u000f=\"3\rAE\"O\u001fN$'+\u0006p\u000f\\l}Tkw{R8<\u0015rRi\\7ڮ8\"]\\mnn~\r\u001c2N5e\u0016/W\nD7\u0012&W\u0016\u0016\u000bo\u001d\u0003\u0001\u00143\u0019{\u0013\t7<kt+\u0016(\u0017\u001f]Am0T0U\u00127++P`1|hJ\u0011?5uqP\u000eU07Āqo27F\u0012ӭ\u000fh=@\u0002͢葧8{yGŞj\u0012EvO<$51\u0003vEn2\u0005Z\u0000YH\tz&eL\u001eMڵgC)Wee\fW\u0002;\u00077Z(kcJxOHO]v\u001b)Z[\u0004E0nB8=Bʌ\u0014\u001cK~aJڔ*8kj鹧]W1\u001cI0iH}RrHB\u0018GW+Rȗe|$%(T\u0005a\u0019\u0014:F\u0002R\u0018\u00110A\u0011r\u001d!H)-\u0014ڎ0V>\u000em\n\u001b*op]MA\u0003}@\u001e0\u0016lǫ\u0013ȴC\u0005\u001eRb\u000e\u0003\u0004NLX\\k\u0014\u0012e\u0011m#\u0010pmf]\u0017݌,0\u001e2={0\u00145q\u001c1p\u0004(O1FP\fjVH>4h\u00181AӺz${\u0016\u001f\u000e\u0007̈́Di\u0016+\u0012ͧd%Qe\u0015<Yv!\u0012๲^B\u000fi+\u000f\bfI\u0010V\u000fMB\u0007Y燴%ڧ/CyRNV\u001d`&tu\fjZċ\\O$\u0016^`GA;\u0004.!)S(`i~~\u0011o'F\u0007DX6]\u0006`dWQuV&\u001f{\"Kx&zH{\"dSV\t\u0006I\n0fȅ\u001csYW@(q\u001b9p k_qY\f\u0011o\u0012\u001d\u0018s);gO4m!\u0012\u0000hNEQ+4D^䓱҉ K`rM\u00033\u0019\u0000\u0019\u0007}\ny|d>/\u0012-`\u001e1lUS\u0017\u0016\te\tuL\n\u0015\u001fzP:Dz\\-?tKȒZ9YL)5\u001as\u0006Fgm\u0000F)w\u00034\r\u0000,E\u001e\u001c=RJL3\u000ePv\u001a1~\u0017\u0012(\u0014O޹tv2\u000b\u0004`T\u001et'* \\h\u0007~\u0007~\u0006) 2\u001fZ\u000fMk)\u000b\u0002zH5Q\u0018610$X-ZQ\u0001ZH9\u0010\u001d-\u001eTgeƳ\u0003z\u0016m\u0007FW\u0004\u0004r\u0003zJ\n(\bG\u000e7 0\u001a\u000b0|\f\"^Ԕdr\r\nendstream\rendobj\r55 0 obj\r<</Length 65536>>stream\r\nd\u0013G+B9j\u000fg$y\u0015\u0019r\u001fy*\u001bzu'dui:H\u0005<KR1ֈZk\\-\u0000TRxs\f/\u0019/IY;/\fv̏TpCk}pP̥$(P.5\u0004\u0012f~I\u0016pQB1D**vgS\u0011_ѳ\u001e\u0010cgO~_/~÷o~˟/T_7\u000f~o\u001fۿo~O~?{s\"?>SHLo\u001a\bSUu\u001f\r-\u0000#cH;\u000f\f҆oS(!JM\u00013D\u0012\u001f<TB-M\u0011t~\u001a<\"\u0016\u0016\u001d\u0000\u001aLX*ƞp|=\nw\n*/\u0014ל.9-JPA^doҩZF\u001b\u001e\"j\rE?\t\u001di\b\u000f\u001c\u0002;\u0013wSo:\u001aY:ziWO\u000b7Pao-[nrOC\u001d|<q\u000bh.C -\u0017^ok۫*#§l`\fKf]\u0005i\u0015JЪ\u0013hcA\u00195w+Ρȴhn\u001f(p̐ʫfT\u0004\rGՁ<^9y\"֓|?I~\\Λ0\u0007\u0004\u000b\u0007\u00129S>_A6N@\nQ\u001a$*Uā5ƻ=\u001bE*f\u000fvA\u00188zzǍx=*\u0000\u0013\u0015G\u001e+k\n\u0017\u0019!(\u0019mZGXozQBU2Mb&<e\u001861\t\u001c-(G\u000bl\u001f\t\t̝L\u0003\fv\u0003\"\u0015?-%Mq\u000e\u0018aM,QRv\u000b2mE,`\u0004\u0000I'g͖W\u0010|\n}G_>n\u001f2c\u000f\t|-Kr\u000e<\"{\u00032$nϗ|C\u0010U%,D/ۭO\u001b,~7]\f\rgJ\u0000J@޺gQ(\u0002\u000f\u0016a\u0003T[{)\u001ev]:7Y\fh8<J&o(} nW\u0016Oa(\u0005ʟU&ND|{$\u0001e<(Q鋀\u0012fJĆ\u001dv\u0018xQm\u000b\u0007#slv3@Em66(#\u001fHXN\\ݚK\b~2\u000214U\u0001޳^\u001cBa\u001d\u0000\u0013>ZVh>  ;\u000e^[^c8`֖S4n)[\u0013F8\u0015$\u0015\u0010\u0001ה\u000b\u001dz\bA<o9\u001b_˳i2s]KPv^AZE8\u001eF0~Ѝ(SH;4\u001bE\u0001Na%Σ\u0005;\u0015^\u001d\u001c+6W3M+E\u0015f\u000e6DʪFzJH\na\u0010\u001f=y<\u0010C!Jv\u0005 zSΞ#kv7\u000bW6\u0001J\u0017c~#(<D8X]]5*\u000e )$_D\u0003v\u0003bq/+>jw+Y1f%l`Y\u000fxL$k\u0017\u0012쉥\u0016d!쏷*)^^\u0000[7/׳ڴ8~ qZ\u000b\u0018B7/V\u000fx\u0002?`W\u001f/\u001f\u0014a\u001d\nRZ/\u0016\u0019[]IE\u0002J\u00173QC\u0007Q\u000fx./RRF\u0000-\r|ombmŶ\u0011\u001c\"gc\u0011CĬ\bu\u000e\u0003f}\u001ezi*\u0013\u001cbXY\u0012\u0016?r݈$\\!pY=\u0016=RnO\u0019/Ba=\u0012.QZ$P\nj\u0019\u001chWNu\u001f+^\u0001L}\fg-CA\u00181\u0015~L鴲i\u0011o\u0012\u001a\bu\u001ahJ\\\u0007Y͢/j/VDXD\u0016G\u000e\u0012\u001e\u0005k0eց5^\u000ek\u0012=akh\u0000;\u0006\u0001\u001ciԥJ̼T6\n6\u0010/&L)X\u0000)~ie\u001bPKQJ<${\u001f\u0013\u0004R\u0017^7N\u0011Cw! ǟg߁Y\n%Um0[U}2\u001f!\u0010f\u0006@v8;*{-\u00197ʟ5iD\u000490Z葪x&\u001c?lu\u0019\u0011\u0003E\\$ׄvdoW\u0015QLC#9yJ﬇vj\u0004\u0014n\u001f*گ\tVi^/\u0016c\u0011Z\u0019\u0019\"gNRChVl8\u001bP\u0017\n\nڀ~y0B͌]Rz$\u0013\u00174p\u0011c\r\b]oY9`\u0015.B޻5\"))#\u001eY½#\u0012\"lnv\u0006omڦT!w!vN>\u0006 5h\u0012\u0013\thWl\u0002Ͽe޷c\u0007h\u0014\bI@T\u001bn\u001a__`\tL\u0002\u0019=vP(%0\u00008\u0003@Je\u0010[ѫ\u00161`\u0017\u000eL\u0001\u0002t˧7n\u001d\u0015\u000bQ\u001fi;_@`\u0016`9fv\u000e\\8Jxތ\u000fn~VYcgj˕u\u0011^\u000ep̠xП\u001dyU\f0pKZ1RSE\u0019K.(b^~54)\nTd\u0012\u0019\u0001\u0000PFBZ\n\u001bYoR\u00026ja#aATc\u0005#\u0019M\t\bNB9]Lwׁ½\u0007\u001aT5ѐ\u000e{ѫS\u0011%:\r7ٕI$\t\u0015P\u0007ZuE~L\u001c5\u0015\u001aYDbBZ\u001fi *(ʐ\u0003M\u00182\u00148O3Ti#m\u0015R\u0012L.\u000bՊ9Pj}Cg\u0003T\t\u000bȐc!n$g\u0006jML{'9M\u0014Nʉ\u0015[ݪ:,[hoEQL\u0012yO\u0011ZD\u0013\u001eM\u0005~\u0004\u0010\u001e(מЯ\u0000k!\u00016E;G[Cj(#\u001c6R\\\u001a#\u000e\n\".}Rh,LfK%.j^4@\u0015G5xvZ\u0007ZM|E@kkycHѴ\"\u0015@\r\u001f&\"\u001f~V)<X|?\u0015c\neN\u0018W\u0007\u001c\u0003-\u001f\u000f^@[sXM|;NUBYUQ駐D\u001duu >;巁l\u0006,\u00154~v1\u001d#->\u0003L\rx5&:\n4x-jE\u0000%s.@8ߋg&K[|\u0005@B\u0016Nsaub\u0015Ă^lSmhe\u0005]UQb\u0000%8t<\u0004x\\\u001b\u0013|i.4\\K\u0010\u0012\u0007RV\\XS\u0012^p^\u0018I2PvԈe\fJ\u0017ĭՎz=+2YX\u000eͺvY\u0001A492nQk{:Rgs*\u0014:]z4`I;\u0011Ft2SS0\u0019Y\u00112wT\tB[4>&%\u001d h\u001asȉ\u001cH}4D4\u001c6[|\rJ{l\u0012v\fi9\u0012l\u0014XEo\u0013t!`M}wᑂS|\u001b\b_p?oBODG̼\\ϼځ}%D\u0007\u0018&\u0012UZC{-(jsm\u0013a\u001d<\u0018oO\u0012\u00060IT\u000eGDnbyfcf!\u001d\u0013\u0015+&fT\u0004\u0002\u0017%\u0015\u0007\u0017F5pez##\u0014pa\u0005\u000eOV*~Ni\\4z\u000eSU\u0012\u000efe9`צ𛯫@csaHbη${[S%;\u0005ڳ\u001fa\u0006\"gZlFW`dcUuT7;\u0014\"f5aڤ$aK6'37\u000bT/;tDx~\u0005f^khv\u001be\u0016\u0018Y=L\u0005ǠD!4_ןl2ʚ?sJAɐ?\u0004\u0005rΗxCU\u001dQ@}\u0011+Cke%\u001cR\u0017;\u0012Va\u001f%\u0013TKx]7m>9Z\u0006\u0005|$̖\u0019Đc,T\u001f{d3í`v\\?\u001c\b9jpH85\u0013\u000e\u0003V\u001cJ\tƹ\u0017\u0016j\fC\b\u0010UA\u001cטa({\u001bq7\u000e$\u00129I,+\u000fGN\u001eHF^U&\u0002\t\u0002'\u0012!&r\u0014﫨pC\u0014,U\n8C,9\u000bo/z|`or]}_.A3T\u001a\t\n\u0016ρ7\u0018lji J2\r@\u001b\u0006(I'\u0012\u0013\u0004[L\u000fq\u0002<&e䠊2j>yC.e2,i HXI_-C|\u001b\u0012Q\u001d\u0002)Bx\u0017'\\>\u0019|LyPSC\n<\u00147XY\u0010>!7Tf2X߳\u0001_Щ\naZdc\u001eF!7\u0010\u0000)Kq)\\\u0002ןR'TZ\\_򬹳iߺv6i.&+\u0010j\"uX\u001c\u0015\u0011r+xaW~.[/\b4Z\u0004\n\u0019Jzb}IW.v\nYX@H/,\fr\u001c\u0012,Кk,C!\u0004\"}O\u00140+FЇĴd\u00140`\u0012tz\u001d\u00179T=XՃ\"\b\u0016w$'SO\u0007\tOJ$3$J\\m\u0002\u0014\"PIέ\u0004c\u001c\u0014C\u001fQ⑕p\u0004\u001e\f\u0005\u0013iϣ#ċE?%+[EZT96e\u0006yFԯyvوΣ2'zЃ dp.UDBQA*^\u0010Gd\u0005RYv\b #ZI=\u001f-\u001frrTS筸\u0014P\bbꨔlZq$-x\tz*3~\b\r_m\nxY-\r*[Y0[%\u0014\n9<w;\u000e=&R\u000fl\u0013\u0018kG¬n$wO\u000flJ2D\u001cJ]:?a\u000epuJʰ\u0000H\u0011oEft\b\u0004\\=\nY\rz喧-\u001bB3N4蜠$0h\b+\u00196OpCHS \u0012ϵ\u001fwtŬ=̓:ߴ}H\u0005\fB\u0012G\u0012)G*\u0004,\u0014&YfQ\u0014:.0\nuL,5O:CQӼa\n\u001eޤZZ \u000bɽ%T;R<\u0002H)ufn=\"{tڡ[L|(Q7¬X:\n\u0010\u0001\nrʅBJ\f\u0001yA\u0010ˉ\u001bM\tF@n\u0019\u0010é\u0012J|P?C\u001a`O:\u0019{IXˀ\u000e\u00009\u0007Łp'I˸)cֈ9@Q^\u001bIp\u000eW\u000e$ą\u000ecrD͔bp'LDZK\u001c\u0003\u0002TUbIu\u0001<&m_!Iy\u0007@\u0018`zɔ5&6\u001a%V!\t_7ɸOhTx\u0004#\\$\u0000@OޞYGEJY\u0017.Puy\u0000\u0011X\u001f\u000f\u0007\u0013WՂ 4!odG(QIu;LDe]Ul\u000fs-I\tɮU\u0012/\u0001:\u0002ВH=I!#5\u000b\u0018iuֶW\u0002.e_Y'\u0013\u0005&Kf\u001e\u0017#v0?u\\#\u001a*mB\u001bd}1Pk&~p-t#\u0014\u0016\u000fVO/''u ˖ 0O#N[ݪ$mYkq#U^.W\nvHΦ\\\u001e'H*ͽ#G\u0007Ѓ\"Mɻ\u0001zTK戗\b,\u0010\u0015(\u0004V\u0014[,Yrlm.\u000bJ& ;7U\u0013\u001cdqA)d˚\u0012\u000boR7%5X\"q}!\rbt\f\bz\u0000s-\u000epbLZn6<\u001eW\u000f\u001c2.Cq.&\u001d0fb r\u001b\"I\b@.\n\u0012\u000bIcH\u001eMVxk&8\u001aS-˫\u0005\u0016\u0011&i\"3}\u0017'3`ѥE5$\u0014_Z@H9ݻ`}\u001c\u0014a۲\u001cPq:\u0012\"ky\u0016OкA|Eg(\u0001c\nyݫdb&i\u001b3P\u0019\u0005=J\u0012s=\u001e]2y9;\u0017Rl@\\W{Y\u001bmU*mЪEz\nS\fFɜqu_\r]A9{Pm\u0018rT!\u0015<H&BW\u0018\u0012\"\u000e9M\u0006(ݚf(\u001a|\"9#\u0015ǽ$Ra wS|\u0004\u0013V=_\u0012in!^B\f}UR\\Kj)(\u001f!ݶnr[Og/P^\u0013b-7\t<CtZQJHj綦\u001bQdWemf'i2ΰL<RY%s092\td\u001fT}\u0015DD\u0016o\u0007ld2Q[--\b*\byLk7Z\u0011\u001cY8Y\u0019J\u0001YN$c\u001eR%|\u000e\b\u0007)\tMh\r &Dyn\u0013jd0&DwSEs%?[\u00023ʶ]=\u001ecjRe\u001d5\n[ȟ\u0015\u0010\t-ʭu35)#6{ 6\u0011y\rCw\u0004eSہ@\"!P\u0000fw_vc)xU\u0010\u000b\u001ejbg-I]9گ\u0010k\u001f3b\u0012\"Yc\u0011z>\"tB\u000b\u0000R\u000bVҮ\rfEg9'Y\u00042z8+A¦qMP\u001aj\u0014N[\fr\nL\u0006\u00019q[\u001ccb]s\u0013,E\u000eJ\u000b'p\u0013 <yEԫдZ\r\u0014u\u0007Vǳh\u0000P\u0002\u0000\u0017~\u0019v\t \u001efQ.m65ۻr&bP\u0015]\u00135P=\u00020\r[A`ٛգT*\f\u000eY:z~c\u0010[Ґ\u0003/+8;;\u0010Gɗ<&\u001c+\u0017qi{H\n!k\u001c\u0004\u000e.\u0000%2j`n(dzcwa\u0018\u000b@\u0016X\u0012\u0003P\u0013\u0016g2<\rN\u001f\u0000HrE+ܐ\u0018\rm;v/\u000bd@z\t}Q1q\u001c9r[K^hB֪-vգ\u0003!8\u0017\u0017Ǥs\u000fYzt%\nC\u0005T\u0000&$׭\u0003e\"5W#U\u0002(\u00199AE P2p\b\u0018-\u001d'\u001b\u001aݛу .tq\u001fb\u0003pQ\u001bkOֱ8\tI\"\"\b[ąW8\u0018\u00066f$\u000eHފJe\u001fe\u0001\u001ab6\ta6և}TX q\n͏k=nN4\u0014\u0000ݦmiF\nLg@ૼ\u001ep\u0007u׏G'kt$h=\u0007Z-\u001cL\u0014($S(ل\"?%-\u001dm\u0001VglL\\1l\u0001PX\u0015;\u0019-q6\u0004DX\u0018ig\u000f4;-\u000f(GY#JuV1\u000b\u0010\u00100$D*n$\u001d(hwo6#9!w\u0018b͛qm\u001f(z\u000fd\u001f8@]q訠\u001c\u0011<*K|\u0000\"6nmV\u0018\\\u0019\b\n:\u0017\u001e\u001dHV^qMK\u0003Vڸ(rjJ\\ 4\u0007j6\u000eg\t\u0017Ʊ'V;\u0001b\u0014`\u001b_yɁjt2\u0007$\u0017r\u0006wm\u0002(c\u0016.AkJ ?\bHF\u000e {@/Rv\u0018#6\u0017oG\bw\u000eG/hr\u0014)[x,Pt1|\u000e\u0016Y2y8P|t{2t#ZEΙ\u0003&\u0000\\\u000f˄n\b\\[\u0006 \u0002t\u0017:a(\u0006H1ZW\\\b\u0019maNѐ@a\u0002Or(V\u0011Espipp\u0000Lm\u001b\u0002;>\u0005r\u0015\"#޹+,\u0005GV\u00076Ő11\u001ck/̛\u0014[#Y\u001f=n\u0004l4,KBNc\u0003$j~AL52>eBj\u001fnz,zxHApvkhV\u0003|@\u0000gg]\u0016XL:+\u0003\u0011o\u0013(l+J\u000085fWynҎ\u0007V\\\u0003e\f\t\u0007%\t\rKF\u0018\u001a>\u0002\u001c\u000f[٘[ȡ\u0012b$䚃С*^ߘ!\u0002n^ݞYBֽ\u0002Ld)o=̐PI\u0002B؀9c߈kF^ @\u0016J!\u0018A9\u0015I\u0006\u0011#\u0007(i\u001e\u0005mv\u000fWOD%U:L.:\u0006Nr\u0019\b\u000b]L\u000fi`ie(WGiz\u0012!'V̂qwJ6y[:l`?\\\ng\u0001\u000b\u0012Uz\rE}\u001f\u0010BH\u0006\fyM*쩄\u0007s|c^iElQ\\a#\t5)j]\u0013{\u0011APLP,1&߰3|[\\(\u001bCZ$8w\\J/J\u0012\bc(cQ_\u00130\u0010\u0006\u0001\u0011YS\u000f\nߛ)\u0005Ãl\u0000\u0012.hCvJ}\u0003դ\u0007\u001dR\bDv]6h~P\u000fnľ>6Kb|Q4Ⲿ@C(Ww\u0000&\b8\u000e\u0013-i\u0004/pϿ` \u0003b$j\n}>Ӎ\u0010`\nwTz\u000f4T\fBi\u000e;z\r{p,B\u0004R( \u0005\u0005$\bH`\u0005\u0001\u0018P\u0006x~񔂋J|\"b^a̷\"蠭\u0015Bbw}*9{cg֌\u001d=\\WٽW\u000e\u00045;ݼO\u0013(ˏWlk\u000bB>\u0011G\u000b\f)yT/Ȭ#{1Bu:<S4\u0015\u0013%D[70HI:Ѷ\u00014^~J<9g[\u001c?\u0011RJGsMH;c\f\"r[1\u0015\u0018z\u0006\"@u4S\\iLQ wKG^\u0016#\u0012\u0011D\u0010Fl\u001c=pgh1\u0012D\u001ebR\u0015l4e\tT36#c\\<%d\u0019/ÐVo]](\u0001%!BP-q~8p\u0017΅Qw\tR\u0003lGd',M%=ztC7g\u0000(lW_{c7\u0005[B:M؂HDS\u0017\f-H_mmc{\u0015v$R\f(`EL\u000eU+,\u00074C6l#Uōɋ$L\u0001I59\nk魩MS\u000e\u0003\u0015CA\t԰\u0000]1EŴM\"\u0007\u0014\u0005T8+NNnUde=խ5u\u0005JmRk1y\u0015QDG4\nۉ\u000fa#þ3je`Ԡ5fz~ Rۄn_SI~0IM~B\u000bI6*p>n\u0015v{\tJe\u0013;9N\f6\u0011ߩ2\u001e\u000b#͊sÚH\u0016N=!4\u0013{\u001a&']\u0002\u001b\t35VP\u00059,6>\u001e/\u0015ߓoXۥ\u0018ݗ0d\b+\n\btmH.1|(\u0005c)OMI\u0014XdU\u0006\u0007N\u0007P_\u0011Z\u0019a9\u000bbk4u8hwipr\u0001\u0011\u001cu-\u0003v*\fPʺ\u0013^o\u0001\u00019n\u000b~@b\t)(c\u001bv<\u001d\u0005#\u0014-H\u0011ɜ\u0013#`]\u001ci\u001dbu\u0005\"\u0014Ӥy(,HBtJ;4#lDw>\u0006*\u001d2A\u0001{UZ\u0007Y\u0007\u000e\nr(\u0006\\_:\b]r\u0007\tz9[\u0007\nkdm=\u0005x LS6\"s(\tUY%\u0004e\u001f\u0015뉈N,Ikg=\\\u0004\u0000Z\n>g(AFX<HoM 5\u0015]\u0014\u0019.ʳ\b\"\"\u0014f4vMMW6cΟIJK \u0000\nH\u001a@\bj'm\f\u0018%3.d\u0002͚֞>}\u001d)*_\u001fip0\u0012(f8\u0010&s[3\n\u0005RXxK\tTyފw8\u0011Y:\u0010?4C(}S\u0011i}\u0018Qt\u0001'/ 4)o+V\u0016\u001b8F\u0006Jnl\u001e\u0001ڭ菻\u0014J2(JT%q!$\r\u001d\u0001`hH᭻<oȆ\u0014-\\c\u000f\u0006\u0002*1;Mwu\u0016|\u000bq7eyO\u001e7\u0004\u0014\u0001M9PxCN\u0017dft\u0018RSMk(׭\u0003p`>Dd7j^\t%<|=8\t6}`|G&b;y\"NZ\u0004rf\b9-\b˨oCag\u0017\u0000c(I^2\u001bG5@\u0019b+uHb!\u0017RQGW㘎\u001949݄V}daz\tG\u000e\u0013a\u0015,pC$\fof[ĵ\u0007\u0004%0w<PҏTC\t3.Tt?\u000e`C\r|\u0015#Igx\u0019͎uLN1\u000e#U@W|1b]\u0013\u001eLʃ\nB\u001eN8~\u000e\u00075\u0000p'tӗJzuZ\u0001\r~%ߌ\u0016-5)۬\u0018?{g-^g+n\u001e$a7+U|Ͱd`WSS\u0010I\r`Na{\u0006O%\u0000\u001a: :63+h~\u001d\\\u001b\u001eBo\u001d T\u0015%m.Ҵ1o|\u0018pDJY\u0002ld°>\u0004 E'V\u001cH6L\u000b\u0010XE.j5?\u001cI\u0007\u0004I)_K\u0014}\u00045CrDM\u00126DZ\bO\u0010%[XB8Z!D|*~U:ɀ\u0010u\u001304_6Q1C\u0018w7I0Jv'p\u001c\u0012>g}e\u001b\u000f<\u001b=?CWd\n5\u0017i\u0002\\M7=B0;p\u000f,-V\u000f\u0012qzDiM3d7B\u0013\\8\u001f)}mk\rkY!\u001fzl/&.m<40\u0012\u000fHX\u0003Fz2\f8݂6\u001aU\u0004\\\u001c\u001dVWڅJ\u000b\tjH:U.vD\n/A\u0016\u000f\u0001!ZxU\u0011a&V6AS`\u0007J\u0006\n\u0012f\u001d7\u001e\np\u0014ds\u000f7C\u0005۫Ƕ}-ӂ;\u000b[\u001b\u0000\u0015;Uƅ=Cz\u0011rBt\u00165Id\u001apXB.JKD\tV\u0003U݀Om\\ņZ[޻<\u0013I\"у\u00155.mD/շ΁{8B$^z+\u001aM\u001c\u00184cjJ\t~\u00157\u00147sM\u001cUk \u0002<N۞@di=j\u0005\u001a.V[x\u000bI\u0002d%\u0006k@b {\u000e1_\u001eA`\u000e\u0001,^Qla\u001f^Sn-\u0018D\u0017\u0012\n]kZ\u0005ɚ\u0006F#\u0001n<l2\rEC3ٵz:j9K\u0006NPc\u000f\u0016\u0001\u0007KA>Pu8D2Y\u0018%2+@\u001cRNd\u000fi2\b\u0000'/C\u0014\u001f-mPM\b,kے\u00129\u001a\u0019骜<(VP5)xR8G(\u0011v\u0017M. \t5pHD\nB\u001e\u0012Zkno'\"\u0016\u0000pz\u0006L|ZwA:Naf\bDL[R\\{$-_Lc\u0003-54lxr9-xIO¯׶i״b,J!TB?I\u0010tM*\u000f& \u000eL\u0004%۠\u001c\u000bD[҂`4g60Ț\u0011B5@7\u0011\u0014u9i\u001bb6YS\u0019Bɛ\u000e0#\\KM\u0010*3R]\u0015[`Y89V-!>X\u0003\u0014\u001b\u000bT\u001a\u001di\u001e}\u0019k\u000fli,݇\bؚ\u000fE\u001e!T6n&Q\n;I+`}\"tDh\u001eRHQf=K_~DxzNo9F֘)\u0011zFM.]{\u001f\u0018\u000ekHUJJHNNRQSx\u001b,O8?\u001c\u0015Vv>vˮ3!e@\u001ab#~zO\u00166.Q\\UmM\b?\u0011?܃-r\u001fN#\u0015;a-{^\u001c/\u0007C1gi7+ؚÉc_X\u0005YJMwLDZ2*a\u00119220*\"I0bKX!w҈/k\u000e\rT\u0005c3k tbpG\u0017=\u0002\\<ʝp*:\fI\n*zD(Â\u0002-\u001a\r3\u0015\\a9J~#TT6\u0016( \u000e\rD\u0001캊6\\Ep\nQ\u0005\u0010Tb1U$=\u001d}?}Roԓv7\u0013H!]8u+;il\f\u0019҂\u0013ӂ\u0013Sڳ״\u000bm.k\u000e)\u001c!1j\rt\u001bs('F\u001e\u0018doJ,|;=n\u0011':lC\u0002o\u0015\t@?\u0019D.Qd\u001c\u0003\u0001)ukLC@sb89\"V.<6ۋ\u00151\u001eǢ:Pdr(M+*=*\u001cc;,\u0001L\ffҴق!ve\u001a&HWͅ&k\u00032Еe\u001aL\u0006V\\%vlb% PiJńDxb{Jʚj_qInOչG\r^\rh V&\u0014ߖ \"W ]\u00025\u000e\u0005P\u001e\"\u0014']QkVX1v7Hy,/3AIol5zAǿ\b_\u0010\u0019(\u001a9\u0000\"~ʟ:u#RZƧD\u0010%m9kM\nCYNND`-f45̑c)\u0007fC\u0016}-\u0005{RK\u0006Q˺EU\u001bj$\u0003J\u001a7#H$Zjቝ1\u001f[\u000b\u0010\b\u001e.PEv\n3\u0005(9\tX\u0001aǮN*\rT'ȁGJPeM(\u0016̖*,\u0006\u001bz3*BQt\u000eb\u0017\u0003K\bnv(o\b\u0015&GTE\u001c\u0018`eC3鞤\u0007f(0{\n\u0013P^=\u00193pZkq2# I\u0005\u0018KحlZ}]b\u0005{c'\u0005pT)d\u0016q \u0012s$'P\u0019j.@=GaJ=Qd`<\b'\t\u0019P\u000f֓\u001f,\u001fC4\u001b^`5!Mv\u00101k4VT_`\u0012\f!\u0014q\u0010ٞM&5:-4Rs\u0004g\u0018\b/\u0007YM`u\u0019ꢏLdэ>3ty\b\u001f\u000e䓡tC\u001eB\u0007\u000f\b83\u0011\\\u001e>LZ8TA@II\u000b\u0017[23.i\u0003 CC\u0010MT.)]a$`\u00185sȅ}\u0001hKP#u#\b3tqz\u0014\u0014pIXmʎTκF\u001eBK\u0018*q\u0000\u0019n=\u001e@M\u0012\u00137+~rlK^9\u001cTEY$\u000fvSVj]Y\u0007\u0016\u00115ӛX#7_MnL\u0017~k\u0016Q_~6\u001eeNLHBHwj,2Ӓ?^!BOYXT1oJ\u000b·,\u00015\"Q\\6M\u0001^\u0003.}R;\b}0\u001cC\f\u0015%:\bu}%9zŮ~Xa{M\u0016:\u001ed؊!\u001480\u0006\naHK@D6\u001e۠xx}\u001f()ǘ6 \u0014\u0012\u0010*J+\u00186p&@\u0018\u0002mQ\u001aZу\u0001Y#=Gِ@`F\u0004\u0007!\u00032d\u0017\u0007\fs|BD+o'\u0006(59\u001dY9pVv+pb&Gﱍ\u0011,\"]f\u0015!%)\u0015^\u0014\u001c\u001a\u0010n3\b@A1\u001aۦ]L\u001b\u0016cқ\u0001h*i#]&<7Qp\u0010'j\u000b#&l=],0f8y+qLhkt\u001bUItob\t&@3pZ=1\u00134d*(wL\u0012*\u0010&T\u001ccR\u000b\u001fZOwa)4QW\u0003QjD1n\u0013\u001cǅg\nJWUk2\u0019lo,\u001a]̈́\u0018\njv}\u000b\b[J\u0010e+F\r`j\u0004wЎj/\u0019eV\u0002vSḦ(gg\\`\u0014(tk&)zZ\f\"7討\u0014\bKHr\u0013L\u0004O$Gve]R`MSdxr\u001a\u0018_]~$\u0018騔V\tKX6gE\nM\u00019p58)!;Ȫ\u0015K g\u001e/ϰj_d֡9+lvDk*$:L\u001b5cT\u0019ozJ\u0017\u000e5:8]G'aVe\u0003[\u001a\u0007\u001dp+\f|\u0005[\u001aA\\\u001bk!\u001cD6yndxɨ7jCZk\u0017.t0\u001aςLsz\u000b\u001e,\u0014#\u0001`1o&-7O\u0004\\\u000f*bk\u0010$\u0005\u000f<䈤(ȰN\u000fV]U~D\u00169\n.ل\u000b\u0014f\u0000Q9 \u0014 _BVGjcc*3_/8JvD@\u0015(\u001b\u000e\n\u0003J\u0005Zm0Ģ[#-QnZCCV&\u001e\u0013+>\n폣$Z\fBC!\u0001jfM\u0010U[\u0001J|Gy&X09\r)8\u0007}u}}k\u0019UP\u0014߽.a\\\u0012nG;4d)\u0010HǎyŉN߮*de\u0019Rĭ2d^\u001b\u0015*Y0T0\u0003\"vpT\u001aJݍx7<\bā짜\u0002JAS*q\u0000[M^WDbz\u0017iD8\u0005\u0010N\n2/BH\f\\\nğ\nk\bda\u0007xބ\u0012*\u000ez\u0007I\f{{Nêu7|(ʖ{n_\u001c\\՞ksQLa؈@6\u000ew\u001c/5\u0000|\n\u000fxrioH~\u000f^\u000f\u001b\u00059\u000f\b\u001d\u0012\u0006ם$Yc͞0n2E9'!:F\tL14\u0011\u0005+\u0013PmgI(Y\u0017b$\u0013\u001fЊbc\u0017z}Y9C-/\\\u0002\u001eAEDGH$9\u0016\fl\u001f>6\"C\u001c&\u0018x?\u0014p.sK}-\u001edȂ5Hb?;)X*\tkie'6Օ\u0011l\f}B\tf=|Nq@\u0016\u0014UYO;|HQmʰ\u000eDQ\u0001QDݻ\"\u001clXmMQVm68od˦~Ȑ\u001a\u0007lc$U˪,z\u0004$J\u001a%F\f׋#4iՉdZ/0@H-_4G~\u0013Zڀw7{?bo\\o\u0001Y뢮\u0014FRQ-T\u0001+\b$\u0003%@IN9N\u0011*ޡsV6Bm8\u00165񬙒[)U%inh\u0017~n4\u001bI$\u0014\u001fmH5dަ)P=XsJEnoc @'\u0013v1\u0015R\u0003v\u0006|:KC\u000ev/>fXr\r矗i_\u0015G5\f\u0015\u0005ͥG3&!\u001b&ѱ\u001cpsx;g`M\u0002\u0002THUH\u0005\u001e7|TBׁɜ\u0015cN.Y5D\t\u0012|1-?Ԥ52ݡ?\u001c@}\u0012fp:tA\u00001(7^r<w(AiW8[lm_tyS{]h\u000by6H\u0006bX̭1E\u0014VUE\u0001\u0016Y៚2<|8\u0000wTW\u0018\u0005z\u0002\u0001&8p[o@\u0012\u000eMzx_Jׅm(I fAJ\u0002bբ4c< !4a\u0004fpO^X\u0018\u0014\u000b̚s\u0007\u0007^w*BGq26E\u0002\u0005\u00032[\u0006.è%\u0019/BB\u0003AZ\u0018\u001cMi!\u0000ȚRh@+\u001axcĵ\u0010\u00142ӕ^\u0003h)\u001adB=\u0013!w{\u0011Ќ^\"_&ݦ\u0016_#3Ł\u0002PX\u0010PKfu̎\f7x7:AM,!\u0012U'\f\u0015.T+glN\u0001Jҏ@#%_HTZ\u0014#F\u0019W{;-;7~^g\u0007}e\n3\u0018})˹'\u000f\u0007\u0018\u0018[]\u000b\u0017δg\t\\C޴ vY1!oRN\u001fg'sF(IOk̴\u000eQ;\u001a6:\u0005}\u001d\u0001$DP,R\u0011*\u0016jG58a\u0006e?\u0010怵\t\u000e@\u001c\u001d\f\u00102t_Hs\u001ei.E1bdɡ_f\u0013\u001b\u0017o\u001f!w\u0011G\tR\u001e\u0018\u0012`&\u0004a\u0016UCc\n{.sAįG\fq\u001b\u001baZv@STR ?,6*\u00026J\u0004Y!+U\\2OQNQrCX=\u0007JŅ]_1dN\u0011i\u0015 ޫsł\u0010\u001d+䰄VQ\u0001!\u001287%\fL:oyd6\u0017j7˕MnECP@;{0D{{i\u001f%pm\u001dd!h\u0001u\u0006+0:_\\h\u001fi/F)\\|\u0018\t\u001c$\f_\u001d0\u001abxC;0\u001a\f<Y\u0001Q­PT?\u001a\u001e_Տ?۟/?~\u00177?|oo׿?ooT&Bg?ݷ7ݷ_3/~O__/\u001a}p\u0017oo\u000fvu~?\u000fK߾G~}\u0013s~\u000f?q]ע͏z/׿\u0017ۿq\u001e54\u001a?k0W_E_}\u0003z9cw|g\u000f?~6O?(g^\u0004f}\\o^'?\n`'\u0014:\u000fbei\u001fR\"\u001b߼oT߼?ϵ?ᳫ?b\u0015ADy\u0007Z[/j4ͷ9\u0011&Օ\u0013f%VEF\f\u000b[z++:\u0018W\u001e5tX!<\u0018\u00150?\u000f\u0002\u001f\u0015!F\u0004xrc'-Kq\rt{e/Q/:\u0004}1vonD)~͍0ďr.ds\u001fMVD#\u001e#a\u001b\u0013\u00142֝3\u0000lkX/8\u000f\u0004y4I\u001e|\u001eǝdgKtE\r; G\u0013\tOlEH\n\"n+\u001eN\u001d\f\b<|\u0019{\u000f_WQ|HTw;]:C-NOz~Oۍ:Y#m\u0018+xiR4\u0012~}0\u001c]+ѤO:\u00178\fUC/؋F+Dф\fm4%\u001a/?d5ͯߣ]DN}\nGTC@;J_{\u001a\u0003\\\u0007^WR)x6~?Zή.\u001a!M\u001aY~$cp3}ֹoƹ?)@\\NcY{x)EL3-کF{3c\"O.K>$N\"hD׍\u0017̖8\u0017=znt\u0001\u000f,-\u001aGE2E#~yT!ҏǍ\u0013XwelIǫ~0n\u0017u0!ᓐ=c#6^Xs.n\u001e\r*'qOO`\u0014G\\\rL/^=]H1nk9׸Ӟm>kh\u0013\u001a9痰nb=P.Xwdn\u001d)Cڗ+\ft\\~95<\u0004=vܗ\u0015Ì\u0013$`\u001bx7S>6(\u0017A\u0007H=Fm3? ;}E8GИnF\u00113h\u001c)}\u001a@\u0012[o\fi\\^5P|\u001d;0j\u001c\u001ehv+f|Ix\t_\\r=O@[|JD@8X33՞\u00198z\u0016k/\u0002w{>w=վk\\??z\u0012/{y^\u0018Ū\u001f#\u000f^\u0000}کy\u0017ZOwAֆ\t?\u0005_3`\n;0>mu\u0014\u001a\u0013}Oe\ne\u00037}\u0014-Ec\u001f\fPo_<)\u001d_0\u0003Njlg\u0006sc+,绝;mӘcbcΌ3c\u0012\u0004|.\r64ߟYފ\u001e{&cD؏B_3\b^\u0011\u0004xD#h,9ûk;$܂vEXݞ\u0014\u0018EXJ|r\fFcL-(X=(j&WVc\u0003)Uo>^EEg\u001eN\u0004іks\u0013I;G#ݞ~6\u001c+\f#\u001497Y(lbz|\u0016Ϳ}w@\u0015\f~휅N3\u001f\u001ddw(=Cu/\u000e~~$q~\u001a\u001dW}<s7w\u0000\u0013\u0016-\u001b'TQn^GPnmAʋqk\u000f\u001bMگ^\u000fctݨjS?3W3D\b4ӉWi:\u0002~,\u000f\u0000n=\u0017j,}=\u0000*s\u0017\u0006ڝ\u0011Y\u000f莶+)\u0010\u0013\u0000\u0016\u000b׍RXw\u0018O4\u0002z\u001e\n;S2/4}\u0006\rhlk)_?7\f\u0018DcҎ2\"։0N\u0002\"%\u001a\u001eQmuΐSڟ|4FtΒw^G潢b9\u001cpƝ)@7o8IEk]uOWlQ\u0002==IiXaD{c\u0001\u001f\u001a[ωި8bwc%Va\u001b1ۈA\u001bw\u0010\u000b\u0010|hLd\u0015g\u001bsk|;\nrփ{7JyΜ\u0005Jӓ\f\u0018w0̻G~g^qwSνs+&P\u0015BV,2u\\X\f\u001f $Msw:sp(eX)'\u0019R\u001dOX1#\u0012%\u0002*;{{,R\u0001E(_jg9CN~\u0002=i;Sn^\u001a\u0019!ʏqo5NBczE\u0018g^>\u0002[Z1q:\u001e3J\"ځc\u0011\u0002~\n/ǫiD\u000bg\"x\u0013\u00196\u001ce\u0014\tO1(|Zw\u0013q>x\u000e?w<q\u0012ޜ\"ؘDϻ\n!s'OwyQw>k\"\u0016qVt\u000b\u0004A}\r\u00037=U\u0013=n(m?\\^dߋQ\"T2Iq^\u0007qy%0.ol\u0007?\u001dw\u0002,z2\u0001\u001d\u0003\u000bg@(u\u001dBF9t9g\u0005jl'\u0019xoA%1i|'q:\u0006B\u0019vadω?G:k4io'\u0014W&yGE\u001ciˌ\u0014;'H3/+\f+5;o1GZ̰{.h<b@\u001bS_\u001d\u0015a\"k\u0011翓ZcE\u0006SS8=ӷh,\u0006c\b\u001e'|]\u0004^Pq;F>\u0019Ȇxh$\t]y77O /z\u001e6hZyޚ\u0011_\u0011>}L\r|Up\u001bh8\u0003u~f\f){D\u001cTvMSI\u0004_9FbVYdb8ԓ\u001f`;({~\u0000YϕJH/X~na\u0018\u0016gmv81Y\u0013\u001bYD{}\b\u0015BcfjFvr\"\u0004Z\u001cAA59Ҩ~I\u001b!}R}K\u0002\u001fc3PP;۔y\u0002\u0001k\u0011\u0000;x'\u001etcg\u0004g|L4Oߑ>S{zƔa34W\u0014$Ƙ\u0017U3o;gV8\u001a6}},9C{hƚ\u0019}T\u00198O\u001d\b\u0014C\u0002R\u0017?⋽?M\u001bOY+\u0019e~گOT\u0015\u001bI.ǌ\u000e^`~ĎN\u0015)\u00054ń\b$ﯨss'Y3G)8ާ{`f,:Nc~6H>I|\u0019_O*e3*'\u0015_I6\\T\u000fFyGd7\u001aGݯ\u0019/n\r\u0019E5\u0016̹\u001d 5YrKΆgH\u0014a#ċ*y8\u001e\t\u00063G-'\u000fd\u001bZyILܑIl5Q5O\fI.Hw\u0007Q~=?L8ΤO\u0013;s\u0013[*{&/\\\u000e4\u0011PybJ&\u0012Yk/שq۲WvӦy\u0002~\u0016\u001alpvMYn'\u0016⫟O#\u0004<bmFҾ'\u0011Sɸ\u001a\n\u0013v\u0010/V'K\u0005\u001cNf/IZ\u000b<:4hlg3F\u0002oLջTLz>*]\u001b{</|9\u0003yCܕ\u0003ȷB\u001bq <N\u0000>lGv}\u001bizfrv\"5-9%#\u0000sRFsH\u001b'ʩ\u0019\f8:Aǽ\u001b\u001f٬O.$jRД\u0013J8W)$(3U]t\u0005\u0005B$\u0017}9óۈ\u000bNxBh<y~p\u0004O\u0018=%\u0007&+C7^gU}\u001a㩓DJ/ϧK-zBЍc\u000fN\u0011\u001eώhneWe\u0012\u0007L'\u0019g\u000b?nK\u001e\u000e=w6r\r^! s\u000e~}j\u001aD\fj?SxRLJQOh:@g3h,Cy(\\d)^I[[\f\u001bbAHj|o;b\u0003\"\u0010M\u000e1°Q{4@IyrZB=1'E\u00128rw\u0002\u0011\u0018SBjNr\u0014\u001c\u0003ODI\u0010ҹ-rw'2i\u0012V\u000fţ&cK\u0014=j\u0004WYJ-x_iwvX`K\rBc0# ƍ%\u0012^yݘFޟ>Ls)\u001d\u0010h21\u001e\u001f(`i'`f֗Xi7}xu7oLr\u0014\"mg-\u00199\u0017LVSvħvٟ74rx)\u0011^v=7Bnٵg֘!Oy5+s=t?\u001c\u0018\u0015pX2W1\u001f91\u0019ʞ%~>ABٞhx\u0013]H1FIgF\u000e4n\u001f\u0001\u0001Ao5\n\u0015\u001a\u0014;[\u0016g\t*\u000bAa\u0001\u0013U!uo׶MO\u0011Ic<z\u0012{D\fL%@4,h3\u0007:Ymwc=sjv\u0002ZUV\f޷sȯ=7OUj{%;Fr}\u00122Dʾ\u001a\u00051zS\f>i0\u000f~ogOFn0xN;\u00030M`3Xo>e\\_gr\u000b\\;\u000f!E=+Ks\u0011F\u0018\u0015w=\u0001\u0019\u0010~YsVM^@6hX\rV֖d?\u001f\\xY~#2Fr!(<g~rw3<\\@q^NvE^\u001aBƳnp]Dxf8C\n\u00051x|}l7\u0002 5G\u0010ݳw}\u0001]ca'S\u001b\"cwwr9|\u001dX潼b5\u0015\u0000SM\u0001fy\u0004q::@Fg_F\u0018c^y\u0016\u0000Ss\t\u0010\u0017_xx\r\u0018g\u0019[WJ'\u0016Gy\u0010\u0004Th\u001f{\u000eݰZz=LN\u0007ת\u0006\u0010\u001bY:|~\u001aOr5e5\"=OR\"2gIݽ$Q=Tт<7\u001eU\u00042Ϛ#P<ajcd\u0010|\u0002rIȀH0\rCH%n3]N`{6\u001f`|]\\\f?Y#>b\\@?\u0013{;\u0003\u0012Ky\u000eѫ3\u001b\t#<U(2F~о\u0004}U'q\u0012o[h\u0014\u001fK\u0014\u00068Z\u0017\u0016ʈ̇^\bPeY^4\t\n½\u0016PH\u0019\u000f>X˥S\u0018zO%9C[S:0ߜ{\u001e9._~1p\u001eZ.^\u0006^<,\u000b[^5\u000fuh'N\u0010wiR3[;rN@{\u0001`\u0012WP+\u0006u\u0017ǘ\u001dZ-*\u0019}\u000bg%>;\u001d\u0018vGCi=Y'}\"qYOncK9ng[\u001bv\u001ctv\u0019ɝ7\n=KLfv}\u0002\u0015Oծ\txH-!lmr<ވ$lCB\\\u0013h\u0004;#_-\u0016\u001d<V\f=\u00027/In{|9kB\u001eNI.\u001b8\u0012(疯ݸ\bls\u0000,~>{M\u000eUiԐ\u0014tYs\u00040xJ'\u0019%9\u001c\u000b*ɾ\rR}O\rR2*yh-@onz\u001e9<$|<DFٱWO\u001cy<gkF\u0006DuGL'vFIu櫈3ۄ(Oq\u0015.?\u001dx.]/ۄ#!2\u001f0TgI%u\u001eK]QMJ\u0012kۅ\u0017z#P}?'m\u001a5D\u001b#\u0011\u0016~\u0019!\u001d*Snc\u0013\u001ev:gH{qBE\u0016}\u001eI1\u001ai_%fkOB\t32vgl?\u000eB!n\u0013K\u0018\f=g؁\u000b񳟴hu/\t!NP\t\"|C헼C/2\u0017=\u0015\u001c\t$7s4w)PcŦ'*wNxlݸ\u0017dn<@yS'\u001b\tYwHH<^0=E\\{=\u0001ݘ\u001e|I7zf-<Y|ȇ\u001arA3'#zv?/t\u000fnbƬg\u001d{\u0013zIg(Ol\u0003\u001d'\u0012s\u001fc\u0019zr>\u0006D:V;بtf^u\u0019Xv\u001cD6cwt\u0003\u0010xq:\f\u000f펍p\tX\u0006Ӿ][̯MƟ\u0005cF;N;\"ߡ7$\u001eOU\u0018vw\u0003\u0011(6bC3}R-[f|SDgsz\u0005^xvΙ|RX)\u0007\t\u001cS~3wvz\u0007\u000fQ']\r/F6z,ߝ\u0013m\u0017B\u0007y2{Gq,kË9'\u0003Fƀ\u0001\u001bJ]'L6Qiw$\"\u0012\n(s\u0019\u0010H\u001c\f`c9Hq<szgz>\u000f>\u0012ٞzߪѐ\rRT\u0017b\u0017\u001ay7Zk\u0019lQr\n\u00134jd$Aupy1f҃NU\u0019t\u00040\u0010\u001aRβJ:.)\u0001/\u001a\u001d\u00129\u000bb\u0010dccу$I/Ш$-\u000f7䀏 Q;\rk\u0007+Ur(-\u000fAZ׃9fQɏ!G;z\n\u000e;.q,3\u0003RQЃ\u0004\r\u0010^l)\u0004r\u000f\u001cmIUS\u0002D-hK˃f#Ͳ=q\u001c8GZ+I\u001c\"JY}\rѦ+HA\u0005\u001d֘F̏\u0000G6H\u001b8l\\i&F\u0019ICR\u000fJ[iwcA'ϲ\u001cu\u0005J&\f;X\u001dفooKɴJ\\.`\u001f\tY%JFuYxJ[դt\u0005Nb =W)No$4q\u001bm\u00184ɛqDr3) AVH\u0017P$o_!{[Cƃ\\ޞ\u0010ڐ`ޙmoO.\u0005+Tj;,2lHz\u000eN/.5%*\u001bS-x8\u0000\u0007_N\u0004*Y_VZ0k5'.!l\u0019H.1d\u0010u\u00175\ftX\u0013*Mі,e%[RؕԃR\u0003$?HI\u001c\u001c%=hl:\\ph$VNp[%\u0002DB\u001f\u0001/c\u001196\u0000p\u0018\u0005H\u001d\u0012\u0007\\Jden@.G\u0005$djIvrQk#{'\r\u0001\u000e\u0015N~Z+%e˵!>\u001dISJOJJ!>TԃR\u0011GiZR\u001di\nW\rU\u0001\t.\u000bF6e*;YC\"GH\u001cC0S\u000bb^$\fHdSɪ\bW4JAl$6O%EAkGpJ%)i\u0007yxdQ%\u0006k\u0001~rڎd)W\"&@*I{@p\t^njӡ7ҳ\u0011R\u0001zԆ7㣔\u001a\u001eŮMh\u0010\u0007\u000e65H'ڙv~ƆdR\u0001D\u0010>Nj$=|\n\u000e\"\u001fޖ @(Jj'kP>MCoOf\u0000!!g=)\n5E!M\\\u0005CV]o\tNP,{ʫ^i%*\u001fi-K3gO\n'I\u001dh\tf2o`5cjw<yak>\u0001+j\u00079QFRA\u0007YFԒ,^{\ry\u0006,@\u000e^\u00067\u0014tPWe1:֭${N\u0001\tC4r_\u0007QZpQElySs\u0016L\u001c\u0017eR8[K4oCHe\u001b8YW\u001cS#MW\bl\u0004Gg\bE$\u000bnI.H\u001aH,\"]%R*MQ> o4>\u000fE\u0018c\u0007KO<4;\u0014ڎ9r@\nҐd]\"\u0013J\u0013\u001d#'I/@\b|\u0004j09ӴKA)s8PcjT)e\rH۩Mk]`\u0013zFwS\u001f4\u00073h#m\u001e\bACO=I\u0002Wq3q@7CKE\u0012\u001b֐m\u0015JS\u0005AA4\u0005Ȇ\r-\u0012U\u0019\\i3Vk6\u0003(sՔZ\u001a\u0012\"QF\u00127\u001fyR#lϓzH<:٠-BPL\bΖZS4W\r8Z\u0014\u001c\u0013HM0-Z~&K\r0Jd}5e4\u001a$֚*I\nA\u0012ZRkC3F9h\u000bcc^Z\u0013i/,<\u0012\u0001\u001a\u001ay6,7%Nm~\u000b}mjK3ﻀIYSnڼUTshp;\u0007\u001d\u0005ڴʆ\u001aK Bt\u0012j暒t\ffR\u0005gkʤ3)$)\b\u001b\u001a[2f\u001264jfɡKy\u001d\u0001qES\u001cBӘ[\u001eu\u00154e\u0002-mme%%#u\u000fEr5LA\u000b=<\u001a\u0015JR%\tnG2rK{܁zZ@qT}\f5E\t\u0000F\u0011\u0004Ǚ\u0012\t /#`\u000bRR6{?5ͤ\u001aR}䒁Z\u0002Oa'Rv8ż\u0010\u00171]/o\u001a2\u0005;4p\u0012MRP-RѐT|ܭ\u000fBiRR\u000fS*S\u001a,\u0019$\u000bw,\u001dGZ\u000bmk\u0018,\u0000F-1\u001a\u001d*IN#9\tH=HҼKRg*gDiC#1*A$Ż4@Ȓ&3HҤ\u0018I\u000f\u0005Ҿd\u001b\u0013l!5ӫ!`_i4\u0005M!3\u0007턭\u000b+qLve[RƼ-ؼYi vҙ\u0005\u001e'U\u0012A7y+ bʂF1%{(r#?Z*)fo\u000e&*MO\\uYH\u0017ke\\-\u0013ɟ\u001b8ۂ`\u000fy\u00117T&\u001c新\u00074Ja\u001fҁ=١$%?MJ0ȁ\u0019{QU&\u001c(M%=HZ<\u0011Ea\b<ȕ(ڬJ+6\u0016e6qꍩg(A(Hi:\u001ajs\\[\\fVc@;Q8Q\u001c4e^N*\u0002Fd\u0013\u0005\u0014%\u0002H֢VI2Rx.U\u0005%&L\u000b Y\u0010;Z[Se\u0019I-\u0012Z|\u0006%gXKYt;r\u0006'\u001cI=v{R1D~@ZTR&\u0002w%\u000fH^;\t\u0016/TI\f\u000e\"Ac$HS\u0013GV\n6\u001a]\u00120zXE\\snR~\u0014n$Vh\twC8$(}CڨM\u0004e/X)#tNE\u0016֞Pr\"ֆTQ\u0000-\u0013)iQXTOr*ц$.Y\u000b섽%`z֒ʧ/jTst@0\u0012\u0016(%b)F{[\u0019*Z,$h'`RٵZ6dSR\u0013h$r|u$jNn+\u000e2HG\u0015\u0013\u000eS'0y \fJIeCT\u0003\u001bH\u000f\"\u001amIT){\tj-.;'Э쇨\\9\u0011(#&.=\u0012\u000eu31\u000e!;RxJŕg%n%ABIvn6\u0018j)\u0000D{:\u000b\u000eMcKh\u001dp\u0015eU(B\u00027\u0016el,.BWFńD\f\u0019\\\u0012\u0006dQ\u0001B\u001bڃEM\u00115L$,N$LH%I\u0007sԪ\u001ac&;7Ѝ]\u001bI\u0005H%\te\u0007\u0012K\u001c\nA.aq/ԁY ޯR<t$z/\u00173eu\u001b9\u001c3!)\u001eC[SFi\u001c52z[d&6f#%'\u0016fJpϿ[RZ\u0014ѳ'\u0011ZRYr\\\u001aN#GwXd\r;*|ܐ2g=My@Y\u0000\"5;|SBQIF\u0002j\"d+4!Y<jL\u001b{4I}iYj\u0013!\u0005t*R\u000b̬) \u0018 k&9\u001f\u001bTD\\\"\\'AgOvymhT4\u001dN|\u001agp\u0006\u0014W\u0013\u0016Įؙ\u00189,hm,A9\u0004^֤mpNE\u001e\fC`hԚ3\u00192\u0001͡\u0012]%Y\u0002Chjt!>RD2զOhOPs\u0002.n'YFШ3'̙Jnim\u0015֨r\u001fٟ7Qў䷩n5y>\u0012\u0012d\u0019P٠JNUS\u0004qf\nJ\b(Thr\u000f:{\u000bmXC6j5V9\t\u0010ڒ\\\u0005[=\u0018\u0011B\rvH5p#IPU+\u0002v#mM\u0014\u001aZ\u0007\"~\u0005R+MKbxpr&3|v\u0015\u0014\u0005\bKI\u001d\\2bq2q\u000fs9Jj#uq\u001b\u001cvd;G\u0001抪}xImZ|\u0006\u001f\u001aޣ\\n'ohoTI#;mJs9Uo\u0012Dx\\{0\"5\u000eFyCГME\u001au\t3C\\FeT\u0002̡HJ`h4rvdo9~\u000fJR>\u0011g-R)6Fwff&NI\u001dj4\u0013RdKrAUi䩗p@*\u00191_k:IS}hQVM*j\u0012R\u0017,HH%ŭ75dm\u000eNYVmHifA{tY|jh'\u001cژ59NvܠQC6#!7\u0004ʢ\u0007\u0015Y͘45\"m\u001d-Mɦ\bo'Eq\u0007\u0004L$\u000esr,y%%L8D,ګ\u001cBE%T\\\u0007&Q-T`0j%l_u[*\u0016%Trv-)b1\u0015Z\u0004ŇrEL\u0007|א\u001d:5$Jɳ޼z\u0015\ni_\u0013Pe٨F\u00051okBP\u0018\u001fGegJ =ؼ#٢yr)\f:e9;\u0017\u0003v{[%Ց\u0004\";m$mG$!x\fmmr\\X.c+mn5F\u0012턋mdY\u001b\u0007#ۇ~\u000b\u0018Ȱ\u0007\"3\f\u001cFB\u0001\u001bЁ\u001a? W\u0003)IM\u0001\u0004zv\u0004W[@29O=\b*\u00195n}U\u0000\u0007?ߎ$-\u00048\bϵO5teT\u00127\u0012bXʦ)\u0005R\u0019OƑ(r|;9I_\u000fіur`\n\u0003h\tw\u0000Vcn%#Ke~?xr~lBNz\u0003\u001dEZǒd[_@$7r\u001f\u001b}_Kfe~1H\r0443]oYnq&T g\u00021RDj\u0007/5*vE;:Z=途ґ6e\u0010rHT \u0004obgjkkQ-M.\u001d\u0006\u0004\\XH7\u0005\u000el\u00127\u0012h'\tp\u0000ڙ\u000bV\u0012ڋvR\n=_l$\u0015$Ꮟ`?#\u0007c[]-ꚝrv\n0T~GJC\\BTA3 t*r\u0005MyP\u0000L);6L\f\u0002\u0011r%[)\u0003nF\nt|\u0007\u0019I+Pe\u00198KT)\u0013\u001aX>?Դ0*sV\"u\u0003ȄCI5saBΖ!GU\u0018vؐ^;:\\\u0003K6v\u001a\u000b/V' #\n\u0005\u0018ZSYZ\\>͢\u001a>n'ǛJA\u0000(KZ.|(6bq0şhy0|02F!%%TR9Vh'rÐ\u000bJM\t,'gzI0r:oqޘFe\u0006J4\u0004f#GrE.ONd/?wlT'\r9W\tɉZrZ?tN^Ȣ\"xjs.\fi\u0003R~61-\r͵1?\u0004$O*1ve)U!T9\u0012zP\u0011FiQGμ1PJɂ\u000bd\u000f\\bOfi49\u00159\u0011\u001e$j\nZYdCõfe'irz-΀#̫/\u001f&-`GH\u0000Ү$a\u001dpv\u001cG)5\u0015_L\u0002+SgMLy&S1b\rutdiYlԒb8c܏YӪ,\u0012#\u0016\"ΕB뤐9\u0000Å\u0016\u00070=Y\\\u0001\u001c0g&h\u0002ȇv|FN6D1\u00199H')dj1@ZNj#I\u001aI=a-]lbKZnU<\u001e\u0015BEx\u0003Vn>r\u0019o#.\u0003oq\nӏi\u0011YOn}%ZׅkW\u000b\t[\u001e\u001a\u0019Vj\fk׺\u0007x֨}@\u001b\u0000ט\bH0*\u00066\u001f\u0013\u0005[~Cm\u0011J\u001b\u0015ּhc\u001a}qF\u000f\\(Pa\u0015M\rMpT\txli\u001fLRj%Vk\u0013\u0006S.X\u001d:%gd\u0016\u000f7{g\u00152kf~5/4\u00136\u0013ofo*ZC&|\\\r!ZЭZ<n*keS-p\u000fuZh\u00031K}V,Bd\u0005XᲺ#m\u0005\u0015*+\u0007{N\u001eV8xur\u0019XYt\u0019ptsLEy%{{r^\u001dQ\bZ8A1/\u0015K\u0016Ԛn+V+k\u0016-e\u0014\u000b:)\\X*\u001cE\u001f+gu=܃\u001b\u0002R29xF\\XJYx{vv\u0015{pQ,\u0004tV8Vw\\on\u001a'ַ\u001b\u0015KX<@.\u0018i)\u001cmLM\u001aFf|{su\u0003uC\tbrݻB|;Ɣzk1n\u0010[6FO\u0019@\nkڱl?'X2V(k#&7[\u000b)~L_E\u0012qe䖉B\\\u0018\u001e,\u001e)D2M\u001f$\rBsAAgt/\u0017ju7=ef=Ukza=\u0019^oXo3*\fِܺ!oX/;'\u0015ړBcˮ+\u0004\u000fһzYݺp1{1k\u0007F\u0013F\u000b[I'2~Q}\u0004nGXO> e\u0000~SĘ1\u000f\u0007\u0003\u000f\u00193\u000f\u001d*&4MS7&ԿCe\u000ebBP{p6t\u0004I\\=;\u001b8\u001c׌\u0015\u0012+\u0011\u0019C$jaB0z\t\u0019\u00010o\u0014f{Y9V\u000e'EAٽ2GAA\tzy7V\u0006$yŊbٗz#c\u0007tף<И/wd\u0015\u000b\u0017,W8fMCf3fӯ[9轺98+F5VKW(\\\u0004?+f]P'KWpy\u001d\u0014+8G\u0016\u000efC2\u0001\u0003L\u0013od\f\u0004]d0\u0017<rq\rAA=h^_R1 q\u0000\u001f95\u0014dn\"\u001f[:]2@\u0017=\u0015\u001fY2Bo\u001c'&Z\u000b\tĈ\u0011HGqĨ\u0011 ?D_7\u0010S\u000e\u001aqbBx/=\u0012\u0013\n5,\u001dvmd_?\u00105ؘ1=7ȼktXcp@1$\u00187B\u001f\u0005֥\f2x\u00044\u000ei0t\\}\u001ek{r\u0001H$cB\u0012̔6W\u0017rxx\u000e2\u0007\tIUw\u0011|?g]//\u000f\u0017=\u0004d^ۃ\f)\u0006\u000f#lg\u000e\u0015KG;>\u000b\u0012#Fq\u0001\t~ BJBRӻ|v\u0014!c\u0010U1_9O\u001b\u0000)$N36V}.~oM\u001cÇ\u0015\fS\u0007h.<0>\u0019<'gl$&NӇk1\u0001Q}abrD6,k\b\u0017ч\u001f#y{^=ٸql@jGj\u0017K\\pz\u0013{8sA\u001a4=\fYX)V.c\u0014NznzL@L_3\u0002yn\u0006ZW`V'6xD\u00032\u0007kA?ݜhnNg7x\u0007//\u001b^>N\"t{ gt@/~Mr+\u000f\u001f\u00061;Ⱦ~U7\u0010؝Y\u0013ՇK\u0017\bH\u0006R\u000b%#ŐaB@\\aMT_1p1p\u0014\u0011ыZ\u001d݋\u0015rw|ljD槟\u0010\u0018\u001f\u000f\u0018,F\u0010Bs1i|xH<Oqc¯f\u000bGbjbTH>\nktHн\u0002en&\u0016\u001f\u0015sM\u0017mSŸ1\u001b\u000eD\u0013t.oЙ\\`\u0000+.8u \u0015&\u000f%Ȍ\u0018db>E:]Hm$׏C\u0019CP,oH/ÅЬ|H@sЗ\u0010^8\u001cylH9.{dS-S`\t\u0019mYӚå($65P?ޘ}|1\u0001\\Rx1\r*a\u00129O\u001eP1)\u001d\u0006e\f\u00060\t@4\u000fu\t|lh.t4\u001f2\u00187\u0001*\u001f;\f2\u0004yD\u000b:\u0003\u000ex\u0007\u001baB\u0007\\-]XYA\u00073H\u0016\u0014+\u001b\u0015z\u000e}\u001f$#^\u0002v\u000f;7\u000ff_w3-2\u0007YmE{}\u00132z#H(Ȟl@\u0000X[\\D\b>f\u0014\u001790\u0003\u0017>\u000f/\u0018%=#{q9a\u000ezAdbA\u0003\u0006\t\fn=\f\u0002㼧\u0015^Ӡ\u000bAG\bk!{؇\u000fI\u001b\f#\u000b\u000bY-\u000bٻ~\u0000 D8>v\\;\u0001awl\u001f/\u0010Q2O\u001dg<U>\u0015M\u001ek\u000b'\n\u001b'#`tq#MBiĈaH\u0017czu\u0000\u0005绮7\u001b<P\u001bɯ\u001bE\u0014\"+F\u0003\f\u0004BvT>s\u00141\u0015RB;|d\u0011^?\\h`\u0016t(<\u000bCt(.<o\u0018\u0013%!}$>G\\\u0019l\t;+\u001b>m=l\f38\u0001f\u000eR&0\u0003@D$wY퓱,fMf\u000f\u00163;q\u0013)C\u001a\rk\u0005e\fb#sî\u001a̮\u0018mzThX+Z41\u0018X\"]\u0006\f0\u0007np\r\u000e?7\u0007\u000e\u0015\u001bƃ\u00189\u0018_d\u0017\u0012QHFi\u001ehޣpQ}(\u0017\r\u0015/Hh9X\u000f>5}\u001d#ߠ\u0001<׸1LDP\u0016k@3'6k\u0000q\"\u0003>s4>|$\u0011ړE\u0014\u000bIWxc\r\u0019#p\u0016Pߌ\u0015'\u0019\u001d\u0013\u000be!{\u0014З$\u0003BDp{> Hd\u0013OT;\u001e3\t;=A|mD(ؠ\u0001XGE׌#G\u0006\u000eP-\u001f##?.t\u00103\\\fK\u001f\"\u000e\u0007\u001b\f\u0001:\n\u0010$3Ha\u001d\u000bk(j,R\u0007>*kl!\u001f\u00047WX\\D0\u0001=+\u001b!\u001d验\t)\rs1Uc@\u000eM\u001dS \u001b0FLcswMc`JՏe㪑O\\7\u000e~΄-S\u0013u\u0005CA\u0017\t)\u0013Y$t7Bֶ|,h,|\r\u0007!\u00136\u0018fnyT\u0006\u0002\u001e\u00172\u000b\u001ee \u0004lx0Л-4u/\u000ft\u001f\u000fR\u001aC\u0018t\u0010S<\u000fL\u001bH/\u001ff]o\u0018\u001b.Ac:Ը\u0016\u000bd_y5}3\u0014\u001e\u0016\u0000\u001bzC\u0003]\u0000\r,)96>f\n\u000e࣊Gكؘ1l\u0019L\u001fTl@ \u0007gke=3\u0003\u0003إZ7M\u0000\u000f@e\u00180dz\u0014bk1n\f\n\u000eӝBv\u0019\u001f0x@6\u0015\"s&sy{f<\u001f#\u0006\r2Ŕ5??\u001e\u0013>`>\u0017&\u0017\u0007\u00119ð\n\u001d\u0002cɃC~uFJ6\u0016~$gXf\n\u000e^Er\nx\u0001\u0003z\u0016>g\u0007Ch\u0007\u001f;\fp\u0016SClxGlN;ҥ- BT\t֕\u0013?\u001fƚ(\u001bp!\u0003&{\u0014&y<\u0013^d%}\u0010~>of!\u0001\u001f\u0013\u00151\u0016<-:\u00118\tA\u0007\u0000\r\u001a\u0006\fbbFrh\u001d\b\u001dA@~Ⱦ{rI0YЛ\b\u0003ܲh|hߤ.n^\u0011=AW}'ƫ3\u000e\u0002\n\u0006X9#\u0017\u0015Bzb{\n#\fn81g\u001a.{0\u001d\u0006l\u0004\u001bc{p.k\u0014lZ{L|\u0018&j4\u0013S6*\u001f$6\u0003\u001f*y,\u0015;P:#Q+/\u001f\u001bQ:\t\u001ahl\f\u0002\u0014(ɌH{\u0006\u001f@XW8\u000f-\u0019\u0000\n\u0002\u001bX_e\f&bF\u0018\u001a/4w7/h~\r?64v}B\u001cOn\u0000u@z5\u0010X\u0007\nawA 5\u0018\u0013D<?\u0017|~\u001bĄ\u0002\u0007>dg}}\u0001=}\u000e$\u001cL|(\u001c[\u001dB>\u0004\u001f51/l'+#\u001f\u0005\u001ed\u0017\u0005\u0004=Ģ琿\u0003\u0005\u0014g.=>\r.\u001b~̶I:}O]\u001ffzz\"KGpca;\u001eڃ^\u001d\u0013\u0019\u000bܓ\u000e@s0w\fw\u0014#\u001aa\u000e\u001f\u000bX\u001a\u001e-X0~|T0Ч,/\u001c&k:E!{\u0004\"\u000f'`\b\u001d\u00133\u001f7Q\n\r$\u000bhWVά7!~Ȧ#,\u0016\u000f<\u0001g0HgMFp_>w\fX_`H$!yh\u000e3\u0007\u0007v_\u0015C:\u0007\u0007r\u0007\u001b|z=C{:\nh- \\\u0007#4\u0007p\u0013ڴ[X\u000fG\u000ej+c`AY\u001f6=\u0000q}8 n00n\u001a#2N\u001bo~fh)^_\u0012\u0018Z}ʴ\\.M\u000fuLF;\u001d,\u0015#!=X\u001bޅNŖe\n\u0019V\u0004\u000e\u000b\u000fk\u000bN\u0018\u0000z\u00132P\u0010Aآj1\u0002\u0004Aq\u0003~\n1\u0001pi~0V@X\u001bHhr\u0003\b[F\u0017@z\u0011\u0018p{^>\u0012Zd}\u001b}\u0003{-\u001edl\u000eakX|\u0010z6Ge'TLۓ/٭Mss06Af|\u000f.u \u0013Q4\f==k@w\u0001lAAW\u0002/\u0014=\u0010\tʆ!C_\u0010߄|6kqL𙑎_&`d,\u00131^\u000f\u001a&ֱh-\b'\u000bK\u0016-Sݢz\u0002~FXʴ~\u0003JzYkfN\u0001CXa\u0011\u000f.~\u001ca\"\u0017U=\n޴g|o'\u0001j'i\u001c]\\\u0015NG70=j\u0007 'ug\u0011\u001e\u001f\t2\u0015\u000b֡m]\u000fƐ\u0005\u0012t'{=v>}\u0010?\fx\u0000\u0001w [.hXW6VP\u0015c̈0.]\u001d\nf+\u0017ο-/؄1\u00019\u0000\u0017m&77^.>\u0011\u00135\u0018l\u0011\u001a\u001bOo\u0005yLn\u0016A\u0016'cRDEA>\u0018\u0016?.}0L>\u0004[u(x3\tI;ۦa0AHm\b~,pBL(1\u001a\u001b&ұ_>|3\u001b\n|&ȲY\u001e\u0003x>h~ӓT\u000fZ-ҙ5\u0003R1\rq5?س߫ظ1\u001fҾ}Mt\u0005\u001dzsg\r\t&sh\u0006S}Q6k1k<\u0017\nt\u0003+\u00012Go5\u001dۥw?F\u001f>lYLYҕz\u0005p\u0019 \u0017+Mx\u001d\u0015)\u0014w\u0001s\"ă\u0005k\u0013=<'Aك8[h\u0001}5B#\u0017`:.\u0016vQUذr[sA\u0005C@/\u0003~UX\u000fI/\u001f\u0017\\8\u0004.\u0015З\u000b\u0019¯N\u0003I\u0006\u0000?T\\:1\u001dv1\u0019W6F51M\u0000\u001c\u0018|!\tBP\u0000.]CY{7K]?o~\u0005\u001dW:\u0012QXc\u0005,\u0015\u001b8\u0018+\u0018{Αy,\u0007\u000e)gt'a\u001d14m\b2oh/\u000e0R:.e pb\u0018?T\u000e⃐$P\bs;\u0011~܀1\u0007\u0014\u0003\u0013H7igKς3OTO]Ә\u0011l\u0014/\u00119C_e\"2!hl^bNgZ'b\u0016\u001fŤ[s1/\b\u0005v?!\u000bꪖIm{\u0017\"\u001708lch=G_Vfn|\t/\u001aF!\u0017\rְ\u000e+s\u001bR7>c+O\u0004O,\u0019ÕŔ\u001e\u0015KY.,[\n͂W_P[;?\u0001\\ͯIG\n\tx\u0001\u000ev\u0012M\u0003vu}x\u001d\u0001_\u000bt\b\u000b3y:\u0013^\u000f\u001d9Fs^0\u001f\u0001]rl\u0016{`\u0006\u0017Q=\rbj2\u00017\u001aF\b\u0019š{W\u0005\u0000\u000b@-pdza1}!&$foz\\k0Wt\u0019>\b\u0001yC\u0013\u0007lr!L&V*\u001f.1R\u0017ɍa轒{^}hwx\u0001[W<\f\u0018ptLh\u0010\u0012\u001c\n9w\u0000\t΋a\u0000+q\"`e̗\u0007\u000e\u0011C\u0007[\u0006%>\u00100\u0016<\u001bp\u000bhL&p\u001dS\u0010vqs\u0002?\u001b͘c\u0000\u0007&\f\\@'Rug홒og3\u0005L\r\u0010~`|{\u0003\t\u001c\u0000'wxoITiᢎ\u0001\u001dT8\bl\u001apZS%m\u0006;$Bt)-]p%ٌ?ȦDtPu\u001etk>o:\u0018Gh#\u000fkdטrdj0U'5{a6n4\u0019U}Jmp~ӛym\u000f?:<F4ׁ3נ5\u001f\u0010\u000f\u001f\u000e[\rl-LD8}.z\u001c~Ik8a\u0014~\u0011]-SxC\u0010Vb7\u0016}=n9j6x0@ْ}\u001f\u0002\u0006~:ULx\u001dK\"Cq|\r#ȉkIBRx\u0011^G\u001d023'c\fm񃸼-ӸMc\t\r4\\땅|MGnWd錎1Ec\u001a^ჺSBHw\u001f0G:\f&<\u0010:T\u001f\u0006\f\u0011\u0005\u0018c>\t\u0003Wxx&}R=x\bu.{TxFׁC\u0004<\u00018\u000ft(Lt\t\u0015]rd\u0016pSbR\u0013kALK\u001fĺj1s!5\u0007$3A\u0001΃u9[\u0006\u0015.\u001ebɵ\r\rg]&mzɀAA\u0007@>\fؒh\u000fk\u0007G\\҆w'@\u0014\u0013['\r7r͝\u0018`C\u0019/ta\bM~\u0004zi6G\u0018p?\\\u00019[\u001a}jh@\u001a\u0001|\"\u0018SMbP Mm\u00036L\u0019{\u001cO@\u0007D68l0L>\u001at\u0001rs~\tƆV3w\u0007\u0010asvL73\u000ek*0c\u0013G\rV_\r0`נ0)\r=!z\"\u0001ǻ\u000b\u000f+\u0001\u0010p\u0004A/\u0002?\u000fǖ\u001dQb(`\u0018l]-lv5V._pDiF{1f\u0002\u000f%\u0001?.j\u0004(N+\u0007\u0002;\u0003\u0011l\u0003\u0016i$kXO\u0017\u000eq:~1x=a\u000e=n<}2Iq>cl(>\"}\b\u000f0F\b|\u0002\u0013t\nf.\u0005\t\u001f|\u0004ˍȷ\u0001\b\u0006\u001c_c\r\u0013#l71\u001f\u0011\u001fyBp\u0010?Z\u0003>k{b\u00169ˬt^GdNQP`x\u000ez\u000f& /)d_C\u001a3Z&û\u0019ו\u0011>@/Z%oG\u000b\u001b\r\u001c)DyOX\u0015_u\u0006]{^K7^);8{\u0007\u0015\u0012\u001fwh=UYG\u0017\u001dIo\u0000|\u00151ߍu\u00123F:\u0013YП\u001b;vg\t\\\u0006a[w\u001f\u0012!t\n\u0013\u0013r%'\u0002\u0004\f\u00033W\u000bi<olog\u001f\u0001K5O!\u000e|\u0012,\u001feLm6\";\n\b8\u0006KX5\u00040\u0010q\u0000|*ʧ|Y\u001bј\r\u0017>1u54\\ҹl\f4.\u001dr\u0012R\u0007\u001eau\u0017ʭ\u001b\u0011SLk\u0006\u0000\u000ei9\u0013%\fW8f v\u000equP@'7pX<{oGᢊ\u0017lA>j\u0007B:O\u0010+\u000f0q]bVT1sdb\u0012\u0003h\tY\"\u000eDR\f\u001c3E>d1o\u001fbʭ`AOen\n\u001exgȂaA= 7\u00043U\u0010$Hΐ\u001eo\u001d\r\\Jnzchw,3C\u0016\u0004^\fK\u001e\fs $sKix-h,2!0a\u0000l\u001c嶶\u0007ȍ1\na >gH//$L\u0004\b.#߱c2AGJC/so\u000f\u001cLmz\u0000)\u001b<\u0010O~\u0005G=\u0003ʬ\t\u00039<=\u0018c\u0016Zj/܎?r(\u001f+\u0007G\u0007\n\u0001΁\u0000a~Tp ЋN՗ił)}b\nF\u0001\\/aѵ<o#\u000bC\f\u000b\u0001\u001f\u0018\u001fWd3/t|\u0000a.\u0010p9\u0011|Rx\u0000'#ƅ);bch7_\u0012Ԕ\u0010O+\u001c8(hƵ\u001b|\\hVAyqFG>\u001fn/\u0015˗Q\n'1l\u0014kODq\r=O0V??H\u0007rq)poQS\u0017\u0004\u0013lQ[\u0006L6\u0016|Od\u0007nŜ}|\u0018\u001cGMk8*a|{\u0001h\u0010C1F!]:pKq\u001d\u0017aC\u0007\"CU->\u0011\t}$Qu\u0017tL\u0001?CŲ|\u00156)z6PbΖibF{\b\u0003N5dLFx`4±\u000f]\u00063h.zn)\n\u0010\u0013Fv\t[sV\"\u0013s\u0006yۧ\u001e3j\u0003\u0002vӳsS7\u001f/\u0002cPd3\u0000/A~\u0018@\u0012!8/\"l$r\u0000\u0003e\u000eڀ\u0007\u001c\u0015G\fF~~T?}r\u0019&\u0015l¦tD0*d\bȧkxbŊ%\u0014\u000e\u001fI\\C5!\u001c\u001aY9\u00128,\u0017\n\u001a^\u0018O\u0014\u001d/Q'\u00174zq1SZ@\rsх#p\u000fr9j\u00014\\p\td1Sr#\u0019\u0003ʊ[\u001dS\b'x\u0007\u0016B\r\u0013lDA\t5q\"B\u001d\u001b6g`V\u0010\"JF\n/\u00019\u0017mAWb=\r_s\\Ǖ7&Z|\u0002C\u0019)Bf$\u001eaw9p:2\u0001=8G̵\\YV\u001f׀n`:n-e\u0000%\u0007*\u001c\u00019$\u0003\u0000C̎IldT|cK5k{o@uZlt\u000b6}2x(z^\u0006t[\rw?\u0015\u0010.\u0003=%欟\"\u0014%\u001d2dG\\1C\u0007?l\u0007A\u001en<)te>zq>z\u000b_m!v'43vN54*;ed\u001dJ\u0017\u001d\b}әoL޶a\u001c\u0010#\u0019\\\u0015l/\u00001գ\u00007@\u001ep\u000f^\u001fC\u001e\t\u001b-rK2quwqG\u0017G\u0017\u001en\u001cM\u000e3\u000f\u0018GP\u000f'ƭ\u0013S \f\u0003z\u0004zC\u001b(\u00179,\u0014p\u001d\u0006\u000b\u0019`f]Pנ\u001b-o4+9i\u0019 f\u001c\u001aƱ\b;\u0018jW3\u0015_)ӄ\u001aA\u0000\u0007\u00009GĬ\rSĂ\u0003!ӴL;@C1\u001e_\u000eqa\u000eEkz0De\u000f\u0003\u001e\u001c\u0015Bg&̎w\fw!fn\u0002=\u0017\u001c\u0014\u001f\u0006\u001c\u0000\u001b9-:vc\u0005͵#\u0017װ/[\\,(p.\u000b\u000bĶ\u001b+Mח\u001aOjA0;\u0017ӕg5\\JD.\u0016\u000fpqcG\u0000\u001fcќ\"L5\n⢆ZM\u001f.lC\u00196=o1]}\u001aa)>q\u0002x\b\u001dY9z\u0006\fևc\u001cUy\u001ap^BZDا\u0000~^\u000b6\f<1\fၔVkBSJ;ru.BOZ;B̄)چ=*?\u0011UC\u001e&\u0007m9b6<Y\by?+i\u0005JSAD\u001e\u001aE\u0007fu]LR8\u001f\u0010K\u0005\u000e\\\u001aC7(#\u0006v|.\u0005,&y4.m `MK8\u000ep\bIM\u0013\f'{Aޗ\"p\n\u0007p}Gv^X\u001b\bv\u0004̚ޠŐ\u0002W̧\u0007ۅcG[\u00069?.r\u0005?\u000e~(&\u00071! F\t\u00154+\u0006:\u0007\u0003c$i1З\u000f@8zd\u001d?!\u001eSX\u0010k1~-8\u0000e<.\u001byuMd|p\t\u0000\u0000\u0017\u0005>%݂\u0007\u000bS\u0001]\u000bskh\\`<t{zSXWmx\r}3\u00107<Xln3^g\u000f\u0018cG\u0003G\u0004\u000f1Өt9\u0014¯8.ބـ'\u0017칔-T@Z?V$#㙌S½\u001f\u0001\u0006a\u001a\u0011Vy\u0017xV\u0018q\u0013Wk&]\u001al1\u0005|?_Ř6wT\u001c\"\u0002zM\u001c\u0002~\u0005t\u0017N'zEp\"a0-2\u0018GH\u0016\u0011Wm:n݅C쨒);>\bpٸX\u000b[Ɓ\\>\u0000lƴu-f}%6gҷObRк\u001aAŗ\u0004\u0005ra蘪.a=!f![\u000e~\u00142\u000e=\u00198o+ȇ\u0005\u000fEvr_0QPO35\u0000>\u001ed2̔9؊1l񡙘@9K(7|\u0000N\u0001\u001d\f\u000b\u0005\u0007f\u0005 7@\u001ceUDOSA|\u000fbCQ@b\u0011\u000e9;a\u0001D\u000792\u001e\u0002\u0001u\b`F׏\u0013\n\\R9A6\u0003{c*3nuҷ=s\u0014֦\r\u001cCQcÕ3۬n\u0007L\f+k\u00078\u000f>Y$S\u0018{@JRxV\u000b8Srp&N)\u001bc2l=c\n\u001d]5\u0012r\"؈\u0011l\u0016i-4\u000b9BpHw@\f=6T\u001fWb$c2\u0000\fri\u00131w\f\u0007y\bk'{\u0014j\u0005+\u001f\u001a~Yv\u0014\u0019|F5\u001f`+ZT\u0006Q\u0001S\u0002\u0019\r\u001f_\u001bu~\u0012\u001bA\u0013b~w\f0Ǵd\u001fۚ2\u001eb}8\u0006\u001a5mmwIήV\u0006?K'[sTwp\u001bc\u001c:\u0010E\u000f[\u001b_@\u0010)_\"\r>[K\u0001\u001b\u0007>'XϠ 6(\u0001 {\u0005!\u0014\u001dT\u0007fB\u001abL,ZCcB\u0012B\u0005?m$\u000bA\u0014^\u001c\u0007\u000e\u000b\f62k(֣9 \f2Zr\u0006\u000f0\u000eqHƫ'`}]zDŗW\u00023\u0013\r71\u001d\u001a6taL1\tᙑ\u001f\u0019vw\t\u00076-t\u0004~Wx\u001f\r@vA\u0000M!}jh:\u0007x\u0015NIwMckآ\u001f ?NC[`h7\u001fP&}D6m5Y\u0001ch\nO(1/\u0006\u0001~ni\u0010+6\\jA\u0007\u0001d\u001b{@\b#.{\u0007Η\u0002yӀ|\u001cꔊxDtCǅ\u0016\u000e<|q$p\u0010e5C\t1\u0015c+Bk`\n\u0003ŗ}#8\u001fY\u00061񀅅-ӱa<_\u0006\u001cu~\u0002<ϔS\u0011\u0003%\u0017\u0019\u001b&3xG2@.M`\u00006u\u0002SzҖd\u000fk\u001a\u0003z+\u0017c/\\;p,x\u0014P7\u0016RؒJ\u0018T\u0005\u0019r\n΢+/SW0\u000f, \nr\ryi-c\\\nR#>\u001fBL\u0007ln&\u001dV`\u0015 z!]\u0017\u001d]wZK$h\\\u0005>Bzn9j:\t]q\u0016P`\u000b6N Ą \bqFD?!{F^FVĨQ\u0010\u0006>);nG`\u000f;kO3\u0015\u0007l@/SHOc[l`N;ۧc\u0016lvOǶ/mw0Y߃k?7w}\n1)\u0012ᚎ|o%ٗTӝO\u0017\u001fEלPM?A6K\u0003z\u0018\b\u001f3L\u0006\u00036G![vh6@ߟnH5^<\t \u001eC\u001dԆ'Ͼ`.a\u001cA?B\u000e+SvƎ\u001a6a3O0o\\A5]\u0004󍰯\u000b0\b<\u001f\u0006 u5\u0001\u0019~xJIBƉC\u0006qwdgdE\u0007\u001fq\u0006\u001cۭٴ\u001d\u0003\rF׍2\r)['\u001a*/\u0019%Jm.\u001fJ\\oV\u0007_\u0019Z@m~E8-~{+XZci{\u0013׬)ƀKU4ftn$St̆m;߸\u0016q_}Eg\u001cA1x1\u00111JA^\u0006|S$\u0018s\"ߞmxr!`\u001eMC7^\u0014\r]s\u000b;?7^ļ4[lП\u000bA0]_ \\o\u0012L9\u0003s8_ttc>.;:>1=GmGot6YNgh\u0019<#7ƫ\u001f\\S\u001f~\u0001#K];\u001ceË\r?6t9̕?h\u001d{qp˛v\u000fVsÕݩww7\u00070T\u0005%Uֹ9'x\u001au\u000feĭ7\fK\u0002VgOiT\tW\u0016psgz8\u001f&}*ro\r\u00153\u0010p75uծ{{m.KN\u0019\u0007y_\u0002i5\u0007Ǵr\b1;={\u0001\u001edjb?=2\u0013_\u001bn9\u001b-\u0001\u000e7\u00151tr\u0004:uDCI.\u001f:h8_y*o=q\u001ee3~J<\u000ffO3^*\\}>򚧏\u0012on\u001b\fp{vYlPl%ڹ\u0000O`^\u001f1\u00106u9mE\u000f\u0016Gg\u0001VtKm$\u0017u[95m\u0014\u001cb!y\u001ct`\u001f\u000f\u001d\u001d\u0003\u000fX==p\u00157w\u0017!E^D5D\u000bvCgv\u0003Ashו̎7NԞN잇4\u000b{\u001e\u0012ă7V\u001d??tՍp槆O\u0017 sLw6  c'K!^u<\u0004\\ir21m7\u0016Q;\u0000n@s\u000e,\f\u001b\u001e1l~>e\u000b-/;0~f\u0005\u0003+#{\u0005\u0003X7\"s\u001fU.{\u001ePFP*=\u00198f\u001fu4{\u0019.\u000f\u0013.^sp?\u0015\\52[V0ϗ'U`\u000b]A\u0011u\u001dx&_-b.X\u001b`N\u001ea=\fA\u0005 \u0016(ח\\\u0003/·q\u0012ܦ\r]Kg+ϖy_}Tbs~@W\u0000\u0006Fp)\u0012z.\u001d79o3q<vG\nn\u0016r\u0018n\u0012Hu\u0012ż|F-E\\*\u001e\u0015^*=7>]Rσ⭫\u0019h\u001c\u0005_Wq'\tn\u0018O\t\u0013o\u001f\u0014(炅}׍_\u0016m{b<xÇ@]\u0001\u00071~o%CMzn\u0004Iox\u0005Yh{}Y8\u001f'\u001e\u0013ÿ飯\u0007ɧ~̱\u0017FK\u0007\u0003?OW̅g\u0017A̙}SU\u0017:;sib|.R\u001c#wzs=\u0012C˃\fm?-{L\u001e\nNwv\u001d鸿̰|\u0015ooKk\u0018zS'z\u0015\u0007;w;ץ=oV;\u001f\u0018\u0003\u000f]\fRF䯞\u000fςK1\u00062W\u001e2W\u001fP߼\u0016O\u0019M7/xj#K=\\ܾ\u0017=t}u\\Nm^ԝÙۏc^xR[ZB!\u001b\u001a[3\u0006p\u00194.G~)\u0007૜ˮt\u0003E\bG\r7\u00171Ň?rbîߖO\u0018]:>W_B|ˏK\f{\u0019Ovx6ein'/\n\u0017wu|C'lz\u0018p\u001a\u001c\u0012\u0013jM\u00137\u0007h8\u0007$\u0017\n\u001e{t'e6eb\rՙ\u000b/e<YMdegunW\n\u0015\u000f;雏#x\u00061ŞS<Æ_\u0006h\u001fsoz\u0014s \u001bv\\p++?wxjxZ۵]a≛AAɻ!^wOV\to#y\u0012 ~!X8u5\u0018<W\u001f\\wy[|\u0013u7v\u0012k%ӻ9ˮ\u001c\u0002X\u000br\f\u0017楿/M\u001c\\k^O\u000f\n?u\u0016W\u001e'\u0019/\u001c\feglogSU75Զ7ˠ㗂\u0007x{\u001a_ps͝9@`<2\u001a=e\u0013\u0004\no\u0015za\ná\f^+qΫ9OV=\u0014p[ϓ/O\nd\u0017oD߾tc\u000ff'=;S5\u000fv6\u0006um\u000fT\u001f~:nKݚ\u001dծO0?>O\u0000GXW:O<j}4z)Rm`_Otl}aNLǃ7O{>>V5ܵXW;%IΫc{Xꪠi/+>q{[\u001e\u001e\u000ex9ƍ\u000e5>\u000bvE[:\u00078}w><Wֱ:\u001d]x3û\u000f:j6Ϩλ_\u00032loߗ?.x~2V%Ɏ\u000bU{/$Um<V\u001dZ#\"|zZbUW'';\u000f]NuX\u0013&Tz/_\u001d\u0011*\u001eyk\u000b\fg9W\\7xZ}\u001e\u001eip}qw'Uxr;gճ\u001f'\ns\u0003~ru\u001fc(̕a\u001b0Oo%Ü~r~1\u0017;]sl[sV|̹\u001f~\u00016׭Zx%FNcڍЮ&k_\t?/~zPv`CU6Zrq_\u001c\u0003=![r\u000e|W2ls\u0013v^lym9Ufp~땋+ܑWm(>=ӹl\u001f\r͋i>5z?b!F\u0017+65e,lNYr-.fz޹lփPW?T)m;SS~'fʎ\u001b\t;$VʾW]p>JNuښU\u000fUϟ\u0017^\u00052_v\u0017\u0017O\t\u0012O_\u0010ev.'<\u001fF>\u000e\u0010ҵ%kKs@\u0016<k/O_s8q\u001c6<U;nz1UU~v<9d-sa0}NGf\u001bF!nw}~#U~\u000f7un\u0018{.z~U⊢\u0015/'W\u0019_qfTŻ\u0011gŔ\u0012[vFTQ%\u0017/_.p!ń\u0017S.\u0005P\u0012|G*\r;[gjsav\u001cz\u001fⶼqdZ](lyB3~\u0017Eܓ{G⫛OKS\u001f\u0019_](s{q$r1\u001c{d࿿o<-VLe▂9C7~ul糯k}~&^Em+ތ.;u'ۻQϓKOތ.=v-\u0000Zw믦ToRr9:jA\u001d.\u001c.Lwv.5/\u001c|JC8\u0015v\\۝\u000fUg\u0006;^7/tt\u000f<wÅS&Cq3JN_c_K]n9:閭miY\u000bOָ<W!zd\u00031M7jo5\u0005ko\u0011_/a\u001fJ}!1v~]\u001dj|WhN\\<~.ع=\u0017\u0012+.W=ZſW=4^} @p3?'J|=\u000eF,$yj.%_+k>^[p9~<黷.w Tt)lfƳ񷪐|57^iCF1iř+\u001c{B{0\u001dpwk[\u000b\u0017m\rɁ\u001a\u0018дasjlŎ\t\u0015\u001b/'W\u0011WqNT;\t5R{\u0017\b?%:RpjNmÅgӫV\u0004n\nZQi|~ٱJ\u0012B~\u001ewo\u001do\u001e\u0017B:\u0007vu4z?S7U\u001f<1<{4Y*۵\"ǻ=^\u001etzvS׏ޏեܮzd÷olM2ĕ\u001c\u0012GlT:]\u0007OxɖһiuSt\u0015O޺.VXꭸ[n髷̊\u001fz86o߮e_0K{oU\u001f8:¹\u0018rmJ^Zu9iԺugW\u000bw[\u000fc[WS\u0017wC5']hZ׸TZ3I\u0015QrǳS5^O\u000fԆw5Ͽ>FyZ濞fя\u001f'p\"yڀ\u0007\u001d]uuS2o7r?uQO\u001e\u0016|ʳoW.nyiݘe[/9vZ}%vùJd*wM̼XP\u0011Vx{\u0005u:{y\fOȎ{w\u001f'>Ӑ~i\u0013+\u000eN}&\u0005}7虤ʍ?x>A6ryWX\u000e.\\.3\rE.V~\u001fo{0';7I=\u0019YzNl;Uŝ-\n߯\u0016=tt˫/\u0017+\u0007/\t-3\u0017ATsF7OaQ}BaqP1$t[\u0018wdE/\u000f\u0012/Ul<]Syu's7J,&\u000b\u000ew\u0017s]^)y\u000eE\r\u0017s\u001bןɬx>z+\u001bj.gԁr׸9YJr\tߎݍ*}?tèrwrVlI\u0010U9d2^xkŤ\u001e\u0014\u0013\u0015\u0014\u0015\u00155}Fw\u0014ߙ7W,\u0011\u0016\u001bS):tbb,jb`Q!V(V3Ua=|bxb9\ncb^Ε_~\u0015r'\u001dFy;s\u001f*;Τמ:P~\\B\u0017cˎPaQ%w\u0011 J\u0010DDQ\f\u00180(&r\u0015\fD\u0011I3\u0004%GA\t̎a1bitL3ㄽg=u\u0017>s{}yZnWC}koڸRq^ҧu-WJjm\fy{zk\nm^ƣꦻS6>x\u0001ϡVw\u000f\u0005g=v\u0019ym\u0019}ԧ⊕w慄^1t4\u0012ƍFVq\u001b!H\u000f#\u001d\u001fCOf\u0004Yi\fG㍭\f{$Z1儾SGKǂ\u0010+UH\u000b|r2\u000277/#_i*]z|a΋\u0005u.oPpjvk5[c{\\wbN\u000b95\u0017eto/ny$Bx\u001d_yZVG\u0011Ur(u)<kX6\u0005Mh ^E=\u0005L\"hL\u0018c!\u00034\u0018\rBZH|ivi/5gM>n.+m\u0006yM\u001f\u001e2\u0019͜@\u000b2u}T傺Su'Η5/oRR|amC\u000b\u000f˯?y>ڣgj㹹jn92j*o~zU䧍Mg`\u001f,qNkA8p\u00051\b? |V\u00157z\u0001gC\u0006\u0012\u00104H\u00107@\u0006h44}n\u0018r-m*G!\u001bۨp'QOw68WX|NͶK\u0005;c\u001bSsrVuaeswǪnlhWrꚯ\u0016G=^ُ6~zC͓Z_\u0018׆,EVq\u001b\u0006g\bχ6\u0011gsҚ|j\u000bN\u0017p<\u0017.F\rw-L\u0011}\u0010s+\u000exq2ȧ\r)wS549cY<&\u000f/m~<t\u001co`Kϭx5ՍZWE\u00128;!ZuMpw\u0010E CC\u000fh+\u0002j}f&qDh{\nZw{kF\u001b6^߰la\r7\u001drJNy\u0017O79WJi]^Uӆʛk\u001bfV\u0006Oj3<&N\u0011kgLF\u000f%cP\u001cskq\ns\u001b\u0006F6 2\u0006\u001ay\u000e\r_zت\u000eA#xdal\u0016Fy]\u000f\u0004wo|]{9!\u001f\u0000q\u00198/ܭo|[\u0007^˭c\u0007wS\u0007bԪ{y͡\u000eBR5|ď?נ\u001a7nmret\u0015_C\u001d\u00036Hs[u3\u001d6\u001bMY\u0010\u001cVr-\bOJXwi\u001d\u0019q\u000f;tBn}܇\u000f.nz|1k9j<s)\u0011φc\u0017\u001a6].n(f-UC\u0001mܧk0iP}\u001d\u001a;I&;&96\u0004K\u001f{ֶ,m{K68w5ą\u0017r;.\u0014eݬG~e=u\n^'L4ݎ\u0001kAYO}wzPm\u0004\u001aa~26\u00021Xk\u0002\u001a9\u001e\u0019hX#Cih'4\u00179,?t^=:\u000f'ެjT~W\u001eTe-u\u001fǶ\u0003\u00115\u0010oŶ̺'Sjw3Im/B{ˉ\u000bUho\u001f\u0002\u0010lMf'\u0011\u0006sH\u0013\u0007dn<\u001f\rGFsɐd\fd7\u001d\u0019sYT\u001f\u0013\u001a?;\f\u0007p\u0015lįȈG{+bnoɢM=X|і\u0017W:^)ݍ-ovV榾6Ȼo\njAh\u001f)_fZVP\f4\u0014\"x~?--\u0019k AӐ-2џFrEcmp瞃fs\u000b\u0018}\u0012B7gOꛒ+o\\my1oW.4_|JnylOO_n\u001b\u0015չ<\u0017p_\u000f\t6BXA\u000f&vDa\u001fʹơ,(S;d>j\t,%ZK\u001b\u001a>\u000b\"[*0\u0010K\f˓5'+Irq]\u000bu86khZXF=\u000bŮ]˪w1z:ߟ\u0005Q\u001bԭ8`:_n\u00172h\u00036p`\u000ehd(\u001a>\u0002 s\u0019b\u00124V&͏E\"#\nYLQ q4\u001a1B#ƈp374r'\fi#Z}oKCN\b\u000f}t$fgŦoꯟ(lyp`o>{9\u000fM7vz&I\u0013TsW}\u0006?hC?G\u0003>\u000f\u001a\"Smsd7\u0001OAfFӱmL\rm[̍\u0016!3Ex\ti( 4Z͈AK]\u0001\u0005\u001b^\u001b:\u001e\u0012l\nD\u000b˖)\u0018ĩ;\u001e~ӗY/\u0015܋{Y]ogw<R_6%J]\t'L_́\"ό͑\u0006ΐ2sDc\f~m\f2}8\u0014?\u0007Ypf#Syx|:1)B#g\u0007!yhs\u0016 *CV4nGB/KY۫)\u00176o,XSbE5\u001c{m;r-(q}W\u001ae5?Ŝ;nCG|\u0003{\u000fD\fim\u001aǣ\t~}\b\u0006\u0003S\u001ftl=}7\u0003M;da\u0004\u0019G!9QhT4=\u000fMpEc!K5h[:֢[\u0017>\u001bxL,~/,__^uusEok}hE6@ΰFiG\u0017pF\u0006YT|q0|ƿ5I\u00051\"^ؗYao4a;?\u0006dl\u001a/\u0013uSܾh52\u001bm#~\fLMFVjz\u0004\u001a;+\u001a_ƋjXrd\u001bWݾޒ8#cT/N\u0016Pu~º3y\r\u000fpۮ˩9~=\u001fƝ̶\u0005IU_l \u0006%\u0003\u000e-=<Lp\u001fhd6t\u0006+3K\u0017<\u0006}H<\u000eGV3YlSDb72\u001bƺ#Ah\u0003s\u0015hv~\u001b\u001f\u000eq\u0011̗\u000b\u0005{OGG<YWz|I\u0003Mgp,hY~\u001fg?\u000b֒꼞\nbkRi>\u000e\u000f\u0003\u0016\u001c}OFVX+/\u000eGd>\u0005ۊt\u0004\u001f#\fϵQ拐%\u0011\u001a'F\u00184nv$qC\u001dho\fUD0zQo#/\b=^\u000bbO\u0003\u001f).:[STesEݗ/4\u001e; %D|B?\u000bp/\u0012bܯ\u000bK\u001c^66\u001b2l׀o!!XI]\u0012e\u001e\fq?\u000e,?0+\u0002MqOE\u0013CфR4nbd-~ϛFcJ1\u001a;Acg*D\u00044]T3n7\u001a^Z\u0018^XRp\u0016}\u0014\"o(wE˞쩎1ۃ1v4wY~v]sM]ϽWyƚӪZ\u0016{\u0013Y+Ƕi\f!y\u00182#Cz; `/M,q\f2\nG3d\u0005\u000f+db` 8>^yRsqջw\nc~#@<0i濛;Խ5\u001b\u000bR\u000e^aa=\u0007!A\u0010\\\u001c\r\tZ \u001cbͣ^m8q%zFk\u001fs^n>=tɹf\f6\u000226u>r\u0018\u0010\u0019\r@\fqS}JdCI\u0011hZaMKڳ_әSxic3Ni-;\u0007s\fznCa\u0010磂=a݂c\u0013S^a= }.(|\u001f\u000b죐|\u0016b\u0016h\u000e\u001c;ܪn\u00123\u0012@OC1O\u001f$\u0017\u0017\u001dOV\u0018\u000f7\bGd:\rH$h:UQ%h\n͉کa_y`Q`\u0014[\\[\u0002\u000b\u001b΋ܮ1CQ\u0002\u0016ZgSO\\\nq|\u0010$c\u0012r\u001b,n[F\r}w\tM齿wz_q`w\"&~'eQYa?=X\u000ff4x,gVR4vj\u0010F\u0013Ӑ\bM\\/DSh4i\u001bqGh\u001eU6?\u0005k.:wcmV\b>\u001dbw+%N[Siޛ_O%\t\u0012u\u000b\u001fG2w~\u0018t\u0017̽\u000fkJ~\u0015ܷ\n\u000bnol[ѥqVq\u000eY\u001b=<4\u001b,,\tsl\u0018dO\u0015\u0005t&Z\u0018ݦҋ\u0014\u0004DJ\\/*I*\u0017A EP$?.{-\u0004yV\u001f\u0013S\u0011Q{A\u0010Dϗ\u001c!;\"3F=ղվG]^k\u0013I\u0010\u001b\u0016V}@*%]?u_ݦ7~Bw\u0001fh\fǹk}\u0019_\u00188t\bfxQ}\"&{\"(\u001f\u000b\u000eN79no\u00047\tȩmϯ˽SYx:\u001fPs?-{\u001c\u0011<o\bBR\fw*O/\u001d\u0011\u001cEQNs#ow7\u0004uzԜH2J\u0019[m\u001cfv͇?!\u0007Sg,}ODŠi%b\u0016cS\u0003Y8\u001aj]``\\$%D\u0010#U\u0017 <Ķ@n\b5O@\b\u0010\u00157\u0004NtR=\u0014\u0014w-y]{!U\\}tӽtϏ\u001f9YYTiT۩ýW\u001b3\u001f/}\u001b̵tekي3ÏǧUonT\u0004vBm.C5Fa-XGEc\u0019~i>zڛc-a!ObbϢf1\u0007|\bQ/w\u0006|<@\u001a\u0005A,^_o&[)^Z[SdpͿ~T=z))?K@TMο/v%4k5\u0007U(<N=\u000f.?V^Ka|nW.c/CsB|N\nv荝>Ϙ6C\u0016p՜N\ru%8|/\u0004($\u0017\u0002VJߥ?O\u0017\u00065=\u001d=м\u0005(>Q[Oţ+9+nL}ܼ9\u0006\u000fy~tҳ~_\u000b3HjD׿y߼`ՋJn2\u0005&h\u0011\u0015\u0010At@?Òi}(\u000bwe\u001d\u001f\u0017\u0018&/K@c툏 jǥ\u0016\u001aڈ9h\u001c\u000f(Wslx30偰/B\u0019\u000b>X\u001fT-?-dK/\u001cN1VyQI\u000ewZn䃼\u001c\u0016 V\".m\u001c7\u000fI\u0019Ҕ\u0006P\u0007-o:7ޝ9N&o3W2+<Zk\"ܷ(p}&E\u0001'^(gRjT|\u0012~\u0010v\u0003td4z\u000b\u0013\u0016\u00190;rX p\u0005^rW\bw\u0007,-/ \"C QA!Qy\u001d\u0013당#\"_)\u001f;\u00129@1y$rwGT9;ř+8YYtbP/\u0013\u001dÄj,\u001bڝ>5|co^8WWÕIo0~iF\u000buk_Cs\u001dZNQS\fu;f'[|؋sz\u0013\fRI뙒O\u0007\u00057ߖ'\u0018.ZfXD-,\u0003ĮԍX5<,d$ԉ\u001f\\z\u001eϔ}TvWo\u000fNg\u0019QU&\u001e\u001e͓߅MVvz\"{<4K[\u0016%L\"u/;^\\\u0019x~2u\u0003+m6SZ~t<Qۻ޹M93\u001d\u0003DGN]9\u0005#j5\rw\u000b\u001eg%\u001e Mt/cX+j꿱gyvxq=;qw\u000eS\u0011tR1>iɤ\u001aĖ\rtBn 7WR\tR\u0001L~,YٲM覯7Km{\u001e|'^d_ֱlfK烇\u0015}y7ϖ\u0007^:wglG72jMIk\u000b\u000fw_w|Ihƴ\u0014\u001a>\n\u0019\u000f\u0000CmfS΅an\u0005W\u0004}>/9ҳ\u0002Kpd/2h\u0014\u0012\u0001M&H\u001f4\u0005\u001cݐ\\{$Zx6\n\u0011\u001dA5#x\fyc\u0014Rm'k\u000fLRt?\u000e~[59p\u0019\u001bC\r\u0006Sg\u0012ʙi:>]{\u0017U\u000bFݝ7wIa!kC\u001d\u0006>Z\u001aR\u001d߄4_$b^\t!aWJ0Gq\bP.Wk}8}f\rU2sgNh\u000bIh~cC\u001d\tSђ)s\t\u0005)C5\"\u0012CV\f\u000bH\u001cA_\\\b|\u000f/T\u001e\u001dK,^kf+1쫕]|{{z?|5fTl\u000e^;\\p!/]?WZ}v<a]r@p\u0015w?\u0014\u000b\u000e\u001e\u0005@\"N\u000b>W\u0005N|Jp/.G[\u0014\u001a\u001f\u0012\u0016L\u0019푷Xdm6!G\u001f44#\u0002|\u0011iH&\u000b6ӂז.2联vMTeqljpyǽ構VLN9`.ǶPufto}d\u001b袃Ǟṅ}\u0001W3d\u001dO\u00160Ż1k'l$\u0017\u0004)S\u0016E^ǅE\fwz$\u001f\u001aꞸC0W\u0002{PQvSO@\\\u0016,E\u000b\u0016\"y|\u000e}(\u001f;WJd\u0001\bjҥ4\u00022@-\u001aWJR[i\u0005\u001a\u0018-wN\u0013\u0019Pi\u001bCSDP\u0004\u0007\\#\u001b\u0014\u001fTp{3\u0017_,b>Oŕ{ҽuv=w6\u001e\"zϾ\u0017~n\u0010\"z%\u0004~+`ohҥb!Q!*ECT?G\u0016ۻ \u001fO\u0015pBb\u0001\u0016\r\u001f!BN\b4R\u0004j\u0004'\u001b\u0004w\u000f.\fAQP<\rkKG\u0017yV)]u{GyYTr,\\_wGչ'\fuY\fꙩuQFy\u001d%\u001d$sR-\u001fz~Z :c˂ؿ*g}\u000fmh8X\u00059&cMU\u0012>\\q\u0002d?\u0006-9\u000fyGGf\u000fZ6S%\u001a\u0016;Usr\u0006K]\u0005\u001e{\u001eɘ\u001dＨ#Ln\u0005V3`2Zm5vy(ޅ:*Hqn\u001cuGt./|rf|p=YހY]d@n\u0019%m{`Ϝ.@vIG6qϓ\u0012Ģo\u00047Qûi~ه͜EțY.Ji\u001fHU\u001c(RTkɃR4%\nu'\u0007'<f8\u001e\u000fo\t捈\u000bT\u0003\f-fC5\u0003M=>Gy%얧\u0001\u0011Jƅ.ad7`\u000b@\u0017sX>Oœ\u000f{ZW>\u001er\\b;\u0011[~b\u001adj\u0007'+^l|\u001e7~tItf\t<B>\\Ro$q6c\u0014uw*VG!}%aj\u0006#*\u0003\"4n1\u001a\u0019FBW\b\u000eX\u001eF4\b\u0017gah-\u001a\u0015/\u0001\u0006J3WfC0pr\u0000tyz)Uwit{Gh8`uI\u0014\u001eC?uj`,鴍\u001dH\u001dy/>\u000fil8inKYFpy\\\u001e\u000f$\n\u0004xҥ'R\f`SA]l\u001am\u001f\u001cyUHH`rF-\u000f\u001c'\rzFDOhcZ;v1\u000bO\\^6m\u001fŦl4S*\r5u&zw|pߙ{\tuu\u0000sⵊ>6;b\u0019uL7w{t_\"=?.XM\u0012R\u0003\u001d?z_\u0011xR^,[п˾\u0016DK=d4h1(\"i\u001amي5+5\u0014mYjMGg7\u0004%\u001c\bJ,3`s\u0011+d]eR\u0011aFEpq|L\u000eh%=\u000f%}\u000foQtj\u0003\u0007\u001a2)|F3ؕ\"oU\u0013t/\u0003jи㘺LlI\u0015]}z&So2\u0013&K{>9J\u001bO7m\u001b))?e-Kl6tqBh\u000brrD~05F\u0017MEֺ&h\u0010c4m(\u0018\u001f\u0010_\u0005n\u001ex`\u0006\u001do-\u000e,\u0007iJ<b\u00034\u0016!0\u0012)k,#sKK\u001d\u000bq,m\u000b/ke'\u0017;Zb(0\t\u0002w>>t!~!'l[R}s=ɡo3飯\u0019\u0013\u001d\u001d\u0002\u001d1\u001d wG1\u0012}d`:a0:{$F\u0011كL$\u001d\u001aC<\u0016F3\u0005Qy~:ԭ0=\u001f|l\u001d*P|\u001f\u0007\u001bL\u0001\u001bYyh*~c!ęʇRLxF\u00161_A\"yI[i{G\u0003\\\u0016|3'\u0007ȶ|\\,d+i!?Z4T\u001eÔ\u001d$\u0019t3}\u0013ү&̔vqe,C\u0014LlM!3+\u0015!WOp|!o\u0011<[$q\u001a\u001a#\u001e\u0004\u00025ڠ\bZ,\u001dNI\t?<+\t4\\=lxvcjO\u0002.[ݚi\u001e\tX{r*S%;1{7j'\u000f\t[,kUe[e1{ǟCZqF^7M޿󝃬x\u0018IX_-\u000fShR\u001b\r+2\u0017̲G3FOD\u000b:#n\u00100\"A\u001b^v\u0012஁\u000e\u001d\u0015J\u0001_ ̩1Z}o\bu\u000ff̘6Ky>Tt7\u00163\u0006?@/M.7\"5yY#I|S{q\u0016\u0015,;4?99>)\u001dK\u001d/j\t;\u0011ɅZ{\u001a2\u0001\t\u001abf4(M*\u0007n\u0003s|\u001ehɂҴ@g\u000f\u001fy٬\u0016l!\u001b<\u0018_LBPze\u0001\u001dKEg\f\u0006Hp|\u0005\u0006k[\u000b\u0012@[aSq˛aoz2&B\u001asE''YV,f<{lώ\u0010,\u0019\u0012`MC\fS':-}s\u001d쮑A΋|Тi\u000bBO<.H$L\u0019.\u000fǹe|>\u001d+]\t\fJ\u0012E֚peǦ\u000f\u0006$ט*\u000e\u000e\\URu\u0002Ʊ-}\u000bA\t1&3t8\u0012#7Թr;m@OzuW{,x$3}\u001d(VqrvklCGvvk6v\u0004Uu`|G/R|Rwwܝ-K1kKW\u000fLe%\u0007SD~\u001dr_싀\t/\fǾG\u0016\u0010N4?\u0011N&:y\u0010hq&[ߖ['\u0017\u000e&K\fvt\u001dzwmv)l2\u0007\u0006^m¦7ds̉\u001a\u000fX`\u00186ɜhI\u000eu\u0002=k\u001b=i!,c\u0010h{\u000e\u001f4dӵN\u001a'L\u000b05,\u0010xbv\u000b/]d{{P8S?;,\bSt?w\u00015\u001e\u00064W\u001eg~r3\u0015SN\u0013멠;\u0007~Ctq\u000e\u001f\u0007/yTV9S\u001brl3;,\u0018j\u0000A\u001f#eJ<Bb45\u001bam@|1]wy\u000e`\u0007 w#.q0nm8Ц\nkiʥԚ5Eg\u000e\u0005֔j\u0000nw\u0000V\u000fh\u0002){pU\u0006m\u001d$\u001a׹]c@{hic_!k0Gh\u0011\u000eLYlt[B~\u001doU=\u0019}Ãrˍ'[\u0011wE Nzӫe\u0001.\u0015B}S\nLV\b<w]o}\u0016,̓FK\"yL>3[/\u0017r;GK\u000f'5\u001aA,\f@\u00046D7xDc\f\u001cį,\u001fFX\u000fkLAS\u001eJ\u0003_\u0017p2~]\u00190!@\u0013[\u0013hQMA\u000e\u0005L4+W\u00180-|gq~b[dԙri\u001bLzS*\u0017GI\u001b\fF*C>6_^Y4>\u0018\r!\u001cPe:Zm\u0002T{'#xpG\u0013VQ%s\u0003_\fx\u00056\u0013h\fICAÅ?H<@'\u001c\u00014ah\baK6[\u0013]wf6h\u0000\u001by\u0012!|\u0010\fhqI[-!nqeX\u0003w\u001f2\u0001\u0003-6\u000e(hhPY:\"\nl:hW$kˣ\u0007yv\u001e$\"%\u001eןGTh\u0016_i4舃\u000e\u0010\u0013\u0007\f,'dK\"<|8Fka\tCJ\u0007'h\fKY\u0013-\u0015g\"_=/7h7?50EPG~u>2\u0003¹^D\u00025w1 ^窠V\u000eJ{P\u000f<\u0006y78\u0007of/n$銢.N\u0012h|s\u0002t\"~se/Uq꒐DM\u001fq(\rM\u0006ށ-\\vZT\u001ehE\u0001\u00044*\u0013zE ۪n\u0006\u001c\u0016U\u001f\ttD5 e\u000e|I~r`[=ScʚofIUp5g!j?j\u0010\bVW\u000efc`[ވ\u0007ɴ\u0011eZ~~\u00079\u0004:Ʉ\u0013p`\u0002-!\u0006\u0018-c%\u000fה\u001a.#\u000b8͗\u0004zu؇9\rhdm\u001d\u0007Zw-\"QI\u0015&c\bZ\u001f\u0007K/@XS==\u0007.S\u000ftB<(R\n\u001e62MF\u0013\"FݟŶ\tWc#\u0006\u000faҡ\u0018Ő\u00003\u0015Dg#\u0012|\u0004(\"\t萕Z/y)Sm\u000eL,ac2t`LG\u0018AM\u001eͬ0d\u000fqQD\u0003\u001a3tx/\u0005Dv=O#Wsd\u0016Ѽ-0;ݧyW\u001erߤ\u0006\u000f ڐg\u001c7\u0003_Οx\u0012_~\u001a\u0007uzÃ+\u0013\u0014m\n\r&\u0006ͣVE7B+\u000fUs\\\u0016Lܖ!iXL\u0015sW\u0017O\tq\f$m<X\r4A\u001aKA\u000eMԒUZ|j\tSg\u0012@mUǫv>a\u00111W>g_9};\u0004wO<Z+\"B]=0ҵ=\b\"8ͨ>=[\u0017؜tx&b\u0012^%\u001e_\t%\t\u0013\u0018K*\u001c&๔b\u0001<\u0002.RloKtq\f͆k\u0011C3\u0015{mA\u000bUld6Ա͗\u0016\u0015\u00000[_v\u0018𺁯A]u`n@l\u0006h\u0001:}\u000f\u0015\u0001nP-W\u001c\u00066\u0001%pSA3I1aba%\u0010&1\u0012.DZMXB\u001dV̪b\u0003i\u0010O\u0003_\u0006zė'W\u0019ֻ2ǚf\nG\u00010]8o\u0001t`uɰ\u0000\u0016jP&Ƙ0\fr-%{l\u0014s\u001ew+ݕ(6qgφq\u00073\u00074n\u0004b3\u0011h)قS\t0em\u000f\u0017P;~t\u0007\tY\u0005ڞ|v\u0005;O,b\u0015:Xu*\"Uk%p'E\u000bl!7'\fQ\u0004GkF̺㙤\nCЉ\u0007-U\u0011N.5RfV\u0001\u0010xb\u0002\u0013᳁>\u0015\u001f\u0005|\u001eh\u000bq\u001d]@ئL}y\r\u0007sm0s\u0007\u0005\u0001cL|\u0001\u001b>8\u0011At\u001e\u001er)F\"}\\i\u0002)q\u0002&s@:\u001dSJ$CA˛hDes):Tj-)!za3\u00190D-\u0007c\u001b//`ۯ.\u0005/.ҔZM\u0017\u001d\u0016\u0001A[m,<\u00168\u0000@n@㎔\u0007@\u001e\u0012I8ś)6L\u0005 7ևNDxx6X֥\u0000]i-p\u0011_g\u000fZqQ>4&b Slo̶lv\u0005+OL6=u;{:\u001e:2o.\u0001\u0016\"+\u001c\u0003Z\u0007\u0019@ߘ$1S|soU\u001dqP-bm\u001fOsy\"e*jl3Ǧ=pl\u0014o\u001d}d\u0017[j\u0000LLbv{\u001f\u001f[:)A3ŝcOvz\t>dǮգj!4m1\u001b\u0015-Z\u0014=!\u0011L\rX\u0005l~\b:\u001aV\"e\u0011\u001d\u001e\u0005\ne){@[]nDشxõPv\r9\r#AGK,4 \u0005pܕkKG\u0013}t.LF\u0013d\u0014+V`69dV\u000f\u0003tvI`\u001b\b\\DV`Vv\u0006K\u0010j>~H\u0005\u001e#M\u0002-n\u001bWj\u0011ɵ=\u0013\u0014g\u0017rW\u0017\u0001\u00154G\t\u0003\u001e_q<ȕvX\\n#J\u0007-(\r´\u0012sUtvՁ'a7\u001cJ'\u0015\f\u0001\r6\u0000Xփ\u001c\u001e-V\f\u0004tƘޱ욮5>c\u0018ѝ9\rw\u00171d\u0005\u001fnA7r\u0017Y.F኶1j\u000eZol\u0013g\u0012`\u001f3\u0006\u0003\u000fX3\u001bK\u0016N(\u0010\u000b׹d5dj\u0003/+~\u000b>\u00040BWi5'C~'ےw\u0018E-7\u0002`r\u0007lA+eMW%_MVt0[~p:/M %=D߮8pW\u0002禓\u0018\tUè\u001c\u0010bn\u001a ryDG\u00121xIe꾞2w\fl\u0015/T\u001f\u0019Pu\"P\u0011~\"ٜmTqۓdLhF<\u0003`qYT#>(\u000f#jy-`gA\u001cE+Wa{\u0018Ńh\u0019W>ZRm\u0006\u001a\u0001Y\u0007\u000b07\u0005]|K+6k.+7u\u000flhs$,\u0006\u0001#U\u000fM\u0007W`\"06Rt\b\u0007\u001b*u@3sO8\u001f\u0019pj\u001chq{9y#/=v_\u001fyy!↜RC\u0006AGr\r\u0010\u001c[\u0017qAc\u0003®A/Yw`\"\u001d^_\u0016\u0005y\u000fK\u0014c\u0015;\u0012eI\u0010+f\u0011#6\u001c\u0002\u0010ƖU\u0007.\u001f;n\u0001mA+`5\u0006\u00060Հ2S}=|\u0006#и[\u001b6|6=Q\u001e\u000e:p\u000f\t\u0018G+\u0005C\u0006g^\u001d\"\u0005g\u001dQ؞_#\\v\u000b\u000e۞-/b\u000fNd*Oj\rdjCGձГ'TKw}tNNg6\\i#6\u0016spku=#\u001d;خg=rF\u001enخJ9\u001c\u0006S\u001b0\u0011qZ\u0017\t7ke!R`0\f\"3t`)\u0013s\u0015\u000f*r\u0013v\u0016_=\u0014=wn-q\f\u0017B4-+5l:q\n\rTz8!!\u001cѴ'붏A\u001b\u0018\u0010À\rB\u0006[Xm|`Rl\u0003`(uC[Qm\"#eAWdq\u000710f]%h4\u0002@D{I\rv`\u0013\u000f$p\u0003\u0019ҍ>&Β\b;K'v{\u0017\u000fȗ\"\u0000;\u0002\b&1{\b)\b\u001bv\u0006g\u0018{\u000f\\O\\8s\\ƨ\u0002<G\t5!Vwsep\u0019/jw<s\u0007\u0001\f\u001f.c\b\u0005;&!:\u0015Svnu=\u0000GR<U\u001ft-;Г\u000bsي=ɺ!p\u001e\nȺbšiLÙ\u0016.\r_\tZ<a\u0015ĜW\f\u001c\\`\"*#e0\u0012\u0011m+Dx5\u000eKVqRi\u0002mO\b;\b_?Ye]|\u0010e^(ЌUcF\u0017Iq\u001c*G4\u0017Ϊ\u0015\u0018h2\u001b\n\u0018F\u0018Y\u0013I,\u001eJE\u0004>\u0013hz\u0013Ss\u00167pG`\\0\u0005fTTk@{}$_)\u0011C\f\f\u001c3\u0016\u0003Z܄?@tf\f:pޕlA\u0016\u0011~o\u001au4\b\u0007v2.CoUc\u0003\\2\u0002D\f<An\u000b\u0003?I\u001a\u0001,W\u0007;+<cp@ъv\u0001\u0013؟\u0011\u001d\u0015yە20\u0014כ\u0000R[g\tZ\fl\u000bq*\"\u000b:5\u000fޏЁ\u000e?\u00124a|qx\u0018uO\fl\u000et[DԝНX_u\u001f8|Q{L\u0001>\r\u0018M\u0014cRaMBb nu\u0011xf\u001051\u001d&\u0007ZNk|sGі1AjR\u0002qI8\n\u0012\u0016{r2R\\5k9\u0014+p`}Q\u001e`\u0000\\#Gn%jr쬱F\u0004>Q,\n@\"7)/\u0011TiUuT:Ճ`Mٵ#M`?ٸ4\u001dw-x\u001e\u0018?D~z#[8v`b^[Eٞ)V2z\u001dZ)hqsIF\fLqm &5@Ed2:[\u000f\u00106VaXXo!.KfTh&a9aI|\u001fͷ;\u0007;\u000bbFc\u0018|z\tʀ\u0005d?\n~P&|X6]W0\u0018\bl*i4᙭3\u000fhm\b\u001d|h \u000fL`\n\u0007?\u001fxeqM}\u0010kԝ]j?\u0012Xs\"\u0014tLXkNds'\u0006\u001dY`\u0002\u001b\u001fNX\u0003`S:q\tD\u000fz x$d\n$\" wlLaV\u0005$\u001fW2_\u0012|\u0019+\"&`*4pXC^NئwJ\u0001a\u0000\u001a\u0000rVjw^\\9\u0007v\bJrΒ3\u001cb8'\u001f~\u0000]X?,0:U/(`\b0\u001axm6,NK\u0011'MK\u0003\u0003\u0011\u0018jd\u001cfK֫H5\r\u0002F\u0005q\r|\u00011\u0015hs\u0013>ẶqLG\u0013\u0016H(qGQ\\\nn#p9nx9 n**G/(<0\u0003ۨߔ\u0007켫Pl{*A;=ag\u0011~ΉTyb;\u0010vVV34|`.*ԹMv\u0010v\n\u001f`gΊ4\tԠX[*q\u000e1/s6Y77 &\u0001\u0016*\u0004Z\u000b`+㼃_\u001fBԀK\u00051\u0003\u000fM%\u000f`jd@xx%\u001c='\\=\bߊ&s\u001c|?ir\u001a? W#yBtp\u0002Iig\u000e\u0011I($\u000b\bQT:\"\u001fsa\r\u0003T\u00182\u001b͹\u0000\u0002>r%G\u0010o\u001eW+\u0001/+6\u00172|j\u0015a~+jc'~\u0013_\u0002T\u001d?Y)Yu\u0002\b;ktEq;eb0<X\r\u001dxpT^3BYsZ`a|·&xz\brف\n\u001f\u0002.\rѲ\u0007^\u0001a׎lıWxl˕E~7\u0012<`0؟CrV.٠%\u000f\u001e\u0007\u0001Tfn`r1\u001b\u001a\u0019\"]\u0017k \u0006p.;\u001c`g1uw\t問?A0s鈬Ae)ZTd?Y\u0004\u0001WZ1AYVт\u0016+n㮩\u0013vӀ]҇b0aDn\u001f=8aG1ŭV;\u001484Sn\u0014eFs\nxH&s5\u001fg9\u001a\u000e,*l{F(\u0013L\b9:\u0003ڬNk@\u0001\u0005ה-budl<0L\u001d|'A?ǝE\u001056t*\u0000[U\u0011<\u0001m7UuϏ ý噃s\t%\u0006\u000b)UD\u0016&=?@,\u0005~L6H\bg\u0017<q\u0006`t_ݚx\u0014!bj\u0004\u000e*~\u0004eX\t,n!AY~p\u0002\u0001p\u0000\nPS\u0001\r\u0000D\u0001\u0006\u000f%>@\tN\u0005\f\u000bj,\u0019\f\u001b\u0018u\u0010uf\u0017\u0016@\bU\u001d\u000f\\\u0014Gf\tl\f&7\u001ca|r]=~O[<'p~OP'\u001ccU%C>\t\u0013\u000b\u0013覫󀝥}ȷ<s\u0004v\u0016adv;G5C֜ON&,`zV\u0019\u001e%]M*\u0018`g_e\u0007\u001fA[We7[X\u0013}`@<4\u001epK:Ec\tkh\u0004e\\k\u000b\\\u0012\r\u0003q~\u0000\f\u001e\u001bωFw-7Ϫ<4\u0015xv\u0000ޓr骴&s&\"F=\u00154\u0010\u0017ǎTys,k?8oo\u0000qX\u001a$M.8E\u001b|+\fJU%76_w\t)!,5U\u0010\u000b8\u001f|]6B0uc\u0006\b4CW<\n]9\u001a\u0013Δcx˸,]~e>a\u0001ǒ|TA\u0018yCذ\u0014\u0012C\f(?m\u0000k\"q\u0006b\u001b\u0007l!\u00128\nդΥ\\\u000bJ+'\fTUjp`}\u0003q(_6 '\u001c\u001b:X|In\u0004<4N<N?3݇p\u001b\u000eL5\r\u0007J\u00003\u0017\u0018)\b_\u0011FMNH\u0002\u001ba1\u0005d=O,\u001c5⫎̂x\\v{\u00014m9ٔ\u0016S`)J>8qއ\u0018\u000fvVaX`\u001bq0N\u0012ƺ`v@rAPU\u001deO1=Eb\u0016fU3\u0019>\u001f\u0002Ķ\u0001w\nQ\u0002򝷗*ܦ=/}>\u0007c\u0007ܕeG}9C=wdG.8|,>t賂mLMg\u000f99-RfYm~m\u0004-\u001e(3ͧ\u001d\u0014i5\u0015\f\t:\n[,\u001e?0l\\\u001ecC\u0019I\u0003\u0010\u00136\bch\u0017xq.K|rR\u0011'\u0014ko\u0005\bt\\`\u0000S9\\\u0016֢eZڂ멨z\u0006[TX\u0007\u001fFfPQ{⽓\b\u001f\u0005&U\u00186ԒU\u0015a\u001e\u001a&#S;'\u0000Z\npu\u0007bK2OT}e\u000b57\u0001+e4]]w%\u000e#uؐ\u0004-Erpz.R}Pl} f\u0017\u0012f\u000f!\u0010l۵\\%ʵ;&\u001190oqGba!\u0000En\u00050s譏]Ks.o&хz'\u0002v\u001eb)Ej!S2G\nڬ=!ls3\u0000g\u001dy\"F\u001d\u0015\nyme\u0012\u0006AqH|\u0004ln\u001b\u00168o\u0003\tǡ̲Apް\u0013\u00184[o;3\u0007\u0002/v}53T~g툭h\n1+|.1/a%`_\u0000{v\u0005ye'tp\u0006c8-ؓ\u0001k)bViɤ\u0003L\u0011T61&b\u0017i\u0015_\u0005cN`<3zldXC{\u00103*\u0012\r\b\u0013\u000bhT=\u0014'\u0018?|~ʒ\u0003Ԛ'U\u0002\u0012>د֑'\u0015ԃK\\`\u001e\u0011~\u0010\r8\u0002lr\u001f9\u000b/0ȀW\u0016\u0011­\u0006f{\u0016k\u0010>\u0007;\u0007[NX<mW\u001d]\u0004!\u001exB\f\u0004\f\b\u0012z`\u0014e8\u0000\u0012\rmGN\u001de{TjDZ#\u0001*m\u0015\u00163'.w^,o6;=I\u0003\u000ec\u0003|\u0016\u000br\u001f\u0010#`pF@2\u001a\u0011PmHėl\u001fOjU4 \u0000n\u0015\u001cc7b?SgV;&(,ȽóK3p\t\u0016s+Ԩؗ\u0015nZ.5x<Y\u001c㊺荻m+\u000eTyT9;Ee3tƤ(n@p$o8~\u00051yz\u00063`\u0015*Q|\u000b{9>{\u0003\u0002)E|\u001e@\\nwa\u001b6ᜉ\u001b}p/-\"\u0019 \u0004]\u0010'V\u000eY.6Mm`Lko\u001f\r{y\f]%ڣs!^\u0001\u0016䃰gKYm\r{7`^ybEJ)`!$Ȟ#`l0~̄yb¥՚\u0002әabV\u000bav+!\u0001-Ѯ)5&&bE8fP#\u0003\bا\u0011\u0015ba\u001d1E2vx\u0004\"\u00188\u0007Ԟ\u0005\b1!rb\u001e_?\u0003Ā\u001f\naXu\u0012Cr\u0014DgSl\u0007utL\na/m1nz'\u0002>]z\u0013ȓ]\u0007s\\\u0007\u000f\u001b\u000eN%\u001a\u000f]\b\fB/\b\bڂR崍&~|-a6s6#t5Td6\u000496z\u0001\u0013al-\u0002N\u0012W/E\\K?nS\u001fr$fY6ԇ@n\u0002pz\u001fL#\u0007J\fyy}xr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘ1a[lkpb\u0010]s\u0004'\u0015i!\"R\fDȸT+\u0007\u001aKyZ9X\u0006'\u0004\f\u000blk@\u000eVogNmg5C\u001a\u001e\u001cme3VVeEYhpt]\b\fѥȩ̇SqNXj$8\u0011-u\u001b*668&<̊l_;yL+!3d)|jx2j&bS'ol\u0005~-jL+?+jU\u0018~#+\u001dkk?~V19ϛ?_7\u000f-o\u000f'\u0002OV~\u000e\u00056ɱ\u001eCtg'Eq>V,\u0018-1OnV*Yyշo?Vv$f'Ί|\u0000>\tDa8X͚7o>\u001eD^^\frsC^~\f򓅩IeCT?TO\u001c#wW)Q |,<[\u001bJ+\u0011\fmiXDRI.D^\u001c\u0012Qj\"y7\\\u0004D\\]\u001aJ?8^ӕ(\u0015iH\u00038\u0004Ԕ,4QS\u001e^0H\u001a\u001fHoo\u0015\f\u0019r[ꅿK?L\u001dJ-`[o\u0010\u001b.RH\u0006\u0014UZpI\ni\u0019\rP^Ks̚Ӭ*3V(IP\u0002*h\u001e\u0003-PIT@I6ȬD\u001c-)<0\u0013JAl%\u0017bE\"\u001edQ@ȡC|*B\u0003U\u0002W7\u0002\u0019\u0014&>S1iˠ\u000eP\u0014 \u0004r\u0006LJ-(cRe.<A\u001b乥\u0014h\r.a!Бe\tD\u0006d\f\u001d(\u0004V<HMƇ \u0001\u0010\u001f̨4SNVtge\u001a\u0013Z\u000b\u001cHKMPAir9P\n3a!MjTo\u001bedV\u0017\u001b*c.ʄY3_\u0015\u0001R\\|>l4'[ωLN!&P8\u0012ʧ`>\"\u000f\u0010\u00034h.H\u001d$\u0019%e \rb\b54XGD $r\b.HH*\u001f \u0014<\bJVe\u0018\r9n\u000f\u001d)\u00197\\}\u0011,\u0013YKECR@.\\\f`$\u000fX\u0001r\"\u0019mvUJ\ro?\u001e9{\u001f\u0006j\u0015C\rlLS\u0007,@\u0017;/\u0017\u0003\u000eR\u0003y$8\u000fA\u0005&i2xM&\"E[\"GO\u0015X]<,0\n\u0018Ez)lqsPWl4QfnPvX|*\u0004$!Vj\t\u001f.:YLVi\u0019\u00020\u001aG)N/PT\u001dSeUpxp):P@PHi\fB\u0018\u0018i\u0001+3\u0012RT)M@&@3\u0000\n&x\u0016H\u001e\f\u001d\u0018j\u0011)ʨl]6!K\u001fJ8\u00032\u001bFAi1o!D9\u0016PL03u嫴A\nO/dWj̄\"\u0005bC(W80]\\odq0Ρt\u0010$\u0006֚Ҋ\u0002}\u0018ʜ1Dj|o\u0011NrY\u0003\u0014|}\n\u0005\u001e\u000f9\u0011g(-\u001a\u0007\r\u0004!\u0017K[\nTmc%ø\u0015ɃI\n~#%\u0011Z\\f\u000b.&_O;zc\u001b鎤\fo$M)\u001f!p_&jR!Wx$a\u00079\u0001\u001aD&<\u0019P5\t\u0015@\u0015\u000f$bٰAP\u0014\u001f|\nSg\u0011f\u0006(jey:2U\u0006\u001f \u0001eϊ\\= \u0002\u0003\u0007ʹA\u0012\u0010KlT`ŊB=2^Cv40NS\"OOq*H\u0019JՁ׀\nS.\u0014+Ҵ@@\u0003q\u0012\u001c\u0007\u0007\"\tRfL,5rG\"ߗT;SF\b\f(o(U\n\u0017BxjÑ٪u;'+|Ė\f('6\u0010ρRal̈́\u001c\u0018W\u0014\u0016\u0015\u001b6\u0018Ją\u000b\f\\<C9Ka=Zm%s\u0004\u0016s9\nHN+\u0006\u00041 \n**9\u0007ə\u0019\u00011\u0007\u0019P$\u001c$\by\u00079g5\u000b{\u0007_Kh^f9欪12q\"|$g\u00127sS\u0017'N\u0003߅`\u001dqU|\"E08̅ 5x0{\u0001>6sI\r>\u0012\u0005oX5~6\u001coG}\u0018!\u001cEqڇOÒ \u0019~y4\tsx\u001c\u0014(q\u0000\u001bd\u0001WAn\f^+)Ac\t\bG\u0010f@|$\u0006}r\u0018\u001c\u0003)\n+\rU]BCˀ\u0000(\u0001b IhkI\b\u0001?$0\\\u000e\u0007K\u001d\u001c0\u0002\u0007Y`r\\<l9\u0014[k\n\b}L:l?:2\nto=\u0018i|a\u0018\u001c/\u0005ǲQS\u001e5\u0007NNy\u0015\u000b\u0002\u0012G \u00032\u001bAJP\u001a!Nȉ\u0011Bc \tWQ\u0013\b\u000b\u0001#8\u000b  :9\u0001\u0011M㎣\u0018$w1e\u0001\u001c\u0006|b-P|G\\bg\u0014\u0010\u001ce8ĒeBwb|<\u001b\u001b 1\u000br>\u0019\u000b\u0011?\u00032Fo\".J&R\"y E[\rG<\u0000n\u001e;3\u0002r\u0001Dg\u0002&@z\u0004K|\u0002CG)\u001cu[\f%\u001e((.\u001ceD\u0007ai7Z \u001e\"\u0015@F\n\t\u0012\u001c\u0015\u0005^F\u0000G\u001a\u001c\u0002>y\\\u0012\u0006r8J[qCױ\"\u0017\u0014wpD\u000eb7s!A}r\u0016\u001d\u0011\u0014a.*{<Hc {{<RE+ItOُ\u0018S\u0011ւT\nQ,E\fX_7\u0007?p4\u001d\u0007H\u001bҒ!`@\u001fCyh\u000ee\u000e\r\u0007)'#\u0011.\ncr_$Hq\u0013܂\u0002<0ב\u0019\u0007ี\u0010q\u0001\u000bè\u0017ǂ\u0015wkR,5gzv\u0018\u0014\u001fGEs\bx\u001d>B(y\u0003^\u000fa9\u00030R|xP\n\u001c]\u000be8:\u0002N\\<t\u0019T\u001c\u00100\u0002Έ\u0013\fr4y\u0018{A\n@\u0004c]\f|\u0010ov0X\t8p\u0005,\u0003e5;?\u0005K.\u00004\u00198\b\u0018\u000bs)z\u0006>\rW\u0017'=Rq\u001eJpd\u0018\u001fD\u0015%H[QA7 \"\u0012\u0012\t\u0004 \u0010$qIX|4\u0012bbo,\u0005f\u0003n/\u0005)n\u001b\u00110\u0013\u001fnish+>b\r*@\u001cd^\u0006e\u0010{k\n`?ҧ=a\u001b\u000e\u000b@\u0005`\u0002\u0000cF\u001c\u0003Q̞\u000be\u001a{g=\t;L\u0011L.\u001cwGs\f1>\u000f2e<ǁ\u001e83\u0002\r<\u0000K=$9\u0005ʯ\"޳0j)z\rๅj\u0000F<s\u0005mؒmtؓ5X8r|dx>~:`9\u001d_\t\f\u001ek\u00008m!/P\u0010Zņ筁ye΃# ]\u0015\u0012K\u001b46(9̔x\\Z\bX\u0005C\u001b\u001f\u0007%̗.\r\"q\u0010\u001cH^\u0002R'\u001aGA+\u001ao\u0011G.\u00134?T\u000bBI1p\u0015/\u0000Fx\bR\u0004%/y\\cÑT\u0019c\u0004'\u0014I\u0001kǥ\u0011dPx\u000fd@\u000e\u0001KV]\tR,Q6\fc%~\u000f8\u0004N\u0001\u001b\rQY\u0002\u00017}\u0002<\u001bK\u001ag\u0002^烤\r\u0001Hi5D\u001es{+3}\u001a\u00110\u0006@J\u0007Â\tȑr^9\u000b\u0018+ \u0007\u0003\u001fsw{\u001b\u0000n\u001a\u0000\u0016佩c\f0J\u0015,8>}2\u0016C\fP.GT\u0001\u0004ܠ\ba \u0007Z\nV\t COG\u0018\u001e:xu\u0011\u001d`\u0005dNJ\fohȩKLxN3~\t\u0010a`=\u00062q`\u0013b 9%\u0007\u0014?HTI\u0010~ۏ\u0000\u000e\u0000>aSp\u001c\\\u0001C\u0006K\r<2\u000f#[q}n\u0014Ήh|5A\f{\u0012!>1\u0006x*\u0001\u0000\u0006y9V&\u0005\u0006\t\u0010\u0013\u0005\u0006Y7d\f\u0001dpEE\u0005p\u0018s\u000e\u0014\u0016)B\u0001\u001f\u001fG\u0005!!\tT7X؏\\\u0004N\u000b3\u000b1\t8)?0_`N\u0001>ީD\u0016z\u000e6`}\u0001Rd%A\f;\u001d; \u0000<45@f\u00183,߀&X\u0001\bPltB\u001ejF\u001a;\u0012\\8?\u0019P\nq\tOd;\u0019[#\u001c\u001cC5\u0007I\u0005\u0007m(\u001f\u0017's&h\"U}z\u0002TC\u0004\u0010^\u001be\u0004u\t9\u0003\bCˁ\u001eX\u000b>\u00013\u0018gY\u0011\u0017\u001e%\u001c\u0017feN\u0007L\b\u001fR&\u0016CVC\u0005fCq>8?Axv8t\u0001\u0007\u0004mBo:94\u0019\u0007褼.e&\u0007\u0018Sp\u0004FV \u001bejQ\u001cs\u001c\t2~؆\bgP\bxO\"a\u0010&5\u000bp9t0z'ݧ!M0c\u001bob\u0000Aiç3\u001062a\u0019Bà\u0003R\u00180\u0007Xk籀\u001ev\u001e\ncft<\u0004VcS\u0017F\u0003}@=\u00036- \u000es\n\nF\u001ci8H(Ե< ?d\u001b\u0000U`%2/DNXr\u0016آ`n\u0000q0{P\u00020{!\u0013vo\r埽&`9\u0002\u0017\u001b̮Ln>y\u0015Kb9\u0019+\tt\u0019q`\u000b==k]\u000e\u0003j\u000b\u0004yJ\u000bY'ڏ<\u00048Md)i\u000eF\u001c\u0007Y0F!^\rv\nX\u0002\u0004hk\u0010\u0018c\\އ(/j\u00120\u0002caP?97\f\u0007@Z1\u0016\u0001\u0019)\u0000A\u0019\u0011~ \u001d\u0001\u00152\u00054F\u001c ui\u001034\"Y!X\u0012}\u001f>bpz\u001d兢 \u0007\bp\u00023C\u001cC\u0018\u000b}KNT\r\u000fyq`\u0007}\u0000Pw\\\u000bp4U \u0011b\u0013V\u0002Y\u0011\u0019Q\u000b\u000fԕ6m\u0007C_`\u0001\u00188]C\tN\u0005\u000b\u0018B\u001f^\u00004C\u001bdYB<*\u0015-$\ts\u0002~<1Gpֈ\u000f\u000b~Fx\b\u001cc(ɀ.}&<./\u0014׿.\ts8Ĺcgه(\"\u0006\u001cg`웾L؅\u0007L~&'ZBIl\"3aKɸ[\u0017AF\u0019\u000b\u0016lu\u001cG\u0015\u0012U*\u0016&`#\u0018;\u001d!ua$HSԦX\u0015lgNI\u001crZVI&g\u0013+A\"eP&\u0011\u0015Pb Ʉ\u0004+\u0019J\u001f( o\u0005\u0013x5\u001d]YCG@@/\u0003B[S0X9\r\nendstream\rendobj\r56 0 obj\r<</Length 65536>>stream\r\n?Pݏe돟\u001f\t|C\u00045'@n\rM\u0014~\u0002c;Eu\u000bHC\u000ex\u0010OSPӁ\u0014\u001e16[VA\u0013\u0001@O\u0018!&A:\u000e\bv놴\u001csy\u0014{oy$&HJ\u0002\u000f\u0015ƽ:.w:FLo\fJ@\u001dh89ω\\Y\tX:+\u0017aB\u0016Տ\u001a\u0001\u001dAV^1|\u001ağ\u001eg!\u0007}Y\u0001\u0007\u001e\u0007\n<G89HSIg>,$\t2З\u0001yg\u0016z}6KA|\u0003 }\u0004q\rʩ\u001fe\u0007%\u0010E8k(_\u001a\u0004,~cY=O\u0011\u0005X\u0012\r \u0007Hl\u0007d>l*c~J\bR'2P\u0013H\\_\r6}L0^'{+w{読G/\u0017Y\u0019tԃԆ=`\u0019ḍυL&gxw\u0012\u0003Q|2XLH\u000b`\u0010\u001fD.ab\u0003d\u001bŁt?pOV\u0016J7\nRw`\u00193\u000bԡSà^^<x\u0013\\6b\u001a\u0007hlk\u0001\u0000\u0007\u0006.L[\u0007L\u0010\r'\u001e#\\\u0017 _^\n{[Ξ)\u0017F\u00026}ܠl/7ܹ\u0018\u0005\u0015\u001c\u0002[ I\"\u001e\u00000_DGG7g8\u00065W^{P\u001d\u0019\u0001\u0010,~Pk\u001dZ\u00122\u001aeCL\u0010\u00071=3\u0014j:Ld[b\u0018Q\u001c֦8\u0014X6\u000b\u0001?=R+^\u0001/D,So\u000eu\u0000bz}\u001cXڰl[\u001c7g\u0011\u0019ߠ\u0014c\u000f&r٠d\\\u0016:\u001a:\b?ĴD\u0012\u000fQ\u0011X*+}\u001e\u0013ȹ\u0011F\u001eɘכʆ\n\u001e\u000f9\rzעvϝǺ*AƵ$ \u0006\u0016kT(+Q\u00066\u0001g-\u000fT`]W\u0013%\u0007{\u0012\u0018#`Q\u0000rx^FG\u0015j3\u001d\u00051S1\u0003\u0011\u0014\\ c_:p\u001e\tPc;\u000b\u000b4-GcNl\"d%=e.\u0017#pP\u001aBz\u000e~\u0012\u0018J\u001amV\u0002yD\u001fwz}\u0013s*t\u0002N^g\u0006[%\u0001O\n\u001ch^2\u0006$\u001a\u001aG\u0013#kl\\z\u001d(⾳OB\\/:g\u0003./ŒJg6\u00149J\u0015QN\u001e{YHgu\u000bl6\u0014=7C\\\u001c\u001c<ɝ\u001f[E?0\u001aV\u0000uTP?B\u000eL \u0005\f'x`\u001f\u0012\u0005\\]ƹfp\u001eu׈u!B=\u0001u\u001e`(a^d/6e\u001a֡Ok5Kq\u000e2~kpM\u0012B2b;ّ)-{\u0010'\u0019@\f)ٞp\u001d#\u001c6\u0014\u0000\u001bv/BT+\n\t\r8\ra0E\u0010Yُ-N\\\u0001NL\u001a\u0003\rP\u0012jp} K\u000e96G&p2H\u0016*X\u000e{X/w0z0\u0000X\u0003\u00155\u0007\b\u0012$%xM6X\u0016Qf\u000b\\\u0003K_utfԃ\r\fLV)u\u0007\u0006}7F\u001cז\u001a\rwc\tw\u000b~qQ\"OyՇQ19W=]\t\u0011r\u00125#AVhb7\f\u0016\u0006A\u0015zwuA,\b8퀋X\r\u001fY\u0011H졘\u000206\u0014J\b\u0000\u001bAK\u0000/\u000e\t\u0003\u001b\n\u0006բu$\u0003A\bF'HBa<\u0017<\u0005Am\u001e'Cw\\]\u0004]>_|\u001fpF`\u0005S\u0003\\C\b8\u0001%\u000fo9\u0014\u0013?p\u0004TK\u0010v\u00009Ą9 ʄ<[\u0011.cc+\u0007k߉\u0013h\u000e\u001c=9\fm؆\"j\u000eӠ\u0005\u0010\u0013zz\u001cc\ns,@na\u0014\u0014xiC1\u0003l($P;\u001c|Quu\bq\u0017\u000ez&g|l\u0001\u0013\u001cϨ\u001dtĽ5`\u0002?\u000bL-`U5(<\u0007Ux\u0001x7f\u0006\u0018%F\u001ba&f\u001dX/57\u001da3\u001bɴw4md-C \u0015\n\u00026\u001cW\u0002DPӧ\u0003|a\u000bt\r͇hP\u0003\u001bn\b}\u0000hRh΃]$`\u0002(\u0004K\u0004ǀ?\u001c䄡\u0006k\u001cпD)\n|\u001a[\u001e{F%\u0010f(\u000b\u0013ʷ\u00197\u0002\u0006K=ķuԱ\r\u0000?m(\u0000\u001b`JGWLkp|vRЗ4?{3v\u000ej<zn\u0004DP#>\nA\u001d\u0002b% Պ-\u0007{]⋙DiFb>\u0018\u0012ASt\n/K)\u00065\u000e_}Ӄ{+\u0018)PA\u001ejBdP\u001bm*x\rEj~Qz:\u0010\r@rV\u001e\f!\u001d\u0001\u0007\u001b\n\u0018\u0003_m(<\u0007m(P6\u0012(n$\u0006:b?>|z8/̅\u0011[\u001dy\u0004w-qw<\bس\nSRTuo3u\u0000)c6\u000e֟`r\u0018\"\u0015%\u000eʭŹ\u0007jj\u0003{-$'kbuQZ<*Kh\u0011\u001f\u0002u\u000e\u000f@=\f\u001fi\u001d8\u001ep\u0011,K\u000fQāľ]\u0007\tm^1\u000fU\u0000`\u001a\u0016\u001eX\u0016W3_\bVy\u0003zPU(@\t\u001c\u0006Լ \t\u0005Kf\u0017\\SGsj\u0013p\r:H\u001b\r!\u0010`\b?^c\u001b\n\r$\tH\t} ɣ\u0017Fxu\rӓGsapD'P\u0001Sc#0\u000ean\u0011p(N9\t`Ӳ\u0017g4#)`\u0003%{~P4t:^GLPuT,\t\u0019yo\u001dՠ\u0001۰\"EXP^yPh]Х2;U\tU[\r\u0005'|lCAŕn6\u0014~\u0016:F\u001cX15!\u0015w<w6\u00146\u0014ܿPXeCa32>&Oa\u000bk(Sqe;m\f❸g\u0010pu)\b9\u00159\u001bKԎ\u0003̥\u001e\r2_\u0019\"+\u000bXYTv*X\u0017䶡^a9O{M\"\"A]\u000e#ա\u0005PC/\u0014\u00006Y\tTT&l\u0018'φM4ɩ\u0012\bu5}B9CwR)5{@\u0016$ӡeHp\\O_\u000f{ F6\u0019TKõsejtd&\u000e6{\u000b`/+HŦ+\tSw1\u0019\u001d؆\",o%Č6\u0014?m(Ύ\u0014c\u001bAƟ;;\tzkh>\u0004qMS,1\u0002x\b\u0019\b\u0004}P|4,\u000f{.2\u0017\u0002VAb\u001c\u0002՘-\u0012T%\u0018O迃]\u0005`\n<\u001fd\u0005W[tK͚0`g6l8M<Ȟo\u0006ls5@\u0019zx?\bH\u0006.:\u0000oXˆ6\u0014un\rQv.AMxi/s1{!GG\b\u000e\u0017\u001e\u001c\r\u0005дCu\u0019\u0018,#B\u0016{\u001d26J6F.\ñ\u000f܁ \u0012vIԲTj^\u0018_=S\u0005aF\u0004\u0017\u000b\u0013\u001bv\u0011ky'+1F\u0005Y\u00066t07u\b`-$V텚)@\u0000P\u0001\\\u001e`e϶Rj\u000f95&k-,\u0015x\u0005eHلO\u0016\u000e\u001c\u000fk\u0010VCi!(N\u0006\u0011\u000f@e>\u001a7`HW$簕\u000bb%ޗ\u0016a>s&`\u0012\u0000\nQR~6,\u0003\u0000kv`ms\u0017<\u0015G\u0018[z\u000el(8\u0018܃\u001e\u00009x\u0013_L_$\u000e[\u0003{:\u00069M\u001c{>9I$\t8a,Y\txw2\"V\u0011\u0016\u001aQ\u001d7}2\u0016A\u001e[Zu\u0003\u0000H&$w\u0019}V}Vm&yTf\u0001jZ\u0004\u000eli\u0007ę:\u001a\rarVl\u001b\t6Ң \u000fx=\u0002,\u0010Gu\u0006\u0015`]T\u0018jSùR2P9>wp}\"c\u000ey&t\"سOc\u001b\n)\nZ\n=/3a.\u001a\u0010\u001el\u0006\t,ӏ\u0006\u0003J\rթX\u0018=ϤT)3i*>ImV5\u0013\n\u0002+=2қO+.\u0015c@\rʕ}\u0006IsE\u0001>ȱU\u00155Q>@5!Tѡ\u0006\u0010H뵤ɣ\u000f\fr+\\Bm\u0015An\u001fjM:\u0018]|;ֺ\u001f]\u0003A\u0003Z@;I1\u0012#`[ja3\u0002]|:\b+\u0016yF\u0012̰v\u0004{`\u000fʋ,7\u0007[!v˜\u0007kB\u001bQ\n\u001aK+\u0006\u0003\u0000,8k\ty&\nW\u0016\u001em\u0000\u000e`\u00046e~\r\u0010]\u0000CDpF:'΂\u0004zQB\u0004!P\u0001\u0015f7\u001f/=l\\ڎ*u*m\r\u0001\u0001\tk\u0001;\nJoW\u0001kO*q\u000f\u0013UYwk;{\u00015HEѧ5 Qׅe:\u0013-`eGZz\u00168\u0006l\"vVˆ\u0002\u0004\u000by\tr;g\u0011pZL'ᒪTEU\u0007ZQY6W+ze҃}xA\b\"\u000f\fM\u000f\u000e\b[3y_]\u0000{\u0004q*\u000f~uJ\u0005q\u0001x\u0000\u0019٢\u0004^Ym#\u0007j6z*\u00149\rz-\u0017fxf\u0018(\u0003\u0012e4i+BI\u001eM$s`\u0006vd,\u0010~<Ĥ^5\u0003\u0007p\u0002\u0005ذΑ{>N\u0001Ύ\fG\u00172\u0006\u0002\u0003?\b\u001b`\u001daN\u0005{6\u0004=\nثy(}`\u0019\u0001kp`Oxԅ)\u0011x\fʇP`it\u0010\u0019\u0014?\u000bW+v\u0002,4F\u0002gXͨ\u0000UAf\u001eGXc\b{Tp1r;L@\u001ec;0.^]\u0001C=\u001b\fv\u0019+\\\u0005+{Y6xM\u0019۫ջ\t[(k(i'b\u0002\t}-ovEN ׏7X@&22&:7\u0001۪S~㡏-\u0003\u0004\u000brxO\u001f\u00030w|o,\"3z\u000eY}ڬ%x\rXv\u0001/Yju`\u001d%\u0001Q]&/xn:*ԔPw;(\u0003@\u0006.$΂uOX\u000fcL0\u0012muN\rkPgnY@Y_\u001c\u0007vP'8nJlhF\u001dSlOy\u0013򘇝t\u0018á|%~\tO\u0007V^_\u0015.\u001dV(B}\u0003=(>{Dy`la\u001a]\u00051a\u0012\u0017Yq_\bL\u0011|aC<pq\u0012QefѰkE\u0001a+m\u0001D\u0003\u000eQ\u0014qw\u001dq`=O\u00107\u0001H\\d\u0018x͈\u0002Y\u0016rڹZzPm\u0000\u000b\u0002m\u00120j\u000fU5\u0006(~\"m!wW-\r%\u000ez@ݺ\u001fzץg\u0012쳂^0|\u001b\u001bb\u001dK\u0001<7RX+Ɩo\u00016@ly\u000f/~J\u001a/\u000b\u000b\u000b=\r؏CE\u0017nrz\u0005IسHcx$\u0014a\u001a;{s1i\u0016\u000e\"4\u0007\u0016u \b|n\u0004_\u0011q܏도y\u000b1qo{ԏ(G\u0013\u0018\u001d\u001fSozj(\fNCXxyp.\u0007k\u0014-u\u000e\u001d)\u0002s\u0001,P]/g0\u0016x1Ŷw^\u0018\u0000vR/\t{n\u001eDπ_3A\nzVl\u0001Z\\#l}F)\u000bp]\n\u001fFPM,\u0002\u0014\u0007\u0001\u0016\r\u0017\u0017po\u0015\u0013U\u0019sVav]y\u0010Qĸ\u000b\u000b\u0013|\u0003%{t_%)X\r\nؚQQ5\u0014A\u0019pO\u0010ք`\u0011zީs1BL-M>ۄ׭N\u0007{5X\u0017^\u00034:\u0006qO\u0015nƖQyk\u0001x8ס\u001c藍reӂ\u0005X\u0014\u0005\\sVAAf\u001eb<Y\u001f\n[v\u0014\u0015V\u000e\u0017aB66U9H&5q\u001fz\u001fl6I\u0015;P\f8\f먨>\b=o兀?s8;+kp\u000f\u00144ꑉ\u0015)^\u0002zUO\u000e\u000elcһi={Mp\u001f\u0001\u001fa\u000f+\u001df\u0003u!z*4񹲀Jk'l\u0006Kvos]P'a\u0017x\\Ru@h|V|%c.!vC`\u000b\u0002{\u0001C\u0010x\u0016s\u000eJtP2\f]vq\nBISt=wPZAxAZᕯ*\u001f:oFdCԽ\u000f\fu0\u00012_m=n>\"~Yoͽj:I?\u001e5&\u000eɋ$\u000ec/{\u00066h.aCeRK.ד&9\u0015C\u0015B2\u0003Q\\\u001ell\u0013:U✈1ԕdRNψBm}\u0019drN\u001b5'L;-:&ާBu\u0013xE\u0012ƹ=\u0014ؐ5\u0016Ɩ4\u0013p\r'ա\u0002B'\u0005kI8/ǽT_21\\]DE<^CJ6\u000b3#ӛQY\u0007E9ͺlV\u0016XK\nS\u001avk\rvabv\u0013k2c/\u001d.נ\u0018=5}0w m0*HT\fӒ{rF\u0003V\u0011sY ٌ_Pdud۵ƭ\u00069P\u0018Z\u000b\u001aS2Z!^]ݦ\f\u0012/^\u0003ZVK<mc=\u0002:jib:u@f-i7\u000en*eѝ*3[5̯T`+\nx\u001a۾%kZ~\u000fWB>vá\u001ed\"6C\u000e<DVUh\u0015{ԡ\u0007E_\u0018O)9B{U\u0004O~\b\u0017׿P\u0005\u0005%;dXRm_\u001cٞwt'g5Sw\u0002̃ufSEԓ\u000f\u001cq\u001aSIf8ZE\\Nm>g\u0007+\u0019x%ܶԢo|\u0014%\u0002\u001fZ#q)t\u0019FYHX;~-:\u0014 ?W;tk\u001fvke'\u001dD돰EW:H2_Lj!\\0`n4\u001aC~]᭯:~}V\u0007E6d\u001eDwZ8Z3gD\u000eUAjNaF2z션^\u0018.um\u001a^t@lH.גk,YJ5\u0005c\u0011%75\u000ba=¬\fs\u0007\u000ePԩkZ͏\u000f\u0012I/\u001e|Q̼|Tt\u0006[${Ao9o]\u0006c6U[UG3<\"xwcᳯ,[fÕU9\u001a|{ۓ[U\u0012r6^\u001d^\u001b\u0013\u0011r\u0001+\u001f?ټ\u001e1AAXpJ1ܾPP׶\u0015V=Fl^!\u0012紑\r\u0014ޢ!az4+F񻽄\u0016o֥|<\u000f/$\u0010Sz\u001b|Q\u0016$|fmAΏ=zyA3o!x\u0005C]0OX\u0014ŖI}s\u0017\u000f\u0014#=~-\u000f\u0011\u000bt6\u001awK?O\u0014WyQ\u001eb{s\r\u0017EZŒ&-\u000fȷ5yPlݩ\b\bڶW\f%j2{d\\6AϘnA8'T#0QuZ\u0004M*CXTn\u001apyƢu\u001b-\u0005\u0012>\"\u001eۭ^\tav2\u0005O\u001fХ=tI\u00151oF\u0017_X\t]m%n/\u0013w\u001dL[\u0005T΀0}0\u0001\u000fNqM;\fӦ)fJ\u001eT\u001e<.`oԍn}J6{6OMk_5>j3ۅd^A7I>P_\u000f3o{3tI)Y4uӐg\";AR\u0005ftC\rc$\u001bh\f\u0011V\u00069\u001ciO=L~R\"P\u000eu\u000eu\u0019ib,G\u0014\u0003\f\"jV\u0019\\~6S,~]q:U:JՄ7i\n^|)Üߔ\u0005\rm\u0017\fK[&K^\u0017\u0019\u0015\u001f*yi_==!,\u0012tcrW\r4\n9&:ℛ9Ks\u0004[\u0004~\u0013\u00163z?rJ`ӻ\u0000nSc\u0000ϗBHO|*#/\u001e.#wC\u001bgS\"޷\u0006;\u0003~Zѯ\u0006̙\u0017\u0003\u0005\t7Y\u0019\u0017H\u001e\u001eg_?B\u001d \u001cWdkZ\u001c8Z,EmgEUvjgꂋ\u0016\u001b:+ћ:+.4Ӝzu{ހR\\Pj\u0015VY#3n\u0018xwA\\zP1xE}GD\r>0I_uɏkzw\u000e31,XX1GGv_:ܼ~,9|wz#\n#ެ^!6W>jDO\u001b͍^T</U\u001e\u0016j4ܭ65UmB?hG$'\f\\Tx{^{vLTx뻶~\u0001/͜t\u0014ոILdv%h}/bE5\\k֖zg̔Y3-5n=ozX_OjIiH?W\u0017/;ݔ\u0012gі#3\u000f\u0007{\tj=ap\u000fmpg§\\撩P5K\u001f4\u0000 w\tܞK.\u001c8j&̴=_jRW\u0018xIY\u0018APD.ltpm\r#D.qy/e7m22O2j(h!EEy>*9g\\\u001f yYyҬ'*\u0002a:<NĢM,\u0005\u0006@\f\u001e\u001dm4P\u0010!:}c\u0014dN[R\u0012OUKj\u0018cc\u001fB\u000f-Af]/dtc=^&HA{=ZL]rqYc¬?\u000f\bCKV\u001bDU\u0016<FKڪ\u0003;\u001fx`[\u001dɶ6zp]\r~zFNKA'#Ç\t۶\u0013teQ\rĬLTS樟nf\u0006m:w~5\r8nٚ\u0015V\u0011X\u0019\u001fTY\u001bt%5ɼnKe\u0004-\u001e$\u0016ds?LSj\\IHÚ\u001fGnEkCy_\t+\u0000ܕ9NߕVQV@Ү$V&cn&/T^Y\u001aUy*]GM\u0004ٿ\u0013D\u0015\u0011^e -Y#|< \u0014וy\u001e}$H\u0004IgY]@YԹ$dऔj84qk/U~[{cxo_LdGLV49ZK\u0014hߊ\u0000YPI@tPBCl̡ｨ\u000f&''/\u001aįksO\u001a1[(jcS\u0000o|lM8r)Ūre\u0014qgM\u0000U obAcª\u001f}i?Uuӻ7]]ܡ22#]u.F\u0018٬G\u0012ݭo+N\u001b7\n8~3ެQI6\u0019\u000eM8hШ*\n7::E\u0011\u000e\u0011aU5ae*R{eQYe!eqVF\u001f^k\u0003M\u001fIZ\u001b>\rȻ0o~3D\u000f:\u000f?ѩ_U]\u0014}\u001bŖu\u00136]>L;/pSE8ރ\u0011 P\u001aa[%[\fn(|N(*=!i.\u0015\u000e3FQ\u001b\u0012v%YSpأݷt_k\rݮv\u0016E\u00146چl\r>ۅم?vC.]Q.KT\u0005J>\u0015^D2˼2{_pH|۔{rڸӸ(ؤ8JZӿ_ٷi\u0016p\u000f\u000f_7\nQN~T\\[\u001dT\u0019Z#M3i+m\u0016«k\u0018&5l\u0011\\J?\u0015M\u001e6M)'ڮ'\u001b\u0016!,̏1+6eIunquIV)\u000f%aLg[\t^\rqunkNU\u0014\u0010ӋrGb׸'.[.Ҹ2\u001dѢAlG\"[nɕيJ\u001am\u001aG\u001b(\u0003e\u0001\u0015\u00011\u0015qnq^A\u0015IT{7WA\u0013(§r\"\"/S}4J赑\u0003oxmW5n˦ia5!Vm3ͻb\n{g]x\u0016\u0013<^T9D]qʨp]\u0018Uh\u001b\u001csV,k{~?,\r?\u001ax\u0014\\\u001d\u0015\u0017T\u0017P\u0019U\u0015X\u0015\u001dcݐ\u0012}!5xKTui\u0013}S]S-}\u0019y_\u000f6EnN;ՒxݭCϢ?a?v\tfGxU\u001c!3{ -[\u0006Pj\u001ctމsolTQ%mNࣹ:vɓu4ӯCDv9[t]\u000bo򌋯w_Ɵ⍴\u0007^ǳ\u001a\u001fxZ{7ʟ0ߪ/_\\[yN+y]^|Ì+n7?z;ɹ&:57)#ξ).MS\u0015641\u001d\u000e*wqocd$k\u0007o\\l\u001b\u0011f?|4)1΋=ג\u0016X\u001fV\u001bt=;\"4!쬈4\u0017kٞ\u0013%..#Χ>0\u0012@vv$;9\u0018:E杁mZq5Csg\u0017\u0006]O~\n\fM/'V!)\u000blΌ2\u001aEb\u001a/?\u001dFy\brVWMHn\u0017%NQye7߸.}U+p\u0017ʱ}E_\u0003*\u0003\u001eu\u0016\u0014;E *\u000b\u001bh>\u001f\u0011=\u0010y\u0007\n\u001bmt]]jt-j\u0010A\u0010\u001d\"^\u001e,^\u0015\u0004do4{uB'\u001d?`|Vn!GlݧAlܾؼm\u001f~2v.bͺ\u001e\u0010\u0015GTLW%tEDe]{\u0015\u001dY\u0018 \u0017zI\u000bb.\"p);}o]\u0019yV\u001cE\teio|2J<d7Tx\u00013lJ7\u000boOl#nن찍d~4i~ڤk+_SDD\u001f@%\u0014\u0014b&z(ϗIطODsrj\u0012\u000f;)b,b\u0006\u00198y\u0005bLbP%bńҔ\u001be\u0010}~\u000e>whWO\u001b\roƾleV+sbȂ2o+<bb||<\u0012c!{167Pc\u000bT_cSDlm󅰆h\u000e%\byh4\u0007s]}d\r̉.\u00154*i~YM\u001a\u001a\u001a\u001c#\u0016*!O_@(),D0\u0018G!\u00121\u0001}HL%\u0011\u000b(\u0011k\u0013#^x:V9a`j3?i+ogY;m\u001a\u00145p=\u001dA]X\u001d\u001c':Kz嵧\u0014btVaUSbhҧ]\n]#\u000bK#=dѕ>--n/vɿ\t:љ\u001a;oq5i׫)8!',V\"VZJX˩{_V̚r^~\\%b\"1\u0018I \u0011C0t]}\b!;cUF?5\u001c}%7\u00162n\u0019vA\u0006\u001dɯ`<σqO\u0003\u0005Ҙ\u0002蘷\u0017\n}e\u0019ї\no{D?+p+pz=\u00167ݤw\\ߔ9FU\u0005%0_;\r_?o}قrpfטݼ.\u0019KQ\u001cNF\u001f^\bU،A\u000fxCx\u001c\u001aI\u0003\u0011C&rWӈV\u00127\u0011\u0007|\u0015\fQ\u0018]\u0010F\u001dZ,Z{E\u0017\u0016Ffy\u00110&ysWeHG\u0010\u000f^Dz*+hώfm\rb~o\npi\n~g\u0013\u001a\u001a;oy@j]Zi\u001aF?\u001cB|\u001c(&!j\u0010|uzC;hb\tbo@4kr~(GQ\u0015b4XkBm\\m,KeQL\u0018ƽ8(t\u0006X-%)X\u001c~V''\fv%v\u001dsb\u0012\u001aopr?\b;=S\u0018?_Xz^=A?H~*w)M\u000eM|\u0011 +qQG\"o]c\u0017Ǽ~\u00112=:쭿Խ2<6?&WU\ng2ר2/WF%YTes{57\u0013&\u0018\u001c_\u0019sr8\u001a\u0006#q8z~\u0004{p\b\u001c7\u0012A:NL\u001axXÂl.\n?w9<\b-r\n)\u000eh͊zت1M\u0006\fJĽGcR~n[T\u0005\r\u0011\\6<=δ/O\u0005|!|Ĝ\u0019Pk{p?\u001bΌFwh4zg \u000ebk\u001dm\u00167^W\tzxíwOWeH8<՘\u0016]XR\u0016Sư-GJskbms7n1(>e\neE>2\u0001^n6n\n[\u001d.o\ri1\u001dG럀QND@,{%\r̛ٕ\u001fn_vwW\u001eqo\n\u0013\u000b<Rˊ]\u0016+tN-:WDEã2$\u001awiLԬFF\u0019bu\f<~2C~>7\u001a=;\u0006O\u001a2&?0D\u0001\u0014IPKL\u00190t!1^~\u00011iJbAb\u001e7bWÔ\u000b5Lo\u000b-R\u000f 'DUp\u001f˂hΔ\"~2\u0015\u0011\u001a\u0010\u0016\u0016;I[/D]C5mKL;X5\u001d\u001abb\u0010\u0005+\u0005q\b\u0014G.\"@̜1e+8m\u000b0y\u00131uZb51uXs\nf\u0016\u001c\u0003RNyӍ`Kn?NDgFKwf[޷^ޗg~ruImrJ,+sIk_\u0005y\u001b|\u000b\u0007x)\u000eS\"&\rUD_M@\b\u001fOY\bK\u0012ӆ.%XIL\u0019:v=1}\u0001bRT]LʐMl܎I_xSK܋;O.ƿw+/txXQ\u00125koݢ\u000b\u0010x\"Jyk\u0017n\u0002F>#1D4\u001338͚1{71k\n1g\u001e1c!1c\u001e8K6O&Vi\u0013;[}ï=s|\u0016\u0012yk臅nRd^R3cY\u000bb%%u]_\u0017Dkj}\u000fm\b[a;ʭ\u0013\u0002\u001ca(|\u0010\u0003\u0007hF&\u0010\u00133F/%fLZC̚XJL,z\u001c=,YEĬ$1}>WB̜y\u0010? R7N\u001d\u001f6m}Ѫ\"-8I`tSW\u0005\u001e(ǽ*r+utP\u0010_T[\bT\u0007/^I5f'`6'{\u001cy0\u0006\u001bD(\fA\u001a1v98y5e¤Uhm#fLI(NIL\u001b_\u0005\u001c1%Lßhv[~[hy}f#>}\u0015WS\u001eۀƩ)%\u0001\\Gsz{Kj{cʛ2\u0017TKGw-Zk%A>,7,*$497U~.\\b<\u001a\t1e\u0002bؕ\u0013\n36TF1C\\oLlEL,\t$1\t22XgXngo\u000b\u000bS¼^GF\u0006\u000e*Aܫ\u001a]\u0012\u0017Cʊeeα\u0015qNq]c$Dw̘0\u001e\u001b=dyfx?\u000ee&\u0014G-Exn\u001a\u001bY\nĂ\r\u0016ݶBUwb~7b\u001e;b=\u0003 Xk)ͿmG2\u000fQ˙`'zԿwA\u0010Z\u001fgӔ\u0010WꄆrG܇\u0014}|qqM~ь\u0019k\\>\u0014s-({\rEl\u0012\u0005\b碈cs\nz*o\u001e1}\u0002bʘy\b\u001bcrBa*\u0005\u001a*\u0013Bi91o\tb.WbN\u00141O#Xe~CnOݘ7\u001b\u0007[;yI\u000f\r\u0019\u001c}㙗򥻬\u0001][ikRwv\u001c\u0012>88%%zF9Jd\u001dA\u000e\u001f_%\\x\u0014\u001a1hMEc8\u0003?B(NXJq~\u0014L\u0014\u0017\u0013\u0011\u0010\u0016j\u00103\tyZcbv4\u001675~_\\o\t~E\t\u0005\u0017e\b;c_\".b49))scrOkjg3ꭼ\u0002ָ\u000b>\u000ext-}]F(LSRGױ1w?=t\u001fӷ D\f͵3v\u0012f&(%f%,\u0011KU܉ՂTb{r=G\u000bo\u0019!\u001f3\u0015պy]\u0016\u0007>ޯ\"#CH+3\n]c\u001e\u0019}?п6\u000fNR߽׷hu\rQ\u001d\u0002J,\u000b2Lb\u0012\u001a'\t+Y(\u001f/ZgN,W%\u0016m1%\u0016-3 EAx9k*􀜷=s+┺ļ\u00141oX|X\u0013L∍Gȯ\u000f\u001c\u0001?S\u0003g;~\u0000o[0\\ώ1\u001beٔ\u00137._ˉ&*\u0013\u000f:-چ\u0019sDB\u0011\u0018A\u0000/\u000e8l4\u001f\u0015DL\u001d1OX\u0007cgCwMu\t\u0014䞇)];ekXmnc]x8rW@${\u0003u''\u0014ǤA\u0004)sP\u0003|\bk[稲R\u0012J\u0012xf%S\u0000#\u0000\u001c3C|\u00023V\u001c1=i51&J͚XJ\u0011K#N3|}@ɨ\r^oFh\u001a6\u00142vMoGn\u001fݫrܾ}u=\u0005{CZ\u0014Kx5\u0006^΋ypp&6\n8\u000b\\W\u000eήU\u0011\u001e\u0000=\rf\"1s\u000f{~Ȃ%c\u0006>M\u0011{\t*R=b>kbЇX)H\u0011\u0013\u001b,o\t\u001d2?gs4>U}U6\u001dA6\u001f˖_#\n$6Jl2l[Sc>_A_yc\u001f\u0003/E=<{0tVtR?Ҟߎ7\u0011dMw\u0013g\u00136W,yXs+h=\rtx\\T9A?\u0004f\u0010_Od@[aL,rXjG2&V\u001e!V:FH\u0012KV\u0010K\u0012+7faАg\u001ff_4z_V5y}^D廋yǵ\b\u0017\r}\u0015|3\u0007[ҽR*Q-)JDisbո>1~!\u0013}\bm\rJxq˳:,>̫2$fJ\rq\u000f4uN\u00195k3h>^͒\"\"NĎ\u0013ICE5\\\u0007o\u000f\u0011}z&A\u001f_\b3V\u000fw^W3o\u0017k}O^ݼٚQCk\u0015\u001a弙N[\\L7S\u001f,گ\u001f\u0019w)=Ţf6AY\f#r\u001bHq/iMҘv:{\u001b\u0017-U\u0012[,_\u000e\u001a1~{*bo<\u001bo?5ە\r*=\u001fQ(inkT\\ԭ&$J4\u0003z(\u001a(T_[\u001b\u000fͼA7o-ӑV\u0013|y}߫cd!a+B9J(LoKE\\'rȜ͝ĺ[@7\"?Q\u0019:d+j\u0007X^5n\u0005Gl#8քM,(YngH\u0014\u0003|9\u001flDXP\u000buyV\t\ny\u0007.n9<\u000fIWyݚֳѰT{7ÏA;of=<%ĺM\u0007\u0007\u0003al:a¤盩۵{o9qyICA\u0010˄I\u001e8@GVn_5&/=e<n\u0007^h\u0013g\u0013\u0013G!&Mļ\u001am;bˉCVyw{\u00053Ńi*jU\n\u0007wW\u0013$\u0003\u0005t^\rV=ut\u0019Ắd\u0016h\u0015\u001alw7w/\u0006\"BP+-C]`\u00152^pa\u0018\u001dY%^6[2M\u0013\\Iy݂+TٝK\u001fUG\u000e_\u000ei>\u001e83fޒݸ׷(g\\# 1\u0001CO8PK?>F\b9=w/<o\u0003Z\b\u001b/OںWؼm\u001dcuvރ֭iq)fd~wJZ\u001c\u0007^ݗNZzǋ\u001e8H>項w\u00057W\u0017bhtZ^S_@\b%'N\u0012ﻥΡ\u0012\u001awWH^5\u0014֞7L\u001d!8;F6~;O\u0013fl9Z\u001eӇaDyצo l\u0011\u0010[%ACzf*?WowkK\u0004?9{27\u0004??C\u0017Uw|\u001c]4pk\u001429}&}\u001bA\u001b\u00047H(ۨ\u001fjz\to\u0018\\\b\u0018\u000f\u00059\u001fT}ؚM\u0002w/\\@b&lQv=%y]jg\\V-yVw6\u0003av\u0001a\\&k5FCX*L\\F|?Rӊiu}ā;\n<ˣУ\u0019nի卵omaaZ1\b\u000eY85uO]Ɣb2 ̛Il_8\te3\t}[\ba\\FN0`\u001dy6p\u0002ۧD[8Lm,ҩ¦v\u0011Sik\f]m#*j>-0*_5TC9.LWW:yۑ\fGs<3L\"w\u0013T\u001fM9u\u00155\u0001{q\\k\"\u0012_\u001d{be|٪{WѿcI;w%($ϚE\b\u000e\u0011NZ6wftq&\u0013ӿEz~t2|_5\f\"\bX\u00148Y\u0018٤h>{oO\u0015\u0017I\u0002Sᆦ\t\u001eϽt\u001a?6ʯ?/|O\u001bJ\u001a\u0004=\\>Y'o=}ڽ\u0012b13W!+\u0010\u001b\u000fE\fQ\u000eUTůR{VG\b/V>Elh\u001dK\na\u0007ыP7n\rC/\u0013:M'Na쒧SWP\u000eWgS'\u0003\u001dܯNM\u0018h|eGpb\u00139De\u0018[0`abF2\u0006AM¬v|}~\th9~5Fe\u0015J]56W\u0006T\\1j91\u001aTm#r6N2\u0012\u0003\u000e]VPv-\u001fx䗏\u001e\\\r^U^Y%~Qt/y\u0013D<^NzA80:=\u00164\u0005\u0010\u0010:{T\bgvG\u0002c鬮!q\u0010=pL-+$\f\nDѢa]-fbʶ3\f\u0006\u0015t}\t޹JI?^-_Aqk$,HePAx6j.7#e7\u0006\u0018\f~ϡ|vR\u0017[/Nܫ{P\u000eNh\\I7سG\u0018٘I\u0007\u0013z\u0006&\u0004>d0R\rC1u\nb\r>e37;2˔C֮\u0013%\u000e!;`/Xx@Y {b\u001ca`\u0002z.\u0015\\j\u0010۾A\u0010q\u000byZ\u00061HdEIQC4ô\u001d~-anAr&Wt{6Un\u0007trlӺZW\u0005v\u000fƯ<6kk4ZZoyM\u0017~1>5B\u001f+ir\u001dcj%蔼\u001am\\bߖ-\u000eA\u001fNv\u001d\u000b\u001a#\u0002\"\u0006\u000e\u0005f\tѽ%3a=\u0010b@EX6f n0u\u0017sIrAf\b\u0010\u0016W8Ṫ|\t.ޜo\u00106{j&}o\u001d\u001f\f\rS[Q>WS6\u0005AO\u0015\u0006/\u001f;U\u001eMR\u0019v>oٜwM\u0006\u001f\u000bϠ7{ਮmw)$\u0010 @d\u00109\u0011\u0002+ՒPB9sB\u0011\u0005rFd\r6i;b\u0003Ƙ贝v>ι!ozUFWZ^k̑\u001co^@n\u000e\u001fvsn\u001bs;7nL\tvo|3;L\u0005F3tpܑE\u0006\u001ey\u0004D9ܒ\u001e\u0017h`nǚk\u0015\u000f:򙇜k0<|扟\u0011'~>䯞b7[Mnz\u001bg>ՏJ6\\{\fl\u001bn.25x߼\u0003>/>˩>\u00199\u001cb8wӭ\fGGR8:Ã۱d\ru\u0010F˹ny~\u0002C\u001d{\u0004^ i*f\u001cx\u0007__f<77Sqgt`/;LG>Yɧ\u001d\u001fk\u001da\u001a\u001d{ϒ?4>\u0001sBQTSݏ_O\u001ezw_Fk,~\u0001\u001e_\u0006&\u0015\u001c\u001bo\u001b\n\u0001-/V\u0018kj\u001foJk\u001c㯄YX[?w\u0001u:Λ;!28f٠U\u0016;|{p\u001ek\u000fUW|\\xb\u0014O7X*\u0016M3ySĜ6o&}3\u000e\rgu>Hx\ff\u001cv\u0014o$\u001fHT{\u0011c<;MՎbJ#_?zOfك\u001fn?<*~os__7\u0014\u0013-};G\u0007\\<_-\u0010mc\nJ\u0017,]7\u0011!zi\u0007W\u001b_9\u0002\u0019-%XSkioVz\u0015z0>&?\u000b\r\b\u0007̏nB)\u00171Do\u0006f0\u001f/\u001f\r}?΍{|-}WW}kxB~O\u001b+ƞ\u0017[L_G<_m\u001c\u0017L4v4ï~\u0019'z-q\u0016^Zj\u001fjaJ=d8ݗ5l,7M˝snwqnp>^~Cg\nh+$VVbl\u0004^1Ǖ;BwKO*rT\u0012sG`fX\u001e[~/D7̔\u001fpa\u001dBY`uk1<U7ua௻q\u001dŽӄ̆R9\u000eo\u001aw?v\u0007\\++߷\u0019k.2fi\u001bo/w}\u0002_0lY>OqfaԸ?֋a~:gRӬީBכg;\r=#\u0013T0u\u000ffĶ{'37̋\u000b̧SBz\u0018!8Q\u0016Oi\r\u0001ga?\u001f[ԅ;?\u0007}\u001b_h{[sc'\u001f[#\u0007[\u0007%Za~K87\u000f֣/>,2z7O|g?}>nL-\u001e9}8Cd1*6 $њ\u000fK5SwmcsۺMck\u001cń\u0002\u0007Cp%b\u0012fV8\u00113*2N\u000eVb정~]z\b[\n\u0019uNƾGā?CPL\u001d6L\u0010\u001e7?\u000e\u000fVQךnM\u0016\u0007~u\f\\|qxzBEhB\t\u000b\rp\u0001G\fE''׾=ۘ2m7\u0017l涬s\\7|\f\u00164Ĕۭm?3r,dTn+?_\u0005\u0016vT\u001b,L~R3\u000bxkI$s5i\u0011\\6Z-n\"\u001fZpfK/7_c7\u000fOqVp\u0014ĤQ.\bM66K?掠^iX??~wtE\u000b\u0013/7(/95\u0018Sb'D[\u0011=;8?G\u0016\u000e\u0017\u001aF\u000b}\u001b%\u000f\u0013#\u0014\u000e4a0],a\u001f/܊xO^R|L\u001dT:B,a\u0012\u00079G|d|g;s{I\u0013N/W|G#4LO\u000e^j8\u000e\u0001řo_?o5\u001cp\u001fQ\\;|\\?n&_{i\u001e_\\ӑW\u0018z߷\u001bZ}WpKYm^۵k\u0017b\u001bˏ=\u0003dWzs!Vf'h\u000f¿`F\u001bZ\u0010K|\u000f\u001ffIﮓ{\u0012zBO(t\u0010kN͑>/SaRle24s_tsM\u001f?c&Lhr#R8I\u0019mlxx\u00007\u000bPwg\u0012\u0007X~nhhi\nߗn'48\u001arl7\\->ۼv'ݛM#\u0007F$ʳ\u000bΏ'>\u0006\u001atWh0\u0000?#\u001efA$CE9R\u0016\u0007yG&%\u001dLO7\u000bş\u001eͥRV\u0004}@/^Juɔ\u001cJ\u0015?z{|kX~fPuqqm|?w+̆^d'4\u0004eZU\u000e\u00016(?'8@S\u0018i\u0003=?\nKy]Sk\u000b_}A\u0015ŤQBb\u0010[`\fvTzaFAn|}볍d/P~?TX7}/^y~O\u0001\u0013X7\u001dz}!f\u00131&m?\\y\u0013ͣM}Sxםwm4Nh\"lB-IjCW\u0001A\u0019;xq[lvm\u001a\u0005ΨXXmP4BHȶ7D$YAI\u001a/i6Bqr%􁮫9Y\u0018\u001e\u0018iʡzDwzw3!䝘 T>&v?!z9W\u0002\t\nO\\s\u000f⥧\u0006㩟]\rSx\u0017QIz~\u001f\u001e*\u0007gK\u0005'W\u0016.كfQ3]/Vw<\\eLk\u001eç\u001dv{~fep5+sIƊL'ƺr뗭l\u0004hdY1,I$it1iàJv|y8;{wV:ZNvPJOL\u0013\u000eZ.5\\&\u001ca_v\u001bO].l\"f5.\u0001kCn\u001a'e\u001f8)\u0015D:Y\u001eLgx\f)$Ғ<<^϶\u0013K\u001cHo\u00059a\f\u001f3\fZx\u000eQeܟm9i\u0017*o.\u0013\u0012JF\u0004\u0016@\u000e\u0015;S^gf;ǝvm+/΃;t\nľoܠ\u0006!Đ5{wytIz.\\6U<b!nNa5\u0017\u001f_=LG?YLB_͔qlP|fϳ!/7b~\u001czЎ4jl틵\u001aƢ7`fp|DpOwA{8o/G˕}M)`YN?<\u000e\u0018;\u0018bm\b\u0002Ch\t\u001eh\u0002\u0017ɍo\u000e>I㺰w\u0006GIK\nc\u0007OI<J\rBJ鯌rb⩟\n\u0017o~\u001b<2\u001aW\u001fb>3U\\1Dv׈~,p?y'v\u0017msؚ\u0011b\u000f;\u001f</\u0017L6U]cJ=\\tN0[\u00039ېndyc\f\u001d$֎&C\u0011ghʃ\u0004\u001e\u001eb\u0011ʅF\"GC\u0013]8Ϯ6O<Z\u000b-:0\u000b\u0018VW&V8]Sb\u0016gY}!1_!\u001cq3\u000f\u0013s:>J=4FLmp\u0012S\u001a(q#Ĳ\u0002\u001bB\u001cP-Rh\u001aVWW\u001d񐋻\u00139-\u001f\u0007_\f|<pyfƐZ:\n\u001a.o\u001bO4׺|+#j\u0004hFwB\u001aB5\u0016H\u0015].z\u0012\n3`\bN\u0012Ƀ?gwcX30I*\u0018!\u0017MC\u000fK*0\u001b\u0000Vˠ&\u0003\u0003H:9\u000b6\n\r\r>.נ'XB\u0014fk\u001f.\u0014\u000e|_\u0010n6w;@T\u001b}:tġ\u0003$\u0015:\u0005}B1b1<K|H\u000bv-A{\bBp5d$>9T<oR{i1iT_\u001f}{%1Ew}Ň~dW>\r\u001e{\u001e\u0005է\t7U\u0006^#fU]R\\>x\f#o.3\u001azcO[Mo7D\rws,y\u0000N\u00147\u0013KGxG[K\u000ba~3B2l=\u0015g`{H;-\u0001ZQ@C_h\u001c'D\u000eC_¼r\u001b+K\u0007M%?\u0019+7\u000f}Xvy64ZS6BJm\u001c\u001bY דFE]m\u0017g\rm@Hh\u0004)qg\u0016;HץU;)ЛlhHa1$sI&\u001a'p{%\u0010u*8\u0006rZ(%j,t\u0019A\u0016Run>X\fs\u001d\u001a\u0005;pH3*n\u001ct\faz\u001b\u0002Ă\u0005OȻ+>\bIE#LAV|P\u0010\u0011\u001a,VmҎSc-\u0003$\u001b0\u000b)<s\u0018b2IH\u001a\u001f\u0018K\fich,]\u00070\u0002,Igg\u001ab\u0004r\u0014_\u0013%ڀ_\u0014gi\u0012X\n9v+і,G0fۊ)ucĈaF9tdh5O\u0006氺};t\u0013_쐛o$ͻC-\u0005\u0013>CӾM\tfF{f҆<jQS˻k\u0010˕S>z\u001e9=q\u0015/\u0012ӚY|*&ՍBJ>\u001a\u0014bc7q\u0006nv\u001f\u0010nc\u0013<Xן,T#o\n&7_\n!$(DX\n\u000e(\u0019Ě\u000b\u0003$\u001cd~+E?LT^[Bڅm3{)o\b\u0014n\u001cp{ʫs)O2ߟlo\\=\u0018pl[w\u000f\u0003\u0007H2\u0007H9,ۃ)XC\u0017x̾\tgT8q_l,tR~\u0014\b]\u001etY\u000e-K!k˵K\u0005f\u0014\u0019o\u000b:ÍJ7\u001c\u001bВ*G\r&\u001br3h\u00127\u0014`\u001e\u000fԋ$\rX`\u0013Z\nT1y\u0018[`\nM\u0001+CNm&&l\f_gGe\u0012KE<Ph\bb\tw\u0015YG<q,޵ӳ7S2\u0015'b\u0005Z`u\u0019Y\u0000oK<pp<\u0018\u0006Ӵ\u000b\u000bHO\n}ח+h'\u001f]_Z\u0005T\u0007\u0011\u0013m>sE=\u000e{ls[uj\u001e\u0007F@slPyz6\u0005c\u001e$N.s\n\u00028K><ÖHYƭ۸t\u001d\u0015,c&'9bj\u0018CK8iUNZn#}c3U9>\u0011\rT̿<\nb\u001e\u0007nb&ߔ;&s_UM`\t5lmXz'@`Bs7;'M޽~\u001cxWt\u000fǁ;E\u001c'0;\u000e5Ψ쳄7iD猐\u0013\u0014\u001bҔgPn`Nk1<\u0006`6JlWL։\u000f6\bݟn\u0001A/lv\u0004\u0007@\u0004ZB\u0007\u001bS_\u001a\u001f\u0003\u0015}19/o\u001e:\u0018AigO^\u0014\u0016S9Rd\u0014oϳg`\u0003rͥB-JЊ\u0003G\r\f4h\u0013I's')7Rnd){\no-۟Pq׻zݏŮ/fԍKzf@\u0010:z8\u0000}co\u001a\u001c\u0017IG?Yt~KS/A\u0005DŭjӵUR';n6SNr\u001b|`&u\u000bIO/\u0011LLViW/>[O\n=hg\u0006$+EF?3\u0014W 6;\t#~R]ܖ9\t\u0011\u0016`C\u000bLz\u0003:tX]o8!,\u0006\n@Ku\"6-[\u0016Z=o؇\u001bc#/':R]j|=txgponbv8h2Q,\rq\u000eŔI*/χo\u0000;\u0011rxM`ѩN\u0017si}\u0016^>I\u000e\u001e#&\ra!,ц'+OUYnd\u000b\u001c%\u0006<_Y>(Wuφ㝵'6_\u00169ڊ6\u0004LR{2I{K>tb!d$4\u0012GYw@nރ\\\u0002g\u0013茉gfJYMY`챘1\u001a|BOұ\u001b\rS;v]#7SMyB_pe3azW{&<)}\r\u0003epp\u0011>nj+tB\u0013!\\qvl.|7>&!\u0007ls\u001a\u0014{j\u000f\u0003\u0007\u0014O7*7]Y\n;l^UPK9|7Ks\\qz6۝ygEړ@e8O\u001cZ7Հ-(\u001c\u0019O:`03H\u0011{w\f\n\u000bk+e\u0003䔚1jBh5ep`\u001a-a\u0002i!#B@#\u0018go,8.~x\u0014JjE]^G\t\u0001\u000fc\u0004hN:M\u0013j;>\rz`\u0016,\u001f4^k'큧rw\u0007\u0013\u001dG'ז\u0015\fF\u001dq3\u000b\u000b_܋4I<=\\=9_oaH\u001e\u0017\u0001C\u001fͤōvVC \u0011@#V,%\"3\u0004\u0016oMA^x<!z1$\u0006u\u000f%jjٙĸ8;\u001f\u00024(8te\u0011!l(Y\u0007ڿmxU]_$Y\u0004\b\u0016\"\u0006W`5,6]GI>\u0004Kvm5:jU\\\u0006\u001du!!J\u0014h%\"\rc\u000f=\u0002Bs\u0017:\u001d}̟\u001dd\rq\u0011r;@;XxUhpX~uXT\u0017HW\u0016\u0003w7ܾߺpnBe\u000fKY\u001dc>T9\r}=\u0011\u0007vb\u0017'\u001e=9̯\u001ad\u0006Y\tŎbx\r\"q\u0012kǀ;1\f\"sQJ\u001dX.7yஞ~h\u000641`g/7Z-kcLR%RG=\u0001\u0013Ҕݗf+m\bT>88G>7\u0018\u0010i\u0006g\u000f\u0018+6N(w$na9\u001dTQ\u000fyŭVǟ~n~㈠Oɓ\u0010a3!NӉ\u0002\u0016wÆ\u001f殜y\u001f8Qnb4X&PNdLz(ag\r!|yʕYe\n MrH)\rO}ӡ\f{ھޥt=EvָA41\u0002k\u001ejȪ\u001f|Z-$Ga9[\u001fR_\u0001@c,R\u0005[\f:5\u000f>t\u0010,\u000fZv>\r]];4\u001eŎ'Y#yӝ|\u000f{kBB>S|']XH}Cp\u001eJO\u0010RXwmx익\u001bRu\u001cq]}{V9W\f\u000e.ZQ\u000b\\'ڂD\u001aCmXf7}|C2vm_jb]BHTh,Βb\u001c\f,\u000fe\u00049R\ng%@kY23ی:\u0011\u001f1$#g7^\u001f{{-iq4>\u0002+FW\u00178Y;xzr\r2O\u0007J;\u001frde9,g+uP\"?zo\u0013̂\fkKKYhͲ\u001b\u0003g\u0012\u001c]0\u0002(->a<M:\u000bA9\r,3\u0007I0p\u0006^\u0018\u0016n\u001b;k\"YW\u00153ܜ5]m\\|f\u0019G\u0015\u0013+u21\u0014ǁc\u0017\u001e\u0006-}=Bv_\u0012\u0007Ʒ,\u001e\u001az~s{A\u001a-3[M\u0018\u001f\u0017y3/M\u000f~ם\u0017^Ο}j?u\ty\u001b8{BEL\u0003CSm\u00160Eۢ'a\u001a&;!ƃ\u0013,Lਕ4}\u0001y=\u0019\u000fl?!4(\u0006Y\u0018\f*Ě8\u0007JG\u0011=lVpb8kÚ?xed\u0017D/\u001aY\u0003\f8~^&{^bg\u0019e$Κ\u001e\u0011bm`%\u0012I\u000f\u001cGd\u0019vjX0%<s8|4Xħ?<Y+<1\rSϴC'\u0005;!}j'\u001a\u001fX\u001d^=tqZsa\u00111Zg\u0003\u000f\rzSD;7;\u001e\"'E\u000fP,b\u001dpnX3o!o~41(>$ޚXN,fR|zSr/z)/YjJXس];\u000e2KFm!vA1ֈ/Jh-.4\u0003uNȁs\u0013Ӊgud9a\u0012\u0013\u0011;ab\u000fL;Co_:^+\u0005mb!8F]Ԝ:g>L,ʋā_(?AG\u0016X,v\u0007 F=80od\rV\"\u0003\u0007bˇW8?%Ǩrr\u0005jG}\u001a\u0007&|JJ|\u0000`[}\rhҳkͥ3AG]NlSĝ\u000b\u000b; \u0016lаǙ\u0002Ԭ<;\u0007;\u0017g%@KL̉`g1\u001b\"v\u0007{\u0003w=fZ<:0&!(d$\u0018Jh\u0014\u001aoƱ\tv\u0017JU\u001c0\u0010P9fmml\u0005UM?l.q\u0001B|7|s 67\t\u000fv\u0012\"\u0010#\u001dSt\u001e[wwLգ\u000b\u001c2\u000eO\nau}\u0002}\u000bCU=_vr\"~y|ΒZ>D쬼\u0016\u0016xK``\u001aM}\u0014t*\u001ebgΊJ\u001d&\u0006FZ\u0012-5#\u0005;}\u001a@N\u0002\u0016V)`+YݡD\u0007EYB\u0005T\u0019^[L\u001f`jdH\u001c]K5d)VsNL\u0012Z:G/Sד\u001fA\u0011V8_.\u000fjT'Ħ\f\u0017C=T <,w\u0018~ן}JV8\u0011\u0011P\u00014\u001f\u0016W\u00016\u001e\u0013aoKi\u001f7MҪO-\u0000˗J\u0016\u0015JsY-d4\u0012\u000f3obgA#=&;;+7vVY痩h\u0015`\u000bvWg7O.\t,\u0013\\L|kǳN$=֏6\u0011!piH\u001e\u0002b\u001fd5\u001cA-J׽bۄwց\u0001O0ϡZ\u0005Kn~s\u0015qQ\u0004\\Rm࡯r͵iec\u0018ksT=צ'>ق\u001cLf\u0010_r%\u0012;6{/\u0000AF}@,\u0011Bx0CD\r\u001fY<%;\u000b%0\u0007T=WT+jBEn8Xm~k^uy\tؕjB\b\u0015\u001aGD/tX5xk\rqc\\\u001d*x\\uV\u0007/-\u001b&\u0017xHk[n:ځ\u001a%X|Zr8b8\u0014\u0011\\T<T\"Eg\u00190KS`%b'Ϭ\u001bG\u0002\f,,[=\u00110\u0011\u0013dХZW>\nGB^7Ǚ\u001f\u0016{K!y\u001d)FF]<Y݆i\u000eK\u0006g\ro@[=j.\u001b+!3N$>X~4ĝV\u000fZ*UAs)\\4ġb1\u0014yj5`!\u000f &\n\u0018<,@s'`\u0001þ0c\u0001f07\u0018uC#V(G?؈\\\u0011*`ǃ\u0002Ώtc9&29\u0014)m}ʽ܋:W}Ef\u0013\\:?\u001f\u0013-\u0003]5C9P1\n{'b|=V\n'>Y\u0007v~h\u0003,N͒{BZ\u0002+\u0004\u001af\u0015=\u000bvV\u0010;K9Z\r\u0011oe1_oF&` \u001f\u0016Z4]=S)Ikl -\\ǘY}\u0000_\u0005r]WnVk\u0003\u0003'2=$1<F?\u0018=\rܗ\u0002\"m=NƢZ\u0012mʱ\u000f6!O3\u0004s9Z\u000eNEGK,r\u0004\u0007UΰӪ]\u0005|O,Fg\u0002\u0002\u0002Ynb-\u001c\u0018F\u001bG\u0006`9ͱZ݅O)\u0006Rvr\u0016fLT|z\u0004{E2>^I,\u0018<\u00180̖ڋARh:\u001foBOD-\u00057|\u001cBG/\u0016\u001f\nf5͹4}xA@3j\u0013\u001bJ\u0013۬FCO\u001c\u001bEe.\u0012T\u001b'ߘ#CW]Z/3K=wʁq&a\u00185\u0005͓\u0005\u001bؒ\u0011O\u0017vtT\u0015LU\u001aoD>nx\u0011)<r|)\u001947\u0016':!dgv\u0004Hƚ:q\u0018Z3\u001d@ 8ԵˍWJ-w3\u001b(\u001f~r\u0016Y՞^Alrf!\u0017 \u0006\u0014[R\u001d{\u001elW/<\u0010\u000byw7\u001dܵ\u001bdF(\u001b\u001fE_\u0010rp{\u0001b\u0017;Y=\f_uLc\u0007v+{⬛\u001c?\\-0j;fg9Rd951\\ݒMR\u0014rC#g491<s\u0018c/\u001f֢/aF^ '[jelp~D7\t>]\u000b\br4jY\u0018\u001bp=חKu-F/\u001f1Z̳Dkp_O|\u0014\u0005m\u00068kmcLi|{\ry\u001e&\"\\p.\u0017\u0019-i\u001d\rk^[\n{~\u0013x\\ŭѻVz\u001fz2LN*\u001cDfIlԴ8#W\u000e|'L\u001e\u0010;}mVmZ4\u0007|^\\\u0001j)``IGo\u0016\u0006-\u001f.i1ԁbREȥԌ1\u001etО\u0010B˝7zިZ_AL\u0015\u0016Ww\f|\u0006}b\u0004[R\u0005\u0012Yݲ\u001aAfbD0n=N>\u000b\u0006u\u0017[#Z@fK]w⬧vkQjzw\r\u0006gcؽKp.\u001ezW;>rO0+ԽbX\rd\u0017\u000eN\u0014th\b\u001cb\"f\u001f\b\n\u0013(k\u001fO\u000fӪr\u0005\u000f\u001d♿L9\u0010=TA\"gT\u001db4r$6|uϨ*,3L\u0014gfc~?WndI\u0015,\\\u0007/ւyD >>\u0011u6#\u000b\u0006\u0019xy\"\u001f!n5eYB|\u000e×\u0013M`\u00179TVev\u001c\b\f\b6f<\u0012*!\u001eTy⪝z`\u0004'\u0006{Jr'5\fP\u0005r9k7?`\r;hO'\u000e\u000e[cC|)\u000f~\u0004\u000e\u001c4#N9\u0002Cʝ9|HI?`Z\u0002*\u001c`I\r,\u001cSySs#ShR'#>\u0018k'GYY,+w[?\\O5\u001e\n:`e}.B\u0005|Ǜ\u000f[YT)&\u000e|L)6NK|8!):5Kb14A86\u0001B\u0015,mʵ̇^X\fd5\b7&d:H\u0007*\u001cմڱJq/Q\u001dSj&7p2p\u0001FC\u001e\u0004.;$fL;m05S;,\u0012c!\u001f~c-\u0015P\u000f̖V7\u001bg7:_\u001fwF\f<)Nt\b,CX\u001c\u001bGq\u001eWS`:\u0013O\u0018\u0015Z٭!\u0001\u0016=ڬj\"\u001fJ⼢gPqƐ?\u00028\\\u0015>;[cj\u001avX}\b6jV>\"'\u0014[ZԳ'\u000f\u0005\u0018}\u001e+^)ˉgS\u001f`NLg6Җv<W}qڦ\u0000pb:\u000f\\}n\u000eλ\b\u0006!\u000bb}Q-^1R\u0004gY>5lB퍅RqKۧ\u0015`\u0003NL}+G\u001e|%ԟ/Fb>\u0004\u001fwsaq`!G\u0007+\u001cuӺ\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e\u001e??\u001d\u0017+89xw\\W+\u0003aI#}ٗ\u0002&%\fI\u000bNpD_|y].\\\u0016x\u0007g%\u0005\b\\\"pf\u0005\u001e_)\u000b]W,[e!,8eovawKc_4\u0004ǄKׯ[q٪+ֺ_~5֯w[l1+5_=Gڋ#F\u0007`wkH.ϞȘM{g\u0018{\u0007//\u0016.HR#C|d/\u0017]Be\u000b]b׳?κ\r.Juw\u001f~~e\r{\t+7`3WW:^&&5+׭n^\u000fy1_ćҏ\u000f\r\b\u000bp{v\u00198O/3[\u0018m1\u0002i\nϵ5\u001aBSmDݮ~-{9=2+D[\u0013-}Mі{<%nk\u0000w?\u0007y4}!M@p\u0015\u001f[do*\u000b˴2\u0004r>~8HB\u0019CMa%\fA^\u0001=\u0003t;\u001e쳁\u000b#,1\u0012A3\u0001r\u0010a\u000b\u0013=v<\u00051f1X)t84\u001c\u0019S\u000eX2F5\u0019\u0018C/Z4Pb!\u001bKWV`d\u0013eJl=SjT\u0000\t\"\u0012<Ɠ\u000fW\u000fؚJ\u001d$S W\"&:lBX\u0011ƂقWC,!U\u0004\u000114\u0006\u0018)Òl!me\u000f\u000e\u0010b+D$\f\u001c;RB^h\n0*,$G\u001fiOЪ,\u000bzf`L9@\u0010CRl @\\\u001d#(g1$o1M->9Sk,;JcqbD\u0000=\nrB\b=>M\u0018&\u0018+(8>\u0019cN8ZOG!\u0010\u0018m%AN#,!\rfp\u000bCAɈ\u00059\u001e}U\u0007&\u000eF5ޏ\u0010®)da\u0014bd=\u001fYaoڗn\u0003Yo?H\u0005s&s\u0015d1=}\u001cF\u0003c\u0002B\u0012<}\u0014n\u001f\f[%n|h\u0014[:$[\u0002\u0010`N`?\u0006 \u000b\u0018u@\u0018j-\tbx\u0016UPSG\u00075fٍ8nb\u0006K5a>E/v́V;\u000eҍ$uQ5\u000e#Ǥ\tiZVdv};>U;rgxsW7\t?#3ۑ0n@%\u001d4B?$W:\u00036\u001f4ɜ3ROJwӫA΀\u001a\u000e\u00149BNB\f>`\u0003iBH\bVbH\rIFFKIy#0ji=6\u0015#Jr\u001akGA\u0005G`\u001cKK\u001bڋ\u000fBt\u000b\u0011qRX\r tf\u001bc0NW_]Y\u001duVb\u001c\\{9F U1\u0011\u001a8L#\u00101%#`ZA\f:\u0006\u00168yC2\u0012bb\b\u0005\u0007\u001aKNfܲYY [\\=d:\u001d3䔊rTp\u001a3H,o4\u0017\u001ec#tMc\u001d0=;<\u0019DTk`eRٽLهAU8_/i\boc\"94C,y3\u0007)V>HJy0#Ɩ<\u001f~?\u001fj\u0011 FX2{\u000f\u0018gS\u0011EvF=\n\u0003\u0015\u0018OV\u000b\u001d \u0019A'\nc|Ccא\u0004\nI\u0018F:\u0004+h`\u001aU䠥7דj\u001c\u0007-:\u000ec:g9\u0004c\u0010\u0018s\u000e\u0018\u001940F=a3} qZr\u0013\u0012If/xO9G&*uo,\u0018$ƴ1f\ny\n{1J]\u001fJ?xvF2\u000f\u001c\u0017 \u001fH/gb\u0006vE#^Iљ1\u000eJ`F1vR?\u000bc?4R>e=f\\1FM*\u0018\t?EYu4VJ#\u0007\u0007ꥧbies 5478FJ{fhmS!c.:9\u0016$\u000f\u0012G(\u0005S1F彳Tad$$%q<I\u0003C;&Ϟ2$C6\rclJn\u00045h\u00147$_W!\u000b*ٽ=b\f'+X\u001bA2\u0002vǏ6pw2I\u0016\n3)'\t!I6&=\u0012$\t\"҇~MQVBX5ƢL\\\u0014j)eيv߆<lL\bJ\u00180\u0016Ƨh)Q\u0012_|\b5v, \u00039\f5\t\u001e9^T1R\u0013Qh\u0007%ZC$RY%\b\u000b#L{'I%\u001b!C*Ea\\Q蚍f\u0007ؖ\u0012O\u001a?1\u0005=\u0018#XZ\u0003NΣ1jvߴc\u0019Zy\u001c\u001fLܐV7W\u0004I<\u0000HOtL\u0014`C#]l\u001d P\"\u000f\fتU=^=P=Fh\u001c\u000f\u0010(\u0001a\u0011X^l\t#\u00189ddH\u0016Cf3𞰖0\\YBwVcT\u000be\u0018B>C2:!-qT)\u0011c\u0005#|fw\u0018e-Vρl^~j9\roMZP\biy\u001a,2G\u0019G&`qgc|*t\u0013Ouq?s0B\u0001itd\u0000~Adq!*\u001eҳb`/\u0016K\u0013_HK/\u0018kd\u0006$ G\u000bi\u0004|PcfP>$\u0002rLҪ`,g\u0000\u001fn#U,||\u0002\u000bI/Q&\u0003A\u0011r\u0019\u0006HIa$;\u0014h#aC .cěc)\u000fb\u001dhw3,籜Tgư\u000fϦ\u001dqF.\u0004\u0011Q'x p\u000fI^%q\u0019$הR:ZK\u001aKH6(&1 |,PI4\ri\n'kV^\u001aqd\u0015\u0012\u0012\u0018ú4JR\u000fm:IB\u0000\u000e!Gc'h\u0011j\u0005T<T}e\u0001$!\u000b\u0011E|ϤqK)\u0016L\b*V2[\u0004d!2$w|9\u0016̾C\u001eVJ*\u0019Iӳ!ςQI\u0016{JBH\u001e\r$1Mu\"9E|-x$\u001f;\\\fa\u000fr\u0018/bkc\u001aÇX|H\t\u0007\u0003]18\u0016/X|U!\u0017n74\u001e^Cݭ崶X\r\u0000H}\u000f\u0000R2ħ\u001b7pE4\u0018_(gN\u000fHj}Unx\u001c[gR3Kk16N׮&F!1G2@SƲ2\u0014\u0016zԲO6\u0017\u000f́ߑ[A\u001e\nH@Ze>\u000eA5XH\"X&ȃh<o\b'h\u001a#&l}\n˅\u0002\u0007L\u0002|\u0014WRh\\K\u0015>+\u001cb,~f \bi&f/GZh2\"_\u0014\u0011ӫPgA%\u000f]]\u0002l\u001age6e4\u001a'9f,p\u0017C!\f@\u001cHESI#ԑ_b(ϥgAz\u0006\u0000\u0018s\u0013R;gח`4YJb/\"o8\u0001^\u001f$o0\n\u0014\tdCS*GTHo8z\u0001m\u0004\u0019~\u0000[p\u0005vF`'l+\u0011+\u0014>f\u0007H\u0016\u0006\u00164*w\u001cki`I\u001bB\\\u0011 K\u0017\u0000i\u00008\u001asNc1X\\ŐrOL\u0004\u000b\u001a)y>\u0019\u001fBn$` y\u000e쀑a@A]J\u0018\t\u001co>\u0004V\u000e\u001a\u001c\u00002<jrX\u0003\u0016+\u0010\u001f5Vo_\\U?d\u001e:R\u001diG1_M\u0017\u001an.\u0004<|@i\u000b|\bj!b5t\u001a\u0016F>'\u0007,\u001b \u0000y9,(,\u000fSl%M4\u0016C, \u0018V7DgS.bIr\u00052Jl&h``M?+e3Iʊ}^[y, * y.]\ry2w\u001d\u001d\u0017@BGbFq\u000eRڡ)6Xg$&$Mf\u000eB(x'\u0000{򡭓PTx:[~jF\u0013!\fX#Yb\u0018AX1[O@h`%p1ob\u0010d^\u0012B61\u0010u{A`uH%\u0000>\u00013g\u0010Y.lV]Y\fyX9z\u0014I2ߏP\f\u0013M\u0014\u000f\u000eT#3l!\u000bC\u0003ˇ$Rћ\u0010J\u001c\u0014kj\u0018jz\f\u0014)0\n$'t92g8\b\u0017\u0004BV㖰{<\\\u0012[h}\u001dw=\"\ri:?v\u001b;\bL\rf\u001e\u001eo\nK\u000e5\u000b#ﮑ\u001b[%9I6@\u0002k@I\u001b\u0001Ip^\u0013z(>>\u0015\u00124\u0013$jYcQ\u0000\u0002s)\u0015Xr$[H\u001d@ZOc%d2\u001a!1\u0005d\tIY7'_b\u0016%\u001b\u001e\u001b#7\\_Ls(\r?jFa|E0$CI%|\u0014k=P<\u0012\u0006`Ȼ;\u0011@m!ưD_(Q؟5\u0010\u0004)MN@?P^1dY\u0003\u0019\u00159W\u0003{@ReĸB{5&X\u00164\u001e/\u000e\u0014a\u0019١j\u0003D\u0000Mr\u001c]`\u000f-3\u0007\u0000)gdC\u0003$&294\f}<\u0003XMo\f\u0002\u0010\u000bd_3\r˶$uj\u0015d 'gb\u001d\u000eX\u001ac>\u0016}KNVYS8_:\u00128=\u0001#`z:r4U8|g-I A\u00035#q! }#]_\u000fo5@n`\u001d3\tq\nT\u000b$C/+F!\u0016\toC>\u0005y+챰\u0005X*[\u0005m3CFôD\u000f@\u0005y?䧙?D,'\u001f\n\u0017R^\u0004\u0019[\fT]@o~4}\u0006X\fzg=iHr1q\u0012˕/\u0012\u0016)z\f$\rQ2S:9_<ZNB?|An\nrJt\bZoȜa@\u0016!_\u0015^n|sb\"C12{8$\u0013m\u0014l#U:H\u001dC9\u001bcw7v(\u000fݔ/\\!e2$gJaTԥ$\u00039K%QJ\\(?f\u001fjreяy82`\u0017>^z\u0015\u0014!:XOQiÑo9Y\u0004Y4ZA?ANtTX\u0002r\fɲEM\u0007'\u0013)͔[+\tᗑ'\fIw$$ޕĺ\u001b\u0010K92NI:8Z\r\u001b\u000eۄ#P@\u0019 .;s&jU\u0017>P\u0007Ʋ\u001c.d4r=5I.\u001eE\u0012\u001d)\\/;Ĝ?-\u0012}Yu#õ\"yws'(?TᑩG\u000fمOɐ\u000bE_\u00062\nz})襰|(Bo\\Oa1\u0015cֱCRD,e~jJH\u0002^\u000f\u0014\u000f}C\u001eBd`6I\\Q,H9BZ\u001dRV89/i\u0007Ǡ*D8o,\u0004'HQ\u001f\f8>%{2rA/\tb\u001d\u001b鈋Jv$+\u0003%͔R띄(\u0016RXSus\u0015\u001fn\u0011:\u001fn|X`\u001fe#Je@a@r \u0006}puo.6\u001dlf\u001bγ\u0017۠^P#N\t=Ke4u\rr-\u0010ȅQjVPZ5z\"^@fZ4_lxsRumvY\nO\u001f\u0013r6sVː.6Zqgܚ\u0001_\u0013g\u0005 [LzQ#'WV8_CB#D\u00162\f2ݰM\u0005}p\u0011[+szW\u001f!\u0012\u0017!\u000f\u0017Y\u000e\u0012r\u001a5r\u0013▞s\u001c5\u0013PcoJcvHV\\,\tyVD\u0000׫7sT3Y]\u000f[\u001aGk#yiJ婹v^Hus\u001eCTcǀ\u000f\"J%BG륆wKa%\u0005V?H3ciL'rDY?\u0003rF2_LsDLCZcwљJ\u0019\u0017i%YL\u0019Ph!VW\rY5h\u0005|\u0014\u0010SZj#7`Dc\u0000%\u0000sZ,I,vxwt=\u00016e\u0002\u0019\u0010!T\u0006햗:r\u001e3\t;\u0011|l=Il24XthE]3X\u001d<\u001bA!N\u001a \u000eY-ս\u0004D nc\u0012d\f\t\u0012;\u001emcZ9(rkˀ?B\ry:*rz\u001d%\u0001#$oVp|*^\u00072[;\u000fΡz\u0019_KuTO/ #\b\u0017qj}oz+S^:Íd<,Q\u0013\u0004-jH\u0016̇am5@\u001f:r*ԏ\u0001$\u0004)+3ObԽT>P+:6Uzu5R\u001e\"\ty\u000f\u0003(\u001e\u0006h3ѧZTCn\u000f֩\u0012pH\u0017\n\u001d_l\u0002vNz$C\baR67\u0011.B\u0017\\\u0004pr\u0000~<'\u0006'(\u001f0?0\u0001\b5!\u0001kP$\u0005ӑ\u0013\u000bAkC\b\r\u000fሡR8)5N$<\u0016*#B+Rϕ\u000ew<\u000f\u000b\b_ 5Df晋;\\\u0012G&r\u001b/<zRǛI\u0012\u0013\u0012__-\u0013*Ӆd>ڥ\r~\u001dk#\u001e{g\rgأ\u000f^O2luʅ\\\u0011\u0001\u001f#-_^\u0017G$5Ĩᐛ3m0htWkC!wi̷/,\u001b?!o\u0004)<fS@|Ap\u0011.\"\u001bGn\u000f\bբ\u0003|͔\u0003!`=\"6Ht*ldjXڧCm\u001fEz\u0005-Sss䚫\u0017CΘ]\f3\u001fP\rj#\u0004\t//ƚ%_\n߉\u001cfېl?\u001esyKl\u00069UrG; 'Bbhs\f[\u0003ln#\\iҩ)~\u0003\u0017s\u001aG6hȂg!O\u00017\\$\"/q\u00119Ç$/ZEDDy\f\"TKEm/\u0007\u0004?\u000bid\"ă@J\rIawNC\u0018w|\u001d{fQz\u0019[g7K2u@$\u0007gО\u001b Jc\u000f;Wն$-!Hz§\u0000\u0012\u0013\u000f\u0003aSX1s%pBd0 #p\u000e֮<'\u0002(\u001d.@M\u001e\u0003-dQ\u0003\u001e\u0007,ZmQkn.#4\u0001fbgg|\u001bO\"OCҟ۾\u001e0Z(poޕ\u0005xd[}B_2<z3;mR]\rRQ3>\ndP@V?xj>$Ui<vץW#)C\u0012ĩ)\u001f`k\f ?xf.rG!ֿF\u0014'\rᧀ:a\u001e}gB:\t8\u001bB8\u0003~~!f\u0012\u0017a2'[͠\u000f]7\u001e=p\u0011\u0007Z\"Jp\u0011,\u0011ٍ9@\u0011Yå$[/\u0014v@HH\u0002\u001c*G\u0011`T?\u0010w\u0015YIQ\u000fN\u000f5O t\rRtpAM\rL\u001b0X\u000e\u0017zA;E-$|9V[\u0000a~Bb#\"Т{En&/nֽ\u001c\u001a#:\f/fA\u000eL_YD\u0010H;s\u0017\u001cHO\u001aXDN\u0017R.$t\u0017\u000f\u0002\r\\\u0007\u0003-a\u0014e\u000exF&\\y{\t?g\u0019X\u000e毩??}87k\u0004\u001b\\+5\u001f ns\u001cTC[4Vmyg\u000bEu\u0002|kt:䙐P=o\u0010jHDG-is>*I76__)\u0013\u0012C1g0_^=GW?ب\r|'op\u0011lU\u0011.Bll#\"X\u0016^\u001ao\td\u0012\u0010C\u00112m&0,(\u001aEhHxH\u0015\"\u00045ʒ]\t8/,\u001fhN\u0019T[\u0000?B5g\tZR\u001f=?/\u0016O\u0011\u0007\u0003\u0014\u001bռFa0I\\Dfx\u001fVG\u000b'?дz|(ର\tYk弁|l\u0003$ޅѰO\u0016iۏsus<\u00038?9Cw]_n\u0014-2\n@\u0013%R=Qc\u0015|F)2޵Rk5\u0016ۨY7p\u0000.|׃r߷\u001eh\u00046\r\u0017<\\'\\ąeג+ǠfdI\u0013k'8\u000b1\"}\u0018zm\u0006^}1ZZxǙ9UWCF=Fn\u0017O߁O;gAt\n3?e\u0017/Sk[nO}aP풏\u000eA:\u0013]y\u0010HVY:\u00007^\"$E|M:O8;?d\\18\u0007{<a\u0019|TK\\d2)\u001dh\u000bƩ\u0014Y,S\u001a/Q\\U_\\Ly0\u0001\u0016;l\u000fWbG[{nr]7\u001d=ލ\nuمy|כ\u000fVH\u0015o.!\u001fUB(Qn}\b@)#En\u00035u\u0019u\u0003Q@.s{&c7]\u000fJү|\u0019u\u0016\u0013ĔF'>\u0011{\u0010Ɛ\u0004\u0000)\")j\u0010\u0001l̂_SF/\nE~\u0002#\n\u000be\u0003s)9P=\u00065P;>wS\u001a[M\u0019g\u0007\u0004o{n\u0002ßxtEhǩ\u0007\u001e\u0000\u001cKO+zזLPN5z\u0003V\u001e{ɨǩ\u0001QǓQ>8z+zO\u000e,~g|ǥEzy\\\t=I5N\u0001\u0000(ןY(}~\u0010jy7\u001axG/wo\u000ex`:.2'\u0006;\u0002}u͇5G\u0000=r\u0004\u0010\u0017fjtƾ(զ,\u000f=\u0016o\\\u0000\\*1?7M8ph40R[\b\u0017Y7ړ\u000bJf\u0010.t\b\u0017\u001e{}\u001d\u0010$r=\u0003E.fcu*\r]]垇>~=\u0013 }\u00137ߑw?ƹ\u001f_8$+N\f:f8׀\u000f/v=O\u000fV:vhO\b\u001d쥢FG/\rHꅇBw\u001f\u001a䊵 \u001ez{9\u00015Q/>\u000b:Af]y\u0006{d.oB\u001aT\u0016Yr\u001d̈#F\fדj\\Z<we8\u0002\u0013BK6QbK\u0015A~\u0000X2zԔì>;Gm\u001a0\f\u0002'k$\fە3@+ySP\u0017>\r\u0013\u0012\u000bGi5$\u001b\u0011\u001f||㳰)]yn>Clz\r\u001d\u001d^[\u0004dn 8ŮS\u000f^^\r&.'G'ŗ=E\b~}Ҏ\u0019@0~\u001e9!Ğp`62U*4\u0017hΗZt%.\u0002q\u0002\u001a..\u0015^ejڪOk\u001dw}_\u0013_\"<\r?w\\9LZc\u001f1[$\u000b\t\u000b?\u001d\u0002OD\bsqF\u0000hA9\u00047)]S`\u0017\u0007ͤgrw,=7\u000b(i!8!y<z-8\u000b#f\u001d\u001do\fKb9(rEx%\u0012a\u0011Α9΀=F?Sf\u0007ɔj\u0003\u0007\u0016Ѝԧ`\u0002T%y\u0007\u0014Π38X{m)p\u0004t>\b\rGٗf}*ao\b=\nUJ\\\\9\u000e؃\u0003FQcatFC5$a\u000e\u001f\u0011\u001fSCV/:2M>\b{%\u001d3V\u001ex\u0002jv;Q+\u001938B}Ƕ{3<=vX_\u0015ә?}ԳuZ\u0003gW\nNL\nde@(=C難ote\u0019`\u001bzb8\u00131*bO(\u0010V(q\u0002dw\u0003L;kco\tR\u0007\u001dG&\u0004e%@U\u0016љ>\u0003Eʋs\u001fw)'QʮΧ5@k!/<5\f+x!)}`VW\u0016\u000b\r죢Dݝ}|\u0002>L\u0013o\u0002>\u0005\"(\u001e1lk^TѢ\u0011E>,&V\u0004\u001bu\u0012|\u0014˥\u000b\u0007]CAޡN\u001c_<\u0018+\u001d4\u0016\u000fI*KP\u000eVR+/̧zb\u0014\u001c8\u0007q֊Y70꯯Tk-ŽŞ5\t+>&//\u0019_KN΢\u0010L諒|<g\u0015cȏ\u0002fhÍ\u0015\u0012@?\u001d\\=\t]\u0006xstu%긡~b\f SyO\u0003﨤;Iy\u000ex,\n$8+\u000f\r`/m\u000b̟B懲6\u000f1i\u0010W-D͆a@׈w\u000bJ\u0007f%}.8g^\u000fFJKz)ϭ=\u0000{ńnox#|\u0003l\u001b\u001e8/~\u0012<\u0002yy\u001c\u0007kS?z:\u001enT\b!tV\u0012=E]c+\u00169\u001dS\bےux\"zEl\r̥}&\u001bqyfM:b?\u001fmS%\u000erT\u0019}\u0019B{EA\u001f\u0014\u00185t>$\u001a%c`\u0015z|\\=\u001fi\u000b8\u0010&ra4Uc-\u0000MzK#ȋq6t/9\f\u0013Υ\ro\u001c\u0006G'!k\u0019[#_\u0007Vy[a8'\u001aX5R@X=x}1\u0014\u0001\u0003sҪ/\u000frVa\u0013]]Ly\u0010,^_(\u000e{\u001b^\rL\u0017/ݳ\u0000P w+\u0001~L<|s\u0015zͥ qY\fʟX<\u0013?&\u001dA>zrӤW\u0003J\u000f\u0011\u0015B+\u0014X\f<8b\u0002A\u0001P\u0014O~dTqr&~\u0016CS-ؓ\u0012\u001b>Xo{Q9W<^\u0016C7['t|ŬuGe\u001aղs\u0010s\u0016M7S\u000f\u0014\b곏/6\u0007O\"\f\u0004zUQq6\u0014wa\u000e鳵8*5}ZL?:N(-|S\u0003t:\u001b1ׅ\u001a\u0004{ȇ/(\u001ep>ĞfU\nf\f\u0019adk,xs\u0005\u001c\\k\u000bc\"glqS\b\u0013Ţ33#wWgW<?vο\u0005\nexWY<W/a-J}\u0002BIBu&!tp$ $'%b@\u0002qE[|$g[2}=߹<~t\rUUoRkQ\u0003\u0018פ\u001e\fr;޶\u0017k?K>\u0017&ד6m\u001cgu\tUgH\u000e\u0012M\u0017;vuqv\u000bnU+0OR9\u0002i2#]|9d%cTW≍G \u001et_\u0006x\u0004\u000215'>\u00032kXL\u001b${u\u0013t )#ϥu*\u0013H.4\u0018\u0016[ͬKS!Ow gj\"B&u \tH$Lw'f-_4o\u000bc򽻁\b܏S:Ԉ\u000e\u001dAV\u0007f$ ֣\u001c\r:w,^\t\tk<W\u0005;Bd\u000f;9HFøi#xJX7-Ő\"Uo#|y|M\u0003(Ʉ\tr;ucvS\u0000Uwbm\u00079Y\u0001J鴨\u00022&\u0018evZ\t${\rC:\rn>;#J?$H37]j<PM$w*<4k\"n}\"BKw\"\\<[B2sMӭ(\u001e3VW'z\n/ۏb(DW\u001d\u0014=ۆ\u0011\u0005iCh\rp#\u0016\u0013+\bUOZv\\.CZ;\u000fUfF\u0014UÜ[K[\u0010ݟC}7Ȯ.Dyd\f;qmɅjĚx6. ^\tZψ7ۘ7Zo5qD\r\u0016\u001d2C\u0003h\\[ɤn\u0015Nc- GK\u0010|;\u0015M=\u0013֊C^o╱\u001f\u001df'N#yE\u001b3\nz(O5\u0017<o9c-ӋZxbaޭ\u0001\u0015n/!I8X8\u000bbD`\u001bSy\u0004?ȥt\t\u0004\u000f;&K\u0015\u0017\u0005M^-^J\u0011,}P\u0015\u001e*w;]\"\u001b#n\u000fhou^dF&\\|OjS;TҠKPF,>e,cX3Ad\u0012\u0006\rq\u0003\u0007C<\u0003|:&^@?0D>'\u0004\u0003\u0007y=8U,|iN=\u0012\u0012\u0003\u001c}ŐW\b{>\u001ciWw_\u0016V;-3}^~VW/&;\ra]tnTD^\u0014\u000b\u0002#\u0007\u0011`HDiQ\u0017ߩ0z96r\u0016'!yJt-ԤAV?d/\u0018\u0011\u000b\nDYݸ(u\t2!=HTg$F#Ep\u0003}^=AZ.:ʋ\u001f;Iz]]Jc\u000e4o+± M9\u00039\u0018!\b\u001c~(9s/V8\u0012,\u0018\u000b\u0010\u000eHNN\u0010~\u0014\u0012ﾘN\t+Zߴ]\u0010uĹMf56o\u001c̞T\u0017>l\u0014c5yJ;\u0003\\qa\t\bK\u001b\u000f?f2~-3{PoerQM\"WBp_\b\u000b:L\u0005O^~7|\u0011ҞS\u00111d쵠{NE\u001fұdyrĖ|$^\u0015\tg>^ь\u0019\u0015T\u0014V\tkȗ}fD0ȚŒ{b>j@>'ǽBaa\u0019\"~u~f7K8o.x0hL7\u0010Gf\u0017=f/zX\u0007C~\u000f\u0017r'8zTL\u0014}ʇld9\u0012Y\u00015.$\u000b\u0007I\u0014W#\u0002a\u001f\u000f{2?\u0013\u001ddke@Xep-Irhk\u001d|7b|%a\fuY2tM0/E\u0001Wq\u001bq/\u0017Jk\u00177k!Or\u001e|Db\tn֯ؑįJ\t]qf\u0017fpJ\\Zvդü˴QA@k*GQF8Gp\n^\\\u0001^/l\u00051M2H8Q\u0015O2O}\u0019Az\u000bǫCNugIuE\u0006E\\=?\u001a\u001f]8\u0011rtR\"\u001c\n\u0012v\u0004\u0010?mw\u0013ԛ\t+^75,m\\EִU\u0014q\u0004N>\u001f\u0014\n+\u001dL*՝Nw6\u0006\u0017ӆˢ7ͶͶ¢\u000bԛ~k݀u+:\u001bQqyaIyLo\r*q\u0003\u001emHvsryN\u001be\u0005=PhC`&p=sVÌ[)V5I\u0013O!zqcG0Qwx3$&;з;\u000f36k7v5:+Q^QI^\u0019GH=\u0013c/\u0006)MuY\u0016X7C8zm-s\u001247;o\rEK龓xbQXxWP@\u001d5*SC#-G^ǜ`ۙ\u0016w51ή9.B{twVxQ(91k\fhGx1LA\nOS&czȷsa?Y2q´}EOĬ$Ee\u0018~C#웙#Zr-q\t \bkY5\u0016\u000b6=\u000f.zhZ\u001a\u0013\u0017d\u001b\u000b\n`?3m)\u0017H`\u001et\tz=dBM\nA6h5\u001fe2Q\u001c.X\u001aj1X\"al2=*-*+ڶ3%F\u0004j dXX}p3rM46~SH\u001bYߴyIg\u001b۟uL7]\u0012=?eTnD6lJ\u001b_Ɲ}\u0016o2\u0010j\u0014\u000e4\u001f*\u0012\r4\u0004\u00156&ܧy/p\fY}\u00049rYɸWm֭=CF\u000f+\u001b\u0015OteHSk=c\u0013\u0002n&x5$^LI\u001e|\u0014+\\\u0017.\u001d\u0013(\u001dh98b{Jhѧ\u0011'عw?\u00050Ώk\u001eLA+5܇]\"]L2Zx\u001e=*\u0018\u001eS\u001f-|mcRW)s?\u001b6eƋ؁nH*w`'0Qs׉\u0017\t\u0007_Ƌ\u0004}M&\u0013Ցv퉉>AIA\r\u001eRTQW\rXģ-,F͘6Ϙ\u00067IVKĽ:Hި\u001bсQu7Ƙ\u000f?sq3ы37mF{ዶT~'A4\u0016|hNW/\u00037l:s/tNN鼟,o'*>TCk~\u0012\u0014=6|Mk\u0006oP\u0012wۙ\u000fWD[\u000e&ȊdUy?\u0014`9}\u0006GMb~y\u0005Ӷw'{r,{Eyx#-ݱ]\"m\frn\r\f̨u6;G\u00165;Uۇ5\\\u000b/s\fjr\bot\b?_\rr(v̨\nڶŚ\r\u00157\u0005X\f>`->9rܯ\\@ߜM|\u0014f\u000f\u0010ï\u0004N4\u0011\u001f\u0006Ecaa'Sx*t^Bv\r8s_^a3\u001bPӱ\u0012Ϧ֛:3o[\u000e\u0016Y\r=1\u0017w|~ծF\u0006gIY6\u000eajXQհ\u0017\rN\u0005pޥ{DxD'zF\u0007Ɗ?\u0016i>;j\u000b7V?\u001c\u0017\b\u000bE\u000f\u0007-\u0017L*Lʂz+\"\u0005ձ[¬\u000eINX\u0002c\u0016fTFIYw_}\u001a\u001e7\u0000/\u0016lDhܞr~H\u0019E1\u0015/C\u0005:\u0013\u0013ݥ^]ɢPd^WGPwk4]r9\u0002\u001dyΑO8qppΫrHND\t>t\u0005{;|ō\r=6ªf\u0007Ae\t\rIuh\u00011^aR0iRwl`m@\"10nrS'\n񋗖ƤyG;DAJJ\nt\n\u001b>>f6d\ryΣۦ=75!('18Ƕ-끂\u0018\u001aWsX\u0006\u001a'tw\u0012^\u001e\u0014Y\u0010\u0012s|(/\u0016eȃ=L4\u001e\r\u001bm}f:,ĥ!R\u001aX36+*;ʩ>*|krԅ֔SY\u0012pi\u000bh=T\u001e$?\u0012>/V\u0016\u001dQ\u0017:2Suf%\u001cˋ5\u001fy\u0015e9\"&6UrdS!xh'\u0012^qqxCGkdIKu[Z(>g&g$-0Je\\\u0000\u001f\u0019p9=-\rk5zF[\u000fޗ\u0018J_2\u001cM\fi\u0018-\u001fzc4i8A[\u0018/\u0018/S_\u001b|o\r>Ϯ] c\u0013\u0011n)fw+?ѥ1*%FbFZ4U4T\u001fomwZz\u001d\u0005-\u001e\u000bm\u001a\"\u0013K\u0013xE?y\u0016\u001a\u0007}Kx6b$z ֮3)5?ս)\"LOf,u߅?\u000e}gmPaMOV]T\u001a)m\tH\u0007?9_\u001d9ʹQ\u0019mpAt~Hr\nZ3\u001bu\u0001i\u0015\u0012\u0018$<%Ձ6\u001d\"FcT5G+\u0018ǏS'{\u001b\u0013K%o*#\u000bJ=s{<&I/\u001a1v,\u0002W\u0000rWIqsx\u0016YUWC':?\f:X\u001fth7ѷ\\c:=ks\u00149Ft&\u000b\u0004\t\u0007xh6Q*jV1r\u000e}VNQ\u0010\u001cT\u0003{`ޣ`~\u0015s?\u000b(c.2NifcV\u000bus\u000eLs#;行\u0012hi_tZ$80:\u001dεgJ#~&u\u0011'z0/\u000fKH}+M΁yCL\u0014y?O|(\nOs~\u0003ۋvn^\b{MÜX\u000e\u0002`E`\u0015X\u0004\u0003\u0005\u0014\u001e.\u0005;n\u0000jj\u0002+t\u0016{)\u001d!y2\u0004\u00120Kn\u0011+\u0014,\u001a,\u0011V\u000e.\u000blQ\u0006ض@fBWa\u0006\u001b2dk_.z\u001d[%}KDqcrȤZϘj_DЄ\u000f1ĕ_\u0011c>\\r\u0018\u001dpj\u000fm\u0012e\u001f\u0002P<}Sf]|\u001a/\u000f*_yn\u001eJz-\u001bU8';Ea\u001b\u0016Y`\u0006\t\u0003R\u0004\u000bj`j18f\u001a.rL\u0015Z\u001d63}\u000b}dU`d0>%\u0018\u0015\u000e\u0006\u001f{!(.oTZN\u0004Ũ\u0012\u0015w\u0011+<?,u+q(tH񌎪\u000b\u0007m>\\Meb\b\u001a>uw\nGWev)M\u001bW6\u0003M>ً2\u0016h&aj0\u0017\u0006S\u0014 \u000f&1Oy.9\u0001<\t~2\u0013z:'9泙r\u0016s\u0000\u001c\u0003d5re^ׁ\u0012ˀ(I$/*zFtzOb\"ϨWbȧo=\"̭p<*sz_\u0014q>0þ+&m'a1\u001dn1:QS`\u000eG6\u0005,\n463T\u0006\u0003}\u001fLko\u001e\u0005̃d``>K۰3\u000e\u0004\n}p3t\u001diVwTI[D{r(c\"^{\u0005K͆Ԅ!|R\u001aW&VDɌ\u0015H\u001e\u0012w9$-\u001bm\u0011n\u0006`̅\rS\f\u0010\u0005۴\u0000Z|\u000e?Z\u001f2L2n:\u0016¹3@ſ{='q\u0004?+\u000fz\u0019y+'JT\u001c\u001d-eM1ވFX;M\u001b3nȗ>-vjpq\u0014~\bA?MG3oUJZK\u001ã#(Wgl\u0000k\u001aZW19\u000erURH\u001bw1ϋݣ\u0015y>+s{T\u0016#g\"r?G]XlH_Lp:XwպHUE&U{GsЗ5}\u001f,P&c~Xv\u000ecӘmN9Nn\u000fK\f̽\u001fPy>\n3W\u0005\u0016y2E\ri,MV>\r\r=\t)\f>ӕ\u0011a۶h\u0012^Q~ZSTɞ\u001c\t<=\u0016M\u000e?r]f\u000fh\u0004\u0017B+aSV,Ym3^LL=4\u001d>0Gj4f-\u001bt4P:@^\u001e7D;Xu=\fP\u001e#ysmQME\t%1-p\f[\u0013:J=;*\u0012j\\b޾w\u0019#:7Z\u0016R\u0016\u0014_vW\u000fԦidʴ\u000e|8/X\u0007؃=D\u0019\nOU\u001bI\u001fyS#3-e=*GR\u001b\u0019\u000eϺ(\u0018%1^\u0012\u0007zմϛv\u001b1,/c*w3sbPn\u0005#\b\u0002I`_\u0005\u001479փri[E:'ewt❼j1\u001a)vy\u0004\u0003\u0014\u0013kb\u001f\u0003M_\u0007%>&9)0 _rзT8K:;Dރ5Cgd7J+oa=\u0011X,726\u0005WBmR\u0001,\u0007,]\u0004(\u001c\u0004\u000b\u000fE\u0005v\u0005Sv3]`L{TݖIF\u000eOn\u0010dp;\ff|\u0012`.J,[:R}{X{HkJgsBuk\"jsǿ j\u001fSx)ʯ\u0006&)QD\u001fOeЗ\u0002\u000b'm\u0006\nS\u0002i\u001a`fiT>~yi\u000b;W\u001b/Ǖ\u0017yHkJܥ\u001e\tU\u00127ii4=\u00187J\u001fz\u000f\u000eq[GLg<Oeȴυ(\u0016,La/Xh/X\u0018XA\u0013X\u0006KqlL\u0013,\\\u000bo\"60pإk{zkī(&o)\u0019]\u0002s\no\t3cP[\f\u0017UVD5EF6J\fNȮۣ\u0004c]ONe<$\u000f\u001fc\u000eNg9`bdfd\u000el1a\bl:x\u0016k\r`O\u0002l-\u000e\u0016oU,PQ\u0013,]|\u0013\u00036죵Fi+붵A\t/\u0002^zǵJ(L1^EW\u001a;^\u001c;(\u001dovNlrM@9wZnhar9e?b\u001e{?\u0005\u0007\u0016M^\u0002\u0000\t(\u000e}\u0016h68\u000e%\u0000E#`1m7`\u000e\u001bE\u000f̗;\u001428OެVA7@\u001f?ޒrЗ\u001ep\u001az]ќmvIipMiuJ~_\nk\tpf膟uǶ\u0019?\u0014.\u0001`\u0004\u0002s\u000bVVp\fCa:pVض`ђ>UM\u001aM`\u000b`\u0014\u0000P`\u000b\u0004vY<=\u0012Bjz\u00171Rqž$9Ի4\"¿4(\u0012^\rm+]\u0018W]\u0012S\u0012;X\"s\u0016\\j|O\u001f^2g=n7QZ \b\u0014'mZ\nq\u0001|\u0016س|'\u001c(N\f!\u001c\u0019;\u000b-:\u0006V=c\u000e`\u0007ؠ\u000eV)_\u0005+4`3'\u00124%{ȯ{3z\u000bk>\u001f,uX\u001cU\u0014\u0019Ć>-|ҋܣQ\u0010R'\u001e/-uBk\u0013\u000e)J.aɒ\u001dv,Z(Gk\u0012e3VC߿\u000e(NZ\u000b*h\u000b\u0019T\u0005`ր3\u0001\u0019koܟ\u0005\u0003ۭ]gn`Q$X\u0017\bY?=<\u0003zz\u001b\u0002`\u001bQ+si!ao\u001eԽnm*rx^\u001cp5ccXcrMsbRW!m\u0002ȁ}ɏ\\x\u001a\u001c\u0019p-c9\u0016ȭ\u0004sv0cB\u001dڠ>X\npn\u0011X>\b,[\u0007\u0014\u00025Z@q)X\u0004q\u0010}:On_h,lzr\u001d[>\u0019~e\u0001\u0011ף}\u000bsih1\r.\t\u0003MI#-ɟZR\\ZDf[}\u001a7?l\u0016}\u0002VT\u0005kVv%ԡP\u0006\u0016C\u0000p|\u0011l1BQ\u0005,_\u0002+6\u0011``\u0007K\u0001;N\u0014+sSz呴KJڃ4Ѥ籯ϻ\"\u0012g<Y/i=G(fNv{\u001a6ZU1\u001be\n\u0011ۦ1!ә,\u000bE`\u001e\u001cEse0\u001eoe\r~r\u0000\u001b\u000eX\r[8``\u0005o\u0007y{\u0007aN\u0002k\u0012`N\u0001بz\u0001l7\n\u0002\t){\u0007KUhe>ZhfЧQmZ2c,\u0007\u001eEڴgISސ&)=ۑ`6\\\u0011\u001cZSs-tjX|w(28߶m2ӞYLl\u000b\u0014\u00191g0(\u0007Ar\n,Q\u0011̗Gj`6d>X\f&\u001d\r\u001b]x\u000eJ\u0005\u0019OMGDI2p0tp!<zԿvj!EV5H_`?>\t\u001e/A\u001cQ\u0014ծ%/]\"\":*ܒ*]\u001dn\nG 洿b9O\u0019+NY\u0006\u000e\u000fi\u0007`u8\\8iɻ+~?uǕgv[3}_@}~3OP4EɻnSzZ3}D\u001eN%sz\u000eIoy\u0006=s'+(gAʂ[}x,`\u0003]C5x\u001a\u001d|3`2^fݦ]2cBE\u000f/V\u0001Vi\u0002lI<؎uC\u0010\u0006#w ilzk8>>z\u0010\u0003[?)C\u0010\u0000d\u000eܑ?^=_j\u001aO0?6|>y\u000f|\u0015\u0006Q\u001d١e?K_O\u000f0C73'3~H񤰸\u0002ɨ6V\u0011\u0006-\u001eZ\u000fA3m50\rV5?u\u0007΀ZW6\u000fتs\u0019l?z\u0012\u0017\u0007j͛|\u001f\u000b9xCʦVVk\rGh37W{O׹_:>}w)_%\u000fnտK5٬*fsT{3a9\"bMCo <E裡noĺku1I\u0013k֮oإ,`\u0001\u0019l`ٲ`\u001ec[\u0006\u001c!\u0019\u001c>8PD<R'4MO\\\u0014||Zh/\u0017y7^`;}J\u001bDs\"/%qp6\t*^o\u00139M:xA\tǭ-r8v6&O܍;ޟ+Ԟ|77шm\bHd]V|>\"d}ܧu9q-:z̆R\u0000ظ\u000b\u001b[RhEh{\u0007u>ѸwJ\u001b-T렕Tk=C͑\u001aHiĽ18R0\u0013AzC\u001f~LթX\u001d\u0019g>\u001bI1w1bdrZVuA\t>Jt\u001f#֮BD%p\\x6|\u001e߭p\u001d>p\u0004Mx_uTԷ\u000eu7\u001b,X\u000b\u000f۔y\u0016̱l\u0006^$#=\ni|b9\u001bm5H[A_LcF54fPI\u001b[i\u000b8h<@aД+Z-[J\u001d˭݊\u0018\u001dv~\u001d8=i?\nVs\u0012ٟt'\u0013\u00147j\u0017\u0016j+z?d,(,\u0017jʜZ\u0003\u0006̨\t\r2\u0000\u0019T, :\u0004jX40_k:s䖃SW:z\u001fX>ax\u0015\u001c8sҁ\u001b3sz=}\u0018'\u001b+E\u001d\u0006\u0014\rZdG龻\u0010r݋7:rͨf\u0014YNLb]<3 pA\u0019\u001flڻVr\u0004a\u0012?awlg\u001dɈ\u0001m\rǂ*<#7\u001a?ƻU\u0013Wo?3ǋ>뿢U4.fX\u0018Sgc>\u0019[w!_F\u001czZE\u0003-6D_0\u0018M\u0016a?ĿNx\u0019@ߠ{-{A\u0015m.`d{Iш|WfC4r0\u001a0z\u0019\u001f[aVaRw#od?%Ƽt1X\u0005\u00059}c\u001eg\u0018N\u0012ﻧ \u000ew\u001aߵۋK)\u0013yn0vop!j\u0011\u000b`͒LceKy0W\u000eƵ{\u0003<pP\u001c(\u0012=T\u0015U>+-}s~k7\u001b\u001dQc]D=\u00157!Y6qV%t\nǅصE@W\u0010 $@sS\u001d_s6\u0007͋-ڍei\u0011\\^l>kb'y?m#%>bBKV_5\u0017\n9\u001c,s@\u0003V\u0006[)j&޶`,f_\u001fh,\u0017\u0002V\u000eۂ#h<\u001d\tX_@ktz4e0HM(\u0019X\u001a\u0002\u001du.0\u0002\n35?8#e#?(\u0015x\u0001\u0007\u001cX\u0014(_\u0006cRv\u0000`Ң-\u00147x\u0017~)`\u000esyΨ\u0001sOiidĒ'kS\u0006׻Au\u000el\u0018,(븀eLX\u0011#v\u0001RVUY5t'&\u001d9%z:g֕s4=)d}FL{{q\u001a\u0013/NhevNv烬Gqcq\u001cQ\u0001;V/\u0005-\u0003<\u001dm`~tk.\u000b-/EČ?k\u0012{N\nꜹO~pU\u0017h#9`>\u0016\u0011mg1h\u001a0C\u001bf#~-}1e2Nw<%keIQ=jDW\u0004>Jo8SϽpMv\u0018ly`\u0019k\u001e.\u001aҤGo~G\u001f.#S7jyWо\u00145\"5Ɓ+ؑ\u000fֳҚ`qX\u0005jb\nrl,\u001du]y\u0018xa\u0003L'6%<qcKvqŻ\t{'{x\ta\u0019#\u001e\ng\u0019H^gk72}\u0017hRU&*j̽3U`N\u000bXv7fye.Ժz1\u000b_1pj0\u0015\u0003\u000eݼ\u0005TJjv\u001az4yGwiUk\u0002\u0013/|f{~`\u0012qg&b\n\u001ah\u0002}\u0007&B\f;3kCb>\u000bto\u0010^1i>,p3៷Iީg b(h\u000f\u0006\u0011x\u0013֯F7\u001dÞoe|P\u0017\u0012@qGM?Uy)˸{\u0013IG{\t͟n?\u0016\u0007uUa\u0003m\t\u0019d5~M=+Ż\u00143OCY\u00179f٣b3\u0016l\u001eW\u0004\u000en\u0019\u001ci\u000f0RS\u0005B\u000b9K;֗\\\u0015ϻ\u0015;\u0006/ƓJ\u000f|O[M^\u000eI5xw=m\u0005\u0016B~}8Ӏ\u0013S\u000buF8F.䦶\u001d&\u001b`9Z}w[XiCم\u0016;0~\r{i%1H\u0017Z=A\u001b\u0006\u0006崾\u001bZ߸Xi}\rϹM636?'\r\u000e\n\u001d8\u0000XF\u0000L^p\u0018HG\u0004p/MBtN]nax ~i\u001bE.\u00019ϙCB^Ja,({{5\u0016p^Py+_Հw=w-1t>hY\u0013\u0007)./w$rǸܔCݵ%4\u0007\"\u0011-g4mk\u0017Ѻ5S\u0011󁾂\u0016FtM!l&P?\f\u000e\u001d\u0006<[i\u001e#~N\u001b\u001bOPw\u0001ړ@|y\u0016ڋFn5W!dzF\f\fޭ\u000ee4;\u001bK7gcWC\u0013\u0005?'6#ig^\u001c\u0017\u0014D\u0005-TƘ\u001e\u0011s{LD|\nʛ/q\u001eIQBċx3ુq\u001fa=̩zis~\f\u0003zaHz\u0003\u000bOyee\u0016f\u001c.j\u0000\u001c=\u000euD@[E\u0017l\u000bjТ៓6\u0002GԀ\u0011p \u0010[ș]pmꙺ;{\u000b\u001b$\f_8R=\u0006fy'\u0004}Bn'uK\"J^\u0007\u0015b\u0017f\u001f=\u00178w\u000f\u0015QQ%2o`\\KPDwb\tKq<u씖w(\u001bUd\u001aoQ\u0001ehq?De \r\u001e~s{\t-Z}!p\f7va;*%,هcdT\u001f\u0002\u00076l\u0006Gw\u0007\u0006p']l'S@,v,\u000e<gPWI̧:\tv.5E<F/F,\\R\u0011N/nBsgL\u001d+7\u00156\u001ep|Uf~PfV#\u001e\u000f\u0013TYy~Q\u0019ojK>1[9\u0007WbQg\u0003\u0013\u0016\u000fke4\u001ejZft\u0012\u0011e$5.A7\u001a\tr,\u001cyW&SJp\u00000\u001f2\u0007TѼ1Ld\u00103\u0003qIsIb\u0005\u0017{iu:xj\n/\u0018yK\u00071 \u000f\u001aDܜ!uzj5f1靾\nB㩛!>E+m3+<\u0005\u0019Fd˭W[~>7\b'm,o\u0010\u000fۄ;-ܤ9I\u000b~XX\u000e\u0019\n+ZY\u0019}\u001c\u000b5`[s.VU6\u0002k(n1%P?\u0001ԕ\u0000C}\u0016!fLe0i9F\u0017\u000238l+\u0011[\u000b\u001eg=TfB%m9&-$wq2Tp\u0007kV\u0017[xF\u0016*(1\u0017u\u001f5Q?b\u0011E;\bϴ\u0015P\u0005Fz\u000e\u001e\u0019\n4iM81n\u001c{+N\u000by|gqGcl\u0001@{/\n7b\u0003f#|sע}\u0013&<L%\u0002<\u001cា\u001ckU\";U\u00107\u001b\u0018P^\u0007λ;v\u0011uXf:/CB'-'*W$\u000bxQ0gp\u001a\u000f\u001a\u0019S=\u001acco\u0007A\u0011fĔ*=\u0015q9\u000fk\u0004a6>3\f)3\u0019y9\u000b+zrʤڅx=\"b\u0017S6b\u0005_=\u000e*\u0007?Z\u0005_\u0003-\u0003\u0012pN^=umIՕ\\I*j\u0018+1zlإل\f,\u0015sӅv3Q'N,MOC\u0004~v\u001b[&$\u00061߸C|nz\u0012q{P\u001bq\r+ΡDzYEs\r\u000f#L_U_\"ni=h烵\u0000\u0011h\u000by=u5\u001ef'\u0011\u0005\t[8ٟU8\u0015;\u001ds<2\u0003_^Sׄ~u\u0003\f92h%ﴽ\u001bu\u0017\u0014ֹQ=y 4\u0007ړ'x\u001b%?j⛳ozn\u0012\u0007$E0.\u0015xF,\u001e!R\u001f\u001d64ܸܼOT0νu\u0014(\u0010\u0017 \u0005<v,0r5č[k}nca7\u000f-ߌ,\u000e\u00120&*a^Y+gӲZ\u0004Ra\u0001\u0016ܟt_\b;/E(u\n8\t}YYb<h\u000b+\t/x\u0004\u0017oGVq}/o\u0013vu\u001av{&\ny.\u0007\u0017\u0011W%?|dpXRa\"SۯOcYC\fo\u0011piR:\"_m䌩}@E|\u0013/[\u0013G9qҾ\u001cF;sF\u0004oeb'\u00107\u0013\u000b݈=\r)~SKk\u001b=vm\u000bւ\u0003w;w\u0003\r\r\rk`\u00044t`l1\u0005\b\u0002:zl8's؃ȿ=ڈX$n!qd\u0019w\u000e\r<S\u001511[\u0019D@zN~\u0000.闹r.EL,fE/\u0012\u0012YX\u0007M,6\u00135\u001eB}\b[\u0007^M(K<\u00181?M\u0013f3/z+;uq\u0012*<^Vg)62\t\r94Ю\u0003`ʍ>5l\u0000&\u0017 HĆ\u0017޸YT%9t\u0010\u000e\n9<10f\u0011tX#\u000bF\u0014ƁDJ\\K8ߛr>ha/\u0014\tx ^<i\u001f8ٓ\"]7\u0018`@\u0016,N<v7g\r`=v1,o؈\u001bbc>c7!^\u0006G|AE^at\u001b?z@L=UyCGT%y\u0019W\u0019iޏ\u000b1a^\u00108\u0007?7\u001bqqؑuC\u001e'xUJ\u0018LD6u9\u0013xް1/r\u000f\tc?/\u00167\u0011_#Zprr]\u0014\"<ӗs3pP\u0003mSY\rx/ȣ5\rRHpR\u000fiKM\u001d&\u001d\u0007G\u001e\u0002\u001au]r\u0011\u0017\u0007\\,\n֖\u001e3q[\u0017&!\rJbi/;D.\u0002mEL\u001fu\u0015G,\u0012\u001ewjr4\u0001e)+:0M쑶>XO*~YkcDJ\nեRw6# ֮*%r;8ܬ\u0011UνOjQBP~V\u0004ywjS!od#\"\u0017ca?O2{\u000e\tyyi7>b\u001ef\u001f9\u001fK\u001d;K\u001fUƣ7உK\u001f]UPU5\u0002\u0007\u0005ZG\r\u0000DZ_\\.|+e\u001f>\u0019\f8c?\u00051S\u0019~FdjciGs)[\u0019|\u0015x\u001dd\u0004?hr3\u0006)w2Z\u0002z;/ \u001d\u0015Q$b0Lk\u001e\u0002sq۫H%\fKjB4\fd3j\u0017:\u000f;4\u0005ߠ}Q=8\u0019F=ʿp\u000b?vk1f)c5\u0001Ȟ3(פehps>sic\u0019CjX&/(uFvG\u0002\"G\u001d1\u0010{\bƲnC2G>\u0016\u0011O(nƘ*\u0011gĝCq\u0017[\u0007\u001d5EU\\Ru5C\u0002\u001e\b}fjQC`qGH\u00105s\u001b9Z\u0002Z\u001b\u001c%e{^S\u000e\u0002\u0006|@]KH_ؔW*ؗ+\u000bP\u001fs8O\\ı8+4;:%Ճ@쟨\u0017\u0011[\u0007>\u0019Ƶ{*\u001eeX0VpJpڏDD?EJ\u000fՇ\u001aD\\*FUId\r\u000f\u0006g&FGqWE7oVځ*l\u0013 KD/sw/qw\u0000}d/\u0003ʀg\u00130H\u0019P#3\u0007t\u0011_\fsO]+XϳrQ-5j\u0002\u0010߆Ffmd\u0018\u0007e\u001eI\u0016!<UBzx(։\u000bˏ7q\u0011\u00170?\u000e?Q=nƈ*ba-\u0007\"\u0016\u001d, ل{2\u0013YX_W\u0010NEՐ\u0005S\"\u001dGv!\by3>p\u0018..\rat@geI\u0005h+> \u0007噼*\nu\u0000\u0017CxH\u0017i3!\u0010i=\u00071\\{\u0006Ba~E5\u0002bF\u0013!\u0014pw3y=y5b=ᒷ\u0011{\u0006iNsu\tmnja4g\u0010ÌB3\u0017fR+Pނ\u001e }CưA5\u0019\u0000\"2\"\u001bE\f\r4#\b\u0004Y|睲;:\u0015Y\t\nu#\u0011\u0002h\u001e\u0006\u0006|Y\u0012V\"8\u0000\u0011gg \r,'$lZkS<)\u0003b\u0005b\u000f!+nva\u0012bɐ\f?;c\u001dRA777\u0003sfX)׻\u0018M[»͘֏_]2˯t\u0019\u001e\u0005\u001ckQ\u0007!,i\u0015T0)\nC{\u0010DD\u001e\u0003Ob;\u000f \u0003ܴ᣼8|\u000f\u0002]X\u0013 \u0013\u00137{4@zĢslKY\u0016oZ\u0000a2bOYJ\u0015i0^3\u0010+\n >\u0010\u0000?e7\u0005mZTӝKJ\u001e\"oCoV\"|!=\u0011\bsʈ\u0017;I0\u0005c\fH{PEu5$.ޘ\u0018ܳgz mGɫż0\u0006(8Ɍ\u001a'c\u001e1\u0012qirc@{_S@\\F.X|\u0010\u000e0\u001fk\u0011\u000e\u00161(\u0005cX\u001fcH_тEzob\u00011gzR\u000e3=C\u00111a%\u001d$c\u0016\u00046$􍄕\fi}u\n!t\tn7mbhHs-m~@gƦd\u0019Άg\n\u0014#Pb\u0003</u\"[\u00129amu26,\u0011dxASiSD!VK\"w{=ە\u00117լCԪP\u0011w1̻ېf'\u0013i♿|w\u000b\u0007{ub\r\u0019v\u000f<黽(_v˺Ρ}zG\u001cW\fSr}\u0004ˉ\u000bAsZ\u0015\u0018\b\b\u0006<\u000b\u0019#\u0006Ц@S\u0010p,sErvUa\\\u001a搂6g&܈?[\\eq|\u0005DM\u0007\"n\u0013\u001eUOt/I\u001ene؅;&_(\\Z\u000bh\u0003\u0013w>t1vⒼ\u0001\u0003,W48\u001d'kr\u0000N\u0019\u0003H0\u0018]#mN$d*}!&\u0014\u0007I\u000b\u0017\\r[\b\u0010H\u00102\u001c4gxU\u0005;A\u000f!.\u0017Ҭ\"O8u!~н\u0011L\u001bs^7\u0013+ȴzu!f(\u0016\fq0\u0005m\u0002S\u0007-$\u001eW~\u0010aMDJ\\X@Y^GZ\u0019]\u0004l\fK6e.rh\ty&.\u0004;%`r0\u0005z\u0017zfcfˑ\u0013\u000f\u0016JGZ]\\\u0018#\u0016q\u001cJ\u0002aBxf'9#\u000bw괄\u0019MlAr\u0016)y\u001b%\u001f\u001e9DlA2J\u0015Ճn#,]r\u0014\u0000i\u0012\u000eaY\u0010sy\b\u001a\f\u0016O$ NNO3\u0016Ŭ\u001d&cgP_(X\u0003\u001bC\u0003MU4a\u00137'!N<b2:~aHo\u001e3g\u0019\t\u0000>1lO\u0005+\u001f\u0005<\u0016R\u001a\u0011M\u0017gj\u0018ϫ\u00113G\u0001\u0016ߣ4\bۀpn\u0018\u0007\u0006.u^Ojk\u000e\u000b +f\f\u0017 )F\ti2d\u0011\u0018\u0013\u0002.\\\u0016\u0019F9iey)\u000f!\u0015_rDV\u001fd\u0007k<⃑1eȤ\ne\\\u00171VlA<\ba\u0010/\u0013z'A:\u0000uǕ\u001c\u0012f5r\u0001m<3\u0018s߄쟑 9Gd3>Ca1YONvǁへTгmx|\u0011~x\u0001ĊC:jhZ\u001ab\u0013\u0019}ڌ)7sR5e\u0019\u0007N%tSzE)\u001d\u0006\u0016\u0003\"\u0018B\u00148\u0004-RW!!\u0019\u0010ߘpO_\u001c?Q\u0015I}\u001a\u001e=QZ#4#ՠp.o\u0017xƭ\u0014-\u0015\u0017&S*6\u000f09\u0019m\bk`FxRQ2sL\u001e1D\u0016h\u0014\tULܿ\u0000;\u001b\fᚳw\f.b>f\u001b8\u000b;qu24Q=\u0001\u001cV\u0006蚐\u0011v\\\u0006i#\u0016\u0018ܮ8L\u001f!\u0001ne#4*\u000f0\u001ah\u00033ڴp\u0010\u0019\u000fݢ\"<u{6\u0000.قsW+\u0019^_(x4s|R'\u001cC\u0017 &#Kp\nƶ\u001f:Nۄ|\u0003ND\\zKr[j[\nTȏ\u001b\u0018\u0002\u001ee*x(n\"\u0016bq#0nu^O ywV\u001cA9h#+\u0007)uM|mǄMl>bqO16p\\LHAz\u001eJDz\u0006uM\u0014yB\flu^s3Pn\u001e([\u0011\u0019\u0013\u0019#s֐ҖMF\u001a{0fE\\><uXn:\u0004mh5I\u0018v]z:/^\tռH3\u000b1p>k͋\u0012\u0010LT#k!\u0003\tH\u000fi\u00105ʼ棈\u0013D\u0018uDb1Qr.ڧ\u0001^\u001dq\u001fׂ\u0014)hޣ5'ah.\"NU6l$\u0004Ix\\!JoC;:F-\u0001}~v\u001fQ\u0013K9Fn`֏gcv9,qAa\t\u001eZq!l.f{c&ua\rtY\t\u0019A.K\u0014g8H3\u0006\u001d<.kexH[\u0005\u000bE\u0005;>7R\u0003\tl\nK&eaJ\u000e\u0019~1Ta!x\u0017=f#3/,,\u0006e\u000fz-\fS#yY(\u0017?l\u0011S4N\u0011W䒴Rt%\\\u00111P.1+\u0010\u000f\u0016ZFs\u0003[gG? Lh2o\u0013HU\u0018-ŎQKE\u0005ۑƗ%qe\u001a\rKMfo7\u0005oN_WC,n]U=`d`qUk2j\u0005\fԲ\f\u001bՔ)\u001dʰލ\u001e\u0011^t\n濌\"3p\u0018o\u0010^䝶\u001ez\u000b$nomgr-Q݃K\u00049k\u0004w0\u001alB\u0002b\u00161yDHO\u000fmqH\u000fٿ0QSخ++܊_\u001ee%c\u0010(n +\u00002\u0011^=K!\u0011\u0012dk(LЮ/{\u001dq5$\u00140IY켼\u001c\u0019|(I$\b1w\u0011\u0019\u001daПEUet\u0011!v0}\u0014\u000f}\b~\u0003kͤ\u0016vYūWv'8w'Wۉ\u001dD\"9tHZ>\u0002!\u000e2[\u0003j\u0001mMW9\u0014CMe֛\u0013z&ɣf\u000fR;api\u001awKsA0\u000e\"*r3Y6h\u000b8GfR`\u001eNxMZMBڲ<\u001c<-xܢs޳E'g \u0013)kn?b3\u0019|F\u001a\u0010s\u000e7ҙ\u0011'7\u001b\"\u0015Fw6[蕱.pYHSEp3m,n_F,[[i[\u0017Q7lFO\r~4.F@\f&F\u000f\u001b[vV.ڧI\u0018hg\f9I\",Ȓ\u0012v\u0016/:\u000f-#\u0003ɕ~hg0Z\u0001%YHцg+\u0011\u0019YV\r~r\u0006cpsH\u001bY\u001e-5F\u001a\u0005/D3e\u0015:'4i\nҗ\u00175iS\u0001~\u001c\u0019Y.i) p0\u001cĠ{\u0005I\rKuk##خ\fc\u001eÝ7;>%*贰(y&haA0H;c\u0015n\u0017>YW\f*JD݇9V'!1\u001f(ZXhV(d\u000e.D\u0014ZrLǰOt\u0018\u001a\u0007myi\u0006͕\u0005}.4d|`\u0015`~g>K\u0011\u001c1cE0Ey\u0006\u000f,)/\u0013s9F\u001eI1S^\u00033x01k\"|`'OMBLp_cXHg\u000bit_eX\\۶-Z@\u0010dd\u0015w,\u001b\u0004>\u000b\b\u0016,HBpww(\t\u0001J\u0004,r>\u0006:{}e\u0000\u0005U5\u001c}z\u001f\u0016;\u0000zu\u0019_I;'\u000bٗŝs\u0012{&Xb\u0003\tf\u001c[pC\rK(,4sN=0\u0003؏F{]{uՁƇ9\u000f$]YY\u0007\u000fR+LMg\u0003:]Xw^\u0018I;k\u0004(_g,꠲oČs\u0011&J$Q\u001e~p=\u0015P\u0015P\fH\u001c\u0002\u001dK9L3\u001a\\r d\\EԾ3/I<\u0007U\u0006g5s#\u0013;P>ѲɘMM3yw;\u0015WދG\"b\u001a44Qb1J\u0007I({^\u0010㡛eڨeXi)\u0016{y;\\!+?h1-X+-ssQA\u001ba\u0012՟j{G\u000fBG\u0019]zm񇦲K\u0005=ЖιRa:eKZJOoQ#BL41V+Wb$\u001d\u0002zɎD;\u001e_OhhqS}쯤🜛_/{wA-wa\u00114~(?W V`}\u0007JSĴ3Ĥ}Sf[t\u0018vG\u001aA\u0014\\A,yO%MˁIQ\u0003\u0014\u001dC$7B*EjTflܺQ-'\u00123iUִB\u000eYW`س\u0010<\u0004ze΂^2rΊR|ʥ\u001bz[Pv[w]pK[R\u0006\u0001\u0003\u0011P=3HuPH\u0003G v\b6~=\u0016yw0\u001e|zRtXpnS>`\rͥr饕)\fg\u0005\u001b\"\u001a\txd\u001d\u000bm<z\u0012;Q\u0003`\u000b\u0017wL]\u0006D\u000f\u001e5/#0\u0011촍,D)o\u0011lc\u000bI\u0001Ml\f.\u001c`I-h\u0003`l`\u000e:r@0uTAG^NM\u0011wbMFj\u0000\u000e{)@Ϊj=ua\u001e桝e6,`El\u001cjg'G\u001e~\u0006K\"\u0006Xr\u000bFֽ;g+n&\u0013]'\u000b\tC\u0003\u0011\u001ajv\u000e][?BU\u001e\u000eЇFP~w5p>9M\tKƲ\r\u0011[FB,\u001daţx\u001fr娬'xn:X3Jv\u000em=25zzw(Vw2N.l\\D~+T;+jg\u0005\u0017@;K\u0010sQrCw\u0006W7զY2\u0015ѥ%vgm=XKG\u001d\u0015GrKv`^hǇ\u0016\u000677I\u0005&{ǒ5\u0015I!8[9\u0018[-R\u00013P\u001f>4\u0006%]<%r/ETѫ\u00074LΕyܮ\u0017ʲrr<<ի'cma0gHNn\u0017\u0003clRX7j\u000b)CPGDAE\r\u0003*[F)B\u0002܆k\nJ\u00056MqH)v2|)$q[?#>2o\u0006~+UUraG\u0006\u0005t\u0017^\u0016jg|ꥦY{g\u0019K[c\u0007X(pZ\u001c5BJ=2|\boM\u0011\u0012W@\u0010ti(=\n6y\b?`]\u0011\u0007?\be\rْ?1\u0005\u0017\u0017B\u0003°?2e.>\\pcߣpd:tI\u001dƂ\u0002KK7S\u001eF~\u0000\u0006I.ۥ/٥R柄gv3AF~@00=\u001d|tU\u0011=?kg\u0004\u0001\u0014W>AJ7C\nOB}>}41|9thW}W\fs\u001cu\u00139T9>K|\u001b\u0013SE\u0010Ǖrt\u001c`\u0014>\u0012X7:v\u0016tӋP_k\u0012\f W3Bښ1j8S{uxP1\u000e\u0017,r\u000fU\\L>\u001c˂VZj#vR\u000bN!k8F-ƿ\u001a\u000f\u001c>\u0002'|ځiR}#ʃMA=y~*Mb)\u0003,8&\u0007|Cc$kTg\u00175Oa\u001a]%5_>9\u001b:\u0004_\b\u000f\u0016R8\u001aq2\u0007),A}KS8eP\u000e\u0015C\r8j@`\t\u0007`M;\u00160\u000b=\u0016\fF\u001dp\b9:[ȹ\u0018X\u0011*Ў.\nt~㳨mB[&ƢBeO:I͆5\u0002O'tLhMu\b[bcM\u001fcº\u0005a]:;ɿ\u0010Y\u0016VYh\u0019SG׎C*F˚5sSv\u0016BPJ\"\u0019[I\\/\"\u0013\u000bK!Fz+rHh5߇f\u000b0wzA;[![5\u001f]3A>ϻ\u001dյŚ֘\u0010\u001f@/adnP޸))&zt\u001a\u0001')L/$k+\u001e\u0003\\Dk\u001bۖ,N$ǢFB͟ܫKḼ\u0015z[7ڧ;j>Gx?Jξzw\u0010JˊzS%1\fX!)וĶYY\u0001\r#ԍG\u0006`T4PO\u000e.\u0018\u0005.|Bhhhn\bccBL\u0011;qW/݂\u0004>aT\u0003ؒ\u001a3𾜭\u000f`bI\\%ѕc\u0011\u001f\u0007m!W/F䍂f5sɼ\u0005%S\rT7i(`&c\u0003\u001c*dMr4}c\u0003\\\u0014]ϑ{Os#$vIӽ/vh:j\u001a|AU4-7wS\u000b\n_QЬ\u0017tހ\\#z?igqѼ-`q|\u000e𸲤i1w_w%O0h8IG\u0018vVT61Qu)rǸ\u0006@sAP'N3\u000e\n.,\"6>O1\u000bY%p1\u0001\u000bP\u0006)2G\u0014W4-\u001551̾Һ%c5w)Lo7\u001bNNnn0cׯ r3|\u0014\\2%\u0006r*'`\u001b\u0010S7\u0005\u0017~Y,N,T:|>t8b?q%稭TZ\u0012lh0W+X{\u001eǸ.6\u0002%H>B%kQ-OYb\\8[a\u0012$J>5ɽ\u0000#Д}\u000e$E-spх\u0016zb\u0016rx\u001ajќcp/\r:XC\u0017cO(t\u0017TEc6zɄfE5\u000fQÄ]\u001e*E\u0000\u001dj9L\u001foxͅ.lIQD9\f=\u001dkԛ\u0015Q\rjBe\u00013yϰc@/n9\u0014z=\u000fEqC\u0013{ك\u001a\u0002՝>:+#_t')v\u00124-|\u0014&\u0001bXrNcvT\u0015\\_]7^G4&%\n?\u000f,%F\r8%(+9D\t\u0011\u0014\\X99\u000b\u0007:-DWmWPM\u0015\u0012Wϋ)\u001eIT7\bM#\u0011ds){'s\u0004e\u001e9O\u0013C`\u000f7q\u0001Ƞn]\\\u00038\u000fs\u0001K>+kYއ,yi>ՁÀYǐK=a_\u0000{]!/\u001c>M[ EvnؓZ8t8-\u0016]\u0001#k\u0018k`=BB\u0002k>iO\u0014LA\r\u0015kgD?Eb40\u0012M9I>\u0010\u00191\u001f9?)\u00147k(Dpz/t,\u0005\u0015}8)B-7B\u0005<Aڂ6\\@\bt\u001d9/4Ƞq`\u0006\bխf{t8P}\u000e×S-[K]|\u000f*[` h@0m?1MI\u0004K@W\t6\fuTd\u0001\u0018Sm\t\u0013\u001a\u0007(ad>Z\u001bg'.W4,\u001d0\u0001!sK߸k\u000ez\u0004\u000e\u0007ȅ`\u001f:NBlxRޢ\\\u0002U\u001cЄ\u0002I\f\u0017\b\u0014*v\u0014iJok..:=k\u0013݄wRm\",J_Ux}\u0011ޟ\u0004\u0011{\b-\u001asޮϤ*DUpu*|r.ɹ\u0012&P}8!\t\u001d+8\u0018\u001a[\u001d\u000eB\u0011Z\u0004Uć\u0006$9W\u001f@oJtm'z'\u000f\u0016\"**\u0019E|$g\u0006y\u001d\u0011M\f\u0015f\u0016*\u0005p4r\u0013仸IXozQۆ4gbD7#l\u000eԓ\u0010ϳO.\u0000^\u0016Aْ\r+\u0007֋Eaȝ῁#nW \bZ>iCH\u001c\u001bB<^OAә\tcbp!얀}s\u001a`D}9T\u00155\u0013C1]\bڧQ+hŢNM]\u00043\u0000\u0017\u0006I\u000e4>;\u0007\bL\u0016]( IĠ\u001f\nayP'\u001dHJ\t&>X\b}t\u000fK\u001bC[ТzeX\u000bH\u001c<\tu>?\u001dF\u0003'\u0019M\u0006!\u000bb~Q@-\u001cZ\rK\u0007gPMpr||Xj\t㘴SӘS8!sڰ\u0012'\u000bpO~R\u001e~j|jt\u00182{'\u000e\u001f\u0002Gn\u0002tzH\u001cB#\u0007bج/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_/Ǘr|9\u001c_\t\u0013Vo]eպ\u001eބ\u0017Xg̭lgLs*Gn=}8\rO`ki9r\u0014'/_?g%y\u0005\u00143ןeng?M<\u001d\u001d\u001c7'-l]>ތE\u000b\u0017.9op悹\u0017\u0016-9E.\u0005s\u0013_<\u001fo>.'oWϬbS9_';ܣ\u0015^[6Zo%׳ӳ+\u0015U7[ӧ\u000bl}\u001b/oϦ8_d@s\"yϙo/ʳm\u000b9sz\u0016?ߔy\\]\u0013\u001b\trϗ\u0013^_N\u0004x|5.vK>}Om;2G[Wo*m6v+xC}XHN|\u0006\u001dOv]0w^\u0007sI,k\u0005/^w\t޶xlr\u0013I¤ϟpwĲ[*V4R7b\u0015F\u0016Z6\u001eFFm\u0013:CAfPT+7iY؅tG>>6]SC{r\u0013\u001f)֯\u0015ƌCX鬽ƀSZnXT\u0001.8Sy\u0016]3kw\u001dk)ZORadQ\u0001+\u000bݔv=̭|\u0019Y60{X(V/]O+x\u0007m`\rVoxG-޷;8]dnR\u0016~\u0003N\u0001Rb=>[\u0006\u0016}؃T9`\fzn\u0017l&O\u001c/.\u0001zȥf?\u0015tk\u001e _E'^;Z2Wrыɧ`zsT?ٓ|W pA)G_w\u000bV3j-h\r^&p,\u001eD4o\u001d*^v=\u0006q8xR.\u001dp΁7\n.Y\u000bQ\u0003/3~7?=)0uk\u001cZ1\u0006=f\u0016k\u000b\tz\u0013d\u001bo\"XO)d\u0018Q-\u001f\\\u0015\u0015ӏۚJ\u0018f\fa\u001dB{ɛu_˻!Ay#~x\u0013=\u0013P}.\u0011} X:06x\"Me\u0007m^ZTR{\u0002=\u001a\u000b4 *N@\u001f誣$ؐ{J~\u0006'U\u001b\u0014\u0005-\u0018rSn\u0005\tx\\M\u0015J\u000e8@\r-\u0014#綤\u000e410\u0012\u0014+֚(k]؜ҟߚ6sܴUaު(\u0002g\u0013\u0003L\u0016ۺ{7ާ\u0014[v\r#z\f\f΀͍\u0011\u00032a߽\\/9\u0007m'}\u0014T\u001cV\u000fN\u0007;y\bx*)o\u0010\u000f݋q.\u0017~E\"9FI\u000bŌS\u001b\u000e٧\u0017z+(GKD\t\u000bf(\u001c\u0003\u001c\b+{}\u0012rSl\t\u0007\fz.x\u0018X:6u)?s\u001e\u0019\u0007}Qw\u0016F\u0013zQМ{&\f\u0011\\M[$\u0011g\u001c6w<t}!\u0010\u00163\u0010\u0001ribʡw057\u0016\u0007;G?#x\u0013C\u0015}~\u000f>M)|\fʹPP\u00039.\f#LƂ\u0003J\u0019}ѕc)Au6\u0007ў\u001bArX\u0018+v\u0000ݓԠ\u001bKw\u0003˾]#z\nvk\u0019\u0010\u001fFaΒ&of.(\u0005g2[\\p62\u0016\u0014Ɔ\\z\u000eα&sFTVw\u0016\u0007Z6\u0007Xט>\"lX\u0007-'M\u0001Cx/\u000bS\u0007\u0001~\u000ebaA\t=]=݄\u0013Stꭔu,$G-ݺN%g 5\u000b=ja\rz>ߗ\u000fL=s\u000e\u0001g\u0000\u0019\u001f=\u0011BƁ\u0014$\r&\fB\u000f&\u0014ܖ=Sfrr\u0016z>ѓ\\їWpq\u0010ߋ\u00199fd9\\9~\u0014rZTM\u0003\r\u0010ڇ@?O&>\u0013=C+ڟKƊs{،\u001d9\u0010=\u000f\u001b=6\u0011UcDtb\u0006R{#~Yޖ4X\u001a;P\f\u000b?`\u0018\u0014CKwLvN\\ƃ뫫ϱf\u001c퓋\u0018#\u0014\u0002:z\u001c,;x\u0011B\u000bG}T\u0015ۈ쑂Pʃ\f\u001es`=C9FgO\b\u0018.z\u0006-*8p%\u0011}Kg>9\u000f\u0018+5&\n\r\npY)9b\u0018\u0006B)\u0013x*e{m\u001fʿ\u0003\u0003߬va\\\u0007D0lY;cH/\u000f\u001bc|t󌹅^1\u0016A9?s#nK\u001e\f%\u000bCܚ2\bWU$\u0017m\u0011C\u000eaz*+n)|$R>\f\u000b#$g?=pE\u001b9\u0005Bo\u0014[6\u000e\u000f-'\u0019O\u00155W;\u0004<jQ\u001d]=q\u0002rGv1R\u0004\u001f\u0006\u0014}tp:|\u0014g2|\u001d7\b`._#\u0000Bp\u0003=PqK@7c(P(\u001f\u001b8\u001d\u0010\u000f\u00035进\u001eN9\u0012_I\u000f|s\\`\u000f~Ymk\\Bth:=κ0\u000f}iC\u0017\f\f\n)\u001e\u0006:zo9\u000f@\u0011Cݡo\u000f\u0018W5\u001e\u001crL\u00049t4x\u0007g\r\\B\u001e\u000f<\u001f\u001c[ј\u0019n&_\u000f=ԧ\u0012_\u000b\n;\u0019M\u001f\u00197ƃ\u0006\u001fZК\u001cI\\p\n\u0003.k\u001bѯ;\r\u0010\u001c_\t~\u0010Q{\u0017<\u0010xP&\u001eӇ!\u0004iFp\t\u0003\u0003\"X@en\u0003\u000e.>$1dgU'Ȓ9i\t\\\u0007.JدW0\u000fӦ\u001c\u000bOrV\u001elON\u0005q\u0019Ň@57헥ם5b@H\u001f\u0012˃\t&\f\u001fE\u0019\u001c9\u0018{AޚaBV>/o$$\u001b\u000ecHd\b\u0018F\u0006H\u0012\u0006S\u001e(b\u001bQ4z\u0012A$|,PPHڋ\u000e\u001e.ArDٷRD>i?'D\"\rxhDkQ\rΓ%!xh\u000fgX>ׄm٫2%\u001e\f~pp\u001f\u0013_3io)z2*Fߖ\u0012[\u0003\u00068=F|9\u0017ľ\u0006\u000bKAbv\u0003\u0017\rB-\u0004賤6Ilv[ \u001dFU9\u0005dm\u0003w/\u0005\u001c#r\u000e;-/\u0000\u0019X-=po/!tz3\u0017$\u0003t\u000bK!,:H\u000e\u0000H\u001b\u001d|\u0001tr&{1~f\u0016XN>6q\u000bG'r\u000f~3n]SO;~ԃ3#O]Tշ!\u0000\u001e|\u000e+^d\\H\"Q\nJ\u001dc<|\u0015\u000egI\u0007\\P\u0014/ł<8ئ\u0004~[=d\u001ch/.\u0019o\b6h_9qO1\u0004\u000b\tC{\u000frBGa<\u0013\u0006^yw=\u001f\u0011)\u0002O\u00166\u0003HP\u0011;Os=\u0004C$dhGI\u0018<\u000b\u001c\rG3t]bo:4\u000fH\u001a\fm\u000fQpP̓\u0003<%Qy9jX\u001f\u0016=*{\u000fc\u0011ccчys\b1\u0007=]\u0001G\u0014U;wO\u0007\n>@|\u0006\u000fŽ\u001ao\u001c\u0000v\u000bq1\u000546u+\u0011+\u00042}l\u001fgkXn\"$Wf9ɿR\t܏\u001bwl*8ioo\u00007\u001e&~6X3K91\r\\P\bA\u001a\u0014\u0007\u0013T:\u0012PwƂ\u0005à\u0006z#/KnLM\u000f`\u0000p\u000e[\u0007S; \u0002Q\"\u00062\u001c[O\u001dB9-Jۗѯ\u0017d|U@SI?5\u001d|O\u0003Cy\u0007lErokH\u000f\u0004N\u000f]\u000e\u0012\u001bc#q\u0000\u001e$\b$\u000fSAlj\u0004e\u000e=\u00048D0\u0004\u0004u!y\u001e\"$v򟞧2\"\u00176\t?D{?\u0006\u0005s\nY.vs\u001a\u000b=\u000e3)'!~\r\u001d\u0003\u0006\u0005qh\u0003o.\u0019 \t}\u0002-ə-]t3r$1З\u0001\u0000#˪,=hG{\u0013}\u0006Q\u0006\u0012cyGs:y`۝!\u0018bO~K\u0000hh>TIr\u0015J\u000b$B\u001bkEۜw y6xwD\u0004g\u0018g\u0010\t\u0016%&\u001c\f.\\3?i%\u001fvw領F*G\u00059˻\r6nXyu3E.n1am!}SZ˒r<w\f\tnA\u0004>0F1\u0002N5\u0001\u0010\u001f\u001f\u000bN\u001b*kyc\u0016%O\u0016\u0013\u0016\u0006*<\u0016Xͥ|幼W .j8\u001c\u0010<o|88\u00135\u0014K\u0002ڛ`\u0002>\u001e\u001f7\u0018\fc9Es\u0005k\u0013\u001d\u000eߖ\t\u0004'o0iAvd\r,hPl\u0000'>f<~l@9S\u0004\u000b]̘\u001d\u001d\u001frܸ\u0007|[\"B{b{k.Nkht `]W.\u0011׏߃\u0010`\u0002Aй d4&\u0018\u00071G\b\u0003\u001aݟ\u001c\u0006ۤ>\u0005\t>~\u0002㮴\r\nendstream\rendobj\r57 0 obj\r<</Length 65536>>stream\r\nE\f}ݮM\u0017z\bVڼs\u001e6O|\n\u001f>\u000f\u0001|\u0016\u001dFR\u000fp\u0014zH^mFr\u001aS\u000bK`E5}&bv\u0001|\u001d*S\u0007\u001c2dc\u001e*tsX-;I׍?\u001aB;\u0010u\u0000`d\u001d$V\u0003F}\u001589/,|O:AHr\\pQ\u001f\u0019q\u0007Zɺ;\u001f\"L,T\u00154cNLG,blg+\u0006\u0015\u0018V\u000f\r.[ԞԡEcEL\u001e\u0007\u0003\u0001\u00076ԇ\u0006\\4_\u0019\u0004^{2CFK\u0011ccQ3S~]A\u0019#)^\u001cǔH5\u0013\u0007Iy0b\n\u0015\u0013'\u000bV2UOWP˂\u0017QpX\u000b\u001fc`\u000f3\u0001y7\u0017\u0019W#\u000fYǀ_g,f[ܲ\u001a\u000b.\u000b*\bǧru\u0007˄Bqrtq7\u0012V8\ny)0\u0002w'\u0012`\"S|L\u001ebi|\\΍\u0006J\u0005j\u0019\u000b#CeWN\nsꑐr;y\u0004\u0010s\t\u001cptn\u0012G\u0007\u0004=@\u0016n\u0007ܫHwt\u0002\u0017\u0013E<\u0000~\u0019x\u00075a&g/x\f\u0006\u0005g;\u0006\u0012<\u0007=a\u0004\u000eDZ\u001d8Qۥ\u0011R.^\u0013䁮\u0004m\u001c\u0000G9\\F|Q%ߨn,R`o~\r\u0018\n3Q\u000579p\u001c\u0015<'~seiFњ>jHz\u0012|\u0005nTe9-Z\n\u001b$_\u0007\u001f\u0013j\u0017#x\b~%~Pq?7\tC\u000f[Ho\u0011\\;Q6T1\u0016\u00073>%w@W9\u0001C:?@יON;>\u0013ڃW\u0018/\t>42.;.\u001bE!h$}bR1ۿ嶥\u000ebH\"8'R\u001f@,lX\u001676k.3a\u001f}Ő\u0011BƁ\u0000\u0012\u0003\u001d\u0004å̽3_Y=Vs\u000ec7\"_琯#N\u0012܄\u001ag|3y@\u0006X\u000b>\u0004\u0018\u0018XH/\u0017t\u0012\u0006\u001a#\u0017\u0016b\u000fLb\u0014\u0012N\u0015sq>={AM_%L-o\u00188}\u001bճY\u0007<I\u0002񷨑)I\u000e\":\u001cS\u001e\u001b\u001aZ+$\u0019Gk\u001cz\u001c)I\u001bќyA<Ңfj^\u0005gm\f>'kM0͖n-i\u0010<\fG~)!\u00024gDࢥ\u0015~\u0017SO\u001cD?\u0011\u0001Kȱpn2p\u0010W;Sh\u001cLƯk01 烯I;\u00159|t:|\"Spc\u0011~q\u0016\f\u000f\u001c׃WFU~\u000b|;la\u0019Q:ɻ\u0010:\\¡I{J?4Ԯ$\u000e\u0010K\u001fq$\rol\u001a+I\u0006RЁV\u0016\u0015bɃL\u0001ƀ\u001fn\u00028&q\"+B.2<ֿ`8\fz(T¼\u000fu`\u001e5שƆ3zO[!l1T_\n/\u001bCq\u0004\u0006\u0005/=@)<.tCBߚm$W\u0002g#4ؒ\u0007?|}\u0001֟E?u>Lh=\u0006\n\fԕc\u0006O?]_#\b;\f>V\n\u001bEukC\u001f-;Ԍ2\u001aOH9<D1j'\b\r6\u0015W|bH-\u0004:\u0001Kr07q\u000e:@\u000eL\u00111rE\u000b\fԓ=\b)'f{HṣD|\u001dܷ8G|\u0002y\u001e|(Ѓds/̇\u001bjS\\R[\u0010Q\u001c/dJ@c)k_J0I6\u0006df\u0012[\u0018?ic@\u001b\u000f񍙊&*\u0005kI\u001b#Ep@phc1wJh7Č\u0015Z6XԼ\\(m[\u0003W:b(gO>+i\u0010\u0005\u0006\n\u0015)Gh͕r*iAUf\u0015􊡏-\u0001\u0013E홨(ї#6m(WcE\\iR\u0013\t>\u0013xYO9Mj\u001eް\u0017SL;\tk4|Is.\f>VqcQ6\u0014^qDLB]u\n\tn].\u0016J2\u0013s蹡p$\u0017)\u0007\u001d?\u0011xMA\fT\u001b#TOmDhct\u0014 ÿ\u0004\u0014\u000f\u0018<E͌\u0014\u0003!`>\"6p$\u0004O,lm):\u001dr{':h\r=`\u0014\u001fg<tdj\"\u000fNA`ƀax\u0001͡In\u0004L@R\u001eƃ0g/D\u0007F y`\u001bQ@~=]K,\u001a\rX>,Zp\r\r<O%<\u0006]\u001cشYmT\u001b#{4Wp\u0003\u001f>Ɛ\u0015\u0014s\u001e\u000b8\u0005S1FB\u001b\u0003צa\u001fس|9j$`\u0017\u000f5R\u0013\u0019Y3$\nM6\\Yn߂\u0007O<>Uߴ\bY]ߥQk\f\u0004c\f>J&Lf)'\u001f}\u001bPL\u001cm).C/O6\bJNsK\u000fJ;\u001f]\u0013\u000b{-,j\u0006g\u001c\u0003z@\u001f\u0003\u0000,eɜ%Iس\u0000\u001c\u0005-K4 'B<\u001d\u001cȁ\u001a\u0007\u0004Sq\r?IfR\u001d\u0006rآ;߫ڗ.l\u00118\rKS׮\u0018J[0jc7`DVm\u0010}⳨\u0015hm\u0006kMW\u0017tӶ\u001eaA\u001d\u0005C+N\u0002,]+wuɱU\u0013)oO.m=)\u001e s\fZIn~]n1h\f50Մu{Ϯ\u0015<\u0014t]HGݙ$\u000fRٺw\u0010%⿵1ʛVֳ\u0001?kc([u͠\u000e\u00192\u0014\u001e\u0018\u0018\u0003)1\"1H\u0016nԾ$\u0007ryv1\u001d\u0002GS\u001bw<;~#ЌUXƖ?[f^C^1\u001dWa^a}+Q?59o=<ȩI\u0007/3Q.xp\"\u0017b6i(7*Hޯ<\u0007\u0003ȇ1\u001eI\u0017n-XPu\nhɢj\bMa/F\fkXx\u001f``ʱL\u000bGHP\u000bD^\u000eRhS\tL\u0017/ߴcrߛdN-681Lփ\u0017R\u000b\u000f\u000bW@\u0012?6\u0001`(M= !'7xu\rͺ.B\u000f|\u0002{3\u000eۨ\u001f\"\u0002\u000f/\u0002s\ts\u000b\u000b3\u00171o`sO]M\u001bAQ#Jy*\u001f\u001a@\u0000~\u001bk(j_ǋ\r\u0016\u000bi\u0013\u0013\u001aUQwT\u001b\u0013>aDUe\u0016YL1H\u0016Ɩ\ncM\u001bPKD\u001dG\u0017}\u000b\u0019\u0011ޥ!6gm\f\u000e#:iS5a\u0012ق\u001by;i qd\u0011s\fOʟw4`*-G]Z=N\b*y\u0006s4\u0005\u00078%\u000f#\u000f\u0019\u00195\u001c\u001c#e\n\u001adSv\u000f.}g;\u000f1J\u001a\u001b|\u0001OsQ{j\u0013k\u0015ך)Lx'\u001e\nɖ[\n]𸣆e@ɣ;'RŞ/(ɫ;Ori\\T^˺@\"R?\b\u0005mG~T\u001b#t،Om\fO\u0018[{T\u001bcLh\u000bH[\u0006fA\u0013'\u0004kA_\u000b\u0005\u00036s6tӇRN~칈\u001a\u000f_\u0005{~\b<y\u0017\u000bY\u00171CC\u0003>E)\u001d\u000bngeܞv\u0013aG!\u0017\u001a[\u0016-kͅU|\r\\\u0003\u0003pQvI5q\u0014\u0001ȿfY\u001b\u0018\u0012^\u00185LڷkU;Z5l\n]\u00146\u0006[D2)\u0019:\u0016f\u0011\u0019h|'LH;]<3_J?`\u0001\u0012;\u001e1Vl\u001f|yJ2/jl֕X\u0011\u001doL\\щlG%\u001d\u0002M.qD`:ͱ\u000e\u0001\u000f݈|~\u000f|q2<0\rXGC\u0007<\u0011\u0010r}'5j\u001f\u001bʇY{\u000564֯x81H\u000fk\u0010\u001668+-3bA8\u0003|\u0019\u000b&Z\u0014֋L\f\u0018\u0005\u0010\\('\u001c1-\u0003_\u0003z\u001abݕByt?\u0003젷i\u0017\u001aЍ,O΁6Gk\u0010\u0001`ϑ:*[9r|t\u0016ttaѴ:ж\u001e\u0015qZ\u0000Wt7n\u0010ਭȅM[?v$~cǁr\tSM\u000e4\b5\u0000hY򩻦psMSuв4\\A\u0001-d*Xq@Uz;e\tp͍\b\u0000g7]\u0016\bwy?c\u0018EU$7%8\\¨v<^\u000em\fsQc'f\rf<pv*K\u0019LɨyIEc6FT6{b!/v\u0000\u0017\u0007\u000e\u001dS)2=_ָh^MX3~\u0011\u001b_clvq}\u0006%cDk#~XѺ͸:\u0007\u0001Cׄ1T訥!\u001e\u001cIX&h5j9\u0002v~&[:\u001c\u001a\u00005/u-)\u0003/\u000e-\u0019\rNyc%݀AU\u001bΪH;j\u0011h:{=b12k\u0014\u0011a\u000f\u00028\u0013MêŚ\u0010/գ\u001a%WXb\u0018|\u000e\u0001t\u0004%ֿ)MS\u0004كF䣔\u001a%Һ:&82\u001eBpIP~\u001fKV\u001eaaT\u000b%VUӶJ}Օk~ܡ\u000e%֩\f\n&\u0003-˔SV>^\rQe)}e\u0018p\u0018]3j\u000bc?k8jt[T_\u0006O\u0018\f_PT\u0018#P\u0016Y\u0004}=5RO\u0012ۛ(.\u0004b#\u0007\u0001w\u0014Y\u001b\u0003q\u0002`-@̖k'\u0000}Ҝ6z\"W|{TҸF,m\\n\u001fYoWٿ=X\u000e}?äs\f#b'?e\u0014E?\u001dBEE\u0019=\u0002Q\u00035é)\u0004}\r?@nUvOZQ{B7\u0019\u0004e\rE\u0005{aX\u0016v^X3\u0013H,\u0007\u0012\u001a\n\u0004+\u0012\u001c\u001f\u0016jW8\u0007]7h<;\u0013z<lҫk\u001aC\u00035\fZ \u0002ڰBpVמ\u000f)$Ϡ{t1\fh/AXo:Fo]Sa}\u000fkCQ`\u0014YOC\u0002kpLK 8'u0뺵\u0007#C!\u001a\u000e\u001f\u0011¯Z\u001c\u0019-%\u001c,aۛ\f\u0003zQ\u001c\u0007{\fG\u001d\u001af\u0002.~ۑ\u0013c~D#M\u0007=w%4\u001486\u0013zbDE5o<4SU\"6~\u0004/g(Dt2nTC)(c84\u0004{CW\băS\u000b\u000bTк\tL6L.g*Ӈ}ػ\u0013\u0002*\u0010}d\u0012_\u0003\u001d1ಸ\t$g\u0003=\u001b\u001b\u0000\u001fL\n2\u0017\u0017\u0000йuTȻ\u0003Ag\u0012|\u0003\u000b-⯱5?}1ӓm\r.\u001b5Z>Vh@\u000ec=bB\u001cy\u0012VUN\u0004K\u000bi\u0003w\bAhlvKe\u0017\u001d6\u0007H<tD$AފZjܾI4H9:jc\u001f8\u0019x\"q\u0016\r4}HIGg`lfz:&/Q/\u001e_#Һ\u0010Lkau\u0004g>\u0003\u001fV\u0014֚agS\u0004ӱ\u0015U1_g/f\u001e<X8l^>5PU--u\u0010\u0016\u001bLp̏п\u0015\u0010Ӷe\f׊!\u0001l\u0017\u0005mSUyRU5sK?O#un>\u0003O=2<7\u00059\u001bAXXZ(\u0017c\f\u001f]\u001fPQ\u0015],\\Cdn`\u001emsNZ1թ/\u0018\u0001~\u000f\u0017!1]Kb}\u0001뼨i`?\u000esu>[ry5e cHJkw!d1kQ=\u0002\"2\u0007&uL7B}2PMkߤShG({޼S4}=az؋:ҩkO[7Ԗ,,tP3Vm\u000eS9u:Z\\lE\u000ba#y\u0005؛K^\u00166\f\u001aWؗ§u\u000frF\"s\u001e3YM\"h|V5ZFy)?OHN,\u001f5Ůz\u0006\u0012೯.\u00158/k8}}rGQ\u001c0/~\u0003{3σ&\u0019_\u0012'u2tR/\u0004m\u0016h٧5\u0014\u0013hM\u0010kBXwD8|\fO$1wb-Vn1u~1,Ӹ-\u0014\\]Hu\fΆ_f\n\u001a\u0012L\u0016z\u001bMJ<0gUKo\u001f*K\u0014~u\u000e\u0017UQbØ~)i}qh-dJ'1k!0QI~<\u001f5o1zx\u001f\u001c)4>,Z\u0003\u0016S~\t\u001b_=j^VY;hT>_T\\eY\b=\\yO\u0010.d\u0004\u001f{\u001c[xXf\u0004xZoD_\u0017r\u0010y\u0002\u000f^\u0010C\u001fܦH=ګ\u0012g\u0014}\fQ\r$h`O2|pQ#̦#b>\u001fw,|t*|.0_0W@&t\u0004\u001bkJS7O:v\u001bcݿV\u001e1s7K챷<󣡪*j~\u000b\u000bt|tu3wU\\2t57\u0012t*gо$tzf6_޺R\u0001c][/nWYWԙ\u00057Rf!bzW2%~@}FL;7\u000f2{?@\u0003\u00045O7p\f7+n\u0007tl_B\u001b'U~\u001dKi'g2OV÷pˠw\t ؙo*\u0007+\u001fg\u0002yz\u0016{{\nm\u0005[ݶNm3\u0011[6@RUG#78wUq\u0012\t용x\f{G؝\f}\u000e=UYTIYh5ܙ⍧[k\\3\u000eܑG<\u0007-\u0003mJ@\u001by#xՊ?c2a2nV|g^Rs^>,\u001fg\u0003,#jVկ+k\u001e-G\u0004M(5ro,\u001bV\tG\u001e\tJqIjDcRs}6\u0011\u0017y7[־p{vlկkk\u0007,&I\u001f,kZ'#\u001ez_w|捅\u0014NL85\u0003_ԕ\u000fLʗQb\u000fO$\b6f4\u001bs*X\u0007sL\u000fwV𛬺WkoѢӆ}Ki\u001c1mx_}{\u001asSD[I:E}{6fsi\\`\u001dW޶1L\\eҎv3\u001d\u000f\u0018\u001a1LV\u0011c場V[b\u0006YFVO\u0010v|VA\u0014tܞ'&޷f<C<(~ l/~050%\u000fWV=_yb\u001fzqd\fUޙ\u000ej`\u001c|g\u001f|²^X':Dp$\u001fk:kxъd\u000f/2\u001c~i6\u00126xFzdZ\tlXQm\u00105LE2>ҶXPU>]~bU7ٽ/T\u0007m`}0b\u000e|0NUg^\u0013?g}6Ǟo\u0014k<\u0011=TK7;$ssԘ-j<,?T~\u0015G^R]cś۬N,\u001flTs;ۍWqn|\u00054\u0010|Ĝ \u000bG_|5<\u0005\u001bw߲K\u001f4cf\rZX\u000brW}]<R8Z-{\"ʵ\u0018yCVl7\u0010k^\u001a/\rēӠ\u001fjn-zY\u0017\u0000qdgZ nb V>]V\\iQreѼKMu:Gz{?Ex<^\u001b/C$p4W5NK\u001e/&=Lz~WbAc4\u0012{׍Nҭ\u000b-\u000eY}]׍\u0017.Z!\u001dVZYhX&~k\u0015Spo1\u0019\u000b5\u001d\u000fwSZo{O||-T=[\u001e0Y;[\\\u0007Au\u0017%{ZC;Z͞x\u000bgW\u001e;q?ڱ:pw^zp_svd͎/\u0002s5w.^~r;Al\u001bȝ}j\u001e|dk߯W=QUq\u0015\u0003w\u0019\u001f\"Iڬ-<WPUlPD}\u0001>}Y8_\u0019\t\u0007\u001eґVkckf\u0006\u001f}U'\u0016\u0013/\u0018\u001b5{W;Kw-\u0017n\\ӭ\\3O;;Clbν\u0016O\u0013ovf=\u0012X%oIUw7w3-?o\u001e>.cv}\\f\u0018\u001a7\u0002y\u00194/'\u0014\u0001*{3wcp,_?y[.K;1bkU3T^SzZe2Bߖe׫k:TևnY\bxZ;\u0001ҹf\u0017y(>1XeX\u0012o\u0013LP\n1ZYؼHy\u000fSխl?J\u001foH\b\u001f&H\u0010>$򿾉޽ե9=ոWԧ\u0014fݍl_.aқ4G\n^H:R'mIg~s\u0017)k~_|L>nundp\u0003{=Ý~!I[}:nJu¥vW֣-F?NSUӕXv|ΆxtՓ̞|t!\u0006W\u001d\u000fj\u0007yfU/X$\u001d`^<6?ix >~\u0018~q7])]|\u001a/i^&\u0006XOk;a󇽲\u0017G@}K)|c[*ԓRymʼ>M8ɹ\u0010ωg[-/oS>`'\u001flT\u001fi<d͝x,񧞪Ug^\u000e{Jtf#G\u0013\u001bߍTߙs$\u0017\u001eK\r\r{ax\u00177\u001e,q}d#vo.%H\u001d\r1b]/{\u0015\u0007~/l\u001f+vo,zXR~agkY\\wӹ\u001f\u0011?Җbh\u0018Rv;\u0003~[\u00036.e1\u001f\u0016rWozr=eIv>'4\u0005(onm|sEٱ\u0001ݍ\f,\u0015,k-V:\\KZow8^bV\u0002\u001a\u0011wG}t{Ճˉ\r[m\u000e\u0011~\u001a6\\~;IyAr,_ɔ?^Kyu\\\u0013@CmNXΡ;9oG溷n^\u001cq|/_~ۘ&mO}~!kyg~s\u0003SZeɋ﹨S\u0013\u001d:ݼU>QU\u001fTigg7TS?jJvpӓSE\b/oϛ[\\W?ZZKȅkxlm\u0013A\u0018\\^]ѿ57ϴb_j|мoN\u001d\u0005\u0015\u0011\rői%[K_\u001cɗiȔ~~*||,(-ENvZ9eqL\u000fm%\u0017\u0013#\u0012߭\u0015\u0012Oo\u0003vj_\u001aҘ{C\u0016\u0010CeY@)=6\u001b~bn.dv~X+]xjP\u0017!5\b^Y+kB}k*\fsYUMO\u0014;8[~V\">m|_$~Ji)\u0015rǭ8ooj[2\u001eeDU7jj6d͉OM\u00100?oWQ읷nw\u0016\u0017B|ힷtő?{\u000f\u0016;_ǹ*lQ޾Ե}_^\"{gg;)+jNSkL*_,0axѶnھ<u\nn=yATfzA<Ҭ\u0016n{Z\\Jt||ɩ\u001cGJ*\u0007j\nb%\u0004=LNmɮ\u000f\u001c\u001f}oF]wڍ&̫\r\u0001w}\u001bב\u001b2\t:V\u0017]]\u0017ZPRob9)xX4g\u0005w7\u000bkQ<l)Wjis;\u001b+=&nK\u0015wϟFogH\u001f3w\"$ɴzݨ:\u0007YSxEv;N~۔n&9,a|\u001dʯo$ؽ<B\u0017:E\u001ej\nܸy7bo5\u000324\u0005f\u001f%1<wܲܘ|+i&ui)\u0016;;\u000b߉ұ\u001b/lkVwnEZH~r+[ꡬ}RUfTۦN<n|\u0017\u001b~trCRE=M\u001b\u001a#g՞\u001aX<\\\u001akQhkj-+wy\r\u000b/Y-0\\ܒa\u0005#K;j䷷g\u000f\u001d\u001d,lK)zTPx?L)(\u000bA'8]\u001b9+̭܃wB4\u0005uQ9NOv\u001f:'m1{MǮҝ\u0016_^ V,ļ[QI%Waf:-[;6\u0011z7FL\u001bQA\u000fr}f4ė:sc޽\u000f5idrH\u0007۵@EzSʮ{\u001f~4o\u0017nQqBc@{ò\u000f5\u0007fhͬh\tsxy0eNG7j{VoO\u00057e\u0017$7\u0017̩݉\u0011\u0013ؘ,ayS{FZ3\u001aUk5En(Ö\u000fC\u001fv6mu9m5\u0015n\u000eO\u000fo|}.ՙ<Óxիq_F5:<۟kIY{\u0007\u0000g\u000b\u001ff|p9bqo\u000bN1+\u001dd\u0012\\:ĸmYD`;\u000b2Z#\u000b\nEڿا1KV睖\u001b^uJo;e7N}ٯfkoVKQG!mεJ5%8u\u001c*\tSS\u001fWR}7B~٘,<l\r\u001f<\t\u0010\u001f4˯[<[JCK\u001b\u000b^=q=4a!g\u000bol^^ͳq4[{iE҃Ċ\u00125__ĲϞ\u0005\u000b/[ϲy,qm\u0011\u00051\u000f̋\u0003g\u00051ilx\r\u0019\u0005#\fvZs745$WފА{#B\u0013SVmlO6]\u0014?w\u001d\u000e|\u0010'\u0007\u001c\u0016p;(\u0003k5jߌʳ{Nb\u001bY\rI\u0005oh\nʬ%>N_6\u000fq\u0007Iʿ}\b]in{};ZBodj\t\u001cm\tIk)\u0013\"ޘxh_\u0019\\f\u001c&wUV[\u0014߭0P_b\u0015\u000b+fQ1c2&`Ձ\u0006)k\u001eta~y\u0012\u001aRB\\KQ9YW\u0013s\u000b.'V^d\\I΋%@x*EC֦\u0007\u000b\b.*ʨK(\u001eSvD.\u001b\u000b,Zlr\u000bĿi<7\u0013,-F>.0\fXi(*W6L1F1L1J1X\u0015yJ1\t\u0015+Dz)P{:Bg\u000fbQ\u0015#_T\u0019\u0018bD7}Ũ\u0013\u0015g*Ǝ2ebbE|u:7j\u0014Ëi+\\MM׃\nκR\u0017yfpvi}D^^]LA\\crIDczqtL#47cnm|}Zz\u000fux`kf~sO\u000e42T\u0013ain\u001f3\u0005\u0019dW5(0Ô\u0006~?\u0016\u0018\u001c\\b`2sGxY#)'0TW[GKG\u001eO\u0015C\u0014:C\u0015\u0007+f-2SdlEGi\\kKf?:,ߞK\u0017_H\u0012ZGm/cO\u001dˏmJ),\u001eSy%JZŜѹ'oh.\u000eq+\"ckKWC\u000eΪ\u001b\u0010S޾-{/Jx%Yy_;W]\\2\u001f%?9KV*&MWL1YC{}a\u0006CV;L\u0018\u0018UttuZ\nO?w#!WG;I>ׇ\u0014칢{&I{Ձi\u001bɚI9+\t+\t9y7cs\nn\u001aJTΡ\u00119箄i]\t>y1< \u0007ni\b͹^\u0017\u0015ߘ\\,Aaꏏ\u001dy\u0017I\f~䝑\u0016EN#'\u0013;\u001cD\u001fփ6\nMoj)M\u0006;WCk O]\u001fib銙\u000bl\u0015b#q}g\bQvқd\u0005r^\tͪ\u001eS{3\"73\u001aR\u000b_ʈV\b<q-$PM\u001c59\u001f\u001d_[\u0013CZ\nzefuUQ~ܠ3\\COz\u0019䚆\u0010\u001bDZv5ТW׭Ea\r%sqO.e9]&٫\u0018Tَ\u001dr}\u000b\n|_H,Ia\\ыQ\u0017q/=y%,VH޳A҇[I7<MtXv%d>pڟ\btφ\u0018;X1s_tc>\rSV|!1WrO]?u#мW]Ȼx9<'f&!#?.!/>.]u٥uQvzعpu!g\\\u0018ݟ`/z\u0016jsP;y\r]؝\u0007{]P~zW\u0018\u0018;^U;+\u0016ZWjyعF`'Rv\bNQ|ؽ\"\u0017\fy%^9\tsN]\u001a<vXv=\u000f}3oF\u00027G5\u0004_H}2z\u001e9xﻑ?_p:~u#wHOgoGA:\u0017\u0006UL]X_w\u0019ʗv\u001d3<\u001biS;tki\u001cQ|jX\u00032\u000fo\u0015](k\u001dZ|78<b\u0016߈5|)Y*+\u001dL/\u001ewz}\u001a_Oz?\u0012\u0013\u0007W|;I[1O*sϝv-J%?\u001fwRD+wD\n-={5հњ\u001c<\"\u001aRsH|5Fjl_O746iutyC\u001dz:4Z~G~ۛ\u001b5B1Tg02NO1\u0013\u0014W\u0019\u0018kbİuK\u0014K6]]~s\u0016J\b-\u001a\u0012\u000f\u0010\u0013r3\u000fuɖΧUi9M|e9\t#5;oz+H擽䜾ٹFwڭ|:{\u0003Y1B(W\u0002/J='(Fj\u0012)\u000f]_w\\U׶=JU \u0002b\u0015EQ{] ґ{QtHW\u0011\u00125\u001b{51&FM?%9gIry>y{}s\u0003\u00025\u001ce9~_3`!2\u001d\u0000\u0019G\"d\u0015M_\u001c\u001cwiݭ\u0013VD==P\u001foG\u0013fOWoñ\u0017eC/Vlj۫;U⡷\u000f\nvfa\u000f]nUi\u001fp~xk #Msqx\u0014!n}\u00144A\u000eLt쑩b4j-js?\"S[*\f('Uγ5|VuBIKŝ(vFaKE_|QyjqEO^-\u0002?ru\u0002so%}\u001fߏ%~Dq4ך&q4q@Vf\u000ej5ၬmV,\u00070\u0007Y␽_\u0013ZQjӅ-\u001bIŦ\u0013pnZy\u001b3Bq\"_p.vzA/ڿR؎ϱ\u0017USfu%8\u000bX\u00194>pt\u000eld\u001c>\u0011Y!\u000b\u0005rj4^f-O@\u001c#\u0016YΑ!i\f8F\u0013\u0004s\u000f4i7\u0002VW*TO\u000fW%\u001eYm˻\u001e/vb6\u001c;_)hFa;\u001d\u001evF6I}S)l\u0006_\u0019|q$G\u001bG8\u001a`\u0000\bi[ K\u0019B\u000e27}ldfd\u00130^MV\"SܬB\u001cM[\u0010fV#\u001aN\u0018\u001cUٹ]S-\u000b^\u0015\u001dh\u001arϔw޿X\u0018n\u0016vÜa{\u001e]YkfU3_\"2~\u0010ό-\u00062sTc\n\u0014dp\u001c~E\u0013s[,at6\u0019&-\u000eA˒T\u00024#\u0016l\u0017-\n?\u0013T-b^̸XEKK\u0017qu\u000f[N\u0018wZW7\u000b:.|u'\u0017E[Swz\\V\u00187\u001e?\u001b{T\u001a\\{*>I\u001eM\rp6\u001c\u00152ױ\u0010\u00027\u001dj4e\u001alĢt\u00124ý\u0018MY=rd\\d'iE\u000b;U\u001crR5[NNxEk}e\u0017Z?;\u0015}W\f]P\u0005jͷ;Ӟvw^u[yd\u001dR*\u0019\u0016\u0016\u000bXIr-\u0011qıL\u0006~[d9\r)\"'\u00104&\"\u001379\u0014[_dc\u001flGUEhz`+[\u000e;V>[}@5\u0005/OW$\u001ft;J<vBQ˩\u001b_nan}(k\rt{Y똍?}h.GK\u000f5S<\u0016a1\u0019[@\u001d۠\u001fpb\u0005>%\u0010YNE\\TOd0\u0004Mqs.\u001e-=b\u001db;*GϿE=\u001dT}b\u0016;;\\\u001a\n} \u001f\u001f~s\u0002XKjy\u0012,M_0炳\u000ff+j\u0005YLqǾb\r2DG3<sb%\u001aY i\"d=E\u0016 ;\u00124G\u000b\u001dS_\\zk좦'TW\u000e6j\u001byn\u0015[Z6ih}bʥ'ϗn5L7\b/.\u001a4*j+&\u0006\u001am:$;\u0004/K,Г\u0011\u001e'q%3\u0016E9Yhc81[MY4\u000fyKդ8\u0014X4u\ftMA\u0003|\u00139Lcqk埪&SqJ\u0016A\u0015%z\"G[#>\u001atW7u&<\u001b\u0016⇭\u0003n4~w'Zyw*fxn|\fHl\u001ẻ#9\u001e\n9\bKS-kXhaL\rT?d\u0006ɧ5W5}7a\u001eՔ5 \\sB5ke?,ޚ,o|cT|K)U5\\f}r\rA\"A(t2O7<nz\u000ejr5O@zxW\u000bZokyv=\u0007\u000b蟞\u0017]7\u0001\u001f\u0001߱M?b9'dc,|4m\u001fJFvL6\u0015Ռ\u001fӴΒc\u0017d\\PpFki-ݥV?_Zpu첬\u000bc\u0018Pٻ=T\\Oe}jCc\u0015J%\u0012\u001fT\u0019;Z!gڅs碻\u001d\"V|\u0002\u0010i(>\u0013?Q\u0003\b\u0019jV\u000fvN\f\u0004s\u000fOtAfS<\u0018rKFJ4B\u000bdMhI\u001e\rǆ\u0007+GTkZvW\u0004oE#e1\u001a\u000bdAٮ\u0014GkUM/L\\;~Z{B\u0018'~QH~t\u001b]wڿ\u001dswpT翬c\u000e\u001eH\rÕA㿆~\f\u0015U(O܏_|\u0002\u0002\\u\u001a\u001as܃\u0010ic\\1l#AS [843\u001bK*<44U\fY<'L@:'8\\u\u001biTTA\u0001oUO\u0016F}Y*/dQ?B{\u000fuoߛy~{U\u000e\u00017Ub\r\u0015+\nO>翺_\u0012on}e\u001d}JAm={=wn4ia4e]CՆs\u000f<yMGЌ%AhW<rˑ\u0013Vh:\\5Zjo*XaS_\u0006\u001bϖ,+D^?$~\u0014?\"\u001fޔ\u0007Qx_ojRE\u0004}hDqU\u0010]q쫽]ѯ\u000fv>\u001d`O8\u0000q\u0011Z\\Eݏ\u0019[xi=zg u06\u0011ʹ<w#r?KC~9?\u0018\"SE=S9R-F\u0011wպ쇭mo\u0015v)m+*p\u0014P|yU9z\u001dW9xRyB%oTojcqK`p\u0003A\u001f%c\u0007-\u0016r[\u0013c쮿\t\u00073?zeJs[,F\u0006Z٦\u0006γp5\u000eM_* ^\rL̗0x_TI?\"`_PE\u0007RU\u0001Ǫp*7kU薊\u000f<\u0016\u0017\u001f\u0016\r| Ho߫$T_&>j#p)37\u0007^qc\u0011tz\u001esf\u0019{AU֕\u0017넓_\u001fr-w\u001c/\u0016pǞq)U/\u0016`祋8\r+4~526h\u001c?  \u001b9tx[~W\u0002'Y*\u0003Gϩ<gscۭpq3i\u0019ۜK*\\NS!M[TTa嘭\u0015i\u0005Ed\u001f\f\u0005eic57\u001f*\nZ\u001e-\u0017\u000e-{\u0016ϟy\u0015_y\u001e'~3#hԞ_<̎=_1\u0017~\n;rYaYI1\u0019\u0016PȉQs-83n]*eЏ\u0014w`b\u001cw~)e~P}OΈr\u0017/i\u0011\nLJ\n:[jQၬg}\u0011oma_\"\u0012|w~?߯u*\u00179U`S3ş|%G]\u0010uo>tF48E/B2N$~q5d\u0005@\u0019K\u000f2\u001fVP\u001bSW\u0006\u0016\u000e$Fkt?R\u000bqm\u00124ˑB˕uj.[zZ5j_UJ귯_{\\\u0013L+߽(g\u001f~\\%>79wC2Er:\u000f8;!N!. >^\u000b$5\u0007Mu\\XLz\u001eNJu_J\u0015vM+&k\u0006g7W\u0006\u000f?b_\u000eyByapK\u001ez-ycv4v}fi@\u000e4\u001b?\u001bM%IǬD5[\u0015uF^Q\t\u0007\u0003p,\u000fAR\u0014$\tA<\u001d\u001e\u0016\u001f^?Szc\u0015_w>_\u001cNB-Jx̞<\u001c\u0011yAvzk^\"&v\u001c;':@\r\u0006-Y﵇Ɠk>\u001dx.I]yBZϾ̥\u000f颯U\u0011wTk60v\u001eXnu\\cw<>Σ䤉\u000fKa/Nm۟\u0002ֈ;,\u0014\u000f\\tD\u00114ꠌ.+]\u0002Ih%PXBnTNI'\u0016t'\u000f\u0018;O\"\u001et_=#3ZciLS\u0011٣y𠃿{Hkdr&R\u0005t-*&Ez#\n9y;9£\f{NBI݉\u0019\u000f\u0002{[[|M^Ef<i\u001a45\u001495n~`yHeu^\u0002~\u001c~ۙeMRu\u0003Kv\u00055L\r\u001b\u0016\u001e.\u001a| \u001aYpf6;0I0{'\u0005{ܽVlB\u000fX\u001aI|q\\\u0011N)C.KiǥE΋.:0\u001d._J|\u001dy3)}r%}{/ũo)\t}.Ƶ\"Ņi=\u001f<k5\u0015o-\u001bJy+h4\u0006\u0000C\u0016kѥ\u001eTk}UqOߗ2Z$9\\Ņ]AL0Oa\u001fd\u0013*AS0\u0003y.uDk<Œ^!\u001dW6$e \"o 7زn+R\u001d[sh\u0016,s{\n~Mg>o\u0004`b\u0006_\u000fV2MS;wW{NVmоpJ-7Ч>pϮUF*[WU:g\t>UQr]DaKN-<79­\u0019_x*u5>H,\tEG3;TϘVY\u0002\\Q<\\#\"8*$,h2a\"\n+x\u001cB\u001fRBKjjКm-}_<%\u001dP];2{_\"&לNas['H\u0007`wY*i>?[421jmߜ2=*\u0007ϋ*gw@߿^\u001fT\u0001UWU~gU~AT)\"$D\r_\u001f/4g\nrstD@Ddhs)E\t\u001c\u0011HR5_p\u00034LD\u000fzp֜K,粶N\u001f^b+wذE]\u0016l\u0016\u000b\nBřqa7NW2SU\u0007Is\u001b#'_D(.}ʫWsكNlilZ1UJB\u0000\"S'<vze\u001c\u001d発Kj{U&U\u0007\u0016\u000fy\u0005#\u000f\u0000|N\u001ei\rrsZ\\\u001dnϫ@a\u001313̅J.\u0015K\bz%\u0006Ћx\u0013\r؀\u0006\u0006\u001astݞ\u0019L&C:{1pt\u000e(\u0006\u0004B\u0001H٭hٱ\nGawlUT+\u000f\u001eSva<%ƓsOJ\u001ftw:.ΩT\u0005Vq\u000b9Z\u0012tR5kDK@L\rIzx\u000f?\u0019Z\u0015\u0007s@^֎hDuO@\rx\u0004\"A2eFhJaH\u001b(m\u001eG~衻dKG~t\n1;&SC߻Pm\u0016\u0019[MuԎ]\u0014\u0017r޲%g93ӛNKMbJCG\u000eC\u0007yMPͅ\u0005\u0014x\u0014WT;P\u0004]\u0007+D\u0015;,DE[Lqbc:_.\u0011uP9&P\u0019MFb!Re\u0013raV-\\cb\nB/\u001bh)2M@n9G\u0003p\u001fz\nJ]-nK>e\u0002_oucmAo\u001c\u0002P;}u\u0007\u001f%=K_#\u001dɍ=-_y,\\x\u0019'\u001bZcȦU\u0018ۭ$=\u001d*\u0015U|}|\u001b\u0012\u0019(3G\u0005\u0014\u001e3w\u000bAlz`f*/iduIx\u0016\u0015)f֫:\u0000\b^3\u001a\u0015M \u001f\u0006\u0019[̅%i*L\r-\u0011\u0006x3\u00037]{/A\u0003ByB\u001bwj\r[u\"W>4\u0005z?ߴ\u0016y¿8d;ްk\u0017Je;\u000b>n:=ޕ=Z\u000e\\Iы>M\u0000Sh\u0016dJ\u0017uNN\u0010W\u001f\"j:KGI's5DL8BJb,d&\u0010M\u001bc&idb-rw^\u0002DDXDъX\rI8^\u0016\u0019s\u00052\u0010t\u0014)%Br>\f\u0015\u000fPSftEw.LŁi\u0012ilc^(\u001d?xu[.,`K\u0007F\u0013n\u001dH\u001f\u0017$:\u0017C?{\u0004\u001dumVKk\u000fLﳖuO\u0012+`\\?&!ǶnT\u001fI\u001aӕ\u0007A_t]\u001f|E\nD24A+3\u0005tAψ\t\u001dzP{yBo\u0017}g\u0005+=\u001d\u0019S^+.фl0brLv\u001cww_\u001e\u000bu䝘>F~F}\u001b_2>N*9'sLnt|^\u0000\u001f&\u000eIր-f׏>S\u0007߾\\~=V!>OUӽht4`\nj<9$і\u000e\nO֤#34M\u00177\u000f\u001a˜\tN5d$Q\u0010+\f]yz1aFdቚB|\u000eh%\b#OO졯.+&X:ș\u000bt\r:#!ќ\u001dz8y5*ʩ{x\u0005=h|il\u0003Glji>m88\u001b\t%#?H\\[\u0010n,)9I\\wVi\u0005\u0015h2w\u0002$\u0011jg)qiluMt\u0003\u00134o\u0015Z\u000fȯ\u001a\u000f/<Ŧ|Ug\u000b!\u0012J@2Vh\u0011\u0002\u000b#bŒo?꿳\u00020Ү\u000eC?\u0007e;^\u0002\u0002R3\u000e\u000bLG+G+o\\o8hn>zs)e\u0010K\nƖ=:291љ.e-+\u00111^,t\u0011!\u0011\u0014eR\u001a3C@7*\u001c#bcHPg6\u0018a[̖Gз\u000f͢\nur}x\u00008\u001fbfȆs[+n~ܾD̮o<7'HOj=m/\u0005=\u001fVIZ/K\u0006^\u0001ɪ\u0018G%밵gQ]\u001d\u001f@7;8d\u0006vud\u001bg_H3:\u0002CђY\u000b48}\u0001Zp1Zv-\u000fDkqlo\u0010|\u0003Y)B޾b$\u000eOԠZA{\u0010\u000bh\"hqL:-T'\u00032]AN*ckwM<\u000bT#\u0003媇mI%}HɎ=R\bG_ߊ=]?yAO\u0018u\tPdn\u001ex\u001b$z\u0015!7/IY;<[Ǡ{#B/\u0015&\u000eԤ\u001a\r%\u00169\u0005g\u0015Kݐ\u001a7\b\u0018\r/߸N{Sqk5p@\u000e\n%\u0012\u0005XDxE-\u0016\u000f/BGd͜-뱦z`}w4}ft\u0001z\\F1+D/\u0016\u0011]ڣ\u000bSS\u0003ӥ;^\u000f}\u001b\u001eFLoɝx\u00162$\u0014\r\u0011N]\u0012IV\u0005\u0001A9L\u000f4!Z\u0007̺\\A%W}Ԏp\u0019\u0017hb2R7I6dt鸼\u001dɕ﷥=q\"=MS}7\u0012ǿ`ű\u0011'\n;GC\u0006Q\u001dחp8S?\rпƞ2\\gWiA4e<U:d%\u001dE:\r\u001dln]?\u0016\u0018\u0015\u0005k\u001a\"y:i鼹DБ)\u001c\u0014\u0014\u000f֮v)AR\u0006IT$-J\\]It&0(KD\u0016jמ\u0007>h1Gg\r֑\u0011,\u001de4\nz\u0002m\fÜ5\u001e|z\u000b}|\u001e;\u0013d\u0006>\u0007I޺JƜ]z ;l\u001dH\u000bqؖ+jH7\u001dCCzO|#\u000e\u0007\u0019-FtF1=n55\u001a\u0003Usx\u0006Sc!:20qu\rD\u001d*\u0004\u001cO`}I+=Re:I4:ٸ1J\u0012M=;\u0017=xsQ>O\u0013;S\u000bƓ6~#{Hw~/dsL\u0003Ӂ6r[!NrE\u001d\u0016DS'\u0007׃8\u0017/1+ Z٭\u0013\\\u001d&L|jG7\u001ayc@k\u001e\u0003}Q%]\r}Ҡ\u001c-}6I*\u000f#\u0002\bN(\u000b{-aHw.΋\u001b=ރx`&hN\u0001;\u001d4@{\u0018հG^{/\u0003C/(K\u0005\u000b^+ӹ;\u0007qb\t}\u0000z\u000f>Tt\u0005QY[L:3\u0007\u001c\u0004\u000fڑR9ka\u001atN\t\rPV1mWec}\u0004\\\u0007y\"?\u00015C@/\u001b\u0019j\nX\u001a?V\u001a)\tO\u0000f\u0007}\u0019X=\t$\u001b7}\u0018u@h\\\u0017\u000fN\u0001Qc\u0012ӕx>:[N,:/.gzn\u0010U<Cw=]z3\u0007\u000eO~\u0019,ܻ|qVr9߇^8\u001f{\"\u0003\u0016l\u0003?2~\u0016Xxx1h\u001aD_q_\u0018]<0>:Jj\f\u001b0[\u0011\u0010]3\t12\\7\u001er@S\u001eJÃX<v5Z@\n0lX4yxDg|+\u0015G0E\u0007\u00026\u000eוUlq%[,/8+ؼ63>{)nF\u0017(}\u0011h̦5\u0019\t\tLr\u0001c0pq\u001bB8\u0004u.\u0014[w+\u0017K&\u0013VQ\u0003s::\u0002_\fx\u00056\u0013h\fq@Åp\\~P\n5\u0002hF\t\u0010kUـ\u0013vn1h\u0000\u001bu\u0012\u000ft\n3a\u0003&H/Zb-pwp-\u00035\u00190FACN(\t(';>C-\u001c˔잌\u000b@q8X\u0004Dk\te&8\u0000\tz\u0002}B6@\u001aǣ\u0000.F\r_\u000bk\u001e\u0002MW&4E\u0013d8Ӗh׍#3\u0019BD+,\"\u0014K!\u001dŘSC\u000f_䇞\u0010=\n<g$ū\u001b\u001bC_]h^9*\u001fA_>\u0018S\u0006]w\u000e~|d}XwW1Z9w95\u0001h:\\\u000f<bE8,UO\u0014f8³A{*opׅD;-L\u000f[\u0002\u001a\\V)>}\fm'aG'\u0016.\u001dh*ѝ疰K?I;~rf+\u000eق=[sʖ\u0016rM&AH5}\u0010g%h?a\u0001h\u0004i\r\tgqe\u0018\u000b79\n\b1\u0011$\u0013\u001a'X#\rZB8\u000e2Ncg\u0013rM@\u0011\u000b8-T\u0005zu8jd\u0006Zw-\"Qc\bZ\u001f\u0017 ,X੶]\u0002y\u0017\u0005\u0019\u0007&D\nѠCFc%r.cH\u0016\u001eaFqQc p\u0005\u0016Lz8qp<aHK#u\u0000YPzuQ:`\r1\u0002r@d-\u0017:L(j\u0000&\u0016s2y:N&\u0016bqFEjiFlt\u0018)\u001fKtx/h1wLu\u001aM?fo-\u0017\u0011ͻ͟\u0003\u0013}=\u000fϧE,+x\u001d%цl=\u0004(y\u0001b0ʋDӃ\u001a\u001et\\ِPk\u0019-8>Y)`0\u001a\nWsY鏜f-G\u001ek\u0002$\"SKH\u00188\u0010\nU\u0003MnП\u0006RgSL:\u0013AKj0ek\u0002\u001f\bML}\u000f\u0005ŞP<]X=O829\u0017>ʓxd\u0006;'HK\u0017K\u0010pg\u001e\u0018p\\m/\u001f\t\u0002H8e8\u000fpL/\u00056'\u0013\u0019\tW\u000b4DR\u0001aB\n\\\nK]#\u0000\"CD\u0019\\X\u0016ѫj8@^\u001etY$jN\u001dyI7\u0017\rG\r|\r37x\u001dr3\f%좭);D<yo#麺\u001c0\th|-\nlv)\u001b_GEi\u0001+Oo!M1b>L^MXB6JCI\bO\u0003_\u0016z$g4ֻtĖf:Dpn\u0001t`uIq\u0000\u0016a86ń0\f{U툞\u0014s\u001e[ \f| N-\u0006\u0014\u0003C<g;.,nB=(\u001b~\u0019H\u000f>]wb\nL\u0019\u0013GOМ>wb6L\u0015\n-Cll\u001eX'HNGeiqp-2|D<yܑ̥~\u0019p\u0005]05qh\u0006ln7M7\u0002xR%\u001cjcy~\u0013g.\n!}\"|6Ч\u0015@\u0003m!;h1\u0013ߔOr&?߆'~ݯ9&\u001a⹡k \u0006\r2C/ܩֳOzyQ[wE \u0014S\u0004Lfe:\u001d\u0007r$\u0015A˛hD'I:th\u0016єﾴRsMht\u00015\u001b\u0005`+N\\5\u00174\\rJ0(-}S\u0003=4\u000f\u000eKN]%^*C*,Np+Mm\u001e\u000bAn/;֏gDrt.R-ԥ\u0000]i=d|\u0011‣\u0006c\u0006kiMʋ0O{&q$_o|>텋K_ȟ\u001aXzSl`\nh\u0019\u001eg\u0000}cxȚ\u001c5pז\t_\u0015\u0006_*\u0006BJd~\"e]\u0015EMdG\u0017s܄6\u001dINs\u001brT\u001cf\u0013=jC`b2OVq\u0001n\u0001뤠\u0007V\u000eL!q?\u0005{f\f[{2QIo1\fu\".TuZr\u001a\u0004\u0002h5`\u0016\u0018\u0005t|5uX!&2^\u000b\u0018\u00153VgLشxõ\u000f\\^.\u0014m\u0004:|j!Y,ۆbCYb.~2;=ѝm4\u0005MFl=mC6n<s\u001b\u000f\u0002\u0000DХ\u0012\u000bڭE6ʢ-P1aǃ\u0003\u0010Ň\u001e#M\u0002-n\u001bf\"Ƒ\u0019WV\u0002\u00154G\t\u0003\u001e_q>WۂRSZ>@,\u00162V0m𸄌dCw}_uf\u001e>\u0014se\f@ßK-3\u00041|\u0012\u000b 7\u0007l\rh>C<\u00011|T.gp\u0012\u0015\r=\u001c3ƃ.\u001f3+\u0013!\u001b^K]7ȝ\f5/0`]U\fO\u0005W<\u00047n\u001b}{5\u000fuyc\u0007\u0019\u001aj*\t5\u0011:We{V=a\u0007Z\u000e\u000fʜzs>|\u0016{Xs7\u001e]\u000eq\u000f\u0013\u0007\u000fgew=Nl\u000fۃ\u001d_זp>-\u001bO\u0018Jn\u001ex<8\u001fW\u0012}/Eʣ#<\rf\u001a/'1RI\u001b\r5 pE:5AL\u0004DG\u00121$\\\u001d\u0003[\u0005\u000b\u0015uG\u0017*+vjdI5ey\u0016\\σ5{\\e\u0007yn9B\nz\u001bJ\fq΢+\bVg';\u000b(F\u0001x\r>\t4E|\u0015\u0005\u0015栁,j\rz\u0010k\ts\u0003[',J#岣|\u0003{Λ.\\im9:\u001f\u0018_!\u001cl\u0014YZ\\l~Cܝ\u0018k\u0002Q-d;\u001e\u0004\u0003WV\u0010-n)5b\u001czDؐ\u000eù\u0015\t{\u0011\u0019\f7M(\u001f\u000e\u001e\u0002Mg25\f-{_\"+=UVg*a\\V\u0005\u0002h\u0016<b9p\r|:p{({ȫ̓#ՂP5\u0016\u00060Հ2|=Bfcи[\u001b\u001e|=W\u000f:p\u000f\t\u0018-ĨsZԲqDs˩\u0007>w\u0002As\u0017twD\u000fa~́p\u0011{-A;yi<2m8kCv\\'.7ONWN;tz>\u0002.X`}:\u001a\u0000w\u0006_\u0005/~U<4DOޜ\"ԐJԂHYuFJw0Ӂy'O-\u001e'8\b\u001aMY\r<\u0006\u001f7/Տ\u0018`g+ӕk\u0002[4(.V\u001d\u0015冊b=`\u0010Mٰ\fmh\u0016\u0013MM\u0005\u0006\u0006DFxp\u0003gF0\u0000\u0018+mTiHe;\u0007M\bI(4\u0004l?e;g#/'F\\;W\u001fyɂ\u0015QNSD\u0002\u0011-\b\u000f\u001b^\u001dW\u001e\u001cфc6\fuN\u0002v\u0016 ,߻C}\b\u0002i+*\b+mR\u000b\rMADvh2?Βw?^+=_K\u0018q\t\u0017Na\u0002<<G\u000e\tOJg\u000buȼ1Wt=X+\u0004\u0001\u0013\rϏSr\u0011j\u0002]3\u0010\u001dsS\u000e{\u001e\u000f\u0002G\u001a\u001c<[Sw~kO\u0016w>\u0012qguC<¤7\u001bu-Z$2M\u0013\u0005C\\W\f>\u0012~+9\t\u00188DGK\u0011$#뒵Dx5HՖcl0\u0005s\u0001UZ`g.@^\n4c\u00158*$8\u000f\u000eXK!P\u00144x-Z6׃\u0019\u0013>\u001ecdM$r\u001c\u001d^\u0013LMtYJ4<\u0013\u0003.8i|ӈza9\u000fZ5#%y_\u000492bpΔP'Čjq\u0013P\u001dg3\u000bgйp\u001e4ka?\u001a茮\u0003g\u0013Ƈ2H\u001fQ<QvV5\u001f\u000f\u0019R\"\bx&\u0019c\u0005݀\u0017\u0006qH\u001e\u0007;k\"^ȼɲ\u000e38\u0011\u001d%ە50\u0014skLc(n\u0006-}E\u001ex\\e1ezľ,x8nţ\u001f\u0006jo.\u0011jfbޛ\u0005i?u?u<wn;<\u0001{/^ \u0001CSJV<4Ԇ5\tj}\u0018>\u0018b<p\u000205\u0011\u0013F\u0001Gl|k9Bn$c\"rlD\"CN4\tuC8bϨ0\u0017uX+2Fym07\u001d\u000e>]\u000b\\\"X_\u000729\u0017QÛ\\bΚ\nkD\u0010\u0013EJ\u0014!%J\u001d\"2{\":WG\u0011#L\u001b#De\u0005\u001f\r,n§.l$/\u0006%f@'\u000b|mg\u001dCj!o\\\u001f9򶓎\u0007e\u0010f[E\u0014v=O{\u0003kͧ7\u00185os\u0014\u0000e1EB=7BXSa\u000b\u0007ٴMDMr1?Y}܄ް';\u000b,\u0004Yȭ3\u0005^\u0019\fJGYJ\\iB|Q7L\u0010\"ҵa|C1@s\u0015\u001d\t,Bh}D\u001dBx\u0018\u000fl\u0006\u0007}>iM}kwRw\u000f3GWo\u0006{&,؍\u0007f;\u0014\u0015,cGc'\u0001969]O\u0004V\"\u0007`=\u0010y\u0005\u0002\u0012\t\u0001R\u0019\u0012QjP;zvTc5]X\u0004Xe\u0010$\u000eE\u0001,\u000f V\u0019ȭ5So\n\u001ct\t\u0014N~;X; ,ت}3@\u001e\u0014@Jևo9\u0004x\n|:(G,\",\u001f~\u0001wEZ<t|p\\^HL\u00010\u001a$m.\"QK'O\u0016\u0003\u0003\u0011\u0018jd\u001cfwVV\u0001Uj,\u001a\u0001F\u0003|\u00019\u0015hs\u0013>ᦞil\u001dW-PmV|&>Gr\fM7eA\"H/$\"8\u000f5v۔r\u0003l\u000b1\u0003]w\u001d\t;̤.\u0012v\u0016yÙ\n:\u0007sQ\u0017\u0006n¦޴\u0014O\u0006vV(;K?Yc\u0018\rõ\u001c\u0002;h5{\u0003\u0003r\u0012`)2l\u0004\u0002y>;h\u001a4\u0013\u0006\\*\u0019\b\u0007_wt.y\u0000S\u0003%:;\u0017\u0011>YL\u0018`~:,Ko+HDkr\u0006?V#uB|X&4\\G$\f#\u0004i$U\u000b9\b\u00077x]X\u00004\u001d\u0016|'sW\u0001ln?O\nP\bm.&\u0003f\u000by.;`\u0012m\u0001Fsq-#d5\u0011\u001f췢?s\u0015v<',Hґ\u0007;+MGIY˚N9SKP5ۆ{ܖ=\u0007\u00125s'\u0012=+΄W\u0010pi=\n\buӈs!\u000er]WW\n}w<؞sˀ\u0001O`\u000eel\u0016<{W\u001f\u0007\\R\u0007BgK3*L8M\\]\\Y\u001dVB\u000eZv/9b\t;jak? ؃\f\u0001aa$\u00153Q\u0005c$љZtL?Y\u0004\u0001W?C^^^hI{I\r߸ws\u0007Ey%\u0015^1n(ڏ/\u001es|@16\u0010;d?P\u001cya\u0005b\u0019<?,F\u0013[;O9r\u000f]`}s\u0007`q\u0013m\u0013M\u001cWBXʒ\u001e\u001bz\u0016_P\u001cxL5*\u0007l\\\u001d)\u0017N\u0005GC$/hgכyr(H\u0012ƅh+\fU6N\u0004\td~\u0001D\u0007\u0019U\u001f\u000b>O2XH+\u00125051\u0007r)c$FF86؟\u0006륣a[\u0004h;BŶX\b\u001c\u0002EvD\u0007+첆\u0013\\E\u0002\u0019U\u0003뛣LzQ\u000e\u00156t\u0000\u001b\u0001\u0002\f\u001eK\\\u0013\u0000\u000b\u0018\u000bz,\u0019\f\u001b\u0018upmG\u0017\n헜 W*\u0007.\np~\u000bm\u0002[&ĢB-\u0017O~7ܯ\u000f>\u000b\u001d+\u0002N\u0014\u0000(u.\"l\u001a\u0007aL|]/Ŷ|鸶\fYOXjK\u0017`gq͆\u000fb4p\nY|z6ag\u0001+\u0004ֳj}V\rs\u000b쬲QvRr\u0011d\u0015|Ea55\u0007f\u000bS\u000eB\u0013>BT\u0018!o=zn9=J#e!\u000fW=bt\u0015z07W1k5\u001c\u000b<;|\u0000I^s|\"Â\u0012\u001aͅ5\r\fEdmc\u000b}q\u0019;\u001a\u001a5G\t]WW\u000b[.9C$\"FɇfjÚ<\u00108,]EF)w=x඘dr \u0017`p=\u0014$:mU `\u00181h`]`s(\u0002v\u0017|BQ507ӠǄ3r`~X+$\u0017C\u001eF\u00180ؖdu\u0007\fxO(1\"2I\u000f9,nUgX\u0013U\fN\u00037o\u000e8`\u000buzҭV&}.͗\u0012^Pv\u001da*j'\u0010\u00063\u001e\u001bCf\u001cq\u0006>@^TokOj#fv\u0007݀|x\u001ei\u000f=+\u000eQr\u0003w\u0004MJ\" E\u00185E-\b\u000b8oŗagqgJh:\bq\u0013TT6s|.\fXi?Xx\n';w*xS\u001d\tc]^vu\u0007&=Z\u00108ufMγƜ3$g!kVu#5\b\u001b\u0012=~?\u0005o\u0003\u0014\\=\u00070{o:\u001e;.=>*\u001a'/\r=~e}ԱI\u0007.G)w\tbnz\u0015>3\"yA5\u001eK|\u000eo\u001c\u0001{±3IyYb&UWgqNM\u0018%C6S\\:E\u0005P\u0012%b@~\fnb)KzrV\u0011'~/A[[%$;9r})0G)G\u001cp-\u000bkQ\\t\u0016z\u001a>]2\u0017!Fs1\u0005:\"Y\u00138p\u000f]Vy`\u0016ᣐ{\u00025Xۆ^2\u0003ܳ\"CX\u0004:>G^g\u0006p\u0015}6o;;[y4<SQ==\u0019kXo\u0002\u001eWidX\u0016\u0006\u001fb=O)6\u0010bru\u0014-YF\u0004}\u00158X&XuYA=@G\u0017r=WW7E9\u001fY\u000ĕ\u0003d[-ŵZxNw^^\nw~3u+#1v\u001cKɲʍH>IQcC\tat]JX\u0000\u00078PKe L\u0015\u001cWϫ=,\b7\b\u001b$Fyp~%OHxp\u001eF獁\r{ϸϽ\u0001+sK`.@jl'nS15w :\frVx]cXK=\u0000\u0012`\n+SɽH\r{!병Z'\u0003SąlВJG[&\u0002S\u0005\tQ5\u0003|}pN+C\u0006l\u0017p9s(ڽa\r\u0015AB(K)5$L,\u001c!GϦ\u001c%k=\fgdW\u001dgL=\u0011\\|,\u000b8wO8)\u0003}b\u001e_\n-/\u0005\u0011\u0007\u0001k\u000bp['BM#\u0017\u0005\u0006\u0019\u000eC>Blnk\u0014{\t39ރZ\u0015-@`zf[\u0001>OVs\t*A|Ȟ\u0019x*uO\n\u0018WOX_d\t5\u001e}v|%ko\f\u0006\u0004{˙=L\u001c;v\u001c\u001b\u001bwY\u001e\u0001{-FsɰLr'jx:\u001dE)6h@-\u0001*9\t68f.SVջfK,ɽcksp\r\u0016u8o.;5\u001ez,a\u0015C6L>;3yi\u0019\u0003rqy:td\u001b |8CRk\u001e\u0012=y\u0016s`\u0015ʀQn;MK\u001f\u0001ޔ,)[Pe(˨3\u0011J\u0007\"|f\"\u0006~\u001e\\#K$(HJ#ȣ6z\u0017;Ip6'd\u0010\u00064fɰGHӕC<o=\u0014\u0015iA=\b{\u0015Cw\u0003\u0015|\u000e_,j\u00063o#\t7=Ƙ9\u0002\u0016|fS\u001cLI\u0007+)|v\u00190\tO\u0018+\u0016t\u0011f\u001cr\u001f\u001amN\ta5\u0011\u001f\"y5\u0013\u001c\u001b#`b\u001fG8Wuv<d\u0019ڕb;\tE`\u0006Z¶~\b\u0011rBeB\u0003~\r|'\u0006P\u000f:\u000fgV\u0019{8'\u0002>l\u0000c3q\r{i+u۴{&\b\f֘B\u0004::|d.\u000f\\w:w\u0005n\"0\ba /#k\u000bJQ3ĥC\tϙ7iN[fɹL\\f)s`KugO\u0015\u0005pȗO\nG\n_1\rf\u0019\u001f\u0002\u001f\u001e\u0019q`6\u001eL2$c\u000bT\u001fx|<>\u001e\u001fx|<>\u001e\u001fx|<>\u001e\u001fx|<>\u001e\u001fx|<>\u001e?\u001f3fx$D\rM\r5\rtg,\r?nHL1\r?\n^6&<5&1!4%ƙ\u000b}8fE\u0004/\f^\u001e<fϢ\u0019m.f$24nmmD)11\tи?v\u0005@qE8.^j|\u000e˜\u0016?wtrxE6q˖N\u0017|?_g\u001a&\u0018\u0006\u0019:Ͷ?\u0017ڸF\u001a&qu<c\"-\u0012\n\"\u001b@wH\u0000φWPfCB=\u000e??\u0012\u001b͢em-\u001e~s\u0001\u000bS \u001f\u0011\u0006aѲe8z=\u0000\u0004(@\u001a&f\u0011 Pp\u0000Q<J\fIujBm~򵩨<mIDX*BkVz#\u001fO\u001e\u00052jd@*VӗCk]\u00182XN]\u0012A+(4I/ѥW\"$(@\u0014@\rJ\u001aIEdj\u0005\u0005\rRא\"5>\u0004\u0005\r\u0001;C\u00041jLT6((&k2tC\u0007,Q+փNh\bNk\u0018v$Cs\nt@$\u0013)iPB\u0005Xypx!tkBg\u0010K)Wl\u001dY\u0012(4\u0014Q,Τuc\rʄrCE\n~\u001acP*abBd\u0014:\u0019\u001a-\u000bW\u0007\"P\u001c`#\u0010\u0014mPЖ<C4FeĤi3)DY\u0006<\u001d\u0004eU)\u0015&\u00158ҏ矘+k0W(\u001a\u0002\u001dA\u001856<M\u000b\u0014\u0017ȹW휡uu[\u0014g&#lTc-+9/ĦU\u001ar\rM&|V)\u001b]46H\u0001j|R>QjAv\u0013%\n#rMh$p]d\u0017;(8ac5\u0018>D\u001dT\u0013ŊhuP\u0006ufQPX\u0012'#PbB\u0002\u001fGT\u001e\u0003e(\u0000(\u0007\u0014R,^Äk\r\n\u001ek\u0011t+\u001bSKTRaZ-\u0002USQ(5@\u00117P`\u0014\u0014\u001b  7/\u0011\n,m!~\u001cو/קDu 7\u0004)S5|bo\u001a(\u0018\u0000\"ip&Hd2\u0014\u0005M`sSdMf\u000b?,TRQo\u0003\n\u0007:SPm$*WYզ`?|\\\u000e\u0013-隄\f*\nZ:ɚN:(\n-oxl;|B\u000et\u001a\u0010Œ\u001e=?T5\u0005l>8BgHSd֘\u0001QjPb\bJ\u0012l\u0006-P%\u0004u\u0018&8F\rO\"j\\J>tY*XAZj(!AEЉ%Ϭ7\u0015uu\u001bAt`g\u00134d-PebH4NzE\u0015\u0019fB|\u001e\u000bv\u000e}R\u0004\u001d\"{/Ռt?ĕmʋ\u00105˅Λ+/\u0018U`K\n<\u0016\u001eHGr*gʭ\u0018\u0006\n\u000b򖐧K:Pˍ\u0015=S\u0004a.8->ϒ/\u0013\u000b.Gz\"\t\"]S\"$iPB,\u001eTM\u001a?$z@\u0001\u0005qd\u001be\u0006Qs>\\ML+\u0011\u0003\u0015W.`\ft\u0007##Ԃh5\u0001:\u0016\u0013>DGHр\u0000\nL\u0016Z\u0004\u00197q\r*@Ab֗Q$\r\u001cDM\u0012=yf\u0004EJ<>OO\u001e\u0003\u001dz3>\u001c: L:@I\u0003:\u0012b\u0006\u001e\u0007ړYk*O6D:S^D\u0002耄\u000emPe\n\u0014B\u0017rbŊM{fˉ</'>\u0010n^쓱τ\u000e\u001a+ҭǊ\u001e\u000b`32#h%]qR}\u001atմJ#bo/+kMUF\"\u0003sZD-\u000b<tM;f(Gf\\Wl\u000eW]ök|`\n\u0014x%;m{ArPe\u0005\u001dh\u000brp\f:[Bi@TA;@d\u0002q5t\tM沴q0A\u0015*(gex,\u001e\u0007\fOP㵠\u0003\u000e\"|=E_@ى-z3(_(\u0001?\u001f$&<ERD!j\u0004љc~7S5xM\u0013Q(Pg#s٘B\u001dP\u0006y1&$S\u000b:anA\u0014vJ,şv\u001c\u0007X/K3\u0001\u0015\"P\u0001%\fYj1B<N]\u00064źtH&v\u0010uT\u001c{:\u0004#ٺ K)\u001b\u0007\u0011\u0014Hy:Щ(곅nf\u000f`[B,O<\u001b\u0012z˖\u001dKT2\u001aI矲bLAMb4/\"\u001c\u0003kP\u001ao\u001c!=4\u000f||^;EƠE%in.<\u000f \u0010b6UyN\u0004ن\u001a#!i\u0002\u0010u2P8x\u0006h3QQm\te\u0010\u001f\bGg\u0001{n1\u0003'8'KЭ*=<t⶜]\u0002]ZU\u0006O\u0010\u0005mڠ*\u000e\\2t\u0004\u0016\nA\u0017\u001bAYQk\"\u001a{\\'!\u0010TI'<(n0$1=\u001c\n}b.t\u0011}-9СIx\u0011`usx@8\\\u000fPErJ5 /p18./\u0005Y68U\u000f\u0006%Pc_1ꐿ@G#e:\u0013(т*\u0002<HTO\u0001&r\u0019F\u0011M\\b\u0013Ath\u001dQ\u000bO/%\u001dxN\u0006C^\u0007ʌ`i[͠]\u0002h\\:Q\u001c~\u000bIb\u0014j\\ .Cw7$y<Ptn1#9 L\u001c\u000bpNXaE\u0019\u0014ca\u000fh3\\\bFjA:\u0003q\u000eƐ(<.Ɍ(5W\u0010U$l\u001bHM6\u0003݂ca\u000e[lPʪ2VM@W/n\u0015%OB7\u001f\u001bPe\u00119z\u0000Vc;\u0004\u0015<XA\u00176ٹZ}\u000eԔA9l\u0007j٠\b\u0002݉\u0015|&鴄\u000e\u0001k>%]@Q\u0002\u0014AeT\fr|-}\u0007eX.̀2*GlA\u0005$!\u0000'$\u0018@!\u0014luDI\u0011~Zj@\u001fˆc\u0007Ji_\u0018Ǥ\u0003\u001f\u0012\f@\u00190\u0006\r<kjL\u0002W\u0019fvPj\u0001[\u0006\u0000H\u001b\u001d\u0002m\u0013َN\\g\u000bpݱ91q!5\u001c*\u0003\u001f_o(Րe7\u001a\u000e\u000bMG\u0017@8vۧBW>\u0011\u0005DR2\rk\u001a_x>sNR\u000e\n\u000e\u0017N\u0003HT\u0005\u000fgȰ\u0003۔k&\u0013PC$\u001dx\u001c!\u000f\"xF@ytYC7-\\\u0013<?\n΅\"=J%\n\t`Rõ#*U0?b,5\n6\u0003ʄn},\u0019<,\u001e/\u0012!gV\u001bC\u0005\u0005DUryM:Yʳ\u001a$Zc>\u0004H\u0017GA\t\u0010\u0000j\u000e\u0002\u0001WkET;R\r%W#|d\u001a΀?\u00005XpI%+7\u001c\u0007]\\\n\u001e肱0\u0006@\u0006:VB\u0002]|R!TPǃ Epm[y\u0006\u0000\u0005\u0005n6HG\nĉ\f-\u0010+\u0004<}V\u000e\u0006qQj\u0012\u001cEr\u0015*}\u0010\u001f.\u0017%\u001f\u0010?S7\u001e\u0003u!;\u0019R\u001cp1~Pw\u0006W\\P;&\u0002\u000b4\\V)Wm\u0012<^\u000b $9\u0010\u0007\u000e\u0003:\u0018(sU\u0006@(\u0013!'%\u000f\u0006dJ쿣r@\u000e\u0000\n<F\u0013b\u00078V@|zKPK(\u0013r\u001aLCsWRd되Ǘv\u0019\u0014Ɠ@\u001d~\u001b!W\u0002\u001cV&\f\u0006ǭq`'\u0007J\u0005YC\u0000.r<\u000e,G,/\u0002/I΁mKH7[H\u001c9\u0004QȌuCl.Ep9Q[\u0001\u0005%<&\u000fN?\u0003\u0005\u0014g*Q¿#r4S9S`\u0016oP&\u000e\u0003s\u0007\u000b@=öF\u001chGi<#\n\u000b=A5sp\u0006Ԍ\u001cw\fV.\u000bedRt<?ɲ6\u001a\u0013z\u0001|\f9pLbc<fp<\u0006\u0016'n<\u0010%:CGµ\n\u0013\u0006kI\u0017gcnSѸ\u000eY\u000ew@!\u00048c\u00051\u0019:s`~Al\u0006eX>f\u001cQ-ž\u001fC64VJҤ\"5I<P=\u0006%\\P7|T/M\u0013&؄2=&$MS\f,A\u001e`Q%p\t19g, \u0002w\u0004bc\"砒3M\n99\u0002H\u0019\t\u0012Np9U̜{{s烧\u0007fkתwU5ev+\u0001\u001f\u0003>\u0005MdqL\u0019\u001d,~ǡG@\u001d\rs\\O<G|S\u0002X/cS-lf(W\u001dabFP$*\u0010v\u0011D{N\f4\u0003ٍ|\u000b[͝\n\u001cO>1\bz8V\u0001k@|y$Màt*\u000b`Lpq?'\u0000\u0001'\u0015P=5E\u0002\u0018#\r\u0006\u0003P\u0012\u0014lC&\u0014\u0010\u0015˳H5\u000bK\b69_/s.\u0017BL\u0014\u0010\u0000Gaײ\u0017;vr-f\u0016J\u0014_\u0001|Me\u0018\u0005\r؃\u0006\u0005\u001358V\u0000`\u000e߇\\\t}G\u0010\u001c\u0002Txp} )q\u0006Q\u0018\u0007\u0014THø\u001a\u001c\u000fJI1\u0011 6IkA\n|\u001f⺠k`E?l9=\b\u0001@iZ(q\u0007]CpN\u0007(\u0001\u0012̈\u0018\u001d@]V1\u0019!s\u001aJa^m9\u0002\u0007\u0010I<>v\u001f=\u000eAQ\u0012:(S\u0013ʠ\u0007~`X\"˟\u00075s,-!wb7?RF\u001e\u0001\u0000#\u0003'h$WBEuD\b?3b\u000b\f̕\u0016cf\u0011\u001d^\u00166`\u001d\u00033\u0015ʉ)\u001a\u001c\u0013|){\u0018EnA9\u0005p+ģ[\u001a8RIqޓ5~&`Qߠ \u0010q\u0007@\u0005p?(O|\bPP|\u0001e\\}ƃ-q\u0018𽲐_\u0019Rcg(\u000f,\u000bW[t\nJ9tRVto\u001c3*O,o\u0002&::En;q}}\u000by\u001a\u000e\u0007}FB\u0005\u001bj\u0010p+\u0002DYυ\u001cc\u0000>d;\f\u00055r&x#Ұ(st)\u001f#\\Ul\u0012j5I2-P1W2u-N\u0015x)Q\u0001%KK♮F1~HrpAQ\u0006&\"\u0004\f\u000bcCQ?_q\u0005ks`O\u000f\u0019\nxC\u0002\u0013'PD#k\u0013=y\u001d;?Zy\u000bC\u000ep/\u000bOk@\tS\u0004[\u0005\fx\u0007z \u000e1\tc\u0011]Z+qO\\\u0018+<\u0014b\u0013T\u001f\u0001~&:Pp.w:MW\u0000\u001ex\u0018cӞc\u0001\u0011E\u001ecWOT|zG\u0003\u0007\u0013QF&\u0018:\tLzP\t\r8\u000e\u0015Qvu\u0004\u001e\u0016JzCpe\u0011'O4P\n\f(0w\nz)\u0018o`\u000eD\u001b5\u0015bJ\n\u0011Ư8O\u0012\u000eu\u001e\u0000/\u0000\u0017\u001eD\u000eQ\u0011\u0012P~4\u0011٠\blڇLl19sa\u001cW3cA\u001d^\u0004.Ǆ?\nu'O\u0006X\u0010\u000b\u0004矻I~FUl`=.\u0004uQ\u0010?J\u0000W/'}\u0016{:h<}\u0000׼S\u0018x:ĕk1\t[\\dzr\u0004{%d8rp\u0000!\u0006n\u000f\u001c.r\"EZQJf4vy8 ,u\u00187A\u000f/{l&u\u0006\u0016\u0010~c$|Xc9\u0017\u0005(L\\<^.Y,>ڜ\u001d\u0002\u0013\tʺHOGO\u0006[.p9\fAboG&\u001c\u001e֋d0\u0013O;~\r\u0015\\d!=Bn{O\r\u0001nM1t#\u001fd\u0019IzS\u0004g2\u0018?\u0007%s\u0006\u001a\u00157%qH@m\u0019G,Pf%\n+@T7T\u001b-ü\u000e\u000fȷDݪ\u0002\u0005(;\u0010Ϛ\"+SM =\u0006|k-\u0006N/\u000eY\n9-\\φX\u0006\u0000\u001cKc\u001bB\u001cf\u0001>\u001eb4~\u000en3\u0005̱PӠw-9{,k\u001ai%qM\u0007u3pAc15\u001b\u0014D\u001c\u0005RҸZmp\u0010\u0001\u0001y\u0004\\\u0004@k\\p\\b^QyD\u0001[X\u00153p\u0007\u0001Jѥ\u0005\u0017۶\u00015\u0005N\u001c'\u000e5~8QV\u001czo3IM<\u00139\b\u0018\u0014TI\u0006܊\"a\u0003\u001f,\u0005Dp{&\rs%P0\u0004 &v\u001b븣cH_r|\u000b\u001c\u00068\u001d*`~\u000ee\u0004֓5<\u0010'\u0016n鳥Ѫ[a\u000en\u0011xnI's.Ib\u000b\u0011SD<qJ$L|b3:E7\u0012X\u0006\u001c1eZzB_\u0011\u0015s`m{\u0000뀩?B\r Ib\u0005\f'x\u0010\u0007_&HP\u0010\u001eD:({$|\u001dz'A\u000ey\u0018\u0011\u0019j\u0006uS\u0012q)꠴\u0007\u00068U\u0016p.\u00136\u001cܤ1IS\u0004dNI\bJ8EH)\u00029K?S+R:S()\u001dBT)Br~\u0004\u001dB\u0013`b\u0012ZS$ZKԨ\r\u0003p\rǃ\u001a\u0019(cA^\u0005\u0011:\u000esJ.dϧ\u0012+P=;\u0017ܢy]/HT\u001d\u001c\r\t؆(\u0017*^g4ظ7:%\u0013-#Kd\u001aQL!ͬ3k(^%{m\u0001p\u0017n, \nlOqnYjQ?JW*uOSy\u0004}\rPP\u0006B{Gd\u001dx\u0015yo8q8]R!/\u0012E6\u001c\t\u0011Fc\nܽ@8EORS\u001f8E\u0004C\u0010O\u001f8Ep\u0002677\u0013\f\u0004u\u0006#\u0006\u0016sOPMX#yt\u0004O\u0007=YO\u001a\\]ܟ\u0007=\u000eA\f\u000f\b\b0\u0001JT\to-5Kr)N\u00110/clC\u0014k\u0019\u0005=]A\u0011]F\u0000'n\u000bϏ\u001fk`ߑA\u0011\u0019lV\u0011\u001fg)B̤\u0014\u001c\u0004EpaSO\u0014\u0001c\u0014a8_Z\u0005\u0012]8;bN\u0004=Oĥ% {181\tśٰ\u0015d\u0002\u000bȜ߽TLzpWN\u0001*\u0000\u001bu3\u001c%\u001bL\u0012:pG%{n\f\"XOb1%\u0018\u000f'\u0014pʀ\u0012'\u0002\u001e0\u001f{̇E{\u000e2\u0015\f0a\u0004N~!\u0016\u0001\u0000x2x̓#\u0002(pv\u0004\u0002Dc\u000f\u0006_@d\u0003\u0018Sq[$\u000f\u0013W\u0002|͘&-*t0q+4]amO\"D\u000b:EAn+\u0013S\u001927E\u001c/isf`\u001cbjPwz\b$q>\n(\u0001\u000f\u0001UZم\u0005J\u000fd.'*gC&\u000f\u001eJ\u0000^c\u001c\u0004OQ\u001c8.eG}F\u0019֠;!O O\tw&ng\u0003S\r!IgpHԖU3\u000e1*9E'I@\u001f!p\u0012{p9SgS\u0004q\u0001Ǎ\u0016sC='\u0006[Lč\u0000#\u0013um.!*ҩɤk1a/V~)1\u001dNSn`\t֯p\u0015Zk+{P8\u0003\u001a\u001c\u0001\u000bT*M\u000eJ}Jf\fa?\u0000x\u000e\u000f\u0000\u001f\u0006G\u001f\u001f\ry\u0011\\Ew1h&C}N\u0004Ϊk\u0015\u0007\u000b}3Â\u000700Q\u0005k&\u000b͎8s@/\u0010x9yS\u0003ɡn\u0000\u0005\u0015K.Dbz>^S)\u001b\"LA%b\u0000<\f\u0011?(S\u0013\b\u0003\u0006\u0019\u0019҈8T\u000e\u001c8_侳CaɾAͱAp$p\u0001wۣ#轧I\u001e\"\":I-$/\u0002^'8w?Z*\u0003\u0004DS\r~\u0015)d\u001f3^\rQjcx*.\u0000!o\u001e\u0016)s%i;e\u0019B6Sb.\u0015_8Eu^O\u0011\b&x#q\u0019[\u0018X \u0013Q%pK\u0002@C\u0011lYB\"\"\u0014q/S\u0019ʴ\u0012'<\u0013[.aIz\u0006~W\u0017B\u001e!>JE}c\u0001Ҷe@iA_Zqe)a:ٮ\u000b.l\"6%8\u001f\u001fAXr..l\u0012r\u001f\u0001W\u0007\u000bΞ&9;Tv\u0018pOPe\"ޮ/R}F;}2d,ħ@_IO\u0014ii!}=sd\u001d ;*\rP\u0005Usa\tip%:>{\u0017(`\u000esi\u00184D\r_'ŵ\u0002'?8\njijTrV.M8E,\u0014aSɡ2\u0014q}9(KO\u001f\u00075!^O4=XS\u00143]\u0006g\u00007=;\u0004zm\u0002J]\u0006JτL\"\np\\U\u0010$\u000f*jr\u00145O迃\u0004\u0014OlP:\u0016<\\^m2\u0015_j4\u0005)kJ4dYe\u0002qr\u000eNL\u001dr\u0003Uk\u0000л$A@/{\u0011\u0000߰gS\u0004K\"j/v\u001aH2[L^=R&w.s.\u000e\u000ex\u000e)o\"ż\f\f\\\u001d/yk8RqR\u001bK\b\u000e\u0006<k\u00079ۃ=\u0015PEXͥh3)0{fWލ\u0004\\ϧ\u00126a\u0005+s9KI\b(Y+\u0001\u0011l\u000e\u0010E3c.\u0017SK\u0004+&\u0003oz=d}\u0000s{8&Ċ\u001b$;٬VC*+ٵ&1\u0013h\tc\n\u001dO\u001f\r{\u0010Bc\u0003Y\u00018N\u0018\u00072\u001b\u0018oE~\u0001\nƅ2߻ޗ\u0011<88\u0001\u0012RmqH\u001ar\u0001}Ͻ^p\u0004\u0017U\u001f*&\u001d\u001b`\u00158EHI\u000f\u0002z\u0000pH\u00153Kv.m, g\u000543H\u001d@Ϗ#=v'4㤇\u0001ʹ'ǐ=\u001e\u000f\u000e\u0015Y\\$hk?g\u001ew\\,I\u0007={:IC\u000f\u0000\u001dEjc%\u0007P\b309˖ZCvD|ʀJ@\u001dI;P\u001d\u0014AG\u0014\bw>t2R1b\u001c.ZOSZ)\u0002Y\u00133蟃ǂ:d1q\u000b@xT@ByI=g\u0012\b~\b:A\u0010%}e0\u001fpOQ#l\u0012a:\\ťV\u0010~Ҩ\u0005{&\u0003nwtvO\u000e\u001d8c\"`\u00159ę\u00128\u0000\u001f\u0014c4%\rzLh*\u000e\u0010;dO\b\u001cw`/\u00158:Ҡ\u001eb$^M[=|qTvr \u0016\u0005&r6I\u0005\u0014k\u0002_\"?\u0007%5q\u0006(3\u0010\u0006\u0018\u000f\u001a0\"\u0002\tK8C\u001d\u0001gу@~\b %D%\u0019l\u0019uQ\f\n~Kdn\u0017g\u0010_\u0006{\u0012ΊA\u0001|\u0000zcH0ɩ\ḅ̕<\\\u000380S\u00138a\u001aC\u0014!v9;?W<n'֋\u0013\u0003'^\u00148\u001bbym2Q\u0011l!W2\u001d{Y\u0004T\u0006\"\u00045퀳cVˤ&\\EK.Z$ΜCva>\\\u0005ztQQd\u000f_\"h_ɾWLp5\u0007>!+^\u000fnsaԡs#p7K4qL\\%'_N\u0011P'<^ȍeLuPeY\u0000_%7c>VCX+I.j\u001d$k\fG8\u0016j|E\u0011\n8w\bD=\u001c8#\u0000c\nN!. \u001f\u00007c/6qW\u0016\u0010gGEH;O^\u000ba&\t\u001a\u0004{fb\\\u0001GI\u001b\f\u0018+B\u0012U#sr\u0006\u000eb\u0001xSgH\u000f\u001c\u001cA-#}\n/)U\u001c\u0003x\n`v3\u0019]8\u0018\f\b o}]g\u0006>\u0015\u0010(ଂ3Y+\u0007W\u0007؃\u0003\u00071_\u0006M`\u000e\u001cBz\bC\u000e\u0001\b\u000f\b\u0007Z{\fߕp\u0005gG\u0010\u0006*ئA(\u001c\u001c\tg\f\n;Ɨo\t(ӓ\u000e\u0018׹\u000bș?g\u0003\u0002s\u000f8\u001aJ*M.\u0007dGjgaSiۨ̅k\u0018Ip&ߥ\bL\\%BN*Ompف߭Etu*7\u0001g\u0017FC\u001fO]\n.2߫ə>8\u0007\u000eg\u0017a휿1N!1\u0016{]@׀\u0016Y0gX\u0005.DE\u001fr0\u0015x-\u0003B\u0006\u0002\u0004\u0010\u0002\u000fr?\f\u001b0\u001d=aϏkO>1sPr9Y\u0015h'\u0011Y19~n\u00148z\u0003O\u0002Q\u0000njࢵ;Ni6\u001f\u0018Ee\t\u000e;0B!Q'%<I\u001dK=}\u0001\u001b9K;\u0003\u0001Z:\u000b\u0006\u001cvp|HrWIs5\u0013G\tc%\u000b/=3f\u0010K\u0005\u001f\u0019sH\u001e\u0005$k\u0018\r\b@?\u001dR\u00102ס\u000fJ\u0002\u001eO\tl;\u0003*Q\u0003\u001dŧƳGG{8f+\u000eH\n\u0000b\u0017\u000biO\n\r諐1\u00068~%Aw\u0016\u0001gaZ\\lAe6kC/4LWsV\u0012J7\u0003\"}i6\u001ems\u0003-bڞf#\u0006m\u0003΋c5r^\u0016\u0017`\u0017z\u001ap\u001e*Xdu\u00127O\u0006SkX7\u0017J\u001c\u0013\u0013\u0016)+k`\u001e\u0007r\n#a\u00133oRˋH'#^~s\u0004w<\u0019n,\nD\u0016\u0007[\u001f\u001d\b%Qe\u0019SGS{\u00068pn)3мLtzX\u000bJy\u0010Xp68~cdp|s)\\ȳU j*T\fRLdzp%|\u001eVk8'j<R\u00069B\u0012S\u0007\\\u000bNYRe\\D:Uȃ \u000bzI[O\u0010/\\5E8u]\b\u0003N%<D<\\MPz\u0007#=A\u0013}G\u0019{$\t3:t\u001b\u0013t\u001dٷ:3\u001a\u001c`_\u0012|{\u0005ذgki8\u0016\u0013W8I5B&W\u0017\u0011L\u000b\u0013\"ws\u0011\u0019;E\u0017\u001b4s\u0019w(Jj\u0002{RLH*/T|FqF\tѵNB>\u001e8ӉeqR<\f\u001f\\?PswpaV\u001e(O_7\u001361\u00172f\u0013\u0007\bU\u001d82;pvINvia:B~3l5٨C\u0014\u001c&ub1~#\u0005\u001c\u0004<\u0001\u000fC\u001a\u0003<{UܮΖτ3d\u0011\b;L2\u001c#\u001e$\u001aym6\u001bR\u000b.v2u*l\u001c4qϞIE|\\1\u0011^#aBfA}rOT\u001dtF\u000ewS(}ԸWe\u0011~إżlq.i\bK\u0013$^\u000bAWr)\r˵UVdWZ\u0019eZ\"\u0016j\u0010S\u0013\t\u001a\u0003\u0013@F\u0012t\rˠ#\u0010\u0018sجlZ\u000eܺ\u001dM\u0001.F$ϥ5i0\u0014ڸ)!}i.\nȟtF\u000e\u00166I\u0013\u001f=\u0007L{}1饒\u0016A\u001eyLأ\u0015:uv:q;ѸSh*Ψ7\u0002G*n+G{\u0012*6A@\\өmpvހ$\u0000\u0007i;JֽM\u0014߲>\u0014{~Xi/{\u0015_\u000f[\u0016Ff#Z(IN%wCWѡoVR1\u001b\u0004Y5\u000eN,\u001a,b22[+C\u00125`\u0015\u001b\t;w[.\u0011\u001b[}4s>ܼ]\u0014z%}(Lrŝ\u00160\u00172!V;r̖PA.<X\n;\r\u0006>ȅ\u0015C\r%8DQAp\u0019՚IҺ\u0007Ş3\u001f)[\fL;wY\\*;\u000f\u0011z\u0015Foe5Q<ə)+9\u0004N^V!-v\u0016?a\u001eIǽRӺCG5-nWY/V\u000bd:ڝlJ\u000e{6ü!I-KM斗jiIRr\u001e\teNS-\u0019o1O\u001c\u000e{ψ\u0013{>\u001dGj){לi帜f1mQ^V\u001bɕ6ӥ\u00136.vhrW\u0004VsH3n}5a}4os\u0018v,irw[>+YrMo\u0015l;C\u0013b\ry\u0012\u0012bԡ+b\u00006M\u0013jZ~\\^֥S\u001b5!qi8%5j\u0005Nx]a\u0007sGiL34o~4e\u001fʹ8\u000ftqӏ2}܎]\u001bxZiqn\\zi\u0017wY\u0010@Yx(\t3}+zwKW唴śӖ\u001cݪ޸P\u000bH]~Q&q\u001c\u0005\u0014YrIڂ]ͭO\r\u0004gJ\u000be+RvLrB-^oȲZh:Fd 22\f8\u0007K銻p{\u0001\u0013YNE\u0001~<h$@NI\u0016f}\u0012n\u0014*a\u0004A?J{k\u0002Ž\u001d\u0017/G/lGO盻CQw\"\u000f^\u0006I-;J#>KVx(e^~%: -??!,߬-=y;Ur*(eJP[MѱU\u001b\u0007=cqf\tCfKU\"\u001b\u0015{,UɁo2im:\u001cv=f@h)yVs@F/\"Q\\8\u0000[Oڬ\u0003lާ=̫޽lqqm1t{,DϿOVli1Yk\u0005Y[_IE#\u0015s뽈O%n.~\u0001끽pڤF+N=f\u0018R\u0019\u0016S\u0010G\u00077YF9sX|m\u0012?n}5n}4殷RtNIzL=ܛc\\iΣllE\tid6O%w\"~H|I7fO;\u001a},z߆K?\u0007cjކ|kg_v?3a:DO\u0001^\u0006{$c\\\n\u0001Ue+\u0016d<xvF\u0016_\u0006_*]P3K=cYjbՅ6I?3)ە\u0007\n,J\nw}iW }Z}HvQ\"j3'XR\u001e4\u00069.W\u001fcBu\u0019_̨oLgW駷\u000fŁO_:}ş=پ\u001e/i_IȣMi\ns1گ+ܤ={ݍz\u001b)}\u001c(kkgjy}{a(v*OSeAA\u0001{\u001fhQTֲ(HZ(~tXR򳬰NV\\lYNy1cҼ\u0013v\u001be.:\u001ceǥ\u0005\u0015qγ0عIw z?t\u0004xsgGY\u001a\"\ft6\\\u00104]v5\u00040-\u001c\u0012\u0016aI\u0015b#*yQW2Ԧ^Sc\u0010S\u0004K^6^dB^j+\u001f\r9ɓz\u001beJsn[VZ[ܪbJN{l#ɯ?*}V{DeA5u1uO=o;Jj\u0015\u0017:\u000b#\u000exJ⾎q{zH|>j[E%8Tf:bw胭\u00135ŝK;]\u00138ѐ\u001c{%Kaї\u0017~x%\u001c:A1Ny\\3.\u001a@n%r{2,:[ae\u0010ּH\u0002=폣w\u0016W6:\n[嵄Of\u000bv;\f66@\fc$q6KSkmBqFҩ\u0012-|q7h\u0006sI\u000eN/ߞ(h&,<õ5x\u001cj͊1\u0017[W\u001f\r1vŇ0٧W!E:F*v]\u001aSq)%ZvOgN1ފ`ioS\nN\u001bYDYK_vZ>>){ؾc\u0007\u0015v r7VRg$n_xpqs®7Q\u0000f]4\u0010[rJTm\u001fY\u0006sBRUhŪ5f}\u001bM0\r\u0005\u001f8ܜ\u0011Z\u0011P\u0019\u0017P}!:8dSJM\u0018ٗ0 \u0000ɷ]~nH?Вy\u0010./Ҝ\u0016\\ľp!k\u0000Y]ibwȨ\u0015ɒ[\rmt\u001buG=\u0016%\u001er\u0017V_\"VP\t\"߮\u001e}d5%=N$^^\u0012(yWc$tCbwM`WM`br{OM`<SzҪM{}h\u000b\u001e\u0019Y]\"xΗ)\u0002E\u0005_P^\u0004\u0017S{}g%{\\HU\u0019&d.'q_;\u001fnʎ?t)XMדeU~L烂D?S\u0015?`73~뚦u3qM]\u0014)lQ\u00118\u0017\u001bwFr\u0013/ތ0@Si\u000e\r>UQNu\u0011A\u0015>\u0011\u0019en7k\"jlCK\u001a\u0004\u0017Vڇ\u0015;\u0015WۆTTن*\u001dsK#2JܣJ|cէX\bU[w>j8.|\u000b\u00107\t{\u0012]\u001fؔ:\u001d\f{\u001b#.i?-n\f\u0012w4p\u001dd5OeL{\u000f6?yoqewE$$|zW\u001f7=/\f}\u001dQ\u001d\u001cPw!dS\u001dO\u0014B=]Obuފy=ڮ9\"&Kq).6Em+5.4.qcD\u000e^w\u0015RwEr§\" F)?ش\u0017\u0015/\u0012^w$];WM',<-\u000b\u0003ڊ\"$\u001b=ҬF~\u001e٫\u0002\\Ux\u0007VEZ\u0014FZ\u000eRW3\u0010&֭\u0017]>얈\u001b\u001b<N5$\u001cjd]sa^eOQk]\u001c}\"1-63Xsfm\b^뾿Vgc`Wl\\[Jpxܪpxyc\"E.[.%^Q\u0007ڲ$\u001f\u0003m>s\u001a[z[iY#Ȣs8\u0015~e~ўenIE^1\u0001eL{7P\u001f؇SPo|lOtz©6\nWRRh\u0003}\u001f\\_Ʀ/ycQo\u001fn\u001aR\u0019\u001dX\u0015}Eh^\\Vzҳ&4\u0003\t\u001e+\u001c\"U9GEܮv(\rKwu+=߼\u001f\u00053O\u000f+#b\u0003*.\u0017{Fe\u0014zE9VDE\u001fK:Q\u0012})+RUuH\u0010ٻ@YS/k7\u0014?eucIԉԣMY\t{݊4jm\u0017ڱ]\u001eoA{o({G\u0007͛>eU9m\u0013^\u0017q٢6\u000b$:\u00133Mƛ:'M4In\\e^p>q9636Cay=Wq\u0007oa\u001a2\u001e^l˳\u001fxk\t\u001f)[7қŸ\u001aE5.0ѯ\u00165[VU\u001eh\\\u0015\u0012Uv>1#־!6UU\u0011 kpj\u001c$\u0015\u0013\u0017\\+#\u0012+b\u0013\u0015x*v9I,ܺ ڦ3'tSR_[ux\u0018sL{\u0001βpܘíYqbcc<b}j\u0013ğώt7\u0007A\romRț\u0018(4vap~\u0011%~DKEr\"H\\\"\u0015zD\u0004D\u001cn\u0018a~5۳/>u|/VWUPWn:ErW|_G]#xE50\u001c_7.ENaY8g\u0015W؅|h<\u0013\u0011?\nq\u0011U\u0017OT\u0012Sx6aCdNCTpO{i{E\u0000C\u000f\"6|k8\u0005wLyIB)ڰ\u0000ݴ\ro܎Vkkeh)Ҡ\u00078>\u001cE.ե$,\"yŵ^Q\u0005~<_EZWdh~@9\u001d6dƊZtk\u0015qQ|hoBk\u001el\u001b˼c\u0001\t\u001b~c^Xz9o\u001bln؆l\r~_06r\u0004-QUC\u0007NF3d&i_<t\u001aZ1m\u001eھ]Jzr\u000fM[\u00184*ߚF)OFc)\u0003ՐHmr4[u-ZH\u00033;_()ٸ\u0017:8Ew_>f&2WLkE%\u000ea8G$yDGĞ\bH\bIHz\u0013s̩Gdܛs1oG~\u0014Irvwl\bn<\u001bR|&\u0018xGA=o3;78d7j\u0006_V}=~AL|M~4Wm\u0005=e\u000eR<\u0017a\u0012\u001aFh\u0018\u001a\u001fcO*h\"RSNPC+֛maʚgԊ0C3\u001f\u0011Y>\rtw\u001b>xJ\u001a|]m\u0001]9W\u0019\u0018\u0017'*-++H\u00172\n\u0015\u000f\\\"_u\nT\u0011qW/\u000b\\\u000b:z(}⚚N\u0007B%sp;^봽^N*\u001bj6Z0_\r-]\u0010X\u001dW<3c~{y3X4\u001a\rEC 4|\u000eRƟ\u0003ҟ?\u000fόģ\u001ek0I<7\u00124j\u0011ZZ6J;nK=\u0002\"cGEFFFE9\u0017\u0015[p^^\u001du)+vG||\u0007/#ny-nk\u0012\u000b\u0015\u0001v_:_Ogc^4\u001ar&45zg'o\u0000Z8u!{\u001bߕ\u0012\u0019\u0005\bw:\u0000\u0007?h7\nBC\u0006_GJOДqKu\u000eɂ>\\7>.8G4\u0005\u001cl\u0012\u0015U\u001a3*G\u00141\nüʃb?\f.\rؼ%\u001b\"糖Q_\u0003\u001a\\\u001a*ߝ\n\u000eor0?CRuV#6r\u0012\u001eP\u0007w\bߏc#n<\u000e\u001f_F?\u0006\u0007Oߛm_$kb>~\u001fGV\u0011d$bslulm\"\u000beqL\u001cƾ:yyx^J\rr|\"R\b\"\u0018Y\u000fHn2A\f1*yE࿃fCgg61:NSé~/\u001f)\u001ey<,t5Y{\u001e/ܣBF\u0004F\u0007WdcU\u001cy5\"K!ʟ}ܘecb:40.ϘS\"_)|c!d\u0001{xn(\u001c(4\u0005\u001b4\u0017MWف\u0016n>ԭҔtx]sUB\"?š(S\u0015ˀWb\u0015勿WGEo͎ߺEa^Wm\u001b֏umC\u0013kc{r\"1j\r\u001d2ck?\u0010?u=\u0007Uq\u000f&Wf8B\u0018z3j\u000eRs<v5Z t k2Q\u0017oN艊\u0017H\u001c\u001eOHx[\u0016]簮-Gr[ׄR\u0017ݢq|*\u001e\u0016+\u0012\n}\u0014\u001fx*\r\u00194j\u0002Y[]^~5\u000349\u001d?&_f-\u0010Eg\u001ai‭\u0019\fϼ͞瓞*n<~#u{BiGJIkғ\u0002\u0002\u0002H粈(xx\u0007E\u001e\u0019]\u0019FA\tod82y2\u0003|m8~u\u0004\u001c7`\n<\u0003\u00190\u0019\u0004\u001a?\u0013M\u00184\u000f\u00198\u0017V\r[Lމ\u0016kM^\u000eWp.\u0018Dz\u00005!ʭ,4Z$YСƋ8D=¹2\u0005\u00115/ZP\u0014x6\u001a朶M\u0011\n\u001eݴw7\u001b\u0014A%W\u000bXpV1\f^M܄N؀T&GǯC\u0013GD\u0013@G,G&kw\u0016Y;~\u001b+/\u00026;*\u0001׾WM\u0017޸vbo[zwKJSSBIK\"e\u00187<\b\u0003\u00022H\r\u001b\u001ag\u0011*?Jq.&\r\\&\fY&\f[&\\@\u0016bVs\u0003։S6\u0007t3[^>\\ܛ<\u0002زW\te.o\n\\c_r-*\u001fo\\\u0014wv+xz,M\u0011If\u001fCI\u001e\u0019c<\fy>a-R\u0016MU݆A3昡sh\\32]\u0007MT\u0017ha(<J5BKӠ([^]zP\u0016\"+\u0012h\u001e71~X[稚WQ\n]\u0018#6\u001e\fVf\u0013cqA\u001cJ2@}\u000e_\t\u001a\u0019&)MAS/DSǭ@ӧlCЂ\rG6q\u0010M_,Agh|\nMi&ivV\b\u0016Q:x=\u001e~usR\u0003\u0013\u001eG\u0015?{Pk|Bw.1}N1\u000e}5N.\tI\r~9Ws\u0006\fhcD5\u000f^kS\u0011ԑ87/B-o#:~\u000bR\u0005MMu%R#EW\u001cF\f|ݷ7\u0006w\u0017n/M>{^\u0005\fWlU{L\u001d\u0012\u0012xXsm5i.)uɯK\\0\rӮ[\"2P+ME1Cj\u0002^s\u0013gfx\u000eǄ!sФKVSq|j4AV[\u0019Ьh?ZţEt\u0012ZeHiKȯ4JULw3\u0005!^^\u0005Fث\u0012[\u0017\u0003\\J\u0015%1eαNy\\OVG7O\u001d3ߞ\u001b{T\u0013UYxLp<NϏ\u0015{tkJHeB\u000f܍XZ4}64s69oEsu<m74S\u000eбG?8\bFߖ1\u000fE>q+\u0003=\"\u001e߻X;wz^\u00028Cpo쩆\u0002\u0013J\u001dI\u001fR9͛SW۵| Z\u0011q\u001ak\b5 q#r\u0012\tsd<Yhʈ9hY87hD\u0018 eVHm\r\u0010\u00155@\f\u00022\u001bJ}jFl֮51\u000e>,k{}*-8E`ԍ^/\u0015uxlyᏊ\"Uڅ~qmrH.rJL*0uz:g\u0018?~+caxF6\u0011T\u0013R\u0019̕\fm\u001ch\u001aßVO+YSL\u0006He\u0016RTVZ3\u000fD\u000fR^\u0017R?je~F9Z_oC6\r/\u0016S\u0019\u0002ci\u001cM\t\u001dNIݵNɟk\u001d*\\S˝\u0014̛Qo͛1\u001a\u0005OZh>\u001e&:S\u001b\n\r4y\n\u001fS㜉\u0019^kSӶ\u0019*Hu)AWG\u000burQ\nZ/WiGUM7=ڒc\u0002~^'o*`zexxȲ<\u0002/=\u0014L\u0006w1(kk0o\u000f\u00164\u0017NP\u00195\u001cWm\u001bF!d\u0004eAy<f)U6h-\u001a[$@gnE3p>~\u0019~@[Tm\u0014ZʠY+%h\t$\u0010-gb}Wpkh㷛|mL\u001eM\u000efF\u001bq!+6ؤ\u0017b4^Nz_\u0014V\u0013ZZj\u001fSn\u0017\u001a_\u0015W\u0019\u001d\u001f6g\u0014c\n\u001f#\b\u001fA\u0002\u0006|9q\fATzTA\u0007C\rM\u001c\fMeh`||=^gj<\u0017\u0002x/ؒ\"'l\b\u001cѭtƳ\u000fn+\u001b/QkO}⏊\u0014X\u000f>\u0010\u001f\t|\u000e89`\u0007]\u000b\u0014O8G\u0014;7u+wM~\u0012G}itv};\u0001r\u0004'6Y!>\u0001\u0019\fT-G\u0018ezB\u000e-\tCKr\u0007.}=xak^\u000f]q\u0015\u0006)\u001dοi:ߺ\fU\u001bɫ|\u00075\u0016k\u001c͠\u0002\u001a^ϰ\u0017\u0019\u0012F^,=S\u0015\u0013\u0001\u0005ƕkEX)c#Ӑ]m\u00149_D^7i\f`\u0010Jd ORxx&<S\u0007,4C\u000b\u001fG)\u001f:VHBњW\u0007Ur\fO\u0005n{\u0005\u0011q3WHZyԀ\fV2zo\u0004;\u001e1>i\u000bo)4Ӱ\u0017\f(a\u0014ո,p!}\u000f3qqIɓo\u001be\\r\u0015賕8[&P_|\u0002;\u0014\u0000s݃~\bCga\u001a&@X9\u000fvh\u001b-y\n-ߺ\u001f-YK\u0005Kuh\u0018S\u0001\u00036|0d}i[k\u001bݼ\u0015廋M۵07߾ي>p0l湝.5H\\jx_k\\\u0016󌠜\u0012\u001d\u001ajwU\u001fG[w>WH>\u000505}LT\u0000Y\u0019X^b\u001fU\u001e\u0014al5#.a\u0019\u001e\u0011sh\u001asZ0ZOy\u0013|(q74^u\u00023ϒOܨ_\u001dgUv?\u001amM~\u000f~M>\u0002+e[\fW5<\u001c1L&hQ\u0001o ,wd\u0014=ޜiu;z5noؓ\ri\u0007n&\u0019#vAlU:}-5KNT∹6\u0013}z4\u0010h\u00176ޔ«۰3O\u001b61K7J5:]>R׈rH\bɇ\u001eC1_w_5m\u0004qQ\u001foUAܗw&\u0016\u0007l@\u0006:\bsTZ&\u0013bᢪH8k\u001c&wCqn\u0005Y>K萩bh\u00138dj34}\u000bT8\u000bc1\u000bub\"IiKP\u0004;>;\u0017'~a=\u00055<eRSFoyc:Z;wLKy),u׭\u0019]kaz޻\t?VQ\u001ff9ju;\u001f8aL**R*:s\\F*+-t\u000f\u0010?>`׳VU\u0000YWii\tϮL\u001a\u0018eU4v\f4~,̣סY\r\nc;ϗr?iWz2ߺéÍ\u0018u2?\u0007}\rn{\u0002/J辁?\u001al=H;Ǩ7\u0010w6xs\rNfn/ ]\u0003ͮm\u001bu凾Xh.Alx\u0006\u000eEaY5WtHyV6ѕo:Tf6}风]tޗ]Oy\u001d?g`\u001b1\u001e׌+Dh#7@٘\u001d\u0015G^n?a[|-5u̓\b\u0006}6h!ɱv4q=ޜj\u0018;WAs7-\u0006\u0019\u001f\u001ba|4}6\u000b46c.>u&fℲ\bQCD'\tRf0+L/\u001b\u000b\bS>l\u0016\u001d=?6nщ[OYSג\u001aL\u0003Ah2kS֠\u0005Eh<`kS~v\u001dW^.ΑՓϪY\u0004q^LM\u0019=ԋߤl#Қ\u0006OYI+'&\u001bj\u0019\"M\u001b\u0011+d\u0011\u0017ė5{\u000f=7+\u0004gF}ТTV.sG(Z'ry'$KŖlȬe䯊,K\nOksڤ\u0016\u0001ٱ-^'6dHo8p\u0014\u001d\u0007䱋ORch˱Cv\u0019/AΠ:yY5oi|o8\u000f7D;\\`8RiA)[{L\u0004hihh\u000b<\u0016MC#*6oE\u0001Q;'_E\u001fCΟg\u00183\u00071ֶAKVܮ#NeÞfR;\u001a9󔤰\u0004\u000e*2\u0006t=L]i\u000e~n9qxƽ\u001be\rܲ/k!gq8agė>\u000f8Z\u0015@uu4kt4K.c~63qlD+Ԧӧ#N=6Γv;\u0006ün/-/w\u0012E گ:ENЌ\u0006SrF{k\bϧӧ\u0007\u000bO\u000f\u0012?1ijE^\u0019i\u001f+P])\bx04탺IbJ\u0003ۥJ+5h>ӖhZVh\u0001Z*ez/mzyq\u0017u=O;\u00195d˳\u0003RgEܘkVM g()\t]\u0014\f*sNm}e\u001b\u0012\u0018z%0CRHnxM\u0017\u0014\u0012\u0016&䯥c\u0011%\\Getkw[9I\u0010?uOA_ӓ=:`QRn]2UWuJx\u000eWA9FL4=}~g$\u000bϦnQ^BF\tC1\u001f<tJSZ0Vag/\u001f=_]\u0005/y*e\u00127|\u001fG\u001e-Rf<09=\u00124\u00055uDC\u0007ك^!\u001d56|Tvq`<UؒuTPB\u0002\u0005&\u0003J\u0019\u0017]s\f\u0004`0\u0001\u0017iۙ-t墌ڲ6F*@Xo~Z\"5ԣ\u000fEceH{\u0007o'?\u0011v7\u001ei\u000bI\r0_6tًK0\u000fqvh#3\u0015\"h>^H?\\h \rm ZRjx.\u0013v\u001dw\u001d+w\bB'\f|\u000f,6\u0001YOչMt.m\u0006=n\njEW\nbZ׈>H\u0010]OR8\u000ec\u001c\"&\tS73W>]AR:AEi]fm~IFWnt_oM\f~z\u001fxc:\roh74/9gQ#5㣮M):l6._\fLM\u0010`H\u0004\u001f\u0011\u0017\u0011:9\u0010\u0005:ז8͗9G=FѓD)5歌%55n*㦘*¹PЮ>\u000eBݹ҇ͻe\u0015e\u001ep\u000eR\u0003sW(Li\\͜\n\u001f/\nxЬ\u0017P\u001f8\u0003.ouz8NXp39ctOfԿ˯\u0013|Y>A\u0005om9y\u00054cA\u001b50J8ތNo\u0014\u001dw\u001dn&#']@(\u0017ToqHJLU\u0003\r\fF\rXsTy\u000b)LPbDZo\u0002\u001ep\rǥ{%\r2YN..׀o*Jj¦}Ё375'\u00057~\u0015nB\u001e.\u0016_\"fd^\u0007e\\1U\u001bˤf_c\u001c\\7c)3!\u0013Ye騱:\u0012u62)CzHsZuG\u0017\tڲ\u001d )$rke\u0013\u000e-=RZy]^\u0004\u0006<T\u001eGrխ}˟EѓiK??j\"VQg'\b\u0006\u0014]CSt͐{]\u0013T~fٔG4=EU{kYJZ[?ͯ|0+YizO׍&9\u0018\u0016\u00175fSKSM]\u0015\u0013.~H-k\u001cc&\u0013&΄3\u0013\u0019\u0011\u0010m]\f{@KOvw\u0002hSOWٝ;\u0012\u001a1w\u0011_o\u00102Y=Te[t.|\u00122q6~*u>}&C^m*R(u@p囶0̽\fWr\\rHxvI)єEUAbz{{\t\\G31cYj쒫d?2`+M\u001ak\t\u0003\u001f7\u001eW\u0012X;\f\u0012Y\u001dhF\u001fPڤ\n\b}o(C\u000b֍\tg1\u000043@ultDi5tj(r\u001b{y'h@oTʄ],5%z\n>\u0013\u000b\u0017>NG/\u001foHU!1a\u0003,e.<]D]b\u001e-[D>Q[\u000bhЉk\u0014S$3ߛ3M,0͘/?K\u001d\u0019`(uP6O+\u0019\u001e :\u0018/9t\t=d\u0002yӊ?!;-Д\u0010,\u0007P\u0017=\u0006x\"?3\u001atd'G;{*#Ynf\n{\\4|J٫I{ߘ\r^]fCJ\u0014UIn.f\u0019}\u000e\\G*<o\u00056\u000bϞ\u000bځԽ^s_to}1}ymB\u001b\u0005^f\b\u001d'y1\u000413\t{qO}sSGCS>7g}}\r1\u000e30!2㖦Jmb4A7\u001b􌈞ЭFZtW\u0017b7S\u001a&m_9qKReφL\u0006#'p\u0014&Um0ҫ)kF3O:enK.m/+\u0014K?\b:=\u001a`fy\\\u0019ߢ>\u001e\u001e({.[<떙CWx71\r|=WO\u0017-U\"]#\u0016\t\u000f\u0016\u001e\u001fln}| `@:h\u001bΟ7\u0011?6h\b\u0012\n3åύ'QqG\u0007\u000f\u0019\u0006Z\tfқRV9\u0013J\u0006\u0017nb.uꁮ!s6`)DIՖ=|cc]}p˧%'Kzp\u000f\u001aqc6\u0013Y\t=F=_\u0004\\q\"/\u0002E\ns\u0002if\u0001\bOƎ|afE]\u001bimډ\u0005\u0007}C>_\f掚UE[1\u0000|e<K\u0012rc㣨\u0006\u0001\u0005\u00047\u001dmE\u0014njjpK\"\u0012HHK\u0012\u0003\r\u0010*\u000b(\b63Ό3θ:33\u001fskꤓtN\u0019L麷9޳{|;y\u000fjuO\rJ\fr\u0005,\u0003H.BH0jU^e޽u\tK۰>/T8}{;(x.@\u00057?>\u0004\u0013mϏnx:#\u001fS\u000b¾_}\u0017^ݫOtV\u000f?e2\nK\u0005湏<ϓ~g+1oa\u0015(xO`,\\]\rʎxO4\u0017nrǖ\u000fv'ל]y\u0018\u000f>|w\u001eYGn{\u0016M\u001e̟c_&|\fKq{\u001aC_܅\u0001a,g?G^][Ց5\u0001i[{+tw7G?K1o{774ڵ=_W>l{\u0019a\u000b{\u0013e\"02b,\u0013'NL-ax763k{r{*-us\\m.܃_\u001dm̵|*=H\u001f/\u0004'z|S9M+z73O}\u0018ıx|+1'V\\W>\u000em{\u00159};a}8Pw\\|l8s\u0019xzgJַƸ~pkΈ3\u000f}s3V/\u001dX\u0019=~\u0017\u000ep7m\u001f^5o \u0007-Z]se\u0002_jrg9M\u00051\"17|hc\u000f79@5C\n\\5\u0015^\u000b\\\n|\u001f\u00046=q#G\nv\u001a=yW\u001f:\u0004ϳ~?'{voe^}[.&-{%ov\u001bM\nn~y7)Ϯ7uO]\rc_gx_K)soxq\u0014˨ISۿj֢\u0001\u001bD܆\u0000C1s֢g\u000f?zo|\u001b_\u001e~3\u0001\u0017\u0005\u001aor\u0005{7\u000e4\u0018-9\u000fsG֜\u001azK\u0007y\u0007yOlu໕`j_>5?0\u0011s=/u߰>\u00072\u0016M׼C]SĹeԮ\u000b]^<rG);06K'\u0014s$\u0007FE?Ӳ\u0003gg+gj\u001bPz4m:,\u0013'\r28Cu]\u0011-?ӴxH՜\u0000Ġ$9^[\u0007zvo~Vy]kZw]\u001av^Es\u0006z߾\u000f&`'̍Ye'w\u001f\u000eO\u001e|տ1Os䫒3:]<񷒪g߽w\u0007zp.߆|+v_ͮSJ]~/!\u000b\u001f\u001d2]\u0017[w_>;\\G~8צ\u0017G{¹׻\u0016>zII\fh,o/ 'b}9\u0017l&ҟX$鍵9Sɸ\u0004{\u000fSG>=кB⡁5~cov\u001ex|wW{ߎ\u0011݀X\u001b;G\u0016?|\u0019IߊG 9uxp!⫏][\u0015$?$\u0016\u000f$V\u000f%v6d\f`E9K\\X\u0006\u001cUι\u0007{ҘoϿ镱-?{V?]oւ\u001d_5ԿU8_Og?KLr\u001dvn{2̱<9'4\u0017u^o'Q}'`9\u001bGu?S5{+p]%-3\u000fs;\u0010>q\u001fsG:C0f7o%6:=fsVwϔ\u0000A-\u0002\u0016jӅ\rGܔG\u0005Y^_{\u0004\u0019[ze@U]\u001c<x@-'o)u0'qȵ{\u0006[\u000e<m0\u001f{\u001f~\u0013S}3xh_<\u0019P\u001b5߾w_ʗAԹe\u000f_\u000es>r|\u0017;͹\u0015x,wwZ\\\u001esb~1W6|k#\u0017/:\u00141[k-߆\\wF\u0018Yzn-\u0017\u0012\\9\u0011W\tռޜO\u0017;{\u000e]9=O\u001e+fG?\u00171\u0017\u001db\u0016xc\u0010W޻~wB|\u0003]]R\u0007Gx<t{%G\u000b\u001eȻ`ޖ\u001d\u0017\u0005ܻv\u0007l0\"n\b\u0001\rv[GQ>]ÿ5\u0004h\u001b9{\u0013\u0011_\f\u0010\u00170ǐo\u000b0?\u0007^*\u0014zj91FѸvBr\bm~foA+zy3\r8Lu?)N99?\\qc#oq\u001fDS\u0010ww&2\u0018!\u0006o\u0018\u001c\u001a3Q'ǜy\\k`nM3*,b)\u0019\u0016\f\f~\u001a#yC\u0011\u0003\u000b\u0013z\u000fs6,\u00188e2\u0017\u0007\u00180'\u001cd|$H.\u0015䍁GG\u0007<\u000bɕ\u000f&\"OiJu/*ꛩ~9䣀ko/܁as|cp\u00051߈#ݵg7U[{^YI[$T\t0\u00139\u001c\u0013+g\u0006L\u0003Ygյ\rS{qO_N$\u001e\u0010\u0004sv[p.~_3ǿ\u001ay0{۬?c3޻Q޻\u0005|]?|\u000bv\\23\u0014釾oݳb\\\u001d\u001f\u001ba@w˶\u000b3W\r5ktq\u0000M.{kN\u0006\u0016̓L0`<!\u0015=1\u0010!\u0019tՈco]uAྍ`^F\u000bqP1\u0017w`37a:a%rcc;-\"9\u0016l\u001dy\f1ׇ\u0017w \u0000E<ow_'yYsܳb2n#X\u0006[zCȈ`c>ЍH?_âsц³`\u0005\u0004CYH䀘g3gOl:<\u0012m\u0004(3*\u0003\u0016{\u0007\"~\u0011)\u0006V\u00021О#\u000eq`\\'\f\u000f>B?WAޖ\u0017y,>O\u00141W]7\u001e\u0001;1o\u001e]]$݃/\u0010\u0013BO_Di[\u001f֐ܐfqC[\u001e7\u00036a\fy\\ m\u0005\u000bpʳK1F(wr&2閪\u0003MLصJ\fF\tv+\u000fsrci_=uNϜ\u0003\u0003mFx7\tu m<>_g꧿\u0006t+]k=OiZj=okgÏG\u0013d^\u001aX^YeAY|\u001e1,\u001e4ej\u0005\")\u0003?d\u0007C\u0010\u0013\r\u0004\u0012\u0017愪p\u0006,\u0007\u00040\u0016З|UG\u000f`#yn\u001aHUm{y\\hs6˅Uhb\u0010}\u0011-P7\\~~(BF|\r|T\u0019\f%+\u001e\n`\u00062X}{O9\u0004n%bT]#놺[\u0006\"V.c\fev?A\u0004Kh!yYܿ^-oq\tz\u000f:9ͬ{5>\u0011LW\u001f\u0016̕X]N\u0011m~\u0002]\u0010\f\u0007F֟\u001aCI:W\u0005|89䧕Lyq\u0019g/%ߖ`<\u0018<\f/\u0007r5\u00021e\\tOd9<óu]m:q2';Pg\u0006\rm1E\u0015~y,⍼a\u0013,J0/~9֝\u0017{\u001fx\u0006\u0017ax̥Jp[7^\u001cZ\u0003.B<\u0019A\u000b}\"l\n+GA>.\\D7%:$ϛ\u000b{_#昷ip\u001bA5}ǂcs2'LqYxW\u000fZ@)ㄘ5x;dq\u0006f\\$Gtbᖁ$<CcVqmH\r`G~\u001dxN_Rk=9\u0010zΫBk\u000e^8\u0000՛_\u0015s\u001dz\bsS뇻f\u0006\u0010u_\u001f|-;;{'6_\\L랾\u0017]77\u00107̿*\u000f+ؗ\u0005v~ b8Q>õ4M{S\b)\u001bW\u001f~f?]CO>uy˽\u0007\u0007b!\u0006۶>|-2<zx\u0001\u001b{W\u001e\u001dI|M{}!p\u0013\u0003G'\u0015~T\u0015|i?\u0011=j5+v\\\u00192;~i`\u0007e06EⓁo]w:ucI>ሉ9?n뤘\u000fڻ'AOoxz4x?u+agM[.\u001aT\u000b+}\twZpOh{N?r\\`ރ_݅y| Y<ƁQ\u0011s`l`<GY~X{])+1?f8Y\\8]+\u0007\u0013kH^<UOww\u0011\"8\u000flsmr!Imx&\ry\r\u001ef\u0001k͊Gb\f晍zߴ\u0016V?ǈv\u0013ma.n7;prt_L}6eŜ\u0004\u0003\u001es?xh\u0014t?;t\u0000⮙\u000e~uя\u0001:{g>=-\u0005a\u000e_jp:ƿڃ\u0013V\u0004y<u#W\u001a\u001b\u0018{`3.ļ|-=\u0003Ɛ\u0015c\u0003WuG?/s\u001dh<Ƽbd\u001dnpWl2z\u001d@%!\u001fbx\u000fNn<&B/yӣ\u0017S8\u0011ʗaއ^k\u001e\u001eלB_?,\t\u001d'&yƁ/0ם3\b\u0006yZ\u001f+O${~4Y?^r\u0014ow\u00155/>\u0012zZ_>Frǅ\rc;\u0013b@]y\u0010-{.\t@$$b_~;Fl\u0015_Xef\u001b-/\n6m0d\u0015\u0019:ݾr/#Ѿb#ƙ_r?\u0002~sW^TH\u0015;\u000b(O\u0019a9&)2zفk\u0017\fs,{d$E[K07b^|hE]?\\\u0004~p\u0017w\u000f]Ye;b|զ\u0010cc`\rnsq\u001c?Ye\u000f5??cQsq\u001f`r\u0019<t_O 1<\u0010C3s\u0010P[K\u0017!k܀\u001e\u0005z\u001fxFOu\u00031Aધ\u000b|:qWEďxśQ8x\u001fzI5\u001aʭ~3=~^\u001byX\r`;_&qO Ř\u0012=\bq\rCA^5-u;Q=$c@/|Pj\u0005$\u0007o\u0007>Z{\u0019s\u0017<#ޑ(資\b.\u0003Wa`n|moAL\u0018ߦ\u0017Ǻ}yW\u001f4Խ7>[?<;޴{\u001f|gD\"\u001c?0\u0012\u0010\u001f\u0001!vw\u0013\u0011d{,S&^\u001f:7Wݴj!1\u0010\"ͺwE\u0004 d0λPj\u0005`\u00071*&Y\u000e<%x*;{\\A쬹8\u0016\f@lY?v7?N\u0019^\u001d]9\u00141NHN٭$IN\u0007\u0010܈\u0001ѺBFMG\u0015mܴn8-\\\r\u000bhV|pT\t>p\u00065\u0017wp7O~7ze\u001f1sJ\u000bDrqo:u\u0013F=7S\u0002O}UY{\u000b\u001f'F\u0013,\u0004gh+\u0011;U]OB:,SY!o(w\u0013_IZK\u0002\bMj0Ħ $/k03=\u0015;+\u0017\u0013\u0003\u0007H1*_c\u0017-Ě2!joۏП\u000e:t-?g`dɹ/_ӉCMF\u0003\u001c,\u001f#-\u0019čcH\u001eĭO\u0006\u0017<$̫?\u0014՝`HyΌWiyyrս֊ГW\u001aK\r\u0011a͓z\u0016켘+n}Vo\u0016^\u0015i\u0019\u0003]>y\u00059B\u0015#\u000e.b\"\u001a;C#;\bq\b^\rAק\u0006\u0005\u001ba,6\u0002s\u0007f:Z\u000bU6#v\u0016wM+j\u0019[\u0018잂勭\u001dZ\u0005~._W\rϪ}q Z؜u\u0004\u001f\u000f\u0018Y\u0013I\u001d7\u000007{y\u001bqN\u000b\u0011vɎ+C\u000f\u001c\u0013Kɏ7\tBO~R>2ey\u0014_34\u0010sq\u0013}\u001f'yf\u0011\u0019\\c=oÜx\u001e67X^\u0007^D0>j8\u001fB%Ce]#}'>VΪTV I빈Ӆn\u0017v(Ըpu9bg|*vVdy5K\u000f^\u0013&W\u001bC`H\u001ey\u000f!]]I0\u0014\u0017o\u001a8+\\K@\u0017B\u0006\u0002\u0007{x\\~\\~ᑘ\u001aǷ/\u0001cu\u001f8zc\u000f\t?\f\u00127\u001dX;Q?uUǼ_bwAi\u0019ZGuY8\b$\\;߲b5=_gV?\u0017⨭~zT`$s\u0003\u000f]\u000f<\rrzg\nZ`\f 8k. Xk/\nxtdu\u000e\u0019\r\u0003/=D%E'=-8\u0015\\Iw\u0013,?հ5\"\u00153j,3&U}i:9\u0007WG\u0006\u0007#-\u0006\u001a\u0016:\u001a\t>WV>:\u0012/h0{w\u0001?\u0018?$?}˦o\r\u000fzОقOL0{x\u0006J1\u0017P'\\>)\u0001\u0006+bˇ\u0011uB\u001f\u0019my\u0002w]b\u0000r\u0002IluOƵ\u0014\u0015;\u000bme%8\u0003@2BdYd\u001ag\u0006}YG\u0005pb\u000eP֋\u0007B[k\b}{Y\nЁ\b-:`oA\u0007/o]_\u001eڃcmهƞ_8\u000fv7\u0007l\u0014>#3܍c\u001c8\n#رGʃ5\u0000ޟr\u0007('\u0007 V\"\u000fz yMw\u0007,\u0015HΠ\u000fcG\\Ϟ\fY\u0010\u0013\u000f:÷4a3+Ö^K*f9Ջ7_Z\u0010\u0007\u001drmvg1v@`?;\u001as\u0002Yu[,#v\f<+Y.E,\u0018㨟\bvTx\u001eC͗\u001666tVt0h\f7\r'\u0006\u0006`?\u0011\u000btr`\u001b\u0010\u0003\u001119=\u001d޿\u001d]\u000bw_Z\u00151*\u0002~7\t|@\nss\u0013|\u0007_=a\t\u0016\u001e__\b<\".Ǒ߃AiͲ=WW_1tV+j@\\w<i0䷕\u001e̝#`g\u0011ot\u0015xl/bg3\rb(߿HM\u001f8A\u0011?\u0019VYz쬄\\om\u001c\u000fb\u0010\"vGb~o@\u0004[}\u0015b+\u0010w\u0004@Yq{!.\u0015\f\u0004\u0007oy\u0016\u000f15/\u001c?yC\bd\u0019l\\1E[EG<+ԿOs\u001dj\u0002\u001fg9\u0007ϗ{\u001fj$Nhl9\u0013;|jR偘<\\gF⬙?p\u0011\u00077\u00170\u0010w]\u000fGo}fī@li]iS]\u0016}V;\bm:1\u0006|_\tv;d\u0003\\e\u0002m;\b\u001fr?uI7\u0004;\u000bs\u0006;5쬅\nvV\u001a=\r.Z\u0015mGm+^жo]s*oM\u000f]NxW\u0000v\bqiH.{+ /\u000fܷ\u001d|n@;m\u001fN\u000e޷\u0005Ā'kax>2\u0007ȗO\u0019%\u001eC\u001b|+⒆}:#|mK|u\u00015\u0016\u000fxj߆>\u001fbY\u0019_R\u0012O\b<i3\u0018\u001f\u0010,{\u001a[5g@wty*v\u0016/!\u0000Wphth)[W\u0011~>3\u0004w­]\u0019lZv>\u00159&+\u000fX}\u000f\u001c?\bn̺Ǭx/ڎ qm}~C˷_8gG\u0007 \u0016!\u000e|v\u0017=w\u0012\\\u0003tC\u001d#\bs~u_s~k`Q/(SߺVŃHWm}Ŝ6gY5AՍc|[xy:󷄎|6AƽKCO\u001f]89_%\u0001ۃ\u0014ڱe!6\u0012\u001a5O|\u001a%GyE_\u0010zC\u0013|Fݩ]Ж\u001f\u000bB\u00188)c\noXơ\u0002\u001b~9~C?` \u0006\u000f\u0012\u001fs'\u0005\u000b߱@`7bԡ\u001f2\u0015x\u001d\u0007񈋂8?#c\u0013e\u0010[tc݅БO\u0014D\\鈟П@9xmy\u0005}M,\u001dR]?=/ vVS_z]O|w\u0017bg\u001e|v,_{zWc.k/Ys~s,B\u0010\\\fs\u0011\tE2vV࡟𾽿FV$&}lA\u001b\\`\u0007u#Xk\u000e~?Dpmq%\u0010\u001f Ɠc\u0007>(\t\u001ch\u0007{\u001e|\u000b!\u0007=6j^\u0015ކƁmނk\u001ag>_D6~}_\t\u0004\tb,\u0012kl}\u0011x'UT-\u0005\u0003ᅃp't\u0011\u000754mHu\u0011-=J%sߎK\u0017@<4\u0012u\u0017mo\u00051p\u0018hp]`\u0004tɐe{F.\u0002+\u000eD̍'wL:Ӫ|8^q2lH\u0015\u001fF0``,\u0005<w\u000bg\u0010|\u000b>Xp\u000b7\u001eyo<\u0004\u001e\u001e1~@!\u0010\u0015Q\u0017W=r5bV\\v\u0013E[\b\u0006ju\u001f\u0011\ff\u001bC\u0003;nC>Ah!\u000fdOb#]\u0004|8U0݇\u001f|V\\\bE\u000fk|?*\u0007\u0002\u0016ܿ\"\u00185+v]I0\u0010\r\u0004\u001dvoY\u0012ݿWi]?v`jX4\u0005>oK\u0011+-^ℸ\u000f~\u0015;ḱ\u0010ȏs7\tzhQr@bAġr&\u0017mo0\u001c?'>\u000bYrr,A/@t\u001bN\u001cmXw\u0006O}4\u000f\u0019;s\u000fm~NM p\u0013g_kxmyÙޣ/x\u0004ی(lHK\u0001dh<柳S7y[ニv]꬙\u000b>5\u0015q|0~p|.W-NmXt.ȗq]\u0002s~\u0004\u0013\u0015pd\u0014[%Iu9r=\u0007eq-7'6\u0010Pm?\u0019-6\u0017]6]}\u0000Q=n\"(d\u00171\u001e\u0016qpm\u001b%\u000b9{V\u0004\u00100q\\КG#\u000euʃV<[yt/pܓ&Z\u001a\\\u000e\u001c\u001evr@t``\u001f\u001e3Ϩ~`\u0017\u0015\u001fN =@p_|s\u0011p&i\u0011usc|!GB\f,Coc_.7w\u001dck\u0012ٛQϣ/\u0015l[s\u0011S>teV'\u0004ݳ-kP>3\u001f+\b\n\u00153,7\u0011 \u001bGb#`>;\u00079-,\u0013U~Oz,9\u0017ۍg|O~s7b\u0000zp6s\u0001oQ_Yг_x};\u0011]dbD@_K{s\u0001\u0015]:M#`܋6\u0016F\u0012\u0003L\u0006#NoV@gU\u0011S\u0005y½1oü\u0001\n>m\u0012hq{\u000b\u001fD3={3\u0006\u0013L,#a۪ם)M\u0001g`AB_\u001co#<\u0013k\\6$؆8P?ꯥ]v2XCq2g<b\u001e\u0011 Blŏ\\q6G^\u0006\u0018dy\u001b#\u0004\u001a1>1\nb\u0014ρ{\t\u0016#v\u0011!\u001eƪ0n\u0007B\f\bρ<\u0004yK \u0012\u0007_y\u000eU\u0012:\u0013qbp`}-x19{kx\u0006hcE|cFˇ?ݵ7g[\fY\b\u0003\u000e1\u0019xUd\u001f\u0010#𒇮}}9\u0002w\u0014X\u0006w]@Wu9\u0018K n\u0015\u001c\t[\u001d̞\u0002\u0006\u0013C﹊y\u001dx\u000eEܧ-\u001dT=\u0017lٚ'}X?ٯY\nap\u001ez?;}\bG~Ứؒkl\u001b\u001ch\u000fgH?q}`\u001e\u001e\f\n\r\u0013CO݂c\u0012bq\r\u000bM\u0005\u0016\r5\u001f\u001elrI`\u0011Q&|\u00103x\u0003ʡ\u0010_bZemA?\u001ac\u0013wQ'~\u001fƬ?h0\u0019ۈ1\r2\u000b:p\r\tė\f\t=\u001a\nia<gBk³\u001b8\u001d_\u001c\\ȥ\u0018;F?ষl9B,\u000f\u0000;6y{\u0005_Rt&xx^q>\u001dB\u0007qnq\u0010&B\u0013W\\3\u0001?\u0014>BSq\u0004\nbq\u001dX\u0015d\n\u0019'\u0017\u0018\u0018\u0019>wτ6\u0003$xb\u001fø΃\u000b_DJ'B|\u0013O\u000bƳ@n\u000f<u#b\u00112ܧ[i\u0004I]s\u0001Ã?\u0007\rx\u0015q\u0013\u0011\u0010\u000b\">\u0002\u0016U\u0010\u0005\u001b\u0004\u0007\u000f\u001cӍO<---=\u00029\u001b{y7q>\u00119M\u0003\u0011'\u001fp\u0019?4϶goi\u001d\u0007}7\u001aqz\u000e%\u0011\u0007\u0013뇓vyʸ\u001fc~̏1?\u001fc~̏1?\u001fc~̏1?\u001fc~̏1?\u001fc~̏1?ѓ\u0013é!\r\u0019]2\u0005JU9\u0015I\u000e\u001b2\u0003HJѺT4\u0011\u000f'۬\t7=uuuLy-jڱ\t1%Si\u0016Jc⽔\"u\\\u0015~V$sq :±r\u0004ϰ!6Q`\u001dv9(:8;3yΊ\f\b]\u0010\n\u0003Pz:;lwؐ!3\rqXǌҝ\u001dd$J-s+)'\\D2\u001996B/\u0000_@M7\u001529\u001a#2\u001f}GQg$#{f/t\u0013X\u001c~A\u0003-H3\u00111tf2X}2\u0012'w0qST[Cc\u0012ERx=QX8:\u001dMNxP|Nf\u0005XR\u0004.\u0013\u000f7E\u0019n-\u0010蜙l˝`3p\fL-5\r93\u0016[c\to*\u0014O4eFsr+`5Z;oަ`\u0012oiK\u0017D\fS}i\u001f;psdr2roK$^g@+V(V\tg*fm&1#QPZsf3\u0019in\u0019PWd%\u0006c)3r\\\u0019\u001eCx!g\u0011W\\\u001au\u0014(\u0014ISd.QL$\"SᦹѺܽnċDD\u0018LODcS924NScH`s;M4X'\u0019&,8\fN:8}\u0004\u0017op\u0012\u0019icӆd\u0018&MlF\"lF\t3:5ޡGԌN3Fs!&Z+,Ĝs>\bsgU&d\u0002\frhs~bdA42\u0012K\u0015ٱnlaτ/t>[xin>\u0011Yo\u0017\u001bȀ/74E\u0015&\u001a\u001a#O\ni1+܏4$\u001bu\u0011lf+TFd\f=B<\u0006[%[v\u001bZf6C\u001c˷\u001a\u0007jnUt3ъx4\u000e%\u0012\u000b'\u0012T8nǎ%\u000b-eI\u000b\u0012H>K\u0016idc(,EhQ\u0001WkhCL\u0015\u0012\u0014o'kPtt*\u0013x:̭5Nen+f\u001d>\u000bcr\u0017GRV\u001e0EkE\u001a\u0014H|6\u001e{\u000b5rY\u0011+\n\fbX\u001bPz\u000bhjnc$e@1\u001a},¸Q,&9\u0016MUEMΧGzIc\u0001=\tZ^\u001eIΉ\\2<%φN:\u0005\rƗlFN\u0014c\u001c\u0015\tD\"VD\u0016ag\u001e+7<։dgH-\u0006tzz>\u001a\u000b\u001bS/ȹo^̝bZ7W\u0006y\"47\u0011K91\u0013Z'=Mw4𾘩\t\u000b\u0011FP,\u0012Wѩ\u0007\u0015~(SFHfR\u0007ϋ7G# l\u0003J\u00193]Yiza%¾}\u0007T4Glf>\u0000M\u001b`-\u000fW\u0010r,\u001b#1g$\u00163ֱd-}:on;,Y\u0018mn\"xjzm\u001beUgsG\u0006gbAb\u0006s_+6\u0018r?\bTTq\u0013\u0007sޭ,tPh\n\u0003ox\u0017szWM\u001f\u001a`4)6Kcx$\tu'\f\u001c&֕(T'#̙p}}4\u0015]`tB񘻾3a\u0006%gn3\u0015x\"nOZ\u001a[?ɑL\t\r\u0006\u00127\u0017)*wf#\u0014\u001f4$\u0013\u0006ړ\u000bU8\u001an˽ƧIcN\\`,\u0000)a <J\u0014\u0006cg\u001b7?b\u0005\u000eh\u0011]~jHI4i̓K>\u0000'\fVd9rH\u0014L2x.\u0015٥:RY\u0018\"q}R.pq]T*Ku}\u0001̳K%i?Dugb1٥b\u0003̳K[Y\u001a\"\u0014g٥{v\u0000kE4N\u0016Z1\u001e2ƕN!;O$\n5rv3=5MimL/hH_LZ2v\"I6Ukp\u000f\u001fO6 j\u0015my\u0018JAAs^yLZ\u0014L$LhES-M8)\t\u0014Y<\u000b\b\u0014Mh*ܔ*}WTR4bNJQVkA\u001f֍Kċq՜iy4ќi\nKiL~<,*#gUuE\nA+\u000b#X\u001b}X}Fh[@mMpj0\"&LH3f:l<\u0016>\u001dU\nE3 \u0017\u0015m oɨ|ڦd1ѝZI\n3լ\u0004<¿\t\u001dN\u001fgOyvmZ_Ƙ=|azw\u001b\u0017$3_%)Pק7\r\"Q\u0015MvDcS9TtzF9\u0016R\u0016\u0012}l~7G=\u0016,X˝n28⊂n3#K\u001c\u0019|\u000bhjnc$e@\u0017QK\u0017q6\u001a\u0015i>#)bm.\r:No/|O7|s77wx7P\u0013\u000e~1\u0016\u0015Jo@Pe6<\u0010%2\n\u0015j\u001cEbDkΌƢs\u0006[\u001df\tΝ\n20G\u001b\u001aZ#e8xUq\u0003C,[d\u0003D\u0006ofPEb1gQ\u0012$wsU\\U,UE#ހXTK&jh.-\bld$\u0012\u0000ld\u0002\u00019\t\u000bX$5!\u0019H\u001d]0\u001c\u000b\t/\u000bGbpelUNW`fAʝhcK\u001b<\f\u0016((\tѹ\u0005=$X*Wb Ξ&sh_\"u'k2\u0005:=Ta|1cbJ'-lX/\u001fv%͕(s%\\2WN\u0007JT;\u001e͕(s%\\!F\u001fם(eY,H+Q\u0016h+Q=\u0012U8wлgS\t\u0002[\u001fO:ϺL9Z![H<c xP>P\u001c\u0015I\u0019\u0003}d&M\u001c\u0015qբ1˱h2\u001cnôɽ&zM66dúXq~\u0000f$p\u0006mr10f\u0002\u001f\r\nendstream\rendobj\r58 0 obj\r<</Length 44329>>stream\r\n^А\u0000,M\u001bO8ggEލߙy7zWRT\u000e\\;67P\u0000Gݘ\f\u0016\u0016|*\u0016Uhhhp$#ƴ}\nY\u001c.?\u001b]glKz\f/\u0018K\u001b͏ΙM\u0003]\u0001;C,\u0019\nޥ\u0017\u0001NOzlT47b(v\f0\u001a7rtX\\c(̑xsDb}eFs7\u000682\u0017o\u001bs\u0018lX\u0012me.ޘ7M1/@*la_?\u0019PwZ\u000f9\u001cJƊTxe\n\"e=qpsdr2roK$^g biWP\u0013T4UbO:\u0001ƌiFBZRe5kHaf$\u0006^ؑʢwfG,\u000bf34sg/U7S\u0019p\u0000\u001bF\u0003q\u001aP|Le=wT(y8\u0013\n(Gӵ jIn*>\u0010H0P$k*g,\u000fR!z\\q6WaA\u0003\f\u0015QU&GGQ\u001d\u0017qA#̝U\u0005s?S\u001f\tŻ\u0002%g7@R9m?|\u000e\u0019\u0016Atjh\u0019fm\u0019\u00194w׌O7js\u0014o|;fxj\u000fO<3@5\u0003T3@5\u0003T3@5\u0003\u001cx}.D5R\u0004D~N2l8\b\u0011\u0011Ϊ\bo\u001e)Wzif,Eq\u0001<2f\u0012\u001c92\"Ŧ\u0007\u00139$)^Mأq\n\u0018V%gu'XeR)\\\u0017M7Rޜj\u0019XoTn/$Lىg\"wq\u0016\u0006\u0007_7\u0003v\u0016&$pY_Vg\u0019~<ua#nHFBֹFpp]\u0012nh/W(nsQ\u0005B,\u0011oN\bZ\u0017,\u0014\u001f\u0007knI6\"\u0006of)3NA\u0017\u00014~vE\u0012rN\u0017w]_6w\u0014^\u0014ml1\u0015(\u0014w\u0015<&F=+7yl\u000f!gQ~僙~I%\u0000\u0017o{JxбdP\u001b=iaS\"\u001eɇtIA3\u001d\u00029hvf32wM1ⲜEsE\b'v\u0014r\u001fwmJCxoF\u00019ϑ\u0011W\f\u0001nn.>2\u0017Pƈ\u0011b4}]1˱h2\u001c.D6mr\u0006i{?GEb\r:&&lX\u00179o\u00154}$\u00172[T\u000eؙШEI1<Z[-\u000e\u0013|\u0016;ex\u0013;iЊHVJ_o\u001a%$_\rJ\"b#@O\u0004\u0016i\fCu*B%C^}\u0003[eWH\u0005t_7-+sl\u0007\u0010Œ>眩շ0WQw\u000b<?L\u001f?i->\u000b&[lO\r:C\u0016UtXL9n%\"vE:w-\u001d\u000eG_C$99<#[ŸXs#Kg\"\u001eK\u0019\n5\u0012H#\nx]U1k!hH\u001b#qJQDT}e #B$>]p\u0000TN/\u001d}|'/X|_*E\u001f>]t\u00199>Y\u0012msH'z`czACC\u001b]2j'5t=BT;#\u0011ZH2B/̉\f\u001b2It5NĠI%\u0005$*ad\u0010kD\riR\u0001\u000b\u000ev8\u001c\u001c%H4KVNs;\u001c@9('p)J\u001cK\"s\u000e \b\"K\u0012򌃣i,(I\u0002#r<(0V_\u0018\u001eB=m\u001eZ4en\rVSzhj\u0010\u001be8\u001cVK<[\u001bH\u000bvAqpijc8;`%+В\u0003ǒ\u000bD\u000b2(\u0011i.Hh-G\"g\u0017y\u0007\u0014f(;E\u0001\u001fy)I\u0007Т\u0015\u0018PXA[fBT\u0012#02\u0005K(4i\n)H\u001d\u0012ns\u0019\u000ed\u000b\u0014V\u001bCI\u0002Z4ǒkѴ\u001d\u001e,`9;\n\u0011H:YglY4\u0007\u001f\u000e-\u0002j7З\u0012f\rx\u0004\u0007!\u0000\u0001_Qꪘ$bZ/<ˤ\rlh4ce\u001a \u000b4ϐ,/\u0010\u0002I\u0012!0I\u000eh\u000fNAI8;K\\\u000e\u0003WȠ8\fY\u001d;Z\u0012\u001dV\u0003D l\u0004AB&a\u0018N\u0006mwH,\u0004C\\\u001dx\u0018Bp=\u0002\u0003#V\u001eD9p\u001d\u0002q,t\u0016\u000e\n^\u0010eBF\u0004(\u0005m\u0004OX\u0010\t-D`ު\u001b\u0010\u0002Ä&qz\u001b2`+J\u000fJp4\u0013In&дn7\u000e2\nƘ9>,i\u0011Pr\u0002çdc#\u0014lFT\u0011\n \bP\u0002%W!@h\u0007JHYm&\u000e\u0004E+#Aa\u0005N\b0@\u0002L\u00110)cF\u0002F(<\u001a\u001a\rՓ`\u001e\u0004\u00054\u001aQ/0X3\f V\u0018U;A\rÆQ\u0002\u0007Yǌk2 ͠h6}<5ܘt\u001a\u0016Kkkhѵu\u001bKͦdq\u001dGur@͢F\\\u0016]GjCہwkx0yxGɓ,/\u0007Ei>$`(\u0018~k?跎\u001aptm^:ptm\u001c\u001d1%D`\u0004Y\u0005s3&\u0007KIhV`/}C\u0013\u0013@0\u0004AԥJ\u000ewp)@iԣԢ[\u000bÉJCuZ4\u000bT\f!YH\u0007;thgy\u0017F$LD\u0004;%M=\f;ltT]\u0015d%đnVVbF,rJ\u00133ڔEV&ɍDSZ^ Jb+!^$U\u0010+5\bK\r\u000er0\u0004о\u001c\u000f4\u0018\fqUpL>%2ju8cQ92fSi6fc\u001b0#l2{:T^H2oh\u0012v\u00106<(R-T\"^X\u0000aj\u0017-(ԉd,dEl\u0015BQPE\u0014E='V\"H\n:o$4~x!*\u000eUq\n\u0019+\u0019@+\u0000]B\u0013\u0017|)\u001e-_`BZѿ')o\u000eN*\u0005U:\u001edBi4n$adD\u0017x!(\b|SZDL^\u0011\u0002\u00184\u0019\u001a\u0001\u001cM+-#w\u0011Zap \u0016SJ$Dڅj=\u001c2\u0015t6>8K[$\bPv,p\u0003;ֽ<F[K2>_A\u0004f\u0006Y\u0000 Jd5v,\u0017]Y\u000bu?4`Cd\u0004p\u0003k름N}~uU߫\u0019uMa,ìL?}Qh,=D\u0011gu\u0018jP?xJr]磈1>nph;\u0011\u0001{S:]Yt\u0014l(\u000e1s\u0014\u0002\u0011|mhʒhZ\u0016N\u001b0Gh\u0011\u0002uI2\u0019\u0007\t\u0019٤*\\\bÐ\u0003.\u0012XMGMP\u0015\u0003\u0019_d+$פ\u0018=#2\u001bL֤DaPg\u000fE\"\u0017\u0011\u0003hiFK;\u0000L\r|#IlӕU{\u001d\u0019x)AUQ\u0014\u001e R<T eVoЗT*,SZ\u0006,\t>\u00150.f/sb8\u0015\u001ct4Tiv\u001cR1\u0018`r,\u0003\u0001\u0003$1;\u0012yNa\u0006S\u000e`\u0015hGz\u000b9Q\u000e: .MP,2\f 2D\u0007T$wv\u001b\r<\u0011\u0004\u0012ˊ+\u0010\u001a\n\u0007\u001do\u0017ӗ,J\t\"{\u0012*wQ1ׂW$\u000fC/GiPB'>W\u001d10\u001dp\rD?B\u0000G\u0005'+m\fIno\u0016\u001ebs4LSL$Ш\u0013\t~\u0014pz\u0019*\u0001cD6\u00110FdCgF(\u0013\u0012pH\tc\u0016U\\\u0017+9\t삒p\u0018R\u001ePz/d(U\"\u001dkk_\u0005n`2pL)|\u0005\u0014l;Y\u001cr+\u001c\njϪ\bc\u0015+\u0018W_V\u001dմ:iu0/=7EI3\u001fĎ,%J\u00110(P\n\u0017\u001e\u001d\u0019t9ȝfi\u0006WcX2fio\u001e\u001c˶7\u001c_k~)e2ʰdqJp3+\u0007.\u000bw|pmW#3̋\u001ccRH;y|g3legEޢG\u001bcU:CӓCyM9>)U\u001a\u001b_ZԿ&g Y1\u001bY1Y!CG\u001b/=VӳCl61&ٔ\u0015^fEP\u0010<}ś\u001d\u0016(9QH\u0004}C&yA[ϱ|K;S3j\u000f\"\u00161m15\u000bJk\u0019]O[Kqt\u0001zM\"HM\r:\u001a+\r=>-\u000fN.\u0012&tY\u0000$gwulT\u0016JSXzXK/DS}-U\f_c;~tzǏB̓1\u001dIiMs䋞&C\"\u001cهEr.S*PP\tFE&G*mB#$Oמ\bT]Ҵ':v\u0004\u0019y#]ʣJR^vka>\u0006-H\u000ealxriiI]]KcU\"N.'Y-]Rx@M] ?h\u0004]4[D,J$%W\r_ѺPJ\u001e\rZUXSPk\ft\u0018|*IeEVU Y{\u0019\u0006\u0005V\u0002+\n%\u0004EgG \u001fёUu$F(\bZ\u000e^aGֿY|\bM˵JYv\u0002\u0007t֝J\u000ey\"kf\u0014zjܩu1PW{'q3\u0012H]\"Y\u000fG\u0006\u000e6d\u0014eȹ\u001a\u0012F5h0(ّڒZh3\u0016Ԧ^\rx\u0011h&UM\u0014v6Öx)ؘ&\u0015Enw\b\u0019_&\u0013;V-BW4MivPJ'J)CQu\u001c9mwhHlnUܨ\u0016\u001024\u0016M\u0000eT\u000bZt\u0016h,I_+X=\u001fVIRk\"U3ݝ\u0010T3\u0019!9-\f#,K\t/(\f9( 4\u00141(\u0014\u00181%\u00176\u001cČ<%4\u0018_9|T5\u0002t\u001eNk\t\n\u0007rg,[.=9ujz\u0014]\u0012E<ch\u0000?E|dr4֘SY8e\fa_\u0004A4A\" \u001a3=u4B痧f6(1\u001a(\nr\u00197U\u001a\u0000\u0012摅§唩ed\u0003U0(\u001718\b`\u0018`hcF\\(s<9\u0006y8rDJOS\u0002-H\"\u0004DrȦCDsh:\u0001og\u0019\u000eDD|!\u0004\b9\u000e׋Y^pЌA\u0015\u0011\"A\u0019\u0015)Apk1\"/p\u0010hIʙ7K\u000e\u00035\u0004J\u0005Y\u000fX\u0006t:\u0005F E\u0002<\u000b4\u0003\u0015\u0010\u000fY\n(J\u00140\u0004\u0001Is\f\u0018\u0001\u0001^C-K\tRt4\u000f=.7A#\u0002\u0002&*\\9 ikp|N25 LE\u0015]\u0015\u0016\u000fy-\u0016f}dvE4BUY~\u0016\u000b#il*#\u000b$B7\u0003)Amd\u0003_\u000e^޺ƓS,Jvq\u0013\u001bKYr ihҠTx<h\u0010F\u001a67u\u0007Ͽ:\u001f3{'\r77ͯ\u001fA\u0000\fj\u0005\u0017PkFgRD9[\u0016-jF\u0012mvj}(\\2\u001b+kVehS\u0013y\u0013b\u0003\n:6AV\fv=;b\u001dތ0\u0006-2g\n\u001cB\u000b\u001d5\u001dUkNͨAӦ|4v[sFע<\u001avI?\u000e\u001c\u001agԅ\u001cϤ\u0013oA7\u0007ř#7v<{\nyes'NK?\u0003WTkIK*aYtQ$\u001dv\\P\u001cI.B0Y+.\u0012LYfi'\u001b[\u0001\u0014\u0007\n\u0001\u001bx>\u000b\u0001ӇqY\u0012\u001a@1\u000b|\u001b@+tD\n_Ie\u001cZE%) ribLdh\u0017e0:$]:\u0002iRBd4\f\u00142ȊdkM\u001e(&BhQlLj|k(\u0015ed\u0006vMCw\b\\\\c;\\=Ҽ\t]\"ox\u001b\u000f\u001a!HRfqW;젅DVW>ML>RmZ+]6W\u001aSZ4Jz\u001dd&-@gRO\u0005exV'\u0010\u000e\u0017'f\nC/rB(B\u00013VWR$\u0011V5ih-\u000bRk^\u001aKZ4Jz&\u000e\u0012S$\u0000MW$DeLqzi\"ĵS8\u0017\u0019Δ$yDD\u0000\u0006H}),D0D®V&\u0011\u0015\u0019Hmo&RJk\"uU\u0013\biM^j4\u0019TaiWE4sM\u001c$-IC`@۩'\nsMd\u0017`XI73($uĴ$3jzU\u001aV$5W'H'Z[Jd!\u0010\tQO#lP\u000b\u0019y4'djI\u000el,ň\u00192d%Չ\u0010<\u001a鴆\n0MKOOC\u0016U\u0019h\tOkNx\u001a/*-ͭ\\Z\u0015^\u0007)\u0003\u0007\n|L#\u0011\u000e%V%2ZZ2'\u0019Vd3d\u0007\u0018D\tvǷ\u0004UviZZvz\u001arլ@}NtZ#u8Qii^ת:HմD/:=0Hi/O^\u001a<d)Ӡ8LY\u000643Z:*4--;=\rYjVe=^?ifꄧ\u0015ԸUj] %Վ(\u000e\u0010I\u001f%\u0019>\u0003\\RI${尃g!]FZ14Ø.8}\u0015xH\u0002[A\u0016iF/'*F<_%\\E\u0014T\u0001h5\teY\bOusSi\u001a\u000f\tAqS\u001d2TM+:vZ*A/<\u0013&V\tA}^xJ3SYi\u0002Pk\u00114ᵗR;_P/<M\u0010TJ/=\u000bKOմ3լ\\etKdj5\tKNm^t*#ZA}j\u001dA\u0013]{\u0019s2&BKO-L'IE\\zѩVPuݴU^x\u001aM'=\u001dMQZY3c*̤*\u0002mڦ\tiNNޞNz&+C/REN:i>Nt'4_MX#DE\u0011U\th׉NmNr*'*I\u000bԫV^>Nj*IeNuTUI'5շ\tMT꟩:it$Zʷ`餥r4Zuת%ӟIK%|IV$\u0014oJ',RICV^넥ґ\b[j*suR\u001bVTVe^*\u000eNV*IeKuyE:YޓNXR<0VZ',\u0016$/+|\u000fCy:i\u001chTZת˥D\u0011}S\u0006G*>X1\u0007\u0006Ku\u0007݄$FK\"m:J_\u001f-W\u001f}!Kόsz7iu\\\u0015*V$0ׁ蔁\n\u001diy\u0013:N;r;ʶq\u001d\u001e\u001e\\.O;}\u001e,qG8l2$5ei\u0001\u001dvd\u0003{@P2.\u0010\u0007\"E;\u0004#\u001b\u000b\"u\r\"ԼɰKg(jG6U\u0004Em\u0016\u0011r>E`\rL-#YM#Bk(\u0004\u0016xvd#;J:˞\u0012!緫DvWjG6D븷Dy.ebB϶I}\t-gz\"i|¢Yڑ\rl@a[Pp\u001ePYץNeRsߟ·\u001e:P{QaTԜ;UHc*ԺqMLjXx\u001aF\u0016IV\u0016\u001e긙Iu;\u000b\u0019긡<Ȭk$^W&5.(eP\":yeRs\",u\"T;_Y֍)%\u001a\u0014ӹٺe)mhcLL떧2ok*νleZ2βs\u001a;ӹә2kL3g8=\u001f)ѲH-7\u001f:SymL!͖3%VqΔp^mYdNS\u0013s3%n+\u0014r^;r:OgW.r3ǆCΐp~v:78Cmܥ]\f\u0001yQ^9\u0019c_/\u0012g6!<ҾpP(\f\u00192c\u000b0f6`\u0010i\u001e[\u001d!<v\tNoL)L\u00192c0f\b5\u001dÎrRg93_Hݼɛכw'\u001aĩRG\u0001`9Q>h\u001c!\u00120Y#P|C!h\u001f\u0012h\u0003킆j \"$y\"\u001c6\u000fgl'\u0005O\u0019\u0010\u0000Vr,'~\fR\u0006H^8#\u0014B\nRr:\u000b\u0000}\u0005\u001cڡ䢈\u0006&KEMP\u0014QVIFK%6\u001b\t}Bshr!\u0002\u0015\u001d22}\u001aƽ\u0001\u0007D\u0004ɓiO[9.fGKG1\u001e\f#ڲX9\"ÌU䚂\u0007\u0010\n{qa\u0007\u0017r}\u0011\td\u0012\u0006xI\u0000\u001b1ϓ|R\u0001S 2\u001e9UI$?L9-\u000e>5TP\u0015t\u000f=XtQIN\u0015*4\t/\u00074\u0015<ҷ$r\u0002r\u000br\u0011W$3edFtE$E@RיJC\nDNt\u0002I-t\nDwW\u0015;MRs;\u0003{\"gV0Q7\u0015ԉ̞Lw*|\"}_u\u0000/]X\u0019+Jѵ@0u\u001c\u0017Gt`O𝦪utW:\u001d\u0001<4=\u0017-K\tLg0y\u0015c`WOjs\f.?\u0012\t\u001dUQFFRO,\u0017Hjfu\u0002?\f,w9ljc\u001aOְl\fnP]׭e5r\f\\\f\\<&\u000bP=l8XI4\fbY]%)\u001dqN='ʖUVIo\u001d\u0013: *ym\u001a|k\u001a\u0014'xX~-OO\u0011n\u00152QǓCկ-jQliD\u0004bc\u001dFJq41)\u000bDFNe\u0014HN'J\u0019)Lb)\u000f\u001bnv\u0013Bit2*\u001c*-5J:W=Z;\u001dO)5`WUl*2A=ꫡ#eAg\n\u0001vWk\u001c\u0005k7;ylh$}TӺ!E\u0013!*݈n5G2n:pXw\u000eÊx4\u0004i<9@錄sz~\u0007Hִrh|6u*%=l^AU2\f24^\u0001􃩳~{\u0016LGnsR;\\ߡ\u001fόgHd\u0011= \u000f72UiyB2\u0004_YZJ\u0012\u0005\u001fO2(D[t_;\u001atC\n\u000bӺt8\u0000\u001bz\bI!r\u0015\tژ+\u0004\fti\u001d\u001a'y\u0004|x\ti\u0016Qm,E\b_\r\u0004W^F\u0006 iRy\u0017\u0019'aE3VL\u00016K\f@Aޅ*F$w@VU%;PrR9\u0010\\βg\u0010JG7־\u0015׎|+噲%gKn\f\f%OVa\u0010g\"g?\u0001\u00029N֊)\u0001YAZ2\\k\f$:}2y9^$]#ҭ+n=O\u000bN6\b\\ɩ>Y߁8rR!I(\\g)YI8iLH*\u0011D\u0004}\u001fuFQ+.,E\u0007m2\bZE4\\\u000foY)B[\u000bDU.՞\u0012\u001d.`K&_yu$\u001b>Pkc\b`xhbz:\\ZU=貞@f<-?[bzn\u0018T\u0013,\u0001\u0002&\u000bNYi\u001c84٠\u0017\"[\u0012<_\u0007MzȄ:&pǡjQ\tH\n\u0006O8\u0015R\u000b6\u0001\u0011':Anv`\\u77=uuuL]4Y\u0017Բc0o(\u0000?;\f\u0012ԢDC\u001fȱ2\u001e\u001ceg!d\u0005XN\u001cChg(\"[\u001c\u0002g\u0005\u0014\u0018\u0000x\u0004\u0005Q:\u000b\u0003=T\u0019V\u0016\u0005\"V9G\u0017K\n<D\u0004T\u0012\"\u0013QocHeS\u0010i,:\u0015\f\u0005b%sS֑AYA\bc\u001b\u0014\u0003t1\u0011T\u0003I gC\b\u0018\r\r\u0003-|\u000emYh^R/\u0013qh0r&S\u001a41%dS\u000e,6&Qe\u001dc~,\u000e\u0003+z2$˖\u000e\u0007/\u0015rFɺy@#6\u0006\u0018\n\t(\u0013%\u0004^\u001cq@|M\u0007ɋ\u001d4p|yE\u001cG\u001d\u0010\"\u0010a(R,B\u0001,>@6\u0013$\u0019<\u0003Y9w\u001a\u0000B\u0016AWR\u0011T\u0000-A}1\u0014Y\nwݔb)\u0007\u001d`\u0011UBsE\u0007\u0015wXn\u0012 \u0006!Mh9C\u0004& \b\r\u0017<4\u0010\u0002\bFb\fJ#R,+\u0017\u0015I;>inGj\u001e\u001dO\u000ewzt·bY\u001cc\u0000\u0004\u001f\u0002J\"jÃ HmZ;{tmFwN\u0005A\u000b+\"~\u0000c<ڊ\u0001O~\bՑMity*\u0017\u001c\u0018ϩj;'6ȫ\t\u001an)71k{R49Մ\r\r7S\u00068Kh\u0017#X^_.i\u001e\u000fyBXR$V\u001cxl\t3D\u000b\u0014\u00041a\u0004p; V;,sM\u001au:\b\u0017!\u001c\" Sr\u0012\u001bzh9j/<MSp\u0013`8\u0007/z0\u0019OW:xHI\u0005%\u000b0exA\u000eaӢ 2\u0002`B\u0016xҿ+!\u0006&B$h\u0002`ȻD:p!\u0010T*\u0004'\u0016H\u001bP\u0005R\\y_\u0015\u0014\u0012\u0018$e$\u001b\u0016\f\u000bDv\u0010IUQR\u0001ED\u001dx::\r:\u0018u<{,\u0007^\u0014N\u0003癦\u0019V\u00148UIU\u0012\u0014<4\u0010\u0018\f~]ϡG{\u0018\u0019HR\u0003\u0003\u0002P\u001fcyXob\\\u0010>\"A'\u0004TX>3[F\u0010 Pr+\u0007\"hN\t\u000eFG{Ce^<#\u0013\u0002\u001cAhl\n\u0010\u0010X\u000e\u0018\u0015\u001ck<\fO\u0017:7A2{X\u001c`{+m\u000f6D2/hkM\u0014_\rbD\u0004/\u0011<8$ǃx\u0018ƥ \n\u0011|\n)\u0012YE%\u001bNdfi44J6 \u0013<\u000f\tP\u0010B\u0004fI\u0011$9A\u0016r=I\u0011XU\u001a\"2'\u0004qǃrT\r~¦3\"$D`\u0002K&\u0012\u0011Ӏ!H\u0006P%KT\t\u0004Q5\u001a\nuU\u001e \u001f^+2/\\\u0001\n\rkMUNv\u0000zX7\u0001cB\u0011kP/5J^iBQ\n\u0014BVAds\u0019\u0000-\u0013X\u0018Xej>D\u0007\u0012kAN\u00119Whж\t%^9\b+HI|K)&EAYPom$Z_\u001ct\u0004D)I\u0014\fb,YK9\u0001@sfS$J(\u001fhvEʵ\u0018Xh8jXg99{HV&)x\u001aH\u001cQٟ V@Lr͑\u0019GB8\"Qj 3?CkyYID|\u0018\u000e\u001ac\u0003</U\u0012tOQIjC:vcE^l\"g\u000fJ;XJ+a\u0007tZz=U%(RK+VjO\u001b\u000ePX<D-^j\u0004jimm뱕#\u0001Ǐ\u0007_NKMx{\u0017YvgTxv\f\u001dm#gsCn!4KNz /\u001f\u0000/.\"Z&HƂ$_3rZF\u0010ڔkŪ\r`NIZ0Vȇ,$ro3!\u0010/4\\\u001dIZr&\u001b_\bǡ/ZW9n\u0013c\brP\u0019\u0002+\u001a#^~S3ϟ?51\u001auڐ\u0018ќek3A\u0007ϑ\u0006NX2ݓ\u0007\u000eb\u0014)ua\u000eʱ6<ɫy\u001f>~\u0003D!24\u0007\u0011#\u000bD)\u000e\b\u0002 \u0006\u000589n \u0011u\fG\u0007 !\u0000԰rЈrd\u0019@h̪T\u001ciy@\u0016P(6ˣԒ\u001dKcYHB=uh\t\u0002!b_\\B.A]d$\\ېki4&{U$~D\u0006d%­JEÍL\u00109J\u0004}|L\u000b$dV\u0003hD+\u0013aYPy\u001d\u001d\u0002\u0011\u00154+\u001eA\\Yԋfy\b\nGΖ\u0004:Lcys+zJh\u0019g\u0011akHcX\u001d\u0018S$=D\u0013\u0012=8H\n\u0019894\u0007\u0014:\u0019_\rD~*c-ߊ\"u)\u0018=tkiyuz8\u001e\u0013IZ+lvU,\u001cE^5͍)qVڔ[\u0012-q\u001d\u001dk\u0016,AS]\u0016ɼ6u@ɱp\u0002DK\u000e?u4U誈C([67KcV2\u0012.v%©{|NKDY,G:\u000e\"vFZJAWgvi\u0018\u0000rkm\u001eטX\u001c\u001df\u001f|qe\u0004YK֖&a\"leNS9L)3[.%T$D^8Ϊ\u000fT8u*'z־Q2赝I\u0006;\u001bWOy$='Ys\u0003g#\tLX+\tՙLδ4:Q\u0000ȼ^kT9{Mu<϶<0i|8O\u001eSQ~6o\u0017\u001d5o\\\u001d\u0014\u0019B`riJ>!\u0006jE\u00187-h+$ƔښõScfG<\u0004\u0005\u0011qe&\u0018&^\u001f/h*\"mrϭ\u0018dD`IY*qu\rUR\u001aneԐL̏\u0018!?*JQU]\u0018\u0012H]\u0002~=UQ\u0006%7nb::lu.L[\u0005\f'SY,K[\u0018*ݐĻ\rVL6vЉ5H\"\u0003K$\u001d\u000bD\u000b4Wmm2\t&\"am\u001c \u00127 -.t*($sD^\t\u0004I\u0012\u001d\fñ!\u0011\n\u000fa9G\u0010\u000e\u0010\u000fg*q\u0011/(75b\"g&@<rF7\u0018{V]\u000b4\u0016I}yY\u001d*d\nLZ\u0018k?*8\u0017푖ah*Z9\u001aK*LZHHH#\u000b1l\u0015\u0011H\u0015㘌\u001a R뤆\u0006p+S돩hI5C;11\u0014\u000bɗcOi&Ըܨ\u0015XΫc\u000fO>Vf$P4+P,C㱂j>9*Ly^oƦX^)$R\"\u000fc$g=G}\u001f\f䠄`2&\u0019\f\u00181`\t;ouK$ݝٝsyl]]9\u0014S()``0<\fC \u000bN\b\nA)\u0006o<\u0010L\\C',89_jOU\u0014[]Vק:u$ѿޔE(bmcpt,X\u0007\u0018U^1^\u001bOQI]\u001b\u0001w0w\u0012)װ?3\u000fcMQE-C೹\bp;)SyT\u0016xV fɟ8.h[?jny%\"_|D\n?o4`,(\u0016D(9\u000en\u0006]?$)h!i\"y*@r4O-B,\u0017\u0012V#rQ\u001cHk\u000b \u0004 q3\u001bHv&J\u0019\u0004\r]\u0016I§TQ&)@(\u0019B\b&\b\b\" \b_:\u0002\u001f \u001eV\u0013+/Kbe9@e\u000f2!X@$P+3]\u0019%+#\u0013\t߈K.\u0014d!\u00016\u0006NGtɠB$\u000bO91>,c{]A3MV\u00115&:\u0012!\u000e\u001a\u0002߳\u0004\u000fxDhBch/QD\u0006 \u0019\u001c\u0011\u0001ݿ$L\r4`3\b~3/%M#f-\bd\u001aK^\u0015vq\u0010\u0000\u001aG0+z/6\u0000\u0017:C,\u001dYt\u001eH\u0010.\u0000jK\u0004:k\u0018%\t\u001fJ\n'E\u0005-\u001a\u0019&3*7Lg\fX<\u00141L\u0010\u001blPt\bM0yD6;:\u000b\u001e\u0018?,'W9PP\u001e\t4R8_-tw\rSB\u0015j1\u001b]GSkF,l2uNGvW#gԎi\u0014K}+!LVu\u0016{@?5,\u00030 *\u0007 B|^+\u001f'A\u001aKg\u0011h*=X\u0002+\u001aj\u0003\u0018\u0019ec>t\\Q\u0003z\u000f)fslY\u00021t\u0000M}'O0('qd8]퐷_\u0003ܪV`Y뫽j$7\u0018\t?\u000f\"\u0000|\u0016\u0007{\r\\Qgy!>$<\u0001Eǝ\u0014H\u00002Pb\u001d\u000f\u001cjr\u0010;Ĉm_c@\u0010\u0011b-*=\u0016EfY\u001dͦ\u0019\u0003:\u0014][ >_\f\u001bH7\u000b?\ta-%x\u0001,\u0015b2_2X\\\u0016-L>=\u0007\u001dsFi\u001dsF\u0010G\u000e:\u0007u\u0015Ӷ)t\u0013ѿkW+i(V\u000b?\u001d-|)Z,Nfpļ#!\u0003łɮ\u001f\u001ac\u0016g7zPӭ\u0003vs\bѦI^I\u0007N2bK1egRF';4m(:W\u0002R{oYM6ι\u000b-ݞeN\u000e9Xw\u000e˟\u0010s\b\u0002[\u0005I,t2\u0016\u0019$h]+h\u0015\n1\b,dy\u001e\u0014n@'L]{C\u0001*\u001c\u0003\u0011\u000eBht\u0019T(g.\u001f\u0010-Hn\u0007:/E03\t?\u0015-QlȺ_)\r}h\u001fm~QH?vykةEN9ߘI|&\u001f9\u000b鯢*\u0007F\tC]L\u0007@XjY$ŅQs\u0007\u0017\"\u001fgk4\fv\\\u0011\u0003AJЏ.gA?\u001e%C\u0014\u001f\f\u0006B<\u0003\u000fめ\u0010!C!T#:\u000e\u001e\u0006Sd`)T\u0015E\u00148x,AI{\u0017or`$H\b\u001c\f5H\u001c\nr4\u0010㾋\u001dP\u000e1!TB\u0000^%\tuVA;Dn`=\u0000a\u0014C9\\B\u000eq\u000e%\u0007\u001cd\u001d;dC<?ȉe<`y C\fK#ߕP0HTb(F8\u0015\r\u0011h|>\"\u0017T \\\u001c\u001baHQrQ&\u0019eҪ\u0012\u0014\u000f+\u0011DE[Mq,\"<\u000b\u0012!a\u0014\u0001`0T\b\u0013\u001a;ZF\u0018\u0012$GRQ/9\u0018\u0017\u0015qѬ<9t\u000f\u0001B0\u0002\f\u0004;$\u0015sZH~^Y\u0016K\u001b\u000f\u00103\u0010b \b\u0004zY\u001a?A`\u001c\u001d\u0000\u00025F!\u001aV\u0005H5Cʥ\u00060\u0002+FBPB3!\u0003\u0000\u0010Q!ǲ$\u000fs\u00009lCbBq^\t>Sނ\b!\u0007\u0011\nP1b2\u001a%\u001c0AC(DG\bP@fB!I\u0014#\u0011Ƒ\u0015ü=d\nQ\u0001ɀ&\u0014\fi\\!\u000fZ\u0003 \t\t\u001d<7T\u001f0ɏbaA\u0010,ͳ \u0018\u0018P\u0004YBbG\u0010\u001cwQ.D\t\u001f<8-;XvJ7\u001f\t\u0010\b<B\u0001K\u0000\u000b\u0000I\u0012fAr\u0004#\u0010@ԋ'x2\u0018dH\")U\u0011\u0014YΑ\u0011(\u0015]\u0003\tb\u000b0\u000e(\u0000\u0014\b\u0005?-\b\u001aXS\t \rgh 4̋G0\fR Ƞ,\u0013C\u00110?G\u000b\u0001\u001b0\u000bO(H$P\u0014i2\u0005\u000b\u0018K\u001c+C@<@\"\u0014΢3&(q\u0010\"n(t-@wBSbY\u0014v\f\t\u0003?ĻtU\u0004\u000b;I\u0000#\r K\t`( \u0018C$E\u0013B,\u0018\u0014h\u000b\"\u0003@n!\u0001,[\u0004\u000e\u000f\u001f`\r\u0010\"UA\u00069I{kO\u0004 ~\u0010\u0006@H1 \u0006xfĢ`@:\u0002``wGZi\u0007E\u00194a($\u001a\u0019J?\u000eRf O5)\u001cx\u001e\u0012\u000fA\u0000aT3`4HOcQO*+]\u0013^Ak\u001a\\C\u0001\u000b#c0\u001d\u0006QG )a\u0003\u0001-!\u000f*\u000f(Vc'\u0005\u0010D\u000f%I\u0007$\nL\nt\u0019|PA|\u0005L\u0014\u000eՂ^( \b/eA\u0016\u0002\f\tlKcg4\u0012뭪v\u0017 4\u0001 \ra@\u0002<0irl\u0012\f1A3+Ѷ\u0001(%T)\u000e\u0018\t\t\u000608\u001340J>Pr\u0017~\u0002\u0018qN\u00062\u0005\u001c\u0001\t\f'\f$\u0001SC \u001c\u0013v%\nŰ\u0007\fe\u0011\b\nH\u0013&\f2\u00150\n$>_\u001b*P&t\u001c@ \u0017JůE\"*\u0015%\u0011^n\u001c<\u0018*\u0005JF\buj\u0019*\u0007'+\n,\u0015\u0006\"\"%B'|PnM0a#BP0\u00023#;\u000e\u001cG:b\u0005!\u001d&T\u0013hD\naQ([u\u001e\u001end\u0019:\u0002|jT2* L\u001bd0\u00036\n\"\u0019^8\u0013\u0015ɍ\u0006,l\u001c\b\u0001Y id\n\b\u0002\u000e4|Q4j\u0018#3\u0010TY\r#$\u001f>ڰ@h.Zj\ty`Щ\u0004\r\f\"\u00191GH60\u000e\u0004cBh\u0005T\u0004%\u0019L!BX\u0003\u0017\b5\u0002\u0006;*\u0018ѭ`TX\b\u0007\u0018\u000e4\u0014W\u0018W\ba\f\u00136(\u001c\u0016\u0016\u000f\r0Ƀ\u000e\u000b\t\f\u0007\u0012^\u0018`F \u001e\tH6H\n\u0005T3X!P\u0018l@M\u0016k '\u0015i3\u0003\n-\b\tl$n\u0007fe\u0001R\u0019\fpx;-hetxO\u0010ҷ\"\r=D\t\u000b[!J\u001a\u0016V4\b\u0015x\u0001\u0002V\f\u001e@!*ѱ:\u0017\u001a#\u0015X( YM>pVԆ:Ʊ$\u00015(@2`CrH9N\u0016\u0000/E\u001d`63i7\\\u0011\u00118d\u001bHb\u0007\u0002L2\u0011\u001c8u\n\u0001!\u001c\b\u001b@YjHX}\u0018X\u001f.6}=5\u0007HpMɣ\u0014(L\"0p\b] B@Bh\u0006˧\u0004\u000bL\u0019\u0012\u0006=V\u0018(\u0000B\u001dK^!QU`%\f\u000bS\u0018-0\u0017s]q{&ĩd1\u001cWesEG&G\u0014UVѸoK.\u001c\t.j<\u0004nGŴ?䭅.Nd\u0012}nĶ;Cՙ[u~'zW%QLtGƀN\u0005G\t#l\b1l(#XN(\u001e  7\u0003\r?\u0000\u001dt\u0012rȓVL=()k2\u0019\u001a\u001d[\u0004i\u00157\u001483\u0019hah\u0001L\u0013F\u0002h`$\u0012\\ܤ jA\u001e\u0002\u000f\u0006A\u0007(\u000e\u0015\u0004/\u0005Ðp\\\u0010!\bv\u0002\u001dxK3VXt\u00122x\u0015\u0005\u0004YSOaqX\u0010\u0015'\u0001Љ.$\u00179\u000e<\u001a\u0005(Ra\u0011Z;P\u001d 1p\u001b\u0001\u0004\f\u0003\u0014\u0014\u0017O@?\nt\u0015hkp\u0011D\u0011v@u,\u0002\u0001tU~\u0002\bg8C\bp<zǟFacS\u0012\u0010*\u000f`N6Gf2ID@\u0006\u001b\u0010+v\rG,\u001fvOi\u0018\u0006i\n\\\u0011D\u0001SP\u0010!A{\u0007Y\u0002\u0007S\u0013\u0003\u001a\\:`|0OvC\u0004\u0019Iw)\u0007xB\u000e\by`\u00011\u0010&\u0002@\u0005\u0019P\u0014/B;N#\u0018 \u000b\u0005~J1\u0010\u0016Ca`'9I\u001b␧͉\rQ!tb\u0010|\u0018='{Ǆ1K$()P=x\u001aǋg N,n\rgt:˭\u0016ۥ$\u001c  \nY`U\u0007\u0006Ǉ\u0003_\u000e\"Z!$\t!$J\u00076Ko\"\u0005Ǔh8ھ\u000e<\u0011J5=\tn*9\u001a$c4$\u000eQl\u001f\u0004\f\bBk'A0=\u0016H\u000f\u0007B\f[z!XhD8,a\f$\u0015)lb*w/\u0014(LZ>%oaB \u001a\u0014e\u0005\rFq\u001aE*E@\u0002wX(,H8I \u0003\u0001h\u0006B0`\b\u0013\u0002_\u0014C0/ko>垳\u001djRv\u0005ri(\\T\u0005\n\u001ay'8kF K~޴\u00009?4f\u0017atoJ\u0006$VN{mIu[>DH\u0000\u0004H\u000f`NM\u0017дk\fo\u001dOU:@}\u0001\u0018j57g\n_]\u001f-K\u0002\u000f0ڮ\u0001\u0018gYb%lz;]Y\u0003\u0014s6il0P.ځ\u0003\u0004%5\u0007Χ2\ft;;\r֋Vܴg(ȳ}\u0017fU\u001c(\u001a +3\u0018.ڤT{\u0001C:+\u000f֣Zg\rd5\u0003o\"\u0004hp\u001ch_1Rg\u000f`K\u0003\u0001Fr:\u0018KAR@\n`/e \u0002k^\u0007(x\u0016\"Q\u001d꿺EAϜtư(*(bSyW\u0002\u0000l]\u0000!ѻE5Q\u0013\u001f@\u000fL\n\u0019`X\u0004X\u0018\r\u001b/Q(G\u0013'|IJ\u0010r頷\u0019[rG6?cLo imN\n\n-h\r#Պ^7\u0016KKat@>pO\u001d`tYQwiO\u0007U\u001f\u00045olF:h=v=xG$߮ރ\u0007\u000f]_.6\u0000*/;\u0014@2b`^\u000e0V~\u001bq~\"DhM\u00026;nF\u0006NbJJ\u0010\u0016,;dk\u001aLv?\u0004Jk,\u00034qv|4lG'W3\u00010*\u0016Bl!!\u000fFcF\u001fRs<@\nf\u0003ff\u0016xlgtюf;t\"\b\u0019g-\u001b\u00064'|\u0012\u000e\u0006YWY\u001e\u000b쎧/)Z\"%кm\u0011\u001c\bm\u0013shE48=v\f\rV\u0003eK!#]\u0002]Qu\u0018\u0004(\u000ev\u0018`іQ5>53\u000e\u0007\u0001S\b^\u0000;\u0001)m\u0007Yi`&\u0004\u001dYT\u0003ɧ\u00181\u00190FdI2~\u0004d\f|N;kALG\u0016\u0002FX\u0003Q!i}7+Ԧ\u0000\b\u001aі\u0016 ڑ\\գ^k\u0000;Xӊ`&\u0016\u001b$64!u`\u0000ڊ5\u0000x&׭\u0007\u0002{\u0014^\u00052\\.V\u001b4\u001a\u0018l-\u0011\u0018\u0016(dpt@\b)\u0010\u0005p7fzhv\bhCޅA`\u001a.GK\u0016a~\u001f>-}9\\S:`?y\u0001AְFu;A2HBH ;^Y\tt<-=<[$\n\u0017%'+~\u0003\u00192\u001d7`M!ZB\u0001Ɗ$`\fy˕<|%oJ\u0005!\u0003A)uJ\u000b\u000f\u000bc]cZiO7}&aA;_p77#d\u001f]]bpw*;|d}t\u00036o\u0007럳\u001c\u001a`iVvWC\n\u000fA_͖ڽF?6ro:\"өɴ\u0000~i8&Tu>L4)@i} &%oD\u0017s+&:]&@21]ӟ$#4F\u001e#\u0014gY.\u0014¿\u0017\u000bퟃ<{5X9\u0002/%𺃬$\u0014@\u0006AcR\u001d|SG\u000ek<]\u001eO@\u0001I{=b0\u000eAǮtu)Shϓ$x\u0017A&Dq9L$9\b\u0014珯H}H\u001e&OO4\u0010KSaGGq\u001f~|b?,8Ԃޢ)\u001e~7 / \u000es\u0018\u001c\u0007\u0014\r6>Xb?0\u0018ۃ8)j2~ho*Yg:Q'\u00049=bs;~/~ilYbY\fB\u0006v.:m\u001e\u001fV\u0006߱\u001d!Jp\u000e,Lwh4\u0001=Z,;\n>m\u001dYr|Gchl\u0016:lbg\u0002z\u001cu\t\u0015Ү9w%j9:Sq3|ћ,\u001bhg}\bzn\u001b\"ՙY\u0015XuY݅_QY?t\u0014{\u0011DzI *>8)D\u0014CRg@}AT&!K0/F\u0012++<ȳL~:03\u0013NNw\t\u0018oOK\u0014gH֜\"W\u001cLp\u000eF\\Z\u0012eiA\rj4 \u0000o5mW\u0001p!LX3\u0017trOLUЍNڸ_\u0006\u0005a\u0018wKUg<֒\u0014Zg(jm\u001aaF2\u001e-\u001eB}\u0003Lr+쐙n';ڍ\u0018@\u000288ی\u0006g}!l=ؠ?Fٺ\u0000XLv\u0019?c|0\u00175\u0012~*;}=[N\f1\u0011hwtX\u0001{\u0006ag]lA;gH<ҁ'\u0011\u001a^~\u001es\u001b\u0001\u001cP-\u0012l;rZK\u0005]V㥆Bm~\u001ad>QYxA\u0017촞AkT?$i(\rͯ!h;;}ǆ,1@:8\u00011T*xlN\r$e0\u001a75 \u0000@4\u0010\fk\u0011S\u001b\fHJ4T#X{\u0018\b*\u0015\"bY\u001cGtL9%\u0002`-\rbF\u001apA}.\u0003hc!O\u00187_\n`\u0019)<a\b\u0005ؕ8]s%ev\u0005.fӠLWGI\u0012b51LenRl@|\u0004FOFV\u0014\u00154R\u0019\u0018Zb\u0003~\u001aY];?#[-M`o)1HR[C\u0018T)\"\u000f&zT \u0010I8>߇u\u001e\u000fǃy4\u00022d%\u000e^)\u000bc\\ȕ6J~5\u0018%\u0018jb\u001c1\u0003өawh縍/\u0011Tg)cSIG(fل2\u0012Bθ\u0003\u0002\u0007]l@\u0014z(v\u0004tV ԾaȦmP\u0006\u0018c.\u0000\u001f\b\u001d?\u0016\u0005Qa\u001c\r),g\u0015ᕼxYLBLfv}\u0007\u0007x{J\u0018'gBLW\u00175wv!\u001cP0=@Xosي:\"{oW|*7\u001bBu:R}]gX[8~pQ=.ʡ\u000bal\u0004N߽y<w/u|]\u0002\u0000&\u001e)YVVM\u0014d\u00068\u001a~\u0001R\u0001\u0000rE{m\u001f/IM\u00165,f䉱m6͜\u001fSG\u000bD9\u000fs7ۅ_◓K<<i6\u0000\u0006+\u0006,\u001e4>\u000f\u000fMj=\n=\u0019r`\u0002~%\u000b}'>\\\u0018}\u00050ԈiG.\u0013\u0017ݓy)]65غc͂m\u0014:\u0013ؓ\u0019F\u0002h\bt-<~-Ӌ+oy&Ju'+\u001e)h\u0000F/ļyH=G\u001c\u0017X\u000fĪ'=0ﲗ.91Z4\u000fS\u000e,2Y:}ArUg\u001c\u001eJ\u0017Tx :38bm1.x\\6Oak{\u00170\u0018붡eyb[\u001c*XH~ _ltsiZ<+\u0004E/^q/\t!<ĲoLQhfބި\u0007*\u000f\u0014|OxbJ_GŎZH\u0015~_%\u0019܁V~\b/\u0010HgZ\r\u0018,hI\u0018\\1#K4\u001f0Pt:$۽NcƨIT{D\u0011\t$\u0007\u001b|ܿ]mX\u0012WA\u0013Կ-\"=g\u0018o\"-aP\u0000&&=$s_W\u001d\u0013.*\u0015\u000b+z\u000bUMߡJX\\\u0015x[g6=%D!\u0018\u001f9b,t\u0014cx&\u001a\u0010Ք~+\u000bz@2?NQӾtFl1%.j%\u0006hd?\u0012\u0001#{trv4w{\"-\u000f#J\u0001aUCY1QyMa!Dn?\u001e$X\\rF[R\u0014}L^7lQ \u0000\fcPI&\u0017\u0003u{\rM\fíxzw[Z<07*D05^Y,:}OUe_K\f\u0019tͅ\u0016\u001e\u000b; hx{Qr6,Q+\u00033+t0t\\Fy\u001eo6l&t{\u000f`.=Dyeƻv6|\u000f\u000b3ɧ}\u0007\u00013ʴ#i\u00042HԦKm\u001aDj#?Q|RD5h\u001b*}6H\nqÄU\u0012jle\u0019ቀ\u0000\u000f]\u001d\t\u0006\u0013}\u0006[d^\u0014\u0010y\u0002\u0016?Ģ,&<5\u001e,I#],^\u000bųywυr\"9-\u0010~^O\u0012r7\u0001z]׻\u0004mg(k̥Jq[\f(\u0012n:SWg1\u0000Hh?HBO^n(|\u000f!%\u0012,\u0017kTqAM.Fѓ\u001eV\u0012:\u0012 >_Dp\u00134*\u001e\u0013\u001e\u0004\rt\u0010\u0006f*\u0019\r\u000b!Epo\u0012\u0018܇\u001aKhZP;.J\"-ȕM1\u001a{v:F\u001e̥|6\n\fbV\u0002\u0016C\bK\u001cO\u0004J('j\u000f:'\r\u0002(\u00174Ex\"\f\u001a\u0000US4M0A\u001bqi?/^Ԕ+F\u0017_Qav\u0018JF+ZxU,٣1\u001e-ae\u001fWᤤo[\u0015H\f(\u001b$ō\u00112\u0012\u001a,\u0013\u000f\u0017#\u0002b\\~͢[6\bCXG$p<%\r<z\u001a15\u0011vGYcC\u0013`?Wm ?hQ\u0011y6|/Y\\G,γq\u0000E\rh\t:YŲ̶7\rw<BT-Lz|2\u001bCf)(y;Do\u0010\u001a\u001eF\u0014\u0003lBדE\u001eK\u0004=9/`/A9%\u000fv\u001f\u0000LhQ ;dūOF\u000e&\u001e$j]2R|;稹$Lj|&*d\u0015[65S\u0006Td)*@Hﮖ\u000bta~ \u0011~'[dCc֕J\tKl\u0012TZ]\u000bc\u0002\u001c;\u0002qw/bzx\u0007'03)\u0018)등*\u0001\u0018$\u0011*'*G\u001apv\u000e\u00048_$Ip\u0017+Dbo]\u0007\u0007\u000ebwJpK8R#C*0Ez)QpU&@-#&_5^\u0002JP$оH\u001c@\u0012\u001fT\u0003o \u001b*?\u0019\u0014S0'֎\u00037\u0004=C\u0011T)U>Hi\u001dΓ\u0003MS~F`E\"\u000bB>/.e3\u001buB;\u0012\u0007B\\THV0ٍ\u0018\b>\\$nol߽h~a'ɶ[%JR\tq&5z=\\\u0017?,=`W\u0012QT59\u0016>`@)t\rB\u0014\u0017AN\u0006\u0006-\u001aP7r&^o=W\u000eBG\u000fVp1G\u0016eD=\u0017!R\u0003DxC\u0002ɴzW\u0005\u0011\u000b`^;Gci/n<r˂jTpj\fՏD\u0000\u0010S\"\u001ca8׾V:P<m]\f7mXޛI6\u0015AHcN&(6aOwA(\u001bF\u001d\u0011tUF#=\u000f4\u0011\r[q\u001eam_ᛏ^g5Xkv\u0012@b\u000eG;:\u0006\rt-.\u0015\r\"O%g\u0018Rk\nsIV#xP$C\u0004Ş>Cps\u001c\u0019^w+A~\u000b.>Eqh/\u000f5\\Ŧ\u0013M\u000f1\u001e,+%lc\u0012cCϨtQJ\u0000wui\u0013F\u0001wQ&SWTV\u0018|t:pL4Jqďpo\u0013Z%<~\r\ra[n62GO\u0000M\rf]\u001d\u0019\u0005P\fV\u0012\r\u0017hPw'^\u0019,3\u001a矾sTn)OI}U.\u001a/9\u0011C #\u001b\u000bW\u001e%O\u001eNNl\u0006rۅ[\u0015n\u0012M\u001e}itdS\u0003vh;dr\u001a\b9+Shras@Kxw#ڻ\u0002I\u0013F@l8Z^ً\u000e{R7ldw\u001c^dZ`_m\u0016P&mY*ٍh \u000b\u0007r+yb~0\\xO4vK]\t m8X {t_\u0011_fǥ,\u0017\u0016jٶ^\u0019z3\u001f\u001e\u000e[\u001e4tn'\t=SѰ[\u0014$s[\u0012Z\"m\u0004YJmT\u0005lx\u001eE\u0007io#\u000f3\n'L#wyK`IB\t\u000b\u001dK|socoh^M◱%&JN]Ar\u0014̃:8LU\u00148\u0018$\u0003If!g@6@\u00020 m\u0003\u000f⑗\b!MP$\u000fd_\u00065Z3ޫ9AW&4\u0016Dm\u0014~C\u0010Gz\u0017{|Vtn1T\u0015 \u0012@\u001bT9],^\u0006\u0004\u001b\u0019r̆\u00135nU[NP\u0004\u0000\u001b&bIb\u0019L;Ӌ\u0003Q4\u0000;/5$Xbފ\u0002]*Nn\u000f8iϻYK{>) \r*$v;]\u00035WB'!ug\t~|c˦zbɀi\rt򑑘R7\u001b\tnK%uwiA9\u0014d~V\u0019l\u0004Le\u000b)\u001a_\u0017\u00018\u000f^JRaC\u000fQ#ǺX*nkeĲN!\u0003Ox\u0007\u0001\u0017sϹK\bf5ޔ/@\u0002slNlCr_\u0019]ʈ7z\u0017Y˂u\\\u0011=Ȁ5}<p'<VqEe#^\u001fR\\/ì+Iن^L\u0013r(8\u0014k}Oά\u000f\u0001\u0015^~S7\u0018LpJ5QQ\n&Jg5\f8eo\u000b^*/Q+Ulk34B\"t\u0017׾#\u001aK&g\u001eLg)Mf\\rey\u0000d\fx0W`mXk'cڷA&\u0015\u0002\\&3g\bĩ?3M~|T|v.8Y\u0017v\u0012\f[L=oف.U\re܊\u0016GMܺ۠3{3R.\u000b\r]b7\u001b0[zkw}{fL\u001b \u00170qAL@W;Cnh=\u0007`ƯwX\u000bzhGɣ^\u001b5H`:\tXd\u0018Hr\rC\u0000C/߹]t\u001e\\ZE\u0013<7\u0006p\t9\u0015ѷ<x_ŗ;\u0006\r\u001eE\u00146;\n:\u001b\u00007{\f53F~\u000f*I\u0017b;W܂\u0012%\u0003e?3ƗzPF\u0013Yk^3Iǁ\u001ewIg\u0006a>\u000fi&uz\u0016N\"[Q$%#x\u000ed\u0004޼\u00053Kg2hԆ+9\\DE;\bїA\u0004(vzkM\u0006]Yg2)6hDLK\u001676\u001dk㲔$--5B\u0018_\biOw!ݽ\u001fԀb׹\r\u000b=\u001b`@bd1\nܗ+0@`\u0017?xL*u d\u00007{A:y\u0005ːAh$05DąU\u001b#J\u001fŃ\u0003MoQ'C(mD\u0015H\u0000\u0014825T\u001b<-Dmo3;FfRʎR\u0003\u0014wds:RF*M-p,K(P8۷`\u001bEzj\u0005-(\u0007=ݜgz]o\u001f%+jGFܥ\"F#m\u0011\u000f:EbF'B;\u0013x.\r2B@}\u001a\u000fz\u0003Q\u0003#/a\n+5JK)oM-نX|h\u0015\f\u001a,$Sc˓\u0003L\u00139VAKM03p͡p\u0005IK2Ϡaɟabblj!ٶ<bt:P#*\u000f˶\u0012\u001dXV-bgk78[~#Ty؎06\u000fX\u000e,X/\u001f,e*H\u00030\u0016*͓\n\t\u0014~\u001fP.\u0019\u001f\u0011GA0|t/\u000e\u00073\u0017П\u0011g\u000eEП\u0015q\u0017F-_Ve\"T\u0018o(\u0013\tß\u001fnZ\u0003\u0006}\u0001\u0011@\u0006A\u001aohZ}?П[Ӊ~\u000f>F\u0015S\r\u000fcc3\u0001\u001f #/5{\tOt2&\u001al&\u0000ΗL<tqKba|X\nx\u00126ˈJ2>\n\u0013oM\u001f*~@g&9\u000f^hwCq\tݓG\nc\"\\{!\u001c\u0017`+<waD6פ\u0001sh\u0010|'sɇZֿ'3\u0001\u001bGzұI4c_ܻsg-9\tχqRFQR\u0015Dog\u0019\n\tݼo|e=y\u001dd%\u0012Ť8Oam?\u0002B\u0011\u0014f8\u0010\u0016SfFn\u001c#O\u0003MbS.P\u001cz\u0018nDީS\u0015\u0010-H\u000f\u0010ÓO(\u000bӁ=vpjEW\u0000ɿ F\u0016\u0000vi\u0001\u0018D~2C\rs\trCɘݝr9^XqE\"}\u0016[7X\u001f\u0016K\u0000R\u0016UaFj\u0015\u0017~Z\\7\u0016wwcb\u0017V\u0017|AFX?ؖo\u0001=^\u0010[\u0016%ly7sӵ\\ph\u0005]-08O\u0016W\u0011\u0003|mZ|ϙ\u000fsY\u0002㨅Uo-\u001bXhBoXK~Y^۫#+K(^-|,H\u00128K,VXwK|Nz,ɰ;mI=ږ}unV?%_Y,E\u001aRm,U;v\u0013cK=_f,wZ\u0017ތ\u001dEΉN-om2JѢLĵe\u0016~,*lԵՒlel'mvstg\bo}f%ʝ&3\u0000c\r~\u000bЍi֘si\u001e>Qn;\u0016\u0019k%?+JXk۹nlX\u001f\b91ZuKڝ\u0001a$OYw̶|.!m[7;fmvjds-^H!d\u000bi-4mo-^xo\n\u0015uJIV}el`s9l/jT;+>}P\u000f\u0000cR#ڞx?V\u000eo\u001b\u0013yr7;۟rJk:;/{Zw\u001d=où@z\t۞·|\u0006Nr_X\"[ra)]x\u000e\fo:\u000bv\\\\c\u0017IbXȍnG\u0017buQ\u0007u:ً[b9~;&[>[\u0019\u001a=>N؁=6dnoؽQmk\u0010c>\b>߾Z\u000es\u0006{\u0007|;\"gG`\u001cJ>Ǯ\u001csxݎʎ!qJc3_!iE-Nw<\u001bvF?B\u001bg&\u001bwAF:\u001b9e9M\u0012s,Z]\n<U\u0017W*\\Wk+^Iu_H\\o\u000bK55\u0010\u00184\u0014t_?=nf_ҟkf⾦\u0007[~X\f^i=\u0019<7zPE\u0013v=7b񦧞V~X\u0017rXk\u001c:۶oœ7Ύ}x\u001bκ:oL|ǅ}\t_+N\u000b_3Lޞ[e_\u001bߓ|*Y{wꏏ\bt广SO\u000biZ/\u0003Z\u001b\bm@j{\u001a7t\u001a\u0000r\f\u0006>]L\\\u0012mB\\\u0005;Yڈ{Eto 1\u0007EމSq\u0005h5\"\u001dL-8쒩\u000596q\u000e\u000f\u0015[dT1@ݻ9?sg]f\u0019\u001b\nU.Y_8Qz\u000f1V\u00052MD/9;SxX{\u0019<5}\u000ez&Moq`.\b\u0005*`N\u0004?nuWl|f@mm;uNOι\u0019]}*{-s\u00185[)WZeJ2X&4.?x[%NԠX撿͌.9p~\u001bv\u001fn\u0002*\u0017~\u0018dnDh8]DT.\u001bI\u001dH#R[\u0005Gd!Z\u0016>ƗQ/\t=.?oQC*\u001as]ћΨ\u0017m7ϋe!HǼ*\u0016Mw_b7Ew>~,#\u0012-Kϗ\\nV/WezzWe\u0007*@<юxyage2IНq\"xO[ć3\u0002GuodqIɜ-\\<\u0007߸T*Rͦ\u001avs*7t_ZDzVg\u00028\f]gK\"3v\u001e:\u001b\t`rV6%悾k.A`r/\u0017rZ]\u0013|1u&Lz枾罍b,p>wOTϭ\n-uS\rlB1z)XYyZ\u0017bmAx7%ghP)_X;\u0012ҨQvf96Nʍ1UHF,7\u001e}t`3O7fvH%JP'[L\u001cUjԱUWj{󺹵\fz[\u0017\u0000va]5gJԮ\u000f\f\u0005jB=0sZZq-\u001b\u0016볧\u0011j\\]6ag\u0019vܽ.T\f=wFd\fFfy\u0014+7G˕3\u0000x\u001f޵\u001eC\u0017j\u0018ܳ/\u001f\u00153r>)\u001e<oCD\u001e-1<*]=6,*=õH>_gWgyN]\u001f؋ŏr^\"7mhLW^+sߵwwvIrb۷Ԝ>mz|s\u0015o:jWoZmݭB7\u001b$ӫɧޢYGGk\u0014\u001a}L\u000eHmH_v8\u0019w>Y/,#v\u001e\u0019U\u0003h:Y̳+2\u000b?7%d~^},\to't?e64}ؒ~\u0016/+-\u001dN18y/@D\u0017^οY\u0014bԍ].)b[Vc)\u0000[,w+\u000b\u001frkŐWg+\u0014+|!\u001d1\u000e@辧}Q\"juP\u0015PmJ)jm/øP]b\u0002%JI\u001c\f1L>xh[Q\u001c\b:Hk$zj\u0015!\u001d D\u0000\u0011l\u0003M3(<ծú`lhF(JǢ7\u000e*Y>1=,]&.:\fe1\u001c\u00024\u000b{q\u0019:e堽V\u0019z;*t?\u001fwd׸i\u001a7\u0015mj\fwG\u0015ڨX\u0018u՟\u0016cjPР{\u0004\u001f{~\t4ʮ\u0007A5zS\u000fB96,E;\rђ-;*9p`\u0018@~\u0014\tRJຣ\u0016\u0007w\u00009?J8RsP7c\u001bԍֽ|m\u0004Uh=>\u0003\u0012X~3L\u0015\u001cN_3\u001d;6\u001cmx>\u0016\rig\u001f0V\u0018v\rbn\u001e5;ݔ4++bhd$ _H67f*Nz4:\u0006\n\u0013O\u0007\u001a\u001b\u001a#5>\u0007%\u001c447>*H>&\u0003E[ĉ\u001a!\u000f\u001a=\u001at\u0005\u000b\u000e;(5!\u001f@i=|F8AG^t\u000fy^WZ@\u0011+IiJ)\u0018\u001d͡PFMI}Cx]\r\t}*l\u0000gz0\u0004]?~^MB\u0001Q\u000e\u0017¸#Lɝ`#iI+ʨaW<\u0002\f\u0013̻7]e&\tkLN1&KTc\u0011u\u0017im$L\"W7JZn9\u000f\u0016\u000b\u0001&c!0Rs5P3|q*\r&M\u0015\u0018 `-G\u001f;\u001a.V<٣]\u0002ӛ\u001ci\u0013:Rh\u0004K^}W\u0006kg%\u001c݆\fQ?X8-v\u0007:^7\u0003]LH\u0003+ھ\u001dl@>;Ju\u001bu'f bJɥ۬R\u001f\u0011c|?[\u000bc\u0000\u0019\u0019\u000f\u000e\fOfg\tDu\u0013NZlF\rp1wf%?\u001a\u0005j\u0012\r\u0002\u0006\u0007V\u001b鴣:IO A+w#\u0006\u0001\u001aʐ\u0002q`U}7Rz2^dڟ|lB&/^@E\u0017\u001d,_\u001e`y4bHpF\u001dG&fLJ8SD\u0004\"#ۙy{kgOI\u0004z^?|Xv'\u0016|<Wn\bx>hC(6L_/\"UcL\u000fVvC!Ky5vdq,\u0016/M\u0000\u0018\u001aXON>gqѹ.\u0016O,g[\fň\u0015\u001aX\bÒ\u001eی\\jyK}6=\u0007഻t'ʷ\bL%O\u0010\u0017\u0014N\u0017AKu+v~]u\u000b8j0ɥu[1>w\r\u00166\\GI[|D\"\u0002\u0007'\bZ(d\u000e\u0011\u001fu{Zbn»)ċ\u001aECח-v43G\"}hdh\u000f&͉@ep*(P\u0000-\u0000f^Ǩ)\u001f\t㭡ߒs\u0002C\u001f_d3q\bkˋ#M9bִ\u0015`:lׯgnJ\u000f\u001dJK*n\"\u0011`NBNC\u000bTBoNT$L^R8\u0010Ch+\u0012\u000es\u0018*zP_W/Q]M(\u0017}\u000b~&W\u00076\u0006\u001e^ZP|jO6ꈅSO\u0005-Hԁ\u001a\u001cϯ\u0004\u0015\f0pOd\twY\u00135gϹF\u000b*m:PY\nyQ'\u0012e\u001eވN\u001bj\u0017w{M\f?tX\u0011jՁ6gTKKG6>\n(aB\u0015n\u0010T!Ah9\u0001B\u0005\u0015^^/\u0012`\u0015bA^\u0017M\u001d\u001e;w4\n`]'^h=a\r\\;8J\u000b*p9^빌lGN\u001b*Dd]\u00045/\u0016T\"\u0018\u0017t˕AN\u000b*\r\u0000\u001e\u0010[ۣ6oZ$Ь\u0003Tnv;\f?*I\u0002\u00182<*\u0018#JyFP\u0007s|rLтJfÁ\u0016T\u0000\u0001ʙ׮0CDeZkC-:\u001e~pc44b%}8R)2:P\u0018tn7RSAE`0&\u0019\"1\t#\r;N\rќn״Bm%\u0011\u001e1荾\"0\u0002s;5te]QЁ|E&.t+\u001e\r^\u0013\u001b}ԅj}xu\u0007TP1\u0018QXVluz\u000eB=e\u000f?iKΛ\"\tVAls`\u000e`\u00018\u0015uU=&z\u000fY\u00115\u001a_皹Y\u0012\"͕\u0007C\u0015r8o\u000bCl\u0005%2,WA\u0005xaq\f\u0003@nB1\u001aU\u0001\u0015YQh\b+PB6=\u00048k~O_\u0001j\"&!yxv:S\rB[H.\r@\u0010Woe߻{[?\u000fJ'I\u0007Tkwkߖ-w[\u0005҈2s|迭7y^-(Q[Tt߮6^jr\u000f\u0007lܼ>eH{Vs\u001c|Omw\u001fmW\r޲N[%Zף'ۗ\u0016!:}\u000b*?\u00164}\u001d#QN$0oob\bid3\u001c<l_.ںo-vO*{^\u001d\"r^Mv\rjAhLvѐĩ\u001dU;~\u001b[. sIujI,:FzBB+m\u001b\u0014+O\u0011Y[-W\u00076T9ۗ;pG\u0010\u0018G.XKk\u0006\u0004UM!\bWV\u0011\u0004\fAl\u0003:/̰E~Ѓ${\u0003\u0001\u0016{AB\u000f/%\u0012T\u0010aR\u0017*t6\u0007(4\u0005g]`.i}\u000f҅\n`+\u0003ʡ^Z\\rL\\jA6\u0019o*4#\u0003\u001c\u001c!`\rqCf;~]Ґ{ \u0001VM\u0017\u0006o:P\u001f\u0006PsNS\u0002ƾ\u000eT0\u0017ABE\u000e{ԝ.64K{zD+\u001d\r\u00030t0%\u000e'L\u0016\u0018\u001b;o\r\u0018C&v`\u0004I!\u0018OQ+\"pC{1o+S\bn\u0018E5\u0000A'X\b(U2\nUO;2̷n\f\u0001[Ǣ'\"{fkU˃e \u0000BB\u0011[:\rњV\u001213VH \u001et20\u001a/\u000f\u001eAnP\u001e)Mv\u001d{\u001cQ\u001fe.0{\u0001ae׆c;ҋ~<Ƀ3BKF2\u0018WL\u0018}ZfHG%<ýTNRc:k谚XCQߴn8$\u0006\u001f)ҧ\bb>Jz4 3/.}Iĵ'h\u0003M`\u0018\bi\"۫ b?P/[RIs̭B\u0019\u0014\u001f!\u0015y\u00148\u000fZ)\u0006U]043ֈᴷ\u000e\u0010e\u001e}{\t5ClE9{Gٓ\nAYML\u000e\u0011r~]o\u0006\u0013xeǼ`\nvyv\u00044h>\u0019O\tX\u0002ON{~T\u001di-@i\u0019bHZ\u001f\u001b]ōƛt\u0013-\u0007v\u0017\"@ڽ%\u001f\u0019ݕRI\u0018cy\fe@c{\u0004v\u0006ƶ\u0017\u0010֎\"mM\u0015U\u0010VU\u0016> <w\u0015'\u0006\u0000Vkuiʔ4\u0003'Τ\u0015#M,\rX1H\n)o}?G\u001fYmMuhMMIYIh#M}\b0׭\t\n\u0011hUEΩ!rCpL;\u001d5\r+74m=4\f={\\smm\u001c\b_\u0018[\u001bfPp\rui\u0006\u0002'\rL\btF(ȟC\u001aH4QS=n߯1a9KfoMf͕LY~b4զƴ;7\u001cpvv1A}g2ޠi1\ni\u001fiS#Qx\bN\u001c`\bV'\fFeu\u00164\u0012}*c4t5y<zn$vyLٟR7@p[6\u001fy>1>eJ_5?,՘̊\u0002$l\r.0 hj\u0013`oټl/\"^5C(f(\"dď3.eD!yBTu\u0007\u0016F\" y|1E\u0010vqC|\n|8,ZS0;}/ǝ㱨YAt`QЁ>\u000f;\r#\u000b,ھ\u000e\u0018\u001c\u000b\n`VP_\u001cԝ\u001crqBHԚ@^\n\u0000=ln痦Zζ¸=\u001e$*}ӃDj}\u0003\u0019'Ktb;\b;Rlǘ%\bI(,*lZj`ik՝f\u0016}ra$e`[J6Ћ[L{\u001a{[0\u000fͲԊa0\u0017y\u0019{@\u0011$\u0011\t\n\u0014ҁ&E`,J\r\u0015Q\u0000aU[<|FzI\u001d+?ߥL\n\u0015)\u0019И#.Y\u0003Fj\u0001\r\u001f-C9ߘҢޢK\u000flqS@aZGJgӰ\u0017\u001dvX\u0017p7w::\bޣPMxZ\u0015\u0015,v*K\u0014=\u001bsqL)l7g\u000f-E;جM`Srtk.\u000e\u001b<;.݄Mc\u0005#{MTkDK7誤\\I\u0016Aު\u001bPw?!`t\u0014@\u001d\u001dn\u0002\u001dm\u000f\u0003\u0017tV6T0E3\u001dHQȣ\u001c\ne(ty\u000e[a}bCKJ\u0013F*\u0005L\b]Mӱ4!qR EfM{Fz\u0004<H\u00156;6u{H@*vn\u001di{k \u001cYCh\u0011bk)}\u0003dZ?\b{X)4\u001f9\u001af\u00134\f\"٨\u001a\b\u0019::Wk\u000fX\u0017\u001dʶ3ё~4V¦u~4T\u001d\t(\u0017S\u000e^a(\u0005SL\u0007(w3ʭ\u0000N;ыm\u0000jdr=\u0002\u0004g1U\"\u0012>5t+S1mXS\bL7yƴ=\u0018%e\u001c3Bn\\w}^MCqv.8)<Ȏ;DAwm\u00106<d\u0007\u001fK텮{?ksR\u001e?,~(]C*\b:\u000fŽ\u001d(AA\u001d+QQ$Mj\u000fK5&d\u0011\u0011(%0\u001eh1J6b\u001e7|\u001arl\u001e\u000fl5Ƶ|\u0000gk~ɋSg\\˷S\u0004\u0012/\u0019R.~ϸt|Ƶ|T_.3\u00030?Sg\\KUr>Z>$~ϸO[/3\u0013ܨT\tHѥav\u0006~\u001d؃/g<&s\u0001b\u0018V)\u0003]JN?x{\u0010 1}9@V[\u0000gS\b\u0010fP%շRh\u0017\u0001s1\u0014\u001av$KsZ\u0015+&L u\u001fM 5u$e0&$v\u00146I{'_\u001cn\bk8dxuyY2b\u0007\u0013#S<NK$Ў\u000bdN4kMI\nk\u001dqݙ/6q{\"\u0010tڌ7l2}hVtB¥aٔ\u001a{Ƣi9dWs[b欖RFIN\u0016o\u0007\u0011\u0015@2\u001c\u0006'z;=QyyzI5+PS\u001fA\u00144Q#,կs<y\u000fòډ\u0019>\u001e\u0005>x~z\rUQO|ӌ\u001dQt%z3>\bԛQi\u0006ҎT윈4/ M\u0006śا*\u0017.zI)Ml_|u\u001c:$:rI`\\'#:y\u00079&kI\u0016Z¸\u000fu\u0007\u001a\u001cr떧\u001d-=\\%q\rjؕ6J;\u0013R8Fu\u0004\u0006ԯMd\\\u00194%\u00058F\u0019XC\u000b#UKY饴0kƂTOtJ~zG\u0005nYVsvH<abA\u0014'%l<@Uz\n\u0004if荰6Fu'EoƴK\u0019TFo~O\u001c37j7J\u00197I@\u0019)|'z4<lncVd\u0010Y\u0014kW t\u001e&\u001dߞ\u001c覌3v9PK\u001bo&h\u00027Ar˦pRБċpu#\u0019ҿd^Gt\u0018`ٴf\u001d4]2\b͌e\u0011 9f\u0010ɬݎ`,!ѲwJ%&\u0012o&c[\u0000ps(D \u001cAL\u0007tjlM;hn⋕y\u0007ޚPӕyҮ2\f@e`\u001d\u0014teiɰ_SлK\u0019QR7URgjcyQ:\u001f\u000b\u001beq9ef2Owm~2︷/\u00072Hڏ^⺵\u001f9yC,I<M\n4\u0017_W&\\H|򐿴Y,ttJ\u001dNFG\u0000^QX:?x*\\\u001f&.\u0007\f?~#KB\u0016D%P?ŏM\u00153i4\n}TG8i\u001c\u001aAA\u000eW;2>\u000bǜ+t̽Z\u001d}\u001fQ/&b6\f7\r\\\u00033\f\u0002\u000eQY鈙r\u0016>@,i%H\u001e)k*%\u0017\u001d_\"َu`|얩\u001f*mTlGd[?U$2qΆ>~DNkE\n%l+QkT\u0014vgL%Eyjf&W\u000bEy̜v<\u0005{\u001eXQ޷|OEyFI}?X'\u001fuy)d_,\u0013ٗ:8!YU(=z=O;^ \u0001j9\u0012n\u001f\n<2:\u0003\u0019h٤!Mx/\u001fr#ᒣg RHЁkqMT]ƤO\u00168:h2Ubct&U\u0000][|۶|EZ|\t+\u0019t\u0015|\n`>\u001aG\u000b\u0016oB?ZVU\u0016SԡJ\u0019UVI1V*k\u0017]ZFew~h~KV\u0007*k-OzewFW}\u001c)\u001buB\u0007\b0YAUF\u0003IB}sU_\u000e6-E\u0003$G,O@em\u0019_`XfoM]\u0000\u0006];ҫm\u001bA-9tw1\u0004؏Y/bi\u0007\u000e>M\\\fW?3u;+2u}hH>Q.lwo\u0019[ۢL\u001e\u0018\u001aLOc\u001c\u001cUwzU\u001dY8Չwi\u0018ft\u0017\u0017)O8^q\u0013\u001dz1X2GZ>aL#y68S;ht\u0017\"[[+w7𗙻'stB\u001e]`w,WdUlD3U'm\u001aGsM-2\u001a\t-9O\u0014PaV\u000b1c}Z^n}{\u001a_-rZ\u0004G\u000b4\u0004Ux\u000f\u0016iϯ<?Vg\u0014>_'\u001efbO>Rاϣ>_~O\u0017G\u000b+V~\u0019]*ӪoPar\u0012,\u001aj'\n~i^\u001a>5\u000f\u0015iu%,>>튕o\u0015}\u0003i\u0014\u001dGڏ\u0014iU}ZU}\u0007v\u000bl_\u001aU,ӪSHaf¾\u000e\u000e\u000e9>6XbaT#+}\u0016)A((RatU4w|ĝL^]r6Sw-*75}Gy\u000fLw[v\u0005}+tL\u000er%\u000b=Qu0C\u0007HIG#\u001aGƤ'\u0014t\u0013\r;\\ץ2u*0;\bU%٬O\u0014ݨ]&Tu,[\u00113=}xnwAY{RH{\u001c͹8%\u001f\u001bRwJPK/\u0004!r^\u0010RyRv_ )Jх__?\u000b#5o'xWw#MZlƱ\\F\u000f'\u001dd8~!\u001b\u0016^)Y$V\u0002̱zG3U㊆ɍ$ǝqmLzIj꒦NqPi(B孝aj\u0015/Wg?j\u0005TUuf6ʸ:͙\u0007\u0012jFtp/$`#\u001b;\u0006..#2Ul\"q\f̦\u0010&}]\u001bBo_>N\"o\u0014lre;\n[\u001biXBqx4*\n\f\u001b\u000e\u0010,5\u0017v\u0018wG.H:Σ͔$1szB\u001488녘_1\u0014\u0018O\u001cc;\r\u0011ܑUcŢ\u0004\rB\u0015:fC\ffT\u0014RSL&'uLҽMo'3յ;4{ZEdFyHNO\u00146foG%X5\u0013\u0010\u001dimi\u0019?2>ڷuﭛ\u00058j_ہvG&_G3\u001bD\u001d}\u0017z1>{tQV!ʲQc{uȏ0v\r*{=\tB4RkZTr޽dCMAg{e*m*dl:{\b{Ì#\u0016a\u0001\r\u0007\rpP\u0007\u0018ݪ3>uגqu\u000fƗayoT61w|4F\nSͅʲr탉~@a*S=}?u\u0019&I<VQ.oi\u0001P\t\u001b,b\u0005ʰn\r`oUΰ\u000e\u0012\t'*b\"\u001f.\u0016,rJ[bSq_5@ş2o8_,Oq5{^hU\u0001\u0018T&OQ7.D%ي\u000eTv>#m{5\u0004r=TY\u001ceOvW#gP\u0017oXTy\";\u001ep/ӔHv[ޅx\u000fFy\u0016T4\u0001/z召b\u0012hvv.#@$`Ӆjywz\u0018jA/UKxԇv%۾v\u0015@%lZ+Q.WB8ѬRFvL\f=gS2KO\u0015\u0001\fd6f\u0003D\u0015s\u00023\n򨠈{f3.Uy<LOwOlҷ\u0006W\u0007cљ?<J\u0003e\u0017\u000e~\u0001hiQ\u001bc\u001cM:԰&\u0007\"4Wy\u0002c[ng\u000e\u0002P\u001dB,km&*mq\u0005n\u0005eƍ)N\u0002VSp\u001bņ~?&[\t\u0000\u0018\u0014\u0003fi/N7Aa`\u0007gp}\nx3\u001b\u00183<=\u000bjf'glܖ籅v[)'x3g6MuD}\u0017=\u000e\u0013r\u001el\u0016jY&(%qu\u00010ykj5\u00184_*yw<iMk1 Y4ʏ\u0016;\u001d\u001b3A]1\u001a|^\u000bLf4\"]d\bV.T>q,\\~\u000b\u001c\tm͑\u0002\u0015$.ݜ,\u00190aag.e%zX\nq@7\u00145d\u001cz\u0012M\u0015\n\u0011\u0011P\tzJPH(⪷6Mo]f^}M4\u001d&G$L=\u001eY֙-FR\u0012ÊS\u0012#sڔđALG\u001b\u000fl§$\u0006ڡ]F0SJb(%kb=)a\u0011'(aS\u0012#~\b\u00186\u001f1M7)a\u0011'kҡR\u0012#\u0006iF5}B\u001f\u0017ba?X0'\u0015F\\u\nX\u0018\u001b\nmx\u0010Xkm~XIoO͘վ*V8@\u0015 W|sS\u001d\u00067WCWR˘j3Dۍ/x\u0018l\bi\u000b\u001e\u0006W;?,x8g\fT؂\t9\n\u0013\u0000T\u000b\u001eࡇ,F\u001e\u0011zv\u001e=<\u0005\u000fO(Hwq\u000103\u0015<\f\\\u000b\u001e\u0006'\u0000F~\t-x\u0018<%x?o0?P0ڡ\u0013m7g`2vs\u0015<\fF\u0019\u000b\u001e|\u000e1ӛ5\\\u0005\u000fl\u001fA`hV®/x\tv\u0018NlY>5j#\u0004Ft\\00\\z\u0004\u000b\u001e\u0006c,\u0005\u000fu9\u0011DC{`c\u001d4\u000b\u001e\u0006yL.0`ՊpLVŝ=,W:+x8\u001d\u0017\u001bF\u001dT0HP¹kzujt\u0013Ta?L}?Q08\u0002'\n\u001e\u0006<V<*xhj\u0016\u001e\u0005\u000fC\u000b\u001e\u0006ML`\u0011n,x8MkMv8n[7%\n?L]08#B\u0006@\tHfV;\u0005\u000f\u001f+o\u000b\u001e\u0006\u000b?y\n\u001ez\u0000>Rp\u0006FRpB/\u0002]J肇sEt)x8SiapC3s\u0017<t\u000fhap\u0010%]0Xw\u0001mT;\u0019Tp.3|\u0000h\u000f%^\u0005T;\u001c?cL`CG䘳apMzڂil%\u0006T;\u0019!g/x8d3mj~wPo\u0013\b\u0019\"I׉뜳a^aT\u0001E49QcY]<)aE*\"M+\u0019S*>#Xm_~0\u0000\u0014eƦM \\+}˧b\u0016^M_勭\u0018;y7u:ʟ4&\u0012+B%\u001c^fue+_\u001fldv\u0013By]\u0012*F\u0019BrsS\u0013ٯcm]\tGa/\t'\tE8+l\tg\u001fy,\u000f}gI(<]f5\\OO\u001f/\u000bk`?\u0018|nި~\u001cMC\u001fN_4\u000b/~\u001fDllkhVsx~y_\rJw\u0015}t19\u001c&Gk\u001d5c'%&jrNd\u0018\u0003L\u0006\u001b~wL1\f\u001aKu_XU>\u0014rrY[˭8BQxQ^șfV\u001fex](EE.\u000f\u0007E%\u001dO3|JK,C\\\u000f>x{'3jq(`2i\u001bn\u0005\t[\u0016`+rS\rZb4ݻhĒ\u0002U9z\u0018[\\\u001e^cQ\u0003G\u0018S\u0006̆1W7݋L)UIֶAM}ܥv\n!Kl@/_1*\\%od%+\u001aP\u001d܌ȰgNּ,r\u001c^r||ިpVEJwSqfakc\u001e\u001b\u0003\u001a8zV<r\u0007Z~|\u0006vM\u0007\u0003\u0018<\u0004\u0010hx[L\u0017U}u\u0003փm\u000es5\u0000\f+\u0005\u0017<8\u0016T8FΊL\u0015\n4PRg\"\u000frC\u001dF\u00072:\u0018@\u0003\u001epL<%m\bW\u0012w\"L~qm\u0011f\u000bܛ797\n[\u0007H\u0012Z<\u0012g&LN^m\u001c\rM\u0006\fWQ\u0014.I\"Pя\fZHtNK\u001a2Y}z[,?|\u0018Ф%Sogh\u000f\u00079R\u00166j\bC};EJd>pK6ïdj˴\u000fs}_i9*e7}\u0012_\u000e=|VG\u000b9zv\u001b\u0018y},yyS#m钾ڹM)>W}QwqWJ/)u\u000bfvq\u001f68&\fo\u0005*n$WK~\u000eX1pW\r\u0007g\f+T~U;-U\rKOMةf\u0014X\u001b$ʆ'\u0003@h3\u00159nG\u0019DSI\t`_+\u0018Z,*a\"v\u0000LR\u000e\tĳgwI\u0003CEZ\u001d\b$:1y:\u0014K0\u0015\u0006}\u000e;\u0007~#vCW\u001fg* mƐcnv%C iq\u0016((3\u001a0W$zu\rdHQ;Be if\u0019m^]I!\nj_\u0000Y=Kr\neb\u0014A-0ѭCx۝wOX=ۚ`x0Bە7\u0005B\fi3IjCեdn$\u00165]|(}t\u000f\u0006\"ִXᵸHO\")Kׄf}M>|\u0016\r\fx-݇.*5*>^\tZ5ě\u0013^\u0002z\r?ozacxs\u0010.g7y\u001bݍ\u0001rOR\u001f˱Iˏo9$l\u001aq1.YU\rGNJ`(O[(n.Cl9ۄrl S\\*0*2h\u0017H\u001aM\u0011U텅|*{%Phi\rJ\u000e\be\u000f\u000e\u001aM]R@\"E\b|W\"pR\u0016ɞ\u0019=@sݻ\u0010j1ѻ\u0017\u0013N۲\r\u0015-`O\u000f:\u000bT\u001e\rDOYiʷ畽\u001e}J\u0016nC3@ez|1\u000e\u0015\u0012\u0018~\u0007i/NM\u0013)жRf=ibngTRxطGe@(}@v\u0003\u0006B#-^o%28\\\r\u0007\u000b\u000e+\u000b\u000e\u0005\u0004sv\u000fIF\bCz\u0005B\u000eL\u0006\f\u000eW]ߴ`WY 6\u001dp _bHd\u001dn|\u0001aռ@CؙG\u0013!v\u0001ry-v?\u000e\u0002;X\u0010H9lAg\u0002Ǒw\"%@1\u0011!xEAL&켨uA\u0013>#,0\\H\u001bG$lZ\u0003o\u001f℉fX\u001dt9\"Iݢ)va[\tKod\\|\u0017x/ԇ\u0003\u0017ғ1-t\u001f0Xbw@1md\"+\u0015|\u001dX6E\u001f|\u0018u 0A&\u0003Z\u0015A+\u000b\u00130\u0013\tM#\u0006b\u0007y2'RM&\u00153A^<}y\u0004uo\u0013\u0011<I\u001e\u0004|&p\u001cܜhA<34/\u0011?O\u001cdIDw!>ɞK%{/\u0005w$w$5d\bȎ+@h7>\u0005^YϺCn崰rY\u001er5uVl=EUT![g\u0005L\u00149f\u001a,\u001c.z\u001cB\u001ffU_oo7\u001c\r:\u0019Ku5^\u0001E5.v(YUSr@6MY\u00143Ҵ\u0016vRԖlYST^65\u0005*\u0015ƙ\u001b\r)qW\u0003ۤ`\u0002\u0006L9=tI\\ܓ[b-xlN9^H-/~eV\u0007YTY\u001c-6m\u0012_TIʩ\u0016oHjyi\u000f\u0014/U]e\u0000\u001a\u001eL}o@Lj\u001c+\u000eU\u001e\u0014Ujz%\u0015\u0016\u000111[\u0016ͣUiw;v\u0002^\u0003lZ(\u00152'B}\b}Αg1op\\BBc+|7^\u0004'\u0017{\u001e\u001bȩh{\\Z\u0018I\u001e4vX\bj\t\u001b\u0004i\f|nxskbz]rei\u001a[\u001f\u0017ndNb\u0000L2㍼t.nۺG|+J[>\rr1\u0007xN\u0013\u001fMj\bfwWERx^\u001b׾*\u0015NG&bn\t/>*R|_]\u0018K\u0005<BY\\ٷϷC)1\tC}=\u0014H^!eik\flVsa\u0001bD\u0000\u0012L\u0014\u0016%ۼ*JmQ>\riT`\u0014ZgHi\u001b@usL=V #-m1S\u001c8\u0000\u0006m\u0000o|Q\u0013<\u0005iEkJDU\u000bٜ\u0015Ki.>bv\u0013q\u00019QHWIV`\u0014S\u000b4\u0018𽪘M\u0012InXfٳ֚X}+W\u00144[}ZR\u000791xN9\n]ao\u000e9g*<sN3])Kq.>\u0010Z\b\fS\u001f~I{+@U%:Z]#B];V\u0003JI**Bgxm*I-5I*Y\u001e\u0007\n\u0016\u0007&mA7v+EF&R}\u0000M\u000b@qٍ<I]\u001ey\u001f\u001cDTqWm\u000b\"M<\u001eϗ\u0004 o\u0019\u0016#5͒1rҔ\u001d7G7O\u0014\u0015}\u0002c޴,PYzdN\u001d]]Y37Nt\u0001eZ;oL,\u001c\u0013S\u0017.0R\u0016\u0004Jt\u001dQlgn\tiim)n<ٮ\u001d\u0007%W\u001cd~%r\u0004p<7ԋi=p\u0007\u000bS̾\u0017\u000f\u00140\u0019\u0006\u0007~\u0005Yju?x\u0003n@\u001b\u0002\u0013Wj\n*\b\fKZXbks)\u0011\u000bP\u0010\u001f\u0015sd[G9N:񱰍\u0019~Hr|\u0011v>2[TNF{s\u000b\u001b\u001ep=7\u000f\u001f<Eo)\u000b8vO&@\u0001ZKwGu\u001fu\u000eRzs?m|-u˗Cߓ\rs펗]S/\u00154;JHh\u0016\u0013`\u0013\u001enЎr!Z\u0002\u0005jKɬ\u001b$]]\u0002;eU.\u00058x)F\u0004Bc\u001aѥ~PzY|\u0015k6Kz '嬑X\u0015Η\u001c\u0011WXrt9_\u0003\ri^.w#ڿޓfs#\u0019QY,eTR;-\u000f\"t\u001eVTXl.pI\u001d>v!nvvSOo9\u001do7%O\u0000\u00035U3jQ38\u0018th6\u000f4-gv2tN;;,\u001f:at%o\u0014uy;QqGDQ\u000fWqhǨ\u0016[?B3\u000fH~҅-\u0006_,cXTNbg\u0016/̑DZUj%\u0019\u00036v&eG\u0002<T[c\f\rY-w]\u001c\t^VA//ƨ\u0011ɣԤW_JQZl7ㆺ_l/lõ\rZ1\u0016_\u000e\u0017\u001be\u0007q\r:~J^\u001d,)f^\u0004Ų歅{='a@m\u001cSMJ)\u0015#,J5\u0018\u0014\u0001뗘\u0005\u000b\u0019EK3!Q\u0005\\QgF\u000b\noӽK<436anf>׃Q'\\x\u0006N\t\u00174\u0017\u000bpaZ8~\\\t\u0017f\u0017>\u0002Cy~C\t\u0017\u0014h _\u000b4\u000b|\u0013.\"։V?,_\u000b\u0002\u0017\u001e;B\u0002ٳ%V}\"/>΁uK\u0019C,&^\u0007{;\u0001<X/TvfgXz;\u0016OKܰ-\u0003C0'3N@\u001dl\u0015:\u0007D5\\}h\u001ap\t|`,\u001aksr56\u00061(@Q\u0018V\u0019bsR}ZK;k}aL\u0005\u0007\u0000[~\u0010̑R*\u0003FƑ~LմZ9ac_09ZGo9l%>.|I!ތ;4HcͩRV賨3qM~Ȋk\u001ad|QZuDPG.]cp-c.Ɏ/K(\u001d8\u001d\u001cy><}5r`ant\u001d\u0000\t\u001a`5\u00159\u001eo߃ɞ`o\u00127iB\f(;)\u0011[1'k\u000ej\u0006OEVT&dT]\\չ=l\u001d3kUpO!m&\u0010.@x3W٩ph;p^E\u0001\u0002K\t\u000b\f\u0004aV?\u000b@@t\u001e\u0006k7 :1m\u000fz̈\u001b)HV\u001c\u0004\u000b\u0018Ǆ>\u0006a'⬍\u000f:D|Q}\u0016¯\u001d񜠘?@\u001eay7<1؏}?Ќ8\u0006V\u001c|s\u0010j{GOH赍M{\u0011vܘvқ\u001f:é\u001856?Ǵf\u001eF\f\u001d<\fu\u00002h\"ϳBӅi/_Hn2R#L\u001f\u000f\u001f\fnkX_Xw**\u0006NeNn(O#\b\u00020 .\u0017\u0017Cl#8>q\u0010zKp6i8\u001e:\u001f\u0001A<:\u0002sn\u001b~ÇA\u0015s_>..x.V&\u0015\tj\u0011$/'2\u001am\u001b{=k\u001c0\u0010^r\u0019PMd)k$\u0014pWmΥ\u0014\u001e-s;(Oy3\u0002\"`hF,h)<ӸQlIn\b!\u0012\u0013fce\r`~2mQ٤>3\u0007oF>8yb-u\u0005y\u000e\u001e.eWv<+G\f+>)N\u00181k)NL\u0018-eWo,;\u0011W\u0012揧,;\u0018k)N2|&t2Ω#bM=aZY\u0001o\u0002X\u001c\u001a\u0014Z݅ø͵>->á3)NS̸hz`\u0010\u00122ZֱDb\u001cyk4\fO\u0018\u0007\u0011O.\u0013α\t\u0005?:YƇ \u0017BvMaqšwMGL䘇z[]~_\nt@\u001d6v2tʎao.)d\u00012;e-W\u0011اx\u0014\u001cݢw^\u0012p3zMSWo3#F?\u0001_͈D\u0012E\u000b\u0005\u00010I:*\u001ef;~s0,u\u001f~5Otk϶Kѕ({\u000eY&ad\u001d4G)ꓽ¦(D7O_\u0013\u000b\u0006 p\u0013AQ$I *\u001bQ\u0003hK J*(\u001dM\f]4TEE]Yp*h,F\u0014&(N$\u0018(j\u001aܑ\u0015\u0005 \u0014m\f\b0\u000e\u000bBt/zu#D\u0011xx\u001cH\u001aGlXEs2Q9M\u0005UVTMФ\u001bUN5\t +\"\u00125N%(\b(!\u001a@\u0012TDsq.\u0018c\u0002 r0\u000bA\u0016\u0015Q&)4yh2g\u0018Љ$iЊ\u0018!;2d\u0019\b\t\u0010D8Y\u0013\rXDN^$IW\fMaMaD$\u0002p\n\u0013\bE\u0015\u0010i\u0013Kd\u001d\"\u0007_\u0003\u00028(\u0004%i,*@FP8\u0019HeHN%ɂK\be\u0013\u0003FN\u0017=\u0010k\u0005\u0013\u0002_;?2\u0007X\t\u0012\u0015\u0001pV\u0011\bLMʪj\b\u0006\f\u0019fNTC6\"LQʢ*FX1W\u0000\u0006|ƞ<xS\bF\u0006B!\u0012hp\u0004T\u0004\u000f_68Ė\u001fVMT9C\u0011\u0010ŀ&\u001a\u0007\u000b*\t&.i\"t%\u0013\u0010eX\u0012IU8\u0002$dϑh}N\u0016e\u0003\u001bНZA#QȀb芆$MD\u0016Ef\u0003<\u0001&\u001bjt*u@4`oEC1\u001c\u0002\f\u0007ܰk\u0005\u0010Q0$U\u0005\u0019\u0012\u0015\u0003'cx\u0001\u001c\u0001\u000fܐ\u0000qesfKEb\\*\u0015lXdX\u0005,bS\u001d[i\u0000,\u0018H\f\u0000\u0015\u0001c5U\b\u000b\t@\u001a\u0004IDl~\r\u000e)\u001a>\bĀ5įI*&0\u0002k@ﰘֺ!\u0003c:\u0002ދ\u0012O\u0010eJ\u0004MI6\u0007\f1tK_G\",\u0015P-\u0000D\u000eIAӡ%,Eya{ \"!*8\b-McQ4F\u0000I\u000eLUX_\u0000\"\u0001v\u0002s؉.J0~a4\u0005YS-$K\f\"tb_\u0006Q'*1L\u0001\u0004\u001e\u0012UPD:\"]F%\u0007WDSUEְt+a\u0001F\u000eÀD\u0007\u00076(l\u0002d\u0005.\b&߀h\nB\b\n\":!Q@*\f\"#t؁\u0001\u001a\u0010]\u0017x\u0004hAah0,\u0001\u0005Fr[\u000b\f\u000e\u001f\u0010\u0002/i\b\u000fbv$\"\u001a\u0010XQ\u0019\u001d{\tCg\u0014\u000f- l:\u0004k\n(n0\u0000\u0000rv\u00100\u0012\r\u0001pg\u000ee'L\u0003\u0014\u0004b?u\u0014\tS5\u0000\u0001$\u0010LX\u0001(4\u0005\u0012\fd\u001d\u0012(y\n\u000e\n`N\u0006\t\u0002\u000f^WG:\u0007r:prBt\u0003B\neb\u00026Q/o\u0001\u0000$\u0006d>Xp@\"\u0007\u000b\u0019(\u0005\u0002R\u0002qI,#5Ch-?/d\u0006\u0003\u0002@iî/ -\bTQ5NA\u0019)FQI+`X\u0010\u001c*\u00076l۬Fg9\u0000\u001d\u000e⃡\u0007.[PY\u0017Ҁ!Ѐ\u0001(A_\u0014\"\u00027ChJ4\u0019D\u0011\u0017\f`G\u001aIe\u0000\u0019(@\u001d\"*r U\u0011l\u0003\u0000\u0015`\n\u0002;1X]\u001d\u00150\tl\u0018Vf\u001b]@)l\u0002\r;\u00127B\u001dk\rN0e\u0007\u0018jʺ(Q`Eme\tQ̓\t\u001a\nRZ\u001bꤲ{4:\t^\u0002M\u001dN\nºdHL@M\u001ftRͣQTpI\u0006\u0015Tu%1괠=VTQE\u001a()FGJg`b4R?C`p_n\u0013~g3\u001bd*ڸ0#L(\u0018P[gyd\u001fǾ_\u0017\u001b\u0018\u0006c/\u0017߲`g\u0013\u001b\u0015QQ\u0014\u0001\u0006%\u00046k$\u0001΢\u00004BF\u0017՘\u000f`.?Q\u0019J<i7^Oxdf!|\u0003kjJjGQ-׷L[צ\u001cF?/\u001f:V\u0015qOD[^\u001avQi\u0004w\u000ed\\>D(\r\nendstream\rendobj\r7 0 obj\r<</Intent 17 0 R/Name(Layer 1)/Type/OCG/Usage 18 0 R>>\rendobj\r17 0 obj\r[/View/Design]\rendobj\r18 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>\rendobj\r36 0 obj\r[35 0 R]\rendobj\r59 0 obj\r<</CreationDate(D:20200626162511-07'00')/Creator(Adobe Illustrator CC 23.0 \\(Windows\\))/ModDate(D:20200626163318-07'00')/Producer(Adobe PDF library 15.00)/Title(Web)>>\rendobj\rxref\r\n0 60\r\n0000000004 65535 f\r\n0000000016 00000 n\r\n0000000159 00000 n\r\n0000042405 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000402576 00000 n\r\n0000000000 00000 f\r\n0000042456 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000402646 00000 n\r\n0000402677 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000044861 00000 n\r\n0000045063 00000 n\r\n0000044674 00000 n\r\n0000402762 00000 n\r\n0000042898 00000 n\r\n0000088806 00000 n\r\n0000086122 00000 n\r\n0000086009 00000 n\r\n0000043676 00000 n\r\n0000044112 00000 n\r\n0000044160 00000 n\r\n0000044745 00000 n\r\n0000044776 00000 n\r\n0000066045 00000 n\r\n0000045302 00000 n\r\n0000045549 00000 n\r\n0000066298 00000 n\r\n0000086157 00000 n\r\n0000088880 00000 n\r\n0000089142 00000 n\r\n0000090338 00000 n\r\n0000095838 00000 n\r\n0000161427 00000 n\r\n0000227016 00000 n\r\n0000292605 00000 n\r\n0000358194 00000 n\r\n0000402787 00000 n\r\ntrailer\r\n<</Size 60/Root 1 0 R/Info 59 0 R/ID[<9B03A785DC206F46B4CB243CF1DC014A><5F75722AE9B1A5469C5B25782C9498E1>]>>\r\nstartxref\r\n402971\r\n%%EOF\r\n"
  },
  {
    "path": "src/angular/.angular-cli.json",
    "content": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"project\": {\n    \"name\": \"seedsync\"\n  },\n  \"apps\": [\n    {\n      \"root\": \"src\",\n      \"outDir\": \"dist\",\n      \"assets\": [\n        \"assets\"\n      ],\n      \"index\": \"index.html\",\n      \"main\": \"main.ts\",\n      \"polyfills\": \"polyfills.ts\",\n      \"test\": \"test.ts\",\n      \"tsconfig\": \"tsconfig.app.json\",\n      \"testTsconfig\": \"tsconfig.spec.json\",\n      \"prefix\": \"app\",\n      \"styles\": [\n        \"../node_modules/bootstrap/dist/css/bootstrap.min.css\",\n        \"../node_modules/font-awesome/scss/font-awesome.scss\",\n        \"styles.scss\"\n      ],\n      \"scripts\": [\n        \"../node_modules/jquery/dist/jquery.min.js\",\n        \"../node_modules/popper.js/dist/umd/popper.min.js\",\n        \"../node_modules/bootstrap/dist/js/bootstrap.min.js\"\n      ],\n      \"environmentSource\": \"environments/environment.ts\",\n      \"environments\": {\n        \"dev\": \"environments/environment.ts\",\n        \"prod\": \"environments/environment.prod.ts\"\n      }\n    }\n  ],\n  \"e2e\": {\n    \"protractor\": {\n      \"config\": \"./protractor.conf.js\"\n    }\n  },\n  \"lint\": [\n    {\n      \"project\": \"src/tsconfig.app.json\",\n      \"exclude\": \"**/node_modules/**\"\n    },\n    {\n      \"project\": \"src/tsconfig.spec.json\",\n      \"exclude\": \"**/node_modules/**\"\n    },\n    {\n      \"project\": \"e2e/tsconfig.e2e.json\",\n      \"exclude\": \"**/node_modules/**\"\n    }\n  ],\n  \"test\": {\n    \"karma\": {\n      \"config\": \"./karma.conf.js\"\n    }\n  },\n  \"defaults\": {\n    \"styleExt\": \"scss\",\n    \"component\": {}\n  }\n}\n"
  },
  {
    "path": "src/angular/.editorconfig",
    "content": "# Editor configuration, see http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 4\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\nmax_line_length = off\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "src/angular/.gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/tmp\n/out-tsc\n\n# dependencies\n/node_modules\n\n# IDEs and editors\n/.idea\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\n\n# IDE - VSCode\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n\n# misc\n/.sass-cache\n/connect.lock\n/coverage\n/libpeerconnection.log\nnpm-debug.log\ntestem.log\n/typings\nyarn-error.log\n\n# e2e\n/e2e/*.js\n/e2e/*.map\n\n# System Files\n.DS_Store\nThumbs.db\n"
  },
  {
    "path": "src/angular/e2e/app.e2e-spec.ts",
    "content": "import { AppPage } from './app.po';\n\ndescribe('seedsync App', () => {\n  let page: AppPage;\n\n  beforeEach(() => {\n    page = new AppPage();\n  });\n\n  it('should display welcome message', () => {\n    page.navigateTo();\n    expect(page.getParagraphText()).toEqual('Welcome to app!');\n  });\n});\n"
  },
  {
    "path": "src/angular/e2e/app.po.ts",
    "content": "import { browser, by, element } from 'protractor';\n\nexport class AppPage {\n  navigateTo() {\n    return browser.get('/');\n  }\n\n  getParagraphText() {\n    return element(by.css('app-root h1')).getText();\n  }\n}\n"
  },
  {
    "path": "src/angular/e2e/tsconfig.e2e.json",
    "content": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/e2e\",\n    \"baseUrl\": \"./\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"types\": [\n      \"jasmine\",\n      \"jasminewd2\",\n      \"node\"\n    ]\n  }\n}\n"
  },
  {
    "path": "src/angular/karma.conf.js",
    "content": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-file.html\n\nmodule.exports = function (config) {\n    config.set({\n        basePath: '',\n        frameworks: ['jasmine', '@angular/cli'],\n        plugins: [\n            require('karma-jasmine'),\n            require('karma-chrome-launcher'),\n            require('karma-jasmine-html-reporter'),\n            require('karma-coverage-istanbul-reporter'),\n            require('@angular/cli/plugins/karma'),\n            require('karma-mocha-reporter')\n        ],\n        client: {\n            clearContext: false, // leave Jasmine Spec Runner output visible in browser\n            captureConsole: false\n        },\n        coverageIstanbulReporter: {\n            reports: ['html', 'lcovonly'],\n            fixWebpackSourcePaths: true\n        },\n        angularCli: {\n            environment: 'dev'\n        },\n        reporters: ['mocha', 'kjhtml'],\n        port: 9876,\n        colors: true,\n        logLevel: config.LOG_INFO,\n        autoWatch: true,\n        browsers: ['Chrome'],\n        singleRun: false,\n\n        customLaunchers: {\n            ChromeHeadless: {\n                base: 'Chrome',\n                flags: [\n                    '--headless',\n                    '--disable-gpu',\n                    // Without a remote debugging port, Google Chrome exits immediately.\n                    '--remote-debugging-port=9222',\n                    '--no-sandbox'\n                ]\n            }\n        },\n        mochaReporter: {\n            output: 'full'\n        }\n    });\n};\n"
  },
  {
    "path": "src/angular/package.json",
    "content": "{\n  \"name\": \"seedsync\",\n  \"version\": \"0.8.6\",\n  \"license\": \"Apache 2.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve\",\n    \"build\": \"ng build\",\n    \"test\": \"ng test\",\n    \"lint\": \"ng lint\",\n    \"e2e\": \"ng e2e\"\n  },\n  \"private\": true,\n  \"dependencies\": {\n    \"@angular/animations\": \"^4.2.4\",\n    \"@angular/common\": \"^4.2.4\",\n    \"@angular/compiler\": \"^4.2.4\",\n    \"@angular/core\": \"^4.2.4\",\n    \"@angular/forms\": \"^4.2.4\",\n    \"@angular/http\": \"^4.2.4\",\n    \"@angular/platform-browser\": \"^4.2.4\",\n    \"@angular/platform-browser-dynamic\": \"^4.2.4\",\n    \"@angular/router\": \"^4.2.4\",\n    \"@types/eventsource\": \"^1.0.2\",\n    \"angular-webstorage-service\": \"^1.0.2\",\n    \"bootstrap\": \"^4.2.1\",\n    \"compare-versions\": \"^3.4.0\",\n    \"core-js\": \"^2.4.1\",\n    \"css-element-queries\": \"^1.1.1\",\n    \"font-awesome\": \"^4.7.0\",\n    \"immutable\": \"^3.8.2\",\n    \"jquery\": \"^3.2.1\",\n    \"ngx-modialog\": \"^3.0.4\",\n    \"popper.js\": \"^1.14.6\",\n    \"rxjs\": \"^5.4.2\",\n    \"zone.js\": \"^0.8.14\"\n  },\n  \"devDependencies\": {\n    \"@angular/cli\": \"1.3.2\",\n    \"@angular/compiler-cli\": \"^4.2.4\",\n    \"@angular/language-service\": \"^4.2.4\",\n    \"@types/jasmine\": \"~2.5.53\",\n    \"@types/jasminewd2\": \"~2.0.2\",\n    \"@types/node\": \"^13.13.0\",\n    \"codelyzer\": \"~3.1.1\",\n    \"jasmine-core\": \"~2.6.2\",\n    \"jasmine-spec-reporter\": \"~4.1.0\",\n    \"karma\": \"~1.7.0\",\n    \"karma-chrome-launcher\": \"~2.1.1\",\n    \"karma-cli\": \"~1.0.1\",\n    \"karma-coverage-istanbul-reporter\": \"^1.2.1\",\n    \"karma-jasmine\": \"~1.1.0\",\n    \"karma-jasmine-html-reporter\": \"^0.2.2\",\n    \"karma-mocha-reporter\": \"^2.2.5\",\n    \"node-sass\": \"^4.5.3\",\n    \"protractor\": \"~5.1.2\",\n    \"ts-node\": \"~3.2.0\",\n    \"tslint\": \"~5.3.2\",\n    \"typescript\": \"^3.2.2\"\n  }\n}\n"
  },
  {
    "path": "src/angular/protractor.conf.js",
    "content": "// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/blob/master/lib/config.ts\n\nconst { SpecReporter } = require('jasmine-spec-reporter');\n\nexports.config = {\n  allScriptsTimeout: 11000,\n  specs: [\n    './e2e/**/*.e2e-spec.ts'\n  ],\n  capabilities: {\n    'browserName': 'chrome'\n  },\n  directConnect: true,\n  baseUrl: 'http://localhost:4200/',\n  framework: 'jasmine',\n  jasmineNodeOpts: {\n    showColors: true,\n    defaultTimeoutInterval: 30000,\n    print: function() {}\n  },\n  onPrepare() {\n    require('ts-node').register({\n      project: 'e2e/tsconfig.e2e.json'\n    });\n    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));\n  }\n};\n"
  },
  {
    "path": "src/angular/src/app/app.module.ts",
    "content": "import {BrowserModule} from \"@angular/platform-browser\";\nimport {APP_INITIALIZER, NgModule} from \"@angular/core\";\nimport {HttpClientModule} from \"@angular/common/http\";\nimport {FormsModule} from \"@angular/forms\";\nimport {RouteReuseStrategy, RouterModule} from \"@angular/router\";\n\nimport {ModalModule} from \"ngx-modialog\";\nimport {bootstrap4Mode, BootstrapModalModule} from \"ngx-modialog/plugins/bootstrap\";\n\nimport {AppComponent} from \"./pages/main/app.component\";\nimport {environment} from \"../environments/environment\";\nimport {LoggerService} from \"./services/utils/logger.service\";\nimport {FileListComponent} from \"./pages/files/file-list.component\";\nimport {FileComponent} from \"./pages/files/file.component\";\nimport {ModelFileService} from \"./services/files/model-file.service\";\nimport {ViewFileService} from \"./services/files/view-file.service\";\nimport {FileSizePipe} from \"./common/file-size.pipe\";\nimport {EtaPipe} from \"./common/eta.pipe\";\nimport {CapitalizePipe} from \"./common/capitalize.pipe\";\nimport {ClickStopPropagationDirective} from \"./common/click-stop-propagation.directive\";\nimport {FileOptionsComponent} from \"./pages/files/file-options.component\";\nimport {ViewFileFilterService} from \"./services/files/view-file-filter.service\";\nimport {FilesPageComponent} from \"./pages/files/files-page.component\";\nimport {HeaderComponent} from \"./pages/main/header.component\";\nimport {SidebarComponent} from \"./pages/main/sidebar.component\";\nimport {SettingsPageComponent} from \"./pages/settings/settings-page.component\";\nimport {ServerStatusService} from \"./services/server/server-status.service\";\nimport {ConfigServiceProvider} from \"./services/settings/config.service\";\nimport {OptionComponent} from \"./pages/settings/option.component\";\nimport {NotificationService} from \"./services/utils/notification.service\";\nimport {ServerCommandServiceProvider} from \"./services/server/server-command.service\";\nimport {AutoQueuePageComponent} from \"./pages/autoqueue/autoqueue-page.component\";\nimport {AutoQueueServiceProvider} from \"./services/autoqueue/autoqueue.service\";\nimport {CachedReuseStrategy} from \"./common/cached-reuse-strategy\";\nimport {ConnectedService} from \"./services/utils/connected.service\";\nimport {RestService} from \"./services/utils/rest.service\";\nimport {StreamDispatchService, StreamServiceRegistryProvider} from \"./services/base/stream-service.registry\";\nimport {LogsPageComponent} from \"./pages/logs/logs-page.component\";\nimport {LogService} from \"./services/logs/log.service\";\nimport {AboutPageComponent} from \"./pages/about/about-page.component\";\nimport {ROUTES} from \"./routes\";\nimport {ViewFileOptionsService} from \"./services/files/view-file-options.service\";\nimport {ViewFileSortService} from \"./services/files/view-file-sort.service\";\nimport {DomService} from \"./services/utils/dom.service\";\nimport {StorageServiceModule} from \"angular-webstorage-service\";\nimport {VersionCheckService} from \"./services/utils/version-check.service\";\n\n@NgModule({\n    declarations: [\n        FileSizePipe,\n        EtaPipe,\n        CapitalizePipe,\n        ClickStopPropagationDirective,\n        AppComponent,\n        FileListComponent,\n        FileComponent,\n        FileOptionsComponent,\n        FilesPageComponent,\n        HeaderComponent,\n        SidebarComponent,\n        SettingsPageComponent,\n        OptionComponent,\n        AutoQueuePageComponent,\n        LogsPageComponent,\n        AboutPageComponent\n    ],\n    imports: [\n        BrowserModule,\n        HttpClientModule,\n        FormsModule,\n        RouterModule.forRoot(ROUTES),\n\n        ModalModule.forRoot(),\n        BootstrapModalModule,\n        StorageServiceModule\n    ],\n    providers: [\n        {provide: RouteReuseStrategy, useClass: CachedReuseStrategy},\n        LoggerService,\n        NotificationService,\n        RestService,\n        ViewFileService,\n        ViewFileFilterService,\n        ViewFileSortService,\n        ViewFileOptionsService,\n        DomService,\n        VersionCheckService,\n\n        // Stream services\n        StreamDispatchService,\n        StreamServiceRegistryProvider,\n        ServerStatusService,\n        ModelFileService,\n        ConnectedService,\n        LogService,\n\n        AutoQueueServiceProvider,\n        ConfigServiceProvider,\n        ServerCommandServiceProvider,\n\n        // Initialize services not tied to any components\n        {\n            provide: APP_INITIALIZER,\n            useFactory: dummyFactory,\n            deps: [ViewFileFilterService],\n            multi: true\n        },\n        {\n            provide: APP_INITIALIZER,\n            useFactory: dummyFactory,\n            deps: [ViewFileSortService],\n            multi: true\n        },\n        {\n            provide: APP_INITIALIZER,\n            useFactory: dummyFactory,\n            deps: [VersionCheckService],\n            multi: true\n        },\n    ],\n    bootstrap: [AppComponent]\n})\nexport class AppModule {\n    constructor(private logger: LoggerService) {\n        this.logger.level = environment.logger.level;\n    }\n}\n\n// noinspection JSUnusedLocalSymbols\nexport function dummyFactory(s) {\n    return () => null;\n}\n\n// Run the ngx-modialog plugin to work with version 4 of bootstrap\nbootstrap4Mode();\n"
  },
  {
    "path": "src/angular/src/app/common/_common.scss",
    "content": "$primary-color: #337BB7;\n$primary-dark-color: #2e6da4;\n$primary-light-color: #D7E7F4;\n$primary-lighter-color: #F6F6F6;\n\n$secondary-color: #79DFB6;\n$secondary-light-color: #C5F0DE;\n$secondary-dark-color: #32AD7B;\n$secondary-darker-color: #077F4F;\n\n$header-color: #DDDDDD;\n$header-dark-color: #D3D3D3;\n\n$logo-color: #118247;\n$logo-font: 'Arial Black', Gadget, sans-serif;\n\n$small-max-width: 600px;\n$medium-min-width: 601px;\n$medium-max-width: 992px;\n$large-min-width: 993px;\n\n$sidebar-width: 170px;\n\n$zindex-sidebar: 300;\n$zindex-top-header: 200;\n$zindex-file-options: 201;\n$zindex-file-search: 100;\n\n%button {\n    background-color: $primary-color;\n    color: white;\n    border: 1px solid $primary-dark-color;\n    border-radius: 4px;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    cursor: default;\n    user-select: none;\n\n    &:active {\n        background-color: #286090;\n    }\n\n    &[disabled] {\n        opacity: .65;\n        background-color: $primary-color;\n    }\n\n    &.selected {\n        background-color: $secondary-color;\n        border-color: $secondary-darker-color;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/common/cached-reuse-strategy.ts",
    "content": "import {ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy} from \"@angular/router\";\n\n/**\n * CachedReuseStrategy caches Components so that they are not\n * recreated after navigating away.\n * Source: https://www.softwarearchitekt.at/post/2016/12/02/\n *         sticky-routes-in-angular-2-3-with-routereusestrategy.aspx\n */\nexport class CachedReuseStrategy implements RouteReuseStrategy {\n\n    handlers: {[key: string]: DetachedRouteHandle} = {};\n\n    // noinspection JSUnusedLocalSymbols\n    shouldDetach(route: ActivatedRouteSnapshot): boolean {\n        return true;\n    }\n\n    store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {\n        this.handlers[route.routeConfig.path] = handle;\n    }\n\n    shouldAttach(route: ActivatedRouteSnapshot): boolean {\n        return !!route.routeConfig && !!this.handlers[route.routeConfig.path];\n    }\n\n    retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {\n        if (!route.routeConfig) { return null; }\n        return this.handlers[route.routeConfig.path];\n    }\n\n    shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\n        return future.routeConfig === curr.routeConfig;\n    }\n\n}\n"
  },
  {
    "path": "src/angular/src/app/common/capitalize.pipe.ts",
    "content": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({name: \"capitalize\"})\nexport class CapitalizePipe implements PipeTransform {\n\n    transform(value: any) {\n        if (value) {\n            return value.charAt(0).toUpperCase() + value.slice(1);\n        }\n        return value;\n    }\n\n}\n"
  },
  {
    "path": "src/angular/src/app/common/click-stop-propagation.directive.ts",
    "content": "import {Directive, HostListener} from \"@angular/core\";\n\n@Directive({\n    selector: \"[appClickStopPropagation]\"\n})\nexport class ClickStopPropagationDirective {\n    @HostListener(\"click\", [\"$event\"])\n    public onClick(event: any): void {\n        event.stopPropagation();\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/common/eta.pipe.ts",
    "content": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n/*\n * Convert seconds to an eta in the form \"Xh Ym Zs\"\n*/\n@Pipe({name: \"eta\"})\nexport class EtaPipe implements PipeTransform {\n\n  private units = {\n      \"h\": 3600,\n      \"m\": 60,\n      \"s\": 1\n  };\n\n  transform(seconds: number = 0): string {\n    if ( isNaN( parseFloat( String(seconds) )) || ! isFinite( seconds ) ) { return \"?\"; }\n    if (seconds === 0) { return \"0s\"; }\n\n    let out = \"\";\n\n    for (const key of Object.keys(this.units)) {\n        const unit = this.units[key];\n        if (seconds >= unit) {\n            const unitMultiplicity = Math.floor(seconds / unit);\n            seconds -= unitMultiplicity * unit;\n            out += Number(unitMultiplicity) + key;\n        }\n    }\n    return out;\n  }\n}\n"
  },
  {
    "path": "src/angular/src/app/common/file-size.pipe.ts",
    "content": "import { Pipe, PipeTransform } from \"@angular/core\";\n\n/*\n * Convert bytes into largest possible unit.\n * Takes an precision argument that defaults to 2.\n * Usage:\n *   bytes | fileSize:precision\n * Example:\n *   {{ 1024 |  fileSize}}\n *   formats to: 1 KB\n * Source: https://gist.github.com/JonCatmull/ecdf9441aaa37\n *         336d9ae2c7f9cb7289a#file-file-size-pipe-ts\n*/\n@Pipe({name: \"fileSize\"})\nexport class FileSizePipe implements PipeTransform {\n\n  private units = [\n    \"B\",\n    \"KB\",\n    \"MB\",\n    \"GB\",\n    \"TB\",\n    \"PB\"\n  ];\n\n  transform(bytes: number = 0, precision: number = 2 ): string {\n    if ( isNaN( parseFloat( String(bytes) )) || ! isFinite( bytes ) ) { return \"?\"; }\n\n    let unit = 0;\n\n    while ( bytes >= 1024 ) {\n      bytes /= 1024;\n      unit ++;\n    }\n\n    return Number(bytes.toPrecision( + precision )) + \" \" + this.units[ unit ];\n  }\n}\n"
  },
  {
    "path": "src/angular/src/app/common/localization.ts",
    "content": "export class Localization {\n    static Error = class {\n        public static readonly SERVER_DISCONNECTED = \"Lost connection to the SeedSync service.\";\n    };\n\n    static Notification = class {\n        public static readonly CONFIG_RESTART = \"Restart the app to apply new settings.\";\n        public static readonly CONFIG_VALUE_BLANK =\n            (section: string, option: string) => `Setting ${section}.${option} cannot be blank.`\n\n        public static readonly AUTOQUEUE_PATTERN_EMPTY = \"Cannot add an empty autoqueue pattern.\";\n\n        public static readonly STATUS_CONNECTION_WAITING = \"Waiting for SeedSync service to respond...\";\n        public static readonly STATUS_REMOTE_SCAN_WAITING = \"Waiting for remote server to respond...\";\n        public static readonly STATUS_REMOTE_SERVER_ERROR = (error: string) =>\n            `Lost connection to remote server. Retrying automatically. \\\n             ${error ? \"<br />\" + error : \"\"}`\n\n        public static readonly NEW_VERSION_AVAILABLE = (url: string) =>\n            `A new version of SeedSync is available! \\\n             Click <a href=\"${url}\" target=\"blank\">here</a> to grab the latest version.`\n    };\n\n    static Modal = class {\n        public static readonly DELETE_LOCAL_TITLE = \"Delete Local File\";\n        public static readonly DELETE_LOCAL_MESSAGE =\n            (name: string) => `Are you sure you want to delete <b>${name}</b> from the local server?`\n\n        public static readonly DELETE_REMOTE_TITLE = \"Delete Remote File\";\n        public static readonly DELETE_REMOTE_MESSAGE =\n            (name: string) => `Are you sure you want to delete <b>${name}</b> from the remote server?`\n    };\n\n    static Log = class {\n        public static readonly CONNECTED = \"Connected to service\";\n        public static readonly DISCONNECTED = \"Lost connection to service\";\n    };\n}\n"
  },
  {
    "path": "src/angular/src/app/common/storage-keys.ts",
    "content": "export class StorageKeys {\n    public static readonly VIEW_OPTION_SHOW_DETAILS = \"view-option-show-details\";\n    public static readonly VIEW_OPTION_SORT_METHOD = \"view-option-sort-method\";\n    public static readonly VIEW_OPTION_PIN = \"view-option-pin\";\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.html",
    "content": "<div id=\"about\">\n    <div id=\"wrapper\">\n        <div id=\"banner\">\n            <img src=\"assets/logo.png\" alt=\"SeedSync\" />\n            <span><b>Seed</b>Sync</span>\n        </div>\n        <div id=\"version\">v{{version}}</div>\n        <div id=\"copyright\">Copyright © 2017-2020 Inderpreet Singh</div>\n        <div id=\"github\">\n            Source available on\n            <a target=\"_blank\" href=\"https://github.com/ipsingh06/seedsync\">Github</a>\n        </div>\n        <div id=\"icons\">\n            Icons by Freepik, Yannick, Dave Gandy, Google and Smashicons from\n            <a target=\"_blank\" href=\"https://www.flaticon.com/\">Flaticon</a>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.scss",
    "content": "@import '../../common/common';\n\n#about {\n    display: flex;\n    justify-content: center;\n\n    #wrapper {\n        margin-top: 50px;\n        text-align: center;\n\n        #banner {\n            display: flex;\n            align-items: center;\n\n            img {\n                max-width: 80px;\n                max-height: 80px;\n            }\n            span {\n                margin-left: 10px;\n                color: $logo-color;\n                font-family: $logo-font;\n                font-size: 300%;\n                cursor: default;\n                user-select: none;\n            }\n        }\n\n        #version {\n            font-size: 150%;\n        }\n\n        #icons {\n            font-size: 80%;\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/about/about-page.component.ts",
    "content": "import {Component} from \"@angular/core\";\n\ndeclare function require(moduleName: string): any;\nconst { version: appVersion } = require('../../../../package.json');\n\n@Component({\n    selector: \"app-about-page\",\n    templateUrl: \"./about-page.component.html\",\n    styleUrls: [\"./about-page.component.scss\"],\n    providers: [],\n})\n\nexport class AboutPageComponent {\n\n    public version: string;\n\n    constructor() {\n        this.version = appVersion;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.html",
    "content": "<div id=\"autoqueue\">\n    <span id=\"description\" *ngIf=\"connected\">\n\n        <ng-container *ngIf=\"enabled && patternsOnly\">\n            Files matching these patterns will be automatically queued.\n            Wildcards (*) are supported. <br />\n            Add/Remove these patterns below.\n        </ng-container>\n\n        <ng-container *ngIf=\"enabled && !patternsOnly\">\n            Patterns are disabled. <b>All files will be auto-queued.</b><br />\n            To restrict which files are auto-queued, enable patterns in Settings.\n        </ng-container>\n\n        <ng-container *ngIf=\"!enabled\">\n            Auto-Queue is disabled. <br />\n            Enable AutoQueue in Settings to queue files automatically.\n        </ng-container>\n    </span>\n    <div id=\"controls\" [attr.disabled]=\"enabled && patternsOnly ? null : true\">\n        <div *ngFor=\"let pattern of patterns | async\"\n             class=\"pattern\">\n            <div class=\"button\" appClickStopPropagation\n                 [attr.disabled]=\"enabled && patternsOnly ? null : true\"\n                 (click)=\"!(enabled && patternsOnly) || onRemovePattern(pattern)\">\n                <span>&#8722;</span>\n            </div>\n            <span class=\"text\">{{pattern.pattern}}</span>\n        </div>\n        <div id=\"add-pattern\">\n            <div class=\"button\" appClickStopPropagation\n                 (click)=\"!(newPattern && enabled && patternsOnly) || onAddPattern()\"\n                 [attr.disabled]=\"newPattern && enabled && patternsOnly ? null : true\">\n                <span>&#43;</span>\n            </div>\n            <label>\n                <input type=\"search\"\n                       class=\"form-control\"\n                       (keyup.enter)=\"!(newPattern && enabled && patternsOnly) || onAddPattern()\"\n                       [(ngModel)]=\"newPattern\"\n                       [disabled]=\"!connected || !enabled || !patternsOnly\"/>\n            </label>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.scss",
    "content": "@import '../../common/common';\n\n#autoqueue {\n    padding: 15px;\n\n    #description {\n        font-size: 100%;\n    }\n\n    #controls {\n        &[disabled] {\n            opacity: .65;\n        }\n\n        .pattern,\n        #add-pattern {\n            display: flex;\n            flex-direction: row;\n            flex-wrap: nowrap;\n            align-items: center;\n            margin: 10px;\n\n            .button {\n                @extend %button;\n\n                flex-grow: 0;\n                flex-direction: row;\n                padding: 8px;\n                margin-right: 12px;\n                height: 35px;\n                width: 35px;\n\n                span {\n                    font-size: 220%;\n                    font-weight: 900;\n                }\n            }\n        }\n\n        .pattern {\n            .text {\n                font-size: 100%;\n                font-family: monospace;\n                white-space: pre-wrap;\n\n                /* break up long text */\n                overflow-wrap: normal;\n                hyphens: auto;\n                word-break: break-all;\n            }\n\n            .button {\n                background-color: red;\n                border-color: darkred;\n\n                &:active {\n                    background-color: darkred;\n                }\n\n                &[disabled] {\n                    opacity: .65;\n                    background-color: red;\n                }\n            }\n        }\n\n        #add-pattern {\n            .button {\n                background-color: green;\n                border-color: darkgreen;\n\n                &:active {\n                    background-color: darkgreen;\n                }\n\n                &[disabled] {\n                    opacity: .65;\n                    background-color: green;\n                }\n            }\n\n            label {\n                margin-bottom: 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/autoqueue/autoqueue-page.component.ts",
    "content": "import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable\";\n\nimport {AutoQueueService} from \"../../services/autoqueue/autoqueue.service\";\nimport {AutoQueuePattern} from \"../../services/autoqueue/autoqueue-pattern\";\nimport {Notification} from \"../../services/utils/notification\";\nimport {NotificationService} from \"../../services/utils/notification.service\";\nimport {ConnectedService} from \"../../services/utils/connected.service\";\nimport {StreamServiceRegistry} from \"../../services/base/stream-service.registry\";\nimport {Config} from \"../../services/settings/config\";\nimport {ConfigService} from \"../../services/settings/config.service\";\n\n\n@Component({\n    selector: \"app-autoqueue-page\",\n    templateUrl: \"./autoqueue-page.component.html\",\n    styleUrls: [\"./autoqueue-page.component.scss\"],\n    providers: [],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class AutoQueuePageComponent implements OnInit {\n\n    public patterns: Observable<Immutable.List<AutoQueuePattern>>;\n    public newPattern: string;\n\n    public config: Observable<Config>;\n\n    public connected: boolean;\n    public enabled: boolean;\n    public patternsOnly: boolean;\n\n    private _connectedService: ConnectedService;\n\n    constructor(private _changeDetector: ChangeDetectorRef,\n                private _autoqueueService: AutoQueueService,\n                private _notifService: NotificationService,\n                private _configService: ConfigService,\n                _streamServiceRegistry: StreamServiceRegistry) {\n        this._connectedService = _streamServiceRegistry.connectedService;\n        this.patterns = _autoqueueService.patterns;\n        this.newPattern = \"\";\n        this.connected = false;\n        this.enabled = false;\n        this.patternsOnly = false;\n    }\n\n    // noinspection JSUnusedGlobalSymbols\n    ngOnInit() {\n        this._connectedService.connected.subscribe({\n            next: (connected: boolean) => {\n                this.connected = connected;\n                if (!this.connected) {\n                    // Clear the input box\n                    this.newPattern = \"\";\n                }\n            }\n        });\n\n        this._configService.config.subscribe({\n            next: config => {\n                if(config != null) {\n                    this.enabled = config.autoqueue.enabled;\n                    this.patternsOnly = config.autoqueue.patterns_only;\n                } else {\n                    this.enabled = false;\n                    this.patternsOnly = false;\n                }\n                this._changeDetector.detectChanges();\n            }\n        });\n    }\n\n    onAddPattern() {\n        this._autoqueueService.add(this.newPattern).subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    // Clear the input box\n                    this.newPattern = \"\";\n                } else {\n                    // Show dismissible notification\n                    const notif = new Notification({\n                        level: Notification.Level.DANGER,\n                        dismissible: true,\n                        text: reaction.errorMessage\n                    });\n                    this._notifService.show(notif);\n                }\n            }\n        });\n    }\n\n    onRemovePattern(pattern: AutoQueuePattern) {\n        this._autoqueueService.remove(pattern.pattern).subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    // Nothing to do\n                } else {\n                    // Show dismissible notification\n                    const notif = new Notification({\n                        level: Notification.Level.DANGER,\n                        dismissible: true,\n                        text: reaction.errorMessage\n                    });\n                    this._notifService.show(notif);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.html",
    "content": "<div id=\"file-list\">\n    <div id=\"header\">\n        <div class=\"name\">Filename</div>\n        <div class=\"status\">Status</div>\n        <div class=\"speed\">Speed</div>\n        <div class=\"eta\">ETA</div>\n        <div class=\"size\">Size</div>\n    </div>\n    <div *ngFor=\"let file of files | async; trackBy: identify\">\n        <app-file\n            [file]=\"file\"\n            [options]=\"options\"\n            (click)=\"onSelect(file)\"\n            (queueEvent)=\"onQueue($event)\"\n            (stopEvent)=\"onStop($event)\"\n            (extractEvent)=\"onExtract($event)\"\n            (deleteLocalEvent)=\"onDeleteLocal($event)\"\n            (deleteRemoteEvent)=\"onDeleteRemote($event)\">\n        </app-file>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.scss",
    "content": "@import '../../common/common';\n\n#file-list #header {\n    display: none;\n}\n\n/* striped rows */\n#file-list > div:nth-child(even){\n    background-color: $primary-lighter-color;\n}\n\n/* list separator */\n#file-list > div {border-bottom: 1px solid #ddd;}\n#file-list > div:last-child{border-bottom: none;}\n\n\n/* Medium and large screens */\n@media only screen and (min-width: $medium-min-width) {\n    #file-list #header {\n        display: flex;\n    }\n\n    /* width */\n    /* NOTE: make sure this is in-sync with \".file .content\" */\n    #header .status     {width: 100px; min-width: 100px;}\n    #header .name       {flex-grow: 1;}\n    #header .speed      {width: 100px; min-width: 100px;}\n    #header .eta        {width: 100px; min-width: 100px;}\n    #header .size       {width: 30%; min-width: 30%;}\n\n    /* header and content elements */\n    #header > div, .content > div {\n        padding: 8px 8px;\n        text-align: center;\n        vertical-align: top;\n    }\n    #header .name, .content .name {text-align: left;}\n\n    /* header color */\n    #header div {\n        font-weight: bold;\n        color: #fff;\n        background-color: #000;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-list.component.ts",
    "content": "import {Component, ChangeDetectionStrategy} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {List} from \"immutable\";\n\nimport {ViewFileService} from \"../../services/files/view-file.service\";\nimport {ViewFile} from \"../../services/files/view-file\";\nimport {LoggerService} from \"../../services/utils/logger.service\";\nimport {ViewFileOptions} from \"../../services/files/view-file-options\";\nimport {ViewFileOptionsService} from \"../../services/files/view-file-options.service\";\n\n@Component({\n    selector: \"app-file-list\",\n    providers: [],\n    templateUrl: \"./file-list.component.html\",\n    styleUrls: [\"./file-list.component.scss\"],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class FileListComponent {\n    public files: Observable<List<ViewFile>>;\n    public identify = FileListComponent.identify;\n    public options: Observable<ViewFileOptions>;\n\n    constructor(private _logger: LoggerService,\n                private viewFileService: ViewFileService,\n                private viewFileOptionsService: ViewFileOptionsService) {\n        this.files = viewFileService.filteredFiles;\n        this.options = this.viewFileOptionsService.options;\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    /**\n     * Used for trackBy in ngFor\n     * @param index\n     * @param item\n     */\n    static identify(index: number, item: ViewFile): string {\n        return item.name;\n    }\n\n    onSelect(file: ViewFile): void {\n        if (file.isSelected) {\n            this.viewFileService.unsetSelected();\n        } else {\n            this.viewFileService.setSelected(file);\n        }\n    }\n\n    onQueue(file: ViewFile) {\n        this.viewFileService.queue(file).subscribe(data => {\n            this._logger.info(data);\n        });\n    }\n\n    onStop(file: ViewFile) {\n        this.viewFileService.stop(file).subscribe(data => {\n            this._logger.info(data);\n        });\n    }\n\n    onExtract(file: ViewFile) {\n        this.viewFileService.extract(file).subscribe(data => {\n            this._logger.info(data);\n        });\n    }\n\n    onDeleteLocal(file: ViewFile) {\n        this.viewFileService.deleteLocal(file).subscribe(data => {\n            this._logger.info(data);\n        });\n    }\n\n    onDeleteRemote(file: ViewFile) {\n        this.viewFileService.deleteRemote(file).subscribe(data => {\n            this._logger.info(data);\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.html",
    "content": "<div id=\"file-options\"\n     [style.top.px]=\"headerHeight | async\"\n     [class.sticky]=\"(options | async)?.pinFilter\">\n    <div id=\"filter-search\">\n        <img src=\"assets/icons/search.svg\" />\n        <div class=\"input-group\">\n            <input class=\"form-control\" placeholder=\"Filter by name...\" type=\"search\"\n                   [ngModel]=\"(options | async)?.nameFilter\"\n                   (ngModelChange)=\"onFilterByName($event)\">\n        </div>\n    </div>\n\n    <div id=\"filter-status\" class=\"dropdown\" >\n        <button class=\"btn btn-secondary dropdown-toggle\"\n                type=\"button\"\n                data-toggle=\"dropdown\">\n            <div class=\"title\">\n                Status:\n            </div>\n            <div class=\"selection\">\n                <!-- these divs only show the selected option -->\n                <div class=\"sel-item\" id=\"sel-item-all\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == null\">\n                    <div class=\"icon\"></div>\n                    <span class=\"text\">All</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.EXTRACTED\">\n                    <div class=\"icon\"><img src=\"assets/icons/extracted.svg\" class=\"extracted\" /></div>\n                    <span class=\"text\">Extracted</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.EXTRACTING\">\n                    <div class=\"icon\"><img src=\"assets/icons/extracting.svg\" class=\"extracting\" /></div>\n                    <span class=\"text\">Extracting</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.DOWNLOADED\">\n                    <div class=\"icon\"><img src=\"assets/icons/downloaded.svg\" class=\"downloaded\" /></div>\n                    <span class=\"text\">Downloaded</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.DOWNLOADING\">\n                    <div class=\"icon\"><img src=\"assets/icons/downloading.svg\" class=\"downloading\" /></div>\n                    <span class=\"text\">Downloading</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.QUEUED\">\n                    <div class=\"icon\"><img src=\"assets/icons/queued.svg\" class=\"queued\" /></div>\n                    <span class=\"text\">Queued</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.selectedStatusFilter == ViewFile.Status.STOPPED\">\n                    <div class=\"icon\"><img src=\"assets/icons/stopped.svg\" class=\"stopped\" /></div>\n                    <span class=\"text\">Stopped</span>\n                </div>\n            </div>\n        </button>\n        <div class=\"dropdown-menu\">\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == null\"\n                 (click)=\"onFilterByStatus(null)\">\n                <div class=\"icon\"></div>\n                <span class=\"text\">All</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.EXTRACTED\"\n                 [class.disabled]=\"isExtractedStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.EXTRACTED)\">\n                <div class=\"icon\"><img src=\"assets/icons/extracted.svg\" class=\"extracted\" /></div>\n                <span class=\"text\">Extracted</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.EXTRACTING\"\n                 [class.disabled]=\"isExtractingStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.EXTRACTING)\">\n                <div class=\"icon\"><img src=\"assets/icons/extracting.svg\" class=\"extracting\" /></div>\n                <span class=\"text\">Extracting</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.DOWNLOADED\"\n                 [class.disabled]=\"isDownloadedStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.DOWNLOADED)\">\n                <div class=\"icon\"><img src=\"assets/icons/downloaded.svg\" class=\"downloaded\" /></div>\n                <span class=\"text\">Downloaded</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.DOWNLOADING\"\n                 [class.disabled]=\"isDownloadingStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.DOWNLOADING)\">\n                <div class=\"icon\"><img src=\"assets/icons/downloading.svg\" class=\"downloading\" /></div>\n                <span class=\"text\">Downloading</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.QUEUED\"\n                 [class.disabled]=\"isQueuedStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.QUEUED)\">\n                <div class=\"icon\"><img src=\"assets/icons/queued.svg\" class=\"queued\" /></div>\n                <span class=\"text\">Queued</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.selectedStatusFilter == ViewFile.Status.STOPPED\"\n                 [class.disabled]=\"isStoppedStatusEnabled ? null : true\"\n                 (click)=\"onFilterByStatus(ViewFile.Status.STOPPED)\">\n                <div class=\"icon\"><img src=\"assets/icons/stopped.svg\" class=\"stopped\" /></div>\n                <span class=\"text\">Stopped</span>\n            </div>\n        </div>\n    </div>\n\n    <div id=\"sort-status\" class=\"dropdown\" >\n        <button class=\"btn btn-secondary dropdown-toggle\"\n                type=\"button\"\n                data-toggle=\"dropdown\">\n            <div class=\"title\">\n                Sort:\n            </div>\n            <div class=\"selection\">\n                <!-- these divs only show the selected option -->\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.STATUS\">\n                    <div class=\"icon\"><img src=\"assets/icons/states.svg\" class=\"states\" /></div>\n                    <span class=\"text\">Status</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.NAME_ASC\">\n                    <div class=\"icon\"><img src=\"assets/icons/sort-asc.svg\" class=\"sort-asc\" /></div>\n                    <span class=\"text\">Name A&#8594;Z</span>\n                </div>\n                <div class=\"sel-item\"\n                     *ngIf=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.NAME_DESC\">\n                    <div class=\"icon\"><img src=\"assets/icons/sort-desc.svg\" class=\"sort-desc\" /></div>\n                    <span class=\"text\">Name Z&#8594;A</span>\n                </div>\n            </div>\n        </button>\n        <div class=\"dropdown-menu\">\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.STATUS\"\n                 (click)=\"onSort(ViewFileOptions.SortMethod.STATUS)\">\n                <div class=\"icon\"><img src=\"assets/icons/states.svg\" class=\"states\" /></div>\n                <span class=\"text\">Status</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.NAME_ASC\"\n                 (click)=\"onSort(ViewFileOptions.SortMethod.NAME_ASC)\">\n                <div class=\"icon\"><img src=\"assets/icons/sort-asc.svg\" class=\"sort-asc\" /></div>\n                <span class=\"text\">Name A&#8594;Z</span>\n            </div>\n            <div class=\"dropdown-item\"\n                 [class.active]=\"(options | async)?.sortMethod === ViewFileOptions.SortMethod.NAME_DESC\"\n                 (click)=\"onSort(ViewFileOptions.SortMethod.NAME_DESC)\">\n                <div class=\"icon\"><img src=\"assets/icons/sort-desc.svg\" class=\"sort-desc\" /></div>\n                <span class=\"text\">Name Z&#8594;A</span>\n            </div>\n        </div>\n    </div>\n\n    <button id=\"toggle-details\"\n            type=\"button\"\n            class=\"btn btn-primary\"\n            [class.active]=\"(options | async)?.showDetails\"\n            (click)=\"onToggleShowDetails()\">\n        <div class=\"title\">\n            Details:\n        </div>\n        <div class=\"selection\">\n            <!-- these divs only show the selected option -->\n            <div class=\"sel-item\" *ngIf=\"(options | async)?.showDetails\">\n                <div class=\"icon\"></div>\n                <span class=\"text\">Show</span>\n            </div>\n            <div class=\"sel-item\" *ngIf=\"!(options | async)?.showDetails\">\n                <div class=\"icon\"></div>\n                <span class=\"text\">Hide</span>\n            </div>\n        </div>\n    </button>\n\n    <div id=\"small-buttons\">\n        <button id=\"pin-filter\"\n                type=\"button\"\n                class=\"btn btn-primary\"\n                [class.active]=\"(options | async)?.pinFilter\"\n                (click)=\"onTogglePinFilter()\">\n            <i class=\"fa fa-thumb-tack\"></i>\n        </button>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.scss",
    "content": "@import '../../common/common';\n\n// Common dropdown template\n%dropdown {\n    button {\n        background-color: $primary-color;\n        color: white;\n        height: 34px;\n        width: 100%;\n        cursor: default;\n        user-select: none;\n\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        flex-wrap: nowrap;\n\n        .selection {\n            margin-left: 5px;\n\n            .sel-item {\n                display: flex;\n                flex-direction: row;\n                align-items: center;\n                flex-wrap: nowrap;\n\n                .icon {\n                    width: 20px;\n                    height: 20px;\n                }\n                .text {\n                    margin-left: 5px;\n                    display: none;\n                }\n            }\n        }\n    }\n\n    .dropdown-menu {\n        background-color: $primary-color;\n        border: 1px solid $primary-dark-color;\n        color: white;\n        padding: 0;\n        cursor: default;\n        user-select: none;\n\n        .dropdown-item {\n            color: white;\n            height: 32px;\n\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            flex-wrap: nowrap;\n\n            &.active,\n            &.active:hover {\n                background-color: $secondary-dark-color;\n            }\n\n            &:hover,\n            &:active {\n                background-color: $primary-color;\n            }\n\n            &.disabled {\n                opacity: .65;\n                background-color: $primary-color;\n            }\n\n            .icon {\n                width: 20px;\n                height: 20px;\n            }\n            .text {\n                margin-left: 5px;\n            }\n        }\n    }\n\n    // Applies to both button and menu images\n    .icon {\n        // Set flex on outer div to center the image\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: center;\n\n        img {\n            width: 15px;\n            height: 15px;\n            filter: invert(1.0);\n            margin-top: -2px;\n\n            &.downloaded,\n            &.downloading {\n                width: 20px;\n            }\n            &.stopped {\n                width: 13px;\n            }\n        }\n    }\n}\n\n\n%toggle {\n    background-color: $primary-color;\n    border: 1px solid $primary-dark-color;\n    color: white;\n    height: 34px;\n    cursor: default;\n    user-select: none;\n\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex-wrap: nowrap;\n\n    &.active,\n    &.active:hover{\n        background-color: $secondary-dark-color;\n        border-color: $secondary-darker-color;\n    }\n\n    &:hover,\n    &:active {\n        background-color: $primary-color;\n    }\n\n    &.disabled {\n        opacity: .65;\n        background-color: $primary-color;\n    }\n\n    .selection {\n        margin-left: 5px;\n\n        .sel-item {\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            flex-wrap: nowrap;\n\n            .icon {\n                width: 20px;\n                height: 20px;\n            }\n            .text {\n                margin-left: 5px;\n            }\n        }\n    }\n}\n\n\n#file-options {\n    position: static;\n    z-index: $zindex-file-options;\n    background-color: $header-color;\n    padding: 0 8px 8px 8px;\n\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n\n    // Controls whether the div is sticky\n    // This class is enabled programmatically\n    &.sticky {\n        position: sticky;\n        // note: top is set programmatically\n    }\n\n    #filter-search {\n        flex-grow: 1;\n        flex-basis: 100%;\n\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        flex-wrap: wrap;\n        position: relative;\n\n        img {\n            width: 20px;\n            height: 20px;\n            position: absolute;\n            left: 7px;\n            top: 7px;\n            z-index: $zindex-file-search;\n            filter: invert(0.8666);\n        }\n\n        input {\n            border-radius: 5px;\n            padding: 3px 15px 3px 30px;\n            width: 100%;\n        }\n\n        .input-group{\n            flex-grow: 1;\n            display: inline;\n        }\n    }\n\n    #filter-status {\n        @extend %dropdown;\n\n        .selection {\n            .sel-item {\n                // Selection item for 'All' option\n                &#sel-item-all {\n                    .icon {\n                        display: none;\n                    }\n                    .text {\n                        display: inherit;\n                        margin-left: 0;\n                    }\n                }\n            }\n        }\n\n        // Applies to both button and menu images\n        .icon {\n            img {\n                &.downloaded,\n                &.downloading {\n                    width: 20px;\n                }\n                &.stopped {\n                    width: 13px;\n                }\n            }\n        }\n    }\n\n    #sort-status {\n        @extend %dropdown;\n\n        // Applies to both button and menu images\n        .icon {\n        }\n    }\n\n    #toggle-details {\n        @extend %toggle;\n\n        // Hide the selection icons for this button\n        .selection {\n            .sel-item {\n                .icon {\n                    display: none;\n                }\n                .text {\n                    margin-left: 0;\n                }\n            }\n        }\n    }\n\n    #small-buttons {\n        flex-grow: 1;\n        padding-top: 5px;\n\n        display: flex;\n        flex-direction: row;\n        justify-content: flex-end;\n\n        #pin-filter {\n            @extend %toggle;\n\n            width: 20px;\n            height: 20px;\n            padding: 0;\n\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            justify-content: center;\n        }\n    }\n\n    // Margins for all the buttons\n    #filter-status,\n    #sort-status,\n    #toggle-details {\n        margin-top: 10px;\n    }\n\n    // Margins for the non-first buttons\n    #sort-status,\n    #toggle-details {\n        margin-left: 5px;\n    }\n}\n\n\n/* Medium and large screens */\n@media only screen and (min-width: $medium-min-width) {\n    %dropdown {\n        button {\n            .selection {\n                .sel-item {\n                    .text {\n                        // Show the text labels in selection\n                        display: inherit;\n                    }\n                }\n            }\n        }\n    }\n\n    // Margins for the non-first buttons\n    #sort-status,\n    #toggle-details {\n        margin-left: 10px;\n    }\n}\n\n// Large screens\n@media only screen and (min-width: $large-min-width) {\n    // Bit of extra padding at top when title disappears\n    #file-options {\n        padding-top: 8px;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file-options.component.ts",
    "content": "import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ViewFileOptionsService} from \"../../services/files/view-file-options.service\";\nimport {ViewFileOptions} from \"../../services/files/view-file-options\";\nimport {ViewFile} from \"../../services/files/view-file\";\nimport {ViewFileService} from \"../../services/files/view-file.service\";\nimport {DomService} from \"../../services/utils/dom.service\";\n\n@Component({\n    selector: \"app-file-options\",\n    providers: [],\n    templateUrl: \"./file-options.component.html\",\n    styleUrls: [\"./file-options.component.scss\"],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class FileOptionsComponent implements OnInit {\n    public ViewFile = ViewFile;\n    public ViewFileOptions = ViewFileOptions;\n\n    public options: Observable<ViewFileOptions>;\n    public headerHeight: Observable<number>;\n\n    // These track which status filters are enabled\n    public isExtractedStatusEnabled = false;\n    public isExtractingStatusEnabled = false;\n    public isDownloadedStatusEnabled = false;\n    public isDownloadingStatusEnabled = false;\n    public isQueuedStatusEnabled = false;\n    public isStoppedStatusEnabled = false;\n\n    private _latestOptions: ViewFileOptions;\n\n    constructor(private _changeDetector: ChangeDetectorRef,\n                private viewFileOptionsService: ViewFileOptionsService,\n                private _viewFileService: ViewFileService,\n                private _domService: DomService) {\n        this.options = this.viewFileOptionsService.options;\n        this.headerHeight = this._domService.headerHeight;\n    }\n\n    ngOnInit() {\n        // Use the unfiltered files to enable/disable the filter status buttons\n        this._viewFileService.files.subscribe(files => {\n            this.isExtractedStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.EXTRACTED\n            );\n            this.isExtractingStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.EXTRACTING\n            );\n            this.isDownloadedStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.DOWNLOADED\n            );\n            this.isDownloadingStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.DOWNLOADING\n            );\n            this.isQueuedStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.QUEUED\n            );\n            this.isStoppedStatusEnabled = FileOptionsComponent.isStatusEnabled(\n                files, ViewFile.Status.STOPPED\n            );\n            this._changeDetector.detectChanges();\n        });\n\n        // Keep the latest options for toggle behaviour implementation\n        this.viewFileOptionsService.options.subscribe(options => this._latestOptions = options);\n    }\n\n    onFilterByName(name: string) {\n        this.viewFileOptionsService.setNameFilter(name);\n    }\n\n    onFilterByStatus(status: ViewFile.Status) {\n        this.viewFileOptionsService.setSelectedStatusFilter(status);\n    }\n\n    onSort(sortMethod: ViewFileOptions.SortMethod) {\n        this.viewFileOptionsService.setSortMethod(sortMethod);\n    }\n\n    onToggleShowDetails(){\n        this.viewFileOptionsService.setShowDetails(!this._latestOptions.showDetails);\n    }\n\n    onTogglePinFilter() {\n        this.viewFileOptionsService.setPinFilter(!this._latestOptions.pinFilter);\n    }\n\n    private static isStatusEnabled(files: Immutable.List<ViewFile>, status: ViewFile.Status) {\n        return files.findIndex(f => f.status === status) >= 0;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.html",
    "content": "<div class=\"file\" [class.selected]=\"file.isSelected\" #fileElement>\n    <div class=\"content\">\n        <div class=\"status\">\n            <img src=\"assets/icons/default-remote.svg\" id=\"default-remote\"\n                 *ngIf=\"file.status === ViewFile.Status.DEFAULT && file.remoteSize > 0\" />\n            <img src=\"assets/icons/queued.svg\" id=\"queued\"\n                 *ngIf=\"file.status === ViewFile.Status.QUEUED\" />\n            <img src=\"assets/icons/downloading.svg\" id=\"downloading\"\n                 *ngIf=\"file.status === ViewFile.Status.DOWNLOADING\" />\n            <img src=\"assets/icons/downloaded.svg\" id=\"downloaded\"\n                 *ngIf=\"file.status === ViewFile.Status.DOWNLOADED\" />\n            <img src=\"assets/icons/stopped.svg\" id=\"stopped\"\n                 *ngIf=\"file.status === ViewFile.Status.STOPPED\" />\n            <img src=\"assets/icons/deleted.svg\" id=\"deleted\"\n                 *ngIf=\"file.status === ViewFile.Status.DELETED\" />\n            <img src=\"assets/icons/extracting.svg\" id=\"extracting\"\n                 *ngIf=\"file.status === ViewFile.Status.EXTRACTING\" />\n            <img src=\"assets/icons/extracted.svg\" id=\"extracted\"\n                 *ngIf=\"file.status === ViewFile.Status.EXTRACTED\" />\n            <!-- don't show text for default status -->\n            <span *ngIf=\"file.status != ViewFile.Status.DEFAULT\"\n                  class=\"text\">{{file.status | capitalize}}</span>\n        </div>\n        <div class=\"name\">\n            <img src=\"assets/icons/file-light.svg\" *ngIf=\"!file.isDir && !file.isArchive\" />\n            <img src=\"assets/icons/file-archive-light.svg\" *ngIf=\"!file.isDir && file.isArchive\" />\n            <img src=\"assets/icons/directory-light.svg\" *ngIf=\"file.isDir && !file.isArchive\" />\n            <img src=\"assets/icons/directory-archive-light.svg\" *ngIf=\"file.isDir && file.isArchive\" />\n            <div class=\"text\">\n                <div class=\"title\">\n                    {{file.name}}\n                </div>\n                <div class=\"details\" *ngIf=\"(options | async)?.showDetails\">\n                    <div class=\"details-text\">\n                        Remote File<br />\n                        <span class=\"tab\"></span>Created:\n                            {{(file.remoteCreatedTimestamp | date: 'EEE, MMM d yyyy, h:mm:ss a') ||\n                               \"Not Available\"}}<br />\n                        <span class=\"tab\"></span>Modified:\n                            {{(file.remoteModifiedTimestamp | date: 'EEE, MMM d yyyy, h:mm:ss a') ||\n                               \"Not Available\"}}<br />\n                        Local File <br />\n                        <span class=\"tab\"></span>Created:\n                            {{(file.localCreatedTimestamp | date: 'EEE, MMM d yyyy, h:mm:ss a') ||\n                               \"Not Available\"}}<br />\n                        <span class=\"tab\"></span>Modified:\n                            {{(file.localModifiedTimestamp | date: 'EEE, MMM d yyyy, h:mm:ss a') ||\n                               \"Not Available\"}}\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"speed\">\n            <span *ngIf=\"file.downloadingSpeed\">{{file.downloadingSpeed | fileSize:3}}/s</span>\n            <!-- for mobile layout -->\n            <div class=\"speed-eta\">\n                <span *ngIf=\"file.status === ViewFile.Status.DOWNLOADING\">eta: {{file.eta | eta}}</span>\n            </div>\n        </div>\n        <!-- for desktop layout -->\n        <div class=\"eta\">\n            <span *ngIf=\"file.status === ViewFile.Status.DOWNLOADING\">{{file.eta | eta}}</span>\n        </div>\n        <div class=\"size\">\n            <div class=\"progress\">\n                <div class=\"progress-bar\" role=\"progressbar\"\n                     [class.progress-bar-animated]=\"\n                        file.status === ViewFile.Status.DOWNLOADING ||\n                        file.status === ViewFile.Status.EXTRACTING\n                     \"\n                     [class.progress-bar-striped]=\"\n                        file.status === ViewFile.Status.DOWNLOADING ||\n                        file.status === ViewFile.Status.EXTRACTING\n                     \"\n                     [attr.aria-valuenow]=\"file.percentDownloaded\" aria-valuemin=\"0\" aria-valuemax=\"100\"\n                     [style.width]=\"\n                        min(file.percentDownloaded,100) + '%'\n                     \">\n                    {{file.percentDownloaded}}%\n                </div>\n            </div>\n            <div class=\"size_info\">\n                {{file.localSize | fileSize:3}} of {{file.remoteSize | fileSize:3}}\n            </div>\n        </div>\n    </div>\n\n    <!-- actions div, visible on selection -->\n    <div class=\"actions\">\n        <div class=\"button\" appClickStopPropagation\n             [attr.disabled]=\"isQueueable() ? null : true\"\n             (click)=\"!isQueueable() || onQueue(file)\"\n             [class.loading]=\"activeAction == FileAction.QUEUE\">\n            <div class=\"loader\"></div>\n            <img src=\"assets/icons/queue.svg\" />\n            <div class=\"text\"><span>Queue</span></div>\n        </div>\n        <div class=\"button\" appClickStopPropagation\n             [attr.disabled]=\"isStoppable() ? null : true\"\n             (click)=\"!isStoppable() || onStop(file)\"\n             [class.loading]=\"activeAction == FileAction.STOP\">\n            <div class=\"loader\"></div>\n            <img src=\"assets/icons/stop.svg\" />\n            <div class=\"text\"><span>Stop</span></div>\n        </div>\n        <div class=\"button\" appClickStopPropagation\n             [attr.disabled]=\"isExtractable() ? null : true\"\n             (click)=\"!isExtractable() || onExtract(file)\"\n             [class.loading]=\"activeAction == FileAction.EXTRACT\">\n            <div class=\"loader\"></div>\n            <img src=\"assets/icons/extract.svg\" />\n            <div class=\"text\"><span>Extract</span></div>\n        </div>\n        <div class=\"button\" appClickStopPropagation\n             [attr.disabled]=\"isLocallyDeletable() ? null : true\"\n             (click)=\"!isLocallyDeletable() || onDeleteLocal(file)\"\n             [class.loading]=\"activeAction == FileAction.DELETE_LOCAL\">\n            <div class=\"loader\"></div>\n            <img src=\"assets/icons/delete-local.svg\" />\n            <div class=\"text\"><span>Delete Local</span></div>\n        </div>\n        <div class=\"button\" appClickStopPropagation\n             [attr.disabled]=\"isRemotelyDeletable() ? null : true\"\n             (click)=\"!isRemotelyDeletable() || onDeleteRemote(file)\"\n             [class.loading]=\"activeAction == FileAction.DELETE_REMOTE\">\n            <div class=\"loader\"></div>\n            <img src=\"assets/icons/delete-remote.svg\" />\n            <div class=\"text\"><span>Delete Remote</span></div>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.scss",
    "content": "@import '../../common/common';\n\n.file {\n    padding: 10px;\n}\n\n/* selected file */\n.file.selected {\n    background-color: $secondary-color;\n}\n\n/* content */\n.content {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    padding: 8px 0;\n}\n\n.content div {\n    /* break up long text */\n    overflow-wrap: normal;\n    hyphens: auto;\n    word-break: break-all;\n}\n\n/* width */\n.content .status   {width: 100px; min-width: 100px;}\n.content .name     {flex-grow: 1; flex-basis: calc(100% - 100px);}\n.content .speed    {width: 100px; min-width: 100px;}\n/* .content .eta is hidden on mobile */\n.content .size     {flex-grow: 1;}\n\n/* content elements */\n.content > div {\n    padding: 4px 4px;\n    text-align: center;\n    vertical-align: top;\n}\n.content .name {text-align: left;}\n\n/* Name */\n.content .name {\n    display: flex;\n    flex-direction: row;\n\n    img {\n        height: 20px;\n        margin-right: 8px;\n        margin-top: 1px;\n    }\n\n    .text {\n        display: flex;\n        flex-direction: column;\n\n        .details {\n            display: flex;\n            flex-direction: column;\n\n            .details-text {\n                color: darkgray;\n                font-size: 80%;\n                line-height: 120%;\n\n                .tab {\n                    margin-left: 20px;\n                }\n            }\n        }\n    }\n}\n\n/* Status */\n.content .status {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    height: 62px;\n    max-height: 62px;\n\n    img {\n        height: 35px;\n        width: 35px;\n    }\n\n    // Optical weighting\n    img#downloading, img#downloaded {\n        width: 45px;\n    }\n    img#default-remote {\n        width: 45px;\n        height: 45px;\n    }\n    img#stopped {\n        width: 30px;\n    }\n\n    .text {\n        margin-top: 3px;\n        font-size: 70%;\n    }\n}\n\n/* Speed */\n.content .speed {\n    font-size: 90%;\n}\n\n/* Progress bar */\n.content .progress-bar {\n    min-width: 2em;\n}\n.content .progress {\n    margin-bottom: 5px;\n    height: 20px;\n}\n.content .size_info {\n    font-size: 80%;\n}\n\n/* Hide the outer eta */\n.content .eta {display: none;}\n.content .speed .speed-eta {font-size: 90%;}\n\n/* actions */\n.actions {\n    width: 100%;\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-end;\n    flex-wrap: wrap;\n    /* offsets the button's margin-bottom */\n    margin-bottom: -10px;\n}\n.actions .button {\n    @extend %button;\n\n    /* bottom margin for when buttons get wrapped to multiple rows */\n    margin-bottom: 10px;\n    margin-right: 10px;\n    width: 60px;\n    min-width: 60px;\n    height: 60px;\n\n    &:last-child {\n        margin-right: 0;\n    }\n\n    .text {\n        height: 25px;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n\n        span {\n            font-size: 12px;\n            text-align: center;\n            line-height: 12px;\n        }\n    }\n\n    img {\n        width: 25px;\n        height: 25px;\n        filter: invert(1.0);\n    }\n\n    .loader {\n        display: none;\n        border: 5px solid white;\n        border-top: 5px solid $secondary-dark-color;\n        border-radius: 50%;\n        width: 25px;\n        height: 25px;\n        animation: spin 2s linear infinite;\n    }\n\n    @keyframes spin {\n        0% { transform: rotate(0deg); }\n        100% { transform: rotate(360deg); }\n    }\n\n    // Show loader icon when loading\n    &.loading {\n        opacity: 1.0;\n        background-color: $secondary-dark-color;\n        border-color: $secondary-darker-color;\n\n        img {\n            display: none;\n        }\n        .loader {\n            display: block;\n        }\n    }\n}\n\n/* action toolbar show and hide */\n.actions {\n    display: none;\n}\n.file.selected .actions {\n    display: flex;\n}\n\n\n/* Medium and large screens */\n@media only screen and (min-width: $medium-min-width) {\n    /* enable row hover */\n    .file:not(.selected):hover {\n        background-color: $secondary-light-color;\n    }\n\n    /* width */\n    /* NOTE: make sure this is in-sync with \"#file-list #header\" */\n    .content .status    {width: 100px; min-width: 100px;}\n    .content .name      {flex-grow: 1;}\n    .content .speed     {width: 100px; min-width: 100px;}\n    .content .eta       {width: 100px; min-width: 100px;}\n    .content .size      {width: 30%; min-width: 30%;}\n\n    .content {\n        /* single row */\n        flex-wrap: nowrap;\n        /* no top/bottom padding */\n        padding: 0 0;\n    }\n\n    /* Re-order columns */\n    .content .status {order: 2;}\n    .content .name {order: 1;}\n    .content .speed {order: 3;}\n    .content .eta {order: 4;}\n    .content .size {order: 5;}\n\n    /* Hide the inner eta, show outer eta */\n    .content .eta {display: inline;}\n    .content .speed .speed-eta {display: none;}\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/file.component.ts",
    "content": "import {\n    Component, Input, Output, ChangeDetectionStrategy,\n    EventEmitter, OnChanges, SimpleChanges, ViewChild\n} from \"@angular/core\";\n\nimport {Modal} from \"ngx-modialog/plugins/bootstrap\";\n\nimport {ViewFile} from \"../../services/files/view-file\";\nimport {Localization} from \"../../common/localization\";\nimport {ViewFileOptions} from \"../../services/files/view-file-options\";\n\n@Component({\n    selector: \"app-file\",\n    providers: [],\n    templateUrl: \"./file.component.html\",\n    styleUrls: [\"./file.component.scss\"],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class FileComponent implements OnChanges {\n    // Make ViewFile optionType accessible from template\n    ViewFile = ViewFile;\n\n    // Make FileAction accessible from template\n    FileAction = FileAction;\n\n    // Expose min function for template\n    min = Math.min;\n\n    // Entire div element\n    @ViewChild(\"fileElement\") fileElement: any;\n\n    @Input() file: ViewFile;\n    @Input() options: ViewFileOptions;\n\n    @Output() queueEvent = new EventEmitter<ViewFile>();\n    @Output() stopEvent = new EventEmitter<ViewFile>();\n    @Output() extractEvent = new EventEmitter<ViewFile>();\n    @Output() deleteLocalEvent = new EventEmitter<ViewFile>();\n    @Output() deleteRemoteEvent = new EventEmitter<ViewFile>();\n\n    // Indicates an active action on-going\n    activeAction: FileAction = null;\n\n    constructor(private modal: Modal) {}\n\n    ngOnChanges(changes: SimpleChanges): void {\n        // Check for status changes\n        const oldFile: ViewFile = changes.file.previousValue;\n        const newFile: ViewFile = changes.file.currentValue;\n        if (oldFile != null && newFile != null && oldFile.status !== newFile.status) {\n            // Reset any active action\n            this.activeAction = null;\n\n            // Scroll into view if this file is selected and not already in viewport\n            if (newFile.isSelected && !FileComponent.isElementInViewport(this.fileElement.nativeElement)) {\n                this.fileElement.nativeElement.scrollIntoView();\n            }\n        }\n    }\n\n    showDeleteConfirmation(title: string, message: string, callback: () => void) {\n        const dialogRef = this.modal.confirm()\n            .title(title)\n            .okBtn(\"Delete\")\n            .okBtnClass(\"btn btn-danger\")\n            .cancelBtn(\"Cancel\")\n            .cancelBtnClass(\"btn btn-secondary\")\n            .isBlocking(false)\n            .showClose(false)\n            .body(message)\n            .open();\n\n        dialogRef.then( dRef => {\n           dRef.result.then(\n               () => { callback(); },\n               () => { return; }\n           );\n        });\n    }\n\n    isQueueable() {\n        return this.activeAction == null && this.file.isQueueable;\n    }\n\n    isStoppable() {\n        return this.activeAction == null && this.file.isStoppable;\n    }\n\n    isExtractable() {\n        return this.activeAction == null && this.file.isExtractable && this.file.isArchive;\n    }\n\n    isLocallyDeletable() {\n        return this.activeAction == null && this.file.isLocallyDeletable;\n    }\n\n    isRemotelyDeletable() {\n        return this.activeAction == null && this.file.isRemotelyDeletable;\n    }\n\n    onQueue(file: ViewFile) {\n        this.activeAction = FileAction.QUEUE;\n        // Pass to parent component\n        this.queueEvent.emit(file);\n    }\n\n    onStop(file: ViewFile) {\n        this.activeAction = FileAction.STOP;\n        // Pass to parent component\n        this.stopEvent.emit(file);\n    }\n\n    onExtract(file: ViewFile) {\n        this.activeAction = FileAction.EXTRACT;\n        // Pass to parent component\n        this.extractEvent.emit(file);\n    }\n\n    onDeleteLocal(file: ViewFile) {\n        this.showDeleteConfirmation(\n            Localization.Modal.DELETE_LOCAL_TITLE,\n            Localization.Modal.DELETE_LOCAL_MESSAGE(file.name),\n            () => {\n                this.activeAction = FileAction.DELETE_LOCAL;\n                // Pass to parent component\n                this.deleteLocalEvent.emit(file);\n            }\n        );\n    }\n\n    onDeleteRemote(file: ViewFile) {\n        this.showDeleteConfirmation(\n            Localization.Modal.DELETE_REMOTE_TITLE,\n            Localization.Modal.DELETE_REMOTE_MESSAGE(file.name),\n            () => {\n                this.activeAction = FileAction.DELETE_REMOTE;\n                // Pass to parent component\n                this.deleteRemoteEvent.emit(file);\n            }\n        );\n    }\n\n    // Source: https://stackoverflow.com/a/7557433\n    private static isElementInViewport (el) {\n        const rect = el.getBoundingClientRect();\n        return (\n            rect.top >= 0 &&\n            rect.left >= 0 &&\n            rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n            rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n        );\n    }\n}\n\nexport enum FileAction {\n    QUEUE,\n    STOP,\n    EXTRACT,\n    DELETE_LOCAL,\n    DELETE_REMOTE\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/files/files-page.component.html",
    "content": "<app-file-options></app-file-options>\n<app-file-list></app-file-list>\n"
  },
  {
    "path": "src/angular/src/app/pages/files/files-page.component.ts",
    "content": "import {Component} from \"@angular/core\";\n\n@Component({\n    selector: \"app-files-page\",\n    templateUrl: \"./files-page.component.html\"\n})\n\nexport class FilesPageComponent {\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.html",
    "content": "<div id=\"logs\">\n    <!--suppress HtmlUnknownAttribute -->\n    <ng-template #templateRecord let-record=\"record\">\n        <p class=\"record\"\n            [class.debug]=\"record.level == LogRecord.Level.DEBUG\"\n            [class.info]=\"record.level == LogRecord.Level.INFO\"\n            [class.warning]=\"record.level == LogRecord.Level.WARNING\"\n            [class.error]=\"record.level == LogRecord.Level.ERROR\"\n            [class.critical]=\"record.level == LogRecord.Level.CRITICAL\">\n            {{record.time | date: 'yyyy/MM/dd HH:mm:ss'}} -\n            {{record.level}} -\n            {{record.loggerName}} -\n            {{record.message}}\n\n            <!-- Don't break this span into multiple lines, newlines show up -->\n            <span class=\"traceback\" *ngIf=\"record.exceptionTraceback\">{{record.exceptionTraceback}}</span>\n        </p>\n    </ng-template>\n\n    <button id=\"btn-scroll-top\"\n            type=\"button\"\n            class=\"btn btn-primary btn-scroll\"\n            [class.visible]=\"showScrollToTopButton\"\n            [style.top.px]=\"headerHeight | async\"\n            (click)=\"scrollToTop()\">\n        Scroll To Top\n    </button>\n\n    <div #logHead class=\"log-marker\"></div>\n\n    <!-- marks where template should be copied -->\n    <ng-container #container></ng-container>\n\n    <div #logTail class=\"log-marker\"></div>\n\n    <button id=\"btn-scroll-bottom\"\n            type=\"button\"\n            class=\"btn btn-primary btn-scroll\"\n            [class.visible]=\"showScrollToBottomButton\"\n            (click)=\"scrollToBottom()\">\n        Scroll To Bottom\n    </button>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.scss",
    "content": "@import '../../common/common';\n\n#logs {\n    padding: 5px 15px;\n    font-family: monospace;\n    font-size: 70%;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    .log-marker {\n        width: 100%;\n        height: 2px;\n    }\n\n    .btn-scroll {\n        @extend %button;\n        position: sticky;\n        display: none;\n\n        &.visible {\n            display: inherit;\n        }\n    }\n\n    #btn-scroll-top {\n        top: 0;\n    }\n    #btn-scroll-bottom {\n        bottom: 0;\n    }\n\n    p.record {\n        margin: 0;\n\n        /* break up long text */\n        overflow-wrap: normal;\n        hyphens: auto;\n        word-break: break-all;\n\n        &.debug {\n            color: darkgray;\n        }\n\n        &.info {\n            color: black;\n        }\n\n        &.warning {\n            // copied from bootstrap alert-warning\n            color: #8a6d3b;\n            background-color: #fcf8e3;\n            border-color: #faebcc;\n        }\n\n        &.error, &.critical {\n            // copied from bootstrap alert-danger\n            color: #a94442;\n            background-color: #f2dede;\n            border-color: #ebccd1;\n        }\n\n        span.traceback {\n            display: block;\n            white-space: pre-line;\n            margin-left: 30px;\n\n            /* break up long text */\n            overflow-wrap: normal;\n            hyphens: auto;\n            word-break: break-all;\n        }\n    }\n\n    .connected {\n        height: 12px;\n        width: 100%;\n        text-align: center;\n        border-bottom: 1px solid #e3e3e3;\n        margin-bottom: 15px;\n\n        span {\n            background-color: #f5f5f5;\n            font-size: 10px;\n            padding: 5px;\n        }\n    }\n}\n\n/* Medium and large screens */\n@media only screen and (min-width: $medium-min-width) {\n    #logs {\n        font-size: 95%;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/logs/logs-page.component.ts",
    "content": "import {\n    AfterContentChecked,\n    ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener,\n    OnInit, ViewChild, ViewContainerRef\n} from \"@angular/core\";\n\nimport {LogService} from \"../../services/logs/log.service\";\nimport {LogRecord} from \"../../services/logs/log-record\";\nimport {StreamServiceRegistry} from \"../../services/base/stream-service.registry\";\nimport {Localization} from \"../../common/localization\";\nimport {DomService} from \"../../services/utils/dom.service\";\nimport {Observable} from \"rxjs/Observable\";\n\n@Component({\n    selector: \"app-logs-page\",\n    templateUrl: \"./logs-page.component.html\",\n    styleUrls: [\"./logs-page.component.scss\"],\n    providers: [],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class LogsPageComponent implements OnInit, AfterContentChecked {\n    public readonly LogRecord = LogRecord;\n    public readonly Localization = Localization;\n\n    public headerHeight: Observable<number>;\n\n    @ViewChild(\"templateRecord\") templateRecord;\n    @ViewChild(\"templateConnected\") templateConnected;\n\n    // Where to insert the cloned content\n    @ViewChild(\"container\", {read: ViewContainerRef}) container;\n\n    @ViewChild(\"logHead\") logHead;\n    @ViewChild(\"logTail\") logTail;\n\n    public showScrollToTopButton = false;\n    public showScrollToBottomButton = false;\n\n    private _logService: LogService;\n\n    constructor(private _elementRef: ElementRef,\n                private _changeDetector: ChangeDetectorRef,\n                private _streamRegistry: StreamServiceRegistry,\n                private _domService: DomService) {\n        this._logService = _streamRegistry.logService;\n        this.headerHeight = this._domService.headerHeight;\n    }\n\n    ngOnInit() {\n        this._logService.logs.subscribe({\n            next: record => {\n                this.insertRecord(record);\n            }\n        });\n    }\n\n    ngAfterContentChecked() {\n        // Refresh button state when tabs is switched away and back\n        this.refreshScrollButtonVisibility();\n    }\n\n    scrollToTop() {\n        // this.logHead.nativeElement.scrollIntoView(true);\n        window.scrollTo(0, 0);\n    }\n\n    scrollToBottom() {\n        window.scrollTo(0, document.body.scrollHeight);\n    }\n\n    @HostListener(\"window:scroll\", [\"$event\"])\n    checkScroll() {\n        this.refreshScrollButtonVisibility();\n    }\n\n    private insertRecord(record: LogRecord) {\n        // Scroll down if the log is visible and already scrolled to the bottom\n        const scrollToBottom = this._elementRef.nativeElement.offsetParent != null &&\n            LogsPageComponent.isElementInViewport(this.logTail.nativeElement);\n        this.container.createEmbeddedView(this.templateRecord, {record: record});\n        this._changeDetector.detectChanges();\n\n        if (scrollToBottom) {\n            this.scrollToBottom();\n        }\n        this.refreshScrollButtonVisibility();\n    }\n\n    private refreshScrollButtonVisibility() {\n        // Show/hide the scroll buttons\n        this.showScrollToTopButton = !LogsPageComponent.isElementInViewport(\n            this.logHead.nativeElement\n        );\n        this.showScrollToBottomButton = !LogsPageComponent.isElementInViewport(\n            this.logTail.nativeElement\n        );\n    }\n\n    // Source: https://stackoverflow.com/a/7557433\n    private static isElementInViewport(el): boolean {\n        const rect = el.getBoundingClientRect();\n        return (\n            rect.top >= 0 &&\n            rect.left >= 0 &&\n            rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n            rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n        );\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.html",
    "content": "<div id=\"top-sidebar\"\n     [class.top-sidebar-open]=\"showSidebar\"\n     [class.top-sidebar-closed]=\"!showSidebar\">\n\n    <div id=\"logo\">\n        <span class=\"image\">\n            <!--suppress HtmlUnknownTarget -->\n            <img src=\"assets/logo.png\" />\n        </span>\n        <span class=\"text\"><b>Seed</b>Sync</span>\n\n        <button id=\"sidebar-btn-close\" class=\"sidebar-btn\" (click)=\"showSidebar=false\">\n            <span>&#10006;</span>\n        </button>\n    </div>\n\n    <app-sidebar></app-sidebar>\n</div>\n\n<!-- Used for sidebar closing -->\n<div id=\"outside-sidebar\"\n     [class.outside-sidebar-show]=\"showSidebar\"\n     [class.outside-sidebar-hide]=\"!showSidebar\"\n     (click)=\"showSidebar=false\">\n</div>\n\n<div id=\"top-content\">\n    <div id=\"top-header\">\n        <!--\n            We attach the ResizeSensor to the header so that we can advertise its height\n            to other components, who can correctly position any sticky elements\n            Since ResizeSensor forces the div to be position: absolute, we create a wrapper\n            div to which to apply the sensor\n         -->\n        <div #topHeader>\n\n            <app-header></app-header>\n\n            <div id=\"title-bar\">\n                <button id=\"sidebar-btn-open\" class=\"sidebar-btn\" (click)=\"showSidebar=!showSidebar\">\n                    &#9776;\n                </button>\n                <span id=\"title\">{{activeRoute?.name}}</span>\n            </div>\n\n        </div>\n\n    </div>\n\n    <router-outlet></router-outlet>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.scss",
    "content": "@import '../../common/common';\n\n\n#top-content {\n    margin-left: $sidebar-width;\n    transition: margin-left .4s;\n}\n\n#top-header {\n    position: sticky;\n    top: 0;\n    z-index: $zindex-top-header;\n}\n\n#outside-sidebar {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    z-index: $zindex-sidebar - 1;\n    background-color: black;\n    opacity: .25;\n}\n\n#title-bar {\n    background-color: $header-color;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    padding-top: 8px;\n    padding-right: 8px;\n    padding-bottom: 8px;\n}\n\n#title-bar #title {\n    flex-grow: 1;\n    font-size: 26px;\n    cursor: default;\n    user-select: none;\n}\n\n#top-sidebar {\n    background-color: $primary-light-color;\n    width: $sidebar-width;\n    height: 100%;\n    position: fixed;\n    z-index: $zindex-sidebar;\n    overflow: auto;\n    box-shadow:0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);\n    animation: animateleft 0.4s;\n\n    #logo {\n        margin-bottom: 10px;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        padding: 5px;\n\n        .image {\n            img {\n                max-height: 32px;\n                max-width: 32px;\n            }\n        }\n\n        .text {\n            flex-grow: 1;\n            padding-left: 5px;\n            font-size: 140%;\n            cursor: default;\n            user-select: none;\n            color: $logo-color;\n            font-family: $logo-font;\n        }\n\n        #sidebar-btn-close {\n            text-align: right;\n            padding: 0;\n            font-size: 140%;\n\n            &:active {\n                color: red;\n                background-color: inherit;\n            }\n        }\n    }\n}\n@keyframes animateleft {\n    from {\n        left: -$sidebar-width;\n        opacity: 0\n    }\n    to {\n        left:0;\n        opacity:1\n    }\n}\n\n.top-sidebar-open {\n    display: block;\n}\n.top-sidebar-closed {\n    display: none;\n}\n\n.outside-sidebar-show {\n    display: block;\n}\n.outside-sidebar-hide {\n    display: none;\n}\n\n.sidebar-btn {\n    background-color: inherit;\n    display: block;\n    padding: 8px 16px;\n    border: none;\n    outline: none;\n    white-space: normal;\n    float: none;\n    cursor: default;\n    user-select: none;\n}\n\n#sidebar-btn-open {\n    text-align: left;\n\n    &:active {\n        background-color: $header-dark-color;\n    }\n}\n\n// Small and medium screens\n@media only screen and (max-width: $medium-max-width) {\n\n    // Sidebar is hidden, remove content margin\n    #top-content {\n        margin-left: 0;\n    }\n}\n\n// Large screens\n@media only screen and (min-width: $large-min-width) {\n\n    // Always show the sidebar\n    #top-sidebar {\n        display: block;\n    }\n\n    // Always hide the outside-sidebar\n    .outside-sidebar-show {\n        display: none;\n    }\n\n    // Hide the sidebar open/close buttons\n    .sidebar-btn {\n        display: none;\n    }\n\n    // Hide the entire title-bar\n    #title-bar {\n        display: none;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/app.component.ts",
    "content": "import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from \"@angular/core\";\nimport {NavigationEnd, Router} from \"@angular/router\";\nimport {ROUTE_INFOS, RouteInfo} from \"../../routes\";\n\nimport {ElementQueries, ResizeSensor} from \"css-element-queries\";\nimport {DomService} from \"../../services/utils/dom.service\";\n\n@Component({\n    selector: \"app-root\",\n    templateUrl: \"./app.component.html\",\n    styleUrls: [\"./app.component.scss\"]\n})\nexport class AppComponent implements OnInit, AfterViewInit {\n    @ViewChild(\"topHeader\") topHeader: ElementRef;\n\n    showSidebar = false;\n    activeRoute: RouteInfo;\n\n    constructor(private router: Router,\n                private _domService: DomService) {\n        // Navigation listener\n        //    Close the sidebar\n        //    Store the active route\n        router.events.subscribe(() => {\n            this.showSidebar = false;\n            this.activeRoute = ROUTE_INFOS.find(value => \"/\" + value.path === router.url);\n        });\n    }\n\n    ngOnInit() {\n        // Scroll to top on route changes\n        this.router.events.subscribe((evt) => {\n            if (!(evt instanceof NavigationEnd)) {\n                return;\n            }\n            window.scrollTo(0, 0);\n        });\n    }\n\n    ngAfterViewInit() {\n        ElementQueries.listen();\n        ElementQueries.init();\n        // noinspection TsLint\n        new ResizeSensor(this.topHeader.nativeElement, () => {\n            this._domService.setHeaderHeight(this.topHeader.nativeElement.clientHeight);\n        });\n    }\n\n    title = \"app\";\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.html",
    "content": "<div id=\"header\">\n    <div *ngFor=\"let notif of notifications | async\"\n         class=\"alert\"\n         [class.alert-danger]=\"notif.level == Notification.Level.DANGER\"\n         [class.alert-warning]=\"notif.level == Notification.Level.WARNING\"\n         [class.alert-info]=\"notif.level == Notification.Level.INFO\"\n         [class.alert-success]=\"notif.level == Notification.Level.SUCCESS\"\n         [class.alert-dismissible]=\"notif.dismissible\">\n        <button type=\"button\" class=\"close\"\n                *ngIf=\"notif.dismissible\"\n                (click)=\"dismiss(notif)\">\n            <span>&#10006;</span>\n        </button>\n        <span [innerHTML]=\"notif.text\"></span>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.scss",
    "content": "@import '../../common/common';\n\n#header {\n    .alert {\n        padding: 5px;\n        margin-bottom: 0;\n        border-radius: 0;\n\n        button.close {\n            top: 5px;\n            right: 5px;\n            cursor: default;\n            user-select: none;\n            outline: none;\n            opacity: .2;\n            font-size: 160%;\n            padding: 0;\n\n            &:active {\n                color: red;\n            }\n\n            &:hover {\n                color: inherit;\n                opacity: .2;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/header.component.ts",
    "content": "import {Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../../services/utils/logger.service\";\nimport {ServerStatusService} from \"../../services/server/server-status.service\";\nimport {Notification} from \"../../services/utils/notification\";\nimport {NotificationService} from \"../../services/utils/notification.service\";\nimport {StreamServiceRegistry} from \"../../services/base/stream-service.registry\";\nimport {Localization} from \"../../common/localization\";\n\n@Component({\n    selector: \"app-header\",\n    templateUrl: \"./header.component.html\",\n    styleUrls: [\"./header.component.scss\"],\n})\n\nexport class HeaderComponent implements OnInit {\n    // expose Notification type to template\n    public Notification = Notification;\n\n    public notifications: Observable<Immutable.List<Notification>>;\n\n    private _serverStatusService: ServerStatusService;\n\n    private _prevServerNotification: Notification;\n    private _prevWaitingForRemoteScanNotification: Notification;\n    private _prevRemoteServerErrorNotification: Notification;\n\n    constructor(private _logger: LoggerService,\n                _streamServiceRegistry: StreamServiceRegistry,\n                private _notificationService: NotificationService) {\n        this._serverStatusService = _streamServiceRegistry.serverStatusService;\n        this.notifications = this._notificationService.notifications;\n        this._prevServerNotification = null;\n        this._prevWaitingForRemoteScanNotification = null;\n    }\n\n    public dismiss(notif: Notification) {\n        this._notificationService.hide(notif);\n    }\n\n    ngOnInit() {\n        // Set up a subscriber to show server status notifications\n        this._serverStatusService.status.subscribe({\n            next: status => {\n                if (status.server.up) {\n                    // Remove any server notifications we may have added\n                    if (this._prevServerNotification != null) {\n                        this._notificationService.hide(this._prevServerNotification);\n                        this._prevServerNotification = null;\n                    }\n                } else {\n                    // Create a notification\n                    const notification = new Notification({\n                        level: Notification.Level.DANGER,\n                        text: status.server.errorMessage\n                    });\n                    // Show it, if different from the existing one\n                    if (\n                            this._prevServerNotification == null ||\n                            this._prevServerNotification.text !== notification.text\n                    ) {\n                        // Hide existing, if any\n                        if (this._prevServerNotification != null) {\n                            this._notificationService.hide(this._prevServerNotification);\n                        }\n                        this._prevServerNotification = notification;\n                        this._notificationService.show(this._prevServerNotification);\n                        this._logger.debug(\"New server notification: %O\", this._prevServerNotification);\n                    }\n                }\n            }\n        });\n\n        // Set up a subscriber to show waiting for remote scan notification\n        this._serverStatusService.status.subscribe({\n            next: status => {\n                if (status.server.up && status.controller.latestRemoteScanTime == null) {\n                    // Server up and no remote scan - show notification if not already shown\n                    if (this._prevWaitingForRemoteScanNotification == null) {\n                        this._prevWaitingForRemoteScanNotification = new Notification({\n                            level: Notification.Level.INFO,\n                            text: Localization.Notification.STATUS_REMOTE_SCAN_WAITING\n                        });\n                        this._notificationService.show(this._prevWaitingForRemoteScanNotification);\n                    }\n                } else {\n                    // Server down or remote scan available - hide notification if showing\n                    if (this._prevWaitingForRemoteScanNotification != null) {\n                        this._notificationService.hide(this._prevWaitingForRemoteScanNotification);\n                        this._prevWaitingForRemoteScanNotification = null;\n                    }\n                }\n            }\n        });\n\n        // Set up a subscriber to show remote server error notifications\n        this._serverStatusService.status.subscribe({\n            next: status => {\n                if (status.server.up && status.controller.latestRemoteScanFailed === true) {\n                    // Server up and remote scan failed - show notification if not already shown\n                    const level = Notification.Level.WARNING;\n                    const text = Localization.Notification.STATUS_REMOTE_SERVER_ERROR(status.controller.latestRemoteScanError);\n                    if (this._prevRemoteServerErrorNotification != null\n                           && this._prevRemoteServerErrorNotification.text !== text) {\n                        // Text changed, hide old notification\n                        this._notificationService.hide(this._prevRemoteServerErrorNotification);\n                        this._prevRemoteServerErrorNotification = null;\n                    }\n                    if (this._prevRemoteServerErrorNotification == null) {\n                        this._prevRemoteServerErrorNotification = new Notification(({\n                            level: level,\n                            text: text\n                        }));\n                        this._notificationService.show(this._prevRemoteServerErrorNotification);\n                    }\n                } else {\n                    // Server down or error is gone - hide notification if showing\n                    if (this._prevRemoteServerErrorNotification != null) {\n                        this._notificationService.hide(this._prevRemoteServerErrorNotification);\n                        this._prevRemoteServerErrorNotification = null;\n                    }\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.html",
    "content": "<div id=\"sidebar\">\n    <a *ngFor=\"let routeInfo of routeInfos\"\n       class=\"button\"\n       routerLink=\"{{routeInfo.path}}\"\n       routerLinkActive=\"selected\">\n        <img src=\"{{routeInfo.icon}}\" />\n        <span class=\"text\">{{routeInfo.name}}</span>\n    </a>\n\n    <hr>\n\n    <a class=\"button\"\n       [attr.disabled]=\"commandsEnabled ? null : true\"\n       (click)=\"!commandsEnabled || onCommandRestart()\">\n        <img src=\"assets/icons/refresh.svg\" />\n        <span class=\"text\">Restart</span>\n    </a>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.scss",
    "content": "@import '../../common/common';\n\n#sidebar {\n    .button {\n        background-color: inherit;\n        color: inherit;\n        text-decoration: none;\n        font-weight: bolder;\n        display: block;\n        width: 100%;\n        padding: 8px 16px;\n        text-align: left;\n        border: none;\n        outline: none;\n        white-space: normal;\n        float: none;\n        cursor: default;\n        user-select: none;\n\n        &:active {\n            background-color: $primary-color;\n        }\n\n        &.selected {\n            background-color: $secondary-color;\n            color: white;\n            border-color: #6ac19e;\n\n            img {\n                filter: invert(1.0);\n            }\n        }\n\n        &[disabled] {\n            opacity: .65;\n            background-color: inherit;\n        }\n\n        img {\n            width: 18px;\n            height: 18px;\n            margin-right: 4px;\n            margin-bottom: 2px;\n        }\n    }\n\n    hr {\n        margin-top: 3px;\n        margin-bottom: 3px;\n        border: 1px solid $header-dark-color;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/main/sidebar.component.ts",
    "content": "import {Component, OnInit} from \"@angular/core\";\n\nimport {ROUTE_INFOS} from \"../../routes\";\nimport {ServerCommandService} from \"../../services/server/server-command.service\";\nimport {LoggerService} from \"../../services/utils/logger.service\";\nimport {ConnectedService} from \"../../services/utils/connected.service\";\nimport {StreamServiceRegistry} from \"../../services/base/stream-service.registry\";\n\n@Component({\n    selector: \"app-sidebar\",\n    templateUrl: \"./sidebar.component.html\",\n    styleUrls: [\"./sidebar.component.scss\"]\n})\n\nexport class SidebarComponent implements OnInit {\n    routeInfos = ROUTE_INFOS;\n\n    public commandsEnabled: boolean;\n\n    private _connectedService: ConnectedService;\n\n    constructor(private _logger: LoggerService,\n                _streamServiceRegistry: StreamServiceRegistry,\n                private _commandService: ServerCommandService) {\n        this._connectedService = _streamServiceRegistry.connectedService;\n        this.commandsEnabled = false;\n    }\n\n    // noinspection JSUnusedGlobalSymbols\n    ngOnInit() {\n        this._connectedService.connected.subscribe({\n            next: (connected: boolean) => {\n                this.commandsEnabled = connected;\n            }\n        });\n    }\n\n    onCommandRestart() {\n        this._commandService.restart().subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    this._logger.info(reaction.data);\n                } else {\n                    this._logger.error(reaction.errorMessage);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.html",
    "content": "<div class=\"form-group\"\n     [class.error]=\"value == '<replace me>'\">\n\n    <!-- Unfortunately, binding to type attribute breaks functionality, so we\n         have to go with a if statement -->\n\n    <!-- Textbox -->\n    <label *ngIf=\"type == OptionType.Text\">\n        <span class=\"name\">{{label}}</span>\n        <input\n               type=\"text\"\n               class=\"form-control\"\n               [disabled]=\"value == null\"\n               [ngModel]=\"value\"\n               (ngModelChange)=\"onChange($event)\" />\n        <span *ngIf=\"description\"\n              class=\"description\">{{description}}</span>\n    </label>\n\n    <!-- Checkbox -->\n    <label *ngIf=\"type == OptionType.Checkbox\">\n        <input\n               type=\"checkbox\"\n               class=\"form-control\"\n               [disabled]=\"value == null\"\n               [ngModel]=\"value\"\n           (ngModelChange)=\"onChange($event)\" />\n        <span class=\"name\">{{label}}</span>\n        <span *ngIf=\"description\"\n              class=\"description\">{{description}}</span>\n    </label>\n\n    <!-- Password -->\n    <label *ngIf=\"type == OptionType.Password\">\n        <span class=\"name\">{{label}}</span>\n        <input\n               type=\"password\"\n               class=\"form-control\"\n               [disabled]=\"value == null\"\n               [ngModel]=\"value\"\n               (ngModelChange)=\"onChange($event)\" />\n        <span *ngIf=\"description\"\n              class=\"description\">{{description}}</span>\n    </label>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.scss",
    "content": "@import '../../common/common';\n\n.form-group {\n    margin-bottom: 0;\n    margin-left: 20px;\n    margin-right: 20px;\n}\n\n.error {\n    background-color: #f2dede;\n    color: #a94442;\n    border: 1px solid #a94442;\n}\n\nlabel {\n    width: 100%;\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    align-items: center;\n}\n\nspan.description {\n    color: darkgrey;\n    font-size: 80%;\n    line-height: initial;\n    width: 100%;\n    white-space: pre-line;  // renders newline as <br />\n}\n\ninput[type=\"checkbox\"] {\n    width: auto;\n    margin-right: 10px;\n    box-shadow: none;\n    height: 20px;\n\n    &:focus {\n        box-shadow: none;\n    }\n\n    & ~ .description {\n        margin-left: 23px;\n    }\n}\n\ninput[type=\"text\"] {\n    width: 100%;\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/option.component.ts",
    "content": "import {Component, Input, Output, ChangeDetectionStrategy, EventEmitter, OnInit} from \"@angular/core\";\nimport {Subject} from \"rxjs/Subject\";\n\n@Component({\n    selector: \"app-option\",\n    providers: [],\n    templateUrl: \"./option.component.html\",\n    styleUrls: [\"./option.component.scss\"],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class OptionComponent implements OnInit {\n    @Input() type: OptionType;\n    @Input() label: string;\n    @Input() value: any;\n    @Input() description: string;\n\n    @Output() changeEvent = new EventEmitter<any>();\n\n    // expose to template\n    public OptionType = OptionType;\n\n    private readonly DEBOUNCE_TIME_MS: number = 1000;\n\n    private newValue = new Subject<any>();\n\n    // noinspection JSUnusedGlobalSymbols\n    ngOnInit(): void {\n        // Debounce\n        // References:\n        //      https://angular.io/tutorial/toh-pt6#fix-the-herosearchcomponent-class\n        //      https://stackoverflow.com/a/41965515\n        this.newValue\n            .debounceTime(this.DEBOUNCE_TIME_MS)\n            .distinctUntilChanged()\n            .subscribe({next: val => this.changeEvent.emit(val)});\n    }\n\n    onChange(value: any) {\n        this.newValue.next(value);\n    }\n}\n\nexport enum OptionType {\n    Text,\n    Checkbox,\n    Password\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/options-list.ts",
    "content": "import {OptionType} from \"./option.component\";\n\nexport interface IOption {\n    type: OptionType;\n    label: string;\n    valuePath: [string, string];\n    description: string;\n}\nexport interface IOptionsContext {\n    header: string;\n    id: string;\n    options: IOption[];\n}\n\nexport const OPTIONS_CONTEXT_SERVER: IOptionsContext = {\n    header: \"Server\",\n    id: \"server\",\n    options: [\n        {\n            type: OptionType.Text,\n            label: \"Server Address\",\n            valuePath: [\"lftp\", \"remote_address\"],\n            description: null\n        },\n        {\n            type: OptionType.Text,\n            label: \"Server User\",\n            valuePath: [\"lftp\", \"remote_username\"],\n            description: null\n        },\n        {\n            type: OptionType.Password,\n            label: \"Server Password\",\n            valuePath: [\"lftp\", \"remote_password\"],\n            description: null\n        },\n        {\n            type: OptionType.Checkbox,\n            label: \"Use password-less key-based authentication\",\n            valuePath: [\"lftp\", \"use_ssh_key\"],\n            description: null\n        },\n        {\n            type: OptionType.Text,\n            label: \"Server Directory\",\n            valuePath: [\"lftp\", \"remote_path\"],\n            description: \"Path to your files on the remote server\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Local Directory\",\n            valuePath: [\"lftp\", \"local_path\"],\n            description: \"Downloaded files are placed here\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Remote SSH Port\",\n            valuePath: [\"lftp\", \"remote_port\"],\n            description: null,\n        },\n        {\n            type: OptionType.Text,\n            label: \"Server Script Path\",\n            valuePath: [\"lftp\", \"remote_path_to_scan_script\"],\n            description: \"Where to install scanner script on remote server\"\n        }\n    ]\n};\n\nexport const OPTIONS_CONTEXT_DISCOVERY: IOptionsContext = {\n    header: \"File Discovery\",\n    id: \"file-discovery\",\n    options: [\n        {\n            type: OptionType.Text,\n            label: \"Remote Scan Interval (ms)\",\n            valuePath: [\"controller\", \"interval_ms_remote_scan\"],\n            description: \"How often the remote server is scanned for new files\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Local Scan Interval (ms)\",\n            valuePath: [\"controller\", \"interval_ms_local_scan\"],\n            description: \"How often the local directory is scanned\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Downloading Scan Interval (ms)\",\n            valuePath: [\"controller\", \"interval_ms_downloading_scan\"],\n            description: \"How often the downloading information is updated\"\n        },\n    ]\n};\n\nexport const OPTIONS_CONTEXT_CONNECTIONS: IOptionsContext = {\n    header: \"Connections\",\n    id: \"connections\",\n    options: [\n        {\n            type: OptionType.Text,\n            label: \"Max Parallel Downloads\",\n            valuePath: [\"lftp\", \"num_max_parallel_downloads\"],\n            description: \"How many items download in parallel.\\n\" +\n                         \"(cmd:queue-parallel)\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Max Total Connections\",\n            valuePath: [\"lftp\", \"num_max_total_connections\"],\n            description: \"Maximum number of connections.\\n\" +\n                         \"(net:connection-limit)\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Max Connections Per File (Single-File)\",\n            valuePath: [\"lftp\", \"num_max_connections_per_root_file\"],\n            description: \"Number of connections for single-file download.\\n\" +\n                         \"(pget:default-n)\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Max Connections Per File (Directory)\",\n            valuePath: [\"lftp\", \"num_max_connections_per_dir_file\"],\n            description: \"Number of per-file connections for directory download.\\n\" +\n                         \"(mirror:use-pget-n)\"\n        },\n        {\n            type: OptionType.Text,\n            label: \"Max Parallel Files (Directory)\",\n            valuePath: [\"lftp\", \"num_max_parallel_files_per_download\"],\n            description: \"Maximum number of files to fetch in parallel for single directory download.\\n\" +\n                         \"(mirror:parallel-transfer-count)\"\n        },\n        {\n            type: OptionType.Checkbox,\n            label: \"Rename unfinished/downloading files\",\n            valuePath: [\"lftp\", \"use_temp_file\"],\n            description: \"Unfinished and downloading files will be named *.lftp\"\n        },\n    ]\n};\n\nexport const OPTIONS_CONTEXT_OTHER: IOptionsContext = {\n    header: \"Other Settings\",\n    id: \"other-settings\",\n    options: [\n        {\n            type: OptionType.Text,\n            label: \"Web GUI Port\",\n            valuePath: [\"web\", \"port\"],\n            description: null\n        },\n        {\n            type: OptionType.Checkbox,\n            label: \"Enable Debug\",\n            valuePath: [\"general\", \"debug\"],\n            description: \"Enables debug logging.\"\n        },\n    ]\n};\n\nexport const OPTIONS_CONTEXT_AUTOQUEUE: IOptionsContext = {\n    header: \"AutoQueue\",\n    id: \"autoqueue\",\n    options: [\n        {\n            type: OptionType.Checkbox,\n            label: \"Enable AutoQueue\",\n            valuePath: [\"autoqueue\", \"enabled\"],\n            description: null\n        },\n        {\n            type: OptionType.Checkbox,\n            label: \"Restrict to patterns\",\n            valuePath: [\"autoqueue\", \"patterns_only\"],\n            description: \"Only autoqueue files that match a pattern\"\n        },\n        {\n            type: OptionType.Checkbox,\n            label: \"Enable auto extraction\",\n            valuePath: [\"autoqueue\", \"auto_extract\"],\n            description: \"Automatically extract files\"\n        },\n    ]\n};\n\nexport const OPTIONS_CONTEXT_EXTRACT: IOptionsContext = {\n    header: \"Archive Extraction\",\n    id: \"extraction\",\n    options: [\n        {\n            type: OptionType.Checkbox,\n            label: \"Extract archives in the downloads directory\",\n            valuePath: [\"controller\", \"use_local_path_as_extract_path\"],\n            description: null\n        },\n        {\n            type: OptionType.Text,\n            label: \"Extract Path\",\n            valuePath: [\"controller\", \"extract_path\"],\n            description: \"When option above is disabled, extract archives to this directory\"\n        },\n    ]\n};\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.html",
    "content": "<!--suppress HtmlUnknownAttribute -->\n<ng-template #optionsList let-header=\"header\" let-options=\"options\" let-id=\"id\">\n    <div class=\"card\">\n        <h3 class=\"card-header\" id=\"heading-{{id}}\">\n            <button class=\"btn\"\n                    type=\"button\"\n                    data-toggle=\"collapse\"\n                    attr.data-target=\"#collapse-{{id}}\">\n                {{header}}\n            </button>\n        </h3>\n        <div id=\"collapse-{{id}}\" class=\"collapse\" data-parent=\"#accordion\">\n            <div class=\"card-body\">\n                <div *ngFor=\"let option of options\">\n                    <app-option\n                        [type]=\"option.type\"\n                        [label]=\"option.label\"\n                        [description]=\"option.description\"\n                        [value]=\"(config | async)?.get(option.valuePath[0]).get(option.valuePath[1])\"\n                        (changeEvent)=\"onSetConfig(option.valuePath[0], option.valuePath[1], $event)\">\n                    </app-option>\n                </div>\n            </div>\n        </div>\n    </div>\n</ng-template>\n\n\n<div id=\"settings\">\n    <div id=\"accordion\">\n        <div id=\"left\">\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_SERVER\">\n            </ng-container>\n\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_AUTOQUEUE\">\n            </ng-container>\n\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_EXTRACT\">\n            </ng-container>\n\n        </div>\n        <div id=\"right\">\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_CONNECTIONS\">\n            </ng-container>\n\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_DISCOVERY\">\n            </ng-container>\n\n            <!--suppress HtmlUnknownAttribute, UnnecessaryLabelJS -->\n            <ng-container\n                *ngTemplateOutlet=\"optionsList;context:OPTIONS_CONTEXT_OTHER\">\n            </ng-container>\n        </div>\n    </div>\n\n    <div id=\"commands\">\n        <div class=\"button\" appClickStopPropagation [attr.disabled]=\"commandsEnabled ? null : true\"\n             (click)=\"!commandsEnabled || onCommandRestart()\">\n            <img src=\"assets/icons/refresh.svg\" />\n            <span class=\"text\">Restart</span>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.scss",
    "content": "@import '../../common/common';\n\n#settings {\n    width: 100%;\n\n    #accordion {\n        width: 100%;\n        display: flex;\n        flex-direction: row;\n        flex-wrap: wrap;\n        padding: 15px;\n\n        #left, #right {\n            width: 100%;\n\n            .card {\n                margin-top: 20px;\n\n                &:first-child {\n                    margin-top: 0;\n                }\n\n                .card-header {\n                    margin-bottom: 0;\n\n                    .btn {\n                        font-size: 80%;\n                        cursor: default;\n\n                        &:focus {\n                            box-shadow: none;\n                        }\n                    }\n                }\n\n                .card-body {\n                    padding: 10px 0;\n                }\n            }\n        }\n\n        #right {\n            margin-top: 20px;\n        }\n    }\n\n    #commands {\n        margin-top: 10px;\n        width: 100%;\n        display: flex;\n        flex-direction: row;\n        justify-content: flex-end;\n        flex-wrap: wrap;\n\n        .button {\n            @extend %button;\n\n            flex-direction: row;\n            padding: 10px;\n            margin-right: 8px;\n            height: 40px;\n            font-size: 120%;\n\n            img {\n                width: 20px;\n                height: 20px;\n                filter: invert(1.0);\n            }\n\n            .text {\n                margin-left: 5px;\n            }\n        }\n    }\n}\n\n\n/* Medium and large screens */\n@media only screen and (min-width: $medium-min-width) {\n    #settings {\n        #accordion {\n            #left, #right {\n                width: 50%;\n\n                .card-header {\n                    .btn {\n                        pointer-events: none;\n                    }\n                }\n\n                .collapse {\n                    display: inherit;\n                }\n            }\n            #left {\n                padding-right: 10px;\n            }\n            #right {\n                padding-left: 10px;\n                margin-top: 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/pages/settings/settings-page.component.ts",
    "content": "import {ChangeDetectionStrategy, Component, OnInit} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {LoggerService} from \"../../services/utils/logger.service\";\nimport {ConfigService} from \"../../services/settings/config.service\";\nimport {Config} from \"../../services/settings/config\";\nimport {Notification} from \"../../services/utils/notification\";\nimport {Localization} from \"../../common/localization\";\nimport {NotificationService} from \"../../services/utils/notification.service\";\nimport {ServerCommandService} from \"../../services/server/server-command.service\";\nimport {\n    OPTIONS_CONTEXT_CONNECTIONS, OPTIONS_CONTEXT_DISCOVERY, OPTIONS_CONTEXT_OTHER,\n    OPTIONS_CONTEXT_SERVER, OPTIONS_CONTEXT_AUTOQUEUE, OPTIONS_CONTEXT_EXTRACT\n} from \"./options-list\";\nimport {ConnectedService} from \"../../services/utils/connected.service\";\nimport {StreamServiceRegistry} from \"../../services/base/stream-service.registry\";\n\n@Component({\n    selector: \"app-settings-page\",\n    templateUrl: \"./settings-page.component.html\",\n    styleUrls: [\"./settings-page.component.scss\"],\n    providers: [],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class SettingsPageComponent implements OnInit {\n    public OPTIONS_CONTEXT_SERVER = OPTIONS_CONTEXT_SERVER;\n    public OPTIONS_CONTEXT_DISCOVERY = OPTIONS_CONTEXT_DISCOVERY;\n    public OPTIONS_CONTEXT_CONNECTIONS = OPTIONS_CONTEXT_CONNECTIONS;\n    public OPTIONS_CONTEXT_OTHER = OPTIONS_CONTEXT_OTHER;\n    public OPTIONS_CONTEXT_AUTOQUEUE = OPTIONS_CONTEXT_AUTOQUEUE;\n    public OPTIONS_CONTEXT_EXTRACT = OPTIONS_CONTEXT_EXTRACT;\n\n    public config: Observable<Config>;\n\n    public commandsEnabled: boolean;\n\n    private _connectedService: ConnectedService;\n\n    private _configRestartNotif: Notification;\n    private _badValueNotifs: Map<string, Notification>;\n\n    constructor(private _logger: LoggerService,\n                _streamServiceRegistry: StreamServiceRegistry,\n                private _configService: ConfigService,\n                private _notifService: NotificationService,\n                private _commandService: ServerCommandService) {\n        this._connectedService = _streamServiceRegistry.connectedService;\n        this.config = _configService.config;\n        this.commandsEnabled = false;\n        this._configRestartNotif = new Notification({\n            level: Notification.Level.INFO,\n            text: Localization.Notification.CONFIG_RESTART\n        });\n        this._badValueNotifs = new Map();\n    }\n\n    // noinspection JSUnusedGlobalSymbols\n    ngOnInit() {\n        this._connectedService.connected.subscribe({\n            next: (connected: boolean) => {\n                if (!connected) {\n                    // Server went down, hide the config restart notification\n                    this._notifService.hide(this._configRestartNotif);\n                }\n\n                // Enable/disable commands based on server connection\n                this.commandsEnabled = connected;\n            }\n        });\n    }\n\n    onSetConfig(section: string, option: string, value: any) {\n        this._configService.set(section, option, value).subscribe({\n            next: reaction => {\n                const notifKey = section + \".\" + option;\n                if (reaction.success) {\n                    this._logger.info(reaction.data);\n\n                    // Hide bad value notification, if any\n                    if (this._badValueNotifs.has(notifKey)) {\n                        this._notifService.hide(this._badValueNotifs.get(notifKey));\n                        this._badValueNotifs.delete(notifKey);\n                    }\n\n                    // Show the restart notification\n                    this._notifService.show(this._configRestartNotif);\n                } else {\n                    // Show bad value notification\n                    const notif = new Notification({\n                        level: Notification.Level.DANGER,\n                        dismissible: true,\n                        text: reaction.errorMessage\n                    });\n                    if (this._badValueNotifs.has(notifKey)) {\n                        this._notifService.hide(this._badValueNotifs.get(notifKey));\n                    }\n                    this._notifService.show(notif);\n                    this._badValueNotifs.set(notifKey, notif);\n\n                    this._logger.error(reaction.errorMessage);\n                }\n            }\n        });\n    }\n\n    onCommandRestart() {\n        this._commandService.restart().subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    this._logger.info(reaction.data);\n                } else {\n                    this._logger.error(reaction.errorMessage);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/routes.ts",
    "content": "import {Routes} from \"@angular/router\";\n\nimport * as Immutable from \"immutable\";\n\nimport {FilesPageComponent} from \"./pages/files/files-page.component\";\nimport {SettingsPageComponent} from \"./pages/settings/settings-page.component\";\nimport {AutoQueuePageComponent} from \"./pages/autoqueue/autoqueue-page.component\";\nimport {LogsPageComponent} from \"./pages/logs/logs-page.component\";\nimport {AboutPageComponent} from \"./pages/about/about-page.component\";\n\nexport interface RouteInfo {\n    path: string;\n    name: string;\n    icon: string;\n    component: any;\n}\n\nexport const ROUTE_INFOS: Immutable.List<RouteInfo> = Immutable.List([\n    {\n        path: \"dashboard\",\n        name: \"Dashboard\",\n        icon: \"assets/icons/dashboard.svg\",\n        component: FilesPageComponent\n    },\n    {\n        path: \"settings\",\n        name: \"Settings\",\n        icon: \"assets/icons/settings.svg\",\n        component: SettingsPageComponent\n    },\n    {\n        path: \"autoqueue\",\n        name: \"AutoQueue\",\n        icon: \"assets/icons/autoqueue.svg\",\n        component: AutoQueuePageComponent\n    },\n    {\n        path: \"logs\",\n        name: \"Logs\",\n        icon: \"assets/icons/logs.svg\",\n        component: LogsPageComponent\n    },\n    {\n        path: \"about\",\n        name: \"About\",\n        icon: \"assets/icons/about.svg\",\n        component: AboutPageComponent\n    }\n]);\n\nexport const ROUTES: Routes = [\n    {\n        path: \"\",\n        redirectTo: \"/dashboard\",\n        pathMatch: \"full\"\n    },\n    {\n        path: \"dashboard\",\n        component: FilesPageComponent\n    },\n    {\n        path: \"settings\",\n        component: SettingsPageComponent\n    },\n    {\n        path: \"autoqueue\",\n        component: AutoQueuePageComponent\n    },\n    {\n        path: \"logs\",\n        component: LogsPageComponent\n    },\n    {\n        path: \"about\",\n        component: AboutPageComponent\n    }\n];\n"
  },
  {
    "path": "src/angular/src/app/services/autoqueue/autoqueue-pattern.ts",
    "content": "import {Record} from \"immutable\";\n\ninterface IAutoQueuePattern {\n    pattern: string;\n}\nconst DefaultAutoQueuePattern: IAutoQueuePattern = {\n    pattern: null\n};\nconst AutoQueuePatternRecord = Record(DefaultAutoQueuePattern);\n\n\nexport class AutoQueuePattern extends AutoQueuePatternRecord implements IAutoQueuePattern {\n    pattern: string;\n\n    constructor(props) {\n        super(props);\n    }\n}\n\n/**\n * ServerStatus as serialized by the backend.\n * Note: naming convention matches that used in JSON\n */\nexport interface AutoQueuePatternJson {\n    pattern: string;\n}\n"
  },
  {
    "path": "src/angular/src/app/services/autoqueue/autoqueue.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {BaseWebService} from \"../base/base-web.service\";\nimport {AutoQueuePattern, AutoQueuePatternJson} from \"./autoqueue-pattern\";\nimport {Localization} from \"../../common/localization\";\nimport {StreamServiceRegistry} from \"../base/stream-service.registry\";\nimport {RestService, WebReaction} from \"../utils/rest.service\";\n\n\n/**\n * AutoQueueService provides the store for the autoqueue patterns\n */\n@Injectable()\nexport class AutoQueueService extends BaseWebService {\n\n    private readonly AUTOQUEUE_GET_URL = \"/server/autoqueue/get\";\n    private readonly AUTOQUEUE_ADD_URL = (pattern) => `/server/autoqueue/add/${pattern}`;\n    private readonly AUTOQUEUE_REMOVE_URL = (pattern) => `/server/autoqueue/remove/${pattern}`;\n\n    private _patterns: BehaviorSubject<Immutable.List<AutoQueuePattern>> =\n            new BehaviorSubject(Immutable.List([]));\n\n    constructor(_streamServiceProvider: StreamServiceRegistry,\n                private _restService: RestService,\n                private _logger: LoggerService) {\n        super(_streamServiceProvider);\n    }\n\n    /**\n     * Returns an observable that provides that latest patterns\n     * @returns {Observable<Immutable.List<AutoQueuePattern>>}\n     */\n    get patterns(): Observable<Immutable.List<AutoQueuePattern>> {\n        return this._patterns.asObservable();\n    }\n\n    /**\n     * Add a pattern\n     * @param {string} pattern\n     * @returns {Observable<WebReaction>}\n     */\n    public add(pattern: string): Observable<WebReaction> {\n        this._logger.debug(\"add pattern %O\", pattern);\n\n        // Value check\n        if (pattern == null || pattern.trim().length === 0) {\n            return Observable.create(observer => {\n                observer.next(new WebReaction(false, null, Localization.Notification.AUTOQUEUE_PATTERN_EMPTY));\n            });\n        }\n\n        const currentPatterns = this._patterns.getValue();\n        const index = currentPatterns.findIndex(pat => pat.pattern === pattern);\n        if (index >= 0) {\n            return Observable.create(observer => {\n                observer.next(new WebReaction(false, null, `Pattern '${pattern}' already exists.`));\n            });\n        } else {\n            // Double-encode the value\n            const patternEncoded = encodeURIComponent(encodeURIComponent(pattern));\n            const url = this.AUTOQUEUE_ADD_URL(patternEncoded);\n            const obs = this._restService.sendRequest(url);\n            obs.subscribe({\n                next: reaction => {\n                    if (reaction.success) {\n                        // Update our copy and notify clients\n                        const patterns = this._patterns.getValue();\n                        const newPatterns = patterns.push(\n                            new AutoQueuePattern({\n                                pattern: pattern\n                            })\n                        );\n                        this._patterns.next(newPatterns);\n                    }\n                }\n            });\n            return obs;\n        }\n    }\n\n    /**\n     * Remove a pattern\n     * @param {string} pattern\n     * @returns {Observable<WebReaction>}\n     */\n    public remove(pattern: string): Observable<WebReaction> {\n        this._logger.debug(\"remove pattern %O\", pattern);\n\n        const currentPatterns = this._patterns.getValue();\n        const index = currentPatterns.findIndex(pat => pat.pattern === pattern);\n        if (index < 0) {\n            return Observable.create(observer => {\n                observer.next(new WebReaction(false, null, `Pattern '${pattern}' not found.`));\n            });\n        } else {\n            // Double-encode the value\n            const patternEncoded = encodeURIComponent(encodeURIComponent(pattern));\n            const url = this.AUTOQUEUE_REMOVE_URL(patternEncoded);\n            const obs = this._restService.sendRequest(url);\n            obs.subscribe({\n                next: reaction => {\n                    if (reaction.success) {\n                        // Update our copy and notify clients\n                        const patterns = this._patterns.getValue();\n                        const finalIndex = currentPatterns.findIndex(pat => pat.pattern === pattern);\n                        const newPatterns = patterns.remove(finalIndex);\n                        this._patterns.next(newPatterns);\n                    }\n                }\n            });\n            return obs;\n        }\n    }\n\n    protected onConnected() {\n        // Retry the get\n        this.getPatterns();\n    }\n\n    protected onDisconnected() {\n        // Send empty list\n        this._patterns.next(Immutable.List([]));\n    }\n\n    private getPatterns() {\n        this._logger.debug(\"Getting autoqueue patterns...\");\n        this._restService.sendRequest(this.AUTOQUEUE_GET_URL).subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    const parsed: AutoQueuePatternJson[] = JSON.parse(reaction.data);\n                    const newPatterns: AutoQueuePattern[] = [];\n                    for (const patternJson of parsed) {\n                        newPatterns.push(new AutoQueuePattern({\n                            pattern: patternJson.pattern\n                        }));\n                    }\n                    this._patterns.next(Immutable.List(newPatterns));\n                } else {\n                    this._patterns.next(Immutable.List([]));\n                }\n            }\n        });\n    }\n}\n\n/**\n * AutoQueueService factory and provider\n */\nexport let autoQueueServiceFactory = (\n    _streamServiceRegistry: StreamServiceRegistry,\n    _restService: RestService,\n    _logger: LoggerService\n) => {\n  const autoQueueService = new AutoQueueService(_streamServiceRegistry, _restService, _logger);\n  autoQueueService.onInit();\n  return autoQueueService;\n};\n\n// noinspection JSUnusedGlobalSymbols\nexport let AutoQueueServiceProvider = {\n    provide: AutoQueueService,\n    useFactory: autoQueueServiceFactory,\n    deps: [StreamServiceRegistry, RestService, LoggerService]\n};\n"
  },
  {
    "path": "src/angular/src/app/services/base/base-stream.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\nimport {IStreamService} from \"./stream-service.registry\";\n\n\n/**\n * BaseStreamService represents a web services that fetches data\n * from a SSE stream. This class provides utilities to register\n * for event notifications from a multiplexed stream.\n *\n * Note: services derived from this class SHOULD NOT be created\n *       directly. They need to be added to StreamServiceRegistry\n *       and fetched from an instance of that registry class.\n */\n@Injectable()\nexport abstract class BaseStreamService implements IStreamService {\n\n    private _eventNames: string[] = [];\n\n\n    constructor() {}\n\n    getEventNames(): string[] {\n        return this._eventNames;\n    }\n\n    notifyConnected() {\n        this.onConnected();\n    }\n\n    notifyDisconnected() {\n        this.onDisconnected();\n    }\n\n    notifyEvent(eventName: string, data: string) {\n        this.onEvent(eventName, data);\n    }\n\n    protected registerEventName(eventName: string) {\n        this._eventNames.push(eventName);\n    }\n\n    /**\n     * Callback for a new event\n     * @param {string} eventName\n     * @param {string} data\n     */\n    protected abstract onEvent(eventName: string, data: string);\n\n    /**\n     * Callback for connected\n     */\n    protected abstract onConnected();\n\n    /**\n     * Callback for disconnected\n     */\n    protected abstract onDisconnected();\n}\n"
  },
  {
    "path": "src/angular/src/app/services/base/base-web.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\nimport {StreamServiceRegistry} from \"./stream-service.registry\";\nimport {ConnectedService} from \"../utils/connected.service\";\n\n\n/**\n * BaseWebService provides utility to be notified when connection to\n * the backend server is lost and regained. Non-streaming web services\n * can use these notifications to re-issue get requests.\n */\n@Injectable()\nexport abstract class BaseWebService {\n\n    private _connectedService: ConnectedService;\n\n    /**\n     * Call this method to finish initialization\n     */\n    public onInit() {\n        this._connectedService.connected.subscribe({\n            next: connected => {\n                if(connected) {\n                    this.onConnected();\n                } else {\n                    this.onDisconnected();\n                }\n            }\n        });\n    }\n\n    constructor(_streamServiceProvider: StreamServiceRegistry) {\n        this._connectedService = _streamServiceProvider.connectedService;\n    }\n\n\n    /**\n     * Callback for connected\n     */\n    protected abstract onConnected(): void;\n\n    /**\n     * Callback for disconnected\n     */\n    protected abstract onDisconnected(): void;\n}\n"
  },
  {
    "path": "src/angular/src/app/services/base/stream-service.registry.ts",
    "content": "import {Injectable, NgZone} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport EventSource = require(\"eventsource\");\n\nimport {ModelFileService} from \"../files/model-file.service\";\nimport {ServerStatusService} from \"../server/server-status.service\";\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ConnectedService} from \"../utils/connected.service\";\nimport {LogService} from \"../logs/log.service\";\n\n\nexport class EventSourceFactory {\n    static createEventSource(url: string) {\n        return new EventSource(url);\n    }\n}\n\n\nexport interface IStreamService {\n    /**\n     * Returns the event names supported by this stream service\n     * @returns {string[]}\n     */\n    getEventNames(): string[];\n\n    /**\n     * Notifies the stream service that it is now connected\n     */\n    notifyConnected();\n\n    /**\n     * Notifies the stream service that it is now disconnected\n     */\n    notifyDisconnected();\n\n    /**\n     * Notifies the stream service of an event\n     * @param {string} eventName\n     * @param {string} data\n     */\n    notifyEvent(eventName: string, data: string);\n}\n\n\n/**\n * StreamDispatchService is the top-level service that connects to\n * the multiplexed SSE stream. It listens for SSE events and dispatches\n * them to whichever IStreamService that requested them.\n */\n@Injectable()\nexport class StreamDispatchService {\n    private readonly STREAM_URL = \"/server/stream\";\n\n    private readonly STREAM_RETRY_INTERVAL_MS = 3000;\n\n    private _eventNameToServiceMap: Map<string, IStreamService> = new Map();\n    private _services: IStreamService[] = [];\n\n    constructor(private _logger: LoggerService,\n                private _zone: NgZone) {\n    }\n\n    /**\n     * Call this method to finish initialization\n     */\n    public onInit() {\n        this.createSseObserver();\n    }\n\n    /**\n     * Register an IStreamService with the dispatch\n     * @param {IStreamService} service\n     * @returns {IStreamService}\n     */\n    public registerService(service: IStreamService) {\n        for(let eventName of service.getEventNames()) {\n            this._eventNameToServiceMap.set(eventName, service);\n        }\n        this._services.push(service);\n        return service;\n    }\n\n    private createSseObserver() {\n        const observable = Observable.create(observer => {\n            const eventSource = EventSourceFactory.createEventSource(this.STREAM_URL);\n            for (let eventName of Array.from(this._eventNameToServiceMap.keys())) {\n                eventSource.addEventListener(eventName, event => observer.next(\n                    {\n                        \"event\": eventName,\n                        \"data\": (<MessageEvent>event).data\n                    }\n                ));\n            }\n\n            // noinspection SpellCheckingInspection\n            // noinspection JSUnusedLocalSymbols\n            eventSource.onopen = event => {\n                this._logger.info(\"Connected to server stream\");\n\n                // Notify all services of connection\n                for (let service of this._services) {\n                    this._zone.run(() => {\n                        service.notifyConnected();\n                    });\n                }\n            };\n\n            eventSource.onerror = x => observer.error(x);\n\n            return () => {\n                eventSource.close();\n            };\n        });\n        observable.subscribe({\n            next: (x) => {\n                let eventName = x[\"event\"];\n                let eventData = x[\"data\"];\n                // this._logger.debug(\"Received event:\", eventName);\n                this._zone.run(() => {\n                    this._eventNameToServiceMap.get(eventName).notifyEvent(eventName, eventData);\n                });\n            },\n            error: err => {\n                this._logger.error(\"Error in stream: %O\", err);\n\n                // Notify all services of disconnection\n                for (let service of this._services) {\n                    this._zone.run(() => {\n                        service.notifyDisconnected();\n                    });\n                }\n\n                setTimeout(() => { this.createSseObserver(); }, this.STREAM_RETRY_INTERVAL_MS);\n            }\n        });\n    }\n}\n\n\n/**\n * StreamServiceRegistry is responsible for initializing all\n * Stream Services. All services created by the registry\n * will be connected to a single stream via the DispatchService\n */\n@Injectable()\nexport class StreamServiceRegistry {\n\n    constructor(private _dispatch: StreamDispatchService,\n                private _modelFileService: ModelFileService,\n                private _serverStatusService: ServerStatusService,\n                private _connectedService: ConnectedService,\n                private _logService: LogService) {\n        // Register all services\n        _dispatch.registerService(_connectedService);\n        _dispatch.registerService(_serverStatusService);\n        _dispatch.registerService(_modelFileService);\n        _dispatch.registerService(_logService);\n    }\n\n    /**\n     * Call this method to finish initialization\n     */\n    public onInit() {\n        this._dispatch.onInit();\n    }\n\n    get modelFileService(): ModelFileService { return this._modelFileService; }\n    get serverStatusService(): ServerStatusService { return this._serverStatusService; }\n    get connectedService(): ConnectedService { return this._connectedService; }\n    get logService(): LogService { return this._logService; }\n}\n\n/**\n * StreamServiceRegistry factory and provider\n */\nexport let streamServiceRegistryFactory = (\n        _dispatch: StreamDispatchService,\n        _modelFileService: ModelFileService,\n        _serverStatusService: ServerStatusService,\n        _connectedService: ConnectedService,\n        _logService: LogService\n) => {\n    let streamServiceRegistry = new StreamServiceRegistry(\n        _dispatch,\n        _modelFileService,\n        _serverStatusService,\n        _connectedService,\n        _logService\n    );\n    streamServiceRegistry.onInit();\n    return streamServiceRegistry;\n};\n\n// noinspection JSUnusedGlobalSymbols\nexport let StreamServiceRegistryProvider = {\n    provide: StreamServiceRegistry,\n    useFactory: streamServiceRegistryFactory,\n    deps: [\n        StreamDispatchService,\n        ModelFileService,\n        ServerStatusService,\n        ConnectedService,\n        LogService\n    ]\n};\n"
  },
  {
    "path": "src/angular/src/app/services/files/mock-model-files.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"./model-file\";\n\nexport const MOCK_MODEL_FILES: Immutable.Map<string, ModelFile> = Immutable.Map({\n    \"[AUTHOR] A Really Cool Video About Cats.mkv\": new ModelFile({\n        name: \"[AUTHOR] A Really Cool Video About Cats.mkv\",\n        is_dir: false,\n        local_size: 123644865,\n        remote_size: 243644865,\n        state: ModelFile.State.DOWNLOADING,\n        downloading_speed: 512000,\n        eta: 3612,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Super.Secret.Folder.With.A.Long.Name.Separated.By.Dots\": new ModelFile({\n        name: \"Super.Secret.Folder.With.A.Long.Name.Separated.By.Dots\",\n        is_dir: true,\n        local_size: 123456,\n        remote_size: 487241252,\n        state: ModelFile.State.DOWNLOADING,\n        downloading_speed: 1212000,\n        eta: 1514,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Game.Of.Big.Bang.Last.Week.Breaking.Valley.Episode.8.03\": new ModelFile({\n        name: \"Game.Of.Big.Bang.Last.Week.Breaking.Valley.Episode.8.03\",\n        is_dir: true,\n        local_size: 970712825,\n        remote_size: 970712825,\n        state: ModelFile.State.DOWNLOADED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Green.Archer.Dude.And.Fast.Red.Streaky.Guy.Show\": new ModelFile({\n        name: \"Green.Archer.Dude.And.Fast.Red.Streaky.Guy.Show\",\n        is_dir: true,\n        local_size: null,\n        remote_size: 882722050,\n        state: ModelFile.State.QUEUED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"OneLongFileWithNoSpacesNoDotsNoHypensJustLotsAndLotsOfTextOhGodWhoNamedThisFileDamnIt\": new ModelFile({\n        name: \"OneLongFileWithNoSpacesNoDotsNoHypensJustLotsAndLotsOfTextOhGodWhoNamedThisFileDamnIt\",\n        is_dir: true,\n        local_size: null,\n        remote_size: 7086311523,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"My Local File\": new ModelFile({\n        name: \"My Local File\",\n        is_dir: true,\n        local_size: 86311523,\n        remote_size: null,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"This_File_Needs_To_Be_Resumed.exe\": new ModelFile({\n        name: \"This_File_Needs_To_Be_Resumed.exe\",\n        is_dir: false,\n        local_size: 11111111,\n        remote_size: 44444444,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Deleted Folder\": new ModelFile({\n        name: \"Deleted Folder\",\n        is_dir: true,\n        local_size: null,\n        remote_size: 1024,\n        state: ModelFile.State.DELETED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"my.local.archive.rar\": new ModelFile({\n        name: \"my.local.archive.rar\",\n        is_dir: false,\n        local_size: 28000,\n        remote_size: null,\n        state: ModelFile.State.EXTRACTED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"NextEpisode\": new ModelFile({\n        name: \"NextEpisode\",\n        is_dir: true,\n        local_size: 1500000000,\n        remote_size: 1000000000,\n        state: ModelFile.State.EXTRACTING,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"PreviousEpisode\": new ModelFile({\n        name: \"PreviousEpisode\",\n        is_dir: true,\n        local_size: 2000000000,\n        remote_size: 1000000000,\n        state: ModelFile.State.EXTRACTED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n        local_modified_timestamp: new Date(1541828418943),\n        remote_created_timestamp: null,\n        remote_modified_timestamp: new Date(1541828418943),\n        children: Immutable.Set<ModelFile>()\n    }),\n});\n"
  },
  {
    "path": "src/angular/src/app/services/files/model-file.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ModelFile} from \"./model-file\";\nimport {BaseStreamService} from \"../base/base-stream.service\";\nimport {RestService, WebReaction} from \"../utils/rest.service\";\n\n\n/**\n * ModelFileService class provides the store for model files\n * It implements the observable service pattern to push updates\n * as they become available.\n * The model is stored as an Immutable Map of name=>ModelFiles. Hence, the\n * ModelFiles have no defined order. The name key allows more efficient\n * lookup and model diffing.\n * Reference: http://blog.angular-university.io/how-to-build-angular2\n *            -apps-using-rxjs-observable-data-services-pitfalls-to-avoid\n */\n@Injectable()\nexport class ModelFileService extends BaseStreamService {\n    private readonly EVENT_INIT = \"model-init\";\n    private readonly EVENT_ADDED = \"model-added\";\n    private readonly EVENT_UPDATED = \"model-updated\";\n    private readonly EVENT_REMOVED = \"model-removed\";\n\n    private _files: BehaviorSubject<Immutable.Map<string, ModelFile>> =\n        new BehaviorSubject(Immutable.Map<string, ModelFile>());\n\n    constructor(private _logger: LoggerService,\n                private _restService: RestService) {\n        super();\n        this.registerEventName(this.EVENT_INIT);\n        this.registerEventName(this.EVENT_ADDED);\n        this.registerEventName(this.EVENT_UPDATED);\n        this.registerEventName(this.EVENT_REMOVED);\n    }\n\n    get files(): Observable<Immutable.Map<string, ModelFile>> {\n        return this._files.asObservable();\n    }\n\n    /**\n     * Queue a file for download\n     * @param {ModelFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public queue(file: ModelFile): Observable<WebReaction> {\n        this._logger.debug(\"Queue model file: \" + file.name);\n        // Double-encode the value\n        const fileNameEncoded = encodeURIComponent(encodeURIComponent(file.name));\n        const url: string = \"/server/command/queue/\" + fileNameEncoded;\n        return this._restService.sendRequest(url);\n    }\n\n    /**\n     * Stop a file\n     * @param {ModelFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public stop(file: ModelFile): Observable<WebReaction> {\n        this._logger.debug(\"Stop model file: \" + file.name);\n        // Double-encode the value\n        const fileNameEncoded = encodeURIComponent(encodeURIComponent(file.name));\n        const url: string = \"/server/command/stop/\" + fileNameEncoded;\n        return this._restService.sendRequest(url);\n    }\n\n    /**\n     * Extract a file\n     * @param {ModelFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public extract(file: ModelFile): Observable<WebReaction> {\n        this._logger.debug(\"Extract model file: \" + file.name);\n        // Double-encode the value\n        const fileNameEncoded = encodeURIComponent(encodeURIComponent(file.name));\n        const url: string = \"/server/command/extract/\" + fileNameEncoded;\n        return this._restService.sendRequest(url);\n    }\n\n    /**\n     * Delete file locally\n     * @param {ModelFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public deleteLocal(file: ModelFile): Observable<WebReaction> {\n        this._logger.debug(\"Delete locally model file: \" + file.name);\n        // Double-encode the value\n        const fileNameEncoded = encodeURIComponent(encodeURIComponent(file.name));\n        const url: string = \"/server/command/delete_local/\" + fileNameEncoded;\n        return this._restService.sendRequest(url);\n    }\n\n    /**\n     * Delete file remotely\n     * @param {ModelFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public deleteRemote(file: ModelFile): Observable<WebReaction> {\n        this._logger.debug(\"Delete remotely model file: \" + file.name);\n        // Double-encode the value\n        const fileNameEncoded = encodeURIComponent(encodeURIComponent(file.name));\n        const url: string = \"/server/command/delete_remote/\" + fileNameEncoded;\n        return this._restService.sendRequest(url);\n    }\n\n    protected onEvent(eventName: string, data: string) {\n        this.parseEvent(eventName, data);\n    }\n\n    protected onConnected() {\n        // nothing to do\n    }\n\n    protected onDisconnected() {\n        // Update clients by clearing the model\n        this._files.next(this._files.getValue().clear());\n    }\n\n    /**\n     * Parse an event and update the file model\n     * @param {string} name\n     * @param {string} data\n     */\n    private parseEvent(name: string, data: string) {\n        if (name === this.EVENT_INIT) {\n            // Init event receives an array of ModelFiles\n            let t0: number;\n            let t1: number;\n\n            t0 = performance.now();\n            const parsed: [any] = JSON.parse(data);\n            t1 = performance.now();\n            this._logger.debug(\"Parsing took\", (t1 - t0).toFixed(0), \"ms\");\n\n            t0 = performance.now();\n            const newFiles: ModelFile[] = [];\n            for (const file of parsed) {\n                newFiles.push(ModelFile.fromJson(file));\n            }\n            t1 = performance.now();\n            this._logger.debug(\"ModelFile creation took\", (t1 - t0).toFixed(0), \"ms\");\n\n            // Replace the entire model\n            t0 = performance.now();\n            const newMap = Immutable.Map<string, ModelFile>(newFiles.map(value => ([value.name, value])));\n            t1 = performance.now();\n            this._logger.debug(\"ModelFile map creation took\", (t1 - t0).toFixed(0), \"ms\");\n\n            this._files.next(newMap);\n            // this._logger.debug(\"New model: %O\", this._files.getValue().toJS());\n        } else if (name === this.EVENT_ADDED) {\n            // Added event receives old and new ModelFiles\n            // Only new file is relevant\n            const parsed: {new_file: any} = JSON.parse(data);\n            const file = ModelFile.fromJson(parsed.new_file);\n            if (this._files.getValue().has(file.name)) {\n                this._logger.error(\"ModelFile named \" + file.name + \" already exists\");\n            } else {\n                this._files.next(this._files.getValue().set(file.name, file));\n                this._logger.debug(\"Added file: %O\", file.toJS());\n            }\n        } else if (name === this.EVENT_REMOVED) {\n            // Removed event receives old and new ModelFiles\n            // Only old file is relevant\n            const parsed: {old_file: any} = JSON.parse(data);\n            const file = ModelFile.fromJson(parsed.old_file);\n            if (this._files.getValue().has(file.name)) {\n                this._files.next(this._files.getValue().remove(file.name));\n                this._logger.debug(\"Removed file: %O\", file.toJS());\n            } else {\n                this._logger.error(\"Failed to find ModelFile named \" + file.name);\n            }\n        } else if (name === this.EVENT_UPDATED) {\n            // Updated event received old and new ModelFiles\n            // We will only use the new one here\n            const parsed: {new_file: any} = JSON.parse(data);\n            const file = ModelFile.fromJson(parsed.new_file);\n            if (this._files.getValue().has(file.name)) {\n                this._files.next(this._files.getValue().set(file.name, file));\n                this._logger.debug(\"Updated file: %O\", file.toJS());\n            } else {\n                this._logger.error(\"Failed to find ModelFile named \" + file.name);\n            }\n        } else {\n            this._logger.error(\"Unrecognized event:\", name);\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/model-file.ts",
    "content": "import {Record, Set} from \"immutable\";\n\n/**\n * Model file received from the backend\n * Note: Naming convention matches that used in the JSON\n */\ninterface IModelFile {\n    name: string;\n    is_dir: boolean;\n    local_size: number;\n    remote_size: number;\n    state: ModelFile.State;\n    downloading_speed: number;\n    eta: number;\n    full_path: string;\n    is_extractable: boolean;\n    local_created_timestamp: Date;\n    local_modified_timestamp: Date;\n    remote_created_timestamp: Date;\n    remote_modified_timestamp: Date;\n    children: Set<ModelFile>;\n}\n\n// Boiler plate code to set up an immutable class\nconst DefaultModelFile: IModelFile = {\n    name: null,\n    is_dir: null,\n    local_size: null,\n    remote_size: null,\n    state: null,\n    downloading_speed: null,\n    eta: null,\n    full_path: null,\n    is_extractable: null,\n    local_created_timestamp: null,\n    local_modified_timestamp: null,\n    remote_created_timestamp: null,\n    remote_modified_timestamp: null,\n    children: null\n};\nconst ModelFileRecord = Record(DefaultModelFile);\n\n/**\n * Immutable class that implements the interface\n * Pattern inspired by: http://blog.angular-university.io/angular-2-application\n *                      -architecture-building-flux-like-apps-using-redux-and\n *                      -immutable-js-js\n */\nexport class ModelFile extends ModelFileRecord implements IModelFile {\n    name: string;\n    is_dir: boolean;\n    local_size: number;\n    remote_size: number;\n    state: ModelFile.State;\n    downloading_speed: number;\n    eta: number;\n    full_path: string;\n    is_extractable: boolean;\n    local_created_timestamp: Date;\n    local_modified_timestamp: Date;\n    remote_created_timestamp: Date;\n    remote_modified_timestamp: Date;\n    children: Set<ModelFile>;\n\n    constructor(props) {\n        super(props);\n    }\n}\n\n// Additional types\nexport module ModelFile {\n    export function fromJson(json): ModelFile {\n        // Create immutable objects for children as well\n        const children: ModelFile[] = [];\n        for (const child of json.children) {\n            children.push(ModelFile.fromJson(child));\n        }\n        json.children = Set<ModelFile>(children);\n\n        // State mapping\n        json.state = ModelFile.State[json.state.toUpperCase()];\n\n        // Timestamps\n        if (json.local_created_timestamp != null) {\n            json.local_created_timestamp = new Date(1000 * +json.local_created_timestamp);\n        }\n        if (json.local_modified_timestamp != null) {\n            json.local_modified_timestamp = new Date(1000 * +json.local_modified_timestamp);\n        }\n        if (json.remote_created_timestamp != null) {\n            json.remote_created_timestamp = new Date(1000 * +json.remote_created_timestamp);\n        }\n        if (json.remote_modified_timestamp != null) {\n            json.remote_modified_timestamp = new Date(1000 * +json.remote_modified_timestamp);\n        }\n\n        return new ModelFile(json);\n    }\n\n    export enum State {\n        DEFAULT         = <any> \"default\",\n        QUEUED          = <any> \"queued\",\n        DOWNLOADING     = <any> \"downloading\",\n        DOWNLOADED      = <any> \"downloaded\",\n        DELETED         = <any> \"deleted\",\n        EXTRACTING      = <any> \"extracting\",\n        EXTRACTED       = <any> \"extracted\"\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/screenshot-model-files.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"./model-file\";\n\nexport const SCREENSHOT_MODEL_FILES: Immutable.Map<string, ModelFile> = Immutable.Map({\n    \"A Really Cool Video About Cats.mkv\": new ModelFile({\n        name: \"A Really Cool Video About Cats.mkv\",\n        is_dir: false,\n        local_size: 123644865,\n        remote_size: 243644865,\n        state: ModelFile.State.DOWNLOADING,\n        downloading_speed: 512000,\n        eta: 3612,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"My Important Files\": new ModelFile({\n        name: \"My Important Files\",\n        is_dir: true,\n        local_size: 123456,\n        remote_size: 487241252,\n        state: ModelFile.State.DOWNLOADING,\n        downloading_speed: 1212000,\n        eta: 1514,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"That.Show.About.Dragons.8x03.1080p\": new ModelFile({\n        name: \"That.Show.About.Dragons.8x03.1080p\",\n        is_dir: true,\n        local_size: 970712825,\n        remote_size: 970712825,\n        state: ModelFile.State.DOWNLOADED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"ubuntu-17.10-desktop-amd64.iso\": new ModelFile({\n        name: \"ubuntu-17.10-desktop-amd64.iso\",\n        is_dir: false,\n        local_size: null,\n        remote_size: 882722050,\n        state: ModelFile.State.QUEUED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"My Local Folder\": new ModelFile({\n        name: \"My Local Folder\",\n        is_dir: true,\n        local_size: 86311523,\n        remote_size: null,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"My Remote Folder\": new ModelFile({\n        name: \"My Remote Folder\",\n        is_dir: true,\n        local_size: null,\n        remote_size: 7086311523,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Dont.Download.This.Song.mp3\": new ModelFile({\n        name: \"Dont.Download.This.Song.mp3\",\n        is_dir: false,\n        local_size: 11111111,\n        remote_size: 44444444,\n        state: ModelFile.State.DEFAULT,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Folder Deleted Locally\": new ModelFile({\n        name: \"Folder Deleted Locally\",\n        is_dir: true,\n        local_size: null,\n        remote_size: 1024,\n        state: ModelFile.State.DELETED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: false,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"Folder Containing Archives\": new ModelFile({\n        name: \"Folder Containing Archives\",\n        is_dir: true,\n        local_size: 1500000000,\n        remote_size: 1000000000,\n        state: ModelFile.State.EXTRACTING,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        children: Immutable.Set<ModelFile>()\n    }),\n\n    \"archive.rar\": new ModelFile({\n        name: \"archive.rar\",\n        is_dir: false,\n        local_size: 1000000000,\n        remote_size: 1000000000,\n        state: ModelFile.State.EXTRACTED,\n        downloading_speed: null,\n        eta: null,\n        full_path: null,\n        is_extractable: true,\n        children: Immutable.Set<ModelFile>()\n    }),\n});\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-filter.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ViewFile} from \"./view-file\";\nimport {ViewFileFilterCriteria, ViewFileService} from \"./view-file.service\";\nimport {ViewFileOptionsService} from \"./view-file-options.service\";\n\n\nclass AndFilterCriteria implements ViewFileFilterCriteria {\n    constructor(private a: ViewFileFilterCriteria,\n                private b: ViewFileFilterCriteria) {\n    }\n\n    meetsCriteria(viewFile: ViewFile): boolean {\n        return this.a.meetsCriteria(viewFile) && this.b.meetsCriteria(viewFile);\n    }\n}\n\nclass StatusFilterCriteria implements ViewFileFilterCriteria {\n    constructor(private _status: ViewFile.Status) {}\n\n    get status(): ViewFile.Status {\n        return this._status;\n    }\n\n    meetsCriteria(viewFile: ViewFile): boolean {\n        return this._status == null || this._status === viewFile.status;\n    }\n}\n\nclass NameFilterCriteria implements ViewFileFilterCriteria {\n    private _name: string = null;\n    private _queryCandidates = [];\n\n    get name(): string {\n        return this._name;\n    }\n\n    constructor(name: string) {\n        this._name = name;\n        if (this._name != null) {\n            const query = this._name.toLowerCase();\n            this._queryCandidates = [\n                query,\n                // treat dots and spaces as the same\n                query.replace(/\\s/g, \".\"),\n                query.replace(/\\./g, \" \"),\n            ];\n        }\n    }\n\n    meetsCriteria(viewFile: ViewFile): boolean {\n        if (this._name == null || this._name === \"\") { return true; }\n        const search = viewFile.name.toLowerCase();\n        return this._queryCandidates.reduce(\n            (a: boolean, b: string) => a || search.indexOf(b) >= 0,\n            false  // initial value\n        );\n    }\n}\n\n\n/**\n * ViewFileFilterService class provides filtering services for\n * view files\n *\n * This class responds to changes in the filter settings and\n * applies the appropriate filters to the ViewFileService\n */\n@Injectable()\nexport class ViewFileFilterService {\n    private _statusFilter: StatusFilterCriteria = null;\n    private _nameFilter: NameFilterCriteria = null;\n\n    constructor(private _logger: LoggerService,\n                private _viewFileService: ViewFileService,\n                private _viewFileOptionsService: ViewFileOptionsService) {\n        this._viewFileOptionsService.options.subscribe(options => {\n            let updateFilterCriteria = false;\n\n            // Check to see if status filter changed\n            if (this._statusFilter == null ||\n                    this._statusFilter.status !== options.selectedStatusFilter){\n                updateFilterCriteria = true;\n                this._statusFilter = new StatusFilterCriteria(options.selectedStatusFilter);\n                this._logger.debug(\"Status filter set to: \" + options.selectedStatusFilter);\n            }\n\n            // Check to see if the name filter changed\n            if (this._nameFilter == null ||\n                    this._nameFilter.name !== options.nameFilter) {\n                updateFilterCriteria = true;\n                this._nameFilter = new NameFilterCriteria(options.nameFilter);\n                this._logger.debug(\"Name filter set to: \" + options.nameFilter);\n            }\n\n            // Update the filter criteria if necessary\n            if (updateFilterCriteria) {\n                this._viewFileService.setFilterCriteria(this.buildFilterCriteria());\n            }\n        });\n    }\n\n    private buildFilterCriteria(): ViewFileFilterCriteria {\n        if (this._statusFilter != null && this._nameFilter != null) {\n            return new AndFilterCriteria(this._statusFilter, this._nameFilter);\n        } else if (this._statusFilter != null) {\n            return this._statusFilter;\n        } else if (this._nameFilter != null) {\n            return this._nameFilter;\n        } else {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-options.service.ts",
    "content": "import {Inject, Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ViewFileOptions} from \"./view-file-options\";\nimport {ViewFile} from \"./view-file\";\nimport {LOCAL_STORAGE, StorageService} from \"angular-webstorage-service\";\nimport {StorageKeys} from \"../../common/storage-keys\";\n\n\n\n/**\n * ViewFileOptionsService class provides display option services\n * for view files\n *\n * This class is used to broadcast changes to the display options\n */\n@Injectable()\nexport class ViewFileOptionsService {\n\n    private _options: BehaviorSubject<ViewFileOptions>;\n\n    constructor(private _logger: LoggerService,\n                @Inject(LOCAL_STORAGE) private _storage: StorageService) {\n        // Load some options from storage\n        const showDetails: boolean =\n            this._storage.get(StorageKeys.VIEW_OPTION_SHOW_DETAILS) || false;\n        const sortMethod: ViewFileOptions.SortMethod =\n            this._storage.get(StorageKeys.VIEW_OPTION_SORT_METHOD) ||\n                ViewFileOptions.SortMethod.STATUS;\n        const pinFilter: boolean =\n            this._storage.get(StorageKeys.VIEW_OPTION_PIN) || false;\n\n        this._options = new BehaviorSubject(\n            new ViewFileOptions({\n                showDetails: showDetails,\n                sortMethod: sortMethod,\n                selectedStatusFilter: null,\n                nameFilter: null,\n                pinFilter: pinFilter,\n            })\n        );\n    }\n\n    get options(): Observable<ViewFileOptions> {\n        return this._options.asObservable();\n    }\n\n    public setShowDetails(show: boolean) {\n        const options = this._options.getValue();\n        if (options.showDetails !== show) {\n            const newOptions = new ViewFileOptions(options.set(\"showDetails\", show));\n            this._options.next(newOptions);\n            this._storage.set(StorageKeys.VIEW_OPTION_SHOW_DETAILS, show);\n            this._logger.debug(\"ViewOption showDetails set to: \" + newOptions.showDetails);\n        }\n    }\n\n    public setSortMethod(sortMethod: ViewFileOptions.SortMethod) {\n        const options = this._options.getValue();\n        if (options.sortMethod !== sortMethod) {\n            const newOptions = new ViewFileOptions(options.set(\"sortMethod\", sortMethod));\n            this._options.next(newOptions);\n            this._storage.set(StorageKeys.VIEW_OPTION_SORT_METHOD, sortMethod);\n            this._logger.debug(\"ViewOption sortMethod set to: \" + newOptions.sortMethod);\n        }\n    }\n\n    public setSelectedStatusFilter(status: ViewFile.Status) {\n        const options = this._options.getValue();\n        if (options.selectedStatusFilter !== status) {\n            const newOptions = new ViewFileOptions(options.set(\"selectedStatusFilter\", status));\n            this._options.next(newOptions);\n            this._logger.debug(\"ViewOption selectedStatusFilter set to: \" + newOptions.selectedStatusFilter);\n        }\n    }\n\n    public setNameFilter(name: string) {\n        const options = this._options.getValue();\n        if (options.nameFilter !== name) {\n            const newOptions = new ViewFileOptions(options.set(\"nameFilter\", name));\n            this._options.next(newOptions);\n            this._logger.debug(\"ViewOption nameFilter set to: \" + newOptions.nameFilter);\n        }\n    }\n\n    public setPinFilter(pinned: boolean) {\n        const options = this._options.getValue();\n        if (options.pinFilter !== pinned) {\n            const newOptions = new ViewFileOptions(options.set(\"pinFilter\", pinned));\n            this._options.next(newOptions);\n            this._storage.set(StorageKeys.VIEW_OPTION_PIN, pinned);\n            this._logger.debug(\"ViewOption pinFilter set to: \" + newOptions.pinFilter);\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-options.ts",
    "content": "import {Record} from \"immutable\";\n\nimport {ViewFile} from \"./view-file\";\n\n/**\n * View file options\n * Describes display related options for view files\n */\ninterface IViewFileOptions {\n    // Show additional details about the view file\n    showDetails: boolean;\n\n    // Method to use to sort the view file list\n    sortMethod: ViewFileOptions.SortMethod;\n\n    // Status filter setting\n    selectedStatusFilter: ViewFile.Status;\n\n    // Name filter setting\n    nameFilter: string;\n\n    // Track filter pin status\n    pinFilter: boolean;\n}\n\n\n// Boiler plate code to set up an immutable class\nconst DefaultViewFileOptions: IViewFileOptions = {\n    showDetails: null,\n    sortMethod: null,\n    selectedStatusFilter: null,\n    nameFilter: null,\n    pinFilter: null,\n};\nconst ViewFileOptionsRecord = Record(DefaultViewFileOptions);\n\n\n/**\n * Immutable class that implements the interface\n */\nexport class ViewFileOptions extends ViewFileOptionsRecord implements IViewFileOptions {\n    showDetails: boolean;\n    sortMethod: ViewFileOptions.SortMethod;\n    selectedStatusFilter: ViewFile.Status;\n    nameFilter: string;\n    pinFilter: boolean;\n\n    constructor(props) {\n        super(props);\n    }\n}\n\nexport module ViewFileOptions {\n    export enum SortMethod {\n        STATUS,\n        NAME_ASC,\n        NAME_DESC\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file-sort.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ViewFile} from \"./view-file\";\nimport {ViewFileComparator, ViewFileService} from \"./view-file.service\";\nimport {ViewFileOptionsService} from \"./view-file-options.service\";\nimport {ViewFileOptions} from \"./view-file-options\";\n\n\n/**\n * Comparator used to sort the ViewFiles\n * First, sorts by status.\n * Second, sorts by name.\n * @param {ViewFile} a\n * @param {ViewFile} b\n * @returns {number}\n * @private\n */\nconst StatusComparator: ViewFileComparator = (a: ViewFile, b: ViewFile): number => {\n    if (a.status !== b.status) {\n        const statusPriorities = {\n            [ViewFile.Status.EXTRACTING]: 0,\n            [ViewFile.Status.DOWNLOADING]: 1,\n            [ViewFile.Status.QUEUED]: 2,\n            [ViewFile.Status.EXTRACTED]: 3,\n            [ViewFile.Status.DOWNLOADED]: 4,\n            [ViewFile.Status.STOPPED]: 5,\n            [ViewFile.Status.DEFAULT]: 6,\n            [ViewFile.Status.DELETED]: 6  // intermix deleted and default\n        };\n        if (statusPriorities[a.status] !== statusPriorities[b.status]) {\n            return statusPriorities[a.status] - statusPriorities[b.status];\n        }\n    }\n    return a.name.localeCompare(b.name);\n};\n\n/**\n * Comparator used to sort the ViewFiles\n * Sort by name, ascending\n * @param {ViewFile} a\n * @param {ViewFile} b\n * @returns {number}\n * @constructor\n */\nconst NameAscendingComparator: ViewFileComparator = (a: ViewFile, b: ViewFile): number => {\n    return a.name.localeCompare(b.name);\n};\n\n/**\n * Comparator used to sort the ViewFiles\n * Sort by name, descending\n * @param {ViewFile} a\n * @param {ViewFile} b\n * @returns {number}\n * @constructor\n */\nconst NameDescendingComparator: ViewFileComparator = (a: ViewFile, b: ViewFile): number => {\n    return b.name.localeCompare(a.name);\n};\n\n/**\n * ViewFileSortService class provides sorting services for\n * view files\n *\n * This class responds to changes in the sort settings and\n * applies the appropriate comparators to the ViewFileService\n */\n@Injectable()\nexport class ViewFileSortService {\n    private _sortMethod: ViewFileOptions.SortMethod = null;\n\n    constructor(private _logger: LoggerService,\n                private _viewFileService: ViewFileService,\n                private _viewFileOptionsService: ViewFileOptionsService) {\n        this._viewFileOptionsService.options.subscribe(options => {\n            // Check if the sort method changed\n            if (this._sortMethod !== options.sortMethod) {\n                this._sortMethod = options.sortMethod;\n                if (this._sortMethod === ViewFileOptions.SortMethod.STATUS) {\n                    this._viewFileService.setComparator(StatusComparator);\n                    this._logger.debug(\"Comparator set to: Status\");\n                } else if (this._sortMethod === ViewFileOptions.SortMethod.NAME_DESC) {\n                    this._viewFileService.setComparator(NameDescendingComparator);\n                    this._logger.debug(\"Comparator set to: Name Desc\");\n                } else if (this._sortMethod === ViewFileOptions.SortMethod.NAME_ASC) {\n                    this._viewFileService.setComparator(NameAscendingComparator);\n                    this._logger.debug(\"Comparator set to: Name Asc\");\n                } else {\n                    this._viewFileService.setComparator(null);\n                    this._logger.debug(\"Comparator set to: null\");\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../utils/logger.service\";\nimport {ModelFile} from \"./model-file\";\nimport {ModelFileService} from \"./model-file.service\";\nimport {ViewFile} from \"./view-file\";\nimport {MOCK_MODEL_FILES} from \"./mock-model-files\";\nimport {StreamServiceRegistry} from \"../base/stream-service.registry\";\nimport {WebReaction} from \"../utils/rest.service\";\n\n\n/**\n * Interface defining filtering criteria for view files\n */\nexport interface ViewFileFilterCriteria {\n    meetsCriteria(viewFile: ViewFile): boolean;\n}\n\n\n/**\n * Interface for sorting view files\n */\nexport interface ViewFileComparator {\n    // noinspection TsLint\n    (a: ViewFile, b: ViewFile): number;\n}\n\n\n/**\n * ViewFileService class provides the store of view files.\n * It implements the observable service pattern to push updates\n * as they become available.\n *\n * The view model needs to be ordered and have fast lookup/update.\n * Unfortunately, there exists no immutable SortedMap structure.\n * This class stores the following data structures:\n *    1. files: List(ViewFile)\n *              ViewFiles sorted in the display order\n *    2. indices: Map(name, index)\n *                Maps name to its index in sortedList\n * The runtime complexity of operations is:\n *    1. Update w/o state change:\n *          O(1) to find index and update the sorted list\n *    2. Updates w/ state change:\n *          O(1) to find index and update the sorted list\n *          O(n log n) to sort list (might be faster since\n *                     list is mostly sorted already??)\n *          O(n) to update indexMap\n *    3. Add:\n *          O(1) to add to list\n *          O(n log n) to sort list (might be faster since\n *                     list is mostly sorted already??)\n *          O(n) to update indexMap\n *    4. Remove:\n *          O(n) to remove from sorted list\n *          O(n) to update indexMap\n *\n * Filtering:\n *      This service also supports providing a filtered list of view files.\n *      The strategy of using pipes to filter at the component level is not\n *      recommended by Angular: https://angular.io/guide/pipes#appendix-no\n *      -filterpipe-or-orderbypipe\n *      Instead, we provide a separate filtered observer.\n *      Filtering is controlled via a single filter criteria. Advanced filters\n *      need to be built outside the service (see ViewFileFilterService)\n */\n@Injectable()\nexport class ViewFileService {\n\n    private readonly USE_MOCK_MODEL = false;\n\n    private modelFileService: ModelFileService;\n\n    private _files: Immutable.List<ViewFile> = Immutable.List([]);\n    private _filesSubject: BehaviorSubject<Immutable.List<ViewFile>> = new BehaviorSubject(this._files);\n    private _filteredFilesSubject: BehaviorSubject<Immutable.List<ViewFile>> = new BehaviorSubject(this._files);\n    private _indices: Map<string, number> = new Map<string, number>();\n\n    private _prevModelFiles: Immutable.Map<string, ModelFile> = Immutable.Map<string, ModelFile>();\n\n    private _filterCriteria: ViewFileFilterCriteria = null;\n    private _sortComparator: ViewFileComparator = null;\n\n    constructor(private _logger: LoggerService,\n                private _streamServiceRegistry: StreamServiceRegistry) {\n        this.modelFileService = _streamServiceRegistry.modelFileService;\n        const _viewFileService = this;\n\n        if (!this.USE_MOCK_MODEL) {\n            this.modelFileService.files.subscribe({\n                next: modelFiles => {\n                    let t0 = performance.now();\n                    _viewFileService.buildViewFromModelFiles(modelFiles);\n                    let t1 = performance.now();\n                    this._logger.debug(\"ViewFile creation took\", (t1 - t0).toFixed(0), \"ms\");\n                }\n            });\n        } else {\n            // For layout/style testing\n            this.buildViewFromModelFiles(MOCK_MODEL_FILES);\n        }\n    }\n\n    private buildViewFromModelFiles(modelFiles: Immutable.Map<string, ModelFile>) {\n        this._logger.debug(\"Received next model files\");\n\n        // Diff the previous domain model with the current domain model, then apply\n        // those changes to the view model\n        // This is a roughly O(2N) operation on every update, so won't scale well\n        // But should be fine for small models\n        // A more scalable solution would be to subscribe to domain model updates\n        let newViewFiles = this._files;\n\n        const addedNames: string[] = [];\n        const removedNames: string[] = [];\n        const updatedNames: string[] = [];\n        // Loop through old model to find deletions\n        this._prevModelFiles.keySeq().forEach(\n            name => {\n                if (!modelFiles.has(name)) { removedNames.push(name); }\n            }\n        );\n        // Loop through new model to find additions and updates\n        modelFiles.keySeq().forEach(\n            name => {\n                if (!this._prevModelFiles.has(name)) {\n                    addedNames.push(name);\n                } else if (!Immutable.is(modelFiles.get(name), this._prevModelFiles.get(name))) {\n                    updatedNames.push(name);\n                }\n            }\n        );\n\n        let reSort = false;\n        let updateIndices = false;\n        // Do the updates first before indices change (re-sort may be required)\n        updatedNames.forEach(\n            name => {\n                const index = this._indices.get(name);\n                const oldViewFile = newViewFiles.get(index);\n                const newViewFile = ViewFileService.createViewFile(modelFiles.get(name), oldViewFile.isSelected);\n                newViewFiles = newViewFiles.set(index, newViewFile);\n                if (this._sortComparator != null && this._sortComparator(oldViewFile, newViewFile) !== 0) {\n                    reSort = true;\n                }\n            }\n        );\n        // Do the adds (requires re-sort)\n        addedNames.forEach(\n            name => {\n                reSort = true;\n                const viewFile = ViewFileService.createViewFile(modelFiles.get(name));\n                newViewFiles = newViewFiles.push(viewFile);\n                this._indices.set(name, newViewFiles.size - 1);\n            }\n        );\n        // Do the removes (no re-sort required)\n        removedNames.forEach(\n            name => {\n                updateIndices = true;\n                const index = newViewFiles.findIndex(value => value.name === name);\n                newViewFiles = newViewFiles.remove(index);\n                this._indices.delete(name);\n            }\n        );\n\n        if (reSort && this._sortComparator != null) {\n            this._logger.debug(\"Re-sorting view files\");\n            updateIndices = true;\n            newViewFiles = newViewFiles.sort(this._sortComparator).toList();\n        }\n        if (updateIndices) {\n            this._indices.clear();\n            newViewFiles.forEach(\n                (value, index) => this._indices.set(value.name, index)\n            );\n        }\n\n        this._files = newViewFiles;\n        this.pushViewFiles();\n        this._prevModelFiles = modelFiles;\n        this._logger.debug(\"New view model: %O\", this._files.toJS());\n    }\n\n    get files(): Observable<Immutable.List<ViewFile>> {\n        return this._filesSubject.asObservable();\n    }\n\n    get filteredFiles(): Observable<Immutable.List<ViewFile>> {\n        return this._filteredFilesSubject.asObservable();\n    }\n\n    /**\n     * Set a file to be in selected state\n     * @param {ViewFile} file\n     */\n    public setSelected(file: ViewFile) {\n        // Find the selected file, if any\n        // Note: we can optimize this by storing an additional\n        //       state that tracks the selected file\n        //       but that would duplicate state and can introduce\n        //       bugs, so we just search instead\n        let viewFiles = this._files;\n        const unSelectIndex = viewFiles.findIndex(value => value.isSelected);\n\n        // Unset the previously selected file, if any\n        if (unSelectIndex >= 0) {\n            let unSelectViewFile = viewFiles.get(unSelectIndex);\n\n            // Do nothing if file is already selected\n            if (unSelectViewFile.name === file.name) { return; }\n\n            unSelectViewFile = new ViewFile(unSelectViewFile.set(\"isSelected\", false));\n            viewFiles = viewFiles.set(unSelectIndex, unSelectViewFile);\n        }\n\n        // Set the new selected file\n        if (this._indices.has(file.name)) {\n            const index = this._indices.get(file.name);\n            let viewFile = viewFiles.get(index);\n            viewFile = new ViewFile(viewFile.set(\"isSelected\", true));\n            viewFiles = viewFiles.set(index, viewFile);\n        } else {\n            this._logger.error(\"Can't find file to select: \" + file.name);\n        }\n\n        // Send update\n        this._files = viewFiles;\n        this.pushViewFiles();\n    }\n\n    /**\n     * Un-select the currently selected file\n     */\n    public unsetSelected() {\n        // Unset the previously selected file, if any\n        let viewFiles = this._files;\n        const unSelectIndex = viewFiles.findIndex(value => value.isSelected);\n\n        // Unset the previously selected file, if any\n        if (unSelectIndex >= 0) {\n            let unSelectViewFile = viewFiles.get(unSelectIndex);\n\n            unSelectViewFile = new ViewFile(unSelectViewFile.set(\"isSelected\", false));\n            viewFiles = viewFiles.set(unSelectIndex, unSelectViewFile);\n\n            // Send update\n            this._files = viewFiles;\n            this.pushViewFiles();\n        }\n    }\n\n    /**\n     * Queue a file for download\n     * @param {ViewFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public queue(file: ViewFile): Observable<WebReaction> {\n        this._logger.debug(\"Queue view file: \" + file.name);\n        return this.createAction(file, (f) => this.modelFileService.queue(f));\n    }\n\n    /**\n     * Stop a file\n     * @param {ViewFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public stop(file: ViewFile): Observable<WebReaction> {\n        this._logger.debug(\"Stop view file: \" + file.name);\n        return this.createAction(file, (f) => this.modelFileService.stop(f));\n    }\n\n    /**\n     * Extract a file\n     * @param {ViewFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public extract(file: ViewFile): Observable<WebReaction> {\n        this._logger.debug(\"Extract view file: \" + file.name);\n        return this.createAction(file, (f) => this.modelFileService.extract(f));\n    }\n\n    /**\n     * Locally delete a file\n     * @param {ViewFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public deleteLocal(file: ViewFile): Observable<WebReaction> {\n        this._logger.debug(\"Locally delete view file: \" + file.name);\n        return this.createAction(file, (f) => this.modelFileService.deleteLocal(f));\n    }\n\n    /**\n     * Remotely delete a file\n     * @param {ViewFile} file\n     * @returns {Observable<WebReaction>}\n     */\n    public deleteRemote(file: ViewFile): Observable<WebReaction> {\n        this._logger.debug(\"Remotely delete view file: \" + file.name);\n        return this.createAction(file, (f) => this.modelFileService.deleteRemote(f));\n    }\n\n    /**\n     * Set a new filter criteria\n     * @param {ViewFileFilterCriteria} criteria\n     */\n    public setFilterCriteria(criteria: ViewFileFilterCriteria) {\n        this._filterCriteria = criteria;\n        this.pushViewFiles();\n    }\n\n    /**\n     * Sets a new comparator.\n     * @param {ViewFileComparator} comparator\n     */\n    public setComparator(comparator: ViewFileComparator) {\n        this._sortComparator = comparator;\n\n        // Re-sort and regenerate index cache\n        this._logger.debug(\"Re-sorting view files\");\n        let newViewFiles = this._files;\n        if (this._sortComparator != null) {\n            newViewFiles = newViewFiles.sort(this._sortComparator).toList();\n        }\n        this._files = newViewFiles;\n        this._indices.clear();\n        newViewFiles.forEach(\n            (value, index) => this._indices.set(value.name, index)\n        );\n\n        this.pushViewFiles();\n    }\n\n    private static createViewFile(modelFile: ModelFile, isSelected: boolean = false): ViewFile {\n        // Use zero for unknown sizes\n        let localSize: number = modelFile.local_size;\n        if (localSize == null) {\n            localSize = 0;\n        }\n        let remoteSize: number = modelFile.remote_size;\n        if (remoteSize == null) {\n            remoteSize = 0;\n        }\n        let percentDownloaded: number = null;\n        if (remoteSize > 0) {\n            percentDownloaded = Math.trunc(100.0 * localSize / remoteSize);\n        } else {\n            percentDownloaded = 100;\n        }\n\n        // Translate the status\n        let status = null;\n        switch (modelFile.state) {\n            case ModelFile.State.DEFAULT: {\n                if (localSize > 0 && remoteSize > 0) {\n                    status = ViewFile.Status.STOPPED;\n                } else {\n                    status = ViewFile.Status.DEFAULT;\n                }\n                break;\n            }\n            case ModelFile.State.QUEUED: {\n                status = ViewFile.Status.QUEUED;\n                break;\n            }\n            case ModelFile.State.DOWNLOADING: {\n                status = ViewFile.Status.DOWNLOADING;\n                break;\n            }\n            case ModelFile.State.DOWNLOADED: {\n                status = ViewFile.Status.DOWNLOADED;\n                break;\n            }\n            case ModelFile.State.DELETED: {\n                status = ViewFile.Status.DELETED;\n                break;\n            }\n            case ModelFile.State.EXTRACTING: {\n                status = ViewFile.Status.EXTRACTING;\n                break;\n            }\n            case ModelFile.State.EXTRACTED: {\n                status = ViewFile.Status.EXTRACTED;\n                break;\n            }\n        }\n\n        const isQueueable: boolean = [ViewFile.Status.DEFAULT,\n                                    ViewFile.Status.STOPPED,\n                                    ViewFile.Status.DELETED].includes(status)\n                                    && remoteSize > 0;\n        const isStoppable: boolean = [ViewFile.Status.QUEUED,\n                                    ViewFile.Status.DOWNLOADING].includes(status);\n        const isExtractable: boolean = [ViewFile.Status.DEFAULT,\n                                    ViewFile.Status.STOPPED,\n                                    ViewFile.Status.DOWNLOADED,\n                                    ViewFile.Status.EXTRACTED].includes(status)\n                                    && localSize > 0;\n        const isLocallyDeletable: boolean = [ViewFile.Status.DEFAULT,\n                                    ViewFile.Status.STOPPED,\n                                    ViewFile.Status.DOWNLOADED,\n                                    ViewFile.Status.EXTRACTED].includes(status)\n                                    && localSize > 0;\n        const isRemotelyDeletable: boolean = [ViewFile.Status.DEFAULT,\n                                    ViewFile.Status.STOPPED,\n                                    ViewFile.Status.DOWNLOADED,\n                                    ViewFile.Status.EXTRACTED,\n                                    ViewFile.Status.DELETED].includes(status)\n                                    && remoteSize > 0;\n\n        return new ViewFile({\n            name: modelFile.name,\n            isDir: modelFile.is_dir,\n            localSize: localSize,\n            remoteSize: remoteSize,\n            percentDownloaded: percentDownloaded,\n            status: status,\n            downloadingSpeed: modelFile.downloading_speed,\n            eta: modelFile.eta,\n            fullPath: modelFile.full_path,\n            isArchive: modelFile.is_extractable,\n            isSelected: isSelected,\n            isQueueable: isQueueable,\n            isStoppable: isStoppable,\n            isExtractable: isExtractable,\n            isLocallyDeletable: isLocallyDeletable,\n            isRemotelyDeletable: isRemotelyDeletable,\n            localCreatedTimestamp: modelFile.local_created_timestamp,\n            localModifiedTimestamp: modelFile.local_modified_timestamp,\n            remoteCreatedTimestamp: modelFile.remote_created_timestamp,\n            remoteModifiedTimestamp: modelFile.remote_modified_timestamp\n        });\n    }\n\n    /**\n     * Helper method to execute an action on ModelFileService and generate a ViewFileReaction\n     * @param {ViewFile} file\n     * @param {Observable<WebReaction>} action\n     * @returns {Observable<WebReaction>}\n     */\n    private createAction(file: ViewFile,\n                         action: (file: ModelFile) => Observable<WebReaction>)\n            : Observable<WebReaction> {\n        return Observable.create(observer => {\n            if (!this._prevModelFiles.has(file.name)) {\n                // File not found, exit early\n                this._logger.error(\"File to queue not found: \" + file.name);\n                observer.next(new WebReaction(false, null, `File '${file.name}' not found`));\n            } else {\n                const modelFile = this._prevModelFiles.get(file.name);\n                action(modelFile).subscribe(reaction => {\n                    this._logger.debug(\"Received model reaction: %O\", reaction);\n                    observer.next(reaction);\n                });\n            }\n        });\n    }\n\n    private pushViewFiles() {\n        // Unfiltered files\n        this._filesSubject.next(this._files);\n\n        // Filtered files\n        let filteredFiles = this._files;\n        if (this._filterCriteria != null) {\n            filteredFiles = Immutable.List<ViewFile>(\n                this._files.filter(f => this._filterCriteria.meetsCriteria(f))\n            );\n        }\n        this._filteredFilesSubject.next(filteredFiles);\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/files/view-file.ts",
    "content": "import {Record} from \"immutable\";\n\n/**\n * View file\n * Represents the View Model\n */\ninterface IViewFile {\n    name: string;\n    isDir: boolean;\n    localSize: number;\n    remoteSize: number;\n    percentDownloaded: number;\n    status: ViewFile.Status;\n    downloadingSpeed: number;\n    eta: number;\n    fullPath: string;\n    isArchive: boolean;  // corresponds to is_extractable in ModelFile\n    isSelected: boolean;\n    isQueueable: boolean;\n    isStoppable: boolean;\n    // whether file can be queued for extraction (independent of isArchive)\n    isExtractable: boolean;\n    isLocallyDeletable: boolean;\n    isRemotelyDeletable: boolean;\n    // timestamps\n    localCreatedTimestamp: Date;\n    localModifiedTimestamp: Date;\n    remoteCreatedTimestamp: Date;\n    remoteModifiedTimestamp: Date;\n}\n\n// Boiler plate code to set up an immutable class\nconst DefaultViewFile: IViewFile = {\n    name: null,\n    isDir: null,\n    localSize: null,\n    remoteSize: null,\n    percentDownloaded: null,\n    status: null,\n    downloadingSpeed: null,\n    eta: null,\n    fullPath: null,\n    isArchive: null,\n    isSelected: null,\n    isQueueable: null,\n    isStoppable: null,\n    isExtractable: null,\n    isLocallyDeletable: null,\n    isRemotelyDeletable: null,\n    localCreatedTimestamp: null,\n    localModifiedTimestamp: null,\n    remoteCreatedTimestamp: null,\n    remoteModifiedTimestamp: null\n};\nconst ViewFileRecord = Record(DefaultViewFile);\n\n/**\n * Immutable class that implements the interface\n */\nexport class ViewFile extends ViewFileRecord implements IViewFile {\n    name: string;\n    isDir: boolean;\n    localSize: number;\n    remoteSize: number;\n    percentDownloaded: number;\n    status: ViewFile.Status;\n    downloadingSpeed: number;\n    eta: number;\n    // noinspection JSUnusedGlobalSymbols\n    fullPath: string;\n    isArchive: boolean;\n    isSelected: boolean;\n    isQueueable: boolean;\n    isStoppable: boolean;\n    isExtractable: boolean;\n    isLocallyDeletable: boolean;\n    isRemotelyDeletable: boolean;\n    localCreatedTimestamp: Date;\n    localModifiedTimestamp: Date;\n    remoteCreatedTimestamp: Date;\n    remoteModifiedTimestamp: Date;\n\n    constructor(props) {\n        super(props);\n    }\n}\n\nexport module ViewFile {\n    export enum Status {\n        DEFAULT         = <any> \"default\",\n        QUEUED          = <any> \"queued\",\n        DOWNLOADING     = <any> \"downloading\",\n        DOWNLOADED      = <any> \"downloaded\",\n        STOPPED         = <any> \"stopped\",\n        DELETED         = <any> \"deleted\",\n        EXTRACTING      = <any> \"extracting\",\n        EXTRACTED       = <any> \"extracted\"\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/logs/log-record.ts",
    "content": "import {Record} from \"immutable\";\n\n\n/**\n * LogRecord immutable\n */\ninterface ILogRecord {\n    time: Date;\n    level: LogRecord.Level;\n    loggerName: string;\n    message: string;\n    exceptionTraceback: string;\n}\nconst DefaultLogRecord: ILogRecord = {\n    time: null,\n    level: null,\n    loggerName: null,\n    message: null,\n    exceptionTraceback: null,\n};\nconst LogRecordRecord = Record(DefaultLogRecord);\nexport class LogRecord extends LogRecordRecord implements ILogRecord {\n    time: Date;\n    level: LogRecord.Level;\n    loggerName: string;\n    message: string;\n    exceptionTraceback: string;\n\n    constructor(props) {\n        super(props);\n    }\n}\n\n\nexport module LogRecord {\n    export function fromJson(json: LogRecordJson): LogRecord {\n        return new LogRecord({\n            // str -> number, then sec -> ms\n            time: new Date(1000 * +json.time),\n            level: LogRecord.Level[json.level_name],\n            loggerName: json.logger_name,\n            message: json.message,\n            exceptionTraceback: json.exc_tb\n        });\n    }\n\n    export enum Level {\n        DEBUG       = <any> \"DEBUG\",\n        INFO        = <any> \"INFO\",\n        WARNING     = <any> \"WARNING\",\n        ERROR       = <any> \"ERROR\",\n        CRITICAL    = <any> \"CRITICAL\",\n    }\n}\n\n\n/**\n * LogRecord as serialized by the backend.\n * Note: naming convention matches that used in JSON\n */\nexport interface LogRecordJson {\n    time: number;\n    level_name: string;\n    logger_name: string;\n    message: string;\n    exc_tb: string;\n}\n"
  },
  {
    "path": "src/angular/src/app/services/logs/log.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {ReplaySubject} from \"rxjs/ReplaySubject\";\n\nimport {BaseStreamService} from \"../base/base-stream.service\";\nimport {LogRecord} from \"./log-record\";\n\n\n@Injectable()\nexport class LogService extends BaseStreamService {\n\n    private _logs: ReplaySubject<LogRecord> = new ReplaySubject();\n\n    constructor() {\n        super();\n        this.registerEventName(\"log-record\");\n    }\n\n    /**\n     * Logs is a hot observable (i.e. no caching)\n     * @returns {Observable<LogRecord>}\n     */\n    get logs(): Observable<LogRecord> {\n        return this._logs.asObservable();\n    }\n\n    protected onEvent(eventName: string, data: string) {\n        this._logs.next(LogRecord.fromJson(JSON.parse(data)));\n    }\n\n    protected onConnected() {\n        // nothing to do\n    }\n\n    protected onDisconnected() {\n        // nothing to do\n    }\n\n}\n"
  },
  {
    "path": "src/angular/src/app/services/server/server-command.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {BaseWebService} from \"../base/base-web.service\";\nimport {StreamServiceRegistry} from \"../base/stream-service.registry\";\nimport {RestService, WebReaction} from \"../utils/rest.service\";\n\n\n/**\n * ServerCommandService handles sending commands to the backend server\n */\n@Injectable()\nexport class ServerCommandService extends BaseWebService {\n    private readonly RESTART_URL = \"/server/command/restart\";\n\n    constructor(_streamServiceProvider: StreamServiceRegistry,\n                private _restService: RestService) {\n        super(_streamServiceProvider);\n    }\n\n    /**\n     * Send a restart command to the server\n     * @returns {Observable<WebReaction>}\n     */\n    public restart(): Observable<WebReaction> {\n        return this._restService.sendRequest(this.RESTART_URL);\n    }\n\n    protected onConnected() {\n        // Nothing to do\n    }\n\n    protected onDisconnected() {\n        // Nothing to do\n    }\n}\n\n/**\n * ConfigService factory and provider\n */\nexport let serverCommandServiceFactory = (\n    _streamServiceRegistry: StreamServiceRegistry,\n    _restService: RestService\n) => {\n  const serverCommandService = new ServerCommandService(_streamServiceRegistry, _restService);\n  serverCommandService.onInit();\n  return serverCommandService;\n};\n\n// noinspection JSUnusedGlobalSymbols\nexport let ServerCommandServiceProvider = {\n    provide: ServerCommandService,\n    useFactory: serverCommandServiceFactory,\n    deps: [StreamServiceRegistry, RestService]\n};\n"
  },
  {
    "path": "src/angular/src/app/services/server/server-status.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport {Localization} from \"../../common/localization\";\nimport {ServerStatus, ServerStatusJson} from \"./server-status\";\nimport {BaseStreamService} from \"../base/base-stream.service\";\n\n\n@Injectable()\nexport class ServerStatusService extends BaseStreamService {\n\n    private _status: BehaviorSubject<ServerStatus> =\n        new BehaviorSubject(new ServerStatus({\n            server: {\n                up: false,\n                errorMessage: Localization.Notification.STATUS_CONNECTION_WAITING\n            }\n        }));\n\n    constructor() {\n        super();\n        this.registerEventName(\"status\");\n    }\n\n    get status(): Observable<ServerStatus> {\n        return this._status.asObservable();\n    }\n\n    protected onEvent(eventName: string, data: string) {\n        this.parseStatus(data);\n    }\n\n    protected onConnected() {\n        // nothing to do\n    }\n\n    protected onDisconnected() {\n        // Notify the clients\n        this._status.next(new ServerStatus({\n            server: {\n                up: false,\n                errorMessage: Localization.Error.SERVER_DISCONNECTED\n            }\n        }));\n    }\n\n    /**\n     * Parse an event and notify subscribers\n     * @param {string} data\n     */\n    private parseStatus(data: string) {\n        const statusJson: ServerStatusJson = JSON.parse(data);\n        const status = ServerStatus.fromJson(statusJson);\n        this._status.next(status);\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/server/server-status.ts",
    "content": "import {Record} from \"immutable\";\n\n/**\n * ServerStatus immutable\n */\ninterface IServerStatus {\n    server: {\n        up: boolean;\n        errorMessage: string;\n    };\n\n    controller: {\n        latestLocalScanTime: Date;\n        latestRemoteScanTime: Date;\n        latestRemoteScanFailed: boolean;\n        latestRemoteScanError: string;\n    };\n}\nconst DefaultServerStatus: IServerStatus = {\n    server: {\n        up: null,\n        errorMessage: null\n    },\n    controller: {\n        latestLocalScanTime: null,\n        latestRemoteScanTime: null,\n        latestRemoteScanFailed: null,\n        latestRemoteScanError: null\n    }\n};\nconst ServerStatusRecord = Record(DefaultServerStatus);\nexport class ServerStatus extends ServerStatusRecord implements IServerStatus {\n    server: {\n        up: boolean;\n        errorMessage: string;\n    };\n\n    controller: {\n        latestLocalScanTime: Date;\n        latestRemoteScanTime: Date;\n        latestRemoteScanFailed: boolean;\n        latestRemoteScanError: string;\n    };\n\n    constructor(props) {\n        super(props);\n    }\n}\n\n\nexport module ServerStatus {\n    export function fromJson(json: ServerStatusJson): ServerStatus {\n        let latestLocalScanTime: Date = null;\n        if (json.controller.latest_local_scan_time != null) {\n            // str -> number, then sec -> ms\n            latestLocalScanTime = new Date(1000 * +json.controller.latest_local_scan_time);\n        }\n\n        let latestRemoteScanTime: Date = null;\n        if (json.controller.latest_remote_scan_time != null) {\n            // str -> number, then sec -> ms\n            latestRemoteScanTime = new Date(1000 * +json.controller.latest_remote_scan_time);\n        }\n\n        return new ServerStatus({\n            server: {\n                up: json.server.up,\n                errorMessage: json.server.error_msg\n            },\n            controller: {\n                latestLocalScanTime: latestLocalScanTime,\n                latestRemoteScanTime: latestRemoteScanTime,\n                latestRemoteScanFailed: json.controller.latest_remote_scan_failed,\n                latestRemoteScanError: json.controller.latest_remote_scan_error\n            }\n        });\n    }\n}\n\n/**\n * ServerStatus as serialized by the backend.\n * Note: naming convention matches that used in JSON\n */\nexport interface ServerStatusJson {\n    server: {\n        up: boolean;\n        error_msg: string;\n    };\n\n    controller: {\n        latest_local_scan_time: string;\n        latest_remote_scan_time: string;\n        latest_remote_scan_failed: boolean;\n        latest_remote_scan_error: string;\n    };\n}\n"
  },
  {
    "path": "src/angular/src/app/services/settings/config.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport {Config, IConfig} from \"./config\";\nimport {LoggerService} from \"../utils/logger.service\";\nimport {BaseWebService} from \"../base/base-web.service\";\nimport {Localization} from \"../../common/localization\";\nimport {StreamServiceRegistry} from \"../base/stream-service.registry\";\nimport {RestService, WebReaction} from \"../utils/rest.service\";\n\n\n/**\n * ConfigService provides the store for the config\n */\n@Injectable()\nexport class ConfigService extends BaseWebService {\n    private readonly CONFIG_GET_URL = \"/server/config/get\";\n\n    // noinspection UnterminatedStatementJS\n    private readonly CONFIG_SET_URL =\n        (section, option, value) => `/server/config/set/${section}/${option}/${value}`\n\n    private _config: BehaviorSubject<Config> = new BehaviorSubject(null);\n\n    constructor(_streamServiceProvider: StreamServiceRegistry,\n                private _restService: RestService,\n                private _logger: LoggerService) {\n        super(_streamServiceProvider);\n    }\n\n    /**\n     * Returns an observable that provides that latest Config\n     * @returns {Observable<Config>}\n     */\n    get config(): Observable<Config> {\n        return this._config.asObservable();\n    }\n\n    /**\n     * Sets a value in the config\n     * @param {string} section\n     * @param {string} option\n     * @param value\n     * @returns {WebReaction}\n     */\n    public set(section: string, option: string, value: any): Observable<WebReaction> {\n        const valueStr: string = value;\n        const currentConfig = this._config.getValue();\n        if (!currentConfig.has(section) || !currentConfig.get(section).has(option)) {\n            return Observable.create(observer => {\n                observer.next(new WebReaction(false, null, `Config has no option named ${section}.${option}`));\n            });\n        } else if (valueStr.length === 0) {\n            return Observable.create(observer => {\n                observer.next(new WebReaction(\n                    false, null, Localization.Notification.CONFIG_VALUE_BLANK(section, option))\n                );\n            });\n        } else {\n            // Double-encode the value\n            const valueEncoded = encodeURIComponent(encodeURIComponent(valueStr));\n            const url = this.CONFIG_SET_URL(section, option, valueEncoded);\n            const obs = this._restService.sendRequest(url);\n            obs.subscribe({\n                next: reaction => {\n                    if (reaction.success) {\n                        // Update our copy and notify clients\n                        const config = this._config.getValue();\n                        const newConfig = new Config(config.updateIn([section, option], (_) => value));\n                        this._config.next(newConfig);\n                    }\n                }\n            });\n            return obs;\n        }\n    }\n\n    protected onConnected() {\n        // Retry the get\n        this.getConfig();\n    }\n\n    protected onDisconnected() {\n        // Send null config\n        this._config.next(null);\n    }\n\n    private getConfig() {\n        this._logger.debug(\"Getting config...\");\n        this._restService.sendRequest(this.CONFIG_GET_URL).subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    const config_json: IConfig = JSON.parse(reaction.data);\n                    this._config.next(new Config(config_json));\n                } else {\n                    this._config.next(null);\n                }\n            }\n        });\n    }\n}\n\n/**\n * ConfigService factory and provider\n */\nexport let configServiceFactory = (\n    _streamServiceRegistry: StreamServiceRegistry,\n    _restService: RestService,\n    _logger: LoggerService\n) => {\n  const configService = new ConfigService(_streamServiceRegistry, _restService, _logger);\n  configService.onInit();\n  return configService;\n};\n\n// noinspection JSUnusedGlobalSymbols\nexport let ConfigServiceProvider = {\n    provide: ConfigService,\n    useFactory: configServiceFactory,\n    deps: [StreamServiceRegistry, RestService, LoggerService]\n};\n"
  },
  {
    "path": "src/angular/src/app/services/settings/config.ts",
    "content": "import {Record} from \"immutable\";\n\n/**\n * Backend config\n * Note: Naming convention matches that used in the JSON\n */\n\n/*\n * GENERAL\n */\ninterface IGeneral {\n    debug: boolean;\n}\nconst DefaultGeneral: IGeneral = {\n    debug: null\n};\nconst GeneralRecord = Record(DefaultGeneral);\n\n/*\n * LFTP\n */\ninterface ILftp {\n    remote_address: string;\n    remote_username: string;\n    remote_password: string;\n    remote_port: number;\n    remote_path: string;\n    local_path: string;\n    remote_path_to_scan_script: string;\n    use_ssh_key: boolean;\n    num_max_parallel_downloads: number;\n    num_max_parallel_files_per_download: number;\n    num_max_connections_per_root_file: number;\n    num_max_connections_per_dir_file: number;\n    num_max_total_connections: number;\n    use_temp_file: boolean;\n}\nconst DefaultLftp: ILftp = {\n    remote_address: null,\n    remote_username: null,\n    remote_password: null,\n    remote_port: null,\n    remote_path: null,\n    local_path: null,\n    remote_path_to_scan_script: null,\n    use_ssh_key: null,\n    num_max_parallel_downloads: null,\n    num_max_parallel_files_per_download: null,\n    num_max_connections_per_root_file: null,\n    num_max_connections_per_dir_file: null,\n    num_max_total_connections: null,\n    use_temp_file: null,\n};\nconst LftpRecord = Record(DefaultLftp);\n\n/*\n * CONTROLLER\n */\ninterface IController {\n    interval_ms_remote_scan: number;\n    interval_ms_local_scan: number;\n    interval_ms_downloading_scan: number;\n    extract_path: string;\n    use_local_path_as_extract_path: boolean;\n}\nconst DefaultController: IController = {\n    interval_ms_remote_scan: null,\n    interval_ms_local_scan: null,\n    interval_ms_downloading_scan: null,\n    extract_path: null,\n    use_local_path_as_extract_path: null,\n};\nconst ControllerRecord = Record(DefaultController);\n\n/*\n * WEB\n */\ninterface IWeb {\n    port: number;\n}\nconst DefaultWeb: IWeb = {\n    port: null\n};\nconst WebRecord = Record(DefaultWeb);\n\n/*\n * AUTOQUEUE\n */\ninterface IAutoQueue {\n    enabled: boolean;\n    patterns_only: boolean;\n    auto_extract: boolean;\n}\nconst DefaultAutoQueue: IAutoQueue = {\n    enabled: null,\n    patterns_only: null,\n    auto_extract: null,\n};\nconst AutoQueueRecord = Record(DefaultAutoQueue);\n\n\n\n/*\n * CONFIG\n */\nexport interface IConfig {\n    general: IGeneral;\n    lftp: ILftp;\n    controller: IController;\n    web: IWeb;\n    autoqueue: IAutoQueue;\n\n}\nconst DefaultConfig: IConfig = {\n    general: null,\n    lftp: null,\n    controller: null,\n    web: null,\n    autoqueue: null,\n};\nconst ConfigRecord = Record(DefaultConfig);\n\n\nexport class Config extends ConfigRecord implements IConfig {\n    general: IGeneral;\n    lftp: ILftp;\n    controller: IController;\n    web: IWeb;\n    autoqueue: IAutoQueue;\n\n    constructor(props) {\n        // Create immutable members\n        super({\n            general: GeneralRecord(props.general),\n            lftp: LftpRecord(props.lftp),\n            controller: ControllerRecord(props.controller),\n            web: WebRecord(props.web),\n            autoqueue: AutoQueueRecord(props.autoqueue)\n        });\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/connected.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport {LoggerService} from \"./logger.service\";\nimport {BaseStreamService} from \"../base/base-stream.service\";\nimport {RestService} from \"./rest.service\";\n\n\n/**\n * ConnectedService exposes the connection status to clients\n * as an Observable\n */\n@Injectable()\nexport class ConnectedService extends BaseStreamService {\n\n    // For clients\n    private _connectedSubject: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n    constructor() {\n        super();\n        // No events to register\n    }\n\n    get connected(): Observable<boolean> {\n        return this._connectedSubject.asObservable();\n    }\n\n    protected onEvent(eventName: string, data: string) {\n        // Nothing to do\n    }\n\n    protected onConnected() {\n        if(this._connectedSubject.getValue() === false) {\n            this._connectedSubject.next(true);\n        }\n    }\n\n    protected onDisconnected() {\n        if(this._connectedSubject.getValue() === true) {\n            this._connectedSubject.next(false);\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/dom.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\n\n/**\n * DomService facilitates inter-component communication related\n * to DOM updates\n */\n@Injectable()\nexport class DomService {\n    private _headerHeight: BehaviorSubject<number> = new BehaviorSubject(0);\n\n    get headerHeight(): Observable<number>{\n        return this._headerHeight.asObservable();\n    }\n\n    public setHeaderHeight(height: number) {\n        if(height !== this._headerHeight.getValue()) {\n            this._headerHeight.next(height);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/logger.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\n@Injectable()\nexport class LoggerService {\n\n    public level: LoggerService.Level;\n\n    constructor() {\n        this.level = LoggerService.Level.DEBUG;\n    }\n\n    get debug() {\n        if (this.level >= LoggerService.Level.DEBUG) {\n            return console.debug.bind(console);\n        } else {\n            return () => {};\n        }\n    }\n\n    get info() {\n        if (this.level >= LoggerService.Level.INFO) {\n            return console.log.bind(console);\n        } else {\n            return () => {};\n        }\n    }\n\n    // noinspection JSUnusedGlobalSymbols\n    get warn() {\n        if (this.level >= LoggerService.Level.WARN) {\n            return console.warn.bind(console);\n        } else {\n            return () => {};\n        }\n    }\n\n    get error() {\n        if (this.level >= LoggerService.Level.ERROR) {\n            return console.error.bind(console);\n        } else {\n            return () => {};\n        }\n    }\n}\n\nexport module LoggerService {\n    export enum Level {\n        ERROR,\n        WARN,\n        INFO,\n        DEBUG,\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/notification.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/Rx\";\n\nimport * as Immutable from \"immutable\";\n\nimport {Notification} from \"./notification\";\n\n\n/**\n * NotificationService manages which notifications are shown or hidden\n */\n@Injectable()\nexport class NotificationService {\n\n    private _notifications: Immutable.List<Notification> = Immutable.List([]);\n    private _notificationsSubject: BehaviorSubject<Immutable.List<Notification>> =\n            new BehaviorSubject(this._notifications);\n\n    // noinspection UnterminatedStatementJS\n    private _comparator = (a: Notification, b: Notification): number => {\n        // First sort by level\n        if (a.level !== b.level) {\n            const statusPriorities = {\n                [Notification.Level.DANGER]: 0,\n                [Notification.Level.WARNING]: 1,\n                [Notification.Level.INFO]: 2,\n                [Notification.Level.SUCCESS]: 3,\n            };\n            if (statusPriorities[a.level] !== statusPriorities[b.level]) {\n                return statusPriorities[a.level] - statusPriorities[b.level];\n            }\n        }\n        // Then sort by timestamp\n        return b.timestamp - a.timestamp;\n    }\n\n    constructor() {}\n\n    get notifications(): Observable<Immutable.List<Notification>> {\n        return this._notificationsSubject.asObservable();\n    }\n\n    public show(notification: Notification) {\n        const index = this._notifications.findIndex(value => Immutable.is(value, notification));\n        if (index < 0) {\n            const notifications = this._notifications.push(notification);\n            this._notifications = notifications.sort(this._comparator).toList();\n            this._notificationsSubject.next(this._notifications);\n        }\n    }\n\n    public hide(notification: Notification) {\n        const index = this._notifications.findIndex(value => Immutable.is(value, notification));\n        if (index >= 0) {\n            this._notifications = this._notifications.remove(index);\n            this._notificationsSubject.next(this._notifications);\n        }\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/notification.ts",
    "content": "import {Record} from \"immutable\";\n\ninterface INotification {\n    level: Notification.Level;\n    text: string;\n    timestamp: number;\n    dismissible: boolean;\n}\nconst DefaultNotification: INotification = {\n    level: null,\n    text: null,\n    timestamp: null,\n    dismissible: false,\n};\nconst NotificationRecord = Record(DefaultNotification);\n\n\nexport class Notification extends NotificationRecord implements INotification {\n    level: Notification.Level;\n    text: string;\n    timestamp: number;\n    dismissible: boolean;\n\n    constructor(props) {\n        props.timestamp = Date.now();\n\n        super(props);\n    }\n}\n\n\nexport module Notification {\n    export enum Level {\n        SUCCESS         = <any> \"success\",\n        INFO            = <any> \"info\",\n        WARNING         = <any> \"warning\",\n        DANGER          = <any> \"danger\",\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/rest.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\nimport {HttpClient, HttpErrorResponse} from \"@angular/common/http\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {LoggerService} from \"./logger.service\";\n\n\n/**\n * WebReaction encapsulates the response for an action\n * executed on a BaseWebService\n */\nexport class WebReaction {\n    readonly success: boolean;\n    readonly data: string;\n    readonly errorMessage: string;\n\n    constructor(success: boolean, data: string, errorMessage: string) {\n        this.success = success;\n        this.data = data;\n        this.errorMessage = errorMessage;\n    }\n}\n\n\n/**\n * RestService exposes the HTTP REST API to clients\n */\n@Injectable()\nexport class RestService {\n\n    constructor(private _logger: LoggerService,\n                private _http: HttpClient) {\n    }\n\n    /**\n     * Send backend a request and generate a WebReaction response\n     * @param {string} url\n     * @returns {Observable<WebReaction>}\n     */\n    public sendRequest(url: string): Observable<WebReaction> {\n        return Observable.create(observer => {\n            this._http.get(url, {responseType: \"text\"})\n                .subscribe(\n                data => {\n                    this._logger.debug(\"%s http response: %s\", url, data);\n                    observer.next(new WebReaction(true, data, null));\n                },\n                (err: HttpErrorResponse) => {\n                    let errorMessage = null;\n                    this._logger.debug(\"%s error: %O\", url, err);\n                    if (err.error instanceof Event) {\n                        errorMessage = err.error.type;\n                    } else {\n                        errorMessage = err.error;\n                    }\n                    observer.next(new WebReaction(false, null, errorMessage));\n                }\n            );\n        }).shareReplay(1);\n        // shareReplay is needed to:\n        //      prevent duplicate http requests\n        //      share result with those that subscribe after the value was published\n        // More info: https://blog.thoughtram.io/angular/2016/06/16/cold-vs-hot-observables.html\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/services/utils/version-check.service.ts",
    "content": "import {Injectable} from \"@angular/core\";\n\nimport * as compareVersions from \"compare-versions\";\n\nimport {RestService} from \"./rest.service\";\nimport {LoggerService} from \"./logger.service\";\nimport {NotificationService} from \"./notification.service\";\nimport {Notification} from \"./notification\";\nimport {Localization} from \"../../common/localization\";\n\ndeclare function require(moduleName: string): any;\nconst { version: appVersion } = require(\"../../../../package.json\");\n\n\n/**\n * VersionCheckService checks for the latest version and\n * triggers a notification\n */\n@Injectable()\nexport class VersionCheckService {\n    private readonly GITHUB_LATEST_RELEASE_URL =\n        \"https://api.github.com/repos/ipsingh06/seedsync/releases/latest\";\n\n    constructor(private _restService: RestService,\n                private _notifService: NotificationService,\n                private _logger: LoggerService) {\n        this.checkVersion();\n    }\n\n    private checkVersion() {\n        this._restService.sendRequest(this.GITHUB_LATEST_RELEASE_URL).subscribe({\n            next: reaction => {\n                if (reaction.success) {\n                    let jsonResponse;\n                    let latestVersion;\n                    let url;\n                    try {\n                        jsonResponse = JSON.parse(reaction.data);\n                        latestVersion = jsonResponse.tag_name;\n                        url = jsonResponse.html_url;\n                    } catch (e) {\n                        this._logger.error(\"Unable to parse github response: %O\", e);\n                        return;\n                    }\n                    const message = Localization.Notification.NEW_VERSION_AVAILABLE(url);\n                    this._logger.debug(\"Latest version: \", message);\n                    if (VersionCheckService.isVersionNewer(latestVersion)) {\n                        const notif = new Notification({\n                            level: Notification.Level.INFO,\n                            dismissible: true,\n                            text: message\n                        });\n                        this._notifService.show(notif);\n                    }\n                } else {\n                    this._logger.warn(\"Unable to fetch latest version info: %O\", reaction);\n                }\n            }\n        });\n    }\n\n    private static isVersionNewer(version: string): boolean {\n        // Remove the 'v' at the beginning, if any\n        version = version.replace(/^v/, \"\");\n        // Replace - with .\n        version = version.replace(/-/g, \".\");\n        return compareVersions(version, appVersion) > 0;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-event-source.ts",
    "content": "declare let spyOn: any;\n\nexport class MockEventSource {\n    url: string;\n    onopen: (event: Event) => any;\n    onerror: (event: Event) => any;\n\n    eventListeners: Map<string, EventListener> = new Map();\n\n    constructor(url: string) {\n        this.url = url;\n    }\n\n    addEventListener(type: string, listener: EventListener) {\n        this.eventListeners.set(type, listener);\n    }\n\n    close() {}\n}\n\nexport function createMockEventSource(url: string): MockEventSource {\n    let mockEventSource = new MockEventSource(url);\n    spyOn(mockEventSource, 'addEventListener').and.callThrough();\n    spyOn(mockEventSource, 'close').and.callThrough();\n    return mockEventSource;\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-model-file.service.ts",
    "content": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"../../services/files/model-file\";\n\n\nexport class MockModelFileService {\n\n    _files = new Subject<Immutable.Map<string, ModelFile>>();\n\n    get files(): Observable<Immutable.Map<string, ModelFile>> {\n        return this._files.asObservable();\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-rest.service.ts",
    "content": "import {Observable} from \"rxjs/Observable\";\n\nimport {WebReaction} from \"../../services/utils/rest.service\";\n\nexport class MockRestService {\n    public sendRequest(url: string): Observable<WebReaction> {\n        return null;\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-storage.service.ts",
    "content": "export class MockStorageService {\n    // noinspection JSUnusedLocalSymbols\n    public get(key: string): any {}\n\n    // noinspection JSUnusedLocalSymbols\n    set(key: string, value: any): void {}\n\n    // noinspection JSUnusedLocalSymbols\n    remove(key: string): void {}\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-stream-service.registry.ts",
    "content": "import {TestBed} from \"@angular/core/testing\";\n\nimport {ConnectedService} from \"../../services/utils/connected.service\";\nimport {MockModelFileService} from \"./mock-model-file.service\";\n\n\nexport class MockStreamServiceRegistry {\n    // Real connected service\n    connectedService = TestBed.get(ConnectedService);\n\n    // Fake model file service\n    modelFileService = new MockModelFileService();\n\n    connect() {\n        this.connectedService.notifyConnected();\n    }\n\n    disconnect() {\n        this.connectedService.notifyDisconnected();\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-view-file-options.service.ts",
    "content": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ViewFileOptions} from \"../../services/files/view-file-options\";\n\n\nexport class MockViewFileOptionsService {\n\n    _options = new Subject<ViewFileOptions>();\n\n    get options(): Observable<ViewFileOptions> {\n        return this._options.asObservable();\n    }\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/mocks/mock-view-file.service.ts",
    "content": "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ViewFile} from \"../../services/files/view-file\";\nimport {ViewFileComparator, ViewFileFilterCriteria} from \"../../services/files/view-file.service\";\n\n\nexport class MockViewFileService {\n\n    _files = new Subject<Immutable.List<ViewFile>>();\n    _filteredFiles = new Subject<Immutable.List<ViewFile>>();\n\n    get files(): Observable<Immutable.List<ViewFile>> {\n        return this._files.asObservable();\n    }\n\n    get filteredFiles(): Observable<Immutable.List<ViewFile>> {\n        return this._filteredFiles.asObservable();\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    public setFilterCriteria(criteria: ViewFileFilterCriteria) {}\n\n    // noinspection JSUnusedLocalSymbols\n    public setComparator(comparator: ViewFileComparator) {}\n}\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/autoqueue/autoqueue.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/common/http/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {AutoQueueService} from \"../../../../services/autoqueue/autoqueue.service\";\nimport {AutoQueuePattern} from \"../../../../services/autoqueue/autoqueue-pattern\";\nimport {StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\nimport {MockStreamServiceRegistry} from \"../../../mocks/mock-stream-service.registry\";\nimport {RestService} from \"../../../../services/utils/rest.service\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\n\n// noinspection JSUnusedLocalSymbols\nconst DoNothing = {next: reaction => {}};\n\n\ndescribe(\"Testing autoqueue service\", () => {\n    let mockRegistry: MockStreamServiceRegistry;\n    let httpMock: HttpTestingController;\n    let aqService: AutoQueueService;\n\n\n    beforeEach(fakeAsync(() => {\n        TestBed.configureTestingModule({\n            imports: [\n                HttpClientTestingModule\n            ],\n            providers: [\n                AutoQueueService,\n                LoggerService,\n                RestService,\n                ConnectedService,\n                {provide: StreamServiceRegistry, useClass: MockStreamServiceRegistry}\n            ]\n        });\n\n        mockRegistry = TestBed.get(StreamServiceRegistry);\n        httpMock = TestBed.get(HttpTestingController);\n        aqService = TestBed.get(AutoQueueService);\n\n        // Connect the services\n        mockRegistry.connect();\n\n        // Finish the init\n        aqService.onInit();\n    }));\n\n    it(\"should create an instance\", () => {\n        expect(aqService).toBeDefined();\n    });\n\n    it(\"should parse patterns json correctly\", fakeAsync(() => {\n        const patternsJson = [\n            {\"pattern\": \"one\"},\n            {\"pattern\": \"tw o\"},\n            {\"pattern\": \"th'ree\"},\n            {\"pattern\": \"fo\\\"ur\"},\n            {\"pattern\": \"fi%ve\"},\n        ];\n        httpMock.expectOne(\"/server/autoqueue/get\").flush(patternsJson);\n\n        const expectedPatterns = [\n            new AutoQueuePattern({pattern: \"one\"}),\n            new AutoQueuePattern({pattern: \"tw o\"}),\n            new AutoQueuePattern({pattern: \"th'ree\"}),\n            new AutoQueuePattern({pattern: \"fo\\\"ur\"}),\n            new AutoQueuePattern({pattern: \"fi%ve\"})\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(patterns.size).toBe(5);\n                for (let i = 0; i < patterns.size; i++) {\n                    expect(Immutable.is(patterns.get(i), expectedPatterns[i])).toBe(true);\n                }\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should get empty list on get error 404\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush(\n        \"Not found\",\n        {status: 404, statusText: \"Bad Request\"}\n        );\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(patterns.size).toBe(0);\n                actualCount++;\n            }\n        });\n\n\n        tick();\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should get empty list on get network error\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").error(new ErrorEvent(\"mock error\"));\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(patterns.size).toBe(0);\n                actualCount++;\n            }\n        });\n\n\n        tick();\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should get empty list on disconnect\", fakeAsync(() => {\n        const patternsJson = [\n            {\"pattern\": \"one\"}\n        ];\n        httpMock.expectOne(\"/server/autoqueue/get\").flush(patternsJson);\n\n        const expectedPatterns = [\n            Immutable.List([new AutoQueuePattern({pattern: \"one\"})]),\n            Immutable.List([])\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(Immutable.is(patterns, expectedPatterns[actualCount++])).toBe(true);\n            }\n        });\n\n        tick();\n\n        // status disconnect\n        mockRegistry.disconnect();\n        tick();\n\n        expect(actualCount).toBe(2);\n        httpMock.verify();\n    }));\n\n    it(\"should retry GET on disconnect\", fakeAsync(() => {\n        // first connect\n        httpMock.expectOne(\"/server/autoqueue/get\").flush(\"[]\");\n\n        tick();\n\n        // status disconnect\n        mockRegistry.disconnect();\n        tick();\n\n        // status reconnect\n        mockRegistry.connect();\n        tick();\n\n        httpMock.expectOne(\"/server/autoqueue/get\").flush(\"[]\");\n        tick();\n        httpMock.verify();\n    }));\n\n    it(\"should send a GET on add pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([]);\n\n        let actualCount = 0;\n        aqService.add(\"one\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(true);\n               actualCount++;\n            }\n        });\n        httpMock.expectOne(\"/server/autoqueue/add/one\").flush(\"{}\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on add pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([]);\n\n        aqService.add(\"test\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/test\").flush(\"{}\");\n        aqService.add(\"test space\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/test%2520space\").flush(\"{}\");\n        aqService.add(\"test/slash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/test%252Fslash\").flush(\"{}\");\n        aqService.add(\"test\\\"doublequote\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/test%2522doublequote\").flush(\"{}\");\n        aqService.add(\"/test/leadingslash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/%252Ftest%252Fleadingslash\").flush(\"{}\");\n\n        httpMock.verify();\n    }));\n\n    it(\"should return error on adding existing pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            {\"pattern\": \"one\"}\n        ]);\n\n        let actualCount = 0;\n        aqService.add(\"one\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Pattern 'one' already exists.\");\n               actualCount++;\n            }\n        });\n        httpMock.expectNone(\"/server/autoqueue/add/one\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should return error on adding empty pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([]);\n\n        let actualCount = 0;\n        aqService.add(\"\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Cannot add an empty autoqueue pattern.\");\n               actualCount++;\n            }\n        });\n        aqService.add(\" \").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Cannot add an empty autoqueue pattern.\");\n               actualCount++;\n            }\n        });\n        aqService.add(null).subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Cannot add an empty autoqueue pattern.\");\n               actualCount++;\n            }\n        });\n        httpMock.expectNone(\"/server/autoqueue/add/\");\n\n        tick();\n\n        expect(actualCount).toBe(3);\n        httpMock.verify();\n    }));\n\n    it(\"should send updated patterns after an add pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([]);\n\n\n        const expectedPatterns = [\n            Immutable.List([]),\n            Immutable.List([new AutoQueuePattern({pattern: \"one\"})])\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(Immutable.is(patterns, expectedPatterns[actualCount++])).toBe(true);\n            }\n        });\n\n        aqService.add(\"one\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/add/one\").flush(\"{}\");\n\n        tick();\n\n        expect(actualCount).toBe(2);\n        httpMock.verify();\n    }));\n\n    it(\"should NOT send updated patterns after a failed add\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            new AutoQueuePattern({pattern: \"one\"})\n        ]);\n\n        const expectedPatterns = [\n            Immutable.List([new AutoQueuePattern({pattern: \"one\"})])\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(Immutable.is(patterns, expectedPatterns[actualCount++])).toBe(true);\n            }\n        });\n\n        aqService.add(\"one\").subscribe(DoNothing);\n        httpMock.expectNone(\"/server/autoqueue/add/one\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send a GET on remove pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            new AutoQueuePattern({pattern: \"one\"})\n        ]);\n\n        let actualCount = 0;\n        aqService.remove(\"one\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(true);\n               actualCount++;\n            }\n        });\n        httpMock.expectOne(\"/server/autoqueue/remove/one\").flush(\"{}\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on remove pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            new AutoQueuePattern({pattern: \"test\"}),\n            new AutoQueuePattern({pattern: \"test space\"}),\n            new AutoQueuePattern({pattern: \"test/slash\"}),\n            new AutoQueuePattern({pattern: \"test\\\"doublequote\"}),\n            new AutoQueuePattern({pattern: \"/test/leadingslash\"})\n        ]);\n\n        aqService.remove(\"test\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/test\").flush(\"{}\");\n        aqService.remove(\"test space\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/test%2520space\").flush(\"{}\");\n        aqService.remove(\"test/slash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/test%252Fslash\").flush(\"{}\");\n        aqService.remove(\"test\\\"doublequote\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/test%2522doublequote\").flush(\"{}\");\n        aqService.remove(\"/test/leadingslash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/%252Ftest%252Fleadingslash\").flush(\"{}\");\n\n        httpMock.verify();\n    }));\n\n    it(\"should return error on removing non-existing pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n        ]);\n\n        let actualCount = 0;\n        aqService.remove(\"one\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Pattern 'one' not found.\");\n               actualCount++;\n            }\n        });\n        httpMock.expectNone(\"/server/autoqueue/remove/one\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should return error on removing empty pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n        ]);\n\n        let actualCount = 0;\n        aqService.remove(\"\").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Pattern '' not found.\");\n               actualCount++;\n            }\n        });\n        aqService.remove(\" \").subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Pattern ' ' not found.\");\n               actualCount++;\n            }\n        });\n        aqService.remove(null).subscribe({\n            next: reaction => {\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Pattern 'null' not found.\");\n               actualCount++;\n            }\n        });\n        httpMock.expectNone(\"/server/autoqueue/remove/\");\n\n        tick();\n\n        expect(actualCount).toBe(3);\n        httpMock.verify();\n    }));\n\n    it(\"should send updated patterns after a remove pattern\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            new AutoQueuePattern({pattern: \"one\"}),\n            new AutoQueuePattern({pattern: \"two\"})\n        ]);\n\n\n        const expectedPatterns = [\n            Immutable.List([\n                new AutoQueuePattern({pattern: \"one\"}),\n                new AutoQueuePattern({pattern: \"two\"})\n            ]),\n            Immutable.List([\n                new AutoQueuePattern({pattern: \"two\"})\n            ])\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(Immutable.is(patterns, expectedPatterns[actualCount++])).toBe(true);\n            }\n        });\n\n        aqService.remove(\"one\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/autoqueue/remove/one\").flush(\"{}\");\n\n        tick();\n\n        expect(actualCount).toBe(2);\n        httpMock.verify();\n    }));\n\n    it(\"should NOT send updated patterns after a failed remove\", fakeAsync(() => {\n        httpMock.expectOne(\"/server/autoqueue/get\").flush([\n            new AutoQueuePattern({pattern: \"one\"})\n        ]);\n\n        const expectedPatterns = [\n            Immutable.List([new AutoQueuePattern({pattern: \"one\"})])\n        ];\n\n        let actualCount = 0;\n        aqService.patterns.subscribe({\n            next: patterns => {\n                expect(Immutable.is(patterns, expectedPatterns[actualCount++])).toBe(true);\n            }\n        });\n\n        aqService.remove(\"two\").subscribe(DoNothing);\n        httpMock.expectNone(\"/server/autoqueue/remove/two\");\n\n        tick();\n\n        expect(actualCount).toBe(1);\n        httpMock.verify();\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/base-stream.service.spec.ts",
    "content": "import {TestBed} from \"@angular/core/testing\";\n\nimport {BaseStreamService} from \"../../../../services/base/base-stream.service\";\nimport {createMockEventSource, MockEventSource} from \"../../../mocks/mock-event-source\";\nimport {EventSourceFactory} from \"../../../../services/base/stream-service.registry\";\n\n\n// noinspection JSUnusedLocalSymbols\nconst DoNothing = {next: reaction => {}};\n\n\nclass TestBaseStreamService extends BaseStreamService {\n    eventList = [];\n\n    public registerEventName(eventName: string) {\n        super.registerEventName(eventName);\n    }\n\n    protected onEvent(eventName: string, data: string) {\n        console.log(eventName, data);\n        this.eventList.push([eventName, data]);\n    }\n\n    public onConnected() {}\n\n    public onDisconnected() {}\n}\n\n\ndescribe(\"Testing base stream service\", () => {\n    let baseStreamService: TestBaseStreamService;\n\n    let mockEventSource: MockEventSource;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                TestBaseStreamService,\n            ]\n        });\n\n        spyOn(EventSourceFactory, 'createEventSource').and.callFake(\n            (url: string) => {\n                mockEventSource = createMockEventSource(url);\n                return mockEventSource;\n            }\n        );\n\n        baseStreamService = TestBed.get(TestBaseStreamService);\n        spyOn(baseStreamService, \"onConnected\");\n        spyOn(baseStreamService, \"onDisconnected\");\n    });\n\n    it(\"should create an instance\", () => {\n        expect(baseStreamService).toBeDefined();\n    });\n\n    it(\"should return all registered event names\", () => {\n        baseStreamService.registerEventName(\"event1\");\n        baseStreamService.registerEventName(\"event2\");\n        baseStreamService.registerEventName(\"event3\");\n        expect(baseStreamService.getEventNames()).toEqual([\"event1\", \"event2\", \"event3\"]);\n    });\n\n    it(\"should forward the event notifications\", () => {\n        baseStreamService.notifyEvent(\"event1\", \"data1\");\n        expect(baseStreamService.eventList).toEqual([\n            [\"event1\", \"data1\"]\n        ]);\n        baseStreamService.notifyEvent(\"event2\", \"data2\");\n        expect(baseStreamService.eventList).toEqual([\n            [\"event1\", \"data1\"], [\"event2\", \"data2\"]\n        ]);\n        baseStreamService.notifyEvent(\"event3\", \"data3\");\n        expect(baseStreamService.eventList).toEqual([\n            [\"event1\", \"data1\"], [\"event2\", \"data2\"], [\"event3\", \"data3\"]\n        ]);\n    });\n\n    it(\"should forward the connected notifications\", () => {\n        baseStreamService.notifyConnected();\n        expect(baseStreamService.onConnected).toHaveBeenCalledTimes(1);\n        baseStreamService.notifyConnected();\n        expect(baseStreamService.onConnected).toHaveBeenCalledTimes(2);\n    });\n\n    it(\"should forward the disconnected notifications\", () => {\n        baseStreamService.notifyDisconnected();\n        expect(baseStreamService.onDisconnected).toHaveBeenCalledTimes(1);\n        baseStreamService.notifyDisconnected();\n        expect(baseStreamService.onDisconnected).toHaveBeenCalledTimes(2);\n    });\n\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/base-web.service.spec.ts",
    "content": "import {TestBed} from \"@angular/core/testing\";\n\nimport {BaseWebService} from \"../../../../services/base/base-web.service\";\nimport {StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\nimport {MockStreamServiceRegistry} from \"../../../mocks/mock-stream-service.registry\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\n\n\n// noinspection JSUnusedLocalSymbols\nconst DoNothing = {next: reaction => {}};\n\n\nclass TestBaseWebService extends BaseWebService {\n    public onConnected(): void {}\n\n    public onDisconnected(): void {}\n}\n\ndescribe(\"Testing base web service\", () => {\n    let baseWebService: TestBaseWebService;\n\n    let mockRegistry: MockStreamServiceRegistry;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                TestBaseWebService,\n                LoggerService,\n                ConnectedService,\n                {provide: StreamServiceRegistry, useClass: MockStreamServiceRegistry}\n            ]\n        });\n\n        mockRegistry = TestBed.get(StreamServiceRegistry);\n\n        baseWebService = TestBed.get(TestBaseWebService);\n        spyOn(baseWebService, \"onConnected\");\n        spyOn(baseWebService, \"onDisconnected\");\n\n        // Initialize base web service\n        baseWebService.onInit();\n    });\n\n    it(\"should create an instance\", () => {\n        expect(baseWebService).toBeDefined();\n    });\n\n    it(\"should forward the connected notification\", () => {\n        mockRegistry.connectedService.notifyConnected();\n        expect(baseWebService.onConnected).toHaveBeenCalledTimes(1);\n    });\n\n    it(\"should forward the disconnected notification\", () => {\n        mockRegistry.connectedService.notifyDisconnected();\n        expect(baseWebService.onDisconnected).toHaveBeenCalledTimes(1);\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/base/stream-service.registry.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {createMockEventSource, MockEventSource} from \"../../../mocks/mock-event-source\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {EventSourceFactory, IStreamService, StreamDispatchService, StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\nimport {ModelFileService} from \"../../../../services/files/model-file.service\";\nimport {ServerStatusService} from \"../../../../services/server/server-status.service\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\nimport {LogService} from \"../../../../services/logs/log.service\";\n\n\nclass MockStreamService implements IStreamService {\n    eventList = [];\n    connectedSeq = [];\n\n    getEventNames(): string[] {\n        throw new Error(\"Method not implemented.\");\n    }\n\n    notifyConnected() {\n        this.connectedSeq.push(true);\n    }\n\n    notifyDisconnected() {\n        this.connectedSeq.push(false);\n    }\n\n    notifyEvent(eventName: string, data: string) {\n        this.eventList.push([eventName, data]);\n    }\n}\n\n\ndescribe(\"Testing stream dispatch service\", () => {\n    let dispatchService: StreamDispatchService;\n\n    let mockEventSource: MockEventSource;\n    let mockService1: MockStreamService;\n    let mockService2: MockStreamService;\n\n    beforeEach(fakeAsync(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                LoggerService,\n                StreamDispatchService\n            ]\n        });\n\n        spyOn(EventSourceFactory, \"createEventSource\").and.callFake(\n            (url: string) => {\n                mockEventSource = createMockEventSource(url);\n                return mockEventSource;\n            }\n        );\n        mockService1 = new MockStreamService();\n        mockService2 = new MockStreamService();\n        spyOn(mockService1, \"getEventNames\").and.returnValue(['event1a', 'event1b']);\n        spyOn(mockService2, \"getEventNames\").and.returnValue(['event2a', 'event2b']);\n\n        dispatchService = TestBed.get(StreamDispatchService);\n\n        dispatchService.registerService(mockService1);\n        dispatchService.registerService(mockService2);\n        dispatchService.onInit();\n        tick();\n    }));\n\n    it(\"should create an instance\", () => {\n        expect(dispatchService).toBeDefined();\n    });\n\n    it(\"should construct an event source with correct url\", fakeAsync(() => {\n        expect(mockEventSource.url).toBe(\"/server/stream\");\n    }));\n\n    it(\"should register all events with the event source\", fakeAsync(() => {\n        expect(mockEventSource.addEventListener).toHaveBeenCalledTimes(4);\n        expect(mockEventSource.eventListeners.size).toBe(4);\n        expect(mockEventSource.eventListeners.has(\"event1a\")).toBe(true);\n        expect(mockEventSource.eventListeners.has(\"event1b\")).toBe(true);\n        expect(mockEventSource.eventListeners.has(\"event2a\")).toBe(true);\n        expect(mockEventSource.eventListeners.has(\"event2b\")).toBe(true);\n    }));\n\n    it(\"should set an error handler on the event source\", fakeAsync(() => {\n        expect(mockEventSource.onerror).toBeDefined();\n    }));\n\n    it(\"should forward name and data correctly\", fakeAsync(() => {\n        mockEventSource.eventListeners.get(\"event1a\")(<MessageEvent>{data: \"data1a\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"]\n        ]);\n        expect(mockService2.eventList).toEqual([]);\n\n        mockEventSource.eventListeners.get(\"event1b\")(<MessageEvent>{data: \"data1b\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"], [\"event1b\", \"data1b\"]\n        ]);\n        expect(mockService2.eventList).toEqual([]);\n\n        mockEventSource.eventListeners.get(\"event2a\")(<MessageEvent>{data: \"data2a\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"], [\"event1b\", \"data1b\"]\n        ]);\n        expect(mockService2.eventList).toEqual([\n            [\"event2a\", \"data2a\"]\n        ]);\n\n        mockEventSource.eventListeners.get(\"event2b\")(<MessageEvent>{data: \"data2b\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"], [\"event1b\", \"data1b\"]\n        ]);\n        expect(mockService2.eventList).toEqual([\n            [\"event2a\", \"data2a\"], [\"event2b\", \"data2b\"]\n        ]);\n\n        mockEventSource.eventListeners.get(\"event1b\")(<MessageEvent>{data: \"data1bbb\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"], [\"event1b\", \"data1b\"], [\"event1b\", \"data1bbb\"]\n        ]);\n        expect(mockService2.eventList).toEqual([\n            [\"event2a\", \"data2a\"], [\"event2b\", \"data2b\"]\n        ]);\n    }));\n\n    it(\"should call connect on open\", fakeAsync(() => {\n        mockEventSource.onopen(new Event(\"connected\"));\n        tick();\n        expect(mockService1.connectedSeq).toEqual([true]);\n        expect(mockService2.connectedSeq).toEqual([true]);\n    }));\n\n    it(\"should call disconnect on error\", fakeAsync(() => {\n        mockEventSource.onerror(new Event(\"bad event\"));\n        tick();\n        expect(mockService1.connectedSeq).toEqual([false]);\n        expect(mockService2.connectedSeq).toEqual([false]);\n        tick(4000);\n    }));\n\n    it(\"should send events after reconnect\", fakeAsync(() => {\n        mockEventSource.onopen(new Event(\"connected\"));\n        tick();\n        mockEventSource.onerror(new Event(\"bad event\"));\n        tick(4000);\n        mockEventSource.onopen(new Event(\"connected\"));\n        tick();\n        mockEventSource.eventListeners.get(\"event1a\")(<MessageEvent>{data: \"data1a\"});\n        tick();\n        expect(mockService1.eventList).toEqual([\n            [\"event1a\", \"data1a\"]\n        ]);\n        expect(mockService2.eventList).toEqual([]);\n        mockEventSource.eventListeners.get(\"event2b\")(<MessageEvent>{data: \"data2b\"});\n        tick();\n        expect(mockService1.eventList).toEqual([[\"event1a\", \"data1a\"]]);\n        expect(mockService2.eventList).toEqual([[\"event2b\", \"data2b\"]]);\n    }));\n});\n\n\n\ndescribe(\"Testing stream service registry\", () => {\n    let registry: StreamServiceRegistry;\n\n    let mockDispatch;\n\n    let mockModelFileService;\n    let mockServerStatusService;\n    let mockConnectedService;\n    let mockLogService;\n\n    let registered;\n\n    beforeEach(() => {\n        registered = [];\n\n        mockDispatch = jasmine.createSpyObj(\"mockDispatch\", [\"registerService\"]);\n        mockDispatch.registerService.and.callFake(value => registered.push(value));\n\n        mockModelFileService = jasmine.createSpy(\"mockModelFileService\");\n        mockServerStatusService = jasmine.createSpy(\"mockServerStatusService\");\n        mockConnectedService = jasmine.createSpy(\"mockConnectedService\");\n        mockLogService = jasmine.createSpy(\"mockLogService\");\n\n        TestBed.configureTestingModule({\n            providers: [\n                StreamServiceRegistry,\n                LoggerService,\n                {provide: StreamDispatchService, useValue: mockDispatch},\n                {provide: ModelFileService, useValue: mockModelFileService},\n                {provide: ServerStatusService, useValue: mockServerStatusService},\n                {provide: ConnectedService, useValue: mockConnectedService},\n                {provide: LogService, useValue: mockLogService}\n            ]\n        });\n\n        registry = TestBed.get(StreamServiceRegistry);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(registry).toBeDefined();\n    });\n\n    it(\"should register model file service\", () => {\n        expect(registered.includes(mockModelFileService)).toBe(true);\n    });\n\n    it(\"should register server status service\", () => {\n        expect(registered.includes(mockServerStatusService)).toBe(true);\n    });\n\n    it(\"should register connected service\", () => {\n        expect(registered.includes(mockConnectedService)).toBe(true);\n    });\n\n    it(\"should register log service\", () => {\n        expect(registered.includes(mockLogService)).toBe(true);\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/model-file.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/common/http/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ModelFileService} from \"../../../../services/files/model-file.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ModelFile} from \"../../../../services/files/model-file\";\nimport {RestService} from \"../../../../services/utils/rest.service\";\n\n\n// noinspection JSUnusedLocalSymbols\nconst DoNothing = {next: reaction => {}};\n\n\ndescribe(\"Testing model file service\", () => {\n    let modelFileService: ModelFileService;\n    let httpMock: HttpTestingController;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            imports: [\n                HttpClientTestingModule\n            ],\n            providers: [\n                LoggerService,\n                RestService,\n                ModelFileService\n            ]\n        });\n\n        httpMock = TestBed.get(HttpTestingController);\n\n        modelFileService = TestBed.get(ModelFileService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(modelFileService).toBeDefined();\n    });\n\n    it(\"should register all events with the event source\", () => {\n        expect(modelFileService.getEventNames()).toEqual(\n            [\"model-init\", \"model-added\", \"model-updated\", \"model-removed\"]\n        );\n    });\n\n    it(\"should send correct model on an init event\", fakeAsync(() => {\n        let count = 0;\n        let latestModel: Immutable.Map<string, ModelFile> = null;\n        modelFileService.files.subscribe({\n            next: modelFiles => {\n                count++;\n                latestModel = modelFiles;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(latestModel.size).toBe(0);\n\n        let actualModelFiles = [\n            {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        ];\n        let expectedModelFiles = [\n            new ModelFile({\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: ModelFile.State.DEFAULT,\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: Immutable.Set<ModelFile>()\n            })\n        ];\n        modelFileService.notifyEvent(\"model-init\", JSON.stringify(actualModelFiles));\n        tick();\n        expect(count).toBe(2);\n        expect(latestModel.size).toBe(1);\n        expect(Immutable.is(latestModel.get(\"File.One\"), expectedModelFiles[0])).toBe(true);\n    }));\n\n    it(\"should send correct model on an added event\", fakeAsync(() => {\n        let initialModelFiles = [\n            {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        ];\n        modelFileService.notifyEvent(\"model-init\", JSON.stringify(initialModelFiles));\n\n        let count = 0;\n        let latestModel: Immutable.Map<string, ModelFile> = null;\n        modelFileService.files.subscribe({\n            next: modelFiles => {\n                count++;\n                latestModel = modelFiles;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(latestModel.size).toBe(1);\n\n        let addedModelFile = {\n            new_file: {\n                name: \"File.Two\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.two\",\n                children: []\n            },\n            old_file: {}\n        };\n\n        let expectedModelFiles = [\n            new ModelFile({\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: ModelFile.State.DEFAULT,\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: Immutable.Set<ModelFile>()\n            }),\n            new ModelFile({\n                name: \"File.Two\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: ModelFile.State.DEFAULT,\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.two\",\n                children: Immutable.Set<ModelFile>()\n            })\n        ];\n        modelFileService.notifyEvent(\"model-added\", JSON.stringify(addedModelFile));\n        tick();\n        expect(count).toBe(2);\n        expect(latestModel.size).toBe(2);\n        expect(Immutable.is(latestModel.get(\"File.One\"), expectedModelFiles[0])).toBe(true);\n        expect(Immutable.is(latestModel.get(\"File.Two\"), expectedModelFiles[1])).toBe(true);\n    }));\n\n    it(\"should send correct model on a removed event\", fakeAsync(() => {\n        let initialModelFiles = [\n            {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        ];\n        modelFileService.notifyEvent(\"model-init\", JSON.stringify(initialModelFiles));\n\n        let count = 0;\n        let latestModel: Immutable.Map<string, ModelFile> = null;\n        modelFileService.files.subscribe({\n            next: modelFiles => {\n                count++;\n                latestModel = modelFiles;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(latestModel.size).toBe(1);\n\n        let removedModelFile = {\n            new_file: {},\n            old_file: {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        };\n\n        modelFileService.notifyEvent(\"model-removed\", JSON.stringify(removedModelFile));\n        tick();\n        expect(count).toBe(2);\n        expect(latestModel.size).toBe(0);\n    }));\n\n    it(\"should send correct model on an updated event\", fakeAsync(() => {\n        let initialModelFiles = [\n            {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        ];\n        modelFileService.notifyEvent(\"model-init\", JSON.stringify(initialModelFiles));\n\n        let count = 0;\n        let latestModel: Immutable.Map<string, ModelFile> = null;\n        modelFileService.files.subscribe({\n            next: modelFiles => {\n                count++;\n                latestModel = modelFiles;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(latestModel.size).toBe(1);\n\n        let updatedModelFile = {\n            new_file: {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 4567,\n                remote_size: 9012,\n                state: \"downloading\",\n                downloading_speed: 55,\n                eta: 1,\n                full_path: \"/new/path/to/file.one\",\n                children: []\n            },\n            old_file: {\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 1234,\n                remote_size: 4567,\n                state: \"default\",\n                downloading_speed: 99,\n                eta: 54,\n                full_path: \"/full/path/to/file.one\",\n                children: []\n            }\n        };\n\n        let expectedModelFiles = [\n            new ModelFile({\n                name: \"File.One\",\n                is_dir: false,\n                local_size: 4567,\n                remote_size: 9012,\n                state: ModelFile.State.DOWNLOADING,\n                downloading_speed: 55,\n                eta: 1,\n                full_path: \"/new/path/to/file.one\",\n                children: Immutable.Set<ModelFile>()\n            })\n        ];\n        modelFileService.notifyEvent(\"model-updated\", JSON.stringify(updatedModelFile));\n        tick();\n        expect(count).toBe(2);\n        expect(latestModel.size).toBe(1);\n        expect(Immutable.is(latestModel.get(\"File.One\"), expectedModelFiles[0])).toBe(true);\n    }));\n\n    it(\"should send empty model on disconnect\", fakeAsync(() => {\n        let count = 0;\n        let latestModel: Immutable.Map<string, ModelFile> = null;\n        modelFileService.files.subscribe({\n            next: modelFiles => {\n                count++;\n                latestModel = modelFiles;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(latestModel.size).toBe(0);\n\n        modelFileService.notifyDisconnected();\n        tick();\n        expect(count).toBe(2);\n        expect(latestModel.size).toBe(0);\n\n        tick(4000);\n    }));\n\n    it(\"should send a GET on queue command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile = new ModelFile({\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 4567,\n            remote_size: 9012,\n            state: ModelFile.State.DOWNLOADING,\n            downloading_speed: 55,\n            eta: 1,\n            full_path: \"/new/path/to/file.one\",\n            children: Immutable.Set<ModelFile>()\n        });\n\n        let count = 0;\n        modelFileService.queue(modelFile).subscribe({\n            next: reaction => {\n                expect(reaction.success).toBe(true);\n                count++;\n            }\n        });\n        httpMock.expectOne(\"/server/command/queue/File.One\").flush(\"done\");\n\n        tick();\n        expect(count).toBe(1);\n        httpMock.verify();\n    }));\n\n\n    it(\"should send correct GET requests on queue command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile;\n\n        modelFile = new ModelFile({\n            name: \"test\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.queue(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/queue/test\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test space\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.queue(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/queue/test%2520space\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test/slash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.queue(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/queue/test%252Fslash\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test\\\"doublequote\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.queue(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/queue/test%2522doublequote\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"/test/leadingslash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.queue(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/queue/%252Ftest%252Fleadingslash\").flush(\"done\");\n    }));\n\n    it(\"should send a GET on stop command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile = new ModelFile({\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 4567,\n            remote_size: 9012,\n            state: ModelFile.State.DOWNLOADING,\n            downloading_speed: 55,\n            eta: 1,\n            full_path: \"/new/path/to/file.one\",\n            children: Immutable.Set<ModelFile>()\n        });\n\n        let count = 0;\n        modelFileService.stop(modelFile).subscribe({\n            next: reaction => {\n                expect(reaction.success).toBe(true);\n                count++;\n            }\n        });\n        httpMock.expectOne(\"/server/command/stop/File.One\").flush(\"done\");\n\n        tick();\n        expect(count).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on stop command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile;\n\n        modelFile = new ModelFile({\n            name: \"test\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.stop(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/stop/test\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test space\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.stop(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/stop/test%2520space\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test/slash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.stop(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/stop/test%252Fslash\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test\\\"doublequote\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.stop(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/stop/test%2522doublequote\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"/test/leadingslash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.stop(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/stop/%252Ftest%252Fleadingslash\").flush(\"done\");\n    }));\n\n    it(\"should send a GET on extract command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile = new ModelFile({\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 4567,\n            remote_size: 9012,\n            state: ModelFile.State.DOWNLOADING,\n            downloading_speed: 55,\n            eta: 1,\n            full_path: \"/new/path/to/file.one\",\n            children: Immutable.Set<ModelFile>()\n        });\n\n        let count = 0;\n        modelFileService.extract(modelFile).subscribe({\n            next: reaction => {\n                expect(reaction.success).toBe(true);\n                count++;\n            }\n        });\n        httpMock.expectOne(\"/server/command/extract/File.One\").flush(\"done\");\n\n        tick();\n        expect(count).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on extract command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile;\n\n        modelFile = new ModelFile({\n            name: \"test\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.extract(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/extract/test\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test space\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.extract(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/extract/test%2520space\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test/slash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.extract(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/extract/test%252Fslash\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test\\\"doublequote\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.extract(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/extract/test%2522doublequote\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"/test/leadingslash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.extract(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/extract/%252Ftest%252Fleadingslash\").flush(\"done\");\n    }));\n\n    it(\"should send a GET on delete local command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile = new ModelFile({\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 4567,\n            remote_size: 9012,\n            state: ModelFile.State.DOWNLOADING,\n            downloading_speed: 55,\n            eta: 1,\n            full_path: \"/new/path/to/file.one\",\n            children: Immutable.Set<ModelFile>()\n        });\n\n        let count = 0;\n        modelFileService.deleteLocal(modelFile).subscribe({\n            next: reaction => {\n                expect(reaction.success).toBe(true);\n                count++;\n            }\n        });\n        httpMock.expectOne(\"/server/command/delete_local/File.One\").flush(\"done\");\n\n        tick();\n        expect(count).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on delete local command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile;\n\n        modelFile = new ModelFile({\n            name: \"test\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteLocal(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_local/test\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test space\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteLocal(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_local/test%2520space\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test/slash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteLocal(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_local/test%252Fslash\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test\\\"doublequote\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteLocal(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_local/test%2522doublequote\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"/test/leadingslash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteLocal(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_local/%252Ftest%252Fleadingslash\").flush(\"done\");\n    }));\n\n    it(\"should send a GET on delete remote command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile = new ModelFile({\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 4567,\n            remote_size: 9012,\n            state: ModelFile.State.DOWNLOADING,\n            downloading_speed: 55,\n            eta: 1,\n            full_path: \"/new/path/to/file.one\",\n            children: Immutable.Set<ModelFile>()\n        });\n\n        let count = 0;\n        modelFileService.deleteRemote(modelFile).subscribe({\n            next: reaction => {\n                expect(reaction.success).toBe(true);\n                count++;\n            }\n        });\n        httpMock.expectOne(\"/server/command/delete_remote/File.One\").flush(\"done\");\n\n        tick();\n        expect(count).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should send correct GET requests on delete remote command\", fakeAsync(() => {\n        // Connect the service\n        modelFileService.notifyConnected();\n\n        let modelFile;\n\n        modelFile = new ModelFile({\n            name: \"test\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteRemote(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_remote/test\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test space\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteRemote(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_remote/test%2520space\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test/slash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteRemote(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_remote/test%252Fslash\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"test\\\"doublequote\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteRemote(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_remote/test%2522doublequote\").flush(\"done\");\n\n        modelFile = new ModelFile({\n            name: \"/test/leadingslash\",\n            state: ModelFile.State.DEFAULT,\n            children: Immutable.Set<ModelFile>()\n        });\n        modelFileService.deleteRemote(modelFile).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/command/delete_remote/%252Ftest%252Fleadingslash\").flush(\"done\");\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/model-file.spec.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {ModelFile} from \"../../../../services/files/model-file\";\n\ndescribe(\"Testing model file initialization\", () => {\n    let baseJson;\n    let baseModelFile;\n\n    beforeEach(() => {\n        baseJson = {\n            name: \"File.One\",\n            is_dir: false,\n            local_size: 1234,\n            remote_size: 4567,\n            state: \"default\",\n            downloading_speed: 99,\n            eta: 54,\n            full_path: \"/full/path/to/file.one\",\n            is_extractable: true,\n            local_created_timestamp: \"1541828418.0\",\n            local_modified_timestamp: \"1541828418.9439101\",\n            remote_created_timestamp: \"1541828418.0\",\n            remote_modified_timestamp: \"1541828418.9439101\",\n            children: []\n        };\n        baseModelFile = ModelFile.fromJson(baseJson);\n    });\n\n    it(\"should be immutable\", () => {\n        expect(baseModelFile instanceof Immutable.Record).toBe(true);\n    });\n\n    it(\"should have an immutable container of children\", () => {\n        expect(baseModelFile.children instanceof Immutable.Set).toBe(true);\n    });\n\n    it(\"should correctly initialize all states\", () => {\n        baseJson.state = \"default\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.DEFAULT);\n        baseJson.state = \"queued\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.QUEUED);\n        baseJson.state = \"downloading\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.DOWNLOADING);\n        baseJson.state = \"downloaded\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.DOWNLOADED);\n        baseJson.state = \"deleted\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.DELETED);\n        baseJson.state = \"extracting\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.EXTRACTING);\n        baseJson.state = \"extracted\";\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.state).toBe(ModelFile.State.EXTRACTED);\n    });\n\n    it(\"should initialize with correct values\", () => {\n        expect(baseModelFile.name).toBe(\"File.One\");\n        expect(baseModelFile.is_dir).toBe(false);\n        expect(baseModelFile.local_size).toBe(1234);\n        expect(baseModelFile.remote_size).toBe(4567);\n        expect(baseModelFile.state).toBe(ModelFile.State.DEFAULT);\n        expect(baseModelFile.downloading_speed).toBe(99);\n        expect(baseModelFile.eta).toBe(54);\n        expect(baseModelFile.full_path).toBe(\"/full/path/to/file.one\");\n        expect(baseModelFile.is_extractable).toBe(true);\n        expect(baseModelFile.local_created_timestamp).toEqual(new Date(\"November 9, 2018 21:40:18 PST\"));\n        expect(baseModelFile.local_modified_timestamp).toEqual(new Date(1541828418943));\n        expect(baseModelFile.remote_created_timestamp).toEqual(new Date(\"November 9, 2018 21:40:18 PST\"));\n        expect(baseModelFile.remote_modified_timestamp).toEqual(new Date(1541828418943));\n        expect(baseModelFile.children.size).toBe(0);\n    });\n\n    it(\"should initialize null timestamps correctly\", () => {\n        baseJson.local_created_timestamp = null;\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.local_created_timestamp).toBeNull();\n        baseJson.local_modified_timestamp = null;\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.local_modified_timestamp).toBeNull();\n        baseJson.remote_created_timestamp = null;\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.remote_created_timestamp).toBeNull();\n        baseJson.remote_modified_timestamp = null;\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.remote_modified_timestamp).toBeNull();\n    });\n\n    it(\"should correctly initialize children\", () => {\n        baseJson.children = [\n            {\n                name: \"a\",\n                is_dir: true,\n                local_size: 1,\n                remote_size: 11,\n                state: \"default\",\n                downloading_speed: 111,\n                eta: 1111,\n                full_path: \"root/a\",\n                is_extractable: true,\n                children: [\n                    {\n                        name: \"aa\",\n                        is_dir: false,\n                        local_size: 1,\n                        remote_size: 11,\n                        state: \"default\",\n                        downloading_speed: 111,\n                        eta: 1111,\n                        full_path: \"root/a/aa\",\n                        is_extractable: true,\n                        children: []\n                    },\n                ]\n            },\n            {\n                name: \"b\",\n                is_dir: false,\n                local_size: 2,\n                remote_size: 22,\n                state: \"default\",\n                downloading_speed: 222,\n                eta: 2222,\n                full_path: \"root/b\",\n                is_extractable: false,\n                children: []\n            }\n        ];\n        baseModelFile = ModelFile.fromJson(baseJson);\n        expect(baseModelFile.children.size).toBe(2);\n\n        let a = baseModelFile.children.find(value => {return value.name === \"a\"});\n        expect(a.name).toBe(\"a\");\n        expect(a.is_dir).toBe(true);\n        expect(a.local_size).toBe(1);\n        expect(a.remote_size).toBe(11);\n        expect(a.state).toBe(ModelFile.State.DEFAULT);\n        expect(a.downloading_speed).toBe(111);\n        expect(a.eta).toBe(1111);\n        expect(a.full_path).toBe(\"root/a\");\n        expect(a.is_extractable).toBe(true);\n        expect(a.children.size).toBe(1);\n\n        let aa = a.children.find(value => {return value.name === \"aa\"});\n        expect(aa.name).toBe(\"aa\");\n        expect(aa.is_dir).toBe(false);\n        expect(aa.local_size).toBe(1);\n        expect(aa.remote_size).toBe(11);\n        expect(aa.state).toBe(ModelFile.State.DEFAULT);\n        expect(aa.downloading_speed).toBe(111);\n        expect(aa.eta).toBe(1111);\n        expect(aa.full_path).toBe(\"root/a/aa\");\n        expect(aa.is_extractable).toBe(true);\n        expect(aa.children.size).toBe(0);\n\n        let b = baseModelFile.children.find(value => {return value.name === \"b\"});\n        expect(b.name).toBe(\"b\");\n        expect(b.is_dir).toBe(false);\n        expect(b.local_size).toBe(2);\n        expect(b.remote_size).toBe(22);\n        expect(b.state).toBe(ModelFile.State.DEFAULT);\n        expect(b.downloading_speed).toBe(222);\n        expect(b.eta).toBe(2222);\n        expect(b.full_path).toBe(\"root/b\");\n        expect(b.is_extractable).toBe(false);\n        expect(b.children.size).toBe(0);\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-filter.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ViewFileFilterService} from \"../../../../services/files/view-file-filter.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ViewFileFilterCriteria, ViewFileService} from \"../../../../services/files/view-file.service\";\nimport {MockViewFileService} from \"../../../mocks/mock-view-file.service\";\nimport {ViewFile} from \"../../../../services/files/view-file\";\nimport {ViewFileOptionsService} from \"../../../../services/files/view-file-options.service\";\nimport {MockViewFileOptionsService} from \"../../../mocks/mock-view-file-options.service\";\nimport {ViewFileOptions} from \"../../../../services/files/view-file-options\";\n\n\ndescribe(\"Testing view file filter service\", () => {\n    let viewFilterService: ViewFileFilterService;\n\n    let viewFileService: MockViewFileService;\n    let viewFileOptionsService: MockViewFileOptionsService;\n    let filterCriteria: ViewFileFilterCriteria;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                ViewFileFilterService,\n                LoggerService,\n                {provide: ViewFileService, useClass: MockViewFileService},\n                {provide: ViewFileOptionsService, useClass: MockViewFileOptionsService}\n            ]\n        });\n        viewFileService = TestBed.get(ViewFileService);\n        spyOn(viewFileService, \"setFilterCriteria\").and.callFake(\n            value => filterCriteria = value\n        );\n\n        viewFileOptionsService = TestBed.get(ViewFileOptionsService);\n\n        viewFilterService = TestBed.get(ViewFileFilterService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(viewFilterService).toBeDefined();\n    });\n\n    it(\"does not set a filter criteria by default\", () => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        expect(filterCriteria).toBeUndefined();\n    });\n\n    it(\"calls setFilterCriteria on filter name set\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"something\",\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"does not call setFilterCriteria on duplicate filter names\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"something\",\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"something\",\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"does not call setFilterCriteria for filter name \" +\n            \"when a different option is changed\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"something\",\n            showDetails: true,\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"something\",\n            showDetails: false,\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"correctly filters by name\", fakeAsync(() => {\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"tofu\",\n        }));\n        tick();\n\n        // exact match\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"tofu\"}))).toBe(true);\n        // no match\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flower\"}))).toBe(false);\n        // partial matches\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"tofuflower\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flowertofu\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"aaatofubbb\"}))).toBe(true);\n\n        // Another filter\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"flower\",\n        }));\n        tick();\n        // exact match\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flower\"}))).toBe(true);\n        // no match\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"tofu\"}))).toBe(false);\n        // partial matches\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flowertofu\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"tofuflower\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"aaaflowerbbb\"}))).toBe(true);\n    }));\n\n    it(\"ignores cases when filtering by name\", fakeAsync(() => {\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"tofu\",\n        }));\n        tick();\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"TOFU\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"TofU\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"aaaToFubbb\"}))).toBe(true);\n\n        // Another filter\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"flOweR\",\n        }));\n        tick();\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"FLowEr\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"tofuflowertofu\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"floWer\"}))).toBe(true);\n    }));\n\n    it(\"treats dots as spaces when filtering by name\", fakeAsync(() => {\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"to.fu\",\n        }));\n        tick();\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"to.fu\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"to fu\"}))).toBe(true);\n\n        // Another filter\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            nameFilter: \"flo wer\",\n        }));\n        tick();\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flo wer\"}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(new ViewFile({name: \"flo.wer\"}))).toBe(true);\n    }));\n\n    it(\"calls setFilterCriteria on filter status set\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.QUEUED\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"does not call setFilterCriteria on duplicate filter status\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.QUEUED\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.QUEUED\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"does not call setFilterCriteria for filter status \" +\n            \"when a different option is changed\", fakeAsync(() => {\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.QUEUED,\n            showDetails: true,\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.QUEUED,\n            showDetails: false,\n        }));\n        tick();\n        expect(viewFileService.setFilterCriteria).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"correctly filters by status\", fakeAsync(() => {\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.DEFAULT,\n        }));\n        tick();\n\n        // exact match\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DEFAULT}))).toBe(true);\n        // no match\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.QUEUED}))).toBe(false);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DOWNLOADING}))).toBe(false);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DELETED}))).toBe(false);\n\n        // Another filter\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.EXTRACTING,\n        }));\n        tick();\n        // exact match\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.EXTRACTING}))).toBe(true);\n        // no match\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.QUEUED}))).toBe(false);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DOWNLOADING}))).toBe(false);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DELETED}))).toBe(false);\n\n        // Disable status filter\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: null,\n        }));\n        tick();\n        // all matches\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DEFAULT}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.QUEUED}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DOWNLOADING}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DOWNLOADED}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.STOPPED}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.DELETED}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.EXTRACTING}))).toBe(true);\n        expect(filterCriteria.meetsCriteria(\n            new ViewFile({status: ViewFile.Status.EXTRACTED}))).toBe(true);\n    }));\n\n    it(\"correctly filters by name AND status\", fakeAsync(() => {\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            selectedStatusFilter: ViewFile.Status.DEFAULT,\n            nameFilter: \"tofu\",\n        }));\n        tick();\n\n        // both match\n        expect(filterCriteria.meetsCriteria(new ViewFile({\n            name: \"tofu\",\n            status: ViewFile.Status.DEFAULT\n        }))).toBe(true);\n\n        // only one matches\n        expect(filterCriteria.meetsCriteria(new ViewFile({\n            name: \"flower\",\n            status: ViewFile.Status.DEFAULT\n        }))).toBe(false);\n        expect(filterCriteria.meetsCriteria(new ViewFile({\n            name: \"tofu\",\n            status: ViewFile.Status.QUEUED\n        }))).toBe(false);\n\n        // neither matches\n        expect(filterCriteria.meetsCriteria(new ViewFile({\n            name: \"flower\",\n            status: ViewFile.Status.QUEUED\n        }))).toBe(false);\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-options.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ViewFileOptionsService} from \"../../../../services/files/view-file-options.service\";\nimport {ViewFileOptions} from \"../../../../services/files/view-file-options\";\nimport {ViewFile} from \"../../../../services/files/view-file\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {MockStorageService} from \"../../../mocks/mock-storage.service\";\nimport {LOCAL_STORAGE, StorageService} from \"angular-webstorage-service\";\nimport {StorageKeys} from \"../../../../common/storage-keys\";\n\n\nfunction createViewOptionsService(): ViewFileOptionsService {\n    return new ViewFileOptionsService(\n        TestBed.get(LoggerService),\n        TestBed.get(LOCAL_STORAGE)\n    );\n}\n\n\ndescribe(\"Testing view file options service\", () => {\n    let viewOptionsService: ViewFileOptionsService;\n    let storageService: StorageService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                ViewFileOptionsService,\n                LoggerService,\n                {provide: LOCAL_STORAGE, useClass: MockStorageService},\n            ]\n        });\n\n        viewOptionsService = TestBed.get(ViewFileOptionsService);\n\n        storageService = TestBed.get(LOCAL_STORAGE);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(viewOptionsService).toBeDefined();\n    });\n\n    it(\"should forward default options\", fakeAsync(() => {\n        let count = 0;\n\n        viewOptionsService.options.subscribe({\n            next: options => {\n                expect(options.showDetails).toBe(false);\n                expect(options.sortMethod).toBe(ViewFileOptions.SortMethod.STATUS);\n                expect(options.selectedStatusFilter).toBeNull();\n                expect(options.nameFilter).toBeNull();\n                expect(options.pinFilter).toBe(false);\n                count++;\n            }\n        });\n\n        tick();\n        expect(count).toBe(1);\n    }));\n\n    it(\"should forward updates to showDetails\", fakeAsync(() => {\n        let count = 0;\n        let showDetails = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                showDetails = options.showDetails;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        viewOptionsService.setShowDetails(true);\n        tick();\n        expect(showDetails).toBe(true);\n        expect(count).toBe(2);\n\n        viewOptionsService.setShowDetails(false);\n        tick();\n        expect(showDetails).toBe(false);\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        viewOptionsService.setShowDetails(false);\n        tick();\n        expect(showDetails).toBe(false);\n        expect(count).toBe(3);\n    }));\n\n    it(\"should load showDetails from storage\", fakeAsync(() => {\n        spyOn(storageService, \"get\").and.callFake(key => {\n            if (key === StorageKeys.VIEW_OPTION_SHOW_DETAILS) {\n                return true;\n            }\n        });\n        // Recreate the service\n        viewOptionsService = createViewOptionsService();\n        expect(storageService.get).toHaveBeenCalledWith(StorageKeys.VIEW_OPTION_SHOW_DETAILS);\n\n        let count = 0;\n        let showDetails = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                showDetails = options.showDetails;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(showDetails).toBe(true);\n    }));\n\n    it(\"should save showDetails to storage\", fakeAsync(() => {\n        spyOn(storageService, \"set\");\n        viewOptionsService.setShowDetails(true);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_SHOW_DETAILS,\n            true\n        );\n        viewOptionsService.setShowDetails(false);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_SHOW_DETAILS,\n            false\n        );\n    }));\n\n    it(\"should forward updates to sortMethod\", fakeAsync(() => {\n        let count = 0;\n        let sortMethod = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                sortMethod = options.sortMethod;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        viewOptionsService.setSortMethod(ViewFileOptions.SortMethod.NAME_ASC);\n        tick();\n        expect(sortMethod).toBe(ViewFileOptions.SortMethod.NAME_ASC);\n        expect(count).toBe(2);\n\n        viewOptionsService.setSortMethod(ViewFileOptions.SortMethod.NAME_DESC);\n        tick();\n        expect(sortMethod).toBe(ViewFileOptions.SortMethod.NAME_DESC);\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        viewOptionsService.setSortMethod(ViewFileOptions.SortMethod.NAME_DESC);\n        tick();\n        expect(sortMethod).toBe(ViewFileOptions.SortMethod.NAME_DESC);\n        expect(count).toBe(3);\n    }));\n\n    it(\"should load sortMethod from storage\", fakeAsync(() => {\n        spyOn(storageService, \"get\").and.callFake(key => {\n            if (key === StorageKeys.VIEW_OPTION_SORT_METHOD) {\n                return ViewFileOptions.SortMethod.NAME_ASC;\n            }\n        });\n        // Recreate the service\n        viewOptionsService = createViewOptionsService();\n        expect(storageService.get).toHaveBeenCalledWith(StorageKeys.VIEW_OPTION_SHOW_DETAILS);\n\n        let count = 0;\n        let sortMethod = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                sortMethod = options.sortMethod;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(sortMethod).toBe(ViewFileOptions.SortMethod.NAME_ASC);\n    }));\n\n    it(\"should save sortMethod to storage\", fakeAsync(() => {\n        spyOn(storageService, \"set\");\n        viewOptionsService.setSortMethod(ViewFileOptions.SortMethod.NAME_ASC);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_SORT_METHOD,\n            ViewFileOptions.SortMethod.NAME_ASC\n        );\n        viewOptionsService.setSortMethod(ViewFileOptions.SortMethod.NAME_DESC);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_SORT_METHOD,\n            ViewFileOptions.SortMethod.NAME_DESC\n        );\n    }));\n\n    it(\"should forward updates to selectedStatusFilter\", fakeAsync(() => {\n        let count = 0;\n        let selectedStatusFilter = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                selectedStatusFilter = options.selectedStatusFilter;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        viewOptionsService.setSelectedStatusFilter(ViewFile.Status.EXTRACTED);\n        tick();\n        expect(selectedStatusFilter).toBe(ViewFile.Status.EXTRACTED);\n        expect(count).toBe(2);\n\n        viewOptionsService.setSelectedStatusFilter(ViewFile.Status.QUEUED);\n        tick();\n        expect(selectedStatusFilter).toBe(ViewFile.Status.QUEUED);\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        viewOptionsService.setSelectedStatusFilter(ViewFile.Status.QUEUED);\n        tick();\n        expect(selectedStatusFilter).toBe(ViewFile.Status.QUEUED);\n        expect(count).toBe(3);\n\n        // Null should be allowed\n        viewOptionsService.setSelectedStatusFilter(null);\n        tick();\n        expect(selectedStatusFilter).toBeNull();\n        expect(count).toBe(4);\n    }));\n\n    it(\"should forward updates to nameFilter\", fakeAsync(() => {\n        let count = 0;\n        let nameFilter = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                nameFilter = options.nameFilter;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        viewOptionsService.setNameFilter(\"tofu\");\n        tick();\n        expect(nameFilter).toBe(\"tofu\");\n        expect(count).toBe(2);\n\n        viewOptionsService.setNameFilter(\"flower\");\n        tick();\n        expect(nameFilter).toBe(\"flower\");\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        viewOptionsService.setNameFilter(\"flower\");\n        tick();\n        expect(nameFilter).toBe(\"flower\");\n        expect(count).toBe(3);\n\n        // Null should be allowed\n        viewOptionsService.setNameFilter(null);\n        tick();\n        expect(nameFilter).toBeNull();\n        expect(count).toBe(4);\n    }));\n\n    it(\"should forward updates to pinFilter\", fakeAsync(() => {\n        let count = 0;\n        let pinFilter = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                pinFilter = options.pinFilter;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        viewOptionsService.setPinFilter(true);\n        tick();\n        expect(pinFilter).toBe(true);\n        expect(count).toBe(2);\n\n        viewOptionsService.setPinFilter(false);\n        tick();\n        expect(pinFilter).toBe(false);\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        viewOptionsService.setPinFilter(false);\n        tick();\n        expect(pinFilter).toBe(false);\n        expect(count).toBe(3);\n    }));\n\n    it(\"should load pinFilter from storage\", fakeAsync(() => {\n        spyOn(storageService, \"get\").and.callFake(key => {\n            if (key === StorageKeys.VIEW_OPTION_PIN) {\n                return true;\n            }\n        });\n        // Recreate the service\n        viewOptionsService = createViewOptionsService();\n        expect(storageService.get).toHaveBeenCalledWith(StorageKeys.VIEW_OPTION_PIN);\n\n        let count = 0;\n        let pinFilter = null;\n        viewOptionsService.options.subscribe({\n            next: options => {\n                pinFilter = options.pinFilter;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(pinFilter).toBe(true);\n    }));\n\n    it(\"should save pinFilter to storage\", fakeAsync(() => {\n        spyOn(storageService, \"set\");\n        viewOptionsService.setPinFilter(true);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_PIN,\n            true\n        );\n        viewOptionsService.setPinFilter(false);\n        expect(storageService.set).toHaveBeenCalledWith(\n            StorageKeys.VIEW_OPTION_PIN,\n            false\n        );\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file-sort.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ViewFileSortService} from \"../../../../services/files/view-file-sort.service\";\nimport {MockViewFileService} from \"../../../mocks/mock-view-file.service\";\nimport {MockViewFileOptionsService} from \"../../../mocks/mock-view-file-options.service\";\nimport {ViewFileComparator, ViewFileService} from \"../../../../services/files/view-file.service\";\nimport {ViewFileOptionsService} from \"../../../../services/files/view-file-options.service\";\nimport {ViewFileOptions} from \"../../../../services/files/view-file-options\";\nimport {ViewFile} from \"../../../../services/files/view-file\";\n\n\ndescribe(\"Testing view file sort service\", () => {\n    let viewSortService: ViewFileSortService;\n\n    let viewFileService: MockViewFileService;\n    let viewFileOptionsService: MockViewFileOptionsService;\n    let sortComparator: ViewFileComparator;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                ViewFileSortService,\n                LoggerService,\n                {provide: ViewFileService, useClass: MockViewFileService},\n                {provide: ViewFileOptionsService, useClass: MockViewFileOptionsService}\n            ]\n        });\n        viewFileService = TestBed.get(ViewFileService);\n        spyOn(viewFileService, \"setComparator\").and.callFake(\n            value => sortComparator = value\n        );\n\n        viewFileOptionsService = TestBed.get(ViewFileOptionsService);\n\n        viewSortService = TestBed.get(ViewFileSortService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(viewSortService).toBeDefined();\n    });\n\n    it(\"does not set a sort comparator by default\", () => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        expect(sortComparator).toBeUndefined();\n    });\n\n    it(\"calls setComparator when sort method is changed\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        expect(sortComparator).not.toBeNull();\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.NAME_ASC\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(2);\n        expect(sortComparator).not.toBeNull();\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.NAME_DESC\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(3);\n        expect(sortComparator).not.toBeNull();\n    }));\n\n    it(\"does not call setComparator on duplicate sort methods\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"does not call setComparator when a different option is changed\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS,\n            showDetails: false,\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS,\n            showDetails: true,\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n    }));\n\n    it(\"correctly sorts by status\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.STATUS\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        expect(sortComparator).not.toBeNull();\n\n        // Check the order based on status\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTING}),\n            new ViewFile({status: ViewFile.Status.DOWNLOADING})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.DOWNLOADING}),\n            new ViewFile({status: ViewFile.Status.QUEUED})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.QUEUED}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED}),\n            new ViewFile({status: ViewFile.Status.DOWNLOADED})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.DOWNLOADED}),\n            new ViewFile({status: ViewFile.Status.STOPPED})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.STOPPED}),\n            new ViewFile({status: ViewFile.Status.DEFAULT})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.STOPPED}),\n            new ViewFile({status: ViewFile.Status.DELETED})\n        )).toBeLessThan(0);\n\n        // Default and Deleted should be intermixed\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.DEFAULT, name: \"\"}),\n            new ViewFile({status: ViewFile.Status.DELETED, name: \"\"})\n        )).toBe(0);\n\n        // Given same status, order should be determined by ascending name\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"flower\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"tofu\"})\n        )).toBeLessThan(0);\n    }));\n\n    it(\"correctly sorts by ascending name\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.NAME_ASC\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        expect(sortComparator).not.toBeNull();\n\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"flower\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"tofu\"})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"cat\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"dog\"})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"fff\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"ffff\"})\n        )).toBeLessThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"aaaa\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"aaaa\"})\n        )).toBe(0);\n    }));\n\n    it(\"correctly sorts by descending name\", fakeAsync(() => {\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(0);\n        viewFileOptionsService._options.next(new ViewFileOptions({\n            sortMethod: ViewFileOptions.SortMethod.NAME_DESC\n        }));\n        tick();\n        expect(viewFileService.setComparator).toHaveBeenCalledTimes(1);\n        expect(sortComparator).not.toBeNull();\n\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"flower\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"tofu\"})\n        )).toBeGreaterThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"cat\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"dog\"})\n        )).toBeGreaterThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"fff\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"ffff\"})\n        )).toBeGreaterThan(0);\n        expect(sortComparator(\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"aaaa\"}),\n            new ViewFile({status: ViewFile.Status.EXTRACTED, name: \"aaaa\"})\n        )).toBe(0);\n    }));\n});\n\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/files/view-file.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ViewFileComparator, ViewFileService} from \"../../../../services/files/view-file.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\nimport {MockStreamServiceRegistry} from \"../../../mocks/mock-stream-service.registry\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\nimport {MockModelFileService} from \"../../../mocks/mock-model-file.service\";\nimport {ModelFile} from \"../../../../services/files/model-file\";\nimport {ViewFile} from \"../../../../services/files/view-file\";\nimport {ViewFileFilterCriteria} from \"../../../../services/files/view-file.service\";\n\n\ndescribe(\"Testing view file service\", () => {\n    let viewService: ViewFileService;\n    let mockModelService: MockModelFileService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                ViewFileService,\n                LoggerService,\n                ConnectedService,\n                {provide: StreamServiceRegistry, useClass: MockStreamServiceRegistry}\n            ]\n        });\n\n        viewService = TestBed.get(ViewFileService);\n        let mockRegistry: MockStreamServiceRegistry = TestBed.get(StreamServiceRegistry);\n        mockModelService = mockRegistry.modelFileService;\n    });\n\n    it(\"should create an instance\", () => {\n        expect(viewService).toBeDefined();\n    });\n\n    it(\"should forward an empty model by default\", fakeAsync(() => {\n        let count = 0;\n\n        viewService.files.subscribe({\n            next: list => {\n                expect(list.size).toBe(0);\n                count++;\n            }\n        });\n\n        tick();\n        expect(count).toBe(1);\n    }));\n\n    it(\"should forward an empty model\", fakeAsync(() => {\n        let model = Immutable.Map<string, ModelFile>();\n        mockModelService._files.next(model);\n        tick();\n\n        let count = 0;\n        viewService.files.subscribe({\n            next: list => {\n                expect(list.size).toBe(0);\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n    }));\n\n    it(\"should correctly populate ViewFile props from a ModelFile\", fakeAsync(() => {\n        let model = Immutable.Map<string, ModelFile>();\n        model = model.set(\"a\", new ModelFile({\n            name: \"a\",\n            is_dir: true,\n            local_size: 0,\n            remote_size: 11,\n            state: ModelFile.State.DEFAULT,\n            downloading_speed: 111,\n            eta: 1111,\n            full_path: \"root/a\",\n            is_extractable: true,\n            local_created_timestamp: new Date(\"November 9, 2018 21:40:18\"),\n            local_modified_timestamp: new Date(1541828418943),\n            remote_created_timestamp: null,\n            remote_modified_timestamp: new Date(1541828418943),\n        }));\n        mockModelService._files.next(model);\n        tick();\n\n        let count = 0;\n        viewService.files.subscribe({\n            next: list => {\n                expect(list.size).toBe(1);\n                let file = list.get(0);\n                expect(file.name).toBe(\"a\");\n                expect(file.isDir).toBe(true);\n                expect(file.localSize).toBe(0);\n                expect(file.remoteSize).toBe(11);\n                expect(file.status).toBe(ViewFile.Status.DEFAULT);\n                expect(file.downloadingSpeed).toBe(111);\n                expect(file.eta).toBe(1111);\n                expect(file.fullPath).toBe(\"root/a\");\n                expect(file.isArchive).toBe(true);\n                expect(file.localCreatedTimestamp).toEqual(new Date(\"November 9, 2018 21:40:18\"));\n                expect(file.localModifiedTimestamp).toEqual(new Date(1541828418943));\n                expect(file.remoteCreatedTimestamp).toBeNull();\n                expect(file.remoteModifiedTimestamp).toEqual(new Date(1541828418943));\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n    }));\n\n    it(\"should correctly set the ViewFile status\", fakeAsync(() => {\n        let modelFile = new ModelFile({\n            name: \"a\",\n            state: ModelFile.State.DEFAULT,\n        });\n        let model = Immutable.Map<string, ModelFile>();\n        model = model.set(modelFile.name, modelFile);\n\n        let expectedStates = [\n            ViewFile.Status.DEFAULT,\n            ViewFile.Status.QUEUED,\n            ViewFile.Status.DOWNLOADING,\n            ViewFile.Status.DOWNLOADED,\n            ViewFile.Status.STOPPED,\n            ViewFile.Status.DELETED,\n            ViewFile.Status.EXTRACTING,\n            ViewFile.Status.EXTRACTED\n        ];\n\n        // First state - DEFAULT\n        mockModelService._files.next(model);\n        tick();\n\n        let count = 0;\n        viewService.files.subscribe({\n            next: list => {\n                expect(list.size).toBe(1);\n                let file = list.get(0);\n                expect(file.status).toBe(expectedStates[count++]);\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        // Next state - QUEUED\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.QUEUED));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(2);\n\n        // Next state - DOWNLOADING\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.DOWNLOADING));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(3);\n\n        // Next state - DOWNLOADED\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.DOWNLOADED));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(4);\n\n        // Next state - STOPPED\n        // local size and remote size > 0\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.DEFAULT));\n        modelFile = new ModelFile(modelFile.set(\"local_size\", 50));\n        modelFile = new ModelFile(modelFile.set(\"remote_size\", 50));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(5);\n\n        // Next state - DELETED\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.DELETED));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(6);\n\n        // Next state - DELETED\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.EXTRACTING));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(7);\n\n        // Next state - DELETED\n        modelFile = new ModelFile(modelFile.set(\"state\", ModelFile.State.EXTRACTED));\n        model = model.set(modelFile.name, modelFile);\n        mockModelService._files.next(model);\n        tick();\n        expect(count).toBe(8);\n    }));\n\n    it(\"should always set a non-null file sizes in ViewFile\", fakeAsync(() => {\n        let model = Immutable.Map<string, ModelFile>();\n        model = model.set(\"a\", new ModelFile({\n            name: \"a\",\n            local_size: null,\n            remote_size: null,\n        }));\n        mockModelService._files.next(model);\n        tick();\n\n        let count = 0;\n        viewService.files.subscribe({\n            next: list => {\n                expect(list.size).toBe(1);\n                let file = list.get(0);\n                expect(file.localSize).toBe(0);\n                expect(file.remoteSize).toBe(0);\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n    }));\n\n    it(\"should correctly set ViewFile percent downloaded\", fakeAsync(() => {\n        // Test vectors of local size, remote size, percentage\n        let testVectors = [\n            [0, 10, 0],\n            [5, 10, 50],\n            [10, 10, 100],\n            [null, 10, 0],\n            [10, null, 100]\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    expect(file.percentDownloaded).toBe(testVectors[count][2]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                local_size: vector[0],\n                remote_size: vector[1],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    it(\"should should correctly set ViewFile isQueueable\", fakeAsync(() => {\n        // Test and expected result vectors\n        // test - [ModelFile.State, local size, remote size]\n        // result - [isQueueable, ViewFile.Status]\n        let testVectors: any[][][] = [\n            // Default remote file is queueable\n            [[ModelFile.State.DEFAULT, null, 100], [true, ViewFile.Status.DEFAULT]],\n            // Default local file is NOT queueable\n            [[ModelFile.State.DEFAULT, 100, null], [false, ViewFile.Status.DEFAULT]],\n            // Stopped file is queueable\n            [[ModelFile.State.DEFAULT, 50, 100], [true, ViewFile.Status.STOPPED]],\n            // Deleted file is queueable\n            [[ModelFile.State.DELETED, null, 100], [true, ViewFile.Status.DELETED]],\n            // Queued file is NOT queueable\n            [[ModelFile.State.QUEUED, null, 100], [false, ViewFile.Status.QUEUED]],\n            // Downloading file is NOT queueable\n            [[ModelFile.State.DOWNLOADING, 10, 100], [false, ViewFile.Status.DOWNLOADING]],\n            // Downloaded file is NOT queueable\n            [[ModelFile.State.DOWNLOADED, 100, 100], [false, ViewFile.Status.DOWNLOADED]],\n            // Extracting file is NOT queueable\n            [[ModelFile.State.EXTRACTING, 100, 100], [false, ViewFile.Status.EXTRACTING]],\n            // Extracting local-only file is NOT queueable\n            [[ModelFile.State.EXTRACTING, 100, null], [false, ViewFile.Status.EXTRACTING]],\n            // Extracted file is NOT queueable\n            [[ModelFile.State.EXTRACTED, 100, 100], [false, ViewFile.Status.EXTRACTED]],\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    let resultVector = testVectors[count][1];\n                    expect(file.isQueueable).toBe(resultVector[0]);\n                    expect(file.status).toBe(resultVector[1]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let testVector = vector[0];\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                state: testVector[0],\n                local_size: testVector[1],\n                remote_size: testVector[2],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    it(\"should should correctly set ViewFile isStoppable\", fakeAsync(() => {\n        // Test and expected result vectors\n        // test - [ModelFile.State, local size, remote size]\n        // result - [isStoppable, ViewFile.Status]\n        let testVectors: any[][][] = [\n            // Default remote file is NOT stoppable\n            [[ModelFile.State.DEFAULT, null, 100], [false, ViewFile.Status.DEFAULT]],\n            // Default local file is NOT stoppable\n            [[ModelFile.State.DEFAULT, 100, null], [false, ViewFile.Status.DEFAULT]],\n            // Stopped file is NOT stoppable\n            [[ModelFile.State.DEFAULT, 50, 100], [false, ViewFile.Status.STOPPED]],\n            // Deleted file is NOT stoppable\n            [[ModelFile.State.DELETED, null, 100], [false, ViewFile.Status.DELETED]],\n            // Queued file is stoppable\n            [[ModelFile.State.QUEUED, null, 100], [true, ViewFile.Status.QUEUED]],\n            // Downloading file is stoppable\n            [[ModelFile.State.DOWNLOADING, 10, 100], [true, ViewFile.Status.DOWNLOADING]],\n            // Downloaded file is NOT stoppable\n            [[ModelFile.State.DOWNLOADED, 100, 100], [false, ViewFile.Status.DOWNLOADED]],\n            // Extracting file is NOT stoppable\n            [[ModelFile.State.EXTRACTING, 100, 100], [false, ViewFile.Status.EXTRACTING]],\n            // Extracted file is NOT stoppable\n            [[ModelFile.State.EXTRACTED, 100, 100], [false, ViewFile.Status.EXTRACTED]],\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    let resultVector = testVectors[count][1];\n                    expect(file.isStoppable).toBe(resultVector[0]);\n                    expect(file.status).toBe(resultVector[1]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let testVector = vector[0];\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                state: testVector[0],\n                local_size: testVector[1],\n                remote_size: testVector[2],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    it(\"should should correctly set ViewFile isExtractable\", fakeAsync(() => {\n        // Test and expected result vectors\n        // test - [ModelFile.State, local size, remote size]\n        // result - [isExtractable, ViewFile.Status]\n        let testVectors: any[][][] = [\n            // Default remote file is NOT extractable\n            [[ModelFile.State.DEFAULT, null, 100], [false, ViewFile.Status.DEFAULT]],\n            // Default local file is extractable\n            [[ModelFile.State.DEFAULT, 100, null], [true, ViewFile.Status.DEFAULT]],\n            // Stopped file is extractable\n            [[ModelFile.State.DEFAULT, 50, 100], [true, ViewFile.Status.STOPPED]],\n            // Deleted file is NOT extractable\n            [[ModelFile.State.DELETED, null, 100], [false, ViewFile.Status.DELETED]],\n            // Queued file is NOT extractable\n            [[ModelFile.State.QUEUED, null, 100], [false, ViewFile.Status.QUEUED]],\n            // Downloading file is NOT extractable\n            [[ModelFile.State.DOWNLOADING, 10, 100], [false, ViewFile.Status.DOWNLOADING]],\n            // Downloaded file is extractable\n            [[ModelFile.State.DOWNLOADED, 100, 100], [true, ViewFile.Status.DOWNLOADED]],\n            // Extracting file is NOT extractable\n            [[ModelFile.State.EXTRACTING, 100, 100], [false, ViewFile.Status.EXTRACTING]],\n            // Extracted file is extractable\n            [[ModelFile.State.EXTRACTED, 100, 100], [true, ViewFile.Status.EXTRACTED]],\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    let resultVector = testVectors[count][1];\n                    expect(file.isExtractable).toBe(resultVector[0]);\n                    expect(file.status).toBe(resultVector[1]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let testVector = vector[0];\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                state: testVector[0],\n                local_size: testVector[1],\n                remote_size: testVector[2],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    // it(\"should sort view files by status then name\", fakeAsync(() => {\n    //     // Test vectors to create model file\n    //     // name, ModelFile.State, local size, remote size\n    //     let testVector: any[][] = [\n    //         [\"a\", ModelFile.State.DEFAULT, null, 100],\n    //         [\"b\", ModelFile.State.DEFAULT, 100, null],\n    //         [\"c\", ModelFile.State.DEFAULT, 50, 100],\n    //         [\"d\", ModelFile.State.DELETED, null, 100],\n    //         [\"e\", ModelFile.State.QUEUED, null, 100],\n    //         [\"f\", ModelFile.State.DOWNLOADING, 50, 100],\n    //         [\"g\", ModelFile.State.DOWNLOADED, 50, 100],\n    //         [\"h\", ModelFile.State.EXTRACTING, 50, 100],\n    //         [\"i\", ModelFile.State.EXTRACTED, 50, 100]\n    //     ];\n    //\n    //     // Except result vector in order of view file name and state\n    //     let resultVector: any[][] = [\n    //         [\"h\", ViewFile.Status.EXTRACTING],\n    //         [\"f\", ViewFile.Status.DOWNLOADING],\n    //         [\"e\", ViewFile.Status.QUEUED],\n    //         [\"i\", ViewFile.Status.EXTRACTED],\n    //         [\"g\", ViewFile.Status.DOWNLOADED],\n    //         [\"c\", ViewFile.Status.STOPPED],\n    //         [\"a\", ViewFile.Status.DEFAULT],\n    //         [\"b\", ViewFile.Status.DEFAULT],\n    //         [\"d\", ViewFile.Status.DELETED]\n    //     ];\n    //\n    //     let model = Immutable.Map<string, ModelFile>();\n    //     for(let vector of testVector) {\n    //         model = model.set(vector[0], new ModelFile({\n    //             name: vector[0],\n    //             state: vector[1],\n    //             local_size: vector[2],\n    //             remote_size: vector[3],\n    //         }));\n    //     }\n    //     mockModelService._files.next(model);\n    //     tick();\n    //\n    //     let count = 0;\n    //     viewService.files.subscribe({\n    //         next: list => {\n    //             expect(list.size).toBe(resultVector.length);\n    //             resultVector.forEach((item, index) => {\n    //                 let file = list.get(index);\n    //                 expect(file.name).toBe(item[0]);\n    //                 expect(file.status).toBe(item[1]);\n    //             });\n    //             count++;\n    //         }\n    //     });\n    //     tick();\n    //     expect(count).toBe(1);\n    // }));\n\n    it(\"should correctly set and unset the selected file\", fakeAsync(() => {\n        let model = Immutable.Map<string, ModelFile>();\n        model = model.set(\"a\", new ModelFile({name: \"a\"}));\n        model = model.set(\"b\", new ModelFile({name: \"b\"}));\n        model = model.set(\"c\", new ModelFile({name: \"c\"}));\n\n        let expectedSelectedFileIndex = -1;\n\n        mockModelService._files.next(model);\n        tick();\n\n        let viewFileList;\n        let count = 0;\n        viewService.files.subscribe({\n            next: list => {\n                viewFileList = list;\n                expect(list.size).toBe(3);\n                expect(list.get(0).name).toBe(\"a\");\n                expect(list.get(1).name).toBe(\"b\");\n                expect(list.get(2).name).toBe(\"c\");\n                list.forEach((item, index) => {\n                    // Only 1 file is selected at a time\n                    if(index == expectedSelectedFileIndex) {\n                        expect(item.isSelected).toBe(true);\n                    } else {\n                        expect(item.isSelected).toBe(false);\n                    }\n                });\n                count++;\n            }\n        });\n\n        tick();\n        expect(count).toBe(1);\n\n        // select \"a\"\n        expectedSelectedFileIndex = 0;\n        viewService.setSelected(viewFileList.get(0));\n        tick();\n        expect(count).toBe(2);\n\n        // unselect \"a\"\n        expectedSelectedFileIndex = -1;\n        viewService.unsetSelected();\n        tick();\n        expect(count).toBe(3);\n\n        // select \"b\"\n        expectedSelectedFileIndex = 1;\n        viewService.setSelected(viewFileList.get(1));\n        tick();\n        expect(count).toBe(4);\n\n        // select \"c\"\n        expectedSelectedFileIndex = 2;\n        viewService.setSelected(viewFileList.get(2));\n        tick();\n        expect(count).toBe(5);\n\n        // select \"b\" again\n        expectedSelectedFileIndex = 1;\n        viewService.setSelected(viewFileList.get(1));\n        tick();\n        expect(count).toBe(6);\n\n        // unselect \"b\"\n        expectedSelectedFileIndex = -1;\n        viewService.unsetSelected();\n        tick();\n        expect(count).toBe(7);\n    }));\n\n    it(\"should should correctly set ViewFile isLocallyDeletable\", fakeAsync(() => {\n        // Test and expected result vectors\n        // test - [ModelFile.State, local size, remote size]\n        // result - [isLocallyDeletable, ViewFile.Status]\n        let testVectors: any[][][] = [\n            // Default remote file is NOT locally deletable\n            [[ModelFile.State.DEFAULT, null, 100], [false, ViewFile.Status.DEFAULT]],\n            // Default local file is locally deletable\n            [[ModelFile.State.DEFAULT, 100, null], [true, ViewFile.Status.DEFAULT]],\n            // Stopped file is locally deletable\n            [[ModelFile.State.DEFAULT, 50, 100], [true, ViewFile.Status.STOPPED]],\n            // Deleted file is NOT locally deletable\n            [[ModelFile.State.DELETED, null, 100], [false, ViewFile.Status.DELETED]],\n            // Queued file is NOT locally deletable\n            [[ModelFile.State.QUEUED, null, 100], [false, ViewFile.Status.QUEUED]],\n            // Downloading file is NOT locally deletable\n            [[ModelFile.State.DOWNLOADING, 10, 100], [false, ViewFile.Status.DOWNLOADING]],\n            // Downloaded file is locally deletable\n            [[ModelFile.State.DOWNLOADED, 100, 100], [true, ViewFile.Status.DOWNLOADED]],\n            // Extracting file is NOT locally deletable\n            [[ModelFile.State.EXTRACTING, 100, 100], [false, ViewFile.Status.EXTRACTING]],\n            // Extracted file is locally deletable\n            [[ModelFile.State.EXTRACTED, 100, 100], [true, ViewFile.Status.EXTRACTED]],\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    let resultVector = testVectors[count][1];\n                    expect(file.isLocallyDeletable).toBe(resultVector[0]);\n                    expect(file.status).toBe(resultVector[1]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let testVector = vector[0];\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                state: testVector[0],\n                local_size: testVector[1],\n                remote_size: testVector[2],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    it(\"should should correctly set ViewFile isRemotelyDeletable\", fakeAsync(() => {\n        // Test and expected result vectors\n        // test - [ModelFile.State, local size, remote size]\n        // result - [isRemotelyDeletable, ViewFile.Status]\n        let testVectors: any[][][] = [\n            // Default remote file is remotely deletable\n            [[ModelFile.State.DEFAULT, null, 100], [true, ViewFile.Status.DEFAULT]],\n            // Default local file is NOT remotely deletable\n            [[ModelFile.State.DEFAULT, 100, null], [false, ViewFile.Status.DEFAULT]],\n            // Stopped file is remotely deletable\n            [[ModelFile.State.DEFAULT, 50, 100], [true, ViewFile.Status.STOPPED]],\n            // Deleted file is remotely deletable\n            [[ModelFile.State.DELETED, null, 100], [true, ViewFile.Status.DELETED]],\n            // Queued file is NOT remotely deletable\n            [[ModelFile.State.QUEUED, null, 100], [false, ViewFile.Status.QUEUED]],\n            // Downloading file is NOT remotely deletable\n            [[ModelFile.State.DOWNLOADING, 10, 100], [false, ViewFile.Status.DOWNLOADING]],\n            // Downloaded file is remotely deletable\n            [[ModelFile.State.DOWNLOADED, 100, 100], [true, ViewFile.Status.DOWNLOADED]],\n            // Extracting file is NOT remotely deletable\n            [[ModelFile.State.EXTRACTING, 100, 100], [false, ViewFile.Status.EXTRACTING]],\n            // Extracted file is remotely deletable\n            [[ModelFile.State.EXTRACTED, 100, 100], [true, ViewFile.Status.EXTRACTED]],\n        ];\n\n        let count = -1;\n        viewService.files.subscribe({\n            next: list => {\n                // Ignore first\n                if(count >= 0) {\n                    expect(list.size).toBe(1);\n                    let file = list.get(0);\n                    let resultVector = testVectors[count][1];\n                    expect(file.isRemotelyDeletable).toBe(resultVector[0]);\n                    expect(file.status).toBe(resultVector[1]);\n                }\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(0);\n\n        // Send over the test vectors\n        for(let vector of testVectors) {\n            let testVector = vector[0];\n            let model = Immutable.Map<string, ModelFile>();\n            model = model.set(\"a\", new ModelFile({\n                name: \"a\",\n                state: testVector[0],\n                local_size: testVector[1],\n                remote_size: testVector[2],\n            }));\n            mockModelService._files.next(model);\n            tick();\n        }\n        expect(count).toBe(testVectors.length);\n    }));\n\n    it(\"should not filter any files by default\", fakeAsync(() => {\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        viewService.filteredFiles.subscribe({\n            next: list => {\n                viewFiles = list;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(viewFiles.size).toBe(8);\n    }));\n\n    it(\"should apply filter criteria correctly\", fakeAsync(() => {\n        class TestCriteria implements ViewFileFilterCriteria {\n            meetsCriteria(viewFile: ViewFile): boolean {\n                return viewFile.status === ViewFile.Status.QUEUED ||\n                    viewFile.status === ViewFile.Status.EXTRACTED;\n            }\n\n        }\n        viewService.setFilterCriteria(new TestCriteria());\n\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n        tick();\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        let viewFilesMap: Map<string, ViewFile> = null;\n        viewService.filteredFiles.subscribe({\n            next: list => {\n                viewFiles = list;\n                viewFilesMap = new Map<string, ViewFile>();\n                list.forEach(value => viewFilesMap.set(value.name, value));\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(viewFiles.size).toBe(3);\n        expect(viewFilesMap.has(\"tofu\")).toBe(true);\n        expect(viewFilesMap.has(\"flower\")).toBe(true);\n        expect(viewFilesMap.has(\"blueman\")).toBe(true);\n    }));\n\n    it(\"should resend filtered files on criteria change\", fakeAsync(() => {\n        class TestCriteria implements ViewFileFilterCriteria {\n            constructor(public flag: boolean) {}\n            meetsCriteria(viewFile: ViewFile): boolean {\n                if (this.flag) {\n                    return viewFile.status === ViewFile.Status.QUEUED;\n                } else {\n                    return viewFile.status === ViewFile.Status.EXTRACTED;\n                }\n            }\n\n        }\n        viewService.setFilterCriteria(new TestCriteria(true));\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        let viewFilesMap: Map<string, ViewFile> = null;\n        viewService.filteredFiles.subscribe({\n            next: list => {\n                viewFiles = list;\n                viewFilesMap = new Map<string, ViewFile>();\n                list.forEach(value => viewFilesMap.set(value.name, value));\n                count++;\n            }\n        });\n        expect(count).toBe(1);\n\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n        tick();\n\n        expect(count).toBe(2);\n        expect(viewFiles.size).toBe(2);\n        expect(viewFilesMap.has(\"tofu\")).toBe(true);\n        expect(viewFilesMap.has(\"flower\")).toBe(true);\n\n        // Update the filter criteria\n        viewService.setFilterCriteria(new TestCriteria(false));\n\n        expect(count).toBe(3);\n        expect(viewFiles.size).toBe(1);\n        expect(viewFilesMap.has(\"blueman\")).toBe(true);\n    }));\n\n    it(\"should not sort files by default\", fakeAsync(() => {\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        viewService.files.subscribe({\n            next: list => {\n                viewFiles = list;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(viewFiles.size).toBe(8);\n        expect(viewFiles.get(0).name).toBe(\"aaaa\");\n        expect(viewFiles.get(1).name).toBe(\"tofu\");\n        expect(viewFiles.get(2).name).toBe(\"flower\");\n        expect(viewFiles.get(3).name).toBe(\"power\");\n        expect(viewFiles.get(4).name).toBe(\"max\");\n        expect(viewFiles.get(5).name).toBe(\"mrx\");\n        expect(viewFiles.get(6).name).toBe(\"blueman\");\n        expect(viewFiles.get(7).name).toBe(\"spicy\");\n    }));\n\n    it(\"should sort new model correctly\", fakeAsync(() => {\n        const comparator: ViewFileComparator = function(a: ViewFile, b: ViewFile) {\n            // alphabetical order\n            return a.name.localeCompare(b.name);\n        };\n        viewService.setComparator(comparator);\n\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        viewService.files.subscribe({\n            next: list => {\n                viewFiles = list;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n        expect(viewFiles.size).toBe(8);\n        expect(viewFiles.get(0).name).toBe(\"aaaa\");\n        expect(viewFiles.get(1).name).toBe(\"blueman\");\n        expect(viewFiles.get(2).name).toBe(\"flower\");\n        expect(viewFiles.get(3).name).toBe(\"max\");\n        expect(viewFiles.get(4).name).toBe(\"mrx\");\n        expect(viewFiles.get(5).name).toBe(\"power\");\n        expect(viewFiles.get(6).name).toBe(\"spicy\");\n        expect(viewFiles.get(7).name).toBe(\"tofu\");\n    }));\n\n    it(\"should sort existing model on setComparator\", fakeAsync(() => {\n        const model = Immutable.Map({\n            \"aaaa\": new ModelFile({name: \"aaaa\", state: ModelFile.State.DEFAULT}),\n            \"tofu\": new ModelFile({name: \"tofu\", state: ModelFile.State.QUEUED}),\n            \"flower\": new ModelFile({name: \"flower\", state: ModelFile.State.QUEUED}),\n            \"power\": new ModelFile({name: \"power\", state: ModelFile.State.DOWNLOADING}),\n            \"max\": new ModelFile({name: \"max\", state: ModelFile.State.DOWNLOADED}),\n            \"mrx\": new ModelFile({name: \"mrx\", state: ModelFile.State.EXTRACTING}),\n            \"blueman\": new ModelFile({name: \"blueman\", state: ModelFile.State.EXTRACTED}),\n            \"spicy\": new ModelFile({name: \"spicy\", state: ModelFile.State.DELETED}),\n        });\n        mockModelService._files.next(model);\n\n        let count = 0;\n        let viewFiles: Immutable.List<ViewFile> = null;\n        viewService.files.subscribe({\n            next: list => {\n                viewFiles = list;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        const comparator: ViewFileComparator = function(a: ViewFile, b: ViewFile) {\n            // reverse alphabetical order\n            return -1 * a.name.localeCompare(b.name);\n        };\n        viewService.setComparator(comparator);\n        tick();\n\n        expect(count).toBe(2);\n        expect(viewFiles.size).toBe(8);\n        expect(viewFiles.get(0).name).toBe(\"tofu\");\n        expect(viewFiles.get(1).name).toBe(\"spicy\");\n        expect(viewFiles.get(2).name).toBe(\"power\");\n        expect(viewFiles.get(3).name).toBe(\"mrx\");\n        expect(viewFiles.get(4).name).toBe(\"max\");\n        expect(viewFiles.get(5).name).toBe(\"flower\");\n        expect(viewFiles.get(6).name).toBe(\"blueman\");\n        expect(viewFiles.get(7).name).toBe(\"aaaa\");\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/logs/log-record.spec.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {LogRecord} from \"../../../../services/logs/log-record\";\n\n\ndescribe(\"Testing log record initialization\", () => {\n    let baseJson;\n    let baseLogRecord: LogRecord;\n\n    beforeEach(() => {\n        baseJson = {\n            level_name: \"DEBUG\",\n            time: \"1514776875.9439101\",\n            logger_name: \"seedsync.Controller.Model\",\n            message: \"LftpModel: Adding a listener\",\n            exc_tb: \"Exception Traceback\"\n        };\n        baseLogRecord = LogRecord.fromJson(baseJson);\n    });\n\n    it(\"should be immutable\", () => {\n        expect(baseLogRecord instanceof Immutable.Record).toBe(true);\n    });\n\n    it(\"should correctly initialize logger name\", () => {\n        expect(baseLogRecord.loggerName).toBe(\"seedsync.Controller.Model\");\n    });\n\n    it(\"should correctly initialize message\", () => {\n        expect(baseLogRecord.message).toBe(\"LftpModel: Adding a listener\");\n    });\n\n    it(\"should correctly initialize level names\", () => {\n        baseJson.level_name = \"DEBUG\";\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.level).toBe(LogRecord.Level.DEBUG);\n        baseJson.level_name = \"INFO\";\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.level).toBe(LogRecord.Level.INFO);\n        baseJson.level_name = \"WARNING\";\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.level).toBe(LogRecord.Level.WARNING);\n        baseJson.level_name = \"ERROR\";\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.level).toBe(LogRecord.Level.ERROR);\n        baseJson.level_name = \"CRITICAL\";\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.level).toBe(LogRecord.Level.CRITICAL);\n    });\n\n    it(\"should correctly initialize time\", () => {\n        expect(baseLogRecord.time).toEqual(new Date(1514776875943));\n    });\n\n    it(\"should correctly initialize exception traceback\", () => {\n        expect(baseLogRecord.exceptionTraceback).toEqual(\"Exception Traceback\");\n        baseJson.exc_tb = null;\n        baseLogRecord = LogRecord.fromJson(baseJson);\n        expect(baseLogRecord.exceptionTraceback).toBeNull();\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/logs/log.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {LogService} from \"../../../../services/logs/log.service\";\nimport {LogRecord} from \"../../../../services/logs/log-record\";\n\n\ndescribe(\"Testing log service\", () => {\n    let logService: LogService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                LoggerService,\n                LogService\n            ]\n        });\n\n        logService = TestBed.get(LogService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(logService).toBeDefined();\n    });\n\n    it(\"should register all events with the event source\", () => {\n        expect(logService.getEventNames()).toEqual(\n            [\"log-record\"]\n        );\n    });\n\n    it(\"should send correct record on event\", fakeAsync(() => {\n        let count = 0;\n        let latestRecord: LogRecord = null;\n        // noinspection JSUnusedAssignment\n        let json = null;\n\n        logService.logs.subscribe({\n            next: record => {\n                count++;\n                latestRecord = record;\n            }\n        });\n\n        json = {\n            level_name: \"DEBUG\",\n            time: \"1514776875.9439101\",\n            logger_name: \"seedsync.Controller.Model\",\n            message: \"LftpModel: Adding a listener\"\n        };\n        logService.notifyEvent(\"log-record\", JSON.stringify(json));\n        tick();\n        expect(count).toBe(1);\n        expect(Immutable.is(latestRecord, LogRecord.fromJson(json))).toBe(true);\n\n        json = {\n            level_name: \"WARNING\",\n            time: \"1514771875.9746701\",\n            logger_name: \"another name\",\n            message: \"another message\"\n        };\n        logService.notifyEvent(\"log-record\", JSON.stringify(json));\n        tick();\n        expect(count).toBe(2);\n        expect(Immutable.is(latestRecord, LogRecord.fromJson(json))).toBe(true);\n    }));\n\n    it(\"should cache records\", fakeAsync(() => {\n        let count = 0;\n        let latestRecord: LogRecord = null;\n        // noinspection JSUnusedAssignment\n        let data1 = null;\n        // noinspection JSUnusedAssignment\n        let data2  = null;\n\n        data1 = {\n            level_name: \"WARNING\",\n            time: \"1514771875.9746701\",\n            logger_name: \"another name\",\n            message: \"another message\"\n        };\n        data2 = {\n            level_name: \"DEBUG\",\n            time: \"1514776875.9439101\",\n            logger_name: \"seedsync.Controller.Model\",\n            message: \"LftpModel: Adding a listener\"\n        };\n\n        // Send out some data before subscription\n        logService.notifyEvent(\"log-record\", JSON.stringify(data1));\n        logService.notifyEvent(\"log-record\", JSON.stringify(data2));\n        tick();\n\n        logService.logs.subscribe({\n            next: record => {\n                count++;\n                latestRecord = record;\n            }\n        });\n        tick();\n        // Expect some data here\n        expect(count).toBe(2);\n\n        logService.notifyEvent(\"log-record\", JSON.stringify(data2));\n        tick();\n        expect(count).toBe(3);\n        expect(Immutable.is(latestRecord, LogRecord.fromJson(data2))).toBe(true);\n\n        logService.notifyEvent(\"log-record\", JSON.stringify(data1));\n        tick();\n        expect(count).toBe(4);\n        expect(Immutable.is(latestRecord, LogRecord.fromJson(data1))).toBe(true);\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-command.service.spec.ts",
    "content": "import {TestBed} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/common/http/testing\";\n\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ServerCommandService} from \"../../../../services/server/server-command.service\";\nimport {MockStreamServiceRegistry} from \"../../../mocks/mock-stream-service.registry\";\nimport {RestService} from \"../../../../services/utils/rest.service\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\nimport {StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\n\n\ndescribe(\"Testing server command service\", () => {\n    let mockRegistry: MockStreamServiceRegistry;\n    let httpMock: HttpTestingController;\n    let commandService: ServerCommandService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            imports: [\n                HttpClientTestingModule\n            ],\n            providers: [\n                ServerCommandService,\n                LoggerService,\n                RestService,\n                ConnectedService,\n                {provide: StreamServiceRegistry, useClass: MockStreamServiceRegistry}\n            ]\n        });\n\n        mockRegistry = TestBed.get(StreamServiceRegistry);\n        httpMock = TestBed.get(HttpTestingController);\n        commandService = TestBed.get(ServerCommandService);\n\n        // Connect the services\n        mockRegistry.connect();\n\n        // Finish test config init\n        commandService.onInit();\n    });\n\n    it(\"should create an instance\", () => {\n        expect(commandService).toBeDefined();\n    });\n\n\n    it(\"should send a GET restart command\", () => {\n        let count = 0;\n        commandService.restart().subscribe({\n           next: reaction => {\n               count++;\n               expect(reaction.success).toBe(true);\n           }\n        });\n\n        // set request\n        httpMock.expectOne(\"/server/command/restart\").flush(\"{}\");\n\n        expect(count).toBe(1);\n        httpMock.verify();\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-status.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ServerStatusService} from \"../../../../services/server/server-status.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {ServerStatus, ServerStatusJson} from \"../../../../services/server/server-status\";\n\n\ndescribe(\"Testing server status service\", () => {\n    let serverStatusService: ServerStatusService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                LoggerService,\n                ServerStatusService\n            ]\n        });\n\n        serverStatusService = TestBed.get(ServerStatusService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(serverStatusService).toBeDefined();\n    });\n\n    it(\"should register all events with the event source\", () => {\n        expect(serverStatusService.getEventNames()).toEqual(\n            [\"status\"]\n        );\n    });\n\n    it(\"should send correct status on event\", fakeAsync(() => {\n        let count = 0;\n        let latestStatus: ServerStatus = null;\n        serverStatusService.status.subscribe({\n            next: status => {\n                count++;\n                latestStatus = status;\n            }\n        });\n\n        // Initial status\n        tick();\n        expect(count).toBe(1);\n        expect(latestStatus.server.up).toBe(false);\n\n        // New status\n        const statusJson: ServerStatusJson = {\n            server: {\n                up: true,\n                error_msg: null\n            },\n            controller: {\n                latest_local_scan_time: null,\n                latest_remote_scan_time: null,\n                latest_remote_scan_failed: null,\n                latest_remote_scan_error: null\n            }\n        };\n        serverStatusService.notifyEvent(\"status\", JSON.stringify(statusJson));\n        tick();\n        expect(count).toBe(2);\n        expect(latestStatus.server.up).toBe(true);\n\n        // Status update\n        statusJson.server.up = false;\n        statusJson.server.error_msg = \"uh oh spaghettios\";\n        serverStatusService.notifyEvent(\"status\", JSON.stringify(statusJson));\n        tick();\n        expect(count).toBe(3);\n        expect(latestStatus.server.up).toBe(false);\n        expect(latestStatus.server.errorMessage).toBe(\"uh oh spaghettios\");\n    }));\n\n    it(\"should send correct status on disconnect\", fakeAsync(() => {\n        // Initial status\n        const statusJson: ServerStatusJson = {\n            server: {\n                up: true,\n                error_msg: null\n            },\n            controller: {\n                latest_local_scan_time: null,\n                latest_remote_scan_time: null,\n                latest_remote_scan_failed: null,\n                latest_remote_scan_error: null\n            }\n        };\n        serverStatusService.notifyEvent(\"status\", JSON.stringify(statusJson));\n\n        let count = 0;\n        let latestStatus: ServerStatus = null;\n        serverStatusService.status.subscribe({\n            next: status => {\n                count++;\n                latestStatus = status;\n            }\n        });\n\n        tick();\n        expect(count).toBe(1);\n\n        // Error\n        serverStatusService.notifyDisconnected();\n        tick();\n        expect(count).toBe(2);\n        expect(latestStatus.server.up).toBe(false);\n    }));\n\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/server/server-status.spec.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {ServerStatus, ServerStatusJson} from \"../../../../services/server/server-status\";\n\n\ndescribe(\"Testing log record initialization\", () => {\n    let baseJson: ServerStatusJson;\n    let baseStatus: ServerStatus;\n\n    beforeEach(() => {\n        baseJson = {\n            server: {\n                up: true,\n                error_msg: \"An error message\"\n            },\n            controller: {\n                latest_local_scan_time: \"1514776875.9439101\",\n                latest_remote_scan_time: \"1524743857.3456243\",\n                latest_remote_scan_failed: true,\n                latest_remote_scan_error: \"message failure reason\"\n            }\n        };\n        baseStatus = ServerStatus.fromJson(baseJson);\n    });\n\n    it(\"should be immutable\", () => {\n        expect(baseStatus instanceof Immutable.Record).toBe(true);\n    });\n\n    it(\"should correctly initialize server up\", () => {\n        expect(baseStatus.server.up).toBe(true);\n    });\n\n    it(\"should correctly initialize server error message\", () => {\n        expect(baseStatus.server.errorMessage).toBe(\"An error message\");\n    });\n\n    it(\"should correctly initialize controller latest local scan time\", () => {\n        expect(baseStatus.controller.latestLocalScanTime).toEqual(new Date(1514776875943));\n        // Allow null\n        baseJson.controller.latest_local_scan_time = null;\n        const newStatus = ServerStatus.fromJson(baseJson);\n        expect(newStatus.controller.latestLocalScanTime).toBeNull();\n    });\n\n    it(\"should correctly initialize controller latest remote scan time\", () => {\n        expect(baseStatus.controller.latestRemoteScanTime).toEqual(new Date(1524743857345));\n        // Allow null\n        baseJson.controller.latest_remote_scan_time = null;\n        const newStatus = ServerStatus.fromJson(baseJson);\n        expect(newStatus.controller.latestRemoteScanTime).toBeNull();\n    });\n\n    it(\"should correctly initialize controller failure\", () => {\n        expect(baseStatus.controller.latestRemoteScanFailed).toBe(true);\n    });\n\n    it(\"should correctly initialize controller error\", () => {\n        expect(baseStatus.controller.latestRemoteScanError).toBe(\"message failure reason\");\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/settings/config.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/common/http/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {ConfigService} from \"../../../../services/settings/config.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {Config} from \"../../../../services/settings/config\";\nimport {MockStreamServiceRegistry} from \"../../../mocks/mock-stream-service.registry\";\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\nimport {RestService} from \"../../../../services/utils/rest.service\";\nimport {StreamServiceRegistry} from \"../../../../services/base/stream-service.registry\";\n\n\n// noinspection JSUnusedLocalSymbols\nconst DoNothing = {next: reaction => {}};\n\n\ndescribe(\"Testing config service\", () => {\n    let mockRegistry: MockStreamServiceRegistry;\n    let httpMock: HttpTestingController;\n    let configService: ConfigService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            imports: [\n                HttpClientTestingModule\n            ],\n            providers: [\n                ConfigService,\n                LoggerService,\n                RestService,\n                ConnectedService,\n                {provide: StreamServiceRegistry, useClass: MockStreamServiceRegistry}\n            ]\n        });\n\n        mockRegistry = TestBed.get(StreamServiceRegistry);\n        httpMock = TestBed.get(HttpTestingController);\n        configService = TestBed.get(ConfigService);\n\n        // Connect the services\n        mockRegistry.connect();\n\n        // Finish test config init\n        configService.onInit();\n    });\n\n    it(\"should create an instance\", () => {\n        expect(configService).toBeDefined();\n    });\n\n    it(\"should parse config json correctly\", () => {\n        const configJson = {\n            general: {\n                debug: true\n            },\n            lftp: {\n                remote_address: \"remote.server.com\",\n                remote_username: \"some.user\",\n                remote_password: \"my.password\",\n                remote_path: \"/some/remote/path\",\n                local_path: \"/some/local/path\",\n                remote_path_to_scan_script: \"/another/remote/path\",\n                use_ssh_key: true,\n                num_max_parallel_downloads: 2,\n                num_max_parallel_files_per_download: 8,\n                num_max_connections_per_root_file: 32,\n                num_max_connections_per_dir_file: 4,\n                num_max_total_connections: 32,\n                use_temp_file: true,\n            },\n            controller: {\n                interval_ms_remote_scan: 30000,\n                interval_ms_local_scan: 10000,\n                interval_ms_downloading_scan: 1000\n            },\n            web: {\n                port: 8800\n            },\n            autoqueue: {\n                enabled: true,\n                patterns_only: false\n            }\n        };\n        httpMock.expectOne(\"/server/config/get\").flush(configJson);\n\n        configService.config.subscribe({\n            next: config => {\n                expect(config.general.debug).toBe(true);\n                expect(config.lftp.remote_address).toBe(\"remote.server.com\");\n                expect(config.lftp.remote_username).toBe(\"some.user\");\n                expect(config.lftp.remote_password).toBe(\"my.password\");\n                expect(config.lftp.remote_path).toBe(\"/some/remote/path\");\n                expect(config.lftp.local_path).toBe(\"/some/local/path\");\n                expect(config.lftp.remote_path_to_scan_script).toBe(\"/another/remote/path\");\n                expect(config.lftp.use_ssh_key).toBe(true);\n                expect(config.lftp.num_max_parallel_downloads).toBe(2);\n                expect(config.lftp.num_max_parallel_files_per_download).toBe(8);\n                expect(config.lftp.num_max_connections_per_root_file).toBe(32);\n                expect(config.lftp.num_max_connections_per_dir_file).toBe(4);\n                expect(config.lftp.num_max_total_connections).toBe(32);\n                expect(config.lftp.use_temp_file).toBe(true);\n                expect(config.controller.interval_ms_remote_scan).toBe(30000);\n                expect(config.controller.interval_ms_local_scan).toBe(10000);\n                expect(config.controller.interval_ms_downloading_scan).toBe(1000);\n                expect(config.web.port).toBe(8800);\n                expect(config.autoqueue.enabled).toBe(true);\n                expect(config.autoqueue.patterns_only).toBe(false);\n            }\n        });\n\n        httpMock.verify();\n    });\n\n    it(\"should get null on get error 404\", () => {\n        httpMock.expectOne(\"/server/config/get\").flush(\n        \"Not found\",\n        {status: 404, statusText: \"Bad Request\"}\n        );\n\n        configService.config.subscribe({\n            next: config => {\n                expect(config).toBe(null);\n            }\n        });\n\n        httpMock.verify();\n    });\n\n    it(\"should get null on get network error\", () => {\n        httpMock.expectOne(\"/server/config/get\").error(new ErrorEvent(\"mock error\"));\n\n        configService.config.subscribe({\n            next: config => {\n                expect(config).toBe(null);\n            }\n        });\n\n        httpMock.verify();\n    });\n\n    it(\"should get null on disconnect\", fakeAsync(() => {\n        const configExpected = [\n            new Config({lftp: {remote_address: \"first\"}}),\n            null\n        ];\n\n        httpMock.expectOne(\"/server/config/get\").flush({lftp: {remote_address: \"first\"}});\n        let configSubscriberIndex = 0;\n\n        configService.config.subscribe({\n            next: config => {\n                expect(Immutable.is(config, configExpected[configSubscriberIndex++])).toBe(true);\n            }\n        });\n\n        // status disconnect\n        mockRegistry.disconnect();\n        tick();\n\n        httpMock.verify();\n        expect(configSubscriberIndex).toBe(2);\n    }));\n\n    it(\"should retry GET on disconnect\", fakeAsync(() => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n\n        // status disconnect\n        mockRegistry.disconnect();\n        tick();\n\n        // status reconnect\n        mockRegistry.connect();\n        tick();\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        httpMock.verify();\n    }));\n\n    it(\"should send a GET on a set config option\", () => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        let configSubscriberIndex = 0;\n        configService.set(\"general\", \"debug\", true).subscribe({\n           next: reaction => {\n               configSubscriberIndex++;\n               expect(reaction.success).toBe(true);\n           }\n        });\n\n        // set request\n        httpMock.expectOne(\"/server/config/set/general/debug/true\").flush(\"{}\");\n\n        expect(configSubscriberIndex).toBe(1);\n        httpMock.verify();\n    });\n\n    it(\"should send correct GET requests on setting config options\", () => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        // boolean\n        configService.set(\"general\", \"debug\", true).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/true\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", false).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/false\").flush(\"{}\");\n\n        // integer\n        configService.set(\"general\", \"debug\", 0).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/0\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", 1000).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/1000\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", -1000).subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/-1000\").flush(\"{}\");\n\n        // string\n        configService.set(\"general\", \"debug\", \"test\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/test\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", \"test space\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/test%2520space\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", \"test/slash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/test%252Fslash\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", \"test\\\"doublequote\").subscribe(\n            DoNothing\n        );\n        httpMock.expectOne(\"/server/config/set/general/debug/test%2522doublequote\").flush(\"{}\");\n        configService.set(\"general\", \"debug\", \"/test/leadingslash\").subscribe(DoNothing);\n        httpMock.expectOne(\"/server/config/set/general/debug/%252Ftest%252Fleadingslash\").flush(\"{}\");\n\n        httpMock.verify();\n    });\n\n    it(\"should return error on setting non-existing section\", () => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        let configSubscriberIndex = 0;\n        configService.set(\"bad_section\", \"debug\", true).subscribe({\n           next: reaction => {\n               configSubscriberIndex++;\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Config has no option named bad_section.debug\");\n           }\n        });\n\n        expect(configSubscriberIndex).toBe(1);\n        httpMock.verify();\n    });\n\n    it(\"should return error on setting non-existing option\", () => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        let configSubscriberIndex = 0;\n        configService.set(\"general\", \"bad_option\", true).subscribe({\n           next: reaction => {\n               configSubscriberIndex++;\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Config has no option named general.bad_option\");\n           }\n        });\n\n        expect(configSubscriberIndex).toBe(1);\n        httpMock.verify();\n    });\n\n    it(\"should return error on empty value\", () => {\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(\"{}\");\n\n        let configSubscriberIndex = 0;\n        configService.set(\"general\", \"debug\", \"\").subscribe({\n           next: reaction => {\n               configSubscriberIndex++;\n               expect(reaction.success).toBe(false);\n               expect(reaction.errorMessage).toBe(\"Setting general.debug cannot be blank.\");\n           }\n        });\n\n        expect(configSubscriberIndex).toBe(1);\n        httpMock.verify();\n    });\n\n    it(\"should send updated config on a successful set\", () => {\n        const configJson = {general: {debug: false}};\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(configJson);\n\n        const configExpected = [\n            new Config({general: {debug: false}}),\n            new Config({general: {debug: true}})\n        ];\n        let configSubscriberIndex = 0;\n        configService.config.subscribe({\n            next: config => {\n                expect(Immutable.is(config, configExpected[configSubscriberIndex++])).toBe(true);\n            }\n        });\n\n        // issue the set\n        configService.set(\"general\", \"debug\", true).subscribe(DoNothing);\n\n        // set request\n        httpMock.expectOne(\"/server/config/set/general/debug/true\").flush(\"\");\n\n        expect(configSubscriberIndex).toBe(2);\n        httpMock.verify();\n    });\n\n    it(\"should NOT send updated config on a failed set\", () => {\n        const configJson = {general: {debug: false}};\n        // first connect\n        httpMock.expectOne(\"/server/config/get\").flush(configJson);\n\n        const configExpected = [\n            new Config({general: {debug: false}})\n        ];\n        let configSubscriberIndex = 0;\n        configService.config.subscribe({\n            next: config => {\n                expect(Immutable.is(config, configExpected[configSubscriberIndex++])).toBe(true);\n            }\n        });\n\n        // issue the set\n        configService.set(\"general\", \"debug\", true).subscribe(DoNothing);\n\n        // set request\n        httpMock.expectOne(\"/server/config/set/general/debug/true\").flush(\n            \"Not found\",\n            {status: 404, statusText: \"Bad Request\"}\n        );\n\n        expect(configSubscriberIndex).toBe(1);\n        httpMock.verify();\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/settings/config.spec.ts",
    "content": "import * as Immutable from \"immutable\";\n\nimport {Config} from \"../../../../services/settings/config\";\n\ndescribe(\"Testing config record initialization\", () => {\n    let config: Config;\n\n    beforeEach(() => {\n        const configJson = {\n            general: {\n                debug: true\n            },\n            lftp: {\n                remote_address: \"remote.server.com\",\n                remote_username: \"some.user\",\n                remote_password: \"my.password\",\n                remote_port: 3456,\n                remote_path: \"/some/remote/path\",\n                local_path: \"/some/local/path\",\n                remote_path_to_scan_script: \"/another/remote/path\",\n                use_ssh_key: true,\n                num_max_parallel_downloads: 2,\n                num_max_parallel_files_per_download: 8,\n                num_max_connections_per_root_file: 32,\n                num_max_connections_per_dir_file: 4,\n                num_max_total_connections: 32,\n                use_temp_file: true\n            },\n            controller: {\n                interval_ms_remote_scan: 30000,\n                interval_ms_local_scan: 10000,\n                interval_ms_downloading_scan: 1000,\n                extract_path: \"/path/to/extract\",\n                use_local_path_as_extract_path: true,\n            },\n            web: {\n                port: 8800\n            },\n            autoqueue: {\n                enabled: true,\n                patterns_only: false,\n                auto_extract: true,\n            }\n        };\n        config = new Config(configJson);\n    });\n\n\n    it(\"should initialize with correct values\", () => {\n        expect(config.general.debug).toBe(true);\n        expect(config.lftp.remote_address).toBe(\"remote.server.com\");\n        expect(config.lftp.remote_username).toBe(\"some.user\");\n        expect(config.lftp.remote_password).toBe(\"my.password\");\n        expect(config.lftp.remote_port).toBe(3456);\n        expect(config.lftp.remote_path).toBe(\"/some/remote/path\");\n        expect(config.lftp.local_path).toBe(\"/some/local/path\");\n        expect(config.lftp.remote_path_to_scan_script).toBe(\"/another/remote/path\");\n        expect(config.lftp.use_ssh_key).toBe(true);\n        expect(config.lftp.num_max_parallel_downloads).toBe(2);\n        expect(config.lftp.num_max_parallel_files_per_download).toBe(8);\n        expect(config.lftp.num_max_connections_per_root_file).toBe(32);\n        expect(config.lftp.num_max_connections_per_dir_file).toBe(4);\n        expect(config.lftp.num_max_total_connections).toBe(32);\n        expect(config.lftp.use_temp_file).toBe(true);\n        expect(config.controller.interval_ms_remote_scan).toBe(30000);\n        expect(config.controller.interval_ms_local_scan).toBe(10000);\n        expect(config.controller.interval_ms_downloading_scan).toBe(1000);\n        expect(config.controller.extract_path).toBe(\"/path/to/extract\");\n        expect(config.controller.use_local_path_as_extract_path).toBe(true);\n        expect(config.web.port).toBe(8800);\n        expect(config.autoqueue.enabled).toBe(true);\n        expect(config.autoqueue.patterns_only).toBe(false);\n        expect(config.autoqueue.auto_extract).toBe(true);\n    });\n\n    it(\"should be immutable\", () => {\n        expect(config instanceof Immutable.Record).toBe(true);\n    });\n\n    it(\"should have immutable members\", () => {\n        expect(config.general instanceof Immutable.Record).toBe(true);\n        expect(config.lftp instanceof Immutable.Record).toBe(true);\n        expect(config.controller instanceof Immutable.Record).toBe(true);\n        expect(config.web instanceof Immutable.Record).toBe(true);\n        expect(config.autoqueue instanceof Immutable.Record).toBe(true);\n    });\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/connected.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {ConnectedService} from \"../../../../services/utils/connected.service\";\n\n\ndescribe(\"Testing connected service\", () => {\n    let connectedService: ConnectedService;\n\n    let connectedResults: boolean[];\n\n    beforeEach(fakeAsync(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                ConnectedService\n            ]\n        });\n\n        connectedService = TestBed.get(ConnectedService);\n\n        connectedResults = [];\n        connectedService.connected.subscribe({\n            next: connected => {\n                connectedResults.push(connected);\n            }\n        });\n        tick();\n    }));\n\n    it(\"should create an instance\", () => {\n        expect(connectedService).toBeDefined();\n    });\n\n    it(\"should start off unconnected\", () => {\n        expect(connectedResults).toEqual([false]);\n    });\n\n    it(\"should notify on first connection success\", fakeAsync(() => {\n        connectedService.notifyConnected();\n        tick();\n\n        expect(connectedResults).toEqual([false, true]);\n    }));\n\n    it(\"should NOT notify on first connection failure\", fakeAsync(() => {\n        connectedService.notifyDisconnected();\n        tick();\n\n        expect(connectedResults).toEqual([false]);\n    }));\n\n    it(\"should notify on disconnection\", fakeAsync(() => {\n        connectedService.notifyConnected();\n        tick();\n        connectedService.notifyDisconnected();\n        tick();\n        expect(connectedResults).toEqual([false, true, false]);\n        tick();\n    }));\n\n    it(\"should notify on re-connection\", fakeAsync(() => {\n        connectedService.notifyConnected();\n        tick();\n        connectedService.notifyDisconnected();\n        tick();\n        connectedService.notifyConnected();\n        tick();\n        expect(connectedResults).toEqual([false, true, false, true]);\n    }));\n\n    it(\"should NOT notify on repeated disconnection\", fakeAsync(() => {\n        connectedService.notifyConnected();\n        tick();\n        connectedService.notifyDisconnected();\n        tick();\n        connectedService.notifyDisconnected();\n        tick();\n        expect(connectedResults).toEqual([false, true, false]);\n    }));\n\n    it(\"should NOT notify on repeated re-connection\", fakeAsync(() => {\n        connectedService.notifyConnected();\n        tick();\n        connectedService.notifyConnected();\n        tick();\n        expect(connectedResults).toEqual([false, true]);\n    }));\n\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/dom.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport {DomService} from \"../../../../services/utils/dom.service\";\n\n\n\ndescribe(\"Testing view file options service\", () => {\n    let domService: DomService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                DomService,\n            ]\n        });\n\n        domService = TestBed.get(DomService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(domService).toBeDefined();\n    });\n\n    it(\"should forward updates to headerHeight\", fakeAsync(() => {\n        let count = 0;\n        let headerHeight = null;\n        domService.headerHeight.subscribe({\n            next: height => {\n                headerHeight = height;\n                count++;\n            }\n        });\n        tick();\n        expect(count).toBe(1);\n\n        domService.setHeaderHeight(10);\n        tick();\n        expect(headerHeight).toBe(10);\n        expect(count).toBe(2);\n\n        domService.setHeaderHeight(20);\n        tick();\n        expect(headerHeight).toBe(20);\n        expect(count).toBe(3);\n\n        // Setting same value shouldn't trigger an update\n        domService.setHeaderHeight(20);\n        tick();\n        expect(headerHeight).toBe(20);\n        expect(count).toBe(3);\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/notification.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as Immutable from \"immutable\";\n\nimport {NotificationService} from \"../../../../services/utils/notification.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {Notification} from \"../../../../services/utils/notification\";\n\nclass TestNotificationService extends NotificationService {\n\n}\n\ndescribe(\"Testing notification service\", () => {\n    let notificationService: TestNotificationService;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                LoggerService,\n                {provide: NotificationService, useClass: TestNotificationService},\n            ]\n        });\n\n        notificationService = TestBed.get(NotificationService);\n    });\n\n\n    it(\"should create an instance\", () => {\n        expect(notificationService).toBeDefined();\n    });\n\n    it(\"should show notification\", fakeAsync(() => {\n        const expectedNotification = new Notification({level: Notification.Level.DANGER, text: \"danger\"});\n\n        notificationService.show(expectedNotification);\n\n        let actualCount = 0;\n        notificationService.notifications.subscribe({\n            next: list => {\n                expect(list.size).toBe(1);\n                expect(Immutable.is(expectedNotification, list.get(0))).toBe(true);\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n    }));\n\n    it(\"should hide notification\", fakeAsync(() => {\n        const expectedNotification = new Notification({level: Notification.Level.DANGER, text: \"danger\"});\n\n        notificationService.show(expectedNotification);\n        tick();\n        notificationService.hide(expectedNotification);\n\n        let actualCount = 0;\n        notificationService.notifications.subscribe({\n            next: list => {\n                expect(list.size).toBe(0);\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n    }));\n\n\n    it(\"should only send one update if show is called twice\", fakeAsync(() => {\n        const expectedNotification = new Notification({level: Notification.Level.DANGER, text: \"danger\"});\n\n        notificationService.show(expectedNotification);\n\n        let actualCount = 0;\n        // noinspection JSUnusedLocalSymbols\n        notificationService.notifications.subscribe({\n            next: list => {\n                actualCount++;\n            }\n        });\n        tick();\n        notificationService.show(expectedNotification);\n        tick();\n\n        expect(actualCount).toBe(1);\n    }));\n\n    it(\"should only send one update if hide is called twice\", fakeAsync(() => {\n        const expectedNotification = new Notification({level: Notification.Level.DANGER, text: \"danger\"});\n\n        notificationService.show(expectedNotification);\n        tick();\n        notificationService.hide(expectedNotification);\n\n        let actualCount = 0;\n        // noinspection JSUnusedLocalSymbols\n        notificationService.notifications.subscribe({\n            next: list => {\n                actualCount++;\n            }\n        });\n\n        tick();\n        notificationService.hide(expectedNotification);\n        tick();\n\n        expect(actualCount).toBe(1);\n    }));\n\n    it(\"should sort notifications by level\", fakeAsync(() => {\n        const noteDanger = new Notification({level: Notification.Level.DANGER, text: \"danger\"});\n        const noteInfo = new Notification({level: Notification.Level.INFO, text: \"info\"});\n        const noteWarning = new Notification({level: Notification.Level.WARNING, text: \"warning\"});\n        const noteSuccess = new Notification({level: Notification.Level.SUCCESS, text: \"success\"});\n\n        notificationService.show(noteDanger);\n        notificationService.show(noteInfo);\n        notificationService.show(noteWarning);\n        notificationService.show(noteSuccess);\n\n        let actualCount = 0;\n        notificationService.notifications.subscribe({\n            next: list => {\n                expect(list.size).toBe(4);\n                expect(Immutable.is(noteDanger, list.get(0))).toBe(true);\n                expect(Immutable.is(noteWarning, list.get(1))).toBe(true);\n                expect(Immutable.is(noteInfo, list.get(2))).toBe(true);\n                expect(Immutable.is(noteSuccess, list.get(3))).toBe(true);\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n    }));\n\n    it(\"should sort notifications by timestamp\", fakeAsync(() => {\n        function sleepFor( sleepDuration ) {\n            const now = new Date().getTime();\n            while (new Date().getTime() < now + sleepDuration) { /* do nothing */ }\n        }\n\n        // Sleep a little between inits\n        const noteOlder = new Notification({level: Notification.Level.DANGER, text: \"older\"});\n        sleepFor(10);\n        const noteNewer = new Notification({level: Notification.Level.DANGER, text: \"newer\"});\n        sleepFor(10);\n        const noteNewest = new Notification({level: Notification.Level.DANGER, text: \"newest\"});\n\n        notificationService.show(noteNewer);\n        notificationService.show(noteNewest);\n        notificationService.show(noteOlder);\n\n        let actualCount = 0;\n        notificationService.notifications.subscribe({\n            next: list => {\n                expect(list.size).toBe(3);\n                expect(Immutable.is(noteNewest, list.get(0))).toBe(true);\n                expect(Immutable.is(noteNewer, list.get(1))).toBe(true);\n                expect(Immutable.is(noteOlder, list.get(2))).toBe(true);\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n    }));\n\n    it(\"should sort notifications by level first, then timestamp\", fakeAsync(() => {\n        function sleepFor( sleepDuration ) {\n            const now = new Date().getTime();\n            while (new Date().getTime() < now + sleepDuration) { /* do nothing */ }\n        }\n\n        // Sleep a little between inits\n        const noteOlder = new Notification({level: Notification.Level.DANGER, text: \"older\"});\n        sleepFor(10);\n        const noteNewer = new Notification({level: Notification.Level.INFO, text: \"newer\"});\n        sleepFor(10);\n        const noteNewest = new Notification({level: Notification.Level.INFO, text: \"newest\"});\n\n        notificationService.show(noteNewer);\n        notificationService.show(noteNewest);\n        notificationService.show(noteOlder);\n\n        let actualCount = 0;\n        notificationService.notifications.subscribe({\n            next: list => {\n                expect(list.size).toBe(3);\n                expect(Immutable.is(noteOlder, list.get(0))).toBe(true);\n                expect(Immutable.is(noteNewest, list.get(1))).toBe(true);\n                expect(Immutable.is(noteNewer, list.get(2))).toBe(true);\n                actualCount++;\n            }\n        });\n\n        tick();\n        expect(actualCount).toBe(1);\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/rest.service.spec.ts",
    "content": "import {fakeAsync, TestBed} from \"@angular/core/testing\";\nimport {HttpClientTestingModule, HttpTestingController} from \"@angular/common/http/testing\";\n\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {RestService} from \"../../../../services/utils/rest.service\";\n\n\n\ndescribe(\"Testing rest service\", () => {\n    let restService: RestService;\n\n    let httpMock: HttpTestingController;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            imports: [\n                HttpClientTestingModule\n            ],\n            providers: [\n                RestService,\n                LoggerService,\n            ]\n        });\n        httpMock = TestBed.get(HttpTestingController);\n\n        restService = TestBed.get(RestService);\n    });\n\n    it(\"should create an instance\", () => {\n        expect(restService).toBeDefined();\n    });\n\n    it(\"should send http GET on sendRequest\", fakeAsync(() => {\n        let subscriberIndex = 0;\n        restService.sendRequest(\"/server/request\").subscribe({\n            next: reaction => {\n                subscriberIndex++;\n                expect(reaction.success).toBe(true);\n            }\n        });\n        httpMock.expectOne(\"/server/request\").flush(\"success\");\n\n        expect(subscriberIndex).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should return correct data on sendRequest\", fakeAsync(() => {\n        let subscriberIndex = 0;\n        restService.sendRequest(\"/server/request\").subscribe({\n            next: reaction => {\n                subscriberIndex++;\n                expect(reaction.success).toBe(true);\n                expect(reaction.data).toBe(\"this is some data\");\n            }\n        });\n        httpMock.expectOne(\"/server/request\").flush(\"this is some data\");\n\n        expect(subscriberIndex).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should get error message on sendRequest error 404\", fakeAsync(() => {\n        let subscriberIndex = 0;\n        restService.sendRequest(\"/server/request\").subscribe({\n            next: reaction => {\n                subscriberIndex++;\n                expect(reaction.success).toBe(false);\n                expect(reaction.errorMessage).toBe(\"Not found\");\n            }\n        });\n        httpMock.expectOne(\"/server/request\").flush(\n        \"Not found\",\n        {status: 404, statusText: \"Bad Request\"}\n        );\n\n        expect(subscriberIndex).toBe(1);\n        httpMock.verify();\n    }));\n\n    it(\"should get error message on sendRequest network error\", fakeAsync(() => {\n        let subscriberIndex = 0;\n        restService.sendRequest(\"/server/request\").subscribe({\n            next: reaction => {\n                subscriberIndex++;\n                expect(reaction.success).toBe(false);\n                expect(reaction.errorMessage).toBe(\"mock error\");\n            }\n        });\n        httpMock.expectOne(\"/server/request\").error(new ErrorEvent(\"mock error\"));\n\n        expect(subscriberIndex).toBe(1);\n        httpMock.verify();\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/app/tests/unittests/services/utils/version-check.service.spec.ts",
    "content": "import {fakeAsync, TestBed, tick} from \"@angular/core/testing\";\n\nimport * as compareVersions from \"compare-versions\";\n\nimport {VersionCheckService} from \"../../../../services/utils/version-check.service\";\nimport {RestService, WebReaction} from \"../../../../services/utils/rest.service\";\nimport {NotificationService} from \"../../../../services/utils/notification.service\";\nimport {LoggerService} from \"../../../../services/utils/logger.service\";\nimport {MockRestService} from \"../../../mocks/mock-rest.service\";\nimport {Subject} from \"rxjs/Subject\";\n\n\ndescribe(\"Testing version check service\", () => {\n    let versionCheckService: VersionCheckService;\n    let notifService: NotificationService;\n    let restService: RestService;\n\n    let sendRequestSpy = null;\n\n    beforeEach(() => {\n        TestBed.configureTestingModule({\n            providers: [\n                VersionCheckService,\n                LoggerService,\n                NotificationService,\n                {provide: RestService, useClass: MockRestService},\n            ]\n        });\n\n        notifService = TestBed.get(NotificationService);\n        restService = TestBed.get(RestService);\n\n        spyOn(notifService, \"show\");\n        sendRequestSpy = spyOn(restService, \"sendRequest\").and.returnValue(\n            new Subject<WebReaction>());\n\n        versionCheckService = TestBed.get(VersionCheckService);\n    });\n\n    function createVersionCheckService(): VersionCheckService {\n        return new VersionCheckService(\n            restService,\n            notifService,\n            TestBed.get(LoggerService)\n        );\n    }\n\n    it(\"should create an instance\", () => {\n        expect(versionCheckService).toBeDefined();\n    });\n\n    it(\"should request the correct github url\", fakeAsync(() => {\n        expect(restService.sendRequest).toHaveBeenCalledWith(\n            \"https://api.github.com/repos/ipsingh06/seedsync/releases/latest\"\n        );\n    }));\n\n    it(\"should fail gracefully on failed request to github\", fakeAsync(() => {\n        const subject = new Subject<WebReaction>();\n        sendRequestSpy.and.returnValue(subject);\n\n        // Recreate the service\n        versionCheckService = createVersionCheckService();\n        subject.next(new WebReaction(false, null, \"some error\"));\n        tick();\n\n        expect(notifService.show).not.toHaveBeenCalled();\n    }));\n\n    it(\"should fail gracefully on garbage data from github\", fakeAsync(() => {\n        const subject = new Subject<WebReaction>();\n        sendRequestSpy.and.returnValue(subject);\n\n        // Recreate the service\n        versionCheckService = createVersionCheckService();\n        subject.next(new WebReaction(true, \"garbage data\", null));\n        tick();\n\n        expect(notifService.show).not.toHaveBeenCalled();\n    }));\n\n    it(\"should fire a notification on new version\", fakeAsync(() => {\n        const subject = new Subject<WebReaction>();\n        sendRequestSpy.and.returnValue(subject);\n\n        // Note: can't spy on compareVersions, so just replace the private method instead\n        spyOn<any>(VersionCheckService, \"isVersionNewer\").and.returnValue(true);\n\n        // Recreate the service\n        versionCheckService = createVersionCheckService();\n        subject.next(new WebReaction(true, JSON.stringify({\"tag_name\": \"v0.0-0\"}), null));\n        tick();\n\n        expect(notifService.show).toHaveBeenCalled();\n    }));\n\n    it(\"should not fire a notification on old version\", fakeAsync(() => {\n        const subject = new Subject<WebReaction>();\n        sendRequestSpy.and.returnValue(subject);\n\n        // Note: can't spy on compareVersions, so just replace the private method instead\n        spyOn<any>(VersionCheckService, \"isVersionNewer\").and.returnValue(false);\n\n        // Recreate the service\n        versionCheckService = createVersionCheckService();\n        subject.next(new WebReaction(true, JSON.stringify({\"tag_name\": \"v0.0-0\"}), null));\n        tick();\n\n        expect(notifService.show).not.toHaveBeenCalled();\n    }));\n});\n"
  },
  {
    "path": "src/angular/src/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "src/angular/src/environments/environment.prod.ts",
    "content": "import {LoggerService} from \"../app/services/utils/logger.service\"\n\nexport const environment = {\n    production: true,\n    logger: {\n        level: LoggerService.Level.WARN\n    }\n};\n"
  },
  {
    "path": "src/angular/src/environments/environment.ts",
    "content": "// The file contents for the current environment will overwrite these during build.\n// The build system defaults to the dev environment which uses `environment.ts`, but if you do\n// `ng build --env=prod` then `environment.prod.ts` will be used instead.\n// The list of which env maps to which file can be found in `.angular-cli.json`.\n\nimport {LoggerService} from \"../app/services/utils/logger.service\"\n\nexport const environment = {\n    production: false,\n    logger: {\n        level: LoggerService.Level.DEBUG\n    }\n};\n"
  },
  {
    "path": "src/angular/src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>SeedSync</title>\n    <base href=\"/\">\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"icon\" type=\"image/png\" href=\"assets/favicon.png\">\n</head>\n<body>\n    <app-root></app-root>\n</body>\n</html>\n"
  },
  {
    "path": "src/angular/src/main.ts",
    "content": "import {enableProdMode} from '@angular/core';\nimport {platformBrowserDynamic} from '@angular/platform-browser-dynamic';\n\nimport {AppModule} from './app/app.module';\nimport {environment} from './environments/environment';\n\nif (environment.production) {\n    enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n"
  },
  {
    "path": "src/angular/src/polyfills.ts",
    "content": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfills to this file.\n *\n * This file is divided into 2 sections:\n *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.\n *   2. Application imports. Files imported after ZoneJS that should be loaded before your main\n *      file.\n *\n * The current setup is for so-called \"evergreen\" browsers; the last versions of browsers that\n * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),\n * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.\n *\n * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html\n */\n\n/***************************************************************************************************\n * BROWSER POLYFILLS\n */\n\n/** IE9, IE10 and IE11 requires all of the following polyfills. **/\n// import 'core-js/es6/symbol';\n// import 'core-js/es6/object';\n// import 'core-js/es6/function';\n// import 'core-js/es6/parse-int';\n// import 'core-js/es6/parse-float';\n// import 'core-js/es6/number';\n// import 'core-js/es6/math';\n// import 'core-js/es6/string';\n// import 'core-js/es6/date';\n// import 'core-js/es6/array';\n// import 'core-js/es6/regexp';\n// import 'core-js/es6/map';\n// import 'core-js/es6/weak-map';\n// import 'core-js/es6/set';\n\n/** IE10 and IE11 requires the following for NgClass support on SVG elements */\n// import 'classlist.js';  // Run `npm install --save classlist.js`.\n\n/** Evergreen browsers require these. **/\nimport 'core-js/es6/reflect';\nimport 'core-js/es7/reflect';\n\n\n/**\n * Required to support Web Animations `@angular/animation`.\n * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation\n **/\n// import 'web-animations-js';  // Run `npm install --save web-animations-js`.\n\n\n/***************************************************************************************************\n * Zone JS is required by Angular itself.\n */\nimport 'zone.js/dist/zone';  // Included with Angular CLI.\n\n\n/***************************************************************************************************\n * APPLICATION IMPORTS\n */\n\n/**\n * Date, currency, decimal and percent pipes.\n * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10\n */\n// import 'intl';  // Run `npm install --save intl`.\n/**\n * Need to import at least one locale-data with intl.\n */\n// import 'intl/locale-data/jsonp/en';\n"
  },
  {
    "path": "src/angular/src/styles.scss",
    "content": "@import 'app/common/common';\n\nhtml {\n    -ms-text-size-adjust: 100%;\n    -webkit-text-size-adjust: 100%;\n    -moz-text-size-adjust: 100%;\n}\n\nhtml, body {\n    font-family: Verdana,sans-serif;\n    font-size: 15px;\n    line-height: 1.5;\n    margin: 0;\n}\n\n/* show the input search cancel button */\ninput[type=search]::-webkit-search-cancel-button {\n    -webkit-appearance: searchfield-cancel-button;\n}\n\ndiv {\n    /*border: 1px solid black;*/\n    /* make padding and border inside box */\n    box-sizing: border-box;\n}\n\n// Bootstrap modifications\n.modal-body {\n    /* break up long text */\n    overflow-wrap: normal;\n    hyphens: auto;\n    word-break: break-word;\n}\n"
  },
  {
    "path": "src/angular/src/test.ts",
    "content": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/long-stack-trace-zone';\nimport 'zone.js/dist/proxy.js';\nimport 'zone.js/dist/sync-test';\nimport 'zone.js/dist/jasmine-patch';\nimport 'zone.js/dist/async-test';\nimport 'zone.js/dist/fake-async-test';\nimport {getTestBed} from '@angular/core/testing';\nimport {\n    BrowserDynamicTestingModule,\n    platformBrowserDynamicTesting\n} from '@angular/platform-browser-dynamic/testing';\n\n// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.\ndeclare const __karma__: any;\ndeclare const require: any;\n\n// Prevent Karma from running prematurely.\n__karma__.loaded = function () {};\n\n// First, initialize the Angular testing environment.\ngetTestBed().initTestEnvironment(\n    BrowserDynamicTestingModule,\n    platformBrowserDynamicTesting()\n);\n// Then we find all the tests.\nconst context = require.context('./', true, /\\.spec\\.ts$/);\n// And load the modules.\ncontext.keys().map(context);\n// Finally, start Karma to run the tests.\n__karma__.start();\n"
  },
  {
    "path": "src/angular/src/tsconfig.app.json",
    "content": "{\n    \"extends\": \"../tsconfig.json\",\n    \"compilerOptions\": {\n        \"outDir\": \"../out-tsc/app\",\n        \"baseUrl\": \"./\",\n        \"module\": \"commonjs\",\n        \"types\": []\n    },\n    \"exclude\": [\n        \"test.ts\",\n        \"**/*.spec.ts\"\n    ]\n}\n"
  },
  {
    "path": "src/angular/src/tsconfig.spec.json",
    "content": "{\n    \"extends\": \"../tsconfig.json\",\n    \"compilerOptions\": {\n        \"outDir\": \"../out-tsc/spec\",\n        \"baseUrl\": \"./\",\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"types\": [\n            \"jasmine\",\n            \"node\"\n        ]\n    },\n    \"files\": [\n        \"test.ts\"\n    ],\n    \"include\": [\n        \"**/*.spec.ts\",\n        \"**/*.d.ts\"\n    ]\n}\n"
  },
  {
    "path": "src/angular/src/typings.d.ts",
    "content": "/* SystemJS module definition */\ndeclare var module: NodeModule;\n\ninterface NodeModule {\n    id: string;\n}\n"
  },
  {
    "path": "src/angular/tsconfig.json",
    "content": "{\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"outDir\": \"./dist/out-tsc\",\n    \"sourceMap\": true,\n    \"declaration\": false,\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"target\": \"es5\",\n    \"typeRoots\": [\n      \"node_modules/@types\"\n    ],\n    \"lib\": [\n      \"es2017\",\n      \"dom\"\n    ]\n  }\n}\n"
  },
  {
    "path": "src/angular/tslint.json",
    "content": "{\n  \"rulesDirectory\": [\n    \"node_modules/codelyzer\"\n  ],\n  \"rules\": {\n    \"arrow-return-shorthand\": true,\n    \"callable-types\": true,\n    \"class-name\": true,\n    \"comment-format\": [\n      true,\n      \"check-space\"\n    ],\n    \"curly\": true,\n    \"eofline\": true,\n    \"forin\": true,\n    \"import-blacklist\": [\n      true,\n      \"rxjs\"\n    ],\n    \"import-spacing\": true,\n    \"indent\": [\n      true,\n      \"spaces\"\n    ],\n    \"interface-over-type-literal\": true,\n    \"label-position\": true,\n    \"max-line-length\": [\n      true,\n      140\n    ],\n    \"member-access\": false,\n    \"no-arg\": true,\n    \"no-bitwise\": true,\n    \"no-console\": [\n      true,\n      \"debug\",\n      \"info\",\n      \"time\",\n      \"timeEnd\",\n      \"trace\"\n    ],\n    \"no-construct\": true,\n    \"no-debugger\": true,\n    \"no-duplicate-super\": true,\n    \"no-empty\": false,\n    \"no-empty-interface\": true,\n    \"no-eval\": true,\n    \"no-inferrable-types\": [\n      true,\n      \"ignore-params\"\n    ],\n    \"no-misused-new\": true,\n    \"no-non-null-assertion\": true,\n    \"no-shadowed-variable\": true,\n    \"no-string-literal\": false,\n    \"no-string-throw\": true,\n    \"no-switch-case-fall-through\": true,\n    \"no-trailing-whitespace\": true,\n    \"no-unnecessary-initializer\": true,\n    \"no-unused-expression\": true,\n    \"no-use-before-declare\": true,\n    \"no-var-keyword\": true,\n    \"object-literal-sort-keys\": false,\n    \"one-line\": [\n      true,\n      \"check-open-brace\",\n      \"check-catch\",\n      \"check-else\",\n      \"check-whitespace\"\n    ],\n    \"prefer-const\": true,\n    \"quotemark\": [\n      true,\n      \"double\"\n    ],\n    \"radix\": true,\n    \"semicolon\": [\n      true,\n      \"always\"\n    ],\n    \"triple-equals\": [\n      true,\n      \"allow-null-check\"\n    ],\n    \"typedef-whitespace\": [\n      true,\n      {\n        \"call-signature\": \"nospace\",\n        \"index-signature\": \"nospace\",\n        \"parameter\": \"nospace\",\n        \"property-declaration\": \"nospace\",\n        \"variable-declaration\": \"nospace\"\n      }\n    ],\n    \"typeof-compare\": true,\n    \"unified-signatures\": true,\n    \"variable-name\": false,\n    \"whitespace\": [\n      true,\n      \"check-branch\",\n      \"check-decl\",\n      \"check-operator\",\n      \"check-separator\",\n      \"check-type\"\n    ],\n    \"directive-selector\": [\n      true,\n      \"attribute\",\n      \"app\",\n      \"camelCase\"\n    ],\n    \"component-selector\": [\n      true,\n      \"element\",\n      \"app\",\n      \"kebab-case\"\n    ],\n    \"use-input-property-decorator\": true,\n    \"use-output-property-decorator\": true,\n    \"use-host-property-decorator\": true,\n    \"no-input-rename\": true,\n    \"no-output-rename\": true,\n    \"use-life-cycle-interface\": true,\n    \"use-pipe-transform-interface\": true,\n    \"component-class-suffix\": true,\n    \"directive-class-suffix\": true,\n    \"no-access-missing-member\": true,\n    \"templates-use-public\": true,\n    \"invoke-injectable\": true\n  }\n}\n"
  },
  {
    "path": "src/debian/changelog",
    "content": "seedsync (0.8.6) stable; urgency=low\n\n  * Fixed broken rar extraction in previous release\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 30 Dec 2020 18:10:14 -0800\n\nseedsync (0.8.5) stable; urgency=low\n\n  * Fixed errors caused by non-utf8 characters in file names\n  * Reduced docker image size by switching to a slim base\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 30 Dec 2020 17:20:54 -0800\n\nseedsync (0.8.4) stable; urgency=low\n\n  * Support for Raspberry Pi (armv7 and armv8 architectures)\n  * Fixed more lftp parser errors\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 19 Aug 2020 15:34:11 -0700\n\nseedsync (0.8.3) stable; urgency=low\n\n  * Ignore non-consecutive lftp parser errors\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Mon, 29 Jun 2020 21:57:23 -0700\n\nseedsync (0.8.2) stable; urgency=low\n\n  * Fixed more lftp parser errors\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Fri, 26 Jun 2020 15:27:43 -0700\n\nseedsync (0.8.1) stable; urgency=low\n\n  * Fixed another lftp parser error\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 17 Jun 2020 23:40:16 -0700\n\nseedsync (0.8.0) stable; urgency=low\n\n  * Remote server disconnections no longer stop the app\n  * Fixed an lftp parser error\n  * Remote server connection error messages are more descriptive\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Tue, 09 Jun 2020 23:00:53 -0700\n\nseedsync (0.7.3) stable; urgency=low\n\n  * Fixed docker image scp error with unknown user\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Sun, 31 May 2020 18:50:38 -0700\n\nseedsync (0.7.2) stable; urgency=low\n\n  * Fixed docker image ssh directory path\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Sun, 31 May 2020 18:06:32 -0700\n\nseedsync (0.7.1) stable; urgency=low\n\n  * Support for Ubuntu 20.04 (debian package)\n  * Support for arbitrary host uid in Docker image\n  * Fixed some lftp parsing errors\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Sat, 30 May 2020 23:26:59 -0700\n\nseedsync (0.7.0) stable; urgency=low\n\n  * Fixed 100% CPU utilization when idle\n  * Fixed file permission issues with Docker application\n  * Docker application is now architecture independent\n  * Faster startup by skipping remote scanfs installation when possible\n  * Show file created and modified timestamps in UI\n  * Added UI option to sort list of files by name\n  * Improved filtering UI\n  * Improved settings UI on mobile devices\n  * Improved logging UI\n  * Remember some UI preferences\n  * Support for wildcards in auto-queue patterns\n  * Added a notification for newer releases of SeedSync\n  * Various other bugfixes\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Fri, 01 Feb 2019 01:11:07 -0800\n\nseedsync (0.6.0) stable; urgency=low\n\n  * Added support for password-based SSH login\n  * Fixed some SSH errors\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 21 Mar 2018 19:38:14 -0700\n\nseedsync (0.5.1) stable; urgency=low\n\n  * Added (hidden) setting to enable verbose logging\n  * Fixed LFTP timeout errors crashing the app\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Wed, 14 Mar 2018 00:37:42 -0700\n\nseedsync (0.5.0) stable; urgency=low\n\n  * Added LFTP option to rename downloading/unfinished files\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Fri, 09 Mar 2018 15:21:29 -0800\n\nseedsync (0.4.0) stable; urgency=low\n\n  * Docker image released\n  * Fixed auto-queue not working when patterns list empty\n  * Fixed zombie lftp process after exit\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Thu, 08 Mar 2018 02:31:30 -0800\n\nseedsync (0.3.0) stable; urgency=low\n\n  * Added ability to extract archive files\n  * Added ability to delete files on local and remote server\n  * Added ability to automatically extract auto-queued files\n  * Shiny new icons\n  * Added UI notification when waiting for remote server to respond\n  * Fixed service exiting on 'text file is busy' error\n  * Various UI improvements\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Tue, 06 Mar 2018 02:28:12 -0800\n\nseedsync (0.2.0) stable; urgency=low\n\n  * Added option for remote SSH port\n  * Added ability to view log in web GUI\n  * Added option to enable/disable pattern-restricted AutoQueue\n  * Added option to enable/disable AutoQueue entirely\n  * Fixed AutoQueue not re-queuing file when it changes on remote server\n  * Minor UI improvements\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Thu, 04 Jan 2018 02:00:54 -0800\n\nseedsync (0.1.0) stable; urgency=low\n\n  * Initial Release\n\n -- Inderpreet Singh <inder@singhsnet.ca>  Sat, 23 Dec 2017 14:36:35 -0800"
  },
  {
    "path": "src/debian/compat",
    "content": "10"
  },
  {
    "path": "src/debian/config",
    "content": "#!/bin/sh -e\n\n# Source debconf library.\n. /usr/share/debconf/confmodule\n\n# Ask for username\ndb_input high seedsync/username || true\ndb_go || true"
  },
  {
    "path": "src/debian/control",
    "content": "Source: seedsync\nSection: utils\nPriority: extra\nMaintainer: Inderpreet Singh <ipsingh06@gmail.com>\nBuild-Depends: debhelper (>= 8.0.0), dh-systemd (>= 1.5)\nStandards-Version: 4.0.0\n\nPackage: seedsync\nArchitecture: amd64\nDepends: ${shlibs:Depends}, ${misc:Depends}, lftp, openssh-client\nPre-Depends: debconf (>= 0.2.17)\nDescription: fully GUI-configurable, lftp-based file transfer and management program\n seedsync is a lftp-based file transfer program to keep your local server\n synchronized with your remote seedbox. It features a web-based GUI to\n fully configure lftp settings as well as view the transfer status.\n It additionally allows you to extract archives and delete files on both\n the local and remote server, all from the web-based GUI."
  },
  {
    "path": "src/debian/postinst",
    "content": "#!/bin/sh\n\nOVERRIDE_DIR=/etc/systemd/system/seedsync.service.d\nOVERRIDE_FILE=override.conf\n\n\n#!/bin/sh -e\n\n# Source debconf library.\n. /usr/share/debconf/confmodule\n\ndb_get seedsync/username\nUSER=$RET\n\nif [ -z \"${USER}\" ]; then\n    echo \"Skipping user override\"\nelse\n    echo \"Setting user to ${USER}\"\n\n    if [ \"$RET\" = \"root\" ]; then\n        rm -rf ${OVERRIDE_DIR}/${OVERRIDE_FILE}\n    else\n        mkdir -p ${OVERRIDE_DIR}\n        echo [Service]\\\\nUser=${USER}\\\\nEnvironment=\\\"HOME=/home/${USER}\\\" > ${OVERRIDE_DIR}/${OVERRIDE_FILE}\n    fi\nfi\n\n#DEBHELPER#\n"
  },
  {
    "path": "src/debian/postrm",
    "content": "#!/bin/sh\nif [ \"$1\" = \"purge\" ]; then\n    rm -rf /etc/systemd/system/seedsync.service.d\nfi\n\n#DEBHELPER#\n"
  },
  {
    "path": "src/debian/rules",
    "content": "#!/usr/bin/make -f\n\nexport DESTROOT=$(CURDIR)/debian/seedsync\n\n%:\n\tdh $@ --with=systemd\n\noverride_dh_auto_build:\n\tdh_auto_build\n\noverride_dh_auto_install:\n\tdh_auto_install\n\tmkdir -p $(DESTROOT)/usr/lib\n\tcp -rf seedsync $(DESTROOT)/usr/lib/\n\noverride_dh_shlibdeps:\n\tdh_shlibdeps -l$(CURDIR)/seedsync\n"
  },
  {
    "path": "src/debian/seedsync.service",
    "content": "# Service unit for seedsync\n# Note: User should be overridden in\n#       /etc/systemd/system/seedsync.service.d/override.conf\n\n[Unit]\nDescription=Job that runs the SeedSync daemon\nRequires=local-fs.target network-online.target\nAfter=local-fs.target network-online.target\n\n[Service]\nType=simple\nUser=root\nEnvironment=\"HOME=/root\"\nExecStartPre=/bin/mkdir -p ${HOME}/.seedsync\nExecStartPre=/bin/mkdir -p ${HOME}/.seedsync/log\nExecStart=/usr/lib/seedsync/seedsync --logdir ${HOME}/.seedsync/log -c ${HOME}/.seedsync\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "src/debian/source/format",
    "content": "3.0 (native)"
  },
  {
    "path": "src/debian/templates",
    "content": "Template: seedsync/username\nType: string\nDefault: root\nDescription: User for SeedSync service\n The service will run under this user.\n All transferred files will be owned by this user."
  },
  {
    "path": "src/docker/build/deb/Dockerfile",
    "content": "# Creates environment to build python binaries\nFROM ubuntu:16.04 as seedsync_build_pyinstaller_env\nRUN apt-get update && apt-get install -y software-properties-common\nRUN add-apt-repository ppa:deadsnakes/ppa && \\\n    apt-get update && apt-get install -y \\\n    python3.8 \\\n    python3.8-dev \\\n    python3.8-distutils \\\n    curl \\\n    binutils\n# Switch to Python 3.8\nRUN update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1\nRUN update-alternatives --set python /usr/bin/python3.8\nRUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1\nRUN update-alternatives --set python3 /usr/bin/python3.8\n# Install Poetry\nRUN curl -s https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \\\n    python get-pip.py --force-reinstall && \\\n    rm get-pip.py\nRUN pip3 install poetry\nRUN poetry config virtualenvs.create false\nCOPY src/python/pyproject.toml /app/python/\nCOPY src/python/poetry.lock /app/python/\nWORKDIR /python\nENV LC_ALL=C.UTF-8\nENV LANG=C.UTF-8\nRUN cd /app/python && poetry install\n\n\n# Builds seedsync with pyinstaller\n# Output is in /build/dist/seedsync/\nFROM seedsync_build_pyinstaller_env as seedsync_build_pyinstaller\nCOPY src/python /python\nCOPY src/pyinstaller_hooks /pyinstaller_hooks\nRUN mkdir -p /build\nRUN pyinstaller /python/seedsync.py \\\n    -y \\\n    -p /python \\\n    --distpath /build/dist \\\n    --workpath /build/work \\\n    --specpath /build \\\n    --additional-hooks-dir /pyinstaller_hooks/ \\\n    --hidden-import=\"pkg_resources.py2_warn\" \\\n    --name seedsync\n\n\n# Builds scanfs with pyinstaller\n# Output is in /build/dist/\nFROM seedsync_build_pyinstaller_env as seedsync_build_scanfs\nCOPY src/python /python\nRUN mkdir -p /build\nRUN\tpyinstaller /python/scan_fs.py \\\n    -y \\\n    --onefile \\\n    -p /python \\\n    --distpath /build/dist \\\n    --workpath /build/work \\\n    --specpath /build \\\n    --name scanfs\n\n\n# Creates environment for angular\nFROM node:12.16 as seedsync_build_angular_env\nCOPY src/angular/package*.json /app/\nWORKDIR /app\nRUN npm install\n\n# Builds angular app into html\n# Output is in /build/dist/\nFROM seedsync_build_angular_env as seedsync_build_angular\nCOPY src/angular /app\nWORKDIR /app\nRUN node_modules/@angular/cli/bin/ng build -prod --output-path /build/dist/\n\n\n# Creates environment to build deb packages\nFROM ubuntu:16.04 as seedsync_build_deb_env\nRUN apt-get update\nRUN apt-get install -y build-essential dh-systemd debhelper\nRUN apt-get install -y devscripts\n\n\n# Builds debian package\n# Output is in /build/dist/\nFROM seedsync_build_deb_env as seedsync_build_deb\nRUN mkdir -p /build/work\nCOPY src/debian /build/work/debian\nCOPY --from=seedsync_build_pyinstaller /build/dist/seedsync /build/work/seedsync\nCOPY --from=seedsync_build_scanfs /build/dist/scanfs /build/work/seedsync/\nCOPY --from=seedsync_build_angular /build/dist /build/work/seedsync/html\nWORKDIR /build/work\nRUN dpkg-buildpackage -B -uc -us\nRUN ls /build/*.deb && echo \"----\" && ls /build/work\n\n\n# Exports deb package to host\nFROM scratch AS seedsync_build_deb_export\nCOPY --from=seedsync_build_deb /build/*.deb .\n\n# Exports scanfs to host\nFROM scratch AS seedsync_build_scanfs_export\nCOPY --from=seedsync_build_scanfs /build/dist/scanfs .\n\n# Exports html to host\nFROM scratch AS seedsync_build_angular_export\nCOPY --from=seedsync_build_angular /build/dist ./html\n"
  },
  {
    "path": "src/docker/build/deb/Dockerfile.dockerignore",
    "content": "**/*.pyc\n**/__pycache__\n**/node_modules\n**/.venv\n.git\n.idea\nbuild\nsrc/angular/dist\nsrc/python/build\n"
  },
  {
    "path": "src/docker/build/docker-image/Dockerfile",
    "content": "ARG STAGING_REGISTRY=localhost:5000\nARG STAGING_VERSION=latest\n\n# Creates environment to run Seedsync python code\n# Installs all python dependencies\nFROM python:3.8-slim as seedsync_run_python_env\n\n# Install dependencies\nRUN sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list && \\\n    apt-get update && \\\n    apt-get install -y \\\n        gcc \\\n        libssl-dev \\\n        lftp \\\n        openssh-client \\\n        p7zip \\\n        p7zip-full \\\n        p7zip-rar \\\n        bzip2 \\\n        curl \\\n        libnss-wrapper \\\n        libxml2-dev libxslt-dev libffi-dev \\\n    && apt-get clean\n# Fix for patoolib\n# See: https://github.com/wummel/patool/issues/90\nRUN ln -s /usr/lib/p7zip/Codecs/Rar.so /usr/lib/p7zip/Codecs/Rar29.so\n\n# Install Poetry\nRUN curl -s https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \\\n    python get-pip.py --force-reinstall && \\\n    rm get-pip.py\nRUN pip3 install poetry\nRUN poetry config virtualenvs.create false\n\nENV LC_ALL=C.UTF-8\nENV LANG=C.UTF-8\n\n# Install Python dependencies\nRUN mkdir -p /app\nCOPY src/python/pyproject.toml /app/python/\nCOPY src/python/poetry.lock /app/python/\nRUN cd /app/python && poetry install --no-dev\n\n\n# Creates environment for Python dev\nFROM seedsync_run_python_env as seedsync_run_python_devenv\nRUN cd /app/python && poetry install\n\n\n# Installs Seedsync python code\nFROM seedsync_run_python_env as seedsync_run_python\nRUN mkdir -p /app\nCOPY src/python /app/python\n\n\n# Full Seedsync docker image\nFROM ${STAGING_REGISTRY}/seedsync/build/angular/export:${STAGING_VERSION} as seedsync_build_angular_export\nFROM ${STAGING_REGISTRY}/seedsync/build/scanfs/export:${STAGING_VERSION} as seedsync_build_scanfs_export\nFROM seedsync_run_python as seedsync_run\nCOPY --from=seedsync_build_angular_export /html /app/html\nCOPY --from=seedsync_build_scanfs_export /scanfs /app/scanfs\nCOPY src/docker/build/docker-image/setup_default_config.sh /scripts/\n\n# Disable the known hosts prompt\nRUN mkdir -p /root/.ssh && echo \"StrictHostKeyChecking no\\nUserKnownHostsFile /dev/null\" > /root/.ssh/config\n\n# SSH as any user fix\n# https://stackoverflow.com/a/57531352\nCOPY src/docker/build/docker-image/run_as_user /usr/local/bin/\nRUN chmod a+x /usr/local/bin/run_as_user\nCOPY src/docker/build/docker-image/ssh /usr/local/sbin\nRUN chmod a+x /usr/local/sbin/ssh\nCOPY src/docker/build/docker-image/scp /usr/local/sbin\nRUN chmod a+x /usr/local/sbin/scp\n\n\n# Create non-root user and directories under that user\nRUN groupadd -g 1000 seedsync && \\\n    useradd -r -u 1000 -g seedsync seedsync\nRUN mkdir /config && \\\n    mkdir /downloads && \\\n    chown seedsync:seedsync /config && \\\n    chown seedsync:seedsync /downloads\n\n# Switch to non-root user\nUSER seedsync\n\n# First time config setup and replacement\nRUN /scripts/setup_default_config.sh\n\n# Must run app inside shell\n# Otherwise the container crashes as soon as a child process exits\nCMD [ \\\n    \"python\", \\\n    \"/app/python/seedsync.py\", \\\n    \"-c\", \"/config\", \\\n    \"--html\", \"/app/html\", \\\n    \"--scanfs\", \"/app/scanfs\" \\\n]\n\nEXPOSE 8800\n"
  },
  {
    "path": "src/docker/build/docker-image/Dockerfile.dockerignore",
    "content": "**/*.pyc\n**/__pycache__\n**/node_modules\n**/.venv\n.git\n.idea\nbuild\nsrc/angular/dist\nsrc/python/tests\nsrc/python/build\n"
  },
  {
    "path": "src/docker/build/docker-image/run_as_user",
    "content": "#!/bin/sh\n# run a command as (non-existent) user, using libnss-wrapper\n\nU=`id -u`\nG=`id -g`\n\nHOME_DIR=/home/seedsync\nPASSWD=/var/tmp/passwd\nGROUP=/var/tmp/group\n\nif [ ! -d \"$HOME_DIR\" ]; then\n  mkdir \"$HOME_DIR\"\nfi\nif [ ! -f \"$PASSWD\" ]; then\n  echo \"user::$U:$G::$HOME_DIR:\" > \"$PASSWD\"\nfi\nif [ ! -f \"$GROUP\" ]; then\n  echo \"user::$G:\" > \"$GROUP\"\nfi\n\nLD_PRELOAD=libnss_wrapper.so NSS_WRAPPER_PASSWD=\"$PASSWD\" NSS_WRAPPER_GROUP=\"$GROUP\" \"$@\"\n"
  },
  {
    "path": "src/docker/build/docker-image/scp",
    "content": "#!/bin/sh\nSCP=/usr/bin/scp\n/usr/local/bin/run_as_user \"$SCP\" \"$@\"\n"
  },
  {
    "path": "src/docker/build/docker-image/setup_default_config.sh",
    "content": "#!/bin/bash\n\n# exit on first error\nset -e\n\nCONFIG_DIR=\"/config\"\nSETTINGS_FILE=\"${CONFIG_DIR}/settings.cfg\"\nSCRIPT_PATH=\"/app/python/seedsync.py\"\n\nreplace_setting() {\n    NAME=$1\n    OLD_VALUE=$2\n    NEW_VALUE=$3\n\n    echo \"Replacing ${NAME} from ${OLD_VALUE} to ${NEW_VALUE}\"\n    sed -i \"s/${NAME} = ${OLD_VALUE}/${NAME} = ${NEW_VALUE}/\" ${SETTINGS_FILE} && \\\n        grep -q \"${NAME} = ${NEW_VALUE}\" ${SETTINGS_FILE}\n}\n\n# Generate default config\npython ${SCRIPT_PATH} \\\n    -c ${CONFIG_DIR} \\\n    --html / \\\n    --scanfs / \\\n    --exit > /dev/null 2>&1 > /dev/null || true\n\ncat ${SETTINGS_FILE}\n\n\n# Replace default values\nreplace_setting 'local_path' '<replace me>' '\\/downloads\\/'\n\necho\necho\necho \"Done configuring seedsync\"\ncat ${SETTINGS_FILE}\n"
  },
  {
    "path": "src/docker/build/docker-image/ssh",
    "content": "#!/bin/sh\nSSH=/usr/bin/ssh\n/usr/local/bin/run_as_user \"$SSH\" \"$@\"\n"
  },
  {
    "path": "src/docker/stage/deb/Dockerfile",
    "content": "ARG BASE_IMAGE=ubuntu:16.04\n\nFROM $BASE_IMAGE\n\n# Install dependencies\nRUN apt-get update && apt-get install -y \\\n    sudo \\\n    libssl-dev \\\n    libexpat1 \\\n    expect \\\n    lftp \\\n    openssh-client\n\n# Create non-root user\nRUN useradd --create-home -s /bin/bash user && \\\n    echo \"user:user\" | chpasswd && adduser user sudo\n\n# Create directory for downloaded files\nRUN mkdir /downloads && \\\n    chown user:user /downloads\n\nUSER user\n\n# Add ssh keys for user, as user\nADD --chown=user:user src/docker/stage/deb/id_rsa.pub /home/user/.ssh/\nADD --chown=user:user src/docker/stage/deb/id_rsa /home/user/.ssh/\nRUN chmod 600 /home/user/.ssh/id_rsa\n\nUSER root\n\n\n# Let user run sudo without password\nRUN echo \"user ALL=(ALL) NOPASSWD: ALL\" > /etc/sudoers\n\nWORKDIR /scripts\n\nADD src/docker/stage/deb/install_seedsync.sh /scripts/\nADD src/docker/stage/deb/expect_seedsync.exp /scripts/\nADD src/docker/stage/deb/entrypoint.sh /scripts/\n\nENTRYPOINT [\"/scripts/entrypoint.sh\"]\nCMD [\"/lib/systemd/systemd --log-target=journal 3>&1\"]\n\nEXPOSE 8800\n"
  },
  {
    "path": "src/docker/stage/deb/compose-ubu1604.yml",
    "content": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu1604\n    container_name: seedsync_stage_deb_ubu1604\n    build:\n      args:\n        - BASE_IMAGE=ubuntu-systemd:16.04\n"
  },
  {
    "path": "src/docker/stage/deb/compose-ubu1804.yml",
    "content": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu1804\n    container_name: seedsync_stage_deb_ubu1804\n    build:\n      args:\n        - BASE_IMAGE=ubuntu-systemd:18.04\n"
  },
  {
    "path": "src/docker/stage/deb/compose-ubu2004.yml",
    "content": "version: \"3.4\"\nservices:\n  myapp:\n    image: seedsync/stage/deb/ubu2004\n    container_name: seedsync_stage_deb_ubu2004\n    build:\n      args:\n        - BASE_IMAGE=ubuntu-systemd:20.04\n"
  },
  {
    "path": "src/docker/stage/deb/compose.yml",
    "content": "version: \"3.4\"\nservices:\n\n  myapp:\n    image: seedsync/stage/deb\n    container_name: seedsync_stage_deb\n    build:\n      context: ../../../..\n      dockerfile: src/docker/stage/deb/Dockerfile\n    tty: true\n    tmpfs:\n      - /run\n      - /run/lock\n    security_opt:\n      - seccomp:unconfined\n    volumes:\n      - type: bind\n        source: ${SEEDSYNC_DEB}\n        target: /install/seedsync.deb\n        read_only: true\n\n      - type: bind\n        source: /sys/fs/cgroup\n        target: /sys/fs/cgroup\n        read_only: true\n"
  },
  {
    "path": "src/docker/stage/deb/entrypoint.sh",
    "content": "#!/bin/bash\n\n# exit on first error\nset -e\n\necho \"Running entrypoint\"\n\necho \"Installing SeedSync\"\n./expect_seedsync.exp\n\necho \"Continuing docker CMD\"\necho \"$@\"\nexec $@\n"
  },
  {
    "path": "src/docker/stage/deb/expect_seedsync.exp",
    "content": "#!/usr/bin/expect\nset timeout 10\nspawn \"./install_seedsync.sh\"\n\nexpect {\n    timeout {error \"ERROR: missing user prompt\"; exit 1}\n    \"User for SeedSync service\"\n}\nsend \"user\\n\"\n\nexpect {\n    timeout {error \"ERROR: timeout\"; exit 1}\n    eof\n}\n"
  },
  {
    "path": "src/docker/stage/deb/id_rsa",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA4Pn1J1LJKi9/xE1XaZZuSzdfwPQykqbnevCx1iSq8cWA8rdu\nZcR9sY7dyMc6xQ8YQ08nZnRyvMfxdmvIDiymy7/ugxS7CwCoX9/CMLw11y9RyT6t\nhrtvdqSFoQDPydWlgmYyq28FYRFWpKgmWgo9xgE1LywVxOGvI7nxr2UPq/bM2T8C\ny4DIEcVe6jU1NR5okVg4UJeBl6ToAOQ5qjOSPgHtLQi1vqHtTi5BDkC1AkBv2FI1\nH007Z1O4kgQUhBd3WoeDFTbvQ+3FBfjRZRLgFXR7/QrCa6RenI9qnnWnp+oRzaqR\nNRk7VG1tC9/En3Kh91t3pVj3wXU9lygXhTs66wIDAQABAoIBABcoY53Knb5j6Ujx\nlR/fRjcj2g1olZQW7hjvkb6zQ41jgSR60ThUg4O1awrxxxDlvt+e1DVtoynfgvFn\nos4itoCenxSLG73EMZC83aZamUgvLMIEW6RUwuJ5iO/Lv5fNEB5eGrUe1nTpbfvA\n+0GlcDpjgW/7n7oGaRrKVyBwzK4spfYMLIuP8j6sLlUOyXi6gLjsOHA+W6GeDp7L\nGbK2cq80L2xA/wduaxh7QLacPlnpabJaIGCF+Wq7O6DddBg02bi7AZCtFRBs6eLI\nXCB4SAA7eT/qwoukX/apSXYwWGy5xKQPbZr8V4BkhCXvJDzE62YAV8cLezdyPdTL\nDOE3NxECgYEA+EexLMo0b+tNsBJJCk55qXZv1MSreda1JqT9aTLdaIhNVlw1ErBq\nngfsytvgmUYEN/g//NStUKTVtRkvzR6sluNVTLdSJskbKPtWBP0ipaM1AvlW4l7R\nPdAzvMFQswMjHYElxassEmj7iM+NFvpdZdW0z2rlw04cOvhs2k/fVF0CgYEA5/jE\nw0TAeUsvd4sl+xq1sTzfr1mSeg4irE2kw/NFQsTaDvGZJc8+HtFv8O1ZUSkn9/qk\nSypHf97G78+dN59d5rR+P/Eb5OJFWo3aKytu4drt+qtbvc4sxvkW/ORwEfmfXDVK\nq7jolmk0i9/oVyA4N4ruAjB1sxZRmYohQcCM1+cCgYAAllLR80x6c0kEwJZRouvg\nvbn3+9sX960IAV3kEM27QI9GRAOQHsCxzPz/YdO/KQ47f6fPFkWuqiUjP4MAbjEk\nTjdWbhyQoOsihq2mZ17cm201q5dMA8Nk7QgiSybAtaIwoKyRMh1xkbP+l9cSldcA\ntaeu0ebnNlkUvp+rSIMTtQKBgFal9dl6tOqZywE8WNOTBotN0cAOFUjCPvFdj04i\ncJygK1OpqysUXn/ke4vjHJnUZbmbRgNNp6d775NkWbWNMeYbRY1c4q58VquckQHP\nF3wF6x7XI02i1db89DlCmxobxAsNXPcH+tk0MwyMdp0Uy+rzWjQ3Jb/fdluD3ShS\nZEnBAoGBAMmwVdUc2r+93TpJUYtD+NKZ8uAF7BiPdEQzCS8VDk73xGT5hnE5GLcW\nvtBqwnLOCaRYEi0GvWk5LizfxClrtzhRsiD2n9dJYWVHxc7YDuD9Soe8w3/VELLf\nABAiTRuLbr5dweLwjY8KDsVmZ8yWOz8ejrAlGtT8Gnqf/2Uo6UNN\n-----END RSA PRIVATE KEY-----"
  },
  {
    "path": "src/docker/stage/deb/id_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDg+fUnUskqL3/ETVdplm5LN1/A9DKSpud68LHWJKrxxYDyt25lxH2xjt3IxzrFDxhDTydmdHK8x/F2a8gOLKbLv+6DFLsLAKhf38IwvDXXL1HJPq2Gu292pIWhAM/J1aWCZjKrbwVhEVakqCZaCj3GATUvLBXE4a8jufGvZQ+r9szZPwLLgMgRxV7qNTU1HmiRWDhQl4GXpOgA5DmqM5I+Ae0tCLW+oe1OLkEOQLUCQG/YUjUfTTtnU7iSBBSEF3dah4MVNu9D7cUF+NFlEuAVdHv9CsJrpF6cj2qedaen6hHNqpE1GTtUbW0L38SfcqH3W3elWPfBdT2XKBeFOzrr user@572e13b2bdf3"
  },
  {
    "path": "src/docker/stage/deb/install_seedsync.sh",
    "content": "#!/bin/bash\ndpkg -i /install/seedsync.deb\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd/Dockerfile",
    "content": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubuntu-systemd/\n\nFROM ubuntu:16.04\n\nENV container docker\n\n# Don't start any optional services except for the few we need.\nRUN find /etc/systemd/system \\\n         /lib/systemd/system \\\n         -path '*.wants/*' \\\n         -not -name '*journald*' \\\n         -not -name '*systemd-tmpfiles*' \\\n         -not -name '*systemd-user-sessions*' \\\n         -exec rm \\{} \\;\n\nRUN systemctl set-default multi-user.target\n\nCOPY setup /sbin/\n\nSTOPSIGNAL SIGRTMIN+3\n\n# Workaround for docker/docker#27202, technique based on comments from docker/docker#9212\nCMD [\"/bin/bash\", \"-c\", \"exec /sbin/init --log-target=journal 3>&1\"]\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-16.04-systemd/setup",
    "content": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n  echo 'The systemd cgroup hierarchy is already mounted at /sys/fs/cgroup/systemd.'\nelse\n  if [ -d /host/sys/fs/cgroup/systemd ]; then\n    echo 'The mount point for the systemd cgroup hierarchy already exists at /sys/fs/cgroup/systemd.'\n  else\n    echo 'Creating the mount point for the systemd cgroup hierarchy at /sys/fs/cgroup/systemd.'\n    mkdir -p /host/sys/fs/cgroup/systemd\n  fi\n\n  echo 'Mounting the systemd cgroup hierarchy.'\n  nsenter --mount=/host/proc/1/ns/mnt -- mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd\nfi\necho 'Your Docker host is now configured for running systemd containers!'\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd/Dockerfile",
    "content": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubuntu-systemd/\nFROM ubuntu:18.04\n\nRUN apt-get update && apt-get install -y systemd\n\nENV container docker\n\n# Don't start any optional services except for the few we need.\nRUN find /etc/systemd/system \\\n         /lib/systemd/system \\\n         -path '*.wants/*' \\\n         -not -name '*journald*' \\\n         -not -name '*systemd-tmpfiles*' \\\n         -not -name '*systemd-user-sessions*' \\\n         -exec rm \\{} \\;\n\nRUN systemctl set-default multi-user.target\n\nCOPY setup /sbin/\n\nSTOPSIGNAL SIGRTMIN+3\n\n# Workaround for docker/docker#27202, technique based on comments from docker/docker#9212\nCMD [\"/bin/bash\", \"-c\", \"exec /sbin/init --log-target=journal 3>&1\"]\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-18.04-systemd/setup",
    "content": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n  echo 'The systemd cgroup hierarchy is already mounted at /sys/fs/cgroup/systemd.'\nelse\n  if [ -d /host/sys/fs/cgroup/systemd ]; then\n    echo 'The mount point for the systemd cgroup hierarchy already exists at /sys/fs/cgroup/systemd.'\n  else\n    echo 'Creating the mount point for the systemd cgroup hierarchy at /sys/fs/cgroup/systemd.'\n    mkdir -p /host/sys/fs/cgroup/systemd\n  fi\n\n  echo 'Mounting the systemd cgroup hierarchy.'\n  nsenter --mount=/host/proc/1/ns/mnt -- mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd\nfi\necho 'Your Docker host is now configured for running systemd containers!'\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd/Dockerfile",
    "content": "# Copied from:\n# https://github.com/solita/docker-systemd/blob/master/Dockerfile\n# https://hub.docker.com/r/solita/ubuntu-systemd/\nFROM ubuntu:20.04\n\nRUN apt-get update && apt-get install -y systemd\n\nENV container docker\n\n# Don't start any optional services except for the few we need.\nRUN find /etc/systemd/system \\\n         /lib/systemd/system \\\n         -path '*.wants/*' \\\n         -not -name '*journald*' \\\n         -not -name '*systemd-tmpfiles*' \\\n         -not -name '*systemd-user-sessions*' \\\n         -exec rm \\{} \\;\n\nRUN systemctl set-default multi-user.target\n\nCOPY setup /sbin/\n\nSTOPSIGNAL SIGRTMIN+3\n\n# Workaround for docker/docker#27202, technique based on comments from docker/docker#9212\nCMD [\"/bin/bash\", \"-c\", \"exec /lib/systemd/systemd --log-target=journal 3>&1\"]\n"
  },
  {
    "path": "src/docker/stage/deb/ubuntu-systemd/ubuntu-20.04-systemd/setup",
    "content": "#!/bin/sh\nset -eu\n\nif nsenter --mount=/host/proc/1/ns/mnt -- mount | grep /sys/fs/cgroup/systemd >/dev/null 2>&1; then\n  echo 'The systemd cgroup hierarchy is already mounted at /sys/fs/cgroup/systemd.'\nelse\n  if [ -d /host/sys/fs/cgroup/systemd ]; then\n    echo 'The mount point for the systemd cgroup hierarchy already exists at /sys/fs/cgroup/systemd.'\n  else\n    echo 'Creating the mount point for the systemd cgroup hierarchy at /sys/fs/cgroup/systemd.'\n    mkdir -p /host/sys/fs/cgroup/systemd\n  fi\n\n  echo 'Mounting the systemd cgroup hierarchy.'\n  nsenter --mount=/host/proc/1/ns/mnt -- mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd\nfi\necho 'Your Docker host is now configured for running systemd containers!'\n"
  },
  {
    "path": "src/docker/stage/docker-image/compose.yml",
    "content": "version: \"3.4\"\nservices:\n  myapp:\n    image: ${STAGING_REGISTRY}/seedsync:${STAGING_VERSION}\n    container_name: seedsync_test_e2e_myapp\n"
  },
  {
    "path": "src/docker/test/angular/Dockerfile",
    "content": "FROM seedsync/build/angular/env as seedsync_test_angular\n\nRUN apt-get update\nRUN wget -nv -O /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \\\n    dpkg -i /tmp/chrome.deb; apt-get -fy install > /dev/null\n\nCOPY \\\n    src/angular/tsconfig.json \\\n    src/angular/tslint.json \\\n    src/angular/karma.conf.js \\\n    src/angular/.angular-cli.json \\\n    /app/\n\nRUN ls -l /app/\n\n# ng src needs to be mounted on /app/src\nWORKDIR /app/src\n\nCMD [\"/app/node_modules/@angular/cli/bin/ng\", \"test\", \\\n     \"--browsers\", \"ChromeHeadless\", \\\n     \"--single-run\"]\n"
  },
  {
    "path": "src/docker/test/angular/compose.yml",
    "content": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/angular\n    container_name: seedsync_test_angular\n    tty: true\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/angular/Dockerfile\n      target: seedsync_test_angular\n    volumes:\n      - type: bind\n        source: ../../../angular/src\n        target: /app/src\n        read_only: true\n"
  },
  {
    "path": "src/docker/test/e2e/Dockerfile",
    "content": "# Creates environment for e2e tests\nFROM node:12.16 as seedsync_test_e2e_env\n\nCOPY src/e2e/package*.json /app/\nWORKDIR /app\nRUN npm install\n\n\n# Builds and runs e2e tests\nFROM seedsync_test_e2e_env as seedsync_test_e2e\n\nCOPY \\\n    src/e2e/conf.ts \\\n    src/e2e/tsconfig.json \\\n    /app/\nCOPY src/e2e/tests /app/tests\nCOPY \\\n    src/docker/test/e2e/urls.ts \\\n    src/docker/test/e2e/run_tests.sh \\\n    src/docker/test/e2e/parse_seedsync_status.py \\\n    /app/\n\nWORKDIR /app\n\nRUN node_modules/typescript/bin/tsc --outDir ./tmp\n\nCMD [\"/app/run_tests.sh\"]\n"
  },
  {
    "path": "src/docker/test/e2e/chrome/Dockerfile",
    "content": "FROM yukinying/chrome-headless-browser-selenium:latest\n\nUSER root\nRUN apt-get update && apt-get install -y libxi6 libgconf-2-4\nUSER headless\n"
  },
  {
    "path": "src/docker/test/e2e/compose-dev.yml",
    "content": "version: \"3.4\"\nservices:\n  tests:\n    command: /bin/true\n\n  myapp:\n    ports:\n      - target: 8800\n        published: 8800\n        protocol: tcp\n        mode: host\n\n  chrome:\n    ports:\n      - target: 4444\n        published: 4444\n        protocol: tcp\n        mode: host\n"
  },
  {
    "path": "src/docker/test/e2e/compose.yml",
    "content": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/e2e\n    container_name: seedsync_test_e2e\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/e2e/Dockerfile\n      target: seedsync_test_e2e\n    depends_on:\n      - chrome\n      - remote\n\n  chrome:\n    image: seedsync/test/e2e/chrome\n    container_name: seedsync_test_e2e_chrome\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/e2e/chrome/Dockerfile\n    shm_size: 1024M\n    cap_add:\n     - SYS_ADMIN\n\n  remote:\n    image: seedsync/test/e2e/remote\n    container_name: seedsync_test_e2e_remote\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/e2e/remote/Dockerfile\n\n  configure:\n    image: seedsync/test/e2e/configure\n    container_name: seedsync_test_e2e_configure\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/e2e/configure/Dockerfile\n    depends_on:\n      - myapp\n"
  },
  {
    "path": "src/docker/test/e2e/configure/Dockerfile",
    "content": "FROM alpine:3.11.6\n\nRUN apk add --no-cache curl bash\n\nWORKDIR /\nADD src/docker/wait-for-it.sh /\nADD src/docker/test/e2e/configure/setup_seedsync.sh /\nCMD [\"/setup_seedsync.sh\"]\n"
  },
  {
    "path": "src/docker/test/e2e/configure/setup_seedsync.sh",
    "content": "#!/bin/bash\n\n./wait-for-it.sh myapp:8800 -- echo \"Seedsync app is up (before configuring)\"\ncurl -sS \"http://myapp:8800/server/config/set/general/debug/true\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/general/verbose/true\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/local_path/%252Fdownloads\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/remote_address/remote\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/remote_username/remoteuser\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/remote_password/remotepass\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/remote_port/1234\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/lftp/remote_path/%252Fhome%252Fremoteuser%252Ffiles\"; echo\ncurl -sS \"http://myapp:8800/server/config/set/autoqueue/patterns_only/true\"; echo\n\ncurl -sS \"http://myapp:8800/server/command/restart\"; echo\n\n./wait-for-it.sh myapp:8800 -- echo \"Seedsync app is up (after configuring)\"\n\necho\necho \"Done configuring SeedSync app\"\n"
  },
  {
    "path": "src/docker/test/e2e/parse_seedsync_status.py",
    "content": "import sys\nimport json\ntry:\n    print(json.load(sys.stdin)['server']['up'])\nexcept:\n    print('False')\n"
  },
  {
    "path": "src/docker/test/e2e/remote/Dockerfile",
    "content": "FROM ubuntu:18.04\n\n# Install dependencies\nRUN apt-get update && apt-get install -y \\\n    python3.7\n\n# Switch to Python 3.7\nRUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1\nRUN update-alternatives --set python /usr/bin/python3.7\n\n# Create non-root user\nRUN useradd --create-home -s /bin/bash remoteuser && \\\n    echo \"remoteuser:remotepass\" | chpasswd\n\n\n# Add install image's user's key to authorized\nUSER remoteuser\nADD --chown=remoteuser:remoteuser src/docker/test/e2e/remote/id_rsa.pub /home/remoteuser/user_id_rsa.pub\nRUN  mkdir -p /home/remoteuser/.ssh && \\\n    cat /home/remoteuser/user_id_rsa.pub >> /home/remoteuser/.ssh/authorized_keys\nUSER root\n\n# Copy over data\nADD --chown=remoteuser:remoteuser src/docker/test/e2e/remote/files /home/remoteuser/files\n\n# Install and run ssh server\nRUN apt-get update && apt-get install -y openssh-server\n\n# Change port\nRUN sed -i '/Port 22/c\\Port 1234' /etc/ssh/sshd_config\nEXPOSE 1234\n\nRUN mkdir /var/run/sshd\n\nCMD [\"/usr/sbin/sshd\", \"-D\"]\n"
  },
  {
    "path": "src/docker/test/e2e/remote/id_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDg+fUnUskqL3/ETVdplm5LN1/A9DKSpud68LHWJKrxxYDyt25lxH2xjt3IxzrFDxhDTydmdHK8x/F2a8gOLKbLv+6DFLsLAKhf38IwvDXXL1HJPq2Gu292pIWhAM/J1aWCZjKrbwVhEVakqCZaCj3GATUvLBXE4a8jufGvZQ+r9szZPwLLgMgRxV7qNTU1HmiRWDhQl4GXpOgA5DmqM5I+Ae0tCLW+oe1OLkEOQLUCQG/YUjUfTTtnU7iSBBSEF3dah4MVNu9D7cUF+NFlEuAVdHv9CsJrpF6cj2qedaen6hHNqpE1GTtUbW0L38SfcqH3W3elWPfBdT2XKBeFOzrr user@572e13b2bdf3"
  },
  {
    "path": "src/docker/test/e2e/run_tests.sh",
    "content": "#!/bin/bash\n\nred=`tput setaf 1`\ngreen=`tput setaf 2`\nreset=`tput sgr0`\n\nEND=$((SECONDS+10))\nwhile [ ${SECONDS} -lt ${END} ];\ndo\n  SERVER_UP=$(\n      curl -s myapp:8800/server/status | \\\n        python ./parse_seedsync_status.py\n  )\n  if [[ \"${SERVER_UP}\" == 'True' ]]; then\n    break\n  fi\n  echo \"E2E Test is waiting for Seedsync server to come up...\"\n  sleep 1\ndone\n\n\nif [[ \"${SERVER_UP}\" == 'True' ]]; then\n  echo \"${green}E2E Test detected that Seedsync server is UP${reset}\"\n  node_modules/protractor/bin/protractor tmp/conf.js\nelse\n  echo \"${red}E2E Test failed to detect Seedsync server${reset}\"\n  exit 1\nfi\n"
  },
  {
    "path": "src/docker/test/e2e/urls.ts",
    "content": "export class Urls {\n    static readonly APP_BASE_URL = \"http://myapp:8800/\";\n    static readonly SELENIUM_ADDRESS = \"http://chrome:4444/wd/hub\";\n}"
  },
  {
    "path": "src/docker/test/python/Dockerfile",
    "content": "FROM seedsync/run/python/devenv as seedsync_test_python\n\nRUN ls -l /app/python\n\n# Install dependencies\nRUN apt-get install -y software-properties-common && \\\n    apt-add-repository non-free && \\\n    apt-get update && \\\n    apt-get install -y \\\n        openssh-server \\\n        rar\n\nADD src/docker/test/python/entrypoint.sh /app/\n\n# setup sshd\nRUN mkdir /var/run/sshd\nRUN ssh-keygen -t rsa -N \"\" -f /root/.ssh/id_rsa && \\\n    cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys\n# Disable the known hosts prompt\nRUN echo \"StrictHostKeyChecking no\\nUserKnownHostsFile /dev/null\\nLogLevel=quiet\" > /root/.ssh/config\n\n# create the seedsynctest user, add root's public key to seedsynctest\nRUN useradd --create-home -s /bin/bash seedsynctest && \\\n    echo \"seedsynctest:seedsyncpass\" | chpasswd\nRUN usermod -a -G root seedsynctest\nRUN cp /root/.ssh/id_rsa.pub /home/seedsynctest/ && \\\n    chown seedsynctest:seedsynctest /home/seedsynctest/id_rsa.pub\nUSER seedsynctest\nRUN  mkdir -p /home/seedsynctest/.ssh && \\\n    cat /home/seedsynctest/id_rsa.pub >> /home/seedsynctest/.ssh/authorized_keys\nUSER root\n\nEXPOSE 22\n\n# src needs to be mounted on /src/\nWORKDIR /src/\nENV PYTHONPATH=/src\n\nENTRYPOINT [\"/app/entrypoint.sh\"]\nCMD [\"pytest\", \"-v\"]\n"
  },
  {
    "path": "src/docker/test/python/compose.yml",
    "content": "version: \"3.4\"\nservices:\n  tests:\n    image: seedsync/test/python\n    container_name: seedsync_test_python\n    build:\n      context: ../../../../\n      dockerfile: src/docker/test/python/Dockerfile\n      target: seedsync_test_python\n    volumes:\n      - type: bind\n        source: ../../../python\n        target: /src\n        read_only: true\n"
  },
  {
    "path": "src/docker/test/python/entrypoint.sh",
    "content": "#!/bin/bash\n\n# exit on first error\nset -e\n\necho \"Running sshd\"\n/usr/sbin/sshd -D &\n\necho \"Continuing entrypoint\"\necho \"$@\"\nexec $@\n"
  },
  {
    "path": "src/docker/wait-for-it.sh",
    "content": "#!/usr/bin/env bash\n# Use this script to test if a given TCP host/port are available\n\nWAITFORIT_cmdname=${0##*/}\n\nechoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo \"$@\" 1>&2; fi }\n\nusage()\n{\n    cat << USAGE >&2\nUsage:\n    $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]\n    -h HOST | --host=HOST       Host or IP under test\n    -p PORT | --port=PORT       TCP port under test\n                                Alternatively, you specify the host and port as host:port\n    -s | --strict               Only execute subcommand if the test succeeds\n    -q | --quiet                Don't output any status messages\n    -t TIMEOUT | --timeout=TIMEOUT\n                                Timeout in seconds, zero for no timeout\n    -- COMMAND ARGS             Execute command with args after the test finishes\nUSAGE\n    exit 1\n}\n\nwait_for()\n{\n    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then\n        echoerr \"$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT\"\n    else\n        echoerr \"$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout\"\n    fi\n    WAITFORIT_start_ts=$(date +%s)\n    while :\n    do\n        if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then\n            nc -z $WAITFORIT_HOST $WAITFORIT_PORT\n            WAITFORIT_result=$?\n        else\n            (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1\n            WAITFORIT_result=$?\n        fi\n        if [[ $WAITFORIT_result -eq 0 ]]; then\n            WAITFORIT_end_ts=$(date +%s)\n            echoerr \"$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds\"\n            break\n        fi\n        sleep 1\n    done\n    return $WAITFORIT_result\n}\n\nwait_for_wrapper()\n{\n    # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692\n    if [[ $WAITFORIT_QUIET -eq 1 ]]; then\n        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &\n    else\n        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &\n    fi\n    WAITFORIT_PID=$!\n    trap \"kill -INT -$WAITFORIT_PID\" INT\n    wait $WAITFORIT_PID\n    WAITFORIT_RESULT=$?\n    if [[ $WAITFORIT_RESULT -ne 0 ]]; then\n        echoerr \"$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT\"\n    fi\n    return $WAITFORIT_RESULT\n}\n\n# process arguments\nwhile [[ $# -gt 0 ]]\ndo\n    case \"$1\" in\n        *:* )\n        WAITFORIT_hostport=(${1//:/ })\n        WAITFORIT_HOST=${WAITFORIT_hostport[0]}\n        WAITFORIT_PORT=${WAITFORIT_hostport[1]}\n        shift 1\n        ;;\n        --child)\n        WAITFORIT_CHILD=1\n        shift 1\n        ;;\n        -q | --quiet)\n        WAITFORIT_QUIET=1\n        shift 1\n        ;;\n        -s | --strict)\n        WAITFORIT_STRICT=1\n        shift 1\n        ;;\n        -h)\n        WAITFORIT_HOST=\"$2\"\n        if [[ $WAITFORIT_HOST == \"\" ]]; then break; fi\n        shift 2\n        ;;\n        --host=*)\n        WAITFORIT_HOST=\"${1#*=}\"\n        shift 1\n        ;;\n        -p)\n        WAITFORIT_PORT=\"$2\"\n        if [[ $WAITFORIT_PORT == \"\" ]]; then break; fi\n        shift 2\n        ;;\n        --port=*)\n        WAITFORIT_PORT=\"${1#*=}\"\n        shift 1\n        ;;\n        -t)\n        WAITFORIT_TIMEOUT=\"$2\"\n        if [[ $WAITFORIT_TIMEOUT == \"\" ]]; then break; fi\n        shift 2\n        ;;\n        --timeout=*)\n        WAITFORIT_TIMEOUT=\"${1#*=}\"\n        shift 1\n        ;;\n        --)\n        shift\n        WAITFORIT_CLI=(\"$@\")\n        break\n        ;;\n        --help)\n        usage\n        ;;\n        *)\n        echoerr \"Unknown argument: $1\"\n        usage\n        ;;\n    esac\ndone\n\nif [[ \"$WAITFORIT_HOST\" == \"\" || \"$WAITFORIT_PORT\" == \"\" ]]; then\n    echoerr \"Error: you need to provide a host and port to test.\"\n    usage\nfi\n\nWAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}\nWAITFORIT_STRICT=${WAITFORIT_STRICT:-0}\nWAITFORIT_CHILD=${WAITFORIT_CHILD:-0}\nWAITFORIT_QUIET=${WAITFORIT_QUIET:-0}\n\n# Check to see if timeout is from busybox?\nWAITFORIT_TIMEOUT_PATH=$(type -p timeout)\nWAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)\n\nWAITFORIT_BUSYTIMEFLAG=\"\"\nif [[ $WAITFORIT_TIMEOUT_PATH =~ \"busybox\" ]]; then\n    WAITFORIT_ISBUSY=1\n    # Check if busybox timeout uses -t flag\n    # (recent Alpine versions don't support -t anymore)\n    if timeout &>/dev/stdout | grep -q -e '-t '; then\n        WAITFORIT_BUSYTIMEFLAG=\"-t\"\n    fi\nelse\n    WAITFORIT_ISBUSY=0\nfi\n\nif [[ $WAITFORIT_CHILD -gt 0 ]]; then\n    wait_for\n    WAITFORIT_RESULT=$?\n    exit $WAITFORIT_RESULT\nelse\n    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then\n        wait_for_wrapper\n        WAITFORIT_RESULT=$?\n    else\n        wait_for\n        WAITFORIT_RESULT=$?\n    fi\nfi\n\nif [[ $WAITFORIT_CLI != \"\" ]]; then\n    if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then\n        echoerr \"$WAITFORIT_cmdname: strict mode, refusing to execute subprocess\"\n        exit $WAITFORIT_RESULT\n    fi\n    exec \"${WAITFORIT_CLI[@]}\"\nelse\n    exit $WAITFORIT_RESULT\nfi\n"
  },
  {
    "path": "src/e2e/.gitignore",
    "content": "*.js\nnode_modules\ntmp/\n"
  },
  {
    "path": "src/e2e/README.md",
    "content": "### To run e2e tests in dev mode:\n\n1. Install dependencies\n\n   ```bash\n   cd src/e2e\n   npm install\n   ```\n   \n2. Choose which dev image to run: deb install or docker image\n\n    - deb install\n\n        ```bash\n        make run-tests-e2e SEEDSYNC_VERSION=latest SEEDSYNC_ARCH=<arch code> DEV=1\n        ```\n\n    - docker image\n\n        ```bash\n        make run-tests-e2e SEEDSYNC_DEB=`readlink -f build/*.deb` SEEDSYNC_OS=<os code> DEV=1\n        ```\n\n        \n\n3. Compile and run the tests\n\n    ```bash\n    cd src/e2e/\n    rm -rf tmp && \\\n        ./node_modules/typescript/bin/tsc && \\\n        ./node_modules/protractor/bin/protractor tmp/conf.js\n    ```\n\n\n\n### About\n\nThe dev end-to-end tests use the following docker images:\n1. myapp: Installs and runs the seedsync deb package\n2. chrome: Runs the selenium server\n3. remote: Runs a remote SSH server\n\nThe automated e2e tests additionally have:\n4. tests: Runs the e2e tests\n\nNotes:\n1. In dev mode, the app is visible at [http://localhost:8800](http://localhost:8800)\nHowever the url used in test is still [http://myapp:8800](http://myapp:8800) as\nthat's how the selenium server accesses it.\n\n2. The app requires a fully configured settings.cfg.\n   This is done automatically in during the start of the docker image that runs the app.\n\n"
  },
  {
    "path": "src/e2e/conf.ts",
    "content": "// Because this file imports from  protractor, you'll need to have it as a\n// project dependency. Please see the reference config: lib/config.ts for more\n// information.\n//\n// Why you might want to create your config with typescript:\n// Editors like Microsoft Visual Studio Code will have autocomplete and\n// description hints.\n//\n// To run this example, first transpile it to javascript with `npm run tsc`,\n// then run `protractor conf.js`.\nimport {Config} from 'protractor';\n\nimport {Urls} from \"./urls\";\n\nlet SpecReporter = require('jasmine-spec-reporter').SpecReporter;\n\nexport let config: Config = {\n    framework: 'jasmine',\n    capabilities: {\n        browserName: 'chrome',\n        chromeOptions: { args: [\n                '--headless',\n                '--disable-gpu',\n                '--no-sandbox',\n                '--disable-extensions',\n                '--disable-dev-shm-usage'\n            ] },\n    },\n    specs: ['tests/**/*.spec.js'],\n    seleniumAddress: Urls.SELENIUM_ADDRESS,\n\n    // You could set no globals to true to avoid jQuery '$' and protractor '$'\n    // collisions on the global namespace.\n    noGlobals: true,\n\n    allScriptsTimeout: 5000,\n\n    // Options to be passed to Jasmine-node.\n    jasmineNodeOpts: {\n        showColors: true,\n        defaultTimeoutInterval: 3000,\n        print: function() {}\n    },\n\n    onPrepare: function () {\n        jasmine.getEnv().addReporter(new SpecReporter({\n            spec: {\n                displayStacktrace: true\n            }\n        }));\n    }\n};\n"
  },
  {
    "path": "src/e2e/package.json",
    "content": "{\n  \"name\": \"e2e\",\n  \"version\": \"1.0.0\",\n  \"description\": \"end to end tests\",\n  \"author\": \"\",\n  \"dependencies\": {\n    \"@types/jasminewd2\": \"^2.0.6\",\n    \"@types/node\": \"^14.0.1\",\n    \"jasmine\": \"^3.3.1\",\n    \"jasmine-spec-reporter\": \"^5.0.2\",\n    \"protractor\": \"^7.0.0\",\n    \"typescript\": \"^3.9.2\"\n  },\n  \"devDependencies\": {\n    \"@types/jasmine\": \"^3.5.10\",\n    \"@types/jasminewd2\": \"^2.0.6\",\n    \"ts-node\": \"^8.10.1\"\n  }\n}\n"
  },
  {
    "path": "src/e2e/tests/about.page.spec.ts",
    "content": "import {AboutPage} from \"./about.page\";\n\ndescribe('Testing about page', () => {\n    let page: AboutPage;\n\n    beforeEach(() => {\n        page = new AboutPage();\n        page.navigateTo();\n    });\n\n    it('should have right top title', () => {\n        expect(page.getTopTitle()).toEqual(\"About\");\n    });\n\n    it('should have the right version', () => {\n        expect(page.getVersion()).toEqual(\"v0.8.6\");\n    });\n});"
  },
  {
    "path": "src/e2e/tests/about.page.ts",
    "content": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Promise;\n\nimport {Urls} from \"../urls\";\nimport {App} from \"./app\";\n\nexport class AboutPage extends App {\n    navigateTo() {\n        return browser.get(Urls.APP_BASE_URL + \"about\");\n    }\n\n    getVersion(): Promise<string> {\n        return element(by.css(\"#version\")).getText();\n    }\n}"
  },
  {
    "path": "src/e2e/tests/app.spec.ts",
    "content": "import {App} from \"./app\";\n\ndescribe('Testing top-level app', () => {\n    let app: App;\n\n    beforeEach(() => {\n        app = new App();\n        app.navigateTo();\n    });\n\n    it('should have right title', () => {\n        expect(app.getTitle()).toEqual(\"SeedSync\");\n    });\n\n    it('should have all the sidebar items', () => {\n        expect(app.getSidebarItems()).toEqual(\n            [\n                \"Dashboard\",\n                \"Settings\",\n                \"AutoQueue\",\n                \"Logs\",\n                \"About\",\n                \"Restart\"\n            ]\n        );\n    });\n\n    it('should default to the dashboard page', () => {\n        expect(app.getTopTitle()).toEqual(\"Dashboard\");\n    });\n});"
  },
  {
    "path": "src/e2e/tests/app.ts",
    "content": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Promise;\n\nimport {Urls} from \"../urls\";\n\nexport class App {\n    navigateTo() {\n        return browser.get(Urls.APP_BASE_URL);\n    }\n\n    getTitle(): Promise<string> {\n        return browser.getTitle();\n    }\n\n    getSidebarItems(): Promise<Array<string>> {\n        return element.all(by.css(\"#sidebar a span.text\")).map(function (elm) {\n            return browser.executeScript(\"return arguments[0].innerHTML;\", elm);\n        });\n    }\n\n    getTopTitle(): Promise<string> {\n        return browser.executeScript(\"return arguments[0].innerHTML;\", element(by.css(\"#title\")));\n    }\n}"
  },
  {
    "path": "src/e2e/tests/autoqueue.page.spec.ts",
    "content": "import {AutoQueuePage} from \"./autoqueue.page\";\n\ndescribe('Testing autoqueue page', () => {\n    let page: AutoQueuePage;\n\n    beforeEach(() => {\n        page = new AutoQueuePage();\n        page.navigateTo();\n    });\n\n    it('should have right top title', () => {\n        expect(page.getTopTitle()).toEqual(\"AutoQueue\");\n    });\n\n\n    it('should add and remove patterns', () => {\n        // start with an empty list\n        expect(page.getPatterns()).toEqual([]);\n\n        // add some patterns, and expect them in added order\n        page.addPattern(\"APattern\");\n        page.addPattern(\"CPattern\");\n        page.addPattern(\"DPattern\");\n        page.addPattern(\"BPattern\");\n        expect(page.getPatterns()).toEqual([\n            \"APattern\", \"CPattern\", \"DPattern\", \"BPattern\"\n        ]);\n\n        // remove patterns one by one\n        page.removePattern(2);\n        expect(page.getPatterns()).toEqual([\n            \"APattern\", \"CPattern\", \"BPattern\"\n        ]);\n        page.removePattern(0);\n        expect(page.getPatterns()).toEqual([\n            \"CPattern\", \"BPattern\"\n        ]);\n        page.removePattern(1);\n        expect(page.getPatterns()).toEqual([\n            \"CPattern\"\n        ]);\n        page.removePattern(0);\n        expect(page.getPatterns()).toEqual([]);\n    });\n\n    it('should list existing patterns in alphabetical order', () => {\n        // start with an empty list\n        expect(page.getPatterns()).toEqual([]);\n\n        // add some patterns, and expect them in added order\n        page.addPattern(\"APattern\");\n        page.addPattern(\"CPattern\");\n        page.addPattern(\"DPattern\");\n        page.addPattern(\"BPattern\");\n\n        // reload the page\n        page.navigateTo();\n\n        // patterns should be in alphabetical order\n        expect(page.getPatterns()).toEqual([\n            \"APattern\", \"BPattern\", \"CPattern\", \"DPattern\"\n        ]);\n\n        // remove all patterns\n        page.removePattern(0);\n        page.removePattern(0);\n        page.removePattern(0);\n        page.removePattern(0);\n        expect(page.getPatterns()).toEqual([]);\n    });\n});"
  },
  {
    "path": "src/e2e/tests/autoqueue.page.ts",
    "content": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Promise;\n\nimport {Urls} from \"../urls\";\nimport {App} from \"./app\";\n\nexport class AutoQueuePage extends App {\n    navigateTo() {\n        return browser.get(Urls.APP_BASE_URL + \"autoqueue\");\n    }\n\n    getPatterns(): Promise<Array<string>> {\n        return element.all(by.css(\"#autoqueue .pattern span.text\")).map(function (elm) {\n            return browser.executeScript(\"return arguments[0].innerHTML;\", elm);\n        });\n    }\n\n    addPattern(pattern: string) {\n        let input = element(by.css(\"#add-pattern input\"));\n        input.sendKeys(pattern);\n        let button = element(by.css(\"#add-pattern .button\"));\n        button.click();\n    }\n\n    removePattern(index: number) {\n        let button = element.all(by.css(\"#autoqueue .pattern\")).get(index).element(by.css(\".button\"));\n        button.click();\n    }\n}"
  },
  {
    "path": "src/e2e/tests/dashboard.page.spec.ts",
    "content": "import {DashboardPage, File, FileActionButtonState} from \"./dashboard.page\";\n\ndescribe('Testing dashboard page', () => {\n    let page: DashboardPage;\n\n    beforeEach(async () => {\n        page = new DashboardPage();\n        await page.navigateTo();\n    });\n\n    it('should have right top title', () => {\n        expect(page.getTopTitle()).toEqual(\"Dashboard\");\n    });\n\n    it('should have a list of files', () => {\n        let golden = [\n                new File(\"áßç déÀ.mp4\", '', \"0 B of 840 KB\"),\n                new File(\"clients.jpg\", '', \"0 B of 36.5 KB\"),\n                new File(\"crispycat\", '', \"0 B of 1.53 MB\"),\n                new File(\"documentation.png\", '', \"0 B of 8.88 KB\"),\n                new File(\"goose\", '', \"0 B of 2.78 MB\"),\n                new File(\"illusion.jpg\", '', \"0 B of 81.5 KB\"),\n                new File(\"joke\", '', \"0 B of 168 KB\"),\n                new File(\"testing.gif\", '', \"0 B of 8.95 MB\"),\n                new File(\"üæÒ\", '', \"0 B of 70.8 KB\"),\n            ];\n        expect(page.getFiles()).toEqual(golden);\n    });\n\n    it('should show and hide action buttons on select', () => {\n        expect(page.isFileActionsVisible(1)).toBe(false);\n        page.selectFile(1);\n        expect(page.isFileActionsVisible(1)).toBe(true);\n        page.selectFile(1);\n        expect(page.isFileActionsVisible(1)).toBe(false);\n    });\n\n    it('should show action buttons for most recent file selected', () => {\n        expect(page.isFileActionsVisible(1)).toBe(false);\n        expect(page.isFileActionsVisible(2)).toBe(false);\n        page.selectFile(1);\n        expect(page.isFileActionsVisible(1)).toBe(true);\n        expect(page.isFileActionsVisible(2)).toBe(false);\n        page.selectFile(2);\n        expect(page.isFileActionsVisible(1)).toBe(false);\n        expect(page.isFileActionsVisible(2)).toBe(true);\n        page.selectFile(2);\n        expect(page.isFileActionsVisible(1)).toBe(false);\n        expect(page.isFileActionsVisible(2)).toBe(false);\n    });\n\n    it('should have all the action buttons', async () => {\n        await page.getFileActions(1).then(states => {\n            expect(states.length).toBe(5);\n            expect(states[0].title).toBe(\"Queue\");\n            expect(states[1].title).toBe(\"Stop\");\n            expect(states[2].title).toBe(\"Extract\");\n            expect(states[3].title).toBe(\"Delete Local\");\n            expect(states[4].title).toBe(\"Delete Remote\");\n        });\n    });\n\n    it('should have Queue action enabled for Default state', async () => {\n        await page.getFiles().then(files => {\n            expect(files[1].status).toEqual(\"\");\n        });\n        await page.getFileActions(1).then(states => {\n            expect(states[0].title).toBe(\"Queue\");\n            expect(states[0].isEnabled).toBe(true);\n        });\n    });\n\n    it('should have Stop action disabled for Default state', async () => {\n        await page.getFiles().then(files => {\n            expect(files[1].status).toEqual(\"\");\n        });\n        await page.getFileActions(1).then(states => {\n            expect(states[1].title).toBe(\"Stop\");\n            expect(states[1].isEnabled).toBe(false);\n        });\n    });\n});"
  },
  {
    "path": "src/e2e/tests/dashboard.page.ts",
    "content": "import {browser, by, element, ExpectedConditions} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Promise;\n\nimport {Urls} from \"../urls\";\nimport {App} from \"./app\";\n\nexport class File {\n    constructor(public name,\n                public status,\n                public size) {\n    }\n}\n\nexport class FileActionButtonState {\n    constructor(public title,\n                public isEnabled) {\n    }\n}\n\nexport class DashboardPage extends App {\n    navigateTo() {\n        return browser.get(Urls.APP_BASE_URL + \"dashboard\").then(value => {\n            // Wait for the files list to show up\n            return browser.wait(ExpectedConditions.presenceOf(\n                element.all(by.css(\"#file-list .file\")).first()\n            ));\n        })\n    }\n\n    getFiles(): Promise<Array<File>> {\n        return element.all(by.css(\"#file-list .file\")).map(function (elm) {\n            let name = elm.element(by.css(\".name .text\")).getText();\n            let statusElm = elm.element(by.css(\".content .status\"));\n            let status = statusElm.isElementPresent(by.css(\"span.text\")).then(value => {\n                if(value) {\n                    return browser.executeScript(\n                        \"return arguments[0].innerHTML;\",\n                        statusElm.element(by.css(\"span.text\"))\n                    );\n                } else {\n                    return \"\";\n                }\n            });\n            // let status = browser.executeScript(\"return arguments[0].innerHTML;\", subelm);\n            let size = elm.element(by.css(\".size .size_info\")).getText();\n            return new File(name, status, size);\n        });\n    }\n\n    selectFile(index: number) {\n        element.all(by.css(\"#file-list .file\")).get(index).click();\n    }\n\n    isFileActionsVisible(index: number) {\n        return element.all(by.css(\"#file-list .file\")).get(index)\n                            .element(by.css(\".actions\")).isDisplayed();\n    }\n\n    getFileActions(index: number): Promise<Array<FileActionButtonState>> {\n        return element.all(by.css(\"#file-list .file\")).get(index)\n                    .element(by.css(\".actions\"))\n                    .all(by.css(\".button\"))\n                    .map(buttonElm => {\n                        let title = browser.executeScript(\n                            \"return arguments[0].innerHTML;\",\n                            buttonElm.element(by.css(\"div.text span\"))\n                        );\n                        let isEnabled = buttonElm.getAttribute(\"disabled\").then(value => {\n                            return value == null;\n                        });\n                        return new FileActionButtonState(title, isEnabled);\n                    });\n    }\n}"
  },
  {
    "path": "src/e2e/tests/settings.page.spec.ts",
    "content": "import {SettingsPage} from \"./settings.page\";\n\ndescribe('Testing settings page', () => {\n    let page: SettingsPage;\n\n    beforeEach(() => {\n        page = new SettingsPage();\n        page.navigateTo();\n    });\n\n    it('should have right top title', () => {\n        expect(page.getTopTitle()).toEqual(\"Settings\");\n    });\n});"
  },
  {
    "path": "src/e2e/tests/settings.page.ts",
    "content": "import {browser, by, element} from 'protractor';\nimport {promise} from \"selenium-webdriver\";\nimport Promise = promise.Promise;\n\nimport {Urls} from \"../urls\";\nimport {App} from \"./app\";\n\nexport class SettingsPage extends App {\n    navigateTo() {\n        return browser.get(Urls.APP_BASE_URL + \"settings\");\n    }\n}"
  },
  {
    "path": "src/e2e/tsconfig.json",
    "content": "// Source: https://github.com/angular/protractor/tree/master/exampleTypescript\n{\n  \"compilerOptions\": {\n    \"target\": \"es6\",\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"node\",\n    \"inlineSourceMap\": true,\n    \"declaration\": false,\n    \"noImplicitAny\": false,\n    \"outDir\": \"tmp\"\n  },\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "src/e2e/urls.ts",
    "content": "export class Urls {\n    static readonly APP_BASE_URL = \"http://myapp:8800/\";\n    static readonly SELENIUM_ADDRESS = \"http://localhost:4444/wd/hub\";\n}"
  },
  {
    "path": "src/pyinstaller_hooks/hook-patoolib.py",
    "content": "#-----------------------------------------------------------------------------\n# Copyright (c) 2013-2017, PyInstaller Development Team.\n#\n# Distributed under the terms of the GNU General Public License with exception\n# for distributing bootloader.\n#\n# The full license is in the file COPYING.txt, distributed with this software.\n#-----------------------------------------------------------------------------\n\n\n\"\"\"\npatoolib uses importlib and pyinstaller doesn't find it and add it to the list of needed modules\n\"\"\"\n\n\nhiddenimports = [\n    'patoolib.programs',\n    'patoolib.programs.ar',\n    'patoolib.programs.arc',\n    'patoolib.programs.archmage',\n    'patoolib.programs.bsdcpio',\n    'patoolib.programs.bsdtar',\n    'patoolib.programs.bzip2',\n    'patoolib.programs.cabextract',\n    'patoolib.programs.chmlib',\n    'patoolib.programs.clzip',\n    'patoolib.programs.compress',\n    'patoolib.programs.cpio',\n    'patoolib.programs.dpkg',\n    'patoolib.programs.flac',\n    'patoolib.programs.genisoimage',\n    'patoolib.programs.gzip',\n    'patoolib.programs.isoinfo',\n    'patoolib.programs.lbzip2',\n    'patoolib.programs.lcab',\n    'patoolib.programs.lha',\n    'patoolib.programs.lhasa',\n    'patoolib.programs.lrzip',\n    'patoolib.programs.lzip',\n    'patoolib.programs.lzma',\n    'patoolib.programs.lzop',\n    'patoolib.programs.mac',\n    'patoolib.programs.nomarch',\n    'patoolib.programs.p7azip',\n    'patoolib.programs.p7rzip',\n    'patoolib.programs.p7zip',\n    'patoolib.programs.pbzip2',\n    'patoolib.programs.pdlzip',\n    'patoolib.programs.pigz',\n    'patoolib.programs.plzip',\n    'patoolib.programs.py_bz2',\n    'patoolib.programs.py_echo',\n    'patoolib.programs.py_gzip',\n    'patoolib.programs.py_lzma',\n    'patoolib.programs.py_tarfile',\n    'patoolib.programs.py_zipfile',\n    'patoolib.programs.rar',\n    'patoolib.programs.rpm',\n    'patoolib.programs.rpm2cpio',\n    'patoolib.programs.rzip',\n    'patoolib.programs.shar',\n    'patoolib.programs.shorten',\n    'patoolib.programs.star',\n    'patoolib.programs.tar',\n    'patoolib.programs.unace',\n    'patoolib.programs.unadf',\n    'patoolib.programs.unalz',\n    'patoolib.programs.uncompress',\n    'patoolib.programs.unrar',\n    'patoolib.programs.unshar',\n    'patoolib.programs.unzip',\n    'patoolib.programs.xdms',\n    'patoolib.programs.xz',\n    'patoolib.programs.zip',\n    'patoolib.programs.zoo',\n    'patoolib.programs.zopfli',\n    'patoolib.programs.zpaq',\n]\n"
  },
  {
    "path": "src/python/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/common/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .types import overrides\nfrom .job import Job\nfrom .context import Context, Args\nfrom .error import AppError, ServiceExit, ServiceRestart\nfrom .constants import Constants\nfrom .config import Config, ConfigError\nfrom .persist import Persist, PersistError, Serializable\nfrom .localization import Localization\nfrom .multiprocessing_logger import MultiprocessingLogger\nfrom .status import Status, IStatusListener, StatusComponent, IStatusComponentListener\nfrom .app_process import AppProcess, AppOneShotProcess\n"
  },
  {
    "path": "src/python/common/app_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport sys\nfrom abc import abstractmethod\nfrom multiprocessing import Process, Queue, Event\nimport queue\nimport signal\nimport threading\nfrom datetime import datetime\n\nimport tblib.pickling_support\n\nfrom common import overrides, ServiceExit, MultiprocessingLogger\n\n\ntblib.pickling_support.install()\n\n\nclass ExceptionWrapper:\n    \"\"\"\n    An exception wrapper that works across processes\n    Source: https://stackoverflow.com/a/26096355/8571324\n    \"\"\"\n    def __init__(self, ee):\n        self.ee = ee\n        __,  __, self.tb = sys.exc_info()\n\n    def re_raise(self):\n        raise self.ee.with_traceback(self.tb)\n\n\nclass AppProcess(Process):\n    \"\"\"\n    Process with some additional functionality and fixes\n      * Support for a multiprocessing logger\n      * Removes signals to prevent join problems\n      * Propagates exceptions to owner process\n      * Safe terminate with timeout, followed by force terminate\n    \"\"\"\n\n    # Timeout before process is force terminated\n    __DEFAULT_TERMINATE_TIMEOUT_MS = 1000\n\n    def __init__(self, name: str):\n        self.__name = name\n        super().__init__(name=self.__name)\n\n        self.mp_logger = None\n        self.logger = logging.getLogger(self.__name)\n        self.__exception_queue = Queue()\n        self._terminate = Event()\n\n    def set_multiprocessing_logger(self, mp_logger: MultiprocessingLogger):\n        self.mp_logger = mp_logger\n\n    @overrides(Process)\n    def run(self):\n        # Replace the signal handlers that may have been set by main process to\n        # default handlers. Having non-default handlers in subprocesses causes\n        # a deadlock when attempting to join the process\n        # Info: https://stackoverflow.com/a/631605\n\n        # NOTE: There is a minuscule chance of deadlock if a signal is received\n        #       between start of the method and these resets.\n        #       The ideal solution is to remove the signal before the process is\n        #       started. Unfortunately that's difficult to do here because the\n        #       subprocess is started from a job thread, and python doesn't\n        #       allow setting signals from outside the main thread.\n        #       So we accept this risk for the quick and easy solution here\n        signal.signal(signal.SIGTERM, signal.SIG_DFL)\n        signal.signal(signal.SIGINT, signal.SIG_DFL)\n\n        # Set the thread name for convenience\n        threading.current_thread().name = self.__name\n\n        # Configure the logger for this process\n        if self.mp_logger:\n            self.logger = self.mp_logger.get_process_safe_logger().getChild(self.__name)\n\n        self.logger.debug(\"Started process\")\n\n        self.run_init()\n\n        try:\n            while not self._terminate.is_set():\n                self.run_loop()\n            self.logger.debug(\"Process received terminate flag\")\n        except ServiceExit:\n            self.logger.debug(\"Process received a ServiceExit\")\n        except Exception as e:\n            self.logger.debug(\"Process caught an exception\")\n            self.__exception_queue.put(ExceptionWrapper(e))\n            raise\n        finally:\n            self.run_cleanup()\n\n        self.logger.debug(\"Exiting process\")\n\n    @overrides(Process)\n    def terminate(self):\n        # Send a terminate signal, and force terminate after a timeout\n        self._terminate.set()\n\n        def elapsed_ms(start):\n            delta_in_s = (datetime.now() - start).total_seconds()\n            delta_in_ms = int(delta_in_s * 1000)\n            return delta_in_ms\n\n        timestamp_start = datetime.now()\n        while self.is_alive() and \\\n                elapsed_ms(timestamp_start) < AppProcess.__DEFAULT_TERMINATE_TIMEOUT_MS:\n            pass\n\n        super().terminate()\n\n    def propagate_exception(self):\n        \"\"\"\n        Raises any exception that was caught by the process\n        :return:\n        \"\"\"\n        try:\n            exc = self.__exception_queue.get(block=False)\n            raise exc.re_raise()\n        except queue.Empty:\n            pass\n\n    @abstractmethod\n    def run_init(self):\n        \"\"\"\n        Called once before the run loop\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def run_cleanup(self):\n        \"\"\"\n        Called once before cleanup\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def run_loop(self):\n        \"\"\"\n        Process behaviour should be implemented here.\n        This function is repeatedly called until process exits.\n        The check for graceful shutdown is performed between the loop iterations,\n        so try to limit the run time for this method.\n        :return:\n        \"\"\"\n        pass\n\n\nclass AppOneShotProcess(AppProcess):\n    \"\"\"\n    App process that runs only once and then exits\n    \"\"\"\n    def run_loop(self):\n        self.run_once()\n        self._terminate.set()\n\n    def run_cleanup(self):\n        pass\n\n    def run_init(self):\n        pass\n\n    @abstractmethod\n    def run_once(self):\n        \"\"\"\n        Process behaviour should be implemented here\n        :return:\n        \"\"\"\n        pass\n"
  },
  {
    "path": "src/python/common/config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport configparser\nfrom typing import Dict\nfrom io import StringIO\nimport collections\nfrom distutils.util import strtobool\nfrom abc import ABC\nfrom typing import Type, TypeVar, Callable, Any\n\nfrom .error import AppError\nfrom .persist import Persist, PersistError\nfrom .types import overrides\n\n\nclass ConfigError(AppError):\n    \"\"\"\n    Exception indicating a bad config value\n    \"\"\"\n    pass\n\n\nInnerConfigType = Dict[str, str]\nOuterConfigType = Dict[str, InnerConfigType]\n\n\n# Source: https://stackoverflow.com/a/39205612/8571324\nT = TypeVar('T', bound='InnerConfig')\n\n\nclass Converters:\n    @staticmethod\n    def null(_: T, __: str, value: str) -> str:\n        return value\n\n    @staticmethod\n    def int(cls: T, name: str, value: str) -> int:\n        if not value:\n            raise ConfigError(\"Bad config: {}.{} is empty\".format(\n                cls.__name__, name\n            ))\n        try:\n            val = int(value)\n        except ValueError:\n            raise ConfigError(\"Bad config: {}.{} ({}) must be an integer value\".format(\n                cls.__name__, name, value\n            ))\n        return val\n\n    @staticmethod\n    def bool(cls: T, name: str, value: str) -> bool:\n        if not value:\n            raise ConfigError(\"Bad config: {}.{} is empty\".format(\n                cls.__name__, name\n            ))\n        try:\n            val = bool(strtobool(value))\n        except ValueError:\n            raise ConfigError(\"Bad config: {}.{} ({}) must be a boolean value\".format(\n                cls.__name__, name, value\n            ))\n        return val\n\n\nclass Checkers:\n    @staticmethod\n    def null(_: T, __: str, value: Any) -> Any:\n        return value\n\n    @staticmethod\n    def string_nonempty(cls: T, name: str, value: str) -> str:\n        if not value or not value.strip():\n            raise ConfigError(\"Bad config: {}.{} is empty\".format(\n                cls.__name__, name\n            ))\n        return value\n\n    @staticmethod\n    def int_non_negative(cls: T, name: str, value: int) -> int:\n        if value < 0:\n            raise ConfigError(\"Bad config: {}.{} ({}) must be zero or greater\".format(\n                cls.__name__, name, value\n            ))\n        return value\n\n    @staticmethod\n    def int_positive(cls: T, name: str, value: int) -> int:\n        if value < 1:\n            raise ConfigError(\"Bad config: {}.{} ({}) must be greater than 0\".format(\n                cls.__name__, name, value\n            ))\n        return value\n\n\nclass InnerConfig(ABC):\n    \"\"\"\n    Abstract base class for a config section\n    Config values are exposed as properties. They must be set using their native type.\n    Internal utility methods are provided to convert strings to native types. These are\n    only used when creating config from a dict.\n\n    Implementation details:\n    Each property has associated with is a checker and a converter function.\n    The checker function performs boundary check on the native type value.\n    The converter function converts the string representation into the native type.\n    \"\"\"\n    class PropMetadata:\n        \"\"\"Tracks property metadata\"\"\"\n        def __init__(self, checker: Callable, converter: Callable):\n            self.checker = checker\n            self.converter = converter\n\n    # Global map to map a property to its metadata\n    # Is there a way for each concrete class to do this separately?\n    __prop_addon_map = collections.OrderedDict()\n\n    @classmethod\n    def _create_property(cls, name: str, checker: Callable, converter: Callable) -> property:\n        # noinspection PyProtectedMember\n        prop = property(fget=lambda s: s._get_property(name),\n                        fset=lambda s, v: s._set_property(name, v, checker))\n        prop_addon = InnerConfig.PropMetadata(checker=checker, converter=converter)\n        InnerConfig.__prop_addon_map[prop] = prop_addon\n        return prop\n\n    def _get_property(self, name: str) -> Any:\n        return getattr(self, \"__\" + name, None)\n\n    def _set_property(self, name: str, value: Any, checker: Callable):\n        # Allow setting to None for the first time\n        if value is None and self._get_property(name) is None:\n            setattr(self, \"__\" + name, None)\n        else:\n            setattr(self, \"__\" + name, checker(self.__class__, name, value))\n\n    @classmethod\n    def from_dict(cls: Type[T], config_dict: InnerConfigType) -> T:\n        \"\"\"\n        Construct and return inner config from a dict\n        Dict values can be either native types, or str representations\n        :param config_dict:\n        :return:\n        \"\"\"\n        config_dict = dict(config_dict)  # copy that we can modify\n\n        # Loop over all the property name, and set them to the value given in config_dict\n        # Raise error if a matching key is not found in config_dict\n        # noinspection PyCallingNonCallable\n        inner_config = cls()\n        property_map = {p: getattr(cls, p) for p in dir(cls) if isinstance(getattr(cls, p), property)}\n        for name, prop in property_map.items():\n            if name not in config_dict:\n                raise ConfigError(\"Missing config: {}.{}\".format(cls.__name__, name))\n            inner_config.set_property(name, config_dict[name])\n            del config_dict[name]\n\n        # Raise error if a key in config_dict did not match a property\n        extra_keys = config_dict.keys()\n        if extra_keys:\n            raise ConfigError(\"Unknown config: {}.{}\".format(cls.__name__, next(iter(extra_keys))))\n\n        return inner_config\n\n    def as_dict(self) -> InnerConfigType:\n        \"\"\"\n        Return the dict representation of the inner config\n        :return:\n        \"\"\"\n        config_dict = collections.OrderedDict()\n        cls = self.__class__\n        my_property_to_name_map = {getattr(cls, p): p for p in dir(cls) if isinstance(getattr(cls, p), property)}\n        # Arrange prop names in order of creation. Use the prop map to get the order\n        # Prop map contains all properties of all config classes, so filtering is required\n        all_properties = InnerConfig.__prop_addon_map.keys()\n        for prop in all_properties:\n            if prop in my_property_to_name_map.keys():\n                name = my_property_to_name_map[prop]\n                config_dict[name] = getattr(self, name)\n        return config_dict\n\n    def has_property(self, name: str) -> bool:\n        \"\"\"\n        Returns true if the given property exists, false otherwise\n        :param name:\n        :return:\n        \"\"\"\n        try:\n            return isinstance(getattr(self.__class__, name), property)\n        except AttributeError:\n            return False\n\n    def set_property(self, name: str, value: Any):\n        \"\"\"\n        Set a property dynamically\n        Do a str conversion of the value, if necessary\n        :param name:\n        :param value:\n        :return:\n        \"\"\"\n        cls = self.__class__\n        prop_addon = InnerConfig.__prop_addon_map[getattr(cls, name)]\n        # Do the conversion if value is of type str\n        native_value = prop_addon.converter(cls, name, value) if type(value) is str else value\n        # Set the property, which will invoke the checker\n        # noinspection PyProtectedMember\n        self._set_property(name, native_value, prop_addon.checker)\n\n\n# Useful aliases\nIC = InnerConfig\n# noinspection PyProtectedMember\nPROP = InnerConfig._create_property\n\n\nclass Config(Persist):\n    \"\"\"\n    Configuration registry\n    \"\"\"\n    class General(IC):\n        debug = PROP(\"debug\", Checkers.null, Converters.bool)\n        verbose = PROP(\"verbose\", Checkers.null, Converters.bool)\n\n        def __init__(self):\n            super().__init__()\n            self.debug = None\n            self.verbose = None\n\n    class Lftp(IC):\n        remote_address = PROP(\"remote_address\", Checkers.string_nonempty, Converters.null)\n        remote_username = PROP(\"remote_username\", Checkers.string_nonempty, Converters.null)\n        remote_password = PROP(\"remote_password\", Checkers.string_nonempty, Converters.null)\n        remote_port = PROP(\"remote_port\", Checkers.int_positive, Converters.int)\n        remote_path = PROP(\"remote_path\", Checkers.string_nonempty, Converters.null)\n        local_path = PROP(\"local_path\", Checkers.string_nonempty, Converters.null)\n        remote_path_to_scan_script = PROP(\"remote_path_to_scan_script\", Checkers.string_nonempty, Converters.null)\n        use_ssh_key = PROP(\"use_ssh_key\", Checkers.null, Converters.bool)\n        num_max_parallel_downloads = PROP(\"num_max_parallel_downloads\", Checkers.int_positive, Converters.int)\n        num_max_parallel_files_per_download = PROP(\"num_max_parallel_files_per_download\",\n                                                   Checkers.int_positive,\n                                                   Converters.int)\n        num_max_connections_per_root_file = PROP(\"num_max_connections_per_root_file\",\n                                                 Checkers.int_positive,\n                                                 Converters.int)\n        num_max_connections_per_dir_file = PROP(\"num_max_connections_per_dir_file\",\n                                                Checkers.int_positive,\n                                                Converters.int)\n        num_max_total_connections = PROP(\"num_max_total_connections\", Checkers.int_non_negative, Converters.int)\n        use_temp_file = PROP(\"use_temp_file\", Checkers.null, Converters.bool)\n\n        def __init__(self):\n            super().__init__()\n            self.remote_address = None\n            self.remote_username = None\n            self.remote_password = None\n            self.remote_port = None\n            self.remote_path = None\n            self.local_path = None\n            self.remote_path_to_scan_script = None\n            self.use_ssh_key = None\n            self.num_max_parallel_downloads = None\n            self.num_max_parallel_files_per_download = None\n            self.num_max_connections_per_root_file = None\n            self.num_max_connections_per_dir_file = None\n            self.num_max_total_connections = None\n            self.use_temp_file = None\n\n    class Controller(IC):\n        interval_ms_remote_scan = PROP(\"interval_ms_remote_scan\", Checkers.int_positive, Converters.int)\n        interval_ms_local_scan = PROP(\"interval_ms_local_scan\", Checkers.int_positive, Converters.int)\n        interval_ms_downloading_scan = PROP(\"interval_ms_downloading_scan\", Checkers.int_positive, Converters.int)\n        extract_path = PROP(\"extract_path\", Checkers.string_nonempty, Converters.null)\n        use_local_path_as_extract_path = PROP(\"use_local_path_as_extract_path\", Checkers.null, Converters.bool)\n\n        def __init__(self):\n            super().__init__()\n            self.interval_ms_remote_scan = None\n            self.interval_ms_local_scan = None\n            self.interval_ms_downloading_scan = None\n            self.extract_path = None\n            self.use_local_path_as_extract_path = None\n\n    class Web(InnerConfig):\n        port = PROP(\"port\", Checkers.int_positive, Converters.int)\n\n        def __init__(self):\n            super().__init__()\n            self.port = None\n\n    class AutoQueue(InnerConfig):\n        enabled = PROP(\"enabled\", Checkers.null, Converters.bool)\n        patterns_only = PROP(\"patterns_only\", Checkers.null, Converters.bool)\n        auto_extract = PROP(\"auto_extract\", Checkers.null, Converters.bool)\n\n        def __init__(self):\n            super().__init__()\n            self.enabled = None\n            self.patterns_only = None\n            self.auto_extract = None\n\n    def __init__(self):\n        self.general = Config.General()\n        self.lftp = Config.Lftp()\n        self.controller = Config.Controller()\n        self.web = Config.Web()\n        self.autoqueue = Config.AutoQueue()\n\n    @staticmethod\n    def _check_section(dct: OuterConfigType, name: str) -> InnerConfigType:\n        if name not in dct:\n            raise ConfigError(\"Missing config section: {}\".format(name))\n        val = dct[name]\n        del dct[name]\n        return val\n\n    @staticmethod\n    def _check_empty_outer_dict(dct: OuterConfigType):\n        extra_keys = dct.keys()\n        if extra_keys:\n            raise ConfigError(\"Unknown section: {}\".format(next(iter(extra_keys))))\n\n    @classmethod\n    @overrides(Persist)\n    def from_str(cls: \"Config\", content: str) -> \"Config\":\n        config_parser = configparser.ConfigParser()\n        try:\n            config_parser.read_string(content)\n        except (\n                configparser.MissingSectionHeaderError,\n                configparser.ParsingError\n        ) as e:\n            raise PersistError(\"Error parsing Config - {}: {}\".format(\n                type(e).__name__, str(e))\n            )\n        config_dict = {}\n        for section in config_parser.sections():\n            config_dict[section] = {}\n            for option in config_parser.options(section):\n                config_dict[section][option] = config_parser.get(section, option)\n        return Config.from_dict(config_dict)\n\n    @overrides(Persist)\n    def to_str(self) -> str:\n        config_parser = configparser.ConfigParser()\n        config_dict = self.as_dict()\n        for section in config_dict:\n            config_parser.add_section(section)\n            section_dict = config_dict[section]\n            for key in section_dict:\n                config_parser.set(section, key, str(section_dict[key]))\n        str_io = StringIO()\n        config_parser.write(str_io)\n        return str_io.getvalue()\n\n    @staticmethod\n    def from_dict(config_dict: OuterConfigType) -> \"Config\":\n        config_dict = dict(config_dict)  # copy that we can modify\n        config = Config()\n\n        config.general = Config.General.from_dict(Config._check_section(config_dict, \"General\"))\n        config.lftp = Config.Lftp.from_dict(Config._check_section(config_dict, \"Lftp\"))\n        config.controller = Config.Controller.from_dict(Config._check_section(config_dict, \"Controller\"))\n        config.web = Config.Web.from_dict(Config._check_section(config_dict, \"Web\"))\n        config.autoqueue = Config.AutoQueue.from_dict(Config._check_section(config_dict, \"AutoQueue\"))\n\n        Config._check_empty_outer_dict(config_dict)\n        return config\n\n    def as_dict(self) -> OuterConfigType:\n        # We convert all values back to strings\n        # Use an ordered dict to main section order\n        config_dict = collections.OrderedDict()\n        config_dict[\"General\"] = self.general.as_dict()\n        config_dict[\"Lftp\"] = self.lftp.as_dict()\n        config_dict[\"Controller\"] = self.controller.as_dict()\n        config_dict[\"Web\"] = self.web.as_dict()\n        config_dict[\"AutoQueue\"] = self.autoqueue.as_dict()\n        return config_dict\n\n    def has_section(self, name: str) -> bool:\n        \"\"\"\n        Returns true if the given section exists, false otherwise\n        :param name:\n        :return:\n        \"\"\"\n        try:\n            return isinstance(getattr(self, name), InnerConfig)\n        except AttributeError:\n            return False\n"
  },
  {
    "path": "src/python/common/constants.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n\nclass Constants:\n    \"\"\"\n    POD class to hold shared constants\n    :return:\n    \"\"\"\n    SERVICE_NAME = \"seedsync\"\n    MAIN_THREAD_SLEEP_INTERVAL_IN_SECS = 0.5\n    MAX_LOG_SIZE_IN_BYTES = 10*1024*1024  # 10 MB\n    LOG_BACKUP_COUNT = 10\n    WEB_ACCESS_LOG_NAME = 'web_access'\n    MIN_PERSIST_TO_FILE_INTERVAL_IN_SECS = 30\n    JSON_PRETTY_PRINT_INDENT = 4\n    LFTP_TEMP_FILE_SUFFIX = \".lftp\"\n"
  },
  {
    "path": "src/python/common/context.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport copy\nimport collections\n\n# my libs\nfrom .config import Config\nfrom .status import Status\n\n\nclass Args:\n    \"\"\"\n    Container for args\n    These are settings that aren't part of config but still needed by\n    sub-components\n    \"\"\"\n    def __init__(self):\n        self.local_path_to_scanfs = None\n        self.html_path = None\n        self.debug = None\n        self.exit = None\n\n    def as_dict(self) -> dict:\n        dct = collections.OrderedDict()\n        dct[\"local_path_to_scanfs\"] = str(self.local_path_to_scanfs)\n        dct[\"html_path\"] = str(self.html_path)\n        dct[\"debug\"] = str(self.debug)\n        dct[\"exit\"] = str(self.exit)\n        return dct\n\n\nclass Context:\n    \"\"\"\n    Stores contextual information for the entire application\n    \"\"\"\n    def __init__(self,\n                 logger: logging.Logger,\n                 web_access_logger: logging.Logger,\n                 config: Config,\n                 args: Args,\n                 status: Status):\n        \"\"\"\n        Primary constructor to construct the top-level context\n        \"\"\"\n        # Config\n        self.logger = logger\n        self.web_access_logger = web_access_logger\n        self.config = config\n        self.args = args\n        self.status = status\n\n    def create_child_context(self, context_name: str) -> \"Context\":\n        child_context = copy.copy(self)\n        child_context.logger = self.logger.getChild(context_name)\n        return child_context\n\n    def print_to_log(self):\n        # Print the config\n        self.logger.debug(\"Config:\")\n        config_dict = self.config.as_dict()\n        for section in config_dict.keys():\n            for option in config_dict[section].keys():\n                value = config_dict[section][option]\n                self.logger.debug(\"  {}.{}: {}\".format(section, option, value))\n\n        self.logger.debug(\"Args:\")\n        for name, value in self.args.as_dict().items():\n            self.logger.debug(\"  {}: {}\".format(name, value))\n"
  },
  {
    "path": "src/python/common/error.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n\nclass AppError(Exception):\n    \"\"\"\n    Exception indicating an error\n    \"\"\"\n    pass\n\n\nclass ServiceExit(AppError):\n    \"\"\"\n    Custom exception which is used to trigger the clean exit\n    of all running threads and the main program.\n    \"\"\"\n    pass\n\n\nclass ServiceRestart(AppError):\n    \"\"\"\n    Exception indicating a restart is requested\n    \"\"\"\n    pass\n"
  },
  {
    "path": "src/python/common/job.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport sys\nimport threading\nimport time\nfrom abc import ABC, abstractmethod\n\n# my libs\nfrom .context import Context\nfrom .types import overrides\n\n\nclass Job(threading.Thread, ABC):\n    \"\"\"\n    Job thread that handles graceful shutdown\n    \"\"\"\n    _DEFAULT_SLEEP_INTERVAL_IN_SECS = 0.5\n\n    def __init__(self, name: str, context: Context):\n        super().__init__()\n        self.name = name\n        self.logger = context.logger\n\n        # The shutdown_flag is a threading.Event object that\n        # indicates whether the thread should be terminated.\n        self.shutdown_flag = threading.Event()\n\n        # For exception propagation\n        self.exc_info = None\n\n    @overrides(threading.Thread)\n    def run(self):\n        self.logger.debug(\"Thread {} started\".format(self.name))\n\n        # ... Setup code here ...\n        self.logger.debug(\"Calling setup for {}\".format(self.name))\n        self.setup()\n        self.logger.debug(\"Finished setup for {}\".format(self.name))\n\n        while not self.shutdown_flag.is_set():\n            # ... Job code here ...\n            # noinspection PyBroadException\n            try:\n                self.execute()\n            except Exception:\n                self.exc_info = sys.exc_info()\n                self.logger.exception(\"Caught exception in job {}\".format(self.name))\n                # break out of run loop and proceed to cleanup\n                self.shutdown_flag.set()\n                break\n\n            time.sleep(Job._DEFAULT_SLEEP_INTERVAL_IN_SECS)\n\n        # ... Clean shutdown code here ...\n        self.logger.debug(\"Calling cleanup for {}\".format(self.name))\n        self.cleanup()\n        self.logger.debug(\"Finished cleanup for {}\".format(self.name))\n\n        self.logger.debug(\"Thread {} stopped\".format(self.name))\n\n    def terminate(self):\n        \"\"\"\n        Mark job for termination\n        :return:\n        \"\"\"\n        self.shutdown_flag.set()\n\n    def propagate_exception(self):\n        \"\"\"\n        Raises any exception captured by this job in whatever thread calls this method\n        Source: https://stackoverflow.com/a/1854263/8571324\n        :return:\n        \"\"\"\n        if self.exc_info:\n            exc_info = self.exc_info\n            self.exc_info = None\n            raise exc_info[1].with_traceback(exc_info[2])\n\n    @abstractmethod\n    def setup(self):\n        \"\"\"\n        Setup is run once when the job starts\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def execute(self):\n        \"\"\"\n        Execute is run repeatedly, separated by a sleep interval, while the job is running\n        This method must return relatively quickly, otherwise the job won't be able to safely\n        terminate\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def cleanup(self):\n        \"\"\"\n        Cleanup is run one when the job is about to terminate\n        :return:\n        \"\"\"\n        pass\n"
  },
  {
    "path": "src/python/common/localization.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n\nclass Localization:\n    class Error:\n        MISSING_FILE = \"The file '{}' doesn't exist.\"\n        REMOTE_SERVER_SCAN = \"An error occurred while scanning the remote server: '{}'.\"\n        REMOTE_SERVER_INSTALL = \"An error occurred while installing scanner script to remote server: '{}'.\"\n        LOCAL_SERVER_SCAN = \"An error occurred while scanning the local system.\"\n        SETTINGS_INCOMPLETE = \"The settings are not fully configured.\"\n"
  },
  {
    "path": "src/python/common/multiprocessing_logger.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport multiprocessing\nimport threading\nimport queue\nimport logging\nimport time\nimport sys\nfrom logging.handlers import QueueHandler\n\n\nclass MultiprocessingLogger:\n    \"\"\"\n    A helper class to enable logging across processes\n    It starts a listener thread on the main process. The listener thread\n    receives records on a queue from other processes and sends them to the\n    main logger (effectively serializing the logging).\n    Other processes use a QueueHandler to send logging records to the\n    listener thread on the main process.\n    Source: https://gist.github.com/vsajip/820132\n    \"\"\"\n\n    __LISTENER_SLEEP_INTERVAL_IN_SECS = 0.1\n\n    def __init__(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"MPLogger\")\n        self.__queue = multiprocessing.Queue(-1)\n        self.__logger_level = base_logger.getEffectiveLevel()\n        self.__listener = threading.Thread(name=\"MPLoggerListener\",\n                                           target=self.__listener)\n        self.__listener_shutdown = threading.Event()\n        self.__listener_exc_info = None\n\n    def start(self):\n        self.__listener.start()\n\n    def stop(self):\n        self.__listener_shutdown.set()\n        self.__listener.join()\n\n    def propagate_exception(self):\n        \"\"\"\n        Raises any exception captured by the listener thread\n        Source: https://stackoverflow.com/a/1854263/8571324\n        :return:\n        \"\"\"\n        if self.__listener_exc_info:\n            exc_info = self.__listener_exc_info\n            self.__listener_exc_info = None\n            raise exc_info[1].with_traceback(exc_info[2])\n\n    def get_process_safe_logger(self) -> logging.Logger:\n        \"\"\"\n        Returns a process-safe logger\n        This logger sends all records to the main process\n        :return:\n        \"\"\"\n        queue_handler = QueueHandler(self.__queue)\n        root_logger = logging.getLogger()\n\n        # The fork may have happened after the root logger was setup by the main process\n        # Remove all handlers from the root logger for this process\n        handlers = root_logger.handlers[:]\n        for handler in handlers:\n            handler.close()\n            root_logger.removeHandler(handler)\n\n        root_logger.addHandler(queue_handler)\n        root_logger.setLevel(self.__logger_level)\n        return root_logger\n\n    def __listener(self):\n        self.logger.debug(\"Started listener thread\")\n\n        while not self.__listener_shutdown.is_set():\n            # noinspection PyBroadException\n            try:\n                while True:\n                    try:\n                        record = self.__queue.get(block=False)\n                        self.logger.getChild(record.name).handle(record)\n                    except queue.Empty:\n                        break\n            except Exception:\n                self.__listener_exc_info = sys.exc_info()\n                self.logger.exception(\"Caught exception in listener thread\")\n                # break out of run loop\n                self.__listener_shutdown.set()\n                break\n\n            time.sleep(MultiprocessingLogger.__LISTENER_SLEEP_INTERVAL_IN_SECS)\n\n        self.logger.debug(\"Stopped listener thread\")\n"
  },
  {
    "path": "src/python/common/persist.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nfrom abc import ABC, abstractmethod\nfrom typing import Type, TypeVar\n\nfrom .error import AppError\nfrom .localization import Localization\n\n\n# Source: https://stackoverflow.com/a/39205612/8571324\nT_Persist = TypeVar('T_Persist', bound='Persist')\nT_Serializable = TypeVar('T_Serializable', bound='Serializable')\n\n\nclass Serializable(ABC):\n    \"\"\"\n    Defines a class that is serializable to string.\n    The string representation must be human readable (i.e. not pickle)\n    \"\"\"\n    @classmethod\n    @abstractmethod\n    def from_str(cls: Type[T_Serializable], content: str) -> T_Serializable:\n        pass\n\n    @abstractmethod\n    def to_str(self) -> str:\n        pass\n\n\nclass PersistError(AppError):\n    \"\"\"\n    Exception indicating persist loading/saving error\n    \"\"\"\n    pass\n\n\nclass Persist(Serializable):\n    \"\"\"\n    Defines state that should be persisted between runs\n    Provides utility methods to persist/load content to/from file\n    Concrete implementations need to implement the from_str() and\n    to_str() functionality\n    \"\"\"\n    @classmethod\n    def from_file(cls: Type[T_Persist], file_path: str) -> T_Persist:\n        if not os.path.isfile(file_path):\n            raise AppError(Localization.Error.MISSING_FILE.format(file_path))\n        with open(file_path, \"r\") as f:\n            return cls.from_str(f.read())\n\n    def to_file(self, file_path: str):\n        with open(file_path, \"w\") as f:\n            f.write(self.to_str())\n\n    @classmethod\n    @abstractmethod\n    def from_str(cls: Type[T_Persist], content: str) -> T_Persist:\n        pass\n\n    @abstractmethod\n    def to_str(self) -> str:\n        pass\n"
  },
  {
    "path": "src/python/common/status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom abc import ABC, abstractmethod\nfrom typing import Any, TypeVar, Type\nfrom threading import Lock\n\nfrom common import overrides\n\n\nT = TypeVar('T', bound='StatusComponent')\n\n\nclass IStatusComponentListener(ABC):\n    @abstractmethod\n    def notify(self, name: str):\n        \"\"\"\n        Called when a property is changed\n        :param name:\n        :return:\n        \"\"\"\n        pass\n\n\nclass BaseStatus:\n    \"\"\"\n    Provides functionality to dynamically create properties\n    \"\"\"\n\n    # noinspection PyProtectedMember\n    @classmethod\n    def _create_property(cls, name: str) -> property:\n        return property(fget=lambda s: s._get_property(name),\n                        fset=lambda s, v: s._set_property(name, v))\n\n    def _get_property(self, name: str) -> Any:\n        return getattr(self, \"__\" + name, None)\n\n    def _set_property(self, name: str, value: Any):\n        setattr(self, \"__\" + name, value)\n\n\nclass StatusComponent(BaseStatus):\n    \"\"\"\n    Base class for status of a single component\n    \"\"\"\n\n    def __init__(self):\n        self.__listeners = []\n        self.__properties = []  # names of properties created\n\n    def add_listener(self, listener: IStatusComponentListener):\n        if listener not in self.__listeners:\n            self.__listeners.append(listener)\n\n    def remove_listener(self, listener: IStatusComponentListener):\n        if listener in self.__listeners:\n            self.__listeners.remove(listener)\n\n    @classmethod\n    def copy(cls: Type[T], src: T, dst: T) -> None:\n        property_names = [p for p in dir(cls) if isinstance(getattr(cls, p), property)]\n        for prop in property_names:\n            setattr(dst, \"__\" + prop, getattr(src, \"__\" + prop))\n\n    @overrides(BaseStatus)\n    def _set_property(self, name: str, value: Any):\n        super()._set_property(name, value)\n        # Notify listeners\n        for listener in self.__listeners:\n            listener.notify(name)\n\n\nclass IStatusListener(ABC):\n    @abstractmethod\n    def notify(self):\n        \"\"\"\n        Called when any property of a component is changed\n        :return:\n        \"\"\"\n        pass\n\n\nclass Status(BaseStatus):\n    \"\"\"\n    This class tracks the status of all components across the server\n    This is meant to be one-way communication - i.e. only one component\n    should set the status\n\n    Clients can use listeners to be notified when values are updated.\n    Listeners can be added to the overall status for notification on\n    any change, or to each component for component-specific changes.\n    \"\"\"\n\n    class CompListener(IStatusComponentListener):\n        \"\"\"Propagates notifications from component to status listeners\"\"\"\n        def __init__(self, status: \"Status\"):\n            self.status = status\n\n        def notify(self, name: str):\n            self.status._listeners_lock.acquire()\n            for listener in self.status._listeners:\n                listener.notify()\n            self.status._listeners_lock.release()\n\n    # ----- Start of component definition -----\n    class ServerStatus(StatusComponent):\n        up = StatusComponent._create_property(\"up\")\n        error_msg = StatusComponent._create_property(\"error_msg\")\n\n        def __init__(self):\n            super().__init__()\n            self.up = True\n            self.error_msg = None\n\n    class ControllerStatus(StatusComponent):\n        latest_local_scan_time = StatusComponent._create_property(\"latest_local_scan_time\")\n        latest_remote_scan_time = StatusComponent._create_property(\"latest_remote_scan_time\")\n        latest_remote_scan_failed = StatusComponent._create_property(\"latest_remote_scan_failed\")\n        latest_remote_scan_error = StatusComponent._create_property(\"latest_remote_scan_error\")\n\n        def __init__(self):\n            super().__init__()\n            self.latest_local_scan_time = None\n            self.latest_remote_scan_time = None\n            self.latest_remote_scan_failed = None\n            self.latest_remote_scan_error = None\n\n    # ----- End of component definition -----\n\n    # Component registration\n    server = BaseStatus._create_property(\"server\")\n    controller = BaseStatus._create_property(\"controller\")\n\n    def __init__(self):\n        self._listeners = []\n        self._listeners_lock = Lock()\n        self.__comp_listener = Status.CompListener(self)\n\n        # Component initialization\n        self.server = self.__create_component(Status.ServerStatus)\n        self.controller = self.__create_component(Status.ControllerStatus)\n\n    def copy(self) -> \"Status\":\n        copy = Status()\n        cls = Status\n        property_names = [p for p in dir(cls) if isinstance(getattr(cls, p), property)]\n        for prop in property_names:\n            src_comp = self._get_property(prop)\n            dst_comp = copy._get_property(prop)\n            src_comp.__class__.copy(src_comp, dst_comp)\n        return copy\n\n    def add_listener(self, listener: IStatusListener):\n        self._listeners_lock.acquire()\n        if listener not in self._listeners:\n            self._listeners.append(listener)\n        self._listeners_lock.release()\n\n    def remove_listener(self, listener: IStatusListener):\n        self._listeners_lock.acquire()\n        if listener in self._listeners:\n            self._listeners.remove(listener)\n        self._listeners_lock.release()\n\n    def __create_component(self, comp_cls: Type[T]) -> T:\n        \"\"\"Create a component and register our listener with it\"\"\"\n        # PyCharm is confused and complains about the ctor\n        # noinspection PyCallingNonCallable\n        comp = comp_cls()\n        comp.add_listener(self.__comp_listener)\n        return comp\n\n    @overrides(BaseStatus)\n    def _set_property(self, name: str, value: Any):\n        \"\"\"Override set property so that it can only be set once\"\"\"\n        if self._get_property(name) is not None:\n            raise ValueError(\"Cannot reassign component\")\n        super()._set_property(name, value)\n"
  },
  {
    "path": "src/python/common/types.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport inspect\n\n\ndef overrides(interface_class):\n    \"\"\"\n    Decorator to check that decorated method is a valid override\n    Source: https://stackoverflow.com/a/8313042\n    :param interface_class: The super class\n    :return:\n    \"\"\"\n    assert(inspect.isclass(interface_class)), \"Overrides parameter must be a class type\"\n\n    def overrider(method):\n        assert(method.__name__ in dir(interface_class)), \"Method does not override super class\"\n        return method\n    return overrider\n"
  },
  {
    "path": "src/python/controller/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .controller import Controller\nfrom .controller_job import ControllerJob\nfrom .controller_persist import ControllerPersist\nfrom .model_builder import ModelBuilder\nfrom .auto_queue import AutoQueue, AutoQueuePersist, IAutoQueuePersistListener, AutoQueuePattern\nfrom .scan import IScanner, ScannerResult, ScannerProcess, ScannerError\n"
  },
  {
    "path": "src/python/controller/auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nfrom abc import ABC, abstractmethod\nfrom typing import Set, List, Callable, Tuple\nimport fnmatch\n\nfrom common import overrides, Constants, Context, Persist, PersistError, Serializable\nfrom model import IModelListener, ModelFile\nfrom .controller import Controller\n\n\nclass AutoQueuePattern(Serializable):\n    # Keys\n    __KEY_PATTERN = \"pattern\"\n\n    def __init__(self, pattern: str):\n        self.__pattern = pattern\n\n    @property\n    def pattern(self) -> str:\n        return self.__pattern\n\n    def __eq__(self, other: \"AutoQueuePattern\") -> bool:\n        return self.__pattern == other.__pattern\n\n    def __hash__(self) -> int:\n        return hash(self.__pattern)\n\n    def to_str(self) -> str:\n        dct = dict()\n        dct[AutoQueuePattern.__KEY_PATTERN] = self.__pattern\n        return json.dumps(dct)\n\n    @classmethod\n    def from_str(cls, content: str) -> \"AutoQueuePattern\":\n        dct = json.loads(content)\n        return AutoQueuePattern(pattern=dct[AutoQueuePattern.__KEY_PATTERN])\n\n\nclass IAutoQueuePersistListener(ABC):\n    \"\"\"Listener for receiving AutoQueuePersist events\"\"\"\n\n    @abstractmethod\n    def pattern_added(self, pattern: AutoQueuePattern):\n        pass\n\n    @abstractmethod\n    def pattern_removed(self, pattern: AutoQueuePattern):\n        pass\n\n\nclass AutoQueuePersist(Persist):\n    \"\"\"\n    Persisting state for auto-queue\n    \"\"\"\n\n    # Keys\n    __KEY_PATTERNS = \"patterns\"\n\n    def __init__(self):\n        self.__patterns = []\n        self.__listeners = []\n\n    @property\n    def patterns(self) -> Set[AutoQueuePattern]:\n        return set(self.__patterns)\n\n    def add_pattern(self, pattern: AutoQueuePattern):\n        # Check values\n        if not pattern.pattern.strip():\n            raise ValueError(\"Cannot add blank pattern\")\n\n        if pattern not in self.__patterns:\n            self.__patterns.append(pattern)\n            for listener in self.__listeners:\n                listener.pattern_added(pattern)\n\n    def remove_pattern(self, pattern: AutoQueuePattern):\n        if pattern in self.__patterns:\n            self.__patterns.remove(pattern)\n            for listener in self.__listeners:\n                listener.pattern_removed(pattern)\n\n    def add_listener(self, listener: IAutoQueuePersistListener):\n        self.__listeners.append(listener)\n\n    @classmethod\n    @overrides(Persist)\n    def from_str(cls: \"AutoQueuePersist\", content: str) -> \"AutoQueuePersist\":\n        persist = AutoQueuePersist()\n        try:\n            dct = json.loads(content)\n            pattern_list = dct[AutoQueuePersist.__KEY_PATTERNS]\n            for pattern in pattern_list:\n                persist.add_pattern(AutoQueuePattern.from_str(pattern))\n            return persist\n        except (json.decoder.JSONDecodeError, KeyError) as e:\n            raise PersistError(\"Error parsing AutoQueuePersist - {}: {}\".format(\n                type(e).__name__, str(e))\n            )\n\n    @overrides(Persist)\n    def to_str(self) -> str:\n        dct = dict()\n        dct[AutoQueuePersist.__KEY_PATTERNS] = list(p.to_str() for p in self.__patterns)\n        return json.dumps(dct, indent=Constants.JSON_PRETTY_PRINT_INDENT)\n\n\nclass AutoQueueModelListener(IModelListener):\n    \"\"\"Keeps track of added and modified files\"\"\"\n    def __init__(self):\n        self.new_files = []  # list of new files\n        self.modified_files = []  # list of pairs (old_file, new_file)\n\n    @overrides(IModelListener)\n    def file_added(self, file: ModelFile):\n        self.new_files.append(file)\n\n    @overrides(IModelListener)\n    def file_updated(self, old_file: ModelFile, new_file: ModelFile):\n        self.modified_files.append((old_file, new_file))\n\n    @overrides(IModelListener)\n    def file_removed(self, file: ModelFile):\n        pass\n\n\nclass AutoQueuePersistListener(IAutoQueuePersistListener):\n    \"\"\"Keeps track of newly added patterns\"\"\"\n    def __init__(self):\n        self.new_patterns = set()\n\n    @overrides(IAutoQueuePersistListener)\n    def pattern_added(self, pattern: AutoQueuePattern):\n        self.new_patterns.add(pattern)\n\n    @overrides(IAutoQueuePersistListener)\n    def pattern_removed(self, pattern: AutoQueuePattern):\n        if pattern in self.new_patterns:\n            self.new_patterns.remove(pattern)\n\n\nclass AutoQueue:\n    \"\"\"\n    Implements auto-queue functionality by sending commands to controller\n    as matching files are discovered\n    AutoQueue is in the same thread as Controller, so no synchronization is\n    needed for now\n    \"\"\"\n    def __init__(self,\n                 context: Context,\n                 persist: AutoQueuePersist,\n                 controller: Controller):\n        self.logger = context.logger.getChild(\"AutoQueue\")\n        self.__persist = persist\n        self.__controller = controller\n        self.__model_listener = AutoQueueModelListener()\n        self.__persist_listener = AutoQueuePersistListener()\n        self.__enabled = context.config.autoqueue.enabled\n        self.__patterns_only = context.config.autoqueue.patterns_only\n        self.__auto_extract_enabled = context.config.autoqueue.auto_extract\n\n        if self.__enabled:\n            persist.add_listener(self.__persist_listener)\n\n            initial_model_files = self.__controller.get_model_files_and_add_listener(self.__model_listener)\n            # pass the initial model files through to our listener\n            for file in initial_model_files:\n                self.__model_listener.file_added(file)\n\n            # Print the initial persist state\n            self.logger.debug(\"Auto-Queue Patterns:\")\n            for pattern in self.__persist.patterns:\n                self.logger.debug(\"    {}\".format(pattern.pattern))\n\n    def process(self):\n        \"\"\"\n        Advance the auto queue state\n        :return:\n        \"\"\"\n        if not self.__enabled:\n            return\n\n        ###\n        # Queue\n        ###\n        queue_candidate_files = []\n\n        # Candidate all new files\n        queue_candidate_files += self.__model_listener.new_files\n\n        # Candidate modified files where the remote size changed\n        for old_file, new_file in self.__model_listener.modified_files:\n            if old_file.remote_size != new_file.remote_size:\n                queue_candidate_files.append(new_file)\n\n        files_to_queue = self.__filter_candidates(\n            candidates=queue_candidate_files,\n            accept=lambda f: f.remote_size is not None and f.state == ModelFile.State.DEFAULT\n        )\n\n        ###\n        # Extract\n        ###\n        files_to_extract = []\n\n        if self.__auto_extract_enabled:\n            extract_candidate_files = []\n\n            # Candidate all new files\n            extract_candidate_files += self.__model_listener.new_files\n\n            # Candidate modified files that just became DOWNLOADED\n            # But not files that went EXTRACTING -> DOWNLOADED (failed extraction)\n            for old_file, new_file in self.__model_listener.modified_files:\n                if old_file.state != ModelFile.State.DOWNLOADED and \\\n                        old_file.state != ModelFile.State.EXTRACTING and \\\n                        new_file.state == ModelFile.State.DOWNLOADED:\n                    extract_candidate_files.append(new_file)\n\n            files_to_extract = self.__filter_candidates(\n                candidates=extract_candidate_files,\n                accept=lambda f:\n                    f.state == ModelFile.State.DOWNLOADED and\n                    f.local_size is not None and\n                    f.local_size > 0 and\n                    f.is_extractable\n            )\n\n        ###\n        # Send commands\n        ###\n\n        # Send the queue commands\n        for filename, pattern in files_to_queue:\n            self.logger.info(\n                \"Auto queueing '{}'\".format(filename) +\n                (\" for pattern '{}'\".format(pattern.pattern) if pattern else \"\")\n            )\n            command = Controller.Command(Controller.Command.Action.QUEUE, filename)\n            self.__controller.queue_command(command)\n\n        # Send the extract commands\n        for filename, pattern in files_to_extract:\n            self.logger.info(\n                \"Auto extracting '{}'\".format(filename) +\n                (\" for pattern '{}'\".format(pattern.pattern) if pattern else \"\")\n            )\n            command = Controller.Command(Controller.Command.Action.EXTRACT, filename)\n            self.__controller.queue_command(command)\n\n        # Clear the processed files\n        self.__model_listener.new_files.clear()\n        self.__model_listener.modified_files.clear()\n        # Clear the new patterns\n        self.__persist_listener.new_patterns.clear()\n\n    def __filter_candidates(self,\n                            candidates: List[ModelFile],\n                            accept: Callable[[ModelFile], bool]) -> List[Tuple[str, AutoQueuePattern]]:\n        \"\"\"\n        Given a list of candidate files, filter out those that match the accept criteria\n        Also takes into consideration new patterns that were added\n        The accept criteria is applied to candidates AND all existing files in case of\n        new patterns\n        :param candidates:\n        :param accept:\n        :return: list of (filename, pattern) pairs\n        \"\"\"\n        # Files accepted and matched, filename -> pattern map\n        # Filename key prevents a file from being accepted twice\n        files_matched = dict()\n\n        # Step 1: run candidates through all the patterns if they are enabled\n        #         otherwise accept all files\n        for file in candidates:\n            if self.__patterns_only:\n                for pattern in self.__persist.patterns:\n                    if accept(file) and self.__match(pattern, file):\n                        files_matched[file.name] = pattern\n                        break\n            elif accept(file):\n                files_matched[file.name] = None\n\n        # Step 2: run new pattern through all the files\n        if self.__persist_listener.new_patterns:\n            model_files = self.__controller.get_model_files()\n            for new_pattern in self.__persist_listener.new_patterns:\n                for file in model_files:\n                    if accept(file) and self.__match(new_pattern, file):\n                        files_matched[file.name] = new_pattern\n\n        return list(zip(files_matched.keys(), files_matched.values()))\n\n    @staticmethod\n    def __match(pattern: AutoQueuePattern, file: ModelFile) -> bool:\n        \"\"\"\n        Returns true is file matches the pattern\n        :param pattern:\n        :param file:\n        :return:\n        \"\"\"\n        # make the search case insensitive\n        pattern = pattern.pattern.lower()\n        filename = file.name.lower()\n        # 1. pattern match\n        # 2. wildcard match\n        return pattern in filename or \\\n            fnmatch.fnmatch(filename, pattern)\n"
  },
  {
    "path": "src/python/controller/controller.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom abc import ABC, abstractmethod\nfrom typing import List, Callable\nfrom threading import Lock\nfrom queue import Queue\nfrom enum import Enum\nimport copy\n\n# my libs\nfrom .scan import ScannerProcess, ActiveScanner, LocalScanner, RemoteScanner\nfrom .extract import ExtractProcess, ExtractStatus\nfrom .model_builder import ModelBuilder\nfrom common import Context, AppError, MultiprocessingLogger, AppOneShotProcess, Constants\nfrom model import ModelError, ModelFile, Model, ModelDiff, ModelDiffUtil, IModelListener\nfrom lftp import Lftp, LftpError, LftpJobStatus\nfrom .controller_persist import ControllerPersist\nfrom .delete import DeleteLocalProcess, DeleteRemoteProcess\n\n\nclass ControllerError(AppError):\n    \"\"\"\n    Exception indicating a controller error\n    \"\"\"\n    pass\n\n\nclass Controller:\n    \"\"\"\n    Top-level class that controls the behaviour of the app\n    \"\"\"\n    class Command:\n        \"\"\"\n        Class by which clients of Controller can request Actions to be executed\n        Supports callbacks by which clients can be notified of action success/failure\n        Note: callbacks will be executed in Controller thread, so any heavy computation\n              should be moved out of the callback\n        \"\"\"\n        class Action(Enum):\n            QUEUE = 0\n            STOP = 1\n            EXTRACT = 2\n            DELETE_LOCAL = 3\n            DELETE_REMOTE = 4\n\n        class ICallback(ABC):\n            \"\"\"Command callback interface\"\"\"\n            @abstractmethod\n            def on_success(self):\n                \"\"\"Called on successful completion of action\"\"\"\n                pass\n\n            @abstractmethod\n            def on_failure(self, error: str):\n                \"\"\"Called on action failure\"\"\"\n                pass\n\n        def __init__(self, action: Action, filename: str):\n            self.action = action\n            self.filename = filename\n            self.callbacks = []\n\n        def add_callback(self, callback: ICallback):\n            self.callbacks.append(callback)\n\n    class CommandProcessWrapper:\n        \"\"\"\n        Wraps any one-shot command processes launched by the controller\n        \"\"\"\n        def __init__(self, process: AppOneShotProcess, post_callback: Callable):\n            self.process = process\n            self.post_callback = post_callback\n\n    def __init__(self,\n                 context: Context,\n                 persist: ControllerPersist):\n        self.__context = context\n        self.__persist = persist\n        self.logger = context.logger.getChild(\"Controller\")\n\n        # Decide the password here\n        self.__password = context.config.lftp.remote_password if not context.config.lftp.use_ssh_key else None\n\n        # The command queue\n        self.__command_queue = Queue()\n\n        # The model\n        self.__model = Model()\n        self.__model.set_base_logger(self.logger)\n        # Lock for the model\n        # Note: While the scanners are in a separate process, the rest of the application\n        #       is threaded in a single process. (The webserver is bottle+paste which is\n        #       multi-threaded). Therefore it is safe to use a threading Lock for the model\n        #       (the scanner processes never try to access the model)\n        self.__model_lock = Lock()\n\n        # Model builder\n        self.__model_builder = ModelBuilder()\n        self.__model_builder.set_base_logger(self.logger)\n        self.__model_builder.set_downloaded_files(self.__persist.downloaded_file_names)\n        self.__model_builder.set_extracted_files(self.__persist.extracted_file_names)\n\n        # Lftp\n        self.__lftp = Lftp(address=self.__context.config.lftp.remote_address,\n                           port=self.__context.config.lftp.remote_port,\n                           user=self.__context.config.lftp.remote_username,\n                           password=self.__password)\n        self.__lftp.set_base_logger(self.logger)\n        self.__lftp.set_base_remote_dir_path(self.__context.config.lftp.remote_path)\n        self.__lftp.set_base_local_dir_path(self.__context.config.lftp.local_path)\n        # Configure Lftp\n        self.__lftp.num_parallel_jobs = self.__context.config.lftp.num_max_parallel_downloads\n        self.__lftp.num_parallel_files = self.__context.config.lftp.num_max_parallel_files_per_download\n        self.__lftp.num_connections_per_root_file = self.__context.config.lftp.num_max_connections_per_root_file\n        self.__lftp.num_connections_per_dir_file = self.__context.config.lftp.num_max_connections_per_dir_file\n        self.__lftp.num_max_total_connections = self.__context.config.lftp.num_max_total_connections\n        self.__lftp.use_temp_file = self.__context.config.lftp.use_temp_file\n        self.__lftp.temp_file_name = \"*\" + Constants.LFTP_TEMP_FILE_SUFFIX\n        self.__lftp.set_verbose_logging(self.__context.config.general.verbose)\n\n        # Setup the scanners and scanner processes\n        self.__active_scanner = ActiveScanner(self.__context.config.lftp.local_path)\n        self.__local_scanner = LocalScanner(\n            local_path=self.__context.config.lftp.local_path,\n            use_temp_file=self.__context.config.lftp.use_temp_file\n        )\n        self.__remote_scanner = RemoteScanner(\n            remote_address=self.__context.config.lftp.remote_address,\n            remote_username=self.__context.config.lftp.remote_username,\n            remote_password=self.__password,\n            remote_port=self.__context.config.lftp.remote_port,\n            remote_path_to_scan=self.__context.config.lftp.remote_path,\n            local_path_to_scan_script=self.__context.args.local_path_to_scanfs,\n            remote_path_to_scan_script=self.__context.config.lftp.remote_path_to_scan_script\n        )\n\n        self.__active_scan_process = ScannerProcess(\n            scanner=self.__active_scanner,\n            interval_in_ms=self.__context.config.controller.interval_ms_downloading_scan,\n            verbose=False\n        )\n        self.__local_scan_process = ScannerProcess(\n            scanner=self.__local_scanner,\n            interval_in_ms=self.__context.config.controller.interval_ms_local_scan,\n        )\n        self.__remote_scan_process = ScannerProcess(\n            scanner=self.__remote_scanner,\n            interval_in_ms=self.__context.config.controller.interval_ms_remote_scan,\n        )\n\n        # Setup extract process\n        if self.__context.config.controller.use_local_path_as_extract_path:\n            out_dir_path = self.__context.config.lftp.local_path\n        else:\n            out_dir_path = self.__context.config.controller.extract_path\n        self.__extract_process = ExtractProcess(\n            out_dir_path=out_dir_path,\n            local_path=self.__context.config.lftp.local_path\n        )\n\n        # Setup multiprocess logging\n        self.__mp_logger = MultiprocessingLogger(self.logger)\n        self.__active_scan_process.set_multiprocessing_logger(self.__mp_logger)\n        self.__local_scan_process.set_multiprocessing_logger(self.__mp_logger)\n        self.__remote_scan_process.set_multiprocessing_logger(self.__mp_logger)\n        self.__extract_process.set_multiprocessing_logger(self.__mp_logger)\n\n        # Keep track of active files\n        self.__active_downloading_file_names = []\n        self.__active_extracting_file_names = []\n\n        # Keep track of active command processes\n        self.__active_command_processes = []\n\n        self.__started = False\n\n    def start(self):\n        \"\"\"\n        Start the controller\n        Must be called after ctor and before process()\n        :return:\n        \"\"\"\n        self.logger.debug(\"Starting controller\")\n        self.__active_scan_process.start()\n        self.__local_scan_process.start()\n        self.__remote_scan_process.start()\n        self.__extract_process.start()\n        self.__mp_logger.start()\n        self.__started = True\n\n    def process(self):\n        \"\"\"\n        Advance the controller state\n        This method should return relatively quickly as the heavy lifting is done by concurrent tasks\n        :return:\n        \"\"\"\n        if not self.__started:\n            raise ControllerError(\"Cannot process, controller is not started\")\n        self.__propagate_exceptions()\n        self.__cleanup_commands()\n        self.__process_commands()\n        self.__update_model()\n\n    def exit(self):\n        self.logger.debug(\"Exiting controller\")\n        if self.__started:\n            self.__lftp.exit()\n            self.__active_scan_process.terminate()\n            self.__local_scan_process.terminate()\n            self.__remote_scan_process.terminate()\n            self.__extract_process.terminate()\n            self.__active_scan_process.join()\n            self.__local_scan_process.join()\n            self.__remote_scan_process.join()\n            self.__extract_process.join()\n            self.__mp_logger.stop()\n            self.__started = False\n            self.logger.info(\"Exited controller\")\n\n    def get_model_files(self) -> List[ModelFile]:\n        \"\"\"\n        Returns a copy of all the model files\n        :return:\n        \"\"\"\n        # Lock the model\n        self.__model_lock.acquire()\n        model_files = self.__get_model_files()\n        # Release the model\n        self.__model_lock.release()\n        return model_files\n\n    def add_model_listener(self, listener: IModelListener):\n        \"\"\"\n        Adds a listener to the controller's model\n        :param listener:\n        :return:\n        \"\"\"\n        # Lock the model\n        self.__model_lock.acquire()\n        self.__model.add_listener(listener)\n        # Release the model\n        self.__model_lock.release()\n\n    def remove_model_listener(self, listener: IModelListener):\n        \"\"\"\n        Removes a listener from the controller's model\n        :param listener:\n        :return:\n        \"\"\"\n        # Lock the model\n        self.__model_lock.acquire()\n        self.__model.remove_listener(listener)\n        # Release the model\n        self.__model_lock.release()\n\n    def get_model_files_and_add_listener(self, listener: IModelListener):\n        \"\"\"\n        Adds a listener and returns the current state of model files in one atomic operation\n        This guarantees that model update events are not missed or duplicated for the clients\n        Without an atomic operation, the following scenarios can happen:\n            1. get_model() -> model updated -> add_listener()\n               The model update never propagates to client\n            2. add_listener() -> model updated -> get_model()\n               The model update is duplicated on client side (once through listener, and once\n               through the model).\n        :param listener:\n        :return:\n        \"\"\"\n        # Lock the model\n        self.__model_lock.acquire()\n        self.__model.add_listener(listener)\n        model_files = self.__get_model_files()\n        # Release the model\n        self.__model_lock.release()\n        return model_files\n\n    def queue_command(self, command: Command):\n        self.__command_queue.put(command)\n\n    def __get_model_files(self) -> List[ModelFile]:\n        model_files = []\n        for filename in self.__model.get_file_names():\n            model_files.append(copy.deepcopy(self.__model.get_file(filename)))\n        return model_files\n\n    def __update_model(self):\n        # Grab the latest scan results\n        latest_remote_scan = self.__remote_scan_process.pop_latest_result()\n        latest_local_scan = self.__local_scan_process.pop_latest_result()\n        latest_active_scan = self.__active_scan_process.pop_latest_result()\n\n        # Grab the Lftp status\n        lftp_statuses = None\n        try:\n            lftp_statuses = self.__lftp.status()\n        except LftpError as e:\n            self.logger.warning(\"Caught lftp error: {}\".format(str(e)))\n\n        # Grab the latest extract results\n        latest_extract_statuses = self.__extract_process.pop_latest_statuses()\n\n        # Grab the latest extracted file names\n        latest_extracted_results = self.__extract_process.pop_completed()\n\n        # Update list of active file names\n        if lftp_statuses is not None:\n            self.__active_downloading_file_names = [\n                s.name for s in lftp_statuses if s.state == LftpJobStatus.State.RUNNING\n            ]\n        if latest_extract_statuses is not None:\n            self.__active_extracting_file_names = [\n                s.name for s in latest_extract_statuses.statuses if s.state == ExtractStatus.State.EXTRACTING\n            ]\n\n        # Update the active scanner's state\n        self.__active_scanner.set_active_files(\n            self.__active_downloading_file_names + self.__active_extracting_file_names\n        )\n\n        # Update model builder state\n        if latest_remote_scan is not None:\n            self.__model_builder.set_remote_files(latest_remote_scan.files)\n        if latest_local_scan is not None:\n            self.__model_builder.set_local_files(latest_local_scan.files)\n        if latest_active_scan is not None:\n            self.__model_builder.set_active_files(latest_active_scan.files)\n        if lftp_statuses is not None:\n            self.__model_builder.set_lftp_statuses(lftp_statuses)\n        if latest_extract_statuses is not None:\n            self.__model_builder.set_extract_statuses(latest_extract_statuses.statuses)\n        if latest_extracted_results:\n            for result in latest_extracted_results:\n                self.__persist.extracted_file_names.add(result.name)\n            self.__model_builder.set_extracted_files(self.__persist.extracted_file_names)\n\n        # Build the new model, if needed\n        if self.__model_builder.has_changes():\n            new_model = self.__model_builder.build_model()\n\n            # Lock the model\n            self.__model_lock.acquire()\n\n            # Diff the new model with old model\n            model_diff = ModelDiffUtil.diff_models(self.__model, new_model)\n\n            # Apply changes to the new model\n            for diff in model_diff:\n                if diff.change == ModelDiff.Change.ADDED:\n                    self.__model.add_file(diff.new_file)\n                elif diff.change == ModelDiff.Change.REMOVED:\n                    self.__model.remove_file(diff.old_file.name)\n                elif diff.change == ModelDiff.Change.UPDATED:\n                    self.__model.update_file(diff.new_file)\n\n                # Detect if a file was just Downloaded\n                #   an Added file in Downloaded state\n                #   an Updated file transitioning to Downloaded state\n                # If so, update the persist state\n                # Note: This step is done after the new model is build because\n                #       model_builder is the one that discovers when a file is Downloaded\n                downloaded = False\n                if diff.change == ModelDiff.Change.ADDED and \\\n                        diff.new_file.state == ModelFile.State.DOWNLOADED:\n                    downloaded = True\n                elif diff.change == ModelDiff.Change.UPDATED and \\\n                        diff.new_file.state == ModelFile.State.DOWNLOADED and \\\n                        diff.old_file.state != ModelFile.State.DOWNLOADED:\n                    downloaded = True\n                if downloaded:\n                    self.__persist.downloaded_file_names.add(diff.new_file.name)\n                    self.__model_builder.set_downloaded_files(self.__persist.downloaded_file_names)\n\n            # Prune the extracted files list of any files that were deleted locally\n            # This prevents these files from going to EXTRACTED state if they are re-downloaded\n            remove_extracted_file_names = set()\n            existing_file_names = self.__model.get_file_names()\n            for extracted_file_name in self.__persist.extracted_file_names:\n                if extracted_file_name in existing_file_names:\n                    file = self.__model.get_file(extracted_file_name)\n                    if file.state == ModelFile.State.DELETED:\n                        # Deleted locally, remove\n                        remove_extracted_file_names.add(extracted_file_name)\n                else:\n                    # Not in the model at all\n                    # This could be because local and remote scans are not yet available\n                    pass\n            if remove_extracted_file_names:\n                self.logger.info(\"Removing from extracted list: {}\".format(remove_extracted_file_names))\n                self.__persist.extracted_file_names.difference_update(remove_extracted_file_names)\n                self.__model_builder.set_extracted_files(self.__persist.extracted_file_names)\n\n            # Release the model\n            self.__model_lock.release()\n\n        # Update the controller status\n        if latest_remote_scan is not None:\n            self.__context.status.controller.latest_remote_scan_time = latest_remote_scan.timestamp\n            self.__context.status.controller.latest_remote_scan_failed = latest_remote_scan.failed\n            self.__context.status.controller.latest_remote_scan_error = latest_remote_scan.error_message\n        if latest_local_scan is not None:\n            self.__context.status.controller.latest_local_scan_time = latest_local_scan.timestamp\n\n    def __process_commands(self):\n        def _notify_failure(_command: Controller.Command, _msg: str):\n            self.logger.warning(\"Command failed. {}\".format(_msg))\n            for _callback in _command.callbacks:\n                _callback.on_failure(_msg)\n\n        while not self.__command_queue.empty():\n            command = self.__command_queue.get()\n            self.logger.info(\"Received command {} for file {}\".format(str(command.action), command.filename))\n            try:\n                file = self.__model.get_file(command.filename)\n            except ModelError:\n                _notify_failure(command, \"File '{}' not found\".format(command.filename))\n                continue\n\n            if command.action == Controller.Command.Action.QUEUE:\n                if file.remote_size is None:\n                    _notify_failure(command, \"File '{}' does not exist remotely\".format(command.filename))\n                    continue\n                try:\n                    self.__lftp.queue(file.name, file.is_dir)\n                except LftpError as e:\n                    _notify_failure(command, \"Lftp error: \".format(str(e)))\n                    continue\n\n            elif command.action == Controller.Command.Action.STOP:\n                if file.state not in (ModelFile.State.DOWNLOADING, ModelFile.State.QUEUED):\n                    _notify_failure(command, \"File '{}' is not Queued or Downloading\".format(command.filename))\n                    continue\n                try:\n                    self.__lftp.kill(file.name)\n                except LftpError as e:\n                    _notify_failure(command, \"Lftp error: \".format(str(e)))\n                    continue\n\n            elif command.action == Controller.Command.Action.EXTRACT:\n                # Note: We don't check the is_extractable flag because it's just a guess\n                if file.state not in (\n                        ModelFile.State.DEFAULT,\n                        ModelFile.State.DOWNLOADED,\n                        ModelFile.State.EXTRACTED\n                ):\n                    _notify_failure(command, \"File '{}' in state {} cannot be extracted\".format(\n                        command.filename, str(file.state)\n                    ))\n                    continue\n                elif file.local_size is None:\n                    _notify_failure(command, \"File '{}' does not exist locally\".format(command.filename))\n                    continue\n                else:\n                    self.__extract_process.extract(file)\n\n            elif command.action == Controller.Command.Action.DELETE_LOCAL:\n                if file.state not in (\n                    ModelFile.State.DEFAULT,\n                    ModelFile.State.DOWNLOADED,\n                    ModelFile.State.EXTRACTED\n                ):\n                    _notify_failure(command, \"Local file '{}' cannot be deleted in state {}\".format(\n                        command.filename, str(file.state)\n                    ))\n                    continue\n                elif file.local_size is None:\n                    _notify_failure(command, \"File '{}' does not exist locally\".format(command.filename))\n                    continue\n                else:\n                    process = DeleteLocalProcess(\n                        local_path=self.__context.config.lftp.local_path,\n                        file_name=file.name\n                    )\n                    process.set_multiprocessing_logger(self.__mp_logger)\n                    post_callback = self.__local_scan_process.force_scan\n                    command_wrapper = Controller.CommandProcessWrapper(\n                        process=process,\n                        post_callback=post_callback\n                    )\n                    self.__active_command_processes.append(command_wrapper)\n                    command_wrapper.process.start()\n\n            elif command.action == Controller.Command.Action.DELETE_REMOTE:\n                if file.state not in (\n                    ModelFile.State.DEFAULT,\n                    ModelFile.State.DOWNLOADED,\n                    ModelFile.State.EXTRACTED,\n                    ModelFile.State.DELETED\n                ):\n                    _notify_failure(command, \"Remote file '{}' cannot be deleted in state {}\".format(\n                        command.filename, str(file.state)\n                    ))\n                    continue\n                elif file.remote_size is None:\n                    _notify_failure(command, \"File '{}' does not exist remotely\".format(command.filename))\n                    continue\n                else:\n                    process = DeleteRemoteProcess(\n                        remote_address=self.__context.config.lftp.remote_address,\n                        remote_username=self.__context.config.lftp.remote_username,\n                        remote_password=self.__password,\n                        remote_port=self.__context.config.lftp.remote_port,\n                        remote_path=self.__context.config.lftp.remote_path,\n                        file_name=file.name\n                    )\n                    process.set_multiprocessing_logger(self.__mp_logger)\n                    post_callback = self.__remote_scan_process.force_scan\n                    command_wrapper = Controller.CommandProcessWrapper(\n                        process=process,\n                        post_callback=post_callback\n                    )\n                    self.__active_command_processes.append(command_wrapper)\n                    command_wrapper.process.start()\n\n            # If we get here, it was a success\n            for callback in command.callbacks:\n                callback.on_success()\n\n    def __propagate_exceptions(self):\n        \"\"\"\n        Propagate any exceptions from child processes/threads to this thread\n        :return:\n        \"\"\"\n        self.__lftp.raise_pending_error()\n        self.__active_scan_process.propagate_exception()\n        self.__local_scan_process.propagate_exception()\n        self.__remote_scan_process.propagate_exception()\n        self.__mp_logger.propagate_exception()\n        self.__extract_process.propagate_exception()\n\n    def __cleanup_commands(self):\n        \"\"\"\n        Cleanup the list of active commands and do any callbacks\n        :return:\n        \"\"\"\n        still_active_processes = []\n        for command_process in self.__active_command_processes:\n            if command_process.process.is_alive():\n                still_active_processes.append(command_process)\n            else:\n                # Do the post callback\n                command_process.post_callback()\n                # Propagate the exception\n                command_process.process.propagate_exception()\n        self.__active_command_processes = still_active_processes\n"
  },
  {
    "path": "src/python/controller/controller_job.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\n\n# my libs\nfrom common import overrides, Job, Context\nfrom .controller import Controller\nfrom .auto_queue import AutoQueue\n\n\nclass ControllerJob(Job):\n    \"\"\"\n    The controller service\n    Handles querying and downloading of files\n    \"\"\"\n    def __init__(self,\n                 context: Context,\n                 controller: Controller,\n                 auto_queue: AutoQueue):\n        super().__init__(name=self.__class__.__name__, context=context)\n        self.__controller = controller\n        self.__auto_queue = auto_queue\n\n    @overrides(Job)\n    def setup(self):\n        self.__controller.start()\n\n    @overrides(Job)\n    def execute(self):\n        self.__controller.process()\n        self.__auto_queue.process()\n\n    @overrides(Job)\n    def cleanup(self):\n        self.__controller.exit()\n"
  },
  {
    "path": "src/python/controller/controller_persist.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\n\nfrom common import overrides, Constants, Persist, PersistError\n\n\nclass ControllerPersist(Persist):\n    \"\"\"\n    Persisting state for controller\n    \"\"\"\n\n    # Keys\n    __KEY_DOWNLOADED_FILE_NAMES = \"downloaded\"\n    __KEY_EXTRACTED_FILE_NAMES = \"extracted\"\n\n    def __init__(self):\n        self.downloaded_file_names = set()\n        self.extracted_file_names = set()\n\n    @classmethod\n    @overrides(Persist)\n    def from_str(cls: \"ControllerPersist\", content: str) -> \"ControllerPersist\":\n        persist = ControllerPersist()\n        try:\n            dct = json.loads(content)\n            persist.downloaded_file_names = set(dct[ControllerPersist.__KEY_DOWNLOADED_FILE_NAMES])\n            persist.extracted_file_names = set(dct[ControllerPersist.__KEY_EXTRACTED_FILE_NAMES])\n            return persist\n        except (json.decoder.JSONDecodeError, KeyError) as e:\n            raise PersistError(\"Error parsing AutoQueuePersist - {}: {}\".format(\n                type(e).__name__, str(e))\n            )\n\n    @overrides(Persist)\n    def to_str(self) -> str:\n        dct = dict()\n        dct[ControllerPersist.__KEY_DOWNLOADED_FILE_NAMES] = list(self.downloaded_file_names)\n        dct[ControllerPersist.__KEY_EXTRACTED_FILE_NAMES] = list(self.extracted_file_names)\n        return json.dumps(dct, indent=Constants.JSON_PRETTY_PRINT_INDENT)\n"
  },
  {
    "path": "src/python/controller/delete/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .delete_process import DeleteLocalProcess, DeleteRemoteProcess\n"
  },
  {
    "path": "src/python/controller/delete/delete_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nimport shutil\nfrom typing import Optional\n\nfrom common import AppOneShotProcess\nfrom ssh import Sshcp, SshcpError\n\n\nclass DeleteLocalProcess(AppOneShotProcess):\n    def __init__(self, local_path: str, file_name: str):\n        super().__init__(name=self.__class__.__name__)\n        self.__local_path = local_path\n        self.__file_name = file_name\n\n    def run_once(self):\n        file_path = os.path.join(self.__local_path, self.__file_name)\n        self.logger.debug(\"Deleting local file {}\".format(self.__file_name))\n        if not os.path.exists(file_path):\n            self.logger.error(\"Failed to delete non-existing file: {}\".format(file_path))\n        else:\n            if os.path.isfile(file_path):\n                os.remove(file_path)\n            else:\n                shutil.rmtree(file_path, ignore_errors=True)\n\n\nclass DeleteRemoteProcess(AppOneShotProcess):\n    def __init__(self,\n                 remote_address: str,\n                 remote_username: str,\n                 remote_password: Optional[str],\n                 remote_port: int,\n                 remote_path: str,\n                 file_name: str):\n        super().__init__(name=self.__class__.__name__)\n        self.__remote_path = remote_path\n        self.__file_name = file_name\n        self.__ssh = Sshcp(host=remote_address,\n                           port=remote_port,\n                           user=remote_username,\n                           password=remote_password)\n\n    def run_once(self):\n        self.__ssh.set_base_logger(self.logger)\n        file_path = os.path.join(self.__remote_path, self.__file_name)\n        self.logger.debug(\"Deleting remote file {}\".format(self.__file_name))\n        try:\n            out = self.__ssh.shell(\"rm -rf '{}'\".format(file_path))\n            self.logger.debug(\"Remote delete output: {}\".format(out.decode()))\n        except SshcpError:\n            self.logger.exception(\"Exception while deleting remote file\")\n"
  },
  {
    "path": "src/python/controller/extract/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .extract import Extract, ExtractError\nfrom .dispatch import ExtractDispatch, ExtractDispatchError, ExtractListener, ExtractStatus\nfrom .extract_process import ExtractProcess, ExtractStatusResult, ExtractCompletedResult\n"
  },
  {
    "path": "src/python/controller/extract/dispatch.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom enum import Enum\nfrom typing import List\nimport queue\nimport logging\nimport os\nimport threading\nimport time\nfrom abc import ABC, abstractmethod\nimport re\n\nfrom .extract import Extract, ExtractError\nfrom model import ModelFile\nfrom common import AppError\n\n\nclass ExtractDispatchError(AppError):\n    pass\n\n\nclass ExtractListener(ABC):\n    @abstractmethod\n    def extract_completed(self, name: str, is_dir: bool):\n        pass\n\n    @abstractmethod\n    def extract_failed(self, name: str, is_dir: bool):\n        pass\n\n\nclass ExtractStatus:\n    \"\"\"\n    Represents the status of a single extraction request\n    \"\"\"\n\n    class State(Enum):\n        EXTRACTING = 0\n\n    def __init__(self, name: str, is_dir: bool, state: State):\n        self.__name = name\n        self.__is_dir = is_dir\n        self.__state = state\n\n    @property\n    def name(self) -> str: return self.__name\n\n    @property\n    def is_dir(self) -> bool: return self.__is_dir\n\n    @property\n    def state(self) -> State: return self.__state\n\n    def __eq__(self, other):\n        return self.__dict__ == other.__dict__\n\n\nclass ExtractDispatch:\n\n    __WORKER_SLEEP_INTERVAL_IN_SECS = 0.5\n\n    class _Task:\n        def __init__(self, root_name: str, root_is_dir: bool):\n            self.root_name = root_name\n            self.root_is_dir = root_is_dir\n            self.archive_paths = []  # list of (archive path, out path) pairs\n\n        def add_archive(self, archive_path: str, out_dir_path: str):\n            self.archive_paths.append((archive_path, out_dir_path))\n\n    def __init__(self, out_dir_path: str, local_path: str):\n        self.__out_dir_path = out_dir_path\n        self.__local_path = local_path\n\n        self.__task_queue = queue.Queue()\n        self.__worker = threading.Thread(name=\"ExtractWorker\",\n                                         target=self.__worker)\n        self.__worker_shutdown = threading.Event()\n\n        self.__listeners = []\n        self.__listeners_lock = threading.Lock()\n\n        self.logger = logging.getLogger(self.__class__.__name__)\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(self.__class__.__name__)\n\n    def start(self):\n        self.__worker.start()\n\n    def stop(self):\n        self.__worker_shutdown.set()\n        self.__worker.join()\n\n    def add_listener(self, listener: ExtractListener):\n        self.__listeners_lock.acquire()\n        self.__listeners.append(listener)\n        self.__listeners_lock.release()\n\n    def status(self) -> List[ExtractStatus]:\n        tasks = list(self.__task_queue.queue)\n        statuses = []\n        for task in tasks:\n            status = ExtractStatus(name=task.root_name,\n                                   is_dir=task.root_is_dir,\n                                   state=ExtractStatus.State.EXTRACTING)\n            statuses.append(status)\n        return statuses\n\n    def extract(self, model_file: ModelFile):\n        self.logger.debug(\"Received extract for {}\".format(model_file.name))\n\n        for task in self.__task_queue.queue:\n            if task.root_name == model_file.name:\n                self.logger.info(\"Ignoring extract for {}, already exists\".format(model_file.name))\n                return\n\n        # noinspection PyProtectedMember\n        task = ExtractDispatch._Task(model_file.name, model_file.is_dir)\n\n        if model_file.is_dir:\n            # For a directory, try and find all archives\n            # Loop through all directories using BFS\n            frontier = [model_file]\n            while frontier:\n                curr_file = frontier.pop(0)\n                if curr_file.is_dir:\n                    frontier += curr_file.get_children()\n                else:\n                    archive_full_path = os.path.join(self.__local_path, curr_file.full_path)\n                    out_dir_path = os.path.join(self.__out_dir_path, os.path.dirname(curr_file.full_path))\n                    if curr_file.local_size is not None \\\n                            and curr_file.local_size > 0 \\\n                            and Extract.is_archive(archive_full_path):\n                        task.add_archive(archive_path=archive_full_path,\n                                         out_dir_path=out_dir_path)\n\n            # Coalesce extractions\n            ExtractDispatch.__coalesce_extractions(task)\n\n            # Verify that there was at least one archive file\n            if len(task.archive_paths) > 0:\n                self.__task_queue.put(task)\n            else:\n                raise ExtractDispatchError(\n                    \"Directory does not contain any archives: {}\".format(model_file.name)\n                )\n        else:\n            # For a single file, it must exist locally and must be an archive\n            if model_file.local_size in (None, 0):\n                raise ExtractDispatchError(\"File does not exist locally: {}\".format(model_file.name))\n            archive_full_path = os.path.join(self.__local_path, model_file.name)\n            if not Extract.is_archive(archive_full_path):\n                raise ExtractDispatchError(\"File is not an archive: {}\".format(model_file.name))\n            task.add_archive(archive_path=archive_full_path,\n                             out_dir_path=self.__out_dir_path)\n            self.__task_queue.put(task)\n\n    def __worker(self):\n        self.logger.debug(\"Started worker thread\")\n\n        while not self.__worker_shutdown.is_set():\n            # Try to grab next task\n            # Do another check for shutdown\n            while len(self.__task_queue.queue) > 0 and not self.__worker_shutdown.is_set():\n                # peek the task\n                task = self.__task_queue.queue[0]\n\n                # We have a task, extract archives one by one\n                completed = True\n\n                try:\n                    for archive_path, out_dir_path in task.archive_paths:\n                        if self.__worker_shutdown.is_set():\n                            # exit early\n                            self.logger.warning(\"Extraction failed, shutdown requested\")\n                            completed = False\n                            break\n\n                        self.logger.debug(\"Extracting {}\".format(archive_path))\n                        Extract.extract_archive(\n                            archive_path=archive_path,\n                            out_dir_path=out_dir_path\n                        )\n\n                except ExtractError:\n                    self.logger.exception(\"Caught an extraction error\")\n                    completed = False\n                finally:\n                    # pop the task\n                    self.__task_queue.get(block=False)\n\n                # Send notification to listeners\n                self.__listeners_lock.acquire()\n                for listener in self.__listeners:\n                    if completed:\n                        listener.extract_completed(task.root_name, task.root_is_dir)\n                    else:\n                        listener.extract_failed(task.root_name, task.root_is_dir)\n                self.__listeners_lock.release()\n\n            time.sleep(ExtractDispatch.__WORKER_SLEEP_INTERVAL_IN_SECS)\n\n        self.logger.debug(\"Stopped worker thread\")\n\n    @staticmethod\n    def __coalesce_extractions(task: _Task):\n        \"\"\"\n        Remove duplicate extractions due to split files\n        :param task:\n        :return:\n        \"\"\"\n        # Filter out any rxx files for a split rar\n        filtered_paths = []\n        for archive_path, out_path in task.archive_paths:\n            file_ext = os.path.splitext(os.path.basename(archive_path))[1]\n            if not re.match(\"^\\.r\\d{2,}$\", file_ext):\n                filtered_paths.append((archive_path, out_path))\n        task.archive_paths = filtered_paths\n"
  },
  {
    "path": "src/python/controller/extract/extract.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\n\nimport patoolib\nimport patoolib.util\n\nfrom common import AppError\n\n\nclass ExtractError(AppError):\n    \"\"\"\n    Indicates an extraction error\n    \"\"\"\n    pass\n\n\nclass Extract:\n    \"\"\"\n    Utility to extract archive files\n    \"\"\"\n    @staticmethod\n    def is_archive(archive_path: str) -> bool:\n        if not os.path.isfile(archive_path):\n            return False\n        try:\n            # noinspection PyUnusedLocal,PyShadowingBuiltins\n            format, compression = patoolib.get_archive_format(archive_path)\n            return True\n        except patoolib.util.PatoolError:\n            return False\n\n    @staticmethod\n    def is_archive_fast(archive_path: str) -> bool:\n        \"\"\"\n        Fast version of is_archive that only looks at file extension\n        May return false negatives\n        :param archive_path:\n        :return:\n        \"\"\"\n        file_ext = os.path.splitext(os.path.basename(archive_path))[1]\n        if file_ext:\n            file_ext = file_ext[1:]  # remove the dot\n            # noinspection SpellCheckingInspection\n            return file_ext in [\n                \"7z\",\n                \"bz2\",\n                \"gz\",\n                \"lz\",\n                \"rar\",\n                \"tar\", \"tgz\", \"tbz2\",\n                \"zip\", \"zipx\"\n            ]\n        else:\n            return False\n\n    @staticmethod\n    def extract_archive(archive_path: str, out_dir_path: str):\n        if not Extract.is_archive(archive_path):\n            raise ExtractError(\"Path is not a valid archive: {}\".format(archive_path))\n        try:\n            # Try to create the outdir path\n            if not os.path.exists(out_dir_path):\n                os.makedirs(out_dir_path)\n            patoolib.extract_archive(archive_path, outdir=out_dir_path, interactive=False)\n        except FileNotFoundError as e:\n            raise ExtractError(str(e))\n        except patoolib.util.PatoolError as e:\n            raise ExtractError(str(e))\n"
  },
  {
    "path": "src/python/controller/extract/extract_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport multiprocessing\nimport datetime\nimport time\nimport queue\nfrom typing import Optional, List\nimport logging\n\nfrom .dispatch import ExtractDispatch, ExtractStatus, ExtractListener, ExtractDispatchError\nfrom common import overrides, AppProcess\nfrom model import ModelFile\n\n\nclass ExtractStatusResult:\n    def __init__(self, timestamp: datetime, statuses: List[ExtractStatus]):\n        self.timestamp = timestamp\n        self.statuses = statuses\n\n\nclass ExtractCompletedResult:\n    def __init__(self, timestamp: datetime, name: str, is_dir: bool):\n        self.timestamp = timestamp\n        self.name = name\n        self.is_dir = is_dir\n\n\nclass ExtractProcess(AppProcess):\n    __DEFAULT_SLEEP_INTERVAL_IN_SECS = 0.5\n\n    class __ExtractListener(ExtractListener):\n        def __init__(self, logger: logging.Logger, completed_queue: multiprocessing.Queue):\n            self.logger = logger\n            self.completed_queue = completed_queue\n\n        def extract_completed(self, name: str, is_dir: bool):\n            self.logger.info(\"Extraction completed for {}\".format(name))\n            completed_result = ExtractCompletedResult(timestamp=datetime.datetime.now(),\n                                                      name=name,\n                                                      is_dir=is_dir)\n            self.completed_queue.put(completed_result)\n\n        def extract_failed(self, name: str, is_dir: bool):\n            self.logger.error(\"Extraction failed for {}\".format(name))\n\n    def __init__(self, out_dir_path: str, local_path: str):\n        super().__init__(name=self.__class__.__name__)\n        self.__out_dir_path = out_dir_path\n        self.__local_path = local_path\n        self.__command_queue = multiprocessing.Queue()\n        self.__status_result_queue = multiprocessing.Queue()\n        self.__completed_result_queue = multiprocessing.Queue()\n        self.__dispatch = None\n\n    @overrides(AppProcess)\n    def run_init(self):\n        # Create dispatch inside the process\n        self.__dispatch = ExtractDispatch(out_dir_path=self.__out_dir_path,\n                                          local_path=self.__local_path)\n\n        # Add extract listener\n        listener = ExtractProcess.__ExtractListener(\n            logger=self.logger,\n            completed_queue=self.__completed_result_queue\n        )\n        self.__dispatch.add_listener(listener)\n\n        # Start dispatch\n        self.__dispatch.start()\n\n    @overrides(AppProcess)\n    def run_cleanup(self):\n        self.__dispatch.stop()\n\n    @overrides(AppProcess)\n    def run_loop(self):\n        # Forward all the extract commands\n        try:\n            while True:\n                file = self.__command_queue.get(block=False)\n                try:\n                    self.__dispatch.extract(file)\n                except ExtractDispatchError as e:\n                    self.logger.warning(str(e))\n        except queue.Empty:\n            pass\n\n        # Queue the latest status\n        statuses = self.__dispatch.status()\n        status_result = ExtractStatusResult(timestamp=datetime.datetime.now(),\n                                            statuses=statuses)\n        self.__status_result_queue.put(status_result)\n\n        time.sleep(ExtractProcess.__DEFAULT_SLEEP_INTERVAL_IN_SECS)\n\n    def extract(self, file: ModelFile):\n        \"\"\"\n        Process-safe method to queue an extraction\n        :param file:\n        :return:\n        \"\"\"\n        self.__command_queue.put(file)\n\n    def pop_latest_statuses(self) -> Optional[ExtractStatusResult]:\n        \"\"\"\n        Process-safe method to retrieve latest extract status\n        Returns none if no new status is available since the last time\n        this method was called\n        :return:\n        \"\"\"\n        latest_result = None\n        try:\n            while True:\n                latest_result = self.__status_result_queue.get(block=False)\n        except queue.Empty:\n            pass\n        return latest_result\n\n    def pop_completed(self) -> List[ExtractCompletedResult]:\n        \"\"\"\n        Process-safe method to retrieve list of newly completed extractions\n        Returns an empty list if no new extractions were completed since the\n        last time this method was called.\n        :return:\n        \"\"\"\n        completed = []\n        try:\n            while True:\n                result = self.__completed_result_queue.get(block=False)\n                completed.append(result)\n        except queue.Empty:\n            pass\n        return completed\n"
  },
  {
    "path": "src/python/controller/model_builder.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nimport logging\nfrom typing import List, Optional, Set\nimport math\n\n# my libs\nfrom system import SystemFile\nfrom lftp import LftpJobStatus\nfrom model import ModelFile, Model, ModelError\nfrom .extract import ExtractStatus, Extract\n\n\nclass ModelBuilder:\n    \"\"\"\n    ModelBuilder combines all the difference sources of file system info\n    to build a model. These sources include:\n      * downloading file system as a Dict[name, SystemFile]\n      * local file system as a Dict[name, SystemFile]\n      * remote file system as a Dict[name, SystemFile]\n      * lftp status as Dict[name, LftpJobStatus]\n    \"\"\"\n    def __init__(self):\n        self.logger = logging.getLogger(\"ModelBuilder\")\n        self.__local_files = dict()\n        self.__remote_files = dict()\n        self.__lftp_statuses = dict()\n        self.__downloaded_files = set()\n        self.__extract_statuses = dict()\n        self.__extracted_files = set()\n        self.__cached_model = None\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"ModelBuilder\")\n\n    def set_active_files(self, active_files: List[SystemFile]):\n        # Update the local file state with this latest information\n        for file in active_files:\n            self.__local_files[file.name] = file\n        # Invalidate the cache\n        if len(active_files) > 0:\n            self.__cached_model = None\n\n    def set_local_files(self, local_files: List[SystemFile]):\n        prev_local_files = self.__local_files\n        self.__local_files = {file.name: file for file in local_files}\n        # Invalidate the cache\n        if self.__local_files != prev_local_files:\n            self.__cached_model = None\n\n    def set_remote_files(self, remote_files: List[SystemFile]):\n        prev_remote_files = self.__remote_files\n        self.__remote_files = {file.name: file for file in remote_files}\n        # Invalidate the cache\n        if self.__remote_files != prev_remote_files:\n            self.__cached_model = None\n\n    def set_lftp_statuses(self, lftp_statuses: List[LftpJobStatus]):\n        prev_lftp_statuses = self.__lftp_statuses\n        self.__lftp_statuses = {file.name: file for file in lftp_statuses}\n        # Invalidate the cache\n        if self.__lftp_statuses != prev_lftp_statuses:\n            self.__cached_model = None\n\n    def set_downloaded_files(self, downloaded_files: Set[str]):\n        prev_downloaded_files = self.__downloaded_files\n        self.__downloaded_files = downloaded_files\n        # Invalidate the cache\n        if self.__downloaded_files != prev_downloaded_files:\n            self.__cached_model = None\n\n    def set_extract_statuses(self, extract_statuses: List[ExtractStatus]):\n        prev_extract_statuses = self.__extract_statuses\n        self.__extract_statuses = {status.name: status for status in extract_statuses}\n        # Invalidate the cache\n        if self.__extract_statuses != prev_extract_statuses:\n            self.__cached_model = None\n\n    def set_extracted_files(self, extracted_files: Set[str]):\n        prev_extracted_files = self.__extracted_files\n        self.__extracted_files = extracted_files\n        # Invalidate the cache\n        if self.__extracted_files != prev_extracted_files:\n            self.__cached_model = None\n\n    def clear(self):\n        self.__local_files.clear()\n        self.__remote_files.clear()\n        self.__lftp_statuses.clear()\n        self.__downloaded_files.clear()\n        self.__extract_statuses.clear()\n        self.__extracted_files.clear()\n        self.__cached_model = None\n\n    def has_changes(self) -> bool:\n        \"\"\"\n        Returns true is model has changes and requires rebuild\n        :return:\n        \"\"\"\n        return self.__cached_model is None\n\n    def build_model(self) -> Model:\n        if self.__cached_model is not None:\n            return self.__cached_model\n\n        model = Model()\n        model.set_base_logger(logging.getLogger(\"dummy\"))  # ignore the logs for this temp model\n        all_file_names = set().union(self.__local_files.keys(),\n                                     self.__remote_files.keys(),\n                                     self.__lftp_statuses.keys())\n        for name in all_file_names:\n            remote = self.__remote_files.get(name, None)\n            local = self.__local_files.get(name, None)\n            status = self.__lftp_statuses.get(name, None)\n\n            if remote is None and local is None and status is None:\n                # this should never happen, but just in case\n                raise ModelError(\"Zero sources have a file object\")\n\n            # sanity check between the sources\n            is_dir = remote.is_dir if remote else local.is_dir if local else status.type == LftpJobStatus.Type.MIRROR\n            if (remote and is_dir != remote.is_dir) or \\\n               (local and is_dir != local.is_dir) or \\\n               (status and is_dir != (status.type == LftpJobStatus.Type.MIRROR)):\n                raise ModelError(\"Mismatch in is_dir between sources\")\n\n            def __fill_model_file(_model_file: ModelFile,\n                                  _remote: Optional[SystemFile],\n                                  _local: Optional[SystemFile],\n                                  _transfer_state: Optional[LftpJobStatus.TransferState]):\n                # set local and remote sizes\n                if _remote:\n                    _model_file.remote_size = _remote.size\n                if _local:\n                    _model_file.local_size = _local.size\n\n                # Note: no longer use lftp's file sizes\n                #       they represent remaining size for resumed downloads\n\n                # set the downloading speed and eta\n                if _transfer_state:\n                    _model_file.downloading_speed = _transfer_state.speed\n                    _model_file.eta = _transfer_state.eta\n\n                # set the transferred size (only if file or dir exists on both ends)\n                if _local and _remote:\n                    if _model_file.is_dir:\n                        # dir transferred size is updated by child files\n                        _model_file.transferred_size = 0\n                    else:\n                        _model_file.transferred_size = min(_local.size, _remote.size)\n\n                        # also update all parent directories\n                        _parent_file = _model_file.parent\n                        while _parent_file is not None:\n                            _parent_file.transferred_size += _model_file.transferred_size\n                            _parent_file = _parent_file.parent\n\n                # set the is_extractable flag\n                if not _model_file.is_dir and Extract.is_archive_fast(_model_file.name):\n                    _model_file.is_extractable = True\n                    # Also set the flag for all of its parents\n                    _parent_file = _model_file.parent\n                    while _parent_file is not None:\n                        _parent_file.is_extractable = True\n                        _parent_file = _parent_file.parent\n\n                # set the timestamps\n                if _local:\n                    if _local.timestamp_created:\n                        _model_file.local_created_timestamp = _local.timestamp_created\n                    if _local.timestamp_modified:\n                        _model_file.local_modified_timestamp = _local.timestamp_modified\n                if _remote:\n                    if _remote.timestamp_created:\n                        _model_file.remote_created_timestamp = _remote.timestamp_created\n                    if _remote.timestamp_modified:\n                        _model_file.remote_modified_timestamp = _remote.timestamp_modified\n\n            model_file = ModelFile(name, is_dir)\n            # set the file state\n            # for now we only set to Queued or Downloading\n            # later after all children are built, we can set to Downloaded after performing a check\n            if status:\n                model_file.state = ModelFile.State.QUEUED if status.state == LftpJobStatus.State.QUEUED \\\n                                   else ModelFile.State.DOWNLOADING\n            # fill the rest\n            __fill_model_file(model_file,\n                              remote,\n                              local,\n                              status.total_transfer_state if status and status.state == LftpJobStatus.State.RUNNING\n                              else None)\n\n            # Traverse SystemFile children tree in BFS order\n            # Store (remote, local, status, model_file) tuple in traversal frontier where remote and local\n            # correspond to the same node in both remote and local SystemFile trees, status corresponds\n            # to the LFTP status for the entire tree, and model_file corresponds to the generated ModelFile\n            # for the pair\n            # Note: in this case the frontier contains nodes that have already been process, it is\n            #       merely used for traversing children\n            frontier = []\n            if remote or local:\n                frontier.append((remote, local, status, model_file))\n            while frontier:\n                _remote, _local, _status, _model_file = frontier.pop(0)\n                _remote_children = {sf.name: sf for sf in _remote.children} if _remote else {}\n                _local_children = {sf.name: sf for sf in _local.children} if _local else {}\n                _all_children_names = set().union(_remote_children.keys(), _local_children.keys())\n                for _child_name in _all_children_names:\n                    _remote_child = _remote_children.get(_child_name, None)\n                    _local_child = _local_children.get(_child_name, None)\n                    _is_dir = _remote_child.is_dir if _remote_child else _local_child.is_dir\n                    # sanity check is_dir\n                    if (_remote_child and _is_dir != _remote_child.is_dir) or \\\n                       (_local_child and _is_dir != _local_child.is_dir):\n                        raise ModelError(\"Mismatch in is_dir between child sources\")\n                    _child_model_file = ModelFile(_child_name, _is_dir)\n\n                    # add it to the parent right away so we can access the full path\n                    _model_file.add_child(_child_model_file)\n\n                    # find the transfer state (if it exists) corresponding to this child\n                    # Note: transfer states are in full paths\n                    # Note2: transfer states don't include root path\n                    _child_status_path = os.path.join(*(_child_model_file.full_path.split(os.sep)[1:]))\n                    _child_transfer_state = None\n                    if _status:\n                        _child_transfer_state = next((ts for n, ts in _status.get_active_file_transfer_states()\n                                                     if n == _child_status_path), None)\n                    # Set the state, first matching criteria below decides state\n                    #   child is a directory: Default\n                    #   child is active: Downloading\n                    #   child local_size >= remote_size: Downloaded\n                    #   remote child exists and root is Queued or Downloading: Queued\n                    #   Default\n                    # Result:\n                    #   subdirectories are always Default\n                    #   downloading files are Downloading\n                    #   finished files are Downloaded\n                    #   Queued and Downloading root's unfinished files are Queued\n                    #   Local-only files are Default\n                    if _is_dir:\n                        _child_model_file.state = ModelFile.State.DEFAULT\n                    elif _child_transfer_state:\n                        _child_model_file.state = ModelFile.State.DOWNLOADING\n                    elif _remote_child and _local_child and _local_child.size >= _remote_child.size:\n                        _child_model_file.state = ModelFile.State.DOWNLOADED\n                    elif _remote_child and model_file.state in (ModelFile.State.QUEUED, ModelFile.State.DOWNLOADING):\n                        _child_model_file.state = ModelFile.State.QUEUED\n                    else:\n                        _child_model_file.state = ModelFile.State.DEFAULT\n\n                    # fill the rest\n                    __fill_model_file(_child_model_file,\n                                      _remote_child,\n                                      _local_child,\n                                      _child_transfer_state)\n                    # add child to frontier\n                    frontier.append((_remote_child, _local_child, _status, _child_model_file))\n\n            # estimate the ETA for the root if it's not available\n            if model_file.state == ModelFile.State.DOWNLOADING and \\\n                    model_file.eta is None and \\\n                    model_file.downloading_speed is not None and \\\n                    model_file.downloading_speed > 0 and \\\n                    model_file.transferred_size is not None:\n                # First-order estimate\n                remaining_size = max(model_file.remote_size - model_file.transferred_size, 0)\n                model_file.eta = int(math.ceil(remaining_size / model_file.downloading_speed))\n\n            # now we can determine if root is Downloaded\n            # root is Downloaded if all child remote files are Downloaded\n            # again we use BFS to traverse\n            if model_file.state == ModelFile.State.DEFAULT:\n                if not model_file.is_dir and \\\n                        model_file.local_size is not None and \\\n                        model_file.remote_size is not None and \\\n                        model_file.local_size >= model_file.remote_size:\n                    # root is a finished single file\n                    model_file.state = ModelFile.State.DOWNLOADED\n                elif model_file.is_dir and model_file.remote_size is not None:\n                    # root is a directory that also exists remotely\n                    # check all the children\n                    all_downloaded = True\n                    frontier = []\n                    frontier += model_file.get_children()\n                    while frontier:\n                        _child_file = frontier.pop(0)\n                        if not _child_file.is_dir and \\\n                                _child_file.remote_size is not None and \\\n                                _child_file.state != ModelFile.State.DOWNLOADED:\n                            all_downloaded = False\n                            break\n                        frontier += _child_file.get_children()\n                    if all_downloaded:\n                        model_file.state = ModelFile.State.DOWNLOADED\n\n            # next we determine if root was Deleted\n            # root is Deleted if it does not exist locally, but was downloaded in the past\n            if model_file.state == ModelFile.State.DEFAULT and \\\n                    model_file.local_size is None and \\\n                    model_file.name in self.__downloaded_files:\n                model_file.state = ModelFile.State.DELETED\n\n            # next we check if root is Extracting\n            # root is Extracting if it's part of an extract status, in an expected state,\n            # and exists locally\n            # if root is NOT in an expected state, then ignore the extract status\n            # and report a warning message, as this shouldn't be happening\n            if model_file.name in self.__extract_statuses:\n                extract_status = self.__extract_statuses[model_file.name]\n                if model_file.is_dir != extract_status.is_dir:\n                    raise ModelError(\"Mismatch in is_dir between file and extract status\")\n                if model_file.state in (\n                    ModelFile.State.DEFAULT,\n                    ModelFile.State.DOWNLOADED\n                ) and model_file.local_size is not None:\n                    model_file.state = ModelFile.State.EXTRACTING\n                else:\n                    if model_file.local_size is None:\n                        self.logger.warning(\"File {} has extract status but doesn't exist locally!\".format(\n                            model_file.name\n                        ))\n                    else:\n                        self.logger.warning(\"File {} has extract status but is in state {}\".format(\n                            model_file.name,\n                            str(model_file.state)\n                        ))\n\n            # next we check if root is Extracted\n            # root is Extracted if it is in Downloaded state and in extracted files list\n            # Note: Default files aren't marked extracted because they can still be queued\n            #       for download, and it doesn't make sense to queue after extracting\n            #       If a Default file is extracted, it will return back to the Default state\n            if model_file.name in self.__extracted_files and model_file.state == ModelFile.State.DOWNLOADED:\n                    model_file.state = ModelFile.State.EXTRACTED\n\n            model.add_file(model_file)\n\n        self.__cached_model = model\n        return model\n"
  },
  {
    "path": "src/python/controller/scan/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .scanner_process import IScanner, ScannerResult, ScannerProcess, ScannerError\nfrom .active_scanner import ActiveScanner\nfrom .local_scanner import LocalScanner\nfrom .remote_scanner import RemoteScanner\n"
  },
  {
    "path": "src/python/controller/scan/active_scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom typing import List\nimport multiprocessing\nimport queue\n\nfrom .scanner_process import IScanner\nfrom common import overrides\nfrom system import SystemScanner, SystemScannerError, SystemFile\n\n\nclass ActiveScanner(IScanner):\n    \"\"\"\n    Scanner implementation to scan the active files only\n    A caller sets the names of the active files that need to be scanned.\n    A multiprocessing.Queue is used to store the names because the set and scan\n    methods are called by different processes.\n    \"\"\"\n    def __init__(self, local_path: str):\n        self.__scanner = SystemScanner(local_path)\n        self.__active_files_queue = multiprocessing.Queue()\n        self.__active_files = []  # latest state\n        self.logger = logging.getLogger(self.__class__.__name__)\n\n    @overrides(IScanner)\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(self.__class__.__name__)\n\n    def set_active_files(self, file_names: List[str]):\n        \"\"\"\n        Set the list of active file names. Only these files will be scanned.\n        :param file_names:\n        :return:\n        \"\"\"\n        self.__active_files_queue.put(file_names)\n\n    @overrides(IScanner)\n    def scan(self) -> List[SystemFile]:\n        # Grab the latest list of active files, if any\n        try:\n            while True:\n                self.__active_files = self.__active_files_queue.get(block=False)\n        except queue.Empty:\n            pass\n\n        # Do the scan\n        # self.logger.debug(\"Scanning files: {}\".format(str(self.__active_files)))\n        result = []\n        for file_name in self.__active_files:\n            try:\n                result.append(self.__scanner.scan_single(file_name))\n            except SystemScannerError as ex:\n                # Ignore errors here, file may have been deleted\n                self.logger.warning(str(ex))\n        return result\n"
  },
  {
    "path": "src/python/controller/scan/local_scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom typing import List\n\nfrom .scanner_process import IScanner, ScannerError\nfrom common import overrides, Localization, Constants\nfrom system import SystemScanner, SystemFile, SystemScannerError\n\n\nclass LocalScanner(IScanner):\n    \"\"\"\n    Scanner implementation to scan the local filesystem\n    \"\"\"\n    def __init__(self, local_path: str, use_temp_file: bool):\n        self.__scanner = SystemScanner(local_path)\n        if use_temp_file:\n            self.__scanner.set_lftp_temp_suffix(Constants.LFTP_TEMP_FILE_SUFFIX)\n        self.logger = logging.getLogger(\"LocalScanner\")\n\n    @overrides(IScanner)\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"LocalScanner\")\n\n    @overrides(IScanner)\n    def scan(self) -> List[SystemFile]:\n        try:\n            result = self.__scanner.scan()\n        except SystemScannerError:\n            self.logger.exception(\"Caught SystemScannerError\")\n            raise ScannerError(Localization.Error.LOCAL_SERVER_SCAN, recoverable=False)\n        return result\n"
  },
  {
    "path": "src/python/controller/scan/remote_scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport pickle\nfrom typing import List\nimport os\nfrom typing import Optional\nimport hashlib\n\nfrom .scanner_process import IScanner, ScannerError\nfrom common import overrides, Localization\nfrom ssh import Sshcp, SshcpError\nfrom system import SystemFile\n\n\nclass RemoteScanner(IScanner):\n    \"\"\"\n    Scanner implementation to scan the remote filesystem\n    \"\"\"\n    def __init__(self,\n                 remote_address: str,\n                 remote_username: str,\n                 remote_password: Optional[str],\n                 remote_port: int,\n                 remote_path_to_scan: str,\n                 local_path_to_scan_script: str,\n                 remote_path_to_scan_script: str):\n        self.logger = logging.getLogger(\"RemoteScanner\")\n        self.__remote_path_to_scan = remote_path_to_scan\n        self.__local_path_to_scan_script = local_path_to_scan_script\n        self.__remote_path_to_scan_script = remote_path_to_scan_script\n        self.__ssh = Sshcp(host=remote_address,\n                           port=remote_port,\n                           user=remote_username,\n                           password=remote_password)\n        self.__first_run = True\n\n        # Append scan script name to remote path if not there already\n        script_name = os.path.basename(self.__local_path_to_scan_script)\n        if os.path.basename(self.__remote_path_to_scan_script) != script_name:\n            self.__remote_path_to_scan_script = os.path.join(self.__remote_path_to_scan_script, script_name)\n\n    @overrides(IScanner)\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"RemoteScanner\")\n        self.__ssh.set_base_logger(self.logger)\n\n    @overrides(IScanner)\n    def scan(self) -> List[SystemFile]:\n        if self.__first_run:\n            self._install_scanfs()\n\n        try:\n            out = self.__ssh.shell(\"'{}' '{}'\".format(\n                self.__remote_path_to_scan_script,\n                self.__remote_path_to_scan)\n            )\n        except SshcpError as e:\n            self.logger.warning(\"Caught an SshcpError: {}\".format(str(e)))\n            recoverable = True\n            # Any scanner errors are fatal\n            if \"SystemScannerError\" in str(e):\n                recoverable = False\n            # First time errors are fatal\n            # User should be prompted to correct these\n            if self.__first_run:\n                recoverable = False\n            raise ScannerError(\n                Localization.Error.REMOTE_SERVER_SCAN.format(str(e).strip()),\n                recoverable=recoverable\n            )\n\n        try:\n            remote_files = pickle.loads(out)\n        except pickle.UnpicklingError as err:\n            self.logger.error(\"Unpickling error: {}\\n{}\".format(str(err), out))\n            raise ScannerError(\n                Localization.Error.REMOTE_SERVER_SCAN.format(\"Invalid pickled data\"),\n                recoverable=False\n            )\n\n        self.__first_run = False\n        return remote_files\n\n    def _install_scanfs(self):\n        # Check md5sum on remote to see if we can skip installation\n        with open(self.__local_path_to_scan_script, \"rb\") as f:\n            local_md5sum = hashlib.md5(f.read()).hexdigest()\n        self.logger.debug(\"Local scanfs md5sum = {}\".format(local_md5sum))\n        try:\n            out = self.__ssh.shell(\"md5sum {} | awk '{{print $1}}' || echo\".format(self.__remote_path_to_scan_script))\n            out = out.decode()\n            if out == local_md5sum:\n                self.logger.info(\"Skipping remote scanfs installation: already installed\")\n                return\n        except SshcpError as e:\n            self.logger.exception(\"Caught scp exception\")\n            raise ScannerError(\n                Localization.Error.REMOTE_SERVER_INSTALL.format(str(e).strip()),\n                recoverable=False\n            )\n\n        # Go ahead and install\n        self.logger.info(\"Installing local:{} to remote:{}\".format(\n            self.__local_path_to_scan_script,\n            self.__remote_path_to_scan_script\n        ))\n        if not os.path.isfile(self.__local_path_to_scan_script):\n            raise ScannerError(\n                Localization.Error.REMOTE_SERVER_SCAN.format(\n                    \"Failed to find scanfs executable at {}\".format(self.__local_path_to_scan_script)\n                ),\n                recoverable=False\n            )\n        try:\n            self.__ssh.copy(local_path=self.__local_path_to_scan_script,\n                            remote_path=self.__remote_path_to_scan_script)\n        except SshcpError as e:\n            self.logger.exception(\"Caught scp exception\")\n            raise ScannerError(\n                Localization.Error.REMOTE_SERVER_INSTALL.format(str(e).strip()),\n                recoverable=False\n            )\n"
  },
  {
    "path": "src/python/controller/scan/scanner_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom abc import ABC, abstractmethod\nimport multiprocessing\nfrom datetime import datetime\nfrom typing import List, Optional\nimport queue\n\nfrom common import overrides, AppProcess, AppError\nfrom system import SystemFile\n\n\nclass ScannerError(AppError):\n    \"\"\"\n    Indicates a scanner error\n\n    Args:\n        recoverable: indicates scans can be retried\n    \"\"\"\n    def __init__(self, message: str, recoverable: bool = False):\n        super().__init__(message)\n        self.recoverable = recoverable\n\n\nclass IScanner(ABC):\n    \"\"\"\n    Interface to scan the system.\n    This hides the scanning implementation from the scanner process.\n    \"\"\"\n    @abstractmethod\n    def scan(self) -> List[SystemFile]:\n        \"\"\"Scan system\"\"\"\n        pass\n\n    @abstractmethod\n    def set_base_logger(self, base_logger: logging.Logger):\n        pass\n\n\nclass ScannerResult:\n    \"\"\"\n    Results of a system scan\n    \"\"\"\n    def __init__(self,\n                 timestamp: datetime,\n                 files: List[SystemFile],\n                 failed: bool = False,\n                 error_message: str = None):\n        self.timestamp = timestamp\n        self.files = files\n        self.failed = failed\n        self.error_message = error_message\n\n\nclass ScannerProcess(AppProcess):\n    \"\"\"\n    Process to scan a file system and publish the result\n    \"\"\"\n    def __init__(self,\n                 scanner: IScanner, interval_in_ms: int,\n                 verbose: bool = True):\n        \"\"\"\n        Create a scanner process\n        :param scanner: IScanner implementation\n        :param interval_in_ms: Minimum interval (in ms) between results\n        \"\"\"\n        super().__init__(name=scanner.__class__.__name__)\n        self.__queue = multiprocessing.Queue()\n        self.__wake_event = multiprocessing.Event()\n        self.__scanner = scanner\n        self.__interval_in_ms = interval_in_ms\n        self.verbose = verbose\n\n    @overrides(AppProcess)\n    def run_init(self):\n        # Set the base logger for scanner\n        self.__scanner.set_base_logger(self.logger)\n\n    @overrides(AppProcess)\n    def run_cleanup(self):\n        pass\n\n    @overrides(AppProcess)\n    def run_loop(self):\n        timestamp_start = datetime.now()\n        if self.verbose:\n            self.logger.debug(\"Running a scan\")\n        try:\n            files = self.__scanner.scan()\n            result = ScannerResult(timestamp=timestamp_start,\n                                   files=files)\n        except ScannerError as e:\n            # Non-recoverable errors continue up as a fatal error\n            if not e.recoverable:\n                raise\n            result = ScannerResult(timestamp=timestamp_start,\n                                   files=[],\n                                   failed=True,\n                                   error_message=str(e))\n        self.__queue.put(result)\n        delta_in_s = (datetime.now() - timestamp_start).total_seconds()\n        delta_in_ms = int(delta_in_s * 1000)\n        if self.verbose:\n            self.logger.debug(\"Scan took {:.3f}s\".format(delta_in_s))\n\n        # Wait until the next interval, or until a wake event is fired\n        if delta_in_ms < self.__interval_in_ms:\n            wait_time_in_s = float(self.__interval_in_ms - delta_in_ms) / 1000.0\n            self.__wake_event.wait(timeout=wait_time_in_s)\n            self.__wake_event.clear()\n\n    def pop_latest_result(self) -> Optional[ScannerResult]:\n        \"\"\"\n        Process-safe method to retrieve latest scan result\n        Returns None if no new scan result was generated since the last time\n        this method was called\n        :return:\n        \"\"\"\n        latest_scan = None\n        try:\n            while True:\n                latest_scan = self.__queue.get(block=False)\n        except queue.Empty:\n            pass\n        return latest_scan\n\n    def force_scan(self):\n        \"\"\"Force process to wake and do an immediate scan\"\"\"\n        self.__wake_event.set()\n"
  },
  {
    "path": "src/python/docs/faq.md",
    "content": "# Frequently Asked Questions (FAQ)\n\n## General\n\n### How do I restart SeedSync Debian Service?\n\nSeedSync can be restarted from the web GUI. If that fails, you can restart the service from command-line:\n\n    :::bash\n    sudo service seedsync restart\n\n\n### How can I save my settings across updates when using the Docker image?\n\nTo maintain state across updates, you can store the settings in the host machine.\nAdd the following option when starting the container.\n\n    :::bash\n    -v <directory on host>:/config\n\nwhere `<directory on host>` refers to the location on host machine where you wish to store the application\nstate.\n\n\n## Security\n\n### Does SeedSync collect any data?\n\nNo, SeedSync does not collect any data.\n\n\n## Troubleshooting\n\n### SeedSync can't seem to connect to my remote server?\n\nMake sure your remote server address was entered correctly.\nIf using password-based login, make sure the password is correct.\nCheck the logs for details about the exact failure.\n\n### I am getting some errors about locale?\n\nOn some servers you may see errors in the log like so:\n`Unpickling error: unpickling stack underflow b'bash: warning: setlocale: LC_ALL: cannot change locale`\n\nThis means your remote server requires that the locale matches with the Seedsync app.\nWe can fix this my changing the locale for Seedsync.\nFor Seedsync docker, try adding the following options to the `docker run` command:\n```\n-e LC_ALL=en_US.UTF-8\n-e LANG=en_US.UTF-8\n```\n\nSee [this issue](https://github.com/ipsingh06/seedsync/issues/66) for more details.\n"
  },
  {
    "path": "src/python/docs/index.md",
    "content": "<p align=\"center\">\n    <img src=\"https://user-images.githubusercontent.com/12875506/85908858-c637a100-b7cb-11ea-8ab3-75c0c0ddf756.png\" alt=\"SeedSync\" />\n</p>\n\n# Documentation\n\nWelcome to SeedSync documentation!\n\nOn the left navigation you will find useful links.\n\n\nExternal links:\n\n* Github: [ipsingh06/seedsync](https://github.com/ipsingh06/seedsync)\n* Docker Hub: [ipsingh06/seedsync](https://hub.docker.com/repository/docker/ipsingh06/seedsync)"
  },
  {
    "path": "src/python/docs/install.md",
    "content": "# Installation\n\nSeedSync requires installation on a local machine.\nNothing needs to be installed on the remote server.\n\n## Requirements\n\n### Remote Server\n\nRequirements for the remote server are:\n\n* Linux-based system (64-bit)\n* SSH access\n\n### Local Machine\n\nThe following table describes the installation method supported for each platform.\n\n|  | Docker Image | Deb Package |\n| ------------ | :-------------: | :------------: |\n| Linux/Ubuntu 64-bit | &#9989;️  | &#9989; |\n| Raspberry Pi (v2, v3, v4) | &#9989;  | |\n| Windows | &#9989;  | |\n| MacOS | &#9989;  | |\n\nSelect the section for your platform:\n\n* [Docker Image (Linux/Ubuntu, Raspberry Pi) ](#install-docker)\n* [Docker Image (Windows)](#install-windows)\n* [Deb Package (Linux/Ubuntu)](#install-ubuntu)\n\n\n## <a name=\"install-docker\"></a> Docker Image (Linux/Ubuntu, Raspberry Pi)\n\n1. Run the docker image with the following command:\n\n        :::bash\n        docker run \\\n           -p 8800:8800 \\\n           -v <downloads directory>:/downloads \\\n           -v <config directory>:/config \\\n           ipsingh06/seedsync\n\n    where\n\n    * `<downloads directory>` refers to the location on host machine where downloaded files will be placed\n    * `<config directory>` refers to the location on host machine where config files will be placed\n    * both these directories must already exist\n\n    By default the docker image is run under the default user (uid=1000).\n    To run as a different user, include the option `--user <uid>:<gid>`.\n\n    If you receive errors related to locale when connecting to the remote server, then also include\n    the following options.\n\n    ```\n    -e LC_ALL=en_US.UTF-8\n    -e LANG=en_US.UTF-8\n    ```\n\n2. Access application GUI by going to [http://localhost:8800](http://localhost:8800) in your browser.\n\n3. Go to the Settings page and fill out the required information.\n   Under the Local Directory setting, enter `/downloads`.\n\n4. **While password-based login is supported, key-based authentication is highly recommended!**\n   See the [Key-Based Authentication Setup](#key-auth) section for details.\n\n\n## <a name=\"install-windows\"></a> Docker Image (Windows)\n\nSeedSync supports Windows via the Docker container.\n\n1. Install Docker on Windows.\n\n   1. [Docker for Windows](https://www.docker.com/docker-windows) if you have Windows 10 Pro or above\n\n   2. [Docker Toolbox](https://docs.docker.com/toolbox/toolbox_install_windows/) if you have Windows 10 Home or below\n\n2. Make sure you can successfully run the [Hello World](https://docs.docker.com/get-started/#test-docker-installation) app in Docker.\n\n3. Open the Docker terminal and run the SeedSync image with the following command:\n\n        :::bash\n        docker run \\\n           -p 8800:8800 \\\n           -v <downloads directory>:/downloads \\\n           -v <config directory>:/config \\\n           ipsingh06/seedsync\n\n    where\n\n    * `<downloads directory>` refers to the location on host machine where downloaded files will be placed\n    * `<config directory>` refers to the location on host machine where config files will be placed\n    * both these directories must already exist\n\n    !!! note\n        The Windows host machine path is specified as `/c/Users/...`\n\n4. Access application GUI to verify SeedSync is running.\n   Docker on Windows may not forward port to the local host. We need to find the IP address of the container.\n\n   1. Open a new Docker terminal and run the command:\n\n        :::bash\n        docker-machine ip\n        192.168.100.17\n\n   2. Open &lt;ip address&gt;:8800 in your browser.\n      In this example that would be [http://192.168.100.17:8800](http://192.168.100.17:8800)\n\n   3. Verify that SeedSync dashboard loads.\n\n5. Go to the Settings page and fill out the required information.\n   Under the Local Directory setting, enter `/downloads`.\n\n6. **While password-based login is supported, key-based authentication is highly recommended!**\n   See the [Key-Based Authentication Setup](#key-auth) section for details.\n\n\n## Post-Install Setup\n\nSeedSync's web-based GUI can be accessed at [http://localhost:8800](http://localhost:8800).\nOr in case of docker, whatever host port you specified in the `-p <port>:8800` option.\n\nYou may also access it from another device by replacing 'localhost' with the IP address or hostname of the machine where it is installed.\n\n### <a name=\"key-auth\"></a> Password-less/Key-based Authentication Setup\n\nPassword-based access to your remote server is highly unsecure.\nIt is strongly recommended that you set up key-based authentication.\n\n1. You will need to generate a public-private key pair.\n   Here is a [simple tutorial](https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/)\n   that walks you through this process.\n\n    !!! note\n        Make sure the access is set up for the user under which SeedSync is running.\n\n    !!! note\n        If you're using docker, also see the [Using SSH Keys with Docker](#keys-inside-docker) section.\n\n\n2. Before continuing, verify the password-less access by SSH'ing into your remote server in a terminal:\n\n        :::bash\n        ssh <remote user>@<remote server>\n\n    You should be able to log in to the remote server without being prompted for a password\n\n\n3. Update the settings\n\n    1. Access the web GUI and choose the Settings page from the menu.\n    2. Replace your password in the \"Server Password\" field with anything else (it can't be empty).\n    3. Select \"Use password-less key-based authentication\".\n    4. Restart SeedSync\n\n\n### <a name=\"keys-inside-docker\"></a> Using SSH Keys with Docker\n\n1. Generate a SSH private/public key pair if you haven't already.\n   Here is a [simple tutorial](https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/)\n   that walks you through this process.\n\n2. Include the following option with your docker command:\n\n        :::bash\n        -v <path to .ssh directory>:/home/seedsync/.ssh\n\n    Most commonly this should be:\n\n        :::bash\n        -v ~/.ssh:/home/seedsync/.ssh\n\n\n!!! note\n    If you are running the docker guest with a non-standard user using the `--user` option,\n    then you must make sure that your `.ssh` directory is also readable by that user.\n\n\n## <a name=\"install-ubuntu\"></a> Deb Package (Linux/Ubuntu)\n\n1. Download the deb package from the [latest](https://github.com/ipsingh06/seedsync/releases/latest) release\n\n2. Install the deb package:\n\n        :::bash\n        sudo dpkg -i <deb file>\n\n3. During the first install, you will be prompted for a user name:\n   ![Install prompt for username](https://raw.githubusercontent.com/ipsingh06/seedsync/master/doc/images/install_1.png)\n   This is the user under which the SeedSync service will run. The transferred files will be owned by this user.\n   It is recommended that you set this to your user (and NOT root).\n\n4. After the installation is complete, verify that the application is running by going to [http://localhost:8800](http://localhost:8800) in your browser.\n\n5. Go to the Settings page and fill out the required information.\n   **While password-based login is supported, key-based authentication is highly recommended!**\n   See the [Key-Based Authentication Setup](#key-auth) section for details.\n"
  },
  {
    "path": "src/python/docs/usage.md",
    "content": "# Usage\n\n## Dashboard\n\nThe Dashboard page shows all the files and directories on the remote server and the local machine.\nHere you can manually queue files to be transferred, extract archives and delete files.\n\n## AutoQueue\n\nAutoQueue queues all newly discovered files on the remote server.\nYou can also restrict AutoQueue to pattern-based matches (see this option in the Settings page).\nWhen pattern restriction is enabled, the AutoQueue page is where you can add or remove patterns.\nAny files or directories on the remote server that match a pattern will be automatically queued for transfer.\n\n"
  },
  {
    "path": "src/python/lftp/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .lftp import Lftp, LftpError\nfrom .job_status import LftpJobStatus\nfrom .job_status_parser import LftpJobStatusParser, LftpJobStatusParserError\n"
  },
  {
    "path": "src/python/lftp/job_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom collections import namedtuple\nfrom enum import Enum\nfrom typing import List, Tuple\n\n\nclass LftpJobStatus:\n    \"\"\"\n    Represents the status of a single Lftp jobs\n    \"\"\"\n    class Type(Enum):\n        MIRROR = \"mirror\"\n        PGET = \"pget\"\n\n    class State(Enum):\n        QUEUED = 0\n        RUNNING = 1\n\n    class TransferState(namedtuple(\"TransferState\",\n                                   [\"size_local\",\n                                    \"size_remote\",\n                                    \"percent_local\",\n                                    \"speed\",\n                                    \"eta\"])):\n        \"\"\"\n        State of transfer for a file or entire download\n          size_local: size in bytes that have been downloaded\n          size_remote: size in bytes on the remote server (may not be available)\n          percent_local: percent of bytes that have been downloaded (0-100)\n          speed: transfer speed in bytes per second\n          eta: est. remaining transfer time in seconds\n        \"\"\"\n        pass\n\n    def __init__(self, job_id: int, job_type: Type, state: State, name: str, flags: str):\n        self.__id = job_id\n        self.__type = job_type\n        self.__state = state\n        self.__name = name\n        self.__flags = flags\n        self.__total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        # dict of active file transfer states, maps filename to their transfer state\n        # there's no hierarchical info for now\n        self.__active_files_state = {}\n\n    @property\n    def id(self) -> int: return self.__id\n\n    @property\n    def type(self) -> Type: return self.__type\n\n    @property\n    def state(self) -> \"LftpJobStatus.State\": return self.__state\n\n    @property\n    def name(self) -> str: return self.__name\n\n    @property\n    def total_transfer_state(self) -> TransferState:\n        return self.__total_transfer_state\n\n    @total_transfer_state.setter\n    def total_transfer_state(self, total_transfer_state: TransferState):\n        if self.__state == LftpJobStatus.State.QUEUED:\n            raise TypeError(\"Cannot set transfer state on job of type queue\")\n        self.__total_transfer_state = total_transfer_state\n\n    def add_active_file_transfer_state(self, filename: str, transfer_state: TransferState):\n        if self.__state == LftpJobStatus.State.QUEUED:\n            raise TypeError(\"Cannot set transfer state on job of type queue\")\n        self.__active_files_state[filename] = transfer_state\n\n    def get_active_file_transfer_states(self) -> List[Tuple[str, TransferState]]:\n        \"\"\"\n        Returns list of pairs (filename, transfer state)\n        :return:\n        \"\"\"\n        return list(zip(self.__active_files_state.keys(), self.__active_files_state.values()))\n\n    def __eq__(self, other):\n        return self.__dict__ == other.__dict__\n\n    def __str__(self):\n        return str(self.__dict__)\n\n    def __repr__(self):\n        return str(self.__dict__)\n"
  },
  {
    "path": "src/python/lftp/job_status_parser.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nimport re\nfrom typing import List\nimport logging\n\nfrom common import AppError\nfrom .job_status import LftpJobStatus\n\n\nclass LftpJobStatusParserError(AppError):\n    pass\n\n\nclass LftpJobStatusParser:\n    \"\"\"\n    Parses the output of lftp's \"jobs -v\" command into a LftpJobStatus\n    \"\"\"\n    # python doesn't support partial inline-modified flags, so we need\n    # to capture all case-sensitive cases here\n    __SIZE_UNITS_REGEX = (\"b|B|\"\n                          \"k|kb|kib|K|Kb|KB|KiB|Kib|\"\n                          \"m|mb|mib|M|Mb|MB|MiB|Mib|\"\n                          \"g|gb|gib|G|Gb|GB|GiB|Gib\")\n    __TIME_UNITS_REGEX = \"(?P<eta_d>\\d*d)?(?P<eta_h>\\d*h)?(?P<eta_m>\\d*m)?(?P<eta_s>\\d*s)?\"\n\n    __QUOTED_FILE_NAME_REGEX = \"`(?P<name>.*)'\"\n\n    __QUEUE_DONE_REGEX = \"^\\[(?P<id>\\d+)\\]\\sDone\\s\\(queue\\s\\(.+\\)\\)\"\n\n    def __init__(self):\n        self.logger = logging.getLogger(\"LftpJobStatusParser\")\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"LftpJobStatusParser\")\n\n    @staticmethod\n    def _size_to_bytes(size: str) -> int:\n        \"\"\"\n        Parse the size string and return number of bytes\n        :param size:\n        :return:\n        \"\"\"\n        if size == \"0\":\n            return 0\n        m = re.compile(\"(?P<number>\\d+\\.?\\d*)\\s*(?P<units>{})?\".format(LftpJobStatusParser.__SIZE_UNITS_REGEX))\n        result = m.search(size)\n        if not result:\n            raise ValueError(\"String '{}' does not match the size pattern\".format(size))\n        number = float(result.group(\"number\"))\n        unit = (result.group(\"units\") or \"b\")[0].lower()\n        multipliers = {'b': 1, 'k': 1024, 'm': 1024*1024, 'g': 1024*1024*1024}\n        if unit not in multipliers.keys():\n            raise ValueError(\"Unrecognized unit {} in size string '{}'\".format(unit, size))\n        return int(number*multipliers[unit])\n\n    @staticmethod\n    def _eta_to_seconds(eta: str) -> int:\n        \"\"\"\n        Parse the time string and return number of seconds\n        :param eta:\n        :return:\n        \"\"\"\n        m = re.compile(LftpJobStatusParser.__TIME_UNITS_REGEX)\n        result = m.search(eta)\n        if not result:\n            raise ValueError(\"String '{}' does not match the eta pattern\".format(eta))\n        # the [:-1] below remove the last character\n        eta_d = int((result.group(\"eta_d\") or '0d')[:-1])\n        eta_h = int((result.group(\"eta_h\") or '0h')[:-1])\n        eta_m = int((result.group(\"eta_m\") or '0m')[:-1])\n        eta_s = int((result.group(\"eta_s\") or '0s')[:-1])\n        return eta_d*24*3600 + eta_h*3600 + eta_m*60 + eta_s\n\n    def parse(self, output: str) -> List[LftpJobStatus]:\n        statuses = list()\n        lines = [s.strip() for s in output.splitlines()]\n        lines = list(filter(None, lines))  # remove blank lines\n        # remove all lines before the first 'jobs -v'\n        start = next((i+1 for i, l in enumerate(lines) if l == \"jobs -v\"), 0)\n        lines = lines[start:]\n        # remove any remaining 'jobs -v' lines\n        lines = list(filter(lambda s: s != \"jobs -v\", lines))\n        # remove any remaining log line\n        lines = filter(lambda s: not re.match(r\"^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}.*\\s->\\s.*$\", s), lines)\n        lines = list(lines)\n        try:\n            statuses += self.__parse_queue(lines)\n            statuses += self.__parse_jobs(lines)\n        except ValueError as e:\n            self.logger.error(\"LftpJobStateParser error: {}\".format(str(e)))\n            self.logger.error(\"Status:\\n{}\".format(output))\n            raise LftpJobStatusParserError(\"Error parsing lftp job status\")\n        return statuses\n\n    @staticmethod\n    def __parse_jobs(lines: List[str]) -> List[LftpJobStatus]:\n        jobs = []\n\n        # Header patterns\n        # pget header\n        pget_header_pattern = (\"^\\[(?P<id>\\d+)\\]\\s+\"\n                               \"pget\\s+\"\n                               \"(?P<flags>.*?)\\s+\"\n                               \"(?P<lq>['\\\"]|)(?P<remote>.+)(?P=lq)\\s+\"  # greedy on purpose\n                               \"-o\\s+\"\n                               \"(?P<rq>['\\\"]|)(?P<local>.+)(?P=rq)$\")  # greedy on purpose\n        pget_header_m = re.compile(pget_header_pattern)\n\n        # mirror header (downloading)\n        mirror_header_pattern = (\"^\\[(?P<id>\\d+)\\]\\s+\"\n                                 \"mirror\\s+\"\n                                 \"(?P<flags>.*?)\\s+\"\n                                 \"(?P<lq>['\\\"]|)(?P<remote>.+)(?P=lq)\\s+\"  # greedy on purpose\n                                 \"(?P<rq>['\\\"]|)(?P<local>.+)(?P=rq)\\s+\"  # greedy on purpose\n                                 \"--\\s+\"\n                                 \"(?P<szlocal>\\d+\\.?\\d*\\s?({sz})?)\"  # size=0 has no units\n                                 \"\\/\"\n                                 \"(?P<szremote>\\d+\\.?\\d*\\s?({sz})?)\\s+\"  # size=0 has no units\n                                 \"\\((?P<pctlocal>\\d+)%\\)\"\n                                 \"(\\s+(?P<speed>\\d+\\.?\\d*\\s?({sz}))\\/s)?$\")\\\n            .format(sz=LftpJobStatusParser.__SIZE_UNITS_REGEX)\n        mirror_header_m = re.compile(mirror_header_pattern)\n\n        # mirror header (connecting or receiving file list)\n        mirror_fl_header_pattern = (\"^\\[(?P<id>\\d+)\\]\\s+\"\n                                    \"mirror\\s+\"\n                                    \"(?P<flags>.*?)\\s+\"\n                                    \"(?P<lq>['\\\"]|)(?P<remote>.+)(?P=lq)\\s+\"  # greedy on purpose\n                                    \"(?P<rq>['\\\"]|)(?P<local>.+)(?P=rq)$\")  # greedy on purpose\n        mirror_fl_header_m = re.compile(mirror_fl_header_pattern)\n\n        # Data patterns\n        filename_pattern = \"\\\\\\\\transfer\\s\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX\n        filename_m = re.compile(filename_pattern)\n\n        chunk_at_pattern = (\"^\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \"\\s+\"\n                            \"at\\s+\"\n                            \"\\d+\\s+\"  # this is NOT the local size\n                            \"(?:\\(\\d+%\\)\\s+)?\"  # this is NOT the local percent\n                            \"((?P<speed>\\d+\\.?\\d*\\s?({sz}))\\/s\\s+)?\"\n                            \"(eta:(?P<eta>{eta})\\s+)?\"\n                            \"\\s*\\[(?P<desc>.*)\\]$\")\\\n            .format(sz=LftpJobStatusParser.__SIZE_UNITS_REGEX,\n                    eta=LftpJobStatusParser.__TIME_UNITS_REGEX)\n        chunk_at_m = re.compile(chunk_at_pattern)\n\n        chunk_at2_pattern = (\"^\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \"\\s+\"\n                             \"at\\s+\"\n                             \"\\d+\\s+\"  # this is NOT the local size\n                             \"(?:\\(\\d+%\\))\")  # this is NOT the local percent\n        chunk_at2_m = re.compile(chunk_at2_pattern)\n\n        chunk_got_pattern = (\"^\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \",\\s+\"\n                             \"got\\s+\"\n                             \"(?P<szlocal>\\d+)\\s+\"\n                             \"of\\s+\"\n                             \"(?P<szremote>\\d+)\\s+\"\n                             \"\\((?P<pctlocal>\\d+)%\\)\"\n                             \"(\\s+(?P<speed>\\d+\\.?\\d*\\s?({sz}))\\/s)?\"\n                             \"(\\seta:(?P<eta>{eta}))?\")\\\n            .format(sz=LftpJobStatusParser.__SIZE_UNITS_REGEX,\n                    eta=LftpJobStatusParser.__TIME_UNITS_REGEX)\n        chunk_got_m = re.compile(chunk_got_pattern)\n\n        chunk_header_pattern = (\"\\\\\\\\chunk\\s\"\n                                \"(?P<start>\\d+)\"\n                                \"-\"\n                                \"(?P<end>\\d+)\")\n        chunk_header_m = re.compile(chunk_header_pattern)\n\n        chmod_header_pattern = (\"chmod\\s\"\n                                \"(?P<name>.*)\")\n        chmod_header_m = re.compile(chmod_header_pattern)\n\n        chmod_pattern = (LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \"\"\n                         \"\\s\\[\\]\")\n        chmod_pattern_m = re.compile(chmod_pattern)\n\n        mirror_pattern = (\"\\\\\\\\mirror\\s\"\n                          \"\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \"\\s+\"\n                          \"--\\s+\"\n                          \"(?P<szlocal>\\d+\\.?\\d*\\s?({sz})?)\"  # size=0 has no units\n                          \"\\/\"\n                          \"(?P<szremote>\\d+\\.?\\d*\\s?({sz})?)\\s+\"  # size=0 has no units\n                          \"\\((?P<pctlocal>\\d+)%\\)\"\n                          \"(\\s+(?P<speed>\\d+\\.?\\d*\\s?({sz}))\\/s)?$\")\\\n            .format(sz=LftpJobStatusParser.__SIZE_UNITS_REGEX)\n        mirror_m = re.compile(mirror_pattern)\n\n        mirror_empty_pattern = (\"\\\\\\\\mirror\\s\"\n                                \"\" + LftpJobStatusParser.__QUOTED_FILE_NAME_REGEX + \"\\s*$\")\n        mirror_empty_m = re.compile(mirror_empty_pattern)\n\n        queue_done_m = re.compile(LftpJobStatusParser.__QUEUE_DONE_REGEX)\n\n        prev_job = None\n        while lines:\n            line = lines.pop(0)\n\n            # First line must be a valid job header\n            if not (\n                prev_job or\n                pget_header_m.match(line) or\n                mirror_header_m.match(line) or\n                mirror_fl_header_m.match(line)\n            ):\n                raise ValueError(\"First line is not a matching header '{}'\".format(line))\n\n            # Search for pget header\n            result = pget_header_m.search(line)\n            if result:\n                # Next line must be the sftp line\n                if len(lines) < 1 or \"sftp\" not in lines[0]:\n                    raise ValueError(\"Missing the 'sftp' line for pget header '{}'\".format(line))\n                lines.pop(0)  # pop the 'sftp' line\n\n                # Data line may not exist\n                result_at = None\n                result_at2 = None\n                result_got = None\n                if lines:\n                    line = lines.pop(0)  # data line\n                    result_at = chunk_at_m.search(line)\n                    result_at2 = chunk_at2_m.search(line)\n                    result_got = chunk_got_m.search(line)\n\n                id_ = int(result.group(\"id\"))\n                name = os.path.basename(os.path.normpath(result.group(\"remote\")))\n                flags = result.group(\"flags\")\n                type_ = LftpJobStatus.Type.PGET\n                status = LftpJobStatus(job_id=id_,\n                                       job_type=type_,\n                                       state=LftpJobStatus.State.RUNNING,\n                                       name=name,\n                                       flags=flags)\n                if result_at:\n                    if result.group(\"remote\") != result_at.group(\"name\"):\n                        raise ValueError(\"Mismatch between pget names '{}' vs '{}'\".format(\n                            result.group(\"remote\"), result_at.group(\"name\")\n                        ))\n                    size_local = None\n                    percent_local = None\n                    speed = None\n                    if result_at.group(\"speed\"):\n                        speed = LftpJobStatusParser._size_to_bytes(result_at.group(\"speed\"))\n                    eta = None\n                    if result_at.group(\"eta\"):\n                        eta = LftpJobStatusParser._eta_to_seconds(result_at.group(\"eta\"))\n                    transfer_state = LftpJobStatus.TransferState(\n                        size_local,\n                        None,  # size remote\n                        percent_local,\n                        speed,\n                        eta\n                    )\n                elif result_at2:\n                    if result.group(\"remote\") != result_at2.group(\"name\"):\n                        raise ValueError(\"Mismatch between pget names '{}' vs '{}'\".format(\n                            result.group(\"remote\"), result_at2.group(\"name\")\n                        ))\n                    transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n                elif result_got:\n                    got_group_basename = os.path.basename(os.path.normpath(result_got.group(\"name\")))\n                    if got_group_basename != name:\n                        raise ValueError(\"Mismatch: filename '{}' but chunk data for '{}'\"\n                                         .format(name, got_group_basename))\n                    size_local = int(result_got.group(\"szlocal\"))\n                    size_remote = int(result_got.group(\"szremote\"))\n                    percent_local = int(result_got.group(\"pctlocal\"))\n                    speed = None\n                    if result_got.group(\"speed\"):\n                        speed = LftpJobStatusParser._size_to_bytes(result_got.group(\"speed\"))\n                    eta = None\n                    if result_got.group(\"eta\"):\n                        eta = LftpJobStatusParser._eta_to_seconds(result_got.group(\"eta\"))\n                    transfer_state = LftpJobStatus.TransferState(\n                        size_local,\n                        size_remote,\n                        percent_local,\n                        speed,\n                        eta\n                    )\n                else:\n                    # No data line at all\n                    transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n\n                status.total_transfer_state = transfer_state\n                jobs.append(status)\n                prev_job = status\n                continue\n\n            # Search for mirror header\n            result = mirror_header_m.search(line)\n            if result:\n                id_ = int(result.group(\"id\"))\n                name = os.path.basename(os.path.normpath(result.group(\"remote\")))\n                flags = result.group(\"flags\")\n                type_ = LftpJobStatus.Type.MIRROR\n                status = LftpJobStatus(job_id=id_,\n                                       job_type=type_,\n                                       state=LftpJobStatus.State.RUNNING,\n                                       name=name,\n                                       flags=flags)\n                size_local = LftpJobStatusParser._size_to_bytes(result.group(\"szlocal\"))\n                size_remote = LftpJobStatusParser._size_to_bytes(result.group(\"szremote\"))\n                percent_local = int(result.group(\"pctlocal\"))\n                speed = None\n                if result.group(\"speed\"):\n                    speed = LftpJobStatusParser._size_to_bytes(result.group(\"speed\"))\n                transfer_state = LftpJobStatus.TransferState(\n                    size_local,\n                    size_remote,\n                    percent_local,\n                    speed,\n                    None  # eta\n                )\n                status.total_transfer_state = transfer_state\n                jobs.append(status)\n                prev_job = status\n                # Continue the outer loop\n                continue\n\n            # Search for mirror connecting header\n            # Note: this must be after the more restrictive mirror header above\n            result = mirror_fl_header_m.search(line)\n            if result:\n                # There may be a 'Connecting' or 'cd' line ahead, but not always\n                if lines and (\n                        lines[0].startswith(\"Getting file list\") or\n                        lines[0].startswith(\"cd \")\n                ):\n                    lines.pop(0)  # pop the connecting line\n                id_ = int(result.group(\"id\"))\n                name = os.path.basename(os.path.normpath(result.group(\"remote\")))\n                flags = result.group(\"flags\")\n                type_ = LftpJobStatus.Type.MIRROR\n                status = LftpJobStatus(job_id=id_,\n                                       job_type=type_,\n                                       state=LftpJobStatus.State.RUNNING,\n                                       name=name,\n                                       flags=flags)\n                jobs.append(status)\n                prev_job = status\n                # Continue the outer loop\n                continue\n\n            # Search for filename\n            result = filename_m.search(line)\n            if result:\n                name = result.group(\"name\")\n                if not lines:\n                    raise ValueError(\"Missing chunk data for filename '{}'\".format(name))\n                line = lines.pop(0)\n                result_at = chunk_at_m.search(line)\n                result_at2 = chunk_at2_m.search(line)\n                result_got = chunk_got_m.search(line)\n                if result_at:\n                    # filename is full path, but chunk name is only normpath\n                    if result_at.group(\"name\") != os.path.basename(os.path.normpath(name)):\n                        raise ValueError(\"Mismatch: filename '{}' but chunk data for '{}'\"\n                                         .format(name, result_at.group(\"name\")))\n                    size_local = None\n                    percent_local = None\n                    speed = None\n                    if result_at.group(\"speed\"):\n                        speed = LftpJobStatusParser._size_to_bytes(result_at.group(\"speed\"))\n                    eta = None\n                    if result_at.group(\"eta\"):\n                        eta = LftpJobStatusParser._eta_to_seconds(result_at.group(\"eta\"))\n                    file_status = LftpJobStatus.TransferState(\n                        size_local,\n                        None,\n                        percent_local,\n                        speed,\n                        eta\n                    )\n                    prev_job.add_active_file_transfer_state(name, file_status)\n                elif result_at2:\n                    # filename is full path, but chunk name is only normpath\n                    if result_at2.group(\"name\") != os.path.basename(os.path.normpath(name)):\n                        raise ValueError(\"Mismatch: filename '{}' but chunk data for '{}'\"\n                                         .format(name, result_at2.group(\"name\")))\n                    file_status = LftpJobStatus.TransferState(None, None, None, None, None)\n                    prev_job.add_active_file_transfer_state(name, file_status)\n                elif result_got:\n                    if result_got.group(\"name\") != os.path.basename(os.path.normpath(name)):\n                        raise ValueError(\"Mismatch: filename '{}' but chunk data for '{}'\"\n                                         .format(name, result_got.group(\"name\")))\n                    size_local = int(result_got.group(\"szlocal\"))\n                    size_remote = int(result_got.group(\"szremote\"))\n                    percent_local = int(result_got.group(\"pctlocal\"))\n                    speed = None\n                    if result_got.group(\"speed\"):\n                        speed = LftpJobStatusParser._size_to_bytes(result_got.group(\"speed\"))\n                    eta = None\n                    if result_got.group(\"eta\"):\n                        eta = LftpJobStatusParser._eta_to_seconds(result_got.group(\"eta\"))\n                    file_status = LftpJobStatus.TransferState(\n                        size_local,\n                        size_remote,\n                        percent_local,\n                        speed,\n                        eta\n                    )\n                    prev_job.add_active_file_transfer_state(name, file_status)\n                else:\n                    raise ValueError(\"Missing chunk data for filename '{}'\".format(name))\n                # Continue the outer loop\n                continue\n\n            # Search for but ignore \"\\mirror\" line\n            result = mirror_m.search(line)\n            if result:\n                # Continue the outer loop\n                continue\n            result = mirror_empty_m.search(line)\n            if result:\n                name = result.group(\"name\")\n                # One of these lines may follow, ignore it as well\n                #    \"Getting files list\"\n                #    \"cd\"\n                #    \"<name>: \"\n                #    \"mkdir\"\n                if lines:\n                    if \"Getting file list\" in lines[0] or \\\n                            lines[0].startswith(\"cd \") or \\\n                            lines[0] == \"{}:\".format(name) or \\\n                            lines[0].startswith(\"mkdir \"):\n                        lines.pop(0)\n                # Continue the outer loop\n                continue\n\n            # Search for but ignore \"\\chunk\" line\n            result = chunk_header_m.search(line)\n            if result:\n                # Also need to ignore the next line\n                if not lines:\n                    raise ValueError(\"Missing data line for chunk '{}'\".format(line))\n                lines.pop(0)\n                # Continue the outer loop\n                continue\n\n            # Search for but ignore \"chmod\" line\n            result = chmod_header_m.search(line)\n            if result:\n                name = result.group(\"name\")\n                # Also ignore the next one or two lines\n                if not lines or not lines[0].startswith(\"file:\"):\n                    raise ValueError(\"Missing 'file:' line for chmod '{}'\".format(name))\n                lines.pop(0)\n                if lines:\n                    result_chmod = chmod_pattern_m.search(lines[0])\n                    if result_chmod:\n                        name_chmod = result_chmod.group(\"name\")\n                        if name != name_chmod:\n                            raise ValueError(\"Mismatch in names chmod '{}'\".format(name))\n                        lines.pop(0)\n                # Continue the outer loop\n                continue\n\n            # Search for the Done line, but it better be the last line\n            result = queue_done_m.match(line)\n            if result:\n                if lines:\n                    raise ValueError(\"There are more lines after the 'Done' line\")\n                # Continue the outer loop\n                continue\n\n            # If we got here, then we don't know how to parse this line\n            raise ValueError(\"Unable to parse line '{}'\".format(line))\n        return jobs\n\n    @staticmethod\n    def __parse_queue(lines: List[str]) -> List[LftpJobStatus]:\n        queue = []\n\n        queue_done_m = re.compile(LftpJobStatusParser.__QUEUE_DONE_REGEX)\n        if len(lines) == 1:\n            if not queue_done_m.match(lines[0]):\n                raise ValueError(\"Unrecognized line '{}'\".format(lines[0]))\n            lines.pop(0)\n\n        if lines:\n            # Look for the header lines\n            if len(lines) < 2:\n                raise ValueError(\"Missing queue header\")\n            header1_pattern = \"^\\[\\d+\\] queue \\(sftp://.*@.*\\)(?:\\s+--\\s+(?:\\d+\\.\\d+|\\d+)\\s(?:{})\\/s)?$\"\\\n                              .format(LftpJobStatusParser.__SIZE_UNITS_REGEX)\n            header2_pattern = \"^sftp://.*@.*$\"\n            line = lines.pop(0)\n            if not re.match(header1_pattern, line):\n                raise ValueError(\"Missing queue header line 1: {}\".format(line))\n            line = lines.pop(0)\n            if not re.match(header2_pattern, line):\n                raise ValueError(\"Missing queue header line 2: {}\".format(line))\n            if not lines:\n                raise ValueError(\"Missing queue status\")\n\n            # Look for 'Now executing' lines\n            line = lines.pop(0)\n            if re.match(\"Queue is stopped.\", line):\n                # Nothing to do\n                pass\n            elif re.match(\"Now executing:\", line):\n                # Remove any more lines associated with 'now executing'\n                while lines and re.match(\"^-\\[\\d+\\]\", lines[0]):\n                    lines.pop(0)\n\n            # Look for the actual queue\n            if lines and re.match(\"Commands queued:\", lines[0]):\n                lines.pop(0)\n                if not lines:\n                    raise ValueError(\"Missing queued commands\")\n\n                # Parse the queued commands\n                queue_pget_pattern = (\"^(?P<id>\\d+)\\.\\s+\"\n                                      \"pget\\s+\"\n                                      \"(?P<flags>.*?)\\s+\"\n                                      \"(?P<lq>[\\'\\\"]|)(?P<remote>.+)(?P=lq)\\s+\"  # greedy on purpose\n                                      \"(?:-o\\s+)\"\n                                      \"(?P<rq>[\\'\\\"]|)(?P<local>.+)(?P=rq)$\")  # greedy on purpose\n                queue_pget_m = re.compile(queue_pget_pattern)\n                queue_mirror_pattern = (\"^(?P<id>\\d+)\\.\\s+\"\n                                        \"mirror\\s+\"\n                                        \"(?P<flags>.*?)\\s+\"\n                                        \"(?P<lq>[\\'\\\"]|)(?P<remote>.+)(?P=lq)\\s+\"  # greedy on purpose\n                                        \"(?P<rq>[\\'\\\"]|)(?P<local>.+)(?P=rq)$\")  # greedy on purpose\n                queue_mirror_m = re.compile(queue_mirror_pattern)\n                while lines:\n                    line = lines[0]\n                    if re.match(\"^\\d+\\.\", line):\n                        # header line\n                        lines.pop(0)\n\n                        result_pget = queue_pget_m.match(line)\n                        result_mirror = queue_mirror_m.match(line)\n                        if result_pget:\n                            type_ = LftpJobStatus.Type.PGET\n                            result = result_pget\n                        elif result_mirror:\n                            type_ = LftpJobStatus.Type.MIRROR\n                            result = result_mirror\n                        else:\n                            raise ValueError(\"Failed to parse queue line: {}\".format(line))\n                        id_ = int(result.group(\"id\"))\n                        name = os.path.basename(os.path.normpath(result.group(\"remote\")))\n                        flags = result.group(\"flags\")\n                        status = LftpJobStatus(job_id=id_,\n                                               job_type=type_,\n                                               state=LftpJobStatus.State.QUEUED,\n                                               name=name,\n                                               flags=flags)\n                        queue.append(status)\n                    elif re.match(\"^cd\\s.*$\", line):\n                        # 'cd' line after pget, ignore\n                        lines.pop(0)\n                    else:\n                        # no match, exit loop\n                        break\n\n            # Look for the done line\n            if lines and queue_done_m.match(lines[0]):\n                lines.pop(0)\n\n        return queue\n"
  },
  {
    "path": "src/python/lftp/lftp.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport re\nfrom functools import wraps\nfrom typing import Callable, Union, List, Optional\n\n# 3rd party libs\nimport pexpect\n\n# my libs\nfrom common import AppError\nfrom .job_status_parser import LftpJobStatus, LftpJobStatusParser, LftpJobStatusParserError\n\n\n# How many status errors are allowed before error propagates out\nMAX_CONSECUTIVE_STATUS_ERRORS = 2\n\n\nclass LftpError(AppError):\n    \"\"\"\n    Custom exception that describes the failure of the lftp command\n    \"\"\"\n    pass\n\n\nclass Lftp:\n    \"\"\"\n    Lftp command utility\n    \"\"\"\n    __SET_NUM_PARALLEL_FILES = \"mirror:parallel-transfer-count\"\n    __SET_NUM_CONNECTIONS_PGET = \"pget:default-n\"\n    __SET_NUM_CONNECTIONS_MIRROR = \"mirror:use-pget-n\"\n    __SET_NUM_MAX_TOTAL_CONNECTIONS = \"net:connection-limit\"\n    __SET_RATE_LIMIT = \"net:limit-rate\"\n    __SET_MIN_CHUNK_SIZE = \"pget:min-chunk-size\"\n    __SET_NUM_PARALLEL_JOBS = \"cmd:queue-parallel\"\n    __SET_MOVE_BACKGROUND_ON_EXIT = \"cmd:move-background\"\n    __SET_COMMAND_AT_EXIT = \"cmd:at-exit\"\n    __SET_USE_TEMP_FILE = \"xfer:use-temp-file\"\n    __SET_TEMP_FILE_NAME = \"xfer:temp-file-name\"\n    __SET_SFTP_AUTO_CONFIRM = \"sftp:auto-confirm\"\n    __SET_SFTP_CONNECT_PROGRAM = \"sftp:connect-program\"\n\n    def __init__(self,\n                 address: str,\n                 port: int,\n                 user: str,\n                 password: Optional[str]):\n        self.__user = user\n        self.__password = password\n        self.__address = address\n        self.__base_remote_dir_path = \"\"\n        self.__base_local_dir_path = \"\"\n        self.logger = logging.getLogger(\"Lftp\")\n        self.__expect_pattern = \"lftp {}@{}:.*>\".format(self.__user, self.__address)\n        self.__job_status_parser = LftpJobStatusParser()\n        self.__timeout = 3  # in seconds\n        self.__consecutive_status_errors = 0\n\n        self.__log_command_output = False\n        self.__pending_error = None\n\n        args = [\n            \"-p\", str(port),\n            \"-u\", \"{},{}\".format(self.__user, self.__password if self.__password else \"\"),\n            \"sftp://{}\".format(self.__address)\n        ]\n        self.__process = pexpect.spawn(\"/usr/bin/lftp\", args)\n        self.__process.expect(self.__expect_pattern)\n        self.__setup()\n\n    def set_verbose_logging(self, verbose: bool):\n        self.__log_command_output = verbose\n\n    def __setup(self):\n        \"\"\"\n        Setup the lftp instance with default settings\n        :return:\n        \"\"\"\n        # Set to kill on exit to prevent a zombie process\n        self.__set(Lftp.__SET_COMMAND_AT_EXIT, \"\\\"kill all\\\"\")\n        # Auto-add server to known host file\n        self.sftp_auto_confirm = True\n\n    def with_check_process(method: Callable):\n        \"\"\"\n        Decorator that checks for a valid process before executing\n        the decorated method\n        :param method:\n        :return:\n        \"\"\"\n        @wraps(method)\n        def wrapper(inst: \"Lftp\", *args, **kwargs):\n            if inst.__process is None or not inst.__process.isalive():\n                raise LftpError(\"lftp process is not running\")\n            return method(inst, *args, **kwargs)\n        return wrapper\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"Lftp\")\n        self.__job_status_parser.set_base_logger(self.logger)\n\n    def set_base_remote_dir_path(self, base_remote_dir_path: str):\n        self.__base_remote_dir_path = base_remote_dir_path\n\n    def set_base_local_dir_path(self, base_local_dir_path: str):\n        self.__base_local_dir_path = base_local_dir_path\n\n    def raise_pending_error(self):\n        \"\"\"\n        Raise any pending errors\n        Errors show up late after a command is executed\n        This method raises any errors that were detected while executing the next command\n        :return:\n        \"\"\"\n        if self.__pending_error:\n            error = self.__pending_error\n            self.__pending_error = None\n            raise LftpError(error)\n\n    @with_check_process\n    def __run_command(self, command: str):\n        if self.__log_command_output:\n            self.logger.debug(\"command: {}\".format(command.encode('utf8', 'surrogateescape')))\n        self.__process.sendline(command)\n        try:\n            self.__process.expect(self.__expect_pattern, timeout=self.__timeout)\n        except pexpect.exceptions.TIMEOUT:\n            self.logger.exception(\"Lftp timeout exception\")\n            pass\n        finally:\n            out = self.__process.before.decode('utf8', 'replace')\n            out = out.strip()  # remove any CRs\n\n            if self.__log_command_output:\n                self.logger.debug(\"out ({} bytes):\\n {}\".format(len(out), out))\n                after = self.__process.after.decode('utf8', 'replace').strip() \\\n                    if self.__process.after != pexpect.TIMEOUT else \"\"\n                self.logger.debug(\"after: {}\".format(after))\n\n        # let's try and detect some errors\n        if self.__detect_errors_from_output(out):\n            # we need to consume the actual output so that\n            # it doesn't get passed onto next command\n            error_out = out\n            try:\n                self.__process.expect(self.__expect_pattern, timeout=self.__timeout)\n            except pexpect.exceptions.TIMEOUT:\n                self.logger.exception(\"Lftp timeout exception\")\n                pass\n            finally:\n                out = self.__process.before.decode('utf8', 'replace')\n                out = out.strip()  # remove any CRs\n                if self.__log_command_output:\n                    self.logger.debug(\"retry out ({} bytes):\\n {}\".format(len(out), out))\n                    after = self.__process.after.decode('utf8', 'replace').strip() \\\n                        if self.__process.after != pexpect.TIMEOUT else \"\"\n                    self.logger.debug(\"retry after: {}\".format(after))\n                self.logger.error(\"Lftp detected error: {}\".format(error_out))\n                # save pending error\n                self.__pending_error = error_out\n        return out\n\n    @staticmethod\n    def __detect_errors_from_output(out: str) -> bool:\n        errors = [\n            \"pget: Access failed\",\n            \"pget-chunk: Access failed\",\n            \"mirror: Access failed\",\n            \"Login failed: Login incorrect\"\n        ]\n        for error in errors:\n            if error in out:\n                return True\n        return False\n\n    def __set(self, setting: str, value: str):\n        \"\"\"\n        Set a setting in the lftp runtime\n        :param setting:\n        :param value:\n        :return:\n        \"\"\"\n        self.__run_command(\"set {} {}\".format(setting, value))\n\n    def __get(self, setting: str) -> str:\n        \"\"\"\n        Get a setting from the lftp runtime\n        :param setting:\n        :return:\n        \"\"\"\n        out = self.__run_command(\"set -a | grep {}\".format(setting))\n        m = re.search(\"set {} (.*)\".format(setting), out)\n        if not m or not m.group or not m.group(1):\n            raise LftpError(\"Failed to get setting '{}'. Output: '{}'\".format(setting, out))\n        return m.group(1).strip()\n\n    @staticmethod\n    def __to_bool(value: str) -> bool:\n        # sets are taken from LFTP manual\n        if value.lower() in {\"true\", \"on\", \"yes\", \"1\", \"+\"}:\n            return True\n        elif value.lower() in {\"false\",  \"off\", \"no\", \"0\", \"-\"}:\n            return False\n        else:\n            raise LftpError(\"Cannot convert value '{}' to boolean\".format(value))\n\n    @property\n    def num_connections_per_dir_file(self) -> int:\n        return int(self.__get(Lftp.__SET_NUM_CONNECTIONS_MIRROR))\n\n    @num_connections_per_dir_file.setter\n    def num_connections_per_dir_file(self, num_connections: int):\n        if num_connections < 1:\n            raise ValueError(\"Number of connections must be positive\")\n        self.__set(Lftp.__SET_NUM_CONNECTIONS_MIRROR, str(num_connections))\n\n    @property\n    def num_connections_per_root_file(self) -> int:\n        return int(self.__get(Lftp.__SET_NUM_CONNECTIONS_PGET))\n\n    @num_connections_per_root_file.setter\n    def num_connections_per_root_file(self, num_connections: int):\n        if num_connections < 1:\n            raise ValueError(\"Number of connections must be positive\")\n        self.__set(Lftp.__SET_NUM_CONNECTIONS_PGET, str(num_connections))\n\n    @property\n    def num_max_total_connections(self) -> int:\n        return int(self.__get(Lftp.__SET_NUM_MAX_TOTAL_CONNECTIONS))\n\n    @num_max_total_connections.setter\n    def num_max_total_connections(self, num_connections: int):\n        if num_connections < 0:\n            raise ValueError(\"Number of connections must be zero or greater\")\n        self.__set(Lftp.__SET_NUM_MAX_TOTAL_CONNECTIONS, str(num_connections))\n\n    @property\n    def num_parallel_files(self) -> int:\n        return int(self.__get(Lftp.__SET_NUM_PARALLEL_FILES))\n\n    @num_parallel_files.setter\n    def num_parallel_files(self, num_parallel_files: int):\n        if num_parallel_files < 1:\n            raise ValueError(\"Number of parallel files must be positive\")\n        self.__set(Lftp.__SET_NUM_PARALLEL_FILES, str(num_parallel_files))\n\n    @property\n    def rate_limit(self) -> str:\n        return self.__get(Lftp.__SET_RATE_LIMIT)\n\n    @rate_limit.setter\n    def rate_limit(self, rate_limit: Union[int, str]):\n        self.__set(Lftp.__SET_RATE_LIMIT, str(rate_limit))\n\n    @property\n    def min_chunk_size(self) -> str:\n        return self.__get(Lftp.__SET_MIN_CHUNK_SIZE)\n\n    @min_chunk_size.setter\n    def min_chunk_size(self, min_chunk_size: Union[int, str]):\n        self.__set(Lftp.__SET_MIN_CHUNK_SIZE, str(min_chunk_size))\n\n    @property\n    def num_parallel_jobs(self) -> int:\n        return int(self.__get(Lftp.__SET_NUM_PARALLEL_JOBS))\n\n    @num_parallel_jobs.setter\n    def num_parallel_jobs(self, num_parallel_jobs: int):\n        if num_parallel_jobs < 1:\n            raise ValueError(\"Number of parallel jobs must be positive\")\n        self.__set(Lftp.__SET_NUM_PARALLEL_JOBS, str(num_parallel_jobs))\n\n    @property\n    def move_background_on_exit(self) -> bool:\n        return Lftp.__to_bool(self.__get(Lftp.__SET_MOVE_BACKGROUND_ON_EXIT))\n\n    @move_background_on_exit.setter\n    def move_background_on_exit(self, move_background_on_exit: bool):\n        self.__set(Lftp.__SET_MOVE_BACKGROUND_ON_EXIT, str(int(move_background_on_exit)))\n\n    @property\n    def use_temp_file(self) -> bool:\n        return Lftp.__to_bool(self.__get(Lftp.__SET_USE_TEMP_FILE))\n\n    @use_temp_file.setter\n    def use_temp_file(self, use_temp_file: bool):\n        self.__set(Lftp.__SET_USE_TEMP_FILE, str(int(use_temp_file)))\n\n    @property\n    def temp_file_name(self) -> str:\n        return self.__get(Lftp.__SET_TEMP_FILE_NAME)\n\n    @temp_file_name.setter\n    def temp_file_name(self, temp_file_name: str):\n        self.__set(Lftp.__SET_TEMP_FILE_NAME, temp_file_name)\n\n    @property\n    def sftp_auto_confirm(self) -> bool:\n        return Lftp.__to_bool(self.__get(Lftp.__SET_SFTP_AUTO_CONFIRM))\n\n    @sftp_auto_confirm.setter\n    def sftp_auto_confirm(self, auto_confirm: bool):\n        self.__set(Lftp.__SET_SFTP_AUTO_CONFIRM, str(int(auto_confirm)))\n\n    @property\n    def sftp_connect_program(self) -> str:\n        return self.__get(Lftp.__SET_SFTP_CONNECT_PROGRAM)\n\n    @sftp_connect_program.setter\n    def sftp_connect_program(self, program: str):\n        self.__set(Lftp.__SET_SFTP_CONNECT_PROGRAM, program)\n\n    def status(self) -> List[LftpJobStatus]:\n        \"\"\"\n        Return a status list of queued and running jobs\n        :return:\n        \"\"\"\n        out = self.__run_command(\"jobs -v\")\n        try:\n            statuses = self.__job_status_parser.parse(out)\n            self.__consecutive_status_errors = 0\n        except LftpJobStatusParserError:\n            self.__consecutive_status_errors += 1\n            if self.__consecutive_status_errors <= MAX_CONSECUTIVE_STATUS_ERRORS:\n                self.logger.warning(f\"Ignoring status error (count={self.__consecutive_status_errors})\")\n                statuses = []\n            else:\n                raise\n        return statuses\n\n    def queue(self, name: str, is_dir: bool):\n        \"\"\"\n        Queues a job for download\n        This method may cause an exception to be generated in a later method call:\n          * Wrong type (is_dir) is specified\n          * File/folder does not exist\n        :param name: name of file or folder to download\n        :param is_dir: true if folder, false if file\n        :return:\n        \"\"\"\n        # Escape single and double quotes in any string used in queue command\n        def escape(s: str) -> str:\n            return s.replace(\"'\", \"\\\\'\").replace(\"\\\"\", \"\\\\\\\"\")\n\n        command = \" \".join([\n            \"queue\",\n            \"'\",\n            \"pget\" if not is_dir else \"mirror\",\n            \"-c\",\n            \"\\\"{remote_dir}/{filename}\\\"\".format(remote_dir=escape(self.__base_remote_dir_path),\n                                                 filename=escape(name)),\n            \"-o\" if not is_dir else \"\",\n            \"\\\"{local_dir}/\\\"\".format(local_dir=escape(self.__base_local_dir_path)),\n            \"'\"\n        ])\n        self.__run_command(command)\n\n    def kill(self, name: str) -> bool:\n        \"\"\"\n        Kill a queued or running job\n        :param name:\n        :return: True if job of given name was found, False otherwise\n        \"\"\"\n        # look for this name in the status list\n        job_to_kill = None\n        for status in self.status():\n            if status.name == name:\n                job_to_kill = status\n                break\n        if job_to_kill is None:\n            self.logger.debug(\"Kill failed to find job '{}'\".format(name))\n            return False\n        # Note: there's a chance that job ids change between when we called status\n        #       and when we execute the kill command\n        #       in this case the wrong job may be killed, there's nothing we can do about it\n        if job_to_kill.state == LftpJobStatus.State.RUNNING:\n            self.logger.debug(\"Killing running job '{}'...\".format(name))\n            self.__run_command(\"kill {}\".format(job_to_kill.id))\n        elif job_to_kill.state == LftpJobStatus.State.QUEUED:\n            self.logger.debug(\"Killing queued job '{}'...\".format(name))\n            self.__run_command(\"queue --delete {}\".format(job_to_kill.id))\n        else:\n            raise NotImplementedError(\"Unsupported state {}\".format(str(job_to_kill.state)))\n        return True\n\n    def kill_all(self):\n        \"\"\"\n        Kills are jobs, queued or downloading\n        :return:\n        \"\"\"\n        # empty the queue and kill running jobs\n        self.__run_command(\"queue -d *\")\n        self.__run_command(\"kill all\")\n\n    def exit(self):\n        \"\"\"\n        Exit the lftp instance. It cannot be used after being killed\n        :return:\n        \"\"\"\n        self.kill_all()\n        self.__process.sendline(\"exit\")\n        self.__process.close(force=True)\n\n    # Mark decorators as static (must be at end of class)\n    # Source: https://stackoverflow.com/a/3422823\n    with_check_process = staticmethod(with_check_process)\n"
  },
  {
    "path": "src/python/mkdocs.yml",
    "content": "site_name: SeedSync\ntheme:\n  name: material\n  language: en\n  palette:\n    scheme: preference\n    primary: teal\n    accent: teal\n    font: false\n  logo: images/logo.png\n  favicon: images/favicon.png\nmarkdown_extensions:\n  - admonition\n  - codehilite:\n      guess_lang: false\n  - toc:\n      permalink: true\nrepo_name: ipsingh06/seedsync\nrepo_url: https://github.com/ipsingh06/seedsync\nnav:\n  - Home: index.md\n  - Installation: install.md\n  - Usage: usage.md\n  - FAQ: faq.md\n"
  },
  {
    "path": "src/python/model/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .model import Model, IModelListener, ModelError\nfrom .file import ModelFile\nfrom .diff import ModelDiff, ModelDiffUtil\n"
  },
  {
    "path": "src/python/model/diff.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom enum import Enum\nfrom typing import List, Optional\nimport copy\n\n# my libs\nfrom .file import ModelFile\nfrom .model import Model\n\n\nclass ModelDiff:\n    \"\"\"\n    Represents a single change in the model\n    \"\"\"\n    class Change(Enum):\n        ADDED = 0\n        REMOVED = 1\n        UPDATED = 2\n\n    def __init__(self, change: Change, old_file: Optional[ModelFile], new_file: Optional[ModelFile]):\n        self.__change = change\n        self.__old_file = old_file\n        self.__new_file = new_file\n\n    def __eq__(self, other):\n        return self.__dict__ == other.__dict__\n\n    def __repr__(self):\n        return str(self.__dict__)\n\n    @property\n    def change(self) -> Change:\n        return self.__change\n\n    @property\n    def old_file(self) -> Optional[ModelFile]:\n        return self.__old_file\n\n    @property\n    def new_file(self) -> Optional[ModelFile]:\n        return self.__new_file\n\n\nclass ModelDiffUtil:\n    @staticmethod\n    def diff_models(model_before: Model, model_after: Model) -> List[ModelDiff]:\n        \"\"\"\n        Compare two models and generate their diff\n        :param model_before:\n        :param model_after:\n        :return:\n        \"\"\"\n        diffs = []\n        file_names_before = model_before.get_file_names()\n        file_names_after = model_after.get_file_names()\n\n        # 'after minus before' gives added files\n        file_names_added = file_names_after.difference(file_names_before)\n        if file_names_added:\n            diffs += [\n                ModelDiff(\n                    ModelDiff.Change.ADDED,\n                    None,\n                    model_after.get_file(name)\n                ) for name in file_names_added\n            ]\n\n        # 'before minus after' gives removed files\n        file_names_removed = file_names_before.difference(file_names_after)\n        if file_names_removed:\n            diffs += [\n                ModelDiff(\n                    ModelDiff.Change.REMOVED,\n                    model_before.get_file(name),\n                    None\n                ) for name in file_names_removed\n            ]\n\n        # 'before intersect after' gives potentially updated files\n        file_names_updated = file_names_before.intersection(file_names_after)\n        for name in file_names_updated:\n            file_before = model_before.get_file(name)\n            file_after = model_after.get_file(name)\n            if file_before != file_after:\n                diffs.append(ModelDiff(ModelDiff.Change.UPDATED, file_before, file_after))\n\n        return diffs\n"
  },
  {
    "path": "src/python/model/file.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom datetime import datetime\nfrom enum import Enum\nfrom typing import Optional, List\nimport copy\nimport os\n\n\nclass ModelFile:\n    \"\"\"\n    Represents a file or directory\n    The information in this object may be inconsistent. E.g. the size of a directory\n    may not match the sum of its children. This is allowed as a source may have\n    updated only certain levels in the hierarchy. Specifically for this example,\n    an Lftp status provides local sizes for a downloading directory but not its\n    children.\n    \"\"\"\n    class State(Enum):\n        DEFAULT = 0\n        DOWNLOADING = 1\n        QUEUED = 2\n        DOWNLOADED = 3\n        DELETED = 4\n        EXTRACTING = 5\n        EXTRACTED = 6\n\n    def __init__(self, name: str, is_dir: bool):\n        self.__name = name  # file or folder name\n        self.__is_dir = is_dir  # True if this is a dir, False if file\n        self.__state = ModelFile.State.DEFAULT  # status\n        self.__remote_size = None  # remote size in bytes, None if file does not exist\n        self.__local_size = None  # local size in bytes, None if file does not exist\n        self.__transferred_size = None  # transferred size in bytes, None if file does not exist\n        self.__downloading_speed = None  # in bytes / sec, None if not downloading\n        self.__eta = None  # est. time remaining in seconds, None if not available\n        self.__is_extractable = False  # whether file is an archive or dir contains archives\n        self.__local_created_timestamp = None\n        self.__local_modified_timestamp = None\n        self.__remote_created_timestamp = None\n        self.__remote_modified_timestamp = None\n        # timestamp of the latest update\n        # Note: timestamp is not part of equality operator\n        self.__update_timestamp = datetime.now()\n        self.__children = []  # children files\n        self.__parent = None  # direct predecessor\n\n    def __eq__(self, other):\n        # disregard in comparisons:\n        #   timestamp: we don't care about it\n        #   parent: semantics are to check self and children only\n        #   children: check these manually for easier debugging\n        ka = set(self.__dict__).difference({\n            \"_ModelFile__update_timestamp\",\n            \"_ModelFile__parent\",\n            \"_ModelFile__children\"\n        })\n        kb = set(other.__dict__).difference({\n            \"_ModelFile__update_timestamp\",\n            \"_ModelFile__parent\",\n            \"_ModelFile__children\"\n        })\n        # Check self properties\n        if ka != kb:\n            return False\n        if not all(self.__dict__[k] == other.__dict__[k] for k in ka):\n            return False\n\n        # Check children's properties\n        if len(self.__children) != len(other.__children):\n            return False\n        my_children_dict = {f.name: f for f in self.__children}\n        other_children_dict = {f.name: f for f in other.__children}\n        if my_children_dict.keys() != other_children_dict.keys():\n            return False\n        for name in my_children_dict.keys():\n            if my_children_dict[name] != other_children_dict[name]:\n                return False\n\n        return True\n\n    def __repr__(self):\n        return str(self.__dict__)\n\n    @property\n    def name(self) -> str: return self.__name\n\n    @property\n    def is_dir(self) -> bool: return self.__is_dir\n\n    @property\n    def state(self) -> State: return self.__state\n\n    @state.setter\n    def state(self, state: State):\n        if type(state) != ModelFile.State:\n            raise TypeError\n        self.__state = state\n\n    @property\n    def remote_size(self) -> Optional[int]: return self.__remote_size\n\n    @remote_size.setter\n    def remote_size(self, remote_size: Optional[int]):\n        if type(remote_size) == int:\n            if remote_size < 0:\n                raise ValueError\n            self.__remote_size = remote_size\n        elif remote_size is None:\n            self.__remote_size = remote_size\n        else:\n            raise TypeError\n\n    @property\n    def local_size(self) -> Optional[int]: return self.__local_size\n\n    @local_size.setter\n    def local_size(self, local_size: Optional[int]):\n        if type(local_size) == int:\n            if local_size < 0:\n                raise ValueError\n            self.__local_size = local_size\n        elif local_size is None:\n            self.__local_size = local_size\n        else:\n            raise TypeError\n\n    @property\n    def transferred_size(self) -> Optional[int]: return self.__transferred_size\n\n    @transferred_size.setter\n    def transferred_size(self, transferred_size: Optional[int]):\n        if type(transferred_size) == int:\n            if transferred_size < 0:\n                raise ValueError\n            self.__transferred_size = transferred_size\n        elif transferred_size is None:\n            self.__transferred_size = transferred_size\n        else:\n            raise TypeError\n\n    @property\n    def downloading_speed(self) -> Optional[int]: return self.__downloading_speed\n\n    @downloading_speed.setter\n    def downloading_speed(self, downloading_speed: Optional[int]):\n        if type(downloading_speed) == int:\n            if downloading_speed < 0:\n                raise ValueError\n            self.__downloading_speed = downloading_speed\n        elif downloading_speed is None:\n            self.__downloading_speed = downloading_speed\n        else:\n            raise TypeError\n\n    @property\n    def update_timestamp(self) -> datetime: return self.__update_timestamp\n\n    @update_timestamp.setter\n    def update_timestamp(self, update_timestamp: datetime):\n        if type(update_timestamp) != datetime:\n            raise TypeError\n        self.__update_timestamp = update_timestamp\n\n    @property\n    def eta(self) -> Optional[int]: return self.__eta\n\n    @eta.setter\n    def eta(self, eta: Optional[int]):\n        if type(eta) == int:\n            if eta < 0:\n                raise ValueError\n            self.__eta = eta\n        elif eta is None:\n            self.__eta = eta\n        else:\n            raise TypeError\n\n    @property\n    def is_extractable(self) -> bool: return self.__is_extractable\n\n    @is_extractable.setter\n    def is_extractable(self, is_extractable: bool):\n        self.__is_extractable = is_extractable\n\n    @property\n    def local_created_timestamp(self) -> datetime: return self.__local_created_timestamp\n\n    @local_created_timestamp.setter\n    def local_created_timestamp(self, local_created_timestamp: datetime):\n        if type(local_created_timestamp) != datetime:\n            raise TypeError\n        self.__local_created_timestamp = local_created_timestamp\n\n    @property\n    def local_modified_timestamp(self) -> datetime: return self.__local_modified_timestamp\n\n    @local_modified_timestamp.setter\n    def local_modified_timestamp(self, local_modified_timestamp: datetime):\n        if type(local_modified_timestamp) != datetime:\n            raise TypeError\n        self.__local_modified_timestamp = local_modified_timestamp\n\n    @property\n    def remote_created_timestamp(self) -> datetime: return self.__remote_created_timestamp\n\n    @remote_created_timestamp.setter\n    def remote_created_timestamp(self, remote_created_timestamp: datetime):\n        if type(remote_created_timestamp) != datetime:\n            raise TypeError\n        self.__remote_created_timestamp = remote_created_timestamp\n\n    @property\n    def remote_modified_timestamp(self) -> datetime: return self.__remote_modified_timestamp\n\n    @remote_modified_timestamp.setter\n    def remote_modified_timestamp(self, remote_modified_timestamp: datetime):\n        if type(remote_modified_timestamp) != datetime:\n            raise TypeError\n        self.__remote_modified_timestamp = remote_modified_timestamp\n\n    @property\n    def full_path(self) -> str:\n        \"\"\"Full path including all predecessors\"\"\"\n        if self.__parent:\n            return os.path.join(self.__parent.full_path, self.name)\n        return self.name\n\n    def add_child(self, child_file: \"ModelFile\"):\n        if not self.is_dir:\n            raise TypeError(\"Cannot add child to a non-directory\")\n        if child_file is self:\n            raise ValueError(\"Cannot add parent as a child\")\n        if child_file.name in (f.name for f in self.__children):\n            raise ValueError(\"Cannot add child more than once\")\n        self.__children.append(child_file)\n        child_file.__parent = self\n\n    def get_children(self) -> List[\"ModelFile\"]:\n        return copy.copy(self.__children)\n\n    @property\n    def parent(self) -> Optional[\"ModelFile\"]:\n        return self.__parent\n"
  },
  {
    "path": "src/python/model/model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom abc import ABC, abstractmethod\nfrom typing import Set\n\n# my libs\nfrom common import AppError\nfrom .file import ModelFile\n\n\nclass ModelError(AppError):\n    \"\"\"\n    Exception indicating a model error\n    \"\"\"\n    pass\n\n\nclass IModelListener(ABC):\n    \"\"\"\n    Interface to listen to model events\n    \"\"\"\n    @abstractmethod\n    def file_added(self, file: ModelFile):\n        \"\"\"\n        Event indicating a file was added to the model\n        :param file:\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def file_removed(self, file: ModelFile):\n        \"\"\"\n        Event indicating that the given file was removed from the model\n        :param file:\n        :return:\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def file_updated(self, old_file: ModelFile, new_file: ModelFile):\n        \"\"\"\n        Event indicating that the given file was updated\n        :param old_file:\n        :param new_file:\n        :return:\n        \"\"\"\n        pass\n\n\nclass Model:\n    \"\"\"\n    Represents the entire state of lftp\n    \"\"\"\n    def __init__(self):\n        self.logger = logging.getLogger(\"Model\")\n        self.__files = {}  # name->LftpFile\n        self.__listeners = []\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(\"Model\")\n\n    def add_listener(self, listener: IModelListener):\n        \"\"\"\n        Add a model listener\n        :param listener:\n        :return:\n        \"\"\"\n        self.logger.debug(\"LftpModel: Adding a listener\")\n        if listener not in self.__listeners:\n            self.__listeners.append(listener)\n\n    def remove_listener(self, listener: IModelListener):\n        \"\"\"\n        Add a model listener\n        :param listener:\n        :return:\n        \"\"\"\n        self.logger.debug(\"LftpModel: Removing a listener\")\n        if listener not in self.__listeners:\n            self.logger.error(\"LftpModel: listener does not exist!\")\n        else:\n            self.__listeners.remove(listener)\n\n    def add_file(self, file: ModelFile):\n        \"\"\"\n        Add a file to the model\n        :param file:\n        :return:\n        \"\"\"\n        self.logger.debug(\"LftpModel: Adding file '{}'\".format(file.name))\n        if file.name in self.__files:\n            raise ModelError(\"File already exists in the model\")\n        self.__files[file.name] = file\n        for listener in self.__listeners:\n            listener.file_added(self.__files[file.name])\n\n    def remove_file(self, filename: str):\n        \"\"\"\n        Remove the file from the model\n        :param filename:\n        :return:\n        \"\"\"\n        self.logger.debug(\"LftpModel: Removing file '{}'\".format(filename))\n        if filename not in self.__files:\n            raise ModelError(\"File does not exist in the model\")\n        file = self.__files[filename]\n        del self.__files[filename]\n        for listener in self.__listeners:\n            listener.file_removed(file)\n\n    def update_file(self, file: ModelFile):\n        \"\"\"\n        Update an already existing file\n        :param file:\n        :return:\n        \"\"\"\n        self.logger.debug(\"LftpModel: Updating file '{}'\".format(file.name))\n        if file.name not in self.__files:\n            raise ModelError(\"File does not exist in the model\")\n        old_file = self.__files[file.name]\n        new_file = file\n        self.__files[file.name] = new_file\n        for listener in self.__listeners:\n            listener.file_updated(old_file, new_file)\n\n    def get_file(self, name: str) -> ModelFile:\n        \"\"\"\n        Returns a copy of the file of the given name\n        :param name:\n        :return:\n        \"\"\"\n        if name not in self.__files:\n            raise ModelError(\"File does not exist in the model\")\n        return self.__files[name]\n\n    def get_file_names(self) -> Set[str]:\n        return set(self.__files.keys())\n"
  },
  {
    "path": "src/python/pyproject.toml",
    "content": "[tool]\n[tool.poetry]\nname = \"seedsync\"\nversion = \"0.0.0\"\ndescription = \"\"\nauthors = []\n\n[tool.poetry.dependencies]\npython = \"~3.8\"\nbottle = \"*\"\nmkdocs = \"*\"\nmkdocs-material = \"*\"\nparameterized = \"*\"\npaste = \"*\"\npatool = \"*\"\npexpect = \"*\"\npytz = \"*\"\nrequests = \"*\"\ntblib = \"*\"\ntimeout-decorator = \"*\"\n\n[tool.poetry.dev-dependencies]\npyinstaller = \"*\"\ntestfixtures = \"*\"\nwebtest = \"*\"\npytest = \"^6.2.1\"\n"
  },
  {
    "path": "src/python/scan_fs.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport pickle\nimport sys\nimport argparse\n\n# my libs\nfrom system import SystemScanner, SystemFile, SystemScannerError\n\n\nif __name__ == \"__main__\":\n    if sys.hexversion < 0x03050000:\n        sys.exit(\"Python 3.5 or newer is required to run this program.\")\n\n    parser = argparse.ArgumentParser(description=\"File size scanner\")\n    parser.add_argument(\"path\", help=\"Path of the root directory to scan\")\n    parser.add_argument(\"-e\", \"--exclude-hidden\", action=\"store_true\", default=False,\n                        help=\"Exclude hidden files\")\n    parser.add_argument(\"-H\", \"--human-readable\", action=\"store_true\", default=False,\n                        help=\"Human readable output\")\n    args = parser.parse_args()\n\n    scanner = SystemScanner(args.path)\n    if args.exclude_hidden:\n        scanner.add_exclude_prefix(\".\")\n    try:\n        root_files = scanner.scan()\n    except SystemScannerError as e:\n        sys.exit(\"SystemScannerError: {}\".format(str(e)))\n    if args.human_readable:\n        def print_file(file: SystemFile, level: int):\n            sys.stdout.write(\"  \"*level)\n            sys.stdout.write(\"{} {} {}\\n\".format(\n                file.name,\n                \"d\" if file.is_dir else \"f\",\n                file.size\n            ))\n            for child in file.children:\n                print_file(child, level+1)\n        for root_file in root_files:\n            print_file(root_file, 0)\n    else:\n        bytes_out = pickle.dumps(root_files)\n        sys.stdout.buffer.write(bytes_out)\n"
  },
  {
    "path": "src/python/seedsync.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport signal\nimport sys\nimport time\nimport argparse\nimport os\nimport logging\nfrom datetime import datetime\nfrom logging.handlers import RotatingFileHandler\nfrom typing import Optional, Type, TypeVar\nimport shutil\nimport platform\n\n# my libs\nfrom common import ServiceExit, Context, Constants, Config, Args, AppError\nfrom common import ServiceRestart\nfrom common import Localization, Status, ConfigError, Persist, PersistError\nfrom controller import Controller, ControllerJob, ControllerPersist, AutoQueue, AutoQueuePersist\nfrom web import WebAppJob, WebAppBuilder\n\n\nT_Persist = TypeVar('T_Persist', bound=Persist)\n\n\nclass Seedsync:\n    \"\"\"\n    Implements the service for seedsync\n    It is run in the main thread (no daemonization)\n    \"\"\"\n    __FILE_CONFIG = \"settings.cfg\"\n    __FILE_AUTO_QUEUE_PERSIST = \"autoqueue.persist\"\n    __FILE_CONTROLLER_PERSIST = \"controller.persist\"\n    __CONFIG_DUMMY_VALUE = \"<replace me>\"\n\n    # This logger is used to print any exceptions caught at top module\n    logger = None\n\n    def __init__(self):\n        # Parse the args\n        args = self._parse_args(sys.argv[1:])\n\n        # Create/load config\n        config = None\n        self.config_path = os.path.join(args.config_dir, Seedsync.__FILE_CONFIG)\n        create_default_config = False\n        if os.path.isfile(self.config_path):\n            try:\n                config = Config.from_file(self.config_path)\n            except (ConfigError, PersistError):\n                Seedsync.__backup_file(self.config_path)\n                # set config to default\n                create_default_config = True\n        else:\n            create_default_config = True\n\n        if create_default_config:\n            # Create default config\n            config = Seedsync._create_default_config()\n            config.to_file(self.config_path)\n\n        # Determine the true value of debug\n        is_debug = args.debug or config.general.debug\n\n        # Create context args\n        ctx_args = Args()\n        ctx_args.local_path_to_scanfs = args.scanfs\n        ctx_args.html_path = args.html\n        ctx_args.debug = is_debug\n        ctx_args.exit = args.exit\n\n        # Logger setup\n        # We separate the main log from the web-access log\n        logger = self._create_logger(name=Constants.SERVICE_NAME,\n                                     debug=is_debug,\n                                     logdir=args.logdir)\n        Seedsync.logger = logger\n        web_access_logger = self._create_logger(name=Constants.WEB_ACCESS_LOG_NAME,\n                                                debug=is_debug,\n                                                logdir=args.logdir)\n        logger.info(\"Debug mode is {}.\".format(\"enabled\" if is_debug else \"disabled\"))\n\n        # Create status\n        status = Status()\n\n        # Create context\n        self.context = Context(logger=logger,\n                               web_access_logger=web_access_logger,\n                               config=config,\n                               args=ctx_args,\n                               status=status)\n\n        # Register the signal handlers\n        signal.signal(signal.SIGTERM, self.signal)\n        signal.signal(signal.SIGINT, self.signal)\n\n        # Print context to log\n        self.context.print_to_log()\n\n        # Load the persists\n        self.controller_persist_path = os.path.join(args.config_dir, Seedsync.__FILE_CONTROLLER_PERSIST)\n        self.controller_persist = self._load_persist(ControllerPersist, self.controller_persist_path)\n\n        self.auto_queue_persist_path = os.path.join(args.config_dir, Seedsync.__FILE_AUTO_QUEUE_PERSIST)\n        self.auto_queue_persist = self._load_persist(AutoQueuePersist, self.auto_queue_persist_path)\n\n    def run(self):\n        self.context.logger.info(\"Starting SeedSync\")\n        self.context.logger.info(\"Platform: {}\".format(platform.machine()))\n\n        # Create controller\n        controller = Controller(self.context, self.controller_persist)\n\n        # Create auto queue\n        auto_queue = AutoQueue(self.context, self.auto_queue_persist, controller)\n\n        # Create web app\n        web_app_builder = WebAppBuilder(self.context, controller, self.auto_queue_persist)\n        web_app = web_app_builder.build()\n\n        # Define child threads\n        controller_job = ControllerJob(\n            context=self.context.create_child_context(ControllerJob.__name__),\n            controller=controller,\n            auto_queue=auto_queue\n        )\n        webapp_job = WebAppJob(\n            context=self.context.create_child_context(WebAppJob.__name__),\n            web_app=web_app\n        )\n\n        do_start_controller = True\n\n        # Initial checks to see if we should bother starting the controller\n        if Seedsync._detect_incomplete_config(self.context.config):\n            if not self.context.args.exit:\n                do_start_controller = False\n                self.context.logger.error(\"Config is incomplete\")\n                self.context.status.server.up = False\n                self.context.status.server.error_msg = Localization.Error.SETTINGS_INCOMPLETE\n            else:\n                raise AppError(\"Config is incomplete\")\n\n        # Start child threads here\n        if do_start_controller:\n            controller_job.start()\n        webapp_job.start()\n\n        try:\n            prev_persist_timestamp = datetime.now()\n\n            # Thread loop\n            while True:\n                # Persist to file occasionally\n                now = datetime.now()\n                if (now - prev_persist_timestamp).total_seconds() > Constants.MIN_PERSIST_TO_FILE_INTERVAL_IN_SECS:\n                    prev_persist_timestamp = now\n                    self.persist()\n\n                # Propagate exceptions\n                webapp_job.propagate_exception()\n                # Catch controller exceptions and keep running, but notify the web server of the error\n                try:\n                    controller_job.propagate_exception()\n                except AppError as exc:\n                    if not self.context.args.exit:\n                        self.context.status.server.up = False\n                        self.context.status.server.error_msg = str(exc)\n                        Seedsync.logger.exception(\"Caught exception\")\n                    else:\n                        raise\n\n                # Check if a restart is requested\n                if web_app_builder.server_handler.is_restart_requested():\n                    raise ServiceRestart()\n\n                # Nothing else to do\n                time.sleep(Constants.MAIN_THREAD_SLEEP_INTERVAL_IN_SECS)\n\n        except Exception:\n            self.context.logger.info(\"Exiting Seedsync\")\n\n            # This sleep is important to allow the jobs to finish setup before we terminate them\n            # If we kill too early, the jobs may leave lingering threads around\n            # Note: There might be a better way to ensure that job setup has completed, but this\n            #       will do for now\n            time.sleep(Constants.MAIN_THREAD_SLEEP_INTERVAL_IN_SECS)\n\n            # Join all the threads here\n            if do_start_controller:\n                controller_job.terminate()\n            webapp_job.terminate()\n\n            # Wait for the threads to close\n            if do_start_controller:\n                controller_job.join()\n            webapp_job.join()\n\n            # Last persist\n            self.persist()\n\n            # Raise any exceptions so they can be logged properly\n            # Note: ServiceRestart and ServiceExit will be caught and handled\n            #       by outer code\n            raise\n\n    def persist(self):\n        # Save the persists\n        self.context.logger.debug(\"Persisting states to file\")\n        self.controller_persist.to_file(self.controller_persist_path)\n        self.auto_queue_persist.to_file(self.auto_queue_persist_path)\n        self.context.config.to_file(self.config_path)\n\n    def signal(self, signum: int, _):\n        # noinspection PyUnresolvedReferences\n        # Signals is a generated enum\n        self.context.logger.info(\"Caught signal {}\".format(signal.Signals(signum).name))\n        raise ServiceExit()\n\n    @staticmethod\n    def _parse_args(args):\n        parser = argparse.ArgumentParser(description=\"Seedsync daemon\")\n        parser.add_argument(\"-c\", \"--config_dir\", required=True, help=\"Path to config directory\")\n        parser.add_argument(\"--logdir\", help=\"Directory for log files\")\n        parser.add_argument(\"-d\", \"--debug\", action=\"store_true\", help=\"Enable debug logs\")\n        parser.add_argument(\"--exit\", action=\"store_true\", help=\"Exit on error\")\n\n        # Whether package is frozen\n        is_frozen = getattr(sys, 'frozen', False)\n\n        # Html path is only required if not running a frozen package\n        # For a frozen package, set default to root/html\n        # noinspection PyUnresolvedReferences\n        # noinspection PyProtectedMember\n        default_html_path = os.path.join(sys._MEIPASS, \"html\") if is_frozen else None\n        parser.add_argument(\"--html\",\n                            required=not is_frozen,\n                            default=default_html_path,\n                            help=\"Path to directory containing html resources\")\n\n        # Scanfs path is only required if not running a frozen package\n        # For a frozen package, set default to root/scanfs\n        # noinspection PyUnresolvedReferences\n        # noinspection PyProtectedMember\n        default_scanfs_path = os.path.join(sys._MEIPASS, \"scanfs\") if is_frozen else None\n        parser.add_argument(\"--scanfs\",\n                            required=not is_frozen,\n                            default=default_scanfs_path,\n                            help=\"Path to scanfs executable\")\n\n        return parser.parse_args(args)\n\n    @staticmethod\n    def _create_logger(name: str, debug: bool, logdir: Optional[str]) -> logging.Logger:\n        logger = logging.getLogger(name)\n\n        # Remove any existing handlers (needed when restarting)\n        handlers = logger.handlers[:]\n        for handler in handlers:\n            handler.close()\n            logger.removeHandler(handler)\n\n        logger.setLevel(logging.DEBUG if debug else logging.INFO)\n        if logdir is not None:\n            # Output logs to a file in the given directory\n            handler = RotatingFileHandler(\n                        \"{}/{}.log\".format(logdir, name),\n                        maxBytes=Constants.MAX_LOG_SIZE_IN_BYTES,\n                        backupCount=Constants.LOG_BACKUP_COUNT\n                      )\n        else:\n            handler = logging.StreamHandler(sys.stdout)\n        formatter = logging.Formatter(\n            \"%(asctime)s - %(levelname)s - %(name)s (%(processName)s/%(threadName)s) - %(message)s\"\n        )\n        handler.setFormatter(formatter)\n        logger.addHandler(handler)\n        return logger\n\n    @staticmethod\n    def _create_default_config() -> Config:\n        \"\"\"\n        Create a config with default values\n        :return:\n        \"\"\"\n        config = Config()\n\n        config.general.debug = False\n        config.general.verbose = False\n\n        config.lftp.remote_address = Seedsync.__CONFIG_DUMMY_VALUE\n        config.lftp.remote_username = Seedsync.__CONFIG_DUMMY_VALUE\n        config.lftp.remote_password = Seedsync.__CONFIG_DUMMY_VALUE\n        config.lftp.remote_port = 22\n        config.lftp.remote_path = Seedsync.__CONFIG_DUMMY_VALUE\n        config.lftp.local_path = Seedsync.__CONFIG_DUMMY_VALUE\n        config.lftp.remote_path_to_scan_script = \"/tmp\"\n        config.lftp.use_ssh_key = False\n        config.lftp.num_max_parallel_downloads = 2\n        config.lftp.num_max_parallel_files_per_download = 4\n        config.lftp.num_max_connections_per_root_file = 4\n        config.lftp.num_max_connections_per_dir_file = 4\n        config.lftp.num_max_total_connections = 16\n        config.lftp.use_temp_file = False\n\n        config.controller.interval_ms_remote_scan = 30000\n        config.controller.interval_ms_local_scan = 10000\n        config.controller.interval_ms_downloading_scan = 1000\n        config.controller.extract_path = \"/tmp\"\n        config.controller.use_local_path_as_extract_path = True\n\n        config.web.port = 8800\n\n        config.autoqueue.enabled = True\n        config.autoqueue.patterns_only = False\n        config.autoqueue.auto_extract = True\n\n        return config\n\n    @staticmethod\n    def _detect_incomplete_config(config: Config) -> bool:\n        config_dict = config.as_dict()\n        for sec_name in config_dict:\n            for key in config_dict[sec_name]:\n                if Seedsync.__CONFIG_DUMMY_VALUE == config_dict[sec_name][key]:\n                    return True\n        return False\n\n    @staticmethod\n    def _load_persist(cls: Type[T_Persist], file_path: str) -> T_Persist:\n        \"\"\"\n        Loads a persist from file.\n        Backs up existing persist if it's corrupted. Returns a new blank\n        persist in its place.\n        :param cls:\n        :param file_path:\n        :return:\n        \"\"\"\n        if os.path.isfile(file_path):\n            try:\n                return cls.from_file(file_path)\n            except PersistError:\n                if Seedsync.logger:\n                    Seedsync.logger.exception(\"Caught exception\")\n\n                # backup file\n                Seedsync.__backup_file(file_path)\n\n                # noinspection PyCallingNonCallable\n                return cls()\n        else:\n            # noinspection PyCallingNonCallable\n            return cls()\n\n    @staticmethod\n    def __backup_file(file_path: str):\n        file_name = os.path.basename(file_path)\n        file_dir = os.path.dirname(file_path)\n        i = 1\n        while True:\n            backup_path = os.path.join(\n                file_dir, \"{}.{}.bak\".format(file_name, i)\n            )\n            if not os.path.exists(backup_path):\n                break\n            i += 1\n        if Seedsync.logger:\n            Seedsync.logger.info(\"Backing up {} to {}\".format(file_path, backup_path))\n        shutil.copy(file_path, backup_path)\n\n\nif __name__ == \"__main__\":\n    if sys.hexversion < 0x03050000:\n        sys.exit(\"Python 3.5 or newer is required to run this program.\")\n\n    while True:\n        try:\n            seedsync = Seedsync()\n            seedsync.run()\n        except ServiceExit:\n            break\n        except ServiceRestart:\n            Seedsync.logger.info(\"Restarting...\")\n            continue\n        except Exception as e:\n            Seedsync.logger.exception(\"Caught exception\")\n            raise\n\n        Seedsync.logger.info(\"Exited successfully\")\n"
  },
  {
    "path": "src/python/ssh/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .sshcp import Sshcp, SshcpError\n"
  },
  {
    "path": "src/python/ssh/sshcp.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport time\n\nimport pexpect\n\n# my libs\nfrom common import AppError\n\n\nclass SshcpError(AppError):\n    \"\"\"\n    Custom exception that describes the failure of the ssh command\n    \"\"\"\n    pass\n\n\nclass Sshcp:\n    \"\"\"\n    Scp command utility\n    \"\"\"\n    __TIMEOUT_SECS = 180\n\n    def __init__(self,\n                 host: str,\n                 port: int,\n                 user: str = None,\n                 password: str = None):\n        if host is None:\n            raise ValueError(\"Hostname not specified.\")\n        self.__host = host\n        self.__port = port\n        self.__user = user\n        self.__password = password\n        self.logger = logging.getLogger(self.__class__.__name__)\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        self.logger = base_logger.getChild(self.__class__.__name__)\n\n    def __run_command(self,\n                      command: str,\n                      flags: str,\n                      args: str) -> bytes:\n\n        command_args = [\n            command,\n            flags\n        ]\n\n        # Common flags\n        command_args += [\n            \"-o\", \"StrictHostKeyChecking=no\",  # ignore host key changes\n            \"-o\", \"UserKnownHostsFile=/dev/null\",  # ignore known hosts file\n            \"-o\", \"LogLevel=error\",  # suppress warnings\n        ]\n\n        if self.__password is None:\n            command_args += [\n                \"-o\", \"PasswordAuthentication=no\",  # don't ask for password\n            ]\n        else:\n            command_args += [\n                \"-o\", \"PubkeyAuthentication=no\"  # don't use key authentication\n            ]\n\n        command_args.append(args)\n\n        command = \" \".join(command_args)\n        self.logger.debug(\"Command: {}\".format(command))\n\n        start_time = time.time()\n        sp = pexpect.spawn(command)\n        try:\n            if self.__password is not None:\n                i = sp.expect([\n                    'password: ',  # i=0, all's good\n                    pexpect.EOF,  # i=1, unknown error\n                    'lost connection',  # i=2, connection refused\n                    'Could not resolve hostname',  # i=3, bad hostname\n                    'Connection refused',  # i=4, connection refused\n                ])\n                if i > 0:\n                    before = sp.before.decode().strip() if sp.before != pexpect.EOF else \"\"\n                    after = sp.after.decode().strip() if sp.after != pexpect.EOF else \"\"\n                    self.logger.warning(\"Command failed: '{} - {}'\".format(before, after))\n                if i == 1:\n                    error_msg = \"Unknown error\"\n                    if sp.before.decode().strip():\n                        error_msg += \" - \" + sp.before.decode().strip()\n                    raise SshcpError(error_msg)\n                elif i == 3:\n                    raise SshcpError(\"Bad hostname: {}\".format(self.__host))\n                elif i in {2, 4}:\n                    error_msg = \"Connection refused by server\"\n                    if sp.before.decode().strip():\n                        error_msg += \" - \" + sp.before.decode().strip()\n                    raise SshcpError(error_msg)\n                sp.sendline(self.__password)\n\n            i = sp.expect(\n                [\n                    pexpect.EOF,  # i=0, all's good\n                    'password: ',  # i=1, wrong password\n                    'lost connection',  # i=2, connection refused\n                    'Could not resolve hostname',  # i=3, bad hostname\n                    'Connection refused',  # i=4, connection refused\n                ],\n                timeout=self.__TIMEOUT_SECS\n            )\n            if i > 0:\n                before = sp.before.decode().strip() if sp.before != pexpect.EOF else \"\"\n                after = sp.after.decode().strip() if sp.after != pexpect.EOF else \"\"\n                self.logger.warning(\"Command failed: '{} - {}'\".format(before, after))\n            if i == 1:\n                raise SshcpError(\"Incorrect password\")\n            elif i == 3:\n                raise SshcpError(\"Bad hostname: {}\".format(self.__host))\n            elif i in {2, 4}:\n                error_msg = \"Connection refused by server\"\n                if sp.before.decode().strip():\n                    error_msg += \" - \" + sp.before.decode().strip()\n                raise SshcpError(error_msg)\n\n        except pexpect.exceptions.TIMEOUT:\n            self.logger.exception(\"Timed out\")\n            self.logger.error(\"Command output before:\\n{}\".format(sp.before))\n            raise SshcpError(\"Timed out\")\n        sp.close()\n        end_time = time.time()\n\n        self.logger.debug(\"Return code: {}\".format(sp.exitstatus))\n        self.logger.debug(\"Command took {:.3f}s\".format(end_time-start_time))\n        if sp.exitstatus != 0:\n            before = sp.before.decode().strip() if sp.before != pexpect.EOF else \"\"\n            after = sp.after.decode().strip() if sp.after != pexpect.EOF else \"\"\n            self.logger.warning(\"Command failed: '{} - {}'\".format(before, after))\n            raise SshcpError(sp.before.decode().strip())\n\n        return sp.before.replace(b'\\r\\n', b'\\n').strip()\n\n    def shell(self, command: str) -> bytes:\n        \"\"\"\n        Run a shell command on remote service and return output\n        :param command:\n        :return:\n        \"\"\"\n        if not command:\n            raise ValueError(\"Command cannot be empty\")\n\n        # escape the command\n        if \"'\" in command and '\"' in command:\n            # I don't know how to handle this yet...\n            raise ValueError(\"Command cannot contain both single and double quotes\")\n        elif '\"' in command:\n            # double quote in command, cover with single quotes\n            command = \"'{}'\".format(command)\n        else:\n            # no double quote in command, cover with double quotes\n            command = '\"{}\"'.format(command)\n\n        flags = [\n            \"-p\", str(self.__port),  # port\n        ]\n        args = [\n            \"{}@{}\".format(self.__user, self.__host),\n            command\n        ]\n        return self.__run_command(\n            command=\"ssh\",\n            flags=\" \".join(flags),\n            args=\" \".join(args)\n        )\n\n    def copy(self, local_path: str, remote_path: str):\n        \"\"\"\n        Copies local file at local_path to remote remote_path\n        :param local_path:\n        :param remote_path:\n        :return:\n        \"\"\"\n        if not local_path:\n            raise ValueError(\"Local path cannot be empty\")\n        if not remote_path:\n            raise ValueError(\"Remote path cannot be empty\")\n\n        flags = [\n            \"-q\",  # quiet\n            \"-P\", str(self.__port),  # port\n        ]\n        args = [\n            local_path,\n            \"{}@{}:{}\".format(self.__user, self.__host, remote_path)\n        ]\n        self.__run_command(\n            command=\"scp\",\n            flags=\" \".join(flags),\n            args=\" \".join(args)\n        )\n"
  },
  {
    "path": "src/python/system/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .scanner import SystemScanner, SystemScannerError\nfrom .file import SystemFile\n"
  },
  {
    "path": "src/python/system/file.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom typing import List\nfrom datetime import datetime\n\n\nclass SystemFile:\n    \"\"\"\n    Represents a system file or directory\n    \"\"\"\n    def __init__(self,\n                 name: str,\n                 size: int,\n                 is_dir: bool = False,\n                 time_created: datetime = None,\n                 time_modified: datetime = None):\n        if size < 0:\n            raise ValueError(\"File size must be greater than zero\")\n        self.__name = name\n        self.__size = size  # in bytes\n        self.__is_dir = is_dir\n        self.__timestamp_created = time_created\n        self.__timestamp_modified = time_modified\n        self.__children = []\n\n    def __eq__(self, other):\n        return self.__dict__ == other.__dict__\n\n    def __repr__(self):\n        return str(self.__dict__)\n\n    @property\n    def name(self) -> str: return self.__name\n\n    @property\n    def size(self) -> int: return self.__size\n\n    @property\n    def is_dir(self) -> bool: return self.__is_dir\n\n    @property\n    def timestamp_created(self) -> datetime: return self.__timestamp_created\n\n    @property\n    def timestamp_modified(self) -> datetime: return self.__timestamp_modified\n\n    @property\n    def children(self) -> List[\"SystemFile\"]: return self.__children\n\n    def add_child(self, file: \"SystemFile\"):\n        if not self.__is_dir:\n            raise TypeError(\"Cannot add children to a file\")\n        self.__children.append(file)\n"
  },
  {
    "path": "src/python/system/scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nimport re\nfrom typing import List\nfrom datetime import datetime\n\n# my libs\nfrom common import AppError\nfrom .file import SystemFile\n\n\nclass SystemScannerError(AppError):\n    \"\"\"\n    Exception indicating a bad config value\n    \"\"\"\n    pass\n\n\nclass PseudoDirEntry:\n    def __init__(self, name: str, path: str, is_dir: bool, stat):\n        self.name = name\n        self.path = path\n        self._is_dir = is_dir\n        self._stat = stat\n\n    def is_dir(self):\n        return self._is_dir\n\n    def stat(self):\n        return self._stat\n\n\nclass SystemScanner:\n    \"\"\"\n    Scans system to generate list of files and sizes\n    Children are returned in alphabetical order\n    \"\"\"\n    __LFTP_STATUS_FILE_SUFFIX = \".lftp-pget-status\"\n\n    def __init__(self, path_to_scan: str):\n        \"\"\"\n        :param path_to_scan: path to file or directory to scan\n        \"\"\"\n        self.path_to_scan = path_to_scan\n        self.exclude_prefixes = []\n        self.exclude_suffixes = [SystemScanner.__LFTP_STATUS_FILE_SUFFIX]\n        self.__lftp_temp_file_suffix = None\n\n    def add_exclude_prefix(self, prefix: str):\n        \"\"\"\n        Exclude files that begin with the given prefix\n        :param prefix:\n        :return:\n        \"\"\"\n        self.exclude_prefixes.append(prefix)\n\n    def add_exclude_suffix(self, suffix: str):\n        \"\"\"\n        Exclude files that end with the given suffix\n        :param suffix:\n        :return:\n        \"\"\"\n        self.exclude_suffixes.append(suffix)\n\n    def set_lftp_temp_suffix(self, suffix: str):\n        \"\"\"\n        Set the suffix used by LFTP temp files\n        Scanner will ignore the suffix and show these files with their\n        original name\n        :return:\n        \"\"\"\n        self.__lftp_temp_file_suffix = suffix\n\n    def scan(self) -> List[SystemFile]:\n        \"\"\"\n        Scan the path to generate list of system files\n        :return:\n        \"\"\"\n        if not os.path.exists(self.path_to_scan):\n            raise SystemScannerError(\"Path does not exist: {}\".format(self.path_to_scan))\n        elif not os.path.isdir(self.path_to_scan):\n            raise SystemScannerError(\"Path is not a directory: {}\".format(self.path_to_scan))\n        return self.__create_children(self.path_to_scan)\n\n    def scan_single(self, name: str) -> SystemFile:\n        \"\"\"\n        Scan a single file/dir\n        :param name:\n        :return:\n        \"\"\"\n        path = os.path.join(self.path_to_scan, name)\n        temp_path = (path + self.__lftp_temp_file_suffix) if self.__lftp_temp_file_suffix else None\n\n        if os.path.exists(path):\n            # We're good to go\n            pass\n        elif temp_path and os.path.isfile(temp_path):\n            # There's a temp file, use that\n            path = temp_path\n        else:\n            raise SystemScannerError(\"Path does not exist: {}\".format(path))\n\n        return self.__create_system_file(\n            PseudoDirEntry(\n                name=name,\n                path=path,\n                is_dir=os.path.isdir(path),\n                stat=os.stat(path)\n            )\n        )\n\n    def __create_system_file(self, entry) -> SystemFile:\n        \"\"\"\n        Creates a system file from a DirEntry.\n\n        Note:\n             Strips out any characters not-supported in utf-8. This prevents problems\n             in other systems.\n\n        Args:\n            entry: DirEntry object\n\n        Returns:\n            The SystemFile object\n        \"\"\"\n        if entry.is_dir():\n            sub_children = self.__create_children(entry.path)\n            name = entry.name.encode('utf-8', 'surrogateescape').decode('utf-8', 'replace')\n            size = sum(sub_child.size for sub_child in sub_children)\n            time_created = None\n            try:\n                time_created = datetime.fromtimestamp(entry.stat().st_birthtime)\n            except AttributeError:\n                pass\n            time_modified = datetime.fromtimestamp(entry.stat().st_mtime)\n            sys_file = SystemFile(name,\n                                  size,\n                                  True,\n                                  time_created=time_created,\n                                  time_modified=time_modified)\n            for sub_child in sub_children:\n                sys_file.add_child(sub_child)\n        else:\n            file_size = entry.stat().st_size\n            # Check if it's a partial lftp file, and if so, use the lftp\n            # status to get the real file size\n            lftp_status_file_path = entry.path + SystemScanner.__LFTP_STATUS_FILE_SUFFIX\n            if os.path.isfile(lftp_status_file_path):\n                with open(lftp_status_file_path, \"r\") as f:\n                    file_size = SystemScanner._lftp_status_file_size(f.read())\n            # Check to see if this is a lftp temp file, and if so, use the real name\n            file_name = entry.name.encode('utf-8', 'surrogateescape').decode('utf-8', 'replace')\n            if self.__lftp_temp_file_suffix is not None and \\\n                    file_name != self.__lftp_temp_file_suffix and \\\n                    file_name.endswith(self.__lftp_temp_file_suffix):\n                file_name = file_name[:-len(self.__lftp_temp_file_suffix)]\n            time_created = None\n            try:\n                time_created = datetime.fromtimestamp(entry.stat().st_birthtime)\n            except AttributeError:\n                pass\n            time_modified = datetime.fromtimestamp(entry.stat().st_mtime)\n            sys_file = SystemFile(file_name,\n                                  file_size,\n                                  False,\n                                  time_created=time_created,\n                                  time_modified=time_modified)\n        return sys_file\n\n    def __create_children(self, path: str) -> List[SystemFile]:\n        children = []\n        # Files may get deleted while scanning, ignore the error\n        for entry in os.scandir(path):\n            # Skip excluded entries\n            skip = False\n            for prefix in self.exclude_prefixes:\n                if entry.name.startswith(prefix):\n                    skip = True\n            for suffix in self.exclude_suffixes:\n                if entry.name.endswith(suffix):\n                    skip = True\n            if skip:\n                continue\n\n            try:\n                sys_file = self.__create_system_file(entry)\n            except FileNotFoundError:\n                continue\n            children.append(sys_file)\n        children.sort(key=lambda fl: fl.name)\n        return children\n\n    @staticmethod\n    def _lftp_status_file_size(status: str) -> int:\n        \"\"\"\n        Returns the real file size as indicated by an lftp status content\n        :param status:\n        :return:\n        \"\"\"\n        size_pattern_m = re.compile(\"^size=(\\d+)$\")\n        pos_pattern_m = re.compile(\"^\\d+\\.pos=(\\d+)$\")\n        limit_pattern_m = re.compile(\"^\\d+\\.limit=(\\d+)$\")\n        lines = [s.strip() for s in status.splitlines()]\n        lines = list(filter(None, lines))  # remove blank lines\n        if not lines:\n            return 0\n\n        empty_size = 0\n        # First line should be a size\n        result = size_pattern_m.search(lines[0])\n        if not result:\n            return 0\n        total_size = int(result.group(1))\n        lines.pop(0)\n        while lines:\n            # There should be pairs of lines\n            if len(lines) < 2:\n                return 0\n            result_pos = pos_pattern_m.search(lines[0])\n            result_limit = limit_pattern_m.search(lines[1])\n            if not result_pos or not result_limit:\n                return 0\n            pos = int(result_pos.group(1))\n            limit = int(result_limit.group(1))\n            empty_size += limit - pos\n            lines.pop(0)\n            lines.pop(0)\n\n        return total_size-empty_size\n"
  },
  {
    "path": "src/python/tests/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_controller/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_controller/test_controller.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock, patch, PropertyMock\nimport os\nimport tempfile\nimport shutil\nfrom filecmp import dircmp, cmp\nimport logging\nimport sys\nimport zipfile\nimport subprocess\nfrom datetime import datetime\nimport stat\n\nimport timeout_decorator\n\nfrom tests.utils import TestUtils\nfrom common import overrides, Context, Config, Args, AppError, Localization, Status\nfrom controller import Controller, ControllerPersist\nfrom model import ModelFile, IModelListener\n\n\nclass DummyListener(IModelListener):\n    @overrides(IModelListener)\n    def file_added(self, file: ModelFile):\n        pass\n\n    @overrides(IModelListener)\n    def file_updated(self, old_file: ModelFile, new_file: ModelFile):\n        pass\n\n    @overrides(IModelListener)\n    def file_removed(self, file: ModelFile):\n        pass\n\n\nclass DummyCommandCallback(Controller.Command.ICallback):\n    @overrides(Controller.Command.ICallback)\n    def on_failure(self, error: str):\n        pass\n\n    @overrides(Controller.Command.ICallback)\n    def on_success(self):\n        pass\n\n\n# noinspection SpellCheckingInspection\nclass TestController(unittest.TestCase):\n    __KEEP_FILES = False  # for debugging\n\n    maxDiff = None\n    temp_dir = None\n    work_dir = None\n\n    @staticmethod\n    def my_mkdir(*args):\n        os.mkdir(os.path.join(TestController.temp_dir, *args))\n\n    @staticmethod\n    def my_touch(size, *args):\n        path = os.path.join(TestController.temp_dir, *args)\n        with open(path, 'wb') as f:\n            f.write(bytearray([0xff] * size))\n\n    @staticmethod\n    def create_archive(*args):\n        \"\"\"\n        Creates a archive of a text file containing name of archive\n        The text file is named \"<archive.ext>.txt\"\n        Returns archive file size\n        \"\"\"\n        path = os.path.join(TestController.temp_dir, *args)\n        archive_name = os.path.basename(path)\n        temp_file_path = os.path.join(TestController.work_dir, archive_name+\".txt\")\n        with open(temp_file_path, \"w\") as f:\n            f.write(os.path.basename(path))\n\n        ext = os.path.splitext(os.path.basename(path))[1]\n        ext = ext[1:]\n        if ext == \"zip\":\n            zf = zipfile.ZipFile(path, \"w\", zipfile.ZIP_DEFLATED)\n            zf.write(temp_file_path, os.path.basename(temp_file_path))\n            zf.close()\n        elif ext == \"rar\":\n            fnull = open(os.devnull, 'w')\n            subprocess.Popen(\n                [\n                    \"rar\",\n                    \"a\",\n                    \"-ep\",\n                    path,\n                    temp_file_path\n                ],\n                stdout=fnull\n            ).communicate()\n        else:\n            raise ValueError(\"Unsupported archive format: {}\".format(os.path.basename(path)))\n        return os.path.getsize(path)\n\n    @overrides(unittest.TestCase)\n    def setUp(self):\n        # Create a temp directory\n        TestController.temp_dir = tempfile.mkdtemp(prefix=\"test_controller\")\n\n        # Allow group access for the seedsynctest account\n        TestUtils.chmod_from_to(self.temp_dir, tempfile.gettempdir(), 0o775)\n\n        # Create a work directory for temp files\n        TestController.work_dir = os.path.join(TestController.temp_dir, \"work\")\n        os.mkdir(TestController.work_dir)\n\n        # Create a bunch of files and directories\n        # remote\n        #   ra [dir]\n        #     raa [file, 1*1024 bytes]\n        #     rab [dir]\n        #       raba [file, 5*1024 bytes]\n        #       rabb [file, 2*1024 bytes]\n        #   rb [dir]\n        #     rba [file, 4*1024 bytes]\n        #     rbb [file, 5*1024 bytes]\n        #   rc [file, 10*1024 bytes]\n        # local\n        #   la [dir]\n        #      laa [file, 1*1024 bytes]\n        #      lab [file, 1*1024 bytes]\n        #   lb [file, 2*1024 bytes]\n        TestController.my_mkdir(\"remote\")\n        TestController.my_mkdir(\"remote\", \"ra\")\n        TestController.my_touch(1*1024, \"remote\", \"ra\", \"raa\")\n        TestController.my_mkdir(\"remote\", \"ra\", \"rab\")\n        TestController.my_touch(5*1024, \"remote\", \"ra\", \"rab\", \"raba\")\n        TestController.my_touch(2*1024, \"remote\", \"ra\", \"rab\", \"rabb\")\n        TestController.my_mkdir(\"remote\", \"rb\")\n        TestController.my_touch(4*1024, \"remote\", \"rb\", \"rba\")\n        TestController.my_touch(5*1024, \"remote\", \"rb\", \"rbb\")\n        TestController.my_touch(10*1024, \"remote\", \"rc\")\n        TestController.my_mkdir(\"local\")\n        TestController.my_mkdir(\"local\", \"la\")\n        TestController.my_touch(1*1024, \"local\", \"la\", \"laa\")\n        TestController.my_touch(1*1024, \"local\", \"la\", \"lab\")\n        TestController.my_touch(2*1024, \"local\", \"lb\")\n\n        # Also create some archives\n        # Store the true archive file sizes in a dict\n        # remote\n        #   rd [dir]\n        #     rd.zip [file]\n        #   re.rar [file]\n        #   rf [dir]\n        #     rfa [dir]\n        #       rfa.zip [file]\n        #     rfb [dir]\n        #       rfb.zip [file]\n        # local\n        #   lc [dir]\n        #     lca.rar [file]\n        #     lcb.zip [file]\n        self.archive_sizes = {}\n        TestController.my_mkdir(\"remote\", \"rd\")\n        self.archive_sizes[\"rd.zip\"] = TestController.create_archive(\"remote\", \"rd\", \"rd.zip\")\n        self.archive_sizes[\"re.rar\"] = TestController.create_archive(\"remote\", \"re.rar\")\n        TestController.my_mkdir(\"remote\", \"rf\")\n        TestController.my_mkdir(\"remote\", \"rf\", \"rfa\")\n        self.archive_sizes[\"rfa.zip\"] = TestController.create_archive(\"remote\", \"rf\", \"rfa\", \"rfa.zip\")\n        TestController.my_mkdir(\"remote\", \"rf\", \"rfb\")\n        self.archive_sizes[\"rfb.zip\"] = TestController.create_archive(\"remote\", \"rf\", \"rfb\", \"rfb.zip\")\n        TestController.my_mkdir(\"local\", \"lc\")\n        self.archive_sizes[\"lca.rar\"] = TestController.create_archive(\"local\", \"lc\", \"lca.rar\")\n        self.archive_sizes[\"lcb.zip\"] = TestController.create_archive(\"local\", \"lc\", \"lcb.zip\")\n\n        # Allow group access to remote files for seedsynctest account\n        # This is necessary for seedsynctest can do remote-delete commands\n        # We are basically doing a chmod g+w on all of remote/ directory\n        remote_dir = os.path.join(self.temp_dir, \"remote\")\n        st = os.stat(remote_dir)\n        os.chmod(remote_dir, st.st_mode | stat.S_IWGRP)\n        for root, dirs, files in os.walk(remote_dir):\n            for momo in dirs:\n                path = os.path.join(root, momo)\n                st = os.stat(path)\n                os.chmod(path, st.st_mode | stat.S_IWGRP)\n            for momo in files:\n                path = os.path.join(root, momo)\n                st = os.stat(path)\n                os.chmod(path, st.st_mode | stat.S_IWGRP)\n\n        # Helper object to store the intial state\n        f_ra = ModelFile(\"ra\", True)\n        f_ra.remote_size = 8*1024\n        f_raa = ModelFile(\"raa\", False)\n        f_raa.remote_size = 1*1024\n        f_ra.add_child(f_raa)\n        f_rab = ModelFile(\"rab\", True)\n        f_rab.remote_size = 7*1024\n        f_ra.add_child(f_rab)\n        f_raba = ModelFile(\"raba\", False)\n        f_raba.remote_size = 5*1024\n        f_rab.add_child(f_raba)\n        f_rabb = ModelFile(\"rabb\", False)\n        f_rabb.remote_size = 2*1024\n        f_rab.add_child(f_rabb)\n        f_rb = ModelFile(\"rb\", True)\n        f_rb.remote_size = 9*1024\n        f_rba = ModelFile(\"rba\", False)\n        f_rba.remote_size = 4*1024\n        f_rb.add_child(f_rba)\n        f_rbb = ModelFile(\"rbb\", False)\n        f_rbb.remote_size = 5*1024\n        f_rb.add_child(f_rbb)\n        f_rc = ModelFile(\"rc\", False)\n        f_rc.remote_size = 10*1024\n\n        f_rd = ModelFile(\"rd\", True)\n        f_rd.remote_size = self.archive_sizes[\"rd.zip\"]\n        f_rd.is_extractable = True\n        f_rdx = ModelFile(\"rd.zip\", False)\n        f_rdx.remote_size = self.archive_sizes[\"rd.zip\"]\n        f_rdx.is_extractable = True\n        f_rd.add_child(f_rdx)\n        f_re = ModelFile(\"re.rar\", False)\n        f_re.remote_size = self.archive_sizes[\"re.rar\"]\n        f_re.is_extractable = True\n        f_rf = ModelFile(\"rf\", True)\n        f_rf.remote_size = self.archive_sizes[\"rfa.zip\"] + self.archive_sizes[\"rfb.zip\"]\n        f_rf.is_extractable = True\n        f_rfa = ModelFile(\"rfa\", True)\n        f_rfa.remote_size = self.archive_sizes[\"rfa.zip\"]\n        f_rfa.is_extractable = True\n        f_rfax = ModelFile(\"rfa.zip\", False)\n        f_rfax.remote_size = self.archive_sizes[\"rfa.zip\"]\n        f_rfax.is_extractable = True\n        f_rfa.add_child(f_rfax)\n        f_rf.add_child(f_rfa)\n        f_rfb = ModelFile(\"rfb\", True)\n        f_rfb.remote_size = self.archive_sizes[\"rfb.zip\"]\n        f_rfb.is_extractable = True\n        f_rf.add_child(f_rfb)\n        f_rfbx = ModelFile(\"rfb.zip\", False)\n        f_rfbx.remote_size = self.archive_sizes[\"rfb.zip\"]\n        f_rfbx.is_extractable = True\n        f_rfb.add_child(f_rfbx)\n\n        f_la = ModelFile(\"la\", True)\n        f_la.local_size = 2*1024\n        f_laa = ModelFile(\"laa\", False)\n        f_laa.local_size = 1*1024\n        f_la.add_child(f_laa)\n        f_lab = ModelFile(\"lab\", False)\n        f_lab.local_size = 1*1024\n        f_la.add_child(f_lab)\n        f_lb = ModelFile(\"lb\", False)\n        f_lb.local_size = 2*1024\n\n        f_lc = ModelFile(\"lc\", True)\n        f_lc.local_size = self.archive_sizes[\"lca.rar\"] + self.archive_sizes[\"lcb.zip\"]\n        f_lc.is_extractable = True\n        f_lca = ModelFile(\"lca.rar\", False)\n        f_lca.local_size = self.archive_sizes[\"lca.rar\"]\n        f_lca.is_extractable = True\n        f_lc.add_child(f_lca)\n        f_lcb = ModelFile(\"lcb.zip\", False)\n        f_lcb.local_size = self.archive_sizes[\"lcb.zip\"]\n        f_lcb.is_extractable = True\n        f_lc.add_child(f_lcb)\n\n        self.initial_state = {f.name: f for f in [\n            f_ra, f_rb, f_rc, f_rd, f_re, f_rf,\n            f_la, f_lb, f_lc\n        ]}\n\n        # We need to overwrite the timestamp properties since it's too tedious to make\n        # them match manually for all the model files\n        pm = patch(\"model.file.ModelFile.remote_modified_timestamp\", new_callable=PropertyMock)\n        self.addCleanup(pm.stop)\n        pm_cls = pm.start()\n        pm_cls.return_value = None\n        pm = patch(\"model.file.ModelFile.local_modified_timestamp\", new_callable=PropertyMock)\n        self.addCleanup(pm.stop)\n        pm_cls = pm.start()\n        pm_cls.return_value = None\n\n        # config file\n        # Note: seedsynctest account must be set up. See DeveloperReadme.md for details\n\n        # We also need to create an executable that the controller can install on remote\n        # Since we don't have a packaged scanfs executable here, we simply\n        # create an sh script that points to the python script\n        # Note: the executable must be the venv one so any custom imports work\n        current_dir_path = os.path.dirname(os.path.realpath(__file__))\n        local_script_path = os.path.abspath(os.path.join(current_dir_path, \"..\", \"..\", \"..\", \"scan_fs.py\"))\n        local_exe_dir = os.path.join(TestController.temp_dir, \"scanfs_local\")\n        remote_exe_dir = os.path.join(TestController.temp_dir, \"scanfs_remote\")\n        os.makedirs(local_exe_dir, exist_ok=True)\n        os.makedirs(remote_exe_dir, exist_ok=True)\n        # Allow group access for the seedsynctest account\n        os.chmod(remote_exe_dir, 0o775)\n        local_exe_path = os.path.join(local_exe_dir, \"scanfs\")\n        remote_exe_path = remote_exe_dir\n        with open(local_exe_path, \"w\") as f:\n            f.write(\"#!/bin/sh\\n\")\n            f.write(\"{} {} $*\".format(sys.executable, local_script_path))\n        os.chmod(local_exe_path, 0o775)\n        ctx_args = Args()\n        ctx_args.local_path_to_scanfs = local_exe_path\n\n        config_dict = {\n            \"General\": {\n                \"debug\": \"True\",\n                \"verbose\": \"True\"\n            },\n            \"Lftp\": {\n                \"remote_address\": \"localhost\",\n                \"remote_username\": \"seedsynctest\",\n                \"remote_password\": \"seedsyncpass\",\n                \"remote_port\": 22,\n                \"remote_path\": os.path.join(self.temp_dir, \"remote\"),\n                \"local_path\": os.path.join(self.temp_dir, \"local\"),\n                \"remote_path_to_scan_script\": remote_exe_path,\n                \"use_ssh_key\": \"True\",\n                \"num_max_parallel_downloads\": \"1\",\n                \"num_max_parallel_files_per_download\": \"3\",\n                \"num_max_connections_per_root_file\": \"4\",\n                \"num_max_connections_per_dir_file\": \"4\",\n                \"num_max_total_connections\": \"12\",\n                \"use_temp_file\": \"False\"\n            },\n            \"Controller\": {\n                \"interval_ms_remote_scan\": \"100\",\n                \"interval_ms_local_scan\": \"100\",\n                \"interval_ms_downloading_scan\": \"100\",\n                \"extract_path\": \"/unused/path\",\n                \"use_local_path_as_extract_path\": True\n            },\n            \"Web\": {\n                \"port\": \"8800\",\n            },\n            \"AutoQueue\": {\n                \"enabled\": \"True\",\n                \"patterns_only\": \"True\",\n                \"auto_extract\": \"True\"\n            }\n        }\n\n        logger = logging.getLogger(TestController.__name__)\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        self.context = Context(logger=logger,\n                               web_access_logger=logger,\n                               config=Config.from_dict(config_dict),\n                               args=ctx_args,\n                               status=Status())\n        self.controller_persist = ControllerPersist()\n        self.controller = None\n\n    @overrides(unittest.TestCase)\n    def tearDown(self):\n        if self.controller:\n            self.controller.exit()\n\n        # Cleanup\n        if not TestController.__KEEP_FILES:\n            shutil.rmtree(self.temp_dir)\n\n    # noinspection PyMethodMayBeStatic\n    def __wait_for_initial_model(self):\n        while len(self.controller.get_model_files()) < 5:\n            self.controller.process()\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_doesnot_raise_ctor_exception(self):\n        self.context.config.lftp.remote_address = \"<bad>\"\n        self.context.config.lftp.remote_username = \"<bad>\"\n        self.context.config.lftp.remote_path = \"<bad>\"\n        self.context.config.lftp.local_path = \"<bad>\"\n        self.context.config.lftp.remote_path_to_scan_script = \"<bad>\"\n        # noinspection PyBroadException\n        try:\n            self.controller = Controller(self.context, self.controller_persist)\n        except Exception:\n            self.fail(\"Controller ctor raised exception unexpectedly\")\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_remote_address_raises_exception(self):\n        self.context.config.lftp.remote_address = \"<bad>\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_INSTALL.format(\"Bad hostname: <bad>\"),\n            str(error.exception)\n        )\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_remote_username_raises_exception(self):\n        self.context.config.lftp.remote_username = \"<bad>\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_INSTALL.format(\"<bad>@localhost: Permission denied (publickey,password).\"),\n            str(error.exception)\n        )\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_remote_path_raises_exception(self):\n        self.context.config.lftp.remote_path = \"<bad>\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_SCAN.format(\"SystemScannerError: Path does not exist: <bad>\"),\n            str(error.exception)\n        )\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_local_path_raises_exception(self):\n        self.context.config.lftp.local_path = \"<bad>\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(Localization.Error.LOCAL_SERVER_SCAN, str(error.exception))\n\n    @timeout_decorator.timeout(20)\n    def test_bad_config_remote_path_to_scan_script_raises_exception(self):\n        self.context.config.lftp.remote_path_to_scan_script = \"<bad>\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_INSTALL.format(\n                \"Connection refused by server - bash: bad: No such file or directory\"\n            ),\n            str(error.exception)\n        )\n\n    @timeout_decorator.timeout(20)\n    def test_bad_remote_password_raises_exception(self):\n        self.context.config.lftp.remote_password = \"bad password\"\n        self.context.config.lftp.use_ssh_key = False\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnusedLocal\n        with self.assertRaises(AppError) as error:\n            while True:\n                self.controller.process()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_INSTALL.format(\"Incorrect password\"),\n            str(error.exception)\n        )\n\n    @timeout_decorator.timeout(20)\n    def test_initial_model(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        model_files = self.controller.get_model_files()\n        self.assertEqual(len(self.initial_state.keys()), len(model_files))\n        files_dict = {f.name: f for f in model_files}\n        self.assertEqual(self.initial_state.keys(), files_dict.keys())\n        for filename in self.initial_state.keys():\n            # Note: put items in a list for a better diff output\n            self.assertEqual([self.initial_state[filename]], [files_dict[filename]],\n                             \"Mismatch in file: {}\".format(filename))\n\n    @timeout_decorator.timeout(20)\n    def test_local_file_added(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Add a local file\n        TestController.my_touch(1515, \"local\", \"lnew\")\n\n        # Process until discovered\n        while True:\n            self.controller.process()\n            call = listener.file_added.call_args\n            if call:\n                new_file = call[0][0]\n                self.assertEqual(\"lnew\", new_file.name)\n                break\n\n        # Verify\n        self.controller.process()\n        lnew = ModelFile(\"lnew\", False)\n        lnew.local_size = 1515\n        listener.file_added.assert_called_once_with(lnew)\n        listener.file_updated.assert_not_called()\n        listener.file_removed.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_local_file_updated(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Update a local file\n        TestController.my_touch(1717, \"local\", \"lb\")\n\n        # Process until discovered\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"lb\", new_file.name)\n                break\n\n        # Verify\n        self.controller.process()\n        lb_old = ModelFile(\"lb\", False)\n        lb_old.local_size = 2*1024\n        lb_new = ModelFile(\"lb\", False)\n        lb_new.local_size = 1717\n        listener.file_updated.assert_called_once_with(lb_old, lb_new)\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_local_file_removed(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Remove the local file\n        os.remove(os.path.join(TestController.temp_dir, \"local\", \"lb\"))\n\n        # Process until discovered\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                new_file = call[0][0]\n                self.assertEqual(\"lb\", new_file.name)\n                break\n\n        # Verify\n        self.controller.process()\n        lb = ModelFile(\"lb\", False)\n        lb.local_size = 2*1024\n        listener.file_removed.assert_called_once_with(lb)\n        listener.file_added.assert_not_called()\n        listener.file_updated.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_remote_file_added(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Add a local file\n        TestController.my_touch(1515, \"remote\", \"rnew\")\n\n        # Verify\n        while listener.file_added.call_count < 1:\n            self.controller.process()\n\n        rnew = ModelFile(\"rnew\", False)\n        rnew.remote_size = 1515\n        listener.file_added.assert_called_once_with(rnew)\n        listener.file_updated.assert_not_called()\n        listener.file_removed.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_remote_file_updated(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Update a local file\n        TestController.my_touch(1717, \"remote\", \"rc\")\n\n        # Verify\n        while listener.file_updated.call_count < 1:\n            self.controller.process()\n\n        rc_old = ModelFile(\"rc\", False)\n        rc_old.remote_size = 10*1024\n        rc_new = ModelFile(\"rc\", False)\n        rc_new.remote_size = 1717\n        listener.file_updated.assert_called_once_with(rc_old, rc_new)\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_remote_file_removed(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Remove the local file\n        os.remove(os.path.join(TestController.temp_dir, \"remote\", \"rc\"))\n\n        # Verify\n        while listener.file_removed.call_count < 1:\n            self.controller.process()\n\n        rc = ModelFile(\"rc\", False)\n        rc.remote_size = 10*1024\n        listener.file_removed.assert_called_once_with(rc)\n        listener.file_added.assert_not_called()\n        listener.file_updated.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_command_queue_directory(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"ra\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until done\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"ra\", new_file.name)\n                if new_file.local_size == 8*1024:\n                    break\n\n        # Verify\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        dcmp = dircmp(os.path.join(TestController.temp_dir, \"remote\", \"ra\"),\n                      os.path.join(TestController.temp_dir, \"local\", \"ra\"))\n        self.assertFalse(dcmp.left_only)\n        self.assertFalse(dcmp.right_only)\n        self.assertFalse(dcmp.diff_files)\n\n    @timeout_decorator.timeout(20)\n    def test_command_queue_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rc\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until done\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rc\", new_file.name)\n                if new_file.local_size == 10*1024:\n                    break\n\n        # Verify\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        fcmp = cmp(os.path.join(TestController.temp_dir, \"remote\", \"rc\"),\n                   os.path.join(TestController.temp_dir, \"local\", \"rc\"))\n        self.assertTrue(fcmp)\n\n    @timeout_decorator.timeout(20)\n    def test_command_queue_invalid(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"invaliddir\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n\n        # Process until done\n        while callback.on_failure.call_count < 1:\n            self.controller.process()\n\n        # Verify\n        listener.file_added.assert_not_called()\n        listener.file_updated.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'invaliddir' not found\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_queue_local_directory(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"la\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n\n        # Process until done\n        while callback.on_failure.call_count < 1:\n            self.controller.process()\n\n        listener.file_added.assert_not_called()\n        listener.file_updated.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'la' does not exist remotely\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_queue_local_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"lb\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n\n        # Process until done\n        while callback.on_failure.call_count < 1:\n            self.controller.process()\n\n        listener.file_added.assert_not_called()\n        listener.file_updated.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'lb' does not exist remotely\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_directory(self):\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"ra\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"ra\", new_file.name)\n                if new_file.local_size and new_file.local_size > 0:\n                    break\n\n        # Now stop the download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.STOP, \"ra\"))\n\n        # Process until download stops\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"ra\", new_file.name)\n                if new_file.state == ModelFile.State.DEFAULT:\n                    break\n\n        # Verify\n        call = listener.file_updated.call_args\n        new_file = call[0][1]\n        self.assertEqual(\"ra\", new_file.name)\n        self.assertEqual(ModelFile.State.DEFAULT, new_file.state)\n        self.assertLess(new_file.local_size, new_file.remote_size)\n\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_file(self):\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rc\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rc\", new_file.name)\n                if new_file.local_size and new_file.local_size > 0:\n                    break\n\n        # Now stop the download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.STOP, \"rc\"))\n\n        # Process until download stops\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rc\", new_file.name)\n                if new_file.state == ModelFile.State.DEFAULT:\n                    break\n\n        # Verify\n        call = listener.file_updated.call_args\n        new_file = call[0][1]\n        self.assertEqual(\"rc\", new_file.name)\n        self.assertEqual(ModelFile.State.DEFAULT, new_file.state)\n        self.assertLess(new_file.local_size, new_file.remote_size)\n\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_default(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Verify that rc is Default\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DEFAULT, files_dict[\"rc\"].state)\n\n        # Now stop the download\n        command = Controller.Command(Controller.Command.Action.STOP, \"rc\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        self.controller.process()\n\n        # Verify nothing happened\n        listener.file_updated.assert_not_called()\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'rc' is not Queued or Downloading\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_queued(self):\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue two downloads\n        # This one will be Downloading\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"rc\"))\n        # This one will be Queued\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rb\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                if new_file.name == \"rc\" and new_file.local_size and new_file.local_size > 0:\n                    break\n\n        # Verify that rb is Queued\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.QUEUED, files_dict[\"rb\"].state)\n\n        # Now stop the queued\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.STOP, \"rb\"))\n\n        # Process until queued stops\n        while True:\n            self.controller.process()\n            break_out = False\n            for call in listener.file_updated.call_args_list:\n                new_file = call[0][1]\n                if new_file.name == \"rb\" and new_file.state == ModelFile.State.DEFAULT:\n                    break_out = True\n            if break_out:\n                break\n\n        # Verify that rc is Downloading, rb is Default\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"rc\"].state)\n        self.assertEqual(ModelFile.State.DEFAULT, files_dict[\"rb\"].state)\n\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_wrong(self):\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"ra\"))\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"ra\", new_file.name)\n                if new_file.local_size and new_file.local_size > 0:\n                    break\n\n        # Now stop the download with wrong name\n        command = Controller.Command(Controller.Command.Action.STOP, \"rb\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n\n        # Process until done\n        while callback.on_failure.call_count < 1:\n            self.controller.process()\n\n        # Verify that downloading is still going\n        call = listener.file_updated.call_args\n        new_file = call[0][1]\n        self.assertEqual(\"ra\", new_file.name)\n        self.assertEqual(ModelFile.State.DOWNLOADING, new_file.state)\n\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'rb' is not Queued or Downloading\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_stop_invalid(self):\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"ra\"))\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"ra\", new_file.name)\n                if new_file.local_size and new_file.local_size > 0:\n                    break\n\n        # Now stop the download with wrong name\n        command = Controller.Command(Controller.Command.Action.STOP, \"invalidfile\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n\n        # Process until done\n        while callback.on_failure.call_count < 1:\n            self.controller.process()\n\n        # Verify that downloading is still going\n        call = listener.file_updated.call_args\n        new_file = call[0][1]\n        self.assertEqual(\"ra\", new_file.name)\n        self.assertEqual(ModelFile.State.DOWNLOADING, new_file.state)\n\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'invalidfile' not found\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_after_downloading_remote_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"re.rar\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"re.rar\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        re_txt_path = os.path.join(TestController.temp_dir, \"local\", \"re.rar.txt\")\n        self.assertTrue(os.path.isfile(re_txt_path))\n        with open(re_txt_path, \"r\") as f:\n            self.assertEqual(\"re.rar\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_after_downloading_remote_directory(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        rd_txt_path = os.path.join(TestController.temp_dir, \"local\", \"rd\", \"rd.zip.txt\")\n        self.assertTrue(os.path.isfile(rd_txt_path))\n        with open(rd_txt_path, \"r\") as f:\n            self.assertEqual(\"rd.zip\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_after_downloading_remote_directory_multilevel(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rf\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rf\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"rf\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rf\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        rfa_txt_path = os.path.join(TestController.temp_dir, \"local\", \"rf\", \"rfa\", \"rfa.zip.txt\")\n        self.assertTrue(os.path.isfile(rfa_txt_path))\n        with open(rfa_txt_path, \"r\") as f:\n            self.assertEqual(\"rfa.zip\", f.read())\n        rfb_txt_path = os.path.join(TestController.temp_dir, \"local\", \"rf\", \"rfb\", \"rfb.zip.txt\")\n        self.assertTrue(os.path.isfile(rfb_txt_path))\n        with open(rfb_txt_path, \"r\") as f:\n            self.assertEqual(\"rfb.zip\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_local_directory(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"lc\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        # Can't rely on state changes since final state is back to Default\n        # Look for presence of extracted files\n        lca_txt_path = os.path.join(TestController.temp_dir, \"local\", \"lc\", \"lca.rar.txt\")\n        lcb_txt_path = os.path.join(TestController.temp_dir, \"local\", \"lc\", \"lcb.zip.txt\")\n        while True:\n            self.controller.process()\n            if os.path.isfile(lca_txt_path) and os.path.isfile(lcb_txt_path):\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        with open(lca_txt_path, \"r\") as f:\n            self.assertEqual(\"lca.rar\", f.read())\n        with open(lcb_txt_path, \"r\") as f:\n            self.assertEqual(\"lcb.zip\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_reextract_after_extracting_remote_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"re.rar\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"re.rar\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_success.reset_mock()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        re_txt_path = os.path.join(TestController.temp_dir, \"local\", \"re.rar.txt\")\n        self.assertTrue(os.path.isfile(re_txt_path))\n        with open(re_txt_path, \"r\") as f:\n            self.assertEqual(\"re.rar\", f.read())\n\n        # Delete the extracted file\n        os.remove(re_txt_path)\n        self.assertFalse(os.path.isfile(re_txt_path))\n\n        # Queue a re-extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        # Can't rely on state changes since final state is back to Extracted\n        # Look for presence of extracted file\n        while True:\n            self.controller.process()\n            if os.path.isfile(re_txt_path):\n                break\n\n        # Verify again\n        self.assertTrue(os.path.isfile(re_txt_path))\n        with open(re_txt_path, \"r\") as f:\n            self.assertEqual(\"re.rar\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_remote_only_fails(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Verify that rc is Default\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DEFAULT, files_dict[\"re.rar\"].state)\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"re.rar\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        self.controller.process()\n\n        # Verify nothing happened\n        listener.file_updated.assert_not_called()\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 're.rar' does not exist locally\", error)\n\n    @timeout_decorator.timeout(20)\n    def test_command_extract_after_downloading_remote_directory_to_separate_path(self):\n        # Change the extract path\n        extract_path = os.path.join(TestController.temp_dir, \"extract\")\n        os.mkdir(extract_path)\n        self.context.config.controller.extract_path = extract_path\n        self.context.config.controller.use_local_path_as_extract_path = False\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        rd_txt_path = os.path.join(extract_path, \"rd\", \"rd.zip.txt\")\n        self.assertTrue(os.path.isfile(rd_txt_path))\n        with open(rd_txt_path, \"r\") as f:\n            self.assertEqual(\"rd.zip\", f.read())\n\n    @timeout_decorator.timeout(20)\n    def test_command_redownload_after_deleting_extracted_file(self):\n        \"\"\"\n        File is downloaded, then extracted, then deleted, then redownloaded\n        Verify that final state is Downloaded and NOT Extracted\n        \"\"\"\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.DOWNLOADED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Queue an extraction\n        command = Controller.Command(Controller.Command.Action.EXTRACT, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until extract complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_success.reset_mock()\n        callback.on_failure.assert_not_called()\n\n        # Verify\n        re_txt_path = os.path.join(TestController.temp_dir, \"local\", \"rd\", \"rd.zip.txt\")\n        self.assertTrue(os.path.isfile(re_txt_path))\n        with open(re_txt_path, \"r\") as f:\n            self.assertEqual(\"rd.zip\", f.read())\n\n        # Delete the whole thing\n        shutil.rmtree(os.path.join(TestController.temp_dir, \"local\", \"rd\"))\n\n        # Process until deleted state\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                if new_file.state == ModelFile.State.DELETED:\n                    break\n\n        # Queue the download AGAIN\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rd\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download complete\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rd\", new_file.name)\n                # EXTRACTED is wrong, but we check for that later on\n                if new_file.state == ModelFile.State.DOWNLOADED or \\\n                        new_file.state == ModelFile.State.EXTRACTED:\n                    break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        callback.on_success.reset_mock()\n\n        # Verify file is in DOWNLOADED state\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADED, files_dict[\"rd\"].state)\n\n    @timeout_decorator.timeout(20)\n    def test_config_num_max_parallel_downloads(self):\n        self.context.config.lftp.num_max_parallel_downloads = 2\n        self.controller = Controller(self.context, ControllerPersist())\n        self.controller.start()\n\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Queue 3 downloads\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"ra\"))\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"rb\"))\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"rc\"))\n\n        # Process until 2 downloads starts\n        ra_downloading = False\n        rb_downloading = False\n\n        # noinspection PyUnusedLocal\n        def updated_side_effect(old_file: ModelFile, new_file: ModelFile):\n            nonlocal ra_downloading, rb_downloading\n            if new_file.local_size and new_file.local_size > 0:\n                if new_file.name == \"ra\":\n                    ra_downloading = True\n                elif new_file.name == \"rb\":\n                    rb_downloading = True\n            return\n        listener.file_updated.side_effect = updated_side_effect\n        while True:\n            self.controller.process()\n            if ra_downloading and rb_downloading:\n                break\n\n        # Verify that ra, rb is Downloading, rc is Queued\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"ra\"].state)\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"rb\"].state)\n        self.assertEqual(ModelFile.State.QUEUED, files_dict[\"rc\"].state)\n\n    @timeout_decorator.timeout(20)\n    def test_downloading_scan(self):\n        # Test that downloading scan is independent of local scan\n        # Set a very large local scan interval and verify that downloading\n        # updates are still propagated\n        self.context.config.controller.interval_ms_downloading_scan = 200\n        self.context.config.controller.interval_ms_local_scan = 10000\n        self.controller = Controller(self.context, ControllerPersist())\n        self.controller.start()\n\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Queue a download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"ra\"))\n\n        # Process until the downloads starts\n        ra_downloading = False\n\n        # noinspection PyUnusedLocal\n        def updated_side_effect(old_file: ModelFile, new_file: ModelFile):\n            nonlocal ra_downloading\n            if new_file.local_size and new_file.local_size > 0:\n                if new_file.name == \"ra\":\n                    ra_downloading = True\n            return\n        listener.file_updated.side_effect = updated_side_effect\n        while True:\n            self.controller.process()\n            if ra_downloading:\n                break\n\n        # Verify that ra is Downloading\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"ra\"].state)\n\n    @timeout_decorator.timeout(20)\n    def test_persist_downloaded(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Verify empty download state\n        self.assertEqual(0, len(self.controller_persist.downloaded_file_names))\n\n        # Download rc\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"rc\"))\n\n        # Process until the downloads starts\n        rc_downloaded = False\n\n        # noinspection PyUnusedLocal\n        def updated_side_effect(old_file: ModelFile, new_file: ModelFile):\n            nonlocal rc_downloaded\n            if new_file.state == ModelFile.State.DOWNLOADED and new_file.name == \"rc\":\n                    rc_downloaded = True\n            return\n        listener.file_updated.side_effect = updated_side_effect\n        while True:\n            self.controller.process()\n            if rc_downloaded:\n                break\n\n        self.assertTrue(rc_downloaded)\n        # Verify downloaded state was persisted\n        self.assertTrue(\"rc\" in self.controller_persist.downloaded_file_names)\n\n    @timeout_decorator.timeout(20)\n    def test_redownload_deleted_file(self):\n        # Test that a previously downloaded then deleted file can be redownloaded\n        # We set the downloaded state in controller persist\n        self.controller_persist.downloaded_file_names.add(\"ra\")\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n\n        # White box hack: limit the rate of lftp so download doesn't finish\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 100\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Verify that ra is marked as Deleted\n        self.controller.process()\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DELETED, files_dict[\"ra\"].state)\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        # Queue a download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.QUEUE, \"ra\"))\n\n        # Process until the downloads starts\n        ra_downloading = False\n\n        # noinspection PyUnusedLocal\n        def updated_side_effect(old_file: ModelFile, new_file: ModelFile):\n            nonlocal ra_downloading\n            if new_file.local_size and new_file.local_size > 0:\n                if new_file.name == \"ra\":\n                    ra_downloading = True\n            return\n        listener.file_updated.side_effect = updated_side_effect\n        while True:\n            self.controller.process()\n            if ra_downloading:\n                break\n\n        # Verify that ra is Downloading\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"ra\"].state)\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_local_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"local\", \"lb\")\n        self.assertTrue(os.path.isfile(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_LOCAL, \"lb\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until file is removed from model\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                file = call[0][0]\n                self.assertEqual(\"lb\", file.name)\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        self.assertFalse(os.path.exists(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_local_dir(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"local\", \"la\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_LOCAL, \"la\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until file is removed from model\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                file = call[0][0]\n                self.assertEqual(\"la\", file.name)\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        self.assertFalse(os.path.exists(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_remote_dir(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"remote\", \"ra\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_REMOTE, \"ra\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until file is removed from model\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                file = call[0][0]\n                self.assertEqual(\"ra\", file.name)\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        self.assertFalse(os.path.exists(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_local_fails_on_remote_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"remote\", \"ra\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_LOCAL, \"ra\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        self.controller.process()\n\n        # Verify nothing happened\n        listener.file_updated.assert_not_called()\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'ra' does not exist locally\", error)\n\n        self.assertTrue(os.path.isdir(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_remote_fails_on_local_file(self):\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"local\", \"la\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_REMOTE, \"la\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        self.controller.process()\n\n        # Verify nothing happened\n        listener.file_updated.assert_not_called()\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_not_called()\n        self.assertEqual(1, len(callback.on_failure.call_args_list))\n        error = callback.on_failure.call_args[0][0]\n        self.assertEqual(\"File 'la' does not exist remotely\", error)\n\n        self.assertTrue(os.path.isdir(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_remote_forces_immediate_rescan(self):\n        # Test that after a remote delete a remote scan is immediately done\n        # Test this by simply setting the remote scan interval to a really large value\n        # that would timeout the test if it wasn't forced\n        self.context.config.controller.interval_ms_remote_scan = 90000\n\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"remote\", \"ra\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_REMOTE, \"ra\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until file is removed from model\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                file = call[0][0]\n                self.assertEqual(\"ra\", file.name)\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        self.assertFalse(os.path.exists(file_path))\n\n    @timeout_decorator.timeout(20)\n    def test_command_delete_local_forces_immediate_rescan(self):\n        # Test that after a local delete a local scan is immediately done\n        # Test this by simply setting the local scan interval to a really large value\n        # that would timeout the test if it wasn't forced\n        self.context.config.controller.interval_ms_local_scan = 90000\n\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        file_path = os.path.join(TestController.temp_dir, \"local\", \"la\")\n        self.assertTrue(os.path.isdir(file_path))\n\n        # Send delete command\n        command = Controller.Command(Controller.Command.Action.DELETE_LOCAL, \"la\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until file is removed from model\n        while True:\n            self.controller.process()\n            call = listener.file_removed.call_args\n            if call:\n                file = call[0][0]\n                self.assertEqual(\"la\", file.name)\n                break\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n\n        self.assertFalse(os.path.exists(file_path))\n\n    @timeout_decorator.timeout(20)\n    @unittest.skip\n    def test_download_with_excessive_connections(self):\n        # Note: this test sometimes crashes the dbus\n        #       reset with: sudo systemctl restart systemd-logind\n\n        # Test excessive connections and a large LFTP status output\n        #     - large files names to blow up the status\n        #     - large max num connections, connections per file\n        #     - download many files in parallel\n        def create_large_file(_path, size):\n            f = open(_path, \"wb\")\n            f.seek(size - 1)\n            f.write(b\"\\0\")\n            f.close()\n            print(\"File size: \", os.stat(_path).st_size)\n\n        # Create a bunch of large files that can be downloaded in chunks\n        path = os.path.join(TestController.temp_dir, \"remote\", \"large\")\n        local_path = os.path.join(TestController.temp_dir, \"local\", \"large\")\n        os.mkdir(path)\n        a_path = os.path.join(path, \"a\"*200 + \".txt\")\n        create_large_file(a_path, 20*1024*1024)\n        b_path = os.path.join(path, \"b\"*200 + \".txt\")\n        create_large_file(b_path, 20*1024*1024)\n        c_path = os.path.join(path, \"c\"*200 + \".txt\")\n        create_large_file(c_path, 20*1024*1024)\n        d_path = os.path.join(path, \"d\"*200 + \".txt\")\n        create_large_file(d_path, 20*1024*1024)\n        e_path = os.path.join(path, \"e\"*200 + \".txt\")\n        create_large_file(e_path, 20*1024*1024)\n        f_path = os.path.join(path, \"f\"*200 + \".txt\")\n        create_large_file(f_path, 20*1024*1024)\n        g_path = os.path.join(path, \"g\"*200 + \".txt\")\n        create_large_file(g_path, 20*1024*1024)\n        h_path = os.path.join(path, \"h\"*200 + \".txt\")\n        create_large_file(h_path, 20*1024*1024)\n\n        # White box hack: limit the rate of lftp so download doesn't finish\n        #                 also set min-chunk size to a small value for lots of connections\n        self.context.config.lftp.num_max_total_connections = 20\n        self.context.config.lftp.num_max_connections_per_dir_file = 20\n        self.context.config.lftp.num_max_parallel_files_per_download = 8\n\n        # noinspection PyUnresolvedReferences\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.rate_limit = 5*1024\n        # noinspection PyUnresolvedReferences\n        self.controller._Controller__lftp.min_chunk_size = \"10\"\n\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"large\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until download starts\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                if new_file.name == \"large\" and new_file.state == ModelFile.State.DOWNLOADING:\n                    break\n\n        # Wait for a bit so we start getting large statuses\n        start_time = datetime.now()\n        elapsed_secs = 0\n        while elapsed_secs < 5:\n            print(\"Elapsed secs: \", elapsed_secs)\n            self.controller.process()\n            elapsed_secs = (datetime.now()-start_time).total_seconds()\n\n        # Verify that download is still ongoing\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DOWNLOADING, files_dict[\"large\"].state)\n\n        # Stop the download\n        self.controller.queue_command(Controller.Command(Controller.Command.Action.STOP, \"large\"))\n        self.controller.process()\n\n        # Process until download stops\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"large\", new_file.name)\n                if new_file.state == ModelFile.State.DEFAULT:\n                    break\n\n        # Verify that download is stopped\n        files = self.controller.get_model_files()\n        files_dict = {f.name: f for f in files}\n        self.assertEqual(ModelFile.State.DEFAULT, files_dict[\"large\"].state)\n\n        # Remove the files\n        shutil.rmtree(path)\n        shutil.rmtree(local_path)\n\n    @timeout_decorator.timeout(20)\n    def test_password_auth(self):\n        # Test password-based auth by downloading a file to completion\n        self.context.config.lftp.use_ssh_key = False\n\n        self.controller = Controller(self.context, self.controller_persist)\n        self.controller.start()\n        # wait for initial scan\n        self.__wait_for_initial_model()\n\n        # Ignore the initial state\n        listener = DummyListener()\n        self.controller.add_model_listener(listener)\n        self.controller.process()\n\n        # Setup mock\n        listener.file_added = MagicMock()\n        listener.file_updated = MagicMock()\n        listener.file_removed = MagicMock()\n        callback = DummyCommandCallback()\n        callback.on_success = MagicMock()\n        callback.on_failure = MagicMock()\n\n        # Queue a download\n        command = Controller.Command(Controller.Command.Action.QUEUE, \"rc\")\n        command.add_callback(callback)\n        self.controller.queue_command(command)\n        # Process until done\n        while True:\n            self.controller.process()\n            call = listener.file_updated.call_args\n            if call:\n                new_file = call[0][1]\n                self.assertEqual(\"rc\", new_file.name)\n                if new_file.local_size == 10*1024:\n                    break\n\n        # Verify\n        listener.file_added.assert_not_called()\n        listener.file_removed.assert_not_called()\n        callback.on_success.assert_called_once_with()\n        callback.on_failure.assert_not_called()\n        fcmp = cmp(os.path.join(TestController.temp_dir, \"remote\", \"rc\"),\n                   os.path.join(TestController.temp_dir, \"local\", \"rc\"))\n        self.assertTrue(fcmp)\n"
  },
  {
    "path": "src/python/tests/integration/test_controller/test_extract/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_controller/test_extract/test_extract.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport shutil\nimport tempfile\nimport os\nimport subprocess\nimport zipfile\n\nfrom common import overrides\nfrom controller.extract import Extract, ExtractError\n\n\nclass TestExtract(unittest.TestCase):\n    temp_root = None\n    temp_dir = None\n\n    ar_zip = None\n    ar_rar = None\n    ar_rar_split_p1 = None\n    ar_rar_split_p2 = None\n    ar_tar_gz = None\n\n    __FILE_CONTENT = \"12345678\"*10*1024  # 80 KB\n\n    # For debugging\n    __KEEP_TMP_FILES = False\n\n    @classmethod\n    def setUpClass(cls):\n        TestExtract.temp_root = tempfile.mkdtemp(prefix=\"test_extract_\")\n\n        # Create a temp file to archive\n        temp_file = os.path.join(TestExtract.temp_root, \"file\")\n        with open(temp_file, \"w\") as f:\n            f.write(TestExtract.__FILE_CONTENT)\n\n        # Create archives\n        archive_dir = os.path.join(TestExtract.temp_root, \"archives\")\n        os.mkdir(archive_dir)\n\n        # zip\n        TestExtract.ar_zip = os.path.join(archive_dir, \"file.zip\")\n        zf = zipfile.ZipFile(TestExtract.ar_zip, \"w\", zipfile.ZIP_DEFLATED)\n        zf.write(temp_file, os.path.basename(temp_file))\n        zf.close()\n\n        # rar\n        fnull = open(os.devnull, 'w')\n        TestExtract.ar_rar = os.path.join(archive_dir, \"file.rar\")\n        subprocess.Popen([\"rar\",\n                          \"a\",\n                          \"-ep\",\n                          TestExtract.ar_rar,\n                          temp_file],\n                         stdout=fnull)\n\n        # rar split\n        subprocess.Popen([\"rar\",\n                          \"a\",\n                          \"-ep\", \"-m0\", \"-v50k\",\n                          os.path.join(archive_dir, \"file.split.rar\"),\n                          temp_file],\n                         stdout=fnull)\n        TestExtract.ar_rar_split_p1 = os.path.join(archive_dir, \"file.split.part1.rar\")\n        TestExtract.ar_rar_split_p2 = os.path.join(archive_dir, \"file.split.part2.rar\")\n\n        # tar.gz\n        TestExtract.ar_tar_gz = os.path.join(archive_dir, \"file.tar.gz\")\n        subprocess.Popen([\"tar\",\n                          \"czvf\",\n                          TestExtract.ar_tar_gz,\n                          \"-C\", os.path.dirname(temp_file),\n                          os.path.basename(temp_file)])\n\n    @classmethod\n    def tearDownClass(cls):\n        # Cleanup\n        if not TestExtract.__KEEP_TMP_FILES:\n            shutil.rmtree(TestExtract.temp_root)\n\n    @overrides(unittest.TestCase)\n    def setUp(self):\n        TestExtract.temp_dir = os.path.join(TestExtract.temp_root, \"tmp\")\n        os.mkdir(TestExtract.temp_dir)\n\n    @overrides(unittest.TestCase)\n    def tearDown(self):\n        if not TestExtract.__KEEP_TMP_FILES:\n            shutil.rmtree(TestExtract.temp_dir)\n\n    def _assert_extracted_files(self, dir_path):\n        path = os.path.join(dir_path, \"file\")\n        self.assertTrue(os.path.isfile(path))\n        with open(path, \"r\") as f:\n            self.assertEqual(TestExtract.__FILE_CONTENT, f.read())\n\n    def test_is_archive_fast(self):\n        self.assertTrue(Extract.is_archive_fast(\"a.zip\"))\n        self.assertTrue(Extract.is_archive_fast(\"b.rar\"))\n        self.assertTrue(Extract.is_archive_fast(\"c.bz2\"))\n        self.assertTrue(Extract.is_archive_fast(\"d.tar.gz\"))\n        self.assertTrue(Extract.is_archive_fast(\"e.7z\"))\n\n        self.assertFalse(Extract.is_archive_fast(\"a\"))\n        self.assertFalse(Extract.is_archive_fast(\"a.b\"))\n        self.assertFalse(Extract.is_archive_fast(\".b\"))\n        self.assertFalse(Extract.is_archive_fast(\".zip\"))\n        self.assertFalse(Extract.is_archive_fast(\"\"))\n        self.assertFalse(Extract.is_archive_fast(\"7\"))\n        self.assertFalse(Extract.is_archive_fast(\"z\"))\n\n    def test_is_archive_fast_works_with_full_paths(self):\n        self.assertTrue(Extract.is_archive_fast(\"/full/path/a.zip\"))\n        self.assertFalse(Extract.is_archive_fast(\"/full/path/a\"))\n        self.assertFalse(Extract.is_archive_fast(\"/full/path/.zip\"))\n\n    def test_is_archive_false_on_nonexisting_file(self):\n        self.assertFalse(Extract.is_archive(os.path.join(TestExtract.temp_dir, \"no_file\")))\n\n    def test_is_archive_false_on_dir(self):\n        path = os.path.join(TestExtract.temp_dir, \"dir\")\n        os.mkdir(path)\n        self.assertTrue(os.path.isdir(path))\n        self.assertFalse(Extract.is_archive(path))\n\n    def test_is_archive_false_on_bad_archive(self):\n        path = os.path.join(TestExtract.temp_dir, \"bad_file\")\n        with open(path, 'wb') as f:\n            f.write(bytearray(os.urandom(100)))\n        self.assertTrue(os.path.isfile(path))\n        self.assertFalse(Extract.is_archive(path))\n\n    def test_is_archive_zip(self):\n        self.assertTrue(Extract.is_archive(TestExtract.ar_zip))\n\n    def test_is_archive_rar(self):\n        self.assertTrue(Extract.is_archive(TestExtract.ar_rar))\n\n    def test_is_archive_rar_split(self):\n        self.assertTrue(Extract.is_archive(TestExtract.ar_rar_split_p1))\n        self.assertTrue(Extract.is_archive(TestExtract.ar_rar_split_p2))\n\n    def test_is_archive_tar_gz(self):\n        self.assertTrue(Extract.is_archive(TestExtract.ar_tar_gz))\n\n    def test_extract_archive_fails_on_nonexisting_file(self):\n        with self.assertRaises(ExtractError) as ctx:\n            Extract.extract_archive(archive_path=os.path.join(TestExtract.temp_dir, \"no_file\"),\n                                    out_dir_path=TestExtract.temp_dir)\n        self.assertTrue(str(ctx.exception).startswith(\"Path is not a valid archive\"))\n\n    def test_extract_archive_fails_on_dir(self):\n        with self.assertRaises(ExtractError) as ctx:\n            Extract.extract_archive(archive_path=TestExtract.temp_dir,\n                                    out_dir_path=TestExtract.temp_dir)\n        self.assertTrue(str(ctx.exception).startswith(\"Path is not a valid archive\"))\n\n    def test_extract_archive_fails_on_bad_file(self):\n        path = os.path.join(TestExtract.temp_dir, \"bad_file\")\n        with open(path, 'wb') as f:\n            f.write(bytearray(os.urandom(100)))\n        self.assertTrue(os.path.isfile(path))\n        with self.assertRaises(ExtractError) as ctx:\n            Extract.extract_archive(archive_path=path,\n                                    out_dir_path=TestExtract.temp_dir)\n        self.assertTrue(str(ctx.exception).startswith(\"Path is not a valid archive\"))\n\n    def test_extract_archive_creates_sub_directories(self):\n        out_path = os.path.join(TestExtract.temp_dir, \"bunch\", \"of\", \"sub\", \"dir\")\n        Extract.extract_archive(archive_path=TestExtract.ar_rar,\n                                out_dir_path=out_path)\n        self._assert_extracted_files(out_path)\n\n    def test_extract_archive_zip(self):\n        Extract.extract_archive(archive_path=TestExtract.ar_zip,\n                                out_dir_path=TestExtract.temp_dir)\n        self._assert_extracted_files(TestExtract.temp_dir)\n\n    def test_extract_archive_overwrites_existing(self):\n        path = os.path.join(TestExtract.temp_dir, \"file\")\n        with open(path, \"w\") as f:\n            f.write(\"Dummy file\")\n        Extract.extract_archive(archive_path=TestExtract.ar_zip,\n                                out_dir_path=TestExtract.temp_dir)\n        self._assert_extracted_files(TestExtract.temp_dir)\n\n    def test_extract_archive_rar(self):\n        Extract.extract_archive(archive_path=TestExtract.ar_rar,\n                                out_dir_path=TestExtract.temp_dir)\n        self._assert_extracted_files(TestExtract.temp_dir)\n\n    def test_extract_archive_rar_split(self):\n        Extract.extract_archive(archive_path=TestExtract.ar_rar_split_p1,\n                                out_dir_path=TestExtract.temp_dir)\n        self._assert_extracted_files(TestExtract.temp_dir)\n\n    def test_extract_archive_tar_gz(self):\n        Extract.extract_archive(archive_path=TestExtract.ar_tar_gz,\n                                out_dir_path=TestExtract.temp_dir)\n        self._assert_extracted_files(TestExtract.temp_dir)\n"
  },
  {
    "path": "src/python/tests/integration/test_lftp/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_lftp/test_lftp.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport os\nimport shutil\nimport sys\nimport tempfile\nimport unittest\nfrom filecmp import dircmp\n\nimport timeout_decorator\n\nfrom tests.utils import TestUtils\nfrom lftp import Lftp\n\n\nclass TestLftp(unittest.TestCase):\n    temp_dir = None\n\n    @classmethod\n    def setUpClass(cls):\n        # Create a temp directory\n        TestLftp.temp_dir = tempfile.mkdtemp(prefix=\"test_lftp_\")\n\n        # Allow group access for the seedsynctest account\n        TestUtils.chmod_from_to(TestLftp.temp_dir, tempfile.gettempdir(), 0o775)\n\n    @classmethod\n    def tearDownClass(cls):\n        # Cleanup\n        shutil.rmtree(TestLftp.temp_dir)\n\n    def setUp(self):\n        os.mkdir(os.path.join(TestLftp.temp_dir, \"remote\"))\n        os.mkdir(os.path.join(TestLftp.temp_dir, \"local\"))\n\n        # Note: seedsynctest account must be set up. See DeveloperReadme.md for details\n        self.lftp = Lftp(address=\"localhost\", port=22, user=\"seedsynctest\", password=None)\n        self.lftp.set_base_remote_dir_path(os.path.join(TestLftp.temp_dir, \"remote\"))\n        self.lftp.set_base_local_dir_path(os.path.join(TestLftp.temp_dir, \"local\"))\n        logger = logging.getLogger()\n        logger.setLevel(logging.DEBUG)\n        handler = logging.StreamHandler(sys.stdout)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        logger.addHandler(handler)\n        self.lftp.set_base_logger(logger)\n\n        # Verbose logging\n        self.lftp.set_verbose_logging(True)\n\n    def tearDown(self):\n        self.lftp.exit()\n        shutil.rmtree(os.path.join(TestLftp.temp_dir, \"remote\"))\n        shutil.rmtree(os.path.join(TestLftp.temp_dir, \"local\"))\n\n    # noinspection PyMethodMayBeStatic\n    def my_mkdir(self, *args):\n        os.mkdir(os.path.join(TestLftp.temp_dir, \"remote\", *args))\n\n    # noinspection PyMethodMayBeStatic\n    def my_touch(self, size: int, *args):\n        path = os.path.join(TestLftp.temp_dir, \"remote\", *args)\n        with open(path, 'wb') as f:\n            f.write(bytearray(os.urandom(size)))\n\n    def assert_local_equals_remote(self):\n        dcmp = dircmp(os.path.join(TestLftp.temp_dir, \"remote\"),\n                      os.path.join(TestLftp.temp_dir, \"local\"))\n        self.assertFalse(dcmp.left_only)\n        self.assertFalse(dcmp.right_only)\n        self.assertFalse(dcmp.diff_files)\n\n    @timeout_decorator.timeout(5)\n    def test_download_1(self):\n        \"\"\"File names with single quotes\"\"\"\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 300\n\n        self.my_mkdir(\"aaa'aaa\")\n        self.my_touch(128, \"aaa'aaa\", \"aa'aa'aa.txt\")\n        self.my_touch(256, \"b''b''b.txt\")\n        self.my_mkdir(\"c'c'c'c\")\n        self.my_touch(100, \"c'c'c'c\", \"c'''c.txt\")\n        self.my_touch(200, \"d'''d.txt\")\n\n        self.lftp.queue(\"aaa'aaa\", True)\n        self.lftp.queue(\"b''b''b.txt\", False)\n        self.lftp.queue(\"c'c'c'c\", True)\n        self.lftp.queue(\"d'''d.txt\", False)\n\n        # Wait until all downloads are done\n        while self.lftp.status():\n            pass\n\n        self.assert_local_equals_remote()\n\n    @timeout_decorator.timeout(5)\n    def test_download_2(self):\n        \"\"\"File names with double quotes\"\"\"\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 300\n\n        self.my_mkdir(\"aaa\\\"aaa\")\n        self.my_touch(128, \"aaa\\\"aaa\", \"aa\\\"aa\\\"aa.txt\")\n        self.my_touch(256, \"b\\\"\\\"b\\\"\\\"b.txt\")\n        self.my_mkdir(\"c\\\"c\\\"c\\\"c\")\n        self.my_touch(100, \"c\\\"c\\\"c\\\"c\", \"c\\\"\\\"\\\"c.txt\")\n        self.my_touch(200, \"d\\\"\\\"\\\"d.txt\")\n\n        self.lftp.queue(\"aaa\\\"aaa\", True)\n        self.lftp.queue(\"b\\\"\\\"b\\\"\\\"b.txt\", False)\n        self.lftp.queue(\"c\\\"c\\\"c\\\"c\", True)\n        self.lftp.queue(\"d\\\"\\\"\\\"d.txt\", False)\n\n        # Wait until all downloads are done\n        while self.lftp.status():\n            pass\n\n        self.assert_local_equals_remote()\n\n    @timeout_decorator.timeout(5)\n    def test_download_3(self):\n        \"\"\"File names with quotes and spaces\"\"\"\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 300\n\n        self.my_mkdir(\"a' aa\\\"aaa\")\n        self.my_touch(128, \"a' aa\\\"aaa\", \"aa\\\"a ' a\\\"aa.txt\")\n        self.my_touch(256, \"\\\"b ' \\\"b\\\" ' \\\"b.txt\")\n        self.my_mkdir(\"'c\\\" c \\\" 'c' \\\"c\\\"\")\n        self.my_touch(100, \"'c\\\" c \\\" 'c' \\\"c\\\"\", \"c' \\\" ' \\\" ' \\\"c.txt\")\n        self.my_touch(200, \"d\\\" ' \\\" ' \\\"d.txt\")\n\n        self.lftp.queue(\"a' aa\\\"aaa\", True)\n        self.lftp.queue(\"\\\"b ' \\\"b\\\" ' \\\"b.txt\", False)\n        self.lftp.queue(\"'c\\\" c \\\" 'c' \\\"c\\\"\", True)\n        self.lftp.queue(\"d\\\" ' \\\" ' \\\"d.txt\", False)\n\n        # Wait until all downloads are done\n        while self.lftp.status():\n            pass\n\n        self.assert_local_equals_remote()\n\n    @timeout_decorator.timeout(5)\n    def test_download_4(self):\n        \"\"\"File names with ' -o '\"\"\"\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 300\n\n        self.my_mkdir(\"a -o a\")\n        self.my_touch(128, \"a -o a\", \"a -o a.txt\")\n        self.my_touch(256, \"b -o b.txt\")\n        self.my_mkdir(\"c -o c\")\n        self.my_touch(100, \"c -o c\", \"c -o c.txt\")\n        self.my_touch(200, \"d -o d.txt\")\n\n        self.lftp.queue(\"a -o a\", True)\n        self.lftp.queue(\"b -o b.txt\", False)\n        self.lftp.queue(\"c -o c\", True)\n        self.lftp.queue(\"d -o d.txt\", False)\n\n        # Wait until all downloads are done\n        while self.lftp.status():\n            pass\n\n        self.assert_local_equals_remote()\n"
  },
  {
    "path": "src/python/tests/integration/test_web/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nfrom urllib.parse import quote\n\nfrom controller import AutoQueuePattern\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestAutoQueueHandler(BaseTestWebApp):\n    def test_get(self):\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"t wo\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"thr'ee\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"fo\\\"ur\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"fi%ve\"))\n        resp = self.test_app.get(\"/server/autoqueue/get\")\n        self.assertEqual(200, resp.status_int)\n        json_list = json.loads(str(resp.html))\n        self.assertEqual(5, len(json_list))\n        self.assertIn({\"pattern\": \"one\"}, json_list)\n        self.assertIn({\"pattern\": \"t wo\"}, json_list)\n        self.assertIn({\"pattern\": \"thr'ee\"}, json_list)\n        self.assertIn({\"pattern\": \"fo\\\"ur\"}, json_list)\n        self.assertIn({\"pattern\": \"fi%ve\"}, json_list)\n\n    def test_get_is_ordered(self):\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"a\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"b\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"c\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"d\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(pattern=\"e\"))\n        resp = self.test_app.get(\"/server/autoqueue/get\")\n        self.assertEqual(200, resp.status_int)\n        json_list = json.loads(str(resp.html))\n        self.assertEqual(5, len(json_list))\n        self.assertEqual([\n            {\"pattern\": \"a\"},\n            {\"pattern\": \"b\"},\n            {\"pattern\": \"c\"},\n            {\"pattern\": \"d\"},\n            {\"pattern\": \"e\"}\n        ], json_list)\n\n    def test_add_good(self):\n        resp = self.test_app.get(\"/server/autoqueue/add/one\")\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(1, len(self.auto_queue_persist.patterns))\n        self.assertIn(AutoQueuePattern(\"one\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/add/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(2, len(self.auto_queue_persist.patterns))\n        self.assertIn(AutoQueuePattern(\"/value/with/slashes\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/add/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(3, len(self.auto_queue_persist.patterns))\n        self.assertIn(AutoQueuePattern(\" value with spaces\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/add/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(4, len(self.auto_queue_persist.patterns))\n        self.assertIn(AutoQueuePattern(\"value'with'singlequote\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/add/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(5, len(self.auto_queue_persist.patterns))\n        self.assertIn(AutoQueuePattern(\"value\\\"with\\\"doublequote\"), self.auto_queue_persist.patterns)\n\n    def test_add_double(self):\n        resp = self.test_app.get(\"/server/autoqueue/add/one\")\n        self.assertEqual(200, resp.status_int)\n        resp = self.test_app.get(\"/server/autoqueue/add/one\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Auto-queue pattern 'one' already exists.\", str(resp.html))\n\n    def test_add_empty_value(self):\n        uri = quote(quote(\"  \", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/add/\" + uri, expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(0, len(self.auto_queue_persist.patterns))\n\n        resp = self.test_app.get(\"/server/autoqueue/add/\", expect_errors=True)\n        self.assertEqual(404, resp.status_int)\n        self.assertEqual(0, len(self.auto_queue_persist.patterns))\n\n    def test_remove_good(self):\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(\"one\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(\"/value/with/slashes\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(\" value with spaces\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(\"value'with'singlequote\"))\n        self.auto_queue_persist.add_pattern(AutoQueuePattern(\"value\\\"with\\\"doublequote\"))\n\n        resp = self.test_app.get(\"/server/autoqueue/remove/one\")\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(4, len(self.auto_queue_persist.patterns))\n        self.assertNotIn(AutoQueuePattern(\"one\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/remove/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(3, len(self.auto_queue_persist.patterns))\n        self.assertNotIn(AutoQueuePattern(\"/value/with/slashes\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/remove/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(2, len(self.auto_queue_persist.patterns))\n        self.assertNotIn(AutoQueuePattern(\" value with spaces\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/remove/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(1, len(self.auto_queue_persist.patterns))\n        self.assertNotIn(AutoQueuePattern(\"value'with'singlequote\"), self.auto_queue_persist.patterns)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/remove/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(0, len(self.auto_queue_persist.patterns))\n        self.assertNotIn(AutoQueuePattern(\"value\\\"with\\\"doublequote\"), self.auto_queue_persist.patterns)\n\n    def test_remove_non_existing(self):\n        resp = self.test_app.get(\"/server/autoqueue/remove/one\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Auto-queue pattern 'one' doesn't exist.\", str(resp.html))\n\n    def test_remove_empty_value(self):\n        uri = quote(quote(\"  \", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/autoqueue/remove/\" + uri, expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Auto-queue pattern '  ' doesn't exist.\", str(resp.html))\n        self.assertEqual(0, len(self.auto_queue_persist.patterns))\n\n        resp = self.test_app.get(\"/server/autoqueue/remove/\", expect_errors=True)\n        self.assertEqual(404, resp.status_int)\n        self.assertEqual(0, len(self.auto_queue_persist.patterns))\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nfrom urllib.parse import quote\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestConfigHandler(BaseTestWebApp):\n    def test_get(self):\n        self.context.config.general.debug = True\n        self.context.config.lftp.remote_path = \"/remote/server/path\"\n        self.context.config.controller.interval_ms_local_scan = 5678\n        self.context.config.web.port = 8080\n        resp = self.test_app.get(\"/server/config/get\")\n        self.assertEqual(200, resp.status_int)\n        json_dict = json.loads(str(resp.html))\n        self.assertEqual(True, json_dict[\"general\"][\"debug\"])\n        self.assertEqual(\"/remote/server/path\", json_dict[\"lftp\"][\"remote_path\"])\n        self.assertEqual(5678, json_dict[\"controller\"][\"interval_ms_local_scan\"])\n        self.assertEqual(8080, json_dict[\"web\"][\"port\"])\n\n    def test_set_good(self):\n        self.assertEqual(None, self.context.config.general.debug)\n        resp = self.test_app.get(\"/server/config/set/general/debug/True\")\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(True, self.context.config.general.debug)\n\n        self.assertEqual(None, self.context.config.lftp.remote_path)\n        uri = quote(quote(\"/path/to/somewhere\", safe=\"\"), safe=\"\")\n        resp = self.test_app.get(\"/server/config/set/lftp/remote_path/\" + uri)\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(\"/path/to/somewhere\", self.context.config.lftp.remote_path)\n\n        self.assertEqual(None, self.context.config.controller.interval_ms_local_scan)\n        resp = self.test_app.get(\"/server/config/set/controller/interval_ms_local_scan/5678\")\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(5678, self.context.config.controller.interval_ms_local_scan)\n\n        self.assertEqual(None, self.context.config.web.port)\n        resp = self.test_app.get(\"/server/config/set/web/port/8080\")\n        self.assertEqual(200, resp.status_int)\n        self.assertEqual(8080, self.context.config.web.port)\n\n    def test_set_missing_section(self):\n        self.assertFalse(self.context.config.has_section(\"bad_section\"))\n        resp = self.test_app.get(\"/server/config/set/bad_section/option/value\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"There is no section 'bad_section' in config\", str(resp.html))\n        self.assertFalse(self.context.config.has_section(\"bad_section\"))\n\n    def test_set_missing_option(self):\n        self.assertFalse(self.context.config.general.has_property(\"bad_option\"))\n        resp = self.test_app.get(\"/server/config/set/general/bad_option/value\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Section 'general' in config has no option 'bad_option'\", str(resp.html))\n        self.assertFalse(self.context.config.general.has_property(\"bad_option\"))\n\n    def test_set_bad_value(self):\n        # boolean\n        self.assertEqual(None, self.context.config.general.debug)\n        resp = self.test_app.get(\"/server/config/set/general/debug/cat\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Bad config: General.debug (cat) must be a boolean value\", str(resp.html))\n        self.assertEqual(None, self.context.config.general.debug)\n\n        # positive int\n        self.assertEqual(None, self.context.config.controller.interval_ms_local_scan)\n        resp = self.test_app.get(\"/server/config/set/controller/interval_ms_local_scan/-1\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Bad config: Controller.interval_ms_local_scan (-1) must be greater than 0\", str(resp.html))\n        self.assertEqual(None, self.context.config.controller.interval_ms_local_scan)\n\n    def test_set_empty_value(self):\n        self.assertEqual(None, self.context.config.lftp.remote_path)\n        resp = self.test_app.get(\"/server/config/set/lftp/remote_path/\", expect_errors=True)\n        self.assertEqual(404, resp.status_int)\n        self.assertEqual(None, self.context.config.lftp.remote_path)\n\n        self.assertEqual(None, self.context.config.lftp.remote_path)\n        resp = self.test_app.get(\"/server/config/set/lftp/remote_path/%20%20\", expect_errors=True)\n        self.assertEqual(400, resp.status_int)\n        self.assertEqual(\"Bad config: Lftp.remote_path is empty\", str(resp.html))\n        self.assertEqual(None, self.context.config.lftp.remote_path)\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_controller.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom unittest.mock import MagicMock\nfrom urllib.parse import quote\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\nfrom controller import Controller\n\n\nclass TestControllerHandler(BaseTestWebApp):\n    def test_queue(self):\n        def side_effect(cmd: Controller.Command):\n            cmd.callbacks[0].on_success()\n        self.controller.queue_command = MagicMock()\n        self.controller.queue_command.side_effect = side_effect\n\n        print(self.test_app.get(\"/server/command/queue/test1\"))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"test1\", command.filename)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/queue/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"/value/with/slashes\", command.filename)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/queue/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\" value with spaces\", command.filename)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/queue/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"value'with'singlequote\", command.filename)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/queue/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"value\\\"with\\\"doublequote\", command.filename)\n\n    def test_stop(self):\n        def side_effect(cmd: Controller.Command):\n            cmd.callbacks[0].on_success()\n        self.controller.queue_command = MagicMock()\n        self.controller.queue_command.side_effect = side_effect\n\n        print(self.test_app.get(\"/server/command/stop/test1\"))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.STOP, command.action)\n        self.assertEqual(\"test1\", command.filename)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/stop/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.STOP, command.action)\n        self.assertEqual(\"/value/with/slashes\", command.filename)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/stop/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.STOP, command.action)\n        self.assertEqual(\" value with spaces\", command.filename)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/stop/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.STOP, command.action)\n        self.assertEqual(\"value'with'singlequote\", command.filename)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/stop/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.STOP, command.action)\n        self.assertEqual(\"value\\\"with\\\"doublequote\", command.filename)\n\n    def test_extract(self):\n        def side_effect(cmd: Controller.Command):\n            cmd.callbacks[0].on_success()\n        self.controller.queue_command = MagicMock()\n        self.controller.queue_command.side_effect = side_effect\n\n        print(self.test_app.get(\"/server/command/extract/test1\"))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"test1\", command.filename)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/extract/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"/value/with/slashes\", command.filename)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/extract/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\" value with spaces\", command.filename)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/extract/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"value'with'singlequote\", command.filename)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/extract/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"value\\\"with\\\"doublequote\", command.filename)\n\n    def test_delete_local(self):\n        def side_effect(cmd: Controller.Command):\n            cmd.callbacks[0].on_success()\n        self.controller.queue_command = MagicMock()\n        self.controller.queue_command.side_effect = side_effect\n\n        print(self.test_app.get(\"/server/command/delete_local/test1\"))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_LOCAL, command.action)\n        self.assertEqual(\"test1\", command.filename)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_local/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_LOCAL, command.action)\n        self.assertEqual(\"/value/with/slashes\", command.filename)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_local/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_LOCAL, command.action)\n        self.assertEqual(\" value with spaces\", command.filename)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_local/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_LOCAL, command.action)\n        self.assertEqual(\"value'with'singlequote\", command.filename)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_local/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_LOCAL, command.action)\n        self.assertEqual(\"value\\\"with\\\"doublequote\", command.filename)\n\n    def test_delete_remote(self):\n        def side_effect(cmd: Controller.Command):\n            cmd.callbacks[0].on_success()\n        self.controller.queue_command = MagicMock()\n        self.controller.queue_command.side_effect = side_effect\n\n        print(self.test_app.get(\"/server/command/delete_remote/test1\"))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_REMOTE, command.action)\n        self.assertEqual(\"test1\", command.filename)\n\n        uri = quote(quote(\"/value/with/slashes\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_remote/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_REMOTE, command.action)\n        self.assertEqual(\"/value/with/slashes\", command.filename)\n\n        uri = quote(quote(\" value with spaces\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_remote/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_REMOTE, command.action)\n        self.assertEqual(\" value with spaces\", command.filename)\n\n        uri = quote(quote(\"value'with'singlequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_remote/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_REMOTE, command.action)\n        self.assertEqual(\"value'with'singlequote\", command.filename)\n\n        uri = quote(quote(\"value\\\"with\\\"doublequote\", safe=\"\"), safe=\"\")\n        print(self.test_app.get(\"/server/command/delete_remote/\"+uri))\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.DELETE_REMOTE, command.action)\n        self.assertEqual(\"value\\\"with\\\"doublequote\", command.filename)\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_server.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestServerHandler(BaseTestWebApp):\n    def test_restart(self):\n        self.assertFalse(self.web_app_builder.server_handler.is_restart_requested())\n        print(self.test_app.get(\"/server/command/restart\"))\n        self.assertTrue(self.web_app_builder.server_handler.is_restart_requested())\n        print(self.test_app.get(\"/server/command/restart\"))\n        self.assertTrue(self.web_app_builder.server_handler.is_restart_requested())\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestStatusHandler(BaseTestWebApp):\n    def test_status(self):\n        resp = self.test_app.get(\"/server/status\")\n        self.assertEqual(200, resp.status_int)\n        json_dict = json.loads(str(resp.html))\n        self.assertEqual(True, json_dict[\"server\"][\"up\"])\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_stream_log.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom unittest.mock import patch\nfrom threading import Timer\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestLogStreamHandler(BaseTestWebApp):\n    @patch(\"web.handler.stream_log.SerializeLogRecord\")\n    def test_stream_log_serializes_record(self, mock_serialize_log_record_cls):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        # Schedule status update\n        def issue_logs():\n            self.context.logger.debug(\"Debug msg\")\n            self.context.logger.info(\"Info msg\")\n            self.context.logger.warning(\"Warning msg\")\n            self.context.logger.error(\"Error msg\")\n        Timer(0.3, issue_logs).start()\n\n        # Setup mock serialize instance\n        mock_serialize = mock_serialize_log_record_cls.return_value\n        mock_serialize.record.return_value = \"\\n\"\n\n        self.test_app.get(\"/server/stream\")\n        self.assertEqual(4, len(mock_serialize.record.call_args_list))\n        call1, call2, call3, call4 = mock_serialize.record.call_args_list\n        record1 = call1[0][0]\n        self.assertEqual(\"Debug msg\", record1.msg)\n        self.assertEqual(logging.DEBUG, record1.levelno)\n        record2 = call2[0][0]\n        self.assertEqual(\"Info msg\", record2.msg)\n        self.assertEqual(logging.INFO, record2.levelno)\n        record3 = call3[0][0]\n        self.assertEqual(\"Warning msg\", record3.msg)\n        self.assertEqual(logging.WARNING, record3.levelno)\n        record4 = call4[0][0]\n        self.assertEqual(\"Error msg\", record4.msg)\n        self.assertEqual(logging.ERROR, record4.levelno)\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_stream_model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock, patch\nfrom threading import Timer\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\nfrom web.serialize import SerializeModel\nfrom model import ModelFile\n\n\nclass TestModelStreamHandler(BaseTestWebApp):\n    def test_stream_model_fetches_model_and_adds_listener(self):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        self.test_app.get(\"/server/stream\")\n        self.controller.get_model_files_and_add_listener.assert_called_once_with(unittest.mock.ANY)\n\n    def test_stream_model_removes_listener(self):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        self.test_app.get(\"/server/stream\")\n        self.controller.remove_model_listener.assert_called_once_with(self.model_listener)\n\n    @patch(\"web.handler.stream_model.SerializeModel\")\n    def test_stream_model_serializes_initial_model(self, mock_serialize_model_cls):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        # Setup mock serialize instance\n        mock_serialize = mock_serialize_model_cls.return_value\n        mock_serialize.model.return_value = \"\\n\"\n\n        # Initial model\n        self.model_files = [ModelFile(\"a\", True), ModelFile(\"b\", False)]\n\n        self.test_app.get(\"/server/stream\")\n        mock_serialize.model.assert_called_once_with([ModelFile(\"a\", True), ModelFile(\"b\", False)])\n\n    @patch(\"web.handler.stream_model.SerializeModel\")\n    def test_stream_model_serializes_updates(self, mock_serialize_model_cls):\n        # Schedule server stop\n        Timer(2.0, self.web_app.stop).start()\n\n        # Setup mock serialize instance\n        mock_serialize = mock_serialize_model_cls.return_value\n        mock_serialize.model.return_value = \"\\n\"\n        mock_serialize.update_event.return_value = \"\\n\"\n        # Use the real UpdateEvent class\n        mock_serialize_model_cls.UpdateEvent = SerializeModel.UpdateEvent\n\n        # Queue updates\n        added_file = ModelFile(\"a\", True)\n        removed_file = ModelFile(\"b\", False)\n        old_file = ModelFile(\"c\", False)\n        old_file.local_size = 100\n        new_file = ModelFile(\"c\", False)\n        new_file.local_size = 200\n\n        def send_updates():\n            self.assertIsNotNone(self.model_listener)\n            self.model_listener.file_added(added_file)\n            self.model_listener.file_removed(removed_file)\n            self.model_listener.file_updated(old_file, new_file)\n        Timer(0.5, send_updates).start()\n\n        self.test_app.get(\"/server/stream\")\n        self.assertEqual(3, len(mock_serialize.update_event.call_args_list))\n        call1, call2, call3 = mock_serialize.update_event.call_args_list\n        self.assertEqual(SerializeModel.UpdateEvent.Change.ADDED, call1[0][0].change)\n        self.assertEqual(None, call1[0][0].old_file)\n        self.assertEqual(added_file, call1[0][0].new_file)\n        self.assertEqual(SerializeModel.UpdateEvent.Change.REMOVED, call2[0][0].change)\n        self.assertEqual(removed_file, call2[0][0].old_file)\n        self.assertEqual(None, call2[0][0].new_file)\n        self.assertEqual(SerializeModel.UpdateEvent.Change.UPDATED, call3[0][0].change)\n        self.assertEqual(old_file, call3[0][0].old_file)\n        self.assertEqual(new_file, call3[0][0].new_file)\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_handler/test_stream_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom unittest.mock import patch\nfrom threading import Timer\n\nfrom tests.integration.test_web.test_web_app import BaseTestWebApp\n\n\nclass TestStatusStreamHandler(BaseTestWebApp):\n    @patch(\"web.handler.stream_status.SerializeStatus\")\n    def test_stream_status_serializes_initial_status(self, mock_serialize_status_cls):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        # Setup mock serialize instance\n        mock_serialize = mock_serialize_status_cls.return_value\n        mock_serialize.status.return_value = \"\\n\"\n\n        self.test_app.get(\"/server/stream\")\n        self.assertEqual(1, len(mock_serialize.status.call_args_list))\n        call1 = mock_serialize.status.call_args_list[0]\n        status = call1[0][0]\n        self.assertEqual(True, status.server.up)\n        self.assertEqual(None, status.server.error_msg)\n\n    @patch(\"web.handler.stream_status.SerializeStatus\")\n    def test_stream_status_serializes_new_status(self, mock_serialize_status_cls):\n        # Schedule server stop\n        Timer(0.5, self.web_app.stop).start()\n\n        # Schedule status update\n        def update_status():\n            self.context.status.server.up = False\n            self.context.status.server.error_msg = \"Something bad happened\"\n        Timer(0.3, update_status).start()\n\n        # Setup mock serialize instance\n        mock_serialize = mock_serialize_status_cls.return_value\n        mock_serialize.status.return_value = \"\\n\"\n\n        self.test_app.get(\"/server/stream\")\n        self.assertEqual(3, len(mock_serialize.status.call_args_list))\n        call1, call2, call3 = mock_serialize.status.call_args_list\n        status1 = call1[0][0]\n        self.assertEqual(True, status1.server.up)\n        self.assertEqual(None, status1.server.error_msg)\n        status2 = call2[0][0]\n        self.assertEqual(False, status2.server.up)\n        self.assertEqual(None, status2.server.error_msg)\n        status3 = call3[0][0]\n        self.assertEqual(False, status3.server.up)\n        self.assertEqual(\"Something bad happened\", status3.server.error_msg)\n"
  },
  {
    "path": "src/python/tests/integration/test_web/test_web_app.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock\nimport logging\nimport sys\n\nfrom webtest import TestApp\n\nfrom common import overrides, Status, Config\nfrom controller import AutoQueuePersist\nfrom web import WebAppBuilder\n\n\nclass BaseTestWebApp(unittest.TestCase):\n    \"\"\"\n    Base class for testing web app\n    Sets up the web app with mocks\n    \"\"\"\n    @overrides(unittest.TestCase)\n    def setUp(self):\n        self.context = MagicMock()\n        self.controller = MagicMock()\n\n        # Mock the base logger\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        self.context.logger = logger\n\n        # Model files\n        self.model_files = []\n\n        # Real status\n        self.context.status = Status()\n\n        # Real config\n        self.context.config = Config()\n\n        # Real auto-queue persist\n        self.auto_queue_persist = AutoQueuePersist()\n\n        # Capture the model listener\n        def capture_listener(listener):\n            self.model_listener = listener\n            return self.model_files\n        self.model_listener = None\n        self.controller.get_model_files_and_add_listener = MagicMock()\n        self.controller.get_model_files_and_add_listener.side_effect = capture_listener\n        self.controller.remove_model_listener = MagicMock()\n\n        # noinspection PyTypeChecker\n        self.web_app_builder = WebAppBuilder(self.context,\n                                             self.controller,\n                                             self.auto_queue_persist)\n        self.web_app = self.web_app_builder.build()\n        self.test_app = TestApp(self.web_app)\n\n\nclass TestWebApp(BaseTestWebApp):\n    def test_process(self):\n        self.web_app.process()\n"
  },
  {
    "path": "src/python/tests/unittests/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_common/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_common/test_app_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport logging\nimport sys\nimport time\nfrom multiprocessing import Value\nimport threading\n\nimport timeout_decorator\n\nfrom common import AppProcess, AppOneShotProcess\n\n\nclass DummyException(Exception):\n    pass\n\n\nclass DummyProcess(AppProcess):\n    def __init__(self, fail: bool):\n        super().__init__(name=self.__class__.__name__)\n        self.fail = fail\n        self.time = Value('i', 0)\n        self.last_loop_time = Value('i', -1)\n        self.last_init_time = Value('i', -1)\n        self.last_cleanup_time = Value('i', -1)\n\n    def run_loop(self):\n        self.last_loop_time.value = self.time.value\n        self.time.value += 1\n        if self.fail:\n            raise DummyException()\n\n    def run_init(self):\n        self.last_init_time.value = self.time.value\n        self.time.value += 1\n\n    def run_cleanup(self):\n        self.last_cleanup_time.value = self.time.value\n        self.time.value += 1\n\n\nclass LongRunningProcess(AppProcess):\n    def __init__(self):\n        super().__init__(name=self.__class__.__name__)\n\n    def run_init(self):\n        pass\n\n    def run_loop(self):\n        while True:\n            pass\n\n    def run_cleanup(self):\n        pass\n\n\nclass LongRunningThreadProcess(AppProcess):\n    def __init__(self):\n        super().__init__(name=self.__class__.__name__)\n        self.thread = threading.Thread(target=self.long_task)\n\n    def run_init(self):\n        self.thread.start()\n\n    def run_loop(self):\n        pass\n\n    def run_cleanup(self):\n        pass\n\n    # noinspection PyMethodMayBeStatic\n    def long_task(self):\n        print(\"Thread task started\")\n        while True:\n            pass\n\n\nclass DummyOneShotProcess(AppOneShotProcess):\n    def __init__(self):\n        super().__init__(name=self.__class__.__name__)\n        self.time = Value('i', 0)\n\n    def run_once(self):\n        self.time.value += 1\n\n\nclass OneShotLongRunningProcess(AppOneShotProcess):\n    def __init__(self):\n        super().__init__(name=self.__class__.__name__)\n\n    def run_once(self):\n        while True:\n            pass\n\n\nclass TestAppProcess(unittest.TestCase):\n    def setUp(self):\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Assign process to this variable so that it can be cleaned up\n        # even after an error\n        self.process = None\n\n    def tearDown(self):\n        if self.process:\n            self.process.terminate()\n\n    @timeout_decorator.timeout(2)\n    def test_exception_propagates(self):\n        self.process = DummyProcess(fail=True)\n        self.process.start()\n        time.sleep(0.2)\n        with self.assertRaises(DummyException):\n            self.process.propagate_exception()\n\n    @timeout_decorator.timeout(2)\n    def test_process_terminates(self):\n        self.process = DummyProcess(fail=False)\n        self.process.start()\n        self.process.terminate()\n        self.process.join()\n        self.process = None\n\n    @timeout_decorator.timeout(2)\n    def test_init_called_before_loop(self):\n        self.process = DummyProcess(fail=False)\n        self.process.start()\n        time.sleep(0.2)\n        self.assertGreater(self.process.last_init_time.value, -1)\n        self.assertGreater(self.process.last_loop_time.value, -1)\n        self.assertGreater(self.process.last_loop_time.value, self.process.last_init_time.value)\n\n    @timeout_decorator.timeout(2)\n    def test_cleanup_called_after_loop(self):\n        self.process = DummyProcess(fail=False)\n        self.process.start()\n        time.sleep(0.2)\n        self.process.terminate()\n        self.process.join()\n        self.assertGreater(self.process.last_cleanup_time.value, -1)\n        self.assertGreater(self.process.last_loop_time.value, -1)\n        self.assertLess(self.process.last_loop_time.value, self.process.last_cleanup_time.value)\n        self.process = None\n\n    @timeout_decorator.timeout(5)\n    def test_long_running_process_is_force_terminated(self):\n        self.process = LongRunningProcess()\n        self.process.start()\n        time.sleep(0.2)\n        self.process.terminate()\n        self.process.join()\n        self.process = None\n\n    @timeout_decorator.timeout(5)\n    def test_process_with_long_running_thread_terminates_properly(self):\n        self.process = LongRunningThreadProcess()\n        self.process.start()\n        time.sleep(0.2)\n        self.process.terminate()\n        self.process.join()\n        self.process = None\n\n\nclass TestAppOneShotProcess(unittest.TestCase):\n    def setUp(self):\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Assign process to this variable so that it can be cleaned up\n        # even after an error\n        self.process = None\n\n    def tearDown(self):\n        if self.process:\n            self.process.terminate()\n\n    @timeout_decorator.timeout(2)\n    def test_run_once_called_once(self):\n        self.process = DummyOneShotProcess()\n        self.process.start()\n        time.sleep(0.2)\n        self.assertEqual(self.process.time.value, 1)\n\n    @timeout_decorator.timeout(5)\n    def test_long_running_process_is_force_terminated(self):\n        self.process = OneShotLongRunningProcess()\n        self.process.start()\n        time.sleep(0.2)\n        self.process.terminate()\n        self.process.join()\n        self.process = None\n"
  },
  {
    "path": "src/python/tests/unittests/test_common/test_config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport os\nimport tempfile\n\nfrom common import Config, ConfigError, PersistError\nfrom common.config import InnerConfig, Checkers, Converters\n\n\nclass TestConverters(unittest.TestCase):\n    def test_int(self):\n        self.assertEqual(0, Converters.int(None, \"\", \"0\"))\n        self.assertEqual(1, Converters.int(None, \"\", \"1\"))\n        self.assertEqual(-1, Converters.int(None, \"\", \"-1\"))\n        self.assertEqual(5000, Converters.int(None, \"\", \"5000\"))\n        self.assertEqual(-5000, Converters.int(None, \"\", \"-5000\"))\n        with self.assertRaises(ConfigError) as e:\n            Converters.int(TestConverters, \"bad\", \"\")\n        self.assertEqual(\"Bad config: TestConverters.bad is empty\", str(e.exception))\n        with self.assertRaises(ConfigError) as e:\n            Converters.int(TestConverters, \"bad\", \"3.14\")\n        self.assertEqual(\"Bad config: TestConverters.bad (3.14) must be an integer value\", str(e.exception))\n        with self.assertRaises(ConfigError) as e:\n            Converters.int(TestConverters, \"bad\", \"cat\")\n        self.assertEqual(\"Bad config: TestConverters.bad (cat) must be an integer value\", str(e.exception))\n\n    def test_bool(self):\n        self.assertEqual(True, Converters.bool(None, \"\", \"True\"))\n        self.assertEqual(False, Converters.bool(None, \"\", \"False\"))\n        self.assertEqual(True, Converters.bool(None, \"\", \"true\"))\n        self.assertEqual(False, Converters.bool(None, \"\", \"false\"))\n        self.assertEqual(True, Converters.bool(None, \"\", \"TRUE\"))\n        self.assertEqual(False, Converters.bool(None, \"\", \"FALSE\"))\n        self.assertEqual(True, Converters.bool(None, \"\", \"1\"))\n        self.assertEqual(False, Converters.bool(None, \"\", \"0\"))\n        with self.assertRaises(ConfigError) as e:\n            Converters.bool(TestConverters, \"bad\", \"\")\n        self.assertEqual(\"Bad config: TestConverters.bad is empty\", str(e.exception))\n        with self.assertRaises(ConfigError) as e:\n            Converters.bool(TestConverters, \"bad\", \"cat\")\n        self.assertEqual(\"Bad config: TestConverters.bad (cat) must be a boolean value\", str(e.exception))\n        with self.assertRaises(ConfigError) as e:\n            Converters.bool(TestConverters, \"bad\", \"-3.14\")\n        self.assertEqual(\"Bad config: TestConverters.bad (-3.14) must be a boolean value\", str(e.exception))\n\n\nclass DummyInnerConfig(InnerConfig):\n    c_prop1 = InnerConfig._create_property(\"prop1\", Checkers.null, Converters.null)\n    a_prop2 = InnerConfig._create_property(\"prop2\", Checkers.null, Converters.null)\n    b_prop3 = InnerConfig._create_property(\"prop3\", Checkers.null, Converters.null)\n\n    def __init__(self):\n        self.c_prop1 = \"1\"\n        self.a_prop2 = \"2\"\n        self.b_prop3 = \"3\"\n\n\nclass DummyInnerConfig2(InnerConfig):\n    prop_int = InnerConfig._create_property(\"prop_int\", Checkers.null, Converters.int)\n    prop_str = InnerConfig._create_property(\"prop_str\", Checkers.string_nonempty, Converters.null)\n\n    def __init__(self):\n        self.prop_int = None\n        self.prop_str = None\n\n\nclass TestInnerConfig(unittest.TestCase):\n    def test_property_order(self):\n        dummy_config = DummyInnerConfig()\n        self.assertEqual([\"c_prop1\", \"a_prop2\", \"b_prop3\"], list(dummy_config.as_dict().keys()))\n\n    def test_has_property(self):\n        dummy_config = DummyInnerConfig()\n        self.assertTrue(dummy_config.has_property(\"c_prop1\"))\n        self.assertTrue(dummy_config.has_property(\"a_prop2\"))\n        self.assertTrue(dummy_config.has_property(\"b_prop3\"))\n        self.assertFalse(dummy_config.has_property(\"not_prop\"))\n        self.assertFalse(dummy_config.has_property(\"__init__\"))\n        self.assertFalse(dummy_config.has_property(\"\"))\n\n    def test_checker_is_called(self):\n        dummy_config = DummyInnerConfig2()\n        dummy_config.prop_str = \"a string\"\n        self.assertEqual(\"a string\", dummy_config.prop_str)\n        with self.assertRaises(ConfigError) as e:\n            dummy_config.prop_str = \"\"\n        self.assertEqual(\"Bad config: DummyInnerConfig2.prop_str is empty\", str(e.exception))\n\n    def test_converter_is_called(self):\n        dummy_config = DummyInnerConfig2.from_dict({\"prop_int\": \"5\", \"prop_str\": \"a\"})\n        self.assertEqual(5, dummy_config.prop_int)\n        with self.assertRaises(ConfigError) as e:\n            DummyInnerConfig2.from_dict({\"prop_int\": \"cat\", \"prop_str\": \"a\"})\n        self.assertEqual(\"Bad config: DummyInnerConfig2.prop_int (cat) must be an integer value\", str(e.exception))\n\n\nclass TestConfig(unittest.TestCase):\n    def __check_unknown_error(self, cls, good_dict):\n        \"\"\"\n        Helper method to check that a config class raises an error on\n        an unknown key\n        :param cls:\n        :param good_dict:\n        :return:\n        \"\"\"\n        bad_dict = dict(good_dict)\n        bad_dict[\"unknown\"] = \"how did this get here\"\n        with self.assertRaises(ConfigError) as error:\n            cls.from_dict(bad_dict)\n        self.assertTrue(str(error.exception).startswith(\"Unknown config\"))\n\n    def __check_missing_error(self, cls, good_dict, key):\n        \"\"\"\n        Helper method to check that a config class raises an error on\n        a missing key\n        :param cls:\n        :param good_dict:\n        :param key:\n        :return:\n        \"\"\"\n        bad_dict = dict(good_dict)\n        del bad_dict[key]\n        with self.assertRaises(ConfigError) as error:\n            cls.from_dict(bad_dict)\n        self.assertTrue(str(error.exception).startswith(\"Missing config\"))\n\n    def __check_empty_error(self, cls, good_dict, key):\n        \"\"\"\n        Helper method to check that a config class raises an error on\n        a empty value\n        :param cls:\n        :param good_dict:\n        :param key:\n        :return:\n        \"\"\"\n        bad_dict = dict(good_dict)\n        bad_dict[key] = \"\"\n        with self.assertRaises(ConfigError) as error:\n            cls.from_dict(bad_dict)\n        self.assertTrue(str(error.exception).startswith(\"Bad config\"))\n        bad_dict[key] = \"   \"\n        with self.assertRaises(ConfigError) as error:\n            cls.from_dict(bad_dict)\n        self.assertTrue(str(error.exception).startswith(\"Bad config\"))\n\n    def check_common(self, cls, good_dict, keys):\n        \"\"\"\n        Helper method to run some common checks\n        :param cls:\n        :param good_dict:\n        :param keys:\n        :return:\n        \"\"\"\n        # unknown\n        self.__check_unknown_error(cls, good_dict)\n\n        for key in keys:\n            # missing key\n            self.__check_missing_error(cls, good_dict, key)\n            # empty value\n            self.__check_empty_error(cls, good_dict, key)\n\n    def check_bad_value_error(self, cls, good_dict, key, value):\n        \"\"\"\n        Helper method to check that a config class raises an error on\n        a bad value\n        :param cls:\n        :param good_dict:\n        :param key:\n        :param value:\n        :return:\n        \"\"\"\n        bad_dict = dict(good_dict)\n        bad_dict[key] = value\n        with self.assertRaises(ConfigError) as error:\n            cls.from_dict(bad_dict)\n        self.assertTrue(str(error.exception).startswith(\"Bad config\"))\n\n    def test_has_section(self):\n        config = Config()\n        self.assertTrue(config.has_section(\"general\"))\n        self.assertTrue(config.has_section(\"lftp\"))\n        self.assertTrue(config.has_section(\"controller\"))\n        self.assertTrue(config.has_section(\"web\"))\n        self.assertTrue(config.has_section(\"autoqueue\"))\n        self.assertFalse(config.has_section(\"nope\"))\n        self.assertFalse(config.has_section(\"from_file\"))\n        self.assertFalse(config.has_section(\"__init__\"))\n\n    def test_general(self):\n        good_dict = {\n            \"debug\": \"True\",\n            \"verbose\": \"False\",\n        }\n        general = Config.General.from_dict(good_dict)\n        self.assertEqual(True, general.debug)\n        self.assertEqual(False, general.verbose)\n\n        self.check_common(Config.General,\n                          good_dict,\n                          {\n                              \"debug\",\n                              \"verbose\"\n                          })\n\n        # bad values\n        self.check_bad_value_error(Config.General, good_dict, \"debug\", \"SomeString\")\n        self.check_bad_value_error(Config.General, good_dict, \"debug\", \"-1\")\n        self.check_bad_value_error(Config.General, good_dict, \"verbose\", \"SomeString\")\n        self.check_bad_value_error(Config.General, good_dict, \"verbose\", \"-1\")\n\n    def test_lftp(self):\n        good_dict = {\n            \"remote_address\": \"remote.server.com\",\n            \"remote_username\": \"remote-user\",\n            \"remote_password\": \"password\",\n            \"remote_port\": \"3456\",\n            \"remote_path\": \"/path/on/remote/server\",\n            \"local_path\": \"/path/on/local/server\",\n            \"remote_path_to_scan_script\": \"/path/on/remote/server/to/scan/script\",\n            \"use_ssh_key\": \"False\",\n            \"num_max_parallel_downloads\": \"2\",\n            \"num_max_parallel_files_per_download\": \"3\",\n            \"num_max_connections_per_root_file\": \"4\",\n            \"num_max_connections_per_dir_file\": \"6\",\n            \"num_max_total_connections\": \"7\",\n            \"use_temp_file\": \"True\"\n        }\n        lftp = Config.Lftp.from_dict(good_dict)\n        self.assertEqual(\"remote.server.com\", lftp.remote_address)\n        self.assertEqual(\"remote-user\", lftp.remote_username)\n        self.assertEqual(\"password\", lftp.remote_password)\n        self.assertEqual(3456, lftp.remote_port)\n        self.assertEqual(\"/path/on/remote/server\", lftp.remote_path)\n        self.assertEqual(\"/path/on/local/server\", lftp.local_path)\n        self.assertEqual(\"/path/on/remote/server/to/scan/script\", lftp.remote_path_to_scan_script)\n        self.assertEqual(False, lftp.use_ssh_key)\n        self.assertEqual(2, lftp.num_max_parallel_downloads)\n        self.assertEqual(3, lftp.num_max_parallel_files_per_download)\n        self.assertEqual(4, lftp.num_max_connections_per_root_file)\n        self.assertEqual(6, lftp.num_max_connections_per_dir_file)\n        self.assertEqual(7, lftp.num_max_total_connections)\n        self.assertEqual(True, lftp.use_temp_file)\n\n        self.check_common(Config.Lftp,\n                          good_dict,\n                          {\n                              \"remote_address\",\n                              \"remote_username\",\n                              \"remote_password\",\n                              \"remote_port\",\n                              \"remote_path\",\n                              \"local_path\",\n                              \"remote_path_to_scan_script\",\n                              \"use_ssh_key\",\n                              \"num_max_parallel_downloads\",\n                              \"num_max_parallel_files_per_download\",\n                              \"num_max_connections_per_root_file\",\n                              \"num_max_connections_per_dir_file\",\n                              \"num_max_total_connections\",\n                              \"use_temp_file\"\n                          })\n\n        # bad values\n        self.check_bad_value_error(Config.Lftp, good_dict, \"remote_port\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"remote_port\", \"0\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"use_ssh_key\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"use_ssh_key\", \"SomeString\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_parallel_downloads\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_parallel_downloads\", \"0\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_parallel_files_per_download\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_parallel_files_per_download\", \"0\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_connections_per_root_file\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_connections_per_root_file\", \"0\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_connections_per_dir_file\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_connections_per_dir_file\", \"0\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"num_max_total_connections\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"use_temp_file\", \"-1\")\n        self.check_bad_value_error(Config.Lftp, good_dict, \"use_temp_file\", \"SomeString\")\n\n    def test_controller(self):\n        good_dict = {\n            \"interval_ms_remote_scan\": \"30000\",\n            \"interval_ms_local_scan\": \"10000\",\n            \"interval_ms_downloading_scan\": \"2000\",\n            \"extract_path\": \"/extract/path\",\n            \"use_local_path_as_extract_path\": \"True\"\n        }\n        controller = Config.Controller.from_dict(good_dict)\n        self.assertEqual(30000, controller.interval_ms_remote_scan)\n        self.assertEqual(10000, controller.interval_ms_local_scan)\n        self.assertEqual(2000, controller.interval_ms_downloading_scan)\n        self.assertEqual(\"/extract/path\", controller.extract_path)\n        self.assertEqual(True, controller.use_local_path_as_extract_path)\n\n        self.check_common(Config.Controller,\n                          good_dict,\n                          {\n                              \"interval_ms_remote_scan\",\n                              \"interval_ms_local_scan\",\n                              \"interval_ms_downloading_scan\",\n                              \"extract_path\",\n                              \"use_local_path_as_extract_path\"\n                          })\n\n        # bad values\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_remote_scan\", \"-1\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_remote_scan\", \"0\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_local_scan\", \"-1\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_local_scan\", \"0\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_downloading_scan\", \"-1\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"interval_ms_downloading_scan\", \"0\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"use_local_path_as_extract_path\", \"SomeString\")\n        self.check_bad_value_error(Config.Controller, good_dict, \"use_local_path_as_extract_path\", \"-1\")\n\n    def test_web(self):\n        good_dict = {\n            \"port\": \"1234\",\n        }\n        web = Config.Web.from_dict(good_dict)\n        self.assertEqual(1234, web.port)\n\n        self.check_common(Config.Web,\n                          good_dict,\n                          {\n                              \"port\"\n                          })\n\n        # bad values\n        self.check_bad_value_error(Config.Web, good_dict, \"port\", \"-1\")\n        self.check_bad_value_error(Config.Web, good_dict, \"port\", \"0\")\n\n    def test_autoqueue(self):\n        good_dict = {\n            \"enabled\": \"True\",\n            \"patterns_only\": \"False\",\n            \"auto_extract\": \"True\"\n        }\n        autoqueue = Config.AutoQueue.from_dict(good_dict)\n        self.assertEqual(True, autoqueue.enabled)\n        self.assertEqual(False, autoqueue.patterns_only)\n\n        self.check_common(Config.AutoQueue,\n                          good_dict,\n                          {\n                              \"enabled\",\n                              \"patterns_only\",\n                              \"auto_extract\"\n                          })\n\n        # bad values\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"enabled\", \"SomeString\")\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"enabled\", \"-1\")\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"patterns_only\", \"SomeString\")\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"patterns_only\", \"-1\")\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"auto_extract\", \"SomeString\")\n        self.check_bad_value_error(Config.AutoQueue, good_dict, \"auto_extract\", \"-1\")\n\n    def test_from_file(self):\n        # Create empty config file\n        config_file = open(tempfile.mktemp(suffix=\"test_config\"), \"w\")\n\n        config_file.write(\"\"\"\n        [General]\n        debug=False\n        verbose=True\n\n        [Lftp]\n        remote_address=remote.server.com\n        remote_username=remote-user\n        remote_password=remote-pass\n        remote_port = 3456\n        remote_path=/path/on/remote/server\n        local_path=/path/on/local/server\n        remote_path_to_scan_script=/path/on/remote/server/to/scan/script\n        use_ssh_key=True\n        num_max_parallel_downloads=2\n        num_max_parallel_files_per_download=3\n        num_max_connections_per_root_file=4\n        num_max_connections_per_dir_file=5\n        num_max_total_connections=7\n        use_temp_file=False\n\n        [Controller]\n        interval_ms_remote_scan=30000\n        interval_ms_local_scan=10000\n        interval_ms_downloading_scan=2000\n        extract_path=/path/where/to/extract/stuff\n        use_local_path_as_extract_path=False\n\n        [Web]\n        port=88\n\n        [AutoQueue]\n        enabled=False\n        patterns_only=True\n        auto_extract=True\n        \"\"\")\n        config_file.flush()\n        config = Config.from_file(config_file.name)\n\n        self.assertEqual(False, config.general.debug)\n        self.assertEqual(True, config.general.verbose)\n\n        self.assertEqual(\"remote.server.com\", config.lftp.remote_address)\n        self.assertEqual(\"remote-user\", config.lftp.remote_username)\n        self.assertEqual(\"remote-pass\", config.lftp.remote_password)\n        self.assertEqual(3456, config.lftp.remote_port)\n        self.assertEqual(\"/path/on/remote/server\", config.lftp.remote_path)\n        self.assertEqual(\"/path/on/local/server\", config.lftp.local_path)\n        self.assertEqual(\"/path/on/remote/server/to/scan/script\", config.lftp.remote_path_to_scan_script)\n        self.assertEqual(True, config.lftp.use_ssh_key)\n        self.assertEqual(2, config.lftp.num_max_parallel_downloads)\n        self.assertEqual(3, config.lftp.num_max_parallel_files_per_download)\n        self.assertEqual(4, config.lftp.num_max_connections_per_root_file)\n        self.assertEqual(5, config.lftp.num_max_connections_per_dir_file)\n        self.assertEqual(7, config.lftp.num_max_total_connections)\n        self.assertEqual(False, config.lftp.use_temp_file)\n\n        self.assertEqual(30000, config.controller.interval_ms_remote_scan)\n        self.assertEqual(10000, config.controller.interval_ms_local_scan)\n        self.assertEqual(2000, config.controller.interval_ms_downloading_scan)\n        self.assertEqual(\"/path/where/to/extract/stuff\", config.controller.extract_path)\n        self.assertEqual(False, config.controller.use_local_path_as_extract_path)\n\n        self.assertEqual(88, config.web.port)\n\n        self.assertEqual(False, config.autoqueue.enabled)\n        self.assertEqual(True, config.autoqueue.patterns_only)\n        self.assertEqual(True, config.autoqueue.auto_extract)\n\n        # unknown section error\n        config_file.write(\"\"\"\n        [Unknown]\n        key=value\n        \"\"\")\n        config_file.flush()\n        with self.assertRaises(ConfigError) as error:\n            Config.from_file(config_file.name)\n        self.assertTrue(str(error.exception).startswith(\"Unknown section\"))\n\n        # Remove config file\n        config_file.close()\n        os.remove(config_file.name)\n\n    def test_to_file(self):\n        config_file_path = tempfile.mktemp(suffix=\"test_config\")\n\n        config = Config()\n        config.general.debug = True\n        config.general.verbose = False\n        config.lftp.remote_address = \"server.remote.com\"\n        config.lftp.remote_username = \"user-on-remote-server\"\n        config.lftp.remote_password = \"pass-on-remote-server\"\n        config.lftp.remote_port = 3456\n        config.lftp.remote_path = \"/remote/server/path\"\n        config.lftp.local_path = \"/local/server/path\"\n        config.lftp.remote_path_to_scan_script = \"/remote/server/path/to/script\"\n        config.lftp.use_ssh_key = True\n        config.lftp.num_max_parallel_downloads = 6\n        config.lftp.num_max_parallel_files_per_download = 7\n        config.lftp.num_max_connections_per_root_file = 2\n        config.lftp.num_max_connections_per_dir_file = 3\n        config.lftp.num_max_total_connections = 4\n        config.lftp.use_temp_file = True\n        config.controller.interval_ms_remote_scan = 1234\n        config.controller.interval_ms_local_scan = 5678\n        config.controller.interval_ms_downloading_scan = 9012\n        config.controller.extract_path = \"/path/extract/stuff\"\n        config.controller.use_local_path_as_extract_path = True\n        config.web.port = 13\n        config.autoqueue.enabled = True\n        config.autoqueue.patterns_only = True\n        config.autoqueue.auto_extract = False\n        config.to_file(config_file_path)\n        with open(config_file_path, \"r\") as f:\n            actual_str = f.read()\n        print(actual_str)\n\n        golden_str = \"\"\"\n        [General]\n        debug = True\n        verbose = False\n\n        [Lftp]\n        remote_address = server.remote.com\n        remote_username = user-on-remote-server\n        remote_password = pass-on-remote-server\n        remote_port = 3456\n        remote_path = /remote/server/path\n        local_path = /local/server/path\n        remote_path_to_scan_script = /remote/server/path/to/script\n        use_ssh_key = True\n        num_max_parallel_downloads = 6\n        num_max_parallel_files_per_download = 7\n        num_max_connections_per_root_file = 2\n        num_max_connections_per_dir_file = 3\n        num_max_total_connections = 4\n        use_temp_file = True\n\n        [Controller]\n        interval_ms_remote_scan = 1234\n        interval_ms_local_scan = 5678\n        interval_ms_downloading_scan = 9012\n        extract_path = /path/extract/stuff\n        use_local_path_as_extract_path = True\n\n        [Web]\n        port = 13\n\n        [AutoQueue]\n        enabled = True\n        patterns_only = True\n        auto_extract = False\n        \"\"\"\n\n        golden_lines = [s.strip() for s in golden_str.splitlines()]\n        golden_lines = list(filter(None, golden_lines))  # remove blank lines\n        actual_lines = [s.strip() for s in actual_str.splitlines()]\n        actual_lines = list(filter(None, actual_lines))  # remove blank lines\n\n        self.assertEqual(len(golden_lines), len(actual_lines))\n        for i, _ in enumerate(golden_lines):\n            self.assertEqual(golden_lines[i], actual_lines[i])\n\n    def test_persist_read_error(self):\n        # bad section\n        content = \"\"\"\n        [Web\n        port=88\n        \"\"\"\n        with self.assertRaises(PersistError):\n            Config.from_str(content)\n\n        # bad value\n        content = \"\"\"\n        [Web]\n        port88\n        \"\"\"\n        with self.assertRaises(PersistError):\n            Config.from_str(content)\n\n        # bad line\n        content = \"\"\"\n        [Web]\n        port=88\n        what am i doing here\n        \"\"\"\n        with self.assertRaises(PersistError):\n            Config.from_str(content)\n"
  },
  {
    "path": "src/python/tests/unittests/test_common/test_job.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock\nimport time\n\n\nfrom common import Job\n\n\nclass DummyError(Exception):\n    pass\n\n\nclass DummyFailingJob(Job):\n    def setup(self):\n        # noinspection PyAttributeOutsideInit\n        self.cleanup_run = False\n\n    def execute(self):\n        raise DummyError()\n\n    def cleanup(self):\n        # noinspection PyAttributeOutsideInit\n        self.cleanup_run = True\n\n\nclass TestJob(unittest.TestCase):\n    def test_exception_propagates(self):\n        context = MagicMock()\n        # noinspection PyTypeChecker\n        job = DummyFailingJob(\"DummyFailingJob\", context)\n        job.start()\n        time.sleep(0.2)\n        with self.assertRaises(DummyError):\n            job.propagate_exception()\n        job.terminate()\n        job.join()\n\n    def test_cleanup_executes_on_execute_error(self):\n        context = MagicMock()\n        # noinspection PyTypeChecker\n        job = DummyFailingJob(\"DummyFailingJob\", context)\n        job.start()\n        time.sleep(0.2)\n        job.terminate()\n        job.join()\n        self.assertTrue(job.cleanup_run)\n"
  },
  {
    "path": "src/python/tests/unittests/test_common/test_multiprocessing_logger.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport logging\nimport sys\nimport time\nimport multiprocessing\n\nfrom testfixtures import LogCapture\nimport timeout_decorator\n\nfrom common import MultiprocessingLogger\n\n\nclass TestMultiprocessingLogger(unittest.TestCase):\n    def setUp(self):\n        self.logger = logging.getLogger(TestMultiprocessingLogger.__name__)\n        handler = logging.StreamHandler(sys.stdout)\n        self.logger.addHandler(handler)\n        self.logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n    @timeout_decorator.timeout(5)\n    def test_main_logger_receives_records(self):\n        def process_1(_mp_logger: MultiprocessingLogger):\n            logger = _mp_logger.get_process_safe_logger().getChild(\"process_1\")\n            logger.debug(\"Debug line\")\n            time.sleep(0.1)\n            logger.info(\"Info line\")\n            time.sleep(0.1)\n            logger.warning(\"Warning line\")\n            time.sleep(0.1)\n            logger.error(\"Error line\")\n\n        mp_logger = MultiprocessingLogger(self.logger)\n        p_1 = multiprocessing.Process(target=process_1,\n                                      args=(mp_logger,))\n\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            p_1.start()\n            mp_logger.start()\n            time.sleep(1)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"DEBUG\", \"Debug line\"),\n                (\"process_1\", \"INFO\", \"Info line\"),\n                (\"process_1\", \"WARNING\", \"Warning line\"),\n                (\"process_1\", \"ERROR\", \"Error line\")\n            )\n\n    @timeout_decorator.timeout(5)\n    def test_children_names(self):\n        def process_1(_mp_logger: MultiprocessingLogger):\n            logger = _mp_logger.get_process_safe_logger().getChild(\"process_1\")\n            logger.debug(\"Debug line\")\n            logger.getChild(\"child_1\").debug(\"Debug line\")\n            logger.getChild(\"child_1_1\").debug(\"Debug line\")\n\n        mp_logger = MultiprocessingLogger(self.logger)\n        p_1 = multiprocessing.Process(target=process_1,\n                                      args=(mp_logger,))\n\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            p_1.start()\n            mp_logger.start()\n            time.sleep(1)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"DEBUG\", \"Debug line\"),\n                (\"process_1.child_1\", \"DEBUG\", \"Debug line\"),\n                (\"process_1.child_1_1\", \"DEBUG\", \"Debug line\"),\n            )\n\n    @timeout_decorator.timeout(5)\n    def test_logger_levels(self):\n        def process_1(_mp_logger: MultiprocessingLogger):\n            logger = _mp_logger.get_process_safe_logger().getChild(\"process_1\")\n            logger.debug(\"Debug line\")\n            logger.info(\"Info line\")\n            logger.warning(\"Warning line\")\n            logger.error(\"Error line\")\n\n        # Debug level\n        self.logger.setLevel(logging.DEBUG)\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            mp_logger = MultiprocessingLogger(self.logger)\n            p_1 = multiprocessing.Process(target=process_1,\n                                          args=(mp_logger,))\n            p_1.start()\n            mp_logger.start()\n            time.sleep(0.2)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"DEBUG\", \"Debug line\"),\n                (\"process_1\", \"INFO\", \"Info line\"),\n                (\"process_1\", \"WARNING\", \"Warning line\"),\n                (\"process_1\", \"ERROR\", \"Error line\")\n            )\n\n        # Info level\n        self.logger.setLevel(logging.INFO)\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            mp_logger = MultiprocessingLogger(self.logger)\n            p_1 = multiprocessing.Process(target=process_1,\n                                          args=(mp_logger,))\n            p_1.start()\n            mp_logger.start()\n            time.sleep(0.2)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"INFO\", \"Info line\"),\n                (\"process_1\", \"WARNING\", \"Warning line\"),\n                (\"process_1\", \"ERROR\", \"Error line\")\n            )\n\n        # Warning level\n        self.logger.setLevel(logging.WARNING)\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            mp_logger = MultiprocessingLogger(self.logger)\n            p_1 = multiprocessing.Process(target=process_1,\n                                          args=(mp_logger,))\n            p_1.start()\n            mp_logger.start()\n            time.sleep(0.2)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"WARNING\", \"Warning line\"),\n                (\"process_1\", \"ERROR\", \"Error line\")\n            )\n\n        # Error level\n        self.logger.setLevel(logging.ERROR)\n        with LogCapture(\"TestMultiprocessingLogger.MPLogger.process_1\") as log_capture:\n            mp_logger = MultiprocessingLogger(self.logger)\n            p_1 = multiprocessing.Process(target=process_1,\n                                          args=(mp_logger,))\n            p_1.start()\n            mp_logger.start()\n            time.sleep(0.2)\n            p_1.join()\n            mp_logger.stop()\n\n            log_capture.check(\n                (\"process_1\", \"ERROR\", \"Error line\")\n            )\n"
  },
  {
    "path": "src/python/tests/unittests/test_common/test_persist.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport tempfile\nimport shutil\nimport os\n\nfrom common import overrides, Persist, AppError, Localization\n\n\nclass DummyPersist(Persist):\n    def __init__(self):\n        self.my_content = None\n\n    @classmethod\n    @overrides(Persist)\n    def from_str(cls: \"DummyPersist\", content: str) -> \"DummyPersist\":\n        persist = DummyPersist()\n        persist.my_content = content\n        return persist\n\n    @overrides(Persist)\n    def to_str(self) -> str:\n        return self.my_content\n\n\nclass TestPersist(unittest.TestCase):\n    @overrides(unittest.TestCase)\n    def setUp(self):\n        # Create a temp directory\n        self.temp_dir = tempfile.mkdtemp(prefix=\"test_persist\")\n\n    @overrides(unittest.TestCase)\n    def tearDown(self):\n        # Cleanup\n        shutil.rmtree(self.temp_dir)\n\n    def test_from_file(self):\n        file_path = os.path.join(self.temp_dir, \"persist\")\n        with open(file_path, \"w\") as f:\n            f.write(\"some test content\")\n        persist = DummyPersist.from_file(file_path)\n        self.assertEqual(\"some test content\", persist.my_content)\n\n    def test_from_file_non_existing(self):\n        file_path = os.path.join(self.temp_dir, \"persist\")\n        with self.assertRaises(AppError) as context:\n            DummyPersist.from_file(file_path)\n        self.assertEqual(Localization.Error.MISSING_FILE.format(file_path), str(context.exception))\n\n    def test_to_file_non_existing(self):\n        file_path = os.path.join(self.temp_dir, \"persist\")\n        persist = DummyPersist()\n        persist.my_content = \"write out some content\"\n        persist.to_file(file_path)\n        self.assertTrue(os.path.isfile(file_path))\n        with open(file_path, \"r\") as f:\n            self.assertEqual(\"write out some content\", f.read())\n\n    def test_to_file_overwrite(self):\n        file_path = os.path.join(self.temp_dir, \"persist\")\n        with open(file_path, \"w\") as f:\n            f.write(\"pre-existing content\")\n            f.flush()\n        persist = DummyPersist()\n        persist.my_content = \"write out some new content\"\n        persist.to_file(file_path)\n        self.assertTrue(os.path.isfile(file_path))\n        with open(file_path, \"r\") as f:\n            self.assertEqual(\"write out some new content\", f.read())\n"
  },
  {
    "path": "src/python/tests/unittests/test_common/test_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock\nfrom datetime import datetime\n\nfrom common import overrides, Status, IStatusListener, StatusComponent, IStatusComponentListener\n\n\nclass DummyStatusComponent(StatusComponent):\n    a = StatusComponent._create_property(\"a\")\n    b = StatusComponent._create_property(\"b\")\n\n    def __init__(self):\n        super().__init__()\n        self.a = None\n        self.b = None\n\n\nclass DummyStatusComponentListener(IStatusComponentListener):\n    @overrides(IStatusComponentListener)\n    def notify(self, name):\n        pass\n\n\nclass DummyStatusListener(IStatusListener):\n    @overrides(IStatusListener)\n    def notify(self):\n        pass\n\n\nclass TestStatusComponent(unittest.TestCase):\n    def test_property_values(self):\n        d = DummyStatusComponent()\n        d.a = \"hello\"\n        d.b = 33\n        self.assertEqual(\"hello\", d.a)\n        self.assertEqual(33, d.b)\n\n    def test_listeners(self):\n        listener = DummyStatusComponentListener()\n        listener.notify = MagicMock()\n        d = DummyStatusComponent()\n        d.add_listener(listener)\n        d.a = \"hello world\"\n        listener.notify.assert_called_once_with(\"a\")\n        listener.notify.reset_mock()\n        d.b = 44\n        listener.notify.assert_called_once_with(\"b\")\n\n        # remove listener\n        listener.notify.reset_mock()\n        d.remove_listener(listener)\n        d.a = \"bye world\"\n        listener.notify.assert_not_called()\n        d.b = 22\n        listener.notify.assert_not_called()\n\n    def test_copy_values(self):\n        d = DummyStatusComponent()\n        d.a = \"hello world\"\n        d.b = 55\n\n        e = DummyStatusComponent()\n        DummyStatusComponent.copy(d, e)\n        self.assertEqual(\"hello world\", e.a)\n        self.assertEqual(55, e.b)\n\n        # Modifying original doesn't touch copy\n        d.a = \"bye world\"\n        d.b = 66\n        self.assertEqual(\"bye world\", d.a)\n        self.assertEqual(66, d.b)\n        self.assertEqual(\"hello world\", e.a)\n        self.assertEqual(55, e.b)\n\n        # Modifying copy doesn't touch original\n        e.a = \"copied world\"\n        e.b = 77\n        self.assertEqual(\"bye world\", d.a)\n        self.assertEqual(66, d.b)\n        self.assertEqual(\"copied world\", e.a)\n        self.assertEqual(77, e.b)\n\n    def test_copy_doesnt_copy_listeners(self):\n        d = DummyStatusComponent()\n        d.a = \"hello world\"\n        d.b = 55\n        listener = DummyStatusComponentListener()\n        listener.notify = MagicMock()\n        d.add_listener(listener)\n\n        e = DummyStatusComponent()\n        DummyStatusComponent.copy(d, e)\n\n        d.a = \"bye world\"\n        listener.notify.assert_called_once_with(\"a\")\n        listener.notify.reset_mock()\n\n        e.a = \"copied world\"\n        listener.notify.assert_not_called()\n\n\nclass TestStatus(unittest.TestCase):\n    def test_property_values(self):\n        status = Status()\n        status.server.up = True\n        status.server.error_msg = \"Everything's good\"\n        self.assertEqual(True, status.server.up)\n        self.assertEqual(\"Everything's good\", status.server.error_msg)\n\n    def test_listeners(self):\n        listener = DummyStatusListener()\n        listener.notify = MagicMock()\n        status = Status()\n        status.add_listener(listener)\n        status.server.up = False\n        listener.notify.assert_called_once_with()\n        listener.notify.reset_mock()\n        status.server.error_msg = \"Everything's good\"\n        listener.notify.assert_called_once_with()\n\n    def test_cannot_replace_component(self):\n        status = Status()\n        new_server = Status.ServerStatus()\n        with self.assertRaises(ValueError) as e:\n            status.server = new_server\n        self.assertEqual(\"Cannot reassign component\", str(e.exception))\n\n    def test_default_values(self):\n        status = Status()\n        self.assertEqual(True, status.server.up)\n        self.assertEqual(None, status.server.error_msg)\n        self.assertEqual(None, status.controller.latest_local_scan_time)\n        self.assertEqual(None, status.controller.latest_remote_scan_time)\n\n    def test_components_registered(self):\n        # Test that all components were registered\n        # This is done through the copy method\n        status = Status()\n\n        status.server.up = False\n        status.server.error_msg = \"an error message\"\n        copy = status.copy()\n        self.assertEqual(False, copy.server.up)\n        self.assertEqual(\"an error message\", copy.server.error_msg)\n\n        time1 = datetime.now()\n        time2 = datetime.now()\n        status.controller.latest_local_scan_time = time1\n        status.controller.latest_remote_scan_time = time2\n        copy = status.copy()\n        self.assertEqual(time1, copy.controller.latest_local_scan_time)\n        self.assertEqual(time2, copy.controller.latest_remote_scan_time)\n\n    def test_copy_values(self):\n        status = Status()\n        status.server.up = False\n        status.server.error_msg = \"Bad error\"\n\n        copy = status.copy()\n        self.assertEqual(False, copy.server.up)\n        self.assertEqual(\"Bad error\", copy.server.error_msg)\n\n        # Modifying original doesn't touch copy\n        status.server.up = True\n        status.server.error_msg = \"No error\"\n        self.assertEqual(True, status.server.up)\n        self.assertEqual(\"No error\", status.server.error_msg)\n        self.assertEqual(False, copy.server.up)\n        self.assertEqual(\"Bad error\", copy.server.error_msg)\n\n        # Modifying copy doesn't touch original\n        copy.server.up = False\n        copy.server.error_msg = \"Worse error\"\n        self.assertEqual(True, status.server.up)\n        self.assertEqual(\"No error\", status.server.error_msg)\n        self.assertEqual(False, copy.server.up)\n        self.assertEqual(\"Worse error\", copy.server.error_msg)\n\n    def test_copy_doesnt_copy_listeners(self):\n        status = Status()\n        listener = DummyStatusListener()\n        listener.notify = MagicMock()\n        status.add_listener(listener)\n        copy = status.copy()\n\n        status.server.error_msg = \"a\"\n        listener.notify.assert_called_once_with()\n        listener.notify.reset_mock()\n\n        copy.server.error_msg = \"b\"\n        listener.notify.assert_not_called()\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import MagicMock\nimport logging\nimport sys\nimport json\n\nfrom common import overrides, PersistError, Config\nfrom controller import AutoQueue, AutoQueuePersist, IAutoQueuePersistListener, AutoQueuePattern\nfrom controller import Controller\nfrom model import IModelListener, ModelFile\n\n\nclass TestAutoQueuePattern(unittest.TestCase):\n    def test_pattern(self):\n        aqp = AutoQueuePattern(pattern=\"file.one\")\n        self.assertEqual(aqp.pattern, \"file.one\")\n        aqp = AutoQueuePattern(pattern=\"file.two\")\n        self.assertEqual(aqp.pattern, \"file.two\")\n\n    def test_equality(self):\n        aqp_1 = AutoQueuePattern(pattern=\"file.one\")\n        aqp_2 = AutoQueuePattern(pattern=\"file.two\")\n        aqp_1b = AutoQueuePattern(pattern=\"file.one\")\n        self.assertEqual(aqp_1, aqp_1b)\n        self.assertNotEqual(aqp_1, aqp_2)\n\n    def test_to_str(self):\n        self.assertEqual(\n            \"{\\\"pattern\\\": \\\"file.one\\\"}\",\n            AutoQueuePattern(pattern=\"file.one\").to_str()\n        )\n        self.assertEqual(\n            \"{\\\"pattern\\\": \\\"file'one\\\"}\",\n            AutoQueuePattern(pattern=\"file'one\").to_str()\n        )\n        self.assertEqual(\n            \"{\\\"pattern\\\": \\\"file\\\\\\\"one\\\"}\",\n            AutoQueuePattern(pattern=\"file\\\"one\").to_str()\n        )\n        self.assertEqual(\n            \"{\\\"pattern\\\": \\\"fil(eo)ne\\\"}\",\n            AutoQueuePattern(pattern=\"fil(eo)ne\").to_str()\n        )\n\n    def test_from_str(self):\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file.one\"),\n            AutoQueuePattern.from_str(\"{\\\"pattern\\\": \\\"file.one\\\"}\"),\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file'one\"),\n            AutoQueuePattern.from_str(\"{\\\"pattern\\\": \\\"file'one\\\"}\"),\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file\\\"one\"),\n            AutoQueuePattern.from_str(\"{\\\"pattern\\\": \\\"file\\\\\\\"one\\\"}\"),\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"fil(eo)ne\"),\n            AutoQueuePattern.from_str(\"{\\\"pattern\\\": \\\"fil(eo)ne\\\"}\"),\n        )\n\n    def test_to_and_from_str(self):\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file.one\"),\n            AutoQueuePattern.from_str(AutoQueuePattern(pattern=\"file.one\").to_str())\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file'one\"),\n            AutoQueuePattern.from_str(AutoQueuePattern(pattern=\"file'one\").to_str())\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"file\\\"one\"),\n            AutoQueuePattern.from_str(AutoQueuePattern(pattern=\"file\\\"one\").to_str())\n        )\n        self.assertEqual(\n            AutoQueuePattern(pattern=\"fil(eo)ne\"),\n            AutoQueuePattern.from_str(AutoQueuePattern(pattern=\"fil(eo)ne\").to_str())\n        )\n\n\nclass TestAutoQueuePersistListener(IAutoQueuePersistListener):\n    @overrides(IAutoQueuePersistListener)\n    def pattern_added(self, pattern: AutoQueuePattern):\n        pass\n\n    @overrides(IAutoQueuePersistListener)\n    def pattern_removed(self, pattern: AutoQueuePattern):\n        pass\n\n\nclass TestAutoQueuePersist(unittest.TestCase):\n    def test_add_pattern(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        self.assertEqual({\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"two\")\n        }, persist.patterns)\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"three\"))\n        self.assertEqual({\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"two\"),\n            AutoQueuePattern(pattern=\"three\")\n        }, persist.patterns)\n\n    def test_add_blank_pattern_fails(self):\n        persist = AutoQueuePersist()\n        with self.assertRaises(ValueError):\n            persist.add_pattern(AutoQueuePattern(pattern=\"\"))\n        with self.assertRaises(ValueError):\n            persist.add_pattern(AutoQueuePattern(pattern=\" \"))\n        with self.assertRaises(ValueError):\n            persist.add_pattern(AutoQueuePattern(pattern=\"   \"))\n\n    def test_remove_pattern(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        persist.remove_pattern(AutoQueuePattern(pattern=\"one\"))\n        self.assertEqual({AutoQueuePattern(pattern=\"two\")}, persist.patterns)\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"three\"))\n        persist.remove_pattern(AutoQueuePattern(pattern=\"two\"))\n        self.assertEqual({\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"three\")\n        }, persist.patterns)\n\n    def test_listener_pattern_added(self):\n        listener = TestAutoQueuePersistListener()\n        listener.pattern_added = MagicMock()\n        persist = AutoQueuePersist()\n        persist.add_listener(listener)\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_added.assert_called_once_with(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_added.reset_mock()\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        listener.pattern_added.assert_called_once_with(AutoQueuePattern(pattern=\"two\"))\n        listener.pattern_added.reset_mock()\n\n    def test_listener_pattern_added_duplicate(self):\n        listener = TestAutoQueuePersistListener()\n        listener.pattern_added = MagicMock()\n        persist = AutoQueuePersist()\n        persist.add_listener(listener)\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_added.assert_called_once_with(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_added.reset_mock()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_added.assert_not_called()\n\n    def test_listener_pattern_removed(self):\n        listener = TestAutoQueuePersistListener()\n        listener.pattern_removed = MagicMock()\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"three\"))\n        persist.add_listener(listener)\n        persist.remove_pattern(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_removed.assert_called_once_with(AutoQueuePattern(pattern=\"one\"))\n        listener.pattern_removed.reset_mock()\n        persist.remove_pattern(AutoQueuePattern(pattern=\"two\"))\n        listener.pattern_removed.assert_called_once_with(AutoQueuePattern(pattern=\"two\"))\n        listener.pattern_removed.reset_mock()\n\n    def test_listener_pattern_removed_non_existing(self):\n        listener = TestAutoQueuePersistListener()\n        listener.pattern_removed = MagicMock()\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"three\"))\n        persist.add_listener(listener)\n        persist.remove_pattern(AutoQueuePattern(pattern=\"four\"))\n        listener.pattern_removed.assert_not_called()\n\n    def test_from_str(self):\n        content = \"\"\"\n        {{\n            \"patterns\": [\n                \"{}\",\n                \"{}\",\n                \"{}\",\n                \"{}\",\n                \"{}\",\n                \"{}\"\n            ]\n        }}\n        \"\"\".format(\n            AutoQueuePattern(pattern=\"one\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\"),\n            AutoQueuePattern(pattern=\"two\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\"),\n            AutoQueuePattern(pattern=\"th ree\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\"),\n            AutoQueuePattern(pattern=\"fo.ur\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\"),\n            AutoQueuePattern(pattern=\"fi\\\"ve\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\"),\n            AutoQueuePattern(pattern=\"si'x\").to_str().replace(\"\\\\\", \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\")\n        )\n        print(content)\n        print(AutoQueuePattern(pattern=\"fi\\\"ve\").to_str())\n        persist = AutoQueuePersist.from_str(content)\n        golden_patterns = {\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"two\"),\n            AutoQueuePattern(pattern=\"th ree\"),\n            AutoQueuePattern(pattern=\"fo.ur\"),\n            AutoQueuePattern(pattern=\"fi\\\"ve\"),\n            AutoQueuePattern(pattern=\"si'x\")\n        }\n        self.assertEqual(golden_patterns, persist.patterns)\n\n    def test_to_str(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"th ree\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"fo.ur\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"fi\\\"ve\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"si'x\"))\n        print(persist.to_str())\n        dct = json.loads(persist.to_str())\n        self.assertTrue(\"patterns\" in dct)\n        self.assertEqual(\n            [\n                AutoQueuePattern(pattern=\"one\").to_str(),\n                AutoQueuePattern(pattern=\"two\").to_str(),\n                AutoQueuePattern(pattern=\"th ree\").to_str(),\n                AutoQueuePattern(pattern=\"fo.ur\").to_str(),\n                AutoQueuePattern(pattern=\"fi\\\"ve\").to_str(),\n                AutoQueuePattern(pattern=\"si'x\").to_str()\n            ],\n            dct[\"patterns\"]\n        )\n\n    def test_to_and_from_str(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"one\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"th ree\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"fo.ur\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"fi\\\"ve\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"si'x\"))\n\n        persist_actual = AutoQueuePersist.from_str(persist.to_str())\n        self.assertEqual(\n            persist.patterns,\n            persist_actual.patterns\n        )\n\n    def test_persist_read_error(self):\n        # bad pattern\n        content = \"\"\"\n        {\n            \"patterns\": [\n                \"bad string\"\n            ]\n        }\n        \"\"\"\n        with self.assertRaises(PersistError):\n            AutoQueuePersist.from_str(content)\n\n        # empty json\n        content = \"\"\n        with self.assertRaises(PersistError):\n            AutoQueuePersist.from_str(content)\n\n        # missing keys\n        content = \"{}\"\n        with self.assertRaises(PersistError):\n            AutoQueuePersist.from_str(content)\n\n        # malformed\n        content = \"{\"\n        with self.assertRaises(PersistError):\n            AutoQueuePersist.from_str(content)\n\n\nclass TestAutoQueue(unittest.TestCase):\n    def setUp(self):\n        self.logger = logging.getLogger(TestAutoQueue.__name__)\n        handler = logging.StreamHandler(sys.stdout)\n        self.logger.addHandler(handler)\n        self.logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        self.context = MagicMock()\n\n        self.context.config = Config()\n        self.context.config.autoqueue.enabled = True\n        self.context.config.autoqueue.patterns_only = True\n        self.context.config.autoqueue.auto_extract = True\n        self.context.logger = self.logger\n        self.controller = MagicMock()\n        self.controller.get_model_files_and_add_listener = MagicMock()\n        self.controller.queue_command = MagicMock()\n        self.model_listener = None\n        self.initial_model = []\n\n        def get_model():\n            return self.initial_model\n\n        def get_model_and_capture_listener(listener: IModelListener):\n            self.model_listener = listener\n            return get_model()\n\n        self.controller.get_model_files.side_effect = get_model\n        self.controller.get_model_files_and_add_listener.side_effect = get_model_and_capture_listener\n\n    def test_matching_new_files_are_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n        self.model_listener.file_added(file_two)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.Two\", command.filename)\n\n        self.model_listener.file_added(file_three)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.Three\", command.filename)\n\n        # All at once\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list[-3:]\n        commands = [calls[i][0][0] for i in range(3)]\n        self.assertEqual(set([Controller.Command.Action.QUEUE]*3), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\"}, {c.filename for c in commands})\n\n    def test_matching_initial_files_are_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(3, len(calls))\n        commands = [calls[i][0][0] for i in range(3)]\n        self.assertEqual(set([Controller.Command.Action.QUEUE]*3), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\"}, {c.filename for c in commands})\n\n    def test_non_matches(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"Two\", True)\n        file_one.remote_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_matching_is_case_insensitive(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"FiLe.oNe\"))\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"FiLe.oNe\", True)\n        file_one.remote_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"FiLe.oNe\", command.filename)\n\n    def test_partial_matches(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"file\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"fileone\", True)  # at start\n        file_one.remote_size = 100\n        file_two = ModelFile(\"twofile\", True)  # at end\n        file_two.remote_size = 100\n        file_three = ModelFile(\"onefiletwo\", True)  # in middle\n        file_three.remote_size = 100\n        file_four = ModelFile(\"fionele\", True)  # no match\n        file_four.remote_size = 100\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        self.model_listener.file_added(file_four)\n        auto_queue.process()\n        self.assertEqual(3, self.controller.queue_command.call_count)\n        commands = [call[0][0] for call in self.controller.queue_command.call_args_list]\n        commands_dict = {command.filename: command for command in commands}\n        self.assertTrue(\"fileone\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"fileone\"].action)\n        self.assertTrue(\"twofile\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"twofile\"].action)\n        self.assertTrue(\"onefiletwo\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"onefiletwo\"].action)\n\n    def test_wildcard_at_start_matches(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"*.mkv\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One.mkv\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two.jpg\", True)\n        file_two.remote_size = 100\n        file_three = ModelFile(\".mkvFile.Three\", True)\n        file_three.remote_size = 100\n        file_four = ModelFile(\"FileFour.mkv\", True)\n        file_four.remote_size = 100\n        file_five = ModelFile(\"FileFive.mkv.more\", True)\n        file_five.remote_size = 100\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        self.model_listener.file_added(file_four)\n        self.model_listener.file_added(file_five)\n        auto_queue.process()\n        self.assertEqual(2, self.controller.queue_command.call_count)\n        commands = [call[0][0] for call in self.controller.queue_command.call_args_list]\n        commands_dict = {command.filename: command for command in commands}\n        self.assertTrue(\"File.One.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"File.One.mkv\"].action)\n        self.assertTrue(\"FileFour.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFour.mkv\"].action)\n\n    def test_wildcard_at_end_matches(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File*\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One.mkv\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two.jpg\", True)\n        file_two.remote_size = 100\n        file_three = ModelFile(\".mkvFile.Three\", True)\n        file_three.remote_size = 100\n        file_four = ModelFile(\"FileFour.mkv\", True)\n        file_four.remote_size = 100\n        file_five = ModelFile(\"FileFive.mkv.more\", True)\n        file_five.remote_size = 100\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        self.model_listener.file_added(file_four)\n        self.model_listener.file_added(file_five)\n        auto_queue.process()\n        self.assertEqual(4, self.controller.queue_command.call_count)\n        commands = [call[0][0] for call in self.controller.queue_command.call_args_list]\n        commands_dict = {command.filename: command for command in commands}\n        self.assertTrue(\"File.One.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"File.One.mkv\"].action)\n        self.assertTrue(\"File.Two.jpg\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"File.Two.jpg\"].action)\n        self.assertTrue(\"FileFour.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFour.mkv\"].action)\n        self.assertTrue(\"FileFive.mkv.more\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFive.mkv.more\"].action)\n\n    def test_wildcard_in_middle_matches(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"*mkv*\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One.mkv\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two.jpg\", True)\n        file_two.remote_size = 100\n        file_three = ModelFile(\".mkvFile.Three\", True)\n        file_three.remote_size = 100\n        file_four = ModelFile(\"FileFour.mkv\", True)\n        file_four.remote_size = 100\n        file_five = ModelFile(\"FileFive.mkv.more\", True)\n        file_five.remote_size = 100\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        self.model_listener.file_added(file_four)\n        self.model_listener.file_added(file_five)\n        auto_queue.process()\n        self.assertEqual(4, self.controller.queue_command.call_count)\n        commands = [call[0][0] for call in self.controller.queue_command.call_args_list]\n        commands_dict = {command.filename: command for command in commands}\n        self.assertTrue(\"File.One.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"File.One.mkv\"].action)\n        self.assertTrue(\".mkvFile.Three\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\".mkvFile.Three\"].action)\n        self.assertTrue(\"FileFour.mkv\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFour.mkv\"].action)\n        self.assertTrue(\"FileFive.mkv.more\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFive.mkv.more\"].action)\n\n    def test_wildcard_matches_are_case_insensitive(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"*.mkv\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One.mKV\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two.jpg\", True)\n        file_two.remote_size = 100\n        file_three = ModelFile(\".mkvFile.Three\", True)\n        file_three.remote_size = 100\n        file_four = ModelFile(\"FileFour.MKV\", True)\n        file_four.remote_size = 100\n        file_five = ModelFile(\"FileFive.mkv.more\", True)\n        file_five.remote_size = 100\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        self.model_listener.file_added(file_four)\n        self.model_listener.file_added(file_five)\n        auto_queue.process()\n        self.assertEqual(2, self.controller.queue_command.call_count)\n        commands = [call[0][0] for call in self.controller.queue_command.call_args_list]\n        commands_dict = {command.filename: command for command in commands}\n        self.assertTrue(\"File.One.mKV\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"File.One.mKV\"].action)\n        self.assertTrue(\"FileFour.MKV\" in commands_dict)\n        self.assertEqual(Controller.Command.Action.QUEUE, commands_dict[\"FileFour.MKV\"].action)\n\n    def test_matching_local_files_are_not_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = None\n        file_one.local_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_matching_deleted_files_are_not_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.local_size = None\n        file_one.state = ModelFile.State.DELETED\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_matching_downloading_files_are_not_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.local_size = 0\n        file_one.state = ModelFile.State.DOWNLOADING\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.remote_size = 100\n        file_one_new.local_size = 50\n        file_one_new.state = ModelFile.State.DOWNLOADING\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_matching_queued_files_are_not_queued(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.state = ModelFile.State.QUEUED\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_matching_downloaded_files_are_not_queued(self):\n        # Disable auto-extract\n        self.context.config.autoqueue.auto_extract = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_auto_queued_file_not_re_queued_after_stopping(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n        file_one_updated = ModelFile(\"File.One\", True)\n        file_one_updated.remote_size = 100\n        file_one_updated.local_size = 50\n        self.model_listener.file_updated(file_one, file_one_updated)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n\n    def test_partial_file_is_auto_queued_after_remote_discovery(self):\n        # Test that a partial local file is auto-queued when discovered on remote some time later\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        # Local discovery\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # Remote discovery\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.local_size = 100\n        file_one_new.remote_size = 200\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n    def test_new_matching_pattern_queues_existing_files(self):\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.Two\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.Three\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_new_matching_pattern_doesnt_queue_local_file(self):\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n\n        self.initial_model = [file_one]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_removed_pattern_doesnt_queue_new_file(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"Two\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.remove_pattern(AutoQueuePattern(pattern=\"Two\"))\n\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 100\n        self.model_listener.file_added(file_two)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_adding_then_removing_pattern_doesnt_queue_existing_file(self):\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.remove_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_downloaded_file_with_changed_remote_size_is_queued(self):\n        # Disable auto-extract\n        self.context.config.autoqueue.auto_extract = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        file_one_updated = ModelFile(\"File.One\", True)\n        file_one_updated.remote_size = 200\n        file_one_updated.local_size = 100\n        file_one_updated.state = ModelFile.State.DEFAULT\n        self.model_listener.file_updated(file_one, file_one_updated)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n    def test_no_files_are_queued_when_disabled(self):\n        self.context.config.autoqueue.enabled = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # First with patterns_only ON\n        self.context.config.autoqueue.patterns_only = True\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # Second with patterns_only OFF\n        self.context.config.autoqueue.patterns_only = False\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_all_files_are_queued_when_patterns_only_disabled(self):\n        self.context.config.autoqueue.patterns_only = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(5, len(calls))\n        commands = [calls[i][0][0] for i in range(5)]\n        self.assertEqual(set([Controller.Command.Action.QUEUE]*5), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\", \"File.Four\", \"File.Five\"},\n                         {c.filename for c in commands})\n\n    def test_all_files_are_queued_when_patterns_only_disabled_and_no_patterns_exist(self):\n        self.context.config.autoqueue.patterns_only = False\n\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.remote_size = 200\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.remote_size = 300\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.remote_size = 400\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.remote_size = 500\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(5, len(calls))\n        commands = [calls[i][0][0] for i in range(5)]\n        self.assertEqual(set([Controller.Command.Action.QUEUE]*5), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\", \"File.Four\", \"File.Five\"},\n                         {c.filename for c in commands})\n\n    def test_matching_new_files_are_extracted(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.local_size = 100\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.local_size = 200\n        file_two.is_extractable = True\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_three.local_size = 300\n        file_three.is_extractable = True\n\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n        self.model_listener.file_added(file_two)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.Two\", command.filename)\n\n        self.model_listener.file_added(file_three)\n        auto_queue.process()\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.Three\", command.filename)\n\n        # All at once\n        self.model_listener.file_added(file_one)\n        self.model_listener.file_added(file_two)\n        self.model_listener.file_added(file_three)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list[-3:]\n        commands = [calls[i][0][0] for i in range(3)]\n        self.assertEqual(set([Controller.Command.Action.EXTRACT]*3), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\"}, {c.filename for c in commands})\n\n    def test_matching_initial_files_are_extracted(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.local_size = 100\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.local_size = 200\n        file_two.is_extractable = True\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_three.local_size = 300\n        file_three.is_extractable = True\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_four.local_size = 400\n        file_four.is_extractable = True\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.state = ModelFile.State.DOWNLOADED\n        file_five.local_size = 500\n        file_five.is_extractable = True\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(3, len(calls))\n        commands = [calls[i][0][0] for i in range(3)]\n        self.assertEqual(set([Controller.Command.Action.EXTRACT]*3), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\"}, {c.filename for c in commands})\n\n    def test_new_matching_pattern_extracts_existing_files(self):\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.is_extractable = True\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.local_size = 300\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_three.is_extractable = True\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.local_size = 400\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_four.is_extractable = True\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.local_size = 500\n        file_five.state = ModelFile.State.DOWNLOADED\n        file_five.is_extractable = True\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.Two\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.Three\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_non_extractable_files_are_not_extracted(self):\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.is_extractable = False\n\n        self.initial_model = [file_one, file_two]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_no_files_are_extracted_when_disabled(self):\n        self.context.config.autoqueue.enabled = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.local_size = 300\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.local_size = 400\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.local_size = 500\n        file_five.state = ModelFile.State.DOWNLOADED\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # First with patterns_only ON\n        self.context.config.autoqueue.patterns_only = True\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # Second with patterns_only OFF\n        self.context.config.autoqueue.patterns_only = False\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_no_files_are_extracted_when_auto_extract_disabled(self):\n        self.context.config.autoqueue.enabled = True\n        self.context.config.autoqueue.auto_extract = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.local_size = 300\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.local_size = 400\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.local_size = 500\n        file_five.state = ModelFile.State.DOWNLOADED\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # First with patterns_only ON\n        self.context.config.autoqueue.patterns_only = True\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # Second with patterns_only OFF\n        self.context.config.autoqueue.patterns_only = False\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_all_files_are_extracted_when_patterns_only_disabled(self):\n        self.context.config.autoqueue.patterns_only = False\n\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Two\"))\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.Three\"))\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.is_extractable = True\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.local_size = 300\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_three.is_extractable = True\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.local_size = 400\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_four.is_extractable = True\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.local_size = 500\n        file_five.state = ModelFile.State.DOWNLOADED\n        file_five.is_extractable = True\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(5, len(calls))\n        commands = [calls[i][0][0] for i in range(5)]\n        self.assertEqual(set([Controller.Command.Action.EXTRACT]*5), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\", \"File.Four\", \"File.Five\"},\n                         {c.filename for c in commands})\n\n    def test_all_files_are_extracted_when_patterns_only_disabled_and_no_patterns_exist(self):\n        self.context.config.autoqueue.patterns_only = False\n\n        persist = AutoQueuePersist()\n\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        file_two = ModelFile(\"File.Two\", True)\n        file_two.local_size = 200\n        file_two.state = ModelFile.State.DOWNLOADED\n        file_two.is_extractable = True\n        file_three = ModelFile(\"File.Three\", True)\n        file_three.local_size = 300\n        file_three.state = ModelFile.State.DOWNLOADED\n        file_three.is_extractable = True\n        file_four = ModelFile(\"File.Four\", True)\n        file_four.local_size = 400\n        file_four.state = ModelFile.State.DOWNLOADED\n        file_four.is_extractable = True\n        file_five = ModelFile(\"File.Five\", True)\n        file_five.local_size = 500\n        file_five.state = ModelFile.State.DOWNLOADED\n        file_five.is_extractable = True\n\n        self.initial_model = [file_one, file_two, file_three, file_four, file_five]\n\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n        auto_queue.process()\n        calls = self.controller.queue_command.call_args_list\n        self.assertEqual(5, len(calls))\n        commands = [calls[i][0][0] for i in range(5)]\n        self.assertEqual(set([Controller.Command.Action.EXTRACT]*5), {c.action for c in commands})\n        self.assertEqual({\"File.One\", \"File.Two\", \"File.Three\", \"File.Four\", \"File.Five\"},\n                         {c.filename for c in commands})\n\n    def test_file_is_extracted_after_finishing_download(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        # File exists remotely and is auto-queued\n        file_one = ModelFile(\"File.One\", True)\n        file_one.remote_size = 100\n        file_one.is_extractable = True\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.QUEUE, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        # File starts downloading\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.remote_size = 100\n        file_one_new.local_size = 50\n        file_one_new.state = ModelFile.State.DOWNLOADING\n        file_one_new.is_extractable = True\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # File finishes downloading\n        file_one = file_one_new\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.remote_size = 100\n        file_one_new.local_size = 100\n        file_one_new.state = ModelFile.State.DOWNLOADED\n        file_one_new.is_extractable = True\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n\n    def test_downloaded_file_is_NOT_re_extracted_after_modified(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        # File is auto-extracted\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        # File is modified\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.local_size = 101\n        file_one_new.state = ModelFile.State.DOWNLOADED\n        file_one_new.is_extractable = True\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n    def test_downloaded_file_is_NOT_re_extracted_after_failed_extraction(self):\n        persist = AutoQueuePersist()\n        persist.add_pattern(AutoQueuePattern(pattern=\"File.One\"))\n        # noinspection PyTypeChecker\n        auto_queue = AutoQueue(self.context, persist, self.controller)\n\n        # File is auto-extracted\n        file_one = ModelFile(\"File.One\", True)\n        file_one.local_size = 100\n        file_one.state = ModelFile.State.DOWNLOADED\n        file_one.is_extractable = True\n        self.model_listener.file_added(file_one)\n        auto_queue.process()\n        self.controller.queue_command.assert_called_once_with(unittest.mock.ANY)\n        command = self.controller.queue_command.call_args[0][0]\n        self.assertEqual(Controller.Command.Action.EXTRACT, command.action)\n        self.assertEqual(\"File.One\", command.filename)\n        self.controller.queue_command.reset_mock()\n\n        # File is extracting\n        file_one_new = ModelFile(\"File.One\", True)\n        file_one_new.local_size = 101\n        file_one_new.state = ModelFile.State.EXTRACTING\n        file_one_new.is_extractable = True\n        self.model_listener.file_updated(file_one, file_one_new)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n\n        # Extraction fails and file goes back to DOWNLOADED\n        file_one_newer = ModelFile(\"File.One\", True)\n        file_one_newer.local_size = 101\n        file_one_newer.state = ModelFile.State.DOWNLOADED\n        file_one_newer.is_extractable = True\n        self.model_listener.file_updated(file_one_new, file_one_newer)\n        auto_queue.process()\n        self.controller.queue_command.assert_not_called()\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_controller_persist.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\n\nfrom common import PersistError\nfrom controller import ControllerPersist\n\n\nclass TestControllerPersist(unittest.TestCase):\n    def test_from_str(self):\n        content = \"\"\"\n        {\n            \"downloaded\": [\"one\", \"two\", \"th ree\", \"fo.ur\"],\n            \"extracted\": [\"fi\\\\\"ve\", \"si@x\", \"se\\\\\\\\ven\", \"ei-ght\"]\n        }\n        \"\"\"\n        persist = ControllerPersist.from_str(content)\n        golden_downloaded = {\"one\", \"two\", \"th ree\", \"fo.ur\"}\n        golden_extracted = {\"fi\\\"ve\", \"si@x\", \"se\\\\ven\", \"ei-ght\"}\n        self.assertEqual(golden_downloaded, persist.downloaded_file_names)\n        self.assertEqual(golden_extracted, persist.extracted_file_names)\n\n    def test_to_str(self):\n        persist = ControllerPersist()\n        persist.downloaded_file_names.add(\"one\")\n        persist.downloaded_file_names.add(\"two\")\n        persist.downloaded_file_names.add(\"th ree\")\n        persist.downloaded_file_names.add(\"fo.ur\")\n        persist.extracted_file_names.add(\"fi\\\"ve\")\n        persist.extracted_file_names.add(\"si@x\")\n        persist.extracted_file_names.add(\"se\\\\ven\")\n        persist.extracted_file_names.add(\"ei-ght\")\n        dct = json.loads(persist.to_str())\n        self.assertTrue(\"downloaded\" in dct)\n        self.assertEqual({\"one\", \"two\", \"th ree\", \"fo.ur\"}, set(dct[\"downloaded\"]))\n        self.assertTrue(\"extracted\" in dct)\n        self.assertEqual({\"fi\\\"ve\", \"si@x\", \"se\\\\ven\", \"ei-ght\"}, set(dct[\"extracted\"]))\n\n    def test_to_and_from_str(self):\n        persist = ControllerPersist()\n        persist.downloaded_file_names.add(\"one\")\n        persist.downloaded_file_names.add(\"two\")\n        persist.downloaded_file_names.add(\"th ree\")\n        persist.downloaded_file_names.add(\"fo.ur\")\n        persist.extracted_file_names.add(\"fi\\\"ve\")\n        persist.extracted_file_names.add(\"si@x\")\n        persist.extracted_file_names.add(\"se\\\\ven\")\n        persist.extracted_file_names.add(\"ei-ght\")\n\n        persist_actual = ControllerPersist.from_str(persist.to_str())\n        self.assertEqual(\n            persist.downloaded_file_names,\n            persist_actual.downloaded_file_names\n        )\n        self.assertEqual(\n            persist.extracted_file_names,\n            persist_actual.extracted_file_names\n        )\n\n    def test_persist_read_error(self):\n        # bad pattern\n        content = \"\"\"\n        {\n            \"downloaded\": [bad string],\n            \"extracted\": []\n        }\n        \"\"\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n        content = \"\"\"\n        {\n            \"downloaded\": [],\n            \"extracted\": [bad string]\n        }\n        \"\"\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n\n        # empty json\n        content = \"\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n\n        # missing keys\n        content = \"\"\"\n        {\n            \"downloaded\": []\n        }\n        \"\"\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n        content = \"\"\"\n        {\n            \"extracted\": []\n        }\n        \"\"\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n\n        # malformed\n        content = \"{\"\n        with self.assertRaises(PersistError):\n            ControllerPersist.from_str(content)\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_extract/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_extract/test_dispatch.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport os\nfrom unittest.mock import patch, MagicMock, call\nimport time\nimport logging\nimport sys\n\nimport timeout_decorator\n\nfrom common import overrides\nfrom model import ModelFile\nfrom controller.extract import ExtractDispatch, ExtractDispatchError, ExtractListener, \\\n                                ExtractError, ExtractStatus\n\n\nclass DummyExtractListener(ExtractListener):\n    @overrides(ExtractListener)\n    def extract_completed(self, name: str, is_dir: bool):\n        pass\n\n    @overrides(ExtractListener)\n    def extract_failed(self, name: str, is_dir: bool):\n        pass\n\n\nclass TestExtractDispatch(unittest.TestCase):\n    def setUp(self):\n        extract_patcher = patch('controller.extract.dispatch.Extract')\n        self.addCleanup(extract_patcher.stop)\n        mock_extract_module = extract_patcher.start()\n        self.mock_is_archive = mock_extract_module.is_archive\n        self.mock_extract_archive = mock_extract_module.extract_archive\n\n        self.out_dir_path = os.path.join(\"out\", \"dir\")\n        self.local_path = os.path.join(\"local\", \"path\")\n        self.dispatch = ExtractDispatch(\n            out_dir_path=self.out_dir_path,\n            local_path=self.local_path\n        )\n\n        self.listener = DummyExtractListener()\n        self.listener.extract_completed = MagicMock()\n        self.listener.extract_failed = MagicMock()\n\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        self.dispatch.start()\n\n    @timeout_decorator.timeout(2)\n    def tearDown(self):\n        if self.dispatch:\n            self.dispatch.stop()\n\n    def test_extract_single_raises_error_on_remote_only_file(self):\n        mf = ModelFile(\"aaa\", False)\n        mf.local_size = None\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(mf)\n        self.assertTrue(str(ctx.exception).startswith(\"File does not exist locally\"))\n\n        mf = ModelFile(\"aaa\", False)\n        mf.local_size = 0\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(mf)\n        self.assertTrue(str(ctx.exception).startswith(\"File does not exist locally\"))\n\n    def test_extract_single_raises_error_on_bad_archive(self):\n        self.mock_is_archive.return_value = False\n\n        mf = ModelFile(\"aaa\", False)\n        mf.local_size = 100\n\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(mf)\n        self.assertTrue(str(ctx.exception).startswith(\"File is not an archive\"))\n        self.mock_is_archive.assert_called_once_with(os.path.join(self.local_path, mf.name))\n\n    @timeout_decorator.timeout(2)\n    def test_extract_single(self):\n        self.mock_is_archive.return_value = True\n\n        mf = ModelFile(\"aaa\", False)\n        mf.local_size = 100\n\n        self.dispatch.extract(mf)\n\n        while self.mock_extract_archive.call_count < 1:\n            pass\n        self.mock_extract_archive.assert_called_once_with(\n            archive_path=os.path.join(self.local_path, \"aaa\"),\n            out_dir_path=self.out_dir_path\n        )\n\n    @timeout_decorator.timeout(2)\n    def test_extract_maintains_order(self):\n        self.mock_is_archive.return_value = True\n\n        mf1 = ModelFile(\"aaa\", False)\n        mf1.local_size = 100\n        mf2 = ModelFile(\"bbb\", False)\n        mf2.local_size = 100\n        mf3 = ModelFile(\"ccc\", False)\n        mf3.local_size = 100\n\n        self.dispatch.extract(mf1)\n        self.dispatch.extract(mf2)\n        self.dispatch.extract(mf3)\n\n        while self.mock_extract_archive.call_count < 3:\n            pass\n        self.assertEqual(3, self.mock_extract_archive.call_count)\n        args_list = self.mock_extract_archive.call_args_list\n        self.assertEqual(args_list, [\n            call(\n                archive_path=os.path.join(self.local_path, \"aaa\"),\n                out_dir_path=self.out_dir_path\n            ),\n            call(\n                archive_path=os.path.join(self.local_path, \"bbb\"),\n                out_dir_path=self.out_dir_path\n            ),\n            call(\n                archive_path=os.path.join(self.local_path, \"ccc\"),\n                out_dir_path=self.out_dir_path\n            )\n        ])\n\n    @timeout_decorator.timeout(2)\n    def test_extract_calls_listener_on_completed(self):\n        self.mock_is_archive.return_value = True\n\n        mf1 = ModelFile(\"aaa\", False)\n        mf1.local_size = 100\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(mf1)\n\n        while self.mock_extract_archive.call_count < 1 \\\n                or self.listener.extract_completed.call_count < 1:\n            pass\n        self.assertEqual(1, self.mock_extract_archive.call_count)\n        self.listener.extract_completed.assert_called_once_with(\"aaa\", False)\n        self.listener.extract_failed.assert_not_called()\n\n    @timeout_decorator.timeout(2)\n    def test_extract_calls_listener_on_failed(self):\n        self.mock_is_archive.return_value = True\n\n        # noinspection PyUnusedLocal\n        def _extract_archive(**kwargs):\n            raise ExtractError()\n        self.mock_extract_archive.side_effect = _extract_archive\n\n        mf1 = ModelFile(\"aaa\", False)\n        mf1.local_size = 100\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(mf1)\n\n        while self.mock_extract_archive.call_count < 1 \\\n                or self.listener.extract_failed.call_count < 1:\n            pass\n        self.assertEqual(1, self.mock_extract_archive.call_count)\n        self.listener.extract_completed.assert_not_called()\n        self.listener.extract_failed.assert_called_once_with(\"aaa\", False)\n\n    @timeout_decorator.timeout(5)\n    def test_extract_calls_listeners_in_correct_sequence(self):\n        self.mock_is_archive.return_value = True\n        self.count = 0\n\n        # noinspection PyUnusedLocal\n        def _extract_archive(**kwargs):\n            # raise error for first and third extractions\n            self.count += 1\n            if self.count in (1, 3):\n                raise ExtractError()\n        self.mock_extract_archive.side_effect = _extract_archive\n\n        mf1 = ModelFile(\"aaa\", False)\n        mf1.local_size = 100\n        mf2 = ModelFile(\"bbb\", False)\n        mf2.local_size = 100\n        mf3 = ModelFile(\"ccc\", False)\n        mf3.local_size = 100\n\n        listener_calls = []\n\n        def _completed(name, is_dir):\n            listener_calls.append((True, name, is_dir))\n\n        def _failed(name, is_dir):\n            listener_calls.append((False, name, is_dir))\n\n        self.listener.extract_completed.side_effect = _completed\n        self.listener.extract_failed.side_effect = _failed\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(mf1)\n        self.dispatch.extract(mf2)\n        self.dispatch.extract(mf3)\n\n        while self.mock_extract_archive.call_count < 3 \\\n                or self.listener.extract_failed.call_count < 2 \\\n                or self.listener.extract_completed.call_count < 1:\n            pass\n        self.assertEqual(3, self.mock_extract_archive.call_count)\n        self.assertEqual(\n            [(False, \"aaa\", False), (True, \"bbb\", False), (False, \"ccc\", False)],\n            listener_calls\n        )\n\n    @timeout_decorator.timeout(2)\n    def test_extract_skips_remaining_on_shutdown(self):\n        # Send two extract commands\n        # Call shutdown after first one runs\n        # Check that second command did not run\n        self.mock_is_archive.return_value = True\n\n        self.call_stop = False\n\n        def _extract_archive(**kwargs):\n            print(kwargs)\n            self.call_stop = True\n            time.sleep(0.5)  # wait a bit so shutdown is called\n\n        self.mock_extract_archive.side_effect = _extract_archive\n\n        mf1 = ModelFile(\"aaa\", False)\n        mf1.local_size = 100\n        mf2 = ModelFile(\"bbb\", False)\n        mf2.local_size = 100\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(mf1)\n        self.dispatch.extract(mf2)\n\n        while not self.call_stop:\n            pass\n        self.dispatch.stop()\n\n        while self.mock_extract_archive.call_count < 1 \\\n                or self.listener.extract_completed.call_count < 1:\n            pass\n        self.assertEqual(1, self.mock_extract_archive.call_count)\n        self.listener.extract_completed.assert_called_once_with(\"aaa\", False)\n        self.listener.extract_failed.assert_not_called()\n\n    def test_extract_dir_raises_error_on_empty_dir(self):\n        mf = ModelFile(\"aaa\", True)\n\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(mf)\n        self.assertTrue(str(ctx.exception).startswith(\"Directory does not contain any archives\"))\n\n    def test_extract_dir_raises_error_on_no_archives(self):\n        self.mock_is_archive.return_value = False\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 100\n        aa = ModelFile(\"aa\", False)\n        aa.local_size = 50\n        a.add_child(aa)\n        ab = ModelFile(\"ab\", False)\n        ab.local_size = 50\n        a.add_child(ab)\n\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(a)\n        self.assertTrue(str(ctx.exception).startswith(\"Directory does not contain any archives\"))\n\n    def test_extract_dir_raises_error_on_no_local_files(self):\n        self.mock_is_archive.return_value = True\n\n        a = ModelFile(\"a\", True)\n        a.remote_size = 100\n        aa = ModelFile(\"aa\", False)\n        aa.remote_size = 50\n        a.add_child(aa)\n        ab = ModelFile(\"ab\", False)\n        ab.remote_size = 50\n        a.add_child(ab)\n\n        with self.assertRaises(ExtractDispatchError) as ctx:\n            self.dispatch.extract(a)\n        self.assertTrue(str(ctx.exception).startswith(\"Directory does not contain any archives\"))\n\n    # noinspection SpellCheckingInspection\n    @timeout_decorator.timeout(2)\n    def test_extract_dir(self):\n        self.mock_is_archive.return_value = True\n        self.actual_calls = set()\n\n        def _extract(archive_path: str, out_dir_path: str):\n            self.actual_calls.add((archive_path, out_dir_path))\n        self.mock_extract_archive.side_effect = _extract\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 500\n        aa = ModelFile(\"aa\", True)\n        aa.local_size = 300\n        a.add_child(aa)\n        aaa = ModelFile(\"aaa\", False)\n        aaa.local_size = 100\n        aa.add_child(aaa)\n        aab = ModelFile(\"aab\", False)\n        aab.local_size = 100\n        aa.add_child(aab)\n        aac = ModelFile(\"aac\", True)\n        aac.local_size = 100\n        aa.add_child(aac)\n        aaca = ModelFile(\"aaca\", False)\n        aaca.local_size = 100\n        aac.add_child(aaca)\n        ab = ModelFile(\"ab\", True)\n        ab.local_size = 100\n        a.add_child(ab)\n        aba = ModelFile(\"aba\", False)\n        aba.local_size = 100\n        ab.add_child(aba)\n        ac = ModelFile(\"ac\", False)\n        ac.local_size = 100\n        a.add_child(ac)\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        while self.listener.extract_completed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_called_once_with(\"a\", True)\n\n        golden_calls = {\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aaa\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aab\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aac\", \"aaca\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\", \"aac\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ab\", \"aba\"),\n                os.path.join(self.out_dir_path, \"a\", \"ab\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ac\"),\n                os.path.join(self.out_dir_path, \"a\")\n            ),\n        }\n        self.assertEqual(5, self.mock_extract_archive.call_count)\n        self.assertEqual(golden_calls, self.actual_calls)\n\n    # noinspection SpellCheckingInspection\n    @timeout_decorator.timeout(2)\n    def test_extract_dir_skips_remote_files(self):\n        self.mock_is_archive.return_value = True\n        self.actual_calls = set()\n\n        def _extract(archive_path: str, out_dir_path: str):\n            self.actual_calls.add((archive_path, out_dir_path))\n        self.mock_extract_archive.side_effect = _extract\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 500\n        aa = ModelFile(\"aa\", True)\n        aa.local_size = 300\n        a.add_child(aa)\n        aaa = ModelFile(\"aaa\", False)\n        aaa.local_size = 100\n        aa.add_child(aaa)\n        aab = ModelFile(\"aab\", False)\n        aab.remote_size = 100\n        aa.add_child(aab)\n        aac = ModelFile(\"aac\", True)\n        aac.local_size = 100\n        aa.add_child(aac)\n        aaca = ModelFile(\"aaca\", False)\n        aaca.local_size = 100\n        aac.add_child(aaca)\n        ab = ModelFile(\"ab\", True)\n        ab.local_size = 100\n        a.add_child(ab)\n        aba = ModelFile(\"aba\", False)\n        aba.local_size = 100\n        ab.add_child(aba)\n        ac = ModelFile(\"ac\", False)\n        ac.remote_size = 100\n        a.add_child(ac)\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        while self.listener.extract_completed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_called_once_with(\"a\", True)\n\n        golden_calls = {\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aaa\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aac\", \"aaca\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\", \"aac\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ab\", \"aba\"),\n                os.path.join(self.out_dir_path, \"a\", \"ab\")\n            ),\n        }\n        self.assertEqual(3, self.mock_extract_archive.call_count)\n        self.assertEqual(golden_calls, self.actual_calls)\n\n    # noinspection SpellCheckingInspection\n    @timeout_decorator.timeout(2)\n    def test_extract_dir_skips_non_archive_files(self):\n        # noinspection SpellCheckingInspection\n        def _is_archive(archive_path: str):\n            return archive_path in (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aaa\"),\n                os.path.join(self.local_path, \"a\", \"aa\", \"aac\", \"aaca\"),\n                os.path.join(self.local_path, \"a\", \"ab\", \"aba\")\n            )\n        self.mock_is_archive.side_effect = _is_archive\n        self.actual_calls = set()\n\n        def _extract(archive_path: str, out_dir_path: str):\n            self.actual_calls.add((archive_path, out_dir_path))\n        self.mock_extract_archive.side_effect = _extract\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 500\n        aa = ModelFile(\"aa\", True)\n        aa.local_size = 300\n        a.add_child(aa)\n        aaa = ModelFile(\"aaa\", False)\n        aaa.local_size = 100\n        aa.add_child(aaa)\n        aab = ModelFile(\"aab\", False)\n        aab.local_size = 100\n        aa.add_child(aab)\n        aac = ModelFile(\"aac\", True)\n        aac.local_size = 100\n        aa.add_child(aac)\n        aaca = ModelFile(\"aaca\", False)\n        aaca.local_size = 100\n        aac.add_child(aaca)\n        ab = ModelFile(\"ab\", True)\n        ab.local_size = 100\n        a.add_child(ab)\n        aba = ModelFile(\"aba\", False)\n        aba.local_size = 100\n        ab.add_child(aba)\n        ac = ModelFile(\"ac\", False)\n        ac.local_size = 100\n        a.add_child(ac)\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        while self.listener.extract_completed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_called_once_with(\"a\", True)\n\n        golden_calls = {\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aaa\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"aa\", \"aac\", \"aaca\"),\n                os.path.join(self.out_dir_path, \"a\", \"aa\", \"aac\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ab\", \"aba\"),\n                os.path.join(self.out_dir_path, \"a\", \"ab\")\n            ),\n        }\n        self.assertEqual(3, self.mock_extract_archive.call_count)\n        self.assertEqual(golden_calls, self.actual_calls)\n\n    # noinspection SpellCheckingInspection\n    @timeout_decorator.timeout(2)\n    def test_extract_dir_does_not_extract_split_rar_files(self):\n        self.mock_is_archive.return_value = True\n        self.actual_calls = set()\n\n        def _extract(archive_path: str, out_dir_path: str):\n            self.actual_calls.add((archive_path, out_dir_path))\n        self.mock_extract_archive.side_effect = _extract\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 80\n        aa = ModelFile(\"aa.rar\", False)\n        aa.local_size = 10\n        a.add_child(aa)\n        aa0 = ModelFile(\"aa.r00\", False)\n        aa0.local_size = 10\n        a.add_child(aa0)\n        aa1 = ModelFile(\"aa.r01\", False)\n        aa1.local_size = 10\n        a.add_child(aa1)\n        aa2 = ModelFile(\"aa.r02\", False)\n        aa2.local_size = 10\n        a.add_child(aa2)\n        aa15 = ModelFile(\"aa.r15\", False)\n        aa15.local_size = 10\n        a.add_child(aa15)\n        ab = ModelFile(\"ab.rar\", False)\n        ab.local_size = 10\n        a.add_child(ab)\n        ab0 = ModelFile(\"ab.r000\", False)\n        ab0.local_size = 10\n        a.add_child(ab0)\n        ab1 = ModelFile(\"ab.r001\", False)\n        ab1.local_size = 10\n        a.add_child(ab1)\n        ac = ModelFile(\"ac\", True)\n        ac.local_size = 20\n        a.add_child(ac)\n        aca = ModelFile(\"aca\", True)\n        aca.local_size = 20\n        ac.add_child(aca)\n        acaa = ModelFile(\"acaa.rar\", False)\n        acaa.local_size = 10\n        aca.add_child(acaa)\n        acaa0 = ModelFile(\"acaa.r00\", False)\n        acaa0.local_size = 10\n        aca.add_child(acaa0)\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        while self.listener.extract_completed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_called_once_with(\"a\", True)\n\n        golden_calls = {\n            (\n                os.path.join(self.local_path, \"a\", \"aa.rar\"),\n                os.path.join(self.out_dir_path, \"a\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ab.rar\"),\n                os.path.join(self.out_dir_path, \"a\")\n            ),\n            (\n                os.path.join(self.local_path, \"a\", \"ac\", \"aca\", \"acaa.rar\"),\n                os.path.join(self.out_dir_path, \"a\", \"ac\", \"aca\")\n            ),\n        }\n        self.assertEqual(3, self.mock_extract_archive.call_count)\n        self.assertEqual(golden_calls, self.actual_calls)\n\n    @timeout_decorator.timeout(2)\n    def test_extract_dir_exits_command_early_on_shutdown(self):\n        # Send extract dir command with two archives\n        # Call shutdown after first extract but before second\n        # Verify second extract is not called\n        self.mock_is_archive.return_value = True\n\n        self.call_stop = False\n\n        def _extract_archive(**kwargs):\n            print(kwargs)\n            self.call_stop = True\n            time.sleep(0.5)  # wait a bit so shutdown is called\n\n        self.mock_extract_archive.side_effect = _extract_archive\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 200\n        aa = ModelFile(\"aa\", False)\n        aa.local_size = 100\n        a.add_child(aa)\n        ab = ModelFile(\"ab\", False)\n        ab.local_size = 100\n        a.add_child(ab)\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n\n        while not self.call_stop:\n            pass\n        self.dispatch.stop()\n\n        while self.mock_extract_archive.call_count < 1 \\\n                or self.listener.extract_failed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_not_called()\n        self.listener.extract_failed.assert_called_once_with(\"a\", True)\n        self.assertEqual(1, self.mock_extract_archive.call_count)\n\n    @timeout_decorator.timeout(2)\n    def test_status(self):\n        self.mock_is_archive.return_value = True\n        self.send_count = 0\n        self.rx_count = 0\n\n        # noinspection PyUnusedLocal\n        def _extract(**kwargs):\n            # barrier implementation\n            while self.send_count <= self.rx_count:\n                pass\n            self.rx_count += 1\n        self.mock_extract_archive.side_effect = _extract\n\n        a = ModelFile(\"a\", True)\n        a.local_size = 200\n        aa = ModelFile(\"aa\", False)\n        aa.local_size = 100\n        a.add_child(aa)\n        ab = ModelFile(\"ab\", False)\n        ab.local_size = 100\n        a.add_child(ab)\n        b = ModelFile(\"b\", True)\n        b.local_size = 100\n        ba = ModelFile(\"ba\", False)\n        ba.local_size = 100\n        b.add_child(ba)\n        c = ModelFile(\"c\", False)\n        c.local_size = 100\n\n        # Initial status should be empty\n        status = self.dispatch.status()\n        self.assertEqual(0, len(status))\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        self.dispatch.extract(b)\n        self.dispatch.extract(c)\n\n        status = self.dispatch.status()\n        self.assertEqual(3, len(status))\n        self.assertEqual(\"a\", status[0].name)\n        self.assertEqual(True, status[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[0].state)\n        self.assertEqual(\"b\", status[1].name)\n        self.assertEqual(True, status[1].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[1].state)\n        self.assertEqual(\"c\", status[2].name)\n        self.assertEqual(False, status[2].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[2].state)\n\n        # Wait for first dir to start extracting\n        self.send_count = 1\n        while self.rx_count < self.send_count:\n            pass\n\n        status = self.dispatch.status()\n        self.assertEqual(3, len(status))\n        self.assertEqual(\"a\", status[0].name)\n        self.assertEqual(True, status[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[0].state)\n        self.assertEqual(\"b\", status[1].name)\n        self.assertEqual(True, status[1].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[1].state)\n        self.assertEqual(\"c\", status[2].name)\n        self.assertEqual(False, status[2].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[2].state)\n\n        # After first directory finishes\n        self.send_count = 2\n        while self.listener.extract_completed.call_count < 1:\n            pass\n        self.listener.extract_completed.assert_called_with(\"a\", True)\n\n        status = self.dispatch.status()\n        self.assertEqual(2, len(status))\n        self.assertEqual(\"b\", status[0].name)\n        self.assertEqual(True, status[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[0].state)\n        self.assertEqual(\"c\", status[1].name)\n        self.assertEqual(False, status[1].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[1].state)\n\n        # After second directory finishes\n        self.send_count = 3\n        while self.listener.extract_completed.call_count < 2:\n            pass\n        self.listener.extract_completed.assert_called_with(\"b\", True)\n\n        status = self.dispatch.status()\n        self.assertEqual(1, len(status))\n        self.assertEqual(\"c\", status[0].name)\n        self.assertEqual(False, status[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status[0].state)\n\n        # After third/last file finishes\n        self.send_count = 4\n        while self.listener.extract_completed.call_count < 3:\n            pass\n        self.listener.extract_completed.assert_called_with(\"c\", False)\n\n        status = self.dispatch.status()\n        self.assertEqual(0, len(status))\n\n    @timeout_decorator.timeout(2)\n    def test_extract_ignores_duplicate_calls(self):\n        # Send two extract commands to same file\n        # Expect that only one extract operation is performed\n        self.mock_is_archive.return_value = True\n\n        self.barrier = False\n\n        def _extract_archive(**kwargs):\n            print(kwargs)\n            while not self.barrier:\n                pass\n\n        self.mock_extract_archive.side_effect = _extract_archive\n\n        a = ModelFile(\"a\", False)\n        a.local_size = 200\n\n        self.dispatch.add_listener(self.listener)\n        self.dispatch.extract(a)\n        self.dispatch.extract(a)\n\n        time.sleep(0.1)\n        self.barrier = True\n\n        time.sleep(0.1)\n\n        while self.mock_extract_archive.call_count < 1 and \\\n                self.listener.extract_completed.call_count < 1:\n            pass\n        time.sleep(0.1)\n        self.listener.extract_completed.assert_called_once_with(\"a\", False)\n        self.listener.extract_failed.assert_not_called()\n        self.assertEqual(1, self.mock_extract_archive.call_count)\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_extract/test_extract_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport logging\nfrom unittest.mock import patch\nimport sys\nimport multiprocessing\nimport ctypes\nimport threading\nimport time\n\nimport timeout_decorator\n\nfrom model import ModelFile\nfrom controller.extract import ExtractProcess, ExtractListener, ExtractStatus\n\n\nclass TestExtractProcess(unittest.TestCase):\n    def setUp(self):\n        dispatch_patcher = patch('controller.extract.extract_process.ExtractDispatch')\n        self.addCleanup(dispatch_patcher.stop)\n        self.mock_dispatch_cls = dispatch_patcher.start()\n        self.mock_dispatch = self.mock_dispatch_cls.return_value\n\n        # by default mock returns empty statuses\n        self.mock_dispatch.status.return_value = []\n\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Assign process to this variable so that it can be cleaned up\n        # even after an error\n        self.process = None\n\n    def tearDown(self):\n        if self.process:\n            self.process.terminate()\n\n    @timeout_decorator.timeout(2)\n    def test_param_out_dir_path(self):\n        self.out_dir_path = multiprocessing.Array(ctypes.c_char, 100)\n        self.ctor_called = multiprocessing.Value('i', 0)\n\n        def mock_ctor(**kwargs):\n            self.out_dir_path.value = str.encode(kwargs[\"out_dir_path\"])\n            self.ctor_called.value = 1\n            return self.mock_dispatch\n        self.mock_dispatch_cls.side_effect = mock_ctor\n\n        self.process = ExtractProcess(out_dir_path=\"/test/out/path\",\n                                      local_path=\"/test/local/path\")\n        self.process.start()\n        # Wait for ctor to be called\n        while self.ctor_called.value == 0:\n            pass\n        self.assertEqual(\"/test/out/path\", self.out_dir_path.value.decode())\n\n    @timeout_decorator.timeout(2)\n    def test_param_out_local_path(self):\n        self.local_path = multiprocessing.Array(ctypes.c_char, 100)\n        self.ctor_called = multiprocessing.Value('i', 0)\n\n        def mock_ctor(**kwargs):\n            self.local_path.value = str.encode(kwargs[\"local_path\"])\n            self.ctor_called.value = 1\n            return self.mock_dispatch\n        self.mock_dispatch_cls.side_effect = mock_ctor\n\n        self.process = ExtractProcess(out_dir_path=\"/test/out/path\",\n                                      local_path=\"/test/local/path\")\n        self.process.start()\n        # Wait for ctor to be called\n        while self.ctor_called.value == 0:\n            pass\n        self.assertEqual(\"/test/local/path\", self.local_path.value.decode())\n\n    @timeout_decorator.timeout(2)\n    def test_calls_start_dispatch(self):\n        self.start_called = multiprocessing.Value('i', 0)\n\n        def _start():\n            self.start_called.value = 1\n        self.mock_dispatch.start.side_effect = _start\n\n        self.process = ExtractProcess(out_dir_path=\"/test/out/path\",\n                                      local_path=\"/test/local/path\")\n        self.process.start()\n        while self.start_called.value == 0:\n            pass\n\n    @timeout_decorator.timeout(10)\n    def test_retrieves_status(self):\n        # Use this as a signal to mock to control which status to send\n        self.status_signal = multiprocessing.Value('i', 0)\n        self.status_counter = multiprocessing.Value('i', 0)\n\n        s_a = ExtractStatus(name=\"a\", is_dir=True, state=ExtractStatus.State.EXTRACTING)\n        s_b = ExtractStatus(name=\"b\", is_dir=False, state=ExtractStatus.State.EXTRACTING)\n        s_c = ExtractStatus(name=\"c\", is_dir=True, state=ExtractStatus.State.EXTRACTING)\n\n        def _status():\n            ret = None\n            if self.status_signal.value == 0:\n                ret = [s_a]\n            elif self.status_signal.value == 1:\n                ret = [s_a, s_b]\n            elif self.status_signal.value == 2:\n                ret = [s_c]\n            elif self.status_signal.value == 3:\n                ret = []\n            self.status_counter.value += 1\n            return ret\n        self.mock_dispatch.status.side_effect = _status\n\n        self.process = ExtractProcess(out_dir_path=\"\", local_path=\"\")\n        self.process.start()\n\n        # wait for first call to status (actually second call to guarantee first status is queued)\n        while self.status_counter.value < 2:\n            pass\n        status_result = self.process.pop_latest_statuses()\n        self.assertEqual(1, len(status_result.statuses))\n        self.assertEqual(\"a\", status_result.statuses[0].name)\n        self.assertEqual(True, status_result.statuses[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status_result.statuses[0].state)\n\n        # signal for status #1 and wait status fetch\n        self.status_signal.value = 1\n        orig_counter = self.status_counter.value\n        while self.status_counter.value < orig_counter+2:\n            pass\n        status_result = self.process.pop_latest_statuses()\n        self.assertEqual(2, len(status_result.statuses))\n        self.assertEqual(\"a\", status_result.statuses[0].name)\n        self.assertEqual(True, status_result.statuses[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status_result.statuses[0].state)\n        self.assertEqual(\"b\", status_result.statuses[1].name)\n        self.assertEqual(False, status_result.statuses[1].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status_result.statuses[1].state)\n\n        # signal for status #2 and wait status fetch\n        self.status_signal.value = 2\n        orig_counter = self.status_counter.value\n        while self.status_counter.value < orig_counter+2:\n            pass\n        status_result = self.process.pop_latest_statuses()\n        self.assertEqual(1, len(status_result.statuses))\n        self.assertEqual(\"c\", status_result.statuses[0].name)\n        self.assertEqual(True, status_result.statuses[0].is_dir)\n        self.assertEqual(ExtractStatus.State.EXTRACTING, status_result.statuses[0].state)\n\n        # signal for status #3 and wait status fetch\n        self.status_signal.value = 3\n        orig_counter = self.status_counter.value\n        while self.status_counter.value < orig_counter+2:\n            pass\n        status_result = self.process.pop_latest_statuses()\n        self.assertEqual(0, len(status_result.statuses))\n\n    @timeout_decorator.timeout(10)\n    def test_retrieves_completed(self):\n        # Use this as a signal to mock to control which completed list to send\n        self.completed_signal = multiprocessing.Value('i', 0)\n        self.completed_counter = multiprocessing.Value('i', 0)\n\n        def _add_listener(listener: ExtractListener):\n            print(\"Listener added\")\n\n            def _callback_sequence():\n                listener.extract_completed(name=\"a\", is_dir=True)\n                time.sleep(0.1)\n                self.completed_signal.value = 1\n\n                time.sleep(1.0)\n                listener.extract_completed(name=\"b\", is_dir=False)\n                listener.extract_completed(name=\"c\", is_dir=True)\n                time.sleep(0.1)\n                self.completed_signal.value = 2\n\n            threading.Thread(target=_callback_sequence()).start()\n        self.mock_dispatch.add_listener.side_effect = _add_listener\n\n        self.process = ExtractProcess(out_dir_path=\"\", local_path=\"\")\n        self.process.start()\n\n        while self.completed_signal.value < 1:\n            pass\n        completed = self.process.pop_completed()\n        self.assertEqual(1, len(completed))\n        self.assertEqual(\"a\", completed[0].name)\n        self.assertEqual(True, completed[0].is_dir)\n        # next one should be empty\n        completed = self.process.pop_completed()\n        self.assertEqual(0, len(completed))\n\n        while self.completed_signal.value < 2:\n            pass\n        completed = self.process.pop_completed()\n        self.assertEqual(2, len(completed))\n        self.assertEqual(\"b\", completed[0].name)\n        self.assertEqual(False, completed[0].is_dir)\n        self.assertEqual(\"c\", completed[1].name)\n        self.assertEqual(True, completed[1].is_dir)\n        # next one should be empty\n        completed = self.process.pop_completed()\n        self.assertEqual(0, len(completed))\n\n    @timeout_decorator.timeout(5)\n    def test_forwards_extract_commands(self):\n        a = ModelFile(\"a\", True)\n        a.local_size = 100\n        aa = ModelFile(\"aa\", False)\n        aa.local_size = 60\n        a.add_child(aa)\n        ab = ModelFile(\"ab\", False)\n        ab.local_size = 40\n        a.add_child(ab)\n\n        b = ModelFile(\"b\", True)\n        b.local_size = 10\n        ba = ModelFile(\"ba\", True)\n        ba.local_size = 10\n        b.add_child(ba)\n        baa = ModelFile(\"baa\", False)\n        baa.local_size = 10\n        ba.add_child(baa)\n\n        c = ModelFile(\"c\", False)\n        c.local_size = 1234\n\n        self.extract_counter = multiprocessing.Value('i', 0)\n\n        def _extract(file: ModelFile):\n            print(file.name)\n            if self.extract_counter.value == 0:\n                self.assertEqual(\"a\", file.name)\n                self.assertEqual(True, file.is_dir)\n                self.assertEqual(100, file.local_size)\n                children = file.get_children()\n                self.assertEqual(2, len(children))\n                self.assertEqual(\"aa\", children[0].name)\n                self.assertEqual(False, children[0].is_dir)\n                self.assertEqual(60, children[0].local_size)\n                self.assertEqual(\"ab\", children[1].name)\n                self.assertEqual(False, children[0].is_dir)\n                self.assertEqual(40, children[1].local_size)\n            elif self.extract_counter.value == 1:\n                self.assertEqual(\"b\", file.name)\n                self.assertEqual(True, file.is_dir)\n                self.assertEqual(10, file.local_size)\n                self.assertEqual(1, len(file.get_children()))\n                child = file.get_children()[0]\n                self.assertEqual(\"ba\", child.name)\n                self.assertEqual(True, child.is_dir)\n                self.assertEqual(10, child.local_size)\n                self.assertEqual(1, len(child.get_children()))\n                subchild = child.get_children()[0]\n                self.assertEqual(\"baa\", subchild.name)\n                self.assertEqual(False, subchild.is_dir)\n                self.assertEqual(10, subchild.local_size)\n            elif self.extract_counter.value == 2:\n                self.assertEqual(\"c\", file.name)\n                self.assertEqual(False, file.is_dir)\n                self.assertEqual(1234, file.local_size)\n            self.extract_counter.value += 1\n        self.mock_dispatch.extract.side_effect = _extract\n\n        self.process = ExtractProcess(out_dir_path=\"\", local_path=\"\")\n        self.process.start()\n\n        self.process.extract(a)\n        time.sleep(1)\n        self.process.extract(b)\n        self.process.extract(c)\n        while self.extract_counter.value < 3:\n            pass\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_model_builder.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport sys\nimport unittest\nfrom unittest.mock import patch\nfrom datetime import datetime\n\nfrom system import SystemFile\nfrom lftp import LftpJobStatus\nfrom model import ModelError, ModelFile, Model\nfrom controller import ModelBuilder\nfrom controller.extract import ExtractStatus\n\n\nclass TestModelBuilder(unittest.TestCase):\n    def setUp(self):\n        logger = logging.getLogger(TestModelBuilder.__name__)\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        self.model_builder = ModelBuilder()\n        self.model_builder.set_base_logger(logger)\n\n    def __build_test_model_children_tree_1(self) -> Model:\n        \"\"\"Build a test model for children testing\"\"\"\n        self.model_builder.clear()\n\n        r_a = SystemFile(\"a\", 1024, True)\n        r_aa = SystemFile(\"aa\", 512, False)\n        r_a.add_child(r_aa)\n        r_ab = SystemFile(\"ab\", 512, False)\n        r_a.add_child(r_ab)\n        r_b = SystemFile(\"b\", 3090, True)\n        r_ba = SystemFile(\"ba\", 2048, True)\n        r_b.add_child(r_ba)\n        r_baa = SystemFile(\"baa\", 2048, False)\n        r_ba.add_child(r_baa)\n        r_bb = SystemFile(\"bb\", 42, True)  # only in remote\n        r_b.add_child(r_bb)\n        r_bba = SystemFile(\"bba\", 42, False)  # only in remote\n        r_bb.add_child(r_bba)\n        r_bd = SystemFile(\"bd\", 1000, False)\n        r_b.add_child(r_bd)\n        r_c = SystemFile(\"c\", 1234, False)  # only in remote\n        r_d = SystemFile(\"d\", 5678, True)  # only in remote\n        r_da = SystemFile(\"da\", 5678, False)  # only in remote\n        r_d.add_child(r_da)\n\n        l_a = SystemFile(\"a\", 1024, True)\n        l_aa = SystemFile(\"aa\", 512, False)\n        l_a.add_child(l_aa)\n        l_ab = SystemFile(\"ab\", 512, False)\n        l_a.add_child(l_ab)\n        l_b = SystemFile(\"b\", 1611, True)\n        l_ba = SystemFile(\"ba\", 512, True)\n        l_b.add_child(l_ba)\n        l_baa = SystemFile(\"baa\", 512, False)\n        l_ba.add_child(l_baa)\n        l_bc = SystemFile(\"bc\", 99, True)  # only in local\n        l_b.add_child(l_bc)\n        l_bca = SystemFile(\"bca\", 99, False)  # only in local\n        l_bc.add_child(l_bca)\n        l_bd = SystemFile(\"bd\", 1000, False)\n        l_b.add_child(l_bd)\n\n        s_b = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"b\", \"\")\n        s_b.total_transfer_state = LftpJobStatus.TransferState(1611, 3090, 52, 10, 1000)\n        s_b.add_active_file_transfer_state(\"ba/baa\", LftpJobStatus.TransferState(512, 2048, 25, 5, 500))\n        s_c = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"c\", \"\")\n        s_d = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.QUEUED, \"d\", \"\")\n\n        self.model_builder.set_remote_files([r_a, r_b, r_c, r_d])\n        self.model_builder.set_local_files([l_a, l_b])\n        self.model_builder.set_lftp_statuses([s_b, s_c, s_d])\n        return self.model_builder.build_model()\n\n    def test_build_file_names(self):\n        remote_files = [SystemFile(\"a\", 0, False), SystemFile(\"b\", 0, False)]\n        local_files = [SystemFile(\"b\", 0, False), SystemFile(\"c\", 0, False)]\n        statuses = [LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"b\", \"\"),\n                    LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"d\", \"\")]\n        self.model_builder.set_remote_files(remote_files)\n        self.model_builder.set_local_files(local_files)\n        self.model_builder.set_lftp_statuses(statuses)\n        model = self.model_builder.build_model()\n        self.assertEqual({\"a\", \"b\", \"c\", \"d\"}, model.get_file_names())\n\n    def test_build_is_dir(self):\n        # remote\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(False, model.get_file(\"a\").is_dir)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, True)])\n        model = self.model_builder.build_model()\n        self.assertEqual(True, model.get_file(\"a\").is_dir)\n\n        # local\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(False, model.get_file(\"a\").is_dir)\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, True)])\n        model = self.model_builder.build_model()\n        self.assertEqual(True, model.get_file(\"a\").is_dir)\n\n        # statuses\n        self.model_builder.clear()\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(False, model.get_file(\"a\").is_dir)\n        self.model_builder.clear()\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(True, model.get_file(\"a\").is_dir)\n\n        # all three\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(False, model.get_file(\"a\").is_dir)\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, True)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, True)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(True, model.get_file(\"a\").is_dir)\n\n    def test_build_mismatch_is_dir(self):\n        \"\"\"Mismatching is_dir raises error\"\"\"\n        # remote mismatches\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, True)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        with self.assertRaises(ModelError) as context:\n            self.model_builder.build_model()\n        self.assertTrue(str(context.exception).startswith(\"Mismatch in is_dir\"))\n\n        # local mismatches\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, True)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        with self.assertRaises(ModelError) as context:\n            self.model_builder.build_model()\n        self.assertTrue(str(context.exception).startswith(\"Mismatch in is_dir\"))\n\n        # status mismatches\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        with self.assertRaises(ModelError) as context:\n            self.model_builder.build_model()\n        self.assertTrue(str(context.exception).startswith(\"Mismatch in is_dir\"))\n\n        # extracting mismatches\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING)])\n        with self.assertRaises(ModelError) as context:\n            self.model_builder.build_model()\n        self.assertTrue(str(context.exception).startswith(\"Mismatch in is_dir between file and extract status\"))\n\n    def test_build_state(self):\n        # Queued\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.QUEUED, model.get_file(\"a\").state)\n\n        # Downloading\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DOWNLOADING, model.get_file(\"a\").state)\n\n        # Default\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 0, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Default - local only\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Downloaded\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DOWNLOADED, model.get_file(\"a\").state)\n\n        # Deleted\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DELETED, model.get_file(\"a\").state)\n\n        # Deleted but Queued\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.QUEUED, model.get_file(\"a\").state)\n\n        # Deleted but Downloading\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DOWNLOADING, model.get_file(\"a\").state)\n\n        # Deleted, then partially Downloaded\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 50, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Downloaded, and Extracting\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.EXTRACTING, model.get_file(\"a\").state)\n\n        # Local-only, and Extracting\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.EXTRACTING, model.get_file(\"a\").state)\n\n        # Remote-only, and Extracting (unexpected: should fall-back to Default)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Extracting and Downloading/Queued (unexpected: should ignore Extracting)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 50, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        ])\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DOWNLOADING, model.get_file(\"a\").state)\n\n        # Extracting and Deleted (unexpected: should ignore Extracting)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DELETED, model.get_file(\"a\").state)\n\n        # Downloaded+Extracted, but extracting again\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        self.model_builder.set_extracted_files({\"a\"})\n        self.model_builder.set_extract_statuses([ExtractStatus(\"a\", False, ExtractStatus.State.EXTRACTING)])\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.EXTRACTING, model.get_file(\"a\").state)\n\n        # Downloaded, and Extracted\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extracted_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.EXTRACTED, model.get_file(\"a\").state)\n\n        # Local-only, and Extracted\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extracted_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Remote-only, and Extracted\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_extracted_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DEFAULT, model.get_file(\"a\").state)\n\n        # Extracted, but Downloading/Queued (possible after deletion)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 50, False)])\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        ])\n        self.model_builder.set_extracted_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DOWNLOADING, model.get_file(\"a\").state)\n\n        # Extracted and Deleted\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 100, False)])\n        self.model_builder.set_downloaded_files({\"a\"})\n        self.model_builder.set_extracted_files({\"a\"})\n        model = self.model_builder.build_model()\n        self.assertEqual(ModelFile.State.DELETED, model.get_file(\"a\").state)\n\n    def test_build_remote_size(self):\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(42, model.get_file(\"a\").remote_size)\n\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").remote_size)\n\n        self.model_builder.clear()\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").remote_size)\n\n    def test_build_remote_size_from_status_is_ignored(self):\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, 12345, None, None, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(42, model.get_file(\"a\").remote_size)\n\n    def test_build_local_size(self):\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(42, model.get_file(\"a\").local_size)\n\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").local_size)\n\n        self.model_builder.clear()\n        self.model_builder.set_lftp_statuses([\n            LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").local_size)\n\n    def test_build_local_size_from_status_is_ignored(self):\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(12345, 1000, 0.25, None, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(42, model.get_file(\"a\").local_size)\n\n    def test_build_local_size_downloading(self):\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        self.model_builder.set_active_files([SystemFile(\"a\", 99, False)])\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(12345, 1000, 0.25, None, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(99, model.get_file(\"a\").local_size)\n\n    def test_build_downloading_state_is_retained(self):\n        # downloading files latest info should be retained even after\n        # they have stopped downloading\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        self.model_builder.set_active_files([SystemFile(\"a\", 99, False)])\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(12345, 1000, 0.25, None, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(99, model.get_file(\"a\").local_size)\n\n        # set active files to empty\n        self.model_builder.set_active_files([])\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(12345, 1000, 0.25, None, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(99, model.get_file(\"a\").local_size)\n\n    def test_build_downloading_speed(self):\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 1234, None)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(1234, model.get_file(\"a\").downloading_speed)\n\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").downloading_speed)\n\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").downloading_speed)\n\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").downloading_speed)\n\n    def test_build_eta(self):\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, 4567)\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(4567, model.get_file(\"a\").eta)\n\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        self.model_builder.set_lftp_statuses([s])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").eta)\n\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").eta)\n\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").eta)\n\n    def test_build_estimated_eta(self):\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 100, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 1000, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(10, model.get_file(\"a\").eta)\n\n        # round up\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 133, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 1000, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(8, model.get_file(\"a\").eta)\n\n        # round up\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 133, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 1999, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(1, model.get_file(\"a\").eta)\n\n        # zero downloading speed\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 0, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 1000, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").eta)\n\n        # finished\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 200, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 2000, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(0, model.get_file(\"a\").eta)\n\n        # local size larger than remote\n        self.model_builder.clear()\n        s = LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 200, None)\n        self.model_builder.set_lftp_statuses([s])\n        self.model_builder.set_remote_files([SystemFile(\"a\", 2000, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 3000, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(0, model.get_file(\"a\").eta)\n\n    def test_build_children_names(self):\n        model = self.__build_test_model_children_tree_1()\n        self.assertEqual({\"a\", \"b\", \"c\", \"d\"}, model.get_file_names())\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        self.assertEqual({\"aa\", \"ab\"}, m_a_ch.keys())\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        self.assertEqual({\"ba\", \"bb\", \"bc\", \"bd\"}, m_b_ch.keys())\n        m_ba_ch = {m.name: m for m in m_b_ch[\"ba\"].get_children()}\n        self.assertEqual({\"baa\"}, m_ba_ch.keys())\n        m_baa_ch = {m.name: m for m in m_ba_ch[\"baa\"].get_children()}\n        self.assertEqual(0, len(m_baa_ch.keys()))\n        m_bb_ch = {m.name: m for m in m_b_ch[\"bb\"].get_children()}\n        self.assertEqual({\"bba\"}, m_bb_ch.keys())\n        m_bba_ch = {m.name: m for m in m_bb_ch[\"bba\"].get_children()}\n        self.assertEqual(0, len(m_bba_ch.keys()))\n        m_bc_ch = {m.name: m for m in m_b_ch[\"bc\"].get_children()}\n        self.assertEqual({\"bca\"}, m_bc_ch.keys())\n        m_bca_ch = {m.name: m for m in m_bc_ch[\"bca\"].get_children()}\n        self.assertEqual(0, len(m_bca_ch.keys()))\n        m_c_ch = {m.name: m for m in model.get_file(\"c\").get_children()}\n        self.assertEqual(0, len(m_c_ch.keys()))\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        self.assertEqual({\"da\"}, m_d_ch.keys())\n        m_da_ch = {m.name: m for m in m_d_ch[\"da\"].get_children()}\n        self.assertEqual(0, len(m_da_ch.keys()))\n\n    def test_build_children_is_dir(self):\n        model = self.__build_test_model_children_tree_1()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(True, m_a.is_dir)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(False, m_aa.is_dir)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(False, m_ab.is_dir)\n        m_b = model.get_file(\"b\")\n        self.assertEqual(True, m_b.is_dir)\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        m_ba = m_b_ch[\"ba\"]\n        self.assertEqual(True, m_ba.is_dir)\n        m_baa = m_ba.get_children()[0]\n        self.assertEqual(False, m_baa.is_dir)\n        m_bb = m_b_ch[\"bb\"]\n        self.assertEqual(True, m_bb.is_dir)\n        m_bba = m_bb.get_children()[0]\n        self.assertEqual(False, m_bba.is_dir)\n        m_bc = m_b_ch[\"bc\"]\n        self.assertEqual(True, m_bc.is_dir)\n        m_bca = m_bc.get_children()[0]\n        self.assertEqual(False, m_bca.is_dir)\n        m_bd = m_b_ch[\"bd\"]\n        self.assertEqual(False, m_bd.is_dir)\n        m_c = model.get_file(\"c\")\n        self.assertEqual(False, m_c.is_dir)\n        m_d = model.get_file(\"d\")\n        self.assertEqual(True, m_d.is_dir)\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        m_da = m_d_ch[\"da\"]\n        self.assertEqual(False, m_da.is_dir)\n\n    def test_build_children_mismatch_is_dir(self):\n        \"\"\"Mismatching is_dir in a child raises error\"\"\"\n        r_a = SystemFile(\"a\", 0, True)\n        r_aa = SystemFile(\"aa\", 0, True)\n        r_a.add_child(r_aa)\n        l_a = SystemFile(\"a\", 0, True)\n        l_aa = SystemFile(\"aa\", 0, False)\n        l_a.add_child(l_aa)\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n        with self.assertRaises(ModelError) as context:\n            self.model_builder.build_model()\n        self.assertTrue(str(context.exception).startswith(\"Mismatch in is_dir between child\"))\n\n    def test_build_children_sizes(self):\n        model = self.__build_test_model_children_tree_1()\n        m_a = model.get_file(\"a\")\n        self.assertEqual((1024, 1024, 1024), (m_a.remote_size, m_a.local_size, m_a.transferred_size))\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual((512, 512, 512), (m_aa.remote_size, m_aa.local_size, m_aa.transferred_size))\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual((512, 512, 512), (m_ab.remote_size, m_ab.local_size, m_ab.transferred_size))\n        m_b = model.get_file(\"b\")\n        self.assertEqual((3090, 1611, 1512), (m_b.remote_size, m_b.local_size, m_b.transferred_size))\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        m_ba = m_b_ch[\"ba\"]\n        self.assertEqual((2048, 512, 512), (m_ba.remote_size, m_ba.local_size, m_ba.transferred_size))\n        m_baa = m_ba.get_children()[0]\n        self.assertEqual((2048, 512, 512), (m_baa.remote_size, m_baa.local_size, m_baa.transferred_size))\n        m_bb = m_b_ch[\"bb\"]\n        self.assertEqual((42, None, None), (m_bb.remote_size, m_bb.local_size, m_bb.transferred_size))\n        m_bba = m_bb.get_children()[0]\n        self.assertEqual((42, None, None), (m_bba.remote_size, m_bba.local_size, m_bba.transferred_size))\n        m_bc = m_b_ch[\"bc\"]\n        self.assertEqual((None, 99, None), (m_bc.remote_size, m_bc.local_size, m_bc.transferred_size))\n        m_bca = m_bc.get_children()[0]\n        self.assertEqual((None, 99, None), (m_bca.remote_size, m_bca.local_size, m_bca.transferred_size))\n        m_bd = m_b_ch[\"bd\"]\n        self.assertEqual((1000, 1000, 1000), (m_bd.remote_size, m_bd.local_size, m_bd.transferred_size))\n        m_c = model.get_file(\"c\")\n        self.assertEqual((1234, None, None), (m_c.remote_size, m_c.local_size, m_c.transferred_size))\n        m_d = model.get_file(\"d\")\n        self.assertEqual((5678, None, None), (m_d.remote_size, m_d.local_size, m_d.transferred_size))\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        m_da = m_d_ch[\"da\"]\n        self.assertEqual((5678, None, None), (m_da.remote_size, m_da.local_size, m_da.transferred_size))\n\n    def test_build_children_state_default(self):\n        \"\"\"File only exists remotely\"\"\"\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        self.model_builder.set_remote_files([r_a])\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DEFAULT, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ab.state)\n\n    def test_build_children_state_default_partial(self):\n        \"\"\"File is partially downloaded\"\"\"\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        l_a = SystemFile(\"a\", 150, True)\n        l_aa = SystemFile(\"aa\", 50, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 50, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 100, False)\n        l_a.add_child(l_ab)\n\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DEFAULT, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ab.state)\n\n    def test_build_children_state_default_extra(self):\n        \"\"\"File only exists locally\"\"\"\n        l_a = SystemFile(\"a\", 150, True)\n        l_aa = SystemFile(\"aa\", 50, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 50, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 100, False)\n        l_a.add_child(l_ab)\n\n        self.model_builder.set_local_files([l_a])\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DEFAULT, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ab.state)\n\n    def test_build_children_state_downloaded_full(self):\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        l_a = SystemFile(\"a\", 300, True)\n        l_aa = SystemFile(\"aa\", 100, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 100, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 200, False)\n        l_a.add_child(l_ab)\n\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n\n    def test_build_children_state_downloaded_full_extra(self):\n        \"\"\"Fully downloaded but with an extra local-only file\"\"\"\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        l_a = SystemFile(\"a\", 400, True)\n        l_aa = SystemFile(\"aa\", 100, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 100, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 200, False)\n        l_a.add_child(l_ab)\n        l_ac = SystemFile(\"ac\", 100, True)  # local only\n        l_a.add_child(l_ac)\n        l_aca = SystemFile(\"aca\", 100, False)  # local only\n        l_ac.add_child(l_aca)\n\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n        l_ac = SystemFile(\"ac\", 100, True)  # local only\n        l_a.add_child(l_ac)\n        l_aca = SystemFile(\"aca\", 100, False)  # local only\n        l_ac.add_child(l_aca)\n\n    def test_build_children_state_downloaded_partial(self):\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        l_a = SystemFile(\"a\", 250, True)\n        l_aa = SystemFile(\"aa\", 50, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 50, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 200, False)\n        l_a.add_child(l_ab)\n\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DEFAULT, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n\n    def test_build_children_state_downloaded_partial_extra(self):\n        \"\"\"Partially downloaded but with an extra local-only file\"\"\"\n        r_a = SystemFile(\"a\", 300, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 200, False)\n        r_a.add_child(r_ab)\n\n        l_a = SystemFile(\"a\", 350, True)\n        l_aa = SystemFile(\"aa\", 50, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 50, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 200, False)\n        l_a.add_child(l_ab)\n        l_ac = SystemFile(\"ac\", 100, True)  # local only\n        l_a.add_child(l_ac)\n        l_aca = SystemFile(\"aca\", 100, False)  # local only\n        l_ac.add_child(l_aca)\n\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DEFAULT, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n        m_ac = m_a_ch[\"ac\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ac.state)\n        m_aca = m_ac.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aca.state)\n\n    def test_build_children_state_queued(self):\n        r_a = SystemFile(\"a\", 0, True)\n        r_aa = SystemFile(\"aa\", 0, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 0, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 0, False)\n        r_a.add_child(r_ab)\n        s_a = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.QUEUED, \"a\", \"\")\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_lftp_statuses([s_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.QUEUED, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.QUEUED, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.QUEUED, m_ab.state)\n\n    def test_build_children_state_downloading_1(self):\n        # Child files are active\n        r_a = SystemFile(\"a\", 0, True)\n        r_aa = SystemFile(\"aa\", 0, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 0, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 0, False)\n        r_a.add_child(r_ab)\n        s_a = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        s_a.add_active_file_transfer_state(\"aa/aaa\", LftpJobStatus.TransferState(None, None, None, None, None))\n        s_a.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(None, None, None, None, None))\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_lftp_statuses([s_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_ab.state)\n\n    def test_build_children_state_downloading_2(self):\n        # Child files are finished\n        r_a = SystemFile(\"a\", 150, True)\n        r_aa = SystemFile(\"aa\", 100, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 100, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 50, False)\n        r_a.add_child(r_ab)\n\n        s_a = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([r_a])\n        self.model_builder.set_lftp_statuses([s_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n\n    def test_build_children_state_downloading_3(self):\n        # Child files are queued\n        r_a = SystemFile(\"a\", 0, True)\n        r_aa = SystemFile(\"aa\", 0, True)\n        r_a.add_child(r_aa)\n        r_aaa = SystemFile(\"aaa\", 0, False)\n        r_aa.add_child(r_aaa)\n        r_ab = SystemFile(\"ab\", 0, False)\n        r_a.add_child(r_ab)\n        s_a = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_lftp_statuses([s_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.QUEUED, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.QUEUED, m_ab.state)\n\n    def test_build_children_state_downloading_4(self):\n        # Child files are only present in local\n        r_a = SystemFile(\"a\", 0, True)\n        r_aa = SystemFile(\"aa\", 0, True)\n        r_a.add_child(r_aa)\n        l_a = SystemFile(\"a\", 0, True)\n        l_aa = SystemFile(\"aa\", 0, True)\n        l_a.add_child(l_aa)\n        l_aaa = SystemFile(\"aaa\", 0, False)\n        l_aa.add_child(l_aaa)\n        l_ab = SystemFile(\"ab\", 0, False)\n        l_a.add_child(l_ab)\n        s_a = LftpJobStatus(0, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"\")\n        self.model_builder.set_remote_files([r_a])\n        self.model_builder.set_local_files([l_a])\n        self.model_builder.set_lftp_statuses([s_a])\n\n        model = self.model_builder.build_model()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aa.state)\n        m_aaa = m_aa.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_aaa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ab.state)\n\n    def test_build_children_state_all(self):\n        model = self.__build_test_model_children_tree_1()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_a.state)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_aa.state)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_ab.state)\n        m_b = model.get_file(\"b\")\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_b.state)\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        m_ba = m_b_ch[\"ba\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_ba.state)\n        m_baa = m_ba.get_children()[0]\n        self.assertEqual(ModelFile.State.DOWNLOADING, m_baa.state)\n        m_bb = m_b_ch[\"bb\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_bb.state)\n        m_bba = m_bb.get_children()[0]\n        self.assertEqual(ModelFile.State.QUEUED, m_bba.state)\n        m_bc = m_b_ch[\"bc\"]\n        self.assertEqual(ModelFile.State.DEFAULT, m_bc.state)\n        m_bca = m_bc.get_children()[0]\n        self.assertEqual(ModelFile.State.DEFAULT, m_bca.state)\n        m_bd = m_b_ch[\"bd\"]\n        self.assertEqual(ModelFile.State.DOWNLOADED, m_bd.state)\n        m_c = model.get_file(\"c\")\n        self.assertEqual(ModelFile.State.QUEUED, m_c.state)\n        m_d = model.get_file(\"d\")\n        self.assertEqual(ModelFile.State.QUEUED, m_d.state)\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        m_da = m_d_ch[\"da\"]\n        self.assertEqual(ModelFile.State.QUEUED, m_da.state)\n\n    def test_build_children_downloading_speed(self):\n        model = self.__build_test_model_children_tree_1()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(None, m_a.downloading_speed)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(None, m_aa.downloading_speed)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(None, m_ab.downloading_speed)\n        m_b = model.get_file(\"b\")\n        self.assertEqual(10, m_b.downloading_speed)\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        m_ba = m_b_ch[\"ba\"]\n        self.assertEqual(None, m_ba.downloading_speed)\n        m_baa = m_ba.get_children()[0]\n        self.assertEqual(5, m_baa.downloading_speed)\n        m_bb = m_b_ch[\"bb\"]\n        self.assertEqual(None, m_bb.downloading_speed)\n        m_bba = m_bb.get_children()[0]\n        self.assertEqual(None, m_bba.downloading_speed)\n        m_bc = m_b_ch[\"bc\"]\n        self.assertEqual(None, m_bc.downloading_speed)\n        m_bca = m_bc.get_children()[0]\n        self.assertEqual(None, m_bca.downloading_speed)\n        m_bd = m_b_ch[\"bd\"]\n        self.assertEqual(None, m_bd.downloading_speed)\n        m_c = model.get_file(\"c\")\n        self.assertEqual(None, m_c.downloading_speed)\n        m_d = model.get_file(\"d\")\n        self.assertEqual(None, m_d.downloading_speed)\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        m_da = m_d_ch[\"da\"]\n        self.assertEqual(None, m_da.downloading_speed)\n\n    def test_build_children_eta(self):\n        model = self.__build_test_model_children_tree_1()\n        m_a = model.get_file(\"a\")\n        self.assertEqual(None, m_a.eta)\n        m_a_ch = {m.name: m for m in model.get_file(\"a\").get_children()}\n        m_aa = m_a_ch[\"aa\"]\n        self.assertEqual(None, m_aa.eta)\n        m_ab = m_a_ch[\"ab\"]\n        self.assertEqual(None, m_ab.eta)\n        m_b = model.get_file(\"b\")\n        self.assertEqual(1000, m_b.eta)\n        m_b_ch = {m.name: m for m in model.get_file(\"b\").get_children()}\n        m_ba = m_b_ch[\"ba\"]\n        self.assertEqual(None, m_ba.eta)\n        m_baa = m_ba.get_children()[0]\n        self.assertEqual(500, m_baa.eta)\n        m_bb = m_b_ch[\"bb\"]\n        self.assertEqual(None, m_bb.eta)\n        m_bba = m_bb.get_children()[0]\n        self.assertEqual(None, m_bba.eta)\n        m_bc = m_b_ch[\"bc\"]\n        self.assertEqual(None, m_bc.eta)\n        m_bca = m_bc.get_children()[0]\n        self.assertEqual(None, m_bca.eta)\n        m_bd = m_b_ch[\"bd\"]\n        self.assertEqual(None, m_bd.eta)\n        m_c = model.get_file(\"c\")\n        self.assertEqual(None, m_c.eta)\n        m_d = model.get_file(\"d\")\n        self.assertEqual(None, m_d.eta)\n        m_d_ch = {m.name: m for m in model.get_file(\"d\").get_children()}\n        m_da = m_d_ch[\"da\"]\n        self.assertEqual(None, m_da.eta)\n\n    @patch(\"controller.model_builder.Extract\")\n    def test_build_sets_is_extractable(self, mock_extract_module):\n        mock_is_archive_fast = mock_extract_module.is_archive_fast\n        is_archive_list = []\n\n        def _is_archive_fast(name: str):\n            return name in is_archive_list\n        mock_is_archive_fast.side_effect = _is_archive_fast\n\n        # Root local file\n        self.model_builder.clear()\n        is_archive_list = [\"a\"]\n        self.model_builder.set_local_files([SystemFile(\"a\", 10, False), SystemFile(\"b\", 10, False)])\n        model = self.model_builder.build_model()\n        self.assertTrue(model.get_file(\"a\").is_extractable)\n        self.assertFalse(model.get_file(\"b\").is_extractable)\n\n        # Root remote file\n        self.model_builder.clear()\n        is_archive_list = [\"b\"]\n        self.model_builder.set_remote_files([SystemFile(\"a\", 10, False), SystemFile(\"b\", 10, False)])\n        model = self.model_builder.build_model()\n        self.assertFalse(model.get_file(\"a\").is_extractable)\n        self.assertTrue(model.get_file(\"b\").is_extractable)\n\n        # Directory with archive\n        self.model_builder.clear()\n        is_archive_list = [\"aa\"]\n        a = SystemFile(\"a\", 10, True)\n        aa = SystemFile(\"aa\", 10, False)\n        a.add_child(aa)\n        self.model_builder.set_local_files([a])\n        model = self.model_builder.build_model()\n        self.assertTrue(model.get_file(\"a\").is_extractable)\n        self.assertEqual(\"aa\", model.get_file(\"a\").get_children()[0].name)\n        self.assertTrue(model.get_file(\"a\").get_children()[0].is_extractable)\n\n        # Directory with non-archive\n        self.model_builder.clear()\n        is_archive_list = [\"aa\"]\n        a = SystemFile(\"a\", 10, True)\n        aa = SystemFile(\"ab\", 10, False)\n        a.add_child(aa)\n        self.model_builder.set_local_files([a])\n        model = self.model_builder.build_model()\n        self.assertFalse(model.get_file(\"a\").is_extractable)\n        self.assertEqual(\"ab\", model.get_file(\"a\").get_children()[0].name)\n        self.assertFalse(model.get_file(\"a\").get_children()[0].is_extractable)\n\n        # Directory with archive and non-archive\n        self.model_builder.clear()\n        is_archive_list = [\"ab\"]\n        a = SystemFile(\"a\", 10, True)\n        aa = SystemFile(\"aa\", 10, False)\n        ab = SystemFile(\"ab\", 10, False)\n        a.add_child(aa)\n        a.add_child(ab)\n        self.model_builder.set_local_files([a])\n        model = self.model_builder.build_model()\n        self.assertTrue(model.get_file(\"a\").is_extractable)\n        a_children = {f.name: f for f in model.get_file(\"a\").get_children()}\n        self.assertFalse(a_children[\"aa\"].is_extractable)\n        self.assertTrue(a_children[\"ab\"].is_extractable)\n\n        # Directory with archive and non-archive sub-directories\n        self.model_builder.clear()\n        is_archive_list = [\"aba\"]\n        a = SystemFile(\"a\", 10, True)\n        aa = SystemFile(\"aa\", 10, True)\n        aaa = SystemFile(\"aaa\", 10, False)\n        ab = SystemFile(\"ab\", 10, True)\n        aba = SystemFile(\"aba\", 10, False)\n        a.add_child(aa)\n        a.add_child(ab)\n        aa.add_child(aaa)\n        ab.add_child(aba)\n        self.model_builder.set_local_files([a])\n        model = self.model_builder.build_model()\n        self.assertTrue(model.get_file(\"a\").is_extractable)\n        a_children = {f.name: f for f in model.get_file(\"a\").get_children()}\n        self.assertFalse(a_children[\"aa\"].is_extractable)\n        self.assertEqual(\"aaa\", a_children[\"aa\"].get_children()[0].name)\n        self.assertFalse(a_children[\"aa\"].get_children()[0].is_extractable)\n        self.assertTrue(a_children[\"ab\"].is_extractable)\n        self.assertEqual(\"aba\", a_children[\"ab\"].get_children()[0].name)\n        self.assertTrue(a_children[\"ab\"].get_children()[0].is_extractable)\n\n        # Directory name passes is_archive, but not file\n        self.model_builder.clear()\n        is_archive_list = [\"a\"]\n        a = SystemFile(\"a\", 10, True)\n        aa = SystemFile(\"aa\", 10, False)\n        a.add_child(aa)\n        self.model_builder.set_local_files([a])\n        model = self.model_builder.build_model()\n        self.assertFalse(model.get_file(\"a\").is_extractable)\n        self.assertEqual(\"aa\", model.get_file(\"a\").get_children()[0].name)\n        self.assertFalse(model.get_file(\"a\").get_children()[0].is_extractable)\n\n    def test_build_transferred_size(self):\n        # both remote and local\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 22, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(22, model.get_file(\"a\").transferred_size)\n\n        # remote but no local\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").transferred_size)\n\n        # local but no remote\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 22, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").transferred_size)\n\n        # local size larger than remote\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, False)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 55, False)])\n        model = self.model_builder.build_model()\n        self.assertEqual(42, model.get_file(\"a\").transferred_size)\n\n        # both remote and local directory (but no children specified)\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, True)])\n        self.model_builder.set_local_files([SystemFile(\"a\", 22, True)])\n        model = self.model_builder.build_model()\n        self.assertEqual(0, model.get_file(\"a\").transferred_size)\n\n        # remote only directory\n        self.model_builder.clear()\n        self.model_builder.set_remote_files([SystemFile(\"a\", 42, True)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").transferred_size)\n\n        # local only directory\n        self.model_builder.clear()\n        self.model_builder.set_local_files([SystemFile(\"a\", 22, True)])\n        model = self.model_builder.build_model()\n        self.assertEqual(None, model.get_file(\"a\").transferred_size)\n\n    def test_build_local_created_timestamp(self):\n        self.model_builder.set_local_files([\n            SystemFile(\"a\", 42, False, time_created=datetime(2018, 11, 9, 21, 40, 18)),\n            SystemFile(\"b\", 42, False)\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18),\n                         model.get_file(\"a\").local_created_timestamp)\n        self.assertIsNone(model.get_file(\"b\").local_created_timestamp)\n\n    def test_build_local_modified_timestamp(self):\n        self.model_builder.set_local_files([\n            SystemFile(\"a\", 42, False, time_modified=datetime(2018, 11, 9, 21, 40, 18)),\n            SystemFile(\"b\", 42, False)\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18),\n                         model.get_file(\"a\").local_modified_timestamp)\n        self.assertIsNone(model.get_file(\"b\").local_modified_timestamp)\n\n    def test_build_remote_created_timestamp(self):\n        self.model_builder.set_remote_files([\n            SystemFile(\"a\", 42, False, time_created=datetime(2018, 11, 9, 21, 40, 18)),\n            SystemFile(\"b\", 42, False)\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18),\n                         model.get_file(\"a\").remote_created_timestamp)\n        self.assertIsNone(model.get_file(\"b\").remote_created_timestamp)\n\n    def test_build_remote_modified_timestamp(self):\n        self.model_builder.set_remote_files([\n            SystemFile(\"a\", 42, False, time_modified=datetime(2018, 11, 9, 21, 40, 18)),\n            SystemFile(\"b\", 42, False)\n        ])\n        model = self.model_builder.build_model()\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18),\n                         model.get_file(\"a\").remote_modified_timestamp)\n        self.assertIsNone(model.get_file(\"b\").remote_modified_timestamp)\n\n    def test_rebuild(self):\n        remote_files = [SystemFile(\"a\", 0, False), SystemFile(\"b\", 0, False)]\n        local_files = [SystemFile(\"b\", 0, False), SystemFile(\"c\", 0, False)]\n        statuses = [LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"b\", \"\"),\n                    LftpJobStatus(0, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"d\", \"\")]\n        self.model_builder.set_remote_files(remote_files)\n        self.model_builder.set_local_files(local_files)\n        self.model_builder.set_lftp_statuses(statuses)\n        model = self.model_builder.build_model()\n        self.assertEqual({\"a\", \"b\", \"c\", \"d\"}, model.get_file_names())\n\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Set without any changes\n        remote_files = [SystemFile(\"a\", 0, False), SystemFile(\"b\", 0, False)]\n        self.model_builder.set_remote_files(remote_files)\n        self.assertFalse(self.model_builder.has_changes())\n        model = self.model_builder.build_model()\n        self.assertEqual({\"a\", \"b\", \"c\", \"d\"}, model.get_file_names())\n\n        # Set with changes\n        remote_files = [SystemFile(\"b\", 0, False), SystemFile(\"e\", 0, False)]\n        self.model_builder.set_remote_files(remote_files)\n        self.assertTrue(self.model_builder.has_changes())\n        model = self.model_builder.build_model()\n        self.assertEqual({\"b\", \"c\", \"d\", \"e\"}, model.get_file_names())\n\n    def test_rebuild_on_active_files(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_active_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidates even on same active files\n        self.model_builder.set_active_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.assertTrue(self.model_builder.has_changes())\n        self.model_builder.build_model()\n\n        # Does not invalidate on empty active files\n        self.model_builder.set_active_files([])\n        self.assertFalse(self.model_builder.has_changes())\n\n    def test_rebuild_on_local_files(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_local_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        self.model_builder.set_local_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        self.model_builder.set_local_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 21)\n        ])\n        self.assertTrue(self.model_builder.has_changes())\n\n    def test_rebuild_on_remote_files(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_remote_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        self.model_builder.set_remote_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 20)\n        ])\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        self.model_builder.set_remote_files([\n            SystemFile(\"a\", 10),\n            SystemFile(\"b\", 21)\n        ])\n        self.assertTrue(self.model_builder.has_changes())\n\n    def test_rebuild_on_lftp_statuses(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        s1 = LftpJobStatus(3, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"flags\")\n        s1.total_transfer_state = LftpJobStatus.TransferState(100, 200, 50, 10, 50)\n        s2 = LftpJobStatus(3, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"b\", \"flags\")\n        self.model_builder.set_lftp_statuses([s1, s2])\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        s1a = LftpJobStatus(3, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"flags\")\n        s1a.total_transfer_state = LftpJobStatus.TransferState(100, 200, 50, 10, 50)\n        s2a = LftpJobStatus(3, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"b\", \"flags\")\n        self.model_builder.set_lftp_statuses([s1a, s2a])\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        s1b = LftpJobStatus(3, LftpJobStatus.Type.MIRROR, LftpJobStatus.State.RUNNING, \"a\", \"flags\")\n        s1b.total_transfer_state = LftpJobStatus.TransferState(150, 200, 50, 10, 50)\n        s2b = LftpJobStatus(3, LftpJobStatus.Type.PGET, LftpJobStatus.State.QUEUED, \"b\", \"flags\")\n        self.model_builder.set_lftp_statuses([s1b, s2b])\n        self.assertTrue(self.model_builder.has_changes())\n\n    def test_rebuild_on_downloaded_files(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_downloaded_files({\"a\", \"b\"})\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        self.model_builder.set_downloaded_files({\"a\", \"b\"})\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        self.model_builder.set_downloaded_files({\"a\", \"c\"})\n        self.assertTrue(self.model_builder.has_changes())\n\n    def test_rebuild_on_extract_statuses(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_extract_statuses([\n            ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING),\n            ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING)\n        ])\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        self.model_builder.set_extract_statuses([\n            ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING),\n            ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING)\n        ])\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        self.model_builder.set_extract_statuses([\n            ExtractStatus(\"a\", True, ExtractStatus.State.EXTRACTING),\n            ExtractStatus(\"c\", True, ExtractStatus.State.EXTRACTING)\n        ])\n        self.assertTrue(self.model_builder.has_changes())\n\n    def test_rebuild_on_extracted_files(self):\n        self.assertTrue(self.model_builder.has_changes())\n\n        # Initial set\n        self.model_builder.set_extracted_files({\"a\", \"b\"})\n        self.model_builder.build_model()\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Does not invalidate on same\n        self.model_builder.set_extracted_files({\"a\", \"b\"})\n        self.assertFalse(self.model_builder.has_changes())\n\n        # Invalidate on different\n        self.model_builder.set_extracted_files({\"a\", \"c\"})\n        self.assertTrue(self.model_builder.has_changes())\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_scan/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_scan/test_remote_scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport logging\nimport sys\nfrom unittest.mock import patch, call, ANY\nimport tempfile\nimport os\nimport pickle\nimport shutil\n\nfrom controller.scan import RemoteScanner, ScannerError\nfrom ssh import SshcpError\nfrom common import Localization\n\n\nclass TestRemoteScanner(unittest.TestCase):\n    temp_dir = None\n    temp_scan_script = None\n\n    def setUp(self):\n        ssh_patcher = patch('controller.scan.remote_scanner.Sshcp')\n        self.addCleanup(ssh_patcher.stop)\n        self.mock_ssh_cls = ssh_patcher.start()\n        self.mock_ssh = self.mock_ssh_cls.return_value\n\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Ssh to return mangled binary by default\n        self.mock_ssh.shell.return_value = b'error'\n\n    @classmethod\n    def setUpClass(cls):\n        TestRemoteScanner.temp_dir = tempfile.mkdtemp(prefix=\"test_remote_scanner\")\n        TestRemoteScanner.temp_scan_script = os.path.join(TestRemoteScanner.temp_dir, \"script\")\n        with open(TestRemoteScanner.temp_scan_script, \"w\") as f:\n            f.write(\"\")\n\n    @classmethod\n    def tearDownClass(cls):\n        shutil.rmtree(TestRemoteScanner.temp_dir)\n\n    def test_correctly_initializes_ssh(self):\n        self.ssh_args = {}\n\n        def mock_ssh_ctor(**kwargs):\n            self.ssh_args = kwargs\n\n        self.mock_ssh_cls.side_effect = mock_ssh_ctor\n\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.assertIsNotNone(scanner)\n        self.assertEqual(\"my remote address\", self.ssh_args[\"host\"])\n        self.assertEqual(1234, self.ssh_args[\"port\"])\n        self.assertEqual(\"my remote user\", self.ssh_args[\"user\"])\n        self.assertEqual(\"my password\", self.ssh_args[\"password\"])\n\n    def test_installs_scan_script_on_first_scan(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # first try\n                return \"\".encode()\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        self.mock_ssh.copy.assert_called_once_with(\n            local_path=TestRemoteScanner.temp_scan_script,\n            remote_path=\"/remote/path/to/scan/script\"\n        )\n        self.mock_ssh.copy.reset_mock()\n\n        # should not be called the second time\n        scanner.scan()\n        self.mock_ssh.copy.assert_not_called()\n\n    def test_copy_appends_scanfs_name_to_remote_path(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # first try\n                return \"\".encode()\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        # check for appended path ('script')\n        self.mock_ssh.copy.assert_called_once_with(\n            local_path=TestRemoteScanner.temp_scan_script,\n            remote_path=\"/remote/path/to/scan/script\"\n        )\n\n    def test_calls_correct_ssh_md5sum_command(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # first try\n                return \"\".encode()\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        self.assertEqual(2, self.mock_ssh.shell.call_count)\n        self.mock_ssh.shell.assert_has_calls([\n            call(\"md5sum /remote/path/to/scan/script | awk '{print $1}' || echo\"),\n            call(ANY)\n        ])\n\n    def test_skips_install_on_md5sum_match(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns empty on md5sum, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # first try\n                return \"d41d8cd98f00b204e9800998ecf8427e\".encode()\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        self.mock_ssh.copy.assert_not_called()\n        self.mock_ssh.copy.reset_mock()\n\n        # should not be called the second time either\n        scanner.scan()\n        self.mock_ssh.copy.assert_not_called()\n\n    def test_installs_scan_script_on_any_md5sum_output(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # first try\n                return \"some output from md5sum\".encode()\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        self.mock_ssh.copy.assert_called_once_with(\n            local_path=TestRemoteScanner.temp_scan_script,\n            remote_path=\"/remote/path/to/scan/script\"\n        )\n        self.mock_ssh.copy.reset_mock()\n\n    def test_raises_nonrecoverable_error_on_md5sum_error(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                raise SshcpError(\"an ssh error\")\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(Localization.Error.REMOTE_SERVER_INSTALL.format(\"an ssh error\"), str(ctx.exception))\n        self.assertFalse(ctx.exception.recoverable)\n\n    def test_calls_correct_ssh_scan_command(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh returns error for md5sum check, empty pickle dump for later commands\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                return b''\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()\n        self.assertEqual(2, self.mock_ssh.shell.call_count)\n        self.mock_ssh.shell.assert_called_with(\n            \"'/remote/path/to/scan/script' '/remote/path/to/scan'\"\n        )\n\n    def test_raises_nonrecoverable_error_on_first_failed_ssh(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh run command fails the first time\n        # noinspection PyUnusedLocal\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                return b''\n            elif self.ssh_run_command_count == 2:\n                # first try\n                raise SshcpError(\"an ssh error\")\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(Localization.Error.REMOTE_SERVER_SCAN.format(\"an ssh error\"), str(ctx.exception))\n        self.assertFalse(ctx.exception.recoverable)\n\n    def test_raises_recoverable_error_on_subsequent_failed_ssh(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh run command succeeds first time, raises error the second time\n        # noinspection PyUnusedLocal\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                return b''\n            elif self.ssh_run_command_count == 2:\n                # first try\n                return pickle.dumps([])\n            elif self.ssh_run_command_count == 3:\n                # second try\n                raise SshcpError(\"an ssh error\")\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()  # no error first time\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(Localization.Error.REMOTE_SERVER_SCAN.format(\"an ssh error\"), str(ctx.exception))\n        self.assertTrue(ctx.exception.recoverable)\n\n    def test_recovers_from_failed_ssh(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh run command succeeds first time, raises error the second time, fine after that\n        # noinspection PyUnusedLocal\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                return b''\n            elif self.ssh_run_command_count == 2:\n                # first try\n                return pickle.dumps([])\n            elif self.ssh_run_command_count == 3:\n                # second try\n                raise SshcpError(\"an ssh error\")\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        scanner.scan()  # no error first time\n        with self.assertRaises(ScannerError):\n            scanner.scan()\n        scanner.scan()\n        self.assertEqual(4, self.mock_ssh.shell.call_count)\n\n    def test_raises_nonrecoverable_error_on_failed_copy(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        # noinspection PyUnusedLocal\n        def ssh_copy(*args, **kwargs):\n            raise SshcpError(\"an scp error\")\n        self.mock_ssh.copy.side_effect = ssh_copy\n\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(Localization.Error.REMOTE_SERVER_INSTALL.format(\"an scp error\"), str(ctx.exception))\n        self.assertFalse(ctx.exception.recoverable)\n\n    def test_raises_nonrecoverable_error_on_mangled_output(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        def ssh_shell(*args):\n            return \"mangled data\".encode()\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(Localization.Error.REMOTE_SERVER_SCAN.format(\"Invalid pickled data\"), str(ctx.exception))\n        self.assertFalse(ctx.exception.recoverable)\n\n    def test_raises_nonrecoverable_error_on_failed_scan(self):\n        scanner = RemoteScanner(\n            remote_address=\"my remote address\",\n            remote_username=\"my remote user\",\n            remote_password=\"my password\",\n            remote_port=1234,\n            remote_path_to_scan=\"/remote/path/to/scan\",\n            local_path_to_scan_script=TestRemoteScanner.temp_scan_script,\n            remote_path_to_scan_script=\"/remote/path/to/scan/script\"\n        )\n\n        self.ssh_run_command_count = 0\n\n        # Ssh run command raises error the first time, succeeds the second time\n        # noinspection PyUnusedLocal\n        def ssh_shell(*args):\n            self.ssh_run_command_count += 1\n            if self.ssh_run_command_count == 1:\n                # md5sum check\n                return b''\n            elif self.ssh_run_command_count == 2:\n                # first try\n                raise SshcpError(\"SystemScannerError: something failed\")\n            else:\n                # later tries\n                return pickle.dumps([])\n        self.mock_ssh.shell.side_effect = ssh_shell\n\n        with self.assertRaises(ScannerError) as ctx:\n            scanner.scan()\n        self.assertEqual(\n            Localization.Error.REMOTE_SERVER_SCAN.format(\"SystemScannerError: something failed\"),\n            str(ctx.exception)\n        )\n        self.assertFalse(ctx.exception.recoverable)\n"
  },
  {
    "path": "src/python/tests/unittests/test_controller/test_scan/test_scanner_process.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport multiprocessing\nimport logging\nimport sys\nfrom unittest.mock import MagicMock\n\nimport timeout_decorator\n\nfrom controller import IScanner, ScannerProcess, ScannerError\nfrom system import SystemFile\n\n\nclass DummyScanner(IScanner):\n    def scan(self):\n        return []\n\n    def set_base_logger(self, base_logger: logging.Logger):\n        pass\n\n\nclass TestScannerProcess(unittest.TestCase):\n    def setUp(self):\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Assign process to this variable so that it can be cleaned up\n        # even after an error\n        self.process = None\n\n    def tearDown(self):\n        if self.process:\n            self.process.terminate()\n\n    @timeout_decorator.timeout(10)\n    def test_retrieves_scan_results(self):\n        # Use this as a signal to mock to control which result to send\n        self.scan_signal = multiprocessing.Value('i', 0)\n        self.scan_counter = multiprocessing.Value('i', 0)\n\n        a = SystemFile(\"a\", 100, True)\n        aa = SystemFile(\"aa\", 60, False)\n        a.add_child(aa)\n        ab = SystemFile(\"ab\", 40, False)\n        a.add_child(ab)\n\n        b = SystemFile(\"b\", 10, True)\n        ba = SystemFile(\"ba\", 10, True)\n        b.add_child(ba)\n        baa = SystemFile(\"baa\", 10, False)\n        ba.add_child(baa)\n\n        c = SystemFile(\"c\", 1234, False)\n\n        mock_scanner = DummyScanner()\n        mock_scanner.scan = MagicMock()\n\n        def _scan():\n            ret = None\n            if self.scan_signal.value == 0:\n                ret = [a]\n            elif self.scan_signal.value == 1:\n                ret = [a, b]\n            elif self.scan_signal.value == 2:\n                ret = [c]\n            elif self.scan_signal.value == 3:\n                ret = []\n            self.scan_counter.value += 1\n            return ret\n        mock_scanner.scan.side_effect = _scan\n\n        self.process = ScannerProcess(scanner=mock_scanner,\n                                      interval_in_ms=100)\n        self.process.start()\n\n        # wait for first call to scan (actually second call to guarantee first scan is queued)\n        while self.scan_counter.value < 2:\n            pass\n        result = self.process.pop_latest_result()\n        self.assertEqual(1, len(result.files))\n        self.assertEqual(\"a\", result.files[0].name)\n        self.assertEqual(True, result.files[0].is_dir)\n        self.assertEqual(100, result.files[0].size)\n        self.assertEqual(2, len(result.files[0].children))\n        self.assertEqual(\"aa\", result.files[0].children[0].name)\n        self.assertEqual(False, result.files[0].children[0].is_dir)\n        self.assertEqual(60, result.files[0].children[0].size)\n        self.assertEqual(\"ab\", result.files[0].children[1].name)\n        self.assertEqual(False, result.files[0].children[1].is_dir)\n        self.assertEqual(40, result.files[0].children[1].size)\n\n        # signal for scan #1 and wait scan fetch\n        self.scan_signal.value = 1\n        orig_counter = self.scan_counter.value\n        while self.scan_counter.value < orig_counter+2:\n            pass\n        result = self.process.pop_latest_result()\n        self.assertEqual(2, len(result.files))\n        self.assertEqual(\"a\", result.files[0].name)\n        self.assertEqual(True, result.files[0].is_dir)\n        self.assertEqual(100, result.files[0].size)\n        self.assertEqual(2, len(result.files[0].children))\n        self.assertEqual(\"aa\", result.files[0].children[0].name)\n        self.assertEqual(False, result.files[0].children[0].is_dir)\n        self.assertEqual(60, result.files[0].children[0].size)\n        self.assertEqual(\"ab\", result.files[0].children[1].name)\n        self.assertEqual(False, result.files[0].children[1].is_dir)\n        self.assertEqual(40, result.files[0].children[1].size)\n        self.assertEqual(\"b\", result.files[1].name)\n        self.assertEqual(True, result.files[1].is_dir)\n        self.assertEqual(10, result.files[1].size)\n        self.assertEqual(1, len(result.files[1].children))\n        self.assertEqual(\"ba\", result.files[1].children[0].name)\n        self.assertEqual(True, result.files[1].children[0].is_dir)\n        self.assertEqual(10, result.files[1].children[0].size)\n        self.assertEqual(1, len(result.files[1].children[0].children))\n        self.assertEqual(\"baa\", result.files[1].children[0].children[0].name)\n        self.assertEqual(False, result.files[1].children[0].children[0].is_dir)\n        self.assertEqual(10, result.files[1].children[0].children[0].size)\n\n        # signal for scan #2 and wait scan fetch\n        self.scan_signal.value = 2\n        orig_counter = self.scan_counter.value\n        while self.scan_counter.value < orig_counter+2:\n            pass\n        result = self.process.pop_latest_result()\n        self.assertEqual(1, len(result.files))\n        self.assertEqual(\"c\", result.files[0].name)\n        self.assertEqual(False, result.files[0].is_dir)\n        self.assertEqual(1234, result.files[0].size)\n\n        # signal for scan #3 and wait scan fetch\n        self.scan_signal.value = 3\n        orig_counter = self.scan_counter.value\n        while self.scan_counter.value < orig_counter+2:\n            pass\n        result = self.process.pop_latest_result()\n        self.assertEqual(0, len(result.files))\n\n    @timeout_decorator.timeout(10)\n    def test_sends_error_result_on_recoverable_error(self):\n        mock_scanner = DummyScanner()\n        mock_scanner.scan = MagicMock()\n        mock_scanner.scan.side_effect = ScannerError(\"recoverable error\", recoverable=True)\n\n        self.process = ScannerProcess(scanner=mock_scanner,\n                                      interval_in_ms=100)\n        self.process.start()\n\n        while True:\n            result = self.process.pop_latest_result()\n            if result:\n                break\n        self.assertEqual(0, len(result.files))\n        self.assertTrue(result.failed)\n        self.assertEqual(\"recoverable error\", result.error_message)\n\n    @timeout_decorator.timeout(10)\n    def test_sends_fatal_exception_on_nonrecoverable_error(self):\n        mock_scanner = DummyScanner()\n        mock_scanner.scan = MagicMock()\n        mock_scanner.scan.side_effect = ScannerError(\"non-recoverable error\", recoverable=False)\n\n        self.process = ScannerProcess(scanner=mock_scanner,\n                                      interval_in_ms=100)\n        self.process.start()\n        with self.assertRaises(ScannerError) as ctx:\n            while True:\n                self.process.propagate_exception()\n        # noinspection PyUnreachableCode\n        self.assertEqual(\"non-recoverable error\", str(ctx.exception))\n"
  },
  {
    "path": "src/python/tests/unittests/test_lftp/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_lftp/test_job_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\n\nfrom lftp import LftpJobStatus\n\n\nclass TestLftpJobStatus(unittest.TestCase):\n    def test_id(self):\n        status = LftpJobStatus(job_id=42,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        self.assertEqual(42, status.id)\n\n    def test_type(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        self.assertEqual(LftpJobStatus.Type.MIRROR, status.type)\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.PGET,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        self.assertEqual(LftpJobStatus.Type.PGET, status.type)\n\n    def test_state(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        self.assertEqual(LftpJobStatus.State.QUEUED, status.state)\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.RUNNING,\n                               name=\"\",\n                               flags=\"\")\n        self.assertEqual(LftpJobStatus.State.RUNNING, status.state)\n\n    def test_name(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"hello\",\n                               flags=\"\")\n        self.assertEqual(\"hello\", status.name)\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"bye\",\n                               flags=\"\")\n        self.assertEqual(\"bye\", status.name)\n\n    def test_total_transfer_state(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.RUNNING,\n                               name=\"\",\n                               flags=\"\")\n        status.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 0, 0)\n        self.assertEqual(LftpJobStatus.TransferState(10, 20, 50, 0, 0), status.total_transfer_state)\n        status.total_transfer_state = LftpJobStatus.TransferState(15, 20, 75, 0, 0)\n        self.assertEqual(LftpJobStatus.TransferState(15, 20, 75, 0, 0), status.total_transfer_state)\n\n    def test_total_transfer_state_fails_on_queued(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        with self.assertRaises(TypeError) as context:\n            status.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 0, 0)\n        self.assertTrue(\"Cannot set transfer state on job of type queue\" in str(context.exception))\n\n    def test_active_transfer_state(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.RUNNING,\n                               name=\"\",\n                               flags=\"\")\n        status.add_active_file_transfer_state(\"a\", LftpJobStatus.TransferState(10, 20, 50, 0, 0))\n        status.add_active_file_transfer_state(\"b\", LftpJobStatus.TransferState(25, 100, 25, 0, 0))\n        self.assertEqual({(\"a\", LftpJobStatus.TransferState(10, 20, 50, 0, 0)),\n                          (\"b\", LftpJobStatus.TransferState(25, 100, 25, 0, 0))},\n                         set(status.get_active_file_transfer_states()))\n\n    def test_active_transfer_state_fails_on_queued(self):\n        status = LftpJobStatus(job_id=-1,\n                               job_type=LftpJobStatus.Type.MIRROR,\n                               state=LftpJobStatus.State.QUEUED,\n                               name=\"\",\n                               flags=\"\")\n        with self.assertRaises(TypeError) as context:\n            status.add_active_file_transfer_state(\"filename\", LftpJobStatus.TransferState(10, 20, 50, 0, 0))\n        self.assertTrue(\"Cannot set transfer state on job of type queue\" in str(context.exception))\n\n    def test_equality_operator(self):\n        s1 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s1.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s1.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s1.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n\n        # test equality\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n        self.assertTrue(s1 == s2)\n\n        # test equality - different order of active file transfer state\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        self.assertTrue(s1 == s2)\n\n        # inequality - job id\n        s2 = LftpJobStatus(job_id=2,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n        self.assertFalse(s1 == s2)\n\n        # inequality - job type\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.PGET,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n        self.assertFalse(s1 == s2)\n\n        # inequality - job state\n        s1_q = LftpJobStatus(job_id=3,\n                             job_type=LftpJobStatus.Type.MIRROR,\n                             state=LftpJobStatus.State.QUEUED,\n                             name=\"name\",\n                             flags=\"flags\")\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        self.assertFalse(s1_q == s2)\n\n        # inequality - job total transfer state\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 3)\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 0))\n        self.assertFalse(s1 == s2)\n\n        # inequality - active file transfer state\n        s2 = LftpJobStatus(job_id=3,\n                           job_type=LftpJobStatus.Type.MIRROR,\n                           state=LftpJobStatus.State.RUNNING,\n                           name=\"name\",\n                           flags=\"flags\")\n        s2.total_transfer_state = LftpJobStatus.TransferState(10, 20, 50, 1, 2)\n        s2.add_active_file_transfer_state(\"aa\", LftpJobStatus.TransferState(1, 2, 3, 4, 5))\n        s2.add_active_file_transfer_state(\"ab\", LftpJobStatus.TransferState(6, 7, 8, 9, 10))\n        self.assertFalse(s1 == s2)\n"
  },
  {
    "path": "src/python/tests/unittests/test_lftp/test_job_status_parser.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\n\nfrom lftp import LftpJobStatusParser, LftpJobStatus, LftpJobStatusParserError\n\n\n# noinspection PyPep8\nclass TestLftpJobStatusParser(unittest.TestCase):\n    def setUp(self):\n        # Show full diff\n        self.maxDiff = None\n\n    def test_size_to_bytes(self):\n        self.assertEqual(345, LftpJobStatusParser._size_to_bytes(\"345\"))\n        self.assertEqual(1000, LftpJobStatusParser._size_to_bytes(\"1000b\"))\n        self.assertEqual(1000, LftpJobStatusParser._size_to_bytes(\"1000 b\"))\n        self.assertEqual(1000, LftpJobStatusParser._size_to_bytes(\"1000B\"))\n        self.assertEqual(1024, LftpJobStatusParser._size_to_bytes(\"1kb\"))\n        self.assertEqual(1024, LftpJobStatusParser._size_to_bytes(\"1 kb\"))\n        self.assertEqual(1536, LftpJobStatusParser._size_to_bytes(\"1.5kb\"))\n        self.assertEqual(2048, LftpJobStatusParser._size_to_bytes(\"2KiB\"))\n        self.assertEqual(1048576, LftpJobStatusParser._size_to_bytes(\"1mb\"))\n        self.assertEqual(1048576, LftpJobStatusParser._size_to_bytes(\"1 mb\"))\n        self.assertEqual(1572864, LftpJobStatusParser._size_to_bytes(\"1.5mb\"))\n        self.assertEqual(2097152, LftpJobStatusParser._size_to_bytes(\"2MiB\"))\n        self.assertEqual(1073741824, LftpJobStatusParser._size_to_bytes(\"1gb\"))\n        self.assertEqual(1073741824, LftpJobStatusParser._size_to_bytes(\"1 gb\"))\n        self.assertEqual(1610612736, LftpJobStatusParser._size_to_bytes(\"1.5gb\"))\n        self.assertEqual(2147483648, LftpJobStatusParser._size_to_bytes(\"2GiB\"))\n\n    def test_eta_to_seconds(self):\n        self.assertEqual(100, LftpJobStatusParser._eta_to_seconds(\"100s\"))\n        self.assertEqual(100*60, LftpJobStatusParser._eta_to_seconds(\"100m\"))\n        self.assertEqual(100*60*60, LftpJobStatusParser._eta_to_seconds(\"100h\"))\n        self.assertEqual(100*24*60*60, LftpJobStatusParser._eta_to_seconds(\"100d\"))\n        self.assertEqual(1*24*60*60+1, LftpJobStatusParser._eta_to_seconds(\"1d1s\"))\n        self.assertEqual(1*24*60*60+1*60, LftpJobStatusParser._eta_to_seconds(\"1d1m\"))\n        self.assertEqual(1*24*60*60+1*60*60, LftpJobStatusParser._eta_to_seconds(\"1d1h\"))\n        self.assertEqual(1*24*60*60+1*60*60+1*60+1, LftpJobStatusParser._eta_to_seconds(\"1d1h1m1s\"))\n        self.assertEqual(1*60*60+1*60+1, LftpJobStatusParser._eta_to_seconds(\"1h1m1s\"))\n        self.assertEqual(1*60+1, LftpJobStatusParser._eta_to_seconds(\"1m1s\"))\n\n    def test_empty_output_1(self):\n        output = \"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        self.assertEqual(0, len(statuses))\n\n    def test_empty_output_2(self):\n        output = \"\"\"\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        self.assertEqual(0, len(statuses))\n\n    def test_empty_output_3(self):\n        output = \"\"\"\n        [1] Done (queue (sftp://someone:@localhost))\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        self.assertEqual(0, len(statuses))\n\n    def test_empty_output_4(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        [0] Done (queue (sftp://someone:@localhost))\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        self.assertEqual(0, len(statuses))\n\n    def test_queued_items(self):\n        \"\"\"Queued items, no jobs running\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)\n        sftp://someone:@localhost/home/someone\n        Queue is stopped.\n        Commands queued:\n         1. mirror -c /tmp/test_lftp/remote/a /tmp/test_lftp/local/\n         2. pget -c /tmp/test_lftp/remote/c -o /tmp/test_lftp/local/\n         3. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n         4. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n         5. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"a\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=3,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=4,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=5,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\")\n        ]\n        self.assertEqual(len(golden), len(statuses))\n        self.assertEqual(golden, statuses)\n\n    def test_queued_items_with_quotes(self):\n        \"\"\"Queue with quotes\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)\n        sftp://someone:@localhost/home/someone\n        Queue is stopped.\n        Commands queued:\n         1. mirror -c \"/tmp/test_lftp/remote/b s s\" /tmp/test_lftp/local/\n         2. pget -c \"/tmp/test_lftp/remote/a s s\" -o /tmp/test_lftp/local/\n         3. mirror -c \"/tmp/test_lftp/remote/b s s\" \"/tmp/test_lftp/local/\"\n         4. pget -c \"/tmp/test_lftp/remote/a s s\" -o \"/tmp/test_lftp/local/\"\n         5. mirror -c /tmp/test_lftp/remote/b \"/tmp/test_lftp/local/\"\n         6. pget -c /tmp/test_lftp/remote/a -o \"/tmp/test_lftp/local/\"\n         7. mirror -c \"/tmp/test_lftp/remote//b\" \"/tmp/test_lftp/local/\"\n         8. pget -c \"/tmp/test_lftp/remote//a\" -o \"/tmp/test_lftp/local/\"\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b s s\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"a s s\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=3,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b s s\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=4,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"a s s\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=5,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=6,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"a\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=7,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=8,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"a\",\n                          flags=\"-c\"),\n        ]\n        self.assertEqual(len(golden), len(statuses))\n        self.assertEqual(golden, statuses)\n\n    def test_queue_and_jobs_1(self):\n        \"\"\"Queued items, parallel jobs running, multiple files, multiple chunks\"\"\"\n        output = \"\"\"\n        [1] queue (sftp://someone:@localhost)  -- 15.8 KiB/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [2] mirror -c /tmp/test_lftp/remote/a /tmp/test_lftp/local/ -- 17k/26M (0%) 5.0 KiB/s\n                -[3] mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/ -- 35k/394k (8%) 10.8 KiB/s\n        Commands queued:\n         1. pget -c /tmp/test_lftp/remote/c -o /tmp/test_lftp/local/\n         2. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n         3. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n        [2] mirror -c /tmp/test_lftp/remote/a /tmp/test_lftp/local/  -- 17k/26M (0%) 5.0 KiB/s\n        \\\\transfer `aa'\n        `aa' at 2976 (12%) 997b/s eta:22s [Receiving data]\n        \\\\transfer `ab'\n        `ab', got 13733 of 25165824 (0%) 4.0K/s eta:1h45m\n        \\chunk 0-6291456\n        `ab' at 4362 (0%) 1.1K/s eta:92m [Receiving data]\n        \\chunk 18874368-25165823\n        `ab' at 18877569 (0%) 1001b/s eta:1h45m [Receiving data]\n        \\chunk 12582912-18874367\n        `ab' at 12585895 (0%) 997b/s eta:1h45m [Receiving data]\n        \\chunk 6291456-12582911\n        `ab' at 6294643 (0%) 999b/s eta:1h45m [Receiving data]\n        [3] mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/  -- 35k/394k (8%) 10.8 KiB/s\n        \\\\transfer `bb'\n        `bb', got 12333 of 131072 (9%) 3.9K/s eta:30s\n        \\chunk 0-32768\n        `bb' at 2970 (2%) 996b/s eta:30s [Receiving data]\n        \\chunk 98304-131071\n        `bb' at 101288 (9%) 998b/s eta:30s [Receiving data]\n        \\chunk 65536-98303\n        `bb' at 68727 (9%) 1001b/s eta:30s [Receiving data]\n        \\chunk 32768-65535\n        `bb' at 35956 (9%) 998b/s eta:30s [Receiving data]\n        \\mirror `ba'  -- 23k/263k (8%) 6.9 KiB/s\n       \\\\transfer `ba/baa'\n        `baa', got 9342 of 131072 (7%) 2.9K/s\n        \\chunk 0-32768\n        `baa' at 3192 (2%) 998b/s eta:30s [Receiving data]\n        \\chunk 98304-131071\n        `baa' at 98304 (0%) [ssh_exchange_identification: Connection closed by remote host]\n        \\chunk 65536-98303\n        `baa' at 68721 (9%) 998b/s eta:30s [Receiving data]\n        \\chunk 32768-65535\n        `baa' at 35733 (9%) 993b/s eta:30s [Receiving data]\n        \\\\transfer `ba/bab'\n        `bab', got 13128 of 131072 (10%) 4.0K/s eta:30s\n        \\chunk 0-32768\n        `bab' at 4170 (3%) 1.1K/s eta:26s [Receiving data]\n        \\chunk 98304-131071\n        `bab' at 101297 (9%) 1001b/s eta:30s [Receiving data]\n        \\chunk 65536-98303\n        `bab' at 68525 (9%) 999b/s eta:30s [Receiving data]\n        \\chunk 32768-65535\n        `bab' at 35744 (9%) 997b/s eta:30s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=3,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(17*1024, 26*1024*1024, 0, 5*1024, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\", LftpJobStatus.TransferState(None, None, None, 997, 22)\n        )\n        golden_job1.add_active_file_transfer_state(\n            \"ab\", LftpJobStatus.TransferState(13733, 25165824, 0, 4*1024, 1*3600+45*60)\n        )\n        golden_job2 = LftpJobStatus(job_id=3,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"b\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(35*1024, 394*1024, 8, 11059, None)\n        golden_job2.add_active_file_transfer_state(\n            \"bb\", LftpJobStatus.TransferState(12333, 131072, 9, 3993, 30)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"ba/baa\", LftpJobStatus.TransferState(9342, 131072, 7, 2969, None)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"ba/bab\", LftpJobStatus.TransferState(13128, 131072, 10, 4096, 30)\n        )\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_queue_and_jobs_2(self):\n        \"\"\"Queued items, parallel jobs running, multiple files, multiple chunks\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 15.6 KiB/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp/remote/a /tmp/test_lftp/local/ -- 152k/26M (0%) 3.9 KiB/s\n                -[2] mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/ -- 350k/394k (88%) 11.7 KiB/s\n        Commands queued:\n         1. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n         2. mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/\n        [1] mirror -c /tmp/test_lftp/remote/a /tmp/test_lftp/local/  -- 152k/26M (0%) 3.9 KiB/s\n        \\\\transfer `ab'\n        `ab', got 126558 of 25165824 (0%) 3.9K/s eta:1h45m\n        \\chunk 0-6291456\n        `ab' at 32115 (0%) 1006b/s eta:1h43m [Receiving data]\n        \\chunk 18874368-25165823\n        `ab' at 18906710 (0%) 1007b/s eta:1h43m [Receiving data]\n        \\chunk 12582912-18874367\n        `ab' at 12614060 (0%) 998b/s eta:1h45m [Receiving data]\n        \\chunk 6291456-12582911\n        `ab' at 6322409 (0%) 998b/s eta:1h45m [Receiving data]\n        [2] mirror -c /tmp/test_lftp/remote/b /tmp/test_lftp/local/  -- 350k/394k (88%) 11.7 KiB/s\n        \\\\transfer `bb'\n        `bb', got 124150 of 131072 (94%) 3.9K/s eta:2s\n        \\chunk 0-32768\n        `bb' at 30932 (23%) 997b/s eta:2s [Receiving data]\n        \\chunk 98304-131071\n        `bb' at 129447 (95%) 998b/s eta:2s [Receiving data]\n        \\chunk 65536-98303\n        `bb' at 96690 (95%) 998b/s eta:2s [Receiving data]\n        \\chunk 32768-65535\n        `bb' at 63689 (94%) 997b/s eta:2s [Receiving data]\n        \\mirror `ba'  -- 225k/263k (85%) 7.8 KiB/s\n        \\\\transfer `ba/baa'\n        `baa', got 123531 of 131072 (94%) 3.9K/s eta:2s\n        \\chunk 0-32768\n        `baa' at 30944 (23%) 998b/s eta:2s [Receiving data]\n        \\chunk 98304-131071\n        `baa' at 129234 (94%) 997b/s eta:2s [Receiving data]\n        \\chunk 65536-98303\n        `baa' at 96253 (93%) 998b/s eta:2s [Receiving data]\n        \\chunk 32768-65535\n        `baa' at 63708 (94%) 997b/s eta:2s [Receiving data]\n        \\\\transfer `ba/bab'\n        `bab', got 101391 of 131072 (77%) 3.9K/s eta:26s\n        \\chunk 0-32768\n        `bab' at 31890 (24%) 1003b/s eta:1s [Receiving data]\n        \\chunk 98304-131071\n        `bab' at 129233 (94%) 997b/s eta:2s [Receiving data]\n        \\chunk 65536-98303\n        `bab' at 96253 (93%) 997b/s eta:2s [Receiving data]\n        \\chunk 32768-65535\n        `bab' at 40623 (23%) 960b/s eta:26s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(152*1024, 26*1024*1024, 0, 3993, None)\n        golden_job1.add_active_file_transfer_state(\n            \"ab\", LftpJobStatus.TransferState(126558, 25165824, 0, 3993, 1*3600+45*60)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"b\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(350*1024, 394*1024, 88, 11980, None)\n        golden_job2.add_active_file_transfer_state(\n            \"bb\", LftpJobStatus.TransferState(124150, 131072, 94, 3993, 2)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"ba/baa\", LftpJobStatus.TransferState(123531, 131072, 94, 3993, 2)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"ba/bab\", LftpJobStatus.TransferState(101391, 131072, 77, 3993, 26)\n        )\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_queue_and_jobs_3(self):\n        \"\"\"Queued items, parallel jobs running, 'cd' line in queued pget\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_n_l73hx8/remote/a /tmp/test_lftp_n_l73hx8/local/\n        -[2] pget -c /tmp/test_lftp_n_l73hx8/remote/d d -o /tmp/test_lftp_n_l73hx8/local/\n        Commands queued:\n        1.  mirror -c \"/tmp/test_lftp_n_l73hx8/remote/b\"  \"/tmp/test_lftp_n_l73hx8/local/\" \n        2.  pget -c \"/tmp/test_lftp_n_l73hx8/remote/c\" -o \"/tmp/test_lftp_n_l73hx8/local/\" \n        cd /home/someone\n        3.  mirror -c \"/tmp/test_lftp_n_l73hx8/remote/e e\"  \"/tmp/test_lftp_n_l73hx8/local/\" \n        [1] mirror -c /tmp/test_lftp_n_l73hx8/remote/a /tmp/test_lftp_n_l73hx8/local/ \n        Getting file list (10) [Receiving data]\n        [2] pget -c /tmp/test_lftp_n_l73hx8/remote/d d -o /tmp/test_lftp_n_l73hx8/local/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp_n_l73hx8/remote/d d' at 10 (0%) [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"b\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=3,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"e e\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"d d\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_queue_and_jobs_4(self):\n        \"\"\"Queued items, parallel jobs running, '\\mirror' line with 'Getting file list'\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_controller_zph2s53/remote/ra /tmp/test_controller_zph2s53/local/ -- 0/1.1k (0%)\n        -[2] mirror -c /tmp/test_controller_zph2s53/remote/rb /tmp/test_controller_zph2s53/local/ -- 20/9.3k (0%)\n        Commands queued:\n        1.  pget -c \"/tmp/test_controller_zph2s53/remote/rc\" -o \"/tmp/test_controller_zph2s53/local/\" \n        [1] mirror -c /tmp/test_controller_zph2s53/remote/ra /tmp/test_controller_zph2s53/local/  -- 0/1.1k (0%)\n        \\\\transfer `raa' \n        `raa' at 0 (0%) [Connecting...]\n        \\mirror `rab' \n        rab: Getting file list (27) [Receiving data]\n        [2] mirror -c /tmp/test_controller_zph2s53/remote/rb /tmp/test_controller_zph2s53/local/  -- 20/9.3k (0%)\n        \\\\transfer `rba' \n        `rba' at 0 (0%) [Connecting...]\n        \\\\transfer `rbb' \n        `rbb' at 0 (0%) [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"rc\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"ra\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(0, 1126, 0, None, None)\n        golden_job1.add_active_file_transfer_state(\"raa\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"rb\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(20, 9523, 0, None, None)\n        golden_job2.add_active_file_transfer_state(\"rba\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job2.add_active_file_transfer_state(\"rbb\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_queue_and_jobs_5(self):\n        \"\"\"Queued items, parallel jobs running, '\\mirror' line with 'cd'\"\"\"\n        # noinspection PyPep8\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_controllerw0sbqxe_/remote/ra /tmp/test_controllerw0sbqxe_/local/ -- 0/1.1k (0%)\n        -[2] mirror -c /tmp/test_controllerw0sbqxe_/remote/rb /tmp/test_controllerw0sbqxe_/local/ -- 49/9.3k (0%)\n        Commands queued:\n        1.  pget -c \"/tmp/test_controllerw0sbqxe_/remote/rc\" -o \"/tmp/test_controllerw0sbqxe_/local/\" \n        [1] mirror -c /tmp/test_controllerw0sbqxe_/remote/ra /tmp/test_controllerw0sbqxe_/local/  -- 0/1.1k (0%)\n        \\\\transfer `raa' \n        `raa' at 0 (0%) [Connecting...]\n        \\mirror `rab' \n        cd `/tmp/test_controllerw0sbqxe_/remote/ra/rab' [Connecting...]\n        [2] mirror -c /tmp/test_controllerw0sbqxe_/remote/rb /tmp/test_controllerw0sbqxe_/local/  -- 49/9.3k (0%)\n        \\\\transfer `rba' \n        `rba' at 0 (0%) [Receiving data]\n        \\\\transfer `rbb' \n        `rbb' at 0 (0%) [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"rc\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"ra\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(0, 1126, 0, None, None)\n        golden_job1.add_active_file_transfer_state(\"raa\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"rb\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(49, 9523, 0, None, None)\n        golden_job2.add_active_file_transfer_state(\"rba\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job2.add_active_file_transfer_state(\"rbb\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_queue_and_jobs_6(self):\n        \"\"\"Queued items, parallel jobs running, '\\mirror' line with no units for local_size\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 252 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_controllerbsn4wlu2/remote/ra /tmp/test_controllerbsn4wlu2/local/ -- 249/8.2k (3%) 100 B/s\n        -[2] mirror -c /tmp/test_controllerbsn4wlu2/remote/rb /tmp/test_controllerbsn4wlu2/local/ -- 374/9.3k (4%) 153 B/s\n        Commands queued:\n        1.  pget -c \"/tmp/test_controllerbsn4wlu2/remote/rc\" -o \"/tmp/test_controllerbsn4wlu2/local/\" \n        [1] mirror -c /tmp/test_controllerbsn4wlu2/remote/ra /tmp/test_controllerbsn4wlu2/local/  -- 249/8.2k (3%) 100 B/s\n        \\\\transfer `raa' \n        `raa' at 238 (23%) 100b/s eta:8s [Receiving data]\n        \\mirror `rab'  -- 0/7.2k (0%)\n        \\\\transfer `rab/raba' \n        `raba' at 0 (0%) [Connecting...]\n        \\\\transfer `rab/rabb' \n        `rabb' at 0 (0%) [Waiting for response...]\n        [2] mirror -c /tmp/test_controllerbsn4wlu2/remote/rb /tmp/test_controllerbsn4wlu2/local/  -- 374/9.3k (4%) 153 B/s\n        \\\\transfer `rba' \n        `rba' at 159 (3%) 77b/s eta:51s [Receiving data]\n        \\\\transfer `rbb' \n        `rbb' at 153 (2%) 76b/s eta:66s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"rc\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"ra\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(249, 8396, 3, 100, None)\n        golden_job1.add_active_file_transfer_state(\"raa\", LftpJobStatus.TransferState(None, None, None, 100, 8))\n        golden_job1.add_active_file_transfer_state(\"rab/raba\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job1.add_active_file_transfer_state(\"rab/rabb\", LftpJobStatus.TransferState(None, None, None, None, None))\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"rb\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(374, 9523, 4, 153, None)\n        golden_job2.add_active_file_transfer_state(\"rba\", LftpJobStatus.TransferState(None, None, None, 77, 51))\n        golden_job2.add_active_file_transfer_state(\"rbb\", LftpJobStatus.TransferState(None, None, None, 76, 66))\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_1(self):\n        \"\"\"1 job, 1 file, no chunks\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] pget -c /tmp/test_lftp/remote/c -o /tmp/test_lftp/local/\n        [1] pget -c /tmp/test_lftp/remote/c -o /tmp/test_lftp/local/\n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp/remote/c' at 4585 (3%) 1.2K/s eta:2m [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"c\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 1228, 2*60)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_2(self):\n        \"\"\"1 job, 1 dir, no units in local size\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 90 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/ -- 345/26M (0%) 90 B/s\n        [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/  -- 345/26M (0%) 90 B/s\n        \\\\transfer `aa' \n        `aa' at 315 (1%) 90b/s eta:4m [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(345, 26*1024*1024, 0, 90, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\", LftpJobStatus.TransferState(None, None, None, 90, 4*60)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_3(self):\n        \"\"\"1 job, 1 file, chunks\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        Now executing: [1] pget -c /tmp/test_lftp/remote/A.b.C.rar -o /tmp/lftp/\n        [1] pget -c /tmp/test_lftp/remote/A.b.C.rar -o /tmp/lftp/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp/remote/A.b.C.rar', got 2622559389 of 3274103236 (80%) \n        \\chunk 0-2752841944\n        `/tmp/test_lftp/remote/A.b.C.rar' at 2622559389 (0%) [Receiving data]\n        \\chunk 3143787913-3274103235 \n        `/tmp/test_lftp/remote/A.b.C.rar' at 3143787913 (0%) [Connecting...]\n        \\chunk 3013472590-3143787912 \n        `/tmp/test_lftp/remote/A.b.C.rar' at 3013472590 (0%) [Connecting...]\n        \\chunk 2883157267-3013472589 \n        `/tmp/test_lftp/remote/A.b.C.rar' at 2883157267 (0%) [Connecting...]\n        \\chunk 2752841944-2883157266 \n        `/tmp/test_lftp/remote/A.b.C.rar' at 2752841944 (0%) [Connecting...]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"A.b.C.rar\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(2622559389, 3274103236, 80, None, None)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_quotes(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp/remote/e e /tmp/test_lftp/local/ -- 0/132k (0%)\n                -[2] pget -c /tmp/test_lftp/remote/d d -o /tmp/test_lftp/local/\n        [1] mirror -c /tmp/test_lftp/remote/e e /tmp/test_lftp/local/  -- 0/132k (0%)\n        \\\\transfer `e e a'\n        `e e a' at 11804 (9%) 1003b/s eta:2m [Receiving data]\n        [2] pget -c /tmp/test_lftp/remote/d d -o /tmp/test_lftp/local/\n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp/remote/d d' at 11982 (9%) 998b/s eta:2m [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"e e\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(0, 132*1024, 0, None, None)\n        golden_job1.add_active_file_transfer_state(\n            \"e e a\", LftpJobStatus.TransferState(None, None, None, 1003, 2*60)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"d d\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 998, 2*60)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_getting_file_list(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp/remote/e e /tmp/test_lftp/local/\n                -[2] pget -c /tmp/test_lftp/remote/d d -o /tmp/test_lftp/local/\n        [1] mirror -c /tmp/test_lftp/remote/e e /tmp/test_lftp/local/\n        Getting file list (25) [Receiving data]\n        [2] pget -c /tmp/test_lftp/remote/d d -o /tmp/test_lftp/local/\n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp/remote/d d' at 23 (0%) [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"e e\",\n                                    flags=\"-c\")\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"d d\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_mirror_empty(self):\n        # '-o' in filename\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 59 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [2] mirror -c /tmp/test_lftp_1d7axxcf/remote/a /tmp/test_lftp_1d7axxcf/local/ -- 100/100 (100%) 59 B/s\n        [2] mirror -c /tmp/test_lftp_1d7axxcf/remote/a /tmp/test_lftp_1d7axxcf/local/  -- 100/100 (100%) 59 B/s\n        \\\\transfer `aa' \n        `aa' at 59 (59%)\n        \\\\mirror `Sample' \n        Sample: \n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(100, 100, 100, 59, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_mirror_mkdir(self):\n        output = \"\"\"        \n        [0] queue (sftp://someone:@localhost:22) \n        sftp://someone:@localhost:22/home/someone\n        Now executing: [1] mirror -c /tmp/test_controllerxnx7xw6x/remote/ra /tmp/test_controllerxnx7xw6x/local/ -- 0/1.1k (0%)\n        [1] mirror -c /tmp/test_controllerxnx7xw6x/remote/ra /tmp/test_controllerxnx7xw6x/local/  -- 0/1.1k (0%)\n        \\\\transfer `raa' \n        `raa' at 0 (0%) [Connecting...]\n        \\mirror `rab' \n        mkdir `/tmp/test_controllerxnx7xw6x/local/ra/rab' []\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"ra\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(0, 1126, 0, None, None)\n        golden_job1.add_active_file_transfer_state(\n            \"raa\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_connecting(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost\n        Now executing: [1] pget -c /tmp/test_lftp_jsecvi6m/remote/c -o /tmp/test_lftp_jsecvi6m/local/\n        [1] pget -c /tmp/test_lftp_jsecvi6m/remote/c -o /tmp/test_lftp_jsecvi6m/local/ \n        sftp://someone:@localhost\n        `/tmp/test_lftp_jsecvi6m/remote/c' at 0 [Connecting...]\n        [2] mirror -c /tmp/test_lftp_yb58ogg6/remote/a /tmp/test_lftp_yb58ogg6/local/ \n        cd `/tmp/test_lftp_yb58ogg6/remote/a' [Connecting...]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"c\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_almost_done(self):\n        \"\"\"Almost done job has a special shorter 'at' line for child file\"\"\"\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 98 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [3] mirror -c /tmp/test_lftp_sbz92f__/remote/c'c'c'c /tmp/test_lftp_sbz92f__/local/ -- 100/100 (100%) 98 B/s\n        [3] mirror -c /tmp/test_lftp_sbz92f__/remote/c'c'c'c /tmp/test_lftp_sbz92f__/local/  -- 100/100 (100%) 98 B/s\n        \\\\transfer `c'''c.txt' \n        `c'''c.txt' at 100 (100%)\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=3,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"c'c'c'c\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(100, 100, 100, 98, None)\n        golden_job1.add_active_file_transfer_state(\n            \"c'''c.txt\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_empty(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost\n        Now executing: [2] mirror -c /tmp/test_lftp_yb58ogg6/remote/a /tmp/test_lftp_yb58ogg6/local/\n        [2] mirror -c /tmp/test_lftp_yb58ogg6/remote/a /tmp/test_lftp_yb58ogg6/local/ \n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_jobs = [golden_job2]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_with_done_line(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 59 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [2] mirror -c /tmp/test_lftp_1d7axxcf/remote/a /tmp/test_lftp_1d7axxcf/local/ -- 100/100 (100%) 59 B/s\n        [2] mirror -c /tmp/test_lftp_1d7axxcf/remote/a /tmp/test_lftp_1d7axxcf/local/  -- 100/100 (100%) 59 B/s\n        \\\\transfer `aa' \n        `aa' at 59 (59%) \n        [0] Done (queue (sftp://someone:@localhost))\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(100, 100, 100, 59, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_missing_pget_data_line(self):\n        output = \"\"\"\n        [0] queue (sftp://seedsynctest:@localhost:22) \n        sftp://seedsynctest:@localhost:22/home/seedsynctest\n        Now executing: [3] mirror -c /tmp/test_lftp_ns99k0im/remote/c -o c /tmp/test_lftp_ns99k0im/local/\n        -[4] pget -c /tmp/test_lftp_ns99k0im/remote/d -o d.txt -o /tmp/test_lftp_ns99k0im/local/\n        [3] mirror -c /tmp/test_lftp_ns99k0im/remote/c -o c /tmp/test_lftp_ns99k0im/local/ \n        Getting file list (162) [Receiving data]\n        [4] pget -c /tmp/test_lftp_ns99k0im/remote/d -o d.txt -o /tmp/test_lftp_ns99k0im/local/ \n        sftp://seedsynctest:@localhost:22/home/seedsynctest\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=3,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"c -o c\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        golden_job2 = LftpJobStatus(job_id=4,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"d -o d.txt\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, None, None)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_raises_error_on_bad_status(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost) \n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_controllerw0sbqxe_/remote/ra /tmp/test_controllerw0sbqxe_/local/ -- 0/1.1k (0%)\n        -[2] mirror -c /tmp/test_controllerw0sbqxe_/remote/rb /tmp/test_controllerw0sbqxe_/local/ -- 49/9.3k (0%)\n        Commands queued:\n        1.  pget -c \"/tmp/test_controllerw0sbqxe_/remote/rc\" -o \"/tmp/test_controllerw0sbqxe_/local/\" \n        bad string uh oh\n        \"\"\"\n        parser = LftpJobStatusParser()\n        with self.assertRaises(LftpJobStatusParserError):\n            parser.parse(output)\n\n    def test_jobs_special_char_1(self):\n        # Apostrophe/single quote\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 18 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_g6z3_el7/remote/aaa'aaa /tmp/test_lftp_g6z3_el7/local/ -- 36/128 (28%) 18 B/s\n        -[2] pget -c /tmp/test_lftp_g6z3_el7/remote/b''b''b.txt -o /tmp/test_lftp_g6z3_el7/local/\n        Commands queued:\n        1.  mirror -c \"/tmp/test_lftp_g6z3_el7/remote/c'c'c'c\"  \"/tmp/test_lftp_g6z3_el7/local/\" \n        2.  pget -c \"/tmp/test_lftp_g6z3_el7/remote/d'''d.txt\" -o \"/tmp/test_lftp_g6z3_el7/local/\" \n        [1] mirror -c /tmp/test_lftp_g6z3_el7/remote/aaa'aaa /tmp/test_lftp_g6z3_el7/local/  -- 36/128 (28%) 18 B/s\n        \\\\transfer `aa'aa'aa.txt' \n        `aa'aa'aa.txt' at 21 (16%) [Receiving data]\n        [2] pget -c /tmp/test_lftp_g6z3_el7/remote/b''b''b.txt -o /tmp/test_lftp_g6z3_el7/local/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp_g6z3_el7/remote/b''b''b.txt' at 210 (82%) 94b/s eta:0s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c'c'c'c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"d'''d.txt\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"aaa'aaa\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(36, 128, 28, 18, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa'aa'aa.txt\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"b''b''b.txt\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 94, 0)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_special_char_2(self):\n        # Double quote\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 12 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_w8d2q1ot/remote/aaa\"aaa /tmp/test_lftp_w8d2q1ot/local/ -- 19/128 (14%) 12 B/s\n        -[2] pget -c /tmp/test_lftp_w8d2q1ot/remote/b\"\"b\"\"b.txt -o /tmp/test_lftp_w8d2q1ot/local/\n        Commands queued:\n        1.  mirror -c \"/tmp/test_lftp_w8d2q1ot/remote/c\\\"c\\\"c\\\"c\"  \"/tmp/test_lftp_w8d2q1ot/local/\" \n        2.  pget -c \"/tmp/test_lftp_w8d2q1ot/remote/d\\\"\\\"\\\"d.txt\" -o \"/tmp/test_lftp_w8d2q1ot/local/\" \n        [1] mirror -c /tmp/test_lftp_w8d2q1ot/remote/aaa\"aaa /tmp/test_lftp_w8d2q1ot/local/  -- 19/128 (14%) 12 B/s\n        \\\\transfer `aa\"aa\"aa.txt' \n        `aa\"aa\"aa.txt' at 16 (12%) [Receiving data]\n        [2] pget -c /tmp/test_lftp_w8d2q1ot/remote/b\"\"b\"\"b.txt -o /tmp/test_lftp_w8d2q1ot/local/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp_w8d2q1ot/remote/b\"\"b\"\"b.txt' at 203 (79%) 29b/s eta:2s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c\\\"c\\\"c\\\"c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"d\\\"\\\"\\\"d.txt\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"aaa\\\"aaa\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(19, 128, 14, 12, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\\\"aa\\\"aa.txt\", LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"b\\\"\\\"b\\\"\\\"b.txt\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 29, 2)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_special_char_3(self):\n        # Mix of single quotes, double quotes and spaces\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 15 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_m9mxjip7/remote/a' aa\"aaa /tmp/test_lftp_m9mxjip7/local/ -- 48/128 (37%) 15 B/s\n        -[2] pget -c /tmp/test_lftp_m9mxjip7/remote/\"b ' \"b\" ' \"b.txt -o /tmp/test_lftp_m9mxjip7/local/\n        Commands queued:\n        1.  mirror -c \"/tmp/test_lftp_m9mxjip7/remote/'c\\\" c \\\" 'c' \\\"c\\\"\"  \"/tmp/test_lftp_m9mxjip7/local/\" \n        2.  pget -c \"/tmp/test_lftp_m9mxjip7/remote/'d\\\" ' \\\" ' \\\"d.txt\" -o \"/tmp/test_lftp_m9mxjip7/local/\" \n        [1] mirror -c /tmp/test_lftp_m9mxjip7/remote/a' aa\"aaa /tmp/test_lftp_m9mxjip7/local/  -- 48/128 (37%) 15 B/s\n        \\\\transfer `aa\"a ' a\"aa.txt' \n        `aa\"a ' a\"aa.txt' at 43 (33%) 15b/s eta:6s [Receiving data]\n        [2] pget -c /tmp/test_lftp_m9mxjip7/remote/\"b ' \"b\" ' \"b.txt -o /tmp/test_lftp_m9mxjip7/local/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp_m9mxjip7/remote/\"b ' \"b\" ' \"b.txt' at 236 (92%) 26b/s eta:1s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"'c\\\" c \\\" 'c' \\\"c\\\"\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"'d\\\" ' \\\" ' \\\"d.txt\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a' aa\\\"aaa\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(48, 128, 37, 15, None)\n        golden_job1.add_active_file_transfer_state(\n            \"aa\\\"a ' a\\\"aa.txt\", LftpJobStatus.TransferState(None, None, None, 15, 6)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"\\\"b ' \\\"b\\\" ' \\\"b.txt\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 26, 1)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_special_char_4(self):\n        # '-o' in filename\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost)  -- 16 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_xi6gkbhv/remote/a -o a /tmp/test_lftp_xi6gkbhv/local/ -- 60/128 (46%) 16 B/s\n        -[2] pget -c /tmp/test_lftp_xi6gkbhv/remote/b -o b.txt -o /tmp/test_lftp_xi6gkbhv/local/\n        Commands queued:\n        1.  mirror -c \"/tmp/test_lftp_xi6gkbhv/remote/c -o c\"  \"/tmp/test_lftp_xi6gkbhv/local/\" \n        2.  pget -c \"/tmp/test_lftp_xi6gkbhv/remote/d -o d.txt\" -o \"/tmp/test_lftp_xi6gkbhv/local/\" \n        [1] mirror -c /tmp/test_lftp_xi6gkbhv/remote/a -o a /tmp/test_lftp_xi6gkbhv/local/  -- 60/128 (46%) 16 B/s\n        \\\\transfer `a -o a.txt' \n        `a -o a.txt' at 55 (42%) 16b/s eta:4s [Receiving data]\n        [2] pget -c /tmp/test_lftp_xi6gkbhv/remote/b -o b.txt -o /tmp/test_lftp_xi6gkbhv/local/ \n        sftp://someone:@localhost/home/someone\n        `/tmp/test_lftp_xi6gkbhv/remote/b -o b.txt' at 240 (93%) 26b/s eta:1s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_queue = [\n            LftpJobStatus(job_id=1,\n                          job_type=LftpJobStatus.Type.MIRROR,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"c -o c\",\n                          flags=\"-c\"),\n            LftpJobStatus(job_id=2,\n                          job_type=LftpJobStatus.Type.PGET,\n                          state=LftpJobStatus.State.QUEUED,\n                          name=\"d -o d.txt\",\n                          flags=\"-c\"),\n        ]\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a -o a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(60, 128, 46, 16, None)\n        golden_job1.add_active_file_transfer_state(\n            \"a -o a.txt\", LftpJobStatus.TransferState(None, None, None, 16, 4)\n        )\n        golden_job2 = LftpJobStatus(job_id=2,\n                                    job_type=LftpJobStatus.Type.PGET,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"b -o b.txt\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(None, None, None, 26, 1)\n        golden_jobs = [golden_job1, golden_job2]\n        self.assertEqual(len(golden_queue)+len(golden_jobs), len(statuses))\n        statuses_queue = [j for j in statuses if j.state == LftpJobStatus.State.QUEUED]\n        self.assertEqual(golden_queue, statuses_queue)\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_chmod(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost:22)  -- 12.26 MiB/s\n        sftp://someone:@localhost:22/remote/path\n        Now executing: [3] mirror -c /remote/path/Space.Trek.S23E03.720p /local/path/ -- 985M/985M (100%)\n            -[4] mirror -c /remote/path/Star.Battle.Movie /local/path/ -- 116M/1.2G (9%) 12.26 MiB/s\n        [3] mirror -c /remote/path/Space.Trek.S23E03.720p /local/path/  -- 985M/985M (100%)\n        chmod Space.Trek.S23E03.720p.r06 \n        file:/local/path/Space.Trek.S23E03.720p\n        `Space.Trek.S23E03.720p.r06' []\n        chmod Space.Trek.S23E03.720p.r07 \n        file:/local/path/Space.Trek.S23E03.720p\n        `Space.Trek.S23E03.720p.r07' []\n        chmod Space.Trek.S23E03.720p.r08 \n        file:/local/path/Space.Trek.S23E03.720p\n        `Space.Trek.S23E03.720p.r08' []\n        chmod Space.Trek.S23E03.720p.r09 \n        file:/local/path/Space.Trek.S23E03.720p\n        `Space.Trek.S23E03.720p.r09' []\n        [4] mirror -c /remote/path/Star.Battle.Movie /local/path/  -- 116M/1.2G (9%) 12.26 MiB/s\n        \\\\transfer `star.battle.movie.720p.r07' \n        `star.battle.movie.720p.r07', got 44628032 of 50000000 (89%) 1.10M/s eta:5s \n        \\chunk 9011200-25000000\n        `star.battle.movie.720p.r07' at 19628032 (25%) 1.10M/s eta:5s [Receiving data]\n        \\\\transfer `star.battle.movie.720p.r08' \n        `star.battle.movie.720p.r08', got 15237120 of 50000000 (30%) 2.04M/s \n        \\chunk 0-25000000\n        `star.battle.movie.720p.r08' at 13664256 (27%) 1.36M/s eta:8s [Receiving data]\n        \\chunk 37500000-49999999 \n        `star.battle.movie.720p.r08' at 38581344 (8%) 696.2K/s eta:16s [Receiving data]\n        \\chunk 25000000-37499999 \n        `star.battle.movie.720p.r08' at 25491520 (3%) [Receiving data]\n        \\\\transfer `star.battle.movie.720p.r09' \n        `star.battle.movie.720p.r09', got 21692416 of 50000000 (43%) 4.05M/s eta:16s \n        \\chunk 0-12500000\n        `star.battle.movie.720p.r09' at 12419072 (24%) 1.28M/s eta:0s [Receiving data]\n        \\chunk 37500000-49999999 \n        `star.battle.movie.720p.r09' at 38843488 (10%) 662.8K/s eta:16s [Receiving data]\n        \\chunk 25000000-37499999 \n        `star.battle.movie.720p.r09' at 28047424 (24%) 963.8K/s eta:10s [Receiving data]\n        \\chunk 12500000-24999999 \n        `star.battle.movie.720p.r09' at 17382432 (39%) 1.19M/s eta:6s [Receiving data]\n        \\\\transfer `star.battle.movie.720p.r10' \n        `star.battle.movie.720p.r10', got 33930272 of 50000000 (67%) 5.06M/s eta:6s \n        \\chunk 37500000-49999999 \n        `star.battle.movie.720p.r10' at 43037792 (44%) 1.16M/s eta:6s [Receiving data]\n        \\chunk 25000000-37499999 \n        `star.battle.movie.720p.r10' at 32503872 (60%) 1.19M/s eta:4s [Receiving data]\n        \\chunk 12500000-24999999 \n        `star.battle.movie.720p.r10' at 20888608 (67%) 1.33M/s eta:3s [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n\n        golden_job1 = LftpJobStatus(job_id=3,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"Space.Trek.S23E03.720p\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(1032847360, 1032847360, 100, None, None)\n\n        golden_job2 = LftpJobStatus(job_id=4,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"Star.Battle.Movie\",\n                                    flags=\"-c\")\n        golden_job2.total_transfer_state = LftpJobStatus.TransferState(121634816, 1288490188, 9, 12855541, None)\n        golden_job2.add_active_file_transfer_state(\n            \"star.battle.movie.720p.r07\",\n            LftpJobStatus.TransferState(44628032, 50000000, 89, 1153433, 5)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"star.battle.movie.720p.r08\",\n            LftpJobStatus.TransferState(15237120, 50000000, 30, 2139095, None)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"star.battle.movie.720p.r09\",\n            LftpJobStatus.TransferState(21692416, 50000000, 43, 4246732, 16)\n        )\n        golden_job2.add_active_file_transfer_state(\n            \"star.battle.movie.720p.r10\",\n            LftpJobStatus.TransferState(33930272, 50000000, 67, 5305794, 6)\n        )\n\n        self.assertEqual(2, len(statuses))\n        self.assertEqual(golden_job1, statuses[0])\n        self.assertEqual(golden_job2, statuses[1])\n\n    def test_jobs_chmod_two_liner(self):\n        output = \"\"\"\n        [0] queue (sftp://someone:@localhost:22)  -- 1.8 KiB/s\n        sftp://someone:@localhost:22/remote/path\n        Now executing: [1] mirror -c /remote/path/Space.Trek /local/path/ -- 3.1k/617M (0%) 1.8 KiB/s\n        [1] mirror -c /remote/path/Space.Trek /local/path/  -- 3.1k/617M (0%) 1.8 KiB/s\n        \\mirror `Space.Trek.S08E04' \n        chmod Space.Trek.S08E04.sfv \n            file:/local/path/Space.Trek/Space.Trek.S08E04\n        \\mirror `Space.Trek.S08E05'  -- 605/51M (0%)\n        \\\\transfer `Space.Trek.S08E05/space.trek.s08e05.r06' \n            `space.trek.s08e05.r06' at 0 (0%) [Waiting for response...]\n        \\mirror `Space.Trek.S08E06'  -- 1.6k/517M (0%) 932 B/s\n        \\\\transfer `Space.Trek.S08E06/space.trek.s08e06.nfo' \n            `space.trek.s08e06.nfo' at 932 (100%) [Receiving data]\n        \\mirror `Space.Trek.S08E07'  -- 932/51M (0%) 932 B/s\n        \\\\transfer `Space.Trek.S08E07/space.trek.s08e07.nfo' \n        `space.trek.s08e07.nfo' at 932 (100%) [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"Space.Trek\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(3174, 646971392, 0, 1843, None)\n        golden_job1.add_active_file_transfer_state(\n            \"Space.Trek.S08E05/space.trek.s08e05.r06\",\n            LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_job1.add_active_file_transfer_state(\n            \"Space.Trek.S08E06/space.trek.s08e06.nfo\",\n            LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        golden_job1.add_active_file_transfer_state(\n            \"Space.Trek.S08E07/space.trek.s08e07.nfo\",\n            LftpJobStatus.TransferState(None, None, None, None, None)\n        )\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(golden_job1, statuses[0])\n\n    def test_jobs_chmod_2(self):\n        output = \"\"\"\n        jobs -v\n        [0] queue (sftp://someone:@localhost:22)  -- 3.45 MiB/s\n        sftp://someone:@localhost:22/remote/path\n        Now executing: [1] mirror -c /remote/path/Space.Trek /media/WD/Videos/temp/ -- 7.8M/429M (1%) 1.01 MiB/s (52%) 2.44 MiB/s\n        [1] mirror -c /remote/path/Space.Trek /media/WD/Videos/temp/  -- 7.8M/429M (1%) 1.01 MiB/s\n        \\\\transfer `Space.Trek.mkv' \n        `Space.Trek.mkv', got 7700480 of 425302375 (1%) 1.01M/s eta:7m \n        \\chunk 0-106325596\n        `Space.Trek.mkv' at 1867776 (0%) 255.6K/s eta:7m [Receiving data]\n        \\chunk 318976782-425302374 \n        `Space.Trek.mkv' at 320910094 (1%) 257.6K/s eta:7m [Receiving data]\n        \\chunk 212651189-318976781 \n        `Space.Trek.mkv' at 214584501 (1%) 257.7K/s eta:7m [Receiving data]\n        \\chunk 106325596-212651188 \n        `Space.Trek.mkv' at 108291676 (1%) 259.4K/s eta:7m [Receiving data]\n        \\mirror `Screens'  -- 0/2.8M (0%)\n        chmod ./Space.Trek.Screen0001.png \n        file:/media/WD/Videos/temp/Space.Trek/Screens\n        chmod ./Space.Trek.Screen0002.png \n        file:/media/WD/Videos/temp/Space.Trek/Screens\n        chmod ./Space.Trek.Screen0003.png \n        file:/media/WD/Videos/temp/Space.Trek/Screens\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"Space.Trek\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(8178892, 449839104, 1, 1059061, None)\n        golden_job1.add_active_file_transfer_state(\n            \"Space.Trek.mkv\",\n            LftpJobStatus.TransferState(7700480, 425302375, 1, 1059061, 420)\n        )\n\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(golden_job1, statuses[0])\n\n    def test_removes_jobs_command(self):\n        output = \"\"\"\n        jobs -v\n        [0] queue (sftp://someone:@localhost)  -- 90 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/ -- 345/26M (0%) 90 B/s\n        [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/  -- 345/26M (0%) 90 B/s\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(345, 26*1024*1024, 0, 90, None)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_removes_multiple_jobs_lines(self):\n        output = \"\"\"\n        jobs -v\n        jobs -v\n        jobs -v\n        [0] queue (sftp://someone:@localhost)  -- 90 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/ -- 345/26M (0%) 90 B/s\n        [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/  -- 345/26M (0%) 90 B/s\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(345, 26*1024*1024, 0, 90, None)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_removes_log_line(self):\n        output = \"\"\"\n        2020-06-09 04:25:46 sftp://user@example.com:22/path/on/server/file.nfo -> /path/on/local/file.nfo 0-1400 2.8 KiB/s\n        [0] queue (sftp://someone:@localhost)  -- 90 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/ -- 345/26M (0%) 90 B/s\n        [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/  -- 345/26M (0%) 90 B/s\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(345, 26*1024*1024, 0, 90, None)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_removes_lines_before_first_jobs(self):\n        output = \"\"\"\n        /path/on/local/file.nfo.lftp 914457562-997590066 436.5 KiB/s\n        jobs -v\n        [0] queue (sftp://someone:@localhost)  -- 90 B/s\n        sftp://someone:@localhost/home/someone\n        Now executing: [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/ -- 345/26M (0%) 90 B/s\n        [1] mirror -c /tmp/test_lftp_rm_s6oau/remote/a /tmp/test_lftp_rm_s6oau/local/  -- 345/26M (0%) 90 B/s\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"a\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(345, 26*1024*1024, 0, 90, None)\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n\n    def test_jobs_removes_multiple_jobs_lines(self):\n        output = \"\"\"\n        jobs -v\n        [0] queue (sftp://user:password@server:22) -- 3.18 MiB/s\n        sftp://user:password@server:22/home/someone\n        Now executing: [1] mirror -c files/sync/movie /incoming// -- 628M/21G (3%) 3.18 MiB/s\n        [1] mirror -c files/sync/movie /incoming// -- 628M/21G (3%) 3.18 MiB/s\n        \\\\transfer `movie.mkv'\n        `movie.mkv', got 627933184 of 20757383669 (3%) 3.18M/s eta:69m\n        \\chunk 0-2594672963\n        `movie.mkv' at 79953920 (0%) 407.2K/s eta:46m [Receiving data]\n        \\chunk 18162710711-20757383668\n        `movie.mkv' at 18251249847 (3%) 471.1K/s eta:42m [Receiving data]\n        \\chunk 15568037753-18162710710\n        `movie.mkv' at 15636785017 (2%) 341.4K/s eta:54m [Receiving data]\n        \\chunk 12973364795-15568037752\n        `movie.mkv' at 13027497531 (2%) 321.5K/s eta:69m [Receiving data]\n        \\chunk 10378691837-12973364794\n        `movie.mkv' at 10463528189 (3%) 419.7K/s eta:44m [Receiving data]\n        \\chunk 7784018879-10378691836\n        `movie.mkv' at 7865185215 (3%) 419.2K/s eta:46m [Receiving data]\n        \\chunk 5189345921-7784018878\n        `movie.mkv' at 5271265921 (3%) 426.4K/s eta:45m [Receiving data]\n        jobs -v\n        jobs -v\n        \\chunk 2594672963-5189345920\n        `movie.mkv' at 2683310403 (3%) 449.5K/s eta:42m [Receiving data]\n        \"\"\"\n        parser = LftpJobStatusParser()\n        statuses = parser.parse(output)\n        golden_job1 = LftpJobStatus(job_id=1,\n                                    job_type=LftpJobStatus.Type.MIRROR,\n                                    state=LftpJobStatus.State.RUNNING,\n                                    name=\"movie\",\n                                    flags=\"-c\")\n        golden_job1.total_transfer_state = LftpJobStatus.TransferState(\n            628*1024*1024, 21*1024*1024*1024, 3, 3334471, None\n        )\n        golden_job1.add_active_file_transfer_state(\n            \"movie.mkv\", LftpJobStatus.TransferState(627933184, 20757383669, 3, 3334471, 69*60)\n        )\n        golden_jobs = [golden_job1]\n        self.assertEqual(len(golden_jobs), len(statuses))\n        statuses_jobs = [j for j in statuses if j.state == LftpJobStatus.State.RUNNING]\n        self.assertEqual(golden_jobs, statuses_jobs)\n"
  },
  {
    "path": "src/python/tests/unittests/test_lftp/test_lftp.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport os\nimport shutil\nimport sys\nimport tempfile\nimport unittest\n\nimport timeout_decorator\n\nfrom tests.utils import TestUtils\nfrom lftp import Lftp, LftpJobStatus, LftpError\n\n\n# noinspection PyPep8Naming,SpellCheckingInspection\nclass TestLftp(unittest.TestCase):\n    temp_dir = None\n\n    @classmethod\n    def setUpClass(cls):\n        # Create a temp directory\n        TestLftp.temp_dir = tempfile.mkdtemp(prefix=\"test_lftp_\")\n        print(f\"Temp dir: {TestLftp.temp_dir}\")\n\n        # Allow group access for the seedsynctest account\n        TestUtils.chmod_from_to(TestLftp.temp_dir, tempfile.gettempdir(), 0o775)\n\n        # Create some test directories\n        # remote [dir] for remote path\n        #   a [dir]\n        #     aa [file,       24*1024 bytes]\n        #     ab [file,  2*1024*1024 bytes]\n        #   b [dir]\n        #     ba [dir]\n        #       baa [file, 128*1024 bytes]\n        #       bab [file, 128*1024 bytes]\n        #     bb [file, 128*1024 bytes]\n        #   c [file, 1234 bytes]\n        #   \"d d\" [file, 128*1024 bytes]\n        #   \"e e\" [dir]\n        #     \"e e a\" [file, 128*1024 bytes]\n        #   áßç [dir]\n        #     dőÀ [file, 128*1024 bytes]\n        #   üæÒ [file, 256*1024 bytes]\n        # local [dir] for local path, cleared before every test\n\n        def my_mkdir(*args):\n            os.mkdir(os.path.join(TestLftp.temp_dir, *args))\n\n        def my_touch(size, *args):\n            path = os.path.join(TestLftp.temp_dir, *args)\n            with open(path, 'wb') as f:\n                f.write(bytearray([0xff]*size))\n\n        def my_mkdir_latin(*args):\n            os.mkdir(os.path.join(TestLftp.temp_dir.encode('latin-1'), *args))\n\n        def my_touch_latin(size, *args):\n            path = os.path.join(TestLftp.temp_dir.encode('latin-1'), *args)\n            with open(path, 'wb') as f:\n                f.write(bytearray([0xff]*size))\n\n        my_mkdir(\"remote\")\n        my_mkdir(\"remote\", \"a\")\n        my_touch(24*1024, \"remote\", \"a\", \"aa\")\n        my_touch(24*1024*1024, \"remote\", \"a\", \"ab\")\n        my_mkdir(\"remote\", \"b\")\n        my_mkdir(\"remote\", \"b\", \"ba\")\n        my_touch(128*1024, \"remote\", \"b\", \"ba\", \"baa\")\n        my_touch(128*1024, \"remote\", \"b\", \"ba\", \"bab\")\n        my_touch(128*1024, \"remote\", \"b\", \"bb\")\n        my_touch(1234, \"remote\", \"c\")\n        my_touch(128*1024, \"remote\", \"d d\")\n        my_mkdir(\"remote\", \"e e\")\n        my_touch(128*1024, \"remote\", \"e e\", \"e e a\")\n        my_mkdir(\"remote\", \"áßç\")\n        my_touch(128*1024, \"remote\", \"áßç\", \"dőÀ\")\n        my_touch(256*1024, \"remote\", \"üæÒ\")\n        my_mkdir_latin(b\"remote\", b\"f\\xe9g\")\n        my_touch_latin(128*1024, b\"remote\", b\"f\\xe9g\", b\"d\\xe9f\")\n        my_touch_latin(256*1024, b\"remote\", b\"g\\xe9h\")\n        my_mkdir_latin(b\"remote\", b\"latin\")\n        my_touch_latin(128*1024, b\"remote\", b\"latin\", b\"d\\xe9f\")\n        my_mkdir(\"local\")\n\n    @classmethod\n    def tearDownClass(cls):\n        # Cleanup\n        shutil.rmtree(TestLftp.temp_dir)\n\n    def setUp(self):\n        # Delete and recreate the local dir\n        shutil.rmtree(os.path.join(TestLftp.temp_dir, \"local\"))\n        os.mkdir(os.path.join(TestLftp.temp_dir, \"local\"))\n        self.local_dir = os.path.join(TestLftp.temp_dir, \"local\")\n        self.remote_dir = os.path.join(TestLftp.temp_dir, \"remote\")\n\n        # Note: seedsynctest account must be set up. See DeveloperReadme.md for details\n        self.host = \"localhost\"\n        self.port = 22\n        self.user = \"seedsynctest\"\n        self.password = \"seedsyncpass\"\n\n        # Default lftp instance - use key-based login\n        self.lftp = Lftp(address=self.host, port=self.port, user=self.user, password=None)\n        self.lftp.set_base_remote_dir_path(self.remote_dir)\n        self.lftp.set_base_local_dir_path(self.local_dir)\n        self.lftp.set_verbose_logging(True)\n\n        logger = logging.getLogger()\n        logger.setLevel(logging.DEBUG)\n        handler = logging.StreamHandler(sys.stdout)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        logger.addHandler(handler)\n\n    def tearDown(self):\n        self.lftp.raise_pending_error()\n        self.lftp.exit()\n\n    def test_num_connections_per_dir_file(self):\n        self.lftp.num_connections_per_dir_file = 5\n        self.assertEqual(5, self.lftp.num_connections_per_dir_file)\n        with self.assertRaises(ValueError):\n            self.lftp.num_connections_per_dir_file = -1\n\n    def test_num_connections_per_root_file(self):\n        self.lftp.num_connections_per_root_file = 5\n        self.assertEqual(5, self.lftp.num_connections_per_root_file)\n        with self.assertRaises(ValueError):\n            self.lftp.num_connections_per_root_file = -1\n\n    def test_num_parallel_files(self):\n        self.lftp.num_parallel_files = 5\n        self.assertEqual(5, self.lftp.num_parallel_files)\n        with self.assertRaises(ValueError):\n            self.lftp.num_parallel_files = -1\n\n    def test_num_max_total_connections(self):\n        self.lftp.num_max_total_connections = 5\n        self.assertEqual(5, self.lftp.num_max_total_connections)\n        self.lftp.num_max_total_connections = 0\n        self.assertEqual(0, self.lftp.num_max_total_connections)\n        with self.assertRaises(ValueError):\n            self.lftp.num_max_total_connections = -1\n\n    def test_rate_limit(self):\n        self.lftp.rate_limit = 500\n        self.assertEqual(\"500\", self.lftp.rate_limit)\n        self.lftp.rate_limit = \"2k\"\n        self.assertEqual(\"2k\", self.lftp.rate_limit)\n        self.lftp.rate_limit = \"1M\"\n        self.assertEqual(\"1M\", self.lftp.rate_limit)\n\n    def test_min_chunk_size(self):\n        self.lftp.min_chunk_size = 500\n        self.assertEqual(\"500\", self.lftp.min_chunk_size)\n        self.lftp.min_chunk_size = \"2k\"\n        self.assertEqual(\"2k\", self.lftp.min_chunk_size)\n        self.lftp.min_chunk_size = \"1M\"\n        self.assertEqual(\"1M\", self.lftp.min_chunk_size)\n\n    def test_num_parallel_jobs(self):\n        self.lftp.num_parallel_jobs = 5\n        self.assertEqual(5, self.lftp.num_parallel_jobs)\n        with self.assertRaises(ValueError):\n            self.lftp.num_parallel_jobs = -1\n\n    def test_move_background_on_exit(self):\n        self.lftp.move_background_on_exit = True\n        self.assertEqual(True, self.lftp.move_background_on_exit)\n        self.lftp.move_background_on_exit = False\n        self.assertEqual(False, self.lftp.move_background_on_exit)\n\n    def test_use_temp_file(self):\n        self.lftp.use_temp_file = True\n        self.assertEqual(True, self.lftp.use_temp_file)\n        self.lftp.use_temp_file = False\n        self.assertEqual(False, self.lftp.use_temp_file)\n\n    def test_temp_file_name(self):\n        self.lftp.temp_file_name = \"*.lftp\"\n        self.assertEqual(\"*.lftp\", self.lftp.temp_file_name)\n        self.lftp.temp_file_name = \"*.temp\"\n        self.assertEqual(\"*.temp\", self.lftp.temp_file_name)\n\n    def test_sftp_auto_confirm(self):\n        self.lftp.sftp_auto_confirm = True\n        self.assertEqual(True, self.lftp.sftp_auto_confirm)\n        self.lftp.sftp_auto_confirm = False\n        self.assertEqual(False, self.lftp.sftp_auto_confirm)\n\n    def test_sftp_connect_program(self):\n        self.lftp.sftp_connect_program = \"program -a -f\"\n        self.assertEqual(\"\\\"program -a -f\\\"\", self.lftp.sftp_connect_program)\n        self.lftp.sftp_connect_program = \"\\\"abc -d\\\"\"\n        self.assertEqual(\"\\\"abc -d\\\"\", self.lftp.sftp_connect_program)\n\n    def test_status_empty(self):\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queue_file(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"c\", False)\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"c\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.PGET, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_dir(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_file_with_spaces(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"d d\", False)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"d d\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.PGET, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_dir_with_spaces(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"e e\", True)\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"e e\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_file_with_unicode(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"üæÒ\", False)\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"üæÒ\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.PGET, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_dir_with_latin(self):\n        self.lftp.rate_limit = 100  # so jobs don't finish right away\n        self.lftp.queue(\"latin\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"latin\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n        # Download over 100 bytes without errors\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            size_local = statuses[0].total_transfer_state.size_local\n            if size_local and size_local > 100:\n                break\n\n    @timeout_decorator.timeout(5)\n    def test_queue_dir_with_unicode(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"áßç\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"áßç\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_queue_num_parallel_jobs(self):\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        self.lftp.queue(\"c\", False)\n        self.lftp.queue(\"b\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 2:\n                break\n        self.assertEqual(3, len(statuses))\n        # queued jobs\n        self.assertEqual(\"b\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.QUEUED, statuses[0].state)\n        # running jobs\n        self.assertEqual(\"a\", statuses[1].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[1].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[1].state)\n        self.assertEqual(\"c\", statuses[2].name)\n        self.assertEqual(LftpJobStatus.Type.PGET, statuses[2].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[2].state)\n\n    @timeout_decorator.timeout(5)\n    def test_kill_all(self):\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        self.lftp.queue(\"c\", False)\n        self.lftp.queue(\"b\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 2:\n                break\n        self.assertEqual(3, len(statuses))\n        self.lftp.kill_all()\n        statuses = self.lftp.status()\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_kill_all_and_queue_again(self):\n        self.lftp.num_parallel_jobs = 2\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        self.lftp.queue(\"c\", False)\n        self.lftp.queue(\"b\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 2:\n                break\n        self.assertEqual(3, len(statuses))\n        self.lftp.kill_all()\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.assertEqual(0, len(statuses))\n        self.lftp.queue(\"b\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"b\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_kill_queued_job(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.num_parallel_jobs = 1\n        self.lftp.queue(\"a\", True)  # this job will run\n        self.lftp.queue(\"b\", True)  # this job will queue\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 1:\n                break\n        self.assertEqual(2, len(statuses))\n        self.assertEqual(\"b\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.State.QUEUED, statuses[0].state)\n        self.assertEqual(\"a\", statuses[1].name)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[1].state)\n        self.assertEqual(True, self.lftp.kill(\"b\"))\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n    @timeout_decorator.timeout(5)\n    def test_kill_running_job(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n        self.assertEqual(True, self.lftp.kill(\"a\"))\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_kill_missing_job(self):\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n        self.assertEqual(False, self.lftp.kill(\"b\"))\n        self.assertEqual(True, self.lftp.kill(\"a\"))\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_kill_job_1(self):\n        \"\"\"Queued and running jobs killed one at a time\"\"\"\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.num_parallel_jobs = 2\n        # 2 jobs running, 3 jobs queued\n        self.lftp.queue(\"a\", True)  # running\n        self.lftp.queue(\"d d\", False)  # running\n        self.lftp.queue(\"b\", True)  # queued\n        self.lftp.queue(\"c\", False)  # queued\n        self.lftp.queue(\"e e\", True)  # queued\n\n        Q = LftpJobStatus.State.QUEUED\n        R = LftpJobStatus.State.RUNNING\n\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 4:\n                break\n        self.assertEqual(5, len(statuses))\n        self.assertEqual([\"b\", \"c\", \"e e\", \"a\", \"d d\"], [s.name for s in statuses])\n        self.assertEqual([Q, Q, Q, R, R], [s.state for s in statuses])\n\n        # kill the queued jobs one-by-one\n        self.lftp.kill(\"c\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 4:\n                break\n        self.assertEqual(4, len(statuses))\n        self.assertEqual([\"b\", \"e e\", \"a\", \"d d\"], [s.name for s in statuses])\n        self.assertEqual([Q, Q, R, R], [s.state for s in statuses])\n        self.lftp.kill(\"b\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 3:\n                break\n        self.assertEqual(3, len(statuses))\n        self.assertEqual([\"e e\", \"a\", \"d d\"], [s.name for s in statuses])\n        self.assertEqual([Q, R, R], [s.state for s in statuses])\n        self.lftp.kill(\"e e\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 2:\n                break\n        self.assertEqual(2, len(statuses))\n        self.assertEqual([\"a\", \"d d\"], [s.name for s in statuses])\n        self.assertEqual([R, R], [s.state for s in statuses])\n        # kill the running jobs one-by-one\n        self.lftp.kill(\"d d\")\n        statuses = self.lftp.status()\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 1:\n                break\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(R, statuses[0].state)\n        self.lftp.kill(\"a\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queued_and_kill_jobs_1(self):\n        \"\"\"Queued and running jobs killed one at a time\"\"\"\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n        self.lftp.num_parallel_jobs = 2\n\n        Q = LftpJobStatus.State.QUEUED\n        R = LftpJobStatus.State.RUNNING\n\n        # add 3 jobs - a, dd, b\n        self.lftp.queue(\"a\", True)\n        self.lftp.queue(\"d d\", False)\n        self.lftp.queue(\"b\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 2:\n                break\n        self.assertEqual(3, len(statuses))\n        self.assertEqual([\"b\", \"a\", \"d d\"], [s.name for s in statuses])\n        self.assertEqual([Q, R, R], [s.state for s in statuses])\n\n        # remove dd (running)\n        self.lftp.kill(\"d d\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 2:\n                break\n        self.assertEqual(2, len(statuses))\n        self.assertEqual([\"a\", \"b\"], [s.name for s in statuses])\n        self.assertEqual([R, R], [s.state for s in statuses])\n\n        # remove a (running)\n        self.lftp.kill(\"a\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 1:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual([\"b\"], [s.name for s in statuses])\n        self.assertEqual([R], [s.state for s in statuses])\n\n        # add 3 jobs - c, ee, a\n        self.lftp.queue(\"c\", False)\n        self.lftp.queue(\"e e\", True)\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 4:\n                break\n        self.assertEqual(4, len(statuses))\n        self.assertEqual([\"e e\", \"a\", \"b\", \"c\"], [s.name for s in statuses])\n        self.assertEqual([Q, Q, R, R], [s.state for s in statuses])\n\n        # remove ee (queued) and b (running)\n        self.lftp.kill(\"e e\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 3:\n                break\n        self.assertEqual(3, len(statuses))\n        self.assertEqual([\"a\", \"b\", \"c\"], [s.name for s in statuses])\n        self.assertEqual([Q, R, R], [s.state for s in statuses])\n        self.lftp.kill(\"b\")\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 2:\n                break\n        self.assertEqual(2, len(statuses))\n        self.assertEqual([\"c\", \"a\"], [s.name for s in statuses])\n        self.assertEqual([R, R], [s.state for s in statuses])\n\n        # remove all\n        self.lftp.kill_all()\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queue_dir_wrong_file_type(self):\n        \"\"\"check that queueing a dir with PGET fails gracefully\"\"\"\n        # passing dir as a file\n        print(\"Queuing dir as a file\")\n        self.lftp.queue(\"a\", False)\n        # wait for command to fail\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) == 0:\n                break\n        with self.assertRaises(LftpError) as ctx:\n            self.lftp.raise_pending_error()\n        self.assertTrue(\"Access failed\" in str(ctx.exception))\n        # next status should be empty\n        print(\"Getting empty status\")\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queue_file_wrong_file_type(self):\n        \"\"\"check that queueing a file with MIRROR fails gracefully\"\"\"\n        # passing file as a dir\n        print(\"Queuing file as a dir\")\n        self.lftp.queue(\"c\", True)\n        # wait for command to fail\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) == 0:\n                break\n        with self.assertRaises(LftpError) as ctx:\n            self.lftp.raise_pending_error()\n        self.assertTrue(\"Access failed\" in str(ctx.exception))\n        # next status should be empty\n        print(\"Getting empty status\")\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queue_missing_file(self):\n        \"\"\"check that queueing non-existing file fails gracefully\"\"\"\n        self.lftp.queue(\"non-existing-file\", False)\n        # wait for command to fail\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) == 0:\n                break\n        with self.assertRaises(LftpError) as ctx:\n            self.lftp.raise_pending_error()\n        self.assertTrue(\"No such file\" in str(ctx.exception))\n        # next status should be empty\n        print(\"Getting empty status\")\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_queue_missing_dir(self):\n        \"\"\"check that queueing non-existing directory fails gracefully\"\"\"\n\n        self.lftp.queue(\"non-existing-folder\", True)\n        # wait for command to fail\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) == 0:\n                break\n        with self.assertRaises(LftpError) as ctx:\n            self.lftp.raise_pending_error()\n        self.assertTrue(\"No such file\" in str(ctx.exception))\n        # next status should be empty\n        print(\"Getting empty status\")\n        statuses = self.lftp.status()\n        self.assertEqual(0, len(statuses))\n\n    @timeout_decorator.timeout(5)\n    def test_password_auth(self):\n        # exit the default instance\n        self.lftp.exit()\n\n        self.lftp = Lftp(address=self.host, port=self.port, user=self.user, password=self.password)\n        self.lftp.set_base_remote_dir_path(self.remote_dir)\n        self.lftp.set_base_local_dir_path(self.local_dir)\n        self.lftp.set_verbose_logging(True)\n\n        # Disable key-based auth\n        program = self.lftp.sftp_connect_program\n        program = program[:-1]  # remove the end double-quote\n        program += \" -oPubkeyAuthentication=no\\\"\"\n        self.lftp.sftp_connect_program = program\n\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n        # Wait for empty status\n        while True:\n            statuses = self.lftp.status()\n            self.lftp.raise_pending_error()\n            if len(statuses) == 0:\n                break\n        self.lftp.raise_pending_error()\n\n    @timeout_decorator.timeout(15)\n    def test_error_bad_password(self):\n        # exit the default instance\n        self.lftp.exit()\n\n        self.lftp = Lftp(address=self.host, port=self.port, user=self.user, password=\"wrong password\")\n        self.lftp.set_base_remote_dir_path(self.remote_dir)\n        self.lftp.set_base_local_dir_path(self.local_dir)\n        self.lftp.set_verbose_logging(True)\n        self.lftp.rate_limit = 10  # so jobs don't finish right away\n\n        # Disable key-based auth\n        program = self.lftp.sftp_connect_program\n        program = program[:-1]  # remove the end double-quote\n        program += \" -oPubkeyAuthentication=no\\\"\"\n        self.lftp.sftp_connect_program = program\n\n        self.lftp.queue(\"a\", True)\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) > 0:\n                break\n        self.assertEqual(1, len(statuses))\n        self.assertEqual(\"a\", statuses[0].name)\n        self.assertEqual(LftpJobStatus.Type.MIRROR, statuses[0].type)\n        self.assertEqual(LftpJobStatus.State.RUNNING, statuses[0].state)\n\n        # Wait for empty status\n        while True:\n            statuses = self.lftp.status()\n            if len(statuses) == 0:\n                break\n        with self.assertRaises(LftpError) as ctx:\n            self.lftp.raise_pending_error()\n        self.assertTrue(\"Login failed: Login incorrect\" in str(ctx.exception))\n"
  },
  {
    "path": "src/python/tests/unittests/test_model/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_model/test_diff.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom datetime import datetime\n\nfrom model import Model, ModelFile, ModelDiff, ModelDiffUtil\n\n\nclass TestModelDiff(unittest.TestCase):\n    def test_change(self):\n        diff = ModelDiff(ModelDiff.Change.ADDED, None, None)\n        self.assertEqual(ModelDiff.Change.ADDED, diff.change)\n        diff = ModelDiff(ModelDiff.Change.REMOVED, None, None)\n        self.assertEqual(ModelDiff.Change.REMOVED, diff.change)\n        diff = ModelDiff(ModelDiff.Change.UPDATED, None, None)\n        self.assertEqual(ModelDiff.Change.UPDATED, diff.change)\n\n    def test_old_file(self):\n        old_file = ModelFile(\"a\", False)\n        old_file.local_size = 100\n        diff = ModelDiff(ModelDiff.Change.ADDED, old_file, None)\n        self.assertEqual(old_file, diff.old_file)\n        diff = ModelDiff(ModelDiff.Change.ADDED, None, None)\n        self.assertEqual(None, diff.old_file)\n\n    def test_new_file(self):\n        new_file = ModelFile(\"a\", False)\n        new_file.local_size = 100\n        diff = ModelDiff(ModelDiff.Change.ADDED, None, new_file)\n        self.assertEqual(new_file, diff.new_file)\n        diff = ModelDiff(ModelDiff.Change.ADDED, None, None)\n        self.assertEqual(None, diff.new_file)\n\n\nclass TestModelDiffUtil(unittest.TestCase):\n    def test_added(self):\n        model_before = Model()\n        model_after = Model()\n        a = ModelFile(\"a\", False)\n        a.local_size = 100\n        model_after.add_file(a)\n        diff = ModelDiffUtil.diff_models(model_before, model_after)\n        self.assertEqual([ModelDiff(ModelDiff.Change.ADDED, None, a)], diff)\n\n    def test_removed(self):\n        model_before = Model()\n        model_after = Model()\n        a = ModelFile(\"a\", False)\n        a.local_size = 100\n        model_before.add_file(a)\n        diff = ModelDiffUtil.diff_models(model_before, model_after)\n        self.assertEqual([ModelDiff(ModelDiff.Change.REMOVED, a, None)], diff)\n\n    def test_updated(self):\n        model_before = Model()\n        model_after = Model()\n        a1 = ModelFile(\"a\", False)\n        a1.local_size = 100\n        a2 = ModelFile(\"a\", False)\n        a2.local_size = 200\n        model_before.add_file(a1)\n        model_after.add_file(a2)\n        diff = ModelDiffUtil.diff_models(model_before, model_after)\n        self.assertEqual([ModelDiff(ModelDiff.Change.UPDATED, a1, a2)], diff)\n\n    def test_updated_children(self):\n        model_before = Model()\n        model_after = Model()\n        a1 = ModelFile(\"a\", True)\n        aa1 = ModelFile(\"aa\", False)\n        aa1.local_size = 100\n        a1.add_child(aa1)\n        a2 = ModelFile(\"a\", True)\n        aa2 = ModelFile(\"aa\", False)\n        aa2.local_size = 200\n        a2.add_child(aa2)\n        model_before.add_file(a1)\n        model_after.add_file(a2)\n        diff = ModelDiffUtil.diff_models(model_before, model_after)\n        self.assertEqual([ModelDiff(ModelDiff.Change.UPDATED, a1, a2)], diff)\n\n    def test_diff_1(self):\n        model_before = Model()\n        model_after = Model()\n        a = ModelFile(\"a\", False)\n        a.local_size = 100\n        b = ModelFile(\"b\", False)\n        b.remote_size = 200\n        c1 = ModelFile(\"c\", False)\n        c1.downloading_speed = 40\n        c2 = ModelFile(\"c\", False)\n        c2.downloading_speed = 50\n        d1 = ModelFile(\"d\", False)\n        d1.local_size = 500\n        d2 = ModelFile(\"d\", False)\n        d2.local_size = 500\n        d2.update_timestamp = datetime.now()\n\n        # add a, remove b, update c, no change d (but do a timestamp update)\n        model_before.add_file(b)\n        model_before.add_file(c1)\n        model_before.add_file(d1)\n        model_after.add_file(a)\n        model_after.add_file(c2)\n        model_after.add_file(d2)\n        diffs = ModelDiffUtil.diff_models(model_before, model_after)\n\n        self.assertEqual(3, len(diffs))\n        added = [d for d in diffs if d.change == ModelDiff.Change.ADDED]\n        self.assertEqual(1, len(added))\n        self.assertEqual(ModelDiff(ModelDiff.Change.ADDED, None, a), added[0])\n        removed = [d for d in diffs if d.change == ModelDiff.Change.REMOVED]\n        self.assertEqual(1, len(removed))\n        self.assertEqual(ModelDiff(ModelDiff.Change.REMOVED, b, None), removed[0])\n        updated = [d for d in diffs if d.change == ModelDiff.Change.UPDATED]\n        self.assertEqual(1, len(updated))\n        self.assertEqual(ModelDiff(ModelDiff.Change.UPDATED, c1, c2), updated[0])\n"
  },
  {
    "path": "src/python/tests/unittests/test_model/test_file.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom datetime import datetime\n\nfrom model import ModelFile\n\n\nclass TestModelFile(unittest.TestCase):\n    def test_name(self):\n        file = ModelFile(\"test\", False)\n        self.assertEqual(\"test\", file.name)\n\n    def test_is_dir(self):\n        file = ModelFile(\"test\", False)\n        self.assertEqual(False, file.is_dir)\n        file = ModelFile(\"test\", True)\n        self.assertEqual(True, file.is_dir)\n\n    def test_state(self):\n        file = ModelFile(\"test\", False)\n\n        file.state = ModelFile.State.DOWNLOADING\n        self.assertEqual(ModelFile.State.DOWNLOADING, file.state)\n\n        with self.assertRaises(TypeError):\n            file.state = \"BadState\"\n\n    def test_local_size(self):\n        file = ModelFile(\"test\", False)\n\n        file.local_size = 100\n        self.assertEqual(100, file.local_size)\n        file.local_size = None\n        self.assertEqual(None, file.local_size)\n\n        with self.assertRaises(TypeError):\n            file.local_size = \"BadValue\"\n        with self.assertRaises(ValueError):\n            file.local_size = -100\n\n    def test_remote_size(self):\n        file = ModelFile(\"test\", False)\n\n        file.remote_size = 100\n        self.assertEqual(100, file.remote_size)\n        file.remote_size = None\n        self.assertEqual(None, file.remote_size)\n\n        with self.assertRaises(TypeError):\n            file.remote_size = \"BadValue\"\n        with self.assertRaises(ValueError):\n            file.remote_size = -100\n\n    def test_transferred_size(self):\n        file = ModelFile(\"test\", False)\n\n        file.transferred_size = 100\n        self.assertEqual(100, file.transferred_size)\n        file.transferred_size = None\n        self.assertEqual(None, file.transferred_size)\n\n        with self.assertRaises(TypeError):\n            file.transferred_size = \"BadValue\"\n        with self.assertRaises(ValueError):\n            file.transferred_size = -100\n\n    def test_downloading_speed(self):\n        file = ModelFile(\"test\", False)\n\n        file.downloading_speed = 100\n        self.assertEqual(100, file.downloading_speed)\n        file.downloading_speed = None\n        self.assertEqual(None, file.downloading_speed)\n\n        with self.assertRaises(TypeError):\n            file.downloading_speed = \"BadValue\"\n        with self.assertRaises(ValueError):\n            file.downloading_speed = -100\n\n    def test_update_timestamp(self):\n        file = ModelFile(\"test\", False)\n\n        now = datetime.now()\n        file.update_timestamp = now\n        self.assertEqual(now, file.update_timestamp)\n\n        with self.assertRaises(TypeError):\n            file.update_timestamp = 100\n\n    def test_eta(self):\n        file = ModelFile(\"test\", False)\n\n        file.eta = 100\n        self.assertEqual(100, file.eta)\n        file.eta = None\n        self.assertEqual(None, file.eta)\n\n        with self.assertRaises(TypeError):\n            file.eta = \"BadValue\"\n        with self.assertRaises(ValueError):\n            file.eta = -100\n\n    def test_is_extractable(self):\n        file = ModelFile(\"test\", True)\n        file.is_extractable = True\n        self.assertTrue(file.is_extractable)\n        file.is_extractable = False\n        self.assertFalse(file.is_extractable)\n\n    def test_local_created_timestamp(self):\n        file = ModelFile(\"test\", False)\n        self.assertIsNone(file.local_created_timestamp)\n\n        now = datetime.now()\n        file.local_created_timestamp = now\n        self.assertEqual(now, file.local_created_timestamp)\n\n        with self.assertRaises(TypeError):\n            file.local_created_timestamp = 100\n\n    def test_local_modified_timestamp(self):\n        file = ModelFile(\"test\", False)\n        self.assertIsNone(file.local_modified_timestamp)\n\n        now = datetime.now()\n        file.local_modified_timestamp = now\n        self.assertEqual(now, file.local_modified_timestamp)\n\n        with self.assertRaises(TypeError):\n            file.local_modified_timestamp = 100\n\n    def test_remote_created_timestamp(self):\n        file = ModelFile(\"test\", False)\n        self.assertIsNone(file.remote_created_timestamp)\n\n        now = datetime.now()\n        file.remote_created_timestamp = now\n        self.assertEqual(now, file.remote_created_timestamp)\n\n        with self.assertRaises(TypeError):\n            file.remote_created_timestamp = 100\n\n    def test_remote_modified_timestamp(self):\n        file = ModelFile(\"test\", False)\n        self.assertIsNone(file.remote_modified_timestamp)\n\n        now = datetime.now()\n        file.remote_modified_timestamp = now\n        self.assertEqual(now, file.remote_modified_timestamp)\n\n        with self.assertRaises(TypeError):\n            file.remote_modified_timestamp = 100\n\n    def test_equality_operator(self):\n        # check that timestamp does not affect equality\n        now = datetime.now()\n        file1 = ModelFile(\"test\", False)\n        file1.local_size = 100\n        file1.update_timestamp = now\n        file2 = ModelFile(\"test\", False)\n        file2.local_size = 200\n        file2.update_timestamp = now\n        self.assertFalse(file1 == file2)\n\n        file2.local_size = 100\n        file2.update_timestamp = datetime.now()\n        self.assertTrue(file1 == file2)\n\n    def test_child(self):\n        file_parent = ModelFile(\"parent\", True)\n        file_child1 = ModelFile(\"child1\", True)\n        file_child2 = ModelFile(\"child2\", False)\n        self.assertEqual(0, len(file_parent.get_children()))\n        file_parent.add_child(file_child1)\n        self.assertEqual([file_child1], file_parent.get_children())\n        file_parent.add_child(file_child2)\n        self.assertEqual([file_child1, file_child2], file_parent.get_children())\n\n    def test_child_equality(self):\n        l_a = ModelFile(\"a\", True)\n        l_a.remote_size = 3+1+2\n        l_aa = ModelFile(\"aa\", True)\n        l_aa.remote_size = 3+1\n        l_a.add_child(l_aa)\n        l_aaa = ModelFile(\"aaa\", False)\n        l_aaa.remote_size = 1\n        l_aa.add_child(l_aaa)\n        l_aab = ModelFile(\"aab\", False)\n        l_aab.remote_size = 3\n        l_aa.add_child(l_aab)\n        l_ab = ModelFile(\"ab\", False)\n        l_ab.remote_size = 2\n        l_a.add_child(l_ab)\n\n        r_a = ModelFile(\"a\", True)\n        r_a.remote_size = 3+1+2\n        r_aa = ModelFile(\"aa\", True)\n        r_aa.remote_size = 3+1\n        r_a.add_child(r_aa)\n        r_aaa = ModelFile(\"aaa\", False)\n        r_aaa.remote_size = 1\n        r_aa.add_child(r_aaa)\n        r_aab = ModelFile(\"aab\", False)\n        r_aab.remote_size = 3\n        r_aa.add_child(r_aab)\n        r_ab = ModelFile(\"ab\", False)\n        r_ab.remote_size = 2\n        r_a.add_child(r_ab)\n\n        self.assertEqual(l_a, r_a)\n\n        r_aaa.remote_size = 2\n        self.assertNotEqual(l_a, r_a)\n\n    def test_fail_add_child_to_nondir(self):\n        file_parent = ModelFile(\"parent\", False)\n        file_child1 = ModelFile(\"child1\", True)\n        with self.assertRaises(TypeError) as context:\n            file_parent.add_child(file_child1)\n        self.assertTrue(str(context.exception).startswith(\"Cannot add child to a non-directory\"))\n\n    def test_fail_add_child_twice(self):\n        file_parent = ModelFile(\"parent\", True)\n        file_parent.add_child(ModelFile(\"child1\", True))\n        file_parent.add_child(ModelFile(\"child2\", True))\n        with self.assertRaises(ValueError) as context:\n            file_parent.add_child(ModelFile(\"child1\", True))\n        self.assertTrue(str(context.exception).startswith(\"Cannot add child more than once\"))\n        with self.assertRaises(ValueError) as context:\n            file_parent.add_child(ModelFile(\"child2\", True))\n        self.assertTrue(str(context.exception).startswith(\"Cannot add child more than once\"))\n\n    def test_full_path(self):\n        file_a = ModelFile(\"a\", True)\n        file_aa = ModelFile(\"aa\", True)\n        file_a.add_child(file_aa)\n        file_aaa = ModelFile(\"aaa\", True)\n        file_aa.add_child(file_aaa)\n        file_ab = ModelFile(\"ab\", True)\n        file_a.add_child(file_ab)\n        self.assertEqual(\"a\", file_a.full_path)\n        self.assertEqual(\"a/aa\", file_aa.full_path)\n        self.assertEqual(\"a/aa/aaa\", file_aaa.full_path)\n        self.assertEqual(\"a/ab\", file_ab.full_path)\n\n    def test_parent(self):\n        a = ModelFile(\"a\", True)\n        aa = ModelFile(\"aa\", True)\n        a.add_child(aa)\n        aaa = ModelFile(\"aaa\", False)\n        aa.add_child(aaa)\n        self.assertIsNone(a.parent)\n        self.assertEqual(a, aa.parent)\n        self.assertEqual(aa, aaa.parent)\n"
  },
  {
    "path": "src/python/tests/unittests/test_model/test_model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nimport sys\nimport unittest\nfrom unittest.mock import MagicMock\n\nfrom common import overrides\nfrom model import Model, ModelFile, IModelListener, ModelError\n\n\nclass DummyModelListener(IModelListener):\n    @overrides(IModelListener)\n    def file_added(self, file: ModelFile):\n        pass\n\n    @overrides(IModelListener)\n    def file_removed(self, file: ModelFile):\n        pass\n\n    @overrides(IModelListener)\n    def file_updated(self, old_file: ModelFile, new_file: ModelFile):\n        pass\n\n\nclass TestLftpModel(unittest.TestCase):\n    def setUp(self):\n        logger = logging.getLogger(TestLftpModel.__name__)\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n        self.model = Model()\n        self.model.set_base_logger(logger)\n\n    def test_add_file(self):\n        file = ModelFile(\"test\", False)\n        self.model.add_file(file)\n        recv_file = self.model.get_file(\"test\")\n        self.assertEqual(\"test\", recv_file.name)\n\n    def test_get_unknown_file(self):\n        with self.assertRaises(ModelError):\n            self.model.get_file(\"test\")\n\n    def test_remove_file(self):\n        file = ModelFile(\"test\", False)\n        self.model.add_file(file)\n        self.model.remove_file(\"test\")\n        with self.assertRaises(ModelError):\n            self.model.get_file(\"test\")\n\n    def test_remove_unknown_file(self):\n        with self.assertRaises(ModelError):\n            self.model.remove_file(\"test\")\n\n    def test_update_file(self):\n        file = ModelFile(\"test\", False)\n        file.local_size = 100\n        self.model.add_file(file)\n        recv_file = self.model.get_file(\"test\")\n        self.assertEqual(100, recv_file.local_size)\n        recv_file.local_size = 200\n        self.model.update_file(recv_file)\n        recv_file = self.model.get_file(\"test\")\n        self.assertEqual(200, recv_file.local_size)\n\n    def test_update_unknown_file(self):\n        file = ModelFile(\"test\", False)\n        with self.assertRaises(ModelError):\n            self.model.update_file(file)\n\n    def test_get_file_names(self):\n        self.assertEqual(set(), self.model.get_file_names())\n        self.model.add_file(ModelFile(\"a\", False))\n        self.assertEqual({\"a\"}, self.model.get_file_names())\n        self.model.add_file(ModelFile(\"b\", False))\n        self.assertEqual({\"a\", \"b\"}, self.model.get_file_names())\n        self.model.add_file(ModelFile(\"c\", False))\n        self.assertEqual({\"a\", \"b\", \"c\"}, self.model.get_file_names())\n        self.model.remove_file(\"b\")\n        self.assertEqual({\"a\", \"c\"}, self.model.get_file_names())\n        self.model.add_file(ModelFile(\"d\", False))\n        self.assertEqual({\"a\", \"c\", \"d\"}, self.model.get_file_names())\n\n    def test_add_listener(self):\n        listener = DummyModelListener()\n        self.model.add_listener(listener)\n\n    def test_remove_listener(self):\n        listener = DummyModelListener()\n        listener.file_added = MagicMock()\n\n        self.model.add_listener(listener)\n        file = ModelFile(\"test\", False)\n        self.model.add_file(file)\n        listener.file_added.assert_called_once_with(file)\n\n        self.model.remove_listener(listener)\n        self.model.add_file(ModelFile(\"test2\", False))\n        listener.file_added.assert_called_once_with(file)\n\n    def test_listener_file_added(self):\n        listener = DummyModelListener()\n        self.model.add_listener(listener)\n\n        listener.file_added = MagicMock()\n\n        file = ModelFile(\"test\", False)\n        self.model.add_file(file)\n        # noinspection PyUnresolvedReferences\n        listener.file_added.assert_called_once_with(file)\n\n    def test_listener_file_removed(self):\n        listener = DummyModelListener()\n        self.model.add_listener(listener)\n\n        listener.file_removed = MagicMock()\n\n        file = ModelFile(\"test\", False)\n        self.model.add_file(file)\n        self.model.remove_file(\"test\")\n        # noinspection PyUnresolvedReferences\n        listener.file_removed.assert_called_once_with(file)\n\n    def test_listener_file_updated(self):\n        listener = DummyModelListener()\n        self.model.add_listener(listener)\n\n        listener.file_updated = MagicMock()\n\n        old_file = ModelFile(\"test\", False)\n        old_file.local_size = 100\n        self.model.add_file(old_file)\n        new_file = ModelFile(\"test\", False)\n        new_file.local_size = 200\n        self.model.update_file(new_file)\n        # noinspection PyUnresolvedReferences\n        listener.file_updated.assert_called_once_with(old_file, new_file)\n"
  },
  {
    "path": "src/python/tests/unittests/test_seedsync.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport sys\nimport copy\n\nfrom common import overrides, Config\nfrom seedsync import Seedsync\n\n\nclass TestSeedsync(unittest.TestCase):\n    def test_args_config(self):\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertEqual(\"/path/to/config\", args.config_dir)\n\n        argv = []\n        argv.append(\"--config_dir\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertEqual(\"/path/to/config\", args.config_dir)\n\n        argv = []\n        with self.assertRaises(SystemExit):\n            Seedsync._parse_args(argv)\n\n    def test_args_html(self):\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertEqual(\"/path/to/html\", args.html)\n\n    def test_args_scanfs(self):\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertEqual(\"/path/to/scanfs\", args.scanfs)\n\n    def test_args_logdir(self):\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--logdir\")\n        argv.append(\"/path/to/logdir\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertEqual(\"/path/to/logdir\", args.logdir)\n\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertIsNone(args.logdir)\n\n    def test_args_debug(self):\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        argv.append(\"-d\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertTrue(args.debug)\n\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--debug\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertTrue(args.debug)\n\n        argv = []\n        argv.append(\"-c\")\n        argv.append(\"/path/to/config\")\n        argv.append(\"--html\")\n        argv.append(\"/path/to/html\")\n        argv.append(\"--scanfs\")\n        argv.append(\"/path/to/scanfs\")\n        args = Seedsync._parse_args(argv)\n        self.assertIsNotNone(args)\n        self.assertFalse(args.debug)\n\n    def test_default_config(self):\n        config = Seedsync._create_default_config()\n        # Test that default config doesn't have any uninitialized values\n        config_dict = config.as_dict()\n        for section, inner_config in config_dict.items():\n            for key in inner_config:\n                self.assertIsNotNone(inner_config[key],\n                                     msg=\"{}.{} is uninitialized\".format(section, key))\n\n        # Test that default config is a valid config\n        config_dict = config.as_dict()\n        config2 = Config.from_dict(config_dict)\n        config2_dict = config2.as_dict()\n        self.assertEqual(config_dict, config2_dict)\n\n    def test_detect_incomplete_config(self):\n        # Test a complete config\n        config = Seedsync._create_default_config()\n        incomplete_value = config.lftp.remote_address\n        config.lftp.remote_address = \"value\"\n        config.lftp.remote_password = \"value\"\n        config.lftp.remote_username = \"value\"\n        config.lftp.remote_path = \"value\"\n        config.lftp.local_path = \"value\"\n        config.lftp.remote_path_to_scan_script = \"value\"\n        self.assertFalse(Seedsync._detect_incomplete_config(config))\n\n        # Test incomplete configs\n        config.lftp.remote_address = incomplete_value\n        self.assertTrue(Seedsync._detect_incomplete_config(config))\n        config.lftp.remote_address = \"value\"\n\n        config.lftp.remote_username = incomplete_value\n        self.assertTrue(Seedsync._detect_incomplete_config(config))\n        config.lftp.remote_username = \"value\"\n\n        config.lftp.remote_path = incomplete_value\n        self.assertTrue(Seedsync._detect_incomplete_config(config))\n        config.lftp.remote_path = \"value\"\n\n        config.lftp.local_path = incomplete_value\n        self.assertTrue(Seedsync._detect_incomplete_config(config))\n        config.lftp.local_path = \"value\"\n\n        config.lftp.remote_path_to_scan_script = incomplete_value\n        self.assertTrue(Seedsync._detect_incomplete_config(config))\n        config.lftp.remote_path_to_scan_script = \"value\"\n"
  },
  {
    "path": "src/python/tests/unittests/test_ssh/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_ssh/test_sshcp.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport os\nimport tempfile\nimport shutil\nimport filecmp\nimport logging\nimport sys\n\nimport timeout_decorator\nfrom parameterized import parameterized\n\nfrom tests.utils import TestUtils\nfrom common import overrides\nfrom ssh import Sshcp, SshcpError\n\n\n# This is outside so it can be used in the parameterized decorators\n# noinspection SpellCheckingInspection\n_PASSWORD = \"seedsyncpass\"\n# noinspection SpellCheckingInspection\n_PARAMS = [\n    (\"password\", _PASSWORD),\n    (\"keyauth\", None)\n]\n\n\n# noinspection SpellCheckingInspection\nclass TestSshcp(unittest.TestCase):\n    __KEEP_FILES = False  # for debugging\n\n    @overrides(unittest.TestCase)\n    def setUp(self):\n        self.temp_dir = tempfile.mkdtemp(prefix=\"test_sshcp\")\n        self.local_dir = os.path.join(self.temp_dir, \"local\")\n        os.mkdir(self.local_dir)\n        self.remote_dir = os.path.join(self.temp_dir, \"remote\")\n        os.mkdir(self.remote_dir)\n\n        # Allow group access for the seedsynctest account\n        TestUtils.chmod_from_to(self.remote_dir, tempfile.gettempdir(), 0o775)\n\n        # Note: seedsynctest account must be set up. See DeveloperReadme.md for details\n        self.host = \"127.0.0.1\"\n        self.port = 22\n        self.user = \"seedsynctest\"\n\n        logger = logging.getLogger()\n        handler = logging.StreamHandler(sys.stdout)\n        logger.addHandler(handler)\n        logger.setLevel(logging.DEBUG)\n        formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\")\n        handler.setFormatter(formatter)\n\n        # Create local file\n        self.local_file = os.path.join(self.local_dir, \"file.txt\")\n        self.remote_file = os.path.join(self.remote_dir, \"file2.txt\")\n        with open(self.local_file, \"w\") as f:\n            f.write(\"this is a test file\")\n\n    @overrides(unittest.TestCase)\n    def tearDown(self):\n        if not self.__KEEP_FILES:\n            shutil.rmtree(self.temp_dir)\n\n    def test_ctor(self):\n        sshcp = Sshcp(host=self.host, port=self.port)\n        self.assertIsNotNone(sshcp)\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_copy(self, _, password):\n        self.assertFalse(os.path.exists(self.remote_file))\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n        sshcp.copy(local_path=self.local_file, remote_path=self.remote_file)\n\n        self.assertTrue(filecmp.cmp(self.local_file, self.remote_file))\n\n    @timeout_decorator.timeout(5)\n    def test_copy_error_bad_password(self):\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=\"wrong password\")\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.copy(local_path=self.local_file, remote_path=self.remote_file)\n        self.assertEqual(\"Incorrect password\", str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_copy_error_missing_local_file(self, _, password):\n        local_file = os.path.join(self.local_dir, \"nofile.txt\")\n        self.assertFalse(os.path.exists(self.remote_file))\n        self.assertFalse(os.path.exists(local_file))\n\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.copy(local_path=local_file, remote_path=self.remote_file)\n        self.assertTrue(\"No such file or directory\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_copy_error_missing_remote_dir(self, _, password):\n        remote_file = os.path.join(self.remote_dir, \"nodir\", \"file2.txt\")\n        self.assertFalse(os.path.exists(remote_file))\n\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.copy(local_path=self.local_file, remote_path=remote_file)\n        self.assertTrue(\"No such file or directory\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_copy_error_bad_host(self, _, password):\n        sshcp = Sshcp(host=\"badhost\", port=self.port, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.copy(local_path=self.local_file, remote_path=self.remote_file)\n        self.assertTrue(\"Connection refused by server\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_copy_error_bad_port(self, _, password):\n        sshcp = Sshcp(host=self.host, port=666, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.copy(local_path=self.local_file, remote_path=self.remote_file)\n        print(str(ctx.exception))\n        self.assertTrue(\"Connection refused by server\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_shell(self, _, password):\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n        out = sshcp.shell(\"cd {}; pwd\".format(self.local_dir))\n        out_str = out.decode().strip()\n        self.assertEqual(self.local_dir, out_str)\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_shell_with_escape_characters(self, _, password):\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n\n        # single quotes\n        _dir = os.path.join(self.remote_dir, \"a a\")\n        out = sshcp.shell(\"mkdir '{}' && cd '{}' && pwd\".format(_dir, _dir))\n        out_str = out.decode().strip()\n        self.assertEqual(_dir, out_str)\n\n        # double quotes\n        _dir = os.path.join(self.remote_dir, \"a b\")\n        out = sshcp.shell('mkdir \"{}\" && cd \"{}\" && pwd'.format(_dir, _dir))\n        out_str = out.decode().strip()\n        self.assertEqual(_dir, out_str)\n\n        # single and double quotes - error out\n        _dir = os.path.join(self.remote_dir, \"a b\")\n        with self.assertRaises(ValueError):\n            sshcp.shell('mkdir \"{}\" && cd \\'{}\\' && pwd'.format(_dir, _dir))\n\n    @timeout_decorator.timeout(5)\n    def test_shell_error_bad_password(self):\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=\"wrong password\")\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.shell(\"cd {}; pwd\".format(self.local_dir))\n        self.assertEqual(\"Incorrect password\", str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_shell_error_bad_host(self, _, password):\n        sshcp = Sshcp(host=\"badhost\", port=self.port, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.shell(\"cd {}; pwd\".format(self.local_dir))\n        self.assertTrue(\"Bad hostname\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_shell_error_bad_port(self, _, password):\n        sshcp = Sshcp(host=self.host, port=6666, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.shell(\"cd {}; pwd\".format(self.local_dir))\n        self.assertTrue(\"Connection refused by server\" in str(ctx.exception))\n\n    @parameterized.expand(_PARAMS)\n    @timeout_decorator.timeout(5)\n    def test_shell_error_bad_command(self, _, password):\n        sshcp = Sshcp(host=self.host, port=self.port, user=self.user, password=password)\n        with self.assertRaises(SshcpError) as ctx:\n            sshcp.shell(\"./some_bad_command.sh\".format(self.local_dir))\n        self.assertTrue(\"./some_bad_command.sh\" in str(ctx.exception))\n"
  },
  {
    "path": "src/python/tests/unittests/test_system/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_system/test_file.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom datetime import datetime\n\nfrom system import SystemFile\n\n\nclass TestSystemFile(unittest.TestCase):\n    def test_name(self):\n        sf = SystemFile(\"test\", 0, False)\n        self.assertEqual(\"test\", sf.name)\n\n    def test_size(self):\n        sf = SystemFile(\"\", 42, False)\n        self.assertEqual(42, sf.size)\n        with self.assertRaises(ValueError) as context:\n            # noinspection PyUnusedLocal\n            sf = SystemFile(\"\", -42, False)\n        self.assertTrue(\"File size must be greater than zero\" in str(context.exception))\n\n    def test_is_dir(self):\n        sf = SystemFile(\"\", 0, True)\n        self.assertEqual(True, sf.is_dir)\n        sf = SystemFile(\"\", 0, False)\n        self.assertEqual(False, sf.is_dir)\n\n    def test_time_created(self):\n        sf = SystemFile(\"\", 0, True, time_created=datetime(2018, 11, 9, 21, 40, 18))\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18), sf.timestamp_created)\n        sf = SystemFile(\"\", 0, True)\n        self.assertIsNone(sf.timestamp_created)\n\n    def test_time_modified(self):\n        sf = SystemFile(\"\", 0, True, time_modified=datetime(2018, 11, 9, 21, 40, 18))\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18), sf.timestamp_modified)\n        sf = SystemFile(\"\", 0, True)\n        self.assertIsNone(sf.timestamp_modified)\n\n    def test_add_child(self):\n        sf = SystemFile(\"\", 0, True)\n        sf.add_child(SystemFile(\"child1\", 42, True))\n        sf.add_child(SystemFile(\"child2\", 99, False))\n        self.assertEqual(2, len(sf.children))\n        self.assertEqual(\"child1\", sf.children[0].name)\n        self.assertEqual(True, sf.children[0].is_dir)\n        self.assertEqual(42, sf.children[0].size)\n        self.assertEqual(\"child2\", sf.children[1].name)\n        self.assertEqual(False, sf.children[1].is_dir)\n        self.assertEqual(99, sf.children[1].size)\n\n    def test_fail_add_child_to_file(self):\n        sf = SystemFile(\"\", 0, False)\n        with self.assertRaises(TypeError) as context:\n            sf.add_child(SystemFile(\"\", 0, False))\n        self.assertTrue(\"Cannot add children to a file\" in str(context.exception))\n\n    def test_equality_operator(self):\n        a1 = SystemFile(\"a\", 50, is_dir=True,\n                        time_created=datetime(2018, 11, 9, 21, 40, 18),\n                        time_modified=datetime(2018, 11, 9, 21, 40, 18))\n        a1.add_child(SystemFile(\"aa\", 40, is_dir=False))\n        a1.add_child(SystemFile(\"ab\", 10, is_dir=False))\n\n        a2 = SystemFile(\"a\", 50, is_dir=True,\n                        time_created=datetime(2018, 11, 9, 21, 40, 18),\n                        time_modified=datetime(2018, 11, 9, 21, 40, 18))\n        a2.add_child(SystemFile(\"aa\", 40, is_dir=False))\n        a2.add_child(SystemFile(\"ab\", 10, is_dir=False))\n\n        a3 = SystemFile(\"a\", 50, is_dir=True,\n                        time_created=datetime(2018, 11, 9, 21, 40, 18),\n                        time_modified=datetime(2018, 11, 9, 21, 40, 18))\n        a3.add_child(SystemFile(\"aa\", 40, is_dir=False))\n        a3.add_child(SystemFile(\"ab\", 11, is_dir=False))  # different child size\n\n        a4 = SystemFile(\"a\", 50, is_dir=True,\n                        time_created=datetime(2018, 11, 9, 21, 40, 19),  # different timestamp\n                        time_modified=datetime(2018, 11, 9, 21, 40, 18))\n        a4.add_child(SystemFile(\"aa\", 40, is_dir=False))\n        a4.add_child(SystemFile(\"ab\", 10, is_dir=False))\n\n        self.assertTrue(a1 == a2)\n        self.assertFalse(a1 == a3)\n        self.assertFalse(a1 == a4)\n"
  },
  {
    "path": "src/python/tests/unittests/test_system/test_scanner.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom threading import Thread\nfrom datetime import datetime\n\nfrom system import SystemScanner, SystemScannerError\n\n\ndef my_mkdir(*args):\n    os.mkdir(os.path.join(TestSystemScanner.temp_dir, *args))\n\n\ndef my_touch(size, *args):\n    path = os.path.join(TestSystemScanner.temp_dir, *args)\n    with open(path, 'wb') as f:\n        f.write(bytearray([0xff] * size))\n\n\ndef my_mkdir_latin(*args):\n    os.mkdir(os.path.join(TestSystemScanner.temp_dir.encode('latin-1'), *args))\n\n\ndef my_touch_latin(size, *args):\n    path = os.path.join(TestSystemScanner.temp_dir.encode('latin-1'), *args)\n    with open(path, 'wb') as f:\n        f.write(bytearray([0xff] * size))\n\n\n# noinspection SpellCheckingInspection\nclass TestSystemScanner(unittest.TestCase):\n    temp_dir = None\n\n    def setUp(self):\n        # Create a temp directory\n        TestSystemScanner.temp_dir = tempfile.mkdtemp(prefix=\"test_system_scanner\")\n\n    def tearDown(self):\n        # Cleanup\n        shutil.rmtree(TestSystemScanner.temp_dir)\n\n    def setup_default_tree(self):\n        # Create a bunch files and directories\n        # a [dir]\n        #   aa [dir]\n        #      .aaa [dir]\n        #      .aab [file, 512 bytes]\n        #   ab [file, 12*1024 + 4 bytes]\n        # b [dir]\n        #   ba [dir]\n        #      baa [file, 512 + 7 bytes]\n        #   bb [dir]\n        #     bba [dir]\n        #     bbb [file, 24*1024*1024 + 24 bytes]\n        #     bbc [dir]\n        #        bbca [dir]\n        #           .bbcaa [file, 1 byte\n        # c [file, 1234 bytes]\n        my_mkdir(\"a\")\n        my_mkdir(\"a\", \"aa\")\n        my_mkdir(\"a\", \"aa\", \".aaa\")\n        my_touch(512, \"a\", \"aa\", \".aab\")\n        my_touch(12*1024+4, \"a\", \"ab\")\n        my_mkdir(\"b\")\n        my_mkdir(\"b\", \"ba\")\n        my_touch(512+7, \"b\", \"ba\", \"baa\")\n        my_mkdir(\"b\", \"bb\")\n        my_mkdir(\"b\", \"bb\", \"bba\")\n        my_touch(24*1024*1024+24, \"b\", \"bb\", \"bbb\")\n        my_mkdir(\"b\", \"bb\", \"bbc\")\n        my_mkdir(\"b\", \"bb\", \"bbc\", \"bbca\")\n        my_touch(1, \"b\", \"bb\", \"bbc\", \"bbca\", \".bbcaa\")\n        my_touch(1234, \"c\")\n\n    def test_scan_tree(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n\n        self.assertEqual(\"a\", a.name)\n        self.assertTrue(a.is_dir)\n        self.assertEqual(\"b\", b.name)\n        self.assertTrue(b.is_dir)\n        self.assertEqual(\"c\", c.name)\n        self.assertFalse(c.is_dir)\n\n        self.assertEqual(2, len(a.children))\n        aa, ab = tuple(a.children)\n        self.assertEqual(\"aa\", aa.name)\n        self.assertTrue(aa.is_dir)\n        self.assertEqual(2, len(aa.children))\n        aaa, aab = tuple(aa.children)\n        self.assertEqual(\".aaa\", aaa.name)\n        self.assertTrue(aaa.is_dir)\n        self.assertEqual(\".aab\", aab.name)\n        self.assertFalse(aab.is_dir)\n        self.assertEqual(\"ab\", ab.name)\n        self.assertFalse(ab.is_dir)\n\n        self.assertEqual(2, len(b.children))\n        ba, bb = tuple(b.children)\n        self.assertEqual(\"ba\", ba.name)\n        self.assertTrue(ba.is_dir)\n        self.assertEqual(1, len(ba.children))\n        baa = ba.children[0]\n        self.assertEqual(\"baa\", baa.name)\n        self.assertFalse(baa.is_dir)\n        self.assertEqual(\"bb\", bb.name)\n        self.assertTrue(bb.is_dir)\n        self.assertEqual(3, len(bb.children))\n        bba, bbb, bbc = tuple(bb.children)\n        self.assertEqual(\"bba\", bba.name)\n        self.assertTrue(bba.is_dir)\n        self.assertEqual(\"bbb\", bbb.name)\n        self.assertFalse(bbb.is_dir)\n        self.assertEqual(\"bbc\", bbc.name)\n        self.assertTrue(bbc.is_dir)\n        self.assertEqual(1, len(bbc.children))\n        bbca = bbc.children[0]\n        self.assertEqual(\"bbca\", bbca.name)\n        self.assertTrue(bbca.is_dir)\n        self.assertEqual(1, len(bbca.children))\n        bbcaa = bbca.children[0]\n        self.assertEqual(\".bbcaa\", bbcaa.name)\n        self.assertFalse(bbcaa.is_dir)\n\n    def test_scan_size(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        aa, ab = tuple(a.children)\n        aaa, aab = tuple(aa.children)\n        ba, bb = tuple(b.children)\n        baa = ba.children[0]\n        bba, bbb, bbc = tuple(bb.children)\n        bbca = bbc.children[0]\n        bbcaa = bbca.children[0]\n\n        self.assertEqual(12*1024+4+512, a.size)\n        self.assertEqual(512, aa.size)\n        self.assertEqual(0, aaa.size)\n        self.assertEqual(512, aab.size)\n        self.assertEqual(12*1024+4, ab.size)\n        self.assertEqual(512+7+24*1024*1024+24+1, b.size)\n        self.assertEqual(512+7, ba.size)\n        self.assertEqual(512+7, baa.size)\n        self.assertEqual(24*1024*1024+24+1, bb.size)\n        self.assertEqual(0, bba.size)\n        self.assertEqual(24*1024*1024+24, bbb.size)\n        self.assertEqual(1, bbc.size)\n        self.assertEqual(1, bbca.size)\n        self.assertEqual(1, bbcaa.size)\n        self.assertEqual(1234, c.size)\n\n    def test_scan_non_existing_dir_fails(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(\n            path_to_scan=os.path.join(TestSystemScanner.temp_dir, \"nonexisting\")\n        )\n        with self.assertRaises(SystemScannerError) as ex:\n            scanner.scan()\n        self.assertTrue(str(ex.exception).startswith(\"Path does not exist\"))\n\n    def test_scan_file_fails(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(\n            path_to_scan=os.path.join(TestSystemScanner.temp_dir, \"c\")\n        )\n        with self.assertRaises(SystemScannerError) as ex:\n            scanner.scan()\n        self.assertTrue(str(ex.exception).startswith(\"Path is not a directory\"))\n\n    def test_scan_single_dir(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        a = scanner.scan_single(\"a\")\n\n        self.assertEqual(\"a\", a.name)\n        self.assertTrue(a.is_dir)\n\n        self.assertEqual(2, len(a.children))\n        aa, ab = tuple(a.children)\n        self.assertEqual(\"aa\", aa.name)\n        self.assertTrue(aa.is_dir)\n        self.assertEqual(2, len(aa.children))\n        aaa, aab = tuple(aa.children)\n        self.assertEqual(\".aaa\", aaa.name)\n        self.assertTrue(aaa.is_dir)\n        self.assertEqual(\".aab\", aab.name)\n        self.assertFalse(aab.is_dir)\n        self.assertEqual(\"ab\", ab.name)\n        self.assertFalse(ab.is_dir)\n\n        self.assertEqual(12*1024+4+512, a.size)\n        self.assertEqual(512, aa.size)\n        self.assertEqual(0, aaa.size)\n        self.assertEqual(512, aab.size)\n        self.assertEqual(12*1024+4, ab.size)\n\n    def test_scan_single_file(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        c = scanner.scan_single(\"c\")\n\n        self.assertEqual(\"c\", c.name)\n        self.assertFalse(c.is_dir)\n        self.assertEqual(1234, c.size)\n\n    def test_scan_single_non_existing_path_fails(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(\n            path_to_scan=os.path.join(TestSystemScanner.temp_dir)\n        )\n        with self.assertRaises(SystemScannerError) as ex:\n            scanner.scan_single(\"nonexisting\")\n        self.assertTrue(str(ex.exception).startswith(\"Path does not exist\"))\n\n    def test_scan_tree_excluded_prefix(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        scanner.add_exclude_prefix(\".\")\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        aa, ab = tuple(a.children)\n        ba, bb = tuple(b.children)\n        bba, bbb, bbc = tuple(bb.children)\n        bbca = bbc.children[0]\n        self.assertEqual(0, len(aa.children))\n        self.assertEqual(0, len(bbca.children))\n\n        scanner.add_exclude_prefix(\"ab\")\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        self.assertEqual(1, len(a.children))\n        aa = a.children[0]\n        ba, bb = tuple(b.children)\n        bba, bbb, bbc = tuple(bb.children)\n        bbca = bbc.children[0]\n        self.assertEqual(\"aa\", aa.name)\n        self.assertEqual(0, len(bbca.children))\n\n    def test_scan_size_excluded_prefix(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        scanner.add_exclude_prefix(\".\")\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        aa, ab = tuple(a.children)\n        ba, bb = tuple(b.children)\n        bba, bbb, bbc = tuple(bb.children)\n        bbca = bbc.children[0]\n        self.assertEqual(12*1024+4, a.size)\n        self.assertEqual(0, aa.size)\n        self.assertEqual(24*1024*1024+24+0, bb.size)\n        self.assertEqual(0, bbc.size)\n        self.assertEqual(0, bbca.size)\n\n        scanner.add_exclude_prefix(\"ab\")\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        self.assertEqual(1, len(a.children))\n        aa = a.children[0]\n        self.assertEqual(\"aa\", aa.name)\n        self.assertEqual(0, a.size)\n        self.assertEqual(0, aa.size)\n\n    def test_scan_tree_excluded_suffix(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n\n        scanner.add_exclude_suffix(\"ab\")\n        scanner.add_exclude_suffix(\"bb\")\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n        self.assertEqual(1, len(a.children))\n        aa = a.children[0]\n        self.assertEqual(\"aa\", aa.name)\n        self.assertEqual(1, len(aa.children))\n        aaa = aa.children[0]\n        self.assertEqual(\".aaa\", aaa.name)\n        self.assertEqual(1, len(b.children))\n        ba = b.children[0]\n        self.assertEqual(\"ba\", ba.name)\n\n    def test_scan_size_excluded_suffix(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n\n        scanner.add_exclude_suffix(\"ab\")\n        scanner.add_exclude_suffix(\"bb\")\n        files = scanner.scan()\n        a, b, c = tuple(files)\n        aa = a.children[0]\n        aaa = aa.children[0]\n        ba = b.children[0]\n        self.assertEqual(0, a.size)\n        self.assertEqual(0, aa.size)\n        self.assertEqual(0, aaa.size)\n        self.assertEqual(512+7, b.size)\n        self.assertEqual(512+7, ba.size)\n        self.assertEqual(1234, c.size)\n\n    def test_lftp_status_file_size(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        size = scanner._lftp_status_file_size(\"\"\"\n        size=243644865\n        0.pos=31457280\n        0.limit=60911217\n        1.pos=87060081\n        1.limit=121822433\n        2.pos=144268513\n        2.limit=182733649\n        3.pos=207473489\n        3.limit=243644865\n        \"\"\")\n        self.assertEqual(104792064, size)\n\n    def test_scan_lftp_partial_file(self):\n        tempdir = TestSystemScanner.temp_dir\n\n        # Create a partial file\n        os.mkdir(os.path.join(tempdir, \"t\"))\n        path = os.path.join(tempdir, \"t\", \"partial.mkv\")\n        with open(path, 'wb') as f:\n            f.write(bytearray([0xff] * 24588))\n        # Write the lftp status out\n        path = os.path.join(tempdir, \"t\", \"partial.mkv.lftp-pget-status\")\n        with open(path, \"w\") as f:\n            f.write(\"\"\"\n            size=24588\n            0.pos=3157\n            0.limit=6147\n            1.pos=11578\n            1.limit=12294\n            2.pos=12295\n            2.limit=18441\n            3.pos=20000\n            3.limit=24588\n            \"\"\")\n        scanner = SystemScanner(tempdir)\n        files = scanner.scan()\n        self.assertEqual(1, len(files))\n        t = files[0]\n        self.assertEqual(\"t\", t.name)\n        self.assertEqual(10148, t.size)\n        self.assertEqual(1, len(t.children))\n        partial_mkv = t.children[0]\n        self.assertEqual(\"partial.mkv\", partial_mkv.name)\n        self.assertEqual(10148, partial_mkv.size)\n\n    def test_scan_single_lftp_partial_file(self):\n        # Scan a single partial file\n        tempdir = TestSystemScanner.temp_dir\n\n        # Create a partial file\n        path = os.path.join(tempdir, \"partial.mkv\")\n        with open(path, 'wb') as f:\n            f.write(bytearray([0xff] * 24588))\n        # Write the lftp status out\n        path = os.path.join(tempdir, \"partial.mkv.lftp-pget-status\")\n        with open(path, \"w\") as f:\n            f.write(\"\"\"\n            size=24588\n            0.pos=3157\n            0.limit=6147\n            1.pos=11578\n            1.limit=12294\n            2.pos=12295\n            2.limit=18441\n            3.pos=20000\n            3.limit=24588\n            \"\"\")\n        scanner = SystemScanner(tempdir)\n        partial_mkv = scanner.scan_single(\"partial.mkv\")\n        self.assertEqual(\"partial.mkv\", partial_mkv.name)\n        self.assertEqual(10148, partial_mkv.size)\n\n    def test_scan_lftp_temp_file(self):\n        tempdir = TestSystemScanner.temp_dir\n\n        # Create some temp and non-temp files\n        temp1 = os.path.join(tempdir, \"a.mkv.lftp\")\n        with open(temp1, 'wb') as f:\n            f.write(bytearray([0xff] * 100))\n        temp2 = os.path.join(tempdir, \"b.rar.lftp\")\n        with open(temp2, 'wb') as f:\n            f.write(bytearray([0xff] * 200))\n        nontemp1 = os.path.join(tempdir, \"c.rar\")\n        with open(nontemp1, 'wb') as f:\n            f.write(bytearray([0xff] * 300))\n        nontemp2 = os.path.join(tempdir, \"d.lftp.avi\")\n        with open(nontemp2, 'wb') as f:\n            f.write(bytearray([0xff] * 400))\n        nontemp3 = os.path.join(tempdir, \"e\")\n        os.mkdir(nontemp3)\n        temp3 = os.path.join(nontemp3, \"ea.txt.lftp\")\n        with open(temp3, 'wb') as f:\n            f.write(bytearray([0xff] * 500))\n        nontemp4 = os.path.join(tempdir, \"f.lftp\")\n        os.mkdir(nontemp4)\n\n        scanner = SystemScanner(tempdir)\n\n        # No temp suffix set\n        files = scanner.scan()\n        self.assertEqual(6, len(files))\n        a, b, c, d, e, f = tuple(files)\n        self.assertEqual(\"a.mkv.lftp\", a.name)\n        self.assertEqual(100, a.size)\n        self.assertEqual(False, a.is_dir)\n        self.assertEqual(\"b.rar.lftp\", b.name)\n        self.assertEqual(200, b.size)\n        self.assertEqual(False, b.is_dir)\n        self.assertEqual(\"c.rar\", c.name)\n        self.assertEqual(300, c.size)\n        self.assertEqual(False, c.is_dir)\n        self.assertEqual(\"d.lftp.avi\", d.name)\n        self.assertEqual(400, d.size)\n        self.assertEqual(False, d.is_dir)\n        self.assertEqual(\"e\", e.name)\n        self.assertEqual(500, e.size)\n        self.assertEqual(True, e.is_dir)\n        self.assertEqual(1, len(e.children))\n        ea = e.children[0]\n        self.assertEqual(\"ea.txt.lftp\", ea.name)\n        self.assertEqual(500, ea.size)\n        self.assertEqual(False, ea.is_dir)\n        self.assertEqual(\"f.lftp\", f.name)\n        self.assertEqual(0, f.size)\n        self.assertEqual(True, f.is_dir)\n\n        # Temp suffix set\n        scanner.set_lftp_temp_suffix(\".lftp\")\n        files = scanner.scan()\n        self.assertEqual(6, len(files))\n        a, b, c, d, e, f = tuple(files)\n        self.assertEqual(\"a.mkv\", a.name)\n        self.assertEqual(100, a.size)\n        self.assertEqual(False, a.is_dir)\n        self.assertEqual(\"b.rar\", b.name)\n        self.assertEqual(200, b.size)\n        self.assertEqual(False, b.is_dir)\n        self.assertEqual(\"c.rar\", c.name)\n        self.assertEqual(300, c.size)\n        self.assertEqual(False, c.is_dir)\n        self.assertEqual(\"d.lftp.avi\", d.name)\n        self.assertEqual(400, d.size)\n        self.assertEqual(False, d.is_dir)\n        self.assertEqual(\"e\", e.name)\n        self.assertEqual(500, e.size)\n        self.assertEqual(True, e.is_dir)\n        self.assertEqual(1, len(e.children))\n        ea = e.children[0]\n        self.assertEqual(\"ea.txt\", ea.name)\n        self.assertEqual(500, ea.size)\n        self.assertEqual(False, ea.is_dir)\n        self.assertEqual(\"f.lftp\", f.name)\n        self.assertEqual(0, f.size)\n        self.assertEqual(True, f.is_dir)\n\n    def test_scan_single_lftp_temp_file(self):\n        tempdir = TestSystemScanner.temp_dir\n\n        # Create:\n        #   temp file\n        #   non-temp file and\n        #   non-temp directory with temp name\n        #   non-temp directory with non-temp name\n        temp1 = os.path.join(tempdir, \"a.mkv.lftp\")\n        with open(temp1, 'wb') as f:\n            f.write(bytearray([0xff] * 100))\n\n        nontemp1 = os.path.join(tempdir, \"b.rar\")\n        with open(nontemp1, 'wb') as f:\n            f.write(bytearray([0xff] * 300))\n\n        nontemp2 = os.path.join(tempdir, \"c.lftp\")\n        os.mkdir(nontemp2)\n        temp2 = os.path.join(nontemp2, \"c.txt.lftp\")\n        with open(temp2, 'wb') as f:\n            f.write(bytearray([0xff] * 500))\n\n        nontemp3 = os.path.join(tempdir, \"d\")\n        os.mkdir(nontemp3)\n        temp3 = os.path.join(nontemp3, \"d.avi.lftp\")\n        with open(temp3, 'wb') as f:\n            f.write(bytearray([0xff] * 600))\n\n        scanner = SystemScanner(tempdir)\n\n        # No temp suffix set, must include temp suffix in name param\n        file = scanner.scan_single(\"a.mkv.lftp\")\n        self.assertEqual(\"a.mkv.lftp\", file.name)\n        self.assertEqual(100, file.size)\n        self.assertEqual(False, file.is_dir)\n\n        file = scanner.scan_single(\"b.rar\")\n        self.assertEqual(\"b.rar\", file.name)\n        self.assertEqual(300, file.size)\n        self.assertEqual(False, file.is_dir)\n\n        file = scanner.scan_single(\"c.lftp\")\n        self.assertEqual(\"c.lftp\", file.name)\n        self.assertEqual(500, file.size)\n        self.assertEqual(True, file.is_dir)\n        self.assertEqual(1, len(file.children))\n        child = file.children[0]\n        self.assertEqual(\"c.txt.lftp\", child.name)\n        self.assertEqual(500, child.size)\n        self.assertEqual(False, child.is_dir)\n\n        file = scanner.scan_single(\"d\")\n        self.assertEqual(\"d\", file.name)\n        self.assertEqual(600, file.size)\n        self.assertEqual(True, file.is_dir)\n        child = file.children[0]\n        self.assertEqual(\"d.avi.lftp\", child.name)\n        self.assertEqual(600, child.size)\n        self.assertEqual(False, child.is_dir)\n\n        # Temp suffix set, must NOT include temp suffix in name param\n        scanner.set_lftp_temp_suffix(\".lftp\")\n        file = scanner.scan_single(\"a.mkv\")\n        self.assertEqual(\"a.mkv\", file.name)\n        self.assertEqual(100, file.size)\n        self.assertEqual(False, file.is_dir)\n\n        file = scanner.scan_single(\"b.rar\")\n        self.assertEqual(\"b.rar\", file.name)\n        self.assertEqual(300, file.size)\n        self.assertEqual(False, file.is_dir)\n\n        file = scanner.scan_single(\"c.lftp\")\n        self.assertEqual(\"c.lftp\", file.name)\n        self.assertEqual(500, file.size)\n        self.assertEqual(True, file.is_dir)\n        self.assertEqual(1, len(file.children))\n        child = file.children[0]\n        self.assertEqual(\"c.txt\", child.name)\n        self.assertEqual(500, child.size)\n        self.assertEqual(False, child.is_dir)\n        # also, shouldn't look for directories with temp suffix\n        with self.assertRaises(SystemScannerError) as ctx:\n            scanner.scan_single(\"c\")\n        self.assertTrue(\"Path does not exist\" in str(ctx.exception))\n\n        file = scanner.scan_single(\"d\")\n        self.assertEqual(\"d\", file.name)\n        self.assertEqual(600, file.size)\n        self.assertEqual(True, file.is_dir)\n        child = file.children[0]\n        self.assertEqual(\"d.avi\", child.name)\n        self.assertEqual(600, child.size)\n        self.assertEqual(False, child.is_dir)\n\n        # No file and no temp file\n        with self.assertRaises(SystemScannerError) as ctx:\n            scanner.scan_single(\"blah\")\n        self.assertTrue(\"Path does not exist\" in str(ctx.exception))\n\n    def test_files_deleted_while_scanning(self):\n        self.setup_default_tree()\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n\n        stop = False\n\n        # Make and delete files while test runs\n        def monkey_with_files():\n            orig = os.path.join(TestSystemScanner.temp_dir, \"b\")\n            dest = os.path.join(TestSystemScanner.temp_dir, \"b_copy\")\n            while not stop:\n                shutil.copytree(orig, dest)\n                shutil.rmtree(dest)\n        thread = Thread(target=monkey_with_files)\n        thread.start()\n\n        try:\n            # Scan a bunch of times\n            for i in range(0, 2000):\n                files = scanner.scan()\n                # Must have at least the untouched files\n                self.assertGreaterEqual(len(files), 3)\n                names = set([f.name for f in files])\n                self.assertIn(\"a\", names)\n                self.assertIn(\"b\", names)\n                self.assertIn(\"c\", names)\n        finally:\n            stop = True\n            thread.join()\n\n    def test_scan_modified_time(self):\n        self.setup_default_tree()\n        # directory\n        os.utime(\n            os.path.join(TestSystemScanner.temp_dir, \"a\"),\n            (\n                datetime.now().timestamp(),\n                datetime(2018, 11, 9, 21, 40, 18).timestamp()\n            )\n        )\n\n        # file\n        os.utime(\n            os.path.join(TestSystemScanner.temp_dir, \"c\"),\n            (\n                datetime.now().timestamp(),\n                datetime(2018, 11, 9, 21, 40, 17).timestamp()\n            )\n        )\n\n        scanner = SystemScanner(TestSystemScanner.temp_dir)\n        files = scanner.scan()\n        self.assertEqual(3, len(files))\n        a, b, c = tuple(files)\n\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 18), a.timestamp_modified)\n        self.assertEqual(datetime(2018, 11, 9, 21, 40, 17), c.timestamp_modified)\n\n    def test_scan_file_with_unicode_chars(self):\n        tempdir = TestSystemScanner.temp_dir\n        # déģķ [dir]\n        # dőÀ× [file, 128 bytes]\n        my_mkdir(\"déģķ\")\n        my_touch(128, \"dőÀ\")\n\n        scanner = SystemScanner(tempdir)\n        files = scanner.scan()\n        self.assertEqual(2, len(files))\n        folder, file = tuple(files)\n        self.assertEqual(0, len(folder.children))\n        self.assertEqual(\"déģķ\", folder.name)\n        self.assertEqual(\"dőÀ\", file.name)\n        self.assertEqual(128, file.size)\n\n    def test_scan_file_with_latin_chars(self):\n        tempdir = TestSystemScanner.temp_dir\n        # a\\xe9b [dir]\n        # c\\xe9d [file, 128 bytes]\n        my_mkdir_latin(b\"dir\\xe9dir\")\n        my_touch_latin(128, b\"file\\xd9file\")\n\n        scanner = SystemScanner(tempdir)\n        files = scanner.scan()\n        self.assertEqual(2, len(files))\n        folder, file = tuple(files)\n        self.assertEqual(0, len(folder.children))\n        self.assertEqual(\"dir�dir\", folder.name)\n        self.assertEqual(\"file�file\", file.name)\n        self.assertEqual(128, file.size)\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_web/test_handler/test_stream_log.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nfrom unittest.mock import patch\nfrom logging import LogRecord\n\nfrom web.handler.stream_log import CachedQueueLogHandler\n\n\ndef create_log_record(created: float, msg: str) -> LogRecord:\n    record = LogRecord(\n        name=None,\n        level=None,\n        pathname=None,\n        lineno=None,\n        msg=msg,\n        args=None,\n        exc_info=None\n    )\n    record.created = created\n    return record\n\n\nclass TestCachedQueueLogHandler(unittest.TestCase):\n    @patch(\"web.handler.stream_log.time\")\n    def test_caches_new_records(self, mock_time_module):\n        time_func = mock_time_module.time\n\n        cache = CachedQueueLogHandler(history_size_in_ms=3000)\n\n        # Set current time at 10000 ms\n        time_func.return_value = 10.0\n\n        # Create some records between 7000 ms - 10000 ms\n        record1 = create_log_record(7.5, \"record1\")\n        record2 = create_log_record(8.5, \"record2\")\n        record3 = create_log_record(9.5, \"record3\")\n\n        # Pass them to cache\n        cache.emit(record1)\n        cache.emit(record2)\n        cache.emit(record3)\n\n        # Get cached record, all of them should be there\n        actual = cache.get_cached_records()\n        self.assertEqual(3, len(actual))\n        self.assertEqual(\"record1\", actual[0].msg)\n        self.assertEqual(7.5, actual[0].created)\n        self.assertEqual(\"record2\", actual[1].msg)\n        self.assertEqual(8.5, actual[1].created)\n        self.assertEqual(\"record3\", actual[2].msg)\n        self.assertEqual(9.5, actual[2].created)\n\n    @patch(\"web.handler.stream_log.time\")\n    def test_prunes_old_records(self, mock_time_module):\n        time_func = mock_time_module.time\n\n        cache = CachedQueueLogHandler(history_size_in_ms=3000)\n\n        # Set current time at 10000 ms\n        time_func.return_value = 10.0\n\n        # Create some records between 0 ms - 10000 ms\n        record1 = create_log_record(0.5, \"record1\")\n        record2 = create_log_record(5.5, \"record2\")\n        record3 = create_log_record(7.5, \"record3\")\n        record4 = create_log_record(9.5, \"record4\")\n\n        # Pass them to cache\n        cache.emit(record1)\n        cache.emit(record2)\n        cache.emit(record3)\n        cache.emit(record4)\n\n        # Get cached record, only newer than 7000ms should be there\n        actual = cache.get_cached_records()\n        self.assertEqual(2, len(actual))\n        self.assertEqual(\"record3\", actual[0].msg)\n        self.assertEqual(7.5, actual[0].created)\n        self.assertEqual(\"record4\", actual[1].msg)\n        self.assertEqual(9.5, actual[1].created)\n\n    @patch(\"web.handler.stream_log.time\")\n    def test_prunes_old_records_at_get_time(self, mock_time_module):\n        time_func = mock_time_module.time\n\n        cache = CachedQueueLogHandler(history_size_in_ms=3000)\n\n        # Set current time at 10000 ms\n        time_func.return_value = 10.0\n\n        # Create some records between 7000 ms - 10000 ms\n        record1 = create_log_record(7.5, \"record1\")\n        record2 = create_log_record(8.5, \"record2\")\n        record3 = create_log_record(9.5, \"record3\")\n        record4 = create_log_record(10.0, \"record4\")\n\n        # Pass them to cache\n        cache.emit(record1)\n        cache.emit(record2)\n        cache.emit(record3)\n        cache.emit(record4)\n\n        # Now set the current time to 12000 ms\n        time_func.return_value = 12.0\n\n        # Get cached record, only newer than 9000ms should be there\n        actual = cache.get_cached_records()\n        self.assertEqual(2, len(actual))\n        self.assertEqual(\"record3\", actual[0].msg)\n        self.assertEqual(9.5, actual[0].created)\n        self.assertEqual(\"record4\", actual[1].msg)\n        self.assertEqual(10.0, actual[1].created)\n\n    @patch(\"web.handler.stream_log.time\")\n    def test_cache_can_be_disabled(self, mock_time_module):\n        time_func = mock_time_module.time\n\n        cache = CachedQueueLogHandler(history_size_in_ms=0)\n\n        # Set current time at 10000 ms\n        time_func.return_value = 10.0\n\n        # Create some records in past and future\n        record1 = create_log_record(7.5, \"record1\")\n        record2 = create_log_record(10.0, \"record2\")\n        record3 = create_log_record(11.5, \"record3\")\n\n        # Pass them to cache\n        cache.emit(record1)\n        cache.emit(record2)\n        cache.emit(record3)\n\n        # Get cached record, should return nothing\n        actual = cache.get_cached_records()\n        self.assertEqual(0, len(actual))\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/__init__.py",
    "content": ""
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\n\nfrom web.serialize import Serialize\n\n\nclass DummySerialize(Serialize):\n    def dummy(self):\n        return self._sse_pack(event=\"event\", data=\"data\")\n\n\ndef parse_stream(serialized_str: str):\n    parsed = dict()\n    for line in serialized_str.split(\"\\n\"):\n        if line:\n            key, value = line.split(\":\", maxsplit=1)\n            parsed[key.strip()] = value.strip()\n    return parsed\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize_auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\n\nfrom controller import AutoQueuePattern\nfrom web.serialize import SerializeAutoQueue\n\n\nclass TestSerializeConfig(unittest.TestCase):\n    def test_is_list(self):\n        patterns = [\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"two\"),\n            AutoQueuePattern(pattern=\"three\")\n        ]\n        out = SerializeAutoQueue.patterns(patterns)\n        out_list = json.loads(out)\n        self.assertIsInstance(out_list, list)\n        self.assertEqual(3, len(out_list))\n\n    def test_patterns(self):\n        patterns = [\n            AutoQueuePattern(pattern=\"one\"),\n            AutoQueuePattern(pattern=\"tw o\"),\n            AutoQueuePattern(pattern=\"th'ree\"),\n            AutoQueuePattern(pattern=\"fo\\\"ur\"),\n            AutoQueuePattern(pattern=\"fi=ve\")\n        ]\n        out = SerializeAutoQueue.patterns(patterns)\n        out_list = json.loads(out)\n        self.assertEqual(5, len(out_list))\n        self.assertEqual([\n            {\"pattern\": \"one\"},\n            {\"pattern\": \"tw o\"},\n            {\"pattern\": \"th'ree\"},\n            {\"pattern\": \"fo\\\"ur\"},\n            {\"pattern\": \"fi=ve\"},\n        ], out_list)\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize_config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\n\nfrom common import Config\nfrom web.serialize import SerializeConfig\n\n\nclass TestSerializeConfig(unittest.TestCase):\n    def test_section_general(self):\n        config = Config()\n        config.general.debug = True\n        out = SerializeConfig.config(config)\n        out_dict = json.loads(out)\n        self.assertIn(\"general\", out_dict)\n        self.assertEqual(True, out_dict[\"general\"][\"debug\"])\n\n    def test_section_lftp(self):\n        config = Config()\n        config.lftp.remote_address = \"server.remote.com\"\n        config.lftp.remote_username = \"user-on-remote-server\"\n        config.lftp.remote_port = 3456\n        config.lftp.remote_path = \"/remote/server/path\"\n        config.lftp.local_path = \"/local/server/path\"\n        config.lftp.remote_path_to_scan_script = \"/remote/server/path/to/script\"\n        config.lftp.num_max_parallel_downloads = 6\n        config.lftp.num_max_parallel_files_per_download = 7\n        config.lftp.num_max_connections_per_root_file = 2\n        config.lftp.num_max_connections_per_dir_file = 3\n        config.lftp.num_max_total_connections = 4\n        out = SerializeConfig.config(config)\n        out_dict = json.loads(out)\n        self.assertIn(\"lftp\", out_dict)\n        self.assertEqual(\"server.remote.com\", out_dict[\"lftp\"][\"remote_address\"])\n        self.assertEqual(\"user-on-remote-server\", out_dict[\"lftp\"][\"remote_username\"])\n        self.assertEqual(3456, out_dict[\"lftp\"][\"remote_port\"])\n        self.assertEqual(\"/remote/server/path\", out_dict[\"lftp\"][\"remote_path\"])\n        self.assertEqual(\"/local/server/path\", out_dict[\"lftp\"][\"local_path\"])\n        self.assertEqual(\"/remote/server/path/to/script\", out_dict[\"lftp\"][\"remote_path_to_scan_script\"])\n        self.assertEqual(6, out_dict[\"lftp\"][\"num_max_parallel_downloads\"])\n        self.assertEqual(7, out_dict[\"lftp\"][\"num_max_parallel_files_per_download\"])\n        self.assertEqual(2, out_dict[\"lftp\"][\"num_max_connections_per_root_file\"])\n        self.assertEqual(3, out_dict[\"lftp\"][\"num_max_connections_per_dir_file\"])\n        self.assertEqual(4, out_dict[\"lftp\"][\"num_max_total_connections\"])\n\n    def test_section_controller(self):\n        config = Config()\n        config.controller.interval_ms_remote_scan = 1234\n        config.controller.interval_ms_local_scan = 5678\n        config.controller.interval_ms_downloading_scan = 9012\n        out = SerializeConfig.config(config)\n        out_dict = json.loads(out)\n        self.assertIn(\"controller\", out_dict)\n        self.assertEqual(1234, out_dict[\"controller\"][\"interval_ms_remote_scan\"])\n        self.assertEqual(5678, out_dict[\"controller\"][\"interval_ms_local_scan\"])\n        self.assertEqual(9012, out_dict[\"controller\"][\"interval_ms_downloading_scan\"])\n\n    def test_section_web(self):\n        config = Config()\n        config.web.port = 8080\n        out = SerializeConfig.config(config)\n        out_dict = json.loads(out)\n        self.assertIn(\"web\", out_dict)\n        self.assertEqual(8080, out_dict[\"web\"][\"port\"])\n\n    def test_section_autoqueue(self):\n        config = Config()\n        config.autoqueue.enabled = True\n        config.autoqueue.patterns_only = False\n        out = SerializeConfig.config(config)\n        out_dict = json.loads(out)\n        self.assertIn(\"autoqueue\", out_dict)\n        self.assertEqual(True, out_dict[\"autoqueue\"][\"enabled\"])\n        self.assertEqual(False, out_dict[\"autoqueue\"][\"patterns_only\"])\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize_log_record.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\nimport logging\n\nfrom .test_serialize import parse_stream\nfrom web.serialize import SerializeLogRecord\n\n\nclass TestSerializeLogRecord(unittest.TestCase):\n    def test_event_names(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        self.assertEqual(\"log-record\", out[\"event\"])\n\n    def test_record_time(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(str(record.created), data[\"time\"])\n\n    def test_record_level_name(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n\n        record = logger.makeRecord(\n            name=None,\n            level=logging.DEBUG,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"DEBUG\", data[\"level_name\"])\n\n        record = logger.makeRecord(\n            name=None,\n            level=logging.INFO,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"INFO\", data[\"level_name\"])\n\n        record = logger.makeRecord(\n            name=None,\n            level=logging.WARNING,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"WARNING\", data[\"level_name\"])\n\n        record = logger.makeRecord(\n            name=None,\n            level=logging.ERROR,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"ERROR\", data[\"level_name\"])\n\n        record = logger.makeRecord(\n            name=None,\n            level=logging.CRITICAL,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"CRITICAL\", data[\"level_name\"])\n\n    def test_record_logger_name(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n        record = logger.makeRecord(\n            name=\"myloggername\",\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"myloggername\", data[\"logger_name\"])\n\n    def test_record_message(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=\"my logger msg\",\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"my logger msg\", data[\"message\"])\n\n    def test_record_exception_text(self):\n        serialize = SerializeLogRecord()\n        logger = logging.getLogger()\n\n        # When there's exc_text already there\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        record.exc_text = \"My traceback\"\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"My traceback\", data[\"exc_tb\"])\n\n        # When there's exc_info but no exc_text\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=(None, ValueError(), None),\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"ValueError\", data[\"exc_tb\"])\n\n        # When there's neither\n        record = logger.makeRecord(\n            name=None,\n            level=None,\n            fn=None,\n            lno=None,\n            msg=None,\n            args=None,\n            exc_info=None,\n            func=None,\n            sinfo=None\n        )\n        out = parse_stream(serialize.record(record))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(None, data[\"exc_tb\"])\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize_model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\nfrom datetime import datetime\nfrom pytz import timezone\n\nfrom .test_serialize import parse_stream\nfrom web.serialize import SerializeModel\nfrom model import ModelFile\n\n\nclass TestSerializeModel(unittest.TestCase):\n    def test_event_names(self):\n        serialize = SerializeModel()\n        out = parse_stream(serialize.model([]))\n        self.assertEqual(\"model-init\", out[\"event\"])\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.ADDED, None, None\n            ))\n        )\n        self.assertEqual(\"model-added\", out[\"event\"])\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.UPDATED, None, None\n            ))\n        )\n        self.assertEqual(\"model-updated\", out[\"event\"])\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.REMOVED, None, None\n            ))\n        )\n        self.assertEqual(\"model-removed\", out[\"event\"])\n\n    def test_model_is_a_list(self):\n        serialize = SerializeModel()\n        files = []\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(list, type(data))\n\n        files = [ModelFile(\"a\", True), ModelFile(\"b\", False)]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(list, type(data))\n        self.assertEqual(2, len(data))\n\n    def test_update_event_is_a_dict(self):\n        serialize = SerializeModel()\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.UPDATED, None, None\n            ))\n        )\n        data = json.loads(out[\"data\"])\n        self.assertEqual(dict, type(data))\n        self.assertEqual(None, data[\"old_file\"])\n        self.assertEqual(None, data[\"new_file\"])\n\n    def test_update_event_files(self):\n        serialize = SerializeModel()\n        a1 = ModelFile(\"a\", False)\n        a1.local_size = 100\n        a2 = ModelFile(\"a\", False)\n        a2.local_size = 200\n\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.UPDATED, a1, a2\n            ))\n        )\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"a\", data[\"old_file\"][\"name\"])\n        self.assertEqual(100, data[\"old_file\"][\"local_size\"])\n        self.assertEqual(\"a\", data[\"new_file\"][\"name\"])\n        self.assertEqual(200, data[\"new_file\"][\"local_size\"])\n\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.ADDED, None, a1\n            ))\n        )\n        data = json.loads(out[\"data\"])\n        self.assertEqual(None, data[\"old_file\"])\n        self.assertEqual(\"a\", data[\"new_file\"][\"name\"])\n        self.assertEqual(100, data[\"new_file\"][\"local_size\"])\n\n        out = parse_stream(\n            serialize.update_event(SerializeModel.UpdateEvent(\n                SerializeModel.UpdateEvent.Change.ADDED, a2, None\n            ))\n        )\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"a\", data[\"old_file\"][\"name\"])\n        self.assertEqual(200, data[\"old_file\"][\"local_size\"])\n        self.assertEqual(None, data[\"new_file\"])\n\n    def test_file_name(self):\n        serialize = SerializeModel()\n        files = [ModelFile(\"a\", True), ModelFile(\"b\", False)]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(\"a\", data[0][\"name\"])\n        self.assertEqual(\"b\", data[1][\"name\"])\n\n    def test_file_is_dir(self):\n        serialize = SerializeModel()\n        files = [ModelFile(\"a\", True), ModelFile(\"b\", False)]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(True, data[0][\"is_dir\"])\n        self.assertEqual(False, data[1][\"is_dir\"])\n\n    def test_file_state(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.state = ModelFile.State.DEFAULT\n        b = ModelFile(\"b\", False)\n        b.state = ModelFile.State.DOWNLOADING\n        c = ModelFile(\"c\", True)\n        c.state = ModelFile.State.QUEUED\n        d = ModelFile(\"d\", True)\n        d.state = ModelFile.State.DOWNLOADED\n        e = ModelFile(\"e\", False)\n        e.state = ModelFile.State.DELETED\n        f = ModelFile(\"f\", False)\n        f.state = ModelFile.State.EXTRACTING\n        g = ModelFile(\"g\", False)\n        g.state = ModelFile.State.EXTRACTED\n        files = [a, b, c, d, e, f, g]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(7, len(data))\n        self.assertEqual(\"default\", data[0][\"state\"])\n        self.assertEqual(\"downloading\", data[1][\"state\"])\n        self.assertEqual(\"queued\", data[2][\"state\"])\n        self.assertEqual(\"downloaded\", data[3][\"state\"])\n        self.assertEqual(\"deleted\", data[4][\"state\"])\n        self.assertEqual(\"extracting\", data[5][\"state\"])\n        self.assertEqual(\"extracted\", data[6][\"state\"])\n\n    def test_remote_size(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.remote_size = None\n        b = ModelFile(\"b\", False)\n        b.remote_size = 0\n        c = ModelFile(\"c\", True)\n        c.remote_size = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(None, data[0][\"remote_size\"])\n        self.assertEqual(0, data[1][\"remote_size\"])\n        self.assertEqual(100, data[2][\"remote_size\"])\n\n    def test_local_size(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.local_size = None\n        b = ModelFile(\"b\", False)\n        b.local_size = 0\n        c = ModelFile(\"c\", True)\n        c.local_size = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(None, data[0][\"local_size\"])\n        self.assertEqual(0, data[1][\"local_size\"])\n        self.assertEqual(100, data[2][\"local_size\"])\n\n    def test_downloading_speed(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.downloading_speed = None\n        b = ModelFile(\"b\", False)\n        b.downloading_speed = 0\n        c = ModelFile(\"c\", True)\n        c.downloading_speed = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(None, data[0][\"downloading_speed\"])\n        self.assertEqual(0, data[1][\"downloading_speed\"])\n        self.assertEqual(100, data[2][\"downloading_speed\"])\n\n    def test_eta(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.eta = None\n        b = ModelFile(\"b\", False)\n        b.eta = 0\n        c = ModelFile(\"c\", True)\n        c.eta = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(None, data[0][\"eta\"])\n        self.assertEqual(0, data[1][\"eta\"])\n        self.assertEqual(100, data[2][\"eta\"])\n\n    def test_file_is_extractable(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        a.is_extractable = False\n        b = ModelFile(\"b\", False)\n        b.is_extractable = True\n        files = [a, b]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(False, data[0][\"is_extractable\"])\n        self.assertEqual(True, data[1][\"is_extractable\"])\n\n    def test_local_created_timestamp(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", False)\n        b.local_created_timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        files = [a, b]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(None, data[0][\"local_created_timestamp\"])\n        self.assertEqual(str(1541799618.0), data[1][\"local_created_timestamp\"])\n\n    def test_local_modified_timestamp(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", False)\n        b.local_modified_timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        files = [a, b]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(None, data[0][\"local_modified_timestamp\"])\n        self.assertEqual(str(1541799618.0), data[1][\"local_modified_timestamp\"])\n\n    def test_remote_created_timestamp(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", False)\n        b.remote_created_timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        files = [a, b]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(None, data[0][\"remote_created_timestamp\"])\n        self.assertEqual(str(1541799618.0), data[1][\"remote_created_timestamp\"])\n\n    def test_remote_modified_timestamp(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", False)\n        b.remote_modified_timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        files = [a, b]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(2, len(data))\n        self.assertEqual(None, data[0][\"remote_modified_timestamp\"])\n        self.assertEqual(str(1541799618.0), data[1][\"remote_modified_timestamp\"])\n\n    def test_children(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", True)\n        b.add_child(ModelFile(\"ba\", False))\n        b.add_child(ModelFile(\"bb\", True))\n        c = ModelFile(\"c\", True)\n        ca = ModelFile(\"ca\", True)\n        ca.add_child(ModelFile(\"caa\", False))\n        ca.add_child(ModelFile(\"cab\", False))\n        c.add_child(ca)\n        cb = ModelFile(\"cb\", False)\n        c.add_child(cb)\n        c.eta = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(list, type(data[0][\"children\"]))\n        self.assertEqual(0, len(data[0][\"children\"]))\n        self.assertEqual(list, type(data[1][\"children\"]))\n        self.assertEqual(2, len(data[1][\"children\"]))\n        self.assertEqual(\"ba\", data[1][\"children\"][0][\"name\"])\n        self.assertEqual(0, len(data[1][\"children\"][0][\"children\"]))\n        self.assertEqual(\"bb\", data[1][\"children\"][1][\"name\"])\n        self.assertEqual(0, len(data[1][\"children\"][1][\"children\"]))\n        self.assertEqual(list, type(data[2][\"children\"]))\n        self.assertEqual(2, len(data[2][\"children\"]))\n        self.assertEqual(\"ca\", data[2][\"children\"][0][\"name\"])\n        self.assertEqual(2, len(data[2][\"children\"][0][\"children\"]))\n        self.assertEqual(\"caa\", data[2][\"children\"][0][\"children\"][0][\"name\"])\n        self.assertEqual(0, len(data[2][\"children\"][0][\"children\"][0][\"children\"]))\n        self.assertEqual(\"cab\", data[2][\"children\"][0][\"children\"][1][\"name\"])\n        self.assertEqual(0, len(data[2][\"children\"][0][\"children\"][1][\"children\"]))\n        self.assertEqual(\"cb\", data[2][\"children\"][1][\"name\"])\n        self.assertEqual(0, len(data[2][\"children\"][1][\"children\"]))\n\n    def test_full_path(self):\n        serialize = SerializeModel()\n        a = ModelFile(\"a\", True)\n        b = ModelFile(\"b\", True)\n        b.add_child(ModelFile(\"ba\", False))\n        b.add_child(ModelFile(\"bb\", True))\n        c = ModelFile(\"c\", True)\n        ca = ModelFile(\"ca\", True)\n        ca.add_child(ModelFile(\"caa\", False))\n        ca.add_child(ModelFile(\"cab\", False))\n        c.add_child(ca)\n        cb = ModelFile(\"cb\", False)\n        c.add_child(cb)\n        c.eta = 100\n        files = [a, b, c]\n        out = parse_stream(serialize.model(files))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(3, len(data))\n        self.assertEqual(\"a\", data[0][\"full_path\"])\n        self.assertEqual(\"b\", data[1][\"full_path\"])\n        self.assertEqual(\"b/ba\", data[1][\"children\"][0][\"full_path\"])\n        self.assertEqual(\"b/bb\", data[1][\"children\"][1][\"full_path\"])\n        self.assertEqual(\"c\", data[2][\"full_path\"])\n        self.assertEqual(\"c/ca\", data[2][\"children\"][0][\"full_path\"])\n        self.assertEqual(\"c/ca/caa\", data[2][\"children\"][0][\"children\"][0][\"full_path\"])\n        self.assertEqual(\"c/ca/cab\", data[2][\"children\"][0][\"children\"][1][\"full_path\"])\n        self.assertEqual(\"c/cb\", data[2][\"children\"][1][\"full_path\"])\n"
  },
  {
    "path": "src/python/tests/unittests/test_web/test_serialize/test_serialize_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport unittest\nimport json\nfrom datetime import datetime\nfrom pytz import timezone\n\nfrom .test_serialize import parse_stream\nfrom common import Status\nfrom web.serialize import SerializeStatus\n\n\nclass TestSerializeStatus(unittest.TestCase):\n    def test_event_names(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        self.assertEqual(\"status\", out[\"event\"])\n\n        status.server.up = False\n        status.server.error_msg = \"Bad stuff happened\"\n        out = parse_stream(serialize.status(status))\n        self.assertEqual(\"status\", out[\"event\"])\n\n    def test_server_status_up(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(True, data[\"server\"][\"up\"])\n\n        status.server.up = False\n        status.server.error_msg = \"Bad stuff happened\"\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(False, data[\"server\"][\"up\"])\n\n    def test_server_status_error_msg(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(None, data[\"server\"][\"error_msg\"])\n\n        status.server.up = False\n        status.server.error_msg = \"Bad stuff happened\"\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"Bad stuff happened\", data[\"server\"][\"error_msg\"])\n\n    def test_controller_status_latest_local_scan_time(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertIsNone(data[\"controller\"][\"latest_local_scan_time\"])\n\n        timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        status.controller.latest_local_scan_time = timestamp\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(str(1541799618.0), data[\"controller\"][\"latest_local_scan_time\"])\n\n    def test_controller_status_latest_remote_scan_time(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertIsNone(data[\"controller\"][\"latest_remote_scan_time\"])\n\n        timestamp = datetime(2018, 11, 9, 21, 40, 18, tzinfo=timezone('UTC'))\n        status.controller.latest_remote_scan_time = timestamp\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(str(1541799618.0), data[\"controller\"][\"latest_remote_scan_time\"])\n\n    def test_controller_status_latest_remote_scan_failed(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertIsNone(data[\"controller\"][\"latest_remote_scan_failed\"])\n\n        status.controller.latest_remote_scan_failed = True\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(True, data[\"controller\"][\"latest_remote_scan_failed\"])\n\n    def test_controller_status_latest_remote_scan_error(self):\n        serialize = SerializeStatus()\n        status = Status()\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertIsNone(data[\"controller\"][\"latest_remote_scan_error\"])\n\n        status.controller.latest_remote_scan_error = \"remote server went boom\"\n        out = parse_stream(serialize.status(status))\n        data = json.loads(out[\"data\"])\n        self.assertEqual(\"remote server went boom\", data[\"controller\"][\"latest_remote_scan_error\"])\n"
  },
  {
    "path": "src/python/tests/utils.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport os\n\n\nclass TestUtils:\n    @staticmethod\n    def chmod_from_to(from_path: str, to_path: str, mode: int):\n        \"\"\"\n        Chmod from_path and all its parents up to and including to_path\n        :param from_path:\n        :param to_path:\n        :param mode:\n        :return:\n        \"\"\"\n        path = from_path\n        try:\n            os.chmod(path, mode)\n        except PermissionError:\n            pass\n        while path != \"/\" and path != to_path:\n            path = os.path.dirname(path)\n            try:\n                os.chmod(path, mode)\n            except PermissionError:\n                pass\n"
  },
  {
    "path": "src/python/web/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .web_app import WebApp\nfrom .web_app_job import WebAppJob\nfrom .web_app_builder import WebAppBuilder\n"
  },
  {
    "path": "src/python/web/handler/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/python/web/handler/auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom bottle import HTTPResponse\nfrom urllib.parse import unquote\n\nfrom common import overrides\nfrom controller import AutoQueuePersist, AutoQueuePattern\nfrom ..web_app import IHandler, WebApp\nfrom ..serialize import SerializeAutoQueue\n\n\nclass AutoQueueHandler(IHandler):\n    def __init__(self, auto_queue_persist: AutoQueuePersist):\n        self.__auto_queue_persist = auto_queue_persist\n\n    @overrides(IHandler)\n    def add_routes(self, web_app: WebApp):\n        web_app.add_handler(\"/server/autoqueue/get\", self.__handle_get_autoqueue)\n        web_app.add_handler(\"/server/autoqueue/add/<pattern>\", self.__handle_add_autoqueue)\n        web_app.add_handler(\"/server/autoqueue/remove/<pattern>\", self.__handle_remove_autoqueue)\n\n    def __handle_get_autoqueue(self):\n        patterns = list(self.__auto_queue_persist.patterns)\n        patterns.sort(key=lambda p: p.pattern)\n        out_json = SerializeAutoQueue.patterns(patterns)\n        return HTTPResponse(body=out_json)\n\n    def __handle_add_autoqueue(self, pattern: str):\n        # value is double encoded\n        pattern = unquote(pattern)\n\n        aqp = AutoQueuePattern(pattern=pattern)\n\n        if aqp in self.__auto_queue_persist.patterns:\n            return HTTPResponse(body=\"Auto-queue pattern '{}' already exists.\".format(pattern), status=400)\n        else:\n            try:\n                self.__auto_queue_persist.add_pattern(aqp)\n                return HTTPResponse(body=\"Added auto-queue pattern '{}'.\".format(pattern))\n            except ValueError as e:\n                return HTTPResponse(body=str(e), status=400)\n\n    def __handle_remove_autoqueue(self, pattern: str):\n        # value is double encoded\n        pattern = unquote(pattern)\n\n        aqp = AutoQueuePattern(pattern=pattern)\n\n        if aqp not in self.__auto_queue_persist.patterns:\n            return HTTPResponse(body=\"Auto-queue pattern '{}' doesn't exist.\".format(pattern), status=400)\n        else:\n            self.__auto_queue_persist.remove_pattern(aqp)\n            return HTTPResponse(body=\"Removed auto-queue pattern '{}'.\".format(pattern))\n"
  },
  {
    "path": "src/python/web/handler/config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom bottle import HTTPResponse\nfrom urllib.parse import unquote\n\nfrom common import overrides, Config, ConfigError\nfrom ..web_app import IHandler, WebApp\nfrom ..serialize import SerializeConfig\n\n\nclass ConfigHandler(IHandler):\n    def __init__(self, config: Config):\n        self.__config = config\n\n    @overrides(IHandler)\n    def add_routes(self, web_app: WebApp):\n        web_app.add_handler(\"/server/config/get\", self.__handle_get_config)\n        # The regex allows slashes in values\n        web_app.add_handler(\"/server/config/set/<section>/<key>/<value:re:.+>\", self.__handle_set_config)\n\n    def __handle_get_config(self):\n        out_json = SerializeConfig.config(self.__config)\n        return HTTPResponse(body=out_json)\n\n    def __handle_set_config(self, section: str, key: str, value: str):\n        # value is double encoded\n        value = unquote(value)\n\n        if not self.__config.has_section(section):\n            return HTTPResponse(body=\"There is no section '{}' in config\".format(section), status=400)\n        inner_config = getattr(self.__config, section)\n        if not inner_config.has_property(key):\n            return HTTPResponse(body=\"Section '{}' in config has no option '{}'\".format(section, key), status=400)\n        try:\n            inner_config.set_property(key, value)\n            return HTTPResponse(body=\"{}.{} set to {}\".format(section, key, value))\n        except ConfigError as e:\n            return HTTPResponse(body=str(e), status=400)\n"
  },
  {
    "path": "src/python/web/handler/controller.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom threading import Event\nfrom urllib.parse import unquote\n\nfrom bottle import HTTPResponse\n\nfrom common import overrides\nfrom controller import Controller\nfrom ..web_app import IHandler, WebApp\n\n\nclass WebResponseActionCallback(Controller.Command.ICallback):\n    \"\"\"\n    Controller action callback used by model streams to wait for action\n    status.\n    Clients should call wait() method to wait for the status,\n    then query the status from 'success' and 'error'\n    \"\"\"\n\n    def __init__(self):\n        self.__event = Event()\n        self.success = None\n        self.error = None\n\n    @overrides(Controller.Command.ICallback)\n    def on_failure(self, error: str):\n        self.success = False\n        self.error = error\n        self.__event.set()\n\n    @overrides(Controller.Command.ICallback)\n    def on_success(self):\n        self.success = True\n        self.__event.set()\n\n    def wait(self):\n        self.__event.wait()\n\n\nclass ControllerHandler(IHandler):\n    def __init__(self, controller: Controller):\n        self.__controller = controller\n\n    @overrides(IHandler)\n    def add_routes(self, web_app: WebApp):\n        web_app.add_handler(\"/server/command/queue/<file_name>\", self.__handle_action_queue)\n        web_app.add_handler(\"/server/command/stop/<file_name>\", self.__handle_action_stop)\n        web_app.add_handler(\"/server/command/extract/<file_name>\", self.__handle_action_extract)\n        web_app.add_handler(\"/server/command/delete_local/<file_name>\", self.__handle_action_delete_local)\n        web_app.add_handler(\"/server/command/delete_remote/<file_name>\", self.__handle_action_delete_remote)\n\n    def __handle_action_queue(self, file_name: str):\n        \"\"\"\n        Request a QUEUE action\n        :param file_name:\n        :return:\n        \"\"\"\n        # value is double encoded\n        file_name = unquote(file_name)\n\n        command = Controller.Command(Controller.Command.Action.QUEUE, file_name)\n        callback = WebResponseActionCallback()\n        command.add_callback(callback)\n        self.__controller.queue_command(command)\n        callback.wait()\n        if callback.success:\n            return HTTPResponse(body=\"Queued file '{}'\".format(file_name))\n        else:\n            return HTTPResponse(body=callback.error, status=400)\n\n    def __handle_action_stop(self, file_name: str):\n        \"\"\"\n        Request a STOP action\n        :param file_name:\n        :return:\n        \"\"\"\n        # value is double encoded\n        file_name = unquote(file_name)\n\n        command = Controller.Command(Controller.Command.Action.STOP, file_name)\n        callback = WebResponseActionCallback()\n        command.add_callback(callback)\n        self.__controller.queue_command(command)\n        callback.wait()\n        if callback.success:\n            return HTTPResponse(body=\"Stopped file '{}'\".format(file_name))\n        else:\n            return HTTPResponse(body=callback.error, status=400)\n\n    def __handle_action_extract(self, file_name: str):\n        \"\"\"\n        Request a EXTRACT action\n        :param file_name:\n        :return:\n        \"\"\"\n        # value is double encoded\n        file_name = unquote(file_name)\n\n        command = Controller.Command(Controller.Command.Action.EXTRACT, file_name)\n        callback = WebResponseActionCallback()\n        command.add_callback(callback)\n        self.__controller.queue_command(command)\n        callback.wait()\n        if callback.success:\n            return HTTPResponse(body=\"Requested extraction for file '{}'\".format(file_name))\n        else:\n            return HTTPResponse(body=callback.error, status=400)\n\n    def __handle_action_delete_local(self, file_name: str):\n        \"\"\"\n        Request a DELETE LOCAL action\n        :param file_name:\n        :return:\n        \"\"\"\n        # value is double encoded\n        file_name = unquote(file_name)\n\n        command = Controller.Command(Controller.Command.Action.DELETE_LOCAL, file_name)\n        callback = WebResponseActionCallback()\n        command.add_callback(callback)\n        self.__controller.queue_command(command)\n        callback.wait()\n        if callback.success:\n            return HTTPResponse(body=\"Requested local delete for file '{}'\".format(file_name))\n        else:\n            return HTTPResponse(body=callback.error, status=400)\n\n    def __handle_action_delete_remote(self, file_name: str):\n        \"\"\"\n        Request a DELETE REMOTE action\n        :param file_name:\n        :return:\n        \"\"\"\n        # value is double encoded\n        file_name = unquote(file_name)\n\n        command = Controller.Command(Controller.Command.Action.DELETE_REMOTE, file_name)\n        callback = WebResponseActionCallback()\n        command.add_callback(callback)\n        self.__controller.queue_command(command)\n        callback.wait()\n        if callback.success:\n            return HTTPResponse(body=\"Requested remote delete for file '{}'\".format(file_name))\n        else:\n            return HTTPResponse(body=callback.error, status=400)\n"
  },
  {
    "path": "src/python/web/handler/server.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom bottle import HTTPResponse\n\nfrom common import Context, overrides\nfrom ..web_app import IHandler, WebApp\n\n\nclass ServerHandler(IHandler):\n    def __init__(self, context: Context):\n        self.logger = context.logger.getChild(\"ServerActionHandler\")\n        self.__request_restart = False\n\n    @overrides(IHandler)\n    def add_routes(self, web_app: WebApp):\n        web_app.add_handler(\"/server/command/restart\", self.__handle_action_restart)\n\n    def is_restart_requested(self):\n        \"\"\"\n        Returns true is a restart is requested\n        :return:\n        \"\"\"\n        return self.__request_restart\n\n    def __handle_action_restart(self):\n        \"\"\"\n        Request a server restart\n        :return:\n        \"\"\"\n        self.logger.info(\"Received a restart action\")\n        self.__request_restart = True\n        return HTTPResponse(body=\"Requested restart\")\n"
  },
  {
    "path": "src/python/web/handler/status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom bottle import HTTPResponse\n\nfrom common import Status, overrides\nfrom ..web_app import IHandler, WebApp\nfrom ..serialize import SerializeStatusJson\n\n\nclass StatusHandler(IHandler):\n    def __init__(self, status: Status):\n        self.__status = status\n\n    @overrides(IHandler)\n    def add_routes(self, web_app: WebApp):\n        web_app.add_handler(\"/server/status\", self.__handle_get_status)\n\n    def __handle_get_status(self):\n        out_json = SerializeStatusJson.status(self.__status)\n        return HTTPResponse(body=out_json)\n"
  },
  {
    "path": "src/python/web/handler/stream_log.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom typing import Optional, List\nimport time\nimport copy\nfrom threading import Lock\n\nfrom ..web_app import IStreamHandler\nfrom ..utils import StreamQueue\nfrom ..serialize import SerializeLogRecord\nfrom common import overrides\n\n\nclass CachedQueueLogHandler(logging.Handler):\n    \"\"\"\n    A logging.Handler that caches the past X seconds of\n    logs\n    \"\"\"\n    def __init__(self, history_size_in_ms: int):\n        \"\"\"\n        Constructs a CachedQueueLogHandler\n        :param history_size_in_ms: history size, set to 0 to disable caching\n        \"\"\"\n        super().__init__()\n        self.__history_size_in_ms = history_size_in_ms\n        self.__cached_records = []\n        self.__cache_lock = Lock()\n\n    def get_cached_records(self) -> List[logging.LogRecord]:\n        self.__cache_lock.acquire()\n        self.__prune_history()\n        cache = copy.copy(self.__cached_records)\n        self.__cache_lock.release()\n        return cache\n\n    @overrides(logging.Handler)\n    def emit(self, record: logging.LogRecord):\n        if self.__history_size_in_ms > 0:\n            self.__cache_lock.acquire()\n            self.__cached_records.append(record)\n            self.__prune_history()\n            self.__cache_lock.release()\n\n    def __prune_history(self):\n        current_time_in_ms = int(time.time()*1000)\n        history_start_time_in_ms = current_time_in_ms - self.__history_size_in_ms\n        # Find the largest index older than history start time\n        prune_index = -1\n        for i, record in enumerate(self.__cached_records):\n            if 1000.0*record.created < history_start_time_in_ms:\n                prune_index = i\n            else:\n                # assume records are order oldest to newest\n                break\n        if prune_index >= 0:\n            self.__cached_records = self.__cached_records[prune_index+1:]\n\n\nclass QueueLogHandler(logging.Handler, StreamQueue[logging.LogRecord]):\n    \"\"\"\n    A log handler that stored records in a thread-safe queue\n    \"\"\"\n    def __init__(self):\n        logging.Handler.__init__(self)\n        StreamQueue.__init__(self)\n\n    @overrides(logging.Handler)\n    def emit(self, record):\n        self.put(record)\n\n\nclass LogStreamHandler(IStreamHandler):\n    \"\"\"\n    Streams logs captured after the stream starts.\n    Also cache a small history of logs and sends them when the stream\n    starts.\n    \"\"\"\n    _CACHE_HISTORY_SIZE_IN_MS = 3000\n\n    # Cache of logs\n    _cache = None\n\n    def __init__(self, logger: logging.Logger):\n        self.logger = logger\n        self.handler = QueueLogHandler()\n        self.serialize = SerializeLogRecord()\n\n    # noinspection PyUnresolvedReferences\n    @classmethod\n    @overrides(IStreamHandler)\n    def register(cls, web_app: \"WebApp\", **kwargs):\n        # Initialize our cache when we register\n        LogStreamHandler._cache = CachedQueueLogHandler(\n            history_size_in_ms=LogStreamHandler._CACHE_HISTORY_SIZE_IN_MS\n        )\n        kwargs[\"logger\"].addHandler(LogStreamHandler._cache)\n\n        super().register(web_app=web_app, **kwargs)\n\n    @overrides(IStreamHandler)\n    def setup(self):\n        # Send out all the cached records first\n        for record in LogStreamHandler._cache.get_cached_records():\n            self.handler.emit(record)\n        # Then subscribe the live stream\n        self.logger.addHandler(self.handler)\n\n    @overrides(IStreamHandler)\n    def get_value(self) -> Optional[str]:\n        record = self.handler.get_next_event()\n        if record is not None:\n            return self.serialize.record(record)\n        else:\n            return None\n\n    @overrides(IStreamHandler)\n    def cleanup(self):\n        self.logger.removeHandler(self.handler)\n"
  },
  {
    "path": "src/python/web/handler/stream_model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom typing import Optional\n\nfrom ..web_app import IStreamHandler\nfrom ..utils import StreamQueue\nfrom ..serialize import SerializeModel\nfrom model import IModelListener, ModelFile\nfrom common import overrides\nfrom controller import Controller\n\n\nclass WebResponseModelListener(IModelListener, StreamQueue[SerializeModel.UpdateEvent]):\n    \"\"\"\n    Model listener used by streams to listen to model updates\n    One listener should be created for each new request\n    \"\"\"\n    def __init__(self):\n        super().__init__()\n\n    @overrides(IModelListener)\n    def file_added(self, file: ModelFile):\n        self.put(SerializeModel.UpdateEvent(change=SerializeModel.UpdateEvent.Change.ADDED,\n                                            old_file=None,\n                                            new_file=file))\n\n    @overrides(IModelListener)\n    def file_removed(self, file: ModelFile):\n        self.put(SerializeModel.UpdateEvent(change=SerializeModel.UpdateEvent.Change.REMOVED,\n                                            old_file=file,\n                                            new_file=None))\n\n    @overrides(IModelListener)\n    def file_updated(self, old_file: ModelFile, new_file: ModelFile):\n        self.put(SerializeModel.UpdateEvent(change=SerializeModel.UpdateEvent.Change.UPDATED,\n                                            old_file=old_file,\n                                            new_file=new_file))\n\n\nclass ModelStreamHandler(IStreamHandler):\n    def __init__(self, controller: Controller):\n        self.controller = controller\n        self.serialize = SerializeModel()\n        self.model_listener = WebResponseModelListener()\n        self.initial_model_files = None\n        self.first_run = True\n\n    @overrides(IStreamHandler)\n    def setup(self):\n        self.initial_model_files = self.controller.get_model_files_and_add_listener(self.model_listener)\n\n    @overrides(IStreamHandler)\n    def get_value(self) -> Optional[str]:\n        if self.first_run:\n            self.first_run = False\n            return self.serialize.model(self.initial_model_files)\n        else:\n            event = self.model_listener.get_next_event()\n            if event is not None:\n                return self.serialize.update_event(event)\n            else:\n                return None\n\n    @overrides(IStreamHandler)\n    def cleanup(self):\n        if self.model_listener:\n            self.controller.remove_model_listener(self.model_listener)\n"
  },
  {
    "path": "src/python/web/handler/stream_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom typing import Optional\n\nfrom ..web_app import IStreamHandler\nfrom ..serialize import SerializeStatus\nfrom ..utils import StreamQueue\nfrom common import overrides, Status, IStatusListener\n\n\nclass StatusListener(IStatusListener, StreamQueue[Status]):\n    \"\"\"\n    Status listener used by status streams to listen to status updates\n    \"\"\"\n    def __init__(self, status: Status):\n        super().__init__()\n        self.__status = status\n\n    @overrides(IStatusListener)\n    def notify(self):\n        self.put(self.__status.copy())\n\n\nclass StatusStreamHandler(IStreamHandler):\n    def __init__(self, status: Status):\n        self.status = status\n        self.serialize = SerializeStatus()\n        self.status_listener = StatusListener(status)\n        self.first_run = True\n\n    @overrides(IStreamHandler)\n    def setup(self):\n        self.status.add_listener(self.status_listener)\n\n    @overrides(IStreamHandler)\n    def get_value(self) -> Optional[str]:\n        if self.first_run:\n            self.first_run = False\n            status = self.status.copy()\n            return self.serialize.status(status)\n        else:\n            status = self.status_listener.get_next_event()\n            if status is not None:\n                return self.serialize.status(status)\n            else:\n                return None\n\n    @overrides(IStreamHandler)\n    def cleanup(self):\n        if self.status_listener:\n            self.status.remove_listener(self.status_listener)\n"
  },
  {
    "path": "src/python/web/serialize/__init__.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom .serialize import Serialize\nfrom .serialize_model import SerializeModel\nfrom .serialize_status import SerializeStatus, SerializeStatusJson\nfrom .serialize_config import SerializeConfig\nfrom .serialize_auto_queue import SerializeAutoQueue\nfrom .serialize_log_record import SerializeLogRecord\n"
  },
  {
    "path": "src/python/web/serialize/serialize.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom abc import ABC\n\n\nclass Serialize(ABC):\n    \"\"\"\n    Base class for SSE serialization\n    \"\"\"\n    # noinspection PyMethodMayBeStatic\n    def _sse_pack(self, event: str, data: str) -> str:\n        \"\"\"Pack data in SSE format\"\"\"\n        buffer = \"\"\n        buffer += \"event: %s\\n\" % event\n        buffer += \"data: %s\\n\" % data\n        buffer += \"\\n\"\n        return buffer\n"
  },
  {
    "path": "src/python/web/serialize/serialize_auto_queue.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nfrom typing import List\n\nfrom controller import AutoQueuePattern\n\n\nclass SerializeAutoQueue:\n    __KEY_PATTERN = \"pattern\"\n\n    @staticmethod\n    def patterns(patterns: List[AutoQueuePattern]) -> str:\n        patterns_list = []\n        for pattern in patterns:\n            patterns_list.append({\n                SerializeAutoQueue.__KEY_PATTERN: pattern.pattern\n            })\n\n        return json.dumps(patterns_list)\n"
  },
  {
    "path": "src/python/web/serialize/serialize_config.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nimport collections\n\nfrom common import Config\n\n\nclass SerializeConfig:\n    @staticmethod\n    def config(config: Config) -> str:\n        config_dict = config.as_dict()\n\n        # Make the section names lower case\n        keys = list(config_dict.keys())\n        config_dict_lowercase = collections.OrderedDict()\n        for key in keys:\n            config_dict_lowercase[key.lower()] = config_dict[key]\n\n        return json.dumps(config_dict_lowercase)\n"
  },
  {
    "path": "src/python/web/serialize/serialize_log_record.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\nimport logging\n\nfrom .serialize import Serialize\n\n\nclass SerializeLogRecord(Serialize):\n    \"\"\"\n    This class defines the serialization interface between python backend\n    and the EventSource client frontend for the log stream.\n    \"\"\"\n    # Event keys\n    __EVENT_RECORD = \"log-record\"\n\n    # Data keys\n    __KEY_TIME = \"time\"\n    __KEY_LEVEL_NAME = \"level_name\"\n    __KEY_LOGGER_NAME = \"logger_name\"\n    __KEY_MESSAGE = \"message\"\n    __KEY_EXCEPTION_TRACEBACK = \"exc_tb\"\n\n    def __init__(self):\n        super().__init__()\n        # logging formatter to generate exception traceback\n        self.__log_formatter = logging.Formatter()\n\n    def record(self, record: logging.LogRecord) -> str:\n        json_dict = dict()\n        json_dict[SerializeLogRecord.__KEY_TIME] = str(record.created)\n        json_dict[SerializeLogRecord.__KEY_LEVEL_NAME] = record.levelname\n        json_dict[SerializeLogRecord.__KEY_LOGGER_NAME] = record.name\n        json_dict[SerializeLogRecord.__KEY_MESSAGE] = record.msg\n        exc_text = None\n        if record.exc_text:\n            exc_text = record.exc_text\n        elif record.exc_info:\n            exc_text = self.__log_formatter.formatException(record.exc_info)\n        json_dict[SerializeLogRecord.__KEY_EXCEPTION_TRACEBACK] = exc_text\n\n        record_json = json.dumps(json_dict)\n        return self._sse_pack(event=SerializeLogRecord.__EVENT_RECORD, data=record_json)\n"
  },
  {
    "path": "src/python/web/serialize/serialize_model.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom enum import Enum\nimport json\nfrom typing import List, Optional\n\nfrom .serialize import Serialize\nfrom model import ModelFile\n\n\nclass SerializeModel(Serialize):\n    \"\"\"\n    This class defines the serialization interface between the python backend\n    and the EventSource client frontend for the model stream.\n    \"\"\"\n\n    class UpdateEvent:\n        class Change(Enum):\n            ADDED = 0\n            REMOVED = 1\n            UPDATED = 2\n\n        def __init__(self, change: Change, old_file: Optional[ModelFile], new_file: Optional[ModelFile]):\n            self.change = change\n            self.old_file = old_file\n            self.new_file = new_file\n\n    # Event keys\n    __EVENT_INIT = \"model-init\"\n    __EVENT_UPDATE = {\n        UpdateEvent.Change.ADDED: \"model-added\",\n        UpdateEvent.Change.REMOVED: \"model-removed\",\n        UpdateEvent.Change.UPDATED: \"model-updated\"\n    }\n    __KEY_UPDATE_OLD_FILE = \"old_file\"\n    __KEY_UPDATE_NEW_FILE = \"new_file\"\n\n    # Model file keys\n    __KEY_FILE_NAME = \"name\"\n    __KEY_FILE_IS_DIR = \"is_dir\"\n    __KEY_FILE_STATE = \"state\"\n    __VALUES_FILE_STATE = {\n        ModelFile.State.DEFAULT: \"default\",\n        ModelFile.State.QUEUED: \"queued\",\n        ModelFile.State.DOWNLOADING: \"downloading\",\n        ModelFile.State.DOWNLOADED: \"downloaded\",\n        ModelFile.State.DELETED: \"deleted\",\n        ModelFile.State.EXTRACTING: \"extracting\",\n        ModelFile.State.EXTRACTED: \"extracted\"\n    }\n    __KEY_FILE_REMOTE_SIZE = \"remote_size\"\n    __KEY_FILE_LOCAL_SIZE = \"local_size\"\n    __KEY_FILE_DOWNLOADING_SPEED = \"downloading_speed\"\n    __KEY_FILE_ETA = \"eta\"\n    __KEY_FILE_IS_EXTRACTABLE = \"is_extractable\"\n    __KEY_FILE_LOCAL_CREATED_TIMESTAMP = \"local_created_timestamp\"\n    __KEY_FILE_LOCAL_MODIFIED_TIMESTAMP = \"local_modified_timestamp\"\n    __KEY_FILE_REMOTE_CREATED_TIMESTAMP = \"remote_created_timestamp\"\n    __KEY_FILE_REMOTE_MODIFIED_TIMESTAMP = \"remote_modified_timestamp\"\n    __KEY_FILE_FULL_PATH = \"full_path\"\n    __KEY_FILE_CHILDREN = \"children\"\n\n    @staticmethod\n    def __model_file_to_json_dict(model_file: ModelFile) -> dict:\n        json_dict = dict()\n        json_dict[SerializeModel.__KEY_FILE_NAME] = model_file.name\n        json_dict[SerializeModel.__KEY_FILE_IS_DIR] = model_file.is_dir\n        json_dict[SerializeModel.__KEY_FILE_STATE] = SerializeModel.__VALUES_FILE_STATE[model_file.state]\n        json_dict[SerializeModel.__KEY_FILE_REMOTE_SIZE] = model_file.remote_size\n        json_dict[SerializeModel.__KEY_FILE_LOCAL_SIZE] = model_file.local_size\n        json_dict[SerializeModel.__KEY_FILE_DOWNLOADING_SPEED] = model_file.downloading_speed\n        json_dict[SerializeModel.__KEY_FILE_ETA] = model_file.eta\n        json_dict[SerializeModel.__KEY_FILE_IS_EXTRACTABLE] = model_file.is_extractable\n        json_dict[SerializeModel.__KEY_FILE_LOCAL_CREATED_TIMESTAMP] = \\\n            str(model_file.local_created_timestamp.timestamp()) if model_file.local_created_timestamp else None\n        json_dict[SerializeModel.__KEY_FILE_LOCAL_MODIFIED_TIMESTAMP] = \\\n            str(model_file.local_modified_timestamp.timestamp()) if model_file.local_modified_timestamp else None\n        json_dict[SerializeModel.__KEY_FILE_REMOTE_CREATED_TIMESTAMP] = \\\n            str(model_file.remote_created_timestamp.timestamp()) if model_file.remote_created_timestamp else None\n        json_dict[SerializeModel.__KEY_FILE_REMOTE_MODIFIED_TIMESTAMP] = \\\n            str(model_file.remote_modified_timestamp.timestamp()) if model_file.remote_modified_timestamp else None\n        json_dict[SerializeModel.__KEY_FILE_FULL_PATH] = model_file.full_path\n        json_dict[SerializeModel.__KEY_FILE_CHILDREN] = list()\n        for child in model_file.get_children():\n            json_dict[SerializeModel.__KEY_FILE_CHILDREN].append(SerializeModel.__model_file_to_json_dict(child))\n        return json_dict\n\n    def model(self, model_files: List[ModelFile]) -> str:\n        \"\"\"\n        Serialize the model\n        :return:\n        \"\"\"\n        model_json_list = [SerializeModel.__model_file_to_json_dict(f) for f in model_files]\n        model_json = json.dumps(model_json_list)\n        return self._sse_pack(event=SerializeModel.__EVENT_INIT,\n                              data=model_json)\n\n    def update_event(self, event: UpdateEvent):\n        model_file_json_dict = {\n            SerializeModel.__KEY_UPDATE_OLD_FILE:\n                SerializeModel.__model_file_to_json_dict(event.old_file) if event.old_file else None,\n            SerializeModel.__KEY_UPDATE_NEW_FILE:\n                SerializeModel.__model_file_to_json_dict(event.new_file) if event.new_file else None\n        }\n        model_file_json = json.dumps(model_file_json_dict)\n        return self._sse_pack(event=SerializeModel.__EVENT_UPDATE[event.change],\n                              data=model_file_json)\n"
  },
  {
    "path": "src/python/web/serialize/serialize_status.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport json\n\nfrom .serialize import Serialize\nfrom common import Status\n\n\nclass SerializeStatusJson:\n    # Data keys\n    __KEY_SERVER = \"server\"\n    __KEY_SERVER_UP = \"up\"\n    __KEY_SERVER_ERROR_MSG = \"error_msg\"\n    __KEY_CONTROLLER = \"controller\"\n    __KEY_CONTROLLER_LATEST_LOCAL_SCAN_TIME = \"latest_local_scan_time\"\n    __KEY_CONTROLLER_LATEST_REMOTE_SCAN_TIME = \"latest_remote_scan_time\"\n    __KEY_CONTROLLER_LATEST_REMOTE_SCAN_FAILED = \"latest_remote_scan_failed\"\n    __KEY_CONTROLLER_LATEST_REMOTE_SCAN_ERROR = \"latest_remote_scan_error\"\n\n    @staticmethod\n    def status(status: Status) -> str:\n        json_dict = dict()\n\n        json_dict[SerializeStatusJson.__KEY_SERVER] = dict()\n        json_dict[SerializeStatusJson.__KEY_SERVER][SerializeStatusJson.__KEY_SERVER_UP] = \\\n            status.server.up\n        json_dict[SerializeStatusJson.__KEY_SERVER][SerializeStatusJson.__KEY_SERVER_ERROR_MSG] = \\\n            status.server.error_msg\n\n        json_dict[SerializeStatusJson.__KEY_CONTROLLER] = dict()\n        json_dict[SerializeStatusJson.__KEY_CONTROLLER][SerializeStatusJson.__KEY_CONTROLLER_LATEST_LOCAL_SCAN_TIME] = \\\n            str(status.controller.latest_local_scan_time.timestamp()) \\\n                if status.controller.latest_local_scan_time else None\n        json_dict[SerializeStatusJson.__KEY_CONTROLLER][SerializeStatusJson.__KEY_CONTROLLER_LATEST_REMOTE_SCAN_TIME] = \\\n            str(status.controller.latest_remote_scan_time.timestamp()) \\\n                if status.controller.latest_remote_scan_time else None\n        json_dict[SerializeStatusJson.__KEY_CONTROLLER][SerializeStatusJson.__KEY_CONTROLLER_LATEST_REMOTE_SCAN_FAILED] = \\\n            status.controller.latest_remote_scan_failed\n        json_dict[SerializeStatusJson.__KEY_CONTROLLER][SerializeStatusJson.__KEY_CONTROLLER_LATEST_REMOTE_SCAN_ERROR] = \\\n            status.controller.latest_remote_scan_error\n\n        status_json = json.dumps(json_dict)\n        return status_json\n\n\nclass SerializeStatus(Serialize):\n    \"\"\"\n    This class defines the serialization interface between python backend\n    and the EventSource client frontend for the status stream.\n    \"\"\"\n\n    # Event keys\n    __EVENT_STATUS = \"status\"\n\n    def status(self, status: Status) -> str:\n        status_json = SerializeStatusJson.status(status)\n        return self._sse_pack(event=SerializeStatus.__EVENT_STATUS, data=status_json)\n"
  },
  {
    "path": "src/python/web/utils.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom queue import Queue, Empty\nfrom typing import TypeVar, Generic, Optional\n\n\nT = TypeVar('T')\n\n\nclass StreamQueue(Generic[T]):\n    \"\"\"\n    A queue that transfers events from one thread to another.\n    Useful for web streams that wait for listener events from other threads.\n    The producer thread calls put() to insert events. The consumer stream\n    calls get_next_event() to receive event in its own thread.\n    \"\"\"\n    def __init__(self):\n        self.__queue = Queue()\n\n    def put(self, event: T):\n        self.__queue.put(event)\n\n    def get_next_event(self) -> Optional[T]:\n        \"\"\"\n        Returns the next event if there is one, otherwise returns None\n        :return:\n        \"\"\"\n        try:\n            return self.__queue.get(block=False)\n        except Empty:\n            return None\n"
  },
  {
    "path": "src/python/web/web_app.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom typing import Type, Callable, Optional\nfrom abc import ABC, abstractmethod\nimport time\n\nimport bottle\nfrom bottle import static_file\n\nfrom common import Context\nfrom controller import Controller\n\n\nclass IHandler(ABC):\n    \"\"\"\n    Abstract class that defines a web handler\n    \"\"\"\n    @abstractmethod\n    def add_routes(self, web_app: \"WebApp\"):\n        \"\"\"\n        Add all the handled routes to the given web app\n        :param web_app:\n        :return:\n        \"\"\"\n        pass\n\n\nclass IStreamHandler(ABC):\n    \"\"\"\n    Abstract class that defines a streaming data provider\n    \"\"\"\n    @abstractmethod\n    def setup(self):\n        pass\n\n    @abstractmethod\n    def get_value(self) -> Optional[str]:\n        pass\n\n    @abstractmethod\n    def cleanup(self):\n        pass\n\n    @classmethod\n    def register(cls, web_app: \"WebApp\", **kwargs):\n        \"\"\"\n        Register this streaming handler with the web app\n        :param web_app: web_app instance\n        :param kwargs: args for stream handler ctor\n        :return:\n        \"\"\"\n        web_app.add_streaming_handler(cls, **kwargs)\n\n\nclass WebApp(bottle.Bottle):\n    \"\"\"\n    Web app implementation\n    \"\"\"\n    _STREAM_POLL_INTERVAL_IN_MS = 100\n\n    def __init__(self, context: Context, controller: Controller):\n        super().__init__()\n        self.logger = context.logger.getChild(\"WebApp\")\n        self.__controller = controller\n        self.__html_path = context.args.html_path\n        self.__status = context.status\n        self.logger.info(\"Html path set to: {}\".format(self.__html_path))\n        self.__stop = False\n        self.__streaming_handlers = []  # list of (handler, kwargs) pairs\n\n    def add_default_routes(self):\n        \"\"\"\n        Add the default routes. This must be called after all the handlers have\n        been added.\n        :return:\n        \"\"\"\n        # Streaming route\n        self.get(\"/server/stream\")(self.__web_stream)\n\n        # Front-end routes\n        self.route(\"/\")(self.__index)\n        self.route(\"/dashboard\")(self.__index)\n        self.route(\"/settings\")(self.__index)\n        self.route(\"/autoqueue\")(self.__index)\n        self.route(\"/logs\")(self.__index)\n        self.route(\"/about\")(self.__index)\n        # For static files\n        self.route(\"/<file_path:path>\")(self.__static)\n\n    def add_handler(self, path: str, handler: Callable):\n        self.get(path)(handler)\n\n    def add_streaming_handler(self, handler: Type[IStreamHandler], **kwargs):\n        self.__streaming_handlers.append((handler, kwargs))\n\n    def process(self):\n        \"\"\"\n        Advance the web app state\n        :return:\n        \"\"\"\n        pass\n\n    def stop(self):\n        \"\"\"\n        Exit gracefully, kill any connections and clean up any state\n        :return: \n        \"\"\"\n        self.__stop = True\n\n    def __index(self):\n        \"\"\"\n        Serves the index.html static file\n        :return:\n        \"\"\"\n        return self.__static(\"index.html\")\n\n    # noinspection PyMethodMayBeStatic\n    def __static(self, file_path: str):\n        \"\"\"\n        Serves all the static files\n        :param file_path:\n        :return:\n        \"\"\"\n        return static_file(file_path, root=self.__html_path)\n\n    def __web_stream(self):\n        # Initialize all the handlers\n        handlers = [cls(**kwargs) for (cls, kwargs) in self.__streaming_handlers]\n\n        try:\n            # Setup the response header\n            bottle.response.content_type = \"text/event-stream\"\n            bottle.response.cache_control = \"no-cache\"\n\n            # Call setup on all handlers\n            for handler in handlers:\n                handler.setup()\n\n            # Get streaming values until the connection closes\n            while not self.__stop:\n                for handler in handlers:\n                    # Process all values from this handler\n                    while True:\n                        value = handler.get_value()\n                        if value:\n                            yield value\n                        else:\n                            break\n\n                time.sleep(WebApp._STREAM_POLL_INTERVAL_IN_MS / 1000)\n\n        finally:\n            self.logger.debug(\"Stream connection stopped by {}\".format(\n                \"server\" if self.__stop else \"client\"\n            ))\n\n            # Cleanup all handlers\n            for handler in handlers:\n                handler.cleanup()\n"
  },
  {
    "path": "src/python/web/web_app_builder.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nfrom common import Context\nfrom controller import Controller, AutoQueuePersist\nfrom .web_app import WebApp\nfrom .handler.stream_model import ModelStreamHandler\nfrom .handler.stream_status import StatusStreamHandler\nfrom .handler.controller import ControllerHandler\nfrom .handler.server import ServerHandler\nfrom .handler.config import ConfigHandler\nfrom .handler.auto_queue import AutoQueueHandler\nfrom .handler.stream_log import LogStreamHandler\nfrom .handler.status import StatusHandler\n\n\nclass WebAppBuilder:\n    \"\"\"\n    Helper class to build WebApp with all the extensions\n    \"\"\"\n    def __init__(self,\n                 context: Context,\n                 controller: Controller,\n                 auto_queue_persist: AutoQueuePersist):\n        self.__context = context\n        self.__controller = controller\n\n        self.controller_handler = ControllerHandler(controller)\n        self.server_handler = ServerHandler(context)\n        self.config_handler = ConfigHandler(context.config)\n        self.auto_queue_handler = AutoQueueHandler(auto_queue_persist)\n        self.status_handler = StatusHandler(context.status)\n\n    def build(self) -> WebApp:\n        web_app = WebApp(context=self.__context,\n                         controller=self.__controller)\n\n        StatusStreamHandler.register(web_app=web_app,\n                                     status=self.__context.status)\n\n        LogStreamHandler.register(web_app=web_app,\n                                  logger=self.__context.logger)\n\n        ModelStreamHandler.register(web_app=web_app,\n                                    controller=self.__controller)\n\n        self.controller_handler.add_routes(web_app)\n        self.server_handler.add_routes(web_app)\n        self.config_handler.add_routes(web_app)\n        self.auto_queue_handler.add_routes(web_app)\n        self.status_handler.add_routes(web_app)\n\n        web_app.add_default_routes()\n\n        return web_app\n"
  },
  {
    "path": "src/python/web/web_app_job.py",
    "content": "# Copyright 2017, Inderpreet Singh, All rights reserved.\n\nimport logging\nfrom threading import Thread\n\nimport bottle\nfrom paste import httpserver\nfrom paste.translogger import TransLogger\n\nfrom .web_app import WebApp\nfrom common import overrides, Job, Context\n\n\nclass WebAppJob(Job):\n    \"\"\"\n    Web interface service\n    :return:\n    \"\"\"\n    def __init__(self, context: Context, web_app: WebApp):\n        super().__init__(name=self.__class__.__name__, context=context)\n        self.web_access_logger = context.web_access_logger\n        self.__context = context\n        self.__app = web_app\n        self.__server = None\n        self.__server_thread = None\n\n    @overrides(Job)\n    def setup(self):\n        # Note: do not use requestlogger.WSGILogger as it breaks SSE\n        self.__server = MyWSGIRefServer(self.web_access_logger,\n                                        host=\"0.0.0.0\",\n                                        port=self.__context.config.web.port)\n        self.__server_thread = Thread(target=bottle.run,\n                                      kwargs={\n                                          'app': self.__app,\n                                          'server': self.__server,\n                                          'debug': self.__context.args.debug\n                                      })\n        self.__server_thread.start()\n\n    @overrides(Job)\n    def execute(self):\n        self.__app.process()\n\n    @overrides(Job)\n    def cleanup(self):\n        self.__app.stop()\n        self.__server.stop()\n        self.__server_thread.join()\n\n\nclass MyWSGIHandler(httpserver.WSGIHandler):\n    \"\"\"\n    This class is overridden to fix a bug in Paste http server\n    \"\"\"\n    # noinspection SpellCheckingInspection\n    def wsgi_write_chunk(self, chunk):\n        if type(chunk) is str:\n            chunk = str.encode(chunk)\n        super().wsgi_write_chunk(chunk)\n\n\nclass MyWSGIRefServer(bottle.ServerAdapter):\n    \"\"\"\n    Extend bottle's default server to support programatic stopping of server\n    Copied from: https://stackoverflow.com/a/16056443\n    \"\"\"\n    quiet = True  # disable logging to stdout\n\n    def __init__(self, logger: logging.Logger, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.logger = logger\n        self.server = None\n\n    @overrides(bottle.ServerAdapter)\n    def run(self, handler):\n        self.logger.debug(\"Starting web server\")\n        handler = TransLogger(handler, logger=self.logger, setup_console_handler=(not self.quiet))\n        self.server = httpserver.serve(handler, host=self.host, port=str(self.port), start_loop=False,\n                                       handler=MyWSGIHandler,\n                                       **self.options)\n        self.server.serve_forever()\n\n    def stop(self):\n        self.logger.debug(\"Stopping web server\")\n        self.server.server_close()\n"
  }
]