Explorar el Código

RAG и Langfuse

Artem Kastrov hace 1 mes
padre
commit
b60b74694a
Se han modificado 25 ficheros con 562 adiciones y 2730 borrados
  1. 2 7
      .docker/python/Dockerfile
  2. 33 0
      .dockerignore
  3. 48 4
      .env.example
  4. 1 0
      .gitignore
  5. 0 18
      Pipfile
  6. 0 2214
      Pipfile.lock
  7. 43 21
      Taskfile.yml
  8. 0 12
      config.py
  9. 8 9
      devbox.json
  10. 0 64
      devbox.lock
  11. 152 0
      docker-compose.langfuse.yml
  12. 29 8
      docker-compose.yml
  13. 8 4
      requirements.txt
  14. 0 0
      src/__init__.py
  15. 16 13
      src/app.py
  16. 0 59
      src/chroma_manager.py
  17. 21 0
      src/config.py
  18. 20 0
      src/database/embeddings.py
  19. 53 0
      src/database/loading.py
  20. 31 0
      src/database/vectordb.py
  21. 0 79
      src/formatter.py
  22. 97 33
      src/inference.py
  23. 0 108
      src/main.py
  24. 0 44
      src/ollama.py
  25. 0 33
      src/rag.py

+ 2 - 7
.docker/python/Dockerfile

@@ -1,11 +1,6 @@
 FROM python:3.11-slim
 
 WORKDIR /app
+COPY requirements.txt ./
 
-COPY Pipfile Pipfile.lock ./
-
-RUN apt-get update && apt-get install -y curl \
-    && pip install pipenv \
-    && pipenv install --system --deploy --ignore-pipfile
-
-CMD ["python", "app.py"]
+RUN pip install --no-cache-dir -r requirements.txt

+ 33 - 0
.dockerignore

@@ -0,0 +1,33 @@
+# Git
+.git
+.gitignore
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+
+# Logs
+*.log
+logs/
+
+# Dependencies
+node_modules/
+__pycache__/
+target/
+build/
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Documentation
+README.md
+*.md
+
+# Temporary files
+*.tmp
+*.temp
+
+.venv

+ 48 - 4
.env.example

@@ -7,11 +7,55 @@ COMPOSE_PROJECT_NAME=rag-inference
 # Ollama
 OLLAMA_HOST=ollama
 OLLAMA_PORT=11434
-OLLAMA_URL=http://${OLLAMA_HOST}:${OLLAMA_PORT}
-OLLAMA_MODEL=qwen3:8b
-OLLAMA_MODELS=qwen3:8b
-OLLAMA_MAX_LOADED_MODELS=1
+# OLLAMA_URL=http://${OLLAMA_HOST}:${OLLAMA_PORT}
+# OLLAMA_MODEL=qwen3:8b
+OLLAMA_URL=https://ollama.com
+OLLAMA_MODEL=glm-4.6
+OLLAMA_API_KEY=
 
 # Chroma
 CHROMA_HOST=chroma
 CHROMA_PORT=8000
+
+# Postgres
+DB_HOST=pgsql
+DB_PORT=5432
+DB_DATABASE=app
+DB_USERNAME=app
+DB_PASSWORD=p@ssw0rd
+
+
+# LangFuse
+LANGFUSE_HOST=http://langfuse:3000
+LANGFUSE_PUBLIC_KEY=pk-lf-ad5219bd-5fa4-4e34-847c-b92aa1187445
+LANGFUSE_SECRET_KEY=sk-lf-adabf93c-51cb-41a8-8bd5-ef4f13ea6215
+SALT=s@lt
+NEXTAUTH_SECRET=secret
+ENCRYPTION_KEY=874c72be7ad4f6cd4a41947e43451bc01dbfbba441bb472fd4f247c3400369c2 # generate via `openssl rand -hex 32`
+LANGFUSE_INIT_ORG_ID=1
+LANGFUSE_INIT_ORG_NAME=llm
+LANGFUSE_INIT_PROJECT_ID=1
+LANGFUSE_INIT_PROJECT_NAME=rag
+LANGFUSE_INIT_PROJECT_PUBLIC_KEY=${LANGFUSE_PUBLIC_KEY}
+LANGFUSE_INIT_PROJECT_SECRET_KEY=${LANGFUSE_SECRET_KEY}
+LANGFUSE_INIT_USER_EMAIL=email@email.ru
+LANGFUSE_INIT_USER_NAME=app
+LANGFUSE_INIT_USER_PASSWORD=p@ssw0rd
+
+# Redis
+REDIS_PASSWORD=p@ssw0rd
+REDIS_PORT=6379
+
+# Minio
+AWS_ACCESS_KEY_ID=minio
+AWS_SECRET_ACCESS_KEY=p@ssw0rd
+AWS_DEFAULT_REGION=local
+AWS_BUCKET=app
+AWS_USE_PATH_STYLE_ENDPOINT=true
+AWS_URL=http://localhost:9090
+AWS_ENDPOINT=http://minio:9000
+
+# Clickhouse
+CLICKHOUSE_DB=app
+CLICKHOUSE_USER=app
+CLICKHOUSE_PASSWORD=p@ssw0rd

+ 1 - 0
.gitignore

@@ -7,6 +7,7 @@
 /.vscode
 /.venv
 /.git
+/.cache
 .idea
 .devbox
 .project

+ 0 - 18
Pipfile

@@ -1,18 +0,0 @@
-[[source]]
-url = "https://pypi.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-fastapi = "*"
-uvicorn = "*"
-ollama = "*"
-load-dotenv = "*"
-datasets = "*"
-langchain = {extras = ["anthropic"], version = "*"}
-langchain-ollama = "*"
-
-[dev-packages]
-
-[requires]
-python_version = "3.11"

+ 0 - 2214
Pipfile.lock

