diff --git a/.coveragerc b/.coveragerc
index 915f2a6890..377dc646e2 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1,6 +1,8 @@
[run]
omit =
*/tests/*
+ mitiq/_about.py
+
[report]
# Regexes for lines to exclude from consideration
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index e8ddafecc1..32c8d1d56a 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -42,6 +42,8 @@ updates:
update-types: ["version-update:semver-minor", "version-update:semver-patch"]
- dependency-name: "pandas"
update-types: ["version-update:semver-minor", "version-update:semver-patch"]
+ - dependency-name: "qrack"
+ update-types: ["version-update:semver-minor", "version-update:semver-patch"]
# Allow up to 10 open pull requests for pip dependencies
open-pull-requests-limit: 10
labels:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 587122f822..56af995577 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -22,11 +22,11 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
- make install requirements
+ make install
- name: Check types with mypy
run: make check-types
@@ -34,52 +34,6 @@ jobs:
- name: Check code style/formatting
run: make check-format
- docs:
- runs-on: ubuntu-latest
- steps:
- - name: Check out mitiq
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v5
- with:
- python-version: "3.11"
-
- - name: Install Python dependencies
- run: |
- python -m pip install --upgrade pip
- make install requirements
-
- - name: Run the quilc & qvm Docker images
- run: |
- docker run --rm -idt -p 5000:5000 rigetti/qvm -S
- docker run --rm -idt -p 5555:5555 rigetti/quilc -R
-
- - name: Generate hash from all files excluding example notebooks
- id: gen_hash
- run: |
- HASH=$(find . -type f -not -path './docs/source/examples/*' | sort | xargs cat | sha256sum | awk '{print $1}')
- echo "hash=$HASH" >> $GITHUB_OUTPUT
-
- - name: Fetch Jupyter cache
- uses: actions/cache@v4
- with:
- path: ./docs/build/.jupyter_cache
- key: jupyter-cache-${{ steps.gen_hash.outputs.hash }}
-
- - name: Build and test Sphinx docs
- run: |
- export BQSKIT_DOC_CHECK_OVERRIDE=1
- export PYDEVD_DISABLE_FILE_VALIDATION=1
- make docs
-
- - name: Run linkcheck on 'release' PRs
- if: github.event_name == 'pull_request'
- run: |
- pr_title_lower=$(echo "${{ github.event.pull_request.title }}" | tr '[:upper:]' '[:lower:]')
- if [[ "$pr_title_lower" == *"release"* ]]; then
- make linkcheck
- fi
# This is to make sure Mitiq works without optional 3rd party packages like Qiskit, pyQuil, etc.
# E.g., if we accidentally `import qiskit` in Mitiq where we shouldn't, this test will catch that.
@@ -91,7 +45,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: Install Mitiq
# Since requirements.txt includes cirq, which in turn has pyquil as dependency,
# we explicitly remove pyquil from the installed packages after installing mitiq
@@ -110,7 +64,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
- python-version: ["3.9", "3.10", "3.11"]
+ python-version: ["3.10", "3.11", "3.12"]
runs-on: ${{ matrix.os }}
steps:
- name: Check out mitiq
@@ -125,7 +79,7 @@ jobs:
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
- make install requirements
+ make install
- name: Run the quilc & qvm Docker images
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
@@ -135,7 +89,7 @@ jobs:
run: ${{ matrix.os == 'ubuntu-latest' && 'make test-all' || 'make test' }}
- name: Submit coverage report to Codecov
# Only submit to Codecov once.
- if: ${{ matrix.python-version == '3.11' && matrix.os == 'ubuntu-latest'}}
+ if: ${{ matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest'}}
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml
new file mode 100644
index 0000000000..544f385e56
--- /dev/null
+++ b/.github/workflows/docs-build.yml
@@ -0,0 +1,64 @@
+name: docs-build
+
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+ - synchronize
+ - ready_for_review
+ branches:
+ - main
+ push:
+ branches:
+ - main
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out mitiq
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+
+ - name: Install Python dependencies
+ run: |
+ python -m pip install --upgrade pip
+ make install
+
+ - name: Run the quilc & qvm Docker images
+ run: |
+ docker run --rm -idt -p 5000:5000 rigetti/qvm -S
+ docker run --rm -idt -p 5555:5555 rigetti/quilc -R
+
+ - name: Generate hash from all files excluding example notebooks
+ id: gen_hash
+ run: |
+ HASH=$(find . -type f -not -path './docs/source/examples/*' | sort | xargs cat | sha256sum | awk '{print $1}')
+ echo "hash=$HASH" >> $GITHUB_OUTPUT
+
+ - name: Fetch Jupyter cache
+ uses: actions/cache@v4
+ with:
+ path: ./docs/build/.jupyter_cache
+ key: jupyter-cache-${{ steps.gen_hash.outputs.hash }}
+
+ - name: Build and test Sphinx docs
+ run: |
+ sudo apt update
+ sudo apt install ocl-icd-opencl-dev
+ export BQSKIT_DOC_CHECK_OVERRIDE=1
+ export PYDEVD_DISABLE_FILE_VALIDATION=1
+ make docs
+
+ - name: Run linkcheck on 'release' PRs
+ if: github.event_name == 'pull_request'
+ run: |
+ pr_title_lower=$(echo "${{ github.event.pull_request.title }}" | tr '[:upper:]' '[:lower:]')
+ if [[ "$pr_title_lower" == *"release"* ]]; then
+ make linkcheck
+ fi
diff --git a/.github/workflows/greeting.yml b/.github/workflows/greeting.yml
index e0c5a11d08..3a2e0faa2a 100644
--- a/.github/workflows/greeting.yml
+++ b/.github/workflows/greeting.yml
@@ -10,6 +10,3 @@ jobs:
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
pr-message: 'Hello @${{ github.actor }}, thank you for submitting a PR to Mitiq! We will respond as soon as possible, and if you have any questions in the meantime, you can ask us on the [Unitary Fund Discord](http://discord.unitary.fund).'
- issue-message: |
- Hello @${{ github.actor }}, thank you for your interest in Mitiq!
- If this is a bug report, please provide screenshots and/or **minimum viable code to reproduce your issue**, so we can do our best to help get it fixed. If you have any questions in the meantime, you can also ask us on the [Unitary Fund Discord](http://discord.unitary.fund).
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
index 77fe5f9423..d426277562 100644
--- a/.github/workflows/publish-pypi.yml
+++ b/.github/workflows/publish-pypi.yml
@@ -21,11 +21,11 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
- make install requirements
+ make install
pip install setuptools wheel twine
- name: Build and publish
env:
diff --git a/.github/workflows/publish-testpypi.yml b/.github/workflows/publish-testpypi.yml
index 76e5c51629..5e5823428b 100644
--- a/.github/workflows/publish-testpypi.yml
+++ b/.github/workflows/publish-testpypi.yml
@@ -8,7 +8,8 @@ on:
- cron: "0 0 * * *"
jobs:
- deploy:
+ build:
+ name: Build Mitiq
if: github.repository_owner == 'unitaryfund'
runs-on: ubuntu-latest
steps:
@@ -17,33 +18,39 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
- make install requirements
- pip install setuptools wheel twine
- - name: Build and publish
- env:
- TWINE_USERNAME: ${{ secrets.TESTPYPI_USERNAME }}
- TWINE_PASSWORD: ${{ secrets.TESTPYPI_PASSWORD }}
+ pip install build
+ - name: change mitiq version
run: |
- python setup.py sdist bdist_wheel
- twine upload --repository testpypi dist/*
+ truncate -s -1 VERSION.txt
+ echo "$(date +"%Y%m%d")" >> VERSION.txt
+ - name: Build mitiq
+ run: python -m build
+ - name: Store build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: build
+ path: dist/*
- # TODO: Need a way to get the version number from previous step
- # download-test:
- # runs-on: ubuntu-latest
- # steps:
- # - name: Check out mitiq
- # uses: actions/checkout@v4
- # - name: Set up Python
- # uses: actions/setup-python@v5
- # with:
- # python-version: 3.8
- # - name: Install Mitiq
- # The ``--extra-index-url`` is necessary since otherwise ``TestPyPI`` would be
- # looking for the required dependencies therein, but we want it to install them
- # from the real PyPI channel.
- # run: |
- # pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ mitiq==x.y.z
+ test-publish:
+ name: Upload release to test PyPi
+ runs-on: ubuntu-latest
+ needs: build
+ environment:
+ name: testpypi
+ url: https://test.pypi.org/p/mitiq/
+ permissions:
+ id-token: write
+ steps:
+ - name: Fetch build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: build
+ path: dist/
+ - name: Publish package distributions to TestPyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ repository-url: https://test.pypi.org/legacy/
diff --git a/.gitignore b/.gitignore
index caaefa6147..1770047cd2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
.vscode
.python-version
.idea/
-.coverage
*.dat
*.ipynb
*.hdf5
@@ -11,8 +10,13 @@
_build
__pycache__/
docs/build/
+docs/source/tags/
mitiq.egg-info/
dist/
build/
-coverage.xml
jupyter_execute/
+.mypy_cache/
+# Coverage reports
+coverage.xml
+.coverage
+.coverage.*
diff --git a/.readthedocs.yml b/.readthedocs.yml
index f91e870862..8c28901563 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -9,7 +9,9 @@ version: 2
build:
os: ubuntu-22.04
tools:
- python: "3.11"
+ python: "3.12"
+ apt_packages:
+ - ocl-icd-opencl-dev
# Build documentation in the docs/ directory with Sphinx
sphinx:
diff --git a/AUTHORS b/AUTHORS
index e018e92d74..d253a68a5b 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -58,3 +58,4 @@ Yash Prabhat
Vladimir Kozhukalov
Francesc Sabater
Emiliano Godinez
+Tommy Nguyen
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b65389785d..07310f3d7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,127 @@
# Changelog
-## Version 0.38.0
-_In development_
+## Version 0.41.0
+
+_In development._
+
+## Version 0.40.0
+
+([Full Changelog](https://github.com/unitaryfund/mitiq/compare/v0.39.0...v0.40.0))
+
+### Highlights
+
+🔉 A new quantum error-mitigation technique is available in Mitiq!
+**Layerwise Richardson Extrapolation** is now available through `mitiq.lre.execute_with_lre`.
+Documentation is also available in the user guide, with more advanced docs and demonstrations coming in the next release.
+Special thanks to Purva Thakre for this contribution!
+
+🥇 We had two **first time contributions** from @ecarlander and @mbrotos!
+Thank you both for your contributions!
+
+🛡️ A **helpful error message** is raised when passing data of the incorrect type to the `MeasurementResult` class, where before it silently gave confusing results.
+
+#### ✨ Enhancements
+- LRE Executors (#2499) [@purva-thakre]
+- LRE Inference Functions (#2447) [@purva-thakre]
+- Raise TypeError when a dictionary is passed to MeasurementResult constructor (#2523) [@natestemen]
+
+#### 📓 Documentation
+
+- Add theory, intro and use case pages of LRE user guide (#2522) [@purva-thakre]
+- add QOSS survey banner (#2533) [@natestemen]
+- Update broken link in the readme (#2528) [@purva-thakre]
+- Move class documentation to class docstrings (#2525) [@natestemen]
+- QSE docs cleanup (#2490) [@natestemen]
+- Add tags to tutorials (#2467) [@purva-thakre]
+- Correct CDR and VNCDR acronyms in example (#2479) [@bdg221]
+- added roadmap link to readme (#2468) [@ecarlander]
+- Update ibmq-backends.md (#2474) [@mbrotos]
+
+#### 🧑🏽💻 Developer Improvements
+
+- Remove `make requirements` (#2481) [@purva-thakre]
+- Fix flaky REM test / refactor (#2464) [@natestemen]
+
+#### 📦 Dependency Updates
+
+- Bump pyscf from 2.6.2 to 2.7.0 (#2518) [@dependabot]
+- Bump pyqrack from 1.30.24 to 1.30.30 (#2521) [@dependabot]
+- Bump pyqrack from 1.30.22 to 1.30.24 (#2497) [@dependabot]
+- Update qiskit requirement from ~=1.2.1 to ~=1.2.2 (#2507) [@dependabot]
+- Bump qibo from 0.2.10 to 0.2.12 (#2506) [@dependabot]
+- Update qiskit-aer requirement from ~=0.15.0 to ~=0.15.1 (#2504) [@dependabot]
+- Update qiskit requirement from ~=1.2.0 to ~=1.2.1 (#2503) [@dependabot]
+- Bump pyqrack from 1.30.20 to 1.30.22 (#2489) [@dependabot]
+- Update qiskit-aer requirement from ~=0.14.2 to ~=0.15.0 (#2484) [@dependabot]
+- Bump pyqrack from 1.30.8 to 1.30.20 (#2487) [@dependabot]
+- Update cirq-core requirement from <1.4.0,>=1.0.0 to >=1.0.0,<1.5.0 (#2390) [@dependabot]
+- Update qiskit requirement from ~=1.1.1 to ~=1.2.0 (#2482) [@dependabot]
+- Update scipy requirement from <=1.14.0,>=1.10.1 to >=1.10.1,<=1.14.1 (#2477) [@dependabot]
+- Bump pyqrack from 1.30.0 to 1.30.8 (#2476) [@dependabot]
+- Bump sphinx from 7.2.6 to 8.0.2 (#2455) [@dependabot]
+- Bump qibo from 0.2.9 to 0.2.10 (#2458) [@dependabot]
+
+## Version 0.39.0
+
+([Full Changelog](https://github.com/unitaryfund/mitiq/compare/v0.38.0...v0.39.0))
+
+### Highlights
+
+We've made updates to our documentation, beginning with the completion of the first section of the Pauli Twirling user guide, which offers a comprehensive introduction to this feature.
+Additionally, we've added a new tutorial on CDR (Clifford Data Regression) using [Qrack](https://github.com/unitaryfund/qrack/) as an efficient near-Clifford simulator.
+This demonstrates a workflow that harnesses the speed of Qrack in the CDR training phase, while providing users with an in-depth look at how to integrate Mitiq and Qrack effectively.
+
+#### 📓 Documentation
+
+- Complete first section of Pauli Twirling user guide (#2454) [@cosenal]
+- Hide primary sidebar from certain pages of the documentation (#2424) [@purva-thakre]
+- CDR Tutorial with Qrack (#2451) [@bdg221]
+
+#### 🧑🏽💻 Developer Improvements
+
+- Separate docs build workflow (#2441) [@purva-thakre]
+- clean and git ignore all coverage reports (#2443) [@cosenal]
+- Ignore _about.py in pytest coverage (#2379) [@purva-thakre]
+- use date to make version unique for testpypi uploads (#2436) [@natestemen]
+
+#### 📦 Dependency Updates
+
+- Update scipy requirement from <=1.13.1,>=1.10.1 to >=1.10.1,<=1.14.0 (#2420) [@dependabot]
+
+## Version 0.38.0
+
+([Full Changelog](https://github.com/unitaryfund/mitiq/compare/v0.37.0...v0.38.0))
+
+### Highlights
+
+🚀 As of this release, thanks to @natestemen, **we are officially supporting Python 3.12 and dropping Python 3.9**.
+
+🌉 As part of UnitaryHack 2024, new contributor @NnguyenHTommy **fixed a Qiskit to Cirq gate conversion error** by implementing a fallback mechanism to decompose and transpile the Qiskit circuit into native Cirq gates.
+
+🌀 Another Unitary Hacker, @EmilianoG-byte **added functionality to simulate noise specifically on CNOT and CZ gates when using the Pauli Twilring technique** to symmetrize errors.
+
+🔉 As hinted in last release's spoilers, @purva-thakre has **implemented the noise scaling functionality required for the Layerwise Richardson Extrapolation (LRE) technique**, which allows a more fine-grained control over the amount of noise in circuits compared to the standard unitary folding method.
+
+### ✨ Enhancements
+- **Noise Scaling for LRE** (#2347) [@purva-thakre]
+- **Issue #2354 Fix - qiskit QFT gates error during conversion** (#2404) [@NnguyenHTommy]
+- **Simulate noise for CNOT and CZ gates in Pauli Twirling** (#2397) [@EmilianoG-byte]
+
+### 🛠️ Maintenance and Upkeep Improvements
+- Update readme (#2421) [@purva-thakre]
+- Update README with Github discussion link (#2419) [@bdg221]
+- Update contributing guide (#2382) [@purva-thakre]
+
+### 🧑🏽💻 Dev Environment Improvements
+- Used trusted publishers for testpypi publishing (#2320) [@natestemen]
+- bump min python version for intersphinx map (#2425) [@natestemen]
+- **Support python 3.12 and drop 3.9** (#2066) [@natestemen]
+
+#### 📦 Dependency Updates
+- Bump qibo from 0.2.8 to 0.2.9 (#2430) [@dependabot[bot]]
+- Update qiskit requirement from ~=1.1.0 to ~=1.1.1 (#2414) [@dependabot[bot]]
+- Bump pyscf from 2.6.0 to 2.6.2 (#2415) [@dependabot[bot]]
+
## Version 0.37.0
@@ -67,7 +187,7 @@ mitiq.qem_methods()
```
This function provides an accessible way to understand the module naming of each technique supported by Mitiq.
-Thanks to @andre-a-alves, @cosenal, @jordandsulliva, @mistywahl, @purva-thakre for the PRs in this milestone.
+Thanks to @andre-a-alves, @cosenal, @jordandsullivan, @mistywahl, @purva-thakre for the PRs in this milestone.
### Enhancements
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b73001c5f7..92ed250bcd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -5,14 +5,14 @@ The most common ways to contribute here are
1. opening an [issue](https://github.com/unitaryfund/mitiq/issues/new) to report a bug or propose a new feature, or ask a question, and
2. opening a [pull request](https://github.com/unitaryfund/mitiq/pulls) to fix a bug, or implement a desired feature.
-3. opening a [discussion post](https://github.com/unitaryfund/mitiq/discussions) to ask a question (no stupid questions!), provide feedback, or show something off!
+3. opening a [discussion post](https://github.com/unitaryfund/mitiq/discussions) to ask a question (all questions welcome!), provide feedback, or show something off!
The rest of this document describes the technical details of getting set up to develop, and make your first contribution to Mitiq.
## Development environment
-1. Ensure you have python 3.9 or greater installed. If not, you can find the downloads [here](https://www.python.org/downloads/).
+1. Ensure you have python 3.10 or greater installed. If not, you can find the downloads [here](https://www.python.org/downloads/).
2. Set up a virtual environment to isolate dependencies. This can be done with many different tools including [Virtualenv](https://virtualenv.pypa.io/en/latest/), [Pipenv](https://pypi.org/project/pipenv/), [Poetry](https://python-poetry.org/), and [Anaconda](https://www.anaconda.com/download). In what follows we will use Anaconda, but if you're familiar with other tools feel free to use those.
3. Set up a local version of the [Mitiq repository](https://github.com/unitaryfund/mitiq). To do this you will need to use `git` which is a version control system. If you're unfamiliar, check out the [docs](https://git-scm.com/), and learn about what the typical [`git` workflow](https://www.asmeurer.com/git-workflow/) looks like.
4. Inside the Mitiq repository (`cd mitiq`), activate a virtual environment. With conda this is done using the following command.
@@ -47,7 +47,7 @@ Once they pass, you can run the entire test suite (excluding those that require
make test
```
-This can often be slow, however, so testing your changes iteratively using `pytest` is often faster when doing development.
+This can often be slow, however, so testing your changes [iteratively](https://docs.pytest.org/en/7.1.x/how-to/usage.html#specifying-which-tests-to-run) using `pytest` is often faster when doing development.
To run the tests for the pyQuil plugins, run
```bash
@@ -68,7 +68,7 @@ docker run --rm -idt -p 5555:5555 rigetti/quilc -R
```
### Updating the documentation
-Follow these [instructions for contributing to the documentation](https://mitiq.readthedocs.io/en/latest/contributing_docs.html) which include guidelines about updating the API-doc list of modules and writing examples in the users guide.
+Follow these [instructions for contributing to the documentation](contributing_docs.md) which include guidelines about updating the API-doc, adding examples, and updating the user guide.
### Style guidelines
@@ -116,14 +116,26 @@ This is a list of accepted request-for-comments (RFC) documents by date of creat
- [Error Mitigation by Subspace Expansion](https://docs.google.com/document/d/1JyQAwiw8BRT_oucZ6tQv0id6UhSdd3df1mNSPpOvu1I) by Ammar Jahin, Dariel Mok , Preksha Naik, Abdulrahman Sahmoud (@bubakazouba) Apr 28, 2023
- [Implementation RFC for Mitiq calibration](https://docs.google.com/document/d/1EZUJyEEUQUH33UOgSIzCCvXyxP0WLOQn11W0x4Ox4nY/edit) by Andrea Mari (@andreamari) Nov 2, 2022
- [Calibration tools for error mitigation RFC (abstract general solutions)](https://docs.google.com/document/d/1otUHnTlyNS-0rxGAxltHLF1iD5C9qT9oEZ3jn8VHWgw/edit) by Andrea Mari (@andreamari) Oct 6, 2022
-- [Identity insersion scaling RFC](https://docs.google.com/document/d/1hbd9frjYiSy0WujA0iCccc-oMO4Q-kZc2G4b3lkJHdk/edit) by Purva Thakre (@purva-thakre) Jun 29, 2022
+- [Identity insertion scaling RFC](https://docs.google.com/document/d/1hbd9frjYiSy0WujA0iCccc-oMO4Q-kZc2G4b3lkJHdk/edit) by Purva Thakre (@purva-thakre) Jun 29, 2022
- [Readout Confusion Inversion RFC](https://docs.google.com/document/d/1buO5PrO5sS02VXjcaYf37RuR0rF6xpyr4J9H1tI4vN4/edit) by Amir Ebrahimi (@amirebrahimi) Jun 16, 2022
- [Documentation reorganization RFC](https://docs.google.com/document/d/13un5TZPknSOhmOBkrL2rsofjGfdp2jDnd-DywLpGFPc/edit) by Ryan LaRose (@rmlarose) Dec 1, 2021
- [Learning-based PEC RFC](https://docs.google.com/document/d/1VItesy6R5SlUa_YXW1km7IjFZ8kzyFeHUepHak1fEh4/edit) by Misty Wahl (@Misty-W) Oct 25, 2021
- [Digital dynamical decoupling RFC](https://docs.google.com/document/d/1cRwFCTn6kUjI1P0kNydtevxIYtE4r8Omd_iWK0Pe8qo/edit) by Aaron Robertson (@Aaron-Robertson) Jan 28, 2021
+### Checklist for adding an approved QEM Technique
+
+After your RFC is accepted, the proposed feature (for example, a new QEM Method) will require the following:
+
+- Add the new QEM method to `mitiq/abbreviated_name_of_qem_method` such that the corresponding units tests are in `mitiq/abbreviated_name_of_qem_method/tests`
+- The code must follow the formatting and style guidelines discussed [above](#style-guidelines),
+- The new module should be added to the [](apidoc.md) using the instructions found in [](contributing_docs.md#automatically-add-information-from-the-api-docs),
+- Add documentation for the new QEM method, additional details are available in [](contributing_docs.md#adding-files-to-the-user-guide),
+- Update `docs/source/guide/glossary.md` with a one-line summary of what your new feature accomplishes, and
+- Update the [](./readme.md#quick-tour) section of the `README.md` with information related to your new technique.
+
+
## Code of conduct
-Mitiq development abides to the [Contributors' Covenant](https://mitiq.readthedocs.io/en/latest/code_of_conduct.html).
+Mitiq development abides to the [](./code_of_conduct.md).
## Lifecycle
The basic development workflow for Mitiq is done in units of milestones which are usually one month periods where we focus our efforts on thrusts decided by the development team, alongside community members.
@@ -132,5 +144,3 @@ Milestones are tracked using the [GitHub milestone feature](https://github.com/u
All releases for Mitiq are tagged on the `main` branch with tags for the version number of the release.
Find all the previous releases [here](https://github.com/unitaryfund/mitiq/releases).
-## Code of conduct
-Mitiq development abides to the [Contributors' Covenant](https://mitiq.readthedocs.io/en/latest/code_of_conduct.html).
diff --git a/Makefile b/Makefile
index 39c30f495b..e85de221bc 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,9 @@ check-types:
clean:
rm -rf dist
rm -rf mitiq.egg-info
- rm -rf .pytest_cache/
+ rm -rf .mypy_cache .pytest_cache .ruff_cache
+ rm -rf htmlcov coverage.xml .coverage .coverage.*
+ rm -rf .ipynb_checkpoints
.PHONY: dist
dist:
@@ -54,10 +56,6 @@ install-hooks:
@chmod +x .git-hooks/*
@echo "Git hooks installed."
-.PHONY: requirements
-requirements: requirements/requirements.txt
- pip install -r requirements/requirements.txt
-
.PHONY: test
test:
pytest -n auto -v --cov=mitiq --cov-report=term --cov-report=xml --ignore=mitiq/interface/mitiq_pyquil
diff --git a/README.md b/README.md
index 80f77c8f5d..6dee8d2f4e 100644
--- a/README.md
+++ b/README.md
@@ -18,8 +18,13 @@ imperfect gate applications, state preparation and measurement errors, etc.
Error mitigation seeks to reduce these effects at the software level by
compiling quantum programs in clever ways.
-Want to know more? Check out our
-[documentation](https://mitiq.readthedocs.io/en/stable/guide/guide.html), chat with us on [Discord](http://discord.unitary.fund), and join our weekly community call ([public agenda](https://docs.google.com/document/d/1lZfct4AOCS7fdyWkudcGyER0n0nsCxSFKSicUEeJgtA/)).
+Want to know more?
+- Check out our
+[documentation](https://mitiq.readthedocs.io/en/stable/guide/guide.html).
+- To see what's in store for Mitiq, look at our roadmap in the [wiki](https://github.com/unitaryfund/mitiq/wiki).
+- For code, repo, or theory questions, especially those requiring more detailed responses, submit a [Discussion](https://github.com/unitaryfund/mitiq/discussions).
+- For casual or time sensitive questions, chat with us on [Discord](http://discord.unitary.fund).
+- Join our weekly community call on [Discord](http://discord.unitary.fund) ([public agenda](https://docs.google.com/document/d/1lZfct4AOCS7fdyWkudcGyER0n0nsCxSFKSicUEeJgtA/)).
## Quickstart
@@ -90,7 +95,22 @@ mitiq.qem_methods()
| Probabilistic error cancellation | [PEC](https://mitiq.readthedocs.io/en/latest/guide/pec.html) | [`mitiq.pec`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/pec) | [1612.02058](https://arxiv.org/abs/1612.02058) [1712.09271](https://arxiv.org/abs/1712.09271) [1905.10135](https://arxiv.org/abs/1905.10135) |
| (Variable-noise) Clifford data regression | [CDR](https://mitiq.readthedocs.io/en/latest/guide/cdr.html) | [`mitiq.cdr`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/cdr) | [2005.10189](https://arxiv.org/abs/2005.10189) [2011.01157](https://arxiv.org/abs/2011.01157) |
| Digital dynamical decoupling | [DDD](https://mitiq.readthedocs.io/en/latest/guide/ddd.html) | [`mitiq.ddd`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/ddd) | [9803057](https://arxiv.org/abs/quant-ph/9803057) [1807.08768](https://arxiv.org/abs/1807.08768) |
-| Readout-error mitigation | [REM](https://mitiq.readthedocs.io/en/latest/guide/rem.html) | [`mitiq.rem`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/rem) | [1907.08518](https://arxiv.org/abs/1907.08518) [2006.14044](https://arxiv.org/abs/2006.14044) |
+| Readout-error mitigation | [REM](https://mitiq.readthedocs.io/en/latest/guide/rem.html) | [`mitiq.rem`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/rem) | [1907.08518](https://arxiv.org/abs/1907.08518) [2006.14044](https://arxiv.org/abs/2006.14044)
+| Quantum Subspace Expansion | [QSE](https://mitiq.readthedocs.io/en/stable/guide/qse.html) | [`mitiq.qse`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/qse) | [1903.05786](https://arxiv.org/abs/1903.05786)|
+| Robust Shadow Estimation 🚧 | [RSE](https://mitiq.readthedocs.io/en/stable/guide/shadows.html)| [`mitiq.qse`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/shadows) | [2011.09636](https://arxiv.org/abs/2011.09636) [2002.08953](https://arxiv.org/abs/2002.08953)|
+| Layerwise Richardson Extrapolation 🚧 | Coming soon | [`mitiq.lre`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/lre) | [2402.04000](https://arxiv.org/abs/2402.04000) |
+
+
+In addition, we also have a noise tailoring technique currently available with limited functionality:
+
+
+| Noise-tailoring Technique | Documentation | Mitiq module | Paper Reference(s) |
+| ----------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Pauli Twirling 🚧 | [PT](https://mitiq.readthedocs.io/en/latest/guide/pt.html) | [`mitiq.pt`](https://github.com/unitaryfund/mitiq/tree/main/mitiq/pt) | [1512.01098](https://arxiv.org/abs/1512.01098) |
+
+> 🚧: Technique is currently a work in progress or is untested and may have some rough edges. If you try any of these techniques and have suggestions, please open an issue!
+
+
See our [roadmap](https://github.com/unitaryfund/mitiq/wiki) for additional candidate techniques to implement. If there is a technique you are looking for, please file a [feature request](https://github.com/unitaryfund/mitiq/issues/new?assignees=&labels=feature-request&template=feature_request.md&title=).
@@ -103,13 +123,13 @@ We refer to any programming language you can write quantum circuits in as a _fro
| [Cirq](https://quantumai.google/cirq) | [Qiskit](https://www.ibm.com/quantum/qiskit) | [pyQuil](https://github.com/rigetti/pyquil) | [Braket](https://github.com/aws/amazon-braket-sdk-python) | [PennyLane](https://pennylane.ai/) | [Qibo](https://qibo.science/) |
|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
-| | | | | | |
+| | | | | | |
You can install Mitiq support for these frontends by specifying them during installation,
as optional extras, along with the main package.
To install Mitiq with one or more frontends, you can specify each frontend in square brackets as part of the installation command.
-For example,
+For example,
to install Mitiq with support for Qiskit and Qibo:
```bash
pip install mitiq[qiskit,qibo]
@@ -127,7 +147,7 @@ You can use Mitiq with any backend you have access to that can interface with su
If you use Mitiq in your research, please reference the [Mitiq whitepaper](https://quantum-journal.org/papers/q-2022-08-11-774/) using the bibtex entry found in [`CITATION.bib`](https://github.com/unitaryfund/mitiq/blob/main/CITATION.bib).
-A list of papers citing Mitiq can be found on [Google Scholar](https://scholar.google.com/scholar?cites=12810395086731011605) / [Semantic Scholar](https://api.semanticscholar.org/CorpusID:221555755?).
+A list of papers citing Mitiq can be found on [Google Scholar](https://scholar.google.com/scholar?oi=bibs&hl=en&cites=1985661232443186918) / [Semantic Scholar](https://api.semanticscholar.org/CorpusID:221555755?).
## License
diff --git a/VERSION.txt b/VERSION.txt
index 44eb47d509..2b81016649 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-0.38.0dev
+0.41.0dev
diff --git a/docs/CONTRIBUTING_DOCS.md b/docs/CONTRIBUTING_DOCS.md
index a6d4821364..4d3af7351c 100644
--- a/docs/CONTRIBUTING_DOCS.md
+++ b/docs/CONTRIBUTING_DOCS.md
@@ -39,16 +39,14 @@ extensions = ['sphinx.ext.autodoc']
Documentation is found in `docs/source`, and is divided into the following sections:
-- a **guide**, whose content needs to be
-written from scratch,
-- **examples** which can be either jupyter notebooks or MyST formatted notebooks, and
-- an **API-doc** part, which is (mostly)
-automatically generated.
+- a **guide**, whose content needs to be written from scratch for new features. For more details, go to [](contributing.md#proposing-a-new-feature-to-mitiq) and [](contributing_docs.md#adding-files-to-the-user-guide)
+- **examples** which can be either a jupyter notebook or a MyST formatted notebook. A checklist is available in [](contributing_docs.md#adding-example-files)
+- an **API-doc** part, which is (mostly) automatically generated. See [](contributing_docs.md#automatically-add-information-from-the-api-docs) for additional information.
Information in the docs should be added as markdown files using the MyST markdown syntax.
If you are adding a new file (as opposed to editing an existing one), ensure to add it to an associated TOC so that it is discoverable.
-The main table of contents (TOC) file for the docs is `index.md`. It includes `guide\guide.md` and `apidoc.md`, among other files. To add a new file to the base TOC, make sure it gets listed in the `toctree` directive like this:
+The main table of contents (TOC) file for the docs is `index.md`. It includes `guide/guide.md` and `apidoc.md`, among other files. To add a new file to the base TOC, make sure it gets listed in the `toctree` directive like this:
````
```{toctree}
---
@@ -76,12 +74,56 @@ To include `.md` files outside of the documentation `source` directory, you can
where `file.md` is the one to be added. For more information on including files external to the docs, see the [MyST docs](https://myst-parser.readthedocs.io/en/latest/).
+
+
### Adding files to the user guide
To add information in the guide, please add markdown (`.md`) files to the `docs/guide` directory.
Remember to add new files to the guide's TOC file `docs/source/guide/guide.md`.
-### Adding workflow images to the user guide
+#### User Guide Outline
+
+The different sections of a User's guide comprises of:
+
+- How do I use `new_QEM_method` labeled as `new_QEM_method-1-intro.md`?
+- When should I use `new_QEM_method` labeled as `new_QEM_method-2-use-case.md`?
+- What additional options are available in `new_QEM_method` labeled as `new_QEM_method-3-options.md`?
+- What happens when I use `new_QEM_method` labeled as `new_QEM_method-4-low-level.md`?
+- What is the theory behind `new_QEM_method` labeled as `new_QEM_method-5-theory.md`?
+
+The main landing page will link all the sections of the User's Guide such that there is a [workflow diagram](https://mitiq.readthedocs.io/en/latest/contributing_docs.html#adding-workflow-images-to-the-user-guide) for the `new_QEM_method` on this page alongside
+links to any tutorials utilizing `new_QEM_method` in `docs/source/examples`.
+
+```{code-block}
+ # Full Name of New QEM Method
+
+ One line summary of what the technique does
+
+ {figure} ../img/new_qem_method_workflow.png
+ ---
+ width: 700px
+ name: new_qem_method_workflow_overview
+ ---
+ The new_QEM workflow in Mitiq is fully explained in the {doc}`new_QEM_method-4-low-level.md` section.
+
+
+ Below you can find sections of the documentation that address the following questions:
+
+ {toctree}
+ ---
+ maxdepth: 1
+ ---
+ new_QEM_method-1-intro.md
+ new_QEM_method-2-use-case.md
+ new_QEM_method-3-options.md
+ new_QEM_method-4-low-level.md
+ new_QEM_method-theory.md
+
+
+ A simple tutorial using `new_QEM_method` can be found
+```
+
+#### Adding workflow images to the user guide
To insert a workflow to the user's guide of some new technique, a template is available (shown below as a `png`). This template is also available in `svg` format at [mitiq_template.svg](../source/img/general_template.svg).
@@ -108,14 +150,22 @@ Jupyter notebooks (`.ipynb`) or MyST markdown notebooks, but MyST formatting wil
If you have a notebook you want to add, and want to automatically convert it from the `.ipynb` to `.md`, you can use a great Python command line tool called [jupytext](https://jupytext.readthedocs.io/en/latest/index.html).
To convert from an IPython notebook to markdown file, run `jupytext your_filename.ipynb --to myst` and find the converted file at `your_filename.md`.
-Futher, not only can `jupytext` convert between the formats on demand, but once you install it, you can configure it to manage _both_ a Jupyter and Markdown version of your file, so you don't have to remember to do conversions (for more details, see the `jupytext` docs on [paired notebooks](https://jupytext.readthedocs.io/en/latest/index.html#paired-notebooks).
+Further, not only can `jupytext` convert between the formats on demand, but once you install it, you can configure it to manage _both_ a Jupyter and Markdown version of your file, so you don't have to remember to do conversions (for more details, see the `jupytext` docs on [paired notebooks](https://jupytext.readthedocs.io/en/latest/index.html#paired-notebooks)).
Using the paired notebooks you can continue your development in the notebooks as normal, and just commit to git the markdown serialized version when you want to add to the docs.
You can even add this tool as a [git pre-commit hook](https://jupytext.readthedocs.io/en/latest/using-pre-commit.html) if you want!
```{tip}
-There is a [sample markdown formatted notebook in the `examples` directory](./examples/template.md) for you to take a look at as you write your own!
+There is a [sample markdown formatted notebook in the `examples` directory](../source/examples/template.md) for you to take a look at as you write your own!
```
+### Adding example files
+
+If you are adding a new tutorial to the [documentation examples](../source/examples/examples.md),
+
+- add the file as a `.md` file in `docs/source/examples`. A template is available at [here](../source/examples/template.md).
+- add your tutorial in `docs/source/examples/examples.md` such that it shows up in a docs build
+- add a thumbnail image as `docs/source/_thumbnails/your_image.png` and list it in the `nbsphinx_thumbnails` block of `docs/source/conf.py`
+
### Automatically add information from the API docs
New modules, classes and functions can be added by listing them in the appropriate file (such as `apidoc.md` or a child), e.g.,
@@ -142,7 +192,7 @@ source code, and to the API page `apidoc.md`.
### Adding references
-To add references to the [Mitiq bibliography](https://mitiq.readthedocs.io/en/stable/bibliography.html), the first step is to add the reference to `docs/source/refs.bib` which is organized alphabetically. For formatting, please see BibTeX documentation for [articles](https://www.bibtex.com/e/article-entry/), [books](https://www.bibtex.com/e/book-entry/), and [others](https://www.bibtex.com/e/entry-types/).
+To add references to the [Mitiq bibliography](bibliography.md), the first step is to add the reference to `docs/source/refs.bib` which is organized alphabetically. For formatting, please see BibTeX documentation for [articles](https://www.bibtex.com/e/article-entry/), [books](https://www.bibtex.com/e/book-entry/), and [others](https://www.bibtex.com/e/entry-types/).
Once the reference has been added to the `docs/source/refs.bib` file, cite the reference in the file by using:
```md
@@ -162,7 +212,7 @@ To call sphinx directly, `cd` into the `docs` directory and run
sphinx-build -b html source build
```
-These commands generate the `docs/build` folder, which is ignore by the `.gitignore` file.
+These commands generate the `docs/build` folder, which is ignored by the `.gitignore` file.
Once the documentation is generated you can view it by opening it in your browser.
## Testing the Documentation
diff --git a/docs/source/_thumbnails/cdr-qrack.png b/docs/source/_thumbnails/cdr-qrack.png
new file mode 100644
index 0000000000..501a1ef4f9
Binary files /dev/null and b/docs/source/_thumbnails/cdr-qrack.png differ
diff --git a/docs/source/apidoc.md b/docs/source/apidoc.md
index f0a572f2dc..b489a3f6d9 100644
--- a/docs/source/apidoc.md
+++ b/docs/source/apidoc.md
@@ -87,6 +87,23 @@ See Ref. {cite}`Czarnik_2021_Quantum` for more details on these methods.
:members:
```
+### Layerwise Richardson Extrapolation
+
+```{eval-rst}
+.. automodule:: mitiq.lre.lre
+ :members:
+```
+
+```{eval-rst}
+.. automodule:: mitiq.lre.multivariate_scaling.layerwise_folding
+ :members:
+```
+
+```{eval-rst}
+.. automodule:: mitiq.lre.inference.multivariate_richardson
+ :members:
+```
+
### Pauli Twirling
```{eval-rst}
@@ -365,6 +382,7 @@ See Ref. {cite}`Czarnik_2021_Quantum` for more details on these methods.
.. automodule:: mitiq.interface.mitiq_pyquil.conversions
:members:
```
+
#### Qibo Conversions
```{eval-rst}
diff --git a/docs/source/conf.py b/docs/source/conf.py
index db2fdfc8d7..18e400168d 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -98,10 +98,47 @@ def setup(app):
"sphinx_copybutton",
"nbsphinx",
"sphinx_gallery.load_style",
+ "sphinx_design",
+ "sphinx_tags",
]
+# to add tags to the documentation tutorials
+tags_create_tags = True
+tags_output_dir = "tags/"
+tags_overview_title = "All tags"
+tags_create_badges = True
+tags_intro_text = "Tags on this page: "
+tags_page_title = "Tags"
+tags_page_header = "Pages with this tag: "
+tags_index_head = "Tags in the documentation tutorials: "
+tags_extension = ["md"]
+tags_badge_colors = {
+ "zne": "primary",
+ "rem": "primary",
+ "shadows": "primary",
+ "cdr": "primary",
+ "pec": "primary",
+ "ddd": "primary",
+ "calibration": "primary",
+ "cirq": "secondary",
+ "bqskit": "secondary",
+ "braket": "secondary",
+ "pennylane": "secondary",
+ "qiskit": "secondary",
+ "stim": "secondary",
+ "qrack": "secondary",
+ "qibo": "secondary",
+ "ionq": "secondary",
+ "basic": "success",
+ "intermediate": "success",
+ "advanced": "success",
+}
+
+# hide primary sidebar from the following pages
+html_sidebars = {"apidoc": [], "changelog": [], "bibliography": []}
+
intersphinx_mapping = {
- "python": ("https://docs.python.org/3.9", None),
+ "python": ("https://docs.python.org/3.10", None),
"numpy": ("https://numpy.org/doc/stable/", None),
"scipy": ("https://docs.scipy.org/doc/scipy/", None),
# Cirq is no longer using sphinx docs so interlinking is not possible.
@@ -196,10 +233,16 @@ def setup(app):
r"https://doi\.org/.*",
r"https://link\.aps\.org/doi/.*",
r"https://www\.sciencedirect\.com/science/article/.*",
+ r"https://github.com/unitaryfund/mitiq/compare/.*",
+ r"https://github.com/unitaryfund/mitiq/projects/7",
]
linkcheck_retries = 3
+linkcheck_anchors_ignore_for_url = [
+ "https://github.com/unitaryfund/qrack/blob/main/README.md"
+]
+
class ApsStyle(pybtex.style.formatting.unsrt.Style):
"""Style that mimicks APS journals."""
@@ -401,6 +444,7 @@ def get_incollection_template(self, e):
"examples/quantum_simulation_scars_ibmq": "_static/qmbs_ibmq.png",
"examples/zne_logical_rb_cirq_stim": "_static/mitiq_stim_logo.png",
"examples/quantum_simulation_1d_ising": "_static/quantum_simulation.png",
+ "examples/cdr_qrack": "_static/cdr-qrack.png",
# default images if no thumbnail is specified
"examples/*": "_static/mitiq-logo.png",
}
diff --git a/docs/source/examples/bqskit.md b/docs/source/examples/bqskit.md
index 04b4d71812..e9a399fcac 100644
--- a/docs/source/examples/bqskit.md
+++ b/docs/source/examples/bqskit.md
@@ -10,6 +10,9 @@ kernelspec:
name: python3
---
+```{tags} bqskit, zne, intermediate
+```
+
# Improving the accuracy of BQSKit compiled circuits with error mitigation
In this tutorial we describe how to use error mitigation capabilities from [Mitiq](https://mitiq.readthedocs.io/en/stable/) together with the compilation capabilities of [BQSKit](https://bqskit.lbl.gov/) {cite}`Patel_2022_ACM`, a compiler for quantum circuits. BQSKit stands for Berkeley Quantum Synthesis Toolkit and it allows one "to compile quantum programs to efficient physical circuits for any QPU".
diff --git a/docs/source/examples/braket_mirror_circuit.md b/docs/source/examples/braket_mirror_circuit.md
index ee122dfd7e..10e86c2fe3 100644
--- a/docs/source/examples/braket_mirror_circuit.md
+++ b/docs/source/examples/braket_mirror_circuit.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} braket, zne, basic
+```
+
# Mitiq with Braket
This notebook shows improved performance on a mirror circuit benchmark with zero-noise extrapolation on Rigetti Aspen-9 via Amazon Braket.
diff --git a/docs/source/examples/calibration-tutorial.md b/docs/source/examples/calibration-tutorial.md
index 83f401d298..06f9b15702 100644
--- a/docs/source/examples/calibration-tutorial.md
+++ b/docs/source/examples/calibration-tutorial.md
@@ -12,6 +12,9 @@ kernelspec:
name: python3
---
+```{tags} calibration, zne, qiskit, basic
+```
+
# Breaking into error mitigation with Mitiq's calibration module
diff --git a/docs/source/examples/cdr_qrack.md b/docs/source/examples/cdr_qrack.md
new file mode 100644
index 0000000000..6f9aa5a2e5
--- /dev/null
+++ b/docs/source/examples/cdr_qrack.md
@@ -0,0 +1,190 @@
+---
+jupytext:
+ formats: ipynb,md:myst
+ text_representation:
+ extension: .md
+ format_name: myst
+ format_version: 0.13
+ jupytext_version: 1.16.3
+kernelspec:
+ display_name: Python 3
+ language: python
+ name: python3
+---
+
+```{tags} qiskit, cdr, qrack, cirq, basic
+```
+
+# CDR with Qrack as Near-Clifford Simulator
+
+In this tutorial, [Clifford Data Regression](../guide/cdr.md) (CDR) is used with [Qrack](https://qrack.readthedocs.io/en/latest/) and a Qiskit fake backend.
+
++++
+
+## Setup
+
+To start, relevant modules and libraries are imported. Please ensure that the following Python modules are installed: `mitiq`, `numpy`, `pyqrack`, `cirq`, `qiskit`
+
++++
+
+```{note}
+In the code below the environmental variable, `QRACK_MAX_CPU_QB`, is set to `-1`. This enviroment variable sets the maximum on how many qubits can be allocated on a single QEngineCPU instance. More information can be found on the [Qrack README page](https://github.com/unitaryfund/qrack/blob/main/README.md#maximum-allocation-guard).
+```
+
+```{code-cell}
+import numpy as np
+import collections
+
+import os
+import warnings
+warnings.simplefilter("ignore", np.ComplexWarning)
+
+from pyqrack import QrackSimulator, QrackCircuit
+os.environ["QRACK_MAX_CPU_QB"]="-1"
+
+import mitiq.interface.mitiq_qiskit
+from mitiq.interface.mitiq_cirq import compute_density_matrix
+from mitiq import cdr, Observable, PauliString
+
+import cirq
+
+from qiskit.providers.fake_provider import Fake5QV1
+```
+
+## Sample Circuit
+
+This sample circuit includes Clifford gates (`H`, `CNOT`, `RX`) and non-Clifford gates (`RZ`).
+
+```{code-cell}
+a, b = cirq.LineQubit.range(2)
+circuit = cirq.Circuit(
+ cirq.H.on(a), # Clifford
+ cirq.H.on(b), # Clifford
+ cirq.rz(1.75).on(a),
+ cirq.rz(2.31).on(b),
+ cirq.CNOT.on(a, b), # Clifford
+ cirq.rz(-1.17).on(b),
+ cirq.rz(3.23).on(a),
+ cirq.rx(np.pi / 2).on(a), # Clifford
+ cirq.rx(np.pi / 2).on(b), # Clifford
+)
+
+# CDR works better if the circuit is not too short. So we increase its depth.
+circuit = 5 * circuit
+print(circuit)
+```
+
+## Devices and Near-Clifford Simulator
+
+During CDR, near-Clifford representations of the original circuit are generated. Those near-Clifford representations are run with a near-Clifford simulator (Qrack Near-Clifford Simulator) and also on the quantum device (or noisy simulator, like Qiskit Fake Backend.) In this example, we also want to show how the unmitigated and mitigated results compare to the exact results, so we will use another simulator (Cirq Simulator) to generate the ideal results.
+
++++
+
+### Qrack Near-Clifford Simulator
+
+Especially when using CDR at scale, it is important to use an efficient Near-Clifford circuit simulator. In this example, Qrack will be configured and used as the Near-Clifford Simulator. The `qrack_simulate` method accepts a Cirq circuit and the number of shots as parameters. The Qrack simulator is then called and the expectation value for `00` is returned.
+
+Since CDR includes the generation of near-Clifford circuits representing the original circuit, a near-Clifford simulator is ideal for efficiently simulating the circuit. Again, this is particularly important when using CDR at scale.
+
+```{code-cell}
+def qrack_simulate(circuit: cirq.Circuit, shots=1000) -> float:
+ """Returns the expectation value of 00 from the state prepared by the circuit
+ executed without noise by Qrack configured as a near-Clifford simulator.
+ """
+
+ # Cirq -> Qiskit circuit
+ qiskit_circ = mitiq.interface.mitiq_qiskit.to_qiskit(circuit)
+
+ # Qiskit -> Qrack circuit
+ qcircuit = QrackCircuit.in_from_qiskit_circuit(qiskit_circ)
+
+ # Setup the Qrack simulator and run it
+ qsim = QrackSimulator(qiskit_circ.width(), isStabilizerHybrid=True, isTensorNetwork=False, isSchmidtDecomposeMulti=False, isSchmidtDecompose=False, isOpenCL=False)
+ qcircuit.run(qsim)
+
+ # Use shot measurements to return the expectation value of 00
+ results = qsim.measure_shots(q=list(range(qiskit_circ.width())), s=shots)
+ results = dict(collections.Counter(results))
+ for key, value in results.items():
+ results[key] = value / shots
+ return results[0]
+```
+
+### Qiskit Fake Backend
+
+CDR requires the use of a quantum device or a noisy simulator. The near-Clifford circuits that are generated from the original circuit are executed on the quantum device or noisy simulator in order to compare against the simulated results.
+
+In this example, a Qiskit 5 Qubit Fake Backend is used. The [Fake5QV1](https://docs.quantum.ibm.com/api/qiskit/qiskit.providers.fake_provider.Fake5QV1) uses configurations and noise settings taken previously from the 5 qubit IBM Quantum Yorktown device. The `qiskit_noisy` function takes the Cirq circuit and uses Mitiq to change it into a Qiskit circuit. After adding measurements, the circuit is run on the fake backend. The expectation value for `00` is then returned.
+
+```{code-cell}
+# Use Qiskit's Fave5QV1 as a noisy simulator
+def qiskit_noisy(circuit: cirq.Circuit, shots=1000):
+ """Execute the input circuit and return the expectation value of |00..0><00..0|"""
+
+ # Cirq -> Qiskit circuit
+ qiskit_circ = mitiq.interface.mitiq_qiskit.to_qiskit(circuit)
+
+ # Add measurement gates to the circuit
+ qiskit_circ.measure_all()
+
+ # Setup the fake backend and run the circuit
+ noisy_backend = Fake5QV1()
+ job = noisy_backend.run(qiskit_circ, shots=shots)
+
+ # Use the resulting counts to return the expectation value of 00
+ counts = job.result().get_counts()
+ ret_val = counts[qiskit_circ.num_qubits * "0"] / shots
+ return ret_val
+```
+
+### Cirq Simulator for exact result
+
+The `compute_density_matrix` is the Cirq density matrix simulator with a Mitiq wrapper. It is used to obtain the exact `00` expectation value. This is then used to determine the accuracy of the mitigated and unmitigated reuslts.
+
+```{code-cell}
+def cirq_simulate(circuit: cirq.Circuit) -> np.ndarray:
+ """Returns Tr[ρ |0⟩⟨0|] where ρ is the state prepared by the circuit
+ executed without depolarizing noise.
+ """
+ res = compute_density_matrix(circuit, noise_level=(0.0,))
+ return res[0, 0].real
+```
+
+## Executing CDR
+
+With the different executor functions defined for running the Qrack, Qiskit, and Cirq simulators, the `mitiq.cdr.execute_with_cdr` function can now be called.
+
+```{code-cell}
+ideal_expval = cirq_simulate(circuit).round(5)
+print(f"Ideal expectation value from Cirq Simulator: {ideal_expval:.3f}")
+
+unmitigated_expval = qiskit_noisy(circuit)
+print(f"Unmitigated expectation value from Qiskit Fake backend: {unmitigated_expval:.3f}")
+
+mitigated_expval = cdr.execute_with_cdr(
+ circuit,
+ qiskit_noisy,
+ simulator=qrack_simulate,
+ random_state=0,
+)
+print(f"Mitigated expectation value with Mitiq CDR: {mitigated_expval:.3f}\n")
+
+```
+
+## Conclusion
+By learning from the near-Clifford circuits that resemble the original circuit, CDR is able to apply the noise information learned to the original circuit. From the example, you can see that the mitigated expectation value is closer to the ideal value.
+
+The improvement factor with CDR can be seen below to highlight the mitigated results that can be provided with this technique.
+
+```{code-cell}
+unmitigated_error = abs(unmitigated_expval - ideal_expval)
+mitigated_error = abs(mitigated_expval - ideal_expval)
+
+print(f"Unmitigated Error: {unmitigated_error:.3f}")
+print(f"Mitigated Error: {mitigated_error:.3f}")
+
+improvement_factor = unmitigated_error / mitigated_error
+print(f"Improvement factor with CDR: {improvement_factor:.2f}")
+```
+
+To learn more about CDR, please check the [User Guide](../guide/cdr.md) or the [ZNE and CDR with Cirq: 1D Ising Simulation](./quantum_simulation_1d_ising.md) example. If you have any questions, please do not hesitate to open a [Github discussion](https://github.com/unitaryfund/mitiq/discussions) or reach out to the Mitiq team on [Discord](http://discord.unitary.fund).
diff --git a/docs/source/examples/cirq-ibmq-backends.md b/docs/source/examples/cirq-ibmq-backends.md
index 90fb133e89..391f9d631f 100644
--- a/docs/source/examples/cirq-ibmq-backends.md
+++ b/docs/source/examples/cirq-ibmq-backends.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} cirq, zne, qiskit, basic
+```
+
# Error mitigation with Cirq on IBMQ backends
diff --git a/docs/source/examples/combine_ddd_zne.md b/docs/source/examples/combine_ddd_zne.md
index c907ee2907..9078ce108a 100644
--- a/docs/source/examples/combine_ddd_zne.md
+++ b/docs/source/examples/combine_ddd_zne.md
@@ -11,6 +11,8 @@ kernelspec:
language: python
name: python3
---
+```{tags} ddd, zne, cirq, intermediate
+```
# Composing techniques: Digital Dynamical Decoupling and Zero Noise Extrapolation
diff --git a/docs/source/examples/combine_rem_zne.md b/docs/source/examples/combine_rem_zne.md
index 6676418d49..21a9c018db 100644
--- a/docs/source/examples/combine_rem_zne.md
+++ b/docs/source/examples/combine_rem_zne.md
@@ -11,6 +11,8 @@ kernelspec:
language: python
name: python3
---
+```{tags} rem, zne, cirq, intermediate
+```
# Composing techniques: Readout Error Mitigation and Zero Noise Extrapolation
diff --git a/docs/source/examples/ddd_on_ibmq_ghz.md b/docs/source/examples/ddd_on_ibmq_ghz.md
index fa3c29a5db..9d432203e5 100644
--- a/docs/source/examples/ddd_on_ibmq_ghz.md
+++ b/docs/source/examples/ddd_on_ibmq_ghz.md
@@ -11,6 +11,8 @@ kernelspec:
language: python
name: python3
---
+```{tags} ddd, qiskit, basic
+```
# Digital dynamical decoupling (DDD) with Qiskit on GHZ Circuits
diff --git a/docs/source/examples/ddd_tutorial.md b/docs/source/examples/ddd_tutorial.md
index 96ef6344ab..c2df395834 100644
--- a/docs/source/examples/ddd_tutorial.md
+++ b/docs/source/examples/ddd_tutorial.md
@@ -10,6 +10,8 @@ kernelspec:
language: python
name: python3
---
+```{tags} ddd, cirq, basic
+```
# Digital dynamical decoupling (DDD) with Mirror Circuits
diff --git a/docs/source/examples/examples.md b/docs/source/examples/examples.md
index 499f00a5b7..adbd1c9406 100644
--- a/docs/source/examples/examples.md
+++ b/docs/source/examples/examples.md
@@ -1,6 +1,8 @@
# Examples
-Below you can find a gallery of tutorials applying Zero Noise Extrapolation (ZNE), Probabilistic Error Cancellation (PEC), and Digital Dynamical Decoupling (DDD) with Mitiq:
+Below you can find a gallery of tutorials applying Zero Noise Extrapolation (ZNE), Probabilistic Error Cancellation (PEC), Clifford Data Regression (CDR), and Digital Dynamical Decoupling (DDD), etc. with Mitiq.
+
+You can also search for an example utilizing a specific QEM technique, frontend, backend or difficulty level by clicking through the tags available [here.](tags.md)
```{nbgallery}
ZNE Calibration with Qiskit
@@ -32,8 +34,9 @@ Classical Shadows with Cirq: State Reconstruction and Observable Estimation
DDD with Cirq: Mirror circuits
DDD with Qiskit: GHZ circuits
+CDR with Qrack as Near-Clifford Simulator
GGI Summer School ZNE Hands-On Tutorial
Composing techniques: REM + ZNE
Composing techniques: DDD + ZNE
The Mitiq paper code
-```
+```
\ No newline at end of file
diff --git a/docs/source/examples/ggi_summer_school_unsolved.md b/docs/source/examples/ggi_summer_school_unsolved.md
index 85e67a7c8b..f636623033 100644
--- a/docs/source/examples/ggi_summer_school_unsolved.md
+++ b/docs/source/examples/ggi_summer_school_unsolved.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} qiskit, zne, intermediate
+```
+
# Hands-on lab on error mitigation with Mitiq.
+++
diff --git a/docs/source/examples/hamiltonians.md b/docs/source/examples/hamiltonians.md
index 6987d7ccbe..25f17a4948 100644
--- a/docs/source/examples/hamiltonians.md
+++ b/docs/source/examples/hamiltonians.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} cirq, zne, advanced
+```
+
# Defining Hamiltonians as Linear Combinations of Pauli Strings
This tutorial shows an example of using Hamiltonians defined as {class}`~cirq.PauliSum` objects or similar objects in other
diff --git a/docs/source/examples/ibmq-backends.md b/docs/source/examples/ibmq-backends.md
index 75fdaac3f4..2cd750bee2 100644
--- a/docs/source/examples/ibmq-backends.md
+++ b/docs/source/examples/ibmq-backends.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} qiskit, zne, basic
+```
+
# Error mitigation on IBMQ backends with Qiskit
@@ -97,7 +100,7 @@ def ibmq_executor(circuit: qiskit.QuantumCircuit, shots: int = 8192) -> float:
)
# Run the circuit
- job = backend.run(circuit, shots=shots)
+ job = backend.run(exec_circuit, shots=shots)
# Convert from raw measurement counts to the expectation value
counts = job.result().get_counts()
diff --git a/docs/source/examples/layerwise-folding.md b/docs/source/examples/layerwise-folding.md
index b2b081ddb9..6e5efd0a9c 100644
--- a/docs/source/examples/layerwise-folding.md
+++ b/docs/source/examples/layerwise-folding.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} qiskit, zne, intermediate
+```
+
# ZNE with Qiskit: Layerwise folding
diff --git a/docs/source/examples/learning-depolarizing-noise.md b/docs/source/examples/learning-depolarizing-noise.md
index 2419e1c3be..0f2756dea8 100644
--- a/docs/source/examples/learning-depolarizing-noise.md
+++ b/docs/source/examples/learning-depolarizing-noise.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} cirq, pec, advanced
+```
+
# Learning quasiprobability representations with a depolarizing noise model
In this example, we demonstrate the workflow of learning quasiprobability representations of a `CNOT` gate with a depolarizing noise model,
diff --git a/docs/source/examples/maxcut-demo.md b/docs/source/examples/maxcut-demo.md
index 9450e3fc84..fed240089a 100644
--- a/docs/source/examples/maxcut-demo.md
+++ b/docs/source/examples/maxcut-demo.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} cirq, zne, advanced
+```
+
# Solving MaxCut with Mitiq-improved QAOA
+++
diff --git a/docs/source/examples/molecular_hydrogen.md b/docs/source/examples/molecular_hydrogen.md
index 95f45e2a52..defa5c55d1 100644
--- a/docs/source/examples/molecular_hydrogen.md
+++ b/docs/source/examples/molecular_hydrogen.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} cirq, zne, advanced
+```
+
# Estimating the potential energy surface of molecular Hydrogen with ZNE and OpenFermion
In this example we apply zero-noise extrapolation (ZNE) to the estimation of the potential energy surface of molecular Hydrogen ($\rm H_2$).
diff --git a/docs/source/examples/molecular_hydrogen_pennylane.md b/docs/source/examples/molecular_hydrogen_pennylane.md
index 720ab88502..914f20c80b 100644
--- a/docs/source/examples/molecular_hydrogen_pennylane.md
+++ b/docs/source/examples/molecular_hydrogen_pennylane.md
@@ -10,6 +10,8 @@ kernelspec:
language: python
name: python3
---
+```{tags} cirq, pennylane, zne, advanced
+```
# Estimating the potential energy surface of molecular Hydrogen with ZNE and PennyLane + Cirq
diff --git a/docs/source/examples/pec_tutorial.md b/docs/source/examples/pec_tutorial.md
index 299d9329b9..22b9b32ea5 100644
--- a/docs/source/examples/pec_tutorial.md
+++ b/docs/source/examples/pec_tutorial.md
@@ -11,6 +11,8 @@ kernelspec:
name: python3
---
+```{tags} pec, cirq, qiskit, basic
+```
# Probabilistic error cancellation (PEC) with Mirror Circuits
This notebook shows probabilistic error cancellation (PEC) *Temme et al. PRL (2017)* {cite}`Temme_2017_PRL`, *Sun et al. PRLAppl (2021)* {cite}`Sun_2021_PRAppl`, *Zhang et al. NatComm (2020)* {cite}`Zhang_2020_NatComm`, improving performance of a mirror circuit benchmark on the `braket_dm` noisy simulator.
diff --git a/docs/source/examples/pennylane-ibmq-backends.md b/docs/source/examples/pennylane-ibmq-backends.md
index d68f447935..feb5ba6547 100644
--- a/docs/source/examples/pennylane-ibmq-backends.md
+++ b/docs/source/examples/pennylane-ibmq-backends.md
@@ -11,6 +11,9 @@ kernelspec:
name: python3
---
+```{tags} qiskit, zne, pennylane, basic
+```
+
# Error mitigation with Pennylane on IBMQ backends
In this tutorial we will cover how to use Mitiq in conjunction with [PennyLane](https://pennylane.ai/), and further how to run error-mitigated circuits on IBMQ backends.
diff --git a/docs/source/examples/pyquil_demo.ipynb b/docs/source/examples/pyquil_demo.ipynb
index 2f9b654df8..94ec38e5d6 100644
--- a/docs/source/examples/pyquil_demo.ipynb
+++ b/docs/source/examples/pyquil_demo.ipynb
@@ -1,5 +1,18 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e564c033",
+ "metadata": {
+ "vscode": {
+ "languageId": "raw"
+ }
+ },
+ "source": [
+ "```{tags} zne, intermediate\n",
+ "```"
+ ]
+ },
{
"cell_type": "markdown",
"id": "dac81d40",
@@ -141,7 +154,7 @@
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZMAAAEeCAYAAABPMvhnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABF80lEQVR4nO3deXxU9dX48c/JJCEbWUkCBELCTgRkx60qm9TaKlqttbWt7ePPtlbtSovda58+2mL3xS52sbWtVYvUuqEIuLKD7IlC2BKWBEISIHtyfn/MjY4hgUwymTvLeb9e82Jy7525Z8LNnPvdRVUxxhhjeiPG7QCMMcaEP0smxhhjes2SiTHGmF6zZGKMMabXLJkYY4zpNUsmxhhjes2SiQk7IvKsiHzC7TiihYgUiIiKSKzbsZjQZcnEBJ2I7BORChFJ9tl2q4is6s7rVfVKVX0owDGpiJwWkVM+j68G8hyBZl/yJpRYMjFu8QCfdzuIDs5X1RSfx48CfQL74jeRypKJccti4Csikt7ZThG5SETWi0iN8+9FPvtWicitzvORIvKSc9wxEfmXs/3XIvLjDu/5pIh80d9AReS7IvKoiPxVRE6KyA4Rmeazf7CI/FtEKkVkr4jc1eG1j4vIwyJSC9wiIoUi8rLzXsudWB92jn9aRO7scP6tInKtnzHPEJHVIlItIodF5FciEu+zX0XkMyLylnPMr0VEnH0eEbnf+X2WAld1eO9bRKTUiX+viHzUZ9//E5Fdzr6dIjLF2b5IRPb4bL+2w/u95sRYIyLFIjLHZ3+aiPzR+RzlIvK/IuLx5/dhgkBV7WGPoD6AfcBcYAnwv862W4FVzvNM4ATwMSAWuMn5OcvZvwq41Xn+T+AbeG+MEoBLnO0zgENAjPPzAKAOyO0iJgVGdrHvu0AD8D68Jap7gTXOvhhgI/BtIB4YDpQC831e2wwscI5NBFYD9zvHXwLUAg87x38IWOtz7vOB40B8J3EVOHHHdrJvKnCB8/srAHYBX+jweZ8C0oF8oBJ4r7PvM0AxMNT5v1jZfh4g2Yl3jHPsIOA85/kNQDkwHRBgJDDMZ99g53dwI3AaGOTsuwVoAb4IxDn7a4BMZ/8TwO+cc+cA64BPu30d26PDNed2APaIvgfvJJPxzpdGNu9OJh8D1nV4zWrgFuf5Kt5JJn8Ffg8M6eQ8u4B5zvM7gGfOEpM6X5LVPg/fhLDc59gioN55PhM40OG97gb+7PPal3325TtfnEk+2x7mnWSSgDdxjnJ+vh/4TRcxF9BFMunk2C8AT3T4vJf4/PwosMh5vgL4jM++Kzokk2rgg0Bih3MsAz7fzWvgDeAa5/kteBO/+Oxf51wHuUCj77nw3lysdPs6tse7H1bNZVyjqtvx3h0v6rBrMLC/w7b9QF4nb/NVvHfB65zqp0/57HsIuNl5fjPwt3OENEVV030ey3z2HfF5XgckOO0fw4DBTlVRtYhUA1/H+yXY7mCHz1alqnWd7VfVBuBfwM0iEoP3i/NccZ9BREaLyFMicsSpXvs/vKUzXx0/U4pPjL4xv/1/oaqn8ZYcPgMcdqrlxjq7hwJ7uojn4yLyhs/vaHyHeMrVyRQ+5xyM9/cb55yr/bW/w1tCMSHEkolx23eA/8e7E8UhvF8ivvLxVqG8i6oeUdX/p6qDgU8DvxGRkc7uh4FrROR8YBywNMCxg/dLd2+HJNRfVd/nG6bP88NApogk+Wwb2uE9HwI+CswB6lR1dQ/iegBvVdUoVU3Fm+Ckm6893CGmfN+dqrpMVefhreIqBv7g7DoIjOj4ZiIyzDnmDrxVlenA9g7x5LW32fic85Dzno3AAJ/fb6qqntfNz2KCxJKJcZWq7sZ7J36Xz+ZngNEi8hERiRWRG/FWLT3V8fUicoOIDHF+PIH3i7vNee8yYD3eO/t/q2p9H3yEdcBJEfmaiCQ6jdfjRWR6Zwer6n5gA/BdEYkXkQuBD3Q4ZrXzGX5M90ol/UQkwecRA/THW213yik5fNaPz/QocJeIDBGRDHxKjiKSKyLXiLdbdyNwyokV4EG8nSqmitdIJ5Ek4/1/qXTe45N4Sya+cpxzxonIDXiT/zOqehh4HvixiKSKSIyIjBCRy/z4PCYILJmYUHAP3i8cAFT1OPB+4Mt4G5+/CrxfVY918trpwFoROQU8ibfOvtRn/0PABLr3pbxF3j3O5GfneoGqtjqxTgL2AsfwfqmmneVlHwUuxPvZ/hdvMm3scMxfnbgf7kbcp4B6n8ds4CvAR4CTeEsF/+rG+7T7A972jy3AJrwdJdrFAF/CW2qoAi7DSVSq+hjwA+AfznmX4m1E34k3Ma4Gjjqf67UO51wLjML7+/sBcL1zHQB8HG9nhZ14bxgex1sqMiFE3l1NaUxkEZFL8X4hD9MQvdjF2525WFW/47Pt48BtqnqJe5EFh4jcgrdDRcR/1khmJRMTsUQkDu/AyAdDKZGIyHSnqiZGRN4LXINPe47TnnI73l5qxoQFSyYmIonIOLxdWAcBP3M1mDMNxNu9+RTwC+CzqroZQETm421bOIq3usiYsGDVXMYYY3rNSibGGGN6LWonnRswYIAWFBS4HYYxxoSVjRs3HlPV7I7bozaZFBQUsGHDBrfDMMaYsCIiHWenAKyayxhjTABYMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK9FbW8uY0x4W7q5nMXLSjhUXc/g9EQWzh/DgsmdLXljgsGSiTEm7CzdXM7dS7ZR39wKQHl1PXcv2QZgCcUlVs1ljAk7i5eVvJ1I2tU3t7J4WYlLERkrmZg+Y9UQpq8cqu58nbOutpu+ZyUT0yfaqyHKq+tR3qmGWLr5jJV3jfHb4PREv7abvmfJxPQJq4YwfenG6UPO2BYj8JV5o12IxoAlE9NHrBrC9JVTjS0s2VROemIsg9ISECA9KY42hdrGFrfDi1rWZmL6xKD0BA5VN5yxXQR+s2o3H50xjLSkOBciM+Hu2//ZzoGqOh657UJmFGYCoKp84s/r+eFzxcwem8PQzCSXo4w+VjIxAaeqDM04s+463hPDiOxkfvRcCRfe9yLffXIHB47XuRChCVdPbC5jyaZy7poz6u1EAiAi3HvdBAS4e8k2bNG/4LNkYgLuFy/uZu3eE1xRlENeeiIC5KUn8qPrJ/LCly7n6bsu4b3nDeThNfu5/P6VfPbhjWzcf8LtsE2I23/8NN98YjvTCzK4Y9bIM/bnpSey6H3jeHX3MR7dcNCFCKNb1C7bO23aNLX1TALvsQ0HWfj4Vq6bksePbzgfEeny2CM1DTy0eh9/X7Of2oYWpuSn8//eM5wrzhvIf7ccsm7F5m1NLW3c8NvX2XvsNM9+4VLyuui11dam3PSHNew8VMsLX7qMgWkJQY408onIRlWddsZ2SyYmUF5+s5JP/WU9FwzP4k+3TCc+tnsF39ONLTy24SB/fG0vB6vqyUyO42RDC82t71ybiXEe7r1ugiWUKHXvs7v43UulPPDRKVw5YdBZj9137DTv/fnLXDxiAA9+YtpZb2iM/7pKJlbNZQJi56Fabv/7JkbmpPDAzVO6nUgAkvvFcsvFhaz6yiwe+OiUMxIJWLfiaPbym5X87qVSPjIz/5yJBKBgQDJfuWIMLxZX8OSWQ0GI0IAlExMAh6rr+eRf1tE/IZa/fHIG/RN61kvLEyNcOWEQLa2dl5atW3H0OXaqkS89uoVROSl866qibr/ukxcXMmloOt99cgfHTjX2YYSmnSUT0ys19c3c8ud11DW28udPTg9IHbWNbjbgbf/48qNbqG1o5pcfmUxivKfbr/XECIuvn8jpxla+8+SOPozStLNkYnqssaWVz/xtI3uPneZ3H5vK2IGpAXnfhfPHkBj37i+OxLgYFs4fE5D3N+HhT6/t5aU3K/nWVeN6dG2Nyu3PXXNG8vTWwzy3/XAfRGh8WTIxPdLWpnzt8a2sLj3Oj66fyEUjBwTsvRdMzuPe6ya8q8fOHbNHWeN7FNleXsMPnytmXlEuN18wrMfv8+nLRlA0KJVvLt1BdV1TACM0HVkyMT2y+PkSlr5xiIXzx3Dt5DPnSeqtBZPzeG3RbNZ9Yw7gTV4mOpxubOGuf24mK7kfP/rgxF71xorzxLD4holU1zVxz1M7Axil6ciSifHbw2v288CqPdw0I5/bLx/Rp+fK6Z/ApKHpLC+u6NPzmNDx3Sd3sPf4aX724UlkJMf3+v3OG5zGZy4bwZJN5awsseuor1gyMX5ZvvMo3/7PdmaPzeH715wXlD78c8flsOVgNRUnz5zry0SW/7xRzmMby7hz1kguGJ4VsPe9c85IRuak8PUl2zjZ0Byw9zXvsGRium3LwWru/Odmzhucxi9vmkysJziXz5xxuQCstNJJRDtwvI5vPrGdqcMyuGvOqIC+d79YD4uvn8jR2gbufbY4oO9tvGzWYHNWvqslikBaYhx/vGUayf2Cd+mMHdifvPRElu+q4Mbp+UE7r+l7vtdXrEeIEfj5hyf1yY3K5PwMPnVxIQ++upf3TxzERSMC12nEWMnEnEXH1RLbFOqaWnl99/GgxiEizBmXwytvVdLQYcEtE746Xl/NrUqbwoZ9fTfp55evGMOwrCQW/XsbdU229kkgWTIxXepstcTGljZXpjWZMy6XhuY2Xt9zLOjnNn2js+uruVX79PpKjPfwww9O5EBVHZ/920Yuvm8FhYue5uL7VtiS0r1kycR0KZRWS7xgeCbJ8R6W77J2k0jh1vV1wfAsLh6RyUtvHXu7VFReXc/dS7ZZQumFsEgmIvJeESkRkd0isugsx31QRFREzpjR0vgvlKY16Rfr4T2jslmxq8IWPooQbl5fpcfOXJTNJhPtnZBPJiLiAX4NXAkUATeJyBkzvolIf+DzwNrgRhi5vnLFaDp2/E2M87g2rcmccTkcqW1gx6FaV85vAusrV4ymY8/yYF1fR2o672Zuk4n2XMgnE2AGsFtVS1W1CXgEuKaT474P/BCwwQgBkp+VjALpSXFvr5bo5pois8bmIALLdx115fwmsLL7J6Dq7SEY7OsrlErdkSIcugbnAb5rcJYBM30PEJEpwFBVfVpEFnb1RiJyG3AbQH6+dTE9l8c3lpEY5+HVr80mJYhdgbsyIKUfk4em8+KuCr4wd7Tb4Zhe+uWKt8hN7cdLC2eRENf9GYEDYeH8Mdy9ZNu7OgC4WeqOBOFQMjkrEYkBfgJ8+VzHqurvVXWaqk7Lzs7u++DCWENzK09tOcSVEwaGRCJpN2dcLtvKazhaawXQcLZubxVr91Zx26Ujgp5I4J3JRAc5SyYkxdtKnr0VDsmkHBjq8/MQZ1u7/sB4YJWI7AMuAJ60RvjeWbbjCCcbW7h+auAnceyNuc5o+BetV1dY+9XK3WQlx3PTjKHnPriPLJicx+q753CDc43PLcp1LZZIEA7JZD0wSkQKRSQe+DDwZPtOVa1R1QGqWqCqBcAa4GpVtQXee+HxjWXkpSdyQWHg5kcKhNG5KQzJSORFazcJW1vLqnn5zUr+5z2FJMW7X+r98Iyh1DV5S+Km50I+mahqC3AHsAzYBTyqqjtE5B4Rudrd6CLToep6Xt19jA9OHUJMTN9P5OgPEWHuuFxe3X2M+iYbDR+OfrViN6kJsXysF+uUBNKU/AxG5aTwz/UHz32w6VLIJxMAVX1GVUer6ghV/YGz7duq+mQnx15upZLeeWJzOapw/ZTQquJqN2dcDo0tbby220bDh5viI7U8v/Mon7y4kP4JcW6HA3hvUG6cPpQtB6vZddi6nfdUWCQTEzyqyuMby5hZmEl+VpLb4XRqZmEWKf1iebHYqrrCza9X7iE53sMnLy5wO5R3uW7KEOI9MfzLSic9ZsnEvMumAyfYe+x0yDW8+4qPjeHS0QN4cVeFrcAYRvZUnuKprYf42IUFpCf1ftGrQMpMjmf++IEs2VRmk4n2UK+TiYjEiMjlIjLHGa1uwtjjG8tIivfwvgmD3A7lrOaOy6XiZCPbD9W4HYrppgdW7aFfbAy3vqfQ7VA69eHpQ6ltaOG57UfcDiUs9SiZiEiSiFwnIn8FKoAVwAtApYg8LCLXi0hKIAM1fa++qZWnthzmyvGDgrpeSU/MGpNDjHhXfjSh72BVHU9sLuemGfkMSOnndjidunB4FvmZSfxz3QG3QwlL3U4mIpIrIreKyFPAMeBxvGM6/gxcClwMPAhMAx7Fm1ieEZHbRGRg4EM3gRaqY0s6k5Ecz9RhGTaLcJj47Ut78Ihw26XD3Q6lSzEx3ob4tXurKK085XY4Ycefkskh4HdANt55sMY7PawWquqrqrpaVb+qqmPxTsj4PSAdeAAoE5HQ6LphuvT4xjKGZCQyszDT7VC6Zc64XHYerrXJ+ULckZoGHttQxvXThjAoLbTnvrph6hA8McK/NlhDvL/8SSa3A0NUdaaq3quqO7s6UFWLVfU+Vb0I79xanwWsVSuElVfX89qeY3xwSuiNLenK3HE5ALxoa8OHtN+/XEqrKp+9bITboZxTTmoCs8fm8O+NZTS1tLkdTljpdjJR1d+p6mF/T6CqR1T1D6pq/zMh7IlNZajCB0N0bElnRmSnMCwryUbDh7Bjpxr5x7r9LJiUx9DM0Oxq3tFNM4Zy7FQTK6zruV+sa7AJi7ElnRER5ozN5fU9x2097xD1x1f30tjSxu2zQr9U0u7SUdkMTE3gn+usqssfvUomIjJaRK4VkU87De3XisioQAVngmPj/hPsO17HDdPcm3Svp+aOy6GppY1X3rLR8KGmuq6Jv76+j6smDGJEdvh07oz1xPChaUN4+a1Kyq09rtv8TiYiMk5Efi4i5XjnynocbyP7b53nxSJySER+JiLjAhuu6QvtY0uuHB9+ne6mF2bSPyHWqrpC0F9e38fpplY+N2uk26H4rf3G6lEbEd9t/nQNHiEijwPbgf8BtuLtsfVx4H3AVc7ze4AtwK3AdhF5TERCtz9glKtvauWprYd534TQH1vSmThPDJeNzmZFcaWNhg8hpxpb+PNr+5hXlMu4Qaluh+O3oZlJXDJyAI9tOEirXVfd4s+3x05gG3ALsERVT5/tYBFJBq7Huy77TiChhzGaPrRsxxFOhcnYkq7MHZfLU1sPs6Wsmsn5GW6HY4CH1+ynpr6ZO8KwVNLuphn53P73Tbz8ViWzxuS4HU7I86ea6wZnlcK/nSuRAKjqaVV9SFWnADf2PETTlx7beJChmYnMKAiPsSWduXxMNp4YsQWzQkR9UysPvlLKpaOzOX9outvh9NjccblkJcfziI2I7xZ/ugafMd27H6/9T09fa/pO2Yk6Xt9zPKzGlnQmPal9NLy1m4SCR9Yf4NipJu6cHb6lEvBOKPrBqUN4cVcFFSdtmehz6UkDfIqIXCAi80XkIpsqJXw9sak87MaWdGXuuByKj5yk7ESd26FEtcaWVn73UikzCzOZHsal3XY3Th9KS5vy743l5z44yvnTAN9PRB4AKoHXgGeAV4ByESkXkb+KyFUiEr63uFFEVXl8UxkXDM8Mm8FkZzPHWRt+hY2Gd9W/N5ZzpLaBO2dHxgiBEdkpzCjI5F/rD6BqDfFn40/J5H7g08Aq4OvAV5xtgrdx/Wa8a7NvF5E5gQ3TBNqG/SfYf7yO66eG39iSzozITqFwQDIv2CzCrmlubeM3q3YzaWg6F4/McjucgPnwjKHsO17HmtIqt0MJaf4kkxuBP6nqlar6Q1X9KfAjZ98NwHBgEZAILBORLwY2VBNIj28I37ElXZkzNoe1pVWcarTR8G548o1DlJ2o587ZI4mkCor3TRhE/4RYHllvDfFn408ySQRWd7VTVfep6mJgDPBT4H4RmdfL+EwfqGtq4elt4Tu2pCtzxuXS1NrGK29Wuh1KVFm6uZyL7nuRLz+2hdgYoba+2e2QAiohzsO1k/N4dvsRquua3A4nZPmTTDYAs851kKo2q+pC4D/AN3oamOk77WNLbgjjsSWdmVaQQVpinK1xEkRLN5dz95JtHKr29nZqaVO+/sR2lm6OrAbrD0/Pp6mljSci7HMFkj/J5D7gI35UXz0DTPU/JNPXHt9YRn5mUkT0tvEV54nh8jHZrCypsFHLQbJ4WQn1HdZMr29uZfGyEpci6htFg1M5f0gaj6w7aA3xXfBnnMkyYCHe6qt1InIz0P8sL7kMsH6aISZSxpZ0Zc64XKpON/HGwRNuhxIVulqYLBIXLLtxej4lR0/yxsFqt0MJSX6NM1HVHwPzgWTgr8CbgAK3i8jXROR2EVkkIiuBjwB/D3TApneWOGNLrpuS53YofeKy0dnExohVdQXJ4PTOV07sans4u3rSYJLiPTxiU9N3yu9Bi6q6HBiPd2LHfwAHgeuAe4FfAf8HTAd+CXwtYJGaXmtft+TC4VkRMbakM2mJcUwvyLRZhINk4fwxxHneXcJNjPOwcP4YlyLqOyn9YvnAxMH8d+sh6zHYiR6tZ6Jez6rqLapagHdd+JnAHLyJJFtVv6CqkdWtI8yt33eCA1V1YT2pY3fMGZfDm0dPcbDKaln72oLJeUwakk6MeAec5aUncu91E1gwOTJLvjfOGEpdUyv/3XLI7VBCTkBWWlTV46q6XlVXqupGVY28CtMI8PjGgyTHe7hyQuSMLenMXGc0vM3VFRwn6puZNSaHvfddxWuLZkdsIgGYPDSdMbn9bfLHTvgznUqPR7WLyNyevtb03tLN5Vx474s8uqEMBZ7fEdlfsgUDksnpH899zxZTuOhpLr5vRcR1VQ0VJxua2VN5iolD0t0OJShEhA/PGMqWshp2Hqp1O5yQ4k/J5DkRWSEi7xcRz7kOFpE4Zxnfl/B2EzYuaB8HcLjGOw6grqmVu5dsi+gv16Wby6k63UxjSxsKlFfXR/xndsu28hpU4fyhaW6HEjTXTs7DI3DDb1+3mxUf/iSTyUAL3vm3DonI30Xk805yuUhELhaRD4jIl0TkUeAI3mV864BJAY/cdEu0jAPwtXhZCS0dxplE+md2y9ayGoCoKZkArCqpBITTTa12s+Kj23NpqOp24AoRuRC4HbgGuAlv12BfAtQCS4AHVHV9gGI1PRBN4wDaReNndsuWg9XkZyaRmRzvdihBs3hZCa3a+c1KJLcXnYvfEzOp6mpgtVPVNRUowtubS/FOT78d2KyqbYEM1PTM4PREyjv5Eo3EcQDtovEzu2VrWQ2T89PdDiOo7Galcz3uzaWqraq6TlX/oqqLVfV+Z5nejZZIQsfC+WPwxETHOIB2C+ePITHu3c16kf6Z3VB5spHy6nomhfHSvD0RTQM1/eFXMhGRfJ/HEBE523QqJgQsmJzHoNR+xHtiomIcAHg/873XTWBAirfqJTMpLuI/sxu2llUD0dVeAnaz0hV/q7n20aGNREQqgWXAT1R1S4DiMgFSU99MeU0Dd80exRfnjXY7nKBZMDmP900YxMTvLePqSXmWSPrAlrIaYgTG56W6HUpQtV9LP3hmF5UnG8lIiuM7Hzgv6q8xf6u5XvZ5vAJsxTvZ48eA9SLy+cCGZ3prw74qVGHm8MiaIbg74mNjmDosg7V7bYW8vrDlYDWjc/uTFB85a+J014LJeaxeNJukeA9Xnz846hMJ+D/R4+WqOst5XK6qk4E04ENAGfATZzbhgBKR94pIiYjsFpFFnez/jIhsE5E3RORVESkKdAzhau3eKuI9MUzJz3A7FFfMLMyi+EgtNXU2s08gqSpby6qZOCR6xpd0FOuJYXJ+OhsP2AzVEIDpVFS1RVUfxzsn1x7gpyIS1+vIHE6vsV8DV+LtOXZTJ8niH6o6QVUn4V1K+CeBOn+4W1N6nElD00mIO+c404g0szATVVi3z0ongXSwqp4Tdc2cH2WN7x1Nzc9g1+GTnLaJHwMzNxd45+cCvgNkAtMC9b7ADGC3qpaqahPwCN4xLr7n9p3XIJkzx75EpZMNzWwvr4nKKq525w9NJz42hrWlx90OJaJscRrfz4+yxveOpgzLoLVN2WJrnPjXAC8ibXTvi/pVEQHvBMO9rVDNwzvNfbsyvDMUd4ztc8CXgHhgdmdvJCK3AbcB5Ofn9zKs0Ldh/wnaFC4YnuV2KK5JiPMwaWi6tZsE2JaD1cTHxjBmYHR36JzsVB9v3H+Ci0YOcDkad/n7Rf8MZ08mWXi/6NfjHcAYNKr6a+DXIvIR4JvAJzo55vfA7wGmTZsW8aWXNaXHifNI1LaXtLugMJNfrdxNbUMzqQkBq4GNalvLajhvcCpxnoBVboSltMQ4RuemWLsJfiYTVX3/2fY768PPBG5T1a29CcxHOTDU5+chzrauPAI8EKBzh7W1pVVMHJJOYnx0tpe0mzk8i1+s2M3GfSeYNTbH7XDCXktrG9vKa7hx+tBzHxwFpg7L4Omth2lr04hcCru7AnZbISLnAd8CSgKYSMBbyhklIoUiEg98GO9kk77nHuXz41XAWwE8f1g63djCtvIaLoji9pJ2U/IziPMIa/Zau0kg7K48RX1za1TNFHw2U4dlUtvQwu7KU26H4qpeJxNnJPzdwGogEadNIlBUtQW4A+/AyF3Ao6q6Q0TuEZGrncPuEJEdIvIG3naTM6q4os2G/SdobVNmFkZve0m7xHgPE4eks87aTQJi60HvTMHR3vjebuqwd9pNopm/DfClvj8CqUC687wGuElVXw1YdA5VfYYOa6Ko6rd9nttgyQ7Wlh7HEyNvX+jRbmZhJr9/uZS6ppaoHGQXSG+UVdM/IZaCrGS3QwkJBVneWZM37j/BTTMiv2NPV/wtmRT4PPKd128A7gHGqurTAYzN9MLavVVMHJJGcj/74gRvu0lLm0b93WMgtA9WjOb2AV8i3k4um6L82vJ3BHyMz8OjqhmqOlNVv6uqkb0WbBipa2phy8Fqq+LyMXVYBp4YYW2pVXX1RkNzK8WHT1oVVwdTh2VQeuw0Vaeb3A7FNdHdry9CbdpfTUubWuO7j5R+sYwfnMpaa4TvlZ2Ha2lp06ibKfhcphV4q5OjuXRiySQCrXHaS6YVWDLxNXN4FlsO1tDQYRlj033tI72jbQ2Tc5mQl0acR9gQxcmk2xXqIrIiAOdTVZ0TgPcxZ7F273HGD04lxdpL3qW9EX7TgRNcNCK6Ryv31NayGnL692NgWoLboYSUhDgP5w1Os5KJH8dKLx9WEupj9U2tbDlYE9VTqHRlWkEmIli7SS9sOVgd9ZM7dmXqsAy2lFXT1BKdC812+9ZVVS/vwzhMgGw+cIKm1raontyxK2mJcRQNSrXxJj1UU99M6bHTXDfF1u7ozNRhGfzx1b3sPFwbldWAVlKIMGv2VhEjWHtJF2YWZrHpwAkaW6zdxF/bypzBilH4Rdkd0T54MeDJRETsr9RFa0uPc97gNJvQsAszh2fS2NLGVueL0XRf+7TzE/PSXY0jVOWmJjAkI5GN+6Oz5NsXJRMbyeSShuZWNh+sZmahlUq6MsMpsdn6Jv7bWlZN4YBk0pLsRqUrU4dlsHH/CVQjflLyM5wzmYjI6yIyyY/3jL7fYoh446C38c8a37uWkRzP2IH9bX2THthysCaql+ntjqnDMjha20h5db3boQRdd0omFwDLu0ooInJNZ9tN8K0trUIEplvJ5KxmFmaycf8Jmlujs9dNTxytbeBIbYMNVjyHKfnR227SnWRyGu/6IMtF5PxO9v8tsCGZnlpTepxxA1NJS7RqiLOZUZhFXVMr28qt3aS73hmsaCWTsxk7sD9J8Z6oHG/SnWSiqvot4LfAi50kFGsjCQGNLa1sOnDCqri6YUZhe7uJVXV119ayGjwxQtEgSyZnE+uJYXJ+elSOhO92A7yqfhP4Hd4SykTfXQGPyvhta1kNjS02vqQ7svv3Y0R2ss3T5YctZdWMye0f9at2dsfU/Ax2Ha7ldGOL26EElb+zBn8D7xrqL4rIhL4JyfTEmj3eL8YZNr6kW2YOz2LDPu8CYubsVNUZ+W6lku6YMiyDNn2najBadCeZvKsay0kofwBWdCihGBet3VvF2IH9yUiOdzuUsDCzMJNTjS3sPFTrdighb9/xOmobWmza+W6aHKWN8N1JJos6blDVr+NNKC8C/QIdlPFPU0sbG/dbe4k/2n9XVtV1blvbBytaMumWtMQ4RuemsPGAJZN3UdVfd7H968CDgHUdctm28mrqm1tt/RI/5KYmUJCVxBprhD+nNw5WkxAXw+jcFLdDCRtTh2Wyaf8J2qKoGrVXI+BV9W6gs+7CJojavxBn2MqKfplZmMX6fVVR9QffE1vLahg/OI1Yj03l111Th2VQ29DC7spTbocSNL2+OlR1WyACMT23dm8Vo3NTyLT2Er/MHJ5JTX0zxUdOuh1KyGpubWPHoRqb3NFP0Tjpo91qhLnm1jY27Kuy9pIeeHu8ibWbdOnNoydpaG6zaVT8VJCVRGZyvCWTsxGRS0XEOpuHiO3lNdQ1tTLTqrj8NiQjibz0RBu8eBbtsytbTy7/iAhT8jOiaiR8T0omK4Fu3aaIyPUi8jMR+ZSIxHbY93QPzm06aJ+wcIbNx9UjM4dnsm5fVVTO8todWw5Wk5YYx7CsJLdDCTtTh2VQeuw0Vaeb3A4lKHqSTLo1fYqI3AH8CkgCFgKviYjvN957enBu08Ga0uOMzEkhu7/10O6JCwqzqDrdxO6K6Gko9ceWMu9MwSI2a5K/phVEV7tJX7aZ3AHMV9XbgAnAG3gHOrYnFLs6e6mltY0N+07Y+iW90D79zBqbkv4M9U2tvHn0ZFQuQRsIE/LSiPOIJZMAGKyqWwBUtUVVPw2sAFaKSBY2p1ev7Txcy6nGFmt874X8zCQGpibYYlmd2HGohtY2tcGKPZQQ5+G8wWlR027Sl8mkUkQKfTeo6pfwtrmsBGI7fZXptjXOF6BN7thzIsLM4Zms3WvtJh294cwtdb715OqxqcMy2FLmXbQu0vUkmXT3L24FcMsZL1b9ArAKSOjBuY2PtaVVDB+QTE5/+1X2xszCLCpPNrL32Gm3QwkpW8tqGJSWQE6qXV89NXVYBo0tbew8HPlzwPVZAzzwOeCHne1Q1buAgh6c2zha25R1e6uYaVVcvdZesrOlfN9tS1m1dQnupWgavNiTZPIvoPFcB6lqk6rWnWX/gR6c2zh2Ha7lZGOLzccVAMMHJDMgpZ+1m/iormti//E6Jtq0872Sm5rAkIxENu6P/BsVv5OJqt6kqlYf4LK320tssGKviQgzC63dxJcNVgycqcMy2Lj/RMRfWzadSphaU1pFQVYSA9OsPjsQZg7P5HBNA2Un6t0OJSS0L+w0wRrfe23qsAyO1jZSXh3Z15YlkzDU1qas31dlpZIAav9drrGqLsA7WHF4djKpCbbCRG9NiZLFsiyZhKHiIyepqW+2LsEBNConhYykOGuEx1mmt6yaSVbFFRBjB/YnKd4T8eNNepVMRCReREoDFYzpnnfGl1jJJFBiYoQZhZk2gzBwpLaBypONNlNwgMR6Ypicn84GSyZnJVgX36Bbu/c4QzMTyUtPdDuUiDKzMIuDVfUcivC67XNpby+xNUwCZ2p+BrsO13K6scXtUPrMOZOJiJR29QBKCMK0KCLyXhEpEZHdInLGmvQi8iUR2SkiW0XkRREZ1tcxuaXNGV9ygbWXBNw7402iu3SypayG2Bhh3KBUt0OJGFOGZdCm7yTqSNSdKU2yga8DnY0LiQceCWhEHThrp/wamAeUAetF5ElV3elz2GZgmqrWichngR8BN/ZlXG55s+IkJ+qarYqrD4wdmEpqQixrS6u4dvIQt8NxzZaD1YwblEpCnC1bFCiTfRrhLxo5wOVo+kZ3kskbwFFV/U/HHSLSj76f/XcGsFtVS51zPgJcA7ydTFR1pc/xa4Cb+zgm17Qv5GQzBQee5+12k+hthG9rU7aV1XD1pMFuhxJR0hLjGJ2bwsYDkdtu0p02k18AXZX7m4FPBi6cTuUBB31+LnO2deV/gGc72yEit4nIBhHZUFlZGcAQg2ft3uPkpScyNNMWK+oLMwoz2XvsNBW1DW6H4orSY6c52dhi7SV9YOqwTDbtP0FbW2QOXjxnMlHVx1T1xS72tanqQx02u7ZOiYjcDEwDFne2X1V/r6rTVHVadnZ2cIMLAFVlbWmVdQnuQ+3jTaK1dLK1rBqwke99YeqwDGobWthdGZkLsQV8nImqBvo9y4GhPj8Pcba9i4jMBb4BXK2q55w7LBztrjjF8dNN1vjeh84bnEpKv9iobYTfWlZDUryHkTkpbocScSJ90sdwGLS4HhglIoUiEg98GHjS9wARmQz8Dm8iqXAhxqBoXw3QFsPqO7GeGKYOy3i7bSravHGwmvF5aXhibCHUQCvISiIzOT5ik0m3F6gSkRUBOJ+q6hw/X9DirCe/DPAAf1LVHSJyD7BBVZ/EW62VAjzmrFV9QFWvDkC8IWPp5nL+72lvn4Ob/rCahfPHsmDy2ZqOTE/1T/DwVsUpChc9zeD0RBbOHxMVv+smZ92NT1wYsT3rXSUiTMnPiNiR8P6sdhhD78eU9Oh2R1WfAZ7psO3bPs/n9jKukLZ0czl3L9lKfbN3tbby6gbuXrINICq+5IJp6eZyXtjpLdwqUF5dHzW/65IjJ2lqabPG9z40dVgGy3cdpep0E5nJ8W6HE1DdTiaqenkfxmHOYvGykrcTSbv65lYWLyuJ+C+4YFu8rITGluj7XS/dXM53ntwBwPef2klLq0b053XLtIJ32k3mFeW6HE1ghUObSdTranqPaJ/2oy9E4+/aW/LdRk19MwBHaxu5e8k2lm4+o5+L6aUJeWnEeSQi200smYSBwV3MwdXVdtNz0fi79pZ8W9+1rb00ZgIrIc7DeYPTIrLdpLezBo8WkWtF5NPOgMBrRWRUoIIzXnfOHnHGtsQ4Dwvnj3Ehmsi2cP4YEjtMIxLpv+toLI25aeqwDLaUVdPUoTo13PnTAA+AiIwDPgNcDwxs3+z8q84xR4FHgd+p6q4AxBnV0hK9DXUDUuI5fqopqnoYBVv773TxshLKq+uJ8wj3Xjchon/Xg9MTO10FMJJLY25qbWujsaWNMd98NqL+lv3pGjwC+CFwLVAPvIJ3bMcevNOtCJAJjAQuAG4F7hSRJcDX2ufWMv5bUVxBWmIca+6eQ6zHaib72oLJeSyYnMcvX3yLnyx/k4tGRva4noXzx/DlR7fQ6rNGeaSXxtyydHM5j6zzzg4Vab0F/flm2ol37ZJbgFxVvVJV71HVv6vqc6r6rPP8e6p6JZALfAoYgc+kjMY/bW3KypJKLh2dbYkkyOYW5aIKK4sjdhwsAB84fzD9YoXEOA8C5KUnRnxpzC2Ll5XQ0EVvwXDnTzXXDc4AwW5R1dPAQ8BDInKN35EZALYfquHYqUZmjw2/ucTC3diB/clLT+SFnRXcOD3f7XD6zBsHq6lrbuMXN03m6vNttuC+FMntU92+1fUnkXTy2jOmrzfds6K4AhG4bHSO26FEHRFh7rgcXt1dSUOH3k6RZGVxBZ4Y4bJRdsPS1yK5t6Df9SYikiIiF4jIfBG5SEQGnvtVpqdWFlcweWh6xI2WDRdzi3JpaG7jtd3H3A6lz6wormBqfgZpSXFuhxLxIrm3YLeTiYj0E5EHgErgNbzTm7wClItIuYj8VUSuEmdyLNN7lScb2VJWw+yxVipxy8zCLFL6xbJ811G3Q+kTR2oa2Hm4lll2jQXFgsl53HvdBPKckognRvi/a8dHRPuUPyWT+4FPA6vwLuP7FWebAAl4Vzd8EtguIn5N5mg6t6rE2/Brf+juiY+N4bIx2SzfVRGRixqtdK4xu2EJngWT83ht0WzuvW4CrW3K2EGpbocUEP4kkxvxzth7par+UFV/inetdYAbgOHAIiARWCYiXwxsqNFnZUkFA1MTKIqQiy1czR2XQ+XJRraW17gdSsCtKK4gLz2R0bm2fkmwzRmXgwi8sDMySr3+JJNEYHVXO1V1n6ouBsYAPwXuF5F5vYwvajW3tvHKm8eYNTYbqzl016wxOXhihBcjrKqrsaWV13bbNeaWnP4JTBqaHpXJZAMw61wHqWqzqi4E/oN35UPTA+v3VXGysYVZY6z6wW3pSfFMG5YRMX/07daWVlHX1GpVXC6aV5TLtvIaDtdEUddg4D7gI35UXz0DTPU/JAPeXlzxnhguHjnA7VAM3j/64iMnOVhV53YoAbOiuIJ+sTFcONyuMbdcUeTtDLs8Am5U/BlnsgxYiLf6ap2I3Az0P8tLLgMi5y8vyFYUVzBzeCbJ/fyePs30gTnjvGtPREpVl6qysqSCi0ZkkRjvOfcLTJ8YmZPC8AHJPB9NyQRAVX8MzAeSgb8Cb+KdYuZ2EfmaiNwuIotEZCXwEeDvgQ44Ghw4XseeytNW/RBCCgckMyI7meW7ImNqldJjp9l/vM6usRAwryiXNaXHqW1odjuUXvF70KKqLgfGA1cB/wAOAtcB9wK/Av4PmA78EvhawCKNIiuKvXcp9oceWuYW5bJ2b/j/0cM7841Zt3P3zSvKpblVWVVS6XYovdKjmQPV61lVvUVVC4BsYCYwB28iyVbVL6hq+P/VuWBFSSXDs5MZlpXsdijGx7xx3j/6l98M7z968Fajjs5NYUhGktuhRL3J+RlkJceHfQePgExDq6rHVXW9qq5U1Y2qGv5dE1xyurGFNXuOM9t6cYWcyfkZZCbHh31j6cmGZtbtrbJSSYjwxAhzx+WyqrgirBfM8mc6lR6PaheRuT19bbR5bfcxmlrbrIorBHlihFljclhZUklLa/j+0b/61jFa2tRuWELIvKJcTja2sKb0uNuh9Jg/JZPnRGSFiLxfRM7Z/UNE4pxlfF/C203YdMPKkgpS+sUyrSDT7VBMJ+YV5VBT38yGMF7De0VxBakJsUwdluF2KMZxyagBJMZ5wrqqy59kMhlowTv/1iER+buIfN5JLheJyMUi8gER+ZKIPAocAR7H2z14UsAjj0CqysriSt4zagDxsbYQVih6z6hs4j0xYVvVZYuthaaEOA/vGTWA5buOohqec8B1exCDqm4HrhCRC4HbgWuAm3DWffchQC2wBHhAVdcHKNaIt/NwLUdqG6wuO4Ql94vlwhFZvLDrKN+4alzYTUPyzmJrdo2FmnlFuTy/8yjby2uZMCTN7XD85veIOFVdDax2qrqmAkV4e3Mp3unptwObVTV8K5Vd0t5d8/IxtkhRKJtblMu3lm5nT+UpRuacbdxu6HlnsTW7xkLNnHG5xAg8v/NIWCaTHpdzVbVVVdep6l9UdbGq3q+qDzm9uSyR9MCK4gomDkkjp3+C26GYs5g7zntX/8LO8BvAuLK4gklD08lK6ed2KKaDzOR4phVkhm27iV/JRETyfR5DRCS8bstCWNXpJjYfrLaJHcPAoLRExuelht3UKm8vtmbXWMi6IozngPO3ZLIP2Os89gPVInJERB4SkfMDHVw0eenNClRt1Hu4mDM2l40HTnD8VKPboXTbSltsLeTNK/LOAReOc3X5m0xe9nm8AmzFO9njx4D1IvL5wIYXPVYUVzIgpR8T8sKvrjQazSvKRdVbNRkuVhZXkJvaj/MG22JroWpYVjKjc1N4YecRt0Pxm78TPV6uqrOcx+WqOhlIAz4ElAE/cWYTNn5oaW3jpZIKLh+TTUxMePUOilbnDU5lYGpC2KwN39TSxitvHWPWmJyw64EWba4oGsi6vVWcON3kdih+6XVHc1VtUdXH8c7JtQf4qYjE9TqyKLLpQDW1DS1WxRVGRIS5RTm88tYxGppb3Q7nnDbsq+JUY4tVcYWBeUW5tIVZqRcCNDcXeOfnAr4DZALTAvW+0WBFcQWxMcIlo2yRonAyZ1wudU2trA6DKTBWOIutXWKLrYW8CXlp5Kb2C7teXf725moTkdauHsDDzqGvOttaAh9y5FlZXMGMwkxSE6xAF04uHJ5FUrwnLEbDryixxdbCRYwz8ePLb1WGRam3nb8lk2fO8VjrHLfe+fnZwIQZucqr6yk5etKquMJQQpyHS0dl8+KuipCeAmP/8dOUVp62budhZF6Rt9T7+p5jbofSbX7dpqjq+8+231kffiZwm6pu7U1g0WKFLVIU1uYW5fLcjiPsOFTL+BDtidd+jdkNS/i4cEQWKf1ieX7HUWaPzXU7nG4JWJuJiJwHfAsoCXQiEZH3ikiJiOwWkUWd7L9URDaJSIuIXB/Ic/e1lcUVDMtKYvgAWwgrHM0ak02MENL12yuKKxg+IJkCu8bCRr9YD5eNyWb5rgra2kK31Our18nEGQl/N7AaSARu63VU735/D/Br4Eq884DdJCJFHQ47ANyCdxnhsNHQ7C3GWnfN8JWV0o8p+Rkh20X4dGMLa0urrFQShq4oyuXYqUY2H6x2O5Ru8bcBvtTnsVdEjuMdCf8DoBW4XlVfDXCMM4Ddqlqqqk3AI3hnLH6bqu5zSkNhNSfY6j3HaWi2hbDC3dyiXHYcquVQdegtMGqLrYWvy8fkEBsjIV3q9eVvyaTA55HvvH4DcA8wVlWfDmBs7fKAgz4/lznb/CYit4nIBhHZUFnp/jreK4orSIr3MHO4LYQVzuaO89Zph+JcXbbYWvhKS4xj5vDMsBkN7+8I+Bifh0dVM1R1pqp+V1VD7y+pA1X9vapOU9Vp2dnuTsGtqqworuDikQPoF3vOhStNCBuRnUzhgGSW7wqtQWa22Fr4u6JoIHsqT7On8pTboZxTOFxh5cBQn5+HONvC2lsVpyivrrfqhwggIswZm8PqPcc51Rg6Q6tssbXwN9eZ+DEcqrq6nUxE5HYRGeLvCURkkIh8WkR6mrjWA6NEpFBE4oEP4106OKy93SXY+v5HhLlFuTS1tvHKm+5Xn7azxdbCX156IucNTo2sZAL8HNjvtDl8U0QmdnWgiIwXkW+IyFq8bRy/AnpUl6OqLcAdwDJgF/Coqu4QkXtE5GrnfNNFpAy4AfidiOzoybmCaUVxBUWDUhmYZgthRYJpwzJIS4zjhRBqN7HF1iLDvKJcNh04QeXJ0F7uwJ9kkgt8Cm833EXAZqdH189EZLaIXCYiPxGRPcAW4OvAYeBWYJCqNvc0SFV9RlVHq+oIVf2Bs+3bqvqk83y9qg5R1WRVzVLV83p6rmCoqWtm4/4TVsUVQWI9Mcwem8PK4gpaQ2BcgC22FjneWe4gdG5UOtPtZKKqVc6yvNcBA4AFwAq81U7Lnec3Ay8B1wEDVHWBqv5ZVcNnToAgeOmtSlrb1OqyI8yccTmcqGtm04ETbodii61FkKJBqeSlJ/L8jtBOJj2a9U1VG4D/Av8V72i7C/Emptdt/fdzW1lcQWZyPJOGprsdigmgS0dnE+cRlu88ynSXu+LaYmuRQ0SYV5TLP9cdoK6phaT40JysMxDrmaiqvq6qr1oiObfWNmVVSQWXjc7GYwthRZTUhDguGJ7leruJLbYWea4oyqWxpY2X3wzdSp5w6BocUd44WM2Jumar4opQ2f37UVp5msJFT3PxfStYujn4vdhtsbXIM70wk9SE2JDu1WXJJMhWFlfgiREuG2XdNSPN0s3lPL31MACKd3mBu5dsC3pCscXWIk+c08FjRfFRWlpDswLIkkmQLN1czsX3reBXK3fjEWFlSWiNlja9t3hZCY0t7/5Dr29uZfGykqDGsbK4gukFtthapLnivIGcqGtmw373O3h0xpJJECzdXM7dS7ZR7kwE2NTa5sodq+lbXU30GMwJIG2xtch16ehs4j0xIVvVZckkCBYvK6G+w/Kbbtyxmr41OD3Rr+2BtnRzOe/7+SsA/OGVUrtZiTAp/WK5aGQWL+w8GpIre1oyCYJQuGM1fW/h/DEkxr17ogdPjLBw/pg+P3d76bem3js2uOJko5V+I1B2/34cqKpj+N3PuNbBoyuWTIJgUBdTpgTrjtUEx4LJedx73QTy0hMRICneQ2ubMjq3f5+f20q/kW/p5nL++8YhwN0OHl2xZBIEhQOSztiWGOcJyh2rCa4Fk/N4bdFs9t53FasXzSErOZ5v/Wd7ny+9aqXfyLd4WQkNIdDBoyuWTPrY8p1HeW1PFbPGZL99x5qXnsi9101gweQerfFlwkRaUhyLrhzLxv0neHxjWZ+eKyslvtPtVvqNHKF+wxCa4/IjRMXJBr76760UDUrltx+baotgRaEPThnCoxsOcu+zu5hXlEtGcudf+r1RdbqJppY2BG/1Rzsr/UaWwemJb/cI7bg9FFjJpI+0tSlfeWwrpxtb+MVNkyyRRKmYGOH7C8ZT29DCj/qgOkJV+cpjW2hobuNLV4y20m8E66yDB8CHpvu9zFSfsJJJH3lo9T5efrOS7y8Yz8icvm+ANaFr7MBUPnlRAX98bS8fmjaEyfkZAXvvP766lxXFFXzv6vP4xEUF3Dl7VMDe24SW9huDxctKOFRdT25qAk2trfz19f0smJTHsKxkV+OTUOyvHAzTpk3TDRs29Ml7Fx+p5epfvcZ7Rg7gwU9MwzuxsolmpxpbmPPjVWT378d/PndJQCb5fONgNdc/8DpzxuXw25un2nUWhfZUnuKDD7xORlI8//7sRWT2QTVqRyKyUVWnddxu1VwB1tDcyuf/+QapCXH88PqJ9gduAO+As2+9v4jt5bX8fe3+Xr9fTX0zd/xjE7mpCfzog+fbdRalRmSn8ODHp1FeXc+tD62noUP38GCyZBJgP3yumJKjJ7n/hokMSOnndjgmhFw1YRCXjBzA4mUlvVqCVVX52uNbOVLTwC8/Mpm0JJuDK5pNK8jk5zdOYvPBaj7/yGbXVvq0ZBJAq0oq+PNr+7jlogIut+VSTQciwj3XnEdjcxv3PrOrx+/ztzX7eW7HEb763jFMCWD7iwlfV04YxDevKmLZjqN8/6mdrky3YskkQI6fauQrj21lTG5/Fl051u1wTIganp3CbZcOZ8nmctaUHvf79dvLa/jfp3Yxa0w2t14yvA8iNOHqfy4p5FMXF/KX1/fxx1f3Bv38lkwCQFX52r+3UtvQzM9vmkRCJ933jGn3uVkjGZKRyLeWbqfZj7UpTjW2cMc/NpGZHM+PPzTJVlE0Z/jmVeO4cvxA/vfpXW+vrRMslkwC4O9rD7B8VwWL3juWsQNT3Q7HhLjEeA/f/cB5vFVxij918w5SVfn6km0cqKrjFzdNDkqvHRN+YmKEn944ianDMvjio2+wfl9V8M4dtDNFqN0VJ/nfp3dy6ehsbrmowO1wTJiYW5TL3HG5/Gz5W92aDuPRDQd5csshvjRvNDMKM4MQoQlXCXEeHvz4NIakJ3LrQxvYXXEqKOe1ZNILjS2t3PXPN0iKj+X+6ydatYPxy3c+UISifP+pnWc9ruTISb7z5A4uGTmAz14+MkjRmXCWkRzPXz45gziPcMuf11FxsqHPz2nJpBd+8vyb7Dxcyw8/OJGc1M6nmTemK0Mzk7hz9iie3X6EVV0s41zX5G0nSekXx09uPD8ggx1NdMjPSuJPt0zn+Kkm/ucvGzjd2NKn57Nk0kOv7z7G718p5aMz85lXlOt2OCZM3fqeQoYPSOY7T+7odMDZd5/cwe7KU/zsxknk9LcbFuOfiUPS+dVHJrPjUA13/GMTLX50+PCXzc3lh6Wby9+eF0cEBqTE882ritwOy4SxfrEe7rlmPDf/cS2/fWkPX5g7+u19T2wu49ENZdw5eySXjBrgYpQmnM0Zl8v3F4znG09sZ+L3nqe+qZXB6YksnD8moBOBWsmkm9qXRS2vrkeBNoXa+haW7TjidmgmzF0yagAfOH8wv1m1h/3HTwNQWnmKbzyxnRkFmXx+jk3eaHonOT6W2Bihrqm1z1ZptGTSTZ0ti9rY0hYyq5yZ8PbNq8Yhqlzx05cpXPQ0V/z0ZVDl5zdNItZjf6amdxYvK6GlwzQrgV6l0a7Sbgr1Vc5MeFu95zhteG9QFGhpU1raYG1p8MYJmMgVjO8vSybd1NVqZqGyypkJb4uXldDc+u47x6ZWK/mawAjG95clk27qbJUzWxbVBIqVfE1fCsb3l/Xm6qaOq5z1RW8IE71CfX1vE96C8f1lKy0aEwLaewv6dvJIjPPYOu4m5HS10qKVTIwJAVbyNeHOkokxIWLB5DxLHiZsWQO8McaYXguLZCIi7xWREhHZLSKLOtnfT0T+5exfKyIFLoRpjDFRK+STiYh4gF8DVwJFwE0i0nFCrP8BTqjqSOCnwA+DG6UxxkS3kE8mwAxgt6qWqmoT8AhwTYdjrgEecp4/DswREZur2xhjgiQckkkecNDn5zJnW6fHqGoLUANkdXwjEblNRDaIyIbKyso+CtcYY6JPVPXmUtXfA78HEJFKEdnfw7caABwLWGDuCPfPYPG7L9w/Q7jHD+58hmGdbQyHZFIODPX5eYizrbNjykQkFkgDjp/tTVU1u6cBiciGzgbthJNw/wwWv/vC/TOEe/wQWp8hHKq51gOjRKRQROKBDwNPdjjmSeATzvPrgRUarUP7jTHGBSFfMlHVFhG5A1gGeIA/qeoOEbkH2KCqTwJ/BP4mIruBKrwJxxhjTJCEfDIBUNVngGc6bPu2z/MG4IYghvT7IJ6rr4T7Z7D43RfunyHc44cQ+gxRO9GjMcaYwAmHNhNjjDEhzpKJMcaYXrNk4qdzzRMWykTkTyJSISLb3Y6lp0RkqIisFJGdIrJDRD7vdkz+EJEEEVknIluc+L/ndkw9ISIeEdksIk+5HUtPiMg+EdkmIm+ISNgtbCQi6SLyuIgUi8guEbnQ9ZiszaT7nHnC3gTm4R2Jvx64SVV3uhpYN4nIpcAp4K+qOt7teHpCRAYBg1R1k4j0BzYCC8Lo/0CAZFU9JSJxwKvA51V1jcuh+UVEvgRMA1JV9f1ux+MvEdkHTFPVsBy0KCIPAa+o6oPOkIkkVa12MyYrmfinO/OEhSxVfRlv1+mwpaqHVXWT8/wksIszp9cJWep1yvkxznmE1R2diAwBrgIedDuWaCQiacCleIdEoKpNbicSsGTir+7ME2aCxFlqYDKw1uVQ/OJUEb0BVAAvqGpYxQ/8DPgq0OZyHL2hwPMislFEbnM7GD8VApXAn52qxgdFJNntoCyZmLAkIinAv4EvqGqt2/H4Q1VbVXUS3qmBZohI2FQ5isj7gQpV3eh2LL10iapOwbu0xeecKuBwEQtMAR5Q1cnAacD19ltLJv7pzjxhpo85bQ3/Bv6uqkvcjqennKqJlcB7XQ7FHxcDVzttDo8As0XkYXdD8p+qljv/VgBP4K3CDhdlQJlPifZxvMnFVZZM/NOdecJMH3IasP8I7FLVn7gdj79EJFtE0p3niXg7cxS7GpQfVPVuVR2iqgV4r/8Vqnqzy2H5RUSSnc4bONVDVwBh08NRVY8AB0VkjLNpDuB6B5SwmE4lVHQ1T5jLYXWbiPwTuBwYICJlwHdU9Y/uRuW3i4GPAducdgeArztT7oSDQcBDTs/AGOBRVQ3L7rVhLBd4wlk/Lxb4h6o+525IfrsT+LtzU1sKfNLleKxrsDHGmN6zai5jjDG9ZsnEGGNMr1kyMcYY02uWTIwxxvSaJRNjjDG9ZsnEmBAiIvNFZJWInBKRShH5lYgkuB2XMediycSYECEiXwaeAw4DXwT+C3wO+LmbcRnTHTbOxJgQICJzgeeBr6rq/T7bnwNmAdnhNgeZiS5WMjHGZSISg7f0sRn4cYfdq4B4IGwmgzTRyaZTMcZ984Ei4BY9s6qgyfk3LbghGeMfSybGuO9GoBV4RUQGdNiX6/x7MrghGeMfazMxxmUish/IP8dheap6KBjxGNMTlkyMcZFTEqnEu6bGbzo55FGgUVUHBTUwY/xk1VzGuGu48+96VV3uu0NECoEM4B9Bj8oYP1lvLmPcleL821mbyPXOv/8KUizG9JglE2Pc1T52JNV3o7Po0WeBEuDpYAdljL8smRjjrp1AHd7uwb5+ABQAd6lqa7CDMsZf1mZijItUtU5EHgTuEpGHgZeAK4FrgYWq+ryrARrTTdabyxiXOVVaPwI+CiQBG4H/C8N1yU0Us2RijDGm16zNxBhjTK9ZMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK9ZMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK/9f7SHFRCeSkIHAAAAAElFTkSuQmCC\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZMAAAEeCAYAAABPMvhnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABF80lEQVR4nO3deXxU9dX48c/JJCEbWUkCBELCTgRkx60qm9TaKlqttbWt7ePPtlbtSovda58+2mL3xS52sbWtVYvUuqEIuLKD7IlC2BKWBEISIHtyfn/MjY4hgUwymTvLeb9e82Jy7525Z8LNnPvdRVUxxhhjeiPG7QCMMcaEP0smxhhjes2SiTHGmF6zZGKMMabXLJkYY4zpNUsmxhhjes2SiQk7IvKsiHzC7TiihYgUiIiKSKzbsZjQZcnEBJ2I7BORChFJ9tl2q4is6s7rVfVKVX0owDGpiJwWkVM+j68G8hyBZl/yJpRYMjFu8QCfdzuIDs5X1RSfx48CfQL74jeRypKJccti4Csikt7ZThG5SETWi0iN8+9FPvtWicitzvORIvKSc9wxEfmXs/3XIvLjDu/5pIh80d9AReS7IvKoiPxVRE6KyA4Rmeazf7CI/FtEKkVkr4jc1eG1j4vIwyJSC9wiIoUi8rLzXsudWB92jn9aRO7scP6tInKtnzHPEJHVIlItIodF5FciEu+zX0XkMyLylnPMr0VEnH0eEbnf+X2WAld1eO9bRKTUiX+viHzUZ9//E5Fdzr6dIjLF2b5IRPb4bL+2w/u95sRYIyLFIjLHZ3+aiPzR+RzlIvK/IuLx5/dhgkBV7WGPoD6AfcBcYAnwv862W4FVzvNM4ATwMSAWuMn5OcvZvwq41Xn+T+AbeG+MEoBLnO0zgENAjPPzAKAOyO0iJgVGdrHvu0AD8D68Jap7gTXOvhhgI/BtIB4YDpQC831e2wwscI5NBFYD9zvHXwLUAg87x38IWOtz7vOB40B8J3EVOHHHdrJvKnCB8/srAHYBX+jweZ8C0oF8oBJ4r7PvM0AxMNT5v1jZfh4g2Yl3jHPsIOA85/kNQDkwHRBgJDDMZ99g53dwI3AaGOTsuwVoAb4IxDn7a4BMZ/8TwO+cc+cA64BPu30d26PDNed2APaIvgfvJJPxzpdGNu9OJh8D1nV4zWrgFuf5Kt5JJn8Ffg8M6eQ8u4B5zvM7gGfOEpM6X5LVPg/fhLDc59gioN55PhM40OG97gb+7PPal3325TtfnEk+2x7mnWSSgDdxjnJ+vh/4TRcxF9BFMunk2C8AT3T4vJf4/PwosMh5vgL4jM++Kzokk2rgg0Bih3MsAz7fzWvgDeAa5/kteBO/+Oxf51wHuUCj77nw3lysdPs6tse7H1bNZVyjqtvx3h0v6rBrMLC/w7b9QF4nb/NVvHfB65zqp0/57HsIuNl5fjPwt3OENEVV030ey3z2HfF5XgckOO0fw4DBTlVRtYhUA1/H+yXY7mCHz1alqnWd7VfVBuBfwM0iEoP3i/NccZ9BREaLyFMicsSpXvs/vKUzXx0/U4pPjL4xv/1/oaqn8ZYcPgMcdqrlxjq7hwJ7uojn4yLyhs/vaHyHeMrVyRQ+5xyM9/cb55yr/bW/w1tCMSHEkolx23eA/8e7E8UhvF8ivvLxVqG8i6oeUdX/p6qDgU8DvxGRkc7uh4FrROR8YBywNMCxg/dLd2+HJNRfVd/nG6bP88NApogk+Wwb2uE9HwI+CswB6lR1dQ/iegBvVdUoVU3Fm+Ckm6893CGmfN+dqrpMVefhreIqBv7g7DoIjOj4ZiIyzDnmDrxVlenA9g7x5LW32fic85Dzno3AAJ/fb6qqntfNz2KCxJKJcZWq7sZ7J36Xz+ZngNEi8hERiRWRG/FWLT3V8fUicoOIDHF+PIH3i7vNee8yYD3eO/t/q2p9H3yEdcBJEfmaiCQ6jdfjRWR6Zwer6n5gA/BdEYkXkQuBD3Q4ZrXzGX5M90ol/UQkwecRA/THW213yik5fNaPz/QocJeIDBGRDHxKjiKSKyLXiLdbdyNwyokV4EG8nSqmitdIJ5Ek4/1/qXTe45N4Sya+cpxzxonIDXiT/zOqehh4HvixiKSKSIyIjBCRy/z4PCYILJmYUHAP3i8cAFT1OPB+4Mt4G5+/CrxfVY918trpwFoROQU8ibfOvtRn/0PABLr3pbxF3j3O5GfneoGqtjqxTgL2AsfwfqmmneVlHwUuxPvZ/hdvMm3scMxfnbgf7kbcp4B6n8ds4CvAR4CTeEsF/+rG+7T7A972jy3AJrwdJdrFAF/CW2qoAi7DSVSq+hjwA+AfznmX4m1E34k3Ma4Gjjqf67UO51wLjML7+/sBcL1zHQB8HG9nhZ14bxgex1sqMiFE3l1NaUxkEZFL8X4hD9MQvdjF2525WFW/47Pt48BtqnqJe5EFh4jcgrdDRcR/1khmJRMTsUQkDu/AyAdDKZGIyHSnqiZGRN4LXINPe47TnnI73l5qxoQFSyYmIonIOLxdWAcBP3M1mDMNxNu9+RTwC+CzqroZQETm421bOIq3usiYsGDVXMYYY3rNSibGGGN6LWonnRswYIAWFBS4HYYxxoSVjRs3HlPV7I7bozaZFBQUsGHDBrfDMMaYsCIiHWenAKyayxhjTABYMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK9FbW8uY0x4W7q5nMXLSjhUXc/g9EQWzh/DgsmdLXljgsGSiTEm7CzdXM7dS7ZR39wKQHl1PXcv2QZgCcUlVs1ljAk7i5eVvJ1I2tU3t7J4WYlLERkrmZg+Y9UQpq8cqu58nbOutpu+ZyUT0yfaqyHKq+tR3qmGWLr5jJV3jfHb4PREv7abvmfJxPQJq4YwfenG6UPO2BYj8JV5o12IxoAlE9NHrBrC9JVTjS0s2VROemIsg9ISECA9KY42hdrGFrfDi1rWZmL6xKD0BA5VN5yxXQR+s2o3H50xjLSkOBciM+Hu2//ZzoGqOh657UJmFGYCoKp84s/r+eFzxcwem8PQzCSXo4w+VjIxAaeqDM04s+463hPDiOxkfvRcCRfe9yLffXIHB47XuRChCVdPbC5jyaZy7poz6u1EAiAi3HvdBAS4e8k2bNG/4LNkYgLuFy/uZu3eE1xRlENeeiIC5KUn8qPrJ/LCly7n6bsu4b3nDeThNfu5/P6VfPbhjWzcf8LtsE2I23/8NN98YjvTCzK4Y9bIM/bnpSey6H3jeHX3MR7dcNCFCKNb1C7bO23aNLX1TALvsQ0HWfj4Vq6bksePbzgfEeny2CM1DTy0eh9/X7Of2oYWpuSn8//eM5wrzhvIf7ccsm7F5m1NLW3c8NvX2XvsNM9+4VLyuui11dam3PSHNew8VMsLX7qMgWkJQY408onIRlWddsZ2SyYmUF5+s5JP/WU9FwzP4k+3TCc+tnsF39ONLTy24SB/fG0vB6vqyUyO42RDC82t71ybiXEe7r1ugiWUKHXvs7v43UulPPDRKVw5YdBZj9137DTv/fnLXDxiAA9+YtpZb2iM/7pKJlbNZQJi56Fabv/7JkbmpPDAzVO6nUgAkvvFcsvFhaz6yiwe+OiUMxIJWLfiaPbym5X87qVSPjIz/5yJBKBgQDJfuWIMLxZX8OSWQ0GI0IAlExMAh6rr+eRf1tE/IZa/fHIG/RN61kvLEyNcOWEQLa2dl5atW3H0OXaqkS89uoVROSl866qibr/ukxcXMmloOt99cgfHTjX2YYSmnSUT0ys19c3c8ud11DW28udPTg9IHbWNbjbgbf/48qNbqG1o5pcfmUxivKfbr/XECIuvn8jpxla+8+SOPozStLNkYnqssaWVz/xtI3uPneZ3H5vK2IGpAXnfhfPHkBj37i+OxLgYFs4fE5D3N+HhT6/t5aU3K/nWVeN6dG2Nyu3PXXNG8vTWwzy3/XAfRGh8WTIxPdLWpnzt8a2sLj3Oj66fyEUjBwTsvRdMzuPe6ya8q8fOHbNHWeN7FNleXsMPnytmXlEuN18wrMfv8+nLRlA0KJVvLt1BdV1TACM0HVkyMT2y+PkSlr5xiIXzx3Dt5DPnSeqtBZPzeG3RbNZ9Yw7gTV4mOpxubOGuf24mK7kfP/rgxF71xorzxLD4holU1zVxz1M7Axil6ciSifHbw2v288CqPdw0I5/bLx/Rp+fK6Z/ApKHpLC+u6NPzmNDx3Sd3sPf4aX724UlkJMf3+v3OG5zGZy4bwZJN5awsseuor1gyMX5ZvvMo3/7PdmaPzeH715wXlD78c8flsOVgNRUnz5zry0SW/7xRzmMby7hz1kguGJ4VsPe9c85IRuak8PUl2zjZ0Byw9zXvsGRium3LwWru/Odmzhucxi9vmkysJziXz5xxuQCstNJJRDtwvI5vPrGdqcMyuGvOqIC+d79YD4uvn8jR2gbufbY4oO9tvGzWYHNWvqslikBaYhx/vGUayf2Cd+mMHdifvPRElu+q4Mbp+UE7r+l7vtdXrEeIEfj5hyf1yY3K5PwMPnVxIQ++upf3TxzERSMC12nEWMnEnEXH1RLbFOqaWnl99/GgxiEizBmXwytvVdLQYcEtE746Xl/NrUqbwoZ9fTfp55evGMOwrCQW/XsbdU229kkgWTIxXepstcTGljZXpjWZMy6XhuY2Xt9zLOjnNn2js+uruVX79PpKjPfwww9O5EBVHZ/920Yuvm8FhYue5uL7VtiS0r1kycR0KZRWS7xgeCbJ8R6W77J2k0jh1vV1wfAsLh6RyUtvHXu7VFReXc/dS7ZZQumFsEgmIvJeESkRkd0isugsx31QRFREzpjR0vgvlKY16Rfr4T2jslmxq8IWPooQbl5fpcfOXJTNJhPtnZBPJiLiAX4NXAkUATeJyBkzvolIf+DzwNrgRhi5vnLFaDp2/E2M87g2rcmccTkcqW1gx6FaV85vAusrV4ymY8/yYF1fR2o672Zuk4n2XMgnE2AGsFtVS1W1CXgEuKaT474P/BCwwQgBkp+VjALpSXFvr5bo5pois8bmIALLdx115fwmsLL7J6Dq7SEY7OsrlErdkSIcugbnAb5rcJYBM30PEJEpwFBVfVpEFnb1RiJyG3AbQH6+dTE9l8c3lpEY5+HVr80mJYhdgbsyIKUfk4em8+KuCr4wd7Tb4Zhe+uWKt8hN7cdLC2eRENf9GYEDYeH8Mdy9ZNu7OgC4WeqOBOFQMjkrEYkBfgJ8+VzHqurvVXWaqk7Lzs7u++DCWENzK09tOcSVEwaGRCJpN2dcLtvKazhaawXQcLZubxVr91Zx26Ujgp5I4J3JRAc5SyYkxdtKnr0VDsmkHBjq8/MQZ1u7/sB4YJWI7AMuAJ60RvjeWbbjCCcbW7h+auAnceyNuc5o+BetV1dY+9XK3WQlx3PTjKHnPriPLJicx+q753CDc43PLcp1LZZIEA7JZD0wSkQKRSQe+DDwZPtOVa1R1QGqWqCqBcAa4GpVtQXee+HxjWXkpSdyQWHg5kcKhNG5KQzJSORFazcJW1vLqnn5zUr+5z2FJMW7X+r98Iyh1DV5S+Km50I+mahqC3AHsAzYBTyqqjtE5B4Rudrd6CLToep6Xt19jA9OHUJMTN9P5OgPEWHuuFxe3X2M+iYbDR+OfrViN6kJsXysF+uUBNKU/AxG5aTwz/UHz32w6VLIJxMAVX1GVUer6ghV/YGz7duq+mQnx15upZLeeWJzOapw/ZTQquJqN2dcDo0tbby220bDh5viI7U8v/Mon7y4kP4JcW6HA3hvUG6cPpQtB6vZddi6nfdUWCQTEzyqyuMby5hZmEl+VpLb4XRqZmEWKf1iebHYqrrCza9X7iE53sMnLy5wO5R3uW7KEOI9MfzLSic9ZsnEvMumAyfYe+x0yDW8+4qPjeHS0QN4cVeFrcAYRvZUnuKprYf42IUFpCf1ftGrQMpMjmf++IEs2VRmk4n2UK+TiYjEiMjlIjLHGa1uwtjjG8tIivfwvgmD3A7lrOaOy6XiZCPbD9W4HYrppgdW7aFfbAy3vqfQ7VA69eHpQ6ltaOG57UfcDiUs9SiZiEiSiFwnIn8FKoAVwAtApYg8LCLXi0hKIAM1fa++qZWnthzmyvGDgrpeSU/MGpNDjHhXfjSh72BVHU9sLuemGfkMSOnndjidunB4FvmZSfxz3QG3QwlL3U4mIpIrIreKyFPAMeBxvGM6/gxcClwMPAhMAx7Fm1ieEZHbRGRg4EM3gRaqY0s6k5Ecz9RhGTaLcJj47Ut78Ihw26XD3Q6lSzEx3ob4tXurKK085XY4Ycefkskh4HdANt55sMY7PawWquqrqrpaVb+qqmPxTsj4PSAdeAAoE5HQ6LphuvT4xjKGZCQyszDT7VC6Zc64XHYerrXJ+ULckZoGHttQxvXThjAoLbTnvrph6hA8McK/NlhDvL/8SSa3A0NUdaaq3quqO7s6UFWLVfU+Vb0I79xanwWsVSuElVfX89qeY3xwSuiNLenK3HE5ALxoa8OHtN+/XEqrKp+9bITboZxTTmoCs8fm8O+NZTS1tLkdTljpdjJR1d+p6mF/T6CqR1T1D6pq/zMh7IlNZajCB0N0bElnRmSnMCwryUbDh7Bjpxr5x7r9LJiUx9DM0Oxq3tFNM4Zy7FQTK6zruV+sa7AJi7ElnRER5ozN5fU9x2097xD1x1f30tjSxu2zQr9U0u7SUdkMTE3gn+usqssfvUomIjJaRK4VkU87De3XisioQAVngmPj/hPsO17HDdPcm3Svp+aOy6GppY1X3rLR8KGmuq6Jv76+j6smDGJEdvh07oz1xPChaUN4+a1Kyq09rtv8TiYiMk5Efi4i5XjnynocbyP7b53nxSJySER+JiLjAhuu6QvtY0uuHB9+ne6mF2bSPyHWqrpC0F9e38fpplY+N2uk26H4rf3G6lEbEd9t/nQNHiEijwPbgf8BtuLtsfVx4H3AVc7ze4AtwK3AdhF5TERCtz9glKtvauWprYd534TQH1vSmThPDJeNzmZFcaWNhg8hpxpb+PNr+5hXlMu4Qaluh+O3oZlJXDJyAI9tOEirXVfd4s+3x05gG3ALsERVT5/tYBFJBq7Huy77TiChhzGaPrRsxxFOhcnYkq7MHZfLU1sPs6Wsmsn5GW6HY4CH1+ynpr6ZO8KwVNLuphn53P73Tbz8ViWzxuS4HU7I86ea6wZnlcK/nSuRAKjqaVV9SFWnADf2PETTlx7beJChmYnMKAiPsSWduXxMNp4YsQWzQkR9UysPvlLKpaOzOX9outvh9NjccblkJcfziI2I7xZ/ugafMd27H6/9T09fa/pO2Yk6Xt9zPKzGlnQmPal9NLy1m4SCR9Yf4NipJu6cHb6lEvBOKPrBqUN4cVcFFSdtmehz6UkDfIqIXCAi80XkIpsqJXw9sak87MaWdGXuuByKj5yk7ESd26FEtcaWVn73UikzCzOZHsal3XY3Th9KS5vy743l5z44yvnTAN9PRB4AKoHXgGeAV4ByESkXkb+KyFUiEr63uFFEVXl8UxkXDM8Mm8FkZzPHWRt+hY2Gd9W/N5ZzpLaBO2dHxgiBEdkpzCjI5F/rD6BqDfFn40/J5H7g08Aq4OvAV5xtgrdx/Wa8a7NvF5E5gQ3TBNqG/SfYf7yO66eG39iSzozITqFwQDIv2CzCrmlubeM3q3YzaWg6F4/McjucgPnwjKHsO17HmtIqt0MJaf4kkxuBP6nqlar6Q1X9KfAjZ98NwHBgEZAILBORLwY2VBNIj28I37ElXZkzNoe1pVWcarTR8G548o1DlJ2o587ZI4mkCor3TRhE/4RYHllvDfFn408ySQRWd7VTVfep6mJgDPBT4H4RmdfL+EwfqGtq4elt4Tu2pCtzxuXS1NrGK29Wuh1KVFm6uZyL7nuRLz+2hdgYoba+2e2QAiohzsO1k/N4dvsRquua3A4nZPmTTDYAs851kKo2q+pC4D/AN3oamOk77WNLbgjjsSWdmVaQQVpinK1xEkRLN5dz95JtHKr29nZqaVO+/sR2lm6OrAbrD0/Pp6mljSci7HMFkj/J5D7gI35UXz0DTPU/JNPXHt9YRn5mUkT0tvEV54nh8jHZrCypsFHLQbJ4WQn1HdZMr29uZfGyEpci6htFg1M5f0gaj6w7aA3xXfBnnMkyYCHe6qt1InIz0P8sL7kMsH6aISZSxpZ0Zc64XKpON/HGwRNuhxIVulqYLBIXLLtxej4lR0/yxsFqt0MJSX6NM1HVHwPzgWTgr8CbgAK3i8jXROR2EVkkIiuBjwB/D3TApneWOGNLrpuS53YofeKy0dnExohVdQXJ4PTOV07sans4u3rSYJLiPTxiU9N3yu9Bi6q6HBiPd2LHfwAHgeuAe4FfAf8HTAd+CXwtYJGaXmtft+TC4VkRMbakM2mJcUwvyLRZhINk4fwxxHneXcJNjPOwcP4YlyLqOyn9YvnAxMH8d+sh6zHYiR6tZ6Jez6rqLapagHdd+JnAHLyJJFtVv6CqkdWtI8yt33eCA1V1YT2pY3fMGZfDm0dPcbDKaln72oLJeUwakk6MeAec5aUncu91E1gwOTJLvjfOGEpdUyv/3XLI7VBCTkBWWlTV46q6XlVXqupGVY28CtMI8PjGgyTHe7hyQuSMLenMXGc0vM3VFRwn6puZNSaHvfddxWuLZkdsIgGYPDSdMbn9bfLHTvgznUqPR7WLyNyevtb03tLN5Vx474s8uqEMBZ7fEdlfsgUDksnpH899zxZTuOhpLr5vRcR1VQ0VJxua2VN5iolD0t0OJShEhA/PGMqWshp2Hqp1O5yQ4k/J5DkRWSEi7xcRz7kOFpE4Zxnfl/B2EzYuaB8HcLjGOw6grqmVu5dsi+gv16Wby6k63UxjSxsKlFfXR/xndsu28hpU4fyhaW6HEjTXTs7DI3DDb1+3mxUf/iSTyUAL3vm3DonI30Xk805yuUhELhaRD4jIl0TkUeAI3mV864BJAY/cdEu0jAPwtXhZCS0dxplE+md2y9ayGoCoKZkArCqpBITTTa12s+Kj23NpqOp24AoRuRC4HbgGuAlv12BfAtQCS4AHVHV9gGI1PRBN4wDaReNndsuWg9XkZyaRmRzvdihBs3hZCa3a+c1KJLcXnYvfEzOp6mpgtVPVNRUowtubS/FOT78d2KyqbYEM1PTM4PREyjv5Eo3EcQDtovEzu2VrWQ2T89PdDiOo7Galcz3uzaWqraq6TlX/oqqLVfV+Z5nejZZIQsfC+WPwxETHOIB2C+ePITHu3c16kf6Z3VB5spHy6nomhfHSvD0RTQM1/eFXMhGRfJ/HEBE523QqJgQsmJzHoNR+xHtiomIcAHg/873XTWBAirfqJTMpLuI/sxu2llUD0dVeAnaz0hV/q7n20aGNREQqgWXAT1R1S4DiMgFSU99MeU0Dd80exRfnjXY7nKBZMDmP900YxMTvLePqSXmWSPrAlrIaYgTG56W6HUpQtV9LP3hmF5UnG8lIiuM7Hzgv6q8xf6u5XvZ5vAJsxTvZ48eA9SLy+cCGZ3prw74qVGHm8MiaIbg74mNjmDosg7V7bYW8vrDlYDWjc/uTFB85a+J014LJeaxeNJukeA9Xnz846hMJ+D/R4+WqOst5XK6qk4E04ENAGfATZzbhgBKR94pIiYjsFpFFnez/jIhsE5E3RORVESkKdAzhau3eKuI9MUzJz3A7FFfMLMyi+EgtNXU2s08gqSpby6qZOCR6xpd0FOuJYXJ+OhsP2AzVEIDpVFS1RVUfxzsn1x7gpyIS1+vIHE6vsV8DV+LtOXZTJ8niH6o6QVUn4V1K+CeBOn+4W1N6nElD00mIO+c404g0szATVVi3z0ongXSwqp4Tdc2cH2WN7x1Nzc9g1+GTnLaJHwMzNxd45+cCvgNkAtMC9b7ADGC3qpaqahPwCN4xLr7n9p3XIJkzx75EpZMNzWwvr4nKKq525w9NJz42hrWlx90OJaJscRrfz4+yxveOpgzLoLVN2WJrnPjXAC8ibXTvi/pVEQHvBMO9rVDNwzvNfbsyvDMUd4ztc8CXgHhgdmdvJCK3AbcB5Ofn9zKs0Ldh/wnaFC4YnuV2KK5JiPMwaWi6tZsE2JaD1cTHxjBmYHR36JzsVB9v3H+Ci0YOcDkad/n7Rf8MZ08mWXi/6NfjHcAYNKr6a+DXIvIR4JvAJzo55vfA7wGmTZsW8aWXNaXHifNI1LaXtLugMJNfrdxNbUMzqQkBq4GNalvLajhvcCpxnoBVboSltMQ4RuemWLsJfiYTVX3/2fY768PPBG5T1a29CcxHOTDU5+chzrauPAI8EKBzh7W1pVVMHJJOYnx0tpe0mzk8i1+s2M3GfSeYNTbH7XDCXktrG9vKa7hx+tBzHxwFpg7L4Omth2lr04hcCru7AnZbISLnAd8CSgKYSMBbyhklIoUiEg98GO9kk77nHuXz41XAWwE8f1g63djCtvIaLoji9pJ2U/IziPMIa/Zau0kg7K48RX1za1TNFHw2U4dlUtvQwu7KU26H4qpeJxNnJPzdwGogEadNIlBUtQW4A+/AyF3Ao6q6Q0TuEZGrncPuEJEdIvIG3naTM6q4os2G/SdobVNmFkZve0m7xHgPE4eks87aTQJi60HvTMHR3vjebuqwd9pNopm/DfClvj8CqUC687wGuElVXw1YdA5VfYYOa6Ko6rd9nttgyQ7Wlh7HEyNvX+jRbmZhJr9/uZS6ppaoHGQXSG+UVdM/IZaCrGS3QwkJBVneWZM37j/BTTMiv2NPV/wtmRT4PPKd128A7gHGqurTAYzN9MLavVVMHJJGcj/74gRvu0lLm0b93WMgtA9WjOb2AV8i3k4um6L82vJ3BHyMz8OjqhmqOlNVv6uqkb0WbBipa2phy8Fqq+LyMXVYBp4YYW2pVXX1RkNzK8WHT1oVVwdTh2VQeuw0Vaeb3A7FNdHdry9CbdpfTUubWuO7j5R+sYwfnMpaa4TvlZ2Ha2lp06ibKfhcphV4q5OjuXRiySQCrXHaS6YVWDLxNXN4FlsO1tDQYRlj033tI72jbQ2Tc5mQl0acR9gQxcmk2xXqIrIiAOdTVZ0TgPcxZ7F273HGD04lxdpL3qW9EX7TgRNcNCK6Ryv31NayGnL692NgWoLboYSUhDgP5w1Os5KJH8dKLx9WEupj9U2tbDlYE9VTqHRlWkEmIli7SS9sOVgd9ZM7dmXqsAy2lFXT1BKdC812+9ZVVS/vwzhMgGw+cIKm1raontyxK2mJcRQNSrXxJj1UU99M6bHTXDfF1u7ozNRhGfzx1b3sPFwbldWAVlKIMGv2VhEjWHtJF2YWZrHpwAkaW6zdxF/bypzBilH4Rdkd0T54MeDJRETsr9RFa0uPc97gNJvQsAszh2fS2NLGVueL0XRf+7TzE/PSXY0jVOWmJjAkI5GN+6Oz5NsXJRMbyeSShuZWNh+sZmahlUq6MsMpsdn6Jv7bWlZN4YBk0pLsRqUrU4dlsHH/CVQjflLyM5wzmYjI6yIyyY/3jL7fYoh446C38c8a37uWkRzP2IH9bX2THthysCaql+ntjqnDMjha20h5db3boQRdd0omFwDLu0ooInJNZ9tN8K0trUIEplvJ5KxmFmaycf8Jmlujs9dNTxytbeBIbYMNVjyHKfnR227SnWRyGu/6IMtF5PxO9v8tsCGZnlpTepxxA1NJS7RqiLOZUZhFXVMr28qt3aS73hmsaCWTsxk7sD9J8Z6oHG/SnWSiqvot4LfAi50kFGsjCQGNLa1sOnDCqri6YUZhe7uJVXV119ayGjwxQtEgSyZnE+uJYXJ+elSOhO92A7yqfhP4Hd4SykTfXQGPyvhta1kNjS02vqQ7svv3Y0R2ss3T5YctZdWMye0f9at2dsfU/Ax2Ha7ldGOL26EElb+zBn8D7xrqL4rIhL4JyfTEmj3eL8YZNr6kW2YOz2LDPu8CYubsVNUZ+W6lku6YMiyDNn2najBadCeZvKsay0kofwBWdCihGBet3VvF2IH9yUiOdzuUsDCzMJNTjS3sPFTrdighb9/xOmobWmza+W6aHKWN8N1JJos6blDVr+NNKC8C/QIdlPFPU0sbG/dbe4k/2n9XVtV1blvbBytaMumWtMQ4RuemsPGAJZN3UdVfd7H968CDgHUdctm28mrqm1tt/RI/5KYmUJCVxBprhD+nNw5WkxAXw+jcFLdDCRtTh2Wyaf8J2qKoGrVXI+BV9W6gs+7CJojavxBn2MqKfplZmMX6fVVR9QffE1vLahg/OI1Yj03l111Th2VQ29DC7spTbocSNL2+OlR1WyACMT23dm8Vo3NTyLT2Er/MHJ5JTX0zxUdOuh1KyGpubWPHoRqb3NFP0Tjpo91qhLnm1jY27Kuy9pIeeHu8ibWbdOnNoydpaG6zaVT8VJCVRGZyvCWTsxGRS0XEOpuHiO3lNdQ1tTLTqrj8NiQjibz0RBu8eBbtsytbTy7/iAhT8jOiaiR8T0omK4Fu3aaIyPUi8jMR+ZSIxHbY93QPzm06aJ+wcIbNx9UjM4dnsm5fVVTO8todWw5Wk5YYx7CsJLdDCTtTh2VQeuw0Vaeb3A4lKHqSTLo1fYqI3AH8CkgCFgKviYjvN957enBu08Ga0uOMzEkhu7/10O6JCwqzqDrdxO6K6Gko9ceWMu9MwSI2a5K/phVEV7tJX7aZ3AHMV9XbgAnAG3gHOrYnFLs6e6mltY0N+07Y+iW90D79zBqbkv4M9U2tvHn0ZFQuQRsIE/LSiPOIJZMAGKyqWwBUtUVVPw2sAFaKSBY2p1ev7Txcy6nGFmt874X8zCQGpibYYlmd2HGohtY2tcGKPZQQ5+G8wWlR027Sl8mkUkQKfTeo6pfwtrmsBGI7fZXptjXOF6BN7thzIsLM4Zms3WvtJh294cwtdb715OqxqcMy2FLmXbQu0vUkmXT3L24FcMsZL1b9ArAKSOjBuY2PtaVVDB+QTE5/+1X2xszCLCpPNrL32Gm3QwkpW8tqGJSWQE6qXV89NXVYBo0tbew8HPlzwPVZAzzwOeCHne1Q1buAgh6c2zha25R1e6uYaVVcvdZesrOlfN9tS1m1dQnupWgavNiTZPIvoPFcB6lqk6rWnWX/gR6c2zh2Ha7lZGOLzccVAMMHJDMgpZ+1m/iormti//E6Jtq0872Sm5rAkIxENu6P/BsVv5OJqt6kqlYf4LK320tssGKviQgzC63dxJcNVgycqcMy2Lj/RMRfWzadSphaU1pFQVYSA9OsPjsQZg7P5HBNA2Un6t0OJSS0L+w0wRrfe23qsAyO1jZSXh3Z15YlkzDU1qas31dlpZIAav9drrGqLsA7WHF4djKpCbbCRG9NiZLFsiyZhKHiIyepqW+2LsEBNConhYykOGuEx1mmt6yaSVbFFRBjB/YnKd4T8eNNepVMRCReREoDFYzpnnfGl1jJJFBiYoQZhZk2gzBwpLaBypONNlNwgMR6Ypicn84GSyZnJVgX36Bbu/c4QzMTyUtPdDuUiDKzMIuDVfUcivC67XNpby+xNUwCZ2p+BrsO13K6scXtUPrMOZOJiJR29QBKCMK0KCLyXhEpEZHdInLGmvQi8iUR2SkiW0XkRREZ1tcxuaXNGV9ygbWXBNw7402iu3SypayG2Bhh3KBUt0OJGFOGZdCm7yTqSNSdKU2yga8DnY0LiQceCWhEHThrp/wamAeUAetF5ElV3elz2GZgmqrWichngR8BN/ZlXG55s+IkJ+qarYqrD4wdmEpqQixrS6u4dvIQt8NxzZaD1YwblEpCnC1bFCiTfRrhLxo5wOVo+kZ3kskbwFFV/U/HHSLSj76f/XcGsFtVS51zPgJcA7ydTFR1pc/xa4Cb+zgm17Qv5GQzBQee5+12k+hthG9rU7aV1XD1pMFuhxJR0hLjGJ2bwsYDkdtu0p02k18AXZX7m4FPBi6cTuUBB31+LnO2deV/gGc72yEit4nIBhHZUFlZGcAQg2ft3uPkpScyNNMWK+oLMwoz2XvsNBW1DW6H4orSY6c52dhi7SV9YOqwTDbtP0FbW2QOXjxnMlHVx1T1xS72tanqQx02u7ZOiYjcDEwDFne2X1V/r6rTVHVadnZ2cIMLAFVlbWmVdQnuQ+3jTaK1dLK1rBqwke99YeqwDGobWthdGZkLsQV8nImqBvo9y4GhPj8Pcba9i4jMBb4BXK2q55w7LBztrjjF8dNN1vjeh84bnEpKv9iobYTfWlZDUryHkTkpbocScSJ90sdwGLS4HhglIoUiEg98GHjS9wARmQz8Dm8iqXAhxqBoXw3QFsPqO7GeGKYOy3i7bSravHGwmvF5aXhibCHUQCvISiIzOT5ik0m3F6gSkRUBOJ+q6hw/X9DirCe/DPAAf1LVHSJyD7BBVZ/EW62VAjzmrFV9QFWvDkC8IWPp5nL+72lvn4Ob/rCahfPHsmDy2ZqOTE/1T/DwVsUpChc9zeD0RBbOHxMVv+smZ92NT1wYsT3rXSUiTMnPiNiR8P6sdhhD78eU9Oh2R1WfAZ7psO3bPs/n9jKukLZ0czl3L9lKfbN3tbby6gbuXrINICq+5IJp6eZyXtjpLdwqUF5dHzW/65IjJ2lqabPG9z40dVgGy3cdpep0E5nJ8W6HE1DdTiaqenkfxmHOYvGykrcTSbv65lYWLyuJ+C+4YFu8rITGluj7XS/dXM53ntwBwPef2klLq0b053XLtIJ32k3mFeW6HE1ghUObSdTranqPaJ/2oy9E4+/aW/LdRk19MwBHaxu5e8k2lm4+o5+L6aUJeWnEeSQi200smYSBwV3MwdXVdtNz0fi79pZ8W9+1rb00ZgIrIc7DeYPTIrLdpLezBo8WkWtF5NPOgMBrRWRUoIIzXnfOHnHGtsQ4Dwvnj3Ehmsi2cP4YEjtMIxLpv+toLI25aeqwDLaUVdPUoTo13PnTAA+AiIwDPgNcDwxs3+z8q84xR4FHgd+p6q4AxBnV0hK9DXUDUuI5fqopqnoYBVv773TxshLKq+uJ8wj3Xjchon/Xg9MTO10FMJJLY25qbWujsaWNMd98NqL+lv3pGjwC+CFwLVAPvIJ3bMcevNOtCJAJjAQuAG4F7hSRJcDX2ufWMv5bUVxBWmIca+6eQ6zHaib72oLJeSyYnMcvX3yLnyx/k4tGRva4noXzx/DlR7fQ6rNGeaSXxtyydHM5j6zzzg4Vab0F/flm2ol37ZJbgFxVvVJV71HVv6vqc6r6rPP8e6p6JZALfAoYgc+kjMY/bW3KypJKLh2dbYkkyOYW5aIKK4sjdhwsAB84fzD9YoXEOA8C5KUnRnxpzC2Ll5XQ0EVvwXDnTzXXDc4AwW5R1dPAQ8BDInKN35EZALYfquHYqUZmjw2/ucTC3diB/clLT+SFnRXcOD3f7XD6zBsHq6lrbuMXN03m6vNttuC+FMntU92+1fUnkXTy2jOmrzfds6K4AhG4bHSO26FEHRFh7rgcXt1dSUOH3k6RZGVxBZ4Y4bJRdsPS1yK5t6Df9SYikiIiF4jIfBG5SEQGnvtVpqdWFlcweWh6xI2WDRdzi3JpaG7jtd3H3A6lz6wormBqfgZpSXFuhxLxIrm3YLeTiYj0E5EHgErgNbzTm7wClItIuYj8VUSuEmdyLNN7lScb2VJWw+yxVipxy8zCLFL6xbJ811G3Q+kTR2oa2Hm4lll2jQXFgsl53HvdBPKckognRvi/a8dHRPuUPyWT+4FPA6vwLuP7FWebAAl4Vzd8EtguIn5N5mg6t6rE2/Brf+juiY+N4bIx2SzfVRGRixqtdK4xu2EJngWT83ht0WzuvW4CrW3K2EGpbocUEP4kkxvxzth7par+UFV/inetdYAbgOHAIiARWCYiXwxsqNFnZUkFA1MTKIqQiy1czR2XQ+XJRraW17gdSsCtKK4gLz2R0bm2fkmwzRmXgwi8sDMySr3+JJNEYHVXO1V1n6ouBsYAPwXuF5F5vYwvajW3tvHKm8eYNTYbqzl016wxOXhihBcjrKqrsaWV13bbNeaWnP4JTBqaHpXJZAMw61wHqWqzqi4E/oN35UPTA+v3VXGysYVZY6z6wW3pSfFMG5YRMX/07daWVlHX1GpVXC6aV5TLtvIaDtdEUddg4D7gI35UXz0DTPU/JAPeXlzxnhguHjnA7VAM3j/64iMnOVhV53YoAbOiuIJ+sTFcONyuMbdcUeTtDLs8Am5U/BlnsgxYiLf6ap2I3Az0P8tLLgMi5y8vyFYUVzBzeCbJ/fyePs30gTnjvGtPREpVl6qysqSCi0ZkkRjvOfcLTJ8YmZPC8AHJPB9NyQRAVX8MzAeSgb8Cb+KdYuZ2EfmaiNwuIotEZCXwEeDvgQ44Ghw4XseeytNW/RBCCgckMyI7meW7ImNqldJjp9l/vM6usRAwryiXNaXHqW1odjuUXvF70KKqLgfGA1cB/wAOAtcB9wK/Av4PmA78EvhawCKNIiuKvXcp9oceWuYW5bJ2b/j/0cM7841Zt3P3zSvKpblVWVVS6XYovdKjmQPV61lVvUVVC4BsYCYwB28iyVbVL6hq+P/VuWBFSSXDs5MZlpXsdijGx7xx3j/6l98M7z968Fajjs5NYUhGktuhRL3J+RlkJceHfQePgExDq6rHVXW9qq5U1Y2qGv5dE1xyurGFNXuOM9t6cYWcyfkZZCbHh31j6cmGZtbtrbJSSYjwxAhzx+WyqrgirBfM8mc6lR6PaheRuT19bbR5bfcxmlrbrIorBHlihFljclhZUklLa/j+0b/61jFa2tRuWELIvKJcTja2sKb0uNuh9Jg/JZPnRGSFiLxfRM7Z/UNE4pxlfF/C203YdMPKkgpS+sUyrSDT7VBMJ+YV5VBT38yGMF7De0VxBakJsUwdluF2KMZxyagBJMZ5wrqqy59kMhlowTv/1iER+buIfN5JLheJyMUi8gER+ZKIPAocAR7H2z14UsAjj0CqysriSt4zagDxsbYQVih6z6hs4j0xYVvVZYuthaaEOA/vGTWA5buOohqec8B1exCDqm4HrhCRC4HbgWuAm3DWffchQC2wBHhAVdcHKNaIt/NwLUdqG6wuO4Ql94vlwhFZvLDrKN+4alzYTUPyzmJrdo2FmnlFuTy/8yjby2uZMCTN7XD85veIOFVdDax2qrqmAkV4e3Mp3unptwObVTV8K5Vd0t5d8/IxtkhRKJtblMu3lm5nT+UpRuacbdxu6HlnsTW7xkLNnHG5xAg8v/NIWCaTHpdzVbVVVdep6l9UdbGq3q+qDzm9uSyR9MCK4gomDkkjp3+C26GYs5g7zntX/8LO8BvAuLK4gklD08lK6ed2KKaDzOR4phVkhm27iV/JRETyfR5DRCS8bstCWNXpJjYfrLaJHcPAoLRExuelht3UKm8vtmbXWMi6IozngPO3ZLIP2Os89gPVInJERB4SkfMDHVw0eenNClRt1Hu4mDM2l40HTnD8VKPboXTbSltsLeTNK/LOAReOc3X5m0xe9nm8AmzFO9njx4D1IvL5wIYXPVYUVzIgpR8T8sKvrjQazSvKRdVbNRkuVhZXkJvaj/MG22JroWpYVjKjc1N4YecRt0Pxm78TPV6uqrOcx+WqOhlIAz4ElAE/cWYTNn5oaW3jpZIKLh+TTUxMePUOilbnDU5lYGpC2KwN39TSxitvHWPWmJyw64EWba4oGsi6vVWcON3kdih+6XVHc1VtUdXH8c7JtQf4qYjE9TqyKLLpQDW1DS1WxRVGRIS5RTm88tYxGppb3Q7nnDbsq+JUY4tVcYWBeUW5tIVZqRcCNDcXeOfnAr4DZALTAvW+0WBFcQWxMcIlo2yRonAyZ1wudU2trA6DKTBWOIutXWKLrYW8CXlp5Kb2C7teXf725moTkdauHsDDzqGvOttaAh9y5FlZXMGMwkxSE6xAF04uHJ5FUrwnLEbDryixxdbCRYwz8ePLb1WGRam3nb8lk2fO8VjrHLfe+fnZwIQZucqr6yk5etKquMJQQpyHS0dl8+KuipCeAmP/8dOUVp62budhZF6Rt9T7+p5jbofSbX7dpqjq+8+231kffiZwm6pu7U1g0WKFLVIU1uYW5fLcjiPsOFTL+BDtidd+jdkNS/i4cEQWKf1ieX7HUWaPzXU7nG4JWJuJiJwHfAsoCXQiEZH3ikiJiOwWkUWd7L9URDaJSIuIXB/Ic/e1lcUVDMtKYvgAWwgrHM0ak02MENL12yuKKxg+IJkCu8bCRr9YD5eNyWb5rgra2kK31Our18nEGQl/N7AaSARu63VU735/D/Br4Eq884DdJCJFHQ47ANyCdxnhsNHQ7C3GWnfN8JWV0o8p+Rkh20X4dGMLa0urrFQShq4oyuXYqUY2H6x2O5Ru8bcBvtTnsVdEjuMdCf8DoBW4XlVfDXCMM4Ddqlqqqk3AI3hnLH6bqu5zSkNhNSfY6j3HaWi2hbDC3dyiXHYcquVQdegtMGqLrYWvy8fkEBsjIV3q9eVvyaTA55HvvH4DcA8wVlWfDmBs7fKAgz4/lznb/CYit4nIBhHZUFnp/jreK4orSIr3MHO4LYQVzuaO89Zph+JcXbbYWvhKS4xj5vDMsBkN7+8I+Bifh0dVM1R1pqp+V1VD7y+pA1X9vapOU9Vp2dnuTsGtqqworuDikQPoF3vOhStNCBuRnUzhgGSW7wqtQWa22Fr4u6JoIHsqT7On8pTboZxTOFxh5cBQn5+HONvC2lsVpyivrrfqhwggIswZm8PqPcc51Rg6Q6tssbXwN9eZ+DEcqrq6nUxE5HYRGeLvCURkkIh8WkR6mrjWA6NEpFBE4oEP4106OKy93SXY+v5HhLlFuTS1tvHKm+5Xn7azxdbCX156IucNTo2sZAL8HNjvtDl8U0QmdnWgiIwXkW+IyFq8bRy/AnpUl6OqLcAdwDJgF/Coqu4QkXtE5GrnfNNFpAy4AfidiOzoybmCaUVxBUWDUhmYZgthRYJpwzJIS4zjhRBqN7HF1iLDvKJcNh04QeXJ0F7uwJ9kkgt8Cm833EXAZqdH189EZLaIXCYiPxGRPcAW4OvAYeBWYJCqNvc0SFV9RlVHq+oIVf2Bs+3bqvqk83y9qg5R1WRVzVLV83p6rmCoqWtm4/4TVsUVQWI9Mcwem8PK4gpaQ2BcgC22FjneWe4gdG5UOtPtZKKqVc6yvNcBA4AFwAq81U7Lnec3Ay8B1wEDVHWBqv5ZVcNnToAgeOmtSlrb1OqyI8yccTmcqGtm04ETbodii61FkKJBqeSlJ/L8jtBOJj2a9U1VG4D/Av8V72i7C/Emptdt/fdzW1lcQWZyPJOGprsdigmgS0dnE+cRlu88ynSXu+LaYmuRQ0SYV5TLP9cdoK6phaT40JysMxDrmaiqvq6qr1oiObfWNmVVSQWXjc7GYwthRZTUhDguGJ7leruJLbYWea4oyqWxpY2X3wzdSp5w6BocUd44WM2Jumar4opQ2f37UVp5msJFT3PxfStYujn4vdhtsbXIM70wk9SE2JDu1WXJJMhWFlfgiREuG2XdNSPN0s3lPL31MACKd3mBu5dsC3pCscXWIk+c08FjRfFRWlpDswLIkkmQLN1czsX3reBXK3fjEWFlSWiNlja9t3hZCY0t7/5Dr29uZfGykqDGsbK4gukFtthapLnivIGcqGtmw373O3h0xpJJECzdXM7dS7ZR7kwE2NTa5sodq+lbXU30GMwJIG2xtch16ehs4j0xIVvVZckkCBYvK6G+w/Kbbtyxmr41OD3Rr+2BtnRzOe/7+SsA/OGVUrtZiTAp/WK5aGQWL+w8GpIre1oyCYJQuGM1fW/h/DEkxr17ogdPjLBw/pg+P3d76bem3js2uOJko5V+I1B2/34cqKpj+N3PuNbBoyuWTIJgUBdTpgTrjtUEx4LJedx73QTy0hMRICneQ2ubMjq3f5+f20q/kW/p5nL++8YhwN0OHl2xZBIEhQOSztiWGOcJyh2rCa4Fk/N4bdFs9t53FasXzSErOZ5v/Wd7ny+9aqXfyLd4WQkNIdDBoyuWTPrY8p1HeW1PFbPGZL99x5qXnsi9101gweQerfFlwkRaUhyLrhzLxv0neHxjWZ+eKyslvtPtVvqNHKF+wxCa4/IjRMXJBr76760UDUrltx+baotgRaEPThnCoxsOcu+zu5hXlEtGcudf+r1RdbqJppY2BG/1Rzsr/UaWwemJb/cI7bg9FFjJpI+0tSlfeWwrpxtb+MVNkyyRRKmYGOH7C8ZT29DCj/qgOkJV+cpjW2hobuNLV4y20m8E66yDB8CHpvu9zFSfsJJJH3lo9T5efrOS7y8Yz8icvm+ANaFr7MBUPnlRAX98bS8fmjaEyfkZAXvvP766lxXFFXzv6vP4xEUF3Dl7VMDe24SW9huDxctKOFRdT25qAk2trfz19f0smJTHsKxkV+OTUOyvHAzTpk3TDRs29Ml7Fx+p5epfvcZ7Rg7gwU9MwzuxsolmpxpbmPPjVWT378d/PndJQCb5fONgNdc/8DpzxuXw25un2nUWhfZUnuKDD7xORlI8//7sRWT2QTVqRyKyUVWnddxu1VwB1tDcyuf/+QapCXH88PqJ9gduAO+As2+9v4jt5bX8fe3+Xr9fTX0zd/xjE7mpCfzog+fbdRalRmSn8ODHp1FeXc+tD62noUP38GCyZBJgP3yumJKjJ7n/hokMSOnndjgmhFw1YRCXjBzA4mUlvVqCVVX52uNbOVLTwC8/Mpm0JJuDK5pNK8jk5zdOYvPBaj7/yGbXVvq0ZBJAq0oq+PNr+7jlogIut+VSTQciwj3XnEdjcxv3PrOrx+/ztzX7eW7HEb763jFMCWD7iwlfV04YxDevKmLZjqN8/6mdrky3YskkQI6fauQrj21lTG5/Fl051u1wTIganp3CbZcOZ8nmctaUHvf79dvLa/jfp3Yxa0w2t14yvA8iNOHqfy4p5FMXF/KX1/fxx1f3Bv38lkwCQFX52r+3UtvQzM9vmkRCJ933jGn3uVkjGZKRyLeWbqfZj7UpTjW2cMc/NpGZHM+PPzTJVlE0Z/jmVeO4cvxA/vfpXW+vrRMslkwC4O9rD7B8VwWL3juWsQNT3Q7HhLjEeA/f/cB5vFVxij918w5SVfn6km0cqKrjFzdNDkqvHRN+YmKEn944ianDMvjio2+wfl9V8M4dtDNFqN0VJ/nfp3dy6ehsbrmowO1wTJiYW5TL3HG5/Gz5W92aDuPRDQd5csshvjRvNDMKM4MQoQlXCXEeHvz4NIakJ3LrQxvYXXEqKOe1ZNILjS2t3PXPN0iKj+X+6ydatYPxy3c+UISifP+pnWc9ruTISb7z5A4uGTmAz14+MkjRmXCWkRzPXz45gziPcMuf11FxsqHPz2nJpBd+8vyb7Dxcyw8/OJGc1M6nmTemK0Mzk7hz9iie3X6EVV0s41zX5G0nSekXx09uPD8ggx1NdMjPSuJPt0zn+Kkm/ucvGzjd2NKn57Nk0kOv7z7G718p5aMz85lXlOt2OCZM3fqeQoYPSOY7T+7odMDZd5/cwe7KU/zsxknk9LcbFuOfiUPS+dVHJrPjUA13/GMTLX50+PCXzc3lh6Wby9+eF0cEBqTE882ritwOy4SxfrEe7rlmPDf/cS2/fWkPX5g7+u19T2wu49ENZdw5eySXjBrgYpQmnM0Zl8v3F4znG09sZ+L3nqe+qZXB6YksnD8moBOBWsmkm9qXRS2vrkeBNoXa+haW7TjidmgmzF0yagAfOH8wv1m1h/3HTwNQWnmKbzyxnRkFmXx+jk3eaHonOT6W2Bihrqm1z1ZptGTSTZ0ti9rY0hYyq5yZ8PbNq8Yhqlzx05cpXPQ0V/z0ZVDl5zdNItZjf6amdxYvK6GlwzQrgV6l0a7Sbgr1Vc5MeFu95zhteG9QFGhpU1raYG1p8MYJmMgVjO8vSybd1NVqZqGyypkJb4uXldDc+u47x6ZWK/mawAjG95clk27qbJUzWxbVBIqVfE1fCsb3l/Xm6qaOq5z1RW8IE71CfX1vE96C8f1lKy0aEwLaewv6dvJIjPPYOu4m5HS10qKVTIwJAVbyNeHOkokxIWLB5DxLHiZsWQO8McaYXguLZCIi7xWREhHZLSKLOtnfT0T+5exfKyIFLoRpjDFRK+STiYh4gF8DVwJFwE0i0nFCrP8BTqjqSOCnwA+DG6UxxkS3kE8mwAxgt6qWqmoT8AhwTYdjrgEecp4/DswREZur2xhjgiQckkkecNDn5zJnW6fHqGoLUANkdXwjEblNRDaIyIbKyso+CtcYY6JPVPXmUtXfA78HEJFKEdnfw7caABwLWGDuCPfPYPG7L9w/Q7jHD+58hmGdbQyHZFIODPX5eYizrbNjykQkFkgDjp/tTVU1u6cBiciGzgbthJNw/wwWv/vC/TOEe/wQWp8hHKq51gOjRKRQROKBDwNPdjjmSeATzvPrgRUarUP7jTHGBSFfMlHVFhG5A1gGeIA/qeoOEbkH2KCqTwJ/BP4mIruBKrwJxxhjTJCEfDIBUNVngGc6bPu2z/MG4IYghvT7IJ6rr4T7Z7D43RfunyHc44cQ+gxRO9GjMcaYwAmHNhNjjDEhzpKJMcaYXrNk4qdzzRMWykTkTyJSISLb3Y6lp0RkqIisFJGdIrJDRD7vdkz+EJEEEVknIluc+L/ndkw9ISIeEdksIk+5HUtPiMg+EdkmIm+ISNgtbCQi6SLyuIgUi8guEbnQ9ZiszaT7nHnC3gTm4R2Jvx64SVV3uhpYN4nIpcAp4K+qOt7teHpCRAYBg1R1k4j0BzYCC8Lo/0CAZFU9JSJxwKvA51V1jcuh+UVEvgRMA1JV9f1ux+MvEdkHTFPVsBy0KCIPAa+o6oPOkIkkVa12MyYrmfinO/OEhSxVfRlv1+mwpaqHVXWT8/wksIszp9cJWep1yvkxznmE1R2diAwBrgIedDuWaCQiacCleIdEoKpNbicSsGTir+7ME2aCxFlqYDKw1uVQ/OJUEb0BVAAvqGpYxQ/8DPgq0OZyHL2hwPMislFEbnM7GD8VApXAn52qxgdFJNntoCyZmLAkIinAv4EvqGqt2/H4Q1VbVXUS3qmBZohI2FQ5isj7gQpV3eh2LL10iapOwbu0xeecKuBwEQtMAR5Q1cnAacD19ltLJv7pzjxhpo85bQ3/Bv6uqkvcjqennKqJlcB7XQ7FHxcDVzttDo8As0XkYXdD8p+qljv/VgBP4K3CDhdlQJlPifZxvMnFVZZM/NOdecJMH3IasP8I7FLVn7gdj79EJFtE0p3niXg7cxS7GpQfVPVuVR2iqgV4r/8Vqnqzy2H5RUSSnc4bONVDVwBh08NRVY8AB0VkjLNpDuB6B5SwmE4lVHQ1T5jLYXWbiPwTuBwYICJlwHdU9Y/uRuW3i4GPAducdgeArztT7oSDQcBDTs/AGOBRVQ3L7rVhLBd4wlk/Lxb4h6o+525IfrsT+LtzU1sKfNLleKxrsDHGmN6zai5jjDG9ZsnEGGNMr1kyMcYY02uWTIwxxvSaJRNjjDG9ZsnEmBAiIvNFZJWInBKRShH5lYgkuB2XMediycSYECEiXwaeAw4DXwT+C3wO+LmbcRnTHTbOxJgQICJzgeeBr6rq/T7bnwNmAdnhNgeZiS5WMjHGZSISg7f0sRn4cYfdq4B4IGwmgzTRyaZTMcZ984Ei4BY9s6qgyfk3LbghGeMfSybGuO9GoBV4RUQGdNiX6/x7MrghGeMfazMxxmUish/IP8dheap6KBjxGNMTlkyMcZFTEqnEu6bGbzo55FGgUVUHBTUwY/xk1VzGuGu48+96VV3uu0NECoEM4B9Bj8oYP1lvLmPcleL821mbyPXOv/8KUizG9JglE2Pc1T52JNV3o7Po0WeBEuDpYAdljL8smRjjrp1AHd7uwb5+ABQAd6lqa7CDMsZf1mZijItUtU5EHgTuEpGHgZeAK4FrgYWq+ryrARrTTdabyxiXOVVaPwI+CiQBG4H/C8N1yU0Us2RijDGm16zNxBhjTK9ZMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK9ZMjHGGNNrlkyMMcb0miUTY4wxvWbJxBhjTK/9f7SHFRCeSkIHAAAAAElFTkSuQmCC",
"text/plain": [
"