├── .github
├── pylint-requirements.txt
└── workflows
│ └── pylint.yml
├── .gitignore
├── .streamlit
├── config.toml
└── secrets_template.toml
├── .vscode
├── launch.json
├── settings.json
└── task.json
├── CHANGELOG.md
├── Pipfile
├── Pipfile.lock
├── README.md
├── data
├── data1
│ ├── -Qualitative Data Analysis Worksheet.pdf
│ ├── transcriptA.md
│ ├── transcriptB.md
│ └── transcriptC.md
└── data2
│ ├── question.md
│ ├── transcript1.md
│ ├── transcript2.md
│ ├── transcript3.md
│ └── transcript4.md
├── packages.txt
├── requirements.txt
├── scripts
├── getting_started.sh
└── push_tag.sh
└── source
├── __init__.py
├── modules
├── __init__.py
├── chains.py
├── output_parsers.py
└── report.py
├── qualitative_analyse_agent.py
└── version.py
/.github/pylint-requirements.txt:
--------------------------------------------------------------------------------
1 | pylint-quotes
2 | langchain
3 | structlog
4 | openai
5 | toml>=0.10.1, <2
6 | tiktoken
7 | streamlit
8 | python-dotenv
--------------------------------------------------------------------------------
/.github/workflows/pylint.yml:
--------------------------------------------------------------------------------
1 | name: Pylint
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | matrix:
10 | python-version: ["3.9", "3.10"]
11 | steps:
12 | - uses: actions/checkout@v3
13 | - name: Set up Python ${{ matrix.python-version }}
14 | uses: actions/setup-python@v3
15 | with:
16 | python-version: ${{ matrix.python-version }}
17 | - name: Install dependencies
18 | run: |
19 | python -m pip install --upgrade pip
20 | python -m pip install -r .github/pylint-requirements.txt
21 | - name: linting with pylint
22 | run: pylint $(git ls-files '*.py') --fail-under=5
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .streamlit/secrets.toml
2 |
3 | # Byte-compiled / optimized / DLL files
4 | __pycache__/
5 | *.py[cod]
6 | *$py.class
7 |
8 | # C extensions
9 | *.so
10 |
11 | # Distribution / packaging
12 | .Python
13 | build/
14 | develop-eggs/
15 | dist/
16 | downloads/
17 | eggs/
18 | .eggs/
19 | lib/
20 | lib64/
21 | parts/
22 | sdist/
23 | var/
24 | wheels/
25 | share/python-wheels/
26 | *.egg-info/
27 | .installed.cfg
28 | *.egg
29 | MANIFEST
30 |
31 | # PyInstaller
32 | # Usually these files are written by a python script from a template
33 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
34 | *.manifest
35 | *.spec
36 |
37 | # Installer logs
38 | pip-log.txt
39 | pip-delete-this-directory.txt
40 |
41 | # Unit test / coverage reports
42 | htmlcov/
43 | .tox/
44 | .nox/
45 | .coverage
46 | .coverage.*
47 | .cache
48 | nosetests.xml
49 | coverage.xml
50 | *.cover
51 | *.py,cover
52 | .hypothesis/
53 | .pytest_cache/
54 | cover/
55 |
56 | # Translations
57 | *.mo
58 | *.pot
59 |
60 | # Django stuff:
61 | *.log
62 | local_settings.py
63 | db.sqlite3
64 | db.sqlite3-journal
65 |
66 | # Flask stuff:
67 | instance/
68 | .webassets-cache
69 |
70 | # Scrapy stuff:
71 | .scrapy
72 |
73 | # Sphinx documentation
74 | docs/_build/
75 |
76 | # PyBuilder
77 | .pybuilder/
78 | target/
79 |
80 | # Jupyter Notebook
81 | .ipynb_checkpoints
82 |
83 | # IPython
84 | profile_default/
85 | ipython_config.py
86 |
87 | # pyenv
88 | # For a library or package, you might want to ignore these files since the code is
89 | # intended to run in multiple environments; otherwise, check them in:
90 | # .python-version
91 |
92 | # pipenv
93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
96 | # install all needed dependencies.
97 | #Pipfile.lock
98 |
99 | # poetry
100 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
101 | # This is especially recommended for binary packages to ensure reproducibility, and is more
102 | # commonly ignored for libraries.
103 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
104 | #poetry.lock
105 |
106 | # pdm
107 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
108 | #pdm.lock
109 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
110 | # in version control.
111 | # https://pdm.fming.dev/#use-with-ide
112 | .pdm.toml
113 |
114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115 | __pypackages__/
116 |
117 | # Celery stuff
118 | celerybeat-schedule
119 | celerybeat.pid
120 |
121 | # SageMath parsed files
122 | *.sage.py
123 |
124 | # Environments
125 | .env
126 | .venv
127 | env/
128 | venv/
129 | ENV/
130 | env.bak/
131 | venv.bak/
132 |
133 | # Spyder project settings
134 | .spyderproject
135 | .spyproject
136 |
137 | # Rope project settings
138 | .ropeproject
139 |
140 | # mkdocs documentation
141 | /site
142 |
143 | # mypy
144 | .mypy_cache/
145 | .dmypy.json
146 | dmypy.json
147 |
148 | # Pyre type checker
149 | .pyre/
150 |
151 | # pytype static type analyzer
152 | .pytype/
153 |
154 | # Cython debug symbols
155 | cython_debug/
156 |
157 | # PyCharm
158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160 | # and can be added to the global gitignore or merged into this file. For a more nuclear
161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162 | #.idea/
163 |
--------------------------------------------------------------------------------
/.streamlit/config.toml:
--------------------------------------------------------------------------------
1 | [theme]
2 | base="dark"
3 | [server]
4 | runOnSave = true
--------------------------------------------------------------------------------
/.streamlit/secrets_template.toml:
--------------------------------------------------------------------------------
1 | openai_api_key = "your key here"
2 |
3 | [langchain]
4 | debug = "false"
5 |
6 | [langsmith]
7 | tracing = "true"
8 | api_url = "https://api.smith.langchain.com"
9 | api_key = "your key here"
10 | project = "your project here"
11 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Python:Streamlit",
9 | "type": "python",
10 | "request": "launch",
11 | "module": "streamlit",
12 | "args": [
13 | "run",
14 | "${file}",
15 | "--server.port",
16 | "8502"
17 | ]
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.formatting.provider": "black",
3 | "python.formatting.blackArgs": [
4 | "--line-length",
5 | "88 "
6 | ],
7 | "python.linting.enabled": true,
8 | "python.linting.lintOnSave": true,
9 | "python.linting.flake8Enabled": true,
10 | "python.linting.flake8Args": [
11 | "--max-line-length",
12 | "88 "
13 | ],
14 | "editor.formatOnSave": true,
15 | }
--------------------------------------------------------------------------------
/.vscode/task.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0.0",
3 | "tasks": [
4 | {
5 | "label": "Push tag",
6 | "type": "shell",
7 | "command": "./scripts/push_tag.sh",
8 | "group": "git",
9 | "presentation": {
10 | "reveal": "always",
11 | "panel": "new"
12 | }
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## [0.2.0] - 2025-01-20
9 |
10 | - Add a script to get started
11 | - Add a secrets.toml file to store your OpenAI API key
12 | - Fix getting-started.sh script
13 | - Add requirements.txt file
14 |
15 | ## [0.1.0] - 2023-09-10
16 |
17 | First version of the Qualitative Analysis Data tool.
18 |
19 | ### Added
20 |
21 | - Upload your transcripts 📂
22 | - Generate Summary on all data or on a specific data 📊
23 | - Based on a research question generate a summary of the data, generate codes and themes. ❓
24 | - Update Qualitative Analysis Data parameters 🔄
25 | - Generate a Qualitative Data Analysis report and download it 📄
26 |
27 | [unreleased]: https://github.com/Gamma-Software/llm_qualitative_data_analysis/compare/v0.0.1...HEAD
28 | [0.0.1]: https://github.com/Gamma-Software/llm_qualitative_data_analysis/releases/tag/v0.0.1
29 |
--------------------------------------------------------------------------------
/Pipfile:
--------------------------------------------------------------------------------
1 | [[source]]
2 | url = "https://pypi.org/simple"
3 | verify_ssl = true
4 | name = "pypi"
5 |
6 | [packages]
7 | streamlit = "*"
8 | openai = "*"
9 | langchain = ">=0.3.0"
10 | pandas = "*"
11 | langchain-openai = "*"
12 | langchain-community = "*"
13 |
14 | [dev-packages]
15 |
16 | [requires]
17 | python_version = "3.11"
18 |
--------------------------------------------------------------------------------
/Pipfile.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_meta": {
3 | "hash": {
4 | "sha256": "d541d1c9cd7819a2e8418844253b2f973d9023c44dd5ce1017930868f47500c3"
5 | },
6 | "pipfile-spec": 6,
7 | "requires": {
8 | "python_version": "3.11"
9 | },
10 | "sources": [
11 | {
12 | "name": "pypi",
13 | "url": "https://pypi.org/simple",
14 | "verify_ssl": true
15 | }
16 | ]
17 | },
18 | "default": {
19 | "aiohappyeyeballs": {
20 | "hashes": [
21 | "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586",
22 | "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"
23 | ],
24 | "markers": "python_version >= '3.8'",
25 | "version": "==2.4.3"
26 | },
27 | "aiohttp": {
28 | "hashes": [
29 | "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0",
30 | "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668",
31 | "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9",
32 | "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50",
33 | "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d",
34 | "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf",
35 | "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a",
36 | "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307",
37 | "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6",
38 | "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884",
39 | "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341",
40 | "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347",
41 | "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4",
42 | "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb",
43 | "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53",
44 | "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08",
45 | "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8",
46 | "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca",
47 | "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f",
48 | "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997",
49 | "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba",
50 | "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491",
51 | "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7",
52 | "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da",
53 | "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12",
54 | "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687",
55 | "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629",
56 | "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544",
57 | "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e",
58 | "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4",
59 | "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e",
60 | "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e",
61 | "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d",
62 | "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52",
63 | "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd",
64 | "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66",
65 | "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33",
66 | "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2",
67 | "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5",
68 | "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd",
69 | "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f",
70 | "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129",
71 | "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70",
72 | "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68",
73 | "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac",
74 | "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935",
75 | "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60",
76 | "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8",
77 | "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866",
78 | "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43",
79 | "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb",
80 | "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629",
81 | "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847",
82 | "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d",
83 | "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2",
84 | "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106",
85 | "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949",
86 | "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932",
87 | "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48",
88 | "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124",
89 | "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01",
90 | "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa",
91 | "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889",
92 | "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720",
93 | "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6",
94 | "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea",
95 | "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184",
96 | "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79",
97 | "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d",
98 | "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791",
99 | "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e",
100 | "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be",
101 | "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962",
102 | "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0",
103 | "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9",
104 | "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1"
105 | ],
106 | "markers": "python_version >= '3.9'",
107 | "version": "==3.11.7"
108 | },
109 | "aiosignal": {
110 | "hashes": [
111 | "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc",
112 | "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"
113 | ],
114 | "markers": "python_version >= '3.7'",
115 | "version": "==1.3.1"
116 | },
117 | "altair": {
118 | "hashes": [
119 | "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c",
120 | "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d"
121 | ],
122 | "markers": "python_version >= '3.9'",
123 | "version": "==5.5.0"
124 | },
125 | "annotated-types": {
126 | "hashes": [
127 | "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
128 | "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
129 | ],
130 | "markers": "python_version >= '3.8'",
131 | "version": "==0.7.0"
132 | },
133 | "anyio": {
134 | "hashes": [
135 | "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c",
136 | "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"
137 | ],
138 | "markers": "python_version >= '3.9'",
139 | "version": "==4.6.2.post1"
140 | },
141 | "attrs": {
142 | "hashes": [
143 | "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346",
144 | "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"
145 | ],
146 | "markers": "python_version >= '3.7'",
147 | "version": "==24.2.0"
148 | },
149 | "blinker": {
150 | "hashes": [
151 | "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf",
152 | "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"
153 | ],
154 | "markers": "python_version >= '3.9'",
155 | "version": "==1.9.0"
156 | },
157 | "cachetools": {
158 | "hashes": [
159 | "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292",
160 | "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"
161 | ],
162 | "markers": "python_version >= '3.7'",
163 | "version": "==5.5.0"
164 | },
165 | "certifi": {
166 | "hashes": [
167 | "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
168 | "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"
169 | ],
170 | "markers": "python_version >= '3.6'",
171 | "version": "==2024.8.30"
172 | },
173 | "charset-normalizer": {
174 | "hashes": [
175 | "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621",
176 | "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6",
177 | "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8",
178 | "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912",
179 | "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c",
180 | "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b",
181 | "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d",
182 | "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d",
183 | "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95",
184 | "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e",
185 | "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565",
186 | "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64",
187 | "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab",
188 | "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be",
189 | "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e",
190 | "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907",
191 | "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0",
192 | "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2",
193 | "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62",
194 | "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62",
195 | "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23",
196 | "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc",
197 | "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284",
198 | "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca",
199 | "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455",
200 | "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858",
201 | "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b",
202 | "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594",
203 | "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc",
204 | "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db",
205 | "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b",
206 | "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea",
207 | "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6",
208 | "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920",
209 | "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749",
210 | "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7",
211 | "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd",
212 | "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99",
213 | "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242",
214 | "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee",
215 | "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129",
216 | "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2",
217 | "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51",
218 | "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee",
219 | "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8",
220 | "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b",
221 | "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613",
222 | "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742",
223 | "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe",
224 | "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3",
225 | "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5",
226 | "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631",
227 | "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7",
228 | "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15",
229 | "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c",
230 | "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea",
231 | "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417",
232 | "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250",
233 | "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88",
234 | "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca",
235 | "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa",
236 | "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99",
237 | "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149",
238 | "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41",
239 | "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574",
240 | "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0",
241 | "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f",
242 | "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d",
243 | "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654",
244 | "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3",
245 | "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19",
246 | "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90",
247 | "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578",
248 | "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9",
249 | "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1",
250 | "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51",
251 | "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719",
252 | "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236",
253 | "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a",
254 | "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c",
255 | "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade",
256 | "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944",
257 | "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc",
258 | "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6",
259 | "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6",
260 | "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27",
261 | "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6",
262 | "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2",
263 | "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12",
264 | "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf",
265 | "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114",
266 | "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7",
267 | "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf",
268 | "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d",
269 | "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b",
270 | "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed",
271 | "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03",
272 | "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4",
273 | "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67",
274 | "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365",
275 | "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a",
276 | "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748",
277 | "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b",
278 | "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079",
279 | "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"
280 | ],
281 | "markers": "python_full_version >= '3.7.0'",
282 | "version": "==3.4.0"
283 | },
284 | "click": {
285 | "hashes": [
286 | "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
287 | "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
288 | ],
289 | "markers": "python_version >= '3.7'",
290 | "version": "==8.1.7"
291 | },
292 | "dataclasses-json": {
293 | "hashes": [
294 | "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a",
295 | "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"
296 | ],
297 | "markers": "python_version >= '3.7' and python_version < '4.0'",
298 | "version": "==0.6.7"
299 | },
300 | "distro": {
301 | "hashes": [
302 | "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed",
303 | "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"
304 | ],
305 | "markers": "python_version >= '3.6'",
306 | "version": "==1.9.0"
307 | },
308 | "frozenlist": {
309 | "hashes": [
310 | "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e",
311 | "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf",
312 | "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6",
313 | "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a",
314 | "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d",
315 | "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f",
316 | "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28",
317 | "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b",
318 | "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9",
319 | "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2",
320 | "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec",
321 | "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2",
322 | "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c",
323 | "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336",
324 | "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4",
325 | "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d",
326 | "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b",
327 | "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c",
328 | "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10",
329 | "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08",
330 | "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942",
331 | "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8",
332 | "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f",
333 | "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10",
334 | "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5",
335 | "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6",
336 | "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21",
337 | "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c",
338 | "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d",
339 | "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923",
340 | "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608",
341 | "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de",
342 | "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17",
343 | "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0",
344 | "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f",
345 | "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641",
346 | "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c",
347 | "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a",
348 | "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0",
349 | "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9",
350 | "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab",
351 | "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f",
352 | "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3",
353 | "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a",
354 | "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784",
355 | "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604",
356 | "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d",
357 | "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5",
358 | "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03",
359 | "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e",
360 | "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953",
361 | "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee",
362 | "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d",
363 | "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817",
364 | "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3",
365 | "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039",
366 | "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f",
367 | "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9",
368 | "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf",
369 | "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76",
370 | "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba",
371 | "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171",
372 | "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb",
373 | "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439",
374 | "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631",
375 | "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972",
376 | "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d",
377 | "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869",
378 | "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9",
379 | "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411",
380 | "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723",
381 | "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2",
382 | "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b",
383 | "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99",
384 | "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e",
385 | "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840",
386 | "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3",
387 | "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb",
388 | "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3",
389 | "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0",
390 | "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca",
391 | "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45",
392 | "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e",
393 | "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f",
394 | "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5",
395 | "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307",
396 | "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e",
397 | "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2",
398 | "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778",
399 | "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a",
400 | "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30",
401 | "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"
402 | ],
403 | "markers": "python_version >= '3.8'",
404 | "version": "==1.5.0"
405 | },
406 | "gitdb": {
407 | "hashes": [
408 | "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4",
409 | "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"
410 | ],
411 | "markers": "python_version >= '3.7'",
412 | "version": "==4.0.11"
413 | },
414 | "gitpython": {
415 | "hashes": [
416 | "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c",
417 | "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"
418 | ],
419 | "markers": "python_version >= '3.7'",
420 | "version": "==3.1.43"
421 | },
422 | "h11": {
423 | "hashes": [
424 | "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
425 | "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
426 | ],
427 | "markers": "python_version >= '3.7'",
428 | "version": "==0.14.0"
429 | },
430 | "httpcore": {
431 | "hashes": [
432 | "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c",
433 | "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"
434 | ],
435 | "markers": "python_version >= '3.8'",
436 | "version": "==1.0.7"
437 | },
438 | "httpx": {
439 | "hashes": [
440 | "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0",
441 | "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"
442 | ],
443 | "markers": "python_version >= '3.8'",
444 | "version": "==0.27.2"
445 | },
446 | "httpx-sse": {
447 | "hashes": [
448 | "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721",
449 | "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"
450 | ],
451 | "markers": "python_version >= '3.8'",
452 | "version": "==0.4.0"
453 | },
454 | "idna": {
455 | "hashes": [
456 | "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
457 | "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
458 | ],
459 | "markers": "python_version >= '3.6'",
460 | "version": "==3.10"
461 | },
462 | "jinja2": {
463 | "hashes": [
464 | "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
465 | "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
466 | ],
467 | "markers": "python_version >= '3.7'",
468 | "version": "==3.1.4"
469 | },
470 | "jiter": {
471 | "hashes": [
472 | "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1",
473 | "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba",
474 | "sha256:0a7d5e85766eff4c9be481d77e2226b4c259999cb6862ccac5ef6621d3c8dcce",
475 | "sha256:0e2b445e5ee627fb4ee6bbceeb486251e60a0c881a8e12398dfdff47c56f0723",
476 | "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a",
477 | "sha256:191fbaee7cf46a9dd9b817547bf556facde50f83199d07fc48ebeff4082f9df4",
478 | "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab",
479 | "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5",
480 | "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963",
481 | "sha256:262e96d06696b673fad6f257e6a0abb6e873dc22818ca0e0600f4a1189eb334f",
482 | "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d",
483 | "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378",
484 | "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0",
485 | "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490",
486 | "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d",
487 | "sha256:47ac4c3cf8135c83e64755b7276339b26cd3c7ddadf9e67306ace4832b283edf",
488 | "sha256:4aa919ebfc5f7b027cc368fe3964c0015e1963b92e1db382419dadb098a05192",
489 | "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50",
490 | "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a",
491 | "sha256:5ae2d01e82c94491ce4d6f461a837f63b6c4e6dd5bb082553a70c509034ff3d4",
492 | "sha256:5c08adf93e41ce2755970e8aa95262298afe2bf58897fb9653c47cd93c3c6cdc",
493 | "sha256:60b49c245cd90cde4794f5c30f123ee06ccf42fb8730a019a2870cd005653ebd",
494 | "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172",
495 | "sha256:6592f4067c74176e5f369228fb2995ed01400c9e8e1225fb73417183a5e635f0",
496 | "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044",
497 | "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e",
498 | "sha256:70a497859c4f3f7acd71c8bd89a6f9cf753ebacacf5e3e799138b8e1843084e3",
499 | "sha256:75bf3b7fdc5c0faa6ffffcf8028a1f974d126bac86d96490d1b51b3210aa0f3f",
500 | "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533",
501 | "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb",
502 | "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d",
503 | "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b",
504 | "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c",
505 | "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43",
506 | "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479",
507 | "sha256:8dbbd52c50b605af13dbee1a08373c520e6fcc6b5d32f17738875847fea4e2cd",
508 | "sha256:8f212eeacc7203256f526f550d105d8efa24605828382cd7d296b703181ff11d",
509 | "sha256:935f10b802bc1ce2b2f61843e498c7720aa7f4e4bb7797aa8121eab017293c3d",
510 | "sha256:93c20d2730a84d43f7c0b6fb2579dc54335db742a59cf9776d0b80e99d587382",
511 | "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6",
512 | "sha256:9cd3cccccabf5064e4bb3099c87bf67db94f805c1e62d1aefd2b7476e90e0ee2",
513 | "sha256:9ecbf4e20ec2c26512736284dc1a3f8ed79b6ca7188e3b99032757ad48db97dc",
514 | "sha256:9f9568cd66dbbdab67ae1b4c99f3f7da1228c5682d65913e3f5f95586b3cb9a9",
515 | "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c",
516 | "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca",
517 | "sha256:af29c5c6eb2517e71ffa15c7ae9509fa5e833ec2a99319ac88cc271eca865519",
518 | "sha256:b096ca72dd38ef35675e1d3b01785874315182243ef7aea9752cb62266ad516f",
519 | "sha256:b1a0508fddc70ce00b872e463b387d49308ef02b0787992ca471c8d4ba1c0fa1",
520 | "sha256:bc1b55314ca97dbb6c48d9144323896e9c1a25d41c65bcb9550b3e0c270ca560",
521 | "sha256:be6de02939aac5be97eb437f45cfd279b1dc9de358b13ea6e040e63a3221c40d",
522 | "sha256:c1288bc22b9e36854a0536ba83666c3b1fb066b811019d7b682c9cf0269cdf9f",
523 | "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74",
524 | "sha256:c65a3ce72b679958b79d556473f192a4dfc5895e8cc1030c9f4e434690906076",
525 | "sha256:c915e1a1960976ba4dfe06551ea87063b2d5b4d30759012210099e712a414d9f",
526 | "sha256:d9e247079d88c00e75e297e6cb3a18a039ebcd79fefc43be9ba4eb7fb43eb726",
527 | "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff",
528 | "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8",
529 | "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143",
530 | "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea",
531 | "sha256:e0c91a0304373fdf97d56f88356a010bba442e6d995eb7773cbe32885b71cdd8",
532 | "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627",
533 | "sha256:e80052d3db39f9bb8eb86d207a1be3d9ecee5e05fdec31380817f9609ad38e60",
534 | "sha256:e81ccccd8069110e150613496deafa10da2f6ff322a707cbec2b0d52a87b9671",
535 | "sha256:f0aacaa56360139c53dcf352992b0331f4057a0373bbffd43f64ba0c32d2d155",
536 | "sha256:f114a4df1e40c03c0efbf974b376ed57756a1141eb27d04baee0680c5af3d424",
537 | "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce",
538 | "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc",
539 | "sha256:f281aae41b47e90deb70e7386558e877a8e62e1693e0086f37d015fa1c102289",
540 | "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282",
541 | "sha256:f52ce5799df5b6975439ecb16b1e879d7655e1685b6e3758c9b1b97696313bfb",
542 | "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892",
543 | "sha256:f84c9996664c460f24213ff1e5881530abd8fafd82058d39af3682d5fd2d6316",
544 | "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac"
545 | ],
546 | "markers": "python_version >= '3.8'",
547 | "version": "==0.7.1"
548 | },
549 | "jsonpatch": {
550 | "hashes": [
551 | "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade",
552 | "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"
553 | ],
554 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
555 | "version": "==1.33"
556 | },
557 | "jsonpointer": {
558 | "hashes": [
559 | "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942",
560 | "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"
561 | ],
562 | "markers": "python_version >= '3.7'",
563 | "version": "==3.0.0"
564 | },
565 | "jsonschema": {
566 | "hashes": [
567 | "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4",
568 | "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"
569 | ],
570 | "markers": "python_version >= '3.8'",
571 | "version": "==4.23.0"
572 | },
573 | "jsonschema-specifications": {
574 | "hashes": [
575 | "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272",
576 | "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"
577 | ],
578 | "markers": "python_version >= '3.9'",
579 | "version": "==2024.10.1"
580 | },
581 | "langchain": {
582 | "hashes": [
583 | "sha256:1cbbf7379b5b2f11b751fc527016f29ee5fe8a2697d166b52b7b5c63fc9702f9",
584 | "sha256:5cae404da30bf6730639a9ad85d3bf4fbb350c0038e5a0b81890e5883b4cff5c"
585 | ],
586 | "index": "pypi",
587 | "markers": "python_version >= '3.9' and python_version < '4.0'",
588 | "version": "==0.3.8"
589 | },
590 | "langchain-community": {
591 | "hashes": [
592 | "sha256:191b3fcdf6b2e92934f4daeba5f5d0ac684b03772b15ef9d3c3fbcd86bd6cd64",
593 | "sha256:f7575a717d95208d0e969c090104622783c6a38a5527657aa5aa38776fadc835"
594 | ],
595 | "index": "pypi",
596 | "markers": "python_version >= '3.9' and python_version < '4.0'",
597 | "version": "==0.3.8"
598 | },
599 | "langchain-core": {
600 | "hashes": [
601 | "sha256:561b52b258ffa50a9fb11d7a1940ebfd915654d1ec95b35e81dfd5ee84143411",
602 | "sha256:7e723dff80946a1198976c6876fea8326dc82566ef9bcb5f8d9188f738733665"
603 | ],
604 | "markers": "python_version >= '3.9' and python_version < '4.0'",
605 | "version": "==0.3.21"
606 | },
607 | "langchain-openai": {
608 | "hashes": [
609 | "sha256:2723015e56879f9e5edfcb175fdbec6c296c1b3bf65caad28579ce9c4d1bd652",
610 | "sha256:38a0f2004f17cdad622d46d4dcfb92d75adbf51909dadc76d0360dd94b0d4f70"
611 | ],
612 | "index": "pypi",
613 | "markers": "python_version >= '3.9' and python_version < '4.0'",
614 | "version": "==0.2.9"
615 | },
616 | "langchain-text-splitters": {
617 | "hashes": [
618 | "sha256:0db28c53f41d1bc024cdb3b1646741f6d46d5371e90f31e7e7c9fbe75d01c726",
619 | "sha256:81e6515d9901d6dd8e35fb31ccd4f30f76d44b771890c789dc835ef9f16204df"
620 | ],
621 | "markers": "python_version >= '3.9' and python_version < '4.0'",
622 | "version": "==0.3.2"
623 | },
624 | "langsmith": {
625 | "hashes": [
626 | "sha256:9d062222f1a32c9b047dab0149b24958f988989cd8d4a5f9139ff959a51e59d8",
627 | "sha256:ead8b0b9d5b6cd3ac42937ec48bdf09d4afe7ca1bba22dc05eb65591a18106f8"
628 | ],
629 | "markers": "python_full_version >= '3.8.1' and python_version < '4.0'",
630 | "version": "==0.1.146"
631 | },
632 | "markdown-it-py": {
633 | "hashes": [
634 | "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
635 | "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
636 | ],
637 | "markers": "python_version >= '3.8'",
638 | "version": "==3.0.0"
639 | },
640 | "markupsafe": {
641 | "hashes": [
642 | "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
643 | "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
644 | "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
645 | "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
646 | "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
647 | "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
648 | "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
649 | "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
650 | "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
651 | "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
652 | "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
653 | "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
654 | "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
655 | "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
656 | "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
657 | "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
658 | "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
659 | "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
660 | "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
661 | "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
662 | "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
663 | "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
664 | "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
665 | "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
666 | "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
667 | "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
668 | "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
669 | "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
670 | "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
671 | "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
672 | "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
673 | "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
674 | "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
675 | "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
676 | "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
677 | "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
678 | "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
679 | "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
680 | "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
681 | "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
682 | "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
683 | "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
684 | "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
685 | "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
686 | "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
687 | "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
688 | "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
689 | "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
690 | "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
691 | "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
692 | "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
693 | "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
694 | "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
695 | "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
696 | "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
697 | "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
698 | "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
699 | "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
700 | "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
701 | "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
702 | "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
703 | ],
704 | "markers": "python_version >= '3.9'",
705 | "version": "==3.0.2"
706 | },
707 | "marshmallow": {
708 | "hashes": [
709 | "sha256:3a8dfda6edd8dcdbf216c0ede1d1e78d230a6dc9c5a088f58c4083b974a0d468",
710 | "sha256:fece2eb2c941180ea1b7fcbd4a83c51bfdd50093fdd3ad2585ee5e1df2508491"
711 | ],
712 | "markers": "python_version >= '3.9'",
713 | "version": "==3.23.1"
714 | },
715 | "mdurl": {
716 | "hashes": [
717 | "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
718 | "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
719 | ],
720 | "markers": "python_version >= '3.7'",
721 | "version": "==0.1.2"
722 | },
723 | "multidict": {
724 | "hashes": [
725 | "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f",
726 | "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056",
727 | "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761",
728 | "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3",
729 | "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b",
730 | "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6",
731 | "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748",
732 | "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966",
733 | "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f",
734 | "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1",
735 | "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6",
736 | "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada",
737 | "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305",
738 | "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2",
739 | "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d",
740 | "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a",
741 | "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef",
742 | "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c",
743 | "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb",
744 | "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60",
745 | "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6",
746 | "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4",
747 | "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478",
748 | "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81",
749 | "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7",
750 | "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56",
751 | "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3",
752 | "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6",
753 | "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30",
754 | "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb",
755 | "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506",
756 | "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0",
757 | "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925",
758 | "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c",
759 | "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6",
760 | "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e",
761 | "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95",
762 | "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2",
763 | "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133",
764 | "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2",
765 | "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa",
766 | "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3",
767 | "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3",
768 | "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436",
769 | "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657",
770 | "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581",
771 | "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492",
772 | "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43",
773 | "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2",
774 | "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2",
775 | "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926",
776 | "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057",
777 | "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc",
778 | "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80",
779 | "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255",
780 | "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1",
781 | "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972",
782 | "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53",
783 | "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1",
784 | "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423",
785 | "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a",
786 | "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160",
787 | "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c",
788 | "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd",
789 | "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa",
790 | "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5",
791 | "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b",
792 | "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa",
793 | "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef",
794 | "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44",
795 | "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4",
796 | "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156",
797 | "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753",
798 | "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28",
799 | "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d",
800 | "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a",
801 | "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304",
802 | "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008",
803 | "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429",
804 | "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72",
805 | "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399",
806 | "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3",
807 | "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392",
808 | "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167",
809 | "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c",
810 | "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774",
811 | "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351",
812 | "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76",
813 | "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875",
814 | "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd",
815 | "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28",
816 | "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"
817 | ],
818 | "markers": "python_version >= '3.8'",
819 | "version": "==6.1.0"
820 | },
821 | "mypy-extensions": {
822 | "hashes": [
823 | "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
824 | "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
825 | ],
826 | "markers": "python_version >= '3.5'",
827 | "version": "==1.0.0"
828 | },
829 | "narwhals": {
830 | "hashes": [
831 | "sha256:287406a3777d102f981d27c5827a6b5a9d8bd8c89c79cd9fbe46e2956425f078",
832 | "sha256:2e784800b87c9e1ff47984da0046d957320f39b64c08f0e5b1b1a1208694935c"
833 | ],
834 | "markers": "python_version >= '3.8'",
835 | "version": "==1.14.2"
836 | },
837 | "numpy": {
838 | "hashes": [
839 | "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b",
840 | "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818",
841 | "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20",
842 | "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0",
843 | "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010",
844 | "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a",
845 | "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea",
846 | "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c",
847 | "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71",
848 | "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110",
849 | "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be",
850 | "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a",
851 | "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a",
852 | "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5",
853 | "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed",
854 | "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd",
855 | "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c",
856 | "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e",
857 | "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0",
858 | "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c",
859 | "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a",
860 | "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b",
861 | "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0",
862 | "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6",
863 | "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2",
864 | "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a",
865 | "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30",
866 | "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218",
867 | "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5",
868 | "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07",
869 | "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2",
870 | "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4",
871 | "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764",
872 | "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef",
873 | "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3",
874 | "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
875 | ],
876 | "markers": "python_version == '3.11'",
877 | "version": "==1.26.4"
878 | },
879 | "openai": {
880 | "hashes": [
881 | "sha256:471324321e7739214f16a544e801947a046d3c5d516fae8719a317234e4968d3",
882 | "sha256:d10d96a4f9dc5f05d38dea389119ec8dcd24bc9698293c8357253c601b4a77a5"
883 | ],
884 | "index": "pypi",
885 | "markers": "python_version >= '3.8'",
886 | "version": "==1.55.1"
887 | },
888 | "orjson": {
889 | "hashes": [
890 | "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2",
891 | "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd",
892 | "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79",
893 | "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff",
894 | "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd",
895 | "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8",
896 | "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c",
897 | "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b",
898 | "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885",
899 | "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825",
900 | "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9",
901 | "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559",
902 | "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae",
903 | "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708",
904 | "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566",
905 | "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4",
906 | "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833",
907 | "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e",
908 | "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60",
909 | "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef",
910 | "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3",
911 | "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543",
912 | "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d",
913 | "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e",
914 | "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da",
915 | "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da",
916 | "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e",
917 | "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296",
918 | "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56",
919 | "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c",
920 | "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6",
921 | "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755",
922 | "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80",
923 | "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23",
924 | "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07",
925 | "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2",
926 | "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763",
927 | "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935",
928 | "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85",
929 | "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b",
930 | "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509",
931 | "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13",
932 | "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed",
933 | "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc",
934 | "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8",
935 | "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69",
936 | "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9",
937 | "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192",
938 | "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c",
939 | "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31",
940 | "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f",
941 | "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74",
942 | "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f",
943 | "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252",
944 | "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f",
945 | "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e",
946 | "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252",
947 | "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548",
948 | "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05",
949 | "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b",
950 | "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7",
951 | "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36",
952 | "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967",
953 | "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d",
954 | "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70",
955 | "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced",
956 | "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d",
957 | "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6",
958 | "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be",
959 | "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc",
960 | "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4",
961 | "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb",
962 | "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e",
963 | "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69",
964 | "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"
965 | ],
966 | "markers": "platform_python_implementation != 'PyPy'",
967 | "version": "==3.10.12"
968 | },
969 | "packaging": {
970 | "hashes": [
971 | "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
972 | "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
973 | ],
974 | "markers": "python_version >= '3.8'",
975 | "version": "==24.2"
976 | },
977 | "pandas": {
978 | "hashes": [
979 | "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a",
980 | "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d",
981 | "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5",
982 | "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4",
983 | "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0",
984 | "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32",
985 | "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea",
986 | "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28",
987 | "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f",
988 | "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348",
989 | "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18",
990 | "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468",
991 | "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5",
992 | "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e",
993 | "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667",
994 | "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645",
995 | "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13",
996 | "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30",
997 | "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3",
998 | "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d",
999 | "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb",
1000 | "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3",
1001 | "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039",
1002 | "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8",
1003 | "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd",
1004 | "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761",
1005 | "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659",
1006 | "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57",
1007 | "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c",
1008 | "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c",
1009 | "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4",
1010 | "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a",
1011 | "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9",
1012 | "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42",
1013 | "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2",
1014 | "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39",
1015 | "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc",
1016 | "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698",
1017 | "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed",
1018 | "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015",
1019 | "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24",
1020 | "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"
1021 | ],
1022 | "index": "pypi",
1023 | "markers": "python_version >= '3.9'",
1024 | "version": "==2.2.3"
1025 | },
1026 | "pillow": {
1027 | "hashes": [
1028 | "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7",
1029 | "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5",
1030 | "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903",
1031 | "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2",
1032 | "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38",
1033 | "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2",
1034 | "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9",
1035 | "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f",
1036 | "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc",
1037 | "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8",
1038 | "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d",
1039 | "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2",
1040 | "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316",
1041 | "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a",
1042 | "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25",
1043 | "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd",
1044 | "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba",
1045 | "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc",
1046 | "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273",
1047 | "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa",
1048 | "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a",
1049 | "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b",
1050 | "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a",
1051 | "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae",
1052 | "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291",
1053 | "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97",
1054 | "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06",
1055 | "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904",
1056 | "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b",
1057 | "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b",
1058 | "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8",
1059 | "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527",
1060 | "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947",
1061 | "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb",
1062 | "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003",
1063 | "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5",
1064 | "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f",
1065 | "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739",
1066 | "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944",
1067 | "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830",
1068 | "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f",
1069 | "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3",
1070 | "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4",
1071 | "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84",
1072 | "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7",
1073 | "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6",
1074 | "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6",
1075 | "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9",
1076 | "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de",
1077 | "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4",
1078 | "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47",
1079 | "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd",
1080 | "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50",
1081 | "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c",
1082 | "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086",
1083 | "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba",
1084 | "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306",
1085 | "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699",
1086 | "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e",
1087 | "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488",
1088 | "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa",
1089 | "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2",
1090 | "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3",
1091 | "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9",
1092 | "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923",
1093 | "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2",
1094 | "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790",
1095 | "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734",
1096 | "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916",
1097 | "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1",
1098 | "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f",
1099 | "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798",
1100 | "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb",
1101 | "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2",
1102 | "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"
1103 | ],
1104 | "markers": "python_version >= '3.9'",
1105 | "version": "==11.0.0"
1106 | },
1107 | "propcache": {
1108 | "hashes": [
1109 | "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9",
1110 | "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763",
1111 | "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325",
1112 | "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb",
1113 | "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b",
1114 | "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09",
1115 | "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957",
1116 | "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68",
1117 | "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f",
1118 | "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798",
1119 | "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418",
1120 | "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6",
1121 | "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162",
1122 | "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f",
1123 | "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036",
1124 | "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8",
1125 | "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2",
1126 | "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110",
1127 | "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23",
1128 | "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8",
1129 | "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638",
1130 | "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a",
1131 | "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44",
1132 | "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2",
1133 | "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2",
1134 | "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850",
1135 | "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136",
1136 | "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b",
1137 | "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887",
1138 | "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89",
1139 | "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87",
1140 | "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348",
1141 | "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4",
1142 | "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861",
1143 | "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e",
1144 | "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c",
1145 | "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b",
1146 | "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb",
1147 | "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1",
1148 | "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de",
1149 | "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354",
1150 | "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563",
1151 | "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5",
1152 | "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf",
1153 | "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9",
1154 | "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12",
1155 | "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4",
1156 | "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5",
1157 | "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71",
1158 | "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9",
1159 | "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed",
1160 | "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336",
1161 | "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90",
1162 | "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063",
1163 | "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad",
1164 | "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6",
1165 | "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8",
1166 | "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e",
1167 | "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2",
1168 | "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7",
1169 | "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d",
1170 | "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d",
1171 | "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df",
1172 | "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b",
1173 | "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178",
1174 | "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2",
1175 | "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630",
1176 | "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48",
1177 | "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61",
1178 | "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89",
1179 | "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb",
1180 | "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3",
1181 | "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6",
1182 | "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562",
1183 | "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b",
1184 | "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58",
1185 | "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db",
1186 | "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99",
1187 | "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37",
1188 | "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83",
1189 | "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a",
1190 | "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d",
1191 | "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04",
1192 | "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70",
1193 | "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544",
1194 | "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394",
1195 | "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea",
1196 | "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7",
1197 | "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1",
1198 | "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793",
1199 | "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577",
1200 | "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7",
1201 | "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57",
1202 | "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d",
1203 | "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032",
1204 | "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d",
1205 | "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016",
1206 | "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"
1207 | ],
1208 | "markers": "python_version >= '3.8'",
1209 | "version": "==0.2.0"
1210 | },
1211 | "protobuf": {
1212 | "hashes": [
1213 | "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24",
1214 | "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535",
1215 | "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b",
1216 | "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548",
1217 | "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584",
1218 | "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b",
1219 | "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36",
1220 | "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135",
1221 | "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868",
1222 | "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687",
1223 | "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed"
1224 | ],
1225 | "markers": "python_version >= '3.8'",
1226 | "version": "==5.28.3"
1227 | },
1228 | "pyarrow": {
1229 | "hashes": [
1230 | "sha256:01c034b576ce0eef554f7c3d8c341714954be9b3f5d5bc7117006b85fcf302fe",
1231 | "sha256:05a5636ec3eb5cc2a36c6edb534a38ef57b2ab127292a716d00eabb887835f1e",
1232 | "sha256:0743e503c55be0fdb5c08e7d44853da27f19dc854531c0570f9f394ec9671d54",
1233 | "sha256:0ad4892617e1a6c7a551cfc827e072a633eaff758fa09f21c4ee548c30bcaf99",
1234 | "sha256:0b331e477e40f07238adc7ba7469c36b908f07c89b95dd4bd3a0ec84a3d1e21e",
1235 | "sha256:11b676cd410cf162d3f6a70b43fb9e1e40affbc542a1e9ed3681895f2962d3d9",
1236 | "sha256:25dbacab8c5952df0ca6ca0af28f50d45bd31c1ff6fcf79e2d120b4a65ee7181",
1237 | "sha256:2c4dd0c9010a25ba03e198fe743b1cc03cd33c08190afff371749c52ccbbaf76",
1238 | "sha256:36ac22d7782554754a3b50201b607d553a8d71b78cdf03b33c1125be4b52397c",
1239 | "sha256:3b2e2239339c538f3464308fd345113f886ad031ef8266c6f004d49769bb074c",
1240 | "sha256:3c35813c11a059056a22a3bef520461310f2f7eea5c8a11ef9de7062a23f8d56",
1241 | "sha256:4a4813cb8ecf1809871fd2d64a8eff740a1bd3691bbe55f01a3cf6c5ec869754",
1242 | "sha256:4f443122c8e31f4c9199cb23dca29ab9427cef990f283f80fe15b8e124bcc49b",
1243 | "sha256:4f97b31b4c4e21ff58c6f330235ff893cc81e23da081b1a4b1c982075e0ed4e9",
1244 | "sha256:543ad8459bc438efc46d29a759e1079436290bd583141384c6f7a1068ed6f992",
1245 | "sha256:6a276190309aba7bc9d5bd2933230458b3521a4317acfefe69a354f2fe59f2bc",
1246 | "sha256:73eeed32e724ea3568bb06161cad5fa7751e45bc2228e33dcb10c614044165c7",
1247 | "sha256:74de649d1d2ccb778f7c3afff6085bd5092aed4c23df9feeb45dd6b16f3811aa",
1248 | "sha256:84e314d22231357d473eabec709d0ba285fa706a72377f9cc8e1cb3c8013813b",
1249 | "sha256:9386d3ca9c145b5539a1cfc75df07757dff870168c959b473a0bccbc3abc8c73",
1250 | "sha256:9736ba3c85129d72aefa21b4f3bd715bc4190fe4426715abfff90481e7d00812",
1251 | "sha256:9f3a76670b263dc41d0ae877f09124ab96ce10e4e48f3e3e4257273cee61ad0d",
1252 | "sha256:a1880dd6772b685e803011a6b43a230c23b566859a6e0c9a276c1e0faf4f4052",
1253 | "sha256:acb7564204d3c40babf93a05624fc6a8ec1ab1def295c363afc40b0c9e66c191",
1254 | "sha256:ad514dbfcffe30124ce655d72771ae070f30bf850b48bc4d9d3b25993ee0e386",
1255 | "sha256:aebc13a11ed3032d8dd6e7171eb6e86d40d67a5639d96c35142bd568b9299324",
1256 | "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4",
1257 | "sha256:b76130d835261b38f14fc41fdfb39ad8d672afb84c447126b84d5472244cfaba",
1258 | "sha256:ba17845efe3aa358ec266cf9cc2800fa73038211fb27968bfa88acd09261a470",
1259 | "sha256:c0a03da7f2758645d17b7b4f83c8bffeae5bbb7f974523fe901f36288d2eab71",
1260 | "sha256:c52f81aa6f6575058d8e2c782bf79d4f9fdc89887f16825ec3a66607a5dd8e30",
1261 | "sha256:d4b3d2a34780645bed6414e22dda55a92e0fcd1b8a637fba86800ad737057e33",
1262 | "sha256:d4f13eee18433f99adefaeb7e01d83b59f73360c231d4782d9ddfaf1c3fbde0a",
1263 | "sha256:d6cf5c05f3cee251d80e98726b5c7cc9f21bab9e9783673bac58e6dfab57ecc8",
1264 | "sha256:da31fbca07c435be88a0c321402c4e31a2ba61593ec7473630769de8346b54ee",
1265 | "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c",
1266 | "sha256:e31e9417ba9c42627574bdbfeada7217ad8a4cbbe45b9d6bdd4b62abbca4c6f6",
1267 | "sha256:eaeabf638408de2772ce3d7793b2668d4bb93807deed1725413b70e3156a7854",
1268 | "sha256:f266a2c0fc31995a06ebd30bcfdb7f615d7278035ec5b1cd71c48d56daaf30b0",
1269 | "sha256:f39a2e0ed32a0970e4e46c262753417a60c43a3246972cfc2d3eb85aedd01b21",
1270 | "sha256:f591704ac05dfd0477bb8f8e0bd4b5dc52c1cadf50503858dce3a15db6e46ff2",
1271 | "sha256:f96bd502cb11abb08efea6dab09c003305161cb6c9eafd432e35e76e7fa9b90c"
1272 | ],
1273 | "markers": "python_version >= '3.9'",
1274 | "version": "==18.1.0"
1275 | },
1276 | "pydantic": {
1277 | "hashes": [
1278 | "sha256:a4daca2dc0aa429555e0656d6bf94873a7dc5f54ee42b1f5873d666fb3f35560",
1279 | "sha256:a8d20db84de64cf4a7d59e899c2caf0fe9d660c7cfc482528e7020d7dd189a7e"
1280 | ],
1281 | "markers": "python_version >= '3.8'",
1282 | "version": "==2.10.1"
1283 | },
1284 | "pydantic-core": {
1285 | "hashes": [
1286 | "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9",
1287 | "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b",
1288 | "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c",
1289 | "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529",
1290 | "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc",
1291 | "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854",
1292 | "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d",
1293 | "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278",
1294 | "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a",
1295 | "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c",
1296 | "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f",
1297 | "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27",
1298 | "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f",
1299 | "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac",
1300 | "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2",
1301 | "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97",
1302 | "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a",
1303 | "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919",
1304 | "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9",
1305 | "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4",
1306 | "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c",
1307 | "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131",
1308 | "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5",
1309 | "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd",
1310 | "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089",
1311 | "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107",
1312 | "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6",
1313 | "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60",
1314 | "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf",
1315 | "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5",
1316 | "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08",
1317 | "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05",
1318 | "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2",
1319 | "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e",
1320 | "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c",
1321 | "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17",
1322 | "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62",
1323 | "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23",
1324 | "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be",
1325 | "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067",
1326 | "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02",
1327 | "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f",
1328 | "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235",
1329 | "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840",
1330 | "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5",
1331 | "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807",
1332 | "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16",
1333 | "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c",
1334 | "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864",
1335 | "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e",
1336 | "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a",
1337 | "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35",
1338 | "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737",
1339 | "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a",
1340 | "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3",
1341 | "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52",
1342 | "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05",
1343 | "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31",
1344 | "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89",
1345 | "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de",
1346 | "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6",
1347 | "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36",
1348 | "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c",
1349 | "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154",
1350 | "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb",
1351 | "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e",
1352 | "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd",
1353 | "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3",
1354 | "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f",
1355 | "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78",
1356 | "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960",
1357 | "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618",
1358 | "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08",
1359 | "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4",
1360 | "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c",
1361 | "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c",
1362 | "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330",
1363 | "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8",
1364 | "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792",
1365 | "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025",
1366 | "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9",
1367 | "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f",
1368 | "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01",
1369 | "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337",
1370 | "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4",
1371 | "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f",
1372 | "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd",
1373 | "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51",
1374 | "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab",
1375 | "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc",
1376 | "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676",
1377 | "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381",
1378 | "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed",
1379 | "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb",
1380 | "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967",
1381 | "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073",
1382 | "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae",
1383 | "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c",
1384 | "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206",
1385 | "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"
1386 | ],
1387 | "markers": "python_version >= '3.8'",
1388 | "version": "==2.27.1"
1389 | },
1390 | "pydantic-settings": {
1391 | "hashes": [
1392 | "sha256:7fb0637c786a558d3103436278a7c4f1cfd29ba8973238a50c5bb9a55387da87",
1393 | "sha256:e0f92546d8a9923cb8941689abf85d6601a8c19a23e97a34b2964a2e3f813ca0"
1394 | ],
1395 | "markers": "python_version >= '3.8'",
1396 | "version": "==2.6.1"
1397 | },
1398 | "pydeck": {
1399 | "hashes": [
1400 | "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038",
1401 | "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605"
1402 | ],
1403 | "markers": "python_version >= '3.8'",
1404 | "version": "==0.9.1"
1405 | },
1406 | "pygments": {
1407 | "hashes": [
1408 | "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199",
1409 | "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
1410 | ],
1411 | "markers": "python_version >= '3.8'",
1412 | "version": "==2.18.0"
1413 | },
1414 | "python-dateutil": {
1415 | "hashes": [
1416 | "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
1417 | "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
1418 | ],
1419 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
1420 | "version": "==2.9.0.post0"
1421 | },
1422 | "python-dotenv": {
1423 | "hashes": [
1424 | "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",
1425 | "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
1426 | ],
1427 | "markers": "python_version >= '3.8'",
1428 | "version": "==1.0.1"
1429 | },
1430 | "pytz": {
1431 | "hashes": [
1432 | "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a",
1433 | "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"
1434 | ],
1435 | "version": "==2024.2"
1436 | },
1437 | "pyyaml": {
1438 | "hashes": [
1439 | "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
1440 | "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
1441 | "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
1442 | "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
1443 | "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
1444 | "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
1445 | "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
1446 | "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
1447 | "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
1448 | "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
1449 | "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
1450 | "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
1451 | "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
1452 | "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
1453 | "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
1454 | "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
1455 | "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
1456 | "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
1457 | "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
1458 | "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
1459 | "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
1460 | "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
1461 | "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
1462 | "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
1463 | "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
1464 | "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
1465 | "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
1466 | "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
1467 | "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
1468 | "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
1469 | "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
1470 | "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
1471 | "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
1472 | "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
1473 | "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
1474 | "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
1475 | "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
1476 | "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
1477 | "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
1478 | "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
1479 | "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
1480 | "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
1481 | "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
1482 | "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
1483 | "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
1484 | "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
1485 | "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
1486 | "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
1487 | "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
1488 | "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
1489 | "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
1490 | "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
1491 | "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
1492 | ],
1493 | "markers": "python_version >= '3.8'",
1494 | "version": "==6.0.2"
1495 | },
1496 | "referencing": {
1497 | "hashes": [
1498 | "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c",
1499 | "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
1500 | ],
1501 | "markers": "python_version >= '3.8'",
1502 | "version": "==0.35.1"
1503 | },
1504 | "regex": {
1505 | "hashes": [
1506 | "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638",
1507 | "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519",
1508 | "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"
1509 | ],
1510 | "markers": "python_version >= '3.8'",
1511 | "version": "==2024.11.6"
1512 | },
1513 | "requests": {
1514 | "hashes": [
1515 | "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
1516 | "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
1517 | ],
1518 | "markers": "python_version >= '3.8'",
1519 | "version": "==2.32.3"
1520 | },
1521 | "requests-toolbelt": {
1522 | "hashes": [
1523 | "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
1524 | "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
1525 | ],
1526 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
1527 | "version": "==1.0.0"
1528 | },
1529 | "rich": {
1530 | "hashes": [
1531 | "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098",
1532 | "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"
1533 | ],
1534 | "markers": "python_full_version >= '3.8.0'",
1535 | "version": "==13.9.4"
1536 | },
1537 | "rpds-py": {
1538 | "hashes": [
1539 | "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba",
1540 | "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d",
1541 | "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e",
1542 | "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a",
1543 | "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202",
1544 | "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271",
1545 | "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250",
1546 | "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d",
1547 | "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928",
1548 | "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0",
1549 | "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d",
1550 | "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333",
1551 | "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e",
1552 | "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a",
1553 | "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18",
1554 | "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044",
1555 | "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677",
1556 | "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664",
1557 | "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75",
1558 | "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89",
1559 | "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027",
1560 | "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9",
1561 | "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e",
1562 | "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8",
1563 | "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44",
1564 | "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3",
1565 | "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95",
1566 | "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd",
1567 | "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab",
1568 | "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a",
1569 | "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560",
1570 | "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035",
1571 | "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919",
1572 | "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c",
1573 | "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266",
1574 | "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e",
1575 | "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592",
1576 | "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9",
1577 | "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3",
1578 | "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624",
1579 | "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9",
1580 | "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b",
1581 | "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f",
1582 | "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca",
1583 | "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1",
1584 | "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8",
1585 | "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590",
1586 | "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed",
1587 | "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952",
1588 | "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11",
1589 | "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061",
1590 | "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c",
1591 | "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74",
1592 | "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c",
1593 | "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94",
1594 | "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c",
1595 | "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8",
1596 | "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf",
1597 | "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a",
1598 | "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5",
1599 | "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6",
1600 | "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5",
1601 | "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3",
1602 | "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed",
1603 | "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87",
1604 | "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b",
1605 | "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72",
1606 | "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05",
1607 | "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed",
1608 | "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f",
1609 | "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c",
1610 | "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153",
1611 | "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b",
1612 | "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0",
1613 | "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d",
1614 | "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d",
1615 | "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e",
1616 | "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e",
1617 | "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd",
1618 | "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682",
1619 | "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4",
1620 | "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db",
1621 | "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976",
1622 | "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937",
1623 | "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1",
1624 | "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb",
1625 | "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a",
1626 | "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7",
1627 | "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356",
1628 | "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"
1629 | ],
1630 | "markers": "python_version >= '3.9'",
1631 | "version": "==0.21.0"
1632 | },
1633 | "six": {
1634 | "hashes": [
1635 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
1636 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
1637 | ],
1638 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
1639 | "version": "==1.16.0"
1640 | },
1641 | "smmap": {
1642 | "hashes": [
1643 | "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62",
1644 | "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"
1645 | ],
1646 | "markers": "python_version >= '3.7'",
1647 | "version": "==5.0.1"
1648 | },
1649 | "sniffio": {
1650 | "hashes": [
1651 | "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
1652 | "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
1653 | ],
1654 | "markers": "python_version >= '3.7'",
1655 | "version": "==1.3.1"
1656 | },
1657 | "sqlalchemy": {
1658 | "hashes": [
1659 | "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9",
1660 | "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00",
1661 | "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee",
1662 | "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6",
1663 | "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1",
1664 | "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72",
1665 | "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf",
1666 | "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8",
1667 | "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b",
1668 | "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc",
1669 | "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c",
1670 | "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1",
1671 | "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3",
1672 | "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5",
1673 | "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90",
1674 | "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec",
1675 | "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71",
1676 | "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7",
1677 | "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b",
1678 | "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468",
1679 | "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3",
1680 | "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e",
1681 | "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139",
1682 | "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff",
1683 | "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11",
1684 | "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01",
1685 | "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62",
1686 | "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d",
1687 | "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a",
1688 | "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db",
1689 | "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87",
1690 | "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e",
1691 | "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1",
1692 | "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9",
1693 | "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f",
1694 | "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0",
1695 | "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44",
1696 | "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936",
1697 | "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8",
1698 | "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea",
1699 | "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f",
1700 | "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4",
1701 | "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0",
1702 | "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c",
1703 | "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f",
1704 | "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60",
1705 | "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2",
1706 | "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9",
1707 | "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"
1708 | ],
1709 | "markers": "python_version >= '3.7'",
1710 | "version": "==2.0.35"
1711 | },
1712 | "streamlit": {
1713 | "hashes": [
1714 | "sha256:0cc131fc9b18065feaff8f6f241c81164ad37d8d9e3a85499a0240aaaf6a6a61",
1715 | "sha256:7f6d1379a590f9625a6aee79ca73ceccff03cd2e05a3acbe5fe98915c27a7ffe"
1716 | ],
1717 | "index": "pypi",
1718 | "markers": "python_version >= '3.9' and python_full_version != '3.9.7'",
1719 | "version": "==1.40.2"
1720 | },
1721 | "tenacity": {
1722 | "hashes": [
1723 | "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b",
1724 | "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"
1725 | ],
1726 | "markers": "python_version >= '3.8'",
1727 | "version": "==9.0.0"
1728 | },
1729 | "tiktoken": {
1730 | "hashes": [
1731 | "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24",
1732 | "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02",
1733 | "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69",
1734 | "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560",
1735 | "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc",
1736 | "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a",
1737 | "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99",
1738 | "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953",
1739 | "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7",
1740 | "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d",
1741 | "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419",
1742 | "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1",
1743 | "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5",
1744 | "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9",
1745 | "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e",
1746 | "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d",
1747 | "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586",
1748 | "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc",
1749 | "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21",
1750 | "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab",
1751 | "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2",
1752 | "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47",
1753 | "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e",
1754 | "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b",
1755 | "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a",
1756 | "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04",
1757 | "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1",
1758 | "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005",
1759 | "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db",
1760 | "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2",
1761 | "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"
1762 | ],
1763 | "markers": "python_version >= '3.9'",
1764 | "version": "==0.8.0"
1765 | },
1766 | "toml": {
1767 | "hashes": [
1768 | "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
1769 | "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
1770 | ],
1771 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
1772 | "version": "==0.10.2"
1773 | },
1774 | "tornado": {
1775 | "hashes": [
1776 | "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803",
1777 | "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec",
1778 | "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482",
1779 | "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634",
1780 | "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38",
1781 | "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b",
1782 | "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c",
1783 | "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf",
1784 | "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946",
1785 | "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73",
1786 | "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"
1787 | ],
1788 | "markers": "python_version >= '3.8'",
1789 | "version": "==6.4.2"
1790 | },
1791 | "tqdm": {
1792 | "hashes": [
1793 | "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2",
1794 | "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"
1795 | ],
1796 | "markers": "python_version >= '3.7'",
1797 | "version": "==4.67.1"
1798 | },
1799 | "typing-extensions": {
1800 | "hashes": [
1801 | "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
1802 | "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
1803 | ],
1804 | "markers": "python_version >= '3.8'",
1805 | "version": "==4.12.2"
1806 | },
1807 | "typing-inspect": {
1808 | "hashes": [
1809 | "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f",
1810 | "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"
1811 | ],
1812 | "version": "==0.9.0"
1813 | },
1814 | "tzdata": {
1815 | "hashes": [
1816 | "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
1817 | "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
1818 | ],
1819 | "markers": "python_version >= '2'",
1820 | "version": "==2024.2"
1821 | },
1822 | "urllib3": {
1823 | "hashes": [
1824 | "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
1825 | "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
1826 | ],
1827 | "markers": "python_version >= '3.8'",
1828 | "version": "==2.2.3"
1829 | },
1830 | "yarl": {
1831 | "hashes": [
1832 | "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075",
1833 | "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a",
1834 | "sha256:074fee89caab89a97e18ef5f29060ef61ba3cae6cd77673acc54bfdd3214b7b7",
1835 | "sha256:13aaf2bdbc8c86ddce48626b15f4987f22e80d898818d735b20bd58f17292ee8",
1836 | "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88",
1837 | "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc",
1838 | "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced",
1839 | "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b",
1840 | "sha256:205de377bd23365cd85562c9c6c33844050a93661640fda38e0567d2826b50df",
1841 | "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715",
1842 | "sha256:20de4a8b04de70c49698dc2390b7fd2d18d424d3b876371f9b775e2b462d4b41",
1843 | "sha256:2d90f2e4d16a5b0915ee065218b435d2ef619dd228973b1b47d262a6f7cd8fa5",
1844 | "sha256:2e6b4466714a73f5251d84b471475850954f1fa6acce4d3f404da1d55d644c34",
1845 | "sha256:309f8d27d6f93ceeeb80aa6980e883aa57895270f7f41842b92247e65d7aeddf",
1846 | "sha256:32141e13a1d5a48525e519c9197d3f4d9744d818d5c7d6547524cc9eccc8971e",
1847 | "sha256:34176bfb082add67cb2a20abd85854165540891147f88b687a5ed0dc225750a0",
1848 | "sha256:38b39b7b3e692b6c92b986b00137a3891eddb66311b229d1940dcbd4f025083c",
1849 | "sha256:3a3709450a574d61be6ac53d582496014342ea34876af8dc17cc16da32826c9a",
1850 | "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6",
1851 | "sha256:3f576ed278860df2721a5d57da3381040176ef1d07def9688a385c8330db61a1",
1852 | "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb",
1853 | "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6",
1854 | "sha256:466d31fd043ef9af822ee3f1df8fdff4e8c199a7f4012c2642006af240eade17",
1855 | "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d",
1856 | "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d",
1857 | "sha256:52c136f348605974c9b1c878addd6b7a60e3bf2245833e370862009b86fa4689",
1858 | "sha256:536a7a8a53b75b2e98ff96edb2dfb91a26b81c4fed82782035767db5a465be46",
1859 | "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28",
1860 | "sha256:609ffd44fed2ed88d9b4ef62ee860cf86446cf066333ad4ce4123505b819e581",
1861 | "sha256:67b336c15e564d76869c9a21316f90edf546809a5796a083b8f57c845056bc01",
1862 | "sha256:685cc37f3f307c6a8e879986c6d85328f4c637f002e219f50e2ef66f7e062c1d",
1863 | "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00",
1864 | "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72",
1865 | "sha256:701bb4a8f4de191c8c0cc9a1e6d5142f4df880e9d1210e333b829ca9425570ed",
1866 | "sha256:73553bbeea7d6ec88c08ad8027f4e992798f0abc459361bf06641c71972794dc",
1867 | "sha256:7520e799b1f84e095cce919bd6c23c9d49472deeef25fe1ef960b04cca51c3fc",
1868 | "sha256:7609b8462351c4836b3edce4201acb6dd46187b207c589b30a87ffd1813b48dc",
1869 | "sha256:7db9584235895a1dffca17e1c634b13870852094f6389b68dcc6338086aa7b08",
1870 | "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e",
1871 | "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa",
1872 | "sha256:8254dbfce84ee5d1e81051ee7a0f1536c108ba294c0fdb5933476398df0654f3",
1873 | "sha256:8b8d3e4e014fb4274f1c5bf61511d2199e263909fb0b8bda2a7428b0894e8dc6",
1874 | "sha256:8e1c18890091aa3cc8a77967943476b729dc2016f4cfe11e45d89b12519d4a93",
1875 | "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1",
1876 | "sha256:91b8fb9427e33f83ca2ba9501221ffaac1ecf0407f758c4d2f283c523da185ee",
1877 | "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902",
1878 | "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e",
1879 | "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda",
1880 | "sha256:a173401d7821a2a81c7b47d4e7d5c4021375a1441af0c58611c1957445055056",
1881 | "sha256:a45d94075ac0647621eaaf693c8751813a3eccac455d423f473ffed38c8ac5c9",
1882 | "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd",
1883 | "sha256:a64619a9c47c25582190af38e9eb382279ad42e1f06034f14d794670796016c0",
1884 | "sha256:a7ee6884a8848792d58b854946b685521f41d8871afa65e0d4a774954e9c9e89",
1885 | "sha256:ae38bd86eae3ba3d2ce5636cc9e23c80c9db2e9cb557e40b98153ed102b5a736",
1886 | "sha256:b026cf2c32daf48d90c0c4e406815c3f8f4cfe0c6dfccb094a9add1ff6a0e41a",
1887 | "sha256:b0a2074a37285570d54b55820687de3d2f2b9ecf1b714e482e48c9e7c0402038",
1888 | "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7",
1889 | "sha256:b212452b80cae26cb767aa045b051740e464c5129b7bd739c58fbb7deb339e7b",
1890 | "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f",
1891 | "sha256:b4095c5019bb889aa866bf12ed4c85c0daea5aafcb7c20d1519f02a1e738f07f",
1892 | "sha256:b8e8c516dc4e1a51d86ac975b0350735007e554c962281c432eaa5822aa9765c",
1893 | "sha256:bd80ed29761490c622edde5dd70537ca8c992c2952eb62ed46984f8eff66d6e8",
1894 | "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85",
1895 | "sha256:c0f4808644baf0a434a3442df5e0bedf8d05208f0719cedcd499e168b23bfdc4",
1896 | "sha256:c4cb992d8090d5ae5f7afa6754d7211c578be0c45f54d3d94f7781c495d56716",
1897 | "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393",
1898 | "sha256:c73a6bbc97ba1b5a0c3c992ae93d721c395bdbb120492759b94cc1ac71bc6350",
1899 | "sha256:c893f8c1a6d48b25961e00922724732d00b39de8bb0b451307482dc87bddcd74",
1900 | "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75",
1901 | "sha256:d89ae7de94631b60d468412c18290d358a9d805182373d804ec839978b120422",
1902 | "sha256:d9d4f5e471e8dc49b593a80766c2328257e405f943c56a3dc985c125732bc4cf",
1903 | "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5",
1904 | "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0",
1905 | "sha256:dd21c0128e301851de51bc607b0a6da50e82dc34e9601f4b508d08cc89ee7929",
1906 | "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af",
1907 | "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a",
1908 | "sha256:ed69af4fe2a0949b1ea1d012bf065c77b4c7822bad4737f17807af2adb15a73c",
1909 | "sha256:f172b8b2c72a13a06ea49225a9c47079549036ad1b34afa12d5491b881f5b993",
1910 | "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd",
1911 | "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b",
1912 | "sha256:fa2c9cb607e0f660d48c54a63de7a9b36fef62f6b8bd50ff592ce1137e73ac7d",
1913 | "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42"
1914 | ],
1915 | "markers": "python_version >= '3.9'",
1916 | "version": "==1.18.0"
1917 | }
1918 | },
1919 | "develop": {}
1920 | }
1921 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Qualitative Data Analysis 📝
2 | This is a tool to help you do your qualitative data analysis. 🧐
3 | This can for instance take your transcripts and generate codes and themes for you 💡. It summarizes your data and can help you get insights on your data. 📊
4 |
5 | # 🔬 Tech stack
6 | The Qualitative Data Analysis uses [LLMs](https://en.wikipedia.org/wiki/Large_language_model) or Large Language Models to generate the summary / codes / themes and classify them. 🤖
7 | The application is developped with Python.
8 |
9 | ## Python Libraries
10 | This tool is powered by libraries:
11 | - [Streamlit](https://streamlit.io): For the User Interface 🖥️
12 | - [Langchain](https://langchain.com): For creating LLMs applications 🔗
13 | - [OpenAI](https://openai.com): The LLMs provider. For now we only integrated this LLM.
14 |
15 | # Getting started 🏁
16 |
17 | ## Requirements
18 |
19 | You need to have [Python](https://www.python.org/downloads/) installed on your computer.
20 | Choose the latest version of Python 3. 🐍. The version tested is 3.8.10.
21 |
22 | ## Configuration
23 |
24 | Rename the `.streamlit/secrets_template.toml` file to `.streamlit/secrets.toml` and edit it to add your own configuration about langchain, langsmith and openai api key.
25 |
26 | ## Installation
27 |
28 | Clone the repository and install the dependencies:
29 |
30 | ```bash
31 | git clone
32 | cd qualitative-data-analysis
33 | sudo ./scripts/getting_started.sh
34 | ```
35 |
36 | The getting_started.sh script will ask you for your OpenAI API key and will create the secrets.toml file for you.
37 |
38 | ## Run the application
39 |
40 | ```bash
41 | streamlit run source/qualitative_analyse_agent.py
42 | ```
43 |
44 | # Usage 📖
45 |
46 | The usage is pretty simple. 🤓
47 |
48 | 1. Upload your transcripts: You can upload your transcripts from the sidebar 📂.
49 | - Generate transcripts summary: In the Raw data section, you can generate a summary of your data individually.
50 | 2. Enter your research question: You can enter your research question. This will be used to generate codes and themes. ❓
51 | 3. Generate codes and themes: You can now click on the button to generate codes and themes. This will generate codes and themes based on your research question. 💡
52 |
53 | # Langsmith integration 🔗
54 |
55 | You can use langsmith to monitor your application and get insights on how it is used. 📊
56 |
57 | Edit the `.streamlit/secrets.toml` file and add the following lines:
58 |
59 | ```toml
60 | [langsmith]
61 | tracing = true
62 | api_url = "https://api.smith.langchain.com"
63 | api_key = "your key here"
64 | project = "your project here"
65 | ```
66 |
67 | # Diagrams
68 | ## Libs
69 | TODO Show a diagram with the interaction between libs
70 |
71 | ## LLM chain
72 | TODO show the LLM Chaining
73 |
74 | # Features ✨
75 | - Upload your transcripts 📂
76 | - Generate Summary on all data or on a specific data 📊
77 | - Based on a research question generate a summary of the data, generate codes and themes. ❓
78 | - Update Qualitative Analysis Data parameters 🔄
79 | - Generate a Qualitative Data Analysis report and download it 📄
80 |
81 | # Limitations ⚠️
82 | - For now, the tool cannot perform a Qualitative Data Analysis on large datasets as the LLM used is limited to 16000 tokens. 🚫
83 | - The data is not cached and the report as well. So if you reset the page the data will have to be uploaded and the report regenerated again. 🔄
84 |
85 | # Improvements 🚀
86 | - Upload voice transcripts and convert them to text and perform a Qualitative Data Analysis 🗣️
87 | - Connect to Qualitative Data softwares 🤝
88 | - (double check) Do intermediates checkings on the results to avoid LLM bias 🤔
89 | - Perform map-refine summary on the data
90 | - Handle large data transcripts
91 |
92 | # Background 🧑🎓
93 | My name is [Valentin Rudloff](https://www.linkedin.com/in/rudloffvalentin/) and I'm a Engineer. I make stuff in various fields. 👨🔧
94 | For my wife's memoire, she needed a tool to help her do a Qualitative Data Analysis on transcripts she conducted. 📚
95 | LLMs are really good at understanding human semantics and thus perform a Qualitative Data Analysis. 🧠
96 | This application helped her get almost an instant result, and I'm pretty sure this can help you as well. 👍
97 |
98 | # Acknowledgements 🙏
99 | The application and the LLM prompt are greatly inspired by Dr. [Philip Adu, Ph.D](https://www.drphilipadu.com) video [Master Qualitative Data Analysis with ChatGPT: An 18-Minute Guide](https://www.youtube.com/watch?v=L1WelrcgLGM).
100 |
101 | Made with ❤️ by [Valentin Rudloff](https://www.linkedin.com/in/rudloffvalentin/)
102 | If you want to help me create other stuff like this you can [buy me ☕](https://www.buymeacoffee.com/valentinrudloff)
--------------------------------------------------------------------------------
/data/data1/-Qualitative Data Analysis Worksheet.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gamma-Software/llm_qualitative_data_analysis/45b2d1ee50c38d6f2fea26c42e029b250268a25e/data/data1/-Qualitative Data Analysis Worksheet.pdf
--------------------------------------------------------------------------------
/data/data1/transcriptA.md:
--------------------------------------------------------------------------------
1 | TRANSCRIPT A- Participant Caucasian, Female, 4th Year
2 |
3 | Interviewer: Okay, Let's start off with question number one. "Many students believe that UCLA is a very diverse place with students of different backgrounds, including different racial and ethnic backgrounds. In your opinion, do students talk about their differences with regard to race/ethnicity?"
4 |
5 | Participant: "Hmm, I would definitely say that at UCLA I hear a lot about people talking about the differences of race and ethnicity, especially within my major because obviously Chicano Chicana Studies, a lot of it is about race and ethnicity. But of course, I hear about it within my sorority; obviously, the viewpoints are going to be very different.
6 |
7 | Interviewer: How so?
8 |
9 | Participant: I think that me being White and also being a Chicana Chicano Studies major, like I see two different worlds. Like within the sorority I'm with a lot of White girls who are pretty privileged in their lives, so they have never necessarily even thought of what it would be like to be another race or the embedded racism that exists in our country. And so with being a Chicano Studies major, like I have gotten to see that and how other people do not see it [racism]. But you know, people of course think racism is common.
10 |
11 | Interview: within where?
12 |
13 | Participant: Within the sorority. Yeah, I mean [pause] I mean most of it is in joking. I've never heard someone seriously say a racist slur and really mean it, hmm. Or at least they wouldn't do it in front of me because I would be like, "Wait! Let's talk about this. That's inappropriate" [Laughs]. I mean, like when that whole "Asians in the library" thing happened, we talked about that a lot and what that was about.
14 |
15 | Interviewer: Did you all have a meeting or something?
16 |
17 | Participant: No, the sorority didn't have a meeting; it was more of a general discussion like, "Darn, can you believe what that girl said?" kind of thing. A lot of people didn't feel bad for her; most of the people were like, "Whoa, she's really stupid." I thought that was good because the responses could have gone either way.
18 |
19 | Interview: What about those discussions that occur in your classes? You said they were a little bit different, how so?
20 |
21 | Participant: Well, I mean, in class, we're talking about the realities of racism, like the entities beyond the government and throughout history, I mean back to colonialism. Especially with Latinos, the racism they experience. I mean, it's all throughout history, and that's all the racial consciousness that Chicano studies bring up.
22 |
23 | Interviewer: Okay, so let me rewind a little and go back to the question a bit. Do you think conversations between students of different racial backgrounds are occurring?
24 |
25 | Participant: Within the sorority, I mean, yeah, I think they do. I think it depends on the people, and we have some really intellectual girls in the sorority, and others that are not so much. I mean, it's not that they aren't intellectual, but I think it's more that they don't care as much to talk about race. We have some girls that will get into discussions; I mean, I've gotten into some discussions with some girls as well. Like this one girl, she's a Republican. And so she's a pretty strong Republican, and I'm a pretty strong Democrat, so we'll get into discussions, and it was just surprising to see her viewpoints on race and on welfare and other ethnicities in general. It was kind of shocking, and I think it changed my perception of her.
26 |
27 | Interviewer: Because you were able to hear her point of view?
28 |
29 | Participant: Yeah, I think it has changed negatively about her. Yeah, because of how ignorant she is of a lot of issues. Like, I've tried to talk to her about it, but yeah. Like she's part of Bruin Republicans, and like the conversation was really hard, like her being my sister and her thinking like this, I don't know, it was just like, "Whoa!"
30 |
31 | Interview: Was that the very first time you had ever talked to her about race?
32 |
33 | Participant: Yeah, and I mean it had originally started with us talking about political parties because she has like a Ronald Reagan poster hanging over her bed, like, "Whoa, really?" I was like, "You're a big fan of Ronald Reagan?" and then we got into this whole discussion about race and then we started talking about immigration and then Mexicans and Latinos in general. Yeah, it was pretty intense [laughs].
34 |
35 | Interviewer: Okay, let's hit the second part of the question. "Do you think that UCLA students are free to talk about their differences? Do you think those spaces are available?"
36 |
37 | Participant: I think you have to seek those spaces. I don't think necessarily that those spaces are always available. No, I mean obviously some majors are going to be more open to it [conversation about race] than others. So if like someone is a biology major, they're really gonna have to seek spaces where they can talk about race because maybe like their dorms won't be necessarily open to that, so they might have to seek an organization that welcomes that because they're not gonna get that in their biology classes. They simply wouldn't get the same experience as someone who is in a Chicano Studies major, for example.
38 |
39 | Interviewer: So they would have to go out of their way to find these spaces?
40 |
41 | Participant: Oh definitely! I mean, often times I see people, even within my sorority, that their majors keep them so specific to the sciences that they never talk about race and racial consciousness. They never even think about the real issues within our society, and it's surprising how my entire major talks about it!
42 |
43 | Interviewer: It's surprising how your reality isn't theirs?
44 |
45 | Participant: Yeah! It's crazy. They really need to just seek them out.
46 |
47 | Interviewer: So if they don't seek out these spaces, you're saying it's almost like they get closed off? Is that what you're trying to say?
48 |
49 | Participant: Yeah, big time. Yeah, because I mean, many times like, I was brought up in like, obviously my parents are white, so is my whole family. We don't have any interracial marriages at all. So, for me, there is a lot of things that when I started the Chicano Studies major opened my eyes. I was like, "Wow, maybe I did have preconceived notions and a little bit of racism," and the teacher will point out where all that comes from. So I'm like, "Wow, that makes a lot of sense, and now I understand why I thought that, and why that's so wrong and scary to feel like that." For example, with racial slurs, in High School, it was okay, but then you come to college and you realize that that isn't okay to say.
50 |
51 | Interviewer: Okay, so we spoke about how there are different spaces where people do talk about race, and you mentioned that in your classes you all talk about race, but can you speak on the quality of these conversations?
52 |
53 | Participant: I mean, I think that if you're in an ethnic studies major, you are going to know how to lead the conversation and know how the conversation works, versus other people.
54 |
55 | Like two Biology majors, they don't necessarily gonna know how to really even start that conversation, let alone why are they talking about that because for them that [race] is not the issue, their whole thing is getting into med school. It's not like they care how racism is and why our society is so embedded with it and why it's not okay, kind of thing.
56 |
57 | Interviewer: You mentioned how some people lead the discussions because they have that consciousness, and how you think it's easier for those people to engage in conversations about race because they have so much background. What about personal experiences? Do you think they differ in different spaces?
58 |
59 | Participant: Oh yeah, definitely! I mean the conversation that I'm going to have with fellow classmates in the Chicano Studies department and the friends I've made with students in the major are going to be completely different from the ones I have here within my sorority or even at home. I mean, I'm constantly teaching my parents stuff that I learn here at UCLA about race and racial consciousness that they have never ever heard of in their life. Like, you know, they were never introduced to it; their parents didn't bring up issues of race, they've never necessarily been the target of racism. So people that are aware of the true issues of racism, conversations with them are going to be more intellectual because we are gonna be able to dig deeper into what the issue is, versus me teaching somebody that there is an issue. So like within the sorority, they don't know what we talk about in my classes.
60 |
61 | Interviewer: Do you think they should know?
62 |
63 | Participant: Absolutely. I think everyone should be required to take Chicano Studies classes! [laughs] Or ethnic studies classes in general. I mean, with Chicano Studies, it's obviously not only about Chicanos, we talk about Asian Americans, African Americans, every race and racism in general. So yes, I absolutely think that it should be required. And those GE [General Education] courses, I think some of them you can take an ethnic studies course to cover it, but I think it should be required. You shouldn't be able to get out of them by taking another course. I think every student should have to take one and open their mind to it, regardless if they want to or not, they should be taught it.
64 |
65 | Interviewer: So you're saying that we have to force people to enter those spaces so that they can gain some exposure?
66 |
67 | Participant: Exactly! So that then they can make their opinions from there, and if they still want to keep their racist views, then at least they were taught. At least they were educated, and they were given the other side [other perspective].
68 |
69 | Interviewer: A new or different perspective
70 |
71 | Participant: Right, exactly.
--------------------------------------------------------------------------------
/data/data1/transcriptB.md:
--------------------------------------------------------------------------------
1 | TRANSCRIPT B- INTERVIEW 5B: Taiwanese-American, Male, 4th Year
2 |
3 | Interviewer: Okay great. So moving more into the discussion, many students at UCLA believe UCLA is very diverse with students from many different backgrounds, including different racial and ethnic backgrounds. But in your opinion, do you think students talk openly about difference in regards to race and ethnicity?
4 |
5 | Participant: I think it depends on the space that they are in.
6 |
7 | Interviewer: What do you mean by the space?
8 |
9 | Participant: The venue. Oftentimes, when I was living in the dorms we wouldn't talk about those kinds of things, but later I joined student government and we were more open about those kinds of things.
10 |
11 | Interviewer: Great, why do you believe there is that difference between the dorm environment and the student government environment?
12 |
13 | Participant: Well, I think it's both a difference in the people there, as well as in the environment. In the dorms, people are there to live, and they have their own life goals and things going on, but if you enter the student government environment, you have people who are particularly invested in affairs that are related to cultures, race, and differences, so I guess it would only be natural that they would have those conversations there.
14 |
15 | Interviewer: Any other experiences of spaces on campus where you have witnessed students talking about difference on campus?
16 |
17 | Participant: I can't really think of one. Usually when I do hear it, it is usually somewhere that is very, I don't know, spaces on campus that are more liberal, like the student activities center, for example, or Kerckhoff Hall, but never in other buildings really.
18 |
19 | Interviewer: And do you believe students are free to talk about their difference?
20 |
21 | Participant: I don't think so actually. UCLA is such a big school that it's hard to get a feel for the climate people are interacting in. So it is hard to bring up touchy subjects with someone, unless you are on that really close friendship level, which is hard to make many of those connections on such a big campus.
22 |
23 | Interviewer: What would you say it takes to develop that connection or trust?
24 |
25 | Participant: I guess just friendship I would say. That is really all there is too it, eventually you are comfortable to do anything you want with your friends.
26 |
27 | Interviewer: So it only occurs within friend groups you are saying?
28 |
29 | Participant: Yeah.
30 |
31 | Interviewer: Okay. And, have you ever witnessed students with "differences" discussing them or is it mainly students within their same social identity group?
32 |
33 | Participant: I would say that I have never seen students actively discussing differences between their identity groups, and the only time I have seen students is when they identify the same as they do, and they are talking about another group of people outside their identity group.
34 |
35 | Interviewer: Do you have an example of that?
36 |
37 | Participant: All the time at work. I work on the Hill. I hear people make really offensive comments. Things that would not be well received by people within that community. Like people will drop the "N" word, or people will jokingly drop the three-letter "F" word pertaining to gay people, etc., etc. It is silly because they are first years and they don't really understand the impact those words have yet, but that is where I hear a lot of it.
38 |
39 | Interviewer: What do you think facilitates dialogue between these different groups or students?
40 |
41 | Participant: It is difficult. I mean if you could do that we wouldn't really have racism anymore. But, I think the biggest way of facilitating it is having people have a really empathetic heart and an open mind.
42 |
43 | Interviewer: And I guess on the flip side what prevents that dialogue from happening?
44 |
45 | Participant: There are just so many societal kind of taboos, you just don't want to anger the other person by giving them your ignorant viewpoint, so even though you may know that you are ignorant, you'd rather just not discuss the topic at all rather than bringing up something that could be inflammatory.
46 |
47 | Interviewer: Do you have any personal examples where you have been involved in these kinds of situations?
48 |
49 | Participant: Well, yeah. I would say so. With my ex-girlfriend, that was very uncomfortable because she was not aware that I had come to the realization that I was gay. So it made me very uncomfortable to talk about that with her and the people who were around her. So rather than bring up an inflammatory subject and have all these questions bombarded at me, and having to defend myself, I rather opted to just act like nothing was wrong, act like everything was the same and not bring up the subject altogether.
50 |
51 | Participant: Well, there are lots of times when I was dating someone, and we would often be stopped by random people and they would be like, "Oh, you guys are so cute together," because we were gay and that would make us feel comfortable, but then other times we would feel very uncomfortable just walking around together because we would get all these nasty glares, but I don't know if that's really applicable to people actually talking about difference on campus. One time someone actually came up to us and started talking about the bible, and that was very inflammatory.
52 |
53 | Interviewer: Was he a student?
54 |
55 | Participant: Yes, he was.
56 |
57 | Interviewer: So you kind of are saying that sometimes these smaller things trigger or inhibit you from feeling comfortable talking with others about difference on campus?
58 |
59 | Participant: I would say so.
60 |
61 | Interviewer: Great. And again, any other spaces on campus that this happens? You mentioned the hill or student government, or the student activities center. I know you are a South Campus major, do you talk about this in your classes, with your friends in class?
62 |
63 | Participant: No, definitely not. Especially in South Campus the environment is very different than the environment in North Campus. We are very focused on our studies and I would say that most of my friendships I have made in the classroom context are very superficial. We are friends, and I would consider them that, but they don't approach personal subjects with me very often, and I don't approach personal subjects with them very often because it's not really related to what we study, and it doesn't affect our performance in the context to when we see each other in class. I would say that I don't know anything about them really, other than what they look like, what their grades are, and what their major is.
64 |
65 | Interviewer: Interesting. I guess, moving on from places on campus, and more to experiences you've had where you actually have been talking openly with people about difference. Have you ever talked with someone from a different background about it?
66 |
67 | Participant: All the time.
68 |
69 | Interviewer: Okay. Can you maybe share one of those experiences and what it was like?
70 |
71 | Participant: Well, I was involved in student government like I said, and one of the people involved was very active in the Pilipino community and he was constantly mentioning their struggles and why they, for instance, had a program in SAC and I would ask him, why do Pilipinos or Pacific Islanders receive these kinds of services whereas Chinese people who have historically also been repressed don't get the same treatment in any context. And, we had a discussion, it was very civil, and it really opened my eyes to the many struggles his community faced, and he also challenged
72 |
73 | me to, if these struggles are something that my community has had in the past, then by all means we should have the right to have those services ourselves, so it was very enlightening.
74 |
75 | Interviewer: Good, and what kind of prompted you to feel comfortable having that conversation with him?
76 |
77 | Participant: Oh, he was a very good friend and mentor. He was a very approachable guy who helped me along through a lot of my personal life so I felt very comfortable discussing anything with him. He always had such an open door, and openness with how he approached subjects with us.
78 |
79 | Interviewer: And this sounds like a very unique setting in student government. Why do you think a setting like that allows students to feel comfortable talking about these differences, whereas you mentioned earlier in many cases it's people within their own identity group talking about it?
80 |
81 | Participant: I mean like I said, people join student government because they want to advocate on behalf of their community, so it would be plain foolish if someone interested in advocating for their community isn't willing to listen to someone else advocating for their community and so student government facilitates that kind of discussion because everyone is interested, and a part of advocacy is listening to others' struggles to see where the needs of the student population may be.
82 |
83 | Interviewer: Great. If you could imagine a UCLA where students talked openly about their differences with others, how do you think that could be achieved?
84 |
85 | Participant: It is a very difficult question and there is not a good answer, but an idea that I could come up with is something like, I am hesitant to mention it, but I know a while back in student government we mentioned something like a diversity requirement and I thought that was great because you can't really… I came from a very not challenged background, so when I came to college I didn't understand the difficulties others faced. It seemed unfathomable really, like I couldn't understand, I thought everyone was full of BS. It didn't hit me until I actually met one of those people and worked through their struggles, and came to understand them, and experienced my own struggle, that I could finally appreciate the differences we all have in our backgrounds, so I think that's a necessary component to catalyze those kinds of discussions of difference.
--------------------------------------------------------------------------------
/data/data1/transcriptC.md:
--------------------------------------------------------------------------------
1 | TRANSCRIPT C- Armenian, Female, 3rd Year
2 |
3 | Interviewer: So for my first question if you need me to rephrase it let me know. Many students believe that UCLA is a very diverse place, with students of different backgrounds including different racial/ethnic backgrounds. In your opinion, do students talk about their differences with regard to race and ethnicity?
4 |
5 | Participant: I’d say yeah they do. And I would agree that there is a lot of diversity here. But when I first came to UCLA I didn’t really see it I was just thinking there were a bunch of Asians and White people everywhere. But when once you get into your classes and you go into UCLA whether it’s a job or volunteer opportunities then you really see that there are different races. Like I didn’t know Persian Jews existed until I came to UCLA and a lot of people I have met here happen to be Persian Jews but I really didn’t realize that. But does that answer your question? You asked about differences with other people?
6 |
7 | Interviewer: Yeah, well whether people of different backgrounds do happen to talk about those differences.
8 |
9 | Participant: Well, yeah the people I do talk to. I guess it depends who you talk to and where. I know at work we talk about how my culture is different from yours or what we do for holidays. Like if I find out someone is a different culture in class I’ll ask them about it and questions. But yeah I think it’s about differences until you get to the similarities and realize oh yeah we do have a lot of similarities and stuff in common.
10 |
11 | Interviewer: And why do you think those conversations happen at work?
12 |
13 | Participant: At work I feel like we are more tightly knit. It feels more like a family rather than work at my workplace [Laughs]. Everyone is really comfortable with each other and I mean we have a lot of different races like Armenian, Spanish, we have a lot of Asians in there and African-Americans. It’s just really a diverse group and once you have a group like that of people working together in a small environment it's bound to happen.
14 |
15 | Interviewer: So do you think all UCLA students are free to talk about their differences?
16 |
17 | Participant: Well, I mean I don’t know maybe some cultures have limitations. Or they are not allowed to. And I don’t think I have ever met someone who didn’t discuss or choose to talk about their backgrounds.
18 |
19 | Interviewer: And at work you feel comfortable talking about your differences with any person?
20 |
21 | Participant: Yeah, pretty much.
22 |
23 | Interviewer: Well you mentioned that these conversations occur at work but could you think of anywhere else where these conversations occur? Or talk about a personal experience?
24 |
25 | Participant: Yeah well in the dorms a lot but now that I moved out I feel less connected to UCLA so I think it's harder to talk to people. But especially because I’m Armenian I feel like anytime I interact with someone who is not Armenian they either don’t know about my race or they never heard about it or I don’t know they’re curious about it. So I feel like it’s really easy for me to talk to people in the classroom if I have someone in one or more of my classes. I’ll approach them and ask them then one thing leads to another and you talk about your race/ethnicity. So I don’t think it's really hard for me personally but I don’t know I would say the dorms, jobs, but I’m not really involved in any outside club or activities. So I feel like Bruinwalk with all the clubs and organizations there is a lot of opportunity here.
26 |
27 | Interviewer: And these conversations occur in class but are they facilitated by anyone?
28 |
29 | Participant: In class the only two examples that I’ve experienced was in my race and ethnicity class where that was a central topic of it. So that was really interactive and race/ethnicity was the main topic obviously and that’s basically what we talked about. But again, aside from classes based on that if I see other students in more than one class of mine and especially my name. It’s not a common name so that opens an entire field of where it comes from or several other questions about my ethnicity. And from this it goes back and forth.
30 |
31 | Interviewer: Okay, thanks. But do you think there’s also anything that prevents people from having these conversations about their differences?
32 |
33 | Participant: Well maybe embarrassment or fear. Some people might be scared to talk about themselves and I’m sure it happens because if I were say Muslim I don’t know how open I would be to having people come into my life and discussing. There are a lot of people like that but its just happens that I’m not one of them. But I’m sure there are a lot of stigmas and prejudices that might prevent people.
34 |
35 | Interviewer: So when you talk to other people do you feel that you are honest when you talk about your culture and differences? And that they are the same way?
36 |
37 | Participant: Yeah for the most part I mean it depends who I’m talking to and how far I want to go with the conversation. If I just met you I am not going to talk to you about how Armenians can’t have sex until they’re married or you know my family is this certain way. It's not like I’ll go all out and give you a full-blown background of my culture but workwise or friendwise that I’m pretty open. And I believe they are too, for the most part. But then again you never know.
38 |
39 | Interviewer: Ok, so if you could characterize the quality of interaction between people of different backgrounds to someone who doesn’t go to UCLA, what would you say?
40 |
41 | Participant: I’m sorry could you repeat that.
42 |
43 | Interview: Yeah, so if you were to explain to someone who doesn’t go to UCLA like a prospective student or whatever, how would you explain the way people interact on campus in terms of their differences? Since you did say earlier it’s a diverse place.
44 |
45 | Participant: Well, I would say organizations but then again I have never participated but I know there are a lot of clubs and groups that culturally mix. I mean I have seen a lot of that happen with Armenians and another group like I recently got an email about an Armenian/Brazilian dance things. Which is so random but here at UCLA we have the opportunities and we have the cultures and so many different people that come together so I feel like our clubs and organizations are a way. I do feel that also international students open the door since we have so many of them this year and they are from all over the world so that’s another benefit I guess to UCLA. It makes it more diverse.
46 |
47 | Interviewer: So since you said you have had good experiences talking about your Armenian culture, what makes you want to share that with people?
48 |
49 | Participant: I would say pride would be one of them. Great pride in being Armenian. I feel like its important and special and really close to me because it defines who I am as a person. So I feel like if I open up my culture people get a better sense of who I am. In terms of moral, religion, food, family gatherings describes me.
--------------------------------------------------------------------------------
/data/data2/question.md:
--------------------------------------------------------------------------------
1 | How do students perceive the quality and accessibility of food services on campus, and what factors influence their dining choices and satisfaction?
--------------------------------------------------------------------------------
/data/data2/transcript1.md:
--------------------------------------------------------------------------------
1 | 1. **How would you rate your overall experience with the food services on campus?**
2 | My overall experience with the food services on campus has been somewhat mixed. There are some aspects I appreciate, but there's room for improvement.
3 |
4 | 2. **Can you describe your favorite dishes or menu items at the college?**
5 | One of my favorite dishes on campus is the chicken Alfredo pasta. It's creamy, flavorful, and a comforting option.
6 |
7 | 3. **Do you have any dietary restrictions or preferences, and how well does the college accommodate them?**
8 | I'm a vegetarian, and I've found that the college does offer a decent selection of vegetarian options. However, it would be great to see more variety and innovation in vegetarian dishes.
9 |
10 | 4. **What are your thoughts on the affordability of food on campus?**
11 | I think the affordability of food on campus can be a bit challenging, especially for students on a tight budget. Some meal options are reasonably priced, but others can be expensive.
12 |
13 | 5. **Are there specific dining programs or meal plans you find beneficial?**
14 | Yes, I find the weekly meal plan quite beneficial. It's convenient and helps me manage my expenses.
15 |
16 | 6. **How would you rate the variety and diversity of food options available on campus?**
17 | The variety and diversity of food options are decent. There's a range of cuisines available, but it would be nice to see even more international and culturally diverse choices.
18 |
19 | 7. **Have you seen any improvements or changes in food services based on student feedback?**
20 | I have noticed some changes based on student feedback, especially in response to requests for healthier options. It's good to see the college listening to students.
21 |
22 | 8. **Are there any sustainability initiatives in place regarding food services at the college?**
23 | I'm not aware of specific sustainability initiatives, but I have noticed recycling bins and compostable utensils, which is a step in the right direction.
24 |
25 | 9. **Have you ever used food delivery services or ordered food from off-campus while studying?**
26 | Yes, occasionally I've used food delivery services, especially when I'm looking for specific cuisines that aren't available on campus.
27 |
28 | 10. **Can you share any specific recommendations or improvements you'd like to see in the college's food services?**
29 | I would recommend improving the vegetarian options, making sure they are not just limited to salads. It would also be great to have more affordable meal choices to cater to students' budgets.
30 |
--------------------------------------------------------------------------------
/data/data2/transcript2.md:
--------------------------------------------------------------------------------
1 | 1. **How would you rate your overall experience with the food services on campus?**
2 | My overall experience with the food services on campus has been quite positive. I've found the options to be diverse and tasty.
3 |
4 | 2. **Can you describe your favorite dishes or menu items at the college?**
5 | I absolutely love the barbecue chicken pizza they serve in the campus pizzeria. It's the perfect combination of tangy and savory.
6 |
7 | 3. **Do you have any dietary restrictions or preferences, and how well does the college accommodate them?**
8 | I'm a vegan, and I must say the college has done an excellent job in accommodating my dietary preferences. There's always a variety of vegan options available.
9 |
10 | 4. **What are your thoughts on the affordability of food on campus?**
11 | I think the affordability of food on campus is quite reasonable. There are affordable meal options available, and I appreciate the value for the quality.
12 |
13 | 5. **Are there specific dining programs or meal plans you find beneficial?**
14 | Yes, I find the monthly meal plan to be really beneficial. It helps me budget my food expenses throughout the month.
15 |
16 | 6. **How would you rate the variety and diversity of food options available on campus?**
17 | The variety and diversity of food options on campus are impressive. There's a mix of cuisines, including international options, which I love.
18 |
19 | 7. **Have you seen any improvements or changes in food services based on student feedback?**
20 | Absolutely, I've noticed that the college is responsive to student feedback. They've introduced healthier options and even added more plant-based choices based on our requests.
21 |
22 | 8. **Are there any sustainability initiatives in place regarding food services at the college?**
23 | Yes, there are several sustainability initiatives in place. They've reduced single-use plastics, implemented recycling programs, and even started sourcing some ingredients locally.
24 |
25 | 9. **Have you ever used food delivery services or ordered food from off-campus while studying?**
26 | Occasionally, yes. It's convenient for those late-night study sessions when the campus dining options are closed.
27 |
28 | 10. **Can you share any specific recommendations or improvements you'd like to see in the college's food services?**
29 | I would suggest expanding the vegan dessert options. We have some fantastic savory choices, but it would be great to have more sweet treats that are vegan-friendly.
30 |
--------------------------------------------------------------------------------
/data/data2/transcript3.md:
--------------------------------------------------------------------------------
1 | 1. **How would you rate your overall experience with the food services on campus?**
2 | Overall, my experience with the food services on campus has been decent. It's not exceptional, but it gets the job done.
3 |
4 | 2. **Can you describe your favorite dishes or menu items at the college?**
5 | I'm a big fan of the classic cheeseburger they serve at the main cafeteria. It's a simple choice, but it's consistently good.
6 |
7 | 3. **Do you have any dietary restrictions or preferences, and how well does the college accommodate them?**
8 | I don't have any specific dietary restrictions, but I do try to eat healthy. The college offers some healthy options, but I think there could be more variety in that department.
9 |
10 | 4. **What are your thoughts on the affordability of food on campus?**
11 | The affordability of food on campus is a bit of a mixed bag. Some options are reasonably priced, but others can be on the expensive side, which can be a challenge for students on a tight budget.
12 |
13 | 5. **Are there specific dining programs or meal plans you find beneficial?**
14 | I find the pay-as-you-go option beneficial. It gives me flexibility in choosing when and what to eat without committing to a full meal plan.
15 |
16 | 6. **How would you rate the variety and diversity of food options available on campus?**
17 | The variety is decent, but I'd like to see more diverse international cuisines represented. It can get a bit monotonous after a while.
18 |
19 | 7. **Have you seen any improvements or changes in food services based on student feedback?**
20 | I haven't noticed significant changes based on student feedback during my time here. It would be great to see the college being more responsive to our suggestions.
21 |
22 | 8. **Are there any sustainability initiatives in place regarding food services at the college?**
23 | There are some sustainability initiatives, like using reusable trays and utensils, but I think there's more the college can do to reduce waste and promote sustainability.
24 |
25 | 9. **Have you ever used food delivery services or ordered food from off-campus while studying?**
26 | Yes, occasionally, especially during exam weeks when I need a quick meal delivered to my dorm.
27 |
28 | 10. **Can you share any specific recommendations or improvements you'd like to see in the college's food services?**
29 | I would recommend introducing a broader range of healthy and vegetarian options. Also, it would be great to have more transparent pricing and regular updates on any changes or improvements they plan to make in the future.
30 |
--------------------------------------------------------------------------------
/data/data2/transcript4.md:
--------------------------------------------------------------------------------
1 | 1. **How would you rate your overall experience with the food services on campus?**
2 | My overall experience with the food services on campus has been quite positive. I've been generally satisfied with the options available.
3 |
4 | 2. **Can you describe your favorite dishes or menu items at the college?**
5 | I absolutely love the vegetarian stir-fry at the Asian cuisine station. It's packed with flavor, and I appreciate having a tasty, healthy option.
6 |
7 | 3. **Do you have any dietary restrictions or preferences, and how well does the college accommodate them?**
8 | I'm gluten intolerant, and I must say the college has done an excellent job accommodating my dietary needs. There are clearly labeled gluten-free options available.
9 |
10 | 4. **What are your thoughts on the affordability of food on campus?**
11 | I think the affordability of food on campus is quite reasonable. There are affordable meal choices, especially when you take advantage of meal plans.
12 |
13 | 5. **Are there specific dining programs or meal plans you find beneficial?**
14 | Yes, I find the semester meal plan beneficial. It provides a balance between flexibility and budgeting.
15 |
16 | 6. **How would you rate the variety and diversity of food options available on campus?**
17 | The variety and diversity of food options are impressive. There's something for everyone, from traditional comfort food to international cuisine.
18 |
19 | 7. **Have you seen any improvements or changes in food services based on student feedback?**
20 | Yes, I've noticed that the college is responsive to student feedback. They've introduced more vegan and gluten-free options based on our suggestions.
21 |
22 | 8. **Are there any sustainability initiatives in place regarding food services at the college?**
23 | Yes, there are several sustainability initiatives in place. They've implemented composting programs and use biodegradable packaging, which is great for the environment.
24 |
25 | 9. **Have you ever used food delivery services or ordered food from off-campus while studying?**
26 | Occasionally, yes. It's convenient when I'm too busy to leave the dorm, but I generally prefer eating on campus.
27 |
28 | 10. **Can you share any specific recommendations or improvements you'd like to see in the college's food services?**
29 | I would recommend expanding the late-night dining options. Sometimes, students study late into the night, and having more choices during those hours would be fantastic. Additionally, it would be great to see even more emphasis on sustainable sourcing of ingredients.
30 |
--------------------------------------------------------------------------------
/packages.txt:
--------------------------------------------------------------------------------
1 | build-essential
2 | curl
3 | software-properties-common
4 | git
5 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | aiohappyeyeballs==2.4.3
2 | aiohttp==3.10.10
3 | aiosignal==1.3.1
4 | altair==5.4.1
5 | annotated-types==0.7.0
6 | anyio==4.6.2.post1
7 | attrs==24.2.0
8 | blinker==1.8.2
9 | cachetools==5.5.0
10 | certifi==2024.8.30
11 | charset-normalizer==3.4.0
12 | click==8.1.7
13 | dataclasses-json==0.6.7
14 | distro==1.9.0
15 | dnspython==2.7.0
16 | frozenlist==1.5.0
17 | gitdb==4.0.11
18 | GitPython==3.1.43
19 | h11==0.14.0
20 | httpcore==1.0.6
21 | httpx==0.27.2
22 | idna==3.10
23 | Jinja2==3.1.4
24 | jiter==0.7.0
25 | jsonpatch==1.33
26 | jsonpointer==3.0.0
27 | jsonschema==4.23.0
28 | jsonschema-specifications==2024.10.1
29 | langchain==0.3.7
30 | langchain-core==0.3.15
31 | langchain-openai==0.2.6
32 | langchain-text-splitters==0.3.2
33 | langsmith==0.1.141
34 | markdown-it-py==3.0.0
35 | MarkupSafe==3.0.2
36 | marshmallow==3.23.1
37 | mdurl==0.1.2
38 | motor==3.6.0
39 | multidict==6.1.0
40 | mypy-extensions==1.0.0
41 | narwhals==1.13.3
42 | numpy==1.26.4
43 | openai==1.54.3
44 | orjson==3.10.11
45 | packaging==24.2
46 | pandas==2.2.3
47 | pillow==11.0.0
48 | propcache==0.2.0
49 | protobuf==5.28.3
50 | pyarrow==18.0.0
51 | pydantic==2.9.2
52 | pydantic_core==2.23.4
53 | pydeck==0.9.1
54 | Pygments==2.18.0
55 | pymongo==4.9.2
56 | python-dateutil==2.9.0.post0
57 | pytz==2024.2
58 | PyYAML==6.0.2
59 | referencing==0.35.1
60 | regex==2024.11.6
61 | requests==2.32.3
62 | requests-toolbelt==1.0.0
63 | rich==13.9.4
64 | rpds-py==0.21.0
65 | six==1.16.0
66 | smmap==5.0.1
67 | sniffio==1.3.1
68 | SQLAlchemy==2.0.36
69 | streamlit==1.40.0
70 | tenacity==9.0.0
71 | tiktoken==0.8.0
72 | toml==0.10.2
73 | tornado==6.4.1
74 | tqdm==4.67.0
75 | typing-inspect==0.9.0
76 | typing_extensions==4.12.2
77 | tzdata==2024.2
78 | tzlocal==5.2
79 | urllib3==2.2.3
80 | yarl==1.17.1
81 |
--------------------------------------------------------------------------------
/scripts/getting_started.sh:
--------------------------------------------------------------------------------
1 | virtualenv .venv
2 | .venv/bin/python -m pip install -r requirements.txt
3 |
4 | if [ ! -f ./.streamlit/secrets.toml ]; then
5 | cp ./.streamlit/secrets_template.toml ./.streamlit/secrets.toml
6 | read -p "Please enter your openai api key: " replace
7 | sed -i '' "s/openai_api_key = \"your key here\"/openai_api_key = \"$replace\"/" ./.streamlit/secrets.toml
8 | fi
9 | .venv/bin/python -m streamlit run source/qualitative_analyse_agent.py
10 |
--------------------------------------------------------------------------------
/scripts/push_tag.sh:
--------------------------------------------------------------------------------
1 | # Get the version in args
2 | version=$1
3 |
4 | # Check if the version is in the right format (v1.0.0)
5 | echo $version | grep -qP "^v[0-9]+\.[0-9]+\.[0-9]+$"
6 |
7 | # If the version is not in the right format, exit with an error
8 | if [ $? -ne 0 ]; then
9 | echo "Version $version is not in the right format (v1.0.0)"
10 | exit 1
11 | fi
12 |
13 | # Check if the version is not already tagged
14 | git tag | grep -q $version
15 |
16 | # If the version is already tagged, exit with an error
17 | if [ $? -eq 0 ]; then
18 | echo "Version $version is already tagged"
19 | exit 1
20 | fi
21 |
22 | # Verify we are on main branch
23 | git branch --show-current | grep -q "main"
24 |
25 | # If the branch is not main, exit with an error
26 | if [ $? -ne 0 ]; then
27 | echo "You are not on the main branch"
28 | exit 1
29 | fi
30 |
31 | # Apply the version number
32 | sed -i "s/VERSION=\".*\"/VERSION=\"$version\"/" source/version.py
33 | git add version.py
34 | git commit -m "Bump version to $version"
35 | git push origin main
36 |
37 | # Tag the version
38 | git tag "$version"
39 | git push origin "$version"
--------------------------------------------------------------------------------
/source/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gamma-Software/llm_qualitative_data_analysis/45b2d1ee50c38d6f2fea26c42e029b250268a25e/source/__init__.py
--------------------------------------------------------------------------------
/source/modules/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gamma-Software/llm_qualitative_data_analysis/45b2d1ee50c38d6f2fea26c42e029b250268a25e/source/modules/__init__.py
--------------------------------------------------------------------------------
/source/modules/chains.py:
--------------------------------------------------------------------------------
1 | import streamlit as st
2 |
3 | from langchain_openai import ChatOpenAI
4 | from langchain.chains import LLMChain
5 | from langchain.prompts import PromptTemplate
6 | from langchain.chains import SequentialChain
7 |
8 | from modules.output_parsers import theme_parser
9 |
10 |
11 | # --- Summarizing qualitative data ---
12 | def summary_chain(llm):
13 | """--- Summarizing qualitative data ---"""
14 | summary_template = """Summarize the transcript in {max_limit_summary} words.
15 | transcript: {transcript}
16 | summary:"""
17 | summary_prompt_template = PromptTemplate(
18 | input_variables=["max_limit_summary", "transcript"], template=summary_template
19 | )
20 | return LLMChain(llm=llm, prompt=summary_prompt_template, output_key="summary")
21 |
22 |
23 | def summary_qa_chain(llm):
24 | """--- Summarizing qualitative data with research question ---"""
25 | summary_qa_template = """Summarize the transcript based on the research question in {max_limit_summary} words.
26 | transcript: {transcript}
27 | question: {question}
28 | summary_qa:"""
29 | summary_qa_prompt_template = PromptTemplate(
30 | input_variables=["max_limit_summary", "transcript", "question"],
31 | template=summary_qa_template,
32 | )
33 | return LLMChain(llm=llm, prompt=summary_qa_prompt_template, output_key="summary_qa")
34 |
35 |
36 | def generate_codes_chain(llm):
37 | prompt_codes = """Review the given transcripts to identify relevant excerpts that address the research question.
38 | Generate between {min_limit_codes} and {max_limit_codes} phrases (or codes) that best represent the excerpts identified. Each code must be between two to five words long.
39 |
40 | {format_instructions}
41 | Where code1 and code2 are the codes you generated and excerpt1 and excerpt2 are the excerpts that support the code.
42 |
43 |
44 |
45 | {transcript}
46 |
47 |
48 |
49 | {question}
50 |
51 |
52 | codes:"""
53 |
54 | format = """respect the following format:
55 | ```json
56 | {
57 | "code1": "excerpt1",
58 | "code2": "excerpt2",
59 | ... (repeat for each code)
60 | }
61 | ```
62 | Example:
63 | ```json
64 | {
65 | "beneficial_pay_as_you_go": "beneficial pay-as-you-go option",
66 | "broader_range_healthy_options": "recommendations broader range healthy options",
67 | }
68 | ```
69 | """
70 |
71 | extract_code_prompt_template = PromptTemplate(
72 | input_variables=[
73 | "min_limit_codes",
74 | "max_limit_codes",
75 | "transcript",
76 | "question",
77 | ],
78 | template=prompt_codes,
79 | partial_variables={"format_instructions": format},
80 | )
81 | return LLMChain(llm=llm, prompt=extract_code_prompt_template, output_key="codes")
82 |
83 |
84 | def generate_themes_chain(llm):
85 | prompt_themes = """Based on the summary you generated, develop 5 or 6 themes by categorizing the codes and addressing the research question.
86 | Each themes must in between 5 to 6 words long.
87 |
88 |
89 | {format_instructions}
90 |
91 |
92 |
93 | {codes}
94 |
95 | {format_codes}
96 |
97 |
98 | {summary_qa}
99 |
100 |
101 |
102 | {question}
103 |
104 |
105 | themes:"""
106 |
107 | format = """respect the following format:
108 | ```json
109 | {
110 | "themes": [
111 | {
112 | "theme": "Theme 1",
113 | "code": [
114 | "code1 of theme 1 category",
115 | "code2 of theme 1 category"
116 | ]
117 | },
118 | {
119 | "theme": "Theme 2",
120 | "code": [
121 | "code1 of theme 2 category",
122 | "code2 of theme 2 category"
123 | ]
124 | },
125 | ... (repeat for each theme)
126 | }
127 | ```
128 | Example:
129 | ```json
130 | {
131 | "themes": [
132 | {
133 | "theme": "Dining Choices",
134 | "code": [
135 | "beneficial_meal_plan",
136 | "beneficial_pay_as_you_go"
137 | ]
138 | },
139 | {
140 | "theme": "Vegetarian Options",
141 | "code": [
142 | "improving_vegetarian_options",
143 | "broader_range_healthy_options"
144 | ]
145 | }
146 | ]
147 | }
148 | ```
149 | """
150 |
151 | format_codes = """
152 | The code format above is:
153 | ```json
154 | {
155 | "code1": "excerpt1",
156 | "code2": "excerpt2",
157 | ... (repeat for each code)
158 | }
159 | ```
160 | """
161 | extract_themes_prompt_template = PromptTemplate(
162 | input_variables=["codes", "summary_qa", "question"],
163 | template=prompt_themes,
164 | partial_variables={"format_instructions": format, "format_codes": format_codes},
165 | )
166 | return LLMChain(llm=llm, prompt=extract_themes_prompt_template, output_key="themes")
167 |
168 |
169 | def overall_chain():
170 | llm = ChatOpenAI(
171 | temperature=0,
172 | model_name="gpt-3.5-turbo-16k",
173 | openai_api_key=st.session_state["openai_api_key"],
174 | )
175 | llm2 = ChatOpenAI(
176 | temperature=0.5,
177 | model_name="gpt-3.5-turbo-16k",
178 | openai_api_key=st.session_state["openai_api_key"],
179 | )
180 |
181 | return SequentialChain(
182 | chains=[
183 | summary_qa_chain(llm),
184 | generate_codes_chain(llm2),
185 | generate_themes_chain(llm2),
186 | ],
187 | input_variables=[
188 | "max_limit_summary",
189 | "min_limit_codes",
190 | "max_limit_codes",
191 | "transcript",
192 | "question",
193 | ],
194 | output_variables=["summary_qa", "codes", "themes"],
195 | verbose=True,
196 | )
197 |
--------------------------------------------------------------------------------
/source/modules/output_parsers.py:
--------------------------------------------------------------------------------
1 | import re
2 | from typing import List
3 | from pydantic import BaseModel, Field, validator
4 |
5 | from langchain.output_parsers import PydanticOutputParser
6 |
7 |
8 | class ExcerptCode(BaseModel):
9 | excerpt: str = Field(description="Relevant excerpt from the transcript")
10 | code: str = Field(description="Code generated that best represent the excerpts identified")
11 |
12 | @validator("code")
13 | def code_is_not_long(cls, info):
14 | size_code = len(re.split(r',|-|_|/| ', info))
15 | if size_code < 2 or size_code > 5:
16 | raise ValueError("Each code must be between two to five words long."
17 | f"The code {info} is {size_code} long.")
18 | return info
19 |
20 |
21 | class ExcerptCodes(BaseModel):
22 | excerpt_code: List[ExcerptCode] = Field(description="List of excerpt and code generated")
23 |
24 |
25 | class Theme(BaseModel):
26 | theme: str = Field(description="Theme that was identified")
27 | code: List[str] = Field(description="List of codes categorized by theme identified")
28 |
29 |
30 | class Themes(BaseModel):
31 | themes: List[Theme] = Field(description="List of themes identified")
32 |
33 | @validator("themes")
34 | def themes_is_not_long(cls, info):
35 | size_list_themes = len(info)
36 | if size_list_themes > 6:
37 | raise ValueError("The number of themes must not exceed 6."
38 | f"{size_list_themes} over 6 was generated.")
39 | return info
40 |
41 |
42 | code_parser = PydanticOutputParser(pydantic_object=ExcerptCodes)
43 | theme_parser = PydanticOutputParser(pydantic_object=Themes)
44 |
--------------------------------------------------------------------------------
/source/modules/report.py:
--------------------------------------------------------------------------------
1 | import json
2 | import pandas as pd
3 |
4 |
5 | summary = """
6 | Based on the two transcripts, students have mixed perceptions of the quality and accessibility of food services on campus. While some aspects are appreciated, there is room for improvement. The affordability of food is a concern for students on a tight budget, as some options can be expensive. The variety and diversity of food options are generally decent, but students would like to see more international and culturally diverse choices.
7 |
8 | Students have different dietary restrictions and preferences, such as being vegetarian or trying to eat healthy. The college does offer some accommodations, but there is a desire for more variety in vegetarian and healthy options.
9 |
10 | In terms of dining choices, students find the weekly meal plan and pay-as-you-go options beneficial for managing their expenses and having flexibility in choosing when and what to eat. Some students also use food delivery services or order food from off-campus when they want specific cuisines not available on campus.
11 |
12 | Student feedback does seem to have some impact on food services, with changes being made in response to requests for healthier options. However, some students feel that the college could be more responsive to their suggestions and make more improvements based on feedback.
13 |
14 | There are some sustainability initiatives in place, such as recycling bins and compostable utensils, but students feel that more can be done to reduce waste and promote sustainability.
15 |
16 | Overall, students have varying levels of satisfaction with the food services on campus. Factors such as affordability, variety, dietary accommodations, and responsiveness to feedback influence their perceptions and dining choices. Students would like to see improvements in vegetarian options, affordability, transparency in pricing, and regular updates on changes or improvements planned for the future.
17 | """
18 |
19 | codes = """
20 | {
21 | "open_conversations_about_differences": "people talk about their differences",
22 | "differences_in_major_and_sorority": "two different worlds within major and sorority",
23 | "racism_common_in_sorority": "people think racism is common in sorority",
24 | "discussions_about_racism_in_classes": "talking about realities of racism in classes",
25 | "need_to_seek_out_spaces": "need to seek out spaces to talk about race",
26 | "limited_spaces_for_race_discussions": "some spaces are not open to race discussions",
27 | "racial_consciousness_in_classes": "racial consciousness in Chicano Studies",
28 | "friendship_facilitates_dialogue": "friendship facilitates dialogue about difference",
29 | "ignorant_viewpoints_on_race": "encountering ignorant viewpoints on race",
30 | "uncomfortable_discussions_about_race": "uncomfortable discussions about race",
31 | "discussions_in_student_government": "discussions about race in student government",
32 | "facilitating_dialogue_with_empathy": "facilitating dialogue with empathy",
33 | "taboos_prevent_dialogue": "societal taboos prevent dialogue",
34 | "uncomfortable_talking_about_sexuality": "uncomfortable discussing sexuality with ex-girlfriend",
35 | "smaller_things_trigger_inhibition": "smaller things inhibit comfortable conversations",
36 | "conversations_in_dorms_and_jobs": "conversations in dorms and workplace",
37 | "comfortable_talking_about_differences": "comfortable talking about differences at work",
38 | "limited_connections_outside_dorm": "less connected to UCLA outside of dorm",
39 | "conversations_in_classes_and_clubs": "conversations in classes and clubs",
40 | "embarrassment_and_fear_prevent_dialogue": "embarrassment and fear prevent dialogue",
41 | "honesty_in_discussions_about_differences": "honesty in discussions about differences",
42 | "interactions_in_clubs_and_organizations": "interactions in clubs and organizations",
43 | "pride_in_sharing_culture": "pride in sharing Armenian culture"
44 | }
45 | """
46 |
47 | themes = """
48 | {
49 | "themes": [
50 | {
51 | "theme": "Frequency of Conversations",
52 | "code": [
53 | "open_conversations_about_differences",
54 | "differences_in_major_and_sorority",
55 | "racism_common_in_sorority",
56 | "discussions_about_racism_in_classes",
57 | "need_to_seek_out_spaces",
58 | "limited_spaces_for_race_discussions",
59 | "racial_consciousness_in_classes",
60 | "friendship_facilitates_dialogue",
61 | "ignorant_viewpoints_on_race",
62 | "uncomfortable_discussions_about_race",
63 | "discussions_in_student_government",
64 | "facilitating_dialogue_with_empathy",
65 | "taboos_prevent_dialogue",
66 | "uncomfortable_talking_about_sexuality",
67 | "smaller_things_trigger_inhibition",
68 | "conversations_in_dorms_and_jobs",
69 | "comfortable_talking_about_differences",
70 | "limited_connections_outside_dorm",
71 | "conversations_in_classes_and_clubs",
72 | "embarrassment_and_fear_prevent_dialogue",
73 | "honesty_in_discussions_about_differences",
74 | "interactions_in_clubs_and_organizations",
75 | "pride_in_sharing_culture"
76 | ]
77 | },
78 | {
79 | "theme": "Context of Conversations",
80 | "code": [
81 | "differences_in_major_and_sorority",
82 | "racism_common_in_sorority",
83 | "discussions_about_racism_in_classes",
84 | "limited_spaces_for_race_discussions",
85 | "racial_consciousness_in_classes",
86 | "conversations_in_dorms_and_jobs",
87 | "limited_connections_outside_dorm",
88 | "conversations_in_classes_and_clubs",
89 | "interactions_in_clubs_and_organizations"
90 | ]
91 | },
92 | {
93 | "theme": "Desire for More Conversations",
94 | "code": [
95 | "need_to_seek_out_spaces",
96 | "discussions_in_student_government",
97 | "facilitating_dialogue_with_empathy",
98 | "taboos_prevent_dialogue",
99 | "embarrassment_and_fear_prevent_dialogue"
100 | ]
101 | },
102 | {
103 | "theme": "Depth of Conversations",
104 | "code": [
105 | "discussions_about_racism_in_classes",
106 | "racial_consciousness_in_classes",
107 | "facilitating_dialogue_with_empathy",
108 | "honesty_in_discussions_about_differences"
109 | ]
110 | },
111 | {
112 | "theme": "Improvement in Conversations",
113 | "code": [
114 | "uncomfortable_discussions_about_race",
115 | "taboos_prevent_dialogue",
116 | "embarrassment_and_fear_prevent_dialogue"
117 | ]
118 | }
119 | ]
120 | }
121 | """
122 |
123 |
124 | def _clean_themes_data(themes):
125 | # Create an empty set to store unique codes
126 | unique_codes = set()
127 |
128 | # Create a new list to store themes with unique codes
129 | themes_with_unique_codes = []
130 |
131 | # Iterate through the themes and remove duplicates
132 | for theme_data in themes["themes"]:
133 | theme = theme_data["theme"]
134 | codes = theme_data["code"]
135 |
136 | # Replace underscores with spaces and filter out duplicates
137 | cleaned_codes = list(set([code.replace("_", " ") for code in codes]))
138 |
139 | # Filter out duplicates and add only unique codes to the set
140 | unique_codes.update(cleaned_codes)
141 |
142 | # Create a new theme entry with unique codes
143 | theme_entry = {
144 | "theme": theme,
145 | "code": list(set(cleaned_codes)) # Convert the list to a set to remove duplicates
146 | }
147 | themes_with_unique_codes.append(theme_entry)
148 |
149 | # Update the JSON data with themes containing unique codes
150 | themes["themes"] = themes_with_unique_codes
151 | return themes
152 |
153 |
154 | def _clean_codes_data(codes):
155 | return list({"excerpt": code["excerpt"],
156 | "code": code["code"].replace("_", " ")} for code in codes)
157 |
158 |
159 | def parse_codes(_codes, _themes):
160 | # Create an empty dictionary to store the cleaned data
161 | cleaned_data_dict = {"Theme": [], "Codes": [], "Excerpts from transcript": []}
162 |
163 | # Create a set to store unique codes
164 | json1_data = json.loads(_codes)
165 | json2_data = json.loads(_themes)
166 |
167 | # Fill columns
168 | for theme_data in json2_data["themes"]:
169 | theme = theme_data["theme"]
170 | codes = set(theme_data["code"]) # Remove duplicates
171 | code = ", ".join([d.replace("_", " ") for d in codes]) # Replace underscores with spaces
172 | cleaned_data_dict["Theme"].append(theme)
173 | cleaned_data_dict["Codes"].append(code)
174 | excerpts_combined = []
175 | for c in codes:
176 | # Search for code in keys of json1_data
177 | if c in json1_data.keys():
178 | excerpts_combined.append(json1_data[c])
179 | excerpts_combined = set(excerpts_combined)
180 | cleaned_data_dict["Excerpts from transcript"].append(", ".join(excerpts_combined))
181 |
182 | return pd.DataFrame(cleaned_data_dict)
183 |
--------------------------------------------------------------------------------
/source/qualitative_analyse_agent.py:
--------------------------------------------------------------------------------
1 | import os
2 | from io import StringIO
3 | import time
4 |
5 | import streamlit as st
6 |
7 | # Setup langsmith variables
8 | os.environ['LANGCHAIN_TRACING_V2'] = st.secrets["langsmith"]["tracing"]
9 | os.environ['LANGCHAIN_ENDPOINT'] = st.secrets["langsmith"]["api_url"]
10 | os.environ['LANGCHAIN_API_KEY'] = st.secrets["langsmith"]["api_key"]
11 | os.environ['LANGCHAIN_PROJECT'] = st.secrets["langsmith"]["project"]
12 |
13 | from modules.report import parse_codes # noqa: E402
14 | from modules.chains import summary_chain, overall_chain # noqa: E402
15 |
16 |
17 | st.set_page_config(
18 | page_title="Qualitative Data Analysis",
19 | page_icon="📝",
20 | layout="wide",
21 | initial_sidebar_state="expanded",
22 | menu_items={
23 | 'Get Help': 'mailto:valentin.rudloff.perso@gmail.com',
24 | 'Report a bug': "https://github.com/Gamma-Software/llm_qualitative_data_analysis/issues",
25 | 'About': open("README.md", "r").read()
26 | }
27 | )
28 |
29 | with st.sidebar:
30 | st.title("Getting started")
31 | menu = st.selectbox("Select pages", ["Raw data", "Qualitative Analysis", "About"], index=1)
32 |
33 | if ("openai_api_key" not in st.secrets or
34 | "openai_api_key" in st.secrets and
35 | st.secrets["openai_api_key"] == "your key here"):
36 | openai_api_key = st.text_input("OpenAI API Key", key="chatbot_api_key", type="password")
37 | if openai_api_key and 'openai_api_key' not in st.session_state:
38 | st.session_state['openai_api_key'] = openai_api_key
39 | "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)"
40 | else:
41 | st.session_state['openai_api_key'] = st.secrets["openai_api_key"]
42 |
43 | files = st.file_uploader("Upload your data", accept_multiple_files=True, type=['txt', 'md'])
44 |
45 | options = st.container()
46 | options.title("Options ⚙️")
47 | max_limit_summary_words = options.select_slider(
48 | 'Select a limit of words for the summary',
49 | options=range(100, 2000, 100),
50 | value=(1000))
51 | min_limit_codes, max_limit_codes = options.select_slider(
52 | 'Select a range of codes to generate',
53 | options=range(2, 21, 1),
54 | value=(14, 20))
55 | min_limit_theme_words, max_limit_theme_words = options.select_slider(
56 | 'Each themes must between min/max words long',
57 | options=range(2, 10, 1),
58 | value=(5, 6))
59 |
60 | st.divider()
61 | st.markdown("Made with ❤️ by [Valentin Rudloff](https://www.linkedin.com/in/rudloffvalentin/)")
62 |
63 | if menu == "About":
64 | st.markdown(open("README.md", "r").read())
65 | st.stop()
66 |
67 | st.title("Qualitative Analysis 📝 Agent")
68 | st.caption("Using the power of LLMs")
69 |
70 | description_container = st.container()
71 | description_container.write(
72 | """This is a tool to help you do your qualitative data analysis.
73 | This can for instance take your transcripts and generate codes
74 | and themes for you""")
75 | description_container.markdown(
76 | """To perfom the qualitative analysis, you will need to upload
77 | your transcripts and ask a research question. The tool will
78 | then generate:\n1. summary of the transcripts \n2. Identify
79 | excerts and generate codes\n3. Generate themes (by categorizing
80 | codes) based on the research question you asked.""")
81 | description_container.markdown(
82 | """Learn more about
83 | [Qualitative Analysis](https://www.investopedia.com/terms/q/qualitativeanalysis.asp)""")
84 |
85 | if not files:
86 | st.info("Please upload some qualitative data in the sidebar")
87 | st.stop()
88 |
89 | if 'openai_api_key' not in st.session_state:
90 | st.info("Please add your OpenAI API key to continue.")
91 | st.stop()
92 |
93 | # Fetching Qualitative Data
94 | qualitative_docs = []
95 | if files:
96 | # Read the qualitative data
97 | # TODO force a format
98 | for file in files:
99 | # To read file as bytes:
100 | bytes_data = file.getvalue()
101 |
102 | # To convert to a string based IO:
103 | stringio = StringIO(file.getvalue().decode("utf-8"))
104 |
105 | # To read file as string:
106 | string_data = stringio.read()
107 | qualitative_docs.append("\n".join([string_data]))
108 | qualitative_docs_string = "\n\n".join(
109 | [f"Qualitative Data {files[i].name}:\n{d}" for i, d in enumerate(qualitative_docs)])
110 |
111 | if qualitative_docs and menu == "Raw data":
112 | st.subheader("Show Raw data")
113 | tabs = st.tabs([file.name for file in files])
114 | for i, tab in enumerate(tabs):
115 | with tab:
116 | tab.markdown(qualitative_docs[i])
117 |
118 | # TODO Add audio transcription to text
119 |
120 | # --- Summarizing qualitative data ---
121 | if menu == "Raw data":
122 | if st.button("Summarize transcripts", key="summarize"):
123 | with st.spinner("Summarizing..."):
124 | chain = summary_chain()
125 | summarize = chain({"max_limit_summary": max_limit_summary_words,
126 | "transcript": qualitative_docs_string})
127 | with st.expander("Summary"):
128 | st.markdown(summarize["summary"])
129 |
130 | # --- Summarizing qualitative data based on a research question ---
131 | # This step should use the RAG method to repond to the user based on the question
132 | if menu == "Qualitative Analysis":
133 | question = st.text_area("Research question", placeholder="How do students perceive the quality "
134 | "and accessibility of food services on campus, and what factors "
135 | "influence their dining choices and satisfaction?")
136 |
137 | # --- Summarizing transcripts ---
138 | # DONE
139 |
140 | # --- Generating initial codes ---
141 | # DONE
142 |
143 | # --- (Double check) Verify the codes generated ---
144 | # TODO
145 |
146 | # --- Generating themes ---
147 | # DONE
148 |
149 | # --- (Double check) Verify the themes generated ---
150 | # TODO
151 |
152 | # --- Get source of the excerpts ---
153 | # TODO
154 |
155 | # --- Execute LLM Chain ---
156 | output = None
157 | if not question:
158 | st.info("Please enter a question to continue analysis...")
159 | elif st.button("🚄 Perform Qualitative Analysis"):
160 | with st.status("Qualitative Analysis...", expanded=True) as status:
161 | time_start = time.time()
162 | status_placeholder = st.container()
163 | st.toast("Generate Summary/Code/Theme with AI...")
164 | status_placeholder.write("Generate Summary/Code/Theme with AI...")
165 | output = overall_chain()({"max_limit_summary": max_limit_summary_words,
166 | "min_limit_codes": min_limit_codes,
167 | "max_limit_codes": max_limit_codes,
168 | "transcript": qualitative_docs_string,
169 | "question": question}, return_only_outputs=True)
170 | try:
171 | pass
172 | except Exception:
173 | status.update(label="Qualitative Analysis... Failed", state="error")
174 |
175 | st.toast("Generating report 📝...")
176 | status_placeholder.write("Generating report 📝...")
177 |
178 | st.session_state["generated_themes"] = output["themes"]
179 | st.session_state["generated_codes"] = output["codes"]
180 | st.session_state["generated_summary"] = output["summary_qa"]
181 | st.session_state["table"] = parse_codes(st.session_state["generated_codes"], st.session_state["generated_themes"])
182 | msg = ""
183 | for i, row in st.session_state["table"].iterrows():
184 | msg += "\n## "+row["Theme"]
185 | sub_code = row["Codes"].split(",")
186 | sub_exc = row["Excerpts from transcript"].split(",")
187 | for i, _ in enumerate(sub_code):
188 | msg += "\n- "+sub_code[i]+" -> *\""+sub_exc[i]+"\"*"
189 | st.session_state["report"] = "# Summary\n"+st.session_state["generated_summary"]+f"\n\n# Result of Analysis\n{msg}"
190 |
191 | time_elapsed = time.time() - time_start
192 | st.caption(f"Generation took: {time_elapsed:.2f}s")
193 |
194 | # --- Generating a report in a table form ---
195 | status_placeholder = st.empty()
196 | status.update(label="Qualitative Analysis complete!", state="complete")
197 |
198 | if all([key in st.session_state for key in ["report", "generated_summary", "table"]]):
199 | st.header("Analysis report 📈")
200 | st.markdown(st.session_state["report"])
201 | st.download_button(
202 | label="Download the report",
203 | data=st.session_state["report"],
204 | file_name='report.md',
205 | mime='text/markdown',
206 | )
207 |
--------------------------------------------------------------------------------
/source/version.py:
--------------------------------------------------------------------------------
1 | VERSION="0.1.0"
--------------------------------------------------------------------------------