@@ -1,2214 +0,0 @@
-{
-    "_meta": {
-        "hash": {
-            "sha256": "f2537f1a33576a49b6f455cf5d40c62d449860b0d80ae8a246f182f8f3f25201"
-        },
-        "pipfile-spec": 6,
-        "requires": {
-            "python_version": "3.11"
-        },
-        "sources": [
-            {
-                "name": "pypi",
-                "url": "https://pypi.org/simple",
-                "verify_ssl": true
-            }
-        ]
-    },
-    "default": {
-        "aiohappyeyeballs": {
-            "hashes": [
-                "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558",
-                "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.6.1"
-        },
-        "aiohttp": {
-            "hashes": [
-                "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329",
-                "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6",
-                "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7",
-                "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254",
-                "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742",
-                "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad",
-                "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906",
-                "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5",
-                "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811",
-                "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded",
-                "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca",
-                "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f",
-                "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98",
-                "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a",
-                "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a",
-                "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155",
-                "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6",
-                "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e",
-                "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b",
-                "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e",
-                "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b",
-                "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa",
-                "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf",
-                "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5",
-                "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc",
-                "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514",
-                "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f",
-                "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07",
-                "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca",
-                "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e",
-                "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9",
-                "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0",
-                "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782",
-                "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d",
-                "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213",
-                "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293",
-                "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead",
-                "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04",
-                "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61",
-                "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3",
-                "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4",
-                "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b",
-                "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da",
-                "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6",
-                "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22",
-                "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725",
-                "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be",
-                "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661",
-                "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e",
-                "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d",
-                "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989",
-                "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c",
-                "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec",
-                "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45",
-                "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a",
-                "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8",
-                "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac",
-                "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694",
-                "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636",
-                "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169",
-                "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a",
-                "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204",
-                "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a",
-                "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab",
-                "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae",
-                "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948",
-                "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8",
-                "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5",
-                "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30",
-                "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16",
-                "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693",
-                "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084",
-                "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3",
-                "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4",
-                "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592",
-                "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49",
-                "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a",
-                "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e",
-                "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4",
-                "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9",
-                "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b",
-                "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f",
-                "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802",
-                "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb",
-                "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b",
-                "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011",
-                "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3",
-                "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7",
-                "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c",
-                "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734",
-                "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700",
-                "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d",
-                "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901",
-                "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2",
-                "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5",
-                "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23",
-                "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8",
-                "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613",
-                "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb",
-                "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251",
-                "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6",
-                "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780",
-                "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd",
-                "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c",
-                "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf",
-                "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa",
-                "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40",
-                "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7",
-                "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673",
-                "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb",
-                "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61",
-                "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940",
-                "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be",
-                "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b",
-                "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4",
-                "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476",
-                "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d",
-                "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f",
-                "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248",
-                "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.13.2"
-        },
-        "aiosignal": {
-            "hashes": [
-                "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e",
-                "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.4.0"
-        },
-        "annotated-doc": {
-            "hashes": [
-                "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320",
-                "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.0.4"
-        },
-        "annotated-types": {
-            "hashes": [
-                "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
-                "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.7.0"
-        },
-        "anthropic": {
-            "hashes": [
-                "sha256:0d56cd8b3ca3fea9c9b5162868bdfd053fbc189b8b56d4290bd2d427b56db769",
-                "sha256:30f0d7d86390165f86af6ca7c3041f8720bb2e1b0e12a44525c8edfdbd2c5239"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.73.0"
-        },
-        "anyio": {
-            "hashes": [
-                "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc",
-                "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==4.11.0"
-        },
-        "attrs": {
-            "hashes": [
-                "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11",
-                "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==25.4.0"
-        },
-        "certifi": {
-            "hashes": [
-                "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b",
-                "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==2025.11.12"
-        },
-        "charset-normalizer": {
-            "hashes": [
-                "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad",
-                "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93",
-                "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394",
-                "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89",
-                "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc",
-                "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86",
-                "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63",
-                "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d",
-                "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f",
-                "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8",
-                "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0",
-                "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505",
-                "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161",
-                "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af",
-                "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152",
-                "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318",
-                "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72",
-                "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4",
-                "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e",
-                "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3",
-                "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576",
-                "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c",
-                "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1",
-                "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8",
-                "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1",
-                "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2",
-                "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44",
-                "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26",
-                "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88",
-                "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016",
-                "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede",
-                "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf",
-                "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a",
-                "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc",
-                "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0",
-                "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84",
-                "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db",
-                "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1",
-                "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7",
-                "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed",
-                "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8",
-                "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133",
-                "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e",
-                "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef",
-                "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14",
-                "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2",
-                "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0",
-                "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d",
-                "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828",
-                "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f",
-                "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf",
-                "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6",
-                "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328",
-                "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090",
-                "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa",
-                "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381",
-                "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c",
-                "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb",
-                "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc",
-                "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a",
-                "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec",
-                "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc",
-                "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac",
-                "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e",
-                "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313",
-                "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569",
-                "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3",
-                "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d",
-                "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525",
-                "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894",
-                "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3",
-                "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9",
-                "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a",
-                "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9",
-                "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14",
-                "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25",
-                "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50",
-                "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf",
-                "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1",
-                "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3",
-                "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac",
-                "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e",
-                "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815",
-                "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c",
-                "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6",
-                "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6",
-                "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e",
-                "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4",
-                "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84",
-                "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69",
-                "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15",
-                "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191",
-                "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0",
-                "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897",
-                "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd",
-                "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2",
-                "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794",
-                "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d",
-                "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074",
-                "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3",
-                "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224",
-                "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838",
-                "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a",
-                "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d",
-                "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d",
-                "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f",
-                "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8",
-                "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490",
-                "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966",
-                "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9",
-                "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3",
-                "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e",
-                "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==3.4.4"
-        },
-        "click": {
-            "hashes": [
-                "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc",
-                "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==8.3.0"
-        },
-        "datasets": {
-            "hashes": [
-                "sha256:80322699aa8c0bbbdb7caa87906da689c3c2e29523cff698775c67f28fdab1fc",
-                "sha256:c1163de5211e42546079ab355cc0250c7e6db16eb209ac5ac6252f801f596c44"
-            ],
-            "index": "pypi",
-            "markers": "python_full_version >= '3.9.0'",
-            "version": "==4.4.1"
-        },
-        "dill": {
-            "hashes": [
-                "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0",
-                "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.4.0"
-        },
-        "distro": {
-            "hashes": [
-                "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed",
-                "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==1.9.0"
-        },
-        "docstring-parser": {
-            "hashes": [
-                "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912",
-                "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.17.0"
-        },
-        "fastapi": {
-            "hashes": [
-                "sha256:ca8e932b2b823ec1721c641e3669472c855ad9564a2854c9899d904c2848b8b9",
-                "sha256:f2d80b49a86a846b70cc3a03eb5ea6ad2939298bf6a7fe377aa9cd3dd079d358"
-            ],
-            "index": "pypi",
-            "markers": "python_version >= '3.8'",
-            "version": "==0.121.2"
-        },
-        "filelock": {
-            "hashes": [
-                "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2",
-                "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==3.20.0"
-        },
-        "frozenlist": {
-            "hashes": [
-                "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686",
-                "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0",
-                "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121",
-                "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd",
-                "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7",
-                "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c",
-                "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84",
-                "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d",
-                "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b",
-                "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79",
-                "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967",
-                "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f",
-                "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4",
-                "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7",
-                "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef",
-                "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9",
-                "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3",
-                "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd",
-                "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087",
-                "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068",
-                "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7",
-                "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed",
-                "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b",
-                "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f",
-                "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25",
-                "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe",
-                "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143",
-                "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e",
-                "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930",
-                "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37",
-                "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128",
-                "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2",
-                "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675",
-                "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f",
-                "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746",
-                "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df",
-                "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8",
-                "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c",
-                "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0",
-                "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad",
-                "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82",
-                "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29",
-                "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c",
-                "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30",
-                "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf",
-                "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62",
-                "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5",
-                "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383",
-                "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c",
-                "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52",
-                "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d",
-                "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1",
-                "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a",
-                "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714",
-                "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65",
-                "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95",
-                "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1",
-                "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506",
-                "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888",
-                "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6",
-                "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41",
-                "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459",
-                "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a",
-                "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608",
-                "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa",
-                "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8",
-                "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1",
-                "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186",
-                "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6",
-                "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed",
-                "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e",
-                "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52",
-                "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231",
-                "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450",
-                "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496",
-                "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a",
-                "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3",
-                "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24",
-                "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178",
-                "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695",
-                "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7",
-                "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4",
-                "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e",
-                "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e",
-                "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61",
-                "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca",
-                "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad",
-                "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b",
-                "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a",
-                "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8",
-                "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51",
-                "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011",
-                "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8",
-                "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103",
-                "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b",
-                "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda",
-                "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806",
-                "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042",
-                "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e",
-                "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b",
-                "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef",
-                "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d",
-                "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567",
-                "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a",
-                "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2",
-                "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0",
-                "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e",
-                "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b",
-                "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d",
-                "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a",
-                "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52",
-                "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47",
-                "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1",
-                "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94",
-                "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f",
-                "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff",
-                "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822",
-                "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a",
-                "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11",
-                "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581",
-                "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51",
-                "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565",
-                "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40",
-                "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92",
-                "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2",
-                "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5",
-                "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4",
-                "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93",
-                "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027",
-                "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.8.0"
-        },
-        "fsspec": {
-            "extras": [
-                "http"
-            ],
-            "hashes": [
-                "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d",
-                "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2025.10.0"
-        },
-        "h11": {
-            "hashes": [
-                "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1",
-                "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.16.0"
-        },
-        "hf-xet": {
-            "hashes": [
-                "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e",
-                "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc",
-                "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4",
-                "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382",
-                "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090",
-                "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8",
-                "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0",
-                "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd",
-                "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848",
-                "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737",
-                "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a",
-                "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f",
-                "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc",
-                "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f",
-                "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865",
-                "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f",
-                "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813",
-                "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5",
-                "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649",
-                "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c",
-                "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69",
-                "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.2.0"
-        },
-        "httpcore": {
-            "hashes": [
-                "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55",
-                "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.0.9"
-        },
-        "httpx": {
-            "hashes": [
-                "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc",
-                "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.28.1"
-        },
-        "huggingface-hub": {
-            "hashes": [
-                "sha256:867799fbd2ef338b7f8b03d038d9c0e09415dfe45bb2893b48a510d1d746daa5",
-                "sha256:a7424a766fffa1a11e4c1ac2040a1557e2101f86050fdf06627e7b74cc9d2ad6"
-            ],
-            "markers": "python_full_version >= '3.9.0'",
-            "version": "==1.1.4"
-        },
-        "idna": {
-            "hashes": [
-                "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea",
-                "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==3.11"
-        },
-        "jiter": {
-            "hashes": [
-                "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45",
-                "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789",
-                "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126",
-                "sha256:122046f3b3710b85de99d9aa2f3f0492a8233a2f54a64902b096efc27ea747b5",
-                "sha256:15d7fafb81af8a9e3039fc305529a61cd933eecee33b4251878a1c89859552a3",
-                "sha256:1b135ebe757a82d67ed2821526e72d0acf87dd61f6013e20d3c45b8048af927b",
-                "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1",
-                "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd",
-                "sha256:26b9e155ddc132225a39b1995b3b9f0fe0f79a6d5cbbeacf103271e7d309b404",
-                "sha256:27ec39225e03c32c6b863ba879deb427882f243ae46f0d82d68b695fa5b48b40",
-                "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7",
-                "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9",
-                "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873",
-                "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37",
-                "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb",
-                "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb",
-                "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e",
-                "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1",
-                "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725",
-                "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2",
-                "sha256:3a64a48d7c917b8f32f25c176df8749ecf08cec17c466114727efe7441e17f6d",
-                "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d",
-                "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3",
-                "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403",
-                "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c",
-                "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8",
-                "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de",
-                "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6",
-                "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed",
-                "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473",
-                "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6",
-                "sha256:59f9f9df87ed499136db1c2b6c9efb902f964bed42a582ab7af413b6a293e7b0",
-                "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783",
-                "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274",
-                "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87",
-                "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b",
-                "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a",
-                "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e",
-                "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc",
-                "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df",
-                "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf",
-                "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49",
-                "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025",
-                "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8",
-                "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff",
-                "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62",
-                "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3",
-                "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b",
-                "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9",
-                "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183",
-                "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7",
-                "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e",
-                "sha256:92d1f41211d8a8fe412faad962d424d334764c01dac6691c44691c2e4d3eedaf",
-                "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423",
-                "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4",
-                "sha256:9ab05b7c58e29bb9e60b70c2e0094c98df79a1e42e397b9bb6eaa989b7a66dd0",
-                "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e",
-                "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42",
-                "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684",
-                "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c",
-                "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b",
-                "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6",
-                "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a",
-                "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4",
-                "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74",
-                "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf",
-                "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9",
-                "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c",
-                "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525",
-                "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1",
-                "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f",
-                "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11",
-                "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60",
-                "sha256:c9d28b218d5f9e5f69a0787a196322a5056540cb378cac8ff542b4fa7219966c",
-                "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f",
-                "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5",
-                "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d",
-                "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca",
-                "sha256:d0ee12028daf8cfcf880dd492349a122a64f42c059b6c62a2b0c96a83a8da820",
-                "sha256:d3719596a1ebe7a48a498e8d5d0c4bf7553321d4c3eee1d620628d51351a3928",
-                "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451",
-                "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44",
-                "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9",
-                "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f",
-                "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44",
-                "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993",
-                "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3",
-                "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf",
-                "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a",
-                "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b",
-                "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7",
-                "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65",
-                "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb",
-                "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb",
-                "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c",
-                "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6",
-                "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e",
-                "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86",
-                "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626",
-                "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e",
-                "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2",
-                "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.12.0"
-        },
-        "jsonpatch": {
-            "hashes": [
-                "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade",
-                "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
-            "version": "==1.33"
-        },
-        "jsonpointer": {
-            "hashes": [
-                "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942",
-                "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==3.0.0"
-        },
-        "langchain": {
-            "extras": [
-                "anthropic"
-            ],
-            "hashes": [
-                "sha256:cf33b4d60d7a2ff7f0f313441628927853192cdbab9d6d8ce229909a868bbf12",
-                "sha256:e3f8ad742b4cdc91d728f96bd70e4688bc11ffeca3bd160c5fe9937625d541b9"
-            ],
-            "markers": "python_full_version >= '3.10.0' and python_full_version < '4.0.0'",
-            "version": "==1.0.7"
-        },
-        "langchain-anthropic": {
-            "hashes": [
-                "sha256:46e2a842755609d4a0e9dcc505779093b1a462b04ee9024cbd751ea6853a8890",
-                "sha256:ba3e580ac0691b268082b82280bb898af485b58dbf23a65f27e692c009e543ad"
-            ],
-            "markers": "python_full_version >= '3.10.0' and python_full_version < '4.0.0'",
-            "version": "==1.0.4"
-        },
-        "langchain-core": {
-            "hashes": [
-                "sha256:7ecbad9a60dde626252733a9c18c7377f4468cfe00465ffa99f5e9c6cb9b82d2",
-                "sha256:d24c0cf12cfcd96dd4bd479aa91425f3a6652226cd824228ae422a195067b74e"
-            ],
-            "markers": "python_full_version >= '3.10.0' and python_full_version < '4.0.0'",
-            "version": "==1.0.5"
-        },
-        "langchain-ollama": {
-            "hashes": [
-                "sha256:2ea9ad1b0f0ab319d600b9193d1124a8925523a3b943d75a967718e24ec09a8a",
-                "sha256:5828523fcbd137847490841110a6aedf96b68534e7fe2735715ecf3e835b2391"
-            ],
-            "index": "pypi",
-            "markers": "python_full_version >= '3.10.0' and python_full_version < '4.0.0'",
-            "version": "==1.0.0"
-        },
-        "langgraph": {
-            "hashes": [
-                "sha256:4a75146f09bd0d127a724876f4244f460c4c66353a993641bd641ed710cd010f",
-                "sha256:873a6aae6be054ef52a05c463be363a46da9711405b1b14454d595f543b68335"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==1.0.3"
-        },
-        "langgraph-checkpoint": {
-            "hashes": [
-                "sha256:59222f875f85186a22c494aedc65c4e985a3df27e696e5016ba0b98a5ed2cee0",
-                "sha256:9b04a8d0edc0474ce4eaf30c5d731cee38f11ddff50a6177eead95b5c4e4220b"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==3.0.1"
-        },
-        "langgraph-prebuilt": {
-            "hashes": [
-                "sha256:50b1aa2b434783b6da30785568cf7155136b484750cc2ec695c0d4255db08262",
-                "sha256:7b4f9e97a146d2d625695c3549bdb432974b80817165139ec2ec869721e72c0f"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==1.0.4"
-        },
-        "langgraph-sdk": {
-            "hashes": [
-                "sha256:b3bd04c6be4fa382996cd2be8fbc1e7cc94857d2bc6b6f4599a7f2a245975303",
-                "sha256:fbf302edadbf0fb343596f91c597794e936ef68eebc0d3e1d358b6f9f72a1429"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.2.9"
-        },
-        "langsmith": {
-            "hashes": [
-                "sha256:75c2468ab740438adfb32af8595ad8837c3af2bd1cdaf057d534182c5a07407a",
-                "sha256:c97846a0b15061bc15844aac32fd1ce4a8e50983905f80a0d6079bb41b112ae3"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==0.4.43"
-        },
-        "load-dotenv": {
-            "hashes": [
-                "sha256:614803f720153fb8a5f97124a72aaa3930a67aa5547cbe8603d01ea7f9ac1adf",
-                "sha256:bbe5f40072d4a61eadca66de6c222df5a2d935d6d41b703be1ff75396f635145"
-            ],
-            "index": "pypi",
-            "version": "==0.1.0"
-        },
-        "multidict": {
-            "hashes": [
-                "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3",
-                "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec",
-                "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd",
-                "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b",
-                "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb",
-                "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32",
-                "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f",
-                "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7",
-                "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36",
-                "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd",
-                "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff",
-                "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8",
-                "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d",
-                "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721",
-                "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0",
-                "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3",
-                "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d",
-                "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa",
-                "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10",
-                "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202",
-                "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0",
-                "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718",
-                "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e",
-                "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6",
-                "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1",
-                "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2",
-                "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754",
-                "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c",
-                "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390",
-                "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128",
-                "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912",
-                "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c",
-                "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3",
-                "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6",
-                "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2",
-                "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f",
-                "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84",
-                "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842",
-                "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9",
-                "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6",
-                "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd",
-                "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8",
-                "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599",
-                "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62",
-                "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec",
-                "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34",
-                "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0",
-                "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e",
-                "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6",
-                "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc",
-                "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc",
-                "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c",
-                "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7",
-                "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4",
-                "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4",
-                "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38",
-                "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5",
-                "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111",
-                "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e",
-                "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84",
-                "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c",
-                "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1",
-                "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546",
-                "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a",
-                "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c",
-                "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036",
-                "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38",
-                "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99",
-                "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64",
-                "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e",
-                "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f",
-                "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159",
-                "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e",
-                "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12",
-                "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1",
-                "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0",
-                "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184",
-                "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851",
-                "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb",
-                "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32",
-                "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b",
-                "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288",
-                "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81",
-                "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd",
-                "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45",
-                "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a",
-                "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca",
-                "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5",
-                "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb",
-                "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349",
-                "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b",
-                "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f",
-                "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32",
-                "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5",
-                "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34",
-                "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c",
-                "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4",
-                "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17",
-                "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60",
-                "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394",
-                "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff",
-                "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00",
-                "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85",
-                "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7",
-                "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304",
-                "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13",
-                "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e",
-                "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e",
-                "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792",
-                "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329",
-                "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb",
-                "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b",
-                "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000",
-                "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6",
-                "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62",
-                "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63",
-                "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5",
-                "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e",
-                "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c",
-                "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827",
-                "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8",
-                "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91",
-                "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96",
-                "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad",
-                "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6",
-                "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40",
-                "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7",
-                "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4",
-                "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648",
-                "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064",
-                "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73",
-                "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b",
-                "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762",
-                "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e",
-                "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4",
-                "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e",
-                "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546",
-                "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046",
-                "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6",
-                "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9",
-                "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d",
-                "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf",
-                "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687",
-                "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e",
-                "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885",
-                "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==6.7.0"
-        },
-        "multiprocess": {
-            "hashes": [
-                "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213",
-                "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3",
-                "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df",
-                "sha256:2dbaae9bffa1fb2d58077c0044ffe87a8c8974e90fcf778cdf90e139c970d42a",
-                "sha256:3fbba48bfcd932747c33f0b152b26207c4e0840c35cab359afaff7a8672b1031",
-                "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797",
-                "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d",
-                "sha256:5f9be0342e597dde86152c10442c5fb6c07994b1c29de441b7a3a08b0e6be2a0",
-                "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea",
-                "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2",
-                "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334",
-                "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6",
-                "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2",
-                "sha256:9fd8d662f7524a95a1be7cbea271f0b33089fe792baabec17d93103d368907da",
-                "sha256:bcac5a4e81f1554d98d1bba963eeb1bd24966432f04fcbd29b6e1a16251ad712",
-                "sha256:c0c7cd75d0987ab6166d64e654787c781dbacbcbcaaede4c1ffe664720b3e14b",
-                "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b",
-                "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8",
-                "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.70.18"
-        },
-        "numpy": {
-            "hashes": [
-                "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64",
-                "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e",
-                "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0",
-                "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365",
-                "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d",
-                "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c",
-                "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52",
-                "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36",
-                "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec",
-                "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f",
-                "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197",
-                "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7",
-                "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9",
-                "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37",
-                "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a",
-                "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db",
-                "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c",
-                "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7",
-                "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d",
-                "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e",
-                "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f",
-                "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a",
-                "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16",
-                "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e",
-                "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868",
-                "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05",
-                "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e",
-                "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff",
-                "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f",
-                "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7",
-                "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f",
-                "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e",
-                "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562",
-                "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6",
-                "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0",
-                "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26",
-                "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0",
-                "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d",
-                "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879",
-                "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef",
-                "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29",
-                "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252",
-                "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847",
-                "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6",
-                "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32",
-                "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0",
-                "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3",
-                "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b",
-                "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3",
-                "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc",
-                "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc",
-                "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda",
-                "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a",
-                "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40",
-                "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032",
-                "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7",
-                "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966",
-                "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9",
-                "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346",
-                "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2",
-                "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a",
-                "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786",
-                "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f",
-                "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc",
-                "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb",
-                "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646",
-                "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd",
-                "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1",
-                "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11",
-                "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667",
-                "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996",
-                "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953",
-                "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b",
-                "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb"
-            ],
-            "markers": "python_version >= '3.11'",
-            "version": "==2.3.4"
-        },
-        "ollama": {
-            "hashes": [
-                "sha256:478c67546836430034b415ed64fa890fd3d1ff91781a9d548b3325274e69d7c6",
-                "sha256:fc4c984b345735c5486faeee67d8a265214a31cbb828167782dc642ce0a2bf8c"
-            ],
-            "index": "pypi",
-            "markers": "python_version >= '3.8'",
-            "version": "==0.6.1"
-        },
-        "orjson": {
-            "hashes": [
-                "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9",
-                "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c",
-                "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a",
-                "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a",
-                "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1",
-                "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10",
-                "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350",
-                "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73",
-                "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241",
-                "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13",
-                "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155",
-                "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc",
-                "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54",
-                "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac",
-                "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534",
-                "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c",
-                "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad",
-                "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d",
-                "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905",
-                "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907",
-                "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a",
-                "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a",
-                "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b",
-                "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b",
-                "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803",
-                "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44",
-                "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9",
-                "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d",
-                "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9",
-                "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63",
-                "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39",
-                "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938",
-                "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc",
-                "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b",
-                "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6",
-                "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23",
-                "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0",
-                "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045",
-                "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839",
-                "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9",
-                "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e",
-                "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780",
-                "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d",
-                "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415",
-                "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19",
-                "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549",
-                "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c",
-                "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040",
-                "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a",
-                "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196",
-                "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827",
-                "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be",
-                "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23",
-                "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210",
-                "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436",
-                "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea",
-                "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44",
-                "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de",
-                "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316",
-                "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2",
-                "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7",
-                "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f",
-                "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff",
-                "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606",
-                "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa",
-                "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d",
-                "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f",
-                "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140",
-                "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708",
-                "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919",
-                "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e",
-                "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50",
-                "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79",
-                "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1",
-                "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394",
-                "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175",
-                "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba",
-                "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6",
-                "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a",
-                "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf",
-                "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1",
-                "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853",
-                "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc",
-                "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5",
-                "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3",
-                "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1",
-                "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.11.4"
-        },
-        "ormsgpack": {
-            "hashes": [
-                "sha256:0f3981ba3cba80656012090337e548e597799e14b41e3d0b595ab5ab05a23d7f",
-                "sha256:27579d45dc502ee736238e1024559cb0a01aa72a3b68827448b8edf6a2dcdc9c",
-                "sha256:3583ca410e4502144b2594170542e4bbef7b15643fd1208703ae820f11029036",
-                "sha256:3fd43bcb299131690b8e0677af172020b2ada8e625169034b42ac0c13adf84aa",
-                "sha256:433ace29aa02713554f714c62a4e4dcad0c9e32674ba4f66742c91a4c3b1b969",
-                "sha256:45f911d9c5b23d11e49ff03fc8f9566745a2b1a7d9033733a1c0a2fa9301cd60",
-                "sha256:4b291d086e524a1062d57d1b7b5a8bcaaf29caebf0212fec12fd86240bd33633",
-                "sha256:4e418256c5d8622b8bc92861936f7c6a0131355e7bcad88a42102ae8227f8a1c",
-                "sha256:5f0149d595341e22ead340bf281b2995c4cc7dc8d522a6b5f575fe17aa407604",
-                "sha256:6f28896942d655064940dfe06118b7ce1e3468d051483148bf02c99ec157483a",
-                "sha256:74ec101f69624695eec4ce7c953192d97748254abe78fb01b591f06d529e1952",
-                "sha256:7567917da613b8f8d591c1674e411fd3404bea41ef2b9a0e0a1e049c0f9406d7",
-                "sha256:766f2f3b512d85cd375b26a8b1329b99843560b50b93d3880718e634ad4a5de5",
-                "sha256:777b7fab364dc0f200bb382a98a385c8222ffa6a2333d627d763797326202c86",
-                "sha256:84b285b1f3f185aad7da45641b873b30acfd13084cf829cf668c4c6480a81583",
-                "sha256:857ab987c3502de08258cc4baf0e87267cb2c80931601084e13df3c355b1ab9d",
-                "sha256:8ed37f29772432048b58174e920a1d4c4cde0404a5d448d3d8bbcc95d86a6918",
-                "sha256:8f479bfef847255d7d0b12c7a198f6a21490155da2da3062e082ba370893d4a1",
-                "sha256:901f6f55184d6776dbd5183cbce14caf05bf7f467eef52faf9b094686980bf71",
-                "sha256:904f96289deaa92fc6440b122edc27c5bdc28234edd63717f6d853d88c823a83",
-                "sha256:91fa8a452553a62e5fb3fbab471e7faf7b3bec3c87a2f355ebf3d7aab290fe4f",
-                "sha256:9396efcfa48b4abbc06e44c5dbc3c4574a8381a80cb4cd01eea15d28b38c554e",
-                "sha256:94ac500dd10c20fa8b8a23bc55606250bfe711bf9716828d9f3d44dfd1f25668",
-                "sha256:94be818fdbb0285945839b88763b269987787cb2f7ef280cad5d6ec815b7e608",
-                "sha256:96586ed537a5fb386a162c4f9f7d8e6f76e07b38a990d50c73f11131e00ff040",
-                "sha256:98c54ae6fd682b2aceb264505af9b2255f3df9d84e6e4369bc44d2110f1f311d",
-                "sha256:9bbf7896580848326c1f9bd7531f264e561f98db7e08e15aa75963d83832c717",
-                "sha256:a9740bb3839c9368aacae1cbcfc474ee6976458f41cc135372b7255d5206c953",
-                "sha256:b03994bbec5d6d42e03d6604e327863f885bde67aa61e06107ce1fa5bdd3e71d",
-                "sha256:b5b5089ad9dd5b3d3013b245a55e4abaea2f8ad70f4a78e1b002127b02340004",
-                "sha256:b9ed7a4b0037d69c8ba7e670e03ee65ae8d5c5114a409e73c5770d7fb5e4b895",
-                "sha256:c40d86d77391b18dd34de5295e3de2b8ad818bcab9c9def4121c8ec5c9714ae4",
-                "sha256:c5201ff7ec24f721f813a182885a17064cffdbe46b2412685a52e6374a872c8f",
-                "sha256:c78379d054760875540cf2e81f28da1bb78d09fda3eabdbeb6c53b3e297158cb",
-                "sha256:d71290a23de5d4829610c42665d816c661ecad8979883f3f06b2e3ab9639962e",
-                "sha256:db2928525b684f3f2af0367aef7ae8d20cde37fc5349c700017129d493a755aa",
-                "sha256:dc32b156c113a0fae2975051417d8d9a7a5247c34b2d7239410c46b75ce9348a",
-                "sha256:deaf0c87cace7bc08fbf68c5cc66605b593df6427e9f4de235b2da358787e008",
-                "sha256:ded7810095b887e28434f32f5a345d354e88cf851bab3c5435aeb86a718618d2",
-                "sha256:e08904c232358b94a682ccfbb680bc47d3fd5c424bb7dccb65974dd20c95e8e1",
-                "sha256:e0c1e08b64d99076fee155276097489b82cc56e8d5951c03c721a65a32f44494",
-                "sha256:e13b15412571422b711b40f45e3fe6d993ea3314b5e97d1a853fe99226c5effc",
-                "sha256:e23604fc79fe110292cb365f4c8232e64e63a34f470538be320feae3921f271b",
-                "sha256:e57164be4ca34b64e210ec515059193280ac84df4d6f31a6fcbfb2fc8436de55",
-                "sha256:e70387112fb3870e4844de090014212cdcf1342f5022047aecca01ec7de05d7a",
-                "sha256:f19a1b27d169deb553c80fd10b589fc2be1fc14cee779fae79fcaf40db04de2b",
-                "sha256:f62d476fe28bc5675d9aff30341bfa9f41d7de332c5b63fbbe9aaf6bb7ec74d4",
-                "sha256:f72a1dea0c4ae7c4101dcfbe8133f274a9d769d0b87fe5188db4fab07ffabaee"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==1.12.0"
-        },
-        "packaging": {
-            "hashes": [
-                "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
-                "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==25.0"
-        },
-        "pandas": {
-            "hashes": [
-                "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7",
-                "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593",
-                "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5",
-                "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791",
-                "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73",
-                "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec",
-                "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4",
-                "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5",
-                "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac",
-                "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084",
-                "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c",
-                "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87",
-                "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35",
-                "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250",
-                "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c",
-                "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826",
-                "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9",
-                "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713",
-                "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1",
-                "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523",
-                "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3",
-                "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78",
-                "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53",
-                "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c",
-                "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21",
-                "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5",
-                "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff",
-                "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45",
-                "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110",
-                "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493",
-                "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b",
-                "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450",
-                "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86",
-                "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8",
-                "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98",
-                "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89",
-                "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66",
-                "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b",
-                "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8",
-                "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29",
-                "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6",
-                "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc",
-                "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2",
-                "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788",
-                "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa",
-                "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151",
-                "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838",
-                "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b",
-                "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a",
-                "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d",
-                "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908",
-                "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0",
-                "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b",
-                "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c",
-                "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.3.3"
-        },
-        "propcache": {
-            "hashes": [
-                "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e",
-                "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4",
-                "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be",
-                "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3",
-                "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85",
-                "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b",
-                "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367",
-                "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf",
-                "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393",
-                "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888",
-                "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37",
-                "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8",
-                "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60",
-                "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1",
-                "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4",
-                "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717",
-                "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7",
-                "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc",
-                "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe",
-                "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb",
-                "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75",
-                "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6",
-                "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e",
-                "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff",
-                "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566",
-                "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12",
-                "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367",
-                "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874",
-                "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf",
-                "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566",
-                "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a",
-                "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc",
-                "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a",
-                "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1",
-                "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6",
-                "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61",
-                "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726",
-                "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49",
-                "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44",
-                "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af",
-                "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa",
-                "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153",
-                "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc",
-                "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5",
-                "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938",
-                "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf",
-                "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925",
-                "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8",
-                "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c",
-                "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85",
-                "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e",
-                "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0",
-                "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1",
-                "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0",
-                "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992",
-                "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db",
-                "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f",
-                "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d",
-                "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1",
-                "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e",
-                "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900",
-                "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89",
-                "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a",
-                "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b",
-                "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f",
-                "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f",
-                "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1",
-                "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183",
-                "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66",
-                "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21",
-                "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db",
-                "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded",
-                "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb",
-                "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19",
-                "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0",
-                "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165",
-                "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778",
-                "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455",
-                "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f",
-                "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b",
-                "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237",
-                "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81",
-                "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859",
-                "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c",
-                "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835",
-                "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393",
-                "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5",
-                "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641",
-                "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144",
-                "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74",
-                "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db",
-                "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac",
-                "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403",
-                "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9",
-                "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f",
-                "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311",
-                "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581",
-                "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36",
-                "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00",
-                "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a",
-                "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f",
-                "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2",
-                "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7",
-                "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239",
-                "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757",
-                "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72",
-                "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9",
-                "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4",
-                "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24",
-                "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207",
-                "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e",
-                "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1",
-                "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d",
-                "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37",
-                "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c",
-                "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e",
-                "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570",
-                "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af",
-                "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f",
-                "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88",
-                "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48",
-                "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.4.1"
-        },
-        "pyarrow": {
-            "hashes": [
-                "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901",
-                "sha256:00626d9dc0f5ef3a75fe63fd68b9c7c8302d2b5bbc7f74ecaedba83447a24f84",
-                "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae",
-                "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8",
-                "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016",
-                "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941",
-                "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5",
-                "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d",
-                "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9",
-                "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a",
-                "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754",
-                "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d",
-                "sha256:44d2d26cda26d18f7af7db71453b7b783788322d756e81730acb98f24eb90ace",
-                "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80",
-                "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e",
-                "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde",
-                "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f",
-                "sha256:710624ab925dc2b05a6229d47f6f0dac1c1155e6ed559be7109f684eba048a48",
-                "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91",
-                "sha256:77718810bd3066158db1e95a63c160ad7ce08c6b0710bc656055033e39cdad88",
-                "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2",
-                "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8",
-                "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc",
-                "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0",
-                "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7",
-                "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d",
-                "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145",
-                "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746",
-                "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9",
-                "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215",
-                "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730",
-                "sha256:b9d71701ce97c95480fecb0039ec5bb889e75f110da72005743451339262f4ce",
-                "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f",
-                "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc",
-                "sha256:bd0d42297ace400d8febe55f13fdf46e86754842b860c978dfec16f081e5c653",
-                "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d",
-                "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d",
-                "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e",
-                "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe",
-                "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70",
-                "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691",
-                "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6",
-                "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a",
-                "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a",
-                "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9",
-                "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95",
-                "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c",
-                "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c",
-                "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1",
-                "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340"
-            ],
-            "markers": "python_version >= '3.10'",
-            "version": "==22.0.0"
-        },
-        "pydantic": {
-            "hashes": [
-                "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac",
-                "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.12.4"
-        },
-        "pydantic-core": {
-            "hashes": [
-                "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90",
-                "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740",
-                "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504",
-                "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84",
-                "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33",
-                "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c",
-                "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0",
-                "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e",
-                "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0",
-                "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a",
-                "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34",
-                "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2",
-                "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3",
-                "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815",
-                "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14",
-                "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba",
-                "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375",
-                "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf",
-                "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963",
-                "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1",
-                "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808",
-                "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553",
-                "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1",
-                "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2",
-                "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5",
-                "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470",
-                "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2",
-                "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b",
-                "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660",
-                "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c",
-                "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093",
-                "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5",
-                "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594",
-                "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008",
-                "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a",
-                "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a",
-                "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd",
-                "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284",
-                "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586",
-                "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869",
-                "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294",
-                "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f",
-                "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66",
-                "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51",
-                "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc",
-                "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97",
-                "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a",
-                "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d",
-                "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9",
-                "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c",
-                "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07",
-                "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36",
-                "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e",
-                "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05",
-                "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e",
-                "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941",
-                "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3",
-                "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612",
-                "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3",
-                "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b",
-                "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe",
-                "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146",
-                "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11",
-                "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60",
-                "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd",
-                "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b",
-                "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c",
-                "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a",
-                "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460",
-                "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1",
-                "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf",
-                "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf",
-                "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858",
-                "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2",
-                "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9",
-                "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2",
-                "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3",
-                "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6",
-                "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770",
-                "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d",
-                "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc",
-                "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23",
-                "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26",
-                "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa",
-                "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8",
-                "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d",
-                "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3",
-                "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d",
-                "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034",
-                "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9",
-                "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1",
-                "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56",
-                "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b",
-                "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c",
-                "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a",
-                "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e",
-                "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9",
-                "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5",
-                "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a",
-                "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556",
-                "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e",
-                "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49",
-                "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2",
-                "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9",
-                "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b",
-                "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc",
-                "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb",
-                "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0",
-                "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8",
-                "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82",
-                "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69",
-                "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b",
-                "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c",
-                "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75",
-                "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5",
-                "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f",
-                "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad",
-                "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b",
-                "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7",
-                "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425",
-                "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.41.5"
-        },
-        "python-dateutil": {
-            "hashes": [
-                "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
-                "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==2.9.0.post0"
-        },
-        "python-dotenv": {
-            "hashes": [
-                "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6",
-                "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.2.1"
-        },
-        "pytz": {
-            "hashes": [
-                "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3",
-                "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"
-            ],
-            "version": "==2025.2"
-        },
-        "pyyaml": {
-            "hashes": [
-                "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c",
-                "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a",
-                "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3",
-                "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956",
-                "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6",
-                "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c",
-                "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65",
-                "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a",
-                "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0",
-                "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b",
-                "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1",
-                "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6",
-                "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7",
-                "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e",
-                "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007",
-                "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310",
-                "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4",
-                "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9",
-                "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295",
-                "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea",
-                "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0",
-                "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e",
-                "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac",
-                "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9",
-                "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7",
-                "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35",
-                "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb",
-                "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b",
-                "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69",
-                "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5",
-                "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b",
-                "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c",
-                "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369",
-                "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd",
-                "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824",
-                "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198",
-                "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065",
-                "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c",
-                "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c",
-                "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764",
-                "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196",
-                "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b",
-                "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00",
-                "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac",
-                "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8",
-                "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e",
-                "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28",
-                "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3",
-                "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5",
-                "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4",
-                "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b",
-                "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf",
-                "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5",
-                "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702",
-                "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8",
-                "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788",
-                "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da",
-                "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d",
-                "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc",
-                "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c",
-                "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba",
-                "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f",
-                "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917",
-                "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5",
-                "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26",
-                "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f",
-                "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b",
-                "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be",
-                "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c",
-                "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3",
-                "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6",
-                "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926",
-                "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==6.0.3"
-        },
-        "requests": {
-            "hashes": [
-                "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6",
-                "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.32.5"
-        },
-        "requests-toolbelt": {
-            "hashes": [
-                "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
-                "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.0.0"
-        },
-        "shellingham": {
-            "hashes": [
-                "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686",
-                "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==1.5.4"
-        },
-        "six": {
-            "hashes": [
-                "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
-                "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.17.0"
-        },
-        "sniffio": {
-            "hashes": [
-                "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
-                "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==1.3.1"
-        },
-        "starlette": {
-            "hashes": [
-                "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284",
-                "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.49.3"
-        },
-        "tenacity": {
-            "hashes": [
-                "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb",
-                "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==9.1.2"
-        },
-        "tqdm": {
-            "hashes": [
-                "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2",
-                "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==4.67.1"
-        },
-        "typer-slim": {
-            "hashes": [
-                "sha256:9fc6607b3c6c20f5c33ea9590cbeb17848667c51feee27d9e314a579ab07d1a3",
-                "sha256:f42a9b7571a12b97dddf364745d29f12221865acef7a2680065f9bb29c7dc89d"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.20.0"
-        },
-        "typing-extensions": {
-            "hashes": [
-                "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
-                "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==4.15.0"
-        },
-        "typing-inspection": {
-            "hashes": [
-                "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7",
-                "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.4.2"
-        },
-        "tzdata": {
-            "hashes": [
-                "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8",
-                "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"
-            ],
-            "markers": "python_version >= '2'",
-            "version": "==2025.2"
-        },
-        "urllib3": {
-            "hashes": [
-                "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760",
-                "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.5.0"
-        },
-        "uvicorn": {
-            "hashes": [
-                "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02",
-                "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d"
-            ],
-            "index": "pypi",
-            "markers": "python_version >= '3.9'",
-            "version": "==0.38.0"
-        },
-        "xxhash": {
-            "hashes": [
-                "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad",
-                "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c",
-                "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3",
-                "sha256:01be0c5b500c5362871fc9cfdf58c69b3e5c4f531a82229ddb9eb1eb14138004",
-                "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b",
-                "sha256:02ea4cb627c76f48cd9fb37cf7ab22bd51e57e1b519807234b473faebe526796",
-                "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f",
-                "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c",
-                "sha256:0d50101e57aad86f4344ca9b32d091a2135a9d0a4396f19133426c88025b09f1",
-                "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1",
-                "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0",
-                "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec",
-                "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d",
-                "sha256:18b242455eccdfcd1fa4134c431a30737d2b4f045770f8fe84356b3469d4b919",
-                "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67",
-                "sha256:1fc1ed882d1e8df932a66e2999429ba6cc4d5172914c904ab193381fba825360",
-                "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799",
-                "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679",
-                "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef",
-                "sha256:2762bfff264c4e73c0e507274b40634ff465e025f0eaf050897e88ec8367575d",
-                "sha256:277175a73900ad43a8caeb8b99b9604f21fe8d7c842f2f9061a364a7e220ddb7",
-                "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8",
-                "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa",
-                "sha256:2ab89a6b80f22214b43d98693c30da66af910c04f9858dd39c8e570749593d7e",
-                "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa",
-                "sha256:2f171a900d59d51511209f7476933c34a0c2c711078d3c80e74e0fe4f38680ec",
-                "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4",
-                "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad",
-                "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7",
-                "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5",
-                "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11",
-                "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae",
-                "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d",
-                "sha256:44e342e8cc11b4e79dae5c57f2fb6360c3c20cc57d32049af8f567f5b4bcb5f4",
-                "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6",
-                "sha256:45aae0c9df92e7fa46fbb738737324a563c727990755ec1965a6a339ea10a1df",
-                "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058",
-                "sha256:4903530e866b7a9c1eadfd3fa2fbe1b97d3aed4739a80abf506eb9318561c850",
-                "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2",
-                "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d",
-                "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89",
-                "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e",
-                "sha256:4da8168ae52c01ac64c511d6f4a709479da8b7a4a1d7621ed51652f93747dffa",
-                "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6",
-                "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb",
-                "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3",
-                "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b",
-                "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4",
-                "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db",
-                "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119",
-                "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec",
-                "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518",
-                "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296",
-                "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033",
-                "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729",
-                "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca",
-                "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063",
-                "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5",
-                "sha256:6551880383f0e6971dc23e512c9ccc986147ce7bfa1cd2e4b520b876c53e9f3d",
-                "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f",
-                "sha256:6965e0e90f1f0e6cb78da568c13d4a348eeb7f40acfd6d43690a666a459458b8",
-                "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42",
-                "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e",
-                "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392",
-                "sha256:780b90c313348f030b811efc37b0fa1431163cb8db8064cf88a7936b6ce5f222",
-                "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f",
-                "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd",
-                "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77",
-                "sha256:7c35c4cdc65f2a29f34425c446f2f5cdcd0e3c34158931e1cc927ece925ab802",
-                "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d",
-                "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1",
-                "sha256:7dac94fad14a3d1c92affb661021e1d5cbcf3876be5f5b4d90730775ccb7ac41",
-                "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374",
-                "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263",
-                "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71",
-                "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13",
-                "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8",
-                "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc",
-                "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62",
-                "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11",
-                "sha256:9085e798c163ce310d91f8aa6b325dda3c2944c93c6ce1edb314030d4167cc65",
-                "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0",
-                "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b",
-                "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2",
-                "sha256:97460eec202017f719e839a0d3551fbc0b2fcc9c6c6ffaa5af85bbd5de432788",
-                "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6",
-                "sha256:9e040d3e762f84500961791fa3709ffa4784d4dcd7690afc655c095e02fff05f",
-                "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc",
-                "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e",
-                "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702",
-                "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405",
-                "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f",
-                "sha256:a75ffc1bd5def584129774c158e108e5d768e10b75813f2b32650bb041066ed6",
-                "sha256:a87f271a33fad0e5bf3be282be55d78df3a45ae457950deb5241998790326f87",
-                "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3",
-                "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a",
-                "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b",
-                "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b",
-                "sha256:b0359391c3dad6de872fefb0cf5b69d55b0655c55ee78b1bb7a568979b2ce96b",
-                "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8",
-                "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db",
-                "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99",
-                "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a",
-                "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2",
-                "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204",
-                "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b",
-                "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546",
-                "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95",
-                "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9",
-                "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54",
-                "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06",
-                "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c",
-                "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152",
-                "sha256:c2f9ccd5c4be370939a2e17602fbc49995299203da72a3429db013d44d590e86",
-                "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4",
-                "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93",
-                "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd",
-                "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd",
-                "sha256:cc604dc06027dbeb8281aeac5899c35fcfe7c77b25212833709f0bff4ce74d2a",
-                "sha256:cfbc5b91397c8c2972fdac13fb3e4ed2f7f8ccac85cd2c644887557780a9b6e2",
-                "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248",
-                "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd",
-                "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6",
-                "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf",
-                "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7",
-                "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490",
-                "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0",
-                "sha256:e4ff728a2894e7f436b9e94c667b0f426b9c74b71f900cf37d5468c6b5da0536",
-                "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb",
-                "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829",
-                "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746",
-                "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07",
-                "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292",
-                "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6",
-                "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd",
-                "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7",
-                "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d",
-                "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0",
-                "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee",
-                "sha256:ffc578717a347baf25be8397cb10d2528802d24f94cfc005c0e44fef44b5cdd6"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==3.6.0"
-        },
-        "yarl": {
-            "hashes": [
-                "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a",
-                "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8",
-                "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b",
-                "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da",
-                "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf",
-                "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890",
-                "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093",
-                "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6",
-                "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79",
-                "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683",
-                "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed",
-                "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2",
-                "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff",
-                "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02",
-                "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b",
-                "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03",
-                "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511",
-                "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c",
-                "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124",
-                "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c",
-                "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da",
-                "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2",
-                "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0",
-                "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba",
-                "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d",
-                "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53",
-                "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138",
-                "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4",
-                "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748",
-                "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7",
-                "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d",
-                "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503",
-                "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d",
-                "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2",
-                "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa",
-                "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737",
-                "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f",
-                "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1",
-                "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d",
-                "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694",
-                "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3",
-                "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a",
-                "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d",
-                "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b",
-                "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a",
-                "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6",
-                "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b",
-                "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea",
-                "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5",
-                "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f",
-                "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df",
-                "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f",
-                "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b",
-                "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba",
-                "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9",
-                "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0",
-                "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6",
-                "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b",
-                "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967",
-                "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2",
-                "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708",
-                "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda",
-                "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8",
-                "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10",
-                "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c",
-                "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b",
-                "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028",
-                "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e",
-                "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147",
-                "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33",
-                "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca",
-                "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590",
-                "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c",
-                "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53",
-                "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74",
-                "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60",
-                "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f",
-                "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1",
-                "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27",
-                "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520",
-                "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e",
-                "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467",
-                "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca",
-                "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859",
-                "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273",
-                "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e",
-                "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601",
-                "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054",
-                "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376",
-                "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7",
-                "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b",
-                "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb",
-                "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65",
-                "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784",
-                "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71",
-                "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b",
-                "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a",
-                "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c",
-                "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face",
-                "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d",
-                "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e",
-                "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e",
-                "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca",
-                "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9",
-                "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb",
-                "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95",
-                "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed",
-                "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf",
-                "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca",
-                "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2",
-                "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62",
-                "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df",
-                "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a",
-                "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67",
-                "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f",
-                "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529",
-                "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486",
-                "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a",
-                "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e",
-                "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b",
-                "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74",
-                "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d",
-                "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b",
-                "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc",
-                "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2",
-                "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e",
-                "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8",
-                "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82",
-                "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd",
-                "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.22.0"
-        },
-        "zstandard": {
-            "hashes": [
-                "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64",
-                "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a",
-                "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3",
-                "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f",
-                "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6",
-                "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936",
-                "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431",
-                "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250",
-                "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa",
-                "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f",
-                "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851",
-                "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3",
-                "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9",
-                "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6",
-                "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362",
-                "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649",
-                "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb",
-                "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5",
-                "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439",
-                "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137",
-                "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa",
-                "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd",
-                "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701",
-                "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0",
-                "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043",
-                "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1",
-                "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860",
-                "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611",
-                "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53",
-                "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b",
-                "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088",
-                "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e",
-                "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa",
-                "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2",
-                "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0",
-                "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7",
-                "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf",
-                "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388",
-                "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530",
-                "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577",
-                "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902",
-                "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc",
-                "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98",
-                "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a",
-                "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097",
-                "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea",
-                "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09",
-                "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb",
-                "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7",
-                "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74",
-                "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b",
-                "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b",
-                "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b",
-                "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91",
-                "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150",
-                "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049",
-                "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27",
-                "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a",
-                "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00",
-                "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd",
-                "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072",
-                "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c",
-                "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c",
-                "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065",
-                "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512",
-                "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1",
-                "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f",
-                "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2",
-                "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df",
-                "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab",
-                "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7",
-                "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b",
-                "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550",
-                "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0",
-                "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea",
-                "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277",
-                "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2",
-                "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7",
-                "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778",
-                "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859",
-                "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d",
-                "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751",
-                "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12",
-                "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2",
-                "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d",
-                "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0",
-                "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3",
-                "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd",
-                "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e",
-                "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f",
-                "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e",
-                "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94",
-                "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708",
-                "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313",
-                "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4",
-                "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c",
-                "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344",
-                "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551",
-                "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.25.0"
-        }
-    },
-    "develop": {}
-}

+ 43 - 21
Taskfile.yml

@@ -1,12 +1,20 @@
 version: "3"
 
-dotenv: [ '.env' ]
+dotenv: [".env"]
 
 tasks:
   docker-compose:
     internal: true
     cmd: docker compose {{.COMPOSE}}
 
+  docker-run:
+    aliases: [run]
+    silent: true
+    cmds:
+      - task: docker-compose
+        vars:
+          COMPOSE: run --rm cli {{.COMMAND}}
+
   init:
     desc: Первый запуск
     cmds:
@@ -15,16 +23,16 @@ tasks:
 
   docker-up:
     desc: Запустить контейнеры
-    aliases: [ up ]
+    aliases: [up]
     cmds:
       - task: docker-compose
         vars:
           COMPOSE: up -d
-      - task: status
+      # - task: status
 
   docker-pull:
     desc: Загрузить образы
-    aliases: [ pull ]
+    aliases: [pull]
     cmds:
       - task: docker-compose
         vars:
@@ -32,7 +40,7 @@ tasks:
 
   docker-build:
     desc: Build образов
-    aliases: [ build ]
+    aliases: [build]
     cmds:
       - task: docker-compose
         vars:
@@ -40,7 +48,7 @@ tasks:
 
   docker-down:
     desc: Остановить контейнеры
-    aliases: [ down ]
+    aliases: [down]
     cmds:
       - task: docker-compose
         vars:
@@ -48,14 +56,14 @@ tasks:
 
   docker-restart:
     desc: Перезапустить все контейнеры
-    aliases: [ restart ]
+    aliases: [restart]
     cmds:
       - task: down
       - task: up
 
   docker-pause:
     desc: Пауза контейнеров
-    aliases: [ pause ]
+    aliases: [pause]
     cmds:
       - task: docker-compose
         vars:
@@ -63,7 +71,7 @@ tasks:
 
   docker-unpause:
     desc: Пуск контейнеров
-    aliases: [ unpause, play ]
+    aliases: [unpause, play]
     cmds:
       - task: docker-compose
         vars:
@@ -71,7 +79,7 @@ tasks:
 
   docker-ps:
     desc: Список контейнеров
-    aliases: [ ps ]
+    aliases: [ps]
     cmds:
       - task: docker-compose
         vars:
@@ -79,18 +87,32 @@ tasks:
 
   docker-clean:
     desc: Удалить volumes и кэш laravel
-    aliases: [ clean ]
+    aliases: [clean]
     cmds:
       - task: optimize-clear
-      - cmd: docker compose down -v --remove-orphans
+      - cmd: docker compose down -v --remove-orphans\
 
-  status:
-    desc: Статус приложения
+  sh:
+    desc: shell внутри контейнера
     cmds:
-      - echo -e "\033[1;36m========================================\033[0m"
-      - echo -e "\033[1;32m✔ Application is ready!\033[0m"
-      - echo -e "\033[1;36m========================================\033[0m"
-      # - echo ""
-      - echo -e "\033[1;33mLangfuse:\033[0m          http://localhost:3000"
-      - echo -e "\033[1;36m========================================\033[0m"
-    silent: true
+      - task: docker-run
+        vars:
+          COMMAND: /bin/bash
+
+  chroma-loading:
+    desc: shell внутри контейнера
+    cmds:
+      - task: docker-run
+        vars:
+          COMMAND: python -m src.database.loading
+
+  # status:
+  #   desc: Статус приложения
+  #   cmds:
+  #     - echo -e "\033[1;36m========================================\033[0m"
+  #     - echo -e "\033[1;32m✔ Application is ready!\033[0m"
+  #     - echo -e "\033[1;36m========================================\033[0m"
+  #     # - echo ""
+  #     - echo -e "\033[1;33mLangfuse:\033[0m          http://localhost:3000"
+  #     - echo -e "\033[1;36m========================================\033[0m"
+  #   silent: true

+ 0 - 12
config.py

@@ -1,12 +0,0 @@
-import os
-
-from dotenv import load_dotenv
-
-load_dotenv()
-
-CHROMA_HOST = os.getenv("CHROMA_HOST")
-CHROMA_PORT = os.getenv("CHROMA_PORT")
-
-OLLAMA_URL = os.getenv("OLLAMA_URL")
-OLLAMA_MODEL = os.getenv("OLLAMA_MODEL")
-OLLAMA_API_KEY = os.getenv("OLLAMA_API_KEY")

+ 8 - 9
devbox.json

@@ -1,20 +1,19 @@
 {
   "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json",
-  "packages": [
-    "python@3.11",
-    "pipenv@latest"
-  ],
+  "packages": ["python@3.11"],
   "shell": {
     "init_hook": [
-      "pipenv install --dev",
-      "pipenv shell"
+      ". $VENV_DIR/bin/activate",
+      "pip install --upgrade pip",
+      "pip install -r requirements.txt"
     ],
     "scripts": {
       "serve": [
-        "source .venv/bin/activate",
-        "uvicorn src.app:app --reload --host 0.0.0.0 --port 8000"
+        "uvicorn app:app --app-dir src --reload --host 0.0.0.0 --port 8000"
       ]
     }
   },
-  "env": {}
+  "env": {
+    "SENTENCE_TRANSFORMERS_HOME": "./.cache"
+  }
 }

+ 0 - 64
devbox.lock

@@ -5,70 +5,6 @@
       "last_modified": "2025-11-07T02:32:13Z",
       "resolved": "github:NixOS/nixpkgs/e1ebeec86b771e9d387dd02d82ffdc77ac753abc?lastModified=1762482733&narHash=sha256-g%2Fda4FzvckvbiZT075Sb1%2FYDNDr%2BtGQgh4N8i5ceYMg%3D"
     },
-    "pipenv@latest": {
-      "last_modified": "2025-10-22T20:59:19Z",
-      "resolved": "github:NixOS/nixpkgs/01b6809f7f9d1183a2b3e081f0a1e6f8f415cb09#pipenv",
-      "source": "devbox-search",
-      "version": "2025.0.4",
-      "systems": {
-        "aarch64-darwin": {
-          "outputs": [
-            {
-              "name": "out",
-              "path": "/nix/store/xdqhyl85hz5qscal3wk6p5426rk9gzpk-pipenv-2025.0.4",
-              "default": true
-            },
-            {
-              "name": "dist",
-              "path": "/nix/store/v41pjscwfqlkqxgg7wbc0796d8kn16lw-pipenv-2025.0.4-dist"
-            }
-          ],
-          "store_path": "/nix/store/xdqhyl85hz5qscal3wk6p5426rk9gzpk-pipenv-2025.0.4"
-        },
-        "aarch64-linux": {
-          "outputs": [
-            {
-              "name": "out",
-              "path": "/nix/store/laj18m8gk47d9wqicnqhpx8g09bj59gb-pipenv-2025.0.4",
-              "default": true
-            },
-            {
-              "name": "dist",
-              "path": "/nix/store/jx5q3qqy9s31cxz07k0glwar32793i2k-pipenv-2025.0.4-dist"
-            }
-          ],
-          "store_path": "/nix/store/laj18m8gk47d9wqicnqhpx8g09bj59gb-pipenv-2025.0.4"
-        },
-        "x86_64-darwin": {
-          "outputs": [
-            {
-              "name": "out",
-              "path": "/nix/store/35qai7pxm4lxz5ayaawq1pnqadz6r807-pipenv-2025.0.4",
-              "default": true
-            },
-            {
-              "name": "dist",
-              "path": "/nix/store/db7p55kzkjck246ckgr6gxg1na9vv2s2-pipenv-2025.0.4-dist"
-            }
-          ],
-          "store_path": "/nix/store/35qai7pxm4lxz5ayaawq1pnqadz6r807-pipenv-2025.0.4"
-        },
-        "x86_64-linux": {
-          "outputs": [
-            {
-              "name": "out",
-              "path": "/nix/store/kdw6i5qlh7j8gmd6cr9bp2a2pil6xw2n-pipenv-2025.0.4",
-              "default": true
-            },
-            {
-              "name": "dist",
-              "path": "/nix/store/g4iy73w0anmwv8dh9l9a8i8p1w93ir5s-pipenv-2025.0.4-dist"
-            }
-          ],
-          "store_path": "/nix/store/kdw6i5qlh7j8gmd6cr9bp2a2pil6xw2n-pipenv-2025.0.4"
-        }
-      }
-    },
     "python@3.11": {
       "last_modified": "2025-10-22T20:59:19Z",
       "plugin_version": "0.0.4",

+ 152 - 0
docker-compose.langfuse.yml

@@ -0,0 +1,152 @@
+services:
+  langfuse-worker:
+    image: langfuse/langfuse-worker:3
+    ports:
+      - 127.0.0.1:3030:3030
+    environment: &langfuse-worker-env
+      NEXTAUTH_URL: http://localhost:3000
+      DATABASE_URL: postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_DATABASE}
+      SALT: ${SALT}
+      ENCRYPTION_KEY: ${ENCRYPTION_KEY}
+      TELEMETRY_ENABLED: ${TELEMETRY_ENABLED:-true}
+      LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: ${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-true}
+      CLICKHOUSE_MIGRATION_URL: ${CLICKHOUSE_MIGRATION_URL:-clickhouse://clickhouse:9000}
+      CLICKHOUSE_URL: ${CLICKHOUSE_URL:-http://clickhouse:8123}
+      CLICKHOUSE_USER: ${CLICKHOUSE_USER}
+      CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
+      CLICKHOUSE_CLUSTER_ENABLED: ${CLICKHOUSE_CLUSTER_ENABLED:-false}
+      # LANGFUSE_USE_AZURE_BLOB: ${LANGFUSE_USE_AZURE_BLOB:-false}
+      LANGFUSE_S3_EVENT_UPLOAD_BUCKET: ${AWS_BUCKET}
+      LANGFUSE_S3_EVENT_UPLOAD_REGION: ${AWS_DEFAULT_REGION}
+      LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
+      LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
+      LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: ${AWS_ENDPOINT}
+      LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: ${AWS_USE_PATH_STYLE_ENDPOINT}
+      LANGFUSE_S3_EVENT_UPLOAD_PREFIX: ${LANGFUSE_S3_EVENT_UPLOAD_PREFIX:-events/}
+      LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: ${AWS_BUCKET}
+      LANGFUSE_S3_MEDIA_UPLOAD_REGION: ${AWS_DEFAULT_REGION}
+      LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
+      LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
+      LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: ${AWS_URL}
+      LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: ${AWS_USE_PATH_STYLE_ENDPOINT}
+      LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: ${LANGFUSE_S3_MEDIA_UPLOAD_PREFIX:-media/}
+      LANGFUSE_S3_BATCH_EXPORT_ENABLED: ${LANGFUSE_S3_BATCH_EXPORT_ENABLED:-false}
+      LANGFUSE_S3_BATCH_EXPORT_BUCKET: ${AWS_BUCKET}
+      LANGFUSE_S3_BATCH_EXPORT_PREFIX: ${LANGFUSE_S3_BATCH_EXPORT_PREFIX:-exports/}
+      LANGFUSE_S3_BATCH_EXPORT_REGION: ${AWS_DEFAULT_REGION}
+      LANGFUSE_S3_BATCH_EXPORT_ENDPOINT: ${AWS_ENDPOINT}
+      LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT: ${AWS_URL}
+      LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
+      LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
+      LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE: ${AWS_USE_PATH_STYLE_ENDPOINT}
+      # LANGFUSE_INGESTION_QUEUE_DELAY_MS: ${LANGFUSE_INGESTION_QUEUE_DELAY_MS:-}
+      # LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS: ${LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS:-}
+      REDIS_HOST: ${REDIS_HOST:-redis}
+      REDIS_PORT: ${REDIS_PORT:-6379}
+      REDIS_AUTH: ${REDIS_PASSWORD}
+      # REDIS_TLS_ENABLED: ${REDIS_TLS_ENABLED:-false}
+      # REDIS_TLS_CA: ${REDIS_TLS_CA:-/certs/ca.crt}
+      # REDIS_TLS_CERT: ${REDIS_TLS_CERT:-/certs/redis.crt}
+      # REDIS_TLS_KEY: ${REDIS_TLS_KEY:-/certs/redis.key}
+      # EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-}
+      # SMTP_CONNECTION_URL: ${SMTP_CONNECTION_URL:-}
+    depends_on: &langfuse-depends-on
+      pgsql:
+        condition: service_healthy
+      minio:
+        condition: service_healthy
+      redis:
+        condition: service_healthy
+      clickhouse:
+        condition: service_healthy
+
+  langfuse:
+    image: langfuse/langfuse:3
+    depends_on: *langfuse-depends-on
+    ports:
+      - 3000:3000
+    environment:
+      <<: *langfuse-worker-env
+      NEXTAUTH_URL: http://localhost:3000
+      NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
+      LANGFUSE_INIT_ORG_ID: ${LANGFUSE_INIT_ORG_ID:-}
+      LANGFUSE_INIT_ORG_NAME: ${LANGFUSE_INIT_ORG_NAME:-}
+      LANGFUSE_INIT_PROJECT_ID: ${LANGFUSE_INIT_PROJECT_ID:-}
+      LANGFUSE_INIT_PROJECT_NAME: ${LANGFUSE_INIT_PROJECT_NAME:-}
+      LANGFUSE_INIT_PROJECT_PUBLIC_KEY: ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY:-}
+      LANGFUSE_INIT_PROJECT_SECRET_KEY: ${LANGFUSE_INIT_PROJECT_SECRET_KEY:-}
+      LANGFUSE_INIT_USER_EMAIL: ${LANGFUSE_INIT_USER_EMAIL:-}
+      LANGFUSE_INIT_USER_NAME: ${LANGFUSE_INIT_USER_NAME:-}
+      LANGFUSE_INIT_USER_PASSWORD: ${LANGFUSE_INIT_USER_PASSWORD:-}
+
+  pgsql:
+    image: postgres:16
+    environment:
+      POSTGRES_DB: ${DB_DATABASE}
+      POSTGRES_USER: ${DB_USERNAME}
+      POSTGRES_PASSWORD: ${DB_PASSWORD}
+    volumes:
+      - pg-data:/var/lib/postgresql/data:rw
+    healthcheck:
+      test: pg_isready -d ${DB_DATABASE} -U ${DB_USERNAME}
+      interval: 15s
+      timeout: 5s
+      start_period: 2s
+
+  redis:
+    image: redis:7.2.3-alpine3.18
+    command: >
+      --requirepass ${REDIS_PASSWORD}
+    volumes:
+      - redis-data:/data:rw
+    healthcheck:
+      test: ["CMD", "redis-cli", "ping"]
+      interval: 500ms
+      timeout: 1s
+
+  clickhouse:
+    image: clickhouse/clickhouse-server
+    restart: always
+    user: "101:101"
+    environment:
+      CLICKHOUSE_DB: ${CLICKHOUSE_DB}
+      CLICKHOUSE_USER: ${CLICKHOUSE_USER}
+      CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
+    volumes:
+      - clickhouse-data:/var/lib/clickhouse
+      - clickhouse-logs:/var/log/clickhouse-server
+    # ports:
+    #   - 127.0.0.1:8123:8123
+    #   - 127.0.0.1:9000:9000
+    healthcheck:
+      test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1
+      interval: 5s
+      timeout: 5s
+      retries: 10
+      start_period: 1s
+
+  minio:
+    image: minio/minio
+    entrypoint: sh
+    command: -c 'mkdir -p /data/${AWS_BUCKET} && minio server --address ":9000" --console-address ":9001" /data'
+    environment:
+      MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID}
+      MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY}
+    volumes:
+      - minio-data:/data
+    ports:
+      # - 9090:9000
+      - 127.0.0.1:9091:9001
+    healthcheck:
+      test: ["CMD", "mc", "ready", "local"]
+      interval: 1s
+      timeout: 5s
+      retries: 5
+      start_period: 1s
+
+volumes:
+  minio-data: {}
+  pg-data: {}
+  clickhouse-data: {}
+  clickhouse-logs: {}
+  redis-data: {}

+ 29 - 8
docker-compose.yml

@@ -1,12 +1,27 @@
+x-app: &app
+  build:
+    context: .
+    dockerfile: .docker/python/Dockerfile
+  environment:
+    - PYTHONPATH=/app
+    - SENTENCE_TRANSFORMERS_HOME=/app/.cache
+  volumes:
+    - ./:/app:rw,cached
+  depends_on:
+    - chroma
+  networks:
+    default:
+    rag:
+      aliases:
+        - inference
+
 services:
   inference:
-    build:
-      context: .
-      dockerfile: .docker/python/Dockerfile
-    command: uvicorn src.app:app --reload --host 0.0.0.0 --port 8000
-    user: "${APP_UID:-1000}:${APP_GID:-1000}"
-    volumes:
-      - ./:/app:cached
+    <<: *app
+    # command: uvicorn app:app --app-dir src --reload --host 0.0.0.0 --port 8000
+    command: uvicorn src.app:app --reload --reload-dir src --host 0.0.0.0 --port 8000
+    ports:
+      - "8000:8000"
 
   # ollama:
   #   build:
@@ -28,12 +43,18 @@ services:
     image: chromadb/chroma
     volumes:
       - chroma-data:/data
+    ports:
+      - "8008:8000"
+
+  cli:
+    <<: *app
 
 volumes:
   ollama-data: {}
   chroma-data: {}
 
 networks:
-  default:
+  default: {}
+  rag:
     name: rag
     external: true

+ 8 - 4
requirement.txt → requirements.txt

@@ -1,9 +1,13 @@
-langchain
+fastapi
+uvicorn
+ollama
+python-dotenv
+datasets
+langchain[anthropic]
 langchain-ollama
-langchain-huggingface
 langchain-chroma
+langchain-huggingface
+langchain-text-splitters
 sentence-transformers
 tiktoken
 langfuse
-datasets
-python-dotenv

+ 0 - 0
src/__init__.py


+ 16 - 13
src/app.py

@@ -1,31 +1,34 @@
 from fastapi import FastAPI, Request
 from fastapi.responses import StreamingResponse
 
-from .formatter import StreamFormatter
-from .inference import Inference
+from src.inference import Inference
 
-formatter = StreamFormatter()
 inference = Inference()
 app = FastAPI()
 
+# TODO: Сделать логирование и heartbeat
 
-@app.post("/answer")
+
+@app.post("/generate")
 async def _(request: Request):
     fields = await request.json()
-
     message = fields.get("message")
-    # history = fields.get("history", [])
-
-    return StreamingResponse(
-        formatter.format(inference.answer(message)), media_type="text/plain"
-    )
+    return await inference.ainvoke(message)
 
 
-@app.post("/generate")
+@app.post("/ask")
 async def _(request: Request):
     fields = await request.json()
-    message = fields.get("message")
-    return await inference.generate(message)
+    history = fields.get("history", [])
+
+    messages = [
+        *[(item["role"], item["content"]) for item in history],
+        ("human", fields.get("message")),
+    ]
+
+    return StreamingResponse(
+        inference.astream(messages, format="json"), media_type="application/json"
+    )
 
 
 @app.get("/health")

+ 0 - 59
src/chroma_manager.py

@@ -1,59 +0,0 @@
-from chromadb.config import Settings
-from langchain_chroma import Chroma
-from langchain_huggingface import HuggingFaceEmbeddings
-from langchain_text_splitters import TokenTextSplitter
-
-from datasets import load_dataset
-
-from ..config import CHROMA_HOST, CHROMA_PORT
-
-
-class ChromaManager:
-    def __init__(
-        self,
-        embeddings: str = "jinaai/jina-embeddings-v4",
-        collection_name: str = "terraria",
-        batch_size: int = 2500,
-        host: str = CHROMA_HOST,  # pyright: ignore[reportArgumentType]
-        port: int = CHROMA_PORT,  # pyright: ignore[reportArgumentType]
-        dataset: str = "lparkourer10/terraria-wiki",
-    ):
-        self.splitter = TokenTextSplitter(chunk_size=128, chunk_overlap=32)
-
-        self.embeddings = HuggingFaceEmbeddings(model=embeddings)
-        self.collection_name = collection_name
-        self.batch_size = batch_size
-
-        self.settings = Settings(
-            chroma_api_impl="chromadb.api.fastapi.FastAPI",
-            chroma_server_host=host,
-            chroma_server_http_port=str(port),
-        )
-
-        self.vectordb = Chroma(
-            embedding_function=self.embeddings,
-            collection_name=self.collection_name,
-            client_settings=self.settings,
-        )
-
-        if dataset and self.is_empty():
-            self.insert(self.load(dataset))
-
-    def is_empty(self) -> bool:
-        data = self.vectordb.get(include=["metadatas"])["metadatas"]
-        return len(data) == 0
-
-    def insert(self, dataset) -> None:
-        for i in range(0, len(dataset), self.batch_size):
-            batch = dataset[i : i + self.batch_size]
-            documents = self.splitter.create_documents(
-                texts=batch["question"],
-                metadatas=[{"answer": a} for a in batch["answer"]],
-            )
-            self.vectordb.add_documents(documents)
-
-    def load(self, name: str, split: str = "train"):
-        return load_dataset(name, split=split)
-
-    def retriever(self, count: int = 5):
-        return self.vectordb.as_retriever(search_kwargs={"k": count})

+ 21 - 0
src/config.py

@@ -0,0 +1,21 @@
+import os
+
+from dotenv import load_dotenv
+
+os.environ["HF_HOME"] = "./.cache"
+os.environ["TRANSFORMERS_CACHE"] = "./.cache"
+os.environ["HF_HUB_CACHE"] = "./.cache"
+os.environ["XDG_CACHE_HOME"] = "./.cache"
+
+load_dotenv()
+
+CHROMA_HOST = os.getenv("CHROMA_HOST")
+CHROMA_PORT = os.getenv("CHROMA_PORT")
+
+OLLAMA_URL = os.getenv("OLLAMA_URL")
+OLLAMA_MODEL = os.getenv("OLLAMA_MODEL")
+OLLAMA_API_KEY = os.getenv("OLLAMA_API_KEY")
+
+LANGFUSE_HOST = os.getenv("LANGFUSE_HOST")
+LANGFUSE_PUBLIC_KEY = os.getenv("LANGFUSE_PUBLIC_KEY")
+LANGFUSE_SECRET_KEY = os.getenv("LANGFUSE_SECRET_KEY")

+ 20 - 0
src/database/embeddings.py

@@ -0,0 +1,20 @@
+from langchain.embeddings.base import Embeddings
+from sentence_transformers import SentenceTransformer
+
+
+# TODO: Почему не работает в Docker?
+# Попробовать установить device: cpu?
+class JinaEmbeddingsWrapper(Embeddings):
+    def __init__(self, model: str):
+        print(f"Загрузка {model}...")
+        self.model = SentenceTransformer(
+            model, cache_folder="./.cache", trust_remote_code=True, device="cpu"
+        )
+
+    def embed_documents(self, texts: list[str]) -> list[list[float]]:
+        embeddings = self.model.encode(texts, task="retrieval")
+        return embeddings.tolist()
+
+    def embed_query(self, text: str) -> list[float]:
+        embedding = self.model.encode([text], task="retrieval")[0]
+        return embedding.tolist()

+ 53 - 0
src/database/loading.py

@@ -0,0 +1,53 @@
+import logging
+
+from datasets import load_dataset
+from langchain_text_splitters import TokenTextSplitter
+from tqdm import tqdm
+
+from src.database.vectordb import ChromaManager
+
+# Настройка логирования
+logging.basicConfig(
+    level=logging.INFO,
+    format="%(asctime)s [%(levelname)s] %(message)s",
+    datefmt="%Y-%m-%d %H:%M:%S",
+)
+
+logging.info("Инициализация текстового сплиттера и базы данных")
+splitter = TokenTextSplitter(chunk_size=128, chunk_overlap=32)
+dataset = "lparkourer10/terraria-wiki"
+batch_size = 2500
+
+retriever = ChromaManager()
+
+
+def parsing(dataset) -> None:
+    """Обрабатывает датасет порциями и вставляет документы в векторную базу."""
+    total = len(dataset)
+
+    logging.info(f"Начало парсинга датасета: {total} элементов")
+    for i in tqdm(
+        range(0, total, batch_size),
+        total=(total + batch_size - 1) // batch_size,
+        unit="batch",
+    ):
+        batch = dataset[i : i + batch_size]
+        documents = splitter.create_documents(
+            texts=batch["question"],
+            metadatas=[{"answer": a} for a in batch["answer"]],
+        )
+
+        retriever.insert(documents)
+    logging.info("Парсинг датасета завершен")
+
+
+if __name__ == "__main__":
+    logging.info(f"Загрузка датасета: {dataset}")
+
+    if dataset and retriever.is_empty():
+        loaded_dataset = load_dataset(dataset, split="train")
+        logging.info(f"Датасет загружен, количество элементов: {len(loaded_dataset)}")  # pyright: ignore[reportArgumentType]
+
+        parsing(loaded_dataset)
+    else:
+        logging.warning("Датасет не указан или база данных уже содержит данные")

+ 31 - 0
src/database/vectordb.py

@@ -0,0 +1,31 @@
+from langchain_chroma import Chroma
+from langchain_huggingface import HuggingFaceEmbeddings
+
+from src.config import CHROMA_HOST, CHROMA_PORT
+
+
+# TODO: Сделать логирование и heartbeat
+class ChromaManager:
+    def __init__(
+        self,
+        embeddings: str = "Qwen/Qwen3-Embedding-0.6B",  # Qwen/Qwen3-Embedding-4B
+        collection: str = "default",
+        batch_size: int = 2500,
+        host: str = CHROMA_HOST,  # pyright: ignore[reportArgumentType]
+        port: int = CHROMA_PORT,  # pyright: ignore[reportArgumentType]
+    ):
+        self.collection = collection
+        self.embeddings = HuggingFaceEmbeddings(model=embeddings, show_progress=True)
+        self.vectordb = Chroma(
+            embedding_function=self.embeddings,
+            collection_name=self.collection,
+            host=host,
+            port=port,
+        )
+
+    def is_empty(self) -> bool:
+        data = self.vectordb.get(include=["metadatas"])["metadatas"]
+        return len(data) == 0
+
+    def insert(self, documents) -> None:
+        self.vectordb.add_documents(documents)

+ 0 - 79
src/formatter.py

@@ -1,79 +0,0 @@
-import json
-from typing import Any, AsyncIterator, List
-
-
-class StreamFormatter:
-    name = "inference_rag_"
-
-    def __init__(
-        self,
-        keys: List[str] = None,  # pyright: ignore[reportArgumentType]
-    ) -> None:
-        self.name = ""
-        self.keys = keys or [
-            "model",
-            "done",
-            "done_reason",
-            "total_duration",
-            "load_duration",
-            "prompt_eval_count",
-            "prompt_eval_duration",
-            "eval_count",
-            "eval_duration",
-        ]
-
-    @staticmethod
-    def wrap(tag: str, content: str) -> str:
-        if content is None:
-            content = ""
-        return (
-            f"<|{StreamFormatter.name}{tag}|>{content}<|{StreamFormatter.name}{tag}|>\n"
-        )
-
-    @staticmethod
-    def fields(obj, keys: List[str]) -> str:
-        fields = {key: getattr(obj, key, None) for key in keys}
-        return f"<|{StreamFormatter.name}fields|>{json.dumps(fields, ensure_ascii=False)}<|{StreamFormatter.name}fields|>\n"
-
-    async def format(self, stream: AsyncIterator[Any]) -> AsyncIterator[str]:
-        last = None
-        state = None
-
-        transitions = {
-            ("think", None): lambda: f"<|{StreamFormatter.name}think|>\n",
-            ("content", None): lambda: f"<|{StreamFormatter.name}content|>\n",
-            (
-                "think",
-                "content",
-            ): lambda: f"<|{StreamFormatter.name}content|>\n<|{StreamFormatter.name}think|>\n",
-            (
-                "content",
-                "think",
-            ): lambda: f"<|{StreamFormatter.name}think|>\n<|{StreamFormatter.name}content|>\n",
-        }
-
-        async for chunk in stream:
-            last = chunk
-            thinking = chunk.message.thinking
-            content = chunk.message.content
-
-            target = (
-                "think"
-                if thinking is not None
-                else "content"
-                if content is not None
-                else None
-            )
-            if target and target != state:
-                yield transitions.get((target, state), lambda: "")()
-                state = target
-
-            yield thinking or content or ""
-
-        if state == "think":
-            yield f"<|{StreamFormatter.name}think|>\n"
-        elif state == "content":
-            yield f"<|{StreamFormatter.name}content|>\n"
-
-        if last:
-            yield self.fields(last, self.keys)

+ 97 - 33
src/inference.py

@@ -1,5 +1,40 @@
-from config import OLLAMA_API_KEY, OLLAMA_MODEL, OLLAMA_URL
-from ollama import AsyncClient, GenerateResponse
+from langchain.agents import create_agent
+from langchain.tools import tool
+from langchain_ollama import ChatOllama
+from langfuse import Langfuse, get_client
+from langfuse.langchain import CallbackHandler
+
+from src.config import (
+    LANGFUSE_HOST,
+    LANGFUSE_PUBLIC_KEY,
+    LANGFUSE_SECRET_KEY,
+    OLLAMA_API_KEY,
+    OLLAMA_MODEL,
+    OLLAMA_URL,
+)
+from src.database.vectordb import ChromaManager
+
+Langfuse(
+    public_key=LANGFUSE_PUBLIC_KEY, secret_key=LANGFUSE_SECRET_KEY, host=LANGFUSE_HOST
+)
+langfuse = get_client()
+langfuse_handler = CallbackHandler()
+
+
+retriever = ChromaManager()
+
+
+@tool(response_format="content_and_artifact")
+def retrieve_context(query: str):
+    """Вытаскивает семантически похожие документы из векторной БД по запросу. Основной источник информации для ответа на вопрос. Используется строго в формате Один вопрос (query) - Ответ (answer)"""
+
+    retrieved_docs = retriever.vectordb.similarity_search(query, k=5)
+    serialized = "\n\n".join(
+        (f"Question: {doc.page_content}\nAnswer: {doc.metadata['answer']}")
+        for doc in retrieved_docs
+    )
+
+    return serialized, retrieved_docs
 
 
 class Inference:
@@ -9,40 +44,69 @@ class Inference:
         host: str = OLLAMA_URL,  # pyright: ignore[reportArgumentType]
         api_key: str = OLLAMA_API_KEY,  # pyright: ignore[reportArgumentType]
     ):
-        self.model = model
-        self.client = AsyncClient(
-            host=host, headers={"Authorization": f"Bearer {api_key}"}
+        print("Инициализация ChatOllama...")
+        self.client = ChatOllama(
+            model=model,  # pyright: ignore[reportArgumentType]
+            base_url=host,
+            client_kwargs={"headers": {"Authorization": f"Bearer {api_key}"}},
+            async_client_kwargs={"headers": {"Authorization": f"Bearer {api_key}"}},
+            temperature=0.25,
+            reasoning=True,
         )
 
-    async def generate(self, message: str) -> GenerateResponse:
-        return await self.client.generate(
-            model=self.model, prompt=message, think=False, options={"temperature": 0.15}
+        # prompt = """Ты — технический ассистент по Steam Deck, SteamOS и Linux на Steam Deck.
+
+        # Правила поведения:
+        # 1. Отвечай только в рамках темы Steam Deck, SteamOS, Linux и смежных технических вопросов.
+        # 2. Не придумывай ничего лишнего. Если нет ответа в retrieved documents, отвечай: "Не могу помочь с ответом на данный вопрос".
+        # 3. Используй retrieved documents как основной источник информации. Не добавляй свои догадки.
+        # 4. Выражайся корректно, без мата и нецензурной лексики.
+        # 5. Форматируй ответы в Markdown для улучшения читаемости, используя заголовки, списки, блоки кода и таблицы, если это уместно. Для простых кратких ответов Markdown не обязателен.
+        # 6. Можешь объяснять команды Linux, сравнивать версии Steam Deck, давать инструкции по настройке, приводить конкретные шаги из документов.
+        # 7. Если вопрос выходит за рамки темы или отсутствует в retrieved documents, отвечай строго: "Не могу помочь с ответом на данный вопрос".
+
+        # Всегда ориентируйся на retrieved documents, даже если вопрос кажется очевидным."""
+
+        prompt = """Ты — технический и игровой ассистент по игре Terraria, включая механики игры, крафт, боссов, предметы, биомы, модификации и смежные темы.
+
+        Правила поведения:
+        1. Отвечай только в рамках темы Terraria и связанных игровых аспектов.
+        2. Используй инструмент retrieve_context как основной источник информации. Не добавляй свои догадки. Для использования инструмента, формируй запрос к retrieve_context строго в формате вопроса!
+        3. Документы сохранены в формате Вопрос - Ответ. Для корректного поиска информации формируй вопрос в retrieve_context.
+        Не перечилсяй просто так слова при использовании инструмента retrieve_context, строго в формате вопроса!
+        Если нужно найти несколько вопросов, то делай запрос в retrieve_context для каждого из вопросов.
+        И не добавляй слово Terraria, там и так вся информация только по ней.
+        4. Проанализировать возвращённые документы и сформировать ответ на вопрос, основываясь на найденной информации.
+        5. Если нет ответа в retrieve_context, попробуй 1-2 раза перефразировать вопрос и повторить поиск. Попробуй поискать ответ в retrieve_context на английском языке.
+        6. Максимальное количество обращений к базе данных retrieve_context для поиска ответа - 3.
+        7. Не показывай внутренние шаги поиска, запросы к базе или reasoning.
+        8. Выражайся корректно, без мата и нецензурной лексики.
+        9. Форматируй ответы в Markdown для улучшения читаемости, используя заголовки, списки, блоки кода и таблицы, если это уместно.
+        10. Можешь объяснять игровые механики, давать инструкции по крафту, стратегии против боссов, рекомендации по биомам и предметам, приводить конкретные шаги из документов, а также давать любую информацию, которая может помочь игроку, если это уместно.
+        11. Если вопрос выходит за рамки темы, отвечай строго: "Не могу помочь с ответом на данный вопрос".
+        12. Всегда используй retrieve_context для формирования ответа, даже если ты считаешь, что вопрос не относится к Terraria!
+        13. Если найти ответ так и не удалось, предложи пользователю 3-5 переформулированных или смежных вопроса.
+        14. Ни в коем случае не добавляй информацию не из базы данных.
+
+        Всегда ориентируйся на retrieve_context, даже если вопрос кажется очевидным."""
+
+        print("Инициализация Agent...")
+        self.agent = create_agent(
+            self.client, tools=[retrieve_context], system_prompt=prompt
         )
 
-    async def stream(self, messages: list):
-        stream = await self.client.chat(
-            model=self.model,
-            messages=messages,
-            think="low",
-            stream=True,
-            options={"temperature": 0.15},
+    async def ainvoke(self, message: str):
+        return await self.client.ainvoke(
+            message, reasoning=False, config={"callbacks": [langfuse_handler]}
         )
 
-        async for chunk in stream:
-            yield chunk
-
-    async def answer(self, text: str):
-        messages = [
-            {
-                "role": "system",
-                "content": (
-                    "Используй формат Markdown для ответов, но не злоупотребляй им. "
-                    "Применяй его когда нужно веделить важные моменты, заголовки, таблицы, списки и тд. "
-                    "В обычном тексте используй простые форматы, такие как жирный и курсив. "
-                ),
-            },
-            {"role": "user", "content": text},
-        ]
-
-        async for chunk in self.stream(messages):
-            yield chunk
+    async def astream(self, messages: list, format: str | None = None):
+        async for delta, _ in self.agent.astream(
+            {"messages": messages},
+            stream_mode="messages",
+            config={"callbacks": [langfuse_handler]},
+        ):
+            if format == "json":
+                yield (delta.model_dump_json() + "\n").encode("utf-8")  # pyright: ignore[reportAttributeAccessIssue]
+            else:
+                yield delta

+ 0 - 108
src/main.py

@@ -1,108 +0,0 @@
-from langchain.chains import create_history_aware_retriever, create_retrieval_chain
-from langchain.chains.combine_documents import create_stuff_documents_chain
-from langchain_core.prompts import (
-    ChatPromptTemplate,
-    MessagesPlaceholder,
-    PromptTemplate,
-)
-from langchain_ollama import OllamaLLM
-
-from chroma_manager import ChromaManager
-from config import OLLAMA_URL
-
-print("Инициализация LLM...")
-llm = OllamaLLM(
-    model="llama3.1:8b",
-    base_url=f"{OLLAMA_URL}",
-    temperature=0.15,
-    num_predict=1024,
-    reasoning=False,
-)
-
-print("Инициализация Chroma...")
-retriever = ChromaManager().retriever()
-
-contextualize_q_system_prompt = (
-    "Given a chat history and the latest user question "
-    "which might reference context in the chat history, "
-    "formulate a standalone question which can be understood "
-    "without the chat history. Do NOT answer the question, just "
-    "reformulate it if needed and otherwise return it as is."
-)
-
-contextualize_q_prompt = ChatPromptTemplate.from_messages(
-    [
-        ("system", contextualize_q_system_prompt),
-        MessagesPlaceholder("chat_history"),
-        ("human", "{input}"),
-    ]
-)
-
-history_aware_retriever = create_history_aware_retriever(
-    llm, retriever, contextualize_q_prompt
-)
-
-qa_system_prompt = (
-    "You are an assistant for question-answering tasks. Use "
-    "the following pieces of retrieved context to answer the "
-    "question. If you don't know the answer, just say that you "
-    "don't know. Use three sentences maximum and keep the answer "
-    "concise."
-    "{context}"
-)
-
-qa_prompt = ChatPromptTemplate.from_messages(
-    [
-        ("system", qa_system_prompt),
-        MessagesPlaceholder("chat_history"),
-        ("human", "{input}"),
-    ]
-)
-
-question_answer_chain = create_stuff_documents_chain(
-    llm, qa_prompt, document_prompt=PromptTemplate.from_template("{answer}")
-)
-rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)
-
-chat_history = []
-
-
-def ask(question: str):
-    print("=" * 100)
-    print("Вопрос пользователя:", question)
-
-    result = {"question": question, "answer": ""}
-
-    print("=" * 100)
-    print("Ответ модели:")
-    for chunk in rag_chain.stream(
-        {"input": question, "chat_history": chat_history},
-        config={"callbacks": [langfuse_handler]},
-    ):
-        if "answer" in chunk:
-            print(chunk["answer"], end="", flush=True)
-            result["answer"] += chunk["answer"]
-    print()
-
-    chat_history.append(("human", result["question"]))
-    chat_history.append(("ai", result["answer"]))
-
-
-def main():
-    questions = [
-        # 'Какие есть боссы в Террарии?',
-        # 'Какой финальный босс?',
-        # 'И как его победить?',
-        # 'Какую броню на него использовать?',
-        "What bosses are there in Terraria?",
-        "What is the final boss?",
-        "And how to defeat it?",
-        "What armor should be used against it?",
-    ]
-
-    for question in questions:
-        ask(question)
-
-
-if __name__ == "__main__":
-    main()

+ 0 - 44
src/ollama.py

@@ -1,44 +0,0 @@
-from config import OLLAMA_API_KEY, OLLAMA_MODEL, OLLAMA_URL
-from ollama import AsyncClient, GenerateResponse
-
-client = AsyncClient(
-    host=f"{OLLAMA_URL}", headers={"Authorization": f"Bearer {OLLAMA_API_KEY}"}
-)
-# ollama.create(model='example', from_='gemma3', system="You are Mario from Super Mario Bros.") // TODO: Для асистента?
-
-
-async def generate(message: str) -> GenerateResponse:
-    return await client.generate(
-        model=f"{OLLAMA_MODEL}",
-        prompt=message,
-        think=False,
-        options={"temperature": 0.15},
-    )
-
-
-async def request(messages: list):
-    stream = await client.chat(
-        model=f"{OLLAMA_MODEL}",
-        messages=messages,
-        think=True,
-        stream=True,
-        options={"temperature": 0.15},
-    )
-
-    async for chunk in stream:
-        print(chunk)
-        content = chunk["message"]["content"]
-        yield content
-
-
-async def answer(text: str):
-    messages = [
-        {
-            "role": "system",
-            "content": "Отвечай строго в формате Markdown. Не нужно пихать везде большие заголовки! Пиши как обычный человек, но красиво оформляй ответ",
-        },
-        {"role": "user", "content": text},
-    ]
-
-    async for chunk in request(messages):
-        yield chunk

+ 0 - 33
src/rag.py

@@ -1,33 +0,0 @@
-from langchain.agents import create_agent
-from langchain_ollama import ChatOllama
-
-llm = ChatOllama(
-    model="llama3.1",
-    base_url="http://localhost:11434",  # URL Ollama-сервера
-    client_kwargs={  # для синхронного клиента
-        "timeout": 30,
-        "headers": {"Authorization": "Bearer …"},
-    },
-    async_client_kwargs={  # для асинхронного клиента
-        "timeout": 60,
-        "headers": {"Authorization": "Bearer …"},
-    },
-)
-
-
-def get_weather(city: str) -> str:
-    """Get weather for a given city."""
-    return f"It's always sunny in {city}!"
-
-
-agent = create_agent(
-    model="claude-sonnet-4-5-20250929",
-    tools=[get_weather],
-    system_prompt="You are a helpful assistant",
-)
-
-# Run the agent
-result = agent.invoke(
-    {"messages": [{"role": "user", "content": "what is the weather in sf"}]}
-)
-print(result)