From 0d222eddb13666aa4953e0864715e0d4cf52cd29 Mon Sep 17 00:00:00 2001 From: Amrit K Date: Fri, 20 Oct 2023 00:04:19 -0400 Subject: [PATCH 1/4] Initial commit, porting from cyclops repo --- .github/ISSUE_TEMPLATE/bug_report.md | 26 + .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/pull_request_template.md | 7 + .github/workflows/code_checks.yml | 41 + .github/workflows/docs_build.yml | 48 + .github/workflows/docs_deploy.yml | 57 + .github/workflows/integration_tests.yml | 61 + .github/workflows/publish.yml | 27 + .gitignore | 30 + .pre-commit-config.yaml | 61 + CONTRIBUTING.md | 29 + LICENSE.md | 201 + README.md | 67 +- codecov.yml | 19 + cycquery/__init__.py | 16 + cycquery/base.py | 290 ++ cycquery/eicu.py | 19 + cycquery/gemini.py | 221 ++ cycquery/interface.py | 253 ++ cycquery/mimiciii.py | 87 + cycquery/mimiciv.py | 161 + cycquery/omop.py | 258 ++ cycquery/ops.py | 3262 +++++++++++++++++ cycquery/orm.py | 313 ++ cycquery/post_process/__init__.py | 1 + cycquery/post_process/gemini.py | 44 + cycquery/post_process/mimiciv.py | 155 + cycquery/post_process/util.py | 112 + cycquery/util.py | 1229 +++++++ cycquery/utils/__init__.py | 1 + cycquery/utils/common.py | 203 + cycquery/utils/file.py | 457 +++ cycquery/utils/log.py | 138 + cycquery/utils/profile.py | 37 + docs/Makefile | 20 + docs/make.bat | 35 + docs/source/_static/cyclical_diagram.jpg | Bin 0 -> 38182 bytes docs/source/_static/cyclops_arch.png | Bin 0 -> 562210 bytes .../_templates/custom-class-template.rst | 34 + .../_templates/custom-module-template.rst | 66 + docs/source/api.rst | 6 + docs/source/conf.py | 93 + docs/source/contributing.rst | 37 + docs/source/index.rst | 12 + docs/source/intro.rst | 82 + docs/source/reference/api/cycquery.rst | 30 + docs/source/theme/static/css/cyclops.css | 326 ++ .../source/theme/static/cyclops_logo-dark.png | Bin 0 -> 124173 bytes docs/source/theme/static/cyclops_logo.png | Bin 0 -> 70453 bytes docs/source/theme/static/favicon.ico | Bin 0 -> 39583 bytes docs/source/theme/static/js/theme.js | 31 + .../source/theme/static/logos/gemini_logo.png | Bin 0 -> 5858 bytes .../source/theme/static/logos/vector_logo.png | Bin 0 -> 96586 bytes docs/source/theme/theme.conf | 11 + docs/source/tutorials.rst | 6 + docs/source/tutorials/eicu.ipynb | 203 + docs/source/tutorials/gemini.ipynb | 297 ++ docs/source/tutorials/mimiciii.ipynb | 197 + docs/source/tutorials/mimiciv.ipynb | 341 ++ docs/source/tutorials/omop.ipynb | 288 ++ docs/source/tutorials_query.rst | 16 + poetry.lock | 3055 +++++++++++++++ pyproject.toml | 129 + setup.py | 6 + tests/__init__.py | 1 + tests/cycquery/__init__.py | 1 + tests/cycquery/post_process/__init__.py | 1 + tests/cycquery/post_process/test_util.py | 51 + tests/cycquery/test_base.py | 22 + tests/cycquery/test_eicu.py | 29 + tests/cycquery/test_interface.py | 81 + tests/cycquery/test_mimiciii.py | 34 + tests/cycquery/test_mimiciv.py | 39 + tests/cycquery/test_omop.py | 51 + tests/cycquery/test_ops.py | 655 ++++ tests/cycquery/test_orm.py | 31 + tests/cycquery/test_util.py | 208 ++ 78 files changed, 14476 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/code_checks.yml create mode 100644 .github/workflows/docs_build.yml create mode 100644 .github/workflows/docs_deploy.yml create mode 100644 .github/workflows/integration_tests.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 codecov.yml create mode 100644 cycquery/__init__.py create mode 100644 cycquery/base.py create mode 100644 cycquery/eicu.py create mode 100644 cycquery/gemini.py create mode 100644 cycquery/interface.py create mode 100644 cycquery/mimiciii.py create mode 100644 cycquery/mimiciv.py create mode 100644 cycquery/omop.py create mode 100644 cycquery/ops.py create mode 100644 cycquery/orm.py create mode 100644 cycquery/post_process/__init__.py create mode 100644 cycquery/post_process/gemini.py create mode 100644 cycquery/post_process/mimiciv.py create mode 100644 cycquery/post_process/util.py create mode 100644 cycquery/util.py create mode 100644 cycquery/utils/__init__.py create mode 100644 cycquery/utils/common.py create mode 100644 cycquery/utils/file.py create mode 100644 cycquery/utils/log.py create mode 100644 cycquery/utils/profile.py create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/_static/cyclical_diagram.jpg create mode 100644 docs/source/_static/cyclops_arch.png create mode 100644 docs/source/_templates/custom-class-template.rst create mode 100644 docs/source/_templates/custom-module-template.rst create mode 100644 docs/source/api.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/contributing.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/intro.rst create mode 100644 docs/source/reference/api/cycquery.rst create mode 100644 docs/source/theme/static/css/cyclops.css create mode 100644 docs/source/theme/static/cyclops_logo-dark.png create mode 100644 docs/source/theme/static/cyclops_logo.png create mode 100644 docs/source/theme/static/favicon.ico create mode 100644 docs/source/theme/static/js/theme.js create mode 100644 docs/source/theme/static/logos/gemini_logo.png create mode 100644 docs/source/theme/static/logos/vector_logo.png create mode 100644 docs/source/theme/theme.conf create mode 100644 docs/source/tutorials.rst create mode 100644 docs/source/tutorials/eicu.ipynb create mode 100644 docs/source/tutorials/gemini.ipynb create mode 100644 docs/source/tutorials/mimiciii.ipynb create mode 100644 docs/source/tutorials/mimiciv.ipynb create mode 100644 docs/source/tutorials/omop.ipynb create mode 100644 docs/source/tutorials_query.rst create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 setup.py create mode 100644 tests/__init__.py create mode 100644 tests/cycquery/__init__.py create mode 100644 tests/cycquery/post_process/__init__.py create mode 100644 tests/cycquery/post_process/test_util.py create mode 100644 tests/cycquery/test_base.py create mode 100644 tests/cycquery/test_eicu.py create mode 100644 tests/cycquery/test_interface.py create mode 100644 tests/cycquery/test_mimiciii.py create mode 100644 tests/cycquery/test_mimiciv.py create mode 100644 tests/cycquery/test_omop.py create mode 100644 tests/cycquery/test_ops.py create mode 100644 tests/cycquery/test_orm.py create mode 100644 tests/cycquery/test_util.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..b89748c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,26 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +### Describe the bug +A clear and concise description of what the bug is. + +### To Reproduce +Code snippet or clear steps to reproduce behaviour. + +### Expected behavior +A clear and concise description of what you expected to happen. + +### Screenshots +If applicable, add screenshots to help explain your problem. + +### Version + - Version info such as v0.1.5 + +### Additional context +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3ba13e0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..b2de4ff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +### Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. + +### Additional context +Add any other context or screenshots about the feature request here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7d639c9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,7 @@ +# PR Type ([Feature | Fix | Documentation | Test]) + +## Short Description +... + +## Tests Added +... diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml new file mode 100644 index 0000000..3dfdeb4 --- /dev/null +++ b/.github/workflows/code_checks.yml @@ -0,0 +1,41 @@ +name: code checks + +on: + push: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/code_checks.yml + - '**.py' + - poetry.lock + - pyproject.toml + - '**.ipynb' + pull_request: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/code_checks.yml + - '**.py' + - poetry.lock + - pyproject.toml + - '**.ipynb' + +jobs: + run-code-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install poetry + run: python3 -m pip install --upgrade pip && python3 -m pip install poetry + - uses: actions/setup-python@v4.3.0 + with: + python-version: 3.10 + cache: 'poetry' + - name: Install dependencies and check code + run: | + poetry env use 3.10 + source $(poetry env info --path)/bin/activate + poetry install --without docs + pre-commit run --all-files diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml new file mode 100644 index 0000000..bab616a --- /dev/null +++ b/.github/workflows/docs_build.yml @@ -0,0 +1,48 @@ +name: docs (build) + +on: + pull_request: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/docs_build.yml + - '**.py' + - '**.ipynb' + - poetry.lock + - pyproject.toml + - '**.rst' + - '**.md' + +jobs: + build: + runs-on: [self-hosted, db, gpu] + steps: + - uses: actions/checkout@v3 + with: + submodules: 'true' + - name: Install dependencies, build docs and coverage report + run: python3 -m pip install --upgrade pip && python3 -m pip install poetry + - uses: actions/setup-python@v4.3.0 + with: + python-version: 3.10 + cache: 'poetry' + - run: | + python3 -m pip install --upgrade pip && python3 -m pip install poetry + poetry env use 3.10 + source $(poetry env info --path)/bin/activate + poetry install + # pandoc README.md -f markdown -t rst -s -o docs/source/intro.rst + cd docs && rm -rf source/reference/api/_autosummary && make html + cd .. && coverage run -m pytest -m "not integration_test" && coverage xml && coverage report -m + - name: Upload coverage to Codecov + uses: Wandalen/wretry.action@v1.0.36 + with: + action: codecov/codecov-action@v3.1.3 + with: | + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + name: codecov-umbrella + fail_ci_if_error: true + attempt_limit: 5 + attempt_delay: 30000 diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml new file mode 100644 index 0000000..dd785e3 --- /dev/null +++ b/.github/workflows/docs_deploy.yml @@ -0,0 +1,57 @@ +name: docs + +on: + push: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/code_checks.yml + - .github/workflows/docs_build.yml + - .github/workflows/docs_deploy.yml + - .github/workflows/integration_tests.yml + - '**.py' + - '**.ipynb' + - '**.jinja' + - poetry.lock + - pyproject.toml + - '**.rst' + - '**.md' + +jobs: + deploy: + runs-on: [self-hosted, db, gpu] + steps: + - uses: actions/checkout@v3 + with: + submodules: 'true' + - name: Install dependencies, build docs and coverage report + run: python3 -m pip install --upgrade pip && python3 -m pip install poetry + - uses: actions/setup-python@v4.3.0 + with: + python-version: 3.10 + cache: 'poetry' + - run: | + poetry env use 3.10 + source $(poetry env info --path)/bin/activate + poetry install + # pandoc README.md -f markdown -t rst -s -o docs/source/intro.rst + cd docs && rm -rf source/reference/api/_autosummary && make html + cd .. && coverage run -m pytest -m "not integration_test" && coverage xml && coverage report -m + - name: Upload coverage to Codecov + uses: Wandalen/wretry.action@v1.0.36 + with: + action: codecov/codecov-action@v3.1.3 + with: | + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + name: codecov-umbrella + fail_ci_if_error: true + attempt_limit: 5 + attempt_delay: 30000 + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: github_pages + publish_dir: docs/build diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml new file mode 100644 index 0000000..704a81d --- /dev/null +++ b/.github/workflows/integration_tests.yml @@ -0,0 +1,61 @@ +name: integration tests + +on: + push: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/code_checks.yml + - .github/workflows/docs_build.yml + - .github/workflows/docs_deploy.yml + - .github/workflows/integration_tests.yml + - '**.py' + - '**.ipynb' + - poetry.lock + - pyproject.toml + - '**.rst' + - '**.md' + pull_request: + branches: + - main + paths: + - .pre-commit-config.yaml + - .github/workflows/code_checks.yml + - .github/workflows/docs_build.yml + - .github/workflows/docs_deploy.yml + - .github/workflows/integration_tests.yml + - '**.py' + - '**.ipynb' + - poetry.lock + - pyproject.toml + - '**.rst' + - '**.md' + +jobs: + integration-tests: + runs-on: [self-hosted, gpu, db] + steps: + - uses: actions/checkout@v3 + - name: Install poetry + run: pip install poetry + - uses: actions/setup-python@v4.3.0 + with: + python-version: 3.10 + - name: Install dependencies and check code + run: | + poetry env use 3.10 + source $(poetry env info --path)/bin/activate + poetry install --without docs + coverage run -m pytest -m integration_test && coverage xml && coverage report -m + - name: Upload coverage to Codecov + uses: Wandalen/wretry.action@v1.0.36 + with: + action: codecov/codecov-action@v3.1.3 + with: | + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + name: codecov-umbrella + fail_ci_if_error: true + attempt_limit: 5 + attempt_delay: 30000 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..69faa31 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,27 @@ +name: publish package + +on: + release: + types: [published] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Install apt dependencies + run: | + sudo apt-get update + sudo apt-get install libcurl4-openssl-dev libssl-dev + - uses: actions/checkout@v3 + - name: Install poetry + run: python3 -m pip install --upgrade pip && python3 -m pip install poetry + - uses: actions/setup-python@v4.3.0 + with: + python-version: 3.10 + - name: Build package + run: poetry build + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f657a50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +*__pycache__* +*.log +docs/build +.python-version +*.DS_Store +htmlcov +.coverage +venv +.ipynb_checkpoints +*.pt +*.csv +mlruns +.profile +.env +*.html +_extract +*.gzip +*checkpoint* +*.parquet +*.npy +*.pkl +*.npz +*.csv +*.pickle +dist/ +outputs/ +multirun/ +_autosummary +*cyclops_reports* +*dummy_reports* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..c6437a6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,61 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 # Use the ref you want to point at + hooks: + - id: trailing-whitespace + - id: check-ast + - id: check-builtin-literals + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: debug-statements + - id: end-of-file-fixer + - id: mixed-line-ending + args: [--fix=lf] + - id: requirements-txt-fixer + - id: check-yaml + - id: check-toml + + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: 'v0.1.0' + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + types_or: [python, jupyter] + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.5.1 + hooks: + - id: mypy + entry: python3 -m mypy --config-file pyproject.toml + language: system + types: [python] + exclude: "tests" + + - repo: local + hooks: + - id: nbstripout + name: nbstripout + language: python + entry: nbstripout + exclude: ^docs/source/tutorials/gemini.ipynb + + - repo: https://github.com/nbQA-dev/nbQA + rev: 1.7.0 + hooks: + - id: nbqa-black + - id: nbqa-ruff + args: [--fix, --exit-non-zero-on-fix] + + - repo: local + hooks: + - id: pytest + name: pytest + entry: python3 -m pytest -m "not integration_test" + language: system + pass_filenames: false + always_run: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c89648d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to cyclops-query + +Thanks for your interest in contributing to cyclops-query tool! + +To submit PRs, please fill out the PR template along with the PR. If the PR +fixes an issue, don't forget to link the PR to the issue! + +## Pre-commit hooks + +Once the python virtual environment is setup, you can run pre-commit hooks using: + +```bash +pre-commit run --all-files +``` + +## Coding guidelines + +For code style, we recommend the [google style guide](https://google.github.io/styleguide/pyguide.html). + +Pre-commit hooks apply the [black](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html) +code formatting. + +For docstrings we use [numpy format](https://numpydoc.readthedocs.io/en/latest/format.html). + +We use [ruff](https://github.com/astral-sh/ruff) for further static code analysis. +The pre-commit hooks show errors which you need to fix before submitting a PR. + +Last but not the least, we use type hints in our code which is then checked using +[mypy](https://mypy.readthedocs.io/en/stable/). diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..ab87573 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022, Vector Institute + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index d695ad3..d41c9e5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,67 @@ # cyclops-query -A tool to query EHR databases +-------------------------------------------------------------------------------- + +[![PyPI](https://img.shields.io/pypi/v/cycquery)](https://pypi.org/project/cycquery) +[![code checks](https://github.com/VectorInstitute/cyclops-query/actions/workflows/code_checks.yml/badge.svg)](https://github.com/VectorInstitute/cyclops-query/actions/workflows/code_checks.yml) +[![integration tests](https://github.com/VectorInstitute/cyclops-query/actions/workflows/integration_tests.yml/badge.svg)](https://github.com/VectorInstitute/cyclops-query/actions/workflows/integration_tests.yml) +[![docs](https://github.com/VectorInstitute/cyclops-query/actions/workflows/docs_deploy.yml/badge.svg)](https://github.com/VectorInstitute/cyclops-query/actions/workflows/docs_deploy.yml) +[![codecov](https://codecov.io/gh/VectorInstitute/cyclops-query/branch/main/graph/badge.svg)](https://codecov.io/gh/VectorInstitute/cyclops-query) +[![license](https://img.shields.io/github/license/VectorInstitute/cyclops-query.svg)](https://github.com/VectorInstitute/cyclops-query/blob/main/LICENSE) + +``cyclops-query`` is a tool for querying EHR databases. + +## 🐣 Getting Started + +### Installing cyclops-query using pip + +```bash +python3 -m pip install cycquery +``` + +## 🧑🏿‍💻 Developing + +### Using poetry + +The development environment can be set up using +[poetry](https://python-poetry.org/docs/#installation). Hence, make sure it is +installed and then run: + +```bash +python3 -m poetry install +source $(poetry env info --path)/bin/activate +``` + +API documentation is built using [Sphinx](https://www.sphinx-doc.org/en/master/) and +can be locally built by: + +```bash +cd docs +make html SPHINXOPTS="-D nbsphinx_allow_errors=True" +``` + +### Contributing + +Contributing to ``cyclops-query`` is welcomed. +See [Contributing](https://vectorinstitute.github.io/cyclops-query/api/contributing.html) for +guidelines. + + +## 📚 [Documentation](https://vectorinstitute.github.io/cyclops-query/) + + +## 🎓 Citation + +Reference to cite when you use ``cyclops-query`` in a project or a research paper: + +``` +@article {Krishnan2022.12.02.22283021, + author = {Krishnan, Amrit and Subasri, Vallijah and McKeen, Kaden and Kore, Ali and Ogidi, Franklin and Alinoori, Mahshid and Lalani, Nadim and Dhalla, Azra and Verma, Amol and Razak, Fahad and Pandya, Deval and Dolatabadi, Elham}, + title = {CyclOps: Cyclical development towards operationalizing ML models for health}, + elocation-id = {2022.12.02.22283021}, + year = {2022}, + doi = {10.1101/2022.12.02.22283021}, + publisher = {Cold Spring Harbor Laboratory Press}, + URL = {https://www.medrxiv.org/content/early/2022/12/08/2022.12.02.22283021}, + journal = {medRxiv} +} +``` diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..72f5c36 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,19 @@ +codecov: + require_ci_to_pass: true + notify: + after_n_builds: 2 + wait_for_ci: yes +comment: + behavior: default + layout: reach,diff,flags,tree,reach + show_carryforward_flags: false + require_changes: true +coverage: + status: + changes: true + default_rules: + flag_coverage_not_uploaded_behavior: include + patch: true + project: true +github_checks: + annotations: true diff --git a/cycquery/__init__.py b/cycquery/__init__.py new file mode 100644 index 0000000..40b6d91 --- /dev/null +++ b/cycquery/__init__.py @@ -0,0 +1,16 @@ +"""The ``query`` API provides classes to query EHR databases.""" + +try: + import sqlalchemy +except ImportError: + raise ImportError( + "CyclOps is not installed with query API support! Please install using 'pip install cyclops[query]'.", # noqa: E501 + ) from None + + +from cycquery.base import DatasetQuerier +from cycquery.eicu import EICUQuerier +from cycquery.gemini import GEMINIQuerier +from cycquery.mimiciii import MIMICIIIQuerier +from cycquery.mimiciv import MIMICIVQuerier +from cycquery.omop import OMOPQuerier diff --git a/cycquery/base.py b/cycquery/base.py new file mode 100644 index 0000000..dfedee3 --- /dev/null +++ b/cycquery/base.py @@ -0,0 +1,290 @@ +"""Base querier class.""" + +import logging +from functools import partial +from typing import Any, Callable, Dict, List, Optional + +from sqlalchemy import MetaData +from sqlalchemy.sql.selectable import Subquery + +from cycquery import ops as qo +from cycquery.interface import QueryInterface +from cycquery.orm import Database, DatasetQuerierConfig +from cycquery.util import ( + DBSchema, + _to_subquery, + get_attr_name, +) +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +def _create_get_table_lambdafn(schema_name: str, table_name: str) -> Callable[..., Any]: + """Create a lambda function to access a table. + + Parameters + ---------- + schema_name + The schema name. + table_name + The table name. + + Returns + ------- + Callable + The lambda function. + + """ + return lambda db: getattr(getattr(db, schema_name), table_name) + + +def _cast_timestamp_cols(table: Subquery) -> Subquery: + """Cast timestamp columns to datetime. + + Parameters + ---------- + table + Table to cast. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Table with cast columns. + + """ + cols_to_cast = [] + for col in table.columns: + if str(col.type) == "TIMESTAMP": + cols_to_cast.append(col.name) + if cols_to_cast: + table = qo.Cast(cols_to_cast, "timestamp")(table) + + return table + + +class DatasetQuerier: + """Base class to query EHR datasets. + + Attributes + ---------- + db + ORM Database used to run queries. + + Parameters + ---------- + database + Name of database. + user + Username for database. + password + Password for database. + dbms + Database management system. + host + Hostname of database. + port + Port of database. + + Notes + ----- + This class is intended to be subclassed to provide methods for querying tables in + the database. This class automatically creates methods for querying tables in the + database. The methods are named after the schema and table name, i.e. + `self.schema_name.table_name()`. The methods are created when the class is + instantiated. The subclass can provide custom methods for querying tables in the + database which can build on the methods created by this class. + + """ + + def __init__( + self, + database: str, + user: str, + password: str, + dbms: str = "postgresql", + host: str = "localhost", + port: int = 5432, + ) -> None: + config = DatasetQuerierConfig( + database=database, + user=user, + password=password, + dbms=dbms, + host=host, + port=port, + ) + self.db = Database(config) + if not self.db.is_connected: + LOGGER.error("Database is not connected, cannot run queries.") + return + self._setup_table_methods() + + def list_schemas(self) -> List[str]: + """List schemas in the database to query. + + Returns + ------- + List[str] + List of schema names. + + """ + return list(self.db.inspector.get_schema_names()) + + def list_tables(self, schema_name: Optional[str] = None) -> List[str]: + """List table methods that can be queried using the database. + + Parameters + ---------- + schema_name + Name of schema in the database. + + Returns + ------- + List[str] + List of table names. + + """ + if schema_name: + table_names = [] + for table in self.db.list_tables(): + schema_name_, _ = table.split(".") + if schema_name_ == schema_name: + table_names.append(table) + else: + table_names = self.db.list_tables() + + return table_names + + def list_columns(self, schema_name: str, table_name: str) -> List[str]: + """List columns in a table. + + Parameters + ---------- + schema_name + Name of schema in the database. + table_name + Name of table in the database. + + Returns + ------- + List[str] + List of column names. + + """ + return list( + getattr(getattr(self.db, schema_name), table_name).data.columns.keys(), + ) + + def list_custom_tables(self) -> List[str]: + """List custom tables methods provided by the dataset API. + + Returns + ------- + List[str] + List of custom table names. + + """ + method_list = dir(self) + custom_tables = [] + for method in method_list: + if ( + not method.startswith( + "__", + ) + and not method.startswith("_") + and method not in self.list_schemas() + and not method.startswith("list_") + and not method.startswith("get_") + and method not in ["db"] + ): + custom_tables.append(method) + + return custom_tables + + def get_table( + self, + schema_name: str, + table_name: str, + cast_timestamp_cols: bool = True, + ) -> Subquery: + """Get a table and possibly map columns to have standard names. + + Standardizing column names allows for columns to be + recognized in downstream processing. + + Parameters + ---------- + schema_name + Name of schema in the database. + table_name + Name of table in the database. + cast_timestamp_cols + Whether to cast timestamp columns to datetime. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Table with mapped columns. + + """ + table = _create_get_table_lambdafn(schema_name, table_name)(self.db).data + + if cast_timestamp_cols: + table = _cast_timestamp_cols(table) + + return _to_subquery(table) + + def _template_table_method( + self, + schema_name: str, + table_name: str, + ) -> QueryInterface: + """Template method for table methods. + + Parameters + ---------- + schema_name + Name of schema in the database. + table_name + Name of table in the database. + + Returns + ------- + cycquery.interface.QueryInterface + A query interface object. + + """ + table = getattr(getattr(self.db, schema_name), table_name).data + table = _to_subquery(table) + + return QueryInterface(self.db, table) + + def _setup_table_methods(self) -> None: + """Add table methods. + + This method adds methods to the querier class that allow querying of tables in + the database. The methods are named after the table names. + + """ + schemas = self.list_schemas() + meta: Dict[str, MetaData] = {} + for schema_name in schemas: + metadata = MetaData(schema=schema_name) + metadata.reflect(bind=self.db.engine) + meta[schema_name] = metadata + schema = DBSchema(schema_name, meta[schema_name]) + for table_name in meta[schema_name].tables: + setattr( + schema, + get_attr_name(table_name), + partial( + self._template_table_method, + schema_name=schema_name, + table_name=get_attr_name(table_name), + ), + ) + setattr(self, schema_name, schema) diff --git a/cycquery/eicu.py b/cycquery/eicu.py new file mode 100644 index 0000000..591a7d5 --- /dev/null +++ b/cycquery/eicu.py @@ -0,0 +1,19 @@ +"""EICU-CRD query module. + +Supports querying of eICU. + +""" + +import logging + +from cycquery.base import DatasetQuerier +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +class EICUQuerier(DatasetQuerier): + """EICU dataset querier.""" diff --git a/cycquery/gemini.py b/cycquery/gemini.py new file mode 100644 index 0000000..5cb7617 --- /dev/null +++ b/cycquery/gemini.py @@ -0,0 +1,221 @@ +"""GEMINI query module.""" + +import logging + +from sqlalchemy import select +from sqlalchemy.sql.expression import union_all + +import cycquery.ops as qo +from cycquery.base import DatasetQuerier +from cycquery.interface import QueryInterface +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +# Custm column names. +CARE_UNIT = "care_unit" + + +class GEMINIQuerier(DatasetQuerier): + """GEMINI dataset querier.""" + + def ip_admin( + self, + ) -> QueryInterface: + """Query GEMINI patient encounters. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("public", "ip_administrative") + + # Possibly cast string representations to timestamps + table = qo.Cast(["admit_date_time", "discharge_date_time"], "timestamp")(table) + + # Get the discharge disposition code descriptions + lookup_table = self.get_table("public", "lookup_ip_administrative") + lookup_table = qo.ConditionEquals("variable", "discharge_disposition")( + lookup_table, + ) + table = qo.Join( + lookup_table, + on=("discharge_disposition", "value"), + on_to_type="int", + join_table_cols="description", + isouter=True, + )(table) + table = qo.Rename({"description": "discharge_description"})(table) + table = qo.Drop("value")(table) + + return QueryInterface(self.db, table) + + def diagnoses( + self, + ) -> QueryInterface: + """Query diagnosis data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed table, wrapped in an interface object. + + """ + table = self.get_table("public", "diagnosis") + + lookup_table = self.get_table("public", "lookup_diagnosis") + lookup_table = qo.ConditionEquals("variable", "diagnosis_type")(lookup_table) + table = qo.Join( + lookup_table, + on=("diagnosis_type", "value"), + join_table_cols="description", + isouter=True, + )(table) + table = qo.Drop("value")(table) + table = qo.Rename({"description": "diagnosis_type_description"})(table) + table = qo.ReorderAfter("diagnosis_type_description", "diagnosis_type")(table) + + # Trim whitespace from ICD codes. + table = qo.Trim("diagnosis_code")(table) + + return QueryInterface(self.db, table) + + def room_transfer( + self, + ) -> QueryInterface: + """Query room transfer data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed table, wrapped in an interface object. + + """ + table = self.get_table("public", "room_transfer") + + # Join with lookup to get transfer description. + lookup_table = self.get_table("public", "lookup_room_transfer") + lookup_table = qo.ConditionEquals("variable", "medical_service")(lookup_table) + + table = qo.Join( + lookup_table, + on=("medical_service", "value"), + join_table_cols="description", + isouter=True, + )(table) + table = qo.Rename({"description": "transfer_description"})(table) + + return QueryInterface(self.db, table) + + def care_units( + self, + ) -> QueryInterface: + """Query care unit data, fetches transfer info from multiple tables. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed table, wrapped in an interface object. + + """ + filter_care_unit_cols = qo.Keep( + [ + "genc_id", + "admit", + "discharge", + CARE_UNIT, + ], + ) + + # In-patient table. + ip_table = self.get_table("public", "ip_administrative") + ip_table = qo.Rename( + { + "admit_date_time": "admit", + "discharge_date_time": "discharge", + }, + )(ip_table) + ip_table = qo.Literal("IP", CARE_UNIT)(ip_table) + ip_table = filter_care_unit_cols(ip_table) + + # Special care unit table. + scu_table = self.get_table("public", "ip_scu") + scu_table = qo.Rename( + { + "scu_admit_date_time": "admit", + "scu_discharge_date_time": "discharge", + }, + )(scu_table) + scu_table = qo.Literal("SCU", CARE_UNIT)(scu_table) + scu_table = filter_care_unit_cols(scu_table) + + # Emergency room/department table. + er_table = self.get_table("public", "er_administrative") + er_table = qo.Rename( + { + "er_admit_timestamp": "admit", + "er_discharge_timestamp": "discharge", + }, + )(er_table) + er_table = qo.Literal("ER", CARE_UNIT)(er_table) + er_table = filter_care_unit_cols(er_table) + + # Room transfer table. + rt_table = self.get_table("public", "room_transfer") + rt_table = qo.Rename( + { + "checkin_date_time": "admit", + "checkout_date_time": "discharge", + }, + )(rt_table) + rt_table = qo.Rename({"transfer_description": CARE_UNIT})(rt_table) + rt_table = filter_care_unit_cols(rt_table) + + # Combine. + table = union_all( + select(er_table), + select(scu_table), + select(ip_table), + select(rt_table), + ).subquery() + + return QueryInterface(self.db, table) + + def imaging( + self, + ) -> QueryInterface: + """Query imaging reports data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed table, wrapped in an interface object. + + """ + table = self.get_table("public", "imaging") + + # Get imaging test description + lookup_table = self.get_table("public", "lookup_imaging") + lookup_table = qo.ConditionEquals("variable", "imaging_test_name_mapped")( + lookup_table, + ) + + table = qo.Join( + lookup_table, + on=("imaging_test_name_mapped", "value"), + on_to_type="str", + join_table_cols="description", + )(table) + table = qo.Drop("value")(table) + table = qo.Rename({"description": "imaging_test_description"})(table) + table = qo.ReorderAfter("imaging_test_description", "imaging_test_name_mapped")( + table, + ) + + return QueryInterface(self.db, table) diff --git a/cycquery/interface.py b/cycquery/interface.py new file mode 100644 index 0000000..5df859e --- /dev/null +++ b/cycquery/interface.py @@ -0,0 +1,253 @@ +"""A query interface class to wrap database objects and queries.""" + +import logging +from typing import List, Literal, Optional, Tuple, Union + +import dask.dataframe as dd +import pandas as pd +from sqlalchemy.sql.elements import BinaryExpression + +import cycquery.ops as qo +from cycquery.orm import Database +from cycquery.util import TableTypes +from cycquery.utils.common import to_list_optional +from cycquery.utils.file import save_dataframe +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +class QueryInterface: + """An interface dataclass to wrap queries, and run them. + + Parameters + ---------- + database + Database object to create ORM, and query data. + query + The query. + + """ + + def __init__( + self, + database: Database, + query: Union[TableTypes, "QueryInterface"], + ) -> None: + """Initialize the QueryInterface object, join and chain operations.""" + self.database = database + if isinstance(query, QueryInterface): + self.query = query.query # type: ignore + else: + self.query = query + self._data = None + + @property + def data(self) -> Optional[Union[pd.DataFrame, dd.core.DataFrame]]: + """Get data.""" + return self._data + + def join( + self, + join_table: Union[TableTypes, "QueryInterface"], + on: Optional[ + Union[ + str, + List[str], + Tuple[str], + List[Tuple[str, str]], + ] + ] = None, + on_to_type: Optional[Union[type, List[type]]] = None, + cond: Optional[BinaryExpression] = None, + table_cols: Optional[Union[str, List[str]]] = None, + join_table_cols: Optional[Union[str, List[str]]] = None, + isouter: Optional[bool] = False, + ) -> "QueryInterface": + """Join the query with another table. + + Parameters + ---------- + join_table + Table to join with. + on + Column(s) to join on. + on_to_type + Type(s) to cast the column(s) to join on. + cond + Condition to join on. + table_cols + Columns to select from the original table. + join_table_cols + Columns to select from the joined table. + isouter + Whether to perform an outer join. + + Returns + ------- + QueryInterface + QueryInterface object with the join operation added. + + """ + on = to_list_optional(on) + on_to_type = to_list_optional(on_to_type) + table_cols = to_list_optional(table_cols) + join_table_cols = to_list_optional(join_table_cols) + if isinstance(join_table, QueryInterface): + join_table = join_table.query + query = qo.Join( + join_table=join_table, + on=on, + on_to_type=on_to_type, + cond=cond, + table_cols=table_cols, + join_table_cols=join_table_cols, + isouter=isouter, + )(self.query) + + return QueryInterface(self.database, query) + + def ops( + self, + ops: Union[qo.QueryOp, qo.Sequential], + ) -> "QueryInterface": + """Chain operations with the query. + + Parameters + ---------- + ops + Operations to perform on the query. + + Returns + ------- + QueryInterface + QueryInterface object with the operations added. + + """ + query = ops(self.query) + + return QueryInterface(self.database, query) + + def union( + self, + other: "QueryInterface", + ) -> "QueryInterface": + """Union the query with another query. + + Parameters + ---------- + other + The other query to union with. + + Returns + ------- + QueryInterface + QueryInterface object with the union operation added. + + """ + query = qo.Union(other.query)(self.query) + + return QueryInterface(self.database, query) + + def union_all( + self, + other: "QueryInterface", + ) -> "QueryInterface": + """Union all the query with another query. + + Parameters + ---------- + other + The other query to union all with. + + Returns + ------- + QueryInterface + QueryInterface object with the union all operation added. + + """ + query = qo.Union(other.query, union_all=True)(self.query) + + return QueryInterface(self.database, query) + + def run( + self, + limit: Optional[int] = None, + backend: Literal["pandas", "dask", "datasets"] = "pandas", + index_col: Optional[str] = None, + n_partitions: Optional[int] = None, + ) -> Union[pd.DataFrame, dd.core.DataFrame]: + """Run the query, and fetch data. + + Parameters + ---------- + limit + No. of rows to limit the query return. + backend + Backend computing framework to use, pandas or dask or datasets. + index_col + Column which becomes the index, and defines the partitioning. + Should be a indexed column in the SQL server, and any orderable type. + n_partitions + Number of partitions. Check dask documentation for additional details. + + Returns + ------- + pandas.DataFrame or dask.DataFrame or datasets.Dataset + Query result. + + """ + self._data = self.database.run_query( + self.query, + limit=limit, + backend=backend, + index_col=index_col, + n_partitions=n_partitions, + ) + + return self._data + + def save( + self, + path: str, + file_format: Literal["parquet", "csv"] = "parquet", + ) -> str: + """Save the query. + + Parameters + ---------- + path + Path where the file will be saved. + file_format + File format of the file to save. + + Returns + ------- + str + Processed save path for upstream use. + + """ + # If the query was already run. + if self._data is not None: + return save_dataframe(self._data, path, file_format=file_format) + + # Save without running. + if file_format == "csv": + path = self.database.save_query_to_csv(self.query, path) + elif file_format == "parquet": + path = self.database.save_query_to_parquet(self.query, path) + else: + raise ValueError("Invalid file format specified.") + + return path + + def clear_data(self) -> None: + """Clear data container. + + Sets the data attribute to None, thus clearing the dataframe contained. + + """ + self._data = None diff --git a/cycquery/mimiciii.py b/cycquery/mimiciii.py new file mode 100644 index 0000000..c6f0654 --- /dev/null +++ b/cycquery/mimiciii.py @@ -0,0 +1,87 @@ +"""MIMIC-III query module. + +Supports querying of MIMIC-III. + +""" + +import logging + +import cycquery.ops as qo +from cycquery.base import DatasetQuerier +from cycquery.interface import QueryInterface +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +class MIMICIIIQuerier(DatasetQuerier): + """MIMIC-III dataset querier.""" + + def diagnoses( + self, + ) -> QueryInterface: + """Query MIMICIII diagnosis data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("mimiciii", "diagnoses_icd") + + # Join with diagnoses dimension table. + table = qo.Join( + join_table=self.get_table("mimiciii", "d_icd_diagnoses"), + on=["icd9_code"], + on_to_type=["str"], + )(table) + + return QueryInterface(self.db, table) + + def labevents( + self, + ) -> QueryInterface: + """Query MIMICIII labevents data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("mimiciii", "labevents") + + # Join with lab dimension table. + table = qo.Join( + join_table=self.get_table("mimiciii", "d_labitems"), + on=["itemid"], + on_to_type=["str"], + )(table) + + return QueryInterface(self.db, table) + + def chartevents( + self, + ) -> QueryInterface: + """Query MIMICIII chartevents data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("mimiciii", "chartevents") + + # Join with dimension table. + table = qo.Join( + join_table=self.get_table("mimiciii", "d_items"), + on=["itemid"], + on_to_type=["str"], + )(table) + + return QueryInterface(self.db, table) diff --git a/cycquery/mimiciv.py b/cycquery/mimiciv.py new file mode 100644 index 0000000..25f6da7 --- /dev/null +++ b/cycquery/mimiciv.py @@ -0,0 +1,161 @@ +"""MIMIC-IV query module. + +Supports querying of MIMICIV-2.0. + +""" + +import logging + +from sqlalchemy import Integer, func, select + +import cycquery.ops as qo +from cycquery.base import DatasetQuerier +from cycquery.interface import QueryInterface +from cycquery.util import get_column +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +class MIMICIVQuerier(DatasetQuerier): + """MIMICIV dataset querier.""" + + def patients( + self, + ) -> QueryInterface: + """Query MIMIC patient data. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + Notes + ----- + The function infers the approximate year a patient received care, using the + `anchor_year` and `anchor_year_group` columns. The `join` and `ops` supplied + are applied after the approximate year is inferred. `dod` is + adjusted based on the inferred approximate year of care. + + """ + table = self.get_table("mimiciv_hosp", "patients") + + # Process and include patient's anchor year. + table = select( + table, + ( + func.substr(get_column(table, "anchor_year_group"), 1, 4).cast(Integer) + ).label("anchor_year_group_start"), + ( + func.substr(get_column(table, "anchor_year_group"), 8, 12).cast(Integer) + ).label("anchor_year_group_end"), + ).subquery() + + # Select the middle of the anchor year group as the anchor year + table = select( + table, + ( + get_column(table, "anchor_year_group_start") + + ( + get_column(table, "anchor_year_group_end") + - get_column(table, "anchor_year_group_start") + ) + / 2 + ).label("anchor_year_group_middle"), + ).subquery() + + table = select( + table, + ( + get_column(table, "anchor_year_group_middle") + - get_column(table, "anchor_year") + ).label("anchor_year_difference"), + ).subquery() + + # Shift relevant columns by anchor year difference + table = qo.AddDeltaColumn("dod", years="anchor_year_difference")(table) + table = qo.Drop( + [ + "anchor_year_group_start", + "anchor_year_group_end", + "anchor_year_group_middle", + ], + )(table) + + return QueryInterface(self.db, table) + + def diagnoses( + self, + ) -> QueryInterface: + """Query MIMIC diagnosis data. + + Parameters + ---------- + join + Join arguments. + ops + Additional operations to apply to the query. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("mimiciv_hosp", "diagnoses_icd") + + # Join with diagnoses dimension table. + table = qo.Join( + join_table=self.get_table("mimiciv_hosp", "d_icd_diagnoses"), + on=["icd_code", "icd_version"], + on_to_type=["str", "int"], + )(table) + + return QueryInterface(self.db, table) + + def labevents( + self, + ) -> QueryInterface: + """Query lab events from the hospital module. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table("mimiciv_hosp", "labevents") + dim_items_table = self.get_table("mimiciv_hosp", "d_labitems") + + # Join with lab items dimension table. + table = qo.Join( + join_table=dim_items_table, + on=["itemid"], + )(table) + + return QueryInterface(self.db, table) + + def chartevents( + self, + ) -> QueryInterface: + """Query ICU chart events from the ICU module. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed table, wrapped in an interface object. + + """ + table = self.get_table("mimiciv_icu", "chartevents") + dim_items_table = self.get_table("mimiciv_icu", "d_items") + + # Join with items dimension table. + table = qo.Join( + dim_items_table, + on="itemid", + )(table) + + return QueryInterface(self.db, table) diff --git a/cycquery/omop.py b/cycquery/omop.py new file mode 100644 index 0000000..9f3c1bd --- /dev/null +++ b/cycquery/omop.py @@ -0,0 +1,258 @@ +"""OMOP query API.""" + +import logging +from typing import List, Optional, Union + +from sqlalchemy.sql.selectable import Subquery + +import cycquery.ops as qo +from cycquery.base import DatasetQuerier +from cycquery.interface import QueryInterface +from cycquery.utils.common import to_list +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +# OMOP column names. +VISIT_OCCURRENCE_ID = "visit_occurrence_id" +PERSON_ID = "person_id" +VISIT_START_DATETIME = "visit_start_datetime" +VISIT_END_DATETIME = "visit_end_datetime" +VISIT_DETAIL_START_DATETIME = "visit_detail_start_datetime" +VISIT_DETAIL_END_DATETIME = "visit_detail_end_datetime" +VISIT_CONCEPT_ID = "visit_concept_id" +VISIT_TYPE_CONCEPT_ID = "visit_type_concept_id" +VISIT_DETAIL_CONCEPT_ID = "visit_detail_concept_id" +VISIT_DETAIL_TYPE_CONCEPT_ID = "visit_detail_type_concept_id" +CARE_SITE_ID = "care_site_id" +CONCEPT_NAME = "concept_name" +CONCEPT_ID = "concept_id" +CARE_SITE_SOURCE_VALUE = "care_site_source_value" +OBSERVATION_CONCEPT_ID = "observation_concept_id" +OBSERVATION_TYPE_CONCEPT_ID = "observation_type_concept_id" +OBSERVATION_DATETIME = "observation_datetime" +MEASUREMENT_CONCEPT_ID = "measurement_concept_id" +MEASUREMENT_TYPE_CONCEPT_ID = "measurement_type_concept_id" +MEASUREMENT_DATETIME = "measurement_datetime" +UNIT_CONCEPT_ID = "unit_concept_id" +VALUE_AS_CONCEPT_ID = "value_as_concept_id" + +# Created columns. +VISIT_DETAIL_CONCEPT_NAME = "visit_detail_concept_name" +CARE_SITE_NAME = "care_site_name" +GENDER_CONCEPT_NAME = "gender_concept_name" +RACE_CONCEPT_NAME = "race_concept_name" +ETHNICITY_CONCEPT_NAME = "ethnicity_concept_name" + +# Other constants. +ID = "id" +NAME = "name" + + +class OMOPQuerier(DatasetQuerier): + """OMOP querier.""" + + def __init__( + self, + database: str, + user: str, + password: str, + dbms: str = "postgresql", + host: str = "localhost", + port: int = 5432, + schema_name: str = "omop", + ) -> None: + super().__init__( + database=database, + user=user, + password=password, + dbms=dbms, + host=host, + port=port, + ) + self.schema_name = schema_name + + def map_concept_ids_to_name( + self, + src_table: Union[Subquery, QueryInterface], + src_cols: Union[str, List[str]], + dst_cols: Optional[Union[str, List[str]]] = None, + ) -> QueryInterface: + """Map concept IDs in a source table to concept names from concept table. + + For each concept ID column with a name like `somecol_concept_ID`, the mapped + concept name column will be named `somecol_concept_name`. If `dst_cols` is + specified, the mapped concept name column will be named according to the + corresponding name in `dst_cols`. + + Parameters + ---------- + src_table + Source table with concept IDs. + src_cols + Column name(s) to consider as concept IDs for mapping. + dst_cols + Column name(s) to assign for the mapped concept name columns. + + Returns + ------- + cycquery.interface.QueryInterface + Query with mapped columns from concept table. + + """ + if isinstance(src_table, QueryInterface): + src_table = src_table.query + concept_table = self.get_table(self.schema_name, "concept") + src_cols = to_list(src_cols) + if dst_cols: + dst_cols = to_list(dst_cols) + if len(dst_cols) != len(src_cols): + raise ValueError("dst_cols must be same length as src_cols") + + for i, col in enumerate(src_cols): + if ID not in col: + raise ValueError("Specified column not a concept ID column!") + src_table = qo.Join( + concept_table, + on=(col, CONCEPT_ID), + join_table_cols=[CONCEPT_NAME], + isouter=True, + )(src_table) + dst_col_name = dst_cols[i] if dst_cols else col.replace(ID, NAME) + src_table = qo.Rename({CONCEPT_NAME: dst_col_name})(src_table) + + return QueryInterface(self.db, src_table) + + def _map_care_site_id( + self, + source_table: Union[Subquery, QueryInterface], + ) -> QueryInterface: + """Map care_site_id in a source table to care_site table. + + Parameters + ---------- + source_table + Source table with care_site_id. + + Returns + ------- + cycquery.interface.QueryInterface + Query with mapped columns from care_site table. + + """ + if isinstance(source_table, QueryInterface): + source_table = source_table.query + care_site_table = self.get_table(self.schema_name, "care_site") + table = qo.Join( + care_site_table, + on=CARE_SITE_ID, + join_table_cols=[CARE_SITE_NAME, CARE_SITE_SOURCE_VALUE], + isouter=True, + )(source_table) + + return QueryInterface(self.db, table) + + def visit_occurrence( + self, + ) -> QueryInterface: + """Query OMOP visit_occurrence table. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table(self.schema_name, "visit_occurrence") + table = self.map_concept_ids_to_name( + table, + [ + "visit_concept_id", + "visit_type_concept_id", + ], + ) + table = self._map_care_site_id(table) + + return QueryInterface(self.db, table) + + def visit_detail( + self, + ) -> QueryInterface: + """Query OMOP visit_detail table. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table(self.schema_name, "visit_detail") + table = self.map_concept_ids_to_name( + table, + ["visit_detail_concept_id", "visit_detail_type_concept_id"], + ) + + return QueryInterface(self.db, table) + + def person( + self, + ) -> QueryInterface: + """Query OMOP person table. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table(self.schema_name, "person") + table = self.map_concept_ids_to_name( + table, + ["gender_concept_id", "race_concept_id", "ethnicity_concept_id"], + ) + + return QueryInterface(self.db, table) + + def observation( + self, + ) -> QueryInterface: + """Query OMOP observation table. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table(self.schema_name, "observation") + table = self.map_concept_ids_to_name( + table, + [OBSERVATION_CONCEPT_ID, OBSERVATION_TYPE_CONCEPT_ID], + ) + + return QueryInterface(self.db, table) + + def measurement( + self, + ) -> QueryInterface: + """Query OMOP measurement table. + + Returns + ------- + cycquery.interface.QueryInterface + Constructed query, wrapped in an interface object. + + """ + table = self.get_table(self.schema_name, "measurement") + # Cast value_as_concept_id to int. + table = qo.Cast([VALUE_AS_CONCEPT_ID], "int")(table) + table = self.map_concept_ids_to_name( + table, + [MEASUREMENT_CONCEPT_ID, MEASUREMENT_TYPE_CONCEPT_ID, UNIT_CONCEPT_ID], + ) + + return QueryInterface(self.db, table) diff --git a/cycquery/ops.py b/cycquery/ops.py new file mode 100644 index 0000000..94b14a9 --- /dev/null +++ b/cycquery/ops.py @@ -0,0 +1,3262 @@ +"""Query operations.""" + +from __future__ import annotations + +import logging +import operator +import typing +from abc import abstractmethod +from collections import OrderedDict +from datetime import datetime, timedelta +from itertools import islice + +import sqlalchemy +from sqlalchemy import and_, cast, extract, func, literal_column, or_, select +from sqlalchemy.sql.elements import BinaryExpression +from sqlalchemy.sql.expression import literal +from sqlalchemy.sql.selectable import Select, Subquery +from sqlalchemy.types import Boolean + +# Logging. +from cycquery.util import ( + TableTypes, + apply_to_columns, + check_timestamp_columns, + drop_columns, + ends_with, + equals, + filter_columns, + get_column, + get_column_names, + get_columns, + get_delta_column, + greater_than, + has_columns, + has_substring, + in_, + less_than, + not_equals, + process_column, + rename_columns, + reorder_columns, + starts_with, + table_params_to_type, + trim_columns, +) +from cycquery.utils.common import to_datetime_format, to_list, to_list_optional +from cycquery.utils.log import setup_logging + + +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +# ruff: noqa: W505 + + +def _addindent(s_: str, num_spaces: int = 4) -> str: + """Add spaces to a string except the first line. + + Parameters + ---------- + s_ + String to add spaces to. + num_spaces + Number of spaces to add. + + Returns + ------- + str + String with spaces added. + + """ + s = s_.split("\n") + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(num_spaces * " ") + line for line in s] + s = "\n".join(s) # type: ignore + + return first + "\n" + s # type: ignore + + +class QueryOp: + """Base class for query operations.""" + + _ops: typing.Dict[str, "QueryOp"] + + def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None: + super().__setattr__("_ops", OrderedDict()) + + @abstractmethod + def __call__(self, *args: typing.Any, **kwargs: typing.Any) -> Subquery: + """Implement a calling function.""" + pass + + def _add_op(self, name: str, op_: "QueryOp") -> None: + """Add a child operation to the current query operation. + + The query op can be accessed as an attribute using the given name. + + Parameters + ---------- + name + Name of the child op. The child op can be accessed from this op using + the given name + op_ + Child op to be added to the parent query op. + + """ + if not isinstance(op_, QueryOp) and op_ is not None: + raise TypeError("{} is not a QueryOp subclass".format(str(op_))) + if not isinstance(name, str): + raise TypeError("Query op name should be a string") + if hasattr(self, name) and name not in self._ops: + raise KeyError("Attribute '{}' already exists".format(name)) + if "." in name: + raise KeyError('Query op name can\'t contain ".", got: {}'.format(name)) + if name == "": + raise KeyError('Query op name can\'t be empty string ""') + self._ops[name] = op_ + + def _get_ops(self) -> typing.Iterator["QueryOp"]: + """Return an iterator over the child operations. + + Returns + ------- + typing.Iterator[QueryOp] + Iterator over the child operations. + + """ + for _, op_ in self._ops.items(): + yield op_ + + def _get_name(self) -> str: + """Get the name of the query op. + + Returns + ------- + str + Name of the query op. + + """ + return self.__class__.__name__ + + def __setattr__(self, name: str, value: "QueryOp") -> None: + """Set an attribute. + + Parameters + ---------- + name + Name of the attribute. + value + Value of the attribute. + + """ + ops = self.__dict__.get("_ops") + if isinstance(value, QueryOp): + if ops is None: + raise AttributeError("Can't assign op before QueryOp.__init__() call") + ops[name] = value + elif ops is not None and name in ops: + if value is not None: + raise TypeError( + "Cannot assign '{}' as child op '{}' " "(QueryOp or None expected)", + ) + ops[name] = value + else: + super().__setattr__(name, value) + + def _extra_repr(self) -> str: + """Set the extra representation of the query op. + + To print customized extra information, you should re-implement + this method in your own query ops. Both single-line and multi-line + strings are acceptable. + + Returns + ------- + str + Extra representation of the query op. + + """ + return "" + + def __repr__(self) -> str: + """Return the string representation of the query op. + + Returns + ------- + str + String representation of the query op. + + """ + extra_lines = [] + extra_repr = self._extra_repr() + if extra_repr: + extra_lines = extra_repr.split("\n") + child_lines = [] + for key, op_ in self._ops.items(): + mod_str = repr(op_) + mod_str = _addindent(mod_str, 2) + child_lines.append("(" + key + "): " + mod_str) + lines = extra_lines + child_lines + main_str = self._get_name() + "(" + if lines: + if len(extra_lines) == 1 and not child_lines: + main_str += extra_lines[0] + else: + main_str += "\n " + "\n ".join(lines) + "\n" + main_str += ")" + + return main_str + + def __getattr__(self, name: str) -> "QueryOp": + """Get an attribute. + + Parameters + ---------- + name + Name of the attribute. + + Returns + ------- + QueryOp + The child operation with the given name. + + """ + if name in self._ops: + return self._ops[name] + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{name}'", + ) + + +def _chain_ops( + query: Subquery, + ops: typing.Iterator[QueryOp], +) -> Subquery: + """Chain query ops. + + Parameters + ---------- + query + Query to chain the ops to. + ops + Query ops to chain. + + Returns + ------- + Subquery + Query with the ops chained. + + """ + for op_ in ops: + if isinstance(op_, Sequential): + query = _chain_ops(query, op_._get_ops()) + elif isinstance(op_, QueryOp): + query = op_(query) + + return query + + +class Sequential(QueryOp): + """Sequential query operations class. + + Chains a sequence of query operations and executes the final query on a table. + + Examples + -------- + >>> Sequential(Drop(["col1", "col2"]), ...) + >>> Sequential([Drop(["col1", "col2"]), ...]) + + """ + + @typing.overload + def __init__(self, *ops: QueryOp) -> None: + ... + + @typing.overload + def __init__(self, ops: typing.List[QueryOp]) -> None: + ... + + @typing.overload + def __init__(self, op: OrderedDict[str, QueryOp]) -> None: + ... + + def __init__(self, *args: QueryOp) -> None: # type: ignore + """Initialize the class. + + Parameters + ---------- + args + Query operations to be chained sequentially. + + """ + super().__init__() + if len(args) == 1 and isinstance(args[0], OrderedDict): + for key, op_ in args[0].items(): + self._add_op(key, op_) + elif len(args) == 1 and isinstance(args[0], list): + for idx, op_ in enumerate(args[0]): + self._add_op(str(idx), op_) + else: + for idx, op_ in enumerate(args): + self._add_op(str(idx), op_) + + def __len__(self) -> int: + """Return the number of query ops in the Sequential. + + Returns + ------- + int + Number of query ops in the Sequential. + + """ + return len(self._ops) + + def __iter__(self) -> typing.Iterator[QueryOp]: + """Return an iterator over the query ops. + + Returns + ------- + typing.Iterator[QueryOp] + Iterator over the query ops. + + """ + return iter(self._ops.values()) + + def __add__(self, other: "Sequential") -> "Sequential": + """Add two Sequential objects. + + Parameters + ---------- + other + Sequential object to be added. + + Returns + ------- + Sequential + Sequential object with the two Sequential objects chained. + + """ + if isinstance(other, Sequential): + ret = Sequential() + for op_ in self: + ret.append(op_) + for op_ in other: + ret.append(op_) + return ret + raise ValueError( + "Add operator supports only objects " + "of Sequential class, but {} is given.".format(str(type(other))), + ) + + def __iadd__(self, other: "Sequential") -> "Sequential": + """Add two Sequential objects inplace. + + Parameters + ---------- + other + Sequential object to be added. + + Returns + ------- + Sequential + Sequential object with the two Sequential objects chained. + + """ + if isinstance(other, Sequential): + offset = len(self) + for i, op_ in enumerate(other): + self._add_op(str(i + offset), op_) + return self + raise ValueError( + "Add operator supports only objects " + "of Sequential class, but {} is given.".format(str(type(other))), + ) + + def _get_item_by_idx( + self, + iterator: typing.Iterator[typing.Any], + idx: int, + ) -> typing.Any: + """Get the idx-th item of the iterator. + + Parameters + ---------- + iterator + Iterator to get the item from. + idx + Index of the item to get. + + Returns + ------- + QueryOp + The idx-th item of the iterator. + + """ + size = len(self) + idx = operator.index(idx) + if not -size <= idx < size: + raise IndexError("index {} is out of range".format(idx)) + idx %= size + + return next(islice(iterator, idx, None)) + + def __getitem__( + self, + idx: typing.Union[slice, int], + ) -> typing.Any: + """Get the idx-th item of the sequential query op. + + Parameters + ---------- + idx + Index of the item to get. + + Returns + ------- + Sequential or QueryOp + The idx-th item of the sequential query op. + + """ + if isinstance(idx, slice): + return self.__class__(OrderedDict(list(self._ops.items())[idx])) + + return self._get_item_by_idx(self._ops.values(), idx) # type: ignore + + def __setitem__(self, idx: int, op_: QueryOp) -> None: + """Set the idx-th item of the sequential query op. + + Parameters + ---------- + idx + Index of the item to set. + op_ + Query op to set. + + """ + key: str = self._get_item_by_idx(self._ops.keys(), idx) # type: ignore + return setattr(self, key, op_) + + def __delitem__(self, idx: typing.Union[slice, int]) -> None: + """Delete the idx-th item of the sequential query op. + + Parameters + ---------- + idx + Index of the item to delete. + + """ + if isinstance(idx, slice): + for key in list(self._ops.keys())[idx]: + delattr(self, key) + else: + key = self._get_item_by_idx(self._ops.keys(), idx) # type: ignore + delattr(self, key) + str_indices = [str(i) for i in range(len(self._ops))] + self._ops = OrderedDict(list(zip(str_indices, self._ops.values()))) + + def append(self, op_: QueryOp) -> "Sequential": + """Append a given query op to the end. + + Parameters + ---------- + op_ + Query op to append. + + Returns + ------- + Sequential + Sequential object with the query op appended. + + """ + self._add_op(str(len(self)), op_) + return self + + def pop(self, key: typing.Union[int, slice]) -> QueryOp: + """Pop the query op at the given index. + + Parameters + ---------- + key + Index of the query op to pop. + + Returns + ------- + QueryOp + Popped query op. + + """ + v = self[key] + del self[key] + + return v # type: ignore + + def insert(self, index: int, op_: QueryOp) -> "Sequential": + """Insert a given query op at the given index. + + Parameters + ---------- + index + Index to insert the query op at. + op_ + Query op to insert. + + Returns + ------- + Sequential + Sequential object with the query op inserted. + + """ + if not isinstance(op_, QueryOp): + raise AssertionError("Module should be of type: {}".format(QueryOp)) + n = len(self._ops) + if not (-n <= index <= n): + raise IndexError("Index out of range: {}".format(index)) + if index < 0: + index += n + for i in range(n, index, -1): + self._ops[str(i)] = self._ops[str(i - 1)] + self._ops[str(index)] = op_ + + return self + + def extend(self, sequential: "Sequential") -> "Sequential": + """Extend the sequential query op with another sequential query op. + + Parameters + ---------- + sequential + Sequential object to extend with. + + Returns + ------- + Sequential + Sequential object with the other sequential query op extended. + + """ + for op_ in sequential: + self.append(op_) + + return self + + @table_params_to_type(Subquery) + def __call__(self, table: TableTypes) -> Subquery: + """Execute the query operations on the table. + + Parameters + ---------- + table + Table to be queried. + + Returns + ------- + Subquery + Query result after chaining the query operations. + + """ + return _chain_ops(table, self._get_ops()) + + +def _append_if_missing( + table: TableTypes, + keep_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, + force_include_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, +) -> Subquery: + """Keep only certain columns in a table, but must include certain columns. + + Parameters + ---------- + table + Table on which to perform the operation. + keep_cols + Columns to keep. + force_include_cols + Columns to include (forcefully). + + """ + if keep_cols is None: + return table + keep_cols = to_list(keep_cols) + force_include_cols = to_list(force_include_cols) + extend_cols = [col for col in force_include_cols if col not in keep_cols] + keep_cols = extend_cols + keep_cols + + return Keep(keep_cols)(table) + + +def _none_add(obj1: typing.Any, obj2: typing.Any) -> typing.Any: + """Add two objects together while ignoring None values. + + If both objects are None, returns None. + + Parameters + ---------- + obj1 + First object to add. + obj2 + Second object to add. + + Returns + ------- + typing.Any + Result of adding the two objects. + + """ + if obj1 is None: + return obj2 + if obj2 is None: + return obj1 + return obj1 + obj2 + + +def _process_checks( + table: TableTypes, + cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, + cols_not_in: typing.Optional[typing.Union[str, typing.List[str]]] = None, + timestamp_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, +) -> Subquery: + """Perform checks, and possibly alterations, on a table. + + Parameters + ---------- + table + Table on which to perform the operation. + cols + Columns to check. + timestamp_cols + Timestamp columns to check. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Checked and possibly altered table. + + """ + if cols is not None: + cols = to_list(cols) + has_columns(table, cols, raise_error=True) + if cols_not_in is not None: + cols_not_in = to_list(cols_not_in) + if has_columns(table, cols_not_in, raise_error=False): + raise ValueError(f"Cannot specify columns {cols_not_in}.") + if timestamp_cols is not None: + timestamp_cols = to_list(timestamp_cols) + has_columns(table, timestamp_cols, raise_error=True) + check_timestamp_columns(table, timestamp_cols, raise_error=True) + + return table + + +class FillNull(QueryOp): + """Fill NULL values with a given value. + + Parameters + ---------- + cols + Columns to fill. + fill_values + Value(s) to fill with. + new_col_names + New column name(s) for the filled columns. If not provided, + + Examples + -------- + >>> FillNull("col1", 0)(table) + >>> FillNull(["col1", "col2"], [0, 1])(table) + >>> FillNull(["col1", "col2"], [0, 1], ["col1_new", "col2_new"])(table) + + """ + + def __init__( + self, + cols: typing.Union[str, typing.List[str]], + fill_values: typing.Union[typing.Any, typing.List[typing.Any]], + new_col_names: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ) -> None: + super().__init__() + self.cols = cols + self.fill_values = fill_values + self.new_col_names = new_col_names + + def __call__(self, table: TableTypes) -> Subquery: + """Fill NULL values with a given value. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + Subquery + Table with NULL values filled. + + """ + cols = to_list(self.cols) + fill_values = to_list(self.fill_values) + new_col_names = to_list_optional(self.new_col_names) + if new_col_names and len(cols) != len(new_col_names): + raise ValueError( + """Number of columns to fill and number of new column names + must match.""", + ) + table = _process_checks(table, cols=self.cols) + if len(fill_values) == 1: + fill_values = fill_values * len(cols) + for col, fill in zip(cols, fill_values): + coalesced_col = func.coalesce(table.c[col], fill).label( + f"coalesced_col_{col}", + ) + table = select([table, coalesced_col]).subquery() + if new_col_names: + for col, new_col in zip(cols, new_col_names): + table = Rename({f"coalesced_col_{col}": new_col})(table) + else: + for col in cols: + table = drop_columns(table, col) + table = Rename({f"coalesced_col_{col}": col})(table) + + return table + + +class Drop(QueryOp): + """Drop some columns. + + Parameters + ---------- + cols + Columns to drop. + + Examples + -------- + >>> Drop("col1")(table) + >>> Drop(["col1", "col2"])(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]]) -> None: + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.cols) + + return drop_columns(table, self.cols) + + +class Rename(QueryOp): + """Rename some columns. + + Parameters + ---------- + rename_map + Map from an existing column name to another name. + check_exists + Whether to check if all of the keys in the map exist as columns. + + Examples + -------- + >>> Rename({"col1": "col1_new"})(table) + + """ + + def __init__(self, rename_map: typing.Dict[str, str], check_exists: bool = True): + super().__init__() + self.rename_map = rename_map + self.check_exists = check_exists + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if self.check_exists: + table = _process_checks(table, cols=list(self.rename_map.keys())) + + return rename_columns(table, self.rename_map) + + +class Substring(QueryOp): + """Get substring of a string column. + + Parameters + ---------- + col + Name of column which has string, where substring needs + to be extracted. + start_index + Start index of substring. + stop_index + Stop index of substring. + new_col_name + Name of the new column with extracted substring. + + Examples + -------- + >>> Substring("col1", 0, 2, "col1_substring")(table) + + """ + + def __init__( + self, + col: str, + start_index: int, + stop_index: int, + new_col_label: typing.Optional[str] = None, + ): + super().__init__() + self.col = col + self.start_index = start_index + self.stop_index = stop_index + self.new_col_label = new_col_label + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.col, cols_not_in=self.new_col_label) + + return apply_to_columns( + table, + self.col, + lambda x: func.substr( + process_column(x, to_str=True), + self.start_index, + self.stop_index, + ), + new_col_labels=self.new_col_label, + ) + + +class Reorder(QueryOp): + """Reorder the columns in a table. + + Parameters + ---------- + cols + Complete list of table column names in the new order. + + Examples + -------- + >>> Reorder(["col2", "col1"])(table) + + """ + + def __init__(self, cols: typing.List[str]): + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.cols) + + return reorder_columns(table, self.cols) + + +class ReorderAfter(QueryOp): + """Reorder a number of columns to come after a specified column. + + Parameters + ---------- + cols + Ordered list of column names which will come after a specified column. + after + Column name for the column after which the other columns will follow. + + Examples + -------- + >>> ReorderAfter(["col2", "col1"], "col3")(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]], after: str): + super().__init__() + self.cols = cols + self.after = after + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + self.cols = to_list(self.cols) + table = _process_checks(table, cols=self.cols + [self.after]) + names = get_column_names(table) + names = [name for name in names if name not in self.cols] + name_after_ind = names.index(self.after) + 1 + new_order = names[:name_after_ind] + self.cols + names[name_after_ind:] + + return Reorder(new_order)(table) + + +class Keep(QueryOp): + """Keep only the specified columns in a table. + + Parameters + ---------- + cols + The columns to keep. + + Examples + -------- + >>> Keep("col1")(table) + >>> Keep(["col1", "col2"])(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]]): + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.cols) + + return filter_columns(table, self.cols) + + +class Trim(QueryOp): + """Trim the whitespace from some string columns. + + Parameters + ---------- + cols + Columns to trim. + new_col_labels + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Examples + -------- + >>> Trim("col1")(table) + >>> Trim(["col1", "col2"])(table) + >>> Trim("col1", "col1_trimmed")(table) + >>> Trim(["col1", "col2"], ["col1_trimmed", "col2_trimmed"])(table) + + """ + + def __init__( + self, + cols: typing.Union[str, typing.List[str]], + new_col_labels: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ): + super().__init__() + self.cols = cols + self.new_col_labels = new_col_labels + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.cols) + + return trim_columns(table, self.cols, new_col_labels=self.new_col_labels) + + +class Literal(QueryOp): + """Add a literal column to a table. + + Parameters + ---------- + value + Value of the literal, e.g., a string or integer. + col + Label of the new literal column. + + Examples + -------- + >>> Literal(1, "col1")(table) + + """ + + def __init__(self, value: typing.Any, col: str): + super().__init__() + self.value = value + self.col = col + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols_not_in=self.col) + + return select(table, literal(self.value).label(self.col)).subquery() + + +class ExtractTimestampComponent(QueryOp): + """Extract a component such as year or month from a timestamp column. + + Parameters + ---------- + timestamp_col + Timestamp column from which to extract the time component. + extract_str + Information to extract, e.g., "year", "month" + label + Column label for the extracted column. + + Examples + -------- + >>> ExtractTimestampComponent("col1", "year", "year")(table) + >>> ExtractTimestampComponent("col1", "month", "month")(table) + + """ + + def __init__(self, timestamp_col: str, extract_str: str, label: str): + super().__init__() + self.timestamp_col = timestamp_col + self.extract_str = extract_str + self.label = label + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks( + table, + timestamp_cols=self.timestamp_col, + cols_not_in=self.label, + ) + table = select( + table, + extract(self.extract_str, get_column(table, self.timestamp_col)).label( + self.label, + ), + ) + + return Cast(self.label, "int")(table) + + +class AddNumeric(QueryOp): + """Add a numeric value to some columns. + + Parameters + ---------- + add_to + Column names specifying to which columns is being added. + add + Adds this value to the add_to columns. + new_col_labels + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Examples + -------- + >>> AddNumeric("col1", 1)(table) + >>> AddNumeric(["col1", "col2"], 1)(table) + >>> AddNumeric("col1", 1, "col1_plus_1")(table) + >>> AddNumeric(["col1", "col2"], 1, ["col1_plus_1", "col2_plus_1"])(table) + >>> AddNumeric(["col1", "col2"], [1, 2.2])(table) + + """ + + def __init__( + self, + add_to: typing.Union[str, typing.List[str]], + add: typing.Union[int, float, typing.List[int], typing.List[float]], + new_col_labels: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ): + super().__init__() + self.add_to = add_to + self.add = add + self.new_col_labels = new_col_labels + + def _gen_lambda( + self, + add: typing.Union[int, float], + ) -> typing.Callable[[sqlalchemy.sql.schema.Column], sqlalchemy.sql.schema.Column]: + """Generate the lambda function.""" + return lambda x: x + add + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks( + table, + cols=self.add_to, + cols_not_in=self.new_col_labels, + ) + self.add_to = to_list(self.add_to) + if isinstance(self.add, (int, float)) and len(self.add_to) > 1: + add = [self.add] * len(self.add_to) + elif isinstance(self.add, (int, float)) and len(self.add_to) == 1: + add = [self.add] + elif isinstance(self.add, list) and len(self.add_to) != len(self.add): + raise ValueError( + "Length of add_to and add must be the same if add is a list.", + ) + + return apply_to_columns( + table, + self.add_to, + [self._gen_lambda(add_num) for add_num in add], + new_col_labels=self.new_col_labels, + ) + + +class AddDeltaConstant(QueryOp): + """Construct and add a datetime.timedelta object to some columns. + + Parameters + ---------- + add_to + Column names specifying to which columns is being added. + delta + A timedelta object. + new_col_labels + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Examples + -------- + >>> AddDeltaConstant("col1", datetime.timedelta(days=1))(table) + >>> AddDeltaConstant(["col1", "col2"], datetime.timedelta(days=1))(table) + >>> AddDeltaConstant("col1", datetime.timedelta(days=1), "col1_plus_1")(table) + + """ + + def __init__( + self, + add_to: typing.Union[str, typing.List[str]], + delta: timedelta, + new_col_labels: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ): + super().__init__() + self.add_to = add_to + self.delta = delta + self.new_col_labels = new_col_labels + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks( + table, + timestamp_cols=self.add_to, + cols_not_in=self.new_col_labels, + ) + + return apply_to_columns( + table, + self.add_to, + lambda x: x + self.delta, + new_col_labels=self.new_col_labels, + ) + + +class AddColumn(QueryOp): + """Add a column to some columns. + + Parameters + ---------- + add_to + Column names specifying to which columns is being added. + col + Column name of column to add to the add_to columns. + negative + Subtract the column rather than adding. + new_col_labels + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Examples + -------- + >>> AddColumn("col1", "col2")(table) + >>> AddColumn(["col1", "col2"], "col3")(table) + >>> AddColumn("col1", "col2", negative=True)(table) + >>> AddColumn("col1", "col2", "col1_plus_col2")(table) + >>> AddColumn(["col1", "col2"], "col3", ["col1_plus_col3", "col2_plus_col3"])(table) + + Warning + ------- + Pay attention to column types. Some combinations will work, + whereas others will not. + + """ + + def __init__( + self, + add_to: typing.Union[str, typing.List[str]], + col: str, + negative: typing.Optional[bool] = False, + new_col_labels: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ): + super().__init__() + self.add_to = add_to + self.col = col + self.negative = negative + self.new_col_labels = new_col_labels + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + # If the column being added is a timestamp column, ensure the others are too + if check_timestamp_columns(table, self.col): + table = _process_checks( + table, + timestamp_cols=self.add_to, + cols_not_in=self.new_col_labels, + ) + else: + table = _process_checks( + table, + cols=self.add_to, + cols_not_in=self.new_col_labels, + ) + col = get_column(table, self.col) + if self.negative: + return apply_to_columns( + table, + self.add_to, + lambda x: x - col, + new_col_labels=self.new_col_labels, + ) + + return apply_to_columns( + table, + self.add_to, + lambda x: x + col, + new_col_labels=self.new_col_labels, + ) + + +class AddDeltaColumn(QueryOp): + """Construct and add an interval column to some columns. + + Parameters + ---------- + add_to + Column names specifying to which columns is being added. + negative + Subtract the object rather than adding. + new_col_labels + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + **delta_kwargs + The arguments used to create the Interval column. + + Examples + -------- + >>> AddDeltaColumn("col1", "col2")(table) + >>> AddDeltaColumn(["col1", "col2"], "col3")(table) + >>> AddDeltaColumn("col1", "col2", negative=True)(table) + >>> AddDeltaColumn("col1", "col2", "col1_plus_col2")(table) + + """ + + def __init__( + self, + add_to: typing.Union[str, typing.List[str]], + negative: typing.Optional[bool] = False, + new_col_labels: typing.Optional[typing.Union[str, typing.List[str]]] = None, + **delta_kwargs: typing.Any, + ) -> None: + super().__init__() + self.add_to = add_to + self.negative = negative + self.new_col_labels = new_col_labels + self.delta_kwargs = delta_kwargs + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks( + table, + timestamp_cols=self.add_to, + cols_not_in=self.new_col_labels, + ) + delta = get_delta_column(table, **self.delta_kwargs) + if self.negative: + return apply_to_columns( + table, + self.add_to, + lambda x: x - delta, + new_col_labels=self.new_col_labels, + ) + + return apply_to_columns( + table, + self.add_to, + lambda x: x + delta, + new_col_labels=self.new_col_labels, + ) + + +class Cast(QueryOp): + """Cast columns to a specified type. + + Currently supporting conversions to str, int, float, date, bool and timestamp. + + Parameters + ---------- + cols + Columns to cast. + type_ + Name of type to which to convert. Must be supported. + + Examples + -------- + >>> Cast("col1", "str")(table) + >>> Cast(["col1", "col2"], "int")(table) + >>> Cast("col1", "float")(table) + >>> Cast("col1", "date")(table) + >>> Cast("col1", "bool")(table) + >>> Cast("col1", "timestamp")(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]], type_: str): + super().__init__() + self.cols = cols + self.type_ = type_ + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table, cols=self.cols) + cast_type_map = { + "str": "to_str", + "int": "to_int", + "float": "to_float", + "date": "to_date", + "bool": "to_bool", + "timestamp": "to_timestamp", + } + # Assert that the type inputted is supported + if self.type_ not in cast_type_map: + supported_str = ", ".join(list(cast_type_map.keys())) + raise ValueError( + f"""Conversion to type {self.type_} not supported. Supporting + conversion to types {supported_str}""", + ) + # Cast + kwargs = {cast_type_map[self.type_]: True} + + return apply_to_columns( + table, + self.cols, + lambda x: process_column(x, **kwargs), + ) + + +class Union(QueryOp): + """Union two tables. + + Parameters + ---------- + union_table + Table to union with the first table. + union_all + Whether to use the all keyword in the union. + + Examples + -------- + >>> Union(table2)(table1) + >>> Union(table2, union_all=True)(table1) + + """ + + def __init__( + self, + union_table: TableTypes, + union_all: typing.Optional[bool] = False, + ): + super().__init__() + self.union_table = union_table + self.union_all = union_all + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + table = _process_checks(table) + union_table = _process_checks(self.union_table) + if self.union_all: + return select(table).union_all(select(union_table)).subquery() + + return select(table).union(select(union_table)).subquery() + + +class Join(QueryOp): + """Join a table with another table. + + Parameters + ---------- + join_table + Table on which to join. + on + A list of strings or tuples representing columns on which to join. + Strings represent columns of same name in both tables. A tuple of + style (table_col, join_table_col) is used to join on columns of + different names. Suggested to specify this parameter as opposed to + cond. + on_to_type + A list of types to which to convert the on columns before joining. Useful when + two columns have the same values but in different format, e.g., strings of int. + cond + Condition on which to join to tables. + table_cols + Filters to keep only these columns from the table. + join_table_cols + Filters to keep only these columns from the join_table. + isouter + Flag to say if the join is a left outer join. + + Examples + -------- + >>> Join(table2, on=["col1", ("col2", "col3")], on_to_type=[int, str])(table1) + >>> Join(table2, table_cols=["col1", "col2"])(table1) + >>> Join(table2, join_table_cols=["col1", "col2"])(table1) + + Warnings + -------- + If neither on nor cond parameters are specified, an + expensive Cartesian product is performed. + + """ + + @table_params_to_type(Subquery) + def __init__( + self, + join_table: TableTypes, + on: typing.Optional[ + typing.Union[ + str, + typing.List[str], + typing.Tuple[str], + typing.List[typing.Tuple[str, str]], + ] + ] = None, + on_to_type: typing.Optional[typing.Union[type, typing.List[type]]] = None, + cond: typing.Optional[BinaryExpression] = None, + table_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, + join_table_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, + isouter: typing.Optional[bool] = False, + ) -> None: + super().__init__() + if on is not None and cond is not None: + raise ValueError("Cannot specify both the 'on' and 'cond' arguments.") + + self.join_table = join_table + self.cond = cond + self.on_ = to_list_optional(on) + self.on_to_type = to_list_optional(on_to_type) + self.table_cols = to_list_optional(table_cols) + self.join_table_cols = to_list_optional(join_table_cols) + self.isouter = isouter + + @table_params_to_type(Subquery) + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + # Join on the equality of values in columns of same name in both tables + if self.on_ is not None: + # Process on columns + on_table_cols = [ + col_obj if isinstance(col_obj, str) else col_obj[0] + for col_obj in self.on_ + ] + on_join_table_cols = [ + col_obj if isinstance(col_obj, str) else col_obj[1] + for col_obj in self.on_ + ] + table = _process_checks( + table, + cols=_none_add(self.table_cols, on_table_cols), + ) + self.join_table = _process_checks( + self.join_table, + cols=_none_add(self.join_table_cols, on_join_table_cols), + ) + # Filter columns, keeping those being joined on + table = _append_if_missing(table, self.table_cols, on_table_cols) + self.join_table = _append_if_missing( + self.join_table, + self.join_table_cols, + on_join_table_cols, + ) + # Perform type conversions if given + if self.on_to_type is not None: + for i, type_ in enumerate(self.on_to_type): + table = Cast(on_table_cols[i], type_)(table) + self.join_table = Cast(on_join_table_cols[i], type_)( + self.join_table, + ) + cond = and_( + *[ + get_column(table, on_table_cols[i]) + == get_column(self.join_table, on_join_table_cols[i]) + for i in range(len(on_table_cols)) + ], + ) + table = select(table.join(self.join_table, cond, isouter=self.isouter)) + else: + # Filter columns + if self.table_cols is not None: + table = Keep(self.table_cols)(table) + if self.join_table_cols is not None: + self.join_table = Keep(self.table_cols)(self.join_table) # type: ignore + + # Join on a specified condition + if self.cond is not None: + table = select( + table.join( # type: ignore + self.join_table, + self.cond, + isouter=self.isouter, + ), + ) + # Join on no condition, i.e., a Cartesian product + else: + LOGGER.warning("A Cartesian product has been queried.") + table = select(table, self.join_table) + + # Filter to include no duplicate columns + return select( + *[col for col in table.subquery().columns if "%(" not in col.name], + ).subquery() + + +class ConditionEquals(QueryOp): + """Filter rows based on being equal, or not equal, to some value. + + Parameters + ---------- + col + Column name on which to condition. + value + Value to equal. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionEquals("col1", 1)(table) + >>> ConditionEquals("col1", 1, binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + value: typing.Any, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.value = value + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = equals( + get_column(table, self.col), + self.value, + True, + True, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionGreaterThan(QueryOp): + """Filter rows based on greater than (or equal), to some value. + + Parameters + ---------- + col + Column name on which to condition. + value + Value greater than. + equal + Include equality to the value. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionGreaterThan("col1", 1)(table) + >>> ConditionGreaterThan("col1", 1, binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + value: typing.Any, + equal: bool = False, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.value = value + self.equal = equal + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = greater_than( + get_column(table, self.col), + self.value, + True, + True, + self.equal, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionLessThan(QueryOp): + """Filter rows based on less than (or equal), to some value. + + Parameters + ---------- + col + Column name on which to condition. + value + Value greater than. + equal + Include equality to the value. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionLessThan("col1", 1)(table) + >>> ConditionLessThan("col1", 1, binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + value: typing.Any, + equal: bool = False, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.value = value + self.equal = equal + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = less_than( + get_column(table, self.col), + self.value, + True, + True, + self.equal, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionRegexMatch(QueryOp): + """Filter rows based on matching a regular expression. + + Parameters + ---------- + col + Column name on which to condition. + regex + Regular expression to match. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionRegexMatch("col1", ".*")(table) + >>> ConditionRegexMatch("col1", ".*", binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + regex: str, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.col = col + self.regex = regex + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = get_column(table, self.col).regexp_match(self.regex) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionIn(QueryOp): + """Filter rows based on having a value in list of values. + + Parameters + ---------- + col + Column name on which to condition. + values + Values in which the column value must be. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionIn("col1", [1, 2])(table) + >>> ConditionIn("col1", [1, 2], binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + values: typing.Union[typing.Any, typing.List[typing.Any]], + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.values = values + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = in_( + get_column(table, self.col), + to_list(self.values), + True, + True, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionSubstring(QueryOp): + """Filter rows on based on having substrings. + + Can be specified whether it must have any or all of the specified substrings. + This makes no difference when only one substring is provided + + Parameters + ---------- + col + Column name on which to condition. + substrings + Substrings. + any_ + If true, the row must have just one of the substrings. If false, it must + have all of the substrings. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionSubstring("col1", ["a", "b"])(table) + >>> ConditionSubstring("col1", ["a", "b"], any_=False)(table) + >>> ConditionSubstring("col1", ["a", "b"], binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + substrings: typing.Union[str, typing.List[str]], + any_: bool = True, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.substrings = to_list(substrings) + self.any_ = any_ + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + conds = [ + has_substring(get_column(table, self.col), sub, True, **self.cond_kwargs) + for sub in self.substrings + ] + cond = or_(*conds) if self.any_ else and_(*conds) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionStartsWith(QueryOp): + """Filter rows based on starting with some string. + + Parameters + ---------- + col: str + Column name on which to condition. + string: any + String. + not_: bool, default=False + Take negation of condition. + binarize_col: str, optional + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionStartsWith("col1", "a")(table) + >>> ConditionStartsWith("col1", "a", binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + string: str, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.string = string + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = starts_with( + get_column(table, self.col), + self.string, + True, + True, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionEndsWith(QueryOp): + """Filter rows based on ending with some string. + + Parameters + ---------- + col + Column name on which to condition. + string + String to end with. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + **cond_kwargs + Optional keyword arguments for processing the condition. + + Examples + -------- + >>> ConditionEndsWith("col1", "a")(table) + >>> ConditionEndsWith("col1", "a", binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + col: str, + string: str, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + **cond_kwargs: typing.Any, + ) -> None: + super().__init__() + self.col = col + self.string = string + self.not_ = not_ + self.binarize_col = binarize_col + self.cond_kwargs = cond_kwargs + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col, cols_not_in=self.binarize_col) + cond = ends_with( + get_column(table, self.col), + self.string, + True, + True, + **self.cond_kwargs, + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionInYears(QueryOp): + """Filter rows based on a timestamp column being in a list of years. + + Parameters + ---------- + timestamp_col + Timestamp column name. + years + Years in which the timestamps must be. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionInYears("col1", [2019, 2020])(table) + >>> ConditionInYears("col1", 2019)(table) + >>> ConditionInYears("col1", 2019, binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + timestamp_col: str, + years: typing.Union[int, typing.List[int]], + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.timestamp_col = timestamp_col + self.years = years + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks( + table, + cols=self.timestamp_col, + cols_not_in=self.binarize_col, + ) + cond = in_( + extract("year", get_column(table, self.timestamp_col)), + to_list(self.years), + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionInMonths(QueryOp): + """Filter rows based on a timestamp being in a list of years. + + Parameters + ---------- + timestamp_col + Timestamp column name. + months + Months in which the timestamps must be. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionInMonths("col1", [1, 2])(table) + >>> ConditionInMonths("col1", 1)(table) + >>> ConditionInMonths("col1", 1, binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + timestamp_col: str, + months: typing.Union[int, typing.List[int]], + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.timestamp_col = timestamp_col + self.months = months + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks( + table, + cols=self.timestamp_col, + cols_not_in=self.binarize_col, + ) + cond = in_( + extract("month", get_column(table, self.timestamp_col)), + to_list(self.months), + ) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionBeforeDate(QueryOp): + """Filter rows based on a timestamp being before some date. + + Parameters + ---------- + timestamp_col + Timestamp column name. + timestamp + A datetime object or str in YYYY-MM-DD format. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionBeforeDate("col1", "2020-01-01")(table) + >>> ConditionBeforeDate("col1", datetime.datetime(2020, 1, 1))(table) + >>> ConditionBeforeDate("col1", "2020-01-01", binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + timestamp_col: str, + timestamp: typing.Union[str, datetime], + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.timestamp_col = timestamp_col + self.timestamp = timestamp + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, timestamp_cols=self.timestamp_col) + if isinstance(self.timestamp, str): + timestamp = to_datetime_format(self.timestamp) + else: + timestamp = self.timestamp + cond = get_column(table, self.timestamp_col) <= timestamp + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionAfterDate(QueryOp): + """Filter rows based on a timestamp being after some date. + + Parameters + ---------- + timestamp_col + Timestamp column name. + timestamp + A datetime object or str in YYYY-MM-DD format. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionAfterDate("col1", "2020-01-01")(table) + >>> ConditionAfterDate("col1", datetime.datetime(2020, 1, 1))(table) + >>> ConditionAfterDate("col1", "2020-01-01", binarize_col="col1_bool")(table) + + """ + + def __init__( + self, + timestamp_col: str, + timestamp: typing.Union[str, datetime], + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.timestamp_col = timestamp_col + self.timestamp = timestamp + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, timestamp_cols=self.timestamp_col) + if isinstance(self.timestamp, str): + timestamp = to_datetime_format(self.timestamp) + else: + timestamp = self.timestamp + cond = get_column(table, self.timestamp_col) >= timestamp + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class ConditionLike(QueryOp): + """Filter rows by a LIKE condition. + + Parameters + ---------- + col + Column to filter on. + pattern + Pattern to filter on. + not_ + Take negation of condition. + binarize_col + If specified, create a Boolean column of name binarize_col instead of filtering. + + Examples + -------- + >>> ConditionLike("lab_name", "HbA1c")(table) + >>> ConditionLike("lab_name", "HbA1c", not_=True)(table) + >>> ConditionLike("lab_name", "HbA1c", binarize_col="lab_name_bool")(table) + + """ + + def __init__( + self, + col: str, + pattern: str, + not_: bool = False, + binarize_col: typing.Optional[str] = None, + ): + super().__init__() + self.col = col + self.pattern = pattern + self.not_ = not_ + self.binarize_col = binarize_col + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + if return_cond and self.binarize_col: + raise ValueError( + "Cannot return condition and binarize column simultaneously.", + ) + table = _process_checks(table, cols=self.col) + cond = get_column(table, self.col).like(self.pattern) + if self.not_: + cond = cond._negate() + if return_cond: + return cond + if self.binarize_col is not None: + return select( + table, + cast(cond, Boolean).label(self.binarize_col), + ).subquery() + + return select(table).where(cond).subquery() + + +class Or(QueryOp): + """Combine multiple condition query ops using an OR. + + Parameters + ---------- + cond_ops + Condition Query ops to combine. + + Examples + -------- + >>> Or(ConditionLike("lab_name", "HbA1c"), ConditionIn("name", ["John", "Jane"])) + >>> Or([ConditionLike("lab_name", "HbA1c"), ConditionIn("name", ["John", "Jane"])]) + + """ + + def __init__(self, *cond_ops: typing.Union[QueryOp, typing.List[QueryOp]]): + super().__init__() + self.cond_ops = cond_ops + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + ops = [] + for cond_op in self.cond_ops: + if isinstance(cond_op, list): + if len(self.cond_ops) != 1: + raise ValueError("Cannot combine multiple lists of conditions.") + ops = [op(table, return_cond=True) for op in cond_op] + if isinstance(cond_op, QueryOp): + if len(self.cond_ops) == 1: + return cond_op(table, return_cond=return_cond) + ops.append(cond_op(table, return_cond=True)) + cond = or_(*ops) + if return_cond: + return cond + + return select(table).where(cond).subquery() + + +class And(QueryOp): + """Combine multiple condition query ops using an And. + + Parameters + ---------- + ops + Query ops to combine. + + Examples + -------- + >>> And([ConditionLike("lab_name", "HbA1c"), ConditionIn("name", ["John", "Jane"])]) + >>> And(ConditionLike("lab_name", "HbA1c"), ConditionIn("name", ["John", "Jane"])) + + """ + + def __init__(self, *cond_ops: typing.Union[QueryOp, typing.List[QueryOp]]): + super().__init__() + self.cond_ops = cond_ops + + def __call__(self, table: TableTypes, return_cond: bool = False) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + return_cond + Return the condition instead of filtering. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + ops = [] + for cond_op in self.cond_ops: + if isinstance(cond_op, list): + if len(self.cond_ops) != 1: + raise ValueError("Cannot combine multiple lists of conditions.") + ops = [op(table, return_cond=True) for op in cond_op] + if isinstance(cond_op, QueryOp): + if len(self.cond_ops) == 1: + return cond_op(table, return_cond=return_cond) + ops.append(cond_op(table, return_cond=True)) + cond = and_(*ops) + if return_cond: + return cond + + return select(table).where(cond).subquery() + + +class Limit(QueryOp): + """Limit the number of rows returned in a query. + + Parameters + ---------- + number + Number of rows to return in the limit. + + Examples + -------- + >>> Limit(10)(table) + + """ + + def __init__(self, number: int): + super().__init__() + self.number = number + + @table_params_to_type(Select) + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + return table.limit(self.number).subquery() # type: ignore + + +class RandomizeOrder(QueryOp): + """Randomize order of table rows. + + Useful when the data is ordered, so certain rows cannot + be seen or analyzed when limited. + + Examples + -------- + >>> RandomizeOrder()(table) + + Warnings + -------- + Becomes quite slow on large tables. + + """ + + @table_params_to_type(Subquery) + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + return select(table).order_by(func.random()).subquery() + + +class DropNulls(QueryOp): + """Remove rows with null values in some specified columns. + + Parameters + ---------- + cols + Columns in which, if a value is null, the corresponding row is removed. + + Examples + -------- + >>> DropNulls("col1")(table) + >>> DropNulls(["col1", "col2"])(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]]): + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + self.cols = to_list(self.cols) + table = _process_checks(table, cols=self.cols) + + cond = and_(*[not_equals(get_column(table, col), None) for col in self.cols]) + return select(table).where(cond).subquery() + + +class DropEmpty(QueryOp): + """Remove rows with empty values in some specified columns. + + Parameters + ---------- + cols + Columns in which, if a value is empty, the corresponding row is removed. + + Examples + -------- + >>> DropEmpty("col1")(table) + >>> DropEmpty(["col1", "col2"])(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]]): + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + self.cols = to_list(self.cols) + table = _process_checks(table, cols=self.cols) + + cond = and_(*[not_equals(get_column(table, col), "") for col in self.cols]) + return select(table).where(cond).subquery() + + +class Apply(QueryOp): + """Apply function(s) to column(s). + + The function can take a sqlalchemy column object and also return a column object. + It can also take multiple columns and return a single column or multiple columns. + If multiple functions are provided, it is assumed that each function is applied to + each input column. + + Parameters + ---------- + cols + Column(s) to apply the function to. + funcs + Function(s) that takes in sqlalchemy column(s) object and returns column(s) + after applying the function or list of functions to apply to each column. + new_cols + New column name(s) after function is applied to the specified column(s). + + Examples + -------- + >>> Apply("col1", lambda x: x + 1)(table) + >>> Apply(["col1", "col2"], [lambda x: x + 1, lambda x: x + 2])(table) + >>> Apply("col1", lambda x: x + 1, new_cols="col1_new")(table) + >>> Apply(["col1", "col2"], lambda x, y: x + y, new_cols="col1_new")(table) + >>> Apply(["col1", "col2"], lambda x, y: (x + y, x - y), new_cols=["col1_new", "col2_new"])(table) # noqa: E501, pylint: disable=line-too-long + + """ + + def __init__( + self, + cols: typing.Union[str, typing.List[str]], + funcs: typing.Union[ + typing.Callable[ + [sqlalchemy.sql.schema.Column], + sqlalchemy.sql.schema.Column, + ], + typing.List[ + typing.Callable[ + [sqlalchemy.sql.schema.Column], + sqlalchemy.sql.schema.Column, + ] + ], + ], + new_cols: typing.Optional[typing.Union[str, typing.List[str]]] = None, + ): + super().__init__() + self.cols = cols + self.funcs = funcs + self.new_cols = new_cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + self.new_cols = to_list(self.new_cols) + if isinstance(self.funcs, list): + if len(self.funcs) != len(self.cols): + raise ValueError( + "Number of functions must be equal to number of columns.", + ) + if len(self.new_cols) != len(self.cols): + raise ValueError( + "Number of new columns must be equal to number of columns.", + ) + if callable(self.funcs): + cols = get_columns(table, self.cols) + result_cols = [ + self.funcs(*cols).label(new_col) for new_col in self.new_cols + ] # noqa: E501 + + return select(table).add_columns(*result_cols).subquery() + + return apply_to_columns(table, self.cols, self.funcs, self.new_cols) + + +class OrderBy(QueryOp): + """Order, or sort, the rows of a table by some columns. + + Parameters + ---------- + cols + Columns by which to order. + ascending + Whether to order each columns by ascending (True) or descending (False). + If not provided, orders all by ascending. + + Examples + -------- + >>> OrderBy("col1")(table) + >>> OrderBy(["col1", "col2"])(table) + >>> OrderBy(["col1", "col2"], [True, False])(table) + >>> OrderBy(["col1", "col2"], True)(table) + + """ + + def __init__( + self, + cols: typing.Union[str, typing.List[str]], + ascending: typing.Optional[typing.Union[bool, typing.List[bool]]] = None, + ): + super().__init__() + self.cols = cols + self.ascending = ascending + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + self.cols = to_list(self.cols) + ascending = to_list_optional(self.ascending) + table = _process_checks(table, cols=self.cols) + if ascending is None: + ascending = [True] * len(self.cols) + elif len(ascending) != len(self.cols): + raise ValueError( + "If ascending is specified. Must specify for all columns.", + ) + order_cols = [ + col if ascending[i] else col.desc() + for i, col in enumerate(get_columns(table, self.cols)) + ] + + return select(table).order_by(*order_cols).subquery() + + +class GroupByAggregate(QueryOp): + """Aggregate over a group by object. + + Parameters + ---------- + groupby_cols + Columns by which to group. + aggfuncs + Specify a dictionary of key-value pairs: + column name: aggfunc string or + column name: (aggfunc string, new column label) + This labelling prevents the aggregation of the same column using multiple + aggregation functions. + aggseps + Specify a dictionary of key-value pairs: + column name: string_aggfunc separator + If string_agg used as aggfunc for a column, then a separator must be provided + for the same column. + + Examples + -------- + >>> GroupByAggregate("person_id", {"person_id": "count"})(table) + >>> GroupByAggregate("person_id", {"person_id": ("count", "visit_count")})(table) + >>> GroupByAggregate("person_id", {"lab_name": "string_agg"}, {"lab_name": ", "})(table) + >>> GroupByAggregate("person_id", {"lab_name": ("string_agg", "lab_name_agg"}, {"lab_name": ", "})(table) + + """ + + def __init__( + self, + groupby_cols: typing.Union[str, typing.List[str]], + aggfuncs: typing.Union[ + typing.Dict[str, typing.Sequence[str]], + typing.Dict[str, str], + ], + aggseps: typing.Optional[typing.Dict[str, str]] = None, + ): + super().__init__() + self.groupby_cols = groupby_cols + self.aggfuncs = aggfuncs + if aggseps is None: + aggseps = {} + self.aggseps = aggseps + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + str_to_aggfunc = { + "sum": func.sum, + "average": func.avg, + "min": func.min, + "max": func.max, + "count": func.count, + "median": func.percentile_cont(0.5).within_group, + "string_agg": func.string_agg, + } + + aggfunc_tuples = list(self.aggfuncs.items()) + aggfunc_cols = [item[0] for item in aggfunc_tuples] + aggfunc_strs = [ + item[1] if isinstance(item[1], str) else item[1][0] + for item in aggfunc_tuples + ] + + # If not specified, aggregate column names default to that of + # the column being aggregated over + aggfunc_names = [ + aggfunc_cols[i] if isinstance(item[1], str) else item[1][1] + for i, item in enumerate(aggfunc_tuples) + ] + + groupby_names = to_list(self.groupby_cols) + table = _process_checks(table, cols=groupby_names + aggfunc_cols) + + # Error checking + for i, aggfunc_str in enumerate(aggfunc_strs): + if aggfunc_str not in str_to_aggfunc: + allowed_strs = ", ".join(list(str_to_aggfunc.keys())) + raise ValueError( + f"Invalid aggfuncs specified. Allowed values are {allowed_strs}.", + ) + if aggfunc_str == "string_agg" and ( + not bool(self.aggseps) or aggfunc_cols[i] not in self.aggseps + ): + raise ValueError( + f"""Column {aggfunc_cols[i]} needs to be aggregated as string, must specify a separator!""", # noqa: E501 + ) + + all_names = groupby_names + aggfunc_names + if len(all_names) != len(set(all_names)): + raise ValueError( + """Duplicate column names were found. Try naming aggregated columns + to avoid this issue.""", + ) + + # Perform group by + groupby_cols = get_columns(table, groupby_names) + to_agg_cols = get_columns(table, aggfunc_cols) + agg_cols = [] + for i, to_agg_col in enumerate(to_agg_cols): + if aggfunc_strs[i] == "string_agg": + agg_col = str_to_aggfunc[aggfunc_strs[i]]( + to_agg_col, + literal_column(f"'{self.aggseps[aggfunc_cols[i]]}'"), + ) + else: + agg_col = str_to_aggfunc[aggfunc_strs[i]](to_agg_col) + agg_cols.append(agg_col.label(aggfunc_names[i])) + + return select(*groupby_cols, *agg_cols).group_by(*groupby_cols).subquery() + + +class Distinct(QueryOp): + """Get distinct rows. + + Parameters + ---------- + cols + Columns to use for distinct. + + Examples + -------- + >>> Distinct("person_id")(table) + >>> Distinct(["person_id", "visit_id"])(table) + + """ + + def __init__(self, cols: typing.Union[str, typing.List[str]]): + super().__init__() + self.cols = cols + + def __call__(self, table: TableTypes) -> Subquery: + """Process the table. + + Parameters + ---------- + table + Table on which to perform the operation. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Processed table. + + """ + cols = to_list(self.cols) + table = _process_checks(table, cols=cols) + + return select(table).distinct(*get_columns(table, cols)).subquery() diff --git a/cycquery/orm.py b/cycquery/orm.py new file mode 100644 index 0000000..c8abfae --- /dev/null +++ b/cycquery/orm.py @@ -0,0 +1,313 @@ +"""Object Relational Mapper (ORM) using sqlalchemy.""" + +import csv +import logging +import os +import socket +from dataclasses import dataclass +from typing import Dict, List, Literal, Optional, Union +from urllib.parse import quote_plus + +import dask.dataframe as dd +import pandas as pd +import pyarrow.csv as pv +import pyarrow.parquet as pq +from sqlalchemy import MetaData, create_engine, inspect +from sqlalchemy.engine.base import Engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm.session import Session +from sqlalchemy.sql.selectable import Select + +from cycquery.util import ( + DBSchema, + DBTable, + TableTypes, + get_attr_name, + table_params_to_type, +) +from cycquery.utils.file import exchange_extension, process_file_save_path +from cycquery.utils.log import setup_logging +from cycquery.utils.profile import time_function + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +SOCKET_CONNECTION_TIMEOUT = 5 + + +def _get_db_url( + dbms: str, + user: str, + pwd: str, + host: str, + port: int, + database: str, +) -> str: + """Combine to make Database URL string.""" + return f"{dbms}://{user}:{quote_plus(pwd)}@{host}:{str(port)}/{database}" + + +@dataclass +class DatasetQuerierConfig: + """Configuration for the dataset querier. + + Attributes + ---------- + dbms + Database management system. + host + Hostname of database. + port + Port of database. + database + Name of database. + user + Username for database. + password + Password for database. + + """ + + database: str + user: str + password: str + dbms: str = "postgresql" + host: str = "localhost" + port: int = 5432 + + +class Database: + """Database class. + + Attributes + ---------- + config + Configuration stored in a dataclass. + engine + SQL extraction engine. + inspector + Module for schema inspection. + session + Session for ORM. + is_connected + Whether the database is setup, connected and ready to run queries. + + """ + + def __init__(self, config: DatasetQuerierConfig) -> None: + """Instantiate. + + Parameters + ---------- + config + Path to directory with config file, for overrides. + + """ + self.config = config + self.is_connected = False + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(SOCKET_CONNECTION_TIMEOUT) + try: + is_port_open = sock.connect_ex((self.config.host, self.config.port)) + except socket.gaierror: + LOGGER.error("""Server name not known, cannot establish connection!""") + return + if is_port_open: + LOGGER.error( + """Valid server host but port seems open, check if server is up!""", + ) + return + + self.engine = self._create_engine() + self.session = self._create_session() + self._tables: List[str] = [] + self._setup() + self.is_connected = True + LOGGER.info("Database setup, ready to run queries!") + + def _create_engine(self) -> Engine: + """Create an engine.""" + self.conn = _get_db_url( + self.config.dbms, + self.config.user, + self.config.password, + self.config.host, + self.config.port, + self.config.database, + ) + return create_engine( + _get_db_url( + self.config.dbms, + self.config.user, + self.config.password, + self.config.host, + self.config.port, + self.config.database, + ), + ) + + def _create_session(self) -> Session: + """Create session.""" + self.inspector = inspect(self.engine) + + # Create a session for using ORM. + session = sessionmaker(self.engine) + session.configure(bind=self.engine) + + return session() + + def list_tables(self) -> List[str]: + """List tables in a schema. + + Returns + ------- + List[str] + List of table names. + + """ + return self._tables + + def _setup(self) -> None: + """Prepare ORM DB.""" + meta: Dict[str, MetaData] = {} + schemas = self.inspector.get_schema_names() + for schema_name in schemas: + metadata = MetaData(schema=schema_name) + metadata.reflect(bind=self.engine) + meta[schema_name] = metadata + schema = DBSchema(schema_name, meta[schema_name]) + for table_name in meta[schema_name].tables: + table = DBTable(table_name, meta[schema_name].tables[table_name]) + for column in meta[schema_name].tables[table_name].columns: + setattr(table, column.name, column) + if not isinstance(table.name, str): + table.name = str(table.name) + self._tables.append(table.name) + setattr(schema, get_attr_name(table.name), table) + setattr(self, schema_name, schema) + + @time_function + @table_params_to_type(Select) + def run_query( + self, + query: Union[TableTypes, str], + limit: Optional[int] = None, + backend: Literal["pandas", "dask", "datasets"] = "pandas", + index_col: Optional[str] = None, + n_partitions: Optional[int] = None, + ) -> Union[pd.DataFrame, dd.core.DataFrame]: + """Run query. + + Parameters + ---------- + query + Query to run. + limit + Limit query result to limit. + backend + Backend library to use, Pandas or Dask or HF datasets. + index_col + Column which becomes the index, and defines the partitioning. + Should be a indexed column in the SQL server, and any orderable type. + n_partitions + Number of partitions. Check dask documentation for additional details. + + Returns + ------- + pandas.DataFrame or dask.DataFrame + Extracted data from query. + + """ + if isinstance(query, str) and limit is not None: + raise ValueError( + "Cannot use limit argument when running raw SQL string query!", + ) + if backend in ["pandas", "datasets"] and n_partitions is not None: + raise ValueError( + "Partitions not applicable with pandas or datasets backend, use dask!", + ) + # Limit the results returned. + if limit is not None: + query = query.limit(limit) # type: ignore + + # Run the query and return the results. + with self.session.connection(): + if backend == "pandas": + data = pd.read_sql_query(query, self.engine, index_col=index_col) + elif backend == "dask": + data = dd.read_sql_query( # type: ignore + query, + self.conn, + index_col=index_col, + npartitions=n_partitions, + ) + data = data.reset_index(drop=False) + else: + raise ValueError( + "Invalid backend, can either be pandas or dask or datasets!", + ) + LOGGER.info("Query returned successfully!") + + return data + + @time_function + @table_params_to_type(Select) + def save_query_to_csv(self, query: TableTypes, path: str) -> str: + """Save query in a .csv format. + + Parameters + ---------- + query + Query to save. + path + Save path. + + Returns + ------- + str + Processed save path for upstream use. + + """ + path = process_file_save_path(path, "csv") + + with self.session.connection(): + result = self.engine.execute(query) + with open(path, "w", encoding="utf-8") as file_descriptor: + outcsv = csv.writer(file_descriptor) + outcsv.writerow(result.keys()) + outcsv.writerows(result) + + return path + + @time_function + @table_params_to_type(Select) + def save_query_to_parquet(self, query: TableTypes, path: str) -> str: + """Save query in a .parquet format. + + Parameters + ---------- + query + Query to save. + path + Save path. + + Returns + ------- + str + Processed save path for upstream use. + + """ + path = process_file_save_path(path, "parquet") + + # Save to CSV, load with pyarrow, save to Parquet + csv_path = exchange_extension(path, "csv") + self.save_query_to_csv(query, csv_path) + table = pv.read_csv(csv_path) + os.remove(csv_path) + pq.write_table(table, path) + + return path diff --git a/cycquery/post_process/__init__.py b/cycquery/post_process/__init__.py new file mode 100644 index 0000000..958c2f8 --- /dev/null +++ b/cycquery/post_process/__init__.py @@ -0,0 +1 @@ +"""Query post-process functions for datasets.""" diff --git a/cycquery/post_process/gemini.py b/cycquery/post_process/gemini.py new file mode 100644 index 0000000..6fa5e16 --- /dev/null +++ b/cycquery/post_process/gemini.py @@ -0,0 +1,44 @@ +"""Post-processing functions applied to queried GEMINI data (Pandas DataFrames).""" + +import pandas as pd +from cyclops.query.post_process.util import process_care_unit_changepoints + + +CARE_UNIT_HIERARCHY = [ + "ER", + "Emergency", + "ICU", + "SCU", + "Peri-op", + "Palliative", + "Step-down", + "Rehab", + "Other ward", + "GIM ward", + "IP", +] + + +def process_gemini_care_unit_changepoints(data: pd.DataFrame) -> pd.DataFrame: + """Process GEMINI changepoint care unit information in a hierarchical fashion. + + Using the admit, discharge, and care unit information, create a + changepoint DataFrame usable for aggregation labelling purposes. + If a patient is in multiple care units at a changepoint, the care + unit highest in the hierarchy is selected. + + Parameters + ---------- + data: pandas.DataFrame + The admit, discharge, and care unit information for a single encounter. + Expects columns "admit", "discharge", and CARE_UNIT. + care_unit_hierarchy: list + Ordered list of care units from most relevant to to least. + + Returns + ------- + pandas.DataFrame + Changepoint information with associated care unit. + + """ + return process_care_unit_changepoints(data, CARE_UNIT_HIERARCHY) diff --git a/cycquery/post_process/mimiciv.py b/cycquery/post_process/mimiciv.py new file mode 100644 index 0000000..b0f7d8c --- /dev/null +++ b/cycquery/post_process/mimiciv.py @@ -0,0 +1,155 @@ +"""Post-processing functions applied to queried MIMIC data (Pandas DataFrames).""" + +import pandas as pd + +from cycquery.post_process.util import process_care_unit_changepoints +from cycquery.utils.profile import time_function + + +CARE_UNIT = "care_unit" +ER = "ER" +ICU = "ICU" +IP = "IP" +SCU = "SCU" +CARE_UNIT_MAP = { + IP: { + "observation": ["Observation", "Psychiatry"], + "medicine": ["Medicine", "Medical/Surgical (Gynecology)"], + }, + ER: { + "er": ["Emergency Department", "Emergency Department Observation"], + }, + ICU: { + "icu": [ + "Surgical Intensive Care Unit (SICU)", + "Medical/Surgical Intensive Care Unit (MICU/SICU)", + "Medical Intensive Care Unit (MICU)", + "Trauma SICU (TSICU)", + "Neuro Surgical Intensive Care Unit (Neuro SICU)", + "Cardiac Vascular Intensive Care Unit (CVICU)", + ], + }, + SCU: { + "surgery": [ + "Med/Surg", + "Surgery", + "Surgery/Trauma", + "Med/Surg/Trauma", + "Med/Surg/GYN", + "Surgery/Vascular/Intermediate", + "Thoracic Surgery", + "Transplant", + "Cardiac Surgery", + "PACU", + "Surgery/Pancreatic/Biliary/Bariatric", + ], + "cardiology": [ + "Cardiology", + "Coronary Care Unit (CCU)", + "Cardiology Surgery Intermediate", + "Medicine/Cardiology", + "Medicine/Cardiology Intermediate", + ], + "vascular": [ + "Vascular", + "Hematology/Oncology", + "Hematology/Oncology Intermediate", + ], + "neuro": ["Neurology", "Neuro Intermediate", "Neuro Stepdown"], + "neonatal": [ + "Obstetrics (Postpartum & Antepartum)", + "Neonatal Intensive Care Unit (NICU)", + "Special Care Nursery (SCN)", + "Nursery - Well Babies", + "Obstetrics Antepartum", + "Obstetrics Postpartum", + "Labor & Delivery", + ], + }, +} +NONSPECIFIC_CARE_UNIT_MAP = { + "medicine": IP, + "observation": IP, + "er": ER, + "icu": ICU, + "cardiology": SCU, + "neuro": SCU, + "neonatal": SCU, + "surgery": SCU, + "vascular": SCU, +} +CARE_UNIT_HIERARCHY = [ER, ICU, SCU, IP] + + +def process_mimic_care_unit_changepoints(data: pd.DataFrame) -> pd.DataFrame: + """Process MIMIC changepoint care unit information in a hierarchical fashion. + + Using the admit, discharge, and care unit information, create a + changepoint DataFrame usable for aggregation labelling purposes. + If a patient is in multiple care units at a changepoint, the care + unit highest in the hierarchy is selected. + + Parameters + ---------- + data: pandas.DataFrame + The admit, discharge, and care unit information for a single encounter. + Expects columns "admit", "discharge", and CARE_UNIT. + + Returns + ------- + pandas.DataFrame + Changepoint information with associated care unit. + + """ + return process_care_unit_changepoints(data, CARE_UNIT_HIERARCHY) + + +@time_function +def process_mimic_care_units( + transfers: pd.DataFrame, + specific: bool = False, +) -> pd.DataFrame: + """Process care unit data. + + Processes the MIMIC Transfers table into a cleaned and simplified care + units DataFrame. + + Parameters + ---------- + transfers : pandas.DataFrame + MIMIC transfers table as a DataFrame. + specific : bool, optional + Whether care_unit_name column has specific or non-specific care units. + + Returns + ------- + pandas.DataFrame + Processed care units for MIMIC encounters. + + """ + transfers.rename( + columns={ + "intime": "admit", + "outtime": "discharge", + "careunit": CARE_UNIT, + }, + inplace=True, + ) + + # Drop rows with eventtype discharge. + # Its admit timestamp is the discharge timestamp of eventtype admit. + transfers = transfers[transfers["eventtype"] != "discharge"] + transfers = transfers.drop("eventtype", axis=1) + transfers = transfers[transfers[CARE_UNIT] != "Unknown"] + + # Create replacement dictionary for care unit categories depending on specificity. + replace_dict = {} + for unit, unit_dict in CARE_UNIT_MAP.items(): + for specific_unit, unit_list in unit_dict.items(): + value = specific_unit if specific else unit + replace_dict.update({elem: value for elem in unit_list}) + transfers[CARE_UNIT].replace(replace_dict, inplace=True) + + transfers.dropna(inplace=True) + + return transfers diff --git a/cycquery/post_process/util.py b/cycquery/post_process/util.py new file mode 100644 index 0000000..824ed01 --- /dev/null +++ b/cycquery/post_process/util.py @@ -0,0 +1,112 @@ +"""Post-processing functions applied to queried data (Pandas DataFrames).""" + +from typing import List + +import pandas as pd +from pandas import Timestamp + + +CARE_UNIT = "care_unit" + + +def event_time_between( + event: Timestamp, + admit: pd.Series, + discharge: pd.Series, + admit_inclusive: bool = True, + discharge_inclusive: bool = False, +) -> pd.Series: + """Return whether an event time is between some start and end time. + + May also specify whether the comparison operators are inclusive or not.. + + Parameters + ---------- + event: pandas.Timestamp + Event time. + admit: pandas.Series + A series of timestamps. + discharge: pandas.Series + A series of timestamps. + admit_inclusive: bool + Whether to have an inclusive inequality for the admit condition. + discharge_inclusive: bool + Whether to have an inclusive inequality for the discharge condition. + + Returns + ------- + pandas.Series + A boolean Series representing whether the event is between + the start and end timestamps. + + """ + admit_cond = event >= admit if admit_inclusive else event > admit + + discharge_cond = event <= discharge if discharge_inclusive else event < discharge + + return admit_cond & discharge_cond + + +def process_care_unit_changepoints( + data: pd.DataFrame, + care_unit_hierarchy: List[str], +) -> pd.DataFrame: + """Process changepoint care unit information in a hierarchical fashion. + + Using the admit, discharge, and care unit information, create a + changepoint DataFrame usable for aggregation labelling purposes. + If a patient is in multiple care units at a changepoint, the care + unit highest in the hierarchy is selected. + + Parameters + ---------- + data: pandas.DataFrame + The admit, discharge, and care unit information for a single encounter. + Expects columns "admit", "discharge", and CARE_UNIT. + care_unit_hierarchy: list + Ordered list of care units from most relevant to to least. + + Returns + ------- + pandas.DataFrame + Changepoint information with associated care unit. The care unit + information is relevant up until the next change point + + """ + # Define mapping dictionaries + hierarchy = {care_unit_hierarchy[i]: i for i in range(len(care_unit_hierarchy))} + hierarchy_inv = {i: care_unit_hierarchy[i] for i in range(len(care_unit_hierarchy))} + + # Create changepoints + changepoints = pd.concat([data["admit"], data["discharge"]]) + changepoints.sort_values(inplace=True) + changepoints = changepoints.unique() + + # Remove the final changepoint, which is the final discharge (has no careunit) + changepoints = changepoints[:-1] + + # Select the most relevant care unit for each changepoint + changepoint_data = [] + for changepoint in changepoints: + is_between = event_time_between( + changepoint, + data["admit"], + data["discharge"], + admit_inclusive=True, + discharge_inclusive=False, + ) + care_units = data[is_between][CARE_UNIT].unique() + if len(care_units) > 0: + care_unit_inds = [hierarchy[x] for x in care_units] + care_unit_selected = hierarchy_inv[min(care_unit_inds)] + else: + care_unit_selected = "unknown" + changepoint_data.append([changepoint, care_unit_selected]) + + checkpoint_df = pd.DataFrame(changepoint_data, columns={"changepoint", "care_unit"}) + + # Remove consequtive duplicates, i.e., remove a changepoint if the + # previous changepoint has the same care unit + change_mask = checkpoint_df["care_unit"] != checkpoint_df["care_unit"].shift(-1) + + return checkpoint_df[change_mask] diff --git a/cycquery/util.py b/cycquery/util.py new file mode 100644 index 0000000..a246298 --- /dev/null +++ b/cycquery/util.py @@ -0,0 +1,1229 @@ +"""Utility functions for querying.""" + +import logging +from dataclasses import dataclass +from functools import wraps +from typing import Any, Callable, Dict, List, Optional, Union + +import sqlalchemy +from sqlalchemy import cast, func, select +from sqlalchemy.sql.elements import BinaryExpression +from sqlalchemy.sql.expression import ColumnClause +from sqlalchemy.sql.schema import Column, Table +from sqlalchemy.sql.selectable import Select, Subquery +from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Interval, String + +from cycquery.utils.common import to_list, to_list_optional +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + +COLUMN_OBJECTS = [Column, ColumnClause] + + +def get_attr_name(name: str) -> str: + """Get attribute name (second part of first.second).""" + return name.split(".")[-1] + + +@dataclass +class DBSchema: + """Database schema wrapper. + + Parameters + ---------- + name: str + Name of schema. + data: sqlalchemy.sql.schema.MetaData + Metadata for schema. + + """ + + name: str + data: sqlalchemy.sql.schema.MetaData + + +@dataclass +class DBTable: + """Database table wrapper. + + Parameters + ---------- + name: str + Name of table. + data: sqlalchemy.sql.schema.Table + Metadata for schema. + + """ + + name: str + data: sqlalchemy.sql.schema.MetaData + + +TABLE_OBJECTS = [Table, Select, Subquery, DBTable] +TableTypes = Union[Select, Subquery, Table, DBTable] + + +def _to_subquery(table: TableTypes) -> Subquery: + """Convert a table from a table type object to the Subquery type. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + Table to convert. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The converted table. + + """ + if isinstance(table, Subquery): + return table + + if isinstance(table, Select): + return table.subquery() + + if isinstance(table, Table): + return select(table).subquery() + + if isinstance(table, DBTable): + return select(table.data).subquery() + + raise ValueError( + f"""Table has type {type(table)}, but must have one of the + following types: {", ".join(TABLE_OBJECTS)}""", + ) + + +def _to_select(table: TableTypes) -> Select: + """Convert a table from a table type object to the Select type. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + Table to convert. + + Returns + ------- + sqlalchemy.sql.selectable.Select + The converted table. + + """ + if isinstance(table, Select): + return table + + if isinstance(table, Subquery): + return select(table) + + if isinstance(table, Table): + return select(table) + + if isinstance(table, DBTable): + return select(table.data) + + raise ValueError( + f"""Table has type {type(table)}, but must have one of the + following types: {", ".join(TABLE_OBJECTS)}""", + ) + + +def param_types_to_type( + relevant_types: List[Any], + to_type_fn: Callable[..., Any], +) -> Callable[..., Any]: + """Convert TableTypes parameters to a specified type. + + A decorator which processes a function's arguments by taking all + parameters with type in relevant_types and converting them using + some to_type_fn function. Non-relevant types are left alone. + + Parameters + ---------- + relevant_types : list + Types to process. + to_type_fn : Callable + Function to process the relevant types + + Returns + ------- + Callable + The processed function. + + """ + + def decorator(func_: Callable[..., Any]) -> Callable[..., Any]: + """Decorate function to convert TableTypes parameters to a specified type.""" + + @wraps(func_) + def wrapper_func(*args: Any, **kwargs: Any) -> Any: + # Convert relevant arguments. + args_list = list(args) + for i, arg in enumerate(args_list): + if type(arg) in relevant_types: + args_list[i] = to_type_fn(arg) + + # Convert relevant keyword arguments. + kwargs = dict(kwargs) + for key, kwarg in kwargs.items(): + if type(kwarg) in relevant_types: + kwargs[key] = to_type_fn(kwarg) + + return func_(*tuple(args_list), **kwargs) + + return wrapper_func + + return decorator + + +def table_params_to_type(to_type: TableTypes) -> Callable[..., Any]: + """Decorate to convert TableTypes params to a specified type. + + Parameters + ---------- + to_type: cyclops.query.util.TableTypes + The type to which to convert. + + Returns + ------- + Callable + The processed function. + + """ + # Dictionary mapping query type -> query type conversion function. + table_to_type_fn_map = { + Subquery: _to_subquery, + Select: _to_select, + Table: lambda x: x, + DBTable: lambda x: x, + } + if to_type not in TABLE_OBJECTS: + raise ValueError(f"to_type must be in {TABLE_OBJECTS}") + + to_type_fn = table_to_type_fn_map[to_type] + + return param_types_to_type(TABLE_OBJECTS, to_type_fn) + + +@table_params_to_type(Subquery) +def get_column( + table: TableTypes, + col: str, +) -> Column: + """Extract a column object from a table by name. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table with the column. + col: str + Name of column to extract. + + Returns + ------- + sqlalchemy.sql.schema.Column + The corresponding column in the table. + + """ + col_names = get_column_names(table) + if col not in col_names: + raise ValueError(f"Table does not contain column {col}") + + return table.c[col_names.index(col)] # type: ignore + + +@table_params_to_type(Subquery) +def filter_columns( + table: TableTypes, + cols: Union[str, List[str]], +) -> Subquery: + """Filter a table, keeping only the specified columns. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table with the column. + cols: str or list of str + Name of columns to keep. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + Table with only the specified columns. + + """ + cols = to_list(cols) + col_names = get_column_names(table) + filtered = [] + for col in cols: + if col not in col_names: + continue + filtered.append(table.c[col_names.index(col)]) # type: ignore + + return select(filtered).subquery() + + +@table_params_to_type(Subquery) +def get_columns( + table: TableTypes, + cols: Union[str, List[str]], +) -> List[Column]: + """Extract a number of columns from the table. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + cols: str or list of str + Names of columns to extract. + + Returns + ------- + list of sqlalchemy.sql.schema.Column + The corresponding columns in the table. + + """ + return [get_column(table, col) for col in to_list(cols)] + + +@table_params_to_type(Subquery) +def get_column_names(table: TableTypes) -> List[str]: + """Extract column names from a table. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + + Returns + ------- + list of str + The table column names. + + """ + return [c.name for c in table.columns] # type: ignore + + +@table_params_to_type(Subquery) +def has_columns( + table: TableTypes, + cols: Union[str, List[str]], + raise_error: bool = False, +) -> bool: + """Check whether a table has all of the specified columns. + + Parameters + ---------- + table : cyclops.query.util.TableTypes + Table to check. + cols: str or list of str + Required columns. + raise_error: bool + Whether to raise an error if the required columns are not found. + + Returns + ------- + bool + True if all required columns are present, otherwise False. + + """ + cols = to_list(cols) + required_set = set(cols) + columns = set(get_column_names(table)) + present = required_set.issubset(columns) + + if raise_error and not present: + missing = required_set - columns + raise ValueError(f"Missing required columns {', '.join(missing)}.") + + return present + + +@table_params_to_type(Subquery) +def assert_table_has_columns( + *args: Any, + **kwargs: Any, +) -> Callable[[TableTypes], TableTypes]: + """Assert that TableTypes params have the necessary columns. + + assert_table_has_columns(["A", "B"], None) is equivalent to + assert_table_has_columns(["A", "B"]) but may be necessary when + wanting to check, assert_table_has_columns(["A"], None, ["C"]) + + Can also check keyword arguments, e.g., optional queries, + assert_table_has_columns(["A"], kwarg_table=["D"]) + + Parameters + ---------- + *args + Ordered arguments corresponding to the function's table-type args. + **kwargs + Keyword arguments corresponding to the function's table-type kwargs. + + Returns + ------- + Callable + Decorator function. + + """ + + def decorator( + func_: Callable[..., Any], + ) -> Callable[..., Any]: + @wraps(func_) + def wrapper_func(*fn_args: Any, **fn_kwargs: Any) -> Any: + # Check only the table arguments + table_args = [i for i in fn_args if isinstance(i, Subquery)] + + assert len(args) <= len(table_args) + + for i, arg in enumerate(args): + if arg is None: # Can specify None to skip over checking a query + continue + has_columns(table_args[i], arg, raise_error=True) + + for key, required_cols in kwargs.items(): + # If an optional table is not provided, or is None, + # it is skipped + if key not in fn_kwargs: + continue + + if fn_kwargs[key] is None: + continue + + assert isinstance(fn_kwargs[key], Subquery) + has_columns(fn_kwargs[key], required_cols, raise_error=True) + + return func_(*fn_args, **fn_kwargs) + + return wrapper_func + + return decorator # type: ignore + + +@table_params_to_type(Subquery) +def drop_columns( + table: TableTypes, + drop_cols: Union[str, List[str]], +) -> Subquery: + """Drop, or remove, some columns from a table. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + col : str or list of str + Names of columns to drop. + drop_cols: str or list of str + Names of columns to drop. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The corresponding table with columns dropped. + + """ + drop_cols = get_columns(table, drop_cols) + + return select(*[c for c in table.c if c not in drop_cols]).subquery() # type: ignore + + +@table_params_to_type(Subquery) +def rename_columns(table: TableTypes, rename_map: Dict[str, str]) -> Subquery: + """Rename a table's columns. + + Rename the table's columns according to a dictionary of strings, + where the key is the current name, and the value is the replacement. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + rename_map : dict + Dictionary mapping current column names (key) to new ones (value). + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The corresponding table with columns renamed. + + """ + return select( + *[ + c.label(rename_map[c.name]) if c.name in rename_map else c + for c in table.columns # type: ignore + ], + ).subquery() + + +@table_params_to_type(Subquery) +def reorder_columns(table: TableTypes, cols: List[str]) -> Subquery: + """Reorder a table's columns. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table to reorder. + cols : list of str + New order of columns, which must include all existing columns. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The reordered table. + + """ + # Get the old/new column names. + old_order = get_column_names(table) + new_order = [c.name for c in get_columns(table, cols)] + + # Make sure we have exactly the same set of old/new column names. + if set(old_order) != set(new_order): + old_order_print = ", ".join(old_order) + new_order_print = ", ".join(new_order) + raise ValueError( + f"""Must specify all columns {old_order_print} + to re-order, not {new_order_print}.""", + ) + + # Reorder the columns. + new_cols = [] + for col in new_order: + new_cols.append(table.c[old_order.index(col)]) # type: ignore + + return select(*new_cols).subquery() + + +@table_params_to_type(Subquery) +def apply_to_columns( + table: TableTypes, + col_names: Union[str, List[str]], + funcs: Union[ + Callable[[sqlalchemy.sql.schema.Column], sqlalchemy.sql.schema.Column], + List[Callable[[sqlalchemy.sql.schema.Column], sqlalchemy.sql.schema.Column]], + ], + new_col_labels: Optional[Union[str, List[str]]] = None, +) -> Subquery: + """Apply a function to some columns. + + This function can change existing columns or create new + columns depending on whether new_col_labels is specified. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + col_names: str or list of str + Columns to which to apply the function. + funcs: callable or list of callable + Function(s) to apply to the columns, where the function takes an column + as its only parameter and returns another column object. + new_col_labels: str or list of str, optional + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The table with function applied. + + """ + col_names = to_list(col_names) + new_col_labels = to_list_optional(new_col_labels) + cols = get_columns(table, col_names) + if isinstance(funcs, list): + if len(funcs) != len(cols): + raise ValueError( + f"Must specify a function for each column, not {len(funcs)} functions.", + ) + else: + funcs = [funcs] * len(cols) + if new_col_labels is None: + # Apply to existing columns + prev_order = get_column_names(table) + table = select(table).add_columns( + *[ + funcs[i](col).label("__" + col_names[i] + "__") + for i, col in enumerate(cols) + ], + ) + rename = {"__" + name + "__": name for name in col_names} + table = drop_columns(table, col_names) + table = rename_columns(table, rename) + table = reorder_columns(table, prev_order) + else: + # Apply to new columns + new_cols = [ + funcs[i](col).label(new_col_labels[i]) for i, col in enumerate(cols) + ] + table = select(table).add_columns(*new_cols) + + return _to_subquery(table) + + +def trim_columns( + table: TableTypes, + cols: Union[str, List[str]], + new_col_labels: Optional[Union[str, List[str]]] = None, +) -> Subquery: + """Trim, or strip, specified columns. + + Trimming refers to the removal of leading/trailing whitespace. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + cols: str or list of str + Names of columns to trim. + new_col_labels: str or list of str, optional + If specified, create new columns with these labels. Otherwise, + apply the function to the existing columns. + + Returns + ------- + sqlalchemy.sql.selectable.Subquery + The table with the specified columns trimmed. + + """ + return apply_to_columns( + table, + cols, + lambda x: process_column(x, to_str=True, trim=True), + new_col_labels=new_col_labels, + ) + + +def process_elem(elem: Any, **kwargs: bool) -> Any: + """Preprocess some basic object such as an integer, float, or string. + + Parameters + ---------- + elem: any + An element such as an integer, float, or string. + **kwargs : dict, optional + Preprocessing keyword arguments. + + Returns + ------- + Any + The preprocessed element. + + """ + # Extract kwargs. + lower = kwargs.get("lower", False) + trim = kwargs.get("trim", False) + to_str = kwargs.get("to_str", False) + to_int = kwargs.get("to_int", False) + to_float = kwargs.get("to_float", False) + to_bool = kwargs.get("to_bool", False) + + # Convert to string. + if to_str: + elem = str(elem) + + # If a string. + if isinstance(elem, str): + if lower: + elem = elem.lower() + + if trim: + elem = elem.strip() + + if to_int: + elem = int(elem) + + if to_float: + elem = float(elem) + + if to_bool: + elem = bool(elem) + + return elem + + +def process_list(lst: Union[Any, List[Any]], **kwargs: bool) -> List[Any]: + """Preprocess a list of elements. + + Parameters + ---------- + lst : any or list of any + A list of elements such as integers, floats, or strings. + **kwargs : dict, optional + Preprocessing keyword arguments. + + Returns + ------- + Any + The preprocessed element. + + """ + # Convert potentially non-list variable to list. + lst = to_list(lst) + + # Process elements. + return [process_elem(i, **kwargs) for i in lst] + + +def process_column(col: Column, **kwargs: bool) -> Column: + """Preprocess a Column object. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + A column to preprocess. + **kwargs : dict, optional + Preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.schema.Column + The processed column. + + """ + # Extract kwargs. + lower = kwargs.get("lower", False) + trim = kwargs.get("trim", False) + to_str = kwargs.get("to_str", False) + to_int = kwargs.get("to_int", False) + to_float = kwargs.get("to_float", False) + to_bool = kwargs.get("to_bool", False) + to_date = kwargs.get("to_date", False) + to_timestamp = kwargs.get("to_timestamp", False) + + # Convert to string. + if to_str: + col = cast(col, String) + + # If a string column. + if "VARCHAR" in str(col.type): + # Lower column. + if lower: + col = func.lower(col) + + # Trim whitespace. + if trim: + col = func.trim(col) + + if to_int: + col = cast(col, Integer) + + if to_float: + col = cast(col, Float) + + if to_bool: + col = cast(col, Boolean) + + if to_date: + col = cast(col, Date) + + if to_timestamp: + col = cast(col, DateTime) + + return col + + +def equals( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column has some value. + + Assumes that if searching for a string, both the value and column values + should be converted to lowercase and trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match in the column. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return process_column(col, lower=lower, trim=trim, **kwargs) == process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + + +def greater_than( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + equal: bool = False, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column is greater than some value. + + Assumes that if searching for a string, both the value and column values + should be converted to lowercase and trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match in the column. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + equal: bool, default=False + Whether to also include equal to the value. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + if equal: + return process_column(col, lower=lower, trim=trim, **kwargs) >= process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + return process_column(col, lower=lower, trim=trim, **kwargs) > process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + + +def less_than( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + equal: bool = False, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column is less than some value. + + Assumes that if searching for a string, both the value and column values + should be converted to lowercase and trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match in the column. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + equal: bool, default=False + Whether to also include equal to the value. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + if equal: + return process_column(col, lower=lower, trim=trim, **kwargs) <= process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + return process_column(col, lower=lower, trim=trim, **kwargs) < process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + + +def not_equals( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column is not equal to some value. + + Assumes that if searching for a string, both the value and column values + should be converted to lowercase and trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match in the column. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return process_column(col, lower=lower, trim=trim, **kwargs) != process_elem( + value, + lower=lower, + trim=trim, + **kwargs, + ) + + +def has_string_format( + col: Column, + value: Any, + fmt: str, + to_str: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column has some string formatting. + + Assumes that we're searching for a string, performing + the relevant conversion. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value: Any + A value to be implanted in the string formatting. + fmt : str + The string format to match in the column. + to_str : bool, default=True + Whether to convert the value/column to string type. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return process_column(col, to_str=to_str, **kwargs).like( + fmt.format(process_elem(value, to_str=to_str, **kwargs)), + ) + + +def has_substring( + col: Column, + substring: Any, + lower: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column has some substring. + + Assumes that we're searching for a string, where both the value and + column values should be converted to strings and made lowercase. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + substring : Any + The substring to match in the column. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return has_string_format(col, substring, "%%{}%%", lower=lower, **kwargs) + + +def starts_with( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column starts with some value/string. + + Assumes that we're searching for a string, where both the value and + column values should be converted to strings, made lowercase, and + trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match at the start. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return has_string_format(col, value, "{}%%", lower=lower, trim=trim, **kwargs) + + +def ends_with( + col: Column, + value: Any, + lower: bool = True, + trim: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column ends with some value/string. + + Assumes that we're searching for a string, where both the value and + column values should be converted to strings, made lowercase, and + trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + value : Any + The value to match at the end. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return has_string_format(col, value, "%%{}", lower=lower, trim=trim, **kwargs) + + +def in_( + col: Column, + lst: List[Any], + lower: bool = True, + trim: bool = True, + **kwargs: bool, +) -> BinaryExpression: + """Condition that a column value is in a list of values. + + Assumes that if searching for a string, both the value and column values + should be converted to lowercase and trimmed of leading/trailing whitespace. + + Parameters + ---------- + col : sqlalchemy.sql.schema.Column + The column to condition. + lst : list of any + The value to match at the start. + lower : bool, default=True + Whether to convert the value and column to lowercase. + This is only relevant when the column/value are strings. + trim : bool, default=True + Whether to trim (strip) whitespace on the value and column. + This is only relevant when the column/value are strings. + **kwargs : dict, optional + Remaining preprocessing keyword arguments. + + Returns + ------- + sqlalchemy.sql.elements.BinaryExpression + An expression representing where the condition was satisfied. + + """ + return process_column(col, lower=lower, trim=trim, **kwargs).in_( + process_list(lst, lower=lower, trim=trim, **kwargs), + ) + + +def _check_column_type( + table: TableTypes, + cols: Union[str, List[str]], + types: Union[Any, List[Any]], + raise_error: bool = False, +) -> bool: + """Check whether some columns are each one of a number of types. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + cols: str or list of str + Column names to check. + types: any + The allowed types for each column. + raise_error: bool + Whether to raise an error if one of the columns are none of the types. + + Returns + ------- + bool + Whether all of the columns are one of the types. + + """ + cols = to_list(cols) + types = to_list(types) + is_type = [ + any(isinstance(get_column(table, col).type, type_) for type_ in types) + for col in cols + ] + if raise_error and not all(is_type): + incorrect_type = list( + set(cols) - {col for i, col in enumerate(cols) if is_type[i]}, + ) + types_str = ", ".join([type_.__name__ for type_ in types]) + actual_types_str = [type(col).__name__ for col in incorrect_type] + raise ValueError( + f"""{incorrect_type} columns are not one of types {types_str}. + They have types {actual_types_str}.""", + ) + + return all(is_type) + + +def check_timestamp_columns( + table: TableTypes, + cols: Union[str, List[str]], + raise_error: bool = False, +) -> bool: + """Check whether some columns are Date or DateTime columns. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + cols: str or list of str + Column names to check. + raise_error: bool + Whether to raise an error if one of the columns are none of the types. + + Returns + ------- + bool + Whether all of the columns are one of the types. + + """ + return _check_column_type(table, cols, [Date, DateTime], raise_error=raise_error) + + +@table_params_to_type(Subquery) +def get_delta_column( + table: TableTypes, + years: Optional[str] = None, + months: Optional[str] = None, + days: Optional[str] = None, + hours: Optional[str] = None, +) -> Column: + """Create a time delta column. + + Create a time delta (interval) column from a number of + numeric timestamp columns. + + Warning: Null values in each specified numeric time column are coalesced to 0. + + Parameters + ---------- + table: cyclops.query.util.TableTypes + The table. + years: None or str + Years column. + months: None or str + Months column. + days: None or str + Days column. + hours: None or str + Hours column. + + Returns + ------- + sqlalchemy.sql.schema.Column + Combined delta/interval column. + + """ + + def get_col_or_none(col: Optional[str] = None) -> Optional[Column]: + """If col is not None, get interval column from names.""" + return None if col is None else get_column(table, col) + + years = get_col_or_none(years) + months = get_col_or_none(months) + days = get_col_or_none(days) + hours = get_col_or_none(hours) + + time_cols = [years, months, days, hours] + names = ["YEARS", "MONTHS", "DAYS", "HOURS"] + + # Consider only the non-null columns. + names = [names[i] for i in range(len(names)) if time_cols[i] is not None] + time_cols = [col for col in time_cols if col is not None] + + if len(time_cols) == 0: + raise ValueError("One or more time interval columns must be specified.") + + # Create interval columns. + interval_cols = [] + for i, col in enumerate(time_cols): + interval_cols.append( + func.cast(func.concat(func.coalesce(col, 0), " " + names[i]), Interval), + ) + + # Create combined interval column. + combined_interval_col = interval_cols[0] + for i in range(1, len(interval_cols)): + combined_interval_col = combined_interval_col + interval_cols[i] + + return combined_interval_col diff --git a/cycquery/utils/__init__.py b/cycquery/utils/__init__.py new file mode 100644 index 0000000..88c371e --- /dev/null +++ b/cycquery/utils/__init__.py @@ -0,0 +1 @@ +"""Utility package.""" diff --git a/cycquery/utils/common.py b/cycquery/utils/common.py new file mode 100644 index 0000000..af93240 --- /dev/null +++ b/cycquery/utils/common.py @@ -0,0 +1,203 @@ +"""Common utility functions that can be used across multiple cyclops packages.""" + +import warnings +from datetime import datetime +from typing import Any, List, Optional, Union + +import numpy as np +import numpy.typing as npt +import pandas as pd +from pandas.errors import PerformanceWarning + + +def to_timestamp(data: Union[pd.Series, npt.NDArray[Any]]) -> pd.Series: + """Convert a Pandas series or NumPy array to a datetime/timestamp type. + + Parameters + ---------- + data: pandas.Series or numpy.ndarray + Data to be converted. + + Returns + ------- + pandas.Series + The converted data. + + """ + if isinstance(data, pd.Series): + return pd.to_datetime(data) + + if isinstance(data, np.ndarray): + return pd.to_datetime(pd.Series(data)) + + raise ValueError(f"Type of data argument ({type(data)}) not supported.") + + +def add_years_approximate( + timestamp_series: pd.Series, + years_series: pd.Series, +) -> pd.Series: + """Approximately add together a timestamp series with a years series row-by-row. + + Approximates are typically exact or incorrect by one day, e.g., on leap days. + + Parameters + ---------- + timestamp_series: pandas.Series + The series of timestamps to which to add. + years_series: panadas.Series + The series of years to add. + + Returns + ------- + pandas.Series + The timestamp series with the approximately added years. + + """ + # Add to the years column + year = timestamp_series.dt.year + years_series + + # Handle the other columns + month = timestamp_series.dt.month + day = timestamp_series.dt.day + hour = timestamp_series.dt.hour + minute = timestamp_series.dt.minute + + # Create new timestamp column + data = pd.DataFrame( + {"year": year, "month": month, "day": day, "hour": hour, "minute": minute}, + ) + + # Subtract 1 from potentially invalid leap days to avoid issues + leap_days = (month == 2) & (day == 29) + data["day"][leap_days] -= 1 + + return pd.to_datetime(data) + + +def add_years_exact(timestamp_series: pd.Series, years_series: pd.Series) -> pd.Series: + """Add together a timestamp series with a years series row-by-row. + + Warning: Very slow. It is worth using the add_years_approximate function even + moderately large data. + + Parameters + ---------- + timestamp_series: pandas.Series + The series of timestamps to which to add. + years_series: panadas.Series + The series of years to add. + + Returns + ------- + pandas.Series + The timestamp series with the approximately added years. + + """ + warnings.warn( + ( + "Computing the exact addition cannot be vectorized and is very slow. " + "Consider using the quick, approximate calculation." + ), + PerformanceWarning, + stacklevel=1, + ) + return timestamp_series + years_series.apply(lambda x: pd.DateOffset(years=x)) + + +def to_list(obj: Any) -> List[Any]: + """Convert some object to a list of object(s) unless already one. + + Parameters + ---------- + obj : any + The object to convert to a list. + + Returns + ------- + list + The processed object. + + """ + if isinstance(obj, list): + return obj + + if isinstance(obj, (np.ndarray, set, dict)): + return list(obj) + + return [obj] + + +def to_list_optional( + obj: Optional[Any], + none_to_empty: bool = False, +) -> Union[List[Any], None]: + """Convert some object to a list of object(s) unless already None or a list. + + Parameters + ---------- + obj : any + The object to convert to a list. + none_to_empty: bool, default = False + If true, return a None obj as an empty list. Otherwise, return as None. + + Returns + ------- + list or None + The processed object. + + """ + if obj is None: + if none_to_empty: + return [] + return None + + return to_list(obj) + + +def to_datetime_format(date: str, fmt: str = "%Y-%m-%d") -> datetime: + """Convert string date to datetime. + + Parameters + ---------- + date: str + Input date in string format. + fmt: str, optional + Date formatting string. + + Returns + ------- + datetime + Date in datetime format. + + """ + return datetime.strptime(date, fmt) + + +def list_swap(lst: List[Any], index1: int, index2: int) -> List[Any]: + """Swap items in a list given the item index and new item index. + + Parameters + ---------- + lst: list + List in which elements will be swapped. + index1: int + Index of first item to swap. + index2: int + Index of second item to swap. + + Returns + ------- + list + List with elements swapped. + + """ + if not 0 <= index1 < len(lst): + raise ValueError("index 1 is out of range.") + + if not 0 <= index2 < len(lst): + raise ValueError("index 2 is out of range.") + + lst[index1], lst[index2] = lst[index2], lst[index1] + + return lst diff --git a/cycquery/utils/file.py b/cycquery/utils/file.py new file mode 100644 index 0000000..597920a --- /dev/null +++ b/cycquery/utils/file.py @@ -0,0 +1,457 @@ +"""Utility functions for saving/loading files.""" + +import logging +import os +import pickle +from typing import Any, Generator, List, Optional, Union + +import dask.dataframe as dd +import numpy as np +import pandas as pd + +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +def join(*paths: str) -> str: + """Robustly join paths. + + os.path.join only may cause problems with some filepaths (especially on Windows). + + Parameters + ---------- + paths: str + file paths + + Returns + ------- + str + The joined path of all input paths. + + """ + return os.path.join(*paths).replace("\\", "/") + + +def exchange_extension(file_path: str, new_ext: str) -> str: + """Exchange one file extension for another. + + Parameters + ---------- + file_path: str + File path in which to exchange the extension. + new_ext: str + New extension to replace the existing extension. + + Returns + ------- + str + File path with the new extension. + + """ + # Remove a leading dot + new_ext = new_ext.strip(".") + _, old_ext = os.path.splitext(file_path) + return file_path[: -len(old_ext)] + "." + new_ext + + +def process_file_save_path( + save_path: str, + file_format: str, + create_dir: bool = True, +) -> str: + """Process file save path, perform checks, and possibly create a parent directory. + + Parameters + ---------- + save_path: str + Path where the file will be saved. + file_format: str + File format of the file to save. + create_dir: bool + If True, create the parent directory path if needed. + + Returns + ------- + str + The processed save path. + + """ + # Create the directory if it doesn't already exist. + directory, _ = os.path.split(save_path) + + if create_dir and directory != "": + os.makedirs(directory, exist_ok=True) + + # Add the .parquet extension if it isn't there. + _, ext = os.path.splitext(save_path) + + if ext == "": + save_path = save_path + "." + file_format + elif ext != "." + file_format: + raise ValueError( + f"""The file extension on the save path must be {file_format}. + Alternatively, sesider changing the file format.""", + ) + + return save_path + + +def process_dir_save_path(save_path: str, create_dir: bool = True) -> str: + """Process directory save path, perform checks, and possibly create the directory. + + Parameters + ---------- + save_path: str + Path where the file will be saved. + create_dir: bool + If True, create the directory if needed. + + Returns + ------- + str + The processed save path. + + """ + if os.path.exists(save_path): + if os.path.isdir(save_path): + return save_path + raise ValueError("If save path exists, it must be a directory.") + + if create_dir: + os.makedirs(save_path) + return save_path + + raise ValueError("Directory does not exist.") + + +def save_dataframe( + data: Union[pd.DataFrame, dd.core.DataFrame], + save_path: str, + file_format: str = "parquet", + log: bool = True, +) -> str: + """Save a pandas.DataFrame or dask.DataFrame object to file. + + Parameters + ---------- + data: pandas.DataFrame + Dataframe to save. + save_path: str + Path where the file will be saved. + file_format: str + File format of the file to save. + log: bool + Whether to log the occurence. + + Returns + ------- + str + Processed save path for upstream use. + + """ + if not isinstance(data, (pd.DataFrame, dd.core.DataFrame)): + raise ValueError("Input data is not a DataFrame.") + save_path = process_file_save_path(save_path, file_format) + if isinstance(data, dd.core.DataFrame): + save_path, _ = os.path.splitext(save_path) + if log: + LOGGER.info("Saving dataframe to %s", save_path) + if file_format == "parquet": + if isinstance(data, pd.DataFrame): + data.to_parquet(save_path, schema=None) + if isinstance(data, dd.core.DataFrame): + data.to_parquet( # type: ignore + save_path, + schema=None, + name_function=lambda x: f"batch-{str(x).zfill(3)}.parquet", + ) + elif file_format == "csv": + data.to_csv(save_path) + else: + raise ValueError( + "Invalid file formated provided. Currently supporting 'parquet' and 'csv'.", + ) + + return save_path + + +def load_dataframe( + load_path: str, + file_format: str = "parquet", + log: bool = True, +) -> Union[pd.DataFrame, dd.core.DataFrame]: + """Load file to a pandas.DataFrame or dask.DataFrame object. + + Parameters + ---------- + load_path: str + Path where the file to load. + file_format: str + File format of the file to load. + log: bool + Whether to log the occurence. + + Returns + ------- + pandas.DataFrame or dask.DataFrame + Loaded data. + + """ + is_dask = True + if not os.path.isdir(load_path): + load_path = process_file_save_path(load_path, file_format) + is_dask = False + if log: + LOGGER.info("Loading DataFrame from %s", load_path) + if file_format == "parquet": + data_reader = dd.read_parquet if is_dask else pd.read_parquet # type: ignore + data = data_reader(load_path) + elif file_format == "csv": + data = pd.read_csv(load_path, index_col=[0]) + else: + raise ValueError( + "Invalid file formated provided. Currently supporting 'parquet' and 'csv'.", + ) + + return data + + +def save_array( + data: np.typing.ArrayLike, + save_path: str, + file_format: str = "npy", + log: bool = True, +) -> str: + """Save a numpy.ndarray object to file. + + Parameters + ---------- + data: numpy.ndarray + Array to save. + save_path: str + Path where the file will be saved. + file_format: str + File format of the file to save. + log: bool + Whether to log the occurence. + + Returns + ------- + str + Processed save path for upstream use. + + """ + save_path = process_file_save_path(save_path, file_format) + + if not isinstance(data, np.ndarray): + raise ValueError("Input data is not an array.") + + if log: + LOGGER.info("Saving array to %s", save_path) + + if file_format == "npy": + np.save(save_path, data) + else: + raise ValueError("Invalid file formated provided. Currently supporting 'npy'.") + + return save_path + + +def load_array( + load_path: str, + file_format: str = "npy", + log: bool = True, +) -> Any: + """Load file to a numpy.ndarray object. + + Parameters + ---------- + load_path: str + Path where the file to load. + file_format: str + File format of the file to load. + log: bool + Whether to log the occurence. + + Returns + ------- + numpy.ndarray + Loaded data. + + """ + load_path = process_file_save_path(load_path, file_format) + + if log: + LOGGER.info("Loading array from %s", load_path) + + if file_format == "npy": + data = np.load(load_path) + else: + raise ValueError("Invalid file formated provided. Currently supporting 'npy'.") + + if not isinstance(data, np.ndarray): + raise ValueError("Loaded data is not an array.") + + return data + + +def save_pickle( + data: Any, + save_path: str, + log: bool = True, +) -> str: + """Save a object to pickle file. + + Parameters + ---------- + data: any + Data to save. + save_path: str + Path where the file will be saved. + log: bool + Whether to log the occurence. + + Returns + ------- + str + Processed save path for upstream use. + + """ + save_path = process_file_save_path(save_path, "pkl") + + if log: + LOGGER.info("Pickling data to %s", save_path) + + with open(save_path, "wb") as handle: + pickle.dump(data, handle) + + return save_path + + +def load_pickle( + load_path: str, + log: bool = True, +) -> Any: + """Load an object from a pickle file. + + Parameters + ---------- + load_path: str + Path where the file to load. + log: bool + Whether to log the occurence. + + Returns + ------- + any + Loaded data. + + """ + load_path = process_file_save_path(load_path, "pkl") + + if log: + LOGGER.info("Loading pickled data from %s", load_path) + + with open(load_path, "rb") as handle: + return pickle.load(handle) + + +def listdir_nonhidden(path: str) -> List[str]: + """List the non-hidden files of a directory. + + Parameters + ---------- + path: str + Directory path. + + Returns + ------- + list + List of non-hidden files. + + """ + return [f for f in os.listdir(path) if not f.startswith(".")] + + +def yield_dataframes( + dir_path: str, + sort: bool = True, + skip_n: Optional[int] = None, + log: bool = True, +) -> Generator[pd.DataFrame, None, None]: + """Yield DataFrames loaded from a directory. + + Any non-hidden files in the directory must be loadable as a DataFrame. + + Parameters + ---------- + dir_path: str + Directory path of files. + sort: bool, default = True + Whether to sort the files and yield them in an ordered manner. + skip_n: int, optional + If specified, skip the first n files when yielding the files. + This is especially useful in lieu of the execution being interrupted. + log: bool + Whether to log the occurence. + + Yields + ------ + pandas.DataFrame + A DataFrame. + + """ + files = list(listdir_nonhidden(dir_path)) + + if sort: + files.sort() + + if skip_n: + files = files[skip_n:] + + for file in files: + yield load_dataframe(join(dir_path, file), log=log) + + +def yield_pickled_files( + dir_path: str, + sort: bool = True, + skip_n: Optional[int] = None, + log: bool = True, +) -> Generator[pd.DataFrame, None, None]: + """Yield pickled files loaded from a directory. + + Any non-hidden files in the directory must be loadable with pickle. + + Parameters + ---------- + dir_path: str + Directory path of files. + sort: bool, default = True + Whether to sort the files and yield them in an ordered manner. + skip_n: int, optional + If specified, skip the first n files when yielding the files. + This is especially useful in lieu of the execution being interrupted. + log: bool + Whether to log the occurence. + + Yields + ------ + any + Previously pickled data. + + """ + files = list(listdir_nonhidden(dir_path)) + + if sort: + files.sort() + + if skip_n: + files = files[skip_n:] + + for file in files: + yield load_pickle(join(dir_path, file), log=log) diff --git a/cycquery/utils/log.py b/cycquery/utils/log.py new file mode 100644 index 0000000..c83e2e8 --- /dev/null +++ b/cycquery/utils/log.py @@ -0,0 +1,138 @@ +"""Python logging function.""" + +import logging +from typing import Optional, Union + + +LOG_FORMAT = "%(asctime)-15s %(levelname)-5s %(name)-15s - %(message)s" + +# https://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output +BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) +COLORS = { + "WARNING": YELLOW, + "INFO": WHITE, + "DEBUG": BLUE, + "CRITICAL": YELLOW, + "ERROR": RED, +} + +# The background is set with 40 plus the number of the color, and the foreground 30. +# These are the sequences need to get colored ouput. +RESET_SEQ = "\033[0m" +COLOR_SEQ = "\033[1;%dm" +BOLD_SEQ = "\033[1m" + + +def formatter_message(message: str, use_color: Optional[bool] = True) -> str: + """Format message. + + Parameters + ---------- + message: str + Message format. + use_color: bool, optional + Use colored logging. + + Returns + ------- + str + Formatted message. + + """ + if use_color: + message = message.replace("$RESET", RESET_SEQ).replace("$BOLD", BOLD_SEQ) + else: + message = message.replace("$RESET", "").replace("$BOLD", "") + return message + + +class Formatter(logging.Formatter): + """Formatter. + + Attributes + ---------- + use_color: bool + Flag to toggle use of color. + + """ + + def __init__( + self, + msg: Optional[str] = None, + use_color: bool = True, + ) -> None: + """Instantiate. + + Parameters + ---------- + msg: str + Message format. + use_color: bool + Flag to set using colored formatting. + + """ + if msg is None: + msg = formatter_message(LOG_FORMAT, True) + logging.Formatter.__init__(self, msg) + self.use_color = use_color + + def format(self, record: logging.LogRecord) -> str: # noqa: A003 + """Apply formatting. + + Parameters + ---------- + record: logging.LogRecord + Record object for logging. + + Returns + ------- + str + Formatted string for log. + + """ + levelname = record.levelname + if self.use_color and levelname in COLORS: + levelname_color = ( + COLOR_SEQ % (30 + COLORS[levelname]) + levelname + RESET_SEQ + ) + record.levelname = levelname_color + return logging.Formatter.format(self, record) + + +def setup_logging( + log_path: Optional[str] = None, + log_level: Union[int, str] = "DEBUG", + print_level: Union[int, str] = "INFO", + logger: Optional[logging.Logger] = None, + use_color: bool = True, +) -> None: + """Create logger, and set it up. + + Parameters + ---------- + log_path : str, optional + Path to output log file. + log_level : str, optional + Log level for logging, defaults to DEBUG. + print_level : str, optional + Print level for logging, defaults to INFO. + logger : logging.Logger, optional + Pass logger if already exists, else a new logger object is created. + use_color: bool, optional + Use colored logging. + + """ + fmt = formatter_message(LOG_FORMAT, use_color) + logger = logger if logger else logging.getLogger() + logger.setLevel(log_level) + logger.handlers = [] + + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(Formatter(fmt, use_color=use_color)) + stream_handler.setLevel(print_level) + logger.addHandler(stream_handler) + + if log_path: + file_handler = logging.FileHandler(log_path) + file_handler.setFormatter(Formatter(fmt, use_color=use_color)) + logger.addHandler(file_handler) diff --git a/cycquery/utils/profile.py b/cycquery/utils/profile.py new file mode 100644 index 0000000..089d2a3 --- /dev/null +++ b/cycquery/utils/profile.py @@ -0,0 +1,37 @@ +"""Useful functions for timing, profiling.""" + +import logging +import time +from typing import Any, Callable, Dict, List + +from cycquery.utils.log import setup_logging + + +# Logging. +LOGGER = logging.getLogger(__name__) +setup_logging(print_level="INFO", logger=LOGGER) + + +def time_function(func: Callable[..., Any]) -> Callable[..., Any]: + """Time decorator function. + + Parameters + ---------- + func: function + Function to apply decorator. + + Returns + ------- + Callable + Wrapper function to apply as decorator. + + """ + + def wrapper_func(*args: List[Any], **kwargs: Dict[str, Any]) -> Any: + start_time = time.time() + result = func(*args, **kwargs) + time_taken = time.time() - start_time + LOGGER.info("Finished executing function %s in %f s", func.__name__, time_taken) + return result + + return wrapper_func diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..061f32f --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/cyclical_diagram.jpg b/docs/source/_static/cyclical_diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8aa0d5f20c6df554e091339f80e2c107ec1aca3e GIT binary patch literal 38182 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

bosk=tr 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/cyclops_arch.png b/docs/source/_static/cyclops_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5bd1af44a6925a6905e58b883a34ea7c9c3546 GIT binary patch literal 562210 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±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±ch}}9iCc?QLDtPo=r?1Pbu+$H)No=FUMVAB^UhQ!n zXF_0I8-mCcqO|-9#Sq&RAF^|JEH5Y1=jYRZ&Zqy-R#5?x@YThN%2X@Wz(pED)ck1j zRUyZ8yg4i!tOUh@>}fkVxw1w^MzI4Eqr-3n?cZHtkvbIpIsR-dYbVdd#Kg+$8~$8p z(x)$G@rjB6iEl`0>|Z-NzVR^5F(-3D(a3Jn)5X`nh=TJ@S^Dk#+JEWEyF)=VM?@^L zjso30ElNTs@?6Kwi{vVSt-h)1)C@fgzd6%s)-6_s3mJekxqmeAI}91oAxN<8Am8z} zvUXn~@hTqCUK*FBI>#5)C(m{IXGMEuD}dUQTsl8*iqH-j1_&+rX~hobS#8U-BzUoL z{H7IVcPd5RwBRkXXX0r zSRr|4?rfaS(3Eguh|rW$ zFd|$H{LaG3#!H6x=&52YalL26Q!u=UgwZjsuW#+i$AkOOZ6qgN{o`OBZ5d9
;LnNW44awFomx6j8;2zkS>J=Afs39Dfs&pC4 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 frtc?$|zL;Rbqbr4? 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�k+eix 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 +f7N*rAhx*Q6ZdXv%A-I>^H$)O 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 )} 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 -YNXPf~^>x7%dBd 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⋘+jYIsMlSaHJGafxg#3h-N~m!(be=j8eE<9f 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 z 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 |\.\.\. " +copybutton_prompt_is_regexp = True + +intersphinx_mapping = { + "python": ("https://docs.python.org/3.9/", None), + "numpy": ("http://docs.scipy.org/doc/numpy/", None), + "pandas": ("https://pandas.pydata.org/docs/", None), + "sqlalchemy": ("https://docs.sqlalchemy.org", None), + "sklearn": ("https://scikit-learn.org/stable/", None), + "dask": ("https://docs.dask.org/en/stable/", None), + "torch": ("https://pytorch.org/docs/stable/", None), +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["**.ipynb_checkpoints"] +source_suffix = [".rst", ".md"] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "theme" +html_theme_path = ["."] + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst new file mode 100644 index 0000000..07f23a2 --- /dev/null +++ b/docs/source/contributing.rst @@ -0,0 +1,37 @@ +Contributing to cyclops-query +============================= + +Thanks for your interest in contributing to the cyclops-query tool! + +To submit PRs, please fill out the PR template along with the PR. If the +PR fixes an issue, don’t forget to link the PR to the issue! + +Pre-commit hooks +---------------- + +Once the python virtual environment is setup, you can run pre-commit +hooks using: + +.. code:: bash + + pre-commit run --all-files + +Coding guidelines +----------------- + +For code style, we recommend the `google style +guide `__. + +Pre-commit hooks apply the +`black `__ +code formatting. + +For docstrings we use `numpy +format `__. + +We use `ruff `__ for further static +code analysis. The pre-commit hooks show errors which you need to fix +before submitting a PR. + +Last but not the least, we use type hints in our code which is then +checked using `mypy `__. diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..adb9b40 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,12 @@ +Welcome to cyclops-query's documentation! +========================================= + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + intro + contributing + tutorials + api diff --git a/docs/source/intro.rst b/docs/source/intro.rst new file mode 100644 index 0000000..a71062b --- /dev/null +++ b/docs/source/intro.rst @@ -0,0 +1,82 @@ +# cyclops-query +=============== + +|PyPI| |code checks| |integration tests| |docs| |codecov| |license| + +``cyclops-query`` is a tool for querying EHR databases. + +🐣 Getting Started +================== + +Installing cyclops-query using pip +---------------------------------- + +.. code:: bash + + python3 -m pip install cycquery + +🧑🏿‍💻 Developing +======================= + +Using poetry +------------ + +The development environment can be set up using +`poetry `__. Hence, make +sure it is installed and then run: + +.. code:: bash + + python3 -m poetry install + source $(poetry env info --path)/bin/activate + +API documentation is built using +`Sphinx `__ and can be locally +built by: + +.. code:: bash + + cd docs + make html SPHINXOPTS="-D nbsphinx_allow_errors=True" + +Contributing +------------ + +Contributing to ``cyclops-query`` is welcomed. See +`Contributing `__ +for guidelines. + +📚 `Documentation `__ +======================================================================= + +🎓 Citation +=========== + +Reference to cite when you use ``cyclops-query`` in a project or a +research paper: + +:: + + @article {Krishnan2022.12.02.22283021, + author = {Krishnan, Amrit and Subasri, Vallijah and McKeen, Kaden and Kore, Ali and Ogidi, Franklin and Alinoori, Mahshid and Lalani, Nadim and Dhalla, Azra and Verma, Amol and Razak, Fahad and Pandya, Deval and Dolatabadi, Elham}, + title = {CyclOps: Cyclical development towards operationalizing ML models for health}, + elocation-id = {2022.12.02.22283021}, + year = {2022}, + doi = {10.1101/2022.12.02.22283021}, + publisher = {Cold Spring Harbor Laboratory Press}, + URL = {https://www.medrxiv.org/content/early/2022/12/08/2022.12.02.22283021}, + journal = {medRxiv} + } + +.. |PyPI| image:: https://img.shields.io/pypi/v/cycquery + :target: https://pypi.org/project/cycquery +.. |code checks| image:: https://github.com/VectorInstitute/cyclops-query/actions/workflows/code_checks.yml/badge.svg + :target: https://github.com/VectorInstitute/cyclops-query/actions/workflows/code_checks.yml +.. |integration tests| image:: https://github.com/VectorInstitute/cyclops-query/actions/workflows/integration_tests.yml/badge.svg + :target: https://github.com/VectorInstitute/cyclops-query/actions/workflows/integration_tests.yml +.. |docs| image:: https://github.com/VectorInstitute/cyclops-query/actions/workflows/docs_deploy.yml/badge.svg + :target: https://github.com/VectorInstitute/cyclops-query/actions/workflows/docs_deploy.yml +.. |codecov| image:: https://codecov.io/gh/VectorInstitute/cyclops-query/branch/main/graph/badge.svg + :target: https://codecov.io/gh/VectorInstitute/cyclops-query +.. |license| image:: https://img.shields.io/github/license/VectorInstitute/cyclops-query.svg + :target: https://github.com/VectorInstitute/cyclops-query/blob/main/LICENSE diff --git a/docs/source/reference/api/cycquery.rst b/docs/source/reference/api/cycquery.rst new file mode 100644 index 0000000..187de7b --- /dev/null +++ b/docs/source/reference/api/cycquery.rst @@ -0,0 +1,30 @@ +.. role:: hidden + :class: hidden-section + +cycquery +======== + +.. automodule:: cycquery + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + :template: custom-module-template.rst + + interface + ops + base + +dataset APIs +------------ + +.. autosummary:: + :toctree: _autosummary + :nosignatures: + :template: custom-module-template.rst + + mimiciii + mimiciv + eicu + omop + gemini diff --git a/docs/source/theme/static/css/cyclops.css b/docs/source/theme/static/css/cyclops.css new file mode 100644 index 0000000..45fbc6f --- /dev/null +++ b/docs/source/theme/static/css/cyclops.css @@ -0,0 +1,326 @@ +@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap'); +@import "theme.css"; /* From sphinx_rtd_theme */ + +html { + --text-color: #24292e; + --heading-color: #404040; + --link-color: #5097ba; + --sidebar-background-color: #2e76d49d; + --content-background-color: #ffffff; +} + +body { + font-family: 'Roboto', sans-serif; + font-weight: 400; + color: var(--text-color); + line-height: 1.5; +} + +.wy-menu-vertical a { color: #98a8f5;; } + +h1, h2, h3, h4, h5, h6, legend, .rst-content .toctree-wrapper p.caption, .rst-content .sidebar .sidebar-title { + font-family: Lato, 'Helvetica Neue', sans-serif; + font-weight: 600; + color: var(--heading-color); +} + +p { + line-height: inherit; +} + +a { + color: var(--link-color); +} +/* underlign lins on hover */ +a:hover { + text-decoration: underline; +} + +/* Monospace typography */ +footer span.commit code, +.rst-content pre.literal-block, +.rst-content div[class^='highlight'] pre, +.rst-content .linenodiv pre, +.rst-content tt, +.rst-content code, +.rst-content pre, +.rst-content kbd, +.rst-content samp { + font-family: 'IBM Plex Mono', monospace; + font-size: 0.8rem; +} + +/* Inline (backticks) code inspired by docusaurus (which Auspice used previously) */ +.rst-content code.literal, +.rst-content tt.literal { + background-color: rgba(27,31,35,.05); + border-radius: 3px; + border: 0; + color: inherit; + margin: 0; + padding: 3.2px 6.4px; +} + +/* Sidebar */ +.wy-nav-side { + background: var(--sidebar-background-color); +} + +/* main content section */ +.wy-nav-content { + background: var(--content-background-color); +} + +/* don't change the background for the area on the RHS of the main content */ +.wy-nav-content-wrap { + background: inherit; +} + +/* Pin the Nextstrain logo, project name, version, and search box to the top of + * the sidebar when the sidebar scrolls. + */ +.wy-side-nav-search { + position: sticky; + top: 0; +} + +/* Sub-project name, version (optional) and link back to the main docs */ +.wy-side-nav-search > div.subproject { + margin-top: -1rem; + margin-bottom: 1.2rem; +} +.wy-side-nav-search > div.subproject > a { /* subproject name */ + font-size: 1.5rem; + font-weight: 500; + color: var(--heading-color); +} +.wy-side-nav-search > div.subproject > .version { /* version name */ + display: block; + font-size: 1.1rem; + font-weight: 300; + color: var(--heading-color); +} + +/* Remove blue accent border */ +.wy-side-nav-search input[type="text"] { + border-color: #ccc; +} + +.wy-menu-vertical { + overflow-y: scroll; +} +.wy-menu-vertical header, +.wy-menu-vertical p.caption, +.wy-menu-vertical a { + font-size: 0.8rem; +} + +/* Remove sidebar TOC link colors, hover states, and borders */ +.wy-menu-vertical a { + color: var(--text-color); + background: none !important; +} + +.wy-menu-vertical a:hover { + color: var(--link-color) !important; + background: none !important; +} + +.wy-menu-vertical li.current { + background: none !important; +} + +.wy-menu-vertical li.current a { + border-right: none; +} + +.wy-menu-vertical li.current > a { + border-right: 2px solid var(--link-color); +} + +.wy-menu-vertical li.toctree-l1.current > a { + border-top: none; + border-bottom: none; +} + +/* Remove sidebar TOC heading/caption color */ +.wy-menu-vertical p.caption { + color: var(--heading-color); +} + +/* the buttons (previous / next) at the bottom of each doc page */ +.wy-nav-content a.btn { + border: 1px solid #24292e; + border-radius: 3px; + color: inherit; + display: inline-block; + font-size: 14px; + font-weight: 400; + line-height: 1.2em; + padding: 10px; + text-decoration: none !important; + text-transform: uppercase; + transition: background .3s,color .3s; + box-shadow: none; + font-family: inherit; + background-color: inherit; +} +/* following needs !important to override sphynx CSS which itself uses !important */ +.wy-nav-content a.btn-neutral { + background-color: var(--content-background-color) !important; + color: var(--text-color) !important; +} +.wy-nav-content a.btn-neutral:hover { + background-color: var(--text-color) !important; + color: var(--content-background-color) !important; +} + +.wy-nav-content { + max-width: 900px !important; +} + +/* Mark external links in the sidebar */ +.wy-menu-vertical a.external::after { + display: inline-block; + font-family: FontAwesome; + font-size: 0.6rem; + font-style: normal; + font-variant: normal; + text-rendering: auto; + margin-left: 0.2rem; + content: ""; +} + + +/* Breadcrumb separators (at top of the page) */ +.wy-breadcrumbs > li:not(:first-child):not(.wy-breadcrumbs-aside)::before { + display: inline-block; + content: "/\A0"; /* \A0 = no-break space (nbsp) */ + padding-right: 5px; + + /* The trailing space + 5px _right_ padding matches the amount of whitespace + * on the other side of the slash (/) the comes from the spaces between
  1. s + * in the template and the 5px _left_ padding on
  2. s. The result is that + * the slash (/) is centered between the end of the previous
  3. 's text and + * start of this
  4. 's text. + */ +} + + +/* Tables + */ +/* .wy-nav-content-wrap .wy-nav-content .wy-table-responsive { + /* Tables are wrapped in a container
    (.wy-table-responsive) to handle + * overflow. Set this
    's width to the larger of (a) 100% of its + * (several levels removed) container (.wy-nav-content) or (b) the width of + * the viewport minus the width of the sidebar and some left-side padding. + * Most of the time the latter (b) will be larger, but the former (a) will be + * larger when the viewport is narrow and the sidebar is hidden (e.g. on a + * mobile device). + * + * This has the effect of allowing tables to expand rightwards out of the + * main content container (.wy-nav-content), which is limited to max-width: + * 800px for text readability. Tables are at first allowed to overrun just + * the right-side content padding, but as the viewport expands wider, tables + * will spill out into the new blank space beyond the main content padding. + * Allowing tables to extend right up against the viewport edge makes a table + * appear cut off, which makes it clearer to the reader that expanding the + * viewport will reveal more of the table. However, tables also remain + * horizontally scrollable as necessary to accommodate overflow. This + * provides two means for seeing overflowing table content (scrolling or + * expanding the viewport). + * + * For reference in the calculation below: + * + * 100vw = width of the viewport + * 300px = width of .wy-nav-side and corresponding margin-left of .wy-nav-content-wrap + * 3.236em = padding-left of .wy-nav-content + * + * -trs, 16 March 2022 + */ +/* width: max(100%, calc(100vw - 300px - 3.236em)); + + /* override earlier max-width: 100% */ +/* max-width: none; +}*/ + +/* Mobile nav (top bar heading + flyout menu icon) + */ + +.wy-nav-top a, .wy-nav-top i { + color: var(--heading-color); +} + + +/* Footer styles. Largely chosen to mimic the previous rendering of the docs. See +https://github.com/nextstrain/nextstrain.org/blob/b1e09e57e91ed0c9343e1cd3104877ec3c5344a4/static-site/src/components/Footer/index.jsx +*/ +footer { + color: var(--text-color); +} +footer div { + margin: 20px 0px 0px 0px; +} +footer .footer-small-text { + font-weight: 300; + font-size: 0.9rem; +} +footer .copyright { + font-weight: 300; + font-size: 0.8rem; + text-align: center; +} +footer div.logo { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: 0px; + padding: 10px 0px 0px 0px; +} +footer a.logo { + /* Using flex here (to vertically align the child img) causes aspect-ratio issues */ + flex-basis: 120px; + margin: 10px auto 10px auto; + text-align: center; +} +footer a.logo:hover { + text-decoration: none; +} +footer span.logo { + display: inline-block; + height: 100%; + vertical-align: middle; +} +footer img.logo { + display: inline-block; + vertical-align: middle; + height: auto; +} +footer p.avatar { + font-weight: 300; + font-size: 1.1rem; + text-align: center; + margin: 16px 0px -10px 0px; +} +footer div.avatar { + display: flex; + flex-wrap: wrap; + justify-content: center; + line-height: 2.5 +} +footer div.avatar a { + color: var(--text-color); +} +footer div.avatar span { + white-space: nowrap; + font-weight: 300; + margin-left: 2px; + margin-right: 2px; +} +footer div.avatar img { + margin-left: 5px; + margin-right: 4px; + border-radius: 50%; + vertical-align: middle; +} diff --git a/docs/source/theme/static/cyclops_logo-dark.png b/docs/source/theme/static/cyclops_logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7f3c15295280a51c2dd4654b2248dd5be41c5d GIT binary patch literal 124173 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 literal 0 HcmV?d00001 diff --git a/docs/source/theme/static/cyclops_logo.png b/docs/source/theme/static/cyclops_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b98f8585703d11e01b6cb39f15fc8522fa59706 GIT binary patch literal 70453 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πtNKko_Z!J2M~zRo}jQKX?^a#%5wk#7n_Zs)R(z} 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

    6&kxlCJw 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 M>FMjy=pOOiZyUd3bN~PV literal 0 HcmV?d00001 diff --git a/docs/source/theme/static/favicon.ico b/docs/source/theme/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e0b9daca50b31c0630770cde39435bb6fb2e9ff GIT binary patch literal 39583 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. + * -trs, 8 July 2022 + */ +/* + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Dave Snider, Read the Docs, Inc. & contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("

    "),n("table.docutils.footnote").wrap("
    "),n("table.docutils.citation").wrap("
    "),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t.closest("li.toctree-l1")[0].scrollIntoView({block:"nearest"}),t[0].scrollIntoView({block:"nearest"})}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;tW< 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 literal 0 HcmV?d00001 diff --git a/docs/source/theme/static/logos/vector_logo.png b/docs/source/theme/static/logos/vector_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9b106b085393449db22bc20755b3a6a5ba46d9 GIT binary patch literal 96586 zcmdSBWn5Iz*9MA+0@6x1NH<6*CEcCUN;iTGF)$z^A>HW^l0yvAFtkb|J#D;M<1cM1f&Lutu`>G{LSIQ! zl6zH_rvq1=8bLDM=3Y3}Gr%6`f~lK@$7R#OhYX%-W3p;h88^4;Gx(P^P%J0*7p^u- zR*AN;%gcS)FzLXQ!4dnEZ1v9Li_KeI$KU=S&Ov)0$_Mz^r0=nCn6d8R$zlB;Kh>YS zQd?+K8};B8=g%merJ#Fb^lj}W0d|}HuPrql6N%r+TDA|dd+n+Pvf#3+8TkKn{R!|YBfH5);(1w)&l(&o%kp>Oj3 zA{MdQT^VbqDMXTS{(l>mRJ8J~g%5`y3w?ljSF>Ivq`OroWZiFYui`AxVEcmNjp<9C zFH(+ed-FSolllu+DI-hOmO@vHh-c+*1r3VCdth#-sd(6L$`$tpIshGDcQe2se7Mbg z)ZX8ptg~HHzNEck7@ioD!%%N*1+Uv4{Du!FjJ*)IDkf(vc_?Sl6 zD9=f5%VcUkc66o>W4qM8@SiWZpS5RHDD`NT$UGf(@Vb*##LK8BpVBR&Dztw00%@-G`*tjnuQ(8L0W^rbtyoi_$LX-jlAZ>u_L4?_7Bi;Qv zd1T=U!WPA_EF{3VZxTAbfJ!eNd<6*i`KrV4i-TU$|uJX3)J$?H!N#>{@#wFg{Mrr7%g&FRK~`(miNYK&7F=^A@A z#{7<|GlaXnsG--!3`J{kY6WaN39cSI9|$~Sn77Vt70B@L={U9mx{A%f%R3m3j9(+t zk&;_12~P0ip{-~-x7`oO+k6Q;C5uAZU>Yf8`aQzVstO_%2uS2@xTP!Sv2kSDx(ltqV1 z^2V9)Scs-0{LyZ`@AKm%_2KGbol%X8YpN#q?TdS#1I@7*DioRpGn*dS&Nvk@E)Oy% z3vj#8aW*f$YOL+x%T7V)>j6UCaqSiurA+98^aIY_r^S03;GZ7b=ROm^K*rcfG{dF3 zp5L5$I6U3#8vLd*BlSA=+`Zz&YTKRK73@=io}TqH&P25zs(`562=I-U4CrTJEYBH% zhtaOu-Xs1`BdL!6bkX{ON)qc>O&L-y(BM#ANO~^iCHgiY=V*2&1J~wcxx8!Tdwq0N z{bGl;=4O4*+1dtg1+N_-;wqx%3zm=ZOD%*uGTT=)y`webLfkCGoxjGV_COaD1!prH z3-aMF8oOo?Gxm$^q-zA9{x+}i98JhX)=!`Z2uTZFO4|Nnoh}%OUlh`*Es}vV;1UJm z%bgd1{1vaSGzNPJL+OhrtB#E>pz{hN z&q;XcQ{RwO-KHDSLD;!zrfFMIu`C^c30IZiYhtQL9gX`MilTx)ZTzBkFK7KNN*&oY z)G$BW|FY7>4e+M?qLU64sQ7}?pk_(_G+rDeK)17Cd;O{z-qgC7#^n0IeR4n5)RUZw z`Xg#n-)u~e|CPQA(jdIAE}<~y-Nc6LV>j2~aK2M3brRAVksSclA^C?Dg}>(>ROB^8 zUwA*hq+oz4pi5=zIC2Y3){<`aU3}&W_k^NgEZ5B^9+g|{n-b{oEhFQR zV5FUGSbNYl)W~i!CrO5p(gE_RyQWmB&G6)2vxn(*xTi#|`Fz+Dp*gY% zb(mA`DfE9raa1bDY^2NJx=otpa{Q2C4iCYcL>{Jx=~{q3IkNWKE$R5ml7=6aM2Cts zjLCjt&)xX2Gftg(Q>6nEwIQ*`63d0dtj9v?Qv@vsH#vl(_IG`^Hayi~$iK>LObJy_L1%;{@m#S~q zwHE>r4l49i3I0{OC_ikJ;`&&lX(JD}sX*nBQH~u@rbe3?1E17J4P+2<7RX?YY zy>9gcnD(WTG$}T!sML@i(q1jEYTSD`^Z_~gg=Z{S4qMT(3<~qtH7lsCR9gRujI?U% z?T}tBKcLsJ%BvtfX4CTsSD{cmn~qoEe`e;wCm(2n95ywDq94temN{`n8{@~->d(@3 zy5?Va<4-TL{`liuv9T)^wUPvX0+))Rr_=CH7n8dXy1Q0pwmCMUYCqJj}{tH8@L)*ynICoG%y_ zLft2&or-W!=?^vdo4BvFT^N3EWv-LfvJek@_c3*SnaLyftX(KUfH)bpo!2zzD{6P^ za!#2N+l(x_R^MwZhICYc`5AUCaTF+M`PGf%OjV1N6SgoAA=?h}e+Y7CB?zm+`>{}t z62Ze@H|qCtRq^Nw##-r`D84VGS<+!ycGI#^lfu_|R~qu~1D{004SB`HN7`o@+I7?9 zM&e;4DY6~GOl<=S%z@ao5{NSnT|8VCtb0z_3rMsUiEq@WkAhk_9Ww2yf@1g^qFl5Ya^|TM0f4T}F?QS<*c zD9|amiA)Aw>}52Q_sbM;HHDhrw=s49IJP(Q{_4JCiIwYj{@&8Qe(CwI$2No8lsy9P z2wE7u7W*t~`bBVjScDey7X0j18eerd=C5ZF__*j@eeA9RBKUiMj}5ww9Uv$7Oeq#e zGtu?S7p-5vc+%oH*6Q2L@=6frPC0*a3G(K}KaBbm5m0b`94ja561+X+tIiDSn06*f z8_Ee0{JTZa@dbi!(=0suNSg9#zEEXz@^EsvdXx2xa^DOzex(As{NoRWRUgros>b|a zqz}IjYOr`zC3DEsPIQ;RT)Z_822|(ag0u|zvOlW*@NxVN>zlT^$^<>(>?`hlUpV(L zyew$=#O5DI+8j%tAA>A0Hqkrxu5-nx!ZHd zh&$LV)csXOo}c^1L@g~U|9o>Q7uGS_VEoT&aXl2ds&s?@kU>5cAtR@^WyiBCT$!3q%&;ck8btXN{X`TLOFs;Qy9QYYLTS%p?XQBj^EZrVo|7KUN~ zRw%EY>NLEpXW8-Q=6_#US^6r@xD>uBmjGt&Bpj6tTbKZF%YDtXx3e3!&|ggB0PK{* zBoH{HX1sBoE4HSg!Tb!w7nyM|Z#?z=5XkJ2(s>VI_7mC6%^(?ST#J|!>#gmd-B)6K zI=lSW%=(b|#5oEEs#t((g4}%vtzT7=4wuz@V)BPvhzxzv?8cy?hwHZeFaDGgH6Z`M z)E&!;D)X9}o}YSnY?+s7HowF2#D@C`c{f5#tBb6&PQ(J|O*_?{WNKW$_jS2~;0{kW zT-pYIR(ksmrfPKyRc>+g`T#tL1{W%_lswr_Sb(;6;cg zbkIcMxk-x;Jcj-(u0yH#P@7#4Ab}JVp2>o_Is8qKlNk4@a<7+Pq!mH+m4ZK1-!P&q zy~YPU6!*d$Bb=k(MC}K(i$ak=5a{-@?rmJ?Y&?3U*z; z{Ax#(KvsBz>%MqcIIK9Dn95Dr7ds^sr~wbvG6y|L4dk?Y%y!E20Yaj+fp6kmH6$mVIpxdSXMiw*e~wnYTSbM zqKSKZ{W3j~N3{~JZvA~#JMTVd0Z(xgckRNf(T|L3e2iu63btTOO}up;GEB|L=IMpG z1+K^h2+d`P$Gqc2W>maqrDP`^VA-43PM9~FxTEdrXnv>7msroUex3MrlYR+$^7oi3 zp+o$Tvs%M4yXPMSoq98sy zb+V(#>m}_VB|4_dxyFgEssu=;-@KfrjDW~6J&mKh=_IgjYmv=j*4RdTcP75HTA~U$ z;gAZg3xTWVqDw3%Jy4ST6R_Oif)v~hArA1f$_M#|vqlq8lI~P3Vhz9RaVh8J96FN><=l^pNfx)= z{nTDQ(n)ftJN@;W8AsuCT3%vA{);mA-C@6}vW#n*Zyge`-1Ov)#|1BWadu(c5M)p> z@N%+oOF&u^%t5pK#uN$P&b@-ndYeI!l|wm06)5-Ll`u~p0^@8~v#BfDNHp54xI$p| z0wzOs@kG&U`m84CyN@U~jP;`$)u$9_C3&HH#2^1tNd>Rze5CxzJsEq`=pp>tt|~{3 z0#(yYClMxFyD3IU&dI$`Xt%hEtr1lYp&!p%#$w2)^AY&eFYgp3w1-PcnHLyb~vvLb{QHr(- zG-j{@3?B*G`@Fb<);Z@eozzS1O$-~09E7g=2@PiQ8ZY71cE)w&a;a#(aoMEsEE7Bq~E#KO!W{lIJ@G)!Fu)UtN!dHh)RghyomirrvkG^-1Ut4<-E_Fs~7G4%-{NoXbw# zbK~iWT$3sxx^$utAMqm%s7^B_$+!G1Wi(dNGE~j|2m1ZcptPb))@H{0q6YCb`CWC5 zq+!~`qLSgsa4FG;X~@Gv5vCvKN@+%|ViERj`jzg+rhrbU=`busy;FUru@e!^GDQ(o zM+X>+T6M4!ucqEaJ$?HQ*W0S~<-9?cTdx<{Fh>yLFUk||!R9lRxHQ=VV?S+{){|)- z8@TD{ED9qY+(ykrSY%Yf%qyw}7&TRhOg&mhYTm-wiz@0%hGOJGSW zt%xWW@MV1esM}rcZaftsRr?@EEYtYmXqkrX9t|h65JwmWQ!mET&^Iw-g?Z!o=5;)g z$U!VQ(VuUh~^}l1+z()`HRecG$H+uHqwcri_-lsd9VqlG;2055nT` zt8}{0G<&0>B+=f{(_Q2GkqFYP2Vq9Up;rAfkaL;X^pDKPtlhu-t@k6ENq5+i3=*9d zEy_0EalYn}d+m+^`gTwH8F3zRbgRe+y`EOYT!JtR`C&l%@58zM2pK%z#|32vN=gs# zHkFwhi9z?YWtzI{vbe~8@w3)lZI75x8O10gr;_9m~HpNEWB z8Madi&ENM;EJOEKdh_!Rq4)6r(TTS#Ut={L5Tmi(8MepUo7&Jbj~MjO`cZYtSeW$_ z`lCB79*3z@;XNmP&56Wv(=c{u2>uk8 zaYjh?1Ps87*}2p5$F<%kz_N#neg21U00#+C)v- zJ}g6or5&*|vBi~MKH2>|`@ahp;Z%m#Wfp-hrn?Xf8J*T?G_4j4JU4VgSqct6A)O>^ z{Km}B`Bu>E>f2G3XohWkhDXur|4QO~#d##gORYW{vy^ zj7w?6^iw0!%%Y)YZZp?!+H|fG&-z$xBA~8prf{L|Q)*)Dg8u4H)p6z`-0m(1u6!-B zL?`y8wEs;he6+IswP4&U4r-E|?(0wpU8kY-UnDj>j#`_XQRn3`>3Z}6IS46&oj!|j+zJY(h`R&Cfn|4F=lf|_Kh{#Rj3R{xgeQbv)x|tjcyRq>Y zw>U5&H2xf;g+?E=7&ERZiDyn`$W2f#H%I%W$ChF=uX? z@laZ_PDMShj1rIUyllJXr?f-P)P?D1^o53*p^3FZ<(=B%6Z)JB4fp;1Y8cRcHDTAf z4RF5}R0{F77DHgvP90`WK;E=&8LHxp>^5Mdw@BgJPyY(EFuqGV4`u~l~>khNiyxja*+nP#X`*(N2T$!!|?xzE-b^%BvJ zE%JZ?-WuIk1egX%jz`$O@%E@KJm&i}*J3$$AWLZ@iBy?{N|jYSo)SlXkx0v{@PZz5 zF!{8Y4QzI4TKIa?4eO*bvA9R=mET%?4pvGnN-3MI4uu0#l38NpL-tdVhM7I%NP)cfu(jQGseO`4qU|!yd0*!5+%qNcmrN~oa6aa z7Fp%8cr-D)zQQ$cRR(kNR;_v9VwjugoxMT1zM*S=bz+rhF>U7144CARZq+dlr*-{4 zLq}pO{pFdF^pNW~8~6lSl6sRW{Gq!O_1uwQ12nEnj6q%=fj`>nJ>*ovg?|fp5XG;0DX%5SZn$=Mom^ z#3cznaj_;}=Fr{1KUY-`+RAm#@)d{s55`iY#wM~La;O)Cc8-1-LEfHaXpm%F={BZC zjIJ<0l4#_DZ?DuaI5$iS$Cq0ueXdjd>L>EtaZC8av+4oGUP%>8#S2EuLp?A;4;X%5 zO|fw0Z-rE4sV~fa1qyl1J=Q>kGMm)~5*@svm_K)@^LpyFHPD?NneglF->&_=9P325 zVUHb~;b$O`1rx!u5*A6<4)TWF!5yO^$wN|NQs+3L(FTJDc-%}BXo0s(ULGo);(#3Y zOTRzbFp;6lx}MoZ+94g$G@@1y$boEXk4Gizl%2fEBMyUIP~>xBp|p6jX}EgSNl7qW zE;P4(r~UC zZArIvZ)>Q0{GR_J@W~`mDp3a$#LHEZ*?kHE${5TSZ>>7krqkHzw(SNx6lD-?Pthd6 z|DqST?S`*b8~BZy)fa)C&m(8NHZnt=|L`?*OOJ~0tVPE4j@zr+F~%5jwUrvKV*GQS zDX0U_)vJmOmBgEZADzdM?QpbPOci6SivH%a8(@V%qf=X!%)>(k&3T^f7idX|ha=cx z7Y^(N!N$aj?){<0v>5NJ{F$CAOG(GGY(SnpBi}f+Wr$}3bN9WV{uZ?(*|%3NHYc#7 zh?T9ZXwq}xJIT|95hFG$7-uiwy$C74!EyCN=3*P_wuT7!-;~g)43VD+wL~;a_y)zo z>9}0lj~XqT?Z9Zu%wTur#A9}r*k6B5_sQ9O zJvPi<7-~B&-(U1MrY&#h^^D&|-=9yYXyW}-_}Q?)juR9o&*YTlZqBDO=i%mEaxn1O zAX*3J`gYg2e0YXGkmK^%k=E(`N>tXWe7A$et3FYzmsE?Lzk@+D#9O~RRrt4pL6sE} z!i0rgu9YsM(oU(im_}o_)YP74IOa$^oK3VatZ5eQHSUzTP|(7TE={0pG1iI7|*3*`$3+ zdmc6io;f7Qzm4nW@>`Nu6p&IfE%7aY{wOEG6dk+{#%?NGjy&2^ROCJwr$ZZ=N45Tn zDM^)`Rh0rakcipe!J#-^=Je!}W0ys&a)VFHQfbGrKbse=`9fxm?|~b5g%OGv&=#%A zd>RdllU6CC*;p%xlNfjj_9czu3c~=RB+)P#}Oll;zo*pq|Pdx!oWK20)Ltq$v>-YOj^ ztewcU=9qj{o1xBWb^jYHrh+0&3$NH0(WXRMG!^IlR zfSDx*{b!CcutA@~4Zo!NeN%S0gNK6{1>$xDd`<44w>5W$N_d0J97&T)`kLdEzvgS0HIr=rS|a2h~hs!#Jxt(2%ZHW0487 z@Bwyc9faLBbMUh6cA*zHP-Z9B3SlTgfK5Un2q@C!zm}ut@mE2|Xe|0h8}V%og<6;) zB91n6=5$7{nB%6eJvx#->@C3hj zMc<8J+-!E{J5;Bovb{8+HyGa;_hK;mz>9JbeJ`%5m}z8ue^#`kM!SW56{9RwDgR8^ zD@B(|rwXi!q;`~wq=Ntb1tlLo;k7Oe$QfE#f6iP06{pL=C{1oF`J3bVZeP77@{^~U zRhqW#q1Dekhy4w7wm#!Yt9_0agUL2MNJAG%6)`oXnbxDs0|5QT{C14kq@>ubzSCpT z6(_N z!ozFJrwhou<>g5dR>p=gNPl7fdZ`(*2k`4+XYyQGe>zY4{{4Ln+;k<{e?j~=q5|l` zrL4G9n9BIU^+@t14`U9oW&ci<_9?}huD!v_A@%%lb_|+N!12K#qIuyyQurAuJNogX z$2bO0UnBS$!>?Au7)&n9%od&-A=1Hqs8xf{uA~DAasZjL>{YV22@H*ro(nIC;3*c7 z265JSCu{|aii>Xkhx`t(aB7id#k5M2&P4|Ru6S|&PNZB0j?aEMMbn{9p{^oP$9Log zUEMLqSM6^S9#8D5+Z>{-Zn`FG&8Br_9CZG1z0D=&e5vw^F(48p%x^h5a#G?xWatVR^N zBfH-isQVLYtLqx}%g#w_26OpaYRkH=fEFGNFn#V83%BTg|0HZl%9W_eBWe@pTkVk( z1JaNITNp2^DSi$N82r9zXBKtqjsMwA=*&)$M)^KjmV#=vv#t9cWN+u8xtN|588*yA z8p@tQKJ$w@v&Q^wl7~EVpD7XlQjT9b#CLi@BS_V`g51xS>|39`BaSTd4Y9XSC9+E= zGw5hed$V($J9h3X&Z$KCtoUt8;pZ>iIHlA2HmvTp?XW)&!WMA=q|`Cpq~Jz0tWC?I z%<9I=6<;AADS)(`Fi@?JI)cAW`SK`?z~Lq@eG9#}%vR*CdL63Wq2OWG6^s(dZa7eG z#7KN5G^p%+`XX7OU%j`l+8@i=N&y3K#38gjKmp{0Pnsl^`r^|5Ef*C+UhizFgB$IN?X5uo~$=L^pih zIeK3SAkD5fUYQvzDU>8T{qbqRzNOBuhA;To3d{q^aYc;Xm;fw=UzPb%h5-%AKIvZL z%hpNR)e%W9Rb4xHJc%y?(&gyDflQIu0~59S2a1vR@v(XFf{lFo4ysn`z7dH0xBg59 zZ)Z1-n{&UsU&qi%Qe5|ro04XUg}w0Q@tvu+?#0JA>3g{qoZlD+CzvqX?#Nr0xr@B> zkF(aTR<+|VDoRJfjyq+)hD_fb3GcfJ@kSh!sEn<5o%YAiGF)TF$LI{0BaPV%`yD1C>hDygT8ViR{u3P1y6J25O)YLX z?gq4@r;j72b^K>EvuIeW|MW|$0@KLIg~G#lhAr}cQ@_hf3Y{6QvPTQ6wh9SCj_(dj zENn2&jwn=7RKV-&2GYN^$aXK86%OMH~`u z4qxI<#+v`rAF`g`Qwijy3y3ycduu(IP5&>qVn&L z?5(*&w=@(C0%g;@wj=+HxRXOv3S5+yO-zp~!QR}LCG25>SvcI`|DKE|*PSRg{|j-O z&A`(sxOFK2zi{2}TKME&jtM>gjJQi=J2-jp9;+JErd_|54RK@9(s4WV7mdN zqCxy;KhoV(nf7ewFb&eIb?Gm0+ARj#J^7UTg5aOiVPWfF#+Uk)qp}qnyFt=gF?U)- zI#I=A!q8dz{Pdc|xA6YI>6<)$t<;e+X#Z}gzp^-$m~!LP_VQAR1~<4T`U~Ej6+RgI zh6A;H)FpR3d~$&4mxKH2>&#qtFWQXkHCvkTyLlm3i!`x+Pjw?j3@Nv zv@qiT_TV~ zi*Kpx<0UxN?C{9HNTY~*TMP8T-YZ)mZFhTg@(I;AnOLTPsko0guF%$oacyq0YGd5u zL=ti;uMTZp=R?scUiP!;fLyS%X-4RoN7LmiDdUfa2jy#K2DkB)BDH4`EP>Z5>m6ar zBM#{{gCp@n5%+E`>pBdA7eH8Db$YEl1cKf^G-0tZPdp15P5|JOx^-uQZK{45fttF}qvtJA!3pGpGUo zJqaC}6KDUuxOT8Zwlr;O%@oa&=nmSG7)nbt6{F-xd9jf@q?5w&d~%#nvD&b7f7bq4 z6d6kP+cE3?DOqK0cP+llxw>?Zqd}F^Yy))?6@{{(*l%OF29h`yHr8PZw7NtRsqy^_ zi;ojc1B>Vk|Ipa(4G0s(RQD&kduhE>+?(q^3FWg;^pSMnjy94~ioe#&?tDSH_sXx~ zUZnfZD{oX|?vI%41&D`5`7=i2+@=y;f-c;7k%lU#y0W4P8@iKX=`Z5F4tRr*au+(L z@6f?Pj(jat|H&-88HSO!U{TalboiXP)cU$jF8F-d_d00G_MscN344ilkn|+;jrh0E-a6RhHIFOc}u218~ z1f9(6M8g+LF3M4J3-{;F>@#MYSxse0NO%|i&zJ5j75?uI7Y$4tb5*8UuKD)ouX5+$ zTPT$|D7sC9p~IquJ0hm`XVmtmiCHlk;-p!}dgy|qj9xac{bX*Vdy1e$>X?4he2;bw5=8R>{iknEvM z%gn^Ns57>31`-8g62uA?fziPiohUoSok6{R6p?I=c-qg_9ktjsCN6+))P8P=D$eD= z$eB;TLaW42$~uX0Ucmzgoor zG%Gme+;8H~BaxbIs~^zxSM&oTOa0H=?N9r95~+ZWbLD10hc}-uteWd8PadMV*x+q| z5&$-Ys99AAUi=V4Y~~IO_PiWVn3z_Vaw$5}!_kuX0GR(gsZ)Uzu$pBEplY)m7DT)a zj@B{P&Rcmi+aTZ1x zL^5)RM%^bR!lkDi*g*|3M&#Sn%qJZQUV1W+FNJ5OipYE;J3@*P(x(V&RkIqJM|u^& zEwimq0V!uHrV?+)Z37!5l>gD8+skJmMsCq#cqAyTnX+~BmrCFN<-Z@HZX;>0t@oP1j>1KhF#`PwE>B<8}bCbeGFdm3ng<7T@|v6 z7uCIg6KkubYJo3>e;msznpsRpEIwkp6~dtVi^nb9YiJ812bNeZouY&f|Rlxm6h6k<*9DaxN#tNj|kMWs6 zht|%W-h)W@8#+g+EqOR)-6V>2yO>PV6{{`dX!)1F?68nli&s?ETm%MhGgI!Rw-4)~ zen-|-#YWOzcd}upza0~e-)ommf!iCXeDz-m1h$28E*GzI=&Br?Rm@lz^Ia(evM(m^ zu1b0)We6Q)m0^Yl&p?CUb{rMK(CrGMFXY-;-Jv?q#qFFG6MPmDy5opZeDorDdCpJhp@vn@m6Pal=S|!(h zAuo95vZHsWS3FV%v4c8-8vfl@2Lt$Fvzj;a{0MOcjh#Z z)fdl})OZ~GgDW~(`E3cXJ8E9of$3Qo-Yj@SC+&u($0L~^Tzdq&pZBJ)y) zPd|IyEjX76B@>qzbRRdg0Od4g=Sj<-WSyAS552}@7~m>#hOhFu!#7s*<*qsEU>sA< zZPv{&zS$urD=WuNsxXPOlmyk7dXLBNue}?N;JzhU)~`v#I=mrs=WsKS z%??!27#%D}uNodXDcRh7f34~D+)cC8FjBP{A2l+|@H!uYR1pCjjuFZ-x^WfZVZWrp zfrX565H0JEJ+y~~2{7&{`^Dx>%tK7szGZFYvN8^wt3M?UXZ--pg_!f7}Cp&LPNW{VpkS>qy()s?IIOPWPXO zzk6z)nn$y_OJw8WqHS^SB9--RkfP}Am>y-_&fkX)b~RD;OU;QB`k^!91LQ<%YdPyV z`LK%2?{LFqd&-;P>YFMzWbV+yG z9h`6FB%`A0fh}u4Zy0GLYrK5)X(R~tgQG_L8kC8CR^tXdJ4>aXyXq_S95U9Pg?MGx zZQx&spU~0R0b*_!dd`&@wo-W*D~o1|N@}MT`^2+SWG+5$DRW;KqLiT?V;7Dri(~^# z#@X=SXBGV0uycQg1h0Lre9ga43B&s4nllcT%0JVr-9i{76A!uajsCu3Kou8kk;c(K zlnOoRKINzbUO^LG2OIazJnY4+(X0hczUn1w;Pi{uQ3PrXIVN_lvBXq8BJq=046#3X zS;^sq{TsmW(f5LCJiVm?BZ03zW|=NDEyiO3R%@Ok*s z6ze+GtLZ_A#_VVo%E8G^wy;QF(cjz(?YZ(xw|pInDjFWs3sHhUb5y;K!%JQf`tWmy zqnTp%^E%?AJ5ho}GJiAk>fnk;pw4khT&LH#rAVda)G`ca2doL}!;h@9jD_yJwe;^R z)Hy?Dm(u$m93H$b?k!xen>aQk2vsn?XeL%ZL~@OF28<*~Qu675&64~(K2EI+iCk$3@xM_PGbd*GkVlX2L+Ko4qu$+pW`Wta@ zLp+l<8g#66=2kx1KPbA}>Atr{eBuFN^Z`j6FqZaHrRNT~uQ13&+Z~1c+0G#!E?@Ko z&9G_A>tNd*GWTzKKFRglSxDZ=g}A4#{3#X@XGp5XERCnzo2yvOzkbU}#udOD15j@B z!v%VybfDsme>GE+giGX!i>Q^I|MYeO<-8Wr;L1SjvlEOR39nX2LTqJfV0=Xf>Rwv# zSNy**!V{lmTaz8H)brI)It#eu0%U~woI!Wd>gRux!-vuLfQBE`{S*5n^;Q><3Kr?-(^1PJf05<8aQMT@lSQ} zCz+><8S$6iREYJpO1#l`4(Hy9tu?r;Vgs2mOqt3PANhD6FGE8#`hhu>agffq3c6Ly zsL388gFhRzq&OCRITvHHXQgbe4ryOFFxrxyy?n{a>5<4U-+oZD8BI(PrFH>JkesLJ z-zl#T7j=j#vFqsn^Ot`IB0i~s(cgil8agjkrJ{~YnH&%C(x>z!26jt6l9S}Xf^(LD zPb!N-bPnNDR$(jJQuAq(Q341-x#Zb61h+)W%P`#YSV#WA_W?ChTS>Ewt6z(sxe1AF zpApcfT4(4VG}p|lyVO?J6Ss~kB}$p7UXPKn9=guq3G|B5AUNt;^zFT_xhctlXTFT4 zRqljnG_OXX@C>#9KtB=&NNk3%?99|eP|RmUOJ~{DoGsIy(DUqPfeT!<260arWfZ2T zUZiSZ=%h_U$1C3uekaf--QyulF>jQmvHNARY)bF)3d`V^N)@@W(Pgtzsexjt-%}14 z3F`Lg6Bo{V%VS+i935l7{6u!O->jzX!bOrrm`Ur4Or(V+k#oYhHvGXlK}c``*y3m`&%_-`#nWZ>Qw6!6CrOHhRMe}e zPz0+?*+p>T-d|-Jru6$KT%^nGC763zQ%lLbbq|NkZ*bI2o8yGu-D-Fey{z9Hq@vDw zul1ArJExM!M=YyKGX;5k|5OG%HRgx}H1ys^tue(0hq%RR6><=~(r<2RUBNXQ-?hV| z2>RC!lL*1IbNl-(Ki{F%Gx+R6S^LM`w2#=66jT{vS5j?hh~G$TyOnSMNQWM zfois0gb;UWt61H)jlJ6T|4r&J6JZPMyvSuu^p@~*CDaPu1XspZHc{p_)9{LsAMuPm zPgU`R7kAH{ zP7Owtislqe#a{Z(lp81I4s;p~ z+mij`{vxbNhOP9Ue4J*x~atA6zvl6wK;UH~HkzbUY1m+8bJb%A7 z#&(qoK0h27G+;&0^67655mVa^WT?65jzezgpmJbpaQ60>vdV*(jpr3j=;Bo6mXqeI z+55kII?r&PV9_qM5;)swZJJ>5!XnY%bAggpTgs{8KkA1O_drIQ`3_=;oJBp+3V z4VC7@lBFxR*m$JJb?TVe4b;O5;h?(ah!3n{I3Wr;2S_9vGjzcfaWNm0u!W^bA=I%s zx$tn9-Z&^`{{8RcOyF~tM7~v$W zTYwk<$-%qV8W5U5Xy-Y(nXsgEx>Xu{#G$^X^@*pigPwgvHT@a?t#;=wc+_F?Xn*TN zZ)mD)Y8J850%Mym+@Ws6;*^kVdXT*l+%w*E{x$XsArjVPM#oFEY@8_wW%e^*(&zmw zg?@}+adKT_bp0MZr0q~$*0se^_x;-|c})%+11nPxKRra-%-ya_B zbARCEz|?2G)swSostBI=H53=tv;W5dU!pLkoSiy~iY)b(b3Hn-Y? zbsjKDB*Q-+x2vBr@9i>`ouH|5q(e2`L_q3lCHF4>l%&$bu|O%WR- zY=<(09k$-Bb6V~Y^jZ&BBH7GtxMST_5zFa6C3hn1NrtM|+ho+MTpzTx6uOn*KE|fal;A7&k0YpcBT?pjxNN^m4pyH^h-Z;5gAKw$*o8tDITKw+ryErX8FENN@=UWcEW-??S!c1hPc32WCjGI&l{C8sX z?at<+S)~mS9Zbj+<@i1Xk5GlVA5*z@9^Mn(!0UPWNVg4#os>GNTT^Oesjf&`sn%}> zG%D@l1bT(1I({z?c%j>0$w1cPJh3vHI-GCX~V4V7Udxs;4Dtv2>PG@1#thkvI+Z$MaUHU zh5xjyR9NT!)ph5iq^R!qIIvOCWmmaHkBVX9MTejcm^RG?=|G$u;QB6|=Q+v%aNLh* zBc+ab4^h18;bLr{cYyQ1WhDr!m*QD1EeeiXAN!PCLrr*H zRv5>MHxeUvz<{cvjeX6sCf6;>DzhvyQ26k*)H)40mcwd6WXDtL6M z*<>wwJvK9M?$gIGCq2Hq=~RM4Zo`~J8s_#R(}wP+-qm-OKQTUF+G)uV0`H@QncTHvUwV+9Z0!gE!W$hMrt%Tk1^k2a;d5A zDVEF}iG^SM z!qb8j&5&Tnfo+57g7&CuB^a<3!PtWMyQ3DI9SMPDBK1eNud@Y_Ms=nmoj_$`8oMU} zZ4o_&B?(PsAr|dOR6{5aAf(mE=EgB~2-Pum%O7ZLbBl72(D!x-6?1;y&4ptvXp$%O zm0gDUT!n;AaF-?4`8oDN!a|QP`!a4{h>S;OqFJV{i&8aF;p|AC4p3D6gPZ`4uYIZy zEpR&DXOA1*idMb#;3BnrLp#t6Ir|QrUqI=S?^aa3-YmKElM$(dA62K(r!R@h%U!t923%({LOQ} zmQJ5VlK}aL|1v{z1)TR}mWANO35iqo3)K7ee!lnp`Tl$U!S2kNGbd-}#B%Yp+{7CoHsI_TMW{bZx`wCe_GI$l@XKSaSDh zMj7Yk5K&Ia?yovKLHL-zx3;wBrD?nJHClYwabE+pCYN}y9Ki=dB4A1UYi3ffnjNUdzR~>pEC80I0JW@mjqrHN z#Fl;?uZ+9x%NLq!T(weMhGzWhD6>b;UV~LtO_;fMKB`RxoTw<+i9sQ`W`jfEdpAo1 z2pLOVyhC|_x3EBg_2oD4w{-07sYoia7xCTaq6XzjyF@a+3VsLGPu48S!a;WTe z#8=rIab|U8bKKXT5Q3M5GsqI%LM-Qv+XH@aALSX46U}gh)=?pg*HDk5jDE9ZH;Uau zXZo-*$+{iAYD5`;7qEyfnDFN&P35QiYCd~4$o;8dE zL;D5s6$LDB{4Rs+3#g*^*Xm>z+MD49(mq&D0=d?k5>Yp3+yb{z!gBk*kGrTn(BRbg z#ckL}Ahso|r1m?E`i%l2Wu1Nb$l;KqwRm*8egnd<= zNWL#N4^gzv;Vnfe@@L`!egBAZjrok&y)gYp%mT}M`V|HHvco5TLdIzrzS+HX^0R@_ zplFY9x#8Yge*L_ze}FfE*GLZs(Spb*OvCjau?Z~wALdI1l{%L$4Sg!u2x+cU+g07W zdK%wEKbRuxc7CH<*Sn2?j7!HRmr5U|t7w+w@I>pHV`u!zB><@84HCgq-t^SfBXrpP z7}B-*2ygz&V&Dr1d{@+i3>F@t* zI>;r$zEpmt<_8Yz+`jw4@=`WzL6Jk@POXwhd}YMov%l7FL9w$VMxzY^7%6G^6BGZNus9-{Z@t=^v}(-Ipq4Ryb{%aq;>8KkVl}HDG zEr;WbsgNA|yfZqZ2bRb`P+vxtzphy)xScda9L3S~*DCL6U@aRFjz1pwf>D|Aw_h|? z@tzIZuOC5G?ZSDybNcU{{Kcy|F(0I=>l{&_cfguifr?Y2s8c?RpZ;HjqyzRT@5tZ> zc?qr)){eH|EvKG$(8}XR_xhu00K7_U1ITpHdk{*NB5bANIb5=8tq16h6Rt2SBKSw` zuT3(L9DtS^yKjIB>cmDl9nV+u(|KOV?Yz-O>CSx+ z=Bo5uFIBT>wtsh}H->Ib&_<%Ed$8Q3$ExTPTaZ-XSzi>~Md)jPiLsYL_GtHkup((* z5GivQJXUUtZg9K9kv`rzmeHh6G774h?Hvo(H#O46MRAaKf9Jm1*V7xlIW*rC3qE+4 zcL$F;rPb*5@W}kb_k2#)Y*=>}@~E5I5U0r?Q+z zwQnjm>rNnPjMA#UkPpT9ncfVMh`B^(oE9d}ck~o4S>NpJsa}(?dNs&ruS@N$#2W3F zallcNNCslRNs~fyK010HdYd4W9-;qiw*wO@VYEA2BoHZiRKG$`E!sn~wtIYc*pFJ_ zhtIaOUL$`gf2$9g@U%i#lO+QW-YNPcBBjLKx>z9<@yl*qE49FdZwY!tHS%b=3lDOy zR3E~Rt%)B!ZEVI#^u})~4(%MeJ0veGqQ!BQndj5cfXbfMTYu4Zkb+coXY+S}>F_}< z!n0JuDc=!O^LHRVH}hfZAXVDM$L%7AD~fWq?(pSrHKTQ7J^5?VZ)!0Jou{3&7-!blfZ z!$66c5uY_%ag;VAk(|E;QLT_yqoDp}wi2R0@(vQI$r?+6F#Hac<8AU56b=pdiJ?h0 zDDq$m9TpBqF;;q1K6#4`F#J%I)y<(g)+PS9k+EZ~Akl@BhL;gZDCaU3O!bqz(#m|& zfYe4>;U~!?`=DicXZgJvCupK_(%(O}JyX^W?m>_cm-~yN})oO*FuC~L-PAr`%j3AJ<=^<+t%c}0d5kn&&YnJ42n6wQog8b z(|3PZ)@VAaDrAHQLa4BjQlK5$mvM?8SD4nt%S{w#!`)RbG2``^BAXmTq6mqr^9gxs5uHF2uV)`AIaS_vI+U6BHrksDqSA!tSfpXq=|%raMmpM z(A5xK+O~O!NizLobxrlO##2VC{)+HLs4N|6Qlg55^=bu+pd!dKnX%(r*MT*h5?PuY z7aC5)AgL>&@PTnrmt6!KTJx}DwoVIxCT2|_6)a|3D6mvkNZ)@Dsgo6gV)u?ev+c|9 zXFvgs=S4^S%;8+UGeQg6J-1Cl2wEmIb+wly9RC52(2h+Y^3c!7WHB2g*t| z>D>41OM;i&7Ndk64DD;GLi)_BGUDxhZS@b8efI*uuoFbdg=5Dzmf3FewRi8VyDO4n z4}wb3jihbBp4EXvwx=Ubd3~+xx9$!(9 zt&WD3Yxe!yYcJ(t$Kai>v=&g-qcg0`<7rIzaa){mUNsQ+FFFt`GvL;mH(8OL@K05K2WoR=Q&h|#< z$@T?Dk>^xnj83Aj&!N?LlVKZ~)I#H}nM*V+QX}}p!VxL9u1_$1#U!?Q1Rd8M%F3#Z zX9*Y@MLmTFsnx|dP*2eB4SfkU=|b!hdB_b_QtXiCIY5Km<)6>6#ryN%(In-ZsR~KM z_mirG5qpyH%l1#t3$WL9P3`3iB+~j&MKnBywncrAoG@Gi6cT;VM)cVH;MyTXpQgIb zm$+IJ&RB7!^soks(XtQYi(4Y6oG&Zi8ND9eY|U_v@uN264`RiQ}J z;J%cnOD%Y#5ja&$ja(Kx=27e~5B<7cA+(5DMsJq@9meB291FZXji>oC@wIp0`BBP` z_2KRXK~v*kc(RCXZ0E|`s~=Q38n$d7&DYF>&3q>Gb+>?g><+L|a+%A6ioO>n8rqN7 zR|d!)6NMU`y_x?kWzAIW{mQ_&`P!db0sg%2eI@7o{%mUOWdC+iSw~IX)pPC%dJH0s z=QT}^MRniL7g0}+P`#;5^n|HM^+o)3Qr+IWuSAQ_nx!1Fq6(FXttrCH&RkRC4jb1q zo7;OHdd@4!U$G7vCq91}eP+Bnay&2A0o4uaQ?e9W>*Pt5LV8-REb{C&cE_hOGCDM2 zehU96wUq%n#>e;9y6?0SAC0S@^RK>8t=;oHTr(OLJ7Nku)lo7Ni0XWPWV!gLc!v9l zYd(gBsS-4X#MBW=z!j(Obk>5K$?zQ1gj`lH4RNn>U(KTLvY9tD5&3{xca?Vv^KoA> z%Z~E1L=>Y;wLA|%6ao716L69xA6GpU2jt_QAVaZmL)dB+-{=RvLO)1k!e7AODNZ!*O57jOFX-=1fifL>i1$EG0+n0 zS9I+3(bHe$mdQ!em?u(0)^giZa!`G(id<9-m%$=*Pd*nb`w6JSr;Z1Fan7b(!w6wN zbJG?B_k7E@-a1Ww=BZ}k7mXx(D&${(w7=FFM3yjEy(lYCq+Hiu$lD-Fu@8`-ikOty z@Q9(u*0Zfp#ObVYlcipjhpimFamAeMho(cJRCz|Kf~yY^P|=;~k=+ z>F(`LsQ!T;htHa~cr0hN>y-2+6JBU_sKpv-`WzZp?HIzP6Ox zhj&eH7?oonGuT7&k9=35BfoV$gaG3 z%u&*_QC&WWVeEh=yB?mqUv^X(dWU@))wy{Q|Vn-|~SCJ+p`*tSZ znOZoWHN_SM+naiyNwj7s>g(c~jddO5)o5Cs!6aG(&$hMCJKsSMC=wqaH9kieVb~td z(GLy#5C^k1CXaCmX@E@zDQFcSsg3laX)<#P!*~2oxA}*9^73tUYSD5rqS{>Z<)k_t zpUu4=e}ovhGZI*bg}UhaPHR`tTwL<8JiP62J`VkROEnr=D$`)X6!M_G(VVt%Rcv2( z^AQX8WhH}pc=e{9u8w<)reG;fvX8L$`8`E8&yq)@J;|zlrJ5tL`N^-8!yoOUF1k11 zrcOBu^{*hH0}{`N3cMK{yh^{bT(ecN3Op|}yL7~p8Yt@p@?&jmBR z_)*pXzO~nRBd$(!QG_Q7gD=o9%y`LqqFLzfgT@ClqrG+Wgtb5qUwzLd-KDk$qwO`~ zLq8nX=vN1|GSIgj(}g)a{AtJ1&`rcxQhi9$*uIRa=koA<@Y7N3leQ`c8_saYf)sh{ z+0RWW@^1}Er{#y>nr+AObB2wg+H4>`j9jiAKX-}L@Ez0B&p|oHIG?k|Xu|I>+mL-N zo~pZW93*bE_SDp{Ix&WedA(BQ5huMnOv&&v(^y|ov2QO*^)Xa>K#y#%HW^pl+gQQh zjok*@O;aV7b2^X9-eIbDaK>M7$sTu-LLv6-M}a-st<*%+Md37I z*)J1ABomAFQf`*}i@7}%X-q-$8pdxK{mk7^$KThyFQxTc)0PeAn0WD`mUQMgUoF7y z$75EcSpv_~l+S`K)D2&SOfXT!=3EuIY6Vx|L}W%}VAjJ3Mu}|am7m*DzPrsKFvjvM z<05-Z=v281KAjlFF;W%xw_wwUn=nD6?rqj;C;L8{DKM1^Pvzu{zhhv_mmKAE0 zIFGvD?ast;EzN0d51M))Xo{6c=S%PU{!{y`_Znkj!dRj^@1n<~Cq^Wbcy~d2w)d<+ z+!pPKBczC+^%)Kwdo)0UA2T>MITo)nA7tc9#w!N0S<_Z@f6ZB#S!m3B^r?<+y)luVM-oQlh96haL9DU{8s3g>2{4 z$dHy@rP863EWy8B2rd}~zym7<4%j_wJHn2(;>f(H)}#$&Zm-F{ZMiSRw@6nl#N)rq zLjpXZ$d{|?57pz{RixB=`f_2Btd$jcVrX4k>h89V?%MswY;Lni8$1GE4&0bFq5O_2 zf`Ak_i8T%}Db$CovyNcX?O5#g9N$r$#T@^N6V|ghp)dQhGyC5Aa$D)~E5a^SW<)XX zr?Us7BxhOLK@nR5i~M)YEx_4N(nhLJk>gntw5YkhWfE6$Ut>+Dk?|7Q(vnuoUJI!yN>>DaeqJGf^Ymj+WOe9EYIb=M_jhKtUndaS}7A~p@tv7|r< zl65Gl>DsW9P+l?9;T~>GbEV&K#xf1ttpXgqZgFiRU)s@CP+OF4~&2T4o z8>*?9hQ)Biw>n` zS#gOE$8&Sdb<5I^J8#!Mx-kFYpfdzvPkHEj=Em!o)sgg*(xtrPyk89c126dC(FZbI ze;}dUDMJb)!U@qJm+umCp!Qg0V))7|#1NM_6r4g+OF41jBCa@|jo6ze=Fz$z%g83g zQXG?4=~i(oKiV&4D&Bp-w@e3fN1?7{Y?&q0Kn+C6eUyu&NjRGPg=9dCrbDrpvY)T@ zvu1%n%ut z3O~Z1WjzYGS|Q^Q3z{;4EREt!3%k&a)g5r=oz!qNiqef5M?uAx6-@>RGA?4|iWxsG z2#=0&sfTJSYA!~RG52~IQTQL)6w7m5B+IeVe?5*xu*FKxQnC*1i;xMQi zhG2ij6;rIqNFEC7hd%8(Gnz#@d=+YJ{tB(FhCo02sH1~$iaD|W)a1=t&ufV8o@@H| zhHRa$h#HqL}C-3&L(Y#56`z==C$78WK!FG z)ME-MdV57dwyeyuE;=76RTWT{2JU6!CZ)Z%ji+WFT&@OK!1ajGlJ(1ZgStGa3%ht!UHjk(=KzBjz zdyj|Wz4hLh-4gndLHZSsD-j18>McnHL*0Lp->(lIP5z@$? zp^*o9?`B%;lH_8KpW`cE(iv$Z7Z$_mi$T6?XN6bK2NA0<+kB$$?bPg}NTVXCduHul zg%eDt#{dfv{DUIQG@zwY2)?e#qQg3yFjBDsq;Fk6l>dq{geVx;)Og1Fq*8M_d^VlG z73d&F^yCVT9f33--oD3r7#lHe$52wt8CRVyLHh4R-*lAkhxeR19nk$OLZ6q+EqM|v zj_XC9i!_g&2W_^_>xW_`C5d{pB^WJex0Swo@b65ZE;Jc7g*;?mRy@XWD5)1@yJekh z!l|!mrRObQ=DJMSyXgs>{5(Po?-Tz)@)}p=YPy+!aK6>Du-HOns9qO)-i@bK=*IZ;h+II)d9oJrq{U--#l zi1ZH?fJyt5?8i()rm}rYXX))SFdk;VWf3xC|NJGa71H!Q9Q(Bh_|$Wxc0#elEWgAbt~o9T!PYW<<`JbvCCd`K`A*C&*q5XO7k+ zJuu@x4c1mW{{94A8aM5xnN8g0Y{xF*irhmTIDJ>DH z#J-1J-rgzOLB{u9RzUx$^M$@fe=ZF$w18hV)dKArCHH=xA|{I54lL(_{O}932_DV zwN!Vo%O7hR|EhKUjkP>5i$~eKFR^=n$eqiJwG4R4HtPghAB(1BC>R;7xFmyfuTugH z9)eS-4L#-QpmLq2{PJrevf1mM;=gLNQNWZip9#_h`DuyrsIin!qk+6a2gEi0BdI8o zQ*k^<7i&J<2GZ+#9GDz#&wVS{K5ge65nU}}4PxEiwN~};!9A~Q>BFJj?zMjU-ctzm z^lp6d$2_aly{pZ;e5n~K+f$dbi?=PM+x(+T_%6O>g*P&GeC8O0#wkt}JHO9w?(4W* zH})28$fj7Be9zZje1SEae)Q_pL40|b%$_eODKT>}@1#Mgu&EQX37`OFZUzp>4~tj( ziMJ>F=Ade!Mntz?fqvJy9`(DEtRUU05_*znzoV22Af5Cr@gdEhv>yx1KIf#^&>)d< z9#Z%R*;>E;-lu_g-y2J%*{W2E4VRehK^~4S5CxnAlTqP2Mo3!F+kL=gq;7nZ^whnY zH~rE|p@qovSIUJWpi@V-iPPs26(0o^8m5Jq!g1`K<;#9X@9mYQzOyr50gm2Hd~aDD z0lig5S-oWq#qEYaya@W7t#eQ<_b1&*0Epb2agC>3e5?4-BuK1?#T;O7}IQ(%4)pU~-6l7RMd&;e_c0XCH}1^4fn;g1iiSRVbMPci`KSRY3L6HoiB zKw9rB+5Ar(y*BP=#z1Ygn{M7Rt%=_gWEsi`5EAJaY1A8P>a#h4wCA<`YkJs=Fzo3ir1%*j$Zvtx#39UgD0en^ zinsD*uK~4cd^Nq0iTnIrgU-eZ_xn#Xv7@*RZ@<6CbE1gg^Fg(%SflJ(^P4 zGCQS61~y8|jHhJaa%#JH*TNcf{iUC$7ZQ>s>XFXat~3^AO`pxxAN9!ee*?@iXO=E&sElhx=!68ro3=qon>RXPGv7@i6jlD+UX?b=!hTuH_N@#V#LB z<2z-HkY9{3P&ClUL(m@$mlV0##t*j4;SMZezdeec@L$ck=p2KqJkAx|7OpnDX#?W} zxwdHGvoFuWZ8?Hk2{i~az(F@Tlt`%Ok*j+`lzDzI?K=mwcb+Ti%qydplGAl-ge;Eb z8JRtzeubs=r6O}UNhyD)IPB+a|D<-PlRB3 zeDTF~x$N4TQdokJgO6Pf1LjhwIBS>+*dpWBk=1KHG*}9ra0Q;LaoF~&LCAh3X(a;3 zJ=e`<7s0_yEw50`No%!W!t1;fc2bajq>^LWYNVqQ)RMdhuE9SGg_X2YlA<95 zi3|NKpv7^Okv?8F-?=uo9zmceCJF|LIah2)QDSJIaV!H!vScJ_(tBb*k6rAtQfE6R z!fRK`4h11PBKl;>6$xqwv%}jTePL{VFn#Y}1-v?OwUIBh>tX7FL8xIm1>Mvfaro z4ZDrdSM2^uH_S5zY|7;e$;&GZswS^*U&A?pmtbGW7T9Kq2o@~96)t3o@F6H zoUf19mp=N73KZQ{>Hsw0hduxc-WcN!ac6xn|6@?RV4J81( zvIJ7{a>$?g)RLadH_Bhzs*Y5jEe#Qx!Ay?(OHK2(RonGXW3C|CiU%PJ*;H4m@#@Dz zUnK%kZejJMKxP*P{oX;Gh`lSBucVIDP$=&DhPSa#80|CM9bz%T?r5qwNt^9TavvaN z@>|QR;n)Rir7=#wcI08cQg4mc8h!qOaxO0Rh1$I$9}Gs!e(Rsa9MgzLBF3THkPdx#3j!kJb3VM^Ctm4eDQ_**sE`5x7?E6I~>+V__aBi_Oe zP)Ht8ZgMx42A}}O`}&+iEW6feOcZ1#)yDxZ^7>^FQ4}HDk{+*Jt0G5EhyxWAC0Fkc z0fq-A1JaO=v7z=TVx~d{0gbJF_%Dt|l7~qKR+ceo9$(9CfH*||OSFu4dC7?iG>ilL zqa+YBp8rOXj)f7AsVSN!c$#%aa3P0}3aS9?34b`92s;Lkhe!MxlKM7G={i9T`0*|G z{-_an=S{C?~*~O4}IKXROaAT`P#tf|Q(o|eaU9$?28Yp|?7zLNX^t(99j?EesyOLihchi3*l z{aF`!heIIlVd~Lom%+?8<#V6A70AzKB;!+P2MJx?B+)tx(+x_+T(ZSpO-1(AeWK@3 zmG{qCi~FR{uRv`o4sijws|l49ln%-*tSzFNkEVX9i9~?I=nJ9 zx=DooJpj@Mc74y^+%`!q65A-4(j9o4jThy=7unrwqcnTBm~7R0mdy^YtMams^N_ga z?_1Ulkqtr3xU<=p%vEj2=Wi!(jsArMpn^m=b9}=M#NMnm66=$CCEx4wcCPz}{fled zL%?vj)#O&Edhr{h2Rb>S7s-YEJ)k4tR-cmDkmiHpHN3T{=IIekb>k7*e-oVltQR0| z;6zg&_dsgSQTgzUgOpIg^kafEUWs!gTvgiLU-fU8KClfGJK{~p1W(pJ)skpB0dM{u zNt*wRfD{8Vy)t3nK#mMW6@gESd z2Gkw2!^(*(64Vt|j%jx-!=eC5MQ~9pTtq!80_h)K-R!`C1~kPlfW7*m=ljygwl?Z0 zdFXe1hyTF41$G9Kf`q2=3|ajwMt;JJzl#6POaFD>$pV&h8t579uGK#H*em7AN{_y0 zjwSfFV8G;1*wa#M#8N5KF9sdIYU7W4vuPXs=bhwcNkBt~GsH^f6`*x4x72h0;@9<` z2J${Dibcw%x~~DYRtTFlCd>=|Eqr@aFqT=js@Rg6GsL}@bUd**$njkFZ@keTNCpW2 zc@-;k*OhgdiP%ca6dX^>1KT7t|Hp!gc(M6av`Q+a)fJSU7=_#(adEVB@?}b@) zq#DKO<^AfV^$({p3E$q**ty%1@NR%SFxKDXr@07y3HI(ZA`kNLKeBvn)^yVKI!##l zYLcYW>SdCy_#-t@f7PD+kyFACw={C4-X`bf@lE0PxTmak`D_1;QAa%Ry@O37dy~kM zkOY$|_Be%VbGv`C&VMO5qr^(`;yz9gJvV-ep4Zd78t1|h z%YUcy0#s(d>q~+xZ*14n)?4GX(&l@}SA+jm|8FoRaz5HkoHh-axpPyKvQ)sY8vHW|q6QKaBgOOPZgWu_ z8dSTG!6mTyuL-3DOengvLtR~QRDVjUrmHvIWv>2zUT1G84%q|uVqqK}ZI2DMc1C^? z{d?ySgFUe8rQ@DFi69I&CFdoOG*I}fq~#xW>7d$m*8mN8+sVFfN#p#*!|Okv`2wd> zTrElwax#L>C5<56ix7f8WeWd5pon1cEeTjL7M6v+sLrw@`HxTo706>X+X~ogA#Wb; zyIG736BTK`{Z*&*OPqX3Q0%&0(2Jsq!;K%(7DD}UD%MA!G)IpKdP{hR1%kuXd)#`PyMcm6}6YoUeVqUf-Q zzO7S%er3ExdH4VKy$_2o=Iu4_N-oJ?rAU9w(9PT^lmj9){lVMcuJB$&Zpwc0OeI5L z{cSaY_3c=YX7->g_g;dqKZ|1M*1LA-QE>1_G>Ow)L}^R{S3w!NA`gwF~ z+2V2o*f6IwiXo~r9rGKS!mg4HiU1jG2-Y|jCin&D&Bpj$@fQ6%xSefH41|kP5l{^X zt*B|V1SW0-t@x1~=*6>V9PyXUk#h9Y$$DEtRmu78>u$XVjn5C0_mgY39A_O0wirQR z6if<;&n+ZSE9w*r$Hc1DuGVC6?2q72?lJzXMcSA9ZQahiRxUQ)p=VITnouUg zG=+PNnCni=KK<`{cd1MDO%m=l%9^qV%0~SM6_f*(ox~5YJi|AqX&v;IrY{|ei`((u1D{98BvFVuiwYr+5m`c{MS3nGt%Gx--H zgNNsPYScYu?61}W`f7$_-2atRN5)dA*iiFe;5`u~NsrWJ@}0$Qra(Ta2g~8fyv0iU z!mhAv-^IV`&u)TbmhJC(0F?N%`*P+lgiSqXNh#ISn#}h*(#$3E+;yKUqW_0~Ky(Ti zZJ)I$oo3)mI{bP&NVawx=QjL7#gsC1e{t+*FY%TM^*@{PMM5Ez!mkz$=6yIh_aN7w9TlQ#IZ$*z`Jnf|Q5;M+SXozzyk} zp?Y7zT?Cq5mIZVbPKkwdT*DG9cq@f}dI9`Fqu<|WTkbf$SRVB5{&_C{F1J8IGP(Bk zELG=Uv;G>%IS9?QjD)0v5~nBfJ1eK@3Z&(ouzneCFp49~+;_*(`3Y*JG+1FxwFSo^ z>99F@5CYx2T;bnQn5!~Cq>IUX6O%!1ZfebRRJfUcd;i0TATXnpAb5*sIxRc@AJM48 zv$HI;X{?e=bMgJ8t=$Si)PMLs1q>~}Z4)`1m0kDmNZg%dIBQjvM4FT@ovrn-3D4C3 zK#$gdeLA|*8RdW?!p0hp)83mZp-BRxr*9~0(xm5`3H?9x`vUeft1G=tMGBHfse}Tg zu-D1|YF!>f^RF8r{OH3uD8{d4Pg@!YiLI%gpoy;Ku9qLt(Q&5xBRvcdSUenr{stFi z2yb;^MBT|jk8GR!MK_n=KSK!L__Q2ghJ7SKEu`$fDk>Uz_Q)f8(!_KS^&g2{m4FqM zxf_l$_|QnqG#pHI5nO5s0>Me z>~tC@k{`S`mrLBh%eQr{RbxU~cc(Le`DjFa|JdRJrKVGBwhjLu0+e49pm2eb7!-@5 z1IWVtqXg{0NfUYat97Q|!fr4I>XpMdJL&W?0f{wMJ&*Knu`W*-QX@bD-Nt&h-Htw` z+Z&p?BF@Lu)vC-4Ud9_^0~O<$YD8^I@CgK&LVbmdRXOUlq8zcQqYtjwFUaMb2_(xf zHB~8+@#VmKH&j`8)NyHzI1GZIaeU1S@2ZqS(s=wN#2a2z)Ell33m&!lyw;*& zMpfQI{v`?hTo-(yu3+#j3*)`N``zvK4`;$e7Yb%c1GlVaOjo`46+_Wy4Q3RME3b}T z9rtBaUPRZqND?ase!MFs&n)I0I>g1Wd(k_bscIWw-&dDBNpo3Ze72CeF=f(>%@ey* zccBCm6zp=51%Ff(0NI2NhZSg{7BZFYji}!puoT_Q4TH96trrnj!M<7?ur_v*tbOE+ zP=H=+raQYXx`}WhVue?q*>31#e%kbPe4;$f)^#N*ZJo_&>LF2vrcaS<2$hX;)EQiA zv&P8E3|!k`AdmpQE+A*#N1dW|zEX%#>HfC%?6rxUu zz8^hk@9W3i#Td2-FT*IreD`*A2R9gTxiBD^s#W4(0T=*mN6V^1{4))yPdvCWa1=rQ zx&&6v?=Ol8L}z)mGuK)#R}M>l&r^m!n8@X==w*|dlIJw8N2#ZH zSgR1_Hq(J|!KE@wk@h=EOEmePb zg%H^h5R?8~DmaMTe5I$UFpx)Sz^;2+k-?YN*U_@zNx;l=mh1|=nD=03wb}EP_xUP4 zc3|{^4{Jge-<(MitKaVqW~s+`f%WivxVem-MTGh-q(LiE9Ez-r>3j}ux*OhWNspbI z)hMRR*X!BaDEnKPBNrkD?t==zy+wMiML;w4)NqVfCAF@d{*?vJJC&%uVhOq8q<+{Z zFGHI3pqu>e*o>+qo7flZUNWUJou3>7_ygyzXLX)R2h_=*6lS~0 z2OIP2c?CzqBnNcvo;m%9%@wXWcd+)^p|^xJNQA`3dicl?@Nd=cf(x%c z#lO&{xm|N#MTJ3ut-RV-?w#y( zrsU9Uu}_O*eUk-wIwa{`SfC%izul1~E@GGU=rnURK;b*}PL!LoUX`tTg%-lT{X2L& zo`{}Vks|rA%&b`z=BuZ3y2_pUPn4C@oz7(!o#fJMqmxERscQXWlhUTR@dHGC*HwAw z%AJ6!t|HB+6unWG#%McRcQXZ$YC6|?>(XLagLLehgVgr63l7>CkLAR1E@aGJ_%|dy z?3_*WL*F2_KF{@YuCtgI{n4*&W@WWn@`0$ncFRWoTtr*VQ{!DKyND zgmfFeg;73f;$*7_2|h0QAlB(UIg>nI;{81Yhr1b47Yv!a4UfzStrwRr89tzM&$RzK zc6q|^@)r7ABv#v?q)C!z-qdS~CE=-IMZ(Ljg5IS!-KhyI&z1|Sb-c2 zy)8mo()|O&@5KyGu?HSYJegVi+qyO7&v&nYZqqNO9<#v-NgmQZ$nOhOaXHnRzW2?A z4LBe**5V^S!aV+{5R3Ezfy0~CoLw~)39}t~b*#l@GYnu5~4>ATljue@TUi~zydzcF!-56(C zd|?!Au9V!Qf6!l zQ;8dxx9;xpLfgF`b*D;5iD+e3uoYo3RU!iiHL`v#KEdnTiL79E6{Sf-riboBh;2dj zcC)S1kj7xIK>h-Gm0|xa?vxkFcKb+KjIGPy0T_i#t)-2@{nxd#mW{IaYjf>CL2%42 zMR1?%d6-r;3djCj6&V=pHmgzV zM@9_8)~SaK>M)$F(G@6q<*wE+KZYS46c-JDvE3jO7qNHh4IVCzR4*Z(aH#2gIDutJ zGdmTiJ2Ufa{g5ede|fceji=0+#UEsd%5 z#cI)+Mtc^~laf+q^>)3bdrZi+U#!dTx{a;TCZ8FO46k!dY945FSh_=BCY6rgximY{ z9i8G#7CJBDs)?%DtNPHT-7Rfa89&AB?%b2mD0>@@9eWV%TNk-M&9e5&NJ%fFPm8bd zWl=O|v8;NG@AZ9d5h7h7;``CoAJ5wHdS2HdeSt5k5$IZl8-t=5)ul(I$zU zcO5U^|Srr9ep;%rM~S_e`f)7!80iW-N81lfHZCEddx z@`(rGCq2_!H49_uTOCD^5lHeCuG1R2+r)ZrDB%7KE-_&)P3PDQP-GaN&#^C zHlNbKhF)68q#=t=Y1PC+EE}mf`9+k@yA!23iQ2MHZLPbf!72`s8cZN!uTaBCeEr7G zBW|8qnu!D!j{`7j3<6w|^d4O>4=g)5k)XHHQ!5jPf~M&B>cCAZ8-d9lV@%3s&( zlK0Zws8!e|vg(cTJw-j`%*aWLZ_DqS7&&)Jzw;Va++Wl~q_TGQ2u(ima6TgW2ua5H zkoq_)thnoNR9z@_1x~y?KHdbD!GGolKS2Jps8X&US-ZKy`=s+lNpYC1|DlM7y2iNo z@u#VhqS#ZdAHh7jmezyo^L{?EbYj66NGX$!)9a%v+%MKAL!7&7I6aPz<6k>{DNZ6f zzqno>b%+Qy^|G37gA2=-X?S&ou*vI?E&l&w@2kI}>Y~3NDG3D>krGgmkXA|>6+uan zW+*|rI|m$*l9a9il+K|$rBr%|p+R~`i6Lf)_hRxq@Av%!-nG6zxE9NM&$;L9{n>f; z*>en=iy56y{p58&+mbnXjkHJ3+xT|J=K?Q6p+21nVm7g6_o9t+G8Vy6G1YRPrxt9iZLP6^OT+e%d!uX-OF--aUHBMB|ao>!C6G`yF296(hT+eZjrpvqT zGTwyo>wGQ!dK^|$#B6wdOO^$>iF)qW-7%$O8w&>Id6A{9cKqlyRq!D~wHM^E!mnA- zAERXl)pYRAXi->D2zQb57X+GIiSh{RE(JRqM}8utcp${n$a8;AhA3~xsZ5-;fQMr~ z(&O$?2k7&YXbyr)FS(DQF=$iW2s@mC(22xKeo?7*Fx$$&B20>2Fa16;84|P*Fo~V0S?G4fy6M*d=VV39; z2jS0|gA(+fwdP}0(|3tj4&&h!P4nIueB5=6N?W`(pfEe zyjm75tl2Fzq$vuMh^%aRS6UuKG&Fos+x_nTy+%G8PSpN1DiH0|rPks#)X&EGObf_? z*~zu_jouNpj^rD+qwd!Y>t5^hinrVGTOi)cvS%EwOP1d_O=n_LMx^8J74~CD1_L-a zb`LWcRi2AgS6;wWzCquNmdEkCALq5lbWGW~DB2Ex|6wof!}v?EF{s=r)LUitGZR+DQ1 z7nWf?RjcIAK|KAvBcdNhtSEBRdKy0w(-sDFCOb631YKfe$-)YVCo0{?PV;pUi-1Wp zSFZeA;{e-p)$FYQQjd%H!m*Trmc`u&C)oN32*VutK}c6&y)aMVe9>vQ94CUiv|6F1 zA!c+;{r=or)E(}0o)7+h{n8%xD8{>9yQNu~8>9-4I=4k)G3h z4x?bZKUOslLGMrq9}^wu3jH`ed3Bw0+t=Y_ZTG}{S+09F1y{&p8J@4We4R>s<_PPm z;`~&2C1h80WYdw(kMH?(X}eHfCWmcU*G41v*@6bMl7z3MH}6t%k%{x7ofcRGJALfm zwC*yKMiP;j2UdSzDxTnWKMZ-cTb8PjtV=80ySfUSW#646lsPR?=_w3tMB)w=a_Lok zY`f^80&L`95^7o(!1R}=B`GqBDWZarf!FbnBS+8qYdz?U!E@K*gO#VlL%zKK2r$ z#`JdKB?@H05o5;IEnF`Y(Zl>&;z zt9Ctj^WwA>pwFHVr$@H>4$XF~1OYfU#zv~hUb0n8D5yYtv}t~Syo&hfcY$Dnj|VZ` z89dI;?otx3PhbRr{N_Z?I+3t|g}?CLp3WJpnyQ;zAQ zZ-wkNOnfcWvo@dWVi)T<+DExNBS(A2*Q*Q0=oXe|nLh+xSU6clWqd(>+m6s&3F2w< z?=8_&#b?KKSZO6?j{4X-l}NU?-(#`>9V`o^EkGM`LWyqpVIpirkhJPq=GaE=a2sFvbfU zs$gI9mW3R3jp~hezA#vA&f#S)(*_y7>+IneaP7nRC9|>} zRtAYwK1i5k_jI;qE!hRW3m8KBS^AiYhNWS|Jq_4og-MbQZ1PKic$&}#eT)#T38=B! zMO9}NE?XVuH3Ub0I11)jgC3pYXO%ATjBcv!tn1lq^5hu~>{qf6kh&Th3wYn-&;zZ7%&gvvRpM|)4V zryf6b%ogNSvzel)g}?>kSF6iroQW1Pedr2ntGzD$pmNs&b-@0x*`QrF$F z1ig<|%SYsPKXj`odvffvinTzP9~63A<OjOh0?@xkU@ii;a! zish zQnbkX%{>k1@b}Y{k9%kgvvvdjfjlJi_l6PffxBT*U{J2FkqgY91pdbukq_*tUL;oXZhtzpqY^O zURh+N#EE%pYyKi}UXMo0LX2Ec?dC7~S#X_II$ZX?EY<;3$ECyGCdn^v$Z!I}{i~Lc zp+$v9YA!u*D_?2VasHf5hOA1#jDS3;ci?vAH0J~HobJ2a^Ub?SI<&hR-a^Z3jMF7e zvqqJB=G7lqO=gRS1ZkhsLYabAEbS8Wd$MIsmzTTl=tfb+e%gq?f{6}}6MGDI2^sJw z2FHkDU{+Z2guz?GA=UIN-Z{@kKCQ~oA6SQM&wkp8no7cYOfNTW(sM%Wv~NPfXXjSQ zMjGqFC5fEBZe9(n{d$1=^*P!@5_Oo(YW4W5az@ardgfQgsKKtP#8>UKF;vX?;t
    &H|$F=n;?6oqPL!X7Iha#_ej0swVhYI0a`Muz=yKN6XcAl+f{^eQ%Z@F zlxRy~hsWI?7szSBO6to-XBRMkv}$M+X31$YeHz;Ld+H^Z^T zJ;**E7cnv(HBFTae;>ht7rbvTIkGaA?)ef-^J3)5V;QwVH!MR+xvXSGqc?>DOSHyH zhGZJ~y5%OGN#kEmr!xT;V3ksGk_%)3mR$v655^I!yzcrt`(TG%qfNm*oiS8{EXmQ0 z^rmM%U0QG}KrXXIH>0_&_C8ooUNlzwUe{H{)B=xwgcRYF+xgT4mlxP5^n%423Z=vc z-sbru0w}bqnl$hR0tF`kpQv$58F1gt&JguVMeqgoDZCIYV>r`UXWAm~jMLq-HP{o->b4RmFk;!;h(R zOnqdCvx%22?dvU66py~)<&5xhLQZ2xp^^N7oyWC@G>L;24lY>J+5Lk$=BH zj;j@X1{h+|Iw>q~C58%EAK0AVQw_*m`4Y}I++`^iPPuz8C&pf=D#Kk>_#a4{Ibzx| zdeLj>eStT^zsfs9mi;<3)rYOs*<=W4(xj$Jtb@&~I) zA^H9JeUETgY^h82Aaqf_GE05Ka5F=)$j zkGaFTXq7==q+%*lT*Jl(RZlQ@XuEFw9u;S8H8}o|@>z=$%oROwL8z`)sz*HM%DBri z#cc=z@pRVx3Z{c^*7rIKcSRuY9^qWhg!?PYj>4u>x`m8u`!Of4JoV6fI(zcNuY&2lck&KZuW(ON~N7#AErl=4R8vZWpbFjchpRO9I zMi>^?U1X$1EVy0%W+zmeA{G_ra(C$HVgGx9-tl-N%qC4(ukK#myuUcv7jTZ$n~TzG z0v4?>iiDk0!S2Q5k0{m&{bRS{^{+IR)0P8@9mLaPmdxY+x40{K1}KPq>ff_pzC``< zh8m;J<@DM(SIhFF81q}lN)|@~CkXzUbw~0W=7+Q?wZc0Q-&33q$v+eUgV%3tZ{wFD2C&_%bU4nj?I1-9qB{6ZI-T z$O+NyTvRUraT&Heynbc+>t;cM8^NaZ%;$t|;%`2cH9WR1_C`A0bKDjO943=?&||;d z3txqFii8M)?YP14x5Nb)1;u6kj#fh`*uOd`uwz)r(e8Lkcvwr%WRh-3tTKm;%lR6X zpgPASShaVvY~?Ut@zf9~P(TDpOp?r`P-}{($964Q@aoWk^9~=aiDoqsElqf%HZX1P z6k)oWeLI^^I6)TkkqvA*Kt^_bY>8p!@(v!y`02{l1D8jgMnkS6l}(fv2fpkIgIk;j zPsWAKrFlew8UuGXG{g88_yXX>2$vO%oxC1eT@iB;&aZis7SL#8%;jaRIZ+!cnvD7e zGMVi6swd#xx^P6pfHBz}_UWckn6{fFXS|%vu}*ko*}XF0->8?TDNXZD{GH6ILXArZ z|JBv%9{(p8WTz!s-6m{}T)ah%nbz-93X{4gVs z)2=fAbY8dU^@eGcbs##%@TtbS<8gdH=~_E|sX1|>ldczSi*LeivfdfDU;7Xn>ftrG zm5H}vR`bpg^O1{BCkH)Deqe8TxL5-+8Mkd2;kc|Ts{y~rjU0}~49hWrvpn<3a1ikU z?8PV2@}O^`M8Qtn$3w|FwU#HLI{cXhUT5H_NpbFta-|30pWl*UPY{$uZcO7rGIY{F#Kb{#h-EE{XJ!n?yP^8Yz3S@=PFw5^bx{^ib z7;-{x*tCUjat$;bzBe zH#_C0zKETZPdkyi@_^bb?#-q+k6R8lY&Ql$Cuof+=N#MQJnpao^e|MMYNXmGL z{;HjK^p!;6e|k-2o?>I2Wy)((t>$0_n4XrMMy(G$y_ZLHoPqT4*zN}52230xc%+&=28ZDBqdY@Vd#C>x3 zSjd~*VB_Ott)fcZ>U~?roChpD28T6yOYOicSbWE&M3Gf=)6c;)s*zsP85P81rdfg& zqPO>sw{Boa+z`9X7EswyZ@yV?tIz)^cZ0ipkdAT#3wM<@PF@j0lMLtqIoMX#LDlvG zKGwb+kl(?m!4j9;vmHKMSM=;nKH{SZ%tNjjGtEBFLhe^p|chFeC`M2{n zTAnP-Dlc@@2yZ5bOQyW4#a((1&JCQ zity^lL|7waL+xmMkb|27(r(W$zdj8f0SyLFjD2Vt;o4D%qTlE%?af>~Rw?P#E*JG_ z3SBvHT>KcB@fJ|IE2fvWPr(H!nu4G>j7`~O#TTOV&5ZKuy8Q01LzD4Mm(wzAT!yt& z*U7Ci*r=^37@-^@EHaVU$m||?ngsfFdMAudmuF1Yr#K}Hz94}PHiZGD-n^i}2xBhT z&M`7k`p7V7<^8K+^0-g>Xs^{hFKrrY@xqPeZiDjGc%8dZ_qRq?PUxOb?kVIUtoB5D ziW(hC!ImjyO<`a}qpkRfIKXK3A6@0<%>B}2fW<`fNc8*3*xOC}yH;N2Gn4jI$ zF?(SW52wrwRfZKS1D!HvOm=f8bmnZ3g?Bm1@7gLked`#@_ja2c&rM4yIdU@#qsSFC zJ~4FEcj}sx?bH(kYAIyDk7;#Mz2_F5{sX-Bx&~h61Hd#gM zh3|Z1;ahi5x3&zltHijnolGpcd6%f&;WPi*7djg2ayxFUdqGmn(}FT&VbP%_1wz}6 zCSUHMx4Sj>N=YE3Pt`@ritAt@GDDhgC2HRCfj6B(*^J(O23<8GtmA{r#DXhPwb?DVO)pKUj%yZ_AKfTI2*gRPpZ1*AWd(DtH6Wwv+Y*gG|4vK6!O3&=OKb zJ1kr3vvi5w35aSYM_yRDO{_TOrEF?iJ>wbD!tY}3+f}_p4=sO*xvVwA`o2C8f(OPA zdL}0SG-l(jr^-F5?&QythKSX!2F(0^-3xh$BTXsq!w(q}kh_;N$CI1OqgrZ_scBJ? z3&j-@6Y4dkof$GfxK`c;9CMo84!s-;&P#)@KVZi(CO1W6P>o_1EqgR|O%@+7B7-L| z7vYhPDRYj(RlUS_rgJjf3>+WSCo9lNbPV_(-$jrR-$cM)9Qh^?K-B;zRTfK`T29eS zs>cW9UY}iI1ff^!n66o1;>;7{4DuQ^QpEdybNhH41=r555Yw->8YUZ&m>IlW(OqlC zsxIEWdVleF^9ocJJE)PXEOJR&SDb9&tCHL+mF0(8F~d5ucJ89bJ0(sTB69SmSrhM) z4KuFgJ8d8AYv{Rbcg{8@R4PnM*SpIA8vEun_ez?Z+mhdRyVQGU)4)|z?2P5mNQd&_zFWIANlT)Y^io3g)-n^IYH`^B7fb;pqn zm4vZ8W9b2n%+fqci$$Tp@4NIy=AE;WLPu|xm)Mx$2qi}cX{WX6)}Wm$I*!I+=3yX` z1q{4Xv9oNJ>S)m{%V`g-DJ@V-u7idu9f;WX<;EBH}kgaT~13!D6=9$BaAO8Ru-X8HX?K%Z-(7Z zCrP`lLj?R)YLzSY|n58}-IA1T;u&M^ti61=I zYBVVy%23FIh%ig&<6|K$x5d{uAAeR4H6rp9hGSMsl%r@Nc7)pY&OkPGyhuIEy2?p} zW|}{_Fu0c4&JTsHgR(URaNsOhB!r#^5?KD_cfK+It|gX0U@6ne(Zl&171t-TvYh#Z z{Q-$}zr_jaIouezQJ`J3`ka{#l$Pdw6@1vuHw=36yG~akl?-y%JBz=aD^g>Fvi_*` zj=NBw!UkaRr7vY~BA%ds-28#r}AP@t{r6O;B4 zDRpe*E0dd|?dsuTe@cCKZ*ea)JJ!gzU5f!{^?muUx3#-+(8JkAk8U-5EZV;Px4<>4 zDeB??GC-HNr^Ve@_jrqZSVQS;)1&fLS{=swyMY}w_Hg3gd;SNa3H**y+)24+xKvT^ zDeXggDTHs^%Dm`o5C(cgf1|(EFwKK@ne_MjP29LbZVY)tj5ICT2`X37NP4;|4`<2Qzn)&y&Q8YiFGb-C~YRZxA{gvoaAiQMy`;{ql-rk zWGfcmbaXty>I4a{`DZoGziXrAo;B&C;c4JjNn$jJ8Q%M`wpyd!Jf-j|@0Nx-eC$st zZ(IUU5S$@>^n^_CyN6tQ$`hBJ;FToh8kxRUL!D<9{=e&a_054(^H};V9xm?(E7GtV zPMdgr)xb{nbTZ8Tvphavd7WVgI-F;3hS5815^hcaP71SQw1M{Q@pj?Zc?RSVu*(&+ zB<{M{MXno;dfGb9CmJHV!qIl_PL?LHV!(Sm@g_mG-BSNkEBuh)0Z;w5EwpSKX_^AP zKbA~BQB1GOH4V$#l@l30tGE75giKa_?)vS|;?4^L{bItdWuk0VhQfLD-s%6ZH#fBo z9S3_oU25i9Xb>*b`FTw8|M!gGHipwwwnFL!>QZ+XR}B}H4$=C&#s7YqUH{F;@-Q!x zNXddpPZNv%;23A;;jy|5juIr!)!$noWzhom5<=3e$Uh~LP;lzP zD|$DZ!9iXkt3bk6XVO1eep6JGe zD(EjvZ%Q=jyO$y)Ong3cUq$L;hJ;NG4dmIaS94qbLnRzea$95f9raHh{L@C)JUnf$ z)w86N0R>EYgQ~3m*Si$lTZ0SNS4GE!`I8!_+TR!KyPGb*24v~h)1f~*2kt)r8|xH7dXf+> zH}$N{datuy{x|V2V6ow957)vC(@Zu5>)(f3#S&DtV(t@?{6R2&@LBQWD9QT1@w8K) zM}tA%=zh{s=t>oZbMzz6tBV>=zJGan0jO{V&bDz&ng>z>t@Ot9F>(BEIJxey!J(`$OWB%-qCiiIe_#eu4OHPQ&DOkH!gSN${~Vxx`Tpvo z2(eV5#S2y$B|rwMwPHn$>jG8?p|+^`PV@XxdRTBc?`L_RNzNEYsfALd7m5Ck{i*zC zw9>x;=-nOqj{PqB`y&Cncr6jP`i3Q6*{O}S8d7yU#)r`1dU6ZWpBxrrES8AO95*5w7SP!O zDmaiYB#ACywOp;zO2-_$%$P8%XuMGX&KS6EVv%1CTkRUItN+1rM*uc;435USBRA8m z#Xsj0Jrm;G_i|Cr0aD0!pP@*XpXjqzswGhfbk7{YcJM}1ei)vpoBG^P?`z3WdZFyk zB*d)apCUw4YrG6i_~k^@Mw+9EA&0oy8})F@6xRgnz*j%5n$I=hR7Kpfx0{4kWu6Z& z+Un&OP8E`d2R#Z)6D~GS6oKs0n--vLD*4k`kJG8=kv6wB9YER2(Lb?yc5lUfP}z;) zyEG~;la`k3{m{uqbzn#4F*O{cL{O!8l;OXVesCp)OzVf3HrWCcUZt(gnF!lfT)8JN zEW~u%!$#)^PDH*Me!Ovgp;;+3V0)WoI?&+fiVN_o z!fZu{dk2Z=Rd$CMKsNuBl8ipOluc1;3<*;f=y_#SOLXUXxWShU zJ%(~DmJaqN)u974zg8BcR9AiizHHyNh*&%lTVYHvLj<=a{fcixSr0B!OzovZiDdBXZi@6Q=u#&{PS)@XkRmEw(r z{lF!qoWKtC)5?RmPbEv&ghs9DDW(K0j_tfxCN|r;#@-$SQuA2wGZWU1UYpLa-Jqdw|n8VGlc{4 zF*_nuF6HfI9pY4)FXR*hrJh)lS3;;#=PRn7p_Tgu0Murmp z$=jvWPhX7Zj!&7?tH_H~BnP8#@EC0)sYjEQ87k)c=#B5Vl_!B#@e_0?`2N6sAJi%C3B>u`1Xvwht5gf`4ly;%y3!6mvLFkkcbTg^3$U zQfC?MEl^+CFY3~G`E%cAKDe`KhZn4G!MqZ5(mHpDQ=wW}yZ-{n5}sWvCvPcQ2PSckwP*y3Xz(Bk(ieE&--=?I}+T+&7dZto0!Ja-=X=%_c*waq2~c z%8U5HZS9BpVQl%uAI%`VKC9QPk?(tm4}iwdFgnzgo7_^6pfu&Mu3zg@~zC#~pV#;RUR@E1!=^@9Qv$`Zaz-EPs1GB|awS zv(hVh&rFl#qC_MxkTR%=@`RM+n?~JB{Ac{(hOs78)KAsP&p4nn1AgBuaKH2cGf!c9 zQR(gY34+m;y}4nfhY4l*^Rhy#drBf_EG%OIgbq0H$vrh0+9?(Tk7@{K>H!m&KAZ82 zM};ofZ|A}?(z-ltvh6TQRw)FjtNtMc~Nk7aWJ%iajx|1ilnWFf1#R_+u6U{gO1 ztMZGS2YakX)`p(oSAuwA`L|#}RySEP@*JNt)@K6O*d{0KP83|^QB!cm{bb0G$=D&i zQZ*@`x@ zjOMqHuX3_#zzi(9H}}6LJG$+ToMfJ=@7|q+ue2-Gh$(|nraNUUzs43ejhuWh9PfX_ zul@Wvr&Z?m2tS*;0I)16*6#(&i1GUv{>;w$STawJ>vL(Ck5DWUiHsW95Dl*LRR zYWzr%$F8#cD7)a@knCAf#DQonIAFK75mqw0GJf}{8H&MoBK-~_9%K0sC=eU|_Qn|& zB_IyBm*(#8(5)^^t=gr>_j&WnxEnf+v&fTp?FS1D>{oD{@k>JA7oa6!Xiu_8YH1AG z%9QnZOEKtUxvyea{S%R8!i5;20H+b4E&Uy)+iY`}L;Z)B9L0r!iE@ev7;A!8Un`Fwc z$sBFPaTsky##xV&V0qwnvX_i;mRAy$Kt++Xv_IUXZve;GDMosb;QEiv&yfLFC^q97 zsv0wetps(fP0n0O;Ocg))UqbkHxKEqdsKFYm!3^ORNQof_f9bG3$InL2QqN0K=LjD zC1PZ8>VS3AEjHdieONj~4jM0g*DYsowj{qMzWW0r{If>|jW@WU9~x%1vm8W)Yzynx z<@9T?6w>APM-&T}PMY>SK5xQpcA(`aNj+Ndvs_s_n{8uPVfBOuV^XOxo2UpwU)k$s zX6QSr-@O1F2R^Q_sR5Xue!SD>mAF~v6j|x`wcs9rIhOB*%L8Uq$1<@VHoXBf7N6Vt zi(^B|9neow|G5y^d)<~ay)OhXP69nN<=Y4vs~i0l`(fE!H2_{94LHPKEe~+7RPymS z2ftM8SsUy%Y9~0`D$o6^E+}cdgz%Su6S?m_K{xJA2z_OnrJ&V+X5-trY%yJ&$%$0V zYxa;tos&KWtVq&>lRNG?kvR7OL&Eco`jTwrO14LBDBgfsd9Fu=R_)g_gkOdzJ`oUy z_76E$?+@_Iwo`9U28S*v;KcSvkzzf;_bdotzw}##9cmLpQfSMr>5MAsLvuZ zUL5P#(eB282eBS{@Ak#1{O|^-OdsKKgk$(bnV;ifNFEVp#rYt z_I#_67R)J2_!6mAptAscH!h|LoHaBl<>6r~Wi|aZ;L0QYTr9;T^A41U5MZ_!ZmbS; zKFdJK6(W9Z(GkaQS9D6fi%`(ptbG~c`T^(11?SE0 z=>inW8gx9q3M*&*G=#2I+521Z^{ae!QI8Tg`&c5la?lD?*-fLII#XQb^bN4YbNZ(p zVJo-5v>8(Bz6$aHeCrsz5Zf=z8Pj&_1%W6S2cMVOR!POl(P79*O}U1ZZ8CGEg0}1+ z*>sNL{`hDz6?1SCCC-L&DVcci!8juS@dL;#kSPcfzBAO(DVtLsTv4G``tA%@@({9* z<4c#yR#V>90l`aO%=W4Cpa+cFX-VOeO4>7E4_6L4@a`YJ8r&+zTT#M=7~t%&Fp&ka zQ#{?jT!0~%*+$ENk20UGK{A+_xqyXTQkhwK??N3#>?G*sGHVl@LJ}6ii3=;OV|qgZ zQ-0VgmStRLi)Bb!W#Tvs<`cH>2vBTHIT8FinRdyn(Elmo#cK&6s{IqJ?eIs&g-xKeRbLCYJt&h8u9OZfdCL_NHOtv&toBT*wk3w^I}&2TNNol$Gpeawz+e>TuMVBImd{5?sC<0*32n`Lry^pXC3fSfH41}R7wy2mtQwxwXs(kf@x?Gdg_ zwa+8>IVh*7VyTgLu5?~wV8y`bGMPu$!vUQ3JKvL+<D7SBm17@8t)d!%m++5J>}>9M|P z%Em&jyZqu;z|3+&E*d*76;RzPeH#_k$$r>VqKE_wu?xN5*bO%xvNkw;p|V}a0<-y8 zg0=GbFkBQ&aTJL=-=Id=NX@pdW6^@Q+7n`x(Nk$}JMWx#*~ahs_50P5Z{Xe<$HtH~Q1g=0ehDa@MWC0D zjWzFEQO+BWA}-InhT*L|Khu+c7eHDiIio%|?da^jwt&@=+B|SLP(Muivl{P8_U#?kQyo;FMK`A_qE#piUkR+chA|Us(RJc!`Tx zoU!ZwRL?QVNeg*y{NO@|D|`` zX6Nxm@o*kO*Rcn-tHv*EcA` zu7ehdmaVr@m6hTC^BDN!K424g`tYu9e}~L#3Uqtt{)%CKQ=yA(=IW?hn_u~|7`cMFp_ub#Nh4^US57be*6+ef3m;6Vjfj#0}FxmC9joNmoQ+w;hCGPqB zy>6$Ekaom5GFV=~4u47Cs9BN%h$jZGeYEuT$e)wyGbA{j5kkG_=zt5;Q%5{Di-tk zmlS=bu#ICNjVCSWI1IHtD~d#PTED^kBqaSZ$yjR~(-8O}%aD1_xaVAJU% zl4Jb~w00)_rhCB5(<#L|E9>RZQ!UbS-9&%S{3vl+^kajVu_U;k{M_mZui5SuHu=Dn zWjv&6DfR}P2fE#L1UPcV&b^}sP@w*eAzYD@`q^e9Uxe2(-XHQ@z`_L%ASgU--Jh-l zhwi0Frp;kT-xY@QTQ|QD+fsOa%X69Ry_>wp<#QP6s{wRr0U1dl#Dzh`=Gnvzue;N!NAtY!#a|sKp^t;b z8A99q(6X55arNN%YE>HrB=?*hs`>~}K%KXE(H;_}dr~way~)bY6ZofK3Q(k4fFhOh zFr`6`41J6#rOC;umnpoasyCvGGXJYe0DzGLP8!VApj!q4=R)mK>$=s6oZ~_&HlVFs zUW;T!87JzI2V%ZIq7tmpq*;H3egdynZ3R%I(|9B$e|sqcA(zfs`9eWv-4Y4W z+EEx`*E5-OgXJWF)YI*YHO2y)T09LQ-}P+LUO1i8AQJl5FT{T7`S>d3&hxR1DcxG# z*mI+InE?G_v+D!gN5M5ZYJOw?{;%v^z#_Y5>umGpqG)L+h{4*#*mB?{M$&gl0Ju5v zckuv?er8zqWU(@|SJs_YQRhmxBw%McBHG(FM7-v8@M-qz8|mk<*@~O=E%AWpW*P>Z z0^LjKeqj3ZwCbnu{c2j3^?Y32eQiF>!xA)bZs`E|Zh~gAZr_JOH_~n-K+FH-*YdK= zM2zCyV^&es15jD7u>2%5@9$t4!1HwZBAqocp*!-}{B-PbV#0aL)RchLvs>`RVBr#$ zP6~8Nz+TA1uWs#p(_Y9hz;6&UofYO`uNQ!M`m&m$)3z!$1;Alq!r4~m=El!woY@{NSIJM5PF>fmua{a9q~1Fx7^#4D zaC7-2vLZz{Ww0qWWH6a~9?lXKuS>l~9kF5w%AB0tL1lLBCC(z}DI{?Pa6T#QDDhHS zX+SFwh@)&#?z!m!+kPJ>Avs{J^?nT_(fM@&i%xDL`MAOaq^68=jsN}Vc|a5Dc339f z00lXm+3b&e{8SXfxCzv9;;AS(zHQ18!seZEan*kj!l3-c~v_*%L9qZTT*lNzxbn$SH#?~rx1b4mml1DV3@ z3BDAASGjZKX(Y8MFg7{d#?vZhx!Um;-n|-P4GmYIOKX9mhi?Y#CqEVmJIH#$E-Vc zZJ-dKik`>+Vb|LxxP)^|iXZ{kP_2mbp}tVTX(fwUqkkrIXG~d7##E=ozd&;aiYW>+ z_RFpU=)<8dM`h@=HhC@ZrRn$+$*2rx^>ybjXqN(Aq~Lim0dfl<{aaTxsJpCpcV@aI zm7x^*?{ui;xNJ6;)Yc=DGuL4nhV?&=@_#dDMCB$pYw%Gj2ZUE&)Wq+rBJ^bn%6ZfR zdRZV8wK-b9ewepceY~+`He>athV!S-)kbh6_p0oOeQTw|TbW_5a&sz4YRip%lfW;&A#kCh(gE>-iWl|@NYtAPH4jD9Rx zpOFP|`tj%ONRQE+DMy-oR17b{=!JpnWs2 z+A5(oU-NIUO4SY#W0ZUEzxDC&IaBp6FlS*<2%(>bw+PZ?fLbgtQJJpk1@0sUJfH$E zU3S(fzB@H@)LdbXNr7n~3I1)Pe~a8M>&(0(?1=hTH~tu+q_f+G6sp20HwGN&>6p`C zHJ;;jVU;RGBtk$fZ^2IcuPW7ldwam-V^?hLYiQNWe_7c?e0DYFb+B>y+=rl{Pw(yS zqZbp`lFQvJ%9l9yVW9_}YDG8y?VkMBjX*io7o?P+Dsb|2w&r|hTX&}kpq*G-R{Nem zyV{WM>N;W#?Yje0Sw9|7hb4PTm7;P(ev{^p$@}rgA~`^A-Fui{QFJ0i3@r84YXAM2{;q6f3r6P3I{~{U?gL*ok-!TpU`d=FS zBvAd@*pm8^_=nuuX}HK z)qnDYG}6oRQxVNG2D|=-A>vlGWypaN3mMw`oBO(st&3e#nl_(GwC^|(|L-Y5^Dr|r z@A`ZHQ!iP=`G3Sc-v7IjfByimTx0mgWB(_0uOSa~ zygu(CE9<3S5g$8?Bpx^7sv54+USP23L0pQIO^B0ZiCGa*{Zjn@9{LH#a>j%hHQLZ$ z2?Z_>XxHtvdt82;17XesWMG)m`F09qWa4h-d19$wefqz%2LA7DrUP=`W}x2qH;RGE z{a+%0FdFlAYH&+3W~$NP6m_}A{9asl>WwSeuP;PC=<_mbs2&+d@b zHRn&ys?~|^u|1JcH4JDSj6qQHDR8dC75U#m9{)V!_y>)f{+1uJ=SMf?*oS>Cc+0FCa!Yjw_Sh)W&O8*t5zu%+^T;5{h5Bz_=i2_Qk z%e-i9(|ByFIVVk4ZdYw>r>k5K`j;FC7*)^y|1l`6-?sW6@fdvvOPeZ38dnSpiKCN$DeO0WYYP|IQrKS{aqbY5qF2T-(>rrI?J28w&#C^ zAT`_X(8N{BcMy2!iPxOlRs~);Hx82b1m-GqO1If*|NAY_f47agkj zZPLPe*`a$5OMRdmGJpCEOH*y>nqTb3B(YlVB8SB^;;83uR8zrRSG41(j0>nZ;Sz^D- zjeO!83=ihl6Pj?krSR*tEfU+EY=HgNG#A#KT0a_ov!hM*)Ti*xDuM7DdE)K+1;nY$ zRoyem=^%vF5mnyR(cV$iVg1Q{<%$0MliS->%^TK%ZaLPAo=Y*hZi!D8X+^NP{JESo zYqQ(dc~i4`85(x0$M}m!Pt`k5NYfB{K$~x+}!i3lDo^w zcW;Z<^|c!t>P&=&*pj%iw2l180<5?Gp(Zr64? z(j2=;5WaVA){tUiY0RM?BR7r}n0y0Pi!O2=H9gL^z3?4Nz>>YFWI~ z;2ogA^muB#wvv&I`S?S&mXAjRYBqcJiBvset_*Q)bh&V{tvP<1Qp+ilC+!>+&y{!O zlGswUG#(FQ&R?8s);ZHCSFLV7!7OQ(Q>^ZBzI%bhLkA!tc@G}XP)T$^e8~aIoJ%Q; zVk&A?dgeYg@xFBqQ9{VM+35ZJCdm%le<`@vYc@azte~5+ZpJ~YPgTRccUd+QAMoeR zR}lwXEU_4g>}X$-IodUs6N{;-dHcA)ZMP<0?u-2qe!g9CGxIXYDp6i$#xEN1|C`os9CY`mJ9`tDRyU3bi<;%ehoySkAoLb0G%iN$iQdsd`e`#!>PzONFS<#`3V z<_m}EnTu`UD8rrf8?K@#m62?*p8)eZkqMGhpZ=@8;XNHS2!jmpgfJ}UKczV)R6)~H zjXpA02B_PeEUZi_-HYy#1-wqC_Rl4d^l?H+!G{nHPLje%1%l2rD{{>s><>YNS`Y=$ z=lhYtN=b`;Nlc(|9BhR;bRucRI=|Z`a^O`=(>$O1#?Q3PYyZWa#WeTDqn|?yBFEWv zoz}8_T_>80-1^z8-8Q-Q3v>V?6#>&|5JLT?29hmKSkHdUkcm@~O~WS!0;onVoN0oB zj{ms3URZ22$S*In_!{@IsCi>pBWWog*OfQO+TBXT4q(5e{o{tXRWwa0VkIe_D4^`x zr6VtPytj>A8X$M^_y^fddmajV3H}>roWF42V<{v*0FwKB0V~%;O?|92p+Mk+y*2ml zb6^Z5ST47~=i~u3Fo6ATh-c(PgxNO*Q}E5|ch2Kl)HzS1h)&RVsm1QnYMtjf${;-Q z2Ojic8+;z`fT8GYjAo%?el1Ndg;Yd#HvCQMia*G#+n8O-@TupnOD8|gs*ElbS$F#N zkQBFXt{nf_c9V1URa+_FD%|b4-W4J^F2e^QHE#6BUB@Xrrx8`#AmKmujp2J&?i@xS zSvECp+Q~lU#;r$lL5v4Ye)TlnuZpc7TY4FLsR_?tLDiXzDs19AAP6bx*jX>Gv;jWe22-L{3mh<_xZH`*yCp>Wf6yy}+Sn zY1}2cN5=Vf|fp}8g?-=+cVB465ZY7pd{8n}X6=`Y-kMCY)q z)*}wV<2ReaNVs5suU(_G1a^UH?wV5j({?g;VH#l19bkuF;iS6$10rrsnUl#*vhnn0 zvSbKIh@|-1g)2VgVbp~E zHpqm@xLkppujbWliH`%RXw#FlD{Qksu4`o}jP}}2ZNtht?+4{l0Rz|5ubmG?rn!8PIfE_4n zC<~A?Cm-*AWyRt*aE7IY3iOCi6zjx9SImO39UYWSF8XB@?%`npACLtkK|dry?(fLV zSTOW#0kN&-MIXd`J&8M(uuz=i@!b3K9I;Z`QamO_1TjNtK#eOg(XSON5Qi5e)oe!(s_3OKV7;LOf`hVlP%W)SqD_{GmXo*&hI zJhrBRkf3w!i@mAyTm6*#j_x5a?AsQk{$shOAR1{tvNz?lm5*19Vp{eyK*CAJy8^;x z?_;mU2jiu_RlBS`@oW7VoJ)%aeTc(RTJR)pmSeuhQl*AQh%;A|J7sqH9Y1b7zpb^h znRjar-D^pgCOG;&CgW&z?%M=`ze7oV=y+zL>(VC_95~)ysdQ<6Q+l$u>ms_bnD77@_$;6q+r%cOLPnK zQGya`4q=Pz<0*v+g%gFhh&;XE<_>a1Uexf-LNdtMpsgcu)9zicBn>_2xPSk2e3$Pi zC(H=7Q#(>PJi>%}wRL%6m1BHgSwtdcrx?MfHK*^*SnAr}{F%>#ZDf4Cpug~gZ*ciYODme%5R&g$w3yoR9Ghj%i}#i~3sapF7wJ3o z?WzL?q}-662*I|JUH3FWTYXq9$6R2ln=R4<-6@%R0b|o78(;K24$#>QW|=9{;q9?p zJw7~AB)I7myRxnO+ONjrKEk^&O8J`InT!-o_nvPb2Y$91Id~Tp>1mn_n|sC(?e(POMPKJ zPS|gXJZ$SIuk&txR>WuI;*fxFAS|upTtijsWndL^5O7WjuyovQgOShI@;AxJhJ+AA zM(_~LW%Hyp*+qQ)`X3k5VYUNHf-H%OTw@|trv4vViVwfaX@HU1PsuS!HP61x7xf@- z_wU)p6U?=r>D_8(jI}g+G|$-O=qrAhLAeu!(KQ}s9vLoZJIVJG^hTeU%}KsLM5L+z zJX)ypNS+kW5KjtY6L7KCN5mA`hdx@{Y1#2RU>dgp#ndMsJkc%2vq!v?rf&abGdao~ z&1KYIQc3i>TsD-hk0q908Yk>I4TK*WmYP5>_;-5lk57OR^<)o4?3}L(iGUuZ9;UE5 z{hXbV4YmQ4?KS8&HeiY0v%<$!b>MBU)r}$JYCVtRenc$p1h28O+o3uvxvq&KftIYu z(XDsC&|bl@E)>x;US9Z?MTK2OP}?_Q()tr8Q{&@H#j{v(4q3qL?BTp5oJw9HsO53Y zQ5D#(+qRj2bT*+6(vlaEF4|zsaE+?B2kl%5Sf_Vu5-;nzO+|Y37vye6O5skqTbQxBSl z!_Rlwn=|gCr*7lLz)g9MBc1ykJgi-Ygp3zE(A(^YEeIa!J)5c9w~lD6DSQxcsm$T> z;6*MaNMw7uZ``v@C}rw%shdN6M@6vxNDVSsoI6@^HtA=QRtDi4fE4^SG6PgvIX7AVNcQCc=uY$-r^M~h=NUY z*)o)N1HAK|D%U0{IFQnTfoaZh!Pkc}ca{{;%m~8Kj|g)%l{qb=4>lk}wON6)uFkbb z-cDZcFY!Do3+pn}3CIW8eep59t2#zi;D<6Z#~mT(f_M8VH@z|K;+-#Rkv3X>*01Xs9mx`?*dzaV4H(m1 z$4^!bDUD+lV1py&V0z>}#=gEZ5k^oXOX+oY1N4WDvPc1M6ldYJI|4L*QP`anMng7e zsl`r5cS!hLk#**_{+M5BNH4B7iQsNYvLK}FU&IG&jzP*Sp0ZUsoIOVI+e0}v+Jlgr zSOQ0{==(;rhN#DaPuqVvrY{_nD?6Pb>)PLZiO)DSV+?zfAo{;9VU5$05YWhwV6l&n z=^E+Yska&o@0jE9F{4|$O=N~^1-*WcS*5;kADjs>W+?y_ zWVcYqx?JxQ;UrVmTBywWw0GPJgxKHIV99CObW|jgd4eoqjD>o+oJWBx{7JVwr2%9! zxoO?X^~uI0!2xnyiJmm)>Y=a~b(f^2c<~3EM*W|!ckg685nCfu4Tr<}ZX!8JG|WoS z?%B|MXVaUvem~DhFND1U;nP;3e`YQlnc%)J`tfdC+Mmz9npN+^X4h z#eD}`6k*9Zb93%?gZ)dg*#R407BF$gr_bZ%*M1~J=wYi`2hE}91G`H*gb#Xzd{5GrImDT<4H-Ex!X^HeC|+ItB-*) zTPb8frAme;Ws$u#OdHiYj%$oNR{rNKPPyf`fNzKTm>IO*Q%qp1o)%9O!a^{0`ux{> z`d5HN&p^)K&#N8m%s!dD0a^pbF6@3@MxH&)#lxK&&X;)gf(8$?lrXkga9n8KA(a6y z$#R6&y+297MUC!sgFR5|JD*z@f*e^JubqL*k~GVVZ+X5dqZS{8>h}CNc~ea*MqEQt zxs*I>bD=9HsC@mA^Y~i5G=N!Vh2E?l+0Ah(7VKzr@rqGA(+Ujb!L||uaX!G6LI104 z&xmW@omdGP(w`4T{ck|;}a7tT~qt^1G3jgJZjR9yT0LOH5 z0}Yg`ZQk}|zZ8G?4h_6PYnIb$q@bU*sp5+j$UM=k$XvKdN1mKPvR;@?|N35%&2o!! zCakLNy!czCp3?#6v&I*R&iad?$(@jv@)Y;XcaquI)7}{Yd=I9(^aJ$mLU{^=K}`$M zoV5!a0UCCp-#FIXgp5_vr%ZYc)?Sh1)F+mZMg?#)JByog;aVMq0Dz37IAHuc`5nl^ z#%X9BYc6RSQ22^lRT*Y7mtt#l>ED42>#Bdpr7M`W^W7iFTaT2s(Nk$L=Ymd6i&}WM zAGq`cEU6S`Q{n^PFoOMHtlL@1apMC)t)GyQ+@ZaACgx60G6quU_*mvbdEMCu_7R7Z z3zWg0#c_YaZ=jp>PSepq#yB6Rq5|5U9Gs(cE-uSXJY&QyJzpEi`pdQ@O-5e(K3Fjx zPUyQ;xG-9!3fRKWNeYiDKo##H+_9Pr$InMhk0=4aN&)~@#kg+^dclU z*ap<}bG~Z4T+PDAkc?ynIm0JIQhIuh=i`2?B?xI$|eIC%? zXjkfVtL4SN2j@V_Uip2uTn7)_AM&75Ph3c1PnqA_O*+eG1df9k1ZNrM9sm7gRZOj` zAyUyAlR2hz`1e5MIP*_eh6Qqg@&RNo0I~H!%B%;>g$6$@+9d$WJZB}N~O$cy}tU&ml z1=3Lg;uFY+EEtKPuip^b(8>lKc0)Sebz3BClWUpmc@VGnNde^DI0sVV4O#n;T!h@o zT0?$CWYANbAvGDetwu(MPrC_z1gGE;5bulA^GMy!*0oalteMLm78d6Co}?ABx5so2 zyQ4K}{p`yQSiuJ=5}nt79Lg#9g6o)7;swOo$#>UKi#@G1TWlR$7hqbK#9%T6^CmRT zt|~B1wC0VP!JQmbh&rM&C?%6J(Ms-$oM-|C?^=piLaY>tKu>UF&R}qQkykH(ov<)K z`<*83(s_4LP#5b8T^h#;>Osxp)tW;fL6d8=s}h;C-(NixQoyr&7U1@Ne#XpqsXUyM zHK)l#goqp}FoO8GIYYfiqk#Y=jO`VP6&dt+(Nla*6xXvzIdhM;O!4T+{vrJ?VF6*3vQQEC_Cw?NL*3Zy z*)_5`J&D2Bg1_w@on|xGHtVY=#B{I>>TPQ8J9m&=Wci<6R?xgRsPH)?;57+N2ZK;-4lfoRllEj|punuK#R0T_%kTf{DTGWrm z^5BS;)Ce3tp2a+}2}J{gK0|!epcQ+p4=Gs$ekD|Qv|S{Fy8GP^sE*EFv+@^-z2E=7 zaOUyz?7CWPzgE}Vf23uX>Dq}vtSq0>%a7^ey+m?9f4t!K)QZeoBfvB^i(Vcj5;@U8 z?xC9so|;=_sF9ovR0JH#tkCkPl~$0d3tNGpR)9$v6F{+#gd$LnvgYb%IK^*w3R_XO zwtM@}T7Nfh)bdom^XTbw`XyaUTBKZMzEl-z>vty5n(xU!`fyi?`!zgpibT+Q*XpL& z0`o2ogdIlqok{8$&9LgVYDQdigfA%F9KB5abb6Vf540{RkJ|rwLVu)a-gap(OMp!h z0psRVK+XZb5XLxIXz7sabMVB=u^>LF^I5w1S-Y4uw2j#K1!_4VU0b}RJ!^x>IWl)hN@9rSyp#VRLK%Rm z65uAik}j;FS2Q`z8(5mObdCF-UCmnc{jcZUH*a?vt2asZkUIq45S9n%l+QvKq+z&e zx5-HL?~nCBGza>H&65h4;NtKbN;TpPYa7v_8dGj~jbkp!q;c9YZ5bKtFjuMGSRYd4+epQ%~g0v2BdQ zxJjm0Pf*aslsMydpsX}gYyyE`GpGiqP4p8satlev^M@CrVNY|USYmv5521;rfU-KB zAZba9bUW&~KX)6$o>j~W(HknebHmre$FTOxZZ(~CIKC234#K9VA=o)JA=FLR|h&f&zByjLc z-+UJPT2skkN9TDD9)Z#zqgspQr91(~ zOvASUqAx}N(+gnxgqW0*+tCFt!{6kC6QX)4oO4gEBh~y>TI&rgdXjH(xAx~d6m_4R z{%psZA-l>6(Zn)AoeOO{DChLdmT%Pr&7OmSNHYfJeS4OXW6Cr* z)EoHfccC1J-hM~lUa&mWzx~(n$zUR^|yaDsWiJ_L{#RV7kY>=IrxDw=kEOT_J^IZflKoBdDLnW z?+(Ng7eX$q+s38axHPYKe{uW?K(!MJw3M@reZ1JWJ@~p*zLl8s9n01Qo85bD)0dDH zTt;hFZrWk08ZJENRB^-n%a(p{Pkx|v1ZzfM^t_RS_`4vOh_0q<=P9FAxfZ{T&TOm~ zU?j|O&be?6dGF(7z>IMBaYtwa`|2g;r_`4n(rR=e{*ibb*?%TzyJ$3?f;7dJ@&Bw) zRlK|*)esHQqDIdsCG4q4xMUe^=K)vHEbJBC47DER*)mpIoJg}N?Jew(y&T0IV|!W# z%-g<36I_uaeVpbxhIiiYwB^{wr0ng^)*S9pIWo@ihH_Fj;c078b@^&Rx-izF;w^!C zR%eLcavaeUpo+o>Ri9c!sv}vMf6Nq#Q!%X#B56h0X^oOnh18?DDhp^GH)we@R+95SN+4y!LHmZYNMl(!1O;dU<4#mu1&m(p}p};!sYK749B_1Z-Lj38;YJ zfZqKYtgjItaAUbk9tNo78~OLo@aI)N>@1Cp@8)jJ-=!5B$3o{k_HRpnu$OO8rM4Y# zm}~ugE>QiMa{umazm(H&&y$;U&HA`tkz`|(uJ-(oMi747C;+`@u|-Rr`X+xhZkRNw zhL2p&*x@%Q%cI0slucskDa}4g(vX4X-l~0zoB*=S00SHQoC~|Fz>En=2HAW^>k_`H zkQ~>2DvJ7Mdr~ds^!~nrP^xx$`88V)~!A2K6y*q_S%y)f8_Bp{sj*da^FS@Ze_}N zy_!m-Z|-ZCzz#nYM`eD`+xy_%`1tC34t2zKv)AU63t03%wZ5Je20HeK;N781n-~U% zw@ZU!m*w!O=M*msP3TFHaQVu)y01-7-%FZcS1b!@L{4NwSMfnY49o2>4?lbg(r0T3 zr7PNz{^~UVo3YWGy|?9#+Zrnn$*bdvXyWUpRG1@bjN}DylMxV#wfDwPe<^=$t77qs zhXjP4;aO*e4TWHU!jS>%zH)A2ik1R@eF5NuPqKr5nh0Es;8iUFk=itdSmUaX8+gEJ zjn1)(;g^65|C6!YuxlNaKw-qkr;;m|{Z4C|d7gUXP4!L1=(z7^=VefHJwLlDxbNN2 z#&SRn_-t;g1H{pUjBcFby14K($@De!eI5Ya+^2&rz#v}2nrjO3qtw_+@q?~AH-QE| zQiOT)9(4L!usKY2Rj2HqS(G-w_W>+EhS z%{g#o$o^3Al<1g1S`7M4e?0$fEAmww><<~O8!Pv0sjI|2NGtJqGc{^7SoPF|Klio_ zPF1gd*h7zAN$b%Z8IOz=e>CQY;MnEAZf_tOKRUE*w7JCfm6(Iol*sId($4x_y(0ZR zL;S3aU6~K!G7<$9OBGroz8@{VL!9*cL9 zJAiVbTE8~E%Gs^#4`dGXK^^d^sO=^2O?<_2^e>RR^8hm883HCK8S2rUbT01JYl*Z8 z1CM82LKF8-lI}ftm1|Le2b8sRQUf(Y5&08pCH;*JAC_ni=bky5QcO!IU~Z-88C1ghlaa5P-TNcU>yFNvcOK4(Ci-sPSUQJ(9fbOa?%R;P1?}&lu ziDr}>T|DEGPG{%1>o)m3P$JC3b2r;E{}IUWWk7PQ;n+-|*Nu30;7I;72coj@Y=hUw zB24nZ-L~2zy?;z8juT(Ce$yTRS0!Gr7l@zXst7UuB#(xnd4JeNeAW7bZtTOU8c={+ zjs+&sTKHVTBi7iT)Jcl2171>_Zkc+4EsF0zeC6Df*43tK$y_| zyqc2xM$a9Nutm`IyQ=l$a@J?v;~(ZE=^P6@F8=-*Z?cjpa8`;27sSE8d&ZZ|;;mO8 zw?bp~US#hhJ!xGq8d!>kr#E_*|Juv}>U1x{TGS zU<6B~ORI+f9H|0pnw*xhlL&~wYiLL#Fo;@6SX}1)VA>C_d~*F87u1FG(sg#zrvKeh zbICr#Ar?CJ+Na=si`;z+n>{WCGjvp!383=O-&_vQt67ejSVIwCyD$|*8SYB8rqRZ0 zQ-D>OB2@>HGldAV1<^;Z8q;z4W^{2Oo|fR2od6PQB@~)q1>~1%Qk#g<-Kh zRb!fc>E)vD`sS;4_Za`>?`I?G-(+ynv2`Su@fv5!-+3uMt9_@1&0ox|^Vn2{tyFwx zKL5DyY%FX7@&OvWKQl4dix&MDFi$!F9=OMqV<+$s7)`Rjy^gw0eagL~D-UBznc-V2 zS18tjC;bBS!Vr*%V%a8}_NI`%4Y8aJ6?~k>1*vDl=JO#B0K$QcS&@B^#_yM(X&z~s zUvhBPUbj~e8O}GVIC(hrR9qGBc>gxo%V!?gQ!4xbWIhN9&-2}c<}Ag%Opo|uZZ^D5 zF{q}!_ujL1W;3-fsrCz4(?T9WgZ%K{D39E@+#P95@V;(k(=c_Olzd0h=FZYxh%f_r z$l0uSTXzPZbdZ9v1F}wxZj}7+P<>gm^)YQDfdT_QNYB63^wRJ#A{G-&vz!3ri?@_^ z`8&(hb8Jys=9e!>i(=H~)J>6CEx&B$=2M-$TaX!-b{Wmbz9SW*8%(nfeowGBcUJ(^ z?91%ZqDGKhHRf0UZTLpQpzd`Qwfaws*J0^XJL3cCOygTdbt|4x5i)th;c;oW6ML>v z93xoCSDleIjxoG5(o3#?r3LbX8Y&_hUg4NM|8+b@6x9p3Z2{es(6W6!_ZW(;x28j# zh=;;Zd6H%5cu>d_mctjhe}JR6Im3TQ4_`_QerAsyo0n zynxiaV0KmvSg5|%?doF4VmxIO{1I1u^(led=rdR`9EQc$ZXjG#Ye)~Bo7(^I2=!~+ zkvw$)j=hNzZ%@L@XR*&sW;Vz|XH1MrPH+=p3z7CE zCrOg4^c;ZGrUZE%2V2RTskd4yM(mt3@4k(Fa6@aGf0xc!VFdK@vMDl3z><^A)}wGp zxysX5K@rb`o~h)`O-8JR5?AukmxTErzt(olae#0-IGD4)J*w|{ax!;LeX4qVceUTZ zNaS*{?@=fvc8C=0>_M+=()pLq4C;>o0j>c%ojf*(vI%M_&kn}ZxpF;S*xLGy3V5ks ztIe}ytCv9N{~6Mv20fp@ z_X8QUxFmhlvH_ zfbsRgO;>H|hu7jKX+{-YCi)g$1m>Y{CY}|ND>_Da0cEWptUxk%#qKtFQsvsCO|q`uz^%(w4v;l`B3_=5g(aQM7<8$jqwi(+ly^#wqceOuPGE_i`9uC zC`c+0gNPDb#%#tP=ueh9oYKv$OKsgNwxO-e-iC^=T>B8N*Y#$V`6-Cp2mcM}Mg5oA zzo0Z5`&A|JKGK7)aJ5^dpUZli*{r@O0Pp3_$6tDrY10?)a$0F?-qCgHUG~n)sN@2- zkpsx|S;Pqc&Z8SAw&GVgeKxaLPd!e7==V-j ziI5rd@O$iw&G9v)>CyiIorbTz0ibhI)=cEIi8RIk!vghUVjle*sF+n2WvohFNdBT~ zZS0vsV7O!?ct_~{F4ms5LvYkSg^T!c50J|TAin7@=RCIi@2Ap9@yn$)Dr;5u4o^F4 z_)8OngMQoW0X?(6As=s^%*(35fW7n z#AW$k#V8M$V0%3!ehUERAlin2B0oz@%=t8@wuNb#Gc;ZJ>M4_;#p~?ctbA^M(Wcyr zavJUDK7&0UuYJtGcvytN_QEKou;VS(cG3&JSY4`~u2m&dX%NPjD*d}bFQYoZBqbUJxLRkeB~6MfIDB4@kVBuH?l6iup>Ektpz zxjcEkV)NNcnznsuHkGBqv>hWo%#iQE0saB2X$6a?h+idNEyP0-x%-D@N@GThC=c2@ z8vbB-u&8aT2Dixe!mQQj%zSd(3NoXQ5fD?zpZ7psK^*O^xFhBjzZlA2^Jb^DoQzkR zk7<43JkgFLLQtD9K``-6$#{dcxIy9K@ zJm#dBBDcmMf6iu^JO$XjICf?sPtM`vE&a8TGZo_z){U+rfLreGT=pGwl$0BRHN{iRAn;Uf?Je%mB*+|cvG>%#JEAH;p2 z>Z_8wGyE!d%~~8X_h2F3{$cq{s~3N~k*yc~-WwM@FKObW5|9T{67J@tqZs!9Ok)PF znC2fM#${JAO$e^mtgF=nd9m@&hwmuH2(bKe zAf!AxP7Ev#7twg|l`iiQ&UC!5;N*0Q6L2D6@a+6Y5l{F6$qTky(g%B zvpE-1jIM5b#A#W7T^mrE z?49z+yUE3Htp&e+|DLLDgi55W$-j)a)p5P_o^t9V?CGs+t@et537zyHkFTv7uX(VPya4@2sY77ml$Eur7Us8H~=ml z4dhN-Q<$9avhcN2dqC$+(W4GFhg{6oru9P)=pl{mN|`GYnh( z6zkJYfANbz4ZHGGturDp7(`3FEMeQC-zS&gNbTe!qlW=CEr}U=@&fP??*NmVA6CXg zweaAV9Q=99n&EB{J=>VWYCzJcn2_35exTFuQ{CLXAFlWz_yEk5Th@72|1O5RRxH1~ z)BCFal4FAw=5@)_R0L|eee$|fP;qz1pw8dY?iVkB5!cdSXQUmKb<0M2iPG)G z(RMVg&L2q6>t_zDmB}k|9miF__vhl($y^b)XmIU{FX!AC2W_|-U5jWxnktC=_!8)f zRZ3WbM3=UMnza}KK*CF@+2(nwJ_yc!zdd<* zJCd!GtN&^H3nL+Y-^#(y^H;Nf=H-;zdX`31VPF6=Pb!<)P`oLJD}-Kmmw1uuPX9`$ zVmxh3+|NEb<#xYgqXiI6D|7B`*Xs)7b#c~HE5lX#MD+mr+hbsGSZ#Oei>tO!Hv$E2 zpklVe1@Lv33O210|Lm`&=!)>YlbG8LI&pu782$LQrVU;R@K&7m@whL<+*V)J73s-*RSx^^_5FiA47^^ejK-M7d%33i85MpMoA{3yG`(YG1V z7sVkC=J!Cdv^Akbjjy}vA??&n`|M3?5+nI_Euixd$yBhzdU0c+^J|jDn6)$FQqHsJ zN%dv3w3_|WZMbt8(|x3%b$7b&I4d5A{Kp@Q@d|68PxTTqa9;NAkkAR2t!Z+j#*|q^ z5c5AxhTYjr!2&uh`NyPuV|O|P`QwsfC#Uo_&h9c~QLlG4TqjkW?c{mFhw6SRvBn%D zGqLr|g!NiwPK<>Q+wniBC;`K;hdr%CCN7cTNH)M1pi##N3;3`e*gznE9xQ1E-a!rN z7w%i9rf{y>D<2Vz+|kbfH7BfDi5sf(7s;=2xJCFCHbv^0E_w3d^7=HJYKI6Ic}a!E znQ$+W(DHYniM8xy$_8iD;9hG1=5VlKlC^43+t8kCyS3B#a$>&gL{~oVmj{3!WAb zp2kQeywCbc=Y^STVrkw(nmU;dTVLxQy4vgPm+Qd&G9*k-ML);chQW z4haFow44;Y+rDF86ekvZr7AcxW2fFFp5PE`VEnofL!&-*wC zt>bK@ua(GKk(qM&%qb<9wPrP&Sb-h}&PhGph4OeWaZM=BU&lgHY!6P+Y}Q_b!};D) z6ux9>zE0fD3LQwbqJ{866`f9E@!`C}O(cyYCpXs%JVwHev3V=|g?Lq8zcDD|D>822>#r5?Ze~Kf_a$1F+9z#93DJ6~JElb=~+3zsY*dW$paTem+>< z;~r@CI9DxoZPOcg@A*P9kHL)Cql;S7dXVj2hOFc5=5XvVH)q`g4FK;q9oFO+aK|}> z4s$CyC(&Kdxm0~^>^4UVO58V)Rg*}>ANeXI4p4wLS=2W7jcYQbxaM~nuZ)W#=}n|L z>*u2iS0rtL((Q?gSvqB_PQT~;ynB>?w&wpBg`6>Fa?b?H&xF%>(LmDzE{^vI6|W!4`n!Tf8CjVG9g*ljP+fB zxVj!qgeA764!h@GBQ;0kOvd*fCXSc1_n?x50Cy(3x8U{x!%RMDcz{|UjhK#M;^x+U zcDSjcjlx`kfTb|FRp-StYSok$EdAgaVQP_yY255>am6>LwCUVxr~ziMDK<%xq~^_s z?;Zh_JVPp_sa1c1oSz1f=qp)aKvy86e2azZuMo6itdVwL&;HgsBT@ETzwS&0tBp{) zcMZ8{bRjhNKlb}<6^|P*62sW9N_@DHB=ticHS57K3HZq6iM{t-yI%;nXf$*{O`$eS?)#`N; zQl6YAhj{}^Pk|e;u8}`4R+edGe;QJdwLY1wYLqi-b@IjCR$=spnHp4S}_O~wU zL!rqZ0m8t%z~bYLZ<-1AGkTw`J?l>>3ghjs7SZ6B4r;N4OaMm(4~nsdBvr5KW|wIC z*+g*hDRUab4v<@gm|#*`2grx(C45aiJ&mlve#43p#j})+x3PbYB5&bZek@KxX^Wf- zFYgR>4si{-Pn5#$ZGb`^?@y-^kNC-(+u5IXMxOS%w%JzNn0{H4k-N#^3uj@^Sq}Vr z8%v%xoI$0ewirf*qAqKMcPA&V$+sMCQz~CZ17F8_R{-N%CK-xJ*k#vhh_USk?+orN zXrUs2KMK(TnfRRC_NFX1BBx$+fqyJZeq0ol}Hfko|xUKZaU1ODu%ppNZaTCi)Bf| zBuj!^aNW_jR6N8_gXGI_oD>+qT-s0kWaIDKO48VY5*AXk2C5d2ut=o_z~=1mFQ6E+ zR)$}8^$hvzD!18(I+|(;d*|8L<-XUo4UcNW;qTit*&~f;h08Y` zy|Osut<*pQgX8!3&mnVXqI55Ngp+KmGs z4G-(FHK`EZEnFdYhv}!_U=sDGY93?X)UO`v&Mi!WJG6M}OZ7)j8XI-YFQb{7ubLW9 zi|+V<=-wd@r>~_oi$;^3ye96%Gboz|b4I5_Ip}ek`7o-#xw59tDU5gd5onAs_c>J`W2cO5 zCbc}96>kPC>vD$R5n%d!fWWCCgLI1Tx2&F@3|p|8quXnCG#XvV!(~Hm^7b6PvBH6( z!kA5WyzM)xo32-Z&|ML+3V31E|Fa6q?Wmno=uJJt9etPsL`*uorN#bu`V6S|0N>35 zzR8m$i=TD-RUHZ}R!3%8xY1C?PF5jVqYB&L_oJCe4P~Wz!|(LX`}S7Mr1j8|2DL0>q~pr9-|;ikES~V;yI(_@tuIBC2HZ zQKA1Hs?K@oZC6|!^-pOUUmy*?+WO7V{1@IQW-2~HC{YW@X-A&LQIRn2!s^0{OEy>_&SaQ zc%mtyhvoPN!+A|pYWpdROod%cKt9rr78aCkSQ0w7`7G2r-#gX^ds_Ni^onA*3Qep! zkcau1{u=ITE1thEWJfC5XPbkF@^kuQZ0{v$M>PU?)^o=-)=^%5 z>FHB2t47g4O_$?f6N~QiN{R*@)Wp4(t;G(mqz(Arl~xM0hE9s->rB6l@gYYl+1ks%BnAksp?b63UKu6Fc{z6YLNEECW!}p-#J&i*v}@yH-J_-X|grh z+?}eGB%oCsue^2%td@m!Q`ic`D?oqZN`+ZtT@N_~Tf^{93i2z58%8Mq7#{Pr*AD9- zfN0Z7680q1KNGs7Wc;KcOq8Q4k!+U+A^_baT?_-(I0NBRN}RFLI$|bq z$C3;vS^DVoPj^isFRU;paJ24y$B}wxk)tTDyqWN5GYfbogbmb*U6LOlQ)UY~Ile6} z2`W>^&!VURgT}@Hpk*lyA$x23(IWi$Vs(aX=BIN#V@ohXBotd4JXbtPNnZqj2=&8 zK#XIW397px>V#Sg;4S+)tW>2`G45We2rGBbRRD5hOMEVguNVI$p()>F$GO72i4Nw} z+3=eLh{!{M`{3fCLrpyq=H24Xj%q8^65`GF_yGpEl05y}qTk;o z-q*$67_dU2dnL_-Rpt{)bKXr83#e~Q&7v6hgrNt3YAPhaviJhE((&zTuFEcW^ra=* z0Li{!FneF!&D01AL!^)2FU(Pj+rv>A|4m#dFgTI=OzA96E%DAyxPhzUONT+_*QQ45 zmwv1m65!8K(~;)P$|=c@n9F&0SPE;nu@$Vr!-+N-ve&-WgwMST{Uzud#ioE{NG>^` zvwqNoW9@y`K%~fz3)xKeE8-L1^43p>M8Lu#?y5X4X-(_0`9#;hC33qdkvckxn8`mS z1+Nb8!E5Z-&6C8lN1j#byS4L|RJgrq0P`LLUA5P95ITA~SSwF<6qJ@Y8 z3H&dnd2OH$>CW8^%!u${&N$+!qpydr9`Qv)0J(sGggW+^C|2e{*+ID&d$&sR-emm` z7f)LWg9s0kl`QN%t_4iK;^k;58qMBW7=>6EvhLZl7k-WDv&vMvpP2#Wlgv#B#+$C+ zq-a{`m$bFv{T3;`l>8}KoNnk?<$DatE#5eN0lT7zdqa+1Vv~(f_1}~u2dK%Ry7H!` z*~8U#^L9b@1hqHrUO1wBEbwRes7}mXJpn&?cI!b_E8h5i<#->URYy|G&A3mu4JHMC z?7e0kIXXV7qE)K~@5DSHl7P-7(eXR2whqUzCH-T(AY@R2`STn81^L_Y&NV4>Sv}LI zY$_7-JB9+KBer^nqsFDo-?xW-sDezizIiO1YGJCz1c{MUP_>@9p+M! z&27U{H;ZFz5o;6CHyK3Kc#8G*{YzWSECE(v`y?r_uS(b3TBwh8=q!L$koZ6Cef3|I zP4}>@ivrRiC?VY;A*H}7BHi5x0wUcFuBeDXcT1ymH!C7Y2?Elk(jXw+yt62e-m%{A zAMoX;{VaRUb>?)9p-qKTI)!f<*X6U4!k_d$`+0h1=fE55QvOifv4*|x}C9z zj2+WvPZf06yL9i^Vna0T6w>g(2-d9V?V6_nuhmDnCvcCA?-W--rxQP^^m4Z4M&gjY z&2kl|nDXtRTN!l6M=*ij{R#HZ6G+H!v942pQ%-$!KiZGpx>8g(6wn@lkzS;FZ7vuS z+JKbKs%vEpB_Y;8GFjxzx2ROnhD7s|Vt5~P?+|Cq&^NIC%c95YQ~Mx|TYXc)1hH8X}B4vcSCU5OGY^N|q_pFYEix;>|8U7Kx}aW!Df-9^^=77?D}- zSaR$H*ti$i27iL+T^^}uOJ^r>JU z73g<9Z6+D;kSvgOJU~E&MEK4%gX|SHl(Dk7gmjI`HcQa@v}g(eNyeqVqK|Pm!|;)j z2r2@=mM||n3U5Uf%tJ-hgK}RlN%#k2Qlw05VhO>F{a{(p)}_{_(7pA~80UIaH-C;*wr_Z)(S`iYY(y(4rJJgoPk_ajYV5v9&Gzjwo;O zi#&U~mQsaI_EQufZ-olJQ_w18?uMKhUC1eMwI+?a@;r^aZpx7ji|hvJ=X+r$v{1%s zH=y-7;GpNA?P8bz9oVA1|2gmi5s5~r&?VP9i zBpxyOkd|I15I^e?va5lWSHJn0&WEe7>fu1hQySKrN-w_zmE?bwjN@++XVD@zHm?g= zUE*S`x%7~d_M^J=1VyP~YO5%pKa2*{He=4U+fm|4Xhnk%x>c9t3vDR<9~PX91aduM zP<8Wk{f)jRhI<4i+C&wqXzOjl82jSXd?0vxKAgZN;D27T_B-EkxGG$0aCO}u7;%(9 zrb&Y`S*+8V>F_4Aw~!$Xku?`IvaeEX%OOz}pP2%A9wLTS&i1_SmtAom7_vk*uu6Lg z6$b%ccoKy4pYkk3F5qa)1bSe12{1#hvcwWxm$-Qu|NRq?t@FMgxhl#^x0PM_Nwnu{ zoZf;&wh-d-A7F%0Ux%bat#7m9LdKOZ3N(gbX}2>Lg!qVJ;eeD3V$WvXqgbz*sBkJD z^q_a-nST8*5Tj1ZXT6;4#KG~Y#+p3smeRSFIvAcm?iUT)DZ7+}||6EGDR z>v(wA})f%zkStf?T$#$r-MwCal{OK{yCY_5^NtFSn`YSovP@j>xO2 znr4AY0@7)L)3kr!9yl!#Gl`J9L;e$l;-~q3lF~F~Dh#h2>ZlNf4)KCU47d(P&2kfV z;?&S`Ub^jjZ_p@~Hdty!;qbii3`!*gSZMYIppR$jTOm5Tr|Y+rZi*Yxm^xVU4F+RC zr)e*DBnTCZmP&3>{b=Ycj(w-s9|ww)D7ieC3+#K%xwh!3i-1sKWQ5~Bqk<8gHbqQ@ zI`$1}6A0*)Uk}(@e_7>jdbnO02kz4U+$;7rsUa`T_}D0`w?rJl~a;tl+Z&WFw~?bov`!?H^!Ztut#%WuQ+PDUQl4dBXp6NfDlZ@4GYZ^`XO7xVKg7_h|}JhP@2QLjs~wGV6Lv-Ev=5hi%NL5WUHOJ zQ0|U2J;PUM3{c|{IO?|06wl;w-J*Ee=l40#Yi*AkZQtWEKOvO5O9ahK!L{>IY6L-7qlAFgJ+Tl$jD0B! z3JQ>jA)rI+h&G`6&`=WB2P{vMTgQ9QmxNk|x{zjq3Dc)fW&+1~q!OGZI2Ve5N|bs4 zm8td;Gki4q5g*|+oQ#IA$|o*LZ(*Ixk&fw)Pw!RVR(uypy7Na4nr4LAd)Uy{5_5!vQFq*19?P$0uls|KyoN#*@Xn8@$1l^ zWMMql;3vNoLC`Y!6hZ8|EAWL~uG#{ef-%kGJoDy{Y&egM^A+wpCHW&Lg&n?JlN17n zmC9MS(bwWn70yHf6KlX;|8a}LJ=Ky-&mp%5WK=Hvkse;a_iJ{Q7k@uXj}GcYp#M;o z^~J(hsYmRqw~||M>b2VpFC~>%cs|qgb@Sf@O`VImI5VjI3P37uLZi+(viy5wLW5S# zuIcCe32>F^VH427ZBvNLWi$|kfMR4`AN%|=h(Zc*cT+uGiY-O16%=5c{l$vZ-jKDn zcd^~->1`e9{L}+W38b+HJwq;1Vu`Y1-3wc3w$kH^DMTB4vfVDoNa=SLp}q?gzhB+8 zO1ux7tUi2O+QBeQi0=G5eSN%@tDtXN>2}r2ju#%eizBO|`{|#>c@dYaT{y_oZc$Nb-XjQETr?D2=!r**T9iv z(yFtNZcC=Pm#G3mbjzArHMXeW`Ccq+CB;i5(Tqo^L?p?0tV4Cg_I;3d{Tj<~i?(kP z?)L~GI2$pXYR@C=)0Bn2?U-F}#C@EsgGJtiFHV~5`-x}ZpLv9Zao!HJKfM2<*HA-5dC#E6^_vJA*x8`3eG?l#d#2Grch0 zU(Dq5&O6o1>YGV&+S*Qg$UA#fvhwl74Z7q3jOWTXG@B#U;A@2;A$5{F=g9=JT^YI- zA0NGb6XCMx!Om4LQ1$o?amJcM=@XC-0&33zX7s>#@~Q{Micxu(Fa*2_p$=}R)@I|1^vR}TlBZY`{Eib#ecjWId78Ev^ z-%+m1zipFxY2wz%z{EwLkWA>hzsp@;fiErB-pS?s(6?|3`~t|3fA^FlJ{!$+*!_-_ z8pV4Oy46Vsg}s{(1GTLzOvtxCYUk7`)aMg8HcbB2b=qcv*$;`W(R#$cOtY50Ku-lJ zTYrc9Jx!d^owf@cvCBD#`*vM>Ma5xhk+J_?TQ|*#lBZWhY@YQN_pn>dDAZDdJY!vM zOVfxiHT4k)JFmT%xO_?F>-RDz^S{efGAGiBY>=E`#TdwW}wwN64 z^N{;kz2lnj-Hu>KRj(la>b}m+E({?BW6&du#Mez2B66o}>InfxuMA@IO374iru0_M zC#lJUNOd0$XNPE`s1q~%RV`iAouF4pRqWhQ|_%SVc z5h;BxPo10|R}&i+Z@yLikqtzCX}0{Lo_l6xkpD{6 z$1B*#8URfr@FkAzCLBVbC09AbGwx5!Y_5{~0>LxCS+$O9vA8G2CV?zV{KhjdL9i)* zM~r|2b^)1<A_6E&>{MKWID~PTviC zK^%-QYu&kEfzc_}`t&R3+;^3|rHUuLV^O8^U*@Y{u2auVb#H;0HowdEDR?sG`Z;0Y z2W${HNBCr1cM~nW?tO|ajleDGPBvIx8W|ZFJ##P(PVDYsEeMalyaH4UgMe|BZT zuC6$)9G*d9^izvqRYCEl-gSAZ1`n@4)P>;zw(y7L%Ml4Z95EuQ=76iK5- zINF=i>u-}V-_0oy?zcZhTy?1NTW`vNAZ))tKSW4)o?5^0C6XHhE{cKel-vIr<{cWF z&?VW^s9=fpq3h75F)ZLhBmN1xEC{sJ9vemt@l)`}T?~jr?8|UHYjCRGKfG7=p_Qx< zr%}+o%;j-WmCsJ)`q}QL4}NGzUJ8ZYS0}bvF+0q@4evGhUt?zCHzI|@nBYAd&nyzB zjL^m2s6sZ`Kc7*ovjct7PKp!nm+)rhv%vMALppaAcZ@gUFOO4g9@u7H7H<=Mg&$ek zng}7dBR|22ZYR@seL_qb;@Wc2&yY~!X`u{e7R)r?_O^_rH#P{ni_^-WG=KMU zNPu*xzIpl)^rfzjCG~;6)XxM3>5Y#ck)9_Yfx~{Z+zqQK4hVO@*K|QD$lxC(${ zLP38(e_C0)02nP{=q@)Cv|9R-@9~2?oB=_dd!0{rWx2v=|E69DK@cRY98dN-3~_e8 z-Z_DPmg+p58_V3U;0A4M3Mk>Y^gv)I^NVFpd+BIju5Rf%qX=vuj3Tg7d*7>M=+#CulNMeOMtCk*C zewSQda7?OaZ?`pPRXr0l|)fA(z-us^KbF4)@RF7z{KQr*SQ*o0mbIN9zG%IYD52xk$Kwx&qwt2||CSc#oDt-gg1 zc&QJbW30P!*xrToa+X%u{$z^Z*QbRZ(y+zJ3=@dV$V#Cl)pXsg1 zbAR0+a&ieEQLO9*XIe28m!m-8x5f3z)`o$8srcqU5kb*F#q=%Y8>C);DCTcNzNcimK;$nuI- zq}KFR?)ZR==zeV=q>35!Nl4eP%7;P@l`S6#G!Ye^z)xXg|fN#=IFYi-^k8ki<7zUzX4l z$cNi@_!I~CjKX`L_8x^$F;3Oe{Qb=!zhob~b)5>cCOg^ngULkW2pwE(w%tJ_aS96Z z-CdJ)Wwls6{jZg*@$imY_K`SR1*3Hy)yMQc^{cz%C{%P~vbB!lOD33@;pwiDl-q4> zRJ>qa@UWKD`u;{~Hx9CA?YD^N6ubdsNA(9}llB_(mCu+sB%xzE5f*f&RHwHy&(b$2 z<^zTEo}DDab$y=L{DdTF(i3PG45fCr_!8PpJ#W|gXnU;dHM_^)z%Mvd2k@n-moM&3 zrxu$ORaiaVQtoE>hpTo29M#r;(net&%1=0Evj`GiIca>Hfj>^qp1=oA-;pr&ha5IK zvYWpj7g0H5;BjXBMYX1rRgX=ezr$U1bmO)LU+Plh(mBg+Lut*ZzgvZ$&b3a(!@Aec z&Chc#xDky>X5+jN5aBuT_&_xA{yxHDb;oqhDX8vh)Q-WsR7E{!#fjUL2I50w2XhmF zdC5%?An|LS-=6H(Lm3yE%kKkoz83zXgBnbV{-xK! zG&EfsPvtod=?giC4-NO$Lf50QhPvtXA)ReC`o4QHn%ai&B-+v~wf>Y+4*hXjeT~1_ z)!X>9nU|}4Y`KP(XSQ4}fa7hq{2kqC>@p!D++1%6%_X2qDzBTK>U4wt=wAvrf~WwV z>#06=EhMr&BEmC$#Fyzou^C-bR%S=CP43{0Xv%&SExL4D*{he_O6Rsz)BXNIu4D{5 zM~dDl>S$q%__R9L-j7Lnpa)+0Nb@lX;l~rsN5+jeCU~YkvU~TNh>nNnTc||d*~F+l ztC{NLFPRe(j_cR_0pF})Nwy_V>r?6#xho*_PX z9DM!JcJXUZpxr43WSJap5H_)ve5`C27`JDGMj98#6xEhGanFgc>|(Z*aGdkWEwL;d zIwSwTpzJ5CHOPtpiNFUH#+6HhmqLs1+V>djsz$s!@?~p~^TmF?i1-QOWvjEJg@1GW zx2sFuDof2GHAB{ zJ0NnC%=ny@volxGQ+_LUy+=cfW2w$scL^%=5wFvl9;REls8^dQ>Mvz&XvU^7 zyf`nL{;hk!)Sh8G7-(LN0?^9$ODMs|UgQAUj@jAh(-1|rCO-#!CK?TeiCb6nb5^I3 zZ9D(_IZPhfI$!$2DL>Yuzc1S{X8Cieb7mA6Ovtq%+U=vlrlE_rb=RW3?Y?fHqSSKO z2QDy7^e=BxLlz4^y`K%{1t%!RWF5})e%_QrY>HJ^&h*6po~nYSKsm!o!Rc(Kd!?=> zsm?=@Vbeaft_m*`5;E?82zB8+ZG*mW*!?y=NZN#O_}TEL#W+t!+WWuI8h=F`aci3v zIrZ;Q#_owz@_yZX}BbSkZVhL_U1~_TVPA6-y<#(O;~)BGjrad0cimbSP(_@xMSLG2()zJ1*8PJ?Uh3pC;1)nSyFQIi z?Lp^aRme}>zPDUno9-%W&9#m{bqf6oO(WvTU#l({$m01*9wtG$Ra~MwyC>u2 zr2Ro2hrifYFT(AcA9CE>Y9up(H{g{0&HOp>GeomYzu6*Q$Ph0Dn^r!%h@r6R#itZG zu+4J}WM6()Ag7=W$oOr}^{e8fiwoD1k9Xgz9r`qm-TIFA=DewZ|?%?k2;_C}T ztr{zHw}Kk4Phg}MN>XGaCmNivFgOD-kl6K1YI&V(OKQhMsr8^nau!})rT!f!ROh9K zXLddsk;4`LXx~lAq|=yO$IpREw%2$z5%nnYg%73f<89&RV{xa;Pv{E`a9cACY{^XU zfMI#y@Xhb^oT!IdU7E;E+jD~!1$Y&9{;x+O{F&Z&?onrmXb%+GISS zJ^Vv8IW>h2JzEzSLs`eT=rw{F-Mr7+o72zUO%zHceyqDiF-6;qHuC$K9tE>Cpn` zgFzDi6o%IX_hS-J^(8q*v>Pp=<26%P1!g1y_bL19gNg@_Lcbz5)fdlB3;NvnP3b-H zL!il+$XX1l3X``5frM2olW#=}Dcqc7sftRx4F0y=X$^zoI9|9$6wTRPVlA@v1B06G(b&}q50YyBB?GEWSRwntdU>4m8v5-vFEK9b zjY&L#9a^L17ev<{*T5wWkyCoWibqf{YZK!b>n~y=*N!7ySS;|_Go?v~fqPO9Ij}Hz z!0_QIC|Mx>;hxNaW<`nDvWjw@@2*8E_JsJSdtFLAEB_fU{&UEE4%?t(u>}`a9Dd_2 zJ@|zwYCw+Dcl0J7AZ&@JUQ|8_r)Hxm$hoMmEG>TAoOmKfVAxUEqzO)TKEq{!(EKB* z+{=N;9>rXW&6_jN!hMUNmOp2Yg9Zcs!RDw%MoHOihsQrUXQYyVn6F>>N+Sk!QO>mJ)Z2C**7Ro2kmq2T){@T<}4kF#Q9TA{n*T@EZXc09u6>GBM`S<3AJQ`pUAaJJnp)@gq4%Z38({^3e29uvg#N zEAM4Y{Xw2!q(kcH@fqW)Go*~K<2*Rf0at|7hZc8u3pXC0$M|1hOK-Ht&q?cD*s#g> zIvx?#yKaz8aHyT>%T#Tig@pk16{KSr3;n z;^U%+`$cT9J!-%9A%GT>70!ui+Q$1-$$hrAkCgxpH3QHTq8P@bS74&b4 z!ttSggoUuvMEvM?jL6PtbKHdW?JIuIbF8h|nyz!-+WaPZu<)vLxO{KKv2M9vld5K| z3VE4o?D=h{Gb3#Fjy$U05mH_v_EbyBw(i7MV{Gk|8VO_G z(F=8RHr5!{zp$+x;AtLl-~Ra8I}(T~PsKi5O*e60Whv3eI%PkeVt>DmX74C`yR@+^ zpv-m(?<=ls4fppqjoAUKl8*e~>Qb%(Ru4iu+Dskc+6xbo4u6HRDiCgk;vCN=nX_#gFwQCUyewn8vinN~}EZ zth)E;wMXe_pZ^-$ND}ZOV3=rXX3Hzzb=s|R$98JOGRAUHxKKVt&MS&ptiP>u_49z~ ztha?NSP8Zal~dSS3T1PPf%wLDUP^SE=GpuH-324OetQ4zmv7&sB+vi4F7P}Fvn9rn zvS-E6wg}*^N5^oFgxsXe)jNo-tW9%?pjh_tb(F{GB0DcAV(TKM zC+gKD3V)2=I%;>8QBF<(+g1>~!bvLmnu2F_W4#Nrc{cJEQ`l(;VZ^gexsHR;15@FKI# zHvvU;>n}!S4V#V;VFF+EckYzE##-poR7sYIO_gK;gGyOqeOOeUPk(TnLelK0?= z7}4=dEsr#&d!atDiH3ZoW6syk!4=KBihPoOU8)P~hl<8L+)^0nE^W*VUY>J2KNU4L z#ho&R>p1)cV#?9AdNbQt;}E}ke=G0DQ*ye=*J8dF+}znIHcZ*aEv>JLc$J7CrU!Eo^4NEwqmrgG93Z!XZS}NX6I3In>~R=o-YU7T0V^NG-{Bu38<<_xEF1z3SVxY4NV~ zqAHr&uK?A5=$F|Lghh5~4!K?*HfMc%X$O~`4Q`a6%j`PUpqK||Vq8B@$Z*8BI{Mv? zMpB}qNV|Sjd?1DR)Jl&Kc&hIV+utQ8^91bX+}ug6AyiZh$Ly=KHl8Ru;K~u8VNdL-DFB+l1LF6BBBsWv#8dx@tS5Lr33icUXVB+tui%(O!)hy)qSv z=#$m)2Ui(0Y9l1AA`ROOc}S;}Gfio$Mh@=$RF71wN{Li^jg7H4cPjM{jh4SVer)Vq z!oJey;;9pnG{ew}qqHy+uzJ>fY8?F-Y9uEb;=4JHMbxViIg^dVTUKsx>D{*d!Qwv@ z?g?goic}=K5|umPVWT3*xUB0QL#tu;a1~d9wG6Yb_Rio^R0`yTtpED>JtF3ycEc#U zEhmvPzTip=HIbk4^v_?z8PRiuM$^g)cNteIi1qp)Ye&T%dHeZk;YEpYzhva6UHAp2 zQ2>N3a=^e5m=jX1sEqsz^_7v7_}e-TBQH<8%Y^*n_a~O6OBgMzC%2lO@Ri)eTK3E( z*4NpcQ&ve|+MuO>cpLKRT;d8rZEfEwDnBCK9gZ;Kf9~byH_7iHeGS&%--YO?Lp;-B zaRSuU)jus82g>X$r7Uf^!ZuJL13?H(3>TWLDx{5AkSFPAo@a06`zFRng4(9S$Vg)N zof{{+_=Sg`-`vf=eXXGP$>7TB?32m z+L?{j3l=WFx3{fkDKPII5CtW4_>=c#0#By)}Joeuv?MNPe2 zRPZ6p(B%@XBBf44USPyWDJO;tW`%sj=COt+@F2p745K$;yT2)ze_IpX}*`9wLMV z(@sI0Whz%`?A(jI#F=;^CMzK3X`koq$t@-S1*ji#o28D3?I|_Tc6Qb_vJM?*vcDVk zEO@UIy{v64w$a?zrx6z=q{nOO&?`|bTOZ7MUuo-f*IprTQtg;cDI}=TfeY!*N&QgVm_jjCh7K%dgQDW6d z1~?a)(AT;UReU$)-ThtS-A_|i(4`Lro(wiI9V@pO{-Kdh*qo28AZ76L^IP{3JkVB? zWJRr}8SfH($kfL%^Aa|Of4?RB7z2^=^~juZP4|z)*f(3vHi^hN)FeIXL-T_r#X$DJ3Tg12DAC)tc$iOE~< zhQNy&8?-szi({cCOg5&LqsP4xVaChOa7W$-RU*a2U8ys7Zy1$huMRXu#gVm>p?vsw zA6iclulNp?kM)#p)GB&cBx)c@fGE38$+Uza8X#w?+6_%qBbJ6*PAAwq>w z=y~FT>GcPE3iz|n5ezNsTf$+vH=79rd0)6tWxnM9GkkY-CML0GzmIK@MU}GDai42>Hi$Je+3TK1KBe}>=7|$EpWR@_88KBMXhX+iphuq zZqogJ(nPSThVDS?bNuQ=sDo!u;QkU)u8b&Q;>6f6l43ML_*Ij$t`CCI-PhNrBOZx zr7Z}Bpg}%ijfAv*P^8ecessXL$ilM26kxlR??i&~IepU0LZcgO%)XFk=k!8)UK9Cq zjkOPgIm{t?^&u5i;zF_!D0ye)vZcZvA^xmCVvwZ=P^W*_oMq}`K-@fwGy^IIfPDkv zWLe)ZPq&hc2y`Ee9-xxC0*T5DWn!et%AkGpca!nIb=1%0WK{{jBcQ&F&%8h!)qH(; zo}B=bNUMHvZ&u4?iYHL5a1|m;J=RAT7g$* zDNV3tXJ5n8={1?a!)4tUdlh0~zS(c;&{O)lUtqvK4@8-R#xi$4i5mAD}v|W9? z8|dn)%~zJN>U?GXRq&8};z3`a9&}Hg6%Dd>ZZYYtX1j0e$4IRBm>PqT?vXSJl<-As zB1~#$OzneV`A{4AQZc!jDou6Q@`2&7-IoELRk{z_QPBx53T)ugS9MKZxIb1-$IDtG z)9#)=8+a6BZQF1{$|4GS{bcHb3WTW;a1Ayu#usc)IsQRU8UQ_6zBTmzIf5O!*`D0b zcuoEG`Q2wh?k);qzTX)?ptL>EAz<=qvs<2@f?oi1;|@xEQ}I|&Zz3?>XXlH2JZe)} zqKg;}`Bo=dM0fcdeA&EtnS_xAI0rIxWhl@{xSJ5TPjm{|?QQDPFz1Od8m)_ZkzchSpo3@6DkT zYBoXg9lY<{z9vt}p_Aho-_c#$hfq|Ufd-L9+9<*|d`w-caBEdpVD@Jc`^N7K&X^XM z^9v;xqUH^G5SQ587$k$v<77ix(F6m2m?P-;`C86808UV z%_bvWP1cAOnxA#FwQMD&FU%~xBIJ%*o*6-Y#)I(bE_Ig}oGE=$c29FtjkQjob}6jl zHf!xdI7*J{B7~E0w1{5>IYilsqO`qfoAi+(s~~AJ#tdCgclui>Wg8F;Mh;a_AnZ#T zbMOl)`ApjiNBNdxF103QmOZT(bNPC$li#x;AN#34*;wFYF=c0SK@N!B~9MGcZk0c zFfTB9f)qQBXkVf%BhjCJ3(%!H@gU9mfyZsXwkmgRQ+bq#(y9Y{iL%W)3jyY8F>-W) z@U;MCkpPpOufdkQp6tWlLHG-FU6Mc$x4yr69fMeh+9>qr#~W-VEbVNxj5RuCa=n~H z%|~FFyK#uKp~20bwmjQv!<@lhsD%RgPNiqS*f&Bq-cq?paFD7|{soTTRSbLz19-7Q z9-^}M5yp_=naPa+%JY_LJC!^_^@d;OTNl)*P~zCA7#TdXhn#_8SiM9ju2mY2Hgxu_ z77AqG6ZMqp$vdO;5|H3@-GhtCx_EolY)R+Vv4;N4lcCra>=DFJTHZT0*&xb;BTnfv zskSuAEg|78(KT}JuIBz2g*ksP>@5UlnWLl%QdfDPCx&+KUKTp2-Y~ckfm$k&(1D8# zY~^FGC@T48kVjod&AG>D%Q6I6dabX}joseTl*6{n8~?$B;>mIo1_@c#4|W4aC!!co zqW*Y0yL1JHGPPpLZO{$fUB@{!nLlsR2D659t`BUo(x$KtwFy1ujsv3Yn=(tQ&<*Dn zU(+MbxTk;QO>k5i?il8v$&}?=={drKGW&E)T$mWTM&{xIk$zmVkFFS3)T{qkS|45; zx;q+>C#U3_UERy`=ky4y9z8K(wfeG~wr)Al6kN-fp?gWl>{Wqdsf2TOD%|Egf z5Gv?c(%l8<##MckR`VwXvLq+gSkkSDdNcdpzDAwO`@xfB7<$18WpYa6;d&Z)glm7M zA{t}^!zxatHO-EkF{{7#?W_M>oy5%wcO)))3c6vRDt%?$r~J9&jV}$26&r@}WlW5l zazB#x|0*82gafbC2c;f^f8vq2UB^w>=z9BtVn^qe(5sLTDvC)&jh9g2(KVAu>G@(J zazgT%56cn#gq^Y!!md`^Q&lzY>R)O;`~6n)`B#NtR@8{_0 z=RHQD&6El2b&TH2z;SW@566WST|r*GCq9^J-P`N5$5h^;rT=^-`<`i$htpN2vuE5n z)^|Hf-1}zF&WuG(k+<%=F}H0yTymVL`Pbe3l1T&v5;eJPl;V6bKa=b7QW~DGb5XkGpO91Lv%d!ifAfN!fef+y9w?@!gb+{A>0FxufqUOj=gH zcB?+?A2WYM#U1MFUf;zpEL3|W^>%sspy167OW8|&-AnRx2X4o;uYYCs=vRoR*_(MF zL60G4FtO=W397kwm}+a;DaW|y6lUgZw+TjEr}lk6^q9qqb4jK8NnSMITlHBfqd59J zA#V_;rRsTCu=-z@M*0`y=%5;VK%VRa86~cuwYYTUbMJWAVe3%4yp<<5jzdq^pYd zk6*TVhAq0QwVa>%Eru>>Jb0^`t6Ne?{g7<#L!;5iR=D4flJ4(D@vmx^OmQOBf%0pun-cAp4FdUI5)FU05@q4oZSC_-lTWe!J}*clH_hB`*QiE_;^ndv$PI-x|v$k zQOGgx!MUNWbg%vUjj3E8?B+MkddAA%VtP>@|E4T<<$jWk?^`NgzR!ow|6vRbFc;(R zwb51iGZ~W(ADPKIwd#CaxV3tCb1YxRYEFZ(LQxL8-&b{Pxjdb6m*TIu`bWfRMJRZ= z`Yln>xo_hkE?2F0wb(Xs70zoiJa()TTUL~&h+$q(<0=uk#$*sG$YO76ToH6>>cElk zzi1Mjj9}~OUzuF=+T%)?aO;_!pLNpd3rytNvJcdc=&Tb}rgF7G?NXH7FzU99D@$RP z27ZVq{44E>z&U2G%gsTC6MDLMQCCy(WUp}+Y8rRm9L!64_IhpiTjMAu`G0Jck9no# z`4x|-@0B=#w#@$_wzB~U0hJk}2fKNT%iUpB5z@c(#J{Ry9ITvnt$zAe=!P;*pyhwA z9)noQ-trcCtzC&q7XS4v|M%nnL(4xz_&?0r|6%NRjKK`i4= +[theme] +inherit = sphinx_rtd_theme +stylesheet = css/cyclops.css +pygments_style = default + +[options] +style_nav_header_background = #efeeed +logo = True +logo_link = https://vectorinstitute.github.io/cyclops/ +subproject = True diff --git a/docs/source/tutorials.rst b/docs/source/tutorials.rst new file mode 100644 index 0000000..9eb574e --- /dev/null +++ b/docs/source/tutorials.rst @@ -0,0 +1,6 @@ +Tutorials +========= + +.. toctree:: + + tutorials_query diff --git a/docs/source/tutorials/eicu.ipynb b/docs/source/tutorials/eicu.ipynb new file mode 100644 index 0000000..e0874e7 --- /dev/null +++ b/docs/source/tutorials/eicu.ipynb @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "28288104-b8ce-43fa-a22b-8f02239551a5", + "metadata": {}, + "source": [ + "# eICU-CRD tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "74b155b9-9ba6-455c-b987-4c261c339364", + "metadata": {}, + "source": [ + "This notebook shows examples of how to use the cyclops-query tool on [eicu-CRD](https://eicu-crd.mit.edu/).\n", + "\n", + "Each query is limit to 100 rows (for quick results).\n", + "\n", + "* First, setup the eICU database according to the instructions in [eicu-code](https://github.com/MIT-LCP/eicu-code/tree/master/build-db/postgres).\n", + "* The database is assumed to be hosted using postgres. Update the config parameters such as username and password, passed to `EICUQuerier` accordingly." + ] + }, + { + "cell_type": "markdown", + "id": "0c7c1635-3a70-42d1-99a6-c7f7a9cf9d21", + "metadata": {}, + "source": [ + "## Imports and instantiate `EICUQuerier`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75a140e0-fb27-4319-862f-be54397abe5c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\"\"\"eICU-CRD tutorial.\"\"\"\n", + "\n", + "import cycquery.ops as qo\n", + "from cycquery import EICUQuerier\n", + "\n", + "\n", + "querier = EICUQuerier(\n", + " dbms=\"postgresql\",\n", + " port=5432,\n", + " host=\"localhost\",\n", + " database=\"eicu\",\n", + " user=\"postgres\",\n", + " password=\"pwd\",\n", + ")\n", + "# List all tables.\n", + "querier.list_tables(\"eicu_crd\")" + ] + }, + { + "cell_type": "markdown", + "id": "ea04cc11-e947-4097-91df-729f28b3732c", + "metadata": {}, + "source": [ + "## Example 1. Get all female patients discharged in 2014 (limit to 100 rows)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1efa964-8978-4a0e-9892-5ea4ce9953a3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ops = qo.Sequential(\n", + " qo.ConditionEquals(\"hospitaldischargeyear\", 2014),\n", + " qo.ConditionEquals(\"gender\", \"Female\"),\n", + ")\n", + "patients = querier.eicu_crd.patient()\n", + "patients = patients.ops(ops).run(limit=100)\n", + "print(f\"{len(patients)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "cd43679b-3d33-4135-b97c-373447289a9c", + "metadata": { + "tags": [] + }, + "source": [ + "## Example 2. Get all patient encounters with diagnoses (`schizophrenia` in `diagnosisstring`), discharged in the year 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7ab5fa3-e26b-47a7-818f-1bf367a55760", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "patients = querier.eicu_crd.patient()\n", + "diagnoses = querier.eicu_crd.diagnosis()\n", + "diagnoses = diagnoses.ops(qo.ConditionSubstring(\"diagnosisstring\", \"schizophrenia\"))\n", + "patient_diagnoses = patients.join(\n", + " join_table=diagnoses,\n", + " on=\"patientunitstayid\",\n", + ")\n", + "patient_diagnoses = patient_diagnoses.run(limit=100)\n", + "print(f\"{len(patient_diagnoses)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "241f7d10-9e04-44ae-b325-87f5a4046df2", + "metadata": {}, + "source": [ + "## Example 3. Get potassium lab tests for patients discharged in the year 2014, for all teaching hospitals." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24043abc-1878-4e00-8229-36d4a0368b98", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "hospitals = querier.eicu_crd.hospital()\n", + "hospitals = hospitals.ops(qo.ConditionEquals(\"teachingstatus\", True))\n", + "patients = querier.eicu_crd.patient()\n", + "patients = patients.ops(qo.ConditionEquals(\"hospitaldischargeyear\", 2015))\n", + "patients = patients.join(\n", + " join_table=hospitals,\n", + " on=\"hospitalid\",\n", + ")\n", + "labs = querier.eicu_crd.lab()\n", + "labs = labs.ops(qo.ConditionEquals(\"labname\", \"potassium\"))\n", + "patient_labs = patients.join(\n", + " join_table=labs,\n", + " on=\"patientunitstayid\",\n", + ").run(limit=100)\n", + "print(f\"{len(patient_labs)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "2dbf0fdc-8d99-4fde-ab3e-7c8a67b72f8b", + "metadata": {}, + "source": [ + "## Example 4. Get glucose medications (substring search) for female patients discharged in 2014." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6142f27-e8d1-453c-bfe2-2265d9ff1914", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ops = qo.Sequential(\n", + " qo.ConditionEquals(\"hospitaldischargeyear\", 2014),\n", + " qo.ConditionEquals(\"gender\", \"Female\"),\n", + ")\n", + "patients = querier.eicu_crd.patient()\n", + "patients = patients.ops(ops)\n", + "medications = querier.eicu_crd.medication()\n", + "medications = medications.ops(qo.ConditionSubstring(\"drugname\", \"glucose\"))\n", + "patient_medications = patients.join(\n", + " join_table=medications,\n", + " on=\"patientunitstayid\",\n", + ").run(limit=100)\n", + "print(f\"{len(patient_medications)} rows extracted!\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/gemini.ipynb b/docs/source/tutorials/gemini.ipynb new file mode 100644 index 0000000..53797d6 --- /dev/null +++ b/docs/source/tutorials/gemini.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6b8f5515-0d77-4989-8e08-33872eafb790", + "metadata": {}, + "source": [ + "# GEMINI tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "57e3214e-f1d5-46cb-bb2a-514a48e0269d", + "metadata": {}, + "source": [ + "This notebook shows examples of how to use the cyclops-query tool on [GEMINI](https://www.geminimedicine.ca/)." + ] + }, + { + "cell_type": "markdown", + "id": "633e60f1-d4cc-4d4a-87de-db14c4152ac6", + "metadata": {}, + "source": [ + "## Imports and instantiate `GEMINIQuerier`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "00c4a25b-1f3d-4613-b20f-469e7b1043b7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-21 09:17:45,449 \u001b[1;37mINFO\u001b[0m cyclops.query.orm - Database setup, ready to run queries!\n" + ] + }, + { + "data": { + "text/plain": [ + "['public.lookup_icd10_ca_description',\n", + " 'public.lookup_statcan',\n", + " 'public.lookup_cci',\n", + " 'public.lookup_icd10_ca_to_ccsr',\n", + " 'public.lookup_ip_administrative',\n", + " 'public.lookup_lab_concept',\n", + " 'public.lookup_vitals_concept',\n", + " 'public.lookup_pharmacy_concept',\n", + " 'public.lookup_diagnosis',\n", + " 'public.locality_variables',\n", + " 'public.admdad',\n", + " 'public.derived_variables',\n", + " 'public.ipscu',\n", + " 'public.lookup_phy_characteristics',\n", + " 'public.lab',\n", + " 'public.ipintervention',\n", + " 'public.lookup_ccsr',\n", + " 'public.lookup_pharmacy_route',\n", + " 'public.lookup_transfusion_concept',\n", + " 'public.lookup_ip_scu',\n", + " 'public.lookup_er_administrative',\n", + " 'public.lookup_imaging',\n", + " 'public.pharmacy',\n", + " 'public.radiology',\n", + " 'public.lookup_transfer',\n", + " 'public.ipdiagnosis',\n", + " 'public.lookup_room_transfer',\n", + " 'public.er',\n", + " 'public.erdiagnosis',\n", + " 'public.erintervention',\n", + " 'public.roomtransfer',\n", + " 'public.transfusion',\n", + " 'public.vitals',\n", + " 'public.lookup_hospital_num']" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"GEMINI tutorial.\"\"\"\n", + "\n", + "import cycquery.ops as qo\n", + "from cycquery import GEMINIQuerier\n", + "\n", + "\n", + "querier = GEMINIQuerier(\n", + " host=\"db.gemini-hpc.ca\",\n", + " database=\"delirium_v4_0_1\",\n", + " user=\"username\",\n", + " password=\"password\",\n", + ")\n", + "# List all tables.\n", + "querier.list_tables(\"public\")" + ] + }, + { + "cell_type": "markdown", + "id": "7980e403-1f99-4886-8856-d6d6b11ec15d", + "metadata": {}, + "source": [ + "## Example 1a. Create a table with only one hospitalization per patient, keeping the most recent encounter for each patient. Sort the dataset by `patient_id_hashed` and `discharge_date_time`, and then keep the recent record." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f3e9b5f-3156-4414-a296-1e45bde9d147", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-21 09:17:51,902 \u001b[1;37mINFO\u001b[0m cyclops.query.orm - Query returned successfully!\n", + "2023-09-21 09:17:51,903 \u001b[1;37mINFO\u001b[0m cyclops.utils.profile - Finished executing function run_query in 6.093352 s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "189734 rows extracted!\n" + ] + } + ], + "source": [ + "ops = qo.Sequential(\n", + " qo.OrderBy(\n", + " [\"patient_id_hashed\", \"discharge_date_time\"],\n", + " ascending=[True, False],\n", + " ),\n", + " qo.Distinct(\"patient_id_hashed\"),\n", + ")\n", + "encounters = querier.public.admdad()\n", + "encounters = encounters.ops(ops).run()\n", + "print(f\"{len(encounters)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "9040fd47-79b7-4d1d-9ca4-2ea09efea267", + "metadata": {}, + "source": [ + "## Example 1b. From the above set of encounters, take a subset of patients who were discharged between April 1, 2015 and March 31, 2016." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "105c0824-b735-4f6b-a008-7ddf8279eb20", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-21 09:17:52,591 \u001b[1;37mINFO\u001b[0m cyclops.query.orm - Query returned successfully!\n", + "2023-09-21 09:17:52,592 \u001b[1;37mINFO\u001b[0m cyclops.utils.profile - Finished executing function run_query in 0.675141 s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "32567 rows extracted!\n" + ] + } + ], + "source": [ + "ops = qo.Sequential(\n", + " qo.Cast(\"discharge_date_time\", \"timestamp\"),\n", + " qo.ConditionAfterDate(\"discharge_date_time\", \"2015-04-01\"),\n", + " qo.ConditionBeforeDate(\"discharge_date_time\", \"2016-03-31\"),\n", + ")\n", + "encounters_query = querier.public.admdad()\n", + "encounters_query = encounters_query.ops(ops)\n", + "encounters = encounters_query.run()\n", + "print(f\"{len(encounters)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "f4d8b0bc-4fe1-4b07-86ad-ce1032708d78", + "metadata": {}, + "source": [ + "## Example 1c. From the above set of encounters, get the total number of admissions for each hospital." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "65d92139-c1d5-45ce-908f-9052c9131ed3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-21 09:17:52,856 \u001b[1;37mINFO\u001b[0m cyclops.query.orm - Query returned successfully!\n", + "2023-09-21 09:17:52,857 \u001b[1;37mINFO\u001b[0m cyclops.utils.profile - Finished executing function run_query in 0.145693 s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7 rows extracted!\n" + ] + } + ], + "source": [ + "ops = qo.GroupByAggregate(\"hospital_num\", {\"hospital_num\": (\"count\", \"count\")})\n", + "encounters_per_site = encounters_query.ops(ops).run()\n", + "print(f\"{len(encounters_per_site)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "848c5b90-1e66-4a5a-9ebb-9c0caa105c3f", + "metadata": {}, + "source": [ + "## Example 2a. How many sodium tests were placed between Apr 1, 2015 and May 31, 2015 at hospital 101?" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "33bd3450-985f-4cc5-9da9-09846ad297e7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-21 09:26:19,814 \u001b[1;37mINFO\u001b[0m cyclops.query.orm - Query returned successfully!\n", + "2023-09-21 09:26:19,815 \u001b[1;37mINFO\u001b[0m cyclops.utils.profile - Finished executing function run_query in 506.939296 s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 rows extracted!\n", + " hospital_num count\n", + "0 101 9305\n" + ] + } + ], + "source": [ + "encounters = querier.public.admdad()\n", + "encounters = encounters.ops(qo.ConditionEquals(\"hospital_num\", 101))\n", + "lab_ops = qo.Sequential(\n", + " qo.DropEmpty(\"collection_date_time\"),\n", + " qo.Cast(\"collection_date_time\", \"timestamp\"),\n", + " qo.ConditionAfterDate(\"collection_date_time\", \"2015-04-01\"),\n", + " qo.ConditionBeforeDate(\"collection_date_time\", \"2015-05-31\"),\n", + " qo.ConditionSubstring(\"test_type_mapped\", \"sodium\"),\n", + ")\n", + "labs = querier.public.lab()\n", + "labs = labs.ops(lab_ops)\n", + "encounters_labs = encounters.join(labs, on=\"genc_id\")\n", + "encounters_labs = encounters_labs.ops(\n", + " qo.GroupByAggregate(\"hospital_num\", {\"hospital_num\": (\"count\", \"count\")}),\n", + ")\n", + "sodium_tests = encounters_labs.run()\n", + "print(f\"{len(sodium_tests)} rows extracted!\")\n", + "print(sodium_tests)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/mimiciii.ipynb b/docs/source/tutorials/mimiciii.ipynb new file mode 100644 index 0000000..b935b26 --- /dev/null +++ b/docs/source/tutorials/mimiciii.ipynb @@ -0,0 +1,197 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "28288104-b8ce-43fa-a22b-8f02239551a5", + "metadata": {}, + "source": [ + "# MIMIC-III tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "74b155b9-9ba6-455c-b987-4c261c339364", + "metadata": {}, + "source": [ + "This notebook shows examples of how to use the cyclops-query tool on [MIMIC-III v1.4](https://physionet.org/content/mimiciii/1.4/).\n", + "\n", + "Each query is limit to 100 rows (for quick results).\n", + "\n", + "* First, setup the MIMIC-III database according to the instructions in [mimic-code](https://github.com/MIT-LCP/mimic-code/tree/main/mimic-iii/buildmimic/postgres).\n", + "* The database is assumed to be hosted using postgres. Update the config parameters such as username and password, passed to `MIMICIIIQuerier` accordingly." + ] + }, + { + "cell_type": "markdown", + "id": "0c7c1635-3a70-42d1-99a6-c7f7a9cf9d21", + "metadata": {}, + "source": [ + "## Imports and instantiate `MIMICIIIQuerier`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75a140e0-fb27-4319-862f-be54397abe5c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\"\"\"MIMICIII tutorial.\"\"\"\n", + "\n", + "import cycquery.ops as qo\n", + "from cycquery import MIMICIIIQuerier\n", + "\n", + "\n", + "querier = MIMICIIIQuerier(\n", + " dbms=\"postgresql\",\n", + " port=5432,\n", + " host=\"localhost\",\n", + " database=\"mimiciii\",\n", + " user=\"postgres\",\n", + " password=\"pwd\",\n", + ")\n", + "# List all custom table methods.\n", + "querier.list_custom_tables()" + ] + }, + { + "cell_type": "markdown", + "id": "ea04cc11-e947-4097-91df-729f28b3732c", + "metadata": {}, + "source": [ + "## Example 1. Get all male patients with a mortality outcome." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1efa964-8978-4a0e-9892-5ea4ce9953a3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ops = qo.Sequential(\n", + " qo.ConditionEquals(\"expire_flag\", 1),\n", + " qo.ConditionEquals(\"gender\", \"M\"),\n", + ")\n", + "patients = querier.mimiciii.patients()\n", + "patients = patients.ops(ops).run(limit=100)\n", + "print(f\"{len(patients)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "cd43679b-3d33-4135-b97c-373447289a9c", + "metadata": { + "tags": [] + }, + "source": [ + "## Example 2. Get all female patient encounters with diagnoses (`gastroenteritis` in ICD-9 long title)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7ab5fa3-e26b-47a7-818f-1bf367a55760", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "patients = querier.mimiciii.patients()\n", + "patients = patients.ops(qo.ConditionEquals(\"gender\", \"F\"))\n", + "admissions = querier.mimiciii.admissions()\n", + "patient_admissions = patients.join(\n", + " join_table=admissions,\n", + " on=\"subject_id\",\n", + ")\n", + "diagnoses = querier.diagnoses()\n", + "diagnoses = diagnoses.ops(qo.ConditionSubstring(\"long_title\", \"gastroenteritis\"))\n", + "patient_admissions_diagnoses = patient_admissions.join(\n", + " join_table=diagnoses,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_diagnoses)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "241f7d10-9e04-44ae-b325-87f5a4046df2", + "metadata": {}, + "source": [ + "## Example 3. Get potassium lab tests for female patients." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24043abc-1878-4e00-8229-36d4a0368b98", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "patients = querier.mimiciii.patients()\n", + "patients = patients.ops(qo.ConditionEquals(\"gender\", \"F\"))\n", + "labs = querier.labevents()\n", + "labs = labs.ops(qo.ConditionEquals(\"label\", \"potassium\"))\n", + "patient_labs = patients.join(labs, on=\"subject_id\").run(limit=100)\n", + "print(f\"{len(patient_labs)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "2dbf0fdc-8d99-4fde-ab3e-7c8a67b72f8b", + "metadata": {}, + "source": [ + "## Example 4. Get AaDO2 carevue chart events for male patients that have a `valuenum` of less than 20." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6142f27-e8d1-453c-bfe2-2265d9ff1914", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "chartevents_ops = qo.Sequential(\n", + " qo.ConditionEquals(\"dbsource\", \"carevue\"),\n", + " qo.ConditionEquals(\"label\", \"AaDO2\"),\n", + " qo.ConditionLessThan(\"valuenum\", 20),\n", + ")\n", + "patients = querier.mimiciii.patients()\n", + "patients = patients.ops(qo.ConditionEquals(\"gender\", \"M\"))\n", + "chart_events = querier.chartevents()\n", + "chart_events = chart_events.ops(chartevents_ops)\n", + "patient_chart_events = patients.join(chart_events, on=\"subject_id\").run(limit=100)\n", + "print(f\"{len(patient_chart_events)} rows extracted!\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/mimiciv.ipynb b/docs/source/tutorials/mimiciv.ipynb new file mode 100644 index 0000000..4a9048f --- /dev/null +++ b/docs/source/tutorials/mimiciv.ipynb @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e337389b-1cfe-4796-a846-b4e1ba5690d6", + "metadata": {}, + "source": [ + "# MIMIC-IV tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "1efffc64", + "metadata": {}, + "source": [ + "This notebook shows examples of how to use the cyclops-query tool on [MIMIC-IV v2.0](https://physionet.org/content/mimiciv/2.0/).\n", + "\n", + "Each query is limit to 100 rows (for quick results).\n", + "\n", + "* First, setup the MIMIC-IV database according to the instructions in [mimic-code](https://github.com/MIT-LCP/mimic-code/tree/main/mimic-iv/buildmimic/postgres).\n", + "* The database is assumed to be hosted using postgres. Update the config parameters such as username and password, passed to `MIMICIVQuerier` accordingly." + ] + }, + { + "cell_type": "markdown", + "id": "12c18656-7f16-4230-85d0-944563d6a13e", + "metadata": {}, + "source": [ + "## Imports and instantiate `MIMICIVQuerier`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53009e6b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\"\"\"MIMICIV tutorial.\"\"\"\n", + "\n", + "import cycquery.ops as qo\n", + "from cycquery import MIMICIVQuerier\n", + "\n", + "\n", + "querier = MIMICIVQuerier(\n", + " dbms=\"postgresql\",\n", + " port=5432,\n", + " host=\"localhost\",\n", + " database=\"mimiciv-2.0\",\n", + " user=\"postgres\",\n", + " password=\"pwd\",\n", + ")\n", + "# List all schemas.\n", + "querier.list_schemas()" + ] + }, + { + "cell_type": "markdown", + "id": "7b6214f8", + "metadata": { + "tags": [] + }, + "source": [ + "## Example 1. Get all patient admissions from 2021 or later (approx year of admission)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdfadaa4-6fd6-4fd7-85cf-e012aa0799e1", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionAfterDate(\"admittime\", \"2021-01-01\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops).run(limit=100)\n", + "print(f\"{len(patient_admissions)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "80d9f06e", + "metadata": {}, + "source": [ + "## Example 2. Get all patient encounters with diagnoses (`schizophrenia` in ICD-10 long title), in the year 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a89a9cf0", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2015\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "diagnoses = querier.diagnoses()\n", + "diagnoses_ops = qo.Sequential(\n", + " qo.ConditionEquals(\"icd_version\", 10),\n", + " qo.ConditionSubstring(\"long_title\", \"schizophrenia\"),\n", + ")\n", + "diagnoses = diagnoses.ops(diagnoses_ops)\n", + "patient_admissions_diagnoses = patient_admissions.join(\n", + " join_table=diagnoses,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_diagnoses)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2baea54", + "metadata": {}, + "source": [ + "## Example 3. Advanced - uses `ConditionRegexMatch` from `cyclops.query.ops`. Get all patient encounters with diagnoses (ICD-9 long title contains `schizophrenia` and `chronic` ), in the year 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03936cee", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2015\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "diagnoses = querier.diagnoses()\n", + "diagnoses_ops = qo.Sequential(\n", + " qo.ConditionEquals(\"icd_version\", 9),\n", + " qo.ConditionRegexMatch(\"long_title\", r\"(?=.*schizophrenia)(?=.*chronic)\"),\n", + ")\n", + "diagnoses = diagnoses.ops(diagnoses_ops)\n", + "patient_admissions_diagnoses = patient_admissions.join(\n", + " join_table=diagnoses,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_diagnoses)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "30b0d604", + "metadata": {}, + "source": [ + "## Example 4. Get routine vital signs for patients from year 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56a72377", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2015\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "chart_events = querier.chartevents()\n", + "vitals = chart_events.ops(qo.ConditionEquals(\"category\", \"Routine Vital Signs\"))\n", + "patient_admissions_vitals = patient_admissions.join(\n", + " join_table=vitals,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_vitals)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "621479f0", + "metadata": {}, + "source": [ + "## Example 5. Get hemoglobin lab tests for patients from year 2009." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bce11f81", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2009\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "chart_events = querier.chartevents()\n", + "labs = chart_events.ops(qo.ConditionEquals(\"label\", \"hemoglobin\"))\n", + "patient_admissions_labs = patient_admissions.join(\n", + " join_table=labs,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_labs)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "b0a9bc12-dda3-4445-9156-52d295a1c48f", + "metadata": {}, + "source": [ + "## Example 6. Get radiology reports and filter on keywords `lymphadenopathy` and `infectious` occurring together from year 2009." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f00d270c-d78f-4dc0-8dae-ff4d52958c8b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2009\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "radiology_notes = querier.mimiciv_note.radiology()\n", + "radiology_notes_ops = qo.Sequential(\n", + " qo.And(\n", + " qo.ConditionLike(\"text\", \"% lymphadenopathy %\"),\n", + " qo.ConditionLike(\"text\", \"% infectious %\"),\n", + " ),\n", + ")\n", + "radiology_notes = radiology_notes.ops(radiology_notes_ops)\n", + "patient_admissions_radiology_notes = patient_admissions.join(\n", + " join_table=radiology_notes,\n", + " on=[\"subject_id\", \"hadm_id\"],\n", + ").run(limit=100)\n", + "print(f\"{len(patient_admissions_radiology_notes)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "9550ba62-c128-4259-a075-0cbd9c70b662", + "metadata": {}, + "source": [ + "## Example 7. Get all female patient encounters from year 2015, and return as dask dataframe (lazy evaluation) with 4 partitions (batches) aggregated based on `subject_id`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28683d70-376e-4d9b-883d-1a7de634e455", + "metadata": {}, + "outputs": [], + "source": [ + "patients = querier.patients()\n", + "admissions = querier.mimiciv_hosp.admissions()\n", + "patient_admissions = patients.join(admissions, on=\"subject_id\")\n", + "ops = qo.Sequential(\n", + " qo.AddDeltaColumn([\"admittime\", \"dischtime\"], years=\"anchor_year_difference\"),\n", + " qo.ConditionInYears(\"admittime\", \"2015\"),\n", + " qo.Cast(\"gender\", \"str\"),\n", + " qo.ConditionEquals(\"gender\", \"F\"),\n", + ")\n", + "patient_admissions = patient_admissions.ops(ops)\n", + "patient_admissions = patient_admissions.run(\n", + " backend=\"dask\",\n", + " index_col=\"subject_id\",\n", + " n_partitions=4,\n", + ")\n", + "print(f\"{len(patient_admissions)} rows extracted!\")\n", + "print(f\"Return type: {type(patient_admissions)}\")\n", + "print(f\"Number of partitions: {patient_admissions.npartitions}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e1ed2708", + "metadata": {}, + "source": [ + "## Example 8. Running a raw SQL string." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a853deec", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data = querier.db.run_query(\"SELECT * FROM mimiciv_hosp.admissions LIMIT 100\")\n", + "print(f\"{len(data)} rows extracted!\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/omop.ipynb b/docs/source/tutorials/omop.ipynb new file mode 100644 index 0000000..16b7928 --- /dev/null +++ b/docs/source/tutorials/omop.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e337389b-1cfe-4796-a846-b4e1ba5690d6", + "metadata": {}, + "source": [ + "# OMOP tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "1efffc64", + "metadata": {}, + "source": [ + "This notebook shows examples of how to use the cyclops-query tool to query EHR databases that follow the OMOP common data model. Each query is limit to 100 rows (for quick results).\n", + "\n", + "We showcase the examples on:\n", + "\n", + "1. [Synthea](https://github.com/synthetichealth/synthea) in OMOP format.\n", + "\n", + " * First, generate synthea data using their releases. We used [v2.7.0](https://github.com/synthetichealth/synthea/releases/tag/v2.7.0) to generate data .\n", + " * Follow instructions provided in [ETL-Synthea](https://github.com/OHDSI/ETL-Synthea) to load the CSV data into a postgres database, and perform ETL to load the data into OMOP format." + ] + }, + { + "cell_type": "markdown", + "id": "12c18656-7f16-4230-85d0-944563d6a13e", + "metadata": {}, + "source": [ + "## Imports and instantiate `OMOPQuerier`." + ] + }, + { + "cell_type": "markdown", + "id": "c4cfec2d-af3f-431d-a851-c8853e31df08", + "metadata": {}, + "source": [ + "Pass in the `schema_name` which is the name of the postgres schema which houses all the OMOP tables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53009e6b", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"OMOP tutorial.\"\"\"\n", + "\n", + "import pandas as pd\n", + "\n", + "import cycquery.ops as qo\n", + "from cycquery import OMOPQuerier\n", + "\n", + "\n", + "querier = OMOPQuerier(\n", + " dbms=\"postgresql\",\n", + " port=5432,\n", + " host=\"localhost\",\n", + " database=\"synthea_integration_test\",\n", + " user=\"postgres\",\n", + " password=\"pwd\",\n", + " schema_name=\"cdm_synthea10\",\n", + ")\n", + "# List all tables.\n", + "querier.list_tables(\"cdm_synthea10\")" + ] + }, + { + "cell_type": "markdown", + "id": "7b6214f8", + "metadata": { + "tags": [] + }, + "source": [ + "## Example 1. Get all patient visits in or after 2010." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a3d9cb9-fe40-45b8-ba2f-8de52a3b7f4f", + "metadata": {}, + "outputs": [], + "source": [ + "visits = querier.visit_occurrence()\n", + "visits = visits.ops(qo.ConditionAfterDate(\"visit_start_date\", \"2010-01-01\"))\n", + "visits = visits.run(limit=100)\n", + "print(f\"{len(visits)} rows extracted!\")\n", + "pd.to_datetime(visits[\"visit_start_date\"]).dt.year.value_counts().sort_index()" + ] + }, + { + "cell_type": "markdown", + "id": "fcaea674-b967-4fbc-a7be-4d8b4492ef56", + "metadata": {}, + "source": [ + "## Example 2. Get measurements for all visits in or after 2020." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "030e2491-a7cc-42f3-a1ca-618212b3524c", + "metadata": {}, + "outputs": [], + "source": [ + "visits = querier.visit_occurrence()\n", + "visits = visits.ops(qo.ConditionAfterDate(\"visit_start_date\", \"2020-01-01\"))\n", + "measurements = querier.measurement()\n", + "visits_measurements = visits.join(\n", + " join_table=measurements,\n", + " on=\"visit_occurrence_id\",\n", + ").run(limit=100)\n", + "print(f\"{len(visits_measurements)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "602273d9-8d78-4e69-8566-7f9d04553d3a", + "metadata": { + "tags": [] + }, + "source": [ + "2. [MIMIC-III v1.4](https://physionet.org/content/mimiciii/1.4/) in OMOP format.\n", + "\n", + "* First, setup the MIMIC-III database according to the instructions in [mimic-code](https://github.com/MIT-LCP/mimic-code/tree/main/mimic-iii/buildmimic/postgres).\n", + "* Perform the ETL in the [mimic-omop](https://github.com/MIT-LCP/mimic-omop) repo.\n", + "* The database is assumed to be hosted using postgres. Update the config parameters such as username and password, passed to `MIMICIIIQuerier` accordingly." + ] + }, + { + "cell_type": "markdown", + "id": "10da36a2-28e2-4975-83c7-68d0d366e459", + "metadata": {}, + "source": [ + "## Imports and instantiate `OMOPQuerier`." + ] + }, + { + "cell_type": "markdown", + "id": "4a050fa9-442b-44dc-b241-86e73516e693", + "metadata": {}, + "source": [ + "Pass in the `schema_name` which is the name of the postgres schema which houses all the OMOP tables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0622b3df-2864-4f32-bd98-806019f59c50", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "querier = OMOPQuerier(\n", + " dbms=\"postgresql\",\n", + " port=5432,\n", + " host=\"localhost\",\n", + " database=\"mimiciii\",\n", + " user=\"postgres\",\n", + " password=\"pwd\",\n", + " schema_name=\"omop\",\n", + ")\n", + "# List all schemas.\n", + "querier.list_schemas()" + ] + }, + { + "cell_type": "markdown", + "id": "c4967160-bd45-4ce0-8b00-27f4f9742c68", + "metadata": {}, + "source": [ + "## Example 1. Get all patient visits that ended in a mortality outcome in or after 2010." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40ff2e83-75e4-4119-aa33-26f95e63ddaa", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "visits = querier.visit_occurrence()\n", + "visits = visits.ops(qo.ConditionAfterDate(\"visit_start_date\", \"2010-01-01\"))\n", + "visits_concept_mapped = querier.map_concept_ids_to_name(\n", + " visits,\n", + " [\n", + " \"discharge_to_concept_id\",\n", + " \"admitting_concept_id\",\n", + " ],\n", + ")\n", + "visits_concept_mapped_died = visits_concept_mapped.ops(\n", + " qo.ConditionSubstring(\"discharge_to_concept_name\", \"died\"),\n", + ").run()\n", + "print(f\"{len(visits_concept_mapped_died)} rows extracted!\")" + ] + }, + { + "cell_type": "markdown", + "id": "996ad6ff-8213-43ea-b701-e52a1d0b01bf", + "metadata": { + "tags": [] + }, + "source": [ + "## Example 2. Get all measurements for female patient visits with `sepsis` diagnoses, that ended in a mortality outcome." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46fd771c-5da7-4bce-aec7-08a5210a069b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "persons = querier.person()\n", + "persons = persons.ops(qo.ConditionSubstring(\"gender_concept_name\", \"FEMALE\"))\n", + "visits = querier.visit_occurrence()\n", + "person_visits = persons.join(visits, on=\"person_id\")\n", + "conditions = querier.omop.condition_occurrence()\n", + "person_visits_conditions = person_visits.join(\n", + " conditions,\n", + " on=\"visit_occurrence_id\",\n", + " isouter=True,\n", + ")\n", + "measurement = querier.measurement()\n", + "person_visits_conditions_measurements = person_visits_conditions.join(\n", + " measurement,\n", + " on=\"visit_occurrence_id\",\n", + " isouter=True,\n", + ")\n", + "person_visits_conditions_measurements = querier.map_concept_ids_to_name(\n", + " person_visits_conditions_measurements,\n", + " [\n", + " \"discharge_to_concept_id\",\n", + " \"admitting_concept_id\",\n", + " \"condition_concept_id\",\n", + " ],\n", + ")\n", + "ops = qo.Sequential(\n", + " qo.ConditionSubstring(\"discharge_to_concept_name\", \"died\"),\n", + " qo.ConditionSubstring(\"condition_concept_name\", \"sepsis\"),\n", + ")\n", + "cohort = person_visits_conditions_measurements.ops(ops).run(limit=100)\n", + "print(f\"{len(cohort)} rows extracted!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d20a2581-f613-4ab8-9feb-3e84b8835db1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cohort[\"measurement_concept_name\"].value_counts()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials_query.rst b/docs/source/tutorials_query.rst new file mode 100644 index 0000000..6f37e08 --- /dev/null +++ b/docs/source/tutorials_query.rst @@ -0,0 +1,16 @@ +query API +========= + +The query API allows you to query EHR databases. It is a Python API that +that communicates with postgresql databases. It is a wrapper around the +SQLAlchemy ORM and uses SQLAlchemy query objects and functions to build +queries. + + +.. toctree:: + + tutorials/mimiciii.ipynb + tutorials/mimiciv.ipynb + tutorials/eicu.ipynb + tutorials/omop.ipynb + tutorials/gemini.ipynb diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..260df71 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3055 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "anyascii" +version = "0.3.2" +description = "Unicode to ASCII transliteration" +optional = false +python-versions = ">=3.3" +files = [ + {file = "anyascii-0.3.2-py3-none-any.whl", hash = "sha256:3b3beef6fc43d9036d3b0529050b0c48bfad8bc960e9e562d7223cfb94fe45d4"}, + {file = "anyascii-0.3.2.tar.gz", hash = "sha256:9d5d32ef844fe225b8bc7cba7f950534fae4da27a9bf3a6bea2cb0ea46ce4730"}, +] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "astroid" +version = "3.0.1" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.0.1-py3-none-any.whl", hash = "sha256:7d5895c9825e18079c5aeac0572bc2e4c83205c95d416e0b4fee8bc361d2d9ca"}, + {file = "astroid-3.0.1.tar.gz", hash = "sha256:86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "asttokens" +version = "2.4.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, + {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "autopep8" +version = "2.0.4" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +optional = false +python-versions = ">=3.6" +files = [ + {file = "autopep8-2.0.4-py2.py3-none-any.whl", hash = "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb"}, + {file = "autopep8-2.0.4.tar.gz", hash = "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c"}, +] + +[package.dependencies] +pycodestyle = ">=2.10.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[[package]] +name = "babel" +version = "2.13.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.0-py3-none-any.whl", hash = "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec"}, + {file = "Babel-2.13.0.tar.gz", hash = "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blacken-docs" +version = "1.16.0" +description = "Run Black on Python code blocks in documentation files." +optional = false +python-versions = ">=3.8" +files = [ + {file = "blacken_docs-1.16.0-py3-none-any.whl", hash = "sha256:b0dcb84b28ebfb352a2539202d396f50e15a54211e204a8005798f1d1edb7df8"}, + {file = "blacken_docs-1.16.0.tar.gz", hash = "sha256:b4bdc3f3d73898dfbf0166f292c6ccfe343e65fc22ddef5319c95d1a8dcc6c1c"}, +] + +[package.dependencies] +black = ">=22.1.0" + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "codecov" +version = "2.1.13" +description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "codecov-2.1.13-py2.py3-none-any.whl", hash = "sha256:c2ca5e51bba9ebb43644c43d0690148a55086f7f5e6fd36170858fa4206744d5"}, + {file = "codecov-2.1.13.tar.gz", hash = "sha256:2362b685633caeaf45b9951a9b76ce359cd3581dd515b430c6c3f5dfb4d92a8c"}, +] + +[package.dependencies] +coverage = "*" +requests = ">=2.7.9" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.1.4" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + +[[package]] +name = "coverage" +version = "7.3.2" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "dask" +version = "2023.10.0" +description = "Parallel PyData with Task Scheduling" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dask-2023.10.0-py3-none-any.whl", hash = "sha256:cb133919ff6f1fc021efe1eef24df0e4acecf33a7708e7b04d2dea6b45e166bb"}, + {file = "dask-2023.10.0.tar.gz", hash = "sha256:3fdfdbdb5f9f3a556487bf37142e5a730dab2f2c8eca0b6c79d11199c30220e3"}, +] + +[package.dependencies] +click = ">=8.0" +cloudpickle = ">=1.5.0" +fsspec = ">=2021.09.0" +importlib-metadata = ">=4.13.0" +numpy = {version = ">=1.21", optional = true, markers = "extra == \"array\""} +packaging = ">=20.0" +pandas = {version = ">=1.3", optional = true, markers = "extra == \"dataframe\""} +partd = ">=1.2.0" +pyyaml = ">=5.3.1" +toolz = ">=0.10.0" + +[package.extras] +array = ["numpy (>=1.21)"] +complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)"] +dataframe = ["dask[array]", "pandas (>=1.3)"] +diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] +distributed = ["distributed (==2023.10.0)"] +test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] + +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "distlib" +version = "0.3.7" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] + +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = "*" +files = [ + {file = "executing-2.0.0-py2.py3-none-any.whl", hash = "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657"}, + {file = "executing-2.0.0.tar.gz", hash = "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.18.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.18.1-py3-none-any.whl", hash = "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8"}, + {file = "fastjsonschema-2.18.1.tar.gz", hash = "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.12.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] + +[[package]] +name = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" + +[[package]] +name = "fsspec" +version = "2023.9.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.9.2-py3-none-any.whl", hash = "sha256:603dbc52c75b84da501b9b2ec8c11e1f61c25984c4a0dda1f129ef391fbfc9b4"}, + {file = "fsspec-2023.9.2.tar.gz", hash = "sha256:80bfb8c70cc27b2178cc62a935ecf242fc6e8c3fb801f9c571fc01b1e715ba7d"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "greenlet" +version = "3.0.0" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, +] + +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] + +[[package]] +name = "identify" +version = "2.5.30" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.30-py2.py3-none-any.whl", hash = "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54"}, + {file = "identify-2.5.30.tar.gz", hash = "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.25.2" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.25.2-py3-none-any.whl", hash = "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77"}, + {file = "ipykernel-6.25.2.tar.gz", hash = "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.16.1" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.16.1-py3-none-any.whl", hash = "sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e"}, + {file = "ipython-8.16.1.tar.gz", hash = "sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "4.19.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, + {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] + +[package.dependencies] +referencing = ">=0.28.0" + +[[package]] +name = "jupyter-client" +version = "8.4.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.4.0-py3-none-any.whl", hash = "sha256:6a2a950ec23a8f62f9e4c66acec7f0ea6c7d1f80ba0992e747b10c56ce2e6dbe"}, + {file = "jupyter_client-8.4.0.tar.gz", hash = "sha256:dc1b857d5d7d76ac101766c6e9b646bf18742721126e72e5d484c75a993cada2"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.4.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.4.0-py3-none-any.whl", hash = "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571"}, + {file = "jupyter_core-5.4.0.tar.gz", hash = "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] + +[[package]] +name = "jupytext" +version = "1.15.2" +description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" +optional = false +python-versions = "~=3.6" +files = [ + {file = "jupytext-1.15.2-py3-none-any.whl", hash = "sha256:ef2a1a3eb8f63d84a3b3772014bdfbe238e4e12a30c4309b8c89e0a54adeb7d1"}, + {file = "jupytext-1.15.2.tar.gz", hash = "sha256:c9976e24d834e991906c1de55af4b6d512d764f6372aabae45fc1ea72b589173"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0" +mdit-py-plugins = "*" +nbformat = "*" +pyyaml = "*" +toml = "*" + +[package.extras] +rst2md = ["sphinx-gallery (>=0.7.0,<0.8.0)"] +toml = ["toml"] + +[[package]] +name = "locket" +version = "1.0.0" +description = "File-based locks for Python on Linux and Windows" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mypy" +version = "1.6.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e5012e5cc2ac628177eaac0e83d622b2dd499e28253d4107a08ecc59ede3fc2c"}, + {file = "mypy-1.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8fbb68711905f8912e5af474ca8b78d077447d8f3918997fecbf26943ff3cbb"}, + {file = "mypy-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a1ad938fee7d2d96ca666c77b7c494c3c5bd88dff792220e1afbebb2925b5e"}, + {file = "mypy-1.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b96ae2c1279d1065413965c607712006205a9ac541895004a1e0d4f281f2ff9f"}, + {file = "mypy-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:40b1844d2e8b232ed92e50a4bd11c48d2daa351f9deee6c194b83bf03e418b0c"}, + {file = "mypy-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81af8adaa5e3099469e7623436881eff6b3b06db5ef75e6f5b6d4871263547e5"}, + {file = "mypy-1.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8c223fa57cb154c7eab5156856c231c3f5eace1e0bed9b32a24696b7ba3c3245"}, + {file = "mypy-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8032e00ce71c3ceb93eeba63963b864bf635a18f6c0c12da6c13c450eedb183"}, + {file = "mypy-1.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c46b51de523817a0045b150ed11b56f9fff55f12b9edd0f3ed35b15a2809de0"}, + {file = "mypy-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:19f905bcfd9e167159b3d63ecd8cb5e696151c3e59a1742e79bc3bcb540c42c7"}, + {file = "mypy-1.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:82e469518d3e9a321912955cc702d418773a2fd1e91c651280a1bda10622f02f"}, + {file = "mypy-1.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4473c22cc296425bbbce7e9429588e76e05bc7342da359d6520b6427bf76660"}, + {file = "mypy-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a0d7d24dfb26729e0a068639a6ce3500e31d6655df8557156c51c1cb874ce7"}, + {file = "mypy-1.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cfd13d47b29ed3bbaafaff7d8b21e90d827631afda134836962011acb5904b71"}, + {file = "mypy-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:eb4f18589d196a4cbe5290b435d135dee96567e07c2b2d43b5c4621b6501531a"}, + {file = "mypy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41697773aa0bf53ff917aa077e2cde7aa50254f28750f9b88884acea38a16169"}, + {file = "mypy-1.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7274b0c57737bd3476d2229c6389b2ec9eefeb090bbaf77777e9d6b1b5a9d143"}, + {file = "mypy-1.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbaf4662e498c8c2e352da5f5bca5ab29d378895fa2d980630656178bd607c46"}, + {file = "mypy-1.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bb8ccb4724f7d8601938571bf3f24da0da791fe2db7be3d9e79849cb64e0ae85"}, + {file = "mypy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:68351911e85145f582b5aa6cd9ad666c8958bcae897a1bfda8f4940472463c45"}, + {file = "mypy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:49ae115da099dcc0922a7a895c1eec82c1518109ea5c162ed50e3b3594c71208"}, + {file = "mypy-1.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b27958f8c76bed8edaa63da0739d76e4e9ad4ed325c814f9b3851425582a3cd"}, + {file = "mypy-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:925cd6a3b7b55dfba252b7c4561892311c5358c6b5a601847015a1ad4eb7d332"}, + {file = "mypy-1.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8f57e6b6927a49550da3d122f0cb983d400f843a8a82e65b3b380d3d7259468f"}, + {file = "mypy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a43ef1c8ddfdb9575691720b6352761f3f53d85f1b57d7745701041053deff30"}, + {file = "mypy-1.6.1-py3-none-any.whl", hash = "sha256:4cbe68ef919c28ea561165206a2dcb68591c50f3bcf777932323bc208d949cf1"}, + {file = "mypy-1.6.1.tar.gz", hash = "sha256:4d01c00d09a0be62a4ca3f933e315455bde83f37f892ba4b08ce92f3cf44bcc1"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "myst-parser" +version = "2.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.8" +files = [ + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, +] + +[package.dependencies] +docutils = ">=0.16,<0.21" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" +pyyaml = "*" +sphinx = ">=6,<8" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] + +[[package]] +name = "nbclient" +version = "0.8.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, + {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.9.2" +description = "Converting Jupyter Notebooks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.9.2-py3-none-any.whl", hash = "sha256:39fe4b8bdd1b0104fdd86fc8a43a9077ba64c720bda4c6132690d917a0a154ee"}, + {file = "nbconvert-7.9.2.tar.gz", hash = "sha256:e56cc7588acc4f93e2bb5a34ec69028e4941797b2bfaf6462f18a41d1cc258c9"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest", "pytest-dependency"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.9.2" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nbqa" +version = "1.7.0" +description = "Run any standard Python code quality tool on a Jupyter Notebook" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbqa-1.7.0-py3-none-any.whl", hash = "sha256:42a79b0f57c3ef47b8b223dc8c265f499812f529dc5154688449e7bd05d76b7e"}, + {file = "nbqa-1.7.0.tar.gz", hash = "sha256:117112ad6d618ff13afc5ba41ca0ff21c23f084a6df7875fb04b7f2c01a136c4"}, +] + +[package.dependencies] +autopep8 = ">=1.5" +black = {version = "*", optional = true, markers = "extra == \"toolchain\""} +blacken-docs = {version = "*", optional = true, markers = "extra == \"toolchain\""} +flake8 = {version = "*", optional = true, markers = "extra == \"toolchain\""} +ipython = ">=7.8.0" +isort = {version = "*", optional = true, markers = "extra == \"toolchain\""} +jupytext = {version = "*", optional = true, markers = "extra == \"toolchain\""} +mypy = {version = "*", optional = true, markers = "extra == \"toolchain\""} +pylint = {version = "*", optional = true, markers = "extra == \"toolchain\""} +pyupgrade = {version = "*", optional = true, markers = "extra == \"toolchain\""} +ruff = {version = "*", optional = true, markers = "extra == \"toolchain\""} +tokenize-rt = ">=3.2.0" +tomli = "*" + +[package.extras] +toolchain = ["black", "blacken-docs", "flake8", "isort", "jupytext", "mypy", "pylint", "pyupgrade", "ruff"] + +[[package]] +name = "nbsphinx" +version = "0.8.12" +description = "Jupyter Notebook Tools for Sphinx" +optional = false +python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, + {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, +] + +[package.dependencies] +docutils = "*" +jinja2 = "*" +nbconvert = "!=5.4" +nbformat = "*" +sphinx = ">=1.8" +traitlets = ">=5" + +[[package]] +name = "nbstripout" +version = "0.6.1" +description = "Strips outputs from Jupyter and IPython notebooks" +optional = false +python-versions = ">=3.6" +files = [ + {file = "nbstripout-0.6.1-py2.py3-none-any.whl", hash = "sha256:5ff6eb0debbcd656c4a64db8e082a24fabcfc753a9e8c9f6d786971e8f29e110"}, + {file = "nbstripout-0.6.1.tar.gz", hash = "sha256:9065bcdd1488b386e4f3c081ffc1d48f4513a2f8d8bf4d0d9a28208c5dafe9d3"}, +] + +[package.dependencies] +nbformat = "*" + +[[package]] +name = "nest-asyncio" +version = "1.5.8" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.26.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, + {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, + {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, + {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, + {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, + {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, + {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, + {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, + {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, + {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, + {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, + {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, + {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, + {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, + {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, +] + +[[package]] +name = "numpydoc" +version = "1.6.0" +description = "Sphinx extension to support docstrings in Numpy format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpydoc-1.6.0-py3-none-any.whl", hash = "sha256:b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa"}, + {file = "numpydoc-1.6.0.tar.gz", hash = "sha256:ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d"}, +] + +[package.dependencies] +Jinja2 = ">=2.10" +sphinx = ">=5" +tabulate = ">=0.8.10" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +developer = ["pre-commit (>=3.3)", "tomli"] +doc = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pydata-sphinx-theme (>=0.13.3)", "sphinx (>=7)"] +test = ["matplotlib", "pytest", "pytest-cov"] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "partd" +version = "1.4.1" +description = "Appendable key-value storage" +optional = false +python-versions = ">=3.7" +files = [ + {file = "partd-1.4.1-py3-none-any.whl", hash = "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6"}, + {file = "partd-1.4.1.tar.gz", hash = "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67"}, +] + +[package.dependencies] +locket = "*" +toolz = "*" + +[package.extras] +complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pbr" +version = "5.11.1" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "platformdirs" +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "2.21.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, + {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.6" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "psycopg2" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pyarrow" +version = "11.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyarrow-11.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2"}, + {file = "pyarrow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c28b5f248e08dea3b3e0c828b91945f431f4202f1a9fe84d1012a761324e1ba"}, + {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37bc81f6c9435da3c9c1e767324ac3064ffbe110c4e460660c43e144be4ed85"}, + {file = "pyarrow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7c53def8dbbc810282ad308cc46a523ec81e653e60a91c609c2233ae407689"}, + {file = "pyarrow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:25aa11c443b934078bfd60ed63e4e2d42461682b5ac10f67275ea21e60e6042c"}, + {file = "pyarrow-11.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e217d001e6389b20a6759392a5ec49d670757af80101ee6b5f2c8ff0172e02ca"}, + {file = "pyarrow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad42bb24fc44c48f74f0d8c72a9af16ba9a01a2ccda5739a517aa860fa7e3d56"}, + {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d942c690ff24a08b07cb3df818f542a90e4d359381fbff71b8f2aea5bf58841"}, + {file = "pyarrow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f010ce497ca1b0f17a8243df3048055c0d18dcadbcc70895d5baf8921f753de5"}, + {file = "pyarrow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2f51dc7ca940fdf17893227edb46b6784d37522ce08d21afc56466898cb213b2"}, + {file = "pyarrow-11.0.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:1cbcfcbb0e74b4d94f0b7dde447b835a01bc1d16510edb8bb7d6224b9bf5bafc"}, + {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaee8f79d2a120bf3e032d6d64ad20b3af6f56241b0ffc38d201aebfee879d00"}, + {file = "pyarrow-11.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:410624da0708c37e6a27eba321a72f29d277091c8f8d23f72c92bada4092eb5e"}, + {file = "pyarrow-11.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2d53ba72917fdb71e3584ffc23ee4fcc487218f8ff29dd6df3a34c5c48fe8c06"}, + {file = "pyarrow-11.0.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34"}, + {file = "pyarrow-11.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:41a1451dd895c0b2964b83d91019e46f15b5564c7ecd5dcb812dadd3f05acc97"}, + {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc2344be80e5dce4e1b80b7c650d2fc2061b9eb339045035a1baa34d5b8f1c"}, + {file = "pyarrow-11.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f40be0d7381112a398b93c45a7e69f60261e7b0269cc324e9f739ce272f4f70"}, + {file = "pyarrow-11.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:362a7c881b32dc6b0eccf83411a97acba2774c10edcec715ccaab5ebf3bb0835"}, + {file = "pyarrow-11.0.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ccbf29a0dadfcdd97632b4f7cca20a966bb552853ba254e874c66934931b9841"}, + {file = "pyarrow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e99be85973592051e46412accea31828da324531a060bd4585046a74ba45854"}, + {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69309be84dcc36422574d19c7d3a30a7ea43804f12552356d1ab2a82a713c418"}, + {file = "pyarrow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da93340fbf6f4e2a62815064383605b7ffa3e9eeb320ec839995b1660d69f89b"}, + {file = "pyarrow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:caad867121f182d0d3e1a0d36f197df604655d0b466f1bc9bafa903aa95083e4"}, + {file = "pyarrow-11.0.0.tar.gz", hash = "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[[package]] +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pylint" +version = "3.0.1" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.0.1-py3-none-any.whl", hash = "sha256:9c90b89e2af7809a1697f6f5f93f1d0e518ac566e2ac4d2af881a69c13ad01ea"}, + {file = "pylint-3.0.1.tar.gz", hash = "sha256:81c6125637be216b4652ae50cc42b9f8208dfb725cdc7e04c48f6902f4dbdf40"}, +] + +[package.dependencies] +astroid = ">=3.0.0,<=3.1.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.2", markers = "python_version < \"3.11\""} +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + +[[package]] +name = "pyupgrade" +version = "3.15.0" +description = "A tool to automatically upgrade syntax for newer versions." +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "pyupgrade-3.15.0-py2.py3-none-any.whl", hash = "sha256:8dc8ebfaed43566e2c65994162795017c7db11f531558a74bc8aa077907bc305"}, + {file = "pyupgrade-3.15.0.tar.gz", hash = "sha256:a7fde381060d7c224f55aef7a30fae5ac93bbc428367d27e70a603bc2acd4f00"}, +] + +[package.dependencies] +tokenize-rt = ">=5.2.0" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.1" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rpds-py" +version = "0.10.6" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, + {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, + {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, + {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, + {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, + {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, + {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, + {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, + {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, + {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, + {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, + {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, +] + +[[package]] +name = "ruff" +version = "0.1.1" +description = "An extremely fast Python linter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.1-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:b7cdc893aef23ccc14c54bd79a8109a82a2c527e11d030b62201d86f6c2b81c5"}, + {file = "ruff-0.1.1-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:620d4b34302538dbd8bbbe8fdb8e8f98d72d29bd47e972e2b59ce6c1e8862257"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a909d3930afdbc2e9fd893b0034479e90e7981791879aab50ce3d9f55205bd6"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3305d1cb4eb8ff6d3e63a48d1659d20aab43b49fe987b3ca4900528342367145"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c34ae501d0ec71acf19ee5d4d889e379863dcc4b796bf8ce2934a9357dc31db7"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6aa7e63c3852cf8fe62698aef31e563e97143a4b801b57f920012d0e07049a8d"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d68367d1379a6b47e61bc9de144a47bcdb1aad7903bbf256e4c3d31f11a87ae"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc11955f6ce3398d2afe81ad7e49d0ebf0a581d8bcb27b8c300281737735e3a3"}, + {file = "ruff-0.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbbd8eead88ea83a250499074e2a8e9d80975f0b324b1e2e679e4594da318c25"}, + {file = "ruff-0.1.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f4780e2bb52f3863a565ec3f699319d3493b83ff95ebbb4993e59c62aaf6e75e"}, + {file = "ruff-0.1.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8f5b24daddf35b6c207619301170cae5d2699955829cda77b6ce1e5fc69340df"}, + {file = "ruff-0.1.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d3f9ac658ba29e07b95c80fa742b059a55aefffa8b1e078bc3c08768bdd4b11a"}, + {file = "ruff-0.1.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3521bf910104bf781e6753282282acc145cbe3eff79a1ce6b920404cd756075a"}, + {file = "ruff-0.1.1-py3-none-win32.whl", hash = "sha256:ba3208543ab91d3e4032db2652dcb6c22a25787b85b8dc3aeff084afdc612e5c"}, + {file = "ruff-0.1.1-py3-none-win_amd64.whl", hash = "sha256:3ff3006c97d9dc396b87fb46bb65818e614ad0181f059322df82bbfe6944e264"}, + {file = "ruff-0.1.1-py3-none-win_arm64.whl", hash = "sha256:e140bd717c49164c8feb4f65c644046fe929c46f42493672853e3213d7bdbce2"}, + {file = "ruff-0.1.1.tar.gz", hash = "sha256:c90461ae4abec261609e5ea436de4a4b5f2822921cf04c16d2cc9327182dbbcc"}, +] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sphinx" +version = "7.2.6" +description = "Python documentation generator" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.9" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] + +[[package]] +name = "sphinx-autoapi" +version = "2.1.1" +description = "Sphinx API documentation generator" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-autoapi-2.1.1.tar.gz", hash = "sha256:fbadb96e79020d6b0ec45d888517bf816d6b587a2d340fbe1ec31135e300a6c8"}, + {file = "sphinx_autoapi-2.1.1-py2.py3-none-any.whl", hash = "sha256:d8da890477bd18e3327cafdead9d5a44a7d798476c6fa32492100e288250a5a3"}, +] + +[package.dependencies] +anyascii = "*" +astroid = ">=2.7" +Jinja2 = "*" +PyYAML = "*" +sphinx = ">=5.2.0" + +[package.extras] +docs = ["furo", "sphinx", "sphinx-design"] +dotnet = ["sphinxcontrib-dotnetdomain"] +go = ["sphinxcontrib-golangdomain"] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "1.24.0" +description = "Type hints (PEP 484) support for the Sphinx autodoc extension" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinx_autodoc_typehints-1.24.0-py3-none-any.whl", hash = "sha256:6a73c0c61a9144ce2ed5ef2bed99d615254e5005c1cc32002017d72d69fb70e6"}, + {file = "sphinx_autodoc_typehints-1.24.0.tar.gz", hash = "sha256:94e440066941bb237704bb880785e2d05e8ae5406c88674feefbb938ad0dc6af"}, +] + +[package.dependencies] +sphinx = ">=7.0.1" + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)"] +numpy = ["nptyping (>=2.5)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.6.3)"] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + +[[package]] +name = "sphinx-rtd-theme" +version = "2.0.0rc2" +description = "Read the Docs theme for Sphinx" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinx_rtd_theme-2.0.0rc2-py2.py3-none-any.whl", hash = "sha256:f04df9213acf421c3b42f4f39005c8bc68fc4696c5b4ed4ef13d1678369713f7"}, + {file = "sphinx_rtd_theme-2.0.0rc2.tar.gz", hash = "sha256:d1270effe620df9164b1cd2d617909472a63531e21a716fd22d0fbcedf9d24ff"}, +] + +[package.dependencies] +docutils = "<0.21" +sphinx = ">=5,<8" +sphinxcontrib-jquery = ">=4,<5" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-apidoc" +version = "0.4.0" +description = "A Sphinx extension for running 'sphinx-apidoc' on each build" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-apidoc-0.4.0.tar.gz", hash = "sha256:fe59d15882472aa93c2737afbdea6bedb34ce35cbd34aa4947909f5df1500aad"}, + {file = "sphinxcontrib_apidoc-0.4.0-py3-none-any.whl", hash = "sha256:18b9fb0cd4816758ec5f8be41c64f8924991dd40fd7b10e666ec9eed2800baff"}, +] + +[package.dependencies] +pbr = "*" +Sphinx = ">=5.0.0" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.7" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.4" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sqlalchemy" +version = "1.4.49" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca46de16650d143a928d10842939dab208e8d8c3a9a8757600cae9b7c579c5cd"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f23755c384c2969ca2f7667a83f7c5648fcf8b62a3f2bbd883d805454964a800"}, + {file = "SQLAlchemy-1.4.49-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8396e896e08e37032e87e7fbf4a15f431aa878c286dc7f79e616c2feacdb366c"}, + {file = "SQLAlchemy-1.4.49-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66da9627cfcc43bbdebd47bfe0145bb662041472393c03b7802253993b6b7c90"}, + {file = "SQLAlchemy-1.4.49-cp312-cp312-win32.whl", hash = "sha256:9a06e046ffeb8a484279e54bda0a5abfd9675f594a2e38ef3133d7e4d75b6214"}, + {file = "SQLAlchemy-1.4.49-cp312-cp312-win_amd64.whl", hash = "sha256:7cf8b90ad84ad3a45098b1c9f56f2b161601e4670827d6b892ea0e884569bd1d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc22807a7e161c0d8f3da34018ab7c97ef6223578fcdd99b1d3e7ed1100a5db"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:393cd06c3b00b57f5421e2133e088df9cabcececcea180327e43b937b5a7caa5"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95ab792ca493891d7a45a077e35b418f68435efb3e1706cb8155e20e86a9013c"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:738d7321212941ab19ba2acf02a68b8ee64987b248ffa2101630e8fccb549e0d"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "tokenize-rt" +version = "5.2.0" +description = "A wrapper around the stdlib `tokenize` which roundtrips." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, + {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, +] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.1" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] + +[[package]] +name = "traitlets" +version = "5.11.2" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.11.2-py3-none-any.whl", hash = "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae"}, + {file = "traitlets-5.11.2.tar.gz", hash = "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.24.5" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.8" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, + {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9, <3.11" +content-hash = "4fd0a8b552849e25d13b9ba2e08934586c19f256a2e063dc8d14678605341273" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..443984e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,129 @@ +[tool.poetry] +name = "cycquery" +version = "0.1.0" +description = "A tool to query EHR databases" +authors = ["Vector AI Engineering "] +license = "Apache-2.0" +repository = "https://github.com/VectorInstitute/cyclops-query" +documentation = "https://vectorinstitute.github.io/cyclops-query/" +packages = [ + { include = "cycquery" }, +] +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.9, <3.11" +pandas = "^1.4.1" +pyarrow = "^11.0.0" +dask = { version = "^2023.10.0", extras = ["dataframe"] } +psycopg2 = "^2.9.6" +SQLAlchemy = "^1.4.32, <2.0" + +[tool.poetry.group.codestyle.dependencies] +pytest = "^7.1.1" +pre-commit = "^2.17.0" +black = "^22.1.0" +pytest-cov = "^3.0.0" +codecov = "^2.1.13" +nbstripout = "^0.6.1" +mypy = "^1.0.0" +ruff = "^0.1.0" +nbqa = { version = "^1.7.0", extras = ["toolchain"] } + +[tool.poetry.group.docs.dependencies] +numpydoc = "^1.2" +sphinx = "^7.2.5" +sphinx-rtd-theme = "^2.0.0rc2" +sphinxcontrib-apidoc = "^0.4.0" +sphinx-autodoc-typehints = "^1.24.0" +myst-parser = "^2.0.0" +sphinx-copybutton = "^0.5.0" +sphinx-autoapi = "^2.0.0" +nbsphinx = "^0.8.11" +ipython = "^8.8.0" +ipykernel = "^6.23.0" + +[tool.mypy] +ignore_missing_imports = true +install_types = true +pretty = true +namespace_packages = true +explicit_package_bases = true +non_interactive = true +warn_unused_configs = true +allow_any_generics = false +allow_subclassing_any = false +allow_untyped_calls = false +allow_untyped_defs = false +allow_incomplete_defs = false +check_untyped_defs = true +allow_untyped_decorators = false +warn_redundant_casts = true +warn_unused_ignores = true +warn_return_any = true +implicit_reexport = false +strict_equality = true +extra_checks = true +plugins = ["sqlalchemy.ext.mypy.plugin"] + +[tool.ruff] +include = ["*.py", "pyproject.toml", "*.ipynb"] +select = [ + "A", # flake8-builtins + "B", # flake8-bugbear + "COM", # flake8-commas + "C4", # flake8-comprehensions + "RET", # flake8-return + "SIM", # flake8-simplify + "ICN", # flake8-import-conventions + "Q", # flake8-quotes + "RSE", # flake8-raise + "D", # pydocstyle + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "W", # pycodestyle + "N", # pep8-naming + "ERA", # eradicate + "PL", # pylint +] +fixable = ["A", "B", "COM", "C4", "RET", "SIM", "ICN", "Q", "RSE", "D", "E", "F", "I", "W", "N", "ERA", "PL"] +line-length = 88 +ignore = [ + "B905", # `zip()` without an explicit `strict=` parameter + "E501", # line too long + "D203", # 1 blank line required before class docstring + "D213", # Multi-line docstring summary should start at the second line + "PLR2004", # Replace magic number with named constant + "PLR0913", # Too many arguments +] + +# Ignore import violations in all `__init__.py` files. +[tool.ruff.per-file-ignores] +"__init__.py" = ["E402", "F401", "F403", "F811"] + +[tool.ruff.pep8-naming] +ignore-names = ["X*", "setUp"] + +[tool.ruff.isort] +lines-after-imports = 2 + +[tool.ruff.pydocstyle] +convention = "numpy" + +[tool.ruff.pycodestyle] +max-doc-length = 88 + +[tool.pytest.ini_options] +markers = [ + "integration_test: marks tests as integration tests", +] + +[tool.coverage] + [tool.coverage.run] + source=["cycquery"] + omit=["tests/*", "*__init__.py"] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..183e0ed --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +"""Setup package.""" + +from setuptools import setup + + +setup() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..d420712 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests.""" diff --git a/tests/cycquery/__init__.py b/tests/cycquery/__init__.py new file mode 100644 index 0000000..9783b8c --- /dev/null +++ b/tests/cycquery/__init__.py @@ -0,0 +1 @@ +"""Tests for query API package.""" diff --git a/tests/cycquery/post_process/__init__.py b/tests/cycquery/post_process/__init__.py new file mode 100644 index 0000000..27484c0 --- /dev/null +++ b/tests/cycquery/post_process/__init__.py @@ -0,0 +1 @@ +"""Tests for query postprocess functions.""" diff --git a/tests/cycquery/post_process/test_util.py b/tests/cycquery/post_process/test_util.py new file mode 100644 index 0000000..c993e1d --- /dev/null +++ b/tests/cycquery/post_process/test_util.py @@ -0,0 +1,51 @@ +"""Tests for post-processing functions in the query package.""" + +import pandas as pd + +from cycquery.post_process.util import event_time_between + + +def test_event_time_between(): + """Test event_time_between fn.""" + admit_ts = pd.Series( + [ + pd.Timestamp(year=2017, month=1, day=1, hour=12), + pd.Timestamp(year=2017, month=1, day=1, hour=12), + ], + ) + discharge_ts = pd.Series( + [ + pd.Timestamp(year=2017, month=1, day=7, hour=12), + pd.Timestamp(year=2018, month=1, day=9, hour=12), + ], + ) + is_between = event_time_between( + pd.Timestamp(year=2017, month=1, day=2), + admit_ts, + discharge_ts, + ) + assert is_between[0] + assert is_between[1] + is_between = event_time_between( + pd.Timestamp(year=2017, month=1, day=7, hour=12), + admit_ts, + discharge_ts, + ) + assert not is_between[0] + assert is_between[1] + is_between = event_time_between( + pd.Timestamp(year=2017, month=1, day=7, hour=12), + admit_ts, + discharge_ts, + discharge_inclusive=True, + ) + assert is_between[0] + assert is_between[1] + is_between = event_time_between( + pd.Timestamp(year=2017, month=1, day=1, hour=12), + admit_ts, + discharge_ts, + admit_inclusive=False, + ) + assert not is_between[0] + assert not is_between[1] diff --git a/tests/cycquery/test_base.py b/tests/cycquery/test_base.py new file mode 100644 index 0000000..45d548f --- /dev/null +++ b/tests/cycquery/test_base.py @@ -0,0 +1,22 @@ +"""Test base dataset querier, using OMOPQuerier as an example.""" + +import pytest + +from cycquery import OMOPQuerier + + +@pytest.mark.integration_test() +def test_dataset_querier(): + """Test base querier methods using OMOPQuerier.""" + querier = OMOPQuerier( + database="synthea_integration_test", + schema_name="cdm_synthea10", + user="postgres", + password="pwd", + ) + assert len(querier.list_tables()) == 69 + assert len(querier.list_schemas()) == 4 + assert len(querier.list_tables(schema_name="cdm_synthea10")) == 43 + visit_occrrence_columns = querier.list_columns("cdm_synthea10", "visit_occurrence") + assert len(visit_occrrence_columns) == 17 + assert "visit_occurrence_id" in visit_occrrence_columns diff --git a/tests/cycquery/test_eicu.py b/tests/cycquery/test_eicu.py new file mode 100644 index 0000000..ab6bc56 --- /dev/null +++ b/tests/cycquery/test_eicu.py @@ -0,0 +1,29 @@ +"""Test eICU query API.""" + +import pytest + +from cycquery import EICUQuerier + + +@pytest.mark.integration_test() +def test_eicu_querier(): + """Test EICUQuerier on eICU-CRD.""" + querier = EICUQuerier( + database="eicu", + user="postgres", + password="pwd", + ) + + patients = querier.eicu_crd.patient().run(limit=10) + assert len(patients) == 10 + assert "age" in patients + + diagnoses = querier.eicu_crd.diagnosis().run(limit=10) + assert len(diagnoses) == 10 + assert "diagnosisstring" in diagnoses + + vital_periods = querier.eicu_crd.vitalperiodic().run(limit=10) + assert "heartrate" in vital_periods + + vital_aperiodic = querier.eicu_crd.vitalaperiodic().run(limit=10) + assert "pvri" in vital_aperiodic diff --git a/tests/cycquery/test_interface.py b/tests/cycquery/test_interface.py new file mode 100644 index 0000000..4385edd --- /dev/null +++ b/tests/cycquery/test_interface.py @@ -0,0 +1,81 @@ +"""Test functions for interface module in query package.""" + +import os +import shutil +from unittest.mock import patch + +import dask.dataframe as dd +import pandas as pd +import pytest + +from cycquery.interface import QueryInterface +from cycquery.omop import OMOPQuerier + + +@pytest.fixture() +def test_data(): + """Dummy dataframe for testing.""" + return pd.DataFrame([[1, "a", 1], [5.1, "b", 0]], columns=["col1", "col2", "col3"]) + + +@patch("cycquery.orm.Database") +@patch("sqlalchemy.sql.selectable.Subquery") +def test_query_interface( + database, + query, + test_data, +): + """Test QueryInterface.""" + query_interface = QueryInterface(database, query) + query_interface.run() + + query_interface._data = test_data + path = os.path.join("test_save", "test_features.parquet") + query_interface.save(path) + loaded_data = pd.read_parquet(path) + assert loaded_data.equals(test_data) + shutil.rmtree("test_save") + query_interface.clear_data() + assert not query_interface.data + + with pytest.raises(ValueError): + query_interface.save(path, file_format="donkey") + + +@pytest.mark.integration_test() +def test_query_interface_integration(): + """Test QueryInterface with OMOPQuerier.""" + synthea = OMOPQuerier( + database="synthea_integration_test", + schema_name="cdm_synthea10", + user="postgres", + password="pwd", + ) + visits = synthea.visit_occurrence() + assert isinstance(visits, QueryInterface) + visits_pd_df = visits.run() + assert isinstance(visits_pd_df, pd.DataFrame) + assert visits_pd_df.shape[0] > 0 + visits_dd_df = visits.run(backend="dask", index_col="visit_occurrence_id") + assert isinstance(visits_dd_df, dd.DataFrame) + assert ( + "visit_occurrence_id" in visits_dd_df.columns + ) # reset index and keep index column + assert visits_dd_df.shape[0].compute() > 0 + visits_dd_df = visits.run( + backend="dask", + index_col="visit_occurrence_id", + n_partitions=2, + ) + assert isinstance(visits_dd_df, dd.DataFrame) + assert visits_dd_df.npartitions == 2 + vistit_ids_0 = visits_dd_df.partitions[0].compute()["visit_occurrence_id"] + vistit_ids_1 = visits_dd_df.partitions[1].compute()["visit_occurrence_id"] + # check that the partitions don't overlap + assert len(set(vistit_ids_0).intersection(set(vistit_ids_1))) == 0 + + # test running a query using SQL string + synthea_db = visits.database + visits_df = synthea_db.run_query("SELECT * FROM cdm_synthea10.visit_occurrence") + assert isinstance(visits_df, pd.DataFrame) + assert visits_df.shape[0] > 0 diff --git a/tests/cycquery/test_mimiciii.py b/tests/cycquery/test_mimiciii.py new file mode 100644 index 0000000..84e7e5d --- /dev/null +++ b/tests/cycquery/test_mimiciii.py @@ -0,0 +1,34 @@ +"""Test MIMICIII query API.""" + +import pytest + +from cycquery import MIMICIIIQuerier + + +@pytest.mark.integration_test() +def test_mimiciii_querier(): + """Test MIMICIIIQuerier.""" + querier = MIMICIIIQuerier( + dbms="postgresql", + port=5432, + host="localhost", + database="mimiciii", + user="postgres", + password="pwd", + ) + custom_tables = querier.list_custom_tables() + assert "diagnoses" in custom_tables + assert "labevents" in custom_tables + assert "chartevents" in custom_tables + + diagnoses = querier.diagnoses().run(limit=10) + assert len(diagnoses) == 10 + assert "long_title" in diagnoses + + labevents = querier.labevents().run(limit=10) + assert len(labevents) == 10 + assert "itemid" in labevents + + chartevents = querier.chartevents().run(limit=10) + assert len(chartevents) == 10 + assert "itemid" in chartevents diff --git a/tests/cycquery/test_mimiciv.py b/tests/cycquery/test_mimiciv.py new file mode 100644 index 0000000..89cade2 --- /dev/null +++ b/tests/cycquery/test_mimiciv.py @@ -0,0 +1,39 @@ +"""Test MIMICIV-2.0 query API.""" + +import pytest + +from cycquery import MIMICIVQuerier + + +@pytest.mark.integration_test() +def test_mimiciv_querier(): + """Test MIMICQuerier on MIMICIV-2.0.""" + querier = MIMICIVQuerier( + database="mimiciv-2.0", + user="postgres", + password="pwd", + ) + + patients = querier.patients().run(limit=10) + assert len(patients) == 10 + assert "anchor_year_difference" in patients + + diagnoses = querier.diagnoses().run(limit=10) + assert len(diagnoses) == 10 + assert "long_title" in diagnoses + + lab_events = querier.labevents().run(limit=10) + assert "category" in lab_events + + chart_events = querier.chartevents().run(limit=10) + assert "value" in chart_events + assert "category" in chart_events + + custom_tables = querier.list_custom_tables() + assert "patients" in custom_tables + assert "diagnoses" in custom_tables + assert "labevents" in custom_tables + assert "chartevents" in custom_tables + + with pytest.raises(AttributeError): + querier.get_table("invalid_schema", "invalid_table") diff --git a/tests/cycquery/test_omop.py b/tests/cycquery/test_omop.py new file mode 100644 index 0000000..92e13db --- /dev/null +++ b/tests/cycquery/test_omop.py @@ -0,0 +1,51 @@ +"""Test OMOP query API.""" + +import pytest + +import cycquery.ops as qo +from cycquery import OMOPQuerier + + +@pytest.mark.integration_test() +def test_omop_querier_synthea(): + """Test OMOPQuerier on synthea data.""" + querier = OMOPQuerier( + database="synthea_integration_test", + schema_name="cdm_synthea10", + user="postgres", + password="pwd", + ) + ops = qo.Sequential( + qo.ConditionEquals("gender_source_value", "M"), + qo.Rename({"race_source_value": "race"}), + ) + persons = querier.person() + persons = persons.ops(ops) + visits = querier.visit_occurrence() + visits = visits.join(persons, "person_id").run() + persons = persons.run() + observations = querier.observation().run() + measurements = querier.measurement().run() + visit_details = querier.visit_detail().run() + providers = querier.cdm_synthea10.provider().run() + conditions = querier.cdm_synthea10.condition_occurrence().run() + assert len(persons) == 54 + assert len(visits) == 1798 + assert len(visit_details) == 4320 + assert len(observations) == 17202 + assert len(measurements) == 19994 + assert len(providers) == 212 + assert len(conditions) == 1419 + + +@pytest.mark.integration_test() +def test_omop_querier_mimiciii(): + """Test OMOPQuerier on MIMICIII data.""" + querier = OMOPQuerier( + database="mimiciii", + schema_name="omop", + user="postgres", + password="pwd", + ) + visits = querier.visit_occurrence().run() + assert len(visits) == 58976 diff --git a/tests/cycquery/test_ops.py b/tests/cycquery/test_ops.py new file mode 100644 index 0000000..958875e --- /dev/null +++ b/tests/cycquery/test_ops.py @@ -0,0 +1,655 @@ +"""Test low-level query API processing functions.""" + +from math import isclose + +import pandas as pd +import pytest +from sqlalchemy import column, select + +from cycquery.omop import OMOPQuerier +from cycquery.ops import ( + AddColumn, + AddNumeric, + And, + Apply, + Cast, + ConditionAfterDate, + ConditionBeforeDate, + ConditionEndsWith, + ConditionEquals, + ConditionGreaterThan, + ConditionIn, + ConditionInMonths, + ConditionInYears, + ConditionLessThan, + ConditionLike, + ConditionRegexMatch, + ConditionStartsWith, + ConditionSubstring, + Distinct, + Drop, + DropEmpty, + DropNulls, + ExtractTimestampComponent, + FillNull, + GroupByAggregate, + Limit, + Literal, + Or, + OrderBy, + QueryOp, + Rename, + ReorderAfter, + Sequential, + Substring, + Trim, + _addindent, + _none_add, + _process_checks, +) +from cycquery.util import process_column + + +QUERIER = OMOPQuerier( + database="synthea_integration_test", + user="postgres", + password="pwd", + schema_name="cdm_synthea10", +) + + +@pytest.fixture() +def table_input(): + """Test table input.""" + column_a = process_column(column("a"), to_timestamp=True) + return select(column_a, column("b"), column("c")) + + +@pytest.fixture() +def visits_table(): + """Test visits table input.""" + return QUERIER.visit_occurrence() + + +@pytest.fixture() +def measurements_table(): + """Test measurement table input.""" + return QUERIER.measurement() + + +def test__none_add(): + """Test _none_add fn.""" + assert _none_add("1", "2") == "12" + assert _none_add("1", None) == "1" + assert _none_add(None, "2") == "2" + + +def test__process_checks(table_input): + """Test _process_checks fn.""" + _process_checks(table_input, cols=["a"], cols_not_in=["d"], timestamp_cols=["a"]) + with pytest.raises(ValueError): + _process_checks(table_input, cols_not_in=["a"]) + + +class TestAddndent: + """Test _addindent fn.""" + + def test_addindent_multiple_lines(self): + """Test _addindent fn with multiple lines.""" + input_string = "This is a\nmultiline\nstring" + expected_output = "This is a\n multiline\n string" + assert _addindent(input_string, 4) == expected_output + + def test_addindent_single_line(self): + """Test _addindent fn with single line.""" + input_string = "This is a single line string" + assert _addindent(input_string, 4) == input_string + + +class TestQueryOp: + """Test QueryOp class.""" + + def test_add_child_operation(self): + """Test adding a child operation.""" + query_op = QueryOp() + child_op = QueryOp() + query_op._add_op("child", child_op) + assert query_op.child == child_op + + def test_get_query_op_name(self): + """Test getting the name of the query op.""" + query_op = QueryOp() + assert query_op._get_name() == "QueryOp" + + def test_set_attribute(self): + """Test setting an attribute of the query op.""" + query_op = QueryOp() + child_op = QueryOp() + query_op.child = child_op + assert query_op.child == child_op + + def test_string_representation(self): + """Test string representation of the query op.""" + query_op = QueryOp() + child_op = QueryOp() + query_op._add_op("child", child_op) + assert repr(query_op) == "QueryOp(\n (child): QueryOp()\n)" + + def test_add_child_operation_empty_name(self): + """Test adding a child operation with an empty name.""" + query_op = QueryOp() + child_op = QueryOp() + with pytest.raises(KeyError): + query_op._add_op("", child_op) + + def test_add_child_operation_dot_name(self): + """Test adding a child operation with a dot in the name.""" + query_op = QueryOp() + child_op = QueryOp() + with pytest.raises(KeyError): + query_op._add_op("child.name", child_op) + + +@pytest.mark.integration_test() +def test_drop(visits_table): + """Test Drop.""" + visits = visits_table.ops(Drop("care_site_source_value")).run() + assert "care_site_source_value" not in visits.columns + + +@pytest.mark.integration_test() +def test_fill_null(visits_table): + """Test FillNull.""" + visits_before = visits_table.run() + unique_before = visits_before["preceding_visit_occurrence_id"].unique() + visits_after = visits_table.ops( + FillNull(["preceding_visit_occurrence_id", "care_site_id"], 0), + ).run() + unique_after = visits_after["preceding_visit_occurrence_id"].unique() + assert visits_after["preceding_visit_occurrence_id"].isna().sum() == 0 + assert visits_after["care_site_id"].isna().sum() == 0 + assert 0 not in unique_before + assert len(unique_after) == len(unique_before) + assert len(visits_after["care_site_id"].unique()) == 1 + + visits_after = visits_table.ops( + FillNull( + ["preceding_visit_occurrence_id", "care_site_id"], + [0, -99], + ["col1", "col2"], + ), + ).run() + assert visits_after["preceding_visit_occurrence_id"].isna().sum() != 0 + assert visits_after["care_site_id"].isna().sum() != 0 + assert visits_after["col1"].isna().sum() == 0 + assert visits_after["col2"].isna().sum() == 0 + assert len(visits_after["col2"].unique()) == 1 + assert -99 in visits_after["col2"].unique() + + +@pytest.mark.integration_test() +def test_add_column(visits_table): + """Test AddColumn.""" + ops = Sequential( + Literal(2, "test_col1"), + Literal(3, "test_col2"), + AddColumn("test_col1", "test_col2", new_col_labels="test_col3"), + ) + visits = visits_table.ops(ops).run() + assert "test_col3" in visits.columns + assert (visits["test_col3"] == 5).all() + + ops = Sequential( + Literal(2, "test_col1"), + Literal(3, "test_col2"), + AddColumn( + "test_col1", + "test_col2", + negative=True, + new_col_labels="test_col3", + ), + ) + visits = visits_table.ops(ops).run() + assert "test_col3" in visits.columns + assert (visits["test_col3"] == -1).all() + + +@pytest.mark.integration_test() +def test_rename(visits_table): + """Test Rename.""" + rename_op = Rename({"care_site_name": "hospital_name"}) + visits = visits_table.ops(rename_op).run() + assert "hospital_name" in visits.columns + assert "care_site_name" not in visits.columns + + +@pytest.mark.integration_test() +def test_literal(visits_table): + """Test Literal.""" + literal_ops = Sequential(Literal(1, "new_col"), Literal("a", "new_col2")) + visits = visits_table.ops(literal_ops).run() + assert "new_col" in visits.columns + assert visits["new_col"].iloc[0] == 1 + assert "new_col2" in visits.columns + assert visits["new_col2"].iloc[0] == "a" + + +@pytest.mark.integration_test() +def test_reorder_after(visits_table): + """Test ReorderAfter.""" + reorder_op = ReorderAfter("visit_concept_name", "care_site_id") + visits = visits_table.ops(reorder_op).run() + assert list(visits.columns).index("care_site_id") + 1 == list(visits.columns).index( + "visit_concept_name", + ) + + +@pytest.mark.integration_test() +def test_limit(visits_table): + """Test Limit.""" + visits = visits_table.ops(Limit(10)).run() + assert len(visits) == 10 + + +@pytest.mark.integration_test() +def test_order_by(visits_table): + """Test OrderBy.""" + orderby_op = OrderBy("visit_concept_name") + visits = visits_table.ops(orderby_op).run() + assert visits["visit_concept_name"].is_monotonic_increasing + + +@pytest.mark.integration_test() +def test_substring(visits_table): + """Test Substring.""" + substring_op = Substring("visit_concept_name", 0, 3, "visit_concept_name_substr") + visits = visits_table.ops(substring_op).run() + assert visits["visit_concept_name_substr"].value_counts()["Ou"] == 4057 + + +@pytest.mark.integration_test() +def test_trim(visits_table): + """Test Trim.""" + trim_op = Trim("visit_concept_name", "visit_concept_name_trim") + visits = visits_table.ops(trim_op).run() + assert visits["visit_concept_name_trim"].value_counts()["Inpatient Visit"] == 108 + + +@pytest.mark.integration_test() +def test_extract_timestamp_component( + visits_table, +): + """Test ExtractTimestampComponent.""" + extract_ts_op = ExtractTimestampComponent( + "visit_start_date", + "year", + "visit_start_date_year", + ) + visits = visits_table.ops(extract_ts_op).run() + assert visits["visit_start_date_year"].value_counts()[2021] == 371 + + +@pytest.mark.integration_test() +def test_add_numeric(visits_table): + """Test AddNumeric.""" + ops = Sequential(Literal(1, "new_col"), AddNumeric("new_col", 1, "new_col_plus_1")) + visits = visits_table.ops(ops).run() + assert visits["new_col_plus_1"].iloc[0] == 2 + + +@pytest.mark.integration_test() +def test_apply(visits_table): + """Test Apply.""" + apply_op = Apply( + "visit_concept_name", + lambda x: x + "!", + "visit_concept_name_exclaim", + ) + visits = visits_table.ops(apply_op).run() + assert ( + visits["visit_concept_name_exclaim"].value_counts()["Outpatient Visit!"] == 4057 + ) + apply_op = Apply( + ["visit_occurrence_id", "person_id"], + lambda x, y: x + y, + "sum_id", + ) + visits = visits_table.ops(apply_op).run() + assert ( + visits["sum_id"].iloc[0] + == visits["visit_occurrence_id"].iloc[0] + visits["person_id"].iloc[0] + ) + assert visits["sum_id"].isna().sum() == visits["person_id"].isna().sum() + apply_op = Apply( + ["visit_occurrence_id", "person_id"], + [lambda x: x + 1, lambda x: x + 2], + ["sum_id", "sum_id2"], + ) + visits = visits_table.ops(apply_op).run() + assert visits["sum_id"].iloc[0] == visits["visit_occurrence_id"].iloc[0] + 1 + assert visits["sum_id2"].iloc[0] == visits["person_id"].iloc[0] + 2 + + +@pytest.mark.integration_test() +def test_condition_regex_match( + measurements_table, +): + """Test ConditionRegexMatch.""" + measurements_op = ConditionRegexMatch( + "value_source_value", + r"^[0-9]+(\.[0-9]+)?$", + binarize_col="value_source_value_match", + ) + measurements = measurements_table.ops(measurements_op).run() + assert "value_source_value_match" in measurements.columns + assert ( + measurements["value_source_value_match"].sum() + == measurements["value_source_value"].str.match(r"^[0-9]+(\.[0-9]+)?$").sum() + ) + + +@pytest.mark.integration_test() +def test_group_by_aggregate( + visits_table, + measurements_table, +): + """Test GroupByAggregate.""" + with pytest.raises(ValueError): + visits_table.ops( + GroupByAggregate("person_id", {"person_id": ("donkey", "visit_count")}), + ) + with pytest.raises(ValueError): + visits_table.ops( + GroupByAggregate("person_id", {"person_id": ("count", "person_id")}), + ) + + visits_count = visits_table.ops( + GroupByAggregate( + "person_id", + {"person_id": ("count", "num_visits")}, + ), + ).run() + visits_string_agg = visits_table.ops( + GroupByAggregate( + "person_id", + {"visit_concept_name": ("string_agg", "visit_concept_names")}, + {"visit_concept_name": ", "}, + ), + ).run() + measurements_sum = measurements_table.ops( + GroupByAggregate( + "person_id", + {"value_as_number": ("sum", "value_as_number_sum")}, + ), + ).run() + measurements_average = measurements_table.ops( + GroupByAggregate( + "person_id", + {"value_as_number": ("average", "value_as_number_average")}, + ), + ).run() + measurements_min = measurements_table.ops( + GroupByAggregate( + "person_id", + {"value_as_number": ("min", "value_as_number_min")}, + ), + ).run() + measurements_max = measurements_table.ops( + GroupByAggregate( + "person_id", + {"value_as_number": ("max", "value_as_number_max")}, + ), + ).run() + measurements_median = measurements_table.ops( + GroupByAggregate( + "person_id", + {"value_as_number": ("median", "value_as_number_median")}, + ), + ).run() + + assert "num_visits" in visits_count.columns + assert visits_count[visits_count["person_id"] == 33]["num_visits"][0] == 86 + assert "visit_concept_names" in visits_string_agg.columns + test_visit_concept_names = visits_string_agg[visits_string_agg["person_id"] == 33][ + "visit_concept_names" + ][0].split(",") + test_visit_concept_names = [item.strip() for item in test_visit_concept_names] + assert len(test_visit_concept_names) == 86 + assert "Outpatient Visit" in test_visit_concept_names + assert "value_as_number_sum" in measurements_sum.columns + assert ( + measurements_sum[measurements_sum["person_id"] == 33]["value_as_number_sum"][0] + == 9881.3 + ) + assert "value_as_number_average" in measurements_average.columns + assert isclose( + measurements_average[measurements_average["person_id"] == 33][ + "value_as_number_average" + ][0], + 75.42, + abs_tol=0.01, + ) + assert "value_as_number_min" in measurements_min.columns + assert ( + measurements_min[measurements_min["person_id"] == 33]["value_as_number_min"][0] + == 0.0 + ) + assert "value_as_number_max" in measurements_max.columns + assert ( + measurements_max[measurements_max["person_id"] == 33]["value_as_number_max"][0] + == 360.7 + ) + assert "value_as_number_median" in measurements_median.columns + assert ( + measurements_median[measurements_median["person_id"] == 33][ + "value_as_number_median" + ].item() + == 75.7 + ) + + +@pytest.mark.integration_test() +def test_drop_nulls(visits_table): + """Test DropNulls.""" + visits = visits_table.ops(DropNulls("preceding_visit_occurrence_id")).run() + assert visits["preceding_visit_occurrence_id"].isnull().sum() == 0 + + +@pytest.mark.integration_test() +def test_drop_empty(visits_table): + """Test DropEmpty.""" + visits = visits_table.ops(DropEmpty("visit_concept_name")).run() + assert (visits["visit_concept_name"] == "").sum() == 0 + + +@pytest.mark.integration_test() +def test_condition_before_date(visits_table): + """Test ConditionBeforeDate.""" + visits = visits_table.ops( + ConditionBeforeDate("visit_start_date", "2018-01-01"), + ).run() + assert pd.Timestamp(visits["visit_start_date"].max()) < pd.Timestamp("2018-01-01") + + +@pytest.mark.integration_test() +def test_condition_after_date(visits_table): + """Test ConditionAfterDate.""" + visits = visits_table.ops( + ConditionAfterDate("visit_start_date", "2018-01-01"), + ).run() + assert pd.Timestamp(visits["visit_start_date"].min()) > pd.Timestamp("2018-01-01") + + +@pytest.mark.integration_test() +def test_condition_in(visits_table): + """Test ConditionIn.""" + visits = visits_table.ops( + ConditionIn("visit_concept_name", ["Outpatient Visit"]), + ).run() + assert all(visits["visit_concept_name"] == "Outpatient Visit") + + +@pytest.mark.integration_test() +def test_condition_in_months(visits_table): + """Test ConditionInMonths.""" + ops = Sequential( + Cast("visit_start_date", "timestamp"), + ConditionInMonths("visit_start_date", 6), + ) + visits = visits_table.ops(ops).run() + assert (visits["visit_start_date"].dt.month == 6).all() + + +@pytest.mark.integration_test() +def test_condition_in_years(visits_table): + """Test ConditionInYears.""" + ops = Sequential( + Cast("visit_start_date", "timestamp"), + ConditionInYears("visit_start_date", 2018), + ) + visits = visits_table.ops(ops).run() + assert (visits["visit_start_date"].dt.year == 2018).all() + + +@pytest.mark.integration_test() +def test_condition_substring(visits_table): + """Test ConditionSubstring.""" + visits = visits_table.ops( + ConditionSubstring("visit_concept_name", "Outpatient"), + ).run() + assert all(visits["visit_concept_name"].str.contains("Outpatient")) + + +@pytest.mark.integration_test() +def test_condition_starts_with(visits_table): + """Test ConditionStartsWith.""" + visits = visits_table.ops( + ConditionStartsWith("visit_concept_name", "Outpatient"), + ).run() + assert all(visits["visit_concept_name"].str.startswith("Outpatient")) + + +@pytest.mark.integration_test() +def test_condition_ends_with(visits_table): + """Test ConditionEndsWith.""" + visits = visits_table.ops(ConditionEndsWith("visit_concept_name", "Visit")).run() + assert all(visits["visit_concept_name"].str.endswith("Visit")) + + +@pytest.mark.integration_test() +def test_condition_equals(visits_table): + """Test ConditionEquals.""" + visits = visits_table.ops( + ConditionEquals("visit_concept_name", "Outpatient Visit"), + ).run() + assert all(visits["visit_concept_name"] == "Outpatient Visit") + visits = visits_table.ops( + ConditionEquals("visit_concept_name", "Outpatient Visit", not_=True), + ).run() + assert all(visits["visit_concept_name"] != "Outpatient Visit") + + +@pytest.mark.integration_test() +def test_condition_greater_than(visits_table): + """Test ConditionGreaterThan.""" + visits = visits_table.ops(ConditionGreaterThan("visit_concept_id", 9300)).run() + assert all(visits["visit_concept_id"] > 9300) + + +@pytest.mark.integration_test() +def test_condition_less_than(visits_table): + """Test ConditionLessThan.""" + visits = visits_table.ops(ConditionLessThan("visit_concept_id", 9300)).run() + assert all(visits["visit_concept_id"] < 9300) + + +@pytest.mark.integration_test() +def test_union(visits_table): + """Test Union.""" + outpatient_filtered = visits_table.ops( + ConditionEquals("visit_concept_name", "Outpatient Visit"), + ) + emergency_filtered = visits_table.ops( + ConditionEquals("visit_concept_name", "Emergency Room Visit"), + ) + visits = emergency_filtered.union(outpatient_filtered).run() + assert len(visits) == 4212 + assert all( + visits["visit_concept_name"].isin(["Outpatient Visit", "Emergency Room Visit"]), + ) + visits = emergency_filtered.union_all(emergency_filtered).run() + assert len(visits) == 310 + + +@pytest.mark.integration_test() +def test_sequential(visits_table): + """Test Sequential.""" + substr_op = Substring("visit_concept_name", 0, 4, "visit_concept_name_substr") + operations = [ + Literal(33, "const"), + Rename({"care_site_name": "hospital_name"}), + Apply("visit_concept_name", lambda x: x + "!", "visit_concept_name_exclaim"), + OrderBy(["person_id", "visit_start_date"]), + substr_op, + ] + sequential_ops = Sequential(operations) + visits = visits_table.ops(sequential_ops).run() + assert "hospital_name" in visits.columns + assert "visit_concept_name_exclaim" in visits.columns + assert list(visits[visits["person_id"] == 33]["visit_concept_name_exclaim"])[0] == ( + "Outpatient Visit!" + ) + assert "visit_concept_name_substr" in visits.columns + assert list(visits[visits["person_id"] == 33]["visit_concept_name_substr"])[0] == ( + "Out" + ) + + +@pytest.mark.integration_test() +def test_or(visits_table): + """Test Or.""" + or_op = Or( + ConditionEquals("visit_concept_name", "Outpatient Visit"), + ConditionLike("visit_concept_name", "%Emergency%"), + ) + visits = visits_table.ops(or_op).run() + assert len(visits) == 4212 + assert all( + visits["visit_concept_name"].isin(["Outpatient Visit", "Emergency Room Visit"]), + ) + + +@pytest.mark.integration_test() +def test_and(visits_table): + """Test And.""" + and_op = And( + [ + ConditionEquals("visit_concept_name", "Outpatient Visit"), + ConditionLike("visit_concept_name", "%Emergency%", not_=True), + ], + ) + visits = visits_table.ops(and_op).run() + assert len(visits) == 4057 + and_op = And( + ConditionEquals("visit_concept_name", "Outpatient Visit"), + ConditionLike("visit_concept_name", "%Emergency%", not_=True), + ) + visits = visits_table.ops(and_op).run() + assert len(visits) == 4057 + + +@pytest.mark.integration_test() +def test_distinct(visits_table): + """Test Distinct.""" + distinct_op = Distinct(["person_id"]) + visits = visits_table.ops(distinct_op).run() + assert len(visits) == 109 + + +@pytest.mark.integration_test() +def test_condition_like(visits_table): + """Test ConditionLike.""" + like_op = ConditionLike("visit_concept_name", "Outpatient%") + visits = visits_table.ops(like_op).run() + assert len(visits) == 4057 + assert all(visits["visit_concept_name"].str.startswith("Outpatient")) diff --git a/tests/cycquery/test_orm.py b/tests/cycquery/test_orm.py new file mode 100644 index 0000000..794081c --- /dev/null +++ b/tests/cycquery/test_orm.py @@ -0,0 +1,31 @@ +"""Test cyclops.query.orm module.""" + +import os + +import pandas as pd +import pytest + +from cycquery import OMOPQuerier + + +@pytest.mark.integration_test() +def test_omop_querier(): + """Test ORM using OMOPQuerier.""" + querier = OMOPQuerier( + database="synthea_integration_test", + schema_name="cdm_synthea10", + user="postgres", + password="pwd", + ) + assert querier is not None + db_ = querier.db + visits_query = querier.visit_occurrence().query + db_.save_query_to_csv(visits_query, "visits.csv") + visits_df = pd.read_csv("visits.csv") + assert len(visits_df) == 4320 + os.remove("visits.csv") + + db_.save_query_to_parquet(visits_query, "visits.parquet") + visits_df = pd.read_parquet("visits.parquet") + assert len(visits_df) == 4320 + os.remove("visits.parquet") diff --git a/tests/cycquery/test_util.py b/tests/cycquery/test_util.py new file mode 100644 index 0000000..315e27e --- /dev/null +++ b/tests/cycquery/test_util.py @@ -0,0 +1,208 @@ +"""Test query API util functions.""" + +import pytest +from sqlalchemy import Table, column, select +from sqlalchemy.sql.selectable import Select, Subquery +from sqlalchemy.types import Integer + +from cycquery.util import ( + DBTable, + _check_column_type, + _to_select, + _to_subquery, + drop_columns, + ends_with, + equals, + filter_columns, + get_column, + get_column_names, + get_columns, + greater_than, + has_columns, + less_than, + not_equals, + process_column, + process_elem, + process_list, + rename_columns, + reorder_columns, + starts_with, + table_params_to_type, + trim_columns, +) + + +@pytest.fixture() +def test_table(): + """Test table input.""" + return select(process_column(column("a"), to_int=True), column("b"), column("c")) + + +def test__check_column_type(test_table): + """Test _check_column_type fn.""" + assert _check_column_type(test_table, ["a"], Integer) + with pytest.raises(ValueError): + assert _check_column_type(test_table, ["b"], Integer, raise_error=True) + + +def test_ends_with(): + """Test ends_with.""" + test_col = column("a") + assert ( + str(ends_with(test_col, "a")) == "trim(lower(CAST(a AS VARCHAR))) LIKE :trim_1" + ) + + +def test_starts_with(): + """Test starts_with fn.""" + test_col = column("a") + assert ( + str(starts_with(test_col, "a")) + == "trim(lower(CAST(a AS VARCHAR))) LIKE :trim_1" + ) + + +def test__to_subquery(): + """Test _to_subquery fn.""" + assert isinstance(_to_subquery(select().subquery()), Subquery) + assert isinstance(_to_subquery(select()), Subquery) + assert isinstance(_to_subquery(Table()), Subquery) + assert isinstance(_to_subquery(DBTable("a", Table())), Subquery) + with pytest.raises(TypeError): + _to_subquery("a") + with pytest.raises(ValueError): + table_params_to_type(int) + + +def test__to_select(): + """Test _to_select fn.""" + assert isinstance(_to_select(select().subquery()), Select) + assert isinstance(_to_select(select()), Select) + assert isinstance(_to_select(Table()), Select) + assert isinstance(_to_select(DBTable("a", Table())), Select) + with pytest.raises(TypeError): + _to_select("a") + + +def test_get_column(test_table): + """Test get_column fn.""" + assert str(get_column(test_table, "a")) == "anon_1.a" + with pytest.raises(ValueError): + get_column(select(column("a")), "b") + + +def test_get_columns(test_table): + """Test get_columns fn.""" + cols = get_columns(test_table, "c") + cols = [str(col) for col in cols] + assert cols == ["anon_1.c"] + with pytest.raises(ValueError): + get_column(select(column("a")), "b") + + +def test_get_column_names(test_table): + """Test get_column_names fn.""" + assert get_column_names(test_table) == ["a", "b", "c"] + + +def test_filter_columns(test_table): + """Test filter_columns fn.""" + filtered = filter_columns(test_table, ["a", "c", "d"]) + assert get_column_names(filtered) == ["a", "c"] + + +def test_has_columns(test_table): + """Test has_columns fn.""" + assert not has_columns(test_table, ["a", "d"]) + assert has_columns(test_table, ["a", "b"]) + with pytest.raises(ValueError): + has_columns(test_table, ["a", "d"], raise_error=True) + + +def test_drop_columns(test_table): + """Test drop_columns fn.""" + after_drop = drop_columns(test_table, ["a"]) + assert get_column_names(after_drop) == ["b", "c"] + + +def test_rename_columns(test_table): + """Test rename_columns fn.""" + after_rename = rename_columns(test_table, {"a": "apple", "b": "ball"}) + assert get_column_names(after_rename) == ["apple", "ball", "c"] + + +def test_reorder_columns(test_table): + """Test reorder_columns fn.""" + with pytest.raises(ValueError): + reorder_columns(test_table, ["ball", "c", "a"]) + with pytest.raises(ValueError): + reorder_columns(test_table, ["c", "a"]) + after_reorder = reorder_columns(test_table, ["b", "c", "a"]) + assert get_column_names(after_reorder) == ["b", "c", "a"] + + +def test_trim_columns(test_table): + """Test apply_to_columns fn.""" + after_trim = trim_columns(test_table, ["a"], ["apple"]) + assert get_column_names(after_trim) == ["a", "b", "c", "apple"] + + +def test_process_elem(): + """Test process_elem fn.""" + assert process_elem("Test", lower=True) == "test" + assert process_elem("Test ", lower=True, trim=True) == "test" + assert process_elem("1", to_int=True) == 1 + assert process_elem("1.2", to_float=True) == 1.2 + assert process_elem(1, to_bool=True) is True + assert process_elem(0, to_bool=True) is False + + +def test_process_list(): + """Test process_list fn.""" + assert process_list([1, 2, 3, 0], to_bool=True) == [True, True, True, False] + + +def test_process_column(): + """Test process_column fn.""" + test_col = column("a") + processed_col = process_column(test_col, to_int=True) + assert str(processed_col) == "CAST(a AS INTEGER)" + processed_col = process_column(test_col, to_float=True) + assert str(processed_col) == "CAST(a AS FLOAT)" + processed_col = process_column(test_col, to_str=True) + assert str(processed_col) == "CAST(a AS VARCHAR)" + processed_col = process_column(test_col, to_bool=True) + assert str(processed_col) == "CAST(a AS BOOLEAN)" + processed_col = process_column(test_col, to_date=True) + assert str(processed_col) == "CAST(a AS DATE)" + processed_col = process_column(test_col, to_timestamp=True) + assert str(processed_col) == "CAST(a AS DATETIME)" + test_col.type = "VARCHAR" + processed_col = process_column(test_col, lower=True, trim=True) + assert str(processed_col) == "trim(lower(a))" + + +def test_equals(): + """Test equals fn.""" + test_col = column("a") + assert str(equals(test_col, "bat")) == "a = :a_1" + + +def test_greater_than(): + """Test greater_than fn.""" + test_col = column("a") + assert str(greater_than(test_col, 1)) == "a > :a_1" + assert str(greater_than(test_col, 1, equal=True)) == "a >= :a_1" + + +def test_less_than(): + """Test less_than fn.""" + test_col = column("a") + assert str(less_than(test_col, 1)) == "a < :a_1" + assert str(less_than(test_col, 1, equal=True)) == "a <= :a_1" + + +def test_not_equals(): + """Test not_equals fn.""" + test_col = column("a") + assert str(not_equals(test_col, "bat")) == "a != :a_1" From 023c6ff529b136b519971829d56aa43c83d8c679 Mon Sep 17 00:00:00 2001 From: Amrit K Date: Fri, 20 Oct 2023 00:09:27 -0400 Subject: [PATCH 2/4] Update setup-python action --- .github/workflows/code_checks.yml | 2 +- .github/workflows/docs_build.yml | 2 +- .github/workflows/docs_deploy.yml | 2 +- .github/workflows/integration_tests.yml | 2 +- .github/workflows/publish.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index 3dfdeb4..5ad46dc 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v3 - name: Install poetry run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - - uses: actions/setup-python@v4.3.0 + - uses: actions/setup-python@v4.7.1 with: python-version: 3.10 cache: 'poetry' diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index bab616a..7231fc1 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -23,7 +23,7 @@ jobs: submodules: 'true' - name: Install dependencies, build docs and coverage report run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - - uses: actions/setup-python@v4.3.0 + - uses: actions/setup-python@v4.7.1 with: python-version: 3.10 cache: 'poetry' diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml index dd785e3..dba9c26 100644 --- a/.github/workflows/docs_deploy.yml +++ b/.github/workflows/docs_deploy.yml @@ -27,7 +27,7 @@ jobs: submodules: 'true' - name: Install dependencies, build docs and coverage report run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - - uses: actions/setup-python@v4.3.0 + - uses: actions/setup-python@v4.7.1 with: python-version: 3.10 cache: 'poetry' diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 704a81d..9989dbd 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -39,7 +39,7 @@ jobs: - uses: actions/checkout@v3 - name: Install poetry run: pip install poetry - - uses: actions/setup-python@v4.3.0 + - uses: actions/setup-python@v4.7.1 with: python-version: 3.10 - name: Install dependencies and check code diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 69faa31..e3ede91 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v3 - name: Install poetry run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - - uses: actions/setup-python@v4.3.0 + - uses: actions/setup-python@v4.7.1 with: python-version: 3.10 - name: Build package From e58fa5afa95f4bc912063d5dcb94e4685b4a88ea Mon Sep 17 00:00:00 2001 From: Amrit K Date: Fri, 20 Oct 2023 11:38:03 -0400 Subject: [PATCH 3/4] Fix workflow action file --- .github/workflows/code_checks.yml | 4 ++-- .github/workflows/docs_build.yml | 4 ++-- .github/workflows/docs_deploy.yml | 5 ++--- .github/workflows/integration_tests.yml | 4 ++-- .github/workflows/publish.yml | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index 5ad46dc..267469e 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -31,11 +31,11 @@ jobs: run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - uses: actions/setup-python@v4.7.1 with: - python-version: 3.10 + python-version: '3.10' cache: 'poetry' - name: Install dependencies and check code run: | - poetry env use 3.10 + poetry env use '3.10' source $(poetry env info --path)/bin/activate poetry install --without docs pre-commit run --all-files diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index 7231fc1..b914dea 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -25,11 +25,11 @@ jobs: run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - uses: actions/setup-python@v4.7.1 with: - python-version: 3.10 + python-version: '3.10' cache: 'poetry' - run: | python3 -m pip install --upgrade pip && python3 -m pip install poetry - poetry env use 3.10 + poetry env use '3.10' source $(poetry env info --path)/bin/activate poetry install # pandoc README.md -f markdown -t rst -s -o docs/source/intro.rst diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml index dba9c26..0f7ed7c 100644 --- a/.github/workflows/docs_deploy.yml +++ b/.github/workflows/docs_deploy.yml @@ -12,7 +12,6 @@ on: - .github/workflows/integration_tests.yml - '**.py' - '**.ipynb' - - '**.jinja' - poetry.lock - pyproject.toml - '**.rst' @@ -29,10 +28,10 @@ jobs: run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - uses: actions/setup-python@v4.7.1 with: - python-version: 3.10 + python-version: '3.10' cache: 'poetry' - run: | - poetry env use 3.10 + poetry env use '3.10' source $(poetry env info --path)/bin/activate poetry install # pandoc README.md -f markdown -t rst -s -o docs/source/intro.rst diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 9989dbd..2e63250 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -41,10 +41,10 @@ jobs: run: pip install poetry - uses: actions/setup-python@v4.7.1 with: - python-version: 3.10 + python-version: '3.10' - name: Install dependencies and check code run: | - poetry env use 3.10 + poetry env use '3.10' source $(poetry env info --path)/bin/activate poetry install --without docs coverage run -m pytest -m integration_test && coverage xml && coverage report -m diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e3ede91..d169cbb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,7 +17,7 @@ jobs: run: python3 -m pip install --upgrade pip && python3 -m pip install poetry - uses: actions/setup-python@v4.7.1 with: - python-version: 3.10 + python-version: '3.10' - name: Build package run: poetry build - name: Publish package From 7e992423cd26adb111283d12f67e1cab9b9bb87a Mon Sep 17 00:00:00 2001 From: Amrit K Date: Fri, 20 Oct 2023 11:41:10 -0400 Subject: [PATCH 4/4] Remove gpu tag, to be able to run on correct runner --- .github/workflows/docs_build.yml | 2 +- .github/workflows/docs_deploy.yml | 2 +- .github/workflows/integration_tests.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index b914dea..4bd2567 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -16,7 +16,7 @@ on: jobs: build: - runs-on: [self-hosted, db, gpu] + runs-on: [self-hosted, db] steps: - uses: actions/checkout@v3 with: diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml index 0f7ed7c..2f4c4a2 100644 --- a/.github/workflows/docs_deploy.yml +++ b/.github/workflows/docs_deploy.yml @@ -19,7 +19,7 @@ on: jobs: deploy: - runs-on: [self-hosted, db, gpu] + runs-on: [self-hosted, db] steps: - uses: actions/checkout@v3 with: diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 2e63250..e4b698a 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -34,7 +34,7 @@ on: jobs: integration-tests: - runs-on: [self-hosted, gpu, db] + runs-on: [self-hosted, db] steps: - uses: actions/checkout@v3 - name: Install poetry